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.
- package/README.md +33 -5
- package/dist/cjs/cli/download.js +12 -11
- package/dist/cjs/cli/download.js.map +1 -1
- package/dist/cjs/cli/index.d.cts +1 -1
- package/dist/cjs/cli/index.d.ts +1 -1
- package/dist/cjs/cli/index.js +1 -1
- package/dist/cjs/cli/index.js.map +1 -1
- package/dist/cjs/cli/init.js +31 -5
- package/dist/cjs/cli/init.js.map +1 -1
- package/dist/cjs/cli/status.js +343 -99
- package/dist/cjs/cli/status.js.map +1 -1
- package/dist/cjs/commands/related.js +17 -13
- package/dist/cjs/commands/related.js.map +1 -1
- package/dist/cjs/commands/search.js +25 -96
- package/dist/cjs/commands/search.js.map +1 -1
- package/dist/cjs/commands/signals.d.cts +18 -0
- package/dist/cjs/commands/signals.d.ts +18 -0
- package/dist/cjs/commands/signals.js +299 -0
- package/dist/cjs/commands/signals.js.map +1 -0
- package/dist/cjs/commands/status.d.cts +2 -2
- package/dist/cjs/commands/status.d.ts +2 -2
- package/dist/cjs/commands/status.js +1 -1
- package/dist/cjs/commands/status.js.map +1 -1
- package/dist/cjs/config/access.d.cts +5 -2
- package/dist/cjs/config/access.d.ts +5 -2
- package/dist/cjs/config/access.js +30 -12
- package/dist/cjs/config/access.js.map +1 -1
- package/dist/cjs/config/index.d.cts +4 -1
- package/dist/cjs/config/index.d.ts +4 -1
- package/dist/cjs/config/index.js +12 -2
- package/dist/cjs/config/index.js.map +1 -1
- package/dist/cjs/config/load.d.cts +6 -1
- package/dist/cjs/config/load.d.ts +6 -1
- package/dist/cjs/config/load.js +83 -8
- package/dist/cjs/config/load.js.map +1 -1
- package/dist/cjs/config/resolve.js +1 -1
- package/dist/cjs/config/resolve.js.map +1 -1
- package/dist/cjs/config/signals.d.cts +4 -0
- package/dist/cjs/config/signals.d.ts +4 -0
- package/dist/cjs/config/signals.js +30 -0
- package/dist/cjs/config/signals.js.map +1 -0
- package/dist/cjs/config/types.d.cts +6 -4
- package/dist/cjs/config/types.d.ts +6 -4
- package/dist/cjs/config/types.js +1 -1
- package/dist/cjs/config/types.js.map +1 -1
- package/dist/cjs/config/validate.js +120 -11
- package/dist/cjs/config/validate.js.map +1 -1
- package/dist/cjs/db/open.d.cts +1 -1
- package/dist/cjs/db/open.d.ts +1 -1
- package/dist/cjs/db/open.js +6 -1
- package/dist/cjs/db/open.js.map +1 -1
- package/dist/cjs/db/reconcile.d.cts +1 -0
- package/dist/cjs/db/reconcile.d.ts +1 -0
- package/dist/cjs/db/reconcile.js +15 -0
- package/dist/cjs/db/reconcile.js.map +1 -1
- package/dist/cjs/embed/cohere.d.cts +2 -0
- package/dist/cjs/embed/cohere.d.ts +2 -0
- package/dist/cjs/embed/cohere.js +238 -0
- package/dist/cjs/embed/cohere.js.map +1 -0
- package/dist/cjs/embed/http.d.cts +2 -0
- package/dist/cjs/embed/http.d.ts +2 -0
- package/dist/cjs/embed/http.js +258 -0
- package/dist/cjs/embed/http.js.map +1 -0
- package/dist/cjs/embed/identity.d.cts +13 -0
- package/dist/cjs/embed/identity.d.ts +13 -0
- package/dist/cjs/embed/identity.js +194 -0
- package/dist/cjs/embed/identity.js.map +1 -0
- package/dist/cjs/embed/langfit.d.cts +6 -0
- package/dist/cjs/embed/langfit.d.ts +6 -0
- package/dist/cjs/embed/langfit.js +326 -0
- package/dist/cjs/embed/langfit.js.map +1 -0
- package/dist/cjs/embed/languages.d.cts +3 -0
- package/dist/cjs/embed/languages.d.ts +3 -0
- package/dist/cjs/embed/languages.js +98 -0
- package/dist/cjs/embed/languages.js.map +1 -0
- package/dist/cjs/embed/openai.d.cts +2 -0
- package/dist/cjs/embed/openai.d.ts +2 -0
- package/dist/cjs/embed/openai.js +268 -0
- package/dist/cjs/embed/openai.js.map +1 -0
- package/dist/cjs/embed/query.d.cts +21 -0
- package/dist/cjs/embed/query.d.ts +21 -0
- package/dist/cjs/embed/query.js +610 -0
- package/dist/cjs/embed/query.js.map +1 -0
- package/dist/cjs/embed/registry.d.cts +3 -0
- package/dist/cjs/embed/registry.d.ts +3 -0
- package/dist/cjs/embed/registry.js +114 -0
- package/dist/cjs/embed/registry.js.map +1 -0
- package/dist/cjs/embed/static.d.cts +2 -0
- package/dist/cjs/embed/static.d.ts +2 -0
- package/dist/cjs/embed/static.js +367 -0
- package/dist/cjs/embed/static.js.map +1 -0
- package/dist/cjs/embed/store.d.cts +8 -0
- package/dist/cjs/embed/store.d.ts +8 -0
- package/dist/cjs/embed/store.js +498 -0
- package/dist/cjs/embed/store.js.map +1 -0
- package/dist/cjs/embed/types.d.cts +8 -0
- package/dist/cjs/embed/types.d.ts +8 -0
- package/dist/cjs/embed/types.js +7 -0
- package/dist/cjs/embed/types.js.map +1 -0
- package/dist/cjs/errors.d.cts +1 -1
- package/dist/cjs/errors.d.ts +1 -1
- package/dist/cjs/errors.js.map +1 -1
- package/dist/cjs/features/embed.d.cts +4 -27
- package/dist/cjs/features/embed.d.ts +4 -27
- package/dist/cjs/features/embed.js +3 -969
- package/dist/cjs/features/embed.js.map +1 -1
- package/dist/cjs/index.d.cts +1 -1
- package/dist/cjs/index.d.ts +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/output.d.cts +2 -2
- package/dist/cjs/output.d.ts +2 -2
- package/dist/cjs/output.js +9 -2
- package/dist/cjs/output.js.map +1 -1
- package/dist/cjs/scan.js +8 -5
- package/dist/cjs/scan.js.map +1 -1
- package/dist/cjs/segment.js +67 -14
- package/dist/cjs/segment.js.map +1 -1
- package/dist/esm/cli/download.js +9 -8
- package/dist/esm/cli/download.js.map +1 -1
- package/dist/esm/cli/index.d.ts +1 -1
- package/dist/esm/cli/index.js +1 -1
- package/dist/esm/cli/index.js.map +1 -1
- package/dist/esm/cli/init.js +32 -6
- package/dist/esm/cli/init.js.map +1 -1
- package/dist/esm/cli/status.js +36 -8
- package/dist/esm/cli/status.js.map +1 -1
- package/dist/esm/commands/related.js +14 -10
- package/dist/esm/commands/related.js.map +1 -1
- package/dist/esm/commands/search.js +27 -78
- package/dist/esm/commands/search.js.map +1 -1
- package/dist/esm/commands/signals.d.ts +18 -0
- package/dist/esm/commands/signals.js +78 -0
- package/dist/esm/commands/signals.js.map +1 -0
- package/dist/esm/commands/status.d.ts +2 -2
- package/dist/esm/commands/status.js +2 -2
- package/dist/esm/commands/status.js.map +1 -1
- package/dist/esm/config/access.d.ts +5 -2
- package/dist/esm/config/access.js +31 -12
- package/dist/esm/config/access.js.map +1 -1
- package/dist/esm/config/index.d.ts +4 -1
- package/dist/esm/config/index.js +2 -1
- package/dist/esm/config/index.js.map +1 -1
- package/dist/esm/config/load.d.ts +6 -1
- package/dist/esm/config/load.js +67 -9
- package/dist/esm/config/load.js.map +1 -1
- package/dist/esm/config/resolve.js +2 -2
- package/dist/esm/config/resolve.js.map +1 -1
- package/dist/esm/config/signals.d.ts +4 -0
- package/dist/esm/config/signals.js +14 -0
- package/dist/esm/config/signals.js.map +1 -0
- package/dist/esm/config/types.d.ts +6 -4
- package/dist/esm/config/types.js +1 -1
- package/dist/esm/config/types.js.map +1 -1
- package/dist/esm/config/validate.js +58 -11
- package/dist/esm/config/validate.js.map +1 -1
- package/dist/esm/db/open.d.ts +1 -1
- package/dist/esm/db/open.js +7 -2
- package/dist/esm/db/open.js.map +1 -1
- package/dist/esm/db/reconcile.d.ts +1 -0
- package/dist/esm/db/reconcile.js +10 -0
- package/dist/esm/db/reconcile.js.map +1 -1
- package/dist/esm/embed/cohere.d.ts +2 -0
- package/dist/esm/embed/cohere.js +46 -0
- package/dist/esm/embed/cohere.js.map +1 -0
- package/dist/esm/embed/http.d.ts +2 -0
- package/dist/esm/embed/http.js +33 -0
- package/dist/esm/embed/http.js.map +1 -0
- package/dist/esm/embed/identity.d.ts +13 -0
- package/dist/esm/embed/identity.js +92 -0
- package/dist/esm/embed/identity.js.map +1 -0
- package/dist/esm/embed/langfit.d.ts +6 -0
- package/dist/esm/embed/langfit.js +44 -0
- package/dist/esm/embed/langfit.js.map +1 -0
- package/dist/esm/embed/languages.d.ts +3 -0
- package/dist/esm/embed/languages.js +80 -0
- package/dist/esm/embed/languages.js.map +1 -0
- package/dist/esm/embed/openai.d.ts +2 -0
- package/dist/esm/embed/openai.js +49 -0
- package/dist/esm/embed/openai.js.map +1 -0
- package/dist/esm/embed/query.d.ts +21 -0
- package/dist/esm/embed/query.js +181 -0
- package/dist/esm/embed/query.js.map +1 -0
- package/dist/esm/embed/registry.d.ts +3 -0
- package/dist/esm/embed/registry.js +45 -0
- package/dist/esm/embed/registry.js.map +1 -0
- package/dist/esm/embed/static.d.ts +2 -0
- package/dist/esm/embed/static.js +72 -0
- package/dist/esm/embed/static.js.map +1 -0
- package/dist/esm/embed/store.d.ts +8 -0
- package/dist/esm/embed/store.js +123 -0
- package/dist/esm/embed/store.js.map +1 -0
- package/dist/esm/embed/types.d.ts +8 -0
- package/dist/esm/embed/types.js +3 -0
- package/dist/esm/embed/types.js.map +1 -0
- package/dist/esm/errors.d.ts +1 -1
- package/dist/esm/errors.js.map +1 -1
- package/dist/esm/features/embed.d.ts +4 -27
- package/dist/esm/features/embed.js +0 -346
- package/dist/esm/features/embed.js.map +1 -1
- package/dist/esm/index.d.ts +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/output.d.ts +2 -2
- package/dist/esm/output.js +6 -2
- package/dist/esm/output.js.map +1 -1
- package/dist/esm/scan.js +7 -4
- package/dist/esm/scan.js.map +1 -1
- package/dist/esm/segment.js +49 -19
- package/dist/esm/segment.js.map +1 -1
- package/package.json +9 -1
- package/schema.json +14 -7
- package/skills/sense/SKILL.md +21 -5
- package/skills/sense-setup/EXAMPLES.md +6 -6
- package/skills/sense-setup/SKILL.md +6 -4
|
@@ -0,0 +1,194 @@
|
|
|
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 MODEL_FILENAMES;
|
|
14
|
+
},
|
|
15
|
+
get MODEL_FILES () {
|
|
16
|
+
return MODEL_FILES;
|
|
17
|
+
},
|
|
18
|
+
get hasModelFiles () {
|
|
19
|
+
return hasModelFiles;
|
|
20
|
+
},
|
|
21
|
+
get isDownloadable () {
|
|
22
|
+
return isDownloadable;
|
|
23
|
+
},
|
|
24
|
+
get languagesPath () {
|
|
25
|
+
return languagesPath;
|
|
26
|
+
},
|
|
27
|
+
get modelDir () {
|
|
28
|
+
return modelDir;
|
|
29
|
+
},
|
|
30
|
+
get modelIdentity () {
|
|
31
|
+
return modelIdentity;
|
|
32
|
+
},
|
|
33
|
+
get readLanguages () {
|
|
34
|
+
return readLanguages;
|
|
35
|
+
},
|
|
36
|
+
get readRef () {
|
|
37
|
+
return readRef;
|
|
38
|
+
},
|
|
39
|
+
get refsMainPath () {
|
|
40
|
+
return refsMainPath;
|
|
41
|
+
},
|
|
42
|
+
get snapshotDir () {
|
|
43
|
+
return snapshotDir;
|
|
44
|
+
},
|
|
45
|
+
get writeLanguages () {
|
|
46
|
+
return writeLanguages;
|
|
47
|
+
},
|
|
48
|
+
get writeRef () {
|
|
49
|
+
return writeRef;
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
var _nodefs = require("node:fs");
|
|
53
|
+
var _nodeos = require("node:os");
|
|
54
|
+
var _nodepath = require("node:path");
|
|
55
|
+
function _array_like_to_array(arr, len) {
|
|
56
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
57
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
58
|
+
return arr2;
|
|
59
|
+
}
|
|
60
|
+
function _array_with_holes(arr) {
|
|
61
|
+
if (Array.isArray(arr)) return arr;
|
|
62
|
+
}
|
|
63
|
+
function _iterable_to_array_limit(arr, i) {
|
|
64
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
65
|
+
if (_i == null) return;
|
|
66
|
+
var _arr = [];
|
|
67
|
+
var _n = true;
|
|
68
|
+
var _d = false;
|
|
69
|
+
var _s, _e;
|
|
70
|
+
try {
|
|
71
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
72
|
+
_arr.push(_s.value);
|
|
73
|
+
if (i && _arr.length === i) break;
|
|
74
|
+
}
|
|
75
|
+
} catch (err) {
|
|
76
|
+
_d = true;
|
|
77
|
+
_e = err;
|
|
78
|
+
} finally{
|
|
79
|
+
try {
|
|
80
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
81
|
+
} finally{
|
|
82
|
+
if (_d) throw _e;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return _arr;
|
|
86
|
+
}
|
|
87
|
+
function _non_iterable_rest() {
|
|
88
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
89
|
+
}
|
|
90
|
+
function _sliced_to_array(arr, i) {
|
|
91
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
92
|
+
}
|
|
93
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
94
|
+
if (!o) return;
|
|
95
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
96
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
97
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
98
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
99
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
100
|
+
}
|
|
101
|
+
var MODEL_FILES = [
|
|
102
|
+
'model.safetensors',
|
|
103
|
+
'tokenizer.json'
|
|
104
|
+
];
|
|
105
|
+
var MODEL_FILENAMES = MODEL_FILES.join(' and ');
|
|
106
|
+
// A Hugging Face repo id: one slash, HF's charset. Anything else is a path, used as one rather
|
|
107
|
+
// than resolved against the HF cache.
|
|
108
|
+
var HF_MODEL_ID = /^[A-Za-z0-9][\w.-]*\/[A-Za-z0-9][\w.-]*$/;
|
|
109
|
+
function isDownloadable(model) {
|
|
110
|
+
return HF_MODEL_ID.test(model);
|
|
111
|
+
}
|
|
112
|
+
function repoDir(model) {
|
|
113
|
+
var _model_split = _sliced_to_array(model.split('/'), 2), org = _model_split[0], name = _model_split[1];
|
|
114
|
+
return (0, _nodepath.join)((0, _nodeos.homedir)(), '.sense', 'models', "models--".concat(org, "--").concat(name));
|
|
115
|
+
}
|
|
116
|
+
function refsMainPath(model) {
|
|
117
|
+
return (0, _nodepath.join)(repoDir(model), 'refs', 'main');
|
|
118
|
+
}
|
|
119
|
+
function readRef(model) {
|
|
120
|
+
var p = refsMainPath(model);
|
|
121
|
+
if (!(0, _nodefs.existsSync)(p)) return undefined;
|
|
122
|
+
var sha = (0, _nodefs.readFileSync)(p, 'utf8').trim();
|
|
123
|
+
return sha.length > 0 ? sha : undefined;
|
|
124
|
+
}
|
|
125
|
+
function writeRef(model, sha) {
|
|
126
|
+
(0, _nodefs.mkdirSync)((0, _nodepath.join)(repoDir(model), 'refs'), {
|
|
127
|
+
recursive: true
|
|
128
|
+
});
|
|
129
|
+
(0, _nodefs.writeFileSync)(refsMainPath(model), sha);
|
|
130
|
+
}
|
|
131
|
+
function snapshotDir(model, sha) {
|
|
132
|
+
return (0, _nodepath.join)(repoDir(model), 'snapshots', sha);
|
|
133
|
+
}
|
|
134
|
+
function languagesPath(model) {
|
|
135
|
+
return (0, _nodepath.join)(repoDir(model), 'languages.json');
|
|
136
|
+
}
|
|
137
|
+
function readLanguages(model) {
|
|
138
|
+
var p = languagesPath(model);
|
|
139
|
+
if (!(0, _nodefs.existsSync)(p)) return undefined;
|
|
140
|
+
try {
|
|
141
|
+
return JSON.parse((0, _nodefs.readFileSync)(p, 'utf8'));
|
|
142
|
+
} catch (unused) {
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
function writeLanguages(model, languages) {
|
|
147
|
+
(0, _nodefs.mkdirSync)(repoDir(model), {
|
|
148
|
+
recursive: true
|
|
149
|
+
});
|
|
150
|
+
(0, _nodefs.writeFileSync)(languagesPath(model), JSON.stringify(languages));
|
|
151
|
+
}
|
|
152
|
+
function modelDir(model) {
|
|
153
|
+
if (!isDownloadable(model)) return model;
|
|
154
|
+
var sha = readRef(model);
|
|
155
|
+
return sha ? snapshotDir(model, sha) : repoDir(model);
|
|
156
|
+
}
|
|
157
|
+
function hasModelFiles(model) {
|
|
158
|
+
var dir = modelDir(model);
|
|
159
|
+
return MODEL_FILES.every(function(file) {
|
|
160
|
+
return (0, _nodefs.existsSync)((0, _nodepath.join)(dir, file));
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
function modelIdentity(model) {
|
|
164
|
+
if (isDownloadable(model)) return readRef(model);
|
|
165
|
+
var dir = modelDir(model);
|
|
166
|
+
var parts = [];
|
|
167
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
168
|
+
try {
|
|
169
|
+
for(var _iterator = MODEL_FILES[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
170
|
+
var file = _step.value;
|
|
171
|
+
try {
|
|
172
|
+
var st = (0, _nodefs.statSync)((0, _nodepath.join)(dir, file));
|
|
173
|
+
parts.push("".concat(st.size, ":").concat(Math.trunc(st.mtimeMs)));
|
|
174
|
+
} catch (unused) {
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
} catch (err) {
|
|
179
|
+
_didIteratorError = true;
|
|
180
|
+
_iteratorError = err;
|
|
181
|
+
} finally{
|
|
182
|
+
try {
|
|
183
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
184
|
+
_iterator.return();
|
|
185
|
+
}
|
|
186
|
+
} finally{
|
|
187
|
+
if (_didIteratorError) {
|
|
188
|
+
throw _iteratorError;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
return parts.join(',');
|
|
193
|
+
}
|
|
194
|
+
/* 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/identity.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n// HF cache layout, no network: ~/.sense/models/models--<org>--<name>/{refs/main,\n// snapshots/<sha>/<files>}, files stored directly (hf_hub's blobs/symlinks layer skipped).\n\nexport const MODEL_FILES = ['model.safetensors', 'tokenizer.json'];\n// The pair, for messages that name what a local model directory must contain.\nexport const MODEL_FILENAMES = MODEL_FILES.join(' and ');\n\n// A Hugging Face repo id: one slash, HF's charset. Anything else is a path, used as one rather\n// than resolved against the HF cache.\nconst HF_MODEL_ID = /^[A-Za-z0-9][\\w.-]*\\/[A-Za-z0-9][\\w.-]*$/;\n\nexport function isDownloadable(model: string): boolean {\n return HF_MODEL_ID.test(model);\n}\n\nfunction repoDir(model: string): string {\n const [org, name] = model.split('/');\n return join(homedir(), '.sense', 'models', `models--${org}--${name}`);\n}\n\nexport function refsMainPath(model: string): string {\n return join(repoDir(model), 'refs', 'main');\n}\n\n// What `main` last resolved to, read from disk -- no network. Undefined until some resolution\n// (a download or an explicit prefetch) has written it once.\nexport function readRef(model: string): string | undefined {\n const p = refsMainPath(model);\n if (!existsSync(p)) return undefined;\n const sha = readFileSync(p, 'utf8').trim();\n return sha.length > 0 ? sha : undefined;\n}\n\n// A recorded ref pins until its snapshot directory is removed; nothing here re-resolves it.\nexport function writeRef(model: string, sha: string): void {\n mkdirSync(join(repoDir(model), 'refs'), { recursive: true });\n writeFileSync(refsMainPath(model), sha);\n}\n\nexport function snapshotDir(model: string, sha: string): string {\n return join(repoDir(model), 'snapshots', sha);\n}\n\n// Languages describe the repo, not one weight snapshot, so this lives beside refs/, not\n// inside a snapshot dir.\nexport function languagesPath(model: string): string {\n return join(repoDir(model), 'languages.json');\n}\n\n// undefined means \"never resolved yet\"; an empty array is a resolved fact (checked, none\n// declared) and is cached the same way, so a languageless model is not re-fetched every run.\nexport function readLanguages(model: string): string[] | undefined {\n const p = languagesPath(model);\n if (!existsSync(p)) return undefined;\n try {\n return JSON.parse(readFileSync(p, 'utf8'));\n } catch {\n return undefined;\n }\n}\n\nexport function writeLanguages(model: string, languages: string[]): void {\n mkdirSync(repoDir(model), { recursive: true });\n writeFileSync(languagesPath(model), JSON.stringify(languages));\n}\n\n// A local directory the caller manages, or the resolved snapshot once `main` is pinned; an HF\n// id with no recorded ref yet has no known snapshot, so this names the (fileless) repo dir.\nexport function modelDir(model: string): string {\n if (!isDownloadable(model)) return model;\n const sha = readRef(model);\n return sha ? snapshotDir(model, sha) : repoDir(model);\n}\n\n// Both files, so an interrupted download reads as absent and the next one resumes it.\nexport function hasModelFiles(model: string): boolean {\n const dir = modelDir(model);\n return MODEL_FILES.every((file) => existsSync(join(dir, file)));\n}\n\n// Weight identity for the signature, no network: a HF id's resolved sha, or the two\n// files' size+mtime for a local path. Undefined when nothing is known yet.\nexport function modelIdentity(model: string): string | undefined {\n if (isDownloadable(model)) return readRef(model);\n const dir = modelDir(model);\n const parts: string[] = [];\n for (const file of MODEL_FILES) {\n try {\n const st = statSync(join(dir, file));\n parts.push(`${st.size}:${Math.trunc(st.mtimeMs)}`);\n } catch {\n return undefined;\n }\n }\n return parts.join(',');\n}\n"],"names":["MODEL_FILENAMES","MODEL_FILES","hasModelFiles","isDownloadable","languagesPath","modelDir","modelIdentity","readLanguages","readRef","refsMainPath","snapshotDir","writeLanguages","writeRef","join","HF_MODEL_ID","model","test","repoDir","split","org","name","homedir","p","existsSync","undefined","sha","readFileSync","trim","length","mkdirSync","recursive","writeFileSync","JSON","parse","languages","stringify","dir","every","file","parts","st","statSync","push","Math","size","trunc","mtimeMs"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
import type { EmbedProvider } from './types.js';
|
|
3
|
+
type LangCounts = Record<string, number>;
|
|
4
|
+
export declare function languageDistribution(db: DatabaseSync): LangCounts | undefined;
|
|
5
|
+
export declare function checkLanguageFit(db: DatabaseSync, provider: EmbedProvider, texts: string[]): Promise<void>;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DatabaseSync } from 'node:sqlite';
|
|
2
|
+
import type { EmbedProvider } from './types.js';
|
|
3
|
+
type LangCounts = Record<string, number>;
|
|
4
|
+
export declare function languageDistribution(db: DatabaseSync): LangCounts | undefined;
|
|
5
|
+
export declare function checkLanguageFit(db: DatabaseSync, provider: EmbedProvider, texts: string[]): Promise<void>;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,326 @@
|
|
|
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 checkLanguageFit () {
|
|
13
|
+
return checkLanguageFit;
|
|
14
|
+
},
|
|
15
|
+
get languageDistribution () {
|
|
16
|
+
return languageDistribution;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
var _sharedts = require("../db/shared.js");
|
|
20
|
+
var _errorsts = require("../errors.js");
|
|
21
|
+
var _languagests = require("./languages.js");
|
|
22
|
+
function _array_like_to_array(arr, len) {
|
|
23
|
+
if (len == null || len > arr.length) len = arr.length;
|
|
24
|
+
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
25
|
+
return arr2;
|
|
26
|
+
}
|
|
27
|
+
function _array_with_holes(arr) {
|
|
28
|
+
if (Array.isArray(arr)) return arr;
|
|
29
|
+
}
|
|
30
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
31
|
+
try {
|
|
32
|
+
var info = gen[key](arg);
|
|
33
|
+
var value = info.value;
|
|
34
|
+
} catch (error) {
|
|
35
|
+
reject(error);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (info.done) resolve(value);
|
|
39
|
+
else Promise.resolve(value).then(_next, _throw);
|
|
40
|
+
}
|
|
41
|
+
function _async_to_generator(fn) {
|
|
42
|
+
return function() {
|
|
43
|
+
var self = this, args = arguments;
|
|
44
|
+
return new Promise(function(resolve, reject) {
|
|
45
|
+
var gen = fn.apply(self, args);
|
|
46
|
+
function _next(value) {
|
|
47
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
48
|
+
}
|
|
49
|
+
function _throw(err) {
|
|
50
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
51
|
+
}
|
|
52
|
+
_next(undefined);
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function _define_property(obj, key, value) {
|
|
57
|
+
if (key in obj) {
|
|
58
|
+
Object.defineProperty(obj, key, {
|
|
59
|
+
value: value,
|
|
60
|
+
enumerable: true,
|
|
61
|
+
configurable: true,
|
|
62
|
+
writable: true
|
|
63
|
+
});
|
|
64
|
+
} else obj[key] = value;
|
|
65
|
+
return obj;
|
|
66
|
+
}
|
|
67
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
68
|
+
if (typeof WeakMap !== "function") return null;
|
|
69
|
+
var cacheBabelInterop = new WeakMap();
|
|
70
|
+
var cacheNodeInterop = new WeakMap();
|
|
71
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
72
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
73
|
+
})(nodeInterop);
|
|
74
|
+
}
|
|
75
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
76
|
+
if (!nodeInterop && obj && obj.__esModule) return obj;
|
|
77
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") return {
|
|
78
|
+
default: obj
|
|
79
|
+
};
|
|
80
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
81
|
+
if (cache && cache.has(obj)) return cache.get(obj);
|
|
82
|
+
var newObj = {
|
|
83
|
+
__proto__: null
|
|
84
|
+
};
|
|
85
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
86
|
+
for(var key in obj){
|
|
87
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
88
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
89
|
+
if (desc && (desc.get || desc.set)) Object.defineProperty(newObj, key, desc);
|
|
90
|
+
else newObj[key] = obj[key];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
newObj.default = obj;
|
|
94
|
+
if (cache) cache.set(obj, newObj);
|
|
95
|
+
return newObj;
|
|
96
|
+
}
|
|
97
|
+
function _iterable_to_array_limit(arr, i) {
|
|
98
|
+
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
99
|
+
if (_i == null) return;
|
|
100
|
+
var _arr = [];
|
|
101
|
+
var _n = true;
|
|
102
|
+
var _d = false;
|
|
103
|
+
var _s, _e;
|
|
104
|
+
try {
|
|
105
|
+
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
106
|
+
_arr.push(_s.value);
|
|
107
|
+
if (i && _arr.length === i) break;
|
|
108
|
+
}
|
|
109
|
+
} catch (err) {
|
|
110
|
+
_d = true;
|
|
111
|
+
_e = err;
|
|
112
|
+
} finally{
|
|
113
|
+
try {
|
|
114
|
+
if (!_n && _i["return"] != null) _i["return"]();
|
|
115
|
+
} finally{
|
|
116
|
+
if (_d) throw _e;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return _arr;
|
|
120
|
+
}
|
|
121
|
+
function _non_iterable_rest() {
|
|
122
|
+
throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
123
|
+
}
|
|
124
|
+
function _object_spread(target) {
|
|
125
|
+
for(var i = 1; i < arguments.length; i++){
|
|
126
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
127
|
+
var ownKeys = Object.keys(source);
|
|
128
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
129
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
130
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
ownKeys.forEach(function(key) {
|
|
134
|
+
_define_property(target, key, source[key]);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return target;
|
|
138
|
+
}
|
|
139
|
+
function _sliced_to_array(arr, i) {
|
|
140
|
+
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
141
|
+
}
|
|
142
|
+
function _ts_generator(thisArg, body) {
|
|
143
|
+
var f, y, t, _ = {
|
|
144
|
+
label: 0,
|
|
145
|
+
sent: function() {
|
|
146
|
+
if (t[0] & 1) throw t[1];
|
|
147
|
+
return t[1];
|
|
148
|
+
},
|
|
149
|
+
trys: [],
|
|
150
|
+
ops: []
|
|
151
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
|
|
152
|
+
return d(g, "next", {
|
|
153
|
+
value: verb(0)
|
|
154
|
+
}), d(g, "throw", {
|
|
155
|
+
value: verb(1)
|
|
156
|
+
}), d(g, "return", {
|
|
157
|
+
value: verb(2)
|
|
158
|
+
}), typeof Symbol === "function" && d(g, Symbol.iterator, {
|
|
159
|
+
value: function() {
|
|
160
|
+
return this;
|
|
161
|
+
}
|
|
162
|
+
}), g;
|
|
163
|
+
function verb(n) {
|
|
164
|
+
return function(v) {
|
|
165
|
+
return step([
|
|
166
|
+
n,
|
|
167
|
+
v
|
|
168
|
+
]);
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
function step(op) {
|
|
172
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
173
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
174
|
+
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;
|
|
175
|
+
if (y = 0, t) op = [
|
|
176
|
+
op[0] & 2,
|
|
177
|
+
t.value
|
|
178
|
+
];
|
|
179
|
+
switch(op[0]){
|
|
180
|
+
case 0:
|
|
181
|
+
case 1:
|
|
182
|
+
t = op;
|
|
183
|
+
break;
|
|
184
|
+
case 4:
|
|
185
|
+
_.label++;
|
|
186
|
+
return {
|
|
187
|
+
value: op[1],
|
|
188
|
+
done: false
|
|
189
|
+
};
|
|
190
|
+
case 5:
|
|
191
|
+
_.label++;
|
|
192
|
+
y = op[1];
|
|
193
|
+
op = [
|
|
194
|
+
0
|
|
195
|
+
];
|
|
196
|
+
continue;
|
|
197
|
+
case 7:
|
|
198
|
+
op = _.ops.pop();
|
|
199
|
+
_.trys.pop();
|
|
200
|
+
continue;
|
|
201
|
+
default:
|
|
202
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
203
|
+
_ = 0;
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
207
|
+
_.label = op[1];
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
211
|
+
_.label = t[1];
|
|
212
|
+
t = op;
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
if (t && _.label < t[2]) {
|
|
216
|
+
_.label = t[2];
|
|
217
|
+
_.ops.push(op);
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
if (t[2]) _.ops.pop();
|
|
221
|
+
_.trys.pop();
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
op = body.call(thisArg, _);
|
|
225
|
+
} catch (e) {
|
|
226
|
+
op = [
|
|
227
|
+
6,
|
|
228
|
+
e
|
|
229
|
+
];
|
|
230
|
+
y = 0;
|
|
231
|
+
} finally{
|
|
232
|
+
f = t = 0;
|
|
233
|
+
}
|
|
234
|
+
if (op[0] & 5) throw op[1];
|
|
235
|
+
return {
|
|
236
|
+
value: op[0] ? op[1] : void 0,
|
|
237
|
+
done: true
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function _unsupported_iterable_to_array(o, minLen) {
|
|
242
|
+
if (!o) return;
|
|
243
|
+
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
244
|
+
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
245
|
+
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
246
|
+
if (n === "Map" || n === "Set") return Array.from(n);
|
|
247
|
+
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
248
|
+
}
|
|
249
|
+
var META_KEY = 'embed_languages';
|
|
250
|
+
// franc's own reliability floor is a handful of characters; this is a cheap upper bound, not a
|
|
251
|
+
// per-chunk minimum -- a short chunk is simply more likely to come back 'und' (unclassified).
|
|
252
|
+
var SAMPLE_CHARS = 300;
|
|
253
|
+
// A majority computed over a handful of chunks is noise, not a corpus signal; the decision rule
|
|
254
|
+
// never fires below this many classified chunks, declared languages or not.
|
|
255
|
+
var MIN_CLASSIFIED = 10;
|
|
256
|
+
function languageDistribution(db) {
|
|
257
|
+
var raw = (0, _sharedts.getMeta)(db, META_KEY);
|
|
258
|
+
return raw ? JSON.parse(raw) : undefined;
|
|
259
|
+
}
|
|
260
|
+
function classify(franc, text) {
|
|
261
|
+
var code = franc(text.slice(0, SAMPLE_CHARS));
|
|
262
|
+
return code === 'und' ? undefined : code;
|
|
263
|
+
}
|
|
264
|
+
function checkLanguageFit(db, provider, texts) {
|
|
265
|
+
return _async_to_generator(function() {
|
|
266
|
+
var _languageDistribution, franc, persisted, merged, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, text, _merged_code, code, total, declared, _Object_entries_sort_, majorityLang, majorityCount, pct;
|
|
267
|
+
return _ts_generator(this, function(_state) {
|
|
268
|
+
switch(_state.label){
|
|
269
|
+
case 0:
|
|
270
|
+
if (texts.length === 0) return [
|
|
271
|
+
2
|
|
272
|
+
];
|
|
273
|
+
return [
|
|
274
|
+
4,
|
|
275
|
+
Promise.resolve().then(function() {
|
|
276
|
+
return /*#__PURE__*/ _interop_require_wildcard(require("franc-min"));
|
|
277
|
+
})
|
|
278
|
+
];
|
|
279
|
+
case 1:
|
|
280
|
+
franc = _state.sent().franc;
|
|
281
|
+
persisted = (_languageDistribution = languageDistribution(db)) !== null && _languageDistribution !== void 0 ? _languageDistribution : {};
|
|
282
|
+
merged = _object_spread({}, persisted);
|
|
283
|
+
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
284
|
+
try {
|
|
285
|
+
for(_iterator = texts[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
286
|
+
text = _step.value;
|
|
287
|
+
;
|
|
288
|
+
code = classify(franc, text);
|
|
289
|
+
if (code) merged[code] = ((_merged_code = merged[code]) !== null && _merged_code !== void 0 ? _merged_code : 0) + 1;
|
|
290
|
+
}
|
|
291
|
+
} catch (err) {
|
|
292
|
+
_didIteratorError = true;
|
|
293
|
+
_iteratorError = err;
|
|
294
|
+
} finally{
|
|
295
|
+
try {
|
|
296
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
297
|
+
_iterator.return();
|
|
298
|
+
}
|
|
299
|
+
} finally{
|
|
300
|
+
if (_didIteratorError) {
|
|
301
|
+
throw _iteratorError;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
total = Object.values(merged).reduce(function(a, b) {
|
|
306
|
+
return a + b;
|
|
307
|
+
}, 0);
|
|
308
|
+
if (provider.languages && provider.languages.length > 0 && total >= MIN_CLASSIFIED) {
|
|
309
|
+
declared = new Set(provider.languages.map(_languagests.toIso3));
|
|
310
|
+
_Object_entries_sort_ = _sliced_to_array(Object.entries(merged).sort(function(a, b) {
|
|
311
|
+
return b[1] - a[1];
|
|
312
|
+
})[0], 2), majorityLang = _Object_entries_sort_[0], majorityCount = _Object_entries_sort_[1];
|
|
313
|
+
if (majorityCount / total >= 0.5 && !declared.has(majorityLang)) {
|
|
314
|
+
pct = Math.round(majorityCount / total * 100);
|
|
315
|
+
throw new _errorsts.SenseError('EMBED_MODEL_MISMATCH', "embed model ".concat(provider.id, " declares languages [").concat(provider.languages.join(', '), "], but ").concat(pct, "% of this tree's classified text is \"").concat(majorityLang, "\" (ISO 639-3), which is not among them; choose a model for this tree's languages: `sense init --model ...`, see the sense-setup skill or INTEGRATIONS.md"));
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
(0, _sharedts.setMeta)(db, META_KEY, JSON.stringify(merged));
|
|
319
|
+
return [
|
|
320
|
+
2
|
|
321
|
+
];
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
})();
|
|
325
|
+
}
|
|
326
|
+
/* 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/langfit.ts"],"sourcesContent":["import type { DatabaseSync } from 'node:sqlite';\nimport { getMeta, setMeta } from '../db/shared.ts';\nimport { SenseError } from '../errors.ts';\nimport { toIso3 } from './languages.ts';\nimport type { EmbedProvider } from './types.ts';\n\nconst META_KEY = 'embed_languages';\n// franc's own reliability floor is a handful of characters; this is a cheap upper bound, not a\n// per-chunk minimum -- a short chunk is simply more likely to come back 'und' (unclassified).\nconst SAMPLE_CHARS = 300;\n// A majority computed over a handful of chunks is noise, not a corpus signal; the decision rule\n// never fires below this many classified chunks, declared languages or not.\nconst MIN_CLASSIFIED = 10;\n\ntype LangCounts = Record<string, number>;\n\nexport function languageDistribution(db: DatabaseSync): LangCounts | undefined {\n const raw = getMeta(db, META_KEY);\n return raw ? JSON.parse(raw) : undefined;\n}\n\nfunction classify(franc: (text: string) => string, text: string): string | undefined {\n const code = franc(text.slice(0, SAMPLE_CHARS));\n return code === 'und' ? undefined : code;\n}\n\n// Merges chunk texts into the persisted distribution; throws (without persisting) if the model\n// declares languages and a clear majority classified so far is not among them.\nexport async function checkLanguageFit(db: DatabaseSync, provider: EmbedProvider, texts: string[]): Promise<void> {\n if (texts.length === 0) return;\n const { franc } = await import('franc-min');\n const persisted = languageDistribution(db) ?? {};\n const merged = { ...persisted };\n for (const text of texts) {\n const code = classify(franc, text);\n if (code) merged[code] = (merged[code] ?? 0) + 1;\n }\n\n const total = Object.values(merged).reduce((a, b) => a + b, 0);\n if (provider.languages && provider.languages.length > 0 && total >= MIN_CLASSIFIED) {\n const declared = new Set(provider.languages.map(toIso3));\n const [majorityLang, majorityCount] = Object.entries(merged).sort((a, b) => b[1] - a[1])[0];\n if (majorityCount / total >= 0.5 && !declared.has(majorityLang)) {\n const pct = Math.round((majorityCount / total) * 100);\n throw new SenseError(\n 'EMBED_MODEL_MISMATCH',\n `embed model ${provider.id} declares languages [${provider.languages.join(', ')}], but ${pct}% of this tree's classified text is \"${majorityLang}\" (ISO 639-3), which is not among them; choose a model for this tree's languages: \\`sense init --model ...\\`, see the sense-setup skill or INTEGRATIONS.md`\n );\n }\n }\n setMeta(db, META_KEY, JSON.stringify(merged));\n}\n"],"names":["checkLanguageFit","languageDistribution","META_KEY","SAMPLE_CHARS","MIN_CLASSIFIED","db","raw","getMeta","JSON","parse","undefined","classify","franc","text","code","slice","provider","texts","persisted","merged","total","declared","Object","majorityLang","majorityCount","pct","length","values","reduce","a","b","languages","Set","map","toIso3","entries","sort","has","Math","round","SenseError","id","join","setMeta","stringify"],"mappings":";;;;;;;;;;;QA4BsBA;eAAAA;;QAZNC;eAAAA;;;wBAfiB;wBACN;2BACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGvB,IAAMC,WAAW;AACjB,+FAA+F;AAC/F,8FAA8F;AAC9F,IAAMC,eAAe;AACrB,gGAAgG;AAChG,4EAA4E;AAC5E,IAAMC,iBAAiB;AAIhB,SAASH,qBAAqBI,EAAgB;IACnD,IAAMC,MAAMC,IAAAA,iBAAO,EAACF,IAAIH;IACxB,OAAOI,MAAME,KAAKC,KAAK,CAACH,OAAOI;AACjC;AAEA,SAASC,SAASC,KAA+B,EAAEC,IAAY;IAC7D,IAAMC,OAAOF,MAAMC,KAAKE,KAAK,CAAC,GAAGZ;IACjC,OAAOW,SAAS,QAAQJ,YAAYI;AACtC;AAIO,SAAed,iBAAiBK,EAAgB,EAAEW,QAAuB,EAAEC,KAAe;;YAG7EhB,uBADVW,OACFM,WACAC,QACD,2BAAA,mBAAA,gBAAA,WAAA,OAAMN,MAEiBM,cADpBL,MAIFM,OAEEC,UACgCC,uBAA/BC,cAAcC,eAEbC;;;;oBAdV,IAAIR,MAAMS,MAAM,KAAK,GAAG;;;oBACN;;wBAAM;2EAAA,QAAO;;;;oBAAvBd,QAAU,cAAVA;oBACFM,aAAYjB,wBAAAA,qBAAqBI,iBAArBJ,mCAAAA,wBAA4B,CAAC;oBACzCkB,SAAS,mBAAKD;oBACf,kCAAA,2BAAA;;wBAAL,IAAK,YAAcD,4BAAd,6BAAA,QAAA,yBAAA,iCAAqB;4BAAfJ,OAAN;;4BACGC,OAAOH,SAASC,OAAOC;4BAC7B,IAAIC,MAAMK,MAAM,CAACL,KAAK,GAAG,EAACK,eAAAA,MAAM,CAACL,KAAK,cAAZK,0BAAAA,eAAgB,KAAK;wBACjD;;wBAHK;wBAAA;;;iCAAA,6BAAA;gCAAA;;;gCAAA;sCAAA;;;;oBAKCC,QAAQE,OAAOK,MAAM,CAACR,QAAQS,MAAM,CAAC,SAACC,GAAGC;+BAAMD,IAAIC;uBAAG;oBAC5D,IAAId,SAASe,SAAS,IAAIf,SAASe,SAAS,CAACL,MAAM,GAAG,KAAKN,SAAShB,gBAAgB;wBAC5EiB,WAAW,IAAIW,IAAIhB,SAASe,SAAS,CAACE,GAAG,CAACC,mBAAM;wBAChBZ,yCAAAA,OAAOa,OAAO,CAAChB,QAAQiB,IAAI,CAAC,SAACP,GAAGC;mCAAMA,CAAC,CAAC,EAAE,GAAGD,CAAC,CAAC,EAAE;0BAAC,CAAC,EAAE,MAApFN,eAA+BD,0BAAjBE,gBAAiBF;wBACtC,IAAIE,gBAAgBJ,SAAS,OAAO,CAACC,SAASgB,GAAG,CAACd,eAAe;4BACzDE,MAAMa,KAAKC,KAAK,CAAC,AAACf,gBAAgBJ,QAAS;4BACjD,MAAM,IAAIoB,oBAAU,CAClB,wBACA,AAAC,eAAiDxB,OAAnCA,SAASyB,EAAE,EAAC,yBAA8DhB,OAAvCT,SAASe,SAAS,CAACW,IAAI,CAAC,OAAM,WAAoDnB,OAA3CE,KAAI,0CAAoD,OAAbF,cAAa;wBAErJ;oBACF;oBACAoB,IAAAA,iBAAO,EAACtC,IAAIH,UAAUM,KAAKoC,SAAS,CAACzB;;;;;;IACvC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
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 MEASURED_MODEL_LANGUAGES () {
|
|
13
|
+
return MEASURED_MODEL_LANGUAGES;
|
|
14
|
+
},
|
|
15
|
+
get isKnownLanguageTag () {
|
|
16
|
+
return isKnownLanguageTag;
|
|
17
|
+
},
|
|
18
|
+
get toIso3 () {
|
|
19
|
+
return toIso3;
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
// HF model cards declare languages as ISO 639-1 tags (e.g. "zh"); franc-min reports ISO 639-3
|
|
23
|
+
// (e.g. "cmn"). This bridges the two for comparison. Limited to franc-min's own 82-language
|
|
24
|
+
// data (README table, https://github.com/wooorm/franc), so every value here is a code franc-min
|
|
25
|
+
// can actually emit; a declared tag with no entry here is compared as-is.
|
|
26
|
+
var ISO_639_1_TO_3 = {
|
|
27
|
+
ar: 'arb',
|
|
28
|
+
am: 'amh',
|
|
29
|
+
az: 'azj',
|
|
30
|
+
be: 'bel',
|
|
31
|
+
bg: 'bul',
|
|
32
|
+
bn: 'ben',
|
|
33
|
+
bs: 'bos',
|
|
34
|
+
cs: 'ces',
|
|
35
|
+
de: 'deu',
|
|
36
|
+
el: 'ell',
|
|
37
|
+
en: 'eng',
|
|
38
|
+
es: 'spa',
|
|
39
|
+
fa: 'pes',
|
|
40
|
+
fr: 'fra',
|
|
41
|
+
gu: 'guj',
|
|
42
|
+
ha: 'hau',
|
|
43
|
+
hi: 'hin',
|
|
44
|
+
hr: 'hrv',
|
|
45
|
+
hu: 'hun',
|
|
46
|
+
id: 'ind',
|
|
47
|
+
ig: 'ibo',
|
|
48
|
+
it: 'ita',
|
|
49
|
+
ja: 'jpn',
|
|
50
|
+
jv: 'jav',
|
|
51
|
+
kk: 'kaz',
|
|
52
|
+
kn: 'kan',
|
|
53
|
+
ko: 'kor',
|
|
54
|
+
ml: 'mal',
|
|
55
|
+
mr: 'mar',
|
|
56
|
+
ms: 'zlm',
|
|
57
|
+
my: 'mya',
|
|
58
|
+
ne: 'npi',
|
|
59
|
+
nl: 'nld',
|
|
60
|
+
pa: 'pan',
|
|
61
|
+
pl: 'pol',
|
|
62
|
+
pt: 'por',
|
|
63
|
+
ro: 'ron',
|
|
64
|
+
ru: 'rus',
|
|
65
|
+
rw: 'kin',
|
|
66
|
+
si: 'sin',
|
|
67
|
+
so: 'som',
|
|
68
|
+
sr: 'srp',
|
|
69
|
+
su: 'sun',
|
|
70
|
+
sv: 'swe',
|
|
71
|
+
sw: 'swh',
|
|
72
|
+
ta: 'tam',
|
|
73
|
+
te: 'tel',
|
|
74
|
+
th: 'tha',
|
|
75
|
+
tl: 'tgl',
|
|
76
|
+
tr: 'tur',
|
|
77
|
+
uk: 'ukr',
|
|
78
|
+
ur: 'urd',
|
|
79
|
+
uz: 'uzn',
|
|
80
|
+
vi: 'vie',
|
|
81
|
+
yo: 'yor',
|
|
82
|
+
zh: 'cmn',
|
|
83
|
+
zu: 'zul'
|
|
84
|
+
};
|
|
85
|
+
function isKnownLanguageTag(tag) {
|
|
86
|
+
return tag in ISO_639_1_TO_3;
|
|
87
|
+
}
|
|
88
|
+
function toIso3(code) {
|
|
89
|
+
var _ISO_639_1_TO_3_base;
|
|
90
|
+
var base = code.toLowerCase().split('-')[0];
|
|
91
|
+
return (_ISO_639_1_TO_3_base = ISO_639_1_TO_3[base]) !== null && _ISO_639_1_TO_3_base !== void 0 ? _ISO_639_1_TO_3_base : base;
|
|
92
|
+
}
|
|
93
|
+
var MEASURED_MODEL_LANGUAGES = {
|
|
94
|
+
'minishlab/potion-retrieval-32M': [
|
|
95
|
+
'en'
|
|
96
|
+
]
|
|
97
|
+
};
|
|
98
|
+
/* 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; }
|