@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
@@ -1,1241 +0,0 @@
1
- import type { EffectiveLinkSnapshot, EffectiveObjectSnapshot } from "../../materialization/model"
2
- import type { ObjectQuery, ObjectQueryPredicate, ObjectQuerySortField } from "../../objects/query"
3
- import { compareQueryScalarValues, queryScalarValuesEqual } from "../../objects/query/scalar-values"
4
- import type { LinkBatchKey, ObjectBatchKey } from "./keys"
5
- import {
6
- compareObjectLinkCursors,
7
- compareObjectLinks,
8
- linkBatchKey,
9
- objectBatchKey,
10
- objectLinkCursor,
11
- } from "./keys"
12
- import type {
13
- CountObjectsInput,
14
- CountObjectsResult,
15
- ExistsObjectsInput,
16
- ExistsObjectsResult,
17
- FacetObjectsInput,
18
- FacetObjectsResult,
19
- LinkDirection,
20
- ObjectFacetRequest,
21
- ObjectFacetResult,
22
- ObjectLinkRow,
23
- ObjectQueryCapabilities,
24
- ObjectRow,
25
- ObjectStorage,
26
- QueryObjectLinksInput,
27
- QueryObjectLinksResult,
28
- QueryObjectsInput,
29
- QueryObjectsResult,
30
- } from "./types"
31
-
32
- const IN_MEMORY_OBJECT_QUERY_CAPABILITIES: ObjectQueryCapabilities = {
33
- queryObjects: true,
34
- countObjects: true,
35
- existsObjects: true,
36
- facetObjects: true,
37
- nodes: {
38
- start: true,
39
- refs: true,
40
- filter: true,
41
- text: true,
42
- vector: true,
43
- traverse: true,
44
- set: true,
45
- sort: true,
46
- limit: true,
47
- page: true,
48
- project: true,
49
- },
50
- predicateOps: {
51
- and: true,
52
- or: true,
53
- not: true,
54
- eq: true,
55
- neq: true,
56
- lt: true,
57
- lte: true,
58
- gt: true,
59
- gte: true,
60
- in: true,
61
- exists: true,
62
- contains: true,
63
- },
64
- sortKinds: {
65
- property: true,
66
- relevance: true,
67
- },
68
- traversalDirections: {
69
- outgoing: true,
70
- incoming: true,
71
- },
72
- setOps: {
73
- union: true,
74
- intersect: true,
75
- subtract: true,
76
- },
77
- scalarOperations: {
78
- string: { equality: true, ordering: true },
79
- uuid: { equality: true, ordering: true },
80
- boolean: { equality: true },
81
- integer: { equality: true, ordering: true },
82
- double: { equality: true, ordering: true },
83
- decimal: { equality: true, ordering: true },
84
- date: { equality: true, ordering: true },
85
- timestamp: { equality: true, ordering: true },
86
- },
87
- limits: {
88
- totalCount: true,
89
- stablePageTokens: true,
90
- },
91
- }
92
-
93
- function objectRowKey(projectId: string, objectTypeId: string): string {
94
- return JSON.stringify([projectId, objectTypeId])
95
- }
96
-
97
- function objectRowProjectPrefix(projectId: string): string {
98
- return `[${JSON.stringify(projectId)},`
99
- }
100
-
101
- function compareStrings(left: string, right: string): number {
102
- if (left < right) return -1
103
- if (left > right) return 1
104
- return 0
105
- }
106
-
107
- function assertLinkQueryLimit(limit: number): void {
108
- if (!Number.isSafeInteger(limit) || limit <= 0) {
109
- throw new Error("Object link query limit must be a positive safe integer.")
110
- }
111
- }
112
-
113
- function sourceLinkBucketKey(projectId: string, sourceTypeId: string, sourceId: string): string {
114
- return JSON.stringify([projectId, sourceTypeId, sourceId])
115
- }
116
-
117
- function linkRowKey(linkId: string, targetTypeId: string, targetId: string): string {
118
- return JSON.stringify([linkId, targetTypeId, targetId])
119
- }
120
-
121
- function fullLinkRowKey(row: ObjectLinkRow): string {
122
- return JSON.stringify([
123
- row.sourceTypeId,
124
- row.sourceId,
125
- row.linkId,
126
- row.targetTypeId,
127
- row.targetId,
128
- ])
129
- }
130
-
131
- type QueryEntry = {
132
- row: ObjectRow
133
- score: number
134
- order: number
135
- }
136
-
137
- type QueryEvaluation = {
138
- entries: QueryEntry[]
139
- total: number
140
- hasMore: boolean
141
- nextPageToken?: string
142
- }
143
-
144
- const PAGE_TOKEN_PREFIX = "offset:"
145
-
146
- export interface InMemoryObjectStorageSnapshot {
147
- readonly rows: Map<string, Map<string, ObjectRow>>
148
- readonly links: Map<string, Map<string, ObjectLinkRow>>
149
- }
150
-
151
- interface InMemoryObjectMaterializerAdapter {
152
- getExactObjectRow(projectId: string, objectTypeId: string, primaryId: string): ObjectRow | null
153
- getExactLinkRow(
154
- projectId: string,
155
- ref: {
156
- readonly sourceTypeId: string
157
- readonly sourceId: string
158
- readonly linkId: string
159
- readonly targetTypeId: string
160
- readonly targetId: string
161
- }
162
- ): ObjectLinkRow | null
163
- applyExactObject(row: EffectiveObjectSnapshot, projectId: string): void
164
- deleteExactObject(projectId: string, objectTypeId: string, primaryId: string): void
165
- applyExactLink(row: EffectiveLinkSnapshot, projectId: string): void
166
- deleteExactLink(row: {
167
- projectId: string
168
- sourceTypeId: string
169
- sourceId: string
170
- linkId: string
171
- targetTypeId: string
172
- targetId: string
173
- }): void
174
- visitExactLinks(projectId: string, visit: (row: ObjectLinkRow) => void): void
175
- visitExactScopeLinks(
176
- projectId: string,
177
- sourceTypeId: string,
178
- sourceId: string,
179
- linkId: string,
180
- visit: (row: ObjectLinkRow) => void
181
- ): void
182
- }
183
-
184
- const materializerAdapters = new WeakMap<InMemoryObjectStorage, InMemoryObjectMaterializerAdapter>()
185
-
186
- /** @internal Exact access for the in-memory ontology provider; not exported from package barrels. */
187
- export function getInMemoryObjectMaterializerAdapter(
188
- storage: InMemoryObjectStorage
189
- ): InMemoryObjectMaterializerAdapter {
190
- const adapter = materializerAdapters.get(storage)
191
- if (!adapter) throw new Error("[Sixb] In-memory object materializer adapter is unavailable.")
192
- return adapter
193
- }
194
-
195
- export class InMemoryObjectStorage implements ObjectStorage {
196
- private readonly rows = new Map<string, Map<string, ObjectRow>>()
197
- private readonly links = new Map<string, Map<string, ObjectLinkRow>>()
198
-
199
- constructor() {
200
- materializerAdapters.set(this, {
201
- getExactObjectRow: (projectId, objectTypeId, primaryId) =>
202
- this.getExactObjectRow(projectId, objectTypeId, primaryId),
203
- getExactLinkRow: (projectId, ref) => this.getExactLinkRow(projectId, ref),
204
- applyExactObject: (row, projectId) => this.applyExactObject(row, projectId),
205
- deleteExactObject: (projectId, objectTypeId, primaryId) =>
206
- this.deleteExactObject(projectId, objectTypeId, primaryId),
207
- applyExactLink: (row, projectId) => this.applyExactLink(row, projectId),
208
- deleteExactLink: (row) => this.deleteExactLink(row),
209
- visitExactLinks: (projectId, visit) => {
210
- for (const bucket of this.links.values()) {
211
- for (const row of bucket.values()) {
212
- if (row.projectId === projectId) visit(structuredClone(row))
213
- }
214
- }
215
- },
216
- visitExactScopeLinks: (projectId, sourceTypeId, sourceId, linkId, visit) => {
217
- const bucket = this.links.get(sourceLinkBucketKey(projectId, sourceTypeId, sourceId))
218
- if (!bucket) return
219
- for (const row of bucket.values()) {
220
- if (row.linkId === linkId) visit(structuredClone(row))
221
- }
222
- },
223
- })
224
- }
225
-
226
- snapshot(): InMemoryObjectStorageSnapshot {
227
- return {
228
- rows: cloneObjectBuckets(this.rows),
229
- links: cloneLinkBuckets(this.links),
230
- }
231
- }
232
-
233
- restore(snapshot: InMemoryObjectStorageSnapshot): void {
234
- this.rows.clear()
235
- for (const [key, bucket] of cloneObjectBuckets(snapshot.rows)) {
236
- this.rows.set(key, bucket)
237
- }
238
-
239
- this.links.clear()
240
- for (const [key, bucket] of cloneLinkBuckets(snapshot.links)) {
241
- this.links.set(key, bucket)
242
- }
243
- }
244
-
245
- private getExactObjectRow(
246
- projectId: string,
247
- objectTypeId: string,
248
- primaryId: string
249
- ): ObjectRow | null {
250
- const row = this.rows.get(objectRowKey(projectId, objectTypeId))?.get(primaryId)
251
- return row ? structuredClone(row) : null
252
- }
253
-
254
- private getExactLinkRow(
255
- projectId: string,
256
- ref: {
257
- readonly sourceTypeId: string
258
- readonly sourceId: string
259
- readonly linkId: string
260
- readonly targetTypeId: string
261
- readonly targetId: string
262
- }
263
- ): ObjectLinkRow | null {
264
- const row = this.links
265
- .get(sourceLinkBucketKey(projectId, ref.sourceTypeId, ref.sourceId))
266
- ?.get(linkRowKey(ref.linkId, ref.targetTypeId, ref.targetId))
267
- return row ? structuredClone(row) : null
268
- }
269
-
270
- private applyExactObject(row: EffectiveObjectSnapshot, projectId: string): void {
271
- const bucketId = objectRowKey(projectId, row.ref.objectTypeId)
272
- const bucket = this.rows.get(bucketId) ?? new Map<string, ObjectRow>()
273
- this.rows.set(bucketId, bucket)
274
- bucket.set(row.ref.primaryId, {
275
- projectId,
276
- objectTypeId: row.ref.objectTypeId,
277
- primaryId: row.ref.primaryId,
278
- properties: structuredClone(row.properties) as Record<string, unknown>,
279
- createdAt: new Date(row.createdAt),
280
- updatedAt: new Date(row.updatedAt),
281
- version: row.version,
282
- lastCommitId: row.lastCommitId,
283
- })
284
- }
285
-
286
- private deleteExactObject(projectId: string, objectTypeId: string, primaryId: string): void {
287
- this.deleteObjectRow(projectId, objectTypeId, primaryId)
288
- }
289
-
290
- private applyExactLink(row: EffectiveLinkSnapshot, projectId: string): void {
291
- const bucketKey = sourceLinkBucketKey(
292
- projectId,
293
- row.ref.source.objectTypeId,
294
- row.ref.source.primaryId
295
- )
296
- const bucket = this.links.get(bucketKey) ?? new Map<string, ObjectLinkRow>()
297
- this.links.set(bucketKey, bucket)
298
- bucket.set(linkRowKey(row.ref.linkId, row.ref.target.objectTypeId, row.ref.target.primaryId), {
299
- projectId,
300
- sourceTypeId: row.ref.source.objectTypeId,
301
- sourceId: row.ref.source.primaryId,
302
- linkId: row.ref.linkId,
303
- targetTypeId: row.ref.target.objectTypeId,
304
- targetId: row.ref.target.primaryId,
305
- properties: row.properties
306
- ? (structuredClone(row.properties) as Record<string, unknown>)
307
- : undefined,
308
- createdAt: new Date(row.createdAt),
309
- updatedAt: new Date(row.updatedAt),
310
- lastCommitId: row.lastCommitId,
311
- })
312
- }
313
-
314
- private deleteExactLink(row: {
315
- projectId: string
316
- sourceTypeId: string
317
- sourceId: string
318
- linkId: string
319
- targetTypeId: string
320
- targetId: string
321
- }): void {
322
- this.deleteLinkRow(
323
- row.projectId,
324
- row.sourceTypeId,
325
- row.sourceId,
326
- row.linkId,
327
- row.targetTypeId,
328
- row.targetId
329
- )
330
- }
331
-
332
- queryCapabilities(): ObjectQueryCapabilities {
333
- return IN_MEMORY_OBJECT_QUERY_CAPABILITIES
334
- }
335
-
336
- async queryObjects(params: QueryObjectsInput): Promise<QueryObjectsResult> {
337
- const result = this.evaluateObjectQuery(params.projectId, params.query)
338
- return {
339
- objects: result.entries.map((entry) => entry.row),
340
- hasMore: result.hasMore,
341
- nextPageToken: result.nextPageToken,
342
- ...(params.includeTotal === false ? {} : { total: result.total }),
343
- }
344
- }
345
-
346
- async countObjects(params: CountObjectsInput): Promise<CountObjectsResult> {
347
- return {
348
- count: this.evaluateObjectQuery(params.projectId, stripOuterRowShape(params.query)).total,
349
- }
350
- }
351
-
352
- async existsObjects(params: ExistsObjectsInput): Promise<ExistsObjectsResult> {
353
- return {
354
- exists:
355
- this.evaluateObjectQuery(params.projectId, stripOuterRowShape(params.query)).total > 0,
356
- }
357
- }
358
-
359
- async facetObjects(params: FacetObjectsInput): Promise<FacetObjectsResult> {
360
- const result = this.evaluateObjectQuery(params.projectId, stripOuterRowShape(params.query))
361
- return {
362
- facets: buildFacetResults(
363
- result.entries.map((entry) => entry.row),
364
- params.facets
365
- ),
366
- }
367
- }
368
-
369
- private evaluateObjectQuery(projectId: string, query: ObjectQuery): QueryEvaluation {
370
- switch (query.kind) {
371
- case "start":
372
- return this.evaluateStart(projectId, query.objectTypeId)
373
- case "refs":
374
- return this.evaluateRefs(projectId, query.refs)
375
- case "filter": {
376
- const input = this.evaluateObjectQuery(projectId, query.input)
377
- const entries = input.entries.filter((entry) =>
378
- matchesPredicate(entry.row, query.predicate)
379
- )
380
- return completeEvaluation(entries)
381
- }
382
- case "text": {
383
- const input = this.evaluateObjectQuery(projectId, query.input)
384
- const scoredEntries = input.entries.flatMap((entry) => {
385
- const score = textScore(entry.row, query.query, query.fields, query.fieldsByObjectType)
386
- return score > 0 ? [{ ...entry, score: entry.score + score }] : []
387
- })
388
- return completeEvaluation(scoredEntries)
389
- }
390
- case "vector": {
391
- const input = this.evaluateObjectQuery(projectId, query.input)
392
- const scoredEntries = input.entries.flatMap((entry) => {
393
- const score = vectorSimilarity(entry.row.properties[query.propertyId], query.vector)
394
- return score === null ? [] : [{ ...entry, score: entry.score + score }]
395
- })
396
- scoredEntries.sort(compareEntriesByRelevance)
397
- const limit = Math.max(0, query.k)
398
- return {
399
- entries: scoredEntries.slice(0, limit),
400
- total: scoredEntries.length,
401
- hasMore: limit < scoredEntries.length,
402
- }
403
- }
404
- case "traverse": {
405
- const input = this.evaluateObjectQuery(projectId, query.input)
406
- const entries =
407
- query.direction === "outgoing"
408
- ? this.traverseOutgoing(projectId, input.entries, query.linkId)
409
- : this.traverseIncoming(
410
- projectId,
411
- input.entries,
412
- query.linkId,
413
- query.sourceObjectTypeId
414
- )
415
- return completeEvaluation(entries)
416
- }
417
- case "set":
418
- return this.evaluateSet(projectId, query.op, query.inputs)
419
- case "sort": {
420
- const input = this.evaluateObjectQuery(projectId, query.input)
421
- return {
422
- ...input,
423
- entries: sortEntries(input.entries, query.fields),
424
- }
425
- }
426
- case "limit": {
427
- const input = this.evaluateObjectQuery(projectId, query.input)
428
- const limit = Math.max(0, query.limit)
429
- return {
430
- entries: input.entries.slice(0, limit),
431
- total: input.entries.length,
432
- hasMore: limit < input.entries.length,
433
- }
434
- }
435
- case "page": {
436
- const input = this.evaluateObjectQuery(projectId, query.input)
437
- const offset = decodePageOffset(query.pageToken)
438
- const pageSize = Math.max(0, query.pageSize)
439
- const nextOffset = offset + pageSize
440
- const hasMore = pageSize > 0 && nextOffset < input.entries.length
441
- return {
442
- entries: input.entries.slice(offset, nextOffset),
443
- total: input.entries.length,
444
- hasMore,
445
- nextPageToken: hasMore ? encodePageOffset(nextOffset) : undefined,
446
- }
447
- }
448
- case "project": {
449
- const input = this.evaluateObjectQuery(projectId, query.input)
450
- if (!query.properties) return input
451
- const properties = query.properties
452
- return {
453
- ...input,
454
- entries: input.entries.map((entry) => ({
455
- ...entry,
456
- row: projectRow(entry.row, properties),
457
- })),
458
- }
459
- }
460
- case "expand":
461
- // `expand` is output-shaping and is gated off by the planner in this
462
- // slice (and stripped before aggregates run), so the in-memory engine
463
- // should never receive one. Link hydration lands in a later slice.
464
- throw new Error("[Sixb] In-memory object storage does not support 'expand' execution yet")
465
- }
466
- }
467
-
468
- private evaluateStart(projectId: string, objectTypeId: string): QueryEvaluation {
469
- const bucket = this.rows.get(objectRowKey(projectId, objectTypeId))
470
- const entries = [...(bucket?.values() ?? [])].map((row, index) => ({
471
- row,
472
- score: 0,
473
- order: index,
474
- }))
475
- return completeEvaluation(entries)
476
- }
477
-
478
- private evaluateRefs(
479
- projectId: string,
480
- refs: readonly { objectTypeId: string; primaryId: string }[]
481
- ): QueryEvaluation {
482
- const seen = new Set<string>()
483
- const entries = refs
484
- .flatMap((ref) => {
485
- const key = JSON.stringify([ref.objectTypeId, ref.primaryId])
486
- if (seen.has(key)) return []
487
- seen.add(key)
488
- const row = this.rows.get(objectRowKey(projectId, ref.objectTypeId))?.get(ref.primaryId)
489
- return row ? [row] : []
490
- })
491
- .sort(
492
- (left, right) =>
493
- compareStrings(left.objectTypeId, right.objectTypeId) ||
494
- compareStrings(left.primaryId, right.primaryId)
495
- )
496
- .map((row, order) => ({ row, score: 0, order }))
497
-
498
- return completeEvaluation(entries)
499
- }
500
-
501
- private evaluateSet(
502
- projectId: string,
503
- op: "union" | "intersect" | "subtract",
504
- inputs: readonly ObjectQuery[]
505
- ): QueryEvaluation {
506
- const evaluations = inputs.map((input) => this.evaluateObjectQuery(projectId, input))
507
- const first = evaluations[0]
508
- if (!first) return completeEvaluation([])
509
-
510
- if (op === "union") {
511
- const entriesByKey = new Map<string, QueryEntry>()
512
- for (const evaluation of evaluations) {
513
- for (const entry of evaluation.entries) {
514
- upsertEntry(entriesByKey, entry)
515
- }
516
- }
517
- return completeEvaluation([...entriesByKey.values()])
518
- }
519
-
520
- if (op === "intersect") {
521
- const otherKeySets = evaluations
522
- .slice(1)
523
- .map((evaluation) => new Set(evaluation.entries.map((entry) => rowIdentityKey(entry.row))))
524
- const entries = first.entries.filter((entry) => {
525
- const key = rowIdentityKey(entry.row)
526
- return otherKeySets.every((keys) => keys.has(key))
527
- })
528
- return completeEvaluation(entries)
529
- }
530
-
531
- const subtractKeys = new Set(
532
- evaluations
533
- .slice(1)
534
- .flatMap((evaluation) => evaluation.entries.map((entry) => rowIdentityKey(entry.row)))
535
- )
536
- return completeEvaluation(
537
- first.entries.filter((entry) => !subtractKeys.has(rowIdentityKey(entry.row)))
538
- )
539
- }
540
-
541
- private traverseOutgoing(
542
- projectId: string,
543
- entries: readonly QueryEntry[],
544
- linkId: string
545
- ): QueryEntry[] {
546
- const resultsByKey = new Map<string, QueryEntry>()
547
-
548
- entries.forEach((entry, index) => {
549
- const bucket = this.links.get(
550
- sourceLinkBucketKey(projectId, entry.row.objectTypeId, entry.row.primaryId)
551
- )
552
- if (!bucket) return
553
-
554
- for (const link of bucket.values()) {
555
- if (link.linkId !== linkId) continue
556
- const target = this.rows.get(objectRowKey(projectId, link.targetTypeId))?.get(link.targetId)
557
- if (!target) continue
558
- upsertEntry(resultsByKey, {
559
- row: target,
560
- score: entry.score,
561
- order: entry.order + index / 1_000_000,
562
- })
563
- }
564
- })
565
-
566
- return [...resultsByKey.values()]
567
- }
568
-
569
- private traverseIncoming(
570
- projectId: string,
571
- entries: readonly QueryEntry[],
572
- linkId: string,
573
- sourceObjectTypeId?: string
574
- ): QueryEntry[] {
575
- const inputEntriesByTarget = new Map(entries.map((entry) => [rowIdentityKey(entry.row), entry]))
576
- const resultsByKey = new Map<string, QueryEntry>()
577
-
578
- for (const bucket of this.links.values()) {
579
- for (const link of bucket.values()) {
580
- if (link.projectId !== projectId || link.linkId !== linkId) continue
581
- if (sourceObjectTypeId !== undefined && link.sourceTypeId !== sourceObjectTypeId) continue
582
- const targetEntry = inputEntriesByTarget.get(
583
- rowIdentityKeyParts(link.targetTypeId, link.targetId)
584
- )
585
- if (!targetEntry) continue
586
-
587
- const source = this.rows.get(objectRowKey(projectId, link.sourceTypeId))?.get(link.sourceId)
588
- if (!source) continue
589
- upsertEntry(resultsByKey, {
590
- row: source,
591
- score: targetEntry.score,
592
- order: targetEntry.order,
593
- })
594
- }
595
- }
596
-
597
- return [...resultsByKey.values()]
598
- }
599
-
600
- /**
601
- * Reads return the *live* stored row by reference (the SQL providers detach a copy via JSON
602
- * round-trip). Callers must treat read results as immutable: mutating a returned row mutates the
603
- * store in place — including after the transaction that read it has completed, which escapes the
604
- * transaction guard. Internal call sites (e.g. the EditBatch planner) already copy before
605
- * mutating; external callers must do the same.
606
- */
607
- async getByPrimaryId(params: {
608
- projectId: string
609
- objectTypeId: string
610
- primaryId: string
611
- }): Promise<ObjectRow | null> {
612
- const bucket = this.rows.get(objectRowKey(params.projectId, params.objectTypeId))
613
- if (!bucket) return null
614
- return bucket.get(params.primaryId) ?? null
615
- }
616
-
617
- async listLinks(params: {
618
- projectId: string
619
- objectTypeId: string
620
- objectId: string
621
- linkId?: string
622
- direction?: LinkDirection
623
- }): Promise<readonly ObjectLinkRow[]> {
624
- const direction = params.direction ?? "outgoing"
625
- const matches = (row: ObjectLinkRow) => !params.linkId || row.linkId === params.linkId
626
- const rows: ObjectLinkRow[] = []
627
-
628
- if (direction === "outgoing" || direction === "both") {
629
- const bucket = this.links.get(
630
- sourceLinkBucketKey(params.projectId, params.objectTypeId, params.objectId)
631
- )
632
- if (bucket) rows.push(...[...bucket.values()].filter(matches))
633
- }
634
-
635
- if (direction === "incoming" || direction === "both") {
636
- for (const bucket of this.links.values()) {
637
- for (const row of bucket.values()) {
638
- if (
639
- row.projectId === params.projectId &&
640
- row.targetTypeId === params.objectTypeId &&
641
- row.targetId === params.objectId &&
642
- matches(row)
643
- ) {
644
- rows.push(row)
645
- }
646
- }
647
- }
648
- }
649
-
650
- if (direction !== "both") return rows
651
- return [...new Map(rows.map((row) => [fullLinkRowKey(row), row])).values()]
652
- }
653
-
654
- async getByPrimaryIdBatch(params: {
655
- projectId: string
656
- items: readonly { objectTypeId: string; primaryId: string }[]
657
- }): Promise<Map<ObjectBatchKey, ObjectRow>> {
658
- const result = new Map<ObjectBatchKey, ObjectRow>()
659
- for (const item of params.items) {
660
- const row = await this.getByPrimaryId({
661
- projectId: params.projectId,
662
- objectTypeId: item.objectTypeId,
663
- primaryId: item.primaryId,
664
- })
665
- if (row) {
666
- result.set(objectBatchKey(item.objectTypeId, item.primaryId), row)
667
- }
668
- }
669
- return result
670
- }
671
-
672
- async listLinksBatch(params: {
673
- projectId: string
674
- items: readonly { objectTypeId: string; objectId: string; linkId: string }[]
675
- }): Promise<Map<LinkBatchKey, ObjectLinkRow[]>> {
676
- const result = new Map<LinkBatchKey, ObjectLinkRow[]>()
677
- for (const item of params.items) {
678
- const rows = await this.listLinks({
679
- projectId: params.projectId,
680
- objectTypeId: item.objectTypeId,
681
- objectId: item.objectId,
682
- linkId: item.linkId,
683
- })
684
- if (rows.length > 0) {
685
- result.set(linkBatchKey(item.objectTypeId, item.objectId, item.linkId), [...rows])
686
- }
687
- }
688
- return result
689
- }
690
-
691
- async queryLinks(params: QueryObjectLinksInput): Promise<QueryObjectLinksResult> {
692
- assertLinkQueryLimit(params.limit)
693
- if (params.objectRefs.length === 0 || params.endpointObjectTypeIds?.length === 0) {
694
- return { links: [], hasMore: false }
695
- }
696
-
697
- const allowedTypes = params.endpointObjectTypeIds
698
- ? new Set(params.endpointObjectTypeIds)
699
- : undefined
700
- const deduped = new Map<string, ObjectLinkRow>()
701
- for (const object of params.objectRefs) {
702
- const rows = await this.listLinks({
703
- projectId: params.projectId,
704
- objectTypeId: object.objectTypeId,
705
- objectId: object.primaryId,
706
- direction: params.direction,
707
- ...(params.linkId === undefined ? {} : { linkId: params.linkId }),
708
- })
709
- for (const row of rows) {
710
- if (
711
- allowedTypes &&
712
- (!allowedTypes.has(row.sourceTypeId) || !allowedTypes.has(row.targetTypeId))
713
- ) {
714
- continue
715
- }
716
- if (params.after && compareObjectLinkCursors(objectLinkCursor(row), params.after) <= 0) {
717
- continue
718
- }
719
- deduped.set(fullLinkRowKey(row), row)
720
- }
721
- }
722
-
723
- const rows = [...deduped.values()].sort(compareObjectLinks).slice(0, params.limit + 1)
724
- return { links: rows.slice(0, params.limit), hasMore: rows.length > params.limit }
725
- }
726
-
727
- async listIncidentLinksBatch(params: {
728
- projectId: string
729
- items: readonly { objectTypeId: string; objectId: string }[]
730
- }): Promise<readonly ObjectLinkRow[]> {
731
- const deduped = new Map<string, ObjectLinkRow>()
732
- for (const item of params.items) {
733
- const rows = await this.listLinks({
734
- projectId: params.projectId,
735
- objectTypeId: item.objectTypeId,
736
- objectId: item.objectId,
737
- direction: "both",
738
- })
739
- for (const row of rows) {
740
- deduped.set(fullLinkRowKey(row), row)
741
- }
742
- }
743
- return [...deduped.values()]
744
- }
745
-
746
- async listByPrimaryIdPage(params: {
747
- projectId: string
748
- objectTypeId: string
749
- afterPrimaryId?: string
750
- limit: number
751
- }): Promise<{ objects: readonly ObjectRow[]; nextPrimaryId?: string }> {
752
- assertReconciliationPageLimit(params.limit)
753
- const bucket = this.rows.get(objectRowKey(params.projectId, params.objectTypeId))
754
- const rows = [...(bucket?.values() ?? [])]
755
- .filter(
756
- (row) => !params.afterPrimaryId || compareStrings(row.primaryId, params.afterPrimaryId) > 0
757
- )
758
- .sort((left, right) => compareStrings(left.primaryId, right.primaryId))
759
- .slice(0, params.limit + 1)
760
- const hasMore = rows.length > params.limit
761
- const objects = rows.slice(0, params.limit).map((row) => structuredClone(row))
762
- const last = objects.at(-1)
763
- return {
764
- objects,
765
- ...(hasMore && last ? { nextPrimaryId: last.primaryId } : {}),
766
- }
767
- }
768
-
769
- async list(params: {
770
- projectId: string
771
- objectTypeId?: string | readonly string[]
772
- primaryIdPrefix?: string
773
- primaryIdSuffix?: string
774
- updatedAfter?: Date
775
- updatedBefore?: Date
776
- createdAfter?: Date
777
- createdBefore?: Date
778
- limit?: number
779
- offset?: number
780
- orderBy?: "createdAt" | "updatedAt" | "primaryId"
781
- order?: "asc" | "desc"
782
- }): Promise<{ objects: readonly ObjectRow[]; hasMore: boolean; total: number }> {
783
- let allRows: ObjectRow[] = []
784
-
785
- if (params.objectTypeId) {
786
- const typeIds = Array.isArray(params.objectTypeId)
787
- ? params.objectTypeId
788
- : [params.objectTypeId]
789
- for (const typeId of typeIds) {
790
- const bucket = this.rows.get(objectRowKey(params.projectId, typeId))
791
- if (bucket) {
792
- allRows.push(...bucket.values())
793
- }
794
- }
795
- } else {
796
- for (const [key, bucket] of this.rows) {
797
- if (key.startsWith(objectRowProjectPrefix(params.projectId))) {
798
- allRows.push(...bucket.values())
799
- }
800
- }
801
- }
802
-
803
- const {
804
- primaryIdPrefix,
805
- primaryIdSuffix,
806
- updatedAfter,
807
- updatedBefore,
808
- createdAfter,
809
- createdBefore,
810
- } = params
811
- if (
812
- primaryIdPrefix ||
813
- primaryIdSuffix ||
814
- updatedAfter ||
815
- updatedBefore ||
816
- createdAfter ||
817
- createdBefore
818
- ) {
819
- allRows = allRows.filter(
820
- (row) =>
821
- (!primaryIdPrefix || row.primaryId.startsWith(primaryIdPrefix)) &&
822
- (!primaryIdSuffix || row.primaryId.endsWith(primaryIdSuffix)) &&
823
- (!updatedAfter || row.updatedAt >= updatedAfter) &&
824
- (!updatedBefore || row.updatedAt <= updatedBefore) &&
825
- (!createdAfter || row.createdAt >= createdAfter) &&
826
- (!createdBefore || row.createdAt <= createdBefore)
827
- )
828
- }
829
-
830
- const total = allRows.length
831
-
832
- const offset = params.offset ?? 0
833
- const limit = params.limit ?? 50
834
- if (limit === 0) return { objects: [], hasMore: offset < total, total }
835
-
836
- const orderBy = params.orderBy ?? "updatedAt"
837
- const order = params.order ?? "desc"
838
-
839
- allRows.sort((a, b) => {
840
- let comparison = 0
841
- switch (orderBy) {
842
- case "primaryId":
843
- comparison = a.primaryId.localeCompare(b.primaryId)
844
- break
845
- case "createdAt":
846
- comparison = a.createdAt.getTime() - b.createdAt.getTime()
847
- break
848
- default:
849
- comparison = a.updatedAt.getTime() - b.updatedAt.getTime()
850
- break
851
- }
852
- return order === "desc" ? -comparison : comparison
853
- })
854
-
855
- const objects = allRows.slice(offset, offset + limit)
856
- const hasMore = offset + limit < total
857
-
858
- return { objects, hasMore, total }
859
- }
860
-
861
- private deleteObjectRow(projectId: string, objectTypeId: string, primaryId: string): void {
862
- const bucket = this.rows.get(objectRowKey(projectId, objectTypeId))
863
- bucket?.delete(primaryId)
864
- }
865
-
866
- private deleteLinkRow(
867
- projectId: string,
868
- sourceTypeId: string,
869
- sourceId: string,
870
- linkId: string,
871
- targetTypeId: string,
872
- targetId: string
873
- ): void {
874
- const bucket = this.links.get(sourceLinkBucketKey(projectId, sourceTypeId, sourceId))
875
- bucket?.delete(linkRowKey(linkId, targetTypeId, targetId))
876
- }
877
- }
878
-
879
- function assertReconciliationPageLimit(limit: number): void {
880
- if (!Number.isSafeInteger(limit) || limit <= 0) {
881
- throw new Error("Object reconciliation page limit must be a positive safe integer.")
882
- }
883
- }
884
-
885
- function cloneObjectBuckets(
886
- rows: Map<string, Map<string, ObjectRow>>
887
- ): Map<string, Map<string, ObjectRow>> {
888
- const clone = new Map<string, Map<string, ObjectRow>>()
889
- for (const [key, bucket] of rows) {
890
- clone.set(
891
- key,
892
- new Map([...bucket.entries()].map(([primaryId, row]) => [primaryId, structuredClone(row)]))
893
- )
894
- }
895
- return clone
896
- }
897
-
898
- function cloneLinkBuckets(
899
- links: Map<string, Map<string, ObjectLinkRow>>
900
- ): Map<string, Map<string, ObjectLinkRow>> {
901
- const clone = new Map<string, Map<string, ObjectLinkRow>>()
902
- for (const [key, bucket] of links) {
903
- clone.set(
904
- key,
905
- new Map([...bucket.entries()].map(([linkId, row]) => [linkId, structuredClone(row)]))
906
- )
907
- }
908
- return clone
909
- }
910
-
911
- function completeEvaluation(entries: QueryEntry[]): QueryEvaluation {
912
- return {
913
- entries,
914
- total: entries.length,
915
- hasMore: false,
916
- }
917
- }
918
-
919
- function matchesPredicate(row: ObjectRow, predicate: ObjectQueryPredicate): boolean {
920
- switch (predicate.op) {
921
- case "and":
922
- return predicate.items.every((item) => matchesPredicate(row, item))
923
- case "or":
924
- return predicate.items.some((item) => matchesPredicate(row, item))
925
- case "not":
926
- return !matchesPredicate(row, predicate.item)
927
- case "eq":
928
- return queryScalarValuesEqual(
929
- row.properties[predicate.propertyId],
930
- predicate.value,
931
- predicate.scalarKind
932
- )
933
- case "neq":
934
- return !queryScalarValuesEqual(
935
- row.properties[predicate.propertyId],
936
- predicate.value,
937
- predicate.scalarKind
938
- )
939
- case "lt":
940
- return (
941
- compareQueryScalarValues(
942
- row.properties[predicate.propertyId],
943
- predicate.value,
944
- predicate.scalarKind
945
- ) < 0
946
- )
947
- case "lte":
948
- return (
949
- compareQueryScalarValues(
950
- row.properties[predicate.propertyId],
951
- predicate.value,
952
- predicate.scalarKind
953
- ) <= 0
954
- )
955
- case "gt":
956
- return (
957
- compareQueryScalarValues(
958
- row.properties[predicate.propertyId],
959
- predicate.value,
960
- predicate.scalarKind
961
- ) > 0
962
- )
963
- case "gte":
964
- return (
965
- compareQueryScalarValues(
966
- row.properties[predicate.propertyId],
967
- predicate.value,
968
- predicate.scalarKind
969
- ) >= 0
970
- )
971
- case "in":
972
- return predicate.values.some((value) =>
973
- queryScalarValuesEqual(row.properties[predicate.propertyId], value, predicate.scalarKind)
974
- )
975
- case "exists": {
976
- const exists =
977
- Object.hasOwn(row.properties, predicate.propertyId) &&
978
- row.properties[predicate.propertyId] !== undefined
979
- return predicate.value ? exists : !exists
980
- }
981
- case "contains":
982
- return containsValue(row.properties[predicate.propertyId], predicate.value)
983
- }
984
- }
985
-
986
- function containsValue(actual: unknown, expected: unknown): boolean {
987
- if (typeof actual === "string" && typeof expected === "string") {
988
- return actual.includes(expected)
989
- }
990
-
991
- if (Array.isArray(actual)) {
992
- return actual.some((item) => queryScalarValuesEqual(item, expected))
993
- }
994
-
995
- if (isPlainObject(actual) && typeof expected === "string") {
996
- return Object.hasOwn(actual, expected)
997
- }
998
-
999
- return false
1000
- }
1001
-
1002
- function textScore(
1003
- row: ObjectRow,
1004
- query: string,
1005
- fields: readonly string[] | undefined,
1006
- fieldsByObjectType: Readonly<Record<string, readonly string[]>> | undefined
1007
- ): number {
1008
- const terms = tokenize(query)
1009
- if (terms.length === 0) return 0
1010
-
1011
- const scopedFields = fields ?? fieldsByObjectType?.[row.objectTypeId]
1012
- const values = fields
1013
- ? fields.flatMap((field) => collectTextValues(row.properties[field]))
1014
- : scopedFields
1015
- ? scopedFields.flatMap((field) => collectTextValues(row.properties[field]))
1016
- : [row.primaryId, ...Object.values(row.properties).flatMap(collectTextValues)]
1017
- const haystack = values.join(" ").toLowerCase()
1018
- if (!terms.every((term) => haystack.includes(term))) return 0
1019
-
1020
- const phrase = query.trim().toLowerCase()
1021
- const phraseBoost = phrase.length > 0 && haystack.includes(phrase) ? terms.length : 0
1022
- return terms.reduce((score, term) => score + countOccurrences(haystack, term), phraseBoost)
1023
- }
1024
-
1025
- function tokenize(query: string): string[] {
1026
- return query
1027
- .trim()
1028
- .toLowerCase()
1029
- .split(/\s+/)
1030
- .filter((term) => term.length > 0)
1031
- }
1032
-
1033
- function collectTextValues(value: unknown): string[] {
1034
- if (typeof value === "string") return [value]
1035
- if (Array.isArray(value)) return value.flatMap(collectTextValues)
1036
- return []
1037
- }
1038
-
1039
- function countOccurrences(value: string, needle: string): number {
1040
- if (!needle) return 0
1041
- let count = 0
1042
- let index = value.indexOf(needle)
1043
- while (index !== -1) {
1044
- count += 1
1045
- index = value.indexOf(needle, index + needle.length)
1046
- }
1047
- return count
1048
- }
1049
-
1050
- function vectorSimilarity(actual: unknown, expected: readonly number[]): number | null {
1051
- if (!Array.isArray(actual) || actual.length !== expected.length || actual.length === 0) {
1052
- return null
1053
- }
1054
-
1055
- let dot = 0
1056
- let actualNorm = 0
1057
- let expectedNorm = 0
1058
- for (let index = 0; index < expected.length; index += 1) {
1059
- const actualValue = actual[index]
1060
- const expectedValue = expected[index]
1061
- if (
1062
- typeof actualValue !== "number" ||
1063
- typeof expectedValue !== "number" ||
1064
- !Number.isFinite(actualValue) ||
1065
- !Number.isFinite(expectedValue)
1066
- ) {
1067
- return null
1068
- }
1069
-
1070
- dot += actualValue * expectedValue
1071
- actualNorm += actualValue * actualValue
1072
- expectedNorm += expectedValue * expectedValue
1073
- }
1074
-
1075
- if (actualNorm === 0 || expectedNorm === 0) return null
1076
- return dot / (Math.sqrt(actualNorm) * Math.sqrt(expectedNorm))
1077
- }
1078
-
1079
- function sortEntries(
1080
- entries: readonly QueryEntry[],
1081
- fields: readonly ObjectQuerySortField[]
1082
- ): QueryEntry[] {
1083
- return [...entries].sort((left, right) => {
1084
- for (const field of fields) {
1085
- const comparison = compareSortField(left, right, field)
1086
- if (comparison !== 0) return comparison
1087
- }
1088
- return (
1089
- left.order - right.order || rowIdentityKey(left.row).localeCompare(rowIdentityKey(right.row))
1090
- )
1091
- })
1092
- }
1093
-
1094
- function compareSortField(
1095
- left: QueryEntry,
1096
- right: QueryEntry,
1097
- field: ObjectQuerySortField
1098
- ): number {
1099
- if (field.kind === "relevance") {
1100
- const direction = field.direction ?? "desc"
1101
- const comparison = right.score - left.score
1102
- return direction === "desc" ? comparison : -comparison
1103
- }
1104
-
1105
- const leftValue = left.row.properties[field.propertyId]
1106
- const rightValue = right.row.properties[field.propertyId]
1107
- const leftMissing = leftValue === undefined || leftValue === null
1108
- const rightMissing = rightValue === undefined || rightValue === null
1109
- if (leftMissing && rightMissing) return 0
1110
- if (leftMissing) return 1
1111
- if (rightMissing) return -1
1112
-
1113
- const comparison = compareQueryScalarValues(leftValue, rightValue, field.scalarKind)
1114
- if (Number.isNaN(comparison)) return 0
1115
- return field.direction === "desc" ? -comparison : comparison
1116
- }
1117
-
1118
- function compareEntriesByRelevance(left: QueryEntry, right: QueryEntry): number {
1119
- return (
1120
- right.score - left.score || rowIdentityKey(left.row).localeCompare(rowIdentityKey(right.row))
1121
- )
1122
- }
1123
-
1124
- function projectRow(row: ObjectRow, properties: readonly string[]): ObjectRow {
1125
- const projected: Record<string, unknown> = {}
1126
- for (const propertyId of properties) {
1127
- if (Object.hasOwn(row.properties, propertyId)) {
1128
- projected[propertyId] = row.properties[propertyId]
1129
- }
1130
- }
1131
- return {
1132
- ...row,
1133
- properties: projected,
1134
- }
1135
- }
1136
-
1137
- function stripOuterRowShape(query: ObjectQuery): ObjectQuery {
1138
- switch (query.kind) {
1139
- case "limit":
1140
- case "page":
1141
- case "project":
1142
- case "sort":
1143
- // `expand` is output-shaping: aggregates ignore it (it never changes which
1144
- // objects match).
1145
- case "expand":
1146
- return stripOuterRowShape(query.input)
1147
- default:
1148
- return query
1149
- }
1150
- }
1151
-
1152
- function buildFacetResults(
1153
- rows: readonly ObjectRow[],
1154
- facets: readonly ObjectFacetRequest[]
1155
- ): ObjectFacetResult[] {
1156
- return facets.map((facet) => ({
1157
- propertyId: facet.propertyId,
1158
- buckets: buildFacetBuckets(rows, facet),
1159
- }))
1160
- }
1161
-
1162
- function buildFacetBuckets(
1163
- rows: readonly ObjectRow[],
1164
- facet: ObjectFacetRequest
1165
- ): ObjectFacetResult["buckets"] {
1166
- const buckets = new Map<string, { value: unknown; count: number }>()
1167
-
1168
- for (const row of rows) {
1169
- if (!Object.hasOwn(row.properties, facet.propertyId)) continue
1170
- const value = row.properties[facet.propertyId]
1171
- if (value === undefined) continue
1172
- const key = facetValueKey(value)
1173
- const existing = buckets.get(key)
1174
- if (existing) {
1175
- existing.count += 1
1176
- } else {
1177
- buckets.set(key, { value, count: 1 })
1178
- }
1179
- }
1180
-
1181
- return [...buckets.values()]
1182
- .sort(
1183
- (left, right) =>
1184
- right.count - left.count ||
1185
- facetValueSortKey(left.value).localeCompare(facetValueSortKey(right.value))
1186
- )
1187
- .slice(0, facet.limit)
1188
- }
1189
-
1190
- function facetValueKey(value: unknown): string {
1191
- return JSON.stringify(value) ?? String(value)
1192
- }
1193
-
1194
- function facetValueSortKey(value: unknown): string {
1195
- return JSON.stringify(value) ?? String(value)
1196
- }
1197
-
1198
- function rowIdentityKey(row: ObjectRow): string {
1199
- return rowIdentityKeyParts(row.objectTypeId, row.primaryId)
1200
- }
1201
-
1202
- function rowIdentityKeyParts(objectTypeId: string, primaryId: string): string {
1203
- return objectBatchKey(objectTypeId, primaryId)
1204
- }
1205
-
1206
- function upsertEntry(entriesByKey: Map<string, QueryEntry>, entry: QueryEntry): void {
1207
- const key = rowIdentityKey(entry.row)
1208
- const existing = entriesByKey.get(key)
1209
- if (!existing) {
1210
- entriesByKey.set(key, entry)
1211
- return
1212
- }
1213
-
1214
- if (entry.score > existing.score) {
1215
- entriesByKey.set(key, {
1216
- ...existing,
1217
- score: entry.score,
1218
- })
1219
- }
1220
- }
1221
-
1222
- function encodePageOffset(offset: number): string {
1223
- return `${PAGE_TOKEN_PREFIX}${offset}`
1224
- }
1225
-
1226
- function decodePageOffset(token: string | undefined): number {
1227
- if (!token) return 0
1228
- if (!token.startsWith(PAGE_TOKEN_PREFIX)) {
1229
- throw new Error("[Sixb] Invalid object query page token")
1230
- }
1231
-
1232
- const offset = Number(token.slice(PAGE_TOKEN_PREFIX.length))
1233
- if (!Number.isInteger(offset) || offset < 0) {
1234
- throw new Error("[Sixb] Invalid object query page token")
1235
- }
1236
- return offset
1237
- }
1238
-
1239
- function isPlainObject(value: unknown): value is Record<string, unknown> {
1240
- return typeof value === "object" && value !== null && !Array.isArray(value)
1241
- }