memorandum-mcp 0.1.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/LICENSE +674 -0
  2. package/README.md +237 -0
  3. package/README.ru.md +237 -0
  4. package/dist/config.d.ts +36 -0
  5. package/dist/config.js +63 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/document-store.d.ts +145 -0
  8. package/dist/document-store.js +682 -0
  9. package/dist/document-store.js.map +1 -0
  10. package/dist/document-tools.d.ts +10 -0
  11. package/dist/document-tools.js +101 -0
  12. package/dist/document-tools.js.map +1 -0
  13. package/dist/document-types.d.ts +147 -0
  14. package/dist/document-types.js +125 -0
  15. package/dist/document-types.js.map +1 -0
  16. package/dist/embedder.d.ts +55 -0
  17. package/dist/embedder.js +152 -0
  18. package/dist/embedder.js.map +1 -0
  19. package/dist/embedding-queue.d.ts +66 -0
  20. package/dist/embedding-queue.js +152 -0
  21. package/dist/embedding-queue.js.map +1 -0
  22. package/dist/errors.d.ts +26 -0
  23. package/dist/errors.js +46 -0
  24. package/dist/errors.js.map +1 -0
  25. package/dist/index.d.ts +9 -0
  26. package/dist/index.js +147 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/logger.d.ts +12 -0
  29. package/dist/logger.js +22 -0
  30. package/dist/logger.js.map +1 -0
  31. package/dist/semantic-index.d.ts +126 -0
  32. package/dist/semantic-index.js +427 -0
  33. package/dist/semantic-index.js.map +1 -0
  34. package/dist/semantic-tools.d.ts +10 -0
  35. package/dist/semantic-tools.js +80 -0
  36. package/dist/semantic-tools.js.map +1 -0
  37. package/dist/semantic-types.d.ts +161 -0
  38. package/dist/semantic-types.js +101 -0
  39. package/dist/semantic-types.js.map +1 -0
  40. package/dist/store.d.ts +130 -0
  41. package/dist/store.js +389 -0
  42. package/dist/store.js.map +1 -0
  43. package/dist/tools.d.ts +15 -0
  44. package/dist/tools.js +104 -0
  45. package/dist/tools.js.map +1 -0
  46. package/dist/types.d.ts +97 -0
  47. package/dist/types.js +88 -0
  48. package/dist/types.js.map +1 -0
  49. package/dist/vector-store.d.ts +85 -0
  50. package/dist/vector-store.js +241 -0
  51. package/dist/vector-store.js.map +1 -0
  52. package/package.json +50 -0
package/dist/logger.js ADDED
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Logger setup for Memorandum MCP server.
3
+ *
4
+ * Uses pino with stderr transport (stdout is reserved for MCP protocol).
5
+ */
6
+ import pino from 'pino';
7
+ /**
8
+ * Create a pino logger that writes to stderr.
9
+ * @param level - Log level (default: "info").
10
+ * @returns Configured pino logger instance.
11
+ */
12
+ export function createLogger(level = 'info') {
13
+ return pino({
14
+ name: 'memorandum',
15
+ level,
16
+ transport: {
17
+ target: 'pino/file',
18
+ options: { destination: 2 }, // stderr
19
+ },
20
+ });
21
+ }
22
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,MAAM;IACjD,OAAO,IAAI,CAAC;QACV,IAAI,EAAE,YAAY;QAClB,KAAK;QACL,SAAS,EAAE;YACT,MAAM,EAAE,WAAW;YACnB,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,SAAS;SACvC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,126 @@
1
+ import type { Logger } from 'pino';
2
+ import type { Embedder } from './embedder.js';
3
+ import type { VectorStore } from './vector-store.js';
4
+ import type { MemoryStore } from './store.js';
5
+ import type { DocumentStore } from './document-store.js';
6
+ import type { EmbeddingQueue } from './embedding-queue.js';
7
+ import type { SearchResult, SearchFilterOptions, IndexStatus } from './semantic-types.js';
8
+ /**
9
+ * High-level semantic search index that coordinates the Embedder, VectorStore,
10
+ * and EmbeddingQueue to index and search facts and documents.
11
+ */
12
+ export declare class SemanticIndex {
13
+ private readonly embedder;
14
+ private readonly vectorStore;
15
+ private readonly logger;
16
+ private memoryStore;
17
+ private documentStore;
18
+ private embeddingQueue;
19
+ constructor(embedder: Embedder, vectorStore: VectorStore, logger: Logger);
20
+ /** Assigns the embedding queue used for batched, asynchronous indexing. */
21
+ setEmbeddingQueue(queue: EmbeddingQueue): void;
22
+ /** The identifier of the embedding model currently in use. */
23
+ get modelId(): string;
24
+ /** Assigns the memory store used for fact lookups during reindex/prune. */
25
+ setMemoryStore(store: MemoryStore): void;
26
+ /** Assigns the document store used for document lookups during reindex/prune. */
27
+ setDocumentStore(store: DocumentStore): void;
28
+ /**
29
+ * Detects embedding dimensions by running a test embedding,
30
+ * then loads the vector index from disk.
31
+ */
32
+ initialize(): Promise<void>;
33
+ /**
34
+ * Enqueues a document for asynchronous embedding via the EmbeddingQueue.
35
+ * @param id - The document identifier.
36
+ * @param metadata - Document metadata (title, tags, content type, etc.).
37
+ * @param body - Optional document body used for inline content types.
38
+ */
39
+ enqueueDocument(id: string, metadata: {
40
+ title: string;
41
+ topic?: string;
42
+ tags: string[];
43
+ contentType: string;
44
+ description?: string;
45
+ }, body?: string): void;
46
+ /**
47
+ * Indexes a document immediately, or delegates to the queue if available.
48
+ * @param id - The document identifier.
49
+ * @param metadata - Document metadata (title, tags, content type, etc.).
50
+ * @param body - Optional document body used for inline content types.
51
+ */
52
+ indexDocument(id: string, metadata: {
53
+ title: string;
54
+ topic?: string;
55
+ tags: string[];
56
+ contentType: string;
57
+ description?: string;
58
+ }, body?: string): Promise<void>;
59
+ /**
60
+ * Removes a document's vector entry and dequeues any pending embedding.
61
+ * @param id - The document identifier to remove.
62
+ */
63
+ removeDocument(id: string): void;
64
+ /**
65
+ * Enqueues a fact for asynchronous embedding via the EmbeddingQueue.
66
+ * @param key - The fact key.
67
+ * @param namespace - The fact namespace.
68
+ * @param value - The fact value to embed.
69
+ */
70
+ enqueueFact(key: string, namespace: string, value: unknown): void;
71
+ /**
72
+ * Indexes a fact immediately, or delegates to the queue if available.
73
+ * @param key - The fact key.
74
+ * @param namespace - The fact namespace.
75
+ * @param value - The fact value to embed.
76
+ */
77
+ indexFact(key: string, namespace: string, value: unknown): Promise<void>;
78
+ /**
79
+ * Removes a fact's vector entry and dequeues any pending embedding.
80
+ * @param key - The fact key.
81
+ * @param namespace - The fact namespace.
82
+ */
83
+ removeFact(key: string, namespace: string): void;
84
+ /**
85
+ * Removes vector entries whose corresponding fact or document no longer
86
+ * exists in the memory or document store.
87
+ */
88
+ pruneOrphans(): Promise<void>;
89
+ /**
90
+ * Scans for facts and documents that are missing from the vector index
91
+ * (or have pending retry records) and enqueues them for embedding.
92
+ * @returns The number of items enqueued.
93
+ */
94
+ enqueueMissing(): number;
95
+ /**
96
+ * Performs a semantic search against the vector index.
97
+ * @param query - Natural-language search query.
98
+ * @param options - Optional filters (source, namespace, tag, topic, limit, threshold).
99
+ * @returns The index status, an optional hint, matching results, and total match count.
100
+ */
101
+ search(query: string, options?: SearchFilterOptions): Promise<{
102
+ status: IndexStatus;
103
+ hint?: string;
104
+ results: SearchResult[];
105
+ total: number;
106
+ }>;
107
+ /**
108
+ * Re-embeds and rebuilds the vector index for the specified source(s).
109
+ * Repairs the model if needed before starting.
110
+ * @param source - Which entries to reindex: "all", "documents", or "facts".
111
+ * @returns Counts of indexed facts, documents, skipped items, and duration.
112
+ */
113
+ reindex(source?: 'all' | 'documents' | 'facts'): Promise<{
114
+ facts: number;
115
+ documents: number;
116
+ total: number;
117
+ skipped: number;
118
+ duration_ms: number;
119
+ }>;
120
+ /**
121
+ * Returns the current status of the semantic index (e.g. "ready",
122
+ * "empty", "model_loading", "model_unavailable", "stale_model", "partial").
123
+ */
124
+ getStatus(): IndexStatus;
125
+ private getTotalItemCount;
126
+ }
@@ -0,0 +1,427 @@
1
+ import { INDEX_STATUS_HINTS, FACT_ID_PREFIX, DOC_ID_PREFIX, makeFactVectorId, makeDocVectorId } from './semantic-types.js';
2
+ import { isInlineContentType } from './document-types.js';
3
+ /**
4
+ * High-level semantic search index that coordinates the Embedder, VectorStore,
5
+ * and EmbeddingQueue to index and search facts and documents.
6
+ */
7
+ export class SemanticIndex {
8
+ embedder;
9
+ vectorStore;
10
+ logger;
11
+ memoryStore = null;
12
+ documentStore = null;
13
+ embeddingQueue = null;
14
+ constructor(embedder, vectorStore, logger) {
15
+ this.embedder = embedder;
16
+ this.vectorStore = vectorStore;
17
+ this.logger = logger;
18
+ }
19
+ /** Assigns the embedding queue used for batched, asynchronous indexing. */
20
+ setEmbeddingQueue(queue) { this.embeddingQueue = queue; }
21
+ /** The identifier of the embedding model currently in use. */
22
+ get modelId() { return this.vectorStore.currentModelId; }
23
+ /** Assigns the memory store used for fact lookups during reindex/prune. */
24
+ setMemoryStore(store) { this.memoryStore = store; }
25
+ /** Assigns the document store used for document lookups during reindex/prune. */
26
+ setDocumentStore(store) { this.documentStore = store; }
27
+ /**
28
+ * Detects embedding dimensions by running a test embedding,
29
+ * then loads the vector index from disk.
30
+ */
31
+ async initialize() {
32
+ try {
33
+ const vector = await this.embedder.embedPassage('init');
34
+ this.vectorStore.setDimensions(vector.length);
35
+ this.logger.info({ dimensions: vector.length, model: this.vectorStore.currentModelId }, 'Embedding dimensions detected');
36
+ }
37
+ catch (err) {
38
+ this.logger.warn({ error: err instanceof Error ? err.message : String(err) }, 'Failed to detect dimensions — using default');
39
+ }
40
+ this.vectorStore.load();
41
+ }
42
+ // ==========================================================================
43
+ // Document Indexing
44
+ // ==========================================================================
45
+ /**
46
+ * Enqueues a document for asynchronous embedding via the EmbeddingQueue.
47
+ * @param id - The document identifier.
48
+ * @param metadata - Document metadata (title, tags, content type, etc.).
49
+ * @param body - Optional document body used for inline content types.
50
+ */
51
+ enqueueDocument(id, metadata, body) {
52
+ if (!this.embeddingQueue)
53
+ return;
54
+ const textToEmbed = isInlineContentType(metadata.contentType) && body
55
+ ? body
56
+ : [metadata.title, metadata.description, ...(metadata.tags || [])].filter(Boolean).join(' ');
57
+ const docMetadata = {
58
+ documentId: id, title: metadata.title,
59
+ topic: metadata.topic, tags: metadata.tags, contentType: metadata.contentType,
60
+ };
61
+ this.embeddingQueue.enqueue({
62
+ id: makeDocVectorId(id), source: 'document',
63
+ textToEmbed, metadata: docMetadata, enqueuedAt: Date.now(),
64
+ });
65
+ }
66
+ /**
67
+ * Indexes a document immediately, or delegates to the queue if available.
68
+ * @param id - The document identifier.
69
+ * @param metadata - Document metadata (title, tags, content type, etc.).
70
+ * @param body - Optional document body used for inline content types.
71
+ */
72
+ async indexDocument(id, metadata, body) {
73
+ if (this.embeddingQueue) {
74
+ this.enqueueDocument(id, metadata, body);
75
+ return;
76
+ }
77
+ try {
78
+ const textToEmbed = isInlineContentType(metadata.contentType) && body
79
+ ? body
80
+ : [metadata.title, metadata.description, ...(metadata.tags || [])].filter(Boolean).join(' ');
81
+ const vector = await this.embedder.embedPassage(textToEmbed);
82
+ const docMetadata = {
83
+ documentId: id, title: metadata.title,
84
+ topic: metadata.topic, tags: metadata.tags, contentType: metadata.contentType,
85
+ };
86
+ this.vectorStore.upsert({
87
+ id: makeDocVectorId(id), vector, source: 'document',
88
+ metadata: docMetadata, indexedAt: Date.now(),
89
+ });
90
+ }
91
+ catch (err) {
92
+ this.logger.warn({ documentId: id, error: err instanceof Error ? err.message : String(err) }, 'Failed to index document');
93
+ }
94
+ }
95
+ /**
96
+ * Removes a document's vector entry and dequeues any pending embedding.
97
+ * @param id - The document identifier to remove.
98
+ */
99
+ removeDocument(id) {
100
+ const vectorId = makeDocVectorId(id);
101
+ if (this.embeddingQueue)
102
+ this.embeddingQueue.dequeue(vectorId);
103
+ const removed = this.vectorStore.remove(vectorId);
104
+ if (removed) {
105
+ this.vectorStore.save().catch((err) => {
106
+ this.logger.warn({ error: err instanceof Error ? err.message : String(err) }, 'Failed to save after document removal');
107
+ });
108
+ }
109
+ }
110
+ // ==========================================================================
111
+ // Fact Indexing
112
+ // ==========================================================================
113
+ /**
114
+ * Enqueues a fact for asynchronous embedding via the EmbeddingQueue.
115
+ * @param key - The fact key.
116
+ * @param namespace - The fact namespace.
117
+ * @param value - The fact value to embed.
118
+ */
119
+ enqueueFact(key, namespace, value) {
120
+ if (!this.embeddingQueue)
121
+ return;
122
+ const valueStr = typeof value === 'string' ? value : JSON.stringify(value);
123
+ const textToEmbed = `${namespace}: ${key} — ${valueStr}`;
124
+ const preview = valueStr.length > 200 ? valueStr.slice(0, 200) : valueStr;
125
+ const factMetadata = { key, namespace, preview };
126
+ this.embeddingQueue.enqueue({
127
+ id: makeFactVectorId(namespace, key), source: 'fact',
128
+ textToEmbed, metadata: factMetadata, enqueuedAt: Date.now(),
129
+ });
130
+ }
131
+ /**
132
+ * Indexes a fact immediately, or delegates to the queue if available.
133
+ * @param key - The fact key.
134
+ * @param namespace - The fact namespace.
135
+ * @param value - The fact value to embed.
136
+ */
137
+ async indexFact(key, namespace, value) {
138
+ if (this.embeddingQueue) {
139
+ this.enqueueFact(key, namespace, value);
140
+ return;
141
+ }
142
+ try {
143
+ const valueStr = typeof value === 'string' ? value : JSON.stringify(value);
144
+ const textToEmbed = `${namespace}: ${key} — ${valueStr}`;
145
+ const vector = await this.embedder.embedPassage(textToEmbed);
146
+ const preview = valueStr.length > 200 ? valueStr.slice(0, 200) : valueStr;
147
+ this.vectorStore.upsert({
148
+ id: makeFactVectorId(namespace, key), vector, source: 'fact',
149
+ metadata: { key, namespace, preview }, indexedAt: Date.now(),
150
+ });
151
+ }
152
+ catch (err) {
153
+ this.logger.warn({ key, namespace, error: err instanceof Error ? err.message : String(err) }, 'Failed to index fact');
154
+ }
155
+ }
156
+ /**
157
+ * Removes a fact's vector entry and dequeues any pending embedding.
158
+ * @param key - The fact key.
159
+ * @param namespace - The fact namespace.
160
+ */
161
+ removeFact(key, namespace) {
162
+ const vectorId = makeFactVectorId(namespace, key);
163
+ if (this.embeddingQueue)
164
+ this.embeddingQueue.dequeue(vectorId);
165
+ const removed = this.vectorStore.remove(vectorId);
166
+ if (removed) {
167
+ this.vectorStore.save().catch((err) => {
168
+ this.logger.warn({ error: err instanceof Error ? err.message : String(err) }, 'Failed to save after fact removal');
169
+ });
170
+ }
171
+ }
172
+ // ==========================================================================
173
+ // Orphan Cleanup
174
+ // ==========================================================================
175
+ /**
176
+ * Removes vector entries whose corresponding fact or document no longer
177
+ * exists in the memory or document store.
178
+ */
179
+ async pruneOrphans() {
180
+ const entries = this.vectorStore.allEntries();
181
+ const orphanIds = [];
182
+ for (const entry of entries) {
183
+ if (entry.id.startsWith(FACT_ID_PREFIX)) {
184
+ const rest = entry.id.slice(FACT_ID_PREFIX.length);
185
+ const sepIdx = rest.indexOf('\0');
186
+ if (sepIdx === -1) {
187
+ orphanIds.push(entry.id);
188
+ continue;
189
+ }
190
+ const namespace = rest.slice(0, sepIdx);
191
+ const key = rest.slice(sepIdx + 1);
192
+ if (this.memoryStore && !this.memoryStore.read(key, namespace)) {
193
+ orphanIds.push(entry.id);
194
+ }
195
+ }
196
+ else if (entry.id.startsWith(DOC_ID_PREFIX)) {
197
+ const docId = entry.id.slice(DOC_ID_PREFIX.length);
198
+ if (this.documentStore) {
199
+ if (!this.documentStore.getIndex().documents.some((d) => d.id === docId)) {
200
+ orphanIds.push(entry.id);
201
+ }
202
+ }
203
+ }
204
+ }
205
+ if (orphanIds.length > 0) {
206
+ for (const id of orphanIds)
207
+ this.vectorStore.remove(id);
208
+ await this.vectorStore.save();
209
+ this.logger.info({ pruned: orphanIds.length }, 'Pruned orphaned vector entries');
210
+ }
211
+ }
212
+ // ==========================================================================
213
+ // Startup Recovery
214
+ // ==========================================================================
215
+ /**
216
+ * Scans for facts and documents that are missing from the vector index
217
+ * (or have pending retry records) and enqueues them for embedding.
218
+ * @returns The number of items enqueued.
219
+ */
220
+ enqueueMissing() {
221
+ if (!this.embeddingQueue)
222
+ return 0;
223
+ let enqueued = 0;
224
+ const existingIds = new Set(this.vectorStore.allEntries().map((e) => e.id));
225
+ const failures = this.vectorStore.getFailedEmbeddings();
226
+ for (const [id, record] of Object.entries(failures)) {
227
+ if (record.status !== 'pending')
228
+ continue;
229
+ if (id.startsWith(FACT_ID_PREFIX) && this.memoryStore) {
230
+ const rest = id.slice(FACT_ID_PREFIX.length);
231
+ const sepIdx = rest.indexOf('\0');
232
+ if (sepIdx === -1)
233
+ continue;
234
+ const namespace = rest.slice(0, sepIdx);
235
+ const key = rest.slice(sepIdx + 1);
236
+ const fact = this.memoryStore.read(key, namespace);
237
+ if (fact) {
238
+ this.enqueueFact(key, namespace, fact.value);
239
+ enqueued++;
240
+ }
241
+ }
242
+ else if (id.startsWith(DOC_ID_PREFIX) && this.documentStore) {
243
+ const docId = id.slice(DOC_ID_PREFIX.length);
244
+ const docMeta = this.documentStore.getIndex().documents.find((d) => d.id === docId);
245
+ if (docMeta) {
246
+ const fullDoc = this.documentStore.read({ id: docId, include_body: true });
247
+ this.enqueueDocument(docId, {
248
+ title: docMeta.title, topic: docMeta.topic,
249
+ tags: docMeta.tags ?? [], contentType: docMeta.content_type,
250
+ description: docMeta.description,
251
+ }, fullDoc.body);
252
+ enqueued++;
253
+ }
254
+ }
255
+ }
256
+ if (this.memoryStore) {
257
+ const factsList = this.memoryStore.list({
258
+ limit: this.memoryStore.maxEntries, includeValues: true, includeStats: false,
259
+ });
260
+ for (const fact of factsList.facts) {
261
+ const key = fact.key;
262
+ const namespace = fact.namespace;
263
+ if (!existingIds.has(makeFactVectorId(namespace, key))) {
264
+ this.enqueueFact(key, namespace, fact.value);
265
+ enqueued++;
266
+ }
267
+ }
268
+ }
269
+ if (this.documentStore) {
270
+ for (const docMeta of this.documentStore.getIndex().documents) {
271
+ if (!existingIds.has(makeDocVectorId(docMeta.id))) {
272
+ const fullDoc = this.documentStore.read({ id: docMeta.id, include_body: true });
273
+ this.enqueueDocument(docMeta.id, {
274
+ title: docMeta.title, topic: docMeta.topic,
275
+ tags: docMeta.tags ?? [], contentType: docMeta.content_type,
276
+ description: docMeta.description,
277
+ }, fullDoc.body);
278
+ enqueued++;
279
+ }
280
+ }
281
+ }
282
+ if (enqueued > 0)
283
+ this.logger.info({ enqueued }, 'Enqueued missing embeddings for recovery');
284
+ return enqueued;
285
+ }
286
+ // ==========================================================================
287
+ // Search
288
+ // ==========================================================================
289
+ /**
290
+ * Performs a semantic search against the vector index.
291
+ * @param query - Natural-language search query.
292
+ * @param options - Optional filters (source, namespace, tag, topic, limit, threshold).
293
+ * @returns The index status, an optional hint, matching results, and total match count.
294
+ */
295
+ async search(query, options) {
296
+ const status = this.getStatus();
297
+ const hint = INDEX_STATUS_HINTS[status];
298
+ if (status === 'model_unavailable' || status === 'model_loading') {
299
+ const reason = this.embedder.unavailableReason;
300
+ return { status, hint: reason ? `${hint} Reason: ${reason}` : hint, results: [], total: 0 };
301
+ }
302
+ if (status === 'empty')
303
+ return { status, hint, results: [], total: 0 };
304
+ try {
305
+ const queryVector = await this.embedder.embedQuery(query);
306
+ const allResults = this.vectorStore.query(queryVector, { ...options, limit: Number.MAX_SAFE_INTEGER });
307
+ const total = allResults.length;
308
+ const limit = options?.limit ?? 10;
309
+ return { status, hint, results: allResults.slice(0, limit), total };
310
+ }
311
+ catch (err) {
312
+ const errorMsg = err instanceof Error ? err.message : String(err);
313
+ this.logger.warn({ query, error: errorMsg }, 'Semantic search failed');
314
+ return { status: 'model_unavailable', hint: `${INDEX_STATUS_HINTS.model_unavailable} Reason: ${errorMsg}`, results: [], total: 0 };
315
+ }
316
+ }
317
+ // ==========================================================================
318
+ // Reindex
319
+ // ==========================================================================
320
+ /**
321
+ * Re-embeds and rebuilds the vector index for the specified source(s).
322
+ * Repairs the model if needed before starting.
323
+ * @param source - Which entries to reindex: "all", "documents", or "facts".
324
+ * @returns Counts of indexed facts, documents, skipped items, and duration.
325
+ */
326
+ async reindex(source = 'all') {
327
+ await this.embedder.repairAndLoad();
328
+ const start = Date.now();
329
+ let factsIndexed = 0, docsIndexed = 0, skipped = 0;
330
+ const newEntries = [];
331
+ if (source !== 'documents' && this.memoryStore) {
332
+ const factsList = this.memoryStore.list({
333
+ limit: this.memoryStore.maxEntries, includeValues: true, includeStats: false,
334
+ });
335
+ for (const fact of factsList.facts) {
336
+ try {
337
+ const key = fact.key;
338
+ const namespace = fact.namespace;
339
+ const valueStr = typeof fact.value === 'string' ? fact.value : JSON.stringify(fact.value);
340
+ const vector = await this.embedder.embedPassage(`${namespace}: ${key} — ${valueStr}`);
341
+ const preview = valueStr.length > 200 ? valueStr.slice(0, 200) : valueStr;
342
+ newEntries.push({
343
+ id: makeFactVectorId(namespace, key), vector, source: 'fact',
344
+ metadata: { key, namespace, preview }, indexedAt: Date.now(),
345
+ });
346
+ factsIndexed++;
347
+ }
348
+ catch {
349
+ skipped++;
350
+ }
351
+ }
352
+ }
353
+ if (source !== 'facts' && this.documentStore) {
354
+ for (const docRecord of this.documentStore.list({}).documents) {
355
+ try {
356
+ const id = docRecord.id;
357
+ const title = docRecord.title;
358
+ const contentType = docRecord.content_type;
359
+ const tags = docRecord.tags ?? [];
360
+ const topic = docRecord.topic;
361
+ const description = docRecord.description;
362
+ let textToEmbed;
363
+ if (isInlineContentType(contentType)) {
364
+ const fullDoc = this.documentStore.read({ id, include_body: true });
365
+ textToEmbed = fullDoc.body || [title, description, ...tags].filter(Boolean).join(' ');
366
+ }
367
+ else {
368
+ textToEmbed = [title, description, ...tags].filter(Boolean).join(' ');
369
+ }
370
+ const vector = await this.embedder.embedPassage(textToEmbed);
371
+ newEntries.push({
372
+ id: makeDocVectorId(id), vector, source: 'document',
373
+ metadata: { documentId: id, title, topic, tags, contentType },
374
+ indexedAt: Date.now(),
375
+ });
376
+ docsIndexed++;
377
+ }
378
+ catch {
379
+ skipped++;
380
+ }
381
+ }
382
+ }
383
+ if (source === 'all') {
384
+ this.vectorStore.rebuild(newEntries);
385
+ this.vectorStore.setFailedEmbeddings({});
386
+ }
387
+ else {
388
+ for (const entry of newEntries)
389
+ this.vectorStore.upsert(entry);
390
+ }
391
+ await this.vectorStore.save();
392
+ const duration_ms = Date.now() - start;
393
+ this.logger.info({ factsIndexed, docsIndexed, skipped, duration_ms }, 'Reindex completed');
394
+ return { facts: factsIndexed, documents: docsIndexed, total: factsIndexed + docsIndexed, skipped, duration_ms };
395
+ }
396
+ // ==========================================================================
397
+ // Status
398
+ // ==========================================================================
399
+ /**
400
+ * Returns the current status of the semantic index (e.g. "ready",
401
+ * "empty", "model_loading", "model_unavailable", "stale_model", "partial").
402
+ */
403
+ getStatus() {
404
+ if (this.embedder.isUnavailable)
405
+ return 'model_unavailable';
406
+ if (this.embedder.isLoading)
407
+ return 'model_loading';
408
+ if (this.vectorStore.entryCount === 0)
409
+ return 'empty';
410
+ const indexModel = this.vectorStore.indexModelId;
411
+ if (indexModel && indexModel !== this.vectorStore.currentModelId)
412
+ return 'stale_model';
413
+ const totalItems = this.getTotalItemCount();
414
+ if (totalItems > 0 && this.vectorStore.entryCount < totalItems)
415
+ return 'partial';
416
+ return 'ready';
417
+ }
418
+ getTotalItemCount() {
419
+ let total = 0;
420
+ if (this.memoryStore)
421
+ total += this.memoryStore.size;
422
+ if (this.documentStore)
423
+ total += this.documentStore.getIndex().documents.length;
424
+ return total;
425
+ }
426
+ }
427
+ //# sourceMappingURL=semantic-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-index.js","sourceRoot":"","sources":["../src/semantic-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { Logger } from 'pino';
3
+ import type { SemanticIndex } from './semantic-index.js';
4
+ /**
5
+ * Registers semantic_search and semantic_reindex tools on the MCP server.
6
+ * @param server - The MCP server instance to register tools on.
7
+ * @param semanticIndex - The semantic index used for embedding-based search and reindexing.
8
+ * @param _logger - Logger instance (reserved for future use).
9
+ */
10
+ export declare function registerSemanticTools(server: McpServer, semanticIndex: SemanticIndex, _logger: Logger): void;