@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.
- package/README.md +22 -4
- package/package.json +12 -18
- package/scripts/migrate-from-lancedb.ts +56 -0
- package/scripts/smoke-test.ts +699 -0
- package/scripts/test-runner.ts +11 -1
- package/src/db/connection.ts +18 -4
- package/src/db/conversation.repository.ts +164 -79
- package/src/db/memory.repository.ts +182 -170
- package/src/db/migrations.ts +70 -0
- package/src/db/sqlite-utils.ts +78 -0
- package/src/http/server.ts +40 -35
- package/src/index.ts +33 -3
- package/src/mcp/server.ts +2 -1
- package/src/migration.ts +254 -0
- package/dist/package.json +0 -71
- package/dist/scripts/test-runner.d.ts +0 -9
- package/dist/scripts/test-runner.d.ts.map +0 -1
- package/dist/scripts/test-runner.js +0 -61
- package/dist/scripts/test-runner.js.map +0 -1
- package/dist/scripts/warmup.d.ts +0 -8
- package/dist/scripts/warmup.d.ts.map +0 -1
- package/dist/scripts/warmup.js +0 -61
- package/dist/scripts/warmup.js.map +0 -1
- package/dist/src/config/index.d.ts +0 -41
- package/dist/src/config/index.d.ts.map +0 -1
- package/dist/src/config/index.js +0 -75
- package/dist/src/config/index.js.map +0 -1
- package/dist/src/db/connection.d.ts +0 -3
- package/dist/src/db/connection.d.ts.map +0 -1
- package/dist/src/db/connection.js +0 -10
- package/dist/src/db/connection.js.map +0 -1
- package/dist/src/db/conversation.repository.d.ts +0 -26
- package/dist/src/db/conversation.repository.d.ts.map +0 -1
- package/dist/src/db/conversation.repository.js +0 -73
- package/dist/src/db/conversation.repository.js.map +0 -1
- package/dist/src/db/conversation.schema.d.ts +0 -4
- package/dist/src/db/conversation.schema.d.ts.map +0 -1
- package/dist/src/db/conversation.schema.js +0 -15
- package/dist/src/db/conversation.schema.js.map +0 -1
- package/dist/src/db/lancedb-utils.d.ts +0 -57
- package/dist/src/db/lancedb-utils.d.ts.map +0 -1
- package/dist/src/db/lancedb-utils.js +0 -124
- package/dist/src/db/lancedb-utils.js.map +0 -1
- package/dist/src/db/memory.repository.d.ts +0 -40
- package/dist/src/db/memory.repository.d.ts.map +0 -1
- package/dist/src/db/memory.repository.js +0 -183
- package/dist/src/db/memory.repository.js.map +0 -1
- package/dist/src/db/schema.d.ts +0 -7
- package/dist/src/db/schema.d.ts.map +0 -1
- package/dist/src/db/schema.js +0 -19
- package/dist/src/db/schema.js.map +0 -1
- package/dist/src/http/mcp-transport.d.ts +0 -19
- package/dist/src/http/mcp-transport.d.ts.map +0 -1
- package/dist/src/http/mcp-transport.js +0 -191
- package/dist/src/http/mcp-transport.js.map +0 -1
- package/dist/src/http/server.d.ts +0 -13
- package/dist/src/http/server.d.ts.map +0 -1
- package/dist/src/http/server.js +0 -224
- package/dist/src/http/server.js.map +0 -1
- package/dist/src/index.d.ts +0 -3
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -68
- package/dist/src/index.js.map +0 -1
- package/dist/src/mcp/handlers.d.ts +0 -15
- package/dist/src/mcp/handlers.d.ts.map +0 -1
- package/dist/src/mcp/handlers.js +0 -313
- package/dist/src/mcp/handlers.js.map +0 -1
- package/dist/src/mcp/server.d.ts +0 -5
- package/dist/src/mcp/server.d.ts.map +0 -1
- package/dist/src/mcp/server.js +0 -22
- package/dist/src/mcp/server.js.map +0 -1
- package/dist/src/mcp/tools.d.ts +0 -13
- package/dist/src/mcp/tools.d.ts.map +0 -1
- package/dist/src/mcp/tools.js +0 -352
- package/dist/src/mcp/tools.js.map +0 -1
- package/dist/src/services/conversation.service.d.ts +0 -38
- package/dist/src/services/conversation.service.d.ts.map +0 -1
- package/dist/src/services/conversation.service.js +0 -252
- package/dist/src/services/conversation.service.js.map +0 -1
- package/dist/src/services/embeddings.service.d.ts +0 -12
- package/dist/src/services/embeddings.service.d.ts.map +0 -1
- package/dist/src/services/embeddings.service.js +0 -37
- package/dist/src/services/embeddings.service.js.map +0 -1
- package/dist/src/services/memory.service.d.ts +0 -40
- package/dist/src/services/memory.service.d.ts.map +0 -1
- package/dist/src/services/memory.service.js +0 -258
- package/dist/src/services/memory.service.js.map +0 -1
- package/dist/src/services/parsers/claude-code.parser.d.ts +0 -8
- package/dist/src/services/parsers/claude-code.parser.d.ts.map +0 -1
- package/dist/src/services/parsers/claude-code.parser.js +0 -191
- package/dist/src/services/parsers/claude-code.parser.js.map +0 -1
- package/dist/src/services/parsers/types.d.ts +0 -9
- package/dist/src/services/parsers/types.d.ts.map +0 -1
- package/dist/src/services/parsers/types.js +0 -2
- package/dist/src/services/parsers/types.js.map +0 -1
- package/dist/src/types/conversation.d.ts +0 -99
- package/dist/src/types/conversation.d.ts.map +0 -1
- package/dist/src/types/conversation.js +0 -2
- package/dist/src/types/conversation.js.map +0 -1
- package/dist/src/types/memory.d.ts +0 -30
- package/dist/src/types/memory.d.ts.map +0 -1
- package/dist/src/types/memory.js +0 -18
- package/dist/src/types/memory.js.map +0 -1
- package/src/db/conversation.schema.ts +0 -33
- package/src/db/lancedb-utils.ts +0 -142
- package/src/db/schema.ts +0 -38
package/src/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
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 =
|
|
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:
|
|
15
|
+
{ name: "vector-memory-mcp", version: VERSION },
|
|
15
16
|
{ capabilities: { tools: {} } }
|
|
16
17
|
);
|
|
17
18
|
|
package/src/migration.ts
ADDED
|
@@ -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"}
|
package/dist/scripts/warmup.d.ts
DELETED
|
@@ -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"}
|
package/dist/scripts/warmup.js
DELETED
|
@@ -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"}
|