ai-mind-map 1.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/LICENSE +21 -0
- package/README.md +554 -0
- package/dist/change-tracker/change-log.d.ts +160 -0
- package/dist/change-tracker/change-log.d.ts.map +1 -0
- package/dist/change-tracker/change-log.js +507 -0
- package/dist/change-tracker/change-log.js.map +1 -0
- package/dist/change-tracker/diff-engine.d.ts +149 -0
- package/dist/change-tracker/diff-engine.d.ts.map +1 -0
- package/dist/change-tracker/diff-engine.js +530 -0
- package/dist/change-tracker/diff-engine.js.map +1 -0
- package/dist/change-tracker/watcher.d.ts +137 -0
- package/dist/change-tracker/watcher.d.ts.map +1 -0
- package/dist/change-tracker/watcher.js +300 -0
- package/dist/change-tracker/watcher.js.map +1 -0
- package/dist/cli.d.ts +20 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +937 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +38 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +222 -0
- package/dist/config.js.map +1 -0
- package/dist/context/compressor.d.ts +49 -0
- package/dist/context/compressor.d.ts.map +1 -0
- package/dist/context/compressor.js +769 -0
- package/dist/context/compressor.js.map +1 -0
- package/dist/context/progressive-disclosure.d.ts +71 -0
- package/dist/context/progressive-disclosure.d.ts.map +1 -0
- package/dist/context/progressive-disclosure.js +470 -0
- package/dist/context/progressive-disclosure.js.map +1 -0
- package/dist/context/token-budget.d.ts +121 -0
- package/dist/context/token-budget.d.ts.map +1 -0
- package/dist/context/token-budget.js +282 -0
- package/dist/context/token-budget.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +944 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +66 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +946 -0
- package/dist/install.js.map +1 -0
- package/dist/knowledge-graph/architecture.d.ts +213 -0
- package/dist/knowledge-graph/architecture.d.ts.map +1 -0
- package/dist/knowledge-graph/architecture.js +585 -0
- package/dist/knowledge-graph/architecture.js.map +1 -0
- package/dist/knowledge-graph/cypher.d.ts +113 -0
- package/dist/knowledge-graph/cypher.d.ts.map +1 -0
- package/dist/knowledge-graph/cypher.js +1051 -0
- package/dist/knowledge-graph/cypher.js.map +1 -0
- package/dist/knowledge-graph/dead-code.d.ts +121 -0
- package/dist/knowledge-graph/dead-code.d.ts.map +1 -0
- package/dist/knowledge-graph/dead-code.js +331 -0
- package/dist/knowledge-graph/dead-code.js.map +1 -0
- package/dist/knowledge-graph/flow-analyzer.d.ts +167 -0
- package/dist/knowledge-graph/flow-analyzer.d.ts.map +1 -0
- package/dist/knowledge-graph/flow-analyzer.js +739 -0
- package/dist/knowledge-graph/flow-analyzer.js.map +1 -0
- package/dist/knowledge-graph/graph.d.ts +291 -0
- package/dist/knowledge-graph/graph.d.ts.map +1 -0
- package/dist/knowledge-graph/graph.js +978 -0
- package/dist/knowledge-graph/graph.js.map +1 -0
- package/dist/knowledge-graph/index.d.ts +17 -0
- package/dist/knowledge-graph/index.d.ts.map +1 -0
- package/dist/knowledge-graph/index.js +14 -0
- package/dist/knowledge-graph/index.js.map +1 -0
- package/dist/knowledge-graph/indexer.d.ts +112 -0
- package/dist/knowledge-graph/indexer.d.ts.map +1 -0
- package/dist/knowledge-graph/indexer.js +506 -0
- package/dist/knowledge-graph/indexer.js.map +1 -0
- package/dist/knowledge-graph/pagerank.d.ts +141 -0
- package/dist/knowledge-graph/pagerank.d.ts.map +1 -0
- package/dist/knowledge-graph/pagerank.js +493 -0
- package/dist/knowledge-graph/pagerank.js.map +1 -0
- package/dist/knowledge-graph/parser.d.ts +55 -0
- package/dist/knowledge-graph/parser.d.ts.map +1 -0
- package/dist/knowledge-graph/parser.js +1090 -0
- package/dist/knowledge-graph/parser.js.map +1 -0
- package/dist/knowledge-graph/snapshot.d.ts +107 -0
- package/dist/knowledge-graph/snapshot.d.ts.map +1 -0
- package/dist/knowledge-graph/snapshot.js +435 -0
- package/dist/knowledge-graph/snapshot.js.map +1 -0
- package/dist/memory/decision-log.d.ts +151 -0
- package/dist/memory/decision-log.d.ts.map +1 -0
- package/dist/memory/decision-log.js +482 -0
- package/dist/memory/decision-log.js.map +1 -0
- package/dist/memory/persistent-memory.d.ts +182 -0
- package/dist/memory/persistent-memory.d.ts.map +1 -0
- package/dist/memory/persistent-memory.js +579 -0
- package/dist/memory/persistent-memory.js.map +1 -0
- package/dist/memory/session-memory.d.ts +165 -0
- package/dist/memory/session-memory.d.ts.map +1 -0
- package/dist/memory/session-memory.js +382 -0
- package/dist/memory/session-memory.js.map +1 -0
- package/dist/stress-test.d.ts +10 -0
- package/dist/stress-test.d.ts.map +1 -0
- package/dist/stress-test.js +258 -0
- package/dist/stress-test.js.map +1 -0
- package/dist/tools/advanced-tools.d.ts +32 -0
- package/dist/tools/advanced-tools.d.ts.map +1 -0
- package/dist/tools/advanced-tools.js +480 -0
- package/dist/tools/advanced-tools.js.map +1 -0
- package/dist/tools/change-tools.d.ts +76 -0
- package/dist/tools/change-tools.d.ts.map +1 -0
- package/dist/tools/change-tools.js +93 -0
- package/dist/tools/change-tools.js.map +1 -0
- package/dist/tools/context-tools.d.ts +68 -0
- package/dist/tools/context-tools.d.ts.map +1 -0
- package/dist/tools/context-tools.js +141 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/debug-tools.d.ts +25 -0
- package/dist/tools/debug-tools.d.ts.map +1 -0
- package/dist/tools/debug-tools.js +286 -0
- package/dist/tools/debug-tools.js.map +1 -0
- package/dist/tools/evolving-tools.d.ts +23 -0
- package/dist/tools/evolving-tools.d.ts.map +1 -0
- package/dist/tools/evolving-tools.js +207 -0
- package/dist/tools/evolving-tools.js.map +1 -0
- package/dist/tools/flow-tools.d.ts +24 -0
- package/dist/tools/flow-tools.d.ts.map +1 -0
- package/dist/tools/flow-tools.js +265 -0
- package/dist/tools/flow-tools.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +71 -0
- package/dist/tools/graph-tools.d.ts.map +1 -0
- package/dist/tools/graph-tools.js +165 -0
- package/dist/tools/graph-tools.js.map +1 -0
- package/dist/tools/memory-tools.d.ts +62 -0
- package/dist/tools/memory-tools.d.ts.map +1 -0
- package/dist/tools/memory-tools.js +195 -0
- package/dist/tools/memory-tools.js.map +1 -0
- package/dist/tools/smart-tools.d.ts +23 -0
- package/dist/tools/smart-tools.d.ts.map +1 -0
- package/dist/tools/smart-tools.js +482 -0
- package/dist/tools/smart-tools.js.map +1 -0
- package/dist/tools/snapshot-tools.d.ts +19 -0
- package/dist/tools/snapshot-tools.d.ts.map +1 -0
- package/dist/tools/snapshot-tools.js +149 -0
- package/dist/tools/snapshot-tools.js.map +1 -0
- package/dist/types.d.ts +181 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +45 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +59 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +142 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/token-counter.d.ts +51 -0
- package/dist/utils/token-counter.d.ts.map +1 -0
- package/dist/utils/token-counter.js +181 -0
- package/dist/utils/token-counter.js.map +1 -0
- package/install.ps1 +321 -0
- package/install.sh +345 -0
- package/package.json +94 -0
- package/setup.bat +62 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Self-Evolving MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* These tools let the AI TEACH the system new patterns that persist
|
|
5
|
+
* per-project in SQLite. The system evolves over time on each user's
|
|
6
|
+
* machine as the AI learns project-specific conventions.
|
|
7
|
+
*
|
|
8
|
+
* Tools:
|
|
9
|
+
* - mindmap_teach — AI teaches a new rule (classification, search alias, convention)
|
|
10
|
+
* - mindmap_get_learned — View all learned rules
|
|
11
|
+
* - mindmap_forget — Remove a learned rule
|
|
12
|
+
*/
|
|
13
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
14
|
+
import type { MindMapConfig } from '../types.js';
|
|
15
|
+
import { KnowledgeGraph } from '../knowledge-graph/graph.js';
|
|
16
|
+
export interface ITokenEstimator {
|
|
17
|
+
estimate(text: string): number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Register self-evolving tools — AI can teach the system new patterns.
|
|
21
|
+
*/
|
|
22
|
+
export declare function registerEvolvingTools(server: McpServer, graph: KnowledgeGraph, config: MindMapConfig, estimator?: ITokenEstimator): void;
|
|
23
|
+
//# sourceMappingURL=evolving-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolving-tools.d.ts","sourceRoot":"","sources":["../../src/tools/evolving-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAc,aAAa,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAM7D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AA0BD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,eAAkC,GAC5C,IAAI,CA4LN"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Self-Evolving MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* These tools let the AI TEACH the system new patterns that persist
|
|
5
|
+
* per-project in SQLite. The system evolves over time on each user's
|
|
6
|
+
* machine as the AI learns project-specific conventions.
|
|
7
|
+
*
|
|
8
|
+
* Tools:
|
|
9
|
+
* - mindmap_teach — AI teaches a new rule (classification, search alias, convention)
|
|
10
|
+
* - mindmap_get_learned — View all learned rules
|
|
11
|
+
* - mindmap_forget — Remove a learned rule
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
const defaultEstimator = {
|
|
15
|
+
estimate: (text) => Math.ceil(text.length / 4),
|
|
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 self-evolving tools — AI can teach the system new patterns.
|
|
35
|
+
*/
|
|
36
|
+
export function registerEvolvingTools(server, graph, config, estimator = defaultEstimator) {
|
|
37
|
+
// ── mindmap_teach ────────────────────────────────────────────
|
|
38
|
+
server.tool('mindmap_teach', 'Teach the AI Mind Map a new rule that persists on this machine. ' +
|
|
39
|
+
'The rule is saved in the project database and automatically applied ' +
|
|
40
|
+
'in future sessions. Use this when:\n' +
|
|
41
|
+
'- A file/pattern is misclassified → teach a classification rule\n' +
|
|
42
|
+
'- You keep searching for synonyms → teach a search alias\n' +
|
|
43
|
+
'- You notice a project convention → teach a convention\n' +
|
|
44
|
+
'- You spot a code pattern → teach a code pattern\n\n' +
|
|
45
|
+
'Examples:\n' +
|
|
46
|
+
' Classification: { type: "classification", name: "bloc_files", layer: "state_update", ' +
|
|
47
|
+
'source: "path", patterns: ["\\\\.bloc\\\\.dart$"], weight: 3 }\n' +
|
|
48
|
+
' Search alias: { type: "search_alias", name: "auth_aliases", term: "auth", ' +
|
|
49
|
+
'aliases: ["login", "authentication", "session", "jwt"] }\n' +
|
|
50
|
+
' Convention: { type: "convention", name: "api_naming", description: "All API methods end with Async" }', {
|
|
51
|
+
type: z.enum(['classification', 'search_alias', 'code_pattern', 'convention'])
|
|
52
|
+
.describe('Type of rule to teach'),
|
|
53
|
+
name: z.string().min(1).max(100)
|
|
54
|
+
.describe('Unique name for this rule (e.g., "flutter_bloc_pattern", "auth_search_alias")'),
|
|
55
|
+
description: z.string().min(1)
|
|
56
|
+
.describe('Human-readable description of what this rule does'),
|
|
57
|
+
// Classification-specific
|
|
58
|
+
layer: z.string().optional()
|
|
59
|
+
.describe('For classification rules: target layer (e.g., "service", "ui_component", "database")'),
|
|
60
|
+
source: z.enum(['content', 'path', 'directory', 'import', 'symbol_name']).optional()
|
|
61
|
+
.describe('For classification rules: what to match against'),
|
|
62
|
+
patterns: z.array(z.string()).optional()
|
|
63
|
+
.describe('Regex patterns to match (as strings). Example: ["Manager\\\\.cs$", "Service\\\\.cs$"]'),
|
|
64
|
+
weight: z.number().int().min(1).max(5).optional()
|
|
65
|
+
.describe('For classification rules: signal weight 1-5 (default 3)'),
|
|
66
|
+
// Search alias-specific
|
|
67
|
+
term: z.string().optional()
|
|
68
|
+
.describe('For search_alias: the search term to create aliases for'),
|
|
69
|
+
aliases: z.array(z.string()).optional()
|
|
70
|
+
.describe('For search_alias: alternative terms to also search for'),
|
|
71
|
+
// Code pattern / convention
|
|
72
|
+
details: z.record(z.unknown()).optional()
|
|
73
|
+
.describe('Any additional structured data for the rule'),
|
|
74
|
+
}, async ({ type, name, description, layer, source, patterns, weight, term, aliases, details }) => {
|
|
75
|
+
try {
|
|
76
|
+
// Validate patterns are valid regex
|
|
77
|
+
if (patterns) {
|
|
78
|
+
for (const p of patterns) {
|
|
79
|
+
try {
|
|
80
|
+
new RegExp(p);
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
return mcpText(fail(`Invalid regex pattern "${p}": ${e}`));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
// Build the rule JSON based on type
|
|
88
|
+
let ruleData = {};
|
|
89
|
+
switch (type) {
|
|
90
|
+
case 'classification':
|
|
91
|
+
if (!layer)
|
|
92
|
+
return mcpText(fail('Classification rules require "layer" (e.g., "service", "database")'));
|
|
93
|
+
if (!patterns || patterns.length === 0)
|
|
94
|
+
return mcpText(fail('Classification rules require at least one "patterns" regex'));
|
|
95
|
+
ruleData = {
|
|
96
|
+
layer,
|
|
97
|
+
source: source ?? 'path',
|
|
98
|
+
patterns,
|
|
99
|
+
weight: weight ?? 3,
|
|
100
|
+
};
|
|
101
|
+
break;
|
|
102
|
+
case 'search_alias':
|
|
103
|
+
if (!term)
|
|
104
|
+
return mcpText(fail('Search alias rules require "term" (the term to create aliases for)'));
|
|
105
|
+
if (!aliases || aliases.length === 0)
|
|
106
|
+
return mcpText(fail('Search alias rules require at least one "aliases" entry'));
|
|
107
|
+
ruleData = { term, aliases };
|
|
108
|
+
break;
|
|
109
|
+
case 'code_pattern':
|
|
110
|
+
case 'convention':
|
|
111
|
+
ruleData = {
|
|
112
|
+
...(patterns ? { patterns } : {}),
|
|
113
|
+
...(layer ? { layer } : {}),
|
|
114
|
+
...(details ?? {}),
|
|
115
|
+
};
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
const result = graph.addLearnedRule({
|
|
119
|
+
type,
|
|
120
|
+
name,
|
|
121
|
+
description,
|
|
122
|
+
rule: ruleData,
|
|
123
|
+
createdBy: 'ai',
|
|
124
|
+
});
|
|
125
|
+
const response = {
|
|
126
|
+
...result,
|
|
127
|
+
name,
|
|
128
|
+
type,
|
|
129
|
+
description,
|
|
130
|
+
rule: ruleData,
|
|
131
|
+
message: result.created
|
|
132
|
+
? `✅ New ${type} rule "${name}" has been learned and will persist across sessions.`
|
|
133
|
+
: `🔄 Updated existing ${type} rule "${name}" with new definition.`,
|
|
134
|
+
hint: type === 'classification'
|
|
135
|
+
? 'This rule will be automatically used by the classification engine to score files.'
|
|
136
|
+
: type === 'search_alias'
|
|
137
|
+
? 'When someone searches for "' + term + '", the system will also search for: ' + (aliases?.join(', ') ?? '')
|
|
138
|
+
: 'This rule is stored as project knowledge and can be recalled with mindmap_get_learned.',
|
|
139
|
+
};
|
|
140
|
+
return mcpText(ok(response, estimator));
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
144
|
+
return mcpText(fail(`teach failed: ${msg}`));
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
// ── mindmap_get_learned ──────────────────────────────────────
|
|
148
|
+
server.tool('mindmap_get_learned', 'View all rules the AI has taught this project. Shows classification rules, ' +
|
|
149
|
+
'search aliases, code patterns, and conventions — sorted by usage count. ' +
|
|
150
|
+
'Use this at the start of a session to see what the system has already learned.', {
|
|
151
|
+
type: z.enum(['classification', 'search_alias', 'code_pattern', 'convention', 'all'])
|
|
152
|
+
.default('all')
|
|
153
|
+
.describe('Filter by rule type, or "all" for everything'),
|
|
154
|
+
}, async ({ type }) => {
|
|
155
|
+
try {
|
|
156
|
+
const rules = type === 'all'
|
|
157
|
+
? graph.getLearnedRules()
|
|
158
|
+
: graph.getLearnedRules(type);
|
|
159
|
+
// Group by type for display
|
|
160
|
+
const grouped = {};
|
|
161
|
+
for (const rule of rules) {
|
|
162
|
+
if (!grouped[rule.type])
|
|
163
|
+
grouped[rule.type] = [];
|
|
164
|
+
grouped[rule.type].push(rule);
|
|
165
|
+
}
|
|
166
|
+
const result = {
|
|
167
|
+
totalRules: rules.length,
|
|
168
|
+
rulesByType: grouped,
|
|
169
|
+
rules,
|
|
170
|
+
summary: rules.length > 0
|
|
171
|
+
? `This project has ${rules.length} learned rule(s): ` +
|
|
172
|
+
Object.entries(grouped).map(([t, r]) => `${r.length} ${t}`).join(', ')
|
|
173
|
+
: 'No rules learned yet. Use mindmap_teach to add project-specific knowledge.',
|
|
174
|
+
};
|
|
175
|
+
return mcpText(ok(result, estimator));
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
179
|
+
return mcpText(fail(`get_learned failed: ${msg}`));
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
// ── mindmap_forget ───────────────────────────────────────────
|
|
183
|
+
server.tool('mindmap_forget', 'Remove a learned rule by its name or ID. Use mindmap_get_learned first ' +
|
|
184
|
+
'to see all rules and their IDs.', {
|
|
185
|
+
nameOrId: z.string()
|
|
186
|
+
.describe('Name or ID of the rule to remove'),
|
|
187
|
+
}, async ({ nameOrId }) => {
|
|
188
|
+
try {
|
|
189
|
+
const deleted = graph.deleteLearnedRule(nameOrId);
|
|
190
|
+
if (deleted) {
|
|
191
|
+
return mcpText(ok({
|
|
192
|
+
deleted: true,
|
|
193
|
+
nameOrId,
|
|
194
|
+
message: `✅ Rule "${nameOrId}" has been forgotten.`,
|
|
195
|
+
}, estimator));
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
return mcpText(fail(`Rule not found: "${nameOrId}". Use mindmap_get_learned to see all rules.`));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
catch (err) {
|
|
202
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
203
|
+
return mcpText(fail(`forget failed: ${msg}`));
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=evolving-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evolving-tools.js","sourceRoot":"","sources":["../../src/tools/evolving-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Flow & Interaction Map MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Tools that let the AI agent understand the BEHAVIORAL flow of the app:
|
|
5
|
+
* "What happens when user clicks Save?"
|
|
6
|
+
* "What's the pipeline from button to database?"
|
|
7
|
+
* "Show me all routes and what they connect to"
|
|
8
|
+
* "Which layer does this file belong to?"
|
|
9
|
+
*
|
|
10
|
+
* This is the feature that makes the AI NOT waste tokens figuring out
|
|
11
|
+
* the logic flow — we pre-map it for the agent.
|
|
12
|
+
*/
|
|
13
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
14
|
+
import type { MindMapConfig } from '../types.js';
|
|
15
|
+
import { KnowledgeGraph } from '../knowledge-graph/graph.js';
|
|
16
|
+
interface ITokenEstimator {
|
|
17
|
+
estimate(text: string): number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Register all flow/interaction map tools on the MCP server.
|
|
21
|
+
*/
|
|
22
|
+
export declare function registerFlowTools(server: McpServer, graph: KnowledgeGraph, config: MindMapConfig, estimator?: ITokenEstimator): void;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=flow-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-tools.d.ts","sourceRoot":"","sources":["../../src/tools/flow-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAc,aAAa,EAAE,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAQ7D,UAAU,eAAe;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AA0BD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,cAAc,EACrB,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,eAAkC,GAC5C,IAAI,CAyMN"}
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Flow & Interaction Map MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Tools that let the AI agent understand the BEHAVIORAL flow of the app:
|
|
5
|
+
* "What happens when user clicks Save?"
|
|
6
|
+
* "What's the pipeline from button to database?"
|
|
7
|
+
* "Show me all routes and what they connect to"
|
|
8
|
+
* "Which layer does this file belong to?"
|
|
9
|
+
*
|
|
10
|
+
* This is the feature that makes the AI NOT waste tokens figuring out
|
|
11
|
+
* the logic flow — we pre-map it for the agent.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from 'zod';
|
|
14
|
+
import { FlowAnalyzer } from '../knowledge-graph/flow-analyzer.js';
|
|
15
|
+
const defaultEstimator = {
|
|
16
|
+
estimate: (text) => Math.ceil(text.length / 4),
|
|
17
|
+
};
|
|
18
|
+
function mcpText(result) {
|
|
19
|
+
return {
|
|
20
|
+
content: [{ type: 'text', text: JSON.stringify(result) }],
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function ok(data, estimator, saved = 0) {
|
|
24
|
+
const serialised = JSON.stringify(data);
|
|
25
|
+
const tokens = estimator.estimate(serialised);
|
|
26
|
+
return { success: true, data, tokenCount: tokens, tokensSaved: saved };
|
|
27
|
+
}
|
|
28
|
+
function fail(message) {
|
|
29
|
+
return { success: false, data: null, tokenCount: 0, tokensSaved: 0, message };
|
|
30
|
+
}
|
|
31
|
+
// ============================================================
|
|
32
|
+
// Registration
|
|
33
|
+
// ============================================================
|
|
34
|
+
/**
|
|
35
|
+
* Register all flow/interaction map tools on the MCP server.
|
|
36
|
+
*/
|
|
37
|
+
export function registerFlowTools(server, graph, config, estimator = defaultEstimator) {
|
|
38
|
+
const analyzer = new FlowAnalyzer(graph, config.projectRoot);
|
|
39
|
+
// ── mindmap_trace_flow ────────────────────────────────────
|
|
40
|
+
server.tool('mindmap_trace_flow', `🔗 Trace the FULL PIPELINE from a function/button/event to its final effect.
|
|
41
|
+
Example: "What happens when createNote() is called?" → shows the complete chain:
|
|
42
|
+
createNote() → validateInput() → notesService.save() → db.insert() → emitEvent()
|
|
43
|
+
Each step shows: which layer (UI/controller/service/DB), which file, which function.
|
|
44
|
+
The AI doesn't need to read any code to understand the flow.`, {
|
|
45
|
+
symbol: z
|
|
46
|
+
.string()
|
|
47
|
+
.describe('Function/method/component name to trace (e.g. "handleSaveClick", "createNote", "POST /api/notes")'),
|
|
48
|
+
maxDepth: z
|
|
49
|
+
.number()
|
|
50
|
+
.int()
|
|
51
|
+
.min(1)
|
|
52
|
+
.max(20)
|
|
53
|
+
.default(10)
|
|
54
|
+
.describe('Max call-chain depth to follow (default 10)'),
|
|
55
|
+
}, async ({ symbol, maxDepth }) => {
|
|
56
|
+
try {
|
|
57
|
+
const flow = analyzer.traceFlow(symbol, maxDepth);
|
|
58
|
+
if (flow.steps.length === 0) {
|
|
59
|
+
return mcpText(fail(`Could not trace flow for "${symbol}" — symbol not found or has no call chain.`));
|
|
60
|
+
}
|
|
61
|
+
// Build a visual pipeline string
|
|
62
|
+
const pipeline = flow.steps
|
|
63
|
+
.map((s, i) => {
|
|
64
|
+
const indent = ' '.repeat(Math.min(i, 5));
|
|
65
|
+
const arrow = i === 0 ? '🟢' : ' →';
|
|
66
|
+
const layerIcon = getLayerIcon(s.layer);
|
|
67
|
+
return `${indent}${arrow} ${layerIcon} [${s.layer}] ${s.symbolName}() — ${s.filePath}:${s.line}`;
|
|
68
|
+
})
|
|
69
|
+
.join('\n');
|
|
70
|
+
return mcpText(ok({
|
|
71
|
+
flow: {
|
|
72
|
+
name: flow.name,
|
|
73
|
+
trigger: flow.trigger,
|
|
74
|
+
stepsCount: flow.steps.length,
|
|
75
|
+
riskLevel: flow.riskLevel,
|
|
76
|
+
sideEffects: flow.sideEffects,
|
|
77
|
+
filesInvolved: flow.filesInvolved,
|
|
78
|
+
},
|
|
79
|
+
pipeline,
|
|
80
|
+
steps: flow.steps,
|
|
81
|
+
tip: `This flow touches ${flow.filesInvolved.length} files and has ${flow.sideEffects.length} side effects. Risk level: ${flow.riskLevel}.`,
|
|
82
|
+
}, estimator));
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
86
|
+
return mcpText(fail(`trace_flow failed: ${msg}`));
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
// ── mindmap_interaction_map ───────────────────────────────
|
|
90
|
+
server.tool('mindmap_interaction_map', `🗺️ Get the FULL INTERACTION MAP of the application.
|
|
91
|
+
Shows: all routes → handlers → services → DB calls, all UI events → handlers,
|
|
92
|
+
all components with their actions, state, and data sources.
|
|
93
|
+
Also classifies every file by layer (UI, controller, service, repository, DB, etc.)
|
|
94
|
+
This is the app's behavioral blueprint — the AI reads this ONCE and understands the whole app.`, {}, async () => {
|
|
95
|
+
try {
|
|
96
|
+
const map = analyzer.buildInteractionMap();
|
|
97
|
+
// Build a compact summary
|
|
98
|
+
const summary = {
|
|
99
|
+
totalRoutes: map.routes.length,
|
|
100
|
+
totalEventHandlers: map.eventHandlers.length,
|
|
101
|
+
totalComponents: map.components.length,
|
|
102
|
+
layerBreakdown: Object.entries(map.layerSummary)
|
|
103
|
+
.filter(([, count]) => count > 0)
|
|
104
|
+
.sort(([, a], [, b]) => b - a)
|
|
105
|
+
.map(([layer, count]) => `${getLayerIcon(layer)} ${layer}: ${count} symbols`),
|
|
106
|
+
};
|
|
107
|
+
// Compact route list
|
|
108
|
+
const routeSummary = map.routes.slice(0, 15).map((r) => ({
|
|
109
|
+
name: r.name,
|
|
110
|
+
trigger: r.trigger,
|
|
111
|
+
steps: r.steps.length,
|
|
112
|
+
risk: r.riskLevel,
|
|
113
|
+
pipeline: r.steps
|
|
114
|
+
.map((s) => `${getLayerIcon(s.layer)}${s.symbolName}`)
|
|
115
|
+
.join(' → '),
|
|
116
|
+
sideEffects: r.sideEffects,
|
|
117
|
+
}));
|
|
118
|
+
// Compact component list
|
|
119
|
+
const componentSummary = map.components.slice(0, 15).map((c) => ({
|
|
120
|
+
name: c.name,
|
|
121
|
+
file: c.filePath,
|
|
122
|
+
actions: c.actions.map((a) => a.trigger).join(', ') || 'none',
|
|
123
|
+
state: c.state.join(', ') || 'none',
|
|
124
|
+
children: c.children.join(', ') || 'none',
|
|
125
|
+
dataSources: c.dataSources.join(', ') || 'none',
|
|
126
|
+
}));
|
|
127
|
+
return mcpText(ok({
|
|
128
|
+
summary,
|
|
129
|
+
routes: routeSummary,
|
|
130
|
+
eventHandlers: map.eventHandlers.slice(0, 15).map((e) => ({
|
|
131
|
+
name: e.name,
|
|
132
|
+
trigger: e.trigger,
|
|
133
|
+
pipeline: e.steps
|
|
134
|
+
.map((s) => `${getLayerIcon(s.layer)}${s.symbolName}`)
|
|
135
|
+
.join(' → '),
|
|
136
|
+
risk: e.riskLevel,
|
|
137
|
+
})),
|
|
138
|
+
components: componentSummary,
|
|
139
|
+
fileClassification: map.filesByLayer,
|
|
140
|
+
tip: 'Use mindmap_trace_flow to drill into any specific flow. Use mindmap_classify_file to understand where a file fits.',
|
|
141
|
+
}, estimator));
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
145
|
+
return mcpText(fail(`interaction_map failed: ${msg}`));
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
// ── mindmap_classify_file ─────────────────────────────────
|
|
149
|
+
server.tool('mindmap_classify_file', `📂 Classify a file by its architectural layer.
|
|
150
|
+
Returns: whether the file is a UI component, controller, service, repository,
|
|
151
|
+
database layer, middleware, validator, utility, etc.
|
|
152
|
+
Helps the AI understand WHERE a file fits in the architecture without reading it.`, {
|
|
153
|
+
filePath: z
|
|
154
|
+
.string()
|
|
155
|
+
.describe('File path to classify (relative or absolute)'),
|
|
156
|
+
}, async ({ filePath }) => {
|
|
157
|
+
try {
|
|
158
|
+
const fullPath = filePath.startsWith('/') || filePath.includes(':')
|
|
159
|
+
? filePath
|
|
160
|
+
: `${config.projectRoot}/${filePath}`;
|
|
161
|
+
const layer = analyzer.classifyFile(fullPath);
|
|
162
|
+
return mcpText(ok({
|
|
163
|
+
filePath,
|
|
164
|
+
layer,
|
|
165
|
+
icon: getLayerIcon(layer),
|
|
166
|
+
description: getLayerDescription(layer),
|
|
167
|
+
typical_contents: getLayerTypicalContents(layer),
|
|
168
|
+
}, estimator));
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
172
|
+
return mcpText(fail(`classify_file failed: ${msg}`));
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
// ── mindmap_layer_overview ────────────────────────────────
|
|
176
|
+
server.tool('mindmap_layer_overview', `📊 Show how the app is organized by architectural layers.
|
|
177
|
+
Returns: count of files and symbols per layer (UI, controller, service, DB, etc.)
|
|
178
|
+
with the key files and functions in each layer.
|
|
179
|
+
One-shot understanding of the app's structure.`, {}, async () => {
|
|
180
|
+
try {
|
|
181
|
+
const overview = analyzer.getLayerOverview();
|
|
182
|
+
if (overview.length === 0) {
|
|
183
|
+
return mcpText(fail('No indexed files found — run mindmap_reindex first.'));
|
|
184
|
+
}
|
|
185
|
+
// Build visual layer diagram
|
|
186
|
+
const diagram = overview
|
|
187
|
+
.map((l) => {
|
|
188
|
+
const icon = getLayerIcon(l.layer);
|
|
189
|
+
const bar = '█'.repeat(Math.min(Math.ceil(l.symbolCount / 5), 20));
|
|
190
|
+
return `${icon} ${l.layer.padEnd(15)} │ ${String(l.fileCount).padStart(3)} files │ ${String(l.symbolCount).padStart(4)} symbols │ ${bar}`;
|
|
191
|
+
})
|
|
192
|
+
.join('\n');
|
|
193
|
+
return mcpText(ok({
|
|
194
|
+
diagram,
|
|
195
|
+
layers: overview,
|
|
196
|
+
tip: 'Use mindmap_trace_flow to see how these layers connect. Use mindmap_interaction_map for the full behavioral blueprint.',
|
|
197
|
+
}, estimator));
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
201
|
+
return mcpText(fail(`layer_overview failed: ${msg}`));
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// ============================================================
|
|
206
|
+
// UI Helpers
|
|
207
|
+
// ============================================================
|
|
208
|
+
function getLayerIcon(layer) {
|
|
209
|
+
const icons = {
|
|
210
|
+
ui_event: '🖱️',
|
|
211
|
+
ui_component: '🧩',
|
|
212
|
+
event_handler: '⚡',
|
|
213
|
+
state_update: '🔄',
|
|
214
|
+
api_call: '🌐',
|
|
215
|
+
route: '🛣️',
|
|
216
|
+
controller: '🎮',
|
|
217
|
+
service: '⚙️',
|
|
218
|
+
repository: '📦',
|
|
219
|
+
database: '🗄️',
|
|
220
|
+
middleware: '🔗',
|
|
221
|
+
validator: '✅',
|
|
222
|
+
util: '🔧',
|
|
223
|
+
unknown: '❓',
|
|
224
|
+
};
|
|
225
|
+
return icons[layer] ?? '❓';
|
|
226
|
+
}
|
|
227
|
+
function getLayerDescription(layer) {
|
|
228
|
+
const descriptions = {
|
|
229
|
+
ui_event: 'User interaction trigger (click, submit, change)',
|
|
230
|
+
ui_component: 'UI component that renders visual elements',
|
|
231
|
+
event_handler: 'Function that handles UI events',
|
|
232
|
+
state_update: 'State management (React state, Redux, Vuex)',
|
|
233
|
+
api_call: 'HTTP/API request to external service',
|
|
234
|
+
route: 'HTTP route/endpoint definition',
|
|
235
|
+
controller: 'Request handler that orchestrates business logic',
|
|
236
|
+
service: 'Business logic and domain rules',
|
|
237
|
+
repository: 'Data access layer (ORM, query builders)',
|
|
238
|
+
database: 'Direct database operations',
|
|
239
|
+
middleware: 'Request/response pipeline middleware',
|
|
240
|
+
validator: 'Input validation and sanitization',
|
|
241
|
+
util: 'Shared utility functions and helpers',
|
|
242
|
+
unknown: 'Could not determine the architectural layer',
|
|
243
|
+
};
|
|
244
|
+
return descriptions[layer] ?? 'Unknown layer';
|
|
245
|
+
}
|
|
246
|
+
function getLayerTypicalContents(layer) {
|
|
247
|
+
const contents = {
|
|
248
|
+
ui_event: 'onClick handlers, form submissions, keyboard shortcuts',
|
|
249
|
+
ui_component: 'React components, Vue templates, Angular components',
|
|
250
|
+
event_handler: 'handleClick, handleSubmit, onChange callbacks',
|
|
251
|
+
state_update: 'useState, useReducer, Redux actions, Vuex mutations',
|
|
252
|
+
api_call: 'fetch(), axios calls, GraphQL queries',
|
|
253
|
+
route: 'app.get(), router.post(), @Get() decorators',
|
|
254
|
+
controller: 'Request parsing, response formatting, error handling',
|
|
255
|
+
service: 'Business rules, calculations, orchestration',
|
|
256
|
+
repository: 'Database queries, ORM calls, data transformation',
|
|
257
|
+
database: 'Raw SQL, MongoDB operations, Redis commands',
|
|
258
|
+
middleware: 'Auth checks, logging, rate limiting, CORS',
|
|
259
|
+
validator: 'Schema validation, input sanitization, type checking',
|
|
260
|
+
util: 'String helpers, date formatting, crypto, file I/O',
|
|
261
|
+
unknown: 'File purpose could not be determined automatically',
|
|
262
|
+
};
|
|
263
|
+
return contents[layer] ?? 'Unknown';
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=flow-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-tools.js","sourceRoot":"","sources":["../../src/tools/flow-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI Mind Map — Knowledge Graph MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* Registers all knowledge-graph-related tools on the MCP server.
|
|
5
|
+
* Each tool returns structured JSON data wrapped in the standard
|
|
6
|
+
* MCP text-content envelope.
|
|
7
|
+
*/
|
|
8
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
9
|
+
import type { GraphNode, GraphEdge, NodeType } from '../types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Minimal interface expected of the Knowledge Graph subsystem.
|
|
12
|
+
* The concrete implementation lives elsewhere; we depend on the
|
|
13
|
+
* contract only.
|
|
14
|
+
*/
|
|
15
|
+
export interface IKnowledgeGraph {
|
|
16
|
+
/** Full-text / name search across all indexed nodes. */
|
|
17
|
+
search(query: string, type?: NodeType, limit?: number): GraphNode[];
|
|
18
|
+
/** Get project file tree with top-level symbols per file. */
|
|
19
|
+
getStructure(depth: number): {
|
|
20
|
+
files: {
|
|
21
|
+
path: string;
|
|
22
|
+
symbols: Pick<GraphNode, 'name' | 'type' | 'signature'>[];
|
|
23
|
+
}[];
|
|
24
|
+
};
|
|
25
|
+
/** Trace dependency chain of a symbol (callers / callees). */
|
|
26
|
+
traceDependencies(symbolName: string, direction: 'callers' | 'callees' | 'both', depth: number): {
|
|
27
|
+
root: string;
|
|
28
|
+
direction: string;
|
|
29
|
+
depth: number;
|
|
30
|
+
nodes: GraphNode[];
|
|
31
|
+
edges: GraphEdge[];
|
|
32
|
+
};
|
|
33
|
+
/** Get the full signature (no body) for a symbol. */
|
|
34
|
+
getSignature(symbolName: string, filePath?: string): {
|
|
35
|
+
node: GraphNode;
|
|
36
|
+
parameters: GraphNode['parameters'];
|
|
37
|
+
returnType: GraphNode['returnType'];
|
|
38
|
+
docComment: GraphNode['docComment'];
|
|
39
|
+
} | null;
|
|
40
|
+
/** Find every location a symbol is referenced. */
|
|
41
|
+
findReferences(symbolName: string): {
|
|
42
|
+
symbol: string;
|
|
43
|
+
references: {
|
|
44
|
+
filePath: string;
|
|
45
|
+
line: number;
|
|
46
|
+
context: string;
|
|
47
|
+
}[];
|
|
48
|
+
};
|
|
49
|
+
/** Get structural map of all symbols in a single file. */
|
|
50
|
+
getFileMap(filePath: string): {
|
|
51
|
+
filePath: string;
|
|
52
|
+
symbols: Pick<GraphNode, 'name' | 'type' | 'signature' | 'startLine' | 'endLine' | 'visibility' | 'isExported'>[];
|
|
53
|
+
} | null;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Minimal interface for estimating token counts.
|
|
57
|
+
* Used to populate ToolResult.tokenCount / tokensSaved.
|
|
58
|
+
*/
|
|
59
|
+
export interface ITokenEstimator {
|
|
60
|
+
/** Rough token count for a string (4 chars ≈ 1 token). */
|
|
61
|
+
estimate(text: string): number;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Register all Knowledge Graph tools on the given MCP server.
|
|
65
|
+
*
|
|
66
|
+
* @param server The MCP server instance.
|
|
67
|
+
* @param graph Concrete knowledge-graph implementation.
|
|
68
|
+
* @param estimator Optional token estimator (defaults to 4-char heuristic).
|
|
69
|
+
*/
|
|
70
|
+
export declare function registerGraphTools(server: McpServer, graph: IKnowledgeGraph, estimator?: ITokenEstimator): void;
|
|
71
|
+
//# sourceMappingURL=graph-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-tools.d.ts","sourceRoot":"","sources":["../../src/tools/graph-tools.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EAET,MAAM,aAAa,CAAC;AAMrB;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;IAEpE,6DAA6D;IAC7D,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG;QAC3B,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,EAAE,CAAA;SAAE,EAAE,CAAC;KACtF,CAAC;IAEF,8DAA8D;IAC9D,iBAAiB,CACf,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,EACzC,KAAK,EAAE,MAAM,GACZ;QACD,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,SAAS,EAAE,CAAC;QACnB,KAAK,EAAE,SAAS,EAAE,CAAC;KACpB,CAAC;IAEF,qDAAqD;IACrD,YAAY,CACV,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB;QACD,IAAI,EAAE,SAAS,CAAC;QAChB,UAAU,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;QACpC,UAAU,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;QACpC,UAAU,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;KACrC,GAAG,IAAI,CAAC;IAET,kDAAkD;IAClD,cAAc,CACZ,UAAU,EAAE,MAAM,GACjB;QACD,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACnE,CAAC;IAEF,0DAA0D;IAC1D,UAAU,CACR,QAAQ,EAAE,MAAM,GACf;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,YAAY,GAAG,YAAY,CAAC,EAAE,CAAC;KACnH,GAAG,IAAI,CAAC;CACV;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAkDD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,eAAe,EACtB,SAAS,GAAE,eAAkC,GAC5C,IAAI,CAyIN"}
|