sensemaking 0.23.0 → 0.24.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.
Files changed (193) hide show
  1. package/README.md +13 -9
  2. package/dist/cjs/cli/index.d.cts +1 -1
  3. package/dist/cjs/cli/index.d.ts +1 -1
  4. package/dist/cjs/cli/index.js +1 -1
  5. package/dist/cjs/cli/index.js.map +1 -1
  6. package/dist/cjs/cli/named.js +6 -2
  7. package/dist/cjs/cli/named.js.map +1 -1
  8. package/dist/cjs/cli/search.js +6 -2
  9. package/dist/cjs/cli/search.js.map +1 -1
  10. package/dist/cjs/cli/shared.d.cts +2 -0
  11. package/dist/cjs/cli/shared.d.ts +2 -0
  12. package/dist/cjs/cli/shared.js +24 -0
  13. package/dist/cjs/cli/shared.js.map +1 -1
  14. package/dist/cjs/commands/map.js +2 -2
  15. package/dist/cjs/commands/map.js.map +1 -1
  16. package/dist/cjs/commands/search.d.cts +10 -0
  17. package/dist/cjs/commands/search.d.ts +10 -0
  18. package/dist/cjs/commands/search.js +488 -180
  19. package/dist/cjs/commands/search.js.map +1 -1
  20. package/dist/cjs/output/output.js +45 -8
  21. package/dist/cjs/output/output.js.map +1 -1
  22. package/dist/cjs/output/search-error.d.cts +1 -0
  23. package/dist/cjs/output/search-error.d.ts +1 -0
  24. package/dist/cjs/output/search-error.js +28 -4
  25. package/dist/cjs/output/search-error.js.map +1 -1
  26. package/dist/cjs/scan/frontmatter.js +1 -1
  27. package/dist/cjs/scan/frontmatter.js.map +1 -1
  28. package/dist/cjs/scan/index.js +1 -0
  29. package/dist/cjs/scan/index.js.map +1 -1
  30. package/dist/cjs/store/batch.d.cts +4 -0
  31. package/dist/cjs/store/batch.d.ts +4 -0
  32. package/dist/cjs/store/batch.js +80 -0
  33. package/dist/cjs/store/batch.js.map +1 -0
  34. package/dist/cjs/store/duckdb/batch.d.cts +0 -4
  35. package/dist/cjs/store/duckdb/batch.d.ts +0 -4
  36. package/dist/cjs/store/duckdb/batch.js +5 -27
  37. package/dist/cjs/store/duckdb/batch.js.map +1 -1
  38. package/dist/cjs/store/duckdb/fieldStats.js +4 -7
  39. package/dist/cjs/store/duckdb/fieldStats.js.map +1 -1
  40. package/dist/cjs/store/duckdb/lexical.d.cts +2 -2
  41. package/dist/cjs/store/duckdb/lexical.d.ts +2 -2
  42. package/dist/cjs/store/duckdb/lexical.js +215 -64
  43. package/dist/cjs/store/duckdb/lexical.js.map +1 -1
  44. package/dist/cjs/store/duckdb/reconcile.js +7 -2
  45. package/dist/cjs/store/duckdb/reconcile.js.map +1 -1
  46. package/dist/cjs/store/duckdb/store.js +1 -3
  47. package/dist/cjs/store/duckdb/store.js.map +1 -1
  48. package/dist/cjs/store/duckdb/vectors.js +13 -8
  49. package/dist/cjs/store/duckdb/vectors.js.map +1 -1
  50. package/dist/cjs/store/native.js +5 -4
  51. package/dist/cjs/store/native.js.map +1 -1
  52. package/dist/cjs/store/open.js +7 -0
  53. package/dist/cjs/store/open.js.map +1 -1
  54. package/dist/cjs/store/shared.js.map +1 -1
  55. package/dist/cjs/store/sqlite/lexical.js +1 -4
  56. package/dist/cjs/store/sqlite/lexical.js.map +1 -1
  57. package/dist/cjs/store/sqlite/store.js +1 -4
  58. package/dist/cjs/store/sqlite/store.js.map +1 -1
  59. package/dist/cjs/store/sqlite/vectors.js +78 -24
  60. package/dist/cjs/store/sqlite/vectors.js.map +1 -1
  61. package/dist/cjs/store/turso/connection.d.cts +3 -0
  62. package/dist/cjs/store/turso/connection.d.ts +3 -0
  63. package/dist/cjs/store/turso/connection.js +302 -31
  64. package/dist/cjs/store/turso/connection.js.map +1 -1
  65. package/dist/cjs/store/turso/lexical-text.d.cts +1 -0
  66. package/dist/cjs/store/turso/lexical-text.d.ts +1 -0
  67. package/dist/cjs/store/turso/lexical-text.js +40 -0
  68. package/dist/cjs/store/turso/lexical-text.js.map +1 -0
  69. package/dist/cjs/store/turso/lexical.js +89 -16
  70. package/dist/cjs/store/turso/lexical.js.map +1 -1
  71. package/dist/cjs/store/turso/native.d.cts +4 -0
  72. package/dist/cjs/store/turso/native.d.ts +4 -0
  73. package/dist/cjs/store/turso/native.js +9 -0
  74. package/dist/cjs/store/turso/native.js.map +1 -1
  75. package/dist/cjs/store/turso/open.d.cts +1 -1
  76. package/dist/cjs/store/turso/open.d.ts +1 -1
  77. package/dist/cjs/store/turso/open.js +83 -10
  78. package/dist/cjs/store/turso/open.js.map +1 -1
  79. package/dist/cjs/store/turso/reconcile.d.cts +1 -1
  80. package/dist/cjs/store/turso/reconcile.d.ts +1 -1
  81. package/dist/cjs/store/turso/reconcile.js +6 -2
  82. package/dist/cjs/store/turso/reconcile.js.map +1 -1
  83. package/dist/cjs/store/turso/sql-functions.d.cts +1 -0
  84. package/dist/cjs/store/turso/sql-functions.d.ts +1 -0
  85. package/dist/cjs/store/turso/sql-functions.js +174 -0
  86. package/dist/cjs/store/turso/sql-functions.js.map +1 -0
  87. package/dist/cjs/store/turso/store.js +105 -4
  88. package/dist/cjs/store/turso/store.js.map +1 -1
  89. package/dist/cjs/store/turso/vectors.js +50 -14
  90. package/dist/cjs/store/turso/vectors.js.map +1 -1
  91. package/dist/cjs/store/types.d.cts +1 -2
  92. package/dist/cjs/store/types.d.ts +1 -2
  93. package/dist/cjs/store/types.js +1 -4
  94. package/dist/cjs/store/types.js.map +1 -1
  95. package/dist/cjs/store/vectors.d.cts +7 -0
  96. package/dist/cjs/store/vectors.d.ts +7 -0
  97. package/dist/cjs/store/vectors.js +8 -0
  98. package/dist/cjs/store/vectors.js.map +1 -1
  99. package/dist/cjs/text/segment.d.cts +13 -0
  100. package/dist/cjs/text/segment.d.ts +13 -0
  101. package/dist/cjs/text/segment.js +109 -4
  102. package/dist/cjs/text/segment.js.map +1 -1
  103. package/dist/esm/cli/index.d.ts +1 -1
  104. package/dist/esm/cli/index.js +1 -1
  105. package/dist/esm/cli/index.js.map +1 -1
  106. package/dist/esm/cli/named.js +6 -2
  107. package/dist/esm/cli/named.js.map +1 -1
  108. package/dist/esm/cli/search.js +5 -1
  109. package/dist/esm/cli/search.js.map +1 -1
  110. package/dist/esm/cli/shared.d.ts +2 -0
  111. package/dist/esm/cli/shared.js +19 -0
  112. package/dist/esm/cli/shared.js.map +1 -1
  113. package/dist/esm/commands/map.js +2 -2
  114. package/dist/esm/commands/map.js.map +1 -1
  115. package/dist/esm/commands/search.d.ts +10 -0
  116. package/dist/esm/commands/search.js +271 -91
  117. package/dist/esm/commands/search.js.map +1 -1
  118. package/dist/esm/output/output.js +27 -4
  119. package/dist/esm/output/output.js.map +1 -1
  120. package/dist/esm/output/search-error.d.ts +1 -0
  121. package/dist/esm/output/search-error.js +17 -1
  122. package/dist/esm/output/search-error.js.map +1 -1
  123. package/dist/esm/scan/frontmatter.js +1 -1
  124. package/dist/esm/scan/frontmatter.js.map +1 -1
  125. package/dist/esm/scan/index.js +1 -0
  126. package/dist/esm/scan/index.js.map +1 -1
  127. package/dist/esm/store/batch.d.ts +4 -0
  128. package/dist/esm/store/batch.js +21 -0
  129. package/dist/esm/store/batch.js.map +1 -0
  130. package/dist/esm/store/duckdb/batch.d.ts +0 -4
  131. package/dist/esm/store/duckdb/batch.js +2 -19
  132. package/dist/esm/store/duckdb/batch.js.map +1 -1
  133. package/dist/esm/store/duckdb/fieldStats.js +4 -7
  134. package/dist/esm/store/duckdb/fieldStats.js.map +1 -1
  135. package/dist/esm/store/duckdb/lexical.d.ts +2 -2
  136. package/dist/esm/store/duckdb/lexical.js +94 -40
  137. package/dist/esm/store/duckdb/lexical.js.map +1 -1
  138. package/dist/esm/store/duckdb/reconcile.js +2 -2
  139. package/dist/esm/store/duckdb/reconcile.js.map +1 -1
  140. package/dist/esm/store/duckdb/store.js +2 -4
  141. package/dist/esm/store/duckdb/store.js.map +1 -1
  142. package/dist/esm/store/duckdb/vectors.js +26 -13
  143. package/dist/esm/store/duckdb/vectors.js.map +1 -1
  144. package/dist/esm/store/native.js +5 -4
  145. package/dist/esm/store/native.js.map +1 -1
  146. package/dist/esm/store/open.js +7 -0
  147. package/dist/esm/store/open.js.map +1 -1
  148. package/dist/esm/store/shared.js +1 -2
  149. package/dist/esm/store/shared.js.map +1 -1
  150. package/dist/esm/store/sqlite/lexical.js +2 -5
  151. package/dist/esm/store/sqlite/lexical.js.map +1 -1
  152. package/dist/esm/store/sqlite/store.js +1 -4
  153. package/dist/esm/store/sqlite/store.js.map +1 -1
  154. package/dist/esm/store/sqlite/vectors.js +48 -19
  155. package/dist/esm/store/sqlite/vectors.js.map +1 -1
  156. package/dist/esm/store/turso/connection.d.ts +3 -0
  157. package/dist/esm/store/turso/connection.js +61 -5
  158. package/dist/esm/store/turso/connection.js.map +1 -1
  159. package/dist/esm/store/turso/lexical-text.d.ts +1 -0
  160. package/dist/esm/store/turso/lexical-text.js +12 -0
  161. package/dist/esm/store/turso/lexical-text.js.map +1 -0
  162. package/dist/esm/store/turso/lexical.js +56 -21
  163. package/dist/esm/store/turso/lexical.js.map +1 -1
  164. package/dist/esm/store/turso/native.d.ts +4 -0
  165. package/dist/esm/store/turso/native.js +8 -0
  166. package/dist/esm/store/turso/native.js.map +1 -1
  167. package/dist/esm/store/turso/open.d.ts +1 -1
  168. package/dist/esm/store/turso/open.js +7 -7
  169. package/dist/esm/store/turso/open.js.map +1 -1
  170. package/dist/esm/store/turso/reconcile.d.ts +1 -1
  171. package/dist/esm/store/turso/reconcile.js +6 -2
  172. package/dist/esm/store/turso/reconcile.js.map +1 -1
  173. package/dist/esm/store/turso/sql-functions.d.ts +1 -0
  174. package/dist/esm/store/turso/sql-functions.js +179 -0
  175. package/dist/esm/store/turso/sql-functions.js.map +1 -0
  176. package/dist/esm/store/turso/store.js +32 -7
  177. package/dist/esm/store/turso/store.js.map +1 -1
  178. package/dist/esm/store/turso/vectors.js +19 -10
  179. package/dist/esm/store/turso/vectors.js.map +1 -1
  180. package/dist/esm/store/types.d.ts +1 -2
  181. package/dist/esm/store/types.js +6 -8
  182. package/dist/esm/store/types.js.map +1 -1
  183. package/dist/esm/store/vectors.d.ts +7 -0
  184. package/dist/esm/store/vectors.js +8 -2
  185. package/dist/esm/store/vectors.js.map +1 -1
  186. package/dist/esm/text/segment.d.ts +13 -0
  187. package/dist/esm/text/segment.js +70 -0
  188. package/dist/esm/text/segment.js.map +1 -1
  189. package/package.json +4 -3
  190. package/schema.json +1 -1
  191. package/skills/sense/EXAMPLES.md +3 -3
  192. package/skills/sense/SKILL.md +6 -6
  193. package/skills/sense-setup/SKILL.md +1 -1
@@ -57,6 +57,17 @@ function _async_to_generator(fn) {
57
57
  });
58
58
  };
59
59
  }
60
+ function _define_property(obj, key, value) {
61
+ if (key in obj) {
62
+ Object.defineProperty(obj, key, {
63
+ value: value,
64
+ enumerable: true,
65
+ configurable: true,
66
+ writable: true
67
+ });
68
+ } else obj[key] = value;
69
+ return obj;
70
+ }
60
71
  function _iterable_to_array(iter) {
61
72
  if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) {
62
73
  return Array.from(iter);
@@ -92,6 +103,21 @@ function _non_iterable_rest() {
92
103
  function _non_iterable_spread() {
93
104
  throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
94
105
  }
106
+ function _object_spread(target) {
107
+ for(var i = 1; i < arguments.length; i++){
108
+ var source = arguments[i] != null ? arguments[i] : {};
109
+ var ownKeys = Object.keys(source);
110
+ if (typeof Object.getOwnPropertySymbols === "function") {
111
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
112
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
113
+ }));
114
+ }
115
+ ownKeys.forEach(function(key) {
116
+ _define_property(target, key, source[key]);
117
+ });
118
+ }
119
+ return target;
120
+ }
95
121
  function _sliced_to_array(arr, i) {
96
122
  return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
97
123
  }
@@ -235,13 +261,13 @@ function writeVectorBatch(conn, rows) {
235
261
  }
236
262
  function scanCandidates(conn, qv, storeDims, fetch, allowed) {
237
263
  return _async_to_generator(function() {
238
- var stmt, rows, best, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, row, q, dot, d, score, existing;
264
+ var stmt, rows, queryNorm, d, best, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, row, q, dot, norm, length, d1, d2, score, existing;
239
265
  return _ts_generator(this, function(_state) {
240
266
  switch(_state.label){
241
267
  case 0:
242
268
  return [
243
269
  4,
244
- conn.prepare('SELECT "path", start_line, end_line, scale, vector FROM embeddings WHERE vector IS NOT NULL')
270
+ conn.prepare('SELECT "path", chunk, start_line, end_line, vector FROM embeddings WHERE vector IS NOT NULL ORDER BY "path", chunk')
245
271
  ];
246
272
  case 1:
247
273
  stmt = _state.sent();
@@ -251,6 +277,9 @@ function scanCandidates(conn, qv, storeDims, fetch, allowed) {
251
277
  ];
252
278
  case 2:
253
279
  rows = _state.sent();
280
+ queryNorm = 0;
281
+ for(d = 0; d < Math.min(storeDims, qv.length); d++)queryNorm += qv[d] * qv[d];
282
+ queryNorm = Math.sqrt(queryNorm);
254
283
  best = new Map();
255
284
  _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
256
285
  try {
@@ -258,14 +287,25 @@ function scanCandidates(conn, qv, storeDims, fetch, allowed) {
258
287
  row = _step.value;
259
288
  if (allowed && !allowed.has(row.path)) continue;
260
289
  q = new Int8Array(row.vector.buffer, row.vector.byteOffset, Math.min(storeDims, row.vector.byteLength));
290
+ // Rounding to int8 costs the stored row its unit norm, so dividing by that norm is what makes
291
+ // this a cosine rather than a scaled dot product. `scale` cancels out of the ratio.
261
292
  dot = 0;
262
- for(d = 0; d < q.length; d++)dot += q[d] * qv[d];
263
- score = dot * row.scale;
293
+ norm = 0;
294
+ length = Math.min(q.length, qv.length);
295
+ for(d1 = 0; d1 < length; d1++){
296
+ dot += q[d1] * qv[d1];
297
+ norm += q[d1] * q[d1];
298
+ }
299
+ for(d2 = length; d2 < q.length; d2++)norm += q[d2] * q[d2];
300
+ score = norm === 0 || queryNorm === 0 ? 0 : dot / (Math.sqrt(norm) * queryNorm);
264
301
  existing = best.get(row.path);
265
- if (!existing || score > existing.score) best.set(row.path, {
266
- score: score,
267
- lines: "L".concat(row.start_line, "-").concat(row.end_line)
268
- });
302
+ if (!existing || score > existing.score || score === existing.score && row.chunk < existing.chunk) {
303
+ best.set(row.path, {
304
+ score: score,
305
+ chunk: row.chunk,
306
+ lines: "L".concat(row.start_line, "-").concat(row.end_line)
307
+ });
308
+ }
269
309
  }
270
310
  } catch (err) {
271
311
  _didIteratorError = true;
@@ -283,14 +323,17 @@ function scanCandidates(conn, qv, storeDims, fetch, allowed) {
283
323
  }
284
324
  return [
285
325
  2,
286
- _to_consumable_array(best.entries()).sort(function(a, b) {
287
- return b[1].score - a[1].score;
288
- }).slice(0, fetch).map(function(param) {
289
- var _param = _sliced_to_array(param, 2), path = _param[0], b = _param[1];
326
+ _to_consumable_array(best.entries()).map(function(param) {
327
+ var _param = _sliced_to_array(param, 2), path = _param[0], value = _param[1];
328
+ return _object_spread({
329
+ path: path
330
+ }, value);
331
+ }).sort(_vectorsts.compareVectorScores).slice(0, fetch).map(function(param) {
332
+ var path = param.path, lines = param.lines, score = param.score;
290
333
  return {
291
334
  path: path,
292
- lines: b.lines,
293
- similarity: (0, _vectorsts.asCosine)(b.score)
335
+ lines: lines,
336
+ similarity: (0, _vectorsts.asCosine)(score)
294
337
  };
295
338
  })
296
339
  ];
@@ -300,13 +343,13 @@ function scanCandidates(conn, qv, storeDims, fetch, allowed) {
300
343
  }
301
344
  function scanSimilar(conn, path, opts) {
302
345
  return _async_to_generator(function() {
303
- var targetStmt, targetRows, target, stmt, rows, best, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, row, other, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, t, dot, len, d, score, existing;
346
+ var targetStmt, targetRows, target, stmt, rows, best, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, row, other, otherNorm, d, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, t, dot, len, d1, score, existing;
304
347
  return _ts_generator(this, function(_state) {
305
348
  switch(_state.label){
306
349
  case 0:
307
350
  return [
308
351
  4,
309
- conn.prepare('SELECT scale, vector FROM embeddings WHERE "path" = ? AND vector IS NOT NULL ORDER BY chunk')
352
+ conn.prepare('SELECT vector FROM embeddings WHERE "path" = ? AND vector IS NOT NULL ORDER BY chunk')
310
353
  ];
311
354
  case 1:
312
355
  targetStmt = _state.sent();
@@ -320,15 +363,19 @@ function scanSimilar(conn, path, opts) {
320
363
  2,
321
364
  []
322
365
  ];
366
+ // Each side's norm divides its own dot product, so both are taken once here rather than per pair.
323
367
  target = (0, _vectorsts.sampleEvenly)(targetRows).map(function(row) {
368
+ var v = new Int8Array(row.vector.buffer, row.vector.byteOffset, row.vector.byteLength);
369
+ var norm = 0;
370
+ for(var d = 0; d < v.length; d++)norm += v[d] * v[d];
324
371
  return {
325
- v: new Int8Array(row.vector.buffer, row.vector.byteOffset, row.vector.byteLength),
326
- scale: row.scale
372
+ v: v,
373
+ norm: Math.sqrt(norm)
327
374
  };
328
375
  });
329
376
  return [
330
377
  4,
331
- conn.prepare('SELECT "path", scale, vector FROM embeddings WHERE vector IS NOT NULL')
378
+ conn.prepare('SELECT "path", vector FROM embeddings WHERE vector IS NOT NULL')
332
379
  ];
333
380
  case 3:
334
381
  stmt = _state.sent();
@@ -345,14 +392,17 @@ function scanSimilar(conn, path, opts) {
345
392
  row = _step.value;
346
393
  if (row.path === path || opts.exclude.has(row.path) || opts.allowed && !opts.allowed.has(row.path)) continue;
347
394
  other = new Int8Array(row.vector.buffer, row.vector.byteOffset, row.vector.byteLength);
395
+ otherNorm = 0;
396
+ for(d = 0; d < other.length; d++)otherNorm += other[d] * other[d];
397
+ otherNorm = Math.sqrt(otherNorm);
348
398
  _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
349
399
  try {
350
400
  for(_iterator1 = target[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
351
401
  t = _step1.value;
352
402
  dot = 0;
353
403
  len = Math.min(t.v.length, other.length);
354
- for(d = 0; d < len; d++)dot += t.v[d] * other[d];
355
- score = dot * t.scale * row.scale;
404
+ for(d1 = 0; d1 < len; d1++)dot += t.v[d1] * other[d1];
405
+ score = t.norm === 0 || otherNorm === 0 ? 0 : dot / (t.norm * otherNorm);
356
406
  existing = best.get(row.path);
357
407
  if (existing === undefined || score > existing) best.set(row.path, score);
358
408
  }
@@ -387,10 +437,14 @@ function scanSimilar(conn, path, opts) {
387
437
  }
388
438
  return [
389
439
  2,
390
- _to_consumable_array(best.entries()).sort(function(a, b) {
391
- return b[1] - a[1];
392
- }).slice(0, opts.k).map(function(param) {
440
+ _to_consumable_array(best.entries()).map(function(param) {
393
441
  var _param = _sliced_to_array(param, 2), p = _param[0], score = _param[1];
442
+ return {
443
+ path: p,
444
+ score: score
445
+ };
446
+ }).sort(_vectorsts.compareVectorScores).slice(0, opts.k).map(function(param) {
447
+ var p = param.path, score = param.score;
394
448
  return {
395
449
  path: p,
396
450
  similarity: (0, _vectorsts.asCosine)(score)
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/store/sqlite/vectors.ts"],"sourcesContent":["import type { Connection, VectorCandidate, VectorSimilar, VectorWriteRow } from '../types.ts';\nimport { asCosine, sampleEvenly } from '../vectors.ts';\n\n// One runBatch call per provider batch: the caller (embed/query.ts) already batches by the\n// provider's batchCap, so this is one crossing per batch, never per row.\nexport async function writeVectorBatch(conn: Connection, rows: VectorWriteRow[]): Promise<void> {\n if (rows.length === 0) return;\n await conn.runBatch(\n 'UPDATE embeddings SET scale = ?, vector = ? WHERE \"path\" = ? AND chunk = ?',\n rows.map((row) => [row.scale, row.vector, row.path, row.chunk])\n );\n}\n\n// Best chunk per file by cosine, its line range riding along: the JS loop over stored int8\n// BLOBs this store's scan strategy is (a native store scans differently, same contract).\nexport async function scanCandidates(conn: Connection, qv: Float32Array, storeDims: number, fetch: number, allowed?: Set<string>): Promise<VectorCandidate[]> {\n const stmt = await conn.prepare('SELECT \"path\", start_line, end_line, scale, vector FROM embeddings WHERE vector IS NOT NULL');\n const rows = (await stmt.all()) as Array<{\n path: string;\n start_line: number;\n end_line: number;\n scale: number;\n vector: Uint8Array;\n }>;\n\n const best = new Map<string, { score: number; lines: string }>();\n for (const row of rows) {\n if (allowed && !allowed.has(row.path)) continue;\n const q = new Int8Array(row.vector.buffer, row.vector.byteOffset, Math.min(storeDims, row.vector.byteLength));\n let dot = 0;\n for (let d = 0; d < q.length; d++) dot += q[d] * qv[d];\n const score = dot * row.scale;\n const existing = best.get(row.path);\n if (!existing || score > existing.score) best.set(row.path, { score, lines: `L${row.start_line}-${row.end_line}` });\n }\n return [...best.entries()]\n .sort((a, b) => b[1].score - a[1].score)\n .slice(0, fetch)\n .map(([path, b]) => ({ path, lines: b.lines, similarity: asCosine(b.score) }));\n}\n\n// Note-to-note similarity is the max cosine over (target chunk, other chunk) pairs, one linear\n// scan of stored vectors.\nexport async function scanSimilar(conn: Connection, path: string, opts: { exclude: Set<string>; allowed?: Set<string>; k: number }): Promise<VectorSimilar[]> {\n const targetStmt = await conn.prepare('SELECT scale, vector FROM embeddings WHERE \"path\" = ? AND vector IS NOT NULL ORDER BY chunk');\n const targetRows = (await targetStmt.all(path)) as Array<{ scale: number; vector: Uint8Array }>;\n if (targetRows.length === 0) return [];\n const target = sampleEvenly(targetRows).map((row) => ({ v: new Int8Array(row.vector.buffer, row.vector.byteOffset, row.vector.byteLength), scale: row.scale }));\n\n const stmt = await conn.prepare('SELECT \"path\", scale, vector FROM embeddings WHERE vector IS NOT NULL');\n const rows = (await stmt.all()) as Array<{ path: string; scale: number; vector: Uint8Array }>;\n const best = new Map<string, number>();\n for (const row of rows) {\n if (row.path === path || opts.exclude.has(row.path) || (opts.allowed && !opts.allowed.has(row.path))) continue;\n const other = new Int8Array(row.vector.buffer, row.vector.byteOffset, row.vector.byteLength);\n for (const t of target) {\n let dot = 0;\n const len = Math.min(t.v.length, other.length);\n for (let d = 0; d < len; d++) dot += t.v[d] * other[d];\n const score = dot * t.scale * row.scale;\n const existing = best.get(row.path);\n if (existing === undefined || score > existing) best.set(row.path, score);\n }\n }\n\n return [...best.entries()]\n .sort((a, b) => b[1] - a[1])\n .slice(0, opts.k)\n .map(([p, score]) => ({ path: p, similarity: asCosine(score) }));\n}\n"],"names":["scanCandidates","scanSimilar","writeVectorBatch","conn","rows","length","runBatch","map","row","scale","vector","path","chunk","qv","storeDims","fetch","allowed","stmt","best","q","dot","d","score","existing","prepare","all","Map","has","Int8Array","buffer","byteOffset","Math","min","byteLength","get","set","lines","start_line","end_line","entries","sort","a","b","slice","similarity","asCosine","opts","targetStmt","targetRows","target","other","t","len","sampleEvenly","v","exclude","undefined","k","p"],"mappings":"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"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/store/sqlite/vectors.ts"],"sourcesContent":["import type { Connection, VectorCandidate, VectorSimilar, VectorWriteRow } from '../types.ts';\nimport { asCosine, compareVectorScores, sampleEvenly } from '../vectors.ts';\n\n// One runBatch call per provider batch: the caller (embed/query.ts) already batches by the\n// provider's batchCap, so this is one crossing per batch, never per row.\nexport async function writeVectorBatch(conn: Connection, rows: VectorWriteRow[]): Promise<void> {\n if (rows.length === 0) return;\n await conn.runBatch(\n 'UPDATE embeddings SET scale = ?, vector = ? WHERE \"path\" = ? AND chunk = ?',\n rows.map((row) => [row.scale, row.vector, row.path, row.chunk])\n );\n}\n\n// Best chunk per file by cosine, its line range riding along: the JS loop over stored int8\n// BLOBs this store's scan strategy is (a native store scans differently, same contract).\nexport async function scanCandidates(conn: Connection, qv: Float32Array, storeDims: number, fetch: number, allowed?: Set<string>): Promise<VectorCandidate[]> {\n const stmt = await conn.prepare('SELECT \"path\", chunk, start_line, end_line, vector FROM embeddings WHERE vector IS NOT NULL ORDER BY \"path\", chunk');\n const rows = (await stmt.all()) as Array<{\n path: string;\n chunk: number;\n start_line: number;\n end_line: number;\n vector: Uint8Array;\n }>;\n\n let queryNorm = 0;\n for (let d = 0; d < Math.min(storeDims, qv.length); d++) queryNorm += qv[d] * qv[d];\n queryNorm = Math.sqrt(queryNorm);\n\n const best = new Map<string, { score: number; chunk: number; lines: string }>();\n for (const row of rows) {\n if (allowed && !allowed.has(row.path)) continue;\n const q = new Int8Array(row.vector.buffer, row.vector.byteOffset, Math.min(storeDims, row.vector.byteLength));\n // Rounding to int8 costs the stored row its unit norm, so dividing by that norm is what makes\n // this a cosine rather than a scaled dot product. `scale` cancels out of the ratio.\n let dot = 0;\n let norm = 0;\n const length = Math.min(q.length, qv.length);\n for (let d = 0; d < length; d++) {\n dot += q[d] * qv[d];\n norm += q[d] * q[d];\n }\n for (let d = length; d < q.length; d++) norm += q[d] * q[d];\n const score = norm === 0 || queryNorm === 0 ? 0 : dot / (Math.sqrt(norm) * queryNorm);\n const existing = best.get(row.path);\n if (!existing || score > existing.score || (score === existing.score && row.chunk < existing.chunk)) {\n best.set(row.path, { score, chunk: row.chunk, lines: `L${row.start_line}-${row.end_line}` });\n }\n }\n return [...best.entries()]\n .map(([path, value]) => ({ path, ...value }))\n .sort(compareVectorScores)\n .slice(0, fetch)\n .map(({ path, lines, score }) => ({ path, lines, similarity: asCosine(score) }));\n}\n\n// Note-to-note similarity is the max cosine over (target chunk, other chunk) pairs, one linear\n// scan of stored vectors.\nexport async function scanSimilar(conn: Connection, path: string, opts: { exclude: Set<string>; allowed?: Set<string>; k: number }): Promise<VectorSimilar[]> {\n const targetStmt = await conn.prepare('SELECT vector FROM embeddings WHERE \"path\" = ? AND vector IS NOT NULL ORDER BY chunk');\n const targetRows = (await targetStmt.all(path)) as Array<{ vector: Uint8Array }>;\n if (targetRows.length === 0) return [];\n // Each side's norm divides its own dot product, so both are taken once here rather than per pair.\n const target = sampleEvenly(targetRows).map((row) => {\n const v = new Int8Array(row.vector.buffer, row.vector.byteOffset, row.vector.byteLength);\n let norm = 0;\n for (let d = 0; d < v.length; d++) norm += v[d] * v[d];\n return { v, norm: Math.sqrt(norm) };\n });\n\n const stmt = await conn.prepare('SELECT \"path\", vector FROM embeddings WHERE vector IS NOT NULL');\n const rows = (await stmt.all()) as Array<{ path: string; vector: Uint8Array }>;\n const best = new Map<string, number>();\n for (const row of rows) {\n if (row.path === path || opts.exclude.has(row.path) || (opts.allowed && !opts.allowed.has(row.path))) continue;\n const other = new Int8Array(row.vector.buffer, row.vector.byteOffset, row.vector.byteLength);\n let otherNorm = 0;\n for (let d = 0; d < other.length; d++) otherNorm += other[d] * other[d];\n otherNorm = Math.sqrt(otherNorm);\n for (const t of target) {\n let dot = 0;\n const len = Math.min(t.v.length, other.length);\n for (let d = 0; d < len; d++) dot += t.v[d] * other[d];\n const score = t.norm === 0 || otherNorm === 0 ? 0 : dot / (t.norm * otherNorm);\n const existing = best.get(row.path);\n if (existing === undefined || score > existing) best.set(row.path, score);\n }\n }\n\n return [...best.entries()]\n .map(([p, score]) => ({ path: p, score }))\n .sort(compareVectorScores)\n .slice(0, opts.k)\n .map(({ path: p, score }) => ({ path: p, similarity: asCosine(score) }));\n}\n"],"names":["scanCandidates","scanSimilar","writeVectorBatch","conn","rows","length","runBatch","map","row","scale","vector","path","chunk","qv","storeDims","fetch","allowed","stmt","queryNorm","d","best","q","dot","norm","score","existing","prepare","all","Math","min","sqrt","Map","has","Int8Array","buffer","byteOffset","byteLength","get","set","lines","start_line","end_line","entries","value","sort","compareVectorScores","slice","similarity","asCosine","opts","targetStmt","targetRows","target","other","otherNorm","t","len","sampleEvenly","v","exclude","undefined","p","k"],"mappings":"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"}
@@ -1,4 +1,7 @@
1
1
  import type { Database } from '@tursodatabase/database';
2
2
  import type { Connection } from '../types.js';
3
3
  export declare function checkpointWal(db: Database): Promise<void>;
4
+ export declare function cacheFilePath(conn: Connection): Promise<string | null>;
5
+ export declare function fileSize(path: string): Promise<number | null>;
6
+ export declare function reclaimSpace(path: string): Promise<void>;
4
7
  export declare function createConnection(db: Database): Connection;
@@ -1,4 +1,7 @@
1
1
  import type { Database } from '@tursodatabase/database';
2
2
  import type { Connection } from '../types.js';
3
3
  export declare function checkpointWal(db: Database): Promise<void>;
4
+ export declare function cacheFilePath(conn: Connection): Promise<string | null>;
5
+ export declare function fileSize(path: string): Promise<number | null>;
6
+ export declare function reclaimSpace(path: string): Promise<void>;
4
7
  export declare function createConnection(db: Database): Connection;