crbro-memory 1.12.0 → 1.14.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 -9
- package/bin/crbro.mjs +578 -504
- package/dist/engine/cortex.d.ts.map +1 -1
- package/dist/engine/cortex.js +31 -1
- package/dist/engine/cortex.js.map +1 -1
- package/dist/engine/maintenance.d.ts +2 -0
- package/dist/engine/maintenance.d.ts.map +1 -1
- package/dist/engine/maintenance.js +24 -2
- package/dist/engine/maintenance.js.map +1 -1
- package/dist/engine/synapses.d.ts +6 -1
- package/dist/engine/synapses.d.ts.map +1 -1
- package/dist/engine/synapses.js +3 -3
- package/dist/engine/synapses.js.map +1 -1
- package/dist/search/index.d.ts +20 -0
- package/dist/search/index.d.ts.map +1 -1
- package/dist/search/index.js +202 -27
- package/dist/search/index.js.map +1 -1
- package/dist/search/semantic.d.ts +62 -0
- package/dist/search/semantic.d.ts.map +1 -0
- package/dist/search/semantic.js +250 -0
- package/dist/search/semantic.js.map +1 -0
- package/dist/search/synonyms.d.ts +2 -0
- package/dist/search/synonyms.d.ts.map +1 -0
- package/dist/search/synonyms.js +226 -0
- package/dist/search/synonyms.js.map +1 -0
- package/dist/search/tokenize.d.ts +12 -6
- package/dist/search/tokenize.d.ts.map +1 -1
- package/dist/search/tokenize.js +20 -6
- package/dist/search/tokenize.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +337 -152
- package/dist/server.js.map +1 -1
- package/dist/sync/materialize.d.ts.map +1 -1
- package/dist/sync/materialize.js +30 -1
- package/dist/sync/materialize.js.map +1 -1
- package/dist/sync/space.d.ts.map +1 -1
- package/dist/sync/space.js +6 -3
- package/dist/sync/space.js.map +1 -1
- package/dist/types/index.d.ts +32 -0
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +54 -54
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ─── CRBRO Semantic layer — opt-in ───────────────────────────────
|
|
3
|
+
//
|
|
4
|
+
// BM25 has no synonyms. The blind benchmark says where that bites: after the
|
|
5
|
+
// 1.13 ranking fixes and the synonym table, the misses that remain are pure
|
|
6
|
+
// vocabulary — "alojadas" for a fact about a Hetzner VPS, "seguridad" for a
|
|
7
|
+
// fact about Wordfence, "proveedor de email" for one about Mailchimp. No
|
|
8
|
+
// table closes those; an embedding model does.
|
|
9
|
+
//
|
|
10
|
+
// It is OPT-IN and stays that way, for three measured reasons:
|
|
11
|
+
// - the model is a 118 MB download (Xenova/multilingual-e5-small, int8 —
|
|
12
|
+
// the 470 MB figure that got it rejected in 1.4 was the fp32 file);
|
|
13
|
+
// - the runtime (transformers.js + onnxruntime) is ~380 MB of node modules
|
|
14
|
+
// that most users never need, and a cold load takes ~13 s per process;
|
|
15
|
+
// - a first pass over the reference brain (5,124 chunks) takes about a
|
|
16
|
+
// minute and a half at ~18 ms per line.
|
|
17
|
+
// So nothing here is installed, downloaded or loaded unless the user runs
|
|
18
|
+
// `npx crbro-memory semantic install` AND sets CRBRO_SEMANTIC=1. Without
|
|
19
|
+
// both, this file is dead code and recall is exactly the 1.13 engine.
|
|
20
|
+
//
|
|
21
|
+
// Design:
|
|
22
|
+
// - The runtime lives in ONE machine-level home (~/.crbro/.semantic), not
|
|
23
|
+
// in the package: `npm install` puts it there and the model cache sits
|
|
24
|
+
// next to it. Brains are per-user, the model is per-machine.
|
|
25
|
+
// - Vectors are keyed by chunk id, which is a content hash: a fact that
|
|
26
|
+
// did not change is never embedded twice, so re-indexing a neuron costs
|
|
27
|
+
// only its NEW lines.
|
|
28
|
+
// - Fusion with BM25 is reciprocal-rank (RRF): rank-based, so the two
|
|
29
|
+
// score scales never have to agree.
|
|
30
|
+
// - Every failure degrades to "no semantic layer", never to "no recall".
|
|
31
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
32
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
33
|
+
};
|
|
34
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
35
|
+
exports.SemanticIndex = exports.SEMANTIC_DIM = exports.SEMANTIC_DTYPE = exports.SEMANTIC_MODEL = void 0;
|
|
36
|
+
exports.semanticEnabled = semanticEnabled;
|
|
37
|
+
exports.semanticHome = semanticHome;
|
|
38
|
+
exports.resolveRuntime = resolveRuntime;
|
|
39
|
+
exports.semanticStatus = semanticStatus;
|
|
40
|
+
const node_module_1 = require("node:module");
|
|
41
|
+
const node_url_1 = require("node:url");
|
|
42
|
+
const node_fs_1 = require("node:fs");
|
|
43
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
44
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
45
|
+
exports.SEMANTIC_MODEL = 'Xenova/multilingual-e5-small';
|
|
46
|
+
exports.SEMANTIC_DTYPE = 'q8';
|
|
47
|
+
exports.SEMANTIC_DIM = 384;
|
|
48
|
+
const BATCH = 16;
|
|
49
|
+
/** e5 models are trained with these prefixes; without them quality drops. */
|
|
50
|
+
const QUERY_PREFIX = 'query: ';
|
|
51
|
+
const PASSAGE_PREFIX = 'passage: ';
|
|
52
|
+
/** Longer passages are truncated by the tokenizer anyway; cap the work. */
|
|
53
|
+
const MAX_CHARS = 2000;
|
|
54
|
+
function semanticEnabled() {
|
|
55
|
+
const v = (process.env.CRBRO_SEMANTIC || '').toLowerCase();
|
|
56
|
+
return v === '1' || v === 'on' || v === 'true';
|
|
57
|
+
}
|
|
58
|
+
/** Where the runtime and the model cache live. Machine-level, not brain-level. */
|
|
59
|
+
function semanticHome() {
|
|
60
|
+
return process.env.CRBRO_SEMANTIC_HOME || node_path_1.default.join(node_os_1.default.homedir(), '.crbro', '.semantic');
|
|
61
|
+
}
|
|
62
|
+
/** Resolve the transformers.js entry point inside the semantic home, or null. */
|
|
63
|
+
function resolveRuntime() {
|
|
64
|
+
try {
|
|
65
|
+
const req = (0, node_module_1.createRequire)(node_path_1.default.join(semanticHome(), 'package.json'));
|
|
66
|
+
return req.resolve('@huggingface/transformers');
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function semanticStatus() {
|
|
73
|
+
return {
|
|
74
|
+
installed: resolveRuntime() !== null,
|
|
75
|
+
enabled: semanticEnabled(),
|
|
76
|
+
home: semanticHome(),
|
|
77
|
+
model: `${exports.SEMANTIC_MODEL} (${exports.SEMANTIC_DTYPE})`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
class SemanticIndex {
|
|
81
|
+
dir;
|
|
82
|
+
ids = [];
|
|
83
|
+
pos = new Map();
|
|
84
|
+
vectors = new Float32Array(0);
|
|
85
|
+
extractor = null;
|
|
86
|
+
loading = null;
|
|
87
|
+
dirty = false;
|
|
88
|
+
/** Set once the runtime or the model failed to load: never retried in-process. */
|
|
89
|
+
broken = null;
|
|
90
|
+
constructor(dir) {
|
|
91
|
+
this.dir = dir;
|
|
92
|
+
}
|
|
93
|
+
metaPath() { return node_path_1.default.join(this.dir, 'vectors.meta.json'); }
|
|
94
|
+
dataPath() { return node_path_1.default.join(this.dir, 'vectors.f32'); }
|
|
95
|
+
count() { return this.ids.length; }
|
|
96
|
+
has(id) { return this.pos.has(id); }
|
|
97
|
+
ready() { return this.broken === null && resolveRuntime() !== null; }
|
|
98
|
+
whyNot() { return this.broken; }
|
|
99
|
+
/**
|
|
100
|
+
* Start loading the model in the background. A cold load takes ~13 s on a
|
|
101
|
+
* laptop; paying it at the first recall of the session is the worst place.
|
|
102
|
+
* Boot is not delayed — the first query simply awaits whatever is left.
|
|
103
|
+
*/
|
|
104
|
+
warm() {
|
|
105
|
+
if (!this.ready() || this.extractor)
|
|
106
|
+
return;
|
|
107
|
+
void this.model().catch(() => { });
|
|
108
|
+
}
|
|
109
|
+
/** Load the stored vectors, if any. Never throws. */
|
|
110
|
+
async load() {
|
|
111
|
+
try {
|
|
112
|
+
const meta = JSON.parse(await node_fs_1.promises.readFile(this.metaPath(), 'utf8'));
|
|
113
|
+
if (meta.model !== exports.SEMANTIC_MODEL || meta.dim !== exports.SEMANTIC_DIM)
|
|
114
|
+
return;
|
|
115
|
+
const buf = await node_fs_1.promises.readFile(this.dataPath());
|
|
116
|
+
const expected = meta.ids.length * exports.SEMANTIC_DIM * 4;
|
|
117
|
+
if (buf.byteLength !== expected)
|
|
118
|
+
return;
|
|
119
|
+
this.vectors = new Float32Array(buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength));
|
|
120
|
+
this.ids = meta.ids;
|
|
121
|
+
this.pos = new Map(meta.ids.map((id, i) => [id, i]));
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// No vectors yet, or unreadable: start empty. Embedding is incremental.
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
async persist() {
|
|
128
|
+
if (!this.dirty)
|
|
129
|
+
return;
|
|
130
|
+
await node_fs_1.promises.mkdir(this.dir, { recursive: true });
|
|
131
|
+
const meta = { model: exports.SEMANTIC_MODEL, dtype: exports.SEMANTIC_DTYPE, dim: exports.SEMANTIC_DIM, ids: this.ids };
|
|
132
|
+
const tmpMeta = this.metaPath() + '.tmp';
|
|
133
|
+
const tmpData = this.dataPath() + '.tmp';
|
|
134
|
+
await node_fs_1.promises.writeFile(tmpData, Buffer.from(this.vectors.buffer, this.vectors.byteOffset, this.vectors.byteLength));
|
|
135
|
+
await node_fs_1.promises.writeFile(tmpMeta, JSON.stringify(meta));
|
|
136
|
+
await node_fs_1.promises.rename(tmpData, this.dataPath());
|
|
137
|
+
await node_fs_1.promises.rename(tmpMeta, this.metaPath());
|
|
138
|
+
this.dirty = false;
|
|
139
|
+
}
|
|
140
|
+
/** Load transformers.js from the semantic home and build the extractor. */
|
|
141
|
+
async model() {
|
|
142
|
+
if (this.extractor)
|
|
143
|
+
return this.extractor;
|
|
144
|
+
if (this.broken)
|
|
145
|
+
throw new Error(this.broken);
|
|
146
|
+
if (!this.loading) {
|
|
147
|
+
this.loading = (async () => {
|
|
148
|
+
const entry = resolveRuntime();
|
|
149
|
+
if (!entry) {
|
|
150
|
+
this.broken = 'transformers.js is not installed: run `npx crbro-memory semantic install`.';
|
|
151
|
+
throw new Error(this.broken);
|
|
152
|
+
}
|
|
153
|
+
const mod = await import((0, node_url_1.pathToFileURL)(entry).href);
|
|
154
|
+
const tf = mod.pipeline ? mod : mod.default;
|
|
155
|
+
tf.env.cacheDir = node_path_1.default.join(semanticHome(), 'models');
|
|
156
|
+
tf.env.allowLocalModels = true;
|
|
157
|
+
tf.env.allowRemoteModels = true;
|
|
158
|
+
this.extractor = await tf.pipeline('feature-extraction', exports.SEMANTIC_MODEL, { dtype: exports.SEMANTIC_DTYPE });
|
|
159
|
+
return this.extractor;
|
|
160
|
+
})().catch(err => {
|
|
161
|
+
this.broken = this.broken || `semantic model failed to load: ${err instanceof Error ? err.message : String(err)}`;
|
|
162
|
+
this.loading = null;
|
|
163
|
+
throw err;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
return this.loading;
|
|
167
|
+
}
|
|
168
|
+
async embed(texts, kind) {
|
|
169
|
+
const extractor = await this.model();
|
|
170
|
+
const prefix = kind === 'query' ? QUERY_PREFIX : PASSAGE_PREFIX;
|
|
171
|
+
const out = [];
|
|
172
|
+
for (let i = 0; i < texts.length; i += BATCH) {
|
|
173
|
+
const batch = texts.slice(i, i + BATCH).map(t => prefix + t.slice(0, MAX_CHARS));
|
|
174
|
+
const res = await extractor(batch, { pooling: 'mean', normalize: true });
|
|
175
|
+
// res.data is a flat typed array of batch × dim.
|
|
176
|
+
const flat = res.data instanceof Float32Array ? res.data : Float32Array.from(res.data);
|
|
177
|
+
for (let j = 0; j < batch.length; j++) {
|
|
178
|
+
out.push(flat.slice(j * exports.SEMANTIC_DIM, (j + 1) * exports.SEMANTIC_DIM));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return out;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Embed the entries whose id is not stored yet. Ids are content hashes, so
|
|
185
|
+
* an unchanged line is never embedded twice.
|
|
186
|
+
*/
|
|
187
|
+
async upsert(entries) {
|
|
188
|
+
const nuevos = entries.filter(e => e.text && !this.pos.has(e.id));
|
|
189
|
+
if (nuevos.length === 0)
|
|
190
|
+
return 0;
|
|
191
|
+
const vecs = await this.embed(nuevos.map(e => e.text), 'passage');
|
|
192
|
+
// The base offset is captured once: ids.push inside the loop would
|
|
193
|
+
// otherwise move it with every vector. Found as a RangeError, silently
|
|
194
|
+
// swallowed upstream — which is why the first benchmark run showed no
|
|
195
|
+
// change at all. Measure the effect, not the artefact.
|
|
196
|
+
const base = this.ids.length;
|
|
197
|
+
const grown = new Float32Array((base + nuevos.length) * exports.SEMANTIC_DIM);
|
|
198
|
+
grown.set(this.vectors, 0);
|
|
199
|
+
for (let i = 0; i < nuevos.length; i++) {
|
|
200
|
+
grown.set(vecs[i], (base + i) * exports.SEMANTIC_DIM);
|
|
201
|
+
this.pos.set(nuevos[i].id, base + i);
|
|
202
|
+
this.ids.push(nuevos[i].id);
|
|
203
|
+
}
|
|
204
|
+
this.vectors = grown;
|
|
205
|
+
this.dirty = true;
|
|
206
|
+
return nuevos.length;
|
|
207
|
+
}
|
|
208
|
+
/** Drop vectors for ids that left the index. */
|
|
209
|
+
remove(ids) {
|
|
210
|
+
const gone = new Set();
|
|
211
|
+
for (const id of ids)
|
|
212
|
+
if (this.pos.has(id))
|
|
213
|
+
gone.add(id);
|
|
214
|
+
if (gone.size === 0)
|
|
215
|
+
return 0;
|
|
216
|
+
const keepIds = [];
|
|
217
|
+
const keep = new Float32Array((this.ids.length - gone.size) * exports.SEMANTIC_DIM);
|
|
218
|
+
let k = 0;
|
|
219
|
+
for (let i = 0; i < this.ids.length; i++) {
|
|
220
|
+
if (gone.has(this.ids[i]))
|
|
221
|
+
continue;
|
|
222
|
+
keep.set(this.vectors.subarray(i * exports.SEMANTIC_DIM, (i + 1) * exports.SEMANTIC_DIM), k * exports.SEMANTIC_DIM);
|
|
223
|
+
keepIds.push(this.ids[i]);
|
|
224
|
+
k++;
|
|
225
|
+
}
|
|
226
|
+
this.ids = keepIds;
|
|
227
|
+
this.vectors = keep;
|
|
228
|
+
this.pos = new Map(keepIds.map((id, i) => [id, i]));
|
|
229
|
+
this.dirty = true;
|
|
230
|
+
return gone.size;
|
|
231
|
+
}
|
|
232
|
+
/** The k nearest chunks to the question, by cosine. */
|
|
233
|
+
async query(text, k) {
|
|
234
|
+
if (this.ids.length === 0)
|
|
235
|
+
return [];
|
|
236
|
+
const [q] = await this.embed([text], 'query');
|
|
237
|
+
const scores = new Float32Array(this.ids.length);
|
|
238
|
+
for (let i = 0; i < this.ids.length; i++) {
|
|
239
|
+
let dot = 0;
|
|
240
|
+
const off = i * exports.SEMANTIC_DIM;
|
|
241
|
+
for (let d = 0; d < exports.SEMANTIC_DIM; d++)
|
|
242
|
+
dot += q[d] * this.vectors[off + d];
|
|
243
|
+
scores[i] = dot;
|
|
244
|
+
}
|
|
245
|
+
const idx = Array.from(scores.keys()).sort((a, b) => scores[b] - scores[a]).slice(0, k);
|
|
246
|
+
return idx.map(i => ({ id: this.ids[i], score: Math.round(scores[i] * 1000) / 1000 }));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
exports.SemanticIndex = SemanticIndex;
|
|
250
|
+
//# sourceMappingURL=semantic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../src/search/semantic.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synonyms.d.ts","sourceRoot":"","sources":["../../src/search/synonyms.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CA4N7C,CAAC"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ─── CRBRO Query Synonyms ────────────────────────────────────────
|
|
3
|
+
// A short bilingual table of everyday agency / development vocabulary.
|
|
4
|
+
//
|
|
5
|
+
// Applied at query time only, inside variants(): a synonym counts as the SAME
|
|
6
|
+
// query term, so a fact found through "hosting" for a question about
|
|
7
|
+
// "alojamiento" scores exactly like an exact match — no more, no less. It
|
|
8
|
+
// cannot invent a term that was not asked for, only widen the spelling of
|
|
9
|
+
// one that was. Both directions are listed explicitly; nothing is inferred.
|
|
10
|
+
//
|
|
11
|
+
// Keys and values are folded (lowercase, no accents, ñ → n) because that is
|
|
12
|
+
// what tokenize() produces. Keep entries generic: a pair that only makes
|
|
13
|
+
// sense for one benchmark query is overfitting, not vocabulary.
|
|
14
|
+
//
|
|
15
|
+
// Off with CRBRO_SYNONYMS=0 — the retrieval benchmark measures both ways.
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.SYNONYMS = void 0;
|
|
18
|
+
exports.SYNONYMS = {
|
|
19
|
+
// ── web, sites, pages ──
|
|
20
|
+
web: ['sitio', 'pagina', 'website', 'site'],
|
|
21
|
+
webs: ['sitios', 'paginas', 'websites'],
|
|
22
|
+
sitio: ['web', 'site', 'pagina'],
|
|
23
|
+
sitios: ['webs', 'sites', 'paginas'],
|
|
24
|
+
pagina: ['web', 'page', 'sitio'],
|
|
25
|
+
paginas: ['webs', 'pages', 'sitios'],
|
|
26
|
+
website: ['web', 'sitio'],
|
|
27
|
+
landing: ['landings', 'pagina'],
|
|
28
|
+
// ── hosting, servers ──
|
|
29
|
+
hosting: ['alojamiento', 'servidor', 'server', 'vps'],
|
|
30
|
+
alojamiento: ['hosting', 'servidor', 'server'],
|
|
31
|
+
alojado: ['hosting', 'servidor', 'alojamiento'],
|
|
32
|
+
alojada: ['hosting', 'servidor', 'alojamiento'],
|
|
33
|
+
alojados: ['hosting', 'servidor', 'alojamiento'],
|
|
34
|
+
alojadas: ['hosting', 'servidor', 'alojamiento'],
|
|
35
|
+
servidor: ['server', 'hosting', 'vps', 'maquina'],
|
|
36
|
+
servidores: ['servers', 'hosting', 'maquinas'],
|
|
37
|
+
server: ['servidor', 'hosting'],
|
|
38
|
+
vps: ['servidor', 'hosting'],
|
|
39
|
+
// ── email ──
|
|
40
|
+
email: ['correo', 'mail', 'mailing', 'newsletter'],
|
|
41
|
+
emails: ['correos', 'mails'],
|
|
42
|
+
correo: ['email', 'mail', 'mailing'],
|
|
43
|
+
correos: ['emails', 'mails'],
|
|
44
|
+
mail: ['email', 'correo'],
|
|
45
|
+
mailing: ['email', 'correo', 'newsletter'],
|
|
46
|
+
newsletter: ['boletin', 'email', 'mailing'],
|
|
47
|
+
boletin: ['newsletter', 'email'],
|
|
48
|
+
// ── security ──
|
|
49
|
+
seguridad: ['security', 'proteccion', 'firewall'],
|
|
50
|
+
security: ['seguridad', 'proteccion'],
|
|
51
|
+
proteccion: ['seguridad', 'protection', 'firewall'],
|
|
52
|
+
firewall: ['seguridad', 'proteccion'],
|
|
53
|
+
// ── money ──
|
|
54
|
+
coste: ['precio', 'tarifa', 'cost', 'price'],
|
|
55
|
+
costes: ['precios', 'tarifas', 'costs'],
|
|
56
|
+
costo: ['precio', 'coste', 'tarifa'],
|
|
57
|
+
precio: ['coste', 'tarifa', 'price'],
|
|
58
|
+
precios: ['costes', 'tarifas', 'prices'],
|
|
59
|
+
tarifa: ['precio', 'coste', 'pricing'],
|
|
60
|
+
tarifas: ['precios', 'costes'],
|
|
61
|
+
price: ['precio', 'coste'],
|
|
62
|
+
pricing: ['precios', 'tarifas'],
|
|
63
|
+
presupuesto: ['budget', 'cotizacion', 'quote'],
|
|
64
|
+
budget: ['presupuesto'],
|
|
65
|
+
ingresos: ['revenue', 'facturacion', 'mrr'],
|
|
66
|
+
revenue: ['ingresos', 'facturacion'],
|
|
67
|
+
factura: ['invoice', 'facturacion'],
|
|
68
|
+
facturas: ['invoices', 'facturacion'],
|
|
69
|
+
facturacion: ['facturas', 'billing', 'invoicing', 'cobro'],
|
|
70
|
+
billing: ['facturacion', 'facturas'],
|
|
71
|
+
cobro: ['pago', 'facturacion', 'cobros'],
|
|
72
|
+
cobros: ['pagos', 'facturacion'],
|
|
73
|
+
pago: ['payment', 'cobro', 'pagos'],
|
|
74
|
+
pagos: ['payments', 'cobros'],
|
|
75
|
+
payment: ['pago', 'cobro'],
|
|
76
|
+
// ── moving sites ──
|
|
77
|
+
migracion: ['traslado', 'mudanza', 'migration', 'mover'],
|
|
78
|
+
migraciones: ['traslados', 'migrations'],
|
|
79
|
+
migration: ['migracion', 'traslado'],
|
|
80
|
+
traslado: ['migracion', 'mudanza', 'mover'],
|
|
81
|
+
mudanza: ['migracion', 'traslado'],
|
|
82
|
+
mover: ['migracion', 'traslado', 'mudanza'],
|
|
83
|
+
// ── links, code, repos ──
|
|
84
|
+
enlace: ['link', 'url'],
|
|
85
|
+
enlaces: ['links', 'urls'],
|
|
86
|
+
link: ['enlace', 'url'],
|
|
87
|
+
links: ['enlaces', 'urls'],
|
|
88
|
+
url: ['enlace', 'link'],
|
|
89
|
+
urls: ['enlaces', 'links'],
|
|
90
|
+
codigo: ['code', 'repositorio', 'repo'],
|
|
91
|
+
code: ['codigo'],
|
|
92
|
+
repositorio: ['repo', 'repository', 'github', 'codigo'],
|
|
93
|
+
repo: ['repositorio', 'repository', 'github'],
|
|
94
|
+
repository: ['repositorio', 'repo'],
|
|
95
|
+
// ── credentials, accounts ──
|
|
96
|
+
contrasena: ['password', 'clave', 'credencial'],
|
|
97
|
+
password: ['contrasena', 'clave'],
|
|
98
|
+
clave: ['key', 'contrasena', 'password'],
|
|
99
|
+
claves: ['keys', 'contrasenas'],
|
|
100
|
+
credencial: ['credential', 'clave', 'token'],
|
|
101
|
+
credenciales: ['credentials', 'claves'],
|
|
102
|
+
token: ['credencial', 'clave'],
|
|
103
|
+
usuario: ['user', 'cuenta'],
|
|
104
|
+
usuarios: ['users', 'cuentas'],
|
|
105
|
+
user: ['usuario', 'cuenta'],
|
|
106
|
+
cuenta: ['account', 'usuario'],
|
|
107
|
+
cuentas: ['accounts', 'usuarios'],
|
|
108
|
+
account: ['cuenta', 'usuario'],
|
|
109
|
+
// ── problems ──
|
|
110
|
+
error: ['fallo', 'bug', 'errores'],
|
|
111
|
+
errores: ['fallos', 'bugs'],
|
|
112
|
+
fallo: ['error', 'bug', 'problema'],
|
|
113
|
+
fallos: ['errores', 'bugs', 'problemas'],
|
|
114
|
+
bug: ['error', 'fallo'],
|
|
115
|
+
problema: ['fallo', 'error', 'issue', 'incidencia'],
|
|
116
|
+
problemas: ['fallos', 'errores', 'incidencias'],
|
|
117
|
+
incidencia: ['incidente', 'problema', 'fallo'],
|
|
118
|
+
// ── media, content ──
|
|
119
|
+
imagen: ['foto', 'image', 'picture'],
|
|
120
|
+
imagenes: ['fotos', 'images'],
|
|
121
|
+
foto: ['imagen', 'photo', 'fotografia'],
|
|
122
|
+
fotos: ['imagenes', 'photos', 'fotografias'],
|
|
123
|
+
fotografia: ['foto', 'imagen'],
|
|
124
|
+
formulario: ['form', 'formularios'],
|
|
125
|
+
formularios: ['forms', 'formulario'],
|
|
126
|
+
form: ['formulario'],
|
|
127
|
+
plantilla: ['template', 'theme', 'tema'],
|
|
128
|
+
plantillas: ['templates', 'themes'],
|
|
129
|
+
template: ['plantilla', 'tema'],
|
|
130
|
+
tema: ['theme', 'plantilla'],
|
|
131
|
+
theme: ['tema', 'plantilla'],
|
|
132
|
+
// ── operations ──
|
|
133
|
+
copia: ['backup', 'respaldo'],
|
|
134
|
+
copias: ['backups', 'respaldos'],
|
|
135
|
+
backup: ['copia', 'respaldo'],
|
|
136
|
+
backups: ['copias', 'respaldos'],
|
|
137
|
+
respaldo: ['backup', 'copia'],
|
|
138
|
+
despliegue: ['deploy', 'publicar', 'deployment'],
|
|
139
|
+
deploy: ['despliegue', 'publicar'],
|
|
140
|
+
publicar: ['publish', 'deploy', 'despliegue'],
|
|
141
|
+
dominio: ['domain', 'dominios', 'dns'],
|
|
142
|
+
dominios: ['domains', 'dns'],
|
|
143
|
+
domain: ['dominio'],
|
|
144
|
+
database: ['base', 'bd'],
|
|
145
|
+
configuracion: ['config', 'settings', 'ajustes'],
|
|
146
|
+
config: ['configuracion', 'settings'],
|
|
147
|
+
ajustes: ['settings', 'configuracion'],
|
|
148
|
+
settings: ['ajustes', 'configuracion'],
|
|
149
|
+
actualizacion: ['update', 'upgrade', 'actualizar'],
|
|
150
|
+
actualizar: ['update', 'actualizacion'],
|
|
151
|
+
update: ['actualizacion', 'actualizar'],
|
|
152
|
+
version: ['release', 'versiones'],
|
|
153
|
+
mantenimiento: ['maintenance'],
|
|
154
|
+
maintenance: ['mantenimiento'],
|
|
155
|
+
entorno: ['environment', 'staging', 'local'],
|
|
156
|
+
entornos: ['environments', 'staging'],
|
|
157
|
+
environment: ['entorno'],
|
|
158
|
+
staging: ['entorno', 'pruebas', 'test'],
|
|
159
|
+
pruebas: ['test', 'tests', 'testing', 'staging'],
|
|
160
|
+
prueba: ['test', 'pruebas'],
|
|
161
|
+
test: ['pruebas', 'prueba', 'testing'],
|
|
162
|
+
tests: ['pruebas', 'testing'],
|
|
163
|
+
// ── business ──
|
|
164
|
+
cliente: ['customer', 'client', 'clientes'],
|
|
165
|
+
clientes: ['customers', 'clients'],
|
|
166
|
+
customer: ['cliente'],
|
|
167
|
+
client: ['cliente'],
|
|
168
|
+
contrato: ['contract', 'acuerdo'],
|
|
169
|
+
contract: ['contrato'],
|
|
170
|
+
acuerdo: ['contrato', 'agreement'],
|
|
171
|
+
objetivo: ['goal', 'meta', 'target'],
|
|
172
|
+
objetivos: ['goals', 'metas'],
|
|
173
|
+
goal: ['objetivo', 'meta'],
|
|
174
|
+
reunion: ['meeting', 'llamada'],
|
|
175
|
+
meeting: ['reunion'],
|
|
176
|
+
tienda: ['shop', 'store', 'ecommerce', 'comercio'],
|
|
177
|
+
ecommerce: ['tienda', 'shop', 'woocommerce'],
|
|
178
|
+
shop: ['tienda'],
|
|
179
|
+
producto: ['product', 'productos'],
|
|
180
|
+
productos: ['products', 'catalogo'],
|
|
181
|
+
catalogo: ['catalog', 'productos'],
|
|
182
|
+
pedido: ['order', 'pedidos'],
|
|
183
|
+
pedidos: ['orders'],
|
|
184
|
+
suscripcion: ['subscription', 'plan', 'membresia'],
|
|
185
|
+
suscripciones: ['subscriptions', 'planes', 'licencias'],
|
|
186
|
+
subscription: ['suscripcion', 'plan'],
|
|
187
|
+
licencia: ['license', 'suscripcion'],
|
|
188
|
+
licencias: ['licenses', 'suscripciones'],
|
|
189
|
+
membresia: ['membership', 'suscripcion', 'pase'],
|
|
190
|
+
pase: ['membresia', 'suscripcion'],
|
|
191
|
+
// ── marketing ──
|
|
192
|
+
anuncios: ['ads', 'publicidad', 'campanas'],
|
|
193
|
+
ads: ['anuncios', 'publicidad', 'campanas'],
|
|
194
|
+
publicidad: ['ads', 'anuncios', 'campanas'],
|
|
195
|
+
campana: ['campaign', 'campanas'],
|
|
196
|
+
campanas: ['campaigns', 'ads', 'anuncios'],
|
|
197
|
+
posicionamiento: ['seo', 'ranking'],
|
|
198
|
+
seo: ['posicionamiento', 'ranking', 'keywords'],
|
|
199
|
+
trafico: ['traffic', 'visitas'],
|
|
200
|
+
visitas: ['trafico', 'traffic'],
|
|
201
|
+
// ── tools, software, AI ──
|
|
202
|
+
herramienta: ['tool', 'programa'],
|
|
203
|
+
herramientas: ['tools', 'programas'],
|
|
204
|
+
tool: ['herramienta'],
|
|
205
|
+
tools: ['herramientas'],
|
|
206
|
+
programa: ['software', 'herramienta', 'aplicacion', 'app'],
|
|
207
|
+
aplicacion: ['app', 'programa'],
|
|
208
|
+
aplicaciones: ['apps', 'programas'],
|
|
209
|
+
app: ['aplicacion', 'application'],
|
|
210
|
+
automatizacion: ['automation', 'workflow', 'automatizar'],
|
|
211
|
+
automatizaciones: ['automations', 'workflows'],
|
|
212
|
+
automation: ['automatizacion', 'workflow'],
|
|
213
|
+
workflow: ['flujo', 'automatizacion'],
|
|
214
|
+
workflows: ['flujos', 'automatizaciones'],
|
|
215
|
+
flujo: ['workflow', 'flujos'],
|
|
216
|
+
busqueda: ['search', 'buscar', 'buscador'],
|
|
217
|
+
search: ['busqueda', 'buscar'],
|
|
218
|
+
buscar: ['search', 'busqueda'],
|
|
219
|
+
ia: ['ai', 'inteligencia', 'llm', 'modelo'],
|
|
220
|
+
ai: ['ia', 'inteligencia'],
|
|
221
|
+
inteligencia: ['ia', 'ai'],
|
|
222
|
+
modelo: ['model', 'llm', 'ia'],
|
|
223
|
+
datos: ['data', 'base'],
|
|
224
|
+
data: ['datos'],
|
|
225
|
+
};
|
|
226
|
+
//# sourceMappingURL=synonyms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synonyms.js","sourceRoot":"","sources":["../../src/search/synonyms.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,14 +19,20 @@ export declare function tokenize(text: string): string[];
|
|
|
19
19
|
* to the raw tokens — an empty term list would return nothing at all.
|
|
20
20
|
*/
|
|
21
21
|
export declare function queryTerms(query: string): string[];
|
|
22
|
+
/** The synonym table is on unless CRBRO_SYNONYMS=0 — the benchmark runs both. */
|
|
23
|
+
export declare function synonymsEnabled(): boolean;
|
|
22
24
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
+
* Other spellings of the same query term: singular/plural, and the curated
|
|
26
|
+
* bilingual synonyms in synonyms.ts. Every variant counts as the SAME term,
|
|
27
|
+
* so coverage stays honest — a question about "facturas" does not score
|
|
28
|
+
* twice for also matching "factura", and "alojamiento" scores exactly like
|
|
29
|
+
* "hosting" would have.
|
|
25
30
|
*
|
|
26
|
-
* Deliberately NOT a stemmer
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
*
|
|
31
|
+
* Deliberately NOT a stemmer: applied to Spanish it mangles the very common
|
|
32
|
+
* -ción family. And the synonym table is a fixed list, not an inference —
|
|
33
|
+
* it can widen the spelling of a term that was asked for, never add one
|
|
34
|
+
* that was not. Measured on the blind retrieval benchmark in benchmarks/;
|
|
35
|
+
* the honest caveat about who wrote the table is recorded there.
|
|
30
36
|
*/
|
|
31
37
|
export declare function variants(term: string): string[];
|
|
32
38
|
export { STOPWORDS };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../../src/search/tokenize.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,QAAA,MAAM,SAAS,aAcb,CAAC;AAEH;;;GAGG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAI/C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBlD;AAED
|
|
1
|
+
{"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../../src/search/tokenize.ts"],"names":[],"mappings":"AASA;;;GAGG;AACH,QAAA,MAAM,SAAS,aAcb,CAAC;AAEH;;;GAGG;AACH,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKzC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAI/C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBlD;AAID,iFAAiF;AACjF,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA8B/C;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
package/dist/search/tokenize.js
CHANGED
|
@@ -12,6 +12,7 @@ exports.STOPWORDS = void 0;
|
|
|
12
12
|
exports.fold = fold;
|
|
13
13
|
exports.tokenize = tokenize;
|
|
14
14
|
exports.queryTerms = queryTerms;
|
|
15
|
+
exports.synonymsEnabled = synonymsEnabled;
|
|
15
16
|
exports.variants = variants;
|
|
16
17
|
/**
|
|
17
18
|
* Words that carry no retrieval signal. Kept short on purpose: an
|
|
@@ -81,17 +82,30 @@ function queryTerms(query) {
|
|
|
81
82
|
}
|
|
82
83
|
return fallback;
|
|
83
84
|
}
|
|
85
|
+
const synonyms_js_1 = require("./synonyms.js");
|
|
86
|
+
/** The synonym table is on unless CRBRO_SYNONYMS=0 — the benchmark runs both. */
|
|
87
|
+
function synonymsEnabled() {
|
|
88
|
+
return process.env.CRBRO_SYNONYMS !== '0';
|
|
89
|
+
}
|
|
84
90
|
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
91
|
+
* Other spellings of the same query term: singular/plural, and the curated
|
|
92
|
+
* bilingual synonyms in synonyms.ts. Every variant counts as the SAME term,
|
|
93
|
+
* so coverage stays honest — a question about "facturas" does not score
|
|
94
|
+
* twice for also matching "factura", and "alojamiento" scores exactly like
|
|
95
|
+
* "hosting" would have.
|
|
87
96
|
*
|
|
88
|
-
* Deliberately NOT a stemmer
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
97
|
+
* Deliberately NOT a stemmer: applied to Spanish it mangles the very common
|
|
98
|
+
* -ción family. And the synonym table is a fixed list, not an inference —
|
|
99
|
+
* it can widen the spelling of a term that was asked for, never add one
|
|
100
|
+
* that was not. Measured on the blind retrieval benchmark in benchmarks/;
|
|
101
|
+
* the honest caveat about who wrote the table is recorded there.
|
|
92
102
|
*/
|
|
93
103
|
function variants(term) {
|
|
94
104
|
const out = new Set([term]);
|
|
105
|
+
if (synonymsEnabled()) {
|
|
106
|
+
for (const s of synonyms_js_1.SYNONYMS[term] || [])
|
|
107
|
+
out.add(s);
|
|
108
|
+
}
|
|
95
109
|
if (term.length < 4)
|
|
96
110
|
return [...out];
|
|
97
111
|
// Plural -> singular
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../../src/search/tokenize.ts"],"names":[],"mappings":";AAAA,oEAAoE;AACpE,sEAAsE;AACtE,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,yEAAyE;AACzE,yEAAyE;AACzE,2EAA2E;;;AA0B3E,oBAKC;AAMD,4BAIC;AAOD,gCAqBC;
|
|
1
|
+
{"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../../src/search/tokenize.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoCpE,wBAAgB,YAAY,IAAI,SAAS,CAy2CxC"}
|