@nicia-ai/typegraph 0.25.0 → 0.25.1

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 (69) hide show
  1. package/dist/backend/postgres/index.cjs +92 -44
  2. package/dist/backend/postgres/index.cjs.map +1 -1
  3. package/dist/backend/postgres/index.d.cts +4 -4
  4. package/dist/backend/postgres/index.d.ts +4 -4
  5. package/dist/backend/postgres/index.js +47 -3
  6. package/dist/backend/postgres/index.js.map +1 -1
  7. package/dist/backend/sqlite/index.cjs +13 -13
  8. package/dist/backend/sqlite/index.d.cts +4 -4
  9. package/dist/backend/sqlite/index.d.ts +4 -4
  10. package/dist/backend/sqlite/index.js +3 -3
  11. package/dist/backend/sqlite/libsql.cjs +6 -6
  12. package/dist/backend/sqlite/libsql.d.cts +2 -2
  13. package/dist/backend/sqlite/libsql.d.ts +2 -2
  14. package/dist/backend/sqlite/libsql.js +3 -3
  15. package/dist/backend/sqlite/local.cjs +7 -7
  16. package/dist/backend/sqlite/local.d.cts +2 -2
  17. package/dist/backend/sqlite/local.d.ts +2 -2
  18. package/dist/backend/sqlite/local.js +3 -3
  19. package/dist/{chunk-LVCSL6A3.js → chunk-AAA2CR3P.js} +5 -3
  20. package/dist/chunk-AAA2CR3P.js.map +1 -0
  21. package/dist/{chunk-OJ6IQVZG.js → chunk-CLEUFN2K.js} +48 -4
  22. package/dist/chunk-CLEUFN2K.js.map +1 -0
  23. package/dist/{chunk-ZEMNF3QK.cjs → chunk-CLGC7AQ2.cjs} +78 -34
  24. package/dist/chunk-CLGC7AQ2.cjs.map +1 -0
  25. package/dist/{chunk-FPCOUJSL.js → chunk-CPFR3O7L.js} +2 -2
  26. package/dist/{chunk-FPCOUJSL.js.map → chunk-CPFR3O7L.js.map} +1 -1
  27. package/dist/{chunk-O2P3KAUT.cjs → chunk-CQVNGKU7.cjs} +39 -14
  28. package/dist/chunk-CQVNGKU7.cjs.map +1 -0
  29. package/dist/{chunk-7CDXX3QZ.cjs → chunk-OECDVACY.cjs} +2 -2
  30. package/dist/{chunk-7CDXX3QZ.cjs.map → chunk-OECDVACY.cjs.map} +1 -1
  31. package/dist/{chunk-WI5VRP3X.js → chunk-PSKUWVCB.js} +39 -15
  32. package/dist/chunk-PSKUWVCB.js.map +1 -0
  33. package/dist/{chunk-7W3KAMVQ.cjs → chunk-QMQYK3IF.cjs} +5 -3
  34. package/dist/chunk-QMQYK3IF.cjs.map +1 -0
  35. package/dist/{ddl-DpaeAKPp.d.ts → ddl-BqMmpNor.d.ts} +403 -21
  36. package/dist/{ddl-B2jjLjpR.d.cts → ddl-Bwjh8Hff.d.cts} +403 -21
  37. package/dist/index.cjs +65 -65
  38. package/dist/index.d.cts +7 -7
  39. package/dist/index.d.ts +7 -7
  40. package/dist/index.js +3 -3
  41. package/dist/indexes/index.d.cts +4 -4
  42. package/dist/indexes/index.d.ts +4 -4
  43. package/dist/interchange/index.d.cts +3 -3
  44. package/dist/interchange/index.d.ts +3 -3
  45. package/dist/{manager-BpjBW1JK.d.cts → manager-Cy3dhwYO.d.cts} +7 -2
  46. package/dist/{manager-BKaPQbns.d.ts → manager-sZkU2VPC.d.ts} +7 -2
  47. package/dist/profiler/index.d.cts +5 -5
  48. package/dist/profiler/index.d.ts +5 -5
  49. package/dist/schema/index.cjs +24 -24
  50. package/dist/schema/index.d.cts +4 -4
  51. package/dist/schema/index.d.ts +4 -4
  52. package/dist/schema/index.js +2 -2
  53. package/dist/{sqlite-Myo8e3Lr.d.cts → sqlite-BhFswiAR.d.cts} +1 -1
  54. package/dist/{sqlite-CU3j6rc7.d.ts → sqlite-h6dta1IJ.d.ts} +1 -1
  55. package/dist/{store-De98Lod4.d.ts → store-BS_hehiz.d.ts} +2 -2
  56. package/dist/{store-BAGuOHDh.d.cts → store-CkCvqRUf.d.cts} +2 -2
  57. package/dist/{types-CYga3lZp.d.cts → types-BpgACExN.d.cts} +1 -1
  58. package/dist/{types-BLmJq4wI.d.ts → types-Bz-Pi681.d.ts} +1 -1
  59. package/dist/{types-BNWYZ-0-.d.ts → types-DptZHe-l.d.ts} +9 -0
  60. package/dist/{types--0EslBx5.d.cts → types-WF5ItKQu.d.cts} +9 -0
  61. package/dist/{where-CluR73rs.d.ts → where-C40InMIp.d.ts} +1 -1
  62. package/dist/{where-m1uWsdua.d.cts → where-DZYMiXVq.d.cts} +1 -1
  63. package/package.json +1 -1
  64. package/dist/chunk-7W3KAMVQ.cjs.map +0 -1
  65. package/dist/chunk-LVCSL6A3.js.map +0 -1
  66. package/dist/chunk-O2P3KAUT.cjs.map +0 -1
  67. package/dist/chunk-OJ6IQVZG.js.map +0 -1
  68. package/dist/chunk-WI5VRP3X.js.map +0 -1
  69. package/dist/chunk-ZEMNF3QK.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/backend/drizzle/columns/fulltext.ts","../src/backend/drizzle/columns/vector.ts","../src/backend/drizzle/schema/postgres.ts","../src/backend/drizzle/schema/sqlite.ts","../src/backend/drizzle/ddl.ts","../src/backend/drizzle/row-mappers.ts","../src/backend/drizzle/index-materializations.ts","../src/backend/drizzle/kind-removals.ts","../src/backend/drizzle/operation-backend-core.ts","../src/backend/drizzle/operations/clear.ts","../src/backend/drizzle/operations/collections.ts","../src/backend/drizzle/operations/edges.ts","../src/backend/drizzle/operations/fulltext.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/lru.ts","../src/backend/drizzle/execution/types.ts"],"names":["customType","nodes","edges","uniques","schemaVersions","embeddings","fulltext","DEFAULT_TABLE_NAMES","text","integer","primaryKey","index","uniqueIndex","sql","tables","getSqliteTableConfig","getPgTableConfig","nowIso","timestamp"],"mappings":"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","file":"chunk-PSKUWVCB.js","sourcesContent":["/**\n * Custom Drizzle column types for the PostgreSQL `tsvectorStrategy`\n * fulltext table (`tsvector` + `regconfig`). Lets drizzle-kit\n * introspect the typed fulltext table the same way it introspects\n * `nodes`, `edges`, etc. Alternate strategies (pg_trgm, ParadeDB,\n * pgroonga) carry their own DDL via `FulltextStrategy.generateDdl()`\n * and don't use these columns.\n */\nimport { customType } from \"drizzle-orm/pg-core\";\n\n/**\n * PostgreSQL `regconfig` column type — a registered text-search\n * configuration name (e.g. `'english'::regconfig`). Identical wire\n * format to `text`, but the `regconfig` SQL type lets a generated\n * column reference it inside `to_tsvector(\"language\", \"content\")`\n * as an immutable expression.\n */\nexport const regconfig = customType<{\n data: string;\n driverData: string;\n}>({\n dataType: () => \"regconfig\",\n});\n\n/**\n * PostgreSQL `tsvector` column type. Represents a parsed,\n * dictionary-normalized document; the GIN index that\n * `tsvectorFulltextTable` declares makes `@@ tsquery` lookups cheap.\n *\n * The on-the-wire driver representation is the canonical text form\n * (`'word1':1 'word2':2`); this type is read-only in practice — the\n * value is computed by a `GENERATED ALWAYS AS (...) STORED` clause —\n * so no `toDriver` mapping is provided.\n */\nexport const tsvector = customType<{\n data: string;\n driverData: string;\n}>({\n dataType: () => \"tsvector\",\n});\n","/**\n * Custom Drizzle column type for pgvector's VECTOR type.\n *\n * Provides native support for PostgreSQL vector embeddings without\n * requiring runtime casts in queries.\n *\n * @example\n * ```typescript\n * import { pgTable, text, integer } from \"drizzle-orm/pg-core\";\n * import { vector } from \"./columns/vector\";\n *\n * const embeddings = pgTable(\"embeddings\", {\n * id: text(\"id\").primaryKey(),\n * embedding: vector(\"embedding\"),\n * dimensions: integer(\"dimensions\"),\n * });\n * ```\n */\nimport { customType } from \"drizzle-orm/pg-core\";\n\n/**\n * PostgreSQL vector column type for pgvector extension.\n *\n * Stores embeddings as native VECTOR type, enabling efficient\n * similarity search without runtime casts.\n *\n * The column type is unparameterized (`VECTOR` not `VECTOR(N)`)\n * to support multiple embedding dimensions in a single table.\n * Dimension validation is handled at the application level.\n *\n * @example\n * ```typescript\n * // In table definition\n * embedding: vector(\"embedding\").notNull(),\n *\n * // In queries - no cast needed\n * db.execute(sql`\n * SELECT * FROM embeddings\n * WHERE embedding <=> ${formatVector([0.1, 0.2, 0.3])} < 0.5\n * `);\n * ```\n */\nexport const vector = customType<{\n data: number[];\n driverData: string;\n config: { dimensions?: number };\n}>({\n dataType(config) {\n // Use parameterized type if dimensions specified, otherwise unparameterized\n return config?.dimensions ? `vector(${config.dimensions})` : \"vector\";\n },\n\n toDriver(value: number[]): string {\n // Format as pgvector literal: [1.0,2.0,3.0]\n return `[${value.join(\",\")}]`;\n },\n\n fromDriver(value: string): number[] {\n // pgvector returns '[1,2,3]' format\n // Handle both string and already-parsed array (some drivers differ)\n if (Array.isArray(value)) {\n return value as number[];\n }\n // Parse the string representation\n const content = value.slice(1, -1); // Remove [ and ]\n if (content === \"\") {\n return [];\n }\n return content.split(\",\").map((s) => Number.parseFloat(s.trim()));\n },\n});\n\n/**\n * Formats a number array as a pgvector literal string.\n *\n * Use this when building raw SQL queries with embeddings.\n *\n * @example\n * ```typescript\n * const embedding = [0.1, 0.2, 0.3];\n * db.execute(sql`\n * SELECT * FROM embeddings\n * WHERE embedding <=> ${formatVector(embedding)}::vector < 0.5\n * `);\n * ```\n */\nexport function formatVector(embedding: readonly number[]): string {\n return `[${embedding.join(\",\")}]`;\n}\n","/**\n * Drizzle PostgreSQL schema for TypeGraph.\n *\n * Provides table definitions that can be customized via the factory function.\n * Uses PostgreSQL-native types: JSONB, TIMESTAMPTZ, BOOLEAN, VECTOR.\n *\n * The embeddings table uses pgvector's native VECTOR type. Ensure the\n * extension is enabled before creating tables:\n *\n * ```sql\n * CREATE EXTENSION IF NOT EXISTS vector;\n * ```\n *\n * @example\n * ```typescript\n * // Default table names\n * import { tables } from \"@nicia-ai/typegraph/postgres\";\n *\n * // Custom table names\n * import { createPostgresTables } from \"@nicia-ai/typegraph/postgres\";\n * const tables = createPostgresTables({\n * nodes: \"myapp_nodes\",\n * edges: \"myapp_edges\",\n * });\n * ```\n */\nimport { sql } from \"drizzle-orm\";\nimport {\n boolean,\n index,\n integer,\n jsonb,\n pgTable,\n primaryKey,\n text,\n timestamp,\n uniqueIndex,\n} from \"drizzle-orm/pg-core\";\n\nimport {\n buildPostgresEdgeIndexBuilders,\n buildPostgresNodeIndexBuilders,\n type IndexDeclaration,\n} from \"../../../indexes\";\nimport { regconfig, tsvector } from \"../columns/fulltext\";\nimport { vector } from \"../columns/vector\";\n\n/**\n * Table name configuration.\n */\nexport type PostgresTableNames = Readonly<{\n nodes: string;\n edges: string;\n uniques: string;\n schemaVersions: string;\n embeddings: string;\n fulltext: string;\n indexMaterializations: string;\n kindRemovals: string;\n reconciliationMarkers: string;\n}>;\n\nexport type CreatePostgresTablesOptions = Readonly<{\n /**\n * Additional TypeGraph indexes to include in the Drizzle schema.\n *\n * These become first-class Drizzle indexes, so drizzle-kit migrations will\n * pick them up automatically.\n */\n indexes?: readonly IndexDeclaration[] | undefined;\n}>;\n\nconst DEFAULT_TABLE_NAMES: PostgresTableNames = {\n nodes: \"typegraph_nodes\",\n edges: \"typegraph_edges\",\n uniques: \"typegraph_node_uniques\",\n schemaVersions: \"typegraph_schema_versions\",\n embeddings: \"typegraph_node_embeddings\",\n fulltext: \"typegraph_node_fulltext\",\n indexMaterializations: \"typegraph_index_materializations\",\n kindRemovals: \"typegraph_kind_removals\",\n reconciliationMarkers: \"typegraph_reconciliation_markers\",\n};\n\n/**\n * Creates PostgreSQL table definitions with customizable table names.\n * Index names are derived from table names.\n */\nexport function createPostgresTables(\n names: Partial<PostgresTableNames> = {},\n options: CreatePostgresTablesOptions = {},\n) {\n const n: PostgresTableNames = { ...DEFAULT_TABLE_NAMES, ...names };\n const indexes = options.indexes ?? [];\n\n const nodes = pgTable(\n n.nodes,\n {\n graphId: text(\"graph_id\").notNull(),\n kind: text(\"kind\").notNull(),\n id: text(\"id\").notNull(),\n props: jsonb(\"props\").notNull(),\n version: integer(\"version\").notNull().default(1),\n validFrom: timestamp(\"valid_from\", { withTimezone: true }),\n validTo: timestamp(\"valid_to\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.kind, t.id] }),\n index(`${n.nodes}_kind_idx`).on(t.graphId, t.kind),\n index(`${n.nodes}_kind_created_idx`).on(\n t.graphId,\n t.kind,\n t.deletedAt,\n t.createdAt,\n ),\n index(`${n.nodes}_deleted_idx`).on(t.graphId, t.deletedAt),\n index(`${n.nodes}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),\n ...buildPostgresNodeIndexBuilders(t, indexes),\n ],\n );\n\n const edges = pgTable(\n n.edges,\n {\n graphId: text(\"graph_id\").notNull(),\n id: text(\"id\").notNull(),\n kind: text(\"kind\").notNull(),\n fromKind: text(\"from_kind\").notNull(),\n fromId: text(\"from_id\").notNull(),\n toKind: text(\"to_kind\").notNull(),\n toId: text(\"to_id\").notNull(),\n props: jsonb(\"props\").notNull(),\n validFrom: timestamp(\"valid_from\", { withTimezone: true }),\n validTo: timestamp(\"valid_to\", { withTimezone: true }),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.id] }),\n index(`${n.edges}_kind_idx`).on(t.graphId, t.kind),\n // Directional traversal index (outgoing): supports endpoint lookups\n // and extra filtering by edge kind / target kind.\n index(`${n.edges}_from_idx`).on(\n t.graphId,\n t.fromKind,\n t.fromId,\n t.kind,\n t.toKind,\n t.deletedAt,\n t.validTo,\n ),\n // Directional traversal index (incoming): mirrors from_idx for reverse traversals.\n index(`${n.edges}_to_idx`).on(\n t.graphId,\n t.toKind,\n t.toId,\n t.kind,\n t.fromKind,\n t.deletedAt,\n t.validTo,\n ),\n index(`${n.edges}_kind_created_idx`).on(\n t.graphId,\n t.kind,\n t.deletedAt,\n t.createdAt,\n ),\n index(`${n.edges}_deleted_idx`).on(t.graphId, t.deletedAt),\n index(`${n.edges}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),\n index(`${n.edges}_cardinality_idx`).on(\n t.graphId,\n t.kind,\n t.fromKind,\n t.fromId,\n t.validTo,\n ),\n ...buildPostgresEdgeIndexBuilders(t, indexes),\n ],\n );\n\n const uniques = pgTable(\n n.uniques,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n constraintName: text(\"constraint_name\").notNull(),\n key: text(\"key\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n concreteKind: text(\"concrete_kind\").notNull(),\n deletedAt: timestamp(\"deleted_at\", { withTimezone: true }),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.nodeKind, t.constraintName, t.key],\n }),\n index(`${n.uniques}_node_idx`).on(t.graphId, t.concreteKind, t.nodeId),\n ],\n );\n\n const schemaVersions = pgTable(\n n.schemaVersions,\n {\n graphId: text(\"graph_id\").notNull(),\n version: integer(\"version\").notNull(),\n schemaHash: text(\"schema_hash\").notNull(),\n schemaDoc: jsonb(\"schema_doc\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n isActive: boolean(\"is_active\").notNull().default(false),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.version] }),\n index(`${n.schemaVersions}_active_idx`).on(t.graphId, t.isActive),\n // Partial unique index enforcing the \"at most one active version\n // per graph\" invariant at the storage layer. Defense in depth\n // against buggy backend implementations or out-of-band writes.\n // Forces the deactivate-then-activate ordering used by\n // `commitSchemaVersion` and `setActiveVersion`.\n uniqueIndex(`${n.schemaVersions}_one_active_per_graph_idx`)\n .on(t.graphId)\n .where(sql`${t.isActive} = TRUE`),\n ],\n );\n\n /**\n * Embeddings table for vector search.\n *\n * Stores embeddings using pgvector's native VECTOR type for efficient\n * similarity operations without runtime casts.\n *\n * The column uses unparameterized VECTOR type to support multiple\n * embedding dimensions in a single table. Dimension validation is\n * handled at the application level via the `dimensions` column.\n *\n * Requires pgvector extension:\n * CREATE EXTENSION IF NOT EXISTS vector;\n *\n * Vector indices (HNSW, IVFFlat) are created dynamically based on the\n * configured metric and dimensions.\n */\n const embeddings = pgTable(\n n.embeddings,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n fieldPath: text(\"field_path\").notNull(),\n /** Embedding vector stored as native pgvector type */\n embedding: vector(\"embedding\").notNull(),\n /** Number of dimensions (for validation) */\n dimensions: integer(\"dimensions\").notNull(),\n createdAt: timestamp(\"created_at\", { withTimezone: true }).notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.nodeKind, t.nodeId, t.fieldPath],\n }),\n // Index for looking up embeddings by node\n index(`${n.embeddings}_node_idx`).on(\n t.graphId,\n t.nodeKind,\n t.nodeId,\n ),\n // Index for filtering by kind and field (used in vector search)\n index(`${n.embeddings}_kind_field_idx`).on(\n t.graphId,\n t.nodeKind,\n t.fieldPath,\n ),\n ],\n );\n\n /**\n * Per-deployment record of which declared indexes have been\n * materialized against this database. Owned and written by\n * `store.materializeIndexes()`. Keyed on `index_name` because SQL\n * index names are physical, database-global identifiers — `graphId`\n * is provenance, not identity.\n */\n const indexMaterializations = pgTable(\n n.indexMaterializations,\n {\n indexName: text(\"index_name\").notNull(),\n graphId: text(\"graph_id\").notNull(),\n entity: text(\"entity\").notNull(),\n kind: text(\"kind\").notNull(),\n signature: text(\"signature\").notNull(),\n schemaVersion: integer(\"schema_version\").notNull(),\n materializedAt: timestamp(\"materialized_at\", { withTimezone: true }),\n lastAttemptedAt: timestamp(\"last_attempted_at\", {\n withTimezone: true,\n }).notNull(),\n lastError: text(\"last_error\"),\n },\n (t) => [primaryKey({ columns: [t.indexName] })],\n );\n\n /**\n * Per-deployment record of extension kinds removed via\n * `store.removeKinds()` whose data has not yet been cleaned up by\n * `store.materializeRemovals()`. Same per-deployment rationale as\n * `indexMaterializations`: two replicas of the same `schema_doc` may\n * be at different stages of the data-cleanup phase. Keyed on\n * `(graph_id, kind_name, entity, schema_version)` — each remove\n * operation is its own row. `entity` separates a node and an edge\n * that share a kind name; the `schema_version` discriminator keeps a\n * re-add-then-re-remove cycle from collapsing onto the prior row,\n * where the COALESCE-on-failure rule would preserve the earlier\n * `removed_at` and silently skip the new pending cleanup.\n */\n const kindRemovals = pgTable(\n n.kindRemovals,\n {\n graphId: text(\"graph_id\").notNull(),\n kindName: text(\"kind_name\").notNull(),\n entity: text(\"entity\").notNull(),\n schemaVersion: integer(\"schema_version\").notNull(),\n removedAt: timestamp(\"removed_at\", { withTimezone: true }),\n lastAttemptedAt: timestamp(\"last_attempted_at\", {\n withTimezone: true,\n }).notNull(),\n lastError: text(\"last_error\"),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.kindName, t.entity, t.schemaVersion],\n }),\n ],\n );\n\n /**\n * Per-deployment high-water mark for `materializeRemovals`\n * reconciliation: the schema version up to which the historical\n * \"did every removal land in `kindRemovals`?\" walk has been\n * verified. Subsequent calls walk only versions newer than this\n * marker, instead of re-walking from version 1 every time.\n */\n const reconciliationMarkers = pgTable(\n n.reconciliationMarkers,\n {\n graphId: text(\"graph_id\").notNull(),\n reconciledToVersion: integer(\"reconciled_to_version\").notNull(),\n },\n (t) => [primaryKey({ columns: [t.graphId] })],\n );\n\n /**\n * Drizzle pg-core table for the default `tsvectorStrategy` so\n * drizzle-kit can introspect the fulltext table alongside the\n * others. Mirrors `tsvectorStrategy.generateDdl()` — the typed\n * shape and the strategy DDL must stay in sync (drift sentinel\n * lives in `tests/typed-fulltext-table.test.ts`).\n *\n * Why `regconfig` + GENERATED: `to_tsvector(\"language\", \"content\")`\n * needs an immutable language to qualify for use inside a\n * `STORED` generated column, so Postgres can own the\n * `content → tsv` invariant.\n *\n * Alternate strategies (pg_trgm, ParadeDB, pgroonga) bring their\n * own DDL; `generatePostgresDDL` skips this typed table for them\n * and defers to `FulltextStrategy.generateDdl()`. Drizzle-kit\n * consumers on non-default strategies must override\n * `tables.fulltext` in their schema barrel.\n */\n const fulltext = pgTable(\n n.fulltext,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n content: text(\"content\").notNull(),\n language: regconfig(\"language\").notNull(),\n tsv: tsvector(\"tsv\")\n .generatedAlwaysAs(sql`to_tsvector(\"language\", \"content\")`)\n .notNull(),\n updatedAt: timestamp(\"updated_at\", { withTimezone: true }).notNull(),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.nodeKind, t.nodeId] }),\n index(`${n.fulltext}_tsv_idx`).using(\"gin\", t.tsv),\n index(`${n.fulltext}_kind_idx`).on(t.graphId, t.nodeKind),\n ],\n );\n\n return {\n nodes,\n edges,\n uniques,\n schemaVersions,\n embeddings,\n indexMaterializations,\n kindRemovals,\n reconciliationMarkers,\n fulltext,\n fulltextTableName: n.fulltext,\n } as const;\n}\n\n/**\n * Default tables with standard TypeGraph table names.\n */\nexport const tables = createPostgresTables();\n\n/**\n * Convenience exports for default tables.\n */\nexport const {\n nodes,\n edges,\n uniques,\n schemaVersions,\n embeddings,\n fulltext,\n} = tables;\n\n/**\n * Type representing the tables object returned by createPostgresTables.\n */\nexport type PostgresTables = ReturnType<typeof createPostgresTables>;\n","/**\n * Drizzle SQLite schema for TypeGraph.\n *\n * Provides table definitions that can be customized via the factory function.\n * Users import these tables into their Drizzle schema and use drizzle-kit\n * for migrations.\n *\n * @example\n * ```typescript\n * // Default table names\n * import { tables } from \"@nicia-ai/typegraph/sqlite\";\n *\n * // Custom table names\n * import { createSqliteTables } from \"@nicia-ai/typegraph/sqlite\";\n * const tables = createSqliteTables({\n * nodes: \"myapp_nodes\",\n * edges: \"myapp_edges\",\n * });\n * ```\n */\nimport { sql } from \"drizzle-orm\";\nimport {\n blob,\n index,\n integer,\n primaryKey,\n sqliteTable,\n text,\n uniqueIndex,\n} from \"drizzle-orm/sqlite-core\";\n\nimport {\n buildSqliteEdgeIndexBuilders,\n buildSqliteNodeIndexBuilders,\n type IndexDeclaration,\n} from \"../../../indexes\";\n\n/**\n * Table name configuration.\n */\nexport type SqliteTableNames = Readonly<{\n nodes: string;\n edges: string;\n uniques: string;\n schemaVersions: string;\n embeddings: string;\n fulltext: string;\n indexMaterializations: string;\n kindRemovals: string;\n reconciliationMarkers: string;\n}>;\n\nexport type CreateSqliteTablesOptions = Readonly<{\n /**\n * Additional TypeGraph indexes to include in the Drizzle schema.\n *\n * These become first-class Drizzle indexes, so drizzle-kit migrations will\n * pick them up automatically.\n */\n indexes?: readonly IndexDeclaration[] | undefined;\n}>;\n\nconst DEFAULT_TABLE_NAMES: SqliteTableNames = {\n nodes: \"typegraph_nodes\",\n edges: \"typegraph_edges\",\n uniques: \"typegraph_node_uniques\",\n schemaVersions: \"typegraph_schema_versions\",\n embeddings: \"typegraph_node_embeddings\",\n fulltext: \"typegraph_node_fulltext\",\n indexMaterializations: \"typegraph_index_materializations\",\n kindRemovals: \"typegraph_kind_removals\",\n reconciliationMarkers: \"typegraph_reconciliation_markers\",\n};\n\n/**\n * Creates SQLite table definitions with customizable table names.\n * Index names are derived from table names.\n */\nexport function createSqliteTables(\n names: Partial<SqliteTableNames> = {},\n options: CreateSqliteTablesOptions = {},\n) {\n const n: SqliteTableNames = { ...DEFAULT_TABLE_NAMES, ...names };\n const indexes = options.indexes ?? [];\n\n const nodes = sqliteTable(\n n.nodes,\n {\n graphId: text(\"graph_id\").notNull(),\n kind: text(\"kind\").notNull(),\n id: text(\"id\").notNull(),\n props: text(\"props\").notNull(),\n version: integer(\"version\").notNull().default(1),\n validFrom: text(\"valid_from\"),\n validTo: text(\"valid_to\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n deletedAt: text(\"deleted_at\"),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.kind, t.id] }),\n index(`${n.nodes}_kind_idx`).on(t.graphId, t.kind),\n index(`${n.nodes}_kind_created_idx`).on(\n t.graphId,\n t.kind,\n t.deletedAt,\n t.createdAt,\n ),\n index(`${n.nodes}_deleted_idx`).on(t.graphId, t.deletedAt),\n index(`${n.nodes}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),\n ...buildSqliteNodeIndexBuilders(t, indexes),\n ],\n );\n\n const edges = sqliteTable(\n n.edges,\n {\n graphId: text(\"graph_id\").notNull(),\n id: text(\"id\").notNull(),\n kind: text(\"kind\").notNull(),\n fromKind: text(\"from_kind\").notNull(),\n fromId: text(\"from_id\").notNull(),\n toKind: text(\"to_kind\").notNull(),\n toId: text(\"to_id\").notNull(),\n props: text(\"props\").notNull(),\n validFrom: text(\"valid_from\"),\n validTo: text(\"valid_to\"),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n deletedAt: text(\"deleted_at\"),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.id] }),\n index(`${n.edges}_kind_idx`).on(t.graphId, t.kind),\n // Directional traversal index (outgoing): supports endpoint lookups\n // and extra filtering by edge kind / target kind.\n index(`${n.edges}_from_idx`).on(\n t.graphId,\n t.fromKind,\n t.fromId,\n t.kind,\n t.toKind,\n t.deletedAt,\n t.validTo,\n ),\n // Directional traversal index (incoming): mirrors from_idx for reverse traversals.\n index(`${n.edges}_to_idx`).on(\n t.graphId,\n t.toKind,\n t.toId,\n t.kind,\n t.fromKind,\n t.deletedAt,\n t.validTo,\n ),\n index(`${n.edges}_kind_created_idx`).on(\n t.graphId,\n t.kind,\n t.deletedAt,\n t.createdAt,\n ),\n index(`${n.edges}_deleted_idx`).on(t.graphId, t.deletedAt),\n index(`${n.edges}_valid_idx`).on(t.graphId, t.validFrom, t.validTo),\n index(`${n.edges}_cardinality_idx`).on(\n t.graphId,\n t.kind,\n t.fromKind,\n t.fromId,\n t.validTo,\n ),\n ...buildSqliteEdgeIndexBuilders(t, indexes),\n ],\n );\n\n const uniques = sqliteTable(\n n.uniques,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n constraintName: text(\"constraint_name\").notNull(),\n key: text(\"key\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n concreteKind: text(\"concrete_kind\").notNull(),\n deletedAt: text(\"deleted_at\"),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.nodeKind, t.constraintName, t.key],\n }),\n index(`${n.uniques}_node_idx`).on(t.graphId, t.concreteKind, t.nodeId),\n ],\n );\n\n const schemaVersions = sqliteTable(\n n.schemaVersions,\n {\n graphId: text(\"graph_id\").notNull(),\n version: integer(\"version\").notNull(),\n schemaHash: text(\"schema_hash\").notNull(),\n schemaDoc: text(\"schema_doc\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n isActive: integer(\"is_active\", { mode: \"boolean\" })\n .notNull()\n .default(false),\n },\n (t) => [\n primaryKey({ columns: [t.graphId, t.version] }),\n index(`${n.schemaVersions}_active_idx`).on(t.graphId, t.isActive),\n // Partial unique index enforcing the \"at most one active version\n // per graph\" invariant at the storage layer. Defense in depth\n // against buggy backend implementations or out-of-band writes.\n // Forces the deactivate-then-activate ordering used by\n // `commitSchemaVersion` and `setActiveVersion`.\n uniqueIndex(`${n.schemaVersions}_one_active_per_graph_idx`)\n .on(t.graphId)\n .where(sql`${t.isActive} = 1`),\n ],\n );\n\n /**\n * Embeddings table for vector search.\n *\n * Stores embeddings as BLOB (for sqlite-vec binary format) or as JSON text.\n * When sqlite-vec extension is loaded, the BLOB column can be used with\n * vec_f32() for similarity operations.\n */\n const embeddings = sqliteTable(\n n.embeddings,\n {\n graphId: text(\"graph_id\").notNull(),\n nodeKind: text(\"node_kind\").notNull(),\n nodeId: text(\"node_id\").notNull(),\n fieldPath: text(\"field_path\").notNull(),\n /**\n * Embedding vector.\n * Stored as BLOB for sqlite-vec binary format, or JSON text for fallback.\n * For sqlite-vec: use vec_f32() to convert JSON array to binary.\n */\n embedding: blob(\"embedding\", { mode: \"buffer\" }).notNull(),\n /** Number of dimensions (for validation) */\n dimensions: integer(\"dimensions\").notNull(),\n createdAt: text(\"created_at\").notNull(),\n updatedAt: text(\"updated_at\").notNull(),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.nodeKind, t.nodeId, t.fieldPath],\n }),\n // Index for looking up embeddings by node\n index(`${n.embeddings}_node_idx`).on(\n t.graphId,\n t.nodeKind,\n t.nodeId,\n ),\n // Index for filtering by kind and field (used in vector search)\n index(`${n.embeddings}_kind_field_idx`).on(\n t.graphId,\n t.nodeKind,\n t.fieldPath,\n ),\n ],\n );\n\n /**\n * Per-deployment record of which declared indexes have been\n * materialized against this database. Owned and written by\n * `store.materializeIndexes()`. Keyed on `index_name` because SQL\n * index names are physical, database-global identifiers — `graphId`\n * is provenance, not identity.\n */\n const indexMaterializations = sqliteTable(\n n.indexMaterializations,\n {\n indexName: text(\"index_name\").notNull(),\n graphId: text(\"graph_id\").notNull(),\n entity: text(\"entity\").notNull(),\n kind: text(\"kind\").notNull(),\n signature: text(\"signature\").notNull(),\n schemaVersion: integer(\"schema_version\").notNull(),\n materializedAt: text(\"materialized_at\"),\n lastAttemptedAt: text(\"last_attempted_at\").notNull(),\n lastError: text(\"last_error\"),\n },\n (t) => [primaryKey({ columns: [t.indexName] })],\n );\n\n /**\n * Per-deployment record of extension kinds removed via\n * `store.removeKinds()` whose data has not yet been cleaned up by\n * `store.materializeRemovals()`. Keyed on `(graph_id, kind_name,\n * entity, schema_version)` — each remove operation is its own row.\n * `entity` separates a node and an edge that share a kind name; the\n * `schema_version` discriminator keeps a re-add-then-re-remove cycle\n * (Foo removed at v=N, re-added, then removed again at v=N+2) from\n * collapsing onto the prior row, where the COALESCE-on-failure rule\n * would preserve the earlier `removed_at` and silently skip the new\n * pending cleanup. `removed_at` is null until the data-cleanup pass\n * succeeds; the pending set is \"rows where removed_at IS NULL\".\n */\n const kindRemovals = sqliteTable(\n n.kindRemovals,\n {\n graphId: text(\"graph_id\").notNull(),\n kindName: text(\"kind_name\").notNull(),\n entity: text(\"entity\").notNull(),\n schemaVersion: integer(\"schema_version\").notNull(),\n removedAt: text(\"removed_at\"),\n lastAttemptedAt: text(\"last_attempted_at\").notNull(),\n lastError: text(\"last_error\"),\n },\n (t) => [\n primaryKey({\n columns: [t.graphId, t.kindName, t.entity, t.schemaVersion],\n }),\n ],\n );\n\n /**\n * Per-deployment high-water mark for the `materializeRemovals`\n * reconciliation walk. One row per `graph_id` carrying the schema\n * version up to which the historical \"did every removal land in\n * `kindRemovals`?\" walk has been verified. Lets subsequent calls\n * skip already-checked transitions instead of re-walking from\n * version 1 every time.\n */\n const reconciliationMarkers = sqliteTable(\n n.reconciliationMarkers,\n {\n graphId: text(\"graph_id\").notNull(),\n reconciledToVersion: integer(\"reconciled_to_version\").notNull(),\n },\n (t) => [primaryKey({ columns: [t.graphId] })],\n );\n\n return {\n nodes,\n edges,\n uniques,\n schemaVersions,\n embeddings,\n indexMaterializations,\n kindRemovals,\n reconciliationMarkers,\n /**\n * The fulltext storage is a FTS5 virtual table which Drizzle cannot\n * represent. DDL is emitted as raw SQL and operations query it via\n * `sql.raw()`.\n */\n fulltextTableName: n.fulltext,\n } as const;\n}\n\n/**\n * Default tables with standard TypeGraph table names.\n */\nexport const tables = createSqliteTables();\n\n/**\n * Convenience exports for default tables.\n */\nexport const { nodes, edges, uniques, schemaVersions, embeddings } = tables;\n\n/**\n * Type representing the tables object returned by createSqliteTables.\n */\nexport type SqliteTables = ReturnType<typeof createSqliteTables>;\n","/**\n * DDL generation utilities for TypeGraph backends.\n *\n * Provides utilities for generating DDL statements from Drizzle\n * table definitions. This ensures migrations match production schema.\n */\nimport {\n getTableConfig as getPgTableConfig,\n type PgColumn,\n type PgTableWithColumns,\n} from \"drizzle-orm/pg-core\";\nimport {\n getTableConfig as getSqliteTableConfig,\n type SQLiteColumn,\n type SQLiteTableWithColumns,\n} from \"drizzle-orm/sqlite-core\";\n\nimport {\n fts5Strategy,\n type FulltextStrategy,\n tsvectorStrategy,\n} from \"../../query/dialect\";\nimport { type PostgresTables, tables as postgresTables } from \"./schema/postgres\";\nimport { type SqliteTables, tables as sqliteTables } from \"./schema/sqlite\";\n\n// Narrow interfaces for Drizzle column internals not exposed in public types.\n// These are accessed only in DDL generation for migration scripts.\ntype TimestampColumnConfig = Readonly<{\n config?: Readonly<{ withTimezone?: boolean }>;\n}>;\ntype CustomColumnType = Readonly<{\n getSQLType?: () => string;\n}>;\n\n// ============================================================\n// SQLite DDL Generation\n// ============================================================\n\n/**\n * Maps Drizzle column types to SQLite types.\n */\nfunction getSqliteColumnType(column: SQLiteColumn): string {\n switch (column.columnType) {\n case \"SQLiteText\": {\n return \"TEXT\";\n }\n case \"SQLiteInteger\": {\n return \"INTEGER\";\n }\n case \"SQLiteReal\": {\n return \"REAL\";\n }\n case \"SQLiteBlob\": {\n return \"BLOB\";\n }\n default: {\n return \"TEXT\";\n }\n }\n}\n\n/**\n * Formats a default value for SQLite.\n */\nfunction formatDefaultValue(value: unknown): string {\n if (value === null) return \"NULL\";\n if (typeof value === \"string\") return `'${value}'`;\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return value ? \"1\" : \"0\";\n // For other types, use JSON.stringify to avoid [object Object]\n return JSON.stringify(value);\n}\n\n/**\n * Generates CREATE TABLE SQL from a Drizzle SQLite table definition.\n */\nexport function generateSqliteCreateTableSQL(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n table: SQLiteTableWithColumns<any>,\n): string {\n const config = getSqliteTableConfig(table);\n const columnDefs: string[] = [];\n\n // Generate column definitions\n for (const column of config.columns) {\n const parts: string[] = [\n `\"${column.name}\"`,\n getSqliteColumnType(column as SQLiteColumn),\n ];\n\n if (column.notNull) {\n parts.push(\"NOT NULL\");\n }\n\n if (column.hasDefault && column.default !== undefined) {\n parts.push(`DEFAULT ${formatDefaultValue(column.default)}`);\n }\n\n columnDefs.push(parts.join(\" \"));\n }\n\n // Add primary key constraint\n const pk = config.primaryKeys[0];\n if (pk) {\n const pkColumns = pk.columns.map((c) => `\"${c.name}\"`).join(\", \");\n columnDefs.push(`PRIMARY KEY (${pkColumns})`);\n }\n\n return `CREATE TABLE IF NOT EXISTS \"${config.name}\" (\\n ${columnDefs.join(\",\\n \")}\\n);`;\n}\n\n/**\n * Gets the column name from an index column, handling both Column and SQL types.\n */\nfunction renderIndexColumn(col: unknown): string {\n if (col && typeof col === \"object\" && \"name\" in col) {\n return `\"${(col as { name: string }).name}\"`;\n }\n\n const sql = tryInlineSql(col);\n if (sql !== undefined) {\n return sql;\n }\n\n return \"unknown\";\n}\n\nfunction tryInlineSql(value: unknown): string | undefined {\n if (value && typeof value === \"object\" && \"getSQL\" in value) {\n const maybe = value as { getSQL?: () => unknown };\n if (typeof maybe.getSQL === \"function\") {\n return inlineSql(maybe.getSQL());\n }\n }\n\n return inlineSql(value);\n}\n\nfunction flattenSqlChunk(chunk: unknown): string {\n if (typeof chunk === \"string\") {\n return chunk;\n }\n\n if (typeof chunk === \"object\" && chunk !== null) {\n // Drizzle column references (SQLiteText, PgText, etc.) carry the\n // column name directly. Match these BEFORE the `getSQL` fallback —\n // a column's `.getSQL()` wraps the column back inside a SQL object\n // that points to itself, which would recurse infinitely.\n if (\n \"name\" in chunk &&\n typeof (chunk).name === \"string\"\n ) {\n return `\"${(chunk as { name: string }).name}\"`;\n }\n\n // Drizzle's StringChunk stores its literal as `.value`, usually as a\n // one-element array ([\"\"], [\"SELECT \"]) but sometimes as a plain string.\n if (\"value\" in chunk) {\n const value = (chunk).value;\n if (typeof value === \"string\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((part) => flattenSqlChunk(part)).join(\"\");\n }\n }\n\n if (\n \"queryChunks\" in chunk &&\n Array.isArray((chunk).queryChunks)\n ) {\n return (chunk as { queryChunks: readonly unknown[] }).queryChunks\n .map((part) => flattenSqlChunk(part))\n .join(\"\");\n }\n\n if (\"getSQL\" in chunk) {\n const maybe = chunk as { getSQL?: () => unknown };\n if (typeof maybe.getSQL === \"function\") {\n return flattenSqlChunk(maybe.getSQL());\n }\n }\n }\n\n throw new Error(`Unable to inline SQL chunk: ${String(chunk)}`);\n}\n\nfunction inlineSql(value: unknown): string | undefined {\n try {\n return flattenSqlChunk(value);\n } catch {\n return undefined;\n }\n}\n\nfunction inlineSqlOrThrow(value: unknown, context: string): string {\n const inlined = inlineSql(value);\n if (inlined === undefined) {\n throw new Error(`Unable to inline SQL for ${context}`);\n }\n return inlined;\n}\n\n/**\n * Generates CREATE INDEX SQL statements from a Drizzle SQLite table definition.\n */\nfunction generateSqliteCreateIndexSQL(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n table: SQLiteTableWithColumns<any>,\n): string[] {\n const config = getSqliteTableConfig(table);\n const statements: string[] = [];\n\n for (const index of config.indexes) {\n const indexConfig = index.config;\n const columns = indexConfig.columns\n .map((c) => renderIndexColumn(c))\n .join(\", \");\n const unique = indexConfig.unique ? \"UNIQUE \" : \"\";\n const where =\n indexConfig.where ?\n ` WHERE ${inlineSqlOrThrow(indexConfig.where, `SQLite index \"${indexConfig.name}\" WHERE clause`)}`\n : \"\";\n\n statements.push(\n `CREATE ${unique}INDEX IF NOT EXISTS \"${indexConfig.name}\" ON \"${config.name}\" (${columns})${where};`,\n );\n }\n\n return statements;\n}\n\n/**\n * Returns true for a value that looks like a Drizzle SQLite table.\n * The schema module exposes non-table values (e.g. `fulltextTableName: string`)\n * alongside the Drizzle tables, and the DDL generators must skip them.\n */\nfunction isSqliteTable(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): value is SQLiteTableWithColumns<any> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n // Drizzle tables are always objects; strings are our escape hatch.\n typeof value !== \"string\"\n );\n}\n\n/**\n * Generates all DDL statements for the given SQLite tables.\n */\nexport function generateSqliteDDL(\n tables: SqliteTables = sqliteTables,\n fulltextStrategy: FulltextStrategy = fts5Strategy,\n): string[] {\n const statements: string[] = [];\n\n // Generate in dependency order (tables first, then indexes)\n for (const table of Object.values(tables)) {\n if (!isSqliteTable(table)) continue;\n statements.push(generateSqliteCreateTableSQL(table));\n }\n\n for (const table of Object.values(tables)) {\n if (!isSqliteTable(table)) continue;\n statements.push(...generateSqliteCreateIndexSQL(table));\n }\n\n // Fulltext table is a virtual table; emit its DDL last.\n statements.push(...fulltextStrategy.generateDdl(tables.fulltextTableName));\n\n return statements;\n}\n\n/**\n * Generates a single SQL string for SQLite migrations.\n * Convenience function that joins all DDL statements.\n */\nexport function generateSqliteMigrationSQL(\n tables: SqliteTables = sqliteTables,\n fulltextStrategy: FulltextStrategy = fts5Strategy,\n): string {\n return generateSqliteDDL(tables, fulltextStrategy).join(\"\\n\\n\");\n}\n\n// ============================================================\n// PostgreSQL DDL Generation\n// ============================================================\n\n/**\n * Maps Drizzle column types to PostgreSQL types.\n */\nfunction getPgColumnType(column: PgColumn): string {\n switch (column.columnType) {\n case \"PgText\": {\n return \"TEXT\";\n }\n case \"PgInteger\": {\n return \"INTEGER\";\n }\n case \"PgBoolean\": {\n return \"BOOLEAN\";\n }\n case \"PgJsonb\": {\n return \"JSONB\";\n }\n case \"PgTimestamp\": {\n return (column as unknown as TimestampColumnConfig).config?.withTimezone ?\n \"TIMESTAMPTZ\"\n : \"TIMESTAMP\";\n }\n case \"PgReal\": {\n return \"REAL\";\n }\n case \"PgDoublePrecision\": {\n return \"DOUBLE PRECISION\";\n }\n case \"PgCustomColumn\": {\n const dataType = (column as unknown as CustomColumnType).getSQLType?.();\n return dataType ?? \"TEXT\";\n }\n default: {\n return \"TEXT\";\n }\n }\n}\n\n/**\n * Formats a default value for PostgreSQL.\n */\nfunction formatPgDefaultValue(value: unknown): string {\n if (value === null) return \"NULL\";\n if (typeof value === \"string\") return `'${value}'`;\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n // For other types, use JSON.stringify to avoid [object Object]\n return JSON.stringify(value);\n}\n\n/**\n * Generates CREATE TABLE SQL from a Drizzle PostgreSQL table definition.\n */\nexport function generatePgCreateTableSQL(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n table: PgTableWithColumns<any>,\n): string {\n const config = getPgTableConfig(table);\n const columnDefs: string[] = [];\n\n // Generate column definitions\n for (const column of config.columns) {\n const parts: string[] = [\n `\"${column.name}\"`,\n getPgColumnType(column),\n ];\n\n if (column.notNull) {\n parts.push(\"NOT NULL\");\n }\n\n if (column.hasDefault && column.default !== undefined) {\n parts.push(`DEFAULT ${formatPgDefaultValue(column.default)}`);\n }\n\n columnDefs.push(parts.join(\" \"));\n }\n\n // Add primary key constraint\n const pk = config.primaryKeys[0];\n if (pk) {\n const pkColumns = pk.columns.map((c) => `\"${c.name}\"`).join(\", \");\n columnDefs.push(`PRIMARY KEY (${pkColumns})`);\n }\n\n return `CREATE TABLE IF NOT EXISTS \"${config.name}\" (\\n ${columnDefs.join(\",\\n \")}\\n);`;\n}\n\n/**\n * Generates CREATE INDEX SQL statements from a Drizzle PostgreSQL table definition.\n */\nfunction generatePgCreateIndexSQL(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n table: PgTableWithColumns<any>,\n): string[] {\n const config = getPgTableConfig(table);\n const statements: string[] = [];\n\n for (const index of config.indexes) {\n const indexConfig = index.config;\n const columns = indexConfig.columns\n .map((c) => renderIndexColumn(c))\n .join(\", \");\n const unique = indexConfig.unique ? \"UNIQUE \" : \"\";\n const method =\n indexConfig.method && indexConfig.method !== \"btree\" ?\n ` USING ${indexConfig.method}`\n : \"\";\n const where =\n indexConfig.where ?\n ` WHERE ${inlineSqlOrThrow(indexConfig.where, `PostgreSQL index \"${indexConfig.name}\" WHERE clause`)}`\n : \"\";\n\n statements.push(\n `CREATE ${unique}INDEX IF NOT EXISTS \"${indexConfig.name}\" ON \"${config.name}\"${method} (${columns})${where};`,\n );\n }\n\n return statements;\n}\n\nfunction isPgTable(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): value is PgTableWithColumns<any> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof value !== \"string\"\n );\n}\n\n/**\n * Generates all DDL statements for the given PostgreSQL tables.\n *\n * The typed `tables.fulltext` is excluded from the column-walker\n * pass (it can't reproduce `GENERATED ALWAYS AS … STORED`); the\n * strategy emits the canonical fulltext DDL last.\n */\nexport function generatePostgresDDL(\n tables: PostgresTables = postgresTables,\n fulltextStrategy: FulltextStrategy = tsvectorStrategy,\n): string[] {\n const statements: string[] = [];\n\n // Reference identity sidesteps the per-iter `getPgTableConfig` walk\n // a name lookup would add, and stays correct under custom names.\n for (const table of Object.values(tables)) {\n if (!isPgTable(table)) continue;\n if (table === tables.fulltext) continue;\n statements.push(generatePgCreateTableSQL(table));\n }\n for (const table of Object.values(tables)) {\n if (!isPgTable(table)) continue;\n if (table === tables.fulltext) continue;\n statements.push(...generatePgCreateIndexSQL(table));\n }\n\n statements.push(...fulltextStrategy.generateDdl(tables.fulltextTableName));\n\n return statements;\n}\n\n/**\n * Generates a single SQL string for PostgreSQL migrations.\n * Convenience function that joins all DDL statements.\n *\n * Includes CREATE EXTENSION for pgvector since the embeddings table\n * uses the native VECTOR type.\n */\nexport function generatePostgresMigrationSQL(\n tables: PostgresTables = postgresTables,\n fulltextStrategy: FulltextStrategy = tsvectorStrategy,\n): string {\n // pgvector extension is required for the embeddings table\n const extensionSql = \"-- Enable pgvector extension for vector similarity search\\nCREATE EXTENSION IF NOT EXISTS vector;\";\n const ddlSql = generatePostgresDDL(tables, fulltextStrategy).join(\"\\n\\n\");\n return `${extensionSql}\\n\\n${ddlSql}`;\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\nfunction asString(value: unknown, field: string): string {\n if (typeof value !== \"string\") {\n throw new DatabaseOperationError(\n `Expected ${field} to be string, got ${typeof value}`,\n { operation: \"select\", entity: \"row\" },\n );\n }\n return value;\n}\n\nfunction asNumber(value: unknown, field: string): number {\n if (typeof value !== \"number\") {\n throw new DatabaseOperationError(\n `Expected ${field} to be number, got ${typeof value}`,\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) => {\n if (value === null || value === undefined) return;\n if (typeof value !== \"string\") {\n throw new DatabaseOperationError(\n `Expected timestamp to be string, got ${typeof value}`,\n { operation: \"select\", entity: \"row\" },\n );\n }\n return value;\n },\n normalizeJson: (value) => {\n if (typeof value !== \"string\") {\n throw new DatabaseOperationError(\n `Expected JSON column to be string, got ${typeof value}`,\n { operation: \"select\", entity: \"row\" },\n );\n }\n return value;\n },\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: asString(row.graph_id, \"graph_id\"),\n kind: asString(row.kind, \"kind\"),\n id: asString(row.id, \"id\"),\n props: config.normalizeJson(row.props),\n version: asNumber(row.version, \"version\"),\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: asString(row.graph_id, \"graph_id\"),\n id: asString(row.id, \"id\"),\n kind: asString(row.kind, \"kind\"),\n from_kind: asString(row.from_kind, \"from_kind\"),\n from_id: asString(row.from_id, \"from_id\"),\n to_kind: asString(row.to_kind, \"to_kind\"),\n to_id: asString(row.to_id, \"to_id\"),\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: asString(row.graph_id, \"graph_id\"),\n node_kind: asString(row.node_kind, \"node_kind\"),\n constraint_name: asString(row.constraint_name, \"constraint_name\"),\n key: asString(row.key, \"key\"),\n node_id: asString(row.node_id, \"node_id\"),\n concrete_kind: asString(row.concrete_kind, \"concrete_kind\"),\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: asString(row.graph_id, \"graph_id\"),\n version: asNumber(row.version, \"version\"),\n schema_hash: asString(row.schema_hash, \"schema_hash\"),\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","/**\n * Shared building blocks for the `typegraph_index_materializations`\n * status-table operations on both SQLite and Postgres backends.\n *\n * The two dialect adapters used to carry near-identical implementations\n * of `getIndexMaterialization` and `recordIndexMaterialization`. They\n * differ only in (a) how timestamps cross the Drizzle boundary —\n * SQLite stores ISO strings in TEXT columns, Postgres stores `Date`\n * objects in TIMESTAMPTZ columns — and (b) the raw-DDL exec call used\n * to bootstrap the table. Everything else (the row shape, the\n * `onConflictDoUpdate` set clause, the `materializedAt` COALESCE\n * preservation rule for failed re-attempts) is dialect-agnostic and\n * lives here.\n */\n\nimport { sql } from \"drizzle-orm\";\n\nimport type { IndexEntity } from \"../../core/types\";\nimport type {\n IndexMaterializationRow,\n RecordIndexMaterializationParams,\n} from \"../types\";\nimport { formatPostgresTimestamp } from \"./row-mappers\";\n\n/**\n * Bridges the dialect-specific timestamp column representation to the\n * canonical ISO-8601 strings used by `IndexMaterializationRow` and\n * `RecordIndexMaterializationParams`. Generic over the encoded type so\n * each dialect's `.values()` call gets a Drizzle-compatible shape:\n * `string` for SQLite TEXT, `Date` for Postgres TIMESTAMPTZ.\n */\ntype IndexMaterializationTimestampAdapter<TEncoded> = Readonly<{\n /** Convert a stored column value to ISO-8601 (or `undefined`). */\n decode(value: unknown): string | undefined;\n /** Convert an ISO-8601 string to the value Drizzle expects on insert. */\n encode(value: string): TEncoded;\n}>;\n\nexport const SQLITE_INDEX_MAT_TIMESTAMPS: IndexMaterializationTimestampAdapter<string> =\n {\n decode: (value) => (typeof value === \"string\" ? value : undefined),\n encode: (value) => value,\n };\n\nexport const POSTGRES_INDEX_MAT_TIMESTAMPS: IndexMaterializationTimestampAdapter<Date> =\n {\n decode: formatPostgresTimestamp,\n encode: (value) => new Date(value),\n };\n\n/**\n * Raw shape returned by Drizzle for one row of the\n * `typegraph_index_materializations` table. The caller has already\n * narrowed via the typed table query; this type just spells out the\n * dialect-shared field set so `mapMaterializationRow` can decode it.\n */\ntype RawIndexMaterializationRow = Readonly<{\n indexName: string;\n graphId: string;\n entity: string;\n kind: string;\n signature: string;\n schemaVersion: number;\n materializedAt: unknown;\n lastAttemptedAt: unknown;\n lastError: string | null;\n}>;\n\nexport function mapMaterializationRow(\n row: RawIndexMaterializationRow,\n decode: (value: unknown) => string | undefined,\n): IndexMaterializationRow {\n const lastAttemptedAt = decode(row.lastAttemptedAt);\n if (lastAttemptedAt === undefined) {\n throw new Error(\n `materialization row missing required last_attempted_at: ${row.indexName}`,\n );\n }\n return {\n indexName: row.indexName,\n graphId: row.graphId,\n entity: row.entity as IndexEntity,\n kind: row.kind,\n signature: row.signature,\n schemaVersion: row.schemaVersion,\n materializedAt: decode(row.materializedAt),\n lastAttemptedAt,\n lastError: row.lastError ?? undefined,\n };\n}\n\n/**\n * Build the column values for the upsert. Timestamp columns are\n * encoded through the adapter so the dialect's Drizzle column type\n * gets the value-shape it expects.\n */\nexport function buildMaterializationInsertValues<TEncoded>(\n params: RecordIndexMaterializationParams,\n encode: (value: string) => TEncoded,\n): Readonly<{\n indexName: string;\n graphId: string;\n entity: IndexEntity;\n kind: string;\n signature: string;\n schemaVersion: number;\n materializedAt: TEncoded | undefined;\n lastAttemptedAt: TEncoded;\n lastError: string | undefined;\n}> {\n return {\n indexName: params.indexName,\n graphId: params.graphId,\n entity: params.entity,\n kind: params.kind,\n signature: params.signature,\n schemaVersion: params.schemaVersion,\n materializedAt:\n params.materializedAt === undefined ?\n undefined\n : encode(params.materializedAt),\n lastAttemptedAt: encode(params.attemptedAt),\n lastError: params.error,\n };\n}\n\n/**\n * Build the `set` clause for the upsert's ON CONFLICT DO UPDATE.\n *\n * The `materializedAt` column uses `COALESCE` to preserve any prior\n * successful timestamp when this attempt failed (`materializedAt ===\n * undefined`). On success the new timestamp wins. This keeps the\n * status table truthful: the most recent successful materialization\n * timestamp survives even if a subsequent re-attempt errored.\n */\nexport function buildMaterializationOnConflictSet(\n materializedAtColumn: unknown,\n paramsMaterializedAt: string | undefined,\n): Readonly<Record<string, ReturnType<typeof sql>>> {\n const materializedAtSet =\n paramsMaterializedAt === undefined ?\n sql`COALESCE(excluded.${sql.identifier(\"materialized_at\")}, ${materializedAtColumn})`\n : sql`excluded.${sql.identifier(\"materialized_at\")}`;\n return {\n graphId: sql`excluded.${sql.identifier(\"graph_id\")}`,\n entity: sql`excluded.${sql.identifier(\"entity\")}`,\n kind: sql`excluded.${sql.identifier(\"kind\")}`,\n signature: sql`excluded.${sql.identifier(\"signature\")}`,\n schemaVersion: sql`excluded.${sql.identifier(\"schema_version\")}`,\n materializedAt: materializedAtSet,\n lastAttemptedAt: sql`excluded.${sql.identifier(\"last_attempted_at\")}`,\n lastError: sql`excluded.${sql.identifier(\"last_error\")}`,\n };\n}\n","/**\n * Shared building blocks for the `typegraph_kind_removals` status-table\n * operations on both SQLite and Postgres backends.\n *\n * Same shape as `index-materializations.ts`: the dialects differ only\n * in (a) timestamp encoding (SQLite TEXT vs Postgres TIMESTAMPTZ) and\n * (b) the raw-DDL exec call used to bootstrap the table. The row\n * mapper, the `onConflictDoUpdate` set clause, and the\n * `removed_at` COALESCE-on-failure preservation rule are dialect-\n * agnostic and live here. Two near-identical adapter copies in\n * `sqlite.ts` / `postgres.ts` collapse to ~15 lines each.\n */\n\nimport { sql } from \"drizzle-orm\";\n\nimport type { KindEntity } from \"../../core/types\";\nimport type { KindRemovalRow, RecordKindRemovalParams } from \"../types\";\nimport { formatPostgresTimestamp } from \"./row-mappers\";\n\n/**\n * Bridges the dialect-specific timestamp column representation to the\n * canonical ISO-8601 strings used by `KindRemovalRow` and\n * `RecordKindRemovalParams`. Generic over the encoded type so each\n * dialect's `.values()` call gets a Drizzle-compatible shape: `string`\n * for SQLite TEXT, `Date` for Postgres TIMESTAMPTZ.\n */\ntype KindRemovalTimestampAdapter<TEncoded> = Readonly<{\n /** Convert a stored column value to ISO-8601 (or `undefined`). */\n decode(value: unknown): string | undefined;\n /** Convert an ISO-8601 string to the value Drizzle expects on insert. */\n encode(value: string): TEncoded;\n}>;\n\nexport const SQLITE_KIND_REMOVAL_TIMESTAMPS: KindRemovalTimestampAdapter<string> =\n {\n decode: (value) => (typeof value === \"string\" ? value : undefined),\n encode: (value) => value,\n };\n\nexport const POSTGRES_KIND_REMOVAL_TIMESTAMPS: KindRemovalTimestampAdapter<Date> =\n {\n decode: formatPostgresTimestamp,\n encode: (value) => new Date(value),\n };\n\n/**\n * Raw shape returned by Drizzle for one row of the\n * `typegraph_kind_removals` table.\n */\ntype RawKindRemovalRow = Readonly<{\n graphId: string;\n kindName: string;\n entity: string;\n schemaVersion: number;\n removedAt: unknown;\n lastAttemptedAt: unknown;\n lastError: string | null;\n}>;\n\nexport function mapKindRemovalRow(\n row: RawKindRemovalRow,\n decode: (value: unknown) => string | undefined,\n): KindRemovalRow {\n const lastAttemptedAt = decode(row.lastAttemptedAt);\n if (lastAttemptedAt === undefined) {\n throw new Error(\n `kind removal row missing required last_attempted_at: ${row.kindName}`,\n );\n }\n return {\n graphId: row.graphId,\n kindName: row.kindName,\n entity: row.entity as KindEntity,\n schemaVersion: row.schemaVersion,\n removedAt: decode(row.removedAt),\n lastAttemptedAt,\n lastError: row.lastError ?? undefined,\n };\n}\n\n/**\n * Build the column values for the upsert. Timestamp columns are\n * encoded through the adapter so the dialect's Drizzle column type\n * gets the value-shape it expects.\n */\nexport function buildKindRemovalInsertValues<TEncoded>(\n params: RecordKindRemovalParams,\n encode: (value: string) => TEncoded,\n): Readonly<{\n graphId: string;\n kindName: string;\n entity: KindEntity;\n schemaVersion: number;\n removedAt: TEncoded | undefined;\n lastAttemptedAt: TEncoded;\n lastError: string | undefined;\n}> {\n return {\n graphId: params.graphId,\n kindName: params.kindName,\n entity: params.entity,\n schemaVersion: params.schemaVersion,\n removedAt:\n params.removedAt === undefined ? undefined : encode(params.removedAt),\n lastAttemptedAt: encode(params.attemptedAt),\n lastError: params.error,\n };\n}\n\n/**\n * Build the `set` clause for the upsert's ON CONFLICT DO UPDATE.\n *\n * `removed_at` uses `COALESCE` to preserve any prior successful\n * timestamp when this attempt failed (`removedAt === undefined`). On\n * success, the new timestamp wins. Mirrors the materializations-table\n * preservation rule.\n */\nexport function buildKindRemovalOnConflictSet(\n removedAtColumn: unknown,\n paramsRemovedAt: string | undefined,\n): Readonly<Record<string, ReturnType<typeof sql>>> {\n const removedAtSet =\n paramsRemovedAt === undefined ?\n sql`COALESCE(excluded.${sql.identifier(\"removed_at\")}, ${removedAtColumn})`\n : sql`excluded.${sql.identifier(\"removed_at\")}`;\n return {\n entity: sql`excluded.${sql.identifier(\"entity\")}`,\n schemaVersion: sql`excluded.${sql.identifier(\"schema_version\")}`,\n removedAt: removedAtSet,\n lastAttemptedAt: sql`excluded.${sql.identifier(\"last_attempted_at\")}`,\n lastError: sql`excluded.${sql.identifier(\"last_error\")}`,\n };\n}\n","import { type SQL } from \"drizzle-orm\";\n\nimport {\n DatabaseOperationError,\n MigrationError,\n SchemaContentConflictError,\n StaleVersionError,\n UniquenessError,\n} from \"../../errors\";\nimport type {\n CheckUniqueBatchParams,\n CheckUniqueParams,\n CommitSchemaVersionParams,\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 InsertUniqueParams,\n NodeRow,\n SchemaVersionRow,\n SetActiveVersionParams,\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\n/**\n * The internal operation backend — what `createCommonOperationBackend`\n * returns. Includes `commitSchemaVersion` and `setActiveVersion` so the\n * top-level backend wrappers can call them on a fresh tx-scoped\n * operation backend (created inside the dialect-specific\n * write-locking transaction). These methods are deliberately NOT on\n * the public `TransactionBackend` type — see the comment there.\n */\nexport type CommonOperationBackend = Pick<\n TransactionBackend,\n | \"checkUnique\"\n | \"checkUniqueBatch\"\n | \"clearGraph\"\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 | \"insertUnique\"\n | \"updateEdge\"\n | \"updateNode\"\n> &\n Readonly<{\n commitSchemaVersion: (\n params: CommitSchemaVersionParams,\n ) => Promise<SchemaVersionRow>;\n setActiveVersion: (params: SetActiveVersionParams) => Promise<void>;\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 checkUniqueBatchChunkSize: number;\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\nfunction verifyExpectedActiveVersion(\n graphId: string,\n expected: CommitSchemaVersionParams[\"expected\"],\n actualActiveVersion: number,\n): void {\n const expectedVersion = expected.kind === \"active\" ? expected.version : 0;\n if (actualActiveVersion !== expectedVersion) {\n throw new StaleVersionError({\n graphId,\n expected: expectedVersion,\n actual: actualActiveVersion,\n });\n }\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 // Returns 0 when no row is currently active — that's the sentinel\n // `expected: { kind: \"initial\" }` matches against.\n async function readActiveVersion(graphId: string): Promise<number> {\n const row = await execution.execGet<Record<string, unknown>>(\n operationStrategy.buildGetActiveSchema(graphId),\n );\n return row === undefined ? 0 : rowMappers.toSchemaVersionRow(row).version;\n }\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 deleteFulltextStatements =\n operationStrategy.buildDeleteFulltextByNode(\n params.graphId,\n params.kind,\n params.id,\n );\n for (const stmt of deleteFulltextStatements) {\n await execution.execRun(stmt);\n }\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 checkUniqueBatch(\n params: CheckUniqueBatchParams,\n ): Promise<readonly UniqueRow[]> {\n if (params.keys.length === 0) return [];\n const allRows: UniqueRow[] = [];\n for (const chunk of chunkArray(params.keys, batchConfig.checkUniqueBatchChunkSize)) {\n const query = operationStrategy.buildCheckUniqueBatch({ ...params, keys: chunk });\n const rows = await execution.execAll<Record<string, unknown>>(query);\n allRows.push(...rows.map((row) => rowMappers.toUniqueRow(row)));\n }\n return allRows;\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 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 commitSchemaVersion(\n params: CommitSchemaVersionParams,\n ): Promise<SchemaVersionRow> {\n // The top-level backend wraps this method in a transaction with\n // appropriate write-locking (BEGIN IMMEDIATE on SQLite,\n // pg_advisory_xact_lock on Postgres) so the read-then-write\n // sequence below is serialized against concurrent commits.\n\n const existingRaw = await execution.execGet<Record<string, unknown>>(\n operationStrategy.buildGetSchemaVersion(\n params.graphId,\n params.version,\n ),\n );\n const actualActiveVersion = await readActiveVersion(params.graphId);\n\n // Same-version-different-hash → content conflict. Always wins\n // over CAS: a hash disagreement is operator-intervention\n // territory regardless of which writer \"got there first.\"\n if (existingRaw !== undefined) {\n const existing = rowMappers.toSchemaVersionRow(existingRaw);\n if (existing.schema_hash !== params.schemaHash) {\n throw new SchemaContentConflictError({\n graphId: params.graphId,\n version: params.version,\n existingHash: existing.schema_hash,\n incomingHash: params.schemaHash,\n });\n }\n // Same-version-same-hash already active → idempotent success.\n // Skips the CAS intentionally: same hash means identical\n // content, so there's no disagreement for the caller to refetch.\n if (existing.is_active) {\n return existing;\n }\n // Same-version-same-hash but inactive: orphan row left by a\n // crashed earlier commit. Reactivation requires CAS because\n // we're about to flip the active pointer — fall through.\n verifyExpectedActiveVersion(\n params.graphId,\n params.expected,\n actualActiveVersion,\n );\n const reactivate = operationStrategy.buildSetActiveSchema(\n params.graphId,\n params.version,\n );\n await execution.execRun(reactivate.deactivateAll);\n await execution.execRun(reactivate.activateVersion);\n // Project the result instead of re-SELECTing: the partial\n // unique index guarantees this is the only active row for the\n // graph after the UPDATEs above.\n return { ...existing, is_active: true };\n }\n\n verifyExpectedActiveVersion(\n params.graphId,\n params.expected,\n actualActiveVersion,\n );\n\n // Fresh insert path. For the \"active\" expected case, deactivate\n // the prior active row first so the partial unique index (one\n // active per graph) is satisfied at every statement boundary.\n // The \"initial\" case has no prior active, so skip.\n if (params.expected.kind === \"active\") {\n const flip = operationStrategy.buildSetActiveSchema(\n params.graphId,\n params.version,\n );\n await execution.execRun(flip.deactivateAll);\n }\n\n const timestamp = nowIso();\n const insertQuery = operationStrategy.buildInsertSchema(\n {\n graphId: params.graphId,\n version: params.version,\n schemaHash: params.schemaHash,\n schemaDoc: params.schemaDoc,\n isActive: true,\n },\n timestamp,\n );\n const insertedRaw =\n await execution.execGet<Record<string, unknown>>(insertQuery);\n if (!insertedRaw) {\n throw new DatabaseOperationError(\n \"Insert schema failed: no row returned\",\n { operation: \"insert\", entity: \"schema\" },\n );\n }\n return rowMappers.toSchemaVersionRow(insertedRaw);\n },\n\n async setActiveVersion(params: SetActiveVersionParams): Promise<void> {\n const actualActiveVersion = await readActiveVersion(params.graphId);\n verifyExpectedActiveVersion(\n params.graphId,\n params.expected,\n actualActiveVersion,\n );\n\n const targetRaw = await execution.execGet<Record<string, unknown>>(\n operationStrategy.buildGetSchemaVersion(\n params.graphId,\n params.version,\n ),\n );\n if (!targetRaw) {\n throw new MigrationError(\n `Cannot activate version ${params.version}: version does not exist for graph \"${params.graphId}\".`,\n {\n graphId: params.graphId,\n fromVersion: actualActiveVersion,\n toVersion: params.version,\n },\n );\n }\n\n const queries = operationStrategy.buildSetActiveSchema(\n params.graphId,\n params.version,\n );\n await execution.execRun(queries.deactivateAll);\n await execution.execRun(queries.activateVersion);\n },\n\n async clearGraph(graphId: string): Promise<void> {\n const statements = operationStrategy.buildClearGraph(graphId);\n for (const statement of statements) {\n await execution.execRun(statement);\n }\n },\n };\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { quotedTableName, type Tables } from \"./shared\";\n\n/**\n * Builds DELETE FROM statements for all per-graph tables filtered by\n * graph_id. Delete order respects implicit FK-like dependencies:\n * fulltext → embeddings → uniques → edges → nodes → schema_versions.\n *\n * Per-deployment status tables (`indexMaterializations`, `kindRemovals`,\n * `reconciliationMarkers`) also get cleaned because reuse of the same\n * graphId after `clearGraph` would otherwise inherit stale state. The\n * reconciliation marker is the sharpest case: a stale high-water mark\n * would cause `materializeRemovals` to skip the recovery walk entirely\n * for the freshly-created graph.\n */\nexport function buildClearGraph(\n tables: Tables,\n graphId: string,\n): readonly SQL[] {\n const fulltext = quotedTableName(tables.fulltextTableName);\n return [\n sql`DELETE FROM ${fulltext} WHERE \"graph_id\" = ${graphId}`,\n sql`DELETE FROM ${tables.embeddings} WHERE ${tables.embeddings.graphId} = ${graphId}`,\n sql`DELETE FROM ${tables.uniques} WHERE ${tables.uniques.graphId} = ${graphId}`,\n sql`DELETE FROM ${tables.edges} WHERE ${tables.edges.graphId} = ${graphId}`,\n sql`DELETE FROM ${tables.nodes} WHERE ${tables.nodes.graphId} = ${graphId}`,\n sql`DELETE FROM ${tables.indexMaterializations} WHERE ${tables.indexMaterializations.graphId} = ${graphId}`,\n sql`DELETE FROM ${tables.kindRemovals} WHERE ${tables.kindRemovals.graphId} = ${graphId}`,\n sql`DELETE FROM ${tables.reconciliationMarkers} WHERE ${tables.reconciliationMarkers.graphId} = ${graphId}`,\n sql`DELETE FROM ${tables.schemaVersions} WHERE ${tables.schemaVersions.graphId} = ${graphId}`,\n ];\n}\n","import { type SQL, sql } from \"drizzle-orm\";\n\nimport { type TemporalMode } from \"../../../core/types\";\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?: TemporalMode;\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 if (params.asOf === undefined) {\n throw new Error(\n `asOf timestamp is required for temporal mode \"${mode}\"`,\n );\n }\n conditions.push(\n sql`(${table.validFrom} IS NULL OR ${table.validFrom} <= ${params.asOf})`,\n sql`(${table.validTo} IS NULL OR ${table.validTo} > ${params.asOf})`,\n );\n }\n\n return conditions;\n}\n\n/**\n * Builds a query to find nodes by kind.\n *\n * Two pagination shapes are supported:\n * - Offset pagination (`limit` + `offset`): keeps the historical\n * `ORDER BY created_at DESC` ordering and adds `id DESC` as a\n * deterministic tiebreaker so shared timestamps don't shuffle rows.\n * - Keyset pagination (`orderBy: \"id\"` + optional `after`): iterates\n * by `id ASC` for stability under concurrent writes and shared\n * timestamps. Required by `rebuildFulltextIndex`.\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 if (params.orderBy === \"id\" && params.after !== undefined) {\n conditions.push(sql`${nodes.id} > ${params.after}`);\n }\n\n const whereClause = sql.join(conditions, sql` AND `);\n\n const orderByClause =\n params.orderBy === \"id\"\n ? sql`${nodes.id} ASC`\n : sql`${nodes.createdAt} DESC, ${nodes.id} DESC`;\n\n if (params.limit !== undefined && params.offset !== undefined) {\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${whereClause}\n ORDER BY ${orderByClause}\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 ${orderByClause}\n LIMIT ${params.limit}\n `;\n }\n\n return sql`\n SELECT * FROM ${nodes}\n WHERE ${whereClause}\n ORDER BY ${orderByClause}\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 {\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","/**\n * SQL builders for fulltext read operations.\n *\n * Write operations (upsert / delete, single and batch) are owned by the\n * active `FulltextStrategy` — see `src/query/dialect/fulltext-strategy.ts`.\n * A strategy-level `buildUpsert` / `buildBatchUpsert` / `buildDelete` /\n * `buildBatchDelete` means alternate backends (pg_trgm, ParadeDB/pg_search,\n * pgroonga) control the full write pipeline, not just read SQL.\n *\n * The search builder stays here because it composes fragments from the\n * strategy (`matchCondition`, `rankExpression`, `snippetExpression`) into\n * a single `SELECT` shape that is identical across dialects.\n */\nimport { type SQL, sql } from \"drizzle-orm\";\n\nimport type { FulltextStrategy } from \"../../../query/dialect/fulltext-strategy\";\nimport type { FulltextQueryMode, FulltextSearchParams } from \"../../types\";\nimport { quotedTableName } from \"./shared\";\n\nfunction resolveMode(mode: FulltextQueryMode | undefined): FulltextQueryMode {\n return mode ?? \"websearch\";\n}\n\nexport function buildFulltextSearch(\n tableName: string,\n params: FulltextSearchParams,\n strategy: FulltextStrategy,\n): SQL {\n assertValidSearchParams(params);\n\n const mode = resolveMode(params.mode);\n const table = quotedTableName(tableName);\n const matchCondition = strategy.matchCondition(\n tableName,\n params.query,\n mode,\n params.language,\n );\n const rankExpression = strategy.rankExpression(\n tableName,\n params.query,\n mode,\n params.language,\n );\n\n const conditions: SQL[] = [\n matchCondition,\n sql`\"graph_id\" = ${params.graphId}`,\n sql`\"node_kind\" = ${params.nodeKind}`,\n ];\n if (params.minScore !== undefined) {\n conditions.push(sql`${rankExpression} >= ${params.minScore}`);\n }\n\n const snippetExpr =\n params.includeSnippets === true && strategy.supportsSnippets\n ? strategy.snippetExpression(\n tableName,\n params.query,\n mode,\n params.language,\n )\n : sql`NULL`;\n\n return sql`\n SELECT\n \"node_id\" AS node_id,\n ${rankExpression} AS score,\n ${snippetExpr} AS snippet\n FROM ${table}\n WHERE ${sql.join(conditions, sql` AND `)}\n ORDER BY ${rankExpression} DESC, \"node_id\" ASC\n LIMIT ${params.limit}\n `;\n}\n\nfunction assertValidSearchParams(params: FulltextSearchParams): void {\n if (!Number.isInteger(params.limit) || params.limit <= 0) {\n throw new Error(`limit must be a positive integer, got: ${params.limit}`);\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","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 CheckUniqueBatchParams,\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 if (params.includeDeleted) {\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 `;\n }\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\n/**\n * Builds a SELECT query to batch-check uniqueness entries by multiple keys.\n */\nexport function buildCheckUniqueBatch(\n tables: Tables,\n params: CheckUniqueBatchParams,\n): SQL {\n const { uniques } = tables;\n\n const keyPlaceholders = sql.join(\n params.keys.map((key) => sql`${key}`),\n sql`, `,\n );\n\n if (params.includeDeleted) {\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} IN (${keyPlaceholders})\n `;\n }\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} IN (${keyPlaceholders})\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 { SqliteTables } from \"../schema/sqlite\";\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 an UPSERT query for an embedding (SQLite with sqlite-vec).\n *\n * The embedding is stored as a BLOB produced by `vec_f32('[...]')`. This\n * requires the sqlite-vec extension to be loaded on the connection. When\n * the extension is missing, the insert will fail at execution time with\n * a \"no such function: vec_f32\" error — createSqliteBackend guards against\n * that by only exposing `upsertEmbedding` when vec_f32 is available.\n */\nexport function buildUpsertEmbeddingSqlite(\n tables: SqliteTables,\n params: UpsertEmbeddingParams,\n timestamp: string,\n): SQL {\n const { embeddings } = tables;\n const embeddingJson = JSON.stringify(params.embedding);\n // Validate finite numbers BEFORE stringify so the error names the\n // offending index (stringify would mask NaN/Infinity as null).\n assertFiniteNumberArray(params.embedding, \"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 const conflictColumns = sql.raw(\n `\"${embeddings.graphId.name}\", \"${embeddings.nodeKind.name}\", \"${embeddings.nodeId.name}\", \"${embeddings.fieldPath.name}\"`,\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 vec_f32(${embeddingJson}), ${params.dimensions}, ${timestamp}, ${timestamp}\n )\n ON CONFLICT (${conflictColumns})\n DO UPDATE SET\n ${column(embeddings.embedding)} = vec_f32(${embeddingJson}),\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\nfunction assertVectorSearchBounds(params: VectorSearchParams): void {\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 if (!Number.isInteger(params.limit) || params.limit <= 0) {\n throw new Error(`limit must be a positive integer, got: ${params.limit}`);\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 assertVectorSearchBounds(params);\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\nfunction buildSqliteDistanceExpression(\n embeddingColumn: SQL,\n embeddingJson: string,\n metric: VectorMetric,\n): SQL {\n switch (metric) {\n case \"cosine\": {\n return sql`vec_distance_cosine(${embeddingColumn}, vec_f32(${embeddingJson}))`;\n }\n case \"l2\": {\n return sql`vec_distance_l2(${embeddingColumn}, vec_f32(${embeddingJson}))`;\n }\n case \"inner_product\": {\n // sqlite-vec has no vec_distance_ip — see\n // 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/**\n * Builds a vector similarity search query (SQLite with sqlite-vec).\n * Returns node IDs ordered by similarity (closest first).\n *\n * Requires sqlite-vec to be loaded on the connection; `createSqliteBackend`\n * gates `vectorSearch` exposure on `hasVectorEmbeddings` so callers don't\n * hit \"no such function: vec_distance_cosine\" at execution time.\n */\nexport function buildVectorSearchSqlite(\n tables: SqliteTables,\n params: VectorSearchParams,\n): SQL {\n const { embeddings } = tables;\n\n // Validate finite numbers BEFORE stringify so the error names the\n // offending index (stringify would mask NaN/Infinity as null).\n assertFiniteNumberArray(params.queryEmbedding, \"queryEmbedding\");\n const embeddingJson = JSON.stringify(params.queryEmbedding);\n assertVectorSearchBounds(params);\n\n const embeddingColumn = sql`${embeddings.embedding}`;\n const distanceExpression = buildSqliteDistanceExpression(\n embeddingColumn,\n embeddingJson,\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 { FulltextStrategy } from \"../../../query/dialect/fulltext-strategy\";\nimport type {\n CheckUniqueBatchParams,\n CheckUniqueParams,\n CountEdgesByKindParams,\n CountEdgesFromParams,\n CountNodesByKindParams,\n DeleteEdgeParams,\n DeleteEmbeddingParams,\n DeleteFulltextBatchParams,\n DeleteFulltextParams,\n DeleteNodeParams,\n DeleteUniqueParams,\n EdgeExistsBetweenParams,\n FindEdgesByKindParams,\n FindEdgesConnectedToParams,\n FindNodesByKindParams,\n FulltextSearchParams,\n HardDeleteEdgeParams,\n HardDeleteNodeParams,\n InsertEdgeParams,\n InsertNodeParams,\n InsertSchemaParams,\n InsertUniqueParams,\n SqlDialect,\n UpdateEdgeParams,\n UpdateNodeParams,\n UpsertEmbeddingParams,\n UpsertFulltextBatchParams,\n UpsertFulltextParams,\n VectorSearchParams,\n} from \"../../types\";\nimport type { PostgresTables } from \"../schema/postgres\";\nimport type { SqliteTables } from \"../schema/sqlite\";\nimport { buildClearGraph } from \"./clear\";\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 { buildFulltextSearch } from \"./fulltext\";\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 buildCheckUniqueBatch,\n buildDeleteUnique,\n buildHardDeleteEmbeddingsByNode,\n buildHardDeleteUniquesByNode,\n buildInsertUnique,\n} from \"./uniques\";\nimport {\n buildDeleteEmbedding,\n buildGetEmbedding,\n buildUpsertEmbeddingPostgres,\n buildUpsertEmbeddingSqlite,\n buildVectorSearchPostgres,\n buildVectorSearchSqlite,\n} from \"./vectors\";\n\nexport type CommonOperationStrategy = Readonly<{\n buildUpsertFulltext: (\n params: UpsertFulltextParams,\n timestamp: string,\n ) => readonly SQL[];\n buildDeleteFulltext: (params: DeleteFulltextParams) => readonly SQL[];\n buildDeleteFulltextByNode: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n ) => readonly SQL[];\n buildUpsertFulltextBatch: (\n params: UpsertFulltextBatchParams,\n timestamp: string,\n ) => readonly SQL[];\n buildDeleteFulltextBatch: (\n params: DeleteFulltextBatchParams,\n ) => readonly SQL[];\n buildFulltextSearch: (params: FulltextSearchParams) => SQL;\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 buildCheckUniqueBatch: (params: CheckUniqueBatchParams) => 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 buildClearGraph: (graphId: string) => readonly 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\n/**\n * SQLite embedding operations.\n *\n * `getEmbedding` is intentionally absent (asymmetry vs Postgres): reading\n * the raw BLOB back as a number array requires `vec_to_json(...)` and\n * additional row decoding, which no current consumer needs.\n */\nexport type SqliteVectorOperationStrategy = Readonly<{\n buildUpsertEmbedding: (\n params: UpsertEmbeddingParams,\n timestamp: string,\n ) => SQL;\n buildDeleteEmbedding: (params: DeleteEmbeddingParams) => SQL;\n buildVectorSearch: (params: VectorSearchParams) => SQL;\n}>;\n\nexport type SqliteOperationStrategy = Readonly<\n CommonOperationStrategy & SqliteVectorOperationStrategy\n>;\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 buildCheckUniqueBatch,\n buildGetSchemaVersion,\n} as const satisfies TableOperationBuilderMap;\n\nfunction createCommonOperationStrategy(\n tables: Tables,\n dialect: SqlDialect,\n fulltextStrategy: FulltextStrategy,\n): CommonOperationStrategy {\n const tableOperations = bindTableOperationBuilders(\n tables,\n COMMON_TABLE_OPERATION_BUILDERS,\n );\n const fulltextTable = tables.fulltextTableName;\n\n // All fulltext write SQL is owned by the active strategy — so swapping\n // to pg_trgm / ParadeDB / pgroonga swaps the full CRUD pipeline, not\n // just the read-side fragments.\n const fulltextBuilders = {\n buildUpsertFulltext: (\n params: UpsertFulltextParams,\n timestamp: string,\n ): readonly SQL[] =>\n fulltextStrategy.buildUpsert(fulltextTable, params, timestamp),\n buildDeleteFulltext: (params: DeleteFulltextParams): readonly SQL[] =>\n fulltextStrategy.buildDelete(fulltextTable, params),\n buildDeleteFulltextByNode: (\n graphId: string,\n nodeKind: string,\n nodeId: string,\n ): readonly SQL[] =>\n fulltextStrategy.buildDelete(fulltextTable, {\n graphId,\n nodeKind,\n nodeId,\n }),\n buildUpsertFulltextBatch: (\n params: UpsertFulltextBatchParams,\n timestamp: string,\n ): readonly SQL[] =>\n fulltextStrategy.buildBatchUpsert(fulltextTable, params, timestamp),\n buildDeleteFulltextBatch: (\n params: DeleteFulltextBatchParams,\n ): readonly SQL[] =>\n fulltextStrategy.buildBatchDelete(fulltextTable, params),\n buildFulltextSearch: (params: FulltextSearchParams): SQL =>\n buildFulltextSearch(fulltextTable, params, fulltextStrategy),\n };\n\n return {\n ...tableOperations,\n ...fulltextBuilders,\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 buildClearGraph(graphId: string): readonly SQL[] {\n return buildClearGraph(tables, graphId);\n },\n };\n}\n\nexport function createSqliteOperationStrategy(\n tables: SqliteTables,\n fulltextStrategy: FulltextStrategy,\n): SqliteOperationStrategy {\n const common = createCommonOperationStrategy(\n tables,\n \"sqlite\",\n fulltextStrategy,\n );\n return {\n ...common,\n buildUpsertEmbedding(params: UpsertEmbeddingParams, timestamp: string): SQL {\n return buildUpsertEmbeddingSqlite(tables, params, timestamp);\n },\n buildDeleteEmbedding(params: DeleteEmbeddingParams): SQL {\n return buildDeleteEmbedding(tables, params);\n },\n buildVectorSearch(params: VectorSearchParams): SQL {\n return buildVectorSearchSqlite(tables, params);\n },\n };\n}\n\nexport function createPostgresOperationStrategy(\n tables: PostgresTables,\n fulltextStrategy: FulltextStrategy,\n): PostgresOperationStrategy {\n const common = createCommonOperationStrategy(\n tables,\n \"postgres\",\n fulltextStrategy,\n );\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 { MAX_PG_IDENTIFIER_LENGTH } from \"../../constants\";\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 /** Emit `CREATE INDEX CONCURRENTLY`. See `CreateVectorIndexParams.concurrent`. */\n concurrent?: boolean;\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\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_PG_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_PG_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 const concurrentClause = options.concurrent === true ? \"CONCURRENTLY \" : \"\";\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 ${concurrentClause}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 ${concurrentClause}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","/**\n * Get-or-create with LRU eviction on a `Map`.\n *\n * Map insertion order is the LRU order: cache hits delete + reinsert\n * the entry to promote it to most-recently-used; on miss, the oldest\n * entry is evicted once the map exceeds `cacheMax`. Used by both the\n * PostgreSQL prepared-statement-name cache and the SQLite prepared-\n * statement cache.\n */\nexport function getOrCreateLru<K, V>(\n cache: Map<K, V>,\n key: K,\n cacheMax: number,\n create: () => V,\n): V {\n const cached = cache.get(key);\n if (cached !== undefined) {\n cache.delete(key);\n cache.set(key, cached);\n return cached;\n }\n const value = create();\n cache.set(key, value);\n if (cache.size > cacheMax) {\n const oldest = cache.keys().next().value;\n if (oldest !== undefined) cache.delete(oldest);\n }\n return value;\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"]}