@vheins/local-memory-mcp 0.5.22 → 0.5.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mcp/tests/e2e.test.js +13 -9
- package/dist/mcp/tests/e2e.test.js.map +1 -1
- package/dist/mcp/tests/router.test.js +1 -1
- package/dist/mcp/tests/router.test.js.map +1 -1
- package/dist/mcp/tests/tasks.bulk.test.js +1 -1
- package/dist/mcp/tests/tasks.bulk.test.js.map +1 -1
- package/dist/mcp/tests/v2-features.test.js +2 -2
- package/dist/mcp/tests/v2-features.test.js.map +1 -1
- package/dist/mcp/tools/memory.recap.d.ts.map +1 -1
- package/dist/mcp/tools/memory.recap.js +48 -80
- package/dist/mcp/tools/memory.recap.js.map +1 -1
- package/dist/mcp/tools/memory.search.d.ts.map +1 -1
- package/dist/mcp/tools/memory.search.js +58 -39
- package/dist/mcp/tools/memory.search.js.map +1 -1
- package/dist/mcp/tools/schemas.d.ts +188 -176
- package/dist/mcp/tools/schemas.d.ts.map +1 -1
- package/dist/mcp/tools/schemas.js +52 -46
- package/dist/mcp/tools/schemas.js.map +1 -1
- package/dist/mcp/tools/task.manage.d.ts.map +1 -1
- package/dist/mcp/tools/task.manage.js +6 -5
- package/dist/mcp/tools/task.manage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { MemorySearchSchema } from "./schemas.js";
|
|
2
|
-
import { handleMemoryRecap } from "./memory.recap.js";
|
|
3
2
|
import { logger } from "../utils/logger.js";
|
|
4
|
-
import { createMcpResponse
|
|
3
|
+
import { createMcpResponse } from "../utils/mcp-response.js";
|
|
5
4
|
import { expandQuery } from "../utils/query-expander.js";
|
|
6
5
|
const HYBRID_WEIGHTS_VECTOR = {
|
|
7
6
|
similarity: 0.4,
|
|
@@ -14,19 +13,11 @@ const HYBRID_WEIGHTS_NO_VECTOR = {
|
|
|
14
13
|
};
|
|
15
14
|
export async function handleMemorySearch(params, db, vectors) {
|
|
16
15
|
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 = getPrimaryTextContent(recapRes);
|
|
22
|
-
}
|
|
23
|
-
catch (error) {
|
|
24
|
-
logger.error("Failed to get recap context", { error: String(error) });
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
16
|
const searchQuery = expandQuery(validated.query, validated.prompt);
|
|
28
17
|
// 1. Get Candidates from SQLite
|
|
29
|
-
|
|
18
|
+
// Fetch more than limit to support offset slicing after scoring
|
|
19
|
+
const fetchLimit = (validated.offset + validated.limit) * 3;
|
|
20
|
+
const similarityResults = db.searchBySimilarity(searchQuery, validated.repo, fetchLimit, validated.include_archived, validated.current_tags ?? []);
|
|
30
21
|
let candidates = similarityResults.map(r => ({
|
|
31
22
|
memory: r,
|
|
32
23
|
similarityScore: r.similarity
|
|
@@ -35,11 +26,10 @@ export async function handleMemorySearch(params, db, vectors) {
|
|
|
35
26
|
if (candidates.length > 0) {
|
|
36
27
|
const currentPath = validated.current_file_path?.toLowerCase();
|
|
37
28
|
const currentTags = (validated.current_tags || []).map(t => t.toLowerCase());
|
|
38
|
-
// Attempt to resolve current branch if not provided (optional)
|
|
39
29
|
const currentBranch = validated.scope?.branch;
|
|
40
30
|
candidates = candidates.map(c => {
|
|
41
31
|
let boost = 0;
|
|
42
|
-
// Branch boost (+0.1)
|
|
32
|
+
// Branch boost (+0.1)
|
|
43
33
|
if (currentBranch && c.memory.scope.branch === currentBranch) {
|
|
44
34
|
boost += 0.1;
|
|
45
35
|
}
|
|
@@ -53,8 +43,7 @@ export async function handleMemorySearch(params, db, vectors) {
|
|
|
53
43
|
if (ext && ext.includes(c.memory.scope.language.toLowerCase()))
|
|
54
44
|
boost += 0.1;
|
|
55
45
|
}
|
|
56
|
-
//
|
|
57
|
-
// If the memory has tags that match the current workspace tech-stack
|
|
46
|
+
// Tag affinity boost (+0.2)
|
|
58
47
|
if (currentTags.length > 0 && c.memory.tags.some(t => currentTags.includes(t.toLowerCase()))) {
|
|
59
48
|
boost += 0.2;
|
|
60
49
|
}
|
|
@@ -77,7 +66,6 @@ export async function handleMemorySearch(params, db, vectors) {
|
|
|
77
66
|
});
|
|
78
67
|
}
|
|
79
68
|
else if (vectorResults.length > 0) {
|
|
80
|
-
// If SQLite found nothing but vectors did (rare due to our fallback)
|
|
81
69
|
const vectorIds = vectorResults.map((vr) => vr.id);
|
|
82
70
|
const fetchedMemories = db.getByIds(vectorIds);
|
|
83
71
|
const memoryMap = new Map(fetchedMemories.map(m => [m.id, m]));
|
|
@@ -106,30 +94,61 @@ export async function handleMemorySearch(params, db, vectors) {
|
|
|
106
94
|
// 4. Threshold & Final Selection
|
|
107
95
|
scoredMemories.sort((a, b) => b.finalScore - a.finalScore);
|
|
108
96
|
const threshold = scoredMemories.length <= 5 ? 0.10 : 0.40;
|
|
109
|
-
let
|
|
97
|
+
let allMatches = scoredMemories.filter(sm => sm.finalScore >= threshold).map(sm => sm.memory);
|
|
110
98
|
// Absolute fallback: if repo has data but search failed threshold, return top 1
|
|
111
|
-
if (
|
|
112
|
-
|
|
99
|
+
if (allMatches.length === 0 && scoredMemories.length > 0) {
|
|
100
|
+
allMatches = [scoredMemories[0].memory];
|
|
113
101
|
}
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
102
|
+
// Total count of all matches (before pagination)
|
|
103
|
+
const total = allMatches.length;
|
|
104
|
+
// Apply pagination (offset + limit)
|
|
105
|
+
const paginatedResults = allMatches.slice(validated.offset, validated.offset + validated.limit);
|
|
106
|
+
// 5. Post-processing — increment hit count only for pages actually returned
|
|
107
|
+
db.incrementHitCounts(paginatedResults.map(m => m.id));
|
|
108
|
+
logger.info("[MCP] memory.search", {
|
|
109
|
+
repo: validated.repo,
|
|
119
110
|
query: validated.query,
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
111
|
+
total,
|
|
112
|
+
offset: validated.offset,
|
|
113
|
+
returned: paginatedResults.length
|
|
114
|
+
});
|
|
115
|
+
// 6. Build pointer table — columns: [id, title, type, importance]
|
|
116
|
+
const COLUMNS = ["id", "title", "type", "importance"];
|
|
117
|
+
const rows = paginatedResults.map(m => [
|
|
118
|
+
m.id,
|
|
119
|
+
m.title ?? "Untitled",
|
|
120
|
+
m.type,
|
|
121
|
+
m.importance,
|
|
122
|
+
]);
|
|
123
|
+
const structuredContent = {
|
|
124
|
+
schema: "memory-search",
|
|
125
|
+
query: validated.query,
|
|
126
|
+
count: paginatedResults.length,
|
|
127
|
+
total,
|
|
128
|
+
offset: validated.offset,
|
|
129
|
+
limit: validated.limit,
|
|
130
|
+
results: {
|
|
131
|
+
columns: [...COLUMNS],
|
|
132
|
+
rows,
|
|
133
|
+
},
|
|
134
|
+
};
|
|
135
|
+
// Resource links: one per result row so agents can navigate to full content
|
|
136
|
+
const resourceLinks = paginatedResults.map(m => ({
|
|
137
|
+
uri: `memory://${m.id}`,
|
|
138
|
+
name: m.title ?? m.id,
|
|
139
|
+
mimeType: "application/json",
|
|
140
|
+
annotations: {
|
|
141
|
+
audience: ["assistant"],
|
|
142
|
+
priority: 0.8,
|
|
143
|
+
},
|
|
144
|
+
}));
|
|
145
|
+
const contentSummary = paginatedResults.length > 0
|
|
146
|
+
? `Found ${total} memories for "${validated.query}" (showing ${paginatedResults.length} at offset ${validated.offset}). Use memory://<id> to read full content.`
|
|
147
|
+
: `No memories found for "${validated.query}" in repo "${validated.repo}".`;
|
|
148
|
+
return createMcpResponse(structuredContent, contentSummary, {
|
|
149
|
+
contentSummary,
|
|
150
|
+
includeSerializedStructuredContent: false,
|
|
151
|
+
resourceLinks,
|
|
133
152
|
});
|
|
134
153
|
}
|
|
135
154
|
//# sourceMappingURL=memory.search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.search.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAIlD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"memory.search.js","sourceRoot":"","sources":["../../../src/mcp/tools/memory.search.ts"],"names":[],"mappings":"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"}
|