sensemaking 0.27.1 → 0.28.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/bin/cli.js +16 -7
- package/dist/cjs/cli/constants.d.cts +2 -0
- package/dist/cjs/cli/constants.d.ts +2 -0
- package/dist/cjs/cli/constants.js +21 -0
- package/dist/cjs/cli/constants.js.map +1 -0
- package/dist/cjs/cli/named.js +2 -1
- package/dist/cjs/cli/named.js.map +1 -1
- package/dist/cjs/cli/shared.js +5 -4
- package/dist/cjs/cli/shared.js.map +1 -1
- package/dist/cjs/cli.js +10 -9
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/embed/query.js.map +1 -1
- package/dist/cjs/store/duckdb/engine.d.cts +11 -0
- package/dist/cjs/store/duckdb/engine.d.ts +11 -0
- package/dist/cjs/store/duckdb/engine.js +193 -0
- package/dist/cjs/store/duckdb/engine.js.map +1 -0
- package/dist/cjs/store/duckdb/lexical.js +34 -20
- package/dist/cjs/store/duckdb/lexical.js.map +1 -1
- package/dist/cjs/store/duckdb/native.d.cts +5 -2
- package/dist/cjs/store/duckdb/native.d.ts +5 -2
- package/dist/cjs/store/duckdb/native.js +157 -13
- package/dist/cjs/store/duckdb/native.js.map +1 -1
- package/dist/cjs/store/duckdb/open.js +151 -3
- package/dist/cjs/store/duckdb/open.js.map +1 -1
- package/dist/cjs/store/duckdb/ordered-bm25.d.cts +3 -3
- package/dist/cjs/store/duckdb/ordered-bm25.d.ts +3 -3
- package/dist/cjs/store/duckdb/ordered-bm25.js +4 -8
- package/dist/cjs/store/duckdb/ordered-bm25.js.map +1 -1
- package/dist/cjs/store/engine.d.cts +28 -0
- package/dist/cjs/store/engine.d.ts +28 -0
- package/dist/cjs/store/engine.js +362 -0
- package/dist/cjs/store/engine.js.map +1 -0
- package/dist/cjs/store/native.d.cts +8 -5
- package/dist/cjs/store/native.d.ts +8 -5
- package/dist/cjs/store/native.js +78 -73
- package/dist/cjs/store/native.js.map +1 -1
- package/dist/cjs/store/open.js +100 -40
- package/dist/cjs/store/open.js.map +1 -1
- package/dist/cjs/store/sqlite/engine.d.cts +12 -0
- package/dist/cjs/store/sqlite/engine.d.ts +12 -0
- package/dist/cjs/store/sqlite/engine.js +53 -0
- package/dist/cjs/store/sqlite/engine.js.map +1 -0
- package/dist/cjs/store/sqlite/lexical.js +3 -4
- package/dist/cjs/store/sqlite/lexical.js.map +1 -1
- package/dist/cjs/store/sqlite/open.js +119 -6
- package/dist/cjs/store/sqlite/open.js.map +1 -1
- package/dist/cjs/store/turso/engine.d.cts +9 -0
- package/dist/cjs/store/turso/engine.d.ts +9 -0
- package/dist/cjs/store/turso/engine.js +189 -0
- package/dist/cjs/store/turso/engine.js.map +1 -0
- package/dist/cjs/store/turso/lexical.js +16 -11
- package/dist/cjs/store/turso/lexical.js.map +1 -1
- package/dist/cjs/store/turso/native.d.cts +5 -1
- package/dist/cjs/store/turso/native.d.ts +5 -1
- package/dist/cjs/store/turso/native.js +157 -8
- package/dist/cjs/store/turso/native.js.map +1 -1
- package/dist/cjs/store/turso/open.js +172 -27
- package/dist/cjs/store/turso/open.js.map +1 -1
- package/dist/cjs/store/turso/reconcile.d.cts +0 -1
- package/dist/cjs/store/turso/reconcile.d.ts +0 -1
- package/dist/cjs/store/turso/reconcile.js +22 -23
- package/dist/cjs/store/turso/reconcile.js.map +1 -1
- package/dist/cjs/store/types.d.cts +2 -0
- package/dist/cjs/store/types.d.ts +2 -0
- package/dist/cjs/store/types.js.map +1 -1
- package/dist/esm/cli/constants.d.ts +2 -0
- package/dist/esm/cli/constants.js +2 -0
- package/dist/esm/cli/constants.js.map +1 -0
- package/dist/esm/cli/named.js +2 -1
- package/dist/esm/cli/named.js.map +1 -1
- package/dist/esm/cli/shared.js +6 -5
- package/dist/esm/cli/shared.js.map +1 -1
- package/dist/esm/cli.js +10 -9
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/embed/query.js +1 -1
- package/dist/esm/embed/query.js.map +1 -1
- package/dist/esm/store/duckdb/engine.d.ts +11 -0
- package/dist/esm/store/duckdb/engine.js +18 -0
- package/dist/esm/store/duckdb/engine.js.map +1 -0
- package/dist/esm/store/duckdb/lexical.js +11 -11
- package/dist/esm/store/duckdb/lexical.js.map +1 -1
- package/dist/esm/store/duckdb/native.d.ts +5 -2
- package/dist/esm/store/duckdb/native.js +16 -12
- package/dist/esm/store/duckdb/native.js.map +1 -1
- package/dist/esm/store/duckdb/open.js +40 -2
- package/dist/esm/store/duckdb/open.js.map +1 -1
- package/dist/esm/store/duckdb/ordered-bm25.d.ts +3 -3
- package/dist/esm/store/duckdb/ordered-bm25.js +4 -9
- package/dist/esm/store/duckdb/ordered-bm25.js.map +1 -1
- package/dist/esm/store/engine.d.ts +28 -0
- package/dist/esm/store/engine.js +85 -0
- package/dist/esm/store/engine.js.map +1 -0
- package/dist/esm/store/native.d.ts +8 -5
- package/dist/esm/store/native.js +59 -57
- package/dist/esm/store/native.js.map +1 -1
- package/dist/esm/store/open.js +24 -7
- package/dist/esm/store/open.js.map +1 -1
- package/dist/esm/store/sqlite/engine.d.ts +12 -0
- package/dist/esm/store/sqlite/engine.js +16 -0
- package/dist/esm/store/sqlite/engine.js.map +1 -0
- package/dist/esm/store/sqlite/lexical.js +2 -3
- package/dist/esm/store/sqlite/lexical.js.map +1 -1
- package/dist/esm/store/sqlite/open.js +38 -7
- package/dist/esm/store/sqlite/open.js.map +1 -1
- package/dist/esm/store/turso/engine.d.ts +9 -0
- package/dist/esm/store/turso/engine.js +14 -0
- package/dist/esm/store/turso/engine.js.map +1 -0
- package/dist/esm/store/turso/lexical.js +9 -9
- package/dist/esm/store/turso/lexical.js.map +1 -1
- package/dist/esm/store/turso/native.d.ts +5 -1
- package/dist/esm/store/turso/native.js +16 -10
- package/dist/esm/store/turso/native.js.map +1 -1
- package/dist/esm/store/turso/open.js +44 -3
- package/dist/esm/store/turso/open.js.map +1 -1
- package/dist/esm/store/turso/reconcile.d.ts +0 -1
- package/dist/esm/store/turso/reconcile.js +3 -8
- package/dist/esm/store/turso/reconcile.js.map +1 -1
- package/dist/esm/store/types.d.ts +2 -0
- package/dist/esm/store/types.js.map +1 -1
- package/package.json +21 -6
- package/skills/sense/SKILL.md +1 -1
- package/skills/sense/references/stores/duckdb.md +1 -1
- package/skills/sense/references/stores/sqlite.md +1 -1
- package/skills/sense/references/stores/turso.md +1 -1
- package/skills/sense-setup/references/stores/duckdb.md +1 -1
- package/skills/sense-setup/references/stores/sqlite.md +1 -1
|
@@ -9,28 +9,172 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
get DUCKDB_INSTALL_SPEC () {
|
|
13
|
-
return DUCKDB_INSTALL_SPEC;
|
|
14
|
-
},
|
|
15
12
|
get DUCKDB_PACKAGE () {
|
|
16
13
|
return DUCKDB_PACKAGE;
|
|
17
14
|
},
|
|
18
15
|
get duckdbApi () {
|
|
19
16
|
return duckdbApi;
|
|
17
|
+
},
|
|
18
|
+
get duckdbNative () {
|
|
19
|
+
return duckdbNative;
|
|
20
20
|
}
|
|
21
21
|
});
|
|
22
22
|
var _nativets = require("../native.js");
|
|
23
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
24
|
+
try {
|
|
25
|
+
var info = gen[key](arg);
|
|
26
|
+
var value = info.value;
|
|
27
|
+
} catch (error) {
|
|
28
|
+
reject(error);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
if (info.done) resolve(value);
|
|
32
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
33
|
+
}
|
|
34
|
+
function _async_to_generator(fn) {
|
|
35
|
+
return function() {
|
|
36
|
+
var self = this, args = arguments;
|
|
37
|
+
return new Promise(function(resolve, reject) {
|
|
38
|
+
var gen = fn.apply(self, args);
|
|
39
|
+
function _next(value) {
|
|
40
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
41
|
+
}
|
|
42
|
+
function _throw(err) {
|
|
43
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
44
|
+
}
|
|
45
|
+
_next(undefined);
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function _ts_generator(thisArg, body) {
|
|
50
|
+
var f, y, t, _ = {
|
|
51
|
+
label: 0,
|
|
52
|
+
sent: function() {
|
|
53
|
+
if (t[0] & 1) throw t[1];
|
|
54
|
+
return t[1];
|
|
55
|
+
},
|
|
56
|
+
trys: [],
|
|
57
|
+
ops: []
|
|
58
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
|
|
59
|
+
return d(g, "next", {
|
|
60
|
+
value: verb(0)
|
|
61
|
+
}), d(g, "throw", {
|
|
62
|
+
value: verb(1)
|
|
63
|
+
}), d(g, "return", {
|
|
64
|
+
value: verb(2)
|
|
65
|
+
}), typeof Symbol === "function" && d(g, Symbol.iterator, {
|
|
66
|
+
value: function() {
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
}), g;
|
|
70
|
+
function verb(n) {
|
|
71
|
+
return function(v) {
|
|
72
|
+
return step([
|
|
73
|
+
n,
|
|
74
|
+
v
|
|
75
|
+
]);
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
function step(op) {
|
|
79
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
80
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
81
|
+
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;
|
|
82
|
+
if (y = 0, t) op = [
|
|
83
|
+
op[0] & 2,
|
|
84
|
+
t.value
|
|
85
|
+
];
|
|
86
|
+
switch(op[0]){
|
|
87
|
+
case 0:
|
|
88
|
+
case 1:
|
|
89
|
+
t = op;
|
|
90
|
+
break;
|
|
91
|
+
case 4:
|
|
92
|
+
_.label++;
|
|
93
|
+
return {
|
|
94
|
+
value: op[1],
|
|
95
|
+
done: false
|
|
96
|
+
};
|
|
97
|
+
case 5:
|
|
98
|
+
_.label++;
|
|
99
|
+
y = op[1];
|
|
100
|
+
op = [
|
|
101
|
+
0
|
|
102
|
+
];
|
|
103
|
+
continue;
|
|
104
|
+
case 7:
|
|
105
|
+
op = _.ops.pop();
|
|
106
|
+
_.trys.pop();
|
|
107
|
+
continue;
|
|
108
|
+
default:
|
|
109
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
110
|
+
_ = 0;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
114
|
+
_.label = op[1];
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
118
|
+
_.label = t[1];
|
|
119
|
+
t = op;
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
if (t && _.label < t[2]) {
|
|
123
|
+
_.label = t[2];
|
|
124
|
+
_.ops.push(op);
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
if (t[2]) _.ops.pop();
|
|
128
|
+
_.trys.pop();
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
op = body.call(thisArg, _);
|
|
132
|
+
} catch (e) {
|
|
133
|
+
op = [
|
|
134
|
+
6,
|
|
135
|
+
e
|
|
136
|
+
];
|
|
137
|
+
y = 0;
|
|
138
|
+
} finally{
|
|
139
|
+
f = t = 0;
|
|
140
|
+
}
|
|
141
|
+
if (op[0] & 5) throw op[1];
|
|
142
|
+
return {
|
|
143
|
+
value: op[0] ? op[1] : void 0,
|
|
144
|
+
done: true
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
}
|
|
23
148
|
var DUCKDB_PACKAGE = '@duckdb/node-api';
|
|
24
|
-
var
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
149
|
+
var duckdbNativePromise;
|
|
150
|
+
function duckdbNative() {
|
|
151
|
+
if (!duckdbNativePromise) {
|
|
152
|
+
var descriptor = {
|
|
153
|
+
store: 'duckdb',
|
|
154
|
+
pkg: DUCKDB_PACKAGE,
|
|
155
|
+
sizeHint: '~110MB',
|
|
156
|
+
range: (0, _nativets.peerRange)(DUCKDB_PACKAGE)
|
|
157
|
+
};
|
|
158
|
+
duckdbNativePromise = (0, _nativets.loadOrInstall)(descriptor, (0, _nativets.packageNodeModules)());
|
|
159
|
+
}
|
|
160
|
+
return duckdbNativePromise;
|
|
161
|
+
}
|
|
32
162
|
function duckdbApi() {
|
|
33
|
-
|
|
34
|
-
|
|
163
|
+
return _async_to_generator(function() {
|
|
164
|
+
return _ts_generator(this, function(_state) {
|
|
165
|
+
switch(_state.label){
|
|
166
|
+
case 0:
|
|
167
|
+
return [
|
|
168
|
+
4,
|
|
169
|
+
duckdbNative()
|
|
170
|
+
];
|
|
171
|
+
case 1:
|
|
172
|
+
return [
|
|
173
|
+
2,
|
|
174
|
+
_state.sent().api
|
|
175
|
+
];
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
})();
|
|
35
179
|
}
|
|
36
180
|
/* 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; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/sensemaking/src/store/duckdb/native.ts"],"sourcesContent":["import { loadOrInstall, type NativeDescriptor, packageNodeModules } from '../native.ts';\n\nexport const DUCKDB_PACKAGE = '@duckdb/node-api';\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/sensemaking/src/store/duckdb/native.ts"],"sourcesContent":["import { loadOrInstall, type NativeDescriptor, type NativeModule, packageNodeModules, peerRange } from '../native.ts';\n\nexport const DUCKDB_PACKAGE = '@duckdb/node-api';\n\ntype DuckdbApi = typeof import('@duckdb/node-api');\n\nlet duckdbNativePromise: Promise<NativeModule<DuckdbApi>> | undefined;\n\n// The one accessor every consumer of @duckdb/node-api must go through: after a fresh install in this process, Node keeps returning\n// the pre-install \"not found\" miss to any new bare-specifier lookup of the same path, so caching the resolved module here means only the first caller ever resolves it.\nexport function duckdbNative(): Promise<NativeModule<DuckdbApi>> {\n if (!duckdbNativePromise) {\n const descriptor: NativeDescriptor = { store: 'duckdb', pkg: DUCKDB_PACKAGE, sizeHint: '~110MB', range: peerRange(DUCKDB_PACKAGE) };\n duckdbNativePromise = loadOrInstall<DuckdbApi>(descriptor, packageNodeModules());\n }\n return duckdbNativePromise;\n}\n\nexport async function duckdbApi(): Promise<DuckdbApi> {\n return (await duckdbNative()).api;\n}\n"],"names":["DUCKDB_PACKAGE","duckdbApi","duckdbNative","duckdbNativePromise","descriptor","store","pkg","sizeHint","range","peerRange","loadOrInstall","packageNodeModules","api"],"mappings":";;;;;;;;;;;QAEaA;eAAAA;;QAgBSC;eAAAA;;QARNC;eAAAA;;;wBAVuF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEhG,IAAMF,iBAAiB;AAI9B,IAAIG;AAIG,SAASD;IACd,IAAI,CAACC,qBAAqB;QACxB,IAAMC,aAA+B;YAAEC,OAAO;YAAUC,KAAKN;YAAgBO,UAAU;YAAUC,OAAOC,IAAAA,mBAAS,EAACT;QAAgB;QAClIG,sBAAsBO,IAAAA,uBAAa,EAAYN,YAAYO,IAAAA,4BAAkB;IAC/E;IACA,OAAOR;AACT;AAEO,SAAeF;;;;;oBACZ;;wBAAMC;;;oBAAd;;wBAAQ,cAAsBU,GAAG;;;;IACnC"}
|
|
@@ -25,11 +25,13 @@ _export(exports, {
|
|
|
25
25
|
var _typests = require("../../embed/types.js");
|
|
26
26
|
var _errorsts = require("../../errors.js");
|
|
27
27
|
var _indexts = require("../../features/index.js");
|
|
28
|
+
var _enginets = require("../engine.js");
|
|
29
|
+
var _nativets = require("../native.js");
|
|
28
30
|
var _opents = require("../open.js");
|
|
29
31
|
var _sharedts = require("../shared.js");
|
|
30
32
|
var _connectionts = require("./connection.js");
|
|
31
33
|
var _lexicalts = require("./lexical.js");
|
|
32
|
-
var
|
|
34
|
+
var _nativets1 = require("./native.js");
|
|
33
35
|
var _reconcilets = require("./reconcile.js");
|
|
34
36
|
var _sqlfunctionsts = require("./sql-functions.js");
|
|
35
37
|
var _storets = require("./store.js");
|
|
@@ -358,7 +360,7 @@ function connect(dbPath, _cfg, options) {
|
|
|
358
360
|
]);
|
|
359
361
|
return [
|
|
360
362
|
4,
|
|
361
|
-
(0,
|
|
363
|
+
(0, _nativets1.duckdbApi)()
|
|
362
364
|
];
|
|
363
365
|
case 1:
|
|
364
366
|
DuckDBInstance = _state.sent().DuckDBInstance;
|
|
@@ -369,7 +371,7 @@ function connect(dbPath, _cfg, options) {
|
|
|
369
371
|
case 2:
|
|
370
372
|
err = _state.sent();
|
|
371
373
|
if (_instanceof(err, _errorsts.SenseError)) throw err;
|
|
372
|
-
throw new _errorsts.SenseError('STORE_DEPENDENCY_MISSING', 'store "duckdb" needs the '.concat(
|
|
374
|
+
throw new _errorsts.SenseError('STORE_DEPENDENCY_MISSING', 'store "duckdb" needs the '.concat(_nativets1.DUCKDB_PACKAGE, " package (").concat(err.message, ")"));
|
|
373
375
|
case 3:
|
|
374
376
|
_state.trys.push([
|
|
375
377
|
3,
|
|
@@ -448,6 +450,150 @@ function connect(dbPath, _cfg, options) {
|
|
|
448
450
|
});
|
|
449
451
|
})();
|
|
450
452
|
}
|
|
453
|
+
function duckdbEngineIdentity() {
|
|
454
|
+
return _async_to_generator(function() {
|
|
455
|
+
var _tmp;
|
|
456
|
+
return _ts_generator(this, function(_state) {
|
|
457
|
+
switch(_state.label){
|
|
458
|
+
case 0:
|
|
459
|
+
_tmp = [
|
|
460
|
+
_nativets1.DUCKDB_PACKAGE
|
|
461
|
+
];
|
|
462
|
+
return [
|
|
463
|
+
4,
|
|
464
|
+
(0, _nativets1.duckdbNative)()
|
|
465
|
+
];
|
|
466
|
+
case 1:
|
|
467
|
+
return [
|
|
468
|
+
2,
|
|
469
|
+
_enginets.engineIdentity.apply(void 0, _tmp.concat([
|
|
470
|
+
_state.sent().version
|
|
471
|
+
]))
|
|
472
|
+
];
|
|
473
|
+
}
|
|
474
|
+
});
|
|
475
|
+
})();
|
|
476
|
+
}
|
|
477
|
+
// The real schema, index build and lexical query over store/engine.ts's fixture, in memory.
|
|
478
|
+
function checkDuckdbEngine() {
|
|
479
|
+
return _async_to_generator(function() {
|
|
480
|
+
var _ref, api, version, instance, handle, _tmp, conn;
|
|
481
|
+
return _ts_generator(this, function(_state) {
|
|
482
|
+
switch(_state.label){
|
|
483
|
+
case 0:
|
|
484
|
+
return [
|
|
485
|
+
4,
|
|
486
|
+
(0, _nativets1.duckdbNative)()
|
|
487
|
+
];
|
|
488
|
+
case 1:
|
|
489
|
+
_ref = _state.sent(), api = _ref.api, version = _ref.version;
|
|
490
|
+
return [
|
|
491
|
+
4,
|
|
492
|
+
api.DuckDBInstance.create(':memory:')
|
|
493
|
+
];
|
|
494
|
+
case 2:
|
|
495
|
+
instance = _state.sent();
|
|
496
|
+
_tmp = {
|
|
497
|
+
instance: instance
|
|
498
|
+
};
|
|
499
|
+
return [
|
|
500
|
+
4,
|
|
501
|
+
instance.connect()
|
|
502
|
+
];
|
|
503
|
+
case 3:
|
|
504
|
+
handle = (_tmp.duckdb = _state.sent(), _tmp);
|
|
505
|
+
_state.label = 4;
|
|
506
|
+
case 4:
|
|
507
|
+
_state.trys.push([
|
|
508
|
+
4,
|
|
509
|
+
,
|
|
510
|
+
9,
|
|
511
|
+
11
|
|
512
|
+
]);
|
|
513
|
+
conn = (0, _connectionts.createConnection)(handle.duckdb);
|
|
514
|
+
return [
|
|
515
|
+
4,
|
|
516
|
+
conn.exec('CREATE TABLE meta (key TEXT PRIMARY KEY, value TEXT)')
|
|
517
|
+
];
|
|
518
|
+
case 5:
|
|
519
|
+
_state.sent();
|
|
520
|
+
return [
|
|
521
|
+
4,
|
|
522
|
+
ensureCoreSchema(handle, conn)
|
|
523
|
+
];
|
|
524
|
+
case 6:
|
|
525
|
+
_state.sent();
|
|
526
|
+
return [
|
|
527
|
+
4,
|
|
528
|
+
conn.runBatch('INSERT INTO content ("path", title, summary, text) VALUES (?, ?, ?, ?)', _enginets.ENGINE_CHECK_DOCS.map(function(doc) {
|
|
529
|
+
return [
|
|
530
|
+
doc.path,
|
|
531
|
+
doc.title,
|
|
532
|
+
doc.summary,
|
|
533
|
+
doc.text
|
|
534
|
+
];
|
|
535
|
+
}))
|
|
536
|
+
];
|
|
537
|
+
case 7:
|
|
538
|
+
_state.sent();
|
|
539
|
+
return [
|
|
540
|
+
4,
|
|
541
|
+
(0, _enginets.checkEngine)('duckdb', (0, _enginets.engineIdentity)(_nativets1.DUCKDB_PACKAGE, version), (0, _enginets.npmRemedy)(_nativets1.DUCKDB_PACKAGE, (0, _nativets.peerRange)(_nativets1.DUCKDB_PACKAGE)), function(terms) {
|
|
542
|
+
return _async_to_generator(function() {
|
|
543
|
+
return _ts_generator(this, function(_state) {
|
|
544
|
+
switch(_state.label){
|
|
545
|
+
case 0:
|
|
546
|
+
return [
|
|
547
|
+
4,
|
|
548
|
+
(0, _lexicalts.prepareFts)(conn)
|
|
549
|
+
];
|
|
550
|
+
case 1:
|
|
551
|
+
_state.sent();
|
|
552
|
+
return [
|
|
553
|
+
4,
|
|
554
|
+
(0, _lexicalts.queryLexical)(conn, terms, {
|
|
555
|
+
whereJoin: '',
|
|
556
|
+
whereCond: '',
|
|
557
|
+
scopeCond: '',
|
|
558
|
+
limit: 10
|
|
559
|
+
})
|
|
560
|
+
];
|
|
561
|
+
case 2:
|
|
562
|
+
return [
|
|
563
|
+
2,
|
|
564
|
+
_state.sent().map(function(hit) {
|
|
565
|
+
return hit.path;
|
|
566
|
+
})
|
|
567
|
+
];
|
|
568
|
+
}
|
|
569
|
+
});
|
|
570
|
+
})();
|
|
571
|
+
})
|
|
572
|
+
];
|
|
573
|
+
case 8:
|
|
574
|
+
_state.sent();
|
|
575
|
+
return [
|
|
576
|
+
3,
|
|
577
|
+
11
|
|
578
|
+
];
|
|
579
|
+
case 9:
|
|
580
|
+
return [
|
|
581
|
+
4,
|
|
582
|
+
close(handle)
|
|
583
|
+
];
|
|
584
|
+
case 10:
|
|
585
|
+
_state.sent();
|
|
586
|
+
return [
|
|
587
|
+
7
|
|
588
|
+
];
|
|
589
|
+
case 11:
|
|
590
|
+
return [
|
|
591
|
+
2
|
|
592
|
+
];
|
|
593
|
+
}
|
|
594
|
+
});
|
|
595
|
+
})();
|
|
596
|
+
}
|
|
451
597
|
var duckdbOpenDialect = {
|
|
452
598
|
filename: DB_FILENAME,
|
|
453
599
|
schemaVersion: SCHEMA_VERSION,
|
|
@@ -460,6 +606,8 @@ var duckdbOpenDialect = {
|
|
|
460
606
|
isLocked: function isLocked(err) {
|
|
461
607
|
return /Could not set lock on file|being used by another process/.test(err.message);
|
|
462
608
|
},
|
|
609
|
+
engineIdentity: duckdbEngineIdentity,
|
|
610
|
+
checkEngine: checkDuckdbEngine,
|
|
463
611
|
ensureCoreSchema: ensureCoreSchema,
|
|
464
612
|
ensureFeatureSchema: ensureFeatureSchema,
|
|
465
613
|
prepareConnection: prepareConnection,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/sensemaking/src/store/duckdb/open.ts"],"sourcesContent":["import type { DuckDBConnection, DuckDBInstance } from '@duckdb/node-api';\nimport type { Config, ResolvedConfig } from '../../config/index.ts';\nimport { STORE_DIMS } from '../../embed/types.ts';\nimport { SenseError } from '../../errors.ts';\nimport { activeFeatures } from '../../features/index.ts';\nimport type { InternalOpenOptions, OpenResult } from '../open.ts';\nimport { openWithDialect } from '../open.ts';\nimport { getMeta, setMeta } from '../shared.ts';\nimport type { Connection, OpenDialect } from '../types.ts';\nimport { createConnection } from './connection.ts';\nimport { assertFtsReady, prepareFts } from './lexical.ts';\nimport { DUCKDB_PACKAGE, duckdbApi } from './native.ts';\nimport { duckdbDialect } from './reconcile.ts';\nimport { registerFunctions } from './sql-functions.ts';\nimport { createStore } from './store.ts';\nimport { createVectorWriteStage } from './vectors.ts';\n\nexport const DB_FILENAME = 'cache.duckdb';\n// Independent of sqlite's SCHEMA_VERSION -- the two stores' cache shapes evolve separately (VARIANT frontmatter columns vs untyped).\n// The store name already joins the feature signature, so switching a config's `store` key rebuilds rather than reusing the other engine's cache.\nexport const SCHEMA_VERSION = '6';\n\nexport type { OpenResult };\n\n// The connection plus this store's own native handles (types.ts's OpenDialect<Handle>): the\n// instance owns the WAL and must outlive the connection borrowed from it.\ninterface DuckdbHandle {\n instance: DuckDBInstance;\n duckdb: DuckDBConnection;\n}\n\n// `content` is a plain table (not FTS-virtual): build prepares the persistent FTS index over it,\n// while contains() verification reads the table directly.\n// No tokenizer resolution: this store always uses the fts extension's default (porter) stemmer.\nasync function ensureCoreSchema(_handle: DuckdbHandle, conn: Connection): Promise<void> {\n await conn.exec(`CREATE TABLE IF NOT EXISTS frontmatter (\"path\" TEXT PRIMARY KEY, \"_mtime\" DOUBLE, \"_ctime\" DOUBLE, \"_size\" INTEGER, \"_parse_error\" TEXT)`);\n await conn.exec(`CREATE TABLE IF NOT EXISTS content (\"path\" TEXT PRIMARY KEY, title TEXT, summary TEXT, text TEXT)`);\n await conn.exec(`CREATE TABLE IF NOT EXISTS indexed_sources (\"path\" TEXT PRIMARY KEY, text TEXT NOT NULL)`);\n await conn.exec(`CREATE TABLE IF NOT EXISTS preset_files (\"path\" TEXT, preset TEXT, PRIMARY KEY (\"path\", preset))`);\n await conn.exec('CREATE INDEX IF NOT EXISTS preset_files_preset ON preset_files(preset)');\n if ((await getMeta(conn, 'schema_version')) === null) await setMeta(conn, 'schema_version', SCHEMA_VERSION);\n}\n\nasync function ensureFeatureSchema(_handle: DuckdbHandle, conn: Connection, cfg: Config): Promise<void> {\n for (const feature of activeFeatures(cfg)) {\n // Native FLOAT[STORE_DIMS] instead of the embed feature's engine-neutral BLOB+scale DDL (vectors.ts). `scale` is kept, unused,\n // so the feature's shared reconcile-time INSERT/DELETE (features/embed.ts) names a column that exists on both stores.\n if (feature.name === 'embed') {\n await conn.exec(`CREATE TABLE IF NOT EXISTS embeddings (\"path\" TEXT, chunk INTEGER, start_line INTEGER, end_line INTEGER, content_identity TEXT NOT NULL, scale REAL, vector FLOAT[${STORE_DIMS}], PRIMARY KEY (\"path\", chunk))`);\n continue;\n }\n await feature.schema(conn);\n }\n}\n\nasync function prepareConnection(handle: DuckdbHandle, _conn: Connection, _cfg: Config): Promise<void> {\n await createVectorWriteStage(handle.duckdb, STORE_DIMS);\n}\n\n// Order matters: the connection must be gone before the instance closes the WAL.\nasync function close(handle: DuckdbHandle): Promise<void> {\n handle.duckdb.disconnectSync();\n handle.instance.closeSync();\n}\n\nasync function connect(dbPath: string, _cfg: ResolvedConfig, options: { existingOnly: boolean; observational: boolean }): Promise<{ handle: DuckdbHandle; conn: Connection }> {\n // Dynamic, not a top-level import: sqlite trees must never attempt to resolve this optional peer dependency, so nothing imports\n // it as a value until a duckdb tree opens (types-only imports are erased). Installed on first use if missing, shared with sql-functions.ts and vectors.ts via native.ts's duckdbApi.\n let DuckDBInstance: typeof import('@duckdb/node-api').DuckDBInstance;\n try {\n ({ DuckDBInstance } = await duckdbApi());\n } catch (err) {\n if (err instanceof SenseError) throw err;\n throw new SenseError('STORE_DEPENDENCY_MISSING', `store \"duckdb\" needs the ${DUCKDB_PACKAGE} package (${(err as Error).message})`);\n }\n\n let duckdb: DuckDBConnection;\n let instance: DuckDBInstance | undefined;\n try {\n // On-disk files default to an older storage format for cross-version compatibility, which rejects VARIANT columns (\"VARIANT\n // columns are not supported in storage versions prior to v1.5.0\"); this store's dynamic frontmatter columns need VARIANT (reconcile.ts), so the floor is pinned explicitly.\n instance = await DuckDBInstance.create(dbPath, options.observational ? { access_mode: 'READ_ONLY' } : { storage_compatibility_version: 'v1.5.0' });\n duckdb = await instance.connect();\n } catch (err) {\n // create() may have succeeded before connect() failed: close it, or its WAL stays open.\n instance?.closeSync();\n throw new SenseError('STORE_DEPENDENCY_MISSING', `store \"duckdb\" failed to open ${dbPath}: ${(err as Error).message}`);\n }\n // A throw below would leak the open instance, whose WAL then locks the .duckdb file undeletable on Windows.\n try {\n await registerFunctions(duckdb);\n const conn = createConnection(duckdb);\n return { handle: { instance, duckdb }, conn };\n } catch (err) {\n await close({ instance, duckdb });\n throw err;\n }\n}\n\n// This store's dialect (types.ts's OpenDialect) for the shared orchestration in store/open.ts.\nexport const duckdbOpenDialect: OpenDialect<DuckdbHandle> = {\n filename: DB_FILENAME,\n schemaVersion: SCHEMA_VERSION,\n reconcileDialect: duckdbDialect,\n connect,\n close,\n // duckdb's file lock spans the connection's life, and each platform words the refusal its own\n // way: posix \"Could not set lock on file ... Conflicting lock is held in <exe> (PID n)\", Windows\n // \"Cannot open file ... being used by another process\". Both are the same condition.\n isLocked: (err) => /Could not set lock on file|being used by another process/.test(err.message),\n ensureCoreSchema,\n ensureFeatureSchema,\n prepareConnection,\n prepareLexical: prepareFts,\n assertLexicalReady: assertFtsReady,\n createStore: (handle, conn) => createStore(handle.instance, handle.duckdb, conn),\n};\n\nexport async function openDuckdb(cfg: ResolvedConfig, options?: InternalOpenOptions): Promise<OpenResult> {\n return openWithDialect(cfg, duckdbOpenDialect, options);\n}\n"],"names":["DB_FILENAME","SCHEMA_VERSION","duckdbOpenDialect","openDuckdb","ensureCoreSchema","_handle","conn","exec","getMeta","setMeta","ensureFeatureSchema","cfg","feature","activeFeatures","name","STORE_DIMS","schema","prepareConnection","handle","_conn","_cfg","createVectorWriteStage","duckdb","close","disconnectSync","instance","closeSync","connect","dbPath","options","DuckDBInstance","err","duckdbApi","SenseError","DUCKDB_PACKAGE","message","create","observational","access_mode","storage_compatibility_version","registerFunctions","createConnection","filename","schemaVersion","reconcileDialect","duckdbDialect","isLocked","test","prepareLexical","prepareFts","assertLexicalReady","assertFtsReady","createStore","openWithDialect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/sensemaking/src/store/duckdb/open.ts"],"sourcesContent":["import type { DuckDBConnection, DuckDBInstance } from '@duckdb/node-api';\nimport type { Config, ResolvedConfig } from '../../config/index.ts';\nimport { STORE_DIMS } from '../../embed/types.ts';\nimport { SenseError } from '../../errors.ts';\nimport { activeFeatures } from '../../features/index.ts';\nimport { ENGINE_CHECK_DOCS, engineIdentity, npmRemedy, checkEngine as runEngineCheck } from '../engine.ts';\nimport { peerRange } from '../native.ts';\nimport type { InternalOpenOptions, OpenResult } from '../open.ts';\nimport { openWithDialect } from '../open.ts';\nimport { getMeta, setMeta } from '../shared.ts';\nimport type { Connection, OpenDialect } from '../types.ts';\nimport { createConnection } from './connection.ts';\nimport { assertFtsReady, prepareFts, queryLexical } from './lexical.ts';\nimport { DUCKDB_PACKAGE, duckdbApi, duckdbNative } from './native.ts';\nimport { duckdbDialect } from './reconcile.ts';\nimport { registerFunctions } from './sql-functions.ts';\nimport { createStore } from './store.ts';\nimport { createVectorWriteStage } from './vectors.ts';\n\nexport const DB_FILENAME = 'cache.duckdb';\n// Independent of sqlite's SCHEMA_VERSION -- the two stores' cache shapes evolve separately (VARIANT frontmatter columns vs untyped).\n// The store name already joins the feature signature, so switching a config's `store` key rebuilds rather than reusing the other engine's cache.\nexport const SCHEMA_VERSION = '6';\n\nexport type { OpenResult };\n\n// The connection plus this store's own native handles (types.ts's OpenDialect<Handle>): the\n// instance owns the WAL and must outlive the connection borrowed from it.\ninterface DuckdbHandle {\n instance: DuckDBInstance;\n duckdb: DuckDBConnection;\n}\n\n// `content` is a plain table (not FTS-virtual): build prepares the persistent FTS index over it,\n// while contains() verification reads the table directly.\n// No tokenizer resolution: this store always uses the fts extension's default (porter) stemmer.\nasync function ensureCoreSchema(_handle: DuckdbHandle, conn: Connection): Promise<void> {\n await conn.exec(`CREATE TABLE IF NOT EXISTS frontmatter (\"path\" TEXT PRIMARY KEY, \"_mtime\" DOUBLE, \"_ctime\" DOUBLE, \"_size\" INTEGER, \"_parse_error\" TEXT)`);\n await conn.exec(`CREATE TABLE IF NOT EXISTS content (\"path\" TEXT PRIMARY KEY, title TEXT, summary TEXT, text TEXT)`);\n await conn.exec(`CREATE TABLE IF NOT EXISTS indexed_sources (\"path\" TEXT PRIMARY KEY, text TEXT NOT NULL)`);\n await conn.exec(`CREATE TABLE IF NOT EXISTS preset_files (\"path\" TEXT, preset TEXT, PRIMARY KEY (\"path\", preset))`);\n await conn.exec('CREATE INDEX IF NOT EXISTS preset_files_preset ON preset_files(preset)');\n if ((await getMeta(conn, 'schema_version')) === null) await setMeta(conn, 'schema_version', SCHEMA_VERSION);\n}\n\nasync function ensureFeatureSchema(_handle: DuckdbHandle, conn: Connection, cfg: Config): Promise<void> {\n for (const feature of activeFeatures(cfg)) {\n // Native FLOAT[STORE_DIMS] instead of the embed feature's engine-neutral BLOB+scale DDL (vectors.ts). `scale` is kept, unused,\n // so the feature's shared reconcile-time INSERT/DELETE (features/embed.ts) names a column that exists on both stores.\n if (feature.name === 'embed') {\n await conn.exec(`CREATE TABLE IF NOT EXISTS embeddings (\"path\" TEXT, chunk INTEGER, start_line INTEGER, end_line INTEGER, content_identity TEXT NOT NULL, scale REAL, vector FLOAT[${STORE_DIMS}], PRIMARY KEY (\"path\", chunk))`);\n continue;\n }\n await feature.schema(conn);\n }\n}\n\nasync function prepareConnection(handle: DuckdbHandle, _conn: Connection, _cfg: Config): Promise<void> {\n await createVectorWriteStage(handle.duckdb, STORE_DIMS);\n}\n\n// Order matters: the connection must be gone before the instance closes the WAL.\nasync function close(handle: DuckdbHandle): Promise<void> {\n handle.duckdb.disconnectSync();\n handle.instance.closeSync();\n}\n\nasync function connect(dbPath: string, _cfg: ResolvedConfig, options: { existingOnly: boolean; observational: boolean }): Promise<{ handle: DuckdbHandle; conn: Connection }> {\n // Dynamic, not a top-level import: sqlite trees must never attempt to resolve this optional peer dependency, so nothing imports\n // it as a value until a duckdb tree opens (types-only imports are erased). Installed on first use if missing, shared with sql-functions.ts and vectors.ts via native.ts's duckdbApi.\n let DuckDBInstance: typeof import('@duckdb/node-api').DuckDBInstance;\n try {\n ({ DuckDBInstance } = await duckdbApi());\n } catch (err) {\n if (err instanceof SenseError) throw err;\n throw new SenseError('STORE_DEPENDENCY_MISSING', `store \"duckdb\" needs the ${DUCKDB_PACKAGE} package (${(err as Error).message})`);\n }\n\n let duckdb: DuckDBConnection;\n let instance: DuckDBInstance | undefined;\n try {\n // On-disk files default to an older storage format for cross-version compatibility, which rejects VARIANT columns (\"VARIANT\n // columns are not supported in storage versions prior to v1.5.0\"); this store's dynamic frontmatter columns need VARIANT (reconcile.ts), so the floor is pinned explicitly.\n instance = await DuckDBInstance.create(dbPath, options.observational ? { access_mode: 'READ_ONLY' } : { storage_compatibility_version: 'v1.5.0' });\n duckdb = await instance.connect();\n } catch (err) {\n // create() may have succeeded before connect() failed: close it, or its WAL stays open.\n instance?.closeSync();\n throw new SenseError('STORE_DEPENDENCY_MISSING', `store \"duckdb\" failed to open ${dbPath}: ${(err as Error).message}`);\n }\n // A throw below would leak the open instance, whose WAL then locks the .duckdb file undeletable on Windows.\n try {\n await registerFunctions(duckdb);\n const conn = createConnection(duckdb);\n return { handle: { instance, duckdb }, conn };\n } catch (err) {\n await close({ instance, duckdb });\n throw err;\n }\n}\n\nasync function duckdbEngineIdentity(): Promise<string> {\n return engineIdentity(DUCKDB_PACKAGE, (await duckdbNative()).version);\n}\n\n// The real schema, index build and lexical query over store/engine.ts's fixture, in memory.\nasync function checkDuckdbEngine(): Promise<void> {\n const { api, version } = await duckdbNative();\n const instance = await api.DuckDBInstance.create(':memory:');\n const handle = { instance, duckdb: await instance.connect() };\n try {\n const conn = createConnection(handle.duckdb);\n await conn.exec('CREATE TABLE meta (key TEXT PRIMARY KEY, value TEXT)');\n await ensureCoreSchema(handle, conn);\n await conn.runBatch(\n 'INSERT INTO content (\"path\", title, summary, text) VALUES (?, ?, ?, ?)',\n ENGINE_CHECK_DOCS.map((doc) => [doc.path, doc.title, doc.summary, doc.text])\n );\n await runEngineCheck('duckdb', engineIdentity(DUCKDB_PACKAGE, version), npmRemedy(DUCKDB_PACKAGE, peerRange(DUCKDB_PACKAGE)), async (terms) => {\n await prepareFts(conn);\n return (await queryLexical(conn, terms, { whereJoin: '', whereCond: '', scopeCond: '', limit: 10 })).map((hit) => hit.path);\n });\n } finally {\n await close(handle);\n }\n}\n\n// This store's dialect (types.ts's OpenDialect) for the shared orchestration in store/open.ts.\nexport const duckdbOpenDialect: OpenDialect<DuckdbHandle> = {\n filename: DB_FILENAME,\n schemaVersion: SCHEMA_VERSION,\n reconcileDialect: duckdbDialect,\n connect,\n close,\n // duckdb's file lock spans the connection's life, and each platform words the refusal its own\n // way: posix \"Could not set lock on file ... Conflicting lock is held in <exe> (PID n)\", Windows\n // \"Cannot open file ... being used by another process\". Both are the same condition.\n isLocked: (err) => /Could not set lock on file|being used by another process/.test(err.message),\n engineIdentity: duckdbEngineIdentity,\n checkEngine: checkDuckdbEngine,\n ensureCoreSchema,\n ensureFeatureSchema,\n prepareConnection,\n prepareLexical: prepareFts,\n assertLexicalReady: assertFtsReady,\n createStore: (handle, conn) => createStore(handle.instance, handle.duckdb, conn),\n};\n\nexport async function openDuckdb(cfg: ResolvedConfig, options?: InternalOpenOptions): Promise<OpenResult> {\n return openWithDialect(cfg, duckdbOpenDialect, options);\n}\n"],"names":["DB_FILENAME","SCHEMA_VERSION","duckdbOpenDialect","openDuckdb","ensureCoreSchema","_handle","conn","exec","getMeta","setMeta","ensureFeatureSchema","cfg","feature","activeFeatures","name","STORE_DIMS","schema","prepareConnection","handle","_conn","_cfg","createVectorWriteStage","duckdb","close","disconnectSync","instance","closeSync","connect","dbPath","options","DuckDBInstance","err","duckdbApi","SenseError","DUCKDB_PACKAGE","message","create","observational","access_mode","storage_compatibility_version","registerFunctions","createConnection","duckdbEngineIdentity","duckdbNative","engineIdentity","version","checkDuckdbEngine","api","runBatch","ENGINE_CHECK_DOCS","map","doc","path","title","summary","text","runEngineCheck","npmRemedy","peerRange","terms","prepareFts","queryLexical","whereJoin","whereCond","scopeCond","limit","hit","filename","schemaVersion","reconcileDialect","duckdbDialect","isLocked","test","checkEngine","prepareLexical","assertLexicalReady","assertFtsReady","createStore","openWithDialect"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { Connection } from '../types.js';
|
|
2
|
-
|
|
3
|
-
export declare function nativeQueryTerms(conn: Connection, query: string): Promise<string[]>;
|
|
4
|
-
export declare function orderedBm25Sql(field: 'title' | 'summary' | 'text', termCount: number): string;
|
|
2
|
+
import type { DuckdbFtsBuilders } from './engine.js';
|
|
3
|
+
export declare function nativeQueryTerms(conn: Connection, fts: DuckdbFtsBuilders, query: string): Promise<string[]>;
|
|
4
|
+
export declare function orderedBm25Sql(fts: DuckdbFtsBuilders, field: 'title' | 'summary' | 'text', termCount: number): string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { Connection } from '../types.js';
|
|
2
|
-
|
|
3
|
-
export declare function nativeQueryTerms(conn: Connection, query: string): Promise<string[]>;
|
|
4
|
-
export declare function orderedBm25Sql(field: 'title' | 'summary' | 'text', termCount: number): string;
|
|
2
|
+
import type { DuckdbFtsBuilders } from './engine.js';
|
|
3
|
+
export declare function nativeQueryTerms(conn: Connection, fts: DuckdbFtsBuilders, query: string): Promise<string[]>;
|
|
4
|
+
export declare function orderedBm25Sql(fts: DuckdbFtsBuilders, field: 'title' | 'summary' | 'text', termCount: number): string;
|
|
@@ -9,9 +9,6 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
get FTS_STEMMER () {
|
|
13
|
-
return FTS_STEMMER;
|
|
14
|
-
},
|
|
15
12
|
get nativeQueryTerms () {
|
|
16
13
|
return nativeQueryTerms;
|
|
17
14
|
},
|
|
@@ -144,8 +141,7 @@ function _ts_generator(thisArg, body) {
|
|
|
144
141
|
};
|
|
145
142
|
}
|
|
146
143
|
}
|
|
147
|
-
|
|
148
|
-
function nativeQueryTerms(conn, query) {
|
|
144
|
+
function nativeQueryTerms(conn, fts, query) {
|
|
149
145
|
return _async_to_generator(function() {
|
|
150
146
|
var stmt, rows;
|
|
151
147
|
return _ts_generator(this, function(_state) {
|
|
@@ -153,7 +149,7 @@ function nativeQueryTerms(conn, query) {
|
|
|
153
149
|
case 0:
|
|
154
150
|
return [
|
|
155
151
|
4,
|
|
156
|
-
conn.prepare(
|
|
152
|
+
conn.prepare(fts.queryTerms())
|
|
157
153
|
];
|
|
158
154
|
case 1:
|
|
159
155
|
stmt = _state.sent();
|
|
@@ -174,12 +170,12 @@ function nativeQueryTerms(conn, query) {
|
|
|
174
170
|
});
|
|
175
171
|
})();
|
|
176
172
|
}
|
|
177
|
-
function orderedBm25Sql(field, termCount) {
|
|
173
|
+
function orderedBm25Sql(fts, field, termCount) {
|
|
178
174
|
if (termCount === 0) return 'NULL';
|
|
179
175
|
var contributions = Array.from({
|
|
180
176
|
length: termCount
|
|
181
177
|
}, function() {
|
|
182
|
-
return
|
|
178
|
+
return fts.termScore(field);
|
|
183
179
|
});
|
|
184
180
|
return "(SELECT sum(score ORDER BY score) FROM (".concat(contributions.join(' UNION ALL '), "))");
|
|
185
181
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/sensemaking/src/store/duckdb/ordered-bm25.ts"],"sourcesContent":["import type { Connection } from '../types.ts';\
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/open-source/ai/sensemaking/src/store/duckdb/ordered-bm25.ts"],"sourcesContent":["import type { Connection } from '../types.ts';\nimport type { DuckdbFtsBuilders } from './engine.ts';\n\n// Keep deduplication native, but return original tokens so native scoring stems once.\nexport async function nativeQueryTerms(conn: Connection, fts: DuckdbFtsBuilders, query: string): Promise<string[]> {\n const stmt = await conn.prepare(fts.queryTerms());\n const rows = (await stmt.all(query)) as Array<{ term: string }>;\n return rows.map(({ term }) => term);\n}\n\n// Fixed parameters avoid a correlated document-by-term intermediate relation in DuckDB.\n// Only the number of terms shapes this authored SQL; query values are always bound.\nexport function orderedBm25Sql(fts: DuckdbFtsBuilders, field: 'title' | 'summary' | 'text', termCount: number): string {\n if (termCount === 0) return 'NULL';\n const contributions = Array.from({ length: termCount }, () => fts.termScore(field));\n return `(SELECT sum(score ORDER BY score) FROM (${contributions.join(' UNION ALL ')}))`;\n}\n"],"names":["nativeQueryTerms","orderedBm25Sql","conn","fts","query","stmt","rows","prepare","queryTerms","all","map","term","field","termCount","contributions","Array","from","length","termScore","join"],"mappings":";;;;;;;;;;;QAIsBA;eAAAA;;QAQNC;eAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AART,SAAeD,iBAAiBE,IAAgB,EAAEC,GAAsB,EAAEC,KAAa;;YACtFC,MACAC;;;;oBADO;;wBAAMJ,KAAKK,OAAO,CAACJ,IAAIK,UAAU;;;oBAAxCH,OAAO;oBACC;;wBAAMA,KAAKI,GAAG,CAACL;;;oBAAvBE,OAAQ;oBACd;;wBAAOA,KAAKI,GAAG,CAAC;gCAAGC,aAAAA;mCAAWA;;;;;IAChC;;AAIO,SAASV,eAAeE,GAAsB,EAAES,KAAmC,EAAEC,SAAiB;IAC3G,IAAIA,cAAc,GAAG,OAAO;IAC5B,IAAMC,gBAAgBC,MAAMC,IAAI,CAAC;QAAEC,QAAQJ;IAAU,GAAG;eAAMV,IAAIe,SAAS,CAACN;;IAC5E,OAAO,AAAC,2CAA4E,OAAlCE,cAAcK,IAAI,CAAC,gBAAe;AACtF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { SenseError } from '../errors.js';
|
|
2
|
+
export declare const ENGINE_IDENTITY_META_KEY = "engine_identity";
|
|
3
|
+
export declare function engineIdentity(pkg: string, version: string | undefined): string;
|
|
4
|
+
/**
|
|
5
|
+
* One version-specific replacement of a store's SQL builders. `range` matches the engine version (the npm package's,
|
|
6
|
+
* or Node's bundled SQLite for sqlite), prereleases included since every `@duckdb/node-api` release is one;
|
|
7
|
+
* `reason` names the observed difference.
|
|
8
|
+
*/
|
|
9
|
+
export interface EnginePatch<Builders> {
|
|
10
|
+
range: string;
|
|
11
|
+
reason: string;
|
|
12
|
+
builders: Partial<Builders>;
|
|
13
|
+
}
|
|
14
|
+
export declare function selectBuilders<Builders extends object>(defaults: Builders, patches: readonly EnginePatch<Builders>[], version: string | undefined): Builders;
|
|
15
|
+
export interface EngineCheckDoc {
|
|
16
|
+
path: string;
|
|
17
|
+
title: string;
|
|
18
|
+
summary: string;
|
|
19
|
+
text: string;
|
|
20
|
+
}
|
|
21
|
+
export declare const ENGINE_CHECK_DOCS: readonly EngineCheckDoc[];
|
|
22
|
+
export declare const ENGINE_CHECK_QUERIES: ReadonlyArray<{
|
|
23
|
+
terms: string;
|
|
24
|
+
paths: string[];
|
|
25
|
+
}>;
|
|
26
|
+
export declare function npmRemedy(pkg: string, range: string): string;
|
|
27
|
+
export declare function checkEngine(store: string, identity: string, remedy: string, query: (terms: string) => Promise<string[]>): Promise<void>;
|
|
28
|
+
export declare function engineCheckFailed(store: string, identity: string, remedy: string, failure: string): SenseError;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { SenseError } from '../errors.js';
|
|
2
|
+
export declare const ENGINE_IDENTITY_META_KEY = "engine_identity";
|
|
3
|
+
export declare function engineIdentity(pkg: string, version: string | undefined): string;
|
|
4
|
+
/**
|
|
5
|
+
* One version-specific replacement of a store's SQL builders. `range` matches the engine version (the npm package's,
|
|
6
|
+
* or Node's bundled SQLite for sqlite), prereleases included since every `@duckdb/node-api` release is one;
|
|
7
|
+
* `reason` names the observed difference.
|
|
8
|
+
*/
|
|
9
|
+
export interface EnginePatch<Builders> {
|
|
10
|
+
range: string;
|
|
11
|
+
reason: string;
|
|
12
|
+
builders: Partial<Builders>;
|
|
13
|
+
}
|
|
14
|
+
export declare function selectBuilders<Builders extends object>(defaults: Builders, patches: readonly EnginePatch<Builders>[], version: string | undefined): Builders;
|
|
15
|
+
export interface EngineCheckDoc {
|
|
16
|
+
path: string;
|
|
17
|
+
title: string;
|
|
18
|
+
summary: string;
|
|
19
|
+
text: string;
|
|
20
|
+
}
|
|
21
|
+
export declare const ENGINE_CHECK_DOCS: readonly EngineCheckDoc[];
|
|
22
|
+
export declare const ENGINE_CHECK_QUERIES: ReadonlyArray<{
|
|
23
|
+
terms: string;
|
|
24
|
+
paths: string[];
|
|
25
|
+
}>;
|
|
26
|
+
export declare function npmRemedy(pkg: string, range: string): string;
|
|
27
|
+
export declare function checkEngine(store: string, identity: string, remedy: string, query: (terms: string) => Promise<string[]>): Promise<void>;
|
|
28
|
+
export declare function engineCheckFailed(store: string, identity: string, remedy: string, failure: string): SenseError;
|