@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
@@ -37,6 +37,24 @@ function sessionInput(
37
37
  }
38
38
  }
39
39
 
40
+ function bearerSessionInput(id: string) {
41
+ return {
42
+ id,
43
+ projectId,
44
+ userId: "usr_1",
45
+ strategyId: "magic-link",
46
+ audience: "atlas" as const,
47
+ tokenHash: "access-1",
48
+ createdAt: at("2026-05-14T10:00:00.000Z"),
49
+ expiresAt: at("2026-06-14T10:00:00.000Z"),
50
+ bearer: {
51
+ clientName: "sixb CLI",
52
+ accessExpiresAt: at("2026-05-14T10:15:00.000Z"),
53
+ refreshTokenHash: "refresh-1",
54
+ },
55
+ }
56
+ }
57
+
40
58
  async function expectAuthError(
41
59
  promise: Promise<unknown>,
42
60
  code: AuthStorageErrorCode
@@ -851,8 +869,7 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
851
869
  projectId,
852
870
  name: "Local CLI",
853
871
  kind: "personal",
854
- subjectType: "user",
855
- subjectId: "usr_1",
872
+ subject: { type: "user", id: "usr_1" },
856
873
  tokenHash: "hash-personal",
857
874
  groupIds: ["commercial", "commercial", "finance"],
858
875
  createdAt: at("2026-05-14T10:01:00.000Z"),
@@ -893,8 +910,7 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
893
910
  projectId,
894
911
  name: "Sandbox agent",
895
912
  kind: "serviceAccount",
896
- subjectType: "serviceAccount",
897
- subjectId: "svc_ingest",
913
+ subject: { type: "serviceAccount", id: "svc_ingest" },
898
914
  tokenHash: "hash-service",
899
915
  createdAt: at("2026-05-14T10:04:00.000Z"),
900
916
  expiresAt: at("2026-05-21T10:04:00.000Z"),
@@ -902,8 +918,7 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
902
918
  await expect(
903
919
  storage.accessTokens.list({
904
920
  projectId,
905
- subjectType: "serviceAccount",
906
- subjectId: "svc_ingest",
921
+ subject: { type: "serviceAccount", id: "svc_ingest" },
907
922
  })
908
923
  ).resolves.toMatchObject({
909
924
  accessTokens: [{ id: "tok_service" }],
@@ -978,8 +993,7 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
978
993
  projectId,
979
994
  name: `Token by ${principal.type}`,
980
995
  kind: "personal",
981
- subjectType: "user",
982
- subjectId: "usr_creator",
996
+ subject: { type: "user", id: "usr_creator" },
983
997
  tokenHash: `hash-${tokenId}`,
984
998
  createdByPrincipal: principal,
985
999
  createdBySessionId: "ses_creator",
@@ -1019,8 +1033,7 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
1019
1033
  projectId,
1020
1034
  name: "Touch token",
1021
1035
  kind: "personal",
1022
- subjectType: "user",
1023
- subjectId: "usr_1",
1036
+ subject: { type: "user", id: "usr_1" },
1024
1037
  tokenHash: "hash-touch",
1025
1038
  createdAt: at("2026-05-14T10:00:00.000Z"),
1026
1039
  expiresAt: at("2026-05-21T10:00:00.000Z"),
@@ -1066,8 +1079,7 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
1066
1079
  projectId,
1067
1080
  name: `Token ${id}`,
1068
1081
  kind: "personal",
1069
- subjectType: "user",
1070
- subjectId: "usr_1",
1082
+ subject: { type: "user", id: "usr_1" },
1071
1083
  tokenHash: `hash-${id}`,
1072
1084
  createdAt: at(`2026-05-14T10:0${index}:00.000Z`),
1073
1085
  expiresAt: at(`2026-05-21T10:0${index}:00.000Z`),
@@ -1182,8 +1194,7 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
1182
1194
  projectId,
1183
1195
  name: "Bad kind",
1184
1196
  kind: "serviceAccount",
1185
- subjectType: "user",
1186
- subjectId: "usr_1",
1197
+ subject: { type: "user", id: "usr_1" },
1187
1198
  tokenHash: "hash",
1188
1199
  createdAt: at("2026-05-14T10:00:00.000Z"),
1189
1200
  expiresAt: at("2026-05-21T10:00:00.000Z"),
@@ -1196,8 +1207,7 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
1196
1207
  projectId,
1197
1208
  name: "Missing subject",
1198
1209
  kind: "serviceAccount",
1199
- subjectType: "serviceAccount",
1200
- subjectId: "svc_missing",
1210
+ subject: { type: "serviceAccount", id: "svc_missing" },
1201
1211
  tokenHash: "hash",
1202
1212
  createdAt: at("2026-05-14T10:00:00.000Z"),
1203
1213
  expiresAt: at("2026-05-21T10:00:00.000Z"),
@@ -1316,11 +1326,11 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
1316
1326
  })
1317
1327
  })
1318
1328
 
1319
- test("authorizes a device and atomically creates its one-time access token", async () => {
1329
+ test("authorizes a device and atomically starts its bearer session", async () => {
1320
1330
  await withStorage(async (storage) => {
1321
1331
  await createUser(storage)
1322
1332
  await storage.sessions.create({
1323
- id: "ses_device",
1333
+ id: "ses_browser",
1324
1334
  projectId,
1325
1335
  userId: "usr_1",
1326
1336
  strategyId: "magic-link",
@@ -1335,69 +1345,146 @@ export function runAuthStorageContractSuite<TStorage extends AuthStorage>(
1335
1345
  deviceCodeHash: "device-code-hash",
1336
1346
  userCode: "BCDF-HJKM",
1337
1347
  clientName: "sixb CLI",
1338
- tokenName: "codex",
1339
- tokenExpiresAt: at("2026-08-12T10:00:00.000Z"),
1340
1348
  createdAt: at("2026-05-14T10:00:00.000Z"),
1341
1349
  expiresAt: at("2026-05-14T10:10:00.000Z"),
1342
1350
  })
1343
1351
 
1344
1352
  await expect(
1345
1353
  storage.deviceAuthorizations.getByUserCode({ projectId, userCode: "BCDF-HJKM" })
1346
- ).resolves.toMatchObject({ id: "dva_1", status: "pending" })
1354
+ ).resolves.toMatchObject({ id: "dva_1", status: "pending", clientName: "sixb CLI" })
1347
1355
  await storage.deviceAuthorizations.approve({
1348
1356
  projectId,
1349
1357
  id: "dva_1",
1350
1358
  userId: "usr_1",
1351
- sessionId: "ses_device",
1359
+ sessionId: "ses_browser",
1352
1360
  approvedAt: at("2026-05-14T10:01:00.000Z"),
1353
1361
  })
1354
1362
 
1355
- const completed = await storage.completeDeviceAuthorization({
1356
- projectId,
1357
- id: "dva_1",
1358
- deviceCodeHash: "device-code-hash",
1359
- completedAt: at("2026-05-14T10:02:00.000Z"),
1360
- accessToken: {
1361
- id: "tok_device",
1362
- projectId,
1363
- name: "codex",
1364
- kind: "personal",
1365
- subjectType: "user",
1366
- subjectId: "usr_1",
1367
- tokenHash: "access-token-hash",
1368
- createdByPrincipal: { type: "user", id: "usr_1" },
1369
- createdBySessionId: "ses_device",
1370
- createdAt: at("2026-05-14T10:02:00.000Z"),
1371
- expiresAt: at("2026-08-12T10:00:00.000Z"),
1372
- },
1373
- })
1374
-
1375
- expect(completed.authorization).toMatchObject({ status: "consumed" })
1376
- expect(completed.accessToken).toMatchObject({ id: "tok_device", subjectId: "usr_1" })
1377
- await expectAuthError(
1363
+ const complete = (id: string) =>
1378
1364
  storage.completeDeviceAuthorization({
1379
1365
  projectId,
1380
1366
  id: "dva_1",
1381
1367
  deviceCodeHash: "device-code-hash",
1382
- completedAt: at("2026-05-14T10:03:00.000Z"),
1383
- accessToken: {
1384
- id: "tok_device_2",
1385
- projectId,
1386
- name: "codex",
1387
- kind: "personal",
1388
- subjectType: "user",
1389
- subjectId: "usr_1",
1390
- tokenHash: "access-token-hash-2",
1391
- createdBySessionId: "ses_device",
1392
- createdAt: at("2026-05-14T10:03:00.000Z"),
1393
- expiresAt: at("2026-08-12T10:00:00.000Z"),
1394
- },
1395
- }),
1396
- "invalid_device_authorization"
1397
- )
1368
+ completedAt: at("2026-05-14T10:02:00.000Z"),
1369
+ session: bearerSessionInput(id),
1370
+ })
1371
+ const completed = await complete("ses_cli")
1372
+
1373
+ expect(completed.authorization).toMatchObject({ status: "consumed" })
1374
+ expect(completed.session).toMatchObject({
1375
+ id: "ses_cli",
1376
+ userId: "usr_1",
1377
+ bearer: { clientName: "sixb CLI", refreshTokenHash: "refresh-1" },
1378
+ })
1379
+ await expectAuthError(complete("ses_cli_2"), "invalid_device_authorization")
1380
+ await expect(storage.sessions.getById({ projectId, id: "ses_cli_2" })).resolves.toBeNull()
1381
+ })
1382
+ })
1383
+
1384
+ test("keeps bearer and cookie session credentials apart", async () => {
1385
+ await withStorage(async (storage) => {
1386
+ await createUser(storage)
1387
+ await storage.sessions.create(bearerSessionInput("ses_cli"))
1388
+ await storage.sessions.create({
1389
+ ...bearerSessionInput("ses_cookie"),
1390
+ tokenHash: "cookie-hash",
1391
+ bearer: undefined,
1392
+ })
1393
+ const now = at("2026-05-14T10:05:00.000Z")
1394
+
1395
+ await expect(
1396
+ storage.sessions.findValidByAccessTokenHash({
1397
+ projectId,
1398
+ id: "ses_cli",
1399
+ tokenHash: "access-1",
1400
+ now,
1401
+ })
1402
+ ).resolves.toMatchObject({ id: "ses_cli" })
1403
+ // A bearer access token never works as a cookie secret, and a cookie never as a token.
1404
+ await expect(
1405
+ storage.sessions.findValidByTokenHash({
1406
+ projectId,
1407
+ id: "ses_cli",
1408
+ audience: "atlas",
1409
+ tokenHash: "access-1",
1410
+ now,
1411
+ })
1412
+ ).resolves.toBeNull()
1398
1413
  await expect(
1399
- storage.accessTokens.getById({ projectId, id: "tok_device_2" })
1414
+ storage.sessions.findValidByAccessTokenHash({
1415
+ projectId,
1416
+ id: "ses_cookie",
1417
+ tokenHash: "cookie-hash",
1418
+ now,
1419
+ })
1400
1420
  ).resolves.toBeNull()
1421
+ // The access token expires before its session.
1422
+ await expect(
1423
+ storage.sessions.findValidByAccessTokenHash({
1424
+ projectId,
1425
+ id: "ses_cli",
1426
+ tokenHash: "access-1",
1427
+ now: at("2026-05-14T10:15:00.000Z"),
1428
+ })
1429
+ ).resolves.toBeNull()
1430
+ })
1431
+ })
1432
+
1433
+ test("rotates refresh tokens, tolerates a lost response, and revokes on reuse", async () => {
1434
+ await withStorage(async (storage) => {
1435
+ await createUser(storage)
1436
+ await storage.sessions.create({
1437
+ ...bearerSessionInput("ses_cli"),
1438
+ absoluteExpiresAt: at("2026-06-20T00:00:00.000Z"),
1439
+ })
1440
+ const rotate = (refreshTokenHash: string, now: string, generation: number) =>
1441
+ storage.sessions.rotateRefreshToken({
1442
+ projectId,
1443
+ id: "ses_cli",
1444
+ refreshTokenHash,
1445
+ now: at(now),
1446
+ reuseGraceMs: 60_000,
1447
+ next: {
1448
+ tokenHash: `access-${generation}`,
1449
+ accessExpiresAt: new Date(at(now).getTime() + 15 * 60_000),
1450
+ refreshTokenHash: `refresh-${generation}`,
1451
+ expiresAt: at("2026-07-01T00:00:00.000Z"),
1452
+ },
1453
+ })
1454
+
1455
+ const rotated = await rotate("refresh-1", "2026-05-15T10:00:00.000Z", 2)
1456
+ expect(rotated).toMatchObject({
1457
+ status: "rotated",
1458
+ session: {
1459
+ tokenHash: "access-2",
1460
+ bearer: { refreshTokenHash: "refresh-2", previousRefreshTokenHash: "refresh-1" },
1461
+ },
1462
+ })
1463
+ // The idle deadline moves, but never past the absolute one.
1464
+ expect(rotated.status === "rotated" && rotated.session.expiresAt.toISOString()).toBe(
1465
+ "2026-06-20T00:00:00.000Z"
1466
+ )
1467
+ // The response was lost; the client retries with the token it still has.
1468
+ await expect(rotate("refresh-1", "2026-05-15T10:00:30.000Z", 3)).resolves.toMatchObject({
1469
+ status: "rotated",
1470
+ session: { bearer: { refreshTokenHash: "refresh-3" } },
1471
+ })
1472
+ // An unknown token fails without touching the session.
1473
+ await expect(rotate("guess", "2026-05-15T10:01:00.000Z", 4)).resolves.toEqual({
1474
+ status: "invalid",
1475
+ })
1476
+ expect((await storage.sessions.getById({ projectId, id: "ses_cli" }))?.revokedAt).toBe(
1477
+ undefined
1478
+ )
1479
+ // A replaced token after the grace window means a copy is in use: end the session.
1480
+ await expect(rotate("refresh-2", "2026-05-15T10:05:00.000Z", 4)).resolves.toEqual({
1481
+ status: "reused",
1482
+ })
1483
+ await expect(rotate("refresh-3", "2026-05-15T10:05:01.000Z", 5)).resolves.toEqual({
1484
+ status: "invalid",
1485
+ })
1486
+ const session = await storage.sessions.getById({ projectId, id: "ses_cli" })
1487
+ expect(session?.revokedAt).toBeInstanceOf(Date)
1401
1488
  })
1402
1489
  })
1403
1490
 
@@ -402,8 +402,7 @@ async function seedAuth(auth: AuthStorage): Promise<void> {
402
402
  projectId,
403
403
  name: "Service token",
404
404
  kind: "serviceAccount",
405
- subjectType: "serviceAccount",
406
- subjectId: "service-one",
405
+ subject: { type: "serviceAccount", id: "service-one" },
407
406
  tokenHash: "service-token-hash",
408
407
  createdAt,
409
408
  expiresAt,
@@ -2,7 +2,6 @@ import type { AuthorizationContext } from "../authorization"
2
2
  import { createTestingScope } from "../execution/scopes"
3
3
  import type { ExecutionScope } from "../execution/types"
4
4
  import { bindModelExecutionAttempt } from "../models/execution/binding"
5
- import type { OntologySource } from "../ontology"
6
5
  import { SixbHost, type SixbHostOptions } from "../runtime/host"
7
6
  import { isBoundSixb, type Sixb } from "../runtime/sixb"
8
7
 
@@ -26,12 +25,10 @@ export interface TestExecutionHost {
26
25
  withScope(scope: ExecutionScope): object
27
26
  }
28
27
 
29
- export function createTestSixb<
30
- TOntologySources extends readonly OntologySource[] = readonly OntologySource[],
31
- >(
32
- hostOrOptions: TestExecutionHost | SixbHostOptions<TOntologySources>,
28
+ export function createTestSixb(
29
+ hostOrOptions: TestExecutionHost | SixbHostOptions,
33
30
  options: TestExecutionOptions = {}
34
- ): Sixb<TOntologySources> {
31
+ ): Sixb {
35
32
  const host: TestExecutionHost =
36
33
  "withScope" in hostOrOptions ? hostOrOptions : new SixbHost(hostOrOptions)
37
34
  const sixb = host.withScope(
@@ -43,7 +40,7 @@ export function createTestSixb<
43
40
  ...(options.correlationId === undefined ? {} : { correlationId: options.correlationId }),
44
41
  })
45
42
  )
46
- if (!isBoundSixb<TOntologySources>(sixb)) {
43
+ if (!isBoundSixb(sixb)) {
47
44
  throw new Error("[Sixb] Test host did not return an execution-bound Sixb SDK.")
48
45
  }
49
46
  bindModelExecutionAttempt(sixb.models, {
@@ -0,0 +1,335 @@
1
+ import { describe, expect, test } from "bun:test"
2
+ import type { Principal } from "../auth"
3
+ import type { BlobUploadSession, FileRef, SignedBlobUploadPart } from "../blob-storage"
4
+ import {
5
+ type CreateFileUploadSessionInput,
6
+ DEFAULT_FILE_UPLOAD_TERMINAL_SESSION_TTL_MS,
7
+ type FileUploadSessionStore,
8
+ } from "../storage/file-upload-sessions"
9
+
10
+ export interface FileUploadSessionStorageContractSuiteOptions<
11
+ TStorage extends FileUploadSessionStore = FileUploadSessionStore,
12
+ > {
13
+ readonly createStorage: () => TStorage | Promise<TStorage>
14
+ readonly cleanup?: (storage: TStorage) => void | Promise<void>
15
+ }
16
+
17
+ const HOUR_MS = 60 * 60 * 1000
18
+ const projectId = "file-upload-contract"
19
+ const principal: Principal = { type: "user", id: "usr_contract" }
20
+ const fileRef: FileRef = {
21
+ blobId: `blob_${"a".repeat(64)}`,
22
+ digest: `sha256:${"a".repeat(64)}`,
23
+ sizeBytes: 3,
24
+ fileName: "report.pdf",
25
+ }
26
+
27
+ /**
28
+ * Provider-neutral lifecycle, retention, and abandoned-upload contract for file upload
29
+ * sessions. Stores read their own clock, so fixtures place `expiresAt` relative to the
30
+ * real time instead of controlling it.
31
+ */
32
+ export function runFileUploadSessionStorageContractSuite<TStorage extends FileUploadSessionStore>(
33
+ label: string,
34
+ options: FileUploadSessionStorageContractSuiteOptions<TStorage>
35
+ ): void {
36
+ const withStorage = async (run: (storage: TStorage) => Promise<void>): Promise<void> => {
37
+ const storage = await options.createStorage()
38
+ try {
39
+ await run(storage)
40
+ } finally {
41
+ await options.cleanup?.(storage)
42
+ }
43
+ }
44
+
45
+ describe(label, () => {
46
+ test("round-trips every field, including provider fields it does not know", async () => {
47
+ await withStorage(async (storage) => {
48
+ // Provider-specific session fields must survive the JSON round-trip.
49
+ const providerUpload = { ...multipart("upload_roundtrip"), partReceipt: "etag" as const }
50
+ const input = sessionInput("upload_roundtrip", {
51
+ fileName: "report.pdf",
52
+ mediaType: "application/pdf",
53
+ logicalPath: "reports/q3.pdf",
54
+ expectedSizeBytes: 3,
55
+ expectedDigest: fileRef.digest,
56
+ providerUpload,
57
+ })
58
+ const created = await storage.create(input)
59
+
60
+ expect(created).toMatchObject({ status: "pending", principal })
61
+ const read = await storage.getForPrincipal("upload_roundtrip", principal)
62
+ expect(read).toEqual(created)
63
+ expect(read.providerUpload?.expiresAt).toBeInstanceOf(Date)
64
+ expect(read.providerUpload).toMatchObject({ partReceipt: "etag" })
65
+ })
66
+ })
67
+
68
+ test("hides a session from other principals and unknown ids", async () => {
69
+ await withStorage(async (storage) => {
70
+ await storage.create(sessionInput("upload_private"))
71
+
72
+ await expect(
73
+ storage.getForPrincipal("upload_private", { type: "user", id: "usr_other" })
74
+ ).rejects.toMatchObject({ reason: "not_found" })
75
+ await expect(storage.getForPrincipal("upload_missing", principal)).rejects.toMatchObject({
76
+ reason: "not_found",
77
+ })
78
+ })
79
+ })
80
+
81
+ test("rejects a duplicate id", async () => {
82
+ await withStorage(async (storage) => {
83
+ await storage.create(sessionInput("upload_duplicate"))
84
+ await expect(storage.create(sessionInput("upload_duplicate"))).rejects.toThrow(
85
+ "already exists"
86
+ )
87
+ })
88
+ })
89
+
90
+ test("keeps signed parts unique and ordered by part number", async () => {
91
+ await withStorage(async (storage) => {
92
+ await storage.create(
93
+ sessionInput("upload_parts", { providerUpload: multipart("upload_parts") })
94
+ )
95
+ // Insertion order differs from sorted order at every step, so dropping the sort fails.
96
+ await storage.addSignedPart("upload_parts", signedPart(3))
97
+ await storage.addSignedPart("upload_parts", signedPart(1))
98
+ await storage.addSignedPart("upload_parts", signedPart(2))
99
+ const updated = await storage.addSignedPart("upload_parts", signedPart(2, "replaced"))
100
+
101
+ expect(updated.signedParts.map((part) => [part.partNumber, part.url])).toEqual([
102
+ [1, "https://blob.test/part-1"],
103
+ [2, "https://blob.test/part-2-replaced"],
104
+ [3, "https://blob.test/part-3"],
105
+ ])
106
+ const read = await storage.getForPrincipal("upload_parts", principal)
107
+ expect(read.signedParts).toEqual(updated.signedParts)
108
+ expect(read.signedParts[0]?.expiresAt).toBeInstanceOf(Date)
109
+ })
110
+ })
111
+
112
+ test("does not lose a part signed concurrently with another", async () => {
113
+ await withStorage(async (storage) => {
114
+ await storage.create(
115
+ sessionInput("upload_race", { providerUpload: multipart("upload_race") })
116
+ )
117
+ await Promise.all(
118
+ [1, 2, 3, 4, 5].map((n) => storage.addSignedPart("upload_race", signedPart(n)))
119
+ )
120
+
121
+ const read = await storage.getForPrincipal("upload_race", principal)
122
+ expect(read.signedParts.map((part) => part.partNumber)).toEqual([1, 2, 3, 4, 5])
123
+ })
124
+ })
125
+
126
+ test("moves through markUploaded to one terminal state", async () => {
127
+ await withStorage(async (storage) => {
128
+ await storage.create(sessionInput("upload_done"))
129
+ const uploaded = await storage.markUploaded("upload_done", fileRef)
130
+ expect(uploaded).toMatchObject({ status: "pending", fileRef })
131
+
132
+ const completed = await storage.complete("upload_done", fileRef)
133
+ expect(completed.status).toBe("completed")
134
+ expect(completed.completedAt).toBeInstanceOf(Date)
135
+ await expect(storage.complete("upload_done", fileRef)).rejects.toMatchObject({
136
+ reason: "already_completed",
137
+ })
138
+ await expect(storage.abort("upload_done")).rejects.toMatchObject({
139
+ reason: "already_completed",
140
+ })
141
+
142
+ await storage.create(sessionInput("upload_cancelled"))
143
+ expect((await storage.abort("upload_cancelled")).status).toBe("aborted")
144
+ await expect(storage.abort("upload_cancelled")).rejects.toMatchObject({
145
+ reason: "already_aborted",
146
+ })
147
+ })
148
+ })
149
+
150
+ test("checks expiry at the gate only, so a request that passed it can finish", async () => {
151
+ await withStorage(async (storage) => {
152
+ // Provider uploads keep both rows unreapable while pending.
153
+ for (const id of ["upload_late", "upload_abort_late"]) {
154
+ await storage.create(
155
+ sessionInput(id, { expiresAt: ago(HOUR_MS), providerUpload: multipart(id) })
156
+ )
157
+ }
158
+
159
+ await expect(storage.getForPrincipal("upload_late", principal)).rejects.toMatchObject({
160
+ reason: "expired",
161
+ })
162
+ // Transitions run after slow blob I/O that began before `expiresAt`.
163
+ await storage.addSignedPart("upload_late", signedPart(1))
164
+ await storage.markUploaded("upload_late", fileRef)
165
+ expect((await storage.complete("upload_late", fileRef)).status).toBe("completed")
166
+ expect((await storage.abort("upload_abort_late")).status).toBe("aborted")
167
+ })
168
+ })
169
+
170
+ test("lists abandoned sessions for one project only", async () => {
171
+ await withStorage(async (storage) => {
172
+ await storage.create(
173
+ sessionInput("upload_ours", {
174
+ expiresAt: ago(HOUR_MS),
175
+ providerUpload: multipart("ours"),
176
+ })
177
+ )
178
+ await storage.create(
179
+ sessionInput("upload_theirs", {
180
+ projectId: "other-project",
181
+ expiresAt: ago(HOUR_MS),
182
+ providerUpload: multipart("theirs"),
183
+ })
184
+ )
185
+
186
+ const ids = (await storage.listAbandoned({ projectId, now: new Date(), limit: 10 })).map(
187
+ (session) => session.id
188
+ )
189
+ expect(ids).toEqual(["upload_ours"])
190
+ })
191
+ })
192
+
193
+ test("never deletes an abandoned session, on read or on cleanup", async () => {
194
+ await withStorage(async (storage) => {
195
+ await storage.create(
196
+ sessionInput("upload_abandoned", {
197
+ expiresAt: ago(HOUR_MS),
198
+ providerUpload: multipart("upload_abandoned"),
199
+ })
200
+ )
201
+
202
+ // Reading an expired session must not delete it: nothing would abort its provider upload.
203
+ await expect(storage.getForPrincipal("upload_abandoned", principal)).rejects.toMatchObject({
204
+ reason: "expired",
205
+ })
206
+ expect(await storage.cleanupExpired(later(HOUR_MS))).toBe(0)
207
+ expect(
208
+ (await storage.listAbandoned({ projectId, now: new Date(), limit: 10 })).map(
209
+ (session) => session.id
210
+ )
211
+ ).toEqual(["upload_abandoned"])
212
+ })
213
+ })
214
+
215
+ test("lists only abandoned sessions, oldest expiry first, within the limit", async () => {
216
+ await withStorage(async (storage) => {
217
+ await storage.create(
218
+ sessionInput("upload_newer", { expiresAt: ago(HOUR_MS), providerUpload: multipart("n") })
219
+ )
220
+ await storage.create(
221
+ sessionInput("upload_older", {
222
+ expiresAt: ago(2 * HOUR_MS),
223
+ providerUpload: multipart("o"),
224
+ })
225
+ )
226
+ await storage.create(sessionInput("upload_live", { providerUpload: multipart("live") }))
227
+ await storage.create(sessionInput("upload_server", { expiresAt: ago(HOUR_MS) }))
228
+ await storage.create(
229
+ sessionInput("upload_aborted", {
230
+ expiresAt: ago(HOUR_MS),
231
+ providerUpload: multipart("a"),
232
+ })
233
+ )
234
+ await storage.abort("upload_aborted")
235
+
236
+ const ids = async (limit: number) =>
237
+ (await storage.listAbandoned({ projectId, now: new Date(), limit })).map(
238
+ (session) => session.id
239
+ )
240
+ expect(await ids(10)).toEqual(["upload_older", "upload_newer"])
241
+ expect(await ids(1)).toEqual(["upload_older"])
242
+ const [oldest] = await storage.listAbandoned({ projectId, now: new Date(), limit: 1 })
243
+ expect(oldest?.providerUpload?.expiresAt).toBeInstanceOf(Date)
244
+ await expect(
245
+ storage.listAbandoned({ projectId, now: new Date(), limit: 0 })
246
+ ).rejects.toThrow("positive integer")
247
+ })
248
+ })
249
+
250
+ test("reaps expired sessions without a provider upload and terminal ones after their TTL", async () => {
251
+ await withStorage(async (storage) => {
252
+ await storage.create(sessionInput("upload_live"))
253
+ await storage.create(sessionInput("upload_finished"))
254
+ await storage.complete("upload_finished", fileRef)
255
+ // Created last: a store may reap opportunistically on `create`.
256
+ await storage.create(sessionInput("upload_expired", { expiresAt: ago(HOUR_MS) }))
257
+
258
+ expect(await storage.cleanupExpired(new Date())).toBe(1)
259
+ await expect(storage.getForPrincipal("upload_expired", principal)).rejects.toMatchObject({
260
+ reason: "not_found",
261
+ })
262
+ // A completed session outlives its expiry so a retried `complete` stays idempotent.
263
+ expect((await storage.getForPrincipal("upload_finished", principal)).status).toBe(
264
+ "completed"
265
+ )
266
+
267
+ expect(
268
+ await storage.cleanupExpired(later(DEFAULT_FILE_UPLOAD_TERMINAL_SESSION_TTL_MS + 60_000))
269
+ ).toBe(1)
270
+ await expect(storage.getForPrincipal("upload_finished", principal)).rejects.toMatchObject({
271
+ reason: "not_found",
272
+ })
273
+ expect((await storage.getForPrincipal("upload_live", principal)).status).toBe("pending")
274
+ })
275
+ })
276
+
277
+ test("reaps an abandoned session once it has been aborted", async () => {
278
+ await withStorage(async (storage) => {
279
+ await storage.create(
280
+ sessionInput("upload_swept", { expiresAt: ago(HOUR_MS), providerUpload: multipart("s") })
281
+ )
282
+ await storage.abort("upload_swept")
283
+
284
+ expect(await storage.listAbandoned({ projectId, now: new Date(), limit: 10 })).toEqual([])
285
+ expect(await storage.cleanupExpired(new Date())).toBe(0)
286
+ expect(
287
+ await storage.cleanupExpired(later(DEFAULT_FILE_UPLOAD_TERMINAL_SESSION_TTL_MS + 60_000))
288
+ ).toBe(1)
289
+ })
290
+ })
291
+ })
292
+ }
293
+
294
+ function sessionInput(
295
+ id: string,
296
+ overrides: Partial<CreateFileUploadSessionInput> = {}
297
+ ): CreateFileUploadSessionInput {
298
+ return {
299
+ id,
300
+ projectId,
301
+ principal,
302
+ strategy: overrides.providerUpload?.strategy ?? "server",
303
+ expiresAt: later(HOUR_MS),
304
+ ...overrides,
305
+ }
306
+ }
307
+
308
+ function multipart(uploadId: string): BlobUploadSession {
309
+ return {
310
+ strategy: "multipart",
311
+ uploadId,
312
+ partSizeBytes: 5 * 1024 * 1024,
313
+ expiresAt: later(HOUR_MS),
314
+ stagingKey: `staging/${uploadId}`,
315
+ providerUploadId: `provider-${uploadId}`,
316
+ }
317
+ }
318
+
319
+ function signedPart(partNumber: number, suffix?: string): SignedBlobUploadPart {
320
+ return {
321
+ partNumber,
322
+ method: "PUT",
323
+ url: `https://blob.test/part-${partNumber}${suffix ? `-${suffix}` : ""}`,
324
+ headers: {},
325
+ expiresAt: later(HOUR_MS),
326
+ }
327
+ }
328
+
329
+ function ago(ms: number): Date {
330
+ return new Date(Date.now() - ms)
331
+ }
332
+
333
+ function later(ms: number): Date {
334
+ return new Date(Date.now() + ms)
335
+ }