@sixb/core 0.1.3 → 0.1.4

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 (252) hide show
  1. package/dist/actions/index.js +17 -18
  2. package/dist/actions/index.js.map +1 -1
  3. package/dist/actions/worker.js +4 -4
  4. package/dist/actions/worker.js.map +1 -1
  5. package/dist/agents/context-compaction.d.ts +40 -0
  6. package/dist/agents/context-compaction.d.ts.map +1 -0
  7. package/dist/agents/ids.d.ts +2 -0
  8. package/dist/agents/ids.d.ts.map +1 -1
  9. package/dist/agents/index.d.ts +6 -5
  10. package/dist/agents/index.d.ts.map +1 -1
  11. package/dist/agents/index.js +42 -37
  12. package/dist/agents/index.js.map +1 -1
  13. package/dist/agents/streams.d.ts +17 -1
  14. package/dist/agents/streams.d.ts.map +1 -1
  15. package/dist/agents/streams.js +4 -2
  16. package/dist/agents/streams.js.map +1 -1
  17. package/dist/agents/types.d.ts +9 -0
  18. package/dist/agents/types.d.ts.map +1 -1
  19. package/dist/agents/validation.d.ts +1 -1
  20. package/dist/agents/validation.d.ts.map +1 -1
  21. package/dist/auth/index.js +7 -3
  22. package/dist/auth/index.js.map +1 -1
  23. package/dist/authorization/index.js +6 -2
  24. package/dist/authorization/index.js.map +1 -1
  25. package/dist/bootstrap/index.js +30 -31
  26. package/dist/bootstrap/index.js.map +1 -1
  27. package/dist/{chunk-xmggaxg4.js → chunk-1wk20wn3.js} +188 -21
  28. package/dist/{chunk-xmggaxg4.js.map → chunk-1wk20wn3.js.map} +7 -5
  29. package/dist/{chunk-1ywq4hzk.js → chunk-1yz3x65y.js} +7 -7
  30. package/dist/{chunk-gqdd7508.js → chunk-4rh2m6zg.js} +1 -1
  31. package/dist/{chunk-fmx1sz2h.js → chunk-72q2y8hn.js} +3 -3
  32. package/dist/{chunk-fmx1sz2h.js.map → chunk-72q2y8hn.js.map} +3 -3
  33. package/dist/{chunk-f1cyvnrk.js → chunk-7gw7mepb.js} +259 -9
  34. package/dist/chunk-7gw7mepb.js.map +14 -0
  35. package/dist/{chunk-wb4051cx.js → chunk-819wnjz8.js} +11 -5
  36. package/dist/chunk-819wnjz8.js.map +12 -0
  37. package/dist/{chunk-pxtrxm3p.js → chunk-a09jx26t.js} +1 -1
  38. package/dist/{chunk-ettb0cy4.js → chunk-afjpa2hs.js} +59 -29
  39. package/dist/{chunk-ettb0cy4.js.map → chunk-afjpa2hs.js.map} +5 -5
  40. package/dist/{chunk-177ed2mp.js → chunk-c43qr6s0.js} +229 -97
  41. package/dist/{chunk-177ed2mp.js.map → chunk-c43qr6s0.js.map} +9 -9
  42. package/dist/{chunk-261ag4t4.js → chunk-cbkm2vam.js} +3 -3
  43. package/dist/{chunk-zpw39qhj.js → chunk-dm72y8wt.js} +25 -2
  44. package/dist/chunk-dm72y8wt.js.map +10 -0
  45. package/dist/{chunk-kqxgf6kv.js → chunk-drjqm1aa.js} +16 -1
  46. package/dist/{chunk-kqxgf6kv.js.map → chunk-drjqm1aa.js.map} +3 -3
  47. package/dist/chunk-dysw7nsm.js.map +1 -1
  48. package/dist/{chunk-4aw0jwk0.js → chunk-f6erf2vv.js} +1 -1
  49. package/dist/{chunk-4z3n1dzt.js → chunk-f83ka50g.js} +131 -25
  50. package/dist/chunk-f83ka50g.js.map +23 -0
  51. package/dist/{chunk-km4rkj4t.js → chunk-g13869yf.js} +3 -3
  52. package/dist/{chunk-c8bw2b6c.js → chunk-hbeh8j9w.js} +2 -2
  53. package/dist/{chunk-n5x5y80a.js → chunk-nzw7sm3b.js} +2 -2
  54. package/dist/{chunk-3rsf30p4.js → chunk-pn8n8sba.js} +16 -15
  55. package/dist/{chunk-3rsf30p4.js.map → chunk-pn8n8sba.js.map} +3 -3
  56. package/dist/{chunk-63te770v.js → chunk-qewtks41.js} +8 -8
  57. package/dist/{chunk-63te770v.js.map → chunk-qewtks41.js.map} +2 -2
  58. package/dist/{chunk-4p9rh7jj.js → chunk-rs1wbvy6.js} +1 -1
  59. package/dist/{chunk-88ppkr54.js → chunk-rte5sm3z.js} +26 -2
  60. package/dist/chunk-rte5sm3z.js.map +12 -0
  61. package/dist/{chunk-bv41fmjn.js → chunk-s31d0qmq.js} +57 -20
  62. package/dist/{chunk-bv41fmjn.js.map → chunk-s31d0qmq.js.map} +8 -7
  63. package/dist/{chunk-c6cfqydk.js → chunk-sxwk41qa.js} +1 -1
  64. package/dist/chunk-t0jjkep3.js.map +1 -1
  65. package/dist/{chunk-d6y2wsfg.js → chunk-tek1qwgm.js} +6 -6
  66. package/dist/{chunk-d6y2wsfg.js.map → chunk-tek1qwgm.js.map} +1 -1
  67. package/dist/{chunk-d2adj15j.js → chunk-tkdscva6.js} +1 -1
  68. package/dist/{chunk-ttba8x6z.js → chunk-tycbzedm.js} +2 -2
  69. package/dist/{chunk-z8j83gzd.js → chunk-x2yw73hy.js} +1 -1
  70. package/dist/{chunk-qer6am8w.js → chunk-xdf9yswn.js} +1 -1
  71. package/dist/execution/agent.js +26 -27
  72. package/dist/execution/agent.js.map +1 -1
  73. package/dist/execution/primitive.js +26 -27
  74. package/dist/execution/primitive.js.map +2 -2
  75. package/dist/execution/request.js +27 -28
  76. package/dist/execution/request.js.map +2 -2
  77. package/dist/http/index.js +1 -1
  78. package/dist/index.d.ts +5 -4
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +52 -53
  81. package/dist/index.js.map +1 -1
  82. package/dist/lake-storage/types.d.ts +2 -1
  83. package/dist/lake-storage/types.d.ts.map +1 -1
  84. package/dist/materializer/index.js +15 -16
  85. package/dist/materializer/index.js.map +1 -1
  86. package/dist/models/index.d.ts +40 -0
  87. package/dist/models/index.d.ts.map +1 -0
  88. package/dist/objects/execution.d.ts +6 -1
  89. package/dist/objects/execution.d.ts.map +1 -1
  90. package/dist/objects/index.js +19 -20
  91. package/dist/objects/index.js.map +1 -1
  92. package/dist/objects/link/endpoints.d.ts.map +1 -1
  93. package/dist/objects/query/executor.d.ts +1 -0
  94. package/dist/objects/query/executor.d.ts.map +1 -1
  95. package/dist/objects/query/explain.d.ts +1 -0
  96. package/dist/objects/query/explain.d.ts.map +1 -1
  97. package/dist/objects/query/index.d.ts +3 -1
  98. package/dist/objects/query/index.d.ts.map +1 -1
  99. package/dist/objects/query/index.js +30 -5
  100. package/dist/objects/query/index.js.map +1 -1
  101. package/dist/objects/query/ir.d.ts +14 -1
  102. package/dist/objects/query/ir.d.ts.map +1 -1
  103. package/dist/objects/query/links.d.ts +25 -0
  104. package/dist/objects/query/links.d.ts.map +1 -0
  105. package/dist/objects/query/normalize.d.ts.map +1 -1
  106. package/dist/objects/query/planner.d.ts.map +1 -1
  107. package/dist/objects/query/validate.d.ts +1 -0
  108. package/dist/objects/query/validate.d.ts.map +1 -1
  109. package/dist/pipelines/index.js +15 -16
  110. package/dist/pipelines/index.js.map +1 -1
  111. package/dist/projections/builders.d.ts +33 -4
  112. package/dist/projections/builders.d.ts.map +1 -1
  113. package/dist/projections/index.d.ts +1 -1
  114. package/dist/projections/index.d.ts.map +1 -1
  115. package/dist/projections/internal.js +15 -16
  116. package/dist/projections/internal.js.map +1 -1
  117. package/dist/projections/run-dispatch.d.ts +1 -0
  118. package/dist/projections/run-dispatch.d.ts.map +1 -1
  119. package/dist/projections/types.d.ts +12 -9
  120. package/dist/projections/types.d.ts.map +1 -1
  121. package/dist/projections/validation.d.ts +6 -5
  122. package/dist/projections/validation.d.ts.map +1 -1
  123. package/dist/query.d.ts +2 -1
  124. package/dist/query.d.ts.map +1 -1
  125. package/dist/query.js +2 -2
  126. package/dist/runtime/create.d.ts +3 -0
  127. package/dist/runtime/create.d.ts.map +1 -1
  128. package/dist/runtime/definitions.d.ts +3 -0
  129. package/dist/runtime/definitions.d.ts.map +1 -1
  130. package/dist/runtime/host.d.ts +2 -0
  131. package/dist/runtime/host.d.ts.map +1 -1
  132. package/dist/runtime/resolve-definitions.d.ts +2 -0
  133. package/dist/runtime/resolve-definitions.d.ts.map +1 -1
  134. package/dist/storage/agents/in-memory.d.ts +4 -0
  135. package/dist/storage/agents/in-memory.d.ts.map +1 -1
  136. package/dist/storage/agents/provider.js +9 -5
  137. package/dist/storage/agents/provider.js.map +1 -1
  138. package/dist/storage/agents/types.d.ts +5 -0
  139. package/dist/storage/agents/types.d.ts.map +1 -1
  140. package/dist/storage/ai-cost/provider.js +1 -1
  141. package/dist/storage/ai-usage/in-memory.d.ts +2 -1
  142. package/dist/storage/ai-usage/in-memory.d.ts.map +1 -1
  143. package/dist/storage/ai-usage/index.d.ts +1 -1
  144. package/dist/storage/ai-usage/index.d.ts.map +1 -1
  145. package/dist/storage/ai-usage/types.d.ts +6 -0
  146. package/dist/storage/ai-usage/types.d.ts.map +1 -1
  147. package/dist/storage/index.d.ts +3 -2
  148. package/dist/storage/index.d.ts.map +1 -1
  149. package/dist/storage/index.js +19 -14
  150. package/dist/storage/index.js.map +1 -1
  151. package/dist/storage/objects/in-memory.d.ts +6 -3
  152. package/dist/storage/objects/in-memory.d.ts.map +1 -1
  153. package/dist/storage/objects/index.d.ts +3 -1
  154. package/dist/storage/objects/index.d.ts.map +1 -1
  155. package/dist/storage/objects/keys.d.ts +16 -0
  156. package/dist/storage/objects/keys.d.ts.map +1 -0
  157. package/dist/storage/objects/types.d.ts +33 -6
  158. package/dist/storage/objects/types.d.ts.map +1 -1
  159. package/dist/storage/ontology/provider.js +1 -1
  160. package/dist/storage/workflow-runs/provider.js +9 -5
  161. package/dist/storage/workflow-runs/provider.js.map +1 -1
  162. package/dist/syncs/index.js +15 -16
  163. package/dist/syncs/index.js.map +1 -1
  164. package/dist/testing/agent-storage-contract.d.ts.map +1 -1
  165. package/dist/testing/ai-usage-storage-contract.d.ts.map +1 -1
  166. package/dist/testing/effective-storage-contract.d.ts +1 -1
  167. package/dist/testing/effective-storage-contract.d.ts.map +1 -1
  168. package/dist/testing/index.js +455 -40
  169. package/dist/testing/index.js.map +7 -7
  170. package/dist/testing/lake-storage-contract.d.ts.map +1 -1
  171. package/dist/testing/object-query-contract.d.ts +1 -1
  172. package/dist/testing/object-query-contract.d.ts.map +1 -1
  173. package/dist/webhooks/internal.js +13 -14
  174. package/dist/webhooks/internal.js.map +2 -2
  175. package/dist/workflows/index.js +27 -28
  176. package/dist/workflows/index.js.map +1 -1
  177. package/package.json +1 -1
  178. package/src/agents/builders.ts +3 -3
  179. package/src/agents/context-compaction.ts +261 -0
  180. package/src/agents/ids.ts +5 -0
  181. package/src/agents/index.ts +18 -9
  182. package/src/agents/streams.ts +56 -0
  183. package/src/agents/types.ts +10 -0
  184. package/src/agents/validation.ts +35 -5
  185. package/src/http/api-routes.ts +7 -7
  186. package/src/index.ts +14 -0
  187. package/src/lake-storage/types.ts +2 -1
  188. package/src/materializer/telemetry/append.ts +33 -16
  189. package/src/models/index.ts +71 -0
  190. package/src/objects/execution.ts +20 -0
  191. package/src/objects/link/endpoints.ts +2 -1
  192. package/src/objects/query/executor.ts +42 -11
  193. package/src/objects/query/explain.ts +11 -0
  194. package/src/objects/query/index.ts +6 -0
  195. package/src/objects/query/ir.ts +16 -0
  196. package/src/objects/query/links.ts +308 -0
  197. package/src/objects/query/normalize.ts +40 -1
  198. package/src/objects/query/planner.ts +5 -0
  199. package/src/objects/query/validate.ts +58 -2
  200. package/src/projections/builders.ts +220 -15
  201. package/src/projections/index.ts +1 -0
  202. package/src/projections/ownership.ts +5 -5
  203. package/src/projections/registry.ts +9 -3
  204. package/src/projections/revision.ts +31 -5
  205. package/src/projections/run-dispatch.ts +10 -1
  206. package/src/projections/types.ts +13 -9
  207. package/src/projections/validation.ts +61 -19
  208. package/src/query.ts +2 -0
  209. package/src/runtime/create.ts +4 -0
  210. package/src/runtime/definitions.ts +3 -0
  211. package/src/runtime/host.ts +2 -0
  212. package/src/runtime/resolve-definitions.ts +28 -0
  213. package/src/storage/agents/in-memory.ts +15 -0
  214. package/src/storage/agents/types.ts +5 -0
  215. package/src/storage/ai-usage/in-memory.ts +23 -0
  216. package/src/storage/ai-usage/index.ts +1 -0
  217. package/src/storage/ai-usage/types.ts +10 -0
  218. package/src/storage/index.ts +11 -0
  219. package/src/storage/objects/in-memory.ts +103 -16
  220. package/src/storage/objects/index.ts +9 -0
  221. package/src/storage/objects/keys.ts +36 -0
  222. package/src/storage/objects/types.ts +34 -6
  223. package/src/storage/ontology/provider-header-validation.ts +2 -2
  224. package/src/testing/agent-storage-contract.ts +12 -0
  225. package/src/testing/ai-usage-storage-contract.ts +35 -0
  226. package/src/testing/effective-storage-contract.ts +194 -4
  227. package/src/testing/lake-storage-contract.ts +56 -0
  228. package/src/testing/object-query-contract.ts +208 -1
  229. package/dist/agents/prompt.d.ts +0 -21
  230. package/dist/agents/prompt.d.ts.map +0 -1
  231. package/dist/chunk-4z3n1dzt.js.map +0 -23
  232. package/dist/chunk-6wetht33.js +0 -89
  233. package/dist/chunk-6wetht33.js.map +0 -10
  234. package/dist/chunk-88ppkr54.js.map +0 -12
  235. package/dist/chunk-f1cyvnrk.js.map +0 -13
  236. package/dist/chunk-wb4051cx.js.map +0 -12
  237. package/dist/chunk-zpw39qhj.js.map +0 -10
  238. package/src/agents/prompt.ts +0 -85
  239. /package/dist/{chunk-1ywq4hzk.js.map → chunk-1yz3x65y.js.map} +0 -0
  240. /package/dist/{chunk-gqdd7508.js.map → chunk-4rh2m6zg.js.map} +0 -0
  241. /package/dist/{chunk-pxtrxm3p.js.map → chunk-a09jx26t.js.map} +0 -0
  242. /package/dist/{chunk-261ag4t4.js.map → chunk-cbkm2vam.js.map} +0 -0
  243. /package/dist/{chunk-4aw0jwk0.js.map → chunk-f6erf2vv.js.map} +0 -0
  244. /package/dist/{chunk-km4rkj4t.js.map → chunk-g13869yf.js.map} +0 -0
  245. /package/dist/{chunk-c8bw2b6c.js.map → chunk-hbeh8j9w.js.map} +0 -0
  246. /package/dist/{chunk-n5x5y80a.js.map → chunk-nzw7sm3b.js.map} +0 -0
  247. /package/dist/{chunk-4p9rh7jj.js.map → chunk-rs1wbvy6.js.map} +0 -0
  248. /package/dist/{chunk-c6cfqydk.js.map → chunk-sxwk41qa.js.map} +0 -0
  249. /package/dist/{chunk-d2adj15j.js.map → chunk-tkdscva6.js.map} +0 -0
  250. /package/dist/{chunk-ttba8x6z.js.map → chunk-tycbzedm.js.map} +0 -0
  251. /package/dist/{chunk-z8j83gzd.js.map → chunk-x2yw73hy.js.map} +0 -0
  252. /package/dist/{chunk-qer6am8w.js.map → chunk-xdf9yswn.js.map} +0 -0
@@ -1,13 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/objects/query/planner.ts", "../src/objects/query/validate.ts", "../src/objects/query/executor.ts", "../src/objects/query/explain.ts"],
4
- "sourcesContent": [
5
- "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 \"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 \"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 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 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",
6
- "import type { ObjectType, OntologyRegistry, Property, Schema, ValueType } from \"../../ontology\"\nimport { normalizeDecimalValue } from \"../../ontology\"\nimport { formatUnknownObjectTypeMessage } from \"../../ontology/errors\"\nimport { validatePropertyValue, validateSchemaValue } from \"../../ontology/validation\"\nimport { ObjectQueryValidationError } from \"./errors\"\nimport type {\n ObjectExpansion,\n ObjectQuery,\n ObjectQueryPredicate,\n ObjectQueryResultShape,\n ObjectQuerySortField,\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 normalize?: boolean\n}\n\ntype QueryValidationContext = Required<\n Pick<ObjectQueryValidationOptions, \"maxLimit\" | \"maxPageSize\">\n> & {\n ontology: OntologyRegistry\n valueTypesById: ReadonlyMap<string, ValueType>\n issues: ObjectQueryValidationIssue[]\n touchedObjectTypeIds: Set<string>\n}\n\ninterface QueryValidationResult {\n result: ObjectQueryResultShape\n query: ObjectQuery\n}\n\ninterface TextFieldResolution {\n fieldsByObjectType?: Record<string, string[]>\n}\n\nconst DEFAULT_MAX_LIMIT = 1_000\nconst DEFAULT_MAX_PAGE_SIZE = 1_000\n\nexport function validateObjectQuery(\n query: ObjectQuery,\n options: ObjectQueryValidationOptions\n): ValidatedObjectQuery {\n const normalized = options.normalize === false ? query : normalizeObjectQuery(query)\n const ctx = createValidationContext(options)\n const validation = validateQueryNode(normalized, \"$\", ctx)\n\n if (ctx.issues.length > 0) {\n throw new ObjectQueryValidationError(ctx.issues)\n }\n\n return {\n query: validation.query,\n result: validation.result,\n touchedObjectTypeIds: [...ctx.touchedObjectTypeIds],\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)\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 createValidationContext(options: ObjectQueryValidationOptions): 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 issues: [],\n touchedObjectTypeIds: new Set<string>(),\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 return validateStart(query.objectTypeId, query.includeSubtypes, path, ctx)\n case \"filter\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n const predicate = validatePredicate(query.predicate, input.result, `${path}.predicate`, ctx)\n return { result: input.result, query: { ...query, input: input.query, predicate } }\n }\n case \"text\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n const textFields = validateTextQuery(query.query, query.fields, input.result, path, ctx)\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 }\n }\n case \"vector\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n validateVectorQuery(query.vector, query.propertyId, query.k, input.result, path, ctx)\n return { result: input.result, query: { ...query, input: input.query } }\n }\n case \"traverse\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n return {\n result: validateTraverse(\n query.linkId,\n query.direction,\n query.sourceObjectTypeId,\n input.result,\n path,\n ctx\n ),\n query: { ...query, input: input.query },\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(query.fields, input.result, path, ctx)\n return { result: input.result, query: { ...query, input: input.query, fields } }\n }\n case \"limit\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n validateLimit(query.limit, path, ctx)\n return { result: input.result, query: { ...query, input: input.query } }\n }\n case \"page\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n validatePage(query.pageSize, query.pageToken, path, ctx)\n return { result: input.result, query: { ...query, input: input.query } }\n }\n case \"project\": {\n const input = validateQueryNode(query.input, `${path}.input`, ctx)\n validateProjection(query.properties, input.result, path, ctx)\n return { result: input.result, query: { ...query, input: input.query } }\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 `${path}.expansions`,\n ctx\n )\n return { result: input.result, query: { ...query, input: input.query, expansions } }\n }\n }\n}\n\nfunction validateStart(\n objectTypeId: string,\n includeSubtypes: boolean | undefined,\n path: string,\n ctx: QueryValidationContext\n): QueryValidationResult {\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 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, `${path}.items[${index}]`, ctx)\n ),\n }\n case \"not\":\n return {\n ...predicate,\n item: validatePredicate(predicate.item, shape, `${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 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 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 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 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 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 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 validateVectorQuery(\n vector: readonly number[],\n propertyId: string,\n k: number,\n shape: ObjectQueryResultShape,\n path: string,\n ctx: QueryValidationContext\n): void {\n if (!Number.isInteger(k) || k <= 0) {\n addIssue(ctx, path, \"invalid_vector_k\", \"Vector query k must be a positive integer\")\n }\n\n if (vector.length === 0) {\n addIssue(ctx, path, \"empty_vector\", \"Vector query vector must not be empty\")\n }\n\n if (vector.some((value) => typeof value !== \"number\" || !Number.isFinite(value))) {\n addIssue(ctx, path, \"invalid_vector_value\", \"Vector query vector values must be finite numbers\")\n }\n\n for (const objectType of getObjectTypesForResult(shape, ctx)) {\n const property = getProperty(objectType, propertyId)\n if (!property) {\n addIssue(\n ctx,\n path,\n \"unknown_vector_property\",\n `Vector query references unknown property '${propertyId}' on '${objectType.id}'`\n )\n continue\n }\n\n assertStaticSearchProperty(objectType.id, property, \"vector query\", path, ctx)\n assertQueryFlag(objectType.id, property, \"vector\", \"vector query\", path, ctx)\n\n if (objectType.search?.vector?.property !== propertyId) {\n addIssue(\n ctx,\n path,\n \"vector_profile_missing\",\n `Object type '${objectType.id}' must declare search.vector.property '${propertyId}' before vector search can use it`\n )\n }\n\n const schema = resolveSchemaForProperty(property, objectType.id, ctx, path)\n if (schema && !isVectorSchema(schema, ctx)) {\n addIssue(\n ctx,\n path,\n \"vector_property_not_numeric_array\",\n `Vector query property '${propertyId}' on '${objectType.id}' must be a numeric array`\n )\n }\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 path: string,\n ctx: QueryValidationContext\n): ObjectExpansion[] {\n return expansions.map((expansion, index) =>\n validateExpansion(expansion, shape, `${path}[${index}]`, ctx)\n )\n}\n\nfunction validateExpansion(\n expansion: ObjectExpansion,\n shape: ObjectQueryResultShape,\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\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(expansion.orderBy, targetShape, `${path}.orderBy`, ctx)\n : undefined\n const expand = expansion.expand\n ? validateExpansions(expansion.expand, targetShape, `${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 { result: { objectTypeIds: [] }, query: { kind: \"set\", op, inputs } }\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 }\n}\n\nfunction validateSortFields(\n fields: readonly ObjectQuerySortField[],\n shape: ObjectQueryResultShape,\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 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 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 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\" | \"vector\",\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 isVectorSchema(schema: Schema, ctx: QueryValidationContext): boolean {\n if (typeof schema === \"string\") return false\n if (schema.type !== \"array\") return false\n const itemSchema = resolveSchema(schema.items, ctx.valueTypesById)\n return itemSchema === \"integer\" || itemSchema === \"double\" || itemSchema === \"decimal\"\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 addIssue(ctx: QueryValidationContext, path: string, code: string, message: string): void {\n ctx.issues.push({ path, code, message })\n}\n",
7
- "import { type AuthorizationContext, assertAuthorized } from \"../../authorization\"\nimport type { RuntimeAuthorization } from \"../../execution/types\"\nimport type { OntologyRegistry } from \"../../ontology\"\nimport type {\n CountObjectsResult,\n ExistsObjectsResult,\n ExpandedLinkValue,\n ExpandedObjectRow,\n FacetObjectsResult,\n ObjectFacetRequest,\n ObjectFacetResult,\n ObjectLinkRow,\n ObjectQueryCapabilities,\n ObjectRow,\n ObjectRowLinks,\n ObjectStorage,\n QueryObjectsResult,\n} from \"../../storage\"\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 storage: ObjectStorage\n maxLimit?: number\n maxPageSize?: 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 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 normalize: false,\n })\n assertQueryViewable(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: plan.query,\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 normalize: false,\n })\n assertQueryViewable(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: plan.query,\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 normalize: false,\n })\n assertQueryViewable(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: plan.query,\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 normalize: false,\n })\n assertQueryViewable(validated, options)\n const facets = validateFacetRequests(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: plan.query,\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 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(authorization, {\n kind: \"object.query\",\n touchedObjectTypeIds: validated.touchedObjectTypeIds,\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 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 \"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 \"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\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(`${parent.objectTypeId}:${parent.primaryId}:${expansion.linkId}`)\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 incident = await options.storage.listIncidentLinksBatch({\n projectId,\n items: parents.map((parent) => ({\n objectTypeId: parent.objectTypeId,\n objectId: parent.primaryId,\n })),\n })\n\n // Index links that point AT a parent (incoming) by that parent. The incident\n // batch also returns outgoing links, so filter on the parent being the target.\n const byTarget = new Map<string, ObjectLinkRow[]>()\n for (const link of incident) {\n if (link.linkId !== expansion.linkId) continue\n if (expansion.sourceObjectTypeId && link.sourceTypeId !== expansion.sourceObjectTypeId) continue\n const key = targetKey(link.targetTypeId, link.targetId)\n const bucket = byTarget.get(key)\n if (bucket) bucket.push(link)\n else byTarget.set(key, [link])\n }\n\n return parents.map((parent) => {\n const links = byTarget.get(targetKey(parent.objectTypeId, parent.primaryId))\n if (!links) return []\n // For an incoming expansion the hydrated object is the link's source.\n return links.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<Map<string, ObjectRow>> {\n const seen = new Set<string>()\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: Map<string, ObjectRow>,\n expansion: ObjectExpansion,\n options: QueryExecutorOptions\n): Promise<Map<string, 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<string, 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: Map<string, 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: Map<string, 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): string {\n return `${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\nfunction validateFacetRequests(\n facets: readonly ObjectFacetRequest[],\n objectTypeIds: readonly string[],\n options: QueryExecutorOptions\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 (!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 `${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",
8
- "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}\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 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 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 \"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 ${query.propertyId} k=${query.k}`,\n details: { propertyId: query.propertyId, dimensions: query.vector.length, k: query.k },\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"
9
- ],
10
- "mappings": "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",
11
- "debugId": "99CC14ED40CC1D8E64756E2164756E21",
12
- "names": []
13
- }
@@ -1,12 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/projections/capability.ts", "../src/projections/run-dispatch.ts", "../src/projections/run-id.ts"],
4
- "sourcesContent": [
5
- "import type { ProjectionRegistry } from \"./registry\"\nimport type { ProjectionDispatchDescriptor } from \"./types\"\n\nconst projectionRegistryKey: unique symbol = Symbol(\"sixb.projectionRegistry\")\n\ninterface ProjectionRegistryOwner {\n readonly [projectionRegistryKey]?: ProjectionRegistry\n}\n\nexport function registerProjectionRegistry(owner: object, registry: ProjectionRegistry): void {\n const registered = (owner as ProjectionRegistryOwner)[projectionRegistryKey]\n if (registered && registered !== registry) {\n throw new Error(\"[Sixb] Projection registry is already registered for this owner.\")\n }\n Object.defineProperty(owner, projectionRegistryKey, {\n configurable: false,\n enumerable: false,\n value: registry,\n writable: false,\n })\n}\n\nexport function getProjectionRegistry(owner: object): ProjectionRegistry {\n const registry = (owner as ProjectionRegistryOwner)[projectionRegistryKey]\n if (registry) return registry\n throw new Error(\"[Sixb] Projection registry is not registered for this runtime.\")\n}\n\nexport function getProjectionDispatchDescriptors(\n owner: object\n): readonly ProjectionDispatchDescriptor[] {\n return getProjectionRegistry(owner).getDispatchDescriptors()\n}\n\nexport function shareProjectionRegistry(source: object, target: object): void {\n registerProjectionRegistry(target, getProjectionRegistry(source))\n}\n",
6
- "import { randomUUID } from \"node:crypto\"\nimport { reportRunFailure } from \"../error-reporting/capability\"\nimport { createSixbError, toSixbFailure } from \"../errors/internal\"\nimport type { SixbFailure } from \"../errors/types\"\nimport type { RunDispatcher } from \"../execution/dispatch\"\nimport { createPrimitiveExecutionRecord } from \"../execution/durable\"\nimport type { LakeStorage } from \"../lake-storage\"\nimport type { Queues } from \"../queues\"\nimport type { SixbDefinitions } from \"../runtime/definitions\"\nimport type { ExecutionRecord, ProjectionRunRecord, Storage } from \"../storage\"\nimport { ProjectionRunError } from \"../storage\"\nimport { findPrimitiveRunExecution } from \"../storage/executions/run-link\"\nimport {\n assertProjectionRunDurableExecution,\n assertProjectionRunIdentityMatches,\n} from \"../storage/projection-runs/provider\"\nimport { getProjectionRegistry } from \"./capability\"\nimport { ProjectionValidationError } from \"./errors\"\nimport { createProjectionRunId } from \"./run-id\"\nimport {\n PROJECTION_RUN_FAILURE_CODES,\n type ProjectionDefinition,\n type ProjectionRunFailureCode,\n} from \"./types\"\n\nexport const PROJECTION_TELEMETRY_BATCH_SIZE = 500\n\nexport interface ProjectionRunDispatchInput {\n readonly projectionId: string\n readonly datasetVersion: {\n readonly datasetId: string\n readonly versionId: string\n readonly createdAt: string\n }\n readonly metadata?: Readonly<Record<string, string>>\n}\n\nexport interface ProjectionRunDispatchResult {\n readonly projectionId: string\n readonly runId: string\n readonly queuedAt: string\n readonly jobId?: string\n readonly created: boolean\n}\n\nexport type ProjectionRunDispatchPort = RunDispatcher<\n ProjectionRunDispatchInput,\n ProjectionRunDispatchResult\n>\n\nexport interface ProjectionRunDispatcherDependencies {\n readonly id: string\n readonly definitions: Pick<SixbDefinitions, \"projections\">\n readonly lakeStorage: Pick<LakeStorage, \"getVersion\">\n readonly storage: Storage\n readonly queues: Pick<Queues, \"projections\">\n}\n\ntype PersistedProjectionRun =\n | { readonly publish: false; readonly run: ProjectionRunRecord }\n | {\n readonly publish: true\n readonly run: ProjectionRunRecord\n readonly queuedAt: Date\n readonly created: boolean\n }\n\n/** Core-owned durable dispatch boundary for immutable dataset-version materialization. */\nexport class ProjectionRunDispatcher implements ProjectionRunDispatchPort {\n constructor(private readonly dependencies: ProjectionRunDispatcherDependencies) {}\n\n async dispatch(input: ProjectionRunDispatchInput): Promise<ProjectionRunDispatchResult> {\n assertDispatchInput(input)\n const registry = getProjectionRegistry(this.dependencies)\n const descriptor = registry.resolveDispatch(input.projectionId)\n if (descriptor.datasetId !== input.datasetVersion.datasetId) {\n throw new ProjectionValidationError(\n `[Sixb] Projection '${input.projectionId}' consumes dataset '${descriptor.datasetId}', not '${input.datasetVersion.datasetId}'.`\n )\n }\n const projection = this.dependencies.definitions.projections.getById(input.projectionId)\n if (!projection) {\n throw new ProjectionValidationError(`[Sixb] Unknown projection '${input.projectionId}'.`)\n }\n const version = await this.dependencies.lakeStorage.getVersion(\n input.datasetVersion.datasetId,\n input.datasetVersion.versionId\n )\n if (!version || version.createdAt.toISOString() !== input.datasetVersion.createdAt) {\n throw new ProjectionValidationError(\n `[Sixb] Dataset '${input.datasetVersion.datasetId}' version '${input.datasetVersion.versionId}' does not match its immutable metadata.`\n )\n }\n if (version.mode === \"schema\") {\n throw new ProjectionValidationError(\n `[Sixb] Projection '${input.projectionId}' cannot materialize a schema-only dataset version.`\n )\n }\n\n const { datasetId: _datasetId, ...semanticIdentity } = descriptor\n const identity = {\n ...semanticIdentity,\n datasetVersion: structuredClone(input.datasetVersion),\n }\n const runId = createProjectionRunId(this.dependencies.id, identity)\n const projectionRuns = requireProjectionRunStorage(this.dependencies.storage)\n const existing = await projectionRuns.getById({ projectId: this.dependencies.id, id: runId })\n const persisted = existing\n ? await reuseProjectionRun(this.dependencies, existing, identity)\n : await persistProjectionRun({\n dependencies: this.dependencies,\n runId,\n identity,\n projection,\n producerExecution: await resolveProducerExecution(\n this.dependencies.storage,\n this.dependencies.id,\n version.producer\n ),\n })\n\n if (!persisted.publish) return existingResult(persisted.run)\n return publishProjectionRun(this.dependencies, input.metadata, persisted)\n }\n}\n\nasync function persistProjectionRun(input: {\n readonly dependencies: ProjectionRunDispatcherDependencies\n readonly runId: string\n readonly identity: ProjectionRunRecord[\"identity\"]\n readonly projection: ProjectionDefinition\n readonly producerExecution: ExecutionRecord | null\n}): Promise<PersistedProjectionRun> {\n const execution = createPrimitiveExecutionRecord({\n id: `exec_${randomUUID()}`,\n primitive: { kind: \"projection\", id: input.identity.projectionId, runId: input.runId },\n origin: {\n type: \"automatic\",\n projectId: input.dependencies.id,\n source: {\n type: \"datasetVersion\",\n datasetId: input.identity.datasetVersion.datasetId,\n versionId: input.identity.datasetVersion.versionId,\n },\n correlationId: input.producerExecution?.correlationId ?? input.runId,\n ...(input.producerExecution?.requestedBy === undefined\n ? {}\n : { requestedBy: input.producerExecution.requestedBy }),\n },\n })\n const queuedAt = new Date()\n\n try {\n return await input.dependencies.storage.transaction(\n async (tx): Promise<PersistedProjectionRun> => {\n const projectionRuns = requireProjectionRunStorage(tx)\n const raced = await projectionRuns.getById({\n projectId: input.dependencies.id,\n id: input.runId,\n })\n if (raced) {\n await assertExistingRun(tx, raced, input.identity)\n return { publish: false, run: raced }\n }\n await tx.executions.create(execution)\n const run = await queueProjectionRun(projectionRuns, {\n id: input.runId,\n projectId: input.dependencies.id,\n executionId: execution.id,\n identity: input.identity,\n projection: input.projection,\n queuedAt,\n })\n return { publish: true, run, queuedAt, created: true }\n },\n { isolation: \"serializable\" }\n )\n } catch (error) {\n if (!(error instanceof ProjectionRunError)) throw error\n const raced = await requireProjectionRunStorage(input.dependencies.storage).getById({\n projectId: input.dependencies.id,\n id: input.runId,\n })\n if (!raced) throw error\n await assertExistingRun(input.dependencies.storage, raced, input.identity)\n return { publish: false, run: raced }\n }\n}\n\nasync function reuseProjectionRun(\n dependencies: ProjectionRunDispatcherDependencies,\n existing: ProjectionRunRecord,\n identity: ProjectionRunRecord[\"identity\"]\n): Promise<PersistedProjectionRun> {\n await assertExistingRun(dependencies.storage, existing, identity)\n if (\n existing.status !== \"failed\" ||\n existing.error?.code !== \"queue.enqueue_failed\" ||\n !existing.error.retryable\n ) {\n return { publish: false, run: existing }\n }\n const queuedAt = new Date()\n const projectionRuns = requireProjectionRunStorage(dependencies.storage)\n try {\n const run = await requeueProjectionRun(projectionRuns, existing, queuedAt)\n return { publish: true, run, queuedAt, created: false }\n } catch (error) {\n if (!(error instanceof ProjectionRunError)) throw error\n const raced = await projectionRuns.getById({ projectId: existing.projectId, id: existing.id })\n if (\n !raced ||\n (raced.status === \"failed\" &&\n raced.error?.code === \"queue.enqueue_failed\" &&\n raced.error.retryable)\n ) {\n throw error\n }\n await assertExistingRun(dependencies.storage, raced, identity)\n return { publish: false, run: raced }\n }\n}\n\nasync function publishProjectionRun(\n dependencies: ProjectionRunDispatcherDependencies,\n metadata: Readonly<Record<string, string>> | undefined,\n persisted: Extract<PersistedProjectionRun, { readonly publish: true }>\n): Promise<ProjectionRunDispatchResult> {\n try {\n const [job] = await dependencies.queues.projections.enqueue({\n projectId: dependencies.id,\n jobs: [\n {\n id: persisted.run.id,\n type: \"projection.run.requested\",\n payload: { runId: persisted.run.id },\n ...(metadata === undefined ? {} : { metadata }),\n },\n ],\n })\n return {\n projectionId: persisted.run.identity.projectionId,\n runId: persisted.run.id,\n queuedAt: persisted.queuedAt.toISOString(),\n ...(job?.id ? { jobId: job.id } : {}),\n created: persisted.created,\n }\n } catch (error) {\n const failedAt = new Date()\n const failure = toEnqueueFailure(error, persisted.run, failedAt)\n const failed = await requireProjectionRunStorage(dependencies.storage).failEnqueue({\n projectId: dependencies.id,\n id: persisted.run.id,\n finishedAt: failedAt,\n error: failure,\n })\n reportRunFailure(dependencies, error, {\n projectId: dependencies.id,\n runKind: \"projection\",\n run: {\n runId: failed.id,\n projectionId: failed.identity.projectionId,\n projectionKind: failed.identity.projectionKind,\n },\n failure,\n })\n throw error\n }\n}\n\nasync function assertExistingRun(\n storage: Storage,\n run: ProjectionRunRecord,\n identity: ProjectionRunRecord[\"identity\"]\n): Promise<void> {\n assertProjectionRunIdentityMatches(run, identity)\n await assertProjectionRunDurableExecution({\n executions: storage.executions,\n projectId: run.projectId,\n executionId: run.executionId,\n runId: run.id,\n projectionId: run.identity.projectionId,\n datasetId: run.identity.datasetVersion.datasetId,\n datasetVersionId: run.identity.datasetVersion.versionId,\n })\n}\n\nasync function resolveProducerExecution(\n storage: Storage,\n projectId: string,\n producer:\n | {\n readonly kind: \"sync\" | \"pipeline\"\n readonly id?: string\n readonly runId?: string\n }\n | undefined\n): Promise<ExecutionRecord | null> {\n if (!producer?.runId) return null\n if (producer.kind === \"sync\") {\n const run = await storage.syncRuns?.getById({ projectId, id: producer.runId })\n if (!run) return null\n assertProducerId(producer, run.syncId)\n return requireProducerExecution({\n executions: storage.executions,\n projectId,\n executionId: run.executionId,\n primitive: { kind: \"sync\", id: run.syncId, runId: run.id },\n })\n }\n\n const run = await storage.pipelineRuns?.getById({ projectId, id: producer.runId })\n if (!run) return null\n assertProducerId(producer, run.pipelineId)\n return requireProducerExecution({\n executions: storage.executions,\n projectId,\n executionId: run.executionId,\n primitive: { kind: \"pipeline\", id: run.pipelineId, runId: run.id },\n })\n}\n\nasync function requireProducerExecution(input: {\n readonly executions: Storage[\"executions\"]\n readonly projectId: string\n readonly executionId: string\n readonly primitive:\n | { readonly kind: \"sync\"; readonly id: string; readonly runId: string }\n | { readonly kind: \"pipeline\"; readonly id: string; readonly runId: string }\n}): Promise<ExecutionRecord> {\n const execution = await findPrimitiveRunExecution({\n executions: input.executions,\n projectId: input.projectId,\n executionId: input.executionId,\n primitive: input.primitive,\n sourceTypes: [\"execution\", \"schedule\", \"event\"],\n })\n if (execution) return execution\n throw new ProjectionValidationError(\n `[Sixb] Dataset producer run '${input.primitive.runId}' references an invalid execution.`\n )\n}\n\nfunction assertProducerId(\n producer: { readonly kind: \"sync\" | \"pipeline\"; readonly id?: string; readonly runId?: string },\n runOwnerId: string\n): void {\n if (producer.id === undefined || producer.id === runOwnerId) return\n throw new ProjectionValidationError(\n `[Sixb] Dataset producer '${producer.kind}:${producer.id}' does not match run '${producer.runId}'.`\n )\n}\n\nfunction requireProjectionRunStorage(storage: Storage): NonNullable<Storage[\"projectionRuns\"]> {\n if (storage.projectionRuns) return storage.projectionRuns\n throw new ProjectionValidationError(\"[Sixb] Projection run storage is not configured.\")\n}\n\nfunction queueProjectionRun(\n storage: NonNullable<Storage[\"projectionRuns\"]>,\n input: {\n readonly id: string\n readonly projectId: string\n readonly executionId: string\n readonly identity: ProjectionRunRecord[\"identity\"]\n readonly projection: ProjectionDefinition\n readonly queuedAt: Date\n }\n): Promise<ProjectionRunRecord> {\n const common = {\n id: input.id,\n projectId: input.projectId,\n executionId: input.executionId,\n queuedAt: input.queuedAt,\n }\n switch (input.projection._tag) {\n case \"ObjectProjectionDefinition\":\n if (input.identity.projectionKind !== \"object\") {\n throw invalidProjectionDefinition(input.id)\n }\n return storage.queue({\n ...common,\n identity: input.identity,\n target: { objectTypeId: input.projection.objectTypeId },\n })\n case \"LinkProjectionDefinition\":\n if (input.identity.projectionKind !== \"link\") {\n throw invalidProjectionDefinition(input.id)\n }\n return storage.queue({\n ...common,\n identity: input.identity,\n target: {\n sourceObjectTypeId: input.projection.sourceObjectTypeId,\n targetObjectTypeId: input.projection.targetObjectTypeId,\n },\n })\n case \"TelemetryProjectionDefinition\":\n if (input.identity.projectionKind !== \"telemetry\") {\n throw invalidProjectionDefinition(input.id)\n }\n return storage.queue({\n ...common,\n identity: input.identity,\n target: { objectTypeId: input.projection.objectTypeId },\n fixedBatchSize: PROJECTION_TELEMETRY_BATCH_SIZE,\n })\n }\n}\n\nfunction requeueProjectionRun(\n storage: NonNullable<Storage[\"projectionRuns\"]>,\n run: ProjectionRunRecord,\n queuedAt: Date\n): Promise<ProjectionRunRecord> {\n const common = {\n id: run.id,\n projectId: run.projectId,\n executionId: run.executionId,\n queuedAt,\n }\n switch (run.identity.projectionKind) {\n case \"object\": {\n if (!(\"objectTypeId\" in run.target)) throw invalidProjectionDefinition(run.id)\n return storage.queue({ ...common, identity: run.identity, target: run.target })\n }\n case \"link\": {\n if (!(\"sourceObjectTypeId\" in run.target)) throw invalidProjectionDefinition(run.id)\n return storage.queue({ ...common, identity: run.identity, target: run.target })\n }\n case \"telemetry\": {\n if (!(\"objectTypeId\" in run.target) || !run.telemetryCheckpoint) {\n throw invalidProjectionDefinition(run.id)\n }\n return storage.queue({\n ...common,\n identity: run.identity,\n target: run.target,\n fixedBatchSize: run.telemetryCheckpoint.fixedBatchSize,\n })\n }\n }\n}\n\nfunction invalidProjectionDefinition(runId: string): ProjectionValidationError {\n return new ProjectionValidationError(\n `[Sixb] Projection run '${runId}' has inconsistent definition metadata.`\n )\n}\n\nfunction existingResult(run: ProjectionRunRecord): ProjectionRunDispatchResult {\n return {\n projectionId: run.identity.projectionId,\n runId: run.id,\n queuedAt: run.queuedAt.toISOString(),\n created: false,\n }\n}\n\nfunction assertDispatchInput(input: ProjectionRunDispatchInput): void {\n for (const [field, value] of [\n [\"projectionId\", input.projectionId],\n [\"datasetId\", input.datasetVersion.datasetId],\n [\"versionId\", input.datasetVersion.versionId],\n ] as const) {\n if (!value.trim())\n throw new ProjectionValidationError(`[Sixb] Projection ${field} is required.`)\n }\n const timestamp = Date.parse(input.datasetVersion.createdAt)\n if (\n !Number.isFinite(timestamp) ||\n new Date(timestamp).toISOString() !== input.datasetVersion.createdAt\n ) {\n throw new ProjectionValidationError(\"[Sixb] Projection dataset version timestamp is invalid.\")\n }\n}\n\nfunction toEnqueueFailure(\n error: unknown,\n run: ProjectionRunRecord,\n at: Date\n): SixbFailure<ProjectionRunFailureCode> {\n const enqueueError = createSixbError(\n \"queue.enqueue_failed\",\n `[Sixb] Could not enqueue Projection run '${run.id}'.`,\n {\n cause: error,\n details: {\n projectionId: run.identity.projectionId,\n projectionKind: run.identity.projectionKind,\n runId: run.id,\n phase: \"enqueue\",\n },\n }\n )\n return toSixbFailure(enqueueError, { allowedCodes: PROJECTION_RUN_FAILURE_CODES, at })\n}\n",
7
- "import { sha256Canonical } from \"../materialization/identity\"\nimport type { ProjectionMaterializationIdentity } from \"../materialization/model\"\n\nexport function createProjectionRunId(\n projectId: string,\n identity: ProjectionMaterializationIdentity\n): string {\n return sha256Canonical({\n projectId,\n projectionId: identity.projectionId,\n projectionKind: identity.projectionKind,\n protocol: identity.protocol,\n datasetId: identity.datasetVersion.datasetId,\n versionId: identity.datasetVersion.versionId,\n createdAt: identity.datasetVersion.createdAt,\n ontologyRevision: identity.ontologyRevision,\n projectionRevision: identity.projectionRevision,\n ownershipHash: identity.ownershipHash,\n })\n}\n"
8
- ],
9
- "mappings": "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",
10
- "debugId": "562D2A2DDB41546364756E2164756E21",
11
- "names": []
12
- }
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/agents/streams.ts"],
4
- "sourcesContent": [
5
- "import type { Broker, BrokerStreamDefinition } from \"../broker\"\nimport { parseSixbFailure } from \"../errors/internal\"\nimport type { SixbFailure } from \"../errors/types\"\nimport { isJsonValue, isPlainRecord, type JsonValue } from \"../json\"\nimport {\n AGENT_RUN_FAILURE_CODES,\n type AgentRunFailureCode,\n type AgentRunRecord,\n} from \"../storage/agents/types\"\n\nexport const AGENT_RUN_STREAM_SCHEMA_VERSION = 1 as const\nexport const DEFAULT_AGENT_RUN_STREAM_RETENTION = {\n maxAgeMs: 2 * 60 * 60 * 1000, // 2 hours\n maxRecords: 5_000,\n} as const\n\nexport const AGENT_ACTIVITY_STREAM_SCHEMA_VERSION = 1 as const\nexport const AGENT_ACTIVITY_STREAM_ID = \"agents.activity\" as const\nexport const DEFAULT_AGENT_ACTIVITY_STREAM_RETENTION = {\n maxAgeMs: 24 * 60 * 60 * 1000, // 24 hours\n maxRecords: 10_000,\n} as const\n\nexport interface AgentRunActivityEvent {\n readonly schemaVersion: typeof AGENT_ACTIVITY_STREAM_SCHEMA_VERSION\n readonly type: \"agent.run.activity\"\n readonly projectId: string\n readonly runId: string\n readonly threadId: string\n readonly agentId: string\n readonly status: AgentRunRecord[\"status\"]\n readonly attempt: number\n readonly occurredAt: string\n}\n\nexport function agentActivityStreamDefinition(): BrokerStreamDefinition {\n return {\n id: AGENT_ACTIVITY_STREAM_ID,\n retention: DEFAULT_AGENT_ACTIVITY_STREAM_RETENTION,\n }\n}\n\nexport function agentRunActivityEvent(\n run: AgentRunRecord,\n occurredAt: Date = new Date()\n): AgentRunActivityEvent {\n return {\n schemaVersion: AGENT_ACTIVITY_STREAM_SCHEMA_VERSION,\n type: \"agent.run.activity\",\n projectId: run.projectId,\n runId: run.id,\n threadId: run.threadId,\n agentId: run.agentId,\n status: run.status,\n attempt: run.attempt,\n occurredAt: occurredAt.toISOString(),\n }\n}\n\nexport function isAgentRunActivityEvent(value: unknown): value is AgentRunActivityEvent {\n return (\n isPlainRecord(value) &&\n value.schemaVersion === AGENT_ACTIVITY_STREAM_SCHEMA_VERSION &&\n value.type === \"agent.run.activity\" &&\n typeof value.projectId === \"string\" &&\n typeof value.runId === \"string\" &&\n typeof value.threadId === \"string\" &&\n typeof value.agentId === \"string\" &&\n isAgentRunStatus(value.status) &&\n typeof value.attempt === \"number\" &&\n Number.isFinite(value.attempt) &&\n typeof value.occurredAt === \"string\"\n )\n}\n\nexport async function publishAgentRunActivity(broker: Broker, run: AgentRunRecord): Promise<void> {\n const event = agentRunActivityEvent(run)\n await broker.ensureStream({\n projectId: run.projectId,\n stream: agentActivityStreamDefinition(),\n })\n await broker.append({\n projectId: run.projectId,\n streamId: AGENT_ACTIVITY_STREAM_ID,\n records: [\n {\n name: event.type,\n key: event.threadId,\n // The event is composed only of validated JSON primitives.\n payload: event as unknown as JsonValue,\n idempotencyKey: `${event.runId}:${event.attempt}:${event.status}`,\n },\n ],\n })\n}\n\nexport type AgentRunStreamId = `agents.runs.${string}`\n\nexport function agentRunStreamId(runId: string): AgentRunStreamId {\n return `agents.runs.${runId}`\n}\n\nexport function agentRunStreamDefinition(runId: string): BrokerStreamDefinition {\n return {\n id: agentRunStreamId(runId),\n retention: DEFAULT_AGENT_RUN_STREAM_RETENTION,\n }\n}\n\ninterface AgentRunStreamEventBase {\n readonly schemaVersion: typeof AGENT_RUN_STREAM_SCHEMA_VERSION\n readonly projectId: string\n readonly runId: string\n readonly threadId: string\n readonly agentId: string\n readonly attempt: number\n readonly occurredAt: string\n}\n\n// ── Control stream (worker-inbound) ─────────────────────────────────────────────────────────────\n//\n// A per-run channel the API layer publishes to and the worker subscribes to — the reverse direction\n// of the event stream above. It carries only a cancel signal, and is addressed by `runId` (not a run\n// record), so a cancel works even before the worker has reserved the run. Kept separate from the\n// event stream so control records never reach the browser client.\n\nexport type AgentRunControlStreamId = `agents.runs.${string}.control`\n\nexport function agentRunControlStreamId(runId: string): AgentRunControlStreamId {\n return `agents.runs.${runId}.control`\n}\n\n/** The only control record: a request to stop the run. */\nexport const AGENT_RUN_CANCEL_RECORD = \"agent.run.cancel\"\n\n// A cancel only needs to outlive the queue wait plus one turn, so retention is short and tiny.\nconst AGENT_RUN_CONTROL_RETENTION = { maxAgeMs: 30 * 60 * 1000, maxRecords: 16 } as const\n\nexport function agentRunControlStreamDefinition(runId: string): BrokerStreamDefinition {\n return { id: agentRunControlStreamId(runId), retention: AGENT_RUN_CONTROL_RETENTION }\n}\n\n/**\n * Signal a run to stop. Publishing is addressed by `runId`, so it works whether the run is queued,\n * reserved, or being drained — the worker picks the record up when it subscribes.\n */\nexport async function publishAgentRunCancel(\n broker: Broker,\n params: { readonly projectId: string; readonly runId: string }\n): Promise<void> {\n await broker.ensureStream({\n projectId: params.projectId,\n stream: agentRunControlStreamDefinition(params.runId),\n })\n await broker.append({\n projectId: params.projectId,\n streamId: agentRunControlStreamId(params.runId),\n records: [\n { name: AGENT_RUN_CANCEL_RECORD, key: params.runId, payload: { runId: params.runId } },\n ],\n })\n}\n\n/**\n * Watch a run's control stream and invoke `onCancel` when a cancel arrives. Reads from `earliest` so\n * a cancel published before the worker subscribed (a run stopped while still queued) is still seen.\n * Returns the unsubscribe handle.\n */\nexport async function subscribeAgentRunCancel(\n broker: Broker,\n params: { readonly projectId: string; readonly runId: string },\n onCancel: () => void\n): Promise<() => void> {\n await broker.ensureStream({\n projectId: params.projectId,\n stream: agentRunControlStreamDefinition(params.runId),\n })\n return broker.subscribe(\n {\n projectId: params.projectId,\n streamId: agentRunControlStreamId(params.runId),\n from: \"earliest\",\n names: [AGENT_RUN_CANCEL_RECORD],\n },\n () => onCancel()\n )\n}\n\n/** Exact portable failure exposed by a terminal Agent run stream event. */\nexport type AgentRunFailure = SixbFailure<AgentRunFailureCode>\n\nexport type AgentRunStreamEvent =\n | (AgentRunStreamEventBase & {\n readonly type: \"agent.run.started\"\n readonly modelId?: string\n })\n | (AgentRunStreamEventBase & {\n readonly type: \"agent.ui.chunk\"\n readonly chunkIndex: number\n readonly chunk: JsonValue\n })\n | (AgentRunStreamEventBase & {\n readonly type: \"agent.message.finalized\"\n readonly messageId: string\n })\n | (AgentRunStreamEventBase & {\n readonly type: \"agent.run.finished\"\n readonly status: \"succeeded\" | \"failed\" | \"cancelled\"\n readonly finishReason?: string\n readonly error?: AgentRunFailure\n })\n\nexport type AgentRunFinishedEvent = Extract<AgentRunStreamEvent, { type: \"agent.run.finished\" }>\n\n// ── Record construction ──────────────────────────────────────────────────────────────────────────\n//\n// The wire format of run stream records — event shape, record name/key, and the idempotency-key\n// vocabulary — is owned here so every producer (the worker's stream sink, the server's queued\n// cancellation) shares one definition and cannot drift.\n\n/** Build the terminal stream event for a finished run. Throws if the run is not terminal. */\nexport function agentRunFinishedEvent(\n run: AgentRunRecord,\n occurredAt: Date = new Date()\n): AgentRunFinishedEvent {\n if (run.status === \"queued\" || run.status === \"running\") {\n throw new Error(\n `[Sixb] Agent run '${run.id}' is not terminal (status '${run.status}'), so it has no finished event.`\n )\n }\n return {\n schemaVersion: AGENT_RUN_STREAM_SCHEMA_VERSION,\n type: \"agent.run.finished\",\n projectId: run.projectId,\n runId: run.id,\n threadId: run.threadId,\n agentId: run.agentId,\n attempt: run.attempt,\n status: run.status,\n ...(run.finishReason === undefined ? {} : { finishReason: run.finishReason }),\n ...(run.error === undefined ? {} : { error: run.error }),\n occurredAt: occurredAt.toISOString(),\n }\n}\n\n/** Validate an Agent stream payload using the same contract its producers use. */\nexport function isAgentRunStreamEvent(value: unknown): value is AgentRunStreamEvent {\n if (\n !isPlainRecord(value) ||\n value.schemaVersion !== AGENT_RUN_STREAM_SCHEMA_VERSION ||\n typeof value.projectId !== \"string\" ||\n typeof value.runId !== \"string\" ||\n typeof value.threadId !== \"string\" ||\n typeof value.agentId !== \"string\" ||\n typeof value.attempt !== \"number\" ||\n !Number.isFinite(value.attempt) ||\n typeof value.occurredAt !== \"string\" ||\n typeof value.type !== \"string\"\n ) {\n return false\n }\n\n switch (value.type) {\n case \"agent.run.started\":\n return value.modelId === undefined || typeof value.modelId === \"string\"\n case \"agent.ui.chunk\":\n return (\n Number.isInteger(value.chunkIndex) &&\n Object.hasOwn(value, \"chunk\") &&\n isJsonValue(value.chunk)\n )\n case \"agent.message.finalized\":\n return typeof value.messageId === \"string\"\n case \"agent.run.finished\":\n return (\n isTerminalAgentRunStatus(value.status) &&\n (value.finishReason === undefined || typeof value.finishReason === \"string\") &&\n (value.error === undefined || isAgentRunFailure(value.error))\n )\n default:\n return false\n }\n}\n\nfunction isTerminalAgentRunStatus(value: unknown): value is \"succeeded\" | \"failed\" | \"cancelled\" {\n return value === \"succeeded\" || value === \"failed\" || value === \"cancelled\"\n}\n\nfunction isAgentRunStatus(value: unknown): value is AgentRunRecord[\"status\"] {\n return value === \"queued\" || value === \"running\" || isTerminalAgentRunStatus(value)\n}\n\nfunction isAgentRunFailure(value: unknown): value is AgentRunFailure {\n if (!isPlainRecord(value)) return false\n try {\n parseSixbFailure(value, AGENT_RUN_FAILURE_CODES)\n return true\n } catch {\n return false\n }\n}\n\n/** Single owner of the idempotency-key vocabulary for agent run stream records. */\nexport function agentRunStreamIdempotencyKey(event: AgentRunStreamEvent): string {\n switch (event.type) {\n case \"agent.run.started\":\n return `${event.runId}:${event.attempt}:started`\n case \"agent.ui.chunk\":\n return `${event.runId}:${event.attempt}:chunk:${event.chunkIndex}`\n case \"agent.message.finalized\":\n return `${event.runId}:${event.attempt}:message:${event.messageId}:finalized`\n case \"agent.run.finished\":\n return `${event.runId}:${event.attempt}:finished:${event.status}`\n }\n}\n\n/**\n * Ensure the run's stream and append its terminal record — mirrors {@link publishAgentRunCancel}.\n * Used where a terminal transition happens outside the worker (e.g. cancelling a queued run).\n */\nexport async function publishAgentRunFinished(broker: Broker, run: AgentRunRecord): Promise<void> {\n const event = agentRunFinishedEvent(run)\n await broker.ensureStream({\n projectId: run.projectId,\n stream: agentRunStreamDefinition(run.id),\n })\n await broker.append({\n projectId: run.projectId,\n streamId: agentRunStreamId(run.id),\n records: [\n {\n name: event.type,\n key: event.runId,\n // The event is built from JSON primitives only, so the round-trip is a safe narrowing.\n payload: JSON.parse(JSON.stringify(event)) as JsonValue,\n idempotencyKey: agentRunStreamIdempotencyKey(event),\n },\n ],\n })\n await publishAgentRunActivity(broker, run)\n}\n"
6
- ],
7
- "mappings": "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",
8
- "debugId": "4F8D3EDFA7A2B1D064756E2164756E21",
9
- "names": []
10
- }