@nicia-ai/typegraph 0.2.0 → 0.3.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 (146) hide show
  1. package/README.md +23 -0
  2. package/dist/{ast-BVyihVbP.d.cts → ast-CXFx6bF6.d.ts} +45 -165
  3. package/dist/{ast-BVyihVbP.d.ts → ast-D-3bOanX.d.cts} +45 -165
  4. package/dist/backend/drizzle/index.cjs +20 -20
  5. package/dist/backend/drizzle/index.d.cts +6 -5
  6. package/dist/backend/drizzle/index.d.ts +6 -5
  7. package/dist/backend/drizzle/index.js +8 -8
  8. package/dist/backend/drizzle/postgres.cjs +9 -9
  9. package/dist/backend/drizzle/postgres.d.cts +9 -11
  10. package/dist/backend/drizzle/postgres.d.ts +9 -11
  11. package/dist/backend/drizzle/postgres.js +6 -6
  12. package/dist/backend/drizzle/schema/postgres.cjs +10 -10
  13. package/dist/backend/drizzle/schema/postgres.d.cts +6 -5
  14. package/dist/backend/drizzle/schema/postgres.d.ts +6 -5
  15. package/dist/backend/drizzle/schema/postgres.js +3 -3
  16. package/dist/backend/drizzle/schema/sqlite.cjs +10 -10
  17. package/dist/backend/drizzle/schema/sqlite.d.cts +6 -5
  18. package/dist/backend/drizzle/schema/sqlite.d.ts +6 -5
  19. package/dist/backend/drizzle/schema/sqlite.js +3 -3
  20. package/dist/backend/drizzle/sqlite.cjs +9 -9
  21. package/dist/backend/drizzle/sqlite.d.cts +17 -18
  22. package/dist/backend/drizzle/sqlite.d.ts +17 -18
  23. package/dist/backend/drizzle/sqlite.js +6 -6
  24. package/dist/backend/postgres/index.cjs +21 -17
  25. package/dist/backend/postgres/index.d.cts +8 -7
  26. package/dist/backend/postgres/index.d.ts +8 -7
  27. package/dist/backend/postgres/index.js +8 -8
  28. package/dist/backend/sqlite/index.cjs +27 -21
  29. package/dist/backend/sqlite/index.cjs.map +1 -1
  30. package/dist/backend/sqlite/index.d.cts +7 -6
  31. package/dist/backend/sqlite/index.d.ts +7 -6
  32. package/dist/backend/sqlite/index.js +18 -12
  33. package/dist/backend/sqlite/index.js.map +1 -1
  34. package/dist/{chunk-YM5AL65Y.cjs → chunk-2WVFEIHR.cjs} +29 -3
  35. package/dist/chunk-2WVFEIHR.cjs.map +1 -0
  36. package/dist/{chunk-4PIEL2VO.js → chunk-3PURVEA4.js} +36 -5
  37. package/dist/chunk-3PURVEA4.js.map +1 -0
  38. package/dist/chunk-4HARSV2G.js +1448 -0
  39. package/dist/chunk-4HARSV2G.js.map +1 -0
  40. package/dist/{chunk-IIAT36MI.js → chunk-54WJF3DW.js} +29 -3
  41. package/dist/chunk-54WJF3DW.js.map +1 -0
  42. package/dist/chunk-CMHFS34N.cjs +390 -0
  43. package/dist/chunk-CMHFS34N.cjs.map +1 -0
  44. package/dist/chunk-DD6ONEBN.cjs +1264 -0
  45. package/dist/chunk-DD6ONEBN.cjs.map +1 -0
  46. package/dist/chunk-F2BZSEFE.js +388 -0
  47. package/dist/chunk-F2BZSEFE.js.map +1 -0
  48. package/dist/{chunk-DDM2FZRJ.cjs → chunk-JQDWEX6V.cjs} +24 -24
  49. package/dist/{chunk-DDM2FZRJ.cjs.map → chunk-JQDWEX6V.cjs.map} +1 -1
  50. package/dist/chunk-NP4G4ZKM.js +1228 -0
  51. package/dist/chunk-NP4G4ZKM.js.map +1 -0
  52. package/dist/{chunk-UJAGXJDG.cjs → chunk-NU2XNMVI.cjs} +38 -7
  53. package/dist/chunk-NU2XNMVI.cjs.map +1 -0
  54. package/dist/{chunk-JKTO7TW3.js → chunk-O5XPCJLF.js} +25 -3
  55. package/dist/chunk-O5XPCJLF.js.map +1 -0
  56. package/dist/{chunk-2QHQ2C4P.js → chunk-OGGLFYFA.js} +36 -5
  57. package/dist/chunk-OGGLFYFA.js.map +1 -0
  58. package/dist/{chunk-SV5H3XM5.cjs → chunk-OYL2SGBD.cjs} +26 -2
  59. package/dist/chunk-OYL2SGBD.cjs.map +1 -0
  60. package/dist/chunk-SFY2PPOY.cjs +1469 -0
  61. package/dist/chunk-SFY2PPOY.cjs.map +1 -0
  62. package/dist/{chunk-JDAET5LO.js → chunk-SMLIWLS7.js} +9 -9
  63. package/dist/chunk-SMLIWLS7.js.map +1 -0
  64. package/dist/{chunk-VXRVGFCI.js → chunk-U3452TEU.js} +17 -17
  65. package/dist/{chunk-VXRVGFCI.js.map → chunk-U3452TEU.js.map} +1 -1
  66. package/dist/{chunk-MNO33ASC.cjs → chunk-UYMT4LO2.cjs} +9 -8
  67. package/dist/chunk-UYMT4LO2.cjs.map +1 -0
  68. package/dist/chunk-V7CS2MDB.cjs +289 -0
  69. package/dist/chunk-V7CS2MDB.cjs.map +1 -0
  70. package/dist/chunk-WE5BKYNB.js +287 -0
  71. package/dist/chunk-WE5BKYNB.js.map +1 -0
  72. package/dist/{chunk-L642L24T.js → chunk-XDTYTNYL.js} +14 -21
  73. package/dist/chunk-XDTYTNYL.js.map +1 -0
  74. package/dist/{chunk-N4AOJ3VF.cjs → chunk-XZL6MCZJ.cjs} +38 -7
  75. package/dist/chunk-XZL6MCZJ.cjs.map +1 -0
  76. package/dist/{chunk-DBFCKELK.cjs → chunk-ZJHQZZT2.cjs} +18 -27
  77. package/dist/chunk-ZJHQZZT2.cjs.map +1 -0
  78. package/dist/index-Dkicw49A.d.cts +373 -0
  79. package/dist/index-Dkicw49A.d.ts +373 -0
  80. package/dist/index.cjs +5915 -3377
  81. package/dist/index.cjs.map +1 -1
  82. package/dist/index.d.cts +24 -664
  83. package/dist/index.d.ts +24 -664
  84. package/dist/index.js +5781 -3223
  85. package/dist/index.js.map +1 -1
  86. package/dist/indexes/index.cjs +16 -16
  87. package/dist/indexes/index.d.cts +5 -4
  88. package/dist/indexes/index.d.ts +5 -4
  89. package/dist/indexes/index.js +2 -2
  90. package/dist/interchange/index.cjs +9 -9
  91. package/dist/interchange/index.cjs.map +1 -1
  92. package/dist/interchange/index.d.cts +5 -3
  93. package/dist/interchange/index.d.ts +5 -3
  94. package/dist/interchange/index.js +8 -8
  95. package/dist/interchange/index.js.map +1 -1
  96. package/dist/manager-Jc5Btay9.d.cts +493 -0
  97. package/dist/manager-e9LXthrx.d.ts +493 -0
  98. package/dist/profiler/index.cjs +2 -8
  99. package/dist/profiler/index.cjs.map +1 -1
  100. package/dist/profiler/index.d.cts +9 -161
  101. package/dist/profiler/index.d.ts +9 -161
  102. package/dist/profiler/index.js +4 -4
  103. package/dist/profiler/index.js.map +1 -1
  104. package/dist/schema/index.cjs +145 -0
  105. package/dist/schema/index.cjs.map +1 -0
  106. package/dist/schema/index.d.cts +237 -0
  107. package/dist/schema/index.d.ts +237 -0
  108. package/dist/schema/index.js +72 -0
  109. package/dist/schema/index.js.map +1 -0
  110. package/dist/{store-BPhjw5S8.d.ts → store-DM3Tk3Pw.d.ts} +874 -1283
  111. package/dist/{store-DNOOQEm8.d.cts → store-nbBybLWP.d.cts} +874 -1283
  112. package/dist/{test-helpers-BjyRYJZX.d.ts → test-helpers-CIq1Hhj1.d.ts} +5 -1
  113. package/dist/{test-helpers-NoQXhleQ.d.cts → test-helpers-DPRFVky4.d.cts} +5 -1
  114. package/dist/{types-D_3mEv2y.d.ts → types-BL1GyVku.d.cts} +2 -2
  115. package/dist/{types-DsRfx0yk.d.ts → types-Cdbi4hcx.d.ts} +228 -4
  116. package/dist/{types-BrSfFSpW.d.cts → types-DCGa53O2.d.ts} +2 -2
  117. package/dist/{types-aapj0GLz.d.cts → types-DDP0MGBF.d.cts} +228 -4
  118. package/dist/{types-CX4cLd7M.d.ts → types-DHRsi6j9.d.cts} +4 -3
  119. package/dist/types-DTJEu_-h.d.cts +158 -0
  120. package/dist/types-DTJEu_-h.d.ts +158 -0
  121. package/dist/{types-a5rAxC92.d.cts → types-ZT5mlism.d.ts} +4 -3
  122. package/package.json +17 -2
  123. package/dist/chunk-2FURVVAX.cjs +0 -350
  124. package/dist/chunk-2FURVVAX.cjs.map +0 -1
  125. package/dist/chunk-2QHQ2C4P.js.map +0 -1
  126. package/dist/chunk-4PIEL2VO.js.map +0 -1
  127. package/dist/chunk-DBFCKELK.cjs.map +0 -1
  128. package/dist/chunk-H7THXVH6.cjs +0 -314
  129. package/dist/chunk-H7THXVH6.cjs.map +0 -1
  130. package/dist/chunk-HXAPXPZH.cjs +0 -680
  131. package/dist/chunk-HXAPXPZH.cjs.map +0 -1
  132. package/dist/chunk-IIAT36MI.js.map +0 -1
  133. package/dist/chunk-JDAET5LO.js.map +0 -1
  134. package/dist/chunk-JKTO7TW3.js.map +0 -1
  135. package/dist/chunk-L642L24T.js.map +0 -1
  136. package/dist/chunk-MNO33ASC.cjs.map +0 -1
  137. package/dist/chunk-N4AOJ3VF.cjs.map +0 -1
  138. package/dist/chunk-QB3WBMDT.js +0 -646
  139. package/dist/chunk-QB3WBMDT.js.map +0 -1
  140. package/dist/chunk-SV5H3XM5.cjs.map +0 -1
  141. package/dist/chunk-UJAGXJDG.cjs.map +0 -1
  142. package/dist/chunk-X4EVMBON.js +0 -312
  143. package/dist/chunk-X4EVMBON.js.map +0 -1
  144. package/dist/chunk-XZL4NLV6.js +0 -348
  145. package/dist/chunk-XZL4NLV6.js.map +0 -1
  146. package/dist/chunk-YM5AL65Y.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/backend/types.ts","../src/backend/drizzle/row-mappers.ts","../src/backend/drizzle/operation-backend-core.ts","../src/backend/drizzle/operations/collections.ts","../src/backend/drizzle/operations/shared.ts","../src/backend/drizzle/operations/edges.ts","../src/backend/drizzle/operations/nodes.ts","../src/backend/drizzle/operations/schema.ts","../src/backend/drizzle/operations/uniques.ts","../src/backend/drizzle/operations/vectors.ts","../src/backend/drizzle/operations/strategy.ts","../src/backend/drizzle/vector-index.ts","../src/backend/drizzle/execution/types.ts"],"names":["nowIso","sql"],"mappings":"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","file":"chunk-4HARSV2G.js","sourcesContent":["/**\n * Backend interface types for TypeGraph storage.\n *\n * The backend abstracts database operations, allowing different\n * SQL implementations (SQLite, PostgreSQL) behind a common interface.\n */\nimport { type SQL } from \"drizzle-orm\";\n\nimport { type TemporalMode } from \"../core/types\";\nimport { type SqlTableNames } from \"../query/compiler/schema\";\nimport { type SerializedSchema } from \"../schema/types\";\n\n// ============================================================\n// Vector Search Types\n// ============================================================\n\n/**\n * Supported vector similarity metrics.\n */\nexport type VectorMetric = \"cosine\" | \"l2\" | \"inner_product\";\n\n/**\n * Supported vector index types.\n */\nexport type VectorIndexType = \"hnsw\" | \"ivfflat\" | \"none\";\n\n/**\n * Vector search capabilities.\n */\nexport type VectorCapabilities = Readonly<{\n /** Whether the backend supports vector operations */\n supported: boolean;\n /** Supported similarity metrics */\n metrics: readonly VectorMetric[];\n /** Supported index types */\n indexTypes: readonly VectorIndexType[];\n /** Maximum dimensions supported */\n maxDimensions: number;\n}>;\n\n// ============================================================\n// SQL Dialect & Capabilities\n// ============================================================\n\nimport { type SqlDialect } from \"../query/dialect/types\";\n\nexport type { SqlDialect } from \"../query/dialect/types\";\n\n/**\n * Backend capabilities that vary by dialect.\n */\nexport type BackendCapabilities = Readonly<{\n /** Whether the backend supports JSONB type (vs TEXT for JSON) */\n jsonb: boolean;\n /** Whether the backend supports partial indexes */\n partialIndexes: boolean;\n /** Whether the backend supports GIN indexes for JSON */\n ginIndexes: boolean;\n /** Whether the backend supports CTE (WITH) queries */\n cte: boolean;\n /** Whether the backend supports RETURNING clause */\n returning: boolean;\n /** Whether the backend supports atomic transactions (D1 does not) */\n transactions: boolean;\n /** Vector search capabilities (undefined if not configured) */\n vector?: VectorCapabilities | undefined;\n}>;\n\n// ============================================================\n// Row Types (Database Records)\n// ============================================================\n\n/**\n * A row from the typegraph_nodes table.\n */\nexport type NodeRow = Readonly<{\n graph_id: string;\n kind: string;\n id: string;\n props: string; // JSON 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 * A row from the typegraph_edges table.\n */\nexport type EdgeRow = Readonly<{\n graph_id: string;\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; // JSON 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 * A row from the typegraph_node_uniques table.\n */\nexport type UniqueRow = Readonly<{\n graph_id: string;\n node_kind: string;\n constraint_name: string;\n key: string;\n node_id: string;\n concrete_kind: string;\n deleted_at: string | undefined;\n}>;\n\n/**\n * A row from the typegraph_schema_versions table.\n */\nexport type SchemaVersionRow = Readonly<{\n graph_id: string;\n version: number;\n schema_hash: string;\n schema_doc: string; // JSON string\n created_at: string;\n is_active: boolean;\n}>;\n\n/**\n * A row from the typegraph_node_embeddings table.\n */\nexport type EmbeddingRow = Readonly<{\n graph_id: string;\n node_kind: string;\n node_id: string;\n field_path: string;\n embedding: readonly number[];\n dimensions: number;\n created_at: string;\n updated_at: string;\n}>;\n\n// ============================================================\n// Insert Parameters\n// ============================================================\n\n/**\n * Parameters for inserting a node.\n */\nexport type InsertNodeParams = Readonly<{\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validFrom?: string;\n validTo?: string;\n}>;\n\n/**\n * Parameters for updating a node.\n */\nexport type UpdateNodeParams = Readonly<{\n graphId: string;\n kind: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n incrementVersion?: boolean;\n /** If true, clears deleted_at (un-deletes the node). Used by upsert. */\n clearDeleted?: boolean;\n}>;\n\n/**\n * Parameters for deleting a node (soft delete).\n */\nexport type DeleteNodeParams = Readonly<{\n graphId: string;\n kind: string;\n id: string;\n}>;\n\n/**\n * Parameters for inserting an edge.\n */\nexport type InsertEdgeParams = Readonly<{\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\n/**\n * Parameters for updating an edge.\n */\nexport type UpdateEdgeParams = Readonly<{\n graphId: string;\n id: string;\n props: Record<string, unknown>;\n validTo?: string;\n clearDeleted?: boolean;\n}>;\n\n/**\n * Parameters for deleting an edge (soft delete).\n */\nexport type DeleteEdgeParams = Readonly<{\n graphId: string;\n id: string;\n}>;\n\n/**\n * Parameters for hard deleting a node (permanent removal).\n */\nexport type HardDeleteNodeParams = Readonly<{\n graphId: string;\n kind: string;\n id: string;\n}>;\n\n/**\n * Parameters for hard deleting an edge (permanent removal).\n */\nexport type HardDeleteEdgeParams = Readonly<{\n graphId: string;\n id: string;\n}>;\n\n// ============================================================\n// Embedding Parameters\n// ============================================================\n\n/**\n * Parameters for inserting or updating an embedding.\n */\nexport type UpsertEmbeddingParams = Readonly<{\n graphId: string;\n nodeKind: string;\n nodeId: string;\n fieldPath: string;\n embedding: readonly number[];\n dimensions: number;\n}>;\n\n/**\n * Parameters for deleting an embedding.\n */\nexport type DeleteEmbeddingParams = Readonly<{\n graphId: string;\n nodeKind: string;\n nodeId: string;\n fieldPath: string;\n}>;\n\n/**\n * Parameters for vector similarity search.\n */\nexport type VectorSearchParams = Readonly<{\n graphId: string;\n nodeKind: string;\n fieldPath: string;\n queryEmbedding: readonly number[];\n metric: VectorMetric;\n limit: number;\n minScore?: number;\n}>;\n\n/**\n * Result from a vector similarity search.\n */\nexport type VectorSearchResult = Readonly<{\n nodeId: string;\n /**\n * Cosine metric returns similarity score (higher is better).\n * L2 and inner_product return raw distance (lower is better).\n */\n score: number;\n}>;\n\n/**\n * Parameters for creating a vector index.\n */\nexport type CreateVectorIndexParams = Readonly<{\n graphId: string;\n nodeKind: string;\n fieldPath: string;\n dimensions: number;\n metric: VectorMetric;\n indexType: VectorIndexType;\n /** Index-specific parameters */\n indexParams?: Readonly<{\n /** HNSW: max connections per layer */\n m?: number;\n /** HNSW: construction search depth */\n efConstruction?: number;\n /** IVFFlat: number of lists */\n lists?: number;\n }>;\n}>;\n\n/**\n * Parameters for dropping a vector index.\n */\nexport type DropVectorIndexParams = Readonly<{\n graphId: string;\n nodeKind: string;\n fieldPath: string;\n}>;\n\n// ============================================================\n// Query Types\n// ============================================================\n\n/**\n * Transaction options.\n */\nexport type TransactionOptions = Readonly<{\n /** Transaction isolation level (if supported) */\n isolationLevel?:\n | \"read_uncommitted\"\n | \"read_committed\"\n | \"repeatable_read\"\n | \"serializable\";\n}>;\n\n// ============================================================\n// Backend Interface\n// ============================================================\n\n/**\n * Transaction backend - a backend scoped to a transaction.\n */\nexport type TransactionBackend = Omit<GraphBackend, \"transaction\" | \"close\">;\n\n/**\n * The GraphBackend interface abstracts database operations.\n *\n * Implementations should provide:\n * - SQLite backend via better-sqlite3 or libsql\n * - PostgreSQL backend via pg or postgres\n */\nexport type GraphBackend = Readonly<{\n /** The SQL dialect */\n dialect: SqlDialect;\n /** Backend capabilities */\n capabilities: BackendCapabilities;\n /** Table names used by this backend (for query schema auto-derivation) */\n tableNames?: SqlTableNames | undefined;\n\n // === Node Operations ===\n insertNode: (params: InsertNodeParams) => Promise<NodeRow>;\n insertNodeNoReturn?: (params: InsertNodeParams) => Promise<void>;\n insertNodesBatch?: (params: readonly InsertNodeParams[]) => Promise<void>;\n insertNodesBatchReturning?: (\n params: readonly InsertNodeParams[],\n ) => Promise<readonly NodeRow[]>;\n updateNode: (params: UpdateNodeParams) => Promise<NodeRow>;\n deleteNode: (params: DeleteNodeParams) => Promise<void>;\n hardDeleteNode: (params: HardDeleteNodeParams) => Promise<void>;\n getNode: (\n graphId: string,\n kind: string,\n id: string,\n ) => Promise<NodeRow | undefined>;\n getNodes?: (\n graphId: string,\n kind: string,\n ids: readonly string[],\n ) => Promise<readonly NodeRow[]>;\n\n // === Edge Operations ===\n insertEdge: (params: InsertEdgeParams) => Promise<EdgeRow>;\n insertEdgeNoReturn?: (params: InsertEdgeParams) => Promise<void>;\n insertEdgesBatch?: (params: readonly InsertEdgeParams[]) => Promise<void>;\n insertEdgesBatchReturning?: (\n params: readonly InsertEdgeParams[],\n ) => Promise<readonly EdgeRow[]>;\n updateEdge: (params: UpdateEdgeParams) => Promise<EdgeRow>;\n deleteEdge: (params: DeleteEdgeParams) => Promise<void>;\n hardDeleteEdge: (params: HardDeleteEdgeParams) => Promise<void>;\n getEdge: (graphId: string, id: string) => Promise<EdgeRow | undefined>;\n getEdges?: (\n graphId: string,\n ids: readonly string[],\n ) => Promise<readonly EdgeRow[]>;\n\n // === Edge Cardinality Operations ===\n countEdgesFrom: (params: CountEdgesFromParams) => Promise<number>;\n edgeExistsBetween: (params: EdgeExistsBetweenParams) => Promise<boolean>;\n\n // === Edge Query Operations ===\n findEdgesConnectedTo: (\n params: FindEdgesConnectedToParams,\n ) => Promise<readonly EdgeRow[]>;\n\n // === Collection Query Operations ===\n findNodesByKind: (\n params: FindNodesByKindParams,\n ) => Promise<readonly NodeRow[]>;\n countNodesByKind: (params: CountNodesByKindParams) => Promise<number>;\n findEdgesByKind: (\n params: FindEdgesByKindParams,\n ) => Promise<readonly EdgeRow[]>;\n countEdgesByKind: (params: CountEdgesByKindParams) => Promise<number>;\n\n // === Unique Constraint Operations ===\n insertUnique: (params: InsertUniqueParams) => Promise<void>;\n deleteUnique: (params: DeleteUniqueParams) => Promise<void>;\n checkUnique: (params: CheckUniqueParams) => Promise<UniqueRow | undefined>;\n\n // === Schema Operations ===\n getActiveSchema: (graphId: string) => Promise<SchemaVersionRow | undefined>;\n getSchemaVersion: (\n graphId: string,\n version: number,\n ) => Promise<SchemaVersionRow | undefined>;\n insertSchema: (params: InsertSchemaParams) => Promise<SchemaVersionRow>;\n setActiveSchema: (graphId: string, version: number) => Promise<void>;\n\n // === Embedding Operations (optional - depends on vector capabilities) ===\n upsertEmbedding?: (params: UpsertEmbeddingParams) => Promise<void>;\n deleteEmbedding?: (params: DeleteEmbeddingParams) => Promise<void>;\n getEmbedding?: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n fieldPath: string,\n ) => Promise<EmbeddingRow | undefined>;\n vectorSearch?: (\n params: VectorSearchParams,\n ) => Promise<readonly VectorSearchResult[]>;\n createVectorIndex?: (params: CreateVectorIndexParams) => Promise<void>;\n dropVectorIndex?: (params: DropVectorIndexParams) => Promise<void>;\n\n // === Query Execution ===\n execute: <T>(query: SQL) => Promise<readonly T[]>;\n\n /** Execute pre-compiled SQL text with bound parameters. Available on sync SQLite and pg backends. */\n executeRaw?: <T>(\n sqlText: string,\n params: readonly unknown[],\n ) => Promise<readonly T[]>;\n\n /** Compile a Drizzle SQL object to { sql, params } without executing. */\n compileSql?: (\n query: SQL,\n ) => Readonly<{ sql: string; params: readonly unknown[] }>;\n\n // === Transaction ===\n transaction: <T>(\n fn: (tx: TransactionBackend) => Promise<T>,\n options?: TransactionOptions,\n ) => Promise<T>;\n\n // === Lifecycle ===\n close: () => Promise<void>;\n}>;\n\n// ============================================================\n// Additional Parameter Types\n// ============================================================\n\n/**\n * Parameters for inserting a unique constraint entry.\n */\nexport type InsertUniqueParams = Readonly<{\n graphId: string;\n nodeKind: string;\n constraintName: string;\n key: string;\n nodeId: string;\n concreteKind: string;\n}>;\n\n/**\n * Parameters for deleting a unique constraint entry.\n */\nexport type DeleteUniqueParams = Readonly<{\n graphId: string;\n nodeKind: string;\n constraintName: string;\n key: string;\n}>;\n\n/**\n * Parameters for checking a unique constraint.\n */\nexport type CheckUniqueParams = Readonly<{\n graphId: string;\n nodeKind: string;\n constraintName: string;\n key: string;\n}>;\n\n/**\n * Parameters for inserting a schema version.\n */\nexport type InsertSchemaParams = Readonly<{\n graphId: string;\n version: number;\n schemaHash: string;\n schemaDoc: SerializedSchema;\n isActive: boolean;\n}>;\n\n/**\n * Parameters for counting edges from a source node.\n */\nexport type CountEdgesFromParams = Readonly<{\n graphId: string;\n edgeKind: string;\n fromKind: string;\n fromId: string;\n /** If true, only count edges where valid_to IS NULL */\n activeOnly?: boolean;\n}>;\n\n/**\n * Parameters for checking if an edge exists between two nodes.\n */\nexport type EdgeExistsBetweenParams = Readonly<{\n graphId: string;\n edgeKind: string;\n fromKind: string;\n fromId: string;\n toKind: string;\n toId: string;\n}>;\n\n/**\n * Parameters for finding edges connected to a node.\n */\nexport type FindEdgesConnectedToParams = Readonly<{\n graphId: string;\n nodeKind: string;\n nodeId: string;\n}>;\n\n/**\n * Parameters for finding nodes by kind.\n */\nexport type FindNodesByKindParams = Readonly<{\n graphId: string;\n kind: string;\n limit?: number;\n offset?: number;\n /** If true, exclude deleted nodes. Default true. */\n excludeDeleted?: boolean;\n /** Temporal mode for filtering by validity period. */\n temporalMode?: TemporalMode;\n /** Timestamp for \"current\" and \"asOf\" temporal modes. */\n asOf?: string;\n}>;\n\n/**\n * Parameters for counting nodes by kind.\n */\nexport type CountNodesByKindParams = Readonly<{\n graphId: string;\n kind: string;\n /** If true, exclude deleted nodes. Default true. */\n excludeDeleted?: boolean;\n /** Temporal mode for filtering by validity period. */\n temporalMode?: TemporalMode;\n /** Timestamp for \"current\" and \"asOf\" temporal modes. */\n asOf?: string;\n}>;\n\n/**\n * Parameters for finding edges by kind.\n */\nexport type FindEdgesByKindParams = Readonly<{\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 /** If true, exclude deleted edges. Default true. */\n excludeDeleted?: boolean;\n /** Temporal mode for filtering by validity period. */\n temporalMode?: TemporalMode;\n /** Timestamp for \"current\" and \"asOf\" temporal modes. */\n asOf?: string;\n}>;\n\n/**\n * Parameters for counting edges by kind.\n */\nexport type CountEdgesByKindParams = Readonly<{\n graphId: string;\n kind: string;\n fromKind?: string;\n fromId?: string;\n toKind?: string;\n toId?: string;\n /** If true, exclude deleted edges. Default true. */\n excludeDeleted?: boolean;\n /** Temporal mode for filtering by validity period. */\n temporalMode?: TemporalMode;\n /** Timestamp for \"current\" and \"asOf\" temporal modes. */\n asOf?: string;\n}>;\n\n// ============================================================\n// Default Capabilities\n// ============================================================\n\n/**\n * Default capabilities for SQLite.\n */\nexport const SQLITE_CAPABILITIES: BackendCapabilities = {\n jsonb: false, // SQLite uses TEXT with json functions\n partialIndexes: true, // SQLite supports WHERE in CREATE INDEX\n ginIndexes: false, // SQLite doesn't have GIN\n cte: true, // SQLite supports WITH\n returning: true, // SQLite 3.35+ supports RETURNING\n transactions: true, // SQLite supports transactions\n};\n\n/**\n * Default capabilities for PostgreSQL.\n */\nexport const POSTGRES_CAPABILITIES: BackendCapabilities = {\n jsonb: true, // PostgreSQL has native JSONB\n partialIndexes: true,\n ginIndexes: true,\n cte: true,\n returning: true,\n transactions: true, // PostgreSQL supports transactions\n};\n\n/**\n * Capabilities for Cloudflare D1.\n * D1 does NOT support atomic transactions - operations are auto-committed.\n */\nexport const D1_CAPABILITIES: BackendCapabilities = {\n jsonb: false, // D1 uses TEXT with json functions\n partialIndexes: true,\n ginIndexes: false,\n cte: true,\n returning: true,\n transactions: false, // D1 does NOT support atomic transactions\n};\n","/**\n * Shared row-mapping utilities for Drizzle backend adapters.\n */\n\nimport { DatabaseOperationError } from \"../../errors\";\nimport type { EdgeRow, NodeRow, SchemaVersionRow, UniqueRow } from \"../types\";\n\nfunction requireTimestamp(value: string | undefined, field: string): string {\n if (value === undefined) {\n throw new DatabaseOperationError(\n `Expected non-null ${field} timestamp`,\n { operation: \"select\", entity: \"row\" },\n );\n }\n return value;\n}\n\nexport function nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction nullToUndefined<T>(value: T | null): T | undefined {\n return value ?? undefined;\n}\n\n/**\n * Formats a PostgreSQL timestamp value to ISO string.\n * PostgreSQL returns Date objects or timestamp strings that need normalization.\n */\nexport function formatPostgresTimestamp(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n if (value instanceof Date) return value.toISOString();\n if (typeof value === \"string\") {\n if (value.includes(\"T\")) return value;\n const date = new Date(value);\n if (!Number.isNaN(date.getTime())) return date.toISOString();\n return value;\n }\n return undefined;\n}\n\n/**\n * Normalizes a JSON column that may be returned as a parsed object (JSONB) or string.\n */\nfunction normalizeJsonColumn(value: unknown): string {\n return typeof value === \"string\" ? value : JSON.stringify(value ?? {});\n}\n\n/**\n * Dialect-specific configuration for row mappers.\n *\n * Row mapper factories accept this config to produce dialect-appropriate\n * mappers. The `formatTimestamp` and `normalizeJson` functions handle\n * the differences between how SQLite and PostgreSQL return timestamps\n * and JSON columns.\n */\ntype DialectRowMapperConfig = Readonly<{\n formatTimestamp: (value: unknown) => string | undefined;\n normalizeJson: (value: unknown) => string;\n}>;\n\n/**\n * SQLite row mapper config.\n * Timestamps are stored as ISO strings; JSON is stored as TEXT.\n */\nexport const SQLITE_ROW_MAPPER_CONFIG: DialectRowMapperConfig = {\n formatTimestamp: (value) => nullToUndefined(value as string | null),\n normalizeJson: (value) => value as string,\n};\n\n/**\n * PostgreSQL row mapper config.\n * Timestamps may be Date objects or PG-format strings; JSONB is parsed objects.\n */\nexport const POSTGRES_ROW_MAPPER_CONFIG: DialectRowMapperConfig = {\n formatTimestamp: formatPostgresTimestamp,\n normalizeJson: normalizeJsonColumn,\n};\n\n// Trust boundary: Drizzle raw SQL returns Record<string, unknown> rows.\n// The field access patterns below are intentional unsafe casts at the\n// database driver boundary where we know the column shapes.\n\nexport function createNodeRowMapper(\n config: DialectRowMapperConfig,\n): (row: Record<string, unknown>) => NodeRow {\n return (row) => ({\n graph_id: row.graph_id as string,\n kind: row.kind as string,\n id: row.id as string,\n props: config.normalizeJson(row.props),\n version: row.version as number,\n valid_from: nullToUndefined(config.formatTimestamp(row.valid_from)),\n valid_to: nullToUndefined(config.formatTimestamp(row.valid_to)),\n created_at: requireTimestamp(config.formatTimestamp(row.created_at), \"created_at\"),\n updated_at: requireTimestamp(config.formatTimestamp(row.updated_at), \"updated_at\"),\n deleted_at: nullToUndefined(config.formatTimestamp(row.deleted_at)),\n });\n}\n\nexport function createEdgeRowMapper(\n config: DialectRowMapperConfig,\n): (row: Record<string, unknown>) => EdgeRow {\n return (row) => ({\n graph_id: row.graph_id as string,\n id: row.id as string,\n kind: row.kind as string,\n from_kind: row.from_kind as string,\n from_id: row.from_id as string,\n to_kind: row.to_kind as string,\n to_id: row.to_id as string,\n props: config.normalizeJson(row.props),\n valid_from: nullToUndefined(config.formatTimestamp(row.valid_from)),\n valid_to: nullToUndefined(config.formatTimestamp(row.valid_to)),\n created_at: requireTimestamp(config.formatTimestamp(row.created_at), \"created_at\"),\n updated_at: requireTimestamp(config.formatTimestamp(row.updated_at), \"updated_at\"),\n deleted_at: nullToUndefined(config.formatTimestamp(row.deleted_at)),\n });\n}\n\nexport function createUniqueRowMapper(\n config: DialectRowMapperConfig,\n): (row: Record<string, unknown>) => UniqueRow {\n return (row) => ({\n graph_id: row.graph_id as string,\n node_kind: row.node_kind as string,\n constraint_name: row.constraint_name as string,\n key: row.key as string,\n node_id: row.node_id as string,\n concrete_kind: row.concrete_kind as string,\n deleted_at: nullToUndefined(config.formatTimestamp(row.deleted_at)),\n });\n}\n\nexport function createSchemaVersionRowMapper(\n config: DialectRowMapperConfig,\n): (row: Record<string, unknown>) => SchemaVersionRow {\n return (row) => {\n const isActiveValue = row.is_active;\n const isActive =\n isActiveValue === true || isActiveValue === 1 || isActiveValue === \"1\";\n\n return {\n graph_id: row.graph_id as string,\n version: row.version as number,\n schema_hash: row.schema_hash as string,\n schema_doc: config.normalizeJson(row.schema_doc),\n created_at: requireTimestamp(config.formatTimestamp(row.created_at), \"created_at\"),\n is_active: isActive,\n };\n };\n}\n","import { type SQL } from \"drizzle-orm\";\n\nimport { DatabaseOperationError, UniquenessError } from \"../../errors\";\nimport type {\n CheckUniqueParams,\n CountEdgesByKindParams,\n CountEdgesFromParams,\n CountNodesByKindParams,\n DeleteEdgeParams,\n DeleteNodeParams,\n DeleteUniqueParams,\n EdgeExistsBetweenParams,\n EdgeRow,\n FindEdgesByKindParams,\n FindEdgesConnectedToParams,\n FindNodesByKindParams,\n HardDeleteEdgeParams,\n HardDeleteNodeParams,\n InsertEdgeParams,\n InsertNodeParams,\n InsertSchemaParams,\n InsertUniqueParams,\n NodeRow,\n SchemaVersionRow,\n TransactionBackend,\n UniqueRow,\n UpdateEdgeParams,\n UpdateNodeParams,\n} from \"../types\";\nimport { type CommonOperationStrategy } from \"./operations/strategy\";\nimport { nowIso as defaultNowIso } from \"./row-mappers\";\n\ntype CommonOperationBackend = Pick<\n TransactionBackend,\n | \"checkUnique\"\n | \"countEdgesByKind\"\n | \"countEdgesFrom\"\n | \"countNodesByKind\"\n | \"deleteEdge\"\n | \"deleteNode\"\n | \"deleteUnique\"\n | \"edgeExistsBetween\"\n | \"findEdgesByKind\"\n | \"findEdgesConnectedTo\"\n | \"findNodesByKind\"\n | \"getActiveSchema\"\n | \"getEdge\"\n | \"getEdges\"\n | \"getNode\"\n | \"getNodes\"\n | \"getSchemaVersion\"\n | \"hardDeleteEdge\"\n | \"hardDeleteNode\"\n | \"insertEdge\"\n | \"insertEdgeNoReturn\"\n | \"insertEdgesBatch\"\n | \"insertEdgesBatchReturning\"\n | \"insertNode\"\n | \"insertNodeNoReturn\"\n | \"insertNodesBatch\"\n | \"insertNodesBatchReturning\"\n | \"insertSchema\"\n | \"insertUnique\"\n | \"setActiveSchema\"\n | \"updateEdge\"\n | \"updateNode\"\n>;\n\ntype OperationBackendExecution = Readonly<{\n execAll: <TRow>(query: SQL) => Promise<readonly TRow[]>;\n execGet: <TRow>(query: SQL) => Promise<TRow | undefined>;\n execRun: (query: SQL) => Promise<void>;\n}>;\n\ntype OperationBackendBatchConfig = Readonly<{\n edgeInsertBatchSize: number;\n getEdgesChunkSize: number;\n getNodesChunkSize: number;\n nodeInsertBatchSize: number;\n}>;\n\ntype OperationBackendRowMappers = Readonly<{\n toEdgeRow: (row: Record<string, unknown>) => EdgeRow;\n toNodeRow: (row: Record<string, unknown>) => NodeRow;\n toSchemaVersionRow: (row: Record<string, unknown>) => SchemaVersionRow;\n toUniqueRow: (row: Record<string, unknown>) => UniqueRow;\n}>;\n\ntype CreateCommonOperationBackendOptions = Readonly<{\n batchConfig: OperationBackendBatchConfig;\n execution: OperationBackendExecution;\n nowIso?: (() => string) | undefined;\n operationStrategy: CommonOperationStrategy;\n rowMappers: OperationBackendRowMappers;\n}>;\n\nfunction chunkArray<T>(\n values: readonly T[],\n size: number,\n): readonly (readonly T[])[] {\n if (values.length <= size) {\n return [values];\n }\n\n const chunks: T[][] = [];\n for (let index = 0; index < values.length; index += size) {\n chunks.push(values.slice(index, index + size));\n }\n return chunks;\n}\n\nexport function createCommonOperationBackend(\n options: CreateCommonOperationBackendOptions,\n): CommonOperationBackend {\n const { batchConfig, execution, operationStrategy, rowMappers } = options;\n const nowIso = options.nowIso ?? defaultNowIso;\n\n return {\n async insertNode(params: InsertNodeParams): Promise<NodeRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertNode(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Insert node failed: no row returned\", { operation: \"insert\", entity: \"node\" });\n return rowMappers.toNodeRow(row);\n },\n\n async insertNodeNoReturn(params: InsertNodeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertNodeNoReturn(params, timestamp);\n await execution.execRun(query);\n },\n\n async insertNodesBatch(params: readonly InsertNodeParams[]): Promise<void> {\n if (params.length === 0) {\n return;\n }\n const timestamp = nowIso();\n for (const chunk of chunkArray(params, batchConfig.nodeInsertBatchSize)) {\n const query = operationStrategy.buildInsertNodesBatch(chunk, timestamp);\n await execution.execRun(query);\n }\n },\n\n async insertNodesBatchReturning(\n params: readonly InsertNodeParams[],\n ): Promise<readonly NodeRow[]> {\n if (params.length === 0) {\n return [];\n }\n const timestamp = nowIso();\n const allRows: NodeRow[] = [];\n for (const chunk of chunkArray(params, batchConfig.nodeInsertBatchSize)) {\n const query =\n operationStrategy.buildInsertNodesBatchReturning(chunk, timestamp);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toNodeRow(row)));\n }\n return allRows;\n },\n\n async getNode(\n graphId: string,\n kind: string,\n id: string,\n ): Promise<NodeRow | undefined> {\n const query = operationStrategy.buildGetNode(graphId, kind, id);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toNodeRow(row) : undefined;\n },\n\n async getNodes(\n graphId: string,\n kind: string,\n ids: readonly string[],\n ): Promise<readonly NodeRow[]> {\n if (ids.length === 0) return [];\n const allRows: NodeRow[] = [];\n for (const chunk of chunkArray(ids, batchConfig.getNodesChunkSize)) {\n const query = operationStrategy.buildGetNodes(graphId, kind, chunk);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toNodeRow(row)));\n }\n return allRows;\n },\n\n async updateNode(params: UpdateNodeParams): Promise<NodeRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildUpdateNode(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Update node failed: no row returned\", { operation: \"update\", entity: \"node\" });\n return rowMappers.toNodeRow(row);\n },\n\n async deleteNode(params: DeleteNodeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildDeleteNode(params, timestamp);\n await execution.execRun(query);\n },\n\n // IMPORTANT: This cascade is not atomic. Callers must ensure this runs\n // within a transaction to prevent partial deletion on intermediate failure.\n async hardDeleteNode(params: HardDeleteNodeParams): Promise<void> {\n const deleteUniquesQuery = operationStrategy.buildHardDeleteUniquesByNode(\n params.graphId,\n params.id,\n );\n await execution.execRun(deleteUniquesQuery);\n\n const deleteEmbeddingsQuery =\n operationStrategy.buildHardDeleteEmbeddingsByNode(\n params.graphId,\n params.kind,\n params.id,\n );\n await execution.execRun(deleteEmbeddingsQuery);\n\n const deleteEdgesQuery = operationStrategy.buildHardDeleteEdgesByNode(\n params.graphId,\n params.kind,\n params.id,\n );\n await execution.execRun(deleteEdgesQuery);\n\n const query = operationStrategy.buildHardDeleteNode(params);\n await execution.execRun(query);\n },\n\n async insertEdge(params: InsertEdgeParams): Promise<EdgeRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertEdge(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Insert edge failed: no row returned\", { operation: \"insert\", entity: \"edge\" });\n return rowMappers.toEdgeRow(row);\n },\n\n async insertEdgeNoReturn(params: InsertEdgeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertEdgeNoReturn(params, timestamp);\n await execution.execRun(query);\n },\n\n async insertEdgesBatch(params: readonly InsertEdgeParams[]): Promise<void> {\n if (params.length === 0) {\n return;\n }\n const timestamp = nowIso();\n for (const chunk of chunkArray(params, batchConfig.edgeInsertBatchSize)) {\n const query = operationStrategy.buildInsertEdgesBatch(chunk, timestamp);\n await execution.execRun(query);\n }\n },\n\n async insertEdgesBatchReturning(\n params: readonly InsertEdgeParams[],\n ): Promise<readonly EdgeRow[]> {\n if (params.length === 0) {\n return [];\n }\n const timestamp = nowIso();\n const allRows: EdgeRow[] = [];\n for (const chunk of chunkArray(params, batchConfig.edgeInsertBatchSize)) {\n const query =\n operationStrategy.buildInsertEdgesBatchReturning(chunk, timestamp);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toEdgeRow(row)));\n }\n return allRows;\n },\n\n async getEdge(graphId: string, id: string): Promise<EdgeRow | undefined> {\n const query = operationStrategy.buildGetEdge(graphId, id);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toEdgeRow(row) : undefined;\n },\n\n async getEdges(\n graphId: string,\n ids: readonly string[],\n ): Promise<readonly EdgeRow[]> {\n if (ids.length === 0) return [];\n const allRows: EdgeRow[] = [];\n for (const chunk of chunkArray(ids, batchConfig.getEdgesChunkSize)) {\n const query = operationStrategy.buildGetEdges(graphId, chunk);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toEdgeRow(row)));\n }\n return allRows;\n },\n\n async updateEdge(params: UpdateEdgeParams): Promise<EdgeRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildUpdateEdge(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Update edge failed: no row returned\", { operation: \"update\", entity: \"edge\" });\n return rowMappers.toEdgeRow(row);\n },\n\n async deleteEdge(params: DeleteEdgeParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildDeleteEdge(params, timestamp);\n await execution.execRun(query);\n },\n\n async hardDeleteEdge(params: HardDeleteEdgeParams): Promise<void> {\n const query = operationStrategy.buildHardDeleteEdge(params);\n await execution.execRun(query);\n },\n\n async countEdgesFrom(params: CountEdgesFromParams): Promise<number> {\n const query = operationStrategy.buildCountEdgesFrom(params);\n const row = await execution.execGet<{ count: string | number }>(query);\n return Number(row?.count ?? 0);\n },\n\n async edgeExistsBetween(params: EdgeExistsBetweenParams): Promise<boolean> {\n const query = operationStrategy.buildEdgeExistsBetween(params);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row !== undefined;\n },\n\n async findEdgesConnectedTo(\n params: FindEdgesConnectedToParams,\n ): Promise<readonly EdgeRow[]> {\n const query = operationStrategy.buildFindEdgesConnectedTo(params);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n return rows.map((row) => rowMappers.toEdgeRow(row));\n },\n\n async findNodesByKind(\n params: FindNodesByKindParams,\n ): Promise<readonly NodeRow[]> {\n const query = operationStrategy.buildFindNodesByKind(params);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n return rows.map((row) => rowMappers.toNodeRow(row));\n },\n\n async countNodesByKind(params: CountNodesByKindParams): Promise<number> {\n const query = operationStrategy.buildCountNodesByKind(params);\n const row = await execution.execGet<{ count: string | number }>(query);\n return Number(row?.count ?? 0);\n },\n\n async findEdgesByKind(\n params: FindEdgesByKindParams,\n ): Promise<readonly EdgeRow[]> {\n const query = operationStrategy.buildFindEdgesByKind(params);\n const rows = await execution.execAll<Record<string, unknown>>(query);\n return rows.map((row) => rowMappers.toEdgeRow(row));\n },\n\n async countEdgesByKind(params: CountEdgesByKindParams): Promise<number> {\n const query = operationStrategy.buildCountEdgesByKind(params);\n const row = await execution.execGet<{ count: string | number }>(query);\n return Number(row?.count ?? 0);\n },\n\n async insertUnique(params: InsertUniqueParams): Promise<void> {\n const query = operationStrategy.buildInsertUnique(params);\n const result = await execution.execGet<{ node_id: string }>(query);\n\n if (result && result.node_id !== params.nodeId) {\n throw new UniquenessError({\n constraintName: params.constraintName,\n kind: params.nodeKind,\n existingId: result.node_id,\n newId: params.nodeId,\n fields: [],\n });\n }\n },\n\n async deleteUnique(params: DeleteUniqueParams): Promise<void> {\n const timestamp = nowIso();\n const query = operationStrategy.buildDeleteUnique(params, timestamp);\n await execution.execRun(query);\n },\n\n async checkUnique(\n params: CheckUniqueParams,\n ): Promise<UniqueRow | undefined> {\n const query = operationStrategy.buildCheckUnique(params);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toUniqueRow(row) : undefined;\n },\n\n async getActiveSchema(\n graphId: string,\n ): Promise<SchemaVersionRow | undefined> {\n const query = operationStrategy.buildGetActiveSchema(graphId);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toSchemaVersionRow(row) : undefined;\n },\n\n async insertSchema(params: InsertSchemaParams): Promise<SchemaVersionRow> {\n const timestamp = nowIso();\n const query = operationStrategy.buildInsertSchema(params, timestamp);\n const row = await execution.execGet<Record<string, unknown>>(query);\n if (!row) throw new DatabaseOperationError(\"Insert schema failed: no row returned\", { operation: \"insert\", entity: \"schema\" });\n return rowMappers.toSchemaVersionRow(row);\n },\n\n async getSchemaVersion(\n graphId: string,\n version: number,\n ): Promise<SchemaVersionRow | undefined> {\n const query = operationStrategy.buildGetSchemaVersion(graphId, version);\n const row = await execution.execGet<Record<string, unknown>>(query);\n return row ? rowMappers.toSchemaVersionRow(row) : undefined;\n },\n\n async setActiveSchema(graphId: string, version: number): Promise<void> {\n const queries = operationStrategy.buildSetActiveSchema(graphId, version);\n await execution.execRun(queries.deactivateAll);\n await execution.execRun(queries.activateVersion);\n },\n };\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type {\n CountEdgesByKindParams,\n CountNodesByKindParams,\n FindEdgesByKindParams,\n FindNodesByKindParams,\n} from \"../../types\";\nimport type { Tables } from \"./shared\";\n\n/**\n * Builds temporal and soft-delete SQL conditions.\n *\n * - `includeTombstones`: no filtering at all (overrides excludeDeleted)\n * - `current` / `asOf`: exclude deleted + filter by validity range\n * - `includeEnded`: exclude deleted only\n * - no temporalMode: just apply excludeDeleted (backward-compatible)\n */\nfunction buildTemporalConditions(\n table: Pick<Tables[\"nodes\"], \"deletedAt\" | \"validFrom\" | \"validTo\">,\n params: Readonly<{\n temporalMode?: string;\n asOf?: string;\n excludeDeleted?: boolean;\n }>,\n): SQL[] {\n const conditions: SQL[] = [];\n const mode = params.temporalMode;\n\n if (mode === \"includeTombstones\") return conditions;\n\n if (params.excludeDeleted !== false) {\n conditions.push(sql`${table.deletedAt} IS NULL`);\n }\n\n if (mode === \"current\" || mode === \"asOf\") {\n const asOf = params.asOf!;\n conditions.push(\n sql`(${table.validFrom} IS NULL OR ${table.validFrom} <= ${asOf})`,\n sql`(${table.validTo} IS NULL OR ${table.validTo} > ${asOf})`,\n );\n }\n\n return conditions;\n}\n\n/**\n * Builds a query to find nodes by kind.\n */\nexport function buildFindNodesByKind(\n tables: Tables,\n params: FindNodesByKindParams,\n): SQL {\n const { nodes } = tables;\n\n const conditions: SQL[] = [\n sql`${nodes.graphId} = ${params.graphId}`,\n sql`${nodes.kind} = ${params.kind}`,\n ...buildTemporalConditions(nodes, params),\n ];\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n if (params.limit !== undefined && params.offset !== undefined) {\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${whereClause}\n ORDER BY ${nodes.createdAt} DESC\n LIMIT ${params.limit} OFFSET ${params.offset}\n `;\n }\n\n if (params.limit !== undefined) {\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${whereClause}\n ORDER BY ${nodes.createdAt} DESC\n LIMIT ${params.limit}\n `;\n }\n\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${whereClause}\n ORDER BY ${nodes.createdAt} DESC\n `;\n}\n\n/**\n * Builds a query to count nodes by kind.\n */\nexport function buildCountNodesByKind(\n tables: Tables,\n params: CountNodesByKindParams,\n): SQL {\n const { nodes } = tables;\n\n const conditions: SQL[] = [\n sql`${nodes.graphId} = ${params.graphId}`,\n sql`${nodes.kind} = ${params.kind}`,\n ...buildTemporalConditions(nodes, params),\n ];\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n return sql`\n SELECT COUNT(*) as count FROM ${nodes}\n WHERE ${whereClause}\n `;\n}\n\n/**\n * Builds a query to find edges by kind with optional endpoint filters.\n */\nexport function buildFindEdgesByKind(\n tables: Tables,\n params: FindEdgesByKindParams,\n): SQL {\n const { edges } = tables;\n\n const conditions: SQL[] = [\n sql`${edges.graphId} = ${params.graphId}`,\n sql`${edges.kind} = ${params.kind}`,\n ...buildTemporalConditions(edges, params),\n ];\n\n if (params.fromKind !== undefined) {\n conditions.push(sql`${edges.fromKind} = ${params.fromKind}`);\n }\n\n if (params.fromId !== undefined) {\n conditions.push(sql`${edges.fromId} = ${params.fromId}`);\n }\n\n if (params.toKind !== undefined) {\n conditions.push(sql`${edges.toKind} = ${params.toKind}`);\n }\n\n if (params.toId !== undefined) {\n conditions.push(sql`${edges.toId} = ${params.toId}`);\n }\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n if (params.limit !== undefined && params.offset !== undefined) {\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${edges.createdAt} DESC\n LIMIT ${params.limit} OFFSET ${params.offset}\n `;\n }\n\n if (params.limit !== undefined) {\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${edges.createdAt} DESC\n LIMIT ${params.limit}\n `;\n }\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${whereClause}\n ORDER BY ${edges.createdAt} DESC\n `;\n}\n\n/**\n * Builds a query to count edges by kind with optional endpoint filters.\n */\nexport function buildCountEdgesByKind(\n tables: Tables,\n params: CountEdgesByKindParams,\n): SQL {\n const { edges } = tables;\n\n const conditions: SQL[] = [\n sql`${edges.graphId} = ${params.graphId}`,\n sql`${edges.kind} = ${params.kind}`,\n ...buildTemporalConditions(edges, params),\n ];\n\n if (params.fromKind !== undefined) {\n conditions.push(sql`${edges.fromKind} = ${params.fromKind}`);\n }\n\n if (params.fromId !== undefined) {\n conditions.push(sql`${edges.fromId} = ${params.fromId}`);\n }\n\n if (params.toKind !== undefined) {\n conditions.push(sql`${edges.toKind} = ${params.toKind}`);\n }\n\n if (params.toId !== undefined) {\n conditions.push(sql`${edges.toId} = ${params.toId}`);\n }\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n return sql`\n SELECT COUNT(*) as count FROM ${edges}\n WHERE ${whereClause}\n `;\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type { PostgresTables } from \"../schema/postgres\";\nimport type { SqliteTables } from \"../schema/sqlite\";\n\nexport type Tables = SqliteTables | PostgresTables;\n\n/**\n * Converts undefined to SQL NULL for use in template literals.\n * Drizzle doesn't handle undefined in sql`` templates correctly.\n */\nexport function sqlNull(value: string | undefined): SQL | string {\n return value ?? sql.raw(\"NULL\");\n}\n\nexport function quotedColumn(column: { name: string }): SQL {\n return sql.raw(`\"${column.name.replaceAll('\"', '\"\"')}\"`);\n}\n\nexport function nodeColumnList(nodes: Tables[\"nodes\"]): SQL {\n return sql.raw(`\"${nodes.graphId.name}\", \"${nodes.kind.name}\", \"${nodes.id.name}\", \"${nodes.props.name}\", \"${nodes.version.name}\", \"${nodes.validFrom.name}\", \"${nodes.validTo.name}\", \"${nodes.createdAt.name}\", \"${nodes.updatedAt.name}\"`);\n}\n\nexport function edgeColumnList(edges: Tables[\"edges\"]): SQL {\n return sql.raw(`\"${edges.graphId.name}\", \"${edges.id.name}\", \"${edges.kind.name}\", \"${edges.fromKind.name}\", \"${edges.fromId.name}\", \"${edges.toKind.name}\", \"${edges.toId.name}\", \"${edges.props.name}\", \"${edges.validFrom.name}\", \"${edges.validTo.name}\", \"${edges.createdAt.name}\", \"${edges.updatedAt.name}\"`);\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type {\n CountEdgesFromParams,\n DeleteEdgeParams,\n EdgeExistsBetweenParams,\n FindEdgesConnectedToParams,\n HardDeleteEdgeParams,\n InsertEdgeParams,\n UpdateEdgeParams,\n} from \"../../types\";\nimport {\n edgeColumnList,\n quotedColumn,\n sqlNull,\n type Tables,\n} from \"./shared\";\n\n/**\n * Builds an INSERT query for an edge.\n * Uses raw column names in the column list (required by SQL syntax).\n */\nexport function buildInsertEdge(\n tables: Tables,\n params: InsertEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const propsJson = JSON.stringify(params.props);\n const columns = edgeColumnList(edges);\n\n return sql`\n INSERT INTO ${edges} (${columns})\n VALUES (\n ${params.graphId}, ${params.id}, ${params.kind},\n ${params.fromKind}, ${params.fromId}, ${params.toKind}, ${params.toId},\n ${propsJson}, ${sqlNull(params.validFrom)}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds an INSERT query for an edge without RETURNING payload.\n */\nexport function buildInsertEdgeNoReturn(\n tables: Tables,\n params: InsertEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const propsJson = JSON.stringify(params.props);\n const columns = edgeColumnList(edges);\n\n return sql`\n INSERT INTO ${edges} (${columns})\n VALUES (\n ${params.graphId}, ${params.id}, ${params.kind},\n ${params.fromKind}, ${params.fromId}, ${params.toKind}, ${params.toId},\n ${propsJson}, ${sqlNull(params.validFrom)}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n `;\n}\n\n/**\n * Builds a batched INSERT query for edges without RETURNING payload.\n */\nexport function buildInsertEdgesBatch(\n tables: Tables,\n params: readonly InsertEdgeParams[],\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const columns = edgeColumnList(edges);\n const values = params.map((edgeParams) => {\n const propsJson = JSON.stringify(edgeParams.props);\n return sql`(${edgeParams.graphId}, ${edgeParams.id}, ${edgeParams.kind}, ${edgeParams.fromKind}, ${edgeParams.fromId}, ${edgeParams.toKind}, ${edgeParams.toId}, ${propsJson}, ${sqlNull(edgeParams.validFrom)}, ${sqlNull(edgeParams.validTo)}, ${timestamp}, ${timestamp})`;\n });\n\n return sql`\n INSERT INTO ${edges} (${columns})\n VALUES ${sql.join(values, sql`, `)}\n `;\n}\n\n/**\n * Builds a batched INSERT query for edges with RETURNING *.\n */\nexport function buildInsertEdgesBatchReturning(\n tables: Tables,\n params: readonly InsertEdgeParams[],\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const columns = edgeColumnList(edges);\n const values = params.map((edgeParams) => {\n const propsJson = JSON.stringify(edgeParams.props);\n return sql`(${edgeParams.graphId}, ${edgeParams.id}, ${edgeParams.kind}, ${edgeParams.fromKind}, ${edgeParams.fromId}, ${edgeParams.toKind}, ${edgeParams.toId}, ${propsJson}, ${sqlNull(edgeParams.validFrom)}, ${sqlNull(edgeParams.validTo)}, ${timestamp}, ${timestamp})`;\n });\n\n return sql`\n INSERT INTO ${edges} (${columns})\n VALUES ${sql.join(values, sql`, `)}\n RETURNING *\n `;\n}\n\n/**\n * Builds a SELECT query to get an edge by id.\n * Returns the edge regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetEdge(\n tables: Tables,\n graphId: string,\n id: string,\n): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${graphId}\n AND ${edges.id} = ${id}\n `;\n}\n\n/**\n * Builds a SELECT query to get multiple edges by ids.\n * Returns edges regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetEdges(\n tables: Tables,\n graphId: string,\n ids: readonly string[],\n): SQL {\n const { edges } = tables;\n const idPlaceholders = sql.join(\n ids.map((edgeId) => sql`${edgeId}`),\n sql`, `,\n );\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${graphId}\n AND ${edges.id} IN (${idPlaceholders})\n `;\n}\n\n/**\n * Builds an UPDATE query for an edge.\n * Uses raw column names in SET clause.\n */\nexport function buildUpdateEdge(\n tables: Tables,\n params: UpdateEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n const propsJson = JSON.stringify(params.props);\n\n const setParts: SQL[] = [\n sql`${quotedColumn(edges.props)} = ${propsJson}`,\n sql`${quotedColumn(edges.updatedAt)} = ${timestamp}`,\n ];\n\n if (params.validTo !== undefined) {\n setParts.push(sql`${quotedColumn(edges.validTo)} = ${params.validTo}`);\n }\n\n if (params.clearDeleted) {\n setParts.push(sql`${quotedColumn(edges.deletedAt)} = NULL`);\n }\n\n const setClause = sql.join(setParts, sql`, `);\n\n if (params.clearDeleted) {\n return sql`\n UPDATE ${edges}\n SET ${setClause}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n RETURNING *\n `;\n }\n\n return sql`\n UPDATE ${edges}\n SET ${setClause}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n AND ${edges.deletedAt} IS NULL\n RETURNING *\n `;\n}\n\n/**\n * Builds a soft DELETE query for an edge (sets deleted_at).\n * Uses raw column name in SET clause.\n */\nexport function buildDeleteEdge(\n tables: Tables,\n params: DeleteEdgeParams,\n timestamp: string,\n): SQL {\n const { edges } = tables;\n\n return sql`\n UPDATE ${edges}\n SET ${quotedColumn(edges.deletedAt)} = ${timestamp}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n AND ${edges.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a hard DELETE query for an edge (permanent removal).\n */\nexport function buildHardDeleteEdge(\n tables: Tables,\n params: HardDeleteEdgeParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n DELETE FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.id} = ${params.id}\n `;\n}\n\n/**\n * Builds a hard DELETE query for all edges connected to a node (permanent removal).\n * Deletes edges where the node appears as either source or target.\n */\nexport function buildHardDeleteEdgesByNode(\n tables: Tables,\n graphId: string,\n nodeKind: string,\n nodeId: string,\n): SQL {\n const { edges } = tables;\n\n return sql`\n DELETE FROM ${edges}\n WHERE ${edges.graphId} = ${graphId}\n AND (\n (${edges.fromKind} = ${nodeKind} AND ${edges.fromId} = ${nodeId})\n OR (${edges.toKind} = ${nodeKind} AND ${edges.toId} = ${nodeId})\n )\n `;\n}\n\n/**\n * Builds a query to count edges from a source node.\n */\nexport function buildCountEdgesFrom(\n tables: Tables,\n params: CountEdgesFromParams,\n): SQL {\n const { edges } = tables;\n\n if (params.activeOnly) {\n return sql`\n SELECT COUNT(*) as count FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.kind} = ${params.edgeKind}\n AND ${edges.fromKind} = ${params.fromKind}\n AND ${edges.fromId} = ${params.fromId}\n AND ${edges.deletedAt} IS NULL\n AND ${edges.validTo} IS NULL\n `;\n }\n\n return sql`\n SELECT COUNT(*) as count FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.kind} = ${params.edgeKind}\n AND ${edges.fromKind} = ${params.fromKind}\n AND ${edges.fromId} = ${params.fromId}\n AND ${edges.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a query to check if an edge exists between two nodes.\n */\nexport function buildEdgeExistsBetween(\n tables: Tables,\n params: EdgeExistsBetweenParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT 1 FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.kind} = ${params.edgeKind}\n AND ${edges.fromKind} = ${params.fromKind}\n AND ${edges.fromId} = ${params.fromId}\n AND ${edges.toKind} = ${params.toKind}\n AND ${edges.toId} = ${params.toId}\n AND ${edges.deletedAt} IS NULL\n LIMIT 1\n `;\n}\n\n/**\n * Builds a query to find all edges connected to a node.\n */\nexport function buildFindEdgesConnectedTo(\n tables: Tables,\n params: FindEdgesConnectedToParams,\n): SQL {\n const { edges } = tables;\n\n return sql`\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.deletedAt} IS NULL\n AND ${edges.fromKind} = ${params.nodeKind}\n AND ${edges.fromId} = ${params.nodeId}\n UNION ALL\n SELECT * FROM ${edges}\n WHERE ${edges.graphId} = ${params.graphId}\n AND ${edges.deletedAt} IS NULL\n AND ${edges.toKind} = ${params.nodeKind}\n AND ${edges.toId} = ${params.nodeId}\n AND NOT (\n ${edges.fromKind} = ${params.nodeKind}\n AND ${edges.fromId} = ${params.nodeId}\n )\n `;\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type {\n DeleteNodeParams,\n HardDeleteNodeParams,\n InsertNodeParams,\n UpdateNodeParams,\n} from \"../../types\";\nimport {\n nodeColumnList,\n quotedColumn,\n sqlNull,\n type Tables,\n} from \"./shared\";\n\n/**\n * Builds an INSERT query for a node.\n * Uses raw column names in the column list (required by SQL syntax).\n */\nexport function buildInsertNode(\n tables: Tables,\n params: InsertNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const propsJson = JSON.stringify(params.props);\n const columns = nodeColumnList(nodes);\n\n return sql`\n INSERT INTO ${nodes} (${columns})\n VALUES (\n ${params.graphId}, ${params.kind}, ${params.id}, ${propsJson},\n 1, ${sqlNull(params.validFrom)}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds an INSERT query for a node without RETURNING payload.\n */\nexport function buildInsertNodeNoReturn(\n tables: Tables,\n params: InsertNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const propsJson = JSON.stringify(params.props);\n const columns = nodeColumnList(nodes);\n\n return sql`\n INSERT INTO ${nodes} (${columns})\n VALUES (\n ${params.graphId}, ${params.kind}, ${params.id}, ${propsJson},\n 1, ${sqlNull(params.validFrom)}, ${sqlNull(params.validTo)},\n ${timestamp}, ${timestamp}\n )\n `;\n}\n\n/**\n * Builds a batched INSERT query for nodes without RETURNING payload.\n */\nexport function buildInsertNodesBatch(\n tables: Tables,\n params: readonly InsertNodeParams[],\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const columns = nodeColumnList(nodes);\n const values = params.map((nodeParams) => {\n const propsJson = JSON.stringify(nodeParams.props);\n return sql`(${nodeParams.graphId}, ${nodeParams.kind}, ${nodeParams.id}, ${propsJson}, 1, ${sqlNull(nodeParams.validFrom)}, ${sqlNull(nodeParams.validTo)}, ${timestamp}, ${timestamp})`;\n });\n\n return sql`\n INSERT INTO ${nodes} (${columns})\n VALUES ${sql.join(values, sql`, `)}\n `;\n}\n\n/**\n * Builds a batched INSERT query for nodes with RETURNING *.\n */\nexport function buildInsertNodesBatchReturning(\n tables: Tables,\n params: readonly InsertNodeParams[],\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const columns = nodeColumnList(nodes);\n const values = params.map((nodeParams) => {\n const propsJson = JSON.stringify(nodeParams.props);\n return sql`(${nodeParams.graphId}, ${nodeParams.kind}, ${nodeParams.id}, ${propsJson}, 1, ${sqlNull(nodeParams.validFrom)}, ${sqlNull(nodeParams.validTo)}, ${timestamp}, ${timestamp})`;\n });\n\n return sql`\n INSERT INTO ${nodes} (${columns})\n VALUES ${sql.join(values, sql`, `)}\n RETURNING *\n `;\n}\n\n/**\n * Builds a SELECT query to get a node by kind and id.\n * Returns the node regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetNode(\n tables: Tables,\n graphId: string,\n kind: string,\n id: string,\n): SQL {\n const { nodes } = tables;\n\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${nodes.graphId} = ${graphId}\n AND ${nodes.kind} = ${kind}\n AND ${nodes.id} = ${id}\n `;\n}\n\n/**\n * Builds a SELECT query to get multiple nodes by kind and ids.\n * Returns nodes regardless of deletion status (store layer handles filtering).\n */\nexport function buildGetNodes(\n tables: Tables,\n graphId: string,\n kind: string,\n ids: readonly string[],\n): SQL {\n const { nodes } = tables;\n const idPlaceholders = sql.join(\n ids.map((nodeId) => sql`${nodeId}`),\n sql`, `,\n );\n\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${nodes.graphId} = ${graphId}\n AND ${nodes.kind} = ${kind}\n AND ${nodes.id} IN (${idPlaceholders})\n `;\n}\n\n/**\n * Builds an UPDATE query for a node.\n * Uses raw column names in SET clause (required by SQL syntax).\n */\nexport function buildUpdateNode(\n tables: Tables,\n params: UpdateNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n const propsJson = JSON.stringify(params.props);\n\n const setParts: SQL[] = [\n sql`${quotedColumn(nodes.props)} = ${propsJson}`,\n sql`${quotedColumn(nodes.updatedAt)} = ${timestamp}`,\n ];\n\n if (params.incrementVersion) {\n setParts.push(\n sql`${quotedColumn(nodes.version)} = ${quotedColumn(nodes.version)} + 1`,\n );\n }\n\n if (params.validTo !== undefined) {\n setParts.push(sql`${quotedColumn(nodes.validTo)} = ${params.validTo}`);\n }\n\n if (params.clearDeleted) {\n setParts.push(sql`${quotedColumn(nodes.deletedAt)} = NULL`);\n }\n\n const setClause = sql.join(setParts, sql`, `);\n\n if (params.clearDeleted) {\n return sql`\n UPDATE ${nodes}\n SET ${setClause}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n RETURNING *\n `;\n }\n\n return sql`\n UPDATE ${nodes}\n SET ${setClause}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n AND ${nodes.deletedAt} IS NULL\n RETURNING *\n `;\n}\n\n/**\n * Builds a soft DELETE query for a node (sets deleted_at).\n * Uses raw column name in SET clause.\n */\nexport function buildDeleteNode(\n tables: Tables,\n params: DeleteNodeParams,\n timestamp: string,\n): SQL {\n const { nodes } = tables;\n\n return sql`\n UPDATE ${nodes}\n SET ${quotedColumn(nodes.deletedAt)} = ${timestamp}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n AND ${nodes.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a hard DELETE query for a node (permanent removal).\n */\nexport function buildHardDeleteNode(\n tables: Tables,\n params: HardDeleteNodeParams,\n): SQL {\n const { nodes } = tables;\n\n return sql`\n DELETE FROM ${nodes}\n WHERE ${nodes.graphId} = ${params.graphId}\n AND ${nodes.kind} = ${params.kind}\n AND ${nodes.id} = ${params.id}\n `;\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type { InsertSchemaParams,SqlDialect } from \"../../types\";\nimport { quotedColumn, type Tables } from \"./shared\";\n\ntype SchemaDialectStrategy = Readonly<{\n booleanLiteral: (value: boolean) => SQL;\n}>;\n\nfunction createSchemaDialectStrategy(dialect: SqlDialect): SchemaDialectStrategy {\n const trueLiteral = dialect === \"sqlite\" ? sql.raw(\"1\") : sql.raw(\"TRUE\");\n const falseLiteral = dialect === \"sqlite\" ? sql.raw(\"0\") : sql.raw(\"FALSE\");\n\n return {\n booleanLiteral(value: boolean): SQL {\n return value ? trueLiteral : falseLiteral;\n },\n };\n}\n\nconst SCHEMA_DIALECT_STRATEGIES: Record<SqlDialect, SchemaDialectStrategy> = {\n postgres: createSchemaDialectStrategy(\"postgres\"),\n sqlite: createSchemaDialectStrategy(\"sqlite\"),\n};\n\n/**\n * Builds an INSERT query for a schema version.\n * Uses raw column names in the column list (required by SQL syntax).\n */\nexport function buildInsertSchema(\n tables: Tables,\n params: InsertSchemaParams,\n timestamp: string,\n dialect: SqlDialect = \"sqlite\",\n): SQL {\n const { schemaVersions } = tables;\n const strategy = SCHEMA_DIALECT_STRATEGIES[dialect];\n const schemaDocumentJson = JSON.stringify(params.schemaDoc);\n const isActiveValue = strategy.booleanLiteral(params.isActive);\n\n const columns = sql.raw(`\"${schemaVersions.graphId.name}\", \"${schemaVersions.version.name}\", \"${schemaVersions.schemaHash.name}\", \"${schemaVersions.schemaDoc.name}\", \"${schemaVersions.createdAt.name}\", \"${schemaVersions.isActive.name}\"`);\n\n return sql`\n INSERT INTO ${schemaVersions} (${columns})\n VALUES (\n ${params.graphId}, ${params.version},\n ${params.schemaHash}, ${schemaDocumentJson},\n ${timestamp}, ${isActiveValue}\n )\n RETURNING *\n `;\n}\n\n/**\n * Builds a SELECT query to get the active schema for a graph.\n */\nexport function buildGetActiveSchema(\n tables: Tables,\n graphId: string,\n dialect: SqlDialect = \"sqlite\",\n): SQL {\n const { schemaVersions } = tables;\n const strategy = SCHEMA_DIALECT_STRATEGIES[dialect];\n\n return sql`\n SELECT * FROM ${schemaVersions}\n WHERE ${schemaVersions.graphId} = ${graphId}\n AND ${schemaVersions.isActive} = ${strategy.booleanLiteral(true)}\n `;\n}\n\n/**\n * Builds a SELECT query to get a specific schema version.\n */\nexport function buildGetSchemaVersion(\n tables: Tables,\n graphId: string,\n version: number,\n): SQL {\n const { schemaVersions } = tables;\n\n return sql`\n SELECT * FROM ${schemaVersions}\n WHERE ${schemaVersions.graphId} = ${graphId}\n AND ${schemaVersions.version} = ${version}\n `;\n}\n\n/**\n * Builds UPDATE queries to set the active schema version.\n * Returns two queries: first deactivates all, second activates the specified version.\n * Uses raw column names in SET clause (SQLite doesn't allow table prefix there).\n */\nexport function buildSetActiveSchema(\n tables: Tables,\n graphId: string,\n version: number,\n dialect: SqlDialect = \"sqlite\",\n): { deactivateAll: SQL; activateVersion: SQL } {\n const { schemaVersions } = tables;\n const strategy = SCHEMA_DIALECT_STRATEGIES[dialect];\n\n const deactivateAll = sql`\n UPDATE ${schemaVersions}\n SET ${quotedColumn(schemaVersions.isActive)} = ${strategy.booleanLiteral(false)}\n WHERE ${schemaVersions.graphId} = ${graphId}\n `;\n\n const activateVersion = sql`\n UPDATE ${schemaVersions}\n SET ${quotedColumn(schemaVersions.isActive)} = ${strategy.booleanLiteral(true)}\n WHERE ${schemaVersions.graphId} = ${graphId}\n AND ${schemaVersions.version} = ${version}\n `;\n\n return { deactivateAll, activateVersion };\n}\n","import { getTableName, type SQL, sql } from \"drizzle-orm\";\n\nimport type {\n CheckUniqueParams,\n DeleteUniqueParams,\n InsertUniqueParams,\n SqlDialect,\n} from \"../../types\";\nimport { quotedColumn, type Tables } from \"./shared\";\n\ntype InsertUniqueDialectBuilder = (\n tables: Tables,\n params: InsertUniqueParams,\n) => SQL;\n\n/**\n * Builds an INSERT query for a uniqueness entry (SQLite).\n *\n * Uses ON CONFLICT with a conditional update that only succeeds if:\n * 1. The existing entry belongs to the same node (safe update), OR\n * 2. The existing entry is soft-deleted (can be reused)\n *\n * If a different live node holds this key, the conflict handler leaves the\n * row unchanged, and RETURNING will show the conflicting node_id.\n */\nfunction buildInsertUniqueSqlite(\n tables: Tables,\n params: InsertUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n const columns = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`);\n const conflictColumns = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`);\n\n return sql`\n INSERT INTO ${uniques} (${columns})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.constraintName},\n ${params.key}, ${params.nodeId}, ${params.concreteKind}, ${sql.raw(\"NULL\")}\n )\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${quotedColumn(uniques.nodeId)} = CASE\n WHEN ${quotedColumn(uniques.nodeId)} = ${params.nodeId} THEN ${params.nodeId}\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.nodeId}\n ELSE ${quotedColumn(uniques.nodeId)}\n END,\n ${quotedColumn(uniques.concreteKind)} = CASE\n WHEN ${quotedColumn(uniques.nodeId)} = ${params.nodeId} THEN ${params.concreteKind}\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.concreteKind}\n ELSE ${quotedColumn(uniques.concreteKind)}\n END,\n ${quotedColumn(uniques.deletedAt)} = CASE\n WHEN ${quotedColumn(uniques.nodeId)} = ${params.nodeId} THEN NULL\n WHEN ${quotedColumn(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${quotedColumn(uniques.deletedAt)}\n END\n RETURNING ${quotedColumn(uniques.nodeId)} as node_id\n `;\n}\n\n/**\n * Builds an INSERT query for a uniqueness entry (PostgreSQL).\n *\n * Uses ON CONFLICT with a conditional update that only succeeds if:\n * 1. The existing entry belongs to the same node (safe update), OR\n * 2. The existing entry is soft-deleted (can be reused)\n *\n * If a different live node holds this key, the conflict handler leaves the\n * row unchanged, and RETURNING will show the conflicting node_id.\n */\nfunction buildInsertUniquePostgres(\n tables: Tables,\n params: InsertUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n const columns = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\", \"${uniques.nodeId.name}\", \"${uniques.concreteKind.name}\", \"${uniques.deletedAt.name}\"`);\n const conflictColumns = sql.raw(`\"${uniques.graphId.name}\", \"${uniques.nodeKind.name}\", \"${uniques.constraintName.name}\", \"${uniques.key.name}\"`);\n\n const tableName = getTableName(uniques);\n const existingColumn = (column: { name: string }) =>\n sql.raw(`\"${tableName}\".\"${column.name}\"`);\n\n return sql`\n INSERT INTO ${uniques} (${columns})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.constraintName},\n ${params.key}, ${params.nodeId}, ${params.concreteKind}, ${sql.raw(\"NULL\")}\n )\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${quotedColumn(uniques.nodeId)} = CASE\n WHEN ${existingColumn(uniques.nodeId)} = ${params.nodeId} THEN ${params.nodeId}\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.nodeId}\n ELSE ${existingColumn(uniques.nodeId)}\n END,\n ${quotedColumn(uniques.concreteKind)} = CASE\n WHEN ${existingColumn(uniques.nodeId)} = ${params.nodeId} THEN ${params.concreteKind}\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN ${params.concreteKind}\n ELSE ${existingColumn(uniques.concreteKind)}\n END,\n ${quotedColumn(uniques.deletedAt)} = CASE\n WHEN ${existingColumn(uniques.nodeId)} = ${params.nodeId} THEN NULL\n WHEN ${existingColumn(uniques.deletedAt)} IS NOT NULL THEN NULL\n ELSE ${existingColumn(uniques.deletedAt)}\n END\n RETURNING ${quotedColumn(uniques.nodeId)} as node_id\n `;\n}\n\nconst UNIQUE_INSERT_BUILDERS: Record<SqlDialect, InsertUniqueDialectBuilder> = {\n postgres: buildInsertUniquePostgres,\n sqlite: buildInsertUniqueSqlite,\n};\n\n/**\n * Builds an INSERT query for a uniqueness entry.\n * Returns the node_id that now holds the key (may differ from input if conflict).\n */\nexport function buildInsertUnique(\n tables: Tables,\n dialect: SqlDialect,\n params: InsertUniqueParams,\n): SQL {\n const builder = UNIQUE_INSERT_BUILDERS[dialect];\n return builder(tables, params);\n}\n\n/**\n * Builds a soft DELETE query for a uniqueness entry.\n * Uses raw column name in SET clause.\n */\nexport function buildDeleteUnique(\n tables: Tables,\n params: DeleteUniqueParams,\n timestamp: string,\n): SQL {\n const { uniques } = tables;\n\n return sql`\n UPDATE ${uniques}\n SET ${quotedColumn(uniques.deletedAt)} = ${timestamp}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} = ${params.key}\n AND ${uniques.deletedAt} IS NULL\n `;\n}\n\n/**\n * Builds a hard DELETE query for all uniqueness entries for a node.\n */\nexport function buildHardDeleteUniquesByNode(\n tables: Tables,\n graphId: string,\n nodeId: string,\n): SQL {\n const { uniques } = tables;\n\n return sql`\n DELETE FROM ${uniques}\n WHERE ${uniques.graphId} = ${graphId}\n AND ${uniques.nodeId} = ${nodeId}\n `;\n}\n\n/**\n * Builds a hard DELETE query for all embeddings for a node.\n */\nexport function buildHardDeleteEmbeddingsByNode(\n tables: Tables,\n graphId: string,\n nodeKind: string,\n nodeId: string,\n): SQL {\n const { embeddings } = tables;\n\n return sql`\n DELETE FROM ${embeddings}\n WHERE ${embeddings.graphId} = ${graphId}\n AND ${embeddings.nodeKind} = ${nodeKind}\n AND ${embeddings.nodeId} = ${nodeId}\n `;\n}\n\n/**\n * Builds a SELECT query to check for uniqueness violations.\n */\nexport function buildCheckUnique(\n tables: Tables,\n params: CheckUniqueParams,\n): SQL {\n const { uniques } = tables;\n\n return sql`\n SELECT * FROM ${uniques}\n WHERE ${uniques.graphId} = ${params.graphId}\n AND ${uniques.nodeKind} = ${params.nodeKind}\n AND ${uniques.constraintName} = ${params.constraintName}\n AND ${uniques.key} = ${params.key}\n AND ${uniques.deletedAt} IS NULL\n `;\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport type {\n DeleteEmbeddingParams,\n UpsertEmbeddingParams,\n VectorMetric,\n VectorSearchParams,\n} from \"../../types\";\nimport type { PostgresTables } from \"../schema/postgres\";\nimport type { Tables } from \"./shared\";\n\n/**\n * Validates that all values in an array are finite numbers.\n * Throws if any value is NaN, Infinity, or not a number.\n */\nfunction assertFiniteNumberArray(array: readonly number[], name: string): void {\n for (const [index, value] of array.entries()) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new TypeError(\n `${name}[${index}] must be a finite number, got: ${value}`,\n );\n }\n }\n}\n\n/**\n * Formats an embedding array as a pgvector literal string.\n * Validates all values are finite numbers first.\n */\nfunction formatEmbeddingLiteral(embedding: readonly number[]): string {\n assertFiniteNumberArray(embedding, \"embedding\");\n return `[${embedding.join(\",\")}]`;\n}\n\n/**\n * Builds an UPSERT query for an embedding (PostgreSQL).\n * Uses ON CONFLICT to update existing embeddings.\n */\nexport function buildUpsertEmbeddingPostgres(\n tables: PostgresTables,\n params: UpsertEmbeddingParams,\n timestamp: string,\n): SQL {\n const { embeddings } = tables;\n const embeddingLiteral = formatEmbeddingLiteral(params.embedding);\n\n const columns = sql.raw(\n `\"${embeddings.graphId.name}\", \"${embeddings.nodeKind.name}\", \"${embeddings.nodeId.name}\", \"${embeddings.fieldPath.name}\", \"${embeddings.embedding.name}\", \"${embeddings.dimensions.name}\", \"${embeddings.createdAt.name}\", \"${embeddings.updatedAt.name}\"`,\n );\n\n const conflictColumns = sql.raw(\n `\"${embeddings.graphId.name}\", \"${embeddings.nodeKind.name}\", \"${embeddings.nodeId.name}\", \"${embeddings.fieldPath.name}\"`,\n );\n\n const column = (target: { name: string }) => sql.raw(`\"${target.name}\"`);\n\n return sql`\n INSERT INTO ${embeddings} (${columns})\n VALUES (\n ${params.graphId}, ${params.nodeKind}, ${params.nodeId}, ${params.fieldPath},\n ${embeddingLiteral}::vector, ${params.dimensions}, ${timestamp}, ${timestamp}\n )\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${column(embeddings.embedding)} = ${embeddingLiteral}::vector,\n ${column(embeddings.dimensions)} = ${params.dimensions},\n ${column(embeddings.updatedAt)} = ${timestamp}\n `;\n}\n\n/**\n * Builds a DELETE query for an embedding.\n */\nexport function buildDeleteEmbedding(\n tables: Tables,\n params: DeleteEmbeddingParams,\n): SQL {\n const { embeddings } = tables;\n\n return sql`\n DELETE FROM ${embeddings}\n WHERE ${embeddings.graphId} = ${params.graphId}\n AND ${embeddings.nodeKind} = ${params.nodeKind}\n AND ${embeddings.nodeId} = ${params.nodeId}\n AND ${embeddings.fieldPath} = ${params.fieldPath}\n `;\n}\n\n/**\n * Builds a SELECT query to get an embedding.\n */\nexport function buildGetEmbedding(\n tables: Tables,\n graphId: string,\n nodeKind: string,\n nodeId: string,\n fieldPath: string,\n): SQL {\n const { embeddings } = tables;\n\n return sql`\n SELECT * FROM ${embeddings}\n WHERE ${embeddings.graphId} = ${graphId}\n AND ${embeddings.nodeKind} = ${nodeKind}\n AND ${embeddings.nodeId} = ${nodeId}\n AND ${embeddings.fieldPath} = ${fieldPath}\n `;\n}\n\n/**\n * Builds the distance expression for a given metric.\n * Uses parameterized embedding literal to prevent SQL injection.\n */\nfunction buildDistanceExpression(\n embeddingColumn: SQL,\n queryLiteral: string,\n metric: VectorMetric,\n): SQL {\n const vectorParameter = sql`${queryLiteral}::vector`;\n\n switch (metric) {\n case \"cosine\": {\n return sql`(${embeddingColumn} <=> ${vectorParameter})`;\n }\n case \"l2\": {\n return sql`(${embeddingColumn} <-> ${vectorParameter})`;\n }\n case \"inner_product\": {\n return sql`(${embeddingColumn} <#> ${vectorParameter})`;\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);\n }\n }\n}\n\nfunction buildVectorSearchScoreExpression(\n distanceExpression: SQL,\n metric: VectorMetric,\n): SQL {\n switch (metric) {\n case \"cosine\": {\n return sql`(1 - (${distanceExpression}))`;\n }\n case \"l2\":\n case \"inner_product\": {\n return distanceExpression;\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);\n }\n }\n}\n\nfunction buildVectorSearchMinScoreCondition(\n distanceExpression: SQL,\n metric: VectorMetric,\n minScore: number,\n): SQL {\n switch (metric) {\n case \"cosine\": {\n const threshold = 1 - minScore;\n return sql`${distanceExpression} <= ${threshold}`;\n }\n case \"l2\": {\n return sql`${distanceExpression} <= ${minScore}`;\n }\n case \"inner_product\": {\n const negativeThreshold = -minScore;\n return sql`${distanceExpression} <= ${negativeThreshold}`;\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(`Unsupported vector metric: ${String(_exhaustive)}`);\n }\n }\n}\n\n/**\n * Builds a vector similarity search query (PostgreSQL).\n * Returns node IDs ordered by similarity (closest first).\n */\nexport function buildVectorSearchPostgres(\n tables: PostgresTables,\n params: VectorSearchParams,\n): SQL {\n const { embeddings } = tables;\n const queryLiteral = formatEmbeddingLiteral(params.queryEmbedding);\n\n if (params.minScore !== undefined && !Number.isFinite(params.minScore)) {\n throw new TypeError(\n `minScore must be a finite number, got: ${params.minScore}`,\n );\n }\n\n if (!Number.isInteger(params.limit) || params.limit <= 0) {\n throw new Error(`limit must be a positive integer, got: ${params.limit}`);\n }\n\n const embeddingColumn = sql`${embeddings.embedding}`;\n const distanceExpression = buildDistanceExpression(\n embeddingColumn,\n queryLiteral,\n params.metric,\n );\n\n const conditions = [\n sql`${embeddings.graphId} = ${params.graphId}`,\n sql`${embeddings.nodeKind} = ${params.nodeKind}`,\n sql`${embeddings.fieldPath} = ${params.fieldPath}`,\n ];\n\n if (params.minScore !== undefined) {\n conditions.push(\n buildVectorSearchMinScoreCondition(\n distanceExpression,\n params.metric,\n params.minScore,\n ),\n );\n }\n\n const whereClause = sql.join(conditions, sql` AND `);\n const scoreExpression = buildVectorSearchScoreExpression(\n distanceExpression,\n params.metric,\n );\n\n return sql`\n SELECT\n ${embeddings.nodeId} as node_id,\n ${scoreExpression} as score\n FROM ${embeddings}\n WHERE ${whereClause}\n ORDER BY ${distanceExpression} ASC\n LIMIT ${params.limit}\n `;\n}\n","import { type SQL } from \"drizzle-orm\";\n\nimport type {\n CheckUniqueParams,\n CountEdgesByKindParams,\n CountEdgesFromParams,\n CountNodesByKindParams,\n DeleteEdgeParams,\n DeleteEmbeddingParams,\n DeleteNodeParams,\n DeleteUniqueParams,\n EdgeExistsBetweenParams,\n FindEdgesByKindParams,\n FindEdgesConnectedToParams,\n FindNodesByKindParams,\n HardDeleteEdgeParams,\n HardDeleteNodeParams,\n InsertEdgeParams,\n InsertNodeParams,\n InsertSchemaParams,\n InsertUniqueParams,\n SqlDialect,\n UpdateEdgeParams,\n UpdateNodeParams,\n UpsertEmbeddingParams,\n VectorSearchParams,\n} from \"../../types\";\nimport type { PostgresTables } from \"../schema/postgres\";\nimport type { SqliteTables } from \"../schema/sqlite\";\nimport {\n buildCountEdgesByKind,\n buildCountNodesByKind,\n buildFindEdgesByKind,\n buildFindNodesByKind,\n} from \"./collections\";\nimport {\n buildCountEdgesFrom,\n buildDeleteEdge,\n buildEdgeExistsBetween,\n buildFindEdgesConnectedTo,\n buildGetEdge,\n buildGetEdges,\n buildHardDeleteEdge,\n buildHardDeleteEdgesByNode,\n buildInsertEdge,\n buildInsertEdgeNoReturn,\n buildInsertEdgesBatch,\n buildInsertEdgesBatchReturning,\n buildUpdateEdge,\n} from \"./edges\";\nimport {\n buildDeleteNode,\n buildGetNode,\n buildGetNodes,\n buildHardDeleteNode,\n buildInsertNode,\n buildInsertNodeNoReturn,\n buildInsertNodesBatch,\n buildInsertNodesBatchReturning,\n buildUpdateNode,\n} from \"./nodes\";\nimport {\n buildGetActiveSchema,\n buildGetSchemaVersion,\n buildInsertSchema,\n buildSetActiveSchema,\n} from \"./schema\";\nimport type { Tables } from \"./shared\";\nimport {\n buildCheckUnique,\n buildDeleteUnique,\n buildHardDeleteEmbeddingsByNode,\n buildHardDeleteUniquesByNode,\n buildInsertUnique,\n} from \"./uniques\";\nimport {\n buildDeleteEmbedding,\n buildGetEmbedding,\n buildUpsertEmbeddingPostgres,\n buildVectorSearchPostgres,\n} from \"./vectors\";\n\nexport type CommonOperationStrategy = Readonly<{\n buildInsertNode: (params: InsertNodeParams, timestamp: string) => SQL;\n buildInsertNodeNoReturn: (\n params: InsertNodeParams,\n timestamp: string,\n ) => SQL;\n buildInsertNodesBatch: (\n params: readonly InsertNodeParams[],\n timestamp: string,\n ) => SQL;\n buildInsertNodesBatchReturning: (\n params: readonly InsertNodeParams[],\n timestamp: string,\n ) => SQL;\n buildGetNode: (graphId: string, kind: string, id: string) => SQL;\n buildGetNodes: (graphId: string, kind: string, ids: readonly string[]) => SQL;\n buildUpdateNode: (params: UpdateNodeParams, timestamp: string) => SQL;\n buildDeleteNode: (params: DeleteNodeParams, timestamp: string) => SQL;\n buildHardDeleteNode: (params: HardDeleteNodeParams) => SQL;\n buildInsertEdge: (params: InsertEdgeParams, timestamp: string) => SQL;\n buildInsertEdgeNoReturn: (\n params: InsertEdgeParams,\n timestamp: string,\n ) => SQL;\n buildInsertEdgesBatch: (\n params: readonly InsertEdgeParams[],\n timestamp: string,\n ) => SQL;\n buildInsertEdgesBatchReturning: (\n params: readonly InsertEdgeParams[],\n timestamp: string,\n ) => SQL;\n buildGetEdge: (graphId: string, id: string) => SQL;\n buildGetEdges: (graphId: string, ids: readonly string[]) => SQL;\n buildUpdateEdge: (params: UpdateEdgeParams, timestamp: string) => SQL;\n buildDeleteEdge: (params: DeleteEdgeParams, timestamp: string) => SQL;\n buildHardDeleteEdge: (params: HardDeleteEdgeParams) => SQL;\n buildHardDeleteEdgesByNode: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n ) => SQL;\n buildCountEdgesFrom: (params: CountEdgesFromParams) => SQL;\n buildEdgeExistsBetween: (params: EdgeExistsBetweenParams) => SQL;\n buildFindEdgesConnectedTo: (params: FindEdgesConnectedToParams) => SQL;\n buildFindNodesByKind: (params: FindNodesByKindParams) => SQL;\n buildCountNodesByKind: (params: CountNodesByKindParams) => SQL;\n buildFindEdgesByKind: (params: FindEdgesByKindParams) => SQL;\n buildCountEdgesByKind: (params: CountEdgesByKindParams) => SQL;\n buildInsertUnique: (params: InsertUniqueParams) => SQL;\n buildDeleteUnique: (params: DeleteUniqueParams, timestamp: string) => SQL;\n buildHardDeleteUniquesByNode: (graphId: string, nodeId: string) => SQL;\n buildHardDeleteEmbeddingsByNode: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n ) => SQL;\n buildCheckUnique: (params: CheckUniqueParams) => SQL;\n buildGetActiveSchema: (graphId: string) => SQL;\n buildInsertSchema: (params: InsertSchemaParams, timestamp: string) => SQL;\n buildGetSchemaVersion: (graphId: string, version: number) => SQL;\n buildSetActiveSchema: (\n graphId: string,\n version: number,\n ) => Readonly<{ activateVersion: SQL; deactivateAll: SQL }>;\n}>;\n\nexport type PostgresVectorOperationStrategy = Readonly<{\n buildUpsertEmbedding: (\n params: UpsertEmbeddingParams,\n timestamp: string,\n ) => SQL;\n buildDeleteEmbedding: (params: DeleteEmbeddingParams) => SQL;\n buildGetEmbedding: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n fieldPath: string,\n ) => SQL;\n buildVectorSearch: (params: VectorSearchParams) => SQL;\n}>;\n\nexport type SqliteOperationStrategy = CommonOperationStrategy;\n\nexport type PostgresOperationStrategy = Readonly<\n CommonOperationStrategy & PostgresVectorOperationStrategy\n>;\n\ntype TableOperationBuilder = (\n tables: Tables,\n ...args: never[]\n) => SQL;\n\ntype TableOperationBuilderMap = Readonly<Record<string, TableOperationBuilder>>;\n\ntype BoundTableOperationBuilderMap<TBuilders extends TableOperationBuilderMap> = Readonly<{\n [K in keyof TBuilders]: TBuilders[K] extends (\n tables: Tables,\n ...args: infer TArguments\n ) => SQL\n ? (...args: TArguments) => SQL\n : never;\n}>;\n\nfunction bindTableOperationBuilders<TBuilders extends TableOperationBuilderMap>(\n tables: Tables,\n builders: TBuilders,\n): BoundTableOperationBuilderMap<TBuilders> {\n const boundEntries = Object.entries(builders).map(([name, builder]) => {\n function boundBuilder(...args: never[]): SQL {\n return builder(tables, ...args);\n }\n\n return [name, boundBuilder] as const;\n });\n\n return Object.fromEntries(boundEntries) as BoundTableOperationBuilderMap<TBuilders>;\n}\n\nconst COMMON_TABLE_OPERATION_BUILDERS = {\n buildInsertNode,\n buildInsertNodeNoReturn,\n buildInsertNodesBatch,\n buildInsertNodesBatchReturning,\n buildGetNode,\n buildGetNodes,\n buildUpdateNode,\n buildDeleteNode,\n buildHardDeleteNode,\n buildInsertEdge,\n buildInsertEdgeNoReturn,\n buildInsertEdgesBatch,\n buildInsertEdgesBatchReturning,\n buildGetEdge,\n buildGetEdges,\n buildUpdateEdge,\n buildDeleteEdge,\n buildHardDeleteEdge,\n buildHardDeleteEdgesByNode,\n buildCountEdgesFrom,\n buildEdgeExistsBetween,\n buildFindEdgesConnectedTo,\n buildFindNodesByKind,\n buildCountNodesByKind,\n buildFindEdgesByKind,\n buildCountEdgesByKind,\n buildDeleteUnique,\n buildHardDeleteUniquesByNode,\n buildHardDeleteEmbeddingsByNode,\n buildCheckUnique,\n buildGetSchemaVersion,\n} as const satisfies TableOperationBuilderMap;\n\nfunction createCommonOperationStrategy(\n tables: Tables,\n dialect: SqlDialect,\n): CommonOperationStrategy {\n const tableOperations = bindTableOperationBuilders(\n tables,\n COMMON_TABLE_OPERATION_BUILDERS,\n );\n\n return {\n ...tableOperations,\n buildInsertUnique(params: InsertUniqueParams): SQL {\n return buildInsertUnique(tables, dialect, params);\n },\n buildGetActiveSchema(graphId: string): SQL {\n return buildGetActiveSchema(tables, graphId, dialect);\n },\n buildInsertSchema(params: InsertSchemaParams, timestamp: string): SQL {\n return buildInsertSchema(tables, params, timestamp, dialect);\n },\n buildSetActiveSchema(\n graphId: string,\n version: number,\n ): Readonly<{ activateVersion: SQL; deactivateAll: SQL }> {\n return buildSetActiveSchema(tables, graphId, version, dialect);\n },\n };\n}\n\nexport function createSqliteOperationStrategy(\n tables: SqliteTables,\n): SqliteOperationStrategy {\n return createCommonOperationStrategy(tables, \"sqlite\");\n}\n\nexport function createPostgresOperationStrategy(\n tables: PostgresTables,\n): PostgresOperationStrategy {\n const common = createCommonOperationStrategy(tables, \"postgres\");\n\n return {\n ...common,\n buildUpsertEmbedding(params: UpsertEmbeddingParams, timestamp: string): SQL {\n return buildUpsertEmbeddingPostgres(tables, params, timestamp);\n },\n buildDeleteEmbedding(params: DeleteEmbeddingParams): SQL {\n return buildDeleteEmbedding(tables, params);\n },\n buildGetEmbedding(\n graphId: string,\n nodeKind: string,\n nodeId: string,\n fieldPath: string,\n ): SQL {\n return buildGetEmbedding(tables, graphId, nodeKind, nodeId, fieldPath);\n },\n buildVectorSearch(params: VectorSearchParams): SQL {\n return buildVectorSearchPostgres(tables, params);\n },\n };\n}\n","/**\n * Vector Index Management\n *\n * Provides utilities for creating and managing vector indexes\n * on the embeddings table for efficient similarity search.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { type VectorIndexType, type VectorMetric } from \"../types\";\nimport { type AnyPgDatabase } from \"./execution/postgres-execution\";\n\n// ============================================================\n// Validation\n// ============================================================\n\n/**\n * Validates that a value is a positive integer.\n */\nfunction assertPositiveInteger(value: number, name: string): void {\n if (!Number.isInteger(value) || value <= 0) {\n throw new Error(`${name} must be a positive integer, got: ${value}`);\n }\n}\n\n/**\n * Validates that a string is a safe SQL identifier (alphanumeric + underscore only).\n */\nfunction assertSafeIdentifier(value: string, name: string): void {\n if (!/^[a-z0-9_]+$/i.test(value)) {\n throw new Error(\n `${name} must contain only alphanumeric characters and underscores, got: ${value}`,\n );\n }\n}\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Options for creating a vector index.\n */\nexport type VectorIndexOptions = Readonly<{\n /** The graph ID */\n graphId: string;\n /** The node kind to index */\n nodeKind: string;\n /** The field path (embedding property name) */\n fieldPath: string;\n /** The number of dimensions (required for pgvector) */\n dimensions: number;\n /** The index type: \"hnsw\" (default) or \"ivfflat\" */\n indexType?: VectorIndexType;\n /** The similarity metric for the index */\n metric?: VectorMetric;\n /** HNSW-specific: maximum number of connections per layer (default: 16) */\n hnswM?: number;\n /** HNSW-specific: size of dynamic candidate list during construction (default: 64) */\n hnswEfConstruction?: number;\n /** IVFFlat-specific: number of inverted lists (default: 100) */\n ivfflatLists?: number;\n /** Embeddings table name. Defaults to typegraph_node_embeddings. */\n embeddingsTableName?: string;\n}>;\n\n/**\n * Result of a vector index operation.\n */\nexport type VectorIndexResult = Readonly<{\n /** The generated index name */\n indexName: string;\n /** Whether the operation succeeded */\n success: boolean;\n /** Optional message */\n message?: string;\n}>;\n\n// ============================================================\n// Index Name Generation\n// ============================================================\n\nconst MAX_IDENTIFIER_LENGTH = 63;\n\n/**\n * Sanitizes a string to be a valid SQL identifier component.\n */\nfunction sanitizeIdentifier(s: string): string {\n return s.toLowerCase().replaceAll(/[^a-z0-9_]/g, \"_\");\n}\n\nfunction quoteIdentifier(value: string): string {\n return `\"${value.replaceAll('\"', '\"\"')}\"`;\n}\n\n/**\n * Simple deterministic hash for identifier deduplication.\n * Returns an 8-char hex string.\n */\nfunction shortHash(input: string): string {\n let h1 = 0xde_ad_be_ef;\n let h2 = 0x41_c6_ce_57;\n for (let index = 0; index < input.length; index++) {\n const ch = input.codePointAt(index)!;\n h1 = Math.imul(h1 ^ ch, 0x9e_37_79_b1);\n h2 = Math.imul(h2 ^ ch, 0x5f_35_64_95);\n }\n h1 =\n Math.imul(h1 ^ (h1 >>> 16), 0x85_eb_ca_6b) ^\n Math.imul(h2 ^ (h2 >>> 13), 0xc2_b2_ae_35);\n h2 =\n Math.imul(h2 ^ (h2 >>> 16), 0x85_eb_ca_6b) ^\n Math.imul(h1 ^ (h1 >>> 13), 0xc2_b2_ae_35);\n const hi = (h2 >>> 0).toString(16).padStart(8, \"0\");\n const lo = (h1 >>> 0).toString(16).padStart(8, \"0\");\n return `${hi}${lo}`.slice(0, 8);\n}\n\n/**\n * Generates a consistent index name for a vector index.\n *\n * Format: `idx_emb_{graphId}_{nodeKind}_{fieldPath}_{metric}`\n * Names are sanitized to be valid SQL identifiers.\n * If the name exceeds PostgreSQL's 63-char identifier limit,\n * it is truncated with a hash suffix to prevent collisions.\n */\nexport function generateVectorIndexName(\n graphId: string,\n nodeKind: string,\n fieldPath: string,\n metric: VectorMetric = \"cosine\",\n): string {\n const parts = [\n \"idx_emb\",\n sanitizeIdentifier(graphId),\n sanitizeIdentifier(nodeKind),\n sanitizeIdentifier(fieldPath),\n metric,\n ];\n\n const name = parts.join(\"_\");\n\n if (name.length <= MAX_IDENTIFIER_LENGTH) {\n return name;\n }\n\n const hash = shortHash(name);\n // Reserve space for _hash suffix\n const truncated = name.slice(0, MAX_IDENTIFIER_LENGTH - 1 - hash.length);\n return `${truncated}_${hash}`;\n}\n\n// ============================================================\n// PostgreSQL Vector Index Operations\n// ============================================================\n\n/**\n * Gets the pgvector operator class for a given metric.\n */\nfunction getOperatorClass(metric: VectorMetric): string {\n switch (metric) {\n case \"cosine\": {\n return \"vector_cosine_ops\";\n }\n case \"l2\": {\n return \"vector_l2_ops\";\n }\n case \"inner_product\": {\n return \"vector_ip_ops\";\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(\"Unsupported vector metric: \" + String(_exhaustive));\n }\n }\n}\n\n/**\n * Escapes a string for use in a SQL string literal.\n * Uses dollar quoting to avoid issues with embedded quotes.\n */\nfunction escapeSqlString(value: string): string {\n const tag = `tg${crypto.randomUUID().replaceAll(\"-\", \"\").slice(0, 8)}`;\n return `$${tag}$${value}$${tag}$`;\n}\n\n/**\n * Creates a vector index on the embeddings table (PostgreSQL/pgvector).\n *\n * This should be called after the embeddings table is created.\n * The index significantly improves similarity search performance.\n *\n * @example\n * ```typescript\n * await createVectorIndex(db, {\n * graphId: \"my-graph\",\n * nodeKind: \"Document\",\n * fieldPath: \"embedding\",\n * dimensions: 1536,\n * indexType: \"hnsw\",\n * metric: \"cosine\",\n * });\n * ```\n */\nexport async function createPostgresVectorIndex(\n db: AnyPgDatabase,\n options: VectorIndexOptions,\n): Promise<VectorIndexResult> {\n const {\n graphId,\n nodeKind,\n fieldPath,\n dimensions,\n embeddingsTableName = \"typegraph_node_embeddings\",\n indexType = \"hnsw\",\n metric = \"cosine\",\n hnswM = 16,\n hnswEfConstruction = 64,\n ivfflatLists = 100,\n } = options;\n\n // Validate all numeric parameters\n assertPositiveInteger(dimensions, \"dimensions\");\n assertPositiveInteger(hnswM, \"hnswM\");\n assertPositiveInteger(hnswEfConstruction, \"hnswEfConstruction\");\n assertPositiveInteger(ivfflatLists, \"ivfflatLists\");\n\n const indexName = generateVectorIndexName(graphId, nodeKind, fieldPath, metric);\n const operatorClass = getOperatorClass(metric);\n const quotedEmbeddingsTableName = quoteIdentifier(embeddingsTableName);\n\n // Validate that the generated index name is safe\n assertSafeIdentifier(indexName, \"indexName\");\n\n // Use dollar quoting for string values to prevent SQL injection\n const safeGraphId = escapeSqlString(graphId);\n const safeNodeKind = escapeSqlString(nodeKind);\n const safeFieldPath = escapeSqlString(fieldPath);\n\n // Build the CREATE INDEX statement\n let indexSql: SQL;\n\n if (indexType === \"hnsw\") {\n // HNSW index with optional parameters\n // Column is native VECTOR type, but we still specify dimensions in the\n // index expression to ensure consistent index behavior\n indexSql = sql.raw(`\n CREATE INDEX IF NOT EXISTS ${indexName}\n ON ${quotedEmbeddingsTableName}\n USING hnsw ((embedding::vector(${dimensions})) ${operatorClass})\n WITH (m = ${hnswM}, ef_construction = ${hnswEfConstruction})\n WHERE graph_id = ${safeGraphId}\n AND node_kind = ${safeNodeKind}\n AND field_path = ${safeFieldPath}\n `);\n } else if (indexType === \"ivfflat\") {\n // IVFFlat index\n // Column is native VECTOR type, but we still specify dimensions in the\n // index expression to ensure consistent index behavior\n indexSql = sql.raw(`\n CREATE INDEX IF NOT EXISTS ${indexName}\n ON ${quotedEmbeddingsTableName}\n USING ivfflat ((embedding::vector(${dimensions})) ${operatorClass})\n WITH (lists = ${ivfflatLists})\n WHERE graph_id = ${safeGraphId}\n AND node_kind = ${safeNodeKind}\n AND field_path = ${safeFieldPath}\n `);\n } else {\n // No index (or unsupported type)\n return {\n indexName,\n success: true,\n message: `Index type \"${indexType}\" not supported, skipping index creation`,\n };\n }\n\n try {\n await db.execute(indexSql);\n return {\n indexName,\n success: true,\n message: `Created ${indexType.toUpperCase()} index \"${indexName}\" for ${nodeKind}.${fieldPath}`,\n };\n } catch (error) {\n return {\n indexName,\n success: false,\n message: `Failed to create index: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n/**\n * Drops a vector index (PostgreSQL).\n *\n * @param indexName - Must be a valid SQL identifier (alphanumeric + underscore only)\n */\nexport async function dropPostgresVectorIndex(\n db: AnyPgDatabase,\n indexName: string,\n): Promise<VectorIndexResult> {\n // Validate index name to prevent SQL injection\n assertSafeIdentifier(indexName, \"indexName\");\n\n try {\n const dropSql = sql.raw(`DROP INDEX IF EXISTS ${indexName}`);\n await db.execute(dropSql);\n return {\n indexName,\n success: true,\n message: `Dropped index \"${indexName}\"`,\n };\n } catch (error) {\n return {\n indexName,\n success: false,\n message: `Failed to drop index: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n}\n\n// ============================================================\n// SQLite Vector Index Operations\n// ============================================================\n\n/**\n * SQLite/sqlite-vec doesn't support traditional indexes on virtual tables.\n * Vector search is optimized through the extension itself.\n *\n * This function is a no-op for SQLite but provides a consistent API.\n */\nexport function createSqliteVectorIndex(\n _options: VectorIndexOptions,\n): VectorIndexResult {\n const indexName = generateVectorIndexName(\n _options.graphId,\n _options.nodeKind,\n _options.fieldPath,\n _options.metric,\n );\n\n return {\n indexName,\n success: true,\n message: \"SQLite/sqlite-vec uses optimized internal indexing, no explicit index needed\",\n };\n}\n\n/**\n * SQLite vector index drop (no-op for consistency).\n */\nexport function dropSqliteVectorIndex(\n graphId: string,\n nodeKind: string,\n fieldPath: string,\n metric: VectorMetric = \"cosine\",\n): VectorIndexResult {\n const indexName = generateVectorIndexName(graphId, nodeKind, fieldPath, metric);\n\n return {\n indexName,\n success: true,\n message: \"SQLite/sqlite-vec does not use explicit indexes\",\n };\n}\n","import { type SQL } from \"drizzle-orm\";\n\nexport type CompiledSqlQuery = Readonly<{\n params: readonly unknown[];\n sql: string;\n}>;\n\nexport type PreparedSqlStatement = Readonly<{\n execute: <TRow>(params: readonly unknown[]) => Promise<readonly TRow[]>;\n}>;\n\nexport type SqlExecutionAdapter = Readonly<{\n compile: (query: SQL) => CompiledSqlQuery;\n execute: <TRow>(query: SQL) => Promise<readonly TRow[]>;\n executeCompiled?: <TRow>(\n compiledQuery: CompiledSqlQuery,\n ) => Promise<readonly TRow[]>;\n prepare?: (sqlText: string) => PreparedSqlStatement;\n}>;\n\ntype SqlCompiler = Readonly<{\n sqlToQuery: (query: SQL) => CompiledSqlQuery;\n}>;\n\ntype DatabaseWithCompiler = Readonly<{\n dialect?: SqlCompiler;\n}>;\n\nexport function compileQueryWithDialect(\n db: unknown,\n query: SQL,\n backendName: string,\n): CompiledSqlQuery {\n const databaseWithCompiler = db as DatabaseWithCompiler;\n const compiler = databaseWithCompiler.dialect;\n if (compiler === undefined) {\n throw new Error(`${backendName} backend is missing a SQL compiler`);\n }\n return compiler.sqlToQuery(query);\n}\n"]}
@@ -17,6 +17,15 @@ function toPostgresPath(pointer) {
17
17
  }
18
18
  var postgresDialect = {
19
19
  name: "postgres",
20
+ capabilities: {
21
+ standardQueryStrategy: "cte_project",
22
+ recursiveQueryStrategy: "recursive_cte",
23
+ setOperationStrategy: "standard_parenthesized",
24
+ materializeIntermediateTraversalCtes: false,
25
+ forceRecursiveWorktableOuterJoinOrder: false,
26
+ vectorPredicateStrategy: "native",
27
+ vectorMetrics: ["cosine", "l2", "inner_product"]
28
+ },
20
29
  // ============================================================
21
30
  // JSON Path Operations
22
31
  // ============================================================
@@ -140,6 +149,10 @@ var postgresDialect = {
140
149
  case "inner_product": {
141
150
  return sql`(${column} <#> ${formatted})`;
142
151
  }
152
+ default: {
153
+ const _exhaustive = metric;
154
+ throw new Error("Unsupported vector metric: " + String(_exhaustive));
155
+ }
143
156
  }
144
157
  },
145
158
  formatEmbedding(embedding) {
@@ -177,6 +190,15 @@ function isArrayIndex(segment) {
177
190
  }
178
191
  var sqliteDialect = {
179
192
  name: "sqlite",
193
+ capabilities: {
194
+ standardQueryStrategy: "cte_project",
195
+ recursiveQueryStrategy: "recursive_cte",
196
+ setOperationStrategy: "sqlite_compound",
197
+ materializeIntermediateTraversalCtes: true,
198
+ forceRecursiveWorktableOuterJoinOrder: true,
199
+ vectorPredicateStrategy: "native",
200
+ vectorMetrics: ["cosine", "l2"]
201
+ },
180
202
  // ============================================================
181
203
  // JSON Path Operations
182
204
  // ============================================================
@@ -269,7 +291,7 @@ var sqliteDialect = {
269
291
  // Type Utilities
270
292
  // ============================================================
271
293
  currentTimestamp() {
272
- return sql`datetime('now')`;
294
+ return sql`strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;
273
295
  },
274
296
  // ============================================================
275
297
  // Value Binding & Literals
@@ -307,6 +329,10 @@ var sqliteDialect = {
307
329
  "Inner product distance is not supported by sqlite-vec. Use 'cosine' or 'l2' metrics instead."
308
330
  );
309
331
  }
332
+ default: {
333
+ const _exhaustive = metric;
334
+ throw new Error("Unsupported vector metric: " + String(_exhaustive));
335
+ }
310
336
  }
311
337
  },
312
338
  formatEmbedding(embedding) {
@@ -349,5 +375,5 @@ var EDGE_META_KEYS = [
349
375
  ];
350
376
 
351
377
  export { EDGE_META_KEYS, NODE_META_KEYS, getDialect };
352
- //# sourceMappingURL=chunk-IIAT36MI.js.map
353
- //# sourceMappingURL=chunk-IIAT36MI.js.map
378
+ //# sourceMappingURL=chunk-54WJF3DW.js.map
379
+ //# sourceMappingURL=chunk-54WJF3DW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/query/dialect/postgres.ts","../src/query/dialect/sqlite.ts","../src/query/dialect/index.ts","../src/system-fields.ts"],"names":["sql"],"mappings":"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","file":"chunk-54WJF3DW.js","sourcesContent":["/**\n * PostgreSQL Dialect Adapter\n *\n * Implements dialect-specific SQL generation for PostgreSQL databases.\n * Uses PostgreSQL's native JSONB operators for JSON operations.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport { type JsonPointer, parseJsonPointer } from \"../json-pointer\";\nimport { type DialectAdapter } from \"./types\";\n\n/**\n * Escapes a string for use in a PostgreSQL string literal.\n * Uses single quotes and escapes embedded single quotes.\n */\nfunction escapePostgresLiteral(value: string): string {\n // PostgreSQL uses '' to escape single quotes inside string literals\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n\n/**\n * Converts a JSON pointer to PostgreSQL's text array path.\n *\n * Uses raw SQL (non-parameterized) to ensure the same expression text\n * is generated when the same field is used in multiple clauses (SELECT, GROUP BY).\n * This is safe because JSON pointers come from schema definitions, not user input.\n *\n * @example\n * \"/name\" → ARRAY['name']\n * \"/items/0\" → ARRAY['items', '0']\n * \"/a/b/c\" → ARRAY['a', 'b', 'c']\n */\nfunction toPostgresPath(pointer: JsonPointer): SQL {\n if (!pointer || pointer === \"\" || pointer === \"/\") {\n return sql.raw(\"ARRAY[]::text[]\");\n }\n\n const segments = parseJsonPointer(pointer);\n if (segments.length === 0) {\n return sql.raw(\"ARRAY[]::text[]\");\n }\n\n // Use raw SQL for path segments to ensure identical SQL text\n // when the same field is used in multiple clauses (e.g., SELECT and GROUP BY)\n const escapedSegments = segments\n .map((segment) => escapePostgresLiteral(segment))\n .join(\", \");\n return sql.raw(`ARRAY[${escapedSegments}]`);\n}\n\n/**\n * PostgreSQL dialect adapter implementation.\n */\nexport const postgresDialect: DialectAdapter = {\n name: \"postgres\",\n capabilities: {\n standardQueryStrategy: \"cte_project\",\n recursiveQueryStrategy: \"recursive_cte\",\n setOperationStrategy: \"standard_parenthesized\",\n materializeIntermediateTraversalCtes: false,\n forceRecursiveWorktableOuterJoinOrder: false,\n vectorPredicateStrategy: \"native\",\n vectorMetrics: [\"cosine\", \"l2\", \"inner_product\"] as const,\n },\n\n // ============================================================\n // JSON Path Operations\n // ============================================================\n\n compilePath(pointer) {\n return toPostgresPath(pointer);\n },\n\n jsonExtract(column, pointer) {\n // #> returns JSONB value at path\n const path = toPostgresPath(pointer);\n return sql`${column} #> ${path}`;\n },\n\n jsonExtractText(column, pointer) {\n // #>> returns text value at path\n const path = toPostgresPath(pointer);\n return sql`${column} #>> ${path}`;\n },\n\n jsonExtractNumber(column, pointer) {\n // Extract as text then cast to numeric\n const path = toPostgresPath(pointer);\n return sql`(${column} #>> ${path})::numeric`;\n },\n\n jsonExtractBoolean(column, pointer) {\n // Extract as text then cast to boolean\n const path = toPostgresPath(pointer);\n return sql`(${column} #>> ${path})::boolean`;\n },\n\n jsonExtractDate(column, pointer) {\n // Extract as text then cast to timestamptz\n const path = toPostgresPath(pointer);\n return sql`(${column} #>> ${path})::timestamptz`;\n },\n\n // ============================================================\n // JSON Array Operations\n // ============================================================\n\n jsonArrayLength(column) {\n return sql`jsonb_array_length(${column})`;\n },\n\n jsonArrayContains(column, value) {\n // @> checks if left contains right\n const jsonValue = JSON.stringify([value]);\n return sql`${column} @> ${jsonValue}::jsonb`;\n },\n\n jsonArrayContainsAll(column, values) {\n if (values.length === 0) {\n return sql.raw(\"1=1\");\n }\n\n // @> with full array checks all values\n const jsonValue = JSON.stringify(values);\n return sql`${column} @> ${jsonValue}::jsonb`;\n },\n\n jsonArrayContainsAny(column, values) {\n if (values.length === 0) {\n return sql.raw(\"1=0\");\n }\n\n // Check each value with @> and OR them together\n // PostgreSQL doesn't have a native \"overlaps\" for jsonb arrays\n const conditions = values.map((value) => {\n const jsonValue = JSON.stringify([value]);\n return sql`${column} @> ${jsonValue}::jsonb`;\n });\n return sql`(${sql.join(conditions, sql` OR `)})`;\n },\n\n // ============================================================\n // JSON Object Operations\n // ============================================================\n\n jsonHasPath(column, pointer) {\n const path = toPostgresPath(pointer);\n return sql`${column} #> ${path} IS NOT NULL`;\n },\n\n jsonPathIsNull(column, pointer) {\n const path = toPostgresPath(pointer);\n // Check both SQL NULL and JSON null literal\n return sql`(${column} #> ${path} IS NULL OR ${column} #>> ${path} = 'null')`;\n },\n\n jsonPathIsNotNull(column, pointer) {\n const path = toPostgresPath(pointer);\n return sql`(${column} #> ${path} IS NOT NULL AND ${column} #>> ${path} != 'null')`;\n },\n\n // ============================================================\n // String Operations\n // ============================================================\n\n ilike(column, pattern) {\n // PostgreSQL has native ILIKE operator\n return sql`${column} ILIKE ${pattern}`;\n },\n\n // ============================================================\n // Recursive CTE Path Operations\n // ============================================================\n\n initializePath(nodeId) {\n // PostgreSQL uses text arrays: ARRAY[id]\n return sql`ARRAY[${nodeId}]`;\n },\n\n extendPath(currentPath, nodeId) {\n // Array concatenation: path || id\n return sql`${currentPath} || ${nodeId}`;\n },\n\n cycleCheck(nodeId, path) {\n // Check that id is NOT in array path\n // Returns TRUE if no cycle (id not in array)\n return sql`${nodeId} != ALL(${path})`;\n },\n\n // ============================================================\n // Type Utilities\n // ============================================================\n\n currentTimestamp() {\n return sql`NOW()`;\n },\n\n // ============================================================\n // Value Binding & Literals\n // ============================================================\n\n bindValue(value) {\n // PostgreSQL supports native booleans, no conversion needed\n return value;\n },\n\n booleanLiteral(value) {\n return sql.raw(this.booleanLiteralString(value));\n },\n\n booleanLiteralString(value) {\n return value ? \"TRUE\" : \"FALSE\";\n },\n\n quoteIdentifier(name) {\n // PostgreSQL uses double quotes, escape embedded quotes by doubling\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n },\n\n // ============================================================\n // Vector Operations\n // ============================================================\n\n supportsVectors: true,\n\n vectorDistance(column, embedding, metric) {\n const formatted = this.formatEmbedding(embedding);\n // Column is native VECTOR type, no cast needed\n switch (metric) {\n case \"cosine\": {\n // Cosine distance: 1 - cosine_similarity\n // Lower is more similar (0 = identical)\n return sql`(${column} <=> ${formatted})`;\n }\n case \"l2\": {\n // Euclidean (L2) distance\n // Lower is more similar (0 = identical)\n return sql`(${column} <-> ${formatted})`;\n }\n case \"inner_product\": {\n // Inner product distance (negative inner product)\n // Note: pgvector uses <#> which returns NEGATIVE inner product\n // More negative = more similar for normalized vectors\n return sql`(${column} <#> ${formatted})`;\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(\"Unsupported vector metric: \" + String(_exhaustive));\n }\n }\n },\n\n formatEmbedding(embedding) {\n // Validate all values are finite numbers to prevent injection\n for (const [index, value] of embedding.entries()) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new TypeError(\n `embedding[${index}] must be a finite number, got: ${value}`,\n );\n }\n }\n // Format as PostgreSQL vector literal: '[1.0,2.0,3.0]'::vector\n // Query embedding still needs cast since it's a literal string\n const asString = `[${embedding.join(\",\")}]`;\n return sql`${asString}::vector`;\n },\n};\n","/**\n * SQLite Dialect Adapter\n *\n * Implements dialect-specific SQL generation for SQLite databases.\n * Uses SQLite's JSON1 extension for JSON operations.\n */\nimport { sql } from \"drizzle-orm\";\n\nimport { type JsonPointer, parseJsonPointer } from \"../json-pointer\";\nimport { type DialectAdapter } from \"./types\";\n\n/**\n * Escapes a string for use in a SQLite string literal.\n * SQLite uses single quotes and escapes embedded single quotes by doubling them.\n */\nfunction escapeSqliteLiteral(value: string): string {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n\n/**\n * Converts a JSON pointer to SQLite's JSON path syntax.\n *\n * @example\n * \"/name\" → \"$.\\\"name\\\"\"\n * \"/items/0\" → \"$.\\\"items\\\"[0]\"\n * \"/a/b/c\" → \"$.\\\"a\\\".\\\"b\\\".\\\"c\\\"\"\n */\nfunction toSqlitePath(pointer: JsonPointer): string {\n if (!pointer || pointer === \"\" || pointer === \"/\") {\n return \"$\";\n }\n\n const segments = parseJsonPointer(pointer);\n const parts: string[] = [\"$\"];\n\n for (const segment of segments) {\n if (isArrayIndex(segment)) {\n parts.push(`[${segment}]`);\n } else {\n // Quote the key to handle special characters\n parts.push(`.${JSON.stringify(segment)}`);\n }\n }\n\n return parts.join(\"\");\n}\n\n/**\n * Checks if a JSON pointer segment is an array index.\n */\nfunction isArrayIndex(segment: string): boolean {\n return /^\\d+$/.test(segment);\n}\n\n/**\n * SQLite dialect adapter implementation.\n */\nexport const sqliteDialect: DialectAdapter = {\n name: \"sqlite\",\n capabilities: {\n standardQueryStrategy: \"cte_project\",\n recursiveQueryStrategy: \"recursive_cte\",\n setOperationStrategy: \"sqlite_compound\",\n materializeIntermediateTraversalCtes: true,\n forceRecursiveWorktableOuterJoinOrder: true,\n vectorPredicateStrategy: \"native\",\n vectorMetrics: [\"cosine\", \"l2\"] as const,\n },\n\n // ============================================================\n // JSON Path Operations\n // ============================================================\n\n compilePath(pointer) {\n // Use raw SQL to ensure the path is a literal, which allows expression\n // indexes on json_extract(...) to be used by the query planner.\n return sql.raw(escapeSqliteLiteral(toSqlitePath(pointer)));\n },\n\n jsonExtract(column, pointer) {\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n jsonExtractText(column, pointer) {\n // SQLite's json_extract returns the native JSON type, which works\n // for text comparisons. For explicit text, we use the same function.\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n jsonExtractNumber(column, pointer) {\n // SQLite json_extract returns numbers natively when the value is numeric\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n jsonExtractBoolean(column, pointer) {\n // SQLite json_extract returns 0/1 for boolean values\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n jsonExtractDate(column, pointer) {\n // SQLite stores dates as ISO strings, json_extract returns them as text\n const path = toSqlitePath(pointer);\n return sql`json_extract(${column}, ${sql.raw(escapeSqliteLiteral(path))})`;\n },\n\n // ============================================================\n // JSON Array Operations\n // ============================================================\n\n jsonArrayLength(column) {\n return sql`json_array_length(${column})`;\n },\n\n jsonArrayContains(column, value) {\n return sql`EXISTS (SELECT 1 FROM json_each(${column}) WHERE json_each.value = ${value})`;\n },\n\n jsonArrayContainsAll(column, values) {\n if (values.length === 0) {\n return sql.raw(\"1=1\");\n }\n\n const conditions = values.map(\n (value) =>\n sql`EXISTS (SELECT 1 FROM json_each(${column}) WHERE json_each.value = ${value})`,\n );\n return sql`(${sql.join(conditions, sql` AND `)})`;\n },\n\n jsonArrayContainsAny(column, values) {\n if (values.length === 0) {\n return sql.raw(\"1=0\");\n }\n\n const conditions = values.map(\n (value) =>\n sql`EXISTS (SELECT 1 FROM json_each(${column}) WHERE json_each.value = ${value})`,\n );\n return sql`(${sql.join(conditions, sql` OR `)})`;\n },\n\n // ============================================================\n // JSON Object Operations\n // ============================================================\n\n jsonHasPath(column, pointer) {\n const path = toSqlitePath(pointer);\n return sql`json_type(${column}, ${sql.raw(escapeSqliteLiteral(path))}) IS NOT NULL`;\n },\n\n jsonPathIsNull(column, pointer) {\n const path = toSqlitePath(pointer);\n const pathSql = sql.raw(escapeSqliteLiteral(path));\n return sql`(json_extract(${column}, ${pathSql}) IS NULL OR json_type(${column}, ${pathSql}) = 'null')`;\n },\n\n jsonPathIsNotNull(column, pointer) {\n const path = toSqlitePath(pointer);\n const pathSql = sql.raw(escapeSqliteLiteral(path));\n return sql`(json_extract(${column}, ${pathSql}) IS NOT NULL AND json_type(${column}, ${pathSql}) != 'null')`;\n },\n\n // ============================================================\n // String Operations\n // ============================================================\n\n ilike(column, pattern) {\n // SQLite LIKE is case-insensitive for ASCII by default, but we use\n // LOWER() for consistency with non-ASCII characters\n return sql`LOWER(${column}) LIKE LOWER(${pattern})`;\n },\n\n // ============================================================\n // Recursive CTE Path Operations\n // ============================================================\n\n initializePath(nodeId) {\n // SQLite uses string-based paths with delimiters: '|id|'\n return sql`'|' || ${nodeId} || '|'`;\n },\n\n extendPath(currentPath, nodeId) {\n // Append: path || id || '|'\n return sql`${currentPath} || ${nodeId} || '|'`;\n },\n\n cycleCheck(nodeId, path) {\n // Check that id is NOT in path using INSTR\n // Returns TRUE if no cycle (id not found in path)\n return sql`INSTR(${path}, '|' || ${nodeId} || '|') = 0`;\n },\n\n // ============================================================\n // Type Utilities\n // ============================================================\n\n currentTimestamp() {\n // Keep ISO-8601 format aligned with stored timestamps from Date.toISOString()\n // so string-based temporal comparisons remain correct in SQLite TEXT columns.\n return sql`strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n },\n\n // ============================================================\n // Value Binding & Literals\n // ============================================================\n\n bindValue(value) {\n // SQLite doesn't support native booleans, convert to 0/1\n if (typeof value === \"boolean\") {\n return value ? 1 : 0;\n }\n return value;\n },\n\n booleanLiteral(value) {\n return sql.raw(this.booleanLiteralString(value));\n },\n\n booleanLiteralString(value) {\n return value ? \"1\" : \"0\";\n },\n\n quoteIdentifier(name) {\n // SQLite uses double quotes (or backticks), escape embedded quotes by doubling\n return `\"${name.replaceAll('\"', '\"\"')}\"`;\n },\n\n // ============================================================\n // Vector Operations\n // ============================================================\n\n supportsVectors: true,\n\n vectorDistance(column, embedding, metric) {\n // sqlite-vec functions expect vec_f32 format for the query embedding\n const formatted = this.formatEmbedding(embedding);\n switch (metric) {\n case \"cosine\": {\n // Cosine distance: 1 - cosine_similarity\n // Lower is more similar (0 = identical)\n return sql`vec_distance_cosine(${column}, ${formatted})`;\n }\n case \"l2\": {\n // Euclidean (L2) distance\n // Lower is more similar (0 = identical)\n return sql`vec_distance_l2(${column}, ${formatted})`;\n }\n case \"inner_product\": {\n // sqlite-vec does not support inner product distance\n // See: https://alexgarcia.xyz/sqlite-vec/api-reference.html\n throw new Error(\n \"Inner product distance is not supported by sqlite-vec. Use 'cosine' or 'l2' metrics instead.\",\n );\n }\n default: {\n const _exhaustive: never = metric;\n throw new Error(\"Unsupported vector metric: \" + String(_exhaustive));\n }\n }\n },\n\n formatEmbedding(embedding) {\n // Validate all values are finite numbers\n for (const [index, value] of embedding.entries()) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new TypeError(\n `embedding[${index}] must be a finite number, got: ${value}`,\n );\n }\n }\n // sqlite-vec uses vec_f32() to convert JSON array to binary format\n const asJson = JSON.stringify(embedding);\n return sql`vec_f32(${asJson})`;\n },\n};\n","/**\n * SQL Dialect Module\n *\n * Provides dialect adapters for different SQL databases.\n * Use `getDialect()` to get the appropriate adapter for a dialect name.\n */\n\nexport { postgresDialect } from \"./postgres\";\nexport { sqliteDialect } from \"./sqlite\";\nexport type {\n DialectAdapter,\n DialectCapabilities,\n DialectRecursiveQueryStrategy,\n DialectSetOperationStrategy,\n DialectStandardQueryStrategy,\n DialectVectorPredicateStrategy,\n SqlDialect,\n} from \"./types\";\n\nimport { postgresDialect } from \"./postgres\";\nimport { sqliteDialect } from \"./sqlite\";\nimport { type DialectAdapter, type SqlDialect } from \"./types\";\n\n/**\n * Map of dialect names to their adapters.\n */\nconst DIALECT_ADAPTERS: Record<SqlDialect, DialectAdapter> = {\n sqlite: sqliteDialect,\n postgres: postgresDialect,\n};\n\n/**\n * Gets the dialect adapter for a given dialect name.\n *\n * @param dialect - The dialect name (\"sqlite\" or \"postgres\")\n * @returns The dialect adapter\n *\n * @example\n * ```typescript\n * const adapter = getDialect(\"postgres\");\n * const sql = adapter.jsonExtract(column, \"/name\");\n * ```\n */\nexport function getDialect(dialect: SqlDialect): DialectAdapter {\n return DIALECT_ADAPTERS[dialect];\n}\n\n/**\n * Default dialect used when none is specified.\n */\nexport const DEFAULT_DIALECT: SqlDialect = \"sqlite\";\n","export const NODE_META_KEYS = [\n \"version\",\n \"validFrom\",\n \"validTo\",\n \"createdAt\",\n \"updatedAt\",\n \"deletedAt\",\n] as const;\n\nexport const EDGE_META_KEYS = [\n \"validFrom\",\n \"validTo\",\n \"createdAt\",\n \"updatedAt\",\n \"deletedAt\",\n] as const;\n"]}