@vheins/local-memory-mcp 0.4.12 → 0.5.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/README.md +21 -0
- package/bin/mcp-memory-server.js +1 -1
- package/dist/dashboard/public/assets/index-KxrQ6fPK.css +1 -0
- package/dist/dashboard/public/assets/index-Lu37nzOi.js +72 -0
- package/dist/dashboard/public/index.html +11 -1772
- package/dist/dashboard/server.js +115 -5
- package/dist/dashboard/server.js.map +1 -1
- package/dist/mcp/capabilities.d.ts +22 -0
- package/dist/mcp/capabilities.d.ts.map +1 -0
- package/dist/mcp/capabilities.js +38 -0
- package/dist/mcp/capabilities.js.map +1 -0
- package/dist/mcp/client.js +3 -3
- package/dist/mcp/client.js.map +1 -1
- package/dist/mcp/completion.d.ts +25 -0
- package/dist/mcp/completion.d.ts.map +1 -0
- package/dist/mcp/completion.js +127 -0
- package/dist/mcp/completion.js.map +1 -0
- package/dist/mcp/prompts/registry.d.ts +314 -0
- package/dist/mcp/prompts/registry.d.ts.map +1 -0
- package/dist/mcp/prompts/registry.js +936 -0
- package/dist/mcp/prompts/registry.js.map +1 -0
- package/dist/mcp/resources/index.d.ts +68 -0
- package/dist/mcp/resources/index.d.ts.map +1 -0
- package/dist/mcp/resources/index.js +323 -0
- package/dist/mcp/resources/index.js.map +1 -0
- package/dist/mcp/router.d.ts +14 -0
- package/dist/mcp/router.d.ts.map +1 -0
- package/dist/mcp/router.js +242 -0
- package/dist/mcp/router.js.map +1 -0
- package/dist/mcp/server.d.ts +3 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +338 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/storage/sqlite.d.ts +83 -0
- package/dist/mcp/storage/sqlite.d.ts.map +1 -0
- package/dist/mcp/storage/sqlite.js +1237 -0
- package/dist/mcp/storage/sqlite.js.map +1 -0
- package/dist/mcp/storage/vectors.d.ts +19 -0
- package/dist/mcp/storage/vectors.d.ts.map +1 -0
- package/dist/mcp/storage/vectors.js +74 -0
- package/dist/mcp/storage/vectors.js.map +1 -0
- package/dist/mcp/storage/vectors.stub.d.ts +12 -0
- package/dist/mcp/storage/vectors.stub.d.ts.map +1 -0
- package/dist/mcp/storage/vectors.stub.js +88 -0
- package/dist/mcp/storage/vectors.stub.js.map +1 -0
- package/dist/mcp/tests/client.test.d.ts +2 -0
- package/dist/mcp/tests/client.test.d.ts.map +1 -0
- package/dist/mcp/tests/client.test.js +130 -0
- package/dist/mcp/tests/client.test.js.map +1 -0
- package/dist/mcp/tests/dashboard.test.d.ts +2 -0
- package/dist/mcp/tests/dashboard.test.d.ts.map +1 -0
- package/dist/mcp/tests/dashboard.test.js +370 -0
- package/dist/mcp/tests/dashboard.test.js.map +1 -0
- package/dist/mcp/tests/e2e.test.d.ts +2 -0
- package/dist/mcp/tests/e2e.test.d.ts.map +1 -0
- package/dist/mcp/tests/e2e.test.js +250 -0
- package/dist/mcp/tests/e2e.test.js.map +1 -0
- package/dist/mcp/tests/index.test.d.ts +2 -0
- package/dist/mcp/tests/index.test.d.ts.map +1 -0
- package/dist/mcp/tests/index.test.js +185 -0
- package/dist/mcp/tests/index.test.js.map +1 -0
- package/dist/mcp/tests/logger.test.d.ts +2 -0
- package/dist/mcp/tests/logger.test.d.ts.map +1 -0
- package/dist/mcp/tests/logger.test.js +104 -0
- package/dist/mcp/tests/logger.test.js.map +1 -0
- package/dist/mcp/tests/memory.bulk.test.d.ts +2 -0
- package/dist/mcp/tests/memory.bulk.test.d.ts.map +1 -0
- package/dist/mcp/tests/memory.bulk.test.js +52 -0
- package/dist/mcp/tests/memory.bulk.test.js.map +1 -0
- package/dist/mcp/tests/memory.search.test.d.ts +2 -0
- package/dist/mcp/tests/memory.search.test.d.ts.map +1 -0
- package/dist/mcp/tests/memory.search.test.js +181 -0
- package/dist/mcp/tests/memory.search.test.js.map +1 -0
- package/dist/mcp/tests/normalize.test.d.ts +2 -0
- package/dist/mcp/tests/normalize.test.d.ts.map +1 -0
- package/dist/mcp/tests/normalize.test.js +181 -0
- package/dist/mcp/tests/normalize.test.js.map +1 -0
- package/dist/mcp/tests/query-expander.test.d.ts +2 -0
- package/dist/mcp/tests/query-expander.test.d.ts.map +1 -0
- package/dist/mcp/tests/query-expander.test.js +33 -0
- package/dist/mcp/tests/query-expander.test.js.map +1 -0
- package/dist/mcp/tests/router.test.d.ts +2 -0
- package/dist/mcp/tests/router.test.d.ts.map +1 -0
- package/dist/mcp/tests/router.test.js +470 -0
- package/dist/mcp/tests/router.test.js.map +1 -0
- package/dist/mcp/tests/sqlite.test.d.ts +2 -0
- package/dist/mcp/tests/sqlite.test.d.ts.map +1 -0
- package/dist/mcp/tests/sqlite.test.js +367 -0
- package/dist/mcp/tests/sqlite.test.js.map +1 -0
- package/dist/mcp/tests/tasks-search.test.d.ts +2 -0
- package/dist/mcp/tests/tasks-search.test.d.ts.map +1 -0
- package/dist/mcp/tests/tasks-search.test.js +154 -0
- package/dist/mcp/tests/tasks-search.test.js.map +1 -0
- package/dist/mcp/tests/tasks-transition.test.d.ts +2 -0
- package/dist/mcp/tests/tasks-transition.test.d.ts.map +1 -0
- package/dist/mcp/tests/tasks-transition.test.js +174 -0
- package/dist/mcp/tests/tasks-transition.test.js.map +1 -0
- package/dist/mcp/tests/tasks.bulk.test.d.ts +2 -0
- package/dist/mcp/tests/tasks.bulk.test.d.ts.map +1 -0
- package/dist/mcp/tests/tasks.bulk.test.js +254 -0
- package/dist/mcp/tests/tasks.bulk.test.js.map +1 -0
- package/dist/mcp/tests/tasks.e2e.test.d.ts +2 -0
- package/dist/mcp/tests/tasks.e2e.test.d.ts.map +1 -0
- package/dist/mcp/tests/tasks.e2e.test.js +289 -0
- package/dist/mcp/tests/tasks.e2e.test.js.map +1 -0
- package/dist/mcp/tests/tasks.pending-limit-refined.test.d.ts +2 -0
- package/dist/mcp/tests/tasks.pending-limit-refined.test.d.ts.map +1 -0
- package/dist/mcp/tests/tasks.pending-limit-refined.test.js +72 -0
- package/dist/mcp/tests/tasks.pending-limit-refined.test.js.map +1 -0
- package/dist/mcp/tests/v2-features.test.d.ts +2 -0
- package/dist/mcp/tests/v2-features.test.d.ts.map +1 -0
- package/dist/mcp/tests/v2-features.test.js +209 -0
- package/dist/mcp/tests/v2-features.test.js.map +1 -0
- package/dist/mcp/tools/memory.acknowledge.d.ts +4 -0
- package/dist/mcp/tools/memory.acknowledge.d.ts.map +1 -0
- package/dist/mcp/tools/memory.acknowledge.js +30 -0
- package/dist/mcp/tools/memory.acknowledge.js.map +1 -0
- package/dist/mcp/tools/memory.bulk-delete.d.ts +4 -0
- package/dist/mcp/tools/memory.bulk-delete.d.ts.map +1 -0
- package/dist/mcp/tools/memory.bulk-delete.js +39 -0
- package/dist/mcp/tools/memory.bulk-delete.js.map +1 -0
- package/dist/mcp/tools/memory.delete.d.ts +9 -0
- package/dist/mcp/tools/memory.delete.d.ts.map +1 -0
- package/dist/mcp/tools/memory.delete.js +39 -0
- package/dist/mcp/tools/memory.delete.js.map +1 -0
- package/dist/mcp/tools/memory.recap.d.ts +4 -0
- package/dist/mcp/tools/memory.recap.d.ts.map +1 -0
- package/dist/mcp/tools/memory.recap.js +90 -0
- package/dist/mcp/tools/memory.recap.js.map +1 -0
- package/dist/mcp/tools/memory.search.d.ts +5 -0
- package/dist/mcp/tools/memory.search.d.ts.map +1 -0
- package/dist/mcp/tools/memory.search.js +134 -0
- package/dist/mcp/tools/memory.search.js.map +1 -0
- package/dist/mcp/tools/memory.store.d.ts +5 -0
- package/dist/mcp/tools/memory.store.d.ts.map +1 -0
- package/dist/mcp/tools/memory.store.js +117 -0
- package/dist/mcp/tools/memory.store.js.map +1 -0
- package/dist/mcp/tools/memory.summarize.d.ts +4 -0
- package/dist/mcp/tools/memory.summarize.d.ts.map +1 -0
- package/dist/mcp/tools/memory.summarize.js +31 -0
- package/dist/mcp/tools/memory.summarize.js.map +1 -0
- package/dist/mcp/tools/memory.synthesize.d.ts +14 -0
- package/dist/mcp/tools/memory.synthesize.d.ts.map +1 -0
- package/dist/mcp/tools/memory.synthesize.js +228 -0
- package/dist/mcp/tools/memory.synthesize.js.map +1 -0
- package/dist/mcp/tools/memory.update.d.ts +5 -0
- package/dist/mcp/tools/memory.update.d.ts.map +1 -0
- package/dist/mcp/tools/memory.update.js +73 -0
- package/dist/mcp/tools/memory.update.js.map +1 -0
- package/dist/mcp/tools/schemas.d.ts +2762 -0
- package/dist/mcp/tools/schemas.d.ts.map +1 -0
- package/dist/mcp/tools/schemas.js +952 -0
- package/dist/mcp/tools/schemas.js.map +1 -0
- package/dist/mcp/tools/task.bulk-manage.d.ts +4 -0
- package/dist/mcp/tools/task.bulk-manage.d.ts.map +1 -0
- package/dist/mcp/tools/task.bulk-manage.js +146 -0
- package/dist/mcp/tools/task.bulk-manage.js.map +1 -0
- package/dist/mcp/tools/task.manage.d.ts +16 -0
- package/dist/mcp/tools/task.manage.d.ts.map +1 -0
- package/dist/mcp/tools/task.manage.js +395 -0
- package/dist/mcp/tools/task.manage.js.map +1 -0
- package/dist/mcp/types.d.ts +87 -0
- package/dist/mcp/types.d.ts.map +1 -0
- package/dist/mcp/types.js +3 -0
- package/dist/mcp/types.js.map +1 -0
- package/dist/mcp/utils/completion.d.ts +2 -0
- package/dist/mcp/utils/completion.d.ts.map +1 -0
- package/dist/mcp/utils/completion.js +28 -0
- package/dist/mcp/utils/completion.js.map +1 -0
- package/dist/mcp/utils/git-scope.d.ts +8 -0
- package/dist/mcp/utils/git-scope.d.ts.map +1 -0
- package/dist/mcp/utils/git-scope.js +38 -0
- package/dist/mcp/utils/git-scope.js.map +1 -0
- package/dist/mcp/utils/logger.d.ts +25 -0
- package/dist/mcp/utils/logger.d.ts.map +1 -0
- package/dist/mcp/utils/logger.js +152 -0
- package/dist/mcp/utils/logger.js.map +1 -0
- package/dist/mcp/utils/mcp-response.d.ts +96 -0
- package/dist/mcp/utils/mcp-response.d.ts.map +1 -0
- package/dist/mcp/utils/mcp-response.js +131 -0
- package/dist/mcp/utils/mcp-response.js.map +1 -0
- package/dist/mcp/utils/normalize.d.ts +9 -0
- package/dist/mcp/utils/normalize.d.ts.map +1 -0
- package/dist/mcp/utils/normalize.js +62 -0
- package/dist/mcp/utils/normalize.js.map +1 -0
- package/dist/mcp/utils/pagination.d.ts +6 -0
- package/dist/mcp/utils/pagination.d.ts.map +1 -0
- package/dist/mcp/utils/pagination.js +32 -0
- package/dist/mcp/utils/pagination.js.map +1 -0
- package/dist/mcp/utils/query-expander.d.ts +2 -0
- package/dist/mcp/utils/query-expander.d.ts.map +1 -0
- package/dist/mcp/utils/query-expander.js +29 -0
- package/dist/mcp/utils/query-expander.js.map +1 -0
- package/dist/storage/sqlite.d.ts +3 -0
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +38 -9
- package/dist/storage/sqlite.js.map +1 -1
- package/package.json +17 -5
- package/dist/dashboard/public/app.js +0 -2779
- package/dist/dashboard/public/chart.js +0 -0
- package/dist/dashboard/public/screenshot.png +0 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { MemoryAcknowledgeSchema } from "./schemas.js";
|
|
2
|
+
import { logger } from "../utils/logger.js";
|
|
3
|
+
import { createMcpResponse } from "../utils/mcp-response.js";
|
|
4
|
+
export async function handleMemoryAcknowledge(params, db) {
|
|
5
|
+
// Validate input
|
|
6
|
+
const validated = MemoryAcknowledgeSchema.parse(params);
|
|
7
|
+
// Check if memory exists
|
|
8
|
+
const memory = db.getById(validated.memory_id);
|
|
9
|
+
if (!memory) {
|
|
10
|
+
throw new Error(`Memory with ID ${validated.memory_id} not found.`);
|
|
11
|
+
}
|
|
12
|
+
// Update statistics based on status
|
|
13
|
+
if (validated.status === "used") {
|
|
14
|
+
db.incrementRecallCount(memory.id);
|
|
15
|
+
logger.info("[MCP] memory.acknowledge - used", { id: memory.id, context: validated.application_context });
|
|
16
|
+
}
|
|
17
|
+
else if (validated.status === "contradictory") {
|
|
18
|
+
// Flag for potential manual audit later
|
|
19
|
+
logger.warn("[MCP] memory.acknowledge - contradiction reported", { id: memory.id, context: validated.application_context });
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
logger.info("[MCP] memory.acknowledge - irrelevant", { id: memory.id, context: validated.application_context });
|
|
23
|
+
}
|
|
24
|
+
return createMcpResponse({
|
|
25
|
+
success: true,
|
|
26
|
+
id: memory.id,
|
|
27
|
+
status: validated.status
|
|
28
|
+
}, `Acknowledge ${validated.status} for memory ${memory.id.slice(0, 8)}...`);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=memory.acknowledge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.acknowledge.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.acknowledge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAe,MAAM,0BAA0B,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAAW,EACX,EAAe;IAEf,iBAAiB;IACjB,MAAM,SAAS,GAAG,uBAAuB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAExD,yBAAyB;IACzB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,CAAC,SAAS,aAAa,CAAC,CAAC;IACtE,CAAC;IAED,oCAAoC;IACpC,IAAI,SAAS,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAChC,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC5G,CAAC;SAAM,IAAI,SAAS,CAAC,MAAM,KAAK,eAAe,EAAE,CAAC;QAChD,wCAAwC;QACxC,MAAM,CAAC,IAAI,CAAC,mDAAmD,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC9H,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,uCAAuC,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAClH,CAAC;IAED,OAAO,iBAAiB,CACtB;QACE,OAAO,EAAE,IAAI;QACb,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM,EAAE,SAAS,CAAC,MAAM;KACzB,EACD,eAAe,SAAS,CAAC,MAAM,eAAe,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CACzE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { SQLiteStore } from "../storage/sqlite.js";
|
|
2
|
+
import { VectorStore } from "../types.js";
|
|
3
|
+
export declare function handleMemoryBulkDelete(args: any, storage: SQLiteStore, vectors: VectorStore, onProgress?: (progress: number, total?: number) => void): Promise<import("../utils/mcp-response.js").McpResponse>;
|
|
4
|
+
//# sourceMappingURL=memory.bulk-delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.bulk-delete.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory.bulk-delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI1C,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,GAAG,EACT,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,2DA6CxD"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createMcpResponse } from "../utils/mcp-response.js";
|
|
2
|
+
import { MemoryBulkDeleteSchema } from "./schemas.js";
|
|
3
|
+
export async function handleMemoryBulkDelete(args, storage, vectors, onProgress) {
|
|
4
|
+
const { repo, ids } = MemoryBulkDeleteSchema.parse(args);
|
|
5
|
+
const total = ids.length;
|
|
6
|
+
let progress = 0;
|
|
7
|
+
for (const id of ids) {
|
|
8
|
+
if (onProgress) {
|
|
9
|
+
onProgress(progress, total);
|
|
10
|
+
}
|
|
11
|
+
storage.delete(id);
|
|
12
|
+
await vectors.remove(id);
|
|
13
|
+
progress++;
|
|
14
|
+
}
|
|
15
|
+
if (onProgress) {
|
|
16
|
+
onProgress(progress, total);
|
|
17
|
+
}
|
|
18
|
+
storage.logAction("delete", repo, { resultCount: ids.length, query: "Bulk Delete" });
|
|
19
|
+
return createMcpResponse({
|
|
20
|
+
success: true,
|
|
21
|
+
repo,
|
|
22
|
+
deletedCount: ids.length,
|
|
23
|
+
ids,
|
|
24
|
+
}, `Successfully deleted ${ids.length} memories.`, {
|
|
25
|
+
resourceLinks: [
|
|
26
|
+
{
|
|
27
|
+
uri: `memory://index?repo=${encodeURIComponent(repo)}`,
|
|
28
|
+
name: `Memory Index (${repo})`,
|
|
29
|
+
description: "Repository memory index after bulk deletion",
|
|
30
|
+
mimeType: "application/json",
|
|
31
|
+
annotations: {
|
|
32
|
+
audience: ["assistant"],
|
|
33
|
+
priority: 0.5,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=memory.bulk-delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.bulk-delete.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.bulk-delete.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,IAAS,EACT,OAAoB,EACpB,OAAoB,EACpB,UAAuD;IAEvD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEzD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;IACzB,IAAI,QAAQ,GAAG,CAAC,CAAC;IAEjB,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACnB,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACzB,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC;IAErF,OAAO,iBAAiB,CACtB;QACE,OAAO,EAAE,IAAI;QACb,IAAI;QACJ,YAAY,EAAE,GAAG,CAAC,MAAM;QACxB,GAAG;KACJ,EACD,wBAAwB,GAAG,CAAC,MAAM,YAAY,EAC9C;QACE,aAAa,EAAE;YACb;gBACE,GAAG,EAAE,uBAAuB,kBAAkB,CAAC,IAAI,CAAC,EAAE;gBACtD,IAAI,EAAE,iBAAiB,IAAI,GAAG;gBAC9B,WAAW,EAAE,6CAA6C;gBAC1D,QAAQ,EAAE,kBAAkB;gBAC5B,WAAW,EAAE;oBACX,QAAQ,EAAE,CAAC,WAAW,CAAC;oBACvB,QAAQ,EAAE,GAAG;iBACd;aACF;SACF;KACF,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { SQLiteStore } from "../storage/sqlite.js";
|
|
3
|
+
import { VectorStore } from "../types.js";
|
|
4
|
+
import { McpResponse } from "../utils/mcp-response.js";
|
|
5
|
+
export declare const MemoryDeleteSchema: z.ZodObject<{
|
|
6
|
+
id: z.ZodString;
|
|
7
|
+
}, z.core.$strip>;
|
|
8
|
+
export declare function handleMemoryDelete(params: any, db: SQLiteStore, vectors: VectorStore): Promise<McpResponse>;
|
|
9
|
+
//# sourceMappingURL=memory.delete.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.delete.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory.delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG1E,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AAEH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CAwCtB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createMcpResponse } from "../utils/mcp-response.js";
|
|
3
|
+
import { logger } from "../utils/logger.js";
|
|
4
|
+
export const MemoryDeleteSchema = z.object({
|
|
5
|
+
id: z.string().uuid()
|
|
6
|
+
});
|
|
7
|
+
export async function handleMemoryDelete(params, db, vectors) {
|
|
8
|
+
// Validate input
|
|
9
|
+
const validated = MemoryDeleteSchema.parse(params);
|
|
10
|
+
// Check if memory exists
|
|
11
|
+
const existing = db.getById(validated.id);
|
|
12
|
+
if (!existing) {
|
|
13
|
+
throw new Error(`Memory not found: ${validated.id}`);
|
|
14
|
+
}
|
|
15
|
+
// Delete from SQLite
|
|
16
|
+
db.delete(validated.id);
|
|
17
|
+
// Delete from vector store
|
|
18
|
+
await vectors.remove(validated.id);
|
|
19
|
+
logger.info("[MCP] memory.delete", { repo: existing.scope.repo, id: validated.id, title: existing.title });
|
|
20
|
+
return createMcpResponse({
|
|
21
|
+
success: true,
|
|
22
|
+
id: validated.id,
|
|
23
|
+
repo: existing.scope.repo,
|
|
24
|
+
}, `Deleted memory ${validated.id.slice(0, 8)}...`, {
|
|
25
|
+
resourceLinks: [
|
|
26
|
+
{
|
|
27
|
+
uri: `memory://index?repo=${encodeURIComponent(existing.scope.repo)}`,
|
|
28
|
+
name: `Memory Index (${existing.scope.repo})`,
|
|
29
|
+
description: "Repository memory index after deletion",
|
|
30
|
+
mimeType: "application/json",
|
|
31
|
+
annotations: {
|
|
32
|
+
audience: ["assistant"],
|
|
33
|
+
priority: 0.5,
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=memory.delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.delete.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAe,MAAM,0BAA0B,CAAC;AAC1E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAW,EACX,EAAe,EACf,OAAoB;IAEpB,iBAAiB;IACjB,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEnD,yBAAyB;IACzB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,qBAAqB;IACrB,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAExB,2BAA2B;IAC3B,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAEnC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAE3G,OAAO,iBAAiB,CACtB;QACE,OAAO,EAAE,IAAI;QACb,EAAE,EAAE,SAAS,CAAC,EAAE;QAChB,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI;KAC1B,EACD,kBAAkB,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAC/C;QACE,aAAa,EAAE;YACb;gBACE,GAAG,EAAE,uBAAuB,kBAAkB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;gBACrE,IAAI,EAAE,iBAAiB,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG;gBAC7C,WAAW,EAAE,wCAAwC;gBACrD,QAAQ,EAAE,kBAAkB;gBAC5B,WAAW,EAAE;oBACX,QAAQ,EAAE,CAAC,WAAW,CAAC;oBACvB,QAAQ,EAAE,GAAG;iBACd;aACF;SACF;KACF,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.recap.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory.recap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAG1E,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,GACd,OAAO,CAAC,WAAW,CAAC,CA2GtB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { MemoryRecapSchema } from "./schemas.js";
|
|
2
|
+
import { createMcpResponse } from "../utils/mcp-response.js";
|
|
3
|
+
import { logger } from "../utils/logger.js";
|
|
4
|
+
export async function handleMemoryRecap(params, db) {
|
|
5
|
+
// Validate input
|
|
6
|
+
const validated = MemoryRecapSchema.parse(params);
|
|
7
|
+
logger.info("[MCP] memory.recap", { repo: validated.repo, limit: validated.limit, offset: validated.offset });
|
|
8
|
+
// Get total count for pagination metadata
|
|
9
|
+
const total = db.getTotalCount(validated.repo);
|
|
10
|
+
// Get recent memories using public API (no type-unsafe cast)
|
|
11
|
+
const rows = db.getRecentMemories(validated.repo, validated.limit, validated.offset);
|
|
12
|
+
// Get active tasks for recap (In Progress, Pending, Blocked, Canceled)
|
|
13
|
+
const activeStatuses = ["in_progress", "pending", "blocked", "canceled"];
|
|
14
|
+
const tasks = db.getTasksByMultipleStatuses(validated.repo, activeStatuses, 50);
|
|
15
|
+
// Sort tasks: in_progress first, then by priority
|
|
16
|
+
const sortedTasks = [...tasks].sort((a, b) => {
|
|
17
|
+
if (a.status === "in_progress" && b.status !== "in_progress")
|
|
18
|
+
return -1;
|
|
19
|
+
if (a.status !== "in_progress" && b.status === "in_progress")
|
|
20
|
+
return 1;
|
|
21
|
+
return (b.priority || 0) - (a.priority || 0);
|
|
22
|
+
});
|
|
23
|
+
const formattedTasks = sortedTasks.map(t => ({
|
|
24
|
+
id: t.id,
|
|
25
|
+
task_code: t.task_code,
|
|
26
|
+
title: t.title,
|
|
27
|
+
status: t.status,
|
|
28
|
+
priority: t.priority
|
|
29
|
+
}));
|
|
30
|
+
if (rows.length === 0 && tasks.length === 0) {
|
|
31
|
+
return createMcpResponse({
|
|
32
|
+
repo: validated.repo,
|
|
33
|
+
count: 0,
|
|
34
|
+
total,
|
|
35
|
+
offset: validated.offset,
|
|
36
|
+
memories: [],
|
|
37
|
+
tasks: [],
|
|
38
|
+
message: `No memories or tasks found for repo: ${validated.repo}`
|
|
39
|
+
}, `No memories or tasks for repo "${validated.repo}"`);
|
|
40
|
+
}
|
|
41
|
+
// Format memories for recap
|
|
42
|
+
const formattedMemories = rows.map((row, index) => ({
|
|
43
|
+
number: validated.offset + index + 1,
|
|
44
|
+
id: row.id,
|
|
45
|
+
type: row.type,
|
|
46
|
+
importance: row.importance,
|
|
47
|
+
preview: row.content.substring(0, 100) + (row.content.length > 100 ? "..." : ""),
|
|
48
|
+
created_at: row.created_at
|
|
49
|
+
}));
|
|
50
|
+
// Create summary text
|
|
51
|
+
const memorySummary = formattedMemories
|
|
52
|
+
.map((m) => `${m.number}. [${m.type.toUpperCase()}] (importance: ${m.importance}) ${m.preview}`)
|
|
53
|
+
.join("\n");
|
|
54
|
+
const taskSummary = formattedTasks
|
|
55
|
+
.map((t) => `- [${t.status.toUpperCase()}] [${t.task_code}] ${t.title} (P${t.priority})`)
|
|
56
|
+
.join("\n");
|
|
57
|
+
return createMcpResponse({
|
|
58
|
+
repo: validated.repo,
|
|
59
|
+
count: rows.length,
|
|
60
|
+
total,
|
|
61
|
+
offset: validated.offset,
|
|
62
|
+
memories: formattedMemories,
|
|
63
|
+
tasks: formattedTasks,
|
|
64
|
+
summary: `Recent ${rows.length} memories:\n\n${memorySummary}\n\nActive Tasks:\n\n${taskSummary || "No active tasks"}`
|
|
65
|
+
}, `Retrieved ${rows.length} memories and ${tasks.length} active tasks for repo "${validated.repo}"`, {
|
|
66
|
+
resourceLinks: [
|
|
67
|
+
{
|
|
68
|
+
uri: `memory://summary/${validated.repo}`,
|
|
69
|
+
name: `Memory Summary (${validated.repo})`,
|
|
70
|
+
description: "Repository summary resource",
|
|
71
|
+
mimeType: "text/plain",
|
|
72
|
+
annotations: {
|
|
73
|
+
audience: ["assistant"],
|
|
74
|
+
priority: 0.8,
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
uri: `tasks://current?repo=${encodeURIComponent(validated.repo)}`,
|
|
79
|
+
name: `Current Tasks (${validated.repo})`,
|
|
80
|
+
description: "Current task snapshot for the repository",
|
|
81
|
+
mimeType: "application/json",
|
|
82
|
+
annotations: {
|
|
83
|
+
audience: ["assistant"],
|
|
84
|
+
priority: 0.7,
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=memory.recap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.recap.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.recap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { SQLiteStore } from "../storage/sqlite.js";
|
|
2
|
+
import { VectorStore } from "../types.js";
|
|
3
|
+
import { McpResponse } from "../utils/mcp-response.js";
|
|
4
|
+
export declare function handleMemorySearch(params: any, db: SQLiteStore, vectors: VectorStore): Promise<McpResponse>;
|
|
5
|
+
//# sourceMappingURL=memory.search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.search.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory.search.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAe,MAAM,aAAa,CAAC;AAIvD,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAc1E,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CAgJtB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { MemorySearchSchema } from "./schemas.js";
|
|
2
|
+
import { handleMemoryRecap } from "./memory.recap.js";
|
|
3
|
+
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { createMcpResponse } from "../utils/mcp-response.js";
|
|
5
|
+
import { expandQuery } from "../utils/query-expander.js";
|
|
6
|
+
const HYBRID_WEIGHTS_VECTOR = {
|
|
7
|
+
similarity: 0.4,
|
|
8
|
+
vector: 0.4,
|
|
9
|
+
importance: 0.2,
|
|
10
|
+
};
|
|
11
|
+
const HYBRID_WEIGHTS_NO_VECTOR = {
|
|
12
|
+
similarity: 0.8,
|
|
13
|
+
importance: 0.2,
|
|
14
|
+
};
|
|
15
|
+
export async function handleMemorySearch(params, db, vectors) {
|
|
16
|
+
const validated = MemorySearchSchema.parse(params);
|
|
17
|
+
let recapContext;
|
|
18
|
+
if (validated.includeRecap) {
|
|
19
|
+
try {
|
|
20
|
+
const recapRes = await handleMemoryRecap({ repo: validated.repo, limit: 10 }, db);
|
|
21
|
+
recapContext = recapRes.content[0].type === "text" ? recapRes.content[0].text : undefined;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
logger.error("Failed to get recap context", { error: String(error) });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const searchQuery = expandQuery(validated.query, validated.prompt);
|
|
28
|
+
// 1. Get Candidates from SQLite
|
|
29
|
+
const similarityResults = db.searchBySimilarity(searchQuery, validated.repo, validated.limit * 3, validated.include_archived, validated.current_tags ?? []);
|
|
30
|
+
let candidates = similarityResults.map(r => ({
|
|
31
|
+
memory: r,
|
|
32
|
+
similarityScore: r.similarity
|
|
33
|
+
}));
|
|
34
|
+
// 2. Workspace & Tag Affinity Boost
|
|
35
|
+
if (candidates.length > 0) {
|
|
36
|
+
const currentPath = validated.current_file_path?.toLowerCase();
|
|
37
|
+
const currentTags = (validated.current_tags || []).map(t => t.toLowerCase());
|
|
38
|
+
// Attempt to resolve current branch if not provided (optional)
|
|
39
|
+
const currentBranch = validated.scope?.branch;
|
|
40
|
+
candidates = candidates.map(c => {
|
|
41
|
+
let boost = 0;
|
|
42
|
+
// Branch boost (+0.1) - High relevance if on same branch
|
|
43
|
+
if (currentBranch && c.memory.scope.branch === currentBranch) {
|
|
44
|
+
boost += 0.1;
|
|
45
|
+
}
|
|
46
|
+
// Folder boost (+0.15)
|
|
47
|
+
if (currentPath && c.memory.scope.folder && currentPath.includes(c.memory.scope.folder.toLowerCase())) {
|
|
48
|
+
boost += 0.15;
|
|
49
|
+
}
|
|
50
|
+
// Language boost (+0.1)
|
|
51
|
+
if (currentPath && c.memory.scope.language) {
|
|
52
|
+
const ext = currentPath.split('.').pop();
|
|
53
|
+
if (ext && ext.includes(c.memory.scope.language.toLowerCase()))
|
|
54
|
+
boost += 0.1;
|
|
55
|
+
}
|
|
56
|
+
// TAG AFFINITY BOOST (+0.2)
|
|
57
|
+
// If the memory has tags that match the current workspace tech-stack
|
|
58
|
+
if (currentTags.length > 0 && c.memory.tags.some(t => currentTags.includes(t.toLowerCase()))) {
|
|
59
|
+
boost += 0.2;
|
|
60
|
+
}
|
|
61
|
+
return { ...c, similarityScore: Math.min(1.0, c.similarityScore + boost) };
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// 3. Vector Re-ranking
|
|
65
|
+
let scoredMemories = [];
|
|
66
|
+
try {
|
|
67
|
+
const vectorResults = await vectors.search(searchQuery, candidates.length || 10, validated.repo);
|
|
68
|
+
const vectorScoreMap = new Map(vectorResults.map(vr => [vr.id, vr.score]));
|
|
69
|
+
if (candidates.length > 0) {
|
|
70
|
+
scoredMemories = candidates.map(c => {
|
|
71
|
+
const vScore = vectorScoreMap.get(c.memory.id) ?? 0;
|
|
72
|
+
const impBoost = c.memory.importance / 5;
|
|
73
|
+
const finalScore = (c.similarityScore * HYBRID_WEIGHTS_VECTOR.similarity) +
|
|
74
|
+
(vScore * HYBRID_WEIGHTS_VECTOR.vector) +
|
|
75
|
+
(impBoost * HYBRID_WEIGHTS_VECTOR.importance);
|
|
76
|
+
return { ...c, vectorScore: vScore, finalScore };
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
else if (vectorResults.length > 0) {
|
|
80
|
+
// If SQLite found nothing but vectors did (rare due to our fallback)
|
|
81
|
+
for (const vr of vectorResults) {
|
|
82
|
+
const mem = db.getById(vr.id);
|
|
83
|
+
if (mem) {
|
|
84
|
+
const impBoost = mem.importance / 5;
|
|
85
|
+
scoredMemories.push({
|
|
86
|
+
memory: mem,
|
|
87
|
+
similarityScore: 0,
|
|
88
|
+
vectorScore: vr.score,
|
|
89
|
+
finalScore: (vr.score * 0.8) + (impBoost * 0.2)
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
logger.warn("Vector search failed, using similarity only", { error: String(error) });
|
|
97
|
+
scoredMemories = candidates.map(c => ({
|
|
98
|
+
...c,
|
|
99
|
+
vectorScore: 0,
|
|
100
|
+
finalScore: (c.similarityScore * 0.8) + ((c.memory.importance / 5) * 0.2)
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
// 4. Threshold & Final Selection
|
|
104
|
+
scoredMemories.sort((a, b) => b.finalScore - a.finalScore);
|
|
105
|
+
const threshold = scoredMemories.length <= 5 ? 0.10 : 0.40;
|
|
106
|
+
let results = scoredMemories.filter(sm => sm.finalScore >= threshold).map(sm => sm.memory);
|
|
107
|
+
// Absolute fallback: if repo has data but search failed threshold, return top 1
|
|
108
|
+
if (results.length === 0 && scoredMemories.length > 0) {
|
|
109
|
+
results = [scoredMemories[0].memory];
|
|
110
|
+
}
|
|
111
|
+
results = results.slice(0, validated.limit);
|
|
112
|
+
// 5. Post-processing
|
|
113
|
+
for (const m of results)
|
|
114
|
+
db.incrementHitCount(m.id);
|
|
115
|
+
logger.info("[MCP] memory.search", { repo: validated.repo, query: validated.query, results: results.length });
|
|
116
|
+
const topMatch = results[0] ? `\n\nTop Match: [${results[0].type}] ${results[0].title || results[0].content.substring(0, 50)}` : "";
|
|
117
|
+
return createMcpResponse({ query: validated.query, results, recapContext }, `Found ${results.length} memories matching "${validated.query}"${topMatch}`, {
|
|
118
|
+
query: validated.query,
|
|
119
|
+
results: results,
|
|
120
|
+
resourceLinks: [
|
|
121
|
+
{
|
|
122
|
+
uri: `memory://index?repo=${encodeURIComponent(validated.repo)}`,
|
|
123
|
+
name: `Memory Index (${validated.repo})`,
|
|
124
|
+
description: "Repository memory index",
|
|
125
|
+
mimeType: "application/json",
|
|
126
|
+
annotations: {
|
|
127
|
+
audience: ["assistant"],
|
|
128
|
+
priority: 0.7,
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=memory.search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.search.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { SQLiteStore } from "../storage/sqlite.js";
|
|
2
|
+
import { VectorStore } from "../types.js";
|
|
3
|
+
import { McpResponse } from "../utils/mcp-response.js";
|
|
4
|
+
export declare function handleMemoryStore(params: any, db: SQLiteStore, vectors: VectorStore): Promise<McpResponse>;
|
|
5
|
+
//# sourceMappingURL=memory.store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.store.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory.store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAe,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAO1E,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CA6HtB"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { randomUUID } from "crypto";
|
|
2
|
+
import { MemoryStoreSchema } from "./schemas.js";
|
|
3
|
+
import { logger } from "../utils/logger.js";
|
|
4
|
+
import { createMcpResponse } from "../utils/mcp-response.js";
|
|
5
|
+
function hasMetadataLikeTitle(title) {
|
|
6
|
+
const normalized = title.trim();
|
|
7
|
+
return /^\[[^\]]{0,200}(agent:|role:|model:|\d{4}-\d{2}-\d{2}|source_)[^\]]*\]/i.test(normalized);
|
|
8
|
+
}
|
|
9
|
+
export async function handleMemoryStore(params, db, vectors) {
|
|
10
|
+
// Validate input
|
|
11
|
+
const validated = MemoryStoreSchema.parse(params);
|
|
12
|
+
if (hasMetadataLikeTitle(validated.title)) {
|
|
13
|
+
throw new Error("Title appears to contain metadata. Keep title concise and move agent/role/date details into metadata or dedicated fields.");
|
|
14
|
+
}
|
|
15
|
+
// Create memory entry
|
|
16
|
+
const now = new Date().toISOString();
|
|
17
|
+
// Compute expires_at if ttlDays is provided
|
|
18
|
+
const expires_at = validated.ttlDays != null
|
|
19
|
+
? new Date(Date.now() + validated.ttlDays * 86400000).toISOString()
|
|
20
|
+
: null;
|
|
21
|
+
// Check for semantic conflicts before storing (threshold: 0.55)
|
|
22
|
+
if (!validated.supersedes) {
|
|
23
|
+
const conflict = await db.checkConflicts(validated.content, validated.scope.repo, validated.type, vectors, 0.55);
|
|
24
|
+
if (conflict) {
|
|
25
|
+
return createMcpResponse({
|
|
26
|
+
success: false,
|
|
27
|
+
error: "MEMORY_CONFLICT",
|
|
28
|
+
message: `This memory content overlaps significantly with an existing memory (ID: ${conflict.id}).`,
|
|
29
|
+
conflicting_memory: {
|
|
30
|
+
id: conflict.id,
|
|
31
|
+
title: conflict.title,
|
|
32
|
+
content: conflict.content
|
|
33
|
+
},
|
|
34
|
+
instruction: "Use 'memory-update' on the existing ID, or provide 'supersedes' if this new memory replaces it. If the old memory is no longer relevant, you can delete it first."
|
|
35
|
+
}, `Rejected due to conflict with ${conflict.id}. Hint: Use 'supersedes' if this replaces the old memory, or 'memory-update' if you're updating it. If the old memory is no longer relevant, delete it first using 'memory-delete'.`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
// If this memory supersedes an old one, archive the old one
|
|
39
|
+
if (validated.supersedes) {
|
|
40
|
+
const oldMemory = db.getById(validated.supersedes);
|
|
41
|
+
if (oldMemory) {
|
|
42
|
+
db.update(oldMemory.id, { status: "archived" });
|
|
43
|
+
logger.info("[MCP] memory.store - archived superseded memory", { oldId: oldMemory.id, newId: validated.supersedes });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Auto-tagging based on language scope
|
|
47
|
+
const tags = validated.tags ?? [];
|
|
48
|
+
if (validated.scope.language && !tags.includes(validated.scope.language.toLowerCase())) {
|
|
49
|
+
tags.push(validated.scope.language.toLowerCase());
|
|
50
|
+
}
|
|
51
|
+
const entry = {
|
|
52
|
+
id: randomUUID(),
|
|
53
|
+
type: validated.type,
|
|
54
|
+
title: validated.title,
|
|
55
|
+
content: validated.content,
|
|
56
|
+
importance: validated.importance,
|
|
57
|
+
agent: validated.agent,
|
|
58
|
+
role: validated.role,
|
|
59
|
+
model: validated.model,
|
|
60
|
+
scope: validated.scope,
|
|
61
|
+
created_at: now,
|
|
62
|
+
updated_at: now,
|
|
63
|
+
completed_at: null,
|
|
64
|
+
hit_count: 0,
|
|
65
|
+
recall_count: 0,
|
|
66
|
+
last_used_at: null,
|
|
67
|
+
expires_at,
|
|
68
|
+
supersedes: validated.supersedes ?? null,
|
|
69
|
+
status: "active",
|
|
70
|
+
tags,
|
|
71
|
+
metadata: validated.metadata ?? {},
|
|
72
|
+
is_global: validated.is_global
|
|
73
|
+
};
|
|
74
|
+
// Store in SQLite
|
|
75
|
+
db.insert(entry);
|
|
76
|
+
// Automatically generate and store vector embedding
|
|
77
|
+
try {
|
|
78
|
+
await vectors.upsert(entry.id, entry.content);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
logger.warn("Failed to generate vector embedding", { error: String(error) });
|
|
82
|
+
// Continue anyway - vectors are optional for search fallback
|
|
83
|
+
}
|
|
84
|
+
logger.info("[MCP] memory.store", { repo: validated.scope.repo, id: entry.id, title: entry.title, type: entry.type, importance: entry.importance });
|
|
85
|
+
return createMcpResponse({
|
|
86
|
+
success: true,
|
|
87
|
+
id: entry.id,
|
|
88
|
+
repo: entry.scope.repo,
|
|
89
|
+
type: entry.type,
|
|
90
|
+
title: entry.title,
|
|
91
|
+
}, `Stored memory ${entry.id.slice(0, 8)}...`, {
|
|
92
|
+
resourceLinks: [
|
|
93
|
+
{
|
|
94
|
+
uri: `memory://${entry.id}`,
|
|
95
|
+
name: entry.title,
|
|
96
|
+
description: `Stored memory in repo ${entry.scope.repo}`,
|
|
97
|
+
mimeType: "application/json",
|
|
98
|
+
annotations: {
|
|
99
|
+
audience: ["assistant"],
|
|
100
|
+
priority: 0.9,
|
|
101
|
+
lastModified: entry.updated_at,
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
uri: `memory://index?repo=${encodeURIComponent(entry.scope.repo)}`,
|
|
106
|
+
name: `Memory Index (${entry.scope.repo})`,
|
|
107
|
+
description: "Repository memory index",
|
|
108
|
+
mimeType: "application/json",
|
|
109
|
+
annotations: {
|
|
110
|
+
audience: ["assistant"],
|
|
111
|
+
priority: 0.6,
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
],
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=memory.store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.store.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.summarize.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory.summarize.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1E,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,GACd,OAAO,CAAC,WAAW,CAAC,CAkCtB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { MemorySummarizeSchema } from "./schemas.js";
|
|
2
|
+
import { createMcpResponse } from "../utils/mcp-response.js";
|
|
3
|
+
export async function handleMemorySummarize(params, db) {
|
|
4
|
+
// Validate input
|
|
5
|
+
const validated = MemorySummarizeSchema.parse(params);
|
|
6
|
+
// Create summary from signals
|
|
7
|
+
const summary = validated.signals.join("\n- ");
|
|
8
|
+
const fullSummary = `Project summary:\n- ${summary}`;
|
|
9
|
+
// Store summary
|
|
10
|
+
db.upsertSummary(validated.repo, fullSummary);
|
|
11
|
+
return createMcpResponse({
|
|
12
|
+
success: true,
|
|
13
|
+
repo: validated.repo,
|
|
14
|
+
summary: fullSummary,
|
|
15
|
+
signalCount: validated.signals.length,
|
|
16
|
+
}, `Updated summary for repo "${validated.repo}"`, {
|
|
17
|
+
resourceLinks: [
|
|
18
|
+
{
|
|
19
|
+
uri: `memory://summary/${validated.repo}`,
|
|
20
|
+
name: `Memory Summary (${validated.repo})`,
|
|
21
|
+
description: "Repository summary resource",
|
|
22
|
+
mimeType: "text/plain",
|
|
23
|
+
annotations: {
|
|
24
|
+
audience: ["assistant"],
|
|
25
|
+
priority: 0.9,
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=memory.summarize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.summarize.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.summarize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,EAAE,iBAAiB,EAAe,MAAM,0BAA0B,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAW,EACX,EAAe;IAEf,iBAAiB;IACjB,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAEtD,8BAA8B;IAC9B,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,uBAAuB,OAAO,EAAE,CAAC;IAErD,gBAAgB;IAChB,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAE9C,OAAO,iBAAiB,CACtB;QACE,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,OAAO,EAAE,WAAW;QACpB,WAAW,EAAE,SAAS,CAAC,OAAO,CAAC,MAAM;KACtC,EACD,6BAA6B,SAAS,CAAC,IAAI,GAAG,EAC9C;QACE,aAAa,EAAE;YACb;gBACE,GAAG,EAAE,oBAAoB,SAAS,CAAC,IAAI,EAAE;gBACzC,IAAI,EAAE,mBAAmB,SAAS,CAAC,IAAI,GAAG;gBAC1C,WAAW,EAAE,6BAA6B;gBAC1C,QAAQ,EAAE,YAAY;gBACtB,WAAW,EAAE;oBACX,QAAQ,EAAE,CAAC,WAAW,CAAC;oBACvB,QAAQ,EAAE,GAAG;iBACd;aACF;SACF;KACF,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { SQLiteStore } from "../storage/sqlite.js";
|
|
2
|
+
import { VectorStore } from "../types.js";
|
|
3
|
+
import { SamplingRequestHandler } from "../sampling.js";
|
|
4
|
+
import { SessionContext } from "../session.js";
|
|
5
|
+
import { ElicitationRequestHandler } from "../elicitation.js";
|
|
6
|
+
import { McpResponse } from "../utils/mcp-response.js";
|
|
7
|
+
type SynthesizeOptions = {
|
|
8
|
+
session?: SessionContext;
|
|
9
|
+
sampleMessage?: SamplingRequestHandler;
|
|
10
|
+
elicit?: ElicitationRequestHandler;
|
|
11
|
+
};
|
|
12
|
+
export declare function handleMemorySynthesize(params: any, db: SQLiteStore, vectors: VectorStore, options?: SynthesizeOptions): Promise<McpResponse>;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=memory.synthesize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.synthesize.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/memory.synthesize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAEL,sBAAsB,EAGvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EAEf,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EAE1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAQ1E,KAAK,iBAAiB,GAAG;IACvB,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,MAAM,CAAC,EAAE,yBAAyB,CAAC;CACpC,CAAC;AAEF,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,WAAW,CAAC,CA0HtB"}
|