engram-mcp-server 1.2.8 → 1.2.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/README.md +12 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +6 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/installer/ide-detector.d.ts.map +1 -1
- package/dist/installer/ide-detector.js +10 -6
- package/dist/installer/ide-detector.js.map +1 -1
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +79 -15
- package/dist/installer/index.js.map +1 -1
- package/package.json +6 -3
- package/dist/installer.d.ts +0 -2
- package/dist/installer.d.ts.map +0 -1
- package/dist/installer.js +0 -315
- package/dist/installer.js.map +0 -1
- package/dist/src/constants.d.ts +0 -21
- package/dist/src/constants.d.ts.map +0 -1
- package/dist/src/constants.js +0 -81
- package/dist/src/constants.js.map +0 -1
- package/dist/src/database.d.ts +0 -32
- package/dist/src/database.d.ts.map +0 -1
- package/dist/src/database.js +0 -143
- package/dist/src/database.js.map +0 -1
- package/dist/src/errors.d.ts +0 -40
- package/dist/src/errors.d.ts.map +0 -1
- package/dist/src/errors.js +0 -63
- package/dist/src/errors.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 -89
- package/dist/src/index.js.map +0 -1
- package/dist/src/installer/config-writer.d.ts +0 -25
- package/dist/src/installer/config-writer.d.ts.map +0 -1
- package/dist/src/installer/config-writer.js +0 -86
- package/dist/src/installer/config-writer.js.map +0 -1
- package/dist/src/installer/ide-configs.d.ts +0 -19
- package/dist/src/installer/ide-configs.d.ts.map +0 -1
- package/dist/src/installer/ide-configs.js +0 -131
- package/dist/src/installer/ide-configs.js.map +0 -1
- package/dist/src/installer/ide-detector.d.ts +0 -6
- package/dist/src/installer/ide-detector.d.ts.map +0 -1
- package/dist/src/installer/ide-detector.js +0 -45
- package/dist/src/installer/ide-detector.js.map +0 -1
- package/dist/src/installer/index.d.ts +0 -2
- package/dist/src/installer/index.d.ts.map +0 -1
- package/dist/src/installer/index.js +0 -229
- package/dist/src/installer/index.js.map +0 -1
- package/dist/src/logger.d.ts +0 -10
- package/dist/src/logger.d.ts.map +0 -1
- package/dist/src/logger.js +0 -51
- package/dist/src/logger.js.map +0 -1
- package/dist/src/migrations.d.ts +0 -4
- package/dist/src/migrations.d.ts.map +0 -1
- package/dist/src/migrations.js +0 -343
- package/dist/src/migrations.js.map +0 -1
- package/dist/src/repositories/changes.repo.d.ts +0 -35
- package/dist/src/repositories/changes.repo.d.ts.map +0 -1
- package/dist/src/repositories/changes.repo.js +0 -53
- package/dist/src/repositories/changes.repo.js.map +0 -1
- package/dist/src/repositories/config.repo.d.ts +0 -11
- package/dist/src/repositories/config.repo.d.ts.map +0 -1
- package/dist/src/repositories/config.repo.js +0 -38
- package/dist/src/repositories/config.repo.js.map +0 -1
- package/dist/src/repositories/conventions.repo.d.ts +0 -15
- package/dist/src/repositories/conventions.repo.d.ts.map +0 -1
- package/dist/src/repositories/conventions.repo.js +0 -39
- package/dist/src/repositories/conventions.repo.js.map +0 -1
- package/dist/src/repositories/decisions.repo.d.ts +0 -19
- package/dist/src/repositories/decisions.repo.d.ts.map +0 -1
- package/dist/src/repositories/decisions.repo.js +0 -48
- package/dist/src/repositories/decisions.repo.js.map +0 -1
- package/dist/src/repositories/events.repo.d.ts +0 -34
- package/dist/src/repositories/events.repo.d.ts.map +0 -1
- package/dist/src/repositories/events.repo.js +0 -71
- package/dist/src/repositories/events.repo.js.map +0 -1
- package/dist/src/repositories/file-notes.repo.d.ts +0 -26
- package/dist/src/repositories/file-notes.repo.d.ts.map +0 -1
- package/dist/src/repositories/file-notes.repo.js +0 -55
- package/dist/src/repositories/file-notes.repo.js.map +0 -1
- package/dist/src/repositories/index.d.ts +0 -38
- package/dist/src/repositories/index.d.ts.map +0 -1
- package/dist/src/repositories/index.js +0 -41
- package/dist/src/repositories/index.js.map +0 -1
- package/dist/src/repositories/milestones.repo.d.ts +0 -10
- package/dist/src/repositories/milestones.repo.d.ts.map +0 -1
- package/dist/src/repositories/milestones.repo.js +0 -20
- package/dist/src/repositories/milestones.repo.js.map +0 -1
- package/dist/src/repositories/sessions.repo.d.ts +0 -27
- package/dist/src/repositories/sessions.repo.d.ts.map +0 -1
- package/dist/src/repositories/sessions.repo.js +0 -61
- package/dist/src/repositories/sessions.repo.js.map +0 -1
- package/dist/src/repositories/snapshot.repo.d.ts +0 -11
- package/dist/src/repositories/snapshot.repo.d.ts.map +0 -1
- package/dist/src/repositories/snapshot.repo.js +0 -17
- package/dist/src/repositories/snapshot.repo.js.map +0 -1
- package/dist/src/repositories/tasks.repo.d.ts +0 -40
- package/dist/src/repositories/tasks.repo.d.ts.map +0 -1
- package/dist/src/repositories/tasks.repo.js +0 -90
- package/dist/src/repositories/tasks.repo.js.map +0 -1
- package/dist/src/response.d.ts +0 -28
- package/dist/src/response.d.ts.map +0 -1
- package/dist/src/response.js +0 -38
- package/dist/src/response.js.map +0 -1
- package/dist/src/scripts/install-hooks.d.ts +0 -3
- package/dist/src/scripts/install-hooks.d.ts.map +0 -1
- package/dist/src/scripts/install-hooks.js +0 -89
- package/dist/src/scripts/install-hooks.js.map +0 -1
- package/dist/src/services/compaction.service.d.ts +0 -27
- package/dist/src/services/compaction.service.d.ts.map +0 -1
- package/dist/src/services/compaction.service.js +0 -93
- package/dist/src/services/compaction.service.js.map +0 -1
- package/dist/src/services/event-trigger.service.d.ts +0 -24
- package/dist/src/services/event-trigger.service.d.ts.map +0 -1
- package/dist/src/services/event-trigger.service.js +0 -60
- package/dist/src/services/event-trigger.service.js.map +0 -1
- package/dist/src/services/git.service.d.ts +0 -20
- package/dist/src/services/git.service.d.ts.map +0 -1
- package/dist/src/services/git.service.js +0 -88
- package/dist/src/services/git.service.js.map +0 -1
- package/dist/src/services/index.d.ts +0 -5
- package/dist/src/services/index.d.ts.map +0 -1
- package/dist/src/services/index.js +0 -8
- package/dist/src/services/index.js.map +0 -1
- package/dist/src/services/project-scan.service.d.ts +0 -19
- package/dist/src/services/project-scan.service.d.ts.map +0 -1
- package/dist/src/services/project-scan.service.js +0 -66
- package/dist/src/services/project-scan.service.js.map +0 -1
- package/dist/src/tools/backup.d.ts +0 -3
- package/dist/src/tools/backup.d.ts.map +0 -1
- package/dist/src/tools/backup.js +0 -191
- package/dist/src/tools/backup.js.map +0 -1
- package/dist/src/tools/changes.d.ts +0 -3
- package/dist/src/tools/changes.d.ts.map +0 -1
- package/dist/src/tools/changes.js +0 -97
- package/dist/src/tools/changes.js.map +0 -1
- package/dist/src/tools/compaction.d.ts +0 -3
- package/dist/src/tools/compaction.d.ts.map +0 -1
- package/dist/src/tools/compaction.js +0 -151
- package/dist/src/tools/compaction.js.map +0 -1
- package/dist/src/tools/conventions.d.ts +0 -3
- package/dist/src/tools/conventions.d.ts.map +0 -1
- package/dist/src/tools/conventions.js +0 -121
- package/dist/src/tools/conventions.js.map +0 -1
- package/dist/src/tools/decisions.d.ts +0 -3
- package/dist/src/tools/decisions.d.ts.map +0 -1
- package/dist/src/tools/decisions.js +0 -136
- package/dist/src/tools/decisions.js.map +0 -1
- package/dist/src/tools/export-import.d.ts +0 -3
- package/dist/src/tools/export-import.d.ts.map +0 -1
- package/dist/src/tools/export-import.js +0 -180
- package/dist/src/tools/export-import.js.map +0 -1
- package/dist/src/tools/file-notes.d.ts +0 -3
- package/dist/src/tools/file-notes.d.ts.map +0 -1
- package/dist/src/tools/file-notes.js +0 -104
- package/dist/src/tools/file-notes.js.map +0 -1
- package/dist/src/tools/intelligence.d.ts +0 -3
- package/dist/src/tools/intelligence.d.ts.map +0 -1
- package/dist/src/tools/intelligence.js +0 -427
- package/dist/src/tools/intelligence.js.map +0 -1
- package/dist/src/tools/milestones.d.ts +0 -3
- package/dist/src/tools/milestones.d.ts.map +0 -1
- package/dist/src/tools/milestones.js +0 -71
- package/dist/src/tools/milestones.js.map +0 -1
- package/dist/src/tools/scheduler.d.ts +0 -3
- package/dist/src/tools/scheduler.d.ts.map +0 -1
- package/dist/src/tools/scheduler.js +0 -363
- package/dist/src/tools/scheduler.js.map +0 -1
- package/dist/src/tools/sessions.d.ts +0 -3
- package/dist/src/tools/sessions.d.ts.map +0 -1
- package/dist/src/tools/sessions.js +0 -356
- package/dist/src/tools/sessions.js.map +0 -1
- package/dist/src/tools/stats.d.ts +0 -3
- package/dist/src/tools/stats.d.ts.map +0 -1
- package/dist/src/tools/stats.js +0 -63
- package/dist/src/tools/stats.js.map +0 -1
- package/dist/src/tools/tasks.d.ts +0 -3
- package/dist/src/tools/tasks.d.ts.map +0 -1
- package/dist/src/tools/tasks.js +0 -206
- package/dist/src/tools/tasks.js.map +0 -1
- package/dist/src/types.d.ts +0 -170
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -5
- package/dist/src/types.js.map +0 -1
- package/dist/src/utils.d.ts +0 -58
- package/dist/src/utils.d.ts.map +0 -1
- package/dist/src/utils.js +0 -190
- package/dist/src/utils.js.map +0 -1
- package/dist/tests/helpers/test-db.d.ts +0 -12
- package/dist/tests/helpers/test-db.d.ts.map +0 -1
- package/dist/tests/helpers/test-db.js +0 -149
- package/dist/tests/helpers/test-db.js.map +0 -1
- package/dist/tests/installer/installer.test.d.ts +0 -2
- package/dist/tests/installer/installer.test.d.ts.map +0 -1
- package/dist/tests/installer/installer.test.js +0 -160
- package/dist/tests/installer/installer.test.js.map +0 -1
- package/dist/tests/repositories/repos.test.d.ts +0 -2
- package/dist/tests/repositories/repos.test.d.ts.map +0 -1
- package/dist/tests/repositories/repos.test.js +0 -220
- package/dist/tests/repositories/repos.test.js.map +0 -1
- package/dist/tools/maintenance.d.ts +0 -3
- package/dist/tools/maintenance.d.ts.map +0 -1
- package/dist/tools/maintenance.js +0 -647
- package/dist/tools/maintenance.js.map +0 -1
- package/dist/tools/memory.d.ts +0 -3
- package/dist/tools/memory.d.ts.map +0 -1
- package/dist/tools/memory.js +0 -446
- package/dist/tools/memory.js.map +0 -1
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// Engram MCP Server — Project Scan Service
|
|
3
|
-
// ============================================================================
|
|
4
|
-
import { scanFileTree, detectLayer, minutesSince, safeJsonParse } from "../utils.js";
|
|
5
|
-
import { SNAPSHOT_TTL_MINUTES, MAX_FILE_TREE_DEPTH } from "../constants.js";
|
|
6
|
-
/**
|
|
7
|
-
* Manages cached project scanning and snapshot generation.
|
|
8
|
-
*/
|
|
9
|
-
export class ProjectScanService {
|
|
10
|
-
repos;
|
|
11
|
-
constructor(repos) {
|
|
12
|
-
this.repos = repos;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Get the project snapshot from cache or perform a fresh scan.
|
|
16
|
-
* Returns null if scanning fails (best-effort).
|
|
17
|
-
*/
|
|
18
|
-
getOrRefresh(projectRoot, forceRefresh = false, maxDepth) {
|
|
19
|
-
try {
|
|
20
|
-
if (!forceRefresh) {
|
|
21
|
-
const cached = this.repos.snapshot.getCached("project_structure");
|
|
22
|
-
if (cached) {
|
|
23
|
-
const age = minutesSince(cached.updated_at);
|
|
24
|
-
if (age < SNAPSHOT_TTL_MINUTES) {
|
|
25
|
-
return safeJsonParse(cached.value, null);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return this.buildFreshSnapshot(projectRoot, maxDepth);
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return null; // scan is best-effort
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Build a fresh project snapshot and cache it.
|
|
37
|
-
*/
|
|
38
|
-
buildFreshSnapshot(projectRoot, maxDepth) {
|
|
39
|
-
const fileTree = scanFileTree(projectRoot, maxDepth ?? MAX_FILE_TREE_DEPTH);
|
|
40
|
-
const layerDist = {};
|
|
41
|
-
for (const f of fileTree) {
|
|
42
|
-
if (f.endsWith("/"))
|
|
43
|
-
continue;
|
|
44
|
-
const layer = detectLayer(f);
|
|
45
|
-
layerDist[layer] = (layerDist[layer] || 0) + 1;
|
|
46
|
-
}
|
|
47
|
-
const fileNotes = this.repos.fileNotes.getAll();
|
|
48
|
-
const decisions = this.repos.decisions.getActive(20);
|
|
49
|
-
const conventions = this.repos.conventions.getActive();
|
|
50
|
-
const timestamp = new Date().toISOString();
|
|
51
|
-
const snapshot = {
|
|
52
|
-
project_root: projectRoot,
|
|
53
|
-
file_tree: fileTree,
|
|
54
|
-
total_files: fileTree.filter((f) => !f.endsWith("/")).length,
|
|
55
|
-
file_notes: fileNotes,
|
|
56
|
-
recent_decisions: decisions,
|
|
57
|
-
active_conventions: conventions,
|
|
58
|
-
layer_distribution: layerDist,
|
|
59
|
-
generated_at: timestamp,
|
|
60
|
-
};
|
|
61
|
-
// Persist to cache
|
|
62
|
-
this.repos.snapshot.upsert("project_structure", JSON.stringify(snapshot), timestamp, SNAPSHOT_TTL_MINUTES);
|
|
63
|
-
return snapshot;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=project-scan.service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-scan.service.js","sourceRoot":"","sources":["../../../src/services/project-scan.service.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,2CAA2C;AAC3C,+EAA+E;AAI/E,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE5E;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACP;IAApB,YAAoB,KAAmB;QAAnB,UAAK,GAAL,KAAK,CAAc;IAAI,CAAC;IAE5C;;;OAGG;IACH,YAAY,CAAC,WAAmB,EAAE,eAAwB,KAAK,EAAE,QAAiB;QAC9E,IAAI,CAAC;YACD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAChB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;gBAClE,IAAI,MAAM,EAAE,CAAC;oBACT,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBAC5C,IAAI,GAAG,GAAG,oBAAoB,EAAE,CAAC;wBAC7B,OAAO,aAAa,CAAkB,MAAM,CAAC,KAAK,EAAE,IAAkC,CAAC,CAAC;oBAC5F,CAAC;gBACL,CAAC;YACL,CAAC;YAED,OAAO,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,IAAI,CAAC,CAAC,sBAAsB;QACvC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,WAAmB,EAAE,QAAiB;QACrD,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,QAAQ,IAAI,mBAAmB,CAAC,CAAC;QAC5E,MAAM,SAAS,GAA2B,EAAE,CAAC;QAC7C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACvB,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QAChD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE3C,MAAM,QAAQ,GAAoB;YAC9B,YAAY,EAAE,WAAW;YACzB,SAAS,EAAE,QAAQ;YACnB,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM;YACpE,UAAU,EAAE,SAAS;YACrB,gBAAgB,EAAE,SAAS;YAC3B,kBAAkB,EAAE,WAAW;YAC/B,kBAAkB,EAAE,SAAS;YAC7B,YAAY,EAAE,SAAS;SAC1B,CAAC;QAEF,mBAAmB;QACnB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CACtB,mBAAmB,EACnB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EACxB,SAAS,EACT,oBAAoB,CACvB,CAAC;QAEF,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../../src/tools/backup.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AASpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4M3D"}
|
package/dist/src/tools/backup.js
DELETED
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// Engram MCP Server — Backup & Restore Tools
|
|
3
|
-
// ============================================================================
|
|
4
|
-
import { z } from "zod";
|
|
5
|
-
import * as fs from "fs";
|
|
6
|
-
import * as path from "path";
|
|
7
|
-
import { getDb, now, getProjectRoot, getDbPath, backupDatabase } from "../database.js";
|
|
8
|
-
import { TOOL_PREFIX, DB_DIR_NAME, BACKUP_DIR_NAME, MAX_BACKUP_COUNT } from "../constants.js";
|
|
9
|
-
import { log } from "../logger.js";
|
|
10
|
-
export function registerBackupTools(server) {
|
|
11
|
-
// ─── BACKUP DATABASE ───────────────────────────────────────────────
|
|
12
|
-
server.registerTool(`${TOOL_PREFIX}_backup`, {
|
|
13
|
-
title: "Backup Database",
|
|
14
|
-
description: `Create a backup of the Engram memory database. Uses SQLite's native backup API for safe, consistent copies. Save to any path — including cloud-synced folders (Dropbox, OneDrive, Google Drive) for cross-machine portability.
|
|
15
|
-
|
|
16
|
-
Args:
|
|
17
|
-
- output_path (string, optional): Where to save the backup (default: .engram/backups/memory-{timestamp}.db)
|
|
18
|
-
- prune_old (boolean, optional): Remove old backups beyond the max count (default: true)
|
|
19
|
-
|
|
20
|
-
Returns:
|
|
21
|
-
BackupInfo with path, size, and timestamp.`,
|
|
22
|
-
inputSchema: {
|
|
23
|
-
output_path: z.string().optional().describe("Custom backup destination path"),
|
|
24
|
-
prune_old: z.boolean().default(true).describe("Prune old backups beyond the max count"),
|
|
25
|
-
},
|
|
26
|
-
annotations: {
|
|
27
|
-
readOnlyHint: false,
|
|
28
|
-
destructiveHint: false,
|
|
29
|
-
idempotentHint: false,
|
|
30
|
-
openWorldHint: true,
|
|
31
|
-
},
|
|
32
|
-
}, async ({ output_path, prune_old }) => {
|
|
33
|
-
const backupPath = backupDatabase(output_path);
|
|
34
|
-
const stats = fs.statSync(backupPath);
|
|
35
|
-
const sizeKb = Math.round(stats.size / 1024);
|
|
36
|
-
let dbVersion = 0;
|
|
37
|
-
try {
|
|
38
|
-
const db = getDb();
|
|
39
|
-
const vRow = db.prepare("SELECT value FROM schema_meta WHERE key = 'version'").get();
|
|
40
|
-
dbVersion = vRow ? parseInt(vRow.value, 10) : 0;
|
|
41
|
-
}
|
|
42
|
-
catch { /* skip */ }
|
|
43
|
-
const info = {
|
|
44
|
-
path: backupPath,
|
|
45
|
-
size_kb: sizeKb,
|
|
46
|
-
created_at: now(),
|
|
47
|
-
database_version: dbVersion,
|
|
48
|
-
};
|
|
49
|
-
if (prune_old && !output_path) {
|
|
50
|
-
const backupDir = path.join(getProjectRoot(), DB_DIR_NAME, BACKUP_DIR_NAME);
|
|
51
|
-
try {
|
|
52
|
-
const files = fs.readdirSync(backupDir)
|
|
53
|
-
.filter(f => f.startsWith("memory-") && f.endsWith(".db"))
|
|
54
|
-
.map(f => ({
|
|
55
|
-
name: f,
|
|
56
|
-
path: path.join(backupDir, f),
|
|
57
|
-
mtime: fs.statSync(path.join(backupDir, f)).mtimeMs,
|
|
58
|
-
}))
|
|
59
|
-
.sort((a, b) => b.mtime - a.mtime);
|
|
60
|
-
if (files.length > MAX_BACKUP_COUNT) {
|
|
61
|
-
const toDelete = files.slice(MAX_BACKUP_COUNT);
|
|
62
|
-
for (const f of toDelete) {
|
|
63
|
-
fs.unlinkSync(f.path);
|
|
64
|
-
}
|
|
65
|
-
info.pruned = toDelete.length;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
catch { /* skip pruning */ }
|
|
69
|
-
}
|
|
70
|
-
return {
|
|
71
|
-
content: [{
|
|
72
|
-
type: "text",
|
|
73
|
-
text: JSON.stringify({
|
|
74
|
-
...info,
|
|
75
|
-
message: `Backup created successfully at ${backupPath} (${sizeKb} KB).`,
|
|
76
|
-
}, null, 2),
|
|
77
|
-
}],
|
|
78
|
-
};
|
|
79
|
-
});
|
|
80
|
-
// ─── RESTORE DATABASE ──────────────────────────────────────────────
|
|
81
|
-
server.registerTool(`${TOOL_PREFIX}_restore`, {
|
|
82
|
-
title: "Restore Database",
|
|
83
|
-
description: `Restore the Engram memory database from a backup file. Creates a safety backup of the current database before overwriting. The MCP server will need to be restarted after restore.
|
|
84
|
-
|
|
85
|
-
Args:
|
|
86
|
-
- input_path (string): Path to the backup .db file
|
|
87
|
-
- confirm (string): Must be "yes-restore" to execute
|
|
88
|
-
|
|
89
|
-
Returns:
|
|
90
|
-
Confirmation and instructions to restart.`,
|
|
91
|
-
inputSchema: {
|
|
92
|
-
input_path: z.string().describe("Path to the backup .db file"),
|
|
93
|
-
confirm: z.string().describe('Type "yes-restore" to confirm'),
|
|
94
|
-
},
|
|
95
|
-
annotations: {
|
|
96
|
-
readOnlyHint: false,
|
|
97
|
-
destructiveHint: true,
|
|
98
|
-
idempotentHint: false,
|
|
99
|
-
openWorldHint: true,
|
|
100
|
-
},
|
|
101
|
-
}, async ({ input_path, confirm }) => {
|
|
102
|
-
if (confirm !== "yes-restore") {
|
|
103
|
-
return {
|
|
104
|
-
isError: true,
|
|
105
|
-
content: [{ type: "text", text: 'Safety check: set confirm to "yes-restore" to proceed.' }],
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
const projectRoot = getProjectRoot();
|
|
109
|
-
const inputPath = path.isAbsolute(input_path) ? input_path : path.join(projectRoot, input_path);
|
|
110
|
-
if (!fs.existsSync(inputPath)) {
|
|
111
|
-
return { isError: true, content: [{ type: "text", text: `Backup file not found: ${inputPath}` }] };
|
|
112
|
-
}
|
|
113
|
-
let safetyBackupPath = "";
|
|
114
|
-
try {
|
|
115
|
-
safetyBackupPath = backupDatabase();
|
|
116
|
-
log.info(`Safety backup created before restore: ${safetyBackupPath}`);
|
|
117
|
-
}
|
|
118
|
-
catch (e) {
|
|
119
|
-
return {
|
|
120
|
-
isError: true,
|
|
121
|
-
content: [{ type: "text", text: `Failed to create safety backup before restore: ${e}. Aborting.` }],
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
const dbPath = getDbPath();
|
|
125
|
-
try {
|
|
126
|
-
fs.copyFileSync(inputPath, dbPath);
|
|
127
|
-
}
|
|
128
|
-
catch (e) {
|
|
129
|
-
return {
|
|
130
|
-
isError: true,
|
|
131
|
-
content: [{ type: "text", text: `Failed to restore: ${e}. Your previous database is backed up at ${safetyBackupPath}.` }],
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
return {
|
|
135
|
-
content: [{
|
|
136
|
-
type: "text",
|
|
137
|
-
text: JSON.stringify({
|
|
138
|
-
restored_from: inputPath,
|
|
139
|
-
safety_backup: safetyBackupPath,
|
|
140
|
-
message: "Database restored successfully. Please RESTART the MCP server to load the restored database. A safety backup of the previous database was created.",
|
|
141
|
-
}, null, 2),
|
|
142
|
-
}],
|
|
143
|
-
};
|
|
144
|
-
});
|
|
145
|
-
// ─── LIST BACKUPS ──────────────────────────────────────────────────
|
|
146
|
-
server.registerTool(`${TOOL_PREFIX}_list_backups`, {
|
|
147
|
-
title: "List Backups",
|
|
148
|
-
description: `List all available backup files in the default backup directory.
|
|
149
|
-
|
|
150
|
-
Returns:
|
|
151
|
-
Array of backup files with sizes and timestamps.`,
|
|
152
|
-
inputSchema: {},
|
|
153
|
-
annotations: {
|
|
154
|
-
readOnlyHint: true,
|
|
155
|
-
destructiveHint: false,
|
|
156
|
-
idempotentHint: true,
|
|
157
|
-
openWorldHint: false,
|
|
158
|
-
},
|
|
159
|
-
}, async () => {
|
|
160
|
-
const backupDir = path.join(getProjectRoot(), DB_DIR_NAME, BACKUP_DIR_NAME);
|
|
161
|
-
if (!fs.existsSync(backupDir)) {
|
|
162
|
-
return {
|
|
163
|
-
content: [{ type: "text", text: JSON.stringify({ backups: [], message: "No backups found." }, null, 2) }],
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
const files = fs.readdirSync(backupDir)
|
|
167
|
-
.filter(f => f.endsWith(".db"))
|
|
168
|
-
.map(f => {
|
|
169
|
-
const fullPath = path.join(backupDir, f);
|
|
170
|
-
const stats = fs.statSync(fullPath);
|
|
171
|
-
return {
|
|
172
|
-
filename: f,
|
|
173
|
-
path: fullPath,
|
|
174
|
-
size_kb: Math.round(stats.size / 1024),
|
|
175
|
-
created_at: stats.mtime.toISOString(),
|
|
176
|
-
};
|
|
177
|
-
})
|
|
178
|
-
.sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime());
|
|
179
|
-
return {
|
|
180
|
-
content: [{
|
|
181
|
-
type: "text",
|
|
182
|
-
text: JSON.stringify({
|
|
183
|
-
backup_directory: backupDir,
|
|
184
|
-
count: files.length,
|
|
185
|
-
backups: files,
|
|
186
|
-
}, null, 2),
|
|
187
|
-
}],
|
|
188
|
-
};
|
|
189
|
-
});
|
|
190
|
-
}
|
|
191
|
-
//# sourceMappingURL=backup.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"backup.js","sourceRoot":"","sources":["../../../src/tools/backup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../../../src/tools/changes.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiH3D"}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// Engram MCP Server — Change Tracking Tools
|
|
3
|
-
// ============================================================================
|
|
4
|
-
import { z } from "zod";
|
|
5
|
-
import { getDb, now, getCurrentSessionId } from "../database.js";
|
|
6
|
-
import { TOOL_PREFIX } from "../constants.js";
|
|
7
|
-
export function registerChangeTools(server) {
|
|
8
|
-
server.registerTool(`${TOOL_PREFIX}_record_change`, {
|
|
9
|
-
title: "Record Change",
|
|
10
|
-
description: `Record a file change so future sessions know what happened and why. Call this after making significant modifications. Bulk recording is supported — pass multiple changes at once.
|
|
11
|
-
|
|
12
|
-
Args:
|
|
13
|
-
- changes (array): Array of change objects, each with:
|
|
14
|
-
- file_path (string): Relative path to the changed file
|
|
15
|
-
- change_type: "created" | "modified" | "deleted" | "refactored" | "renamed" | "moved" | "config_changed"
|
|
16
|
-
- description (string): What was changed and why
|
|
17
|
-
- diff_summary (string, optional): Brief summary of the diff
|
|
18
|
-
- impact_scope: "local" | "module" | "cross_module" | "global" (default: "local")
|
|
19
|
-
|
|
20
|
-
Returns:
|
|
21
|
-
Confirmation with number of changes recorded.`,
|
|
22
|
-
inputSchema: {
|
|
23
|
-
changes: z.array(z.object({
|
|
24
|
-
file_path: z.string().describe("Relative path to the changed file"),
|
|
25
|
-
change_type: z.enum(["created", "modified", "deleted", "refactored", "renamed", "moved", "config_changed"]),
|
|
26
|
-
description: z.string().describe("What was changed and why"),
|
|
27
|
-
diff_summary: z.string().optional().describe("Brief diff summary"),
|
|
28
|
-
impact_scope: z.enum(["local", "module", "cross_module", "global"]).default("local"),
|
|
29
|
-
})).min(1).describe("Array of changes to record"),
|
|
30
|
-
},
|
|
31
|
-
annotations: {
|
|
32
|
-
readOnlyHint: false,
|
|
33
|
-
destructiveHint: false,
|
|
34
|
-
idempotentHint: false,
|
|
35
|
-
openWorldHint: false,
|
|
36
|
-
},
|
|
37
|
-
}, async ({ changes }) => {
|
|
38
|
-
const db = getDb();
|
|
39
|
-
const timestamp = now();
|
|
40
|
-
const sessionId = getCurrentSessionId();
|
|
41
|
-
const insert = db.prepare("INSERT INTO changes (session_id, timestamp, file_path, change_type, description, diff_summary, impact_scope) VALUES (?, ?, ?, ?, ?, ?, ?)");
|
|
42
|
-
const transaction = db.transaction(() => {
|
|
43
|
-
for (const c of changes) {
|
|
44
|
-
insert.run(sessionId, timestamp, c.file_path, c.change_type, c.description, c.diff_summary || null, c.impact_scope);
|
|
45
|
-
if (sessionId) {
|
|
46
|
-
db.prepare("UPDATE file_notes SET last_modified_session = ? WHERE file_path = ?").run(sessionId, c.file_path);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
transaction();
|
|
51
|
-
return {
|
|
52
|
-
content: [{
|
|
53
|
-
type: "text",
|
|
54
|
-
text: `Recorded ${changes.length} change(s) in session #${sessionId ?? "none"}.`,
|
|
55
|
-
}],
|
|
56
|
-
};
|
|
57
|
-
});
|
|
58
|
-
server.registerTool(`${TOOL_PREFIX}_get_file_history`, {
|
|
59
|
-
title: "Get File History",
|
|
60
|
-
description: `Get the complete change history for a specific file — all recorded modifications, related decisions, and file notes.
|
|
61
|
-
|
|
62
|
-
Args:
|
|
63
|
-
- file_path (string): Path to the file
|
|
64
|
-
- limit (number, optional): Max changes to return (default 20)
|
|
65
|
-
|
|
66
|
-
Returns:
|
|
67
|
-
File notes, change history, and related decisions.`,
|
|
68
|
-
inputSchema: {
|
|
69
|
-
file_path: z.string().describe("Relative path to the file"),
|
|
70
|
-
limit: z.number().int().min(1).max(100).default(20).describe("Max changes to return"),
|
|
71
|
-
},
|
|
72
|
-
annotations: {
|
|
73
|
-
readOnlyHint: true,
|
|
74
|
-
destructiveHint: false,
|
|
75
|
-
idempotentHint: true,
|
|
76
|
-
openWorldHint: false,
|
|
77
|
-
},
|
|
78
|
-
}, async ({ file_path, limit }) => {
|
|
79
|
-
const db = getDb();
|
|
80
|
-
const notes = db.prepare("SELECT * FROM file_notes WHERE file_path = ?").get(file_path);
|
|
81
|
-
const changes = db.prepare("SELECT * FROM changes WHERE file_path = ? ORDER BY timestamp DESC LIMIT ?").all(file_path, limit);
|
|
82
|
-
const decisions = db.prepare("SELECT * FROM decisions WHERE affected_files LIKE ? AND status = 'active' ORDER BY timestamp DESC").all(`%${file_path}%`);
|
|
83
|
-
return {
|
|
84
|
-
content: [{
|
|
85
|
-
type: "text",
|
|
86
|
-
text: JSON.stringify({
|
|
87
|
-
file_path,
|
|
88
|
-
notes: notes || null,
|
|
89
|
-
change_count: changes.length,
|
|
90
|
-
changes,
|
|
91
|
-
related_decisions: decisions,
|
|
92
|
-
}, null, 2),
|
|
93
|
-
}],
|
|
94
|
-
};
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
//# sourceMappingURL=changes.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"changes.js","sourceRoot":"","sources":["../../../src/tools/changes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/tools/compaction.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoL/D"}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
// ============================================================================
|
|
2
|
-
// Engram MCP Server — Compaction & Clear Tools
|
|
3
|
-
// ============================================================================
|
|
4
|
-
import { z } from "zod";
|
|
5
|
-
import { getDb, now, getDbSizeKb, backupDatabase } from "../database.js";
|
|
6
|
-
import { TOOL_PREFIX, COMPACTION_THRESHOLD_SESSIONS } from "../constants.js";
|
|
7
|
-
import { log } from "../logger.js";
|
|
8
|
-
export function registerCompactionTools(server) {
|
|
9
|
-
// ─── COMPACT MEMORY ─────────────────────────────────────────────────
|
|
10
|
-
server.registerTool(`${TOOL_PREFIX}_compact`, {
|
|
11
|
-
title: "Compact Memory",
|
|
12
|
-
description: `Compact old session data to reduce database size. Merges change records from old sessions into summaries and removes granular entries. Sessions newer than the threshold are preserved in full. Automatically creates a backup before compacting.
|
|
13
|
-
|
|
14
|
-
Args:
|
|
15
|
-
- keep_sessions (number, optional): Number of recent sessions to keep in full detail (default: ${COMPACTION_THRESHOLD_SESSIONS})
|
|
16
|
-
- max_age_days (number, optional): Also remove sessions older than N days (default: no age limit)
|
|
17
|
-
- dry_run (boolean, optional): Show what would be compacted without actually doing it (default: true)
|
|
18
|
-
|
|
19
|
-
Returns:
|
|
20
|
-
CompactionResult with counts and freed storage.`,
|
|
21
|
-
inputSchema: {
|
|
22
|
-
keep_sessions: z.number().int().min(5).default(COMPACTION_THRESHOLD_SESSIONS).describe("Recent sessions to preserve"),
|
|
23
|
-
max_age_days: z.number().int().min(7).optional().describe("Remove sessions older than N days"),
|
|
24
|
-
dry_run: z.boolean().default(true).describe("Preview mode — no changes made"),
|
|
25
|
-
},
|
|
26
|
-
annotations: {
|
|
27
|
-
readOnlyHint: false,
|
|
28
|
-
destructiveHint: true,
|
|
29
|
-
idempotentHint: false,
|
|
30
|
-
openWorldHint: false,
|
|
31
|
-
},
|
|
32
|
-
}, async ({ keep_sessions, max_age_days, dry_run }) => {
|
|
33
|
-
const db = getDb();
|
|
34
|
-
const cutoff = db.prepare("SELECT id FROM sessions ORDER BY id DESC LIMIT 1 OFFSET ?").get(keep_sessions);
|
|
35
|
-
if (!cutoff) {
|
|
36
|
-
return {
|
|
37
|
-
content: [{ type: "text", text: "Not enough sessions to compact. Nothing to do." }],
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
let sessionsQuery = "SELECT COUNT(*) as c FROM sessions WHERE id <= ? AND ended_at IS NOT NULL";
|
|
41
|
-
const sessionsParams = [cutoff.id];
|
|
42
|
-
if (max_age_days) {
|
|
43
|
-
const cutoffDate = new Date(Date.now() - max_age_days * 86400000).toISOString();
|
|
44
|
-
sessionsQuery += " AND started_at < ?";
|
|
45
|
-
sessionsParams.push(cutoffDate);
|
|
46
|
-
}
|
|
47
|
-
const sessionsToCompact = db.prepare(sessionsQuery).get(...sessionsParams).c;
|
|
48
|
-
const changesToSummarize = db.prepare("SELECT COUNT(*) as c FROM changes WHERE session_id <= ?").get(cutoff.id).c;
|
|
49
|
-
const sizeBefore = getDbSizeKb();
|
|
50
|
-
if (dry_run) {
|
|
51
|
-
return {
|
|
52
|
-
content: [{
|
|
53
|
-
type: "text",
|
|
54
|
-
text: JSON.stringify({
|
|
55
|
-
dry_run: true,
|
|
56
|
-
would_compact: { sessions: sessionsToCompact, changes: changesToSummarize },
|
|
57
|
-
message: `Would compact ${sessionsToCompact} sessions and summarize ${changesToSummarize} change records. Run with dry_run=false to execute.`,
|
|
58
|
-
}, null, 2),
|
|
59
|
-
}],
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
let backupPath = "";
|
|
63
|
-
try {
|
|
64
|
-
backupPath = backupDatabase();
|
|
65
|
-
log.info(`Auto-backup created before compaction: ${backupPath}`);
|
|
66
|
-
}
|
|
67
|
-
catch (e) {
|
|
68
|
-
log.warn(`Failed to create backup before compaction: ${e}`);
|
|
69
|
-
}
|
|
70
|
-
const compact = db.transaction(() => {
|
|
71
|
-
const oldSessions = db.prepare("SELECT id, summary FROM sessions WHERE id <= ? AND ended_at IS NOT NULL").all(cutoff.id);
|
|
72
|
-
for (const session of oldSessions) {
|
|
73
|
-
const changes = db.prepare("SELECT change_type, file_path, description FROM changes WHERE session_id = ?").all(session.id);
|
|
74
|
-
if (changes.length > 0) {
|
|
75
|
-
const summaryDesc = changes.map(c => `[${c.change_type}] ${c.file_path}: ${c.description}`).join("; ");
|
|
76
|
-
db.prepare("INSERT INTO changes (session_id, timestamp, file_path, change_type, description, impact_scope) VALUES (?, ?, ?, ?, ?, ?)").run(session.id, now(), "(compacted)", "modified", `Compacted ${changes.length} changes: ${summaryDesc.slice(0, 2000)}`, "global");
|
|
77
|
-
}
|
|
78
|
-
db.prepare("DELETE FROM changes WHERE session_id = ? AND file_path != '(compacted)'").run(session.id);
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
compact();
|
|
82
|
-
db.exec("VACUUM");
|
|
83
|
-
const sizeAfter = getDbSizeKb();
|
|
84
|
-
const result = {
|
|
85
|
-
sessions_compacted: sessionsToCompact,
|
|
86
|
-
changes_summarized: changesToSummarize,
|
|
87
|
-
storage_freed_kb: Math.max(0, sizeBefore - sizeAfter),
|
|
88
|
-
};
|
|
89
|
-
return {
|
|
90
|
-
content: [{
|
|
91
|
-
type: "text",
|
|
92
|
-
text: JSON.stringify({
|
|
93
|
-
...result,
|
|
94
|
-
backup_path: backupPath || null,
|
|
95
|
-
message: `Compaction complete. ${backupPath ? `Backup saved at ${backupPath}.` : ""}`,
|
|
96
|
-
}, null, 2),
|
|
97
|
-
}],
|
|
98
|
-
};
|
|
99
|
-
});
|
|
100
|
-
// ─── CLEAR MEMORY ───────────────────────────────────────────────────
|
|
101
|
-
server.registerTool(`${TOOL_PREFIX}_clear`, {
|
|
102
|
-
title: "Clear Memory",
|
|
103
|
-
description: `Clear specific tables or the entire memory database. USE WITH EXTREME CAUTION. This is irreversible. A backup is automatically created before clearing.
|
|
104
|
-
|
|
105
|
-
Args:
|
|
106
|
-
- scope: "all" | "sessions" | "changes" | "decisions" | "file_notes" | "conventions" | "tasks" | "milestones" | "cache"
|
|
107
|
-
- confirm (string): Must be "yes-delete-permanently" to execute
|
|
108
|
-
|
|
109
|
-
Returns:
|
|
110
|
-
Confirmation of what was cleared.`,
|
|
111
|
-
inputSchema: {
|
|
112
|
-
scope: z.enum(["all", "sessions", "changes", "decisions", "file_notes", "conventions", "tasks", "milestones", "cache"]),
|
|
113
|
-
confirm: z.string().describe('Type "yes-delete-permanently" to confirm'),
|
|
114
|
-
},
|
|
115
|
-
annotations: {
|
|
116
|
-
readOnlyHint: false,
|
|
117
|
-
destructiveHint: true,
|
|
118
|
-
idempotentHint: true,
|
|
119
|
-
openWorldHint: false,
|
|
120
|
-
},
|
|
121
|
-
}, async ({ scope, confirm }) => {
|
|
122
|
-
if (confirm !== "yes-delete-permanently") {
|
|
123
|
-
return {
|
|
124
|
-
isError: true,
|
|
125
|
-
content: [{ type: "text", text: 'Safety check: set confirm to "yes-delete-permanently" to proceed.' }],
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
let backupPath = "";
|
|
129
|
-
try {
|
|
130
|
-
backupPath = backupDatabase();
|
|
131
|
-
log.info(`Auto-backup created before clear: ${backupPath}`);
|
|
132
|
-
}
|
|
133
|
-
catch (e) {
|
|
134
|
-
log.warn(`Failed to create backup before clear: ${e}`);
|
|
135
|
-
}
|
|
136
|
-
const db = getDb();
|
|
137
|
-
const tables = scope === "all"
|
|
138
|
-
? ["sessions", "changes", "decisions", "file_notes", "conventions", "tasks", "milestones", "snapshot_cache"]
|
|
139
|
-
: scope === "cache" ? ["snapshot_cache"] : [scope];
|
|
140
|
-
for (const table of tables) {
|
|
141
|
-
db.prepare(`DELETE FROM ${table}`).run();
|
|
142
|
-
}
|
|
143
|
-
return {
|
|
144
|
-
content: [{
|
|
145
|
-
type: "text",
|
|
146
|
-
text: `Cleared: ${tables.join(", ")}. Memory has been reset.${backupPath ? ` Backup saved at ${backupPath}.` : ""}`,
|
|
147
|
-
}],
|
|
148
|
-
};
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
//# sourceMappingURL=compaction.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../../src/tools/compaction.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"conventions.d.ts","sourceRoot":"","sources":["../../../src/tools/conventions.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiI/D"}
|