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.
Files changed (61) hide show
  1. package/README.md +66 -33
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +52 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +3 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/index.js +273 -23
  9. package/dist/index.js.map +1 -1
  10. package/dist/install.d.ts.map +1 -1
  11. package/dist/install.js +69 -56
  12. package/dist/install.js.map +1 -1
  13. package/dist/knowledge-graph/changelog.d.ts +175 -0
  14. package/dist/knowledge-graph/changelog.d.ts.map +1 -0
  15. package/dist/knowledge-graph/changelog.js +509 -0
  16. package/dist/knowledge-graph/changelog.js.map +1 -0
  17. package/dist/knowledge-graph/graph.d.ts +40 -0
  18. package/dist/knowledge-graph/graph.d.ts.map +1 -1
  19. package/dist/knowledge-graph/graph.js +73 -10
  20. package/dist/knowledge-graph/graph.js.map +1 -1
  21. package/dist/knowledge-graph/indexer.d.ts +15 -0
  22. package/dist/knowledge-graph/indexer.d.ts.map +1 -1
  23. package/dist/knowledge-graph/indexer.js +155 -34
  24. package/dist/knowledge-graph/indexer.js.map +1 -1
  25. package/dist/knowledge-graph/parser.d.ts +11 -0
  26. package/dist/knowledge-graph/parser.d.ts.map +1 -1
  27. package/dist/knowledge-graph/parser.js +70 -11
  28. package/dist/knowledge-graph/parser.js.map +1 -1
  29. package/dist/knowledge-graph/semantic-search.d.ts +166 -0
  30. package/dist/knowledge-graph/semantic-search.d.ts.map +1 -0
  31. package/dist/knowledge-graph/semantic-search.js +601 -0
  32. package/dist/knowledge-graph/semantic-search.js.map +1 -0
  33. package/dist/memory/shared-sync.d.ts +47 -0
  34. package/dist/memory/shared-sync.d.ts.map +1 -0
  35. package/dist/memory/shared-sync.js +219 -0
  36. package/dist/memory/shared-sync.js.map +1 -0
  37. package/dist/tools/advanced-tools.d.ts +2 -1
  38. package/dist/tools/advanced-tools.d.ts.map +1 -1
  39. package/dist/tools/advanced-tools.js +38 -1
  40. package/dist/tools/advanced-tools.js.map +1 -1
  41. package/dist/tools/digest-tools.d.ts +15 -0
  42. package/dist/tools/digest-tools.d.ts.map +1 -0
  43. package/dist/tools/digest-tools.js +332 -0
  44. package/dist/tools/digest-tools.js.map +1 -0
  45. package/dist/tools/semantic-tools.d.ts +20 -0
  46. package/dist/tools/semantic-tools.d.ts.map +1 -0
  47. package/dist/tools/semantic-tools.js +141 -0
  48. package/dist/tools/semantic-tools.js.map +1 -0
  49. package/dist/tools/session-tools.d.ts +17 -0
  50. package/dist/tools/session-tools.d.ts.map +1 -0
  51. package/dist/tools/session-tools.js +233 -0
  52. package/dist/tools/session-tools.js.map +1 -0
  53. package/dist/tools/smart-tools.d.ts +2 -1
  54. package/dist/tools/smart-tools.d.ts.map +1 -1
  55. package/dist/tools/smart-tools.js +55 -3
  56. package/dist/tools/smart-tools.js.map +1 -1
  57. package/dist/types.d.ts +6 -0
  58. package/dist/types.d.ts.map +1 -1
  59. package/dist/types.js +3 -0
  60. package/dist/types.js.map +1 -1
  61. 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"}