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.
Files changed (52) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/LICENSE +21 -0
  3. package/README.md +205 -0
  4. package/dist/analytics.d.ts +24 -0
  5. package/dist/analytics.js +102 -0
  6. package/dist/analytics.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +98 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/config.d.ts +39 -0
  11. package/dist/config.js +80 -0
  12. package/dist/config.js.map +1 -0
  13. package/dist/embeddings.d.ts +26 -0
  14. package/dist/embeddings.js +534 -0
  15. package/dist/embeddings.js.map +1 -0
  16. package/dist/formatter.d.ts +51 -0
  17. package/dist/formatter.js +273 -0
  18. package/dist/formatter.js.map +1 -0
  19. package/dist/generate-embeddings.d.ts +8 -0
  20. package/dist/generate-embeddings.js +146 -0
  21. package/dist/generate-embeddings.js.map +1 -0
  22. package/dist/graph.d.ts +20 -0
  23. package/dist/graph.js +133 -0
  24. package/dist/graph.js.map +1 -0
  25. package/dist/index.d.ts +14 -0
  26. package/dist/index.js +481 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/init.d.ts +1 -0
  29. package/dist/init.js +65 -0
  30. package/dist/init.js.map +1 -0
  31. package/dist/loader.d.ts +26 -0
  32. package/dist/loader.js +151 -0
  33. package/dist/loader.js.map +1 -0
  34. package/dist/logger.d.ts +6 -0
  35. package/dist/logger.js +15 -0
  36. package/dist/logger.js.map +1 -0
  37. package/dist/query-classifier.d.ts +23 -0
  38. package/dist/query-classifier.js +111 -0
  39. package/dist/query-classifier.js.map +1 -0
  40. package/dist/reranker.d.ts +7 -0
  41. package/dist/reranker.js +38 -0
  42. package/dist/reranker.js.map +1 -0
  43. package/dist/search.d.ts +17 -0
  44. package/dist/search.js +299 -0
  45. package/dist/search.js.map +1 -0
  46. package/dist/validator.d.ts +23 -0
  47. package/dist/validator.js +97 -0
  48. package/dist/validator.js.map +1 -0
  49. package/dist/writer.d.ts +36 -0
  50. package/dist/writer.js +360 -0
  51. package/dist/writer.js.map +1 -0
  52. 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 };