@aeriondyseti/vector-memory-mcp 1.1.0-dev.6 → 2.0.0-rc

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 (106) hide show
  1. package/README.md +22 -4
  2. package/package.json +12 -18
  3. package/scripts/migrate-from-lancedb.ts +56 -0
  4. package/scripts/smoke-test.ts +699 -0
  5. package/scripts/test-runner.ts +11 -1
  6. package/src/db/connection.ts +18 -4
  7. package/src/db/conversation.repository.ts +164 -79
  8. package/src/db/memory.repository.ts +182 -170
  9. package/src/db/migrations.ts +70 -0
  10. package/src/db/sqlite-utils.ts +78 -0
  11. package/src/http/server.ts +40 -35
  12. package/src/index.ts +33 -3
  13. package/src/mcp/server.ts +2 -1
  14. package/src/migration.ts +254 -0
  15. package/dist/package.json +0 -71
  16. package/dist/scripts/test-runner.d.ts +0 -9
  17. package/dist/scripts/test-runner.d.ts.map +0 -1
  18. package/dist/scripts/test-runner.js +0 -61
  19. package/dist/scripts/test-runner.js.map +0 -1
  20. package/dist/scripts/warmup.d.ts +0 -8
  21. package/dist/scripts/warmup.d.ts.map +0 -1
  22. package/dist/scripts/warmup.js +0 -61
  23. package/dist/scripts/warmup.js.map +0 -1
  24. package/dist/src/config/index.d.ts +0 -41
  25. package/dist/src/config/index.d.ts.map +0 -1
  26. package/dist/src/config/index.js +0 -75
  27. package/dist/src/config/index.js.map +0 -1
  28. package/dist/src/db/connection.d.ts +0 -3
  29. package/dist/src/db/connection.d.ts.map +0 -1
  30. package/dist/src/db/connection.js +0 -10
  31. package/dist/src/db/connection.js.map +0 -1
  32. package/dist/src/db/conversation.repository.d.ts +0 -26
  33. package/dist/src/db/conversation.repository.d.ts.map +0 -1
  34. package/dist/src/db/conversation.repository.js +0 -73
  35. package/dist/src/db/conversation.repository.js.map +0 -1
  36. package/dist/src/db/conversation.schema.d.ts +0 -4
  37. package/dist/src/db/conversation.schema.d.ts.map +0 -1
  38. package/dist/src/db/conversation.schema.js +0 -15
  39. package/dist/src/db/conversation.schema.js.map +0 -1
  40. package/dist/src/db/lancedb-utils.d.ts +0 -57
  41. package/dist/src/db/lancedb-utils.d.ts.map +0 -1
  42. package/dist/src/db/lancedb-utils.js +0 -124
  43. package/dist/src/db/lancedb-utils.js.map +0 -1
  44. package/dist/src/db/memory.repository.d.ts +0 -40
  45. package/dist/src/db/memory.repository.d.ts.map +0 -1
  46. package/dist/src/db/memory.repository.js +0 -183
  47. package/dist/src/db/memory.repository.js.map +0 -1
  48. package/dist/src/db/schema.d.ts +0 -7
  49. package/dist/src/db/schema.d.ts.map +0 -1
  50. package/dist/src/db/schema.js +0 -19
  51. package/dist/src/db/schema.js.map +0 -1
  52. package/dist/src/http/mcp-transport.d.ts +0 -19
  53. package/dist/src/http/mcp-transport.d.ts.map +0 -1
  54. package/dist/src/http/mcp-transport.js +0 -191
  55. package/dist/src/http/mcp-transport.js.map +0 -1
  56. package/dist/src/http/server.d.ts +0 -13
  57. package/dist/src/http/server.d.ts.map +0 -1
  58. package/dist/src/http/server.js +0 -224
  59. package/dist/src/http/server.js.map +0 -1
  60. package/dist/src/index.d.ts +0 -3
  61. package/dist/src/index.d.ts.map +0 -1
  62. package/dist/src/index.js +0 -68
  63. package/dist/src/index.js.map +0 -1
  64. package/dist/src/mcp/handlers.d.ts +0 -15
  65. package/dist/src/mcp/handlers.d.ts.map +0 -1
  66. package/dist/src/mcp/handlers.js +0 -313
  67. package/dist/src/mcp/handlers.js.map +0 -1
  68. package/dist/src/mcp/server.d.ts +0 -5
  69. package/dist/src/mcp/server.d.ts.map +0 -1
  70. package/dist/src/mcp/server.js +0 -22
  71. package/dist/src/mcp/server.js.map +0 -1
  72. package/dist/src/mcp/tools.d.ts +0 -13
  73. package/dist/src/mcp/tools.d.ts.map +0 -1
  74. package/dist/src/mcp/tools.js +0 -352
  75. package/dist/src/mcp/tools.js.map +0 -1
  76. package/dist/src/services/conversation.service.d.ts +0 -38
  77. package/dist/src/services/conversation.service.d.ts.map +0 -1
  78. package/dist/src/services/conversation.service.js +0 -252
  79. package/dist/src/services/conversation.service.js.map +0 -1
  80. package/dist/src/services/embeddings.service.d.ts +0 -12
  81. package/dist/src/services/embeddings.service.d.ts.map +0 -1
  82. package/dist/src/services/embeddings.service.js +0 -37
  83. package/dist/src/services/embeddings.service.js.map +0 -1
  84. package/dist/src/services/memory.service.d.ts +0 -40
  85. package/dist/src/services/memory.service.d.ts.map +0 -1
  86. package/dist/src/services/memory.service.js +0 -258
  87. package/dist/src/services/memory.service.js.map +0 -1
  88. package/dist/src/services/parsers/claude-code.parser.d.ts +0 -8
  89. package/dist/src/services/parsers/claude-code.parser.d.ts.map +0 -1
  90. package/dist/src/services/parsers/claude-code.parser.js +0 -191
  91. package/dist/src/services/parsers/claude-code.parser.js.map +0 -1
  92. package/dist/src/services/parsers/types.d.ts +0 -9
  93. package/dist/src/services/parsers/types.d.ts.map +0 -1
  94. package/dist/src/services/parsers/types.js +0 -2
  95. package/dist/src/services/parsers/types.js.map +0 -1
  96. package/dist/src/types/conversation.d.ts +0 -99
  97. package/dist/src/types/conversation.d.ts.map +0 -1
  98. package/dist/src/types/conversation.js +0 -2
  99. package/dist/src/types/conversation.js.map +0 -1
  100. package/dist/src/types/memory.d.ts +0 -30
  101. package/dist/src/types/memory.d.ts.map +0 -1
  102. package/dist/src/types/memory.js +0 -18
  103. package/dist/src/types/memory.js.map +0 -1
  104. package/src/db/conversation.schema.ts +0 -33
  105. package/src/db/lancedb-utils.ts +0 -142
  106. package/src/db/schema.ts +0 -38
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env bun
2
2
 
3
3
  import { loadConfig, parseCliArgs } from "./config/index.js";
4
4
  import { connectToDatabase } from "./db/connection.js";
@@ -8,7 +8,19 @@ import { EmbeddingsService } from "./services/embeddings.service.js";
8
8
  import { MemoryService } from "./services/memory.service.js";
9
9
  import { ConversationHistoryService } from "./services/conversation.service.js";
10
10
  import { startServer } from "./mcp/server.js";
11
- import { startHttpServer } from "./http/server.js";
11
+ import { startHttpServer, removeLockfile } from "./http/server.js";
12
+ import { isLanceDbDirectory, migrate, formatMigrationSummary } from "./migration.js";
13
+
14
+ async function runMigrate(args: string[]): Promise<void> {
15
+ const overrides = parseCliArgs(args.slice(1)); // skip "migrate"
16
+ const config = loadConfig(overrides);
17
+
18
+ const source = config.dbPath;
19
+ const target = source + ".sqlite";
20
+
21
+ const result = await migrate({ source, target });
22
+ console.error(formatMigrationSummary(source, target, result));
23
+ }
12
24
 
13
25
  async function main(): Promise<void> {
14
26
  const args = process.argv.slice(2);
@@ -20,12 +32,29 @@ async function main(): Promise<void> {
20
32
  return;
21
33
  }
22
34
 
35
+ // Check for migrate command
36
+ if (args[0] === "migrate") {
37
+ await runMigrate(args);
38
+ return;
39
+ }
40
+
23
41
  // Parse CLI args and load config
24
42
  const overrides = parseCliArgs(args);
25
43
  const config = loadConfig(overrides);
26
44
 
45
+ // Detect legacy LanceDB data and warn
46
+ if (isLanceDbDirectory(config.dbPath)) {
47
+ console.error(
48
+ `[vector-memory-mcp] ⚠️ Legacy LanceDB data detected at ${config.dbPath}\n` +
49
+ ` Your data must be migrated to the new SQLite format.\n` +
50
+ ` Run: vector-memory-mcp migrate\n` +
51
+ ` Or: bun run src/index.ts migrate\n`
52
+ );
53
+ process.exit(1);
54
+ }
55
+
27
56
  // Initialize database
28
- const db = await connectToDatabase(config.dbPath);
57
+ const db = connectToDatabase(config.dbPath);
29
58
 
30
59
  // Initialize layers
31
60
  const repository = new MemoryRepository(db);
@@ -51,6 +80,7 @@ async function main(): Promise<void> {
51
80
  // Graceful shutdown handler
52
81
  const shutdown = () => {
53
82
  console.error("[vector-memory-mcp] Shutting down...");
83
+ removeLockfile();
54
84
  if (httpStop) httpStop();
55
85
  db.close();
56
86
  process.exit(0);
package/src/mcp/server.ts CHANGED
@@ -8,10 +8,11 @@ import {
8
8
  import { tools } from "./tools.js";
9
9
  import { handleToolCall } from "./handlers.js";
10
10
  import type { MemoryService } from "../services/memory.service.js";
11
+ import { VERSION } from "../config/index.js";
11
12
 
12
13
  export function createServer(memoryService: MemoryService): Server {
13
14
  const server = new Server(
14
- { name: "vector-memory-mcp", version: "0.6.0" },
15
+ { name: "vector-memory-mcp", version: VERSION },
15
16
  { capabilities: { tools: {} } }
16
17
  );
17
18
 
@@ -0,0 +1,254 @@
1
+ /**
2
+ * LanceDB → SQLite (sqlite-vec) migration logic.
3
+ *
4
+ * This module is the shared core used by both the `migrate` subcommand
5
+ * and the standalone `scripts/migrate-from-lancedb.ts` script.
6
+ *
7
+ * @deprecated Will be removed in the next major version once LanceDB
8
+ * support is dropped.
9
+ */
10
+
11
+ import { existsSync, statSync } from "fs";
12
+ import { connectToDatabase } from "./db/connection.js";
13
+ import { serializeVector } from "./db/sqlite-utils.js";
14
+
15
+ // ── Helpers ─────────────────────────────────────────────────────────
16
+
17
+ function toEpochMs(value: unknown): number {
18
+ if (typeof value === "number") return value;
19
+ if (value instanceof Date) return value.getTime();
20
+ if (typeof value === "bigint") return Number(value);
21
+ return Date.now();
22
+ }
23
+
24
+ function toFloatArray(vec: unknown): number[] {
25
+ if (Array.isArray(vec)) return vec;
26
+ if (vec instanceof Float32Array) return Array.from(vec);
27
+ // Arrow Vector objects have a .toArray() method that returns Float32Array
28
+ if (vec && typeof (vec as any).toArray === "function") {
29
+ return Array.from((vec as any).toArray());
30
+ }
31
+ if (ArrayBuffer.isView(vec)) return Array.from(new Float32Array((vec as DataView).buffer));
32
+ return [];
33
+ }
34
+
35
+ // ── Detection ───────────────────────────────────────────────────────
36
+
37
+ /**
38
+ * Check if a path is a LanceDB directory (i.e. needs migration).
39
+ * Returns true if the path exists and is a directory.
40
+ */
41
+ export function isLanceDbDirectory(dbPath: string): boolean {
42
+ return existsSync(dbPath) && statSync(dbPath).isDirectory();
43
+ }
44
+
45
+ // ── Migration ───────────────────────────────────────────────────────
46
+
47
+ export interface MigrateOptions {
48
+ /** Path to the LanceDB directory (source). */
49
+ source: string;
50
+ /** Path to the new SQLite file (target). */
51
+ target: string;
52
+ }
53
+
54
+ export interface MigrateResult {
55
+ memoriesMigrated: number;
56
+ conversationChunksMigrated: number;
57
+ outputSizeMB: string;
58
+ }
59
+
60
+ /**
61
+ * Run the full LanceDB → SQLite migration.
62
+ *
63
+ * Dynamically imports @lancedb/lancedb so the cost is only paid
64
+ * when the migration is actually invoked.
65
+ */
66
+ export async function migrate(opts: MigrateOptions): Promise<MigrateResult> {
67
+ const { source, target } = opts;
68
+
69
+ // Validate source
70
+ if (!existsSync(source)) {
71
+ throw new Error(`Source not found: ${source}`);
72
+ }
73
+ if (!statSync(source).isDirectory()) {
74
+ throw new Error(`Source is not a directory (expected LanceDB): ${source}`);
75
+ }
76
+
77
+ // Prevent overwriting
78
+ if (existsSync(target)) {
79
+ throw new Error(
80
+ `Target already exists: ${target}\n Delete it first or choose a different target path.`
81
+ );
82
+ }
83
+
84
+ console.error(`📂 Source (LanceDB): ${source}`);
85
+ console.error(`📄 Target (SQLite): ${target}`);
86
+ console.error();
87
+
88
+ // Dynamic import — only loads LanceDB when migration is actually run
89
+ const lancedb = await import("@lancedb/lancedb");
90
+
91
+ // Open LanceDB
92
+ const lanceDb = await lancedb.connect(source);
93
+ const tableNames = await lanceDb.tableNames();
94
+ console.error(`Found tables: ${tableNames.join(", ")}`);
95
+
96
+ // Open SQLite (reuses shared connection setup: WAL, sqlite-vec, migrations)
97
+ const sqliteDb = connectToDatabase(target);
98
+
99
+ let memoriesMigrated = 0;
100
+ let conversationChunksMigrated = 0;
101
+
102
+ // ── Migrate memories ────────────────────────────────────────────
103
+ if (tableNames.includes("memories")) {
104
+ const memoriesTable = await lanceDb.openTable("memories");
105
+ const totalMemories = await memoriesTable.countRows();
106
+ console.error(`\n🧠 Migrating ${totalMemories} memories...`);
107
+
108
+ const insertMain = sqliteDb.prepare(
109
+ `INSERT OR REPLACE INTO memories
110
+ (id, content, metadata, created_at, updated_at, superseded_by, usefulness, access_count, last_accessed)
111
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`
112
+ );
113
+ const insertVec = sqliteDb.prepare(
114
+ `INSERT INTO memories_vec (id, vector) VALUES (?, ?)`
115
+ );
116
+ const insertFts = sqliteDb.prepare(
117
+ `INSERT INTO memories_fts (id, content) VALUES (?, ?)`
118
+ );
119
+
120
+ const BATCH_SIZE = 500;
121
+ let offset = 0;
122
+
123
+ while (true) {
124
+ const rows = await memoriesTable.query().limit(BATCH_SIZE).offset(offset).toArray();
125
+ if (rows.length === 0) break;
126
+
127
+ const tx = sqliteDb.transaction(() => {
128
+ for (const row of rows) {
129
+ const vec = toFloatArray(row.vector);
130
+ const createdAt = toEpochMs(row.created_at);
131
+ const updatedAt = toEpochMs(row.updated_at);
132
+ const lastAccessed = row.last_accessed != null ? toEpochMs(row.last_accessed) : null;
133
+
134
+ insertMain.run(
135
+ row.id,
136
+ row.content,
137
+ row.metadata ?? "{}",
138
+ createdAt,
139
+ updatedAt,
140
+ row.superseded_by ?? null,
141
+ row.usefulness ?? 0,
142
+ row.access_count ?? 0,
143
+ lastAccessed,
144
+ );
145
+
146
+ if (vec.length > 0) {
147
+ insertVec.run(row.id, serializeVector(vec));
148
+ }
149
+
150
+ insertFts.run(row.id, row.content);
151
+ }
152
+ });
153
+
154
+ tx();
155
+ memoriesMigrated += rows.length;
156
+ offset += BATCH_SIZE;
157
+
158
+ if (totalMemories > BATCH_SIZE) {
159
+ process.stderr.write(` ${memoriesMigrated}/${totalMemories}\r`);
160
+ }
161
+ }
162
+
163
+ console.error(` ✅ ${memoriesMigrated} memories migrated`);
164
+ }
165
+
166
+ // ── Migrate conversation history ────────────────────────────────
167
+ if (tableNames.includes("conversation_history")) {
168
+ const convTable = await lanceDb.openTable("conversation_history");
169
+ const totalConv = await convTable.countRows();
170
+ console.error(`\n💬 Migrating ${totalConv} conversation chunks...`);
171
+
172
+ const insertMain = sqliteDb.prepare(
173
+ `INSERT OR REPLACE INTO conversation_history
174
+ (id, content, metadata, created_at, session_id, role, message_index_start, message_index_end, project)
175
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`
176
+ );
177
+ const insertVec = sqliteDb.prepare(
178
+ `INSERT INTO conversation_history_vec (id, vector) VALUES (?, ?)`
179
+ );
180
+ const insertFts = sqliteDb.prepare(
181
+ `INSERT INTO conversation_history_fts (id, content) VALUES (?, ?)`
182
+ );
183
+
184
+ const BATCH_SIZE = 500;
185
+ let offset = 0;
186
+
187
+ while (true) {
188
+ const rows = await convTable.query().limit(BATCH_SIZE).offset(offset).toArray();
189
+ if (rows.length === 0) break;
190
+
191
+ const tx = sqliteDb.transaction(() => {
192
+ for (const row of rows) {
193
+ const vec = toFloatArray(row.vector);
194
+ const createdAt = toEpochMs(row.created_at);
195
+
196
+ insertMain.run(
197
+ row.id,
198
+ row.content,
199
+ row.metadata ?? "{}",
200
+ createdAt,
201
+ row.session_id,
202
+ row.role,
203
+ row.message_index_start ?? 0,
204
+ row.message_index_end ?? 0,
205
+ row.project ?? "",
206
+ );
207
+
208
+ if (vec.length > 0) {
209
+ insertVec.run(row.id, serializeVector(vec));
210
+ }
211
+
212
+ insertFts.run(row.id, row.content);
213
+ }
214
+ });
215
+
216
+ tx();
217
+ conversationChunksMigrated += rows.length;
218
+ offset += BATCH_SIZE;
219
+
220
+ if (totalConv > BATCH_SIZE) {
221
+ process.stderr.write(` ${conversationChunksMigrated}/${totalConv}\r`);
222
+ }
223
+ }
224
+
225
+ console.error(` ✅ ${conversationChunksMigrated} conversation chunks migrated`);
226
+ }
227
+
228
+ // ── Finalize ────────────────────────────────────────────────────
229
+ sqliteDb.close();
230
+
231
+ const { size } = statSync(target);
232
+ const outputSizeMB = (size / 1024 / 1024).toFixed(2);
233
+
234
+ return { memoriesMigrated, conversationChunksMigrated, outputSizeMB };
235
+ }
236
+
237
+ /**
238
+ * Format a human-readable summary after migration completes.
239
+ */
240
+ export function formatMigrationSummary(
241
+ source: string,
242
+ target: string,
243
+ result: MigrateResult,
244
+ ): string {
245
+ return `
246
+ ✅ Migration complete! (${result.outputSizeMB} MB)
247
+ ${result.memoriesMigrated} memories, ${result.conversationChunksMigrated} conversation chunks
248
+
249
+ Next steps:
250
+ 1. Backup: mv ${source} ${source}.lance-backup
251
+ 2. Activate: mv ${target} ${source}
252
+ 3. Restart your MCP server
253
+ `;
254
+ }
package/dist/package.json DELETED
@@ -1,71 +0,0 @@
1
- {
2
- "name": "@aeriondyseti/vector-memory-mcp",
3
- "version": "1.1.0-dev.6",
4
- "description": "A zero-configuration RAG memory server for MCP clients",
5
- "type": "module",
6
- "main": "dist/src/index.js",
7
- "bin": {
8
- "vector-memory-mcp": "dist/src/index.js"
9
- },
10
- "files": [
11
- "dist",
12
- "src",
13
- "scripts",
14
- "README.md",
15
- "LICENSE"
16
- ],
17
- "repository": {
18
- "type": "git",
19
- "url": "https://github.com/aeriondyseti/vector-memory-mcp"
20
- },
21
- "author": "AerionDyseti",
22
- "bugs": {
23
- "url": "https://github.com/aeriondyseti/vector-memory-mcp/issues"
24
- },
25
- "homepage": "https://github.com/aeriondyseti/vector-memory-mcp#readme",
26
- "scripts": {
27
- "start": "node dist/src/index.js",
28
- "start:bun": "bun run src/index.ts",
29
- "dev": "bun --watch run src/index.ts",
30
- "build": "tsc",
31
- "prebuild": "rm -rf dist",
32
- "typecheck": "bunx tsc --noEmit",
33
- "test": "bun run scripts/test-runner.ts",
34
- "test:raw": "bun test --preload ./tests/preload.ts",
35
- "test:quick": "bun test",
36
- "test:coverage": "bun test --preload ./tests/preload.ts --coverage",
37
- "benchmark": "bun test tests/benchmark.test.ts --preload ./tests/preload.ts",
38
- "test:preload": "bun run tests/preload.ts",
39
- "warmup": "bun run scripts/warmup.ts",
40
- "postinstall": "bun run scripts/warmup.ts",
41
- "prepublishOnly": "bun run build"
42
- },
43
- "keywords": [
44
- "mcp",
45
- "memory",
46
- "rag",
47
- "embeddings",
48
- "lancedb"
49
- ],
50
- "license": "MIT",
51
- "dependencies": {
52
- "@hono/node-server": "^1.19.9",
53
- "@huggingface/transformers": "^3.8.0",
54
- "@lancedb/lancedb": "^0.22.3",
55
- "@modelcontextprotocol/sdk": "^1.0.0",
56
- "arg": "^5.0.2",
57
- "hono": "^4.11.3"
58
- },
59
- "devDependencies": {
60
- "@types/bun": "latest",
61
- "typescript": "^5.0.0"
62
- },
63
- "trustedDependencies": [
64
- "onnxruntime-node",
65
- "protobufjs",
66
- "sharp"
67
- ],
68
- "overrides": {
69
- "onnxruntime-node": "1.23.2"
70
- }
71
- }
@@ -1,9 +0,0 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * Test runner wrapper that handles Bun's post-test crash gracefully.
4
- *
5
- * Bun crashes during native module cleanup after tests complete successfully.
6
- * This wrapper captures the output, verifies tests passed, and exits cleanly.
7
- */
8
- export {};
9
- //# sourceMappingURL=test-runner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../scripts/test-runner.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
@@ -1,61 +0,0 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * Test runner wrapper that handles Bun's post-test crash gracefully.
4
- *
5
- * Bun crashes during native module cleanup after tests complete successfully.
6
- * This wrapper captures the output, verifies tests passed, and exits cleanly.
7
- */
8
- import { spawn } from "bun";
9
- const proc = spawn(["bun", "test", "--preload", "./tests/preload.ts"], {
10
- stdout: "pipe",
11
- stderr: "pipe",
12
- env: { ...process.env, FORCE_COLOR: "1" },
13
- });
14
- let stdout = "";
15
- let stderr = "";
16
- const decoder = new TextDecoder();
17
- // Stream stdout in real-time
18
- const stdoutReader = proc.stdout.getReader();
19
- (async () => {
20
- while (true) {
21
- const { done, value } = await stdoutReader.read();
22
- if (done)
23
- break;
24
- const text = decoder.decode(value);
25
- stdout += text;
26
- process.stdout.write(text);
27
- }
28
- })();
29
- // Stream stderr in real-time
30
- const stderrReader = proc.stderr.getReader();
31
- (async () => {
32
- while (true) {
33
- const { done, value } = await stderrReader.read();
34
- if (done)
35
- break;
36
- const text = decoder.decode(value);
37
- stderr += text;
38
- process.stderr.write(text);
39
- }
40
- })();
41
- await proc.exited;
42
- // Check if tests actually passed by looking for the summary line
43
- const output = stdout + stderr;
44
- const passMatch = output.match(/(\d+) pass/);
45
- const failMatch = output.match(/(\d+) fail/);
46
- const passed = passMatch ? parseInt(passMatch[1], 10) : 0;
47
- const failed = failMatch ? parseInt(failMatch[1], 10) : 0;
48
- // Exit based on test results, not Bun's crash
49
- if (failed > 0) {
50
- console.error(`\n❌ ${failed} test(s) failed`);
51
- process.exit(1);
52
- }
53
- else if (passed > 0) {
54
- console.log(`\n✅ All ${passed} tests passed (ignoring Bun cleanup crash)`);
55
- process.exit(0);
56
- }
57
- else {
58
- console.error("\n⚠️ Could not determine test results");
59
- process.exit(1);
60
- }
61
- //# sourceMappingURL=test-runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-runner.js","sourceRoot":"","sources":["../../scripts/test-runner.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC;AAE5B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,oBAAoB,CAAC,EAAE;IACrE,MAAM,EAAE,MAAM;IACd,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE;CAC1C,CAAC,CAAC;AAEH,IAAI,MAAM,GAAG,EAAE,CAAC;AAChB,IAAI,MAAM,GAAG,EAAE,CAAC;AAEhB,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAElC,6BAA6B;AAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;AAC7C,CAAC,KAAK,IAAI,EAAE;IACV,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,IAAI;YAAE,MAAM;QAChB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,IAAI,IAAI,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,6BAA6B;AAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;AAC7C,CAAC,KAAK,IAAI,EAAE;IACV,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,IAAI;YAAE,MAAM;QAChB,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,IAAI,IAAI,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,MAAM,IAAI,CAAC,MAAM,CAAC;AAElB,iEAAiE;AACjE,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AAE7C,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE1D,8CAA8C;AAC9C,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,OAAO,MAAM,iBAAiB,CAAC,CAAC;IAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;KAAM,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,WAAW,MAAM,4CAA4C,CAAC,CAAC;IAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;KAAM,CAAC;IACN,OAAO,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * Warmup script to pre-download ML models and verify dependencies
4
- * This runs during installation to ensure everything is ready to use
5
- */
6
- declare function warmup(): Promise<void>;
7
- export { warmup };
8
- //# sourceMappingURL=warmup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"warmup.d.ts","sourceRoot":"","sources":["../../scripts/warmup.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAKH,iBAAe,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAsDrC;AAOD,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -1,61 +0,0 @@
1
- #!/usr/bin/env bun
2
- /**
3
- * Warmup script to pre-download ML models and verify dependencies
4
- * This runs during installation to ensure everything is ready to use
5
- */
6
- import { config } from "../src/config/index.js";
7
- import { EmbeddingsService } from "../src/services/embeddings.service.js";
8
- async function warmup() {
9
- console.log("🔥 Warming up vector-memory-mcp...");
10
- console.log();
11
- try {
12
- // Check native dependencies
13
- console.log("✓ Checking native dependencies...");
14
- try {
15
- await import("onnxruntime-node");
16
- console.log(" ✓ onnxruntime-node loaded");
17
- }
18
- catch (e) {
19
- console.error(" ✗ onnxruntime-node failed:", e.message);
20
- process.exit(1);
21
- }
22
- try {
23
- await import("sharp");
24
- console.log(" ✓ sharp loaded");
25
- }
26
- catch (e) {
27
- console.error(" ✗ sharp failed:", e.message);
28
- process.exit(1);
29
- }
30
- console.log();
31
- // Initialize embeddings service to download model
32
- console.log("📥 Downloading ML model (this may take a minute)...");
33
- console.log(` Model: ${config.embeddingModel}`);
34
- console.log(` Cache: ~/.cache/huggingface/`);
35
- console.log();
36
- const embeddings = new EmbeddingsService(config.embeddingModel, config.embeddingDimension);
37
- // Trigger model download by generating a test embedding
38
- const startTime = Date.now();
39
- await embeddings.embed("warmup test");
40
- const duration = ((Date.now() - startTime) / 1000).toFixed(2);
41
- console.log();
42
- console.log(`✅ Warmup complete! (${duration}s)`);
43
- console.log();
44
- console.log("Ready to use! Configure your MCP client and restart to get started.");
45
- console.log();
46
- }
47
- catch (error) {
48
- console.error();
49
- console.error("❌ Warmup failed:", error);
50
- console.error();
51
- console.error("This is not a critical error - the server will download models on first run.");
52
- console.error("You can try running 'vector-memory-mcp warmup' manually later.");
53
- process.exit(0); // Exit successfully to not block installation
54
- }
55
- }
56
- // Only run if this is the main module
57
- if (import.meta.url === `file://${process.argv[1]}`) {
58
- warmup();
59
- }
60
- export { warmup };
61
- //# sourceMappingURL=warmup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"warmup.js","sourceRoot":"","sources":["../../scripts/warmup.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,KAAK,UAAU,MAAM;IACnB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,IAAI,CAAC;QACH,4BAA4B;QAC5B,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;YACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAG,CAAW,CAAC,OAAO,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,kDAAkD;QAClD,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,EAAE,CAAC;QAEd,MAAM,UAAU,GAAG,IAAI,iBAAiB,CACtC,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,kBAAkB,CAC1B,CAAC;QAEF,wDAAwD;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAE9D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,IAAI,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;QACnF,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,KAAK,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAC;QAC9F,OAAO,CAAC,KAAK,CAAC,gEAAgE,CAAC,CAAC;QAChF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,8CAA8C;IACjE,CAAC;AACH,CAAC;AAED,sCAAsC;AACtC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,UAAU,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACpD,MAAM,EAAE,CAAC;AACX,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -1,41 +0,0 @@
1
- export declare const VERSION: string;
2
- export type TransportMode = "stdio" | "http" | "both";
3
- export interface ConversationHistoryConfig {
4
- enabled: boolean;
5
- sessionLogPath: string | null;
6
- historyWeight: number;
7
- chunkOverlap: number;
8
- maxChunkMessages: number;
9
- indexSubagents: boolean;
10
- }
11
- export interface Config {
12
- dbPath: string;
13
- embeddingModel: string;
14
- embeddingDimension: number;
15
- httpPort: number;
16
- httpHost: string;
17
- enableHttp: boolean;
18
- transportMode: TransportMode;
19
- conversationHistory: ConversationHistoryConfig;
20
- }
21
- export interface ConfigOverrides {
22
- dbPath?: string;
23
- httpPort?: number;
24
- enableHttp?: boolean;
25
- transportMode?: TransportMode;
26
- enableHistory?: boolean;
27
- historyPath?: string;
28
- historyWeight?: number;
29
- }
30
- export declare function loadConfig(overrides?: ConfigOverrides): Config;
31
- /**
32
- * Parse CLI arguments into config overrides.
33
- */
34
- export declare function parseCliArgs(argv: string[]): ConfigOverrides;
35
- /**
36
- * Resolve the session log path for conversation history indexing.
37
- * Returns the configured path, or auto-detects Claude Code's session directory.
38
- */
39
- export declare function resolveSessionLogPath(config: ConversationHistoryConfig): string;
40
- export declare const config: Config;
41
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,OAAO,QAAsB,CAAC;AAE3C,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,aAAa,CAAC;IAC7B,mBAAmB,EAAE,yBAAyB,CAAC;CAChD;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,UAAU,CAAC,SAAS,GAAE,eAAoB,GAAG,MAAM,CAsBlE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,CAyB5D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,yBAAyB,GAAG,MAAM,CAO/E;AAGD,eAAO,MAAM,MAAM,QAAe,CAAC"}