sensemaking 0.27.1 → 0.28.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +2 -2
  2. package/bin/cli.js +16 -7
  3. package/dist/cjs/cli/constants.d.cts +2 -0
  4. package/dist/cjs/cli/constants.d.ts +2 -0
  5. package/dist/cjs/cli/constants.js +21 -0
  6. package/dist/cjs/cli/constants.js.map +1 -0
  7. package/dist/cjs/cli/named.js +2 -1
  8. package/dist/cjs/cli/named.js.map +1 -1
  9. package/dist/cjs/cli/shared.js +5 -4
  10. package/dist/cjs/cli/shared.js.map +1 -1
  11. package/dist/cjs/cli.js +10 -9
  12. package/dist/cjs/cli.js.map +1 -1
  13. package/dist/cjs/embed/query.js.map +1 -1
  14. package/dist/cjs/store/duckdb/engine.d.cts +11 -0
  15. package/dist/cjs/store/duckdb/engine.d.ts +11 -0
  16. package/dist/cjs/store/duckdb/engine.js +193 -0
  17. package/dist/cjs/store/duckdb/engine.js.map +1 -0
  18. package/dist/cjs/store/duckdb/lexical.js +34 -20
  19. package/dist/cjs/store/duckdb/lexical.js.map +1 -1
  20. package/dist/cjs/store/duckdb/native.d.cts +5 -2
  21. package/dist/cjs/store/duckdb/native.d.ts +5 -2
  22. package/dist/cjs/store/duckdb/native.js +157 -13
  23. package/dist/cjs/store/duckdb/native.js.map +1 -1
  24. package/dist/cjs/store/duckdb/open.js +151 -3
  25. package/dist/cjs/store/duckdb/open.js.map +1 -1
  26. package/dist/cjs/store/duckdb/ordered-bm25.d.cts +3 -3
  27. package/dist/cjs/store/duckdb/ordered-bm25.d.ts +3 -3
  28. package/dist/cjs/store/duckdb/ordered-bm25.js +4 -8
  29. package/dist/cjs/store/duckdb/ordered-bm25.js.map +1 -1
  30. package/dist/cjs/store/engine.d.cts +28 -0
  31. package/dist/cjs/store/engine.d.ts +28 -0
  32. package/dist/cjs/store/engine.js +362 -0
  33. package/dist/cjs/store/engine.js.map +1 -0
  34. package/dist/cjs/store/native.d.cts +8 -5
  35. package/dist/cjs/store/native.d.ts +8 -5
  36. package/dist/cjs/store/native.js +78 -73
  37. package/dist/cjs/store/native.js.map +1 -1
  38. package/dist/cjs/store/open.js +100 -40
  39. package/dist/cjs/store/open.js.map +1 -1
  40. package/dist/cjs/store/sqlite/engine.d.cts +12 -0
  41. package/dist/cjs/store/sqlite/engine.d.ts +12 -0
  42. package/dist/cjs/store/sqlite/engine.js +53 -0
  43. package/dist/cjs/store/sqlite/engine.js.map +1 -0
  44. package/dist/cjs/store/sqlite/lexical.js +3 -4
  45. package/dist/cjs/store/sqlite/lexical.js.map +1 -1
  46. package/dist/cjs/store/sqlite/open.js +119 -6
  47. package/dist/cjs/store/sqlite/open.js.map +1 -1
  48. package/dist/cjs/store/turso/engine.d.cts +9 -0
  49. package/dist/cjs/store/turso/engine.d.ts +9 -0
  50. package/dist/cjs/store/turso/engine.js +189 -0
  51. package/dist/cjs/store/turso/engine.js.map +1 -0
  52. package/dist/cjs/store/turso/lexical.js +16 -11
  53. package/dist/cjs/store/turso/lexical.js.map +1 -1
  54. package/dist/cjs/store/turso/native.d.cts +5 -1
  55. package/dist/cjs/store/turso/native.d.ts +5 -1
  56. package/dist/cjs/store/turso/native.js +157 -8
  57. package/dist/cjs/store/turso/native.js.map +1 -1
  58. package/dist/cjs/store/turso/open.js +172 -27
  59. package/dist/cjs/store/turso/open.js.map +1 -1
  60. package/dist/cjs/store/turso/reconcile.d.cts +0 -1
  61. package/dist/cjs/store/turso/reconcile.d.ts +0 -1
  62. package/dist/cjs/store/turso/reconcile.js +22 -23
  63. package/dist/cjs/store/turso/reconcile.js.map +1 -1
  64. package/dist/cjs/store/types.d.cts +2 -0
  65. package/dist/cjs/store/types.d.ts +2 -0
  66. package/dist/cjs/store/types.js.map +1 -1
  67. package/dist/esm/cli/constants.d.ts +2 -0
  68. package/dist/esm/cli/constants.js +2 -0
  69. package/dist/esm/cli/constants.js.map +1 -0
  70. package/dist/esm/cli/named.js +2 -1
  71. package/dist/esm/cli/named.js.map +1 -1
  72. package/dist/esm/cli/shared.js +6 -5
  73. package/dist/esm/cli/shared.js.map +1 -1
  74. package/dist/esm/cli.js +10 -9
  75. package/dist/esm/cli.js.map +1 -1
  76. package/dist/esm/embed/query.js +1 -1
  77. package/dist/esm/embed/query.js.map +1 -1
  78. package/dist/esm/store/duckdb/engine.d.ts +11 -0
  79. package/dist/esm/store/duckdb/engine.js +18 -0
  80. package/dist/esm/store/duckdb/engine.js.map +1 -0
  81. package/dist/esm/store/duckdb/lexical.js +11 -11
  82. package/dist/esm/store/duckdb/lexical.js.map +1 -1
  83. package/dist/esm/store/duckdb/native.d.ts +5 -2
  84. package/dist/esm/store/duckdb/native.js +16 -12
  85. package/dist/esm/store/duckdb/native.js.map +1 -1
  86. package/dist/esm/store/duckdb/open.js +40 -2
  87. package/dist/esm/store/duckdb/open.js.map +1 -1
  88. package/dist/esm/store/duckdb/ordered-bm25.d.ts +3 -3
  89. package/dist/esm/store/duckdb/ordered-bm25.js +4 -9
  90. package/dist/esm/store/duckdb/ordered-bm25.js.map +1 -1
  91. package/dist/esm/store/engine.d.ts +28 -0
  92. package/dist/esm/store/engine.js +85 -0
  93. package/dist/esm/store/engine.js.map +1 -0
  94. package/dist/esm/store/native.d.ts +8 -5
  95. package/dist/esm/store/native.js +59 -57
  96. package/dist/esm/store/native.js.map +1 -1
  97. package/dist/esm/store/open.js +24 -7
  98. package/dist/esm/store/open.js.map +1 -1
  99. package/dist/esm/store/sqlite/engine.d.ts +12 -0
  100. package/dist/esm/store/sqlite/engine.js +16 -0
  101. package/dist/esm/store/sqlite/engine.js.map +1 -0
  102. package/dist/esm/store/sqlite/lexical.js +2 -3
  103. package/dist/esm/store/sqlite/lexical.js.map +1 -1
  104. package/dist/esm/store/sqlite/open.js +38 -7
  105. package/dist/esm/store/sqlite/open.js.map +1 -1
  106. package/dist/esm/store/turso/engine.d.ts +9 -0
  107. package/dist/esm/store/turso/engine.js +14 -0
  108. package/dist/esm/store/turso/engine.js.map +1 -0
  109. package/dist/esm/store/turso/lexical.js +9 -9
  110. package/dist/esm/store/turso/lexical.js.map +1 -1
  111. package/dist/esm/store/turso/native.d.ts +5 -1
  112. package/dist/esm/store/turso/native.js +16 -10
  113. package/dist/esm/store/turso/native.js.map +1 -1
  114. package/dist/esm/store/turso/open.js +44 -3
  115. package/dist/esm/store/turso/open.js.map +1 -1
  116. package/dist/esm/store/turso/reconcile.d.ts +0 -1
  117. package/dist/esm/store/turso/reconcile.js +3 -8
  118. package/dist/esm/store/turso/reconcile.js.map +1 -1
  119. package/dist/esm/store/types.d.ts +2 -0
  120. package/dist/esm/store/types.js.map +1 -1
  121. package/package.json +21 -7
  122. package/skills/sense/EXAMPLES.md +0 -99
  123. package/skills/sense/SKILL.md +0 -145
  124. package/skills/sense/references/search.md +0 -63
  125. package/skills/sense/references/sql.md +0 -120
  126. package/skills/sense/references/stores/duckdb.md +0 -35
  127. package/skills/sense/references/stores/sqlite.md +0 -66
  128. package/skills/sense/references/stores/turso.md +0 -36
  129. package/skills/sense/references/terminology.md +0 -32
  130. package/skills/sense-bases/EXAMPLES.md +0 -103
  131. package/skills/sense-bases/SKILL.md +0 -147
  132. package/skills/sense-setup/EXAMPLES.md +0 -129
  133. package/skills/sense-setup/SKILL.md +0 -112
  134. package/skills/sense-setup/references/embeddings.md +0 -51
  135. package/skills/sense-setup/references/store-benchmarks.md +0 -16
  136. package/skills/sense-setup/references/stores/duckdb.md +0 -28
  137. package/skills/sense-setup/references/stores/sqlite.md +0 -21
  138. package/skills/sense-setup/references/stores/turso.md +0 -25
@@ -0,0 +1,362 @@
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 ENGINE_CHECK_DOCS () {
13
+ return ENGINE_CHECK_DOCS;
14
+ },
15
+ get ENGINE_CHECK_QUERIES () {
16
+ return ENGINE_CHECK_QUERIES;
17
+ },
18
+ get ENGINE_IDENTITY_META_KEY () {
19
+ return ENGINE_IDENTITY_META_KEY;
20
+ },
21
+ get checkEngine () {
22
+ return checkEngine;
23
+ },
24
+ get engineCheckFailed () {
25
+ return engineCheckFailed;
26
+ },
27
+ get engineIdentity () {
28
+ return engineIdentity;
29
+ },
30
+ get npmRemedy () {
31
+ return npmRemedy;
32
+ },
33
+ get selectBuilders () {
34
+ return selectBuilders;
35
+ }
36
+ });
37
+ var _semver = /*#__PURE__*/ _interop_require_default(require("semver"));
38
+ var _errorsts = require("../errors.js");
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 _define_property(obj, key, value) {
66
+ if (key in obj) {
67
+ Object.defineProperty(obj, key, {
68
+ value: value,
69
+ enumerable: true,
70
+ configurable: true,
71
+ writable: true
72
+ });
73
+ } else obj[key] = value;
74
+ return obj;
75
+ }
76
+ function _interop_require_default(obj) {
77
+ return obj && obj.__esModule ? obj : {
78
+ default: obj
79
+ };
80
+ }
81
+ function _object_spread(target) {
82
+ for(var i = 1; i < arguments.length; i++){
83
+ var source = arguments[i] != null ? arguments[i] : {};
84
+ var ownKeys = Object.keys(source);
85
+ if (typeof Object.getOwnPropertySymbols === "function") {
86
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
87
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
88
+ }));
89
+ }
90
+ ownKeys.forEach(function(key) {
91
+ _define_property(target, key, source[key]);
92
+ });
93
+ }
94
+ return target;
95
+ }
96
+ function _ts_generator(thisArg, body) {
97
+ var f, y, t, _ = {
98
+ label: 0,
99
+ sent: function() {
100
+ if (t[0] & 1) throw t[1];
101
+ return t[1];
102
+ },
103
+ trys: [],
104
+ ops: []
105
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
106
+ return d(g, "next", {
107
+ value: verb(0)
108
+ }), d(g, "throw", {
109
+ value: verb(1)
110
+ }), d(g, "return", {
111
+ value: verb(2)
112
+ }), typeof Symbol === "function" && d(g, Symbol.iterator, {
113
+ value: function() {
114
+ return this;
115
+ }
116
+ }), g;
117
+ function verb(n) {
118
+ return function(v) {
119
+ return step([
120
+ n,
121
+ v
122
+ ]);
123
+ };
124
+ }
125
+ function step(op) {
126
+ if (f) throw new TypeError("Generator is already executing.");
127
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
128
+ 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;
129
+ if (y = 0, t) op = [
130
+ op[0] & 2,
131
+ t.value
132
+ ];
133
+ switch(op[0]){
134
+ case 0:
135
+ case 1:
136
+ t = op;
137
+ break;
138
+ case 4:
139
+ _.label++;
140
+ return {
141
+ value: op[1],
142
+ done: false
143
+ };
144
+ case 5:
145
+ _.label++;
146
+ y = op[1];
147
+ op = [
148
+ 0
149
+ ];
150
+ continue;
151
+ case 7:
152
+ op = _.ops.pop();
153
+ _.trys.pop();
154
+ continue;
155
+ default:
156
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
157
+ _ = 0;
158
+ continue;
159
+ }
160
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
161
+ _.label = op[1];
162
+ break;
163
+ }
164
+ if (op[0] === 6 && _.label < t[1]) {
165
+ _.label = t[1];
166
+ t = op;
167
+ break;
168
+ }
169
+ if (t && _.label < t[2]) {
170
+ _.label = t[2];
171
+ _.ops.push(op);
172
+ break;
173
+ }
174
+ if (t[2]) _.ops.pop();
175
+ _.trys.pop();
176
+ continue;
177
+ }
178
+ op = body.call(thisArg, _);
179
+ } catch (e) {
180
+ op = [
181
+ 6,
182
+ e
183
+ ];
184
+ y = 0;
185
+ } finally{
186
+ f = t = 0;
187
+ }
188
+ if (op[0] & 5) throw op[1];
189
+ return {
190
+ value: op[0] ? op[1] : void 0,
191
+ done: true
192
+ };
193
+ }
194
+ }
195
+ var ENGINE_IDENTITY_META_KEY = 'engine_identity';
196
+ function engineIdentity(pkg, version) {
197
+ return "".concat(pkg, "@").concat(version !== null && version !== void 0 ? version : 'unknown');
198
+ }
199
+ function selectBuilders(defaults, patches, version) {
200
+ var selected = defaults;
201
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
202
+ try {
203
+ for(var _iterator = patches[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
204
+ var patch = _step.value;
205
+ if (version !== undefined && _semver.default.satisfies(version, patch.range, {
206
+ includePrerelease: true
207
+ })) selected = _object_spread({}, selected, patch.builders);
208
+ }
209
+ } catch (err) {
210
+ _didIteratorError = true;
211
+ _iteratorError = err;
212
+ } finally{
213
+ try {
214
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
215
+ _iterator.return();
216
+ }
217
+ } finally{
218
+ if (_didIteratorError) {
219
+ throw _iteratorError;
220
+ }
221
+ }
222
+ }
223
+ return selected;
224
+ }
225
+ var ENGINE_CHECK_DOCS = [
226
+ {
227
+ path: 'b-text.md',
228
+ title: 'Garden',
229
+ summary: '',
230
+ text: 'The dog runs past two cats.'
231
+ },
232
+ {
233
+ path: 'c-cjk.md',
234
+ title: 'Kitchen',
235
+ summary: '',
236
+ text: '日本語のメモ'
237
+ },
238
+ {
239
+ path: 'z-title.md',
240
+ title: 'Running dogs',
241
+ summary: '',
242
+ text: 'A note about pets.'
243
+ }
244
+ ];
245
+ var ENGINE_CHECK_QUERIES = [
246
+ {
247
+ terms: 'run',
248
+ paths: [
249
+ 'z-title.md',
250
+ 'b-text.md'
251
+ ]
252
+ },
253
+ {
254
+ terms: 'dog cat',
255
+ paths: [
256
+ 'b-text.md'
257
+ ]
258
+ },
259
+ {
260
+ terms: '日本',
261
+ paths: [
262
+ 'c-cjk.md'
263
+ ]
264
+ }
265
+ ];
266
+ function npmRemedy(pkg, range) {
267
+ return "run `npm install ".concat(pkg, "@").concat(range, "` for a tested version (tested ").concat(range, ")");
268
+ }
269
+ function checkEngine(store, identity, remedy, query) {
270
+ return _async_to_generator(function() {
271
+ var _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, expected, paths, err1, err;
272
+ return _ts_generator(this, function(_state) {
273
+ switch(_state.label){
274
+ case 0:
275
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
276
+ _state.label = 1;
277
+ case 1:
278
+ _state.trys.push([
279
+ 1,
280
+ 9,
281
+ 10,
282
+ 11
283
+ ]);
284
+ _iterator = ENGINE_CHECK_QUERIES[Symbol.iterator]();
285
+ _state.label = 2;
286
+ case 2:
287
+ if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
288
+ 3,
289
+ 8
290
+ ];
291
+ expected = _step.value;
292
+ paths = void 0;
293
+ _state.label = 3;
294
+ case 3:
295
+ _state.trys.push([
296
+ 3,
297
+ 5,
298
+ ,
299
+ 6
300
+ ]);
301
+ return [
302
+ 4,
303
+ query(expected.terms)
304
+ ];
305
+ case 4:
306
+ paths = _state.sent();
307
+ return [
308
+ 3,
309
+ 6
310
+ ];
311
+ case 5:
312
+ err1 = _state.sent();
313
+ throw engineCheckFailed(store, identity, remedy, 'searching "'.concat(expected.terms, '" failed (').concat(err1.message, ")"));
314
+ case 6:
315
+ if (paths.join('\n') !== expected.paths.join('\n')) {
316
+ throw engineCheckFailed(store, identity, remedy, 'searching "'.concat(expected.terms, '" returned [').concat(paths.join(', '), "], expected [").concat(expected.paths.join(', '), "]"));
317
+ }
318
+ _state.label = 7;
319
+ case 7:
320
+ _iteratorNormalCompletion = true;
321
+ return [
322
+ 3,
323
+ 2
324
+ ];
325
+ case 8:
326
+ return [
327
+ 3,
328
+ 11
329
+ ];
330
+ case 9:
331
+ err = _state.sent();
332
+ _didIteratorError = true;
333
+ _iteratorError = err;
334
+ return [
335
+ 3,
336
+ 11
337
+ ];
338
+ case 10:
339
+ try {
340
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
341
+ _iterator.return();
342
+ }
343
+ } finally{
344
+ if (_didIteratorError) {
345
+ throw _iteratorError;
346
+ }
347
+ }
348
+ return [
349
+ 7
350
+ ];
351
+ case 11:
352
+ return [
353
+ 2
354
+ ];
355
+ }
356
+ });
357
+ })();
358
+ }
359
+ function engineCheckFailed(store, identity, remedy, failure) {
360
+ return new _errorsts.SenseError('STORE_CAPABILITY_MISSING', 'store "'.concat(store, '" cannot use ').concat(identity, ": ").concat(failure, "; ").concat(remedy));
361
+ }
362
+ /* 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/open-source/ai/sensemaking/src/store/engine.ts"],"sourcesContent":["import semver from 'semver';\nimport { SenseError } from '../errors.ts';\n\n// Which native engine built a derived index. A different engine rebuilds the cache, as a schema change does:\n// native index formats and scoring belong to the engine, not to sensemaking's schema.\nexport const ENGINE_IDENTITY_META_KEY = 'engine_identity';\n\nexport function engineIdentity(pkg: string, version: string | undefined): string {\n return `${pkg}@${version ?? 'unknown'}`;\n}\n\n/**\n * One version-specific replacement of a store's SQL builders. `range` matches the engine version (the npm package's,\n * or Node's bundled SQLite for sqlite), prereleases included since every `@duckdb/node-api` release is one;\n * `reason` names the observed difference.\n */\nexport interface EnginePatch<Builders> {\n range: string;\n reason: string;\n builders: Partial<Builders>;\n}\n\n// Later patches win where ranges overlap, so a narrower fix is listed after the broader one it refines.\nexport function selectBuilders<Builders extends object>(defaults: Builders, patches: readonly EnginePatch<Builders>[], version: string | undefined): Builders {\n let selected = defaults;\n for (const patch of patches) {\n if (version !== undefined && semver.satisfies(version, patch.range, { includePrerelease: true })) selected = { ...selected, ...patch.builders };\n }\n return selected;\n}\n\nexport interface EngineCheckDoc {\n path: string;\n title: string;\n summary: string;\n text: string;\n}\n\n// Expected results every store must reproduce. The title match sorts last by path, so an engine whose scores\n// collapse to zero (Turso's fts_score silent mode) or lose field weights reorders 'run' and fails the check.\nexport const ENGINE_CHECK_DOCS: readonly EngineCheckDoc[] = [\n { path: 'b-text.md', title: 'Garden', summary: '', text: 'The dog runs past two cats.' },\n { path: 'c-cjk.md', title: 'Kitchen', summary: '', text: '日本語のメモ' },\n { path: 'z-title.md', title: 'Running dogs', summary: '', text: 'A note about pets.' },\n];\n\nexport const ENGINE_CHECK_QUERIES: ReadonlyArray<{ terms: string; paths: string[] }> = [\n { terms: 'run', paths: ['z-title.md', 'b-text.md'] },\n { terms: 'dog cat', paths: ['b-text.md'] },\n { terms: '日本', paths: ['c-cjk.md'] },\n];\n\n// What to do when an npm-installed engine fails: get a version from the tested range.\nexport function npmRemedy(pkg: string, range: string): string {\n return `run \\`npm install ${pkg}@${range}\\` for a tested version (tested ${range})`;\n}\n\n// Runs the store's real lexical query over ENGINE_CHECK_DOCS; any thrown error or wrong result fails the engine.\nexport async function checkEngine(store: string, identity: string, remedy: string, query: (terms: string) => Promise<string[]>): Promise<void> {\n for (const expected of ENGINE_CHECK_QUERIES) {\n let paths: string[];\n try {\n paths = await query(expected.terms);\n } catch (err) {\n throw engineCheckFailed(store, identity, remedy, `searching \"${expected.terms}\" failed (${(err as Error).message})`);\n }\n if (paths.join('\\n') !== expected.paths.join('\\n')) {\n throw engineCheckFailed(store, identity, remedy, `searching \"${expected.terms}\" returned [${paths.join(', ')}], expected [${expected.paths.join(', ')}]`);\n }\n }\n}\n\nexport function engineCheckFailed(store: string, identity: string, remedy: string, failure: string): SenseError {\n return new SenseError('STORE_CAPABILITY_MISSING', `store \"${store}\" cannot use ${identity}: ${failure}; ${remedy}`);\n}\n"],"names":["ENGINE_CHECK_DOCS","ENGINE_CHECK_QUERIES","ENGINE_IDENTITY_META_KEY","checkEngine","engineCheckFailed","engineIdentity","npmRemedy","selectBuilders","pkg","version","defaults","patches","selected","patch","undefined","semver","satisfies","range","includePrerelease","builders","path","title","summary","text","terms","paths","store","identity","remedy","query","expected","err","message","join","failure","SenseError"],"mappings":"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"}
@@ -2,10 +2,13 @@ export interface NativeDescriptor {
2
2
  store: string;
3
3
  pkg: string;
4
4
  sizeHint: string;
5
- /** Optional exact package version required by this native binding. */
6
- version?: string;
7
- /** npm specifier used only when installation is required (imports stay bare). */
8
- installSpec?: string;
5
+ /** The tested semver range: sensemaking's own `peerDependencies` entry for `pkg` (see `peerRange`). */
6
+ range: string;
7
+ }
8
+ export interface NativeModule<T> {
9
+ api: T;
10
+ version: string | undefined;
9
11
  }
10
12
  export declare function packageNodeModules(): string;
11
- export declare function loadOrInstall<T>(descriptor: NativeDescriptor, nodeModulesPath: string, importName?: string): Promise<T>;
13
+ export declare function peerRange(pkg: string): string;
14
+ export declare function loadOrInstall<T>(descriptor: NativeDescriptor, nodeModulesPath: string, importName?: string): Promise<NativeModule<T>>;
@@ -2,10 +2,13 @@ export interface NativeDescriptor {
2
2
  store: string;
3
3
  pkg: string;
4
4
  sizeHint: string;
5
- /** Optional exact package version required by this native binding. */
6
- version?: string;
7
- /** npm specifier used only when installation is required (imports stay bare). */
8
- installSpec?: string;
5
+ /** The tested semver range: sensemaking's own `peerDependencies` entry for `pkg` (see `peerRange`). */
6
+ range: string;
7
+ }
8
+ export interface NativeModule<T> {
9
+ api: T;
10
+ version: string | undefined;
9
11
  }
10
12
  export declare function packageNodeModules(): string;
11
- export declare function loadOrInstall<T>(descriptor: NativeDescriptor, nodeModulesPath: string, importName?: string): Promise<T>;
13
+ export declare function peerRange(pkg: string): string;
14
+ export declare function loadOrInstall<T>(descriptor: NativeDescriptor, nodeModulesPath: string, importName?: string): Promise<NativeModule<T>>;
@@ -14,12 +14,16 @@ _export(exports, {
14
14
  },
15
15
  get packageNodeModules () {
16
16
  return packageNodeModules;
17
+ },
18
+ get peerRange () {
19
+ return peerRange;
17
20
  }
18
21
  });
19
22
  var _nodefs = require("node:fs");
20
23
  var _nodemodule = /*#__PURE__*/ _interop_require_default(require("node:module"));
21
24
  var _nodepath = require("node:path");
22
25
  var _nodeurl = require("node:url");
26
+ var _semver = /*#__PURE__*/ _interop_require_default(require("semver"));
23
27
  var _errorsts = require("../errors.js");
24
28
  function _array_like_to_array(arr, len) {
25
29
  if (len == null || len > arr.length) len = arr.length;
@@ -212,19 +216,33 @@ function _unsupported_iterable_to_array(o, minLen) {
212
216
  // ~110MB), so it is required lazily inside the gated branch below, not for every store/index.ts load.
213
217
  var _require = typeof require === 'undefined' ? _nodemodule.default.createRequire(require("url").pathToFileURL(__filename).toString()) : require;
214
218
  var _dirname = (0, _nodepath.dirname)(typeof __filename !== 'undefined' ? __filename : (0, _nodeurl.fileURLToPath)(require("url").pathToFileURL(__filename).toString()));
215
- function packageNodeModules() {
219
+ // Walks up from this file's own directory rather than a fixed dot-count: it sits at a
220
+ // different depth under src/ than under built dist/{cjs,esm}/store output.
221
+ function packageRoot() {
216
222
  var dir = _dirname;
217
223
  for(;;){
218
224
  var candidate = (0, _nodepath.join)(dir, 'package.json');
219
225
  if ((0, _nodefs.existsSync)(candidate)) {
220
- var pkg = JSON.parse((0, _nodefs.readFileSync)(candidate, 'utf8'));
221
- if (pkg.name === 'sensemaking') return (0, _nodepath.join)(dir, 'node_modules');
226
+ var manifest = JSON.parse((0, _nodefs.readFileSync)(candidate, 'utf8'));
227
+ if (manifest.name === 'sensemaking') return {
228
+ dir: dir,
229
+ manifest: manifest
230
+ };
222
231
  }
223
232
  var parent = (0, _nodepath.dirname)(dir);
224
233
  if (parent === dir) throw new Error('could not locate the sensemaking package root to install a native dependency into');
225
234
  dir = parent;
226
235
  }
227
236
  }
237
+ function packageNodeModules() {
238
+ return (0, _nodepath.join)(packageRoot().dir, 'node_modules');
239
+ }
240
+ function peerRange(pkg) {
241
+ var _packageRoot_manifest_peerDependencies;
242
+ var range = (_packageRoot_manifest_peerDependencies = packageRoot().manifest.peerDependencies) === null || _packageRoot_manifest_peerDependencies === void 0 ? void 0 : _packageRoot_manifest_peerDependencies[pkg];
243
+ if (!range) throw new Error("sensemaking's package.json declares no peerDependencies entry for ".concat(pkg));
244
+ return range;
245
+ }
228
246
  var installing = new Map();
229
247
  // De-dupes concurrent installs: since the install is async, concurrent callers await the same
230
248
  // in-flight promise, keyed by specifier and target. A failed install is not cached, so a later call retries.
@@ -241,6 +259,13 @@ function installOnce(specifier, nodeModulesPath) {
241
259
  }
242
260
  return promise;
243
261
  }
262
+ function readPackageMetadata(pkgDir) {
263
+ try {
264
+ return JSON.parse((0, _nodefs.readFileSync)((0, _nodepath.join)(pkgDir, 'package.json'), 'utf8'));
265
+ } catch (unused) {
266
+ return undefined;
267
+ }
268
+ }
244
269
  // Node caches a bare specifier's resolution, including a "not found" miss, for the process
245
270
  // lifetime; use the installed entry directly, as a URL for ESM and a path for CJS.
246
271
  function resolveEntrySpecifier(importName, nodeModulesPath) {
@@ -253,32 +278,12 @@ function resolveEntrySpecifier(importName, nodeModulesPath) {
253
278
  var entryPath = (0, _nodepath.join)(pkgDir, entry);
254
279
  return typeof require === 'undefined' ? (0, _nodeurl.pathToFileURL)(entryPath).href : entryPath;
255
280
  }
256
- function readPackageMetadata(pkgDir) {
257
- try {
258
- return JSON.parse((0, _nodefs.readFileSync)((0, _nodepath.join)(pkgDir, 'package.json'), 'utf8'));
259
- } catch (unused) {
260
- return undefined;
261
- }
262
- }
263
- function targetPackageMetadata(importName, nodeModulesPath) {
264
- var pkgDir = _nodepath.join.apply(void 0, [
265
- nodeModulesPath
266
- ].concat(_to_consumable_array(importName.split('/'))));
267
- return {
268
- exists: (0, _nodefs.existsSync)(pkgDir),
269
- metadata: readPackageMetadata(pkgDir)
270
- };
271
- }
272
- function resolvedPackageMetadata(importName) {
281
+ function resolvedVersion(importName) {
273
282
  try {
274
283
  var dir = (0, _nodepath.dirname)(_require.resolve(importName));
275
284
  for(;;){
276
- var manifest = (0, _nodepath.join)(dir, 'package.json');
277
- if ((0, _nodefs.existsSync)(manifest)) {
278
- var pkg = readPackageMetadata(dir);
279
- if (!pkg) return undefined;
280
- if (pkg.name === importName) return pkg;
281
- }
285
+ var pkg = readPackageMetadata(dir);
286
+ if ((pkg === null || pkg === void 0 ? void 0 : pkg.name) === importName) return pkg.version;
282
287
  var parent = (0, _nodepath.dirname)(dir);
283
288
  if (parent === dir) return undefined;
284
289
  dir = parent;
@@ -287,35 +292,26 @@ function resolvedPackageMetadata(importName) {
287
292
  return undefined;
288
293
  }
289
294
  }
290
- function versionContractError(descriptor, installed) {
291
- var _descriptor_installSpec;
292
- var installSpec = (_descriptor_installSpec = descriptor.installSpec) !== null && _descriptor_installSpec !== void 0 ? _descriptor_installSpec : descriptor.pkg;
293
- var detail = installed ? "".concat(descriptor.pkg, "@").concat(installed, " is installed") : "".concat(descriptor.pkg, " has missing or unreadable version metadata");
294
- return new _errorsts.SenseError('STORE_DEPENDENCY_MISSING', 'store "'.concat(descriptor.store, '" needs ').concat(installSpec, ", but ").concat(detail, "; refusing to overwrite it -- run `npm install ").concat(installSpec, "` yourself and try again"));
295
- }
296
- function assertExpectedVersion(descriptor, metadata) {
297
- if (!descriptor.version) return;
298
- if (!(metadata === null || metadata === void 0 ? void 0 : metadata.version) || metadata.version !== descriptor.version) throw versionContractError(descriptor, metadata === null || metadata === void 0 ? void 0 : metadata.version);
295
+ // Any installed version is used; one outside the tested range is reported, not refused (the store's engine check decides).
296
+ function reportVersion(descriptor, version) {
297
+ if (version && _semver.default.satisfies(version, descriptor.range)) return;
298
+ console.error('sense: store "'.concat(descriptor.store, '" using ').concat(descriptor.pkg, "@").concat(version !== null && version !== void 0 ? version : 'unknown version', " (tested ").concat(descriptor.range, ")"));
299
299
  }
300
300
  function loadOrInstall(_0, _1) {
301
301
  return _async_to_generator(function(descriptor, nodeModulesPath) {
302
- var importName, target, loaded, unused, _descriptor_installSpec, _descriptor_installSpec1, installSpec, displaySpec, installErr, loaded1, loadErr;
302
+ var importName, api, version, unused, spec, installSpec, installErr, _readPackageMetadata, api1, version1, loadErr;
303
303
  var _arguments = arguments;
304
304
  return _ts_generator(this, function(_state) {
305
305
  switch(_state.label){
306
306
  case 0:
307
307
  importName = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : descriptor.pkg;
308
- if (descriptor.version) {
309
- target = targetPackageMetadata(importName, nodeModulesPath);
310
- if (target.exists) assertExpectedVersion(descriptor, target.metadata);
311
- }
312
308
  _state.label = 1;
313
309
  case 1:
314
310
  _state.trys.push([
315
311
  1,
316
312
  3,
317
313
  ,
318
- 11
314
+ 4
319
315
  ]);
320
316
  return [
321
317
  4,
@@ -324,43 +320,53 @@ function loadOrInstall(_0, _1) {
324
320
  })
325
321
  ];
326
322
  case 2:
327
- loaded = _state.sent();
323
+ api = _state.sent();
324
+ version = resolvedVersion(importName);
325
+ reportVersion(descriptor, version);
328
326
  return [
329
- 3,
330
- 11
327
+ 2,
328
+ {
329
+ api: api,
330
+ version: version
331
+ }
331
332
  ];
332
333
  case 3:
333
334
  unused = _state.sent();
334
- installSpec = (_descriptor_installSpec = descriptor.installSpec) !== null && _descriptor_installSpec !== void 0 ? _descriptor_installSpec : importName;
335
- displaySpec = (_descriptor_installSpec1 = descriptor.installSpec) !== null && _descriptor_installSpec1 !== void 0 ? _descriptor_installSpec1 : descriptor.pkg;
336
- console.error('sense: store "'.concat(descriptor.store, '" needs ').concat(displaySpec, "; installing it now (one-time download, ").concat(descriptor.sizeHint, ")..."));
337
- _state.label = 4;
335
+ return [
336
+ 3,
337
+ 4
338
+ ];
338
339
  case 4:
340
+ spec = "".concat(descriptor.pkg, "@").concat(descriptor.range);
341
+ installSpec = "".concat(importName, "@").concat(descriptor.range);
342
+ console.error('sense: store "'.concat(descriptor.store, '" needs ').concat(spec, "; installing it now (one-time download, ").concat(descriptor.sizeHint, ")..."));
343
+ _state.label = 5;
344
+ case 5:
339
345
  _state.trys.push([
340
- 4,
341
- 6,
346
+ 5,
347
+ 7,
342
348
  ,
343
- 7
349
+ 8
344
350
  ]);
345
351
  return [
346
352
  4,
347
353
  installOnce(installSpec, nodeModulesPath)
348
354
  ];
349
- case 5:
355
+ case 6:
350
356
  _state.sent();
351
357
  return [
352
358
  3,
353
- 7
359
+ 8
354
360
  ];
355
- case 6:
356
- installErr = _state.sent();
357
- throw new _errorsts.SenseError('STORE_DEPENDENCY_MISSING', 'store "'.concat(descriptor.store, '" needs ').concat(displaySpec, ", and installing it automatically failed (").concat(installErr.message, "); this can happen offline, in a sandboxed environment, or when node_modules is read-only or owned by another user (e.g. under a global install) -- run `npm install ").concat(displaySpec, "` yourself and try again"));
358
361
  case 7:
362
+ installErr = _state.sent();
363
+ throw new _errorsts.SenseError('STORE_DEPENDENCY_MISSING', 'store "'.concat(descriptor.store, '" needs ').concat(spec, ", and installing it automatically failed (").concat(installErr.message, "); this can happen offline, in a sandboxed environment, or when node_modules is read-only or owned by another user (e.g. under a global install) -- run `npm install ").concat(spec, "` yourself and try again"));
364
+ case 8:
359
365
  _state.trys.push([
360
- 7,
361
- 9,
366
+ 8,
367
+ 10,
362
368
  ,
363
- 10
369
+ 11
364
370
  ]);
365
371
  return [
366
372
  4,
@@ -368,26 +374,25 @@ function loadOrInstall(_0, _1) {
368
374
  return /*#__PURE__*/ _interop_require_wildcard(require(p));
369
375
  })
370
376
  ];
371
- case 8:
372
- loaded1 = _state.sent();
373
- assertExpectedVersion(descriptor, targetPackageMetadata(importName, nodeModulesPath).metadata);
377
+ case 9:
378
+ api1 = _state.sent();
379
+ version1 = (_readPackageMetadata = readPackageMetadata(_nodepath.join.apply(void 0, [
380
+ nodeModulesPath
381
+ ].concat(_to_consumable_array(importName.split('/')))))) === null || _readPackageMetadata === void 0 ? void 0 : _readPackageMetadata.version;
382
+ reportVersion(descriptor, version1);
374
383
  return [
375
384
  2,
376
- loaded1
385
+ {
386
+ api: api1,
387
+ version: version1
388
+ }
377
389
  ];
378
- case 9:
379
- loadErr = _state.sent();
380
- throw new _errorsts.SenseError('STORE_DEPENDENCY_MISSING', 'store "'.concat(descriptor.store, '" installed ').concat(displaySpec, " but it could not be loaded (").concat(loadErr.message, "); it may not be available for this platform (").concat(process.platform, "-").concat(process.arch, ") -- run `npm install ").concat(displaySpec, "` to see the underlying error"));
381
390
  case 10:
382
- return [
383
- 3,
384
- 11
385
- ];
391
+ loadErr = _state.sent();
392
+ throw new _errorsts.SenseError('STORE_DEPENDENCY_MISSING', 'store "'.concat(descriptor.store, '" installed ').concat(spec, " but it could not be loaded (").concat(loadErr.message, "); it may not be available for this platform (").concat(process.platform, "-").concat(process.arch, ") -- run `npm install ").concat(spec, "` to see the underlying error"));
386
393
  case 11:
387
- if (descriptor.version) assertExpectedVersion(descriptor, resolvedPackageMetadata(importName));
388
394
  return [
389
- 2,
390
- loaded
395
+ 2
391
396
  ];
392
397
  }
393
398
  });