knowledge-mcp-server 1.0.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/CHANGELOG.md +11 -0
- package/LICENSE +21 -0
- package/README.md +205 -0
- package/dist/analytics.d.ts +24 -0
- package/dist/analytics.js +102 -0
- package/dist/analytics.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +98 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +39 -0
- package/dist/config.js +80 -0
- package/dist/config.js.map +1 -0
- package/dist/embeddings.d.ts +26 -0
- package/dist/embeddings.js +534 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/formatter.d.ts +51 -0
- package/dist/formatter.js +273 -0
- package/dist/formatter.js.map +1 -0
- package/dist/generate-embeddings.d.ts +8 -0
- package/dist/generate-embeddings.js +146 -0
- package/dist/generate-embeddings.js.map +1 -0
- package/dist/graph.d.ts +20 -0
- package/dist/graph.js +133 -0
- package/dist/graph.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.js +481 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +1 -0
- package/dist/init.js +65 -0
- package/dist/init.js.map +1 -0
- package/dist/loader.d.ts +26 -0
- package/dist/loader.js +151 -0
- package/dist/loader.js.map +1 -0
- package/dist/logger.d.ts +6 -0
- package/dist/logger.js +15 -0
- package/dist/logger.js.map +1 -0
- package/dist/query-classifier.d.ts +23 -0
- package/dist/query-classifier.js +111 -0
- package/dist/query-classifier.js.map +1 -0
- package/dist/reranker.d.ts +7 -0
- package/dist/reranker.js +38 -0
- package/dist/reranker.js.map +1 -0
- package/dist/search.d.ts +17 -0
- package/dist/search.js +299 -0
- package/dist/search.js.map +1 -0
- package/dist/validator.d.ts +23 -0
- package/dist/validator.js +97 -0
- package/dist/validator.js.map +1 -0
- package/dist/writer.d.ts +36 -0
- package/dist/writer.js +360 -0
- package/dist/writer.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
2
|
+
import { writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { log } from "./logger.js";
|
|
5
|
+
export function loadEmbeddings(knowledgeDir) {
|
|
6
|
+
const embeddingsPath = join(knowledgeDir, ".embeddings.json");
|
|
7
|
+
if (!existsSync(embeddingsPath)) {
|
|
8
|
+
return { vectors: new Map(), available: false };
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
const raw = JSON.parse(readFileSync(embeddingsPath, "utf-8"));
|
|
12
|
+
const vectors = new Map(Object.entries(raw));
|
|
13
|
+
return { vectors, available: vectors.size > 0 };
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return { vectors: new Map(), available: false };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function cosineSimilarity(a, b) {
|
|
20
|
+
let dot = 0;
|
|
21
|
+
let normA = 0;
|
|
22
|
+
let normB = 0;
|
|
23
|
+
for (let i = 0; i < a.length; i++) {
|
|
24
|
+
dot += a[i] * b[i];
|
|
25
|
+
normA += a[i] * a[i];
|
|
26
|
+
normB += b[i] * b[i];
|
|
27
|
+
}
|
|
28
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
29
|
+
return denom === 0 ? 0 : dot / denom;
|
|
30
|
+
}
|
|
31
|
+
// --- Query embedding LRU cache (256 entries, ~512KB) ---
|
|
32
|
+
const CACHE_MAX = 256;
|
|
33
|
+
const queryCache = new Map();
|
|
34
|
+
function normalizeQuery(q) {
|
|
35
|
+
return q.toLowerCase().trim().replace(/\s+/g, " ");
|
|
36
|
+
}
|
|
37
|
+
// --- Exponential backoff for Voyage API failures ---
|
|
38
|
+
let backoffUntil = 0;
|
|
39
|
+
let backoffMs = 0;
|
|
40
|
+
const BACKOFF_MAX = 60_000;
|
|
41
|
+
export async function embedQuery(query) {
|
|
42
|
+
const apiKey = process.env.VOYAGE_API_KEY;
|
|
43
|
+
if (!apiKey)
|
|
44
|
+
return null;
|
|
45
|
+
const key = normalizeQuery(query);
|
|
46
|
+
const cached = queryCache.get(key);
|
|
47
|
+
if (cached) {
|
|
48
|
+
// Move to end (most recently used)
|
|
49
|
+
queryCache.delete(key);
|
|
50
|
+
queryCache.set(key, cached);
|
|
51
|
+
return cached;
|
|
52
|
+
}
|
|
53
|
+
// Check backoff
|
|
54
|
+
if (Date.now() < backoffUntil) {
|
|
55
|
+
log.debug("embed_query_backoff", { remainingMs: backoffUntil - Date.now() });
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const response = await fetch("https://api.voyageai.com/v1/embeddings", {
|
|
60
|
+
method: "POST",
|
|
61
|
+
headers: {
|
|
62
|
+
"Content-Type": "application/json",
|
|
63
|
+
Authorization: `Bearer ${apiKey}`,
|
|
64
|
+
},
|
|
65
|
+
body: JSON.stringify({
|
|
66
|
+
model: "voyage-3-lite",
|
|
67
|
+
input: [query],
|
|
68
|
+
input_type: "query",
|
|
69
|
+
}),
|
|
70
|
+
});
|
|
71
|
+
if (!response.ok) {
|
|
72
|
+
log.warn("embed_query_failed", { status: response.status, statusText: response.statusText });
|
|
73
|
+
backoffMs = Math.min(backoffMs === 0 ? 1000 : backoffMs * 2, BACKOFF_MAX);
|
|
74
|
+
backoffUntil = Date.now() + backoffMs;
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
// Reset backoff on success
|
|
78
|
+
backoffMs = 0;
|
|
79
|
+
backoffUntil = 0;
|
|
80
|
+
const data = (await response.json());
|
|
81
|
+
const vector = data.data[0]?.embedding ?? null;
|
|
82
|
+
if (vector) {
|
|
83
|
+
// Evict oldest if at capacity
|
|
84
|
+
if (queryCache.size >= CACHE_MAX) {
|
|
85
|
+
const oldest = queryCache.keys().next().value;
|
|
86
|
+
queryCache.delete(oldest);
|
|
87
|
+
}
|
|
88
|
+
queryCache.set(key, vector);
|
|
89
|
+
}
|
|
90
|
+
return vector;
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
log.warn("embed_query_error", { error: String(err) });
|
|
94
|
+
backoffMs = Math.min(backoffMs === 0 ? 1000 : backoffMs * 2, BACKOFF_MAX);
|
|
95
|
+
backoffUntil = Date.now() + backoffMs;
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// --- Lightweight suffix stemmer (~18 rules, no dependencies) ---
|
|
100
|
+
function stem(word) {
|
|
101
|
+
if (word.length < 4)
|
|
102
|
+
return word;
|
|
103
|
+
const rules = [
|
|
104
|
+
["ization", "ize"],
|
|
105
|
+
["ational", "ate"],
|
|
106
|
+
["iveness", "ive"],
|
|
107
|
+
["encies", "ency"],
|
|
108
|
+
["ation", "ate"],
|
|
109
|
+
["ness", ""],
|
|
110
|
+
["ment", ""],
|
|
111
|
+
["able", ""],
|
|
112
|
+
["ible", ""],
|
|
113
|
+
["ling", "le"],
|
|
114
|
+
["ies", "y"],
|
|
115
|
+
["ive", ""],
|
|
116
|
+
["ing", ""],
|
|
117
|
+
["ion", ""],
|
|
118
|
+
["ed", ""],
|
|
119
|
+
["ly", ""],
|
|
120
|
+
["er", ""],
|
|
121
|
+
["s", ""],
|
|
122
|
+
];
|
|
123
|
+
for (const [suffix, replacement] of rules) {
|
|
124
|
+
if (word.endsWith(suffix)) {
|
|
125
|
+
const base = word.slice(0, -suffix.length) + replacement;
|
|
126
|
+
if (base.length >= 3)
|
|
127
|
+
return base;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return word;
|
|
131
|
+
}
|
|
132
|
+
// --- Stopword set (filtered during BM25 tokenization, not embedding text) ---
|
|
133
|
+
const STOPWORDS = new Set([
|
|
134
|
+
"a",
|
|
135
|
+
"about",
|
|
136
|
+
"above",
|
|
137
|
+
"after",
|
|
138
|
+
"again",
|
|
139
|
+
"against",
|
|
140
|
+
"all",
|
|
141
|
+
"am",
|
|
142
|
+
"an",
|
|
143
|
+
"and",
|
|
144
|
+
"any",
|
|
145
|
+
"are",
|
|
146
|
+
"aren't",
|
|
147
|
+
"as",
|
|
148
|
+
"at",
|
|
149
|
+
"be",
|
|
150
|
+
"because",
|
|
151
|
+
"been",
|
|
152
|
+
"before",
|
|
153
|
+
"being",
|
|
154
|
+
"below",
|
|
155
|
+
"between",
|
|
156
|
+
"both",
|
|
157
|
+
"but",
|
|
158
|
+
"by",
|
|
159
|
+
"can",
|
|
160
|
+
"can't",
|
|
161
|
+
"cannot",
|
|
162
|
+
"could",
|
|
163
|
+
"couldn't",
|
|
164
|
+
"did",
|
|
165
|
+
"didn't",
|
|
166
|
+
"do",
|
|
167
|
+
"does",
|
|
168
|
+
"doesn't",
|
|
169
|
+
"doing",
|
|
170
|
+
"don't",
|
|
171
|
+
"down",
|
|
172
|
+
"during",
|
|
173
|
+
"each",
|
|
174
|
+
"few",
|
|
175
|
+
"for",
|
|
176
|
+
"from",
|
|
177
|
+
"further",
|
|
178
|
+
"get",
|
|
179
|
+
"got",
|
|
180
|
+
"had",
|
|
181
|
+
"hadn't",
|
|
182
|
+
"has",
|
|
183
|
+
"hasn't",
|
|
184
|
+
"have",
|
|
185
|
+
"haven't",
|
|
186
|
+
"having",
|
|
187
|
+
"he",
|
|
188
|
+
"he'd",
|
|
189
|
+
"he'll",
|
|
190
|
+
"he's",
|
|
191
|
+
"her",
|
|
192
|
+
"here",
|
|
193
|
+
"here's",
|
|
194
|
+
"hers",
|
|
195
|
+
"herself",
|
|
196
|
+
"him",
|
|
197
|
+
"himself",
|
|
198
|
+
"his",
|
|
199
|
+
"how",
|
|
200
|
+
"how's",
|
|
201
|
+
"if",
|
|
202
|
+
"in",
|
|
203
|
+
"into",
|
|
204
|
+
"is",
|
|
205
|
+
"isn't",
|
|
206
|
+
"it",
|
|
207
|
+
"it's",
|
|
208
|
+
"its",
|
|
209
|
+
"itself",
|
|
210
|
+
"let's",
|
|
211
|
+
"me",
|
|
212
|
+
"might",
|
|
213
|
+
"more",
|
|
214
|
+
"most",
|
|
215
|
+
"mustn't",
|
|
216
|
+
"my",
|
|
217
|
+
"myself",
|
|
218
|
+
"no",
|
|
219
|
+
"nor",
|
|
220
|
+
"not",
|
|
221
|
+
"of",
|
|
222
|
+
"off",
|
|
223
|
+
"on",
|
|
224
|
+
"once",
|
|
225
|
+
"only",
|
|
226
|
+
"or",
|
|
227
|
+
"other",
|
|
228
|
+
"ought",
|
|
229
|
+
"our",
|
|
230
|
+
"ours",
|
|
231
|
+
"ourselves",
|
|
232
|
+
"out",
|
|
233
|
+
"over",
|
|
234
|
+
"own",
|
|
235
|
+
"same",
|
|
236
|
+
"shan't",
|
|
237
|
+
"she",
|
|
238
|
+
"she'd",
|
|
239
|
+
"she'll",
|
|
240
|
+
"she's",
|
|
241
|
+
"should",
|
|
242
|
+
"shouldn't",
|
|
243
|
+
"so",
|
|
244
|
+
"some",
|
|
245
|
+
"such",
|
|
246
|
+
"than",
|
|
247
|
+
"that",
|
|
248
|
+
"that's",
|
|
249
|
+
"the",
|
|
250
|
+
"their",
|
|
251
|
+
"theirs",
|
|
252
|
+
"them",
|
|
253
|
+
"themselves",
|
|
254
|
+
"then",
|
|
255
|
+
"there",
|
|
256
|
+
"there's",
|
|
257
|
+
"these",
|
|
258
|
+
"they",
|
|
259
|
+
"they'd",
|
|
260
|
+
"they'll",
|
|
261
|
+
"they're",
|
|
262
|
+
"they've",
|
|
263
|
+
"this",
|
|
264
|
+
"those",
|
|
265
|
+
"through",
|
|
266
|
+
"to",
|
|
267
|
+
"too",
|
|
268
|
+
"under",
|
|
269
|
+
"until",
|
|
270
|
+
"up",
|
|
271
|
+
"us",
|
|
272
|
+
"very",
|
|
273
|
+
"was",
|
|
274
|
+
"wasn't",
|
|
275
|
+
"we",
|
|
276
|
+
"we'd",
|
|
277
|
+
"we'll",
|
|
278
|
+
"we're",
|
|
279
|
+
"we've",
|
|
280
|
+
"were",
|
|
281
|
+
"weren't",
|
|
282
|
+
"what",
|
|
283
|
+
"what's",
|
|
284
|
+
"when",
|
|
285
|
+
"when's",
|
|
286
|
+
"where",
|
|
287
|
+
"where's",
|
|
288
|
+
"which",
|
|
289
|
+
"while",
|
|
290
|
+
"who",
|
|
291
|
+
"who's",
|
|
292
|
+
"whom",
|
|
293
|
+
"why",
|
|
294
|
+
"why's",
|
|
295
|
+
"will",
|
|
296
|
+
"with",
|
|
297
|
+
"won't",
|
|
298
|
+
"would",
|
|
299
|
+
"wouldn't",
|
|
300
|
+
"you",
|
|
301
|
+
"you'd",
|
|
302
|
+
"you'll",
|
|
303
|
+
"you're",
|
|
304
|
+
"you've",
|
|
305
|
+
"your",
|
|
306
|
+
"yours",
|
|
307
|
+
"yourself",
|
|
308
|
+
"yourselves",
|
|
309
|
+
]);
|
|
310
|
+
// --- Tokenizer (preserves compound terms, adds stems alongside originals) ---
|
|
311
|
+
export function tokenize(text) {
|
|
312
|
+
const lower = text.toLowerCase();
|
|
313
|
+
const tokens = [];
|
|
314
|
+
// Extract compound terms before stripping special chars (e.g., c++, c#)
|
|
315
|
+
const compoundRegex = /[a-z][a-z0-9]*\+\+|[a-z]#/g;
|
|
316
|
+
let match;
|
|
317
|
+
while ((match = compoundRegex.exec(lower)) !== null) {
|
|
318
|
+
tokens.push(match[0]);
|
|
319
|
+
}
|
|
320
|
+
// Standard tokenization (preserve hyphens for compound words like tf-idf)
|
|
321
|
+
const standard = lower
|
|
322
|
+
.replace(/[^a-z0-9\s-]/g, " ")
|
|
323
|
+
.split(/\s+/)
|
|
324
|
+
.filter((t) => t.length > 1);
|
|
325
|
+
for (const token of standard) {
|
|
326
|
+
if (STOPWORDS.has(token))
|
|
327
|
+
continue;
|
|
328
|
+
tokens.push(token);
|
|
329
|
+
const stemmed = stem(token);
|
|
330
|
+
if (stemmed !== token) {
|
|
331
|
+
tokens.push(stemmed);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return tokens;
|
|
335
|
+
}
|
|
336
|
+
function computeIdf(docFreq, docCount) {
|
|
337
|
+
const idf = new Map();
|
|
338
|
+
for (const [term, df] of docFreq) {
|
|
339
|
+
// Standard BM25 IDF: log((N - df + 0.5) / (df + 0.5) + 1)
|
|
340
|
+
idf.set(term, Math.log((docCount - df + 0.5) / (df + 0.5) + 1));
|
|
341
|
+
}
|
|
342
|
+
return idf;
|
|
343
|
+
}
|
|
344
|
+
export function buildTfIdfIndex(docs) {
|
|
345
|
+
const docTermFreqs = new Map();
|
|
346
|
+
const docFreq = new Map();
|
|
347
|
+
const docLengths = new Map();
|
|
348
|
+
const docCount = docs.size;
|
|
349
|
+
let totalLength = 0;
|
|
350
|
+
for (const doc of docs.values()) {
|
|
351
|
+
// Title tokens 3x, tag tokens 2x, body 1x for field boosting
|
|
352
|
+
const text = buildBoostedText(doc);
|
|
353
|
+
const tokens = tokenize(text);
|
|
354
|
+
const termFreq = new Map();
|
|
355
|
+
const seenTerms = new Set();
|
|
356
|
+
for (const token of tokens) {
|
|
357
|
+
termFreq.set(token, (termFreq.get(token) || 0) + 1);
|
|
358
|
+
if (!seenTerms.has(token)) {
|
|
359
|
+
seenTerms.add(token);
|
|
360
|
+
docFreq.set(token, (docFreq.get(token) || 0) + 1);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// Store raw term counts (no normalization — BM25 handles length internally)
|
|
364
|
+
docTermFreqs.set(doc.id, termFreq);
|
|
365
|
+
docLengths.set(doc.id, tokens.length);
|
|
366
|
+
totalLength += tokens.length;
|
|
367
|
+
}
|
|
368
|
+
const avgDocLength = docCount > 0 ? totalLength / docCount : 0;
|
|
369
|
+
const idf = computeIdf(docFreq, docCount);
|
|
370
|
+
return { docTermFreqs, docFreq, idf, docLengths, avgDocLength, docCount };
|
|
371
|
+
}
|
|
372
|
+
// --- Field boosting: title 3x, tags 2x, body 1x ---
|
|
373
|
+
function buildBoostedText(doc) {
|
|
374
|
+
const title = doc.title;
|
|
375
|
+
const tags = doc.tags.join(" ");
|
|
376
|
+
return `${title} ${title} ${title} ${tags} ${tags} ${doc.contentBody}`;
|
|
377
|
+
}
|
|
378
|
+
// BM25 scoring constants
|
|
379
|
+
const BM25_K1 = 1.2;
|
|
380
|
+
const BM25_B = 0.75;
|
|
381
|
+
export function bm25Score(query, docId, index) {
|
|
382
|
+
const queryTokens = tokenize(query);
|
|
383
|
+
const docTerms = index.docTermFreqs.get(docId);
|
|
384
|
+
if (!docTerms)
|
|
385
|
+
return 0;
|
|
386
|
+
const docLen = index.docLengths.get(docId) || 0;
|
|
387
|
+
let score = 0;
|
|
388
|
+
for (const token of queryTokens) {
|
|
389
|
+
const tf = docTerms.get(token) || 0;
|
|
390
|
+
const idf = index.idf.get(token) || 0;
|
|
391
|
+
if (tf === 0 || idf === 0)
|
|
392
|
+
continue;
|
|
393
|
+
// BM25: IDF * (tf * (k1 + 1)) / (tf + k1 * (1 - b + b * docLen / avgDocLen))
|
|
394
|
+
const numerator = tf * (BM25_K1 + 1);
|
|
395
|
+
const denominator = tf + BM25_K1 * (1 - BM25_B + (BM25_B * docLen) / (index.avgDocLength || 1));
|
|
396
|
+
score += idf * (numerator / denominator);
|
|
397
|
+
}
|
|
398
|
+
return score;
|
|
399
|
+
}
|
|
400
|
+
/** @deprecated Use bm25Score — kept for backward compatibility */
|
|
401
|
+
export const tfidfScore = bm25Score;
|
|
402
|
+
// --- Incremental Index Updates ---
|
|
403
|
+
export function updateBm25Index(index, docId, doc) {
|
|
404
|
+
// Remove old document if it exists in the index
|
|
405
|
+
const oldTermFreqs = index.docTermFreqs.get(docId);
|
|
406
|
+
if (oldTermFreqs) {
|
|
407
|
+
const oldLength = index.docLengths.get(docId) || 0;
|
|
408
|
+
// Decrement document frequencies for each term
|
|
409
|
+
for (const term of oldTermFreqs.keys()) {
|
|
410
|
+
const df = index.docFreq.get(term);
|
|
411
|
+
if (df !== undefined) {
|
|
412
|
+
if (df <= 1) {
|
|
413
|
+
index.docFreq.delete(term);
|
|
414
|
+
}
|
|
415
|
+
else {
|
|
416
|
+
index.docFreq.set(term, df - 1);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
index.docTermFreqs.delete(docId);
|
|
421
|
+
index.docLengths.delete(docId);
|
|
422
|
+
index.docCount--;
|
|
423
|
+
// Recalculate average document length
|
|
424
|
+
const totalLength = index.avgDocLength * (index.docCount + 1) - oldLength;
|
|
425
|
+
index.avgDocLength = index.docCount > 0 ? totalLength / index.docCount : 0;
|
|
426
|
+
}
|
|
427
|
+
// Add new document if provided
|
|
428
|
+
if (doc) {
|
|
429
|
+
const text = buildBoostedText(doc);
|
|
430
|
+
const tokens = tokenize(text);
|
|
431
|
+
const termFreq = new Map();
|
|
432
|
+
const seenTerms = new Set();
|
|
433
|
+
for (const token of tokens) {
|
|
434
|
+
termFreq.set(token, (termFreq.get(token) || 0) + 1);
|
|
435
|
+
if (!seenTerms.has(token)) {
|
|
436
|
+
seenTerms.add(token);
|
|
437
|
+
index.docFreq.set(token, (index.docFreq.get(token) || 0) + 1);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
index.docTermFreqs.set(docId, termFreq);
|
|
441
|
+
index.docLengths.set(docId, tokens.length);
|
|
442
|
+
// Recalculate average document length
|
|
443
|
+
const totalLength = index.avgDocLength * index.docCount + tokens.length;
|
|
444
|
+
index.docCount++;
|
|
445
|
+
index.avgDocLength = totalLength / index.docCount;
|
|
446
|
+
}
|
|
447
|
+
// Rebuild IDF (fast — just iterates the docFreq map)
|
|
448
|
+
index.idf = computeIdf(index.docFreq, index.docCount);
|
|
449
|
+
}
|
|
450
|
+
// --- Inline Embedding ---
|
|
451
|
+
export async function embedSingleDocument(embeddingsStore, knowledgeDir, doc) {
|
|
452
|
+
const apiKey = process.env.VOYAGE_API_KEY;
|
|
453
|
+
if (!apiKey)
|
|
454
|
+
return;
|
|
455
|
+
// Respect backoff for document embedding too
|
|
456
|
+
if (Date.now() < backoffUntil)
|
|
457
|
+
return;
|
|
458
|
+
try {
|
|
459
|
+
const text = `${doc.title}\n${doc.tags.join(", ")}\n${doc.contentBody}`;
|
|
460
|
+
const response = await fetch("https://api.voyageai.com/v1/embeddings", {
|
|
461
|
+
method: "POST",
|
|
462
|
+
headers: {
|
|
463
|
+
"Content-Type": "application/json",
|
|
464
|
+
Authorization: `Bearer ${apiKey}`,
|
|
465
|
+
},
|
|
466
|
+
body: JSON.stringify({
|
|
467
|
+
model: "voyage-3-lite",
|
|
468
|
+
input: [text],
|
|
469
|
+
input_type: "document",
|
|
470
|
+
}),
|
|
471
|
+
});
|
|
472
|
+
if (!response.ok) {
|
|
473
|
+
log.warn("embed_doc_failed", { id: doc.id, status: response.status });
|
|
474
|
+
backoffMs = Math.min(backoffMs === 0 ? 1000 : backoffMs * 2, BACKOFF_MAX);
|
|
475
|
+
backoffUntil = Date.now() + backoffMs;
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
backoffMs = 0;
|
|
479
|
+
backoffUntil = 0;
|
|
480
|
+
const data = (await response.json());
|
|
481
|
+
const vector = data.data[0]?.embedding;
|
|
482
|
+
if (!vector)
|
|
483
|
+
return;
|
|
484
|
+
embeddingsStore.vectors.set(doc.id, vector);
|
|
485
|
+
embeddingsStore.available = true;
|
|
486
|
+
persistEmbeddings(embeddingsStore, knowledgeDir);
|
|
487
|
+
log.debug("embed_doc", { id: doc.id });
|
|
488
|
+
}
|
|
489
|
+
catch (err) {
|
|
490
|
+
log.warn("embed_doc_error", { id: doc.id, error: String(err) });
|
|
491
|
+
backoffMs = Math.min(backoffMs === 0 ? 1000 : backoffMs * 2, BACKOFF_MAX);
|
|
492
|
+
backoffUntil = Date.now() + backoffMs;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
export function removeEmbedding(embeddingsStore, knowledgeDir, docId) {
|
|
496
|
+
if (embeddingsStore.vectors.delete(docId)) {
|
|
497
|
+
embeddingsStore.available = embeddingsStore.vectors.size > 0;
|
|
498
|
+
persistEmbeddings(embeddingsStore, knowledgeDir);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
// --- Debounced async embedding persistence ---
|
|
502
|
+
let pendingFlush = null;
|
|
503
|
+
let debounceTimer = null;
|
|
504
|
+
async function flushEmbeddings() {
|
|
505
|
+
if (!pendingFlush)
|
|
506
|
+
return;
|
|
507
|
+
const { store, knowledgeDir } = pendingFlush;
|
|
508
|
+
pendingFlush = null;
|
|
509
|
+
try {
|
|
510
|
+
const embeddingsPath = join(knowledgeDir, ".embeddings.json");
|
|
511
|
+
const obj = {};
|
|
512
|
+
for (const [id, vec] of store.vectors) {
|
|
513
|
+
obj[id] = vec;
|
|
514
|
+
}
|
|
515
|
+
await writeFile(embeddingsPath, JSON.stringify(obj), "utf-8");
|
|
516
|
+
}
|
|
517
|
+
catch {
|
|
518
|
+
// Best-effort persistence
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
function persistEmbeddings(store, knowledgeDir) {
|
|
522
|
+
pendingFlush = { store, knowledgeDir };
|
|
523
|
+
if (debounceTimer)
|
|
524
|
+
clearTimeout(debounceTimer);
|
|
525
|
+
debounceTimer = setTimeout(() => {
|
|
526
|
+
debounceTimer = null;
|
|
527
|
+
flushEmbeddings();
|
|
528
|
+
}, 5000);
|
|
529
|
+
}
|
|
530
|
+
// Flush on process exit
|
|
531
|
+
process.on("beforeExit", () => {
|
|
532
|
+
flushEmbeddings();
|
|
533
|
+
});
|
|
534
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../src/embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { KnowledgeDocument } from "./loader.js";
|
|
2
|
+
export type DetailLevel = "summary" | "normal" | "full";
|
|
3
|
+
interface FormattedDoc {
|
|
4
|
+
doc: KnowledgeDocument;
|
|
5
|
+
relevance: "primary" | "ancestor" | "graph-expanded";
|
|
6
|
+
similarity?: number;
|
|
7
|
+
matchedOn?: string;
|
|
8
|
+
scoringMethod?: string;
|
|
9
|
+
expandedFrom?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface FacetCounts {
|
|
12
|
+
domains: Map<string, number>;
|
|
13
|
+
types: Map<string, number>;
|
|
14
|
+
phases: Map<string, number>;
|
|
15
|
+
}
|
|
16
|
+
export declare function formatSearchResults(query: string, results: FormattedDoc[], detailLevel?: DetailLevel, searchMethod?: string, facets?: FacetCounts): string;
|
|
17
|
+
export declare function formatLookupResult(doc: KnowledgeDocument, ancestors: KnowledgeDocument[], related: KnowledgeDocument[], contentLevel?: "full" | "summary"): string;
|
|
18
|
+
export declare function formatGraphResult(nodes: Array<{
|
|
19
|
+
id: string;
|
|
20
|
+
title: string;
|
|
21
|
+
type: string;
|
|
22
|
+
domain: string;
|
|
23
|
+
wordCount: number;
|
|
24
|
+
childrenCount: number;
|
|
25
|
+
}>, edges: Array<{
|
|
26
|
+
source: string;
|
|
27
|
+
target: string;
|
|
28
|
+
type: "child" | "related";
|
|
29
|
+
}>, totalDocs: number, rootId: string): string;
|
|
30
|
+
export declare function formatWriteResult(result: {
|
|
31
|
+
id: string;
|
|
32
|
+
filePath: string;
|
|
33
|
+
parentId: string | null;
|
|
34
|
+
status: "created" | "updated";
|
|
35
|
+
warnings?: string[];
|
|
36
|
+
}): string;
|
|
37
|
+
export declare function formatDeleteResult(result: {
|
|
38
|
+
id: string;
|
|
39
|
+
warnings: string[];
|
|
40
|
+
}): string;
|
|
41
|
+
export declare function formatListResult(docs: Array<{
|
|
42
|
+
id: string;
|
|
43
|
+
title: string;
|
|
44
|
+
type: string;
|
|
45
|
+
domain: string;
|
|
46
|
+
tags: string[];
|
|
47
|
+
wordCount: number;
|
|
48
|
+
status: string;
|
|
49
|
+
lastUpdated?: string;
|
|
50
|
+
}>, totalDocs: number): string;
|
|
51
|
+
export type { FormattedDoc };
|