sensemaking 0.21.1 → 0.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/chunk/group.js +13 -9
  3. package/dist/cjs/chunk/group.js.map +1 -1
  4. package/dist/cjs/commands/search.js +1 -1
  5. package/dist/cjs/commands/search.js.map +1 -1
  6. package/dist/cjs/features/embed.js +9 -1
  7. package/dist/cjs/features/embed.js.map +1 -1
  8. package/dist/cjs/features/links.js +30 -8
  9. package/dist/cjs/features/links.js.map +1 -1
  10. package/dist/cjs/features/sections.js +13 -5
  11. package/dist/cjs/features/sections.js.map +1 -1
  12. package/dist/cjs/features/tags.js +7 -4
  13. package/dist/cjs/features/tags.js.map +1 -1
  14. package/dist/cjs/index.d.cts +1 -1
  15. package/dist/cjs/index.d.ts +1 -1
  16. package/dist/cjs/index.js.map +1 -1
  17. package/dist/cjs/scan/pool.d.cts +1 -0
  18. package/dist/cjs/scan/pool.d.ts +1 -0
  19. package/dist/cjs/scan/pool.js +2 -1
  20. package/dist/cjs/scan/pool.js.map +1 -1
  21. package/dist/cjs/scan/reparse.d.cts +1 -0
  22. package/dist/cjs/scan/reparse.d.ts +1 -0
  23. package/dist/cjs/scan/reparse.js +6 -3
  24. package/dist/cjs/scan/reparse.js.map +1 -1
  25. package/dist/cjs/store/builder.d.cts +2 -0
  26. package/dist/cjs/store/builder.d.ts +2 -0
  27. package/dist/cjs/store/builder.js.map +1 -1
  28. package/dist/cjs/store/duckdb/connection.js +120 -0
  29. package/dist/cjs/store/duckdb/connection.js.map +1 -1
  30. package/dist/cjs/store/duckdb/reconcile.js +11 -113
  31. package/dist/cjs/store/duckdb/reconcile.js.map +1 -1
  32. package/dist/cjs/store/index.d.cts +1 -5
  33. package/dist/cjs/store/index.d.ts +1 -5
  34. package/dist/cjs/store/index.js +9 -46
  35. package/dist/cjs/store/index.js.map +1 -1
  36. package/dist/cjs/store/lock-wait.d.cts +2 -0
  37. package/dist/cjs/store/lock-wait.d.ts +2 -0
  38. package/dist/cjs/store/lock-wait.js +51 -0
  39. package/dist/cjs/store/lock-wait.js.map +1 -0
  40. package/dist/cjs/store/open.d.cts +2 -4
  41. package/dist/cjs/store/open.d.ts +2 -4
  42. package/dist/cjs/store/open.js +29 -66
  43. package/dist/cjs/store/open.js.map +1 -1
  44. package/dist/cjs/store/reconcile.d.cts +2 -0
  45. package/dist/cjs/store/reconcile.d.ts +2 -0
  46. package/dist/cjs/store/reconcile.js +384 -255
  47. package/dist/cjs/store/reconcile.js.map +1 -1
  48. package/dist/cjs/store/shared.d.cts +1 -0
  49. package/dist/cjs/store/shared.d.ts +1 -0
  50. package/dist/cjs/store/shared.js +41 -0
  51. package/dist/cjs/store/shared.js.map +1 -1
  52. package/dist/cjs/store/sqlite/lexical.js +1 -1
  53. package/dist/cjs/store/sqlite/lexical.js.map +1 -1
  54. package/dist/cjs/store/sqlite/store.js +0 -1
  55. package/dist/cjs/store/sqlite/store.js.map +1 -1
  56. package/dist/cjs/store/stages.d.cts +18 -0
  57. package/dist/cjs/store/stages.d.ts +18 -0
  58. package/dist/cjs/store/stages.js +372 -0
  59. package/dist/cjs/store/stages.js.map +1 -0
  60. package/dist/cjs/store/turso/store.js.map +1 -1
  61. package/dist/cjs/store/types.d.cts +2 -2
  62. package/dist/cjs/store/types.d.ts +2 -2
  63. package/dist/cjs/store/types.js +0 -1
  64. package/dist/cjs/store/types.js.map +1 -1
  65. package/dist/cjs/text/segment.js +7 -5
  66. package/dist/cjs/text/segment.js.map +1 -1
  67. package/dist/cjs/watch.js +162 -107
  68. package/dist/cjs/watch.js.map +1 -1
  69. package/dist/cjs/workers/parse.d.cts +1 -0
  70. package/dist/cjs/workers/parse.d.ts +1 -0
  71. package/dist/cjs/workers/parse.js +4 -1
  72. package/dist/cjs/workers/parse.js.map +1 -1
  73. package/dist/esm/chunk/group.js +13 -9
  74. package/dist/esm/chunk/group.js.map +1 -1
  75. package/dist/esm/commands/search.js +1 -1
  76. package/dist/esm/commands/search.js.map +1 -1
  77. package/dist/esm/features/embed.js +9 -1
  78. package/dist/esm/features/embed.js.map +1 -1
  79. package/dist/esm/features/links.js +26 -9
  80. package/dist/esm/features/links.js.map +1 -1
  81. package/dist/esm/features/sections.js +13 -3
  82. package/dist/esm/features/sections.js.map +1 -1
  83. package/dist/esm/features/tags.js +7 -2
  84. package/dist/esm/features/tags.js.map +1 -1
  85. package/dist/esm/index.d.ts +1 -1
  86. package/dist/esm/index.js.map +1 -1
  87. package/dist/esm/scan/pool.d.ts +1 -0
  88. package/dist/esm/scan/pool.js +2 -1
  89. package/dist/esm/scan/pool.js.map +1 -1
  90. package/dist/esm/scan/reparse.d.ts +1 -0
  91. package/dist/esm/scan/reparse.js +5 -2
  92. package/dist/esm/scan/reparse.js.map +1 -1
  93. package/dist/esm/store/builder.d.ts +2 -0
  94. package/dist/esm/store/builder.js.map +1 -1
  95. package/dist/esm/store/duckdb/connection.js +35 -0
  96. package/dist/esm/store/duckdb/connection.js.map +1 -1
  97. package/dist/esm/store/duckdb/reconcile.js +12 -37
  98. package/dist/esm/store/duckdb/reconcile.js.map +1 -1
  99. package/dist/esm/store/index.d.ts +1 -5
  100. package/dist/esm/store/index.js +6 -28
  101. package/dist/esm/store/index.js.map +1 -1
  102. package/dist/esm/store/lock-wait.d.ts +2 -0
  103. package/dist/esm/store/lock-wait.js +36 -0
  104. package/dist/esm/store/lock-wait.js.map +1 -0
  105. package/dist/esm/store/open.d.ts +2 -4
  106. package/dist/esm/store/open.js +17 -32
  107. package/dist/esm/store/open.js.map +1 -1
  108. package/dist/esm/store/reconcile.d.ts +2 -0
  109. package/dist/esm/store/reconcile.js +71 -44
  110. package/dist/esm/store/reconcile.js.map +1 -1
  111. package/dist/esm/store/shared.d.ts +1 -0
  112. package/dist/esm/store/shared.js +8 -0
  113. package/dist/esm/store/shared.js.map +1 -1
  114. package/dist/esm/store/sqlite/lexical.js +1 -1
  115. package/dist/esm/store/sqlite/lexical.js.map +1 -1
  116. package/dist/esm/store/sqlite/store.js +0 -1
  117. package/dist/esm/store/sqlite/store.js.map +1 -1
  118. package/dist/esm/store/stages.d.ts +18 -0
  119. package/dist/esm/store/stages.js +63 -0
  120. package/dist/esm/store/stages.js.map +1 -0
  121. package/dist/esm/store/turso/store.js +1 -1
  122. package/dist/esm/store/turso/store.js.map +1 -1
  123. package/dist/esm/store/types.d.ts +2 -2
  124. package/dist/esm/store/types.js +0 -1
  125. package/dist/esm/store/types.js.map +1 -1
  126. package/dist/esm/text/segment.js +7 -5
  127. package/dist/esm/text/segment.js.map +1 -1
  128. package/dist/esm/watch.js +63 -38
  129. package/dist/esm/watch.js.map +1 -1
  130. package/dist/esm/workers/parse.d.ts +1 -0
  131. package/dist/esm/workers/parse.js +4 -1
  132. package/dist/esm/workers/parse.js.map +1 -1
  133. package/package.json +1 -1
  134. package/skills/sense/SKILL.md +1 -1
  135. package/skills/sense-setup/SKILL.md +1 -1
@@ -20,7 +20,9 @@ var _indexts = require("../features/index.js");
20
20
  var _progressts = require("../output/progress.js");
21
21
  var _indexts1 = require("../scan/index.js");
22
22
  var _reparsets = require("../scan/reparse.js");
23
+ var _lockwaitts = require("./lock-wait.js");
23
24
  var _sharedts = require("./shared.js");
25
+ var _stagests = require("./stages.js");
24
26
  var _transactionts = require("./transaction.js");
25
27
  function _array_like_to_array(arr, len) {
26
28
  if (len == null || len > arr.length) len = arr.length;
@@ -203,23 +205,56 @@ var CORE_FRONTMATTER_COLUMNS = new Set([
203
205
  ]);
204
206
  function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
205
207
  return _async_to_generator(function() {
206
- 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, touched, txStart, durationMs;
208
+ var start, features, stages, elapsed, files, currentSet, existingRows, existing, vanished, toReparse, seenColumns, report, _ref, parsedDocs, warnings, newColumns, workerParseMs, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, col, allColumns, writableColumns, insertSql, added, delta, addedSet, reparsedExisting, touched, txStart, durationMs;
207
209
  return _ts_generator(this, function(_state) {
208
210
  switch(_state.label){
209
211
  case 0:
210
- files = (0, _indexts1.listFiles)(cfg, baseDir);
211
- currentSet = new Set(files.map(function(f) {
212
- return f.relPath;
212
+ start = process.hrtime.bigint();
213
+ features = (0, _indexts.activeFeatures)(cfg);
214
+ stages = (0, _stagests.stageRecorder)(features.map(function(f) {
215
+ return f.name;
213
216
  }));
217
+ elapsed = function elapsed() {
218
+ return Number(process.hrtime.bigint() - start) / 1e6;
219
+ };
214
220
  return [
215
221
  4,
216
- conn.prepare('SELECT "path", "_mtime", "_size" FROM frontmatter')
222
+ stages.time('list', function() {
223
+ return (0, _indexts1.listFiles)(cfg, baseDir);
224
+ })
217
225
  ];
218
226
  case 1:
219
- existingStmt = _state.sent();
227
+ files = _state.sent();
228
+ currentSet = new Set(files.map(function(f) {
229
+ return f.relPath;
230
+ }));
220
231
  return [
221
232
  4,
222
- existingStmt.all()
233
+ stages.time('existing', function() {
234
+ return _async_to_generator(function() {
235
+ var existingStmt;
236
+ return _ts_generator(this, function(_state) {
237
+ switch(_state.label){
238
+ case 0:
239
+ return [
240
+ 4,
241
+ conn.prepare('SELECT "path", "_mtime", "_size" FROM frontmatter')
242
+ ];
243
+ case 1:
244
+ existingStmt = _state.sent();
245
+ return [
246
+ 4,
247
+ existingStmt.all()
248
+ ];
249
+ case 2:
250
+ return [
251
+ 2,
252
+ _state.sent()
253
+ ];
254
+ }
255
+ });
256
+ })();
257
+ })
223
258
  ];
224
259
  case 2:
225
260
  existingRows = _state.sent();
@@ -248,10 +283,10 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
248
283
  2,
249
284
  {
250
285
  parsed: 0,
251
- warnings: []
286
+ warnings: [],
287
+ stages: stages.take(elapsed(), 0)
252
288
  }
253
289
  ];
254
- features = (0, _indexts.activeFeatures)(cfg);
255
290
  return [
256
291
  4,
257
292
  (0, _sharedts.getColumns)(conn)
@@ -263,12 +298,14 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
263
298
  report = (0, _progressts.progress)('reparsing files', toReparse.length);
264
299
  return [
265
300
  4,
266
- (0, _reparsets.reparseFiles)(toReparse, features, cfg, seenColumns, report.tick, {
267
- pool: pool
301
+ stages.time('parse', function() {
302
+ return (0, _reparsets.reparseFiles)(toReparse, features, cfg, seenColumns, report.tick, {
303
+ pool: pool
304
+ });
268
305
  })
269
306
  ];
270
307
  case 4:
271
- _ref = _state.sent(), parsedDocs = _ref.docs, warnings = _ref.warnings, newColumns = _ref.newColumns;
308
+ _ref = _state.sent(), parsedDocs = _ref.docs, warnings = _ref.warnings, newColumns = _ref.newColumns, workerParseMs = _ref.workerParseMs;
272
309
  report.finish();
273
310
  _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
274
311
  try {
@@ -335,7 +372,7 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
335
372
  4,
336
373
  (0, _transactionts.withTransaction)(conn, function() {
337
374
  return _async_to_generator(function() {
338
- var _feature_remove, _feature_afterReconcile, present, missingColumns, contentTouched, currentPathsStmt, currentPaths, _, staleAdded, toRow, newDocs, updateDocs, presetRows, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator, _step, doc, _iterator1, _step1, presetName, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, feature, err, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _loop, _iterator3, _step3, err, _iteratorNormalCompletion4, _didIteratorError4, _iteratorError4, _iterator4, _step4, feature1, err;
375
+ var present, missingColumns, contentTouched, toRow, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _loop, _iterator, _step, err, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _loop1, _iterator1, _step1, err, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _loop2, _iterator2, _step2, err;
339
376
  return _ts_generator(this, function(_state) {
340
377
  switch(_state.label){
341
378
  case 0:
@@ -354,7 +391,9 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
354
391
  ];
355
392
  return [
356
393
  4,
357
- dialect.addColumns(conn, missingColumns)
394
+ stages.time('alter', function() {
395
+ return dialect.addColumns(conn, missingColumns);
396
+ })
358
397
  ];
359
398
  case 2:
360
399
  _state.sent();
@@ -368,35 +407,53 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
368
407
  contentTouched = touched;
369
408
  if (!(added.length > 0)) return [
370
409
  3,
371
- 6
410
+ 5
372
411
  ];
373
412
  return [
374
413
  4,
375
- conn.prepare('SELECT "path" FROM frontmatter')
414
+ stages.time('added-recheck', function() {
415
+ return _async_to_generator(function() {
416
+ var currentPathsStmt, currentPaths, _, staleAdded;
417
+ return _ts_generator(this, function(_state) {
418
+ switch(_state.label){
419
+ case 0:
420
+ return [
421
+ 4,
422
+ conn.prepare('SELECT "path" FROM frontmatter')
423
+ ];
424
+ case 1:
425
+ currentPathsStmt = _state.sent();
426
+ _ = Set.bind;
427
+ return [
428
+ 4,
429
+ currentPathsStmt.all()
430
+ ];
431
+ case 2:
432
+ currentPaths = new (_.apply(Set, [
433
+ void 0,
434
+ _state.sent().map(function(r) {
435
+ return r.path;
436
+ })
437
+ ]));
438
+ staleAdded = added.filter(function(p) {
439
+ return currentPaths.has(p);
440
+ });
441
+ return [
442
+ 2,
443
+ staleAdded.length > 0 ? _to_consumable_array(touched).concat(_to_consumable_array(staleAdded)) : touched
444
+ ];
445
+ }
446
+ });
447
+ })();
448
+ })
376
449
  ];
377
450
  case 4:
378
- currentPathsStmt = _state.sent();
379
- _ = Set.bind;
380
- return [
381
- 4,
382
- currentPathsStmt.all()
383
- ];
451
+ contentTouched = _state.sent();
452
+ _state.label = 5;
384
453
  case 5:
385
- currentPaths = new (_.apply(Set, [
386
- void 0,
387
- _state.sent().map(function(r) {
388
- return r.path;
389
- })
390
- ]));
391
- staleAdded = added.filter(function(p) {
392
- return currentPaths.has(p);
393
- });
394
- if (staleAdded.length > 0) contentTouched = _to_consumable_array(touched).concat(_to_consumable_array(staleAdded));
395
- _state.label = 6;
396
- case 6:
397
454
  if (!(parsedDocs.length > 0)) return [
398
455
  3,
399
- 13
456
+ 7
400
457
  ];
401
458
  toRow = function toRow(doc) {
402
459
  return writableColumns.map(function(col) {
@@ -410,223 +467,266 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
410
467
  return (_doc_data_col = doc.data[col]) !== null && _doc_data_col !== void 0 ? _doc_data_col : null;
411
468
  });
412
469
  };
413
- if (!dialect.insertNew) return [
414
- 3,
415
- 11
416
- ];
417
- newDocs = parsedDocs.filter(function(d) {
418
- return addedSet.has(d.relPath);
419
- });
420
- updateDocs = parsedDocs.filter(function(d) {
421
- return !addedSet.has(d.relPath);
422
- });
423
- if (!(newDocs.length > 0)) return [
424
- 3,
425
- 8
426
- ];
470
+ // A path in `added` has no existing frontmatter row, so it can never conflict; the rest
471
+ // genuinely can, and keep the upsert.
427
472
  return [
428
473
  4,
429
- dialect.insertNew(conn, 'frontmatter', writableColumns, newDocs.map(toRow))
430
- ];
431
- case 7:
432
- _state.sent();
433
- _state.label = 8;
434
- case 8:
435
- if (!(updateDocs.length > 0)) return [
436
- 3,
437
- 10
438
- ];
439
- return [
440
- 4,
441
- conn.runBatch(insertSql, updateDocs.map(toRow))
442
- ];
443
- case 9:
444
- _state.sent();
445
- _state.label = 10;
446
- case 10:
447
- return [
448
- 3,
449
- 13
450
- ];
451
- case 11:
452
- return [
453
- 4,
454
- conn.runBatch(insertSql, parsedDocs.map(toRow))
474
+ stages.time('fm-upsert', function() {
475
+ return _async_to_generator(function() {
476
+ var newDocs, updateDocs;
477
+ return _ts_generator(this, function(_state) {
478
+ switch(_state.label){
479
+ case 0:
480
+ newDocs = parsedDocs.filter(function(d) {
481
+ return addedSet.has(d.relPath);
482
+ });
483
+ updateDocs = parsedDocs.filter(function(d) {
484
+ return !addedSet.has(d.relPath);
485
+ });
486
+ return [
487
+ 4,
488
+ (0, _sharedts.appendRows)(conn, 'frontmatter', writableColumns, insertSql, newDocs.map(toRow))
489
+ ];
490
+ case 1:
491
+ _state.sent();
492
+ if (!(updateDocs.length > 0)) return [
493
+ 3,
494
+ 3
495
+ ];
496
+ return [
497
+ 4,
498
+ conn.runBatch(insertSql, updateDocs.map(toRow))
499
+ ];
500
+ case 2:
501
+ _state.sent();
502
+ _state.label = 3;
503
+ case 3:
504
+ return [
505
+ 2
506
+ ];
507
+ }
508
+ });
509
+ })();
510
+ })
455
511
  ];
456
- case 12:
512
+ case 6:
457
513
  _state.sent();
458
- _state.label = 13;
459
- case 13:
514
+ _state.label = 7;
515
+ case 7:
460
516
  // After the upsert, so every doc already has the frontmatter row sqlite's content rowid
461
517
  // couples to. ON CONFLICT DO UPDATE preserves that rowid, so a reparse keeps its identity.
462
518
  return [
463
519
  4,
464
- dialect.reconcileContent(conn, contentTouched, parsedDocs, delta, cfg)
520
+ stages.time('text-index', function() {
521
+ return dialect.reconcileContent(conn, contentTouched, parsedDocs, delta, cfg);
522
+ })
465
523
  ];
466
- case 14:
524
+ case 8:
467
525
  _state.sent();
468
- if (!(touched.length > 0)) return [
469
- 3,
470
- 16
471
- ];
526
+ // A preset edit forces a full rebuild, so an unchanged doc's coverage is already correct;
527
+ // new docs have nothing to clear, which keeps cold builds linear.
472
528
  return [
473
529
  4,
474
- conn.runBatch('DELETE FROM preset_files WHERE "path" = ?', touched.map(function(p) {
475
- return [
476
- p
477
- ];
478
- }))
479
- ];
480
- case 15:
481
- _state.sent();
482
- _state.label = 16;
483
- case 16:
484
- presetRows = [];
485
- _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined, _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
486
- try {
487
- for(_iterator = parsedDocs[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step = _iterator.next()).done); _iteratorNormalCompletion1 = true){
488
- doc = _step.value;
489
- try {
490
- for(_iterator1 = doc.presets[Symbol.iterator](); !(_iteratorNormalCompletion = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion = true){
491
- presetName = _step1.value;
492
- presetRows.push([
493
- doc.relPath,
494
- presetName
495
- ]);
496
- }
497
- } catch (err) {
498
- _didIteratorError = true;
499
- _iteratorError = err;
500
- } finally{
501
- try {
502
- if (!_iteratorNormalCompletion && _iterator1.return != null) {
503
- _iterator1.return();
530
+ stages.time('presets', function() {
531
+ return _async_to_generator(function() {
532
+ var presetRows, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator, _step, doc, _iterator1, _step1, presetName;
533
+ return _ts_generator(this, function(_state) {
534
+ switch(_state.label){
535
+ case 0:
536
+ if (!(touched.length > 0)) return [
537
+ 3,
538
+ 2
539
+ ];
540
+ return [
541
+ 4,
542
+ conn.runBatch('DELETE FROM preset_files WHERE "path" = ?', touched.map(function(p) {
543
+ return [
544
+ p
545
+ ];
546
+ }))
547
+ ];
548
+ case 1:
549
+ _state.sent();
550
+ _state.label = 2;
551
+ case 2:
552
+ presetRows = [];
553
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined, _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
554
+ try {
555
+ for(_iterator = parsedDocs[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step = _iterator.next()).done); _iteratorNormalCompletion1 = true){
556
+ doc = _step.value;
557
+ try {
558
+ for(_iterator1 = doc.presets[Symbol.iterator](); !(_iteratorNormalCompletion = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion = true){
559
+ presetName = _step1.value;
560
+ presetRows.push([
561
+ doc.relPath,
562
+ presetName
563
+ ]);
564
+ }
565
+ } catch (err) {
566
+ _didIteratorError = true;
567
+ _iteratorError = err;
568
+ } finally{
569
+ try {
570
+ if (!_iteratorNormalCompletion && _iterator1.return != null) {
571
+ _iterator1.return();
572
+ }
573
+ } finally{
574
+ if (_didIteratorError) {
575
+ throw _iteratorError;
576
+ }
577
+ }
578
+ }
579
+ }
580
+ } catch (err) {
581
+ _didIteratorError1 = true;
582
+ _iteratorError1 = err;
583
+ } finally{
584
+ try {
585
+ if (!_iteratorNormalCompletion1 && _iterator.return != null) {
586
+ _iterator.return();
587
+ }
588
+ } finally{
589
+ if (_didIteratorError1) {
590
+ throw _iteratorError1;
591
+ }
592
+ }
593
+ }
594
+ // DO NOTHING, not a bare INSERT: the added/touched split above comes from a read taken
595
+ // before this transaction's lock, so a path this process calls "added" can already have
596
+ // its (path, preset) row committed by a concurrent reconcile -- the row would be identical either way.
597
+ return [
598
+ 4,
599
+ (0, _sharedts.appendRows)(conn, 'preset_files', [
600
+ 'path',
601
+ 'preset'
602
+ ], 'INSERT INTO preset_files ("path", preset) VALUES (?, ?) ON CONFLICT("path", preset) DO NOTHING', presetRows)
603
+ ];
604
+ case 3:
605
+ _state.sent();
606
+ return [
607
+ 2
608
+ ];
504
609
  }
505
- } finally{
506
- if (_didIteratorError) {
507
- throw _iteratorError;
508
- }
509
- }
510
- }
511
- }
512
- } catch (err) {
513
- _didIteratorError1 = true;
514
- _iteratorError1 = err;
515
- } finally{
516
- try {
517
- if (!_iteratorNormalCompletion1 && _iterator.return != null) {
518
- _iterator.return();
519
- }
520
- } finally{
521
- if (_didIteratorError1) {
522
- throw _iteratorError1;
523
- }
524
- }
525
- }
526
- if (!(presetRows.length > 0)) return [
527
- 3,
528
- 18
529
- ];
530
- return [
531
- 4,
532
- conn.runBatch('INSERT INTO preset_files ("path", preset) VALUES (?, ?) ON CONFLICT("path", preset) DO NOTHING', presetRows)
610
+ });
611
+ })();
612
+ })
533
613
  ];
534
- case 17:
614
+ case 9:
535
615
  _state.sent();
536
- _state.label = 18;
537
- case 18:
538
616
  if (!(vanished.length > 0)) return [
539
617
  3,
540
- 20
618
+ 11
541
619
  ];
542
620
  return [
543
621
  4,
544
- conn.runBatch('DELETE FROM frontmatter WHERE "path" = ?', vanished.map(function(p) {
545
- return [
546
- p
547
- ];
548
- }))
622
+ stages.time('vanished', function() {
623
+ return conn.runBatch('DELETE FROM frontmatter WHERE "path" = ?', vanished.map(function(p) {
624
+ return [
625
+ p
626
+ ];
627
+ }));
628
+ })
549
629
  ];
550
- case 19:
630
+ case 10:
551
631
  _state.sent();
552
- _state.label = 20;
553
- case 20:
554
- _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
632
+ _state.label = 11;
633
+ case 11:
634
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
555
635
  if (!(touched.length > 0)) return [
556
636
  3,
557
- 28
637
+ 19
558
638
  ];
559
- _state.label = 21;
560
- case 21:
639
+ _state.label = 12;
640
+ case 12:
561
641
  _state.trys.push([
562
- 21,
563
- 26,
564
- 27,
565
- 28
642
+ 12,
643
+ 17,
644
+ 18,
645
+ 19
566
646
  ]);
567
- _iterator2 = features[Symbol.iterator]();
568
- _state.label = 22;
569
- case 22:
570
- if (!!(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done)) return [
647
+ _loop = function() {
648
+ var feature;
649
+ return _ts_generator(this, function(_state) {
650
+ switch(_state.label){
651
+ case 0:
652
+ feature = _step.value;
653
+ return [
654
+ 4,
655
+ stages.time((0, _stagests.featureStage)(feature.name, 'remove'), function() {
656
+ var _feature_remove;
657
+ return (_feature_remove = feature.remove) === null || _feature_remove === void 0 ? void 0 : _feature_remove.call(feature, conn, touched, delta);
658
+ })
659
+ ];
660
+ case 1:
661
+ _state.sent();
662
+ return [
663
+ 2
664
+ ];
665
+ }
666
+ });
667
+ };
668
+ _iterator = features[Symbol.iterator]();
669
+ _state.label = 13;
670
+ case 13:
671
+ if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
571
672
  3,
572
- 25
673
+ 16
573
674
  ];
574
- feature = _step2.value;
575
675
  return [
576
- 4,
577
- (_feature_remove = feature.remove) === null || _feature_remove === void 0 ? void 0 : _feature_remove.call(feature, conn, touched, delta)
676
+ 5,
677
+ _ts_values(_loop())
578
678
  ];
579
- case 23:
679
+ case 14:
580
680
  _state.sent();
581
- _state.label = 24;
582
- case 24:
583
- _iteratorNormalCompletion2 = true;
681
+ _state.label = 15;
682
+ case 15:
683
+ _iteratorNormalCompletion = true;
584
684
  return [
585
685
  3,
586
- 22
686
+ 13
587
687
  ];
588
- case 25:
688
+ case 16:
589
689
  return [
590
690
  3,
591
- 28
691
+ 19
592
692
  ];
593
- case 26:
693
+ case 17:
594
694
  err = _state.sent();
595
- _didIteratorError2 = true;
596
- _iteratorError2 = err;
695
+ _didIteratorError = true;
696
+ _iteratorError = err;
597
697
  return [
598
698
  3,
599
- 28
699
+ 19
600
700
  ];
601
- case 27:
701
+ case 18:
602
702
  try {
603
- if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
604
- _iterator2.return();
703
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
704
+ _iterator.return();
605
705
  }
606
706
  } finally{
607
- if (_didIteratorError2) {
608
- throw _iteratorError2;
707
+ if (_didIteratorError) {
708
+ throw _iteratorError;
609
709
  }
610
710
  }
611
711
  return [
612
712
  7
613
713
  ];
614
- case 28:
615
- _iteratorNormalCompletion3 = true, _didIteratorError3 = false, _iteratorError3 = undefined;
616
- _state.label = 29;
617
- case 29:
714
+ case 19:
715
+ _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
716
+ _state.label = 20;
717
+ case 20:
618
718
  _state.trys.push([
619
- 29,
620
- 34,
621
- 35,
622
- 36
719
+ 20,
720
+ 25,
721
+ 26,
722
+ 27
623
723
  ]);
624
- _loop = function() {
625
- var feature, _feature_store, docsForFeature;
724
+ _loop1 = function() {
725
+ var feature, docsForFeature;
626
726
  return _ts_generator(this, function(_state) {
627
727
  switch(_state.label){
628
728
  case 0:
629
- feature = _step3.value;
729
+ feature = _step1.value;
630
730
  docsForFeature = parsedDocs.map(function(doc) {
631
731
  return {
632
732
  path: doc.relPath,
@@ -635,7 +735,10 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
635
735
  });
636
736
  return [
637
737
  4,
638
- (_feature_store = feature.store) === null || _feature_store === void 0 ? void 0 : _feature_store.call(feature, conn, docsForFeature, delta)
738
+ stages.time((0, _stagests.featureStage)(feature.name, 'store'), function() {
739
+ var _feature_store;
740
+ return (_feature_store = feature.store) === null || _feature_store === void 0 ? void 0 : _feature_store.call(feature, conn, docsForFeature, delta);
741
+ })
639
742
  ];
640
743
  case 1:
641
744
  _state.sent();
@@ -645,110 +748,130 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
645
748
  }
646
749
  });
647
750
  };
648
- _iterator3 = features[Symbol.iterator]();
649
- _state.label = 30;
650
- case 30:
651
- if (!!(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done)) return [
751
+ _iterator1 = features[Symbol.iterator]();
752
+ _state.label = 21;
753
+ case 21:
754
+ if (!!(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done)) return [
652
755
  3,
653
- 33
756
+ 24
654
757
  ];
655
758
  return [
656
759
  5,
657
- _ts_values(_loop())
760
+ _ts_values(_loop1())
658
761
  ];
659
- case 31:
762
+ case 22:
660
763
  _state.sent();
661
- _state.label = 32;
662
- case 32:
663
- _iteratorNormalCompletion3 = true;
764
+ _state.label = 23;
765
+ case 23:
766
+ _iteratorNormalCompletion1 = true;
664
767
  return [
665
768
  3,
666
- 30
769
+ 21
667
770
  ];
668
- case 33:
771
+ case 24:
669
772
  return [
670
773
  3,
671
- 36
774
+ 27
672
775
  ];
673
- case 34:
776
+ case 25:
674
777
  err = _state.sent();
675
- _didIteratorError3 = true;
676
- _iteratorError3 = err;
778
+ _didIteratorError1 = true;
779
+ _iteratorError1 = err;
677
780
  return [
678
781
  3,
679
- 36
782
+ 27
680
783
  ];
681
- case 35:
784
+ case 26:
682
785
  try {
683
- if (!_iteratorNormalCompletion3 && _iterator3.return != null) {
684
- _iterator3.return();
786
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
787
+ _iterator1.return();
685
788
  }
686
789
  } finally{
687
- if (_didIteratorError3) {
688
- throw _iteratorError3;
790
+ if (_didIteratorError1) {
791
+ throw _iteratorError1;
689
792
  }
690
793
  }
691
794
  return [
692
795
  7
693
796
  ];
694
- case 36:
695
- _iteratorNormalCompletion4 = true, _didIteratorError4 = false, _iteratorError4 = undefined;
696
- _state.label = 37;
697
- case 37:
797
+ case 27:
798
+ _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
799
+ _state.label = 28;
800
+ case 28:
698
801
  _state.trys.push([
699
- 37,
700
- 42,
701
- 43,
702
- 44
802
+ 28,
803
+ 33,
804
+ 34,
805
+ 35
703
806
  ]);
704
- _iterator4 = features[Symbol.iterator]();
705
- _state.label = 38;
706
- case 38:
707
- if (!!(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done)) return [
807
+ _loop2 = function() {
808
+ var feature;
809
+ return _ts_generator(this, function(_state) {
810
+ switch(_state.label){
811
+ case 0:
812
+ feature = _step2.value;
813
+ return [
814
+ 4,
815
+ stages.time((0, _stagests.featureStage)(feature.name, 'after'), function() {
816
+ var _feature_afterReconcile;
817
+ return (_feature_afterReconcile = feature.afterReconcile) === null || _feature_afterReconcile === void 0 ? void 0 : _feature_afterReconcile.call(feature, conn, delta);
818
+ })
819
+ ];
820
+ case 1:
821
+ _state.sent();
822
+ return [
823
+ 2
824
+ ];
825
+ }
826
+ });
827
+ };
828
+ _iterator2 = features[Symbol.iterator]();
829
+ _state.label = 29;
830
+ case 29:
831
+ if (!!(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done)) return [
708
832
  3,
709
- 41
833
+ 32
710
834
  ];
711
- feature1 = _step4.value;
712
835
  return [
713
- 4,
714
- (_feature_afterReconcile = feature1.afterReconcile) === null || _feature_afterReconcile === void 0 ? void 0 : _feature_afterReconcile.call(feature1, conn, delta)
836
+ 5,
837
+ _ts_values(_loop2())
715
838
  ];
716
- case 39:
839
+ case 30:
717
840
  _state.sent();
718
- _state.label = 40;
719
- case 40:
720
- _iteratorNormalCompletion4 = true;
841
+ _state.label = 31;
842
+ case 31:
843
+ _iteratorNormalCompletion2 = true;
721
844
  return [
722
845
  3,
723
- 38
846
+ 29
724
847
  ];
725
- case 41:
848
+ case 32:
726
849
  return [
727
850
  3,
728
- 44
851
+ 35
729
852
  ];
730
- case 42:
853
+ case 33:
731
854
  err = _state.sent();
732
- _didIteratorError4 = true;
733
- _iteratorError4 = err;
855
+ _didIteratorError2 = true;
856
+ _iteratorError2 = err;
734
857
  return [
735
858
  3,
736
- 44
859
+ 35
737
860
  ];
738
- case 43:
861
+ case 34:
739
862
  try {
740
- if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
741
- _iterator4.return();
863
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
864
+ _iterator2.return();
742
865
  }
743
866
  } finally{
744
- if (_didIteratorError4) {
745
- throw _iteratorError4;
867
+ if (_didIteratorError2) {
868
+ throw _iteratorError2;
746
869
  }
747
870
  }
748
871
  return [
749
872
  7
750
873
  ];
751
- case 44:
874
+ case 35:
752
875
  return [
753
876
  2
754
877
  ];
@@ -760,13 +883,18 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
760
883
  case 5:
761
884
  _state.sent();
762
885
  durationMs = Date.now() - txStart;
886
+ // Every store, not just the ones with a PRAGMA to derive: connectUnlocked's lock-wait budget needs it too.
887
+ (0, _lockwaitts.recordLockWaitMs)(baseDir, durationMs);
763
888
  if (!dialect.recordDuration) return [
764
889
  3,
765
890
  7
766
891
  ];
767
892
  return [
768
893
  4,
769
- dialect.recordDuration(conn, durationMs)
894
+ stages.time('meta', function() {
895
+ var _dialect_recordDuration;
896
+ return (_dialect_recordDuration = dialect.recordDuration) === null || _dialect_recordDuration === void 0 ? void 0 : _dialect_recordDuration.call(dialect, conn, durationMs);
897
+ })
770
898
  ];
771
899
  case 6:
772
900
  _state.sent();
@@ -776,7 +904,8 @@ function reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths) {
776
904
  2,
777
905
  {
778
906
  parsed: parsedDocs.length,
779
- warnings: warnings
907
+ warnings: warnings,
908
+ stages: stages.take(elapsed(), durationMs, workerParseMs)
780
909
  }
781
910
  ];
782
911
  }