@nicia-ai/typegraph 0.55.0 → 0.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (148) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/backend/index.cjs +86 -86
  3. package/dist/backend/index.js +7 -7
  4. package/dist/backend/postgres/index.cjs +22 -22
  5. package/dist/backend/postgres/index.js +8 -8
  6. package/dist/backend/postgres/pglite-store.cjs +1 -1
  7. package/dist/backend/postgres/pglite-store.d.cts +2 -2
  8. package/dist/backend/postgres/pglite-store.d.ts +2 -2
  9. package/dist/backend/postgres/pglite-store.js +1 -1
  10. package/dist/backend/postgres/pglite.cjs +10 -10
  11. package/dist/backend/postgres/pglite.js +9 -9
  12. package/dist/backend/sqlite/index.cjs +21 -21
  13. package/dist/backend/sqlite/index.js +8 -8
  14. package/dist/backend/sqlite/libsql.cjs +12 -12
  15. package/dist/backend/sqlite/libsql.js +8 -8
  16. package/dist/backend/sqlite/local-store.cjs +1 -1
  17. package/dist/backend/sqlite/local-store.d.cts +2 -2
  18. package/dist/backend/sqlite/local-store.d.ts +2 -2
  19. package/dist/backend/sqlite/local-store.js +1 -1
  20. package/dist/backend/sqlite/local.cjs +10 -10
  21. package/dist/backend/sqlite/local.js +9 -9
  22. package/dist/{chunk-S5WG5AFG.cjs → chunk-2XUAUSMI.cjs} +12 -12
  23. package/dist/{chunk-S5WG5AFG.cjs.map → chunk-2XUAUSMI.cjs.map} +1 -1
  24. package/dist/{chunk-MTE255N3.cjs → chunk-36XLQHZA.cjs} +4 -4
  25. package/dist/{chunk-MTE255N3.cjs.map → chunk-36XLQHZA.cjs.map} +1 -1
  26. package/dist/{chunk-FWSGKOBN.js → chunk-6LTRZOUU.js} +6 -6
  27. package/dist/{chunk-FWSGKOBN.js.map → chunk-6LTRZOUU.js.map} +1 -1
  28. package/dist/{chunk-YVKPUSHS.js → chunk-75KH6Y2W.js} +16 -7
  29. package/dist/chunk-75KH6Y2W.js.map +1 -0
  30. package/dist/{chunk-MJXEO7YA.js → chunk-762VPGHN.js} +5 -5
  31. package/dist/{chunk-MJXEO7YA.js.map → chunk-762VPGHN.js.map} +1 -1
  32. package/dist/{chunk-GGDTMBNA.cjs → chunk-7CCVR2QF.cjs} +54 -54
  33. package/dist/{chunk-GGDTMBNA.cjs.map → chunk-7CCVR2QF.cjs.map} +1 -1
  34. package/dist/{chunk-7EOJO6QB.js → chunk-7MHENVRG.js} +3 -3
  35. package/dist/{chunk-7EOJO6QB.js.map → chunk-7MHENVRG.js.map} +1 -1
  36. package/dist/{chunk-7B3DSFX3.cjs → chunk-AUTRK6WM.cjs} +4 -4
  37. package/dist/{chunk-7B3DSFX3.cjs.map → chunk-AUTRK6WM.cjs.map} +1 -1
  38. package/dist/{chunk-SIQ4BFL5.js → chunk-AZP5CCHL.js} +4 -4
  39. package/dist/{chunk-SIQ4BFL5.js.map → chunk-AZP5CCHL.js.map} +1 -1
  40. package/dist/{chunk-WTW7RWAG.cjs → chunk-BYUIOM4L.cjs} +6 -6
  41. package/dist/{chunk-WTW7RWAG.cjs.map → chunk-BYUIOM4L.cjs.map} +1 -1
  42. package/dist/{chunk-74FNI3PT.js → chunk-C3TJU4KQ.js} +6 -6
  43. package/dist/chunk-C3TJU4KQ.js.map +1 -0
  44. package/dist/{chunk-7V2R4MH6.js → chunk-CEQOTZGB.js} +5 -5
  45. package/dist/{chunk-7V2R4MH6.js.map → chunk-CEQOTZGB.js.map} +1 -1
  46. package/dist/{chunk-TKFQLKH2.cjs → chunk-CYKHSH5O.cjs} +36 -36
  47. package/dist/{chunk-TKFQLKH2.cjs.map → chunk-CYKHSH5O.cjs.map} +1 -1
  48. package/dist/{chunk-D5TCKAQT.cjs → chunk-DGIA64DM.cjs} +4 -4
  49. package/dist/{chunk-D5TCKAQT.cjs.map → chunk-DGIA64DM.cjs.map} +1 -1
  50. package/dist/{chunk-FFR3YUY2.js → chunk-E4QYEWVH.js} +5 -5
  51. package/dist/{chunk-FFR3YUY2.js.map → chunk-E4QYEWVH.js.map} +1 -1
  52. package/dist/{chunk-467YITD4.cjs → chunk-ETU5IILQ.cjs} +13 -13
  53. package/dist/{chunk-467YITD4.cjs.map → chunk-ETU5IILQ.cjs.map} +1 -1
  54. package/dist/{chunk-HW3IX2RF.js → chunk-EWRLWI7W.js} +4 -4
  55. package/dist/{chunk-HW3IX2RF.js.map → chunk-EWRLWI7W.js.map} +1 -1
  56. package/dist/{chunk-KZ6OHFDV.js → chunk-F2S5JWCT.js} +3 -3
  57. package/dist/{chunk-KZ6OHFDV.js.map → chunk-F2S5JWCT.js.map} +1 -1
  58. package/dist/{chunk-45WPPI64.js → chunk-FMCPKMQI.js} +3 -3
  59. package/dist/{chunk-45WPPI64.js.map → chunk-FMCPKMQI.js.map} +1 -1
  60. package/dist/{chunk-QM6IQW7B.js → chunk-ILHVYKXJ.js} +7 -7
  61. package/dist/{chunk-QM6IQW7B.js.map → chunk-ILHVYKXJ.js.map} +1 -1
  62. package/dist/{chunk-ECYEWFEH.cjs → chunk-J34FSPSC.cjs} +16 -6
  63. package/dist/chunk-J34FSPSC.cjs.map +1 -0
  64. package/dist/{chunk-GFYCLCGU.cjs → chunk-KM3CLHDB.cjs} +9 -9
  65. package/dist/{chunk-GFYCLCGU.cjs.map → chunk-KM3CLHDB.cjs.map} +1 -1
  66. package/dist/{chunk-SLNH62T3.js → chunk-KQYUKOGX.js} +3 -3
  67. package/dist/{chunk-SLNH62T3.js.map → chunk-KQYUKOGX.js.map} +1 -1
  68. package/dist/{chunk-7I2PYI4U.cjs → chunk-KR3N6Y7O.cjs} +67 -67
  69. package/dist/{chunk-7I2PYI4U.cjs.map → chunk-KR3N6Y7O.cjs.map} +1 -1
  70. package/dist/{chunk-HZCOCNIX.cjs → chunk-L2REUAJB.cjs} +24 -24
  71. package/dist/{chunk-HZCOCNIX.cjs.map → chunk-L2REUAJB.cjs.map} +1 -1
  72. package/dist/{chunk-VU65FXEG.js → chunk-LFXBFPI2.js} +66 -29
  73. package/dist/chunk-LFXBFPI2.js.map +1 -0
  74. package/dist/{chunk-NXRSR6QG.js → chunk-MHM6OGZR.js} +9 -9
  75. package/dist/{chunk-NXRSR6QG.js.map → chunk-MHM6OGZR.js.map} +1 -1
  76. package/dist/{chunk-FCUSVSYX.js → chunk-MRGWM5LE.js} +10 -10
  77. package/dist/{chunk-FCUSVSYX.js.map → chunk-MRGWM5LE.js.map} +1 -1
  78. package/dist/{chunk-WXGMDROJ.js → chunk-QDNEXTON.js} +7 -7
  79. package/dist/{chunk-WXGMDROJ.js.map → chunk-QDNEXTON.js.map} +1 -1
  80. package/dist/{chunk-VYU5H4FO.js → chunk-RXA2D3UR.js} +3 -3
  81. package/dist/{chunk-VYU5H4FO.js.map → chunk-RXA2D3UR.js.map} +1 -1
  82. package/dist/{chunk-XODNY4QI.js → chunk-TIBSLFHR.js} +6 -6
  83. package/dist/{chunk-XODNY4QI.js.map → chunk-TIBSLFHR.js.map} +1 -1
  84. package/dist/{chunk-KZG7HQSN.cjs → chunk-UVMSWO6X.cjs} +173 -173
  85. package/dist/{chunk-KZG7HQSN.cjs.map → chunk-UVMSWO6X.cjs.map} +1 -1
  86. package/dist/{chunk-ORPT5EQW.cjs → chunk-UZ6CJUC5.cjs} +27 -27
  87. package/dist/chunk-UZ6CJUC5.cjs.map +1 -0
  88. package/dist/{chunk-GNF3PHEQ.cjs → chunk-VF2IMMZT.cjs} +17 -17
  89. package/dist/{chunk-GNF3PHEQ.cjs.map → chunk-VF2IMMZT.cjs.map} +1 -1
  90. package/dist/{chunk-PGZV3E3I.cjs → chunk-VXEHEPC4.cjs} +4 -4
  91. package/dist/{chunk-PGZV3E3I.cjs.map → chunk-VXEHEPC4.cjs.map} +1 -1
  92. package/dist/{chunk-OJ47LMOB.cjs → chunk-WIUHN6SZ.cjs} +669 -628
  93. package/dist/chunk-WIUHN6SZ.cjs.map +1 -0
  94. package/dist/{chunk-HNW5IDB3.js → chunk-WIZB5U6N.js} +7 -7
  95. package/dist/{chunk-HNW5IDB3.js.map → chunk-WIZB5U6N.js.map} +1 -1
  96. package/dist/{chunk-IDQZI6GL.js → chunk-XH75W3O5.js} +3 -3
  97. package/dist/{chunk-IDQZI6GL.js.map → chunk-XH75W3O5.js.map} +1 -1
  98. package/dist/{chunk-T7LSSV7J.cjs → chunk-XXEFDJHY.cjs} +45 -45
  99. package/dist/{chunk-T7LSSV7J.cjs.map → chunk-XXEFDJHY.cjs.map} +1 -1
  100. package/dist/{chunk-GORCU2GR.cjs → chunk-Z4NU4MYB.cjs} +123 -123
  101. package/dist/{chunk-GORCU2GR.cjs.map → chunk-Z4NU4MYB.cjs.map} +1 -1
  102. package/dist/{chunk-KFC3OUV4.cjs → chunk-ZHK3HEZ2.cjs} +130 -130
  103. package/dist/{chunk-KFC3OUV4.cjs.map → chunk-ZHK3HEZ2.cjs.map} +1 -1
  104. package/dist/{chunk-FYMYLZGX.cjs → chunk-ZXXGMQC3.cjs} +10 -10
  105. package/dist/{chunk-FYMYLZGX.cjs.map → chunk-ZXXGMQC3.cjs.map} +1 -1
  106. package/dist/graph-merge/index.cjs +577 -99
  107. package/dist/graph-merge/index.cjs.map +1 -1
  108. package/dist/graph-merge/index.d.cts +108 -4
  109. package/dist/graph-merge/index.d.ts +108 -4
  110. package/dist/graph-merge/index.js +495 -21
  111. package/dist/graph-merge/index.js.map +1 -1
  112. package/dist/{graph-templates-qraW63Ry.d.ts → graph-templates-BSA9VU_O.d.ts} +1 -1
  113. package/dist/{graph-templates--hp2U4kn.d.cts → graph-templates-Cg7DpEOF.d.cts} +1 -1
  114. package/dist/index.cjs +95 -95
  115. package/dist/index.d.cts +3 -3
  116. package/dist/index.d.ts +3 -3
  117. package/dist/index.js +16 -16
  118. package/dist/interchange/index.cjs +33 -33
  119. package/dist/interchange/index.d.cts +1 -1
  120. package/dist/interchange/index.d.ts +1 -1
  121. package/dist/interchange/index.js +10 -10
  122. package/dist/{local-store-impl-HXBO3VF4.js → local-store-impl-77DCLAAY.js} +18 -18
  123. package/dist/{local-store-impl-HXBO3VF4.js.map → local-store-impl-77DCLAAY.js.map} +1 -1
  124. package/dist/{local-store-impl-CUQKHHOZ.cjs → local-store-impl-NJCWM3KR.cjs} +22 -22
  125. package/dist/{local-store-impl-CUQKHHOZ.cjs.map → local-store-impl-NJCWM3KR.cjs.map} +1 -1
  126. package/dist/{pglite-store-impl-BD3AVOUH.js → pglite-store-impl-3VFSYLAJ.js} +18 -18
  127. package/dist/{pglite-store-impl-BD3AVOUH.js.map → pglite-store-impl-3VFSYLAJ.js.map} +1 -1
  128. package/dist/{pglite-store-impl-C3MQ72LT.cjs → pglite-store-impl-LHLJ3GBQ.cjs} +22 -22
  129. package/dist/{pglite-store-impl-C3MQ72LT.cjs.map → pglite-store-impl-LHLJ3GBQ.cjs.map} +1 -1
  130. package/dist/profiler/index.d.cts +1 -1
  131. package/dist/profiler/index.d.ts +1 -1
  132. package/dist/provenance/index.cjs +21 -21
  133. package/dist/provenance/index.d.cts +1 -1
  134. package/dist/provenance/index.d.ts +1 -1
  135. package/dist/provenance/index.js +5 -5
  136. package/dist/schema/index.cjs +36 -36
  137. package/dist/schema/index.d.cts +3 -3
  138. package/dist/schema/index.d.ts +3 -3
  139. package/dist/schema/index.js +6 -6
  140. package/dist/{store-stw2AEB4.d.ts → store-CQ3uzXla.d.ts} +58 -27
  141. package/dist/{store-DTEkUQ0k.d.cts → store-DbHAgVMH.d.cts} +58 -27
  142. package/package.json +1 -1
  143. package/dist/chunk-74FNI3PT.js.map +0 -1
  144. package/dist/chunk-ECYEWFEH.cjs.map +0 -1
  145. package/dist/chunk-OJ47LMOB.cjs.map +0 -1
  146. package/dist/chunk-ORPT5EQW.cjs.map +0 -1
  147. package/dist/chunk-VU65FXEG.js.map +0 -1
  148. package/dist/chunk-YVKPUSHS.js.map +0 -1
@@ -1,12 +1,12 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkQCD5JKU4_cjs = require('./chunk-QCD5JKU4.cjs');
4
- var chunkGORCU2GR_cjs = require('./chunk-GORCU2GR.cjs');
5
- var chunkGGDTMBNA_cjs = require('./chunk-GGDTMBNA.cjs');
4
+ var chunkZ4NU4MYB_cjs = require('./chunk-Z4NU4MYB.cjs');
5
+ var chunk7CCVR2QF_cjs = require('./chunk-7CCVR2QF.cjs');
6
6
  var chunkKJ4IMWPI_cjs = require('./chunk-KJ4IMWPI.cjs');
7
- var chunkPGZV3E3I_cjs = require('./chunk-PGZV3E3I.cjs');
7
+ var chunkVXEHEPC4_cjs = require('./chunk-VXEHEPC4.cjs');
8
8
  var chunk5X46XWNH_cjs = require('./chunk-5X46XWNH.cjs');
9
- var chunkECYEWFEH_cjs = require('./chunk-ECYEWFEH.cjs');
9
+ var chunkJ34FSPSC_cjs = require('./chunk-J34FSPSC.cjs');
10
10
  var chunkASKXTVK5_cjs = require('./chunk-ASKXTVK5.cjs');
11
11
  var module$1 = require('module');
12
12
  var Database = require('better-sqlite3');
@@ -18,26 +18,26 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
18
18
 
19
19
  var Database__default = /*#__PURE__*/_interopDefault(Database);
20
20
 
21
- var nodeRequire = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-GNF3PHEQ.cjs', document.baseURI).href)));
21
+ var nodeRequire = module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('chunk-VF2IMMZT.cjs', document.baseURI).href)));
22
22
  function installLocalSqliteBaseSchema(sqlite, tables2) {
23
- if (chunkGGDTMBNA_cjs.CURRENT_BASE_SCHEMA_VERSION !== 1) {
23
+ if (chunk7CCVR2QF_cjs.CURRENT_BASE_SCHEMA_VERSION !== 1) {
24
24
  throw new chunkASKXTVK5_cjs.CompilerInvariantError(
25
25
  "The synchronous managed SQLite installation path only implements base-schema v1 adoption.",
26
- { currentVersion: chunkGGDTMBNA_cjs.CURRENT_BASE_SCHEMA_VERSION }
26
+ { currentVersion: chunk7CCVR2QF_cjs.CURRENT_BASE_SCHEMA_VERSION }
27
27
  );
28
28
  }
29
- const installationSql = chunkGGDTMBNA_cjs.generateSqliteMigrationSQL(tables2);
29
+ const installationSql = chunk7CCVR2QF_cjs.generateSqliteMigrationSQL(tables2);
30
30
  try {
31
31
  sqlite.exec(installationSql);
32
32
  } catch (error) {
33
33
  if (!chunk5X46XWNH_cjs.isSqliteMissingEdgeMatchIdentityColumnError(error)) throw error;
34
34
  const edgeTableName = drizzleOrm.getTableName(tables2.edges);
35
35
  for (let attempt = 0; attempt < 3; attempt += 1) {
36
- const rows = sqlite.prepare(`PRAGMA table_info(${chunkGGDTMBNA_cjs.quoteDdlIdentifier(edgeTableName)})`).all();
36
+ const rows = sqlite.prepare(`PRAGMA table_info(${chunk7CCVR2QF_cjs.quoteDdlIdentifier(edgeTableName)})`).all();
37
37
  const columns = new Set(
38
38
  rows.flatMap((row) => typeof row.name === "string" ? [row.name] : [])
39
39
  );
40
- const adoptionSql = chunkGGDTMBNA_cjs.planSqliteEdgeMatchIdentityAdoption(
40
+ const adoptionSql = chunk7CCVR2QF_cjs.planSqliteEdgeMatchIdentityAdoption(
41
41
  edgeTableName,
42
42
  columns
43
43
  );
@@ -164,16 +164,16 @@ function applyConnectionPragmas(sqlite, pragmas) {
164
164
  }
165
165
  }
166
166
  function createLocalSqliteBackend(options = {}) {
167
- chunkGGDTMBNA_cjs.assertNoLegacyTransactionCapability(options.capabilities);
167
+ chunk7CCVR2QF_cjs.assertNoLegacyTransactionCapability(options.capabilities);
168
168
  const path = options.path ?? ":memory:";
169
- const tables2 = options.tables ?? chunkGGDTMBNA_cjs.tables2;
169
+ const tables2 = options.tables ?? chunk7CCVR2QF_cjs.tables2;
170
170
  const sqlite = createDatabase(path);
171
171
  try {
172
172
  applyConnectionPragmas(sqlite, options.pragmas);
173
173
  const hasSqliteVec = tryLoadSqliteVec(sqlite);
174
174
  const db = betterSqlite3.drizzle(sqlite);
175
175
  installLocalSqliteBaseSchema(sqlite, tables2);
176
- const backend = chunkGORCU2GR_cjs.createSqliteBackend(db, {
176
+ const backend = chunkZ4NU4MYB_cjs.createSqliteBackend(db, {
177
177
  executionProfile: {
178
178
  isSync: true
179
179
  },
@@ -187,10 +187,10 @@ function createLocalSqliteBackend(options = {}) {
187
187
  }
188
188
  }
189
189
  });
190
- const managedBackend = chunkECYEWFEH_cjs.wrapWithManagedClose(backend, () => {
190
+ const managedBackend = chunkJ34FSPSC_cjs.wrapWithManagedClose(backend, () => {
191
191
  sqlite.close();
192
192
  });
193
- return { backend: chunkPGZV3E3I_cjs.markBundledRootAutocommitEligible(managedBackend), db };
193
+ return { backend: chunkVXEHEPC4_cjs.markBundledRootAutocommitEligible(managedBackend), db };
194
194
  } catch (error) {
195
195
  try {
196
196
  sqlite.close();
@@ -213,5 +213,5 @@ function tryLoadSqliteVec(sqlite) {
213
213
  }
214
214
 
215
215
  exports.createLocalSqliteBackend = createLocalSqliteBackend;
216
- //# sourceMappingURL=chunk-GNF3PHEQ.cjs.map
217
- //# sourceMappingURL=chunk-GNF3PHEQ.cjs.map
216
+ //# sourceMappingURL=chunk-VF2IMMZT.cjs.map
217
+ //# sourceMappingURL=chunk-VF2IMMZT.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/backend/sqlite/local.ts"],"names":["createRequire","tables","CURRENT_BASE_SCHEMA_VERSION","CompilerInvariantError","generateSqliteMigrationSQL","isSqliteMissingEdgeMatchIdentityColumnError","getTableName","quoteDdlIdentifier","planSqliteEdgeMatchIdentityAdoption","isSqliteDuplicateEdgeMatchIdentityColumnError","Database","ConfigurationError","DEFAULT_LOCAL_SQLITE_PRAGMAS","assertNoLegacyTransactionCapability","drizzle","createSqliteBackend","sqliteVecStrategy","wrapWithManagedClose","markBundledRootAutocommitEligible"],"mappings":"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","file":"chunk-GNF3PHEQ.cjs","sourcesContent":["/**\n * Local SQLite backend using better-sqlite3.\n *\n * This module depends on the `better-sqlite3` native addon and should only\n * be imported in Node.js environments. For bundler-friendly SQLite DDL\n * generation and Drizzle backend creation, import from `@nicia-ai/typegraph/adapters/drizzle/sqlite`.\n *\n * @example In-memory database (default)\n * ```typescript\n * import { createLocalSqliteBackend } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite/local\";\n *\n * const { backend, db } = createLocalSqliteBackend();\n * const store = createStore(graph, backend);\n * ```\n *\n * @example File-based database for persistent local development\n * ```typescript\n * import { createLocalSqliteBackend } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite/local\";\n *\n * const { backend, db } = createLocalSqliteBackend({ path: \"./dev.db\" });\n * const store = createStore(graph, backend);\n * ```\n */\nimport { createRequire } from \"node:module\";\n\nimport Database from \"better-sqlite3\";\nimport { getTableName } from \"drizzle-orm\";\nimport {\n type BetterSQLite3Database,\n drizzle,\n} from \"drizzle-orm/better-sqlite3\";\n\nimport { CompilerInvariantError, ConfigurationError } from \"../../errors\";\nimport { sqliteVecStrategy } from \"../../query/dialect/vector/sqlite-vec-strategy\";\nimport {\n isSqliteDuplicateEdgeMatchIdentityColumnError,\n isSqliteMissingEdgeMatchIdentityColumnError,\n} from \"../../utils/sql-errors\";\nimport { markBundledRootAutocommitEligible } from \"../capabilities/autocommit-single-statement\";\nimport { wrapWithManagedClose } from \"../derive-backend\";\nimport { CURRENT_BASE_SCHEMA_VERSION } from \"../drizzle/base-schema\";\nimport {\n generateSqliteMigrationSQL,\n planSqliteEdgeMatchIdentityAdoption,\n quoteDdlIdentifier,\n} from \"../drizzle/ddl\";\nimport { type AnySqliteDatabase } from \"../drizzle/execution\";\nexport type { AnySqliteDatabase } from \"../drizzle/execution\";\nimport { assertNoLegacyTransactionCapability } from \"../capabilities/declarations\";\nimport {\n createSqliteBackend,\n type SqliteTables,\n tables as defaultTables,\n} from \"../drizzle/sqlite\";\nimport {\n DEFAULT_LOCAL_SQLITE_PRAGMAS,\n type LocalSqliteJournalMode,\n type LocalSqlitePragmaOptions,\n type LocalSqliteSynchronousMode,\n} from \"./local-options\";\n\nexport {\n DEFAULT_LOCAL_SQLITE_PRAGMAS,\n type LocalSqliteJournalMode,\n type LocalSqlitePragmaOptions,\n type LocalSqliteSynchronousMode,\n} from \"./local-options\";\nimport {\n type AdapterBackend,\n type BundledBackendCapabilityOverrides,\n} from \"../types\";\nexport type { BundledBackendCapabilityOverrides } from \"../types\";\nexport type {\n ContributionDiagnostic,\n ContributionDiagnosticState,\n ContributionRepairEntry,\n ContributionRepairResult,\n} from \"../types\";\n\nconst nodeRequire = createRequire(import.meta.url);\n\nfunction installLocalSqliteBaseSchema(\n sqlite: Database.Database,\n tables: SqliteTables,\n): void {\n if (CURRENT_BASE_SCHEMA_VERSION !== 1) {\n throw new CompilerInvariantError(\n \"The synchronous managed SQLite installation path only implements base-schema v1 adoption.\",\n { currentVersion: CURRENT_BASE_SCHEMA_VERSION },\n );\n }\n const installationSql = generateSqliteMigrationSQL(tables);\n try {\n sqlite.exec(installationSql);\n } catch (error) {\n if (!isSqliteMissingEdgeMatchIdentityColumnError(error)) throw error;\n const edgeTableName = getTableName(tables.edges);\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const rows = sqlite\n .prepare(`PRAGMA table_info(${quoteDdlIdentifier(edgeTableName)})`)\n .all() as readonly Readonly<{ name?: unknown }>[];\n const columns = new Set(\n rows.flatMap((row) => (typeof row.name === \"string\" ? [row.name] : [])),\n );\n const adoptionSql = planSqliteEdgeMatchIdentityAdoption(\n edgeTableName,\n columns,\n );\n try {\n sqlite.exec([...adoptionSql, installationSql].join(\"\\n\"));\n return;\n } catch (repairError) {\n if (\n attempt === 2 ||\n !isSqliteDuplicateEdgeMatchIdentityColumnError(repairError)\n ) {\n throw repairError;\n }\n }\n }\n throw new CompilerInvariantError(\n \"Local SQLite match-identity adoption exhausted its retry loop without returning or throwing.\",\n );\n }\n}\n\n// ============================================================\n// Native Addon Helpers\n// ============================================================\n\ntype NodeModuleVersionMismatch = Readonly<{\n compiled: number;\n required: number;\n}>;\n\nfunction getUnknownErrorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\nfunction parseNodeModuleVersionMismatchMessage(\n message: string,\n): NodeModuleVersionMismatch | undefined {\n const regexp =\n /NODE_MODULE_VERSION (?<compiled>\\d+)[\\s\\S]*?NODE_MODULE_VERSION (?<required>\\d+)/;\n const match = regexp.exec(message);\n if (!match?.groups) return undefined;\n\n const compiled = Number(match.groups[\"compiled\"]);\n const required = Number(match.groups[\"required\"]);\n\n if (!Number.isFinite(compiled) || !Number.isFinite(required))\n return undefined;\n\n return { compiled, required };\n}\n\nfunction createDatabase(path: string): Database.Database {\n try {\n return new Database(path);\n } catch (error) {\n const message = getUnknownErrorMessage(error);\n const mismatch = parseNodeModuleVersionMismatchMessage(message);\n if (!mismatch) throw error;\n\n throw new ConfigurationError(\n [\n \"Failed to load better-sqlite3 native addon.\",\n `It was compiled for NODE_MODULE_VERSION ${mismatch.compiled}, but this Node.js runtime requires ${mismatch.required}.`,\n \"This usually happens after switching Node versions without rebuilding native dependencies.\",\n \"Rebuild with: pnpm rebuild better-sqlite3 (or npm rebuild better-sqlite3).\",\n ].join(\" \"),\n {\n nodeVersion: process.version,\n nodeModuleVersion: process.versions.modules,\n compiledNodeModuleVersion: mismatch.compiled,\n requiredNodeModuleVersion: mismatch.required,\n },\n { cause: error },\n );\n }\n}\n\n// ============================================================\n// Types\n// ============================================================\n\nconst LOCAL_SQLITE_JOURNAL_MODES: readonly LocalSqliteJournalMode[] = [\n \"wal\",\n \"delete\",\n \"truncate\",\n \"persist\",\n \"memory\",\n \"off\",\n];\n\nconst LOCAL_SQLITE_SYNCHRONOUS_MODES: readonly LocalSqliteSynchronousMode[] = [\n \"off\",\n \"normal\",\n \"full\",\n \"extra\",\n];\n\nconst SQLITE_MAX_WAL_AUTOCHECKPOINT_PAGES = 2_147_483_647;\n\nfunction applyConnectionPragmas(\n sqlite: Database.Database,\n pragmas: LocalSqlitePragmaOptions | false | undefined,\n): void {\n if (pragmas === false) return;\n const resolved: Required<LocalSqlitePragmaOptions> = {\n ...DEFAULT_LOCAL_SQLITE_PRAGMAS,\n ...pragmas,\n };\n\n // Runtime guards mirror the compile-time unions: pragma values are spliced\n // into pragma statements, so reject anything outside the allowlists rather\n // than forwarding it to SQLite.\n if (!LOCAL_SQLITE_JOURNAL_MODES.includes(resolved.journalMode)) {\n throw new ConfigurationError(\n `Invalid journalMode pragma: ${resolved.journalMode}. ` +\n `Expected one of: ${LOCAL_SQLITE_JOURNAL_MODES.join(\", \")}.`,\n { journalMode: resolved.journalMode },\n );\n }\n if (!LOCAL_SQLITE_SYNCHRONOUS_MODES.includes(resolved.synchronous)) {\n throw new ConfigurationError(\n `Invalid synchronous pragma: ${resolved.synchronous}. ` +\n `Expected one of: ${LOCAL_SQLITE_SYNCHRONOUS_MODES.join(\", \")}.`,\n { synchronous: resolved.synchronous },\n );\n }\n if (\n !Number.isSafeInteger(resolved.busyTimeoutMs) ||\n resolved.busyTimeoutMs < 0\n ) {\n throw new ConfigurationError(\n `Invalid busyTimeoutMs pragma: ${String(resolved.busyTimeoutMs)}. ` +\n \"Expected a non-negative integer number of milliseconds.\",\n { busyTimeoutMs: resolved.busyTimeoutMs },\n );\n }\n if (\n resolved.cacheSizeKib !== undefined &&\n (!Number.isSafeInteger(resolved.cacheSizeKib) || resolved.cacheSizeKib >= 0)\n ) {\n throw new ConfigurationError(\n `Invalid cacheSizeKib pragma: ${String(resolved.cacheSizeKib)}. ` +\n \"Expected a negative safe integer — SQLite's own cache_size pragma \" +\n \"interprets a positive value as a page count, not KiB, so a caller \" +\n 'who passes e.g. 131072 meaning \"131072 KiB\" silently gets ' +\n \"131072 pages (~512MiB at the default 4KiB page size) instead.\",\n { cacheSizeKib: resolved.cacheSizeKib },\n );\n }\n if (\n resolved.mmapSizeBytes !== undefined &&\n (!Number.isSafeInteger(resolved.mmapSizeBytes) ||\n resolved.mmapSizeBytes < 0)\n ) {\n throw new ConfigurationError(\n `Invalid mmapSizeBytes pragma: ${String(resolved.mmapSizeBytes)}. ` +\n \"Expected a non-negative safe integer number of bytes.\",\n { mmapSizeBytes: resolved.mmapSizeBytes },\n );\n }\n if (\n resolved.walAutocheckpointPages !== undefined &&\n (!Number.isSafeInteger(resolved.walAutocheckpointPages) ||\n resolved.walAutocheckpointPages < 0 ||\n resolved.walAutocheckpointPages > SQLITE_MAX_WAL_AUTOCHECKPOINT_PAGES)\n ) {\n throw new ConfigurationError(\n `Invalid walAutocheckpointPages pragma: ${String(resolved.walAutocheckpointPages)}. ` +\n `Expected an integer between 0 and ${SQLITE_MAX_WAL_AUTOCHECKPOINT_PAGES} ` +\n \"WAL pages (0 disables automatic checkpointing entirely).\",\n { walAutocheckpointPages: resolved.walAutocheckpointPages },\n );\n }\n\n // \":memory:\" databases always journal in memory; SQLite answers the WAL\n // request with \"memory\" instead of erroring, so no special-casing needed.\n sqlite.pragma(`journal_mode = ${resolved.journalMode}`);\n sqlite.pragma(`synchronous = ${resolved.synchronous}`);\n sqlite.pragma(`busy_timeout = ${resolved.busyTimeoutMs}`);\n if (resolved.cacheSizeKib !== undefined) {\n sqlite.pragma(`cache_size = ${resolved.cacheSizeKib}`);\n }\n if (resolved.mmapSizeBytes !== undefined) {\n sqlite.pragma(`mmap_size = ${resolved.mmapSizeBytes}`);\n }\n if (resolved.walAutocheckpointPages !== undefined) {\n sqlite.pragma(`wal_autocheckpoint = ${resolved.walAutocheckpointPages}`);\n }\n}\n\n/**\n * Options for creating a local SQLite backend.\n */\nexport type LocalSqliteBackendOptions = Readonly<{\n /**\n * Path to the SQLite database file.\n * Defaults to \":memory:\" for an in-memory database.\n */\n path?: string;\n\n /**\n * Connection pragmas applied at open. Defaults to\n * {@link DEFAULT_LOCAL_SQLITE_PRAGMAS} (WAL, `synchronous=NORMAL`, 5s busy\n * timeout, and SQLite's own tiny built-in page cache / disabled mmap\n * left untouched). Individual values merge over the defaults; pass\n * `false` to skip pragma configuration entirely and keep the driver\n * defaults (rollback journal, `synchronous=FULL`, and better-sqlite3's\n * own 5s busy timeout from its `timeout` constructor option). Set\n * `cacheSizeKib`/`mmapSizeBytes` explicitly once a database's working\n * set is known to exceed SQLite's 2MiB default cache — otherwise every\n * query pays a fresh disk read per page past that tiny working set. Set\n * `walAutocheckpointPages` explicitly for a bulk-insert-heavy workload —\n * SQLite's own default checkpoints every ~4MiB of WAL growth, which gets\n * more expensive as the database file grows over a large load.\n */\n pragmas?: LocalSqlitePragmaOptions | false;\n\n /**\n * Custom table definitions.\n * Defaults to standard TypeGraph table names.\n */\n tables?: SqliteTables;\n\n /**\n * Override specific backend capabilities — e.g. to simulate an engine-level\n * gap like missing SQL window functions in tests. Forwarded to\n * createSqliteBackend.\n */\n capabilities?: BundledBackendCapabilityOverrides;\n}>;\n\n/**\n * Result of creating a local SQLite backend.\n */\nexport type LocalSqliteBackendResult = 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 cleanup.\n */\n db: BetterSQLite3Database;\n}>;\n\n// ============================================================\n// Factory Function\n// ============================================================\n\n/**\n * Creates a SQLite backend with minimal configuration.\n *\n * This is a convenience function for local development and testing.\n * It handles database creation, schema migration, and backend setup.\n *\n * For production deployments or custom configurations, use createSqliteBackend\n * directly with your own Drizzle database instance.\n *\n * @param options - Configuration options\n * @returns Backend and database instances\n *\n * @example In-memory database (default)\n * ```typescript\n * const { backend } = createLocalSqliteBackend();\n * const store = createStore(graph, backend);\n * ```\n *\n * @example File-based database\n * ```typescript\n * const { backend, db } = createLocalSqliteBackend({ path: \"./data.db\" });\n * const store = createStore(graph, backend);\n * ```\n */\nexport function createLocalSqliteBackend(\n options: LocalSqliteBackendOptions = {},\n): LocalSqliteBackendResult {\n assertNoLegacyTransactionCapability(options.capabilities);\n const path = options.path ?? \":memory:\";\n const tables = options.tables ?? defaultTables;\n\n const sqlite = createDatabase(path);\n try {\n applyConnectionPragmas(sqlite, options.pragmas);\n\n // Best-effort: load sqlite-vec so embedding fields are persisted to\n // per-`(kind, field)` `vec0` storage. Without it, nodes with\n // `embedding()` fields validate and insert but their vectors are silently\n // dropped. When the user has installed sqlite-vec as a peer dep we load\n // it and wire the strategy; otherwise we proceed without vector support.\n const hasSqliteVec = tryLoadSqliteVec(sqlite);\n\n const db = drizzle(sqlite);\n\n // The managed factory owns a complete fresh installation, including the\n // deployment-wide base-schema marker consumed by verified/runtime-only\n // entrypoints. Raw generateSqliteDDL intentionally omits that marker.\n installLocalSqliteBaseSchema(sqlite, tables);\n\n const backend = createSqliteBackend(db, {\n executionProfile: {\n isSync: true,\n },\n tables,\n ...(hasSqliteVec ? { vector: sqliteVecStrategy } : {}),\n capabilities: {\n ...options.capabilities,\n graphAnalytics: {\n supported:\n options.capabilities?.graphAnalytics?.supported ??\n options.capabilities?.execution?.interactiveTransactions !== false,\n mathFunctions:\n options.capabilities?.graphAnalytics?.mathFunctions ?? true,\n },\n },\n });\n const managedBackend = wrapWithManagedClose(backend, () => {\n sqlite.close();\n });\n\n return { backend: markBundledRootAutocommitEligible(managedBackend), db };\n } catch (error) {\n try {\n sqlite.close();\n } catch {\n // Preserve the provisioning error; a cleanup failure is secondary.\n }\n throw error;\n }\n}\n\nfunction tryLoadSqliteVec(sqlite: Database.Database): boolean {\n try {\n // `sqlite-vec` is an optional peer dep; resolved via createRequire so\n // bundlers don't mark it as a hard import. Node resolves the package\n // only when it's actually installed.\n const module_: unknown = nodeRequire(\"sqlite-vec\");\n if (\n typeof module_ === \"object\" &&\n module_ !== null &&\n \"load\" in module_ &&\n typeof module_.load === \"function\"\n ) {\n (module_ as { load: (db: Database.Database) => void }).load(sqlite);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\nexport type { GraphIdentityConfig } from \"../../core/define-graph\";\n"]}
1
+ {"version":3,"sources":["../src/backend/sqlite/local.ts"],"names":["createRequire","tables","CURRENT_BASE_SCHEMA_VERSION","CompilerInvariantError","generateSqliteMigrationSQL","isSqliteMissingEdgeMatchIdentityColumnError","getTableName","quoteDdlIdentifier","planSqliteEdgeMatchIdentityAdoption","isSqliteDuplicateEdgeMatchIdentityColumnError","Database","ConfigurationError","DEFAULT_LOCAL_SQLITE_PRAGMAS","assertNoLegacyTransactionCapability","drizzle","createSqliteBackend","sqliteVecStrategy","wrapWithManagedClose","markBundledRootAutocommitEligible"],"mappings":"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","file":"chunk-VF2IMMZT.cjs","sourcesContent":["/**\n * Local SQLite backend using better-sqlite3.\n *\n * This module depends on the `better-sqlite3` native addon and should only\n * be imported in Node.js environments. For bundler-friendly SQLite DDL\n * generation and Drizzle backend creation, import from `@nicia-ai/typegraph/adapters/drizzle/sqlite`.\n *\n * @example In-memory database (default)\n * ```typescript\n * import { createLocalSqliteBackend } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite/local\";\n *\n * const { backend, db } = createLocalSqliteBackend();\n * const store = createStore(graph, backend);\n * ```\n *\n * @example File-based database for persistent local development\n * ```typescript\n * import { createLocalSqliteBackend } from \"@nicia-ai/typegraph/adapters/drizzle/sqlite/local\";\n *\n * const { backend, db } = createLocalSqliteBackend({ path: \"./dev.db\" });\n * const store = createStore(graph, backend);\n * ```\n */\nimport { createRequire } from \"node:module\";\n\nimport Database from \"better-sqlite3\";\nimport { getTableName } from \"drizzle-orm\";\nimport {\n type BetterSQLite3Database,\n drizzle,\n} from \"drizzle-orm/better-sqlite3\";\n\nimport { CompilerInvariantError, ConfigurationError } from \"../../errors\";\nimport { sqliteVecStrategy } from \"../../query/dialect/vector/sqlite-vec-strategy\";\nimport {\n isSqliteDuplicateEdgeMatchIdentityColumnError,\n isSqliteMissingEdgeMatchIdentityColumnError,\n} from \"../../utils/sql-errors\";\nimport { markBundledRootAutocommitEligible } from \"../capabilities/autocommit-single-statement\";\nimport { wrapWithManagedClose } from \"../derive-backend\";\nimport { CURRENT_BASE_SCHEMA_VERSION } from \"../drizzle/base-schema\";\nimport {\n generateSqliteMigrationSQL,\n planSqliteEdgeMatchIdentityAdoption,\n quoteDdlIdentifier,\n} from \"../drizzle/ddl\";\nimport { type AnySqliteDatabase } from \"../drizzle/execution\";\nexport type { AnySqliteDatabase } from \"../drizzle/execution\";\nimport { assertNoLegacyTransactionCapability } from \"../capabilities/declarations\";\nimport {\n createSqliteBackend,\n type SqliteTables,\n tables as defaultTables,\n} from \"../drizzle/sqlite\";\nimport {\n DEFAULT_LOCAL_SQLITE_PRAGMAS,\n type LocalSqliteJournalMode,\n type LocalSqlitePragmaOptions,\n type LocalSqliteSynchronousMode,\n} from \"./local-options\";\n\nexport {\n DEFAULT_LOCAL_SQLITE_PRAGMAS,\n type LocalSqliteJournalMode,\n type LocalSqlitePragmaOptions,\n type LocalSqliteSynchronousMode,\n} from \"./local-options\";\nimport {\n type AdapterBackend,\n type BundledBackendCapabilityOverrides,\n} from \"../types\";\nexport type { BundledBackendCapabilityOverrides } from \"../types\";\nexport type {\n ContributionDiagnostic,\n ContributionDiagnosticState,\n ContributionRepairEntry,\n ContributionRepairResult,\n} from \"../types\";\n\nconst nodeRequire = createRequire(import.meta.url);\n\nfunction installLocalSqliteBaseSchema(\n sqlite: Database.Database,\n tables: SqliteTables,\n): void {\n if (CURRENT_BASE_SCHEMA_VERSION !== 1) {\n throw new CompilerInvariantError(\n \"The synchronous managed SQLite installation path only implements base-schema v1 adoption.\",\n { currentVersion: CURRENT_BASE_SCHEMA_VERSION },\n );\n }\n const installationSql = generateSqliteMigrationSQL(tables);\n try {\n sqlite.exec(installationSql);\n } catch (error) {\n if (!isSqliteMissingEdgeMatchIdentityColumnError(error)) throw error;\n const edgeTableName = getTableName(tables.edges);\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const rows = sqlite\n .prepare(`PRAGMA table_info(${quoteDdlIdentifier(edgeTableName)})`)\n .all() as readonly Readonly<{ name?: unknown }>[];\n const columns = new Set(\n rows.flatMap((row) => (typeof row.name === \"string\" ? [row.name] : [])),\n );\n const adoptionSql = planSqliteEdgeMatchIdentityAdoption(\n edgeTableName,\n columns,\n );\n try {\n sqlite.exec([...adoptionSql, installationSql].join(\"\\n\"));\n return;\n } catch (repairError) {\n if (\n attempt === 2 ||\n !isSqliteDuplicateEdgeMatchIdentityColumnError(repairError)\n ) {\n throw repairError;\n }\n }\n }\n throw new CompilerInvariantError(\n \"Local SQLite match-identity adoption exhausted its retry loop without returning or throwing.\",\n );\n }\n}\n\n// ============================================================\n// Native Addon Helpers\n// ============================================================\n\ntype NodeModuleVersionMismatch = Readonly<{\n compiled: number;\n required: number;\n}>;\n\nfunction getUnknownErrorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\nfunction parseNodeModuleVersionMismatchMessage(\n message: string,\n): NodeModuleVersionMismatch | undefined {\n const regexp =\n /NODE_MODULE_VERSION (?<compiled>\\d+)[\\s\\S]*?NODE_MODULE_VERSION (?<required>\\d+)/;\n const match = regexp.exec(message);\n if (!match?.groups) return undefined;\n\n const compiled = Number(match.groups[\"compiled\"]);\n const required = Number(match.groups[\"required\"]);\n\n if (!Number.isFinite(compiled) || !Number.isFinite(required))\n return undefined;\n\n return { compiled, required };\n}\n\nfunction createDatabase(path: string): Database.Database {\n try {\n return new Database(path);\n } catch (error) {\n const message = getUnknownErrorMessage(error);\n const mismatch = parseNodeModuleVersionMismatchMessage(message);\n if (!mismatch) throw error;\n\n throw new ConfigurationError(\n [\n \"Failed to load better-sqlite3 native addon.\",\n `It was compiled for NODE_MODULE_VERSION ${mismatch.compiled}, but this Node.js runtime requires ${mismatch.required}.`,\n \"This usually happens after switching Node versions without rebuilding native dependencies.\",\n \"Rebuild with: pnpm rebuild better-sqlite3 (or npm rebuild better-sqlite3).\",\n ].join(\" \"),\n {\n nodeVersion: process.version,\n nodeModuleVersion: process.versions.modules,\n compiledNodeModuleVersion: mismatch.compiled,\n requiredNodeModuleVersion: mismatch.required,\n },\n { cause: error },\n );\n }\n}\n\n// ============================================================\n// Types\n// ============================================================\n\nconst LOCAL_SQLITE_JOURNAL_MODES: readonly LocalSqliteJournalMode[] = [\n \"wal\",\n \"delete\",\n \"truncate\",\n \"persist\",\n \"memory\",\n \"off\",\n];\n\nconst LOCAL_SQLITE_SYNCHRONOUS_MODES: readonly LocalSqliteSynchronousMode[] = [\n \"off\",\n \"normal\",\n \"full\",\n \"extra\",\n];\n\nconst SQLITE_MAX_WAL_AUTOCHECKPOINT_PAGES = 2_147_483_647;\n\nfunction applyConnectionPragmas(\n sqlite: Database.Database,\n pragmas: LocalSqlitePragmaOptions | false | undefined,\n): void {\n if (pragmas === false) return;\n const resolved: Required<LocalSqlitePragmaOptions> = {\n ...DEFAULT_LOCAL_SQLITE_PRAGMAS,\n ...pragmas,\n };\n\n // Runtime guards mirror the compile-time unions: pragma values are spliced\n // into pragma statements, so reject anything outside the allowlists rather\n // than forwarding it to SQLite.\n if (!LOCAL_SQLITE_JOURNAL_MODES.includes(resolved.journalMode)) {\n throw new ConfigurationError(\n `Invalid journalMode pragma: ${resolved.journalMode}. ` +\n `Expected one of: ${LOCAL_SQLITE_JOURNAL_MODES.join(\", \")}.`,\n { journalMode: resolved.journalMode },\n );\n }\n if (!LOCAL_SQLITE_SYNCHRONOUS_MODES.includes(resolved.synchronous)) {\n throw new ConfigurationError(\n `Invalid synchronous pragma: ${resolved.synchronous}. ` +\n `Expected one of: ${LOCAL_SQLITE_SYNCHRONOUS_MODES.join(\", \")}.`,\n { synchronous: resolved.synchronous },\n );\n }\n if (\n !Number.isSafeInteger(resolved.busyTimeoutMs) ||\n resolved.busyTimeoutMs < 0\n ) {\n throw new ConfigurationError(\n `Invalid busyTimeoutMs pragma: ${String(resolved.busyTimeoutMs)}. ` +\n \"Expected a non-negative integer number of milliseconds.\",\n { busyTimeoutMs: resolved.busyTimeoutMs },\n );\n }\n if (\n resolved.cacheSizeKib !== undefined &&\n (!Number.isSafeInteger(resolved.cacheSizeKib) || resolved.cacheSizeKib >= 0)\n ) {\n throw new ConfigurationError(\n `Invalid cacheSizeKib pragma: ${String(resolved.cacheSizeKib)}. ` +\n \"Expected a negative safe integer — SQLite's own cache_size pragma \" +\n \"interprets a positive value as a page count, not KiB, so a caller \" +\n 'who passes e.g. 131072 meaning \"131072 KiB\" silently gets ' +\n \"131072 pages (~512MiB at the default 4KiB page size) instead.\",\n { cacheSizeKib: resolved.cacheSizeKib },\n );\n }\n if (\n resolved.mmapSizeBytes !== undefined &&\n (!Number.isSafeInteger(resolved.mmapSizeBytes) ||\n resolved.mmapSizeBytes < 0)\n ) {\n throw new ConfigurationError(\n `Invalid mmapSizeBytes pragma: ${String(resolved.mmapSizeBytes)}. ` +\n \"Expected a non-negative safe integer number of bytes.\",\n { mmapSizeBytes: resolved.mmapSizeBytes },\n );\n }\n if (\n resolved.walAutocheckpointPages !== undefined &&\n (!Number.isSafeInteger(resolved.walAutocheckpointPages) ||\n resolved.walAutocheckpointPages < 0 ||\n resolved.walAutocheckpointPages > SQLITE_MAX_WAL_AUTOCHECKPOINT_PAGES)\n ) {\n throw new ConfigurationError(\n `Invalid walAutocheckpointPages pragma: ${String(resolved.walAutocheckpointPages)}. ` +\n `Expected an integer between 0 and ${SQLITE_MAX_WAL_AUTOCHECKPOINT_PAGES} ` +\n \"WAL pages (0 disables automatic checkpointing entirely).\",\n { walAutocheckpointPages: resolved.walAutocheckpointPages },\n );\n }\n\n // \":memory:\" databases always journal in memory; SQLite answers the WAL\n // request with \"memory\" instead of erroring, so no special-casing needed.\n sqlite.pragma(`journal_mode = ${resolved.journalMode}`);\n sqlite.pragma(`synchronous = ${resolved.synchronous}`);\n sqlite.pragma(`busy_timeout = ${resolved.busyTimeoutMs}`);\n if (resolved.cacheSizeKib !== undefined) {\n sqlite.pragma(`cache_size = ${resolved.cacheSizeKib}`);\n }\n if (resolved.mmapSizeBytes !== undefined) {\n sqlite.pragma(`mmap_size = ${resolved.mmapSizeBytes}`);\n }\n if (resolved.walAutocheckpointPages !== undefined) {\n sqlite.pragma(`wal_autocheckpoint = ${resolved.walAutocheckpointPages}`);\n }\n}\n\n/**\n * Options for creating a local SQLite backend.\n */\nexport type LocalSqliteBackendOptions = Readonly<{\n /**\n * Path to the SQLite database file.\n * Defaults to \":memory:\" for an in-memory database.\n */\n path?: string;\n\n /**\n * Connection pragmas applied at open. Defaults to\n * {@link DEFAULT_LOCAL_SQLITE_PRAGMAS} (WAL, `synchronous=NORMAL`, 5s busy\n * timeout, and SQLite's own tiny built-in page cache / disabled mmap\n * left untouched). Individual values merge over the defaults; pass\n * `false` to skip pragma configuration entirely and keep the driver\n * defaults (rollback journal, `synchronous=FULL`, and better-sqlite3's\n * own 5s busy timeout from its `timeout` constructor option). Set\n * `cacheSizeKib`/`mmapSizeBytes` explicitly once a database's working\n * set is known to exceed SQLite's 2MiB default cache — otherwise every\n * query pays a fresh disk read per page past that tiny working set. Set\n * `walAutocheckpointPages` explicitly for a bulk-insert-heavy workload —\n * SQLite's own default checkpoints every ~4MiB of WAL growth, which gets\n * more expensive as the database file grows over a large load.\n */\n pragmas?: LocalSqlitePragmaOptions | false;\n\n /**\n * Custom table definitions.\n * Defaults to standard TypeGraph table names.\n */\n tables?: SqliteTables;\n\n /**\n * Override specific backend capabilities — e.g. to simulate an engine-level\n * gap like missing SQL window functions in tests. Forwarded to\n * createSqliteBackend.\n */\n capabilities?: BundledBackendCapabilityOverrides;\n}>;\n\n/**\n * Result of creating a local SQLite backend.\n */\nexport type LocalSqliteBackendResult = 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 cleanup.\n */\n db: BetterSQLite3Database;\n}>;\n\n// ============================================================\n// Factory Function\n// ============================================================\n\n/**\n * Creates a SQLite backend with minimal configuration.\n *\n * This is a convenience function for local development and testing.\n * It handles database creation, schema migration, and backend setup.\n *\n * For production deployments or custom configurations, use createSqliteBackend\n * directly with your own Drizzle database instance.\n *\n * @param options - Configuration options\n * @returns Backend and database instances\n *\n * @example In-memory database (default)\n * ```typescript\n * const { backend } = createLocalSqliteBackend();\n * const store = createStore(graph, backend);\n * ```\n *\n * @example File-based database\n * ```typescript\n * const { backend, db } = createLocalSqliteBackend({ path: \"./data.db\" });\n * const store = createStore(graph, backend);\n * ```\n */\nexport function createLocalSqliteBackend(\n options: LocalSqliteBackendOptions = {},\n): LocalSqliteBackendResult {\n assertNoLegacyTransactionCapability(options.capabilities);\n const path = options.path ?? \":memory:\";\n const tables = options.tables ?? defaultTables;\n\n const sqlite = createDatabase(path);\n try {\n applyConnectionPragmas(sqlite, options.pragmas);\n\n // Best-effort: load sqlite-vec so embedding fields are persisted to\n // per-`(kind, field)` `vec0` storage. Without it, nodes with\n // `embedding()` fields validate and insert but their vectors are silently\n // dropped. When the user has installed sqlite-vec as a peer dep we load\n // it and wire the strategy; otherwise we proceed without vector support.\n const hasSqliteVec = tryLoadSqliteVec(sqlite);\n\n const db = drizzle(sqlite);\n\n // The managed factory owns a complete fresh installation, including the\n // deployment-wide base-schema marker consumed by verified/runtime-only\n // entrypoints. Raw generateSqliteDDL intentionally omits that marker.\n installLocalSqliteBaseSchema(sqlite, tables);\n\n const backend = createSqliteBackend(db, {\n executionProfile: {\n isSync: true,\n },\n tables,\n ...(hasSqliteVec ? { vector: sqliteVecStrategy } : {}),\n capabilities: {\n ...options.capabilities,\n graphAnalytics: {\n supported:\n options.capabilities?.graphAnalytics?.supported ??\n options.capabilities?.execution?.interactiveTransactions !== false,\n mathFunctions:\n options.capabilities?.graphAnalytics?.mathFunctions ?? true,\n },\n },\n });\n const managedBackend = wrapWithManagedClose(backend, () => {\n sqlite.close();\n });\n\n return { backend: markBundledRootAutocommitEligible(managedBackend), db };\n } catch (error) {\n try {\n sqlite.close();\n } catch {\n // Preserve the provisioning error; a cleanup failure is secondary.\n }\n throw error;\n }\n}\n\nfunction tryLoadSqliteVec(sqlite: Database.Database): boolean {\n try {\n // `sqlite-vec` is an optional peer dep; resolved via createRequire so\n // bundlers don't mark it as a hard import. Node resolves the package\n // only when it's actually installed.\n const module_: unknown = nodeRequire(\"sqlite-vec\");\n if (\n typeof module_ === \"object\" &&\n module_ !== null &&\n \"load\" in module_ &&\n typeof module_.load === \"function\"\n ) {\n (module_ as { load: (db: Database.Database) => void }).load(sqlite);\n return true;\n }\n return false;\n } catch {\n return false;\n }\n}\nexport type { GraphIdentityConfig } from \"../../core/define-graph\";\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkD5TCKAQT_cjs = require('./chunk-D5TCKAQT.cjs');
3
+ var chunkDGIA64DM_cjs = require('./chunk-DGIA64DM.cjs');
4
4
 
5
5
  // src/backend/capabilities/autocommit-single-statement.ts
6
6
  var BUNDLED_ROOT_AUTOCOMMIT_BACKENDS = /* @__PURE__ */ new WeakSet();
@@ -44,7 +44,7 @@ function rephaseNonTransactionalNodeClaimPlan(plan) {
44
44
  };
45
45
  }
46
46
  function rephaseAtomicNodeClaimPlan(plan, support) {
47
- if (plan.mode.kind !== "ordinary" || plan.claims.length === 0 || !chunkD5TCKAQT_cjs.supportsAtomicNodeClaims(support, plan.claims)) {
47
+ if (plan.mode.kind !== "ordinary" || plan.claims.length === 0 || !chunkDGIA64DM_cjs.supportsAtomicNodeClaims(support, plan.claims)) {
48
48
  return;
49
49
  }
50
50
  const supported = plan.claims.every((claim) => {
@@ -91,5 +91,5 @@ exports.rephaseNonTransactionalNodeClaimPlan = rephaseNonTransactionalNodeClaimP
91
91
  exports.supportsNodeCreatePlan = supportsNodeCreatePlan;
92
92
  exports.supportsNodeInsertProjectionRequirements = supportsNodeInsertProjectionRequirements;
93
93
  exports.supportsNodeInsertProjections = supportsNodeInsertProjections;
94
- //# sourceMappingURL=chunk-PGZV3E3I.cjs.map
95
- //# sourceMappingURL=chunk-PGZV3E3I.cjs.map
94
+ //# sourceMappingURL=chunk-VXEHEPC4.cjs.map
95
+ //# sourceMappingURL=chunk-VXEHEPC4.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/backend/capabilities/autocommit-single-statement.ts","../src/backend/capabilities/node-insert-projections.ts"],"names":["supportsAtomicNodeClaims"],"mappings":"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","file":"chunk-PGZV3E3I.cjs","sourcesContent":["/**\n * Origin evidence for the managed single-statement autocommit fast path.\n *\n * This is intentionally narrower than schema-fenced-insert eligibility. The\n * latter follows bundled transaction targets and derived wrappers because its\n * statement still runs inside an explicit transaction. Here, omitting that\n * transaction is the optimization, so only the literal root objects produced\n * by the bundled factories may opt in. In particular, this evidence is never\n * carried through `deriveBackend`, an owned transaction, or adoption of a\n * caller-owned transaction.\n */\nimport type { GraphBackend, TransactionBackend } from \"../types\";\n\nconst BUNDLED_ROOT_AUTOCOMMIT_BACKENDS = new WeakSet<object>();\n\n/** @internal Called only by bundled factories after their root backend exists. */\nexport function markBundledRootAutocommitEligible<T extends object>(\n target: T,\n): T {\n BUNDLED_ROOT_AUTOCOMMIT_BACKENDS.add(target);\n return target;\n}\n\n/** Whether this is the exact root backend a bundled factory created. */\nexport function isBundledRootAutocommitEligible(\n target: GraphBackend | TransactionBackend,\n): target is GraphBackend {\n return BUNDLED_ROOT_AUTOCOMMIT_BACKENDS.has(target);\n}\n","import type {\n BackendIdentity,\n GraphBackend,\n ManagedNodeCreatePlan,\n NodeInsertClaim,\n NodeInsertProjection,\n} from \"../types\";\nimport {\n type AtomicNodeClaimSupport,\n supportsAtomicNodeClaims,\n} from \"./atomic-mutation-program\";\n\nexport type NodeProjectionInsertTarget = BackendIdentity &\n Pick<GraphBackend, \"commands\">;\n\nexport type NodeInsertProjectionRequirements = Readonly<{\n fulltext: boolean;\n embedding: boolean;\n}>;\n\nexport function supportsNodeInsertProjectionRequirements(\n target: NodeProjectionInsertTarget,\n requirements: NodeInsertProjectionRequirements,\n): boolean {\n return (\n (!requirements.fulltext ||\n target.fulltextStrategy?.buildSyncFromInsertedNode !== undefined) &&\n (!requirements.embedding ||\n target.vectorStrategy?.buildUpsertFromInsertedNode !== undefined)\n );\n}\n\n/**\n * The single owner of projection-fusion eligibility.\n *\n * A projection plan is all-or-nothing: every requested projection must have\n * an inserted-node builder on the active strategy, and the receiver must\n * expose the atomic executor. Callers use this same predicate before choosing\n * root autocommit and again on the actual transaction callback target.\n */\nexport function supportsNodeInsertProjections(\n target: NodeProjectionInsertTarget,\n projections: readonly NodeInsertProjection[],\n): boolean {\n if (projections.length === 0) return false;\n return supportsNodeInsertProjectionRequirements(target, {\n fulltext: projections.some((projection) => projection.kind === \"fulltext\"),\n embedding: projections.some(\n (projection) => projection.kind === \"embedding\",\n ),\n });\n}\n\n/**\n * Whether the receiver can make uniqueness/disjointness claims authoritative\n * inside the planned node statement.\n *\n * Claims are reported by the statement as a verdict, so the caller must have a\n * transaction boundary around the statement before it can safely defer the\n * application probes. A root backend is deliberately excluded: its\n * command port is also used for projection-only\n * autocommit writes, but a claim refusal must roll back the node and any\n * claims it touched together.\n */\nfunction supportsNodeInsertClaims(target: NodeProjectionInsertTarget): boolean {\n return (\n !(\"transaction\" in target) &&\n target.capabilities.atomicNodeInsertClaims === true\n );\n}\n\n/**\n * The only claim shape that is safe to execute on a root backend without a\n * rollback boundary. A generated id cannot collide with a different node, so\n * the claim is the sole conflict source; same-kind uniqueness has no legacy\n * axis or cross-kind/disjoint probe to consult. Rephasing it before the node\n * insert makes a conflict prevent the node row from being written at all.\n */\nfunction supportsNonTransactionalNodeClaimPlan(\n plan: Pick<\n ManagedNodeCreatePlan,\n \"idGenerated\" | \"mode\" | \"params\" | \"claims\" | \"projections\"\n >,\n): boolean {\n return (\n plan.idGenerated &&\n plan.mode.kind === \"ordinary\" &&\n plan.projections.length === 0 &&\n plan.claims.length === 1 &&\n plan.claims.every(\n (claim) =>\n claim.verdict.kind === \"uniqueness\" &&\n claim.axis === plan.params.kind &&\n claim.verdict.probeAxes.length === 1 &&\n claim.verdict.probeAxes[0] === claim.axis,\n )\n );\n}\n\n/** Rephases the safe root claim shape so a conflict gates the node insert. */\nexport function rephaseNonTransactionalNodeClaimPlan(\n plan: ManagedNodeCreatePlan,\n): ManagedNodeCreatePlan | undefined {\n if (!supportsNonTransactionalNodeClaimPlan(plan)) return;\n return {\n ...plan,\n claims: plan.claims.map((claim) => ({\n ...claim,\n placement: \"pre-insert\",\n })),\n };\n}\n\n/**\n * Normalizes the complete claim envelope accepted by an atomic node program.\n *\n * Unlike the ordinary root insert seam, a closed program can also prove a\n * disjoint claim because it carries the legacy live-node probe and cleanup in\n * the same atomic transport submission. The executor's advertised support is\n * authoritative; an omitted family remains on the portable path.\n */\nexport function rephaseAtomicNodeClaimPlan(\n plan: ManagedNodeCreatePlan,\n support: AtomicNodeClaimSupport | undefined,\n): ManagedNodeCreatePlan | undefined {\n if (\n plan.mode.kind !== \"ordinary\" ||\n plan.claims.length === 0 ||\n !supportsAtomicNodeClaims(support, plan.claims)\n ) {\n return;\n }\n const supported = plan.claims.every((claim) => {\n if (claim.verdict.kind === \"uniqueness\") {\n return (\n claim.verdict.probeAxes.length > 0 &&\n claim.verdict.probeAxes[0] === claim.axis &&\n new Set(claim.verdict.probeAxes).size === claim.verdict.probeAxes.length\n );\n }\n return (\n claim.key === plan.params.id &&\n claim.verdict.conflictingKinds.length > 0 &&\n new Set(claim.verdict.conflictingKinds).size ===\n claim.verdict.conflictingKinds.length\n );\n });\n if (!supported) return;\n return {\n ...plan,\n claims: plan.claims.map((claim) => ({\n ...claim,\n placement: \"pre-insert\",\n })),\n };\n}\n\n/** Whether the receiver can lower this complete insert plan atomically. */\nexport function supportsNodeCreatePlan(\n target: NodeProjectionInsertTarget,\n input: Readonly<{\n params?: ManagedNodeCreatePlan[\"params\"];\n idGenerated?: ManagedNodeCreatePlan[\"idGenerated\"];\n mode?: ManagedNodeCreatePlan[\"mode\"];\n claims: readonly NodeInsertClaim[];\n projections: readonly NodeInsertProjection[];\n /** Store-side proof that no identity/history/revision side effect exists. */\n allowNonTransactionalClaims?: boolean | undefined;\n }>,\n): boolean {\n if (input.claims.length === 0) {\n return supportsNodeInsertProjections(target, input.projections);\n }\n // A claim refusal is discovered from the data-modifying statement's result,\n // so the caller-owned transaction is the rollback boundary. Root graph\n // backends expose `transaction`; transaction-scoped operation backends do\n // not. Keep this exported predicate aligned with the execution contract.\n const ordinaryPlan =\n (\n input.params === undefined ||\n input.mode === undefined ||\n input.idGenerated === undefined\n ) ?\n undefined\n : {\n entity: \"node\" as const,\n params: input.params,\n idGenerated: input.idGenerated,\n mode: input.mode,\n claims: input.claims,\n projections: input.projections,\n };\n const rootClaimFusion =\n input.allowNonTransactionalClaims === true &&\n target.capabilities.atomicNodeInsertClaims === true &&\n ordinaryPlan !== undefined &&\n supportsNonTransactionalNodeClaimPlan(ordinaryPlan);\n return (\n (supportsNodeInsertClaims(target) ||\n (\"transaction\" in target && rootClaimFusion)) &&\n supportsNodeInsertProjectionRequirements(target, {\n fulltext: input.projections.some(\n (projection) => projection.kind === \"fulltext\",\n ),\n embedding: input.projections.some(\n (projection) => projection.kind === \"embedding\",\n ),\n })\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/backend/capabilities/autocommit-single-statement.ts","../src/backend/capabilities/node-insert-projections.ts"],"names":["supportsAtomicNodeClaims"],"mappings":"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","file":"chunk-VXEHEPC4.cjs","sourcesContent":["/**\n * Origin evidence for the managed single-statement autocommit fast path.\n *\n * This is intentionally narrower than schema-fenced-insert eligibility. The\n * latter follows bundled transaction targets and derived wrappers because its\n * statement still runs inside an explicit transaction. Here, omitting that\n * transaction is the optimization, so only the literal root objects produced\n * by the bundled factories may opt in. In particular, this evidence is never\n * carried through `deriveBackend`, an owned transaction, or adoption of a\n * caller-owned transaction.\n */\nimport type { GraphBackend, TransactionBackend } from \"../types\";\n\nconst BUNDLED_ROOT_AUTOCOMMIT_BACKENDS = new WeakSet<object>();\n\n/** @internal Called only by bundled factories after their root backend exists. */\nexport function markBundledRootAutocommitEligible<T extends object>(\n target: T,\n): T {\n BUNDLED_ROOT_AUTOCOMMIT_BACKENDS.add(target);\n return target;\n}\n\n/** Whether this is the exact root backend a bundled factory created. */\nexport function isBundledRootAutocommitEligible(\n target: GraphBackend | TransactionBackend,\n): target is GraphBackend {\n return BUNDLED_ROOT_AUTOCOMMIT_BACKENDS.has(target);\n}\n","import type {\n BackendIdentity,\n GraphBackend,\n ManagedNodeCreatePlan,\n NodeInsertClaim,\n NodeInsertProjection,\n} from \"../types\";\nimport {\n type AtomicNodeClaimSupport,\n supportsAtomicNodeClaims,\n} from \"./atomic-mutation-program\";\n\nexport type NodeProjectionInsertTarget = BackendIdentity &\n Pick<GraphBackend, \"commands\">;\n\nexport type NodeInsertProjectionRequirements = Readonly<{\n fulltext: boolean;\n embedding: boolean;\n}>;\n\nexport function supportsNodeInsertProjectionRequirements(\n target: NodeProjectionInsertTarget,\n requirements: NodeInsertProjectionRequirements,\n): boolean {\n return (\n (!requirements.fulltext ||\n target.fulltextStrategy?.buildSyncFromInsertedNode !== undefined) &&\n (!requirements.embedding ||\n target.vectorStrategy?.buildUpsertFromInsertedNode !== undefined)\n );\n}\n\n/**\n * The single owner of projection-fusion eligibility.\n *\n * A projection plan is all-or-nothing: every requested projection must have\n * an inserted-node builder on the active strategy, and the receiver must\n * expose the atomic executor. Callers use this same predicate before choosing\n * root autocommit and again on the actual transaction callback target.\n */\nexport function supportsNodeInsertProjections(\n target: NodeProjectionInsertTarget,\n projections: readonly NodeInsertProjection[],\n): boolean {\n if (projections.length === 0) return false;\n return supportsNodeInsertProjectionRequirements(target, {\n fulltext: projections.some((projection) => projection.kind === \"fulltext\"),\n embedding: projections.some(\n (projection) => projection.kind === \"embedding\",\n ),\n });\n}\n\n/**\n * Whether the receiver can make uniqueness/disjointness claims authoritative\n * inside the planned node statement.\n *\n * Claims are reported by the statement as a verdict, so the caller must have a\n * transaction boundary around the statement before it can safely defer the\n * application probes. A root backend is deliberately excluded: its\n * command port is also used for projection-only\n * autocommit writes, but a claim refusal must roll back the node and any\n * claims it touched together.\n */\nfunction supportsNodeInsertClaims(target: NodeProjectionInsertTarget): boolean {\n return (\n !(\"transaction\" in target) &&\n target.capabilities.atomicNodeInsertClaims === true\n );\n}\n\n/**\n * The only claim shape that is safe to execute on a root backend without a\n * rollback boundary. A generated id cannot collide with a different node, so\n * the claim is the sole conflict source; same-kind uniqueness has no legacy\n * axis or cross-kind/disjoint probe to consult. Rephasing it before the node\n * insert makes a conflict prevent the node row from being written at all.\n */\nfunction supportsNonTransactionalNodeClaimPlan(\n plan: Pick<\n ManagedNodeCreatePlan,\n \"idGenerated\" | \"mode\" | \"params\" | \"claims\" | \"projections\"\n >,\n): boolean {\n return (\n plan.idGenerated &&\n plan.mode.kind === \"ordinary\" &&\n plan.projections.length === 0 &&\n plan.claims.length === 1 &&\n plan.claims.every(\n (claim) =>\n claim.verdict.kind === \"uniqueness\" &&\n claim.axis === plan.params.kind &&\n claim.verdict.probeAxes.length === 1 &&\n claim.verdict.probeAxes[0] === claim.axis,\n )\n );\n}\n\n/** Rephases the safe root claim shape so a conflict gates the node insert. */\nexport function rephaseNonTransactionalNodeClaimPlan(\n plan: ManagedNodeCreatePlan,\n): ManagedNodeCreatePlan | undefined {\n if (!supportsNonTransactionalNodeClaimPlan(plan)) return;\n return {\n ...plan,\n claims: plan.claims.map((claim) => ({\n ...claim,\n placement: \"pre-insert\",\n })),\n };\n}\n\n/**\n * Normalizes the complete claim envelope accepted by an atomic node program.\n *\n * Unlike the ordinary root insert seam, a closed program can also prove a\n * disjoint claim because it carries the legacy live-node probe and cleanup in\n * the same atomic transport submission. The executor's advertised support is\n * authoritative; an omitted family remains on the portable path.\n */\nexport function rephaseAtomicNodeClaimPlan(\n plan: ManagedNodeCreatePlan,\n support: AtomicNodeClaimSupport | undefined,\n): ManagedNodeCreatePlan | undefined {\n if (\n plan.mode.kind !== \"ordinary\" ||\n plan.claims.length === 0 ||\n !supportsAtomicNodeClaims(support, plan.claims)\n ) {\n return;\n }\n const supported = plan.claims.every((claim) => {\n if (claim.verdict.kind === \"uniqueness\") {\n return (\n claim.verdict.probeAxes.length > 0 &&\n claim.verdict.probeAxes[0] === claim.axis &&\n new Set(claim.verdict.probeAxes).size === claim.verdict.probeAxes.length\n );\n }\n return (\n claim.key === plan.params.id &&\n claim.verdict.conflictingKinds.length > 0 &&\n new Set(claim.verdict.conflictingKinds).size ===\n claim.verdict.conflictingKinds.length\n );\n });\n if (!supported) return;\n return {\n ...plan,\n claims: plan.claims.map((claim) => ({\n ...claim,\n placement: \"pre-insert\",\n })),\n };\n}\n\n/** Whether the receiver can lower this complete insert plan atomically. */\nexport function supportsNodeCreatePlan(\n target: NodeProjectionInsertTarget,\n input: Readonly<{\n params?: ManagedNodeCreatePlan[\"params\"];\n idGenerated?: ManagedNodeCreatePlan[\"idGenerated\"];\n mode?: ManagedNodeCreatePlan[\"mode\"];\n claims: readonly NodeInsertClaim[];\n projections: readonly NodeInsertProjection[];\n /** Store-side proof that no identity/history/revision side effect exists. */\n allowNonTransactionalClaims?: boolean | undefined;\n }>,\n): boolean {\n if (input.claims.length === 0) {\n return supportsNodeInsertProjections(target, input.projections);\n }\n // A claim refusal is discovered from the data-modifying statement's result,\n // so the caller-owned transaction is the rollback boundary. Root graph\n // backends expose `transaction`; transaction-scoped operation backends do\n // not. Keep this exported predicate aligned with the execution contract.\n const ordinaryPlan =\n (\n input.params === undefined ||\n input.mode === undefined ||\n input.idGenerated === undefined\n ) ?\n undefined\n : {\n entity: \"node\" as const,\n params: input.params,\n idGenerated: input.idGenerated,\n mode: input.mode,\n claims: input.claims,\n projections: input.projections,\n };\n const rootClaimFusion =\n input.allowNonTransactionalClaims === true &&\n target.capabilities.atomicNodeInsertClaims === true &&\n ordinaryPlan !== undefined &&\n supportsNonTransactionalNodeClaimPlan(ordinaryPlan);\n return (\n (supportsNodeInsertClaims(target) ||\n (\"transaction\" in target && rootClaimFusion)) &&\n supportsNodeInsertProjectionRequirements(target, {\n fulltext: input.projections.some(\n (projection) => projection.kind === \"fulltext\",\n ),\n embedding: input.projections.some(\n (projection) => projection.kind === \"embedding\",\n ),\n })\n );\n}\n"]}