@claude-flow/cli 3.0.0-alpha.183 → 3.0.0-alpha.185
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/.claude/memory.db +0 -0
- package/README.md +47 -5
- package/dist/src/commands/index.d.ts +10 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +62 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +40 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp-tools/memory-tools.d.ts +8 -2
- package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
- package/dist/src/mcp-tools/memory-tools.js +370 -126
- package/dist/src/mcp-tools/memory-tools.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -1,233 +1,477 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Memory MCP Tools for CLI
|
|
2
|
+
* Memory MCP Tools for CLI - V3 with sql.js/HNSW Backend
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* UPGRADED: Now uses the advanced sql.js + HNSW backend for:
|
|
5
|
+
* - 150x-12,500x faster semantic search
|
|
6
|
+
* - Vector embeddings with cosine similarity
|
|
7
|
+
* - Persistent SQLite storage (WASM)
|
|
8
|
+
* - Backward compatible with legacy JSON storage (auto-migrates)
|
|
9
|
+
*
|
|
10
|
+
* @module v3/cli/mcp-tools/memory-tools
|
|
5
11
|
*/
|
|
6
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
|
12
|
+
import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'fs';
|
|
7
13
|
import { join, resolve } from 'path';
|
|
14
|
+
// Paths
|
|
8
15
|
const MEMORY_DIR = '.claude-flow/memory';
|
|
9
|
-
const
|
|
10
|
-
|
|
11
|
-
|
|
16
|
+
const LEGACY_MEMORY_FILE = 'store.json';
|
|
17
|
+
const MIGRATION_MARKER = '.migrated-to-sqlite';
|
|
18
|
+
function getMemoryDir() {
|
|
19
|
+
return resolve(MEMORY_DIR);
|
|
20
|
+
}
|
|
21
|
+
function getLegacyPath() {
|
|
22
|
+
return resolve(join(MEMORY_DIR, LEGACY_MEMORY_FILE));
|
|
23
|
+
}
|
|
24
|
+
function getMigrationMarkerPath() {
|
|
25
|
+
return resolve(join(MEMORY_DIR, MIGRATION_MARKER));
|
|
12
26
|
}
|
|
13
27
|
function ensureMemoryDir() {
|
|
14
|
-
const dir =
|
|
28
|
+
const dir = getMemoryDir();
|
|
15
29
|
if (!existsSync(dir)) {
|
|
16
30
|
mkdirSync(dir, { recursive: true });
|
|
17
31
|
}
|
|
18
32
|
}
|
|
19
|
-
|
|
33
|
+
/**
|
|
34
|
+
* Check if legacy JSON store exists and needs migration
|
|
35
|
+
*/
|
|
36
|
+
function hasLegacyStore() {
|
|
37
|
+
const legacyPath = getLegacyPath();
|
|
38
|
+
const migrationMarker = getMigrationMarkerPath();
|
|
39
|
+
return existsSync(legacyPath) && !existsSync(migrationMarker);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Load legacy JSON store for migration
|
|
43
|
+
*/
|
|
44
|
+
function loadLegacyStore() {
|
|
20
45
|
try {
|
|
21
|
-
const path =
|
|
46
|
+
const path = getLegacyPath();
|
|
22
47
|
if (existsSync(path)) {
|
|
23
48
|
const data = readFileSync(path, 'utf-8');
|
|
24
49
|
return JSON.parse(data);
|
|
25
50
|
}
|
|
26
51
|
}
|
|
27
52
|
catch {
|
|
28
|
-
// Return
|
|
53
|
+
// Return null on error
|
|
29
54
|
}
|
|
30
|
-
return
|
|
55
|
+
return null;
|
|
31
56
|
}
|
|
32
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Mark migration as complete
|
|
59
|
+
*/
|
|
60
|
+
function markMigrationComplete() {
|
|
33
61
|
ensureMemoryDir();
|
|
34
|
-
writeFileSync(
|
|
62
|
+
writeFileSync(getMigrationMarkerPath(), JSON.stringify({
|
|
63
|
+
migratedAt: new Date().toISOString(),
|
|
64
|
+
version: '3.0.0',
|
|
65
|
+
}), 'utf-8');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Lazy-load memory initializer functions to avoid circular deps
|
|
69
|
+
*/
|
|
70
|
+
async function getMemoryFunctions() {
|
|
71
|
+
const { storeEntry, searchEntries, listEntries, getEntry, deleteEntry, initializeMemoryDatabase, checkMemoryInitialization, } = await import('../memory/memory-initializer.js');
|
|
72
|
+
return {
|
|
73
|
+
storeEntry,
|
|
74
|
+
searchEntries,
|
|
75
|
+
listEntries,
|
|
76
|
+
getEntry,
|
|
77
|
+
deleteEntry,
|
|
78
|
+
initializeMemoryDatabase,
|
|
79
|
+
checkMemoryInitialization,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Ensure memory database is initialized and migrate legacy data if needed
|
|
84
|
+
*/
|
|
85
|
+
async function ensureInitialized() {
|
|
86
|
+
const { initializeMemoryDatabase, checkMemoryInitialization, storeEntry } = await getMemoryFunctions();
|
|
87
|
+
// Check if already initialized
|
|
88
|
+
const status = await checkMemoryInitialization();
|
|
89
|
+
if (!status.initialized) {
|
|
90
|
+
await initializeMemoryDatabase({ force: false, verbose: false });
|
|
91
|
+
}
|
|
92
|
+
// Migrate legacy JSON data if exists
|
|
93
|
+
if (hasLegacyStore()) {
|
|
94
|
+
const legacyStore = loadLegacyStore();
|
|
95
|
+
if (legacyStore && Object.keys(legacyStore.entries).length > 0) {
|
|
96
|
+
console.error('[MCP Memory] Migrating legacy JSON store to sql.js...');
|
|
97
|
+
let migrated = 0;
|
|
98
|
+
for (const [key, entry] of Object.entries(legacyStore.entries)) {
|
|
99
|
+
try {
|
|
100
|
+
// Convert value to string for storage
|
|
101
|
+
const value = typeof entry.value === 'string' ? entry.value : JSON.stringify(entry.value);
|
|
102
|
+
await storeEntry({
|
|
103
|
+
key,
|
|
104
|
+
value,
|
|
105
|
+
namespace: 'default',
|
|
106
|
+
generateEmbeddingFlag: true,
|
|
107
|
+
});
|
|
108
|
+
migrated++;
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
console.error(`[MCP Memory] Failed to migrate key "${key}":`, e);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
console.error(`[MCP Memory] Migrated ${migrated}/${Object.keys(legacyStore.entries).length} entries`);
|
|
115
|
+
markMigrationComplete();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
35
118
|
}
|
|
36
119
|
export const memoryTools = [
|
|
37
120
|
{
|
|
38
121
|
name: 'memory_store',
|
|
39
|
-
description: 'Store a value in memory (
|
|
122
|
+
description: 'Store a value in memory with vector embedding for semantic search (sql.js + HNSW backend)',
|
|
40
123
|
category: 'memory',
|
|
41
124
|
inputSchema: {
|
|
42
125
|
type: 'object',
|
|
43
126
|
properties: {
|
|
44
|
-
key: { type: 'string', description: 'Memory key' },
|
|
45
|
-
value: { description: 'Value to store' },
|
|
46
|
-
|
|
127
|
+
key: { type: 'string', description: 'Memory key (unique within namespace)' },
|
|
128
|
+
value: { description: 'Value to store (string or object)' },
|
|
129
|
+
namespace: { type: 'string', description: 'Namespace for organization (default: "default")' },
|
|
130
|
+
tags: {
|
|
131
|
+
type: 'array',
|
|
132
|
+
items: { type: 'string' },
|
|
133
|
+
description: 'Optional tags for filtering',
|
|
134
|
+
},
|
|
135
|
+
ttl: { type: 'number', description: 'Time-to-live in seconds (optional)' },
|
|
47
136
|
},
|
|
48
137
|
required: ['key', 'value'],
|
|
49
138
|
},
|
|
50
139
|
handler: async (input) => {
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
140
|
+
await ensureInitialized();
|
|
141
|
+
const { storeEntry } = await getMemoryFunctions();
|
|
142
|
+
const key = input.key;
|
|
143
|
+
const namespace = input.namespace || 'default';
|
|
144
|
+
const value = typeof input.value === 'string' ? input.value : JSON.stringify(input.value);
|
|
145
|
+
const tags = input.tags || [];
|
|
146
|
+
const ttl = input.ttl;
|
|
147
|
+
const startTime = performance.now();
|
|
148
|
+
try {
|
|
149
|
+
const result = await storeEntry({
|
|
150
|
+
key,
|
|
151
|
+
value,
|
|
152
|
+
namespace,
|
|
153
|
+
generateEmbeddingFlag: true,
|
|
154
|
+
tags,
|
|
155
|
+
ttl,
|
|
156
|
+
});
|
|
157
|
+
const duration = performance.now() - startTime;
|
|
158
|
+
return {
|
|
159
|
+
success: result.success,
|
|
160
|
+
key,
|
|
161
|
+
namespace,
|
|
162
|
+
stored: result.success,
|
|
163
|
+
storedAt: new Date().toISOString(),
|
|
164
|
+
hasEmbedding: !!result.embedding,
|
|
165
|
+
embeddingDimensions: result.embedding?.dimensions || null,
|
|
166
|
+
backend: 'sql.js + HNSW',
|
|
167
|
+
storeTime: `${duration.toFixed(2)}ms`,
|
|
168
|
+
error: result.error,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
return {
|
|
173
|
+
success: false,
|
|
174
|
+
key,
|
|
175
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
176
|
+
};
|
|
177
|
+
}
|
|
70
178
|
},
|
|
71
179
|
},
|
|
72
180
|
{
|
|
73
181
|
name: 'memory_retrieve',
|
|
74
|
-
description: 'Retrieve a value from memory',
|
|
182
|
+
description: 'Retrieve a value from memory by key',
|
|
75
183
|
category: 'memory',
|
|
76
184
|
inputSchema: {
|
|
77
185
|
type: 'object',
|
|
78
186
|
properties: {
|
|
79
187
|
key: { type: 'string', description: 'Memory key' },
|
|
188
|
+
namespace: { type: 'string', description: 'Namespace (default: "default")' },
|
|
80
189
|
},
|
|
81
190
|
required: ['key'],
|
|
82
191
|
},
|
|
83
192
|
handler: async (input) => {
|
|
84
|
-
|
|
193
|
+
await ensureInitialized();
|
|
194
|
+
const { getEntry } = await getMemoryFunctions();
|
|
85
195
|
const key = input.key;
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
entry
|
|
90
|
-
|
|
91
|
-
|
|
196
|
+
const namespace = input.namespace || 'default';
|
|
197
|
+
try {
|
|
198
|
+
const result = await getEntry({ key, namespace });
|
|
199
|
+
if (result.found && result.entry) {
|
|
200
|
+
// Try to parse JSON value
|
|
201
|
+
let value = result.entry.content;
|
|
202
|
+
try {
|
|
203
|
+
value = JSON.parse(result.entry.content);
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
// Keep as string
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
key,
|
|
210
|
+
namespace,
|
|
211
|
+
value,
|
|
212
|
+
tags: result.entry.tags,
|
|
213
|
+
storedAt: result.entry.createdAt,
|
|
214
|
+
updatedAt: result.entry.updatedAt,
|
|
215
|
+
accessCount: result.entry.accessCount,
|
|
216
|
+
hasEmbedding: result.entry.hasEmbedding,
|
|
217
|
+
found: true,
|
|
218
|
+
backend: 'sql.js + HNSW',
|
|
219
|
+
};
|
|
220
|
+
}
|
|
92
221
|
return {
|
|
93
222
|
key,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
223
|
+
namespace,
|
|
224
|
+
value: null,
|
|
225
|
+
found: false,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
catch (error) {
|
|
229
|
+
return {
|
|
230
|
+
key,
|
|
231
|
+
namespace,
|
|
232
|
+
value: null,
|
|
233
|
+
found: false,
|
|
234
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
99
235
|
};
|
|
100
236
|
}
|
|
101
|
-
return {
|
|
102
|
-
key,
|
|
103
|
-
value: null,
|
|
104
|
-
found: false,
|
|
105
|
-
};
|
|
106
237
|
},
|
|
107
238
|
},
|
|
108
239
|
{
|
|
109
240
|
name: 'memory_search',
|
|
110
|
-
description: '
|
|
241
|
+
description: 'Semantic vector search using HNSW index (150x-12,500x faster than keyword search)',
|
|
111
242
|
category: 'memory',
|
|
112
243
|
inputSchema: {
|
|
113
244
|
type: 'object',
|
|
114
245
|
properties: {
|
|
115
|
-
query: { type: 'string', description: 'Search query' },
|
|
116
|
-
|
|
246
|
+
query: { type: 'string', description: 'Search query (semantic similarity)' },
|
|
247
|
+
namespace: { type: 'string', description: 'Namespace to search (default: "default")' },
|
|
248
|
+
limit: { type: 'number', description: 'Maximum results (default: 10)' },
|
|
249
|
+
threshold: { type: 'number', description: 'Minimum similarity threshold 0-1 (default: 0.3)' },
|
|
117
250
|
},
|
|
118
251
|
required: ['query'],
|
|
119
252
|
},
|
|
120
253
|
handler: async (input) => {
|
|
121
|
-
|
|
122
|
-
const
|
|
254
|
+
await ensureInitialized();
|
|
255
|
+
const { searchEntries } = await getMemoryFunctions();
|
|
256
|
+
const query = input.query;
|
|
257
|
+
const namespace = input.namespace || 'default';
|
|
123
258
|
const limit = input.limit || 10;
|
|
259
|
+
const threshold = input.threshold || 0.3;
|
|
124
260
|
const startTime = performance.now();
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
261
|
+
try {
|
|
262
|
+
const result = await searchEntries({
|
|
263
|
+
query,
|
|
264
|
+
namespace,
|
|
265
|
+
limit,
|
|
266
|
+
threshold,
|
|
267
|
+
});
|
|
268
|
+
const duration = performance.now() - startTime;
|
|
269
|
+
// Parse JSON values in results
|
|
270
|
+
const results = result.results.map(r => {
|
|
271
|
+
let value = r.content;
|
|
272
|
+
try {
|
|
273
|
+
value = JSON.parse(r.content);
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// Keep as string
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
key: r.key,
|
|
280
|
+
namespace: r.namespace,
|
|
281
|
+
value,
|
|
282
|
+
similarity: r.score,
|
|
283
|
+
};
|
|
284
|
+
});
|
|
285
|
+
return {
|
|
286
|
+
query,
|
|
287
|
+
results,
|
|
288
|
+
total: results.length,
|
|
289
|
+
searchTime: `${duration.toFixed(2)}ms`,
|
|
290
|
+
backend: 'HNSW + sql.js',
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
catch (error) {
|
|
294
|
+
return {
|
|
295
|
+
query,
|
|
296
|
+
results: [],
|
|
297
|
+
total: 0,
|
|
298
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
299
|
+
};
|
|
300
|
+
}
|
|
146
301
|
},
|
|
147
302
|
},
|
|
148
303
|
{
|
|
149
304
|
name: 'memory_delete',
|
|
150
|
-
description: 'Delete a memory entry',
|
|
305
|
+
description: 'Delete a memory entry by key',
|
|
151
306
|
category: 'memory',
|
|
152
307
|
inputSchema: {
|
|
153
308
|
type: 'object',
|
|
154
309
|
properties: {
|
|
155
310
|
key: { type: 'string', description: 'Memory key' },
|
|
311
|
+
namespace: { type: 'string', description: 'Namespace (default: "default")' },
|
|
156
312
|
},
|
|
157
313
|
required: ['key'],
|
|
158
314
|
},
|
|
159
315
|
handler: async (input) => {
|
|
160
|
-
|
|
316
|
+
await ensureInitialized();
|
|
317
|
+
const { deleteEntry } = await getMemoryFunctions();
|
|
161
318
|
const key = input.key;
|
|
162
|
-
const
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
319
|
+
const namespace = input.namespace || 'default';
|
|
320
|
+
try {
|
|
321
|
+
const result = await deleteEntry({ key, namespace });
|
|
322
|
+
return {
|
|
323
|
+
success: result.deleted,
|
|
324
|
+
key,
|
|
325
|
+
namespace,
|
|
326
|
+
deleted: result.deleted,
|
|
327
|
+
backend: 'sql.js + HNSW',
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
return {
|
|
332
|
+
success: false,
|
|
333
|
+
key,
|
|
334
|
+
namespace,
|
|
335
|
+
deleted: false,
|
|
336
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
337
|
+
};
|
|
166
338
|
}
|
|
167
|
-
return {
|
|
168
|
-
success: existed,
|
|
169
|
-
key,
|
|
170
|
-
deleted: existed,
|
|
171
|
-
remainingEntries: Object.keys(store.entries).length,
|
|
172
|
-
};
|
|
173
339
|
},
|
|
174
340
|
},
|
|
175
341
|
{
|
|
176
342
|
name: 'memory_list',
|
|
177
|
-
description: 'List
|
|
343
|
+
description: 'List memory entries with optional filtering',
|
|
178
344
|
category: 'memory',
|
|
179
345
|
inputSchema: {
|
|
180
346
|
type: 'object',
|
|
181
347
|
properties: {
|
|
182
|
-
|
|
183
|
-
|
|
348
|
+
namespace: { type: 'string', description: 'Filter by namespace' },
|
|
349
|
+
limit: { type: 'number', description: 'Maximum results (default: 50)' },
|
|
350
|
+
offset: { type: 'number', description: 'Offset for pagination (default: 0)' },
|
|
184
351
|
},
|
|
185
352
|
},
|
|
186
353
|
handler: async (input) => {
|
|
187
|
-
|
|
354
|
+
await ensureInitialized();
|
|
355
|
+
const { listEntries } = await getMemoryFunctions();
|
|
356
|
+
const namespace = input.namespace;
|
|
188
357
|
const limit = input.limit || 50;
|
|
189
358
|
const offset = input.offset || 0;
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
:
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
359
|
+
try {
|
|
360
|
+
const result = await listEntries({
|
|
361
|
+
namespace,
|
|
362
|
+
limit,
|
|
363
|
+
offset,
|
|
364
|
+
});
|
|
365
|
+
const entries = result.entries.map(e => ({
|
|
366
|
+
key: e.key,
|
|
367
|
+
namespace: e.namespace,
|
|
368
|
+
storedAt: e.createdAt,
|
|
369
|
+
updatedAt: e.updatedAt,
|
|
370
|
+
accessCount: e.accessCount,
|
|
371
|
+
hasEmbedding: e.hasEmbedding,
|
|
372
|
+
size: e.size,
|
|
373
|
+
}));
|
|
374
|
+
return {
|
|
375
|
+
entries,
|
|
376
|
+
total: result.total,
|
|
377
|
+
limit,
|
|
378
|
+
offset,
|
|
379
|
+
backend: 'sql.js + HNSW',
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
return {
|
|
384
|
+
entries: [],
|
|
385
|
+
total: 0,
|
|
386
|
+
limit,
|
|
387
|
+
offset,
|
|
388
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
389
|
+
};
|
|
390
|
+
}
|
|
205
391
|
},
|
|
206
392
|
},
|
|
207
393
|
{
|
|
208
394
|
name: 'memory_stats',
|
|
209
|
-
description: 'Get memory storage statistics',
|
|
395
|
+
description: 'Get memory storage statistics including HNSW index status',
|
|
210
396
|
category: 'memory',
|
|
211
397
|
inputSchema: {
|
|
212
398
|
type: 'object',
|
|
213
399
|
properties: {},
|
|
214
400
|
},
|
|
215
401
|
handler: async () => {
|
|
216
|
-
|
|
217
|
-
const
|
|
218
|
-
|
|
402
|
+
await ensureInitialized();
|
|
403
|
+
const { checkMemoryInitialization, listEntries } = await getMemoryFunctions();
|
|
404
|
+
try {
|
|
405
|
+
const status = await checkMemoryInitialization();
|
|
406
|
+
const allEntries = await listEntries({ limit: 100000 });
|
|
407
|
+
// Count by namespace
|
|
408
|
+
const namespaces = {};
|
|
409
|
+
let withEmbeddings = 0;
|
|
410
|
+
for (const entry of allEntries.entries) {
|
|
411
|
+
namespaces[entry.namespace] = (namespaces[entry.namespace] || 0) + 1;
|
|
412
|
+
if (entry.hasEmbedding)
|
|
413
|
+
withEmbeddings++;
|
|
414
|
+
}
|
|
415
|
+
return {
|
|
416
|
+
initialized: status.initialized,
|
|
417
|
+
totalEntries: allEntries.total,
|
|
418
|
+
entriesWithEmbeddings: withEmbeddings,
|
|
419
|
+
embeddingCoverage: allEntries.total > 0
|
|
420
|
+
? `${((withEmbeddings / allEntries.total) * 100).toFixed(1)}%`
|
|
421
|
+
: '0%',
|
|
422
|
+
namespaces,
|
|
423
|
+
backend: 'sql.js + HNSW',
|
|
424
|
+
version: status.version || '3.0.0',
|
|
425
|
+
features: status.features || {
|
|
426
|
+
vectorEmbeddings: true,
|
|
427
|
+
hnswIndex: true,
|
|
428
|
+
semanticSearch: true,
|
|
429
|
+
},
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
catch (error) {
|
|
433
|
+
return {
|
|
434
|
+
initialized: false,
|
|
435
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
},
|
|
439
|
+
},
|
|
440
|
+
{
|
|
441
|
+
name: 'memory_migrate',
|
|
442
|
+
description: 'Manually trigger migration from legacy JSON store to sql.js',
|
|
443
|
+
category: 'memory',
|
|
444
|
+
inputSchema: {
|
|
445
|
+
type: 'object',
|
|
446
|
+
properties: {
|
|
447
|
+
force: { type: 'boolean', description: 'Force re-migration even if already done' },
|
|
448
|
+
},
|
|
449
|
+
},
|
|
450
|
+
handler: async (input) => {
|
|
451
|
+
const force = input.force;
|
|
452
|
+
// Remove migration marker if forcing
|
|
453
|
+
if (force) {
|
|
454
|
+
const markerPath = getMigrationMarkerPath();
|
|
455
|
+
if (existsSync(markerPath)) {
|
|
456
|
+
unlinkSync(markerPath);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
// Check for legacy data
|
|
460
|
+
const legacyStore = loadLegacyStore();
|
|
461
|
+
if (!legacyStore || Object.keys(legacyStore.entries).length === 0) {
|
|
462
|
+
return {
|
|
463
|
+
success: true,
|
|
464
|
+
message: 'No legacy data to migrate',
|
|
465
|
+
migrated: 0,
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
// Run migration via ensureInitialized
|
|
469
|
+
await ensureInitialized();
|
|
219
470
|
return {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
backend: '
|
|
224
|
-
location: getMemoryPath(),
|
|
225
|
-
oldestEntry: entries.length > 0
|
|
226
|
-
? entries.reduce((a, b) => a.storedAt < b.storedAt ? a : b).storedAt
|
|
227
|
-
: null,
|
|
228
|
-
newestEntry: entries.length > 0
|
|
229
|
-
? entries.reduce((a, b) => a.storedAt > b.storedAt ? a : b).storedAt
|
|
230
|
-
: null,
|
|
471
|
+
success: true,
|
|
472
|
+
message: 'Migration completed',
|
|
473
|
+
migrated: Object.keys(legacyStore.entries).length,
|
|
474
|
+
backend: 'sql.js + HNSW',
|
|
231
475
|
};
|
|
232
476
|
},
|
|
233
477
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-tools.js","sourceRoot":"","sources":["../../../src/mcp-tools/memory-tools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory-tools.js","sourceRoot":"","sources":["../../../src/mcp-tools/memory-tools.ts"],"names":[],"mappings":"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"}
|