sensemaking 0.19.2 → 0.20.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 (140) hide show
  1. package/dist/cjs/chunk/extract.d.cts +1 -0
  2. package/dist/cjs/chunk/extract.d.ts +1 -0
  3. package/dist/cjs/chunk/extract.js +23 -5
  4. package/dist/cjs/chunk/extract.js.map +1 -1
  5. package/dist/cjs/chunk/index.d.cts +1 -1
  6. package/dist/cjs/chunk/index.d.ts +1 -1
  7. package/dist/cjs/chunk/index.js +3 -0
  8. package/dist/cjs/chunk/index.js.map +1 -1
  9. package/dist/cjs/scan/pool.d.cts +15 -0
  10. package/dist/cjs/scan/pool.d.ts +15 -0
  11. package/dist/cjs/scan/pool.js +263 -0
  12. package/dist/cjs/scan/pool.js.map +1 -0
  13. package/dist/cjs/scan/reparse.d.cts +2 -0
  14. package/dist/cjs/scan/reparse.d.ts +2 -0
  15. package/dist/cjs/scan/reparse.js +15 -76
  16. package/dist/cjs/scan/reparse.js.map +1 -1
  17. package/dist/cjs/store/builder.d.cts +11 -0
  18. package/dist/cjs/store/builder.d.ts +11 -0
  19. package/dist/cjs/store/builder.js +27 -0
  20. package/dist/cjs/store/builder.js.map +1 -0
  21. package/dist/cjs/store/duckdb/lexical.d.cts +1 -0
  22. package/dist/cjs/store/duckdb/lexical.d.ts +1 -0
  23. package/dist/cjs/store/duckdb/lexical.js +21 -5
  24. package/dist/cjs/store/duckdb/lexical.js.map +1 -1
  25. package/dist/cjs/store/duckdb/open.d.cts +9 -8
  26. package/dist/cjs/store/duckdb/open.d.ts +9 -8
  27. package/dist/cjs/store/duckdb/open.js +70 -122
  28. package/dist/cjs/store/duckdb/open.js.map +1 -1
  29. package/dist/cjs/store/duckdb/reconcile.js +4 -0
  30. package/dist/cjs/store/duckdb/reconcile.js.map +1 -1
  31. package/dist/cjs/store/duckdb/store.d.cts +1 -2
  32. package/dist/cjs/store/duckdb/store.d.ts +1 -2
  33. package/dist/cjs/store/duckdb/store.js +1 -26
  34. package/dist/cjs/store/duckdb/store.js.map +1 -1
  35. package/dist/cjs/store/index.d.cts +8 -3
  36. package/dist/cjs/store/index.d.ts +8 -3
  37. package/dist/cjs/store/index.js +36 -7
  38. package/dist/cjs/store/index.js.map +1 -1
  39. package/dist/cjs/store/open.d.cts +15 -0
  40. package/dist/cjs/store/open.d.ts +15 -0
  41. package/dist/cjs/store/open.js +516 -0
  42. package/dist/cjs/store/open.js.map +1 -0
  43. package/dist/cjs/store/reconcile.d.cts +2 -1
  44. package/dist/cjs/store/reconcile.d.ts +2 -1
  45. package/dist/cjs/store/reconcile.js +4 -2
  46. package/dist/cjs/store/reconcile.js.map +1 -1
  47. package/dist/cjs/store/{sqlite/signature.d.cts → signature.d.cts} +0 -3
  48. package/dist/cjs/store/{sqlite/signature.d.ts → signature.d.ts} +0 -3
  49. package/dist/cjs/store/signature.js +162 -0
  50. package/dist/cjs/store/signature.js.map +1 -0
  51. package/dist/cjs/store/sqlite/open.d.cts +9 -9
  52. package/dist/cjs/store/sqlite/open.d.ts +9 -9
  53. package/dist/cjs/store/sqlite/open.js +189 -201
  54. package/dist/cjs/store/sqlite/open.js.map +1 -1
  55. package/dist/cjs/store/sqlite/store.d.cts +1 -1
  56. package/dist/cjs/store/sqlite/store.d.ts +1 -1
  57. package/dist/cjs/store/sqlite/store.js +1 -13
  58. package/dist/cjs/store/sqlite/store.js.map +1 -1
  59. package/dist/cjs/store/turso/open.d.cts +6 -11
  60. package/dist/cjs/store/turso/open.d.ts +6 -11
  61. package/dist/cjs/store/turso/open.js +79 -171
  62. package/dist/cjs/store/turso/open.js.map +1 -1
  63. package/dist/cjs/store/turso/reconcile.d.cts +2 -0
  64. package/dist/cjs/store/turso/reconcile.d.ts +2 -0
  65. package/dist/cjs/store/turso/reconcile.js +16 -5
  66. package/dist/cjs/store/turso/reconcile.js.map +1 -1
  67. package/dist/cjs/store/turso/store.d.cts +1 -2
  68. package/dist/cjs/store/turso/store.d.ts +1 -2
  69. package/dist/cjs/store/turso/store.js +1 -13
  70. package/dist/cjs/store/turso/store.js.map +1 -1
  71. package/dist/cjs/store/types.d.cts +17 -5
  72. package/dist/cjs/store/types.d.ts +17 -5
  73. package/dist/cjs/store/types.js.map +1 -1
  74. package/dist/cjs/text/strip.js +3 -6
  75. package/dist/cjs/text/strip.js.map +1 -1
  76. package/dist/cjs/watch.js +28 -16
  77. package/dist/cjs/watch.js.map +1 -1
  78. package/dist/esm/chunk/extract.d.ts +1 -0
  79. package/dist/esm/chunk/extract.js +10 -2
  80. package/dist/esm/chunk/extract.js.map +1 -1
  81. package/dist/esm/chunk/index.d.ts +1 -1
  82. package/dist/esm/chunk/index.js +1 -1
  83. package/dist/esm/chunk/index.js.map +1 -1
  84. package/dist/esm/scan/pool.d.ts +15 -0
  85. package/dist/esm/scan/pool.js +77 -0
  86. package/dist/esm/scan/pool.js.map +1 -0
  87. package/dist/esm/scan/reparse.d.ts +2 -0
  88. package/dist/esm/scan/reparse.js +11 -58
  89. package/dist/esm/scan/reparse.js.map +1 -1
  90. package/dist/esm/store/builder.d.ts +11 -0
  91. package/dist/esm/store/builder.js +14 -0
  92. package/dist/esm/store/builder.js.map +1 -0
  93. package/dist/esm/store/duckdb/lexical.d.ts +1 -0
  94. package/dist/esm/store/duckdb/lexical.js +22 -9
  95. package/dist/esm/store/duckdb/lexical.js.map +1 -1
  96. package/dist/esm/store/duckdb/open.d.ts +9 -8
  97. package/dist/esm/store/duckdb/open.js +31 -57
  98. package/dist/esm/store/duckdb/open.js.map +1 -1
  99. package/dist/esm/store/duckdb/reconcile.js +4 -0
  100. package/dist/esm/store/duckdb/reconcile.js.map +1 -1
  101. package/dist/esm/store/duckdb/store.d.ts +1 -2
  102. package/dist/esm/store/duckdb/store.js +2 -11
  103. package/dist/esm/store/duckdb/store.js.map +1 -1
  104. package/dist/esm/store/index.d.ts +8 -3
  105. package/dist/esm/store/index.js +22 -7
  106. package/dist/esm/store/index.js.map +1 -1
  107. package/dist/esm/store/open.d.ts +15 -0
  108. package/dist/esm/store/open.js +137 -0
  109. package/dist/esm/store/open.js.map +1 -0
  110. package/dist/esm/store/reconcile.d.ts +2 -1
  111. package/dist/esm/store/reconcile.js +4 -2
  112. package/dist/esm/store/reconcile.js.map +1 -1
  113. package/dist/esm/store/{sqlite/signature.d.ts → signature.d.ts} +0 -3
  114. package/dist/esm/store/{sqlite/signature.js → signature.js} +3 -26
  115. package/dist/esm/store/signature.js.map +1 -0
  116. package/dist/esm/store/sqlite/open.d.ts +9 -9
  117. package/dist/esm/store/sqlite/open.js +81 -113
  118. package/dist/esm/store/sqlite/open.js.map +1 -1
  119. package/dist/esm/store/sqlite/store.d.ts +1 -1
  120. package/dist/esm/store/sqlite/store.js +2 -7
  121. package/dist/esm/store/sqlite/store.js.map +1 -1
  122. package/dist/esm/store/turso/open.d.ts +6 -11
  123. package/dist/esm/store/turso/open.js +30 -78
  124. package/dist/esm/store/turso/open.js.map +1 -1
  125. package/dist/esm/store/turso/reconcile.d.ts +2 -0
  126. package/dist/esm/store/turso/reconcile.js +12 -1
  127. package/dist/esm/store/turso/reconcile.js.map +1 -1
  128. package/dist/esm/store/turso/store.d.ts +1 -2
  129. package/dist/esm/store/turso/store.js +2 -7
  130. package/dist/esm/store/turso/store.js.map +1 -1
  131. package/dist/esm/store/types.d.ts +17 -5
  132. package/dist/esm/store/types.js.map +1 -1
  133. package/dist/esm/text/strip.js +3 -4
  134. package/dist/esm/text/strip.js.map +1 -1
  135. package/dist/esm/watch.js +5 -3
  136. package/dist/esm/watch.js.map +1 -1
  137. package/package.json +2 -2
  138. package/dist/cjs/store/sqlite/signature.js +0 -380
  139. package/dist/cjs/store/sqlite/signature.js.map +0 -1
  140. package/dist/esm/store/sqlite/signature.js.map +0 -1
@@ -17,27 +17,23 @@ _export(exports, {
17
17
  get SCHEMA_VERSION () {
18
18
  return SCHEMA_VERSION;
19
19
  },
20
- get docCount () {
21
- return docCount;
22
- },
23
20
  get openSqlite () {
24
21
  return openSqlite;
22
+ },
23
+ get sqliteOpenDialect () {
24
+ return sqliteOpenDialect;
25
25
  }
26
26
  });
27
- var _nodefs = require("node:fs");
28
- var _nodepath = require("node:path");
29
27
  var _nodesqlite = require("node:sqlite");
30
28
  var _indexts = require("../../config/index.js");
31
- var _handoffts = require("../../embed/handoff.js");
32
29
  var _errorsts = require("../../errors.js");
33
30
  var _indexts1 = require("../../features/index.js");
34
- var _cachets = require("../cache.js");
35
- var _reconcilets = require("../reconcile.js");
31
+ var _indexts2 = require("../../scan/index.js");
32
+ var _opents = require("../open.js");
36
33
  var _sharedts = require("../shared.js");
37
34
  var _transactionts = require("../transaction.js");
38
35
  var _connectionts = require("./connection.js");
39
- var _reconcilets1 = require("./reconcile.js");
40
- var _signaturets = require("./signature.js");
36
+ var _reconcilets = require("./reconcile.js");
41
37
  var _sqlfunctionsts = require("./sql-functions.js");
42
38
  var _storets = require("./store.js");
43
39
  function _array_like_to_array(arr, len) {
@@ -193,7 +189,7 @@ function _unsupported_iterable_to_array(o, minLen) {
193
189
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
194
190
  }
195
191
  var DB_FILENAME = 'cache.db';
196
- var SCHEMA_VERSION = '18';
192
+ var SCHEMA_VERSION = '19';
197
193
  // unicode61 splits on spaces, so a language written without them indexes a whole run as one
198
194
  // token and word search finds nothing; `content.tokenize` is how such a tree picks trigram.
199
195
  var DEFAULT_TOKENIZE = 'porter unicode61';
@@ -242,7 +238,7 @@ function createContentTable(conn, tokenize) {
242
238
  }
243
239
  // Content is a separate table (not a column on frontmatter) so `SELECT * FROM frontmatter`
244
240
  // can't dump file text into context. Features add their own tables after the core ones.
245
- function ensureSchema(conn, cfg, tokenize) {
241
+ function ensureSchemaTables(conn, cfg, tokenize) {
246
242
  return _async_to_generator(function() {
247
243
  var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, feature, err;
248
244
  return _ts_generator(this, function(_state) {
@@ -388,75 +384,65 @@ function setJournalWal(db) {
388
384
  }
389
385
  }
390
386
  }
391
- function connect(cfg) {
387
+ function connect(dbPath, cfg) {
388
+ return _async_to_generator(function() {
389
+ var db, conn, tokenize;
390
+ return _ts_generator(this, function(_state) {
391
+ db = new _nodesqlite.DatabaseSync(dbPath);
392
+ try {
393
+ // Before journal_mode, not after: converting a fresh database to WAL takes a brief exclusive
394
+ // lock, and with no timeout set yet a second process opening the same tree fails in 1ms.
395
+ db.exec('PRAGMA busy_timeout = 30000');
396
+ // busy_timeout does not cover the WAL conversion itself: SQLite does not invoke the busy
397
+ // handler for it, so a concurrent cold open needs its own bounded wait.
398
+ setJournalWal(db);
399
+ (0, _sqlfunctionsts.registerFunctions)(db, (0, _indexts.contentTokenize)(cfg) === undefined);
400
+ conn = (0, _connectionts.createConnection)(db);
401
+ // Before the rebuild branch below, never after: that branch deletes the cache, so a typo'd
402
+ // tokenizer validated later would cost a full re-index (and re-embed) to reach its own error.
403
+ tokenize = resolveTokenize(db, cfg);
404
+ return [
405
+ 2,
406
+ {
407
+ handle: {
408
+ db: db,
409
+ tokenize: tokenize
410
+ },
411
+ conn: conn
412
+ }
413
+ ];
414
+ } catch (err) {
415
+ // A throw here must release this handle, or on Windows the leaked WAL db is undeletable and
416
+ // scratch cleanup fails with EPERM/EBUSY.
417
+ db.close();
418
+ throw err;
419
+ }
420
+ return [
421
+ 2
422
+ ];
423
+ });
424
+ })();
425
+ }
426
+ function close(handle) {
427
+ return _async_to_generator(function() {
428
+ return _ts_generator(this, function(_state) {
429
+ handle.db.close();
430
+ return [
431
+ 2
432
+ ];
433
+ });
434
+ })();
435
+ }
436
+ // Only the tokenizer moved, and frontmatter, links, sections and embeddings are file-derived
437
+ // and tokenizer-independent. Any other signature change takes the full clear/reopen in open.ts.
438
+ function partialRebuild(handle, conn, _cfg, changedKeys) {
392
439
  return _async_to_generator(function() {
393
- var stateDir, dbPath, db, closed, _ref, conn, tokenize, version, features, wantFeatures, tokenizeOnlyRebuild, changedKeys, changed, stored, rebuildWarnings, recordedMaxMs, _ref1, parsed, warnings, err;
394
440
  return _ts_generator(this, function(_state) {
395
441
  switch(_state.label){
396
442
  case 0:
397
- stateDir = (0, _nodepath.join)(cfg.baseDir, _indexts.STATE_DIR);
398
- (0, _nodefs.mkdirSync)(stateDir, {
399
- recursive: true
400
- });
401
- dbPath = (0, _nodepath.join)(stateDir, DB_FILENAME);
402
- db = new _nodesqlite.DatabaseSync(dbPath);
403
- // A throw below must release this handle, or on Windows the leaked WAL db is undeletable and
404
- // scratch cleanup fails with EPERM/EBUSY. `closed` keeps the catch from double-closing.
405
- closed = false;
406
- _state.label = 1;
407
- case 1:
408
- _state.trys.push([
409
- 1,
410
- 15,
411
- ,
412
- 16
413
- ]);
414
- // Before journal_mode, not after: converting a fresh database to WAL takes a brief exclusive
415
- // lock, and with no timeout set yet a second process opening the same tree fails in 1ms.
416
- db.exec('PRAGMA busy_timeout = 30000');
417
- // busy_timeout does not cover the WAL conversion itself: SQLite does not invoke the busy
418
- // handler for it, so a concurrent cold open needs its own bounded wait.
419
- setJournalWal(db);
420
- (0, _sqlfunctionsts.registerFunctions)(db, (0, _indexts.contentTokenize)(cfg) === undefined);
421
- conn = (0, _connectionts.createConnection)(db);
422
- db.exec('CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT)');
423
- // Before the rebuild branch below, never after: that branch deletes the cache, so a typo'd
424
- // tokenizer validated later would cost a full re-index (and re-embed) to reach its own error.
425
- tokenize = resolveTokenize(db, cfg);
426
- return [
427
- 4,
428
- (0, _sharedts.getMeta)(conn, 'schema_version')
429
- ];
430
- case 2:
431
- version = _state.sent();
432
- return [
433
- 4,
434
- (0, _sharedts.getMeta)(conn, 'features')
435
- ];
436
- case 3:
437
- features = _state.sent();
438
- wantFeatures = (0, _indexts.featureSignature)(cfg, _indexts1.FEATURES);
439
- tokenizeOnlyRebuild = false;
440
- if (!(version !== null && version !== SCHEMA_VERSION || features !== null && features !== wantFeatures)) return [
441
- 3,
442
- 8
443
- ];
444
- // Indexing derives from presets, so a config edit rebuilding the cache must say so and
445
- // name what changed -- silent rebuilds make derived indexing look like a hang or a bug.
446
- if (version !== null && version !== SCHEMA_VERSION) {
447
- console.error('sense: cache format changed (new sensemaking version); rebuilding the index');
448
- closed = true;
449
- db.close();
450
- (0, _cachets.clearCache)(cfg);
451
- return [
452
- 2,
453
- connect(cfg)
454
- ];
455
- }
456
- changedKeys = (0, _signaturets.changedSignatureKeys)(features !== null && features !== void 0 ? features : '', wantFeatures);
457
443
  if (!(changedKeys.size === 1 && changedKeys.has('tokenize'))) return [
458
- 3,
459
- 5
444
+ 2,
445
+ false
460
446
  ];
461
447
  console.error('sense: config change (content tokenizer) rebuilds the text index; vectors, links, and sections are kept');
462
448
  // One transaction, so a crash before COMMIT rolls back to the old tokenizer's table rather
@@ -476,7 +462,7 @@ function connect(cfg) {
476
462
  _state.sent();
477
463
  return [
478
464
  4,
479
- createContentTable(conn, tokenize)
465
+ createContentTable(conn, handle.tokenize)
480
466
  ];
481
467
  case 2:
482
468
  _state.sent();
@@ -488,173 +474,175 @@ function connect(cfg) {
488
474
  })();
489
475
  }, _transactionts.BEGIN_WRITE)
490
476
  ];
491
- case 4:
477
+ case 1:
492
478
  _state.sent();
493
- tokenizeOnlyRebuild = true;
494
479
  return [
495
- 3,
496
- 8
497
- ];
498
- case 5:
499
- if (!(changedKeys.size === 1 && changedKeys.has('embed') && (0, _signaturets.embedIdentityAdopted)(features !== null && features !== void 0 ? features : '', wantFeatures))) return [
500
- 3,
501
- 7
480
+ 2,
481
+ true
502
482
  ];
503
- // First sight of a resolved weight identity: the model itself hasn't changed, so
504
- // adopt it into meta with no rebuild and no re-embed, mirroring the tokenize precedent.
505
- console.error("sense: recorded the embedding model's resolved identity; vectors are unaffected");
483
+ }
484
+ });
485
+ })();
486
+ }
487
+ // Tokenize-only rebuild: only `content` is repopulated (the other tables are tokenizer-independent)
488
+ // and no feature extractors run. Warnings come from the reparse, since mtimes stay untouched and reconcile would never reparse them.
489
+ function postSchemaRebuild(_handle, conn, cfg, baseDir, wantFeatures) {
490
+ return _async_to_generator(function() {
491
+ var stmt, known, _, files, segmenting, warnings, rows, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, file, _warnings, _parseFile, doc, fileWarnings;
492
+ return _ts_generator(this, function(_state) {
493
+ switch(_state.label){
494
+ case 0:
506
495
  return [
507
496
  4,
508
- (0, _sharedts.setMeta)(conn, 'features', wantFeatures)
509
- ];
510
- case 6:
511
- _state.sent();
512
- return [
513
- 3,
514
- 8
497
+ conn.prepare('SELECT "path" FROM frontmatter')
515
498
  ];
516
- case 7:
517
- changed = (0, _signaturets.signatureDiff)(features !== null && features !== void 0 ? features : '', wantFeatures);
518
- console.error("sense: config change (".concat(changed, ") rebuilds the index"));
519
- closed = true;
520
- db.close();
521
- (0, _cachets.clearCache)(cfg);
499
+ case 1:
500
+ stmt = _state.sent();
501
+ _ = Set.bind;
522
502
  return [
523
- 2,
524
- connect(cfg)
503
+ 4,
504
+ stmt.all()
525
505
  ];
526
- case 8:
527
- // Meta can lie after a crash between table creation and the signature write; the table's own
528
- // DDL cannot, so a mismatch here rebuilds whatever meta says.
529
- stored = storedTokenize(db);
530
- if (stored !== null && stored !== tokenize) {
531
- console.error('sense: cache was built with a different content tokenizer; rebuilding the index');
532
- closed = true;
533
- db.close();
534
- (0, _cachets.clearCache)(cfg);
535
- return [
536
- 2,
537
- connect(cfg)
538
- ];
506
+ case 2:
507
+ known = new (_.apply(Set, [
508
+ void 0,
509
+ _state.sent().map(function(r) {
510
+ return r.path;
511
+ })
512
+ ]));
513
+ files = (0, _indexts2.listFiles)(cfg, baseDir).filter(function(f) {
514
+ return known.has(f.relPath);
515
+ });
516
+ segmenting = (0, _indexts.contentTokenize)(cfg) === undefined;
517
+ warnings = [];
518
+ rows = [];
519
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
520
+ try {
521
+ for(_iterator = files[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
522
+ file = _step.value;
523
+ ;
524
+ _parseFile = (0, _indexts2.parseFile)(file), doc = _parseFile.doc, fileWarnings = _parseFile.warnings;
525
+ (_warnings = warnings).push.apply(_warnings, _to_consumable_array(fileWarnings));
526
+ rows.push((0, _reconcilets.contentRow)(doc, segmenting));
527
+ }
528
+ } catch (err) {
529
+ _didIteratorError = true;
530
+ _iteratorError = err;
531
+ } finally{
532
+ try {
533
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
534
+ _iterator.return();
535
+ }
536
+ } finally{
537
+ if (_didIteratorError) {
538
+ throw _iteratorError;
539
+ }
540
+ }
539
541
  }
540
- // One writer at a time: the feature hooks check a column then add it, so two cold opens racing
541
- // here both see it missing and the second ALTER fails with a duplicate column.
542
542
  return [
543
543
  4,
544
544
  (0, _transactionts.withTransaction)(conn, function() {
545
- return ensureSchema(conn, cfg, tokenize);
545
+ return _async_to_generator(function() {
546
+ return _ts_generator(this, function(_state) {
547
+ switch(_state.label){
548
+ case 0:
549
+ if (!(rows.length > 0)) return [
550
+ 3,
551
+ 2
552
+ ];
553
+ return [
554
+ 4,
555
+ conn.runBatch(_reconcilets.INSERT_CONTENT_SQL, rows)
556
+ ];
557
+ case 1:
558
+ _state.sent();
559
+ _state.label = 2;
560
+ case 2:
561
+ return [
562
+ 2
563
+ ];
564
+ }
565
+ });
566
+ })();
546
567
  }, _transactionts.BEGIN_WRITE)
547
568
  ];
548
- case 9:
569
+ case 3:
549
570
  _state.sent();
550
- rebuildWarnings = [];
551
- if (!tokenizeOnlyRebuild) return [
552
- 3,
553
- 12
554
- ];
555
- return [
556
- 4,
557
- (0, _signaturets.rebuildContentTable)(conn, cfg, cfg.baseDir)
558
- ];
559
- case 10:
560
- rebuildWarnings = _state.sent();
561
571
  return [
562
572
  4,
563
573
  (0, _sharedts.setMeta)(conn, 'features', wantFeatures)
564
574
  ];
565
- case 11:
575
+ case 4:
566
576
  _state.sent();
567
- _state.label = 12;
568
- case 12:
569
- return [
570
- 4,
571
- (0, _sharedts.getMeta)(conn, 'reconcile_max_ms')
572
- ];
573
- case 13:
574
- recordedMaxMs = Number.apply(void 0, [
575
- (_ref = _state.sent()) !== null && _ref !== void 0 ? _ref : '0'
576
- ]);
577
- db.exec("PRAGMA busy_timeout = ".concat(Math.min(Math.max(30000, 3 * recordedMaxMs), 600000)));
578
- return [
579
- 4,
580
- (0, _reconcilets.reconcile)(conn, cfg, cfg.baseDir, _reconcilets1.sqliteDialect)
581
- ];
582
- case 14:
583
- _ref1 = _state.sent(), parsed = _ref1.parsed, warnings = _ref1.warnings;
584
577
  return [
585
578
  2,
586
- {
587
- db: db,
588
- conn: conn,
589
- cfg: cfg,
590
- dbPath: dbPath,
591
- parsed: parsed,
592
- warnings: _to_consumable_array(rebuildWarnings).concat(_to_consumable_array(warnings))
593
- }
594
- ];
595
- case 15:
596
- err = _state.sent();
597
- if (!closed) db.close();
598
- throw err;
599
- case 16:
600
- return [
601
- 2
579
+ warnings
602
580
  ];
603
581
  }
604
582
  });
605
583
  })();
606
584
  }
607
- function openSqlite(cfg) {
585
+ // Meta can lie after a crash between table creation and the signature write; the table's own
586
+ // DDL cannot, so a mismatch here rebuilds whatever meta says.
587
+ function extraRebuildReason(handle) {
588
+ var stored = storedTokenize(handle.db);
589
+ if (stored !== null && stored !== handle.tokenize) return 'cache was built with a different content tokenizer';
590
+ return null;
591
+ }
592
+ function ensureSchema(handle, conn, cfg) {
608
593
  return _async_to_generator(function() {
609
- var _ref, db, conn, resolvedCfg, dbPath, parsed, warnings, store;
610
594
  return _ts_generator(this, function(_state) {
611
595
  switch(_state.label){
612
596
  case 0:
597
+ // One writer at a time: the feature hooks check a column then add it, so two cold opens racing
598
+ // here both see it missing and the second ALTER fails with a duplicate column.
613
599
  return [
614
600
  4,
615
- connect(cfg)
601
+ (0, _transactionts.withTransaction)(conn, function() {
602
+ return ensureSchemaTables(conn, cfg, handle.tokenize);
603
+ }, _transactionts.BEGIN_WRITE)
616
604
  ];
617
605
  case 1:
618
- _ref = _state.sent(), db = _ref.db, conn = _ref.conn, resolvedCfg = _ref.cfg, dbPath = _ref.dbPath, parsed = _ref.parsed, warnings = _ref.warnings;
619
- store = (0, _storets.createStore)(db, conn, resolvedCfg, resolvedCfg.baseDir);
620
- // reconcile ran before this object existed, so its chunk text is keyed by the connection.
621
- (0, _handoffts.rekeyChunkText)(conn, store);
606
+ _state.sent();
622
607
  return [
623
- 2,
624
- {
625
- store: store,
626
- cfg: resolvedCfg,
627
- dbPath: dbPath,
628
- parsed: parsed,
629
- warnings: warnings
630
- }
608
+ 2
631
609
  ];
632
610
  }
633
611
  });
634
612
  })();
635
613
  }
636
- function docCount(store) {
614
+ function setDerivedBusyTimeout(handle, _conn, ms) {
637
615
  return _async_to_generator(function() {
638
- var stmt;
639
616
  return _ts_generator(this, function(_state) {
640
- switch(_state.label){
641
- case 0:
642
- return [
643
- 4,
644
- store.prepare('SELECT COUNT(*) AS n FROM frontmatter')
645
- ];
646
- case 1:
647
- stmt = _state.sent();
648
- return [
649
- 4,
650
- stmt.get()
651
- ];
652
- case 2:
653
- return [
654
- 2,
655
- _state.sent().n
656
- ];
657
- }
617
+ handle.db.exec("PRAGMA busy_timeout = ".concat(ms));
618
+ return [
619
+ 2
620
+ ];
621
+ });
622
+ })();
623
+ }
624
+ var sqliteOpenDialect = {
625
+ filename: DB_FILENAME,
626
+ schemaVersion: SCHEMA_VERSION,
627
+ reconcileDialect: _reconcilets.sqliteDialect,
628
+ connect: connect,
629
+ close: close,
630
+ partialRebuild: partialRebuild,
631
+ postSchemaRebuild: postSchemaRebuild,
632
+ extraRebuildReason: extraRebuildReason,
633
+ ensureSchema: ensureSchema,
634
+ setDerivedBusyTimeout: setDerivedBusyTimeout,
635
+ createStore: function createStore(handle, conn, cfg) {
636
+ return (0, _storets.createStore)(handle.db, conn, cfg);
637
+ }
638
+ };
639
+ function openSqlite(cfg) {
640
+ return _async_to_generator(function() {
641
+ return _ts_generator(this, function(_state) {
642
+ return [
643
+ 2,
644
+ (0, _opents.openWithDialect)(cfg, sqliteOpenDialect)
645
+ ];
658
646
  });
659
647
  })();
660
648
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/store/sqlite/open.ts"],"sourcesContent":["// The Node floor (>=22.20) is explained here and nowhere else: 22.20 is the first release with\n// both FTS5 and row-returning INSERT ... RETURNING. Raise it only for a load-bearing capability.\nimport { mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { DatabaseSync } from 'node:sqlite';\nimport type { Config, ResolvedConfig } from '../../config/index.ts';\nimport { contentTokenize, featureSignature, STATE_DIR } from '../../config/index.ts';\nimport { rekeyChunkText } from '../../embed/handoff.ts';\nimport { SenseError } from '../../errors.ts';\nimport { activeFeatures, FEATURES } from '../../features/index.ts';\nimport { clearCache } from '../cache.ts';\nimport { reconcile } from '../reconcile.ts';\nimport { getMeta, setMeta } from '../shared.ts';\nimport { BEGIN_WRITE, withTransaction } from '../transaction.ts';\nimport type { Connection, Store } from '../types.ts';\nimport { createConnection } from './connection.ts';\nimport { sqliteDialect } from './reconcile.ts';\nimport { changedSignatureKeys, embedIdentityAdopted, rebuildContentTable, signatureDiff } from './signature.ts';\nimport { registerFunctions } from './sql-functions.ts';\nimport { createStore } from './store.ts';\n\nexport const DB_FILENAME = 'cache.db';\n// Cache shape version, independent of the config's own `version`. Bumping it rebuilds\n// existing trees on first query.\nexport const SCHEMA_VERSION = '18';\n\ninterface ConnectResult {\n db: DatabaseSync;\n conn: Connection;\n cfg: ResolvedConfig;\n dbPath: string;\n parsed: number;\n warnings: string[];\n}\n\nexport interface OpenResult {\n store: Store;\n cfg: ResolvedConfig;\n dbPath: string;\n parsed: number;\n warnings: string[];\n}\n\n// unicode61 splits on spaces, so a language written without them indexes a whole run as one\n// token and word search finds nothing; `content.tokenize` is how such a tree picks trigram.\nconst DEFAULT_TOKENIZE = 'porter unicode61';\n\n// FTS5 takes its tokenizer as a DDL string literal where nothing can bind, so the configured\n// value is concatenated; probing a throwaway table first is both the safety and the validation.\nfunction resolveTokenize(db: DatabaseSync, cfg: Config): string {\n const configured = contentTokenize(cfg);\n if (configured === undefined) return DEFAULT_TOKENIZE;\n const literal = configured.replace(/'/g, \"''\");\n try {\n db.exec('DROP TABLE IF EXISTS temp.sense_tokenize_probe');\n db.exec(`CREATE VIRTUAL TABLE temp.sense_tokenize_probe USING fts5(x, tokenize = '${literal}')`);\n db.exec('DROP TABLE IF EXISTS temp.sense_tokenize_probe');\n } catch (err) {\n throw new SenseError('CONFIG_INVALID', `content.tokenize \"${configured}\" is not a tokenizer this SQLite accepts (${(err as Error).message}); the built-in choices are unicode61, ascii, porter, and trigram, each with their own options`);\n }\n return literal;\n}\n\n// The tokenizer the content table was actually built with, from its own DDL -- the one\n// record that cannot desynchronize from the table. NULL when the table does not exist yet.\nfunction storedTokenize(db: DatabaseSync): string | null {\n const row = db.prepare(`SELECT sql FROM sqlite_master WHERE name = 'content'`).get() as { sql: string } | undefined;\n if (!row) return null;\n const m = row.sql.match(/tokenize = '((?:[^']|'')*)'/);\n return m ? m[1] : null;\n}\n\n// The `_seg` sidecars are appended after path, never inserted: bm25() and snippet(content, 2)\n// are documented against the first three columns. Each holds its field's exploded unspaced runs.\nasync function createContentTable(conn: Connection, tokenize: string): Promise<void> {\n await conn.exec(`CREATE VIRTUAL TABLE IF NOT EXISTS content USING fts5(title, summary, text, path UNINDEXED, title_seg, summary_seg, text_seg, tokenize = '${tokenize}')`);\n}\n\n// Content is a separate table (not a column on frontmatter) so `SELECT * FROM frontmatter`\n// can't dump file text into context. Features add their own tables after the core ones.\nasync function ensureSchema(conn: Connection, cfg: Config, tokenize: string): Promise<void> {\n await conn.exec(`CREATE TABLE IF NOT EXISTS frontmatter (\"path\" TEXT PRIMARY KEY, \"_mtime\" REAL, \"_ctime\" REAL, \"_size\" INTEGER, \"_parse_error\" TEXT)`);\n // IF NOT EXISTS is safe against a tokenizer change: open() compares the table's own DDL\n // against the resolved tokenizer before this runs, so a stale table is already gone by now.\n await createContentTable(conn, tokenize);\n // Coverage, not ownership: a path can appear under several presets. path leads the PK so the\n // per-doc delete is an index hit -- keyed the other way, cold builds went quadratic.\n await conn.exec(`CREATE TABLE IF NOT EXISTS preset_files (\"path\" TEXT, preset TEXT, PRIMARY KEY (\"path\", preset))`);\n await conn.exec('CREATE INDEX IF NOT EXISTS preset_files_preset ON preset_files(preset)');\n for (const feature of activeFeatures(cfg)) await feature.schema(conn);\n if ((await getMeta(conn, 'schema_version')) === null) await setMeta(conn, 'schema_version', SCHEMA_VERSION);\n if ((await getMeta(conn, 'features')) === null) await setMeta(conn, 'features', featureSignature(cfg, FEATURES));\n}\n\n// Two processes opening the same fresh tree both try to convert it, and the loser gets SQLITE_BUSY\n// with no busy handler behind it. Bounded because a lock held past this is a real problem, not a race.\nfunction setJournalWal(db: DatabaseSync): void {\n const deadline = Date.now() + 5000;\n for (;;) {\n try {\n db.exec('PRAGMA journal_mode = WAL');\n return;\n } catch (err) {\n if (Date.now() >= deadline || !/database is locked|busy/i.test((err as Error).message)) throw err;\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 20);\n }\n }\n}\n\nasync function connect(cfg: ResolvedConfig): Promise<ConnectResult> {\n const stateDir = join(cfg.baseDir, STATE_DIR);\n mkdirSync(stateDir, { recursive: true });\n const dbPath = join(stateDir, DB_FILENAME);\n\n const db = new DatabaseSync(dbPath);\n // A throw below must release this handle, or on Windows the leaked WAL db is undeletable and\n // scratch cleanup fails with EPERM/EBUSY. `closed` keeps the catch from double-closing.\n let closed = false;\n try {\n // Before journal_mode, not after: converting a fresh database to WAL takes a brief exclusive\n // lock, and with no timeout set yet a second process opening the same tree fails in 1ms.\n db.exec('PRAGMA busy_timeout = 30000');\n // busy_timeout does not cover the WAL conversion itself: SQLite does not invoke the busy\n // handler for it, so a concurrent cold open needs its own bounded wait.\n setJournalWal(db);\n registerFunctions(db, contentTokenize(cfg) === undefined);\n const conn = createConnection(db);\n\n db.exec('CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT)');\n\n // Before the rebuild branch below, never after: that branch deletes the cache, so a typo'd\n // tokenizer validated later would cost a full re-index (and re-embed) to reach its own error.\n const tokenize = resolveTokenize(db, cfg);\n\n // Schema-version or feature-set mismatch: reconcile only reparses changed files, so an\n // old cache can't be patched incrementally -- rebuild instead (cheap: nothing expensive lives here).\n const version = await getMeta(conn, 'schema_version');\n const features = await getMeta(conn, 'features');\n const wantFeatures = featureSignature(cfg, FEATURES);\n let tokenizeOnlyRebuild = false;\n if ((version !== null && version !== SCHEMA_VERSION) || (features !== null && features !== wantFeatures)) {\n // Indexing derives from presets, so a config edit rebuilding the cache must say so and\n // name what changed -- silent rebuilds make derived indexing look like a hang or a bug.\n if (version !== null && version !== SCHEMA_VERSION) {\n console.error('sense: cache format changed (new sensemaking version); rebuilding the index');\n closed = true;\n db.close();\n clearCache(cfg);\n return connect(cfg);\n }\n const changedKeys = changedSignatureKeys(features ?? '', wantFeatures);\n // Only the tokenizer moved, and frontmatter, links, sections and embeddings are file-derived\n // and tokenizer-independent. Any other signature change takes the full clear/reopen below.\n if (changedKeys.size === 1 && changedKeys.has('tokenize')) {\n console.error('sense: config change (content tokenizer) rebuilds the text index; vectors, links, and sections are kept');\n // One transaction, so a crash before COMMIT rolls back to the old tokenizer's table rather\n // than to no table. IF EXISTS makes a retry after such a crash a no-op, not a raw error.\n await withTransaction(\n conn,\n async () => {\n await conn.exec('DROP TABLE IF EXISTS content');\n await createContentTable(conn, tokenize);\n },\n BEGIN_WRITE\n );\n tokenizeOnlyRebuild = true;\n } else if (changedKeys.size === 1 && changedKeys.has('embed') && embedIdentityAdopted(features ?? '', wantFeatures)) {\n // First sight of a resolved weight identity: the model itself hasn't changed, so\n // adopt it into meta with no rebuild and no re-embed, mirroring the tokenize precedent.\n console.error(\"sense: recorded the embedding model's resolved identity; vectors are unaffected\");\n await setMeta(conn, 'features', wantFeatures);\n } else {\n const changed = signatureDiff(features ?? '', wantFeatures);\n console.error(`sense: config change (${changed}) rebuilds the index`);\n closed = true;\n db.close();\n clearCache(cfg);\n return connect(cfg);\n }\n }\n\n // Meta can lie after a crash between table creation and the signature write; the table's own\n // DDL cannot, so a mismatch here rebuilds whatever meta says.\n const stored = storedTokenize(db);\n if (stored !== null && stored !== tokenize) {\n console.error('sense: cache was built with a different content tokenizer; rebuilding the index');\n closed = true;\n db.close();\n clearCache(cfg);\n return connect(cfg);\n }\n\n // One writer at a time: the feature hooks check a column then add it, so two cold opens racing\n // here both see it missing and the second ALTER fails with a duplicate column.\n await withTransaction(conn, () => ensureSchema(conn, cfg, tokenize), BEGIN_WRITE);\n\n let rebuildWarnings: string[] = [];\n if (tokenizeOnlyRebuild) {\n rebuildWarnings = await rebuildContentTable(conn, cfg, cfg.baseDir);\n await setMeta(conn, 'features', wantFeatures);\n }\n\n // 3x the largest reconcile this cache has recorded, floored at 30s and capped at 10min.\n // Installed before reconcile() -- that call is the one that races a watcher's transaction.\n const recordedMaxMs = Number((await getMeta(conn, 'reconcile_max_ms')) ?? '0');\n db.exec(`PRAGMA busy_timeout = ${Math.min(Math.max(30000, 3 * recordedMaxMs), 600_000)}`);\n\n const { parsed, warnings } = await reconcile(conn, cfg, cfg.baseDir, sqliteDialect);\n\n return { db, conn, cfg, dbPath, parsed, warnings: [...rebuildWarnings, ...warnings] };\n } catch (err) {\n if (!closed) db.close();\n throw err;\n }\n}\n\n// The sqlite store's open: connects synchronously (see connect() above), then wraps the\n// resulting connection in the async Store interface.\nexport async function openSqlite(cfg: ResolvedConfig): Promise<OpenResult> {\n const { db, conn, cfg: resolvedCfg, dbPath, parsed, warnings } = await connect(cfg);\n const store = createStore(db, conn, resolvedCfg, resolvedCfg.baseDir);\n // reconcile ran before this object existed, so its chunk text is keyed by the connection.\n rekeyChunkText(conn, store);\n return { store: store, cfg: resolvedCfg, dbPath, parsed, warnings };\n}\n\nexport async function docCount(store: Store): Promise<number> {\n const stmt = await store.prepare('SELECT COUNT(*) AS n FROM frontmatter');\n return ((await stmt.get()) as { n: number }).n;\n}\n"],"names":["DB_FILENAME","SCHEMA_VERSION","docCount","openSqlite","DEFAULT_TOKENIZE","resolveTokenize","db","cfg","configured","contentTokenize","undefined","literal","replace","exec","err","SenseError","message","storedTokenize","row","prepare","get","m","sql","match","createContentTable","conn","tokenize","ensureSchema","feature","activeFeatures","schema","getMeta","setMeta","featureSignature","FEATURES","setJournalWal","deadline","Date","now","test","Atomics","wait","Int32Array","SharedArrayBuffer","connect","stateDir","dbPath","closed","version","features","wantFeatures","tokenizeOnlyRebuild","changedKeys","changed","stored","rebuildWarnings","recordedMaxMs","parsed","warnings","join","baseDir","STATE_DIR","mkdirSync","recursive","DatabaseSync","registerFunctions","createConnection","console","error","close","clearCache","changedSignatureKeys","size","has","withTransaction","BEGIN_WRITE","embedIdentityAdopted","signatureDiff","rebuildContentTable","Number","Math","min","max","reconcile","sqliteDialect","resolvedCfg","store","createStore","rekeyChunkText","stmt","n"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/store/sqlite/open.ts"],"sourcesContent":["// The Node floor (>=22.20) is explained here and nowhere else: 22.20 is the first release with\n// both FTS5 and row-returning INSERT ... RETURNING. Raise it only for a load-bearing capability.\nimport { DatabaseSync } from 'node:sqlite';\nimport type { Config, ResolvedConfig } from '../../config/index.ts';\nimport { contentTokenize, featureSignature } from '../../config/index.ts';\nimport { SenseError } from '../../errors.ts';\nimport { activeFeatures, FEATURES } from '../../features/index.ts';\nimport { listFiles, parseFile } from '../../scan/index.ts';\nimport type { OpenResult } from '../open.ts';\nimport { openWithDialect } from '../open.ts';\nimport { getMeta, setMeta } from '../shared.ts';\nimport { BEGIN_WRITE, withTransaction } from '../transaction.ts';\nimport type { Connection, OpenDialect } from '../types.ts';\nimport { createConnection } from './connection.ts';\nimport { contentRow, INSERT_CONTENT_SQL, sqliteDialect } from './reconcile.ts';\nimport { registerFunctions } from './sql-functions.ts';\nimport { createStore } from './store.ts';\n\nexport const DB_FILENAME = 'cache.db';\n// Cache shape version, independent of the config's own `version`. Bumping it rebuilds\n// existing trees on first query.\nexport const SCHEMA_VERSION = '19';\n\nexport type { OpenResult };\n\n// unicode61 splits on spaces, so a language written without them indexes a whole run as one\n// token and word search finds nothing; `content.tokenize` is how such a tree picks trigram.\nconst DEFAULT_TOKENIZE = 'porter unicode61';\n\n// The connection plus this store's own extra state (types.ts's OpenDialect<Handle>): the\n// resolved tokenizer, threaded through connect, the tokenize-only rebuild, and ensureSchema.\ninterface SqliteHandle {\n db: DatabaseSync;\n tokenize: string;\n}\n\n// FTS5 takes its tokenizer as a DDL string literal where nothing can bind, so the configured\n// value is concatenated; probing a throwaway table first is both the safety and the validation.\nfunction resolveTokenize(db: DatabaseSync, cfg: Config): string {\n const configured = contentTokenize(cfg);\n if (configured === undefined) return DEFAULT_TOKENIZE;\n const literal = configured.replace(/'/g, \"''\");\n try {\n db.exec('DROP TABLE IF EXISTS temp.sense_tokenize_probe');\n db.exec(`CREATE VIRTUAL TABLE temp.sense_tokenize_probe USING fts5(x, tokenize = '${literal}')`);\n db.exec('DROP TABLE IF EXISTS temp.sense_tokenize_probe');\n } catch (err) {\n throw new SenseError('CONFIG_INVALID', `content.tokenize \"${configured}\" is not a tokenizer this SQLite accepts (${(err as Error).message}); the built-in choices are unicode61, ascii, porter, and trigram, each with their own options`);\n }\n return literal;\n}\n\n// The tokenizer the content table was actually built with, from its own DDL -- the one\n// record that cannot desynchronize from the table. NULL when the table does not exist yet.\nfunction storedTokenize(db: DatabaseSync): string | null {\n const row = db.prepare(`SELECT sql FROM sqlite_master WHERE name = 'content'`).get() as { sql: string } | undefined;\n if (!row) return null;\n const m = row.sql.match(/tokenize = '((?:[^']|'')*)'/);\n return m ? m[1] : null;\n}\n\n// The `_seg` sidecars are appended after path, never inserted: bm25() and snippet(content, 2)\n// are documented against the first three columns. Each holds its field's exploded unspaced runs.\nasync function createContentTable(conn: Connection, tokenize: string): Promise<void> {\n await conn.exec(`CREATE VIRTUAL TABLE IF NOT EXISTS content USING fts5(title, summary, text, path UNINDEXED, title_seg, summary_seg, text_seg, tokenize = '${tokenize}')`);\n}\n\n// Content is a separate table (not a column on frontmatter) so `SELECT * FROM frontmatter`\n// can't dump file text into context. Features add their own tables after the core ones.\nasync function ensureSchemaTables(conn: Connection, cfg: Config, tokenize: string): Promise<void> {\n await conn.exec(`CREATE TABLE IF NOT EXISTS frontmatter (\"path\" TEXT PRIMARY KEY, \"_mtime\" REAL, \"_ctime\" REAL, \"_size\" INTEGER, \"_parse_error\" TEXT)`);\n // IF NOT EXISTS is safe against a tokenizer change: open() compares the table's own DDL\n // against the resolved tokenizer before this runs, so a stale table is already gone by now.\n await createContentTable(conn, tokenize);\n // Coverage, not ownership: a path can appear under several presets. path leads the PK so the\n // per-doc delete is an index hit -- keyed the other way, cold builds went quadratic.\n await conn.exec(`CREATE TABLE IF NOT EXISTS preset_files (\"path\" TEXT, preset TEXT, PRIMARY KEY (\"path\", preset))`);\n await conn.exec('CREATE INDEX IF NOT EXISTS preset_files_preset ON preset_files(preset)');\n for (const feature of activeFeatures(cfg)) await feature.schema(conn);\n if ((await getMeta(conn, 'schema_version')) === null) await setMeta(conn, 'schema_version', SCHEMA_VERSION);\n if ((await getMeta(conn, 'features')) === null) await setMeta(conn, 'features', featureSignature(cfg, FEATURES));\n}\n\n// Two processes opening the same fresh tree both try to convert it, and the loser gets SQLITE_BUSY\n// with no busy handler behind it. Bounded because a lock held past this is a real problem, not a race.\nfunction setJournalWal(db: DatabaseSync): void {\n const deadline = Date.now() + 5000;\n for (;;) {\n try {\n db.exec('PRAGMA journal_mode = WAL');\n return;\n } catch (err) {\n if (Date.now() >= deadline || !/database is locked|busy/i.test((err as Error).message)) throw err;\n Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 20);\n }\n }\n}\n\nasync function connect(dbPath: string, cfg: ResolvedConfig): Promise<{ handle: SqliteHandle; conn: Connection }> {\n const db = new DatabaseSync(dbPath);\n try {\n // Before journal_mode, not after: converting a fresh database to WAL takes a brief exclusive\n // lock, and with no timeout set yet a second process opening the same tree fails in 1ms.\n db.exec('PRAGMA busy_timeout = 30000');\n // busy_timeout does not cover the WAL conversion itself: SQLite does not invoke the busy\n // handler for it, so a concurrent cold open needs its own bounded wait.\n setJournalWal(db);\n registerFunctions(db, contentTokenize(cfg) === undefined);\n const conn = createConnection(db);\n // Before the rebuild branch below, never after: that branch deletes the cache, so a typo'd\n // tokenizer validated later would cost a full re-index (and re-embed) to reach its own error.\n const tokenize = resolveTokenize(db, cfg);\n return { handle: { db, tokenize }, conn };\n } catch (err) {\n // A throw here must release this handle, or on Windows the leaked WAL db is undeletable and\n // scratch cleanup fails with EPERM/EBUSY.\n db.close();\n throw err;\n }\n}\n\nasync function close(handle: SqliteHandle): Promise<void> {\n handle.db.close();\n}\n\n// Only the tokenizer moved, and frontmatter, links, sections and embeddings are file-derived\n// and tokenizer-independent. Any other signature change takes the full clear/reopen in open.ts.\nasync function partialRebuild(handle: SqliteHandle, conn: Connection, _cfg: Config, changedKeys: Set<string>): Promise<boolean> {\n if (!(changedKeys.size === 1 && changedKeys.has('tokenize'))) return false;\n console.error('sense: config change (content tokenizer) rebuilds the text index; vectors, links, and sections are kept');\n // One transaction, so a crash before COMMIT rolls back to the old tokenizer's table rather\n // than to no table. IF EXISTS makes a retry after such a crash a no-op, not a raw error.\n await withTransaction(\n conn,\n async () => {\n await conn.exec('DROP TABLE IF EXISTS content');\n await createContentTable(conn, handle.tokenize);\n },\n BEGIN_WRITE\n );\n return true;\n}\n\n// Tokenize-only rebuild: only `content` is repopulated (the other tables are tokenizer-independent)\n// and no feature extractors run. Warnings come from the reparse, since mtimes stay untouched and reconcile would never reparse them.\nasync function postSchemaRebuild(_handle: SqliteHandle, conn: Connection, cfg: Config, baseDir: string, wantFeatures: string): Promise<string[]> {\n const stmt = await conn.prepare('SELECT \"path\" FROM frontmatter');\n const known = new Set(((await stmt.all()) as Array<{ path: string }>).map((r) => r.path));\n const files = listFiles(cfg, baseDir).filter((f) => known.has(f.relPath));\n const segmenting = contentTokenize(cfg) === undefined;\n const warnings: string[] = [];\n const rows: unknown[][] = [];\n for (const file of files) {\n const { doc, warnings: fileWarnings } = parseFile(file);\n warnings.push(...fileWarnings);\n rows.push(contentRow(doc, segmenting));\n }\n await withTransaction(\n conn,\n async () => {\n if (rows.length > 0) await conn.runBatch(INSERT_CONTENT_SQL, rows);\n },\n BEGIN_WRITE\n );\n await setMeta(conn, 'features', wantFeatures);\n return warnings;\n}\n\n// Meta can lie after a crash between table creation and the signature write; the table's own\n// DDL cannot, so a mismatch here rebuilds whatever meta says.\nfunction extraRebuildReason(handle: SqliteHandle): string | null {\n const stored = storedTokenize(handle.db);\n if (stored !== null && stored !== handle.tokenize) return 'cache was built with a different content tokenizer';\n return null;\n}\n\nasync function ensureSchema(handle: SqliteHandle, conn: Connection, cfg: Config): Promise<void> {\n // One writer at a time: the feature hooks check a column then add it, so two cold opens racing\n // here both see it missing and the second ALTER fails with a duplicate column.\n await withTransaction(conn, () => ensureSchemaTables(conn, cfg, handle.tokenize), BEGIN_WRITE);\n}\n\nasync function setDerivedBusyTimeout(handle: SqliteHandle, _conn: Connection, ms: number): Promise<void> {\n handle.db.exec(`PRAGMA busy_timeout = ${ms}`);\n}\n\n// This store's dialect (types.ts's OpenDialect) for the shared orchestration in store/open.ts.\nexport const sqliteOpenDialect: OpenDialect<SqliteHandle> = {\n filename: DB_FILENAME,\n schemaVersion: SCHEMA_VERSION,\n reconcileDialect: sqliteDialect,\n connect,\n close,\n partialRebuild,\n postSchemaRebuild,\n extraRebuildReason,\n ensureSchema,\n setDerivedBusyTimeout,\n createStore: (handle, conn, cfg) => createStore(handle.db, conn, cfg),\n};\n\nexport async function openSqlite(cfg: ResolvedConfig): Promise<OpenResult> {\n return openWithDialect(cfg, sqliteOpenDialect);\n}\n"],"names":["DB_FILENAME","SCHEMA_VERSION","openSqlite","sqliteOpenDialect","DEFAULT_TOKENIZE","resolveTokenize","db","cfg","configured","contentTokenize","undefined","literal","replace","exec","err","SenseError","message","storedTokenize","row","prepare","get","m","sql","match","createContentTable","conn","tokenize","ensureSchemaTables","feature","activeFeatures","schema","getMeta","setMeta","featureSignature","FEATURES","setJournalWal","deadline","Date","now","test","Atomics","wait","Int32Array","SharedArrayBuffer","connect","dbPath","DatabaseSync","registerFunctions","createConnection","handle","close","partialRebuild","_cfg","changedKeys","size","has","console","error","withTransaction","BEGIN_WRITE","postSchemaRebuild","_handle","baseDir","wantFeatures","stmt","known","files","segmenting","warnings","rows","file","parseFile","doc","fileWarnings","Set","all","map","r","path","listFiles","filter","f","relPath","push","contentRow","length","runBatch","INSERT_CONTENT_SQL","extraRebuildReason","stored","ensureSchema","setDerivedBusyTimeout","_conn","ms","filename","schemaVersion","reconcileDialect","sqliteDialect","createStore","openWithDialect"],"mappings":"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"}
@@ -2,4 +2,4 @@ import type { DatabaseSync } from 'node:sqlite';
2
2
  import type { Config } from '../../config/index.js';
3
3
  import type { Capability, Connection, Store } from '../types.js';
4
4
  export declare const CAPABILITIES: ReadonlySet<Capability>;
5
- export declare function createStore(db: DatabaseSync, conn: Connection, cfg: Config, baseDir: string): Store;
5
+ export declare function createStore(db: DatabaseSync, conn: Connection, cfg: Config): Store;
@@ -2,4 +2,4 @@ import type { DatabaseSync } from 'node:sqlite';
2
2
  import type { Config } from '../../config/index.js';
3
3
  import type { Capability, Connection, Store } from '../types.js';
4
4
  export declare const CAPABILITIES: ReadonlySet<Capability>;
5
- export declare function createStore(db: DatabaseSync, conn: Connection, cfg: Config, baseDir: string): Store;
5
+ export declare function createStore(db: DatabaseSync, conn: Connection, cfg: Config): Store;
@@ -17,13 +17,11 @@ _export(exports, {
17
17
  }
18
18
  });
19
19
  var _indexts = require("../../config/index.js");
20
- var _reconcilets = require("../reconcile.js");
21
20
  var _sharedts = require("../shared.js");
22
21
  var _transactionts = require("../transaction.js");
23
22
  var _vectorsts = require("../vectors.js");
24
23
  var _fieldStatsts = require("./fieldStats.js");
25
24
  var _lexicalts = require("./lexical.js");
26
- var _reconcilets1 = require("./reconcile.js");
27
25
  var _vectorsts1 = require("./vectors.js");
28
26
  function _array_like_to_array(arr, len) {
29
27
  if (len == null || len > arr.length) len = arr.length;
@@ -371,7 +369,7 @@ var CAPABILITIES = new Set([
371
369
  'vectors',
372
370
  'sql-functions'
373
371
  ]);
374
- function createStore(db, conn, cfg, baseDir) {
372
+ function createStore(db, conn, cfg) {
375
373
  return {
376
374
  name: 'sqlite',
377
375
  capabilities: CAPABILITIES,
@@ -431,16 +429,6 @@ function createStore(db, conn, cfg, baseDir) {
431
429
  });
432
430
  })();
433
431
  },
434
- reconcile: function reconcile() {
435
- return _async_to_generator(function() {
436
- return _ts_generator(this, function(_state) {
437
- return [
438
- 2,
439
- (0, _reconcilets.reconcile)(conn, cfg, baseDir, _reconcilets1.sqliteDialect)
440
- ];
441
- });
442
- })();
443
- },
444
432
  docs: {
445
433
  columns: function columns() {
446
434
  return _async_to_generator(function() {