sensemaking 0.19.1 → 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 (167) 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/index.d.cts +1 -1
  10. package/dist/cjs/index.d.ts +1 -1
  11. package/dist/cjs/index.js +3 -0
  12. package/dist/cjs/index.js.map +1 -1
  13. package/dist/cjs/scan/pool.d.cts +15 -0
  14. package/dist/cjs/scan/pool.d.ts +15 -0
  15. package/dist/cjs/scan/pool.js +263 -0
  16. package/dist/cjs/scan/pool.js.map +1 -0
  17. package/dist/cjs/scan/reparse.d.cts +2 -0
  18. package/dist/cjs/scan/reparse.d.ts +2 -0
  19. package/dist/cjs/scan/reparse.js +15 -76
  20. package/dist/cjs/scan/reparse.js.map +1 -1
  21. package/dist/cjs/store/builder.d.cts +11 -0
  22. package/dist/cjs/store/builder.d.ts +11 -0
  23. package/dist/cjs/store/builder.js +27 -0
  24. package/dist/cjs/store/builder.js.map +1 -0
  25. package/dist/cjs/store/duckdb/fieldStats.js +87 -10
  26. package/dist/cjs/store/duckdb/fieldStats.js.map +1 -1
  27. package/dist/cjs/store/duckdb/lexical.d.cts +1 -0
  28. package/dist/cjs/store/duckdb/lexical.d.ts +1 -0
  29. package/dist/cjs/store/duckdb/lexical.js +21 -5
  30. package/dist/cjs/store/duckdb/lexical.js.map +1 -1
  31. package/dist/cjs/store/duckdb/open.d.cts +9 -8
  32. package/dist/cjs/store/duckdb/open.d.ts +9 -8
  33. package/dist/cjs/store/duckdb/open.js +69 -120
  34. package/dist/cjs/store/duckdb/open.js.map +1 -1
  35. package/dist/cjs/store/duckdb/reconcile.d.cts +2 -6
  36. package/dist/cjs/store/duckdb/reconcile.d.ts +2 -6
  37. package/dist/cjs/store/duckdb/reconcile.js +45 -581
  38. package/dist/cjs/store/duckdb/reconcile.js.map +1 -1
  39. package/dist/cjs/store/duckdb/store.d.cts +1 -2
  40. package/dist/cjs/store/duckdb/store.d.ts +1 -2
  41. package/dist/cjs/store/duckdb/store.js +3 -26
  42. package/dist/cjs/store/duckdb/store.js.map +1 -1
  43. package/dist/cjs/store/index.d.cts +9 -3
  44. package/dist/cjs/store/index.d.ts +9 -3
  45. package/dist/cjs/store/index.js +40 -7
  46. package/dist/cjs/store/index.js.map +1 -1
  47. package/dist/cjs/store/open.d.cts +15 -0
  48. package/dist/cjs/store/open.d.ts +15 -0
  49. package/dist/cjs/store/open.js +516 -0
  50. package/dist/cjs/store/open.js.map +1 -0
  51. package/dist/cjs/store/reconcile.d.cts +7 -0
  52. package/dist/cjs/store/reconcile.d.ts +7 -0
  53. package/dist/cjs/store/reconcile.js +752 -0
  54. package/dist/cjs/store/reconcile.js.map +1 -0
  55. package/dist/cjs/store/shared.d.cts +1 -0
  56. package/dist/cjs/store/shared.d.ts +1 -0
  57. package/dist/cjs/store/shared.js +37 -0
  58. package/dist/cjs/store/shared.js.map +1 -1
  59. package/dist/cjs/store/signature.d.cts +3 -0
  60. package/dist/cjs/store/signature.d.ts +3 -0
  61. package/dist/cjs/store/signature.js +162 -0
  62. package/dist/cjs/store/signature.js.map +1 -0
  63. package/dist/cjs/store/sqlite/open.d.cts +9 -9
  64. package/dist/cjs/store/sqlite/open.d.ts +9 -9
  65. package/dist/cjs/store/sqlite/open.js +188 -198
  66. package/dist/cjs/store/sqlite/open.js.map +1 -1
  67. package/dist/cjs/store/sqlite/reconcile.d.cts +5 -10
  68. package/dist/cjs/store/sqlite/reconcile.d.ts +5 -10
  69. package/dist/cjs/store/sqlite/reconcile.js +48 -850
  70. package/dist/cjs/store/sqlite/reconcile.js.map +1 -1
  71. package/dist/cjs/store/sqlite/store.d.cts +1 -1
  72. package/dist/cjs/store/sqlite/store.d.ts +1 -1
  73. package/dist/cjs/store/sqlite/store.js +3 -13
  74. package/dist/cjs/store/sqlite/store.js.map +1 -1
  75. package/dist/cjs/store/turso/open.d.cts +6 -11
  76. package/dist/cjs/store/turso/open.d.ts +6 -11
  77. package/dist/cjs/store/turso/open.js +78 -169
  78. package/dist/cjs/store/turso/open.js.map +1 -1
  79. package/dist/cjs/store/turso/reconcile.d.cts +5 -6
  80. package/dist/cjs/store/turso/reconcile.d.ts +5 -6
  81. package/dist/cjs/store/turso/reconcile.js +169 -729
  82. package/dist/cjs/store/turso/reconcile.js.map +1 -1
  83. package/dist/cjs/store/turso/store.d.cts +1 -2
  84. package/dist/cjs/store/turso/store.d.ts +1 -2
  85. package/dist/cjs/store/turso/store.js +1 -12
  86. package/dist/cjs/store/turso/store.js.map +1 -1
  87. package/dist/cjs/store/types.d.cts +28 -6
  88. package/dist/cjs/store/types.d.ts +28 -6
  89. package/dist/cjs/store/types.js +14 -0
  90. package/dist/cjs/store/types.js.map +1 -1
  91. package/dist/cjs/text/strip.js +3 -6
  92. package/dist/cjs/text/strip.js.map +1 -1
  93. package/dist/cjs/watch.js +28 -16
  94. package/dist/cjs/watch.js.map +1 -1
  95. package/dist/esm/chunk/extract.d.ts +1 -0
  96. package/dist/esm/chunk/extract.js +10 -2
  97. package/dist/esm/chunk/extract.js.map +1 -1
  98. package/dist/esm/chunk/index.d.ts +1 -1
  99. package/dist/esm/chunk/index.js +1 -1
  100. package/dist/esm/chunk/index.js.map +1 -1
  101. package/dist/esm/index.d.ts +1 -1
  102. package/dist/esm/index.js +1 -1
  103. package/dist/esm/index.js.map +1 -1
  104. package/dist/esm/scan/pool.d.ts +15 -0
  105. package/dist/esm/scan/pool.js +77 -0
  106. package/dist/esm/scan/pool.js.map +1 -0
  107. package/dist/esm/scan/reparse.d.ts +2 -0
  108. package/dist/esm/scan/reparse.js +11 -58
  109. package/dist/esm/scan/reparse.js.map +1 -1
  110. package/dist/esm/store/builder.d.ts +11 -0
  111. package/dist/esm/store/builder.js +14 -0
  112. package/dist/esm/store/builder.js.map +1 -0
  113. package/dist/esm/store/duckdb/fieldStats.js +32 -19
  114. package/dist/esm/store/duckdb/fieldStats.js.map +1 -1
  115. package/dist/esm/store/duckdb/lexical.d.ts +1 -0
  116. package/dist/esm/store/duckdb/lexical.js +22 -9
  117. package/dist/esm/store/duckdb/lexical.js.map +1 -1
  118. package/dist/esm/store/duckdb/open.d.ts +9 -8
  119. package/dist/esm/store/duckdb/open.js +32 -57
  120. package/dist/esm/store/duckdb/open.js.map +1 -1
  121. package/dist/esm/store/duckdb/reconcile.d.ts +2 -6
  122. package/dist/esm/store/duckdb/reconcile.js +24 -117
  123. package/dist/esm/store/duckdb/reconcile.js.map +1 -1
  124. package/dist/esm/store/duckdb/store.d.ts +1 -2
  125. package/dist/esm/store/duckdb/store.js +4 -11
  126. package/dist/esm/store/duckdb/store.js.map +1 -1
  127. package/dist/esm/store/index.d.ts +9 -3
  128. package/dist/esm/store/index.js +23 -7
  129. package/dist/esm/store/index.js.map +1 -1
  130. package/dist/esm/store/open.d.ts +15 -0
  131. package/dist/esm/store/open.js +137 -0
  132. package/dist/esm/store/open.js.map +1 -0
  133. package/dist/esm/store/reconcile.d.ts +7 -0
  134. package/dist/esm/store/reconcile.js +132 -0
  135. package/dist/esm/store/reconcile.js.map +1 -0
  136. package/dist/esm/store/shared.d.ts +1 -0
  137. package/dist/esm/store/shared.js +9 -0
  138. package/dist/esm/store/shared.js.map +1 -1
  139. package/dist/esm/store/signature.d.ts +3 -0
  140. package/dist/esm/store/signature.js +35 -0
  141. package/dist/esm/store/signature.js.map +1 -0
  142. package/dist/esm/store/sqlite/open.d.ts +9 -9
  143. package/dist/esm/store/sqlite/open.js +81 -111
  144. package/dist/esm/store/sqlite/open.js.map +1 -1
  145. package/dist/esm/store/sqlite/reconcile.d.ts +5 -10
  146. package/dist/esm/store/sqlite/reconcile.js +31 -201
  147. package/dist/esm/store/sqlite/reconcile.js.map +1 -1
  148. package/dist/esm/store/sqlite/store.d.ts +1 -1
  149. package/dist/esm/store/sqlite/store.js +4 -7
  150. package/dist/esm/store/sqlite/store.js.map +1 -1
  151. package/dist/esm/store/turso/open.d.ts +6 -11
  152. package/dist/esm/store/turso/open.js +30 -77
  153. package/dist/esm/store/turso/open.js.map +1 -1
  154. package/dist/esm/store/turso/reconcile.d.ts +5 -6
  155. package/dist/esm/store/turso/reconcile.js +42 -146
  156. package/dist/esm/store/turso/reconcile.js.map +1 -1
  157. package/dist/esm/store/turso/store.d.ts +1 -2
  158. package/dist/esm/store/turso/store.js +2 -6
  159. package/dist/esm/store/turso/store.js.map +1 -1
  160. package/dist/esm/store/types.d.ts +28 -6
  161. package/dist/esm/store/types.js +12 -1
  162. package/dist/esm/store/types.js.map +1 -1
  163. package/dist/esm/text/strip.js +3 -4
  164. package/dist/esm/text/strip.js.map +1 -1
  165. package/dist/esm/watch.js +5 -3
  166. package/dist/esm/watch.js.map +1 -1
  167. package/package.json +2 -2
@@ -2,29 +2,30 @@
2
2
  Object.defineProperty(exports, "__esModule", {
3
3
  value: true
4
4
  });
5
- Object.defineProperty(exports, "reconcile", {
6
- enumerable: true,
7
- get: function() {
8
- return reconcile;
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get CONTENT_FTS_DDL () {
13
+ return CONTENT_FTS_DDL;
14
+ },
15
+ get CONTENT_FTS_NAMES () {
16
+ return CONTENT_FTS_NAMES;
17
+ },
18
+ get FTS_REBUILD_THRESHOLD () {
19
+ return FTS_REBUILD_THRESHOLD;
20
+ },
21
+ get tursoDialect () {
22
+ return tursoDialect;
9
23
  }
10
24
  });
11
25
  var _errorsts = require("../../errors.js");
12
- var _indexts = require("../../features/index.js");
13
- var _progressts = require("../../output/progress.js");
14
- var _indexts1 = require("../../scan/index.js");
15
- var _reparsets = require("../../scan/reparse.js");
16
26
  var _segmentts = require("../../text/segment.js");
17
27
  var _sharedts = require("../shared.js");
18
28
  var _transactionts = require("../transaction.js");
19
- var _opents = require("./open.js");
20
- function _array_like_to_array(arr, len) {
21
- if (len == null || len > arr.length) len = arr.length;
22
- for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
23
- return arr2;
24
- }
25
- function _array_without_holes(arr) {
26
- if (Array.isArray(arr)) return _array_like_to_array(arr);
27
- }
28
29
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
29
30
  try {
30
31
  var info = gen[key](arg);
@@ -51,17 +52,6 @@ function _async_to_generator(fn) {
51
52
  });
52
53
  };
53
54
  }
54
- function _iterable_to_array(iter) {
55
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) {
56
- return Array.from(iter);
57
- }
58
- }
59
- function _non_iterable_spread() {
60
- throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
61
- }
62
- function _to_consumable_array(arr) {
63
- return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
64
- }
65
55
  function _ts_generator(thisArg, body) {
66
56
  var f, y, t, _ = {
67
57
  label: 0,
@@ -161,43 +151,14 @@ function _ts_generator(thisArg, body) {
161
151
  };
162
152
  }
163
153
  }
164
- function _ts_values(o) {
165
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
166
- if (m) {
167
- return m.call(o);
168
- }
169
- if (o && typeof o.length === "number") {
170
- return {
171
- next: function() {
172
- if (o && i >= o.length) {
173
- o = void 0;
174
- }
175
- return {
176
- value: o && o[i++],
177
- done: !o
178
- };
179
- }
180
- };
181
- }
182
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
183
- }
184
- function _unsupported_iterable_to_array(o, minLen) {
185
- if (!o) return;
186
- if (typeof o === "string") return _array_like_to_array(o, minLen);
187
- var n = Object.prototype.toString.call(o).slice(8, -1);
188
- if (n === "Object" && o.constructor) n = o.constructor.name;
189
- if (n === "Map" || n === "Set") return Array.from(n);
190
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
191
- }
192
- // Fork of sqlite/reconcile.ts, not duckdb's, so this store keeps reconcile_max_ms bookkeeping
193
- // (open.ts's busy timeout derives from it). content is a plain table with "_ngram" sidecars for lexical.ts.
194
- var CORE_FRONTMATTER_COLUMNS = new Set([
195
- 'path',
196
- '_mtime',
197
- '_ctime',
198
- '_size',
199
- '_parse_error'
200
- ]);
154
+ var CONTENT_FTS_DDL = [
155
+ "CREATE INDEX IF NOT EXISTS content_fts ON content USING fts (title, summary, text) WITH (weights = 'title=10.0,summary=5.0,text=1.0')",
156
+ "CREATE INDEX IF NOT EXISTS content_fts_ngram ON content USING fts (title_ngram, summary_ngram, text_ngram) WITH (tokenizer='ngram', weights='title_ngram=10.0,summary_ngram=5.0,text_ngram=1.0')"
157
+ ];
158
+ var CONTENT_FTS_NAMES = [
159
+ 'content_fts',
160
+ 'content_fts_ngram'
161
+ ];
201
162
  // '' when the field has no unspaced-script run (the common case), so the ngram index carries
202
163
  // nothing for it -- same "pay for nothing when absent" shape as sqlite's segmentField sidecars.
203
164
  function ngramSidecar(text) {
@@ -206,7 +167,6 @@ function ngramSidecar(text) {
206
167
  // Not a compile-time cap on ALTER TABLE ADD COLUMN (spike-measured: turso accepts 10,000 with
207
168
  // no error); the real fence is a SELECT projecting more than this many result columns, which fails to prepare.
208
169
  var MAX_FRONTMATTER_COLUMNS = 2000;
209
- // Changed files above which rebuilding the FTS index beats maintaining it per row (see reconcile).
210
170
  var FTS_REBUILD_THRESHOLD = 250;
211
171
  // No rowid coupling (unlike sqlite's FTS5 content): `path` is content's own primary key.
212
172
  var INSERT_CONTENT_SQL = 'INSERT INTO content ("path", title, summary, text, title_ngram, summary_ngram, text_ngram) VALUES (?, ?, ?, ?, ?, ?, ?)';
@@ -222,706 +182,186 @@ function contentRow(doc) {
222
182
  ngramSidecar(text)
223
183
  ];
224
184
  }
225
- function reconcile(conn, cfg, baseDir) {
185
+ function reconcileContent(conn, touched, docs, delta) {
226
186
  return _async_to_generator(function() {
227
- var files, currentSet, existingStmt, existingRows, existing, vanished, toReparse, features, seenColumns, report, _ref, parsedDocs, warnings, newColumns, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, col, allColumns, writableColumns, insertSql, added, delta, addedSet, reparsedExisting, txStart, durationMs, prevRaw, prevMax;
187
+ var churn, bulk, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, name, err, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, ddl, err;
228
188
  return _ts_generator(this, function(_state) {
229
189
  switch(_state.label){
230
190
  case 0:
231
- files = (0, _indexts1.listFiles)(cfg, baseDir);
232
- currentSet = new Set(files.map(function(f) {
233
- return f.relPath;
234
- }));
235
- return [
236
- 4,
237
- conn.prepare('SELECT "path", "_mtime", "_size" FROM frontmatter')
191
+ churn = delta.reparsed.length + delta.vanished.length;
192
+ // Tantivy indexes per inserted row at a cost that grows with the batch, so a large insert is
193
+ // superlinear and a rebuild wins past the threshold.
194
+ bulk = delta.files.length === 0 || churn > FTS_REBUILD_THRESHOLD;
195
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
196
+ if (!bulk) return [
197
+ 3,
198
+ 8
238
199
  ];
200
+ _state.label = 1;
239
201
  case 1:
240
- existingStmt = _state.sent();
241
- return [
242
- 4,
243
- existingStmt.all()
244
- ];
202
+ _state.trys.push([
203
+ 1,
204
+ 6,
205
+ 7,
206
+ 8
207
+ ]);
208
+ _iterator = CONTENT_FTS_NAMES[Symbol.iterator]();
209
+ _state.label = 2;
245
210
  case 2:
246
- existingRows = _state.sent();
247
- existing = new Map(existingRows.map(function(r) {
248
- return [
249
- r.path,
250
- r
251
- ];
252
- }));
253
- vanished = existingRows.filter(function(r) {
254
- return !currentSet.has(r.path);
255
- }).map(function(r) {
256
- return r.path;
257
- });
258
- toReparse = files.filter(function(f) {
259
- var row = existing.get(f.relPath);
260
- return !row || row._mtime !== f.mtimeMs || row._size !== f.size;
261
- });
262
- if (vanished.length === 0 && toReparse.length === 0) return [
263
- 2,
264
- {
265
- parsed: 0,
266
- warnings: []
267
- }
211
+ if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
212
+ 3,
213
+ 5
268
214
  ];
269
- features = (0, _indexts.activeFeatures)(cfg);
215
+ name = _step.value;
270
216
  return [
271
217
  4,
272
- (0, _sharedts.getColumns)(conn)
218
+ conn.exec("DROP INDEX IF EXISTS ".concat(name))
273
219
  ];
274
220
  case 3:
275
- seenColumns = _state.sent();
276
- // Bulk reparses (a sync, a cold build) are the long silences a query can hit; short
277
- // reconciles stay silent (progress() has a threshold).
278
- report = (0, _progressts.progress)('reparsing files', toReparse.length);
221
+ _state.sent();
222
+ _state.label = 4;
223
+ case 4:
224
+ _iteratorNormalCompletion = true;
279
225
  return [
280
- 4,
281
- (0, _reparsets.reparseFiles)(toReparse, features, cfg, seenColumns, report.tick)
226
+ 3,
227
+ 2
282
228
  ];
283
- case 4:
284
- _ref = _state.sent(), parsedDocs = _ref.docs, warnings = _ref.warnings, newColumns = _ref.newColumns;
285
- report.finish();
286
- _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
229
+ case 5:
230
+ return [
231
+ 3,
232
+ 8
233
+ ];
234
+ case 6:
235
+ err = _state.sent();
236
+ _didIteratorError = true;
237
+ _iteratorError = err;
238
+ return [
239
+ 3,
240
+ 8
241
+ ];
242
+ case 7:
287
243
  try {
288
- for(_iterator = newColumns[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
289
- col = _step.value;
290
- seenColumns.add(col);
244
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
245
+ _iterator.return();
291
246
  }
292
- } catch (err) {
293
- _didIteratorError = true;
294
- _iteratorError = err;
295
247
  } finally{
296
- try {
297
- if (!_iteratorNormalCompletion && _iterator.return != null) {
298
- _iterator.return();
299
- }
300
- } finally{
301
- if (_didIteratorError) {
302
- throw _iteratorError;
303
- }
248
+ if (_didIteratorError) {
249
+ throw _iteratorError;
304
250
  }
305
251
  }
306
- allColumns = _to_consumable_array(seenColumns);
307
- if (allColumns.length > MAX_FRONTMATTER_COLUMNS) {
308
- throw new _errorsts.SenseError('COLUMN_LIMIT', "frontmatter would need ".concat(allColumns.length, " columns, crossing turso's SELECT result-set column limit (").concat(MAX_FRONTMATTER_COLUMNS, "; ALTER TABLE ADD COLUMN itself accepts far more, but a query projecting past this many columns fails to prepare). Narrow the presets' include globs so fewer/other files are indexed, or fix whatever is generating unbounded frontmatter keys."));
309
- }
310
- // Columns the frontmatter upsert actually writes: core + parsed frontmatter keys, never a
311
- // feature-owned reserved column (see CORE_FRONTMATTER_COLUMNS above).
312
- writableColumns = allColumns.filter(function(c) {
313
- return CORE_FRONTMATTER_COLUMNS.has(c) || !_indexts1.RESERVED_COLUMNS.has(c);
314
- });
315
- // ON CONFLICT UPDATE, rather than the delete-and-insert `OR` clause, keeps the row's identity stable across reparses.
316
- insertSql = "INSERT INTO frontmatter (".concat(writableColumns.map(_sharedts.quoteIdent).join(', '), ") VALUES (").concat(writableColumns.map(function() {
317
- return '?';
318
- }).join(', '), ') ON CONFLICT("path") DO UPDATE SET ').concat(writableColumns.filter(function(c) {
319
- return c !== 'path';
320
- }).map(function(c) {
321
- return "".concat((0, _sharedts.quoteIdent)(c), " = excluded.").concat((0, _sharedts.quoteIdent)(c));
322
- }).join(', '));
323
- added = toReparse.filter(function(f) {
324
- return !existing.has(f.relPath);
325
- }).map(function(f) {
326
- return f.relPath;
327
- });
328
- delta = {
329
- files: files,
330
- reparsed: parsedDocs.map(function(d) {
331
- return d.relPath;
332
- }),
333
- added: added,
334
- vanished: vanished
335
- };
336
- addedSet = new Set(added);
337
- reparsedExisting = parsedDocs.map(function(d) {
338
- return d.relPath;
339
- }).filter(function(p) {
340
- return !addedSet.has(p);
341
- });
342
- txStart = Date.now();
252
+ return [
253
+ 7
254
+ ];
255
+ case 8:
256
+ if (!(touched.length > 0)) return [
257
+ 3,
258
+ 10
259
+ ];
343
260
  return [
344
261
  4,
345
- (0, _transactionts.withTransaction)(conn, function() {
346
- return _async_to_generator(function() {
347
- var _feature_remove, _feature_afterReconcile, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, col, err, rows, churn, bulk, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, name, err, contentTouched, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, ddl, err, presetTouched, presetRows, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iteratorNormalCompletion4, _didIteratorError4, _iteratorError4, _iterator3, _step3, doc, _iterator4, _step4, presetName, removedPaths, _iteratorNormalCompletion5, _didIteratorError5, _iteratorError5, _iterator5, _step5, feature, err, _iteratorNormalCompletion6, _didIteratorError6, _iteratorError6, _loop, _iterator6, _step6, err, _iteratorNormalCompletion7, _didIteratorError7, _iteratorError7, _iterator7, _step7, feature1, err;
348
- return _ts_generator(this, function(_state) {
349
- switch(_state.label){
350
- case 0:
351
- _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
352
- _state.label = 1;
353
- case 1:
354
- _state.trys.push([
355
- 1,
356
- 6,
357
- 7,
358
- 8
359
- ]);
360
- _iterator = newColumns[Symbol.iterator]();
361
- _state.label = 2;
362
- case 2:
363
- if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
364
- 3,
365
- 5
366
- ];
367
- col = _step.value;
368
- return [
369
- 4,
370
- conn.exec("ALTER TABLE frontmatter ADD COLUMN ".concat((0, _sharedts.quoteIdent)(col)))
371
- ];
372
- case 3:
373
- _state.sent();
374
- _state.label = 4;
375
- case 4:
376
- _iteratorNormalCompletion = true;
377
- return [
378
- 3,
379
- 2
380
- ];
381
- case 5:
382
- return [
383
- 3,
384
- 8
385
- ];
386
- case 6:
387
- err = _state.sent();
388
- _didIteratorError = true;
389
- _iteratorError = err;
390
- return [
391
- 3,
392
- 8
393
- ];
394
- case 7:
395
- try {
396
- if (!_iteratorNormalCompletion && _iterator.return != null) {
397
- _iterator.return();
398
- }
399
- } finally{
400
- if (_didIteratorError) {
401
- throw _iteratorError;
402
- }
403
- }
404
- return [
405
- 7
406
- ];
407
- case 8:
408
- if (!(parsedDocs.length > 0)) return [
409
- 3,
410
- 10
411
- ];
412
- rows = parsedDocs.map(function(doc) {
413
- return writableColumns.map(function(col) {
414
- var _doc_data_col;
415
- if (col === 'path') return doc.relPath;
416
- if (col === '_mtime') return doc.mtimeMs;
417
- if (col === '_ctime') return doc.ctimeMs;
418
- if (col === '_size') return doc.size;
419
- // Written per parse, unlike _rank, which a feature pass owns and the upsert skips.
420
- if (col === '_parse_error') return doc.parseError;
421
- return (_doc_data_col = doc.data[col]) !== null && _doc_data_col !== void 0 ? _doc_data_col : null;
422
- });
423
- });
424
- return [
425
- 4,
426
- conn.runBatch(insertSql, rows)
427
- ];
428
- case 9:
429
- _state.sent();
430
- _state.label = 10;
431
- case 10:
432
- // Tantivy maintains the FTS index per inserted row and the cost grows with the batch, so a
433
- // large insert is superlinear: 6,566 notes took 945s with the index live, 3.3s built after.
434
- // Measured crossover against a full rebuild, in changed files: ~250 on a 6,566-note tree
435
- // (100 -> 895ms, 300 -> 4.1s, 1,300 -> 45.5s, rebuild 3.35s), ~295 on 13,132 (250 -> 5.2s,
436
- // 400 -> 10.0s, rebuild 6.7s). Doubling the corpus moved it 250 to 295, so a constant fits
437
- // where a ratio does not: 20% would allow 1,313 files here, costing 45s to save 3.3s.
438
- // Erring low is the cheap direction, since a needless rebuild is linear and predictable.
439
- churn = delta.reparsed.length + delta.vanished.length;
440
- bulk = delta.files.length === 0 || churn > FTS_REBUILD_THRESHOLD;
441
- _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
442
- if (!bulk) return [
443
- 3,
444
- 18
445
- ];
446
- _state.label = 11;
447
- case 11:
448
- _state.trys.push([
449
- 11,
450
- 16,
451
- 17,
452
- 18
453
- ]);
454
- _iterator1 = _opents.CONTENT_FTS_NAMES[Symbol.iterator]();
455
- _state.label = 12;
456
- case 12:
457
- if (!!(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done)) return [
458
- 3,
459
- 15
460
- ];
461
- name = _step1.value;
462
- return [
463
- 4,
464
- conn.exec("DROP INDEX IF EXISTS ".concat(name))
465
- ];
466
- case 13:
467
- _state.sent();
468
- _state.label = 14;
469
- case 14:
470
- _iteratorNormalCompletion1 = true;
471
- return [
472
- 3,
473
- 12
474
- ];
475
- case 15:
476
- return [
477
- 3,
478
- 18
479
- ];
480
- case 16:
481
- err = _state.sent();
482
- _didIteratorError1 = true;
483
- _iteratorError1 = err;
484
- return [
485
- 3,
486
- 18
487
- ];
488
- case 17:
489
- try {
490
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
491
- _iterator1.return();
492
- }
493
- } finally{
494
- if (_didIteratorError1) {
495
- throw _iteratorError1;
496
- }
497
- }
498
- return [
499
- 7
500
- ];
501
- case 18:
502
- // content is a plain table keyed by its own path (no rowid subquery, unlike sqlite's FTS5
503
- // content), so vanished and reparsed docs delete in one pass.
504
- contentTouched = _to_consumable_array(vanished).concat(_to_consumable_array(reparsedExisting));
505
- if (!(contentTouched.length > 0)) return [
506
- 3,
507
- 20
508
- ];
509
- return [
510
- 4,
511
- conn.runBatch('DELETE FROM content WHERE "path" = ?', contentTouched.map(function(p) {
512
- return [
513
- p
514
- ];
515
- }))
516
- ];
517
- case 19:
518
- _state.sent();
519
- _state.label = 20;
520
- case 20:
521
- if (!(parsedDocs.length > 0)) return [
522
- 3,
523
- 22
524
- ];
525
- return [
526
- 4,
527
- conn.runBatch(INSERT_CONTENT_SQL, parsedDocs.map(contentRow))
528
- ];
529
- case 21:
530
- _state.sent();
531
- _state.label = 22;
532
- case 22:
533
- _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
534
- if (!bulk) return [
535
- 3,
536
- 30
537
- ];
538
- _state.label = 23;
539
- case 23:
540
- _state.trys.push([
541
- 23,
542
- 28,
543
- 29,
544
- 30
545
- ]);
546
- _iterator2 = _opents.CONTENT_FTS_DDL[Symbol.iterator]();
547
- _state.label = 24;
548
- case 24:
549
- if (!!(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done)) return [
550
- 3,
551
- 27
552
- ];
553
- ddl = _step2.value;
554
- return [
555
- 4,
556
- conn.exec(ddl)
557
- ];
558
- case 25:
559
- _state.sent();
560
- _state.label = 26;
561
- case 26:
562
- _iteratorNormalCompletion2 = true;
563
- return [
564
- 3,
565
- 24
566
- ];
567
- case 27:
568
- return [
569
- 3,
570
- 30
571
- ];
572
- case 28:
573
- err = _state.sent();
574
- _didIteratorError2 = true;
575
- _iteratorError2 = err;
576
- return [
577
- 3,
578
- 30
579
- ];
580
- case 29:
581
- try {
582
- if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
583
- _iterator2.return();
584
- }
585
- } finally{
586
- if (_didIteratorError2) {
587
- throw _iteratorError2;
588
- }
589
- }
590
- return [
591
- 7
592
- ];
593
- case 30:
594
- if (!(vanished.length > 0)) return [
595
- 3,
596
- 32
597
- ];
598
- return [
599
- 4,
600
- conn.runBatch('DELETE FROM frontmatter WHERE "path" = ?', vanished.map(function(p) {
601
- return [
602
- p
603
- ];
604
- }))
605
- ];
606
- case 31:
607
- _state.sent();
608
- _state.label = 32;
609
- case 32:
610
- // A preset edit forces a full rebuild, so an unchanged doc's coverage is already correct;
611
- // new docs have nothing to clear, which keeps cold builds linear.
612
- presetTouched = _to_consumable_array(vanished).concat(_to_consumable_array(reparsedExisting));
613
- if (!(presetTouched.length > 0)) return [
614
- 3,
615
- 34
616
- ];
617
- return [
618
- 4,
619
- conn.runBatch('DELETE FROM preset_files WHERE "path" = ?', presetTouched.map(function(p) {
620
- return [
621
- p
622
- ];
623
- }))
624
- ];
625
- case 33:
626
- _state.sent();
627
- _state.label = 34;
628
- case 34:
629
- presetRows = [];
630
- _iteratorNormalCompletion3 = true, _didIteratorError3 = false, _iteratorError3 = undefined, _iteratorNormalCompletion4 = true, _didIteratorError4 = false, _iteratorError4 = undefined;
631
- try {
632
- for(_iterator3 = parsedDocs[Symbol.iterator](); !(_iteratorNormalCompletion4 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion4 = true){
633
- doc = _step3.value;
634
- try {
635
- for(_iterator4 = doc.presets[Symbol.iterator](); !(_iteratorNormalCompletion3 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion3 = true){
636
- presetName = _step4.value;
637
- presetRows.push([
638
- doc.relPath,
639
- presetName
640
- ]);
641
- }
642
- } catch (err) {
643
- _didIteratorError3 = true;
644
- _iteratorError3 = err;
645
- } finally{
646
- try {
647
- if (!_iteratorNormalCompletion3 && _iterator4.return != null) {
648
- _iterator4.return();
649
- }
650
- } finally{
651
- if (_didIteratorError3) {
652
- throw _iteratorError3;
653
- }
654
- }
655
- }
656
- }
657
- } catch (err) {
658
- _didIteratorError4 = true;
659
- _iteratorError4 = err;
660
- } finally{
661
- try {
662
- if (!_iteratorNormalCompletion4 && _iterator3.return != null) {
663
- _iterator3.return();
664
- }
665
- } finally{
666
- if (_didIteratorError4) {
667
- throw _iteratorError4;
668
- }
669
- }
670
- }
671
- if (!(presetRows.length > 0)) return [
672
- 3,
673
- 36
674
- ];
675
- return [
676
- 4,
677
- conn.runBatch('INSERT INTO preset_files ("path", preset) VALUES (?, ?)', presetRows)
678
- ];
679
- case 35:
680
- _state.sent();
681
- _state.label = 36;
682
- case 36:
683
- removedPaths = _to_consumable_array(vanished).concat(_to_consumable_array(reparsedExisting));
684
- _iteratorNormalCompletion5 = true, _didIteratorError5 = false, _iteratorError5 = undefined;
685
- if (!(removedPaths.length > 0)) return [
686
- 3,
687
- 44
688
- ];
689
- _state.label = 37;
690
- case 37:
691
- _state.trys.push([
692
- 37,
693
- 42,
694
- 43,
695
- 44
696
- ]);
697
- _iterator5 = features[Symbol.iterator]();
698
- _state.label = 38;
699
- case 38:
700
- if (!!(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done)) return [
701
- 3,
702
- 41
703
- ];
704
- feature = _step5.value;
705
- return [
706
- 4,
707
- (_feature_remove = feature.remove) === null || _feature_remove === void 0 ? void 0 : _feature_remove.call(feature, conn, removedPaths, delta)
708
- ];
709
- case 39:
710
- _state.sent();
711
- _state.label = 40;
712
- case 40:
713
- _iteratorNormalCompletion5 = true;
714
- return [
715
- 3,
716
- 38
717
- ];
718
- case 41:
719
- return [
720
- 3,
721
- 44
722
- ];
723
- case 42:
724
- err = _state.sent();
725
- _didIteratorError5 = true;
726
- _iteratorError5 = err;
727
- return [
728
- 3,
729
- 44
730
- ];
731
- case 43:
732
- try {
733
- if (!_iteratorNormalCompletion5 && _iterator5.return != null) {
734
- _iterator5.return();
735
- }
736
- } finally{
737
- if (_didIteratorError5) {
738
- throw _iteratorError5;
739
- }
740
- }
741
- return [
742
- 7
743
- ];
744
- case 44:
745
- _iteratorNormalCompletion6 = true, _didIteratorError6 = false, _iteratorError6 = undefined;
746
- _state.label = 45;
747
- case 45:
748
- _state.trys.push([
749
- 45,
750
- 50,
751
- 51,
752
- 52
753
- ]);
754
- _loop = function() {
755
- var feature, _feature_store, docsForFeature;
756
- return _ts_generator(this, function(_state) {
757
- switch(_state.label){
758
- case 0:
759
- feature = _step6.value;
760
- docsForFeature = parsedDocs.map(function(doc) {
761
- return {
762
- path: doc.relPath,
763
- extracted: doc.extracted[feature.name]
764
- };
765
- });
766
- return [
767
- 4,
768
- (_feature_store = feature.store) === null || _feature_store === void 0 ? void 0 : _feature_store.call(feature, conn, docsForFeature, delta)
769
- ];
770
- case 1:
771
- _state.sent();
772
- return [
773
- 2
774
- ];
775
- }
776
- });
777
- };
778
- _iterator6 = features[Symbol.iterator]();
779
- _state.label = 46;
780
- case 46:
781
- if (!!(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done)) return [
782
- 3,
783
- 49
784
- ];
785
- return [
786
- 5,
787
- _ts_values(_loop())
788
- ];
789
- case 47:
790
- _state.sent();
791
- _state.label = 48;
792
- case 48:
793
- _iteratorNormalCompletion6 = true;
794
- return [
795
- 3,
796
- 46
797
- ];
798
- case 49:
799
- return [
800
- 3,
801
- 52
802
- ];
803
- case 50:
804
- err = _state.sent();
805
- _didIteratorError6 = true;
806
- _iteratorError6 = err;
807
- return [
808
- 3,
809
- 52
810
- ];
811
- case 51:
812
- try {
813
- if (!_iteratorNormalCompletion6 && _iterator6.return != null) {
814
- _iterator6.return();
815
- }
816
- } finally{
817
- if (_didIteratorError6) {
818
- throw _iteratorError6;
819
- }
820
- }
821
- return [
822
- 7
823
- ];
824
- case 52:
825
- _iteratorNormalCompletion7 = true, _didIteratorError7 = false, _iteratorError7 = undefined;
826
- _state.label = 53;
827
- case 53:
828
- _state.trys.push([
829
- 53,
830
- 58,
831
- 59,
832
- 60
833
- ]);
834
- _iterator7 = features[Symbol.iterator]();
835
- _state.label = 54;
836
- case 54:
837
- if (!!(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done)) return [
838
- 3,
839
- 57
840
- ];
841
- feature1 = _step7.value;
842
- return [
843
- 4,
844
- (_feature_afterReconcile = feature1.afterReconcile) === null || _feature_afterReconcile === void 0 ? void 0 : _feature_afterReconcile.call(feature1, conn, delta)
845
- ];
846
- case 55:
847
- _state.sent();
848
- _state.label = 56;
849
- case 56:
850
- _iteratorNormalCompletion7 = true;
851
- return [
852
- 3,
853
- 54
854
- ];
855
- case 57:
856
- return [
857
- 3,
858
- 60
859
- ];
860
- case 58:
861
- err = _state.sent();
862
- _didIteratorError7 = true;
863
- _iteratorError7 = err;
864
- return [
865
- 3,
866
- 60
867
- ];
868
- case 59:
869
- try {
870
- if (!_iteratorNormalCompletion7 && _iterator7.return != null) {
871
- _iterator7.return();
872
- }
873
- } finally{
874
- if (_didIteratorError7) {
875
- throw _iteratorError7;
876
- }
877
- }
878
- return [
879
- 7
880
- ];
881
- case 60:
882
- return [
883
- 2
884
- ];
885
- }
886
- });
887
- })();
888
- }, _transactionts.BEGIN_WRITE)
262
+ conn.runBatch('DELETE FROM content WHERE "path" = ?', touched.map(function(p) {
263
+ return [
264
+ p
265
+ ];
266
+ }))
889
267
  ];
890
- case 5:
268
+ case 9:
891
269
  _state.sent();
892
- // Reconcile's own write-transaction duration, for open()'s derived busy_timeout: the observed
893
- // max is what the next open bounds its wait against.
894
- durationMs = Date.now() - txStart;
270
+ _state.label = 10;
271
+ case 10:
272
+ if (!(docs.length > 0)) return [
273
+ 3,
274
+ 12
275
+ ];
895
276
  return [
896
277
  4,
897
- (0, _sharedts.getMeta)(conn, 'reconcile_max_ms')
278
+ conn.runBatch(INSERT_CONTENT_SQL, docs.map(contentRow))
898
279
  ];
899
- case 6:
900
- prevRaw = _state.sent();
901
- // -1, not 0, so a genuinely 0ms first reconcile (sub-millisecond, common on a tiny tree)
902
- // gets recorded rather than losing to the "nothing recorded yet" default.
903
- prevMax = prevRaw === null ? -1 : Number(prevRaw);
904
- if (!(durationMs > prevMax)) return [
280
+ case 11:
281
+ _state.sent();
282
+ _state.label = 12;
283
+ case 12:
284
+ _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
285
+ if (!bulk) return [
905
286
  3,
906
- 8
287
+ 20
288
+ ];
289
+ _state.label = 13;
290
+ case 13:
291
+ _state.trys.push([
292
+ 13,
293
+ 18,
294
+ 19,
295
+ 20
296
+ ]);
297
+ _iterator1 = CONTENT_FTS_DDL[Symbol.iterator]();
298
+ _state.label = 14;
299
+ case 14:
300
+ if (!!(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done)) return [
301
+ 3,
302
+ 17
907
303
  ];
304
+ ddl = _step1.value;
908
305
  return [
909
306
  4,
910
- (0, _sharedts.setMeta)(conn, 'reconcile_max_ms', String(durationMs))
307
+ conn.exec(ddl)
911
308
  ];
912
- case 7:
309
+ case 15:
913
310
  _state.sent();
914
- _state.label = 8;
915
- case 8:
311
+ _state.label = 16;
312
+ case 16:
313
+ _iteratorNormalCompletion1 = true;
314
+ return [
315
+ 3,
316
+ 14
317
+ ];
318
+ case 17:
916
319
  return [
917
- 2,
918
- {
919
- parsed: parsedDocs.length,
920
- warnings: warnings
320
+ 3,
321
+ 20
322
+ ];
323
+ case 18:
324
+ err = _state.sent();
325
+ _didIteratorError1 = true;
326
+ _iteratorError1 = err;
327
+ return [
328
+ 3,
329
+ 20
330
+ ];
331
+ case 19:
332
+ try {
333
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
334
+ _iterator1.return();
921
335
  }
336
+ } finally{
337
+ if (_didIteratorError1) {
338
+ throw _iteratorError1;
339
+ }
340
+ }
341
+ return [
342
+ 7
343
+ ];
344
+ case 20:
345
+ return [
346
+ 2
922
347
  ];
923
348
  }
924
349
  });
925
350
  })();
926
351
  }
352
+ var tursoDialect = {
353
+ beginMode: function beginMode() {
354
+ return _transactionts.BEGIN_WRITE;
355
+ },
356
+ checkColumnLimit: function checkColumnLimit(count) {
357
+ if (count > MAX_FRONTMATTER_COLUMNS) {
358
+ throw new _errorsts.SenseError('COLUMN_LIMIT', "frontmatter would need ".concat(count, " columns, crossing turso's SELECT result-set column limit (").concat(MAX_FRONTMATTER_COLUMNS, "; ALTER TABLE ADD COLUMN itself accepts far more, but a query projecting past this many columns fails to prepare). Narrow the presets' include globs so fewer/other files are indexed, or fix whatever is generating unbounded frontmatter keys."));
359
+ }
360
+ },
361
+ columnTypeSuffix: function columnTypeSuffix() {
362
+ return '';
363
+ },
364
+ reconcileContent: reconcileContent,
365
+ recordDuration: _sharedts.recordReconcileDuration
366
+ };
927
367
  /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }