mcp-adr-analysis-server 2.0.9 → 2.0.11
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 +1 -1
- package/dist/src/index.d.ts +8 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +573 -348
- package/dist/src/index.js.map +1 -1
- package/dist/src/prompts/adr-suggestion-prompts.d.ts.map +1 -1
- package/dist/src/prompts/adr-suggestion-prompts.js +2 -0
- package/dist/src/prompts/adr-suggestion-prompts.js.map +1 -1
- package/dist/src/resources/index.d.ts.map +1 -1
- package/dist/src/resources/index.js +71 -1
- package/dist/src/resources/index.js.map +1 -1
- package/dist/src/tools/adr-suggestion-tool.d.ts +16 -0
- package/dist/src/tools/adr-suggestion-tool.d.ts.map +1 -1
- package/dist/src/tools/adr-suggestion-tool.js +55 -2
- package/dist/src/tools/adr-suggestion-tool.js.map +1 -1
- package/dist/src/tools/smart-git-push-tool.d.ts +21 -1
- package/dist/src/tools/smart-git-push-tool.d.ts.map +1 -1
- package/dist/src/tools/smart-git-push-tool.js +181 -28
- package/dist/src/tools/smart-git-push-tool.js.map +1 -1
- package/dist/src/tools/smart-score-tool.d.ts +173 -0
- package/dist/src/tools/smart-score-tool.d.ts.map +1 -0
- package/dist/src/tools/smart-score-tool.js +681 -0
- package/dist/src/tools/smart-score-tool.js.map +1 -0
- package/dist/src/tools/todo-management-tool-v2.d.ts +329 -0
- package/dist/src/tools/todo-management-tool-v2.d.ts.map +1 -0
- package/dist/src/tools/todo-management-tool-v2.js +644 -0
- package/dist/src/tools/todo-management-tool-v2.js.map +1 -0
- package/dist/src/tools/tool-chain-orchestrator.d.ts +126 -0
- package/dist/src/tools/tool-chain-orchestrator.d.ts.map +1 -0
- package/dist/src/tools/tool-chain-orchestrator.js +550 -0
- package/dist/src/tools/tool-chain-orchestrator.js.map +1 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts +150 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.d.ts.map +1 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js +520 -0
- package/dist/src/tools/troubleshoot-guided-workflow-tool.js.map +1 -0
- package/dist/src/types/conversation-context.d.ts +6 -0
- package/dist/src/types/conversation-context.d.ts.map +1 -1
- package/dist/src/types/conversation-context.js +9 -1
- package/dist/src/types/conversation-context.js.map +1 -1
- package/dist/src/types/knowledge-graph-schemas.d.ts +773 -0
- package/dist/src/types/knowledge-graph-schemas.d.ts.map +1 -0
- package/dist/src/types/knowledge-graph-schemas.js +87 -0
- package/dist/src/types/knowledge-graph-schemas.js.map +1 -0
- package/dist/src/types/todo-json-schemas.d.ts +663 -0
- package/dist/src/types/todo-json-schemas.d.ts.map +1 -0
- package/dist/src/types/todo-json-schemas.js +113 -0
- package/dist/src/types/todo-json-schemas.js.map +1 -0
- package/dist/src/utils/chain-of-thought-template.d.ts.map +1 -1
- package/dist/src/utils/chain-of-thought-template.js.map +1 -1
- package/dist/src/utils/json-safe.d.ts +38 -0
- package/dist/src/utils/json-safe.d.ts.map +1 -0
- package/dist/src/utils/json-safe.js +86 -0
- package/dist/src/utils/json-safe.js.map +1 -0
- package/dist/src/utils/knowledge-graph-manager.d.ts +65 -0
- package/dist/src/utils/knowledge-graph-manager.d.ts.map +1 -0
- package/dist/src/utils/knowledge-graph-manager.js +358 -0
- package/dist/src/utils/knowledge-graph-manager.js.map +1 -0
- package/dist/src/utils/mcp-response-validator.d.ts +30 -0
- package/dist/src/utils/mcp-response-validator.d.ts.map +1 -0
- package/dist/src/utils/mcp-response-validator.js +197 -0
- package/dist/src/utils/mcp-response-validator.js.map +1 -0
- package/dist/src/utils/project-health-scoring.d.ts +177 -0
- package/dist/src/utils/project-health-scoring.d.ts.map +1 -0
- package/dist/src/utils/project-health-scoring.js +370 -0
- package/dist/src/utils/project-health-scoring.js.map +1 -0
- package/dist/src/utils/release-readiness-detector.d.ts +2 -0
- package/dist/src/utils/release-readiness-detector.d.ts.map +1 -1
- package/dist/src/utils/release-readiness-detector.js +2 -0
- package/dist/src/utils/release-readiness-detector.js.map +1 -1
- package/dist/src/utils/todo-file-watcher.d.ts +26 -0
- package/dist/src/utils/todo-file-watcher.d.ts.map +1 -0
- package/dist/src/utils/todo-file-watcher.js +163 -0
- package/dist/src/utils/todo-file-watcher.js.map +1 -0
- package/dist/src/utils/todo-json-manager.d.ts +71 -0
- package/dist/src/utils/todo-json-manager.d.ts.map +1 -0
- package/dist/src/utils/todo-json-manager.js +394 -0
- package/dist/src/utils/todo-json-manager.js.map +1 -0
- package/dist/src/utils/todo-markdown-converter.d.ts +16 -0
- package/dist/src/utils/todo-markdown-converter.d.ts.map +1 -0
- package/dist/src/utils/todo-markdown-converter.js +362 -0
- package/dist/src/utils/todo-markdown-converter.js.map +1 -0
- package/dist/src/utils/todo-migration.d.ts +47 -0
- package/dist/src/utils/todo-migration.d.ts.map +1 -0
- package/dist/src/utils/todo-migration.js +261 -0
- package/dist/src/utils/todo-migration.js.map +1 -0
- package/package.json +1 -1
- package/dist/src/tools/todo-management-tool.d.ts +0 -166
- package/dist/src/tools/todo-management-tool.d.ts.map +0 -1
- package/dist/src/tools/todo-management-tool.js +0 -472
- package/dist/src/tools/todo-management-tool.js.map +0 -1
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import * as fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
import { TodoSyncStateSchema, KnowledgeGraphSnapshotSchema } from '../types/knowledge-graph-schemas.js';
|
|
5
|
+
import { loadConfig } from './config.js';
|
|
6
|
+
import { ProjectHealthScoring } from './project-health-scoring.js';
|
|
7
|
+
export class KnowledgeGraphManager {
|
|
8
|
+
cacheDir;
|
|
9
|
+
snapshotsFile;
|
|
10
|
+
syncStateFile;
|
|
11
|
+
healthScoring;
|
|
12
|
+
constructor() {
|
|
13
|
+
const config = loadConfig();
|
|
14
|
+
this.cacheDir = path.join(config.projectPath, '.mcp-adr-cache');
|
|
15
|
+
this.snapshotsFile = path.join(this.cacheDir, 'knowledge-graph-snapshots.json');
|
|
16
|
+
this.syncStateFile = path.join(this.cacheDir, 'todo-sync-state.json');
|
|
17
|
+
this.healthScoring = new ProjectHealthScoring(config.projectPath);
|
|
18
|
+
}
|
|
19
|
+
async ensureCacheDirectory() {
|
|
20
|
+
try {
|
|
21
|
+
await fs.access(this.cacheDir);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
await fs.mkdir(this.cacheDir, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async loadKnowledgeGraph() {
|
|
28
|
+
await this.ensureCacheDirectory();
|
|
29
|
+
try {
|
|
30
|
+
const data = await fs.readFile(this.snapshotsFile, 'utf-8');
|
|
31
|
+
const parsed = JSON.parse(data);
|
|
32
|
+
return KnowledgeGraphSnapshotSchema.parse(parsed);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
const defaultSyncState = await this.getDefaultSyncState();
|
|
36
|
+
const defaultSnapshot = {
|
|
37
|
+
version: '1.0.0',
|
|
38
|
+
timestamp: new Date().toISOString(),
|
|
39
|
+
intents: [],
|
|
40
|
+
todoSyncState: defaultSyncState,
|
|
41
|
+
analytics: {
|
|
42
|
+
totalIntents: 0,
|
|
43
|
+
completedIntents: 0,
|
|
44
|
+
activeIntents: 0,
|
|
45
|
+
averageGoalCompletion: 0,
|
|
46
|
+
mostUsedTools: [],
|
|
47
|
+
successfulPatterns: []
|
|
48
|
+
},
|
|
49
|
+
scoreHistory: []
|
|
50
|
+
};
|
|
51
|
+
await this.saveKnowledgeGraph(defaultSnapshot);
|
|
52
|
+
// Also create the separate sync state file
|
|
53
|
+
await fs.writeFile(this.syncStateFile, JSON.stringify(defaultSyncState, null, 2));
|
|
54
|
+
return defaultSnapshot;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async saveKnowledgeGraph(snapshot) {
|
|
58
|
+
await this.ensureCacheDirectory();
|
|
59
|
+
await fs.writeFile(this.snapshotsFile, JSON.stringify(snapshot, null, 2));
|
|
60
|
+
}
|
|
61
|
+
async createIntent(humanRequest, parsedGoals, priority = 'medium') {
|
|
62
|
+
const intentId = crypto.randomUUID();
|
|
63
|
+
const timestamp = new Date().toISOString();
|
|
64
|
+
// Get current score as baseline
|
|
65
|
+
const currentScore = await this.healthScoring.getProjectHealthScore();
|
|
66
|
+
const intent = {
|
|
67
|
+
intentId,
|
|
68
|
+
humanRequest,
|
|
69
|
+
parsedGoals,
|
|
70
|
+
priority,
|
|
71
|
+
timestamp,
|
|
72
|
+
toolChain: [],
|
|
73
|
+
currentStatus: 'planning',
|
|
74
|
+
todoMdSnapshot: '',
|
|
75
|
+
scoreTracking: {
|
|
76
|
+
initialScore: currentScore.overall,
|
|
77
|
+
currentScore: currentScore.overall,
|
|
78
|
+
componentScores: {
|
|
79
|
+
taskCompletion: currentScore.taskCompletion,
|
|
80
|
+
deploymentReadiness: currentScore.deploymentReadiness,
|
|
81
|
+
architectureCompliance: currentScore.architectureCompliance,
|
|
82
|
+
securityPosture: currentScore.securityPosture,
|
|
83
|
+
codeQuality: currentScore.codeQuality
|
|
84
|
+
},
|
|
85
|
+
lastScoreUpdate: timestamp
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const kg = await this.loadKnowledgeGraph();
|
|
89
|
+
kg.intents.push(intent);
|
|
90
|
+
kg.analytics.totalIntents = kg.intents.length;
|
|
91
|
+
kg.analytics.activeIntents = kg.intents.filter(i => i.currentStatus !== 'completed').length;
|
|
92
|
+
// Add score history entry
|
|
93
|
+
if (!kg.scoreHistory)
|
|
94
|
+
kg.scoreHistory = [];
|
|
95
|
+
kg.scoreHistory.push({
|
|
96
|
+
timestamp,
|
|
97
|
+
intentId,
|
|
98
|
+
overallScore: currentScore.overall,
|
|
99
|
+
componentScores: {
|
|
100
|
+
taskCompletion: currentScore.taskCompletion,
|
|
101
|
+
deploymentReadiness: currentScore.deploymentReadiness,
|
|
102
|
+
architectureCompliance: currentScore.architectureCompliance,
|
|
103
|
+
securityPosture: currentScore.securityPosture,
|
|
104
|
+
codeQuality: currentScore.codeQuality
|
|
105
|
+
},
|
|
106
|
+
triggerEvent: `Intent created: ${humanRequest.substring(0, 100)}...`,
|
|
107
|
+
confidence: currentScore.confidence
|
|
108
|
+
});
|
|
109
|
+
await this.saveKnowledgeGraph(kg);
|
|
110
|
+
return intentId;
|
|
111
|
+
}
|
|
112
|
+
async addToolExecution(intentId, toolName, parameters, result, success, todoTasksCreated = [], todoTasksModified = [], error) {
|
|
113
|
+
const kg = await this.loadKnowledgeGraph();
|
|
114
|
+
const intent = kg.intents.find(i => i.intentId === intentId);
|
|
115
|
+
if (!intent) {
|
|
116
|
+
throw new Error(`Intent ${intentId} not found`);
|
|
117
|
+
}
|
|
118
|
+
// Capture before score
|
|
119
|
+
const beforeScore = await this.healthScoring.getProjectHealthScore();
|
|
120
|
+
const execution = {
|
|
121
|
+
toolName,
|
|
122
|
+
parameters,
|
|
123
|
+
result,
|
|
124
|
+
todoTasksCreated,
|
|
125
|
+
todoTasksModified,
|
|
126
|
+
executionTime: new Date().toISOString(),
|
|
127
|
+
success,
|
|
128
|
+
error
|
|
129
|
+
};
|
|
130
|
+
intent.toolChain.push(execution);
|
|
131
|
+
intent.currentStatus = success ? 'executing' : 'failed';
|
|
132
|
+
// Update scores after tool execution and capture impact
|
|
133
|
+
await this.updateScoreTracking(intentId, toolName, beforeScore, execution);
|
|
134
|
+
this.updateAnalytics(kg);
|
|
135
|
+
await this.saveKnowledgeGraph(kg);
|
|
136
|
+
}
|
|
137
|
+
async updateIntentStatus(intentId, status) {
|
|
138
|
+
const kg = await this.loadKnowledgeGraph();
|
|
139
|
+
const intent = kg.intents.find(i => i.intentId === intentId);
|
|
140
|
+
if (!intent) {
|
|
141
|
+
throw new Error(`Intent ${intentId} not found`);
|
|
142
|
+
}
|
|
143
|
+
intent.currentStatus = status;
|
|
144
|
+
this.updateAnalytics(kg);
|
|
145
|
+
await this.saveKnowledgeGraph(kg);
|
|
146
|
+
}
|
|
147
|
+
async updateTodoSnapshot(intentId, todoContent) {
|
|
148
|
+
const kg = await this.loadKnowledgeGraph();
|
|
149
|
+
const intent = kg.intents.find(i => i.intentId === intentId);
|
|
150
|
+
if (!intent) {
|
|
151
|
+
throw new Error(`Intent ${intentId} not found`);
|
|
152
|
+
}
|
|
153
|
+
intent.todoMdSnapshot = todoContent;
|
|
154
|
+
await this.saveKnowledgeGraph(kg);
|
|
155
|
+
}
|
|
156
|
+
async getSyncState() {
|
|
157
|
+
try {
|
|
158
|
+
const data = await fs.readFile(this.syncStateFile, 'utf-8');
|
|
159
|
+
const parsed = JSON.parse(data);
|
|
160
|
+
return TodoSyncStateSchema.parse(parsed);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return this.getDefaultSyncState();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async updateSyncState(updates) {
|
|
167
|
+
const current = await this.getSyncState();
|
|
168
|
+
const updated = { ...current, ...updates };
|
|
169
|
+
await fs.writeFile(this.syncStateFile, JSON.stringify(updated, null, 2));
|
|
170
|
+
const kg = await this.loadKnowledgeGraph();
|
|
171
|
+
kg.todoSyncState = updated;
|
|
172
|
+
await this.saveKnowledgeGraph(kg);
|
|
173
|
+
}
|
|
174
|
+
async getIntentById(intentId) {
|
|
175
|
+
const kg = await this.loadKnowledgeGraph();
|
|
176
|
+
return kg.intents.find(i => i.intentId === intentId) || null;
|
|
177
|
+
}
|
|
178
|
+
async getActiveIntents() {
|
|
179
|
+
const kg = await this.loadKnowledgeGraph();
|
|
180
|
+
return kg.intents.filter(i => i.currentStatus !== 'completed' && i.currentStatus !== 'failed');
|
|
181
|
+
}
|
|
182
|
+
async getIntentsByStatus(status) {
|
|
183
|
+
const kg = await this.loadKnowledgeGraph();
|
|
184
|
+
return kg.intents.filter(i => i.currentStatus === status);
|
|
185
|
+
}
|
|
186
|
+
async getDefaultSyncState() {
|
|
187
|
+
return {
|
|
188
|
+
lastSyncTimestamp: new Date().toISOString(),
|
|
189
|
+
todoMdHash: '',
|
|
190
|
+
knowledgeGraphHash: '',
|
|
191
|
+
syncStatus: 'synced',
|
|
192
|
+
lastModifiedBy: 'tool',
|
|
193
|
+
version: 1
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
updateAnalytics(kg) {
|
|
197
|
+
const intents = kg.intents;
|
|
198
|
+
kg.analytics.totalIntents = intents.length;
|
|
199
|
+
kg.analytics.completedIntents = intents.filter(i => i.currentStatus === 'completed').length;
|
|
200
|
+
kg.analytics.activeIntents = intents.filter(i => i.currentStatus !== 'completed' && i.currentStatus !== 'failed').length;
|
|
201
|
+
if (kg.analytics.totalIntents > 0) {
|
|
202
|
+
kg.analytics.averageGoalCompletion = kg.analytics.completedIntents / kg.analytics.totalIntents;
|
|
203
|
+
}
|
|
204
|
+
const toolUsage = new Map();
|
|
205
|
+
intents.forEach(intent => {
|
|
206
|
+
intent.toolChain.forEach(execution => {
|
|
207
|
+
toolUsage.set(execution.toolName, (toolUsage.get(execution.toolName) || 0) + 1);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
kg.analytics.mostUsedTools = Array.from(toolUsage.entries())
|
|
211
|
+
.map(([toolName, usageCount]) => ({ toolName, usageCount }))
|
|
212
|
+
.sort((a, b) => b.usageCount - a.usageCount)
|
|
213
|
+
.slice(0, 10);
|
|
214
|
+
}
|
|
215
|
+
async calculateTodoMdHash(todoPath) {
|
|
216
|
+
try {
|
|
217
|
+
const content = await fs.readFile(todoPath, 'utf-8');
|
|
218
|
+
return crypto.createHash('sha256').update(content).digest('hex');
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
return '';
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
async detectTodoChanges(todoPath) {
|
|
225
|
+
const syncState = await this.getSyncState();
|
|
226
|
+
const currentHash = await this.calculateTodoMdHash(todoPath);
|
|
227
|
+
return {
|
|
228
|
+
hasChanges: currentHash !== syncState.todoMdHash,
|
|
229
|
+
currentHash,
|
|
230
|
+
lastHash: syncState.todoMdHash
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Update score tracking for an intent after tool execution
|
|
235
|
+
*/
|
|
236
|
+
async updateScoreTracking(intentId, toolName, beforeScore, execution) {
|
|
237
|
+
const kg = await this.loadKnowledgeGraph();
|
|
238
|
+
const intent = kg.intents.find(i => i.intentId === intentId);
|
|
239
|
+
if (!intent)
|
|
240
|
+
return;
|
|
241
|
+
// Get current score after tool execution
|
|
242
|
+
const afterScore = await this.healthScoring.getProjectHealthScore();
|
|
243
|
+
// Calculate score impact
|
|
244
|
+
const scoreImpact = {
|
|
245
|
+
beforeScore: beforeScore.overall,
|
|
246
|
+
afterScore: afterScore.overall,
|
|
247
|
+
componentImpacts: {
|
|
248
|
+
taskCompletion: afterScore.taskCompletion - beforeScore.taskCompletion,
|
|
249
|
+
deploymentReadiness: afterScore.deploymentReadiness - beforeScore.deploymentReadiness,
|
|
250
|
+
architectureCompliance: afterScore.architectureCompliance - beforeScore.architectureCompliance,
|
|
251
|
+
securityPosture: afterScore.securityPosture - beforeScore.securityPosture,
|
|
252
|
+
codeQuality: afterScore.codeQuality - beforeScore.codeQuality
|
|
253
|
+
},
|
|
254
|
+
scoreConfidence: afterScore.confidence
|
|
255
|
+
};
|
|
256
|
+
// Update execution with score impact
|
|
257
|
+
execution.scoreImpact = scoreImpact;
|
|
258
|
+
// Update intent score tracking
|
|
259
|
+
if (intent.scoreTracking) {
|
|
260
|
+
intent.scoreTracking.currentScore = afterScore.overall;
|
|
261
|
+
intent.scoreTracking.componentScores = {
|
|
262
|
+
taskCompletion: afterScore.taskCompletion,
|
|
263
|
+
deploymentReadiness: afterScore.deploymentReadiness,
|
|
264
|
+
architectureCompliance: afterScore.architectureCompliance,
|
|
265
|
+
securityPosture: afterScore.securityPosture,
|
|
266
|
+
codeQuality: afterScore.codeQuality
|
|
267
|
+
};
|
|
268
|
+
intent.scoreTracking.lastScoreUpdate = new Date().toISOString();
|
|
269
|
+
// Calculate progress if we have initial score
|
|
270
|
+
if (intent.scoreTracking.initialScore !== undefined) {
|
|
271
|
+
const initialScore = intent.scoreTracking.initialScore;
|
|
272
|
+
const targetScore = intent.scoreTracking.targetScore || 100;
|
|
273
|
+
const currentScore = afterScore.overall;
|
|
274
|
+
// Calculate progress as percentage of improvement toward target
|
|
275
|
+
const totalPossibleImprovement = targetScore - initialScore;
|
|
276
|
+
const actualImprovement = currentScore - initialScore;
|
|
277
|
+
intent.scoreTracking.scoreProgress = totalPossibleImprovement > 0
|
|
278
|
+
? Math.min(100, (actualImprovement / totalPossibleImprovement) * 100)
|
|
279
|
+
: 0;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Add to score history
|
|
283
|
+
if (!kg.scoreHistory)
|
|
284
|
+
kg.scoreHistory = [];
|
|
285
|
+
kg.scoreHistory.push({
|
|
286
|
+
timestamp: new Date().toISOString(),
|
|
287
|
+
intentId,
|
|
288
|
+
overallScore: afterScore.overall,
|
|
289
|
+
componentScores: {
|
|
290
|
+
taskCompletion: afterScore.taskCompletion,
|
|
291
|
+
deploymentReadiness: afterScore.deploymentReadiness,
|
|
292
|
+
architectureCompliance: afterScore.architectureCompliance,
|
|
293
|
+
securityPosture: afterScore.securityPosture,
|
|
294
|
+
codeQuality: afterScore.codeQuality
|
|
295
|
+
},
|
|
296
|
+
triggerEvent: `Tool executed: ${toolName}`,
|
|
297
|
+
confidence: afterScore.confidence
|
|
298
|
+
});
|
|
299
|
+
// Keep only last 100 score history entries
|
|
300
|
+
if (kg.scoreHistory.length > 100) {
|
|
301
|
+
kg.scoreHistory = kg.scoreHistory.slice(-100);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Get score trends for an intent
|
|
306
|
+
*/
|
|
307
|
+
async getIntentScoreTrends(intentId) {
|
|
308
|
+
const kg = await this.loadKnowledgeGraph();
|
|
309
|
+
const intent = kg.intents.find(i => i.intentId === intentId);
|
|
310
|
+
if (!intent?.scoreTracking) {
|
|
311
|
+
throw new Error(`Intent ${intentId} not found or has no score tracking`);
|
|
312
|
+
}
|
|
313
|
+
const scoreHistory = kg.scoreHistory?.filter(h => h.intentId === intentId) || [];
|
|
314
|
+
return {
|
|
315
|
+
initialScore: intent.scoreTracking.initialScore || 0,
|
|
316
|
+
currentScore: intent.scoreTracking.currentScore || 0,
|
|
317
|
+
progress: intent.scoreTracking.scoreProgress || 0,
|
|
318
|
+
componentTrends: intent.scoreTracking.componentScores || {},
|
|
319
|
+
scoreHistory: scoreHistory.map(h => ({
|
|
320
|
+
timestamp: h.timestamp,
|
|
321
|
+
score: h.overallScore,
|
|
322
|
+
triggerEvent: h.triggerEvent
|
|
323
|
+
}))
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Get overall project score trends
|
|
328
|
+
*/
|
|
329
|
+
async getProjectScoreTrends() {
|
|
330
|
+
const kg = await this.loadKnowledgeGraph();
|
|
331
|
+
const currentScore = await this.healthScoring.getProjectHealthScore();
|
|
332
|
+
const scoreHistory = kg.scoreHistory || [];
|
|
333
|
+
const intentImpacts = kg.intents
|
|
334
|
+
.filter(i => i.scoreTracking?.initialScore !== undefined && i.scoreTracking?.currentScore !== undefined)
|
|
335
|
+
.map(i => ({
|
|
336
|
+
intentId: i.intentId,
|
|
337
|
+
humanRequest: i.humanRequest,
|
|
338
|
+
scoreImprovement: (i.scoreTracking.currentScore - i.scoreTracking.initialScore)
|
|
339
|
+
}))
|
|
340
|
+
.sort((a, b) => b.scoreImprovement - a.scoreImprovement)
|
|
341
|
+
.slice(0, 5);
|
|
342
|
+
const averageImprovement = intentImpacts.length > 0
|
|
343
|
+
? intentImpacts.reduce((sum, i) => sum + i.scoreImprovement, 0) / intentImpacts.length
|
|
344
|
+
: 0;
|
|
345
|
+
return {
|
|
346
|
+
currentScore: currentScore.overall,
|
|
347
|
+
scoreHistory: scoreHistory.map(h => ({
|
|
348
|
+
timestamp: h.timestamp,
|
|
349
|
+
score: h.overallScore,
|
|
350
|
+
triggerEvent: h.triggerEvent,
|
|
351
|
+
...(h.intentId && { intentId: h.intentId })
|
|
352
|
+
})),
|
|
353
|
+
averageImprovement,
|
|
354
|
+
topImpactingIntents: intentImpacts
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=knowledge-graph-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knowledge-graph-manager.js","sourceRoot":"","sources":["../../../src/utils/knowledge-graph-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Response Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates and sanitizes MCP tool responses to prevent JSON-RPC 2.0 parse errors
|
|
5
|
+
*/
|
|
6
|
+
export interface McpToolResponse {
|
|
7
|
+
content: Array<{
|
|
8
|
+
type: 'text' | 'image' | 'resource';
|
|
9
|
+
text?: string;
|
|
10
|
+
data?: string;
|
|
11
|
+
mimeType?: string;
|
|
12
|
+
}>;
|
|
13
|
+
isError?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Validate and sanitize an MCP tool response
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateMcpResponse(response: any): McpToolResponse;
|
|
19
|
+
/**
|
|
20
|
+
* Validate that a response can be safely serialized as JSON-RPC 2.0
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateJsonRpcSerialization(response: any): {
|
|
23
|
+
valid: boolean;
|
|
24
|
+
error?: string;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Safe wrapper for MCP tool functions
|
|
28
|
+
*/
|
|
29
|
+
export declare function safeMcpToolWrapper<T extends any[], R>(toolFunction: (...args: T) => Promise<R>, toolName: string): (...args: T) => Promise<McpToolResponse>;
|
|
30
|
+
//# sourceMappingURL=mcp-response-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-response-validator.d.ts","sourceRoot":"","sources":["../../../src/utils/mcp-response-validator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;QACpC,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,GAAG,GAAG,eAAe,CAuClE;AAsHD;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,GAAG,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA0B9F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,GAAG,EAAE,EAAE,CAAC,EACnD,YAAY,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EACxC,QAAQ,EAAE,MAAM,IAEF,GAAG,MAAM,CAAC,KAAG,OAAO,CAAC,eAAe,CAAC,CAkBpD"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Response Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates and sanitizes MCP tool responses to prevent JSON-RPC 2.0 parse errors
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Validate and sanitize an MCP tool response
|
|
8
|
+
*/
|
|
9
|
+
export function validateMcpResponse(response) {
|
|
10
|
+
try {
|
|
11
|
+
// Ensure response has the correct structure
|
|
12
|
+
if (!response || typeof response !== 'object') {
|
|
13
|
+
return createErrorResponse('Invalid response structure');
|
|
14
|
+
}
|
|
15
|
+
// Ensure content array exists
|
|
16
|
+
if (!Array.isArray(response.content)) {
|
|
17
|
+
return createErrorResponse('Response must have content array');
|
|
18
|
+
}
|
|
19
|
+
// Validate and sanitize each content item
|
|
20
|
+
const sanitizedContent = response.content.map((item, index) => {
|
|
21
|
+
try {
|
|
22
|
+
return sanitizeContentItem(item, index);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
console.error(`Error sanitizing content item ${index}:`, error);
|
|
26
|
+
return {
|
|
27
|
+
type: 'text',
|
|
28
|
+
text: `[Error: Could not render content item ${index}]`
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
// Test JSON serialization
|
|
33
|
+
const testSerialization = JSON.stringify({ content: sanitizedContent });
|
|
34
|
+
// Verify it can be parsed back
|
|
35
|
+
JSON.parse(testSerialization);
|
|
36
|
+
return {
|
|
37
|
+
content: sanitizedContent,
|
|
38
|
+
isError: response.isError || false
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error('Response validation failed:', error);
|
|
43
|
+
return createErrorResponse(`Response validation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Sanitize a single content item
|
|
48
|
+
*/
|
|
49
|
+
function sanitizeContentItem(item, index) {
|
|
50
|
+
if (!item || typeof item !== 'object') {
|
|
51
|
+
throw new Error(`Content item ${index} is not an object`);
|
|
52
|
+
}
|
|
53
|
+
const type = item.type;
|
|
54
|
+
if (!type || !['text', 'image', 'resource'].includes(type)) {
|
|
55
|
+
throw new Error(`Content item ${index} has invalid type: ${type}`);
|
|
56
|
+
}
|
|
57
|
+
switch (type) {
|
|
58
|
+
case 'text':
|
|
59
|
+
return {
|
|
60
|
+
type: 'text',
|
|
61
|
+
text: sanitizeTextContent(item.text || '')
|
|
62
|
+
};
|
|
63
|
+
case 'image':
|
|
64
|
+
return {
|
|
65
|
+
type: 'image',
|
|
66
|
+
data: sanitizeBase64Content(item.data || ''),
|
|
67
|
+
mimeType: sanitizeMimeType(item.mimeType || 'image/png')
|
|
68
|
+
};
|
|
69
|
+
case 'resource':
|
|
70
|
+
return {
|
|
71
|
+
type: 'resource',
|
|
72
|
+
data: sanitizeTextContent(item.data || ''),
|
|
73
|
+
mimeType: sanitizeMimeType(item.mimeType || 'text/plain')
|
|
74
|
+
};
|
|
75
|
+
default:
|
|
76
|
+
throw new Error(`Unsupported content type: ${type}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Sanitize text content for JSON-RPC safety
|
|
81
|
+
*/
|
|
82
|
+
function sanitizeTextContent(text) {
|
|
83
|
+
if (typeof text !== 'string') {
|
|
84
|
+
text = String(text);
|
|
85
|
+
}
|
|
86
|
+
// Remove or escape problematic characters
|
|
87
|
+
return text
|
|
88
|
+
// Escape backslashes first
|
|
89
|
+
.replace(/\\/g, '\\\\')
|
|
90
|
+
// Escape double quotes
|
|
91
|
+
.replace(/"/g, '\\"')
|
|
92
|
+
// Handle control characters
|
|
93
|
+
.replace(/\n/g, '\\n')
|
|
94
|
+
.replace(/\r/g, '\\r')
|
|
95
|
+
.replace(/\t/g, '\\t')
|
|
96
|
+
// Remove or escape other control characters
|
|
97
|
+
.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F-\u009F]/g, (char) => {
|
|
98
|
+
const code = char.charCodeAt(0);
|
|
99
|
+
switch (code) {
|
|
100
|
+
case 0x08: return '\\b';
|
|
101
|
+
case 0x0C: return '\\f';
|
|
102
|
+
default:
|
|
103
|
+
// Replace with safe placeholder for other control chars
|
|
104
|
+
return `[CTRL:${code.toString(16).padStart(2, '0')}]`;
|
|
105
|
+
}
|
|
106
|
+
})
|
|
107
|
+
// Limit length to prevent oversized responses
|
|
108
|
+
.slice(0, 1000000); // 1MB limit
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Sanitize base64 content
|
|
112
|
+
*/
|
|
113
|
+
function sanitizeBase64Content(data) {
|
|
114
|
+
if (typeof data !== 'string') {
|
|
115
|
+
return '';
|
|
116
|
+
}
|
|
117
|
+
// Validate base64 format and remove invalid characters
|
|
118
|
+
return data.replace(/[^A-Za-z0-9+/=]/g, '').slice(0, 10000000); // 10MB limit
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Sanitize MIME type
|
|
122
|
+
*/
|
|
123
|
+
function sanitizeMimeType(mimeType) {
|
|
124
|
+
if (typeof mimeType !== 'string') {
|
|
125
|
+
return 'text/plain';
|
|
126
|
+
}
|
|
127
|
+
// Only allow safe MIME types
|
|
128
|
+
const allowedMimeTypes = [
|
|
129
|
+
'text/plain', 'text/html', 'text/markdown', 'text/css', 'text/javascript',
|
|
130
|
+
'application/json', 'application/xml', 'application/yaml',
|
|
131
|
+
'image/png', 'image/jpeg', 'image/gif', 'image/svg+xml', 'image/webp'
|
|
132
|
+
];
|
|
133
|
+
const sanitized = mimeType.toLowerCase().trim();
|
|
134
|
+
return allowedMimeTypes.includes(sanitized) ? sanitized : 'text/plain';
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create a safe error response
|
|
138
|
+
*/
|
|
139
|
+
function createErrorResponse(message) {
|
|
140
|
+
return {
|
|
141
|
+
content: [{
|
|
142
|
+
type: 'text',
|
|
143
|
+
text: sanitizeTextContent(`Error: ${message}`)
|
|
144
|
+
}],
|
|
145
|
+
isError: true
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Validate that a response can be safely serialized as JSON-RPC 2.0
|
|
150
|
+
*/
|
|
151
|
+
export function validateJsonRpcSerialization(response) {
|
|
152
|
+
try {
|
|
153
|
+
// Test full JSON-RPC 2.0 structure
|
|
154
|
+
const jsonRpcResponse = {
|
|
155
|
+
jsonrpc: '2.0',
|
|
156
|
+
id: 1,
|
|
157
|
+
result: response
|
|
158
|
+
};
|
|
159
|
+
const serialized = JSON.stringify(jsonRpcResponse);
|
|
160
|
+
// Verify it can be parsed back
|
|
161
|
+
const parsed = JSON.parse(serialized);
|
|
162
|
+
// Verify structure is preserved
|
|
163
|
+
if (!parsed.result || !Array.isArray(parsed.result.content)) {
|
|
164
|
+
return { valid: false, error: 'Structure not preserved after serialization' };
|
|
165
|
+
}
|
|
166
|
+
return { valid: true };
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
return {
|
|
170
|
+
valid: false,
|
|
171
|
+
error: `JSON-RPC serialization failed: ${error instanceof Error ? error.message : String(error)}`
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Safe wrapper for MCP tool functions
|
|
177
|
+
*/
|
|
178
|
+
export function safeMcpToolWrapper(toolFunction, toolName) {
|
|
179
|
+
return async (...args) => {
|
|
180
|
+
try {
|
|
181
|
+
const result = await toolFunction(...args);
|
|
182
|
+
const validated = validateMcpResponse(result);
|
|
183
|
+
// Double-check JSON-RPC compatibility
|
|
184
|
+
const jsonRpcCheck = validateJsonRpcSerialization(validated);
|
|
185
|
+
if (!jsonRpcCheck.valid) {
|
|
186
|
+
console.error(`JSON-RPC validation failed for ${toolName}:`, jsonRpcCheck.error);
|
|
187
|
+
return createErrorResponse(`Tool response not JSON-RPC compatible: ${jsonRpcCheck.error}`);
|
|
188
|
+
}
|
|
189
|
+
return validated;
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
console.error(`Error in ${toolName}:`, error);
|
|
193
|
+
return createErrorResponse(`Tool execution failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
194
|
+
}
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=mcp-response-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-response-validator.js","sourceRoot":"","sources":["../../../src/utils/mcp-response-validator.ts"],"names":[],"mappings":"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"}
|