sensemaking 0.15.4 → 0.16.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 (213) hide show
  1. package/README.md +33 -5
  2. package/dist/cjs/cli/download.js +12 -11
  3. package/dist/cjs/cli/download.js.map +1 -1
  4. package/dist/cjs/cli/index.d.cts +1 -1
  5. package/dist/cjs/cli/index.d.ts +1 -1
  6. package/dist/cjs/cli/index.js +1 -1
  7. package/dist/cjs/cli/index.js.map +1 -1
  8. package/dist/cjs/cli/init.js +31 -5
  9. package/dist/cjs/cli/init.js.map +1 -1
  10. package/dist/cjs/cli/status.js +343 -99
  11. package/dist/cjs/cli/status.js.map +1 -1
  12. package/dist/cjs/commands/related.js +17 -13
  13. package/dist/cjs/commands/related.js.map +1 -1
  14. package/dist/cjs/commands/search.js +25 -96
  15. package/dist/cjs/commands/search.js.map +1 -1
  16. package/dist/cjs/commands/signals.d.cts +18 -0
  17. package/dist/cjs/commands/signals.d.ts +18 -0
  18. package/dist/cjs/commands/signals.js +299 -0
  19. package/dist/cjs/commands/signals.js.map +1 -0
  20. package/dist/cjs/commands/status.d.cts +2 -2
  21. package/dist/cjs/commands/status.d.ts +2 -2
  22. package/dist/cjs/commands/status.js +1 -1
  23. package/dist/cjs/commands/status.js.map +1 -1
  24. package/dist/cjs/config/access.d.cts +5 -2
  25. package/dist/cjs/config/access.d.ts +5 -2
  26. package/dist/cjs/config/access.js +30 -12
  27. package/dist/cjs/config/access.js.map +1 -1
  28. package/dist/cjs/config/index.d.cts +4 -1
  29. package/dist/cjs/config/index.d.ts +4 -1
  30. package/dist/cjs/config/index.js +12 -2
  31. package/dist/cjs/config/index.js.map +1 -1
  32. package/dist/cjs/config/load.d.cts +6 -1
  33. package/dist/cjs/config/load.d.ts +6 -1
  34. package/dist/cjs/config/load.js +83 -8
  35. package/dist/cjs/config/load.js.map +1 -1
  36. package/dist/cjs/config/resolve.js +1 -1
  37. package/dist/cjs/config/resolve.js.map +1 -1
  38. package/dist/cjs/config/signals.d.cts +4 -0
  39. package/dist/cjs/config/signals.d.ts +4 -0
  40. package/dist/cjs/config/signals.js +30 -0
  41. package/dist/cjs/config/signals.js.map +1 -0
  42. package/dist/cjs/config/types.d.cts +6 -4
  43. package/dist/cjs/config/types.d.ts +6 -4
  44. package/dist/cjs/config/types.js +1 -1
  45. package/dist/cjs/config/types.js.map +1 -1
  46. package/dist/cjs/config/validate.js +120 -11
  47. package/dist/cjs/config/validate.js.map +1 -1
  48. package/dist/cjs/db/open.d.cts +1 -1
  49. package/dist/cjs/db/open.d.ts +1 -1
  50. package/dist/cjs/db/open.js +6 -1
  51. package/dist/cjs/db/open.js.map +1 -1
  52. package/dist/cjs/db/reconcile.d.cts +1 -0
  53. package/dist/cjs/db/reconcile.d.ts +1 -0
  54. package/dist/cjs/db/reconcile.js +15 -0
  55. package/dist/cjs/db/reconcile.js.map +1 -1
  56. package/dist/cjs/embed/cohere.d.cts +2 -0
  57. package/dist/cjs/embed/cohere.d.ts +2 -0
  58. package/dist/cjs/embed/cohere.js +238 -0
  59. package/dist/cjs/embed/cohere.js.map +1 -0
  60. package/dist/cjs/embed/http.d.cts +2 -0
  61. package/dist/cjs/embed/http.d.ts +2 -0
  62. package/dist/cjs/embed/http.js +258 -0
  63. package/dist/cjs/embed/http.js.map +1 -0
  64. package/dist/cjs/embed/identity.d.cts +13 -0
  65. package/dist/cjs/embed/identity.d.ts +13 -0
  66. package/dist/cjs/embed/identity.js +194 -0
  67. package/dist/cjs/embed/identity.js.map +1 -0
  68. package/dist/cjs/embed/langfit.d.cts +6 -0
  69. package/dist/cjs/embed/langfit.d.ts +6 -0
  70. package/dist/cjs/embed/langfit.js +326 -0
  71. package/dist/cjs/embed/langfit.js.map +1 -0
  72. package/dist/cjs/embed/languages.d.cts +3 -0
  73. package/dist/cjs/embed/languages.d.ts +3 -0
  74. package/dist/cjs/embed/languages.js +98 -0
  75. package/dist/cjs/embed/languages.js.map +1 -0
  76. package/dist/cjs/embed/openai.d.cts +2 -0
  77. package/dist/cjs/embed/openai.d.ts +2 -0
  78. package/dist/cjs/embed/openai.js +268 -0
  79. package/dist/cjs/embed/openai.js.map +1 -0
  80. package/dist/cjs/embed/query.d.cts +21 -0
  81. package/dist/cjs/embed/query.d.ts +21 -0
  82. package/dist/cjs/embed/query.js +610 -0
  83. package/dist/cjs/embed/query.js.map +1 -0
  84. package/dist/cjs/embed/registry.d.cts +3 -0
  85. package/dist/cjs/embed/registry.d.ts +3 -0
  86. package/dist/cjs/embed/registry.js +114 -0
  87. package/dist/cjs/embed/registry.js.map +1 -0
  88. package/dist/cjs/embed/static.d.cts +2 -0
  89. package/dist/cjs/embed/static.d.ts +2 -0
  90. package/dist/cjs/embed/static.js +367 -0
  91. package/dist/cjs/embed/static.js.map +1 -0
  92. package/dist/cjs/embed/store.d.cts +8 -0
  93. package/dist/cjs/embed/store.d.ts +8 -0
  94. package/dist/cjs/embed/store.js +498 -0
  95. package/dist/cjs/embed/store.js.map +1 -0
  96. package/dist/cjs/embed/types.d.cts +8 -0
  97. package/dist/cjs/embed/types.d.ts +8 -0
  98. package/dist/cjs/embed/types.js +7 -0
  99. package/dist/cjs/embed/types.js.map +1 -0
  100. package/dist/cjs/errors.d.cts +1 -1
  101. package/dist/cjs/errors.d.ts +1 -1
  102. package/dist/cjs/errors.js.map +1 -1
  103. package/dist/cjs/features/embed.d.cts +4 -27
  104. package/dist/cjs/features/embed.d.ts +4 -27
  105. package/dist/cjs/features/embed.js +3 -969
  106. package/dist/cjs/features/embed.js.map +1 -1
  107. package/dist/cjs/index.d.cts +1 -1
  108. package/dist/cjs/index.d.ts +1 -1
  109. package/dist/cjs/index.js.map +1 -1
  110. package/dist/cjs/output.d.cts +2 -2
  111. package/dist/cjs/output.d.ts +2 -2
  112. package/dist/cjs/output.js +9 -2
  113. package/dist/cjs/output.js.map +1 -1
  114. package/dist/cjs/scan.js +8 -5
  115. package/dist/cjs/scan.js.map +1 -1
  116. package/dist/cjs/segment.js +67 -14
  117. package/dist/cjs/segment.js.map +1 -1
  118. package/dist/esm/cli/download.js +9 -8
  119. package/dist/esm/cli/download.js.map +1 -1
  120. package/dist/esm/cli/index.d.ts +1 -1
  121. package/dist/esm/cli/index.js +1 -1
  122. package/dist/esm/cli/index.js.map +1 -1
  123. package/dist/esm/cli/init.js +32 -6
  124. package/dist/esm/cli/init.js.map +1 -1
  125. package/dist/esm/cli/status.js +36 -8
  126. package/dist/esm/cli/status.js.map +1 -1
  127. package/dist/esm/commands/related.js +14 -10
  128. package/dist/esm/commands/related.js.map +1 -1
  129. package/dist/esm/commands/search.js +27 -78
  130. package/dist/esm/commands/search.js.map +1 -1
  131. package/dist/esm/commands/signals.d.ts +18 -0
  132. package/dist/esm/commands/signals.js +78 -0
  133. package/dist/esm/commands/signals.js.map +1 -0
  134. package/dist/esm/commands/status.d.ts +2 -2
  135. package/dist/esm/commands/status.js +2 -2
  136. package/dist/esm/commands/status.js.map +1 -1
  137. package/dist/esm/config/access.d.ts +5 -2
  138. package/dist/esm/config/access.js +31 -12
  139. package/dist/esm/config/access.js.map +1 -1
  140. package/dist/esm/config/index.d.ts +4 -1
  141. package/dist/esm/config/index.js +2 -1
  142. package/dist/esm/config/index.js.map +1 -1
  143. package/dist/esm/config/load.d.ts +6 -1
  144. package/dist/esm/config/load.js +67 -9
  145. package/dist/esm/config/load.js.map +1 -1
  146. package/dist/esm/config/resolve.js +2 -2
  147. package/dist/esm/config/resolve.js.map +1 -1
  148. package/dist/esm/config/signals.d.ts +4 -0
  149. package/dist/esm/config/signals.js +14 -0
  150. package/dist/esm/config/signals.js.map +1 -0
  151. package/dist/esm/config/types.d.ts +6 -4
  152. package/dist/esm/config/types.js +1 -1
  153. package/dist/esm/config/types.js.map +1 -1
  154. package/dist/esm/config/validate.js +58 -11
  155. package/dist/esm/config/validate.js.map +1 -1
  156. package/dist/esm/db/open.d.ts +1 -1
  157. package/dist/esm/db/open.js +7 -2
  158. package/dist/esm/db/open.js.map +1 -1
  159. package/dist/esm/db/reconcile.d.ts +1 -0
  160. package/dist/esm/db/reconcile.js +10 -0
  161. package/dist/esm/db/reconcile.js.map +1 -1
  162. package/dist/esm/embed/cohere.d.ts +2 -0
  163. package/dist/esm/embed/cohere.js +46 -0
  164. package/dist/esm/embed/cohere.js.map +1 -0
  165. package/dist/esm/embed/http.d.ts +2 -0
  166. package/dist/esm/embed/http.js +33 -0
  167. package/dist/esm/embed/http.js.map +1 -0
  168. package/dist/esm/embed/identity.d.ts +13 -0
  169. package/dist/esm/embed/identity.js +92 -0
  170. package/dist/esm/embed/identity.js.map +1 -0
  171. package/dist/esm/embed/langfit.d.ts +6 -0
  172. package/dist/esm/embed/langfit.js +44 -0
  173. package/dist/esm/embed/langfit.js.map +1 -0
  174. package/dist/esm/embed/languages.d.ts +3 -0
  175. package/dist/esm/embed/languages.js +80 -0
  176. package/dist/esm/embed/languages.js.map +1 -0
  177. package/dist/esm/embed/openai.d.ts +2 -0
  178. package/dist/esm/embed/openai.js +49 -0
  179. package/dist/esm/embed/openai.js.map +1 -0
  180. package/dist/esm/embed/query.d.ts +21 -0
  181. package/dist/esm/embed/query.js +181 -0
  182. package/dist/esm/embed/query.js.map +1 -0
  183. package/dist/esm/embed/registry.d.ts +3 -0
  184. package/dist/esm/embed/registry.js +45 -0
  185. package/dist/esm/embed/registry.js.map +1 -0
  186. package/dist/esm/embed/static.d.ts +2 -0
  187. package/dist/esm/embed/static.js +72 -0
  188. package/dist/esm/embed/static.js.map +1 -0
  189. package/dist/esm/embed/store.d.ts +8 -0
  190. package/dist/esm/embed/store.js +123 -0
  191. package/dist/esm/embed/store.js.map +1 -0
  192. package/dist/esm/embed/types.d.ts +8 -0
  193. package/dist/esm/embed/types.js +3 -0
  194. package/dist/esm/embed/types.js.map +1 -0
  195. package/dist/esm/errors.d.ts +1 -1
  196. package/dist/esm/errors.js.map +1 -1
  197. package/dist/esm/features/embed.d.ts +4 -27
  198. package/dist/esm/features/embed.js +0 -346
  199. package/dist/esm/features/embed.js.map +1 -1
  200. package/dist/esm/index.d.ts +1 -1
  201. package/dist/esm/index.js.map +1 -1
  202. package/dist/esm/output.d.ts +2 -2
  203. package/dist/esm/output.js +6 -2
  204. package/dist/esm/output.js.map +1 -1
  205. package/dist/esm/scan.js +7 -4
  206. package/dist/esm/scan.js.map +1 -1
  207. package/dist/esm/segment.js +49 -19
  208. package/dist/esm/segment.js.map +1 -1
  209. package/package.json +9 -1
  210. package/schema.json +14 -7
  211. package/skills/sense/SKILL.md +21 -5
  212. package/skills/sense-setup/EXAMPLES.md +6 -6
  213. package/skills/sense-setup/SKILL.md +6 -4
@@ -0,0 +1,498 @@
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 MODEL_FILENAMES () {
13
+ return _identityts.MODEL_FILENAMES;
14
+ },
15
+ get MODEL_FILES () {
16
+ return _identityts.MODEL_FILES;
17
+ },
18
+ get downloadModel () {
19
+ return downloadModel;
20
+ },
21
+ get downloadModelRevision () {
22
+ return downloadModelRevision;
23
+ },
24
+ get hasModelFiles () {
25
+ return _identityts.hasModelFiles;
26
+ },
27
+ get isDownloadable () {
28
+ return _identityts.isDownloadable;
29
+ },
30
+ get localModelMissing () {
31
+ return localModelMissing;
32
+ },
33
+ get modelDir () {
34
+ return _identityts.modelDir;
35
+ },
36
+ get modelPresent () {
37
+ return modelPresent;
38
+ },
39
+ get readLanguages () {
40
+ return _identityts.readLanguages;
41
+ },
42
+ get refsMainPath () {
43
+ return _identityts.refsMainPath;
44
+ },
45
+ get snapshotDir () {
46
+ return _identityts.snapshotDir;
47
+ },
48
+ get writeLanguages () {
49
+ return _identityts.writeLanguages;
50
+ },
51
+ get writeRef () {
52
+ return _identityts.writeRef;
53
+ }
54
+ });
55
+ var _nodefs = require("node:fs");
56
+ var _nodepath = require("node:path");
57
+ var _indexts = require("../config/index.js");
58
+ var _errorsts = require("../errors.js");
59
+ var _httpts = require("./http.js");
60
+ var _identityts = require("./identity.js");
61
+ var _languagests = require("./languages.js");
62
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
63
+ try {
64
+ var info = gen[key](arg);
65
+ var value = info.value;
66
+ } catch (error) {
67
+ reject(error);
68
+ return;
69
+ }
70
+ if (info.done) resolve(value);
71
+ else Promise.resolve(value).then(_next, _throw);
72
+ }
73
+ function _async_to_generator(fn) {
74
+ return function() {
75
+ var self = this, args = arguments;
76
+ return new Promise(function(resolve, reject) {
77
+ var gen = fn.apply(self, args);
78
+ function _next(value) {
79
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
80
+ }
81
+ function _throw(err) {
82
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
83
+ }
84
+ _next(undefined);
85
+ });
86
+ };
87
+ }
88
+ function _ts_generator(thisArg, body) {
89
+ var f, y, t, _ = {
90
+ label: 0,
91
+ sent: function() {
92
+ if (t[0] & 1) throw t[1];
93
+ return t[1];
94
+ },
95
+ trys: [],
96
+ ops: []
97
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
98
+ return d(g, "next", {
99
+ value: verb(0)
100
+ }), d(g, "throw", {
101
+ value: verb(1)
102
+ }), d(g, "return", {
103
+ value: verb(2)
104
+ }), typeof Symbol === "function" && d(g, Symbol.iterator, {
105
+ value: function() {
106
+ return this;
107
+ }
108
+ }), g;
109
+ function verb(n) {
110
+ return function(v) {
111
+ return step([
112
+ n,
113
+ v
114
+ ]);
115
+ };
116
+ }
117
+ function step(op) {
118
+ if (f) throw new TypeError("Generator is already executing.");
119
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
120
+ 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;
121
+ if (y = 0, t) op = [
122
+ op[0] & 2,
123
+ t.value
124
+ ];
125
+ switch(op[0]){
126
+ case 0:
127
+ case 1:
128
+ t = op;
129
+ break;
130
+ case 4:
131
+ _.label++;
132
+ return {
133
+ value: op[1],
134
+ done: false
135
+ };
136
+ case 5:
137
+ _.label++;
138
+ y = op[1];
139
+ op = [
140
+ 0
141
+ ];
142
+ continue;
143
+ case 7:
144
+ op = _.ops.pop();
145
+ _.trys.pop();
146
+ continue;
147
+ default:
148
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
149
+ _ = 0;
150
+ continue;
151
+ }
152
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
153
+ _.label = op[1];
154
+ break;
155
+ }
156
+ if (op[0] === 6 && _.label < t[1]) {
157
+ _.label = t[1];
158
+ t = op;
159
+ break;
160
+ }
161
+ if (t && _.label < t[2]) {
162
+ _.label = t[2];
163
+ _.ops.push(op);
164
+ break;
165
+ }
166
+ if (t[2]) _.ops.pop();
167
+ _.trys.pop();
168
+ continue;
169
+ }
170
+ op = body.call(thisArg, _);
171
+ } catch (e) {
172
+ op = [
173
+ 6,
174
+ e
175
+ ];
176
+ y = 0;
177
+ } finally{
178
+ f = t = 0;
179
+ }
180
+ if (op[0] & 5) throw op[1];
181
+ return {
182
+ value: op[0] ? op[1] : void 0,
183
+ done: true
184
+ };
185
+ }
186
+ }
187
+ function modelPresent(cfg) {
188
+ var e = (0, _indexts.embedConfig)(cfg);
189
+ if (!e) return false;
190
+ return e.provider !== 'static' || (0, _identityts.hasModelFiles)(e.model);
191
+ }
192
+ function localModelMissing(e) {
193
+ return e !== null && e.provider === 'static' && !(0, _identityts.isDownloadable)(e.model) && !(0, _identityts.hasModelFiles)(e.model);
194
+ }
195
+ // `main` resolves to a sha once per model: a recorded ref pins until its snapshot is
196
+ // removed, so only the first need for an id ever costs this HEAD request.
197
+ function resolveSha(model) {
198
+ return _async_to_generator(function() {
199
+ var existing, url, res, err, sha;
200
+ return _ts_generator(this, function(_state) {
201
+ switch(_state.label){
202
+ case 0:
203
+ existing = (0, _identityts.readRef)(model);
204
+ if (existing) return [
205
+ 2,
206
+ existing
207
+ ];
208
+ url = "https://huggingface.co/".concat(model, "/resolve/main/model.safetensors");
209
+ _state.label = 1;
210
+ case 1:
211
+ _state.trys.push([
212
+ 1,
213
+ 3,
214
+ ,
215
+ 4
216
+ ]);
217
+ return [
218
+ 4,
219
+ (0, _httpts.fetchWithRetry)(url, {
220
+ method: 'HEAD',
221
+ redirect: 'manual'
222
+ })
223
+ ];
224
+ case 2:
225
+ res = _state.sent();
226
+ return [
227
+ 3,
228
+ 4
229
+ ];
230
+ case 3:
231
+ err = _state.sent();
232
+ throw new _errorsts.SenseError('EMBED_MODEL', "could not reach ".concat(url, ": ").concat(err.message));
233
+ case 4:
234
+ sha = res.headers.get('x-repo-commit');
235
+ if (!sha) throw new _errorsts.SenseError('EMBED_MODEL', "".concat(url, ": response carried no x-repo-commit header"));
236
+ (0, _identityts.writeRef)(model, sha);
237
+ return [
238
+ 2,
239
+ sha
240
+ ];
241
+ }
242
+ });
243
+ })();
244
+ }
245
+ // cardData.language is the structured field (verified live: minishlab/potion-retrieval-32M has
246
+ // neither this nor any language tag, so it stays silent; potion-multilingual-128M carries an
247
+ // array here). Tags are a fallback for cards that only tag languages, filtered to recognized
248
+ // codes so an unrelated short tag (format markers etc.) is never mistaken for one.
249
+ function languagesFromCard(info) {
250
+ var _info_tags;
251
+ var _info_cardData;
252
+ var lang = (_info_cardData = info.cardData) === null || _info_cardData === void 0 ? void 0 : _info_cardData.language;
253
+ if (typeof lang === 'string') return [
254
+ lang
255
+ ];
256
+ if (Array.isArray(lang) && lang.length > 0) return lang;
257
+ var tagLangs = ((_info_tags = info.tags) !== null && _info_tags !== void 0 ? _info_tags : []).filter(_languagests.isKnownLanguageTag);
258
+ return tagLangs.length > 0 ? tagLangs : undefined;
259
+ }
260
+ // Best-effort, cached forever once resolved (even to "none"): unlike model weights, missing or
261
+ // unreachable metadata is not an error -- it just means the language-fit check stays off.
262
+ function ensureLanguages(model) {
263
+ return _async_to_generator(function() {
264
+ var _languagesFromCard, measured, res, unused, info, unused1;
265
+ return _ts_generator(this, function(_state) {
266
+ switch(_state.label){
267
+ case 0:
268
+ if ((0, _nodefs.existsSync)((0, _identityts.languagesPath)(model))) return [
269
+ 2
270
+ ];
271
+ // A measured entry needs no card and no network, and stays deterministic offline.
272
+ measured = _languagests.MEASURED_MODEL_LANGUAGES[model];
273
+ if (measured) {
274
+ (0, _identityts.writeLanguages)(model, measured);
275
+ return [
276
+ 2
277
+ ];
278
+ }
279
+ _state.label = 1;
280
+ case 1:
281
+ _state.trys.push([
282
+ 1,
283
+ 3,
284
+ ,
285
+ 4
286
+ ]);
287
+ return [
288
+ 4,
289
+ (0, _httpts.fetchWithRetry)("https://huggingface.co/api/models/".concat(model), {})
290
+ ];
291
+ case 2:
292
+ res = _state.sent();
293
+ return [
294
+ 3,
295
+ 4
296
+ ];
297
+ case 3:
298
+ unused = _state.sent();
299
+ return [
300
+ 2
301
+ ];
302
+ case 4:
303
+ if (!res.ok) return [
304
+ 2
305
+ ];
306
+ _state.label = 5;
307
+ case 5:
308
+ _state.trys.push([
309
+ 5,
310
+ 7,
311
+ ,
312
+ 8
313
+ ]);
314
+ return [
315
+ 4,
316
+ res.json()
317
+ ];
318
+ case 6:
319
+ info = _state.sent();
320
+ return [
321
+ 3,
322
+ 8
323
+ ];
324
+ case 7:
325
+ unused1 = _state.sent();
326
+ return [
327
+ 2
328
+ ];
329
+ case 8:
330
+ (0, _identityts.writeLanguages)(model, (_languagesFromCard = languagesFromCard(info)) !== null && _languagesFromCard !== void 0 ? _languagesFromCard : []);
331
+ return [
332
+ 2
333
+ ];
334
+ }
335
+ });
336
+ })();
337
+ }
338
+ function fetchToFile(url, dest) {
339
+ return _async_to_generator(function() {
340
+ var res, err, _tmp, _;
341
+ return _ts_generator(this, function(_state) {
342
+ switch(_state.label){
343
+ case 0:
344
+ _state.trys.push([
345
+ 0,
346
+ 2,
347
+ ,
348
+ 3
349
+ ]);
350
+ return [
351
+ 4,
352
+ (0, _httpts.fetchWithRetry)(url, {})
353
+ ];
354
+ case 1:
355
+ res = _state.sent();
356
+ return [
357
+ 3,
358
+ 3
359
+ ];
360
+ case 2:
361
+ err = _state.sent();
362
+ throw new _errorsts.SenseError('EMBED_MODEL', "could not reach ".concat(url, ": ").concat(err.message));
363
+ case 3:
364
+ if (!res.ok) throw new _errorsts.SenseError('EMBED_MODEL', "".concat(url, " -> HTTP ").concat(res.status));
365
+ _tmp = [
366
+ "".concat(dest, ".part")
367
+ ];
368
+ _ = Buffer.from;
369
+ return [
370
+ 4,
371
+ res.arrayBuffer()
372
+ ];
373
+ case 4:
374
+ _nodefs.writeFileSync.apply(void 0, _tmp.concat([
375
+ _.apply(Buffer, [
376
+ _state.sent()
377
+ ])
378
+ ]));
379
+ (0, _nodefs.renameSync)("".concat(dest, ".part"), dest);
380
+ return [
381
+ 2
382
+ ];
383
+ }
384
+ });
385
+ })();
386
+ }
387
+ function downloadModelRevision(model, sha, onFile) {
388
+ return _async_to_generator(function() {
389
+ var dir, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, file, err;
390
+ return _ts_generator(this, function(_state) {
391
+ switch(_state.label){
392
+ case 0:
393
+ dir = (0, _identityts.snapshotDir)(model, sha);
394
+ (0, _nodefs.mkdirSync)(dir, {
395
+ recursive: true
396
+ });
397
+ _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
398
+ _state.label = 1;
399
+ case 1:
400
+ _state.trys.push([
401
+ 1,
402
+ 6,
403
+ 7,
404
+ 8
405
+ ]);
406
+ _iterator = _identityts.MODEL_FILES[Symbol.iterator]();
407
+ _state.label = 2;
408
+ case 2:
409
+ if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
410
+ 3,
411
+ 5
412
+ ];
413
+ file = _step.value;
414
+ if ((0, _nodefs.existsSync)((0, _nodepath.join)(dir, file))) return [
415
+ 3,
416
+ 4
417
+ ];
418
+ onFile === null || onFile === void 0 ? void 0 : onFile(file, dir);
419
+ return [
420
+ 4,
421
+ fetchToFile("https://huggingface.co/".concat(model, "/resolve/").concat(sha, "/").concat(file), (0, _nodepath.join)(dir, file))
422
+ ];
423
+ case 3:
424
+ _state.sent();
425
+ _state.label = 4;
426
+ case 4:
427
+ _iteratorNormalCompletion = true;
428
+ return [
429
+ 3,
430
+ 2
431
+ ];
432
+ case 5:
433
+ return [
434
+ 3,
435
+ 8
436
+ ];
437
+ case 6:
438
+ err = _state.sent();
439
+ _didIteratorError = true;
440
+ _iteratorError = err;
441
+ return [
442
+ 3,
443
+ 8
444
+ ];
445
+ case 7:
446
+ try {
447
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
448
+ _iterator.return();
449
+ }
450
+ } finally{
451
+ if (_didIteratorError) {
452
+ throw _iteratorError;
453
+ }
454
+ }
455
+ return [
456
+ 7
457
+ ];
458
+ case 8:
459
+ return [
460
+ 2,
461
+ dir
462
+ ];
463
+ }
464
+ });
465
+ })();
466
+ }
467
+ function downloadModel(model, onFile) {
468
+ return _async_to_generator(function() {
469
+ var sha;
470
+ return _ts_generator(this, function(_state) {
471
+ switch(_state.label){
472
+ case 0:
473
+ if (!(0, _identityts.isDownloadable)(model)) {
474
+ throw new _errorsts.SenseError('EMBED_MODEL', 'embed.model "'.concat(model, '" is a local path, not a Hugging Face model id, so there is nothing to download; put model.safetensors and tokenizer.json in that directory, or name a model id like "minishlab/potion-retrieval-32M"'));
475
+ }
476
+ return [
477
+ 4,
478
+ resolveSha(model)
479
+ ];
480
+ case 1:
481
+ sha = _state.sent();
482
+ // Independent of the weights above: a fresh HEAD/GET pair either way, so a lazy first
483
+ // construction and an explicit prefetch both end up with a cached language verdict.
484
+ return [
485
+ 4,
486
+ ensureLanguages(model)
487
+ ];
488
+ case 2:
489
+ _state.sent();
490
+ return [
491
+ 2,
492
+ downloadModelRevision(model, sha, onFile)
493
+ ];
494
+ }
495
+ });
496
+ })();
497
+ }
498
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/embed/store.ts"],"sourcesContent":["import { existsSync, mkdirSync, renameSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Config } from '../config/index.ts';\nimport { embedConfig } from '../config/index.ts';\nimport { SenseError } from '../errors.ts';\nimport { fetchWithRetry } from './http.ts';\nimport { hasModelFiles, isDownloadable, languagesPath, MODEL_FILES, readRef, snapshotDir, writeLanguages, writeRef } from './identity.ts';\nimport { isKnownLanguageTag, MEASURED_MODEL_LANGUAGES } from './languages.ts';\n\n// identity.ts holds paths and cache identity, no network; store.ts holds the network fetches\n// (downloads, sha resolution, language metadata). Re-exported here for callers that otherwise\n// only need store.ts's network surface.\nexport { hasModelFiles, isDownloadable, MODEL_FILENAMES, MODEL_FILES, modelDir, readLanguages, refsMainPath, snapshotDir, writeLanguages, writeRef } from './identity.ts';\n\n// A non-static provider has nothing to download here; an unreachable endpoint surfaces as an\n// EMBED_MODEL error at call time instead.\nexport function modelPresent(cfg: Config): boolean {\n const e = embedConfig(cfg);\n if (!e) return false;\n return e.provider !== 'static' || hasModelFiles(e.model);\n}\n\ntype ResolvedEmbedConfig = NonNullable<ReturnType<typeof embedConfig>>;\n\n// True when embed.model names a local path (not a Hugging Face id) that is missing its model\n// files -- nothing will ever fetch it for itself, unlike a downloadable id.\nexport function localModelMissing(e: ResolvedEmbedConfig | null): e is ResolvedEmbedConfig {\n return e !== null && e.provider === 'static' && !isDownloadable(e.model) && !hasModelFiles(e.model);\n}\n\n// `main` resolves to a sha once per model: a recorded ref pins until its snapshot is\n// removed, so only the first need for an id ever costs this HEAD request.\nasync function resolveSha(model: string): Promise<string> {\n const existing = readRef(model);\n if (existing) return existing;\n const url = `https://huggingface.co/${model}/resolve/main/model.safetensors`;\n // redirect: manual -- the header rides the Hub's own response; following the LFS/CDN\n // redirect would read the CDN's headers instead, which do not carry it.\n let res: Response;\n try {\n res = await fetchWithRetry(url, { method: 'HEAD', redirect: 'manual' });\n } catch (err) {\n throw new SenseError('EMBED_MODEL', `could not reach ${url}: ${(err as Error).message}`);\n }\n const sha = res.headers.get('x-repo-commit');\n if (!sha) throw new SenseError('EMBED_MODEL', `${url}: response carried no x-repo-commit header`);\n writeRef(model, sha);\n return sha;\n}\n\ninterface HfModelInfo {\n cardData?: { language?: string | string[] };\n tags?: string[];\n}\n\n// cardData.language is the structured field (verified live: minishlab/potion-retrieval-32M has\n// neither this nor any language tag, so it stays silent; potion-multilingual-128M carries an\n// array here). Tags are a fallback for cards that only tag languages, filtered to recognized\n// codes so an unrelated short tag (format markers etc.) is never mistaken for one.\nfunction languagesFromCard(info: HfModelInfo): string[] | undefined {\n const lang = info.cardData?.language;\n if (typeof lang === 'string') return [lang];\n if (Array.isArray(lang) && lang.length > 0) return lang;\n const tagLangs = (info.tags ?? []).filter(isKnownLanguageTag);\n return tagLangs.length > 0 ? tagLangs : undefined;\n}\n\n// Best-effort, cached forever once resolved (even to \"none\"): unlike model weights, missing or\n// unreachable metadata is not an error -- it just means the language-fit check stays off.\nasync function ensureLanguages(model: string): Promise<void> {\n if (existsSync(languagesPath(model))) return;\n // A measured entry needs no card and no network, and stays deterministic offline.\n const measured = MEASURED_MODEL_LANGUAGES[model];\n if (measured) {\n writeLanguages(model, measured);\n return;\n }\n let res: Response;\n try {\n res = await fetchWithRetry(`https://huggingface.co/api/models/${model}`, {});\n } catch {\n return;\n }\n if (!res.ok) return;\n let info: HfModelInfo;\n try {\n info = (await res.json()) as HfModelInfo;\n } catch {\n return;\n }\n writeLanguages(model, languagesFromCard(info) ?? []);\n}\n\nasync function fetchToFile(url: string, dest: string): Promise<void> {\n let res: Response;\n try {\n res = await fetchWithRetry(url, {});\n } catch (err) {\n throw new SenseError('EMBED_MODEL', `could not reach ${url}: ${(err as Error).message}`);\n }\n if (!res.ok) throw new SenseError('EMBED_MODEL', `${url} -> HTTP ${res.status}`);\n writeFileSync(`${dest}.part`, Buffer.from(await res.arrayBuffer()));\n renameSync(`${dest}.part`, dest);\n}\n\n// Fetches an already-known sha straight into its snapshot dir, without touching refs/main --\n// for downloadModel below, and for callers pinning an exact revision (the parity suite).\nexport async function downloadModelRevision(model: string, sha: string, onFile?: (file: string, dir: string) => void): Promise<string> {\n const dir = snapshotDir(model, sha);\n mkdirSync(dir, { recursive: true });\n for (const file of MODEL_FILES) {\n if (existsSync(join(dir, file))) continue;\n onFile?.(file, dir);\n await fetchToFile(`https://huggingface.co/${model}/resolve/${sha}/${file}`, join(dir, file));\n }\n return dir;\n}\n\n// The only code path that resolves `main`: a static provider's first construction calls it\n// lazily, `sense download` as an explicit prefetch. Idempotent either way.\nexport async function downloadModel(model: string, onFile?: (file: string, dir: string) => void): Promise<string> {\n if (!isDownloadable(model)) {\n throw new SenseError('EMBED_MODEL', `embed.model \"${model}\" is a local path, not a Hugging Face model id, so there is nothing to download; put model.safetensors and tokenizer.json in that directory, or name a model id like \"minishlab/potion-retrieval-32M\"`);\n }\n const sha = await resolveSha(model);\n // Independent of the weights above: a fresh HEAD/GET pair either way, so a lazy first\n // construction and an explicit prefetch both end up with a cached language verdict.\n await ensureLanguages(model);\n return downloadModelRevision(model, sha, onFile);\n}\n"],"names":["MODEL_FILENAMES","MODEL_FILES","downloadModel","downloadModelRevision","hasModelFiles","isDownloadable","localModelMissing","modelDir","modelPresent","readLanguages","refsMainPath","snapshotDir","writeLanguages","writeRef","cfg","e","embedConfig","provider","model","resolveSha","existing","url","res","err","sha","readRef","fetchWithRetry","method","redirect","SenseError","message","headers","get","languagesFromCard","info","lang","cardData","language","Array","isArray","length","tagLangs","tags","filter","isKnownLanguageTag","undefined","ensureLanguages","measured","existsSync","languagesPath","MEASURED_MODEL_LANGUAGES","ok","json","fetchToFile","dest","status","Buffer","from","arrayBuffer","writeFileSync","renameSync","onFile","dir","file","mkdirSync","recursive","join"],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export interface EmbedProvider {
2
+ id: string;
3
+ dims: number;
4
+ batchCap: number;
5
+ languages?: string[];
6
+ embedDocuments(texts: string[]): Promise<Float32Array[]>;
7
+ embedQuery(text: string): Promise<Float32Array>;
8
+ }
@@ -0,0 +1,8 @@
1
+ export interface EmbedProvider {
2
+ id: string;
3
+ dims: number;
4
+ batchCap: number;
5
+ languages?: string[];
6
+ embedDocuments(texts: string[]): Promise<Float32Array[]>;
7
+ embedQuery(text: string): Promise<Float32Array>;
8
+ }
@@ -0,0 +1,7 @@
1
+ // The provider contract every wire protocol implements: a Liskov-substitutable
2
+ // surface so query/search code never branches on provider identity.
3
+ "use strict";
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ /* CJS INTEROP */ if (exports.__esModule && exports.default) { try { Object.defineProperty(exports.default, '__esModule', { value: true }); for (var key in exports) { exports.default[key] = exports[key]; } } catch (_) {}; module.exports = exports.default; }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/embed/types.ts"],"sourcesContent":["// The provider contract every wire protocol implements: a Liskov-substitutable\n// surface so query/search code never branches on provider identity.\nexport interface EmbedProvider {\n id: string; // model identity; participates in the cache key, change -> re-embed\n dims: number;\n batchCap: number; // max texts per embedDocuments call\n languages?: string[]; // declared model languages, for the language-fit check\n embedDocuments(texts: string[]): Promise<Float32Array[]>;\n embedQuery(text: string): Promise<Float32Array>;\n}\n"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,oEAAoE"}
@@ -1,4 +1,4 @@
1
- export type SenseErrorCode = 'CONFIG_NOT_FOUND' | 'CONFIG_EXISTS' | 'CONFIG_INVALID' | 'CONFIG_VERSION_UNSUPPORTED' | 'WATCH_ACTIVE' | 'NOTE_NOT_FOUND' | 'NOTE_AMBIGUOUS' | 'EMBED_DISABLED' | 'EMBED_MODEL' | 'EMBED_MODEL_MISSING' | 'SEARCH_SYNTAX' | 'COLUMN_LIMIT' | 'PRESET_UNKNOWN' | 'PRESET_NOT_SEMANTIC' | 'NOTE_NOT_EMBEDDED';
1
+ export type SenseErrorCode = 'CONFIG_NOT_FOUND' | 'CONFIG_EXISTS' | 'CONFIG_INVALID' | 'CONFIG_VERSION_UNSUPPORTED' | 'WATCH_ACTIVE' | 'NOTE_NOT_FOUND' | 'NOTE_AMBIGUOUS' | 'EMBED_DISABLED' | 'EMBED_MODEL' | 'EMBED_MODEL_MISSING' | 'EMBED_MODEL_MISMATCH' | 'SEARCH_SYNTAX' | 'COLUMN_LIMIT' | 'PRESET_UNKNOWN' | 'PRESET_NOT_SEMANTIC' | 'NOTE_NOT_EMBEDDED';
2
2
  export declare class SenseError extends Error {
3
3
  code: SenseErrorCode;
4
4
  constructor(code: SenseErrorCode, message: string);
@@ -1,4 +1,4 @@
1
- export type SenseErrorCode = 'CONFIG_NOT_FOUND' | 'CONFIG_EXISTS' | 'CONFIG_INVALID' | 'CONFIG_VERSION_UNSUPPORTED' | 'WATCH_ACTIVE' | 'NOTE_NOT_FOUND' | 'NOTE_AMBIGUOUS' | 'EMBED_DISABLED' | 'EMBED_MODEL' | 'EMBED_MODEL_MISSING' | 'SEARCH_SYNTAX' | 'COLUMN_LIMIT' | 'PRESET_UNKNOWN' | 'PRESET_NOT_SEMANTIC' | 'NOTE_NOT_EMBEDDED';
1
+ export type SenseErrorCode = 'CONFIG_NOT_FOUND' | 'CONFIG_EXISTS' | 'CONFIG_INVALID' | 'CONFIG_VERSION_UNSUPPORTED' | 'WATCH_ACTIVE' | 'NOTE_NOT_FOUND' | 'NOTE_AMBIGUOUS' | 'EMBED_DISABLED' | 'EMBED_MODEL' | 'EMBED_MODEL_MISSING' | 'EMBED_MODEL_MISMATCH' | 'SEARCH_SYNTAX' | 'COLUMN_LIMIT' | 'PRESET_UNKNOWN' | 'PRESET_NOT_SEMANTIC' | 'NOTE_NOT_EMBEDDED';
2
2
  export declare class SenseError extends Error {
3
3
  code: SenseErrorCode;
4
4
  constructor(code: SenseErrorCode, message: string);
@@ -1 +1 @@
1
- {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/errors.ts"],"sourcesContent":["// Library code throws; only cli.ts prints and exits.\nexport type SenseErrorCode =\n | 'CONFIG_NOT_FOUND'\n | 'CONFIG_EXISTS'\n | 'CONFIG_INVALID'\n | 'CONFIG_VERSION_UNSUPPORTED'\n | 'WATCH_ACTIVE'\n | 'NOTE_NOT_FOUND'\n | 'NOTE_AMBIGUOUS'\n | 'EMBED_DISABLED'\n | 'EMBED_MODEL'\n | 'EMBED_MODEL_MISSING'\n | 'SEARCH_SYNTAX'\n | 'COLUMN_LIMIT'\n | 'PRESET_UNKNOWN'\n | 'PRESET_NOT_SEMANTIC'\n | 'NOTE_NOT_EMBEDDED';\n\nexport class SenseError extends Error {\n code: SenseErrorCode;\n\n constructor(code: SenseErrorCode, message: string) {\n super(message);\n this.name = 'SenseError';\n this.code = code;\n }\n}\n"],"names":["SenseError","code","message","name","Error"],"mappings":"AAAA,qDAAqD;;;;;+BAkBxCA;;;eAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAN,IAAA,AAAMA,2BAAN;;cAAMA;aAAAA,WAGCC,IAAoB,EAAEC,OAAe;gCAHtCF;;gBAIT,kBAJSA;YAIHE;;QACN,MAAKC,IAAI,GAAG;QACZ,MAAKF,IAAI,GAAGA;;;WANHD;qBAAmBI"}
1
+ {"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/sensemaking/src/errors.ts"],"sourcesContent":["// Library code throws; only cli.ts prints and exits.\nexport type SenseErrorCode =\n | 'CONFIG_NOT_FOUND'\n | 'CONFIG_EXISTS'\n | 'CONFIG_INVALID'\n | 'CONFIG_VERSION_UNSUPPORTED'\n | 'WATCH_ACTIVE'\n | 'NOTE_NOT_FOUND'\n | 'NOTE_AMBIGUOUS'\n | 'EMBED_DISABLED'\n | 'EMBED_MODEL'\n | 'EMBED_MODEL_MISSING'\n | 'EMBED_MODEL_MISMATCH'\n | 'SEARCH_SYNTAX'\n | 'COLUMN_LIMIT'\n | 'PRESET_UNKNOWN'\n | 'PRESET_NOT_SEMANTIC'\n | 'NOTE_NOT_EMBEDDED';\n\nexport class SenseError extends Error {\n code: SenseErrorCode;\n\n constructor(code: SenseErrorCode, message: string) {\n super(message);\n this.name = 'SenseError';\n this.code = code;\n }\n}\n"],"names":["SenseError","code","message","name","Error"],"mappings":"AAAA,qDAAqD;;;;;+BAmBxCA;;;eAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAN,IAAA,AAAMA,2BAAN;;cAAMA;aAAAA,WAGCC,IAAoB,EAAEC,OAAe;gCAHtCF;;gBAIT,kBAJSA;YAIHE;;QACN,MAAKC,IAAI,GAAG;QACZ,MAAKF,IAAI,GAAGA;;;WANHD;qBAAmBI"}
@@ -1,30 +1,7 @@
1
- import type { DatabaseSync } from 'node:sqlite';
2
- import type { Config } from '../config/index.js';
3
1
  import type { Feature } from './types.js';
4
- export interface EmbedProvider {
5
- id: string;
6
- dims: number;
7
- embed(texts: string[]): Promise<Float32Array[]>;
2
+ export interface Chunk {
3
+ startLine: number;
4
+ endLine: number;
5
+ text: string;
8
6
  }
9
7
  export declare const embed: Feature;
10
- export declare const MODEL_FILENAMES: string;
11
- export declare function isDownloadable(model: string): boolean;
12
- export declare function modelDir(model: string): string;
13
- export declare function hasModelFiles(model: string): boolean;
14
- export declare function modelPresent(cfg: Config): boolean;
15
- export declare function downloadModel(model: string, onFile?: (file: string, dir: string) => void): Promise<string>;
16
- export declare function embedPending(db: DatabaseSync, cfg: Config, baseDir: string): Promise<void>;
17
- export declare function semanticCandidates(db: DatabaseSync, cfg: Config, terms: string, fetch: number, allowed?: Set<string>): Promise<Array<{
18
- path: string;
19
- lines: string;
20
- similarity: number;
21
- }>>;
22
- export declare function hasEmbedding(db: DatabaseSync, path: string): boolean;
23
- export declare function similarNotes(db: DatabaseSync, _cfg: Config, path: string, opts: {
24
- exclude: Set<string>;
25
- allowed?: Set<string>;
26
- k: number;
27
- }): Array<{
28
- path: string;
29
- similarity: number;
30
- }>;
@@ -1,30 +1,7 @@
1
- import type { DatabaseSync } from 'node:sqlite';
2
- import type { Config } from '../config/index.js';
3
1
  import type { Feature } from './types.js';
4
- export interface EmbedProvider {
5
- id: string;
6
- dims: number;
7
- embed(texts: string[]): Promise<Float32Array[]>;
2
+ export interface Chunk {
3
+ startLine: number;
4
+ endLine: number;
5
+ text: string;
8
6
  }
9
7
  export declare const embed: Feature;
10
- export declare const MODEL_FILENAMES: string;
11
- export declare function isDownloadable(model: string): boolean;
12
- export declare function modelDir(model: string): string;
13
- export declare function hasModelFiles(model: string): boolean;
14
- export declare function modelPresent(cfg: Config): boolean;
15
- export declare function downloadModel(model: string, onFile?: (file: string, dir: string) => void): Promise<string>;
16
- export declare function embedPending(db: DatabaseSync, cfg: Config, baseDir: string): Promise<void>;
17
- export declare function semanticCandidates(db: DatabaseSync, cfg: Config, terms: string, fetch: number, allowed?: Set<string>): Promise<Array<{
18
- path: string;
19
- lines: string;
20
- similarity: number;
21
- }>>;
22
- export declare function hasEmbedding(db: DatabaseSync, path: string): boolean;
23
- export declare function similarNotes(db: DatabaseSync, _cfg: Config, path: string, opts: {
24
- exclude: Set<string>;
25
- allowed?: Set<string>;
26
- k: number;
27
- }): Array<{
28
- path: string;
29
- similarity: number;
30
- }>;