@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/dist/src/config/index.js
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import arg from "arg";
|
|
2
|
-
import { homedir } from "os";
|
|
3
|
-
import { isAbsolute, join } from "path";
|
|
4
|
-
import packageJson from "../../package.json" with { type: "json" };
|
|
5
|
-
export const VERSION = packageJson.version;
|
|
6
|
-
// Defaults - always use repo-local .vector-memory folder
|
|
7
|
-
const DEFAULT_DB_PATH = join(process.cwd(), ".vector-memory", "memories.db");
|
|
8
|
-
const DEFAULT_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
|
|
9
|
-
const DEFAULT_EMBEDDING_DIMENSION = 384;
|
|
10
|
-
const DEFAULT_HTTP_PORT = 3271;
|
|
11
|
-
const DEFAULT_HTTP_HOST = "127.0.0.1";
|
|
12
|
-
function resolvePath(path) {
|
|
13
|
-
return isAbsolute(path) ? path : join(process.cwd(), path);
|
|
14
|
-
}
|
|
15
|
-
export function loadConfig(overrides = {}) {
|
|
16
|
-
const transportMode = overrides.transportMode ?? "stdio";
|
|
17
|
-
// HTTP enabled by default (needed for hooks), can disable with --no-http
|
|
18
|
-
const enableHttp = overrides.enableHttp ?? true;
|
|
19
|
-
return {
|
|
20
|
-
dbPath: resolvePath(overrides.dbPath ?? DEFAULT_DB_PATH),
|
|
21
|
-
embeddingModel: DEFAULT_EMBEDDING_MODEL,
|
|
22
|
-
embeddingDimension: DEFAULT_EMBEDDING_DIMENSION,
|
|
23
|
-
httpPort: overrides.httpPort ?? DEFAULT_HTTP_PORT,
|
|
24
|
-
httpHost: DEFAULT_HTTP_HOST,
|
|
25
|
-
enableHttp,
|
|
26
|
-
transportMode,
|
|
27
|
-
conversationHistory: {
|
|
28
|
-
enabled: overrides.enableHistory ?? false,
|
|
29
|
-
sessionLogPath: overrides.historyPath ?? null,
|
|
30
|
-
historyWeight: overrides.historyWeight ?? 0.75,
|
|
31
|
-
chunkOverlap: 1,
|
|
32
|
-
maxChunkMessages: 10,
|
|
33
|
-
indexSubagents: false,
|
|
34
|
-
},
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Parse CLI arguments into config overrides.
|
|
39
|
-
*/
|
|
40
|
-
export function parseCliArgs(argv) {
|
|
41
|
-
const args = arg({
|
|
42
|
-
"--db-file": String,
|
|
43
|
-
"--port": Number,
|
|
44
|
-
"--no-http": Boolean,
|
|
45
|
-
"--enable-history": Boolean,
|
|
46
|
-
"--history-path": String,
|
|
47
|
-
"--history-weight": Number,
|
|
48
|
-
// Aliases
|
|
49
|
-
"-d": "--db-file",
|
|
50
|
-
"-p": "--port",
|
|
51
|
-
}, { argv, permissive: true });
|
|
52
|
-
return {
|
|
53
|
-
dbPath: args["--db-file"],
|
|
54
|
-
httpPort: args["--port"],
|
|
55
|
-
enableHttp: args["--no-http"] ? false : undefined,
|
|
56
|
-
enableHistory: args["--enable-history"] ?? undefined,
|
|
57
|
-
historyPath: args["--history-path"],
|
|
58
|
-
historyWeight: args["--history-weight"],
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Resolve the session log path for conversation history indexing.
|
|
63
|
-
* Returns the configured path, or auto-detects Claude Code's session directory.
|
|
64
|
-
*/
|
|
65
|
-
export function resolveSessionLogPath(config) {
|
|
66
|
-
if (config.sessionLogPath) {
|
|
67
|
-
return resolvePath(config.sessionLogPath);
|
|
68
|
-
}
|
|
69
|
-
// Auto-detect Claude Code session log directory
|
|
70
|
-
const claudeProjectsDir = join(homedir(), ".claude", "projects");
|
|
71
|
-
return claudeProjectsDir;
|
|
72
|
-
}
|
|
73
|
-
// Default config for imports that don't use CLI args
|
|
74
|
-
export const config = loadConfig();
|
|
75
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/config/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../../src/db/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAI5C,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAMnF"}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import * as lancedb from "@lancedb/lancedb";
|
|
2
|
-
import { mkdirSync } from "fs";
|
|
3
|
-
import { dirname } from "path";
|
|
4
|
-
export async function connectToDatabase(dbPath) {
|
|
5
|
-
// Ensure directory exists
|
|
6
|
-
mkdirSync(dirname(dbPath), { recursive: true });
|
|
7
|
-
const db = await lancedb.connect(dbPath);
|
|
8
|
-
return db;
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=connection.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../../../src/db/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,0BAA0B;IAC1B,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import * as lancedb from "@lancedb/lancedb";
|
|
2
|
-
import type { ConversationHybridRow, HistoryFilters } from "../types/conversation.js";
|
|
3
|
-
export declare class ConversationRepository {
|
|
4
|
-
private db;
|
|
5
|
-
private tablePromise;
|
|
6
|
-
private ensureFtsIndex;
|
|
7
|
-
private getReranker;
|
|
8
|
-
constructor(db: lancedb.Connection);
|
|
9
|
-
private getTable;
|
|
10
|
-
private rowToConversationHybridRow;
|
|
11
|
-
insertBatch(rows: Array<{
|
|
12
|
-
id: string;
|
|
13
|
-
vector: number[];
|
|
14
|
-
content: string;
|
|
15
|
-
metadata: string;
|
|
16
|
-
created_at: number;
|
|
17
|
-
session_id: string;
|
|
18
|
-
role: string;
|
|
19
|
-
message_index_start: number;
|
|
20
|
-
message_index_end: number;
|
|
21
|
-
project: string;
|
|
22
|
-
}>): Promise<void>;
|
|
23
|
-
deleteBySessionId(sessionId: string): Promise<void>;
|
|
24
|
-
findHybrid(embedding: number[], query: string, limit: number, filters?: HistoryFilters): Promise<ConversationHybridRow[]>;
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=conversation.repository.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.repository.d.ts","sourceRoot":"","sources":["../../../src/db/conversation.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAO5C,OAAO,KAAK,EACV,qBAAqB,EACrB,cAAc,EACf,MAAM,0BAA0B,CAAC;AASlC,qBAAa,sBAAsB;IASrB,OAAO,CAAC,EAAE;IARtB,OAAO,CAAC,YAAY,CAA+B;IAGnD,OAAO,CAAC,cAAc,CAAyC;IAG/D,OAAO,CAAC,WAAW,CAAyB;gBAExB,EAAE,EAAE,OAAO,CAAC,UAAU;IAE1C,OAAO,CAAC,QAAQ;IAchB,OAAO,CAAC,0BAA0B;IAa5B,WAAW,CACf,IAAI,EAAE,KAAK,CAAC;QACV,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,mBAAmB,EAAE,MAAM,CAAC;QAC5B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,GACD,OAAO,CAAC,IAAI,CAAC;IAQV,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,UAAU,CACd,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,qBAAqB,EAAE,CAAC;CA+BpC"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { CONVERSATION_TABLE_NAME, conversationSchema, } from "./conversation.schema.js";
|
|
2
|
-
import { arrowTimestampToDate } from "./lancedb-utils.js";
|
|
3
|
-
import { getOrCreateTable, createFtsMutex, createRerankerMutex, escapeSql, safeParseJsonObject, } from "./lancedb-utils.js";
|
|
4
|
-
export class ConversationRepository {
|
|
5
|
-
db;
|
|
6
|
-
tablePromise = null;
|
|
7
|
-
// FTS index mutex — recreated after data mutations to force re-check
|
|
8
|
-
ensureFtsIndex = createFtsMutex(() => this.getTable());
|
|
9
|
-
// Cached reranker — k=60 is constant, no need to recreate per search
|
|
10
|
-
getReranker = createRerankerMutex();
|
|
11
|
-
constructor(db) {
|
|
12
|
-
this.db = db;
|
|
13
|
-
}
|
|
14
|
-
getTable() {
|
|
15
|
-
if (!this.tablePromise) {
|
|
16
|
-
this.tablePromise = getOrCreateTable(this.db, CONVERSATION_TABLE_NAME, conversationSchema).catch((err) => {
|
|
17
|
-
this.tablePromise = null;
|
|
18
|
-
throw err;
|
|
19
|
-
});
|
|
20
|
-
}
|
|
21
|
-
return this.tablePromise;
|
|
22
|
-
}
|
|
23
|
-
rowToConversationHybridRow(row) {
|
|
24
|
-
const metadata = safeParseJsonObject(row.metadata);
|
|
25
|
-
return {
|
|
26
|
-
id: row.id,
|
|
27
|
-
content: row.content,
|
|
28
|
-
metadata,
|
|
29
|
-
createdAt: arrowTimestampToDate(row.created_at),
|
|
30
|
-
rrfScore: row._relevance_score ?? 0,
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
async insertBatch(rows) {
|
|
34
|
-
if (rows.length === 0)
|
|
35
|
-
return;
|
|
36
|
-
const table = await this.getTable();
|
|
37
|
-
await table.add(rows);
|
|
38
|
-
// Reset FTS mutex so index existence is re-verified after new data
|
|
39
|
-
this.ensureFtsIndex = createFtsMutex(() => this.getTable());
|
|
40
|
-
}
|
|
41
|
-
async deleteBySessionId(sessionId) {
|
|
42
|
-
const table = await this.getTable();
|
|
43
|
-
await table.delete(`session_id = '${escapeSql(sessionId)}'`);
|
|
44
|
-
this.ensureFtsIndex = createFtsMutex(() => this.getTable());
|
|
45
|
-
}
|
|
46
|
-
async findHybrid(embedding, query, limit, filters) {
|
|
47
|
-
await this.ensureFtsIndex();
|
|
48
|
-
const table = await this.getTable();
|
|
49
|
-
const reranker = await this.getReranker();
|
|
50
|
-
let queryBuilder = table
|
|
51
|
-
.query()
|
|
52
|
-
.nearestTo(embedding)
|
|
53
|
-
.fullTextSearch(query)
|
|
54
|
-
.rerank(reranker);
|
|
55
|
-
const conditions = [];
|
|
56
|
-
if (filters?.sessionId)
|
|
57
|
-
conditions.push(`session_id = '${escapeSql(filters.sessionId)}'`);
|
|
58
|
-
if (filters?.role)
|
|
59
|
-
conditions.push(`role = '${escapeSql(filters.role)}'`);
|
|
60
|
-
if (filters?.project)
|
|
61
|
-
conditions.push(`project = '${escapeSql(filters.project)}'`);
|
|
62
|
-
if (filters?.after)
|
|
63
|
-
conditions.push(`created_at > ${filters.after.getTime()}`);
|
|
64
|
-
if (filters?.before)
|
|
65
|
-
conditions.push(`created_at < ${filters.before.getTime()}`);
|
|
66
|
-
if (conditions.length > 0) {
|
|
67
|
-
queryBuilder = queryBuilder.where(conditions.join(" AND "));
|
|
68
|
-
}
|
|
69
|
-
const results = await queryBuilder.limit(limit).toArray();
|
|
70
|
-
return results.map((row) => this.rowToConversationHybridRow(row));
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=conversation.repository.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.repository.js","sourceRoot":"","sources":["../../../src/db/conversation.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.schema.d.ts","sourceRoot":"","sources":["../../../src/db/conversation.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAQP,MAAM,cAAc,CAAC;AAEtB,eAAO,MAAM,uBAAuB,yBAAyB,CAAC;AAE9D,eAAO,MAAM,kBAAkB,aAmB7B,CAAC"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { Schema, Field, FixedSizeList, Float32, Utf8, Timestamp, TimeUnit, Int32, } from "apache-arrow";
|
|
2
|
-
export const CONVERSATION_TABLE_NAME = "conversation_history";
|
|
3
|
-
export const conversationSchema = new Schema([
|
|
4
|
-
new Field("id", new Utf8(), false),
|
|
5
|
-
new Field("vector", new FixedSizeList(384, new Field("item", new Float32(), false)), false),
|
|
6
|
-
new Field("content", new Utf8(), false),
|
|
7
|
-
new Field("metadata", new Utf8(), false), // JSON string
|
|
8
|
-
new Field("created_at", new Timestamp(TimeUnit.MILLISECOND, "UTC"), false),
|
|
9
|
-
new Field("session_id", new Utf8(), false),
|
|
10
|
-
new Field("role", new Utf8(), false),
|
|
11
|
-
new Field("message_index_start", new Int32(), false),
|
|
12
|
-
new Field("message_index_end", new Int32(), false),
|
|
13
|
-
new Field("project", new Utf8(), false),
|
|
14
|
-
]);
|
|
15
|
-
//# sourceMappingURL=conversation.schema.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conversation.schema.js","sourceRoot":"","sources":["../../../src/db/conversation.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,EACL,aAAa,EACb,OAAO,EACP,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,KAAK,GACN,MAAM,cAAc,CAAC;AAEtB,MAAM,CAAC,MAAM,uBAAuB,GAAG,sBAAsB,CAAC;AAE9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,MAAM,CAAC;IAC3C,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC;IAClC,IAAI,KAAK,CACP,QAAQ,EACR,IAAI,aAAa,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,EAC/D,KAAK,CACN;IACD,IAAI,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC;IACvC,IAAI,KAAK,CAAC,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC,EAAE,cAAc;IACxD,IAAI,KAAK,CACP,YAAY,EACZ,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC,EAC1C,KAAK,CACN;IACD,IAAI,KAAK,CAAC,YAAY,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC;IAC1C,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC;IACpC,IAAI,KAAK,CAAC,qBAAqB,EAAE,IAAI,KAAK,EAAE,EAAE,KAAK,CAAC;IACpD,IAAI,KAAK,CAAC,mBAAmB,EAAE,IAAI,KAAK,EAAE,EAAE,KAAK,CAAC;IAClD,IAAI,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,KAAK,CAAC;CACxC,CAAC,CAAC"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import * as lancedb from "@lancedb/lancedb";
|
|
2
|
-
import { rerankers, type Table } from "@lancedb/lancedb";
|
|
3
|
-
import type { Schema } from "apache-arrow";
|
|
4
|
-
/**
|
|
5
|
-
* Escape a string value for safe interpolation into LanceDB/DataFusion SQL WHERE clauses.
|
|
6
|
-
*
|
|
7
|
-
* DataFusion uses ANSI SQL string literal rules:
|
|
8
|
-
* - String literals are delimited by single quotes
|
|
9
|
-
* - Single quotes within strings are escaped by doubling: ' -> ''
|
|
10
|
-
* - Backslashes are NOT escape characters (treated literally)
|
|
11
|
-
*/
|
|
12
|
-
export declare function escapeSql(value: string): string;
|
|
13
|
-
/** Default k parameter for Reciprocal Rank Fusion reranking. */
|
|
14
|
-
export declare const RRF_K = 60;
|
|
15
|
-
/**
|
|
16
|
-
* Converts LanceDB's Arrow Vector type to a plain number[].
|
|
17
|
-
* LanceDB returns an Arrow Vector object which is iterable but not an array.
|
|
18
|
-
*/
|
|
19
|
-
export declare function arrowVectorToArray(value: unknown): number[];
|
|
20
|
-
/**
|
|
21
|
-
* Converts an Arrow Timestamp value to a JavaScript Date.
|
|
22
|
-
*
|
|
23
|
-
* LanceDB/Arrow can return timestamp column values as:
|
|
24
|
-
* - number (most common: raw int64 ms since epoch, fits in JS float64)
|
|
25
|
-
* - BigInt (large int64 values that overflow float64 — rare for timestamps)
|
|
26
|
-
* - Date (hypothetical: some future Arrow-JS build may decode for us)
|
|
27
|
-
*
|
|
28
|
-
* Doing `new Date(row.ts as number)` is a TypeScript lie that silently breaks
|
|
29
|
-
* when Arrow returns a BigInt. This helper handles all three cases safely.
|
|
30
|
-
*/
|
|
31
|
-
export declare function arrowTimestampToDate(value: unknown): Date;
|
|
32
|
-
/**
|
|
33
|
-
* Safely parse a JSON string into an object, returning an empty object on failure.
|
|
34
|
-
*/
|
|
35
|
-
export declare function safeParseJsonObject(raw: string): Record<string, unknown>;
|
|
36
|
-
/**
|
|
37
|
-
* Opens an existing table or creates it with the given schema.
|
|
38
|
-
* Does NOT cache — callers should cache the returned Table if desired.
|
|
39
|
-
*/
|
|
40
|
-
export declare function getOrCreateTable(db: lancedb.Connection, name: string, schema: Schema): Promise<Table>;
|
|
41
|
-
/**
|
|
42
|
-
* Creates a mutex-guarded function that ensures an FTS index exists on a table's content column.
|
|
43
|
-
*
|
|
44
|
-
* Once the FTS index is confirmed/created, the promise is retained for the lifetime of the
|
|
45
|
-
* caller — the index persists in LanceDB, so re-checking is unnecessary. On error, the
|
|
46
|
-
* mutex resets so the next call can retry.
|
|
47
|
-
*
|
|
48
|
-
* The key design constraint: the promise must be captured synchronously (before any await)
|
|
49
|
-
* to prevent concurrent callers from racing past the guard.
|
|
50
|
-
*/
|
|
51
|
-
export declare function createFtsMutex(getTable: () => Promise<Table>): () => Promise<void>;
|
|
52
|
-
/**
|
|
53
|
-
* Creates a promise-mutex for RRFReranker instantiation.
|
|
54
|
-
* Same pattern as createFtsMutex: create once, cache forever, reset on error.
|
|
55
|
-
*/
|
|
56
|
-
export declare function createRerankerMutex(k?: number): () => Promise<rerankers.RRFReranker>;
|
|
57
|
-
//# sourceMappingURL=lancedb-utils.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lancedb-utils.d.ts","sourceRoot":"","sources":["../../../src/db/lancedb-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAS,SAAS,EAAE,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,gEAAgE;AAChE,eAAO,MAAM,KAAK,KAAK,CAAC;AAExB;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,EAAE,CAI3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAIzD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMxE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,OAAO,CAAC,UAAU,EACtB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,KAAK,CAAC,CAgBhB;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAC7B,MAAM,OAAO,CAAC,IAAI,CAAC,CA0BrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,GAAE,MAAc,GAChB,MAAM,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAYtC"}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { Index, rerankers } from "@lancedb/lancedb";
|
|
2
|
-
/**
|
|
3
|
-
* Escape a string value for safe interpolation into LanceDB/DataFusion SQL WHERE clauses.
|
|
4
|
-
*
|
|
5
|
-
* DataFusion uses ANSI SQL string literal rules:
|
|
6
|
-
* - String literals are delimited by single quotes
|
|
7
|
-
* - Single quotes within strings are escaped by doubling: ' -> ''
|
|
8
|
-
* - Backslashes are NOT escape characters (treated literally)
|
|
9
|
-
*/
|
|
10
|
-
export function escapeSql(value) {
|
|
11
|
-
return value.replace(/'/g, "''");
|
|
12
|
-
}
|
|
13
|
-
/** Default k parameter for Reciprocal Rank Fusion reranking. */
|
|
14
|
-
export const RRF_K = 60;
|
|
15
|
-
/**
|
|
16
|
-
* Converts LanceDB's Arrow Vector type to a plain number[].
|
|
17
|
-
* LanceDB returns an Arrow Vector object which is iterable but not an array.
|
|
18
|
-
*/
|
|
19
|
-
export function arrowVectorToArray(value) {
|
|
20
|
-
return Array.isArray(value)
|
|
21
|
-
? value
|
|
22
|
-
: Array.from(value);
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Converts an Arrow Timestamp value to a JavaScript Date.
|
|
26
|
-
*
|
|
27
|
-
* LanceDB/Arrow can return timestamp column values as:
|
|
28
|
-
* - number (most common: raw int64 ms since epoch, fits in JS float64)
|
|
29
|
-
* - BigInt (large int64 values that overflow float64 — rare for timestamps)
|
|
30
|
-
* - Date (hypothetical: some future Arrow-JS build may decode for us)
|
|
31
|
-
*
|
|
32
|
-
* Doing `new Date(row.ts as number)` is a TypeScript lie that silently breaks
|
|
33
|
-
* when Arrow returns a BigInt. This helper handles all three cases safely.
|
|
34
|
-
*/
|
|
35
|
-
export function arrowTimestampToDate(value) {
|
|
36
|
-
if (value instanceof Date)
|
|
37
|
-
return new Date(value.getTime());
|
|
38
|
-
if (typeof value === "bigint")
|
|
39
|
-
return new Date(Number(value));
|
|
40
|
-
return new Date(value);
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Safely parse a JSON string into an object, returning an empty object on failure.
|
|
44
|
-
*/
|
|
45
|
-
export function safeParseJsonObject(raw) {
|
|
46
|
-
try {
|
|
47
|
-
return JSON.parse(raw);
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return {};
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Opens an existing table or creates it with the given schema.
|
|
55
|
-
* Does NOT cache — callers should cache the returned Table if desired.
|
|
56
|
-
*/
|
|
57
|
-
export async function getOrCreateTable(db, name, schema) {
|
|
58
|
-
try {
|
|
59
|
-
return await db.openTable(name);
|
|
60
|
-
}
|
|
61
|
-
catch (err) {
|
|
62
|
-
// Only proceed to create if the table was not found
|
|
63
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
64
|
-
if (!message.includes("was not found") && !message.includes("does not exist")) {
|
|
65
|
-
throw err;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
try {
|
|
69
|
-
return await db.createTable(name, [], { schema });
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
// Another caller may have created it concurrently
|
|
73
|
-
return await db.openTable(name);
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
/**
|
|
77
|
-
* Creates a mutex-guarded function that ensures an FTS index exists on a table's content column.
|
|
78
|
-
*
|
|
79
|
-
* Once the FTS index is confirmed/created, the promise is retained for the lifetime of the
|
|
80
|
-
* caller — the index persists in LanceDB, so re-checking is unnecessary. On error, the
|
|
81
|
-
* mutex resets so the next call can retry.
|
|
82
|
-
*
|
|
83
|
-
* The key design constraint: the promise must be captured synchronously (before any await)
|
|
84
|
-
* to prevent concurrent callers from racing past the guard.
|
|
85
|
-
*/
|
|
86
|
-
export function createFtsMutex(getTable) {
|
|
87
|
-
let promise = null;
|
|
88
|
-
return () => {
|
|
89
|
-
if (promise)
|
|
90
|
-
return promise;
|
|
91
|
-
promise = (async () => {
|
|
92
|
-
const table = await getTable();
|
|
93
|
-
const indices = await table.listIndices();
|
|
94
|
-
const hasFtsIndex = indices.some((idx) => idx.columns.includes("content") && idx.indexType === "FTS");
|
|
95
|
-
if (!hasFtsIndex) {
|
|
96
|
-
await table.createIndex("content", {
|
|
97
|
-
config: Index.fts(),
|
|
98
|
-
});
|
|
99
|
-
await table.waitForIndex(["content_idx"], 30);
|
|
100
|
-
}
|
|
101
|
-
})().catch((error) => {
|
|
102
|
-
promise = null;
|
|
103
|
-
throw error;
|
|
104
|
-
});
|
|
105
|
-
return promise;
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Creates a promise-mutex for RRFReranker instantiation.
|
|
110
|
-
* Same pattern as createFtsMutex: create once, cache forever, reset on error.
|
|
111
|
-
*/
|
|
112
|
-
export function createRerankerMutex(k = RRF_K) {
|
|
113
|
-
let promise = null;
|
|
114
|
-
return () => {
|
|
115
|
-
if (!promise) {
|
|
116
|
-
promise = rerankers.RRFReranker.create(k).catch((e) => {
|
|
117
|
-
promise = null;
|
|
118
|
-
throw e;
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
return promise;
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=lancedb-utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lancedb-utils.js","sourceRoot":"","sources":["../../../src/db/lancedb-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import * as lancedb from "@lancedb/lancedb";
|
|
2
|
-
import { type Memory, type HybridRow } from "../types/memory.js";
|
|
3
|
-
export declare class MemoryRepository {
|
|
4
|
-
private db;
|
|
5
|
-
private migrationPromise;
|
|
6
|
-
private ensureFtsIndex;
|
|
7
|
-
private getReranker;
|
|
8
|
-
constructor(db: lancedb.Connection);
|
|
9
|
-
private getTable;
|
|
10
|
-
/**
|
|
11
|
-
* Ensures schema migration has run. Uses a mutex pattern identical to ensureFtsIndex.
|
|
12
|
-
* Adds columns introduced after the initial schema (usefulness, access_count, last_accessed).
|
|
13
|
-
*/
|
|
14
|
-
private ensureMigration;
|
|
15
|
-
/**
|
|
16
|
-
* Inspects the existing table schema and adds any missing columns with safe defaults.
|
|
17
|
-
* This handles databases created before the hybrid memory system was introduced.
|
|
18
|
-
*/
|
|
19
|
-
private migrateSchemaIfNeeded;
|
|
20
|
-
/**
|
|
21
|
-
* Converts a raw LanceDB row to a Memory object.
|
|
22
|
-
*/
|
|
23
|
-
private rowToMemory;
|
|
24
|
-
insert(memory: Memory): Promise<void>;
|
|
25
|
-
upsert(memory: Memory): Promise<void>;
|
|
26
|
-
findById(id: string): Promise<Memory | null>;
|
|
27
|
-
findByIds(ids: string[]): Promise<Memory[]>;
|
|
28
|
-
markDeleted(id: string): Promise<boolean>;
|
|
29
|
-
/**
|
|
30
|
-
* Performs hybrid search combining vector similarity and full-text search.
|
|
31
|
-
* Uses RRF (Reciprocal Rank Fusion) to combine rankings from both search methods.
|
|
32
|
-
*
|
|
33
|
-
* @param embedding - Query embedding vector
|
|
34
|
-
* @param query - Text query for full-text search
|
|
35
|
-
* @param limit - Maximum number of results to return
|
|
36
|
-
* @returns Array of HybridRow containing full Memory data plus RRF score
|
|
37
|
-
*/
|
|
38
|
-
findHybrid(embedding: number[], query: string, limit: number): Promise<HybridRow[]>;
|
|
39
|
-
}
|
|
40
|
-
//# sourceMappingURL=memory.repository.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"memory.repository.d.ts","sourceRoot":"","sources":["../../../src/db/memory.repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAI5C,OAAO,EACL,KAAK,MAAM,EACX,KAAK,SAAS,EAEf,MAAM,oBAAoB,CAAC;AAE5B,qBAAa,gBAAgB;IAUf,OAAO,CAAC,EAAE;IARtB,OAAO,CAAC,gBAAgB,CAA8B;IAGtD,OAAO,CAAC,cAAc,CAAsB;IAG5C,OAAO,CAAC,WAAW,CAAyB;gBAExB,EAAE,EAAE,OAAO,CAAC,UAAU;YAI5B,QAAQ;IAWtB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAavB;;;OAGG;YACW,qBAAqB;IAqBnC;;OAEG;IACH,OAAO,CAAC,WAAW;IAiBb,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,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAW3C,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;CAsB1F"}
|