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.
- package/dist/cjs/chunk/extract.d.cts +1 -0
- package/dist/cjs/chunk/extract.d.ts +1 -0
- package/dist/cjs/chunk/extract.js +23 -5
- package/dist/cjs/chunk/extract.js.map +1 -1
- package/dist/cjs/chunk/index.d.cts +1 -1
- package/dist/cjs/chunk/index.d.ts +1 -1
- package/dist/cjs/chunk/index.js +3 -0
- package/dist/cjs/chunk/index.js.map +1 -1
- package/dist/cjs/scan/pool.d.cts +15 -0
- package/dist/cjs/scan/pool.d.ts +15 -0
- package/dist/cjs/scan/pool.js +263 -0
- package/dist/cjs/scan/pool.js.map +1 -0
- package/dist/cjs/scan/reparse.d.cts +2 -0
- package/dist/cjs/scan/reparse.d.ts +2 -0
- package/dist/cjs/scan/reparse.js +15 -76
- package/dist/cjs/scan/reparse.js.map +1 -1
- package/dist/cjs/store/builder.d.cts +11 -0
- package/dist/cjs/store/builder.d.ts +11 -0
- package/dist/cjs/store/builder.js +27 -0
- package/dist/cjs/store/builder.js.map +1 -0
- package/dist/cjs/store/duckdb/lexical.d.cts +1 -0
- package/dist/cjs/store/duckdb/lexical.d.ts +1 -0
- package/dist/cjs/store/duckdb/lexical.js +21 -5
- package/dist/cjs/store/duckdb/lexical.js.map +1 -1
- package/dist/cjs/store/duckdb/open.d.cts +9 -8
- package/dist/cjs/store/duckdb/open.d.ts +9 -8
- package/dist/cjs/store/duckdb/open.js +70 -122
- package/dist/cjs/store/duckdb/open.js.map +1 -1
- package/dist/cjs/store/duckdb/reconcile.js +4 -0
- package/dist/cjs/store/duckdb/reconcile.js.map +1 -1
- package/dist/cjs/store/duckdb/store.d.cts +1 -2
- package/dist/cjs/store/duckdb/store.d.ts +1 -2
- package/dist/cjs/store/duckdb/store.js +1 -26
- package/dist/cjs/store/duckdb/store.js.map +1 -1
- package/dist/cjs/store/index.d.cts +8 -3
- package/dist/cjs/store/index.d.ts +8 -3
- package/dist/cjs/store/index.js +36 -7
- package/dist/cjs/store/index.js.map +1 -1
- package/dist/cjs/store/open.d.cts +15 -0
- package/dist/cjs/store/open.d.ts +15 -0
- package/dist/cjs/store/open.js +516 -0
- package/dist/cjs/store/open.js.map +1 -0
- package/dist/cjs/store/reconcile.d.cts +2 -1
- package/dist/cjs/store/reconcile.d.ts +2 -1
- package/dist/cjs/store/reconcile.js +4 -2
- package/dist/cjs/store/reconcile.js.map +1 -1
- package/dist/cjs/store/{sqlite/signature.d.cts → signature.d.cts} +0 -3
- package/dist/cjs/store/{sqlite/signature.d.ts → signature.d.ts} +0 -3
- package/dist/cjs/store/signature.js +162 -0
- package/dist/cjs/store/signature.js.map +1 -0
- package/dist/cjs/store/sqlite/open.d.cts +9 -9
- package/dist/cjs/store/sqlite/open.d.ts +9 -9
- package/dist/cjs/store/sqlite/open.js +189 -201
- package/dist/cjs/store/sqlite/open.js.map +1 -1
- package/dist/cjs/store/sqlite/store.d.cts +1 -1
- package/dist/cjs/store/sqlite/store.d.ts +1 -1
- package/dist/cjs/store/sqlite/store.js +1 -13
- package/dist/cjs/store/sqlite/store.js.map +1 -1
- package/dist/cjs/store/turso/open.d.cts +6 -11
- package/dist/cjs/store/turso/open.d.ts +6 -11
- package/dist/cjs/store/turso/open.js +79 -171
- package/dist/cjs/store/turso/open.js.map +1 -1
- package/dist/cjs/store/turso/reconcile.d.cts +2 -0
- package/dist/cjs/store/turso/reconcile.d.ts +2 -0
- package/dist/cjs/store/turso/reconcile.js +16 -5
- package/dist/cjs/store/turso/reconcile.js.map +1 -1
- package/dist/cjs/store/turso/store.d.cts +1 -2
- package/dist/cjs/store/turso/store.d.ts +1 -2
- package/dist/cjs/store/turso/store.js +1 -13
- package/dist/cjs/store/turso/store.js.map +1 -1
- package/dist/cjs/store/types.d.cts +17 -5
- package/dist/cjs/store/types.d.ts +17 -5
- package/dist/cjs/store/types.js.map +1 -1
- package/dist/cjs/text/strip.js +3 -6
- package/dist/cjs/text/strip.js.map +1 -1
- package/dist/cjs/watch.js +28 -16
- package/dist/cjs/watch.js.map +1 -1
- package/dist/esm/chunk/extract.d.ts +1 -0
- package/dist/esm/chunk/extract.js +10 -2
- package/dist/esm/chunk/extract.js.map +1 -1
- package/dist/esm/chunk/index.d.ts +1 -1
- package/dist/esm/chunk/index.js +1 -1
- package/dist/esm/chunk/index.js.map +1 -1
- package/dist/esm/scan/pool.d.ts +15 -0
- package/dist/esm/scan/pool.js +77 -0
- package/dist/esm/scan/pool.js.map +1 -0
- package/dist/esm/scan/reparse.d.ts +2 -0
- package/dist/esm/scan/reparse.js +11 -58
- package/dist/esm/scan/reparse.js.map +1 -1
- package/dist/esm/store/builder.d.ts +11 -0
- package/dist/esm/store/builder.js +14 -0
- package/dist/esm/store/builder.js.map +1 -0
- package/dist/esm/store/duckdb/lexical.d.ts +1 -0
- package/dist/esm/store/duckdb/lexical.js +22 -9
- package/dist/esm/store/duckdb/lexical.js.map +1 -1
- package/dist/esm/store/duckdb/open.d.ts +9 -8
- package/dist/esm/store/duckdb/open.js +31 -57
- package/dist/esm/store/duckdb/open.js.map +1 -1
- package/dist/esm/store/duckdb/reconcile.js +4 -0
- package/dist/esm/store/duckdb/reconcile.js.map +1 -1
- package/dist/esm/store/duckdb/store.d.ts +1 -2
- package/dist/esm/store/duckdb/store.js +2 -11
- package/dist/esm/store/duckdb/store.js.map +1 -1
- package/dist/esm/store/index.d.ts +8 -3
- package/dist/esm/store/index.js +22 -7
- package/dist/esm/store/index.js.map +1 -1
- package/dist/esm/store/open.d.ts +15 -0
- package/dist/esm/store/open.js +137 -0
- package/dist/esm/store/open.js.map +1 -0
- package/dist/esm/store/reconcile.d.ts +2 -1
- package/dist/esm/store/reconcile.js +4 -2
- package/dist/esm/store/reconcile.js.map +1 -1
- package/dist/esm/store/{sqlite/signature.d.ts → signature.d.ts} +0 -3
- package/dist/esm/store/{sqlite/signature.js → signature.js} +3 -26
- package/dist/esm/store/signature.js.map +1 -0
- package/dist/esm/store/sqlite/open.d.ts +9 -9
- package/dist/esm/store/sqlite/open.js +81 -113
- package/dist/esm/store/sqlite/open.js.map +1 -1
- package/dist/esm/store/sqlite/store.d.ts +1 -1
- package/dist/esm/store/sqlite/store.js +2 -7
- package/dist/esm/store/sqlite/store.js.map +1 -1
- package/dist/esm/store/turso/open.d.ts +6 -11
- package/dist/esm/store/turso/open.js +30 -78
- package/dist/esm/store/turso/open.js.map +1 -1
- package/dist/esm/store/turso/reconcile.d.ts +2 -0
- package/dist/esm/store/turso/reconcile.js +12 -1
- package/dist/esm/store/turso/reconcile.js.map +1 -1
- package/dist/esm/store/turso/store.d.ts +1 -2
- package/dist/esm/store/turso/store.js +2 -7
- package/dist/esm/store/turso/store.js.map +1 -1
- package/dist/esm/store/types.d.ts +17 -5
- package/dist/esm/store/types.js.map +1 -1
- package/dist/esm/text/strip.js +3 -4
- package/dist/esm/text/strip.js.map +1 -1
- package/dist/esm/watch.js +5 -3
- package/dist/esm/watch.js.map +1 -1
- package/package.json +2 -2
- package/dist/cjs/store/sqlite/signature.js +0 -380
- package/dist/cjs/store/sqlite/signature.js.map +0 -1
- package/dist/esm/store/sqlite/signature.js.map +0 -1
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
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 docCount () {
|
|
13
|
+
return docCount;
|
|
14
|
+
},
|
|
15
|
+
get openWithBuilder () {
|
|
16
|
+
return openWithBuilder;
|
|
17
|
+
},
|
|
18
|
+
get openWithDialect () {
|
|
19
|
+
return openWithDialect;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
var _nodefs = require("node:fs");
|
|
23
|
+
var _nodepath = require("node:path");
|
|
24
|
+
var _indexts = require("../config/index.js");
|
|
25
|
+
var _handoffts = require("../embed/handoff.js");
|
|
26
|
+
var _indexts1 = require("../features/index.js");
|
|
27
|
+
var _builderts = require("./builder.js");
|
|
28
|
+
var _cachets = require("./cache.js");
|
|
29
|
+
var _sharedts = require("./shared.js");
|
|
30
|
+
var _signaturets = require("./signature.js");
|
|
31
|
+
function _array_like_to_array(arr, len) {
|
|
32
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
33
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
34
|
+
return arr2;
|
|
35
|
+
}
|
|
36
|
+
function _array_without_holes(arr) {
|
|
37
|
+
if (Array.isArray(arr)) return _array_like_to_array(arr);
|
|
38
|
+
}
|
|
39
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
40
|
+
try {
|
|
41
|
+
var info = gen[key](arg);
|
|
42
|
+
var value = info.value;
|
|
43
|
+
} catch (error) {
|
|
44
|
+
reject(error);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (info.done) resolve(value);
|
|
48
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
49
|
+
}
|
|
50
|
+
function _async_to_generator(fn) {
|
|
51
|
+
return function() {
|
|
52
|
+
var self = this, args = arguments;
|
|
53
|
+
return new Promise(function(resolve, reject) {
|
|
54
|
+
var gen = fn.apply(self, args);
|
|
55
|
+
function _next(value) {
|
|
56
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
57
|
+
}
|
|
58
|
+
function _throw(err) {
|
|
59
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
60
|
+
}
|
|
61
|
+
_next(undefined);
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function _iterable_to_array(iter) {
|
|
66
|
+
if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) {
|
|
67
|
+
return Array.from(iter);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function _non_iterable_spread() {
|
|
71
|
+
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
72
|
+
}
|
|
73
|
+
function _to_consumable_array(arr) {
|
|
74
|
+
return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
|
|
75
|
+
}
|
|
76
|
+
function _ts_generator(thisArg, body) {
|
|
77
|
+
var f, y, t, _ = {
|
|
78
|
+
label: 0,
|
|
79
|
+
sent: function() {
|
|
80
|
+
if (t[0] & 1) throw t[1];
|
|
81
|
+
return t[1];
|
|
82
|
+
},
|
|
83
|
+
trys: [],
|
|
84
|
+
ops: []
|
|
85
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
|
|
86
|
+
return d(g, "next", {
|
|
87
|
+
value: verb(0)
|
|
88
|
+
}), d(g, "throw", {
|
|
89
|
+
value: verb(1)
|
|
90
|
+
}), d(g, "return", {
|
|
91
|
+
value: verb(2)
|
|
92
|
+
}), typeof Symbol === "function" && d(g, Symbol.iterator, {
|
|
93
|
+
value: function() {
|
|
94
|
+
return this;
|
|
95
|
+
}
|
|
96
|
+
}), g;
|
|
97
|
+
function verb(n) {
|
|
98
|
+
return function(v) {
|
|
99
|
+
return step([
|
|
100
|
+
n,
|
|
101
|
+
v
|
|
102
|
+
]);
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function step(op) {
|
|
106
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
107
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
108
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
109
|
+
if (y = 0, t) op = [
|
|
110
|
+
op[0] & 2,
|
|
111
|
+
t.value
|
|
112
|
+
];
|
|
113
|
+
switch(op[0]){
|
|
114
|
+
case 0:
|
|
115
|
+
case 1:
|
|
116
|
+
t = op;
|
|
117
|
+
break;
|
|
118
|
+
case 4:
|
|
119
|
+
_.label++;
|
|
120
|
+
return {
|
|
121
|
+
value: op[1],
|
|
122
|
+
done: false
|
|
123
|
+
};
|
|
124
|
+
case 5:
|
|
125
|
+
_.label++;
|
|
126
|
+
y = op[1];
|
|
127
|
+
op = [
|
|
128
|
+
0
|
|
129
|
+
];
|
|
130
|
+
continue;
|
|
131
|
+
case 7:
|
|
132
|
+
op = _.ops.pop();
|
|
133
|
+
_.trys.pop();
|
|
134
|
+
continue;
|
|
135
|
+
default:
|
|
136
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
137
|
+
_ = 0;
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
141
|
+
_.label = op[1];
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
145
|
+
_.label = t[1];
|
|
146
|
+
t = op;
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
if (t && _.label < t[2]) {
|
|
150
|
+
_.label = t[2];
|
|
151
|
+
_.ops.push(op);
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
if (t[2]) _.ops.pop();
|
|
155
|
+
_.trys.pop();
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
op = body.call(thisArg, _);
|
|
159
|
+
} catch (e) {
|
|
160
|
+
op = [
|
|
161
|
+
6,
|
|
162
|
+
e
|
|
163
|
+
];
|
|
164
|
+
y = 0;
|
|
165
|
+
} finally{
|
|
166
|
+
f = t = 0;
|
|
167
|
+
}
|
|
168
|
+
if (op[0] & 5) throw op[1];
|
|
169
|
+
return {
|
|
170
|
+
value: op[0] ? op[1] : void 0,
|
|
171
|
+
done: true
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
176
|
+
if (!o) return;
|
|
177
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
178
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
179
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
180
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
181
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
182
|
+
}
|
|
183
|
+
function connectWithDialect(cfg, dialect, keepBuilderOpen) {
|
|
184
|
+
return _async_to_generator(function() {
|
|
185
|
+
var stateDir, dbPath, _ref, handle, conn, closed, builder, version, features, wantFeatures, tokenizeOnlyRebuild, changedKeys, _tmp, changed, extraReason, rebuildWarnings, _ref1, recordedMaxMs, _ref2, parsed, warnings, err;
|
|
186
|
+
return _ts_generator(this, function(_state) {
|
|
187
|
+
switch(_state.label){
|
|
188
|
+
case 0:
|
|
189
|
+
stateDir = (0, _nodepath.join)(cfg.baseDir, _indexts.STATE_DIR);
|
|
190
|
+
(0, _nodefs.mkdirSync)(stateDir, {
|
|
191
|
+
recursive: true
|
|
192
|
+
});
|
|
193
|
+
dbPath = (0, _nodepath.join)(stateDir, dialect.filename);
|
|
194
|
+
return [
|
|
195
|
+
4,
|
|
196
|
+
dialect.connect(dbPath, cfg)
|
|
197
|
+
];
|
|
198
|
+
case 1:
|
|
199
|
+
_ref = _state.sent(), handle = _ref.handle, conn = _ref.conn;
|
|
200
|
+
// A throw below must release this handle, or the leaked WAL makes the cache file undeletable on
|
|
201
|
+
// Windows. `closed` keeps the catch from double-closing a handle a rebuild branch already closed.
|
|
202
|
+
closed = false;
|
|
203
|
+
// Created here, not inside reconcile(): its pool must survive across every build() call this
|
|
204
|
+
// connection sees (a watcher's repeated ticks), not just the one below.
|
|
205
|
+
builder = (0, _builderts.createBuilder)(conn, cfg, cfg.baseDir, dialect.reconcileDialect);
|
|
206
|
+
_state.label = 2;
|
|
207
|
+
case 2:
|
|
208
|
+
_state.trys.push([
|
|
209
|
+
2,
|
|
210
|
+
26,
|
|
211
|
+
,
|
|
212
|
+
30
|
|
213
|
+
]);
|
|
214
|
+
return [
|
|
215
|
+
4,
|
|
216
|
+
conn.exec('CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT)')
|
|
217
|
+
];
|
|
218
|
+
case 3:
|
|
219
|
+
_state.sent();
|
|
220
|
+
return [
|
|
221
|
+
4,
|
|
222
|
+
(0, _sharedts.getMeta)(conn, 'schema_version')
|
|
223
|
+
];
|
|
224
|
+
case 4:
|
|
225
|
+
version = _state.sent();
|
|
226
|
+
return [
|
|
227
|
+
4,
|
|
228
|
+
(0, _sharedts.getMeta)(conn, 'features')
|
|
229
|
+
];
|
|
230
|
+
case 5:
|
|
231
|
+
features = _state.sent();
|
|
232
|
+
wantFeatures = (0, _indexts.featureSignature)(cfg, _indexts1.FEATURES);
|
|
233
|
+
tokenizeOnlyRebuild = false;
|
|
234
|
+
if (!(version !== null && version !== dialect.schemaVersion || features !== null && features !== wantFeatures)) return [
|
|
235
|
+
3,
|
|
236
|
+
14
|
|
237
|
+
];
|
|
238
|
+
if (!(version !== null && version !== dialect.schemaVersion)) return [
|
|
239
|
+
3,
|
|
240
|
+
7
|
|
241
|
+
];
|
|
242
|
+
console.error('sense: cache format changed (new sensemaking version); rebuilding the index');
|
|
243
|
+
// Close before clearCache deletes the files out from under the still-open handle.
|
|
244
|
+
closed = true;
|
|
245
|
+
return [
|
|
246
|
+
4,
|
|
247
|
+
dialect.close(handle)
|
|
248
|
+
];
|
|
249
|
+
case 6:
|
|
250
|
+
_state.sent();
|
|
251
|
+
(0, _cachets.clearCache)(cfg);
|
|
252
|
+
return [
|
|
253
|
+
2,
|
|
254
|
+
connectWithDialect(cfg, dialect, keepBuilderOpen)
|
|
255
|
+
];
|
|
256
|
+
case 7:
|
|
257
|
+
changedKeys = (0, _signaturets.changedSignatureKeys)(features !== null && features !== void 0 ? features : '', wantFeatures);
|
|
258
|
+
_tmp = dialect.partialRebuild;
|
|
259
|
+
if (!_tmp) return [
|
|
260
|
+
3,
|
|
261
|
+
9
|
|
262
|
+
];
|
|
263
|
+
return [
|
|
264
|
+
4,
|
|
265
|
+
dialect.partialRebuild(handle, conn, cfg, changedKeys)
|
|
266
|
+
];
|
|
267
|
+
case 8:
|
|
268
|
+
_tmp = _state.sent();
|
|
269
|
+
_state.label = 9;
|
|
270
|
+
case 9:
|
|
271
|
+
if (!_tmp) return [
|
|
272
|
+
3,
|
|
273
|
+
10
|
|
274
|
+
];
|
|
275
|
+
tokenizeOnlyRebuild = true;
|
|
276
|
+
return [
|
|
277
|
+
3,
|
|
278
|
+
14
|
|
279
|
+
];
|
|
280
|
+
case 10:
|
|
281
|
+
if (!(changedKeys.size === 1 && changedKeys.has('embed') && (0, _signaturets.embedIdentityAdopted)(features !== null && features !== void 0 ? features : '', wantFeatures))) return [
|
|
282
|
+
3,
|
|
283
|
+
12
|
|
284
|
+
];
|
|
285
|
+
// First sight of a resolved weight identity: the model itself hasn't changed, so
|
|
286
|
+
// adopt it into meta with no rebuild and no re-embed, mirroring the tokenize precedent.
|
|
287
|
+
console.error("sense: recorded the embedding model's resolved identity; vectors are unaffected");
|
|
288
|
+
return [
|
|
289
|
+
4,
|
|
290
|
+
(0, _sharedts.setMeta)(conn, 'features', wantFeatures)
|
|
291
|
+
];
|
|
292
|
+
case 11:
|
|
293
|
+
_state.sent();
|
|
294
|
+
return [
|
|
295
|
+
3,
|
|
296
|
+
14
|
|
297
|
+
];
|
|
298
|
+
case 12:
|
|
299
|
+
changed = (0, _signaturets.signatureDiff)(features !== null && features !== void 0 ? features : '', wantFeatures);
|
|
300
|
+
console.error("sense: config change (".concat(changed, ") rebuilds the index"));
|
|
301
|
+
closed = true;
|
|
302
|
+
return [
|
|
303
|
+
4,
|
|
304
|
+
dialect.close(handle)
|
|
305
|
+
];
|
|
306
|
+
case 13:
|
|
307
|
+
_state.sent();
|
|
308
|
+
(0, _cachets.clearCache)(cfg);
|
|
309
|
+
return [
|
|
310
|
+
2,
|
|
311
|
+
connectWithDialect(cfg, dialect, keepBuilderOpen)
|
|
312
|
+
];
|
|
313
|
+
case 14:
|
|
314
|
+
// A rebuild trigger independent of the signature comparison above (sqlite: the content
|
|
315
|
+
// table's own DDL no longer matches the resolved tokenizer).
|
|
316
|
+
extraReason = dialect.extraRebuildReason ? dialect.extraRebuildReason(handle) : null;
|
|
317
|
+
if (!(extraReason !== null)) return [
|
|
318
|
+
3,
|
|
319
|
+
16
|
|
320
|
+
];
|
|
321
|
+
console.error("sense: ".concat(extraReason, "; rebuilding the index"));
|
|
322
|
+
closed = true;
|
|
323
|
+
return [
|
|
324
|
+
4,
|
|
325
|
+
dialect.close(handle)
|
|
326
|
+
];
|
|
327
|
+
case 15:
|
|
328
|
+
_state.sent();
|
|
329
|
+
(0, _cachets.clearCache)(cfg);
|
|
330
|
+
return [
|
|
331
|
+
2,
|
|
332
|
+
connectWithDialect(cfg, dialect, keepBuilderOpen)
|
|
333
|
+
];
|
|
334
|
+
case 16:
|
|
335
|
+
return [
|
|
336
|
+
4,
|
|
337
|
+
dialect.ensureSchema(handle, conn, cfg)
|
|
338
|
+
];
|
|
339
|
+
case 17:
|
|
340
|
+
_state.sent();
|
|
341
|
+
rebuildWarnings = [];
|
|
342
|
+
if (!(tokenizeOnlyRebuild && dialect.postSchemaRebuild)) return [
|
|
343
|
+
3,
|
|
344
|
+
19
|
|
345
|
+
];
|
|
346
|
+
return [
|
|
347
|
+
4,
|
|
348
|
+
dialect.postSchemaRebuild(handle, conn, cfg, cfg.baseDir, wantFeatures)
|
|
349
|
+
];
|
|
350
|
+
case 18:
|
|
351
|
+
rebuildWarnings = _state.sent();
|
|
352
|
+
_state.label = 19;
|
|
353
|
+
case 19:
|
|
354
|
+
if (!dialect.setDerivedBusyTimeout) return [
|
|
355
|
+
3,
|
|
356
|
+
22
|
|
357
|
+
];
|
|
358
|
+
return [
|
|
359
|
+
4,
|
|
360
|
+
(0, _sharedts.getMeta)(conn, 'reconcile_max_ms')
|
|
361
|
+
];
|
|
362
|
+
case 20:
|
|
363
|
+
recordedMaxMs = Number.apply(void 0, [
|
|
364
|
+
(_ref1 = _state.sent()) !== null && _ref1 !== void 0 ? _ref1 : '0'
|
|
365
|
+
]);
|
|
366
|
+
return [
|
|
367
|
+
4,
|
|
368
|
+
dialect.setDerivedBusyTimeout(handle, conn, Math.min(Math.max(30000, 3 * recordedMaxMs), 600000))
|
|
369
|
+
];
|
|
370
|
+
case 21:
|
|
371
|
+
_state.sent();
|
|
372
|
+
_state.label = 22;
|
|
373
|
+
case 22:
|
|
374
|
+
return [
|
|
375
|
+
4,
|
|
376
|
+
builder.build()
|
|
377
|
+
];
|
|
378
|
+
case 23:
|
|
379
|
+
_ref2 = _state.sent(), parsed = _ref2.parsed, warnings = _ref2.warnings;
|
|
380
|
+
if (!!keepBuilderOpen) return [
|
|
381
|
+
3,
|
|
382
|
+
25
|
|
383
|
+
];
|
|
384
|
+
return [
|
|
385
|
+
4,
|
|
386
|
+
builder.close()
|
|
387
|
+
];
|
|
388
|
+
case 24:
|
|
389
|
+
_state.sent();
|
|
390
|
+
_state.label = 25;
|
|
391
|
+
case 25:
|
|
392
|
+
return [
|
|
393
|
+
2,
|
|
394
|
+
{
|
|
395
|
+
handle: handle,
|
|
396
|
+
conn: conn,
|
|
397
|
+
cfg: cfg,
|
|
398
|
+
dbPath: dbPath,
|
|
399
|
+
parsed: parsed,
|
|
400
|
+
warnings: _to_consumable_array(rebuildWarnings).concat(_to_consumable_array(warnings)),
|
|
401
|
+
builder: builder
|
|
402
|
+
}
|
|
403
|
+
];
|
|
404
|
+
case 26:
|
|
405
|
+
err = _state.sent();
|
|
406
|
+
return [
|
|
407
|
+
4,
|
|
408
|
+
builder.close()
|
|
409
|
+
];
|
|
410
|
+
case 27:
|
|
411
|
+
_state.sent();
|
|
412
|
+
if (!!closed) return [
|
|
413
|
+
3,
|
|
414
|
+
29
|
|
415
|
+
];
|
|
416
|
+
return [
|
|
417
|
+
4,
|
|
418
|
+
dialect.close(handle)
|
|
419
|
+
];
|
|
420
|
+
case 28:
|
|
421
|
+
_state.sent();
|
|
422
|
+
_state.label = 29;
|
|
423
|
+
case 29:
|
|
424
|
+
throw err;
|
|
425
|
+
case 30:
|
|
426
|
+
return [
|
|
427
|
+
2
|
|
428
|
+
];
|
|
429
|
+
}
|
|
430
|
+
});
|
|
431
|
+
})();
|
|
432
|
+
}
|
|
433
|
+
function openWithDialect(cfg, dialect) {
|
|
434
|
+
return _async_to_generator(function() {
|
|
435
|
+
var _ref, handle, conn, resolvedCfg, dbPath, parsed, warnings, store;
|
|
436
|
+
return _ts_generator(this, function(_state) {
|
|
437
|
+
switch(_state.label){
|
|
438
|
+
case 0:
|
|
439
|
+
return [
|
|
440
|
+
4,
|
|
441
|
+
connectWithDialect(cfg, dialect, false)
|
|
442
|
+
];
|
|
443
|
+
case 1:
|
|
444
|
+
_ref = _state.sent(), handle = _ref.handle, conn = _ref.conn, resolvedCfg = _ref.cfg, dbPath = _ref.dbPath, parsed = _ref.parsed, warnings = _ref.warnings;
|
|
445
|
+
store = dialect.createStore(handle, conn, resolvedCfg);
|
|
446
|
+
// reconcile ran before this object existed, so its chunk text is keyed by the connection.
|
|
447
|
+
(0, _handoffts.rekeyChunkText)(conn, store);
|
|
448
|
+
return [
|
|
449
|
+
2,
|
|
450
|
+
{
|
|
451
|
+
store: store,
|
|
452
|
+
cfg: resolvedCfg,
|
|
453
|
+
dbPath: dbPath,
|
|
454
|
+
parsed: parsed,
|
|
455
|
+
warnings: warnings
|
|
456
|
+
}
|
|
457
|
+
];
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
})();
|
|
461
|
+
}
|
|
462
|
+
function openWithBuilder(cfg, dialect) {
|
|
463
|
+
return _async_to_generator(function() {
|
|
464
|
+
var _ref, handle, conn, resolvedCfg, dbPath, parsed, warnings, builder, store;
|
|
465
|
+
return _ts_generator(this, function(_state) {
|
|
466
|
+
switch(_state.label){
|
|
467
|
+
case 0:
|
|
468
|
+
return [
|
|
469
|
+
4,
|
|
470
|
+
connectWithDialect(cfg, dialect, true)
|
|
471
|
+
];
|
|
472
|
+
case 1:
|
|
473
|
+
_ref = _state.sent(), handle = _ref.handle, conn = _ref.conn, resolvedCfg = _ref.cfg, dbPath = _ref.dbPath, parsed = _ref.parsed, warnings = _ref.warnings, builder = _ref.builder;
|
|
474
|
+
store = dialect.createStore(handle, conn, resolvedCfg);
|
|
475
|
+
(0, _handoffts.rekeyChunkText)(conn, store);
|
|
476
|
+
return [
|
|
477
|
+
2,
|
|
478
|
+
{
|
|
479
|
+
store: store,
|
|
480
|
+
cfg: resolvedCfg,
|
|
481
|
+
dbPath: dbPath,
|
|
482
|
+
parsed: parsed,
|
|
483
|
+
warnings: warnings,
|
|
484
|
+
builder: builder
|
|
485
|
+
}
|
|
486
|
+
];
|
|
487
|
+
}
|
|
488
|
+
});
|
|
489
|
+
})();
|
|
490
|
+
}
|
|
491
|
+
function docCount(store) {
|
|
492
|
+
return _async_to_generator(function() {
|
|
493
|
+
var stmt;
|
|
494
|
+
return _ts_generator(this, function(_state) {
|
|
495
|
+
switch(_state.label){
|
|
496
|
+
case 0:
|
|
497
|
+
return [
|
|
498
|
+
4,
|
|
499
|
+
store.prepare('SELECT COUNT(*) AS n FROM frontmatter')
|
|
500
|
+
];
|
|
501
|
+
case 1:
|
|
502
|
+
stmt = _state.sent();
|
|
503
|
+
return [
|
|
504
|
+
4,
|
|
505
|
+
stmt.get()
|
|
506
|
+
];
|
|
507
|
+
case 2:
|
|
508
|
+
return [
|
|
509
|
+
2,
|
|
510
|
+
_state.sent().n
|
|
511
|
+
];
|
|
512
|
+
}
|
|
513
|
+
});
|
|
514
|
+
})();
|
|
515
|
+
}
|
|
516
|
+
/* 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; }
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/store/open.ts"],"sourcesContent":["import { mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { ResolvedConfig } from '../config/index.ts';\nimport { featureSignature, STATE_DIR } from '../config/index.ts';\nimport { rekeyChunkText } from '../embed/handoff.ts';\nimport { FEATURES } from '../features/index.ts';\nimport type { Builder } from './builder.ts';\nimport { createBuilder } from './builder.ts';\nimport { clearCache } from './cache.ts';\nimport { getMeta, setMeta } from './shared.ts';\nimport { changedSignatureKeys, embedIdentityAdopted, signatureDiff } from './signature.ts';\nimport type { Connection, OpenDialect, Store } from './types.ts';\n\n// One open algorithm shared by every store, parameterised by a per-engine OpenDialect (types.ts).\n// Ordering is universal, not a dialect concern: connect, meta table, schema-version and\n// feature-signature comparison (rebuild, adopt, or partial rebuild), any extra rebuild trigger,\n// ensureSchema, the derived busy_timeout PRAGMA, reconcile, then the store itself.\n\nexport interface OpenResult {\n store: Store;\n cfg: ResolvedConfig;\n dbPath: string;\n parsed: number;\n warnings: string[];\n}\n\ninterface ConnectResult<Handle> {\n handle: Handle;\n conn: Connection;\n cfg: ResolvedConfig;\n dbPath: string;\n parsed: number;\n warnings: string[];\n // Closed already unless `keepBuilderOpen` was set: a one-shot open reconciles once and is done\n // with it, a watcher keeps calling build() on the same instance across its whole run.\n builder: Builder;\n}\n\nasync function connectWithDialect<Handle>(cfg: ResolvedConfig, dialect: OpenDialect<Handle>, keepBuilderOpen: boolean): Promise<ConnectResult<Handle>> {\n const stateDir = join(cfg.baseDir, STATE_DIR);\n mkdirSync(stateDir, { recursive: true });\n const dbPath = join(stateDir, dialect.filename);\n\n const { handle, conn } = await dialect.connect(dbPath, cfg);\n // A throw below must release this handle, or the leaked WAL makes the cache file undeletable on\n // Windows. `closed` keeps the catch from double-closing a handle a rebuild branch already closed.\n let closed = false;\n // Created here, not inside reconcile(): its pool must survive across every build() call this\n // connection sees (a watcher's repeated ticks), not just the one below.\n const builder = createBuilder(conn, cfg, cfg.baseDir, dialect.reconcileDialect);\n try {\n await conn.exec('CREATE TABLE IF NOT EXISTS meta (key TEXT PRIMARY KEY, value TEXT)');\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 !== dialect.schemaVersion) || (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 !== dialect.schemaVersion) {\n console.error('sense: cache format changed (new sensemaking version); rebuilding the index');\n // Close before clearCache deletes the files out from under the still-open handle.\n closed = true;\n await dialect.close(handle);\n clearCache(cfg);\n return connectWithDialect(cfg, dialect, keepBuilderOpen);\n }\n const changedKeys = changedSignatureKeys(features ?? '', wantFeatures);\n // Only a dialect-owned carve-out (sqlite's tokenizer) skips the rebuild below with its own\n // partial DDL swap; every other single- or multi-segment change takes it.\n if (dialect.partialRebuild && (await dialect.partialRebuild(handle, conn, cfg, changedKeys))) {\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 await dialect.close(handle);\n clearCache(cfg);\n return connectWithDialect(cfg, dialect, keepBuilderOpen);\n }\n }\n\n // A rebuild trigger independent of the signature comparison above (sqlite: the content\n // table's own DDL no longer matches the resolved tokenizer).\n const extraReason = dialect.extraRebuildReason ? dialect.extraRebuildReason(handle) : null;\n if (extraReason !== null) {\n console.error(`sense: ${extraReason}; rebuilding the index`);\n closed = true;\n await dialect.close(handle);\n clearCache(cfg);\n return connectWithDialect(cfg, dialect, keepBuilderOpen);\n }\n\n await dialect.ensureSchema(handle, conn, cfg);\n\n let rebuildWarnings: string[] = [];\n if (tokenizeOnlyRebuild && dialect.postSchemaRebuild) {\n rebuildWarnings = await dialect.postSchemaRebuild(handle, conn, cfg, cfg.baseDir, wantFeatures);\n }\n\n // 3x the largest reconcile this cache has recorded, floored at 30s and capped at 10min.\n // Installed before build() -- that call is the one that races a watcher's transaction.\n if (dialect.setDerivedBusyTimeout) {\n const recordedMaxMs = Number((await getMeta(conn, 'reconcile_max_ms')) ?? '0');\n await dialect.setDerivedBusyTimeout(handle, conn, Math.min(Math.max(30000, 3 * recordedMaxMs), 600_000));\n }\n\n const { parsed, warnings } = await builder.build();\n // A one-shot open is done reconciling for good; a watcher keeps `builder` alive across its run.\n if (!keepBuilderOpen) await builder.close();\n\n return { handle, conn, cfg, dbPath, parsed, warnings: [...rebuildWarnings, ...warnings], builder };\n } catch (err) {\n await builder.close();\n if (!closed) await dialect.close(handle);\n throw err;\n }\n}\n\n// A store's open(): connects (see connectWithDialect above), then wraps the resulting connection\n// in the Store interface. The builder's pool closes right after the initial build.\nexport async function openWithDialect<Handle>(cfg: ResolvedConfig, dialect: OpenDialect<Handle>): Promise<OpenResult> {\n const { handle, conn, cfg: resolvedCfg, dbPath, parsed, warnings } = await connectWithDialect(cfg, dialect, false);\n const store = dialect.createStore(handle, conn, resolvedCfg);\n // reconcile ran before this object existed, so its chunk text is keyed by the connection.\n rekeyChunkText(conn, store);\n return { store, cfg: resolvedCfg, dbPath, parsed, warnings };\n}\n\n// Same connect+build as openWithDialect, but keeps the builder's pool alive and hands it back\n// alongside the store, for a caller (a watcher) that reconciles repeatedly on this connection.\nexport async function openWithBuilder<Handle>(cfg: ResolvedConfig, dialect: OpenDialect<Handle>): Promise<OpenResult & { builder: Builder }> {\n const { handle, conn, cfg: resolvedCfg, dbPath, parsed, warnings, builder } = await connectWithDialect(cfg, dialect, true);\n const store = dialect.createStore(handle, conn, resolvedCfg);\n rekeyChunkText(conn, store);\n return { store, cfg: resolvedCfg, dbPath, parsed, warnings, builder };\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":["docCount","openWithBuilder","openWithDialect","connectWithDialect","cfg","dialect","keepBuilderOpen","stateDir","dbPath","handle","conn","closed","builder","version","features","wantFeatures","tokenizeOnlyRebuild","changedKeys","changed","extraReason","rebuildWarnings","recordedMaxMs","parsed","warnings","err","join","baseDir","STATE_DIR","mkdirSync","recursive","filename","connect","createBuilder","reconcileDialect","exec","getMeta","featureSignature","FEATURES","schemaVersion","console","error","close","clearCache","changedSignatureKeys","partialRebuild","size","has","embedIdentityAdopted","setMeta","signatureDiff","extraRebuildReason","ensureSchema","postSchemaRebuild","setDerivedBusyTimeout","Number","Math","min","max","build","resolvedCfg","store","createStore","rekeyChunkText","stmt","prepare","get","n"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Config } from '../config/index.js';
|
|
2
|
+
import type { ParsePool } from '../scan/pool.js';
|
|
2
3
|
import type { Connection, ReconcileDialect } from './types.js';
|
|
3
|
-
export declare function reconcile(conn: Connection, cfg: Config, baseDir: string, dialect: ReconcileDialect): Promise<{
|
|
4
|
+
export declare function reconcile(conn: Connection, cfg: Config, baseDir: string, dialect: ReconcileDialect, pool?: ParsePool): Promise<{
|
|
4
5
|
parsed: number;
|
|
5
6
|
warnings: string[];
|
|
6
7
|
}>;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Config } from '../config/index.js';
|
|
2
|
+
import type { ParsePool } from '../scan/pool.js';
|
|
2
3
|
import type { Connection, ReconcileDialect } from './types.js';
|
|
3
|
-
export declare function reconcile(conn: Connection, cfg: Config, baseDir: string, dialect: ReconcileDialect): Promise<{
|
|
4
|
+
export declare function reconcile(conn: Connection, cfg: Config, baseDir: string, dialect: ReconcileDialect, pool?: ParsePool): Promise<{
|
|
4
5
|
parsed: number;
|
|
5
6
|
warnings: string[];
|
|
6
7
|
}>;
|
|
@@ -200,7 +200,7 @@ var CORE_FRONTMATTER_COLUMNS = new Set([
|
|
|
200
200
|
'_size',
|
|
201
201
|
'_parse_error'
|
|
202
202
|
]);
|
|
203
|
-
function reconcile(conn, cfg, baseDir, dialect) {
|
|
203
|
+
function reconcile(conn, cfg, baseDir, dialect, pool) {
|
|
204
204
|
return _async_to_generator(function() {
|
|
205
205
|
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;
|
|
206
206
|
return _ts_generator(this, function(_state) {
|
|
@@ -256,7 +256,9 @@ function reconcile(conn, cfg, baseDir, dialect) {
|
|
|
256
256
|
report = (0, _progressts.progress)('reparsing files', toReparse.length);
|
|
257
257
|
return [
|
|
258
258
|
4,
|
|
259
|
-
(0, _reparsets.reparseFiles)(toReparse, features, cfg, seenColumns, report.tick
|
|
259
|
+
(0, _reparsets.reparseFiles)(toReparse, features, cfg, seenColumns, report.tick, {
|
|
260
|
+
pool: pool
|
|
261
|
+
})
|
|
260
262
|
];
|
|
261
263
|
case 4:
|
|
262
264
|
_ref = _state.sent(), parsedDocs = _ref.docs, warnings = _ref.warnings, newColumns = _ref.newColumns;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/store/reconcile.ts"],"sourcesContent":["import type { Config } from '../config/index.ts';\nimport { activeFeatures } from '../features/index.ts';\nimport type { ExtractedDoc, ReconcileDelta } from '../features/types.ts';\nimport { progress } from '../output/progress.ts';\nimport { listFiles, RESERVED_COLUMNS } from '../scan/index.ts';\nimport { reparseFiles } from '../scan/reparse.ts';\nimport { getColumns, quoteIdent } from './shared.ts';\nimport { withTransaction } from './transaction.ts';\nimport type { Connection, ReconcileDialect } from './types.ts';\n\n// One reconcile algorithm shared by every store, parameterised by a per-engine ReconcileDialect\n// (types.ts). Ordering is universal, not a dialect concern: ALTER, then the frontmatter upsert,\n// then reconcileContent, then preset_files, then the vanished-frontmatter delete, then feature hooks\n// -- a vanished path's content delete (inside reconcileContent) must precede its frontmatter\n// delete, since sqlite's delete SQL resolves the row via its frontmatter rowid.\n\n// Feature-owned columns (`_rank`) must stay out of the upsert: a reparse would null the last\n// computed value on every touch, not just the reconciles that recompute it.\nconst CORE_FRONTMATTER_COLUMNS = new Set(['path', '_mtime', '_ctime', '_size', '_parse_error']);\n\nexport async function reconcile(conn: Connection, cfg: Config, baseDir: string, dialect: ReconcileDialect): Promise<{ parsed: number; warnings: string[] }> {\n const files = listFiles(cfg, baseDir);\n const currentSet = new Set(files.map((f) => f.relPath));\n\n const existingStmt = await conn.prepare('SELECT \"path\", \"_mtime\", \"_size\" FROM frontmatter');\n const existingRows = (await existingStmt.all()) as Array<{ path: string; _mtime: number; _size: number }>;\n const existing = new Map(existingRows.map((r) => [r.path, r]));\n const vanished = existingRows.filter((r) => !currentSet.has(r.path)).map((r) => r.path);\n\n const toReparse = files.filter((f) => {\n const row = existing.get(f.relPath);\n return !row || row._mtime !== f.mtimeMs || row._size !== f.size;\n });\n\n if (vanished.length === 0 && toReparse.length === 0) return { parsed: 0, warnings: [] };\n\n const features = activeFeatures(cfg);\n const seenColumns = await getColumns(conn);\n\n // Bulk reparses (a sync, a cold build) are the long silences a query can hit; short\n // reconciles stay silent (progress() has a threshold).\n const report = progress('reparsing files', toReparse.length);\n const { docs: parsedDocs, warnings, newColumns } = await reparseFiles(toReparse, features, cfg, seenColumns, report.tick);\n report.finish();\n for (const col of newColumns) seenColumns.add(col);\n\n const allColumns = [...seenColumns];\n // Fence before ALTERing: a store's own failure past this point is a raw, engine-specific\n // error with no indication of the boundary or the levers -- dialect.checkColumnLimit names both.\n dialect.checkColumnLimit(allColumns.length);\n // Columns the frontmatter upsert actually writes: core + parsed frontmatter keys, never a\n // feature-owned reserved column (see CORE_FRONTMATTER_COLUMNS above).\n const writableColumns = allColumns.filter((c) => CORE_FRONTMATTER_COLUMNS.has(c) || !RESERVED_COLUMNS.has(c));\n // ON CONFLICT DO UPDATE (not OR REPLACE) keeps the row's rowid stable across reparses --\n // sqlite's content rows are coupled to that rowid.\n const insertSql = `INSERT INTO frontmatter (${writableColumns.map(quoteIdent).join(', ')}) VALUES (${writableColumns.map(() => '?').join(', ')}) ON CONFLICT(\"path\") DO UPDATE SET ${writableColumns\n .filter((c) => c !== 'path')\n .map((c) => `${quoteIdent(c)} = excluded.${quoteIdent(c)}`)\n .join(', ')}`;\n\n const added = toReparse.filter((f) => !existing.has(f.relPath)).map((f) => f.relPath);\n const delta: ReconcileDelta = { files, reparsed: parsedDocs.map((d) => d.relPath), added, vanished };\n const addedSet = new Set(added);\n const reparsedExisting = parsedDocs.map((d) => d.relPath).filter((p) => !addedSet.has(p));\n // Paths whose content (and, per feature, other rows) need clearing: gone entirely, or about to\n // be reinserted fresh. Disjoint from `added`, which has nothing to clear.\n const touched = [...vanished, ...reparsedExisting];\n\n const txStart = Date.now();\n await withTransaction(\n conn,\n async () => {\n // Re-read inside the write transaction: newColumns came from a read taken before it opened, so a\n // concurrent reconcile may have added some of them since. ALTER has no IF NOT EXISTS.\n const present = await getColumns(conn);\n for (const col of newColumns) if (!present.has(col)) await conn.exec(`ALTER TABLE frontmatter ADD COLUMN ${quoteIdent(col)}${dialect.columnTypeSuffix()}`);\n\n if (parsedDocs.length > 0) {\n const rows = parsedDocs.map((doc) =>\n writableColumns.map((col) => {\n if (col === 'path') return doc.relPath;\n if (col === '_mtime') return doc.mtimeMs;\n if (col === '_ctime') return doc.ctimeMs;\n if (col === '_size') return doc.size;\n // Written per parse, unlike _rank, which a feature pass owns and the upsert skips.\n if (col === '_parse_error') return doc.parseError;\n return doc.data[col] ?? null;\n })\n );\n await conn.runBatch(insertSql, rows);\n }\n\n // After the upsert, so every doc already has the frontmatter row sqlite's content rowid\n // couples to. ON CONFLICT DO UPDATE preserves that rowid, so a reparse keeps its identity.\n await dialect.reconcileContent(conn, touched, parsedDocs, delta, cfg);\n\n // A preset edit forces a full rebuild, so an unchanged doc's coverage is already correct;\n // new docs have nothing to clear, which keeps cold builds linear.\n if (touched.length > 0)\n await conn.runBatch(\n 'DELETE FROM preset_files WHERE \"path\" = ?',\n touched.map((p) => [p])\n );\n const presetRows: unknown[][] = [];\n for (const doc of parsedDocs) for (const presetName of doc.presets) presetRows.push([doc.relPath, presetName]);\n if (presetRows.length > 0) await conn.runBatch('INSERT INTO preset_files (\"path\", preset) VALUES (?, ?)', presetRows);\n\n // Before the feature hooks, never after: rank's afterReconcile reads frontmatter as PageRank's\n // node set, so a lingering vanished row would dilute rank mass across every surviving note.\n if (vanished.length > 0)\n await conn.runBatch(\n 'DELETE FROM frontmatter WHERE \"path\" = ?',\n vanished.map((p) => [p])\n );\n\n if (touched.length > 0) for (const feature of features) await feature.remove?.(conn, touched, delta);\n for (const feature of features) {\n const docsForFeature: ExtractedDoc[] = parsedDocs.map((doc) => ({ path: doc.relPath, extracted: doc.extracted[feature.name] }));\n await feature.store?.(conn, docsForFeature, delta);\n }\n for (const feature of features) await feature.afterReconcile?.(conn, delta);\n },\n dialect.beginMode()\n );\n\n const durationMs = Date.now() - txStart;\n if (dialect.recordDuration) await dialect.recordDuration(conn, durationMs);\n\n return { parsed: parsedDocs.length, warnings };\n}\n"],"names":["reconcile","CORE_FRONTMATTER_COLUMNS","Set","conn","cfg","baseDir","dialect","files","currentSet","existingStmt","existingRows","existing","vanished","toReparse","features","seenColumns","report","parsedDocs","warnings","newColumns","col","allColumns","writableColumns","insertSql","added","delta","addedSet","reparsedExisting","touched","txStart","durationMs","listFiles","map","f","relPath","prepare","all","Map","r","path","filter","has","row","get","_mtime","mtimeMs","_size","size","length","parsed","activeFeatures","getColumns","progress","reparseFiles","tick","docs","finish","add","checkColumnLimit","c","RESERVED_COLUMNS","quoteIdent","join","reparsed","d","p","Date","now","withTransaction","feature","present","rows","presetRows","doc","presetName","exec","columnTypeSuffix","ctimeMs","parseError","data","runBatch","reconcileContent","presets","push","remove","docsForFeature","extracted","name","store","afterReconcile","beginMode","recordDuration"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/store/reconcile.ts"],"sourcesContent":["import type { Config } from '../config/index.ts';\nimport { activeFeatures } from '../features/index.ts';\nimport type { ExtractedDoc, ReconcileDelta } from '../features/types.ts';\nimport { progress } from '../output/progress.ts';\nimport { listFiles, RESERVED_COLUMNS } from '../scan/index.ts';\nimport type { ParsePool } from '../scan/pool.ts';\nimport { reparseFiles } from '../scan/reparse.ts';\nimport { getColumns, quoteIdent } from './shared.ts';\nimport { withTransaction } from './transaction.ts';\nimport type { Connection, ReconcileDialect } from './types.ts';\n\n// One reconcile algorithm shared by every store, parameterised by a per-engine ReconcileDialect\n// (types.ts). Ordering is universal, not a dialect concern: ALTER, then the frontmatter upsert,\n// then reconcileContent, then preset_files, then the vanished-frontmatter delete, then feature hooks\n// -- a vanished path's content delete (inside reconcileContent) must precede its frontmatter\n// delete, since sqlite's delete SQL resolves the row via its frontmatter rowid.\n\n// Feature-owned columns (`_rank`) must stay out of the upsert: a reparse would null the last\n// computed value on every touch, not just the reconciles that recompute it.\nconst CORE_FRONTMATTER_COLUMNS = new Set(['path', '_mtime', '_ctime', '_size', '_parse_error']);\n\nexport async function reconcile(conn: Connection, cfg: Config, baseDir: string, dialect: ReconcileDialect, pool?: ParsePool): Promise<{ parsed: number; warnings: string[] }> {\n const files = listFiles(cfg, baseDir);\n const currentSet = new Set(files.map((f) => f.relPath));\n\n const existingStmt = await conn.prepare('SELECT \"path\", \"_mtime\", \"_size\" FROM frontmatter');\n const existingRows = (await existingStmt.all()) as Array<{ path: string; _mtime: number; _size: number }>;\n const existing = new Map(existingRows.map((r) => [r.path, r]));\n const vanished = existingRows.filter((r) => !currentSet.has(r.path)).map((r) => r.path);\n\n const toReparse = files.filter((f) => {\n const row = existing.get(f.relPath);\n return !row || row._mtime !== f.mtimeMs || row._size !== f.size;\n });\n\n if (vanished.length === 0 && toReparse.length === 0) return { parsed: 0, warnings: [] };\n\n const features = activeFeatures(cfg);\n const seenColumns = await getColumns(conn);\n\n // Bulk reparses (a sync, a cold build) are the long silences a query can hit; short\n // reconciles stay silent (progress() has a threshold).\n const report = progress('reparsing files', toReparse.length);\n const { docs: parsedDocs, warnings, newColumns } = await reparseFiles(toReparse, features, cfg, seenColumns, report.tick, { pool });\n report.finish();\n for (const col of newColumns) seenColumns.add(col);\n\n const allColumns = [...seenColumns];\n // Fence before ALTERing: a store's own failure past this point is a raw, engine-specific\n // error with no indication of the boundary or the levers -- dialect.checkColumnLimit names both.\n dialect.checkColumnLimit(allColumns.length);\n // Columns the frontmatter upsert actually writes: core + parsed frontmatter keys, never a\n // feature-owned reserved column (see CORE_FRONTMATTER_COLUMNS above).\n const writableColumns = allColumns.filter((c) => CORE_FRONTMATTER_COLUMNS.has(c) || !RESERVED_COLUMNS.has(c));\n // ON CONFLICT DO UPDATE (not OR REPLACE) keeps the row's rowid stable across reparses --\n // sqlite's content rows are coupled to that rowid.\n const insertSql = `INSERT INTO frontmatter (${writableColumns.map(quoteIdent).join(', ')}) VALUES (${writableColumns.map(() => '?').join(', ')}) ON CONFLICT(\"path\") DO UPDATE SET ${writableColumns\n .filter((c) => c !== 'path')\n .map((c) => `${quoteIdent(c)} = excluded.${quoteIdent(c)}`)\n .join(', ')}`;\n\n const added = toReparse.filter((f) => !existing.has(f.relPath)).map((f) => f.relPath);\n const delta: ReconcileDelta = { files, reparsed: parsedDocs.map((d) => d.relPath), added, vanished };\n const addedSet = new Set(added);\n const reparsedExisting = parsedDocs.map((d) => d.relPath).filter((p) => !addedSet.has(p));\n // Paths whose content (and, per feature, other rows) need clearing: gone entirely, or about to\n // be reinserted fresh. Disjoint from `added`, which has nothing to clear.\n const touched = [...vanished, ...reparsedExisting];\n\n const txStart = Date.now();\n await withTransaction(\n conn,\n async () => {\n // Re-read inside the write transaction: newColumns came from a read taken before it opened, so a\n // concurrent reconcile may have added some of them since. ALTER has no IF NOT EXISTS.\n const present = await getColumns(conn);\n for (const col of newColumns) if (!present.has(col)) await conn.exec(`ALTER TABLE frontmatter ADD COLUMN ${quoteIdent(col)}${dialect.columnTypeSuffix()}`);\n\n if (parsedDocs.length > 0) {\n const rows = parsedDocs.map((doc) =>\n writableColumns.map((col) => {\n if (col === 'path') return doc.relPath;\n if (col === '_mtime') return doc.mtimeMs;\n if (col === '_ctime') return doc.ctimeMs;\n if (col === '_size') return doc.size;\n // Written per parse, unlike _rank, which a feature pass owns and the upsert skips.\n if (col === '_parse_error') return doc.parseError;\n return doc.data[col] ?? null;\n })\n );\n await conn.runBatch(insertSql, rows);\n }\n\n // After the upsert, so every doc already has the frontmatter row sqlite's content rowid\n // couples to. ON CONFLICT DO UPDATE preserves that rowid, so a reparse keeps its identity.\n await dialect.reconcileContent(conn, touched, parsedDocs, delta, cfg);\n\n // A preset edit forces a full rebuild, so an unchanged doc's coverage is already correct;\n // new docs have nothing to clear, which keeps cold builds linear.\n if (touched.length > 0)\n await conn.runBatch(\n 'DELETE FROM preset_files WHERE \"path\" = ?',\n touched.map((p) => [p])\n );\n const presetRows: unknown[][] = [];\n for (const doc of parsedDocs) for (const presetName of doc.presets) presetRows.push([doc.relPath, presetName]);\n if (presetRows.length > 0) await conn.runBatch('INSERT INTO preset_files (\"path\", preset) VALUES (?, ?)', presetRows);\n\n // Before the feature hooks, never after: rank's afterReconcile reads frontmatter as PageRank's\n // node set, so a lingering vanished row would dilute rank mass across every surviving note.\n if (vanished.length > 0)\n await conn.runBatch(\n 'DELETE FROM frontmatter WHERE \"path\" = ?',\n vanished.map((p) => [p])\n );\n\n if (touched.length > 0) for (const feature of features) await feature.remove?.(conn, touched, delta);\n for (const feature of features) {\n const docsForFeature: ExtractedDoc[] = parsedDocs.map((doc) => ({ path: doc.relPath, extracted: doc.extracted[feature.name] }));\n await feature.store?.(conn, docsForFeature, delta);\n }\n for (const feature of features) await feature.afterReconcile?.(conn, delta);\n },\n dialect.beginMode()\n );\n\n const durationMs = Date.now() - txStart;\n if (dialect.recordDuration) await dialect.recordDuration(conn, durationMs);\n\n return { parsed: parsedDocs.length, warnings };\n}\n"],"names":["reconcile","CORE_FRONTMATTER_COLUMNS","Set","conn","cfg","baseDir","dialect","pool","files","currentSet","existingStmt","existingRows","existing","vanished","toReparse","features","seenColumns","report","parsedDocs","warnings","newColumns","col","allColumns","writableColumns","insertSql","added","delta","addedSet","reparsedExisting","touched","txStart","durationMs","listFiles","map","f","relPath","prepare","all","Map","r","path","filter","has","row","get","_mtime","mtimeMs","_size","size","length","parsed","activeFeatures","getColumns","progress","reparseFiles","tick","docs","finish","add","checkColumnLimit","c","RESERVED_COLUMNS","quoteIdent","join","reparsed","d","p","Date","now","withTransaction","feature","present","rows","presetRows","doc","presetName","exec","columnTypeSuffix","ctimeMs","parseError","data","runBatch","reconcileContent","presets","push","remove","docsForFeature","extracted","name","store","afterReconcile","beginMode","recordDuration"],"mappings":"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"}
|