@aeriondyseti/vector-memory-mcp 0.9.0-dev.8 → 0.9.0-dev.9
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/dist/package.json +1 -1
- package/dist/src/db/memory.repository.d.ts +11 -0
- package/dist/src/db/memory.repository.d.ts.map +1 -1
- package/dist/src/db/memory.repository.js +40 -1
- package/dist/src/db/memory.repository.js.map +1 -1
- package/package.json +1 -1
- package/src/db/memory.repository.ts +48 -1
package/dist/package.json
CHANGED
|
@@ -3,8 +3,19 @@ import { type Memory, type HybridRow } from "../types/memory.js";
|
|
|
3
3
|
export declare class MemoryRepository {
|
|
4
4
|
private db;
|
|
5
5
|
private ftsIndexPromise;
|
|
6
|
+
private migrationPromise;
|
|
6
7
|
constructor(db: lancedb.Connection);
|
|
7
8
|
private getTable;
|
|
9
|
+
/**
|
|
10
|
+
* Ensures schema migration has run. Uses a mutex pattern identical to ensureFtsIndex.
|
|
11
|
+
* Adds columns introduced after the initial schema (usefulness, access_count, last_accessed).
|
|
12
|
+
*/
|
|
13
|
+
private ensureMigration;
|
|
14
|
+
/**
|
|
15
|
+
* Inspects the existing table schema and adds any missing columns with safe defaults.
|
|
16
|
+
* This handles databases created before the hybrid memory system was introduced.
|
|
17
|
+
*/
|
|
18
|
+
private migrateSchemaIfNeeded;
|
|
8
19
|
/**
|
|
9
20
|
* Ensures the FTS index exists on the content column.
|
|
10
21
|
* Uses a mutex pattern to prevent concurrent index creation.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.repository.d.ts","sourceRoot":"","sources":["../../../src/db/memory.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EACL,KAAK,MAAM,EACX,KAAK,SAAS,EAEf,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,gBAAgB;
|
|
1
|
+
{"version":3,"file":"memory.repository.d.ts","sourceRoot":"","sources":["../../../src/db/memory.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAG5C,OAAO,EACL,KAAK,MAAM,EACX,KAAK,SAAS,EAEf,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,gBAAgB;IAQf,OAAO,CAAC,EAAE;IALtB,OAAO,CAAC,eAAe,CAA8B;IAGrD,OAAO,CAAC,gBAAgB,CAA8B;gBAElC,EAAE,EAAE,OAAO,CAAC,UAAU;YAE5B,QAAQ;IAWtB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAavB;;;OAGG;YACW,qBAAqB;IAqBnC;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAiBtB;;;OAGG;YACW,sBAAsB;IAgBpC;;OAEG;IACH,OAAO,CAAC,WAAW;IAwBb,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBrC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBrC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAW5C,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAqB/C;;;;;;;;OAQG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CA2B1F"}
|
|
@@ -6,17 +6,56 @@ export class MemoryRepository {
|
|
|
6
6
|
// Mutex for FTS index creation - ensures only one index creation runs at a time
|
|
7
7
|
// Once set, this promise is never cleared (FTS index persists in the database)
|
|
8
8
|
ftsIndexPromise = null;
|
|
9
|
+
// Mutex for schema migration - runs once per instance to add missing columns
|
|
10
|
+
migrationPromise = null;
|
|
9
11
|
constructor(db) {
|
|
10
12
|
this.db = db;
|
|
11
13
|
}
|
|
12
14
|
async getTable() {
|
|
13
15
|
const names = await this.db.tableNames();
|
|
14
16
|
if (names.includes(TABLE_NAME)) {
|
|
15
|
-
|
|
17
|
+
const table = await this.db.openTable(TABLE_NAME);
|
|
18
|
+
await this.ensureMigration(table);
|
|
19
|
+
return table;
|
|
16
20
|
}
|
|
17
21
|
// Create with empty data to initialize schema
|
|
18
22
|
return await this.db.createTable(TABLE_NAME, [], { schema: memorySchema });
|
|
19
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Ensures schema migration has run. Uses a mutex pattern identical to ensureFtsIndex.
|
|
26
|
+
* Adds columns introduced after the initial schema (usefulness, access_count, last_accessed).
|
|
27
|
+
*/
|
|
28
|
+
ensureMigration(table) {
|
|
29
|
+
if (this.migrationPromise) {
|
|
30
|
+
return this.migrationPromise;
|
|
31
|
+
}
|
|
32
|
+
this.migrationPromise = this.migrateSchemaIfNeeded(table).catch((error) => {
|
|
33
|
+
this.migrationPromise = null;
|
|
34
|
+
throw error;
|
|
35
|
+
});
|
|
36
|
+
return this.migrationPromise;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Inspects the existing table schema and adds any missing columns with safe defaults.
|
|
40
|
+
* This handles databases created before the hybrid memory system was introduced.
|
|
41
|
+
*/
|
|
42
|
+
async migrateSchemaIfNeeded(table) {
|
|
43
|
+
const schema = await table.schema();
|
|
44
|
+
const existingFields = new Set(schema.fields.map((f) => f.name));
|
|
45
|
+
const migrations = [];
|
|
46
|
+
if (!existingFields.has("usefulness")) {
|
|
47
|
+
migrations.push({ name: "usefulness", valueSql: "cast(0.0 as float)" });
|
|
48
|
+
}
|
|
49
|
+
if (!existingFields.has("access_count")) {
|
|
50
|
+
migrations.push({ name: "access_count", valueSql: "cast(0 as int)" });
|
|
51
|
+
}
|
|
52
|
+
if (!existingFields.has("last_accessed")) {
|
|
53
|
+
migrations.push({ name: "last_accessed", valueSql: "cast(NULL as timestamp)" });
|
|
54
|
+
}
|
|
55
|
+
if (migrations.length > 0) {
|
|
56
|
+
await table.addColumns(migrations);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
20
59
|
/**
|
|
21
60
|
* Ensures the FTS index exists on the content column.
|
|
22
61
|
* Uses a mutex pattern to prevent concurrent index creation.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.repository.js","sourceRoot":"","sources":["../../../src/db/memory.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAc,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAGL,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,OAAO,gBAAgB;
|
|
1
|
+
{"version":3,"file":"memory.repository.js","sourceRoot":"","sources":["../../../src/db/memory.repository.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -12,17 +12,64 @@ export class MemoryRepository {
|
|
|
12
12
|
// Once set, this promise is never cleared (FTS index persists in the database)
|
|
13
13
|
private ftsIndexPromise: Promise<void> | null = null;
|
|
14
14
|
|
|
15
|
+
// Mutex for schema migration - runs once per instance to add missing columns
|
|
16
|
+
private migrationPromise: Promise<void> | null = null;
|
|
17
|
+
|
|
15
18
|
constructor(private db: lancedb.Connection) { }
|
|
16
19
|
|
|
17
20
|
private async getTable() {
|
|
18
21
|
const names = await this.db.tableNames();
|
|
19
22
|
if (names.includes(TABLE_NAME)) {
|
|
20
|
-
|
|
23
|
+
const table = await this.db.openTable(TABLE_NAME);
|
|
24
|
+
await this.ensureMigration(table);
|
|
25
|
+
return table;
|
|
21
26
|
}
|
|
22
27
|
// Create with empty data to initialize schema
|
|
23
28
|
return await this.db.createTable(TABLE_NAME, [], { schema: memorySchema });
|
|
24
29
|
}
|
|
25
30
|
|
|
31
|
+
/**
|
|
32
|
+
* Ensures schema migration has run. Uses a mutex pattern identical to ensureFtsIndex.
|
|
33
|
+
* Adds columns introduced after the initial schema (usefulness, access_count, last_accessed).
|
|
34
|
+
*/
|
|
35
|
+
private ensureMigration(table: Table): Promise<void> {
|
|
36
|
+
if (this.migrationPromise) {
|
|
37
|
+
return this.migrationPromise;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
this.migrationPromise = this.migrateSchemaIfNeeded(table).catch((error) => {
|
|
41
|
+
this.migrationPromise = null;
|
|
42
|
+
throw error;
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
return this.migrationPromise;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Inspects the existing table schema and adds any missing columns with safe defaults.
|
|
50
|
+
* This handles databases created before the hybrid memory system was introduced.
|
|
51
|
+
*/
|
|
52
|
+
private async migrateSchemaIfNeeded(table: Table): Promise<void> {
|
|
53
|
+
const schema = await table.schema();
|
|
54
|
+
const existingFields = new Set(schema.fields.map((f) => f.name));
|
|
55
|
+
|
|
56
|
+
const migrations: { name: string; valueSql: string }[] = [];
|
|
57
|
+
|
|
58
|
+
if (!existingFields.has("usefulness")) {
|
|
59
|
+
migrations.push({ name: "usefulness", valueSql: "cast(0.0 as float)" });
|
|
60
|
+
}
|
|
61
|
+
if (!existingFields.has("access_count")) {
|
|
62
|
+
migrations.push({ name: "access_count", valueSql: "cast(0 as int)" });
|
|
63
|
+
}
|
|
64
|
+
if (!existingFields.has("last_accessed")) {
|
|
65
|
+
migrations.push({ name: "last_accessed", valueSql: "cast(NULL as timestamp)" });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (migrations.length > 0) {
|
|
69
|
+
await table.addColumns(migrations);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
26
73
|
/**
|
|
27
74
|
* Ensures the FTS index exists on the content column.
|
|
28
75
|
* Uses a mutex pattern to prevent concurrent index creation.
|