@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
@@ -59,6 +59,10 @@ export {
59
59
  type ExecutionStorageContractSuiteOptions,
60
60
  runExecutionStorageContractSuite,
61
61
  } from "./execution-storage-contract"
62
+ export {
63
+ type FileUploadSessionStorageContractSuiteOptions,
64
+ runFileUploadSessionStorageContractSuite,
65
+ } from "./file-upload-session-storage-contract"
62
66
  export { runLakeChangesContractSuite } from "./lake-changes-contract"
63
67
  export {
64
68
  type LakeMergeStorageContractSuiteOptions,
@@ -151,3 +155,7 @@ export {
151
155
  createTestAutomaticWorkflowExecution,
152
156
  createTestWorkflowExecution,
153
157
  } from "./workflow-execution"
158
+ export {
159
+ runWorkflowInterventionStorageContractSuite,
160
+ type WorkflowInterventionStorageContractSuiteOptions,
161
+ } from "./workflow-intervention-storage-contract"
@@ -13,7 +13,11 @@ import {
13
13
  import type { TrustedPrimitiveRef } from "../execution"
14
14
  import { restoreTrustedPrimitiveExecutionScope } from "../execution/durable"
15
15
  import { createTestingScope } from "../execution/scopes"
16
- import type { OntologyMaterializer } from "../materializer"
16
+ import type {
17
+ ExpectedLinkRevision,
18
+ ExpectedObjectRevision,
19
+ OntologyMaterializer,
20
+ } from "../materializer"
17
21
  import {
18
22
  createLinkScopeFingerprint,
19
23
  createOntologyMaterializer,
@@ -747,6 +751,84 @@ export function runMaterializerStorageContractSuite<TStorage extends Storage>(
747
751
  }
748
752
  })
749
753
 
754
+ test(`${name} rejects stale object and link expectations as expectation conflicts`, async () => {
755
+ // Action runs report exactly this conflict kind as `action.read_conflict`. Throw a stale
756
+ // expectation as another kind from any provider and this fails for that provider.
757
+ const createdStorage = await provider.createStorage()
758
+ const storage = requireContractStorage(createdStorage)
759
+ const runtimeMaterializer = createOntologyMaterializer({
760
+ projectId: "materializer-storage-contract",
761
+ ontology,
762
+ projections,
763
+ storage,
764
+ dependencies: { clock: () => new Date("2026-02-01T12:00:00.000Z") },
765
+ }).withScope(runtimeScope())
766
+ const device = { objectTypeId: Device.id, primaryId: "device" }
767
+ const peerLink = {
768
+ source: device,
769
+ linkId: "peers",
770
+ target: { objectTypeId: Device.id, primaryId: "peer" },
771
+ }
772
+ const commitExpecting = (
773
+ requestId: string,
774
+ expected: {
775
+ readonly expectedObjects: readonly ExpectedObjectRevision[]
776
+ readonly expectedLinks: readonly ExpectedLinkRevision[]
777
+ }
778
+ ) =>
779
+ runtimeMaterializer.edits.commit({
780
+ mode: "atomic",
781
+ source: { kind: "runtime", requestId },
782
+ operations: [
783
+ {
784
+ id: "rename",
785
+ kind: "object.patch",
786
+ ref: device,
787
+ set: { name: requestId },
788
+ unset: [],
789
+ reset: [],
790
+ },
791
+ ],
792
+ ...expected,
793
+ expectedLinkScopes: [],
794
+ })
795
+
796
+ try {
797
+ await runtimeMaterializer.edits.commit({
798
+ mode: "atomic",
799
+ source: { kind: "runtime", requestId: "expectation-setup" },
800
+ operations: [
801
+ { id: "device", kind: "object.create", ref: device, properties: { name: "device" } },
802
+ {
803
+ id: "peer",
804
+ kind: "object.create",
805
+ ref: peerLink.target,
806
+ properties: { name: "peer" },
807
+ },
808
+ { id: "link", kind: "link.upsert", ref: peerLink },
809
+ ],
810
+ expectedObjects: [],
811
+ expectedLinks: [],
812
+ expectedLinkScopes: [],
813
+ })
814
+
815
+ await expect(
816
+ commitExpecting("stale-object", {
817
+ expectedObjects: [{ ref: device, exists: false }],
818
+ expectedLinks: [],
819
+ })
820
+ ).rejects.toMatchObject({ kind: "expectation" })
821
+ await expect(
822
+ commitExpecting("stale-link", {
823
+ expectedObjects: [],
824
+ expectedLinks: [{ ref: peerLink, exists: false }],
825
+ })
826
+ ).rejects.toMatchObject({ kind: "expectation" })
827
+ } finally {
828
+ await provider.cleanup?.(createdStorage)
829
+ }
830
+ })
831
+
750
832
  test(`${name} fences projected cardinality-many link scopes by fingerprint`, async () => {
751
833
  const createdStorage = await provider.createStorage()
752
834
  const storage = requireContractStorage(createdStorage)
@@ -886,9 +968,9 @@ export function runMaterializerStorageContractSuite<TStorage extends Storage>(
886
968
  expectedLinkScopes: [],
887
969
  })
888
970
 
889
- await expect(commitObservation("stale-many-scope-action", "must not commit")).rejects.toThrow(
890
- "Expected link scope changed"
891
- )
971
+ const stale = commitObservation("stale-many-scope-action", "must not commit")
972
+ await expect(stale).rejects.toThrow("Expected link scope changed")
973
+ await expect(stale).rejects.toMatchObject({ kind: "expectation" })
892
974
  expect(
893
975
  await storage.objects.getByPrimaryId({
894
976
  projectId: "materializer-storage-contract",
@@ -10,10 +10,11 @@ import {
10
10
  normalizeObjectQuery,
11
11
  type ObjectQuery,
12
12
  ObjectQueryPlanningError,
13
+ type ObjectQueryPredicate,
13
14
  planObjectQuery,
14
15
  validateObjectQuery,
15
16
  } from "../objects/query"
16
- import { defineObjectType, link, OntologyRegistry, prop, stringEnum } from "../ontology"
17
+ import { defineObjectType, link, OntologyRegistry, prop, ref, stringEnum } from "../ontology"
17
18
  import type { ObjectStorage, QueryObjectsResult } from "../storage/objects"
18
19
  import type { Storage } from "../storage/types"
19
20
  import {
@@ -133,8 +134,29 @@ const DefaultTextChild = defineObjectType({
133
134
  search: { defaultText: ["alias"] },
134
135
  })
135
136
 
137
+ const Task = defineObjectType({
138
+ id: "ContractTask",
139
+ name: "Contract Task",
140
+ properties: [
141
+ prop("id", "string", {
142
+ required: true,
143
+ primary: true,
144
+ query: { searchable: true, sortable: true },
145
+ }),
146
+ prop("assignee", ref.user(), {
147
+ nullable: true,
148
+ query: { searchable: true, filterable: true, facet: true },
149
+ }),
150
+ prop(
151
+ "reviewers",
152
+ { type: "array", items: ref.user() },
153
+ { query: { searchable: true, filterable: true } }
154
+ ),
155
+ ],
156
+ })
157
+
136
158
  export const objectQueryContractOntology = new OntologyRegistry({
137
- sources: [Room, Device, Zone, Asset, LaptopAsset, DefaultTextBase, DefaultTextChild],
159
+ sources: [Room, Device, Zone, Asset, LaptopAsset, DefaultTextBase, DefaultTextChild, Task],
138
160
  })
139
161
 
140
162
  /**
@@ -151,6 +173,7 @@ export function runObjectQueryProviderContractSuite<TStorage extends Storage>(
151
173
  ): void {
152
174
  const withStorage = async (
153
175
  body: (context: {
176
+ readonly storage: TStorage
154
177
  readonly objects: TStorage["objects"]
155
178
  readonly fixture: MaterializerTestFixture
156
179
  }) => Promise<void>
@@ -158,6 +181,7 @@ export function runObjectQueryProviderContractSuite<TStorage extends Storage>(
158
181
  const storage = await options.createStorage()
159
182
  try {
160
183
  await body({
184
+ storage,
161
185
  objects: storage.objects,
162
186
  fixture: createMaterializerTestFixture({
163
187
  projectId,
@@ -835,6 +859,101 @@ export function runObjectQueryProviderContractSuite<TStorage extends Storage>(
835
859
  })
836
860
  })
837
861
 
862
+ test("matches user references on type and id, and groups facets by user", async () => {
863
+ await withStorage(async ({ storage: complete, objects: storage, fixture }) => {
864
+ const auth = complete.auth
865
+ if (!auth) throw new Error("The object query contract requires auth storage.")
866
+ for (const id of ["usr_alice", "usr_bob", "usr_carol"]) {
867
+ await auth.users.create({ projectId, id, email: `${id}@example.com` })
868
+ }
869
+ const alice = { type: "user", id: "usr_alice" }
870
+ const bob = { type: "user", id: "usr_bob" }
871
+ const carol = { type: "user", id: "usr_carol" }
872
+ await fixture.seed({
873
+ objects: [
874
+ objectSeed(Task.id, "t1", { assignee: alice, reviewers: [bob] }),
875
+ objectSeed(Task.id, "t2", { assignee: alice, reviewers: [bob, carol] }),
876
+ objectSeed(Task.id, "t3", { assignee: alice, reviewers: [] }),
877
+ objectSeed(Task.id, "t4", { assignee: bob, reviewers: [alice] }),
878
+ objectSeed(Task.id, "t5", { assignee: bob, reviewers: [carol] }),
879
+ objectSeed(Task.id, "t6", { assignee: null, reviewers: [] }),
880
+ objectSeed(Task.id, "t7", { reviewers: [] }),
881
+ ],
882
+ })
883
+
884
+ const ids = async (predicate: ObjectQueryPredicate) => {
885
+ const result = await executeObjectQuery(
886
+ {
887
+ projectId,
888
+ query: {
889
+ kind: "sort",
890
+ fields: [{ kind: "property", propertyId: "id" }],
891
+ input: {
892
+ kind: "filter",
893
+ predicate,
894
+ input: { kind: "start", objectTypeId: Task.id },
895
+ },
896
+ },
897
+ },
898
+ { ontology: objectQueryContractOntology, storage }
899
+ )
900
+ expect(result.plan.mode).toBe("pushdown")
901
+ return result.objects.map((object) => object.primaryId)
902
+ }
903
+
904
+ expect(await ids({ op: "eq", propertyId: "assignee", value: alice })).toEqual([
905
+ "t1",
906
+ "t2",
907
+ "t3",
908
+ ])
909
+ // Field order is not part of the value.
910
+ expect(
911
+ await ids({ op: "eq", propertyId: "assignee", value: { id: "usr_alice", type: "user" } })
912
+ ).toEqual(["t1", "t2", "t3"])
913
+ expect(await ids({ op: "neq", propertyId: "assignee", value: alice })).toEqual([
914
+ "t4",
915
+ "t5",
916
+ "t6",
917
+ "t7",
918
+ ])
919
+ expect(await ids({ op: "in", propertyId: "assignee", values: [bob, null] })).toEqual([
920
+ "t4",
921
+ "t5",
922
+ "t6",
923
+ ])
924
+ expect(await ids({ op: "exists", propertyId: "assignee", value: false })).toEqual(["t7"])
925
+ expect(await ids({ op: "contains", propertyId: "reviewers", value: bob })).toEqual([
926
+ "t1",
927
+ "t2",
928
+ ])
929
+ expect(await ids({ op: "contains", propertyId: "reviewers", value: carol })).toEqual([
930
+ "t2",
931
+ "t5",
932
+ ])
933
+ expect(await ids({ op: "contains", propertyId: "reviewers", value: alice })).toEqual(["t4"])
934
+
935
+ const facets = await facetObjects(
936
+ {
937
+ projectId,
938
+ query: { kind: "start", objectTypeId: Task.id },
939
+ facets: [{ propertyId: "assignee", limit: 10 }],
940
+ },
941
+ { ontology: objectQueryContractOntology, storage }
942
+ )
943
+ expect(facets.plan.mode).toBe("pushdown")
944
+ expect(facets.facets).toEqual([
945
+ {
946
+ propertyId: "assignee",
947
+ buckets: [
948
+ { value: alice, count: 3 },
949
+ { value: bob, count: 2 },
950
+ { value: null, count: 1 },
951
+ ],
952
+ },
953
+ ])
954
+ })
955
+ })
956
+
838
957
  test("counts matching objects by facetable properties without returning rows", async () => {
839
958
  await withStorage(async ({ objects: storage, fixture }) => {
840
959
  await seedObjectQueryContractData(fixture)
@@ -1,3 +1,4 @@
1
+ import type { AuthorizablePrincipal } from "../execution/types"
1
2
  import { createEventId } from "../materialization/identity"
2
3
  import type {
3
4
  MaterializationPlanHeader,
@@ -29,6 +30,11 @@ const emptyChunk = {
29
30
  outbox: [],
30
31
  } as const
31
32
 
33
+ /** The request executor `ensureContractExecution` records for a contract commit. */
34
+ export function contractExecutor(id: string) {
35
+ return { type: "request" as const, requestId: `contract-request:${id}` }
36
+ }
37
+
32
38
  export function contractEditHeader(id: string): MaterializationPlanHeader {
33
39
  return {
34
40
  commit: {
@@ -38,6 +44,7 @@ export function contractEditHeader(id: string): MaterializationPlanHeader {
38
44
  requestHash: `hash:${id}`,
39
45
  executionId: `contract-execution:${id}`,
40
46
  origin: { kind: "runtime", requestId: id },
47
+ executor: contractExecutor(id),
41
48
  ontologyRevision: "ontology-contract-revision",
42
49
  intent: { kind: "edit", mode: "atomic", operationCount: 0 },
43
50
  committedAt: CONTRACT_COMMITTED_AT,
@@ -90,9 +97,15 @@ export async function commitExactObject(
90
97
  readonly primaryId?: string
91
98
  readonly omitFinalize?: boolean
92
99
  readonly throwAfterFinalize?: boolean
100
+ /** Must name an existing auth principal: SQL providers reference it from the execution. */
101
+ readonly requestedBy?: AuthorizablePrincipal
93
102
  } = {}
94
103
  ): Promise<{ readonly eventId: string }> {
95
- const header = contractEditHeader(id)
104
+ const defaultHeader = contractEditHeader(id)
105
+ const header: MaterializationPlanHeader =
106
+ options.requestedBy === undefined
107
+ ? defaultHeader
108
+ : { ...defaultHeader, commit: { ...defaultHeader.commit, requestedBy: options.requestedBy } }
96
109
  const ref = { objectTypeId: "ContractDevice", primaryId: options.primaryId ?? id }
97
110
  const row = {
98
111
  ref,
@@ -109,6 +122,8 @@ export async function commitExactObject(
109
122
  occurredAt: header.commit.committedAt,
110
123
  correlationId: `contract-correlation:${id}`,
111
124
  origin: header.commit.origin,
125
+ ...(header.commit.requestedBy === undefined ? {} : { requestedBy: header.commit.requestedBy }),
126
+ executor: header.commit.executor,
112
127
  commitId: id,
113
128
  type: "object.created" as const,
114
129
  topic: "objects" as const,
@@ -214,12 +229,17 @@ export async function ensureContractExecution(
214
229
  ) {
215
230
  return
216
231
  }
232
+ const { requestedBy } = header.commit
217
233
  await storage.executions.create({
218
234
  id: header.commit.executionId,
219
235
  projectId: header.commit.projectId,
220
- executor: { type: "request", requestId: `contract-request:${header.commit.id}` },
236
+ ...(requestedBy === undefined ? {} : { requestedBy }),
237
+ executor: contractExecutor(header.commit.id),
221
238
  source: { type: "http", requestId: `contract-request:${header.commit.id}` },
222
239
  correlationId: `contract-correlation:${header.commit.id}`,
223
- authorizationRef: { type: "disabled" },
240
+ authorizationRef:
241
+ requestedBy === undefined
242
+ ? { type: "disabled" }
243
+ : { type: "principal", principal: requestedBy },
224
244
  })
225
245
  }
@@ -16,6 +16,7 @@ import {
16
16
  commitExactObject,
17
17
  contractEditHeader,
18
18
  contractEditResult,
19
+ contractExecutor,
19
20
  ensureContractExecution,
20
21
  type OntologyContractStorage,
21
22
  } from "./ontology-contract-fixture"
@@ -148,6 +149,51 @@ export function runOntologyStorageContractSuite<TStorage extends OntologyStorage
148
149
  })
149
150
  })
150
151
 
152
+ test("round-trips commit and event attribution exactly", async () => {
153
+ await withStorage(async (storage) => {
154
+ // The requester is a real principal: SQL executions reference it by foreign key.
155
+ if (!storage.auth) throw new Error("The attribution contract requires auth storage.")
156
+ await storage.auth.users.create({
157
+ projectId: "contract-project",
158
+ id: "contract-requester",
159
+ email: "requester@example.com",
160
+ })
161
+ const requestedBy = { type: "user", id: "contract-requester" } as const
162
+ await commitExactObject(storage, "attributed", { requestedBy })
163
+ await commitExactObject(storage, "unattributed", { primaryId: "unattributed-device" })
164
+
165
+ const attributed = await storage.ontology.commits.getById({
166
+ projectId: "contract-project",
167
+ id: "attributed",
168
+ })
169
+ expect(attributed?.requestedBy).toEqual(requestedBy)
170
+ expect(attributed?.executor).toEqual(contractExecutor("attributed"))
171
+ expect(attributed).not.toHaveProperty("actor")
172
+ const unattributed = await storage.ontology.commits.getById({
173
+ projectId: "contract-project",
174
+ id: "unattributed",
175
+ })
176
+ expect(unattributed).not.toHaveProperty("requestedBy")
177
+ expect(unattributed?.executor).toEqual(contractExecutor("unattributed"))
178
+
179
+ const claimed = await storage.ontology.outbox.claim({
180
+ projectId: "contract-project",
181
+ now: "2027-01-01T00:00:00.000Z",
182
+ limit: 10,
183
+ leaseId: "attribution-check",
184
+ leaseExpiresAt: "2027-01-01T01:00:00.000Z",
185
+ })
186
+ const envelopes = new Map(claimed.map((record) => [record.envelope.commitId, record]))
187
+ expect(envelopes.get("attributed")?.envelope).toMatchObject({
188
+ requestedBy,
189
+ executor: contractExecutor("attributed"),
190
+ })
191
+ const unattributedEnvelope = envelopes.get("unattributed")?.envelope
192
+ expect(unattributedEnvelope?.executor).toEqual(contractExecutor("unattributed"))
193
+ expect(unattributedEnvelope).not.toHaveProperty("requestedBy")
194
+ })
195
+ })
196
+
151
197
  test("rejects an ontology commit whose execution does not exist", async () => {
152
198
  await withStorage(async (storage) => {
153
199
  const header = contractEditHeader("missing-execution")
@@ -883,6 +929,12 @@ async function activateEmptyCandidate(
883
929
  datasetId: candidate.identity.datasetVersion.datasetId,
884
930
  datasetVersionId: candidate.identity.datasetVersion.versionId,
885
931
  },
932
+ executor: {
933
+ type: "primitive",
934
+ kind: "projection",
935
+ id: candidate.source.projectionId,
936
+ runId: candidate.execution.projectionRunId,
937
+ },
886
938
  ontologyRevision: candidate.identity.ontologyRevision,
887
939
  projectionRevision: candidate.identity.projectionRevision,
888
940
  ownershipHash: candidate.identity.ownershipHash,
@@ -971,6 +1023,12 @@ function telemetryHeader(
971
1023
  batchOrdinal: 0,
972
1024
  },
973
1025
  },
1026
+ executor: {
1027
+ type: "primitive",
1028
+ kind: "projection",
1029
+ id: identity.projectionId,
1030
+ runId: projectionRunId,
1031
+ },
974
1032
  ontologyRevision: identity.ontologyRevision,
975
1033
  projectionRevision: identity.projectionRevision,
976
1034
  ownershipHash: identity.ownershipHash,
@@ -129,6 +129,33 @@ export function runSandboxesContractSuite(
129
129
  })
130
130
 
131
131
  describe("working directory", () => {
132
+ // Regression check: remove the provider's cwd resolution, leaving only
133
+ // `options.cwd ?? this.workingDirectory`; these relative file reads must fail.
134
+ test.each([
135
+ [".", "root"],
136
+ ["nested", "child"],
137
+ ["./nested/..", "root"],
138
+ ])("resolves relative cwd %s against the workspace", async (cwd, expected) => {
139
+ const sandbox = await factory.create()
140
+ try {
141
+ await sandbox.writeFiles([
142
+ { path: "cwd-probe.txt", contents: "root" },
143
+ { path: "nested/cwd-probe.txt", contents: "child" },
144
+ ])
145
+
146
+ const result = await sandbox.runCommand("cat", ["cwd-probe.txt"], { cwd })
147
+ expect(result.exitCode).toBe(0)
148
+ expect(result.stdout).toBe(expected)
149
+
150
+ // A per-call override must not change the next command's default directory.
151
+ const next = await sandbox.runCommand("cat", ["cwd-probe.txt"])
152
+ expect(next.exitCode).toBe(0)
153
+ expect(next.stdout).toBe("root")
154
+ } finally {
155
+ await sandbox.destroy()
156
+ }
157
+ })
158
+
132
159
  test("pwd reflects the configured workingDirectory", async () => {
133
160
  const sandbox = await factory.create()
134
161
  try {
@@ -0,0 +1,203 @@
1
+ import { describe, expect, test } from "bun:test"
2
+ import type { Principal } from "../auth"
3
+ import {
4
+ type CreateWorkflowInterventionInput,
5
+ WorkflowInterventionError,
6
+ type WorkflowInterventionStorage,
7
+ } from "../storage/workflow-interventions"
8
+
9
+ export interface WorkflowInterventionStorageContractSuiteOptions<
10
+ TStorage extends WorkflowInterventionStorage = WorkflowInterventionStorage,
11
+ > {
12
+ readonly createStorage: () => TStorage | Promise<TStorage>
13
+ readonly cleanup?: (storage: TStorage) => void | Promise<void>
14
+ }
15
+
16
+ const projectId = "workflow-intervention-contract"
17
+
18
+ /** Provider-neutral lifecycle, paging, and principal-attribution contract for interventions. */
19
+ export function runWorkflowInterventionStorageContractSuite<
20
+ TStorage extends WorkflowInterventionStorage,
21
+ >(label: string, options: WorkflowInterventionStorageContractSuiteOptions<TStorage>): void {
22
+ const withStorage = async (run: (storage: TStorage) => Promise<void>): Promise<void> => {
23
+ const storage = await options.createStorage()
24
+ try {
25
+ await run(storage)
26
+ } finally {
27
+ await options.cleanup?.(storage)
28
+ }
29
+ }
30
+
31
+ describe(label, () => {
32
+ test("creates pending interventions and supports filtered paging", async () => {
33
+ await withStorage(async (storage) => {
34
+ await storage.create(interventionInput({ id: "intervention-1", requestedAt: at("10:00") }))
35
+ await storage.create(
36
+ interventionInput({
37
+ id: "intervention-2",
38
+ workflowRunId: "run-2",
39
+ requestedAt: at("11:00"),
40
+ })
41
+ )
42
+ await storage.submit({ projectId, id: "intervention-2", response: { decision: "approve" } })
43
+ await storage.create(
44
+ interventionInput({
45
+ projectId: "other-project",
46
+ id: "other-project",
47
+ requestedAt: at("12:00"),
48
+ })
49
+ )
50
+
51
+ const stored = await storage.getById({ projectId, id: "intervention-1" })
52
+ const page = await storage.list({
53
+ projectId,
54
+ statuses: ["pending"],
55
+ workflowId: "review-workflow",
56
+ interventionId: "review-draft-document",
57
+ requestedAfter: at("09:00"),
58
+ order: "asc",
59
+ limit: 1,
60
+ })
61
+
62
+ expect(stored).toMatchObject({
63
+ id: "intervention-1",
64
+ status: "pending",
65
+ input: { draftId: "draft-1" },
66
+ defaultResponse: { decision: "approve" },
67
+ })
68
+ expect(stored?.requestedAt.toISOString()).toBe(at("10:00").toISOString())
69
+ expect(page.total).toBe(1)
70
+ expect(page.hasMore).toBe(false)
71
+ expect(page.interventions.map((intervention) => intervention.id)).toEqual([
72
+ "intervention-1",
73
+ ])
74
+ await expect(storage.list({ projectId, statuses: [] })).resolves.toEqual({
75
+ interventions: [],
76
+ hasMore: false,
77
+ total: 0,
78
+ })
79
+ })
80
+ })
81
+
82
+ test("submits, cancels, expires, and rejects invalid transitions", async () => {
83
+ await withStorage(async (storage) => {
84
+ await storage.create(interventionInput({ id: "submit-me" }))
85
+ const submitted = await storage.submit({
86
+ projectId,
87
+ id: "submit-me",
88
+ submittedAt: at("12:00"),
89
+ submittedBy: { type: "user", id: "usr_1" },
90
+ response: { decision: "approve", reviewerNote: "Looks good." },
91
+ })
92
+
93
+ await storage.create(interventionInput({ id: "cancel-me" }))
94
+ const cancelled = await storage.cancel({
95
+ projectId,
96
+ id: "cancel-me",
97
+ cancelledAt: at("12:30"),
98
+ cancelledBy: { type: "system", id: "workflow-timeout" },
99
+ })
100
+
101
+ await storage.create(interventionInput({ id: "expire-me" }))
102
+ const expired = await storage.expire({ projectId, id: "expire-me", expiredAt: at("13:00") })
103
+
104
+ expect(submitted).toMatchObject({
105
+ status: "submitted",
106
+ response: { decision: "approve", reviewerNote: "Looks good." },
107
+ submittedBy: { type: "user", id: "usr_1" },
108
+ })
109
+ expect(submitted.submittedAt?.toISOString()).toBe(at("12:00").toISOString())
110
+ expect(cancelled).toMatchObject({
111
+ status: "cancelled",
112
+ cancelledBy: { type: "system", id: "workflow-timeout" },
113
+ })
114
+ expect(cancelled.cancelledAt?.toISOString()).toBe(at("12:30").toISOString())
115
+ expect(expired.status).toBe("expired")
116
+ expect(expired.expiredAt?.toISOString()).toBe(at("13:00").toISOString())
117
+
118
+ await expect(storage.cancel({ projectId, id: "submit-me" })).rejects.toBeInstanceOf(
119
+ WorkflowInterventionError
120
+ )
121
+ await expect(
122
+ storage.submit({ projectId, id: "missing", response: {} })
123
+ ).rejects.toBeInstanceOf(WorkflowInterventionError)
124
+ await expect(storage.create(interventionInput({ id: "submit-me" }))).rejects.toBeInstanceOf(
125
+ WorkflowInterventionError
126
+ )
127
+ await expect(
128
+ storage.create(interventionInput({ id: "bad-index", nodeIndex: -1 }))
129
+ ).rejects.toBeInstanceOf(WorkflowInterventionError)
130
+ })
131
+ })
132
+
133
+ test("persists submitting and cancelling principals as { type, id }", async () => {
134
+ await withStorage(async (storage) => {
135
+ const principals: readonly Principal[] = [
136
+ { type: "user", id: "usr_1" },
137
+ { type: "serviceAccount", id: "sa_1" },
138
+ { type: "system", id: "system" },
139
+ ]
140
+ for (const [index, principal] of principals.entries()) {
141
+ await storage.create(
142
+ interventionInput({ id: `submit-${principal.type}`, requestedAt: at(`10:0${index}`) })
143
+ )
144
+ await storage.submit({
145
+ projectId,
146
+ id: `submit-${principal.type}`,
147
+ response: {},
148
+ submittedBy: principal,
149
+ })
150
+ await storage.create(interventionInput({ id: `cancel-${principal.type}` }))
151
+ await storage.cancel({
152
+ projectId,
153
+ id: `cancel-${principal.type}`,
154
+ cancelledBy: principal,
155
+ })
156
+ }
157
+ await storage.create(interventionInput({ id: "anonymous" }))
158
+ await storage.submit({ projectId, id: "anonymous", response: {} })
159
+
160
+ for (const principal of principals) {
161
+ const submitted = await storage.getById({ projectId, id: `submit-${principal.type}` })
162
+ const cancelled = await storage.getById({ projectId, id: `cancel-${principal.type}` })
163
+ expect(submitted?.submittedBy).toStrictEqual(principal)
164
+ expect(cancelled?.cancelledBy).toStrictEqual(principal)
165
+ }
166
+ const anonymous = await storage.getById({ projectId, id: "anonymous" })
167
+ expect(anonymous?.submittedBy).toBeUndefined()
168
+ expect(anonymous?.cancelledBy).toBeUndefined()
169
+
170
+ const listed = await storage.list({ projectId, statuses: ["submitted"], order: "asc" })
171
+ expect(
172
+ listed.interventions.flatMap((intervention) =>
173
+ intervention.submittedBy ? [intervention.submittedBy] : []
174
+ )
175
+ ).toStrictEqual([...principals])
176
+ })
177
+ })
178
+ })
179
+ }
180
+
181
+ function interventionInput(
182
+ overrides: Partial<CreateWorkflowInterventionInput> = {}
183
+ ): CreateWorkflowInterventionInput {
184
+ return {
185
+ id: "intervention-1",
186
+ projectId,
187
+ workflowId: "review-workflow",
188
+ workflowRunId: "run-1",
189
+ nodeRunId: "node-1",
190
+ nodeIndex: 0,
191
+ nodeId: "review-draft-document",
192
+ nodeKey: "reviewDraftDocument",
193
+ interventionId: "review-draft-document",
194
+ input: { draftId: "draft-1" },
195
+ defaultResponse: { decision: "approve" },
196
+ requestedAt: at("10:00"),
197
+ ...overrides,
198
+ }
199
+ }
200
+
201
+ function at(time: string): Date {
202
+ return new Date(`2026-05-08T${time}:00.000Z`)
203
+ }