@nicia-ai/typegraph 0.1.0

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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +47 -0
  3. package/dist/ast-BVyihVbP.d.cts +564 -0
  4. package/dist/ast-BVyihVbP.d.ts +564 -0
  5. package/dist/backend/drizzle/index.cjs +41 -0
  6. package/dist/backend/drizzle/index.cjs.map +1 -0
  7. package/dist/backend/drizzle/index.d.cts +12 -0
  8. package/dist/backend/drizzle/index.d.ts +12 -0
  9. package/dist/backend/drizzle/index.js +12 -0
  10. package/dist/backend/drizzle/index.js.map +1 -0
  11. package/dist/backend/drizzle/postgres.cjs +27 -0
  12. package/dist/backend/drizzle/postgres.cjs.map +1 -0
  13. package/dist/backend/drizzle/postgres.d.cts +37 -0
  14. package/dist/backend/drizzle/postgres.d.ts +37 -0
  15. package/dist/backend/drizzle/postgres.js +10 -0
  16. package/dist/backend/drizzle/postgres.js.map +1 -0
  17. package/dist/backend/drizzle/schema/postgres.cjs +40 -0
  18. package/dist/backend/drizzle/schema/postgres.cjs.map +1 -0
  19. package/dist/backend/drizzle/schema/postgres.d.cts +2419 -0
  20. package/dist/backend/drizzle/schema/postgres.d.ts +2419 -0
  21. package/dist/backend/drizzle/schema/postgres.js +7 -0
  22. package/dist/backend/drizzle/schema/postgres.js.map +1 -0
  23. package/dist/backend/drizzle/schema/sqlite.cjs +40 -0
  24. package/dist/backend/drizzle/schema/sqlite.cjs.map +1 -0
  25. package/dist/backend/drizzle/schema/sqlite.d.cts +2647 -0
  26. package/dist/backend/drizzle/schema/sqlite.d.ts +2647 -0
  27. package/dist/backend/drizzle/schema/sqlite.js +7 -0
  28. package/dist/backend/drizzle/schema/sqlite.js.map +1 -0
  29. package/dist/backend/drizzle/sqlite.cjs +27 -0
  30. package/dist/backend/drizzle/sqlite.cjs.map +1 -0
  31. package/dist/backend/drizzle/sqlite.d.cts +36 -0
  32. package/dist/backend/drizzle/sqlite.d.ts +36 -0
  33. package/dist/backend/drizzle/sqlite.js +10 -0
  34. package/dist/backend/drizzle/sqlite.js.map +1 -0
  35. package/dist/backend/postgres/index.cjs +53 -0
  36. package/dist/backend/postgres/index.cjs.map +1 -0
  37. package/dist/backend/postgres/index.d.cts +12 -0
  38. package/dist/backend/postgres/index.d.ts +12 -0
  39. package/dist/backend/postgres/index.js +12 -0
  40. package/dist/backend/postgres/index.js.map +1 -0
  41. package/dist/backend/sqlite/index.cjs +117 -0
  42. package/dist/backend/sqlite/index.cjs.map +1 -0
  43. package/dist/backend/sqlite/index.d.cts +71 -0
  44. package/dist/backend/sqlite/index.d.ts +71 -0
  45. package/dist/backend/sqlite/index.js +78 -0
  46. package/dist/backend/sqlite/index.js.map +1 -0
  47. package/dist/chunk-2QHQ2C4P.js +146 -0
  48. package/dist/chunk-2QHQ2C4P.js.map +1 -0
  49. package/dist/chunk-3A5TKOEJ.js +306 -0
  50. package/dist/chunk-3A5TKOEJ.js.map +1 -0
  51. package/dist/chunk-4PIEL2VO.js +162 -0
  52. package/dist/chunk-4PIEL2VO.js.map +1 -0
  53. package/dist/chunk-536PH5FT.js +342 -0
  54. package/dist/chunk-536PH5FT.js.map +1 -0
  55. package/dist/chunk-DBFCKELK.cjs +156 -0
  56. package/dist/chunk-DBFCKELK.cjs.map +1 -0
  57. package/dist/chunk-DDM2FZRJ.cjs +1143 -0
  58. package/dist/chunk-DDM2FZRJ.cjs.map +1 -0
  59. package/dist/chunk-DGUM43GV.js +10 -0
  60. package/dist/chunk-DGUM43GV.js.map +1 -0
  61. package/dist/chunk-F32HCHYA.cjs +680 -0
  62. package/dist/chunk-F32HCHYA.cjs.map +1 -0
  63. package/dist/chunk-IIAT36MI.js +353 -0
  64. package/dist/chunk-IIAT36MI.js.map +1 -0
  65. package/dist/chunk-JDAET5LO.js +236 -0
  66. package/dist/chunk-JDAET5LO.js.map +1 -0
  67. package/dist/chunk-JEQ2X3Z6.cjs +12 -0
  68. package/dist/chunk-JEQ2X3Z6.cjs.map +1 -0
  69. package/dist/chunk-JKTO7TW3.js +299 -0
  70. package/dist/chunk-JKTO7TW3.js.map +1 -0
  71. package/dist/chunk-K7SQ3SWP.js +497 -0
  72. package/dist/chunk-K7SQ3SWP.js.map +1 -0
  73. package/dist/chunk-L642L24T.js +142 -0
  74. package/dist/chunk-L642L24T.js.map +1 -0
  75. package/dist/chunk-MFVCSNIY.cjs +308 -0
  76. package/dist/chunk-MFVCSNIY.cjs.map +1 -0
  77. package/dist/chunk-MNO33ASC.cjs +240 -0
  78. package/dist/chunk-MNO33ASC.cjs.map +1 -0
  79. package/dist/chunk-N4AOJ3VF.cjs +154 -0
  80. package/dist/chunk-N4AOJ3VF.cjs.map +1 -0
  81. package/dist/chunk-P5CNM325.cjs +508 -0
  82. package/dist/chunk-P5CNM325.cjs.map +1 -0
  83. package/dist/chunk-RYT4H46I.js +646 -0
  84. package/dist/chunk-RYT4H46I.js.map +1 -0
  85. package/dist/chunk-SV5H3XM5.cjs +321 -0
  86. package/dist/chunk-SV5H3XM5.cjs.map +1 -0
  87. package/dist/chunk-TXHKFLWX.cjs +344 -0
  88. package/dist/chunk-TXHKFLWX.cjs.map +1 -0
  89. package/dist/chunk-UJAGXJDG.cjs +170 -0
  90. package/dist/chunk-UJAGXJDG.cjs.map +1 -0
  91. package/dist/chunk-VXRVGFCI.js +1128 -0
  92. package/dist/chunk-VXRVGFCI.js.map +1 -0
  93. package/dist/chunk-YM5AL65Y.cjs +357 -0
  94. package/dist/chunk-YM5AL65Y.cjs.map +1 -0
  95. package/dist/index.cjs +8334 -0
  96. package/dist/index.cjs.map +1 -0
  97. package/dist/index.d.cts +1365 -0
  98. package/dist/index.d.ts +1365 -0
  99. package/dist/index.js +8105 -0
  100. package/dist/index.js.map +1 -0
  101. package/dist/indexes/index.cjs +67 -0
  102. package/dist/indexes/index.cjs.map +1 -0
  103. package/dist/indexes/index.d.cts +62 -0
  104. package/dist/indexes/index.d.ts +62 -0
  105. package/dist/indexes/index.js +6 -0
  106. package/dist/indexes/index.js.map +1 -0
  107. package/dist/interchange/index.cjs +612 -0
  108. package/dist/interchange/index.cjs.map +1 -0
  109. package/dist/interchange/index.d.cts +288 -0
  110. package/dist/interchange/index.d.ts +288 -0
  111. package/dist/interchange/index.js +598 -0
  112. package/dist/interchange/index.js.map +1 -0
  113. package/dist/profiler/index.cjs +793 -0
  114. package/dist/profiler/index.cjs.map +1 -0
  115. package/dist/profiler/index.d.cts +283 -0
  116. package/dist/profiler/index.d.ts +283 -0
  117. package/dist/profiler/index.js +785 -0
  118. package/dist/profiler/index.js.map +1 -0
  119. package/dist/store-60Lcfi0w.d.ts +2263 -0
  120. package/dist/store-Bifii8MZ.d.cts +2263 -0
  121. package/dist/test-helpers-BjyRYJZX.d.ts +22 -0
  122. package/dist/test-helpers-NoQXhleQ.d.cts +22 -0
  123. package/dist/types-BRzHlhKC.d.cts +14 -0
  124. package/dist/types-BRzHlhKC.d.ts +14 -0
  125. package/dist/types-BrSfFSpW.d.cts +158 -0
  126. package/dist/types-CX4cLd7M.d.ts +152 -0
  127. package/dist/types-CjZ7g_7v.d.ts +442 -0
  128. package/dist/types-DDOSfrih.d.cts +442 -0
  129. package/dist/types-D_3mEv2y.d.ts +158 -0
  130. package/dist/types-a5rAxC92.d.cts +152 -0
  131. package/package.json +201 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/node.ts","../src/core/edge.ts","../src/ontology/types.ts","../src/core/meta-edge.ts","../src/core/external-ref.ts","../src/ontology/constants.ts","../src/ontology/core-meta-edges.ts","../src/ontology/closures.ts","../src/errors/validation.ts","../src/registry/kind-registry.ts","../src/registry/builders.ts","../src/query/compiler/predicates.ts","../src/query/compiler/schema.ts","../src/query/compiler/temporal.ts","../src/query/compiler/recursive.ts","../src/query/compiler/set-operations.ts","../src/query/compiler/index.ts","../src/query/cursor.ts","../src/utils/id.ts","../src/utils/path.ts","../src/utils/result.ts","../src/query/execution/result-mapper.ts","../src/query/execution/pagination.ts","../src/query/execution/field-tracker.ts","../src/query/execution/value-decoder.ts","../src/query/execution/selective-result-mapper.ts","../src/query/predicates.ts","../src/query/builder/ast-builder.ts","../src/query/builder/executable-query.ts","../src/query/builder/executable-aggregate-query.ts","../src/query/builder/validation.ts","../src/query/builder/traversal-builder.ts","../src/query/builder/query-builder.ts","../src/query/builder/unionable-query.ts","../src/query/builder/aggregates.ts","../src/query/builder/fragment.ts","../src/query/builder/index.ts","../src/query/builder.ts","../src/store/collections/edge-collection.ts","../src/store/collections/node-collection.ts","../src/store/collection-factory.ts","../src/constraints/index.ts","../src/store/constraints.ts","../src/store/row-mappers.ts","../src/store/operations/edge-operations.ts","../src/store/embedding-sync.ts","../src/store/uniqueness.ts","../src/store/operations/node-operations.ts","../src/schema/migration.ts","../src/schema/serializer.ts","../src/schema/manager.ts","../src/store/store.ts","../src/schema/deserializer.ts"],"names":["validateSchemaKeys","z","index","narrower","broader","field","qualifier","literal","arrayField","sql","compileQuery","predicate","compileSetOperation","quoteIdentifier","having","jsonPointer","RESERVED_NODE_KEYS","RESERVED_EDGE_KEYS","nullToUndefined","value","max","min","rowToEdge","executeEdgeCreate","executeEdgeUpdate","executeEdgeDelete","executeEdgeHardDelete","rowToNode","executeNodeCreate","executeNodeUpdate","executeNodeDelete","executeNodeHardDelete","count","exists","metaEdge"],"mappings":"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","file":"index.js","sourcesContent":["import { type z } from \"zod\";\n\nimport { ConfigurationError } from \"../errors/index\";\nimport { NODE_TYPE_BRAND, type NodeType } from \"./types\";\n\n// ============================================================\n// Reserved Keys\n// ============================================================\n\n/**\n * Property names that are reserved for system use and cannot appear in node schemas.\n * These are used for flattened node instances where props are spread at the top level.\n */\nconst RESERVED_NODE_KEYS = new Set([\"id\", \"kind\", \"meta\"]);\n\n// ============================================================\n// Node Factory Options\n// ============================================================\n\n/**\n * Options for defining a node type.\n */\nexport type DefineNodeOptions<S extends z.ZodObject<z.ZodRawShape>> = Readonly<{\n /** Zod schema for node properties */\n schema: S;\n /** Optional description for documentation */\n description?: string;\n}>;\n\n// ============================================================\n// Node Factory\n// ============================================================\n\n/**\n * Validates that a schema does not contain reserved property names.\n */\nfunction validateSchemaKeys(\n schema: z.ZodObject<z.ZodRawShape>,\n name: string,\n): void {\n const shape = schema.shape;\n const conflicts = Object.keys(shape).filter((key) =>\n RESERVED_NODE_KEYS.has(key),\n );\n if (conflicts.length > 0) {\n throw new ConfigurationError(\n `Node \"${name}\" schema contains reserved property names: ${conflicts.join(\", \")}`,\n { nodeType: name, conflicts, reservedKeys: [...RESERVED_NODE_KEYS] },\n {\n suggestion: `Rename the conflicting properties. Reserved names (id, kind, meta) are added automatically to all nodes.`,\n },\n );\n }\n}\n\n/**\n * Creates a node type definition.\n *\n * @example\n * ```typescript\n * const Person = defineNode(\"Person\", {\n * schema: z.object({\n * fullName: z.string().min(1),\n * email: z.string().email().optional(),\n * }),\n * description: \"A person in the system\",\n * });\n * ```\n */\nexport function defineNode<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n>(name: K, options: DefineNodeOptions<S>): NodeType<K, S> {\n validateSchemaKeys(options.schema, name);\n\n return Object.freeze({\n [NODE_TYPE_BRAND]: true as const,\n name,\n schema: options.schema,\n description: options.description,\n }) as NodeType<K, S>;\n}\n","import { z } from \"zod\";\n\nimport { ConfigurationError } from \"../errors/index\";\nimport { EDGE_TYPE_BRAND, type EdgeType, type NodeType } from \"./types\";\n\n// ============================================================\n// Reserved Keys\n// ============================================================\n\n/**\n * Property names that are reserved for system use and cannot appear in edge schemas.\n * These are used for flattened edge instances where props are spread at the top level.\n */\nconst RESERVED_EDGE_KEYS = new Set([\n \"id\",\n \"kind\",\n \"meta\",\n \"fromKind\",\n \"fromId\",\n \"toKind\",\n \"toId\",\n]);\n\n// ============================================================\n// Edge Factory Options\n// ============================================================\n\n/**\n * Options for defining an edge type.\n */\nexport type DefineEdgeOptions<\n S extends z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[] | undefined = undefined,\n To extends readonly NodeType[] | undefined = undefined,\n> = Readonly<{\n /** Zod schema for edge properties (defaults to empty object) */\n schema?: S;\n /** Optional description for documentation */\n description?: string;\n /** Node types that can be the source of this edge (domain constraint) */\n from?: From;\n /** Node types that can be the target of this edge (range constraint) */\n to?: To;\n}>;\n\n// ============================================================\n// Empty Schema\n// ============================================================\n\nconst EMPTY_SCHEMA = z.object({});\ntype EmptySchema = typeof EMPTY_SCHEMA;\n\n// ============================================================\n// Edge Factory\n// ============================================================\n\n/**\n * Validates that a schema does not contain reserved property names.\n */\nfunction validateSchemaKeys(\n schema: z.ZodObject<z.ZodRawShape>,\n name: string,\n): void {\n const shape = schema.shape;\n const conflicts = Object.keys(shape).filter((key) =>\n RESERVED_EDGE_KEYS.has(key),\n );\n if (conflicts.length > 0) {\n throw new ConfigurationError(\n `Edge \"${name}\" schema contains reserved property names: ${conflicts.join(\", \")}`,\n { edgeType: name, conflicts, reservedKeys: [...RESERVED_EDGE_KEYS] },\n {\n suggestion: `Rename the conflicting properties. Reserved names are added automatically to all edges.`,\n },\n );\n }\n}\n\n/**\n * Creates an edge type definition.\n *\n * @example\n * ```typescript\n * // Edge with no properties\n * const hasEpisode = defineEdge(\"hasEpisode\");\n *\n * // Edge with properties\n * const employedAt = defineEdge(\"employedAt\", {\n * schema: z.object({\n * isPrimary: z.boolean().default(true),\n * startedAt: z.date(),\n * }),\n * description: \"Employment relationship\",\n * });\n *\n * // Edge with domain/range constraints (can be used directly in defineGraph)\n * const worksAt = defineEdge(\"worksAt\", {\n * schema: z.object({ role: z.string() }),\n * from: [Person],\n * to: [Company],\n * });\n * ```\n */\n// Overload: no options - returns edge without domain/range\nexport function defineEdge<K extends string>(name: K): EdgeType<K, EmptySchema>;\n\n// Overload: options with both from and to - returns edge with domain/range\nexport function defineEdge<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[],\n To extends readonly NodeType[],\n>(\n name: K,\n options: DefineEdgeOptions<S, From, To> & { from: From; to: To },\n): EdgeType<K, S, From, To>;\n\n// Overload: options without from/to - returns edge without domain/range\nexport function defineEdge<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n>(name: K, options: DefineEdgeOptions<S>): EdgeType<K, S>;\n\n// Implementation\nexport function defineEdge<\n K extends string,\n S extends z.ZodObject<z.ZodRawShape>,\n From extends readonly NodeType[] | undefined,\n To extends readonly NodeType[] | undefined,\n>(\n name: K,\n options?: DefineEdgeOptions<S, From, To>,\n): EdgeType<K, S, From, To> | EdgeType<K, EmptySchema> {\n const schema = options?.schema ?? EMPTY_SCHEMA;\n validateSchemaKeys(schema, name);\n\n return Object.freeze({\n [EDGE_TYPE_BRAND]: true as const,\n name,\n schema,\n description: options?.description,\n from: options?.from,\n to: options?.to,\n }) as EdgeType<K, S, From, To> | EdgeType<K, EmptySchema>;\n}\n","import { type EdgeType, type NodeType } from \"../core/types\";\n\n// ============================================================\n// Brand Key\n// ============================================================\n\n/** Brand key for MetaEdge */\nexport const META_EDGE_BRAND = \"__metaEdge\" as const;\n\n// ============================================================\n// Inference Types\n// ============================================================\n\n/**\n * How a meta-edge affects queries and validation.\n */\nexport type InferenceType =\n | \"subsumption\" // Query for X includes instances of subclasses\n | \"hierarchy\" // Enables broader/narrower traversal\n | \"substitution\" // Can substitute equivalent types\n | \"constraint\" // Validation rules\n | \"composition\" // Part-whole navigation\n | \"association\" // Discovery/recommendation\n | \"none\"; // No automatic inference\n\n// ============================================================\n// Meta-Edge Properties\n// ============================================================\n\n/**\n * Properties of a meta-edge.\n */\nexport type MetaEdgeProperties = Readonly<{\n transitive: boolean; // A→B, B→C implies A→C\n symmetric: boolean; // A→B implies B→A\n reflexive: boolean; // A→A is always true\n inverse: string | undefined; // Name of inverse meta-edge\n inference: InferenceType; // How this affects queries\n description: string | undefined;\n}>;\n\n// ============================================================\n// Meta-Edge Type\n// ============================================================\n\n/**\n * A meta-edge definition.\n *\n * Meta-edges represent type-level relationships (between kinds),\n * not instance-level relationships (between nodes).\n */\nexport type MetaEdge<K extends string = string> = Readonly<{\n [META_EDGE_BRAND]: true;\n name: K;\n properties: MetaEdgeProperties;\n}>;\n\n// ============================================================\n// Ontology Relation\n// ============================================================\n\n/**\n * A relation in the ontology (instance of meta-edge between types).\n *\n * @example\n * ```typescript\n * // Podcast subClassOf Media\n * subClassOf(Podcast, Media)\n *\n * // Person equivalentTo schema:Person\n * equivalentTo(Person, \"https://schema.org/Person\")\n * ```\n */\nexport type OntologyRelation = Readonly<{\n metaEdge: MetaEdge;\n from: NodeType | EdgeType | string; // string for external IRIs\n to: NodeType | EdgeType | string;\n}>;\n\n// ============================================================\n// Type Guards\n// ============================================================\n\n/**\n * Checks if a value is a MetaEdge.\n */\nexport function isMetaEdge(value: unknown): value is MetaEdge {\n return (\n typeof value === \"object\" &&\n value !== null &&\n META_EDGE_BRAND in value &&\n (value as Record<string, unknown>)[META_EDGE_BRAND] === true\n );\n}\n\n/**\n * Gets the type name from a NodeType, EdgeType, or IRI string.\n */\nexport function getTypeName(typeOrIri: NodeType | EdgeType | string): string {\n if (typeof typeOrIri === \"string\") {\n return typeOrIri;\n }\n return typeOrIri.name;\n}\n","import {\n type InferenceType,\n META_EDGE_BRAND,\n type MetaEdge,\n type MetaEdgeProperties,\n} from \"../ontology/types\";\n\n// ============================================================\n// Meta-Edge Factory Options\n// ============================================================\n\n/**\n * Options for creating a meta-edge.\n */\nexport type MetaEdgeOptions = Readonly<{\n /** Whether the relationship is transitive (A→B, B→C implies A→C) */\n transitive?: boolean;\n /** Whether the relationship is symmetric (A→B implies B→A) */\n symmetric?: boolean;\n /** Whether the relationship is reflexive (A→A is always true) */\n reflexive?: boolean;\n /** Name of the inverse meta-edge */\n inverse?: string;\n /** How this meta-edge affects queries and validation */\n inference?: InferenceType;\n /** Optional description */\n description?: string;\n}>;\n\n// ============================================================\n// Meta-Edge Factory\n// ============================================================\n\n/**\n * Creates a custom meta-edge definition.\n *\n * @example\n * ```typescript\n * // Custom meta-edge for regulatory relationships\n * const regulatedBy = metaEdge(\"regulatedBy\", {\n * description: \"Type X is regulated by authority type Y\",\n * transitive: false,\n * symmetric: false,\n * });\n * ```\n */\nexport function metaEdge<K extends string>(\n name: K,\n options: MetaEdgeOptions = {},\n): MetaEdge<K> {\n const properties: MetaEdgeProperties = {\n transitive: options.transitive ?? false,\n symmetric: options.symmetric ?? false,\n reflexive: options.reflexive ?? false,\n inverse: options.inverse,\n inference: options.inference ?? \"none\",\n description: options.description,\n };\n\n return Object.freeze({\n [META_EDGE_BRAND]: true as const,\n name,\n properties,\n }) as MetaEdge<K>;\n}\n","/**\n * External reference type for hybrid overlay patterns.\n *\n * Creates a Zod-compatible schema for referencing entities in external\n * data sources (e.g., existing application tables) from TypeGraph nodes.\n */\nimport { z } from \"zod\";\n\n// ============================================================\n// External Reference Metadata Symbol\n// ============================================================\n\n/**\n * Symbol key for storing external table name on the schema.\n * This allows the schema introspector to detect external reference types\n * and extract source information.\n */\nexport const EXTERNAL_REF_TABLE_KEY = \"_externalRefTable\" as const;\n\n// ============================================================\n// External Reference Value Type\n// ============================================================\n\n/**\n * The shape of an external reference value.\n * Contains the source table identifier and the ID of the referenced record.\n */\nexport type ExternalRefValue<T extends string = string> = Readonly<{\n table: T;\n id: string;\n}>;\n\n// ============================================================\n// External Reference Schema Type\n// ============================================================\n\n/**\n * A Zod schema for external references with attached table metadata.\n */\nexport type ExternalRefSchema<T extends string = string> = z.ZodType<\n ExternalRefValue<T>\n> &\n Readonly<{\n [EXTERNAL_REF_TABLE_KEY]: T;\n }>;\n\n// ============================================================\n// External Reference Factory\n// ============================================================\n\n/**\n * Creates a Zod schema for referencing external data sources.\n *\n * Use this when building a hybrid overlay where TypeGraph stores\n * graph relationships and metadata while your existing tables\n * remain the source of truth for entity data.\n *\n * @param table - The identifier for the external table/source (e.g., \"users\", \"documents\")\n * @returns A Zod schema that validates external reference objects\n *\n * @example\n * ```typescript\n * import { defineNode, externalRef, embedding } from \"@nicia-ai/typegraph\";\n *\n * // Reference documents from your existing application database\n * const Document = defineNode(\"Document\", {\n * schema: z.object({\n * source: externalRef(\"documents\"),\n * embedding: embedding(1536).optional(),\n * extractedTopics: z.array(z.string()).optional(),\n * }),\n * });\n *\n * // Create a node referencing an external document\n * await store.nodes.Document.create({\n * source: { table: \"documents\", id: \"doc_abc123\" },\n * embedding: await generateEmbedding(docContent),\n * });\n *\n * // Query and hydrate with external data\n * const results = await store\n * .query()\n * .from(\"Document\", \"d\")\n * .whereNode(\"d\", (d) => d.embedding.similarTo(query, 10))\n * .select((ctx) => ctx.d.source)\n * .execute();\n *\n * // Fetch full data from your app database\n * const externalIds = results.map((r) => r.id);\n * const fullDocs = await appDb.query.documents.findMany({\n * where: inArray(documents.id, externalIds),\n * });\n * ```\n */\nexport function externalRef<T extends string>(table: T): ExternalRefSchema<T> {\n if (typeof table !== \"string\" || table.length === 0) {\n throw new Error(\n `External reference table must be a non-empty string, got: ${typeof table === \"string\" ? `\"${table}\"` : typeof table}`,\n );\n }\n\n const schema = z.object({\n table: z.literal(table),\n id: z.string().min(1, \"External reference ID must be non-empty\"),\n });\n\n // Attach table metadata for introspection\n return Object.assign(schema, {\n [EXTERNAL_REF_TABLE_KEY]: table,\n }) as unknown as ExternalRefSchema<T>;\n}\n\n// ============================================================\n// Type Guards\n// ============================================================\n\n/**\n * Checks if a value is an external reference schema.\n */\nexport function isExternalRefSchema(\n value: unknown,\n): value is ExternalRefSchema {\n return (\n typeof value === \"object\" &&\n value !== null &&\n EXTERNAL_REF_TABLE_KEY in value &&\n typeof (value as Record<string, unknown>)[EXTERNAL_REF_TABLE_KEY] ===\n \"string\"\n );\n}\n\n/**\n * Gets the table name from an external reference schema.\n * Returns undefined if the schema is not an external reference schema.\n */\nexport function getExternalRefTable(schema: z.ZodType): string | undefined {\n if (isExternalRefSchema(schema)) {\n return schema[EXTERNAL_REF_TABLE_KEY];\n }\n return undefined;\n}\n\n// ============================================================\n// Helper for creating reference values\n// ============================================================\n\n/**\n * Helper function to create a typed external reference value.\n * Useful when you want to avoid repeating the table name.\n *\n * @example\n * ```typescript\n * const docRef = createExternalRef(\"documents\");\n *\n * await store.nodes.Document.create({\n * source: docRef(\"doc_123\"),\n * embedding: [...],\n * });\n * ```\n */\nexport function createExternalRef<T extends string>(\n table: T,\n): (id: string) => ExternalRefValue<T> {\n return (id: string) => ({ table, id });\n}\n","/**\n * Named constants for ontology meta-edge names.\n *\n * Use these constants instead of string literals for type safety\n * and IDE support.\n */\n\n// ============================================================\n// Meta-Edge Names\n// ============================================================\n\n/** Type inheritance (Podcast subClassOf Media) */\nexport const META_EDGE_SUB_CLASS_OF = \"subClassOf\" as const;\n\n/** Broader concept (ML broader AI) */\nexport const META_EDGE_BROADER = \"broader\" as const;\n\n/** Narrower concept (AI narrower ML) */\nexport const META_EDGE_NARROWER = \"narrower\" as const;\n\n/** Non-hierarchical association */\nexport const META_EDGE_RELATED_TO = \"relatedTo\" as const;\n\n/** Same class, different representation */\nexport const META_EDGE_EQUIVALENT_TO = \"equivalentTo\" as const;\n\n/** Same individual (for deduplication) */\nexport const META_EDGE_SAME_AS = \"sameAs\" as const;\n\n/** Explicitly different individuals */\nexport const META_EDGE_DIFFERENT_FROM = \"differentFrom\" as const;\n\n/** Mutually exclusive types */\nexport const META_EDGE_DISJOINT_WITH = \"disjointWith\" as const;\n\n/** X is part of Y */\nexport const META_EDGE_PART_OF = \"partOf\" as const;\n\n/** Y has part X */\nexport const META_EDGE_HAS_PART = \"hasPart\" as const;\n\n/** Edge A is inverse of edge B */\nexport const META_EDGE_INVERSE_OF = \"inverseOf\" as const;\n\n/** Edge A implies edge B exists */\nexport const META_EDGE_IMPLIES = \"implies\" as const;\n\n// ============================================================\n// All Meta-Edge Names (for validation)\n// ============================================================\n\nexport const ALL_META_EDGE_NAMES = [\n META_EDGE_SUB_CLASS_OF,\n META_EDGE_BROADER,\n META_EDGE_NARROWER,\n META_EDGE_RELATED_TO,\n META_EDGE_EQUIVALENT_TO,\n META_EDGE_SAME_AS,\n META_EDGE_DIFFERENT_FROM,\n META_EDGE_DISJOINT_WITH,\n META_EDGE_PART_OF,\n META_EDGE_HAS_PART,\n META_EDGE_INVERSE_OF,\n META_EDGE_IMPLIES,\n] as const;\n\nexport type MetaEdgeName = (typeof ALL_META_EDGE_NAMES)[number];\n","import { type EdgeType, type NodeType } from \"../core/types\";\nimport {\n META_EDGE_BROADER,\n META_EDGE_DIFFERENT_FROM,\n META_EDGE_DISJOINT_WITH,\n META_EDGE_EQUIVALENT_TO,\n META_EDGE_HAS_PART,\n META_EDGE_IMPLIES,\n META_EDGE_INVERSE_OF,\n META_EDGE_NARROWER,\n META_EDGE_PART_OF,\n META_EDGE_RELATED_TO,\n META_EDGE_SAME_AS,\n META_EDGE_SUB_CLASS_OF,\n} from \"./constants\";\nimport { META_EDGE_BRAND, type MetaEdge, type OntologyRelation } from \"./types\";\n\n// ============================================================\n// Helper to Create Meta-Edge\n// ============================================================\n\nfunction createMetaEdge<K extends string>(\n name: K,\n properties: {\n transitive?: boolean;\n symmetric?: boolean;\n reflexive?: boolean;\n inverse?: string;\n inference:\n | \"subsumption\"\n | \"hierarchy\"\n | \"substitution\"\n | \"constraint\"\n | \"composition\"\n | \"association\"\n | \"none\";\n description: string;\n },\n): MetaEdge<K> {\n return Object.freeze({\n [META_EDGE_BRAND]: true as const,\n name,\n properties: {\n transitive: properties.transitive ?? false,\n symmetric: properties.symmetric ?? false,\n reflexive: properties.reflexive ?? false,\n inverse: properties.inverse,\n inference: properties.inference,\n description: properties.description,\n },\n }) as MetaEdge<K>;\n}\n\n// ============================================================\n// Subsumption & Classification\n// ============================================================\n\n/**\n * Type inheritance relationship.\n * A subClassOf B means instances of A are also instances of B.\n */\nconst subClassOfMetaEdge = createMetaEdge(META_EDGE_SUB_CLASS_OF, {\n transitive: true,\n inference: \"subsumption\",\n description: \"Type inheritance (Podcast subClassOf Media)\",\n});\n\n/**\n * Creates a subClassOf ontology relation.\n */\nexport function subClassOf(\n child: NodeType,\n parent: NodeType,\n): OntologyRelation {\n return {\n metaEdge: subClassOfMetaEdge,\n from: child,\n to: parent,\n };\n}\n\n// ============================================================\n// Hierarchical (SKOS-inspired)\n// ============================================================\n\n/**\n * Broader concept relationship.\n * A broader B means A is a more specific concept than B.\n */\nconst broaderMetaEdge = createMetaEdge(META_EDGE_BROADER, {\n transitive: true,\n inverse: META_EDGE_NARROWER,\n inference: \"hierarchy\",\n description: \"Broader concept (ML broader AI)\",\n});\n\n/**\n * Creates a broader ontology relation.\n */\nexport function broader(\n narrowerConcept: NodeType,\n broaderConcept: NodeType,\n): OntologyRelation {\n return {\n metaEdge: broaderMetaEdge,\n from: narrowerConcept,\n to: broaderConcept,\n };\n}\n\n/**\n * Narrower concept relationship.\n * A narrower B means A is a more general concept than B.\n */\nconst narrowerMetaEdge = createMetaEdge(META_EDGE_NARROWER, {\n transitive: true,\n inverse: META_EDGE_BROADER,\n inference: \"hierarchy\",\n description: \"Narrower concept (AI narrower ML)\",\n});\n\n/**\n * Creates a narrower ontology relation.\n */\nexport function narrower(\n broaderConcept: NodeType,\n narrowerConcept: NodeType,\n): OntologyRelation {\n return {\n metaEdge: narrowerMetaEdge,\n from: broaderConcept,\n to: narrowerConcept,\n };\n}\n\n/**\n * Related concept relationship.\n * Non-hierarchical association between concepts.\n */\nconst relatedToMetaEdge = createMetaEdge(META_EDGE_RELATED_TO, {\n symmetric: true,\n inference: \"association\",\n description: \"Non-hierarchical association\",\n});\n\n/**\n * Creates a relatedTo ontology relation.\n */\nexport function relatedTo(\n conceptA: NodeType,\n conceptB: NodeType,\n): OntologyRelation {\n return {\n metaEdge: relatedToMetaEdge,\n from: conceptA,\n to: conceptB,\n };\n}\n\n// ============================================================\n// Equivalence & Identity (OWL-inspired)\n// ============================================================\n\n/**\n * Type equivalence relationship.\n * A equivalentTo B means they represent the same class.\n */\nconst equivalentToMetaEdge = createMetaEdge(META_EDGE_EQUIVALENT_TO, {\n symmetric: true,\n transitive: true,\n inference: \"substitution\",\n description: \"Same class, different representation\",\n});\n\n/**\n * Creates an equivalentTo ontology relation.\n * Can be used with external IRIs for cross-system mapping.\n */\nexport function equivalentTo(\n kindA: NodeType,\n kindBOrIri: NodeType | string,\n): OntologyRelation {\n return {\n metaEdge: equivalentToMetaEdge,\n from: kindA,\n to: kindBOrIri,\n };\n}\n\n/**\n * Instance identity relationship.\n * A sameAs B means they refer to the same individual.\n */\nconst sameAsMetaEdge = createMetaEdge(META_EDGE_SAME_AS, {\n symmetric: true,\n transitive: true,\n inference: \"substitution\",\n description: \"Same individual (for deduplication)\",\n});\n\n/**\n * Creates a sameAs ontology relation.\n */\nexport function sameAs(\n kindA: NodeType,\n kindBOrIri: NodeType | string,\n): OntologyRelation {\n return {\n metaEdge: sameAsMetaEdge,\n from: kindA,\n to: kindBOrIri,\n };\n}\n\n/**\n * Explicit non-identity relationship.\n * A differentFrom B means they are definitely different individuals.\n */\nconst differentFromMetaEdge = createMetaEdge(META_EDGE_DIFFERENT_FROM, {\n symmetric: true,\n inference: \"constraint\",\n description: \"Explicitly different individuals\",\n});\n\n/**\n * Creates a differentFrom ontology relation.\n */\nexport function differentFrom(\n kindA: NodeType,\n kindB: NodeType,\n): OntologyRelation {\n return {\n metaEdge: differentFromMetaEdge,\n from: kindA,\n to: kindB,\n };\n}\n\n/**\n * Disjoint types relationship.\n * A disjointWith B means nothing can be both an A and a B.\n */\nconst disjointWithMetaEdge = createMetaEdge(META_EDGE_DISJOINT_WITH, {\n symmetric: true,\n inference: \"constraint\",\n description: \"Mutually exclusive types\",\n});\n\n/**\n * Creates a disjointWith ontology relation.\n */\nexport function disjointWith(\n kindA: NodeType,\n kindB: NodeType,\n): OntologyRelation {\n return {\n metaEdge: disjointWithMetaEdge,\n from: kindA,\n to: kindB,\n };\n}\n\n// ============================================================\n// Mereological (Part-Whole)\n// ============================================================\n\n/**\n * Part-of relationship.\n * A partOf B means A is a component of B.\n */\nconst partOfMetaEdge = createMetaEdge(META_EDGE_PART_OF, {\n transitive: true,\n inverse: META_EDGE_HAS_PART,\n inference: \"composition\",\n description: \"X is part of Y\",\n});\n\n/**\n * Creates a partOf ontology relation.\n */\nexport function partOf(part: NodeType, whole: NodeType): OntologyRelation {\n return {\n metaEdge: partOfMetaEdge,\n from: part,\n to: whole,\n };\n}\n\n/**\n * Has-part relationship.\n * A hasPart B means A contains B as a component.\n */\nconst hasPartMetaEdge = createMetaEdge(META_EDGE_HAS_PART, {\n transitive: true,\n inverse: META_EDGE_PART_OF,\n inference: \"composition\",\n description: \"Y has part X\",\n});\n\n/**\n * Creates a hasPart ontology relation.\n */\nexport function hasPart(whole: NodeType, part: NodeType): OntologyRelation {\n return {\n metaEdge: hasPartMetaEdge,\n from: whole,\n to: part,\n };\n}\n\n// ============================================================\n// Property Relationships\n// ============================================================\n\n/**\n * Inverse edge relationship.\n * Edge A inverseOf edge B means traversing A is equivalent to traversing B backwards.\n */\nconst inverseOfMetaEdge = createMetaEdge(META_EDGE_INVERSE_OF, {\n symmetric: true,\n inference: \"none\",\n description: \"Edge A is inverse of edge B\",\n});\n\n/**\n * Implication relationship.\n * Edge A implies edge B means if A exists, B should also exist.\n */\nconst impliesMetaEdge = createMetaEdge(META_EDGE_IMPLIES, {\n transitive: true,\n inference: \"none\",\n description: \"Edge A implies edge B exists\",\n});\n\n/**\n * Creates an inverseOf ontology relation.\n * Edge A inverseOf edge B means traversing A is equivalent to traversing B backwards.\n */\nexport function inverseOf(edgeA: EdgeType, edgeB: EdgeType): OntologyRelation {\n return {\n metaEdge: inverseOfMetaEdge,\n from: edgeA,\n to: edgeB,\n };\n}\n\n/**\n * Creates an implies ontology relation.\n * Edge A implies edge B means if A exists between two nodes, B should also exist.\n */\nexport function implies(edgeA: EdgeType, edgeB: EdgeType): OntologyRelation {\n return {\n metaEdge: impliesMetaEdge,\n from: edgeA,\n to: edgeB,\n };\n}\n\n// ============================================================\n// Core Ontology Export\n// ============================================================\n\n/**\n * The core ontology module containing all built-in meta-edges\n * and their relation factory functions.\n */\nexport const core = {\n // Meta-edges\n subClassOfMetaEdge,\n broaderMetaEdge,\n narrowerMetaEdge,\n relatedToMetaEdge,\n equivalentToMetaEdge,\n sameAsMetaEdge,\n differentFromMetaEdge,\n disjointWithMetaEdge,\n partOfMetaEdge,\n hasPartMetaEdge,\n inverseOfMetaEdge,\n impliesMetaEdge,\n\n // Relation factories\n subClassOf,\n broader,\n narrower,\n relatedTo,\n equivalentTo,\n sameAs,\n differentFrom,\n disjointWith,\n partOf,\n hasPart,\n inverseOf,\n implies,\n} as const;\n","/**\n * Transitive closure computation for ontology relationships.\n *\n * Uses Warshall's algorithm for efficient closure computation.\n */\n\n/**\n * Computes the transitive closure of a set of directed relations.\n *\n * Given relations like [A→B, B→C], computes all transitive paths [A→B, A→C, B→C].\n *\n * @param relations - Array of [from, to] pairs representing direct relationships\n * @returns Map from each 'from' to the set of all reachable 'to' values\n */\nexport function computeTransitiveClosure(\n relations: readonly (readonly [string, string])[],\n): ReadonlyMap<string, ReadonlySet<string>> {\n // Build mutable map for computation\n const closure = new Map<string, Set<string>>();\n\n // Collect all nodes\n const allNodes = new Set<string>();\n for (const [from, to] of relations) {\n allNodes.add(from);\n allNodes.add(to);\n }\n\n // Initialize empty sets for all nodes\n for (const node of allNodes) {\n closure.set(node, new Set());\n }\n\n // Add direct relationships\n for (const [from, to] of relations) {\n closure.get(from)?.add(to);\n }\n\n // Warshall's algorithm for transitive closure\n // For each intermediate node k, check if i→k and k→j implies i→j\n for (const k of allNodes) {\n for (const index of allNodes) {\n const indexReaches = closure.get(index);\n if (!indexReaches?.has(k)) continue;\n\n const kReaches = closure.get(k);\n if (!kReaches) continue;\n\n for (const index of kReaches) {\n indexReaches.add(index);\n }\n }\n }\n\n return closure;\n}\n\n/**\n * Computes the inverse of a transitive closure map.\n *\n * Given A→{B, C}, returns B→{A}, C→{A}.\n */\nexport function invertClosure(\n closure: ReadonlyMap<string, ReadonlySet<string>>,\n): ReadonlyMap<string, ReadonlySet<string>> {\n const result = new Map<string, Set<string>>();\n\n for (const [from, tos] of closure) {\n for (const to of tos) {\n const existing = result.get(to) ?? new Set();\n existing.add(from);\n result.set(to, existing);\n }\n }\n\n return result;\n}\n\n/**\n * Checks if there's a path from source to target in the closure.\n */\nexport function isReachable(\n closure: ReadonlyMap<string, ReadonlySet<string>>,\n source: string,\n target: string,\n): boolean {\n return closure.get(source)?.has(target) ?? false;\n}\n","/**\n * Contextual Validation Utilities\n *\n * Provides Zod validation wrappers that include full context about\n * which entity (node/edge) and operation (create/update) failed.\n *\n * @example\n * ```typescript\n * const props = validateNodeProps(schema, input, {\n * kind: \"Person\",\n * operation: \"create\",\n * });\n * ```\n */\n\nimport { type ZodError, type ZodType } from \"zod\";\n\nimport { ValidationError, type ValidationIssue } from \"./index\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Context for validation operations.\n */\nexport type ValidationContext = Readonly<{\n /** Type of entity being validated */\n entityType: \"node\" | \"edge\";\n /** Kind/type name of the entity */\n kind: string;\n /** Operation being performed */\n operation: \"create\" | \"update\";\n /** Entity ID (for updates) */\n id?: string;\n}>;\n\n// ============================================================\n// Validation Functions\n// ============================================================\n\n/**\n * Converts Zod issues to ValidationIssue format.\n */\nfunction zodIssuesToValidationIssues(error: ZodError): ValidationIssue[] {\n return error.issues.map((issue) => ({\n path: issue.path.join(\".\"),\n message: issue.message,\n code: issue.code,\n }));\n}\n\n/**\n * Builds a descriptive location string for error messages.\n */\nfunction buildLocationString(context: ValidationContext): string {\n if (context.id) {\n return `${context.kind}/${context.id}`;\n }\n return `new ${context.kind}`;\n}\n\n/**\n * Validates props with full context for error messages.\n *\n * @param schema - Zod schema to validate against\n * @param props - Properties to validate\n * @param context - Context about the entity and operation\n * @returns Validated and transformed props\n * @throws ValidationError with full context if validation fails\n *\n * @example\n * ```typescript\n * const validatedProps = validateProps(personSchema, input, {\n * entityType: \"node\",\n * kind: \"Person\",\n * operation: \"create\",\n * });\n * ```\n */\nexport function validateProps<T>(\n schema: ZodType<T>,\n props: unknown,\n context: ValidationContext,\n): T {\n const result = schema.safeParse(props);\n\n if (result.success) {\n return result.data;\n }\n\n const issues = zodIssuesToValidationIssues(result.error);\n const location = buildLocationString(context);\n\n throw new ValidationError(\n `Invalid ${context.entityType} props for ${location}: ${result.error.message}`,\n {\n entityType: context.entityType,\n kind: context.kind,\n operation: context.operation,\n ...(context.id !== undefined && { id: context.id }),\n issues,\n },\n { cause: result.error },\n );\n}\n\n/**\n * Validates node props with full context.\n *\n * Convenience wrapper around validateProps for node operations.\n *\n * @example\n * ```typescript\n * const props = validateNodeProps(schema, input, {\n * kind: \"Person\",\n * operation: \"create\",\n * });\n * ```\n */\nexport function validateNodeProps<T>(\n schema: ZodType<T>,\n props: unknown,\n context: Readonly<{\n kind: string;\n operation: \"create\" | \"update\";\n id?: string;\n }>,\n): T {\n return validateProps(schema, props, {\n entityType: \"node\",\n ...context,\n });\n}\n\n/**\n * Validates edge props with full context.\n *\n * Convenience wrapper around validateProps for edge operations.\n *\n * @example\n * ```typescript\n * const props = validateEdgeProps(schema, input, {\n * kind: \"worksAt\",\n * operation: \"create\",\n * });\n * ```\n */\nexport function validateEdgeProps<T>(\n schema: ZodType<T>,\n props: unknown,\n context: Readonly<{\n kind: string;\n operation: \"create\" | \"update\";\n id?: string;\n }>,\n): T {\n return validateProps(schema, props, {\n entityType: \"edge\",\n ...context,\n });\n}\n\n/**\n * Wraps a Zod error with TypeGraph context.\n *\n * Use this when you've already caught a ZodError and want to\n * convert it to a ValidationError with context.\n *\n * @example\n * ```typescript\n * try {\n * schema.parse(input);\n * } catch (error) {\n * if (error instanceof ZodError) {\n * throw wrapZodError(error, {\n * entityType: \"node\",\n * kind: \"Person\",\n * operation: \"create\",\n * });\n * }\n * throw error;\n * }\n * ```\n */\nexport function wrapZodError(\n error: ZodError,\n context: ValidationContext,\n): ValidationError {\n const issues = zodIssuesToValidationIssues(error);\n const location = buildLocationString(context);\n\n return new ValidationError(\n `Validation failed for ${context.entityType} ${location}: ${error.message}`,\n {\n entityType: context.entityType,\n kind: context.kind,\n operation: context.operation,\n ...(context.id !== undefined && { id: context.id }),\n issues,\n },\n { cause: error },\n );\n}\n\n/**\n * Creates a simple ValidationError without Zod context.\n *\n * Use this for custom validation rules that aren't part of a Zod schema.\n *\n * @example\n * ```typescript\n * if (startDate > endDate) {\n * throw createValidationError(\n * \"Start date must be before end date\",\n * [{ path: \"startDate\", message: \"Must be before endDate\" }],\n * { entityType: \"edge\", kind: \"employment\", operation: \"create\" }\n * );\n * }\n * ```\n */\nexport function createValidationError(\n message: string,\n issues: ValidationIssue[],\n context?: Partial<ValidationContext>,\n): ValidationError {\n return new ValidationError(message, {\n ...(context?.entityType !== undefined && {\n entityType: context.entityType,\n }),\n ...(context?.kind !== undefined && { kind: context.kind }),\n ...(context?.operation !== undefined && { operation: context.operation }),\n ...(context?.id !== undefined && { id: context.id }),\n issues,\n });\n}\n","import { type AnyEdgeType, type NodeType } from \"../core/types\";\nimport {\n computeTransitiveClosure,\n invertClosure,\n isReachable,\n} from \"../ontology/closures\";\nimport {\n META_EDGE_BROADER,\n META_EDGE_DISJOINT_WITH,\n META_EDGE_EQUIVALENT_TO,\n META_EDGE_HAS_PART,\n META_EDGE_IMPLIES,\n META_EDGE_INVERSE_OF,\n META_EDGE_NARROWER,\n META_EDGE_PART_OF,\n META_EDGE_SAME_AS,\n META_EDGE_SUB_CLASS_OF,\n} from \"../ontology/constants\";\nimport { type OntologyRelation } from \"../ontology/types\";\n\n/**\n * KindRegistry holds precomputed closures for ontological reasoning.\n *\n * Computed at store initialization and cached for fast query-time lookups.\n */\nexport class KindRegistry {\n // === Node & Edge Kinds ===\n readonly nodeKinds: ReadonlyMap<string, NodeType>;\n readonly edgeKinds: ReadonlyMap<string, AnyEdgeType>;\n\n // === Subsumption (subClassOf) ===\n // Transitive closure for inheritance\n readonly subClassAncestors: ReadonlyMap<string, ReadonlySet<string>>;\n readonly subClassDescendants: ReadonlyMap<string, ReadonlySet<string>>;\n\n // === Hierarchy (broader/narrower) ===\n // Transitive closure for concept hierarchy (separate from subClassOf!)\n readonly broaderClosure: ReadonlyMap<string, ReadonlySet<string>>;\n readonly narrowerClosure: ReadonlyMap<string, ReadonlySet<string>>;\n\n // === Equivalence ===\n readonly equivalenceSets: ReadonlyMap<string, ReadonlySet<string>>;\n readonly iriToKind: ReadonlyMap<string, string>;\n\n // === Constraints ===\n readonly disjointPairs: ReadonlySet<string>; // Normalized pairs: \"Organization|Person\"\n\n // === Composition ===\n readonly partOfClosure: ReadonlyMap<string, ReadonlySet<string>>;\n readonly hasPartClosure: ReadonlyMap<string, ReadonlySet<string>>;\n\n // === Edge Relationships ===\n readonly edgeInverses: ReadonlyMap<string, string>;\n readonly edgeImplicationsClosure: ReadonlyMap<string, ReadonlySet<string>>;\n readonly edgeImplyingClosure: ReadonlyMap<string, ReadonlySet<string>>;\n\n constructor(\n nodeKinds: ReadonlyMap<string, NodeType>,\n edgeKinds: ReadonlyMap<string, AnyEdgeType>,\n closures: {\n subClassAncestors: ReadonlyMap<string, ReadonlySet<string>>;\n subClassDescendants: ReadonlyMap<string, ReadonlySet<string>>;\n broaderClosure: ReadonlyMap<string, ReadonlySet<string>>;\n narrowerClosure: ReadonlyMap<string, ReadonlySet<string>>;\n equivalenceSets: ReadonlyMap<string, ReadonlySet<string>>;\n iriToKind: ReadonlyMap<string, string>;\n disjointPairs: ReadonlySet<string>;\n partOfClosure: ReadonlyMap<string, ReadonlySet<string>>;\n hasPartClosure: ReadonlyMap<string, ReadonlySet<string>>;\n edgeInverses: ReadonlyMap<string, string>;\n edgeImplicationsClosure: ReadonlyMap<string, ReadonlySet<string>>;\n edgeImplyingClosure: ReadonlyMap<string, ReadonlySet<string>>;\n },\n ) {\n this.nodeKinds = nodeKinds;\n this.edgeKinds = edgeKinds;\n this.subClassAncestors = closures.subClassAncestors;\n this.subClassDescendants = closures.subClassDescendants;\n this.broaderClosure = closures.broaderClosure;\n this.narrowerClosure = closures.narrowerClosure;\n this.equivalenceSets = closures.equivalenceSets;\n this.iriToKind = closures.iriToKind;\n this.disjointPairs = closures.disjointPairs;\n this.partOfClosure = closures.partOfClosure;\n this.hasPartClosure = closures.hasPartClosure;\n this.edgeInverses = closures.edgeInverses;\n this.edgeImplicationsClosure = closures.edgeImplicationsClosure;\n this.edgeImplyingClosure = closures.edgeImplyingClosure;\n }\n\n // === Subsumption Methods ===\n\n /**\n * Checks if child is a subclass of parent (directly or transitively).\n */\n isSubClassOf(child: string, parent: string): boolean {\n return isReachable(this.subClassAncestors, child, parent);\n }\n\n /**\n * Expands a kind to include all its subclasses.\n * Returns [kind, ...subclasses].\n */\n expandSubClasses(kind: string): readonly string[] {\n const descendants = this.subClassDescendants.get(kind) ?? new Set();\n return [kind, ...descendants];\n }\n\n /**\n * Gets all ancestors of a kind (via subClassOf).\n */\n getAncestors(kind: string): ReadonlySet<string> {\n return this.subClassAncestors.get(kind) ?? new Set();\n }\n\n /**\n * Gets all descendants of a kind (via subClassOf).\n */\n getDescendants(kind: string): ReadonlySet<string> {\n return this.subClassDescendants.get(kind) ?? new Set();\n }\n\n // === Hierarchy Methods ===\n\n /**\n * Checks if narrowerConcept is narrower than broaderConcept.\n */\n isNarrowerThan(narrowerConcept: string, broaderConcept: string): boolean {\n return isReachable(this.broaderClosure, narrowerConcept, broaderConcept);\n }\n\n /**\n * Checks if broaderConcept is broader than narrowerConcept.\n */\n isBroaderThan(broaderConcept: string, narrowerConcept: string): boolean {\n return isReachable(this.narrowerClosure, broaderConcept, narrowerConcept);\n }\n\n /**\n * Expands to include all narrower concepts.\n */\n expandNarrower(kind: string): readonly string[] {\n const narrower = this.narrowerClosure.get(kind) ?? new Set();\n return [kind, ...narrower];\n }\n\n /**\n * Expands to include all broader concepts.\n */\n expandBroader(kind: string): readonly string[] {\n const broader = this.broaderClosure.get(kind) ?? new Set();\n return [kind, ...broader];\n }\n\n // === Equivalence Methods ===\n\n /**\n * Checks if two kinds are equivalent.\n */\n areEquivalent(a: string, b: string): boolean {\n const equivalents = this.equivalenceSets.get(a);\n return equivalents?.has(b) ?? false;\n }\n\n /**\n * Gets all equivalents of a kind (including external IRIs).\n */\n getEquivalents(kind: string): readonly string[] {\n const equivalents = this.equivalenceSets.get(kind);\n return equivalents ? [...equivalents] : [];\n }\n\n /**\n * Resolves an external IRI to an internal kind name.\n */\n resolveIri(iri: string): string | undefined {\n return this.iriToKind.get(iri);\n }\n\n // === Constraint Methods ===\n\n /**\n * Checks if two kinds are disjoint.\n */\n areDisjoint(a: string, b: string): boolean {\n const normalizedPair = a < b ? `${a}|${b}` : `${b}|${a}`;\n return this.disjointPairs.has(normalizedPair);\n }\n\n /**\n * Gets all kinds that are disjoint with the given kind.\n */\n getDisjointKinds(kind: string): readonly string[] {\n const result: string[] = [];\n for (const pair of this.disjointPairs) {\n const parts = pair.split(\"|\");\n const a = parts[0]!;\n const b = parts[1]!;\n if (a === kind) result.push(b);\n else if (b === kind) result.push(a);\n }\n return result;\n }\n\n // === Composition Methods ===\n\n /**\n * Checks if part is part of whole (directly or transitively).\n */\n isPartOf(part: string, whole: string): boolean {\n return isReachable(this.partOfClosure, part, whole);\n }\n\n /**\n * Gets all wholes that contain this part.\n */\n getWholes(part: string): readonly string[] {\n const wholes = this.partOfClosure.get(part);\n return wholes ? [...wholes] : [];\n }\n\n /**\n * Gets all parts of this whole.\n */\n getParts(whole: string): readonly string[] {\n const parts = this.hasPartClosure.get(whole);\n return parts ? [...parts] : [];\n }\n\n // === Edge Relationship Methods ===\n\n /**\n * Gets the inverse edge kind for a given edge kind.\n * If edgeA inverseOf edgeB, then getInverseEdge(\"edgeA\") returns \"edgeB\".\n */\n getInverseEdge(edgeKind: string): string | undefined {\n return this.edgeInverses.get(edgeKind);\n }\n\n /**\n * Gets all edges implied by a given edge (transitively).\n * If A implies B and B implies C, then getImpliedEdges(\"A\") returns [\"B\", \"C\"].\n */\n getImpliedEdges(edgeKind: string): readonly string[] {\n const implied = this.edgeImplicationsClosure.get(edgeKind);\n return implied ? [...implied] : [];\n }\n\n /**\n * Gets all edges that imply a given edge (transitively).\n * If A implies B and B implies C, then getImplyingEdges(\"C\") returns [\"A\", \"B\"].\n * Used for query-time expansion: when querying for C, also include A and B edges.\n */\n getImplyingEdges(edgeKind: string): readonly string[] {\n const implying = this.edgeImplyingClosure.get(edgeKind);\n return implying ? [...implying] : [];\n }\n\n /**\n * Expands an edge kind to include all edges that imply it.\n * Returns [edgeKind, ...implyingEdges].\n */\n expandImplyingEdges(edgeKind: string): readonly string[] {\n const implying = this.edgeImplyingClosure.get(edgeKind) ?? new Set();\n return [edgeKind, ...implying];\n }\n\n // === Edge Endpoint Validation ===\n\n /**\n * Checks if a concrete kind is assignable to a target kind.\n * Uses subsumption: Company is assignable to Organization if Company subClassOf Organization.\n */\n isAssignableTo(concreteKind: string, targetKind: string): boolean {\n if (concreteKind === targetKind) return true;\n return this.isSubClassOf(concreteKind, targetKind);\n }\n\n /**\n * Validates that a kind exists in the registry.\n */\n hasNodeType(name: string): boolean {\n return this.nodeKinds.has(name);\n }\n\n /**\n * Validates that an edge kind exists in the registry.\n */\n hasEdgeType(name: string): boolean {\n return this.edgeKinds.has(name);\n }\n\n /**\n * Gets a node kind by name.\n */\n getNodeType(name: string): NodeType | undefined {\n return this.nodeKinds.get(name);\n }\n\n /**\n * Gets an edge kind by name.\n */\n getEdgeType(name: string): AnyEdgeType | undefined {\n return this.edgeKinds.get(name);\n }\n}\n\n/**\n * Builder function to create empty closures.\n */\nexport function createEmptyClosures(): {\n subClassAncestors: ReadonlyMap<string, ReadonlySet<string>>;\n subClassDescendants: ReadonlyMap<string, ReadonlySet<string>>;\n broaderClosure: ReadonlyMap<string, ReadonlySet<string>>;\n narrowerClosure: ReadonlyMap<string, ReadonlySet<string>>;\n equivalenceSets: ReadonlyMap<string, ReadonlySet<string>>;\n iriToKind: ReadonlyMap<string, string>;\n disjointPairs: ReadonlySet<string>;\n partOfClosure: ReadonlyMap<string, ReadonlySet<string>>;\n hasPartClosure: ReadonlyMap<string, ReadonlySet<string>>;\n edgeInverses: ReadonlyMap<string, string>;\n edgeImplicationsClosure: ReadonlyMap<string, ReadonlySet<string>>;\n edgeImplyingClosure: ReadonlyMap<string, ReadonlySet<string>>;\n} {\n return {\n subClassAncestors: new Map(),\n subClassDescendants: new Map(),\n broaderClosure: new Map(),\n narrowerClosure: new Map(),\n equivalenceSets: new Map(),\n iriToKind: new Map(),\n disjointPairs: new Set(),\n partOfClosure: new Map(),\n hasPartClosure: new Map(),\n edgeInverses: new Map(),\n edgeImplicationsClosure: new Map(),\n edgeImplyingClosure: new Map(),\n };\n}\n\n/**\n * Computes all closures from an ontology.\n */\nexport function computeClosuresFromOntology(\n ontology: readonly OntologyRelation[],\n): {\n subClassAncestors: ReadonlyMap<string, ReadonlySet<string>>;\n subClassDescendants: ReadonlyMap<string, ReadonlySet<string>>;\n broaderClosure: ReadonlyMap<string, ReadonlySet<string>>;\n narrowerClosure: ReadonlyMap<string, ReadonlySet<string>>;\n equivalenceSets: ReadonlyMap<string, ReadonlySet<string>>;\n iriToKind: ReadonlyMap<string, string>;\n disjointPairs: ReadonlySet<string>;\n partOfClosure: ReadonlyMap<string, ReadonlySet<string>>;\n hasPartClosure: ReadonlyMap<string, ReadonlySet<string>>;\n edgeInverses: ReadonlyMap<string, string>;\n edgeImplicationsClosure: ReadonlyMap<string, ReadonlySet<string>>;\n edgeImplyingClosure: ReadonlyMap<string, ReadonlySet<string>>;\n} {\n // Collect relations by type\n const subClassRelations: [string, string][] = [];\n const broaderRelations: [string, string][] = [];\n const equivalentRelations: [string, string][] = [];\n const disjointRelations: [string, string][] = [];\n const partOfRelations: [string, string][] = [];\n const inverseOfRelations: [string, string][] = [];\n const impliesRelations: [string, string][] = [];\n\n for (const relation of ontology) {\n const fromName = getKindName(relation.from);\n const toName = getKindName(relation.to);\n\n switch (relation.metaEdge.name) {\n case META_EDGE_SUB_CLASS_OF: {\n subClassRelations.push([fromName, toName]);\n break;\n }\n case META_EDGE_BROADER: {\n broaderRelations.push([fromName, toName]);\n break;\n }\n case META_EDGE_NARROWER: {\n // narrower is inverse of broader\n broaderRelations.push([toName, fromName]);\n break;\n }\n case META_EDGE_EQUIVALENT_TO:\n case META_EDGE_SAME_AS: {\n equivalentRelations.push([fromName, toName]);\n break;\n }\n case META_EDGE_DISJOINT_WITH: {\n disjointRelations.push([fromName, toName]);\n break;\n }\n case META_EDGE_PART_OF: {\n partOfRelations.push([fromName, toName]);\n break;\n }\n case META_EDGE_HAS_PART: {\n // hasPart is inverse of partOf\n partOfRelations.push([toName, fromName]);\n break;\n }\n case META_EDGE_INVERSE_OF: {\n // inverseOf is symmetric: if A inverseOf B, then B inverseOf A\n inverseOfRelations.push([fromName, toName]);\n break;\n }\n case META_EDGE_IMPLIES: {\n impliesRelations.push([fromName, toName]);\n break;\n }\n }\n }\n\n // Compute subClassOf closures\n const subClassAncestors = computeTransitiveClosure(subClassRelations);\n const subClassDescendants = invertClosure(subClassAncestors);\n\n // Compute broader/narrower closures\n const broaderClosure = computeTransitiveClosure(broaderRelations);\n const narrowerClosure = invertClosure(broaderClosure);\n\n // Compute equivalence sets and IRI mappings\n const equivalenceSets = computeEquivalenceSets(equivalentRelations);\n const iriToKind = computeIriMapping(equivalentRelations);\n\n // Compute disjoint pairs (normalize for symmetric lookup)\n const disjointPairs = computeDisjointPairs(disjointRelations);\n\n // Compute partOf closures\n const partOfClosure = computeTransitiveClosure(partOfRelations);\n const hasPartClosure = invertClosure(partOfClosure);\n\n // Compute edge inverses (symmetric: store both directions)\n const edgeInverses = computeEdgeInverses(inverseOfRelations);\n\n // Compute edge implications closure (transitive)\n // edgeImplicationsClosure: A -> [B, C] means A implies B and C\n // edgeImplyingClosure: C -> [A, B] means A and B imply C (inverse direction)\n const edgeImplicationsClosure = computeTransitiveClosure(impliesRelations);\n const edgeImplyingClosure = invertClosure(edgeImplicationsClosure);\n\n return {\n subClassAncestors,\n subClassDescendants,\n broaderClosure,\n narrowerClosure,\n equivalenceSets,\n iriToKind,\n disjointPairs,\n partOfClosure,\n hasPartClosure,\n edgeInverses,\n edgeImplicationsClosure,\n edgeImplyingClosure,\n };\n}\n\n/**\n * Gets the name from a NodeType, EdgeType, or string.\n */\nfunction getKindName(kindOrIri: NodeType | AnyEdgeType | string): string {\n if (typeof kindOrIri === \"string\") {\n return kindOrIri;\n }\n return kindOrIri.name;\n}\n\n/**\n * Checks if a string is an external IRI (not a local kind name).\n */\nfunction isExternalIri(value: string): boolean {\n return value.startsWith(\"http://\") || value.startsWith(\"https://\");\n}\n\n/**\n * Computes equivalence sets (symmetric + transitive closure).\n */\nfunction computeEquivalenceSets(\n relations: readonly (readonly [string, string])[],\n): ReadonlyMap<string, ReadonlySet<string>> {\n // Use union-find to compute equivalence classes\n const parent = new Map<string, string>();\n\n function find(x: string): string {\n if (!parent.has(x)) {\n parent.set(x, x);\n return x;\n }\n // Safe: has() check above guarantees key exists\n const p = parent.get(x)!;\n if (p === x) return x;\n const root = find(p);\n parent.set(x, root); // Path compression\n return root;\n }\n\n function union(a: string, b: string): void {\n const rootA = find(a);\n const rootB = find(b);\n if (rootA !== rootB) {\n parent.set(rootA, rootB);\n }\n }\n\n // Build equivalence classes\n for (const [a, b] of relations) {\n union(a, b);\n }\n\n // Collect all members of each equivalence class\n const classes = new Map<string, Set<string>>();\n for (const key of parent.keys()) {\n const root = find(key);\n const existing = classes.get(root) ?? new Set();\n existing.add(key);\n classes.set(root, existing);\n }\n\n // Build result: each node maps to its equivalence set\n const result = new Map<string, ReadonlySet<string>>();\n for (const members of classes.values()) {\n for (const member of members) {\n // Exclude self from equivalence set\n const others = new Set(members);\n others.delete(member);\n result.set(member, others);\n }\n }\n\n return result;\n}\n\n/**\n * Computes mapping from external IRIs to internal kind names.\n */\nfunction computeIriMapping(\n relations: readonly (readonly [string, string])[],\n): ReadonlyMap<string, string> {\n const result = new Map<string, string>();\n\n for (const [a, b] of relations) {\n // If one is an IRI and other is a kind name, map IRI → kind\n if (isExternalIri(a) && !isExternalIri(b)) {\n result.set(a, b);\n } else if (isExternalIri(b) && !isExternalIri(a)) {\n result.set(b, a);\n }\n }\n\n return result;\n}\n\n/**\n * Computes normalized disjoint pairs.\n */\nfunction computeDisjointPairs(\n relations: readonly (readonly [string, string])[],\n): ReadonlySet<string> {\n const result = new Set<string>();\n\n for (const [a, b] of relations) {\n // Normalize pair for consistent lookup\n const normalized = a < b ? `${a}|${b}` : `${b}|${a}`;\n result.add(normalized);\n }\n\n return result;\n}\n\n/**\n * Computes edge inverse mapping (symmetric: stores both directions).\n */\nfunction computeEdgeInverses(\n relations: readonly (readonly [string, string])[],\n): ReadonlyMap<string, string> {\n const result = new Map<string, string>();\n\n for (const [a, b] of relations) {\n // inverseOf is symmetric: A inverseOf B means B inverseOf A too\n result.set(a, b);\n result.set(b, a);\n }\n\n return result;\n}\n","/**\n * Builder functions for creating KindRegistry from GraphDef.\n */\nimport {\n getEdgeTypeNames,\n getNodeTypeNames,\n type GraphDef,\n} from \"../core/define-graph\";\nimport {\n type AnyEdgeType,\n type EdgeRegistration,\n type NodeRegistration,\n type NodeType,\n} from \"../core/types\";\nimport {\n computeClosuresFromOntology,\n createEmptyClosures,\n KindRegistry,\n} from \"./kind-registry\";\n\n// ============================================================\n// Build Registry from GraphDef\n// ============================================================\n\n/**\n * Builds a KindRegistry from a GraphDef.\n *\n * This precomputes all transitive closures for efficient runtime queries.\n *\n * @example\n * ```typescript\n * const graph = defineGraph({\n * id: \"my_graph\",\n * nodes: { Person: { type: Person }, Company: { type: Company } },\n * edges: { worksAt: { type: worksAt, from: [Person], to: [Company] } },\n * ontology: [subClassOf(Company, Organization)],\n * });\n *\n * const registry = buildKindRegistry(graph);\n * registry.isSubClassOf(\"Company\", \"Organization\"); // true\n * ```\n */\nexport function buildKindRegistry<G extends GraphDef>(graph: G): KindRegistry {\n // Extract node types\n const nodeTypes = extractNodeTypes(graph);\n\n // Extract edge types\n const edgeTypes = extractEdgeTypes(graph);\n\n // Compute closures from ontology\n const closures =\n graph.ontology.length > 0 ?\n computeClosuresFromOntology(graph.ontology)\n : createEmptyClosures();\n\n return new KindRegistry(nodeTypes, edgeTypes, closures);\n}\n\n// ============================================================\n// Node Kind Extraction\n// ============================================================\n\n/**\n * Extracts all node types from a GraphDef into a Map.\n */\nfunction extractNodeTypes<G extends GraphDef>(\n graph: G,\n): ReadonlyMap<string, NodeType> {\n const result = new Map<string, NodeType>();\n\n for (const typeName of getNodeTypeNames(graph)) {\n const registration = graph.nodes[typeName] as NodeRegistration;\n result.set(typeName, registration.type);\n }\n\n return result;\n}\n\n// ============================================================\n// Edge Type Extraction\n// ============================================================\n\n/**\n * Extracts all edge types from a GraphDef into a Map.\n */\nfunction extractEdgeTypes<G extends GraphDef>(\n graph: G,\n): ReadonlyMap<string, AnyEdgeType> {\n const result = new Map<string, AnyEdgeType>();\n\n for (const typeName of getEdgeTypeNames(graph)) {\n const registration = graph.edges[typeName] as EdgeRegistration;\n result.set(typeName, registration.type);\n }\n\n return result;\n}\n","/**\n * Predicate Expression Compilation\n *\n * Compiles predicate AST nodes to SQL using dialect adapters.\n * Handles comparisons, string operations, null checks, array/object predicates,\n * and subqueries.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { UnsupportedPredicateError } from \"../../errors\";\nimport {\n type ArrayPredicate,\n type ExistsSubquery,\n type FieldRef,\n type InSubquery,\n type LiteralValue,\n type ObjectPredicate,\n type PredicateExpression,\n type ValueType,\n type VectorSimilarityPredicate,\n} from \"../ast\";\nimport { type DialectAdapter } from \"../dialect\";\nimport {\n joinJsonPointers,\n type JsonPointer,\n jsonPointer,\n} from \"../json-pointer\";\nimport { type SqlSchema } from \"./schema\";\n\n// ============================================================\n// Field Reference Compilation\n// ============================================================\n\n/**\n * Compiles a field reference to a base column name.\n *\n * @param field - The field reference to compile\n * @param cteAlias - Optional CTE alias for main query context (e.g., \"cte_p\")\n * @param cteColumnPrefix - Optional prefix for CTE WHERE context:\n * - undefined: Use aliased column names (e.g., \"p_props\")\n * - \"\": Use raw column names (e.g., \"props\") for start CTE\n * - \"n\": Use table-qualified names (e.g., \"n.props\") for traversal CTE\n */\nexport function compileFieldColumn(\n field: FieldRef,\n cteAlias?: string,\n cteColumnPrefix?: string,\n): SQL {\n // When cteColumnPrefix is defined (including empty string), use raw column names\n // This is for CTE WHERE clauses which operate on raw table columns\n if (cteColumnPrefix !== undefined) {\n const qualifier = cteColumnPrefix === \"\" ? \"\" : `${cteColumnPrefix}.`;\n\n if (field.path.length === 1 && field.path[0] === \"id\") {\n return sql.raw(`${qualifier}id`);\n }\n if (field.path.length === 1 && field.path[0] === \"kind\") {\n return sql.raw(`${qualifier}kind`);\n }\n if (field.path.length > 0 && field.path[0] === \"props\") {\n return sql.raw(`${qualifier}props`);\n }\n\n return sql.raw(`${qualifier}${field.path.join(\"_\")}`);\n }\n\n // Default behavior: use aliased column names (e.g., \"p_props\")\n const prefix = field.alias;\n const qualifier = cteAlias ? `${cteAlias}.` : \"\";\n\n if (field.path.length === 1 && field.path[0] === \"id\") {\n return sql.raw(`${qualifier}${prefix}_id`);\n }\n if (field.path.length === 1 && field.path[0] === \"kind\") {\n return sql.raw(`${qualifier}${prefix}_kind`);\n }\n if (field.path.length > 0 && field.path[0] === \"props\") {\n return sql.raw(`${qualifier}${prefix}_props`);\n }\n\n return sql.raw(`${qualifier}${prefix}_${field.path.join(\"_\")}`);\n}\n\n/**\n * Gets the JSON pointer for a field reference.\n */\nfunction getFieldPointer(field: FieldRef): JsonPointer | undefined {\n if (field.jsonPointer !== undefined) {\n return field.jsonPointer;\n }\n\n if (field.path.length > 1 && field.path[0] === \"props\") {\n return jsonPointer(field.path.slice(1));\n }\n\n return undefined;\n}\n\n/**\n * Checks if a field reference points to a JSON props column.\n */\nfunction isJsonField(field: FieldRef): boolean {\n return field.path.length > 0 && field.path[0] === \"props\";\n}\n\n/**\n * Normalizes a value type, treating \"unknown\" as undefined.\n */\nfunction normalizeValueType(\n valueType: ValueType | undefined,\n): ValueType | undefined {\n if (!valueType || valueType === \"unknown\") {\n return undefined;\n }\n return valueType;\n}\n\n/**\n * Compiles a field reference to SQL with appropriate type extraction.\n */\nexport function compileFieldValue(\n field: FieldRef,\n dialect: DialectAdapter,\n valueType?: ValueType,\n cteAlias?: string,\n pointerOverride?: JsonPointer,\n cteColumnPrefix?: string,\n): SQL {\n const resolved = normalizeValueType(valueType);\n const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);\n\n if (!isJsonField(field)) {\n return column;\n }\n\n const pointer = pointerOverride ?? getFieldPointer(field);\n if (!pointer || pointer === \"\") {\n return column;\n }\n\n switch (resolved) {\n case \"number\": {\n return dialect.jsonExtractNumber(column, pointer);\n }\n case \"boolean\": {\n return dialect.jsonExtractBoolean(column, pointer);\n }\n case \"date\": {\n return dialect.jsonExtractDate(column, pointer);\n }\n case \"array\":\n case \"object\":\n case \"embedding\": {\n // Embeddings are stored in a separate table, but if we need to\n // extract from JSON, treat like a regular JSON value\n return dialect.jsonExtract(column, pointer);\n }\n case \"string\":\n case \"unknown\":\n case undefined: {\n return dialect.jsonExtractText(column, pointer);\n }\n }\n}\n\n/**\n * Compiles a field reference for text comparison.\n */\nfunction compileFieldTextValue(\n field: FieldRef,\n dialect: DialectAdapter,\n cteAlias?: string,\n pointerOverride?: JsonPointer,\n cteColumnPrefix?: string,\n): SQL {\n const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);\n if (!isJsonField(field)) {\n return column;\n }\n\n const pointer = pointerOverride ?? getFieldPointer(field);\n if (!pointer || pointer === \"\") {\n return column;\n }\n\n return dialect.jsonExtractText(column, pointer);\n}\n\n/**\n * Compiles a field reference for JSON value extraction.\n */\nfunction compileFieldJsonValue(\n field: FieldRef,\n dialect: DialectAdapter,\n cteAlias?: string,\n pointerOverride?: JsonPointer,\n cteColumnPrefix?: string,\n): SQL {\n const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);\n if (!isJsonField(field)) {\n return column;\n }\n\n const pointer = pointerOverride ?? getFieldPointer(field);\n if (!pointer || pointer === \"\") {\n return column;\n }\n\n return dialect.jsonExtract(column, pointer);\n}\n\n// ============================================================\n// Value Type Resolution\n// ============================================================\n\n/**\n * Resolves literal value types from an array of literals.\n */\nfunction resolveLiteralValueTypes(\n literals: readonly LiteralValue[],\n): ValueType | undefined {\n const resolved = new Set<ValueType>();\n\n for (const literal of literals) {\n const valueType = normalizeValueType(literal.valueType);\n if (valueType) {\n resolved.add(valueType);\n }\n }\n\n if (resolved.size > 1) {\n throw new UnsupportedPredicateError(\n \"Mixed literal value types are not supported in predicates\",\n { valueTypes: [...resolved] },\n );\n }\n\n return resolved.values().next().value;\n}\n\n/**\n * Resolves the value type for a comparison predicate.\n */\nfunction resolveComparisonValueType(\n field: FieldRef,\n right: LiteralValue | readonly LiteralValue[],\n): ValueType | undefined {\n const literals = Array.isArray(right) ? right : [right];\n const literalType = resolveLiteralValueTypes(literals);\n const fieldType = normalizeValueType(field.valueType);\n\n // Date fields compared with string literals should use date type\n if (fieldType === \"date\" && literalType === \"string\") {\n return fieldType;\n }\n\n if (literalType) {\n return literalType;\n }\n\n return fieldType;\n}\n\n/**\n * Resolves value type with preference for explicit type.\n */\nfunction resolvePredicateValueType(\n preferred: ValueType | undefined,\n literal: LiteralValue | undefined,\n): ValueType | undefined {\n const normalizedPreferred = normalizeValueType(preferred);\n if (normalizedPreferred) {\n return normalizedPreferred;\n }\n\n return literal ? normalizeValueType(literal.valueType) : undefined;\n}\n\n// ============================================================\n// Value Conversion\n// ============================================================\n\n/**\n * Converts a literal value for SQL binding.\n * Delegates to dialect adapter for proper type conversion (e.g., boolean → 0/1 for SQLite).\n */\nfunction convertValueForSql(value: unknown, dialect: DialectAdapter): unknown {\n return dialect.bindValue(value);\n}\n\n// ============================================================\n// String Pattern Compilation\n// ============================================================\n\n/**\n * Compiles a string pattern for LIKE operations.\n */\nfunction compileStringPattern(op: string, pattern: string): string {\n const escaped = pattern\n .replaceAll(\"%\", String.raw`\\%`)\n .replaceAll(\"_\", String.raw`\\_`);\n\n switch (op) {\n case \"contains\": {\n return `%${escaped}%`;\n }\n case \"startsWith\": {\n return `${escaped}%`;\n }\n case \"endsWith\": {\n return `%${escaped}`;\n }\n case \"like\":\n case \"ilike\": {\n return pattern;\n }\n default: {\n return escaped;\n }\n }\n}\n\n// ============================================================\n// Predicate Compilation\n// ============================================================\n\n/**\n * Compiler context passed to recursive compilation functions.\n *\n * When compiling predicates inside CTE WHERE clauses, `cteColumnPrefix` specifies\n * how to reference columns:\n * - undefined: Use aliased column names (e.g., \"p_props\") - for main query context\n * - \"\": Use raw column names (e.g., \"props\") - for start CTE WHERE clause\n * - \"n\": Use table-qualified names (e.g., \"n.props\") - for traversal CTE WHERE clause\n */\nexport type PredicateCompilerContext = Readonly<{\n dialect: DialectAdapter;\n schema: SqlSchema;\n compileQuery: (ast: unknown, graphId: string) => SQL;\n cteColumnPrefix?: string;\n}>;\n\n/**\n * Compiles a predicate expression to SQL.\n */\nexport function compilePredicateExpression(\n expr: PredicateExpression,\n ctx: PredicateCompilerContext,\n): SQL {\n const { dialect } = ctx;\n\n const cteColumnPrefix = ctx.cteColumnPrefix;\n\n switch (expr.__type) {\n case \"comparison\": {\n return compileComparisonPredicate(expr, dialect, cteColumnPrefix);\n }\n\n case \"string_op\": {\n const field = compileFieldTextValue(\n expr.field,\n dialect,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n const pattern = compileStringPattern(expr.op, expr.pattern);\n // Use case-insensitive matching for contains, startsWith, endsWith, and ilike\n // This ensures consistent behavior across PostgreSQL (case-sensitive LIKE)\n // and SQLite (case-insensitive LIKE for ASCII)\n if (\n expr.op === \"ilike\" ||\n expr.op === \"contains\" ||\n expr.op === \"startsWith\" ||\n expr.op === \"endsWith\"\n ) {\n return dialect.ilike(field, pattern);\n }\n // Use case-sensitive LIKE only for explicit 'like' operator\n return sql`${field} LIKE ${pattern}`;\n }\n\n case \"null_check\": {\n const field = compileFieldTextValue(\n expr.field,\n dialect,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n return expr.op === \"isNull\" ?\n sql`${field} IS NULL`\n : sql`${field} IS NOT NULL`;\n }\n\n case \"between\": {\n const valueType = resolveComparisonValueType(expr.field, [\n expr.lower,\n expr.upper,\n ]);\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"Between comparisons are not supported for JSON arrays or objects\",\n );\n }\n const field = compileFieldValue(\n expr.field,\n dialect,\n valueType,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n const lower = convertValueForSql(expr.lower.value, dialect);\n const upper = convertValueForSql(expr.upper.value, dialect);\n return sql`${field} BETWEEN ${lower} AND ${upper}`;\n }\n\n case \"and\": {\n const parts = expr.predicates.map((p) =>\n compilePredicateExpression(p, ctx),\n );\n return sql`(${sql.join(parts, sql` AND `)})`;\n }\n\n case \"or\": {\n const parts = expr.predicates.map((p) =>\n compilePredicateExpression(p, ctx),\n );\n return sql`(${sql.join(parts, sql` OR `)})`;\n }\n\n case \"not\": {\n const inner = compilePredicateExpression(expr.predicate, ctx);\n return sql`NOT (${inner})`;\n }\n\n case \"array_op\": {\n return compileArrayPredicate(expr, dialect, cteColumnPrefix);\n }\n\n case \"object_op\": {\n return compileObjectPredicate(expr, dialect, cteColumnPrefix);\n }\n\n case \"aggregate_comparison\": {\n return compileAggregatePredicate(expr, dialect);\n }\n\n case \"exists\": {\n return compileExistsSubquery(expr, ctx);\n }\n\n case \"in_subquery\": {\n return compileInSubquery(expr, ctx);\n }\n\n case \"vector_similarity\": {\n return compileVectorSimilarityPredicate(expr, ctx);\n }\n }\n}\n\n/**\n * Compiles a comparison predicate.\n */\nfunction compileComparisonPredicate(\n expr: {\n __type: \"comparison\";\n op: string;\n left: FieldRef;\n right: LiteralValue | readonly LiteralValue[];\n },\n dialect: DialectAdapter,\n cteColumnPrefix?: string,\n): SQL {\n const valueType = resolveComparisonValueType(expr.left, expr.right);\n\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n `Comparison operation \"${expr.op}\" is not supported for ${valueType} values`,\n );\n }\n\n const left = compileFieldValue(\n expr.left,\n dialect,\n valueType,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n\n if (expr.op === \"in\" || expr.op === \"notIn\") {\n const values: readonly LiteralValue[] =\n Array.isArray(expr.right) ? expr.right : [expr.right];\n if (values.length === 0) {\n return expr.op === \"in\" ? sql.raw(\"1=0\") : sql.raw(\"1=1\");\n }\n const placeholders = values.map(\n (v) => sql`${convertValueForSql(v.value, dialect)}`,\n );\n const op = expr.op === \"in\" ? sql.raw(\"IN\") : sql.raw(\"NOT IN\");\n return sql`${left} ${op} (${sql.join(placeholders, sql`, `)})`;\n }\n\n // For single-value comparisons, extract the literal value\n const right = expr.right;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment -- Type narrowing with Array.isArray\n const rightValue: LiteralValue = Array.isArray(right) ? right[0]! : right;\n\n const opMap: Record<string, string> = {\n eq: \"=\",\n neq: \"!=\",\n gt: \">\",\n gte: \">=\",\n lt: \"<\",\n lte: \"<=\",\n };\n\n const convertedRight = convertValueForSql(rightValue.value, dialect);\n return sql`${left} ${sql.raw(opMap[expr.op]!)} ${convertedRight}`;\n}\n\n/**\n * Compiles an array predicate.\n */\nfunction compileArrayPredicate(\n expr: ArrayPredicate,\n dialect: DialectAdapter,\n cteColumnPrefix?: string,\n): SQL {\n const field = compileFieldJsonValue(\n expr.field,\n dialect,\n undefined,\n undefined,\n cteColumnPrefix,\n );\n const values =\n expr.values?.map((v) => convertValueForSql(v.value, dialect)) ?? [];\n\n switch (expr.op) {\n case \"isEmpty\": {\n return sql`(${field} IS NULL OR ${dialect.jsonArrayLength(field)} = 0)`;\n }\n case \"isNotEmpty\": {\n return sql`(${field} IS NOT NULL AND ${dialect.jsonArrayLength(field)} > 0)`;\n }\n case \"lengthEq\": {\n return sql`${dialect.jsonArrayLength(field)} = ${expr.length}`;\n }\n case \"lengthGt\": {\n return sql`${dialect.jsonArrayLength(field)} > ${expr.length}`;\n }\n case \"lengthGte\": {\n return sql`${dialect.jsonArrayLength(field)} >= ${expr.length}`;\n }\n case \"lengthLt\": {\n return sql`${dialect.jsonArrayLength(field)} < ${expr.length}`;\n }\n case \"lengthLte\": {\n return sql`${dialect.jsonArrayLength(field)} <= ${expr.length}`;\n }\n case \"contains\": {\n const value = values[0];\n if (value === undefined) {\n return sql.raw(\"1=0\");\n }\n return dialect.jsonArrayContains(field, value);\n }\n case \"containsAll\": {\n return dialect.jsonArrayContainsAll(field, values);\n }\n case \"containsAny\": {\n return dialect.jsonArrayContainsAny(field, values);\n }\n }\n}\n\n/**\n * Compiles an object/JSON predicate.\n */\nfunction compileObjectPredicate(\n expr: ObjectPredicate,\n dialect: DialectAdapter,\n cteColumnPrefix?: string,\n): SQL {\n const basePointer = getFieldPointer(expr.field);\n const pointer = joinJsonPointers(basePointer, expr.pointer);\n const column = compileFieldColumn(expr.field, undefined, cteColumnPrefix);\n\n switch (expr.op) {\n case \"hasKey\":\n case \"hasPath\": {\n return dialect.jsonHasPath(column, pointer);\n }\n\n case \"pathEquals\": {\n if (!expr.value) {\n throw new UnsupportedPredicateError(\n \"pathEquals requires a comparison value\",\n );\n }\n const valueType = resolvePredicateValueType(expr.valueType, expr.value);\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"pathEquals is not supported for JSON arrays or objects\",\n );\n }\n const left = compileFieldValue(\n expr.field,\n dialect,\n valueType,\n undefined,\n pointer,\n cteColumnPrefix,\n );\n return sql`${left} = ${convertValueForSql(expr.value.value, dialect)}`;\n }\n\n case \"pathContains\": {\n if (!expr.value) {\n throw new UnsupportedPredicateError(\n \"pathContains requires a comparison value\",\n );\n }\n const arrayField = compileFieldJsonValue(\n expr.field,\n dialect,\n undefined,\n pointer,\n cteColumnPrefix,\n );\n return dialect.jsonArrayContains(\n arrayField,\n convertValueForSql(expr.value.value, dialect),\n );\n }\n\n case \"pathIsNull\": {\n return dialect.jsonPathIsNull(column, pointer);\n }\n\n case \"pathIsNotNull\": {\n return dialect.jsonPathIsNotNull(column, pointer);\n }\n }\n}\n\n/**\n * AggregateExpr structure from AST.\n */\ntype AggregateExprInput = Readonly<{\n __type: \"aggregate\";\n function: string;\n field: FieldRef;\n}>;\n\n/**\n * Compiles an aggregate comparison predicate.\n */\nfunction compileAggregatePredicate(\n expr: {\n __type: \"aggregate_comparison\";\n op: string;\n aggregate: AggregateExprInput;\n value: LiteralValue;\n },\n dialect: DialectAdapter,\n): SQL {\n const aggregate = compileAggregateExpr(expr.aggregate, dialect);\n\n const opMap: Record<string, string> = {\n eq: \"=\",\n neq: \"!=\",\n gt: \">\",\n gte: \">=\",\n lt: \"<\",\n lte: \"<=\",\n };\n\n const op = opMap[expr.op];\n if (!op) {\n throw new UnsupportedPredicateError(\n `Comparison operation \"${expr.op}\" is not supported for aggregate predicates`,\n );\n }\n\n const convertedValue = convertValueForSql(expr.value.value, dialect);\n return sql`${aggregate} ${sql.raw(op)} ${convertedValue}`;\n}\n\n/**\n * Compiles an aggregate expression.\n */\nfunction compileAggregateExpr(\n expr: AggregateExprInput,\n dialect: DialectAdapter,\n): SQL {\n const cteAlias = `cte_${expr.field.alias}`;\n const field = compileFieldValue(\n expr.field,\n dialect,\n expr.field.valueType,\n cteAlias,\n );\n\n switch (expr.function) {\n case \"count\": {\n return sql`COUNT(${field})`;\n }\n case \"countDistinct\": {\n return sql`COUNT(DISTINCT ${field})`;\n }\n case \"sum\": {\n return sql`SUM(${field})`;\n }\n case \"avg\": {\n return sql`AVG(${field})`;\n }\n case \"min\": {\n return sql`MIN(${field})`;\n }\n case \"max\": {\n return sql`MAX(${field})`;\n }\n default: {\n throw new UnsupportedPredicateError(\n `Unknown aggregate function: ${expr.function}`,\n );\n }\n }\n}\n\n/**\n * Compiles an EXISTS subquery predicate.\n */\nfunction compileExistsSubquery(\n expr: ExistsSubquery,\n ctx: PredicateCompilerContext,\n): SQL {\n const graphId = expr.subquery.graphId ?? \"\";\n const subSql = ctx.compileQuery(expr.subquery, graphId);\n return expr.negated ? sql`NOT EXISTS (${subSql})` : sql`EXISTS (${subSql})`;\n}\n\n/**\n * Compiles an IN subquery predicate.\n */\nfunction compileInSubquery(\n expr: InSubquery,\n ctx: PredicateCompilerContext,\n): SQL {\n const graphId = expr.subquery.graphId ?? \"\";\n const fieldSql = compileFieldTextValue(\n expr.field,\n ctx.dialect,\n undefined,\n undefined,\n ctx.cteColumnPrefix,\n );\n const subSql = ctx.compileQuery(expr.subquery, graphId);\n return expr.negated ?\n sql`${fieldSql} NOT IN (${subSql})`\n : sql`${fieldSql} IN (${subSql})`;\n}\n\n/**\n * Compiles a vector similarity predicate.\n *\n * Vector similarity predicates require special handling at the query compilation\n * level to handle:\n * - JOIN to embeddings table\n * - ORDER BY distance ASC\n * - LIMIT k\n *\n * This function handles the minScore filter if present. The main query compiler\n * must detect vector_similarity predicates and set up the appropriate JOINs\n * and ordering.\n */\nfunction compileVectorSimilarityPredicate(\n _expr: VectorSimilarityPredicate,\n _ctx: PredicateCompilerContext,\n): SQL {\n // Vector similarity predicates affect query structure (JOINs, ORDER BY, LIMIT).\n // The main query compiler detects these predicates and handles:\n // - Creating a cte_embeddings CTE with the embeddings table\n // - Computing distance using dialect.vectorDistance()\n // - Applying minScore filter inside cte_embeddings (if specified)\n // - Ordering by distance ascending\n // - Limiting to expr.limit results\n //\n // The minScore filtering is handled in compileVectorSimilarityCte(), not here.\n // This predicate compilation is called for the nodes CTE, which doesn't have\n // an embedding column. Return a no-op condition (1=1).\n //\n // NOTE: The minScore filter is intentionally NOT applied here because:\n // 1. The nodes table doesn't have an embedding column\n // 2. The filtering is already done in the cte_embeddings CTE\n // 3. Applying it here would generate invalid SQL (referencing non-existent column)\n\n // Return a SQL \"true\" condition (1=1).\n //\n // This is intentional: vector similarity predicates affect query structure\n // (JOINs to embeddings table, ORDER BY distance, LIMIT k) which are handled\n // by the main query compiler in compileStandardQuery(). The predicate\n // compilation here only handles the optional WHERE clause filtering.\n //\n // When minScore is not specified, we still need to return valid SQL that\n // integrates with other predicates via AND. The \"1=1\" idiom is a standard\n // SQL no-op that:\n // - Always evaluates to true\n // - Has zero performance impact (optimized away by query planners)\n // - Composes correctly: \"WHERE other_condition AND 1=1\" = \"WHERE other_condition\"\n //\n // The actual similarity search behavior (k nearest neighbors) is enforced\n // by the JOIN and ORDER BY clauses added in compileEmbeddingsCte() and\n // compileVectorOrderBy().\n return sql.raw(\"1=1\");\n}\n\n// ============================================================\n// Vector Similarity Helpers\n// ============================================================\n\n/**\n * Extracts all vector similarity predicates from a query's predicates.\n * Used by the main query compiler to set up JOINs, ORDER BY, and LIMIT.\n */\nexport function extractVectorSimilarityPredicates(\n predicates: readonly { expression: PredicateExpression }[],\n): VectorSimilarityPredicate[] {\n const results: VectorSimilarityPredicate[] = [];\n\n function visit(expr: PredicateExpression): void {\n switch (expr.__type) {\n case \"vector_similarity\": {\n results.push(expr);\n break;\n }\n case \"and\":\n case \"or\": {\n for (const p of expr.predicates) {\n visit(p);\n }\n break;\n }\n case \"not\": {\n visit(expr.predicate);\n break;\n }\n case \"comparison\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"exists\":\n case \"in_subquery\": {\n // These predicate types don't contain nested vector_similarity\n break;\n }\n }\n }\n\n for (const pred of predicates) {\n visit(pred.expression);\n }\n\n return results;\n}\n\n// ============================================================\n// Exports for aggregate compilation\n// ============================================================\n\nexport { compileAggregateExpr };\n","/**\n * SQL Schema Configuration for Query Compilation\n *\n * Provides table and column identifiers that the query compiler uses.\n * This allows the compiler to work with custom table names instead of\n * hard-coded defaults.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\n/**\n * Table names for TypeGraph SQL schema.\n */\nexport type SqlTableNames = Readonly<{\n /** Nodes table name (default: \"typegraph_nodes\") */\n nodes: string;\n /** Edges table name (default: \"typegraph_edges\") */\n edges: string;\n /** Node embeddings table name (default: \"typegraph_node_embeddings\") */\n embeddings: string;\n}>;\n\n/**\n * SQL schema configuration for query compilation.\n * Contains table identifiers and utility methods for generating SQL references.\n */\nexport type SqlSchema = Readonly<{\n /** Table names */\n tables: SqlTableNames;\n /** Get a SQL reference to the nodes table */\n nodesTable: SQL;\n /** Get a SQL reference to the edges table */\n edgesTable: SQL;\n /** Get a SQL reference to the embeddings table */\n embeddingsTable: SQL;\n}>;\n\n/**\n * Default table names matching the standard TypeGraph schema.\n */\nconst DEFAULT_TABLE_NAMES: SqlTableNames = {\n nodes: \"typegraph_nodes\",\n edges: \"typegraph_edges\",\n embeddings: \"typegraph_node_embeddings\",\n};\n\n/**\n * Maximum identifier length.\n * PostgreSQL uses NAMEDATALEN (64) - 1 = 63 as the max identifier length.\n * SQLite has no practical limit but we use PostgreSQL's for cross-database safety.\n */\nconst MAX_IDENTIFIER_LENGTH = 63;\n\n/**\n * Regex for valid SQL identifiers.\n * Must start with a letter or underscore.\n * Can contain letters, digits, underscores, and dollar signs.\n * Dollar signs are a PostgreSQL extension but commonly supported.\n */\nconst VALID_IDENTIFIER_PATTERN = /^[a-z_][a-z0-9_$]*$/i;\n\n/**\n * Validates that a table name is a valid SQL identifier.\n *\n * @throws Error if the table name is invalid\n */\nfunction validateTableName(name: string, label: string): void {\n if (!name || name.length === 0) {\n throw new Error(`${label} table name cannot be empty`);\n }\n if (name.length > MAX_IDENTIFIER_LENGTH) {\n throw new Error(\n `${label} table name exceeds maximum length of ${MAX_IDENTIFIER_LENGTH} characters`,\n );\n }\n if (!VALID_IDENTIFIER_PATTERN.test(name)) {\n throw new Error(\n `${label} table name \"${name}\" is not a valid SQL identifier. ` +\n `Table names must start with a letter or underscore and contain only letters, digits, underscores, or dollar signs.`,\n );\n }\n}\n\n/**\n * Quotes a SQL identifier using ANSI SQL standard double quotes.\n * Escapes any embedded double quotes by doubling them.\n *\n * This works for both SQLite and PostgreSQL.\n */\nfunction quoteIdentifier(name: string): string {\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n}\n\n/**\n * Creates a SqlSchema configuration from table names.\n *\n * Table names are validated to ensure they are valid SQL identifiers.\n * This prevents SQL injection and ensures compatibility across databases.\n *\n * @param names - Optional custom table names (defaults to standard names)\n * @returns SqlSchema configuration for query compilation\n * @throws Error if any table name is invalid\n *\n * @example\n * ```typescript\n * // Use default table names\n * const schema = createSqlSchema();\n *\n * // Use custom table names\n * const schema = createSqlSchema({\n * nodes: \"myapp_nodes\",\n * edges: \"myapp_edges\",\n * embeddings: \"myapp_embeddings\",\n * });\n * ```\n */\nexport function createSqlSchema(names: Partial<SqlTableNames> = {}): SqlSchema {\n const tables: SqlTableNames = { ...DEFAULT_TABLE_NAMES, ...names };\n\n // Validate all table names\n validateTableName(tables.nodes, \"nodes\");\n validateTableName(tables.edges, \"edges\");\n validateTableName(tables.embeddings, \"embeddings\");\n\n return {\n tables,\n nodesTable: sql.raw(quoteIdentifier(tables.nodes)),\n edgesTable: sql.raw(quoteIdentifier(tables.edges)),\n embeddingsTable: sql.raw(quoteIdentifier(tables.embeddings)),\n };\n}\n\n/**\n * Default SqlSchema using standard TypeGraph table names.\n */\nexport const DEFAULT_SQL_SCHEMA: SqlSchema = createSqlSchema();\n","/**\n * Temporal Filter Compilation\n *\n * Generates SQL clauses for temporal filtering based on valid_from/valid_to\n * and deleted_at timestamps. Consolidates the previously duplicated temporal\n * filter functions into a single, parameterized implementation.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { type TemporalMode } from \"../../core/types\";\n\n/**\n * Temporal filter options.\n */\nexport type TemporalFilterOptions = Readonly<{\n /** The temporal mode to apply */\n mode: TemporalMode;\n /** Timestamp for asOf queries (required when mode is \"asOf\") */\n asOf?: string | undefined;\n /** Optional table alias prefix for column references */\n tableAlias?: string | undefined;\n}>;\n\n/**\n * Compiles a temporal filter to SQL.\n *\n * This is the unified temporal filter function that handles all temporal modes\n * and optional table alias prefixes. It replaces the previous three separate\n * functions (compileTemporalFilter, compileEdgeTemporalFilter, compileNodeTemporalFilter).\n *\n * @param options - Temporal filter configuration\n * @returns SQL clause for the temporal filter\n *\n * @example\n * ```typescript\n * // Without table alias (for CTEs)\n * compileTemporalFilter({ mode: \"current\" })\n * // → deleted_at IS NULL AND (valid_from IS NULL OR ...) AND ...\n *\n * // With table alias (for JOINs)\n * compileTemporalFilter({ mode: \"current\", tableAlias: \"e\" })\n * // → e.deleted_at IS NULL AND (e.valid_from IS NULL OR ...) AND ...\n *\n * // AsOf mode\n * compileTemporalFilter({ mode: \"asOf\", asOf: \"2024-01-01T00:00:00Z\" })\n * // → deleted_at IS NULL AND (valid_from IS NULL OR valid_from <= '2024-01-01...') AND ...\n * ```\n */\nexport function compileTemporalFilter(options: TemporalFilterOptions): SQL {\n const { mode, asOf, tableAlias } = options;\n\n // Build column references with optional prefix\n const prefix = tableAlias ? sql.raw(`${tableAlias}.`) : sql.raw(\"\");\n const deletedAt = sql`${prefix}deleted_at`;\n const validFrom = sql`${prefix}valid_from`;\n const validTo = sql`${prefix}valid_to`;\n\n switch (mode) {\n case \"current\": {\n const now = new Date().toISOString();\n return sql`${deletedAt} IS NULL AND (${validFrom} IS NULL OR ${validFrom} <= ${now}) AND (${validTo} IS NULL OR ${validTo} > ${now})`;\n }\n\n case \"asOf\": {\n // asOf is guaranteed to be defined - validated in QueryBuilder.temporal()\n const timestamp = asOf!;\n return sql`${deletedAt} IS NULL AND (${validFrom} IS NULL OR ${validFrom} <= ${timestamp}) AND (${validTo} IS NULL OR ${validTo} > ${timestamp})`;\n }\n\n case \"includeEnded\": {\n // Include records that have ended but not been deleted\n return sql`${deletedAt} IS NULL`;\n }\n\n case \"includeTombstones\": {\n // Include everything, no filter\n return sql.raw(\"1=1\");\n }\n }\n}\n\n/**\n * Extracts temporal options from a query AST.\n *\n * @param ast - Query AST with temporalMode\n * @param tableAlias - Optional table alias for column references\n * @returns TemporalFilterOptions for use with compileTemporalFilter\n */\nexport function extractTemporalOptions(\n ast: { temporalMode: { mode: TemporalMode; asOf?: string } },\n tableAlias?: string,\n): TemporalFilterOptions {\n return {\n mode: ast.temporalMode.mode,\n asOf: ast.temporalMode.asOf,\n tableAlias,\n };\n}\n","/**\n * Recursive CTE Compilation\n *\n * Compiles variable-length path traversals using WITH RECURSIVE.\n * Handles cycle detection and depth limiting using dialect-specific operations.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { UnsupportedPredicateError } from \"../../errors\";\nimport { type QueryAst, type Traversal, type VariableLengthSpec } from \"../ast\";\nimport { type DialectAdapter } from \"../dialect\";\nimport {\n compileFieldValue,\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"./predicates\";\nimport { compileTemporalFilter, extractTemporalOptions } from \"./temporal\";\n\n// ============================================================\n// Constants\n// ============================================================\n\n/**\n * Maximum depth for recursive CTE queries.\n *\n * This limit prevents runaway recursion in variable-length path queries.\n * Even when a user specifies \"unlimited\" depth (-1), this limit is enforced.\n * The limit of 100 is sufficient for most graph traversal use cases while\n * preventing database resource exhaustion.\n */\nexport const MAX_RECURSIVE_DEPTH = 100;\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Traversal with required variable-length spec.\n */\ntype VariableLengthTraversal = Traversal & {\n variableLength: VariableLengthSpec;\n};\n\n// ============================================================\n// Main Compiler\n// ============================================================\n\n/**\n * Compiles a variable-length query using recursive CTEs.\n *\n * @param ast - The query AST\n * @param graphId - The graph ID\n * @param ctx - Predicate compiler context\n * @returns SQL for the recursive query\n */\nexport function compileVariableLengthQuery(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const { dialect } = ctx;\n\n // Find the variable-length traversal\n const vlTraversal = ast.traversals.find(\n (t): t is VariableLengthTraversal => t.variableLength !== undefined,\n );\n\n if (!vlTraversal) {\n throw new Error(\"No variable-length traversal found\");\n }\n\n // Currently we only support a single variable-length traversal\n if (ast.traversals.length > 1) {\n throw new UnsupportedPredicateError(\n \"Variable-length traversals with multiple traversals are not yet supported. \" +\n \"Please use a single variable-length traversal.\",\n );\n }\n\n // Build the recursive CTE\n const recursiveCte = compileRecursiveCte(ast, vlTraversal, graphId, ctx);\n\n // Build projection\n const projection = compileRecursiveProjection(ast, vlTraversal);\n\n // Build final SELECT\n const minDepth = vlTraversal.variableLength.minDepth;\n const depthFilter =\n minDepth > 0 ? sql`WHERE depth >= ${minDepth}` : sql.raw(\"\");\n\n // Order by and limit/offset\n const orderBy = compileRecursiveOrderBy(ast, dialect);\n const limitOffset = compileLimitOffset(ast);\n\n const parts: SQL[] = [\n sql`WITH RECURSIVE`,\n recursiveCte,\n sql`SELECT ${projection}`,\n sql`FROM recursive_cte`,\n depthFilter,\n ];\n\n if (orderBy) parts.push(orderBy);\n if (limitOffset) parts.push(limitOffset);\n\n return sql.join(parts, sql` `);\n}\n\n/**\n * Checks if a query contains variable-length traversals.\n */\nexport function hasVariableLengthTraversal(ast: QueryAst): boolean {\n return ast.traversals.some((t) => t.variableLength !== undefined);\n}\n\n// ============================================================\n// Recursive CTE Generation\n// ============================================================\n\n/**\n * Compiles the recursive CTE for variable-length traversal.\n */\nfunction compileRecursiveCte(\n ast: QueryAst,\n traversal: VariableLengthTraversal,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const { dialect } = ctx;\n const startAlias = ast.start.alias;\n const startKinds = ast.start.kinds;\n const nodeAlias = traversal.nodeAlias;\n const edgeKinds = traversal.edgeKinds;\n const nodeKinds = traversal.nodeKinds;\n const direction = traversal.direction;\n const vl = traversal.variableLength;\n\n // Kind filters\n const startKindFilter = compileKindFilter(startKinds, \"n0.kind\");\n const edgeKindFilter = compileKindFilter(edgeKinds, \"e.kind\");\n const nodeKindFilter = compileKindFilter(nodeKinds, \"n.kind\");\n\n // Temporal filter\n const temporalFilter = compileTemporalFilter(extractTemporalOptions(ast));\n\n // Start predicates (with cteColumnPrefix \"\" for raw n0 columns)\n const startContext = { ...ctx, cteColumnPrefix: \"\" };\n const startPredicates = compileNodePredicates(ast, startAlias, startContext);\n\n // Edge predicates (with cteColumnPrefix \"e\" for e.props)\n const edgeContext = { ...ctx, cteColumnPrefix: \"e\" };\n const edgePredicates = compileEdgePredicates(\n ast,\n traversal.edgeAlias,\n edgeContext,\n );\n\n // Target node predicates (with cteColumnPrefix \"n\" for n.props)\n const targetContext = { ...ctx, cteColumnPrefix: \"n\" };\n const targetNodePredicates = compileNodePredicates(\n ast,\n nodeAlias,\n targetContext,\n );\n\n // Edge join conditions based on direction\n const edgeJoinField = direction === \"out\" ? \"from_id\" : \"to_id\";\n const targetField = direction === \"out\" ? \"to_id\" : \"from_id\";\n\n // Max depth condition - enforce MAX_RECURSIVE_DEPTH even for \"unlimited\" queries\n const effectiveMaxDepth =\n vl.maxDepth > 0 ?\n Math.min(vl.maxDepth, MAX_RECURSIVE_DEPTH)\n : MAX_RECURSIVE_DEPTH;\n const maxDepthCondition = sql`r.depth < ${effectiveMaxDepth}`;\n\n // Cycle check using dialect adapter\n const cycleCheck = dialect.cycleCheck(sql.raw(\"n.id\"), sql.raw(\"r.path\"));\n\n // Initial path using dialect adapter\n const initialPath = dialect.initializePath(sql.raw(\"n0.id\"));\n\n // Path extension using dialect adapter\n const pathExtension = dialect.extendPath(sql.raw(\"r.path\"), sql.raw(\"n.id\"));\n\n // Base case WHERE clauses\n const baseWhereClauses = [\n sql`n0.graph_id = ${graphId}`,\n startKindFilter,\n temporalFilter,\n ...startPredicates,\n ];\n\n // Recursive case WHERE clauses\n const recursiveWhereClauses = [\n sql`e.graph_id = ${graphId}`,\n edgeKindFilter,\n nodeKindFilter,\n maxDepthCondition,\n cycleCheck,\n ...edgePredicates,\n ...targetNodePredicates,\n ];\n\n return sql`\n recursive_cte AS (\n -- Base case: starting nodes\n SELECT\n n0.id AS ${sql.raw(startAlias)}_id,\n n0.kind AS ${sql.raw(startAlias)}_kind,\n n0.props AS ${sql.raw(startAlias)}_props,\n n0.version AS ${sql.raw(startAlias)}_version,\n n0.valid_from AS ${sql.raw(startAlias)}_valid_from,\n n0.valid_to AS ${sql.raw(startAlias)}_valid_to,\n n0.created_at AS ${sql.raw(startAlias)}_created_at,\n n0.updated_at AS ${sql.raw(startAlias)}_updated_at,\n n0.deleted_at AS ${sql.raw(startAlias)}_deleted_at,\n n0.id AS ${sql.raw(nodeAlias)}_id,\n n0.kind AS ${sql.raw(nodeAlias)}_kind,\n n0.props AS ${sql.raw(nodeAlias)}_props,\n n0.version AS ${sql.raw(nodeAlias)}_version,\n n0.valid_from AS ${sql.raw(nodeAlias)}_valid_from,\n n0.valid_to AS ${sql.raw(nodeAlias)}_valid_to,\n n0.created_at AS ${sql.raw(nodeAlias)}_created_at,\n n0.updated_at AS ${sql.raw(nodeAlias)}_updated_at,\n n0.deleted_at AS ${sql.raw(nodeAlias)}_deleted_at,\n 0 AS depth,\n ${initialPath} AS path\n FROM ${ctx.schema.nodesTable} n0\n WHERE ${sql.join(baseWhereClauses, sql` AND `)}\n\n UNION ALL\n\n -- Recursive case: follow edges\n SELECT\n r.${sql.raw(startAlias)}_id,\n r.${sql.raw(startAlias)}_kind,\n r.${sql.raw(startAlias)}_props,\n r.${sql.raw(startAlias)}_version,\n r.${sql.raw(startAlias)}_valid_from,\n r.${sql.raw(startAlias)}_valid_to,\n r.${sql.raw(startAlias)}_created_at,\n r.${sql.raw(startAlias)}_updated_at,\n r.${sql.raw(startAlias)}_deleted_at,\n n.id AS ${sql.raw(nodeAlias)}_id,\n n.kind AS ${sql.raw(nodeAlias)}_kind,\n n.props AS ${sql.raw(nodeAlias)}_props,\n n.version AS ${sql.raw(nodeAlias)}_version,\n n.valid_from AS ${sql.raw(nodeAlias)}_valid_from,\n n.valid_to AS ${sql.raw(nodeAlias)}_valid_to,\n n.created_at AS ${sql.raw(nodeAlias)}_created_at,\n n.updated_at AS ${sql.raw(nodeAlias)}_updated_at,\n n.deleted_at AS ${sql.raw(nodeAlias)}_deleted_at,\n r.depth + 1 AS depth,\n ${pathExtension} AS path\n FROM recursive_cte r\n JOIN ${ctx.schema.edgesTable} e ON e.${sql.raw(edgeJoinField)} = r.${sql.raw(nodeAlias)}_id\n JOIN ${ctx.schema.nodesTable} n ON n.id = e.${sql.raw(targetField)}\n WHERE ${sql.join(recursiveWhereClauses, sql` AND `)}\n )\n `;\n}\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\n/**\n * Compiles a kind filter for IN clause.\n */\nfunction compileKindFilter(kinds: readonly string[], columnExpr: string): SQL {\n if (kinds.length === 1) {\n return sql`${sql.raw(columnExpr)} = ${kinds[0]}`;\n }\n return sql`${sql.raw(columnExpr)} IN (${sql.join(\n kinds.map((k) => sql`${k}`),\n sql`, `,\n )})`;\n}\n\n/**\n * Compiles node predicates for a specific alias.\n * Filters by alias and excludes edge predicates (targetType !== \"edge\").\n */\nfunction compileNodePredicates(\n ast: QueryAst,\n alias: string,\n ctx: PredicateCompilerContext,\n): SQL[] {\n return ast.predicates\n .filter((p) => p.targetAlias === alias && p.targetType !== \"edge\")\n .map((p) => compilePredicateExpression(p.expression, ctx));\n}\n\n/**\n * Compiles edge predicates for a specific edge alias.\n * Filters by alias and only includes edge predicates (targetType === \"edge\").\n */\nfunction compileEdgePredicates(\n ast: QueryAst,\n edgeAlias: string,\n ctx: PredicateCompilerContext,\n): SQL[] {\n return ast.predicates\n .filter((p) => p.targetAlias === edgeAlias && p.targetType === \"edge\")\n .map((p) => compilePredicateExpression(p.expression, ctx));\n}\n\n/**\n * Compiles projection for recursive query results.\n */\nfunction compileRecursiveProjection(\n ast: QueryAst,\n traversal: VariableLengthTraversal,\n): SQL {\n const startAlias = ast.start.alias;\n const nodeAlias = traversal.nodeAlias;\n const vl = traversal.variableLength;\n\n const fields: SQL[] = [\n // Start alias fields with metadata\n sql`${sql.raw(startAlias)}_id`,\n sql`${sql.raw(startAlias)}_kind`,\n sql`${sql.raw(startAlias)}_props`,\n sql`${sql.raw(startAlias)}_version`,\n sql`${sql.raw(startAlias)}_valid_from`,\n sql`${sql.raw(startAlias)}_valid_to`,\n sql`${sql.raw(startAlias)}_created_at`,\n sql`${sql.raw(startAlias)}_updated_at`,\n sql`${sql.raw(startAlias)}_deleted_at`,\n // Node alias fields with metadata\n sql`${sql.raw(nodeAlias)}_id`,\n sql`${sql.raw(nodeAlias)}_kind`,\n sql`${sql.raw(nodeAlias)}_props`,\n sql`${sql.raw(nodeAlias)}_version`,\n sql`${sql.raw(nodeAlias)}_valid_from`,\n sql`${sql.raw(nodeAlias)}_valid_to`,\n sql`${sql.raw(nodeAlias)}_created_at`,\n sql`${sql.raw(nodeAlias)}_updated_at`,\n sql`${sql.raw(nodeAlias)}_deleted_at`,\n ];\n\n // Always include depth with the alias\n const depthAlias = vl.depthAlias ?? `${nodeAlias}_depth`;\n fields.push(sql`depth AS ${sql.raw(depthAlias)}`);\n\n // Include path if requested\n if (vl.collectPath) {\n const pathAlias = vl.pathAlias ?? `${nodeAlias}_path`;\n fields.push(sql`path AS ${sql.raw(pathAlias)}`);\n }\n\n return sql.join(fields, sql`, `);\n}\n\n/**\n * Compiles ORDER BY for recursive query.\n */\nfunction compileRecursiveOrderBy(\n ast: QueryAst,\n dialect: DialectAdapter,\n): SQL | undefined {\n if (!ast.orderBy || ast.orderBy.length === 0) {\n return undefined;\n }\n\n const parts: SQL[] = [];\n\n for (const o of ast.orderBy) {\n const valueType = o.field.valueType;\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"Ordering by JSON arrays or objects is not supported\",\n );\n }\n // For recursive queries, field refs are direct column names\n const field = compileFieldValue(o.field, dialect, valueType);\n const dir = sql.raw(o.direction.toUpperCase());\n const nulls = o.nulls ?? (o.direction === \"asc\" ? \"last\" : \"first\");\n const nullsDir = sql.raw(nulls === \"first\" ? \"DESC\" : \"ASC\");\n\n parts.push(sql`(${field} IS NULL) ${nullsDir}`, sql`${field} ${dir}`);\n }\n\n return sql`ORDER BY ${sql.join(parts, sql`, `)}`;\n}\n\n/**\n * Compiles LIMIT and OFFSET clauses.\n */\nfunction compileLimitOffset(ast: QueryAst): SQL | undefined {\n const parts: SQL[] = [];\n\n if (ast.limit !== undefined) {\n parts.push(sql`LIMIT ${ast.limit}`);\n }\n if (ast.offset !== undefined) {\n parts.push(sql`OFFSET ${ast.offset}`);\n }\n\n return parts.length > 0 ? sql.join(parts, sql` `) : undefined;\n}\n","/**\n * Set Operation Compilation\n *\n * Compiles UNION, INTERSECT, and EXCEPT operations to SQL.\n *\n * For SQLite, special handling is required because:\n * - CTEs (WITH clauses) cannot be wrapped in parentheses\n * - Compound SELECT statements can only have a single WITH clause at the start\n *\n * This module handles these requirements by:\n * - For simple queries (no traversals): Compiling without CTEs, using direct table queries\n * - For complex queries: Merging all CTEs into a single WITH clause with unique prefixes\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport {\n type ComposableQuery,\n type FieldRef,\n type ProjectedField,\n type Projection,\n type QueryAst,\n type SetOperation,\n} from \"../ast\";\nimport { type DialectAdapter } from \"../dialect\";\nimport { type JsonPointer, jsonPointer } from \"../json-pointer\";\nimport {\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"./predicates\";\nimport { type SqlSchema } from \"./schema\";\nimport { compileTemporalFilter, extractTemporalOptions } from \"./temporal\";\n\n/**\n * Type for the query compiler function.\n */\nexport type QueryCompilerFunction = (ast: QueryAst, graphId: string) => SQL;\n\n/**\n * Operator mapping for set operations.\n */\nconst OPERATOR_MAP: Record<string, string> = {\n union: \"UNION\",\n unionAll: \"UNION ALL\",\n intersect: \"INTERSECT\",\n except: \"EXCEPT\",\n};\n\n// ============================================================\n// Main Entry Point\n// ============================================================\n\n/**\n * Compiles a set operation to SQL.\n *\n * For SQLite, uses a special compilation strategy that avoids wrapping\n * CTEs in parentheses. For other databases, uses the standard approach.\n *\n * @param op - The set operation AST\n * @param graphId - The graph ID\n * @param dialect - The dialect adapter\n * @param schema - SQL schema configuration for table names\n * @param compileQuery - Function to compile regular queries\n * @returns SQL for the set operation\n */\nexport function compileSetOperation(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n schema: SqlSchema,\n compileQuery: QueryCompilerFunction,\n): SQL {\n // SQLite requires special handling for CTEs in compound statements\n if (dialect.name === \"sqlite\") {\n return compileSetOperationForSqlite(op, graphId, dialect, schema);\n }\n\n // PostgreSQL and others support CTEs in parentheses\n return compileSetOperationStandard(op, graphId, dialect, compileQuery);\n}\n\n// ============================================================\n// Standard (PostgreSQL) Compilation\n// ============================================================\n\n/**\n * Standard set operation compilation for databases that support CTEs in parentheses.\n */\nfunction compileSetOperationStandard(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n compileQuery: QueryCompilerFunction,\n): SQL {\n const coreSql = compileSetOperationCoreStandard(\n op,\n graphId,\n dialect,\n compileQuery,\n );\n\n const parts: SQL[] = [coreSql];\n\n // Handle ORDER BY, LIMIT, OFFSET\n appendOrderByLimitOffset(parts, op, dialect);\n\n return sql.join(parts, sql` `);\n}\n\n/**\n * Compiles the core set operation with parentheses (standard approach).\n */\nfunction compileSetOperationCoreStandard(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n compileQuery: QueryCompilerFunction,\n): SQL {\n const left = compileComposableQueryStandard(\n op.left,\n graphId,\n dialect,\n compileQuery,\n );\n const right = compileComposableQueryStandard(\n op.right,\n graphId,\n dialect,\n compileQuery,\n );\n\n const opSql = sql.raw(OPERATOR_MAP[op.operator]!);\n\n return sql`(${left}) ${opSql} (${right})`;\n}\n\n/**\n * Compiles a composable query for standard databases.\n */\nfunction compileComposableQueryStandard(\n query: ComposableQuery,\n graphId: string,\n dialect: DialectAdapter,\n compileQuery: QueryCompilerFunction,\n): SQL {\n if (\"__type\" in query) {\n return compileSetOperationCoreStandard(\n query,\n graphId,\n dialect,\n compileQuery,\n );\n }\n return compileQuery(query, graphId);\n}\n\n// ============================================================\n// SQLite Compilation\n// ============================================================\n\n/**\n * SQLite-specific set operation compilation.\n *\n * SQLite compound SELECT statements cannot have parentheses around\n * queries that include CTEs. This function compiles set operations\n * by merging all CTEs into a single WITH clause at the top.\n *\n * @throws Error if any leaf query contains traversals (not yet supported)\n */\nfunction compileSetOperationForSqlite(\n op: SetOperation,\n graphId: string,\n dialect: DialectAdapter,\n schema: SqlSchema,\n): SQL {\n // Collect all leaf queries and assign unique prefixes\n const leaves: { ast: QueryAst; prefix: string }[] = [];\n collectLeafQueries(op, leaves, \"q\");\n\n // Validate: SQLite set operations currently only support simple queries\n for (const leaf of leaves) {\n validateSqliteSetOpLeaf(leaf.ast);\n }\n\n // Build all CTEs with unique prefixes\n const allCtes: SQL[] = [];\n const ctx: PredicateCompilerContext = {\n dialect,\n schema,\n compileQuery: () => sql``, // Not used in CTE compilation\n };\n\n for (const leaf of leaves) {\n const cte = compilePrefixedStartCte(leaf.ast, leaf.prefix, graphId, ctx);\n allCtes.push(cte);\n }\n\n // Build SELECT statements for each leaf\n const selectStatements: SQL[] = [];\n for (const leaf of leaves) {\n const select = compilePrefixedSelect(leaf.ast, leaf.prefix, dialect);\n selectStatements.push(select);\n }\n\n // Build compound SELECT from the set operation structure\n const compoundSelect = buildCompoundSelect(op, leaves, selectStatements);\n\n // Assemble final query\n const parts: SQL[] = [];\n\n if (allCtes.length > 0) {\n parts.push(sql`WITH ${sql.join(allCtes, sql`, `)}`);\n }\n\n parts.push(compoundSelect);\n\n // Handle ORDER BY, LIMIT, OFFSET\n appendOrderByLimitOffset(parts, op, dialect);\n\n return sql.join(parts, sql` `);\n}\n\n/**\n * Validates that a leaf query is compatible with SQLite set operations.\n * SQLite's compound SELECT has significant limitations compared to PostgreSQL.\n *\n * @throws Error if the query uses unsupported features\n */\nfunction validateSqliteSetOpLeaf(ast: QueryAst): void {\n const unsupported: string[] = [];\n\n // Traversals require multiple CTEs which SQLite can't handle in compound statements\n if (ast.traversals.length > 0) {\n unsupported.push(\"traversals\");\n }\n\n // Subqueries (EXISTS/IN) would need CTEs or nested queries\n if (hasSubqueryPredicates(ast)) {\n unsupported.push(\"EXISTS/IN subqueries\");\n }\n\n // Vector similarity requires the embeddings table join\n if (hasVectorSimilarityPredicates(ast)) {\n unsupported.push(\"vector similarity predicates\");\n }\n\n // GROUP BY/HAVING would need to be applied to the individual leaf, not the compound result\n if (ast.groupBy !== undefined) {\n unsupported.push(\"GROUP BY\");\n }\n if (ast.having !== undefined) {\n unsupported.push(\"HAVING\");\n }\n\n // Per-leaf ORDER BY/LIMIT/OFFSET would silently be ignored in compound statements\n // (only the outer ORDER BY/LIMIT/OFFSET apply)\n if (ast.orderBy !== undefined && ast.orderBy.length > 0) {\n unsupported.push(\n \"per-query ORDER BY (use set operation's orderBy instead)\",\n );\n }\n if (ast.limit !== undefined) {\n unsupported.push(\"per-query LIMIT (use set operation's limit instead)\");\n }\n if (ast.offset !== undefined) {\n unsupported.push(\"per-query OFFSET (use set operation's offset instead)\");\n }\n\n if (unsupported.length > 0) {\n throw new Error(\n `SQLite set operations (UNION/INTERSECT/EXCEPT) do not support: ${unsupported.join(\", \")}. ` +\n \"Use PostgreSQL for complex set operations, or refactor to separate queries.\",\n );\n }\n}\n\n/**\n * Checks if a query AST has vector similarity predicates.\n */\nfunction hasVectorSimilarityPredicates(ast: QueryAst): boolean {\n return ast.predicates.some((predicate) =>\n hasVectorSimilarityInExpression(predicate.expression),\n );\n}\n\n/**\n * Recursively checks if a predicate expression contains vector similarity.\n */\nfunction hasVectorSimilarityInExpression(\n expr: QueryAst[\"predicates\"][0][\"expression\"],\n): boolean {\n if (\"__type\" in expr) {\n switch (expr.__type) {\n case \"and\":\n case \"or\": {\n return expr.predicates.some((p) => hasVectorSimilarityInExpression(p));\n }\n case \"not\": {\n return hasVectorSimilarityInExpression(expr.predicate);\n }\n case \"vector_similarity\": {\n return true;\n }\n case \"exists\":\n case \"in_subquery\":\n case \"comparison\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\": {\n return false;\n }\n }\n }\n return false;\n}\n\n/**\n * Checks if a query AST has predicates with subqueries (EXISTS/IN with subquery).\n */\nfunction hasSubqueryPredicates(ast: QueryAst): boolean {\n return ast.predicates.some((predicate) =>\n hasSubqueryInExpression(predicate.expression),\n );\n}\n\n/**\n * Recursively checks if a predicate expression contains subqueries.\n */\nfunction hasSubqueryInExpression(\n expr: QueryAst[\"predicates\"][0][\"expression\"],\n): boolean {\n if (\"__type\" in expr) {\n switch (expr.__type) {\n case \"and\":\n case \"or\": {\n return expr.predicates.some((p) => hasSubqueryInExpression(p));\n }\n case \"not\": {\n return hasSubqueryInExpression(expr.predicate);\n }\n case \"exists\": {\n return true; // EXISTS always has a subquery\n }\n case \"in_subquery\": {\n return true; // IN with subquery\n }\n // These expression types don't contain subqueries\n case \"comparison\":\n case \"string_op\":\n case \"null_check\":\n case \"between\":\n case \"array_op\":\n case \"object_op\":\n case \"aggregate_comparison\":\n case \"vector_similarity\": {\n return false;\n }\n }\n }\n return false;\n}\n\n/**\n * Recursively collects all leaf QueryAst nodes from a set operation tree.\n * Assigns unique prefixes to each leaf (q0, q1, q2, etc.).\n */\nfunction collectLeafQueries(\n query: ComposableQuery,\n leaves: { ast: QueryAst; prefix: string }[],\n basePrefix: string,\n): void {\n if (\"__type\" in query) {\n // This is a SetOperation, recurse\n collectLeafQueries(query.left, leaves, basePrefix);\n collectLeafQueries(query.right, leaves, basePrefix);\n } else {\n // This is a QueryAst leaf\n const index = leaves.length;\n leaves.push({ ast: query, prefix: `${basePrefix}${index}` });\n }\n}\n\n/**\n * Compiles a CTE for the start node selection with a unique prefix.\n */\nfunction compilePrefixedStartCte(\n ast: QueryAst,\n prefix: string,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const alias = ast.start.alias;\n const kinds = ast.start.kinds;\n\n // Kind filter\n const kindFilter =\n kinds.length === 1 ?\n sql`kind = ${kinds[0]}`\n : sql`kind IN (${sql.join(\n kinds.map((k) => sql`${k}`),\n sql`, `,\n )})`;\n\n // Temporal filter\n const temporalFilter = compileTemporalFilter(extractTemporalOptions(ast));\n\n // Node predicates for this alias\n const cteContext: PredicateCompilerContext = { ...ctx, cteColumnPrefix: \"\" };\n const predicateClauses = ast.predicates\n .filter((p) => p.targetAlias === alias)\n .map((p) => compilePredicateExpression(p.expression, cteContext));\n\n // Combine all WHERE clauses\n const whereClauses = [\n sql`graph_id = ${graphId}`,\n kindFilter,\n temporalFilter,\n ...predicateClauses,\n ];\n\n // Use prefixed CTE name: cte_q0_c, cte_q1_c, etc.\n const cteName = `cte_${prefix}_${alias}`;\n\n return sql`\n ${sql.raw(cteName)} AS (\n SELECT\n id AS ${sql.raw(alias)}_id,\n kind AS ${sql.raw(alias)}_kind,\n props AS ${sql.raw(alias)}_props,\n version AS ${sql.raw(alias)}_version,\n valid_from AS ${sql.raw(alias)}_valid_from,\n valid_to AS ${sql.raw(alias)}_valid_to,\n created_at AS ${sql.raw(alias)}_created_at,\n updated_at AS ${sql.raw(alias)}_updated_at,\n deleted_at AS ${sql.raw(alias)}_deleted_at\n FROM ${ctx.schema.nodesTable}\n WHERE ${sql.join(whereClauses, sql` AND `)}\n )\n `;\n}\n\n/**\n * Compiles the SELECT statement for a leaf query using the prefixed CTE.\n */\nfunction compilePrefixedSelect(\n ast: QueryAst,\n prefix: string,\n dialect: DialectAdapter,\n): SQL {\n const alias = ast.start.alias;\n const cteName = `cte_${prefix}_${alias}`;\n const fields = ast.projection.fields;\n\n // Build projection\n let projection: SQL;\n if (fields.length === 0) {\n projection = sql.raw(\"*\");\n } else {\n const projectedFields = fields.map((f) => {\n const source = compileFieldValueForSetOp(\n f.source,\n prefix,\n alias,\n dialect,\n );\n // Quote the output name with proper escaping to preserve case and handle special characters\n return sql`${source} AS ${sql.raw(dialect.quoteIdentifier(f.outputName))}`;\n });\n projection = sql.join(projectedFields, sql`, `);\n }\n\n return sql`SELECT ${projection} FROM ${sql.raw(cteName)}`;\n}\n\n/**\n * Compiles a field value reference for set operation queries.\n */\nfunction compileFieldValueForSetOp(\n source: QueryAst[\"projection\"][\"fields\"][0][\"source\"],\n prefix: string,\n alias: string,\n dialect: DialectAdapter,\n): SQL {\n if (\"__type\" in source && source.__type === \"aggregate\") {\n // Aggregate expressions\n const { field, function: fn } = source;\n const cteName = `cte_${prefix}_${field.alias}`;\n\n switch (fn) {\n case \"count\": {\n return sql`COUNT(${sql.raw(cteName)}.${sql.raw(field.alias)}_id)`;\n }\n case \"countDistinct\": {\n return sql`COUNT(DISTINCT ${sql.raw(cteName)}.${sql.raw(field.alias)}_id)`;\n }\n case \"sum\":\n case \"avg\":\n case \"min\":\n case \"max\": {\n const column = compileFieldColumnForSetOp(field, prefix, dialect);\n return sql`${sql.raw(fn.toUpperCase())}(${column})`;\n }\n default: {\n throw new Error(`Unknown aggregate function: ${fn as string}`);\n }\n }\n }\n\n // Field reference\n return compileFieldColumnForSetOp(source, prefix, dialect);\n}\n\n/**\n * Compiles a field column reference for set operation queries.\n */\nfunction compileFieldColumnForSetOp(\n field: {\n alias: string;\n path: readonly string[];\n jsonPointer?: JsonPointer | undefined;\n valueType?: string | undefined;\n },\n prefix: string,\n dialect: DialectAdapter,\n): SQL {\n const cteName = `cte_${prefix}_${field.alias}`;\n const alias = field.alias;\n\n // Handle direct column references\n if (field.path.length === 1) {\n const columnName = field.path[0];\n // Map path names to column names\n const columnMap: Record<string, string> = {\n id: \"_id\",\n kind: \"_kind\",\n props: \"_props\",\n version: \"_version\",\n valid_from: \"_valid_from\",\n valid_to: \"_valid_to\",\n created_at: \"_created_at\",\n updated_at: \"_updated_at\",\n deleted_at: \"_deleted_at\",\n };\n const suffix = columnMap[columnName!];\n if (suffix) {\n return sql.raw(`${cteName}.${alias}${suffix}`);\n }\n }\n\n // JSON field (path starts with \"props\" and has a json pointer)\n const column = sql.raw(`${cteName}.${alias}_props`);\n const pointer = field.jsonPointer;\n\n if (!pointer) {\n return column;\n }\n\n // Use appropriate JSON extraction based on value type\n const valueType = field.valueType;\n if (valueType === \"number\") {\n return dialect.jsonExtractNumber(column, pointer);\n }\n if (valueType === \"boolean\") {\n return dialect.jsonExtractBoolean(column, pointer);\n }\n return dialect.jsonExtractText(column, pointer);\n}\n\n/**\n * Builds the compound SELECT statement from the set operation structure.\n */\nfunction buildCompoundSelect(\n op: SetOperation,\n leaves: { ast: QueryAst; prefix: string }[],\n selectStatements: SQL[],\n): SQL {\n // Build a map from prefix to select statement\n const prefixToSelect = new Map<string, SQL>();\n for (const [index, leaf] of leaves.entries()) {\n prefixToSelect.set(leaf.prefix, selectStatements[index]!);\n }\n\n // Recursively build compound select\n return buildCompoundSelectRecursive(op, leaves, prefixToSelect);\n}\n\n/**\n * Recursively builds compound SELECT with proper operator placement.\n */\nfunction buildCompoundSelectRecursive(\n query: ComposableQuery,\n leaves: { ast: QueryAst; prefix: string }[],\n prefixToSelect: Map<string, SQL>,\n): SQL {\n if (!(\"__type\" in query)) {\n // This is a leaf QueryAst - find its prefix and return the SELECT\n const leaf = leaves.find((l) => l.ast === query);\n if (!leaf) {\n throw new Error(\"Leaf query not found in leaves array\");\n }\n return prefixToSelect.get(leaf.prefix)!;\n }\n\n // This is a SetOperation\n const left = buildCompoundSelectRecursive(query.left, leaves, prefixToSelect);\n const right = buildCompoundSelectRecursive(\n query.right,\n leaves,\n prefixToSelect,\n );\n const opSql = sql.raw(OPERATOR_MAP[query.operator]!);\n\n return sql`${left} ${opSql} ${right}`;\n}\n\n// ============================================================\n// Shared Utilities\n// ============================================================\n\n/**\n * Gets the leftmost leaf's projection from a set operation.\n * The leftmost leaf defines the output column names for the compound query.\n */\nfunction getLeftmostProjection(op: SetOperation): Projection {\n let current: ComposableQuery = op.left;\n while (\"__type\" in current) {\n // current is a SetOperation, traverse left\n current = current.left;\n }\n // current is now a QueryAst (the leftmost leaf)\n return current.projection;\n}\n\n/**\n * Normalizes a FieldRef to a canonical key for comparison.\n *\n * Handles equivalent representations:\n * - path: [\"props\", \"name\"] (no jsonPointer) → \"alias:props:/name\"\n * - path: [\"props\"], jsonPointer: \"/name\" → \"alias:props:/name\"\n *\n * This matches the normalization logic in compileFieldValue/getFieldPointer.\n */\nfunction normalizeFieldRefKey(field: FieldRef): string {\n // Derive JSON pointer from path if not explicitly set (same logic as predicates.ts getFieldPointer)\n let pointer: JsonPointer | undefined = field.jsonPointer;\n if (\n pointer === undefined &&\n field.path.length > 1 &&\n field.path[0] === \"props\"\n ) {\n pointer = jsonPointer(field.path.slice(1));\n }\n\n // Normalize base path: for JSON fields, always use [\"props\"]\n const basePath =\n field.path.length > 0 && field.path[0] === \"props\" ?\n \"props\"\n : field.path.join(\".\");\n\n return `${field.alias}:${basePath}:${pointer ?? \"\"}`;\n}\n\n/**\n * Matches a FieldRef from ORDER BY to a ProjectedField in the projection.\n * Returns the matching ProjectedField or undefined if no match.\n *\n * Uses normalized keys to handle equivalent field representations.\n */\nfunction matchFieldToProjection(\n field: FieldRef,\n projection: Projection,\n): ProjectedField | undefined {\n const targetKey = normalizeFieldRefKey(field);\n\n for (const projected of projection.fields) {\n const source = projected.source;\n\n // Only match against FieldRef sources (not aggregates)\n if (!(\"__type\" in source) || source.__type !== \"field_ref\") continue;\n\n // Compare normalized keys\n if (normalizeFieldRefKey(source) === targetKey) {\n return projected;\n }\n }\n return undefined;\n}\n\n/**\n * Appends ORDER BY, LIMIT, OFFSET clauses to the parts array.\n *\n * For set operations, ORDER BY must reference output column names from\n * the compound result, not internal CTE columns. This function:\n * 1. Maps each ORDER BY field to its output name from the leftmost projection\n * 2. Uses IS NULL emulation for consistent NULLS FIRST/LAST across dialects\n * 3. Throws a descriptive error if an ORDER BY field isn't in the projection\n */\nfunction appendOrderByLimitOffset(\n parts: SQL[],\n op: SetOperation,\n dialect: DialectAdapter,\n): void {\n // Handle ORDER BY if present\n if (op.orderBy && op.orderBy.length > 0) {\n const projection = getLeftmostProjection(op);\n\n // Check for SELECT * (empty projection) - can't order by named columns\n if (projection.fields.length === 0) {\n throw new Error(\n \"Set operation ORDER BY requires explicit field projection. \" +\n \"SELECT * does not provide stable output column names for ordering. \" +\n \"Use .select() to specify which fields to project.\",\n );\n }\n\n const orderParts: SQL[] = [];\n\n for (const o of op.orderBy) {\n const projected = matchFieldToProjection(o.field, projection);\n\n if (!projected) {\n // Build a descriptive error message\n const fieldDesc =\n o.field.jsonPointer ?\n `${o.field.alias}.props${o.field.jsonPointer}`\n : `${o.field.alias}.${o.field.path.join(\".\")}`;\n const availableFields = projection.fields\n .map((f) => f.outputName)\n .join(\", \");\n throw new Error(\n `Set operation ORDER BY field \"${fieldDesc}\" is not in the projection. ` +\n `ORDER BY for UNION/INTERSECT/EXCEPT must reference projected columns. ` +\n `Available columns: ${availableFields}`,\n );\n }\n\n // Use output column name with proper quoting\n const columnRef = sql.raw(dialect.quoteIdentifier(projected.outputName));\n const dir = sql.raw(o.direction.toUpperCase());\n\n // Handle nulls with IS NULL emulation for cross-dialect consistency\n // Default: ASC → NULLS LAST, DESC → NULLS FIRST\n const nulls = o.nulls ?? (o.direction === \"asc\" ? \"last\" : \"first\");\n const nullsDir = sql.raw(nulls === \"first\" ? \"DESC\" : \"ASC\");\n\n // Emulate NULLS FIRST/LAST: (col IS NULL) ASC/DESC, col DIR\n orderParts.push(\n sql`(${columnRef} IS NULL) ${nullsDir}`,\n sql`${columnRef} ${dir}`,\n );\n }\n\n parts.push(sql`ORDER BY ${sql.join(orderParts, sql`, `)}`);\n }\n\n // Handle LIMIT\n if (op.limit !== undefined) {\n parts.push(sql`LIMIT ${op.limit}`);\n }\n\n // Handle OFFSET\n if (op.offset !== undefined) {\n parts.push(sql`OFFSET ${op.offset}`);\n }\n}\n","/**\n * Query Compiler Module\n *\n * Main entry point for compiling query ASTs to SQL.\n * Re-exports individual compiler modules and provides the main compile functions.\n */\n\n// Re-export sub-modules\nexport {\n compileAggregateExpr,\n compileFieldColumn,\n compileFieldValue,\n compilePredicateExpression,\n type PredicateCompilerContext,\n} from \"./predicates\";\nexport {\n createSqlSchema,\n DEFAULT_SQL_SCHEMA,\n type SqlSchema,\n type SqlTableNames,\n} from \"./schema\";\n// Note: compileSetOperation is defined below as a wrapper\nexport {\n compileVariableLengthQuery,\n hasVariableLengthTraversal,\n MAX_RECURSIVE_DEPTH,\n} from \"./recursive\";\nexport {\n compileTemporalFilter,\n extractTemporalOptions,\n type TemporalFilterOptions,\n} from \"./temporal\";\n\n// Re-export dialect types\nexport { getDialect, type SqlDialect } from \"../dialect\";\n\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { UnsupportedPredicateError } from \"../../errors\";\nimport {\n type AggregateExpr,\n type FieldRef,\n type QueryAst,\n type SelectiveField,\n type SetOperation,\n type VectorSimilarityPredicate,\n} from \"../ast\";\nimport { getDialect, type SqlDialect } from \"../dialect\";\nimport { jsonPointer } from \"../json-pointer\";\nimport {\n compileFieldValue,\n compilePredicateExpression,\n extractVectorSimilarityPredicates,\n type PredicateCompilerContext,\n} from \"./predicates\";\nimport {\n compileVariableLengthQuery,\n hasVariableLengthTraversal,\n} from \"./recursive\";\nimport { DEFAULT_SQL_SCHEMA, type SqlSchema } from \"./schema\";\nimport { compileSetOperation as compileSetOp } from \"./set-operations\";\nimport { compileTemporalFilter, extractTemporalOptions } from \"./temporal\";\n\n// ============================================================\n// Main Query Compiler\n// ============================================================\n\n/**\n * Options for query compilation.\n */\nexport type CompileQueryOptions = Readonly<{\n /** SQL dialect (\"sqlite\" or \"postgres\"). Defaults to \"sqlite\". */\n dialect?: SqlDialect | undefined;\n /** SQL schema configuration for table names. Defaults to standard names. */\n schema?: SqlSchema | undefined;\n}>;\n\n/**\n * Compiles a query AST to SQL.\n *\n * This is the main entry point for query compilation. It dispatches to\n * the appropriate compiler based on the query type (standard, recursive,\n * or set operation).\n *\n * @param ast - The query AST to compile\n * @param graphId - The graph ID for filtering\n * @param options - Compilation options (dialect, schema)\n * @returns Drizzle SQL object ready for execution\n *\n * @example\n * ```typescript\n * const ast = query.toAst();\n * const sql = compileQuery(ast, \"my_graph\", { dialect: \"postgres\" });\n * const results = await db.execute(sql);\n * ```\n *\n * @example\n * ```typescript\n * // With custom table names\n * const schema = createSqlSchema({ nodes: \"myapp_nodes\", edges: \"myapp_edges\" });\n * const sql = compileQuery(ast, \"my_graph\", { dialect: \"postgres\", schema });\n * ```\n */\nexport function compileQuery(\n ast: QueryAst,\n graphId: string,\n options: CompileQueryOptions | SqlDialect = \"sqlite\",\n): SQL {\n // Support legacy signature: compileQuery(ast, graphId, dialect)\n const options_: CompileQueryOptions =\n typeof options === \"string\" ? { dialect: options } : options;\n const dialect = options_.dialect ?? \"sqlite\";\n const schema = options_.schema ?? DEFAULT_SQL_SCHEMA;\n\n const adapter = getDialect(dialect);\n const ctx: PredicateCompilerContext = {\n dialect: adapter,\n schema,\n compileQuery: (subAst, subGraphId) =>\n compileQuery(subAst as QueryAst, subGraphId, { dialect, schema }),\n };\n\n // Check for variable-length traversals\n if (hasVariableLengthTraversal(ast)) {\n return compileVariableLengthQuery(ast, graphId, ctx);\n }\n\n // Standard query compilation\n return compileStandardQuery(ast, graphId, ctx);\n}\n\n/**\n * Compiles a set operation (UNION/INTERSECT/EXCEPT) to SQL.\n *\n * @param op - The set operation AST\n * @param graphId - The graph ID for filtering\n * @param options - Compilation options (dialect, schema)\n * @returns Drizzle SQL object\n */\nexport function compileSetOperation(\n op: SetOperation,\n graphId: string,\n options: CompileQueryOptions | SqlDialect = \"sqlite\",\n): SQL {\n // Support legacy signature: compileSetOperation(op, graphId, dialect)\n const options_: CompileQueryOptions =\n typeof options === \"string\" ? { dialect: options } : options;\n const dialect = options_.dialect ?? \"sqlite\";\n const schema = options_.schema ?? DEFAULT_SQL_SCHEMA;\n\n const adapter = getDialect(dialect);\n return compileSetOp(op, graphId, adapter, schema, (ast, gid) =>\n compileQuery(ast, gid, { dialect, schema }),\n );\n}\n\n// ============================================================\n// Standard Query Compilation\n// ============================================================\n\nfunction quoteIdentifier(identifier: string): SQL {\n return sql.raw(`\"${identifier.replaceAll('\"', '\"\"')}\"`);\n}\n\n/**\n * Compiles a standard (non-recursive) query to SQL using CTEs.\n */\nfunction compileStandardQuery(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const { dialect } = ctx;\n\n // Check for vector similarity predicates - they require special handling\n const vectorPredicates = extractVectorSimilarityPredicates(ast.predicates);\n const vectorPredicate = vectorPredicates[0]; // Only support single vector predicate\n\n if (vectorPredicates.length > 1) {\n throw new UnsupportedPredicateError(\n \"Multiple vector similarity predicates in a single query are not supported\",\n );\n }\n\n // Build CTEs\n const ctes: SQL[] = [compileStartCte(ast, graphId, ctx)];\n\n // Traversal CTEs\n for (let index = 0; index < ast.traversals.length; index++) {\n ctes.push(compileTraversalCte(ast, index, graphId, ctx));\n }\n\n // Add embeddings CTE if vector similarity is used\n if (vectorPredicate) {\n ctes.push(compileEmbeddingsCte(vectorPredicate, graphId, ctx));\n }\n\n // Build main SELECT\n const projection = compileProjection(ast, dialect);\n const fromClause = compileFromClause(ast, vectorPredicate);\n const groupBy = compileGroupBy(ast, dialect);\n const having = compileHaving(ast, ctx);\n\n // Order by distance if vector similarity, otherwise use AST order\n const orderBy =\n vectorPredicate ?\n compileVectorOrderBy(vectorPredicate, ast, dialect)\n : compileOrderBy(ast, dialect);\n\n // Use vector predicate limit if present and no explicit limit in AST\n const effectiveLimit =\n vectorPredicate && ast.limit === undefined ?\n vectorPredicate.limit\n : ast.limit;\n const limitOffset = compileLimitOffsetWithOverride(\n effectiveLimit,\n ast.offset,\n );\n\n // Assemble query\n const parts: SQL[] = [\n sql`WITH ${sql.join(ctes, sql`, `)}`,\n sql`SELECT ${projection}`,\n fromClause,\n ];\n\n if (groupBy) parts.push(groupBy);\n if (having) parts.push(having);\n if (orderBy) parts.push(orderBy);\n if (limitOffset) parts.push(limitOffset);\n\n return sql.join(parts, sql` `);\n}\n\n// ============================================================\n// CTE Compilation\n// ============================================================\n\n/**\n * Compiles the start CTE for the initial node selection.\n */\nfunction compileStartCte(\n ast: QueryAst,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const alias = ast.start.alias;\n const kinds = ast.start.kinds;\n\n // Kind filter\n const kindFilter =\n kinds.length === 1 ?\n sql`kind = ${kinds[0]}`\n : sql`kind IN (${sql.join(\n kinds.map((k) => sql`${k}`),\n sql`, `,\n )})`;\n\n // Temporal filter\n const temporalFilter = compileTemporalFilter(extractTemporalOptions(ast));\n\n // Node predicates for this alias\n // Use cteColumnPrefix: \"\" to generate raw column names (e.g., \"props\" not \"p_props\")\n // because CTE WHERE clauses operate on raw table columns before aliasing\n const cteContext: PredicateCompilerContext = { ...ctx, cteColumnPrefix: \"\" };\n const predicateClauses = ast.predicates\n .filter((p) => p.targetAlias === alias)\n .map((p) => compilePredicateExpression(p.expression, cteContext));\n\n // Combine all WHERE clauses\n const whereClauses = [\n sql`graph_id = ${graphId}`,\n kindFilter,\n temporalFilter,\n ...predicateClauses,\n ];\n\n return sql`\n cte_${sql.raw(alias)} AS (\n SELECT\n id AS ${sql.raw(alias)}_id,\n kind AS ${sql.raw(alias)}_kind,\n props AS ${sql.raw(alias)}_props,\n version AS ${sql.raw(alias)}_version,\n valid_from AS ${sql.raw(alias)}_valid_from,\n valid_to AS ${sql.raw(alias)}_valid_to,\n created_at AS ${sql.raw(alias)}_created_at,\n updated_at AS ${sql.raw(alias)}_updated_at,\n deleted_at AS ${sql.raw(alias)}_deleted_at\n FROM ${ctx.schema.nodesTable}\n WHERE ${sql.join(whereClauses, sql` AND `)}\n )\n `;\n}\n\n/**\n * Compiles a traversal CTE for edge+node joins.\n */\nfunction compileTraversalCte(\n ast: QueryAst,\n traversalIndex: number,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const traversal = ast.traversals[traversalIndex]!;\n\n // Determine join condition based on direction\n const joinField = traversal.direction === \"out\" ? \"from_id\" : \"to_id\";\n const targetField = traversal.direction === \"out\" ? \"to_id\" : \"from_id\";\n\n // Node kind filter\n const nodeKinds = traversal.nodeKinds;\n const nodeKindFilter =\n nodeKinds.length === 1 ?\n sql`n.kind = ${nodeKinds[0]}`\n : sql`n.kind IN (${sql.join(\n nodeKinds.map((k) => sql`${k}`),\n sql`, `,\n )})`;\n\n // Edge kind filter (supports multiple kinds for ontology expansion)\n const edgeKinds = traversal.edgeKinds;\n const edgeKindFilter =\n edgeKinds.length === 1 ?\n sql`e.kind = ${edgeKinds[0]}`\n : sql`e.kind IN (${sql.join(\n edgeKinds.map((k) => sql`${k}`),\n sql`, `,\n )})`;\n\n // Temporal filters\n const edgeTemporalFilter = compileTemporalFilter(\n extractTemporalOptions(ast, \"e\"),\n );\n const nodeTemporalFilter = compileTemporalFilter(\n extractTemporalOptions(ast, \"n\"),\n );\n\n // Node predicates for this alias\n // Use cteColumnPrefix: \"n\" to generate table-qualified column names (e.g., \"n.props\")\n // because traversal CTE WHERE clauses operate on the joined node table\n const nodeCteContext: PredicateCompilerContext = {\n ...ctx,\n cteColumnPrefix: \"n\",\n };\n const nodePredicateClauses = ast.predicates\n .filter(\n (p) => p.targetAlias === traversal.nodeAlias && p.targetType !== \"edge\",\n )\n .map((p) => compilePredicateExpression(p.expression, nodeCteContext));\n\n // Edge predicates for this traversal's edge alias\n // Use cteColumnPrefix: \"e\" for edge table columns\n const edgeCteContext: PredicateCompilerContext = {\n ...ctx,\n cteColumnPrefix: \"e\",\n };\n const edgePredicateClauses = ast.predicates\n .filter(\n (p) => p.targetAlias === traversal.edgeAlias && p.targetType === \"edge\",\n )\n .map((p) => compilePredicateExpression(p.expression, edgeCteContext));\n\n const whereClauses = [\n sql`e.graph_id = ${graphId}`,\n edgeKindFilter,\n nodeKindFilter,\n edgeTemporalFilter,\n nodeTemporalFilter,\n ...nodePredicateClauses,\n ...edgePredicateClauses,\n ];\n\n const previousAlias = traversal.joinFromAlias;\n const edgeAlias = traversal.edgeAlias;\n const nodeAlias = traversal.nodeAlias;\n\n return sql`\n cte_${sql.raw(nodeAlias)} AS (\n SELECT\n e.id AS ${sql.raw(edgeAlias)}_id,\n e.kind AS ${sql.raw(edgeAlias)}_kind,\n e.from_id AS ${sql.raw(edgeAlias)}_from_id,\n e.to_id AS ${sql.raw(edgeAlias)}_to_id,\n e.props AS ${sql.raw(edgeAlias)}_props,\n e.valid_from AS ${sql.raw(edgeAlias)}_valid_from,\n e.valid_to AS ${sql.raw(edgeAlias)}_valid_to,\n e.created_at AS ${sql.raw(edgeAlias)}_created_at,\n e.updated_at AS ${sql.raw(edgeAlias)}_updated_at,\n e.deleted_at AS ${sql.raw(edgeAlias)}_deleted_at,\n n.id AS ${sql.raw(nodeAlias)}_id,\n n.kind AS ${sql.raw(nodeAlias)}_kind,\n n.props AS ${sql.raw(nodeAlias)}_props,\n n.version AS ${sql.raw(nodeAlias)}_version,\n n.valid_from AS ${sql.raw(nodeAlias)}_valid_from,\n n.valid_to AS ${sql.raw(nodeAlias)}_valid_to,\n n.created_at AS ${sql.raw(nodeAlias)}_created_at,\n n.updated_at AS ${sql.raw(nodeAlias)}_updated_at,\n n.deleted_at AS ${sql.raw(nodeAlias)}_deleted_at,\n cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_id AS ${sql.raw(previousAlias)}_id\n FROM ${ctx.schema.edgesTable} e\n JOIN ${ctx.schema.nodesTable} n ON n.id = e.${sql.raw(targetField)}\n JOIN cte_${sql.raw(previousAlias)} ON cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_id = e.${sql.raw(joinField)}\n WHERE ${sql.join(whereClauses, sql` AND `)}\n )\n `;\n}\n\n// ============================================================\n// Query Part Compilation\n// ============================================================\n\n/**\n * Checks if a source is an aggregate expression.\n */\nfunction isAggregateExpr(\n source: FieldRef | AggregateExpr,\n): source is AggregateExpr {\n return \"__type\" in source && source.__type === \"aggregate\";\n}\n\n/**\n * Compiles a projected source (field ref or aggregate).\n */\nfunction compileProjectedSource(\n field: {\n source: FieldRef | AggregateExpr;\n cteAlias?: string;\n },\n dialect: ReturnType<typeof getDialect>,\n): SQL {\n if (isAggregateExpr(field.source)) {\n return compileAggregateExprFromSource(field.source, dialect);\n }\n // Use provided cteAlias if available, otherwise derive from field alias\n const cteAlias = field.cteAlias ?? `cte_${field.source.alias}`;\n return compileFieldValue(\n field.source,\n dialect,\n field.source.valueType,\n cteAlias,\n );\n}\n\n/**\n * Compiles an aggregate expression from source.\n *\n * Uses compileFieldValue to properly extract JSON fields with json_extract\n * for numeric aggregates like SUM, AVG, MIN, MAX.\n */\nfunction compileAggregateExprFromSource(\n expr: AggregateExpr,\n dialect: ReturnType<typeof getDialect>,\n): SQL {\n const { field } = expr;\n const fn = expr.function;\n\n switch (fn) {\n case \"count\": {\n const cteAlias = `cte_${field.alias}`;\n return sql`COUNT(${sql.raw(cteAlias)}.${sql.raw(field.alias)}_id)`;\n }\n case \"countDistinct\": {\n const cteAlias = `cte_${field.alias}`;\n return sql`COUNT(DISTINCT ${sql.raw(cteAlias)}.${sql.raw(field.alias)}_id)`;\n }\n case \"sum\":\n case \"avg\":\n case \"min\":\n case \"max\": {\n const cteAlias = `cte_${field.alias}`;\n // Use compileFieldValue to properly extract JSON fields\n const column = compileFieldValue(\n field,\n dialect,\n field.valueType,\n cteAlias,\n );\n return sql`${sql.raw(fn.toUpperCase())}(${column})`;\n }\n default: {\n throw new UnsupportedPredicateError(\n `Unknown aggregate function: ${String(fn)}`,\n );\n }\n }\n}\n\n/**\n * Compiles the SELECT projection.\n *\n * If selectiveFields are present, generates optimized SQL that only\n * extracts the specific fields needed, enabling covered index usage.\n */\nfunction compileProjection(\n ast: QueryAst,\n dialect: ReturnType<typeof getDialect>,\n): SQL {\n // Check for selective projection first\n if (ast.selectiveFields && ast.selectiveFields.length > 0) {\n return compileSelectiveProjection(ast.selectiveFields, dialect, ast);\n }\n\n const fields = ast.projection.fields;\n\n if (fields.length === 0) {\n return sql.raw(\"*\");\n }\n\n const projectedFields = fields.map((f) => {\n const source = compileProjectedSource(f, dialect);\n // Quote the output name to preserve case in PostgreSQL\n // PostgreSQL converts unquoted identifiers to lowercase\n return sql`${source} AS ${quoteIdentifier(f.outputName)}`;\n });\n\n return sql.join(projectedFields, sql`, `);\n}\n\n/**\n * Compiles selective projection for optimized queries.\n *\n * Generates SQL that only extracts the specific fields needed,\n * rather than fetching the entire props blob. This enables\n * covered index usage when the selected fields are indexed.\n */\nfunction compileSelectiveProjection(\n fields: readonly SelectiveField[],\n dialect: ReturnType<typeof getDialect>,\n ast: QueryAst,\n): SQL {\n // Build a mapping from alias to CTE name\n // Start node: alias maps to cte_{alias}\n // Traversal nodes: nodeAlias maps to cte_{nodeAlias}\n // Traversal edges: edgeAlias maps to cte_{nodeAlias} (edge columns are in the traversal CTE)\n const aliasToCte = new Map<string, string>([\n [ast.start.alias, `cte_${ast.start.alias}`],\n ]);\n\n // Start node\n\n // Traversals\n for (const traversal of ast.traversals) {\n // Node alias maps to its own CTE\n aliasToCte.set(traversal.nodeAlias, `cte_${traversal.nodeAlias}`);\n // Edge alias maps to the traversal's CTE (which is named after the node)\n aliasToCte.set(traversal.edgeAlias, `cte_${traversal.nodeAlias}`);\n }\n\n const columns = fields.map((f) => {\n const cteAlias = aliasToCte.get(f.alias) ?? `cte_${f.alias}`;\n\n if (f.isSystemField) {\n // System fields: direct column reference from CTE\n // Map API field names to database column names\n const dbColumn =\n f.field === \"fromId\" ? \"from_id\"\n : f.field === \"toId\" ? \"to_id\"\n : f.field.startsWith(\"meta.\") ?\n // Convert camelCase meta fields to snake_case\n // e.g., \"meta.validFrom\" → \"valid_from\"\n f.field\n .slice(5)\n .replaceAll(/([A-Z])/g, \"_$1\")\n .toLowerCase()\n : f.field;\n\n return sql`${sql.raw(cteAlias)}.${sql.raw(`${f.alias}_${dbColumn}`)} AS ${quoteIdentifier(f.outputName)}`;\n }\n\n // Props fields: JSON extraction from the props column.\n // Use the dialect adapter to ensure a stable expression text (important for indexes).\n const propsColumn = `${f.alias}_props`;\n const column = sql`${sql.raw(cteAlias)}.${sql.raw(propsColumn)}`;\n const pointer = jsonPointer([f.field]);\n const extracted = compileSelectiveJsonValue(\n dialect,\n column,\n pointer,\n f.valueType,\n );\n return sql`${extracted} AS ${quoteIdentifier(f.outputName)}`;\n });\n\n return sql.join(columns, sql`, `);\n}\n\nfunction compileSelectiveJsonValue(\n dialect: ReturnType<typeof getDialect>,\n column: SQL,\n pointer: ReturnType<typeof jsonPointer>,\n valueType: SelectiveField[\"valueType\"],\n): SQL {\n switch (valueType) {\n case \"string\": {\n return dialect.jsonExtractText(column, pointer);\n }\n case \"number\": {\n return dialect.jsonExtractNumber(column, pointer);\n }\n case \"boolean\": {\n return dialect.jsonExtractBoolean(column, pointer);\n }\n case \"date\": {\n return dialect.jsonExtractDate(column, pointer);\n }\n case \"array\":\n case \"object\":\n case \"embedding\":\n case \"unknown\":\n case undefined: {\n return dialect.jsonExtract(column, pointer);\n }\n }\n}\n\n/**\n * Compiles the FROM clause with JOINs.\n *\n * The FROM clause starts from the start CTE and joins each traversal CTE.\n * Each traversal CTE contains a column for its join source's ID.\n * If a vector predicate is present, also joins the embeddings CTE.\n */\nfunction compileFromClause(\n ast: QueryAst,\n vectorPredicate?: VectorSimilarityPredicate,\n): SQL {\n const startAlias = ast.start.alias;\n\n // Start from the first CTE (start alias)\n const fromClause = sql`FROM cte_${sql.raw(startAlias)}`;\n\n const joins: SQL[] = [];\n\n // Build JOINs for each traversal\n for (const traversal of ast.traversals) {\n const cteAlias = `cte_${traversal.nodeAlias}`;\n const previousAlias = traversal.joinFromAlias;\n const joinType = traversal.optional ? \"LEFT JOIN\" : \"INNER JOIN\";\n // Each traversal CTE has a column for the previous alias's ID\n joins.push(\n sql`${sql.raw(joinType)} ${sql.raw(cteAlias)} ON ${sql.raw(cteAlias)}.${sql.raw(previousAlias)}_id = cte_${sql.raw(previousAlias)}.${sql.raw(previousAlias)}_id`,\n );\n }\n\n // Join embeddings CTE if vector similarity is used\n if (vectorPredicate) {\n const nodeAlias = vectorPredicate.field.alias;\n joins.push(\n sql`INNER JOIN cte_embeddings ON cte_embeddings.node_id = cte_${sql.raw(nodeAlias)}.${sql.raw(nodeAlias)}_id`,\n );\n }\n\n if (joins.length === 0) {\n return fromClause;\n }\n\n return sql`${fromClause} ${sql.join(joins, sql` `)}`;\n}\n\n/**\n * Compiles ORDER BY clause.\n */\nfunction compileOrderBy(\n ast: QueryAst,\n dialect: ReturnType<typeof getDialect>,\n): SQL | undefined {\n if (!ast.orderBy || ast.orderBy.length === 0) {\n return undefined;\n }\n\n const parts: SQL[] = [];\n\n for (const o of ast.orderBy) {\n const valueType = o.field.valueType;\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"Ordering by JSON arrays or objects is not supported\",\n );\n }\n const cteAlias = `cte_${o.field.alias}`;\n const field = compileFieldValue(o.field, dialect, valueType, cteAlias);\n const dir = sql.raw(o.direction.toUpperCase());\n const nulls = o.nulls ?? (o.direction === \"asc\" ? \"last\" : \"first\");\n const nullsDir = sql.raw(nulls === \"first\" ? \"DESC\" : \"ASC\");\n\n // Enforce consistent NULL ordering across dialects (SQLite differs from PostgreSQL by default).\n // We emulate NULLS FIRST/LAST using an `IS NULL` ordering prefix to avoid relying on dialect syntax.\n parts.push(sql`(${field} IS NULL) ${nullsDir}`, sql`${field} ${dir}`);\n }\n\n return sql`ORDER BY ${sql.join(parts, sql`, `)}`;\n}\n\n/**\n * Creates a unique key for a FieldRef to enable deduplication.\n * Includes jsonPointer to distinguish fields that share the same base path (e.g., \"props\").\n */\nfunction fieldRefKey(field: FieldRef): string {\n const pointer = field.jsonPointer ?? \"\";\n return `${field.alias}:${field.path.join(\".\")}:${pointer}`;\n}\n\n/**\n * Compiles GROUP BY clause.\n *\n * PostgreSQL requires all non-aggregated SELECT columns to appear in GROUP BY.\n * This function automatically includes:\n * 1. All non-aggregate projected fields from ast.projection (added first to ensure\n * GROUP BY expressions match SELECT expressions exactly)\n * 2. Any explicit GROUP BY fields from ast.groupBy not already in projection\n *\n * IMPORTANT: Projected fields are added first because:\n * - SELECT uses field refs from selectAggregate which may not have valueType set\n * - Explicit .groupBy() fields have valueType from schema introspection\n * - If GROUP BY uses different valueType than SELECT, PostgreSQL sees different expressions\n * - By preferring projected fields' valueType, GROUP BY matches SELECT exactly\n *\n * Uses compileFieldValue to properly extract JSON fields with json_extract,\n * ensuring GROUP BY operates on the same values as SELECT.\n */\nfunction compileGroupBy(\n ast: QueryAst,\n dialect: ReturnType<typeof getDialect>,\n): SQL | undefined {\n if (!ast.groupBy || ast.groupBy.fields.length === 0) {\n return undefined;\n }\n\n // Collect all fields that need to be in GROUP BY, deduplicating by key\n const seenKeys = new Set<string>();\n const allFields: FieldRef[] = [];\n\n // Add all non-aggregate projected fields FIRST\n // This ensures GROUP BY expressions use the same valueType as SELECT expressions\n // The field() helper used in selectAggregate doesn't set valueType, while\n // explicit .groupBy() calls set valueType from schema introspection\n for (const projectedField of ast.projection.fields) {\n if (projectedField.source.__type === \"field_ref\") {\n const key = fieldRefKey(projectedField.source);\n if (!seenKeys.has(key)) {\n seenKeys.add(key);\n allFields.push(projectedField.source);\n }\n }\n }\n\n // Add explicit GROUP BY fields that aren't already in projection\n // These might group by fields not in SELECT (unusual but valid SQL)\n for (const field of ast.groupBy.fields) {\n const key = fieldRefKey(field);\n if (!seenKeys.has(key)) {\n seenKeys.add(key);\n allFields.push(field);\n }\n }\n\n if (allFields.length === 0) {\n return undefined;\n }\n\n const parts = allFields.map((f) => {\n const cteAlias = `cte_${f.alias}`;\n // Use compileFieldValue to properly extract JSON fields\n return compileFieldValue(f, dialect, f.valueType, cteAlias);\n });\n\n return sql`GROUP BY ${sql.join(parts, sql`, `)}`;\n}\n\n/**\n * Compiles HAVING clause.\n */\nfunction compileHaving(\n ast: QueryAst,\n ctx: PredicateCompilerContext,\n): SQL | undefined {\n if (!ast.having) {\n return undefined;\n }\n\n const condition = compilePredicateExpression(ast.having, ctx);\n return sql`HAVING ${condition}`;\n}\n\n// compileLimitOffset removed - replaced by compileLimitOffsetWithOverride\n\n// ============================================================\n// Vector Similarity Compilation\n// ============================================================\n\n/**\n * Compiles a CTE for embedding similarity search.\n * This CTE selects from the embeddings table with distance calculation.\n */\nfunction compileEmbeddingsCte(\n vectorPredicate: VectorSimilarityPredicate,\n graphId: string,\n ctx: PredicateCompilerContext,\n): SQL {\n const { dialect } = ctx;\n const { field, queryEmbedding, metric, minScore } = vectorPredicate;\n\n // Get the field path from the JSON pointer (e.g., \"/embedding\")\n // The jsonPointer is already a string like \"/embedding\"\n const fieldPath =\n field.jsonPointer ? (field.jsonPointer as string)\n : field.path.length > 1 && field.path[0] === \"props\" ?\n `/${field.path.slice(1).join(\"/\")}`\n : `/${field.path.join(\"/\")}`;\n\n // Build distance expression\n const distanceExpr = dialect.vectorDistance(\n sql.raw(\"embedding\"),\n queryEmbedding,\n metric,\n );\n\n // Build WHERE conditions\n const conditions: SQL[] = [\n sql`graph_id = ${graphId}`,\n sql`field_path = ${fieldPath}`,\n ];\n\n // Add minScore filter if specified\n if (minScore !== undefined) {\n // minScore is similarity (1.0 = identical), convert to distance threshold\n // For cosine: distance = 1 - similarity, so threshold = 1 - minScore\n const threshold = 1 - minScore;\n conditions.push(sql`${distanceExpr} <= ${threshold}`);\n }\n\n return sql`\n cte_embeddings AS (\n SELECT\n node_id,\n ${distanceExpr} AS distance,\n (1.0 - ${distanceExpr}) AS score\n FROM ${ctx.schema.embeddingsTable}\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${distanceExpr} ASC\n )\n `;\n}\n\n/**\n * Compiles ORDER BY clause for vector similarity queries.\n * Orders by distance first, then any additional ordering from the AST.\n */\nfunction compileVectorOrderBy(\n _vectorPredicate: VectorSimilarityPredicate,\n ast: QueryAst,\n dialect: ReturnType<typeof getDialect>,\n): SQL {\n // Primary ordering: distance ascending (closest first)\n const distanceOrder = sql`cte_embeddings.distance ASC`;\n\n // Secondary ordering from AST\n const additionalOrders: SQL[] = [];\n if (ast.orderBy && ast.orderBy.length > 0) {\n for (const o of ast.orderBy) {\n const valueType = o.field.valueType;\n if (valueType === \"array\" || valueType === \"object\") {\n throw new UnsupportedPredicateError(\n \"Ordering by JSON arrays or objects is not supported\",\n );\n }\n const cteAlias = `cte_${o.field.alias}`;\n const field = compileFieldValue(o.field, dialect, valueType, cteAlias);\n const dir = sql.raw(o.direction.toUpperCase());\n // Use IS NULL emulation for cross-dialect NULL ordering (same as compileOrderBy)\n const nulls = o.nulls ?? (o.direction === \"asc\" ? \"last\" : \"first\");\n const nullsDir = sql.raw(nulls === \"first\" ? \"DESC\" : \"ASC\");\n additionalOrders.push(\n sql`(${field} IS NULL) ${nullsDir}`,\n sql`${field} ${dir}`,\n );\n }\n }\n\n const allOrders = [distanceOrder, ...additionalOrders];\n return sql`ORDER BY ${sql.join(allOrders, sql`, `)}`;\n}\n\n/**\n * Compiles LIMIT and OFFSET with optional limit override.\n */\nfunction compileLimitOffsetWithOverride(\n limit: number | undefined,\n offset: number | undefined,\n): SQL | undefined {\n const parts: SQL[] = [];\n\n if (limit !== undefined) {\n parts.push(sql`LIMIT ${limit}`);\n }\n if (offset !== undefined) {\n parts.push(sql`OFFSET ${offset}`);\n }\n\n return parts.length > 0 ? sql.join(parts, sql` `) : undefined;\n}\n","/**\n * Cursor encoding/decoding for keyset pagination.\n *\n * Cursors are opaque URL-safe base64-encoded JSON containing:\n * - Column values at cursor position\n * - Direction indicator\n * - Version for forward compatibility\n */\n\nimport { ValidationError } from \"../errors\";\nimport { type OrderSpec } from \"./ast\";\nimport { parseJsonPointer } from \"./json-pointer\";\n\n// ============================================================\n// Types\n// ============================================================\n\nconst CURSOR_VERSION = 1;\n\n/**\n * Internal cursor data structure.\n */\nexport type CursorData = Readonly<{\n /** Version for forward compatibility */\n v: number;\n /** Direction: 'f' = forward, 'b' = backward */\n d: \"f\" | \"b\";\n /** ORDER BY column values at cursor position */\n vals: readonly unknown[];\n /** Column identifiers for validation */\n cols: readonly string[];\n}>;\n\n// ============================================================\n// Encoding / Decoding\n// ============================================================\n\n/**\n * Encodes cursor data to a URL-safe base64 string.\n */\nexport function encodeCursor(data: CursorData): string {\n const json = JSON.stringify(data);\n // Use URL-safe base64: replace + with -, / with _, remove padding\n return btoa(json)\n .replaceAll(\"+\", \"-\")\n .replaceAll(\"/\", \"_\")\n .replace(/=+$/, \"\");\n}\n\n/**\n * Decodes a cursor string to cursor data.\n *\n * @throws ValidationError if cursor is invalid or incompatible\n */\nexport function decodeCursor(cursor: string): CursorData {\n try {\n // Restore standard base64\n let base64 = cursor.replaceAll(\"-\", \"+\").replaceAll(\"_\", \"/\");\n // Add padding if needed\n while (base64.length % 4) {\n base64 += \"=\";\n }\n const json = atob(base64);\n const raw = JSON.parse(json) as Record<string, unknown>;\n\n if (typeof raw.v !== \"number\" || raw.v > CURSOR_VERSION) {\n throw new ValidationError(\n `Unsupported cursor version: ${String(raw.v)}. Maximum supported: ${CURSOR_VERSION}`,\n {\n issues: [\n {\n path: \"cursor\",\n message: `Cursor version ${String(raw.v)} is not supported`,\n },\n ],\n },\n {\n suggestion: `This cursor was created with a newer version. Re-fetch the data to get a compatible cursor.`,\n },\n );\n }\n\n if (raw.d !== \"f\" && raw.d !== \"b\") {\n throw new ValidationError(`Invalid cursor direction: ${String(raw.d)}`, {\n issues: [\n {\n path: \"cursor\",\n message: `Direction must be \"f\" (forward) or \"b\" (backward)`,\n },\n ],\n });\n }\n\n if (!Array.isArray(raw.vals) || !Array.isArray(raw.cols)) {\n throw new ValidationError(\"Invalid cursor structure\", {\n issues: [\n {\n path: \"cursor\",\n message: \"Cursor must contain vals and cols arrays\",\n },\n ],\n });\n }\n\n if (raw.vals.length !== raw.cols.length) {\n throw new ValidationError(\"Cursor column count mismatch\", {\n issues: [\n {\n path: \"cursor\",\n message: `vals (${raw.vals.length}) and cols (${raw.cols.length}) must have same length`,\n },\n ],\n });\n }\n\n return {\n v: raw.v,\n d: raw.d,\n vals: raw.vals as readonly unknown[],\n cols: raw.cols as readonly string[],\n };\n } catch (error) {\n if (error instanceof ValidationError) {\n throw error;\n }\n throw new ValidationError(\n \"Invalid cursor format\",\n {\n issues: [{ path: \"cursor\", message: \"Failed to decode cursor\" }],\n },\n { cause: error },\n );\n }\n}\n\n// ============================================================\n// Cursor Building\n// ============================================================\n\n/**\n * Builds a column identifier from an order spec.\n *\n * Format: \"alias.fieldName\" for property fields, \"alias.path[0]...\" for system fields.\n * Handles two field ref formats:\n * 1. New format: path=[\"props\"], jsonPointer=\"/name\"\n * 2. Legacy format: path=[\"props\", \"name\"]\n *\n * In both cases, outputs flattened format \"p.name\" to match the flattened API.\n */\nexport function buildColumnId(spec: OrderSpec): string {\n const { alias, path, jsonPointer } = spec.field;\n\n // New format: path=[\"props\"] with jsonPointer=\"/fieldName\"\n // jsonPointer is a branded string like \"/name\" or \"/nested/field\"\n if (path.length === 1 && path[0] === \"props\" && jsonPointer) {\n const parts = (jsonPointer as string).split(\"/\").filter(Boolean);\n return `${alias}.${parts.join(\".\")}`;\n }\n\n // Legacy format: path=[\"props\", \"fieldName\", ...] without jsonPointer\n if (path.length >= 2 && path[0] === \"props\") {\n return `${alias}.${path.slice(1).join(\".\")}`;\n }\n\n // System fields (id, kind) or other paths\n return `${alias}.${path.join(\".\")}`;\n}\n\n/**\n * Extracts the value for a cursor column from a result row.\n *\n * The row can be in two formats:\n * 1. Raw database row with flat column names\n * 2. Mapped result with alias-keyed nested data\n *\n * For mapped results, we navigate through the path and then jsonPointer.\n */\nexport function extractCursorValue(\n row: Record<string, unknown>,\n spec: OrderSpec,\n): unknown {\n const { alias, path, jsonPointer } = spec.field;\n\n // Try alias-keyed format first (mapped results)\n let current: unknown = row[alias];\n if (current !== undefined) {\n // Follow path first (e.g., [\"props\"])\n for (const segment of path) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n\n const record = current as Record<string, unknown>;\n if (segment === \"props\" && !Object.hasOwn(record, segment)) {\n continue;\n }\n\n current = record[segment];\n }\n\n // Then follow jsonPointer if present (e.g., \"/name\")\n if (jsonPointer) {\n const segments = parseJsonPointer(jsonPointer);\n for (const segment of segments) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n }\n\n return current;\n }\n\n // Fallback: try direct path lookup for raw rows\n current = row;\n for (const segment of path) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== \"object\") return undefined;\n current = (current as Record<string, unknown>)[segment];\n }\n return current;\n}\n\n/**\n * Builds a cursor from a result row and order specifications.\n *\n * @param row - The result row (mapped with alias-keyed data)\n * @param orderSpecs - The ORDER BY specifications\n * @param direction - Pagination direction\n * @returns Encoded cursor string\n */\nexport function buildCursorFromRow(\n row: Record<string, unknown>,\n orderSpecs: readonly OrderSpec[],\n direction: \"f\" | \"b\",\n): string {\n const vals = orderSpecs.map((spec) => extractCursorValue(row, spec));\n const cols = orderSpecs.map((spec) => buildColumnId(spec));\n\n return encodeCursor({\n v: CURSOR_VERSION,\n d: direction,\n vals,\n cols,\n });\n}\n\n/**\n * Validates that cursor columns match the query's ORDER BY columns.\n *\n * @throws ValidationError if columns don't match\n */\nexport function validateCursorColumns(\n cursorData: CursorData,\n orderSpecs: readonly OrderSpec[],\n): void {\n const expectedCols = orderSpecs.map((spec) => buildColumnId(spec));\n\n if (cursorData.cols.length !== expectedCols.length) {\n throw new ValidationError(\n `Cursor has ${cursorData.cols.length} columns but query has ${expectedCols.length} ORDER BY columns`,\n {\n issues: [\n {\n path: \"cursor\",\n message: `Column count mismatch: cursor has ${cursorData.cols.length}, query has ${expectedCols.length}`,\n },\n ],\n },\n {\n suggestion: `The cursor was created with a different ORDER BY. Re-fetch with consistent ordering.`,\n },\n );\n }\n\n for (const [index, expectedCol] of expectedCols.entries()) {\n if (cursorData.cols[index] !== expectedCol) {\n throw new ValidationError(\n `Cursor column mismatch at position ${index}: expected \"${expectedCol}\", got \"${cursorData.cols[index]}\"`,\n {\n issues: [\n {\n path: \"cursor\",\n message: `Column ${index}: expected \"${expectedCol}\", got \"${cursorData.cols[index]}\"`,\n },\n ],\n },\n {\n suggestion: `The cursor was created with a different ORDER BY. Re-fetch with consistent ordering.`,\n },\n );\n }\n }\n}\n","import { nanoid } from \"nanoid\";\n\n/**\n * ID generation utilities.\n *\n * Default implementation uses nanoid.\n * Benefits:\n * - URL-safe\n * - Compact (21 characters by default)\n * - Secure random generation\n */\n\n/**\n * Generates a new unique ID.\n */\nexport function generateId(): string {\n return nanoid();\n}\n\n/**\n * ID generator function type.\n */\nexport type IdGenerator = () => string;\n\n/**\n * Default ID generator configuration.\n */\nexport type IdConfig = Readonly<{\n /** Generator for node IDs */\n nodeIdGenerator: IdGenerator;\n /** Generator for edge IDs */\n edgeIdGenerator: IdGenerator;\n}>;\n","/**\n * Path utilities for variable-length traversal results.\n *\n * SQLite doesn't support native arrays, so paths are stored as pipe-delimited\n * strings: \"|id1|id2|id3|\". PostgreSQL returns native arrays.\n */\n\n/**\n * Parses a SQLite path string into an array of node IDs.\n *\n * @param path - Pipe-delimited path string like \"|id1|id2|id3|\"\n * @returns Array of node IDs like [\"id1\", \"id2\", \"id3\"]\n *\n * @example\n * parseSqlitePath(\"|abc|def|ghi|\") // [\"abc\", \"def\", \"ghi\"]\n * parseSqlitePath(\"|single|\") // [\"single\"]\n * parseSqlitePath(\"||\") // []\n */\nexport function parseSqlitePath(path: string): readonly string[] {\n if (!path || path === \"||\") return [];\n\n // Remove leading and trailing pipes, then split\n const trimmed = path.slice(1, -1);\n if (trimmed === \"\") return [];\n\n return trimmed.split(\"|\");\n}\n\n/**\n * Type guard to check if a value is a SQLite path string.\n * SQLite paths start and end with \"|\".\n */\nexport function isSqlitePath(value: unknown): value is string {\n return (\n typeof value === \"string\" && value.startsWith(\"|\") && value.endsWith(\"|\")\n );\n}\n\n/**\n * Normalizes a path value to an array.\n * - If already an array (PostgreSQL), returns as-is\n * - If a SQLite path string, parses it\n * - Otherwise returns empty array\n */\nexport function normalizePath(value: unknown): readonly string[] {\n if (Array.isArray(value)) {\n return value as string[];\n }\n if (isSqlitePath(value)) {\n return parseSqlitePath(value);\n }\n return [];\n}\n","/**\n * Result type for error handling without exceptions.\n * Use at service boundaries and for operations that can fail.\n */\nexport type Result<T, E = Error> =\n | Readonly<{ success: true; data: T }>\n | Readonly<{ success: false; error: E }>;\n\n/**\n * Creates a successful result.\n */\nexport function ok<T = undefined>(data?: T): Result<T, never> {\n return { success: true, data: data as T };\n}\n\n/**\n * Creates a failed result.\n */\nexport function err<E>(error: E): Result<never, E> {\n return { success: false, error };\n}\n\n/**\n * Unwraps a result, throwing if it's an error.\n */\nexport function unwrap<T, E>(result: Result<T, E>): T {\n if (result.success) {\n return result.data;\n }\n throw result.error;\n}\n\n/**\n * Unwraps a result or returns a default value.\n */\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\n if (result.success) {\n return result.data;\n }\n return defaultValue;\n}\n\n/**\n * Type guard to check if result is successful.\n */\nexport function isOk<T, E>(\n result: Result<T, E>,\n): result is { success: true; data: T } {\n return result.success;\n}\n\n/**\n * Type guard to check if result is an error.\n */\nexport function isErr<T, E>(\n result: Result<T, E>,\n): result is { success: false; error: E } {\n return !result.success;\n}\n","/**\n * Result mapping utilities for query execution.\n *\n * Transforms raw database rows into typed SelectContext and result objects.\n */\nimport { type NodeType } from \"../../core/types\";\nimport { parseSqlitePath } from \"../../utils\";\nimport { type Traversal } from \"../ast\";\nimport type {\n AliasMap,\n EdgeAliasMap,\n QueryBuilderState,\n SelectableEdge,\n SelectableNode,\n SelectContext,\n} from \"../builder/types\";\nimport { type SqlDialect } from \"../compiler/index\";\n\n/**\n * Transforms SQLite path columns from pipe-delimited strings to arrays.\n * PostgreSQL returns native arrays, so no transformation needed.\n */\nexport function transformPathColumns(\n rows: readonly Record<string, unknown>[],\n state: QueryBuilderState,\n dialect: SqlDialect,\n): readonly Record<string, unknown>[] {\n if (dialect !== \"sqlite\") return rows;\n\n // Find path columns from variable-length traversals\n const pathAliases: string[] = [];\n for (const t of state.traversals) {\n if (t.variableLength?.collectPath) {\n pathAliases.push(t.variableLength.pathAlias ?? `${t.nodeAlias}_path`);\n }\n }\n\n if (pathAliases.length === 0) return rows;\n\n return rows.map((row) => {\n let transformed: Record<string, unknown> | undefined;\n for (const alias of pathAliases) {\n const value = row[alias];\n if (typeof value === \"string\") {\n transformed ??= { ...row };\n transformed[alias] = parseSqlitePath(value);\n }\n }\n return transformed ?? row;\n });\n}\n\n// Reserved keys that cannot be overwritten by user props\nconst RESERVED_NODE_KEYS = new Set([\"id\", \"kind\", \"meta\"]);\nconst RESERVED_EDGE_KEYS = new Set([\"id\", \"kind\", \"fromId\", \"toId\", \"meta\"]);\n\n/**\n * Converts null to undefined for consistent typing.\n * Database backends return null for missing values, but our types use undefined.\n */\nfunction nullToUndefined<T>(value: T | null | undefined): T | undefined {\n return value === null ? undefined : value;\n}\n\n/**\n * Assigns props to a target object, excluding reserved keys to prevent runtime\n * collisions with system fields (id, kind, meta, etc).\n */\nfunction assignPropsExcludingReserved(\n target: Record<string, unknown>,\n props: Record<string, unknown>,\n reservedKeys: Set<string>,\n): void {\n for (const [key, value] of Object.entries(props)) {\n if (!reservedKeys.has(key)) {\n target[key] = value;\n }\n }\n}\n\n/**\n * Builds a SelectableNode from row data for a given alias.\n *\n * Props are spread at top level, metadata goes under `meta`.\n * Reserved keys (id, kind, meta) in props are filtered out to prevent collisions.\n * Null values from database are normalized to undefined.\n */\nexport function buildSelectableNode(\n row: Record<string, unknown>,\n alias: string,\n): SelectableNode<NodeType> {\n const id = row[`${alias}_id`] as string;\n const kind = row[`${alias}_kind`] as string;\n const propsRaw: unknown = row[`${alias}_props`];\n const rawProps: Record<string, unknown> =\n typeof propsRaw === \"string\" ?\n (JSON.parse(propsRaw) as Record<string, unknown>)\n : ((propsRaw as Record<string, unknown> | undefined) ?? {});\n\n // Metadata columns - these are now always projected in CTEs\n // Normalize null → undefined for optional fields\n const version = row[`${alias}_version`] as number;\n const validFrom = nullToUndefined(\n row[`${alias}_valid_from`] as string | null,\n );\n const validTo = nullToUndefined(row[`${alias}_valid_to`] as string | null);\n const createdAt = row[`${alias}_created_at`] as string;\n const updatedAt = row[`${alias}_updated_at`] as string;\n const deletedAt = nullToUndefined(\n row[`${alias}_deleted_at`] as string | null,\n );\n\n const result: Record<string, unknown> = {\n id,\n kind,\n meta: {\n version,\n validFrom,\n validTo,\n createdAt,\n updatedAt,\n deletedAt,\n },\n };\n\n assignPropsExcludingReserved(result, rawProps, RESERVED_NODE_KEYS);\n return result as SelectableNode<NodeType>;\n}\n\n/**\n * Builds a SelectableNode from row data, returning undefined when the node\n * doesn't exist (for optional traversals with LEFT JOIN).\n */\nfunction buildSelectableNodeOrUndefined(\n row: Record<string, unknown>,\n alias: string,\n): SelectableNode<NodeType> | undefined {\n const id = row[`${alias}_id`] as string | null | undefined;\n if (id === null || id === undefined) {\n return undefined;\n }\n return buildSelectableNode(row, alias);\n}\n\n/**\n * Builds a SelectableEdge from row data for a given edge alias.\n *\n * Props are spread at top level, metadata goes under `meta`.\n * Reserved keys (id, kind, fromId, toId, meta) in props are filtered out to prevent collisions.\n * Null values from database are normalized to undefined.\n * Returns undefined if the edge doesn't exist (for optional traversals with LEFT JOIN).\n */\nfunction buildSelectableEdge(\n row: Record<string, unknown>,\n alias: string,\n): SelectableEdge | undefined {\n const id = row[`${alias}_id`] as string | null | undefined;\n\n // For optional traversals, edge may be null (LEFT JOIN)\n if (id === null || id === undefined) {\n return undefined;\n }\n\n const kind = row[`${alias}_kind`] as string;\n const fromId = row[`${alias}_from_id`] as string;\n const toId = row[`${alias}_to_id`] as string;\n\n const propsRaw: unknown = row[`${alias}_props`];\n const rawProps: Record<string, unknown> =\n typeof propsRaw === \"string\" ?\n (JSON.parse(propsRaw) as Record<string, unknown>)\n : ((propsRaw as Record<string, unknown> | undefined) ?? {});\n\n // Metadata columns - these are always projected in traversal CTEs\n // Normalize null → undefined for optional fields\n const validFrom = nullToUndefined(\n row[`${alias}_valid_from`] as string | null,\n );\n const validTo = nullToUndefined(row[`${alias}_valid_to`] as string | null);\n const createdAt = row[`${alias}_created_at`] as string;\n const updatedAt = row[`${alias}_updated_at`] as string;\n const deletedAt = nullToUndefined(\n row[`${alias}_deleted_at`] as string | null,\n );\n\n const result: Record<string, unknown> = {\n id,\n kind,\n fromId,\n toId,\n meta: {\n validFrom,\n validTo,\n createdAt,\n updatedAt,\n deletedAt,\n },\n };\n\n assignPropsExcludingReserved(result, rawProps, RESERVED_EDGE_KEYS);\n return result as SelectableEdge;\n}\n\n/**\n * Builds a SelectContext from a raw database row.\n * Includes both node aliases and edge aliases.\n */\nexport function buildSelectContext<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n>(\n row: Record<string, unknown>,\n startAlias: string,\n traversals: readonly Traversal[],\n): SelectContext<Aliases, EdgeAliases> {\n // Build the start node as initial context entry\n const context: Record<\n string,\n SelectableNode<NodeType> | SelectableEdge | undefined\n > = {\n [startAlias]: buildSelectableNode(row, startAlias),\n };\n\n // Build traversal nodes and edges\n for (const traversal of traversals) {\n const nodeAlias = traversal.nodeAlias;\n const edgeAlias = traversal.edgeAlias;\n\n // Add node\n context[nodeAlias] =\n traversal.optional ?\n buildSelectableNodeOrUndefined(row, nodeAlias)\n : buildSelectableNode(row, nodeAlias);\n\n // Add edge (may be undefined for optional traversals)\n context[edgeAlias] = buildSelectableEdge(row, edgeAlias);\n }\n\n return context as SelectContext<Aliases, EdgeAliases>;\n}\n\n/**\n * Maps raw database rows to typed results using a select function.\n */\nexport function mapResults<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n R,\n>(\n rows: readonly Record<string, unknown>[],\n startAlias: string,\n traversals: readonly Traversal[],\n selectFunction: (context: SelectContext<Aliases, EdgeAliases>) => R,\n): readonly R[] {\n return rows.map((row) => {\n const context = buildSelectContext<Aliases, EdgeAliases>(\n row,\n startAlias,\n traversals,\n );\n return selectFunction(context);\n });\n}\n","/**\n * Cursor-based pagination utilities.\n *\n * Provides pagination logic for ExecutableQuery including cursor predicate\n * building and result page construction.\n */\nimport {\n type FieldRef,\n type NodePredicate,\n type OrderSpec,\n type PredicateExpression,\n} from \"../ast\";\nimport type {\n AliasMap,\n EdgeAliasMap,\n PaginatedResult,\n PaginateOptions,\n QueryBuilderState,\n SelectContext,\n StreamOptions,\n} from \"../builder/types\";\nimport {\n buildCursorFromRow,\n type CursorData,\n decodeCursor,\n validateCursorColumns,\n} from \"../cursor\";\n\n/**\n * Validates pagination parameters.\n */\nexport function validatePaginationParams(state: QueryBuilderState): void {\n if (state.orderBy.length === 0) {\n throw new Error(\n \"Cursor pagination requires ORDER BY. Add .orderBy() before .paginate()\",\n );\n }\n}\n\n/**\n * Parses pagination options into internal format.\n */\nexport function parsePaginateOptions(options: PaginateOptions): {\n isBackward: boolean;\n limit: number;\n cursor: string | undefined;\n cursorData: CursorData | undefined;\n orderBy: readonly OrderSpec[];\n} {\n const isBackward = options.last !== undefined || options.before !== undefined;\n const limit = options.first ?? options.last ?? 20;\n const cursor = options.after ?? options.before;\n\n let cursorData: CursorData | undefined;\n if (cursor) {\n cursorData = decodeCursor(cursor);\n }\n\n return { isBackward, limit, cursor, cursorData, orderBy: [] };\n}\n\n/**\n * Validates cursor data against ORDER BY columns.\n */\nexport function validateCursor(\n cursorData: CursorData | undefined,\n orderBy: readonly OrderSpec[],\n): void {\n if (cursorData) {\n validateCursorColumns(cursorData, orderBy);\n }\n}\n\n/**\n * Adjusts ORDER BY for backward pagination (reverses directions).\n */\nexport function adjustOrderByForDirection(\n orderBy: readonly OrderSpec[],\n direction: \"forward\" | \"backward\",\n): readonly OrderSpec[] {\n if (direction === \"forward\") {\n return orderBy;\n }\n return orderBy.map((spec) => ({\n ...spec,\n direction: spec.direction === \"asc\" ? (\"desc\" as const) : (\"asc\" as const),\n }));\n}\n\n/**\n * Builds a cursor predicate for keyset pagination.\n * Generates (col1 > val1) OR (col1 = val1 AND col2 > val2) OR ... pattern.\n */\nexport function buildCursorPredicate(\n cursorData: CursorData,\n orderBy: readonly OrderSpec[],\n direction: \"forward\" | \"backward\",\n targetAlias: string,\n): NodePredicate {\n const values = cursorData.vals;\n\n // Build OR of progressively longer AND conditions\n const orConditions: PredicateExpression[] = [];\n\n for (let index = 0; index < orderBy.length; index++) {\n const andConditions: PredicateExpression[] = [];\n\n // All preceding columns must be equal\n for (let index_ = 0; index_ < index; index_++) {\n const spec = orderBy[index_]!;\n const value = values[index_];\n andConditions.push(buildEqualityPredicate(spec.field, value));\n }\n\n // Current column uses comparison\n const currentSpec = orderBy[index]!;\n const currentValue = values[index];\n const isAsc = currentSpec.direction === \"asc\";\n const isForward = direction === \"forward\";\n // ASC + forward = gt | ASC + backward = lt\n // DESC + forward = lt | DESC + backward = gt\n const op = isAsc === isForward ? \"gt\" : \"lt\";\n\n andConditions.push(\n buildComparisonPredicate(currentSpec.field, op, currentValue),\n );\n\n // Combine with AND\n if (andConditions.length === 1) {\n orConditions.push(andConditions[0]!);\n } else {\n orConditions.push({ __type: \"and\", predicates: andConditions });\n }\n }\n\n // Combine with OR\n const expression: PredicateExpression =\n orConditions.length === 1 ?\n orConditions[0]!\n : { __type: \"or\", predicates: orConditions };\n\n return {\n targetAlias,\n expression,\n };\n}\n\n/**\n * Builds an equality predicate for cursor pagination.\n */\nfunction buildEqualityPredicate(\n field: FieldRef,\n value: unknown,\n): PredicateExpression {\n if (value === null || value === undefined) {\n return { __type: \"null_check\", op: \"isNull\", field };\n }\n return {\n __type: \"comparison\",\n op: \"eq\",\n left: field,\n right: { __type: \"literal\", value: value as string | number | boolean },\n };\n}\n\n/**\n * Builds a comparison predicate for cursor pagination.\n */\nfunction buildComparisonPredicate(\n field: FieldRef,\n op: \"gt\" | \"lt\",\n value: unknown,\n): PredicateExpression {\n if (value === null || value === undefined) {\n // For null, the comparison depends on NULLS FIRST/LAST behavior\n // For simplicity, treat as IS NOT NULL for forward, fail for backward\n return { __type: \"null_check\", op: \"isNotNull\", field };\n }\n return {\n __type: \"comparison\",\n op,\n left: field,\n right: { __type: \"literal\", value: value as string | number | boolean },\n };\n}\n\n/**\n * Builds cursor string from a context row.\n */\nexport function buildCursorFromContext<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n>(\n context: SelectContext<Aliases, EdgeAliases>,\n orderBy: readonly OrderSpec[],\n direction: \"f\" | \"b\",\n): string {\n return buildCursorFromRow(\n context as unknown as Record<string, unknown>,\n orderBy,\n direction,\n );\n}\n\n/**\n * Constructs a PaginatedResult from query results.\n */\nexport function buildPaginatedResult<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n R,\n>(\n data: readonly R[],\n orderedRows: readonly Record<string, unknown>[],\n orderBy: readonly OrderSpec[],\n limit: number,\n hasMore: boolean,\n isBackward: boolean,\n cursor: string | undefined,\n buildContext: (\n row: Record<string, unknown>,\n ) => SelectContext<Aliases, EdgeAliases>,\n): PaginatedResult<R> {\n let nextCursor: string | undefined;\n let previousCursor: string | undefined;\n\n if (orderedRows.length > 0) {\n const firstRow = orderedRows[0]!;\n const lastRow = orderedRows.at(-1)!;\n\n // Build cursors using mapped result context\n const firstContext = buildContext(firstRow);\n const lastContext = buildContext(lastRow);\n\n // Extract values for ORDER BY columns from the context\n previousCursor = buildCursorFromContext(firstContext, orderBy, \"b\");\n nextCursor = buildCursorFromContext(lastContext, orderBy, \"f\");\n }\n\n return {\n data,\n nextCursor: hasMore || isBackward ? nextCursor : undefined,\n prevCursor:\n cursor !== undefined || (isBackward && hasMore) ?\n previousCursor\n : undefined,\n hasNextPage: isBackward ? cursor !== undefined : hasMore,\n hasPrevPage: isBackward ? hasMore : cursor !== undefined,\n };\n}\n\n/**\n * Creates an async iterable that streams results using cursor pagination.\n */\nexport async function* createStreamIterable<R>(\n batchSize: number,\n paginate: (options: PaginateOptions) => Promise<PaginatedResult<R>>,\n): AsyncGenerator<R> {\n let cursor: string | undefined;\n let hasMore = true;\n\n while (hasMore) {\n const options: PaginateOptions =\n cursor ? { first: batchSize, after: cursor } : { first: batchSize };\n const page = await paginate(options);\n\n for (const item of page.data) {\n yield item;\n }\n\n cursor = page.nextCursor;\n hasMore = page.hasNextPage;\n }\n}\n\n/**\n * Gets default stream options.\n */\nexport function getStreamBatchSize(options?: StreamOptions): number {\n return options?.batchSize ?? 1000;\n}\n","/**\n * Field Tracking for Smart Select Optimization.\n *\n * Provides infrastructure for tracking which fields are accessed during\n * a select callback, enabling the query compiler to selectively project\n * only those fields instead of fetching the full props blob.\n */\n\nimport { EDGE_META_KEYS, NODE_META_KEYS } from \"../../system-fields\";\nimport { type SelectiveField, type ValueType } from \"../ast\";\nimport { type QueryBuilderState } from \"../builder/types\";\nimport {\n type FieldTypeInfo,\n type SchemaIntrospector,\n} from \"../schema-introspector\";\n\n// ============================================================\n// Types\n// ============================================================\n\ntype TrackingValueMode = \"falsy\" | \"truthy\" | \"max\";\n\ntype AccessedField = Readonly<{\n alias: string;\n field: string;\n isSystemField: boolean;\n}>;\n\nexport type TrackingContextOptions = Readonly<{\n schemaIntrospector: SchemaIntrospector;\n mode: TrackingValueMode;\n /**\n * When \"absent\", optional traversal aliases are set to undefined to\n * encourage exploring fallback branches (e.g., `ctx.friend ? ... : ...`).\n */\n optionalTraversalAliases: \"present\" | \"absent\";\n}>;\n\n// ============================================================\n// Constants\n// ============================================================\n\nconst OBJECT_PROTOTYPE_PROPERTIES = new Set<string>([\n \"__proto__\",\n \"constructor\",\n \"hasOwnProperty\",\n \"isPrototypeOf\",\n \"propertyIsEnumerable\",\n \"toLocaleString\",\n \"toString\",\n \"valueOf\",\n]);\n\n// ============================================================\n// FieldAccessTracker\n// ============================================================\n\nexport class FieldAccessTracker {\n readonly #fields = new Map<string, AccessedField>();\n\n record(alias: string, field: string, isSystemField: boolean): void {\n const key = `${alias}\\u0000${field}`;\n this.#fields.set(key, { alias, field, isSystemField });\n }\n\n getAccessedFields(): readonly AccessedField[] {\n return [...this.#fields.values()];\n }\n}\n\n// ============================================================\n// Tracking Context Creation\n// ============================================================\n\nexport function createTrackingContext(\n state: QueryBuilderState,\n tracker: FieldAccessTracker,\n options: TrackingContextOptions,\n): Record<string, unknown> {\n const context: Record<string, unknown> = {\n [state.startAlias]: createNodeTrackingProxy(\n state.startAlias,\n state.startKinds,\n tracker,\n options,\n ),\n };\n\n for (const traversal of state.traversals) {\n const optionalAbsent =\n options.optionalTraversalAliases === \"absent\" && traversal.optional;\n\n context[traversal.nodeAlias] =\n optionalAbsent ? undefined : (\n createNodeTrackingProxy(\n traversal.nodeAlias,\n traversal.nodeKinds,\n tracker,\n options,\n )\n );\n\n context[traversal.edgeAlias] =\n optionalAbsent ? undefined : (\n createEdgeTrackingProxy(\n traversal.edgeAlias,\n traversal.edgeKinds,\n tracker,\n options,\n )\n );\n }\n\n return context;\n}\n\nfunction createNodeTrackingProxy(\n alias: string,\n kindNames: readonly string[],\n tracker: FieldAccessTracker,\n options: TrackingContextOptions,\n): unknown {\n return new Proxy(\n {},\n {\n get: (_, property: string | symbol) => {\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n if (OBJECT_PROTOTYPE_PROPERTIES.has(property)) {\n if (property === \"constructor\") return Object;\n if (property === \"__proto__\") return Object.prototype;\n return Reflect.get(Object.prototype, property) as unknown;\n }\n\n if (property === \"id\" || property === \"kind\") {\n tracker.record(alias, property, true);\n return getPlaceholderForSystemField(property, options.mode);\n }\n\n if (property === \"meta\") {\n for (const key of NODE_META_KEYS) {\n tracker.record(alias, `meta.${key}`, true);\n }\n return buildNodeMetaPlaceholder(options.mode);\n }\n\n tracker.record(alias, property, false);\n const typeInfo = options.schemaIntrospector.getSharedFieldTypeInfo(\n kindNames,\n property,\n );\n return getPlaceholderForTypeInfo(typeInfo, options.mode);\n },\n },\n );\n}\n\nfunction createEdgeTrackingProxy(\n alias: string,\n edgeKindNames: readonly string[],\n tracker: FieldAccessTracker,\n options: TrackingContextOptions,\n): unknown {\n return new Proxy(\n {},\n {\n get: (_, property: string | symbol) => {\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n if (OBJECT_PROTOTYPE_PROPERTIES.has(property)) {\n if (property === \"constructor\") return Object;\n if (property === \"__proto__\") return Object.prototype;\n return Reflect.get(Object.prototype, property) as unknown;\n }\n\n if (\n property === \"id\" ||\n property === \"kind\" ||\n property === \"fromId\" ||\n property === \"toId\"\n ) {\n tracker.record(alias, property, true);\n return getPlaceholderForSystemField(property, options.mode);\n }\n\n if (property === \"meta\") {\n for (const key of EDGE_META_KEYS) {\n tracker.record(alias, `meta.${key}`, true);\n }\n return buildEdgeMetaPlaceholder(options.mode);\n }\n\n tracker.record(alias, property, false);\n const typeInfo = options.schemaIntrospector.getSharedEdgeFieldTypeInfo(\n edgeKindNames,\n property,\n );\n return getPlaceholderForTypeInfo(typeInfo, options.mode);\n },\n },\n );\n}\n\n// ============================================================\n// Selective Field Construction\n// ============================================================\n\ntype BuildSelectiveFieldsOptions = Readonly<{\n state: QueryBuilderState;\n schemaIntrospector: SchemaIntrospector;\n}>;\n\nexport function buildSelectiveFields(\n accessedFields: readonly AccessedField[],\n options?: BuildSelectiveFieldsOptions,\n): readonly SelectiveField[] {\n const aliasInfo = options ? buildAliasKindMap(options.state) : undefined;\n\n return accessedFields\n .map((access) => {\n const base: SelectiveField = {\n alias: access.alias,\n field: access.field,\n outputName: `${access.alias}_${access.field}`,\n isSystemField: access.isSystemField,\n };\n\n if (!options || access.isSystemField) {\n return base;\n }\n\n const info = aliasInfo?.get(access.alias);\n if (!info) {\n return base;\n }\n\n const typeInfo =\n info.kind === \"node\" ?\n options.schemaIntrospector.getSharedFieldTypeInfo(\n info.kindNames,\n access.field,\n )\n : options.schemaIntrospector.getSharedEdgeFieldTypeInfo(\n info.kindNames,\n access.field,\n );\n\n return {\n ...base,\n valueType: typeInfo?.valueType,\n };\n })\n .toSorted((a, b) => {\n const aliasCompare = a.alias.localeCompare(b.alias);\n if (aliasCompare !== 0) return aliasCompare;\n return a.field.localeCompare(b.field);\n });\n}\n\ntype AliasKind = \"node\" | \"edge\";\n\ntype AliasKindInfo = Readonly<{\n kind: AliasKind;\n kindNames: readonly string[];\n}>;\n\nfunction buildAliasKindMap(\n state: QueryBuilderState,\n): ReadonlyMap<string, AliasKindInfo> {\n const map = new Map<string, AliasKindInfo>([\n [\n state.startAlias,\n {\n kind: \"node\",\n kindNames: state.startKinds,\n },\n ],\n ]);\n\n for (const traversal of state.traversals) {\n map.set(traversal.nodeAlias, {\n kind: \"node\",\n kindNames: traversal.nodeKinds,\n });\n map.set(traversal.edgeAlias, {\n kind: \"edge\",\n kindNames: traversal.edgeKinds,\n });\n }\n\n return map;\n}\n\n// ============================================================\n// Placeholder Values\n// ============================================================\n\nfunction getPlaceholderForSystemField(\n field: string,\n mode: TrackingValueMode,\n): unknown {\n if (\n field === \"id\" ||\n field === \"kind\" ||\n field === \"fromId\" ||\n field === \"toId\"\n ) {\n return mode === \"falsy\" ? \"\" : \"x\";\n }\n return undefined;\n}\n\nfunction buildNodeMetaPlaceholder(mode: TrackingValueMode): Readonly<{\n version: number;\n validFrom: string | undefined;\n validTo: string | undefined;\n createdAt: string;\n updatedAt: string;\n deletedAt: string | undefined;\n}> {\n const empty = mode === \"falsy\";\n return {\n version: empty ? 0 : 1,\n validFrom: empty ? undefined : \"2020-01-01T00:00:00.000Z\",\n validTo: undefined,\n createdAt: \"2020-01-01T00:00:00.000Z\",\n updatedAt: \"2020-01-01T00:00:00.000Z\",\n deletedAt: undefined,\n };\n}\n\nfunction buildEdgeMetaPlaceholder(mode: TrackingValueMode): Readonly<{\n validFrom: string | undefined;\n validTo: string | undefined;\n createdAt: string;\n updatedAt: string;\n deletedAt: string | undefined;\n}> {\n const empty = mode === \"falsy\";\n return {\n validFrom: empty ? undefined : \"2020-01-01T00:00:00.000Z\",\n validTo: undefined,\n createdAt: \"2020-01-01T00:00:00.000Z\",\n updatedAt: \"2020-01-01T00:00:00.000Z\",\n deletedAt: undefined,\n };\n}\n\nfunction getPlaceholderForTypeInfo(\n typeInfo: FieldTypeInfo | undefined,\n mode: TrackingValueMode,\n): unknown {\n if (!typeInfo) {\n return undefined;\n }\n\n return getPlaceholderForValueType(typeInfo.valueType, mode);\n}\n\nfunction getPlaceholderForValueType(\n valueType: ValueType,\n mode: TrackingValueMode,\n): unknown {\n switch (valueType) {\n case \"string\":\n case \"date\": {\n if (mode === \"falsy\") return \"\";\n if (mode === \"max\") return \"active\";\n return \"x\";\n }\n case \"number\": {\n if (mode === \"falsy\") return 0;\n if (mode === \"max\") return 100;\n return 1;\n }\n case \"boolean\": {\n return mode !== \"falsy\";\n }\n case \"array\":\n case \"embedding\": {\n return [];\n }\n case \"object\": {\n return {};\n }\n case \"unknown\": {\n return undefined;\n }\n }\n}\n","/**\n * Value decoding utilities for query execution.\n *\n * Selective projection queries return values extracted directly from JSON\n * columns. Some dialects return booleans/numbers as different JS types, and\n * arrays/objects may be returned as JSON text. This module normalizes those\n * values based on schema type information.\n */\n\nimport { type ValueType } from \"../ast\";\nimport { type FieldTypeInfo } from \"../schema-introspector\";\n\nexport function nullToUndefined(value: unknown): unknown {\n return value === null ? undefined : value;\n}\n\nexport function decodeSelectedValue(\n value: unknown,\n typeInfo: FieldTypeInfo | undefined,\n): unknown {\n const normalized = nullToUndefined(value);\n if (normalized === undefined) return undefined;\n\n if (typeInfo === undefined) {\n return normalized;\n }\n\n return decodeByValueType(normalized, typeInfo.valueType);\n}\n\nfunction decodeByValueType(value: unknown, valueType: ValueType): unknown {\n switch (valueType) {\n case \"boolean\": {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"number\") return value !== 0;\n if (typeof value === \"string\") {\n if (value === \"0\") return false;\n if (value === \"1\") return true;\n if (value.toLowerCase() === \"true\") return true;\n if (value.toLowerCase() === \"false\") return false;\n }\n return Boolean(value);\n }\n case \"number\": {\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const parsed = Number(value);\n return Number.isNaN(parsed) ? value : parsed;\n }\n return value;\n }\n case \"array\":\n case \"object\":\n case \"embedding\": {\n if (typeof value !== \"string\") return value;\n const trimmed = value.trim();\n const looksJson = trimmed.startsWith(\"[\") || trimmed.startsWith(\"{\");\n if (!looksJson) return value;\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n return value;\n }\n }\n case \"string\":\n case \"date\":\n case \"unknown\": {\n return value;\n }\n }\n}\n","/**\n * Selective Result Mapping for Smart Select Optimization.\n *\n * Converts rows returned from a selective projection query into the\n * SelectContext expected by the select callback, while guarding against\n * missing fields and unsupported \"return whole node/edge\" selections.\n */\n\nimport { type SelectiveField } from \"../ast\";\nimport type {\n AliasMap,\n EdgeAliasMap,\n QueryBuilderState,\n SelectContext,\n} from \"../builder/types\";\nimport {\n type FieldTypeInfo,\n type SchemaIntrospector,\n} from \"../schema-introspector\";\nimport { decodeSelectedValue, nullToUndefined } from \"./value-decoder\";\n\n// ============================================================\n// Errors\n// ============================================================\n\nexport class MissingSelectiveFieldError extends Error {\n readonly alias: string;\n readonly field: string;\n\n constructor(alias: string, field: string) {\n super(`Smart select missing field: ${alias}.${field}`);\n this.alias = alias;\n this.field = field;\n }\n}\n\n// ============================================================\n// Internal Types\n// ============================================================\n\ntype AliasKind = \"node\" | \"edge\";\n\ntype SystemFieldPlan = Readonly<{\n field: string;\n outputName: string;\n}>;\n\ntype MetaFieldPlan = Readonly<{\n metaKey: string;\n outputName: string;\n}>;\n\ntype PropsFieldPlan = Readonly<{\n field: string;\n outputName: string;\n typeInfo: FieldTypeInfo | undefined;\n}>;\n\ntype AliasPlan = Readonly<{\n alias: string;\n kind: AliasKind;\n optional: boolean;\n systemFields: readonly SystemFieldPlan[];\n metaFields: readonly MetaFieldPlan[];\n propsFields: readonly PropsFieldPlan[];\n idOutputName: string | undefined;\n metaOutputNames: ReadonlySet<string>;\n propsOutputNames: ReadonlySet<string>;\n systemOutputNames: ReadonlySet<string>;\n}>;\n\n// ============================================================\n// Marker for \"whole alias object\" detection\n// ============================================================\n\nconst SELECTABLE_ALIAS_MARKER = Symbol(\"selectable_alias_marker\");\n\ntype SelectableAliasMarker = Readonly<{\n alias: string;\n kind: AliasKind;\n}>;\n\nfunction isSelectableAliasObject(\n value: unknown,\n): value is SelectableAliasMarker {\n return (\n typeof value === \"object\" &&\n value !== null &&\n SELECTABLE_ALIAS_MARKER in value\n );\n}\n\nfunction containsSelectableAliasObject(value: unknown): boolean {\n const visited = new WeakSet<object>();\n\n function walk(current: unknown): boolean {\n if (isSelectableAliasObject(current)) return true;\n\n if (Array.isArray(current)) {\n for (const item of current) {\n if (walk(item)) return true;\n }\n return false;\n }\n\n if (typeof current !== \"object\" || current === null) {\n return false;\n }\n\n if (visited.has(current)) return false;\n visited.add(current);\n\n for (const value of Object.values(current)) {\n if (walk(value)) return true;\n }\n return false;\n }\n\n return walk(value);\n}\n\n// ============================================================\n// Public API\n// ============================================================\n\nexport function mapSelectiveResults<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n R,\n>(\n rows: readonly Record<string, unknown>[],\n state: QueryBuilderState,\n selectiveFields: readonly SelectiveField[],\n schemaIntrospector: SchemaIntrospector,\n selectFunction: (context: SelectContext<Aliases, EdgeAliases>) => R,\n): readonly R[] {\n const plans = buildAliasPlans(state, selectiveFields, schemaIntrospector);\n\n return rows.map((row) => {\n const context = buildSelectiveContext<Aliases, EdgeAliases>(row, plans);\n const result = selectFunction(context);\n\n // Returning whole alias objects is not supported by selective projection.\n // If it happens, fall back to the full fetch path.\n if (containsSelectableAliasObject(result)) {\n throw new MissingSelectiveFieldError(\n state.startAlias,\n \"whole node/edge selection\",\n );\n }\n\n return result;\n });\n}\n\n// ============================================================\n// Plan Construction\n// ============================================================\n\nfunction buildAliasPlans(\n state: QueryBuilderState,\n selectiveFields: readonly SelectiveField[],\n schemaIntrospector: SchemaIntrospector,\n): readonly AliasPlan[] {\n const aliasInfo = new Map<\n string,\n Readonly<{\n kind: AliasKind;\n optional: boolean;\n kindNames: readonly string[];\n }>\n >([\n [\n state.startAlias,\n {\n kind: \"node\",\n optional: false,\n kindNames: state.startKinds,\n },\n ],\n ]);\n\n for (const traversal of state.traversals) {\n aliasInfo.set(traversal.nodeAlias, {\n kind: \"node\",\n optional: traversal.optional,\n kindNames: traversal.nodeKinds,\n });\n aliasInfo.set(traversal.edgeAlias, {\n kind: \"edge\",\n optional: traversal.optional,\n kindNames: traversal.edgeKinds,\n });\n }\n\n const fieldsByAlias = new Map<string, SelectiveField[]>();\n for (const field of selectiveFields) {\n const existing = fieldsByAlias.get(field.alias) ?? [];\n existing.push(field);\n fieldsByAlias.set(field.alias, existing);\n }\n\n const plans: AliasPlan[] = [];\n\n for (const [alias, info] of aliasInfo.entries()) {\n const fields = fieldsByAlias.get(alias) ?? [];\n\n const systemFields: SystemFieldPlan[] = [];\n const metaFields: MetaFieldPlan[] = [];\n const propsFields: PropsFieldPlan[] = [];\n\n for (const field of fields) {\n if (field.isSystemField) {\n if (field.field.startsWith(\"meta.\")) {\n metaFields.push({\n metaKey: field.field.slice(5),\n outputName: field.outputName,\n });\n } else {\n systemFields.push({\n field: field.field,\n outputName: field.outputName,\n });\n }\n } else {\n const typeInfo =\n info.kind === \"node\" ?\n schemaIntrospector.getSharedFieldTypeInfo(\n info.kindNames,\n field.field,\n )\n : schemaIntrospector.getSharedEdgeFieldTypeInfo(\n info.kindNames,\n field.field,\n );\n\n propsFields.push({\n field: field.field,\n outputName: field.outputName,\n typeInfo,\n });\n }\n }\n\n const idOutputName =\n systemFields.find((f) => f.field === \"id\")?.outputName ?? undefined;\n\n plans.push({\n alias,\n kind: info.kind,\n optional: info.optional,\n systemFields,\n metaFields,\n propsFields,\n idOutputName,\n metaOutputNames: new Set(metaFields.map((f) => f.outputName)),\n propsOutputNames: new Set(propsFields.map((f) => f.outputName)),\n systemOutputNames: new Set(systemFields.map((f) => f.outputName)),\n });\n }\n\n // Keep plan iteration stable.\n return plans.toSorted((a, b) => a.alias.localeCompare(b.alias));\n}\n\n// ============================================================\n// Context Building\n// ============================================================\n\nfunction buildSelectiveContext<\n Aliases extends AliasMap,\n EdgeAliases extends EdgeAliasMap,\n>(\n row: Record<string, unknown>,\n plans: readonly AliasPlan[],\n): SelectContext<Aliases, EdgeAliases> {\n const context: Record<string, unknown> = {};\n\n for (const plan of plans) {\n const value =\n plan.optional && plan.idOutputName !== undefined ?\n buildOptionalAliasValue(row, plan)\n : buildRequiredAliasValue(row, plan);\n context[plan.alias] = value;\n }\n\n return context as SelectContext<Aliases, EdgeAliases>;\n}\n\nfunction buildOptionalAliasValue(\n row: Record<string, unknown>,\n plan: AliasPlan,\n): unknown {\n const idValue = row[plan.idOutputName!];\n\n if (idValue === null || idValue === undefined) {\n return undefined;\n }\n return buildRequiredAliasValue(row, plan);\n}\n\nfunction buildRequiredAliasValue(\n row: Record<string, unknown>,\n plan: AliasPlan,\n): unknown {\n const base: Record<string, unknown> = {\n [SELECTABLE_ALIAS_MARKER]: {\n alias: plan.alias,\n kind: plan.kind,\n } satisfies SelectableAliasMarker,\n };\n\n for (const field of plan.systemFields) {\n base[field.field] = nullToUndefined(row[field.outputName]);\n }\n\n if (plan.metaFields.length > 0) {\n const meta: Record<string, unknown> = {};\n for (const field of plan.metaFields) {\n meta[field.metaKey] = nullToUndefined(row[field.outputName]);\n }\n base.meta = createGuardedProxy(meta, `${plan.alias}.meta`);\n }\n\n for (const field of plan.propsFields) {\n const decoded = decodeSelectedValue(row[field.outputName], field.typeInfo);\n base[field.field] = decoded;\n }\n\n return createGuardedProxy(base, plan.alias);\n}\n\nfunction createGuardedProxy(\n target: Record<string, unknown>,\n debugPath: string,\n): unknown {\n return new Proxy(target, {\n get: (object, property: string | symbol, receiver) => {\n if (typeof property === \"symbol\") {\n return Reflect.get(object, property, receiver) as unknown;\n }\n\n if (property === \"then\" || property === \"toJSON\") {\n return;\n }\n\n if (property in object) {\n return Reflect.get(object, property, receiver);\n }\n\n if (property in Object.prototype) {\n return Reflect.get(Object.prototype, property, receiver) as unknown;\n }\n\n throw new MissingSelectiveFieldError(debugPath, property);\n },\n });\n}\n","/**\n * Predicate builders for TypeGraph queries.\n *\n * Provides a fluent API for building type-safe predicates.\n */\nimport {\n type ArrayOp,\n type ArrayPredicate,\n type BetweenPredicate,\n type ComparisonOp,\n type ComparisonPredicate,\n type ExistsSubquery,\n type FieldRef,\n type InSubquery,\n type LiteralValue,\n type NullPredicate,\n type ObjectOp,\n type ObjectPredicate,\n type PredicateExpression,\n type QueryAst,\n type StringOp,\n type StringPredicate,\n type ValueType,\n type VectorMetricType,\n type VectorSimilarityPredicate,\n} from \"./ast\";\nimport { resolveFieldTypeInfoAtJsonPointer } from \"./field-type-info\";\nimport {\n joinJsonPointers,\n type JsonPointer,\n jsonPointer,\n type JsonPointerInput,\n type JsonPointerSegment,\n normalizeJsonPointer,\n type ResolveJsonPointer,\n type ResolveJsonPointerSegments,\n} from \"./json-pointer\";\nimport { type FieldTypeInfo } from \"./schema-introspector\";\n\n// ============================================================\n// Predicate Builder\n// ============================================================\n\n/**\n * A chainable predicate that can be combined with AND/OR.\n */\nexport type Predicate = Readonly<{\n __expr: PredicateExpression;\n and: (other: Predicate) => Predicate;\n or: (other: Predicate) => Predicate;\n not: () => Predicate;\n}>;\n\n/**\n * Creates a predicate wrapper with chainable methods.\n */\nfunction predicate(expr: PredicateExpression): Predicate {\n return {\n __expr: expr,\n and: (other: Predicate): Predicate =>\n predicate({\n __type: \"and\",\n predicates: [expr, other.__expr],\n }),\n or: (other: Predicate): Predicate =>\n predicate({\n __type: \"or\",\n predicates: [expr, other.__expr],\n }),\n not: (): Predicate =>\n predicate({\n __type: \"not\",\n predicate: expr,\n }),\n };\n}\n\n// ============================================================\n// Field Builder\n// ============================================================\n\n/**\n * A typed field builder for creating predicates.\n */\ntype FieldBuilder<T> =\n [T] extends [string] ? StringFieldBuilder\n : [T] extends [number] ? NumberFieldBuilder\n : [T] extends [boolean] ? BooleanFieldBuilder\n : [T] extends [Date] ? DateFieldBuilder\n : [T] extends [readonly (infer U)[]] ? ArrayFieldBuilder<U>\n : [T] extends [Record<string, unknown>] ? ObjectFieldBuilder<T>\n : BaseFieldBuilder;\n\n/**\n * Base field operations available on all types.\n */\ntype BaseFieldBuilder = Readonly<{\n eq: (value: unknown) => Predicate;\n neq: (value: unknown) => Predicate;\n isNull: () => Predicate;\n isNotNull: () => Predicate;\n in: (values: readonly unknown[]) => Predicate;\n notIn: (values: readonly unknown[]) => Predicate;\n}>;\n\n/**\n * String-specific field operations.\n */\ntype StringFieldBuilder = BaseFieldBuilder &\n Readonly<{\n contains: (pattern: string) => Predicate;\n startsWith: (pattern: string) => Predicate;\n endsWith: (pattern: string) => Predicate;\n like: (pattern: string) => Predicate;\n ilike: (pattern: string) => Predicate;\n }>;\n\n/**\n * Number-specific field operations.\n */\ntype NumberFieldBuilder = BaseFieldBuilder &\n Readonly<{\n gt: (value: number) => Predicate;\n gte: (value: number) => Predicate;\n lt: (value: number) => Predicate;\n lte: (value: number) => Predicate;\n between: (lower: number, upper: number) => Predicate;\n }>;\n\n/**\n * Boolean-specific field operations.\n */\ntype BooleanFieldBuilder = BaseFieldBuilder;\n\n/**\n * Date-specific field operations.\n */\ntype DateFieldBuilder = BaseFieldBuilder &\n Readonly<{\n gt: (value: Date | string) => Predicate;\n gte: (value: Date | string) => Predicate;\n lt: (value: Date | string) => Predicate;\n lte: (value: Date | string) => Predicate;\n between: (lower: Date | string, upper: Date | string) => Predicate;\n }>;\n\ntype ScalarValue = string | number | boolean | Date;\n\ntype ArrayPredicateOps<T> =\n [T] extends [ScalarValue] ?\n Readonly<{\n /** Check if array contains a specific value */\n contains: (value: T) => Predicate;\n /** Check if array contains all specified values */\n containsAll: (values: readonly T[]) => Predicate;\n /** Check if array contains any of the specified values (overlaps) */\n containsAny: (values: readonly T[]) => Predicate;\n }>\n : Readonly<Record<string, never>>;\n\n/**\n * Array-specific field operations.\n */\ntype ArrayFieldBuilder<T = unknown> = BaseFieldBuilder &\n Readonly<{\n /** Check if array is empty */\n isEmpty: () => Predicate;\n /** Check if array is not empty */\n isNotEmpty: () => Predicate;\n /** Check if array length equals a value */\n lengthEq: (length: number) => Predicate;\n /** Check if array length is greater than a value */\n lengthGt: (length: number) => Predicate;\n /** Check if array length is greater than or equal to a value */\n lengthGte: (length: number) => Predicate;\n /** Check if array length is less than a value */\n lengthLt: (length: number) => Predicate;\n /** Check if array length is less than or equal to a value */\n lengthLte: (length: number) => Predicate;\n }> &\n ArrayPredicateOps<T>;\n\n/**\n * Object/JSON-specific field operations.\n */\ntype ResolvedPointerInput<T, Pointer> =\n Pointer extends string ? ResolveJsonPointer<T, Pointer>\n : Pointer extends readonly JsonPointerSegment[] ?\n ResolveJsonPointerSegments<T, Pointer>\n : unknown;\n\n/**\n * Resolves the type of a nested key access on an object type.\n * Returns ObjectFieldBuilder for nested objects, FieldBuilder for scalars.\n */\ntype NestedFieldBuilder<T, K extends keyof T> =\n NonNullable<T[K]> extends Record<string, unknown> ?\n ObjectFieldBuilder<NonNullable<T[K]>>\n : FieldBuilder<T[K]>;\n\ntype ObjectFieldBuilder<\n T extends Record<string, unknown> = Record<string, unknown>,\n> = BaseFieldBuilder &\n Readonly<{\n /** Access a nested field by key for fluent chaining */\n get: <K extends keyof T & string>(key: K) => NestedFieldBuilder<T, K>;\n /** Check if object has a specific key at root level */\n hasKey: (key: string) => Predicate;\n /** Check if object has a nested path (JSON Pointer) */\n hasPath: <P extends JsonPointerInput<T>>(pointer: P) => Predicate;\n /** Check if value at path equals a value */\n pathEquals: <P extends JsonPointerInput<T>>(\n pointer: P,\n value: string | number | boolean | Date,\n ) => Predicate;\n /** Check if value at path (array) contains a value */\n pathContains: <P extends JsonPointerInput<T>>(\n pointer: P,\n value: string | number | boolean | Date,\n ) => Predicate;\n /** Check if value at path is null */\n pathIsNull: <P extends JsonPointerInput<T>>(pointer: P) => Predicate;\n /** Check if value at path is not null */\n pathIsNotNull: <P extends JsonPointerInput<T>>(pointer: P) => Predicate;\n /** Access a nested field to get a typed field builder */\n field: <P extends JsonPointerInput<T>>(\n pointer: P,\n ) => FieldBuilder<ResolvedPointerInput<T, P>>;\n }>;\n\n/**\n * Options for the similarTo method.\n */\nexport type SimilarToOptions = Readonly<{\n /** Similarity metric to use. Default: \"cosine\" */\n metric?: VectorMetricType;\n /**\n * Minimum similarity score to include results.\n * For cosine: 0-1 where 1 is identical.\n * For L2: maximum distance to include.\n * For inner_product: minimum inner product value.\n */\n minScore?: number;\n}>;\n\n/**\n * Embedding-specific field operations for vector similarity search.\n */\ntype EmbeddingFieldBuilder = BaseFieldBuilder &\n Readonly<{\n /**\n * Find nodes with similar embeddings.\n * Returns results ordered by similarity (most similar first).\n *\n * @param queryEmbedding - The embedding vector to compare against\n * @param k - Maximum number of results to return (top-k)\n * @param options - Optional configuration (metric, minScore)\n *\n * @example\n * ```typescript\n * store.query()\n * .from(\"Document\", \"d\")\n * .whereNode(\"d\", (d) =>\n * d.embedding.similarTo(queryVector, 10, { metric: \"cosine\" })\n * )\n * .select((ctx) => ({ doc: ctx.d }))\n * .execute()\n * ```\n */\n similarTo: (\n queryEmbedding: readonly number[],\n k: number,\n options?: SimilarToOptions,\n ) => Predicate;\n }>;\n\n// ============================================================\n// Field Builder Factory\n// ============================================================\n\n/**\n * Creates a field reference.\n */\ntype FieldRefOptions = Readonly<{\n jsonPointer?: JsonPointer | undefined;\n valueType?: ValueType | undefined;\n elementType?: ValueType | undefined;\n}>;\n\nexport function fieldRef(\n alias: string,\n path: readonly string[],\n options?: FieldRefOptions,\n): FieldRef {\n return {\n __type: \"field_ref\",\n alias,\n path,\n ...(options?.jsonPointer !== undefined && {\n jsonPointer: options.jsonPointer,\n }),\n ...(options?.valueType !== undefined && { valueType: options.valueType }),\n ...(options?.elementType !== undefined && {\n elementType: options.elementType,\n }),\n };\n}\n\nfunction coerceLiteralValue(value: unknown): string | number | boolean | Date {\n if (value instanceof Date) {\n return value;\n }\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n return value;\n }\n throw new Error(`Unsupported literal value type: ${typeof value}`);\n}\n\nfunction inferLiteralValueType(value: string | number | boolean): ValueType {\n if (typeof value === \"string\") {\n return \"string\";\n }\n if (typeof value === \"number\") {\n return \"number\";\n }\n return \"boolean\";\n}\n\n/**\n * Creates a literal value.\n */\nfunction literal(value: string | number | boolean | Date): LiteralValue {\n if (value instanceof Date) {\n return { __type: \"literal\", value: value.toISOString(), valueType: \"date\" };\n }\n const valueType = inferLiteralValueType(value);\n return {\n __type: \"literal\",\n value,\n valueType,\n };\n}\n\n/**\n * Creates a comparison predicate.\n */\nfunction comparison(\n op: ComparisonOp,\n field: FieldRef,\n value: unknown,\n): Predicate {\n const coercedValue = coerceLiteralValue(value);\n const expr: ComparisonPredicate = {\n __type: \"comparison\",\n op,\n left: field,\n right: literal(coercedValue),\n };\n return predicate(expr);\n}\n\n/**\n * Creates an IN comparison predicate.\n */\nfunction inComparison(\n op: \"in\" | \"notIn\",\n field: FieldRef,\n values: readonly unknown[],\n): Predicate {\n const literals = values.map((value) => literal(coerceLiteralValue(value)));\n const expr: ComparisonPredicate = {\n __type: \"comparison\",\n op,\n left: field,\n right: literals,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a string operation predicate.\n */\nfunction stringOp(op: StringOp, field: FieldRef, pattern: string): Predicate {\n const expr: StringPredicate = {\n __type: \"string_op\",\n op,\n field,\n pattern,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a null check predicate.\n */\nfunction nullCheck(op: \"isNull\" | \"isNotNull\", field: FieldRef): Predicate {\n const expr: NullPredicate = {\n __type: \"null_check\",\n op,\n field,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a between predicate.\n */\nfunction between(\n field: FieldRef,\n lower: string | number | boolean | Date,\n upper: string | number | boolean | Date,\n): Predicate {\n const expr: BetweenPredicate = {\n __type: \"between\",\n field,\n lower: literal(lower),\n upper: literal(upper),\n };\n return predicate(expr);\n}\n\n/**\n * Creates a base field builder with common operations.\n */\nfunction baseFieldBuilder(field: FieldRef): BaseFieldBuilder {\n return {\n eq: (value) => comparison(\"eq\", field, value),\n neq: (value) => comparison(\"neq\", field, value),\n isNull: () => nullCheck(\"isNull\", field),\n isNotNull: () => nullCheck(\"isNotNull\", field),\n in: (values) => inComparison(\"in\", field, values),\n notIn: (values) => inComparison(\"notIn\", field, values),\n };\n}\n\n/**\n * Creates a string field builder.\n */\nexport function stringField(field: FieldRef): StringFieldBuilder {\n return {\n ...baseFieldBuilder(field),\n contains: (pattern) => stringOp(\"contains\", field, pattern),\n startsWith: (pattern) => stringOp(\"startsWith\", field, pattern),\n endsWith: (pattern) => stringOp(\"endsWith\", field, pattern),\n like: (pattern) => stringOp(\"like\", field, pattern),\n ilike: (pattern) => stringOp(\"ilike\", field, pattern),\n };\n}\n\n/**\n * Creates a number field builder.\n */\nexport function numberField(field: FieldRef): NumberFieldBuilder {\n return {\n ...baseFieldBuilder(field),\n gt: (value) => comparison(\"gt\", field, value),\n gte: (value) => comparison(\"gte\", field, value),\n lt: (value) => comparison(\"lt\", field, value),\n lte: (value) => comparison(\"lte\", field, value),\n between: (lower, upper) => between(field, lower, upper),\n };\n}\n\n/**\n * Creates a date field builder.\n */\nexport function dateField(field: FieldRef): DateFieldBuilder {\n return {\n ...baseFieldBuilder(field),\n gt: (value) => comparison(\"gt\", field, value),\n gte: (value) => comparison(\"gte\", field, value),\n lt: (value) => comparison(\"lt\", field, value),\n lte: (value) => comparison(\"lte\", field, value),\n between: (lower, upper) => between(field, lower, upper),\n };\n}\n\n/**\n * Creates a base field builder (for booleans, enums, and unknown types).\n * Only provides the fundamental operations: eq, neq, isNull, isNotNull, in, notIn.\n */\nexport function baseField(field: FieldRef): BaseFieldBuilder {\n return baseFieldBuilder(field);\n}\n\n/**\n * Creates an array operation predicate.\n */\nfunction arrayOp(\n op: ArrayOp,\n field: FieldRef,\n values?: readonly unknown[],\n length?: number,\n): Predicate {\n const expr: ArrayPredicate = {\n __type: \"array_op\",\n op,\n field,\n ...(values !== undefined && {\n values: values.map((value) => literal(coerceLiteralValue(value))),\n }),\n ...(length !== undefined && { length }),\n };\n return predicate(expr);\n}\n\n/**\n * Creates an array field builder.\n */\nexport function arrayField<T = unknown>(field: FieldRef): ArrayFieldBuilder<T> {\n // The type assertion is needed because ArrayFieldBuilder conditionally includes\n // contains/containsAll/containsAny based on whether T extends ScalarValue.\n // At runtime we always provide them - they just won't type-check if T isn't scalar.\n return {\n ...baseFieldBuilder(field),\n contains: (value: T) => arrayOp(\"contains\", field, [value]),\n containsAll: (values: readonly T[]) =>\n arrayOp(\"containsAll\", field, values),\n containsAny: (values: readonly T[]) =>\n arrayOp(\"containsAny\", field, values),\n isEmpty: () => arrayOp(\"isEmpty\", field),\n isNotEmpty: () => arrayOp(\"isNotEmpty\", field),\n lengthEq: (length: number) => arrayOp(\"lengthEq\", field, undefined, length),\n lengthGt: (length: number) => arrayOp(\"lengthGt\", field, undefined, length),\n lengthGte: (length: number) =>\n arrayOp(\"lengthGte\", field, undefined, length),\n lengthLt: (length: number) => arrayOp(\"lengthLt\", field, undefined, length),\n lengthLte: (length: number) =>\n arrayOp(\"lengthLte\", field, undefined, length),\n } as unknown as ArrayFieldBuilder<T>;\n}\n\n/**\n * Creates a vector similarity predicate.\n */\nfunction vectorSimilarity(\n field: FieldRef,\n queryEmbedding: readonly number[],\n limit: number,\n options?: SimilarToOptions,\n): Predicate {\n const expr: VectorSimilarityPredicate = {\n __type: \"vector_similarity\",\n field,\n queryEmbedding,\n metric: options?.metric ?? \"cosine\",\n limit,\n ...(options?.minScore !== undefined && { minScore: options.minScore }),\n };\n return predicate(expr);\n}\n\n/**\n * Creates an embedding field builder for vector similarity search.\n */\nexport function embeddingField(field: FieldRef): EmbeddingFieldBuilder {\n return {\n ...baseFieldBuilder(field),\n similarTo: (queryEmbedding, k, options) =>\n vectorSimilarity(field, queryEmbedding, k, options),\n };\n}\n\nfunction buildFieldBuilderForTypeInfo(\n field: FieldRef,\n typeInfo: FieldTypeInfo | undefined,\n): BaseFieldBuilder {\n if (!typeInfo) {\n return baseField(field);\n }\n\n switch (typeInfo.valueType) {\n case \"string\": {\n return stringField(field);\n }\n case \"number\": {\n return numberField(field);\n }\n case \"boolean\": {\n return baseField(field);\n }\n case \"date\": {\n return dateField(field);\n }\n case \"array\": {\n return arrayField(field);\n }\n case \"object\": {\n return objectField(field, { typeInfo });\n }\n case \"embedding\": {\n return embeddingField(field);\n }\n case \"unknown\": {\n return baseField(field);\n }\n }\n}\n\nfunction resolvePointerTypeInfo(\n typeInfo: FieldTypeInfo | undefined,\n pointer: JsonPointer,\n): FieldTypeInfo | undefined {\n return resolveFieldTypeInfoAtJsonPointer(typeInfo, pointer);\n}\n\n/**\n * Creates an object operation predicate.\n */\ntype ObjectPredicateOptions = Readonly<{\n valueType?: ValueType;\n elementType?: ValueType;\n}>;\n\nfunction objectOp(\n op: ObjectOp,\n field: FieldRef,\n pointer: JsonPointer,\n value?: unknown,\n options?: ObjectPredicateOptions,\n): Predicate {\n const expr: ObjectPredicate = {\n __type: \"object_op\",\n op,\n field,\n pointer,\n ...(value !== undefined && {\n value: literal(coerceLiteralValue(value)),\n }),\n ...(options?.valueType !== undefined && { valueType: options.valueType }),\n ...(options?.elementType !== undefined && {\n elementType: options.elementType,\n }),\n };\n return predicate(expr);\n}\n\n/**\n * Creates an object/JSON field builder.\n */\ntype ObjectFieldOptions = Readonly<{\n typeInfo?: FieldTypeInfo;\n}>;\n\nexport function objectField<\n T extends Record<string, unknown> = Record<string, unknown>,\n>(field: FieldRef, options?: ObjectFieldOptions): ObjectFieldBuilder<T> {\n const basePointer = field.jsonPointer;\n\n return {\n ...baseFieldBuilder(field),\n get: <K extends keyof T & string>(key: K) => {\n const pointer = jsonPointer([key]);\n const nestedPointer = joinJsonPointers(basePointer, pointer);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, pointer);\n const nestedRef = fieldRef(field.alias, field.path, {\n jsonPointer: nestedPointer,\n ...(resolved?.valueType !== undefined && {\n valueType: resolved.valueType,\n }),\n ...(resolved?.elementType !== undefined && {\n elementType: resolved.elementType,\n }),\n });\n return buildFieldBuilderForTypeInfo(nestedRef, resolved) as ReturnType<\n ObjectFieldBuilder<T>[\"get\"]\n >;\n },\n hasKey: (key) => {\n const pointer = jsonPointer([key]);\n resolvePointerTypeInfo(options?.typeInfo, pointer);\n return objectOp(\"hasKey\", field, pointer);\n },\n hasPath: <P extends JsonPointerInput<T>>(pointer: P) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n resolvePointerTypeInfo(options?.typeInfo, normalized);\n return objectOp(\"hasPath\", field, normalized);\n },\n pathEquals: <P extends JsonPointerInput<T>>(\n pointer: P,\n value: string | number | boolean | Date,\n ) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n if (\n resolved &&\n (resolved.valueType === \"array\" || resolved.valueType === \"object\")\n ) {\n throw new Error(\"pathEquals is only supported for scalar JSON values\");\n }\n const predicateOptions: ObjectPredicateOptions | undefined =\n resolved?.valueType === undefined ?\n undefined\n : { valueType: resolved.valueType };\n return objectOp(\"pathEquals\", field, normalized, value, predicateOptions);\n },\n pathContains: <P extends JsonPointerInput<T>>(\n pointer: P,\n value: string | number | boolean | Date,\n ) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n if (resolved && resolved.valueType !== \"array\") {\n throw new Error(\"pathContains is only supported for JSON array values\");\n }\n const predicateOptions: ObjectPredicateOptions | undefined =\n resolved?.elementType === undefined ?\n undefined\n : { elementType: resolved.elementType };\n return objectOp(\n \"pathContains\",\n field,\n normalized,\n value,\n predicateOptions,\n );\n },\n pathIsNull: <P extends JsonPointerInput<T>>(pointer: P) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n const predicateOptions: ObjectPredicateOptions | undefined =\n resolved?.valueType === undefined ?\n undefined\n : { valueType: resolved.valueType };\n return objectOp(\n \"pathIsNull\",\n field,\n normalized,\n undefined,\n predicateOptions,\n );\n },\n pathIsNotNull: <P extends JsonPointerInput<T>>(pointer: P) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n const predicateOptions: ObjectPredicateOptions | undefined =\n resolved?.valueType === undefined ?\n undefined\n : { valueType: resolved.valueType };\n return objectOp(\n \"pathIsNotNull\",\n field,\n normalized,\n undefined,\n predicateOptions,\n );\n },\n field: <P extends JsonPointerInput<T>>(pointer: P) => {\n const normalized = normalizeJsonPointer(pointer as JsonPointerInput<T>);\n const nestedPointer = joinJsonPointers(basePointer, normalized);\n const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);\n const nestedRef = fieldRef(field.alias, field.path, {\n jsonPointer: nestedPointer,\n ...(resolved?.valueType !== undefined && {\n valueType: resolved.valueType,\n }),\n ...(resolved?.elementType !== undefined && {\n elementType: resolved.elementType,\n }),\n });\n return buildFieldBuilderForTypeInfo(nestedRef, resolved) as FieldBuilder<\n ResolvedPointerInput<T, P>\n >;\n },\n };\n}\n\n// ============================================================\n// Subquery Predicates\n// ============================================================\n\n/**\n * Creates an EXISTS subquery predicate.\n * Returns true if the subquery returns at least one row.\n *\n * @param subquery - The subquery AST to check for existence\n *\n * @example\n * ```typescript\n * // Find persons who have at least one order\n * query\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", () =>\n * exists(\n * query.from(\"Order\", \"o\")\n * .whereNode(\"o\", (o) => o.customerId.eq(field(\"p.id\")))\n * .select((ctx) => ({ id: ctx.o.id }))\n * .toAst()\n * )\n * )\n * ```\n */\nexport function exists(subquery: QueryAst): Predicate {\n const expr: ExistsSubquery = {\n __type: \"exists\",\n subquery,\n negated: false,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a NOT EXISTS subquery predicate.\n * Returns true if the subquery returns no rows.\n *\n * @param subquery - The subquery AST to check for non-existence\n */\nexport function notExists(subquery: QueryAst): Predicate {\n const expr: ExistsSubquery = {\n __type: \"exists\",\n subquery,\n negated: true,\n };\n return predicate(expr);\n}\n\n/**\n * Creates an IN subquery predicate.\n * Returns true if the field value is in the subquery results.\n *\n * @param field - The field to check\n * @param subquery - The subquery AST that returns a single column\n *\n * @example\n * ```typescript\n * // Find persons whose ID is in the VIP list\n * query\n * .from(\"Person\", \"p\")\n * .where(() =>\n * inSubquery(\n * fieldRef(\"p\", [\"id\"]),\n * query.from(\"VIPMember\", \"v\")\n * .select({ id: field(\"v.personId\") })\n * .toAst()\n * )\n * )\n * ```\n */\nexport function inSubquery(field: FieldRef, subquery: QueryAst): Predicate {\n const expr: InSubquery = {\n __type: \"in_subquery\",\n field,\n subquery,\n negated: false,\n };\n return predicate(expr);\n}\n\n/**\n * Creates a NOT IN subquery predicate.\n * Returns true if the field value is not in the subquery results.\n *\n * @param field - The field to check\n * @param subquery - The subquery AST that returns a single column\n */\nexport function notInSubquery(field: FieldRef, subquery: QueryAst): Predicate {\n const expr: InSubquery = {\n __type: \"in_subquery\",\n field,\n subquery,\n negated: true,\n };\n return predicate(expr);\n}\n","/**\n * AST Builder utilities for query construction.\n *\n * Provides shared functions for building QueryAst objects from builder state.\n */\nimport {\n type GroupBySpec,\n type OrderSpec,\n type PredicateExpression,\n type QueryAst,\n} from \"../ast\";\nimport type { QueryBuilderConfig, QueryBuilderState } from \"./types\";\n\n/**\n * Builds a QueryAst from builder config and state.\n *\n * This is shared by ExecutableQuery and ExecutableAggregateQuery to avoid\n * duplicating the AST construction logic.\n */\nexport function buildQueryAst(\n config: QueryBuilderConfig,\n state: QueryBuilderState,\n): QueryAst {\n const temporalMode: { mode: typeof state.temporalMode; asOf?: string } = {\n mode: state.temporalMode,\n };\n if (state.asOf !== undefined) {\n temporalMode.asOf = state.asOf;\n }\n\n const ast: QueryAst = {\n graphId: config.graphId,\n start: {\n alias: state.startAlias,\n kinds: state.startKinds,\n includeSubClasses: state.includeSubClasses,\n },\n traversals: state.traversals,\n predicates: state.predicates,\n projection: {\n fields: state.projection,\n },\n temporalMode,\n };\n\n // Add optional fields conditionally\n if (state.orderBy.length > 0) {\n (ast as { orderBy?: readonly OrderSpec[] }).orderBy = state.orderBy;\n }\n if (state.limit !== undefined) {\n (ast as { limit?: number }).limit = state.limit;\n }\n if (state.offset !== undefined) {\n (ast as { offset?: number }).offset = state.offset;\n }\n if (state.groupBy !== undefined) {\n (ast as { groupBy?: GroupBySpec }).groupBy = state.groupBy;\n }\n if (state.having !== undefined) {\n (ast as { having?: PredicateExpression }).having = state.having;\n }\n\n return ast;\n}\n","/**\n * ExecutableQuery - A query that can be executed, paginated, or streamed.\n */\nimport { type SQL } from \"drizzle-orm\";\n\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { ValidationError } from \"../../errors\";\nimport {\n type OrderSpec,\n type QueryAst,\n type SelectiveField,\n type SortDirection,\n} from \"../ast\";\nimport { compileQuery, type CompileQueryOptions } from \"../compiler/index\";\nimport {\n buildCursorFromRow,\n type CursorData,\n decodeCursor,\n validateCursorColumns,\n} from \"../cursor\";\nimport {\n buildCursorPredicate,\n buildPaginatedResult,\n buildSelectContext,\n buildSelectiveFields,\n createStreamIterable,\n createTrackingContext,\n decodeSelectedValue,\n FieldAccessTracker,\n getStreamBatchSize,\n mapResults,\n mapSelectiveResults,\n MissingSelectiveFieldError,\n transformPathColumns,\n} from \"../execution\";\nimport { jsonPointer, parseJsonPointer } from \"../json-pointer\";\nimport { fieldRef } from \"../predicates\";\nimport { buildQueryAst } from \"./ast-builder\";\nimport {\n type AliasMap,\n type EdgeAliasMap,\n type PaginatedResult,\n type PaginateOptions,\n type QueryBuilderConfig,\n type QueryBuilderState,\n type SelectContext,\n type StreamOptions,\n} from \"./types\";\nimport { type UnionableQuery } from \"./unionable-query\";\n\nconst NOT_COMPUTED = Symbol(\"NOT_COMPUTED\");\n\n// Forward declaration for UnionableQuery to avoid circular imports\ntype UnionableQueryConstructor = new (\n config: QueryBuilderConfig,\n state: {\n left: QueryAst;\n operator: \"union\" | \"unionAll\" | \"intersect\" | \"except\";\n right: QueryAst;\n // Additional state for result transformation\n startAlias: string;\n traversals: QueryBuilderState[\"traversals\"];\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any select function type for set operations\n selectFn: (context: SelectContext<any, any>) => unknown;\n },\n) => unknown;\n\nlet UnionableQueryClass: UnionableQueryConstructor;\n\n/**\n * Sets the UnionableQuery class reference.\n * Called during module initialization to break circular dependency.\n */\nexport function setUnionableQueryClass(cls: UnionableQueryConstructor): void {\n UnionableQueryClass = cls;\n}\n\n/**\n * A query that can be executed.\n */\nexport class ExecutableQuery<\n G extends GraphDef,\n Aliases extends AliasMap,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty object for initial empty edge alias map\n EdgeAliases extends EdgeAliasMap = {},\n R = unknown,\n> {\n readonly #config: QueryBuilderConfig;\n readonly #state: QueryBuilderState;\n readonly #selectFn: (context: SelectContext<Aliases, EdgeAliases>) => R;\n #cachedSelectiveFieldsForExecute:\n | readonly SelectiveField[]\n | typeof NOT_COMPUTED\n | undefined = NOT_COMPUTED;\n #cachedSelectiveFieldsForPagination:\n | readonly SelectiveField[]\n | typeof NOT_COMPUTED\n | undefined = NOT_COMPUTED;\n\n constructor(\n config: QueryBuilderConfig,\n state: QueryBuilderState,\n selectFunction: (context: SelectContext<Aliases, EdgeAliases>) => R,\n ) {\n this.#config = config;\n this.#state = state;\n this.#selectFn = selectFunction;\n }\n\n /**\n * Builds the query AST.\n */\n toAst(): QueryAst {\n return buildQueryAst(this.#config, this.#state);\n }\n\n /**\n * Orders results.\n */\n orderBy<A extends keyof Aliases & string>(\n alias: A,\n field: string,\n direction: SortDirection = \"asc\",\n ): ExecutableQuery<G, Aliases, EdgeAliases, R> {\n const kindNames =\n alias === this.#state.startAlias ?\n this.#state.startKinds\n : this.#state.traversals.find(\n (traversal) => traversal.nodeAlias === alias,\n )?.nodeKinds;\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(kindNames, field)\n : undefined;\n\n const orderSpec: OrderSpec = {\n field: fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([field]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n }),\n direction,\n };\n\n const newState: QueryBuilderState = {\n ...this.#state,\n orderBy: [...this.#state.orderBy, orderSpec],\n };\n\n return new ExecutableQuery(this.#config, newState, this.#selectFn);\n }\n\n /**\n * Limits the number of results.\n */\n limit(n: number): ExecutableQuery<G, Aliases, EdgeAliases, R> {\n return new ExecutableQuery(\n this.#config,\n { ...this.#state, limit: n },\n this.#selectFn,\n );\n }\n\n /**\n * Offsets the results.\n */\n offset(n: number): ExecutableQuery<G, Aliases, EdgeAliases, R> {\n return new ExecutableQuery(\n this.#config,\n { ...this.#state, offset: n },\n this.#selectFn,\n );\n }\n\n /**\n * Applies a query fragment to transform this executable query.\n *\n * Useful for applying post-select transformations like ordering,\n * limits, and offsets from reusable fragments.\n *\n * @example\n * ```typescript\n * const paginated = (q) => q.orderBy(\"u\", \"createdAt\", \"desc\").limit(10);\n *\n * const results = await query()\n * .from(\"User\", \"u\")\n * .select((ctx) => ctx.u)\n * .pipe(paginated)\n * .execute();\n * ```\n *\n * @param fragment - A function that transforms the executable query\n * @returns The transformed executable query\n */\n pipe<NewR = R>(\n fragment: (\n query: ExecutableQuery<G, Aliases, EdgeAliases, R>,\n ) => ExecutableQuery<G, Aliases, EdgeAliases, NewR>,\n ): ExecutableQuery<G, Aliases, EdgeAliases, NewR> {\n return fragment(this);\n }\n\n /**\n * Combines this query with another using UNION (removes duplicates).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any alias map for set operations\n union(other: ExecutableQuery<G, any, any, R>): UnionableQuery<G, R> {\n return new UnionableQueryClass(this.#config, {\n left: this.toAst(),\n operator: \"union\",\n right: other.toAst(),\n // Pass state for result transformation\n startAlias: this.#state.startAlias,\n traversals: this.#state.traversals,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure for set operations\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => unknown,\n }) as UnionableQuery<G, R>;\n }\n\n /**\n * Combines this query with another using UNION ALL (keeps duplicates).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any alias map for set operations\n unionAll(other: ExecutableQuery<G, any, any, R>): UnionableQuery<G, R> {\n return new UnionableQueryClass(this.#config, {\n left: this.toAst(),\n operator: \"unionAll\",\n right: other.toAst(),\n // Pass state for result transformation\n startAlias: this.#state.startAlias,\n traversals: this.#state.traversals,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure for set operations\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => unknown,\n }) as UnionableQuery<G, R>;\n }\n\n /**\n * Combines this query with another using INTERSECT.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any alias map for set operations\n intersect(other: ExecutableQuery<G, any, any, R>): UnionableQuery<G, R> {\n return new UnionableQueryClass(this.#config, {\n left: this.toAst(),\n operator: \"intersect\",\n right: other.toAst(),\n // Pass state for result transformation\n startAlias: this.#state.startAlias,\n traversals: this.#state.traversals,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure for set operations\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => unknown,\n }) as UnionableQuery<G, R>;\n }\n\n /**\n * Combines this query with another using EXCEPT.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Allow any alias map for set operations\n except(other: ExecutableQuery<G, any, any, R>): UnionableQuery<G, R> {\n return new UnionableQueryClass(this.#config, {\n left: this.toAst(),\n operator: \"except\",\n right: other.toAst(),\n // Pass state for result transformation\n startAlias: this.#state.startAlias,\n traversals: this.#state.traversals,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Type erasure for set operations\n selectFn: this.#selectFn as (context: SelectContext<any, any>) => unknown,\n }) as UnionableQuery<G, R>;\n }\n\n /**\n * Compiles the query to a Drizzle SQL object.\n *\n * Returns a Drizzle SQL object that can be executed directly\n * with db.all(), db.get(), etc.\n */\n compile(): SQL {\n const ast = this.toAst();\n return compileQuery(ast, this.#config.graphId, this.#compileOptions());\n }\n\n /**\n * Builds compile options from the config.\n */\n #compileOptions(): CompileQueryOptions {\n return {\n dialect: this.#config.dialect ?? \"sqlite\",\n schema: this.#config.schema,\n };\n }\n\n /**\n * Executes the query and returns typed results.\n *\n * Uses smart optimization to detect when only specific fields are accessed\n * in the select callback. If the callback only accesses simple field\n * references (no method calls or computations), generates optimized SQL\n * that only extracts those fields instead of the full props blob.\n *\n * @throws Error if no backend is configured\n */\n async execute(): Promise<readonly R[]> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n // Phase 1: Try optimized execution\n const optimizedResult = await this.#tryOptimizedExecution();\n if (optimizedResult !== undefined) {\n return optimizedResult;\n }\n\n // Phase 2: Fall back to full fetch (existing behavior)\n const compiled = this.compile();\n const rawRows =\n await this.#config.backend.execute<Record<string, unknown>>(compiled);\n\n // Transform path columns for SQLite (converts \"|id1|id2|\" to [\"id1\", \"id2\"])\n const dialect = this.#config.dialect ?? \"sqlite\";\n const rows = transformPathColumns(rawRows, this.#state, dialect);\n\n return mapResults(\n rows,\n this.#state.startAlias,\n this.#state.traversals,\n this.#selectFn,\n );\n }\n\n /**\n * Attempts optimized execution by tracking which fields the select callback accesses.\n *\n * Returns undefined if optimization is not possible (callback uses method calls,\n * computations, or returns whole nodes).\n */\n async #tryOptimizedExecution(): Promise<readonly R[] | undefined> {\n // Skip optimization for variable-length traversals\n // The recursive query compiler doesn't support selectiveFields\n const hasVariableLength = this.#state.traversals.some(\n (t) => t.variableLength !== undefined,\n );\n if (hasVariableLength) {\n return undefined;\n }\n\n const selectiveFields = this.#getSelectiveFieldsForExecute();\n if (selectiveFields === undefined) {\n return undefined;\n }\n\n // Build and compile optimized query\n const baseAst = buildQueryAst(this.#config, this.#state);\n const selectiveAst = {\n ...baseAst,\n selectiveFields,\n };\n\n const compiled = compileQuery(\n selectiveAst,\n this.#config.graphId,\n this.#compileOptions(),\n );\n const rows =\n await this.#config.backend!.execute<Record<string, unknown>>(compiled);\n\n try {\n return mapSelectiveResults<Aliases, EdgeAliases, R>(\n rows,\n this.#state,\n selectiveFields,\n this.#config.schemaIntrospector,\n this.#selectFn,\n );\n } catch (error) {\n if (error instanceof MissingSelectiveFieldError) {\n this.#cachedSelectiveFieldsForExecute = undefined;\n return undefined;\n }\n throw error;\n }\n }\n\n #trackSelectFunctionAccesses(tracker: FieldAccessTracker): void {\n const hasOptionalTraversal = this.#state.traversals.some(\n (traversal) => traversal.optional,\n );\n\n const trackingRuns =\n hasOptionalTraversal ?\n ([\n {\n mode: \"truthy\" as const,\n optionalTraversalAliases: \"present\" as const,\n },\n {\n mode: \"falsy\" as const,\n optionalTraversalAliases: \"present\" as const,\n },\n {\n mode: \"falsy\" as const,\n optionalTraversalAliases: \"absent\" as const,\n },\n ] as const)\n : ([\n {\n mode: \"truthy\" as const,\n optionalTraversalAliases: \"present\" as const,\n },\n {\n mode: \"falsy\" as const,\n optionalTraversalAliases: \"present\" as const,\n },\n ] as const);\n\n for (const run of trackingRuns) {\n const trackingContext = createTrackingContext(this.#state, tracker, {\n schemaIntrospector: this.#config.schemaIntrospector,\n mode: run.mode,\n optionalTraversalAliases: run.optionalTraversalAliases,\n });\n\n try {\n // Execute the select callback against a lightweight tracking context.\n // We intentionally ignore the return value: we only need accessed fields.\n void this.#selectFn(\n trackingContext as SelectContext<Aliases, EdgeAliases>,\n );\n } catch {\n // Best-effort tracking: any runtime errors in the callback (e.g. calling\n // a method on an undefined optional field) should simply disable or\n // reduce optimization, never change correctness.\n }\n }\n }\n\n #getSelectiveFieldsForExecute(): readonly SelectiveField[] | undefined {\n if (this.#cachedSelectiveFieldsForExecute === undefined) {\n return undefined;\n }\n\n if (this.#cachedSelectiveFieldsForExecute !== NOT_COMPUTED) {\n return this.#cachedSelectiveFieldsForExecute;\n }\n\n const tracker = new FieldAccessTracker();\n this.#trackSelectFunctionAccesses(tracker);\n\n const accessed = tracker.getAccessedFields();\n if (accessed.length === 0) {\n this.#cachedSelectiveFieldsForExecute = undefined;\n return undefined;\n }\n\n const selectiveFields = this.#ensureOptionalTraversalIdsSelected(\n buildSelectiveFields(accessed, {\n state: this.#state,\n schemaIntrospector: this.#config.schemaIntrospector,\n }),\n );\n this.#cachedSelectiveFieldsForExecute = selectiveFields;\n return selectiveFields;\n }\n\n #getSelectiveFieldsForPagination(): readonly SelectiveField[] | undefined {\n if (this.#cachedSelectiveFieldsForPagination === undefined) {\n return undefined;\n }\n\n if (this.#cachedSelectiveFieldsForPagination !== NOT_COMPUTED) {\n return this.#cachedSelectiveFieldsForPagination;\n }\n\n const tracker = new FieldAccessTracker();\n this.#trackSelectFunctionAccesses(tracker);\n if (!this.#recordOrderByFieldsForPagination(tracker)) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n\n const selectiveFields = this.#ensureOptionalTraversalIdsSelected(\n buildSelectiveFields(tracker.getAccessedFields(), {\n state: this.#state,\n schemaIntrospector: this.#config.schemaIntrospector,\n }),\n );\n this.#cachedSelectiveFieldsForPagination = selectiveFields;\n return selectiveFields;\n }\n\n #ensureOptionalTraversalIdsSelected(\n selectiveFields: readonly SelectiveField[],\n ): readonly SelectiveField[] {\n const result = [...selectiveFields];\n const keys = new Set(\n result.map(\n (field) =>\n `${field.alias}\\u0000${field.field}\\u0000${String(field.isSystemField)}`,\n ),\n );\n\n function add(alias: string): void {\n const key = `${alias}\\u0000id\\u0000true`;\n if (keys.has(key)) return;\n keys.add(key);\n result.push({\n alias,\n field: \"id\",\n outputName: `${alias}_id`,\n isSystemField: true,\n });\n }\n\n for (const traversal of this.#state.traversals) {\n if (!traversal.optional) continue;\n add(traversal.nodeAlias);\n add(traversal.edgeAlias);\n }\n\n return result.toSorted((a, b) => {\n const aliasCompare = a.alias.localeCompare(b.alias);\n if (aliasCompare !== 0) return aliasCompare;\n return a.field.localeCompare(b.field);\n });\n }\n\n async #tryOptimizedPaginate(\n cursorData: CursorData | undefined,\n direction: \"forward\" | \"backward\",\n pageLimit: number,\n fetchLimit: number,\n cursor: string | undefined,\n isBackward: boolean,\n ): Promise<PaginatedResult<R> | undefined> {\n // Skip optimization for variable-length traversals (recursive compiler path)\n const hasVariableLength = this.#state.traversals.some(\n (t) => t.variableLength !== undefined,\n );\n if (hasVariableLength) return undefined;\n\n const selectiveFields = this.#getSelectiveFieldsForPagination();\n if (selectiveFields === undefined) {\n return undefined;\n }\n\n const rows = await this.#executeWithCursor(\n cursorData,\n direction,\n fetchLimit,\n {\n selectiveFields,\n },\n );\n\n const hasMore = rows.length > pageLimit;\n const resultRows = hasMore ? rows.slice(0, pageLimit) : rows;\n const orderedRows = isBackward ? resultRows.toReversed() : resultRows;\n\n let data: readonly R[];\n try {\n data = mapSelectiveResults<Aliases, EdgeAliases, R>(\n orderedRows,\n this.#state,\n selectiveFields,\n this.#config.schemaIntrospector,\n this.#selectFn,\n );\n } catch (error) {\n if (error instanceof MissingSelectiveFieldError) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n throw error;\n }\n\n let nextCursor: string | undefined;\n let previousCursor: string | undefined;\n\n if (orderedRows.length > 0) {\n try {\n previousCursor = this.#buildCursorFromSelectiveRow(\n orderedRows[0]!,\n selectiveFields,\n \"b\",\n );\n nextCursor = this.#buildCursorFromSelectiveRow(\n orderedRows.at(-1)!,\n selectiveFields,\n \"f\",\n );\n } catch (error) {\n if (error instanceof MissingSelectiveFieldError) {\n this.#cachedSelectiveFieldsForPagination = undefined;\n return undefined;\n }\n throw error;\n }\n }\n\n return {\n data,\n nextCursor: hasMore || isBackward ? nextCursor : undefined,\n prevCursor:\n cursor !== undefined || (isBackward && hasMore) ?\n previousCursor\n : undefined,\n hasNextPage: isBackward ? cursor !== undefined : hasMore,\n hasPrevPage: isBackward ? hasMore : cursor !== undefined,\n };\n }\n\n #recordOrderByFieldsForPagination(tracker: FieldAccessTracker): boolean {\n for (const spec of this.#state.orderBy) {\n const field = spec.field;\n if (field.path.length !== 1 || field.path[0] !== \"props\") {\n return false;\n }\n\n if (field.jsonPointer === undefined) {\n return false;\n }\n\n const segments = parseJsonPointer(field.jsonPointer);\n if (segments.length !== 1) {\n return false;\n }\n\n tracker.record(field.alias, segments[0]!, false);\n }\n\n return true;\n }\n\n #buildCursorFromSelectiveRow(\n row: Record<string, unknown>,\n selectiveFields: readonly SelectiveField[],\n direction: \"f\" | \"b\",\n ): string {\n const contextRow = this.#buildCursorContextFromSelectiveRow(\n row,\n selectiveFields,\n );\n return buildCursorFromRow(contextRow, this.#state.orderBy, direction);\n }\n\n #buildCursorContextFromSelectiveRow(\n row: Record<string, unknown>,\n selectiveFields: readonly SelectiveField[],\n ): Record<string, unknown> {\n const outputNameByAliasField = new Map<string, string>();\n for (const field of selectiveFields) {\n outputNameByAliasField.set(\n `${field.alias}\\u0000${field.field}`,\n field.outputName,\n );\n }\n\n const optionalNodeAliases = new Set<string>();\n for (const traversal of this.#state.traversals) {\n if (traversal.optional) {\n optionalNodeAliases.add(traversal.nodeAlias);\n }\n }\n\n const cursorContext: Record<string, unknown> = {};\n\n for (const spec of this.#state.orderBy) {\n const alias = spec.field.alias;\n const jsonPointer = spec.field.jsonPointer;\n if (jsonPointer === undefined) {\n throw new MissingSelectiveFieldError(alias, \"orderBy\");\n }\n\n const segments = parseJsonPointer(jsonPointer);\n if (segments.length === 0) {\n throw new MissingSelectiveFieldError(alias, \"orderBy\");\n }\n\n const topField = segments[0]!;\n const outputName = outputNameByAliasField.get(\n `${alias}\\u0000${topField}`,\n );\n if (outputName === undefined) {\n throw new MissingSelectiveFieldError(alias, topField);\n }\n\n if (optionalNodeAliases.has(alias)) {\n const idOutputName = outputNameByAliasField.get(`${alias}\\u0000id`);\n if (idOutputName === undefined) {\n throw new MissingSelectiveFieldError(alias, \"id\");\n }\n const idValue = row[idOutputName];\n if (idValue === null || idValue === undefined) {\n continue;\n }\n }\n\n let aliasObject: Record<string, unknown>;\n const existing = cursorContext[alias];\n if (typeof existing === \"object\" && existing !== null) {\n aliasObject = existing as Record<string, unknown>;\n } else {\n aliasObject = {};\n cursorContext[alias] = aliasObject;\n }\n\n const kindNames = this.#getNodeKindNamesForAlias(alias);\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(\n kindNames,\n topField,\n )\n : undefined;\n\n const decoded = decodeSelectedValue(row[outputName], typeInfo);\n\n if (segments.length === 1) {\n aliasObject[topField] = decoded;\n continue;\n }\n\n let current = aliasObject;\n for (let index = 0; index < segments.length - 1; index++) {\n const segment = segments[index]!;\n const existing_ = current[segment];\n if (typeof existing_ === \"object\" && existing_ !== null) {\n current = existing_ as Record<string, unknown>;\n } else {\n const created: Record<string, unknown> = {};\n current[segment] = created;\n current = created;\n }\n }\n current[segments.at(-1)!] = decoded;\n }\n\n return cursorContext;\n }\n\n #getNodeKindNamesForAlias(alias: string): readonly string[] | undefined {\n if (alias === this.#state.startAlias) {\n return this.#state.startKinds;\n }\n return this.#state.traversals.find((t) => t.nodeAlias === alias)?.nodeKinds;\n }\n\n /**\n * Executes a paginated query using cursor-based keyset pagination.\n *\n * Cursor pagination is efficient for large datasets as it avoids OFFSET.\n * Requires ORDER BY to be specified for deterministic results.\n *\n * @param options - Pagination options (first/after for forward, last/before for backward)\n * @throws ValidationError if ORDER BY is not specified\n * @throws ValidationError if cursor columns don't match query ORDER BY columns\n */\n async paginate(options: PaginateOptions): Promise<PaginatedResult<R>> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n // Validate ORDER BY is present\n if (this.#state.orderBy.length === 0) {\n throw new ValidationError(\n \"Cursor pagination requires ORDER BY. Add .orderBy() before .paginate()\",\n {\n issues: [\n {\n path: \"orderBy\",\n message: \"ORDER BY is required for cursor pagination\",\n },\n ],\n },\n {\n suggestion: `Add .orderBy(alias, field) before .paginate() to specify sort order.`,\n },\n );\n }\n\n // Determine pagination direction and parameters\n const isBackward =\n options.last !== undefined || options.before !== undefined;\n const limit = options.first ?? options.last ?? 20;\n const cursor = options.after ?? options.before;\n\n // Decode and validate cursor if provided\n let cursorData: CursorData | undefined;\n if (cursor) {\n cursorData = decodeCursor(cursor);\n validateCursorColumns(cursorData, this.#state.orderBy);\n }\n\n // Fetch limit + 1 to detect if there are more pages\n const fetchLimit = limit + 1;\n\n const direction = isBackward ? \"backward\" : \"forward\";\n const optimized = await this.#tryOptimizedPaginate(\n cursorData,\n direction,\n limit,\n fetchLimit,\n cursor,\n isBackward,\n );\n if (optimized !== undefined) {\n return optimized;\n }\n\n // Build and execute query with cursor condition\n const rows = await this.#executeWithCursor(\n cursorData,\n direction,\n fetchLimit,\n );\n\n // Detect if there are more items\n const hasMore = rows.length > limit;\n const resultRows = hasMore ? rows.slice(0, limit) : rows;\n\n // For backward pagination, reverse the results to maintain natural order\n const orderedRows = isBackward ? resultRows.toReversed() : resultRows;\n\n // Map to typed results\n const data = mapResults(\n orderedRows,\n this.#state.startAlias,\n this.#state.traversals,\n this.#selectFn,\n );\n\n // Build paginated result with cursors\n return buildPaginatedResult(\n data,\n orderedRows,\n this.#state.orderBy,\n limit,\n hasMore,\n isBackward,\n cursor,\n (row) =>\n buildSelectContext<Aliases, EdgeAliases>(\n row,\n this.#state.startAlias,\n this.#state.traversals,\n ),\n );\n }\n\n /**\n * Returns an async iterator that streams results in batches.\n *\n * Uses cursor pagination internally for efficient memory usage.\n * Requires ORDER BY to be specified for deterministic results.\n *\n * @param options - Stream options (batchSize defaults to 1000)\n * @throws ValidationError if ORDER BY is not specified\n */\n stream(options?: StreamOptions): AsyncIterable<R> {\n // Validate ORDER BY is present\n if (this.#state.orderBy.length === 0) {\n throw new ValidationError(\n \"Streaming requires ORDER BY. Add .orderBy() before .stream()\",\n {\n issues: [\n { path: \"orderBy\", message: \"ORDER BY is required for streaming\" },\n ],\n },\n {\n suggestion: `Add .orderBy(alias, field) before .stream() to specify sort order.`,\n },\n );\n }\n\n const batchSize = getStreamBatchSize(options);\n return createStreamIterable(batchSize, (paginateOptions) =>\n this.paginate(paginateOptions),\n );\n }\n\n /**\n * Executes a query with cursor conditions applied.\n */\n async #executeWithCursor(\n cursorData: CursorData | undefined,\n direction: \"forward\" | \"backward\",\n limit: number,\n options?: Readonly<{ selectiveFields?: readonly SelectiveField[] }>,\n ): Promise<readonly Record<string, unknown>[]> {\n const ast = this.toAst();\n\n // Adjust ORDER BY for backward pagination (reverse all directions)\n let orderBy = this.#state.orderBy;\n if (direction === \"backward\") {\n orderBy = orderBy.map((spec) => ({\n ...spec,\n direction:\n spec.direction === \"asc\" ? (\"desc\" as const) : (\"asc\" as const),\n }));\n }\n\n // Build cursor predicates if we have cursor data\n let predicates = [...this.#state.predicates];\n if (cursorData) {\n const cursorPredicate = buildCursorPredicate(\n cursorData,\n this.#state.orderBy,\n direction,\n this.#state.startAlias,\n );\n predicates = [...predicates, cursorPredicate];\n }\n\n // Apply modified ORDER BY, predicates, and limit to AST (discard offset)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { offset: _discarded, ...astWithoutOffset } = ast;\n const modifiedAst = {\n ...astWithoutOffset,\n predicates,\n orderBy,\n limit,\n ...(options?.selectiveFields !== undefined && {\n selectiveFields: options.selectiveFields,\n }),\n };\n\n // Compile and execute\n const compiled = compileQuery(\n modifiedAst,\n this.#config.graphId,\n this.#compileOptions(),\n );\n const rawRows =\n await this.#config.backend!.execute<Record<string, unknown>>(compiled);\n const dialect = this.#config.dialect ?? \"sqlite\";\n return transformPathColumns(rawRows, this.#state, dialect);\n }\n}\n","/**\n * ExecutableAggregateQuery - A query with aggregate functions that can be executed.\n */\nimport { type SQL } from \"drizzle-orm\";\n\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type AggregateExpr, type FieldRef, type QueryAst } from \"../ast\";\nimport { compileQuery, type CompileQueryOptions } from \"../compiler/index\";\nimport { buildQueryAst } from \"./ast-builder\";\nimport {\n type AliasMap,\n type QueryBuilderConfig,\n type QueryBuilderState,\n} from \"./types\";\n\n/**\n * Result type for aggregate queries.\n * Maps field refs to their value types and aggregates to numbers.\n */\nexport type AggregateResult<\n R extends Record<string, FieldRef | AggregateExpr>,\n> = {\n [K in keyof R]: R[K] extends AggregateExpr ? number\n : R[K] extends FieldRef ? unknown\n : never;\n};\n\n/**\n * An aggregate query that can be executed.\n */\nexport class ExecutableAggregateQuery<\n G extends GraphDef,\n Aliases extends AliasMap,\n R extends Record<string, FieldRef | AggregateExpr>,\n> {\n readonly #config: QueryBuilderConfig;\n readonly #state: QueryBuilderState;\n readonly #fields: R;\n\n constructor(config: QueryBuilderConfig, state: QueryBuilderState, fields: R) {\n this.#config = config;\n this.#state = state;\n this.#fields = fields;\n }\n\n /**\n * Builds the query AST.\n */\n toAst(): QueryAst {\n return buildQueryAst(this.#config, this.#state);\n }\n\n /**\n * Limits the number of results.\n */\n limit(n: number): ExecutableAggregateQuery<G, Aliases, R> {\n return new ExecutableAggregateQuery(\n this.#config,\n { ...this.#state, limit: n },\n this.#fields,\n );\n }\n\n /**\n * Offsets the results.\n */\n offset(n: number): ExecutableAggregateQuery<G, Aliases, R> {\n return new ExecutableAggregateQuery(\n this.#config,\n { ...this.#state, offset: n },\n this.#fields,\n );\n }\n\n /**\n * Compiles the query to a Drizzle SQL object.\n */\n compile(): SQL {\n const ast = this.toAst();\n return compileQuery(ast, this.#config.graphId, this.#compileOptions());\n }\n\n /**\n * Builds compile options from the config.\n */\n #compileOptions(): CompileQueryOptions {\n return {\n dialect: this.#config.dialect ?? \"sqlite\",\n schema: this.#config.schema,\n };\n }\n\n /**\n * Executes the query and returns typed results.\n *\n * @throws Error if no backend is configured\n */\n async execute(): Promise<readonly AggregateResult<R>[]> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n const compiled = this.compile();\n const rows =\n await this.#config.backend.execute<Record<string, unknown>>(compiled);\n\n return this.#mapResults(rows);\n }\n\n /**\n * Maps raw database rows to typed results.\n * Handles database-specific value conversions:\n * - PostgreSQL returns bigint/numeric as strings → convert to numbers\n * - SQLite returns JSON booleans as 0/1 numbers → convert to booleans\n * - PostgreSQL returns JSON booleans as \"true\"/\"false\" strings → convert to booleans\n */\n #mapResults(\n rows: readonly Record<string, unknown>[],\n ): readonly AggregateResult<R>[] {\n return rows.map((row) => {\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(this.#fields)) {\n const field = this.#fields[key];\n if (!field) continue;\n const value = row[key];\n\n if (field.__type === \"aggregate\") {\n // PostgreSQL returns aggregate bigint/numeric as strings.\n result[key] = typeof value === \"string\" ? Number(value) : value;\n continue;\n }\n\n result[key] = normalizeFieldValue(field, value);\n }\n return result as AggregateResult<R>;\n });\n }\n}\n\n/**\n * Converts database-specific boolean encodings to JS booleans.\n *\n * - SQLite json_extract() returns 0/1 for JSON booleans\n * - PostgreSQL #>> returns \"true\"/\"false\" for JSON booleans\n */\nfunction normalizeBooleanValue(value: unknown): unknown {\n if (value === null) return undefined;\n if (value === true || value === false) return value;\n if (value === 1) return true;\n if (value === 0) return false;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (value === \"1\") return true;\n if (value === \"0\") return false;\n return value;\n}\n\nfunction normalizeFieldValue(field: FieldRef, value: unknown): unknown {\n if (field.valueType === \"boolean\") {\n return normalizeBooleanValue(value);\n }\n\n return value === null ? undefined : value;\n}\n","/**\n * SQL Identifier Validation\n *\n * Validates aliases and identifiers to prevent SQL injection.\n */\nimport { ValidationError } from \"../../errors\";\n\n/**\n * Pattern for valid SQL identifiers (aliases).\n * Must start with a letter or underscore, followed by letters, digits, or underscores.\n * Maximum length of 63 characters (PostgreSQL limit).\n */\nconst SQL_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/;\n\n/**\n * Reserved SQL keywords that cannot be used as aliases.\n */\nconst SQL_RESERVED_KEYWORDS = new Set([\n \"select\",\n \"from\",\n \"where\",\n \"and\",\n \"or\",\n \"not\",\n \"in\",\n \"is\",\n \"null\",\n \"true\",\n \"false\",\n \"as\",\n \"on\",\n \"join\",\n \"left\",\n \"right\",\n \"inner\",\n \"outer\",\n \"cross\",\n \"full\",\n \"group\",\n \"by\",\n \"having\",\n \"order\",\n \"asc\",\n \"desc\",\n \"limit\",\n \"offset\",\n \"union\",\n \"intersect\",\n \"except\",\n \"all\",\n \"distinct\",\n \"case\",\n \"when\",\n \"then\",\n \"else\",\n \"end\",\n \"exists\",\n \"between\",\n \"like\",\n \"ilike\",\n \"insert\",\n \"update\",\n \"delete\",\n \"create\",\n \"drop\",\n \"alter\",\n \"table\",\n \"index\",\n \"view\",\n \"with\",\n \"recursive\",\n]);\n\n/**\n * Validates that an alias is a safe SQL identifier.\n *\n * @param alias - The alias to validate\n * @throws ValidationError if the alias is not a valid SQL identifier\n */\nexport function validateSqlIdentifier(alias: string): void {\n if (!SQL_IDENTIFIER_PATTERN.test(alias)) {\n throw new ValidationError(\n `Invalid alias \"${alias}\": must start with a letter or underscore, ` +\n `contain only letters, digits, and underscores, and be at most 63 characters`,\n {\n issues: [\n {\n path: \"alias\",\n message: `\"${alias}\" is not a valid SQL identifier`,\n },\n ],\n },\n {\n suggestion: `Use a simple identifier like \"p\", \"e\", \"node1\", or \"my_alias\".`,\n },\n );\n }\n\n if (SQL_RESERVED_KEYWORDS.has(alias.toLowerCase())) {\n throw new ValidationError(\n `Invalid alias \"${alias}\": \"${alias}\" is a reserved SQL keyword`,\n {\n issues: [\n { path: \"alias\", message: `\"${alias}\" is a reserved SQL keyword` },\n ],\n },\n {\n suggestion: `Choose a different alias. Reserved words like SELECT, FROM, WHERE cannot be used.`,\n },\n );\n }\n}\n","/**\n * TraversalBuilder - Intermediate builder for edge traversals.\n */\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type AnyEdgeType, type NodeType } from \"../../core/types\";\nimport {\n type NodePredicate,\n type Traversal,\n type TraversalDirection,\n} from \"../ast\";\nimport { jsonPointer } from \"../json-pointer\";\nimport {\n arrayField,\n baseField,\n dateField,\n fieldRef,\n numberField,\n objectField,\n type Predicate,\n stringField,\n} from \"../predicates\";\n// Type-only import to get the QueryBuilder type without runtime circular dependency\nimport { type QueryBuilder } from \"./query-builder\";\nimport {\n type AliasMap,\n type BaseFieldAccessor,\n type EdgeAccessor,\n type EdgeAlias,\n type EdgeAliasMap,\n type NodeAlias,\n type QueryBuilderConfig,\n type QueryBuilderState,\n type UniqueAlias,\n type ValidEdgeTargets,\n} from \"./types\";\nimport { validateSqlIdentifier } from \"./validation\";\n\n// Forward declaration - actual import would cause circular dependency\ntype QueryBuilderConstructor = new (\n config: QueryBuilderConfig,\n state: QueryBuilderState,\n) => unknown;\n\n// This will be set by the main builder module to avoid circular imports\nlet QueryBuilderClass: QueryBuilderConstructor;\n\n/**\n * Sets the QueryBuilder class reference for use by TraversalBuilder.\n * Called during module initialization to break circular dependency.\n */\nexport function setQueryBuilderClass(cls: QueryBuilderConstructor): void {\n QueryBuilderClass = cls;\n}\n\n/**\n * State for variable-length traversal configuration.\n */\ninterface VariableLengthState {\n enabled: boolean;\n minDepth: number;\n maxDepth: number;\n collectPath: boolean;\n pathAlias?: string;\n depthAlias?: string;\n}\n\n/**\n * Default variable-length state (disabled).\n */\nconst DEFAULT_VARIABLE_LENGTH_STATE: VariableLengthState = {\n enabled: false,\n minDepth: 1,\n maxDepth: -1,\n collectPath: false,\n};\n\n/**\n * Intermediate builder for traversal operations.\n *\n * Type parameters track the edge kind and direction to constrain\n * which node kinds are valid targets in the `to()` method.\n */\nexport class TraversalBuilder<\n G extends GraphDef,\n Aliases extends AliasMap,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty object for initial empty edge alias map\n EdgeAliases extends EdgeAliasMap = {},\n EK extends keyof G[\"edges\"] & string = keyof G[\"edges\"] & string,\n EA extends string = string,\n Dir extends TraversalDirection = \"out\",\n Optional extends boolean = false,\n> {\n readonly #config: QueryBuilderConfig;\n readonly #state: QueryBuilderState;\n readonly #edgeKinds: readonly string[];\n readonly #edgeAlias: EA;\n readonly #direction: Dir;\n readonly #fromAlias: string;\n readonly #optional: Optional;\n readonly #variableLength: VariableLengthState;\n readonly #pendingEdgePredicates: readonly NodePredicate[];\n\n constructor(\n config: QueryBuilderConfig,\n state: QueryBuilderState,\n edgeKinds: readonly string[],\n edgeAlias: EA,\n direction: Dir,\n fromAlias: string,\n optional: Optional = false as Optional,\n variableLength: VariableLengthState = DEFAULT_VARIABLE_LENGTH_STATE,\n pendingEdgePredicates: readonly NodePredicate[] = [],\n ) {\n this.#config = config;\n this.#state = state;\n this.#edgeKinds = edgeKinds;\n this.#edgeAlias = edgeAlias;\n this.#direction = direction;\n this.#fromAlias = fromAlias;\n this.#optional = optional;\n this.#variableLength = variableLength;\n this.#pendingEdgePredicates = pendingEdgePredicates;\n }\n\n /**\n * Enables variable-length (recursive) traversal.\n * By default, traverses unlimited depth with cycle detection.\n */\n recursive(): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n Dir,\n Optional\n > {\n return new TraversalBuilder(\n this.#config,\n this.#state,\n this.#edgeKinds,\n this.#edgeAlias,\n this.#direction,\n this.#fromAlias,\n this.#optional,\n { ...this.#variableLength, enabled: true },\n this.#pendingEdgePredicates,\n );\n }\n\n /**\n * Sets the maximum traversal depth.\n * @param max Maximum number of hops (must be >= 1)\n */\n maxHops(\n max: number,\n ): TraversalBuilder<G, Aliases, EdgeAliases, EK, EA, Dir, Optional> {\n if (max < 1) {\n throw new Error(\"maxHops must be >= 1\");\n }\n return new TraversalBuilder(\n this.#config,\n this.#state,\n this.#edgeKinds,\n this.#edgeAlias,\n this.#direction,\n this.#fromAlias,\n this.#optional,\n { ...this.#variableLength, enabled: true, maxDepth: max },\n this.#pendingEdgePredicates,\n );\n }\n\n /**\n * Sets the minimum traversal depth (skip nodes closer than this).\n * @param min Minimum hops before including results (default: 1)\n */\n minHops(\n min: number,\n ): TraversalBuilder<G, Aliases, EdgeAliases, EK, EA, Dir, Optional> {\n if (min < 0) {\n throw new Error(\"minHops must be >= 0\");\n }\n return new TraversalBuilder(\n this.#config,\n this.#state,\n this.#edgeKinds,\n this.#edgeAlias,\n this.#direction,\n this.#fromAlias,\n this.#optional,\n { ...this.#variableLength, enabled: true, minDepth: min },\n this.#pendingEdgePredicates,\n );\n }\n\n /**\n * Includes the traversal path as an array in results.\n * @param alias Column alias for the path array (default: \"{nodeAlias}_path\")\n */\n collectPath(\n alias?: string,\n ): TraversalBuilder<G, Aliases, EdgeAliases, EK, EA, Dir, Optional> {\n const newState: VariableLengthState = {\n ...this.#variableLength,\n enabled: true,\n collectPath: true,\n };\n if (alias !== undefined) {\n newState.pathAlias = alias;\n }\n return new TraversalBuilder(\n this.#config,\n this.#state,\n this.#edgeKinds,\n this.#edgeAlias,\n this.#direction,\n this.#fromAlias,\n this.#optional,\n newState,\n this.#pendingEdgePredicates,\n );\n }\n\n /**\n * Includes the traversal depth in results.\n * @param alias Column alias for the depth (default: \"{nodeAlias}_depth\")\n */\n withDepth(\n alias?: string,\n ): TraversalBuilder<G, Aliases, EdgeAliases, EK, EA, Dir, Optional> {\n const newState: VariableLengthState = {\n ...this.#variableLength,\n enabled: true,\n };\n if (alias !== undefined) {\n newState.depthAlias = alias;\n }\n return new TraversalBuilder(\n this.#config,\n this.#state,\n this.#edgeKinds,\n this.#edgeAlias,\n this.#direction,\n this.#fromAlias,\n this.#optional,\n newState,\n this.#pendingEdgePredicates,\n );\n }\n\n /**\n * Adds a WHERE clause for the edge being traversed.\n *\n * @param alias - The edge alias to filter on (must be the current edge alias)\n * @param predicateFunction - A function that builds predicates using the edge accessor\n */\n whereEdge(\n alias: EA,\n predicateFunction: (\n edge: EdgeAccessor<G[\"edges\"][EK][\"type\"]>,\n ) => Predicate,\n ): TraversalBuilder<G, Aliases, EdgeAliases, EK, EA, Dir, Optional> {\n const accessor = this.#createEdgeAccessor(alias);\n const predicate = predicateFunction(\n accessor as EdgeAccessor<G[\"edges\"][EK][\"type\"]>,\n );\n\n const newPredicate: NodePredicate = {\n targetAlias: alias,\n targetType: \"edge\",\n expression: predicate.__expr,\n };\n\n return new TraversalBuilder(\n this.#config,\n this.#state,\n this.#edgeKinds,\n this.#edgeAlias,\n this.#direction,\n this.#fromAlias,\n this.#optional,\n this.#variableLength,\n [...this.#pendingEdgePredicates, newPredicate],\n );\n }\n\n /**\n * Creates a type-safe accessor for edge properties.\n */\n #createEdgeAccessor(alias: string): EdgeAccessor<AnyEdgeType> {\n // Pre-compute system field accessors\n const idAccessor = stringField(\n fieldRef(alias, [\"id\"], { valueType: \"string\" }),\n );\n const kindAccessor = stringField(\n fieldRef(alias, [\"kind\"], { valueType: \"string\" }),\n );\n const fromIdAccessor = stringField(\n fieldRef(alias, [\"from_id\"], { valueType: \"string\" }),\n );\n const toIdAccessor = stringField(\n fieldRef(alias, [\"to_id\"], { valueType: \"string\" }),\n );\n\n // Build field accessor for a schema property\n const buildFieldAccessor = (propertyName: string): BaseFieldAccessor => {\n const typeInfo =\n this.#config.schemaIntrospector.getSharedEdgeFieldTypeInfo(\n this.#edgeKinds,\n propertyName,\n );\n\n const valueType = typeInfo?.valueType;\n const elementType = typeInfo?.elementType;\n\n const ref = fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([propertyName]),\n valueType,\n elementType,\n });\n\n switch (valueType) {\n case \"string\": {\n return stringField(ref);\n }\n case \"number\": {\n return numberField(ref);\n }\n case \"boolean\": {\n return baseField(ref);\n }\n case \"date\": {\n return dateField(ref);\n }\n case \"array\": {\n return arrayField(ref);\n }\n case \"object\": {\n return objectField(ref);\n }\n case \"embedding\":\n case \"unknown\":\n case undefined: {\n // Embedding, unknown, or unresolved type - return base field\n return baseField(ref);\n }\n }\n };\n\n // Use a Proxy to provide flattened property access\n return new Proxy({} as EdgeAccessor<AnyEdgeType>, {\n get: (_, property: string | symbol) => {\n // Handle symbols and special properties to avoid infinite loops\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n // System fields\n if (property === \"id\") return idAccessor;\n if (property === \"kind\") return kindAccessor;\n if (property === \"fromId\") return fromIdAccessor;\n if (property === \"toId\") return toIdAccessor;\n\n // Schema properties\n return buildFieldAccessor(property);\n },\n });\n }\n\n /**\n * Specifies the target node kind.\n *\n * The kind must be a valid target for this edge based on the traversal direction:\n * - \"out\" direction: kind must be in the edge's \"to\" array\n * - \"in\" direction: kind must be in the edge's \"from\" array\n *\n * @param kind - The target node kind\n * @param alias - A unique alias for this node (compile-time error if duplicate)\n */\n to<K extends ValidEdgeTargets<G, EK, Dir>, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options?: { includeSubClasses?: false },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<G[\"nodes\"][K][\"type\"], Optional>>,\n EdgeAliases & Record<EA, EdgeAlias<G[\"edges\"][EK][\"type\"], Optional>>\n >;\n\n to<K extends ValidEdgeTargets<G, EK, Dir>, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options: { includeSubClasses: true },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<NodeType, Optional>>,\n EdgeAliases & Record<EA, EdgeAlias<G[\"edges\"][EK][\"type\"], Optional>>\n >;\n\n to<K extends ValidEdgeTargets<G, EK, Dir>, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options?: { includeSubClasses?: boolean },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<NodeType, Optional>>,\n EdgeAliases & Record<EA, EdgeAlias<G[\"edges\"][EK][\"type\"], Optional>>\n > {\n // Validate node alias to prevent SQL injection\n validateSqlIdentifier(alias);\n\n const includeSubClasses = options?.includeSubClasses ?? false;\n const kinds =\n includeSubClasses ? this.#config.registry.expandSubClasses(kind) : [kind];\n\n // Build base traversal\n const baseTraversal = {\n edgeAlias: this.#edgeAlias,\n edgeKinds: this.#edgeKinds,\n direction: this.#direction,\n nodeAlias: alias,\n nodeKinds: kinds,\n joinFromAlias: this.#fromAlias,\n joinEdgeField: this.#direction === \"out\" ? \"from_id\" : \"to_id\",\n optional: this.#optional,\n } as const;\n\n // Add variable-length spec if enabled\n const traversal: Traversal =\n this.#variableLength.enabled ?\n {\n ...baseTraversal,\n variableLength: {\n minDepth: this.#variableLength.minDepth,\n maxDepth: this.#variableLength.maxDepth,\n collectPath: this.#variableLength.collectPath,\n pathAlias: this.#variableLength.pathAlias ?? `${alias}_path`,\n depthAlias: this.#variableLength.depthAlias ?? `${alias}_depth`,\n },\n }\n : baseTraversal;\n\n const newState: QueryBuilderState = {\n ...this.#state,\n traversals: [...this.#state.traversals, traversal],\n predicates: [...this.#state.predicates, ...this.#pendingEdgePredicates],\n currentAlias: alias, // Update current alias to this traversal's target\n };\n\n // Cast is safe because the overloads provide compile-time type safety\n // The runtime QueryBuilderClass is the correct implementation\n return new QueryBuilderClass(this.#config, newState) as QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<NodeType, Optional>>,\n EdgeAliases & Record<EA, EdgeAlias<G[\"edges\"][EK][\"type\"], Optional>>\n >;\n }\n}\n","/**\n * QueryBuilder - The fluent query builder.\n */\nimport { type GraphDef } from \"../../core/define-graph\";\nimport {\n type EdgeType,\n type NodeType,\n type TemporalMode,\n} from \"../../core/types\";\nimport { ValidationError } from \"../../errors\";\nimport {\n type AggregateExpr,\n type FieldRef,\n type GroupBySpec,\n type OrderSpec,\n type PredicateExpression,\n type ProjectedField,\n type SortDirection,\n type TraversalDirection,\n} from \"../ast\";\nimport { jsonPointer, parseJsonPointer } from \"../json-pointer\";\nimport {\n arrayField,\n baseField,\n dateField,\n embeddingField,\n fieldRef,\n numberField,\n objectField,\n type Predicate,\n stringField,\n} from \"../predicates\";\nimport { type FieldTypeInfo } from \"../schema-introspector\";\nimport { ExecutableAggregateQuery } from \"./executable-aggregate-query\";\nimport { ExecutableQuery } from \"./executable-query\";\nimport { TraversalBuilder } from \"./traversal-builder\";\nimport {\n type AliasMap,\n type BaseFieldAccessor,\n type EdgeAccessor,\n type EdgeAliasMap,\n type NodeAccessor,\n type NodeAlias,\n type QueryBuilderConfig,\n type QueryBuilderState,\n type SelectContext,\n type UniqueAlias,\n} from \"./types\";\nimport { validateSqlIdentifier } from \"./validation\";\n\n/**\n * Builds projected fields for a node alias (including all metadata columns).\n */\nfunction buildNodeFields(alias: string): ProjectedField[] {\n return [\n {\n outputName: `${alias}_id`,\n source: fieldRef(alias, [\"id\"]),\n },\n {\n outputName: `${alias}_kind`,\n source: fieldRef(alias, [\"kind\"]),\n },\n {\n outputName: `${alias}_props`,\n source: fieldRef(alias, [\"props\"]),\n },\n {\n outputName: `${alias}_version`,\n source: fieldRef(alias, [\"version\"]),\n },\n {\n outputName: `${alias}_valid_from`,\n source: fieldRef(alias, [\"valid_from\"]),\n },\n {\n outputName: `${alias}_valid_to`,\n source: fieldRef(alias, [\"valid_to\"]),\n },\n {\n outputName: `${alias}_created_at`,\n source: fieldRef(alias, [\"created_at\"]),\n },\n {\n outputName: `${alias}_updated_at`,\n source: fieldRef(alias, [\"updated_at\"]),\n },\n {\n outputName: `${alias}_deleted_at`,\n source: fieldRef(alias, [\"deleted_at\"]),\n },\n ];\n}\n\n/**\n * Builds projected fields for an edge alias (including all metadata columns).\n *\n * Edge columns are stored in the traversal's node CTE (e.g., cte_c contains e_id, e_kind, etc.).\n * The nodeCteAlias parameter specifies which CTE contains these columns.\n */\nfunction buildEdgeFields(\n edgeAlias: string,\n nodeCteAlias: string,\n): ProjectedField[] {\n const cteAlias = `cte_${nodeCteAlias}`;\n return [\n {\n outputName: `${edgeAlias}_id`,\n source: fieldRef(edgeAlias, [\"id\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_kind`,\n source: fieldRef(edgeAlias, [\"kind\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_from_id`,\n source: fieldRef(edgeAlias, [\"from_id\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_to_id`,\n source: fieldRef(edgeAlias, [\"to_id\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_props`,\n source: fieldRef(edgeAlias, [\"props\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_valid_from`,\n source: fieldRef(edgeAlias, [\"valid_from\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_valid_to`,\n source: fieldRef(edgeAlias, [\"valid_to\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_created_at`,\n source: fieldRef(edgeAlias, [\"created_at\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_updated_at`,\n source: fieldRef(edgeAlias, [\"updated_at\"]),\n cteAlias,\n },\n {\n outputName: `${edgeAlias}_deleted_at`,\n source: fieldRef(edgeAlias, [\"deleted_at\"]),\n cteAlias,\n },\n ];\n}\n\n/**\n * The fluent query builder.\n *\n * Type parameters accumulate as methods are chained:\n * - G: The graph definition\n * - Aliases: Map of alias names to their node kinds\n * - EdgeAliases: Map of alias names to their edge kinds (accumulated during traversals)\n */\nexport class QueryBuilder<\n G extends GraphDef,\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty object for initial empty alias map\n Aliases extends AliasMap = {},\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type -- Empty object for initial empty edge alias map\n EdgeAliases extends EdgeAliasMap = {},\n> {\n readonly #config: QueryBuilderConfig;\n readonly #state: QueryBuilderState;\n\n constructor(config: QueryBuilderConfig, state: QueryBuilderState) {\n this.#config = config;\n this.#state = state;\n }\n\n /**\n * Starts a query from a node kind.\n *\n * @param kind - The node kind to start from\n * @param alias - A unique alias for this node (compile-time error if duplicate)\n */\n from<K extends keyof G[\"nodes\"] & string, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options?: { includeSubClasses?: false },\n ): QueryBuilder<\n G,\n Aliases & Record<A, NodeAlias<G[\"nodes\"][K][\"type\"]>>,\n EdgeAliases\n >;\n\n from<K extends keyof G[\"nodes\"] & string, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options: { includeSubClasses: true },\n ): QueryBuilder<G, Aliases & Record<A, NodeAlias>, EdgeAliases>;\n\n from<K extends keyof G[\"nodes\"] & string, A extends string>(\n kind: K,\n alias: UniqueAlias<A, Aliases>,\n options?: { includeSubClasses?: boolean },\n ): QueryBuilder<G, Aliases & Record<A, NodeAlias>, EdgeAliases> {\n // Validate alias to prevent SQL injection\n validateSqlIdentifier(alias);\n\n const includeSubClasses = options?.includeSubClasses ?? false;\n\n // Expand kinds if including subclasses\n const kinds =\n includeSubClasses ? this.#config.registry.expandSubClasses(kind) : [kind];\n\n const newState: QueryBuilderState = {\n ...this.#state,\n startAlias: alias,\n currentAlias: alias,\n startKinds: kinds,\n includeSubClasses,\n };\n\n return new QueryBuilder(this.#config, newState);\n }\n\n /**\n * Adds a WHERE clause for a node.\n */\n whereNode<A extends keyof Aliases & string>(\n alias: A,\n predicateFunction: (n: NodeAccessor<Aliases[A][\"kind\"]>) => Predicate,\n ): QueryBuilder<G, Aliases, EdgeAliases> {\n const accessor = this.#createNodeAccessor(alias);\n const predicate = predicateFunction(\n accessor as NodeAccessor<Aliases[A][\"kind\"]>,\n );\n\n const newState: QueryBuilderState = {\n ...this.#state,\n predicates: [\n ...this.#state.predicates,\n {\n targetAlias: alias,\n expression: predicate.__expr,\n },\n ],\n };\n\n return new QueryBuilder(this.#config, newState);\n }\n\n /**\n * Adds a WHERE clause for an edge.\n *\n * @param alias - The edge alias to filter on\n * @param predicateFunction - A function that builds predicates using the edge accessor\n */\n whereEdge<EA extends keyof EdgeAliases & string>(\n alias: EA,\n predicateFunction: (\n edge: EdgeAccessor<EdgeAliases[EA][\"kind\"]>,\n ) => Predicate,\n ): QueryBuilder<G, Aliases, EdgeAliases> {\n const accessor = this.#createEdgeAccessor(alias);\n const predicate = predicateFunction(\n accessor as EdgeAccessor<EdgeAliases[EA][\"kind\"]>,\n );\n\n const newState: QueryBuilderState = {\n ...this.#state,\n predicates: [\n ...this.#state.predicates,\n {\n targetAlias: alias,\n targetType: \"edge\",\n expression: predicate.__expr,\n },\n ],\n };\n\n return new QueryBuilder(this.#config, newState);\n }\n\n /**\n * Traverses an edge to another node (outgoing direction).\n *\n * By default, traverses from the current node (last traversal target, or start node).\n * Use the `from` option to traverse from a different alias (fan-out pattern).\n *\n * @param options.includeImplyingEdges - If true, also match edges that imply this edge kind\n * @param options.from - Alias to traverse from (defaults to current/last traversal target)\n */\n traverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options?: {\n direction?: \"out\";\n includeImplyingEdges?: boolean;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<G, Aliases, EdgeAliases, EK, EA>;\n\n /**\n * Traverses an edge to another node (incoming direction).\n *\n * By default, traverses from the current node (last traversal target, or start node).\n * Use the `from` option to traverse from a different alias (fan-out pattern).\n *\n * @param options.direction - Set to \"in\" for incoming edge traversal\n * @param options.includeImplyingEdges - If true, also match edges that imply this edge kind\n * @param options.from - Alias to traverse from (defaults to current/last traversal target)\n */\n traverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options: {\n direction: \"in\";\n includeImplyingEdges?: boolean;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<G, Aliases, EdgeAliases, EK, EA, \"in\">;\n\n traverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options?: {\n direction?: TraversalDirection;\n includeImplyingEdges?: boolean;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<G, Aliases, EdgeAliases, EK, EA, TraversalDirection> {\n // Validate edge alias to prevent SQL injection\n validateSqlIdentifier(edgeAlias);\n\n const direction = options?.direction ?? \"out\";\n const includeImplyingEdges = options?.includeImplyingEdges ?? false;\n // Use explicit `from` if provided, otherwise chain from currentAlias\n const fromAlias = options?.from ?? this.#state.currentAlias;\n\n // Expand edge kinds if including implying edges\n const edgeKinds =\n includeImplyingEdges ?\n this.#config.registry.expandImplyingEdges(edgeKind)\n : [edgeKind];\n\n return new TraversalBuilder(\n this.#config,\n this.#state,\n edgeKinds,\n edgeAlias,\n direction,\n fromAlias,\n false,\n );\n }\n\n /**\n * Optionally traverses an edge to another node (LEFT JOIN semantics).\n * If no matching edge/node exists, the result will include null values.\n *\n * By default, traverses from the current node (last traversal target, or start node).\n * Use the `from` option to traverse from a different alias (fan-out pattern).\n *\n * @param options.direction - Direction of traversal: \"out\" (default) or \"in\"\n * @param options.includeImplyingEdges - If true, also match edges that imply this edge kind\n * @param options.from - Alias to traverse from (defaults to current/last traversal target)\n */\n optionalTraverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options?: {\n direction?: \"out\";\n includeImplyingEdges?: boolean;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<G, Aliases, EdgeAliases, EK, EA, \"out\", true>;\n\n optionalTraverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options: {\n direction: \"in\";\n includeImplyingEdges?: boolean;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<G, Aliases, EdgeAliases, EK, EA, \"in\", true>;\n\n optionalTraverse<EK extends keyof G[\"edges\"] & string, EA extends string>(\n edgeKind: EK,\n edgeAlias: EA,\n options?: {\n direction?: TraversalDirection;\n includeImplyingEdges?: boolean;\n from?: keyof Aliases & string;\n },\n ): TraversalBuilder<\n G,\n Aliases,\n EdgeAliases,\n EK,\n EA,\n TraversalDirection,\n true\n > {\n // Validate edge alias to prevent SQL injection\n validateSqlIdentifier(edgeAlias);\n\n const direction = options?.direction ?? \"out\";\n const includeImplyingEdges = options?.includeImplyingEdges ?? false;\n // Use explicit `from` if provided, otherwise chain from currentAlias\n const fromAlias = options?.from ?? this.#state.currentAlias;\n\n // Expand edge kinds if including implying edges\n const edgeKinds =\n includeImplyingEdges ?\n this.#config.registry.expandImplyingEdges(edgeKind)\n : [edgeKind];\n\n return new TraversalBuilder(\n this.#config,\n this.#state,\n edgeKinds,\n edgeAlias,\n direction,\n fromAlias,\n true,\n );\n }\n\n /**\n * Selects fields to return.\n */\n select<R>(\n selectFunction: (context: SelectContext<Aliases, EdgeAliases>) => R,\n ): ExecutableQuery<G, Aliases, EdgeAliases, R> {\n // For now, project all fields from all aliases\n // A more sophisticated implementation would parse the selectFn\n\n // Start node fields (including metadata)\n const startFields = buildNodeFields(this.#state.startAlias);\n\n // Traversal node and edge fields (including metadata)\n // Edge fields are in the node's CTE, so we pass the node alias for CTE reference\n const traversalFields = this.#state.traversals.flatMap((traversal) => [\n ...buildEdgeFields(traversal.edgeAlias, traversal.nodeAlias),\n ...buildNodeFields(traversal.nodeAlias),\n ]);\n\n const projection = [...startFields, ...traversalFields];\n\n const newState: QueryBuilderState = {\n ...this.#state,\n projection,\n };\n\n return new ExecutableQuery(this.#config, newState, selectFunction);\n }\n\n /**\n * Selects fields including aggregates.\n * Use with groupBy() for aggregate queries.\n *\n * @param fields - Object mapping output names to field refs or aggregate expressions\n */\n selectAggregate<R extends Record<string, FieldRef | AggregateExpr>>(\n fields: R,\n ): ExecutableAggregateQuery<G, Aliases, R> {\n const resolvedFields = Object.fromEntries(\n Object.entries(fields).map(([outputName, source]) => {\n if (source.__type !== \"field_ref\") {\n return [outputName, source];\n }\n\n if (\n source.valueType !== undefined ||\n source.path.length !== 1 ||\n source.path[0] !== \"props\" ||\n source.jsonPointer === undefined\n ) {\n return [outputName, source];\n }\n\n const segments = parseJsonPointer(source.jsonPointer);\n if (segments.length !== 1) {\n return [outputName, source];\n }\n\n const propertyName = segments[0];\n if (propertyName === undefined) {\n return [outputName, source];\n }\n\n const kindNames = this.#getKindNamesForAlias(source.alias);\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(\n kindNames,\n propertyName,\n )\n : undefined;\n\n if (!typeInfo) {\n return [outputName, source];\n }\n\n return [\n outputName,\n {\n ...source,\n valueType: typeInfo.valueType,\n elementType: typeInfo.elementType,\n } satisfies FieldRef,\n ];\n }),\n ) as R;\n\n const projection: ProjectedField[] = Object.entries(resolvedFields).map(\n ([outputName, source]) => ({\n outputName,\n source,\n }),\n );\n\n const newState: QueryBuilderState = {\n ...this.#state,\n projection,\n };\n\n return new ExecutableAggregateQuery(this.#config, newState, resolvedFields);\n }\n\n /**\n * Orders results.\n */\n orderBy<A extends keyof Aliases & string>(\n alias: A,\n field: string,\n direction: SortDirection = \"asc\",\n ): QueryBuilder<G, Aliases, EdgeAliases> {\n const kindNames = this.#getKindNamesForAlias(alias);\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(kindNames, field)\n : undefined;\n\n const orderSpec: OrderSpec = {\n field: fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([field]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n }),\n direction,\n };\n\n const newState: QueryBuilderState = {\n ...this.#state,\n orderBy: [...this.#state.orderBy, orderSpec],\n };\n\n return new QueryBuilder(this.#config, newState);\n }\n\n /**\n * Limits the number of results.\n */\n limit(n: number): QueryBuilder<G, Aliases, EdgeAliases> {\n return new QueryBuilder(this.#config, {\n ...this.#state,\n limit: n,\n });\n }\n\n /**\n * Offsets the results.\n */\n offset(n: number): QueryBuilder<G, Aliases, EdgeAliases> {\n return new QueryBuilder(this.#config, {\n ...this.#state,\n offset: n,\n });\n }\n\n /**\n * Sets temporal mode.\n *\n * @param mode - The temporal mode to use\n * @param asOf - Required timestamp for \"asOf\" mode (ISO 8601 string)\n * @throws ValidationError if mode is \"asOf\" but no timestamp is provided\n */\n temporal(\n mode: TemporalMode,\n asOf?: string,\n ): QueryBuilder<G, Aliases, EdgeAliases> {\n if (mode === \"asOf\" && asOf === undefined) {\n throw new ValidationError(\n 'Temporal mode \"asOf\" requires a timestamp',\n {\n issues: [\n { path: \"asOf\", message: \"Timestamp is required for asOf mode\" },\n ],\n },\n {\n suggestion: `Use .temporal(\"asOf\", \"2024-01-15T10:00:00.000Z\") or .temporal(\"current\") for current time.`,\n },\n );\n }\n return new QueryBuilder(this.#config, {\n ...this.#state,\n temporalMode: mode,\n asOf,\n });\n }\n\n /**\n * Groups results by the specified field.\n * Use with aggregate functions like COUNT, SUM, AVG in select().\n *\n * @param alias - The node alias to group by\n * @param field - The field name to group by\n */\n groupBy<A extends keyof Aliases & string>(\n alias: A,\n field: string,\n ): QueryBuilder<G, Aliases, EdgeAliases> {\n const kindNames = this.#getKindNamesForAlias(alias);\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(kindNames, field)\n : undefined;\n\n const fieldRefValue: FieldRef = {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n };\n\n const existingFields = this.#state.groupBy?.fields ?? [];\n const newGroupBy: GroupBySpec = {\n fields: [...existingFields, fieldRefValue],\n };\n\n return new QueryBuilder(this.#config, {\n ...this.#state,\n groupBy: newGroupBy,\n });\n }\n\n /**\n * Groups results by the node ID.\n * Use when you want to group by a complete node rather than a specific field.\n *\n * @param alias - The node alias to group by (uses the node's ID)\n */\n groupByNode<A extends keyof Aliases & string>(\n alias: A,\n ): QueryBuilder<G, Aliases, EdgeAliases> {\n const fieldRefValue: FieldRef = {\n __type: \"field_ref\",\n alias,\n path: [\"id\"],\n valueType: \"string\",\n };\n\n const existingFields = this.#state.groupBy?.fields ?? [];\n const newGroupBy: GroupBySpec = {\n fields: [...existingFields, fieldRefValue],\n };\n\n return new QueryBuilder(this.#config, {\n ...this.#state,\n groupBy: newGroupBy,\n });\n }\n\n /**\n * Filters grouped results using aggregate conditions (HAVING clause).\n * Use after groupBy() to filter based on aggregate values.\n *\n * @param predicate - A predicate expression to filter groups\n */\n having(\n predicate: PredicateExpression,\n ): QueryBuilder<G, Aliases, EdgeAliases> {\n return new QueryBuilder(this.#config, {\n ...this.#state,\n having: predicate,\n });\n }\n\n /**\n * Applies a query fragment to transform this builder.\n *\n * Fragments are reusable query transformations that can add predicates,\n * traversals, ordering, and other query operations. Use this for\n * composing complex queries from simpler, reusable parts.\n *\n * @example\n * ```typescript\n * // Define a reusable fragment\n * const activeUsers = createFragment<MyGraph>()((q) =>\n * q.whereNode(\"u\", ({ status }) => status.eq(\"active\"))\n * );\n *\n * // Apply the fragment\n * const results = await query()\n * .from(\"User\", \"u\")\n * .pipe(activeUsers)\n * .select((ctx) => ctx.u)\n * .execute();\n * ```\n *\n * @param fragment - A function that transforms the builder\n * @returns The transformed builder\n */\n pipe<\n OutAliases extends AliasMap,\n OutEdgeAliases extends EdgeAliasMap = EdgeAliases,\n >(\n fragment: (\n builder: QueryBuilder<G, Aliases, EdgeAliases>,\n ) => QueryBuilder<G, OutAliases, OutEdgeAliases>,\n ): QueryBuilder<G, OutAliases, OutEdgeAliases> {\n return fragment(this);\n }\n\n /**\n * Gets all kind names for an alias.\n */\n #getKindNamesForAlias(alias: string): readonly string[] | undefined {\n if (alias === this.#state.startAlias) {\n return this.#state.startKinds;\n }\n for (const traversal of this.#state.traversals) {\n if (traversal.nodeAlias === alias) {\n return traversal.nodeKinds;\n }\n }\n return undefined;\n }\n\n /**\n * Determines the appropriate field builder based on Zod schema type.\n */\n #getFieldBuilderForProperty(\n kindNames: readonly string[] | undefined,\n property: string,\n alias: string,\n ): BaseFieldAccessor {\n const typeInfo =\n kindNames ?\n this.#config.schemaIntrospector.getSharedFieldTypeInfo(\n kindNames,\n property,\n )\n : undefined;\n\n const ref = fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([property]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n });\n\n return this.#buildFieldBuilderForTypeInfo(ref, typeInfo);\n }\n\n #buildFieldBuilderForTypeInfo(\n ref: ReturnType<typeof fieldRef>,\n typeInfo: FieldTypeInfo | undefined,\n ): BaseFieldAccessor {\n if (!typeInfo) {\n return baseField(ref);\n }\n\n switch (typeInfo.valueType) {\n case \"string\": {\n return stringField(ref);\n }\n case \"number\": {\n return numberField(ref);\n }\n case \"boolean\": {\n return baseField(ref);\n }\n case \"date\": {\n return dateField(ref);\n }\n case \"array\": {\n return arrayField(ref);\n }\n case \"object\": {\n return objectField(ref, { typeInfo });\n }\n case \"embedding\": {\n return embeddingField(ref);\n }\n case \"unknown\": {\n return baseField(ref);\n }\n }\n }\n\n #createNodeAccessor(alias: string): NodeAccessor<NodeType> {\n const kindNames = this.#getKindNamesForAlias(alias);\n const idAccessor = stringField(\n fieldRef(alias, [\"id\"], { valueType: \"string\" }),\n );\n const kindAccessor = stringField(\n fieldRef(alias, [\"kind\"], { valueType: \"string\" }),\n );\n\n // Use a Proxy to provide flattened property access\n return new Proxy({} as NodeAccessor<NodeType>, {\n get: (_, property: string | symbol) => {\n // Handle symbols and special properties to avoid infinite loops\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n // System fields\n if (property === \"id\") return idAccessor;\n if (property === \"kind\") return kindAccessor;\n\n // Schema properties\n return this.#getFieldBuilderForProperty(kindNames, property, alias);\n },\n });\n }\n\n /**\n * Gets edge kind names for an edge alias.\n */\n #getEdgeKindNamesForAlias(alias: string): readonly string[] | undefined {\n for (const traversal of this.#state.traversals) {\n if (traversal.edgeAlias === alias) {\n return traversal.edgeKinds;\n }\n }\n return undefined;\n }\n\n /**\n * Determines the appropriate field builder for an edge property based on Zod schema type.\n */\n #getFieldBuilderForEdgeProperty(\n edgeKindNames: readonly string[] | undefined,\n property: string,\n alias: string,\n ): BaseFieldAccessor {\n const typeInfo =\n edgeKindNames ?\n this.#config.schemaIntrospector.getSharedEdgeFieldTypeInfo(\n edgeKindNames,\n property,\n )\n : undefined;\n\n const ref = fieldRef(alias, [\"props\"], {\n jsonPointer: jsonPointer([property]),\n valueType: typeInfo?.valueType,\n elementType: typeInfo?.elementType,\n });\n\n return this.#buildFieldBuilderForTypeInfo(ref, typeInfo);\n }\n\n #createEdgeAccessor(alias: string): EdgeAccessor<EdgeType> {\n const edgeKindNames = this.#getEdgeKindNamesForAlias(alias);\n const idAccessor = stringField(\n fieldRef(alias, [\"id\"], { valueType: \"string\" }),\n );\n const kindAccessor = stringField(\n fieldRef(alias, [\"kind\"], { valueType: \"string\" }),\n );\n const fromIdAccessor = stringField(\n fieldRef(alias, [\"from_id\"], { valueType: \"string\" }),\n );\n const toIdAccessor = stringField(\n fieldRef(alias, [\"to_id\"], { valueType: \"string\" }),\n );\n\n // Use a Proxy to provide flattened property access\n return new Proxy({} as EdgeAccessor<EdgeType>, {\n get: (_, property: string | symbol) => {\n // Handle symbols and special properties to avoid infinite loops\n if (typeof property === \"symbol\") return;\n if (property === \"then\") return;\n if (property === \"toJSON\") return;\n\n // System fields\n if (property === \"id\") return idAccessor;\n if (property === \"kind\") return kindAccessor;\n if (property === \"fromId\") return fromIdAccessor;\n if (property === \"toId\") return toIdAccessor;\n\n // Schema properties\n return this.#getFieldBuilderForEdgeProperty(\n edgeKindNames,\n property,\n alias,\n );\n },\n });\n }\n}\n","/**\n * UnionableQuery - A query formed by combining multiple queries with set operations.\n */\nimport { type SQL } from \"drizzle-orm\";\n\nimport { type GraphDef } from \"../../core/define-graph\";\nimport {\n type ComposableQuery,\n type QueryAst,\n type SetOperation,\n type SetOperationType,\n type Traversal,\n} from \"../ast\";\nimport {\n type CompileQueryOptions,\n compileSetOperation,\n} from \"../compiler/index\";\nimport { mapResults } from \"../execution\";\nimport {\n type AliasMap,\n type EdgeAliasMap,\n type QueryBuilderConfig,\n type SelectContext,\n} from \"./types\";\n\n// Forward declaration for ExecutableQuery to avoid circular imports\n// G and R are used for type compatibility with ExecutableQuery but not accessed in the interface body\ninterface ExecutableQueryLike<\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Used for type compatibility\n G extends GraphDef,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- Used for type compatibility\n R,\n> {\n toAst(): QueryAst;\n}\n\n/**\n * Internal state for unionable query.\n */\ntype UnionableQueryState = Readonly<{\n left: ComposableQuery;\n operator: SetOperationType;\n right: ComposableQuery;\n limit?: number;\n offset?: number;\n // For result transformation\n startAlias?: string;\n traversals?: readonly Traversal[];\n selectFn?: (context: SelectContext<AliasMap, EdgeAliasMap>) => unknown;\n}>;\n\n/**\n * A query formed by combining multiple queries with set operations.\n * Supports chaining: q1.union(q2).intersect(q3)\n */\nexport class UnionableQuery<G extends GraphDef, R> {\n readonly #config: QueryBuilderConfig;\n readonly #state: UnionableQueryState;\n\n constructor(config: QueryBuilderConfig, state: UnionableQueryState) {\n this.#config = config;\n this.#state = state;\n }\n\n /**\n * Combines with another query using UNION.\n */\n union(other: ExecutableQueryLike<G, R>): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, {\n left: this.toAst(),\n operator: \"union\",\n right: other.toAst(),\n // Preserve result transformation info (only include defined properties)\n ...(this.#state.startAlias !== undefined && {\n startAlias: this.#state.startAlias,\n }),\n ...(this.#state.traversals !== undefined && {\n traversals: this.#state.traversals,\n }),\n ...(this.#state.selectFn !== undefined && {\n selectFn: this.#state.selectFn,\n }),\n });\n }\n\n /**\n * Combines with another query using UNION ALL.\n */\n unionAll(other: ExecutableQueryLike<G, R>): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, {\n left: this.toAst(),\n operator: \"unionAll\",\n right: other.toAst(),\n // Preserve result transformation info (only include defined properties)\n ...(this.#state.startAlias !== undefined && {\n startAlias: this.#state.startAlias,\n }),\n ...(this.#state.traversals !== undefined && {\n traversals: this.#state.traversals,\n }),\n ...(this.#state.selectFn !== undefined && {\n selectFn: this.#state.selectFn,\n }),\n });\n }\n\n /**\n * Combines with another query using INTERSECT.\n */\n intersect(other: ExecutableQueryLike<G, R>): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, {\n left: this.toAst(),\n operator: \"intersect\",\n right: other.toAst(),\n // Preserve result transformation info (only include defined properties)\n ...(this.#state.startAlias !== undefined && {\n startAlias: this.#state.startAlias,\n }),\n ...(this.#state.traversals !== undefined && {\n traversals: this.#state.traversals,\n }),\n ...(this.#state.selectFn !== undefined && {\n selectFn: this.#state.selectFn,\n }),\n });\n }\n\n /**\n * Combines with another query using EXCEPT.\n */\n except(other: ExecutableQueryLike<G, R>): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, {\n left: this.toAst(),\n operator: \"except\",\n right: other.toAst(),\n // Preserve result transformation info (only include defined properties)\n ...(this.#state.startAlias !== undefined && {\n startAlias: this.#state.startAlias,\n }),\n ...(this.#state.traversals !== undefined && {\n traversals: this.#state.traversals,\n }),\n ...(this.#state.selectFn !== undefined && {\n selectFn: this.#state.selectFn,\n }),\n });\n }\n\n /**\n * Limits the number of results from the combined query.\n */\n limit(n: number): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, { ...this.#state, limit: n });\n }\n\n /**\n * Offsets the results from the combined query.\n */\n offset(n: number): UnionableQuery<G, R> {\n return new UnionableQuery(this.#config, { ...this.#state, offset: n });\n }\n\n /**\n * Builds the set operation AST.\n */\n toAst(): SetOperation {\n const ast: SetOperation = {\n __type: \"set_operation\",\n operator: this.#state.operator,\n left: this.#state.left,\n right: this.#state.right,\n };\n if (this.#state.limit !== undefined) {\n (ast as { limit?: number }).limit = this.#state.limit;\n }\n if (this.#state.offset !== undefined) {\n (ast as { offset?: number }).offset = this.#state.offset;\n }\n return ast;\n }\n\n /**\n * Compiles the set operation to SQL.\n */\n compile(): SQL {\n return compileSetOperation(\n this.toAst(),\n this.#config.graphId,\n this.#compileOptions(),\n );\n }\n\n /**\n * Builds compile options from the config.\n */\n #compileOptions(): CompileQueryOptions {\n return {\n dialect: this.#config.dialect ?? \"sqlite\",\n schema: this.#config.schema,\n };\n }\n\n /**\n * Executes the combined query.\n */\n async execute(): Promise<readonly R[]> {\n if (!this.#config.backend) {\n throw new Error(\n \"Cannot execute query: no backend configured. \" +\n \"Use store.query() or pass a backend to createQueryBuilder().\",\n );\n }\n\n const compiled = this.compile();\n const rows =\n await this.#config.backend.execute<Record<string, unknown>>(compiled);\n\n // Apply select function transformation if available\n if (this.#state.selectFn && this.#state.startAlias) {\n return mapResults(\n rows,\n this.#state.startAlias,\n this.#state.traversals ?? [],\n this.#state.selectFn,\n ) as readonly R[];\n }\n\n return rows as readonly R[];\n }\n}\n","/**\n * Aggregate and HAVING Helper Functions\n *\n * Provides factory functions for creating aggregate expressions (COUNT, SUM, etc.)\n * and HAVING clause predicates for use in GROUP BY queries.\n */\nimport {\n type AggregateComparisonPredicate,\n type AggregateExpr,\n type ComparisonOp,\n type FieldRef,\n} from \"../ast\";\nimport { jsonPointer } from \"../json-pointer\";\n\n// ============================================================\n// Aggregate Helpers\n// ============================================================\n\n/**\n * Creates a COUNT aggregate expression.\n *\n * @param alias - The node alias to count\n * @param field - Optional field to count (defaults to counting nodes by ID)\n *\n * @example\n * ```typescript\n * // COUNT all persons\n * count(\"p\")\n *\n * // COUNT persons with email field\n * count(\"p\", \"email\")\n * ```\n */\nexport function count(alias: string, field?: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"count\",\n field: {\n __type: \"field_ref\",\n alias,\n path: field ? [\"props\"] : [\"id\"],\n jsonPointer: field ? jsonPointer([field]) : undefined,\n valueType: field ? undefined : \"string\",\n },\n };\n}\n\n/**\n * Creates a COUNT DISTINCT aggregate expression.\n *\n * @param alias - The node alias to count\n * @param field - Optional field to count distinct values of\n */\nexport function countDistinct(alias: string, field?: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"countDistinct\",\n field: {\n __type: \"field_ref\",\n alias,\n path: field ? [\"props\"] : [\"id\"],\n jsonPointer: field ? jsonPointer([field]) : undefined,\n valueType: field ? undefined : \"string\",\n },\n };\n}\n\n/**\n * Creates a SUM aggregate expression.\n *\n * @param alias - The node alias\n * @param field - The numeric field to sum\n */\nexport function sum(alias: string, field: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"sum\",\n field: {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: \"number\",\n },\n };\n}\n\n/**\n * Creates an AVG aggregate expression.\n *\n * @param alias - The node alias\n * @param field - The numeric field to average\n */\nexport function avg(alias: string, field: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"avg\",\n field: {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: \"number\",\n },\n };\n}\n\n/**\n * Creates a MIN aggregate expression.\n *\n * @param alias - The node alias\n * @param field - The field to find minimum of\n */\nexport function min(alias: string, field: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"min\",\n field: {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: \"number\",\n },\n };\n}\n\n/**\n * Creates a MAX aggregate expression.\n *\n * @param alias - The node alias\n * @param field - The field to find maximum of\n */\nexport function max(alias: string, field: string): AggregateExpr {\n return {\n __type: \"aggregate\",\n function: \"max\",\n field: {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer([field]),\n valueType: \"number\",\n },\n };\n}\n\n/**\n * Creates a field reference for use in selectAggregate.\n *\n * @param alias - The node alias\n * @param path - Path to the field. Use \"id\" for node ID, \"kind\" for node kind,\n * or the property name directly (e.g., \"title\", \"year\").\n *\n * @example\n * ```typescript\n * field(\"p\", \"id\") // Node ID\n * field(\"p\", \"kind\") // Node kind\n * field(\"p\", \"title\") // Property field\n * field(\"p\", \"nested\", \"field\") // Nested property\n * ```\n */\nexport function field(alias: string, ...path: string[]): FieldRef {\n if (path.length === 0 || path[0] === \"id\") {\n return {\n __type: \"field_ref\",\n alias,\n path: [\"id\"],\n valueType: \"string\",\n };\n }\n if (path[0] === \"kind\") {\n return {\n __type: \"field_ref\",\n alias,\n path: [\"kind\"],\n valueType: \"string\",\n };\n }\n if (path[0] === \"props\") {\n throw new Error(\n `field(): Do not include \"props\" in the path. Use field(\"${alias}\", ${path\n .slice(1)\n .map((p) => `\"${p}\"`)\n .join(\", \")}) instead.`,\n );\n }\n return {\n __type: \"field_ref\",\n alias,\n path: [\"props\"],\n jsonPointer: jsonPointer(path),\n };\n}\n\n// ============================================================\n// HAVING Helpers\n// ============================================================\n\n/**\n * Creates a HAVING predicate that compares an aggregate to a value.\n *\n * @param aggregate - The aggregate expression (count, sum, avg, etc.)\n * @param op - The comparison operator\n * @param value - The value to compare against\n *\n * @example\n * ```typescript\n * // HAVING COUNT(*) > 10\n * having(count(\"p\"), \"gt\", 10)\n *\n * // HAVING AVG(salary) >= 50000\n * having(avg(\"p\", \"salary\"), \"gte\", 50000)\n * ```\n */\nexport function having(\n aggregate: AggregateExpr,\n op: ComparisonOp,\n value: number | string | boolean,\n): AggregateComparisonPredicate {\n return {\n __type: \"aggregate_comparison\",\n op,\n aggregate,\n value: {\n __type: \"literal\",\n value,\n valueType: typeof value === \"number\" ? \"number\" : \"string\",\n },\n };\n}\n\n/**\n * Creates a HAVING predicate: aggregate > value\n */\nexport function havingGt(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"gt\", value);\n}\n\n/**\n * Creates a HAVING predicate: aggregate >= value\n */\nexport function havingGte(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"gte\", value);\n}\n\n/**\n * Creates a HAVING predicate: aggregate < value\n */\nexport function havingLt(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"lt\", value);\n}\n\n/**\n * Creates a HAVING predicate: aggregate <= value\n */\nexport function havingLte(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"lte\", value);\n}\n\n/**\n * Creates a HAVING predicate: aggregate = value\n */\nexport function havingEq(\n aggregate: AggregateExpr,\n value: number,\n): AggregateComparisonPredicate {\n return having(aggregate, \"eq\", value);\n}\n","/**\n * Query Fragment Composition\n *\n * Provides types and utilities for creating reusable query fragments\n * that can be composed together using the pipe() method.\n *\n * @example\n * ```typescript\n * // Define a reusable fragment\n * const activeUsers = createFragment<MyGraph>()((q) =>\n * q.whereNode(\"u\", ({ status }) => status.eq(\"active\"))\n * );\n *\n * // Use in queries\n * const results = await query()\n * .from(\"User\", \"u\")\n * .pipe(activeUsers)\n * .select((ctx) => ctx.u)\n * .execute();\n * ```\n */\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type QueryBuilder } from \"./query-builder\";\nimport { type TraversalBuilder } from \"./traversal-builder\";\nimport { type AliasMap, type EdgeAliasMap } from \"./types\";\n\n// ============================================================\n// Fragment Types\n// ============================================================\n\n/**\n * A query fragment that transforms a QueryBuilder.\n *\n * Fragments are functions that take a builder and return a modified builder.\n * They can add predicates, traversals, ordering, and other query operations.\n *\n * @typeParam G - The graph definition\n * @typeParam InAliases - Input alias map (what the fragment requires)\n * @typeParam OutAliases - Output alias map (what the fragment produces)\n * @typeParam InEdgeAliases - Input edge alias map\n * @typeParam OutEdgeAliases - Output edge alias map\n */\nexport type QueryFragment<\n G extends GraphDef,\n InAliases extends AliasMap = AliasMap,\n OutAliases extends AliasMap = InAliases,\n InEdgeAliases extends EdgeAliasMap = EdgeAliasMap,\n OutEdgeAliases extends EdgeAliasMap = InEdgeAliases,\n> = (\n builder: QueryBuilder<G, InAliases, InEdgeAliases>,\n) => QueryBuilder<G, OutAliases, OutEdgeAliases>;\n\n/**\n * A flexible query fragment that works with any compatible builder.\n *\n * Use this when you want a fragment that only requires certain aliases\n * to exist, but doesn't care about other aliases that may be present.\n */\nexport type FlexibleQueryFragment<\n G extends GraphDef,\n RequiredAliases extends AliasMap = AliasMap,\n AddedAliases extends AliasMap = AliasMap,\n RequiredEdgeAliases extends EdgeAliasMap = EdgeAliasMap,\n AddedEdgeAliases extends EdgeAliasMap = EdgeAliasMap,\n> = <Aliases extends RequiredAliases, EdgeAliases extends RequiredEdgeAliases>(\n builder: QueryBuilder<G, Aliases, EdgeAliases>,\n) => QueryBuilder<G, Aliases & AddedAliases, EdgeAliases & AddedEdgeAliases>;\n\n/**\n * A traversal fragment that transforms a TraversalBuilder.\n *\n * Use this for reusable traversal patterns including edge filtering,\n * recursive traversals, and path collection.\n */\nexport type TraversalFragment<\n G extends GraphDef,\n EK extends keyof G[\"edges\"] & string,\n EA extends string,\n InAliases extends AliasMap = AliasMap,\n InEdgeAliases extends EdgeAliasMap = EdgeAliasMap,\n> = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Direction type is context-dependent\n builder: TraversalBuilder<G, InAliases, InEdgeAliases, EK, EA, any>,\n) => unknown;\n\n// ============================================================\n// Fragment Factory\n// ============================================================\n\n/**\n * Creates a typed query fragment factory for a specific graph.\n *\n * This is the recommended way to create reusable fragments with full type safety.\n * The factory returns a function that creates fragments bound to your graph type.\n *\n * @example\n * ```typescript\n * // Create a factory for your graph\n * const fragment = createFragment<MyGraph>();\n *\n * // Define a simple filter fragment\n * const activeOnly = fragment((q) =>\n * q.whereNode(\"u\", ({ isActive }) => isActive.eq(true))\n * );\n *\n * // Define a traversal fragment\n * const withManager = fragment((q) =>\n * q.traverse(\"reportsTo\", \"r\").to(\"User\", \"manager\")\n * );\n *\n * // Compose fragments\n * query()\n * .from(\"User\", \"u\")\n * .pipe(activeOnly)\n * .pipe(withManager)\n * .select((ctx) => ({ user: ctx.u, manager: ctx.manager }))\n * ```\n */\n/**\n * Identity function used by createFragment to return the fragment unchanged.\n * Defined at module scope to satisfy consistent-function-scoping lint rule.\n */\nfunction fragmentIdentity<\n G extends GraphDef,\n InAliases extends AliasMap,\n OutAliases extends AliasMap,\n InEdgeAliases extends EdgeAliasMap,\n OutEdgeAliases extends EdgeAliasMap,\n>(\n fn: (\n builder: QueryBuilder<G, InAliases, InEdgeAliases>,\n ) => QueryBuilder<G, OutAliases, OutEdgeAliases>,\n): QueryFragment<G, InAliases, OutAliases, InEdgeAliases, OutEdgeAliases> {\n return fn;\n}\n\nexport function createFragment<G extends GraphDef>(): <\n InAliases extends AliasMap,\n OutAliases extends AliasMap,\n InEdgeAliases extends EdgeAliasMap,\n OutEdgeAliases extends EdgeAliasMap,\n>(\n fn: (\n builder: QueryBuilder<G, InAliases, InEdgeAliases>,\n ) => QueryBuilder<G, OutAliases, OutEdgeAliases>,\n) => QueryFragment<G, InAliases, OutAliases, InEdgeAliases, OutEdgeAliases> {\n return fragmentIdentity;\n}\n\n/**\n * Combines multiple fragments into a single fragment.\n *\n * Fragments are applied in order from left to right.\n *\n * @example\n * ```typescript\n * const combinedFragment = composeFragments(\n * activeOnly,\n * withManager,\n * recentlyUpdated\n * );\n *\n * query()\n * .from(\"User\", \"u\")\n * .pipe(combinedFragment)\n * .select(...)\n * ```\n */\nexport function composeFragments<\n G extends GraphDef,\n A1 extends AliasMap,\n A2 extends AliasMap,\n E1 extends EdgeAliasMap,\n E2 extends EdgeAliasMap,\n>(f1: QueryFragment<G, A1, A2, E1, E2>): QueryFragment<G, A1, A2, E1, E2>;\n\nexport function composeFragments<\n G extends GraphDef,\n A1 extends AliasMap,\n A2 extends AliasMap,\n A3 extends AliasMap,\n E1 extends EdgeAliasMap,\n E2 extends EdgeAliasMap,\n E3 extends EdgeAliasMap,\n>(\n f1: QueryFragment<G, A1, A2, E1, E2>,\n f2: QueryFragment<G, A2, A3, E2, E3>,\n): QueryFragment<G, A1, A3, E1, E3>;\n\nexport function composeFragments<\n G extends GraphDef,\n A1 extends AliasMap,\n A2 extends AliasMap,\n A3 extends AliasMap,\n A4 extends AliasMap,\n E1 extends EdgeAliasMap,\n E2 extends EdgeAliasMap,\n E3 extends EdgeAliasMap,\n E4 extends EdgeAliasMap,\n>(\n f1: QueryFragment<G, A1, A2, E1, E2>,\n f2: QueryFragment<G, A2, A3, E2, E3>,\n f3: QueryFragment<G, A3, A4, E3, E4>,\n): QueryFragment<G, A1, A4, E1, E4>;\n\nexport function composeFragments<\n G extends GraphDef,\n A1 extends AliasMap,\n A2 extends AliasMap,\n A3 extends AliasMap,\n A4 extends AliasMap,\n A5 extends AliasMap,\n E1 extends EdgeAliasMap,\n E2 extends EdgeAliasMap,\n E3 extends EdgeAliasMap,\n E4 extends EdgeAliasMap,\n E5 extends EdgeAliasMap,\n>(\n f1: QueryFragment<G, A1, A2, E1, E2>,\n f2: QueryFragment<G, A2, A3, E2, E3>,\n f3: QueryFragment<G, A3, A4, E3, E4>,\n f4: QueryFragment<G, A4, A5, E4, E5>,\n): QueryFragment<G, A1, A5, E1, E5>;\n\nexport function composeFragments<G extends GraphDef>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Variadic composition requires any\n ...fragments: QueryFragment<G, any, any, any, any>[]\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Return type depends on input types\n): QueryFragment<G, any, any, any, any> {\n return (builder) => {\n let result = builder;\n for (const fragment of fragments) {\n result = fragment(result);\n }\n return result;\n };\n}\n\n// ============================================================\n// Common Fragment Patterns\n// ============================================================\n\n/**\n * Creates a fragment that adds ordering.\n *\n * @example\n * ```typescript\n * const byCreatedAt = orderByFragment<MyGraph, \"u\">(\"u\", \"createdAt\", \"desc\");\n * ```\n */\nexport function orderByFragment<G extends GraphDef, A extends string>(\n alias: A,\n field: string,\n direction: \"asc\" | \"desc\" = \"asc\",\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Flexible alias types\n): QueryFragment<G, any, any, any, any> {\n return (builder) => builder.orderBy(alias, field, direction);\n}\n\n/**\n * Creates a fragment that adds a limit.\n *\n * @example\n * ```typescript\n * const first10 = limitFragment<MyGraph>(10);\n * ```\n */\nexport function limitFragment<G extends GraphDef>(\n n: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Flexible alias types\n): QueryFragment<G, any, any, any, any> {\n return (builder) => builder.limit(n);\n}\n\n/**\n * Creates a fragment that adds an offset.\n *\n * @example\n * ```typescript\n * const skip10 = offsetFragment<MyGraph>(10);\n * ```\n */\nexport function offsetFragment<G extends GraphDef>(\n n: number,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Flexible alias types\n): QueryFragment<G, any, any, any, any> {\n return (builder) => builder.offset(n);\n}\n","/**\n * Query Builder Module\n *\n * Re-exports from the builder submodules for clean imports.\n * Also wires up circular dependencies between classes.\n */\n\n// Import classes for circular dependency wiring\nimport { setUnionableQueryClass } from \"./executable-query\";\nimport { QueryBuilder } from \"./query-builder\";\nimport { setQueryBuilderClass } from \"./traversal-builder\";\nimport { UnionableQuery } from \"./unionable-query\";\n\n// Wire up circular dependencies.\n// Type assertions are needed because the circular dependency resolution\n// requires passing classes that TypeScript can't verify at module init time.\nsetQueryBuilderClass(\n QueryBuilder as unknown as Parameters<typeof setQueryBuilderClass>[0],\n);\nsetUnionableQueryClass(\n UnionableQuery as unknown as Parameters<typeof setUnionableQueryClass>[0],\n);\n\n// Classes\nexport {\n type AggregateResult,\n ExecutableAggregateQuery,\n} from \"./executable-aggregate-query\";\nexport { ExecutableQuery } from \"./executable-query\";\nexport { QueryBuilder } from \"./query-builder\";\nexport { TraversalBuilder } from \"./traversal-builder\";\nexport { UnionableQuery } from \"./unionable-query\";\n\n// Aggregate helpers\nexport {\n avg,\n count,\n countDistinct,\n field,\n having,\n havingEq,\n havingGt,\n havingGte,\n havingLt,\n havingLte,\n max,\n min,\n sum,\n} from \"./aggregates\";\n\n// Fragment composition\nexport {\n composeFragments,\n createFragment,\n type FlexibleQueryFragment,\n limitFragment,\n offsetFragment,\n orderByFragment,\n type QueryFragment,\n type TraversalFragment,\n} from \"./fragment\";\n\n// AST building utilities\nexport { buildQueryAst } from \"./ast-builder\";\n\n// Pagination utilities (re-exported from execution/)\nexport {\n adjustOrderByForDirection,\n buildCursorFromContext,\n buildCursorPredicate,\n buildPaginatedResult,\n createStreamIterable,\n getStreamBatchSize,\n parsePaginateOptions,\n validateCursor,\n validatePaginationParams,\n} from \"../execution/pagination\";\n\n// Result mapping utilities (re-exported from execution/)\nexport {\n buildSelectableNode,\n buildSelectContext,\n mapResults,\n transformPathColumns,\n} from \"../execution/result-mapper\";\n\n// Types\nexport {\n type AliasMap,\n type ArrayFieldAccessor,\n type BaseFieldAccessor,\n type BooleanFieldAccessor,\n type CreateQueryBuilderOptions,\n type DateFieldAccessor,\n type EdgeAccessor,\n type EmbeddingFieldAccessor,\n type FieldAccessor,\n type NodeAccessor,\n type NodeAlias,\n type NumberFieldAccessor,\n type ObjectFieldAccessor,\n type PaginatedResult,\n type PaginateOptions,\n type PropsAccessor,\n type QueryBuilderConfig,\n type QueryBuilderState,\n type SelectableEdge,\n type SelectableNode,\n type SelectContext,\n type StreamOptions,\n type StringFieldAccessor,\n type UniqueAlias,\n type ValidEdgeTargets,\n} from \"./types\";\n\n// Validation utilities\nexport { validateSqlIdentifier } from \"./validation\";\n","/**\n * Fluent query builder for TypeGraph.\n *\n * Provides a type-safe, chainable API for building queries.\n * Each method returns a new builder instance with expanded type information.\n *\n * This module re-exports from the builder submodules and provides the\n * createQueryBuilder factory function.\n */\nimport { type GraphDef } from \"../core/define-graph\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\nimport {\n type CreateQueryBuilderOptions,\n QueryBuilder,\n type QueryBuilderConfig,\n type QueryBuilderState,\n} from \"./builder/index\";\nimport { createSchemaIntrospector } from \"./schema-introspector\";\n\n// Re-export all classes\nexport {\n ExecutableAggregateQuery,\n ExecutableQuery,\n QueryBuilder,\n} from \"./builder/index\";\n\n// Re-export aggregate helpers\nexport {\n avg,\n count,\n countDistinct,\n field,\n having,\n havingEq,\n havingGt,\n havingGte,\n havingLt,\n havingLte,\n max,\n min,\n sum,\n} from \"./builder/index\";\n\n// Re-export types\nexport type {\n AggregateResult,\n AliasMap,\n EdgeAccessor,\n FieldAccessor,\n NodeAccessor,\n NodeAlias,\n PaginatedResult,\n PaginateOptions,\n PropsAccessor,\n SelectableEdge,\n SelectableNode,\n SelectContext,\n StreamOptions,\n} from \"./builder/index\";\n\n// ============================================================\n// Factory Function\n// ============================================================\n\n/**\n * Creates a new query builder for a graph.\n *\n * @param graphId - The graph identifier\n * @param registry - The kind registry for ontology lookups\n * @param options - Optional backend and dialect configuration\n * @returns A new QueryBuilder instance\n *\n * @example\n * ```typescript\n * // Without execution capability (compile only)\n * const builder = createQueryBuilder<MyGraph>(\"my_graph\", registry);\n *\n * // With execution capability\n * const builder = createQueryBuilder<MyGraph>(\"my_graph\", registry, {\n * backend: myBackend,\n * dialect: \"sqlite\",\n * });\n * ```\n */\nexport function createQueryBuilder<G extends GraphDef>(\n graphId: string,\n registry: KindRegistry,\n options?: CreateQueryBuilderOptions,\n): QueryBuilder<G> {\n const schemaIntrospector = createSchemaIntrospector(\n registry.nodeKinds,\n registry.edgeKinds,\n );\n\n // Build config, only including optional properties if defined\n const config: QueryBuilderConfig = {\n graphId,\n registry,\n schemaIntrospector,\n ...(options?.backend !== undefined && { backend: options.backend }),\n ...(options?.dialect !== undefined && { dialect: options.dialect }),\n ...(options?.schema !== undefined && { schema: options.schema }),\n };\n\n const initialState: QueryBuilderState = {\n startAlias: \"\",\n currentAlias: \"\",\n startKinds: [],\n includeSubClasses: false,\n traversals: [],\n predicates: [],\n projection: [],\n orderBy: [],\n limit: undefined,\n offset: undefined,\n temporalMode: \"current\",\n asOf: undefined,\n groupBy: undefined,\n having: undefined,\n };\n\n return new QueryBuilder(config, initialState);\n}\n","/**\n * EdgeCollection implementation.\n *\n * Provides an ergonomic API for CRUD operations on a specific edge type.\n */\nimport { type z } from \"zod\";\n\nimport {\n type GraphBackend,\n type TransactionBackend,\n} from \"../../backend/types\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type KindRegistry } from \"../../registry\";\nimport {\n type Edge,\n type EdgeCollection,\n type NodeRef,\n type QueryOptions,\n} from \"../types\";\n\n/**\n * Creates an EdgeCollection for a specific edge type.\n */\nexport function createEdgeCollection<\n G extends GraphDef,\n K extends keyof G[\"edges\"] & string,\n>(\n graphId: string,\n kind: K,\n _registry: KindRegistry,\n backend: GraphBackend | TransactionBackend,\n rowToEdge: (row: {\n id: string;\n kind: string;\n from_kind: string;\n from_id: string;\n to_kind: string;\n to_id: string;\n props: string;\n valid_from: string | undefined;\n valid_to: string | undefined;\n created_at: string;\n updated_at: string;\n deleted_at: string | undefined;\n }) => Edge,\n executeEdgeCreate: (\n input: {\n kind: string;\n id?: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Edge>,\n executeEdgeUpdate: (\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Edge>,\n executeEdgeDelete: (\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>,\n executeEdgeHardDelete: (\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>,\n matchesTemporalMode: (\n row: {\n deleted_at: string | undefined;\n valid_from: string | undefined;\n valid_to: string | undefined;\n },\n options?: QueryOptions,\n ) => boolean,\n): EdgeCollection<G[\"edges\"][K][\"type\"]> {\n type E = G[\"edges\"][K][\"type\"];\n\n return {\n async create(\n from: NodeRef,\n to: NodeRef,\n props?: z.input<E[\"schema\"]>,\n options?: Readonly<{ id?: string; validFrom?: string; validTo?: string }>,\n ): Promise<Edge<E>> {\n const input: {\n kind: string;\n id?: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind: kind,\n fromKind: from.kind,\n fromId: from.id,\n toKind: to.kind,\n toId: to.id,\n props: (props ?? {}) as Record<string, unknown>,\n };\n if (options?.id !== undefined) input.id = options.id;\n if (options?.validFrom !== undefined) input.validFrom = options.validFrom;\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeEdgeCreate(input, backend);\n return result as Edge<E>;\n },\n\n async getById(\n id: string,\n options?: QueryOptions,\n ): Promise<Edge<E> | undefined> {\n const row = await backend.getEdge(graphId, id);\n if (!row) return undefined;\n if (row.kind !== kind) return undefined; // Edge is a different type\n if (!matchesTemporalMode(row, options)) return undefined;\n return rowToEdge(row) as Edge<E>;\n },\n\n async update(\n id: string,\n props: Partial<z.input<E[\"schema\"]>>,\n options?: Readonly<{ validTo?: string }>,\n ): Promise<Edge<E>> {\n const input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n id,\n props: props as Partial<Record<string, unknown>>,\n };\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeEdgeUpdate(input, backend);\n return result as Edge<E>;\n },\n\n async findFrom(from: NodeRef): Promise<Edge<E>[]> {\n const rows = await backend.findEdgesByKind({\n graphId,\n kind,\n fromKind: from.kind,\n fromId: from.id,\n excludeDeleted: true,\n });\n return rows.map((row) => rowToEdge(row) as Edge<E>);\n },\n\n async findTo(to: NodeRef): Promise<Edge<E>[]> {\n const rows = await backend.findEdgesByKind({\n graphId,\n kind,\n toKind: to.kind,\n toId: to.id,\n excludeDeleted: true,\n });\n return rows.map((row) => rowToEdge(row) as Edge<E>);\n },\n\n async delete(id: string): Promise<void> {\n await executeEdgeDelete(id, backend);\n },\n\n async hardDelete(id: string): Promise<void> {\n await executeEdgeHardDelete(id, backend);\n },\n\n async find(\n options?: Readonly<{\n from?: NodeRef;\n to?: NodeRef;\n limit?: number;\n offset?: number;\n }>,\n ): Promise<Edge<E>[]> {\n const params: {\n graphId: string;\n kind: string;\n fromKind?: string;\n fromId?: string;\n toKind?: string;\n toId?: string;\n limit?: number;\n offset?: number;\n excludeDeleted: boolean;\n } = {\n graphId,\n kind,\n excludeDeleted: true,\n };\n if (options?.from?.kind !== undefined)\n params.fromKind = options.from.kind;\n if (options?.from?.id !== undefined) params.fromId = options.from.id;\n if (options?.to?.kind !== undefined) params.toKind = options.to.kind;\n if (options?.to?.id !== undefined) params.toId = options.to.id;\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.offset !== undefined) params.offset = options.offset;\n\n const rows = await backend.findEdgesByKind(params);\n return rows.map((row) => rowToEdge(row) as Edge<E>);\n },\n\n async count(\n options?: Readonly<{\n from?: NodeRef;\n to?: NodeRef;\n }>,\n ): Promise<number> {\n const params: {\n graphId: string;\n kind: string;\n fromKind?: string;\n fromId?: string;\n toKind?: string;\n toId?: string;\n excludeDeleted: boolean;\n } = {\n graphId,\n kind,\n excludeDeleted: true,\n };\n if (options?.from?.kind !== undefined)\n params.fromKind = options.from.kind;\n if (options?.from?.id !== undefined) params.fromId = options.from.id;\n if (options?.to?.kind !== undefined) params.toKind = options.to.kind;\n if (options?.to?.id !== undefined) params.toId = options.to.id;\n\n return backend.countEdgesByKind(params);\n },\n\n async bulkCreate(\n items: readonly Readonly<{\n from: NodeRef;\n to: NodeRef;\n props?: z.input<E[\"schema\"]>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<Edge<E>[]> {\n const results: Edge<E>[] = [];\n\n for (const item of items) {\n const input: {\n kind: string;\n id?: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind: kind,\n fromKind: item.from.kind,\n fromId: item.from.id,\n toKind: item.to.kind,\n toId: item.to.id,\n props: (item.props ?? {}) as Record<string, unknown>,\n };\n if (item.id !== undefined) input.id = item.id;\n if (item.validFrom !== undefined) input.validFrom = item.validFrom;\n if (item.validTo !== undefined) input.validTo = item.validTo;\n\n const result = await executeEdgeCreate(input, backend);\n results.push(result as Edge<E>);\n }\n\n return results;\n },\n\n async bulkDelete(ids: readonly string[]): Promise<void> {\n for (const id of ids) {\n try {\n await executeEdgeDelete(id, backend);\n } catch {\n // Silently ignore edges that don't exist\n }\n }\n },\n };\n}\n","/**\n * NodeCollection implementation.\n *\n * Provides an ergonomic API for CRUD operations on a specific node type.\n */\nimport { type z } from \"zod\";\n\nimport {\n type GraphBackend,\n type TransactionBackend,\n} from \"../../backend/types\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type NodeId } from \"../../core/types\";\nimport { type KindRegistry } from \"../../registry\";\nimport { type Node, type NodeCollection, type QueryOptions } from \"../types\";\n\n/**\n * Creates a NodeCollection for a specific node type.\n */\nexport function createNodeCollection<\n G extends GraphDef,\n K extends keyof G[\"nodes\"] & string,\n>(\n graphId: string,\n kind: K,\n _registry: KindRegistry,\n backend: GraphBackend | TransactionBackend,\n rowToNode: (row: {\n kind: string;\n id: string;\n props: string;\n version: number;\n valid_from: string | undefined;\n valid_to: string | undefined;\n created_at: string;\n updated_at: string;\n deleted_at: string | undefined;\n }) => Node,\n executeNodeCreate: (\n input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Node>,\n executeNodeUpdate: (\n input: {\n kind: string;\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Node>,\n executeNodeDelete: (\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>,\n executeNodeHardDelete: (\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>,\n matchesTemporalMode: (\n row: {\n deleted_at: string | undefined;\n valid_from: string | undefined;\n valid_to: string | undefined;\n },\n options?: QueryOptions,\n ) => boolean,\n): NodeCollection<G[\"nodes\"][K][\"type\"]> {\n type N = G[\"nodes\"][K][\"type\"];\n\n return {\n async create(\n props: z.input<N[\"schema\"]>,\n options?: Readonly<{ id?: string; validFrom?: string; validTo?: string }>,\n ): Promise<Node<N>> {\n const input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind: kind,\n props: props as Record<string, unknown>,\n };\n if (options?.id !== undefined) input.id = options.id;\n if (options?.validFrom !== undefined) input.validFrom = options.validFrom;\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeNodeCreate(input, backend);\n return result as Node<N>;\n },\n\n async getById(\n id: NodeId<N>,\n options?: QueryOptions,\n ): Promise<Node<N> | undefined> {\n const row = await backend.getNode(graphId, kind, id);\n if (!row) return undefined;\n if (!matchesTemporalMode(row, options)) return undefined;\n return rowToNode(row) as Node<N>;\n },\n\n async update(\n id: NodeId<N>,\n props: Partial<z.input<N[\"schema\"]>>,\n options?: Readonly<{ validTo?: string }>,\n ): Promise<Node<N>> {\n const input: {\n kind: string;\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n kind: kind,\n id: id as string,\n props: props as Partial<Record<string, unknown>>,\n };\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeNodeUpdate(input, backend);\n return result as Node<N>;\n },\n\n async delete(id: NodeId<N>): Promise<void> {\n await executeNodeDelete(kind, id as string, backend);\n },\n\n async hardDelete(id: NodeId<N>): Promise<void> {\n await executeNodeHardDelete(kind, id as string, backend);\n },\n\n async find(\n options?: Readonly<{ limit?: number; offset?: number }>,\n ): Promise<Node<N>[]> {\n const params: {\n graphId: string;\n kind: string;\n limit?: number;\n offset?: number;\n excludeDeleted: boolean;\n } = {\n graphId,\n kind,\n excludeDeleted: true,\n };\n if (options?.limit !== undefined) params.limit = options.limit;\n if (options?.offset !== undefined) params.offset = options.offset;\n\n const rows = await backend.findNodesByKind(params);\n return rows.map((row) => rowToNode(row) as Node<N>);\n },\n\n async count(): Promise<number> {\n return backend.countNodesByKind({\n graphId,\n kind,\n excludeDeleted: true,\n });\n },\n\n async upsert(\n id: string,\n props: z.input<N[\"schema\"]>,\n options?: Readonly<{ validFrom?: string; validTo?: string }>,\n ): Promise<Node<N>> {\n // Check if node exists (including soft-deleted nodes)\n const existing = await backend.getNode(graphId, kind, id);\n\n if (existing) {\n // Update existing node (this also un-deletes soft-deleted nodes)\n const input: {\n kind: string;\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n kind: kind,\n id,\n props: props as Record<string, unknown>,\n };\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n // If the node is soft-deleted, clear the deletion\n const clearDeleted = existing.deleted_at !== undefined;\n const result = await executeNodeUpdate(input, backend, {\n clearDeleted,\n });\n return result as Node<N>;\n } else {\n // Create new node\n const input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind: kind,\n id,\n props: props as Record<string, unknown>,\n };\n if (options?.validFrom !== undefined)\n input.validFrom = options.validFrom;\n if (options?.validTo !== undefined) input.validTo = options.validTo;\n\n const result = await executeNodeCreate(input, backend);\n return result as Node<N>;\n }\n },\n\n async bulkCreate(\n items: readonly Readonly<{\n props: z.input<N[\"schema\"]>;\n id?: string;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<Node<N>[]> {\n const results: Node<N>[] = [];\n\n for (const item of items) {\n const input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind: kind,\n props: item.props as Record<string, unknown>,\n };\n if (item.id !== undefined) input.id = item.id;\n if (item.validFrom !== undefined) input.validFrom = item.validFrom;\n if (item.validTo !== undefined) input.validTo = item.validTo;\n\n const result = await executeNodeCreate(input, backend);\n results.push(result as Node<N>);\n }\n\n return results;\n },\n\n async bulkUpsert(\n items: readonly Readonly<{\n id: string;\n props: z.input<N[\"schema\"]>;\n validFrom?: string;\n validTo?: string;\n }>[],\n ): Promise<Node<N>[]> {\n const results: Node<N>[] = [];\n\n for (const item of items) {\n // Check if node exists (including soft-deleted nodes)\n const existing = await backend.getNode(graphId, kind, item.id);\n\n if (existing) {\n // Update existing node (this also un-deletes soft-deleted nodes)\n const input: {\n kind: string;\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n } = {\n kind: kind,\n id: item.id,\n props: item.props as Record<string, unknown>,\n };\n if (item.validTo !== undefined) input.validTo = item.validTo;\n\n // If the node is soft-deleted, clear the deletion\n const clearDeleted = existing.deleted_at !== undefined;\n const result = await executeNodeUpdate(input, backend, {\n clearDeleted,\n });\n results.push(result as Node<N>);\n } else {\n // Create new node\n const input: {\n kind: string;\n id?: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n kind: kind,\n id: item.id,\n props: item.props as Record<string, unknown>,\n };\n if (item.validFrom !== undefined) input.validFrom = item.validFrom;\n if (item.validTo !== undefined) input.validTo = item.validTo;\n\n const result = await executeNodeCreate(input, backend);\n results.push(result as Node<N>);\n }\n }\n\n return results;\n },\n\n async bulkDelete(ids: readonly NodeId<N>[]): Promise<void> {\n for (const id of ids) {\n try {\n await executeNodeDelete(kind, id as string, backend);\n } catch {\n // Silently ignore nodes that don't exist\n }\n }\n },\n };\n}\n","/**\n * Collection Factory for Store\n *\n * Creates typed node and edge collection proxies for both\n * Store and TransactionContext to reduce code duplication.\n */\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport { type GraphDef } from \"../core/define-graph\";\nimport { KindNotFoundError } from \"../errors\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\nimport { createEdgeCollection, createNodeCollection } from \"./collections\";\nimport {\n type CreateEdgeInput,\n type CreateNodeInput,\n type Edge,\n type Node,\n type NodeCollection,\n type QueryOptions,\n type TypedEdgeCollection,\n type UpdateNodeInput,\n} from \"./types\";\n\n/**\n * Row shape from database queries.\n */\ntype NodeRow = Readonly<{\n kind: string;\n id: string;\n props: string;\n version: number;\n valid_from: string | undefined;\n valid_to: string | undefined;\n created_at: string;\n updated_at: string;\n deleted_at: string | undefined;\n}>;\n\ntype EdgeRow = Readonly<{\n id: string;\n kind: string;\n from_kind: string;\n from_id: string;\n to_kind: string;\n to_id: string;\n props: string;\n valid_from: string | undefined;\n valid_to: string | undefined;\n created_at: string;\n updated_at: string;\n deleted_at: string | undefined;\n}>;\n\n/**\n * Operation functions passed to collections.\n */\nexport type NodeOperations = Readonly<{\n rowToNode: (row: NodeRow) => Node;\n executeCreate: (\n input: CreateNodeInput,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Node>;\n executeUpdate: (\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n ) => Promise<Node>;\n executeDelete: (\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeHardDelete: (\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n matchesTemporalMode: (row: NodeRow, options?: QueryOptions) => boolean;\n}>;\n\nexport type EdgeOperations = Readonly<{\n rowToEdge: (row: EdgeRow) => Edge;\n executeCreate: (\n input: CreateEdgeInput,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Edge>;\n executeUpdate: (\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n ) => Promise<Edge>;\n executeDelete: (\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n executeHardDelete: (\n id: string,\n backend: GraphBackend | TransactionBackend,\n ) => Promise<void>;\n matchesTemporalMode: (row: EdgeRow, options?: QueryOptions) => boolean;\n}>;\n\n/**\n * Creates a typed node collections proxy.\n *\n * The proxy dynamically creates NodeCollection instances for each node kind\n * when accessed.\n */\nexport function createNodeCollectionsProxy<G extends GraphDef>(\n graph: G,\n graphId: string,\n registry: KindRegistry,\n backend: GraphBackend | TransactionBackend,\n operations: NodeOperations,\n): {\n [K in keyof G[\"nodes\"] & string]-?: NodeCollection<G[\"nodes\"][K][\"type\"]>;\n} {\n // The proxy dynamically returns typed collections for each key.\n // Type assertions are necessary because the proxy pattern doesn't preserve\n // the relationship between keys and their specific node types at compile time.\n return new Proxy(\n {} as unknown as {\n [K in keyof G[\"nodes\"] & string]-?: NodeCollection<G[\"nodes\"][K][\"type\"]>;\n },\n {\n get: (_, kind: string) => {\n if (!(kind in graph.nodes)) {\n throw new KindNotFoundError(kind, \"node\");\n }\n return createNodeCollection(\n graphId,\n kind,\n registry,\n backend,\n operations.rowToNode,\n operations.executeCreate as Parameters<\n typeof createNodeCollection\n >[5],\n operations.executeUpdate as Parameters<\n typeof createNodeCollection\n >[6],\n operations.executeDelete,\n operations.executeHardDelete,\n operations.matchesTemporalMode as Parameters<\n typeof createNodeCollection\n >[9],\n );\n },\n },\n );\n}\n\n/**\n * Creates a typed edge collections proxy.\n *\n * The proxy dynamically creates EdgeCollection instances for each edge kind\n * when accessed.\n */\nexport function createEdgeCollectionsProxy<G extends GraphDef>(\n graph: G,\n graphId: string,\n registry: KindRegistry,\n backend: GraphBackend | TransactionBackend,\n operations: EdgeOperations,\n): { [K in keyof G[\"edges\"] & string]-?: TypedEdgeCollection<G[\"edges\"][K]> } {\n // The proxy dynamically returns typed collections for each key.\n // Type assertions are necessary because the proxy pattern doesn't preserve\n // the relationship between keys and their specific edge types at compile time.\n return new Proxy(\n {} as unknown as {\n [K in keyof G[\"edges\"] & string]-?: TypedEdgeCollection<G[\"edges\"][K]>;\n },\n {\n get: (_, kind: string) => {\n if (!(kind in graph.edges)) {\n throw new KindNotFoundError(kind, \"edge\");\n }\n return createEdgeCollection(\n graphId,\n kind,\n registry,\n backend,\n operations.rowToEdge,\n operations.executeCreate as Parameters<\n typeof createEdgeCollection\n >[5],\n operations.executeUpdate,\n operations.executeDelete,\n operations.executeHardDelete,\n operations.matchesTemporalMode as Parameters<\n typeof createEdgeCollection\n >[9],\n );\n },\n },\n );\n}\n","/**\n * Constraint validation module.\n *\n * Provides validation functions for enforcing graph constraints:\n * - Uniqueness constraints on node properties\n * - Cardinality constraints on edges\n * - Endpoint type constraints on edges\n * - Disjointness constraints between node kinds\n */\nimport {\n type Cardinality,\n type Collation,\n type EdgeRegistration,\n type UniqueConstraint,\n type UniquenessScope,\n} from \"../core/types\";\nimport {\n CardinalityError,\n DisjointError,\n EndpointError,\n UniquenessError,\n} from \"../errors\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\n\n// ============================================================\n// Uniqueness Validation\n// ============================================================\n\n/**\n * Computes the unique key for a node's uniqueness constraint.\n *\n * The key is built by concatenating the specified field values,\n * optionally normalized for case-insensitive comparison.\n */\nexport function computeUniqueKey(\n props: Record<string, unknown>,\n fields: readonly string[],\n collation: Collation,\n): string {\n const values = fields.map((field) => {\n const value = props[field];\n if (value === undefined || value === null) {\n return \"\\0\"; // Null marker\n }\n // Convert to string, handling primitives safely\n const stringValue =\n typeof value === \"string\" ? value\n : typeof value === \"number\" || typeof value === \"boolean\" ?\n value.toString()\n : JSON.stringify(value);\n return collation === \"caseInsensitive\" ?\n stringValue.toLowerCase()\n : stringValue;\n });\n return values.join(\"\\0\");\n}\n\n/**\n * Checks if a uniqueness constraint's where predicate passes.\n */\nexport function checkWherePredicate(\n constraint: UniqueConstraint,\n props: Record<string, unknown>,\n): boolean {\n if (!constraint.where) {\n return true; // No where clause, always applies\n }\n\n // Build predicate context\n const predicateBuilder = buildPredicateContext(props);\n const predicate = constraint.where(predicateBuilder);\n\n // Evaluate predicate\n return evaluatePredicate(predicate, props);\n}\n\ntype UniquePredicate = Readonly<{\n __type: \"unique_predicate\";\n field: string;\n op: \"isNull\" | \"isNotNull\";\n}>;\n\ntype PredicateContext = Readonly<\n Record<\n string,\n Readonly<{\n isNull: () => UniquePredicate;\n isNotNull: () => UniquePredicate;\n }>\n >\n>;\n\n/**\n * Builds a predicate context for where clause evaluation.\n */\nfunction buildPredicateContext(\n props: Record<string, unknown>,\n): PredicateContext {\n const context: Record<\n string,\n { isNull: () => UniquePredicate; isNotNull: () => UniquePredicate }\n > = {};\n\n for (const key of Object.keys(props)) {\n context[key] = {\n isNull: () => ({\n __type: \"unique_predicate\" as const,\n field: key,\n op: \"isNull\" as const,\n }),\n isNotNull: () => ({\n __type: \"unique_predicate\" as const,\n field: key,\n op: \"isNotNull\" as const,\n }),\n };\n }\n\n return context;\n}\n\n/**\n * Evaluates a uniqueness predicate.\n */\nfunction evaluatePredicate(\n predicate: unknown,\n props: Record<string, unknown>,\n): boolean {\n if (\n typeof predicate !== \"object\" ||\n predicate === null ||\n !(\"__type\" in predicate)\n ) {\n return true;\n }\n\n const pred = predicate as {\n __type: string;\n field: string;\n op: \"isNull\" | \"isNotNull\";\n };\n\n if (pred.__type !== \"unique_predicate\") {\n return true;\n }\n\n const value = props[pred.field];\n if (pred.op === \"isNull\") {\n return value === null || value === undefined;\n }\n return value !== null && value !== undefined;\n}\n\n/**\n * Gets all kinds that should be checked for a uniqueness constraint.\n *\n * For \"kindWithSubClasses\" scope, includes the entire subclass hierarchy:\n * - The kind itself\n * - All ancestors (parent classes)\n * - All descendants of those ancestors (sibling classes)\n *\n * For \"kind\" scope, only the specific kind.\n */\nexport function getKindsForUniquenessCheck(\n baseKind: string,\n scope: UniquenessScope,\n registry: KindRegistry,\n): readonly string[] {\n if (scope === \"kind\") {\n return [baseKind];\n }\n\n // Get the entire connected subclass hierarchy by finding the root ancestor\n const root = findRootAncestor(baseKind, registry);\n\n // Return the root and all its descendants (which includes baseKind and siblings)\n return registry.expandSubClasses(root);\n}\n\n/**\n * Finds the topmost ancestor of a kind, or the kind itself if it has no ancestors.\n */\nfunction findRootAncestor(kind: string, registry: KindRegistry): string {\n const ancestors = registry.getAncestors(kind);\n\n if (ancestors.size === 0) {\n return kind;\n }\n\n // Find an ancestor with no ancestors (the root)\n for (const ancestor of ancestors) {\n if (registry.getAncestors(ancestor).size === 0) {\n return ancestor;\n }\n }\n\n // If all ancestors have ancestors, recurse up\n const firstAncestor = [...ancestors][0];\n return firstAncestor ? findRootAncestor(firstAncestor, registry) : kind;\n}\n\n/**\n * Creates a uniqueness error.\n */\nexport function createUniquenessError(\n constraintName: string,\n kind: string,\n existingId: string,\n newId: string,\n fields: readonly string[],\n): UniquenessError {\n return new UniquenessError({\n constraintName,\n kind,\n existingId,\n newId,\n fields: [...fields],\n });\n}\n\n// ============================================================\n// Cardinality Validation\n// ============================================================\n\n/**\n * Checks if adding an edge would violate cardinality constraints.\n *\n * @param edgeKind - The edge kind being added\n * @param fromKind - The source node kind\n * @param fromId - The source node ID\n * @param cardinality - The cardinality constraint\n * @param existingEdgeCount - Number of existing edges of this kind from this source\n * @param hasActiveEdge - Whether there's an active (valid_to IS NULL) edge\n * @returns Error if violation, undefined if valid\n */\nexport function checkCardinality(\n edgeKind: string,\n fromKind: string,\n fromId: string,\n cardinality: Cardinality,\n existingEdgeCount: number,\n hasActiveEdge: boolean,\n): CardinalityError | undefined {\n switch (cardinality) {\n case \"many\": {\n // No constraint\n return undefined;\n }\n case \"one\": {\n // At most one edge of this kind from any source node\n if (existingEdgeCount > 0) {\n return new CardinalityError({\n edgeKind,\n fromKind,\n fromId,\n cardinality: \"one\",\n existingCount: existingEdgeCount,\n });\n }\n return undefined;\n }\n case \"unique\": {\n // unique is checked separately per (source, target) pair\n return undefined;\n }\n case \"oneActive\": {\n // At most one edge with valid_to IS NULL from any source\n if (hasActiveEdge) {\n return new CardinalityError({\n edgeKind,\n fromKind,\n fromId,\n cardinality: \"oneActive\",\n existingCount: 1,\n });\n }\n return undefined;\n }\n }\n}\n\n/**\n * Checks unique edge constraint (at most one edge between any source-target pair).\n */\nexport function checkUniqueEdge(\n edgeKind: string,\n fromKind: string,\n fromId: string,\n _toKind: string,\n _toId: string,\n existingCount: number,\n): CardinalityError | undefined {\n if (existingCount > 0) {\n return new CardinalityError({\n edgeKind,\n fromKind,\n fromId,\n cardinality: \"unique\",\n existingCount,\n });\n }\n return undefined;\n}\n\n// ============================================================\n// Endpoint Validation\n// ============================================================\n\n/**\n * Validates that an edge's endpoints are valid node kinds.\n */\nexport function validateEdgeEndpoints(\n edgeKind: string,\n fromKind: string,\n toKind: string,\n registration: EdgeRegistration,\n registry: KindRegistry,\n): EndpointError | undefined {\n // Check from kinds\n const validFromKinds = registration.from.map((node) => node.name);\n const fromValid = validFromKinds.some((validKind) =>\n registry.isAssignableTo(fromKind, validKind),\n );\n\n if (!fromValid) {\n return new EndpointError({\n edgeKind,\n endpoint: \"from\",\n actualKind: fromKind,\n expectedKinds: validFromKinds,\n });\n }\n\n // Check to kinds\n const validToKinds = registration.to.map((node) => node.name);\n const toValid = validToKinds.some((validKind) =>\n registry.isAssignableTo(toKind, validKind),\n );\n\n if (!toValid) {\n return new EndpointError({\n edgeKind,\n endpoint: \"to\",\n actualKind: toKind,\n expectedKinds: validToKinds,\n });\n }\n\n return undefined;\n}\n\n// ============================================================\n// Disjointness Validation\n// ============================================================\n\n/**\n * Checks if creating a node would violate disjointness constraints.\n *\n * @param nodeId - The node ID being created\n * @param nodeKind - The kind of the new node\n * @param existingKinds - Kinds of existing nodes with the same ID\n * @param registry - The kind registry for disjointness checks\n * @returns Error if disjoint violation, undefined if valid\n */\nexport function checkDisjointness(\n nodeId: string,\n nodeKind: string,\n existingKinds: readonly string[],\n registry: KindRegistry,\n): DisjointError | undefined {\n for (const existingKind of existingKinds) {\n if (registry.areDisjoint(nodeKind, existingKind)) {\n return new DisjointError({\n nodeId,\n attemptedKind: nodeKind,\n conflictingKind: existingKind,\n });\n }\n }\n return undefined;\n}\n\n/**\n * Gets all disjoint kinds for a given kind.\n */\nexport function getDisjointKinds(\n kind: string,\n registry: KindRegistry,\n): readonly string[] {\n return registry.getDisjointKinds(kind);\n}\n","/**\n * Constraint Checking for Store Operations\n *\n * Handles checking disjointness and cardinality constraints.\n */\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport {\n checkCardinality,\n checkDisjointness,\n checkUniqueEdge,\n} from \"../constraints\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\n\n/**\n * Context for constraint operations.\n */\nexport type ConstraintContext = Readonly<{\n graphId: string;\n registry: KindRegistry;\n backend: GraphBackend | TransactionBackend;\n}>;\n\n/**\n * Checks disjointness constraints for a node.\n *\n * Ensures that a node with a given ID doesn't exist in any disjoint kinds.\n *\n * @throws ValidationError if disjointness constraint is violated\n */\nexport async function checkDisjointnessConstraint(\n ctx: ConstraintContext,\n kind: string,\n id: string,\n): Promise<void> {\n // Get all kinds that are disjoint with this kind\n const disjointKinds = ctx.registry.getDisjointKinds(kind);\n\n // For each disjoint kind, check if a node with this ID exists\n for (const disjointKind of disjointKinds) {\n const existing = await ctx.backend.getNode(ctx.graphId, disjointKind, id);\n if (existing && !existing.deleted_at) {\n const error = checkDisjointness(id, kind, [disjointKind], ctx.registry);\n if (error) throw error;\n }\n }\n}\n\n/**\n * Checks cardinality constraints for an edge.\n *\n * @throws CardinalityError if cardinality constraint is violated\n */\nexport async function checkCardinalityConstraint(\n ctx: ConstraintContext,\n edgeKind: string,\n cardinality: \"many\" | \"one\" | \"unique\" | \"oneActive\",\n fromKind: string,\n fromId: string,\n toKind: string,\n toId: string,\n validTo: string | undefined,\n): Promise<void> {\n switch (cardinality) {\n case \"many\": {\n // No constraint - allow any number of edges\n return;\n }\n\n case \"one\": {\n // At most one edge of this kind from this source\n const count = await ctx.backend.countEdgesFrom({\n graphId: ctx.graphId,\n edgeKind,\n fromKind,\n fromId,\n });\n const error = checkCardinality(\n edgeKind,\n fromKind,\n fromId,\n \"one\",\n count,\n false,\n );\n if (error) throw error;\n return;\n }\n\n case \"unique\": {\n // At most one edge between this specific source-target pair\n const exists = await ctx.backend.edgeExistsBetween({\n graphId: ctx.graphId,\n edgeKind,\n fromKind,\n fromId,\n toKind,\n toId,\n });\n const error = checkUniqueEdge(\n edgeKind,\n fromKind,\n fromId,\n toKind,\n toId,\n exists ? 1 : 0,\n );\n if (error) throw error;\n return;\n }\n\n case \"oneActive\": {\n // At most one active edge (valid_to IS NULL) from this source\n // Only check if the new edge will be active (validTo is not set)\n if (validTo !== undefined) {\n // New edge is already ended, no active constraint to check\n return;\n }\n const count = await ctx.backend.countEdgesFrom({\n graphId: ctx.graphId,\n edgeKind,\n fromKind,\n fromId,\n activeOnly: true,\n });\n const error = checkCardinality(\n edgeKind,\n fromKind,\n fromId,\n \"oneActive\",\n count,\n count > 0,\n );\n if (error) throw error;\n return;\n }\n }\n}\n","/**\n * Row Mappers for Store\n *\n * Transforms database rows into typed Node and Edge objects.\n */\nimport { type Edge, type Node } from \"./types\";\n\n/**\n * Raw node row from database.\n */\nexport type NodeRow = Readonly<{\n kind: string;\n id: string;\n props: string;\n version: number;\n valid_from: string | undefined;\n valid_to: string | undefined;\n created_at: string;\n updated_at: string;\n deleted_at: string | undefined;\n}>;\n\n/**\n * Raw edge row from database.\n */\nexport type EdgeRow = Readonly<{\n id: string;\n kind: string;\n from_kind: string;\n from_id: string;\n to_kind: string;\n to_id: string;\n props: string;\n valid_from: string | undefined;\n valid_to: string | undefined;\n created_at: string;\n updated_at: string;\n deleted_at: string | undefined;\n}>;\n\n// Reserved keys that cannot be overwritten by user props\nconst RESERVED_NODE_KEYS = new Set([\"id\", \"kind\", \"meta\"]);\n\n/**\n * Converts null to undefined for consistent typing.\n * Database backends return null for missing values, but our types use undefined.\n */\nfunction nullToUndefined<T>(value: T | null | undefined): T | undefined {\n return value === null ? undefined : value;\n}\n\n/**\n * Filters out reserved keys from props to prevent runtime collisions.\n */\nfunction filterReservedKeys(\n props: Record<string, unknown>,\n reservedKeys: Set<string>,\n): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(props)) {\n if (!reservedKeys.has(key)) {\n filtered[key] = value;\n }\n }\n return filtered;\n}\n\n/**\n * Transforms a database row into a typed Node object.\n *\n * Props are spread at top level, metadata goes under `meta`.\n * Reserved keys (id, kind, meta) in props are filtered out to prevent collisions.\n * Null values from database are normalized to undefined.\n */\nexport function rowToNode(row: NodeRow): Node {\n const rawProps = JSON.parse(row.props) as Record<string, unknown>;\n const props = filterReservedKeys(rawProps, RESERVED_NODE_KEYS);\n return {\n kind: row.kind,\n id: row.id as Node[\"id\"],\n meta: {\n version: row.version,\n validFrom: nullToUndefined(row.valid_from),\n validTo: nullToUndefined(row.valid_to),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n deletedAt: nullToUndefined(row.deleted_at),\n },\n ...props,\n } as Node;\n}\n\n// Reserved keys that cannot be overwritten by user props on edges\nconst RESERVED_EDGE_KEYS = new Set([\n \"id\",\n \"kind\",\n \"meta\",\n \"fromKind\",\n \"fromId\",\n \"toKind\",\n \"toId\",\n]);\n\n/**\n * Transforms a database row into a typed Edge object.\n *\n * Props are spread at top level, metadata goes under `meta`.\n * Reserved keys in props are filtered out to prevent collisions.\n * Null values from database are normalized to undefined.\n */\nexport function rowToEdge(row: EdgeRow): Edge {\n const rawProps = JSON.parse(row.props) as Record<string, unknown>;\n const props = filterReservedKeys(rawProps, RESERVED_EDGE_KEYS);\n return {\n id: row.id,\n kind: row.kind,\n fromKind: row.from_kind,\n fromId: row.from_id,\n toKind: row.to_kind,\n toId: row.to_id,\n meta: {\n validFrom: nullToUndefined(row.valid_from),\n validTo: nullToUndefined(row.valid_to),\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n deletedAt: nullToUndefined(row.deleted_at),\n },\n ...props,\n } as Edge;\n}\n","/**\n * Edge Operations for Store\n *\n * Handles edge CRUD operations: create, update, delete.\n */\nimport {\n type GraphBackend,\n type TransactionBackend,\n} from \"../../backend/types\";\nimport { validateEdgeEndpoints } from \"../../constraints\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type EdgeRegistration, type EdgeType } from \"../../core/types\";\nimport {\n EdgeNotFoundError,\n EndpointNotFoundError,\n KindNotFoundError,\n} from \"../../errors\";\nimport { validateEdgeProps } from \"../../errors/validation\";\nimport { type KindRegistry } from \"../../registry/kind-registry\";\nimport { validateOptionalIsoDate } from \"../../utils/date\";\nimport { generateId } from \"../../utils/id\";\nimport {\n checkCardinalityConstraint,\n type ConstraintContext,\n} from \"../constraints\";\nimport { type EdgeRow, rowToEdge } from \"../row-mappers\";\nimport {\n type CreateEdgeInput,\n type Edge,\n type OperationHookContext,\n} from \"../types\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Context for edge operations.\n */\nexport type EdgeOperationContext<G extends GraphDef> = Readonly<{\n graph: G;\n graphId: string;\n registry: KindRegistry;\n createOperationContext: (\n operation: \"create\" | \"update\" | \"delete\",\n entity: \"node\" | \"edge\",\n kind: string,\n id: string,\n ) => OperationHookContext;\n withOperationHooks: <T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ) => Promise<T>;\n}>;\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\nfunction hasEdgeType<G extends GraphDef>(graph: G, kind: string): boolean {\n return kind in graph.edges;\n}\n\nfunction getEdgeRegistration<G extends GraphDef>(\n graph: G,\n kind: string,\n): EdgeRegistration {\n if (!hasEdgeType(graph, kind)) {\n throw new KindNotFoundError(kind, \"edge\");\n }\n // Safe to use non-null assertion after the check above\n return graph.edges[kind] as EdgeRegistration;\n}\n\n// ============================================================\n// Edge Operations\n// ============================================================\n\n/**\n * Executes an edge create operation.\n */\nexport async function executeEdgeCreate<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: CreateEdgeInput,\n backend: GraphBackend | TransactionBackend,\n): Promise<Edge> {\n const kind = input.kind;\n const id = input.id ?? generateId();\n const opContext = ctx.createOperationContext(\"create\", \"edge\", kind, id);\n\n return ctx.withOperationHooks(opContext, async () => {\n const fromKind = input.fromKind;\n const toKind = input.toKind;\n\n // Validate kind exists and get registration\n const registration = getEdgeRegistration(ctx.graph, kind);\n const edgeKind = registration.type as EdgeType;\n\n // Validate endpoint types\n const endpointError = validateEdgeEndpoints(\n kind,\n fromKind,\n toKind,\n registration,\n ctx.registry,\n );\n if (endpointError) throw endpointError;\n\n // Validate source node exists\n const fromNode = await backend.getNode(ctx.graphId, fromKind, input.fromId);\n if (!fromNode || fromNode.deleted_at) {\n throw new EndpointNotFoundError({\n edgeKind: kind,\n endpoint: \"from\",\n nodeKind: fromKind,\n nodeId: input.fromId,\n });\n }\n\n // Validate target node exists\n const toNode = await backend.getNode(ctx.graphId, toKind, input.toId);\n if (!toNode || toNode.deleted_at) {\n throw new EndpointNotFoundError({\n edgeKind: kind,\n endpoint: \"to\",\n nodeKind: toKind,\n nodeId: input.toId,\n });\n }\n\n // Validate props with full context\n const validatedProps = validateEdgeProps(edgeKind.schema, input.props, {\n kind,\n operation: \"create\",\n });\n\n // Validate temporal fields\n const validFrom = validateOptionalIsoDate(input.validFrom, \"validFrom\");\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n // Check cardinality constraints\n const cardinality = registration.cardinality ?? \"many\";\n const constraintContext: ConstraintContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await checkCardinalityConstraint(\n constraintContext,\n kind,\n cardinality,\n fromKind,\n input.fromId,\n toKind,\n input.toId,\n input.validTo,\n );\n\n // Insert edge - conditionally include optional temporal fields\n const insertParams: {\n graphId: string;\n id: string;\n kind: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n graphId: ctx.graphId,\n id,\n kind,\n fromKind,\n fromId: input.fromId,\n toKind,\n toId: input.toId,\n props: validatedProps,\n };\n if (validFrom !== undefined) insertParams.validFrom = validFrom;\n if (validTo !== undefined) insertParams.validTo = validTo;\n\n const row = await backend.insertEdge(insertParams);\n\n return rowToEdge(row as EdgeRow);\n });\n}\n\n/**\n * Executes an edge update operation.\n */\nexport async function executeEdgeUpdate<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n input: {\n id: string;\n props: Partial<Record<string, unknown>>;\n validTo?: string;\n },\n backend: GraphBackend | TransactionBackend,\n): Promise<Edge> {\n const id = input.id;\n\n // Get existing edge first to get the kind for the hook context\n const existing = await backend.getEdge(ctx.graphId, id);\n if (!existing || existing.deleted_at) {\n throw new EdgeNotFoundError(\"unknown\", id);\n }\n\n const opContext = ctx.createOperationContext(\n \"update\",\n \"edge\",\n existing.kind,\n id,\n );\n\n return ctx.withOperationHooks(opContext, async () => {\n // Get registration for schema validation\n const registration = getEdgeRegistration(ctx.graph, existing.kind);\n const edgeKind = registration.type as EdgeType;\n\n // Merge props\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n const mergedProps = { ...existingProps, ...input.props };\n\n // Validate merged props with full context\n const validatedProps = validateEdgeProps(edgeKind.schema, mergedProps, {\n kind: existing.kind,\n operation: \"update\",\n id,\n });\n\n // Validate temporal fields\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n // Update edge - conditionally include optional fields\n const updateParams: {\n graphId: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n } = {\n graphId: ctx.graphId,\n id,\n props: validatedProps,\n };\n if (validTo !== undefined) updateParams.validTo = validTo;\n\n const row = await backend.updateEdge(updateParams);\n\n return rowToEdge(row as EdgeRow);\n });\n}\n\n/**\n * Executes an edge delete operation.\n */\nexport async function executeEdgeDelete<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n // Get edge first to know the kind for the hook context\n const existing = await backend.getEdge(ctx.graphId, id);\n if (!existing || existing.deleted_at) {\n // Already deleted - nothing to do\n return;\n }\n\n const opContext = ctx.createOperationContext(\n \"delete\",\n \"edge\",\n existing.kind,\n id,\n );\n\n return ctx.withOperationHooks(opContext, async () => {\n await backend.deleteEdge({\n graphId: ctx.graphId,\n id,\n });\n });\n}\n\n/**\n * Executes an edge hard delete operation (permanent removal).\n *\n * Unlike soft delete, this permanently removes the edge from the database.\n */\nexport async function executeEdgeHardDelete<G extends GraphDef>(\n ctx: EdgeOperationContext<G>,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n // Get edge first to know the kind for the hook context\n const existing = await backend.getEdge(ctx.graphId, id);\n if (!existing) {\n // Doesn't exist - nothing to do\n return;\n }\n\n const opContext = ctx.createOperationContext(\n \"delete\",\n \"edge\",\n existing.kind,\n id,\n );\n\n return ctx.withOperationHooks(opContext, async () => {\n await backend.hardDeleteEdge({\n graphId: ctx.graphId,\n id,\n });\n });\n}\n","/**\n * Embedding Sync Utilities\n *\n * Handles automatic synchronization of embedding fields with the embeddings table.\n * When nodes with embedding properties are created, updated, or deleted,\n * these utilities ensure the embeddings table stays in sync.\n */\nimport { type z } from \"zod\";\n\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport { getEmbeddingDimensions, isEmbeddingSchema } from \"../core/embedding\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Information about an embedding field in a node schema.\n */\ntype EmbeddingFieldInfo = Readonly<{\n /** The field path (e.g., \"embedding\" or \"contentEmbedding\") */\n fieldPath: string;\n /** The number of dimensions for this embedding */\n dimensions: number;\n}>;\n\n/**\n * Context for embedding sync operations.\n */\nexport type EmbeddingSyncContext = Readonly<{\n graphId: string;\n nodeKind: string;\n nodeId: string;\n backend: GraphBackend | TransactionBackend;\n}>;\n\n// ============================================================\n// Schema Introspection\n// ============================================================\n\n/**\n * Extracts embedding field information from a Zod schema.\n * Returns all embedding fields found at the top level of an object schema.\n */\nexport function getEmbeddingFields(\n schema: z.ZodType,\n): readonly EmbeddingFieldInfo[] {\n // Check if schema is an object type\n if (schema.type !== \"object\") {\n return [];\n }\n\n const def = schema.def as { shape?: Record<string, z.ZodType> };\n const shape = def.shape;\n if (!shape) {\n return [];\n }\n\n const fields: EmbeddingFieldInfo[] = [];\n\n for (const [fieldPath, fieldSchema] of Object.entries(shape)) {\n // Check if this field is an embedding (possibly wrapped in optional/nullable)\n const dimensions = getEmbeddingDimensionsFromField(fieldSchema);\n if (dimensions !== undefined) {\n fields.push({ fieldPath, dimensions });\n }\n }\n\n return fields;\n}\n\n/**\n * Gets embedding dimensions from a field schema, handling wrappers like optional/nullable.\n */\nfunction getEmbeddingDimensionsFromField(\n schema: z.ZodType,\n): number | undefined {\n // Check the schema directly\n const directDimensions = getEmbeddingDimensions(schema);\n if (directDimensions !== undefined) {\n return directDimensions;\n }\n\n // Check if it's wrapped (optional, nullable, default, etc.)\n const unwrapped = unwrapToEmbedding(schema);\n if (unwrapped) {\n return getEmbeddingDimensions(unwrapped);\n }\n\n return undefined;\n}\n\n/**\n * Unwraps wrapper types to find an embedding schema.\n */\nfunction unwrapToEmbedding(schema: z.ZodType): z.ZodType | undefined {\n const type = schema.type;\n const def = schema.def as { innerType?: z.ZodType };\n\n // Handle common wrapper types\n if (\n (type === \"optional\" ||\n type === \"nullable\" ||\n type === \"default\" ||\n type === \"readonly\") &&\n def.innerType\n ) {\n // Check if inner type is an embedding\n if (isEmbeddingSchema(def.innerType)) {\n return def.innerType;\n }\n // Recursively unwrap\n return unwrapToEmbedding(def.innerType);\n }\n\n return undefined;\n}\n\n// ============================================================\n// Embedding Sync Operations\n// ============================================================\n\n/**\n * Syncs embeddings after a node create or update operation.\n *\n * For each embedding field in the schema:\n * - If the props contain an embedding value, upsert it to the embeddings table\n * - If the props don't contain an embedding value (undefined), delete any existing embedding\n */\nexport async function syncEmbeddings(\n ctx: EmbeddingSyncContext,\n schema: z.ZodType,\n props: Record<string, unknown>,\n): Promise<void> {\n const { backend } = ctx;\n\n // Check if backend supports embedding operations\n if (!backend.upsertEmbedding || !backend.deleteEmbedding) {\n return;\n }\n\n const embeddingFields = getEmbeddingFields(schema);\n if (embeddingFields.length === 0) {\n return;\n }\n\n for (const field of embeddingFields) {\n const value = props[field.fieldPath];\n\n if (isValidEmbeddingValue(value)) {\n // Upsert the embedding\n await backend.upsertEmbedding({\n graphId: ctx.graphId,\n nodeKind: ctx.nodeKind,\n nodeId: ctx.nodeId,\n fieldPath: field.fieldPath,\n embedding: value,\n dimensions: field.dimensions,\n });\n } else if (value === undefined) {\n // Delete any existing embedding for this field\n await backend.deleteEmbedding({\n graphId: ctx.graphId,\n nodeKind: ctx.nodeKind,\n nodeId: ctx.nodeId,\n fieldPath: field.fieldPath,\n });\n }\n // If value is null or invalid, skip (validation should have caught this)\n }\n}\n\n/**\n * Deletes all embeddings for a node.\n */\nexport async function deleteNodeEmbeddings(\n ctx: EmbeddingSyncContext,\n schema: z.ZodType,\n): Promise<void> {\n const { backend } = ctx;\n\n // Check if backend supports embedding operations\n if (!backend.deleteEmbedding) {\n return;\n }\n\n const embeddingFields = getEmbeddingFields(schema);\n if (embeddingFields.length === 0) {\n return;\n }\n\n for (const field of embeddingFields) {\n await backend.deleteEmbedding({\n graphId: ctx.graphId,\n nodeKind: ctx.nodeKind,\n nodeId: ctx.nodeId,\n fieldPath: field.fieldPath,\n });\n }\n}\n\n// ============================================================\n// Validation Helpers\n// ============================================================\n\n/**\n * Checks if a value is a valid embedding (array of numbers).\n */\nfunction isValidEmbeddingValue(value: unknown): value is readonly number[] {\n if (!Array.isArray(value)) {\n return false;\n }\n return value.every((n) => typeof n === \"number\" && Number.isFinite(n));\n}\n","/**\n * Uniqueness Constraint Management\n *\n * Handles checking, inserting, updating, and deleting uniqueness constraint entries.\n */\nimport { type GraphBackend, type TransactionBackend } from \"../backend/types\";\nimport {\n checkWherePredicate,\n computeUniqueKey,\n getKindsForUniquenessCheck,\n} from \"../constraints\";\nimport { type UniqueConstraint } from \"../core/types\";\nimport { UniquenessError } from \"../errors\";\nimport { type KindRegistry } from \"../registry/kind-registry\";\n\n/**\n * Context for uniqueness operations.\n */\nexport type UniquenessContext = Readonly<{\n graphId: string;\n registry: KindRegistry;\n backend: GraphBackend | TransactionBackend;\n}>;\n\n/**\n * Checks uniqueness constraints for a new or existing node.\n *\n * @throws ValidationError if any constraint is violated\n */\nexport async function checkUniquenessConstraints(\n ctx: UniquenessContext,\n kind: string,\n id: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n): Promise<void> {\n for (const constraint of constraints) {\n if (!checkWherePredicate(constraint, props)) {\n continue;\n }\n\n const key = computeUniqueKey(\n props,\n constraint.fields,\n constraint.collation,\n );\n\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n for (const kindToCheck of kindsToCheck) {\n const existing = await ctx.backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key,\n });\n\n if (existing && existing.node_id !== id) {\n throw new UniquenessError({\n constraintName: constraint.name,\n kind: kindToCheck,\n existingId: existing.node_id,\n newId: id,\n fields: constraint.fields,\n });\n }\n }\n }\n}\n\n/**\n * Inserts uniqueness entries for a newly created node.\n */\nexport async function insertUniquenessEntries(\n ctx: UniquenessContext,\n kind: string,\n id: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n): Promise<void> {\n for (const constraint of constraints) {\n if (!checkWherePredicate(constraint, props)) {\n continue;\n }\n\n const key = computeUniqueKey(\n props,\n constraint.fields,\n constraint.collation,\n );\n\n await ctx.backend.insertUnique({\n graphId: ctx.graphId,\n nodeKind: kind,\n constraintName: constraint.name,\n key,\n nodeId: id,\n concreteKind: kind,\n });\n }\n}\n\n/**\n * Deletes uniqueness entries for a node being deleted.\n */\nexport async function deleteUniquenessEntries(\n ctx: UniquenessContext,\n kind: string,\n props: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n): Promise<void> {\n for (const constraint of constraints) {\n if (!checkWherePredicate(constraint, props)) {\n continue;\n }\n\n const key = computeUniqueKey(\n props,\n constraint.fields,\n constraint.collation,\n );\n\n await ctx.backend.deleteUnique({\n graphId: ctx.graphId,\n nodeKind: kind,\n constraintName: constraint.name,\n key,\n });\n }\n}\n\n/**\n * Updates uniqueness entries when a node's props change.\n * Handles cases where:\n * - Constraint now applies (wasn't before)\n * - Constraint no longer applies (was before)\n * - Key value changed\n *\n * @throws ValidationError if updated value violates a constraint\n */\nexport async function updateUniquenessEntries(\n ctx: UniquenessContext,\n kind: string,\n id: string,\n oldProps: Record<string, unknown>,\n newProps: Record<string, unknown>,\n constraints: readonly UniqueConstraint[],\n): Promise<void> {\n for (const constraint of constraints) {\n const oldApplies = checkWherePredicate(constraint, oldProps);\n const newApplies = checkWherePredicate(constraint, newProps);\n\n const oldKey =\n oldApplies ?\n computeUniqueKey(oldProps, constraint.fields, constraint.collation)\n : undefined;\n const newKey =\n newApplies ?\n computeUniqueKey(newProps, constraint.fields, constraint.collation)\n : undefined;\n\n // No change - constraint didn't apply and still doesn't\n if (!oldApplies && !newApplies) {\n continue;\n }\n\n // Keys are the same and constraint still applies - nothing to do\n if (oldApplies && newApplies && oldKey === newKey) {\n continue;\n }\n\n // Delete old entry if constraint used to apply\n if (oldApplies && oldKey !== undefined) {\n await ctx.backend.deleteUnique({\n graphId: ctx.graphId,\n nodeKind: kind,\n constraintName: constraint.name,\n key: oldKey,\n });\n }\n\n // Check and insert new entry if constraint now applies\n if (newApplies && newKey !== undefined) {\n const kindsToCheck = getKindsForUniquenessCheck(\n kind,\n constraint.scope,\n ctx.registry,\n );\n\n // Check for conflicts with other nodes\n for (const kindToCheck of kindsToCheck) {\n const existing = await ctx.backend.checkUnique({\n graphId: ctx.graphId,\n nodeKind: kindToCheck,\n constraintName: constraint.name,\n key: newKey,\n });\n\n if (existing && existing.node_id !== id) {\n throw new UniquenessError({\n constraintName: constraint.name,\n kind: kindToCheck,\n existingId: existing.node_id,\n newId: id,\n fields: constraint.fields,\n });\n }\n }\n\n // Insert new uniqueness entry\n await ctx.backend.insertUnique({\n graphId: ctx.graphId,\n nodeKind: kind,\n constraintName: constraint.name,\n key: newKey,\n nodeId: id,\n concreteKind: kind,\n });\n }\n }\n}\n","/**\n * Node Operations for Store\n *\n * Handles node CRUD operations: create, update, delete.\n */\nimport {\n type GraphBackend,\n type TransactionBackend,\n} from \"../../backend/types\";\nimport { type GraphDef } from \"../../core/define-graph\";\nimport { type NodeType } from \"../../core/types\";\nimport {\n KindNotFoundError,\n NodeNotFoundError,\n RestrictedDeleteError,\n ValidationError,\n} from \"../../errors\";\nimport { validateNodeProps } from \"../../errors/validation\";\nimport { type KindRegistry } from \"../../registry/kind-registry\";\nimport { validateOptionalIsoDate } from \"../../utils/date\";\nimport { generateId } from \"../../utils/id\";\nimport {\n checkDisjointnessConstraint,\n type ConstraintContext,\n} from \"../constraints\";\nimport {\n deleteNodeEmbeddings,\n type EmbeddingSyncContext,\n syncEmbeddings,\n} from \"../embedding-sync\";\nimport { type NodeRow, rowToNode } from \"../row-mappers\";\nimport {\n type CreateNodeInput,\n type Node,\n type OperationHookContext,\n type UpdateNodeInput,\n} from \"../types\";\nimport {\n checkUniquenessConstraints,\n deleteUniquenessEntries,\n insertUniquenessEntries,\n type UniquenessContext,\n updateUniquenessEntries,\n} from \"../uniqueness\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Context for node operations.\n */\nexport type NodeOperationContext<G extends GraphDef> = Readonly<{\n graph: G;\n graphId: string;\n registry: KindRegistry;\n createOperationContext: (\n operation: \"create\" | \"update\" | \"delete\",\n entity: \"node\" | \"edge\",\n kind: string,\n id: string,\n ) => OperationHookContext;\n withOperationHooks: <T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ) => Promise<T>;\n}>;\n\n// ============================================================\n// Helper Functions\n// ============================================================\n\nfunction hasNodeType<G extends GraphDef>(graph: G, kind: string): boolean {\n return kind in graph.nodes;\n}\n\nfunction getNodeRegistration<G extends GraphDef>(graph: G, kind: string) {\n if (!hasNodeType(graph, kind)) {\n throw new KindNotFoundError(kind, \"node\");\n }\n // Safe to use non-null assertion after the check above\n return graph.nodes[kind]!;\n}\n\n// ============================================================\n// Node Operations\n// ============================================================\n\n/**\n * Executes a node create operation.\n */\nexport async function executeNodeCreate<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: CreateNodeInput,\n backend: GraphBackend | TransactionBackend,\n): Promise<Node> {\n const kind = input.kind;\n const id = input.id ?? generateId();\n const opContext = ctx.createOperationContext(\"create\", \"node\", kind, id);\n\n return ctx.withOperationHooks(opContext, async () => {\n // Validate kind exists and get registration\n const registration = getNodeRegistration(ctx.graph, kind);\n\n // Validate props with full context\n const nodeKind = registration.type as NodeType;\n const validatedProps = validateNodeProps(nodeKind.schema, input.props, {\n kind,\n operation: \"create\",\n });\n\n // Validate temporal fields\n const validFrom = validateOptionalIsoDate(input.validFrom, \"validFrom\");\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n // Check if node with this kind:id already exists\n const existingNode = await backend.getNode(ctx.graphId, kind, id);\n if (existingNode && !existingNode.deleted_at) {\n throw new ValidationError(\n `Node already exists: ${kind}/${id}`,\n {\n entityType: \"node\",\n kind,\n operation: \"create\",\n id,\n issues: [\n { path: \"id\", message: \"A node with this ID already exists\" },\n ],\n },\n { suggestion: `Use a different ID or update the existing node.` },\n );\n }\n\n // Check disjointness constraints (for multi-kind nodes with same ID)\n const constraintContext: ConstraintContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await checkDisjointnessConstraint(constraintContext, kind, id);\n\n // Check uniqueness constraints\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await checkUniquenessConstraints(\n uniquenessContext,\n kind,\n id,\n validatedProps,\n registration.unique ?? [],\n );\n\n // Insert node - conditionally include optional temporal fields\n const insertParams: {\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n } = {\n graphId: ctx.graphId,\n kind,\n id,\n props: validatedProps,\n };\n if (validFrom !== undefined) insertParams.validFrom = validFrom;\n if (validTo !== undefined) insertParams.validTo = validTo;\n\n const row = await backend.insertNode(insertParams);\n\n // Insert uniqueness entries\n await insertUniquenessEntries(\n uniquenessContext,\n kind,\n id,\n validatedProps,\n registration.unique ?? [],\n );\n\n // Sync embeddings\n const embeddingSyncContext: EmbeddingSyncContext = {\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n backend,\n };\n await syncEmbeddings(embeddingSyncContext, nodeKind.schema, validatedProps);\n\n return rowToNode(row as NodeRow);\n });\n}\n\n/**\n * Executes a node update operation.\n */\nexport async function executeNodeUpdate<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n input: UpdateNodeInput,\n backend: GraphBackend | TransactionBackend,\n options?: Readonly<{ clearDeleted?: boolean }>,\n): Promise<Node> {\n const kind = input.kind;\n const id = input.id as string;\n const opContext = ctx.createOperationContext(\"update\", \"node\", kind, id);\n\n return ctx.withOperationHooks(opContext, async () => {\n // Validate kind exists and get registration\n const registration = getNodeRegistration(ctx.graph, kind);\n\n // Get existing node\n const existing = await backend.getNode(ctx.graphId, kind, id);\n // If clearDeleted is set, allow updating deleted nodes (used by upsert)\n if (!existing || (existing.deleted_at && !options?.clearDeleted)) {\n throw new NodeNotFoundError(kind, id);\n }\n\n // Merge props\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n const mergedProps = { ...existingProps, ...input.props };\n\n // Validate merged props with full context\n const nodeKind = registration.type as NodeType;\n const validatedProps = validateNodeProps(nodeKind.schema, mergedProps, {\n kind,\n operation: \"update\",\n id,\n });\n\n // Validate temporal fields\n const validTo = validateOptionalIsoDate(input.validTo, \"validTo\");\n\n // Handle uniqueness constraint changes\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await updateUniquenessEntries(\n uniquenessContext,\n kind,\n id,\n existingProps,\n validatedProps,\n registration.unique ?? [],\n );\n\n // Update node - conditionally include optional fields\n const updateParams: {\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n incrementVersion?: boolean;\n clearDeleted?: boolean;\n } = {\n graphId: ctx.graphId,\n kind,\n id,\n props: validatedProps,\n incrementVersion: true,\n };\n if (validTo !== undefined) updateParams.validTo = validTo;\n if (options?.clearDeleted) updateParams.clearDeleted = true;\n\n const row = await backend.updateNode(updateParams);\n\n // Sync embeddings with updated props\n const embeddingSyncContext: EmbeddingSyncContext = {\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n backend,\n };\n await syncEmbeddings(embeddingSyncContext, nodeKind.schema, validatedProps);\n\n return rowToNode(row as NodeRow);\n });\n}\n\n/**\n * Executes a node delete operation.\n */\nexport async function executeNodeDelete<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n const opContext = ctx.createOperationContext(\"delete\", \"node\", kind, id);\n\n return ctx.withOperationHooks(opContext, async () => {\n // Validate kind exists and get registration\n const registration = getNodeRegistration(ctx.graph, kind);\n\n // Fetch node props BEFORE soft-delete so we can compute unique keys\n const existing = await backend.getNode(ctx.graphId, kind, id);\n if (!existing || existing.deleted_at) {\n // Node already deleted or doesn't exist - nothing to do\n return;\n }\n const existingProps = JSON.parse(existing.props) as Record<string, unknown>;\n\n // Check delete behavior\n const deleteBehavior = registration.onDelete ?? \"restrict\";\n const connectedEdges = await backend.findEdgesConnectedTo({\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n });\n\n if (connectedEdges.length > 0) {\n switch (deleteBehavior) {\n case \"restrict\": {\n // Block deletion if edges exist\n const edgeKinds = [\n ...new Set(connectedEdges.map((edge) => edge.kind)),\n ];\n throw new RestrictedDeleteError({\n nodeKind: kind,\n nodeId: id,\n edgeCount: connectedEdges.length,\n edgeKinds,\n });\n }\n\n case \"cascade\": {\n // Delete all connected edges\n for (const edge of connectedEdges) {\n await backend.deleteEdge({\n graphId: ctx.graphId,\n id: edge.id,\n });\n }\n break;\n }\n\n case \"disconnect\": {\n // Soft-delete edges (they become orphaned references)\n for (const edge of connectedEdges) {\n await backend.deleteEdge({\n graphId: ctx.graphId,\n id: edge.id,\n });\n }\n break;\n }\n }\n }\n\n await backend.deleteNode({\n graphId: ctx.graphId,\n kind,\n id,\n });\n\n // Delete uniqueness entries\n const uniquenessContext: UniquenessContext = {\n graphId: ctx.graphId,\n registry: ctx.registry,\n backend,\n };\n await deleteUniquenessEntries(\n uniquenessContext,\n kind,\n existingProps,\n registration.unique ?? [],\n );\n\n // Delete embeddings\n const nodeKind = registration.type as NodeType;\n const embeddingSyncContext: EmbeddingSyncContext = {\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n backend,\n };\n await deleteNodeEmbeddings(embeddingSyncContext, nodeKind.schema);\n });\n}\n\n/**\n * Executes a node hard delete operation (permanent removal).\n *\n * Unlike soft delete, this permanently removes the node and all\n * associated data (uniqueness entries, embeddings) from the database.\n */\nexport async function executeNodeHardDelete<G extends GraphDef>(\n ctx: NodeOperationContext<G>,\n kind: string,\n id: string,\n backend: GraphBackend | TransactionBackend,\n): Promise<void> {\n const opContext = ctx.createOperationContext(\"delete\", \"node\", kind, id);\n\n return ctx.withOperationHooks(opContext, async () => {\n // Validate kind exists and get registration\n const registration = getNodeRegistration(ctx.graph, kind);\n\n // Check if node exists (we don't care about deleted_at for hard delete)\n const existing = await backend.getNode(ctx.graphId, kind, id);\n if (!existing) {\n // Node doesn't exist - nothing to do\n return;\n }\n\n // Check delete behavior for connected edges\n const deleteBehavior = registration.onDelete ?? \"restrict\";\n const connectedEdges = await backend.findEdgesConnectedTo({\n graphId: ctx.graphId,\n nodeKind: kind,\n nodeId: id,\n });\n\n if (connectedEdges.length > 0) {\n switch (deleteBehavior) {\n case \"restrict\": {\n // Block deletion if edges exist\n const edgeKinds = [\n ...new Set(connectedEdges.map((edge) => edge.kind)),\n ];\n throw new RestrictedDeleteError({\n nodeKind: kind,\n nodeId: id,\n edgeCount: connectedEdges.length,\n edgeKinds,\n });\n }\n\n case \"cascade\": {\n // Hard delete all connected edges\n for (const edge of connectedEdges) {\n await backend.hardDeleteEdge({\n graphId: ctx.graphId,\n id: edge.id,\n });\n }\n break;\n }\n\n case \"disconnect\": {\n // Hard delete edges (they would be orphaned anyway)\n for (const edge of connectedEdges) {\n await backend.hardDeleteEdge({\n graphId: ctx.graphId,\n id: edge.id,\n });\n }\n break;\n }\n }\n }\n\n // Hard delete the node (backend handles uniqueness entries and embeddings)\n await backend.hardDeleteNode({\n graphId: ctx.graphId,\n kind,\n id,\n });\n });\n}\n","/**\n * Schema migration utilities.\n *\n * Provides diff detection between schema versions to identify\n * what has changed and what migrations might be needed.\n */\nimport {\n type SerializedEdgeDef,\n type SerializedNodeDef,\n type SerializedOntology,\n type SerializedSchema,\n} from \"./types\";\n\n// ============================================================\n// Change Types\n// ============================================================\n\n/**\n * Types of changes that can occur in a schema.\n */\nexport type ChangeType = \"added\" | \"removed\" | \"modified\" | \"renamed\";\n\n/**\n * Severity of a change for migration purposes.\n */\nexport type ChangeSeverity =\n | \"safe\" // No data migration needed\n | \"warning\" // Might need attention\n | \"breaking\"; // Requires data migration\n\n// ============================================================\n// Node Changes\n// ============================================================\n\n/**\n * A change to a node definition.\n */\nexport type NodeChange = Readonly<{\n type: ChangeType;\n name: string;\n severity: ChangeSeverity;\n details: string;\n before?: SerializedNodeDef | undefined;\n after?: SerializedNodeDef | undefined;\n}>;\n\n// ============================================================\n// Edge Changes\n// ============================================================\n\n/**\n * A change to an edge definition.\n */\nexport type EdgeChange = Readonly<{\n type: ChangeType;\n name: string;\n severity: ChangeSeverity;\n details: string;\n before?: SerializedEdgeDef | undefined;\n after?: SerializedEdgeDef | undefined;\n}>;\n\n// ============================================================\n// Ontology Changes\n// ============================================================\n\n/**\n * A change to the ontology.\n */\nexport type OntologyChange = Readonly<{\n type: ChangeType;\n entity: \"metaEdge\" | \"relation\";\n name: string;\n severity: ChangeSeverity;\n details: string;\n}>;\n\n// ============================================================\n// Schema Diff\n// ============================================================\n\n/**\n * A complete diff between two schema versions.\n */\nexport type SchemaDiff = Readonly<{\n fromVersion: number;\n toVersion: number;\n\n /** Changes to node definitions */\n nodes: readonly NodeChange[];\n\n /** Changes to edge definitions */\n edges: readonly EdgeChange[];\n\n /** Changes to ontology */\n ontology: readonly OntologyChange[];\n\n /** Whether any breaking changes exist */\n hasBreakingChanges: boolean;\n\n /** Whether any changes exist at all */\n hasChanges: boolean;\n\n /** Summary of changes */\n summary: string;\n}>;\n\n// ============================================================\n// Diff Computation\n// ============================================================\n\n/**\n * Computes the diff between two schema versions.\n *\n * @param before - The previous schema version\n * @param after - The new schema version\n * @returns A diff describing all changes\n */\nexport function computeSchemaDiff(\n before: SerializedSchema,\n after: SerializedSchema,\n): SchemaDiff {\n const nodeChanges = diffNodes(before.nodes, after.nodes);\n const edgeChanges = diffEdges(before.edges, after.edges);\n const ontologyChanges = diffOntology(before.ontology, after.ontology);\n\n const allChanges = [...nodeChanges, ...edgeChanges, ...ontologyChanges];\n const hasBreakingChanges = allChanges.some(\n (change) => change.severity === \"breaking\",\n );\n const hasChanges = allChanges.length > 0;\n\n const summary = generateSummary(nodeChanges, edgeChanges, ontologyChanges);\n\n return {\n fromVersion: before.version,\n toVersion: after.version,\n nodes: nodeChanges,\n edges: edgeChanges,\n ontology: ontologyChanges,\n hasBreakingChanges,\n hasChanges,\n summary,\n };\n}\n\n// ============================================================\n// Node Diff\n// ============================================================\n\n/**\n * Computes changes between node definitions.\n */\nfunction diffNodes(\n before: Record<string, SerializedNodeDef>,\n after: Record<string, SerializedNodeDef>,\n): readonly NodeChange[] {\n const changes: NodeChange[] = [];\n const beforeNames = new Set(Object.keys(before));\n const afterNames = new Set(Object.keys(after));\n\n // Find removed nodes\n for (const name of beforeNames) {\n if (!afterNames.has(name)) {\n changes.push({\n type: \"removed\",\n name,\n severity: \"breaking\",\n details: `Node kind \"${name}\" was removed`,\n before: before[name],\n });\n }\n }\n\n // Find added nodes\n for (const name of afterNames) {\n if (!beforeNames.has(name)) {\n changes.push({\n type: \"added\",\n name,\n severity: \"safe\",\n details: `Node kind \"${name}\" was added`,\n after: after[name],\n });\n }\n }\n\n // Find modified nodes\n for (const name of beforeNames) {\n if (afterNames.has(name)) {\n const nodeBefore = before[name]!;\n const nodeAfter = after[name]!;\n const nodeChanges = diffNodeDef(name, nodeBefore, nodeAfter);\n changes.push(...nodeChanges);\n }\n }\n\n return changes;\n}\n\n/**\n * Computes changes to a single node definition.\n */\nfunction diffNodeDef(\n name: string,\n before: SerializedNodeDef,\n after: SerializedNodeDef,\n): readonly NodeChange[] {\n const changes: NodeChange[] = [];\n\n // Check property schema changes\n const propsBefore = JSON.stringify(before.properties);\n const propsAfter = JSON.stringify(after.properties);\n if (propsBefore !== propsAfter) {\n // Determine if properties were added or removed\n const beforeProps = before.properties.properties ?? {};\n const afterProps = after.properties.properties ?? {};\n const beforeRequired = new Set(before.properties.required);\n const afterRequired = new Set(after.properties.required);\n\n const addedProps = Object.keys(afterProps).filter(\n (p) => !(p in beforeProps),\n );\n const removedProps = Object.keys(beforeProps).filter(\n (p) => !(p in afterProps),\n );\n const newRequired = [...afterRequired].filter(\n (p) => !beforeRequired.has(p),\n );\n\n const { severity, details } = computePropertyChangeSeverity(\n name,\n removedProps,\n addedProps,\n newRequired,\n );\n\n changes.push({\n type: \"modified\",\n name,\n severity,\n details,\n before,\n after,\n });\n }\n\n // Check onDelete behavior\n if (before.onDelete !== after.onDelete) {\n changes.push({\n type: \"modified\",\n name,\n severity: \"warning\",\n details: `onDelete changed from \"${before.onDelete}\" to \"${after.onDelete}\" for \"${name}\"`,\n before,\n after,\n });\n }\n\n // Check unique constraints\n const constraintsBefore = JSON.stringify(before.uniqueConstraints);\n const constraintsAfter = JSON.stringify(after.uniqueConstraints);\n if (constraintsBefore !== constraintsAfter) {\n changes.push({\n type: \"modified\",\n name,\n severity: \"warning\",\n details: `Unique constraints changed for \"${name}\"`,\n before,\n after,\n });\n }\n\n return changes;\n}\n\n/**\n * Computes the severity and details message for property changes.\n */\nfunction computePropertyChangeSeverity(\n name: string,\n removedProps: readonly string[],\n addedProps: readonly string[],\n newRequired: readonly string[],\n): { severity: ChangeSeverity; details: string } {\n if (removedProps.length > 0) {\n return {\n severity: \"breaking\",\n details: `Properties removed from \"${name}\": ${removedProps.join(\", \")}`,\n };\n }\n if (newRequired.length > 0) {\n return {\n severity: \"breaking\",\n details: `New required properties in \"${name}\": ${newRequired.join(\", \")}`,\n };\n }\n if (addedProps.length > 0) {\n return {\n severity: \"safe\",\n details: `Properties added to \"${name}\": ${addedProps.join(\", \")}`,\n };\n }\n return {\n severity: \"safe\",\n details: `Properties changed in \"${name}\"`,\n };\n}\n\n// ============================================================\n// Edge Diff\n// ============================================================\n\n/**\n * Computes changes between edge definitions.\n */\nfunction diffEdges(\n before: Record<string, SerializedEdgeDef>,\n after: Record<string, SerializedEdgeDef>,\n): readonly EdgeChange[] {\n const changes: EdgeChange[] = [];\n const beforeNames = new Set(Object.keys(before));\n const afterNames = new Set(Object.keys(after));\n\n // Find removed edges\n for (const name of beforeNames) {\n if (!afterNames.has(name)) {\n changes.push({\n type: \"removed\",\n name,\n severity: \"breaking\",\n details: `Edge kind \"${name}\" was removed`,\n before: before[name],\n });\n }\n }\n\n // Find added edges\n for (const name of afterNames) {\n if (!beforeNames.has(name)) {\n changes.push({\n type: \"added\",\n name,\n severity: \"safe\",\n details: `Edge kind \"${name}\" was added`,\n after: after[name],\n });\n }\n }\n\n // Find modified edges\n for (const name of beforeNames) {\n if (afterNames.has(name)) {\n const edgeBefore = before[name]!;\n const edgeAfter = after[name]!;\n const edgeChanges = diffEdgeDef(name, edgeBefore, edgeAfter);\n changes.push(...edgeChanges);\n }\n }\n\n return changes;\n}\n\n/**\n * Computes changes to a single edge definition.\n */\nfunction diffEdgeDef(\n name: string,\n before: SerializedEdgeDef,\n after: SerializedEdgeDef,\n): readonly EdgeChange[] {\n const changes: EdgeChange[] = [];\n\n // Check endpoint kinds\n const fromBefore = JSON.stringify(before.fromKinds);\n const fromAfter = JSON.stringify(after.fromKinds);\n if (fromBefore !== fromAfter) {\n changes.push({\n type: \"modified\",\n name,\n severity: \"warning\",\n details: `fromKinds changed for \"${name}\"`,\n before,\n after,\n });\n }\n\n const toBefore = JSON.stringify(before.toKinds);\n const toAfter = JSON.stringify(after.toKinds);\n if (toBefore !== toAfter) {\n changes.push({\n type: \"modified\",\n name,\n severity: \"warning\",\n details: `toKinds changed for \"${name}\"`,\n before,\n after,\n });\n }\n\n // Check cardinality\n if (before.cardinality !== after.cardinality) {\n changes.push({\n type: \"modified\",\n name,\n severity: \"warning\",\n details: `Cardinality changed from \"${before.cardinality}\" to \"${after.cardinality}\" for \"${name}\"`,\n before,\n after,\n });\n }\n\n // Check properties\n const propsBefore = JSON.stringify(before.properties);\n const propsAfter = JSON.stringify(after.properties);\n if (propsBefore !== propsAfter) {\n changes.push({\n type: \"modified\",\n name,\n severity: \"safe\",\n details: `Properties changed for \"${name}\"`,\n before,\n after,\n });\n }\n\n return changes;\n}\n\n// ============================================================\n// Ontology Diff\n// ============================================================\n\n/**\n * Computes changes to the ontology.\n */\nfunction diffOntology(\n before: SerializedOntology,\n after: SerializedOntology,\n): readonly OntologyChange[] {\n const changes: OntologyChange[] = [];\n\n // Diff meta-edges\n const metaEdgesBefore = new Set(Object.keys(before.metaEdges));\n const metaEdgesAfter = new Set(Object.keys(after.metaEdges));\n\n for (const name of metaEdgesBefore) {\n if (!metaEdgesAfter.has(name)) {\n changes.push({\n type: \"removed\",\n entity: \"metaEdge\",\n name,\n severity: \"breaking\",\n details: `Meta-edge \"${name}\" was removed`,\n });\n }\n }\n\n for (const name of metaEdgesAfter) {\n if (!metaEdgesBefore.has(name)) {\n changes.push({\n type: \"added\",\n entity: \"metaEdge\",\n name,\n severity: \"safe\",\n details: `Meta-edge \"${name}\" was added`,\n });\n }\n }\n\n // Diff relations (simplified - just detect additions/removals)\n const relationsBefore = new Set(\n before.relations.map((r) => `${r.metaEdge}:${r.from}:${r.to}`),\n );\n const relationsAfter = new Set(\n after.relations.map((r) => `${r.metaEdge}:${r.from}:${r.to}`),\n );\n\n for (const relationKey of relationsBefore) {\n if (!relationsAfter.has(relationKey)) {\n const [metaEdge, from, to] = relationKey.split(\":\");\n changes.push({\n type: \"removed\",\n entity: \"relation\",\n name: relationKey,\n severity: \"warning\",\n details: `Relation ${metaEdge}(${from}, ${to}) was removed`,\n });\n }\n }\n\n for (const relationKey of relationsAfter) {\n if (!relationsBefore.has(relationKey)) {\n const [metaEdge, from, to] = relationKey.split(\":\");\n changes.push({\n type: \"added\",\n entity: \"relation\",\n name: relationKey,\n severity: \"safe\",\n details: `Relation ${metaEdge}(${from}, ${to}) was added`,\n });\n }\n }\n\n return changes;\n}\n\n// ============================================================\n// Summary Generation\n// ============================================================\n\n/**\n * Generates a human-readable summary of changes.\n */\nfunction generateSummary(\n nodeChanges: readonly NodeChange[],\n edgeChanges: readonly EdgeChange[],\n ontologyChanges: readonly OntologyChange[],\n): string {\n const parts: string[] = [];\n\n const nodeAdded = nodeChanges.filter((c) => c.type === \"added\").length;\n const nodeRemoved = nodeChanges.filter((c) => c.type === \"removed\").length;\n const nodeModified = nodeChanges.filter((c) => c.type === \"modified\").length;\n\n if (nodeAdded > 0 || nodeRemoved > 0 || nodeModified > 0) {\n parts.push(\n `Nodes: ${nodeAdded} added, ${nodeRemoved} removed, ${nodeModified} modified`,\n );\n }\n\n const edgeAdded = edgeChanges.filter((c) => c.type === \"added\").length;\n const edgeRemoved = edgeChanges.filter((c) => c.type === \"removed\").length;\n const edgeModified = edgeChanges.filter((c) => c.type === \"modified\").length;\n\n if (edgeAdded > 0 || edgeRemoved > 0 || edgeModified > 0) {\n parts.push(\n `Edges: ${edgeAdded} added, ${edgeRemoved} removed, ${edgeModified} modified`,\n );\n }\n\n const ontologyAdded = ontologyChanges.filter(\n (c) => c.type === \"added\",\n ).length;\n const ontologyRemoved = ontologyChanges.filter(\n (c) => c.type === \"removed\",\n ).length;\n\n if (ontologyAdded > 0 || ontologyRemoved > 0) {\n parts.push(`Ontology: ${ontologyAdded} added, ${ontologyRemoved} removed`);\n }\n\n if (parts.length === 0) {\n return \"No changes\";\n }\n\n return parts.join(\"; \");\n}\n\n// ============================================================\n// Migration Helpers\n// ============================================================\n\n/**\n * Checks if a schema change is backwards compatible.\n *\n * A change is backwards compatible if:\n * - No nodes or edges were removed\n * - No required properties were added\n * - No existing properties were removed\n */\nexport function isBackwardsCompatible(diff: SchemaDiff): boolean {\n return !diff.hasBreakingChanges;\n}\n\n/**\n * Gets a list of actions needed for migration.\n */\nexport function getMigrationActions(diff: SchemaDiff): readonly string[] {\n const actions: string[] = [];\n\n for (const change of diff.nodes) {\n if (change.type === \"removed\") {\n actions.push(`DELETE data for removed node kind \"${change.name}\"`);\n }\n if (change.severity === \"breaking\" && change.type === \"modified\") {\n actions.push(\n `MIGRATE data for node kind \"${change.name}\": ${change.details}`,\n );\n }\n }\n\n for (const change of diff.edges) {\n if (change.type === \"removed\") {\n actions.push(`DELETE data for removed edge kind \"${change.name}\"`);\n }\n }\n\n return actions;\n}\n","/**\n * Schema serializer for homoiconic storage.\n *\n * Converts a GraphDef to a SerializedSchema for database storage.\n * Uses Zod's toJSONSchema() for property schema serialization.\n */\nimport type * as Crypto from \"node:crypto\";\n\nimport { z } from \"zod\";\n\nimport {\n getEdgeTypeNames,\n getNodeTypeNames,\n type GraphDef,\n} from \"../core/define-graph\";\nimport {\n type EdgeRegistration,\n type EdgeType,\n type NodeRegistration,\n type NodeType,\n type UniqueConstraint,\n} from \"../core/types\";\nimport {\n getTypeName,\n type MetaEdge,\n type OntologyRelation,\n} from \"../ontology/types\";\nimport { computeClosuresFromOntology } from \"../registry/kind-registry\";\nimport { nowIso } from \"../utils/date\";\nimport {\n type JsonSchema,\n type SchemaHash,\n type SerializedClosures,\n type SerializedEdgeDef,\n type SerializedMetaEdge,\n type SerializedNodeDef,\n type SerializedOntology,\n type SerializedOntologyRelation,\n type SerializedSchema,\n type SerializedUniqueConstraint,\n} from \"./types\";\n\n// ============================================================\n// Main Serialization\n// ============================================================\n\n/**\n * Serializes a GraphDef to a SerializedSchema.\n *\n * @param graph - The graph definition to serialize\n * @param version - The schema version number\n * @returns The serialized schema\n */\nexport function serializeSchema<G extends GraphDef>(\n graph: G,\n version: number,\n): SerializedSchema {\n const nodes = serializeNodes(graph);\n const edges = serializeEdges(graph);\n const ontology = serializeOntology(graph.ontology);\n\n return {\n graphId: graph.id,\n version,\n generatedAt: nowIso(),\n nodes,\n edges,\n ontology,\n defaults: {\n onNodeDelete: graph.defaults.onNodeDelete,\n temporalMode: graph.defaults.temporalMode,\n },\n };\n}\n\n// ============================================================\n// Node Serialization\n// ============================================================\n\n/**\n * Serializes all node definitions.\n */\nfunction serializeNodes<G extends GraphDef>(\n graph: G,\n): Record<string, SerializedNodeDef> {\n const result: Record<string, SerializedNodeDef> = {};\n\n for (const kindName of getNodeTypeNames(graph)) {\n const registration = graph.nodes[kindName] as NodeRegistration;\n result[kindName] = serializeNodeDef(registration);\n }\n\n return result;\n}\n\n/**\n * Serializes a single node registration.\n */\nfunction serializeNodeDef(registration: NodeRegistration): SerializedNodeDef {\n const node = registration.type as NodeType;\n\n return {\n name: node.name,\n properties: serializeZodSchema(node.schema),\n uniqueConstraints: serializeUniqueConstraints(registration.unique ?? []),\n onDelete: registration.onDelete ?? \"restrict\",\n description: node.description,\n };\n}\n\n/**\n * Serializes unique constraints.\n */\nfunction serializeUniqueConstraints(\n constraints: readonly UniqueConstraint[],\n): readonly SerializedUniqueConstraint[] {\n return constraints.map((constraint) => ({\n name: constraint.name,\n fields: [...constraint.fields],\n where:\n constraint.where ? serializeWherePredicate(constraint.where) : undefined,\n scope: constraint.scope,\n collation: constraint.collation,\n }));\n}\n\n/**\n * A serialized predicate structure (matches UniqueConstraintPredicate from core/types).\n */\ntype SerializedPredicate = Readonly<{\n __type: \"unique_predicate\";\n field: string;\n op: \"isNull\" | \"isNotNull\";\n}>;\n\n/**\n * Field builder returned by the predicate proxy.\n */\ntype FieldPredicateBuilder = Readonly<{\n isNull: () => SerializedPredicate;\n isNotNull: () => SerializedPredicate;\n}>;\n\n/**\n * Predicate builder type for where clause serialization.\n */\ntype PredicateBuilder = Readonly<Record<string, FieldPredicateBuilder>>;\n\n/**\n * Serializes a where predicate function to a JSON-serializable structure.\n *\n * The where function is called with a proxy builder that captures the\n * field and operation, which can then be serialized and later deserialized.\n */\nfunction serializeWherePredicate(\n whereFunction: (builder: PredicateBuilder) => SerializedPredicate,\n): string {\n // Create a proxy builder that captures the predicate structure\n const builder = new Proxy({} as PredicateBuilder, {\n get(_target, field: string): FieldPredicateBuilder {\n return {\n isNull: (): SerializedPredicate => ({\n __type: \"unique_predicate\",\n field,\n op: \"isNull\" as const,\n }),\n isNotNull: (): SerializedPredicate => ({\n __type: \"unique_predicate\",\n field,\n op: \"isNotNull\" as const,\n }),\n };\n },\n });\n\n // Call the where function to get the predicate\n const predicate = whereFunction(builder);\n\n // Serialize the predicate structure as JSON\n return JSON.stringify({ field: predicate.field, op: predicate.op });\n}\n\n/**\n * Deserializes a where predicate JSON back to a predicate function.\n *\n * This can be used to reconstruct a UniqueConstraint's where clause\n * from a serialized schema.\n *\n * @param serialized - The JSON string from serialization\n * @returns A where function that returns the predicate structure\n */\n/**\n * Unique predicate result type.\n */\ntype UniquePredicate = Readonly<{\n __type: \"unique_predicate\";\n field: string;\n op: \"isNull\" | \"isNotNull\";\n}>;\n\nexport function deserializeWherePredicate(\n serialized: string,\n): (builder: PredicateBuilder) => UniquePredicate {\n const parsed = JSON.parse(serialized) as {\n field: string;\n op: \"isNull\" | \"isNotNull\";\n };\n\n return (builder: PredicateBuilder): UniquePredicate => {\n const fieldBuilder = builder[parsed.field];\n if (!fieldBuilder) {\n throw new Error(`Unknown field in where predicate: ${parsed.field}`);\n }\n\n const result =\n parsed.op === \"isNull\" ? fieldBuilder.isNull() : fieldBuilder.isNotNull();\n return {\n __type: \"unique_predicate\",\n field: result.field,\n op: result.op,\n };\n };\n}\n\n// ============================================================\n// Edge Serialization\n// ============================================================\n\n/**\n * Serializes all edge definitions.\n */\nfunction serializeEdges<G extends GraphDef>(\n graph: G,\n): Record<string, SerializedEdgeDef> {\n const result: Record<string, SerializedEdgeDef> = {};\n\n for (const kindName of getEdgeTypeNames(graph)) {\n const registration = graph.edges[kindName] as EdgeRegistration;\n result[kindName] = serializeEdgeDef(registration);\n }\n\n return result;\n}\n\n/**\n * Serializes a single edge registration.\n */\nfunction serializeEdgeDef(registration: EdgeRegistration): SerializedEdgeDef {\n const edge = registration.type as EdgeType;\n\n return {\n name: edge.name,\n fromKinds: registration.from.map((node) => (node as NodeType).name),\n toKinds: registration.to.map((node) => (node as NodeType).name),\n properties: serializeZodSchema(edge.schema),\n cardinality: registration.cardinality ?? \"many\",\n endpointExistence: registration.endpointExistence ?? \"notDeleted\",\n description: edge.description,\n };\n}\n\n// ============================================================\n// Ontology Serialization\n// ============================================================\n\n/**\n * Serializes the complete ontology.\n */\nfunction serializeOntology(\n relations: readonly OntologyRelation[],\n): SerializedOntology {\n // Collect unique meta-edges\n const metaEdgeMap = new Map<string, MetaEdge>();\n for (const relation of relations) {\n const metaEdge = relation.metaEdge;\n if (!metaEdgeMap.has(metaEdge.name)) {\n metaEdgeMap.set(metaEdge.name, metaEdge);\n }\n }\n\n // Serialize meta-edges\n const metaEdges: Record<string, SerializedMetaEdge> = {};\n for (const [name, metaEdge] of metaEdgeMap) {\n metaEdges[name] = serializeMetaEdge(metaEdge);\n }\n\n // Serialize relations\n const serializedRelations = relations.map((relation) =>\n serializeOntologyRelation(relation),\n );\n\n // Compute and serialize closures\n const closures = serializeClosures(relations);\n\n return {\n metaEdges,\n relations: serializedRelations,\n closures,\n };\n}\n\n/**\n * Serializes a meta-edge.\n */\nfunction serializeMetaEdge(metaEdge: MetaEdge): SerializedMetaEdge {\n return {\n name: metaEdge.name,\n transitive: metaEdge.properties.transitive,\n symmetric: metaEdge.properties.symmetric,\n reflexive: metaEdge.properties.reflexive,\n inverse: metaEdge.properties.inverse,\n inference: metaEdge.properties.inference,\n description: metaEdge.properties.description,\n };\n}\n\n/**\n * Serializes an ontology relation.\n */\nfunction serializeOntologyRelation(\n relation: OntologyRelation,\n): SerializedOntologyRelation {\n return {\n metaEdge: relation.metaEdge.name,\n from: getTypeName(relation.from),\n to: getTypeName(relation.to),\n };\n}\n\n/**\n * Serializes precomputed closures.\n */\nfunction serializeClosures(\n relations: readonly OntologyRelation[],\n): SerializedClosures {\n if (relations.length === 0) {\n return {\n subClassAncestors: {},\n subClassDescendants: {},\n broaderClosure: {},\n narrowerClosure: {},\n equivalenceSets: {},\n disjointPairs: [],\n partOfClosure: {},\n hasPartClosure: {},\n iriToKind: {},\n edgeInverses: {},\n edgeImplicationsClosure: {},\n edgeImplyingClosure: {},\n };\n }\n\n const computed = computeClosuresFromOntology(relations);\n\n return {\n subClassAncestors: mapToRecord(computed.subClassAncestors),\n subClassDescendants: mapToRecord(computed.subClassDescendants),\n broaderClosure: mapToRecord(computed.broaderClosure),\n narrowerClosure: mapToRecord(computed.narrowerClosure),\n equivalenceSets: mapToRecord(computed.equivalenceSets),\n disjointPairs: [...computed.disjointPairs],\n partOfClosure: mapToRecord(computed.partOfClosure),\n hasPartClosure: mapToRecord(computed.hasPartClosure),\n iriToKind: mapToSimpleRecord(computed.iriToKind),\n edgeInverses: mapToSimpleRecord(computed.edgeInverses),\n edgeImplicationsClosure: mapToRecord(computed.edgeImplicationsClosure),\n edgeImplyingClosure: mapToRecord(computed.edgeImplyingClosure),\n };\n}\n\n/**\n * Converts a Map<string, Set<string>> to Record<string, string[]>.\n */\nfunction mapToRecord(\n map: ReadonlyMap<string, ReadonlySet<string>>,\n): Record<string, readonly string[]> {\n const result: Record<string, readonly string[]> = {};\n for (const [key, values] of map) {\n result[key] = [...values];\n }\n return result;\n}\n\n/**\n * Converts a Map<string, string> to Record<string, string>.\n */\nfunction mapToSimpleRecord(\n map: ReadonlyMap<string, string>,\n): Record<string, string> {\n const result: Record<string, string> = {};\n for (const [key, value] of map) {\n result[key] = value;\n }\n return result;\n}\n\n// ============================================================\n// Zod Schema Serialization\n// ============================================================\n\n/**\n * Serializes a Zod schema to JSON Schema.\n *\n * Uses Zod 4's toJSONSchema() method for conversion.\n */\nfunction serializeZodSchema(schema: z.ZodType): JsonSchema {\n try {\n // Zod 4 has toJSONSchema as a standard export\n const jsonSchema = z.toJSONSchema(schema);\n return jsonSchema as JsonSchema;\n } catch {\n // Fallback for schemas that can't be converted\n return { type: \"object\" };\n }\n}\n\n// ============================================================\n// Schema Hashing\n// ============================================================\n\n/**\n * Computes a hash of the schema content for change detection.\n *\n * Excludes version and generatedAt since those change on every save.\n */\nexport function computeSchemaHash(schema: SerializedSchema): SchemaHash {\n // Create a hashable representation excluding dynamic fields\n const hashable = {\n graphId: schema.graphId,\n nodes: schema.nodes,\n edges: schema.edges,\n ontology: schema.ontology,\n defaults: schema.defaults,\n };\n\n // Serialize with sorted keys for deterministic output\n const json = JSON.stringify(hashable, sortedReplacer);\n return sha256Hash(json);\n}\n\n/**\n * JSON replacer that sorts object keys for deterministic serialization.\n */\nfunction sortedReplacer(_key: string, value: unknown): unknown {\n if (value !== null && typeof value === \"object\" && !Array.isArray(value)) {\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(value).toSorted()) {\n sorted[key] = (value as Record<string, unknown>)[key];\n }\n return sorted;\n }\n return value;\n}\n\n/**\n * Computes SHA-256 hash of a string.\n *\n * Uses Node.js crypto module for reliable cross-platform hashing.\n * Returns first 16 hex characters (64 bits) for a compact but collision-resistant hash.\n */\nfunction sha256Hash(input: string): string {\n // Dynamic import to avoid bundling issues - crypto is a Node.js built-in\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const crypto = require(\"node:crypto\") as typeof Crypto;\n return crypto\n .createHash(\"sha256\")\n .update(input, \"utf8\")\n .digest(\"hex\")\n .slice(0, 16);\n}\n","/**\n * Schema manager for TypeGraph.\n *\n * Provides schema lifecycle management:\n * - Initialization on first store creation\n * - Validation on store open\n * - Auto-migration for safe changes\n * - Error reporting for breaking changes\n */\nimport { type GraphBackend, type SchemaVersionRow } from \"../backend/types\";\nimport { type GraphDef } from \"../core/define-graph\";\nimport { MigrationError } from \"../errors\";\nimport {\n computeSchemaDiff,\n getMigrationActions,\n isBackwardsCompatible,\n type SchemaDiff,\n} from \"./migration\";\nimport { computeSchemaHash, serializeSchema } from \"./serializer\";\nimport { type SerializedSchema } from \"./types\";\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Result of schema validation.\n */\nexport type SchemaValidationResult =\n | { status: \"initialized\"; version: number }\n | { status: \"unchanged\"; version: number }\n | {\n status: \"migrated\";\n fromVersion: number;\n toVersion: number;\n diff: SchemaDiff;\n }\n | { status: \"breaking\"; diff: SchemaDiff; actions: readonly string[] };\n\n/**\n * Options for schema management.\n */\nexport type SchemaManagerOptions = Readonly<{\n /** If true, auto-migrate safe changes. Default: true */\n autoMigrate?: boolean;\n /** If true, throw on breaking changes. Default: true */\n throwOnBreaking?: boolean;\n}>;\n\n// ============================================================\n// Schema Manager\n// ============================================================\n\n/**\n * Ensures the schema is initialized and up-to-date.\n *\n * This is the main entry point for schema management. It:\n * 1. Initializes the schema if this is the first run (version 1)\n * 2. Returns \"unchanged\" if the schema matches the current graph\n * 3. Auto-migrates safe changes if autoMigrate is true\n * 4. Throws MigrationError for breaking changes if throwOnBreaking is true\n *\n * @param backend - The database backend\n * @param graph - The current graph definition\n * @param options - Schema management options\n * @returns The result of schema validation\n * @throws MigrationError if breaking changes detected and throwOnBreaking is true\n */\nexport async function ensureSchema<G extends GraphDef>(\n backend: GraphBackend,\n graph: G,\n options?: SchemaManagerOptions,\n): Promise<SchemaValidationResult> {\n const autoMigrate = options?.autoMigrate ?? true;\n const throwOnBreaking = options?.throwOnBreaking ?? true;\n\n // Get the active schema from the database\n const activeSchema = await backend.getActiveSchema(graph.id);\n\n if (!activeSchema) {\n // No schema exists - initialize with version 1\n const result = await initializeSchema(backend, graph);\n return { status: \"initialized\", version: result.version };\n }\n\n // Parse the stored schema\n const storedSchema = JSON.parse(activeSchema.schema_doc) as SerializedSchema;\n\n // Serialize the current graph for comparison\n const currentSchema = serializeSchema(graph, activeSchema.version + 1);\n\n // Quick hash check - if hashes match, schemas are identical\n const storedHash = activeSchema.schema_hash;\n const currentHash = computeSchemaHash(currentSchema);\n\n if (storedHash === currentHash) {\n return { status: \"unchanged\", version: activeSchema.version };\n }\n\n // Hashes differ - compute the diff\n const diff = computeSchemaDiff(storedSchema, currentSchema);\n\n if (!diff.hasChanges) {\n // Hash changed but no semantic changes (shouldn't happen, but handle it)\n return { status: \"unchanged\", version: activeSchema.version };\n }\n\n // Check if changes are backwards compatible\n if (isBackwardsCompatible(diff)) {\n if (autoMigrate) {\n // Safe changes - auto-migrate\n const newVersion = await migrateSchema(\n backend,\n graph,\n activeSchema.version,\n );\n return {\n status: \"migrated\",\n fromVersion: activeSchema.version,\n toVersion: newVersion,\n diff,\n };\n }\n // Auto-migrate disabled but changes are safe\n return {\n status: \"migrated\",\n fromVersion: activeSchema.version,\n toVersion: activeSchema.version,\n diff,\n };\n }\n\n // Breaking changes detected\n const actions = getMigrationActions(diff);\n\n if (throwOnBreaking) {\n throw new MigrationError(\n `Schema migration required: ${diff.summary}. ` +\n `${actions.length} migration action(s) needed. ` +\n `Use migrateSchema() with force=true to proceed.`,\n {\n graphId: graph.id,\n fromVersion: activeSchema.version,\n toVersion: activeSchema.version + 1,\n },\n );\n }\n\n return { status: \"breaking\", diff, actions };\n}\n\n/**\n * Initializes the schema for a new graph.\n *\n * Creates version 1 of the schema and marks it as active.\n *\n * @param backend - The database backend\n * @param graph - The graph definition\n * @returns The created schema version row\n */\nexport async function initializeSchema<G extends GraphDef>(\n backend: GraphBackend,\n graph: G,\n): Promise<SchemaVersionRow> {\n const schema = serializeSchema(graph, 1);\n const hash = computeSchemaHash(schema);\n\n return backend.insertSchema({\n graphId: graph.id,\n version: 1,\n schemaHash: hash,\n schemaDoc: schema as unknown as Record<string, unknown>,\n isActive: true,\n });\n}\n\n/**\n * Migrates the schema to match the current graph definition.\n *\n * This creates a new schema version and marks it as active.\n * The old version is preserved for history/rollback.\n *\n * @param backend - The database backend\n * @param graph - The current graph definition\n * @param currentVersion - The current active schema version\n * @returns The new version number\n */\nexport async function migrateSchema<G extends GraphDef>(\n backend: GraphBackend,\n graph: G,\n currentVersion: number,\n): Promise<number> {\n const newVersion = currentVersion + 1;\n const schema = serializeSchema(graph, newVersion);\n const hash = computeSchemaHash(schema);\n\n // Insert new version (not active yet)\n await backend.insertSchema({\n graphId: graph.id,\n version: newVersion,\n schemaHash: hash,\n schemaDoc: schema as unknown as Record<string, unknown>,\n isActive: false,\n });\n\n // Atomically switch to the new version\n await backend.setActiveSchema(graph.id, newVersion);\n\n return newVersion;\n}\n\n/**\n * Gets the current active schema for a graph.\n *\n * @param backend - The database backend\n * @param graphId - The graph ID\n * @returns The active schema or undefined if not initialized\n */\nexport async function getActiveSchema(\n backend: GraphBackend,\n graphId: string,\n): Promise<SerializedSchema | undefined> {\n const row = await backend.getActiveSchema(graphId);\n if (!row) return undefined;\n return JSON.parse(row.schema_doc) as SerializedSchema;\n}\n\n/**\n * Checks if a graph's schema has been initialized.\n *\n * @param backend - The database backend\n * @param graphId - The graph ID\n * @returns True if the schema has been initialized\n */\nexport async function isSchemaInitialized(\n backend: GraphBackend,\n graphId: string,\n): Promise<boolean> {\n const row = await backend.getActiveSchema(graphId);\n return row !== undefined;\n}\n\n/**\n * Gets the schema diff between the stored schema and current graph.\n *\n * @param backend - The database backend\n * @param graph - The current graph definition\n * @returns The diff, or undefined if schema not initialized\n */\nexport async function getSchemaChanges<G extends GraphDef>(\n backend: GraphBackend,\n graph: G,\n): Promise<SchemaDiff | undefined> {\n const activeSchema = await backend.getActiveSchema(graph.id);\n if (!activeSchema) return undefined;\n\n const storedSchema = JSON.parse(activeSchema.schema_doc) as SerializedSchema;\n const currentSchema = serializeSchema(graph, activeSchema.version + 1);\n\n return computeSchemaDiff(storedSchema, currentSchema);\n}\n","/**\n * Main Store implementation for TypeGraph.\n *\n * The Store is the primary interface for interacting with a TypeGraph.\n * It coordinates:\n * - Node and edge CRUD operations\n * - Constraint validation\n * - Schema management\n * - Transaction handling\n */\nimport { type GraphBackend } from \"../backend/types\";\nimport { type GraphDef } from \"../core/define-graph\";\nimport { createQueryBuilder, type QueryBuilder } from \"../query/builder\";\nimport { buildKindRegistry, type KindRegistry } from \"../registry\";\nimport { nowIso } from \"../utils/date\";\nimport { generateId } from \"../utils/id\";\nimport {\n createEdgeCollectionsProxy,\n createNodeCollectionsProxy,\n type EdgeOperations,\n type NodeOperations,\n} from \"./collection-factory\";\nimport {\n type EdgeOperationContext,\n executeEdgeCreate,\n executeEdgeDelete,\n executeEdgeHardDelete,\n executeEdgeUpdate,\n executeNodeCreate,\n executeNodeDelete,\n executeNodeHardDelete,\n executeNodeUpdate,\n type NodeOperationContext,\n} from \"./operations\";\nimport {\n type EdgeRow,\n type NodeRow,\n rowToEdge,\n rowToNode,\n} from \"./row-mappers\";\nimport {\n type HookContext,\n type NodeCollection,\n type OperationHookContext,\n type QueryOptions,\n type StoreHooks,\n type StoreOptions,\n type TransactionContext,\n type TypedEdgeCollection,\n} from \"./types\";\n\n// ============================================================\n// Store Class\n// ============================================================\n\n/**\n * The Store provides typed access to a TypeGraph database.\n *\n * @example\n * ```typescript\n * const store = createStore(myGraph, backend);\n *\n * // Create nodes using collection API\n * const person = await store.nodes.Person.create({\n * name: \"Alice\",\n * email: \"alice@example.com\",\n * });\n *\n * const company = await store.nodes.Company.create({\n * name: \"Acme\",\n * industry: \"Technology\",\n * });\n *\n * // Create edges\n * await store.edges.worksAt.create(\n * { kind: \"Person\", id: person.id },\n * { kind: \"Company\", id: company.id },\n * { role: \"Engineer\" }\n * );\n *\n * // Query with the fluent API\n * const results = await store.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.name.eq(\"Alice\"))\n * .select((ctx) => ctx.p)\n * .execute();\n * ```\n */\nexport class Store<G extends GraphDef> {\n readonly #graph: G;\n readonly #backend: GraphBackend;\n readonly #registry: KindRegistry;\n readonly #hooks: StoreHooks;\n readonly #schema: StoreOptions[\"schema\"];\n\n constructor(graph: G, backend: GraphBackend, options?: StoreOptions) {\n this.#graph = graph;\n this.#backend = backend;\n this.#registry = buildKindRegistry(graph);\n this.#hooks = options?.hooks ?? {};\n this.#schema = options?.schema;\n }\n\n // === Accessors ===\n\n /** The graph definition */\n get graph(): G {\n return this.#graph;\n }\n\n /** The graph ID */\n get graphId(): string {\n return this.#graph.id;\n }\n\n /** The kind registry for ontology lookups */\n get registry(): KindRegistry {\n return this.#registry;\n }\n\n /** The database backend */\n get backend(): GraphBackend {\n return this.#backend;\n }\n\n // === Collections ===\n\n /**\n * Node collections for ergonomic CRUD operations.\n *\n * @example\n * ```typescript\n * // Create a node\n * const person = await store.nodes.Person.create({ name: \"Alice\" });\n *\n * // Get by ID\n * const fetched = await store.nodes.Person.getById(person.id);\n *\n * // Find all\n * const people = await store.nodes.Person.find({ limit: 10 });\n * ```\n */\n get nodes(): {\n [K in keyof G[\"nodes\"] & string]-?: NodeCollection<G[\"nodes\"][K][\"type\"]>;\n } {\n return createNodeCollectionsProxy(\n this.#graph,\n this.graphId,\n this.#registry,\n this.#backend,\n this.#nodeOperations,\n );\n }\n\n /**\n * Edge collections for ergonomic CRUD operations.\n *\n * @example\n * ```typescript\n * // Create an edge\n * const edge = await store.edges.worksAt.create(\n * { kind: \"Person\", id: person.id },\n * { kind: \"Company\", id: company.id },\n * { role: \"Engineer\" }\n * );\n *\n * // Find edges from a node\n * const edges = await store.edges.worksAt.findFrom({ kind: \"Person\", id: person.id });\n * ```\n */\n get edges(): {\n [K in keyof G[\"edges\"] & string]-?: TypedEdgeCollection<G[\"edges\"][K]>;\n } {\n return createEdgeCollectionsProxy(\n this.#graph,\n this.graphId,\n this.#registry,\n this.#backend,\n this.#edgeOperations,\n );\n }\n\n /**\n * Node operations bound to this store instance.\n */\n get #nodeOperations(): NodeOperations {\n const ctx = this.#createNodeOperationContext();\n return {\n rowToNode: (row) => rowToNode(row as NodeRow),\n executeCreate: (input, backend) => executeNodeCreate(ctx, input, backend),\n executeUpdate: (input, backend, options) =>\n executeNodeUpdate(ctx, { ...input, id: input.id }, backend, options),\n executeDelete: (kind, id, backend) =>\n executeNodeDelete(ctx, kind, id, backend),\n executeHardDelete: (kind, id, backend) =>\n executeNodeHardDelete(ctx, kind, id, backend),\n matchesTemporalMode: (row, options) =>\n this.#matchesTemporalMode(row, options),\n };\n }\n\n /**\n * Edge operations bound to this store instance.\n */\n get #edgeOperations(): EdgeOperations {\n const ctx = this.#createEdgeOperationContext();\n return {\n rowToEdge: (row) => rowToEdge(row as EdgeRow),\n executeCreate: (input, backend) => executeEdgeCreate(ctx, input, backend),\n executeUpdate: (input, backend) => executeEdgeUpdate(ctx, input, backend),\n executeDelete: (id, backend) => executeEdgeDelete(ctx, id, backend),\n executeHardDelete: (id, backend) =>\n executeEdgeHardDelete(ctx, id, backend),\n matchesTemporalMode: (row, options) =>\n this.#matchesTemporalMode(row, options),\n };\n }\n\n // === Query Builder ===\n\n /**\n * Creates a query builder for this store.\n *\n * @example\n * ```typescript\n * const results = await store.query()\n * .from(\"Person\", \"p\")\n * .whereNode(\"p\", (p) => p.name.eq(\"Alice\"))\n * .select((ctx) => ctx.p)\n * .execute();\n * ```\n */\n query(): QueryBuilder<G> {\n return createQueryBuilder<G>(this.graphId, this.#registry, {\n backend: this.#backend,\n dialect: this.#backend.dialect,\n ...(this.#schema !== undefined && { schema: this.#schema }),\n });\n }\n\n // === Transactions ===\n\n /**\n * Executes a function within a transaction.\n *\n * The transaction context provides the same collection API as the Store:\n * - `tx.nodes.Person.create(...)` - Create a node\n * - `tx.edges.worksAt.create(...)` - Create an edge\n *\n * @example\n * ```typescript\n * await store.transaction(async (tx) => {\n * const person = await tx.nodes.Person.create({ name: \"Alice\" });\n * const company = await tx.nodes.Company.create({ name: \"Acme\" });\n * await tx.edges.worksAt.create(\n * { kind: \"Person\", id: person.id },\n * { kind: \"Company\", id: company.id },\n * { role: \"Engineer\" }\n * );\n * });\n * ```\n */\n async transaction<T>(\n fn: (tx: TransactionContext<G>) => Promise<T>,\n ): Promise<T> {\n return this.#backend.transaction(async (txBackend) => {\n // Create collections using transaction backend\n const nodes = createNodeCollectionsProxy(\n this.#graph,\n this.graphId,\n this.#registry,\n txBackend,\n this.#nodeOperations,\n );\n\n const edges = createEdgeCollectionsProxy(\n this.#graph,\n this.graphId,\n this.#registry,\n txBackend,\n this.#edgeOperations,\n );\n\n return fn({ nodes, edges });\n });\n }\n\n // === Lifecycle ===\n\n /**\n * Closes the store and releases underlying resources.\n *\n * Note: When using the Drizzle adapter, this method does not close the database\n * connection itself, as Drizzle delegates connection management to the user.\n * You should close the underlying database connection (e.g., better-sqlite3 or pg pool)\n * using their respective APIs.\n */\n async close(): Promise<void> {\n await this.#backend.close();\n }\n\n // === Internal: Operation Contexts ===\n\n #createNodeOperationContext(): NodeOperationContext<G> {\n return {\n graph: this.#graph,\n graphId: this.graphId,\n registry: this.#registry,\n createOperationContext: (operation, entity, kind, id) =>\n this.#createOperationContext(operation, entity, kind, id),\n withOperationHooks: <T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ) => this.#withOperationHooks(ctx, fn),\n };\n }\n\n #createEdgeOperationContext(): EdgeOperationContext<G> {\n return {\n graph: this.#graph,\n graphId: this.graphId,\n registry: this.#registry,\n createOperationContext: (operation, entity, kind, id) =>\n this.#createOperationContext(operation, entity, kind, id),\n withOperationHooks: <T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ) => this.#withOperationHooks(ctx, fn),\n };\n }\n\n // === Internal: Hook Helpers ===\n\n #createHookContext(): HookContext {\n return {\n operationId: generateId(),\n graphId: this.graphId,\n startedAt: new Date(),\n };\n }\n\n #createOperationContext(\n operation: \"create\" | \"update\" | \"delete\",\n entity: \"node\" | \"edge\",\n kind: string,\n id: string,\n ): OperationHookContext {\n return {\n ...this.#createHookContext(),\n operation,\n entity,\n kind,\n id,\n };\n }\n\n async #withOperationHooks<T>(\n ctx: OperationHookContext,\n fn: () => Promise<T>,\n ): Promise<T> {\n this.#hooks.onOperationStart?.(ctx);\n const startTime = Date.now();\n try {\n const result = await fn();\n this.#hooks.onOperationEnd?.(ctx, {\n durationMs: Date.now() - startTime,\n });\n return result;\n } catch (error) {\n this.#hooks.onError?.(\n ctx,\n error instanceof Error ? error : new Error(String(error)),\n );\n throw error;\n }\n }\n\n // === Internal: Temporal Filtering ===\n\n #matchesTemporalMode(\n row: {\n deleted_at: string | undefined;\n valid_from: string | undefined;\n valid_to: string | undefined;\n },\n options?: QueryOptions,\n ): boolean {\n const mode = options?.temporalMode ?? this.#graph.defaults.temporalMode;\n const asOf = options?.asOf ?? nowIso();\n\n switch (mode) {\n case \"current\":\n case \"asOf\": {\n if (row.deleted_at) return false;\n if (row.valid_from && asOf < row.valid_from) return false;\n if (row.valid_to && asOf >= row.valid_to) return false;\n return true;\n }\n case \"includeEnded\": {\n return !row.deleted_at;\n }\n case \"includeTombstones\": {\n return true;\n }\n }\n }\n}\n\n// ============================================================\n// Factory Function\n// ============================================================\n\n/**\n * Creates a new Store instance.\n *\n * @param graph - The graph definition\n * @param backend - The database backend\n * @param options - Optional store configuration including observability hooks\n * @returns A new Store instance\n *\n * @example\n * ```typescript\n * // Basic usage\n * const store = createStore(graph, backend);\n *\n * // With observability hooks\n * const store = createStore(graph, backend, {\n * hooks: {\n * onOperationStart: (ctx) => {\n * console.log(`Starting ${ctx.operation} on ${ctx.entity}:${ctx.kind}`);\n * },\n * onOperationEnd: (ctx, result) => {\n * console.log(`Completed in ${result.durationMs}ms`);\n * },\n * onError: (ctx, error) => {\n * console.error(`Operation ${ctx.operationId} failed:`, error);\n * },\n * },\n * });\n * ```\n */\nexport function createStore<G extends GraphDef>(\n graph: G,\n backend: GraphBackend,\n options?: StoreOptions,\n): Store<G> {\n return new Store(graph, backend, options);\n}\n\n// ============================================================\n// Async Factory with Schema Management\n// ============================================================\n\n// Re-export schema manager types\nexport type {\n SchemaManagerOptions,\n SchemaValidationResult,\n} from \"../schema/manager\";\n\nimport {\n ensureSchema as ensureSchemaImpl,\n type SchemaManagerOptions,\n type SchemaValidationResult,\n} from \"../schema/manager\";\n\n/**\n * Creates a store and ensures the schema is initialized/migrated.\n *\n * This is the recommended way to create a store in production.\n * It automatically:\n * - Initializes the schema on first run (version 1)\n * - Auto-migrates safe changes (additive changes)\n * - Throws MigrationError for breaking changes\n *\n * @param graph - The graph definition\n * @param backend - The database backend\n * @param options - Store and schema options\n * @returns A tuple of [store, validationResult]\n *\n * @example\n * ```typescript\n * const [store, result] = await createStoreWithSchema(graph, backend);\n *\n * if (result.status === \"initialized\") {\n * console.log(\"Schema initialized at version\", result.version);\n * } else if (result.status === \"migrated\") {\n * console.log(`Migrated from v${result.fromVersion} to v${result.toVersion}`);\n * }\n * ```\n */\nexport async function createStoreWithSchema<G extends GraphDef>(\n graph: G,\n backend: GraphBackend,\n options?: StoreOptions & SchemaManagerOptions,\n): Promise<[Store<G>, SchemaValidationResult]> {\n const store = createStore(graph, backend, options);\n const result = await ensureSchemaImpl(backend, graph, options);\n return [store, result];\n}\n","/**\n * Schema deserializer for loading stored schemas.\n *\n * Reconstructs runtime objects from SerializedSchema.\n * Note: Zod schemas cannot be fully reconstructed from JSON Schema,\n * so this provides access to the serialized data for introspection.\n */\nimport { KindRegistry } from \"../registry/kind-registry\";\nimport {\n type SerializedClosures,\n type SerializedEdgeDef,\n type SerializedMetaEdge,\n type SerializedNodeDef,\n type SerializedOntologyRelation,\n type SerializedSchema,\n} from \"./types\";\n\n// ============================================================\n// Deserialized Schema\n// ============================================================\n\n/**\n * A deserialized schema provides read-only access to schema metadata.\n *\n * Note: Unlike the original GraphDef, this does not include Zod schemas\n * since those cannot be reconstructed from JSON Schema. Use this for\n * introspection and metadata access only.\n */\nexport type DeserializedSchema = Readonly<{\n graphId: string;\n version: number;\n generatedAt: string;\n\n /** Get node definition by name */\n getNode: (name: string) => SerializedNodeDef | undefined;\n\n /** Get all node names */\n getNodeNames: () => readonly string[];\n\n /** Get edge definition by name */\n getEdge: (name: string) => SerializedEdgeDef | undefined;\n\n /** Get all edge names */\n getEdgeNames: () => readonly string[];\n\n /** Get meta-edge definition by name */\n getMetaEdge: (name: string) => SerializedMetaEdge | undefined;\n\n /** Get all meta-edge names */\n getMetaEdgeNames: () => readonly string[];\n\n /** Get all ontology relations */\n getRelations: () => readonly SerializedOntologyRelation[];\n\n /** Get precomputed closures */\n getClosures: () => SerializedClosures;\n\n /** Get graph defaults */\n getDefaults: () => SerializedSchema[\"defaults\"];\n\n /** Get the raw serialized schema */\n getRaw: () => SerializedSchema;\n\n /** Build a KindRegistry from the closures */\n buildRegistry: () => KindRegistry;\n}>;\n\n// ============================================================\n// Deserialization\n// ============================================================\n\n/**\n * Deserializes a SerializedSchema into a DeserializedSchema.\n *\n * @param schema - The serialized schema to deserialize\n * @returns A deserialized schema with accessor methods\n */\nexport function deserializeSchema(\n schema: SerializedSchema,\n): DeserializedSchema {\n const nodeNames = Object.keys(schema.nodes);\n const edgeNames = Object.keys(schema.edges);\n const metaEdgeNames = Object.keys(schema.ontology.metaEdges);\n\n return {\n graphId: schema.graphId,\n version: schema.version,\n generatedAt: schema.generatedAt,\n\n getNode: (name) => schema.nodes[name],\n getNodeNames: () => nodeNames,\n\n getEdge: (name) => schema.edges[name],\n getEdgeNames: () => edgeNames,\n\n getMetaEdge: (name) => schema.ontology.metaEdges[name],\n getMetaEdgeNames: () => metaEdgeNames,\n\n getRelations: () => schema.ontology.relations,\n getClosures: () => schema.ontology.closures,\n\n getDefaults: () => schema.defaults,\n getRaw: () => schema,\n\n buildRegistry: () => buildRegistryFromClosures(schema),\n };\n}\n\n// ============================================================\n// Registry Building\n// ============================================================\n\n/**\n * Builds a KindRegistry from serialized closures.\n *\n * This allows query execution without recomputing closures.\n */\nfunction buildRegistryFromClosures(schema: SerializedSchema): KindRegistry {\n const { closures } = schema.ontology;\n\n // Convert Record<string, string[]> back to Map<string, Set<string>>\n const subClassAncestors = recordToMap(closures.subClassAncestors);\n const subClassDescendants = recordToMap(closures.subClassDescendants);\n const broaderClosure = recordToMap(closures.broaderClosure);\n const narrowerClosure = recordToMap(closures.narrowerClosure);\n const equivalenceSets = recordToMap(closures.equivalenceSets);\n const partOfClosure = recordToMap(closures.partOfClosure);\n const hasPartClosure = recordToMap(closures.hasPartClosure);\n const iriToKind = simpleRecordToMap(closures.iriToKind);\n const disjointPairs = new Set(closures.disjointPairs);\n const edgeInverses = simpleRecordToMap(closures.edgeInverses);\n const edgeImplicationsClosure = recordToMap(closures.edgeImplicationsClosure);\n const edgeImplyingClosure = recordToMap(closures.edgeImplyingClosure);\n\n // Build empty node/edge kind maps (we don't have the actual Zod schemas)\n const nodeKinds = new Map();\n const edgeKinds = new Map();\n\n return new KindRegistry(nodeKinds, edgeKinds, {\n subClassAncestors,\n subClassDescendants,\n broaderClosure,\n narrowerClosure,\n equivalenceSets,\n iriToKind,\n disjointPairs,\n partOfClosure,\n hasPartClosure,\n edgeInverses,\n edgeImplicationsClosure,\n edgeImplyingClosure,\n });\n}\n\n/**\n * Converts Record<string, string[]> to Map<string, Set<string>>.\n */\nfunction recordToMap(\n record: Record<string, readonly string[]>,\n): ReadonlyMap<string, ReadonlySet<string>> {\n const result = new Map<string, Set<string>>();\n for (const [key, values] of Object.entries(record)) {\n result.set(key, new Set(values));\n }\n return result;\n}\n\n/**\n * Converts Record<string, string> to Map<string, string>.\n */\nfunction simpleRecordToMap(\n record: Record<string, string>,\n): ReadonlyMap<string, string> {\n return new Map(Object.entries(record));\n}\n"]}