@sixb/core 0.1.12 → 0.1.13

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 (527) hide show
  1. package/dist/actions/index.d.ts +2 -2
  2. package/dist/actions/index.d.ts.map +1 -1
  3. package/dist/actions/index.js +28 -26
  4. package/dist/actions/index.js.map +1 -1
  5. package/dist/actions/read-facade.d.ts +14 -16
  6. package/dist/actions/read-facade.d.ts.map +1 -1
  7. package/dist/actions/request.d.ts.map +1 -1
  8. package/dist/actions/run-dispatch.d.ts +2 -0
  9. package/dist/actions/run-dispatch.d.ts.map +1 -1
  10. package/dist/actions/types/context.d.ts +18 -31
  11. package/dist/actions/types/context.d.ts.map +1 -1
  12. package/dist/actions/types/params.d.ts +2 -1
  13. package/dist/actions/types/params.d.ts.map +1 -1
  14. package/dist/actions/worker.js +1 -1
  15. package/dist/agents/index.js +41 -39
  16. package/dist/agents/index.js.map +1 -1
  17. package/dist/agents/streams/index.js +2 -2
  18. package/dist/agents/streams/internal.js +2 -2
  19. package/dist/assert-never.d.ts +6 -0
  20. package/dist/assert-never.d.ts.map +1 -0
  21. package/dist/auth/client-address.d.ts +3 -0
  22. package/dist/auth/client-address.d.ts.map +1 -0
  23. package/dist/auth/csrf.d.ts +5 -1
  24. package/dist/auth/csrf.d.ts.map +1 -1
  25. package/dist/auth/index.d.ts +3 -2
  26. package/dist/auth/index.d.ts.map +1 -1
  27. package/dist/auth/index.js +14 -8
  28. package/dist/auth/index.js.map +1 -1
  29. package/dist/auth/runtime.d.ts +58 -41
  30. package/dist/auth/runtime.d.ts.map +1 -1
  31. package/dist/auth/session-cache.d.ts +10 -3
  32. package/dist/auth/session-cache.d.ts.map +1 -1
  33. package/dist/auth/sessions.d.ts +12 -0
  34. package/dist/auth/sessions.d.ts.map +1 -1
  35. package/dist/auth/strategy.js +1 -1
  36. package/dist/auth/types.d.ts +8 -15
  37. package/dist/auth/types.d.ts.map +1 -1
  38. package/dist/authorization/index.js +3 -3
  39. package/dist/bootstrap/index.d.ts +1 -1
  40. package/dist/bootstrap/index.d.ts.map +1 -1
  41. package/dist/bootstrap/index.js +45 -43
  42. package/dist/bootstrap/index.js.map +1 -1
  43. package/dist/bootstrap/ontology-type-manifest.d.ts +8 -0
  44. package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
  45. package/dist/{chunk-q5gz3g2j.js → chunk-0321g649.js} +2 -16
  46. package/dist/{chunk-q5gz3g2j.js.map → chunk-0321g649.js.map} +2 -2
  47. package/dist/{chunk-e1f1sqba.js → chunk-04h4t2b5.js} +3 -3
  48. package/dist/{chunk-y3ev53cq.js → chunk-2fv8sajb.js} +2 -2
  49. package/dist/{chunk-3bnt2wna.js → chunk-2hbhn1ff.js} +1 -1
  50. package/dist/{chunk-eyjzgav0.js → chunk-3nx8vj5a.js} +6 -4
  51. package/dist/chunk-3nx8vj5a.js.map +12 -0
  52. package/dist/{chunk-5tetw4hn.js → chunk-4tnrzqqh.js} +1 -1
  53. package/dist/{chunk-g50nxqs5.js → chunk-63fp9x3q.js} +63 -20
  54. package/dist/chunk-63fp9x3q.js.map +20 -0
  55. package/dist/{chunk-qm535afa.js → chunk-693f3zn8.js} +66 -24
  56. package/dist/chunk-693f3zn8.js.map +15 -0
  57. package/dist/{chunk-7zgecwy1.js → chunk-6x0pqh32.js} +12 -1
  58. package/dist/{chunk-7zgecwy1.js.map → chunk-6x0pqh32.js.map} +3 -3
  59. package/dist/{chunk-6ma8dvzc.js → chunk-898y24dd.js} +49 -42
  60. package/dist/chunk-898y24dd.js.map +15 -0
  61. package/dist/{chunk-7qnvhtcd.js → chunk-91wthfwe.js} +17 -17
  62. package/dist/{chunk-7qnvhtcd.js.map → chunk-91wthfwe.js.map} +5 -5
  63. package/dist/chunk-96yw3pwd.js.map +2 -2
  64. package/dist/{chunk-2cxv584m.js → chunk-9pfw47qx.js} +309 -204
  65. package/dist/chunk-9pfw47qx.js.map +44 -0
  66. package/dist/{chunk-4k53sm9e.js → chunk-a0073121.js} +59 -59
  67. package/dist/{chunk-4k53sm9e.js.map → chunk-a0073121.js.map} +5 -5
  68. package/dist/{chunk-jjwhy3rs.js → chunk-a69fkrtr.js} +5 -5
  69. package/dist/{chunk-y1ahv8b7.js → chunk-bdhfn0ww.js} +1 -1
  70. package/dist/{chunk-4ph94nhd.js → chunk-bep5rrdq.js} +2 -2
  71. package/dist/{chunk-kept9cdd.js → chunk-bxx3ms5t.js} +1 -1
  72. package/dist/{chunk-xtfryrfb.js → chunk-cbn96bve.js} +2 -2
  73. package/dist/{chunk-nzsy3xrp.js → chunk-cvrbhvtr.js} +69 -44
  74. package/dist/{chunk-nzsy3xrp.js.map → chunk-cvrbhvtr.js.map} +7 -7
  75. package/dist/{chunk-vsg0g7h9.js → chunk-d8yes9yx.js} +304 -45
  76. package/dist/chunk-d8yes9yx.js.map +20 -0
  77. package/dist/{chunk-tg4g4zh0.js → chunk-darm7eeg.js} +9 -9
  78. package/dist/{chunk-tg4g4zh0.js.map → chunk-darm7eeg.js.map} +3 -3
  79. package/dist/{chunk-vpxss818.js → chunk-drz59ve0.js} +9 -8
  80. package/dist/chunk-drz59ve0.js.map +10 -0
  81. package/dist/{chunk-7c2g3sz9.js → chunk-dsfw1bdr.js} +5 -5
  82. package/dist/{chunk-7c2g3sz9.js.map → chunk-dsfw1bdr.js.map} +1 -1
  83. package/dist/{chunk-p6r1ex7t.js → chunk-ffwvdgk1.js} +5 -13
  84. package/dist/chunk-ffwvdgk1.js.map +10 -0
  85. package/dist/{chunk-r5zythxp.js → chunk-gbcrz0gr.js} +7 -7
  86. package/dist/{chunk-ybhz3j9g.js → chunk-gc226ten.js} +104 -148
  87. package/dist/{chunk-ybhz3j9g.js.map → chunk-gc226ten.js.map} +7 -8
  88. package/dist/{chunk-3ghw2t5q.js → chunk-gmt22nxx.js} +10 -16
  89. package/dist/chunk-gmt22nxx.js.map +10 -0
  90. package/dist/chunk-h89wz928.js +42 -0
  91. package/dist/chunk-h89wz928.js.map +10 -0
  92. package/dist/{chunk-hkw8rykk.js → chunk-ht4a7mjg.js} +74 -4
  93. package/dist/chunk-ht4a7mjg.js.map +15 -0
  94. package/dist/{chunk-t7dzd1tm.js → chunk-jhyc777j.js} +2 -2
  95. package/dist/{chunk-xn686q2e.js → chunk-jmwy25mf.js} +75 -57
  96. package/dist/{chunk-xn686q2e.js.map → chunk-jmwy25mf.js.map} +3 -3
  97. package/dist/{chunk-f06sf7rr.js → chunk-k4kkp58d.js} +18 -5
  98. package/dist/chunk-k4kkp58d.js.map +11 -0
  99. package/dist/{chunk-2h63nrde.js → chunk-ky7zpbtt.js} +5 -7
  100. package/dist/{chunk-2h63nrde.js.map → chunk-ky7zpbtt.js.map} +3 -4
  101. package/dist/chunk-m4ehq95f.js +9 -0
  102. package/dist/chunk-m4ehq95f.js.map +10 -0
  103. package/dist/{chunk-0mza4xb2.js → chunk-m8zkvep1.js} +2 -2
  104. package/dist/{chunk-b768c93y.js → chunk-mf6hwpzh.js} +83 -28
  105. package/dist/{chunk-b768c93y.js.map → chunk-mf6hwpzh.js.map} +5 -5
  106. package/dist/{chunk-yxb4c62x.js → chunk-mr60an99.js} +3 -2
  107. package/dist/{chunk-yxb4c62x.js.map → chunk-mr60an99.js.map} +3 -3
  108. package/dist/chunk-n33e8dz8.js +191 -0
  109. package/dist/chunk-n33e8dz8.js.map +11 -0
  110. package/dist/chunk-rdghfsss.js.map +2 -2
  111. package/dist/{chunk-m7cx05vp.js → chunk-rqtdtm43.js} +126 -59
  112. package/dist/{chunk-m7cx05vp.js.map → chunk-rqtdtm43.js.map} +13 -12
  113. package/dist/{chunk-bbaa1fet.js → chunk-rzcjp5m2.js} +7 -3
  114. package/dist/chunk-rzcjp5m2.js.map +25 -0
  115. package/dist/{chunk-hzw7yv5g.js → chunk-rzkr70gr.js} +5 -1
  116. package/dist/{chunk-hzw7yv5g.js.map → chunk-rzkr70gr.js.map} +3 -3
  117. package/dist/{chunk-sfypc7mk.js → chunk-s24qbp32.js} +4 -4
  118. package/dist/{chunk-axndsymr.js → chunk-tw03bsmb.js} +2 -2
  119. package/dist/{chunk-axndsymr.js.map → chunk-tw03bsmb.js.map} +3 -3
  120. package/dist/{chunk-y0v18c2j.js → chunk-vef6qa14.js} +2 -2
  121. package/dist/{chunk-gzt6v1ja.js → chunk-vn3yh259.js} +1 -1
  122. package/dist/{chunk-bg2bs62d.js → chunk-w9bp61e7.js} +5 -5
  123. package/dist/{chunk-3h7ctayx.js → chunk-xgptywp0.js} +4 -3
  124. package/dist/chunk-xgptywp0.js.map +11 -0
  125. package/dist/{chunk-gswwr35f.js → chunk-y487ywrv.js} +4 -4
  126. package/dist/{chunk-bet1rb9h.js → chunk-y6vnvayj.js} +1 -1
  127. package/dist/{chunk-x9tmx3fc.js → chunk-ypj2wqtj.js} +3 -6
  128. package/dist/{chunk-x9tmx3fc.js.map → chunk-ypj2wqtj.js.map} +4 -4
  129. package/dist/{chunk-g2gezsg5.js → chunk-z9h698s8.js} +1 -1
  130. package/dist/{chunk-wjffn5m4.js → chunk-zdkcdshk.js} +3 -36
  131. package/dist/{chunk-wjffn5m4.js.map → chunk-zdkcdshk.js.map} +3 -4
  132. package/dist/{chunk-bfjv1adk.js → chunk-znw0zvy4.js} +1 -1
  133. package/dist/edits/types.d.ts +19 -19
  134. package/dist/edits/types.d.ts.map +1 -1
  135. package/dist/error-reporting/internal.js +3 -3
  136. package/dist/errors/catalog.d.ts +4 -0
  137. package/dist/errors/catalog.d.ts.map +1 -1
  138. package/dist/errors/internal.js +1 -1
  139. package/dist/events/envelope.d.ts +0 -12
  140. package/dist/events/envelope.d.ts.map +1 -1
  141. package/dist/events/index.d.ts +1 -1
  142. package/dist/events/index.d.ts.map +1 -1
  143. package/dist/events/index.js +3 -3
  144. package/dist/events/service.d.ts +1 -2
  145. package/dist/events/service.d.ts.map +1 -1
  146. package/dist/events/toStoredEvent.d.ts +1 -2
  147. package/dist/events/toStoredEvent.d.ts.map +1 -1
  148. package/dist/events/types/index.d.ts +2 -1
  149. package/dist/events/types/index.d.ts.map +1 -1
  150. package/dist/execution/agent.d.ts +1 -2
  151. package/dist/execution/agent.d.ts.map +1 -1
  152. package/dist/execution/agent.js +39 -37
  153. package/dist/execution/agent.js.map +1 -1
  154. package/dist/execution/authorized-object-reader.d.ts.map +1 -1
  155. package/dist/execution/primitive.d.ts +1 -2
  156. package/dist/execution/primitive.d.ts.map +1 -1
  157. package/dist/execution/primitive.js +38 -36
  158. package/dist/execution/primitive.js.map +3 -3
  159. package/dist/execution/request.d.ts +1 -2
  160. package/dist/execution/request.d.ts.map +1 -1
  161. package/dist/execution/request.js +39 -37
  162. package/dist/execution/request.js.map +3 -3
  163. package/dist/index.d.ts +6 -6
  164. package/dist/index.d.ts.map +1 -1
  165. package/dist/index.js +56 -50
  166. package/dist/index.js.map +1 -1
  167. package/dist/maintenance/ontology-maintenance.d.ts +11 -1
  168. package/dist/maintenance/ontology-maintenance.d.ts.map +1 -1
  169. package/dist/materialization/errors.d.ts +3 -1
  170. package/dist/materialization/errors.d.ts.map +1 -1
  171. package/dist/materialization/events.d.ts +27 -2
  172. package/dist/materialization/events.d.ts.map +1 -1
  173. package/dist/materializer/edits/commit.d.ts.map +1 -1
  174. package/dist/materializer/edits/operations.d.ts +2 -1
  175. package/dist/materializer/edits/operations.d.ts.map +1 -1
  176. package/dist/materializer/edits/plan.d.ts +2 -2
  177. package/dist/materializer/edits/plan.d.ts.map +1 -1
  178. package/dist/materializer/edits/user-refs.d.ts +30 -0
  179. package/dist/materializer/edits/user-refs.d.ts.map +1 -0
  180. package/dist/materializer/effective/build-events.d.ts +2 -2
  181. package/dist/materializer/effective/build-events.d.ts.map +1 -1
  182. package/dist/materializer/execution/scope.d.ts +11 -3
  183. package/dist/materializer/execution/scope.d.ts.map +1 -1
  184. package/dist/materializer/index.js +23 -21
  185. package/dist/materializer/index.js.map +1 -1
  186. package/dist/materializer/projections/replacement-plan.d.ts +2 -0
  187. package/dist/materializer/projections/replacement-plan.d.ts.map +1 -1
  188. package/dist/materializer/telemetry/plan.d.ts +2 -2
  189. package/dist/materializer/telemetry/plan.d.ts.map +1 -1
  190. package/dist/models/execution/index.js +23 -21
  191. package/dist/models/execution/index.js.map +1 -1
  192. package/dist/models/index.js +1 -1
  193. package/dist/objects/execution.d.ts +21 -27
  194. package/dist/objects/execution.d.ts.map +1 -1
  195. package/dist/objects/index.js +28 -26
  196. package/dist/objects/index.js.map +1 -1
  197. package/dist/objects/query/executor.d.ts.map +1 -1
  198. package/dist/objects/query/index.js +27 -25
  199. package/dist/objects/query/index.js.map +1 -1
  200. package/dist/objects/query/ir.d.ts +8 -1
  201. package/dist/objects/query/ir.d.ts.map +1 -1
  202. package/dist/objects/query/scalar-values.d.ts.map +1 -1
  203. package/dist/objects/query/validate.d.ts.map +1 -1
  204. package/dist/objects/sdk/object-handle.d.ts +1 -2
  205. package/dist/objects/sdk/object-handle.d.ts.map +1 -1
  206. package/dist/objects/sdk/object-set.d.ts +2 -3
  207. package/dist/objects/sdk/object-set.d.ts.map +1 -1
  208. package/dist/objects/sdk/query-builder.d.ts +8 -10
  209. package/dist/objects/sdk/query-builder.d.ts.map +1 -1
  210. package/dist/objects/sdk/telemetry-channel.d.ts +1 -2
  211. package/dist/objects/sdk/telemetry-channel.d.ts.map +1 -1
  212. package/dist/objects/sdk/where.d.ts +2 -3
  213. package/dist/objects/sdk/where.d.ts.map +1 -1
  214. package/dist/ontology/builders.d.ts +11 -10
  215. package/dist/ontology/builders.d.ts.map +1 -1
  216. package/dist/ontology/index.d.ts +4 -2
  217. package/dist/ontology/index.d.ts.map +1 -1
  218. package/dist/ontology/index.js +6 -4
  219. package/dist/ontology/index.js.map +1 -1
  220. package/dist/ontology/inference/index.d.ts +34 -22
  221. package/dist/ontology/inference/index.d.ts.map +1 -1
  222. package/dist/ontology/internal.d.ts +1 -0
  223. package/dist/ontology/internal.d.ts.map +1 -1
  224. package/dist/ontology/internal.js +9 -7
  225. package/dist/ontology/internal.js.map +1 -1
  226. package/dist/ontology/primitives.d.ts +38 -0
  227. package/dist/ontology/primitives.d.ts.map +1 -0
  228. package/dist/ontology/query-capabilities.d.ts +38 -0
  229. package/dist/ontology/query-capabilities.d.ts.map +1 -0
  230. package/dist/ontology/refs.d.ts +23 -2
  231. package/dist/ontology/refs.d.ts.map +1 -1
  232. package/dist/ontology/registered.d.ts +16 -0
  233. package/dist/ontology/registered.d.ts.map +1 -0
  234. package/dist/ontology/registry.d.ts.map +1 -1
  235. package/dist/ontology/tokens.d.ts +35 -1
  236. package/dist/ontology/tokens.d.ts.map +1 -1
  237. package/dist/ontology/types.d.ts +18 -4
  238. package/dist/ontology/types.d.ts.map +1 -1
  239. package/dist/ontology/user-ref.d.ts +35 -0
  240. package/dist/ontology/user-ref.d.ts.map +1 -0
  241. package/dist/ontology/validation/definition.d.ts.map +1 -1
  242. package/dist/ontology/validation/index.d.ts +1 -1
  243. package/dist/ontology/validation/index.d.ts.map +1 -1
  244. package/dist/ontology/validation/normalize.d.ts.map +1 -1
  245. package/dist/ontology/validation/properties.d.ts +6 -1
  246. package/dist/ontology/validation/properties.d.ts.map +1 -1
  247. package/dist/ontology/validation/query.d.ts.map +1 -1
  248. package/dist/ontology/validation/schema.d.ts.map +1 -1
  249. package/dist/pipelines/index.js +26 -24
  250. package/dist/pipelines/index.js.map +1 -1
  251. package/dist/predicates/types.d.ts +53 -3
  252. package/dist/predicates/types.d.ts.map +1 -1
  253. package/dist/projections/builders.d.ts +19 -1
  254. package/dist/projections/builders.d.ts.map +1 -1
  255. package/dist/projections/internal.js +23 -21
  256. package/dist/projections/internal.js.map +1 -1
  257. package/dist/projections/validation.d.ts.map +1 -1
  258. package/dist/query.js +2 -2
  259. package/dist/queues/in-memory.d.ts +1 -1
  260. package/dist/queues/in-memory.d.ts.map +1 -1
  261. package/dist/runtime/create.d.ts +1 -1
  262. package/dist/runtime/create.d.ts.map +1 -1
  263. package/dist/runtime/host.d.ts +5 -5
  264. package/dist/runtime/host.d.ts.map +1 -1
  265. package/dist/runtime/index.d.ts +1 -1
  266. package/dist/runtime/index.d.ts.map +1 -1
  267. package/dist/runtime/internal.js +27 -25
  268. package/dist/runtime/internal.js.map +1 -1
  269. package/dist/runtime/sixb.d.ts +5 -5
  270. package/dist/runtime/sixb.d.ts.map +1 -1
  271. package/dist/runtime/types.d.ts +171 -188
  272. package/dist/runtime/types.d.ts.map +1 -1
  273. package/dist/sandboxes/index.js +5 -5
  274. package/dist/sandboxes/sandbox.d.ts +4 -1
  275. package/dist/sandboxes/sandbox.d.ts.map +1 -1
  276. package/dist/shared/params/types.d.ts +4 -3
  277. package/dist/shared/params/types.d.ts.map +1 -1
  278. package/dist/shared/params/user-refs.d.ts +19 -0
  279. package/dist/shared/params/user-refs.d.ts.map +1 -0
  280. package/dist/shares/compiler.d.ts.map +1 -1
  281. package/dist/shares/internal.js +24 -22
  282. package/dist/shares/internal.js.map +2 -2
  283. package/dist/storage/action-runs/failure.js +2 -2
  284. package/dist/storage/action-runs/types.d.ts +1 -1
  285. package/dist/storage/action-runs/types.d.ts.map +1 -1
  286. package/dist/storage/agents/provider.js +1 -1
  287. package/dist/storage/ai-limits/enforcement.js +2 -2
  288. package/dist/storage/auth/in-memory/access-tokens.d.ts.map +1 -1
  289. package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -1
  290. package/dist/storage/auth/in-memory/device-authorizations.d.ts.map +1 -1
  291. package/dist/storage/auth/in-memory/sessions.d.ts +8 -1
  292. package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -1
  293. package/dist/storage/auth/in-memory/shared.d.ts.map +1 -1
  294. package/dist/storage/auth/index.d.ts +1 -1
  295. package/dist/storage/auth/index.d.ts.map +1 -1
  296. package/dist/storage/auth/types.d.ts +62 -13
  297. package/dist/storage/auth/types.d.ts.map +1 -1
  298. package/dist/storage/connector-connections/provider.js +1 -1
  299. package/dist/storage/executions/provider.js +1 -1
  300. package/dist/storage/file-upload-sessions/in-memory.d.ts +9 -18
  301. package/dist/storage/file-upload-sessions/in-memory.d.ts.map +1 -1
  302. package/dist/storage/file-upload-sessions/index.d.ts +1 -1
  303. package/dist/storage/file-upload-sessions/index.d.ts.map +1 -1
  304. package/dist/storage/file-upload-sessions/provider.d.ts +52 -0
  305. package/dist/storage/file-upload-sessions/provider.d.ts.map +1 -0
  306. package/dist/storage/file-upload-sessions/provider.js +24 -0
  307. package/dist/storage/file-upload-sessions/provider.js.map +9 -0
  308. package/dist/storage/file-upload-sessions/types.d.ts +19 -1
  309. package/dist/storage/file-upload-sessions/types.d.ts.map +1 -1
  310. package/dist/storage/file-upload-sessions/utils.d.ts +8 -2
  311. package/dist/storage/file-upload-sessions/utils.d.ts.map +1 -1
  312. package/dist/storage/index.d.ts +3 -3
  313. package/dist/storage/index.d.ts.map +1 -1
  314. package/dist/storage/index.js +29 -25
  315. package/dist/storage/index.js.map +1 -1
  316. package/dist/storage/internal.js +11 -9
  317. package/dist/storage/internal.js.map +1 -1
  318. package/dist/storage/objects/in-memory/query.d.ts.map +1 -1
  319. package/dist/storage/ontology/commits.d.ts +6 -2
  320. package/dist/storage/ontology/commits.d.ts.map +1 -1
  321. package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
  322. package/dist/storage/ontology/provider-work.d.ts.map +1 -1
  323. package/dist/storage/ontology/provider.d.ts +14 -1
  324. package/dist/storage/ontology/provider.d.ts.map +1 -1
  325. package/dist/storage/ontology/provider.js +8 -2
  326. package/dist/storage/ontology/provider.js.map +1 -1
  327. package/dist/storage/operation-scope.d.ts.map +1 -1
  328. package/dist/storage/operation-scope.js +1 -1
  329. package/dist/storage/projection-runs/provider.js +2 -2
  330. package/dist/storage/types.d.ts +1 -1
  331. package/dist/storage/types.d.ts.map +1 -1
  332. package/dist/storage/workflow-interventions/index.d.ts +1 -1
  333. package/dist/storage/workflow-interventions/index.d.ts.map +1 -1
  334. package/dist/storage/workflow-interventions/types.d.ts +5 -8
  335. package/dist/storage/workflow-interventions/types.d.ts.map +1 -1
  336. package/dist/storage/workflow-runs/provider.js +8 -8
  337. package/dist/syncs/index.js +27 -25
  338. package/dist/syncs/index.js.map +1 -1
  339. package/dist/testing/action-execution.d.ts +4 -0
  340. package/dist/testing/action-execution.d.ts.map +1 -1
  341. package/dist/testing/auth-storage-contract.d.ts.map +1 -1
  342. package/dist/testing/execution.d.ts +1 -2
  343. package/dist/testing/execution.d.ts.map +1 -1
  344. package/dist/testing/file-upload-session-storage-contract.d.ts +12 -0
  345. package/dist/testing/file-upload-session-storage-contract.d.ts.map +1 -0
  346. package/dist/testing/index.d.ts +2 -0
  347. package/dist/testing/index.d.ts.map +1 -1
  348. package/dist/testing/index.js +1951 -1242
  349. package/dist/testing/index.js.map +15 -13
  350. package/dist/testing/materializer-storage-contract.d.ts.map +1 -1
  351. package/dist/testing/object-query-contract.d.ts.map +1 -1
  352. package/dist/testing/ontology-contract-fixture.d.ts +8 -0
  353. package/dist/testing/ontology-contract-fixture.d.ts.map +1 -1
  354. package/dist/testing/ontology-storage-contract.d.ts.map +1 -1
  355. package/dist/testing/sandboxes-contract.d.ts.map +1 -1
  356. package/dist/testing/workflow-intervention-storage-contract.d.ts +8 -0
  357. package/dist/testing/workflow-intervention-storage-contract.d.ts.map +1 -0
  358. package/dist/webhooks/internal.js +24 -22
  359. package/dist/webhooks/internal.js.map +2 -2
  360. package/dist/webhooks/types.d.ts +2 -2
  361. package/dist/webhooks/types.d.ts.map +1 -1
  362. package/dist/workers/index.js +1 -1
  363. package/dist/workflows/index.js +42 -40
  364. package/dist/workflows/index.js.map +1 -1
  365. package/dist/workflows/run-dispatch.d.ts.map +1 -1
  366. package/dist/workflows/types.d.ts +2 -2
  367. package/dist/workflows/types.d.ts.map +1 -1
  368. package/package.json +7 -1
  369. package/src/actions/index.ts +0 -3
  370. package/src/actions/read-facade.ts +102 -62
  371. package/src/actions/request.ts +13 -0
  372. package/src/actions/run-dispatch.ts +3 -0
  373. package/src/actions/types/context.ts +17 -65
  374. package/src/actions/types/params.ts +2 -1
  375. package/src/agents/authority.ts +1 -1
  376. package/src/assert-never.ts +7 -0
  377. package/src/auth/client-address.ts +12 -0
  378. package/src/auth/csrf.ts +14 -5
  379. package/src/auth/index.ts +3 -2
  380. package/src/auth/runtime.ts +299 -277
  381. package/src/auth/session-cache.ts +18 -6
  382. package/src/auth/sessions.ts +30 -0
  383. package/src/auth/types.ts +7 -17
  384. package/src/bootstrap/index.ts +1 -0
  385. package/src/bootstrap/ontology-type-manifest.ts +112 -60
  386. package/src/edits/types.ts +47 -63
  387. package/src/errors/catalog.ts +4 -0
  388. package/src/events/envelope.ts +0 -13
  389. package/src/events/index.ts +1 -1
  390. package/src/events/service.ts +1 -11
  391. package/src/events/toStoredEvent.ts +1 -3
  392. package/src/events/types/index.ts +1 -1
  393. package/src/execution/agent.ts +1 -2
  394. package/src/execution/authorized-object-reader.ts +5 -7
  395. package/src/execution/primitive.ts +1 -2
  396. package/src/execution/request.ts +1 -2
  397. package/src/index.ts +8 -7
  398. package/src/maintenance/ontology-maintenance.ts +77 -1
  399. package/src/materialization/errors.ts +2 -0
  400. package/src/materialization/events.ts +27 -2
  401. package/src/materializer/README.md +2 -0
  402. package/src/materializer/edits/commit.ts +21 -12
  403. package/src/materializer/edits/operations.ts +32 -4
  404. package/src/materializer/edits/plan.ts +4 -5
  405. package/src/materializer/edits/user-refs.ts +115 -0
  406. package/src/materializer/effective/build-events.ts +4 -5
  407. package/src/materializer/execution/scope.ts +40 -7
  408. package/src/materializer/projections/replace.ts +2 -0
  409. package/src/materializer/projections/replacement-plan.ts +4 -0
  410. package/src/materializer/telemetry/append.ts +4 -12
  411. package/src/materializer/telemetry/plan.ts +4 -5
  412. package/src/objects/execution.ts +33 -62
  413. package/src/objects/query/executor.ts +12 -3
  414. package/src/objects/query/ir.ts +7 -0
  415. package/src/objects/query/planner.ts +1 -0
  416. package/src/objects/query/scalar-values.ts +19 -0
  417. package/src/objects/query/validate.ts +55 -44
  418. package/src/objects/sdk/object-handle.ts +8 -8
  419. package/src/objects/sdk/object-set.ts +8 -15
  420. package/src/objects/sdk/query-builder.ts +59 -71
  421. package/src/objects/sdk/telemetry-channel.ts +6 -7
  422. package/src/objects/sdk/where.ts +6 -13
  423. package/src/ontology/builders.ts +15 -11
  424. package/src/ontology/index.ts +4 -0
  425. package/src/ontology/inference/index.ts +56 -36
  426. package/src/ontology/internal.ts +1 -0
  427. package/src/ontology/json-schema.ts +12 -0
  428. package/src/ontology/primitives.ts +91 -0
  429. package/src/ontology/query-capabilities.ts +136 -0
  430. package/src/ontology/refs.ts +33 -6
  431. package/src/ontology/registered.ts +22 -0
  432. package/src/ontology/registry.ts +6 -3
  433. package/src/ontology/tokens.ts +41 -2
  434. package/src/ontology/types.ts +19 -3
  435. package/src/ontology/user-ref.ts +120 -0
  436. package/src/ontology/validation/definition.ts +2 -13
  437. package/src/ontology/validation/index.ts +1 -0
  438. package/src/ontology/validation/normalize.ts +39 -3
  439. package/src/ontology/validation/properties.ts +95 -19
  440. package/src/ontology/validation/query.ts +11 -42
  441. package/src/ontology/validation/schema.ts +16 -0
  442. package/src/predicates/types.ts +43 -33
  443. package/src/projections/builders.ts +24 -3
  444. package/src/projections/validation.ts +15 -1
  445. package/src/runtime/create.ts +2 -2
  446. package/src/runtime/host.ts +10 -12
  447. package/src/runtime/index.ts +3 -2
  448. package/src/runtime/sixb.ts +13 -23
  449. package/src/runtime/types.ts +277 -479
  450. package/src/sandboxes/sandbox.ts +4 -1
  451. package/src/shared/params/types.ts +4 -3
  452. package/src/shared/params/user-refs.ts +48 -0
  453. package/src/shares/compiler.ts +6 -16
  454. package/src/storage/action-runs/types.ts +1 -0
  455. package/src/storage/auth/in-memory/access-tokens.ts +5 -2
  456. package/src/storage/auth/in-memory/auth-storage.ts +5 -8
  457. package/src/storage/auth/in-memory/device-authorizations.ts +0 -2
  458. package/src/storage/auth/in-memory/sessions.ts +69 -1
  459. package/src/storage/auth/in-memory/shared.ts +13 -7
  460. package/src/storage/auth/index.ts +2 -1
  461. package/src/storage/auth/types.ts +57 -13
  462. package/src/storage/executions/validation.ts +1 -1
  463. package/src/storage/file-upload-sessions/in-memory.ts +64 -113
  464. package/src/storage/file-upload-sessions/index.ts +1 -0
  465. package/src/storage/file-upload-sessions/provider.ts +258 -0
  466. package/src/storage/file-upload-sessions/types.ts +20 -1
  467. package/src/storage/file-upload-sessions/utils.ts +25 -9
  468. package/src/storage/index.ts +3 -2
  469. package/src/storage/objects/in-memory/query.ts +13 -3
  470. package/src/storage/ontology/commits.ts +6 -2
  471. package/src/storage/ontology/in-memory/materializations.ts +6 -34
  472. package/src/storage/ontology/provider-header-validation.ts +57 -0
  473. package/src/storage/ontology/provider-work.ts +15 -3
  474. package/src/storage/ontology/provider.ts +59 -1
  475. package/src/storage/operation-scope.ts +1 -0
  476. package/src/storage/types.ts +0 -1
  477. package/src/storage/workflow-interventions/index.ts +0 -1
  478. package/src/storage/workflow-interventions/types.ts +5 -9
  479. package/src/testing/action-execution.ts +13 -3
  480. package/src/testing/auth-storage-contract.ts +149 -62
  481. package/src/testing/execution-storage-contract.ts +1 -2
  482. package/src/testing/execution.ts +4 -7
  483. package/src/testing/file-upload-session-storage-contract.ts +335 -0
  484. package/src/testing/index.ts +8 -0
  485. package/src/testing/materializer-storage-contract.ts +86 -4
  486. package/src/testing/object-query-contract.ts +121 -2
  487. package/src/testing/ontology-contract-fixture.ts +23 -3
  488. package/src/testing/ontology-storage-contract.ts +58 -0
  489. package/src/testing/sandboxes-contract.ts +27 -0
  490. package/src/testing/workflow-intervention-storage-contract.ts +203 -0
  491. package/src/webhooks/types.ts +2 -2
  492. package/src/workflows/run-dispatch.ts +12 -1
  493. package/src/workflows/snapshot.ts +16 -7
  494. package/src/workflows/types.ts +2 -2
  495. package/dist/chunk-2cxv584m.js.map +0 -43
  496. package/dist/chunk-3ghw2t5q.js.map +0 -10
  497. package/dist/chunk-3h7ctayx.js.map +0 -11
  498. package/dist/chunk-6ma8dvzc.js.map +0 -15
  499. package/dist/chunk-bbaa1fet.js.map +0 -25
  500. package/dist/chunk-eyjzgav0.js.map +0 -12
  501. package/dist/chunk-f06sf7rr.js.map +0 -11
  502. package/dist/chunk-g50nxqs5.js.map +0 -18
  503. package/dist/chunk-hkw8rykk.js.map +0 -15
  504. package/dist/chunk-p6r1ex7t.js.map +0 -10
  505. package/dist/chunk-qm535afa.js.map +0 -15
  506. package/dist/chunk-vpxss818.js.map +0 -10
  507. package/dist/chunk-vsg0g7h9.js.map +0 -17
  508. /package/dist/{chunk-e1f1sqba.js.map → chunk-04h4t2b5.js.map} +0 -0
  509. /package/dist/{chunk-y3ev53cq.js.map → chunk-2fv8sajb.js.map} +0 -0
  510. /package/dist/{chunk-3bnt2wna.js.map → chunk-2hbhn1ff.js.map} +0 -0
  511. /package/dist/{chunk-5tetw4hn.js.map → chunk-4tnrzqqh.js.map} +0 -0
  512. /package/dist/{chunk-jjwhy3rs.js.map → chunk-a69fkrtr.js.map} +0 -0
  513. /package/dist/{chunk-y1ahv8b7.js.map → chunk-bdhfn0ww.js.map} +0 -0
  514. /package/dist/{chunk-4ph94nhd.js.map → chunk-bep5rrdq.js.map} +0 -0
  515. /package/dist/{chunk-kept9cdd.js.map → chunk-bxx3ms5t.js.map} +0 -0
  516. /package/dist/{chunk-xtfryrfb.js.map → chunk-cbn96bve.js.map} +0 -0
  517. /package/dist/{chunk-r5zythxp.js.map → chunk-gbcrz0gr.js.map} +0 -0
  518. /package/dist/{chunk-t7dzd1tm.js.map → chunk-jhyc777j.js.map} +0 -0
  519. /package/dist/{chunk-0mza4xb2.js.map → chunk-m8zkvep1.js.map} +0 -0
  520. /package/dist/{chunk-sfypc7mk.js.map → chunk-s24qbp32.js.map} +0 -0
  521. /package/dist/{chunk-y0v18c2j.js.map → chunk-vef6qa14.js.map} +0 -0
  522. /package/dist/{chunk-gzt6v1ja.js.map → chunk-vn3yh259.js.map} +0 -0
  523. /package/dist/{chunk-bg2bs62d.js.map → chunk-w9bp61e7.js.map} +0 -0
  524. /package/dist/{chunk-gswwr35f.js.map → chunk-y487ywrv.js.map} +0 -0
  525. /package/dist/{chunk-bet1rb9h.js.map → chunk-y6vnvayj.js.map} +0 -0
  526. /package/dist/{chunk-g2gezsg5.js.map → chunk-z9h698s8.js.map} +0 -0
  527. /package/dist/{chunk-bfjv1adk.js.map → chunk-znw0zvy4.js.map} +0 -0
@@ -1,32 +1,37 @@
1
- import type { Principal } from "../../auth"
2
- import type { FileRef, SignedBlobUploadPart } from "../../blob-storage"
3
- import { FileUploadSessionError } from "./errors"
1
+ import {
2
+ DurableFileUploadSessions,
3
+ type FileUploadSessionPersistence,
4
+ type FileUploadSessionPersistenceBackend,
5
+ } from "./provider"
4
6
  import type {
5
7
  CreateFileUploadSessionInput,
6
8
  FileUploadSession,
7
- FileUploadSessionStore,
9
+ ListAbandonedFileUploadSessionsInput,
8
10
  } from "./types"
9
- import {
10
- createFileUploadId,
11
- isFileUploadSessionExpired,
12
- isTerminalFileUploadSessionExpired,
13
- principalKey,
14
- shouldDeleteFileUploadSession,
15
- } from "./utils"
11
+ import { isAbandonedFileUploadSession, shouldDeleteFileUploadSession } from "./utils"
16
12
 
17
13
  export type InMemoryFileUploadSessionsSnapshot = Map<string, FileUploadSession>
18
14
 
19
15
  /**
20
- * In-memory {@link FileUploadSessionStore}.
16
+ * In-memory {@link FileUploadSessionStore}: the shared durable state machine over a Map.
21
17
  *
22
- * Sessions live only in this process's memory: they do not survive a restart and
23
- * are not shared across instances. Staged/direct-put uploads therefore require a
24
- * single-instance deployment for now; a durable (Pg/Sqlite) store is a follow-up.
25
- * Expired sessions are reaped opportunistically on `create` and on demand via
26
- * `cleanupExpired` (there is no background sweeper).
18
+ * Sessions live only in this process's memory: they do not survive a restart and are not
19
+ * shared across instances, so staged uploads need a single instance. `@sixb/pg` and
20
+ * `@sixb/sqlite` provide durable stores. Reapable sessions are also reaped on `create`.
27
21
  */
28
- export class InMemoryFileUploadSessions implements FileUploadSessionStore {
29
- private readonly sessionsById = new Map<string, FileUploadSession>()
22
+ export class InMemoryFileUploadSessions extends DurableFileUploadSessions {
23
+ private readonly sessionsById: Map<string, FileUploadSession>
24
+
25
+ constructor() {
26
+ const sessionsById = new Map<string, FileUploadSession>()
27
+ super(new InMemoryFileUploadSessionBackend(sessionsById))
28
+ this.sessionsById = sessionsById
29
+ }
30
+
31
+ override async create(input: CreateFileUploadSessionInput): Promise<FileUploadSession> {
32
+ await this.cleanupExpired()
33
+ return super.create(input)
34
+ }
30
35
 
31
36
  snapshot(): InMemoryFileUploadSessionsSnapshot {
32
37
  return structuredClone(this.sessionsById)
@@ -38,100 +43,63 @@ export class InMemoryFileUploadSessions implements FileUploadSessionStore {
38
43
  this.sessionsById.set(id, structuredClone(session))
39
44
  }
40
45
  }
46
+ }
41
47
 
42
- async create(input: CreateFileUploadSessionInput): Promise<FileUploadSession> {
43
- await this.cleanupExpired()
48
+ class InMemoryFileUploadSessionBackend implements FileUploadSessionPersistenceBackend {
49
+ private readonly persistence: FileUploadSessionPersistence
50
+ // Every await yields; chaining transactions keeps read-modify-write atomic.
51
+ private tail: Promise<unknown> = Promise.resolve()
44
52
 
45
- const session: FileUploadSession = {
46
- id: input.id ?? createFileUploadId(),
47
- projectId: input.projectId,
48
- principalKey: principalKey(input.principal),
49
- strategy: input.strategy,
50
- status: "pending",
51
- ...(input.fileName === undefined ? {} : { fileName: input.fileName }),
52
- ...(input.mediaType === undefined ? {} : { mediaType: input.mediaType }),
53
- ...(input.logicalPath === undefined ? {} : { logicalPath: input.logicalPath }),
54
- ...(input.expectedSizeBytes === undefined
55
- ? {}
56
- : { expectedSizeBytes: input.expectedSizeBytes }),
57
- ...(input.expectedDigest === undefined ? {} : { expectedDigest: input.expectedDigest }),
58
- ...(input.providerUpload === undefined ? {} : { providerUpload: input.providerUpload }),
59
- signedParts: [],
60
- createdAt: new Date(),
61
- expiresAt: input.expiresAt,
62
- }
53
+ constructor(sessionsById: Map<string, FileUploadSession>) {
54
+ this.persistence = new InMemoryFileUploadSessionPersistence(sessionsById)
55
+ }
63
56
 
64
- this.sessionsById.set(session.id, session)
65
- return session
57
+ read<T>(run: (persistence: FileUploadSessionPersistence) => Promise<T>): Promise<T> {
58
+ return run(this.persistence)
66
59
  }
67
60
 
68
- async getForPrincipal(uploadId: string, principal: Principal): Promise<FileUploadSession> {
69
- const session = this.sessionsById.get(uploadId)
70
- if (!session || session.principalKey !== principalKey(principal)) {
71
- throw new FileUploadSessionError("not_found", "File upload session not found.")
72
- }
61
+ transaction<T>(run: (persistence: FileUploadSessionPersistence) => Promise<T>): Promise<T> {
62
+ const result = this.tail.then(() => run(this.persistence))
63
+ this.tail = result.catch(() => undefined)
64
+ return result
65
+ }
66
+ }
73
67
 
74
- const nowMs = Date.now()
75
- if (isFileUploadSessionExpired(session, nowMs)) {
76
- this.sessionsById.delete(uploadId)
77
- throw new FileUploadSessionError("expired", "File upload session has expired.")
78
- }
68
+ class InMemoryFileUploadSessionPersistence implements FileUploadSessionPersistence {
69
+ constructor(private readonly sessionsById: Map<string, FileUploadSession>) {}
79
70
 
80
- if (isTerminalFileUploadSessionExpired(session, nowMs)) {
81
- this.sessionsById.delete(uploadId)
82
- throw new FileUploadSessionError("not_found", "File upload session not found.")
83
- }
84
-
85
- return session
71
+ async now(): Promise<Date> {
72
+ return new Date()
86
73
  }
87
74
 
88
- async markUploaded(uploadId: string, fileRef: FileRef): Promise<FileUploadSession> {
89
- const session = this.requirePending(uploadId)
90
- const updated = {
91
- ...session,
92
- fileRef,
93
- }
94
- this.sessionsById.set(uploadId, updated)
95
- return updated
75
+ async insert(session: FileUploadSession): Promise<boolean> {
76
+ if (this.sessionsById.has(session.id)) return false
77
+ this.sessionsById.set(session.id, session)
78
+ return true
96
79
  }
97
80
 
98
- async addSignedPart(uploadId: string, part: SignedBlobUploadPart): Promise<FileUploadSession> {
99
- const session = this.requirePending(uploadId)
100
- const updated = {
101
- ...session,
102
- signedParts: [
103
- ...session.signedParts.filter((candidate) => candidate.partNumber !== part.partNumber),
104
- part,
105
- ].sort((left, right) => left.partNumber - right.partNumber),
106
- }
107
- this.sessionsById.set(uploadId, updated)
108
- return updated
81
+ async get(uploadId: string): Promise<FileUploadSession | null> {
82
+ return this.sessionsById.get(uploadId) ?? null
109
83
  }
110
84
 
111
- async complete(uploadId: string, fileRef: FileRef): Promise<FileUploadSession> {
112
- const session = this.requirePending(uploadId)
113
- const updated = {
114
- ...session,
115
- status: "completed" as const,
116
- fileRef,
117
- completedAt: new Date(),
118
- }
119
- this.sessionsById.set(uploadId, updated)
120
- return updated
85
+ async update(session: FileUploadSession): Promise<void> {
86
+ this.sessionsById.set(session.id, session)
121
87
  }
122
88
 
123
- async abort(uploadId: string): Promise<FileUploadSession> {
124
- const session = this.requirePending(uploadId)
125
- const updated = {
126
- ...session,
127
- status: "aborted" as const,
128
- abortedAt: new Date(),
129
- }
130
- this.sessionsById.set(uploadId, updated)
131
- return updated
89
+ async listAbandoned(
90
+ input: ListAbandonedFileUploadSessionsInput
91
+ ): Promise<readonly FileUploadSession[]> {
92
+ return [...this.sessionsById.values()]
93
+ .filter(
94
+ (session) =>
95
+ session.projectId === input.projectId &&
96
+ isAbandonedFileUploadSession(session, input.now.getTime())
97
+ )
98
+ .sort((left, right) => left.expiresAt.getTime() - right.expiresAt.getTime())
99
+ .slice(0, input.limit)
132
100
  }
133
101
 
134
- async cleanupExpired(now = new Date()): Promise<number> {
102
+ async deleteReapable(now: Date): Promise<number> {
135
103
  let deleted = 0
136
104
  for (const [id, session] of this.sessionsById) {
137
105
  if (shouldDeleteFileUploadSession(session, now.getTime())) {
@@ -139,23 +107,6 @@ export class InMemoryFileUploadSessions implements FileUploadSessionStore {
139
107
  deleted += 1
140
108
  }
141
109
  }
142
-
143
110
  return deleted
144
111
  }
145
-
146
- private requirePending(uploadId: string): FileUploadSession {
147
- const session = this.sessionsById.get(uploadId)
148
- if (!session) {
149
- throw new FileUploadSessionError("not_found", "File upload session not found.")
150
- }
151
-
152
- if (session.status !== "pending") {
153
- throw new FileUploadSessionError(
154
- session.status === "completed" ? "already_completed" : "already_aborted",
155
- `File upload session is already ${session.status}.`
156
- )
157
- }
158
-
159
- return session
160
- }
161
112
  }
@@ -7,6 +7,7 @@ export type {
7
7
  FileUploadSessionStore,
8
8
  FileUploadStatus,
9
9
  FileUploadStrategy,
10
+ ListAbandonedFileUploadSessionsInput,
10
11
  } from "./types"
11
12
  export {
12
13
  createFileUploadId,
@@ -0,0 +1,258 @@
1
+ import { type Principal, principalsEqual } from "../../auth"
2
+ import type { FileRef, SignedBlobUploadPart } from "../../blob-storage"
3
+ import { FileUploadSessionError } from "./errors"
4
+ import type {
5
+ CreateFileUploadSessionInput,
6
+ FileUploadSession,
7
+ FileUploadSessionStore,
8
+ FileUploadStatus,
9
+ FileUploadStrategy,
10
+ ListAbandonedFileUploadSessionsInput,
11
+ } from "./types"
12
+ import {
13
+ createFileUploadId,
14
+ isFileUploadSessionExpired,
15
+ isTerminalFileUploadSessionExpired,
16
+ } from "./utils"
17
+
18
+ export { fileUploadSessionReapAt } from "./utils"
19
+
20
+ /** Database-specific row access used by the shared upload session state machine. */
21
+ export interface FileUploadSessionPersistence {
22
+ now(): Promise<Date>
23
+ /** Returns false when the id already exists. */
24
+ insert(session: FileUploadSession): Promise<boolean>
25
+ /** Inside `transaction`, must lock the row until the transaction ends. */
26
+ get(uploadId: string): Promise<FileUploadSession | null>
27
+ update(session: FileUploadSession): Promise<void>
28
+ /** The project's `pending` rows holding a provider upload, `expires_at <= now`, oldest first. */
29
+ listAbandoned(input: ListAbandonedFileUploadSessionsInput): Promise<readonly FileUploadSession[]>
30
+ /** Deletes rows whose persisted `fileUploadSessionReapAt` is `<= now`. */
31
+ deleteReapable(now: Date): Promise<number>
32
+ }
33
+
34
+ /** Transaction and lock boundary supplied by a concrete durable storage provider. */
35
+ export interface FileUploadSessionPersistenceBackend {
36
+ read<T>(run: (persistence: FileUploadSessionPersistence) => Promise<T>): Promise<T>
37
+ transaction<T>(run: (persistence: FileUploadSessionPersistence) => Promise<T>): Promise<T>
38
+ }
39
+
40
+ /**
41
+ * Shared durable implementation of the upload session lifecycle. Concrete providers own SQL,
42
+ * transactions and database time; every transition and retention rule lives here so SQLite,
43
+ * PostgreSQL and the in-memory reference cannot drift semantically.
44
+ *
45
+ * Every method is `async`: a storage's operation-scoped facade serializes only async methods, and
46
+ * a plain Promise-returning method would bypass it and join whatever SQLite transaction is open.
47
+ */
48
+ export class DurableFileUploadSessions implements FileUploadSessionStore {
49
+ constructor(private readonly backend: FileUploadSessionPersistenceBackend) {}
50
+
51
+ async create(input: CreateFileUploadSessionInput): Promise<FileUploadSession> {
52
+ return this.backend.transaction(async (persistence) => {
53
+ const session: FileUploadSession = {
54
+ id: input.id ?? createFileUploadId(),
55
+ projectId: input.projectId,
56
+ principal: input.principal,
57
+ strategy: input.strategy,
58
+ status: "pending",
59
+ ...(input.fileName === undefined ? {} : { fileName: input.fileName }),
60
+ ...(input.mediaType === undefined ? {} : { mediaType: input.mediaType }),
61
+ ...(input.logicalPath === undefined ? {} : { logicalPath: input.logicalPath }),
62
+ ...(input.expectedSizeBytes === undefined
63
+ ? {}
64
+ : { expectedSizeBytes: input.expectedSizeBytes }),
65
+ ...(input.expectedDigest === undefined ? {} : { expectedDigest: input.expectedDigest }),
66
+ ...(input.providerUpload === undefined ? {} : { providerUpload: input.providerUpload }),
67
+ signedParts: [],
68
+ createdAt: await persistence.now(),
69
+ expiresAt: input.expiresAt,
70
+ }
71
+
72
+ if (!(await persistence.insert(session))) {
73
+ throw new Error(`[Sixb] File upload session '${session.id}' already exists.`)
74
+ }
75
+ return session
76
+ })
77
+ }
78
+
79
+ async getForPrincipal(uploadId: string, principal: Principal): Promise<FileUploadSession> {
80
+ return this.backend.read(async (persistence) => {
81
+ const session = await persistence.get(uploadId)
82
+ if (!session || !principalsEqual(session.principal, principal)) {
83
+ throw new FileUploadSessionError("not_found", "File upload session not found.")
84
+ }
85
+
86
+ const nowMs = (await persistence.now()).getTime()
87
+ if (isFileUploadSessionExpired(session, nowMs)) {
88
+ throw new FileUploadSessionError("expired", "File upload session has expired.")
89
+ }
90
+ if (isTerminalFileUploadSessionExpired(session, nowMs)) {
91
+ throw new FileUploadSessionError("not_found", "File upload session not found.")
92
+ }
93
+ return session
94
+ })
95
+ }
96
+
97
+ async markUploaded(uploadId: string, fileRef: FileRef): Promise<FileUploadSession> {
98
+ return this.transition(uploadId, (session) => ({ ...session, fileRef }))
99
+ }
100
+
101
+ async addSignedPart(uploadId: string, part: SignedBlobUploadPart): Promise<FileUploadSession> {
102
+ return this.transition(uploadId, (session) => ({
103
+ ...session,
104
+ signedParts: [
105
+ ...session.signedParts.filter((candidate) => candidate.partNumber !== part.partNumber),
106
+ part,
107
+ ].sort((left, right) => left.partNumber - right.partNumber),
108
+ }))
109
+ }
110
+
111
+ async complete(uploadId: string, fileRef: FileRef): Promise<FileUploadSession> {
112
+ return this.transition(uploadId, (session, now) => ({
113
+ ...session,
114
+ status: "completed",
115
+ fileRef,
116
+ completedAt: now,
117
+ }))
118
+ }
119
+
120
+ async abort(uploadId: string): Promise<FileUploadSession> {
121
+ return this.transition(uploadId, (session, now) => ({
122
+ ...session,
123
+ status: "aborted",
124
+ abortedAt: now,
125
+ }))
126
+ }
127
+
128
+ async listAbandoned(
129
+ input: ListAbandonedFileUploadSessionsInput
130
+ ): Promise<readonly FileUploadSession[]> {
131
+ if (input.projectId.trim().length === 0) {
132
+ throw new Error("[Sixb] File upload session listAbandoned projectId must not be blank.")
133
+ }
134
+ if (!Number.isSafeInteger(input.limit) || input.limit <= 0) {
135
+ throw new Error("[Sixb] File upload session listAbandoned limit must be a positive integer.")
136
+ }
137
+ return this.backend.read((persistence) => persistence.listAbandoned(input))
138
+ }
139
+
140
+ async cleanupExpired(now?: Date): Promise<number> {
141
+ return this.backend.transaction(async (persistence) =>
142
+ persistence.deleteReapable(now ?? (await persistence.now()))
143
+ )
144
+ }
145
+
146
+ private transition(
147
+ uploadId: string,
148
+ next: (session: FileUploadSession, now: Date) => FileUploadSession
149
+ ): Promise<FileUploadSession> {
150
+ return this.backend.transaction(async (persistence) => {
151
+ const session = await persistence.get(uploadId)
152
+ if (!session) {
153
+ throw new FileUploadSessionError("not_found", "File upload session not found.")
154
+ }
155
+ if (session.status !== "pending") {
156
+ throw new FileUploadSessionError(
157
+ session.status === "completed" ? "already_completed" : "already_aborted",
158
+ `File upload session is already ${session.status}.`
159
+ )
160
+ }
161
+
162
+ const updated = next(session, await persistence.now())
163
+ await persistence.update(updated)
164
+ return updated
165
+ })
166
+ }
167
+ }
168
+
169
+ const STRATEGIES: readonly FileUploadStrategy[] = ["server", "direct-put", "multipart"]
170
+ const STATUSES: readonly FileUploadStatus[] = ["pending", "completed", "aborted"]
171
+ const PRINCIPAL_TYPES: readonly Principal["type"][] = ["user", "serviceAccount", "system"]
172
+
173
+ /**
174
+ * Rebuilds a session from a provider row. JSON columns may arrive parsed (jsonb) or as text
175
+ * (SQLite); nested `expiresAt` values are revived and every other nested field passes through,
176
+ * so blob providers can extend `providerUpload` without a migration. Fails closed on corruption.
177
+ */
178
+ export function parseFileUploadSessionRow(row: {
179
+ readonly [column: string]: unknown
180
+ }): FileUploadSession {
181
+ const id = text(row.id, "id", String(row.id))
182
+ const strategy = text(row.strategy, "strategy", id) as FileUploadStrategy
183
+ const status = text(row.status, "status", id) as FileUploadStatus
184
+ if (!STRATEGIES.includes(strategy)) throw corrupt(id, `unknown strategy '${strategy}'`)
185
+ if (!STATUSES.includes(status)) throw corrupt(id, `unknown status '${status}'`)
186
+ const principalType = text(row.ownerPrincipalType, "ownerPrincipalType", id)
187
+ if (!PRINCIPAL_TYPES.includes(principalType as Principal["type"])) {
188
+ throw corrupt(id, `unknown owner principal type '${principalType}'`)
189
+ }
190
+
191
+ const providerUpload = json(row.providerUpload)
192
+ const fileRef = json(row.fileRef)
193
+ const signedParts = json(row.signedParts)
194
+ if (!Array.isArray(signedParts)) throw corrupt(id, "signedParts is not an array")
195
+
196
+ const optional = <T>(key: string, value: T | null | undefined) =>
197
+ value === null || value === undefined ? {} : { [key]: value }
198
+
199
+ return {
200
+ id,
201
+ projectId: text(row.projectId, "projectId", id),
202
+ principal: {
203
+ type: principalType as Principal["type"],
204
+ id: text(row.ownerPrincipalId, "ownerPrincipalId", id),
205
+ },
206
+ strategy,
207
+ status,
208
+ ...optional("fileName", row.fileName as string | null),
209
+ ...optional("mediaType", row.mediaType as string | null),
210
+ ...optional("logicalPath", row.logicalPath as string | null),
211
+ ...optional(
212
+ "expectedSizeBytes",
213
+ row.expectedSizeBytes === null || row.expectedSizeBytes === undefined
214
+ ? null
215
+ : Number(row.expectedSizeBytes)
216
+ ),
217
+ ...optional("expectedDigest", row.expectedDigest as string | null),
218
+ ...optional(
219
+ "providerUpload",
220
+ providerUpload === null ? null : withExpiresAt(providerUpload, id)
221
+ ),
222
+ signedParts: signedParts.map((part) => withExpiresAt(part, id)) as SignedBlobUploadPart[],
223
+ ...optional("fileRef", fileRef as FileRef | null),
224
+ createdAt: date(row.createdAt, "createdAt", id),
225
+ expiresAt: date(row.expiresAt, "expiresAt", id),
226
+ ...optional(
227
+ "completedAt",
228
+ row.completedAt == null ? null : date(row.completedAt, "completedAt", id)
229
+ ),
230
+ ...optional("abortedAt", row.abortedAt == null ? null : date(row.abortedAt, "abortedAt", id)),
231
+ } as FileUploadSession
232
+ }
233
+
234
+ function json(value: unknown): unknown {
235
+ return typeof value === "string" ? JSON.parse(value) : (value ?? null)
236
+ }
237
+
238
+ function withExpiresAt<T>(value: unknown, id: string): T {
239
+ if (typeof value !== "object" || value === null)
240
+ throw corrupt(id, "nested record is not an object")
241
+ const record = value as Record<string, unknown>
242
+ return { ...record, expiresAt: date(record.expiresAt, "nested expiresAt", id) } as T
243
+ }
244
+
245
+ function text(value: unknown, column: string, id: string): string {
246
+ if (typeof value !== "string" || value.length === 0) throw corrupt(id, `${column} is not text`)
247
+ return value
248
+ }
249
+
250
+ function date(value: unknown, column: string, id: string): Date {
251
+ const parsed = value instanceof Date || typeof value === "string" ? new Date(value) : null
252
+ if (!parsed || !Number.isFinite(parsed.getTime())) throw corrupt(id, `${column} is not a date`)
253
+ return parsed
254
+ }
255
+
256
+ function corrupt(id: string, reason: string): Error {
257
+ return new Error(`[Sixb] Stored file upload session '${id}' is invalid: ${reason}.`)
258
+ }
@@ -26,7 +26,7 @@ export interface CreateFileUploadSessionInput {
26
26
  export interface FileUploadSession {
27
27
  readonly id: string
28
28
  readonly projectId: string
29
- readonly principalKey: string
29
+ readonly principal: Principal
30
30
  readonly strategy: FileUploadStrategy
31
31
  readonly status: FileUploadStatus
32
32
  readonly fileName?: string
@@ -43,19 +43,38 @@ export interface FileUploadSession {
43
43
  readonly abortedAt?: Date
44
44
  }
45
45
 
46
+ export interface ListAbandonedFileUploadSessionsInput {
47
+ readonly projectId: string
48
+ readonly now: Date
49
+ readonly limit: number
50
+ }
51
+
46
52
  /**
47
53
  * State machine for a staged/direct-put upload session. A session is created
48
54
  * `pending`; `markUploaded` records the resolved {@link FileRef} but keeps the
49
55
  * session `pending` (non-terminal), while `complete` and `abort` move it to a
50
56
  * terminal `completed`/`aborted` state. Terminal sessions are retained briefly
51
57
  * (for idempotent retries) then reaped by `cleanupExpired`.
58
+ *
59
+ * An expired `pending` session that still holds a `providerUpload` is abandoned:
60
+ * the provider may be billing for parts only `abortUpload` can release. The store
61
+ * never deletes one. A sweep lists them with `listAbandoned`, aborts the provider
62
+ * upload, then calls `abort` so the row becomes terminal and is reaped normally.
52
63
  */
53
64
  export interface FileUploadSessionStore {
54
65
  create(input: CreateFileUploadSessionInput): Promise<FileUploadSession>
66
+ /**
67
+ * The expiry gate: throws `expired` or `not_found`, and never deletes. Callers check expiry
68
+ * here when a request starts; the transitions below do not re-check it, because a request
69
+ * that passed the gate may finish slow blob I/O after `expiresAt`.
70
+ */
55
71
  getForPrincipal(uploadId: string, principal: Principal): Promise<FileUploadSession>
56
72
  markUploaded(uploadId: string, fileRef: FileRef): Promise<FileUploadSession>
57
73
  addSignedPart(uploadId: string, part: SignedBlobUploadPart): Promise<FileUploadSession>
58
74
  complete(uploadId: string, fileRef: FileRef): Promise<FileUploadSession>
59
75
  abort(uploadId: string): Promise<FileUploadSession>
76
+ /** One project's abandoned sessions expired at or before `now`, oldest expiry first. */
77
+ listAbandoned(input: ListAbandonedFileUploadSessionsInput): Promise<readonly FileUploadSession[]>
78
+ /** Deletes reapable sessions and returns the count. Never deletes an abandoned session. */
60
79
  cleanupExpired(now?: Date): Promise<number>
61
80
  }
@@ -1,5 +1,4 @@
1
1
  import { randomUUID } from "node:crypto"
2
- import type { Principal } from "../../auth"
3
2
  import type { FileUploadSession } from "./types"
4
3
 
5
4
  export const DEFAULT_FILE_UPLOAD_SESSION_TTL_MS = 60 * 60 * 1000
@@ -13,10 +12,6 @@ export function createFileUploadId(): string {
13
12
  return `upload_${randomUUID().replaceAll("-", "")}`
14
13
  }
15
14
 
16
- export function principalKey(principal: Principal): string {
17
- return `${principal.type}:${principal.id}`
18
- }
19
-
20
15
  export function isFileUploadSessionExpired(
21
16
  session: FileUploadSession,
22
17
  nowMs = Date.now()
@@ -24,12 +19,33 @@ export function isFileUploadSessionExpired(
24
19
  return session.status === "pending" && session.expiresAt.getTime() <= nowMs
25
20
  }
26
21
 
27
- export function shouldDeleteFileUploadSession(session: FileUploadSession, nowMs: number): boolean {
28
- if (isFileUploadSessionExpired(session, nowMs)) {
29
- return true
22
+ /** Expired, still `pending`, and holding a provider upload only `abortUpload` can release. */
23
+ export function isAbandonedFileUploadSession(
24
+ session: FileUploadSession,
25
+ nowMs = Date.now()
26
+ ): boolean {
27
+ return session.providerUpload !== undefined && isFileUploadSessionExpired(session, nowMs)
28
+ }
29
+
30
+ /**
31
+ * When a session may be deleted, or null when only a state change can make it deletable.
32
+ * This is the single retention rule: durable providers persist it as `reap_at` and delete
33
+ * `reap_at <= now`, so SQL never restates it.
34
+ */
35
+ export function fileUploadSessionReapAt(session: FileUploadSession): Date | null {
36
+ if (session.status === "pending") {
37
+ return session.providerUpload === undefined ? session.expiresAt : null
30
38
  }
31
39
 
32
- return isTerminalFileUploadSessionExpired(session, nowMs)
40
+ const terminalAt = session.completedAt ?? session.abortedAt
41
+ return terminalAt
42
+ ? new Date(terminalAt.getTime() + DEFAULT_FILE_UPLOAD_TERMINAL_SESSION_TTL_MS)
43
+ : null
44
+ }
45
+
46
+ export function shouldDeleteFileUploadSession(session: FileUploadSession, nowMs: number): boolean {
47
+ const reapAt = fileUploadSessionReapAt(session)
48
+ return reapAt !== null && reapAt.getTime() <= nowMs
33
49
  }
34
50
 
35
51
  export function isTerminalFileUploadSessionExpired(
@@ -199,7 +199,6 @@ export type {
199
199
  export { AiUsageStorageError, aggregateAiModelCallUsage, InMemoryAiUsageStorage } from "./ai-usage"
200
200
  export type {
201
201
  AccessTokenRecord,
202
- AccessTokenSubjectType,
203
202
  AuthAccessTokenStore,
204
203
  AuthDeviceAuthorizationStore,
205
204
  AuthGroupMembershipStore,
@@ -213,6 +212,7 @@ export type {
213
212
  AuthStorageErrorCode,
214
213
  AuthUserIdentityStore,
215
214
  AuthUserStore,
215
+ BearerSessionState,
216
216
  CompleteAuthSessionInput,
217
217
  CompleteDeviceAuthorizationInput,
218
218
  CompleteDeviceAuthorizationResult,
@@ -244,6 +244,7 @@ export type {
244
244
  MagicLinkRecord,
245
245
  OidcAuthorizationAttemptRecord,
246
246
  ReconcileAuthServiceAccountGroupMembershipsInput,
247
+ RotateSessionRefreshTokenResult,
247
248
  ServiceAccountGroupMembershipRecord,
248
249
  ServiceAccountRecord,
249
250
  ServiceAccountStatus,
@@ -357,6 +358,7 @@ export type {
357
358
  FileUploadSessionStore,
358
359
  FileUploadStatus,
359
360
  FileUploadStrategy,
361
+ ListAbandonedFileUploadSessionsInput,
360
362
  } from "./file-upload-sessions"
361
363
  export {
362
364
  DEFAULT_FILE_UPLOAD_SESSION_TTL_MS,
@@ -710,7 +712,6 @@ export type {
710
712
  ListWorkflowInterventionsInput,
711
713
  ListWorkflowInterventionsResult,
712
714
  SubmitWorkflowInterventionInput,
713
- WorkflowInterventionActor,
714
715
  WorkflowInterventionRecord,
715
716
  WorkflowInterventionStatus,
716
717
  WorkflowInterventionStorage,
@@ -2,6 +2,7 @@ import type {
2
2
  ObjectQuery,
3
3
  ObjectQueryPredicate,
4
4
  ObjectQuerySortField,
5
+ QueryScalarKind,
5
6
  } from "../../../objects/query"
6
7
  import {
7
8
  compareQueryScalarValues,
@@ -82,6 +83,7 @@ export const IN_MEMORY_OBJECT_QUERY_CAPABILITIES: ObjectQueryCapabilities = {
82
83
  decimal: { equality: true, ordering: true },
83
84
  date: { equality: true, ordering: true },
84
85
  timestamp: { equality: true, ordering: true },
86
+ userRef: { equality: true },
85
87
  },
86
88
  limits: {
87
89
  totalCount: true,
@@ -423,17 +425,25 @@ function matchesPredicate(row: ObjectRow, predicate: ObjectQueryPredicate): bool
423
425
  return predicate.value ? exists : !exists
424
426
  }
425
427
  case "contains":
426
- return containsValue(row.properties[predicate.propertyId], predicate.value)
428
+ return containsValue(
429
+ row.properties[predicate.propertyId],
430
+ predicate.value,
431
+ predicate.scalarKind
432
+ )
427
433
  }
428
434
  }
429
435
 
430
- function containsValue(actual: unknown, expected: unknown): boolean {
436
+ function containsValue(
437
+ actual: unknown,
438
+ expected: unknown,
439
+ itemScalarKind: QueryScalarKind | undefined
440
+ ): boolean {
431
441
  if (typeof actual === "string" && typeof expected === "string") {
432
442
  return actual.includes(expected)
433
443
  }
434
444
 
435
445
  if (Array.isArray(actual)) {
436
- return actual.some((item) => queryScalarValuesEqual(item, expected))
446
+ return actual.some((item) => queryScalarValuesEqual(item, expected, itemScalarKind))
437
447
  }
438
448
 
439
449
  if (isPlainObject(actual) && typeof expected === "string") {