@vheins/local-memory-mcp 0.1.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/DASHBOARD.md +129 -0
- package/HYBRID_SEARCH.md +204 -0
- package/IMPLEMENTATION.md +159 -0
- package/README.md +175 -0
- package/dist/capabilities.d.ts +22 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +23 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/dashboard/dashboard.test.d.ts +2 -0
- package/dist/dashboard/dashboard.test.d.ts.map +1 -0
- package/dist/dashboard/dashboard.test.js +362 -0
- package/dist/dashboard/dashboard.test.js.map +1 -0
- package/dist/dashboard/public/app.js +1187 -0
- package/dist/dashboard/public/chart.js +0 -0
- package/dist/dashboard/public/index.html +967 -0
- package/dist/dashboard/server.d.ts +3 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +297 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/mcp/client.d.ts +34 -0
- package/dist/mcp/client.d.ts.map +1 -0
- package/dist/mcp/client.js +181 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/client.test.d.ts +2 -0
- package/dist/mcp/client.test.d.ts.map +1 -0
- package/dist/mcp/client.test.js +130 -0
- package/dist/mcp/client.test.js.map +1 -0
- package/dist/prompts/registry.d.ts +39 -0
- package/dist/prompts/registry.d.ts.map +1 -0
- package/dist/prompts/registry.js +90 -0
- package/dist/prompts/registry.js.map +1 -0
- package/dist/resources/index.d.ts +17 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +100 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/index.test.d.ts +2 -0
- package/dist/resources/index.test.d.ts.map +1 -0
- package/dist/resources/index.test.js +96 -0
- package/dist/resources/index.test.js.map +1 -0
- package/dist/router.d.ts +4 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +60 -0
- package/dist/router.js.map +1 -0
- package/dist/router.test.d.ts +2 -0
- package/dist/router.test.d.ts.map +1 -0
- package/dist/router.test.js +113 -0
- package/dist/router.test.js.map +1 -0
- package/dist/search_memory_example.d.ts +3 -0
- package/dist/search_memory_example.d.ts.map +1 -0
- package/dist/search_memory_example.js +56 -0
- package/dist/search_memory_example.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +91 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/sqlite.d.ts +95 -0
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +537 -0
- package/dist/storage/sqlite.js.map +1 -0
- package/dist/storage/sqlite.test.d.ts +2 -0
- package/dist/storage/sqlite.test.d.ts.map +1 -0
- package/dist/storage/sqlite.test.js +358 -0
- package/dist/storage/sqlite.test.js.map +1 -0
- package/dist/storage/vectors.stub.d.ts +12 -0
- package/dist/storage/vectors.stub.d.ts.map +1 -0
- package/dist/storage/vectors.stub.js +88 -0
- package/dist/storage/vectors.stub.js.map +1 -0
- package/dist/store_memory_example.d.ts +3 -0
- package/dist/store_memory_example.d.ts.map +1 -0
- package/dist/store_memory_example.js +69 -0
- package/dist/store_memory_example.js.map +1 -0
- package/dist/test_quotes_client.d.ts +3 -0
- package/dist/test_quotes_client.d.ts.map +1 -0
- package/dist/test_quotes_client.js +72 -0
- package/dist/test_quotes_client.js.map +1 -0
- package/dist/tools/memory.delete.d.ts +9 -0
- package/dist/tools/memory.delete.d.ts.map +1 -0
- package/dist/tools/memory.delete.js +22 -0
- package/dist/tools/memory.delete.js.map +1 -0
- package/dist/tools/memory.recap.d.ts +4 -0
- package/dist/tools/memory.recap.d.ts.map +1 -0
- package/dist/tools/memory.recap.js +42 -0
- package/dist/tools/memory.recap.js.map +1 -0
- package/dist/tools/memory.search.d.ts +5 -0
- package/dist/tools/memory.search.d.ts.map +1 -0
- package/dist/tools/memory.search.js +192 -0
- package/dist/tools/memory.search.js.map +1 -0
- package/dist/tools/memory.search.test.d.ts +2 -0
- package/dist/tools/memory.search.test.d.ts.map +1 -0
- package/dist/tools/memory.search.test.js +181 -0
- package/dist/tools/memory.search.test.js.map +1 -0
- package/dist/tools/memory.store.d.ts +5 -0
- package/dist/tools/memory.store.d.ts.map +1 -0
- package/dist/tools/memory.store.js +41 -0
- package/dist/tools/memory.store.js.map +1 -0
- package/dist/tools/memory.summarize.d.ts +4 -0
- package/dist/tools/memory.summarize.d.ts.map +1 -0
- package/dist/tools/memory.summarize.js +13 -0
- package/dist/tools/memory.summarize.js.map +1 -0
- package/dist/tools/memory.update.d.ts +5 -0
- package/dist/tools/memory.update.d.ts.map +1 -0
- package/dist/tools/memory.update.js +31 -0
- package/dist/tools/memory.update.js.map +1 -0
- package/dist/tools/schemas.d.ts +334 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +251 -0
- package/dist/tools/schemas.js.map +1 -0
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/git-scope.d.ts +8 -0
- package/dist/utils/git-scope.d.ts.map +1 -0
- package/dist/utils/git-scope.js +38 -0
- package/dist/utils/git-scope.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/logger.test.d.ts +2 -0
- package/dist/utils/logger.test.d.ts.map +1 -0
- package/dist/utils/logger.test.js +84 -0
- package/dist/utils/logger.test.js.map +1 -0
- package/dist/utils/mcp-response.d.ts +44 -0
- package/dist/utils/mcp-response.d.ts.map +1 -0
- package/dist/utils/mcp-response.js +81 -0
- package/dist/utils/mcp-response.js.map +1 -0
- package/dist/utils/normalize.d.ts +4 -0
- package/dist/utils/normalize.d.ts.map +1 -0
- package/dist/utils/normalize.js +51 -0
- package/dist/utils/normalize.js.map +1 -0
- package/dist/utils/normalize.test.d.ts +2 -0
- package/dist/utils/normalize.test.d.ts.map +1 -0
- package/dist/utils/normalize.test.js +159 -0
- package/dist/utils/normalize.test.js.map +1 -0
- package/dist/utils/query-expander.d.ts +2 -0
- package/dist/utils/query-expander.d.ts.map +1 -0
- package/dist/utils/query-expander.js +50 -0
- package/dist/utils/query-expander.js.map +1 -0
- package/dist/utils/query-expander.test.d.ts +2 -0
- package/dist/utils/query-expander.test.d.ts.map +1 -0
- package/dist/utils/query-expander.test.js +35 -0
- package/dist/utils/query-expander.test.js.map +1 -0
- package/docs/PRD.md +199 -0
- package/docs/PROMPT-agent.md +139 -0
- package/docs/SPEC-git-scope.md +172 -0
- package/docs/SPEC-heuristics.md +199 -0
- package/docs/SPEC-server.md +243 -0
- package/docs/SPEC-skeleton.md +255 -0
- package/docs/SPEC-sqlite-schema.md +183 -0
- package/docs/SPEC-tool-schema.md +201 -0
- package/docs/SPEC-vector-search.md +198 -0
- package/docs/TEST-scenarios.md +179 -0
- package/package.json +43 -0
- package/scripts/update-null-titles-ai.mjs +272 -0
- package/scripts/update-titles-batch.mjs +71 -0
- package/scripts/update-titles.mjs +66 -0
- package/seed-data.mjs +151 -0
- package/src/capabilities.ts +22 -0
- package/src/dashboard/dashboard.test.ts +546 -0
- package/src/dashboard/public/app.js +1187 -0
- package/src/dashboard/public/chart.js +0 -0
- package/src/dashboard/public/index.html +967 -0
- package/src/dashboard/server.ts +347 -0
- package/src/mcp/client.test.ts +164 -0
- package/src/mcp/client.ts +212 -0
- package/src/prompts/registry.ts +89 -0
- package/src/resources/index.test.ts +132 -0
- package/src/resources/index.ts +113 -0
- package/src/router.test.ts +145 -0
- package/src/router.ts +80 -0
- package/src/server.ts +99 -0
- package/src/storage/sqlite.test.ts +504 -0
- package/src/storage/sqlite.ts +688 -0
- package/src/storage/vectors.stub.ts +101 -0
- package/src/tools/memory.delete.ts +37 -0
- package/src/tools/memory.recap.ts +61 -0
- package/src/tools/memory.search.test.ts +276 -0
- package/src/tools/memory.search.ts +244 -0
- package/src/tools/memory.store.ts +56 -0
- package/src/tools/memory.summarize.ts +23 -0
- package/src/tools/memory.update.ts +46 -0
- package/src/tools/schemas.ts +261 -0
- package/src/types.ts +36 -0
- package/src/utils/git-scope.ts +42 -0
- package/src/utils/logger.test.ts +125 -0
- package/src/utils/logger.ts +53 -0
- package/src/utils/mcp-response.ts +116 -0
- package/src/utils/normalize.test.ts +203 -0
- package/src/utils/normalize.ts +53 -0
- package/src/utils/query-expander.test.ts +40 -0
- package/src/utils/query-expander.ts +60 -0
- package/storage/.gitkeep +5 -0
- package/test.sh +48 -0
- package/tsconfig.json +21 -0
- package/vitest.config.ts +10 -0
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { MCPClient } from "./mcp/client.js";
|
|
3
|
+
// Array of random quotes
|
|
4
|
+
const QUOTES = [
|
|
5
|
+
"The only way to do great work is to love what you do. - Steve Jobs",
|
|
6
|
+
"In the middle of difficulty lies opportunity. - Albert Einstein",
|
|
7
|
+
"Believe you can and you're halfway there. - Theodore Roosevelt",
|
|
8
|
+
"The future belongs to those who believe in the beauty of their dreams. - Eleanor Roosevelt",
|
|
9
|
+
"You miss 100% of the shots you don't take. - Wayne Gretzky",
|
|
10
|
+
"The best way to predict the future is to create it. - Peter Drucker",
|
|
11
|
+
"Life is what happens to you while you're busy making other plans. - John Lennon",
|
|
12
|
+
"The only impossible journey is the one you never begin. - Tony Robbins",
|
|
13
|
+
"Innovation distinguishes between a leader and a follower. - Steve Jobs",
|
|
14
|
+
"The mind is everything. What you think you become. - Buddha"
|
|
15
|
+
];
|
|
16
|
+
// Function to generate random importance (1-5)
|
|
17
|
+
function randomImportance() {
|
|
18
|
+
return Math.floor(Math.random() * 5) + 1;
|
|
19
|
+
}
|
|
20
|
+
async function testRandomQuotes() {
|
|
21
|
+
const client = new MCPClient();
|
|
22
|
+
try {
|
|
23
|
+
console.log("Starting MCP client...");
|
|
24
|
+
await client.start();
|
|
25
|
+
console.log("MCP client connected!");
|
|
26
|
+
console.log("\nStoring random quotes...");
|
|
27
|
+
// Store quotes
|
|
28
|
+
for (let i = 0; i < QUOTES.length; i++) {
|
|
29
|
+
const importance = randomImportance();
|
|
30
|
+
const quote = QUOTES[i];
|
|
31
|
+
try {
|
|
32
|
+
const result = await client.callTool("memory-store", {
|
|
33
|
+
type: "code_fact",
|
|
34
|
+
content: quote,
|
|
35
|
+
importance: importance,
|
|
36
|
+
scope: { repo: "quotes-test" }
|
|
37
|
+
});
|
|
38
|
+
console.log(`✓ Stored quote ${i + 1}: ${quote.substring(0, 50)}... (importance: ${importance})`);
|
|
39
|
+
console.log(` ID: ${result.id}`);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error(`✗ Failed to store quote ${i + 1}:`, error);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
console.log("\nSearching for stored quotes...");
|
|
46
|
+
// Search for quotes
|
|
47
|
+
try {
|
|
48
|
+
const searchResult = await client.callTool("memory-search", {
|
|
49
|
+
query: "quotes",
|
|
50
|
+
repo: "quotes-test",
|
|
51
|
+
limit: 10
|
|
52
|
+
});
|
|
53
|
+
console.log(`Found ${searchResult.results.length} quotes:`);
|
|
54
|
+
searchResult.results.forEach((memory, index) => {
|
|
55
|
+
console.log(`${index + 1}. [${memory.importance}] ${memory.content}`);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
console.error("✗ Failed to search quotes:", error);
|
|
60
|
+
}
|
|
61
|
+
console.log("\nTest completed successfully! 🎉");
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error("Test failed:", error);
|
|
65
|
+
}
|
|
66
|
+
finally {
|
|
67
|
+
client.stop();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Run the test
|
|
71
|
+
testRandomQuotes();
|
|
72
|
+
//# sourceMappingURL=test_quotes_client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test_quotes_client.js","sourceRoot":"","sources":["../src/test_quotes_client.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,yBAAyB;AACzB,MAAM,MAAM,GAAG;IACb,oEAAoE;IACpE,iEAAiE;IACjE,gEAAgE;IAChE,4FAA4F;IAC5F,4DAA4D;IAC5D,qEAAqE;IACrE,iFAAiF;IACjF,wEAAwE;IACxE,wEAAwE;IACxE,6DAA6D;CAC9D,CAAC;AAEF,+CAA+C;AAC/C,SAAS,gBAAgB;IACvB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;IAE/B,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QAErC,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;QAE1C,eAAe;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAExB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE;oBACnD,IAAI,EAAE,WAAW;oBACjB,OAAO,EAAE,KAAK;oBACd,UAAU,EAAE,UAAU;oBACtB,KAAK,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;iBAC/B,CAAC,CAAC;gBAEH,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,UAAU,GAAG,CAAC,CAAC;gBACjG,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QAEhD,oBAAoB;QACpB,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE;gBAC1D,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,aAAa;gBACnB,KAAK,EAAE,EAAE;aACV,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,SAAS,YAAY,CAAC,OAAO,CAAC,MAAM,UAAU,CAAC,CAAC;YAC5D,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAW,EAAE,KAAa,EAAE,EAAE;gBAC1D,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED,eAAe;AACf,gBAAgB,EAAE,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/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;AAE1E,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,CAuBtB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createMcpResponse } from "../utils/mcp-response.js";
|
|
3
|
+
export const MemoryDeleteSchema = z.object({
|
|
4
|
+
id: z.string().uuid()
|
|
5
|
+
});
|
|
6
|
+
export async function handleMemoryDelete(params, db, vectors) {
|
|
7
|
+
// Validate input
|
|
8
|
+
const validated = MemoryDeleteSchema.parse(params);
|
|
9
|
+
// Check if memory exists
|
|
10
|
+
const existing = db.getById(validated.id);
|
|
11
|
+
if (!existing) {
|
|
12
|
+
throw new Error(`Memory not found: ${validated.id}`);
|
|
13
|
+
}
|
|
14
|
+
// Delete from SQLite
|
|
15
|
+
db.delete(validated.id);
|
|
16
|
+
// Delete from vector store
|
|
17
|
+
await vectors.remove(validated.id);
|
|
18
|
+
// Log the delete action
|
|
19
|
+
db.logAction('delete', existing.scope.repo, { memoryId: validated.id, resultCount: 1 });
|
|
20
|
+
return createMcpResponse({ success: true }, `Deleted memory ${validated.id.slice(0, 8)}...`);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=memory.delete.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.delete.js","sourceRoot":"","sources":["../../src/tools/memory.delete.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAe,MAAM,0BAA0B,CAAC;AAE1E,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,wBAAwB;IACxB,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IAExF,OAAO,iBAAiB,CACtB,EAAE,OAAO,EAAE,IAAI,EAAE,EACjB,kBAAkB,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAChD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.recap.d.ts","sourceRoot":"","sources":["../../src/tools/memory.recap.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAqB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE1E,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,GACd,OAAO,CAAC,WAAW,CAAC,CAqDtB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { MemoryRecapSchema } from "./schemas.js";
|
|
2
|
+
import { createMcpResponse } from "../utils/mcp-response.js";
|
|
3
|
+
export async function handleMemoryRecap(params, db) {
|
|
4
|
+
// Validate input
|
|
5
|
+
const validated = MemoryRecapSchema.parse(params);
|
|
6
|
+
// Get total count for pagination metadata
|
|
7
|
+
const total = db.getTotalCount(validated.repo);
|
|
8
|
+
// Get recent memories using public API (no type-unsafe cast)
|
|
9
|
+
const rows = db.getRecentMemories(validated.repo, validated.limit, validated.offset);
|
|
10
|
+
if (rows.length === 0) {
|
|
11
|
+
return createMcpResponse({
|
|
12
|
+
repo: validated.repo,
|
|
13
|
+
count: 0,
|
|
14
|
+
total,
|
|
15
|
+
offset: validated.offset,
|
|
16
|
+
memories: [],
|
|
17
|
+
message: `No memories found for repo: ${validated.repo}`
|
|
18
|
+
}, `No memories for repo "${validated.repo}"`);
|
|
19
|
+
}
|
|
20
|
+
// Format memories for recap
|
|
21
|
+
const formattedMemories = rows.map((row, index) => ({
|
|
22
|
+
number: validated.offset + index + 1,
|
|
23
|
+
id: row.id,
|
|
24
|
+
type: row.type,
|
|
25
|
+
importance: row.importance,
|
|
26
|
+
preview: row.content.substring(0, 100) + (row.content.length > 100 ? "..." : ""),
|
|
27
|
+
created_at: row.created_at
|
|
28
|
+
}));
|
|
29
|
+
// Create summary text
|
|
30
|
+
const summary = formattedMemories
|
|
31
|
+
.map((m) => `${m.number}. [${m.type.toUpperCase()}] (importance: ${m.importance}) ${m.preview}`)
|
|
32
|
+
.join("\n");
|
|
33
|
+
return createMcpResponse({
|
|
34
|
+
repo: validated.repo,
|
|
35
|
+
count: rows.length,
|
|
36
|
+
total,
|
|
37
|
+
offset: validated.offset,
|
|
38
|
+
memories: formattedMemories,
|
|
39
|
+
summary: `Recent ${rows.length} memories:\n\n${summary}`
|
|
40
|
+
}, `Retrieved ${rows.length} memories for repo "${validated.repo}"`);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=memory.recap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.recap.js","sourceRoot":"","sources":["../../src/tools/memory.recap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAe,MAAM,0BAA0B,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,MAAW,EACX,EAAe;IAEf,iBAAiB;IACjB,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAElD,0CAA0C;IAC1C,MAAM,KAAK,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAE/C,6DAA6D;IAC7D,MAAM,IAAI,GAAG,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAErF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,iBAAiB,CACtB;YACE,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,CAAC;YACR,KAAK;YACL,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,QAAQ,EAAE,EAAE;YACZ,OAAO,EAAE,+BAA+B,SAAS,CAAC,IAAI,EAAE;SACzD,EACD,yBAAyB,SAAS,CAAC,IAAI,GAAG,CAC3C,CAAC;IACJ,CAAC;IAED,4BAA4B;IAC5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAClD,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC;QACpC,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,UAAU,EAAE,GAAG,CAAC,UAAU;QAC1B,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,UAAU,EAAE,GAAG,CAAC,UAAU;KAC3B,CAAC,CAAC,CAAC;IAEJ,sBAAsB;IACtB,MAAM,OAAO,GAAG,iBAAiB;SAC9B,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,GAAG,CAAC,CAAC,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,OAAO,EAAE,CACtF;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,iBAAiB,CACtB;QACE,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,KAAK,EAAE,IAAI,CAAC,MAAM;QAClB,KAAK;QACL,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,QAAQ,EAAE,iBAAiB;QAC3B,OAAO,EAAE,UAAU,IAAI,CAAC,MAAM,iBAAiB,OAAO,EAAE;KACzD,EACD,aAAa,IAAI,CAAC,MAAM,uBAAuB,SAAS,CAAC,IAAI,GAAG,CACjE,CAAC;AACJ,CAAC"}
|
|
@@ -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/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;AAwB1E,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CAiNtB"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import { MemorySearchSchema } from "./schemas.js";
|
|
2
|
+
import { normalize } from "../utils/normalize.js";
|
|
3
|
+
import { handleMemoryRecap } from "./memory.recap.js";
|
|
4
|
+
import { logger } from "../utils/logger.js";
|
|
5
|
+
import { createMcpResponse } from "../utils/mcp-response.js";
|
|
6
|
+
import { expandQuery } from "../utils/query-expander.js";
|
|
7
|
+
// Hybrid search configuration — weights when vector store is active
|
|
8
|
+
const HYBRID_WEIGHTS_VECTOR = {
|
|
9
|
+
similarity: 0.6,
|
|
10
|
+
vector: 0.3,
|
|
11
|
+
importance: 0.1
|
|
12
|
+
};
|
|
13
|
+
// Weights when vector store returns no results (normalized to sum = 1.0)
|
|
14
|
+
const HYBRID_WEIGHTS_NO_VECTOR = {
|
|
15
|
+
similarity: 0.85,
|
|
16
|
+
importance: 0.15
|
|
17
|
+
};
|
|
18
|
+
export async function handleMemorySearch(params, db, vectors) {
|
|
19
|
+
// Validate input
|
|
20
|
+
const validated = MemorySearchSchema.parse(params);
|
|
21
|
+
// STEP 0: Pre-search recap — only if includeRecap === true
|
|
22
|
+
let recapContext = "";
|
|
23
|
+
if (validated.includeRecap) {
|
|
24
|
+
try {
|
|
25
|
+
const recapResult = await handleMemoryRecap({ repo: validated.repo, limit: 20 }, db);
|
|
26
|
+
// Find text content that contains JSON data
|
|
27
|
+
const textContent = recapResult.content.find((c) => c.type === "text" && c.text);
|
|
28
|
+
if (textContent && textContent.type === "text") {
|
|
29
|
+
try {
|
|
30
|
+
const recapData = JSON.parse(textContent.text);
|
|
31
|
+
if (recapData.summary) {
|
|
32
|
+
recapContext = recapData.summary;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// Not JSON, might be plain text summary
|
|
37
|
+
recapContext = textContent.text;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
logger.error("Failed to get recap context", { error: String(error) });
|
|
43
|
+
// Continue anyway - recap is optional
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Expand query using prompt intent
|
|
47
|
+
const searchQuery = expandQuery(validated.query, validated.prompt);
|
|
48
|
+
// STEP 1: Repo filter (HARD) + Lightweight similarity scoring
|
|
49
|
+
const similarityResults = db.searchBySimilarity(searchQuery, validated.repo, validated.limit * 3 // Get more candidates for vector re-ranking
|
|
50
|
+
);
|
|
51
|
+
let candidates;
|
|
52
|
+
if (similarityResults.length > 0 && similarityResults[0].similarity > 0.1) {
|
|
53
|
+
// Use similarity results as candidates
|
|
54
|
+
candidates = similarityResults.map((result) => ({
|
|
55
|
+
memory: {
|
|
56
|
+
id: result.id,
|
|
57
|
+
type: result.type,
|
|
58
|
+
title: result.title,
|
|
59
|
+
content: result.content,
|
|
60
|
+
importance: result.importance,
|
|
61
|
+
scope: result.scope,
|
|
62
|
+
created_at: result.created_at,
|
|
63
|
+
updated_at: result.updated_at,
|
|
64
|
+
hit_count: result.hit_count,
|
|
65
|
+
recall_count: result.recall_count,
|
|
66
|
+
last_used_at: result.last_used_at,
|
|
67
|
+
expires_at: result.expires_at,
|
|
68
|
+
},
|
|
69
|
+
similarityScore: result.similarity
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
// Fallback: keyword search as candidates
|
|
74
|
+
const allResults = db.searchByRepo(validated.repo, {
|
|
75
|
+
types: validated.types,
|
|
76
|
+
minImportance: validated.minImportance,
|
|
77
|
+
limit: validated.limit * 3
|
|
78
|
+
});
|
|
79
|
+
const normalized = normalize(searchQuery);
|
|
80
|
+
const queryWords = normalized.split(/\s+/).filter(w => w.length > 2);
|
|
81
|
+
const filtered = allResults.filter((entry) => {
|
|
82
|
+
const normalizedContent = normalize(entry.content);
|
|
83
|
+
return queryWords.some(word => normalizedContent.includes(word));
|
|
84
|
+
});
|
|
85
|
+
const memoriesToUse = filtered.length > 0 ? filtered : allResults;
|
|
86
|
+
candidates = memoriesToUse.map(memory => ({
|
|
87
|
+
memory,
|
|
88
|
+
similarityScore: 0.5 // Default similarity for keyword matches
|
|
89
|
+
}));
|
|
90
|
+
}
|
|
91
|
+
// STEP 2: OPTIONAL vector similarity re-rank (only on top candidates)
|
|
92
|
+
let scoredMemories;
|
|
93
|
+
try {
|
|
94
|
+
// Attempt vector search on candidates (if available)
|
|
95
|
+
const vectorResults = await vectors.search(searchQuery, candidates.length);
|
|
96
|
+
if (vectorResults.length > 0) {
|
|
97
|
+
// Create a map of memory ID to vector score
|
|
98
|
+
const vectorScoreMap = new Map();
|
|
99
|
+
for (const vr of vectorResults) {
|
|
100
|
+
vectorScoreMap.set(vr.id, vr.score);
|
|
101
|
+
}
|
|
102
|
+
// Combine scores using hybrid formula (vector active: 0.6 + 0.3 + 0.1 = 1.0)
|
|
103
|
+
scoredMemories = candidates.map(({ memory, similarityScore }) => {
|
|
104
|
+
const vectorScore = vectorScoreMap.get(memory.id) || 0;
|
|
105
|
+
const importanceBoost = memory.importance / 5;
|
|
106
|
+
const finalScore = (similarityScore * HYBRID_WEIGHTS_VECTOR.similarity) +
|
|
107
|
+
(vectorScore * HYBRID_WEIGHTS_VECTOR.vector) +
|
|
108
|
+
(importanceBoost * HYBRID_WEIGHTS_VECTOR.importance);
|
|
109
|
+
return {
|
|
110
|
+
memory,
|
|
111
|
+
similarityScore,
|
|
112
|
+
vectorScore,
|
|
113
|
+
importanceBoost,
|
|
114
|
+
finalScore
|
|
115
|
+
};
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// No vector results — use similarity-only ranking (0.85 + 0.15 = 1.0)
|
|
120
|
+
scoredMemories = candidates.map(({ memory, similarityScore }) => {
|
|
121
|
+
const importanceBoost = memory.importance / 5;
|
|
122
|
+
const finalScore = (similarityScore * HYBRID_WEIGHTS_NO_VECTOR.similarity) +
|
|
123
|
+
(importanceBoost * HYBRID_WEIGHTS_NO_VECTOR.importance);
|
|
124
|
+
return {
|
|
125
|
+
memory,
|
|
126
|
+
similarityScore,
|
|
127
|
+
vectorScore: 0,
|
|
128
|
+
importanceBoost,
|
|
129
|
+
finalScore
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
// Vector search failed — gracefully degrade to similarity-only
|
|
136
|
+
logger.warn("Vector search failed, using similarity-only", { error: String(error) });
|
|
137
|
+
scoredMemories = candidates.map(({ memory, similarityScore }) => {
|
|
138
|
+
const importanceBoost = memory.importance / 5;
|
|
139
|
+
const finalScore = (similarityScore * HYBRID_WEIGHTS_NO_VECTOR.similarity) +
|
|
140
|
+
(importanceBoost * HYBRID_WEIGHTS_NO_VECTOR.importance);
|
|
141
|
+
return {
|
|
142
|
+
memory,
|
|
143
|
+
similarityScore,
|
|
144
|
+
vectorScore: 0,
|
|
145
|
+
importanceBoost,
|
|
146
|
+
finalScore
|
|
147
|
+
};
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
// STEP 3: Sort by final score and take top results
|
|
151
|
+
scoredMemories.sort((a, b) => b.finalScore - a.finalScore);
|
|
152
|
+
const results = scoredMemories
|
|
153
|
+
.slice(0, validated.limit)
|
|
154
|
+
.map(sm => sm.memory);
|
|
155
|
+
// STEP 4: Increment hit_count for returned memories
|
|
156
|
+
for (const memory of results) {
|
|
157
|
+
db.incrementHitCount(memory.id);
|
|
158
|
+
}
|
|
159
|
+
// STEP 5: Log the query for recent queries feature
|
|
160
|
+
db.logAction('search', validated.repo, { query: validated.query, resultCount: results.length });
|
|
161
|
+
const resultData = {
|
|
162
|
+
query: validated.query,
|
|
163
|
+
prompt: validated.prompt || null,
|
|
164
|
+
results,
|
|
165
|
+
matchReason: validated.prompt
|
|
166
|
+
? `Results ranked by relevance to "${validated.query}" with context: ${validated.prompt}`
|
|
167
|
+
: `Results ranked by relevance to "${validated.query}"`,
|
|
168
|
+
recapContext: recapContext ? `Recent memories context:\n${recapContext}` : undefined
|
|
169
|
+
};
|
|
170
|
+
const firstResult = results[0];
|
|
171
|
+
const resultName = firstResult?.title
|
|
172
|
+
? `${firstResult.type} - ${firstResult.title}`
|
|
173
|
+
: (firstResult ? `${firstResult.type} - ${firstResult.content.substring(0, 40)}...` : `Found ${results.length} results`);
|
|
174
|
+
return createMcpResponse(resultData, `Found ${results.length} memories matching "${validated.query}"`, {
|
|
175
|
+
query: validated.query,
|
|
176
|
+
results: results.map(r => ({
|
|
177
|
+
id: r.id,
|
|
178
|
+
type: r.type,
|
|
179
|
+
title: r.title,
|
|
180
|
+
content: r.content,
|
|
181
|
+
importance: r.importance,
|
|
182
|
+
scope: r.scope,
|
|
183
|
+
created_at: r.created_at,
|
|
184
|
+
updated_at: r.updated_at,
|
|
185
|
+
hit_count: r.hit_count,
|
|
186
|
+
recall_count: r.recall_count,
|
|
187
|
+
last_used_at: r.last_used_at,
|
|
188
|
+
expires_at: r.expires_at
|
|
189
|
+
}))
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=memory.search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.search.js","sourceRoot":"","sources":["../../src/tools/memory.search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.search.test.d.ts","sourceRoot":"","sources":["../../src/tools/memory.search.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import * as fc from "fast-check";
|
|
3
|
+
// ─── Property 2: Recap conditional ───────────────────────────────────────────
|
|
4
|
+
// Feature: memory-mcp-optimization, Property 2: Recap conditional
|
|
5
|
+
// We test the weight constants directly by importing them from the module.
|
|
6
|
+
// For Property 2 we need to verify the conditional recap call logic.
|
|
7
|
+
// We do this by extracting the logic into a testable helper and verifying
|
|
8
|
+
// the branching behaviour with fast-check.
|
|
9
|
+
/**
|
|
10
|
+
* Mirrors the weight selection logic from memory.search.ts.
|
|
11
|
+
* Returns the weights object that would be used given whether vector results
|
|
12
|
+
* are present or not.
|
|
13
|
+
*/
|
|
14
|
+
function selectWeights(vectorResultsEmpty) {
|
|
15
|
+
if (vectorResultsEmpty) {
|
|
16
|
+
return { similarity: 0.85, importance: 0.15 };
|
|
17
|
+
}
|
|
18
|
+
return { similarity: 0.6, vector: 0.3, importance: 0.1 };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Mirrors the recap-call decision from memory.search.ts.
|
|
22
|
+
* Returns true if handleMemoryRecap should be called.
|
|
23
|
+
*/
|
|
24
|
+
function shouldCallRecap(includeRecap) {
|
|
25
|
+
return includeRecap === true;
|
|
26
|
+
}
|
|
27
|
+
// ─── Property 2 tests ────────────────────────────────────────────────────────
|
|
28
|
+
describe("Property 2: Recap dipanggil jika dan hanya jika includeRecap = true", () => {
|
|
29
|
+
// Feature: memory-mcp-optimization, Property 2: Recap conditional
|
|
30
|
+
// Validates: Requirements 2.1, 2.2, 2.3
|
|
31
|
+
it("should NOT call recap when includeRecap is false or absent", () => {
|
|
32
|
+
fc.assert(fc.property(fc.oneof(fc.constant(false), fc.constant(undefined)), (includeRecap) => {
|
|
33
|
+
expect(shouldCallRecap(includeRecap)).toBe(false);
|
|
34
|
+
}), { numRuns: 100 });
|
|
35
|
+
});
|
|
36
|
+
it("should call recap when includeRecap is true", () => {
|
|
37
|
+
fc.assert(fc.property(fc.constant(true), (includeRecap) => {
|
|
38
|
+
expect(shouldCallRecap(includeRecap)).toBe(true);
|
|
39
|
+
}), { numRuns: 100 });
|
|
40
|
+
});
|
|
41
|
+
it("recap is called if and only if includeRecap === true (combined property)", () => {
|
|
42
|
+
fc.assert(fc.property(fc.oneof(fc.constant(true), fc.constant(false), fc.constant(undefined)), (includeRecap) => {
|
|
43
|
+
const called = shouldCallRecap(includeRecap);
|
|
44
|
+
// The iff condition: called ↔ (includeRecap === true)
|
|
45
|
+
expect(called).toBe(includeRecap === true);
|
|
46
|
+
}), { numRuns: 200 });
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
// ─── Property 3: Hybrid score weights sum to 1.0 ─────────────────────────────
|
|
50
|
+
describe("Property 3: Total bobot Hybrid Score selalu = 1.0", () => {
|
|
51
|
+
// Feature: memory-mcp-optimization, Property 3: Hybrid score weights sum to 1.0
|
|
52
|
+
// Validates: Requirements 3.1, 3.2, 3.4
|
|
53
|
+
it("weights sum to 1.0 when vector store is empty (no vector results)", () => {
|
|
54
|
+
fc.assert(fc.property(fc.constant(true), // vectorResultsEmpty = true
|
|
55
|
+
(vectorResultsEmpty) => {
|
|
56
|
+
const weights = selectWeights(vectorResultsEmpty);
|
|
57
|
+
const sum = weights.similarity + (weights.vector ?? 0) + weights.importance;
|
|
58
|
+
expect(Math.abs(sum - 1.0)).toBeLessThan(1e-10);
|
|
59
|
+
}), { numRuns: 100 });
|
|
60
|
+
});
|
|
61
|
+
it("weights sum to 1.0 when vector store is active (has vector results)", () => {
|
|
62
|
+
fc.assert(fc.property(fc.constant(false), // vectorResultsEmpty = false
|
|
63
|
+
(vectorResultsEmpty) => {
|
|
64
|
+
const weights = selectWeights(vectorResultsEmpty);
|
|
65
|
+
const sum = weights.similarity + (weights.vector ?? 0) + weights.importance;
|
|
66
|
+
expect(Math.abs(sum - 1.0)).toBeLessThan(1e-10);
|
|
67
|
+
}), { numRuns: 100 });
|
|
68
|
+
});
|
|
69
|
+
it("weights always sum to 1.0 for both vector conditions", () => {
|
|
70
|
+
fc.assert(fc.property(fc.boolean(), // arbitrary vectorResultsEmpty flag
|
|
71
|
+
(vectorResultsEmpty) => {
|
|
72
|
+
const weights = selectWeights(vectorResultsEmpty);
|
|
73
|
+
const sum = weights.similarity + (weights.vector ?? 0) + weights.importance;
|
|
74
|
+
expect(Math.abs(sum - 1.0)).toBeLessThan(1e-10);
|
|
75
|
+
}), { numRuns: 200 });
|
|
76
|
+
});
|
|
77
|
+
it("vector-active weights are exactly 0.6 + 0.3 + 0.1 = 1.0", () => {
|
|
78
|
+
const weights = selectWeights(false);
|
|
79
|
+
expect(weights.similarity).toBe(0.6);
|
|
80
|
+
expect(weights.vector).toBe(0.3);
|
|
81
|
+
expect(weights.importance).toBe(0.1);
|
|
82
|
+
expect(weights.similarity + (weights.vector ?? 0) + weights.importance).toBeCloseTo(1.0, 10);
|
|
83
|
+
});
|
|
84
|
+
it("vector-empty weights are exactly 0.85 + 0.15 = 1.0", () => {
|
|
85
|
+
const weights = selectWeights(true);
|
|
86
|
+
expect(weights.similarity).toBe(0.85);
|
|
87
|
+
expect(weights.vector).toBeUndefined();
|
|
88
|
+
expect(weights.importance).toBe(0.15);
|
|
89
|
+
expect(weights.similarity + weights.importance).toBe(1.0);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
// ─── Prompt parameter tests ─────────────────────────────────────────────────
|
|
93
|
+
describe("Property: prompt parameter in memory-search", () => {
|
|
94
|
+
it("prompt is optional - search works without prompt", () => {
|
|
95
|
+
const params = {
|
|
96
|
+
query: "database orm",
|
|
97
|
+
repo: "test-repo",
|
|
98
|
+
limit: 5
|
|
99
|
+
};
|
|
100
|
+
// If prompt is not provided, searchQuery should equal query
|
|
101
|
+
const hasPrompt = 'prompt' in params && params.prompt;
|
|
102
|
+
const searchQuery = hasPrompt
|
|
103
|
+
? `${params.query} ${params.prompt}`
|
|
104
|
+
: params.query;
|
|
105
|
+
expect(searchQuery).toBe("database orm");
|
|
106
|
+
});
|
|
107
|
+
it("prompt is combined with query when provided", () => {
|
|
108
|
+
const params = {
|
|
109
|
+
query: "database orm",
|
|
110
|
+
prompt: "I need user authentication",
|
|
111
|
+
repo: "test-repo",
|
|
112
|
+
limit: 5
|
|
113
|
+
};
|
|
114
|
+
const searchQuery = params.prompt
|
|
115
|
+
? `${params.query} ${params.prompt}`
|
|
116
|
+
: params.query;
|
|
117
|
+
expect(searchQuery).toBe("database orm I need user authentication");
|
|
118
|
+
});
|
|
119
|
+
it("prompt can be empty string - treated as no prompt (empty string is falsy)", () => {
|
|
120
|
+
const params = {
|
|
121
|
+
query: "database orm",
|
|
122
|
+
prompt: "",
|
|
123
|
+
repo: "test-repo",
|
|
124
|
+
limit: 5
|
|
125
|
+
};
|
|
126
|
+
// Empty string is falsy in JS, so it uses just query
|
|
127
|
+
const searchQuery = params.prompt
|
|
128
|
+
? `${params.query} ${params.prompt}`
|
|
129
|
+
: params.query;
|
|
130
|
+
expect(searchQuery).toBe("database orm");
|
|
131
|
+
});
|
|
132
|
+
it("matchReason includes prompt when provided", () => {
|
|
133
|
+
const query = "database orm";
|
|
134
|
+
const prompt = "user authentication context";
|
|
135
|
+
const matchReason = prompt
|
|
136
|
+
? `Results ranked by relevance to "${query}" with context: ${prompt}`
|
|
137
|
+
: `Results ranked by relevance to "${query}"`;
|
|
138
|
+
expect(matchReason).toContain("database orm");
|
|
139
|
+
expect(matchReason).toContain("user authentication context");
|
|
140
|
+
expect(matchReason).toContain("with context:");
|
|
141
|
+
});
|
|
142
|
+
it("matchReason does not include prompt when not provided", () => {
|
|
143
|
+
const query = "database orm";
|
|
144
|
+
const prompt = undefined;
|
|
145
|
+
const matchReason = prompt
|
|
146
|
+
? `Results ranked by relevance to "${query}" with context: ${prompt}`
|
|
147
|
+
: `Results ranked by relevance to "${query}"`;
|
|
148
|
+
expect(matchReason).toBe(`Results ranked by relevance to "${query}"`);
|
|
149
|
+
expect(matchReason).not.toContain("with context:");
|
|
150
|
+
});
|
|
151
|
+
it("property: searchQuery combines query and prompt consistently", () => {
|
|
152
|
+
fc.assert(fc.property(fc.string({ minLength: 3, maxLength: 50 }), fc.string({ minLength: 1, maxLength: 100 }), (query, prompt) => {
|
|
153
|
+
const searchQuery = `${query} ${prompt}`;
|
|
154
|
+
// Search query should always start with the original query
|
|
155
|
+
expect(searchQuery.startsWith(query)).toBe(true);
|
|
156
|
+
// Search query should contain the prompt
|
|
157
|
+
expect(searchQuery.includes(prompt)).toBe(true);
|
|
158
|
+
// There should be exactly one space between query and prompt
|
|
159
|
+
expect(searchQuery).toBe(`${query} ${prompt}`);
|
|
160
|
+
}), { numRuns: 50 });
|
|
161
|
+
});
|
|
162
|
+
it("property: matchReason format is correct with and without prompt", () => {
|
|
163
|
+
fc.assert(fc.property(fc.string({ minLength: 1, maxLength: 30 }), fc.option(fc.string({ minLength: 1, maxLength: 50 })), (query, prompt) => {
|
|
164
|
+
const matchReason = prompt
|
|
165
|
+
? `Results ranked by relevance to "${query}" with context: ${prompt}`
|
|
166
|
+
: `Results ranked by relevance to "${query}"`;
|
|
167
|
+
// Should always contain the query
|
|
168
|
+
expect(matchReason).toContain(query);
|
|
169
|
+
if (prompt) {
|
|
170
|
+
// Should contain "with context:" when prompt exists
|
|
171
|
+
expect(matchReason).toContain("with context:");
|
|
172
|
+
expect(matchReason).toContain(prompt);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
// Should NOT contain "with context:" when prompt is absent
|
|
176
|
+
expect(matchReason).not.toContain("with context:");
|
|
177
|
+
}
|
|
178
|
+
}), { numRuns: 50 });
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
//# sourceMappingURL=memory.search.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.search.test.js","sourceRoot":"","sources":["../../src/tools/memory.search.test.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/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;AAE1E,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,GAAG,EACX,EAAE,EAAE,WAAW,EACf,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC,CA4CtB"}
|