@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
package/dist/hooks/stop.cjs
CHANGED
|
@@ -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
|
|
|
@@ -955,7 +1007,7 @@ async function main() {
|
|
|
955
1007
|
log("Stop", `Found ${captures.length} captures to save`, { reasoning: reasoningCount, tools: toolCount });
|
|
956
1008
|
const projectId = getProjectId2(input.cwd);
|
|
957
1009
|
const sqlite = new SQLiteStorage(DB_PATH);
|
|
958
|
-
const
|
|
1010
|
+
const vectorStore = await SQLiteVecStorage.create(VECTORS_PATH);
|
|
959
1011
|
const project = sqlite.getProject(projectId);
|
|
960
1012
|
if (!project) {
|
|
961
1013
|
sqlite.insertProject({
|
|
@@ -998,14 +1050,14 @@ async function main() {
|
|
|
998
1050
|
}
|
|
999
1051
|
sqlite.insertMemory(memory);
|
|
1000
1052
|
const vector = await embedder.embed(content);
|
|
1001
|
-
await
|
|
1053
|
+
await vectorStore.insertVector(memoryId, vector);
|
|
1002
1054
|
}
|
|
1003
1055
|
const dedupeOnPrune = config.storage?.deduplicateOnPrune ?? true;
|
|
1004
1056
|
const dedupeThreshold = config.retrieval?.deduplicationThreshold ?? 0.85;
|
|
1005
1057
|
if (dedupeOnPrune) {
|
|
1006
1058
|
const dedupedIds = await deduplicateStoredMemories(
|
|
1007
1059
|
sqlite,
|
|
1008
|
-
|
|
1060
|
+
vectorStore,
|
|
1009
1061
|
projectId,
|
|
1010
1062
|
dedupeThreshold
|
|
1011
1063
|
);
|
|
@@ -1024,12 +1076,12 @@ async function main() {
|
|
|
1024
1076
|
if (pruneResult.deleted > 0) {
|
|
1025
1077
|
log("Stop", `Pruned ${pruneResult.deleted} old memories to stay within limits`);
|
|
1026
1078
|
for (const id of pruneResult.deletedIds) {
|
|
1027
|
-
await
|
|
1079
|
+
await vectorStore.deleteVector(id);
|
|
1028
1080
|
}
|
|
1029
1081
|
}
|
|
1030
1082
|
}
|
|
1031
1083
|
sqlite.close();
|
|
1032
|
-
await
|
|
1084
|
+
await vectorStore.close();
|
|
1033
1085
|
await embedder.close();
|
|
1034
1086
|
log("Stop", `SUCCESS: Saved ${captures.length} memories`);
|
|
1035
1087
|
outputResult({ continue: true, suppressOutput: true });
|
|
@@ -1064,13 +1116,13 @@ async function loadConfig() {
|
|
|
1064
1116
|
function outputResult(result) {
|
|
1065
1117
|
console.log(JSON.stringify(result));
|
|
1066
1118
|
}
|
|
1067
|
-
async function deduplicateStoredMemories(sqlite,
|
|
1119
|
+
async function deduplicateStoredMemories(sqlite, vectorStore, projectId, threshold) {
|
|
1068
1120
|
const deletedIds = [];
|
|
1069
1121
|
const memories = sqlite.getRecentMemories(projectId, 0, 0);
|
|
1070
1122
|
if (memories.length < 2)
|
|
1071
1123
|
return deletedIds;
|
|
1072
1124
|
const memoryIds = memories.map((m) => m.id);
|
|
1073
|
-
const vectors = await
|
|
1125
|
+
const vectors = await vectorStore.getVectorsByIds(memoryIds);
|
|
1074
1126
|
if (vectors.size < 2)
|
|
1075
1127
|
return deletedIds;
|
|
1076
1128
|
const keepIds = /* @__PURE__ */ new Set();
|
|
@@ -1094,7 +1146,7 @@ async function deduplicateStoredMemories(sqlite, lancedb2, projectId, threshold)
|
|
|
1094
1146
|
keptVectors.push({ id: memory.id, vector });
|
|
1095
1147
|
} else {
|
|
1096
1148
|
sqlite.deleteMemory(memory.id);
|
|
1097
|
-
await
|
|
1149
|
+
await vectorStore.deleteVector(memory.id);
|
|
1098
1150
|
deletedIds.push(memory.id);
|
|
1099
1151
|
}
|
|
1100
1152
|
}
|
package/dist/hooks/stop.js
CHANGED
|
@@ -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, TranscriptParser, formatCaptureContent, isTextCapture, isToolCapture, createEmbedFunction, cosineSimilarity } 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');
|
|
@@ -63,7 +63,7 @@ async function main() {
|
|
|
63
63
|
const projectId = getProjectId(input.cwd);
|
|
64
64
|
// Initialize storage
|
|
65
65
|
const sqlite = new SQLiteStorage(DB_PATH);
|
|
66
|
-
const
|
|
66
|
+
const vectorStore = await SQLiteVecStorage.create(VECTORS_PATH);
|
|
67
67
|
// Ensure project is registered
|
|
68
68
|
const project = sqlite.getProject(projectId);
|
|
69
69
|
if (!project) {
|
|
@@ -112,13 +112,13 @@ async function main() {
|
|
|
112
112
|
sqlite.insertMemory(memory);
|
|
113
113
|
// Generate and store embedding
|
|
114
114
|
const vector = await embedder.embed(content);
|
|
115
|
-
await
|
|
115
|
+
await vectorStore.insertVector(memoryId, vector);
|
|
116
116
|
}
|
|
117
117
|
// Deduplicate highly similar memories to save space
|
|
118
118
|
const dedupeOnPrune = config.storage?.deduplicateOnPrune ?? true;
|
|
119
119
|
const dedupeThreshold = config.retrieval?.deduplicationThreshold ?? 0.85;
|
|
120
120
|
if (dedupeOnPrune) {
|
|
121
|
-
const dedupedIds = await deduplicateStoredMemories(sqlite,
|
|
121
|
+
const dedupedIds = await deduplicateStoredMemories(sqlite, vectorStore, projectId, dedupeThreshold);
|
|
122
122
|
if (dedupedIds.length > 0) {
|
|
123
123
|
log('Stop', `Deduplicated ${dedupedIds.length} similar memories`);
|
|
124
124
|
}
|
|
@@ -137,13 +137,13 @@ async function main() {
|
|
|
137
137
|
log('Stop', `Pruned ${pruneResult.deleted} old memories to stay within limits`);
|
|
138
138
|
// Also delete from vector store
|
|
139
139
|
for (const id of pruneResult.deletedIds) {
|
|
140
|
-
await
|
|
140
|
+
await vectorStore.deleteVector(id);
|
|
141
141
|
}
|
|
142
142
|
}
|
|
143
143
|
}
|
|
144
144
|
// Close storage and embedder
|
|
145
145
|
sqlite.close();
|
|
146
|
-
await
|
|
146
|
+
await vectorStore.close();
|
|
147
147
|
await embedder.close();
|
|
148
148
|
log('Stop', `SUCCESS: Saved ${captures.length} memories`);
|
|
149
149
|
outputResult({ continue: true, suppressOutput: true });
|
|
@@ -186,7 +186,7 @@ function outputResult(result) {
|
|
|
186
186
|
* Deduplicate stored memories by removing older ones that are highly similar to newer ones.
|
|
187
187
|
* Uses cosine similarity on embeddings. Keeps the newest memory when duplicates found.
|
|
188
188
|
*/
|
|
189
|
-
async function deduplicateStoredMemories(sqlite,
|
|
189
|
+
async function deduplicateStoredMemories(sqlite, vectorStore, projectId, threshold) {
|
|
190
190
|
const deletedIds = [];
|
|
191
191
|
// Get all memories for this project, sorted by date (newest first)
|
|
192
192
|
const memories = sqlite.getRecentMemories(projectId, 0, 0); // 0 = unlimited
|
|
@@ -194,7 +194,7 @@ async function deduplicateStoredMemories(sqlite, lancedb, projectId, threshold)
|
|
|
194
194
|
return deletedIds;
|
|
195
195
|
// Get vectors for all memories
|
|
196
196
|
const memoryIds = memories.map(m => m.id);
|
|
197
|
-
const vectors = await
|
|
197
|
+
const vectors = await vectorStore.getVectorsByIds(memoryIds);
|
|
198
198
|
if (vectors.size < 2)
|
|
199
199
|
return deletedIds;
|
|
200
200
|
// Track which memories to keep (newest first wins)
|
|
@@ -222,7 +222,7 @@ async function deduplicateStoredMemories(sqlite, lancedb, projectId, threshold)
|
|
|
222
222
|
else {
|
|
223
223
|
// Delete this duplicate
|
|
224
224
|
sqlite.deleteMemory(memory.id);
|
|
225
|
-
await
|
|
225
|
+
await vectorStore.deleteVector(memory.id);
|
|
226
226
|
deletedIds.push(memory.id);
|
|
227
227
|
}
|
|
228
228
|
}
|
package/dist/hooks/stop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/hooks/stop.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,8CAA8C;AAE9C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAChD,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":"stop.js","sourceRoot":"","sources":["../../src/hooks/stop.ts"],"names":[],"mappings":"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"}
|