{"version":3,"sources":["../../../src/backend/sqlite/libsql.ts"],"names":["tables","generateSqliteMigrationSQL","requireDefined","isSqliteMissingEdgeMatchIdentityColumnError","BaseSchemaMigrationError","ORDERED_AGGREGATE_PROBE_SQL","drizzle","createSqliteBackend","isLocalLibsqlClient","libsqlVectorStrategy"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuDA,eAAe,uBAAA,CACb,MAAA,EACAA,OAAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,eAAA,GAAkBC,6CAA2BD,OAAM,CAAA;AACzD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,CAAO,gBAAgB,eAAe,CAAA;AAC5C,IAAA,MAAME,gCAAA,CAAe,OAAA,CAAQ,uBAAuB,CAAA,EAAE;AAAA,EACxD,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,yBAAA,GACJC,8DAA4C,KAAK,CAAA,IAChD,iBAAiBC,0CAAA,IAChB,KAAA,CAAM,QAAQ,MAAA,KAAW,OAAA;AAC7B,IAAA,IAAI,CAAC,2BAA2B,MAAM,KAAA;AAMtC,IAAA,MAAMF,gCAAA,CAAe,OAAA,CAAQ,eAAe,CAAA,EAAE;AAAA,EAChD;AACF;AAEA,eAAe,wBAAwB,MAAA,EAAkC;AACvE,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,CAAO,QAAQG,6CAA2B,CAAA;AAChD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAwEA,eAAsB,mBAAA,CACpB,MAAA,EACA,OAAA,GAAgC,EAAC,EACH;AAC9B,EAAA,MAAML,OAAAA,GAAS,QAAQ,MAAA,IAAUA,yBAAA;AACjC,EAAA,MAAM,EAAA,GAAKM,eAAQ,MAAM,CAAA;AACzB,EAAA,MAAM,iBAAA,GAAoB,MAAM,uBAAA,CAAwB,MAAM,CAAA;AAC9D,EAAA,MAAM,OAAA,GAAUC,sCAAoB,EAAA,EAAI;AAAA,IACtC,GAAI,QAAQ,kBAAA,KAAuB,MAAA,GACjC,EAAC,GACD,EAAE,kBAAA,EAAoB,OAAA,CAAQ,kBAAA,EAAmB;AAAA,IACnD,YAAA,EAAc,EAAE,iBAAA,EAAkB;AAAA,IAClC,gBAAA,EAAkB;AAAA,MAChB,MAAA,EAAQ,KAAA;AAAA,MACR,eAAA,EAAiBC,qCAAA,CAAoB,MAAM,CAAA,GAAI,KAAA,GAAQ;AAAA,KACzD;AAAA,IACA,MAAA,EAAAR,OAAAA;AAAA;AAAA;AAAA,IAGA,MAAA,EAAQS;AAAA,GACT,CAAA;AAED,EAAA,MAAM,uBAAA,CAAwB,MAAA,EAAQT,OAAAA,EAAQ,OAAO,CAAA;AAErD,EAAA,OAAO,EAAE,SAAS,EAAA,EAAG;AACvB","file":"libsql.cjs","sourcesContent":["/**\n * libsql backend for TypeGraph.\n *\n * This module wraps `@libsql/client` with the correct execution profile\n * for use with TypeGraph. It is compatible with any `@libsql/client`\n * instance (local file, remote Turso, embedded replicas).\n *\n * @example In-memory database\n * ```typescript\n * import { createClient } from \"@libsql/client\";\n * import { createLibsqlBackend } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite/libsql\";\n *\n * const client = createClient({ url: \"file::memory:\" });\n * const { backend } = await createLibsqlBackend(client);\n * const store = createStore(graph, backend);\n * ```\n *\n * @example Remote Turso database\n * ```typescript\n * import { createClient } from \"@libsql/client\";\n * import { createLibsqlBackend } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite/libsql\";\n *\n * const client = createClient({ url: \"libsql://my-db.turso.io\", authToken: \"...\" });\n * const { backend } = await createLibsqlBackend(client);\n * const store = createStore(graph, backend);\n * ```\n */\nimport type { Client } from \"@libsql/client\";\nimport { drizzle, type LibSQLDatabase } from \"drizzle-orm/libsql\";\n\nimport { BaseSchemaMigrationError } from \"../../errors\";\nimport { libsqlVectorStrategy } from \"../../query/dialect/vector/libsql-strategy\";\nimport { requireDefined } from \"../../utils/presence\";\nimport { isSqliteMissingEdgeMatchIdentityColumnError } from \"../../utils/sql-errors\";\nimport { generateSqliteMigrationSQL } from \"../drizzle/ddl\";\nimport {\n  type AnySqliteDatabase,\n  ORDERED_AGGREGATE_PROBE_SQL,\n} from \"../drizzle/execution\";\nexport type { AnySqliteDatabase } from \"../drizzle/execution\";\nimport {\n  createSqliteBackend,\n  isLocalLibsqlClient,\n  type SqliteTables,\n  tables as defaultTables,\n} from \"../drizzle/sqlite\";\nimport type { AdapterBackend, SchemaProvisioning } from \"../types\";\n\nexport type {\n  ContributionDiagnostic,\n  ContributionDiagnosticState,\n  ContributionRepairEntry,\n  ContributionRepairResult,\n} from \"../types\";\n\nasync function installLibsqlBaseSchema(\n  client: Client,\n  tables: SqliteTables,\n  backend: AdapterBackend<AnySqliteDatabase>,\n): Promise<void> {\n  const installationSql = generateSqliteMigrationSQL(tables);\n  try {\n    await client.executeMultiple(installationSql);\n    await requireDefined(backend.assertBaseSchemaCurrent)();\n  } catch (error) {\n    const requiresLifecycleAdoption =\n      isSqliteMissingEdgeMatchIdentityColumnError(error) ||\n      (error instanceof BaseSchemaMigrationError &&\n        error.details.reason !== \"newer\");\n    if (!requiresLifecycleAdoption) throw error;\n    // The fast script is fresh-installation DDL, not an upgrade planner. A\n    // legacy or stale database must re-enter the numbered lifecycle so future\n    // releases cannot be stamped without every missing adoption step. The\n    // marker-error arm is intentionally dormant at v1: it becomes reachable\n    // when a later release can observe a missing or stale older marker.\n    await requireDefined(backend.bootstrapTables)();\n  }\n}\n\nasync function detectOrderedAggregates(client: Client): Promise<boolean> {\n  try {\n    await client.execute(ORDERED_AGGREGATE_PROBE_SQL);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n// ============================================================\n// Types\n// ============================================================\n\n/**\n * Options for creating a libsql backend.\n */\nexport type LibsqlBackendOptions = Readonly<{\n  schemaProvisioning?: SchemaProvisioning;\n  /**\n   * Custom table definitions.\n   * Defaults to standard TypeGraph table names.\n   */\n  tables?: SqliteTables;\n}>;\n\n/**\n * Result of creating a libsql backend.\n */\nexport type LibsqlBackendResult = Readonly<{\n  /**\n   * The GraphBackend instance for use with createStore.\n   */\n  backend: AdapterBackend<AnySqliteDatabase>;\n\n  /**\n   * The underlying Drizzle database instance.\n   * Useful for direct SQL access or sharing the connection.\n   */\n  db: LibSQLDatabase;\n}>;\n\n// ============================================================\n// Factory Function\n// ============================================================\n\n/**\n * Creates a TypeGraph backend backed by `@libsql/client`.\n *\n * Handles DDL execution and configures the correct execution profile.\n * Local clients (`client.protocol === \"file\"`, covering `file:` paths and\n * `:memory:` databases — see `isLocalLibsqlClient`) run transactions as raw\n * BEGIN/COMMIT statements on the client's single stable connection\n * (`transactionMode: \"sql\"`): `client.transaction()` permanently hands that\n * connection to the transaction and lazily opens a fresh one afterwards, which\n * for an in-memory database is a fresh, empty database. Remote clients (`http` /\n * `ws`) run each transaction on its own stream via Drizzle's\n * `db.transaction()` (`transactionMode: \"drizzle\"`). The caller retains\n * ownership of the client and is responsible for closing it.\n *\n * Because that single local connection is also what makes a snapshot export and\n * a concurrent write mutually exclusive, `createSqliteBackend` marks the backend\n * with a local client as its serialized transaction resource — so two backends\n * over ONE local client are recognized as one connection by the streaming\n * import guard and the working-copy cloner. Remote clients are deliberately not\n * marked.\n *\n * @param client - An `@libsql/client` Client instance\n * @param options - Configuration options\n * @returns Backend and Drizzle database instances\n *\n * @example\n * ```typescript\n * import { createClient } from \"@libsql/client\";\n * import { createLibsqlBackend } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite/libsql\";\n *\n * const client = createClient({ url: \"file::memory:\" });\n * const { backend } = await createLibsqlBackend(client);\n * ```\n */\nexport async function createLibsqlBackend(\n  client: Client,\n  options: LibsqlBackendOptions = {},\n): Promise<LibsqlBackendResult> {\n  const tables = options.tables ?? defaultTables;\n  const db = drizzle(client);\n  const orderedAggregates = await detectOrderedAggregates(client);\n  const backend = createSqliteBackend(db, {\n    ...(options.schemaProvisioning === undefined ?\n      {}\n    : { schemaProvisioning: options.schemaProvisioning }),\n    capabilities: { orderedAggregates },\n    executionProfile: {\n      isSync: false,\n      transactionMode: isLocalLibsqlClient(client) ? \"sql\" : \"drizzle\",\n    },\n    tables,\n    // libSQL ships native vector search in core — no extension to load —\n    // so the strategy is wired unconditionally.\n    vector: libsqlVectorStrategy,\n  });\n\n  await installLibsqlBaseSchema(client, tables, backend);\n\n  return { backend, db };\n}\nexport type { GraphIdentityConfig } from \"../../core/define-graph\";\n"]}