@memextend/claude-code 0.1.9 → 0.3.0
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/hooks/pre-compact.cjs +133 -81
- package/dist/hooks/pre-compact.js +9 -9
- package/dist/hooks/pre-compact.js.map +1 -1
- package/dist/hooks/session-start.cjs +134 -82
- package/dist/hooks/session-start.js +5 -5
- package/dist/hooks/session-start.js.map +1 -1
- package/dist/hooks/stop.cjs +133 -81
- package/dist/hooks/stop.js +9 -9
- package/dist/hooks/stop.js.map +1 -1
- package/dist/mcp/server.cjs +142 -90
- package/dist/mcp/server.js +13 -13
- package/dist/mcp/server.js.map +1 -1
- package/package.json +2 -2
- package/scripts/build-hooks.js +1 -1
|
@@ -394,116 +394,168 @@ var SQLiteStorage = class {
|
|
|
394
394
|
}
|
|
395
395
|
};
|
|
396
396
|
|
|
397
|
-
// ../../core/dist/storage/
|
|
398
|
-
var
|
|
399
|
-
|
|
397
|
+
// ../../core/dist/storage/sqlite-vec.js
|
|
398
|
+
var import_better_sqlite32 = __toESM(require("better-sqlite3"), 1);
|
|
399
|
+
|
|
400
|
+
// ../../../node_modules/sqlite-vec/index.mjs
|
|
401
|
+
var import_node_path = require("node:path");
|
|
402
|
+
var import_node_url = require("node:url");
|
|
403
|
+
var import_node_process = require("node:process");
|
|
404
|
+
var import_node_fs = require("node:fs");
|
|
405
|
+
var import_meta = {};
|
|
406
|
+
var BASE_PACKAGE_NAME = "sqlite-vec";
|
|
407
|
+
var ENTRYPOINT_BASE_NAME = "vec0";
|
|
408
|
+
var supportedPlatforms = [["macos", "aarch64"], ["macos", "x86_64"], ["windows", "x86_64"], ["linux", "x86_64"], ["linux", "aarch64"]];
|
|
409
|
+
var invalidPlatformErrorMessage = `Unsupported platform for ${BASE_PACKAGE_NAME}, on a ${import_node_process.platform}-${import_node_process.arch} machine. Supported platforms are (${supportedPlatforms.map(([p, a]) => `${p}-${a}`).join(",")}). Consult the ${BASE_PACKAGE_NAME} NPM package README for details.`;
|
|
410
|
+
var extensionNotFoundErrorMessage = (packageName) => `Loadble extension for ${BASE_PACKAGE_NAME} not found. Was the ${packageName} package installed?`;
|
|
411
|
+
function validPlatform(platform2, arch2) {
|
|
412
|
+
return supportedPlatforms.find(([p, a]) => platform2 == p && arch2 === a) !== null;
|
|
413
|
+
}
|
|
414
|
+
function extensionSuffix(platform2) {
|
|
415
|
+
if (platform2 === "win32")
|
|
416
|
+
return "dll";
|
|
417
|
+
if (platform2 === "darwin")
|
|
418
|
+
return "dylib";
|
|
419
|
+
return "so";
|
|
420
|
+
}
|
|
421
|
+
function platformPackageName(platform2, arch2) {
|
|
422
|
+
const os = platform2 === "win32" ? "windows" : platform2;
|
|
423
|
+
return `${BASE_PACKAGE_NAME}-${os}-${arch2}`;
|
|
424
|
+
}
|
|
425
|
+
function getLoadablePath() {
|
|
426
|
+
if (!validPlatform(import_node_process.platform, import_node_process.arch)) {
|
|
427
|
+
throw new Error(
|
|
428
|
+
invalidPlatformErrorMessage
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
const packageName = platformPackageName(import_node_process.platform, import_node_process.arch);
|
|
432
|
+
const loadablePath = (0, import_node_path.join)(
|
|
433
|
+
(0, import_node_url.fileURLToPath)(new URL((0, import_node_path.join)("."), import_meta.url)),
|
|
434
|
+
"..",
|
|
435
|
+
packageName,
|
|
436
|
+
`${ENTRYPOINT_BASE_NAME}.${extensionSuffix(import_node_process.platform)}`
|
|
437
|
+
);
|
|
438
|
+
if (!(0, import_node_fs.statSync)(loadablePath, { throwIfNoEntry: false })) {
|
|
439
|
+
throw new Error(extensionNotFoundErrorMessage(packageName));
|
|
440
|
+
}
|
|
441
|
+
return loadablePath;
|
|
442
|
+
}
|
|
443
|
+
function load(db) {
|
|
444
|
+
db.loadExtension(getLoadablePath());
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// ../../core/dist/storage/sqlite-vec.js
|
|
448
|
+
var SQLiteVecStorage = class _SQLiteVecStorage {
|
|
400
449
|
db;
|
|
401
|
-
|
|
402
|
-
tableName = "memories";
|
|
450
|
+
tableName = "memory_vectors";
|
|
403
451
|
dimensions = 384;
|
|
404
452
|
constructor(db) {
|
|
405
453
|
this.db = db;
|
|
406
454
|
}
|
|
407
455
|
static async create(dbPath) {
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
456
|
+
let actualPath = dbPath;
|
|
457
|
+
if (dbPath.endsWith("vectors") || dbPath.endsWith("vectors/")) {
|
|
458
|
+
actualPath = dbPath.replace(/\/?$/, ".db");
|
|
459
|
+
}
|
|
460
|
+
const db = new import_better_sqlite32.default(actualPath);
|
|
461
|
+
load(db);
|
|
462
|
+
const storage = new _SQLiteVecStorage(db);
|
|
463
|
+
storage.initialize();
|
|
411
464
|
return storage;
|
|
412
465
|
}
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
466
|
+
initialize() {
|
|
467
|
+
this.db.exec(`
|
|
468
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS ${this.tableName} USING vec0(
|
|
469
|
+
id TEXT PRIMARY KEY,
|
|
470
|
+
vector FLOAT[${this.dimensions}]
|
|
471
|
+
)
|
|
472
|
+
`);
|
|
418
473
|
}
|
|
419
474
|
async insertVector(id, vector) {
|
|
420
475
|
if (vector.length !== this.dimensions) {
|
|
421
476
|
throw new Error(`Vector must have ${this.dimensions} dimensions, got ${vector.length}`);
|
|
422
477
|
}
|
|
423
|
-
const
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
478
|
+
const float32 = new Float32Array(vector);
|
|
479
|
+
const vectorBuffer = Buffer.from(float32.buffer);
|
|
480
|
+
const stmt = this.db.prepare(`
|
|
481
|
+
INSERT OR REPLACE INTO ${this.tableName} (id, vector)
|
|
482
|
+
VALUES (?, ?)
|
|
483
|
+
`);
|
|
484
|
+
stmt.run(id, vectorBuffer);
|
|
429
485
|
}
|
|
430
486
|
async insertVectors(items) {
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
487
|
+
const stmt = this.db.prepare(`
|
|
488
|
+
INSERT OR REPLACE INTO ${this.tableName} (id, vector)
|
|
489
|
+
VALUES (?, ?)
|
|
490
|
+
`);
|
|
491
|
+
const insertMany = this.db.transaction((items2) => {
|
|
492
|
+
for (const item of items2) {
|
|
493
|
+
if (item.vector.length !== this.dimensions) {
|
|
494
|
+
throw new Error(`Vector must have ${this.dimensions} dimensions, got ${item.vector.length}`);
|
|
495
|
+
}
|
|
496
|
+
const float32 = new Float32Array(item.vector);
|
|
497
|
+
const vectorBuffer = Buffer.from(float32.buffer);
|
|
498
|
+
stmt.run(item.id, vectorBuffer);
|
|
434
499
|
}
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
this.table = await this.db.createTable(this.tableName, items);
|
|
438
|
-
} else {
|
|
439
|
-
await this.table.add(items);
|
|
440
|
-
}
|
|
500
|
+
});
|
|
501
|
+
insertMany(items);
|
|
441
502
|
}
|
|
442
503
|
async search(vector, limit = 10) {
|
|
443
|
-
if (
|
|
444
|
-
|
|
504
|
+
if (vector.length !== this.dimensions) {
|
|
505
|
+
throw new Error(`Query vector must have ${this.dimensions} dimensions, got ${vector.length}`);
|
|
445
506
|
}
|
|
446
507
|
const effectiveLimit = limit > 0 ? limit : 100;
|
|
447
|
-
const
|
|
448
|
-
|
|
508
|
+
const float32 = new Float32Array(vector);
|
|
509
|
+
const vectorBuffer = Buffer.from(float32.buffer);
|
|
510
|
+
const stmt = this.db.prepare(`
|
|
511
|
+
SELECT id, distance
|
|
512
|
+
FROM ${this.tableName}
|
|
513
|
+
WHERE vector MATCH ?
|
|
514
|
+
ORDER BY distance
|
|
515
|
+
LIMIT ?
|
|
516
|
+
`);
|
|
517
|
+
const rows = stmt.all(vectorBuffer, effectiveLimit);
|
|
518
|
+
return rows.map((row) => ({
|
|
449
519
|
id: row.id,
|
|
450
|
-
score: 1
|
|
451
|
-
// Convert distance to similarity
|
|
520
|
+
score: 1 / (1 + row.distance)
|
|
452
521
|
}));
|
|
453
522
|
}
|
|
454
523
|
async deleteVector(id) {
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
const sanitizedId = id.replace(/'/g, "''");
|
|
458
|
-
await this.table.delete(`id = '${sanitizedId}'`);
|
|
524
|
+
const stmt = this.db.prepare(`DELETE FROM ${this.tableName} WHERE id = ?`);
|
|
525
|
+
stmt.run(id);
|
|
459
526
|
}
|
|
460
527
|
async getVectorCount() {
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
return
|
|
528
|
+
const stmt = this.db.prepare(`SELECT COUNT(*) as count FROM ${this.tableName}`);
|
|
529
|
+
const result = stmt.get();
|
|
530
|
+
return result.count;
|
|
464
531
|
}
|
|
465
532
|
async getVectorsByIds(ids) {
|
|
466
533
|
const result = /* @__PURE__ */ new Map();
|
|
467
|
-
if (
|
|
534
|
+
if (ids.length === 0)
|
|
468
535
|
return result;
|
|
469
536
|
const BATCH_SIZE = 100;
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
537
|
+
for (let i = 0; i < ids.length; i += BATCH_SIZE) {
|
|
538
|
+
const batch = ids.slice(i, i + BATCH_SIZE);
|
|
539
|
+
const placeholders = batch.map(() => "?").join(",");
|
|
540
|
+
const stmt = this.db.prepare(`
|
|
541
|
+
SELECT id, vector FROM ${this.tableName}
|
|
542
|
+
WHERE id IN (${placeholders})
|
|
543
|
+
`);
|
|
544
|
+
const rows = stmt.all(...batch);
|
|
545
|
+
for (const row of rows) {
|
|
546
|
+
const vector = Array.from(new Float32Array(row.vector));
|
|
547
|
+
result.set(row.id, vector);
|
|
479
548
|
}
|
|
480
|
-
} catch {
|
|
481
549
|
}
|
|
482
550
|
return result;
|
|
483
551
|
}
|
|
484
552
|
async close() {
|
|
553
|
+
this.db.close();
|
|
485
554
|
}
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
*
|
|
491
|
-
* @param cleanupOlderThan - Date before which old versions should be pruned (default: now)
|
|
492
|
-
*/
|
|
493
|
-
async optimize(cleanupOlderThan) {
|
|
494
|
-
if (!this.table)
|
|
495
|
-
return null;
|
|
496
|
-
try {
|
|
497
|
-
const table = this.table;
|
|
498
|
-
const stats = await table.optimize({ cleanupOlderThan: cleanupOlderThan ?? /* @__PURE__ */ new Date() });
|
|
499
|
-
return {
|
|
500
|
-
compacted: stats?.compaction?.filesRemoved ?? 0,
|
|
501
|
-
pruned: stats?.prune?.versionsRemoved ?? 0
|
|
502
|
-
};
|
|
503
|
-
} catch (error) {
|
|
504
|
-
console.error("[memextend] LanceDB optimize failed:", error);
|
|
505
|
-
return null;
|
|
506
|
-
}
|
|
555
|
+
// No optimize needed - SQLite handles this automatically!
|
|
556
|
+
async optimize() {
|
|
557
|
+
this.db.exec("VACUUM");
|
|
558
|
+
return { compacted: 0, pruned: 0 };
|
|
507
559
|
}
|
|
508
560
|
};
|
|
509
561
|
|
|
@@ -649,12 +701,12 @@ async function createEmbedFunction(modelsDir) {
|
|
|
649
701
|
// ../../core/dist/memory/retrieve.js
|
|
650
702
|
var MemoryRetriever = class {
|
|
651
703
|
sqlite;
|
|
652
|
-
|
|
704
|
+
vectorStore;
|
|
653
705
|
embed;
|
|
654
706
|
options;
|
|
655
|
-
constructor(sqlite,
|
|
707
|
+
constructor(sqlite, vectorStore, embed, options = {}) {
|
|
656
708
|
this.sqlite = sqlite;
|
|
657
|
-
this.
|
|
709
|
+
this.vectorStore = vectorStore;
|
|
658
710
|
this.embed = embed;
|
|
659
711
|
this.options = {
|
|
660
712
|
defaultLimit: options.defaultLimit ?? 0,
|
|
@@ -672,12 +724,12 @@ var MemoryRetriever = class {
|
|
|
672
724
|
return this.sqlite.searchFTS(query, limit);
|
|
673
725
|
}
|
|
674
726
|
/**
|
|
675
|
-
* Vector similarity search
|
|
727
|
+
* Vector similarity search
|
|
676
728
|
*/
|
|
677
729
|
async vectorSearch(query, options = {}) {
|
|
678
730
|
const limit = options.limit ?? this.options.defaultLimit;
|
|
679
731
|
const queryVector = await this.embed(query);
|
|
680
|
-
const vectorResults = await this.
|
|
732
|
+
const vectorResults = await this.vectorStore.search(queryVector, limit * 2);
|
|
681
733
|
const results = [];
|
|
682
734
|
for (const vr of vectorResults) {
|
|
683
735
|
const memory = this.sqlite.getMemory(vr.id);
|
|
@@ -969,9 +1021,9 @@ async function main() {
|
|
|
969
1021
|
}
|
|
970
1022
|
const projectId = getProjectId2(input.cwd);
|
|
971
1023
|
const sqlite = new SQLiteStorage(DB_PATH);
|
|
972
|
-
const
|
|
1024
|
+
const vectorStore = await SQLiteVecStorage.create(VECTORS_PATH);
|
|
973
1025
|
const embedder = await createEmbedFunction(MODELS_PATH);
|
|
974
|
-
const retriever = new MemoryRetriever(sqlite,
|
|
1026
|
+
const retriever = new MemoryRetriever(sqlite, vectorStore, embedder.embedQuery, {
|
|
975
1027
|
defaultLimit: config.retrieval?.maxMemories ?? 0,
|
|
976
1028
|
defaultRecentDays: config.retrieval?.recentDays ?? 0
|
|
977
1029
|
});
|
|
@@ -1005,7 +1057,7 @@ async function main() {
|
|
|
1005
1057
|
let deduplicatedMemories = allMemories;
|
|
1006
1058
|
if (allMemories.length > 1) {
|
|
1007
1059
|
const memoryIds = allMemories.map((m) => m.id);
|
|
1008
|
-
const vectors = await
|
|
1060
|
+
const vectors = await vectorStore.getVectorsByIds(memoryIds);
|
|
1009
1061
|
if (vectors.size > 0) {
|
|
1010
1062
|
deduplicatedMemories = deduplicateMemories(allMemories, vectors, {
|
|
1011
1063
|
similarityThreshold: deduplicationThreshold
|
|
@@ -1022,7 +1074,7 @@ async function main() {
|
|
|
1022
1074
|
}
|
|
1023
1075
|
}
|
|
1024
1076
|
sqlite.close();
|
|
1025
|
-
await
|
|
1077
|
+
await vectorStore.close();
|
|
1026
1078
|
await embedder.close();
|
|
1027
1079
|
if (deduplicatedMemories.length === 0 && context.globalProfile.length === 0) {
|
|
1028
1080
|
log("SessionStart", "No memories to inject");
|
|
@@ -6,7 +6,7 @@ import { readFile } from 'fs/promises';
|
|
|
6
6
|
import { join, basename } from 'path';
|
|
7
7
|
import { homedir } from 'os';
|
|
8
8
|
import { execSync } from 'child_process';
|
|
9
|
-
import { SQLiteStorage,
|
|
9
|
+
import { SQLiteStorage, SQLiteVecStorage, MemoryRetriever, formatContextForInjection, createEmbedFunction, deduplicateMemories, getDeduplicationStats } from '@memextend/core';
|
|
10
10
|
import { log, logError } from './logger.js';
|
|
11
11
|
const MEMEXTEND_DIR = join(homedir(), '.memextend');
|
|
12
12
|
const CONFIG_PATH = join(MEMEXTEND_DIR, 'config.json');
|
|
@@ -43,10 +43,10 @@ async function main() {
|
|
|
43
43
|
const projectId = getProjectId(input.cwd);
|
|
44
44
|
// Initialize storage
|
|
45
45
|
const sqlite = new SQLiteStorage(DB_PATH);
|
|
46
|
-
const
|
|
46
|
+
const vectorStore = await SQLiteVecStorage.create(VECTORS_PATH);
|
|
47
47
|
// Create embedding function (uses real model if available, fallback otherwise)
|
|
48
48
|
const embedder = await createEmbedFunction(MODELS_PATH);
|
|
49
|
-
const retriever = new MemoryRetriever(sqlite,
|
|
49
|
+
const retriever = new MemoryRetriever(sqlite, vectorStore, embedder.embedQuery, {
|
|
50
50
|
defaultLimit: config.retrieval?.maxMemories ?? 0,
|
|
51
51
|
defaultRecentDays: config.retrieval?.recentDays ?? 0,
|
|
52
52
|
});
|
|
@@ -90,7 +90,7 @@ async function main() {
|
|
|
90
90
|
if (allMemories.length > 1) {
|
|
91
91
|
// Fetch vectors for all memories
|
|
92
92
|
const memoryIds = allMemories.map(m => m.id);
|
|
93
|
-
const vectors = await
|
|
93
|
+
const vectors = await vectorStore.getVectorsByIds(memoryIds);
|
|
94
94
|
if (vectors.size > 0) {
|
|
95
95
|
deduplicatedMemories = deduplicateMemories(allMemories, vectors, {
|
|
96
96
|
similarityThreshold: deduplicationThreshold
|
|
@@ -108,7 +108,7 @@ async function main() {
|
|
|
108
108
|
}
|
|
109
109
|
// Close storage and embedder
|
|
110
110
|
sqlite.close();
|
|
111
|
-
await
|
|
111
|
+
await vectorStore.close();
|
|
112
112
|
await embedder.close();
|
|
113
113
|
// Check if there's anything to inject
|
|
114
114
|
if (deduplicatedMemories.length === 0 && context.globalProfile.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,8CAA8C;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EACL,aAAa,EACb,
|
|
1
|
+
{"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../src/hooks/session-start.ts"],"names":[],"mappings":"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"}
|