@sixb/core 0.1.11 → 0.1.12

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 (641) hide show
  1. package/dist/actions/builders/params.d.ts +1 -22
  2. package/dist/actions/builders/params.d.ts.map +1 -1
  3. package/dist/actions/index.js +29 -28
  4. package/dist/actions/index.js.map +1 -1
  5. package/dist/actions/types/params.d.ts +10 -44
  6. package/dist/actions/types/params.d.ts.map +1 -1
  7. package/dist/actions/validation.d.ts.map +1 -1
  8. package/dist/actions/worker.js +3 -2
  9. package/dist/actions/worker.js.map +2 -2
  10. package/dist/agents/errors.d.ts +1 -1
  11. package/dist/agents/errors.d.ts.map +1 -1
  12. package/dist/agents/execution.d.ts +15 -9
  13. package/dist/agents/execution.d.ts.map +1 -1
  14. package/dist/agents/ids.d.ts +2 -0
  15. package/dist/agents/ids.d.ts.map +1 -1
  16. package/dist/agents/index.d.ts +1 -1
  17. package/dist/agents/index.d.ts.map +1 -1
  18. package/dist/agents/index.js +48 -42
  19. package/dist/agents/index.js.map +1 -1
  20. package/dist/agents/request.d.ts.map +1 -1
  21. package/dist/agents/sandbox.d.ts +5 -0
  22. package/dist/agents/sandbox.d.ts.map +1 -0
  23. package/dist/agents/streams/index.js +4 -3
  24. package/dist/agents/streams/index.js.map +1 -1
  25. package/dist/agents/streams/internal.js +4 -3
  26. package/dist/agents/streams/internal.js.map +1 -1
  27. package/dist/agents/validation.d.ts.map +1 -1
  28. package/dist/auth/index.js +8 -6
  29. package/dist/auth/index.js.map +1 -1
  30. package/dist/authorization/index.js +5 -4
  31. package/dist/authorization/index.js.map +1 -1
  32. package/dist/bootstrap/index.js +50 -46
  33. package/dist/bootstrap/index.js.map +1 -1
  34. package/dist/{chunk-17kfctj6.js → chunk-0mza4xb2.js} +2 -2
  35. package/dist/{chunk-g00bfdq6.js → chunk-2cxv584m.js} +12 -56
  36. package/dist/{chunk-g00bfdq6.js.map → chunk-2cxv584m.js.map} +3 -3
  37. package/dist/{chunk-jsy70480.js → chunk-2h63nrde.js} +365 -95
  38. package/dist/chunk-2h63nrde.js.map +20 -0
  39. package/dist/{chunk-1yefycb1.js → chunk-3bnt2wna.js} +2 -2
  40. package/dist/{chunk-awbhdqyc.js → chunk-3ghw2t5q.js} +1 -1
  41. package/dist/{chunk-b19g04jk.js → chunk-3h7ctayx.js} +1 -1
  42. package/dist/{chunk-wjasrj67.js → chunk-3qpcrcj8.js} +1 -1
  43. package/dist/{chunk-5hz0fnca.js → chunk-4k53sm9e.js} +6 -2
  44. package/dist/chunk-4k53sm9e.js.map +12 -0
  45. package/dist/chunk-4ph94nhd.js +81 -0
  46. package/dist/chunk-4ph94nhd.js.map +10 -0
  47. package/dist/chunk-58geavnf.js +29 -0
  48. package/dist/chunk-58geavnf.js.map +10 -0
  49. package/dist/{chunk-0y39rgsb.js → chunk-5tetw4hn.js} +1 -1
  50. package/dist/{chunk-7bs40fe1.js → chunk-69266efg.js} +83 -2
  51. package/dist/chunk-69266efg.js.map +12 -0
  52. package/dist/{chunk-a0e6x5hd.js → chunk-6ma8dvzc.js} +121 -53
  53. package/dist/chunk-6ma8dvzc.js.map +15 -0
  54. package/dist/{chunk-skz0hst3.js → chunk-7c2g3sz9.js} +6 -86
  55. package/dist/{chunk-skz0hst3.js.map → chunk-7c2g3sz9.js.map} +3 -3
  56. package/dist/{chunk-z0s4axeh.js → chunk-7qnvhtcd.js} +93 -17
  57. package/dist/{chunk-z0s4axeh.js.map → chunk-7qnvhtcd.js.map} +7 -6
  58. package/dist/{chunk-c5rkjrgp.js → chunk-7ytf06d3.js} +1 -1
  59. package/dist/{chunk-mrp7k0pw.js → chunk-91kcnbf0.js} +9 -14
  60. package/dist/chunk-91kcnbf0.js.map +10 -0
  61. package/dist/{chunk-yv79ncbv.js → chunk-96yw3pwd.js} +3 -3
  62. package/dist/chunk-96yw3pwd.js.map +10 -0
  63. package/dist/chunk-98cw09sw.js.map +2 -2
  64. package/dist/{chunk-93csa55g.js → chunk-axndsymr.js} +10 -4
  65. package/dist/chunk-axndsymr.js.map +11 -0
  66. package/dist/{chunk-4zhmdsx6.js → chunk-b768c93y.js} +61 -23
  67. package/dist/{chunk-4zhmdsx6.js.map → chunk-b768c93y.js.map} +5 -5
  68. package/dist/{chunk-dz5h08xv.js → chunk-bbaa1fet.js} +24 -9
  69. package/dist/{chunk-dz5h08xv.js.map → chunk-bbaa1fet.js.map} +4 -4
  70. package/dist/{chunk-7apz6hg4.js → chunk-bet1rb9h.js} +8 -4
  71. package/dist/chunk-bet1rb9h.js.map +10 -0
  72. package/dist/{chunk-358caqf5.js → chunk-bfjv1adk.js} +2 -2
  73. package/dist/{chunk-g91qxjj0.js → chunk-bg2bs62d.js} +5 -5
  74. package/dist/{chunk-860dwwy0.js → chunk-cd234ba4.js} +22 -12
  75. package/dist/chunk-cd234ba4.js.map +14 -0
  76. package/dist/chunk-dmn70ztd.js.map +2 -2
  77. package/dist/{chunk-d63nnr5b.js → chunk-e1f1sqba.js} +39 -53
  78. package/dist/{chunk-d63nnr5b.js.map → chunk-e1f1sqba.js.map} +5 -6
  79. package/dist/{chunk-ap0g1g74.js → chunk-eyjzgav0.js} +39 -4
  80. package/dist/chunk-eyjzgav0.js.map +12 -0
  81. package/dist/{chunk-rb1xx120.js → chunk-f06sf7rr.js} +9 -5
  82. package/dist/chunk-f06sf7rr.js.map +11 -0
  83. package/dist/{chunk-g6cke204.js → chunk-f85hpqnm.js} +1 -1
  84. package/dist/{chunk-vsj3mdfj.js → chunk-fc5zfxy1.js} +1 -1
  85. package/dist/{chunk-38zv5rkr.js → chunk-g2gezsg5.js} +1 -1
  86. package/dist/{chunk-38zv5rkr.js.map → chunk-g2gezsg5.js.map} +2 -2
  87. package/dist/{chunk-01kj2pbh.js → chunk-g50nxqs5.js} +53 -66
  88. package/dist/chunk-g50nxqs5.js.map +18 -0
  89. package/dist/{chunk-1824gssz.js → chunk-gswwr35f.js} +4 -4
  90. package/dist/{chunk-92vk7gta.js → chunk-gzt6v1ja.js} +1 -1
  91. package/dist/{chunk-aa6z4a19.js → chunk-hgqpcmyr.js} +2 -1
  92. package/dist/chunk-hgqpcmyr.js.map +12 -0
  93. package/dist/{chunk-gqh45d2n.js → chunk-hkw8rykk.js} +2 -2
  94. package/dist/{chunk-f4w3yp4f.js → chunk-hzw7yv5g.js} +104 -21
  95. package/dist/chunk-hzw7yv5g.js.map +13 -0
  96. package/dist/{chunk-cfvakeax.js → chunk-jjwhy3rs.js} +5 -5
  97. package/dist/chunk-kept9cdd.js +29 -0
  98. package/dist/chunk-kept9cdd.js.map +10 -0
  99. package/dist/{chunk-ftv470j8.js → chunk-m7cx05vp.js} +247 -16
  100. package/dist/{chunk-ftv470j8.js.map → chunk-m7cx05vp.js.map} +14 -10
  101. package/dist/{chunk-z0271qkp.js → chunk-mdnw7nj8.js} +8 -6
  102. package/dist/chunk-mdnw7nj8.js.map +15 -0
  103. package/dist/{chunk-gq8vhakp.js → chunk-nzsy3xrp.js} +249 -86
  104. package/dist/{chunk-gq8vhakp.js.map → chunk-nzsy3xrp.js.map} +13 -11
  105. package/dist/chunk-p1683c0v.js +104 -0
  106. package/dist/chunk-p1683c0v.js.map +11 -0
  107. package/dist/chunk-p6r1ex7t.js +93 -0
  108. package/dist/chunk-p6r1ex7t.js.map +10 -0
  109. package/dist/{chunk-sepyxgpc.js → chunk-qm535afa.js} +10 -10
  110. package/dist/{chunk-sepyxgpc.js.map → chunk-qm535afa.js.map} +4 -4
  111. package/dist/chunk-r5zythxp.js +552 -0
  112. package/dist/chunk-r5zythxp.js.map +17 -0
  113. package/dist/{chunk-9qsh3p5y.js → chunk-rb143ggb.js} +1 -1
  114. package/dist/{chunk-653vwrzr.js → chunk-rdghfsss.js} +1 -1
  115. package/dist/{chunk-3ckk0xfj.js → chunk-sfypc7mk.js} +18 -13
  116. package/dist/{chunk-3ckk0xfj.js.map → chunk-sfypc7mk.js.map} +3 -3
  117. package/dist/{chunk-f0rwz2vh.js → chunk-t6f3tdnr.js} +2 -54
  118. package/dist/chunk-t6f3tdnr.js.map +10 -0
  119. package/dist/{chunk-x9m9x2eq.js → chunk-t7dzd1tm.js} +3 -3
  120. package/dist/{chunk-pr2h4bv4.js → chunk-tg4g4zh0.js} +3 -3
  121. package/dist/chunk-vpxss818.js +56 -0
  122. package/dist/chunk-vpxss818.js.map +10 -0
  123. package/dist/{chunk-ms2tmn1k.js → chunk-vsg0g7h9.js} +53 -57
  124. package/dist/chunk-vsg0g7h9.js.map +17 -0
  125. package/dist/{chunk-8vj0rjgs.js → chunk-wjffn5m4.js} +1 -1
  126. package/dist/{chunk-wf88w4kp.js → chunk-x9tmx3fc.js} +2 -2
  127. package/dist/{chunk-fh8kgex1.js → chunk-xn686q2e.js} +8 -8
  128. package/dist/{chunk-g53f0e4j.js → chunk-xnx96gfy.js} +45 -17
  129. package/dist/{chunk-g53f0e4j.js.map → chunk-xnx96gfy.js.map} +3 -3
  130. package/dist/{chunk-v2vcg0w6.js → chunk-xtfryrfb.js} +2 -2
  131. package/dist/chunk-y0v18c2j.js +363 -0
  132. package/dist/chunk-y0v18c2j.js.map +14 -0
  133. package/dist/{chunk-72w2pxk7.js → chunk-y1ahv8b7.js} +11 -3
  134. package/dist/{chunk-72w2pxk7.js.map → chunk-y1ahv8b7.js.map} +3 -3
  135. package/dist/chunk-y3ev53cq.js +84 -0
  136. package/dist/chunk-y3ev53cq.js.map +10 -0
  137. package/dist/{chunk-gqm76kse.js → chunk-ybhz3j9g.js} +342 -41
  138. package/dist/{chunk-gqm76kse.js.map → chunk-ybhz3j9g.js.map} +17 -12
  139. package/dist/{chunk-z30bv4ga.js → chunk-yxb4c62x.js} +3 -2
  140. package/dist/{chunk-z30bv4ga.js.map → chunk-yxb4c62x.js.map} +3 -3
  141. package/dist/chunk-z3y5kg1x.js +14 -0
  142. package/dist/chunk-z3y5kg1x.js.map +10 -0
  143. package/dist/datasets/validation.d.ts +4 -0
  144. package/dist/datasets/validation.d.ts.map +1 -1
  145. package/dist/datasets/write.d.ts.map +1 -1
  146. package/dist/datasets/write.js +5 -4
  147. package/dist/datasets/write.js.map +1 -1
  148. package/dist/error-reporting/capability.d.ts +3 -2
  149. package/dist/error-reporting/capability.d.ts.map +1 -1
  150. package/dist/error-reporting/internal.js +5 -4
  151. package/dist/error-reporting/internal.js.map +1 -1
  152. package/dist/error-reporting/reports.d.ts +10 -0
  153. package/dist/error-reporting/reports.d.ts.map +1 -1
  154. package/dist/error-reporting/types.d.ts +10 -2
  155. package/dist/error-reporting/types.d.ts.map +1 -1
  156. package/dist/errors/catalog.d.ts +12 -0
  157. package/dist/errors/catalog.d.ts.map +1 -1
  158. package/dist/errors/failure-message.d.ts +8 -0
  159. package/dist/errors/failure-message.d.ts.map +1 -0
  160. package/dist/errors/internal.d.ts.map +1 -1
  161. package/dist/errors/internal.js +3 -2
  162. package/dist/errors/internal.js.map +1 -1
  163. package/dist/events/index.js +5 -4
  164. package/dist/events/index.js.map +1 -1
  165. package/dist/execution/agent.js +44 -41
  166. package/dist/execution/agent.js.map +1 -1
  167. package/dist/execution/authorization.d.ts.map +1 -1
  168. package/dist/execution/authorized-object-reader.d.ts +3 -0
  169. package/dist/execution/authorized-object-reader.d.ts.map +1 -1
  170. package/dist/execution/kernel-operation.d.ts +4 -0
  171. package/dist/execution/kernel-operation.d.ts.map +1 -0
  172. package/dist/execution/primitive.js +44 -41
  173. package/dist/execution/primitive.js.map +2 -2
  174. package/dist/execution/request.js +45 -42
  175. package/dist/execution/request.js.map +2 -2
  176. package/dist/execution/types.d.ts +6 -0
  177. package/dist/execution/types.d.ts.map +1 -1
  178. package/dist/index.d.ts +15 -5
  179. package/dist/index.d.ts.map +1 -1
  180. package/dist/index.js +68 -59
  181. package/dist/index.js.map +1 -1
  182. package/dist/lake-storage/in-memory.d.ts.map +1 -1
  183. package/dist/lake-storage/index.js +5 -4
  184. package/dist/lake-storage/index.js.map +1 -1
  185. package/dist/materialization/errors.d.ts +1 -1
  186. package/dist/materialization/errors.d.ts.map +1 -1
  187. package/dist/materialization/index.d.ts +1 -0
  188. package/dist/materialization/index.d.ts.map +1 -1
  189. package/dist/materialization/index.js +3 -3
  190. package/dist/materialization/model.d.ts +2 -0
  191. package/dist/materialization/model.d.ts.map +1 -1
  192. package/dist/materialization/vectors.d.ts +19 -0
  193. package/dist/materialization/vectors.d.ts.map +1 -0
  194. package/dist/materializer/context.d.ts.map +1 -1
  195. package/dist/materializer/edits/commit.d.ts.map +1 -1
  196. package/dist/materializer/edits/vector-authority.d.ts +6 -0
  197. package/dist/materializer/edits/vector-authority.d.ts.map +1 -0
  198. package/dist/materializer/edits/vectors.d.ts +6 -0
  199. package/dist/materializer/edits/vectors.d.ts.map +1 -0
  200. package/dist/materializer/effective/validate.d.ts.map +1 -1
  201. package/dist/materializer/effective/vector-indexing.d.ts +7 -0
  202. package/dist/materializer/effective/vector-indexing.d.ts.map +1 -0
  203. package/dist/materializer/effective/vectors.d.ts +6 -0
  204. package/dist/materializer/effective/vectors.d.ts.map +1 -0
  205. package/dist/materializer/execution/work-executor.d.ts +2 -1
  206. package/dist/materializer/execution/work-executor.d.ts.map +1 -1
  207. package/dist/materializer/index.js +26 -25
  208. package/dist/materializer/index.js.map +1 -1
  209. package/dist/materializer/shared/normalize.d.ts.map +1 -1
  210. package/dist/models/catalog-index.d.ts +15 -0
  211. package/dist/models/catalog-index.d.ts.map +1 -0
  212. package/dist/models/catalog.d.ts +27 -6
  213. package/dist/models/catalog.d.ts.map +1 -1
  214. package/dist/models/decision/catalog.d.ts +12 -0
  215. package/dist/models/decision/catalog.d.ts.map +1 -0
  216. package/dist/models/decision/errors.d.ts +7 -0
  217. package/dist/models/decision/errors.d.ts.map +1 -0
  218. package/dist/models/decision/output.d.ts +50 -0
  219. package/dist/models/decision/output.d.ts.map +1 -0
  220. package/dist/models/decision/questions.d.ts +14 -0
  221. package/dist/models/decision/questions.d.ts.map +1 -0
  222. package/dist/models/decision/runtime.d.ts +7 -0
  223. package/dist/models/decision/runtime.d.ts.map +1 -0
  224. package/dist/models/decision/types.d.ts +92 -0
  225. package/dist/models/decision/types.d.ts.map +1 -0
  226. package/dist/models/decision/validation.d.ts +7 -0
  227. package/dist/models/decision/validation.d.ts.map +1 -0
  228. package/dist/models/definitions.d.ts +1 -1
  229. package/dist/models/definitions.d.ts.map +1 -1
  230. package/dist/models/embedding-model.d.ts +60 -0
  231. package/dist/models/embedding-model.d.ts.map +1 -0
  232. package/dist/models/execution/binding.d.ts +2 -0
  233. package/dist/models/execution/binding.d.ts.map +1 -1
  234. package/dist/models/execution/embedding.d.ts +5 -0
  235. package/dist/models/execution/embedding.d.ts.map +1 -0
  236. package/dist/models/execution/index.js +29 -26
  237. package/dist/models/execution/index.js.map +1 -1
  238. package/dist/models/execution/model-call-recorder.d.ts +5 -1
  239. package/dist/models/execution/model-call-recorder.d.ts.map +1 -1
  240. package/dist/models/execution/session.d.ts +21 -0
  241. package/dist/models/execution/session.d.ts.map +1 -0
  242. package/dist/models/execution.d.ts.map +1 -1
  243. package/dist/models/generation-types.d.ts +2 -0
  244. package/dist/models/generation-types.d.ts.map +1 -1
  245. package/dist/models/index.d.ts +9 -1
  246. package/dist/models/index.d.ts.map +1 -1
  247. package/dist/models/index.js +17 -7
  248. package/dist/models/index.js.map +1 -1
  249. package/dist/models/pricing.d.ts +3 -2
  250. package/dist/models/pricing.d.ts.map +1 -1
  251. package/dist/objects/authorized-ontology-view.d.ts.map +1 -1
  252. package/dist/objects/execution.d.ts +1 -0
  253. package/dist/objects/execution.d.ts.map +1 -1
  254. package/dist/objects/index.js +29 -28
  255. package/dist/objects/index.js.map +1 -1
  256. package/dist/objects/query/executor.d.ts +3 -0
  257. package/dist/objects/query/executor.d.ts.map +1 -1
  258. package/dist/objects/query/index.d.ts +2 -0
  259. package/dist/objects/query/index.d.ts.map +1 -1
  260. package/dist/objects/query/index.js +34 -24
  261. package/dist/objects/query/index.js.map +1 -1
  262. package/dist/objects/query/ir.d.ts +6 -2
  263. package/dist/objects/query/ir.d.ts.map +1 -1
  264. package/dist/objects/query/normalize.d.ts.map +1 -1
  265. package/dist/objects/query/validate.d.ts.map +1 -1
  266. package/dist/objects/sdk/object-handle.d.ts +5 -0
  267. package/dist/objects/sdk/object-handle.d.ts.map +1 -1
  268. package/dist/objects/sdk/object-set.d.ts.map +1 -1
  269. package/dist/objects/sdk/query-executor.d.ts +2 -0
  270. package/dist/objects/sdk/query-executor.d.ts.map +1 -1
  271. package/dist/objects/sdk/runtime-query-executor.d.ts.map +1 -1
  272. package/dist/objects/vectors/handle.d.ts +4 -0
  273. package/dist/objects/vectors/handle.d.ts.map +1 -0
  274. package/dist/objects/vectors/indexing-batch.d.ts +6 -0
  275. package/dist/objects/vectors/indexing-batch.d.ts.map +1 -0
  276. package/dist/objects/vectors/indexing-generate.d.ts +11 -0
  277. package/dist/objects/vectors/indexing-generate.d.ts.map +1 -0
  278. package/dist/objects/vectors/indexing-runtime.d.ts +7 -0
  279. package/dist/objects/vectors/indexing-runtime.d.ts.map +1 -0
  280. package/dist/objects/vectors/indexing-shared.d.ts +17 -0
  281. package/dist/objects/vectors/indexing-shared.d.ts.map +1 -0
  282. package/dist/objects/vectors/indexing-single.d.ts +4 -0
  283. package/dist/objects/vectors/indexing-single.d.ts.map +1 -0
  284. package/dist/objects/vectors/indexing-store-batch.d.ts +6 -0
  285. package/dist/objects/vectors/indexing-store-batch.d.ts.map +1 -0
  286. package/dist/objects/vectors/indexing.d.ts +7 -0
  287. package/dist/objects/vectors/indexing.d.ts.map +1 -0
  288. package/dist/objects/vectors/profile.d.ts +13 -0
  289. package/dist/objects/vectors/profile.d.ts.map +1 -0
  290. package/dist/objects/vectors/query.d.ts +5 -0
  291. package/dist/objects/vectors/query.d.ts.map +1 -0
  292. package/dist/objects/vectors/resolve-query.d.ts +6 -0
  293. package/dist/objects/vectors/resolve-query.d.ts.map +1 -0
  294. package/dist/objects/vectors/types.d.ts +11 -0
  295. package/dist/objects/vectors/types.d.ts.map +1 -0
  296. package/dist/ontology/index.d.ts +2 -1
  297. package/dist/ontology/index.d.ts.map +1 -1
  298. package/dist/ontology/index.js +5 -5
  299. package/dist/ontology/index.js.map +1 -1
  300. package/dist/ontology/internal.js +5 -4
  301. package/dist/ontology/internal.js.map +1 -1
  302. package/dist/ontology/registry.d.ts.map +1 -1
  303. package/dist/ontology/types.d.ts +8 -9
  304. package/dist/ontology/types.d.ts.map +1 -1
  305. package/dist/ontology/validation/definition.d.ts +3 -0
  306. package/dist/ontology/validation/definition.d.ts.map +1 -0
  307. package/dist/ontology/validation/properties.d.ts.map +1 -1
  308. package/dist/ontology/validation/query.d.ts.map +1 -1
  309. package/dist/ontology/validation/schema.d.ts +1 -1
  310. package/dist/ontology/validation/schema.d.ts.map +1 -1
  311. package/dist/ontology/vector-profiles.d.ts +4 -0
  312. package/dist/ontology/vector-profiles.d.ts.map +1 -0
  313. package/dist/pipelines/index.js +28 -27
  314. package/dist/pipelines/index.js.map +1 -1
  315. package/dist/projections/internal.js +24 -23
  316. package/dist/projections/internal.js.map +1 -1
  317. package/dist/query.js +2 -2
  318. package/dist/queues/in-memory.d.ts +2 -1
  319. package/dist/queues/in-memory.d.ts.map +1 -1
  320. package/dist/queues/index.d.ts +1 -1
  321. package/dist/queues/index.d.ts.map +1 -1
  322. package/dist/queues/index.js +1 -1
  323. package/dist/queues/types.d.ts +5 -0
  324. package/dist/queues/types.d.ts.map +1 -1
  325. package/dist/runtime/create.d.ts +4 -3
  326. package/dist/runtime/create.d.ts.map +1 -1
  327. package/dist/runtime/host.d.ts +9 -6
  328. package/dist/runtime/host.d.ts.map +1 -1
  329. package/dist/runtime/internal.d.ts +3 -0
  330. package/dist/runtime/internal.d.ts.map +1 -1
  331. package/dist/runtime/internal.js +47 -1
  332. package/dist/runtime/internal.js.map +1 -1
  333. package/dist/runtime/resolve-definitions.d.ts.map +1 -1
  334. package/dist/runtime/sixb.d.ts +9 -4
  335. package/dist/runtime/sixb.d.ts.map +1 -1
  336. package/dist/runtime/types.d.ts +15 -3
  337. package/dist/runtime/types.d.ts.map +1 -1
  338. package/dist/sandboxes/auth.d.ts +16 -0
  339. package/dist/sandboxes/auth.d.ts.map +1 -0
  340. package/dist/sandboxes/config.d.ts +5 -0
  341. package/dist/sandboxes/config.d.ts.map +1 -0
  342. package/dist/sandboxes/configuration.d.ts +41 -0
  343. package/dist/sandboxes/configuration.d.ts.map +1 -0
  344. package/dist/sandboxes/environment.d.ts +13 -0
  345. package/dist/sandboxes/environment.d.ts.map +1 -0
  346. package/dist/sandboxes/errors.d.ts +1 -1
  347. package/dist/sandboxes/errors.d.ts.map +1 -1
  348. package/dist/sandboxes/index.d.ts +6 -1
  349. package/dist/sandboxes/index.d.ts.map +1 -1
  350. package/dist/sandboxes/index.js +16 -3
  351. package/dist/sandboxes/index.js.map +1 -1
  352. package/dist/sandboxes/sandbox.d.ts +35 -3
  353. package/dist/sandboxes/sandbox.d.ts.map +1 -1
  354. package/dist/shared/params/builders.d.ts +25 -0
  355. package/dist/shared/params/builders.d.ts.map +1 -0
  356. package/dist/shared/params/types.d.ts +47 -0
  357. package/dist/shared/params/types.d.ts.map +1 -0
  358. package/dist/shared/params/validation.d.ts +15 -0
  359. package/dist/shared/params/validation.d.ts.map +1 -0
  360. package/dist/shares/internal.js +23 -22
  361. package/dist/shares/internal.js.map +2 -2
  362. package/dist/storage/action-runs/failure.js +4 -3
  363. package/dist/storage/action-runs/failure.js.map +1 -1
  364. package/dist/storage/action-runs/provider.js +1 -1
  365. package/dist/storage/agents/in-memory.d.ts +2 -1
  366. package/dist/storage/agents/in-memory.d.ts.map +1 -1
  367. package/dist/storage/agents/index.d.ts +1 -1
  368. package/dist/storage/agents/index.d.ts.map +1 -1
  369. package/dist/storage/agents/provider.d.ts +5 -1
  370. package/dist/storage/agents/provider.d.ts.map +1 -1
  371. package/dist/storage/agents/provider.js +8 -4
  372. package/dist/storage/agents/provider.js.map +1 -1
  373. package/dist/storage/agents/types.d.ts +49 -0
  374. package/dist/storage/agents/types.d.ts.map +1 -1
  375. package/dist/storage/ai-cost/analytics.d.ts +1 -0
  376. package/dist/storage/ai-cost/analytics.d.ts.map +1 -1
  377. package/dist/storage/ai-cost/index.d.ts +1 -1
  378. package/dist/storage/ai-cost/index.d.ts.map +1 -1
  379. package/dist/storage/ai-cost/provider.js +2 -2
  380. package/dist/storage/ai-cost/types.d.ts +14 -2
  381. package/dist/storage/ai-cost/types.d.ts.map +1 -1
  382. package/dist/storage/ai-limits/enforcement.js +4 -3
  383. package/dist/storage/ai-limits/enforcement.js.map +1 -1
  384. package/dist/storage/connector-connections/provider.js +3 -2
  385. package/dist/storage/connector-connections/provider.js.map +2 -2
  386. package/dist/storage/executions/provider.d.ts +3 -3
  387. package/dist/storage/executions/provider.d.ts.map +1 -1
  388. package/dist/storage/executions/provider.js +13 -11
  389. package/dist/storage/executions/provider.js.map +3 -3
  390. package/dist/storage/executions/types.d.ts +3 -0
  391. package/dist/storage/executions/types.d.ts.map +1 -1
  392. package/dist/storage/executions/validation.d.ts.map +1 -1
  393. package/dist/storage/index.d.ts +5 -3
  394. package/dist/storage/index.d.ts.map +1 -1
  395. package/dist/storage/index.js +25 -22
  396. package/dist/storage/index.js.map +1 -1
  397. package/dist/storage/internal.js +2 -2
  398. package/dist/storage/objects/in-memory/query.d.ts.map +1 -1
  399. package/dist/storage/objects/in-memory/read-source.d.ts +5 -0
  400. package/dist/storage/objects/in-memory/read-source.d.ts.map +1 -1
  401. package/dist/storage/objects/in-memory/selected-reader.d.ts.map +1 -1
  402. package/dist/storage/objects/in-memory/storage.d.ts +7 -0
  403. package/dist/storage/objects/in-memory/storage.d.ts.map +1 -1
  404. package/dist/storage/objects/types.d.ts +2 -0
  405. package/dist/storage/objects/types.d.ts.map +1 -1
  406. package/dist/storage/ontology/commits.d.ts +1 -0
  407. package/dist/storage/ontology/commits.d.ts.map +1 -1
  408. package/dist/storage/ontology/in-memory/index.d.ts +4 -0
  409. package/dist/storage/ontology/in-memory/index.d.ts.map +1 -1
  410. package/dist/storage/ontology/in-memory/materializations.d.ts +2 -0
  411. package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -1
  412. package/dist/storage/ontology/in-memory/shared-state.d.ts +7 -0
  413. package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -1
  414. package/dist/storage/ontology/in-memory/vector-indexing.d.ts +44 -0
  415. package/dist/storage/ontology/in-memory/vector-indexing.d.ts.map +1 -0
  416. package/dist/storage/ontology/in-memory/vectors.d.ts +31 -0
  417. package/dist/storage/ontology/in-memory/vectors.d.ts.map +1 -0
  418. package/dist/storage/ontology/index.d.ts +6 -0
  419. package/dist/storage/ontology/index.d.ts.map +1 -1
  420. package/dist/storage/ontology/provider.js +2 -2
  421. package/dist/storage/ontology/vector-indexing.d.ts +94 -0
  422. package/dist/storage/ontology/vector-indexing.d.ts.map +1 -0
  423. package/dist/storage/ontology/vectors.d.ts +56 -0
  424. package/dist/storage/ontology/vectors.d.ts.map +1 -0
  425. package/dist/storage/operation-scope.d.ts.map +1 -1
  426. package/dist/storage/operation-scope.js +1 -1
  427. package/dist/storage/projection-runs/provider.js +4 -3
  428. package/dist/storage/projection-runs/provider.js.map +1 -1
  429. package/dist/storage/types.d.ts +1 -1
  430. package/dist/storage/types.d.ts.map +1 -1
  431. package/dist/storage/workflow-runs/provider.js +9 -7
  432. package/dist/storage/workflow-runs/provider.js.map +1 -1
  433. package/dist/syncs/index.js +29 -28
  434. package/dist/syncs/index.js.map +1 -1
  435. package/dist/testing/agent-storage-contract.d.ts.map +1 -1
  436. package/dist/testing/ai-cost-storage-contract.d.ts.map +1 -1
  437. package/dist/testing/index.js +448 -69
  438. package/dist/testing/index.js.map +7 -7
  439. package/dist/testing/object-query-contract.d.ts.map +1 -1
  440. package/dist/testing/object-read-scope-contract.d.ts.map +1 -1
  441. package/dist/testing/queues-contract.d.ts.map +1 -1
  442. package/dist/webhooks/internal.js +24 -23
  443. package/dist/webhooks/internal.js.map +2 -2
  444. package/dist/workers/index.js +3 -2
  445. package/dist/workers/index.js.map +2 -2
  446. package/dist/workflows/failure.d.ts.map +1 -1
  447. package/dist/workflows/index.js +47 -43
  448. package/dist/workflows/index.js.map +1 -1
  449. package/package.json +1 -1
  450. package/src/actions/builders/params.ts +1 -48
  451. package/src/actions/types/params.ts +14 -74
  452. package/src/actions/validation.ts +7 -84
  453. package/src/agents/errors.ts +3 -0
  454. package/src/agents/execution.ts +67 -15
  455. package/src/agents/ids.ts +8 -0
  456. package/src/agents/index.ts +1 -0
  457. package/src/agents/request.ts +11 -0
  458. package/src/agents/sandbox.ts +44 -0
  459. package/src/agents/validation.ts +2 -108
  460. package/src/datasets/validation.ts +40 -11
  461. package/src/datasets/write.ts +8 -11
  462. package/src/error-reporting/capability.ts +11 -0
  463. package/src/error-reporting/reports.ts +23 -0
  464. package/src/error-reporting/types.ts +12 -1
  465. package/src/errors/catalog.ts +12 -0
  466. package/src/errors/failure-message.ts +15 -0
  467. package/src/errors/internal.ts +57 -25
  468. package/src/execution/authorization.ts +12 -5
  469. package/src/execution/authorized-object-reader.ts +37 -2
  470. package/src/execution/kernel-operation.ts +27 -0
  471. package/src/execution/scopes.ts +2 -0
  472. package/src/execution/types.ts +4 -4
  473. package/src/index.ts +60 -1
  474. package/src/lake-storage/in-memory.ts +5 -3
  475. package/src/materialization/errors.ts +2 -2
  476. package/src/materialization/index.ts +1 -0
  477. package/src/materialization/model.ts +2 -0
  478. package/src/materialization/vectors.ts +18 -0
  479. package/src/materializer/README.md +14 -0
  480. package/src/materializer/context.ts +10 -0
  481. package/src/materializer/edits/commit.ts +8 -1
  482. package/src/materializer/edits/vector-authority.ts +108 -0
  483. package/src/materializer/edits/vectors.ts +100 -0
  484. package/src/materializer/effective/validate.ts +10 -3
  485. package/src/materializer/effective/vector-indexing.ts +84 -0
  486. package/src/materializer/effective/vectors.ts +47 -0
  487. package/src/materializer/execution/work-executor.ts +11 -3
  488. package/src/materializer/projections/replace.ts +1 -1
  489. package/src/materializer/shared/normalize.ts +11 -0
  490. package/src/materializer/telemetry/append.ts +1 -1
  491. package/src/models/catalog-index.ts +38 -0
  492. package/src/models/catalog.ts +66 -38
  493. package/src/models/decision/catalog.ts +32 -0
  494. package/src/models/decision/errors.ts +18 -0
  495. package/src/models/decision/output.ts +101 -0
  496. package/src/models/decision/questions.ts +29 -0
  497. package/src/models/decision/runtime.ts +188 -0
  498. package/src/models/decision/types.ts +109 -0
  499. package/src/models/decision/validation.ts +335 -0
  500. package/src/models/definitions.ts +1 -1
  501. package/src/models/embedding-model.ts +129 -0
  502. package/src/models/execution/README.md +63 -0
  503. package/src/models/execution/binding.ts +2 -0
  504. package/src/models/execution/embedding.ts +133 -0
  505. package/src/models/execution/model-call-recorder.ts +42 -30
  506. package/src/models/execution/session.ts +81 -0
  507. package/src/models/execution.ts +10 -52
  508. package/src/models/generation-types.ts +2 -0
  509. package/src/models/index.ts +37 -0
  510. package/src/models/pricing.ts +1 -2
  511. package/src/objects/authorized-ontology-view.ts +12 -8
  512. package/src/objects/execution.ts +2 -0
  513. package/src/objects/query/executor.ts +13 -4
  514. package/src/objects/query/explain.ts +7 -2
  515. package/src/objects/query/index.ts +2 -0
  516. package/src/objects/query/ir.ts +6 -2
  517. package/src/objects/query/normalize.ts +5 -1
  518. package/src/objects/query/validate.ts +74 -73
  519. package/src/objects/sdk/object-handle.ts +3 -0
  520. package/src/objects/sdk/object-set.ts +1 -0
  521. package/src/objects/sdk/query-builder.ts +9 -3
  522. package/src/objects/sdk/query-executor.ts +2 -1
  523. package/src/objects/sdk/runtime-query-executor.ts +6 -2
  524. package/src/objects/vectors/README.md +59 -0
  525. package/src/objects/vectors/handle.ts +91 -0
  526. package/src/objects/vectors/indexing-batch.ts +163 -0
  527. package/src/objects/vectors/indexing-generate.ts +184 -0
  528. package/src/objects/vectors/indexing-runtime.ts +17 -0
  529. package/src/objects/vectors/indexing-shared.ts +188 -0
  530. package/src/objects/vectors/indexing-single.ts +51 -0
  531. package/src/objects/vectors/indexing-store-batch.ts +62 -0
  532. package/src/objects/vectors/indexing.ts +23 -0
  533. package/src/objects/vectors/profile.ts +64 -0
  534. package/src/objects/vectors/query.ts +16 -0
  535. package/src/objects/vectors/resolve-query.ts +89 -0
  536. package/src/objects/vectors/types.ts +10 -0
  537. package/src/ontology/index.ts +2 -0
  538. package/src/ontology/registry.ts +8 -0
  539. package/src/ontology/types.ts +9 -9
  540. package/src/ontology/validation/definition.ts +104 -0
  541. package/src/ontology/validation/properties.ts +14 -4
  542. package/src/ontology/validation/query.ts +34 -51
  543. package/src/ontology/validation/schema.ts +85 -23
  544. package/src/ontology/vector-profiles.ts +35 -0
  545. package/src/queues/in-memory.ts +5 -0
  546. package/src/queues/index.ts +1 -0
  547. package/src/queues/types.ts +10 -0
  548. package/src/runtime/create.ts +7 -6
  549. package/src/runtime/host.ts +42 -6
  550. package/src/runtime/internal.ts +3 -0
  551. package/src/runtime/resolve-definitions.ts +19 -1
  552. package/src/runtime/sixb.ts +27 -9
  553. package/src/runtime/types.ts +16 -4
  554. package/src/sandboxes/README.md +41 -0
  555. package/src/sandboxes/auth.ts +17 -0
  556. package/src/sandboxes/config.ts +37 -0
  557. package/src/sandboxes/configuration.ts +268 -0
  558. package/src/sandboxes/environment.ts +107 -0
  559. package/src/sandboxes/errors.ts +1 -1
  560. package/src/sandboxes/index.ts +15 -0
  561. package/src/sandboxes/sandbox.ts +38 -3
  562. package/src/shared/params/builders.ts +50 -0
  563. package/src/shared/params/types.ts +84 -0
  564. package/src/shared/params/validation.ts +114 -0
  565. package/src/storage/agents/in-memory.ts +25 -1
  566. package/src/storage/agents/index.ts +3 -0
  567. package/src/storage/agents/provider.ts +105 -0
  568. package/src/storage/agents/types.ts +54 -0
  569. package/src/storage/ai-cost/analytics.ts +59 -21
  570. package/src/storage/ai-cost/index.ts +1 -0
  571. package/src/storage/ai-cost/types.ts +19 -2
  572. package/src/storage/executions/provider.ts +24 -12
  573. package/src/storage/executions/types.ts +1 -0
  574. package/src/storage/executions/validation.ts +7 -3
  575. package/src/storage/index.ts +15 -1
  576. package/src/storage/objects/in-memory/query.ts +25 -11
  577. package/src/storage/objects/in-memory/read-scope.ts +9 -2
  578. package/src/storage/objects/in-memory/read-source.ts +5 -0
  579. package/src/storage/objects/in-memory/selected-reader.ts +5 -1
  580. package/src/storage/objects/in-memory/storage.ts +19 -1
  581. package/src/storage/objects/types.ts +2 -0
  582. package/src/storage/ontology/commits.ts +1 -0
  583. package/src/storage/ontology/in-memory/index.ts +20 -0
  584. package/src/storage/ontology/in-memory/materializations.ts +13 -0
  585. package/src/storage/ontology/in-memory/shared-state.ts +9 -0
  586. package/src/storage/ontology/in-memory/vector-indexing.ts +179 -0
  587. package/src/storage/ontology/in-memory/vectors.ts +73 -0
  588. package/src/storage/ontology/index.ts +14 -0
  589. package/src/storage/ontology/vector-indexing.ts +98 -0
  590. package/src/storage/ontology/vectors.ts +48 -0
  591. package/src/storage/operation-scope.ts +1 -0
  592. package/src/storage/types.ts +3 -0
  593. package/src/testing/agent-storage-contract.ts +246 -0
  594. package/src/testing/ai-cost-storage-contract.ts +134 -0
  595. package/src/testing/object-query-contract.ts +41 -25
  596. package/src/testing/object-read-scope-contract.ts +1 -5
  597. package/src/testing/queues-contract.ts +31 -0
  598. package/src/workflows/failure.ts +10 -4
  599. package/src/workflows/validation.ts +2 -2
  600. package/dist/chunk-01kj2pbh.js.map +0 -19
  601. package/dist/chunk-5hz0fnca.js.map +0 -12
  602. package/dist/chunk-7apz6hg4.js.map +0 -10
  603. package/dist/chunk-7bs40fe1.js.map +0 -12
  604. package/dist/chunk-860dwwy0.js.map +0 -14
  605. package/dist/chunk-93csa55g.js.map +0 -11
  606. package/dist/chunk-a0e6x5hd.js.map +0 -14
  607. package/dist/chunk-aa6z4a19.js.map +0 -12
  608. package/dist/chunk-ap0g1g74.js.map +0 -11
  609. package/dist/chunk-f0rwz2vh.js.map +0 -11
  610. package/dist/chunk-f4w3yp4f.js.map +0 -12
  611. package/dist/chunk-jsy70480.js.map +0 -15
  612. package/dist/chunk-mrp7k0pw.js.map +0 -10
  613. package/dist/chunk-ms2tmn1k.js.map +0 -17
  614. package/dist/chunk-rb1xx120.js.map +0 -11
  615. package/dist/chunk-yv79ncbv.js.map +0 -10
  616. package/dist/chunk-z0271qkp.js.map +0 -15
  617. package/dist/chunk-z3y411fq.js +0 -99
  618. package/dist/chunk-z3y411fq.js.map +0 -11
  619. /package/dist/{chunk-17kfctj6.js.map → chunk-0mza4xb2.js.map} +0 -0
  620. /package/dist/{chunk-1yefycb1.js.map → chunk-3bnt2wna.js.map} +0 -0
  621. /package/dist/{chunk-awbhdqyc.js.map → chunk-3ghw2t5q.js.map} +0 -0
  622. /package/dist/{chunk-b19g04jk.js.map → chunk-3h7ctayx.js.map} +0 -0
  623. /package/dist/{chunk-wjasrj67.js.map → chunk-3qpcrcj8.js.map} +0 -0
  624. /package/dist/{chunk-0y39rgsb.js.map → chunk-5tetw4hn.js.map} +0 -0
  625. /package/dist/{chunk-c5rkjrgp.js.map → chunk-7ytf06d3.js.map} +0 -0
  626. /package/dist/{chunk-358caqf5.js.map → chunk-bfjv1adk.js.map} +0 -0
  627. /package/dist/{chunk-g91qxjj0.js.map → chunk-bg2bs62d.js.map} +0 -0
  628. /package/dist/{chunk-g6cke204.js.map → chunk-f85hpqnm.js.map} +0 -0
  629. /package/dist/{chunk-vsj3mdfj.js.map → chunk-fc5zfxy1.js.map} +0 -0
  630. /package/dist/{chunk-1824gssz.js.map → chunk-gswwr35f.js.map} +0 -0
  631. /package/dist/{chunk-92vk7gta.js.map → chunk-gzt6v1ja.js.map} +0 -0
  632. /package/dist/{chunk-gqh45d2n.js.map → chunk-hkw8rykk.js.map} +0 -0
  633. /package/dist/{chunk-cfvakeax.js.map → chunk-jjwhy3rs.js.map} +0 -0
  634. /package/dist/{chunk-9qsh3p5y.js.map → chunk-rb143ggb.js.map} +0 -0
  635. /package/dist/{chunk-653vwrzr.js.map → chunk-rdghfsss.js.map} +0 -0
  636. /package/dist/{chunk-x9m9x2eq.js.map → chunk-t7dzd1tm.js.map} +0 -0
  637. /package/dist/{chunk-pr2h4bv4.js.map → chunk-tg4g4zh0.js.map} +0 -0
  638. /package/dist/{chunk-8vj0rjgs.js.map → chunk-wjffn5m4.js.map} +0 -0
  639. /package/dist/{chunk-wf88w4kp.js.map → chunk-x9tmx3fc.js.map} +0 -0
  640. /package/dist/{chunk-fh8kgex1.js.map → chunk-xn686q2e.js.map} +0 -0
  641. /package/dist/{chunk-v2vcg0w6.js.map → chunk-xtfryrfb.js.map} +0 -0
@@ -0,0 +1,15 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/objects/vectors/resolve-query.ts", "../src/objects/query/planner.ts", "../src/objects/query/validate.ts", "../src/objects/query/executor.ts", "../src/objects/query/explain.ts", "../src/objects/query/links.ts"],
4
+ "sourcesContent": [
5
+ "import type { EmbeddingModelCatalog } from \"../../models/catalog\"\nimport { type EmbeddingModel, sameEmbeddingModel } from \"../../models/embedding-model\"\nimport type { OntologyRegistry } from \"../../ontology\"\nimport { ObjectQueryExecutionError } from \"../query/errors\"\nimport type { ObjectQuery, ObjectQueryVector } from \"../query/ir\"\nimport { normalizeVector } from \"./profile\"\n\nconst QUERY_EMBEDDING_TIMEOUT_MS = 30_000\n\n/** Called only after query validation, authorization and provider planning have succeeded. */\nexport async function resolveVectorSearchText(\n query: ObjectQuery,\n ontology: OntologyRegistry,\n models: EmbeddingModelCatalog | undefined,\n signal?: AbortSignal\n): Promise<ObjectQuery> {\n if (query.kind === \"limit\" || query.kind === \"project\") {\n const input = await resolveVectorSearchText(query.input, ontology, models, signal)\n return { ...query, input }\n }\n if (query.kind !== \"vector\" || typeof query.vector !== \"string\") return query\n\n const model = resolveProfileEmbeddingModel(query, ontology, models)\n const vector = await embedSearchText(query.vector, model, signal)\n return { ...query, vector }\n}\n\nfunction resolveProfileEmbeddingModel(\n query: ObjectQueryVector,\n ontology: OntologyRegistry,\n models: EmbeddingModelCatalog | undefined\n): EmbeddingModel {\n let input = query.input\n while (input.kind === \"filter\") input = input.input\n if (input.kind !== \"start\" || !query.profile) {\n throw new ObjectQueryExecutionError(\n \"embedding_model_unavailable\",\n \"Vector search requires the embedding model registered for its profile.\"\n )\n }\n\n const profile = ontology.resolveObjectType(input.objectTypeId).search?.vectors?.[query.profile]\n if (!profile) {\n throw new ObjectQueryExecutionError(\n \"embedding_model_unavailable\",\n \"Vector search requires the embedding model registered for its profile.\"\n )\n }\n\n const model = models?.getByRef({\n provider: profile.model.providerId,\n modelId: profile.model.modelId,\n })?.model\n if (!model || !sameEmbeddingModel(model, profile.model)) {\n throw new ObjectQueryExecutionError(\n \"embedding_model_unavailable\",\n \"Vector search requires the embedding model registered for its profile.\"\n )\n }\n return model\n}\n\nasync function embedSearchText(\n text: string,\n model: EmbeddingModel,\n signal?: AbortSignal\n): Promise<readonly number[]> {\n const dimensions = model.definition.dimensions\n const timeout = AbortSignal.timeout(QUERY_EMBEDDING_TIMEOUT_MS)\n const requestSignal = signal ? AbortSignal.any([signal, timeout]) : timeout\n requestSignal.throwIfAborted()\n const result = await model.embed({ texts: [text], signal: requestSignal })\n requestSignal.throwIfAborted()\n\n if (!Array.isArray(result?.vectors) || result.vectors.length !== 1) {\n throw new ObjectQueryExecutionError(\n \"invalid_embedding_response\",\n \"Embedding model must return exactly one vector for the search text.\"\n )\n }\n try {\n return normalizeVector(result.vectors[0]!, dimensions)\n } catch {\n throw new ObjectQueryExecutionError(\n \"invalid_embedding_response\",\n \"Embedding model returned an invalid vector for the search profile.\"\n )\n }\n}\n",
6
+ "import type { ObjectQueryCapabilities, ObjectQueryScalarOperation } from \"../../storage\"\nimport type { ObjectQueryPlanningIssue } from \"./errors\"\nimport type { ObjectExpansion, ObjectQuery, ObjectQueryPredicate, ObjectQuerySortField } from \"./ir\"\n\nexport type ObjectQueryPlanMode = \"pushdown\" | \"fallback\" | \"rejected\"\nexport type ObjectQueryProviderOperation =\n | \"queryObjects\"\n | \"countObjects\"\n | \"existsObjects\"\n | \"facetObjects\"\n\nexport interface ObjectQueryPlan {\n mode: ObjectQueryPlanMode\n query: ObjectQuery\n providerIssues: readonly ObjectQueryPlanningIssue[]\n fallbackIssues: readonly ObjectQueryPlanningIssue[]\n issues: readonly ObjectQueryPlanningIssue[]\n fallback?: {\n maxRows: number\n requiresExplicitBound: boolean\n }\n}\n\nexport interface ObjectQueryPlanningOptions {\n capabilities: ObjectQueryCapabilities\n operation?: ObjectQueryProviderOperation\n hasQueryObjects?: boolean\n hasCountObjects?: boolean\n hasExistsObjects?: boolean\n hasFacetObjects?: boolean\n allowFallback?: boolean\n maxFallbackRows?: number\n requiresExplicitFallbackBound?: boolean\n}\n\nconst DEFAULT_MAX_FALLBACK_ROWS = 1_000\n\n// Fallback executes over ObjectStorage.list and is intentionally narrower than\n// provider pushdown. Complex semantics stay provider-owned and cannot become\n// accidental full scans.\nconst fallbackNodeKinds = new Set<ObjectQuery[\"kind\"]>([\n \"start\",\n \"refs\",\n \"filter\",\n \"sort\",\n \"limit\",\n \"page\",\n \"project\",\n \"expand\",\n])\n\nexport function planObjectQuery(\n query: ObjectQuery,\n options: ObjectQueryPlanningOptions\n): ObjectQueryPlan {\n const operation = options.operation ?? \"queryObjects\"\n // Providers get first refusal. Fallback is considered only after the provider\n // declares that pushdown is unavailable or incomplete for this query.\n const providerIssues = collectProviderIssues(query, options.capabilities, {\n operation,\n hasImplementation: hasProviderImplementation(operation, options),\n })\n\n if (providerIssues.length === 0) {\n return {\n mode: \"pushdown\",\n query,\n providerIssues,\n fallbackIssues: [],\n issues: [],\n }\n }\n\n const fallbackIssues = collectFallbackIssues(query, options)\n const issues = [...providerIssues, ...fallbackIssues]\n\n if (fallbackIssues.length === 0) {\n return {\n mode: \"fallback\",\n query,\n providerIssues,\n fallbackIssues,\n issues: [],\n fallback: {\n maxRows: options.maxFallbackRows ?? DEFAULT_MAX_FALLBACK_ROWS,\n requiresExplicitBound: options.requiresExplicitFallbackBound !== false,\n },\n }\n }\n\n return {\n mode: \"rejected\",\n query,\n providerIssues,\n fallbackIssues,\n issues,\n }\n}\n\nfunction collectProviderIssues(\n query: ObjectQuery,\n capabilities: ObjectQueryCapabilities,\n options: { operation: ObjectQueryProviderOperation; hasImplementation: boolean }\n): ObjectQueryPlanningIssue[] {\n const issues: ObjectQueryPlanningIssue[] = []\n\n // Capability maps are allowlists: missing flags mean unsupported.\n collectOperationProviderIssues(capabilities, options, issues)\n\n collectNodeProviderIssues(query, \"$\", capabilities, issues)\n return issues\n}\n\nfunction collectOperationProviderIssues(\n capabilities: ObjectQueryCapabilities,\n options: { operation: ObjectQueryProviderOperation; hasImplementation: boolean },\n issues: ObjectQueryPlanningIssue[]\n): void {\n const enabled =\n options.operation === \"queryObjects\"\n ? capabilities.queryObjects === true\n : options.operation === \"countObjects\"\n ? capabilities.countObjects === true\n : options.operation === \"existsObjects\"\n ? capabilities.existsObjects === true\n : capabilities.facetObjects === true\n\n if (!enabled) {\n const code = `${operationIssuePrefix(options.operation)}_not_enabled`\n addIssue(\n issues,\n \"$\",\n code,\n `Object storage capabilities do not enable ${options.operation} pushdown`\n )\n }\n\n if (options.hasImplementation) return\n\n const code = `${operationIssuePrefix(options.operation)}_not_implemented`\n addIssue(issues, \"$\", code, `Object storage does not implement ${options.operation}`)\n}\n\nfunction hasProviderImplementation(\n operation: ObjectQueryProviderOperation,\n options: ObjectQueryPlanningOptions\n): boolean {\n switch (operation) {\n case \"queryObjects\":\n return options.hasQueryObjects === true\n case \"countObjects\":\n return options.hasCountObjects === true\n case \"existsObjects\":\n return options.hasExistsObjects === true\n case \"facetObjects\":\n return options.hasFacetObjects === true\n }\n}\n\nfunction operationIssuePrefix(operation: ObjectQueryProviderOperation): string {\n switch (operation) {\n case \"queryObjects\":\n return \"query_objects\"\n case \"countObjects\":\n return \"count_objects\"\n case \"existsObjects\":\n return \"exists_objects\"\n case \"facetObjects\":\n return \"facet_objects\"\n }\n}\n\nfunction collectNodeProviderIssues(\n query: ObjectQuery,\n path: string,\n capabilities: ObjectQueryCapabilities,\n issues: ObjectQueryPlanningIssue[]\n): void {\n if (capabilities.nodes?.[query.kind] !== true) {\n addIssue(\n issues,\n path,\n \"query_node_not_supported\",\n `Provider does not support query node '${query.kind}'`\n )\n }\n\n switch (query.kind) {\n case \"start\":\n if (query.includeSubtypes === true && capabilities.features?.includeSubtypes !== true) {\n addIssue(\n issues,\n path,\n \"include_subtypes_not_supported\",\n \"Provider does not support start.includeSubtypes expansion\"\n )\n }\n return\n case \"refs\":\n return\n case \"filter\":\n collectPredicateProviderIssues(query.predicate, `${path}.predicate`, capabilities, issues)\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n case \"text\":\n case \"vector\":\n case \"project\":\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n case \"limit\":\n collectProviderMaxLimitIssues(query.limit, path, capabilities, issues)\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n case \"page\":\n collectProviderMaxPageSizeIssues(query.pageSize, path, capabilities, issues)\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n case \"traverse\":\n if (capabilities.traversalDirections?.[query.direction] !== true) {\n addIssue(\n issues,\n path,\n \"traversal_direction_not_supported\",\n `Provider does not support ${query.direction} traversal`\n )\n }\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n case \"set\":\n if (capabilities.setOps?.[query.op] !== true) {\n addIssue(\n issues,\n path,\n \"set_operation_not_supported\",\n `Provider does not support set operation '${query.op}'`\n )\n }\n query.inputs.forEach((input, index) => {\n collectNodeProviderIssues(input, `${path}.inputs[${index}]`, capabilities, issues)\n })\n return\n case \"sort\":\n query.fields.forEach((field, index) => {\n collectSortProviderIssues(field, `${path}.fields[${index}]`, capabilities, issues)\n })\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n case \"expand\":\n query.expansions.forEach((expansion, index) => {\n collectExpansionProviderIssues(\n expansion,\n `${path}.expansions[${index}]`,\n capabilities,\n issues\n )\n })\n collectNodeProviderIssues(query.input, `${path}.input`, capabilities, issues)\n return\n }\n}\n\n// An expansion only pushes down once core has resolved its cardinality; an\n// unresolved one (e.g. a polymorphic parent whose branches disagree) keeps the\n// whole query on the bounded fallback, which re-derives cardinality per row.\nfunction collectExpansionProviderIssues(\n expansion: ObjectExpansion,\n path: string,\n capabilities: ObjectQueryCapabilities,\n issues: ObjectQueryPlanningIssue[]\n): void {\n if (expansion.cardinality === undefined) {\n addIssue(\n issues,\n path,\n \"expand_cardinality_unresolved\",\n `Provider cannot push down expansion '${expansion.linkId}' without a resolved cardinality`\n )\n }\n\n expansion.orderBy?.forEach((field, index) => {\n collectSortProviderIssues(field, `${path}.orderBy[${index}]`, capabilities, issues)\n })\n\n expansion.expand?.forEach((nested, index) => {\n collectExpansionProviderIssues(nested, `${path}.expand[${index}]`, capabilities, issues)\n })\n}\n\nfunction collectPredicateProviderIssues(\n predicate: ObjectQueryPredicate,\n path: string,\n capabilities: ObjectQueryCapabilities,\n issues: ObjectQueryPlanningIssue[]\n): void {\n const scalarOperation = predicateScalarOperation(predicate)\n if (\n \"scalarKind\" in predicate &&\n predicate.scalarKind !== undefined &&\n scalarOperation !== undefined &&\n capabilities.scalarOperations?.[predicate.scalarKind]?.[scalarOperation] !== true\n ) {\n addIssue(\n issues,\n path,\n \"scalar_operation_not_supported\",\n `Provider does not support ${scalarOperation} for '${predicate.scalarKind}' values`\n )\n }\n\n if (capabilities.predicateOps?.[predicate.op] !== true) {\n addIssue(\n issues,\n path,\n \"predicate_operation_not_supported\",\n `Provider does not support predicate operation '${predicate.op}'`\n )\n }\n\n switch (predicate.op) {\n case \"and\":\n case \"or\":\n predicate.items.forEach((item, index) => {\n collectPredicateProviderIssues(item, `${path}.items[${index}]`, capabilities, issues)\n })\n return\n case \"not\":\n collectPredicateProviderIssues(predicate.item, `${path}.item`, capabilities, issues)\n return\n default:\n return\n }\n}\n\nfunction predicateScalarOperation(\n predicate: ObjectQueryPredicate\n): ObjectQueryScalarOperation | undefined {\n switch (predicate.op) {\n case \"eq\":\n case \"neq\":\n case \"in\":\n return \"equality\"\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\":\n return \"ordering\"\n default:\n return undefined\n }\n}\n\nfunction collectSortProviderIssues(\n field: ObjectQuerySortField,\n path: string,\n capabilities: ObjectQueryCapabilities,\n issues: ObjectQueryPlanningIssue[]\n): void {\n if (\n field.kind === \"property\" &&\n field.scalarKind !== undefined &&\n capabilities.scalarOperations?.[field.scalarKind]?.ordering !== true\n ) {\n addIssue(\n issues,\n path,\n \"scalar_operation_not_supported\",\n `Provider does not support ordering for '${field.scalarKind}' values`\n )\n }\n\n if (capabilities.sortKinds?.[field.kind] === true) return\n addIssue(\n issues,\n path,\n \"sort_kind_not_supported\",\n `Provider does not support sort kind '${field.kind}'`\n )\n}\n\nfunction collectProviderMaxLimitIssues(\n limit: number,\n path: string,\n capabilities: ObjectQueryCapabilities,\n issues: ObjectQueryPlanningIssue[]\n): void {\n const maxLimit = capabilities.limits?.maxLimit\n if (maxLimit === undefined) return\n\n if (!Number.isInteger(maxLimit) || maxLimit < 0) {\n addIssue(\n issues,\n path,\n \"invalid_provider_limit_capability\",\n \"Provider limit capability maxLimit must be a non-negative integer\"\n )\n return\n }\n\n if (limit > maxLimit) {\n addIssue(issues, path, \"provider_limit_too_large\", `Provider supports limit up to ${maxLimit}`)\n }\n}\n\nfunction collectProviderMaxPageSizeIssues(\n pageSize: number,\n path: string,\n capabilities: ObjectQueryCapabilities,\n issues: ObjectQueryPlanningIssue[]\n): void {\n const maxPageSize = capabilities.limits?.maxPageSize\n if (maxPageSize === undefined) return\n\n if (!Number.isInteger(maxPageSize) || maxPageSize <= 0) {\n addIssue(\n issues,\n path,\n \"invalid_provider_page_size_capability\",\n \"Provider limit capability maxPageSize must be a positive integer\"\n )\n return\n }\n\n if (pageSize > maxPageSize) {\n addIssue(\n issues,\n path,\n \"provider_page_size_too_large\",\n `Provider supports pageSize up to ${maxPageSize}`\n )\n }\n}\n\nfunction collectFallbackIssues(\n query: ObjectQuery,\n options: ObjectQueryPlanningOptions\n): ObjectQueryPlanningIssue[] {\n const issues: ObjectQueryPlanningIssue[] = []\n\n if (options.allowFallback === false) {\n addIssue(issues, \"$\", \"fallback_disabled\", \"Object query fallback is disabled\")\n return issues\n }\n\n const maxFallbackRows = options.maxFallbackRows ?? DEFAULT_MAX_FALLBACK_ROWS\n if (!Number.isInteger(maxFallbackRows) || maxFallbackRows <= 0) {\n addIssue(issues, \"$\", \"invalid_fallback_bound\", \"maxFallbackRows must be a positive integer\")\n }\n\n // The result bound protects API callers from unbounded fallback responses.\n // The executor still enforces maxFallbackRows on the source scan separately.\n if (options.requiresExplicitFallbackBound !== false && !hasExplicitResultBound(query)) {\n addIssue(\n issues,\n \"$\",\n \"fallback_requires_bound\",\n \"Fallback requires an explicit limit or page node\"\n )\n }\n\n collectFallbackNodeIssues(query, \"$\", issues)\n return issues\n}\n\nfunction collectFallbackNodeIssues(\n query: ObjectQuery,\n path: string,\n issues: ObjectQueryPlanningIssue[]\n): void {\n if (!fallbackNodeKinds.has(query.kind)) {\n addIssue(\n issues,\n path,\n \"fallback_node_not_supported\",\n `Fallback does not support query node '${query.kind}'`\n )\n }\n\n switch (query.kind) {\n case \"start\":\n case \"refs\":\n return\n case \"filter\":\n case \"limit\":\n case \"page\":\n case \"project\":\n case \"expand\":\n collectFallbackNodeIssues(query.input, `${path}.input`, issues)\n return\n case \"sort\":\n query.fields.forEach((field, index) => {\n if (field.kind === \"relevance\") {\n addIssue(\n issues,\n `${path}.fields[${index}]`,\n \"fallback_sort_kind_not_supported\",\n \"Fallback does not support relevance sorting\"\n )\n }\n })\n collectFallbackNodeIssues(query.input, `${path}.input`, issues)\n return\n case \"text\":\n case \"vector\":\n case \"traverse\":\n collectFallbackNodeIssues(query.input, `${path}.input`, issues)\n return\n case \"set\":\n query.inputs.forEach((input, index) => {\n collectFallbackNodeIssues(input, `${path}.inputs[${index}]`, issues)\n })\n return\n }\n}\n\nfunction hasExplicitResultBound(query: ObjectQuery): boolean {\n switch (query.kind) {\n case \"limit\":\n case \"page\":\n case \"refs\":\n return true\n case \"start\":\n return false\n case \"set\":\n return query.inputs.some(hasExplicitResultBound)\n default:\n return hasExplicitResultBound(query.input)\n }\n}\n\nfunction addIssue(\n issues: ObjectQueryPlanningIssue[],\n path: string,\n code: string,\n message: string\n): void {\n issues.push({ path, code, message })\n}\n",
7
+ "import type {\n ObjectRef,\n ObjectType,\n OntologyRegistry,\n Property,\n Schema,\n ValueType,\n} from \"../../ontology\"\nimport { normalizeDecimalValue } from \"../../ontology\"\nimport { formatUnknownObjectTypeMessage } from \"../../ontology/errors\"\nimport { validatePropertyValue, validateSchemaValue } from \"../../ontology/validation\"\nimport { MAX_VECTOR_K, normalizeVector, vectorConfiguration } from \"../vectors/profile\"\nimport { hasVectorProfile, isVectorProfileQuery } from \"../vectors/query\"\nimport { ObjectQueryValidationError } from \"./errors\"\nimport type {\n ObjectExpansion,\n ObjectQuery,\n ObjectQueryDirection,\n ObjectQueryPredicate,\n ObjectQueryResultShape,\n ObjectQuerySetOperation,\n ObjectQuerySortField,\n ObjectQueryVector,\n QueryScalarKind,\n} from \"./ir\"\nimport { normalizeObjectQuery } from \"./normalize\"\n\nexport interface ObjectQueryValidationIssue {\n path: string\n code: string\n message: string\n}\n\nexport interface ValidatedObjectQuery {\n query: ObjectQuery\n result: ObjectQueryResultShape\n /** Every object type the query touches, including intermediate traversal types. */\n touchedObjectTypeIds: readonly string[]\n}\n\nexport interface ObjectQueryValidationOptions {\n ontology: OntologyRegistry\n maxLimit?: number\n maxPageSize?: number\n maxRefs?: number\n normalize?: boolean\n}\n\n/** Opaque semantic state carried by the canonical query validator for an internal admission. */\nexport type ObjectQueryAdmissionState = object\n\nexport type ObjectQueryPropertyUse =\n | \"filter\"\n | \"text\"\n | \"vector\"\n | \"sort\"\n | \"project\"\n | \"expand.orderBy\"\n | \"facet\"\n\nexport type ObjectQueryEdgeUse = \"traverse\" | \"expand\" | \"queryLinks\"\n\nexport interface ObjectQueryAdmissionTransition {\n readonly state: ObjectQueryAdmissionState\n /** Recorded during the walk and raised only after ordinary validation succeeds. */\n readonly denial?: Error\n}\n\n/**\n * Internal semantic admission reducer driven by the canonical query validator.\n *\n * It deliberately has no AST visitor: validation owns recursion through query nodes, predicates,\n * and expansions, while an admission only reduces the semantic sources, properties, edges, and\n * set operations it observes.\n */\nexport interface ObjectQuerySemanticAdmission {\n empty(): ObjectQueryAdmissionState\n source(input: {\n readonly kind: \"start\" | \"refs\"\n readonly result: ObjectQueryResultShape\n readonly objectTypeId?: string\n readonly refs?: readonly ObjectRef[]\n readonly path: string\n }): ObjectQueryAdmissionTransition\n property(input: {\n readonly state: ObjectQueryAdmissionState\n readonly propertyId: string\n readonly objectTypeId?: string\n readonly use: ObjectQueryPropertyUse\n readonly path: string\n }): Error | undefined\n edge(input: {\n readonly state: ObjectQueryAdmissionState\n /** Ontology-resolved shape after following this edge. */\n readonly result: ObjectQueryResultShape\n readonly linkId: string\n readonly direction: ObjectQueryDirection\n readonly sourceObjectTypeId?: string\n readonly use: ObjectQueryEdgeUse\n readonly path: string\n }): ObjectQueryAdmissionTransition\n set(input: {\n readonly op: ObjectQuerySetOperation\n readonly states: readonly ObjectQueryAdmissionState[]\n readonly path: string\n }): ObjectQueryAdmissionState\n}\n\nexport interface AdmittedObjectQuery extends ValidatedObjectQuery {\n /** Root provenance for terminal-specific checks such as facets and physical link queries. */\n admissionState: ObjectQueryAdmissionState\n}\n\ntype QueryValidationContext = Required<\n Pick<ObjectQueryValidationOptions, \"maxLimit\" | \"maxPageSize\" | \"maxRefs\">\n> & {\n ontology: OntologyRegistry\n valueTypesById: ReadonlyMap<string, ValueType>\n issues: ObjectQueryValidationIssue[]\n touchedObjectTypeIds: Set<string>\n admission: ObjectQuerySemanticAdmission\n admissionDenials: Error[]\n}\n\ninterface QueryNodeValidation {\n result: ObjectQueryResultShape\n query: ObjectQuery\n}\n\ninterface QueryValidationResult extends QueryNodeValidation {\n admissionState: ObjectQueryAdmissionState\n}\n\ninterface TextFieldResolution {\n fieldsByObjectType?: Record<string, string[]>\n}\n\nconst DEFAULT_MAX_LIMIT = 1_000\nconst DEFAULT_MAX_PAGE_SIZE = 1_000\nconst DEFAULT_MAX_REFS = 1_000\n\nconst NOOP_ADMISSION_STATE = Object.freeze({})\nconst NOOP_QUERY_ADMISSION: ObjectQuerySemanticAdmission = Object.freeze({\n empty: () => NOOP_ADMISSION_STATE,\n source: () => ({ state: NOOP_ADMISSION_STATE }),\n property: () => undefined,\n edge: (input: Parameters<ObjectQuerySemanticAdmission[\"edge\"]>[0]) => ({\n state: input.state,\n }),\n set: (input: Parameters<ObjectQuerySemanticAdmission[\"set\"]>[0]) =>\n input.states[0] ?? NOOP_ADMISSION_STATE,\n})\n\nexport function validateObjectQuery(\n query: ObjectQuery,\n options: ObjectQueryValidationOptions\n): ValidatedObjectQuery {\n const admitted = validateObjectQueryWithAdmission(query, options, NOOP_QUERY_ADMISSION)\n return {\n query: admitted.query,\n result: admitted.result,\n touchedObjectTypeIds: admitted.touchedObjectTypeIds,\n }\n}\n\n/**\n * Validate and semantically admit one query in the same canonical walk.\n *\n * This is an internal direct-file API. It is intentionally absent from public query barrels.\n */\nexport function validateObjectQueryWithAdmission(\n query: ObjectQuery,\n options: ObjectQueryValidationOptions,\n admission: ObjectQuerySemanticAdmission\n): AdmittedObjectQuery {\n const normalized = options.normalize === false ? query : normalizeObjectQuery(query)\n const ctx = createValidationContext(options, admission)\n validateVectorComposition(query, ctx)\n const validation = validateQueryNode(normalized, \"$\", ctx)\n\n if (ctx.issues.length > 0) {\n throw new ObjectQueryValidationError(ctx.issues)\n }\n const denial = ctx.admissionDenials[0]\n if (denial) throw denial\n\n return {\n query: validation.query,\n result: validation.result,\n touchedObjectTypeIds: [...ctx.touchedObjectTypeIds],\n admissionState: validation.admissionState,\n }\n}\n\nexport function collectObjectQueryValidationIssues(\n query: ObjectQuery,\n options: ObjectQueryValidationOptions\n): readonly ObjectQueryValidationIssue[] {\n const normalized = options.normalize === false ? query : normalizeObjectQuery(query)\n const ctx = createValidationContext(options, NOOP_QUERY_ADMISSION)\n validateVectorComposition(query, ctx)\n validateQueryNode(normalized, \"$\", ctx)\n return ctx.issues\n}\n\nexport function resolveObjectQueryResultShape(\n query: ObjectQuery,\n options: ObjectQueryValidationOptions\n): ObjectQueryResultShape {\n return validateObjectQuery(query, options).result\n}\n\nfunction validateVectorComposition(query: ObjectQuery, ctx: QueryValidationContext): void {\n if (hasVectorProfile(query) && !isVectorProfileQuery(query))\n ctx.issues.push({\n path: \"$\",\n code: \"vector.composition\",\n message:\n \"Vector profiles support one top-k over one concrete type, with filters before ranking and optional limit/project after it.\",\n })\n}\n\nfunction createValidationContext(\n options: ObjectQueryValidationOptions,\n admission: ObjectQuerySemanticAdmission\n): QueryValidationContext {\n return {\n ontology: options.ontology,\n valueTypesById: options.ontology.getValueTypesById(),\n maxLimit: options.maxLimit ?? DEFAULT_MAX_LIMIT,\n maxPageSize: options.maxPageSize ?? DEFAULT_MAX_PAGE_SIZE,\n maxRefs: options.maxRefs ?? DEFAULT_MAX_REFS,\n issues: [],\n touchedObjectTypeIds: new Set<string>(),\n admission,\n admissionDenials: [],\n }\n}\n\nfunction validateQueryNode(\n query: ObjectQuery,\n path: string,\n ctx: QueryValidationContext\n): QueryValidationResult {\n const validation = dispatchQueryNode(query, path, ctx)\n\n // Record every intermediate result shape so callers can authorize all\n // object types a query touches, not just the types it returns.\n for (const objectTypeId of validation.result.objectTypeIds) {\n ctx.touchedObjectTypeIds.add(objectTypeId)\n }\n\n return validation\n}\n\nfunction dispatchQueryNode(\n query: ObjectQuery,\n path: string,\n ctx: QueryValidationContext\n): QueryValidationResult {\n switch (query.kind) {\n case \"start\": {\n const validation = validateStart(query.objectTypeId, query.includeSubtypes, path, ctx)\n return {\n ...validation,\n admissionState: admitTransition(\n ctx,\n ctx.admission.source({\n kind: \"start\",\n result: validation.result,\n objectTypeId: query.objectTypeId,\n path,\n })\n ),\n }\n }\n case \"refs\": {\n const validation = validateRefs(query.refs, path, ctx)\n return {\n ...validation,\n admissionState: admitTransition(\n ctx,\n ctx.admission.source({\n kind: \"refs\",\n result: validation.result,\n refs: validation.query.kind === \"refs\" ? validation.query.refs : query.refs,\n path,\n })\n ),\n }\n }\n case \"filter\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n const predicate = validatePredicate(\n query.predicate,\n input.result,\n input.admissionState,\n `${path}.predicate`,\n ctx\n )\n return {\n result: input.result,\n query: { ...query, input: input.query, predicate },\n admissionState: input.admissionState,\n }\n }\n case \"text\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n const textFields = validateTextQuery(\n query.query,\n query.fields,\n input.result,\n input.admissionState,\n path,\n ctx\n )\n return {\n result: input.result,\n query: {\n ...query,\n input: input.query,\n fields: query.fields,\n fieldsByObjectType: query.fields ? undefined : textFields.fieldsByObjectType,\n },\n admissionState: input.admissionState,\n }\n }\n case \"vector\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n return {\n result: input.result,\n query: validateVectorProfileQuery(\n { ...query, input: input.query },\n input.result,\n input.admissionState,\n path,\n ctx\n ),\n admissionState: input.admissionState,\n }\n }\n case \"traverse\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n const result = validateTraverse(\n query.linkId,\n query.direction,\n query.sourceObjectTypeId,\n input.result,\n path,\n ctx\n )\n return {\n result,\n query: { ...query, input: input.query },\n admissionState: admitTransition(\n ctx,\n ctx.admission.edge({\n state: input.admissionState,\n result,\n linkId: query.linkId,\n direction: query.direction,\n sourceObjectTypeId: query.sourceObjectTypeId,\n use: \"traverse\",\n path,\n })\n ),\n }\n }\n case \"set\":\n return validateSet(query.inputs, query.op, path, ctx)\n case \"sort\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n const fields = validateSortFields(\n query.fields,\n input.result,\n input.admissionState,\n \"sort\",\n path,\n ctx\n )\n return {\n result: input.result,\n query: { ...query, input: input.query, fields },\n admissionState: input.admissionState,\n }\n }\n case \"limit\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n validateLimit(query.limit, path, ctx)\n return {\n result: input.result,\n query: { ...query, input: input.query },\n admissionState: input.admissionState,\n }\n }\n case \"page\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n validatePage(query.pageSize, query.pageToken, path, ctx)\n return {\n result: input.result,\n query: { ...query, input: input.query },\n admissionState: input.admissionState,\n }\n }\n case \"project\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n validateProjection(query.properties, input.result, input.admissionState, path, ctx)\n return {\n result: input.result,\n query: { ...query, input: input.query },\n admissionState: input.admissionState,\n }\n }\n case \"expand\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n // expand is output-shaping: it attaches links without changing the matched\n // set, so the result type is the input's result type.\n const expansions = validateExpansions(\n query.expansions,\n input.result,\n input.admissionState,\n `${path}.expansions`,\n ctx\n )\n return {\n result: input.result,\n query: { ...query, input: input.query, expansions },\n admissionState: input.admissionState,\n }\n }\n }\n}\n\nfunction validateRefs(\n refs: readonly ObjectRef[],\n path: string,\n ctx: QueryValidationContext\n): QueryNodeValidation {\n if (refs.length === 0) {\n addIssue(ctx, `${path}.refs`, \"empty_refs\", \"refs must include at least one object reference\")\n }\n if (refs.length > ctx.maxRefs) {\n addIssue(\n ctx,\n `${path}.refs`,\n \"too_many_refs\",\n `refs must include at most ${ctx.maxRefs} object references`\n )\n }\n\n const objectTypeIds = new Set<string>()\n refs.forEach((ref, index) => {\n const refPath = `${path}.refs[${index}]`\n if (!ref.objectTypeId) {\n addIssue(ctx, `${refPath}.objectTypeId`, \"missing_object_type\", \"objectTypeId is required\")\n } else if (!ctx.ontology.getObjectTypeById(ref.objectTypeId)) {\n addIssue(\n ctx,\n `${refPath}.objectTypeId`,\n \"unknown_object_type\",\n formatUnknownObjectTypeMessage(ref.objectTypeId)\n )\n } else {\n objectTypeIds.add(ref.objectTypeId)\n }\n\n if (!ref.primaryId) {\n addIssue(ctx, `${refPath}.primaryId`, \"missing_primary_id\", \"primaryId is required\")\n }\n })\n\n return {\n result: { objectTypeIds: [...objectTypeIds] },\n query: { kind: \"refs\", refs: refs.map((ref) => ({ ...ref })) },\n }\n}\n\nfunction validateStart(\n objectTypeId: string,\n includeSubtypes: boolean | undefined,\n path: string,\n ctx: QueryValidationContext\n): QueryNodeValidation {\n if (!objectTypeId) {\n addIssue(ctx, path, \"missing_object_type\", \"start.objectTypeId is required\")\n return { result: { objectTypeIds: [] }, query: { kind: \"start\", objectTypeId } }\n }\n\n if (!ctx.ontology.getObjectTypeById(objectTypeId)) {\n addIssue(ctx, path, \"unknown_object_type\", formatUnknownObjectTypeMessage(objectTypeId))\n return { result: { objectTypeIds: [] }, query: { kind: \"start\", objectTypeId } }\n }\n\n const objectTypeIds = includeSubtypes\n ? uniqueStrings([objectTypeId, ...ctx.ontology.listSubTypes(objectTypeId)])\n : [objectTypeId]\n\n return { result: { objectTypeIds }, query: { kind: \"start\", objectTypeId, includeSubtypes } }\n}\n\nfunction validatePredicate(\n predicate: ObjectQueryPredicate,\n shape: ObjectQueryResultShape,\n admissionState: ObjectQueryAdmissionState,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryPredicate {\n switch (predicate.op) {\n case \"and\":\n case \"or\":\n if (predicate.items.length === 0) {\n addIssue(\n ctx,\n path,\n \"empty_predicate_group\",\n `Predicate '${predicate.op}' must not be empty`\n )\n }\n return {\n ...predicate,\n items: predicate.items.map((item, index) =>\n validatePredicate(item, shape, admissionState, `${path}.items[${index}]`, ctx)\n ),\n }\n case \"not\":\n return {\n ...predicate,\n item: validatePredicate(predicate.item, shape, admissionState, `${path}.item`, ctx),\n }\n case \"eq\":\n case \"neq\":\n case \"lt\":\n case \"lte\":\n case \"gt\":\n case \"gte\": {\n const { scalarKind: _authoredScalarKind, ...authoredPredicate } = predicate\n const scalarKind = resolveAndValidatePredicateProperty(\n predicate.propertyId,\n predicate.op,\n shape,\n path,\n ctx\n )\n validatePredicateValue(predicate.propertyId, predicate.value, shape, path, ctx)\n admitProperty(ctx, {\n state: admissionState,\n propertyId: predicate.propertyId,\n use: \"filter\",\n path,\n })\n return {\n ...authoredPredicate,\n value: normalizeObjectQueryValue(predicate.value, scalarKind),\n ...(scalarKind ? { scalarKind } : {}),\n }\n }\n case \"in\": {\n const { scalarKind: _authoredScalarKind, ...authoredPredicate } = predicate\n const scalarKind = resolveAndValidatePredicateProperty(\n predicate.propertyId,\n predicate.op,\n shape,\n path,\n ctx\n )\n if (predicate.values.length === 0) {\n addIssue(ctx, path, \"empty_in_values\", \"Predicate 'in' must include at least one value\")\n }\n predicate.values.forEach((value, index) => {\n validatePredicateValue(predicate.propertyId, value, shape, `${path}.values[${index}]`, ctx)\n })\n admitProperty(ctx, {\n state: admissionState,\n propertyId: predicate.propertyId,\n use: \"filter\",\n path,\n })\n return {\n ...authoredPredicate,\n values: predicate.values.map((value) => normalizeObjectQueryValue(value, scalarKind)),\n ...(scalarKind ? { scalarKind } : {}),\n }\n }\n case \"exists\":\n resolveAndValidatePredicateProperty(predicate.propertyId, predicate.op, shape, path, ctx)\n admitProperty(ctx, {\n state: admissionState,\n propertyId: predicate.propertyId,\n use: \"filter\",\n path,\n })\n if (typeof predicate.value !== \"boolean\") {\n addIssue(ctx, path, \"invalid_exists_value\", \"Predicate 'exists' value must be boolean\")\n }\n return predicate\n case \"contains\":\n resolveAndValidatePredicateProperty(predicate.propertyId, predicate.op, shape, path, ctx)\n validateContainsValue(predicate.propertyId, predicate.value, shape, path, ctx)\n admitProperty(ctx, {\n state: admissionState,\n propertyId: predicate.propertyId,\n use: \"filter\",\n path,\n })\n return predicate\n }\n}\n\nfunction resolveAndValidatePredicateProperty(\n propertyId: string,\n op: ObjectQueryPredicate[\"op\"],\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): QueryScalarKind | undefined {\n const properties = getPropertiesForResult(propertyId, shape, path, ctx)\n if (properties.length === 0) return undefined\n const schemas: Schema[] = []\n\n for (const { objectType, property } of properties) {\n const schema = resolveSchemaForProperty(property, objectType.id, ctx, path)\n if (schema) schemas.push(schema)\n\n if (isPrimaryExactPredicate(property, op)) {\n continue\n }\n\n if (property.query?.searchable !== true || property.query.filterable !== true) {\n addIssue(\n ctx,\n path,\n \"property_not_filterable\",\n `Property '${propertyId}' on '${objectType.id}' must set query.searchable: true and query.filterable: true before it can be used in predicates`\n )\n continue\n }\n\n if (!schema) continue\n\n if ((op === \"lt\" || op === \"lte\" || op === \"gt\" || op === \"gte\") && !isSortableSchema(schema)) {\n addIssue(\n ctx,\n path,\n \"operator_not_supported_for_schema\",\n `Predicate '${op}' cannot be used with property '${propertyId}' on '${objectType.id}' because its schema is not orderable`\n )\n }\n\n if ((op === \"eq\" || op === \"neq\" || op === \"in\" || op === \"exists\") && !isExactSchema(schema)) {\n addIssue(\n ctx,\n path,\n \"operator_not_supported_for_schema\",\n `Predicate '${op}' cannot be used with property '${propertyId}' on '${objectType.id}' because its schema cannot be exact-matched`\n )\n }\n\n if (op === \"contains\" && !isContainsSchema(schema)) {\n addIssue(\n ctx,\n path,\n \"operator_not_supported_for_schema\",\n `Predicate 'contains' cannot be used with property '${propertyId}' on '${objectType.id}' because its schema is not string, array, or map`\n )\n }\n }\n\n if (op === \"exists\" || op === \"contains\") return undefined\n return resolveCommonQueryScalarKind(schemas, propertyId, path, ctx)\n}\n\nfunction normalizeObjectQueryValue(value: unknown, scalarKind: QueryScalarKind | undefined) {\n if (scalarKind !== \"decimal\" || typeof value !== \"string\") return value\n try {\n return normalizeDecimalValue(value)\n } catch {\n return value\n }\n}\n\nfunction resolveCommonQueryScalarKind(\n schemas: readonly Schema[],\n propertyId: string,\n path: string,\n ctx: QueryValidationContext\n): QueryScalarKind | undefined {\n const scalarKinds = schemas.map(queryScalarKindForSchema)\n if (scalarKinds.length === 0 || scalarKinds.some((kind) => kind === undefined)) {\n return undefined\n }\n\n const resolvedKinds = new Set(scalarKinds)\n if (resolvedKinds.size === 1) return scalarKinds[0]\n\n addIssue(\n ctx,\n path,\n \"incompatible_property_scalar_kinds\",\n `Property '${propertyId}' resolves to incompatible scalar schemas: ${[...resolvedKinds].join(\n \", \"\n )}`\n )\n return undefined\n}\n\nfunction queryScalarKindForSchema(schema: Schema): QueryScalarKind | undefined {\n if (typeof schema === \"string\") return schema === \"fileRef\" ? undefined : schema\n if (schema.type === \"enum\") return schema.valueType === \"integer\" ? \"integer\" : \"string\"\n return undefined\n}\n\nfunction validatePredicateValue(\n propertyId: string,\n value: unknown,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): void {\n for (const { objectType, property } of getPropertiesForResult(propertyId, shape, path, ctx, {\n reportMissing: false,\n })) {\n try {\n validatePropertyValue(property, value, `${objectType.id}.${property.id}`, ctx.valueTypesById)\n } catch (error) {\n addIssue(\n ctx,\n path,\n \"invalid_predicate_value\",\n error instanceof Error\n ? error.message\n : `Invalid value for property '${property.id}' on '${objectType.id}'`\n )\n }\n }\n}\n\nfunction validateContainsValue(\n propertyId: string,\n value: unknown,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): void {\n for (const { objectType, property } of getPropertiesForResult(propertyId, shape, path, ctx, {\n reportMissing: false,\n })) {\n const schema = resolveSchemaForProperty(property, objectType.id, ctx, path)\n if (!schema) continue\n\n if (typeof schema === \"string\") {\n if (schema === \"string\" || schema === \"uuid\") {\n if (typeof value !== \"string\") {\n addIssue(\n ctx,\n path,\n \"invalid_contains_value\",\n `Predicate 'contains' value for '${objectType.id}.${property.id}' must be a string`\n )\n }\n }\n continue\n }\n\n if (schema.type === \"array\") {\n try {\n validateSchemaValue(\n schema.items,\n value,\n `${objectType.id}.${property.id}[]`,\n ctx.valueTypesById\n )\n } catch (error) {\n addIssue(\n ctx,\n path,\n \"invalid_contains_value\",\n error instanceof Error\n ? error.message\n : `Invalid contains value for '${objectType.id}.${property.id}'`\n )\n }\n continue\n }\n\n if (schema.type === \"map\" && typeof value !== \"string\") {\n addIssue(\n ctx,\n path,\n \"invalid_contains_value\",\n `Predicate 'contains' value for '${objectType.id}.${property.id}' must be a map key string`\n )\n }\n }\n}\n\nfunction validateTextQuery(\n query: string,\n fields: readonly string[] | undefined,\n shape: ObjectQueryResultShape,\n admissionState: ObjectQueryAdmissionState,\n path: string,\n ctx: QueryValidationContext\n): TextFieldResolution {\n if (query.trim().length === 0) {\n addIssue(ctx, path, \"empty_text_query\", \"Text query must not be empty\")\n }\n\n const fieldsByObjectType: Record<string, string[]> | undefined = fields ? undefined : {}\n\n for (const objectType of getObjectTypesForResult(shape, ctx)) {\n const fieldIds = fields ?? objectType.search?.defaultText\n if (!fieldIds || fieldIds.length === 0) {\n addIssue(\n ctx,\n path,\n \"missing_text_fields\",\n `Object type '${objectType.id}' must define search.defaultText or the text query must specify fields`\n )\n continue\n }\n\n if (fieldsByObjectType) fieldsByObjectType[objectType.id] = uniqueStrings(fieldIds)\n\n for (const fieldId of fieldIds) {\n admitProperty(ctx, {\n state: admissionState,\n propertyId: fieldId,\n objectTypeId: objectType.id,\n use: \"text\",\n path: `${path}.fields`,\n })\n const property = getProperty(objectType, fieldId)\n if (!property) {\n addIssue(\n ctx,\n path,\n \"unknown_text_field\",\n `Text query references unknown property '${fieldId}' on '${objectType.id}'`\n )\n continue\n }\n\n assertStaticSearchProperty(objectType.id, property, \"text query\", path, ctx)\n assertQueryFlag(objectType.id, property, \"text\", \"text query\", path, ctx)\n const schema = resolveSchemaForProperty(property, objectType.id, ctx, path)\n if (schema && !isTextSchema(schema)) {\n addIssue(\n ctx,\n path,\n \"text_field_not_string_like\",\n `Text query field '${fieldId}' on '${objectType.id}' must be string-like`\n )\n }\n }\n }\n\n return fieldsByObjectType ? { fieldsByObjectType } : {}\n}\n\nfunction validateVectorProfileQuery(\n query: ObjectQueryVector,\n shape: ObjectQueryResultShape,\n state: ObjectQueryAdmissionState,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryVector {\n const types = getObjectTypesForResult(shape, ctx)\n if (\n types.length !== 1 ||\n !Number.isSafeInteger(query.k) ||\n query.k < 1 ||\n query.k > MAX_VECTOR_K\n ) {\n addIssue(\n ctx,\n path,\n \"invalid_vector_profile_query\",\n `Vector search requires one type, one profile and k between 1 and ${MAX_VECTOR_K}`\n )\n return query\n }\n let input = query.input\n while (input.kind === \"filter\") input = input.input\n if (input.kind !== \"start\" || input.includeSubtypes)\n addIssue(\n ctx,\n path,\n \"unsupported_vector_composition\",\n \"Vector profile input must be a type with optional filters.\"\n )\n const objectType = types[0]!\n const profile =\n query.profile === undefined ? undefined : objectType.search?.vectors?.[query.profile]\n if (!profile) {\n addIssue(ctx, path, \"unknown_vector_profile\", `Unknown vector profile: ${query.profile}`)\n return query\n }\n for (const propertyId of profile.source)\n admitProperty(ctx, { state, propertyId, objectTypeId: objectType.id, use: \"vector\", path })\n let values = query.vector\n try {\n if (typeof values === \"string\") {\n if (!values.trim() || values.length > 8000) {\n throw new Error(\"Vector search text must be nonempty and at most 8000 characters.\")\n }\n } else {\n values = normalizeVector(values, profile.model.definition.dimensions)\n }\n } catch (error) {\n addIssue(ctx, path, \"invalid_vector\", error instanceof Error ? error.message : \"Invalid vector\")\n }\n return {\n ...query,\n vector: values,\n source: [...profile.source],\n configuration: vectorConfiguration(profile),\n }\n}\n\nfunction validateTraverse(\n linkId: string,\n direction: \"outgoing\" | \"incoming\",\n sourceObjectTypeId: string | undefined,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryResultShape {\n if (!linkId) {\n addIssue(ctx, path, \"missing_link_id\", \"traverse.linkId is required\")\n return { objectTypeIds: [] }\n }\n\n if (direction === \"outgoing\") {\n if (sourceObjectTypeId !== undefined) {\n addIssue(\n ctx,\n path,\n \"traverse_source_not_applicable\",\n \"traverse.sourceObjectTypeId only applies to incoming traversal\"\n )\n }\n return validateOutgoingTraverse(linkId, shape, path, ctx)\n }\n\n return validateIncomingTraverse(linkId, sourceObjectTypeId, shape, path, ctx)\n}\n\nfunction validateOutgoingTraverse(\n linkId: string,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryResultShape {\n const targetTypeIds: string[] = []\n\n for (const objectType of getObjectTypesForResult(shape, ctx)) {\n const link = objectType.links.find((candidate) => candidate.id === linkId)\n if (!link) {\n addIssue(\n ctx,\n path,\n \"unknown_link\",\n `Outgoing traversal references unknown link '${linkId}' on '${objectType.id}'`\n )\n continue\n }\n\n if (link.targetObjectTypeId === \"*\") {\n addIssue(\n ctx,\n path,\n \"wildcard_traverse_target\",\n `Outgoing traversal over wildcard link '${objectType.id}.${linkId}' cannot infer a target object type`\n )\n continue\n }\n\n const declaredTargets = Array.isArray(link.targetObjectTypeId)\n ? link.targetObjectTypeId\n : [link.targetObjectTypeId]\n\n for (const targetId of declaredTargets) {\n if (!ctx.ontology.getObjectTypeById(targetId)) {\n addIssue(\n ctx,\n path,\n \"unknown_link_target\",\n `Outgoing traversal over '${objectType.id}.${linkId}' targets unknown object type '${targetId}'`\n )\n } else {\n targetTypeIds.push(targetId)\n }\n }\n }\n\n return { objectTypeIds: uniqueStrings(targetTypeIds) }\n}\n\nfunction validateIncomingTraverse(\n linkId: string,\n sourceObjectTypeId: string | undefined,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryResultShape {\n let candidateTypes = ctx.ontology.listObjectTypes()\n if (sourceObjectTypeId !== undefined) {\n const sourceType = ctx.ontology.getObjectTypeById(sourceObjectTypeId)\n if (!sourceType) {\n addIssue(\n ctx,\n path,\n \"unknown_traverse_source\",\n `Incoming traversal references unknown source object type '${sourceObjectTypeId}'`\n )\n return { objectTypeIds: [] }\n }\n candidateTypes = [sourceType]\n }\n\n const sourceTypeIds: string[] = []\n\n for (const sourceType of candidateTypes) {\n const link = sourceType.links.find((candidate) => candidate.id === linkId)\n if (!link) continue\n\n if (link.targetObjectTypeId === \"*\") {\n sourceTypeIds.push(sourceType.id)\n continue\n }\n\n const matches = shape.objectTypeIds.some((targetTypeId) =>\n ctx.ontology.isValidLinkTarget(link.targetObjectTypeId, targetTypeId)\n )\n if (matches) sourceTypeIds.push(sourceType.id)\n }\n\n if (sourceTypeIds.length === 0) {\n addIssue(\n ctx,\n path,\n \"incoming_link_not_found\",\n `Incoming traversal found no source object types with link '${linkId}' targeting ${shape.objectTypeIds.join(\n \" | \"\n )}`\n )\n }\n\n return { objectTypeIds: uniqueStrings(sourceTypeIds) }\n}\n\nfunction validateExpansions(\n expansions: readonly ObjectExpansion[],\n shape: ObjectQueryResultShape,\n admissionState: ObjectQueryAdmissionState,\n path: string,\n ctx: QueryValidationContext\n): ObjectExpansion[] {\n return expansions.map((expansion, index) =>\n validateExpansion(expansion, shape, admissionState, `${path}[${index}]`, ctx)\n )\n}\n\nfunction validateExpansion(\n expansion: ObjectExpansion,\n shape: ObjectQueryResultShape,\n admissionState: ObjectQueryAdmissionState,\n path: string,\n ctx: QueryValidationContext\n): ObjectExpansion {\n if (!expansion.linkId) {\n addIssue(ctx, path, \"missing_expand_link\", \"expand.linkId is required\")\n return expansion\n }\n\n const targetShape =\n expansion.direction === \"incoming\"\n ? resolveIncomingExpansionTargets(\n expansion.linkId,\n expansion.sourceObjectTypeId,\n shape,\n path,\n ctx\n )\n : resolveOutgoingExpansionTargets(\n expansion.linkId,\n expansion.sourceObjectTypeId,\n shape,\n path,\n ctx\n )\n const targetAdmissionState = admitTransition(\n ctx,\n ctx.admission.edge({\n state: admissionState,\n result: targetShape,\n linkId: expansion.linkId,\n direction: expansion.direction,\n sourceObjectTypeId: expansion.sourceObjectTypeId,\n use: \"expand\",\n path,\n })\n )\n\n // Expansion targets are touched types: the principal must be able to `view`\n // every type a query hydrates, exactly like `start`/`traverse`. `dispatch`'s\n // automatic fold only covers result types, and expansion targets are not in\n // the result — so add them here (recursively, via the nested call below).\n for (const targetTypeId of targetShape.objectTypeIds) {\n ctx.touchedObjectTypeIds.add(targetTypeId)\n }\n\n validateExpansionLimit(expansion.limit, path, ctx)\n const orderBy = expansion.orderBy\n ? validateSortFields(\n expansion.orderBy,\n targetShape,\n targetAdmissionState,\n \"expand.orderBy\",\n `${path}.orderBy`,\n ctx\n )\n : undefined\n const expand = expansion.expand\n ? validateExpansions(expansion.expand, targetShape, targetAdmissionState, `${path}.expand`, ctx)\n : undefined\n\n return { ...expansion, orderBy, expand }\n}\n\nfunction resolveOutgoingExpansionTargets(\n linkId: string,\n sourceObjectTypeId: string | undefined,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryResultShape {\n if (sourceObjectTypeId !== undefined) {\n addIssue(\n ctx,\n path,\n \"expand_source_not_applicable\",\n \"expand.sourceObjectTypeId only applies to incoming expansion\"\n )\n }\n\n const targetTypeIds: string[] = []\n let foundOnAnyType = false\n\n for (const objectType of getObjectTypesForResult(shape, ctx)) {\n const link = objectType.links.find((candidate) => candidate.id === linkId)\n if (!link) continue\n foundOnAnyType = true\n\n if (link.targetObjectTypeId === \"*\") {\n addIssue(\n ctx,\n path,\n \"wildcard_expand_target\",\n `Expansion over wildcard link '${objectType.id}.${linkId}' cannot infer a target object type`\n )\n continue\n }\n\n const declaredTargets = Array.isArray(link.targetObjectTypeId)\n ? link.targetObjectTypeId\n : [link.targetObjectTypeId]\n\n for (const targetId of declaredTargets) {\n if (!ctx.ontology.getObjectTypeById(targetId)) {\n addIssue(\n ctx,\n path,\n \"unknown_expand_target\",\n `Expansion over '${objectType.id}.${linkId}' targets unknown object type '${targetId}'`\n )\n } else {\n targetTypeIds.push(targetId)\n }\n }\n }\n\n // A link absent from every result type is the \"abandoned by a later traverse\"\n // case: expands hoist above traverse, so an expand on a type the traverse\n // replaced cannot resolve its link on the final result type.\n if (!foundOnAnyType) {\n addIssue(\n ctx,\n path,\n \"unknown_expand_link\",\n `Expansion references link '${linkId}' not present on result type ${shape.objectTypeIds.join(\n \" | \"\n )} (an expand abandoned by a later traverse?)`\n )\n }\n\n return { objectTypeIds: uniqueStrings(targetTypeIds) }\n}\n\nfunction resolveIncomingExpansionTargets(\n linkId: string,\n sourceObjectTypeId: string | undefined,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): ObjectQueryResultShape {\n let candidateTypes = ctx.ontology.listObjectTypes()\n if (sourceObjectTypeId !== undefined) {\n const sourceType = ctx.ontology.getObjectTypeById(sourceObjectTypeId)\n if (!sourceType) {\n addIssue(\n ctx,\n path,\n \"unknown_expand_source\",\n `Incoming expansion references unknown source object type '${sourceObjectTypeId}'`\n )\n return { objectTypeIds: [] }\n }\n candidateTypes = [sourceType]\n }\n\n const sourceTypeIds: string[] = []\n\n for (const sourceType of candidateTypes) {\n const link = sourceType.links.find((candidate) => candidate.id === linkId)\n if (!link) continue\n\n if (link.targetObjectTypeId === \"*\") {\n sourceTypeIds.push(sourceType.id)\n continue\n }\n\n const matches = shape.objectTypeIds.some((targetTypeId) =>\n ctx.ontology.isValidLinkTarget(link.targetObjectTypeId, targetTypeId)\n )\n if (matches) sourceTypeIds.push(sourceType.id)\n }\n\n if (sourceTypeIds.length === 0) {\n addIssue(\n ctx,\n path,\n \"incoming_expand_link_not_found\",\n `Incoming expansion found no source object types with link '${linkId}' targeting ${shape.objectTypeIds.join(\n \" | \"\n )}`\n )\n }\n\n return { objectTypeIds: uniqueStrings(sourceTypeIds) }\n}\n\nfunction validateExpansionLimit(\n limit: number | undefined,\n path: string,\n ctx: QueryValidationContext\n): void {\n if (limit === undefined) return\n if (!Number.isInteger(limit) || limit < 0) {\n addIssue(\n ctx,\n `${path}.limit`,\n \"invalid_expand_limit\",\n \"expand.limit must be a non-negative integer\"\n )\n }\n}\n\nfunction validateSet(\n inputs: readonly ObjectQuery[],\n op: \"union\" | \"intersect\" | \"subtract\",\n path: string,\n ctx: QueryValidationContext\n): QueryValidationResult {\n if (inputs.length === 0) {\n addIssue(ctx, path, \"empty_set\", `Set operation '${op}' must include at least one input`)\n return {\n result: { objectTypeIds: [] },\n query: { kind: \"set\", op, inputs },\n admissionState: ctx.admission.empty(),\n }\n }\n\n const results = inputs.map((input, index) =>\n validateQueryNode(input, `${path}.inputs[${index}]`, ctx)\n )\n const first = results[0]?.result ?? { objectTypeIds: [] }\n const expected = keyForTypeIds(first.objectTypeIds)\n\n results.forEach((result, index) => {\n if (keyForTypeIds(result.result.objectTypeIds) !== expected) {\n addIssue(\n ctx,\n `${path}.inputs[${index}]`,\n \"incompatible_set_input\",\n `Set operation '${op}' inputs must produce the same object type set`\n )\n }\n })\n\n return {\n result: first,\n query: { kind: \"set\", op, inputs: results.map((result) => result.query) },\n admissionState: ctx.admission.set({\n op,\n states: results.map((result) => result.admissionState),\n path,\n }),\n }\n}\n\nfunction validateSortFields(\n fields: readonly ObjectQuerySortField[],\n shape: ObjectQueryResultShape,\n admissionState: ObjectQueryAdmissionState,\n use: Extract<ObjectQueryPropertyUse, \"sort\" | \"expand.orderBy\">,\n path: string,\n ctx: QueryValidationContext\n): ObjectQuerySortField[] {\n if (fields.length === 0) {\n addIssue(ctx, path, \"empty_sort\", \"Sort must include at least one field\")\n return []\n }\n\n const seen = new Set<string>()\n return fields.map((field, index) => {\n if (field.direction && field.direction !== \"asc\" && field.direction !== \"desc\") {\n addIssue(\n ctx,\n `${path}.fields[${index}]`,\n \"invalid_sort_direction\",\n \"Sort direction must be asc or desc\"\n )\n }\n\n const key = field.kind === \"property\" ? `property:${field.propertyId}` : \"relevance\"\n if (seen.has(key)) {\n addIssue(\n ctx,\n `${path}.fields[${index}]`,\n \"duplicate_sort_field\",\n `Duplicate sort field '${key}'`\n )\n }\n seen.add(key)\n\n if (field.kind === \"relevance\") return field\n\n admitProperty(ctx, {\n state: admissionState,\n propertyId: field.propertyId,\n use,\n path: `${path}.fields[${index}]`,\n })\n\n const { scalarKind: _authoredScalarKind, ...authoredField } = field\n\n const schemas: Schema[] = []\n\n for (const { objectType, property } of getPropertiesForResult(\n field.propertyId,\n shape,\n `${path}.fields[${index}]`,\n ctx\n )) {\n if (property.query?.searchable !== true || property.query.sortable !== true) {\n addIssue(\n ctx,\n `${path}.fields[${index}]`,\n \"property_not_sortable\",\n `Property '${property.id}' on '${objectType.id}' must set query.searchable: true and query.sortable: true before it can be sorted`\n )\n continue\n }\n\n const schema = resolveSchemaForProperty(\n property,\n objectType.id,\n ctx,\n `${path}.fields[${index}]`\n )\n if (schema) schemas.push(schema)\n if (schema && !isSortableSchema(schema)) {\n addIssue(\n ctx,\n `${path}.fields[${index}]`,\n \"sort_field_not_orderable\",\n `Sort field '${property.id}' on '${objectType.id}' is not orderable`\n )\n }\n }\n\n const scalarKind = resolveCommonQueryScalarKind(\n schemas,\n field.propertyId,\n `${path}.fields[${index}]`,\n ctx\n )\n return { ...authoredField, ...(scalarKind ? { scalarKind } : {}) }\n })\n}\n\nfunction validateLimit(limit: number, path: string, ctx: QueryValidationContext): void {\n if (!Number.isInteger(limit) || limit < 0) {\n addIssue(ctx, path, \"invalid_limit\", \"limit must be a non-negative integer\")\n } else if (limit > ctx.maxLimit) {\n addIssue(ctx, path, \"limit_too_large\", `limit must be <= ${ctx.maxLimit}`)\n }\n}\n\nfunction validatePage(\n pageSize: number,\n pageToken: string | undefined,\n path: string,\n ctx: QueryValidationContext\n): void {\n if (!Number.isInteger(pageSize) || pageSize <= 0) {\n addIssue(ctx, path, \"invalid_page_size\", \"pageSize must be a positive integer\")\n } else if (pageSize > ctx.maxPageSize) {\n addIssue(ctx, path, \"page_size_too_large\", `pageSize must be <= ${ctx.maxPageSize}`)\n }\n\n if (pageToken !== undefined && pageToken.length === 0) {\n addIssue(ctx, path, \"empty_page_token\", \"pageToken must not be empty when provided\")\n }\n}\n\nfunction validateProjection(\n properties: readonly string[] | undefined,\n shape: ObjectQueryResultShape,\n admissionState: ObjectQueryAdmissionState,\n path: string,\n ctx: QueryValidationContext\n): void {\n if (!properties) return\n if (properties.length === 0) {\n addIssue(ctx, path, \"empty_projection\", \"project.properties must not be empty when provided\")\n }\n\n const seen = new Set<string>()\n properties.forEach((propertyId, index) => {\n admitProperty(ctx, {\n state: admissionState,\n propertyId,\n use: \"project\",\n path: `${path}.properties[${index}]`,\n })\n if (seen.has(propertyId)) {\n addIssue(\n ctx,\n `${path}.properties[${index}]`,\n \"duplicate_projection_property\",\n `Duplicate projected property '${propertyId}'`\n )\n }\n seen.add(propertyId)\n getPropertiesForResult(propertyId, shape, `${path}.properties[${index}]`, ctx)\n })\n}\n\nfunction getObjectTypesForResult(\n shape: ObjectQueryResultShape,\n ctx: QueryValidationContext\n): ObjectType[] {\n const objectTypes: ObjectType[] = []\n for (const objectTypeId of shape.objectTypeIds) {\n const objectType = ctx.ontology.getObjectTypeById(objectTypeId)\n if (objectType) objectTypes.push(objectType)\n }\n return objectTypes\n}\n\nfunction getPropertiesForResult(\n propertyId: string,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext,\n options: { reportMissing?: boolean } = {}\n): { objectType: ObjectType; property: Property }[] {\n const results: { objectType: ObjectType; property: Property }[] = []\n\n for (const objectType of getObjectTypesForResult(shape, ctx)) {\n const property = getProperty(objectType, propertyId)\n if (!property) {\n if (options.reportMissing === false) {\n continue\n }\n addIssue(\n ctx,\n path,\n \"unknown_property\",\n `Property '${propertyId}' does not exist on object type '${objectType.id}'`\n )\n continue\n }\n results.push({ objectType, property })\n }\n\n return results\n}\n\nfunction getProperty(objectType: ObjectType, propertyId: string): Property | undefined {\n return objectType.properties.find((property) => property.id === propertyId)\n}\n\nfunction assertStaticSearchProperty(\n objectTypeId: string,\n property: Property,\n context: string,\n path: string,\n ctx: QueryValidationContext\n): void {\n if (property.mode === \"telemetry\") {\n addIssue(\n ctx,\n path,\n \"telemetry_search_property\",\n `${context} references telemetry property '${property.id}' on '${objectTypeId}'. Search can only reference static properties because telemetry latest values are not object-query indexed.`\n )\n }\n}\n\nfunction assertQueryFlag(\n objectTypeId: string,\n property: Property,\n flag: \"text\",\n context: string,\n path: string,\n ctx: QueryValidationContext\n): void {\n if (property.query?.searchable === true && property.query[flag] === true) return\n addIssue(\n ctx,\n path,\n \"query_field_not_enabled\",\n `${context} field '${property.id}' on '${objectTypeId}' must set query.searchable: true and query.${flag}: true`\n )\n}\n\nfunction resolveSchemaForProperty(\n property: Property,\n objectTypeId: string,\n ctx: QueryValidationContext,\n path: string\n): Schema | null {\n try {\n return resolveSchema(property.schema, ctx.valueTypesById)\n } catch (error) {\n addIssue(\n ctx,\n path,\n \"unresolved_property_schema\",\n error instanceof Error\n ? error.message\n : `Could not resolve schema for '${objectTypeId}.${property.id}'`\n )\n return null\n }\n}\n\nfunction resolveSchema(\n schema: Schema,\n valueTypesById: ReadonlyMap<string, ValueType>,\n seenValueTypeIds = new Set<string>()\n): Schema {\n if (typeof schema === \"string\") return schema\n if (schema.type !== \"valueTypeRef\") return schema\n if (seenValueTypeIds.has(schema.valueTypeId)) {\n throw new Error(`Circular valueTypeRef '${schema.valueTypeId}'`)\n }\n\n const resolved = schema._resolved ?? valueTypesById.get(schema.valueTypeId)?.schema\n if (!resolved) {\n throw new Error(`Unknown valueTypeRef '${schema.valueTypeId}'`)\n }\n\n seenValueTypeIds.add(schema.valueTypeId)\n return resolveSchema(resolved, valueTypesById, seenValueTypeIds)\n}\n\nfunction isPrimaryExactPredicate(property: Property, op: ObjectQueryPredicate[\"op\"]): boolean {\n return property.primary === true && (op === \"eq\" || op === \"in\")\n}\n\nfunction isTextSchema(schema: Schema): boolean {\n if (schema === \"string\") return true\n return typeof schema !== \"string\" && schema.type === \"enum\" && schema.valueType === \"string\"\n}\n\nfunction isExactSchema(schema: Schema): boolean {\n if (typeof schema === \"string\") return schema !== \"fileRef\"\n return schema.type === \"enum\"\n}\n\nfunction isSortableSchema(schema: Schema): boolean {\n if (typeof schema === \"string\") {\n return (\n schema === \"string\" ||\n schema === \"uuid\" ||\n schema === \"integer\" ||\n schema === \"double\" ||\n schema === \"decimal\" ||\n schema === \"date\" ||\n schema === \"timestamp\"\n )\n }\n return schema.type === \"enum\"\n}\n\nfunction isContainsSchema(schema: Schema): boolean {\n return (\n schema === \"string\" ||\n schema === \"uuid\" ||\n (typeof schema !== \"string\" && (schema.type === \"array\" || schema.type === \"map\"))\n )\n}\n\nfunction keyForTypeIds(typeIds: readonly string[]): string {\n return uniqueStrings(typeIds).sort().join(\"\\0\")\n}\n\nfunction uniqueStrings(values: readonly string[]): string[] {\n return [...new Set(values)]\n}\n\nfunction admitTransition(\n ctx: QueryValidationContext,\n transition: ObjectQueryAdmissionTransition\n): ObjectQueryAdmissionState {\n if (transition.denial) recordAdmissionDenial(ctx, transition.denial)\n return transition.state\n}\n\nfunction admitProperty(\n ctx: QueryValidationContext,\n input: Parameters<ObjectQuerySemanticAdmission[\"property\"]>[0]\n): void {\n const denial = ctx.admission.property(input)\n if (denial) recordAdmissionDenial(ctx, denial)\n}\n\nfunction recordAdmissionDenial(ctx: QueryValidationContext, denial: Error): void {\n // Only the first deterministic denial is observable. Keep walking so ordinary validation keeps\n // priority, but do not retain attacker-controlled messages for every rejected field or edge.\n if (ctx.admissionDenials.length === 0) ctx.admissionDenials.push(denial)\n}\n\nfunction addIssue(ctx: QueryValidationContext, path: string, code: string, message: string): void {\n ctx.issues.push({ path, code, message })\n}\n",
8
+ "import { type AuthorizationContext, assertAuthorized } from \"../../authorization\"\nimport type { RuntimeAuthorization } from \"../../execution/types\"\nimport type { EmbeddingModelCatalog } from \"../../models/catalog\"\nimport type { OntologyRegistry } from \"../../ontology\"\nimport type {\n CountObjectsResult,\n ExistsObjectsResult,\n ExpandedLinkValue,\n ExpandedObjectRow,\n FacetObjectsResult,\n ObjectBatchKey,\n ObjectFacetRequest,\n ObjectFacetResult,\n ObjectQueryCapabilities,\n ObjectReadStorage,\n ObjectRow,\n ObjectRowLinks,\n QueryObjectsResult,\n} from \"../../storage\"\nimport { linkBatchKey, MAX_OBJECT_READ_FACETS, objectBatchKey } from \"../../storage\"\nimport { resolveVectorSearchText } from \"../vectors/resolve-query\"\nimport {\n ObjectQueryExecutionError,\n ObjectQueryPlanningError,\n ObjectQueryValidationError,\n} from \"./errors\"\nimport type {\n ObjectExpansion,\n ObjectQuery,\n ObjectQueryPredicate,\n ObjectQueryResultShape,\n ObjectQuerySortField,\n} from \"./ir\"\nimport { normalizeObjectQuery } from \"./normalize\"\nimport { type ObjectQueryPlan, type ObjectQueryPlanningOptions, planObjectQuery } from \"./planner\"\nimport { compareQueryScalarValues, queryScalarValuesEqual } from \"./scalar-values\"\nimport {\n type ObjectQueryValidationIssue,\n resolveObjectQueryResultShape,\n type ValidatedObjectQuery,\n validateObjectQuery,\n} from \"./validate\"\n\nexport interface QueryExecutorOptions\n extends Omit<\n ObjectQueryPlanningOptions,\n | \"capabilities\"\n | \"operation\"\n | \"hasQueryObjects\"\n | \"hasCountObjects\"\n | \"hasExistsObjects\"\n | \"hasFacetObjects\"\n > {\n ontology: OntologyRegistry\n embeddingModels?: EmbeddingModelCatalog\n storage: ObjectReadStorage\n maxLimit?: number\n maxPageSize?: number\n maxRefs?: number\n maxFacetLimit?: number\n /**\n * Per-parent cap on how many links a single `expand` hydrates, applied as a\n * top-N trim after `orderBy` (mirrors `maxLimit` for the result set). An\n * expansion's own `limit` narrows this further; the cap is the backstop.\n */\n maxExpansionFanout?: number\n /** When present, every object type the query touches must be viewable. */\n authorization?: AuthorizationContext\n /** Registered execution capability for queries reached through a bound Sixb SDK. */\n runtimeAuthorization?: RuntimeAuthorization\n}\n\nexport interface ExecuteObjectQueryInput {\n signal?: AbortSignal\n projectId: string\n query: ObjectQuery\n includeTotal?: boolean\n}\n\nexport interface ExecuteObjectQueryResult extends QueryObjectsResult {\n plan: ObjectQueryPlan\n}\n\nexport interface ExecuteObjectCountInput {\n projectId: string\n query: ObjectQuery\n}\n\nexport interface ExecuteObjectCountResult extends CountObjectsResult {\n plan: ObjectQueryPlan\n}\n\nexport interface ExecuteObjectExistsInput {\n projectId: string\n query: ObjectQuery\n}\n\nexport interface ExecuteObjectExistsResult extends ExistsObjectsResult {\n plan: ObjectQueryPlan\n}\n\nexport interface ExecuteObjectFacetsInput {\n projectId: string\n query: ObjectQuery\n facets: readonly ObjectFacetRequest[]\n}\n\nexport interface ExecuteObjectFacetsResult extends FacetObjectsResult {\n plan: ObjectQueryPlan\n}\n\ntype FallbackEntry = {\n row: ObjectRow\n order: number\n}\n\ntype FallbackEvaluation = {\n entries: FallbackEntry[]\n total: number\n hasMore: boolean\n nextPageToken?: string\n}\n\nconst DEFAULT_MAX_FALLBACK_ROWS = 1_000\nconst DEFAULT_MAX_FACET_LIMIT = 1_000\nconst DEFAULT_MAX_EXPANSION_FANOUT = 1_000\n\n// Fallback page tokens are local to the core executor. Provider page tokens are\n// opaque and should only be interpreted by the provider that returned them.\nconst PAGE_TOKEN_PREFIX = \"offset:\"\n\nexport async function executeObjectQuery(\n input: ExecuteObjectQueryInput,\n options: QueryExecutorOptions\n): Promise<ExecuteObjectQueryResult> {\n const normalized = normalizeObjectQuery(input.query)\n const validated = validateObjectQuery(normalized, {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n maxRefs: options.maxRefs,\n normalize: false,\n })\n assertQueryViewable(input.projectId, validated, options)\n const capabilities = options.storage.queryCapabilities()\n const hasQueryObjects = typeof options.storage.queryObjects === \"function\"\n const hasCountObjects = typeof options.storage.countObjects === \"function\"\n const hasExistsObjects = typeof options.storage.existsObjects === \"function\"\n const hasFacetObjects = typeof options.storage.facetObjects === \"function\"\n const plannedQuery = expandPushdownQuery(\n validated.query,\n options.ontology,\n capabilities,\n {\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n },\n options.maxExpansionFanout\n )\n const plan = planObjectQuery(plannedQuery, {\n capabilities,\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n\n if (plan.mode === \"rejected\") {\n throw new ObjectQueryPlanningError(plan.issues)\n }\n\n if (plan.mode === \"pushdown\") {\n if (!options.storage.queryObjects) {\n throw new ObjectQueryPlanningError(plan.providerIssues)\n }\n const result = await options.storage.queryObjects({\n projectId: input.projectId,\n query: await resolveVectorSearchText(\n plan.query,\n options.ontology,\n options.embeddingModels,\n input.signal\n ),\n includeTotal: input.includeTotal,\n })\n return { ...result, plan }\n }\n\n // The planner admits only the small fallback subset; unsupported cases below\n // remain as defensive guards against future planner drift.\n const fallback = await executeFallbackQuery(input.projectId, validated.query, options, {\n includeTotal: input.includeTotal,\n })\n return { ...fallback, plan }\n}\n\nexport async function countObjects(\n input: ExecuteObjectCountInput,\n options: QueryExecutorOptions\n): Promise<ExecuteObjectCountResult> {\n const normalized = normalizeObjectQuery(input.query)\n const validated = validateObjectQuery(normalized, {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n maxRefs: options.maxRefs,\n normalize: false,\n })\n assertQueryViewable(input.projectId, validated, options)\n const capabilities = options.storage.queryCapabilities()\n const hasQueryObjects = typeof options.storage.queryObjects === \"function\"\n const hasCountObjects = typeof options.storage.countObjects === \"function\"\n const hasExistsObjects = typeof options.storage.existsObjects === \"function\"\n const hasFacetObjects = typeof options.storage.facetObjects === \"function\"\n const aggregateQuery = stripOuterRowShape(validated.query)\n const plannedQuery = expandPushdownQuery(aggregateQuery, options.ontology, capabilities, {\n operation: \"countObjects\",\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n const plan = planObjectQuery(plannedQuery, {\n capabilities,\n operation: \"countObjects\",\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n\n if (plan.mode === \"rejected\") {\n throw new ObjectQueryPlanningError(plan.issues)\n }\n\n if (plan.mode === \"pushdown\") {\n if (!options.storage.countObjects) {\n throw new ObjectQueryPlanningError(plan.providerIssues)\n }\n const result = await options.storage.countObjects({\n projectId: input.projectId,\n query: await resolveVectorSearchText(plan.query, options.ontology, options.embeddingModels),\n })\n return { ...result, plan }\n }\n\n const maxRows = options.maxFallbackRows ?? DEFAULT_MAX_FALLBACK_ROWS\n const evaluation = await evaluateFallbackQuery(input.projectId, aggregateQuery, options, maxRows)\n return { count: evaluation.total, plan }\n}\n\nexport async function existsObjects(\n input: ExecuteObjectExistsInput,\n options: QueryExecutorOptions\n): Promise<ExecuteObjectExistsResult> {\n const normalized = normalizeObjectQuery(input.query)\n const validated = validateObjectQuery(normalized, {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n maxRefs: options.maxRefs,\n normalize: false,\n })\n assertQueryViewable(input.projectId, validated, options)\n const capabilities = options.storage.queryCapabilities()\n const hasQueryObjects = typeof options.storage.queryObjects === \"function\"\n const hasCountObjects = typeof options.storage.countObjects === \"function\"\n const hasExistsObjects = typeof options.storage.existsObjects === \"function\"\n const hasFacetObjects = typeof options.storage.facetObjects === \"function\"\n const aggregateQuery = stripOuterRowShape(validated.query)\n const plannedQuery = expandPushdownQuery(aggregateQuery, options.ontology, capabilities, {\n operation: \"existsObjects\",\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n const plan = planObjectQuery(plannedQuery, {\n capabilities,\n operation: \"existsObjects\",\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n\n if (plan.mode === \"rejected\") {\n throw new ObjectQueryPlanningError(plan.issues)\n }\n\n if (plan.mode === \"pushdown\") {\n if (!options.storage.existsObjects) {\n throw new ObjectQueryPlanningError(plan.providerIssues)\n }\n const result = await options.storage.existsObjects({\n projectId: input.projectId,\n query: await resolveVectorSearchText(plan.query, options.ontology, options.embeddingModels),\n })\n return { ...result, plan }\n }\n\n const maxRows = options.maxFallbackRows ?? DEFAULT_MAX_FALLBACK_ROWS\n const evaluation = await evaluateFallbackQuery(input.projectId, aggregateQuery, options, maxRows)\n return { exists: evaluation.total > 0, plan }\n}\n\nexport async function facetObjects(\n input: ExecuteObjectFacetsInput,\n options: QueryExecutorOptions\n): Promise<ExecuteObjectFacetsResult> {\n const normalized = normalizeObjectQuery(input.query)\n const validated = validateObjectQuery(normalized, {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n maxRefs: options.maxRefs,\n normalize: false,\n })\n assertQueryViewable(input.projectId, validated, options)\n const facets = validateObjectFacetRequests(input.facets, validated.result.objectTypeIds, options)\n const aggregateQuery = stripOuterRowShape(validated.query)\n const capabilities = options.storage.queryCapabilities()\n const hasQueryObjects = typeof options.storage.queryObjects === \"function\"\n const hasCountObjects = typeof options.storage.countObjects === \"function\"\n const hasExistsObjects = typeof options.storage.existsObjects === \"function\"\n const hasFacetObjects = typeof options.storage.facetObjects === \"function\"\n const plannedQuery = expandPushdownQuery(aggregateQuery, options.ontology, capabilities, {\n operation: \"facetObjects\",\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n const plan = planObjectQuery(plannedQuery, {\n capabilities,\n operation: \"facetObjects\",\n hasQueryObjects,\n hasCountObjects,\n hasExistsObjects,\n hasFacetObjects,\n allowFallback: options.allowFallback,\n maxFallbackRows: options.maxFallbackRows,\n requiresExplicitFallbackBound: options.requiresExplicitFallbackBound,\n })\n\n if (plan.mode === \"rejected\") {\n throw new ObjectQueryPlanningError(plan.issues)\n }\n\n if (plan.mode === \"pushdown\") {\n if (!options.storage.facetObjects) {\n throw new ObjectQueryPlanningError(plan.providerIssues)\n }\n const result = await options.storage.facetObjects({\n projectId: input.projectId,\n query: await resolveVectorSearchText(plan.query, options.ontology, options.embeddingModels),\n facets,\n })\n return { ...result, plan }\n }\n\n const maxRows = options.maxFallbackRows ?? DEFAULT_MAX_FALLBACK_ROWS\n const evaluation = await evaluateFallbackQuery(input.projectId, aggregateQuery, options, maxRows)\n return {\n facets: buildFacetResults(\n evaluation.entries.map((entry) => entry.row),\n facets\n ),\n plan,\n }\n}\n\n// Authorization happens at planning time: a scoped query must hold a view\n// grant for every object type it touches, before any storage call runs.\nfunction assertQueryViewable(\n projectId: string,\n validated: ValidatedObjectQuery,\n authorization: Pick<QueryExecutorOptions, \"authorization\" | \"runtimeAuthorization\">\n): void {\n // The query engine is also a storage-level utility. Authorization is activated by a runtime\n // context; execution SDKs always provide a registered capability, including auth-disabled ones.\n if (!authorization.runtimeAuthorization && !authorization.authorization) return\n assertAuthorized(\n { projectId, ...authorization },\n {\n kind: \"object.query\",\n touchedObjectTypeIds: validated.touchedObjectTypeIds,\n }\n )\n}\n\ninterface ExpansionResolutionContext {\n ontology: OntologyRegistry\n maxExpansionFanout: number | undefined\n}\n\nfunction expandPushdownQuery(\n query: ObjectQuery,\n ontology: OntologyRegistry,\n capabilities: ObjectQueryCapabilities,\n planning: Omit<ObjectQueryPlanningOptions, \"capabilities\">,\n maxExpansionFanout?: number\n): ObjectQuery {\n // Resolve each expansion's cardinality and effective per-parent limit from the\n // ontology so a provider can push the graph read down without one. The planner\n // only admits expand pushdown once every expansion carries a cardinality, so a\n // mixed/unresolved expansion (e.g. a polymorphic parent whose branches\n // disagree) cleanly stays on the fallback.\n const ctx: ExpansionResolutionContext = { ontology, maxExpansionFanout }\n const annotated = resolveExpansions(query, ctx)\n const expanded = expandIncludeSubtypes(annotated, ontology)\n if (expanded === annotated) return annotated\n\n const plan = planObjectQuery(expanded, { ...planning, capabilities, allowFallback: false })\n return plan.mode === \"pushdown\" ? expanded : annotated\n}\n\n// Walk to the (normalized, outermost) expand node and annotate every expansion\n// with its resolved cardinality and bounded limit. Output-shaping only — never\n// changes which objects match — so it composes with `expandIncludeSubtypes`.\nfunction resolveExpansions(query: ObjectQuery, ctx: ExpansionResolutionContext): ObjectQuery {\n switch (query.kind) {\n case \"expand\": {\n const parentShape = safeResultShape(query.input, ctx.ontology)\n return {\n ...query,\n input: resolveExpansions(query.input, ctx),\n expansions: query.expansions.map((expansion) =>\n annotateExpansion(expansion, parentShape, ctx)\n ),\n }\n }\n case \"start\":\n case \"refs\":\n return query\n case \"set\":\n return {\n ...query,\n inputs: query.inputs.map((input) => resolveExpansions(input, ctx)),\n }\n case \"filter\":\n case \"text\":\n case \"vector\":\n case \"traverse\":\n case \"sort\":\n case \"limit\":\n case \"page\":\n case \"project\":\n return { ...query, input: resolveExpansions(query.input, ctx) }\n }\n}\n\nfunction annotateExpansion(\n expansion: ObjectExpansion,\n parentShape: ObjectQueryResultShape,\n ctx: ExpansionResolutionContext\n): ObjectExpansion {\n const cardinality = resolveUniformCardinality(expansion, parentShape, ctx.ontology)\n // Bake the per-parent top-N the provider must apply: the authored limit clamped\n // by the fanout backstop (the fallback computes the same via\n // `effectiveExpansionFanout`). Always defined afterwards, so the compiler need\n // not re-derive the cap.\n const limit = effectiveExpansionFanout(expansion.limit, ctx.maxExpansionFanout)\n const base: ObjectExpansion = cardinality\n ? { ...expansion, cardinality, limit }\n : { ...expansion, limit }\n\n if (!expansion.expand || expansion.expand.length === 0) return base\n\n const targetShape = resolveExpansionTargetShape(expansion, parentShape, ctx.ontology)\n return {\n ...base,\n expand: expansion.expand.map((nested) => annotateExpansion(nested, targetShape, ctx)),\n }\n}\n\n// The attached value shape is uniform only when every parent type resolves the\n// link to the same cardinality. A non-declaring parent type contributes \"many\"\n// (matching the fallback's `link?.cardinality ?? \"many\"`); incoming is always\n// many-to-one. A mixed result returns undefined, keeping the query on fallback.\nfunction resolveUniformCardinality(\n expansion: ObjectExpansion,\n parentShape: ObjectQueryResultShape,\n ontology: OntologyRegistry\n): \"one\" | \"many\" | undefined {\n if (expansion.direction === \"incoming\") return \"many\"\n if (parentShape.objectTypeIds.length === 0) return undefined\n\n const cardinalities = new Set<\"one\" | \"many\">()\n for (const objectTypeId of parentShape.objectTypeIds) {\n const objectType = ontology.getObjectTypeById(objectTypeId)\n const link = objectType?.links.find((candidate) => candidate.id === expansion.linkId)\n cardinalities.add(link?.cardinality ?? \"many\")\n }\n return cardinalities.size === 1 ? [...cardinalities][0] : undefined\n}\n\n// The objects reached by an expansion are exactly the result of the equivalent\n// traverse, so reuse the shared shape resolver instead of re-deriving link\n// targets. Used to carry the parent context into nested expansions.\nfunction resolveExpansionTargetShape(\n expansion: ObjectExpansion,\n parentShape: ObjectQueryResultShape,\n ontology: OntologyRegistry\n): ObjectQueryResultShape {\n if (parentShape.objectTypeIds.length === 0) return { objectTypeIds: [] }\n\n const input: ObjectQuery =\n parentShape.objectTypeIds.length === 1\n ? { kind: \"start\", objectTypeId: parentShape.objectTypeIds[0] }\n : {\n kind: \"set\",\n op: \"union\",\n inputs: parentShape.objectTypeIds.map((objectTypeId) => ({\n kind: \"start\",\n objectTypeId,\n })),\n }\n const traverse: ObjectQuery = {\n kind: \"traverse\",\n input,\n linkId: expansion.linkId,\n direction: expansion.direction,\n ...(expansion.sourceObjectTypeId === undefined\n ? {}\n : { sourceObjectTypeId: expansion.sourceObjectTypeId }),\n }\n return safeResultShape(traverse, ontology)\n}\n\n// Cardinality resolution is a pushdown optimization, never a correctness\n// requirement: any failure to resolve a shape (the resolver throws on a query it\n// considers invalid) must degrade to \"unresolved\", which the planner reads as\n// \"keep this on the fallback\" rather than surfacing an error.\nfunction safeResultShape(query: ObjectQuery, ontology: OntologyRegistry): ObjectQueryResultShape {\n try {\n return resolveObjectQueryResultShape(query, { ontology })\n } catch {\n return { objectTypeIds: [] }\n }\n}\n\nfunction expandIncludeSubtypes(query: ObjectQuery, ontology: OntologyRegistry): ObjectQuery {\n switch (query.kind) {\n case \"start\": {\n if (query.includeSubtypes !== true) return query\n const objectTypeIds = [query.objectTypeId, ...ontology.listSubTypes(query.objectTypeId)]\n if (objectTypeIds.length === 1) return { kind: \"start\", objectTypeId: query.objectTypeId }\n return {\n kind: \"set\",\n op: \"union\",\n inputs: objectTypeIds.map((objectTypeId) => ({ kind: \"start\", objectTypeId })),\n }\n }\n case \"refs\":\n return query\n case \"filter\":\n case \"text\":\n case \"vector\":\n case \"traverse\":\n case \"sort\":\n case \"limit\":\n case \"page\":\n case \"project\":\n case \"expand\":\n return { ...query, input: expandIncludeSubtypes(query.input, ontology) }\n case \"set\":\n return {\n ...query,\n inputs: query.inputs.map((input) => expandIncludeSubtypes(input, ontology)),\n }\n }\n}\n\nasync function executeFallbackQuery(\n projectId: string,\n query: ObjectQuery,\n options: QueryExecutorOptions,\n resultOptions: { includeTotal?: boolean }\n): Promise<QueryObjectsResult> {\n const maxRows = options.maxFallbackRows ?? DEFAULT_MAX_FALLBACK_ROWS\n const evaluation = await evaluateFallbackQuery(projectId, query, options, maxRows)\n return {\n objects: evaluation.entries.map((entry) => entry.row),\n hasMore: evaluation.hasMore,\n nextPageToken: evaluation.nextPageToken,\n ...(resultOptions.includeTotal === false ? {} : { total: evaluation.total }),\n }\n}\n\nasync function evaluateFallbackQuery(\n projectId: string,\n query: ObjectQuery,\n options: QueryExecutorOptions,\n maxRows: number\n): Promise<FallbackEvaluation> {\n switch (query.kind) {\n case \"start\":\n return evaluateFallbackStart(projectId, query, options, maxRows)\n case \"refs\":\n return evaluateFallbackRefs(projectId, query, options)\n case \"filter\": {\n const input = await evaluateFallbackQuery(projectId, query.input, options, maxRows)\n return completeFallbackEvaluation(\n input.entries.filter((entry) => matchesPredicate(entry.row, query.predicate))\n )\n }\n case \"sort\": {\n const input = await evaluateFallbackQuery(projectId, query.input, options, maxRows)\n return {\n ...input,\n entries: sortEntries(input.entries, query.fields),\n }\n }\n case \"limit\": {\n const input = await evaluateFallbackQuery(projectId, query.input, options, maxRows)\n const limit = Math.max(0, query.limit)\n return {\n entries: input.entries.slice(0, limit),\n total: input.entries.length,\n hasMore: limit < input.entries.length,\n }\n }\n case \"page\": {\n const input = await evaluateFallbackQuery(projectId, query.input, options, maxRows)\n const offset = decodePageOffset(query.pageToken)\n const pageSize = Math.max(0, query.pageSize)\n const nextOffset = offset + pageSize\n const hasMore = pageSize > 0 && nextOffset < input.entries.length\n return {\n entries: input.entries.slice(offset, nextOffset),\n total: input.entries.length,\n hasMore,\n nextPageToken: hasMore ? encodePageOffset(nextOffset) : undefined,\n }\n }\n case \"project\": {\n const input = await evaluateFallbackQuery(projectId, query.input, options, maxRows)\n if (!query.properties) return input\n const properties = query.properties\n return {\n ...input,\n entries: input.entries.map((entry) => ({\n ...entry,\n row: projectRow(entry.row, properties),\n })),\n }\n }\n case \"expand\": {\n // `expand` is output-shaping and normalized to the outermost layer: the\n // input produces the bounded parent set, then we attach hydrated links\n // without changing which objects match.\n const input = await evaluateFallbackQuery(projectId, query.input, options, maxRows)\n const enriched = await hydrateExpansions(\n projectId,\n input.entries.map((entry) => entry.row),\n query.expansions,\n options\n )\n return {\n ...input,\n entries: input.entries.map((entry, index) => ({ ...entry, row: enriched[index] })),\n }\n }\n case \"text\":\n case \"vector\":\n case \"traverse\":\n case \"set\":\n throw new ObjectQueryExecutionError(\n \"fallback_node_not_supported\",\n `Fallback execution does not support query node '${query.kind}'`\n )\n }\n}\n\nasync function evaluateFallbackRefs(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"refs\" }>,\n options: QueryExecutorOptions\n): Promise<FallbackEvaluation> {\n const rows = await options.storage.getByPrimaryIdBatch({\n projectId,\n items: query.refs,\n })\n return completeFallbackEvaluation(\n query.refs.flatMap((ref, order) => {\n const row = rows.get(objectBatchKey(ref.objectTypeId, ref.primaryId))\n return row ? [{ row, order }] : []\n })\n )\n}\n\n/**\n * A candidate neighbour for one parent under a single expansion: the object to\n * hydrate plus the metadata carried on the link edge. For outgoing expansions\n * the neighbour is the link target; for incoming it is the link source.\n */\ntype ExpansionEdge = {\n neighborTypeId: string\n neighborId: string\n edgeProperties?: Record<string, unknown>\n}\n\n// Attach `links` to each parent row by hydrating every expansion over the batch\n// storage primitives. Returns fresh rows — stored rows are read by reference, so\n// we never mutate them in place.\nasync function hydrateExpansions(\n projectId: string,\n parents: readonly ObjectRow[],\n expansions: readonly ObjectExpansion[],\n options: QueryExecutorOptions\n): Promise<ObjectRow[]> {\n if (expansions.length === 0) {\n return parents.map((parent) => ({ ...parent }))\n }\n\n const linksByParent: ObjectRowLinks[] = parents.map(() => ({}))\n for (const expansion of expansions) {\n const values = await hydrateExpansion(projectId, parents, expansion, options)\n values.forEach((value, index) => {\n // Keyed by link id, matching the `row.links.<linkId>` authoring surface.\n // Same-id expansions in opposing directions would collide here, but\n // normalization keeps them distinct and that pairing is not yet exposed.\n linksByParent[index][expansion.linkId] = value\n })\n }\n\n return parents.map((parent, index) => ({ ...parent, links: linksByParent[index] }))\n}\n\n// Resolve one expansion for every parent, returning a value aligned to `parents`.\nasync function hydrateExpansion(\n projectId: string,\n parents: readonly ObjectRow[],\n expansion: ObjectExpansion,\n options: QueryExecutorOptions\n): Promise<ExpandedLinkValue[]> {\n const edgesByParent =\n expansion.direction === \"incoming\"\n ? await collectIncomingEdges(projectId, parents, expansion, options)\n : await collectOutgoingEdges(projectId, parents, expansion, options)\n\n // Ordering is against target properties, so the target rows must be loaded\n // before the per-parent top-N trim can run.\n const baseTargets = await fetchExpansionTargets(projectId, edgesByParent, options)\n const trimmedByParent = edgesByParent.map((edges) =>\n trimExpansionEdges(edges, expansion, baseTargets, options)\n )\n\n const enrichedByKey = await enrichExpansionTargets(\n projectId,\n trimmedByParent,\n baseTargets,\n expansion,\n options\n )\n\n return parents.map((parent, index) => {\n const expanded: ExpandedObjectRow[] = []\n for (const edge of trimmedByParent[index]) {\n const target = enrichedByKey.get(targetKey(edge.neighborTypeId, edge.neighborId))\n // A dangling link (target removed) hydrates to nothing.\n if (!target) continue\n expanded.push(\n edge.edgeProperties && Object.keys(edge.edgeProperties).length > 0\n ? { ...target, linkProperties: edge.edgeProperties }\n : { ...target }\n )\n }\n return toLinkValue(expanded, expansionCardinality(parent, expansion, options))\n })\n}\n\nasync function collectOutgoingEdges(\n projectId: string,\n parents: readonly ObjectRow[],\n expansion: ObjectExpansion,\n options: QueryExecutorOptions\n): Promise<ExpansionEdge[][]> {\n const linksByKey = await options.storage.listLinksBatch({\n projectId,\n items: parents.map((parent) => ({\n objectTypeId: parent.objectTypeId,\n objectId: parent.primaryId,\n linkId: expansion.linkId,\n })),\n })\n\n return parents.map((parent) => {\n const links = linksByKey.get(\n linkBatchKey(parent.objectTypeId, parent.primaryId, expansion.linkId)\n )\n if (!links) return []\n return links.map((link) => ({\n neighborTypeId: link.targetTypeId,\n neighborId: link.targetId,\n edgeProperties: link.properties,\n }))\n })\n}\n\nasync function collectIncomingEdges(\n projectId: string,\n parents: readonly ObjectRow[],\n expansion: ObjectExpansion,\n options: QueryExecutorOptions\n): Promise<ExpansionEdge[][]> {\n const linksByKey = await options.storage.listLinksBatch({\n projectId,\n direction: \"incoming\",\n items: parents.map((parent) => ({\n objectTypeId: parent.objectTypeId,\n objectId: parent.primaryId,\n linkId: expansion.linkId,\n })),\n })\n\n return parents.map((parent) => {\n const links = linksByKey.get(\n linkBatchKey(parent.objectTypeId, parent.primaryId, expansion.linkId)\n )\n if (!links) return []\n // For an incoming expansion the hydrated object is the link's source.\n return links\n .filter(\n (link) =>\n !expansion.sourceObjectTypeId || link.sourceTypeId === expansion.sourceObjectTypeId\n )\n .map((link) => ({\n neighborTypeId: link.sourceTypeId,\n neighborId: link.sourceId,\n edgeProperties: link.properties,\n }))\n })\n}\n\nasync function fetchExpansionTargets(\n projectId: string,\n edgesByParent: readonly ExpansionEdge[][],\n options: QueryExecutorOptions\n): Promise<ReadonlyMap<ObjectBatchKey, ObjectRow>> {\n const seen = new Set<ObjectBatchKey>()\n const items: { objectTypeId: string; primaryId: string }[] = []\n for (const edges of edgesByParent) {\n for (const edge of edges) {\n const key = targetKey(edge.neighborTypeId, edge.neighborId)\n if (seen.has(key)) continue\n seen.add(key)\n items.push({ objectTypeId: edge.neighborTypeId, primaryId: edge.neighborId })\n }\n }\n if (items.length === 0) return new Map()\n return options.storage.getByPrimaryIdBatch({ projectId, items })\n}\n\n// Recurse nested expansions over the unique retained targets so each target is\n// hydrated once even when shared across parents, then key them for lookup.\nasync function enrichExpansionTargets(\n projectId: string,\n trimmedByParent: readonly ExpansionEdge[][],\n baseTargets: ReadonlyMap<ObjectBatchKey, ObjectRow>,\n expansion: ObjectExpansion,\n options: QueryExecutorOptions\n): Promise<ReadonlyMap<ObjectBatchKey, ObjectRow>> {\n if (!expansion.expand || expansion.expand.length === 0) {\n return baseTargets\n }\n\n const uniqueTargets: ObjectRow[] = []\n const seen = new Set<string>()\n for (const edges of trimmedByParent) {\n for (const edge of edges) {\n const key = targetKey(edge.neighborTypeId, edge.neighborId)\n if (seen.has(key)) continue\n seen.add(key)\n const base = baseTargets.get(key)\n if (base) uniqueTargets.push(base)\n }\n }\n\n const enriched = await hydrateExpansions(projectId, uniqueTargets, expansion.expand, options)\n const enrichedByKey = new Map<ObjectBatchKey, ObjectRow>()\n for (const row of enriched) {\n enrichedByKey.set(targetKey(row.objectTypeId, row.primaryId), row)\n }\n return enrichedByKey\n}\n\nfunction trimExpansionEdges(\n edges: readonly ExpansionEdge[],\n expansion: ObjectExpansion,\n baseTargets: ReadonlyMap<ObjectBatchKey, ObjectRow>,\n options: QueryExecutorOptions\n): ExpansionEdge[] {\n let ordered = edges\n if (expansion.orderBy && expansion.orderBy.length > 0) {\n const fields = expansion.orderBy\n ordered = [...edges].sort((left, right) =>\n compareExpansionEdges(left, right, fields, baseTargets)\n )\n }\n\n const limit = effectiveExpansionFanout(expansion.limit, options.maxExpansionFanout)\n return ordered.length > limit ? ordered.slice(0, limit) : [...ordered]\n}\n\nfunction effectiveExpansionFanout(\n limit: number | undefined,\n maxExpansionFanout: number | undefined\n): number {\n const cap = maxExpansionFanout !== undefined ? maxExpansionFanout : DEFAULT_MAX_EXPANSION_FANOUT\n return limit !== undefined ? Math.min(limit, cap) : cap\n}\n\nfunction compareExpansionEdges(\n left: ExpansionEdge,\n right: ExpansionEdge,\n fields: readonly ObjectQuerySortField[],\n baseTargets: ReadonlyMap<ObjectBatchKey, ObjectRow>\n): number {\n const leftRow = baseTargets.get(targetKey(left.neighborTypeId, left.neighborId))\n const rightRow = baseTargets.get(targetKey(right.neighborTypeId, right.neighborId))\n for (const field of fields) {\n const comparison = compareRowsBySortField(leftRow, rightRow, field)\n if (comparison !== 0) return comparison\n }\n // Identity tiebreak keeps the trim deterministic for equal sort keys.\n return targetKey(left.neighborTypeId, left.neighborId).localeCompare(\n targetKey(right.neighborTypeId, right.neighborId)\n )\n}\n\nfunction compareRowsBySortField(\n left: ObjectRow | undefined,\n right: ObjectRow | undefined,\n field: ObjectQuerySortField\n): number {\n if (field.kind === \"relevance\") return 0\n\n const leftValue = left?.properties[field.propertyId]\n const rightValue = right?.properties[field.propertyId]\n const leftMissing = leftValue === undefined || leftValue === null\n const rightMissing = rightValue === undefined || rightValue === null\n if (leftMissing && rightMissing) return 0\n if (leftMissing) return 1\n if (rightMissing) return -1\n\n const comparison = compareQueryScalarValues(leftValue, rightValue, field.scalarKind)\n if (Number.isNaN(comparison)) return 0\n return field.direction === \"desc\" ? -comparison : comparison\n}\n\n// Outgoing cardinality comes from the parent type's link; incoming is inherently\n// many-to-one, so an incoming expansion always yields an array.\nfunction expansionCardinality(\n parent: ObjectRow,\n expansion: ObjectExpansion,\n options: QueryExecutorOptions\n): \"one\" | \"many\" {\n if (expansion.direction === \"incoming\") return \"many\"\n const objectType = options.ontology.getObjectTypeById(parent.objectTypeId)\n const link = objectType?.links.find((candidate) => candidate.id === expansion.linkId)\n return link?.cardinality ?? \"many\"\n}\n\nfunction toLinkValue(\n rows: readonly ExpandedObjectRow[],\n cardinality: \"one\" | \"many\"\n): ExpandedLinkValue {\n if (cardinality === \"one\") return rows[0] ?? null\n return rows\n}\n\nfunction targetKey(objectTypeId: string, id: string): ObjectBatchKey {\n return objectBatchKey(objectTypeId, id)\n}\n\nasync function evaluateFallbackStart(\n projectId: string,\n query: Extract<ObjectQuery, { kind: \"start\" }>,\n options: QueryExecutorOptions,\n maxRows: number\n): Promise<FallbackEvaluation> {\n const objectTypeIds = query.includeSubtypes\n ? [query.objectTypeId, ...options.ontology.listSubTypes(query.objectTypeId)]\n : [query.objectTypeId]\n\n const result = await options.storage.list({\n projectId,\n objectTypeId: objectTypeIds,\n limit: maxRows + 1,\n orderBy: \"primaryId\",\n order: \"asc\",\n })\n // Request one extra row so the executor can prove the source scan stayed\n // within its bound even when the storage backend does not return total counts.\n if (result.objects.length > maxRows || result.hasMore || result.total > maxRows) {\n throw new ObjectQueryExecutionError(\n \"fallback_row_limit_exceeded\",\n `Fallback start '${query.objectTypeId}' exceeded maxFallbackRows=${maxRows}`,\n \"$.start\"\n )\n }\n\n return completeFallbackEvaluation(\n result.objects.map((row, index) => ({\n row,\n order: index,\n }))\n )\n}\n\nfunction completeFallbackEvaluation(entries: FallbackEntry[]): FallbackEvaluation {\n return {\n entries,\n total: entries.length,\n hasMore: false,\n }\n}\n\nfunction matchesPredicate(row: ObjectRow, predicate: ObjectQueryPredicate): boolean {\n switch (predicate.op) {\n case \"and\":\n return predicate.items.every((item) => matchesPredicate(row, item))\n case \"or\":\n return predicate.items.some((item) => matchesPredicate(row, item))\n case \"not\":\n return !matchesPredicate(row, predicate.item)\n case \"eq\":\n return queryScalarValuesEqual(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n )\n case \"neq\":\n return !queryScalarValuesEqual(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n )\n case \"lt\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) < 0\n )\n case \"lte\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) <= 0\n )\n case \"gt\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) > 0\n )\n case \"gte\":\n return (\n compareQueryScalarValues(\n row.properties[predicate.propertyId],\n predicate.value,\n predicate.scalarKind\n ) >= 0\n )\n case \"in\":\n return predicate.values.some((value) =>\n queryScalarValuesEqual(row.properties[predicate.propertyId], value, predicate.scalarKind)\n )\n case \"exists\": {\n const exists =\n Object.hasOwn(row.properties, predicate.propertyId) &&\n row.properties[predicate.propertyId] !== undefined\n return predicate.value ? exists : !exists\n }\n case \"contains\":\n return containsValue(row.properties[predicate.propertyId], predicate.value)\n }\n}\n\nfunction containsValue(actual: unknown, expected: unknown): boolean {\n if (typeof actual === \"string\" && typeof expected === \"string\") {\n return actual.includes(expected)\n }\n\n if (Array.isArray(actual)) {\n return actual.some((item) => queryScalarValuesEqual(item, expected))\n }\n\n if (isPlainObject(actual) && typeof expected === \"string\") {\n return Object.hasOwn(actual, expected)\n }\n\n return false\n}\n\nfunction sortEntries(\n entries: readonly FallbackEntry[],\n fields: readonly ObjectQuerySortField[]\n): FallbackEntry[] {\n return [...entries].sort((left, right) => {\n for (const field of fields) {\n const comparison = compareSortField(left, right, field)\n if (comparison !== 0) return comparison\n }\n // Preserve storage order for true ties, then use identity as a deterministic\n // final fallback so tests and page tokens stay stable.\n return (\n left.order - right.order || rowIdentityKey(left.row).localeCompare(rowIdentityKey(right.row))\n )\n })\n}\n\nfunction compareSortField(\n left: FallbackEntry,\n right: FallbackEntry,\n field: ObjectQuerySortField\n): number {\n if (field.kind === \"relevance\") return 0\n\n const leftValue = left.row.properties[field.propertyId]\n const rightValue = right.row.properties[field.propertyId]\n const leftMissing = leftValue === undefined || leftValue === null\n const rightMissing = rightValue === undefined || rightValue === null\n if (leftMissing && rightMissing) return 0\n if (leftMissing) return 1\n if (rightMissing) return -1\n\n const comparison = compareQueryScalarValues(leftValue, rightValue, field.scalarKind)\n if (Number.isNaN(comparison)) return 0\n return field.direction === \"desc\" ? -comparison : comparison\n}\n\nfunction projectRow(row: ObjectRow, properties: readonly string[]): ObjectRow {\n const projected: Record<string, unknown> = {}\n for (const propertyId of properties) {\n if (Object.hasOwn(row.properties, propertyId)) {\n projected[propertyId] = row.properties[propertyId]\n }\n }\n return { ...row, properties: projected }\n}\n\nfunction stripOuterRowShape(query: ObjectQuery): ObjectQuery {\n switch (query.kind) {\n case \"limit\":\n case \"page\":\n case \"project\":\n case \"sort\":\n // `expand` is output-shaping: it attaches links but does not change which\n // objects match, so aggregates (count/exists/facets) ignore it.\n case \"expand\":\n return stripOuterRowShape(query.input)\n default:\n return query\n }\n}\n\n/** @internal Shared pre-storage validation; intentionally absent from query barrels. */\nexport function validateObjectFacetRequests(\n facets: readonly ObjectFacetRequest[],\n objectTypeIds: readonly string[],\n options: Pick<QueryExecutorOptions, \"ontology\" | \"maxFacetLimit\">\n): ObjectFacetRequest[] {\n const issues: ObjectQueryValidationIssue[] = []\n const maxLimit = options.maxFacetLimit ?? DEFAULT_MAX_FACET_LIMIT\n\n if (facets.length === 0) {\n addFacetIssue(issues, \"$.facets\", \"empty_facets\", \"At least one facet is required\")\n }\n\n if (facets.length > MAX_OBJECT_READ_FACETS) {\n throw new ObjectQueryValidationError([\n {\n path: \"$.facets\",\n code: \"too_many_facets\",\n message: `facets must include at most ${MAX_OBJECT_READ_FACETS} facet requests`,\n },\n ])\n }\n\n if (!Number.isInteger(maxLimit) || maxLimit <= 0) {\n addFacetIssue(\n issues,\n \"$.maxFacetLimit\",\n \"invalid_facet_bound\",\n \"maxFacetLimit must be positive\"\n )\n }\n\n const seenPropertyIds = new Set<string>()\n const normalizedFacets: ObjectFacetRequest[] = []\n\n facets.forEach((facet, index) => {\n const path = `$.facets[${index}]`\n const propertyId = typeof facet.propertyId === \"string\" ? facet.propertyId.trim() : \"\"\n\n if (!propertyId) {\n addFacetIssue(\n issues,\n `${path}.propertyId`,\n \"missing_facet_property\",\n \"Facet propertyId is required\"\n )\n } else if (seenPropertyIds.has(propertyId)) {\n addFacetIssue(\n issues,\n `${path}.propertyId`,\n \"duplicate_facet\",\n `Facet property '${propertyId}' is requested more than once`\n )\n } else {\n seenPropertyIds.add(propertyId)\n }\n\n if (!Number.isInteger(facet.limit) || facet.limit <= 0) {\n addFacetIssue(\n issues,\n `${path}.limit`,\n \"invalid_facet_limit\",\n \"Facet limit must be a positive integer\"\n )\n } else if (facet.limit > maxLimit) {\n addFacetIssue(\n issues,\n `${path}.limit`,\n \"facet_limit_too_large\",\n `Facet limit must be less than or equal to ${maxLimit}`\n )\n }\n\n if (!propertyId) return\n\n for (const objectTypeId of objectTypeIds) {\n const objectType = options.ontology.getObjectTypeById(objectTypeId)\n const property = objectType?.properties.find((candidate) => candidate.id === propertyId)\n\n if (!objectType || !property) {\n addFacetIssue(\n issues,\n `${path}.propertyId`,\n \"unknown_facet_property\",\n `Property '${propertyId}' is not defined on '${objectTypeId}'`\n )\n continue\n }\n\n if (property.query?.searchable !== true || property.query.facet !== true) {\n addFacetIssue(\n issues,\n `${path}.propertyId`,\n \"property_not_facetable\",\n `Property '${propertyId}' on '${objectTypeId}' must set query.searchable: true and query.facet: true before it can be used as a facet`\n )\n }\n }\n\n normalizedFacets.push({ propertyId, limit: facet.limit })\n })\n\n if (issues.length > 0) {\n throw new ObjectQueryValidationError(issues)\n }\n\n return normalizedFacets\n}\n\nfunction addFacetIssue(\n issues: ObjectQueryValidationIssue[],\n path: string,\n code: string,\n message: string\n): void {\n issues.push({ path, code, message })\n}\n\nfunction buildFacetResults(\n rows: readonly ObjectRow[],\n facets: readonly ObjectFacetRequest[]\n): ObjectFacetResult[] {\n return facets.map((facet) => ({\n propertyId: facet.propertyId,\n buckets: buildFacetBuckets(rows, facet),\n }))\n}\n\nfunction buildFacetBuckets(\n rows: readonly ObjectRow[],\n facet: ObjectFacetRequest\n): ObjectFacetResult[\"buckets\"] {\n const buckets = new Map<string, { value: unknown; count: number }>()\n\n for (const row of rows) {\n if (!Object.hasOwn(row.properties, facet.propertyId)) continue\n const value = row.properties[facet.propertyId]\n if (value === undefined) continue\n const key = facetValueKey(value)\n const existing = buckets.get(key)\n if (existing) {\n existing.count += 1\n } else {\n buckets.set(key, { value, count: 1 })\n }\n }\n\n return [...buckets.values()]\n .sort(\n (left, right) =>\n right.count - left.count ||\n facetValueSortKey(left.value).localeCompare(facetValueSortKey(right.value))\n )\n .slice(0, facet.limit)\n}\n\nfunction facetValueKey(value: unknown): string {\n return JSON.stringify(value) ?? String(value)\n}\n\nfunction facetValueSortKey(value: unknown): string {\n return JSON.stringify(value) ?? String(value)\n}\n\nfunction rowIdentityKey(row: ObjectRow): string {\n return objectBatchKey(row.objectTypeId, row.primaryId)\n}\n\nfunction encodePageOffset(offset: number): string {\n return `${PAGE_TOKEN_PREFIX}${offset}`\n}\n\nfunction decodePageOffset(token: string | undefined): number {\n if (!token) return 0\n if (!token.startsWith(PAGE_TOKEN_PREFIX)) {\n throw new ObjectQueryExecutionError(\n \"invalid_page_token\",\n \"Fallback page token must use the offset token format\"\n )\n }\n\n const offset = Number(token.slice(PAGE_TOKEN_PREFIX.length))\n if (!Number.isInteger(offset) || offset < 0) {\n throw new ObjectQueryExecutionError(\n \"invalid_page_token\",\n \"Fallback page token contains an invalid offset\"\n )\n }\n return offset\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n",
9
+ "import type { OntologyRegistry } from \"../../ontology\"\nimport type {\n ObjectExpansion,\n ObjectQuery,\n ObjectQueryPredicate,\n ObjectQueryResultShape,\n ObjectQuerySortField,\n} from \"./ir\"\nimport { normalizeObjectQuery } from \"./normalize\"\nimport {\n collectObjectQueryValidationIssues,\n type ObjectQueryValidationIssue,\n validateObjectQuery,\n} from \"./validate\"\n\nexport interface ObjectQueryExplainOptions {\n ontology?: OntologyRegistry\n normalize?: boolean\n maxLimit?: number\n maxPageSize?: number\n maxRefs?: number\n}\n\nexport interface ObjectQueryExplanation {\n query: ObjectQuery\n normalizedQuery: ObjectQuery\n valid?: boolean\n result?: ObjectQueryResultShape\n issues: readonly ObjectQueryValidationIssue[]\n tree: ObjectQueryExplainNode\n}\n\nexport interface ObjectQueryExplainNode {\n path: string\n kind: ObjectQuery[\"kind\"]\n summary: string\n details: Record<string, unknown>\n children: readonly ObjectQueryExplainNode[]\n}\n\nexport function explainObjectQuery(\n query: ObjectQuery,\n options: ObjectQueryExplainOptions = {}\n): ObjectQueryExplanation {\n const normalizedQuery = options.normalize === false ? query : normalizeObjectQuery(query)\n const issues = options.ontology\n ? collectObjectQueryValidationIssues(normalizedQuery, {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n maxRefs: options.maxRefs,\n normalize: false,\n })\n : []\n\n const result =\n options.ontology && issues.length === 0\n ? validateObjectQuery(normalizedQuery, {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n maxRefs: options.maxRefs,\n normalize: false,\n }).result\n : undefined\n\n return {\n query,\n normalizedQuery,\n valid: options.ontology ? issues.length === 0 : undefined,\n result,\n issues,\n tree: buildExplainNode(normalizedQuery, \"$\"),\n }\n}\n\nfunction buildExplainNode(query: ObjectQuery, path: string): ObjectQueryExplainNode {\n switch (query.kind) {\n case \"start\":\n return {\n path,\n kind: query.kind,\n summary: `start ${query.objectTypeId}`,\n details: {\n objectTypeId: query.objectTypeId,\n includeSubtypes: query.includeSubtypes === true,\n },\n children: [],\n }\n case \"refs\":\n return {\n path,\n kind: query.kind,\n summary: `refs ${query.refs.length}`,\n details: { refs: query.refs },\n children: [],\n }\n case \"filter\":\n return {\n path,\n kind: query.kind,\n summary: `filter ${summarizePredicate(query.predicate)}`,\n details: { predicate: query.predicate },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"text\":\n return {\n path,\n kind: query.kind,\n summary: `text \"${query.query}\"`,\n details: {\n query: query.query,\n fields: query.fields,\n fieldsByObjectType: query.fieldsByObjectType,\n },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"vector\":\n return {\n path,\n kind: query.kind,\n summary: `vector profile ${query.profile} k=${query.k}`,\n details: {\n profile: query.profile,\n input: typeof query.vector === \"string\" ? \"text\" : \"vector\",\n dimensions: typeof query.vector === \"string\" ? undefined : query.vector.length,\n k: query.k,\n },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"traverse\":\n return {\n path,\n kind: query.kind,\n summary:\n query.sourceObjectTypeId === undefined\n ? `traverse ${query.direction} ${query.linkId}`\n : `traverse ${query.direction} ${query.sourceObjectTypeId}.${query.linkId}`,\n details: {\n linkId: query.linkId,\n direction: query.direction,\n ...(query.sourceObjectTypeId === undefined\n ? {}\n : { sourceObjectTypeId: query.sourceObjectTypeId }),\n },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"set\":\n return {\n path,\n kind: query.kind,\n summary: `set ${query.op}`,\n details: { op: query.op, inputCount: query.inputs.length },\n children: query.inputs.map((input, index) =>\n buildExplainNode(input, `${path}.inputs[${index}]`)\n ),\n }\n case \"sort\":\n return {\n path,\n kind: query.kind,\n summary: `sort ${query.fields.map(summarizeSortField).join(\", \")}`,\n details: { fields: query.fields },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"limit\":\n return {\n path,\n kind: query.kind,\n summary: `limit ${query.limit}`,\n details: { limit: query.limit },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"page\":\n return {\n path,\n kind: query.kind,\n summary: `page ${query.pageSize}`,\n details: { pageSize: query.pageSize, hasPageToken: query.pageToken !== undefined },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"project\":\n return {\n path,\n kind: query.kind,\n summary: `project ${query.properties?.join(\", \") ?? \"*\"}`,\n details: { properties: query.properties },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n case \"expand\":\n return {\n path,\n kind: query.kind,\n summary: `expand ${query.expansions.map(summarizeExpansion).join(\", \")}`,\n details: { expansions: query.expansions },\n children: [buildExplainNode(query.input, `${path}.input`)],\n }\n }\n}\n\nfunction summarizeExpansion(expansion: ObjectExpansion): string {\n const head = expansion.direction === \"incoming\" ? `<-${expansion.linkId}` : expansion.linkId\n const nested =\n expansion.expand && expansion.expand.length > 0\n ? `(${expansion.expand.map(summarizeExpansion).join(\", \")})`\n : \"\"\n return `${head}${nested}`\n}\n\nfunction summarizePredicate(predicate: ObjectQueryPredicate): string {\n switch (predicate.op) {\n case \"and\":\n case \"or\":\n return `${predicate.op}(${predicate.items.map(summarizePredicate).join(\", \")})`\n case \"not\":\n return `not(${summarizePredicate(predicate.item)})`\n case \"in\":\n return `${predicate.propertyId} in [${predicate.values.length}]`\n case \"exists\":\n return `${predicate.propertyId} exists=${predicate.value}`\n case \"contains\":\n return `${predicate.propertyId} contains`\n default:\n return `${predicate.propertyId} ${predicate.op}`\n }\n}\n\nfunction summarizeSortField(field: ObjectQuerySortField): string {\n if (field.kind === \"relevance\") return `relevance ${field.direction ?? \"desc\"}`\n return `${field.propertyId} ${field.direction ?? \"asc\"}`\n}\n",
10
+ "import { createHash } from \"node:crypto\"\nimport { isAllowed } from \"../../authorization\"\nimport { stableJsonStringify } from \"../../json\"\nimport {\n type LinkDirection,\n type ObjectBatchKey,\n type ObjectLinkCursor,\n type ObjectLinkRow,\n type ObjectReadStorage,\n type ObjectRow,\n objectBatchKey,\n objectLinkCursor,\n} from \"../../storage\"\nimport { ObjectQueryExecutionError } from \"./errors\"\nimport { executeObjectQuery, type QueryExecutorOptions } from \"./executor\"\nimport type { ObjectQuery } from \"./ir\"\nimport { normalizeObjectQuery } from \"./normalize\"\nimport { type ValidatedObjectQuery, validateObjectQuery } from \"./validate\"\n\nexport interface ExecuteObjectQueryLinksInput {\n projectId: string\n query: ObjectQuery\n direction?: LinkDirection\n linkId?: string\n includeObjects?: boolean\n pageSize?: number\n pageToken?: string\n}\n\nexport interface ExecuteObjectQueryLinksResult {\n objects: readonly ObjectRow[]\n links: readonly ObjectLinkRow[]\n hasMore: boolean\n nextPageToken?: string\n}\n\nexport interface PreflightObjectQueryLinksResult {\n projectId: string\n validated: ValidatedObjectQuery\n direction: LinkDirection\n linkId?: string\n includeObjects: boolean\n pageSize: number\n cursor?: ObjectLinkCursor\n pageScope: string\n}\n\nconst MAX_LINK_QUERY_OBJECTS = 1_000\nconst MAX_LINK_PAGE_SIZE = 1_000\nconst DEFAULT_LINK_PAGE_SIZE = 100\nconst LINK_PAGE_TOKEN_PREFIX = \"link:v1:\"\n\n/**\n * Canonicalize and validate a physical-link query without reading storage.\n *\n * This direct-file-only boundary lets higher-level readers complete ordinary request validation\n * before applying terminal-specific authorization, while the executor consumes the exact same\n * preflight contract.\n *\n * @internal Intentionally absent from query barrels.\n */\nexport function preflightObjectQueryLinks(\n input: ExecuteObjectQueryLinksInput,\n options: Pick<QueryExecutorOptions, \"ontology\" | \"maxLimit\" | \"maxPageSize\" | \"maxRefs\">\n): PreflightObjectQueryLinksResult {\n // Capture caller-owned scalar fields once so validation, token scoping, and execution agree on\n // one request even when this internal API is reached without an AuthorizedObjectReader snapshot.\n const projectId = input.projectId\n const query = input.query\n const requestedDirection = input.direction\n const linkId = input.linkId\n const requestedIncludeObjects = input.includeObjects\n const requestedPageSize = input.pageSize\n const pageToken = input.pageToken\n\n const direction = requestedDirection ?? \"both\"\n if (direction !== \"outgoing\" && direction !== \"incoming\" && direction !== \"both\") {\n throw new ObjectQueryExecutionError(\n \"invalid_link_direction\",\n \"direction must be 'outgoing', 'incoming', or 'both'\",\n \"$.direction\"\n )\n }\n if (linkId !== undefined && typeof linkId !== \"string\") {\n throw new ObjectQueryExecutionError(\"invalid_link_id\", \"linkId must be a string\", \"$.linkId\")\n }\n if (linkId !== undefined && linkId.length === 0) {\n throw new ObjectQueryExecutionError(\"invalid_link_id\", \"linkId must not be empty\", \"$.linkId\")\n }\n if (requestedIncludeObjects !== undefined && typeof requestedIncludeObjects !== \"boolean\") {\n throw new ObjectQueryExecutionError(\n \"invalid_link_include_objects\",\n \"includeObjects must be a boolean\",\n \"$.includeObjects\"\n )\n }\n\n const pageSize = requestedPageSize ?? DEFAULT_LINK_PAGE_SIZE\n if (!Number.isInteger(pageSize) || pageSize <= 0 || pageSize > MAX_LINK_PAGE_SIZE) {\n throw new ObjectQueryExecutionError(\n \"invalid_link_page_size\",\n `pageSize must be an integer between 1 and ${MAX_LINK_PAGE_SIZE}`,\n \"$.pageSize\"\n )\n }\n\n const validated = validateObjectQuery(normalizeObjectQuery(query), {\n ontology: options.ontology,\n maxLimit: options.maxLimit,\n maxPageSize: options.maxPageSize,\n maxRefs: options.maxRefs,\n normalize: false,\n })\n assertLinkSelectorShape(validated.query)\n const pageScope = linkPageScope(projectId, validated.query, direction, linkId)\n const cursor = decodeLinkPageToken(pageToken, pageScope)\n\n return {\n projectId,\n validated,\n direction,\n ...(linkId === undefined ? {} : { linkId }),\n includeObjects: requestedIncludeObjects ?? false,\n pageSize,\n ...(cursor === undefined ? {} : { cursor }),\n pageScope,\n }\n}\n\n/**\n * Select a bounded object set with the query IR, then return physical links\n * incident to that set. This is a separate terminal because edge rows and edge\n * pagination are a different response contract from object-set queries.\n */\nexport async function executeObjectQueryLinks(\n input: ExecuteObjectQueryLinksInput,\n options: QueryExecutorOptions\n): Promise<ExecuteObjectQueryLinksResult> {\n const preflight = preflightObjectQueryLinks(input, options)\n const selectorQuery = preflight.validated.query\n\n // A root page already has an explicit result bound and must execute directly: nesting it under a\n // probe limit would expose the provider's internal pageSize+1 row. All other selector shapes are\n // capped here before the provider receives the selected identities.\n const boundedSelector =\n selectorQuery.kind === \"page\"\n ? selectorQuery\n : { kind: \"limit\" as const, limit: MAX_LINK_QUERY_OBJECTS + 1, input: selectorQuery }\n const selection = await executeObjectQuery(\n {\n projectId: preflight.projectId,\n query: boundedSelector,\n includeTotal: false,\n },\n {\n ...options,\n maxLimit: Math.max(options.maxLimit ?? 1_000, MAX_LINK_QUERY_OBJECTS + 1),\n }\n )\n if (selection.objects.length > MAX_LINK_QUERY_OBJECTS) {\n throw new ObjectQueryExecutionError(\n \"link_query_object_limit_exceeded\",\n `Link query selected more than ${MAX_LINK_QUERY_OBJECTS} objects; add a limit or page node`,\n \"$.query\"\n )\n }\n\n const selected = selection.objects\n if (selected.length === 0) {\n return { objects: [], links: [], hasMore: false }\n }\n\n const endpointObjectTypeIds = visibleEndpointTypeIds(options)\n const page = await options.storage.queryLinks({\n projectId: preflight.projectId,\n objectRefs: selected.map((row) => ({\n objectTypeId: row.objectTypeId,\n primaryId: row.primaryId,\n })),\n direction: preflight.direction,\n ...(preflight.linkId === undefined ? {} : { linkId: preflight.linkId }),\n ...(endpointObjectTypeIds === undefined ? {} : { endpointObjectTypeIds }),\n ...(preflight.cursor === undefined ? {} : { after: preflight.cursor }),\n limit: preflight.pageSize,\n })\n const lastLink = page.links.at(-1)\n let nextPageToken: string | undefined\n if (page.hasMore) {\n if (!lastLink) {\n throw new Error(\"[Sixb] Object storage returned hasMore for an empty link page.\")\n }\n nextPageToken = encodeLinkPageToken(objectLinkCursor(lastLink), preflight.pageScope)\n }\n const objects = preflight.includeObjects\n ? await hydrateLinkQueryObjects(preflight.projectId, selected, page.links, options.storage)\n : []\n\n return {\n objects,\n links: page.links,\n hasMore: page.hasMore,\n ...(nextPageToken ? { nextPageToken } : {}),\n }\n}\n\ninterface EncodedLinkPageToken {\n version: 1\n scope: string\n cursor: ObjectLinkCursor\n}\n\nfunction assertLinkSelectorShape(query: ObjectQuery, path = \"$.query\", root = true): void {\n switch (query.kind) {\n case \"project\":\n case \"expand\":\n throw new ObjectQueryExecutionError(\n \"link_selector_output_shape_not_supported\",\n `Link selectors do not support '${query.kind}' nodes; remove output shaping from the selector`,\n path\n )\n case \"page\":\n if (!root) {\n throw new ObjectQueryExecutionError(\n \"link_selector_page_must_be_root\",\n \"A page node in a link selector must be the outermost node\",\n path\n )\n }\n assertLinkSelectorShape(query.input, `${path}.input`, false)\n return\n case \"start\":\n case \"refs\":\n return\n case \"set\": {\n for (const [index, input] of query.inputs.entries()) {\n assertLinkSelectorShape(input, `${path}.inputs[${index}]`, false)\n }\n return\n }\n case \"filter\":\n case \"text\":\n case \"vector\":\n case \"traverse\":\n case \"sort\":\n case \"limit\":\n assertLinkSelectorShape(query.input, `${path}.input`, false)\n return\n }\n}\n\nfunction visibleEndpointTypeIds(options: QueryExecutorOptions): readonly string[] | undefined {\n if (!options.authorization) return undefined\n return options.ontology\n .listObjectTypes()\n .filter((objectType) =>\n isAllowed(options.authorization, { kind: \"object.view\", objectTypeId: objectType.id })\n )\n .map((objectType) => objectType.id)\n}\n\nfunction objectIdentity(objectTypeId: string, primaryId: string): ObjectBatchKey {\n return objectBatchKey(objectTypeId, primaryId)\n}\n\nfunction linkPageScope(\n projectId: string,\n query: ObjectQuery,\n direction: LinkDirection,\n linkId: string | undefined\n): string {\n return createHash(\"sha256\")\n .update(\n stableJsonStringify({\n projectId,\n query,\n direction,\n linkId: linkId ?? null,\n })\n )\n .digest(\"base64url\")\n}\n\nfunction encodeLinkPageToken(cursor: ObjectLinkCursor, scope: string): string {\n const payload: EncodedLinkPageToken = { version: 1, scope, cursor }\n return `${LINK_PAGE_TOKEN_PREFIX}${Buffer.from(JSON.stringify(payload)).toString(\"base64url\")}`\n}\n\nfunction decodeLinkPageToken(\n token: string | undefined,\n expectedScope: string\n): ObjectLinkCursor | undefined {\n if (token === undefined) return undefined\n try {\n if (!token.startsWith(LINK_PAGE_TOKEN_PREFIX)) throw new Error(\"invalid prefix\")\n const value = JSON.parse(\n Buffer.from(token.slice(LINK_PAGE_TOKEN_PREFIX.length), \"base64url\").toString(\"utf8\")\n ) as unknown\n if (\n !isPlainObject(value) ||\n value.version !== 1 ||\n typeof value.scope !== \"string\" ||\n !isObjectLinkCursor(value.cursor)\n ) {\n throw new Error(\"invalid cursor\")\n }\n if (value.scope !== expectedScope) {\n throw new Error(\"cursor scope mismatch\")\n }\n return value.cursor\n } catch {\n throw new ObjectQueryExecutionError(\n \"invalid_link_page_token\",\n \"pageToken is not a valid object-links cursor\",\n \"$.pageToken\"\n )\n }\n}\n\nfunction isObjectLinkCursor(value: unknown): value is ObjectLinkCursor {\n return (\n Array.isArray(value) && value.length === 5 && value.every((part) => typeof part === \"string\")\n )\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value)\n}\n\nasync function hydrateLinkQueryObjects(\n projectId: string,\n selected: readonly ObjectRow[],\n links: readonly ObjectLinkRow[],\n storage: ObjectReadStorage\n): Promise<ObjectRow[]> {\n const byIdentity = new Map(\n selected.map((row) => [objectIdentity(row.objectTypeId, row.primaryId), row])\n )\n const orderedIdentities = selected.map((row) => objectIdentity(row.objectTypeId, row.primaryId))\n const seenIdentities = new Set(orderedIdentities)\n const missingRefs: { objectTypeId: string; primaryId: string }[] = []\n\n for (const link of links) {\n for (const ref of [\n { objectTypeId: link.sourceTypeId, primaryId: link.sourceId },\n { objectTypeId: link.targetTypeId, primaryId: link.targetId },\n ]) {\n const identity = objectIdentity(ref.objectTypeId, ref.primaryId)\n if (seenIdentities.has(identity)) continue\n seenIdentities.add(identity)\n orderedIdentities.push(identity)\n missingRefs.push(ref)\n }\n }\n\n if (missingRefs.length > 0) {\n const hydrated = await storage.getByPrimaryIdBatch({ projectId, items: missingRefs })\n for (const ref of missingRefs) {\n const row = hydrated.get(objectBatchKey(ref.objectTypeId, ref.primaryId))\n if (row) byIdentity.set(objectIdentity(ref.objectTypeId, ref.primaryId), row)\n }\n }\n\n return orderedIdentities.flatMap((identity) => {\n const row = byIdentity.get(identity)\n return row ? [row] : []\n })\n}\n"
11
+ ],
12
+ "mappings": "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",
13
+ "debugId": "822E01D76051F29664756E2164756E21",
14
+ "names": []
15
+ }