ai-mind-map 1.1.3 → 1.4.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 +66 -33
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +52 -0
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +273 -23
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +69 -56
- package/dist/install.js.map +1 -1
- package/dist/knowledge-graph/changelog.d.ts +175 -0
- package/dist/knowledge-graph/changelog.d.ts.map +1 -0
- package/dist/knowledge-graph/changelog.js +509 -0
- package/dist/knowledge-graph/changelog.js.map +1 -0
- package/dist/knowledge-graph/graph.d.ts +40 -0
- package/dist/knowledge-graph/graph.d.ts.map +1 -1
- package/dist/knowledge-graph/graph.js +73 -10
- package/dist/knowledge-graph/graph.js.map +1 -1
- package/dist/knowledge-graph/indexer.d.ts +15 -0
- package/dist/knowledge-graph/indexer.d.ts.map +1 -1
- package/dist/knowledge-graph/indexer.js +155 -34
- package/dist/knowledge-graph/indexer.js.map +1 -1
- package/dist/knowledge-graph/parser.d.ts +11 -0
- package/dist/knowledge-graph/parser.d.ts.map +1 -1
- package/dist/knowledge-graph/parser.js +70 -11
- package/dist/knowledge-graph/parser.js.map +1 -1
- package/dist/knowledge-graph/semantic-search.d.ts +166 -0
- package/dist/knowledge-graph/semantic-search.d.ts.map +1 -0
- package/dist/knowledge-graph/semantic-search.js +601 -0
- package/dist/knowledge-graph/semantic-search.js.map +1 -0
- package/dist/memory/shared-sync.d.ts +47 -0
- package/dist/memory/shared-sync.d.ts.map +1 -0
- package/dist/memory/shared-sync.js +219 -0
- package/dist/memory/shared-sync.js.map +1 -0
- package/dist/tools/advanced-tools.d.ts +2 -1
- package/dist/tools/advanced-tools.d.ts.map +1 -1
- package/dist/tools/advanced-tools.js +38 -1
- package/dist/tools/advanced-tools.js.map +1 -1
- package/dist/tools/digest-tools.d.ts +15 -0
- package/dist/tools/digest-tools.d.ts.map +1 -0
- package/dist/tools/digest-tools.js +332 -0
- package/dist/tools/digest-tools.js.map +1 -0
- package/dist/tools/semantic-tools.d.ts +20 -0
- package/dist/tools/semantic-tools.d.ts.map +1 -0
- package/dist/tools/semantic-tools.js +141 -0
- package/dist/tools/semantic-tools.js.map +1 -0
- package/dist/tools/session-tools.d.ts +17 -0
- package/dist/tools/session-tools.d.ts.map +1 -0
- package/dist/tools/session-tools.js +233 -0
- package/dist/tools/session-tools.js.map +1 -0
- package/dist/tools/smart-tools.d.ts +2 -1
- package/dist/tools/smart-tools.d.ts.map +1 -1
- package/dist/tools/smart-tools.js +55 -3
- package/dist/tools/smart-tools.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -1
- package/package.json +9 -3
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Digest & Verification Tools (MCP)
|
|
3
|
+
*
|
|
4
|
+
* Tools for compressed codebase summaries and content verification:
|
|
5
|
+
* - mindmap_digest — Compressed project summary (<2000 tokens)
|
|
6
|
+
* - mindmap_file_digest — Compressed file summary without reading full file
|
|
7
|
+
* - mindmap_verify — Hash-based content verification
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { relative, basename } from 'node:path';
|
|
11
|
+
import { createHash } from 'node:crypto';
|
|
12
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
13
|
+
// ── Helpers ─────────────────────────────────────────────────
|
|
14
|
+
const defaultEstimator = {
|
|
15
|
+
estimate: (s) => Math.ceil(s.length / 4),
|
|
16
|
+
};
|
|
17
|
+
function ok(data, estimator) {
|
|
18
|
+
const json = JSON.stringify(data, null, 2);
|
|
19
|
+
const tokens = estimator.estimate(json);
|
|
20
|
+
return JSON.stringify({ success: true, data, tokenCount: tokens });
|
|
21
|
+
}
|
|
22
|
+
function fail(message) {
|
|
23
|
+
return JSON.stringify({ success: false, error: message });
|
|
24
|
+
}
|
|
25
|
+
function mcpText(text) {
|
|
26
|
+
return { content: [{ type: 'text', text }] };
|
|
27
|
+
}
|
|
28
|
+
// ============================================================
|
|
29
|
+
// Registration
|
|
30
|
+
// ============================================================
|
|
31
|
+
export function registerDigestTools(server, graph, changelog, config, estimator = defaultEstimator) {
|
|
32
|
+
// ── mindmap_digest ─────────────────────────────────────────
|
|
33
|
+
server.tool('mindmap_digest', 'Get a compressed codebase summary in under 2000 tokens. ' +
|
|
34
|
+
'Includes: file tree, tech stack, architecture layers, key symbols, ' +
|
|
35
|
+
'and recent changes. USE THIS instead of reading multiple files to ' +
|
|
36
|
+
'understand a project.', {
|
|
37
|
+
includeChanges: z.boolean().optional().describe('Include recent changes in digest (default: true)'),
|
|
38
|
+
maxTokens: z.number().optional().describe('Max tokens for digest (default: 2000)'),
|
|
39
|
+
}, async (args) => {
|
|
40
|
+
try {
|
|
41
|
+
const maxTokens = args.maxTokens || 2000;
|
|
42
|
+
const includeChanges = args.includeChanges !== false;
|
|
43
|
+
// Check cache first
|
|
44
|
+
const cacheKey = `digest_${maxTokens}_${includeChanges}`;
|
|
45
|
+
const cached = changelog.getCachedDigest(cacheKey);
|
|
46
|
+
if (cached) {
|
|
47
|
+
return mcpText(cached);
|
|
48
|
+
}
|
|
49
|
+
const stats = graph.getStats();
|
|
50
|
+
const overview = graph.getProjectOverview();
|
|
51
|
+
// Build file tree summary
|
|
52
|
+
const filesByDir = new Map();
|
|
53
|
+
const indexedFiles = graph.getIndexedFiles();
|
|
54
|
+
for (const f of indexedFiles) {
|
|
55
|
+
const rel = relative(config.projectRoot, f).replace(/\\/g, '/');
|
|
56
|
+
const dir = rel.includes('/') ? rel.substring(0, rel.lastIndexOf('/')) : '.';
|
|
57
|
+
if (!filesByDir.has(dir))
|
|
58
|
+
filesByDir.set(dir, []);
|
|
59
|
+
filesByDir.get(dir).push(basename(rel));
|
|
60
|
+
}
|
|
61
|
+
// Sort dirs by file count
|
|
62
|
+
const sortedDirs = Array.from(filesByDir.entries())
|
|
63
|
+
.sort(([, a], [, b]) => b.length - a.length);
|
|
64
|
+
// Build directory tree (compact)
|
|
65
|
+
const dirTree = sortedDirs.slice(0, 15).map(([dir, files]) => {
|
|
66
|
+
if (files.length <= 3) {
|
|
67
|
+
return ` ${dir}/ — ${files.join(', ')}`;
|
|
68
|
+
}
|
|
69
|
+
return ` ${dir}/ — ${files.length} files (${files.slice(0, 3).join(', ')}...)`;
|
|
70
|
+
});
|
|
71
|
+
// Key symbols by type (top by PageRank or alphabetical)
|
|
72
|
+
const symbolsByType = {};
|
|
73
|
+
for (const [typeName, nodes] of overview) {
|
|
74
|
+
if (typeName === 'file')
|
|
75
|
+
continue;
|
|
76
|
+
const top = nodes
|
|
77
|
+
.filter(n => n.isExported || n.visibility === 'public')
|
|
78
|
+
.slice(0, 10)
|
|
79
|
+
.map(n => ({
|
|
80
|
+
name: n.qualifiedName || n.name,
|
|
81
|
+
file: relative(config.projectRoot, n.filePath).replace(/\\/g, '/'),
|
|
82
|
+
sig: n.signature ? n.signature.substring(0, 80) : '',
|
|
83
|
+
}));
|
|
84
|
+
if (top.length > 0) {
|
|
85
|
+
symbolsByType[typeName] = top;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Tech stack detection
|
|
89
|
+
const languages = Object.entries(stats.languageBreakdown)
|
|
90
|
+
.sort(([, a], [, b]) => b - a)
|
|
91
|
+
.map(([lang, count]) => `${lang} (${count} files)`);
|
|
92
|
+
// Build the digest
|
|
93
|
+
const lines = [];
|
|
94
|
+
lines.push(`# Project Digest: ${basename(config.projectRoot)}`);
|
|
95
|
+
lines.push(`Stack: ${languages.join(', ')}`);
|
|
96
|
+
lines.push(`Total: ${stats.totalFiles} files, ${stats.totalNodes} symbols, ${stats.totalEdges} relationships`);
|
|
97
|
+
lines.push('');
|
|
98
|
+
lines.push('## Structure');
|
|
99
|
+
lines.push(...dirTree);
|
|
100
|
+
lines.push('');
|
|
101
|
+
// Key exported symbols
|
|
102
|
+
lines.push('## Key Symbols');
|
|
103
|
+
for (const [type, symbols] of Object.entries(symbolsByType)) {
|
|
104
|
+
const symbolList = symbols.map(s => s.sig ? ` ${s.name}: ${s.sig}` : ` ${s.name} (${s.file})`);
|
|
105
|
+
if (symbolList.length > 0) {
|
|
106
|
+
lines.push(`### ${type}s (${symbols.length})`);
|
|
107
|
+
lines.push(...symbolList.slice(0, 8));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Recent changes
|
|
111
|
+
if (includeChanges) {
|
|
112
|
+
const changes = changelog.getChangesSince(Date.now() - 24 * 3600_000);
|
|
113
|
+
if (changes.totalChanges > 0) {
|
|
114
|
+
lines.push('');
|
|
115
|
+
lines.push(`## Recent Changes (${changes.sinceLabel})`);
|
|
116
|
+
for (const f of changes.files.slice(0, 5)) {
|
|
117
|
+
const relPath = relative(config.projectRoot, f.filePath).replace(/\\/g, '/');
|
|
118
|
+
const parts = [];
|
|
119
|
+
if (f.added.length > 0)
|
|
120
|
+
parts.push(`+${f.added.length} added`);
|
|
121
|
+
if (f.modified.length > 0)
|
|
122
|
+
parts.push(`~${f.modified.length} modified`);
|
|
123
|
+
if (f.deleted.length > 0)
|
|
124
|
+
parts.push(`-${f.deleted.length} deleted`);
|
|
125
|
+
lines.push(` ${relPath}: ${parts.join(', ')}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Hotspots
|
|
130
|
+
const hotspots = changelog.getHotspots(3);
|
|
131
|
+
if (hotspots.length > 0) {
|
|
132
|
+
lines.push('');
|
|
133
|
+
lines.push('## Hot Files (most frequently changed)');
|
|
134
|
+
for (const h of hotspots) {
|
|
135
|
+
const rel = relative(config.projectRoot, h.filePath).replace(/\\/g, '/');
|
|
136
|
+
lines.push(` ${rel}: ${h.changeCount} changes`);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
let digest = lines.join('\n');
|
|
140
|
+
// Trim to token budget
|
|
141
|
+
const tokens = estimator.estimate(digest);
|
|
142
|
+
if (tokens > maxTokens) {
|
|
143
|
+
// Truncate by removing sections from the bottom
|
|
144
|
+
while (estimator.estimate(digest) > maxTokens && digest.includes('\n')) {
|
|
145
|
+
const lastNewline = digest.lastIndexOf('\n');
|
|
146
|
+
digest = digest.substring(0, lastNewline);
|
|
147
|
+
}
|
|
148
|
+
digest += '\n\n[Truncated to fit token budget]';
|
|
149
|
+
}
|
|
150
|
+
const result = ok({
|
|
151
|
+
digest,
|
|
152
|
+
tokenCount: estimator.estimate(digest),
|
|
153
|
+
tokensSaved: `~${Math.round(stats.totalNodes * 15)} tokens saved vs reading all files`,
|
|
154
|
+
}, estimator);
|
|
155
|
+
// Cache for 5 minutes
|
|
156
|
+
changelog.setCachedDigest(cacheKey, result, 300_000);
|
|
157
|
+
return mcpText(result);
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
return mcpText(fail(`Failed to generate digest: ${err instanceof Error ? err.message : String(err)}`));
|
|
161
|
+
}
|
|
162
|
+
});
|
|
163
|
+
// ── mindmap_file_digest ────────────────────────────────────
|
|
164
|
+
server.tool('mindmap_file_digest', 'Get a compressed summary of a single file WITHOUT reading the full file. ' +
|
|
165
|
+
'Returns: exports, key functions with signatures, dependencies, and recent changes. ' +
|
|
166
|
+
'Use this to understand a file before deciding whether to read it fully.', {
|
|
167
|
+
file: z.string().describe('File path (relative to project root or absolute)'),
|
|
168
|
+
}, async (args) => {
|
|
169
|
+
try {
|
|
170
|
+
// Resolve file path
|
|
171
|
+
let filePath = args.file;
|
|
172
|
+
if (!filePath.includes(':') && !filePath.startsWith('/')) {
|
|
173
|
+
filePath = `${config.projectRoot}/${filePath}`;
|
|
174
|
+
}
|
|
175
|
+
filePath = filePath.replace(/\//g, '\\');
|
|
176
|
+
// Get all nodes for this file
|
|
177
|
+
const fileNodes = graph.getFileStructure(filePath);
|
|
178
|
+
if (fileNodes.length === 0) {
|
|
179
|
+
// Try relative path match
|
|
180
|
+
const allFiles = graph.getIndexedFiles();
|
|
181
|
+
const match = allFiles.find(f => relative(config.projectRoot, f).replace(/\\/g, '/') === args.file.replace(/\\/g, '/'));
|
|
182
|
+
if (match) {
|
|
183
|
+
const nodes = graph.getFileStructure(match);
|
|
184
|
+
if (nodes.length > 0) {
|
|
185
|
+
return buildFileDigest(match, nodes, args.file);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return mcpText(fail(`File not found in index: ${args.file}`));
|
|
189
|
+
}
|
|
190
|
+
return buildFileDigest(filePath, fileNodes, args.file);
|
|
191
|
+
}
|
|
192
|
+
catch (err) {
|
|
193
|
+
return mcpText(fail(`Failed to get file digest: ${err instanceof Error ? err.message : String(err)}`));
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
function buildFileDigest(filePath, fileNodes, displayPath) {
|
|
197
|
+
const relPath = relative(config.projectRoot, filePath).replace(/\\/g, '/');
|
|
198
|
+
// Categorize symbols
|
|
199
|
+
const exports = fileNodes.filter((n) => n.isExported && n.type !== 'file');
|
|
200
|
+
const functions = fileNodes.filter((n) => ['function', 'method'].includes(n.type));
|
|
201
|
+
const classes = fileNodes.filter((n) => n.type === 'class');
|
|
202
|
+
const interfaces = fileNodes.filter((n) => n.type === 'interface');
|
|
203
|
+
const types = fileNodes.filter((n) => n.type === 'type_alias');
|
|
204
|
+
// Get file changes
|
|
205
|
+
const changes = changelog.getFileChanges(filePath, 10);
|
|
206
|
+
const result = {
|
|
207
|
+
file: relPath,
|
|
208
|
+
language: fileNodes[0]?.language || 'unknown',
|
|
209
|
+
totalSymbols: fileNodes.filter((n) => n.type !== 'file').length,
|
|
210
|
+
lineRange: {
|
|
211
|
+
start: Math.min(...fileNodes.map((n) => n.startLine || 0)),
|
|
212
|
+
end: Math.max(...fileNodes.map((n) => n.endLine || 0)),
|
|
213
|
+
},
|
|
214
|
+
};
|
|
215
|
+
if (exports.length > 0) {
|
|
216
|
+
result.exports = exports.map((n) => ({
|
|
217
|
+
name: n.name,
|
|
218
|
+
type: n.type,
|
|
219
|
+
signature: n.signature ? n.signature.substring(0, 120) : undefined,
|
|
220
|
+
lines: `${n.startLine}-${n.endLine}`,
|
|
221
|
+
}));
|
|
222
|
+
}
|
|
223
|
+
if (classes.length > 0) {
|
|
224
|
+
result.classes = classes.map((c) => ({
|
|
225
|
+
name: c.name,
|
|
226
|
+
exported: c.isExported,
|
|
227
|
+
methods: functions
|
|
228
|
+
.filter((f) => f.qualifiedName?.startsWith(c.name + '.'))
|
|
229
|
+
.map((f) => f.name),
|
|
230
|
+
}));
|
|
231
|
+
}
|
|
232
|
+
if (functions.length > 0 && !result.exports) {
|
|
233
|
+
result.functions = functions.slice(0, 15).map((f) => ({
|
|
234
|
+
name: f.qualifiedName || f.name,
|
|
235
|
+
signature: f.signature ? f.signature.substring(0, 100) : undefined,
|
|
236
|
+
async: f.isAsync || undefined,
|
|
237
|
+
lines: `${f.startLine}-${f.endLine}`,
|
|
238
|
+
}));
|
|
239
|
+
}
|
|
240
|
+
if (changes.length > 0) {
|
|
241
|
+
result.recentChanges = changes.slice(0, 5).map(c => ({
|
|
242
|
+
when: new Date(c.timestamp).toISOString(),
|
|
243
|
+
type: c.changeType,
|
|
244
|
+
symbol: c.symbolName,
|
|
245
|
+
detail: c.changeType === 'modified' && c.oldSignature !== c.newSignature
|
|
246
|
+
? `${c.oldSignature} → ${c.newSignature}`
|
|
247
|
+
: undefined,
|
|
248
|
+
}));
|
|
249
|
+
}
|
|
250
|
+
result.tokensSaved = `~${Math.round(result.lineRange?.end * 4 || 5000)} tokens saved vs reading full file`;
|
|
251
|
+
return mcpText(ok(result, estimator));
|
|
252
|
+
}
|
|
253
|
+
// ── mindmap_verify ─────────────────────────────────────────
|
|
254
|
+
server.tool('mindmap_verify', 'Verify that a file or symbol still matches what you expect. ' +
|
|
255
|
+
'Returns the current content hash and signature without re-reading the file. ' +
|
|
256
|
+
'Use this to check if your cached knowledge of code is still valid.', {
|
|
257
|
+
file: z.string().describe('File path to verify'),
|
|
258
|
+
symbol: z.string().optional().describe('Specific symbol name to verify (e.g., "handleLogin")'),
|
|
259
|
+
}, async (args) => {
|
|
260
|
+
try {
|
|
261
|
+
let filePath = args.file;
|
|
262
|
+
if (!filePath.includes(':') && !filePath.startsWith('/')) {
|
|
263
|
+
filePath = `${config.projectRoot}/${filePath}`;
|
|
264
|
+
}
|
|
265
|
+
filePath = filePath.replace(/\//g, '\\');
|
|
266
|
+
// Get current file hash from disk
|
|
267
|
+
let diskHash = null;
|
|
268
|
+
let diskMtime = null;
|
|
269
|
+
let diskSize = null;
|
|
270
|
+
try {
|
|
271
|
+
const content = await readFile(filePath, 'utf-8');
|
|
272
|
+
diskHash = createHash('sha256').update(content).digest('hex').substring(0, 16);
|
|
273
|
+
const fileStat = await stat(filePath);
|
|
274
|
+
diskMtime = fileStat.mtimeMs;
|
|
275
|
+
diskSize = fileStat.size;
|
|
276
|
+
}
|
|
277
|
+
catch {
|
|
278
|
+
return mcpText(fail(`Cannot read file: ${args.file}`));
|
|
279
|
+
}
|
|
280
|
+
// Get indexed hash
|
|
281
|
+
const indexEntry = graph.getFileIndexEntry(filePath);
|
|
282
|
+
const indexedHash = indexEntry?.content_hash || null;
|
|
283
|
+
const isStale = indexedHash !== null && indexedHash !== diskHash;
|
|
284
|
+
if (args.symbol) {
|
|
285
|
+
// Verify specific symbol
|
|
286
|
+
const nodes = graph.getNodesByName(args.symbol);
|
|
287
|
+
const match = nodes.find(n => n.filePath === filePath || n.filePath.replace(/\\/g, '/') === filePath.replace(/\\/g, '/'));
|
|
288
|
+
if (!match) {
|
|
289
|
+
return mcpText(ok({
|
|
290
|
+
file: args.file,
|
|
291
|
+
symbol: args.symbol,
|
|
292
|
+
status: 'not_found',
|
|
293
|
+
message: `Symbol "${args.symbol}" not found in ${args.file}. It may have been renamed or deleted.`,
|
|
294
|
+
fileIsStale: isStale,
|
|
295
|
+
}, estimator));
|
|
296
|
+
}
|
|
297
|
+
return mcpText(ok({
|
|
298
|
+
file: args.file,
|
|
299
|
+
symbol: args.symbol,
|
|
300
|
+
status: isStale ? 'stale' : 'valid',
|
|
301
|
+
currentSignature: match.signature,
|
|
302
|
+
lines: `${match.startLine}-${match.endLine}`,
|
|
303
|
+
hash: match.hash,
|
|
304
|
+
type: match.type,
|
|
305
|
+
fileIsStale: isStale,
|
|
306
|
+
message: isStale
|
|
307
|
+
? 'File has been modified since last index. Symbol data may be outdated.'
|
|
308
|
+
: 'Symbol data is up-to-date.',
|
|
309
|
+
}, estimator));
|
|
310
|
+
}
|
|
311
|
+
// Verify entire file
|
|
312
|
+
return mcpText(ok({
|
|
313
|
+
file: args.file,
|
|
314
|
+
status: isStale ? 'stale' : 'valid',
|
|
315
|
+
diskHash,
|
|
316
|
+
indexedHash,
|
|
317
|
+
diskSize,
|
|
318
|
+
lastIndexed: indexEntry?.indexed_at
|
|
319
|
+
? new Date(indexEntry.indexed_at).toISOString()
|
|
320
|
+
: null,
|
|
321
|
+
lastModified: diskMtime ? new Date(diskMtime).toISOString() : null,
|
|
322
|
+
message: isStale
|
|
323
|
+
? 'File has changed since last index. Run mindmap_reindex or wait for auto-update.'
|
|
324
|
+
: 'File is up-to-date in the index.',
|
|
325
|
+
}, estimator));
|
|
326
|
+
}
|
|
327
|
+
catch (err) {
|
|
328
|
+
return mcpText(fail(`Verification failed: ${err instanceof Error ? err.message : String(err)}`));
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
//# sourceMappingURL=digest-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digest-tools.js","sourceRoot":"","sources":["../../src/tools/digest-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Semantic Search MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Registers the `mindmap_semantic_search` tool that provides
|
|
5
|
+
* concept-level search using TF-IDF cosine similarity with
|
|
6
|
+
* synonym expansion. Searches like "save user preferences"
|
|
7
|
+
* find `persistSettings()`.
|
|
8
|
+
*/
|
|
9
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
10
|
+
import type { MindMapConfig } from '../types.js';
|
|
11
|
+
import { KnowledgeGraph } from '../knowledge-graph/graph.js';
|
|
12
|
+
import { SemanticSearchEngine } from '../knowledge-graph/semantic-search.js';
|
|
13
|
+
export interface ITokenEstimator {
|
|
14
|
+
estimate(text: string): number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Register semantic search tools on the MCP server.
|
|
18
|
+
*/
|
|
19
|
+
export declare function registerSemanticTools(server: McpServer, graph: KnowledgeGraph, semanticEngine: SemanticSearchEngine, config: MindMapConfig, estimator?: ITokenEstimator): void;
|
|
20
|
+
//# sourceMappingURL=semantic-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-tools.d.ts","sourceRoot":"","sources":["../../src/tools/semantic-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAc,aAAa,EAAa,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAM7E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AA8BD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,cAAc,EACrB,cAAc,EAAE,oBAAoB,EACpC,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,eAAkC,GAC5C,IAAI,CAwIN"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Semantic Search MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Registers the `mindmap_semantic_search` tool that provides
|
|
5
|
+
* concept-level search using TF-IDF cosine similarity with
|
|
6
|
+
* synonym expansion. Searches like "save user preferences"
|
|
7
|
+
* find `persistSettings()`.
|
|
8
|
+
*/
|
|
9
|
+
import { z } from 'zod';
|
|
10
|
+
import { relative } from 'node:path';
|
|
11
|
+
const defaultEstimator = {
|
|
12
|
+
estimate: (text) => Math.ceil(text.length / 4),
|
|
13
|
+
};
|
|
14
|
+
// ============================================================
|
|
15
|
+
// Helpers
|
|
16
|
+
// ============================================================
|
|
17
|
+
function mcpText(result) {
|
|
18
|
+
return {
|
|
19
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function ok(data, estimator) {
|
|
23
|
+
const serialised = JSON.stringify(data);
|
|
24
|
+
const tokens = estimator.estimate(serialised);
|
|
25
|
+
return { success: true, data, tokenCount: tokens, tokensSaved: 0 };
|
|
26
|
+
}
|
|
27
|
+
function fail(message) {
|
|
28
|
+
return { success: false, data: null, tokenCount: 0, tokensSaved: 0, message };
|
|
29
|
+
}
|
|
30
|
+
// ============================================================
|
|
31
|
+
// Registration
|
|
32
|
+
// ============================================================
|
|
33
|
+
/**
|
|
34
|
+
* Register semantic search tools on the MCP server.
|
|
35
|
+
*/
|
|
36
|
+
export function registerSemanticTools(server, graph, semanticEngine, config, estimator = defaultEstimator) {
|
|
37
|
+
// ── mindmap_semantic_search ─────────────────────────────────
|
|
38
|
+
server.tool('mindmap_semantic_search', 'Concept-level semantic search that finds code by MEANING, not just name. ' +
|
|
39
|
+
'Search "save user preferences" to find persistSettings(). ' +
|
|
40
|
+
'Search "authentication" to find login(), signin(), verifyCredentials(). ' +
|
|
41
|
+
'Uses TF-IDF + synonym expansion for intelligent matching. ' +
|
|
42
|
+
'Returns similarity scores and which synonyms were activated.', {
|
|
43
|
+
query: z.string().describe('Natural language query describing what you\'re looking for. ' +
|
|
44
|
+
'Examples: "save user data", "handle authentication", "validate input"'),
|
|
45
|
+
limit: z.number().int().min(1).max(50).default(10).describe('Maximum number of results (default 10)'),
|
|
46
|
+
threshold: z.number().min(0).max(1).default(0.01).describe('Minimum similarity score 0-1 (default 0.01). Raise for more precise results.'),
|
|
47
|
+
useSynonyms: z.boolean().default(true).describe('Whether to expand query with programming synonyms (default true). ' +
|
|
48
|
+
'Set false for exact-term matching only.'),
|
|
49
|
+
}, async ({ query, limit, threshold, useSynonyms }) => {
|
|
50
|
+
try {
|
|
51
|
+
const searchResults = semanticEngine.search(query, limit, threshold, useSynonyms);
|
|
52
|
+
if (searchResults.length === 0) {
|
|
53
|
+
return mcpText(ok({
|
|
54
|
+
query,
|
|
55
|
+
results: [],
|
|
56
|
+
totalResults: 0,
|
|
57
|
+
synonymsExpanded: [],
|
|
58
|
+
message: 'No semantic matches found. Try a broader query or different terms.',
|
|
59
|
+
}, estimator));
|
|
60
|
+
}
|
|
61
|
+
// Enrich results with graph node data
|
|
62
|
+
const enrichedResults = [];
|
|
63
|
+
for (const sr of searchResults) {
|
|
64
|
+
const node = graph.getNode(sr.nodeId);
|
|
65
|
+
if (!node)
|
|
66
|
+
continue;
|
|
67
|
+
const relPath = relative(config.projectRoot, node.filePath);
|
|
68
|
+
enrichedResults.push({
|
|
69
|
+
name: node.name,
|
|
70
|
+
qualifiedName: node.qualifiedName,
|
|
71
|
+
type: node.type,
|
|
72
|
+
file: relPath,
|
|
73
|
+
line: node.startLine,
|
|
74
|
+
endLine: node.endLine,
|
|
75
|
+
signature: node.signature,
|
|
76
|
+
visibility: node.visibility,
|
|
77
|
+
isExported: node.isExported,
|
|
78
|
+
docComment: node.docComment,
|
|
79
|
+
// Semantic search metadata
|
|
80
|
+
semanticScore: Math.round(sr.score * 1000) / 1000,
|
|
81
|
+
matchedTerms: sr.matchedTerms,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
// Collect activated synonyms from the first result (same for all)
|
|
85
|
+
const synonymsExpanded = searchResults.length > 0
|
|
86
|
+
? searchResults[0].expandedSynonyms
|
|
87
|
+
: [];
|
|
88
|
+
const response = {
|
|
89
|
+
query,
|
|
90
|
+
results: enrichedResults,
|
|
91
|
+
totalResults: enrichedResults.length,
|
|
92
|
+
synonymsExpanded: synonymsExpanded.length > 0 ? synonymsExpanded : undefined,
|
|
93
|
+
searchMode: 'semantic',
|
|
94
|
+
};
|
|
95
|
+
return mcpText(ok(response, estimator));
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
99
|
+
return mcpText(fail(`semantic_search failed: ${msg}`));
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
// ── mindmap_semantic_stats ──────────────────────────────────
|
|
103
|
+
server.tool('mindmap_semantic_stats', 'Get statistics about the semantic search index: vocabulary size, ' +
|
|
104
|
+
'document count, and available synonym groups.', {}, async () => {
|
|
105
|
+
try {
|
|
106
|
+
const stats = semanticEngine.getStats();
|
|
107
|
+
const synonymGroups = semanticEngine.getSynonymGroups();
|
|
108
|
+
const response = {
|
|
109
|
+
index: stats,
|
|
110
|
+
synonymGroups: synonymGroups.length,
|
|
111
|
+
synonymExamples: synonymGroups.slice(0, 5).map(group => `${group[0]} ↔ ${group.slice(1, 4).join(', ')}...`),
|
|
112
|
+
};
|
|
113
|
+
return mcpText(ok(response, estimator));
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
117
|
+
return mcpText(fail(`semantic_stats failed: ${msg}`));
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
// ── mindmap_synonyms ────────────────────────────────────────
|
|
121
|
+
server.tool('mindmap_synonyms', 'Look up programming synonyms for a term. Useful to understand ' +
|
|
122
|
+
'what the semantic search will expand to.', {
|
|
123
|
+
term: z.string().describe('Term to look up synonyms for (e.g., "save", "auth", "delete")'),
|
|
124
|
+
}, async ({ term }) => {
|
|
125
|
+
try {
|
|
126
|
+
const synonyms = semanticEngine.getSynonyms(term);
|
|
127
|
+
return mcpText(ok({
|
|
128
|
+
term,
|
|
129
|
+
synonyms: synonyms.length > 0 ? synonyms : null,
|
|
130
|
+
message: synonyms.length > 0
|
|
131
|
+
? `Found ${synonyms.length} synonyms for "${term}"`
|
|
132
|
+
: `No synonyms found for "${term}". This term will be matched literally.`,
|
|
133
|
+
}, estimator));
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
137
|
+
return mcpText(fail(`synonyms lookup failed: ${msg}`));
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=semantic-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-tools.js","sourceRoot":"","sources":["../../src/tools/semantic-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Session Tools (MCP)
|
|
3
|
+
*
|
|
4
|
+
* Tools for AI agent session management:
|
|
5
|
+
* - mindmap_session_start — Start tracking an AI session
|
|
6
|
+
* - mindmap_session_resume — Resume from last session (returns what changed)
|
|
7
|
+
* - mindmap_session_end — End session with summary
|
|
8
|
+
* - mindmap_changelog — What changed since a given time
|
|
9
|
+
* - mindmap_hotspots — Most frequently changed files
|
|
10
|
+
*/
|
|
11
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
12
|
+
import type { KnowledgeGraph } from '../knowledge-graph/graph.js';
|
|
13
|
+
import type { ChangelogEngine } from '../knowledge-graph/changelog.js';
|
|
14
|
+
import type { MindMapConfig } from '../types.js';
|
|
15
|
+
import type { ITokenEstimator } from './advanced-tools.js';
|
|
16
|
+
export declare function registerSessionTools(server: McpServer, graph: KnowledgeGraph, changelog: ChangelogEngine, config: MindMapConfig, estimator?: ITokenEstimator): void;
|
|
17
|
+
//# sourceMappingURL=session-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-tools.d.ts","sourceRoot":"","sources":["../../src/tools/session-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AA0B3D,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,eAAe,EAC1B,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,eAAkC,GAC5C,IAAI,CAwPN"}
|