@sixb/core 0.1.7 → 0.1.8

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 (612) hide show
  1. package/dist/actions/delegated-admission.d.ts +24 -0
  2. package/dist/actions/delegated-admission.d.ts.map +1 -0
  3. package/dist/actions/descriptor.d.ts +29 -0
  4. package/dist/actions/descriptor.d.ts.map +1 -0
  5. package/dist/actions/execution.d.ts +5 -5
  6. package/dist/actions/execution.d.ts.map +1 -1
  7. package/dist/actions/index.js +36 -30
  8. package/dist/actions/index.js.map +1 -1
  9. package/dist/actions/request.d.ts.map +1 -1
  10. package/dist/actions/run-authorization.d.ts +20 -0
  11. package/dist/actions/run-authorization.d.ts.map +1 -0
  12. package/dist/actions/run-dispatch.d.ts +3 -1
  13. package/dist/actions/run-dispatch.d.ts.map +1 -1
  14. package/dist/actions/worker.js +3 -3
  15. package/dist/actions/worker.js.map +1 -1
  16. package/dist/agents/adapters.d.ts +5 -122
  17. package/dist/agents/adapters.d.ts.map +1 -1
  18. package/dist/agents/authority.d.ts +1 -1
  19. package/dist/agents/authority.d.ts.map +1 -1
  20. package/dist/agents/context-resolution.d.ts.map +1 -1
  21. package/dist/agents/context.js +1 -1
  22. package/dist/agents/errors.d.ts +0 -9
  23. package/dist/agents/errors.d.ts.map +1 -1
  24. package/dist/agents/execution.d.ts.map +1 -1
  25. package/dist/agents/identity.d.ts +3 -0
  26. package/dist/agents/identity.d.ts.map +1 -0
  27. package/dist/agents/index.d.ts +3 -3
  28. package/dist/agents/index.d.ts.map +1 -1
  29. package/dist/agents/index.js +43 -43
  30. package/dist/agents/index.js.map +1 -1
  31. package/dist/agents/message.d.ts +4 -5
  32. package/dist/agents/message.d.ts.map +1 -1
  33. package/dist/agents/model-loop.d.ts +2 -0
  34. package/dist/agents/model-loop.d.ts.map +1 -1
  35. package/dist/agents/request.d.ts.map +1 -1
  36. package/dist/agents/tool-definition.d.ts +0 -1
  37. package/dist/agents/tool-definition.d.ts.map +1 -1
  38. package/dist/agents/validation.d.ts +0 -4
  39. package/dist/agents/validation.d.ts.map +1 -1
  40. package/dist/ai-usage/execution.d.ts.map +1 -1
  41. package/dist/auth/index.js +8 -5
  42. package/dist/auth/index.js.map +1 -1
  43. package/dist/authorization/decision.d.ts +10 -2
  44. package/dist/authorization/decision.d.ts.map +1 -1
  45. package/dist/authorization/grant-kinds.d.ts +2 -1
  46. package/dist/authorization/grant-kinds.d.ts.map +1 -1
  47. package/dist/authorization/index.d.ts +1 -1
  48. package/dist/authorization/index.d.ts.map +1 -1
  49. package/dist/authorization/index.js +7 -4
  50. package/dist/authorization/index.js.map +1 -1
  51. package/dist/bootstrap/discovery.d.ts +7 -1
  52. package/dist/bootstrap/discovery.d.ts.map +1 -1
  53. package/dist/bootstrap/index.js +46 -39
  54. package/dist/bootstrap/index.js.map +1 -1
  55. package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -1
  56. package/dist/chunk-19jp6g9d.js +131 -0
  57. package/dist/chunk-19jp6g9d.js.map +11 -0
  58. package/dist/{chunk-x0qhkqje.js → chunk-2dw777qw.js} +50 -5
  59. package/dist/{chunk-x0qhkqje.js.map → chunk-2dw777qw.js.map} +4 -3
  60. package/dist/chunk-359jm1jw.js +147 -0
  61. package/dist/chunk-359jm1jw.js.map +10 -0
  62. package/dist/{chunk-2b5qtban.js → chunk-3xep5cjx.js} +56 -21
  63. package/dist/chunk-3xep5cjx.js.map +15 -0
  64. package/dist/{chunk-qjycjdj6.js → chunk-3z1qec12.js} +6 -8
  65. package/dist/{chunk-qjycjdj6.js.map → chunk-3z1qec12.js.map} +2 -2
  66. package/dist/{chunk-5jcdmjam.js → chunk-4jjp5k14.js} +1 -1
  67. package/dist/{chunk-n2arzn6e.js → chunk-4qfkag59.js} +44 -221
  68. package/dist/chunk-4qfkag59.js.map +20 -0
  69. package/dist/{chunk-rre42skh.js → chunk-4sm0aznx.js} +515 -80
  70. package/dist/{chunk-rre42skh.js.map → chunk-4sm0aznx.js.map} +11 -7
  71. package/dist/chunk-4yqmp43v.js +159 -0
  72. package/dist/chunk-4yqmp43v.js.map +11 -0
  73. package/dist/{chunk-atmkaf60.js → chunk-5e3pq99w.js} +2 -6
  74. package/dist/{chunk-atmkaf60.js.map → chunk-5e3pq99w.js.map} +3 -3
  75. package/dist/{chunk-agsvg9ar.js → chunk-5ntny1qx.js} +1 -1
  76. package/dist/{chunk-z2sery1b.js → chunk-9nbmsvn5.js} +60 -20
  77. package/dist/chunk-9nbmsvn5.js.map +11 -0
  78. package/dist/{chunk-e4rvtvpw.js → chunk-aa2pen2v.js} +250 -78
  79. package/dist/chunk-aa2pen2v.js.map +34 -0
  80. package/dist/{chunk-64sr682n.js → chunk-ajnan18g.js} +11 -8
  81. package/dist/chunk-ajnan18g.js.map +12 -0
  82. package/dist/{chunk-9aehf39w.js → chunk-f26bck4t.js} +4 -4
  83. package/dist/{chunk-7ds9620f.js → chunk-fvt9rjsa.js} +23 -7
  84. package/dist/chunk-fvt9rjsa.js.map +10 -0
  85. package/dist/{chunk-kt81c11h.js → chunk-gbejpkex.js} +5 -5
  86. package/dist/{chunk-kt81c11h.js.map → chunk-gbejpkex.js.map} +1 -1
  87. package/dist/{chunk-vjjv9mrb.js → chunk-gzasd5b6.js} +5 -5
  88. package/dist/{chunk-vjjv9mrb.js.map → chunk-gzasd5b6.js.map} +3 -3
  89. package/dist/{chunk-d63tybny.js → chunk-h0k55pc7.js} +4 -4
  90. package/dist/{chunk-d63tybny.js.map → chunk-h0k55pc7.js.map} +1 -1
  91. package/dist/chunk-h5vqbfmd.js +1537 -0
  92. package/dist/chunk-h5vqbfmd.js.map +19 -0
  93. package/dist/{chunk-3kv70xwp.js → chunk-j1sbhm7p.js} +18 -2
  94. package/dist/chunk-j1sbhm7p.js.map +10 -0
  95. package/dist/{chunk-hdz94br2.js → chunk-k522z7v6.js} +10 -5
  96. package/dist/chunk-k522z7v6.js.map +10 -0
  97. package/dist/{chunk-wjgm6jjt.js → chunk-mth82m8t.js} +128 -94
  98. package/dist/chunk-mth82m8t.js.map +14 -0
  99. package/dist/{chunk-qv38twt8.js → chunk-mwsxn98e.js} +46 -25
  100. package/dist/{chunk-qv38twt8.js.map → chunk-mwsxn98e.js.map} +6 -6
  101. package/dist/chunk-n4khvw9n.js +111 -0
  102. package/dist/chunk-n4khvw9n.js.map +11 -0
  103. package/dist/{chunk-qjzp9xyb.js → chunk-nn0tekr1.js} +6 -8
  104. package/dist/chunk-nn0tekr1.js.map +12 -0
  105. package/dist/chunk-nx7k8tpr.js +436 -0
  106. package/dist/chunk-nx7k8tpr.js.map +12 -0
  107. package/dist/{chunk-08twe8m6.js → chunk-p1rzczbt.js} +1 -1
  108. package/dist/{chunk-37wk412q.js → chunk-p1x242ad.js} +587 -70
  109. package/dist/chunk-p1x242ad.js.map +25 -0
  110. package/dist/{chunk-tn7xcs2n.js → chunk-pc7ys28c.js} +68 -5
  111. package/dist/chunk-pc7ys28c.js.map +14 -0
  112. package/dist/{chunk-3fqt22c4.js → chunk-q0k9nc5a.js} +280 -88
  113. package/dist/chunk-q0k9nc5a.js.map +14 -0
  114. package/dist/chunk-r8jrnexe.js +403 -0
  115. package/dist/chunk-r8jrnexe.js.map +10 -0
  116. package/dist/{chunk-gbrpsx4m.js → chunk-rafagrwr.js} +30 -2
  117. package/dist/chunk-rafagrwr.js.map +11 -0
  118. package/dist/{chunk-xdpwpkha.js → chunk-rv2hkwwa.js} +1 -1
  119. package/dist/{chunk-6ed5bwnd.js → chunk-sbzzr4kx.js} +1203 -691
  120. package/dist/{chunk-6ed5bwnd.js.map → chunk-sbzzr4kx.js.map} +15 -9
  121. package/dist/{chunk-d2ndstdf.js → chunk-v1xppd0y.js} +13 -11
  122. package/dist/{chunk-d2ndstdf.js.map → chunk-v1xppd0y.js.map} +2 -2
  123. package/dist/chunk-v4en4jc2.js +252 -0
  124. package/dist/chunk-v4en4jc2.js.map +10 -0
  125. package/dist/{chunk-1kamz6j0.js → chunk-w1tvjszy.js} +1 -1
  126. package/dist/{chunk-rp1mvzb4.js → chunk-w9tg6yyb.js} +11 -6
  127. package/dist/{chunk-rp1mvzb4.js.map → chunk-w9tg6yyb.js.map} +3 -3
  128. package/dist/{chunk-4nxeacx7.js → chunk-wdage1eb.js} +1 -1
  129. package/dist/{chunk-ha58tjtt.js → chunk-wtf06et8.js} +9 -5
  130. package/dist/{chunk-ha58tjtt.js.map → chunk-wtf06et8.js.map} +3 -3
  131. package/dist/{chunk-h0knpbz5.js → chunk-xajtptbw.js} +782 -211
  132. package/dist/chunk-xajtptbw.js.map +40 -0
  133. package/dist/{chunk-xc7hq65b.js → chunk-yp8ee62z.js} +49 -2
  134. package/dist/chunk-yp8ee62z.js.map +11 -0
  135. package/dist/chunk-z4ccwbkz.js +139 -0
  136. package/dist/chunk-z4ccwbkz.js.map +10 -0
  137. package/dist/datasets/builders.d.ts +11 -2
  138. package/dist/datasets/builders.d.ts.map +1 -1
  139. package/dist/datasets/changes.d.ts +14 -4
  140. package/dist/datasets/changes.d.ts.map +1 -1
  141. package/dist/datasets/execution.d.ts +15 -1
  142. package/dist/datasets/execution.d.ts.map +1 -1
  143. package/dist/datasets/index.d.ts +1 -0
  144. package/dist/datasets/index.d.ts.map +1 -1
  145. package/dist/datasets/sequence.d.ts +7 -0
  146. package/dist/datasets/sequence.d.ts.map +1 -0
  147. package/dist/datasets/types.d.ts +1 -0
  148. package/dist/datasets/types.d.ts.map +1 -1
  149. package/dist/datasets/validation.d.ts.map +1 -1
  150. package/dist/datasets/write.d.ts +37 -0
  151. package/dist/datasets/write.d.ts.map +1 -0
  152. package/dist/datasets/write.js +17 -0
  153. package/dist/datasets/write.js.map +9 -0
  154. package/dist/events/execution.d.ts.map +1 -1
  155. package/dist/events/types/datasets.d.ts +2 -6
  156. package/dist/events/types/datasets.d.ts.map +1 -1
  157. package/dist/execution/agent.d.ts.map +1 -1
  158. package/dist/execution/agent.js +39 -32
  159. package/dist/execution/agent.js.map +1 -1
  160. package/dist/execution/authorization.d.ts +58 -20
  161. package/dist/execution/authorization.d.ts.map +1 -1
  162. package/dist/execution/authorized-object-reader.d.ts +69 -0
  163. package/dist/execution/authorized-object-reader.d.ts.map +1 -0
  164. package/dist/execution/durable.d.ts.map +1 -1
  165. package/dist/execution/index.d.ts +1 -1
  166. package/dist/execution/index.d.ts.map +1 -1
  167. package/dist/execution/primitive.js +39 -32
  168. package/dist/execution/primitive.js.map +2 -2
  169. package/dist/execution/request.d.ts +11 -0
  170. package/dist/execution/request.d.ts.map +1 -1
  171. package/dist/execution/request.js +76 -40
  172. package/dist/execution/request.js.map +3 -3
  173. package/dist/execution/scopes.d.ts +16 -0
  174. package/dist/execution/scopes.d.ts.map +1 -1
  175. package/dist/execution/types.d.ts +9 -0
  176. package/dist/execution/types.d.ts.map +1 -1
  177. package/dist/http/api-routes.d.ts +2 -0
  178. package/dist/http/api-routes.d.ts.map +1 -1
  179. package/dist/http/index.js +1 -1
  180. package/dist/index.d.ts +8 -5
  181. package/dist/index.d.ts.map +1 -1
  182. package/dist/index.js +92 -78
  183. package/dist/index.js.map +1 -1
  184. package/dist/lake-storage/definition-updates.d.ts.map +1 -1
  185. package/dist/lake-storage/errors.d.ts +5 -1
  186. package/dist/lake-storage/errors.d.ts.map +1 -1
  187. package/dist/lake-storage/in-memory.d.ts +1 -0
  188. package/dist/lake-storage/in-memory.d.ts.map +1 -1
  189. package/dist/lake-storage/index.d.ts +6 -1
  190. package/dist/lake-storage/index.d.ts.map +1 -1
  191. package/dist/lake-storage/index.js +24 -7
  192. package/dist/lake-storage/index.js.map +1 -1
  193. package/dist/lake-storage/merge-validation.d.ts.map +1 -1
  194. package/dist/lake-storage/merge.d.ts +13 -2
  195. package/dist/lake-storage/merge.d.ts.map +1 -1
  196. package/dist/lake-storage/source-ordering.d.ts +19 -0
  197. package/dist/lake-storage/source-ordering.d.ts.map +1 -0
  198. package/dist/lake-storage/sql-transforms.d.ts +2 -1
  199. package/dist/lake-storage/sql-transforms.d.ts.map +1 -1
  200. package/dist/lake-storage/types.d.ts +10 -5
  201. package/dist/lake-storage/types.d.ts.map +1 -1
  202. package/dist/lake-storage/version-inputs.d.ts +4 -0
  203. package/dist/lake-storage/version-inputs.d.ts.map +1 -0
  204. package/dist/materializer/index.js +25 -22
  205. package/dist/materializer/index.js.map +1 -1
  206. package/dist/objects/authorized-ontology-view.d.ts +25 -0
  207. package/dist/objects/authorized-ontology-view.d.ts.map +1 -0
  208. package/dist/objects/execution.d.ts +1 -1
  209. package/dist/objects/execution.d.ts.map +1 -1
  210. package/dist/objects/index.js +29 -26
  211. package/dist/objects/index.js.map +1 -1
  212. package/dist/objects/link/authorization.d.ts +2 -7
  213. package/dist/objects/link/authorization.d.ts.map +1 -1
  214. package/dist/objects/query/executor.d.ts +4 -2
  215. package/dist/objects/query/executor.d.ts.map +1 -1
  216. package/dist/objects/query/index.js +24 -21
  217. package/dist/objects/query/index.js.map +1 -1
  218. package/dist/objects/query/links.d.ts +22 -1
  219. package/dist/objects/query/links.d.ts.map +1 -1
  220. package/dist/objects/query/selected-read-admission.d.ts +27 -0
  221. package/dist/objects/query/selected-read-admission.d.ts.map +1 -0
  222. package/dist/objects/query/validate.d.ts +60 -2
  223. package/dist/objects/query/validate.d.ts.map +1 -1
  224. package/dist/objects/sdk/object-handle.d.ts.map +1 -1
  225. package/dist/objects/sdk/object-set.d.ts.map +1 -1
  226. package/dist/objects/sdk/runtime-query-executor.d.ts +2 -7
  227. package/dist/objects/sdk/runtime-query-executor.d.ts.map +1 -1
  228. package/dist/objects/sdk/telemetry-channel.d.ts.map +1 -1
  229. package/dist/objects/service/list-service.d.ts +2 -3
  230. package/dist/objects/service/list-service.d.ts.map +1 -1
  231. package/dist/objects/telemetry/history.d.ts +8 -6
  232. package/dist/objects/telemetry/history.d.ts.map +1 -1
  233. package/dist/objects/telemetry/index.d.ts +2 -2
  234. package/dist/objects/telemetry/index.d.ts.map +1 -1
  235. package/dist/objects/telemetry/workload.d.ts +11 -0
  236. package/dist/objects/telemetry/workload.d.ts.map +1 -0
  237. package/dist/ontology/index.d.ts +2 -1
  238. package/dist/ontology/index.d.ts.map +1 -1
  239. package/dist/ontology/index.js +13 -12
  240. package/dist/ontology/index.js.map +1 -1
  241. package/dist/ontology/inference/index.d.ts +2 -1
  242. package/dist/ontology/inference/index.d.ts.map +1 -1
  243. package/dist/ontology/internal.d.ts +0 -1
  244. package/dist/ontology/internal.d.ts.map +1 -1
  245. package/dist/ontology/internal.js +5 -10
  246. package/dist/ontology/internal.js.map +3 -3
  247. package/dist/ontology/json-schema.d.ts +10 -6
  248. package/dist/ontology/json-schema.d.ts.map +1 -1
  249. package/dist/ontology/link-path-selection.d.ts +35 -0
  250. package/dist/ontology/link-path-selection.d.ts.map +1 -0
  251. package/dist/ontology/refs.d.ts +2 -0
  252. package/dist/ontology/refs.d.ts.map +1 -1
  253. package/dist/ontology/tokens.d.ts +2 -1
  254. package/dist/ontology/tokens.d.ts.map +1 -1
  255. package/dist/pipelines/execution.d.ts.map +1 -1
  256. package/dist/pipelines/index.js +27 -24
  257. package/dist/pipelines/index.js.map +1 -1
  258. package/dist/pipelines/request.d.ts.map +1 -1
  259. package/dist/projections/execution.d.ts.map +1 -1
  260. package/dist/projections/internal.js +25 -22
  261. package/dist/projections/internal.js.map +1 -1
  262. package/dist/projections/run-dispatch.d.ts.map +1 -1
  263. package/dist/rules/execution.d.ts.map +1 -1
  264. package/dist/runtime/create.d.ts +4 -1
  265. package/dist/runtime/create.d.ts.map +1 -1
  266. package/dist/runtime/definitions.d.ts +2 -0
  267. package/dist/runtime/definitions.d.ts.map +1 -1
  268. package/dist/runtime/host.d.ts +2 -0
  269. package/dist/runtime/host.d.ts.map +1 -1
  270. package/dist/runtime/internal.d.ts +1 -0
  271. package/dist/runtime/internal.d.ts.map +1 -1
  272. package/dist/runtime/resolve-definitions.d.ts +2 -0
  273. package/dist/runtime/resolve-definitions.d.ts.map +1 -1
  274. package/dist/runtime/sixb.d.ts +4 -0
  275. package/dist/runtime/sixb.d.ts.map +1 -1
  276. package/dist/runtime/types.d.ts +3 -0
  277. package/dist/runtime/types.d.ts.map +1 -1
  278. package/dist/schedules/execution.d.ts +2 -1
  279. package/dist/schedules/execution.d.ts.map +1 -1
  280. package/dist/security/every.d.ts +4 -1
  281. package/dist/security/every.d.ts.map +1 -1
  282. package/dist/security/grants.d.ts +7 -2
  283. package/dist/security/grants.d.ts.map +1 -1
  284. package/dist/security/index.d.ts +1 -1
  285. package/dist/security/index.d.ts.map +1 -1
  286. package/dist/security/registry.d.ts +1 -0
  287. package/dist/security/registry.d.ts.map +1 -1
  288. package/dist/security/types.d.ts +7 -1
  289. package/dist/security/types.d.ts.map +1 -1
  290. package/dist/security/validation.d.ts +2 -0
  291. package/dist/security/validation.d.ts.map +1 -1
  292. package/dist/shares/access-plan.d.ts +22 -0
  293. package/dist/shares/access-plan.d.ts.map +1 -0
  294. package/dist/shares/builders.d.ts +14 -0
  295. package/dist/shares/builders.d.ts.map +1 -0
  296. package/dist/shares/compiler.d.ts +14 -0
  297. package/dist/shares/compiler.d.ts.map +1 -0
  298. package/dist/shares/errors.d.ts +4 -0
  299. package/dist/shares/errors.d.ts.map +1 -0
  300. package/dist/shares/execution.d.ts +57 -0
  301. package/dist/shares/execution.d.ts.map +1 -0
  302. package/dist/shares/index.d.ts +10 -0
  303. package/dist/shares/index.d.ts.map +1 -0
  304. package/dist/shares/internal.d.ts +3 -0
  305. package/dist/shares/internal.d.ts.map +1 -0
  306. package/dist/shares/internal.js +239 -0
  307. package/dist/shares/internal.js.map +10 -0
  308. package/dist/shares/intersection.d.ts +9 -0
  309. package/dist/shares/intersection.d.ts.map +1 -0
  310. package/dist/shares/session-protocol.d.ts +41 -0
  311. package/dist/shares/session-protocol.d.ts.map +1 -0
  312. package/dist/shares/types.d.ts +51 -0
  313. package/dist/shares/types.d.ts.map +1 -0
  314. package/dist/shares/validation.d.ts +11 -0
  315. package/dist/shares/validation.d.ts.map +1 -0
  316. package/dist/storage/action-runs/provider.js +2 -2
  317. package/dist/storage/agents/provider.js +2 -2
  318. package/dist/storage/executions/in-memory.d.ts +3 -0
  319. package/dist/storage/executions/in-memory.d.ts.map +1 -1
  320. package/dist/storage/executions/provider.d.ts +4 -1
  321. package/dist/storage/executions/provider.d.ts.map +1 -1
  322. package/dist/storage/executions/provider.js +23 -3
  323. package/dist/storage/executions/provider.js.map +3 -3
  324. package/dist/storage/executions/run-link.d.ts +7 -0
  325. package/dist/storage/executions/run-link.d.ts.map +1 -1
  326. package/dist/storage/executions/validation.d.ts +6 -0
  327. package/dist/storage/executions/validation.d.ts.map +1 -1
  328. package/dist/storage/in-memory/index.d.ts +8 -0
  329. package/dist/storage/in-memory/index.d.ts.map +1 -1
  330. package/dist/storage/index.d.ts +8 -2
  331. package/dist/storage/index.d.ts.map +1 -1
  332. package/dist/storage/index.js +65 -36
  333. package/dist/storage/index.js.map +1 -1
  334. package/dist/storage/objects/execution-limits.d.ts +25 -0
  335. package/dist/storage/objects/execution-limits.d.ts.map +1 -0
  336. package/dist/storage/objects/guard.d.ts +16 -0
  337. package/dist/storage/objects/guard.d.ts.map +1 -0
  338. package/dist/storage/objects/in-memory/index.d.ts +3 -0
  339. package/dist/storage/objects/in-memory/index.d.ts.map +1 -0
  340. package/dist/storage/objects/in-memory/keys.d.ts +10 -0
  341. package/dist/storage/objects/in-memory/keys.d.ts.map +1 -0
  342. package/dist/storage/objects/in-memory/query.d.ts +31 -0
  343. package/dist/storage/objects/in-memory/query.d.ts.map +1 -0
  344. package/dist/storage/objects/in-memory/read-scope.d.ts +18 -0
  345. package/dist/storage/objects/in-memory/read-scope.d.ts.map +1 -0
  346. package/dist/storage/objects/in-memory/read-source.d.ts +10 -0
  347. package/dist/storage/objects/in-memory/read-source.d.ts.map +1 -0
  348. package/dist/storage/objects/in-memory/selected-reader.d.ts +9 -0
  349. package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -0
  350. package/dist/storage/objects/{in-memory.d.ts → in-memory/storage.d.ts} +13 -10
  351. package/dist/storage/objects/in-memory/storage.d.ts.map +1 -0
  352. package/dist/storage/objects/index.d.ts +4 -1
  353. package/dist/storage/objects/index.d.ts.map +1 -1
  354. package/dist/storage/objects/keys.d.ts +1 -1
  355. package/dist/storage/objects/keys.d.ts.map +1 -1
  356. package/dist/storage/objects/read-scope.d.ts +25 -0
  357. package/dist/storage/objects/read-scope.d.ts.map +1 -0
  358. package/dist/storage/objects/types.d.ts +114 -22
  359. package/dist/storage/objects/types.d.ts.map +1 -1
  360. package/dist/storage/operation-scope.d.ts +3 -0
  361. package/dist/storage/operation-scope.d.ts.map +1 -1
  362. package/dist/storage/operation-scope.js +4 -2
  363. package/dist/storage/operation-scope.js.map +1 -1
  364. package/dist/storage/pipeline-runs/provider.js +2 -2
  365. package/dist/storage/projection-runs/provider.js +2 -2
  366. package/dist/storage/share-grants/errors.d.ts +8 -0
  367. package/dist/storage/share-grants/errors.d.ts.map +1 -0
  368. package/dist/storage/share-grants/in-memory.d.ts +11 -0
  369. package/dist/storage/share-grants/in-memory.d.ts.map +1 -0
  370. package/dist/storage/share-grants/index.d.ts +5 -0
  371. package/dist/storage/share-grants/index.d.ts.map +1 -0
  372. package/dist/storage/share-grants/provider.d.ts +4 -0
  373. package/dist/storage/share-grants/provider.d.ts.map +1 -0
  374. package/dist/storage/share-grants/provider.js +24 -0
  375. package/dist/storage/share-grants/provider.js.map +9 -0
  376. package/dist/storage/share-grants/record.d.ts +11 -0
  377. package/dist/storage/share-grants/record.d.ts.map +1 -0
  378. package/dist/storage/share-grants/types.d.ts +97 -0
  379. package/dist/storage/share-grants/types.d.ts.map +1 -0
  380. package/dist/storage/share-sessions/errors.d.ts +8 -0
  381. package/dist/storage/share-sessions/errors.d.ts.map +1 -0
  382. package/dist/storage/share-sessions/in-memory.d.ts +14 -0
  383. package/dist/storage/share-sessions/in-memory.d.ts.map +1 -0
  384. package/dist/storage/share-sessions/index.d.ts +5 -0
  385. package/dist/storage/share-sessions/index.d.ts.map +1 -0
  386. package/dist/storage/share-sessions/provider.d.ts +3 -0
  387. package/dist/storage/share-sessions/provider.d.ts.map +1 -0
  388. package/dist/storage/share-sessions/provider.js +20 -0
  389. package/dist/storage/share-sessions/provider.js.map +9 -0
  390. package/dist/storage/share-sessions/record.d.ts +8 -0
  391. package/dist/storage/share-sessions/record.d.ts.map +1 -0
  392. package/dist/storage/share-sessions/types.d.ts +50 -0
  393. package/dist/storage/share-sessions/types.d.ts.map +1 -0
  394. package/dist/storage/sync-runs/provider.js +2 -2
  395. package/dist/storage/transaction.d.ts +2 -1
  396. package/dist/storage/transaction.d.ts.map +1 -1
  397. package/dist/storage/types.d.ts +8 -0
  398. package/dist/storage/types.d.ts.map +1 -1
  399. package/dist/storage/webhook-runs/provider.js +2 -2
  400. package/dist/storage/workflow-runs/provider.js +10 -7
  401. package/dist/storage/workflow-runs/provider.js.map +1 -1
  402. package/dist/syncs/execution.d.ts.map +1 -1
  403. package/dist/syncs/index.js +27 -24
  404. package/dist/syncs/index.js.map +1 -1
  405. package/dist/syncs/request.d.ts.map +1 -1
  406. package/dist/testing/dataset-sequence-contract.d.ts +4 -0
  407. package/dist/testing/dataset-sequence-contract.d.ts.map +1 -0
  408. package/dist/testing/effective-storage-contract.d.ts.map +1 -1
  409. package/dist/testing/execution-storage-contract.d.ts +4 -0
  410. package/dist/testing/execution-storage-contract.d.ts.map +1 -1
  411. package/dist/testing/index.d.ts +3 -0
  412. package/dist/testing/index.d.ts.map +1 -1
  413. package/dist/testing/index.js +2555 -908
  414. package/dist/testing/index.js.map +11 -7
  415. package/dist/testing/lake-merge-storage-contract.d.ts +1 -0
  416. package/dist/testing/lake-merge-storage-contract.d.ts.map +1 -1
  417. package/dist/testing/lake-storage-contract.d.ts.map +1 -1
  418. package/dist/testing/object-read-scope-contract.d.ts +22 -0
  419. package/dist/testing/object-read-scope-contract.d.ts.map +1 -0
  420. package/dist/testing/share-grant-storage-contract.d.ts +10 -0
  421. package/dist/testing/share-grant-storage-contract.d.ts.map +1 -0
  422. package/dist/testing/share-session-storage-contract.d.ts +9 -0
  423. package/dist/testing/share-session-storage-contract.d.ts.map +1 -0
  424. package/dist/webhooks/internal.js +24 -21
  425. package/dist/webhooks/internal.js.map +2 -2
  426. package/dist/workflows/execution.d.ts.map +1 -1
  427. package/dist/workflows/index.js +42 -35
  428. package/dist/workflows/index.js.map +1 -1
  429. package/dist/workflows/request.d.ts.map +1 -1
  430. package/package.json +25 -1
  431. package/src/actions/delegated-admission.ts +72 -0
  432. package/src/actions/descriptor.ts +58 -0
  433. package/src/actions/execution.ts +99 -24
  434. package/src/actions/request.ts +136 -19
  435. package/src/actions/run-authorization.ts +53 -0
  436. package/src/actions/run-dispatch.ts +8 -1
  437. package/src/agents/adapters.ts +30 -420
  438. package/src/agents/authority.ts +3 -4
  439. package/src/agents/context-resolution.ts +1 -4
  440. package/src/agents/errors.ts +0 -10
  441. package/src/agents/execution.ts +13 -5
  442. package/src/agents/identity.ts +4 -0
  443. package/src/agents/index.ts +1 -20
  444. package/src/agents/message.ts +4 -5
  445. package/src/agents/model-loop.ts +54 -6
  446. package/src/agents/request.ts +16 -3
  447. package/src/agents/tool-definition.ts +0 -19
  448. package/src/agents/validation.ts +6 -65
  449. package/src/ai-usage/execution.ts +4 -11
  450. package/src/authorization/decision.ts +29 -14
  451. package/src/authorization/grant-kinds.ts +10 -0
  452. package/src/authorization/index.ts +1 -0
  453. package/src/bootstrap/discovery.ts +3 -0
  454. package/src/bootstrap/ontology-type-manifest.ts +12 -6
  455. package/src/datasets/builders.ts +23 -2
  456. package/src/datasets/changes.ts +16 -4
  457. package/src/datasets/execution.ts +76 -5
  458. package/src/datasets/index.ts +1 -0
  459. package/src/datasets/sequence.ts +77 -0
  460. package/src/datasets/types.ts +1 -0
  461. package/src/datasets/validation.ts +26 -0
  462. package/src/datasets/write.ts +240 -0
  463. package/src/events/execution.ts +57 -7
  464. package/src/events/types/datasets.ts +2 -6
  465. package/src/execution/agent.ts +1 -4
  466. package/src/execution/authorization.ts +470 -90
  467. package/src/execution/authorized-object-reader.ts +695 -0
  468. package/src/execution/durable.ts +10 -2
  469. package/src/execution/index.ts +1 -0
  470. package/src/execution/request.ts +63 -13
  471. package/src/execution/scopes.ts +36 -6
  472. package/src/execution/types.ts +8 -0
  473. package/src/http/api-routes.ts +45 -0
  474. package/src/index.ts +36 -15
  475. package/src/lake-storage/definition-updates.ts +9 -0
  476. package/src/lake-storage/errors.ts +6 -1
  477. package/src/lake-storage/in-memory.ts +53 -17
  478. package/src/lake-storage/index.ts +10 -1
  479. package/src/lake-storage/merge-validation.ts +12 -2
  480. package/src/lake-storage/merge.ts +40 -2
  481. package/src/lake-storage/source-ordering.ts +95 -0
  482. package/src/lake-storage/sql-transforms.ts +2 -1
  483. package/src/lake-storage/types.ts +10 -5
  484. package/src/lake-storage/version-inputs.ts +14 -0
  485. package/src/objects/authorized-ontology-view.ts +512 -0
  486. package/src/objects/execution.ts +98 -143
  487. package/src/objects/link/authorization.ts +3 -2
  488. package/src/objects/query/executor.ts +45 -34
  489. package/src/objects/query/links.ts +84 -25
  490. package/src/objects/query/selected-read-admission.ts +310 -0
  491. package/src/objects/query/validate.ts +353 -36
  492. package/src/objects/sdk/object-handle.ts +2 -8
  493. package/src/objects/sdk/object-set.ts +10 -11
  494. package/src/objects/sdk/runtime-query-executor.ts +8 -28
  495. package/src/objects/sdk/telemetry-channel.ts +11 -7
  496. package/src/objects/service/list-service.ts +15 -29
  497. package/src/objects/telemetry/history.ts +297 -17
  498. package/src/objects/telemetry/index.ts +2 -2
  499. package/src/objects/telemetry/workload.ts +79 -0
  500. package/src/ontology/index.ts +7 -1
  501. package/src/ontology/inference/index.ts +4 -1
  502. package/src/ontology/internal.ts +0 -1
  503. package/src/ontology/json-schema.ts +13 -12
  504. package/src/ontology/link-path-selection.ts +193 -0
  505. package/src/ontology/refs.ts +19 -0
  506. package/src/ontology/tokens.ts +15 -8
  507. package/src/pipelines/execution.ts +30 -7
  508. package/src/pipelines/request.ts +5 -0
  509. package/src/projections/execution.ts +72 -11
  510. package/src/projections/run-dispatch.ts +6 -12
  511. package/src/rules/execution.ts +20 -8
  512. package/src/runtime/create.ts +5 -1
  513. package/src/runtime/definitions.ts +2 -0
  514. package/src/runtime/host.ts +25 -6
  515. package/src/runtime/internal.ts +1 -0
  516. package/src/runtime/resolve-definitions.ts +9 -0
  517. package/src/runtime/sixb.ts +23 -2
  518. package/src/runtime/types.ts +3 -0
  519. package/src/schedules/execution.ts +24 -2
  520. package/src/security/every.ts +4 -0
  521. package/src/security/grants.ts +45 -3
  522. package/src/security/index.ts +1 -0
  523. package/src/security/registry.ts +3 -0
  524. package/src/security/types.ts +8 -0
  525. package/src/security/validation.ts +3 -0
  526. package/src/shares/access-plan.ts +225 -0
  527. package/src/shares/builders.ts +381 -0
  528. package/src/shares/compiler.ts +359 -0
  529. package/src/shares/errors.ts +3 -0
  530. package/src/shares/execution.ts +394 -0
  531. package/src/shares/index.ts +28 -0
  532. package/src/shares/internal.ts +9 -0
  533. package/src/shares/intersection.ts +178 -0
  534. package/src/shares/session-protocol.ts +258 -0
  535. package/src/shares/types.ts +76 -0
  536. package/src/shares/validation.ts +40 -0
  537. package/src/storage/executions/in-memory.ts +9 -1
  538. package/src/storage/executions/provider.ts +30 -1
  539. package/src/storage/executions/run-link.ts +29 -0
  540. package/src/storage/executions/validation.ts +46 -1
  541. package/src/storage/in-memory/index.ts +21 -2
  542. package/src/storage/index.ts +51 -0
  543. package/src/storage/objects/execution-limits.ts +283 -0
  544. package/src/storage/objects/guard.ts +55 -0
  545. package/src/storage/objects/in-memory/index.ts +2 -0
  546. package/src/storage/objects/in-memory/keys.ts +46 -0
  547. package/src/storage/objects/in-memory/query.ts +754 -0
  548. package/src/storage/objects/in-memory/read-scope.ts +211 -0
  549. package/src/storage/objects/in-memory/read-source.ts +10 -0
  550. package/src/storage/objects/in-memory/selected-reader.ts +252 -0
  551. package/src/storage/objects/in-memory/storage.ts +589 -0
  552. package/src/storage/objects/index.ts +21 -0
  553. package/src/storage/objects/keys.ts +1 -1
  554. package/src/storage/objects/read-scope.ts +672 -0
  555. package/src/storage/objects/types.ts +123 -19
  556. package/src/storage/operation-scope.ts +16 -0
  557. package/src/storage/share-grants/errors.ts +14 -0
  558. package/src/storage/share-grants/in-memory.ts +107 -0
  559. package/src/storage/share-grants/index.ts +14 -0
  560. package/src/storage/share-grants/provider.ts +11 -0
  561. package/src/storage/share-grants/record.ts +347 -0
  562. package/src/storage/share-grants/types.ts +112 -0
  563. package/src/storage/share-sessions/errors.ts +14 -0
  564. package/src/storage/share-sessions/in-memory.ts +105 -0
  565. package/src/storage/share-sessions/index.ts +11 -0
  566. package/src/storage/share-sessions/provider.ts +9 -0
  567. package/src/storage/share-sessions/record.ts +176 -0
  568. package/src/storage/share-sessions/types.ts +57 -0
  569. package/src/storage/transaction.ts +14 -2
  570. package/src/storage/types.ts +27 -0
  571. package/src/syncs/execution.ts +25 -5
  572. package/src/syncs/request.ts +5 -0
  573. package/src/testing/dataset-sequence-contract.ts +373 -0
  574. package/src/testing/effective-storage-contract.ts +34 -0
  575. package/src/testing/execution-storage-contract.ts +79 -0
  576. package/src/testing/index.ts +16 -0
  577. package/src/testing/lake-merge-storage-contract.ts +3 -0
  578. package/src/testing/lake-storage-contract.ts +58 -0
  579. package/src/testing/object-read-scope-contract.ts +939 -0
  580. package/src/testing/share-grant-storage-contract.ts +325 -0
  581. package/src/testing/share-session-storage-contract.ts +235 -0
  582. package/src/workflows/execution.ts +53 -14
  583. package/src/workflows/request.ts +5 -0
  584. package/dist/chunk-2b5qtban.js.map +0 -14
  585. package/dist/chunk-37wk412q.js.map +0 -23
  586. package/dist/chunk-3fqt22c4.js.map +0 -14
  587. package/dist/chunk-3kv70xwp.js.map +0 -10
  588. package/dist/chunk-64sr682n.js.map +0 -12
  589. package/dist/chunk-7ds9620f.js.map +0 -10
  590. package/dist/chunk-dqn23610.js +0 -72
  591. package/dist/chunk-dqn23610.js.map +0 -11
  592. package/dist/chunk-e4rvtvpw.js.map +0 -34
  593. package/dist/chunk-gbrpsx4m.js.map +0 -11
  594. package/dist/chunk-h0knpbz5.js.map +0 -38
  595. package/dist/chunk-hdz94br2.js.map +0 -10
  596. package/dist/chunk-n2arzn6e.js.map +0 -20
  597. package/dist/chunk-qjzp9xyb.js.map +0 -12
  598. package/dist/chunk-tn7xcs2n.js.map +0 -13
  599. package/dist/chunk-wjgm6jjt.js.map +0 -13
  600. package/dist/chunk-xc7hq65b.js.map +0 -10
  601. package/dist/chunk-y35ma3mj.js +0 -551
  602. package/dist/chunk-y35ma3mj.js.map +0 -15
  603. package/dist/chunk-z2sery1b.js.map +0 -11
  604. package/dist/storage/objects/in-memory.d.ts.map +0 -1
  605. package/src/storage/objects/in-memory.ts +0 -1241
  606. /package/dist/{chunk-5jcdmjam.js.map → chunk-4jjp5k14.js.map} +0 -0
  607. /package/dist/{chunk-agsvg9ar.js.map → chunk-5ntny1qx.js.map} +0 -0
  608. /package/dist/{chunk-9aehf39w.js.map → chunk-f26bck4t.js.map} +0 -0
  609. /package/dist/{chunk-08twe8m6.js.map → chunk-p1rzczbt.js.map} +0 -0
  610. /package/dist/{chunk-xdpwpkha.js.map → chunk-rv2hkwwa.js.map} +0 -0
  611. /package/dist/{chunk-1kamz6j0.js.map → chunk-w1tvjszy.js.map} +0 -0
  612. /package/dist/{chunk-4nxeacx7.js.map → chunk-wdage1eb.js.map} +0 -0
@@ -0,0 +1,325 @@
1
+ import { describe, expect, test } from "bun:test"
2
+ import type { CreateShareGrantInput, ShareGrantStorage } from "../storage/share-grants"
3
+
4
+ export interface ShareGrantStorageContractSuiteOptions<
5
+ TStorage extends ShareGrantStorage = ShareGrantStorage,
6
+ > {
7
+ /** Returns an isolated provider capability for every test. */
8
+ readonly createStorage: () => TStorage | Promise<TStorage>
9
+ readonly cleanup?: (storage: TStorage) => void | Promise<void>
10
+ }
11
+
12
+ const projectId = "share-grant-contract"
13
+ const createdAt = new Date("2026-08-19T12:00:00.000Z")
14
+ const expiresAt = new Date("2026-08-20T12:00:00.000Z")
15
+
16
+ /** Provider-neutral lifecycle and isolation contract for durable Share grants. */
17
+ export function runShareGrantStorageContractSuite<TStorage extends ShareGrantStorage>(
18
+ label: string,
19
+ options: ShareGrantStorageContractSuiteOptions<TStorage>
20
+ ): void {
21
+ const withStorage = async (run: (storage: TStorage) => Promise<void>): Promise<void> => {
22
+ const storage = await options.createStorage()
23
+ try {
24
+ await run(storage)
25
+ } finally {
26
+ await options.cleanup?.(storage)
27
+ }
28
+ }
29
+
30
+ describe(label, () => {
31
+ test("stores derived authority and returns defensive copies", async () => {
32
+ await withStorage(async (storage) => {
33
+ const input = grantInput()
34
+ const created = await storage.create(input)
35
+
36
+ ;(input.target as { primaryId: string }).primaryId = "mutated-input"
37
+ ;(input.issuedBy as { id: string }).id = "mutated-input"
38
+ input.createdAt.setUTCFullYear(2040)
39
+ attemptMutation(() => {
40
+ ;(created.target as { primaryId: string }).primaryId = "mutated-result"
41
+ })
42
+ created.createdAt.setUTCFullYear(2041)
43
+ const viewGrant = created.authoritySnapshot.access.grants[0]
44
+ if (!viewGrant || viewGrant.kind !== "object.view") {
45
+ throw new Error("Share grant storage fixture must contain an object.view grant.")
46
+ }
47
+ attemptMutation(() => {
48
+ ;(viewGrant.selection.roots[0]!.anchor as { primaryId: string }).primaryId =
49
+ "mutated-result"
50
+ })
51
+
52
+ const stored = await storage.getById({ projectId, id: "shr_1" })
53
+ expect(stored).toMatchObject({
54
+ id: "shr_1",
55
+ target: { objectTypeId: "Report", primaryId: "report-1" },
56
+ issuedBy: { type: "user", id: "usr_1" },
57
+ authoritySnapshot: { version: 1 },
58
+ destinationPath: "/reports/report-1",
59
+ createdAt,
60
+ expiresAt,
61
+ })
62
+ expect(stored?.authorityDigest).toMatch(/^[0-9a-f]{64}$/)
63
+ expect(stored?.tokenHash).toBe("a".repeat(64))
64
+ })
65
+ })
66
+
67
+ test("enforces id and token-hash uniqueness per project", async () => {
68
+ await withStorage(async (storage) => {
69
+ await storage.create(grantInput())
70
+ await expect(
71
+ storage.create(grantInput({ tokenHash: "b".repeat(64) }))
72
+ ).rejects.toMatchObject({ code: "duplicate" })
73
+ await expect(storage.create(grantInput({ id: "shr_2" }))).rejects.toMatchObject({
74
+ code: "duplicate",
75
+ })
76
+
77
+ await expect(
78
+ storage.create(grantInput({ projectId: "other-project" }))
79
+ ).resolves.toMatchObject({ id: "shr_1", projectId: "other-project" })
80
+ })
81
+ })
82
+
83
+ test("lists a bounded deterministic page with total and hasMore", async () => {
84
+ await withStorage(async (storage) => {
85
+ await storage.create(grantInput({ id: "shr_a", tokenHash: "b".repeat(64) }))
86
+ await storage.create(grantInput({ id: "shr_z", tokenHash: "c".repeat(64) }))
87
+ await storage.create(
88
+ grantInput({
89
+ id: "shr_newer",
90
+ tokenHash: "d".repeat(64),
91
+ createdAt: new Date("2026-08-19T13:00:00.000Z"),
92
+ })
93
+ )
94
+
95
+ await expect(
96
+ storage.list({ projectId, now: createdAt, limit: 2, offset: 0 })
97
+ ).resolves.toMatchObject({
98
+ grants: [{ id: "shr_newer" }, { id: "shr_z" }],
99
+ total: 3,
100
+ hasMore: true,
101
+ })
102
+ await expect(
103
+ storage.list({ projectId, now: createdAt, limit: 2, offset: 2 })
104
+ ).resolves.toMatchObject({
105
+ grants: [{ id: "shr_a" }],
106
+ total: 3,
107
+ hasMore: false,
108
+ })
109
+ })
110
+ })
111
+
112
+ test("filters by project, definition, target, expiry, and revocation", async () => {
113
+ await withStorage(async (storage) => {
114
+ await storage.create(grantInput({ id: "active", tokenHash: "b".repeat(64) }))
115
+ await storage.create(
116
+ grantInput({
117
+ id: "other-target",
118
+ tokenHash: "c".repeat(64),
119
+ targetPrimaryId: "report-2",
120
+ destinationPath: "/reports/report-2",
121
+ })
122
+ )
123
+ await storage.create(
124
+ grantInput({ id: "other-definition", tokenHash: "d".repeat(64), definitionId: "other" })
125
+ )
126
+ await storage.create(
127
+ grantInput({
128
+ id: "expired",
129
+ tokenHash: "e".repeat(64),
130
+ expiresAt: new Date("2026-08-19T12:30:00.000Z"),
131
+ })
132
+ )
133
+ await storage.create(grantInput({ id: "revoked", tokenHash: "f".repeat(64) }))
134
+ await storage.revoke({
135
+ projectId,
136
+ id: "revoked",
137
+ revokedAt: new Date("2026-08-19T12:15:00.000Z"),
138
+ revokedBy: { type: "user", id: "usr_revoker" },
139
+ })
140
+ await storage.create(grantInput({ projectId: "other-project" }))
141
+
142
+ const filter = {
143
+ projectId,
144
+ definitionId: "published-report",
145
+ target: { objectTypeId: "Report", primaryId: "report-1" },
146
+ now: new Date("2026-08-19T13:00:00.000Z"),
147
+ }
148
+ await expect(storage.list(filter)).resolves.toMatchObject({
149
+ grants: [{ id: "active" }],
150
+ total: 1,
151
+ hasMore: false,
152
+ })
153
+ const allStates = await storage.list({
154
+ ...filter,
155
+ includeExpired: true,
156
+ includeRevoked: true,
157
+ })
158
+ expect(allStates.grants.map((grant) => grant.id)).toEqual(["revoked", "expired", "active"])
159
+ })
160
+ })
161
+
162
+ test("treats the exact expiry instant as inactive", async () => {
163
+ await withStorage(async (storage) => {
164
+ await storage.create(grantInput())
165
+ await expect(storage.list({ projectId, now: expiresAt })).resolves.toMatchObject({
166
+ grants: [],
167
+ total: 0,
168
+ })
169
+ await expect(
170
+ storage.list({ projectId, now: expiresAt, includeExpired: true })
171
+ ).resolves.toMatchObject({ grants: [{ id: "shr_1" }], total: 1 })
172
+ })
173
+ })
174
+
175
+ test("keeps the first concurrent revocation and makes later calls idempotent", async () => {
176
+ await withStorage(async (storage) => {
177
+ await storage.create(grantInput())
178
+ const left = {
179
+ projectId,
180
+ id: "shr_1",
181
+ revokedAt: new Date("2026-08-19T13:00:00.000Z"),
182
+ revokedBy: { type: "user" as const, id: "usr_left" },
183
+ }
184
+ const right = {
185
+ projectId,
186
+ id: "shr_1",
187
+ revokedAt: new Date("2026-08-19T14:00:00.000Z"),
188
+ revokedBy: { type: "system" as const, id: "system" },
189
+ }
190
+
191
+ const [first, second] = await Promise.all([storage.revoke(left), storage.revoke(right)])
192
+ expect(first).toEqual(second)
193
+ expect(
194
+ await storage.revoke({ ...right, revokedAt: new Date("2026-08-19T15:00:00.000Z") })
195
+ ).toEqual(first)
196
+ await expect(storage.revoke({ ...left, id: "missing" })).resolves.toBeNull()
197
+ })
198
+ })
199
+
200
+ test("rejects invalid records and list windows consistently", async () => {
201
+ await withStorage(async (storage) => {
202
+ const foreignAuthority = grantInput().authoritySnapshot
203
+ const foreignViewGrant = foreignAuthority.access.grants[0]
204
+ if (!foreignViewGrant || foreignViewGrant.kind !== "object.view") {
205
+ throw new Error("Share grant storage fixture must contain an object.view grant.")
206
+ }
207
+ ;(foreignViewGrant.selection.roots[0]!.anchor as { primaryId: string }).primaryId = "other"
208
+
209
+ const invalid: CreateShareGrantInput[] = [
210
+ grantInput({ projectId: "" }),
211
+ grantInput({ tokenHash: "not-a-hash" }),
212
+ grantInput({ destinationPath: "https://example.com/report" }),
213
+ grantInput({ destinationPath: "/reports//report-1" }),
214
+ grantInput({ destinationPath: "/reports?id=1" }),
215
+ grantInput({ destinationPath: "/shared" }),
216
+ grantInput({ destinationPath: "/shared/report-1" }),
217
+ grantInput({ destinationPath: "/shared%2Freport-1" }),
218
+ grantInput({ destinationPath: "/shared%5Creport-1" }),
219
+ grantInput({ destinationPath: "/%73hared/report-1" }),
220
+ grantInput({ expiresAt: new Date(createdAt) }),
221
+ grantInput({ createdAt: new Date("invalid") }),
222
+ grantInput({ issuedBy: { type: "system", id: "system" } as never }),
223
+ grantInput({ authoritySnapshot: foreignAuthority }),
224
+ ]
225
+ for (const input of invalid) {
226
+ await expect(storage.create(input)).rejects.toMatchObject({ code: "invalid_input" })
227
+ }
228
+ await expect(storage.create(null as never)).rejects.toMatchObject({
229
+ code: "invalid_input",
230
+ })
231
+ await expect(storage.getById(null as never)).rejects.toMatchObject({
232
+ code: "invalid_input",
233
+ })
234
+
235
+ await expect(storage.list({ projectId, now: createdAt, limit: 201 })).rejects.toMatchObject(
236
+ { code: "invalid_input" }
237
+ )
238
+ await expect(storage.list({ projectId, now: new Date("invalid") })).rejects.toMatchObject({
239
+ code: "invalid_input",
240
+ })
241
+ })
242
+ })
243
+
244
+ test("rejects a revocation before creation without changing the grant", async () => {
245
+ await withStorage(async (storage) => {
246
+ await storage.create(grantInput())
247
+ await expect(
248
+ storage.revoke({
249
+ projectId,
250
+ id: "shr_1",
251
+ revokedAt: new Date("2026-08-19T11:59:59.999Z"),
252
+ revokedBy: { type: "user", id: "usr_1" },
253
+ })
254
+ ).rejects.toMatchObject({ code: "invalid_input" })
255
+ const unchanged = await storage.getById({ projectId, id: "shr_1" })
256
+ expect(unchanged).not.toBeNull()
257
+ expect(unchanged).not.toHaveProperty("revokedAt")
258
+ expect(unchanged).not.toHaveProperty("revokedBy")
259
+ })
260
+ })
261
+ })
262
+ }
263
+
264
+ function grantInput(
265
+ overrides: Partial<CreateShareGrantInput> & { readonly targetPrimaryId?: string } = {}
266
+ ): CreateShareGrantInput {
267
+ const targetPrimaryId = overrides.targetPrimaryId ?? "report-1"
268
+ const target = overrides.target ?? { objectTypeId: "Report", primaryId: targetPrimaryId }
269
+ const base: CreateShareGrantInput = {
270
+ id: "shr_1",
271
+ projectId,
272
+ definitionId: "published-report",
273
+ target,
274
+ issuedBy: { type: "user", id: "usr_1" },
275
+ authoritySnapshot: authoritySnapshot(target.objectTypeId, target.primaryId),
276
+ tokenHash: "a".repeat(64),
277
+ destinationPath: "/reports/report-1",
278
+ createdAt: new Date(createdAt),
279
+ expiresAt: new Date(expiresAt),
280
+ }
281
+ const { targetPrimaryId: _targetPrimaryId, ...recordOverrides } = overrides
282
+ return { ...base, ...recordOverrides }
283
+ }
284
+
285
+ function authoritySnapshot(
286
+ objectTypeId: string,
287
+ primaryId: string
288
+ ): CreateShareGrantInput["authoritySnapshot"] {
289
+ return {
290
+ version: 1,
291
+ access: {
292
+ grants: [
293
+ {
294
+ kind: "object.view",
295
+ selection: {
296
+ kind: "selected",
297
+ roots: [
298
+ {
299
+ anchor: { objectTypeId, primaryId },
300
+ node: {
301
+ objects: [{ objectTypeId, propertyIds: ["id", "title"] }],
302
+ links: [],
303
+ },
304
+ },
305
+ ],
306
+ },
307
+ },
308
+ ],
309
+ },
310
+ }
311
+ }
312
+
313
+ export function createShareGrantStorageContractInput(
314
+ overrides: Partial<CreateShareGrantInput> = {}
315
+ ): CreateShareGrantInput {
316
+ return grantInput(overrides)
317
+ }
318
+
319
+ function attemptMutation(mutate: () => void): void {
320
+ try {
321
+ mutate()
322
+ } catch (error) {
323
+ expect(error).toBeInstanceOf(TypeError)
324
+ }
325
+ }
@@ -0,0 +1,235 @@
1
+ import { describe, expect, test } from "bun:test"
2
+ import type {
3
+ CreateShareSessionInput,
4
+ RenewShareSessionIfValidInput,
5
+ ShareSessionStorage,
6
+ } from "../storage/share-sessions"
7
+
8
+ export interface ShareSessionStorageContractSuiteOptions<
9
+ TStorage extends ShareSessionStorage = ShareSessionStorage,
10
+ > {
11
+ readonly createStorage: () => TStorage | Promise<TStorage>
12
+ readonly cleanup?: (storage: TStorage) => void | Promise<void>
13
+ }
14
+
15
+ const projectId = "share-session-contract"
16
+ const createdAt = new Date("2026-08-20T12:00:00.000Z")
17
+ const expiresAt = new Date("2026-08-20T12:05:00.000Z")
18
+ const absoluteExpiresAt = new Date("2026-08-20T12:20:00.000Z")
19
+
20
+ /** Provider-neutral lifecycle, monotonic-renewal, and isolation contract for Share sessions. */
21
+ export function runShareSessionStorageContractSuite<TStorage extends ShareSessionStorage>(
22
+ label: string,
23
+ options: ShareSessionStorageContractSuiteOptions<TStorage>
24
+ ): void {
25
+ const withStorage = async (run: (storage: TStorage) => Promise<void>): Promise<void> => {
26
+ const storage = await options.createStorage()
27
+ try {
28
+ await run(storage)
29
+ } finally {
30
+ await options.cleanup?.(storage)
31
+ }
32
+ }
33
+
34
+ describe(label, () => {
35
+ test("stores normalized records and returns defensive copies", async () => {
36
+ await withStorage(async (storage) => {
37
+ const input = sessionInput()
38
+ const created = await storage.create(input)
39
+ input.createdAt.setUTCFullYear(2040)
40
+ input.expiresAt.setUTCFullYear(2040)
41
+ input.absoluteExpiresAt.setUTCFullYear(2040)
42
+ created.createdAt.setUTCFullYear(2041)
43
+
44
+ await expect(storage.getById({ projectId, id: "shs_1" })).resolves.toEqual(sessionInput())
45
+ })
46
+ })
47
+
48
+ test("scopes identity and token-hash uniqueness to one project", async () => {
49
+ await withStorage(async (storage) => {
50
+ await storage.create(sessionInput())
51
+ await storage.create(sessionInput({ projectId: "other-project" }))
52
+
53
+ await expect(
54
+ storage.create(sessionInput({ tokenHash: "b".repeat(64) }))
55
+ ).rejects.toMatchObject({ code: "duplicate" })
56
+ await expect(storage.create(sessionInput({ id: "shs_2" }))).rejects.toMatchObject({
57
+ code: "duplicate",
58
+ })
59
+ await expect(
60
+ storage.getById({ projectId: "other-project", id: "shs_1" })
61
+ ).resolves.toMatchObject({ projectId: "other-project" })
62
+ })
63
+ })
64
+
65
+ test("rejects a session whose Share grant does not exist", async () => {
66
+ await withStorage(async (storage) => {
67
+ await expect(storage.create(sessionInput({ grantId: "missing" }))).rejects.toMatchObject({
68
+ code: "invalid_input",
69
+ })
70
+ })
71
+ })
72
+
73
+ test("authenticates exact session identity and active deadlines", async () => {
74
+ await withStorage(async (storage) => {
75
+ await storage.create(sessionInput())
76
+ const valid = renewalInput({ expiresAt: new Date("2026-08-20T12:10:00.000Z") })
77
+ await expect(storage.renewIfValid(valid)).resolves.toMatchObject({
78
+ id: "shs_1",
79
+ expiresAt: new Date("2026-08-20T12:10:00.000Z"),
80
+ })
81
+ await expect(storage.renewIfValid({ ...valid, id: "missing" })).resolves.toBeNull()
82
+ await expect(storage.renewIfValid({ ...valid, grantId: "shr_other" })).resolves.toBeNull()
83
+ await expect(
84
+ storage.renewIfValid({ ...valid, tokenHash: "b".repeat(64) })
85
+ ).resolves.toBeNull()
86
+ await expect(
87
+ storage.renewIfValid({ ...valid, now: new Date("2026-08-20T11:59:59.999Z") })
88
+ ).resolves.toBeNull()
89
+ })
90
+ })
91
+
92
+ test("never shortens, resurrects, or exceeds the absolute deadline", async () => {
93
+ await withStorage(async (storage) => {
94
+ await storage.create(sessionInput())
95
+
96
+ await expect(
97
+ storage.renewIfValid(renewalInput({ expiresAt: new Date("2026-08-20T12:04:00.000Z") }))
98
+ ).resolves.toMatchObject({ expiresAt })
99
+ await expect(
100
+ storage.renewIfValid(renewalInput({ expiresAt: new Date("2026-08-20T13:00:00.000Z") }))
101
+ ).resolves.toMatchObject({ expiresAt: absoluteExpiresAt })
102
+ await expect(
103
+ storage.renewIfValid(
104
+ renewalInput({
105
+ now: new Date(absoluteExpiresAt),
106
+ expiresAt: new Date("2026-08-20T13:00:00.000Z"),
107
+ })
108
+ )
109
+ ).resolves.toBeNull()
110
+ })
111
+ })
112
+
113
+ test("treats the exact inactivity expiry as expired", async () => {
114
+ await withStorage(async (storage) => {
115
+ await storage.create(sessionInput())
116
+ await expect(
117
+ storage.renewIfValid(
118
+ renewalInput({
119
+ now: new Date(expiresAt),
120
+ expiresAt: new Date("2026-08-20T12:10:00.000Z"),
121
+ })
122
+ )
123
+ ).resolves.toBeNull()
124
+ })
125
+ })
126
+
127
+ test("keeps concurrent renewals monotonic", async () => {
128
+ await withStorage(async (storage) => {
129
+ await storage.create(sessionInput())
130
+ await Promise.all([
131
+ storage.renewIfValid(renewalInput({ expiresAt: new Date("2026-08-20T12:09:00.000Z") })),
132
+ storage.renewIfValid(renewalInput({ expiresAt: new Date("2026-08-20T12:14:00.000Z") })),
133
+ ])
134
+ await expect(storage.getById({ projectId, id: "shs_1" })).resolves.toMatchObject({
135
+ expiresAt: new Date("2026-08-20T12:14:00.000Z"),
136
+ })
137
+ })
138
+ })
139
+
140
+ test("keeps the first concurrent revocation and blocks renewal", async () => {
141
+ await withStorage(async (storage) => {
142
+ await storage.create(sessionInput())
143
+ const left = {
144
+ projectId,
145
+ id: "shs_1",
146
+ revokedAt: new Date("2026-08-20T12:02:00.000Z"),
147
+ }
148
+ const right = {
149
+ projectId,
150
+ id: "shs_1",
151
+ revokedAt: new Date("2026-08-20T12:03:00.000Z"),
152
+ }
153
+ const [first, second] = await Promise.all([storage.revoke(left), storage.revoke(right)])
154
+ expect(first).toEqual(second)
155
+ await expect(storage.revoke(right)).resolves.toEqual(first)
156
+ await expect(storage.renewIfValid(renewalInput())).resolves.toBeNull()
157
+ await expect(storage.revoke({ ...left, id: "missing" })).resolves.toBeNull()
158
+ })
159
+ })
160
+
161
+ test("rejects malformed inputs and impossible timestamps consistently", async () => {
162
+ await withStorage(async (storage) => {
163
+ const invalid: CreateShareSessionInput[] = [
164
+ sessionInput({ id: "" }),
165
+ sessionInput({ projectId: "" }),
166
+ sessionInput({ grantId: "" }),
167
+ sessionInput({ tokenHash: "not-a-hash" }),
168
+ sessionInput({ createdAt: new Date("invalid") }),
169
+ sessionInput({ expiresAt: new Date(createdAt) }),
170
+ sessionInput({ absoluteExpiresAt: new Date(createdAt) }),
171
+ sessionInput({ absoluteExpiresAt: new Date("2026-08-20T12:04:00.000Z") }),
172
+ ]
173
+ for (const input of invalid) {
174
+ await expect(storage.create(input)).rejects.toMatchObject({ code: "invalid_input" })
175
+ }
176
+ await expect(storage.create(null as never)).rejects.toMatchObject({
177
+ code: "invalid_input",
178
+ })
179
+ await expect(storage.getById(null as never)).rejects.toMatchObject({
180
+ code: "invalid_input",
181
+ })
182
+ await expect(
183
+ storage.renewIfValid(renewalInput({ expiresAt: new Date("2026-08-20T12:01:00.000Z") }))
184
+ ).rejects.toMatchObject({ code: "invalid_input" })
185
+ })
186
+ })
187
+
188
+ test("rejects revocation before creation without changing the session", async () => {
189
+ await withStorage(async (storage) => {
190
+ await storage.create(sessionInput())
191
+ await expect(
192
+ storage.revoke({
193
+ projectId,
194
+ id: "shs_1",
195
+ revokedAt: new Date("2026-08-20T11:59:59.999Z"),
196
+ })
197
+ ).rejects.toMatchObject({ code: "invalid_input" })
198
+ expect(await storage.getById({ projectId, id: "shs_1" })).not.toHaveProperty("revokedAt")
199
+ })
200
+ })
201
+ })
202
+ }
203
+
204
+ export function createShareSessionStorageContractInput(
205
+ overrides: Partial<CreateShareSessionInput> = {}
206
+ ): CreateShareSessionInput {
207
+ return sessionInput(overrides)
208
+ }
209
+
210
+ function sessionInput(overrides: Partial<CreateShareSessionInput> = {}): CreateShareSessionInput {
211
+ return {
212
+ id: "shs_1",
213
+ projectId,
214
+ grantId: "shr_1",
215
+ tokenHash: "a".repeat(64),
216
+ createdAt: new Date(createdAt),
217
+ expiresAt: new Date(expiresAt),
218
+ absoluteExpiresAt: new Date(absoluteExpiresAt),
219
+ ...overrides,
220
+ }
221
+ }
222
+
223
+ function renewalInput(
224
+ overrides: Partial<RenewShareSessionIfValidInput> = {}
225
+ ): RenewShareSessionIfValidInput {
226
+ return {
227
+ projectId,
228
+ id: "shs_1",
229
+ grantId: "shr_1",
230
+ tokenHash: "a".repeat(64),
231
+ now: new Date("2026-08-20T12:01:00.000Z"),
232
+ expiresAt: new Date("2026-08-20T12:08:00.000Z"),
233
+ ...overrides,
234
+ }
235
+ }