sensemaking 0.19.2 → 0.21.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/README.md +0 -1
- 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/config/access.d.cts +0 -1
- package/dist/cjs/config/access.d.ts +0 -1
- package/dist/cjs/config/access.js +10 -17
- package/dist/cjs/config/access.js.map +1 -1
- package/dist/cjs/config/index.d.cts +1 -1
- package/dist/cjs/config/index.d.ts +1 -1
- package/dist/cjs/config/index.js +0 -3
- package/dist/cjs/config/index.js.map +1 -1
- package/dist/cjs/config/types.d.cts +0 -3
- package/dist/cjs/config/types.d.ts +0 -3
- package/dist/cjs/config/types.js.map +1 -1
- package/dist/cjs/config/validate.js +6 -24
- package/dist/cjs/config/validate.js.map +1 -1
- package/dist/cjs/errors.d.cts +1 -1
- package/dist/cjs/errors.d.ts +1 -1
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/features/links.js +4 -5
- package/dist/cjs/features/links.js.map +1 -1
- package/dist/cjs/features/sections.js +4 -1
- package/dist/cjs/features/sections.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 +19 -0
- package/dist/cjs/store/builder.d.ts +19 -0
- package/dist/cjs/store/builder.js +618 -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 +77 -123
- package/dist/cjs/store/duckdb/open.js.map +1 -1
- package/dist/cjs/store/duckdb/reconcile.js +34 -5
- 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/embed-scope.d.cts +2 -0
- package/dist/cjs/store/embed-scope.d.ts +2 -0
- package/dist/cjs/store/embed-scope.js +85 -0
- package/dist/cjs/store/embed-scope.js.map +1 -0
- package/dist/cjs/store/feature-scope.d.cts +8 -0
- package/dist/cjs/store/feature-scope.d.ts +8 -0
- package/dist/cjs/store/feature-scope.js +107 -0
- package/dist/cjs/store/feature-scope.js.map +1 -0
- 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 +608 -0
- package/dist/cjs/store/open.js.map +1 -0
- package/dist/cjs/store/preset-scope.d.cts +3 -0
- package/dist/cjs/store/preset-scope.d.ts +3 -0
- package/dist/cjs/store/preset-scope.js +293 -0
- package/dist/cjs/store/preset-scope.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 +175 -179
- 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 +164 -0
- package/dist/cjs/store/signature.js.map +1 -0
- package/dist/cjs/store/sqlite/lexical.d.cts +1 -1
- package/dist/cjs/store/sqlite/lexical.d.ts +1 -1
- package/dist/cjs/store/sqlite/lexical.js +2 -2
- package/dist/cjs/store/sqlite/lexical.js.map +1 -1
- package/dist/cjs/store/sqlite/open.d.cts +8 -9
- package/dist/cjs/store/sqlite/open.d.ts +8 -9
- package/dist/cjs/store/sqlite/open.js +82 -311
- package/dist/cjs/store/sqlite/open.js.map +1 -1
- package/dist/cjs/store/sqlite/reconcile.d.cts +1 -1
- package/dist/cjs/store/sqlite/reconcile.d.ts +1 -1
- package/dist/cjs/store/sqlite/reconcile.js +78 -16
- package/dist/cjs/store/sqlite/reconcile.js.map +1 -1
- package/dist/cjs/store/sqlite/sql-functions.d.cts +1 -1
- package/dist/cjs/store/sqlite/sql-functions.d.ts +1 -1
- package/dist/cjs/store/sqlite/sql-functions.js +3 -3
- package/dist/cjs/store/sqlite/sql-functions.js.map +1 -1
- package/dist/cjs/store/sqlite/store.d.cts +1 -2
- package/dist/cjs/store/sqlite/store.d.ts +1 -2
- package/dist/cjs/store/sqlite/store.js +2 -15
- 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 +85 -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 +88 -8
- 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 +16 -6
- package/dist/cjs/store/types.d.ts +16 -6
- 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/config/access.d.ts +0 -1
- package/dist/esm/config/access.js +12 -17
- package/dist/esm/config/access.js.map +1 -1
- package/dist/esm/config/index.d.ts +1 -1
- package/dist/esm/config/index.js +1 -1
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/config/types.d.ts +0 -3
- package/dist/esm/config/types.js.map +1 -1
- package/dist/esm/config/validate.js +6 -22
- package/dist/esm/config/validate.js.map +1 -1
- package/dist/esm/errors.d.ts +1 -1
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/features/links.js +3 -4
- package/dist/esm/features/links.js.map +1 -1
- package/dist/esm/features/sections.js +4 -1
- package/dist/esm/features/sections.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 +19 -0
- package/dist/esm/store/builder.js +163 -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 +36 -58
- package/dist/esm/store/duckdb/open.js.map +1 -1
- package/dist/esm/store/duckdb/reconcile.js +15 -3
- 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/embed-scope.d.ts +2 -0
- package/dist/esm/store/embed-scope.js +28 -0
- package/dist/esm/store/embed-scope.js.map +1 -0
- package/dist/esm/store/feature-scope.d.ts +8 -0
- package/dist/esm/store/feature-scope.js +49 -0
- package/dist/esm/store/feature-scope.js.map +1 -0
- 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 +187 -0
- package/dist/esm/store/open.js.map +1 -0
- package/dist/esm/store/preset-scope.d.ts +3 -0
- package/dist/esm/store/preset-scope.js +77 -0
- package/dist/esm/store/preset-scope.js.map +1 -0
- package/dist/esm/store/reconcile.d.ts +2 -1
- package/dist/esm/store/reconcile.js +33 -6
- 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/signature.js +37 -0
- package/dist/esm/store/signature.js.map +1 -0
- package/dist/esm/store/sqlite/lexical.d.ts +1 -1
- package/dist/esm/store/sqlite/lexical.js +4 -4
- package/dist/esm/store/sqlite/lexical.js.map +1 -1
- package/dist/esm/store/sqlite/open.d.ts +8 -9
- package/dist/esm/store/sqlite/open.js +41 -147
- package/dist/esm/store/sqlite/open.js.map +1 -1
- package/dist/esm/store/sqlite/reconcile.d.ts +1 -1
- package/dist/esm/store/sqlite/reconcile.js +14 -14
- package/dist/esm/store/sqlite/reconcile.js.map +1 -1
- package/dist/esm/store/sqlite/sql-functions.d.ts +1 -1
- package/dist/esm/store/sqlite/sql-functions.js +3 -3
- package/dist/esm/store/sqlite/sql-functions.js.map +1 -1
- package/dist/esm/store/sqlite/store.d.ts +1 -2
- package/dist/esm/store/sqlite/store.js +3 -9
- 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 +34 -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 +18 -3
- 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 +16 -6
- 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 +4 -3
- package/schema.json +0 -11
- 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 +0 -58
- package/dist/esm/store/sqlite/signature.js.map +0 -1
|
@@ -0,0 +1,618 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "createBuilder", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return createBuilder;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
var _embedts = require("../features/embed.js");
|
|
12
|
+
var _indexts = require("../features/index.js");
|
|
13
|
+
var _rankts = require("../features/rank.js");
|
|
14
|
+
var _indexts1 = require("../scan/index.js");
|
|
15
|
+
var _poolts = require("../scan/pool.js");
|
|
16
|
+
var _reparsets = require("../scan/reparse.js");
|
|
17
|
+
var _featurescopets = require("./feature-scope.js");
|
|
18
|
+
var _reconcilets = require("./reconcile.js");
|
|
19
|
+
var _sharedts = require("./shared.js");
|
|
20
|
+
var _transactionts = require("./transaction.js");
|
|
21
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
22
|
+
try {
|
|
23
|
+
var info = gen[key](arg);
|
|
24
|
+
var value = info.value;
|
|
25
|
+
} catch (error) {
|
|
26
|
+
reject(error);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (info.done) resolve(value);
|
|
30
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
31
|
+
}
|
|
32
|
+
function _async_to_generator(fn) {
|
|
33
|
+
return function() {
|
|
34
|
+
var self = this, args = arguments;
|
|
35
|
+
return new Promise(function(resolve, reject) {
|
|
36
|
+
var gen = fn.apply(self, args);
|
|
37
|
+
function _next(value) {
|
|
38
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
39
|
+
}
|
|
40
|
+
function _throw(err) {
|
|
41
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
42
|
+
}
|
|
43
|
+
_next(undefined);
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
function _ts_generator(thisArg, body) {
|
|
48
|
+
var f, y, t, _ = {
|
|
49
|
+
label: 0,
|
|
50
|
+
sent: function() {
|
|
51
|
+
if (t[0] & 1) throw t[1];
|
|
52
|
+
return t[1];
|
|
53
|
+
},
|
|
54
|
+
trys: [],
|
|
55
|
+
ops: []
|
|
56
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
|
|
57
|
+
return d(g, "next", {
|
|
58
|
+
value: verb(0)
|
|
59
|
+
}), d(g, "throw", {
|
|
60
|
+
value: verb(1)
|
|
61
|
+
}), d(g, "return", {
|
|
62
|
+
value: verb(2)
|
|
63
|
+
}), typeof Symbol === "function" && d(g, Symbol.iterator, {
|
|
64
|
+
value: function() {
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
}), g;
|
|
68
|
+
function verb(n) {
|
|
69
|
+
return function(v) {
|
|
70
|
+
return step([
|
|
71
|
+
n,
|
|
72
|
+
v
|
|
73
|
+
]);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function step(op) {
|
|
77
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
78
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
79
|
+
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;
|
|
80
|
+
if (y = 0, t) op = [
|
|
81
|
+
op[0] & 2,
|
|
82
|
+
t.value
|
|
83
|
+
];
|
|
84
|
+
switch(op[0]){
|
|
85
|
+
case 0:
|
|
86
|
+
case 1:
|
|
87
|
+
t = op;
|
|
88
|
+
break;
|
|
89
|
+
case 4:
|
|
90
|
+
_.label++;
|
|
91
|
+
return {
|
|
92
|
+
value: op[1],
|
|
93
|
+
done: false
|
|
94
|
+
};
|
|
95
|
+
case 5:
|
|
96
|
+
_.label++;
|
|
97
|
+
y = op[1];
|
|
98
|
+
op = [
|
|
99
|
+
0
|
|
100
|
+
];
|
|
101
|
+
continue;
|
|
102
|
+
case 7:
|
|
103
|
+
op = _.ops.pop();
|
|
104
|
+
_.trys.pop();
|
|
105
|
+
continue;
|
|
106
|
+
default:
|
|
107
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
108
|
+
_ = 0;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
112
|
+
_.label = op[1];
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
116
|
+
_.label = t[1];
|
|
117
|
+
t = op;
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
if (t && _.label < t[2]) {
|
|
121
|
+
_.label = t[2];
|
|
122
|
+
_.ops.push(op);
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
if (t[2]) _.ops.pop();
|
|
126
|
+
_.trys.pop();
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
op = body.call(thisArg, _);
|
|
130
|
+
} catch (e) {
|
|
131
|
+
op = [
|
|
132
|
+
6,
|
|
133
|
+
e
|
|
134
|
+
];
|
|
135
|
+
y = 0;
|
|
136
|
+
} finally{
|
|
137
|
+
f = t = 0;
|
|
138
|
+
}
|
|
139
|
+
if (op[0] & 5) throw op[1];
|
|
140
|
+
return {
|
|
141
|
+
value: op[0] ? op[1] : void 0,
|
|
142
|
+
done: true
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// 'model': the provider or model name moved but chunk boundaries did not, so only the vector
|
|
147
|
+
// values are stale. No reparse, and no table but embeddings is touched.
|
|
148
|
+
function nullEmbedVectors(conn, dialect) {
|
|
149
|
+
return _async_to_generator(function() {
|
|
150
|
+
return _ts_generator(this, function(_state) {
|
|
151
|
+
switch(_state.label){
|
|
152
|
+
case 0:
|
|
153
|
+
return [
|
|
154
|
+
4,
|
|
155
|
+
(0, _transactionts.withTransaction)(conn, function() {
|
|
156
|
+
return conn.exec('UPDATE embeddings SET vector = NULL, scale = NULL');
|
|
157
|
+
}, dialect.beginMode())
|
|
158
|
+
];
|
|
159
|
+
case 1:
|
|
160
|
+
_state.sent();
|
|
161
|
+
return [
|
|
162
|
+
2,
|
|
163
|
+
{
|
|
164
|
+
parsed: 0
|
|
165
|
+
}
|
|
166
|
+
];
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
})();
|
|
170
|
+
}
|
|
171
|
+
// 'chunk': chunkTokens or the chunk version moved, so chunk boundaries genuinely changed. Rebuilds
|
|
172
|
+
// every embedding row through the embed feature's own remove/store, touching no other table.
|
|
173
|
+
function rebuildEmbeddings(conn, cfg, baseDir, dialect, pool) {
|
|
174
|
+
return _async_to_generator(function() {
|
|
175
|
+
var existingStmt, existingPaths, _, files, docs, paths, delta;
|
|
176
|
+
return _ts_generator(this, function(_state) {
|
|
177
|
+
switch(_state.label){
|
|
178
|
+
case 0:
|
|
179
|
+
return [
|
|
180
|
+
4,
|
|
181
|
+
conn.prepare('SELECT "path" FROM frontmatter')
|
|
182
|
+
];
|
|
183
|
+
case 1:
|
|
184
|
+
existingStmt = _state.sent();
|
|
185
|
+
_ = Set.bind;
|
|
186
|
+
return [
|
|
187
|
+
4,
|
|
188
|
+
existingStmt.all()
|
|
189
|
+
];
|
|
190
|
+
case 2:
|
|
191
|
+
existingPaths = new (_.apply(Set, [
|
|
192
|
+
void 0,
|
|
193
|
+
_state.sent().map(function(r) {
|
|
194
|
+
return r.path;
|
|
195
|
+
})
|
|
196
|
+
]));
|
|
197
|
+
// A file added since the last build has no row yet; leaving it for build() to insert avoids a
|
|
198
|
+
// primary-key collision between this INSERT and build()'s own insert for the same new file.
|
|
199
|
+
files = (0, _indexts1.listFiles)(cfg, baseDir).filter(function(f) {
|
|
200
|
+
return f.embed && existingPaths.has(f.relPath);
|
|
201
|
+
});
|
|
202
|
+
if (files.length === 0) return [
|
|
203
|
+
2,
|
|
204
|
+
{
|
|
205
|
+
parsed: 0
|
|
206
|
+
}
|
|
207
|
+
];
|
|
208
|
+
return [
|
|
209
|
+
4,
|
|
210
|
+
(0, _reparsets.reparseFiles)(files, [
|
|
211
|
+
_embedts.embed
|
|
212
|
+
], cfg, new Set(), undefined, {
|
|
213
|
+
pool: pool
|
|
214
|
+
})
|
|
215
|
+
];
|
|
216
|
+
case 3:
|
|
217
|
+
docs = _state.sent().docs;
|
|
218
|
+
paths = docs.map(function(d) {
|
|
219
|
+
return d.relPath;
|
|
220
|
+
});
|
|
221
|
+
delta = {
|
|
222
|
+
files: files,
|
|
223
|
+
reparsed: paths,
|
|
224
|
+
added: [],
|
|
225
|
+
vanished: []
|
|
226
|
+
};
|
|
227
|
+
return [
|
|
228
|
+
4,
|
|
229
|
+
(0, _transactionts.withTransaction)(conn, function() {
|
|
230
|
+
return _async_to_generator(function() {
|
|
231
|
+
var _embed_remove, _embed_store;
|
|
232
|
+
return _ts_generator(this, function(_state) {
|
|
233
|
+
switch(_state.label){
|
|
234
|
+
case 0:
|
|
235
|
+
return [
|
|
236
|
+
4,
|
|
237
|
+
(_embed_remove = _embedts.embed.remove) === null || _embed_remove === void 0 ? void 0 : _embed_remove.call(_embedts.embed, conn, paths, delta)
|
|
238
|
+
];
|
|
239
|
+
case 1:
|
|
240
|
+
_state.sent();
|
|
241
|
+
return [
|
|
242
|
+
4,
|
|
243
|
+
(_embed_store = _embedts.embed.store) === null || _embed_store === void 0 ? void 0 : _embed_store.call(_embedts.embed, conn, docs.map(function(d) {
|
|
244
|
+
return {
|
|
245
|
+
path: d.relPath,
|
|
246
|
+
extracted: d.extracted.embed
|
|
247
|
+
};
|
|
248
|
+
}), delta)
|
|
249
|
+
];
|
|
250
|
+
case 2:
|
|
251
|
+
_state.sent();
|
|
252
|
+
return [
|
|
253
|
+
2
|
|
254
|
+
];
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
})();
|
|
258
|
+
}, dialect.beginMode())
|
|
259
|
+
];
|
|
260
|
+
case 4:
|
|
261
|
+
_state.sent();
|
|
262
|
+
return [
|
|
263
|
+
2,
|
|
264
|
+
{
|
|
265
|
+
parsed: docs.length
|
|
266
|
+
}
|
|
267
|
+
];
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
})();
|
|
271
|
+
}
|
|
272
|
+
// One feature's own table, dropped and (turning on) fully re-derived across every indexed file.
|
|
273
|
+
// Rows left over from before this feature was disabled are untrustworthy by construction (files
|
|
274
|
+
// added, edited, or deleted got no remove/store for it), so this never diffs against them --
|
|
275
|
+
// dropping every row and reparsing the whole tree is the only safe path back to consistent state.
|
|
276
|
+
function invalidateFeatureTable(conn, cfg, baseDir, dialect, pool, toggle) {
|
|
277
|
+
return _async_to_generator(function() {
|
|
278
|
+
var table, feature, files, docs, docsForFeature, paths, delta;
|
|
279
|
+
return _ts_generator(this, function(_state) {
|
|
280
|
+
switch(_state.label){
|
|
281
|
+
case 0:
|
|
282
|
+
table = _featurescopets.NARROW_FEATURE_TABLE[toggle.name];
|
|
283
|
+
feature = _indexts.FEATURES.find(function(f) {
|
|
284
|
+
return f.name === toggle.name;
|
|
285
|
+
});
|
|
286
|
+
if (!feature) throw new Error('invalidateFeatureTable: no registered feature named "'.concat(toggle.name, '"'));
|
|
287
|
+
if (!!toggle.turnedOn) return [
|
|
288
|
+
3,
|
|
289
|
+
2
|
|
290
|
+
];
|
|
291
|
+
return [
|
|
292
|
+
4,
|
|
293
|
+
(0, _transactionts.withTransaction)(conn, function() {
|
|
294
|
+
return conn.exec("DELETE FROM ".concat(table));
|
|
295
|
+
}, dialect.beginMode())
|
|
296
|
+
];
|
|
297
|
+
case 1:
|
|
298
|
+
_state.sent();
|
|
299
|
+
return [
|
|
300
|
+
2,
|
|
301
|
+
{
|
|
302
|
+
parsed: 0
|
|
303
|
+
}
|
|
304
|
+
];
|
|
305
|
+
case 2:
|
|
306
|
+
files = (0, _indexts1.listFiles)(cfg, baseDir);
|
|
307
|
+
return [
|
|
308
|
+
4,
|
|
309
|
+
(0, _reparsets.reparseFiles)(files, [
|
|
310
|
+
feature
|
|
311
|
+
], cfg, new Set(), undefined, {
|
|
312
|
+
pool: pool
|
|
313
|
+
})
|
|
314
|
+
];
|
|
315
|
+
case 3:
|
|
316
|
+
docs = _state.sent().docs;
|
|
317
|
+
docsForFeature = docs.map(function(d) {
|
|
318
|
+
return {
|
|
319
|
+
path: d.relPath,
|
|
320
|
+
extracted: d.extracted[feature.name]
|
|
321
|
+
};
|
|
322
|
+
});
|
|
323
|
+
paths = docs.map(function(d) {
|
|
324
|
+
return d.relPath;
|
|
325
|
+
});
|
|
326
|
+
// Every path counts as added, not just touched: the table was just dropped, so there is nothing
|
|
327
|
+
// stale to diff against, and links' own afterReconcile takes its cold-build (resolveAll) path
|
|
328
|
+
// only when added.length equals files.length.
|
|
329
|
+
delta = {
|
|
330
|
+
files: files,
|
|
331
|
+
reparsed: paths,
|
|
332
|
+
added: paths,
|
|
333
|
+
vanished: []
|
|
334
|
+
};
|
|
335
|
+
return [
|
|
336
|
+
4,
|
|
337
|
+
(0, _transactionts.withTransaction)(conn, function() {
|
|
338
|
+
return _async_to_generator(function() {
|
|
339
|
+
var _feature_store, _feature_afterReconcile;
|
|
340
|
+
return _ts_generator(this, function(_state) {
|
|
341
|
+
switch(_state.label){
|
|
342
|
+
case 0:
|
|
343
|
+
return [
|
|
344
|
+
4,
|
|
345
|
+
conn.exec("DELETE FROM ".concat(table))
|
|
346
|
+
];
|
|
347
|
+
case 1:
|
|
348
|
+
_state.sent();
|
|
349
|
+
return [
|
|
350
|
+
4,
|
|
351
|
+
(_feature_store = feature.store) === null || _feature_store === void 0 ? void 0 : _feature_store.call(feature, conn, docsForFeature, delta)
|
|
352
|
+
];
|
|
353
|
+
case 2:
|
|
354
|
+
_state.sent();
|
|
355
|
+
return [
|
|
356
|
+
4,
|
|
357
|
+
(_feature_afterReconcile = feature.afterReconcile) === null || _feature_afterReconcile === void 0 ? void 0 : _feature_afterReconcile.call(feature, conn, delta)
|
|
358
|
+
];
|
|
359
|
+
case 3:
|
|
360
|
+
_state.sent();
|
|
361
|
+
return [
|
|
362
|
+
2
|
|
363
|
+
];
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
})();
|
|
367
|
+
}, dialect.beginMode())
|
|
368
|
+
];
|
|
369
|
+
case 4:
|
|
370
|
+
_state.sent();
|
|
371
|
+
return [
|
|
372
|
+
2,
|
|
373
|
+
{
|
|
374
|
+
parsed: docs.length
|
|
375
|
+
}
|
|
376
|
+
];
|
|
377
|
+
}
|
|
378
|
+
});
|
|
379
|
+
})();
|
|
380
|
+
}
|
|
381
|
+
// rank has no table of its own: frontmatter._rank is the only state it owns. Guarded on column
|
|
382
|
+
// presence, since links can toggle off while rank has never been enabled for this tree.
|
|
383
|
+
function nullRank(conn, dialect) {
|
|
384
|
+
return _async_to_generator(function() {
|
|
385
|
+
var columns;
|
|
386
|
+
return _ts_generator(this, function(_state) {
|
|
387
|
+
switch(_state.label){
|
|
388
|
+
case 0:
|
|
389
|
+
return [
|
|
390
|
+
4,
|
|
391
|
+
(0, _sharedts.getColumns)(conn)
|
|
392
|
+
];
|
|
393
|
+
case 1:
|
|
394
|
+
columns = _state.sent();
|
|
395
|
+
if (!columns.has('_rank')) return [
|
|
396
|
+
2
|
|
397
|
+
];
|
|
398
|
+
return [
|
|
399
|
+
4,
|
|
400
|
+
(0, _transactionts.withTransaction)(conn, function() {
|
|
401
|
+
return conn.exec('UPDATE frontmatter SET "_rank" = NULL');
|
|
402
|
+
}, dialect.beginMode())
|
|
403
|
+
];
|
|
404
|
+
case 2:
|
|
405
|
+
_state.sent();
|
|
406
|
+
return [
|
|
407
|
+
2
|
|
408
|
+
];
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
})();
|
|
412
|
+
}
|
|
413
|
+
// Whole-tree and reparse-free: PageRank is computed from the links table, not from files, so
|
|
414
|
+
// turning rank back on needs no reparseFiles pass at all.
|
|
415
|
+
function rerunRank(conn, dialect) {
|
|
416
|
+
return _async_to_generator(function() {
|
|
417
|
+
var delta;
|
|
418
|
+
return _ts_generator(this, function(_state) {
|
|
419
|
+
switch(_state.label){
|
|
420
|
+
case 0:
|
|
421
|
+
delta = {
|
|
422
|
+
files: [],
|
|
423
|
+
reparsed: [],
|
|
424
|
+
added: [],
|
|
425
|
+
vanished: []
|
|
426
|
+
};
|
|
427
|
+
return [
|
|
428
|
+
4,
|
|
429
|
+
(0, _transactionts.withTransaction)(conn, function() {
|
|
430
|
+
return _async_to_generator(function() {
|
|
431
|
+
var _rank_afterReconcile;
|
|
432
|
+
return _ts_generator(this, function(_state) {
|
|
433
|
+
switch(_state.label){
|
|
434
|
+
case 0:
|
|
435
|
+
return [
|
|
436
|
+
4,
|
|
437
|
+
(_rank_afterReconcile = _rankts.rank.afterReconcile) === null || _rank_afterReconcile === void 0 ? void 0 : _rank_afterReconcile.call(_rankts.rank, conn, delta)
|
|
438
|
+
];
|
|
439
|
+
case 1:
|
|
440
|
+
_state.sent();
|
|
441
|
+
return [
|
|
442
|
+
2
|
|
443
|
+
];
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
})();
|
|
447
|
+
}, dialect.beginMode())
|
|
448
|
+
];
|
|
449
|
+
case 1:
|
|
450
|
+
_state.sent();
|
|
451
|
+
return [
|
|
452
|
+
2
|
|
453
|
+
];
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
})();
|
|
457
|
+
}
|
|
458
|
+
function invalidateFeatureToggles(conn, cfg, baseDir, dialect, pool, toggles) {
|
|
459
|
+
return _async_to_generator(function() {
|
|
460
|
+
var byName, parsed, linksToggle, rankToggle, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, toggle, err;
|
|
461
|
+
return _ts_generator(this, function(_state) {
|
|
462
|
+
switch(_state.label){
|
|
463
|
+
case 0:
|
|
464
|
+
byName = new Map(toggles.map(function(toggle) {
|
|
465
|
+
return [
|
|
466
|
+
toggle.name,
|
|
467
|
+
toggle
|
|
468
|
+
];
|
|
469
|
+
}));
|
|
470
|
+
parsed = 0;
|
|
471
|
+
// links first, if present: rank's rerun below (whether from its own toggle or the co-change
|
|
472
|
+
// rankToggle carries) must read the links table after it is back in its new state.
|
|
473
|
+
linksToggle = byName.get('links');
|
|
474
|
+
if (!linksToggle) return [
|
|
475
|
+
3,
|
|
476
|
+
3
|
|
477
|
+
];
|
|
478
|
+
return [
|
|
479
|
+
4,
|
|
480
|
+
invalidateFeatureTable(conn, cfg, baseDir, dialect, pool, linksToggle)
|
|
481
|
+
];
|
|
482
|
+
case 1:
|
|
483
|
+
parsed = parsed + _state.sent().parsed;
|
|
484
|
+
if (!!linksToggle.turnedOn) return [
|
|
485
|
+
3,
|
|
486
|
+
3
|
|
487
|
+
];
|
|
488
|
+
return [
|
|
489
|
+
4,
|
|
490
|
+
nullRank(conn, dialect)
|
|
491
|
+
];
|
|
492
|
+
case 2:
|
|
493
|
+
_state.sent();
|
|
494
|
+
_state.label = 3;
|
|
495
|
+
case 3:
|
|
496
|
+
// rank's effective on/off (featureEnabled's links dependency) only appears as a changed
|
|
497
|
+
// `feature:rank` segment when it actually flips -- whether that's rank's own config or a
|
|
498
|
+
// links toggle taking it along -- so honoring it here is complete on its own.
|
|
499
|
+
rankToggle = byName.get('rank');
|
|
500
|
+
if (!rankToggle) return [
|
|
501
|
+
3,
|
|
502
|
+
7
|
|
503
|
+
];
|
|
504
|
+
if (!rankToggle.turnedOn) return [
|
|
505
|
+
3,
|
|
506
|
+
5
|
|
507
|
+
];
|
|
508
|
+
return [
|
|
509
|
+
4,
|
|
510
|
+
rerunRank(conn, dialect)
|
|
511
|
+
];
|
|
512
|
+
case 4:
|
|
513
|
+
_state.sent();
|
|
514
|
+
return [
|
|
515
|
+
3,
|
|
516
|
+
7
|
|
517
|
+
];
|
|
518
|
+
case 5:
|
|
519
|
+
return [
|
|
520
|
+
4,
|
|
521
|
+
nullRank(conn, dialect)
|
|
522
|
+
];
|
|
523
|
+
case 6:
|
|
524
|
+
_state.sent();
|
|
525
|
+
_state.label = 7;
|
|
526
|
+
case 7:
|
|
527
|
+
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
528
|
+
_state.label = 8;
|
|
529
|
+
case 8:
|
|
530
|
+
_state.trys.push([
|
|
531
|
+
8,
|
|
532
|
+
13,
|
|
533
|
+
14,
|
|
534
|
+
15
|
|
535
|
+
]);
|
|
536
|
+
_iterator = toggles[Symbol.iterator]();
|
|
537
|
+
_state.label = 9;
|
|
538
|
+
case 9:
|
|
539
|
+
if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
|
|
540
|
+
3,
|
|
541
|
+
12
|
|
542
|
+
];
|
|
543
|
+
toggle = _step.value;
|
|
544
|
+
if (toggle.name === 'links' || toggle.name === 'rank') return [
|
|
545
|
+
3,
|
|
546
|
+
11
|
|
547
|
+
];
|
|
548
|
+
return [
|
|
549
|
+
4,
|
|
550
|
+
invalidateFeatureTable(conn, cfg, baseDir, dialect, pool, toggle)
|
|
551
|
+
];
|
|
552
|
+
case 10:
|
|
553
|
+
parsed = parsed + _state.sent().parsed;
|
|
554
|
+
_state.label = 11;
|
|
555
|
+
case 11:
|
|
556
|
+
_iteratorNormalCompletion = true;
|
|
557
|
+
return [
|
|
558
|
+
3,
|
|
559
|
+
9
|
|
560
|
+
];
|
|
561
|
+
case 12:
|
|
562
|
+
return [
|
|
563
|
+
3,
|
|
564
|
+
15
|
|
565
|
+
];
|
|
566
|
+
case 13:
|
|
567
|
+
err = _state.sent();
|
|
568
|
+
_didIteratorError = true;
|
|
569
|
+
_iteratorError = err;
|
|
570
|
+
return [
|
|
571
|
+
3,
|
|
572
|
+
15
|
|
573
|
+
];
|
|
574
|
+
case 14:
|
|
575
|
+
try {
|
|
576
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
577
|
+
_iterator.return();
|
|
578
|
+
}
|
|
579
|
+
} finally{
|
|
580
|
+
if (_didIteratorError) {
|
|
581
|
+
throw _iteratorError;
|
|
582
|
+
}
|
|
583
|
+
}
|
|
584
|
+
return [
|
|
585
|
+
7
|
|
586
|
+
];
|
|
587
|
+
case 15:
|
|
588
|
+
return [
|
|
589
|
+
2,
|
|
590
|
+
{
|
|
591
|
+
parsed: parsed
|
|
592
|
+
}
|
|
593
|
+
];
|
|
594
|
+
}
|
|
595
|
+
});
|
|
596
|
+
})();
|
|
597
|
+
}
|
|
598
|
+
function createBuilder(conn, cfg, baseDir, dialect) {
|
|
599
|
+
var pool = new _poolts.ParsePool();
|
|
600
|
+
return {
|
|
601
|
+
build: function build(forcedPaths) {
|
|
602
|
+
return (0, _reconcilets.reconcile)(conn, cfg, baseDir, dialect, pool, forcedPaths);
|
|
603
|
+
},
|
|
604
|
+
invalidate: function invalidate(kind) {
|
|
605
|
+
return kind === 'model' ? nullEmbedVectors(conn, dialect) : rebuildEmbeddings(conn, cfg, baseDir, dialect, pool);
|
|
606
|
+
},
|
|
607
|
+
invalidateFeatures: function invalidateFeatures(toggles) {
|
|
608
|
+
return invalidateFeatureToggles(conn, cfg, baseDir, dialect, pool, toggles);
|
|
609
|
+
},
|
|
610
|
+
close: function close() {
|
|
611
|
+
return pool.close();
|
|
612
|
+
},
|
|
613
|
+
get poolsCreated () {
|
|
614
|
+
return pool.poolsCreated;
|
|
615
|
+
}
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
/* 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/builder.ts"],"sourcesContent":["import type { Config } from '../config/index.ts';\nimport { embed } from '../features/embed.ts';\nimport { FEATURES } from '../features/index.ts';\nimport { rank } from '../features/rank.ts';\nimport type { ReconcileDelta } from '../features/types.ts';\nimport { listFiles } from '../scan/index.ts';\nimport { ParsePool } from '../scan/pool.ts';\nimport { reparseFiles } from '../scan/reparse.ts';\nimport type { EmbedChangeKind } from './embed-scope.ts';\nimport type { FeatureToggle } from './feature-scope.ts';\nimport { NARROW_FEATURE_TABLE } from './feature-scope.ts';\nimport { reconcile } from './reconcile.ts';\nimport { getColumns } from './shared.ts';\nimport { withTransaction } from './transaction.ts';\nimport type { Connection, ReconcileDialect } from './types.ts';\n\n// Owns bringing a store's index current: the write half `Store` (types.ts) deliberately does not\n// carry. A one-shot open calls build() once; a watcher calls it repeatedly on the same instance.\nexport interface Builder {\n // forcedPaths (open.ts's preset-only narrow rebuild) applies to this call alone, not future ones.\n build(forcedPaths?: ReadonlySet<string>): Promise<{ parsed: number; warnings: string[] }>;\n // Narrow embed invalidation (open.ts, embed-scope.ts's classifyEmbedChange): 'model' nulls every\n // vector/scale in place; 'chunk' rebuilds every embedding row. Neither touches another table.\n invalidate(kind: EmbedChangeKind): Promise<{ parsed: number }>;\n // Narrow feature-toggle invalidation (open.ts, feature-scope.ts's classifyFeatureToggles): a\n // toggle drops (or, turning back on, fully re-derives) that feature's own table; rank instead\n // nulls or recomputes its `_rank` column, since rows written while a feature was off are\n // untrustworthy (reconcile.ts's activeFeatures skips a disabled feature's hooks entirely).\n invalidateFeatures(toggles: FeatureToggle[]): Promise<{ parsed: number }>;\n // Releases the parse worker pool, if this lifetime ever created one; never the connection.\n close(): Promise<void>;\n // Pools this lifetime has constructed, so reuse is observable rather than inferred.\n readonly poolsCreated: number;\n}\n\n// 'model': the provider or model name moved but chunk boundaries did not, so only the vector\n// values are stale. No reparse, and no table but embeddings is touched.\nasync function nullEmbedVectors(conn: Connection, dialect: ReconcileDialect): Promise<{ parsed: number }> {\n await withTransaction(conn, () => conn.exec('UPDATE embeddings SET vector = NULL, scale = NULL'), dialect.beginMode());\n return { parsed: 0 };\n}\n\n// 'chunk': chunkTokens or the chunk version moved, so chunk boundaries genuinely changed. Rebuilds\n// every embedding row through the embed feature's own remove/store, touching no other table.\nasync function rebuildEmbeddings(conn: Connection, cfg: Config, baseDir: string, dialect: ReconcileDialect, pool: ParsePool): Promise<{ parsed: number }> {\n const existingStmt = await conn.prepare('SELECT \"path\" FROM frontmatter');\n const existingPaths = new Set((await existingStmt.all()).map((r) => (r as { path: string }).path));\n // A file added since the last build has no row yet; leaving it for build() to insert avoids a\n // primary-key collision between this INSERT and build()'s own insert for the same new file.\n const files = listFiles(cfg, baseDir).filter((f) => f.embed && existingPaths.has(f.relPath));\n if (files.length === 0) return { parsed: 0 };\n\n const { docs } = await reparseFiles(files, [embed], cfg, new Set(), undefined, { pool });\n const paths = docs.map((d) => d.relPath);\n const delta: ReconcileDelta = { files, reparsed: paths, added: [], vanished: [] };\n await withTransaction(\n conn,\n async () => {\n await embed.remove?.(conn, paths, delta);\n await embed.store?.(\n conn,\n docs.map((d) => ({ path: d.relPath, extracted: d.extracted.embed })),\n delta\n );\n },\n dialect.beginMode()\n );\n return { parsed: docs.length };\n}\n\n// One feature's own table, dropped and (turning on) fully re-derived across every indexed file.\n// Rows left over from before this feature was disabled are untrustworthy by construction (files\n// added, edited, or deleted got no remove/store for it), so this never diffs against them --\n// dropping every row and reparsing the whole tree is the only safe path back to consistent state.\nasync function invalidateFeatureTable(conn: Connection, cfg: Config, baseDir: string, dialect: ReconcileDialect, pool: ParsePool, toggle: FeatureToggle): Promise<{ parsed: number }> {\n const table = NARROW_FEATURE_TABLE[toggle.name];\n const feature = FEATURES.find((f) => f.name === toggle.name);\n if (!feature) throw new Error(`invalidateFeatureTable: no registered feature named \"${toggle.name}\"`);\n\n if (!toggle.turnedOn) {\n await withTransaction(conn, () => conn.exec(`DELETE FROM ${table}`), dialect.beginMode());\n return { parsed: 0 };\n }\n\n const files = listFiles(cfg, baseDir);\n const { docs } = await reparseFiles(files, [feature], cfg, new Set(), undefined, { pool });\n const docsForFeature = docs.map((d) => ({ path: d.relPath, extracted: d.extracted[feature.name] }));\n const paths = docs.map((d) => d.relPath);\n // Every path counts as added, not just touched: the table was just dropped, so there is nothing\n // stale to diff against, and links' own afterReconcile takes its cold-build (resolveAll) path\n // only when added.length equals files.length.\n const delta: ReconcileDelta = { files, reparsed: paths, added: paths, vanished: [] };\n await withTransaction(\n conn,\n async () => {\n await conn.exec(`DELETE FROM ${table}`);\n await feature.store?.(conn, docsForFeature, delta);\n await feature.afterReconcile?.(conn, delta);\n },\n dialect.beginMode()\n );\n return { parsed: docs.length };\n}\n\n// rank has no table of its own: frontmatter._rank is the only state it owns. Guarded on column\n// presence, since links can toggle off while rank has never been enabled for this tree.\nasync function nullRank(conn: Connection, dialect: ReconcileDialect): Promise<void> {\n const columns = await getColumns(conn);\n if (!columns.has('_rank')) return;\n await withTransaction(conn, () => conn.exec('UPDATE frontmatter SET \"_rank\" = NULL'), dialect.beginMode());\n}\n\n// Whole-tree and reparse-free: PageRank is computed from the links table, not from files, so\n// turning rank back on needs no reparseFiles pass at all.\nasync function rerunRank(conn: Connection, dialect: ReconcileDialect): Promise<void> {\n const delta: ReconcileDelta = { files: [], reparsed: [], added: [], vanished: [] };\n await withTransaction(\n conn,\n async () => {\n await rank.afterReconcile?.(conn, delta);\n },\n dialect.beginMode()\n );\n}\n\nasync function invalidateFeatureToggles(conn: Connection, cfg: Config, baseDir: string, dialect: ReconcileDialect, pool: ParsePool, toggles: FeatureToggle[]): Promise<{ parsed: number }> {\n const byName = new Map(toggles.map((toggle) => [toggle.name, toggle]));\n let parsed = 0;\n\n // links first, if present: rank's rerun below (whether from its own toggle or the co-change\n // rankToggle carries) must read the links table after it is back in its new state.\n const linksToggle = byName.get('links');\n if (linksToggle) {\n parsed += (await invalidateFeatureTable(conn, cfg, baseDir, dialect, pool, linksToggle)).parsed;\n // Unconditional, per rank's dependency on links: nulling is a no-op (guarded) when rank was\n // never enabled for this tree, so this is safe even when no feature:rank segment changed.\n if (!linksToggle.turnedOn) await nullRank(conn, dialect);\n }\n\n // rank's effective on/off (featureEnabled's links dependency) only appears as a changed\n // `feature:rank` segment when it actually flips -- whether that's rank's own config or a\n // links toggle taking it along -- so honoring it here is complete on its own.\n const rankToggle = byName.get('rank');\n if (rankToggle) {\n if (rankToggle.turnedOn) await rerunRank(conn, dialect);\n else await nullRank(conn, dialect);\n }\n\n for (const toggle of toggles) {\n if (toggle.name === 'links' || toggle.name === 'rank') continue;\n parsed += (await invalidateFeatureTable(conn, cfg, baseDir, dialect, pool, toggle)).parsed;\n }\n return { parsed };\n}\n\n// The pool is created at most once, lazily, on whichever build() or invalidate() call first\n// needs it, and reused by every later call on this instance.\nexport function createBuilder(conn: Connection, cfg: Config, baseDir: string, dialect: ReconcileDialect): Builder {\n const pool = new ParsePool();\n return {\n build: (forcedPaths) => reconcile(conn, cfg, baseDir, dialect, pool, forcedPaths),\n invalidate: (kind) => (kind === 'model' ? nullEmbedVectors(conn, dialect) : rebuildEmbeddings(conn, cfg, baseDir, dialect, pool)),\n invalidateFeatures: (toggles) => invalidateFeatureToggles(conn, cfg, baseDir, dialect, pool, toggles),\n close: () => pool.close(),\n get poolsCreated() {\n return pool.poolsCreated;\n },\n };\n}\n"],"names":["createBuilder","nullEmbedVectors","conn","dialect","withTransaction","exec","beginMode","parsed","rebuildEmbeddings","cfg","baseDir","pool","existingStmt","existingPaths","files","docs","paths","delta","prepare","Set","all","map","r","path","listFiles","filter","f","embed","has","relPath","length","reparseFiles","undefined","d","reparsed","added","vanished","remove","store","extracted","invalidateFeatureTable","toggle","table","feature","docsForFeature","NARROW_FEATURE_TABLE","name","FEATURES","find","Error","turnedOn","afterReconcile","nullRank","columns","getColumns","rerunRank","rank","invalidateFeatureToggles","toggles","byName","linksToggle","rankToggle","Map","get","ParsePool","build","forcedPaths","reconcile","invalidate","kind","invalidateFeatures","close","poolsCreated"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import type { Connection, LexicalHit, LexicalQueryOptions } from '../types.js';
|
|
|
2
2
|
interface FtsIndexState {
|
|
3
3
|
stale: boolean;
|
|
4
4
|
}
|
|
5
|
+
export declare function markContentStale(conn: Connection): void;
|
|
5
6
|
export declare function queryLexical(conn: Connection, terms: string, opts: LexicalQueryOptions, state: FtsIndexState): Promise<LexicalHit[]>;
|
|
6
7
|
export declare function createLexicalIndex(conn: Connection): {
|
|
7
8
|
query: (terms: string, opts: LexicalQueryOptions) => Promise<LexicalHit[]>;
|
|
@@ -2,6 +2,7 @@ import type { Connection, LexicalHit, LexicalQueryOptions } from '../types.js';
|
|
|
2
2
|
interface FtsIndexState {
|
|
3
3
|
stale: boolean;
|
|
4
4
|
}
|
|
5
|
+
export declare function markContentStale(conn: Connection): void;
|
|
5
6
|
export declare function queryLexical(conn: Connection, terms: string, opts: LexicalQueryOptions, state: FtsIndexState): Promise<LexicalHit[]>;
|
|
6
7
|
export declare function createLexicalIndex(conn: Connection): {
|
|
7
8
|
query: (terms: string, opts: LexicalQueryOptions) => Promise<LexicalHit[]>;
|