xdebug-mcp 1.0.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 +341 -0
- package/dist/config.d.ts +36 -0
- package/dist/config.js +47 -0
- package/dist/config.js.map +1 -0
- package/dist/dbgp/connection.d.ts +52 -0
- package/dist/dbgp/connection.js +362 -0
- package/dist/dbgp/connection.js.map +1 -0
- package/dist/dbgp/index.d.ts +3 -0
- package/dist/dbgp/index.js +4 -0
- package/dist/dbgp/index.js.map +1 -0
- package/dist/dbgp/server.d.ts +34 -0
- package/dist/dbgp/server.js +94 -0
- package/dist/dbgp/server.js.map +1 -0
- package/dist/dbgp/types.d.ts +112 -0
- package/dist/dbgp/types.js +28 -0
- package/dist/dbgp/types.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/session/code-coverage.d.ts +94 -0
- package/dist/session/code-coverage.js +226 -0
- package/dist/session/code-coverage.js.map +1 -0
- package/dist/session/debug-config.d.ts +102 -0
- package/dist/session/debug-config.js +194 -0
- package/dist/session/debug-config.js.map +1 -0
- package/dist/session/index.d.ts +10 -0
- package/dist/session/index.js +11 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/logpoint-manager.d.ts +94 -0
- package/dist/session/logpoint-manager.js +167 -0
- package/dist/session/logpoint-manager.js.map +1 -0
- package/dist/session/manager.d.ts +41 -0
- package/dist/session/manager.js +135 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/profiler.d.ts +89 -0
- package/dist/session/profiler.js +191 -0
- package/dist/session/profiler.js.map +1 -0
- package/dist/session/request-context.d.ts +50 -0
- package/dist/session/request-context.js +182 -0
- package/dist/session/request-context.js.map +1 -0
- package/dist/session/session-export.d.ts +83 -0
- package/dist/session/session-export.js +320 -0
- package/dist/session/session-export.js.map +1 -0
- package/dist/session/session.d.ts +92 -0
- package/dist/session/session.js +369 -0
- package/dist/session/session.js.map +1 -0
- package/dist/session/step-filter.d.ts +81 -0
- package/dist/session/step-filter.js +174 -0
- package/dist/session/step-filter.js.map +1 -0
- package/dist/session/watch-manager.d.ts +64 -0
- package/dist/session/watch-manager.js +137 -0
- package/dist/session/watch-manager.js.map +1 -0
- package/dist/tools/advanced.d.ts +26 -0
- package/dist/tools/advanced.js +502 -0
- package/dist/tools/advanced.js.map +1 -0
- package/dist/tools/breakpoints.d.ts +6 -0
- package/dist/tools/breakpoints.js +308 -0
- package/dist/tools/breakpoints.js.map +1 -0
- package/dist/tools/execution.d.ts +6 -0
- package/dist/tools/execution.js +283 -0
- package/dist/tools/execution.js.map +1 -0
- package/dist/tools/index.d.ts +31 -0
- package/dist/tools/index.js +44 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inspection.d.ts +7 -0
- package/dist/tools/inspection.js +431 -0
- package/dist/tools/inspection.js.map +1 -0
- package/dist/tools/session.d.ts +6 -0
- package/dist/tools/session.js +164 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/utils/logger.d.ts +16 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/path-mapper.d.ts +13 -0
- package/dist/utils/path-mapper.js +56 -0
- package/dist/utils/path-mapper.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Watch Manager
|
|
3
|
+
* Manages persistent watch expressions that auto-evaluate on each break.
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
import { Property } from '../dbgp/types.js';
|
|
7
|
+
import { DebugSession } from './session.js';
|
|
8
|
+
export interface WatchExpression {
|
|
9
|
+
id: string;
|
|
10
|
+
expression: string;
|
|
11
|
+
lastValue?: Property | null;
|
|
12
|
+
previousValue?: Property | null;
|
|
13
|
+
hasChanged: boolean;
|
|
14
|
+
errorMessage?: string;
|
|
15
|
+
evaluationCount: number;
|
|
16
|
+
createdAt: Date;
|
|
17
|
+
lastEvaluatedAt?: Date;
|
|
18
|
+
}
|
|
19
|
+
export interface WatchEvaluationResult {
|
|
20
|
+
id: string;
|
|
21
|
+
expression: string;
|
|
22
|
+
value: Property | null;
|
|
23
|
+
previousValue: Property | null;
|
|
24
|
+
hasChanged: boolean;
|
|
25
|
+
error?: string;
|
|
26
|
+
}
|
|
27
|
+
export declare class WatchManager extends EventEmitter {
|
|
28
|
+
private watches;
|
|
29
|
+
private watchIdCounter;
|
|
30
|
+
constructor();
|
|
31
|
+
addWatch(expression: string): WatchExpression;
|
|
32
|
+
removeWatch(id: string): boolean;
|
|
33
|
+
getWatch(id: string): WatchExpression | undefined;
|
|
34
|
+
getAllWatches(): WatchExpression[];
|
|
35
|
+
clearAllWatches(): void;
|
|
36
|
+
/**
|
|
37
|
+
* Evaluate all watch expressions in the current session context
|
|
38
|
+
*/
|
|
39
|
+
evaluateAll(session: DebugSession, stackDepth?: number): Promise<WatchEvaluationResult[]>;
|
|
40
|
+
/**
|
|
41
|
+
* Evaluate a single watch expression
|
|
42
|
+
*/
|
|
43
|
+
evaluateWatch(session: DebugSession, watch: WatchExpression, stackDepth?: number): Promise<WatchEvaluationResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Compare two property values to detect changes
|
|
46
|
+
*/
|
|
47
|
+
private hasValueChanged;
|
|
48
|
+
/**
|
|
49
|
+
* Get watches that have changed since last evaluation
|
|
50
|
+
*/
|
|
51
|
+
getChangedWatches(): WatchExpression[];
|
|
52
|
+
/**
|
|
53
|
+
* Export watch configuration for saving
|
|
54
|
+
*/
|
|
55
|
+
exportConfig(): {
|
|
56
|
+
expressions: string[];
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Import watch configuration
|
|
60
|
+
*/
|
|
61
|
+
importConfig(config: {
|
|
62
|
+
expressions: string[];
|
|
63
|
+
}): void;
|
|
64
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Watch Manager
|
|
3
|
+
* Manages persistent watch expressions that auto-evaluate on each break.
|
|
4
|
+
*/
|
|
5
|
+
import { EventEmitter } from 'events';
|
|
6
|
+
import { logger } from '../utils/logger.js';
|
|
7
|
+
export class WatchManager extends EventEmitter {
|
|
8
|
+
watches = new Map();
|
|
9
|
+
watchIdCounter = 0;
|
|
10
|
+
constructor() {
|
|
11
|
+
super();
|
|
12
|
+
}
|
|
13
|
+
addWatch(expression) {
|
|
14
|
+
const id = `watch_${++this.watchIdCounter}`;
|
|
15
|
+
const watch = {
|
|
16
|
+
id,
|
|
17
|
+
expression,
|
|
18
|
+
hasChanged: false,
|
|
19
|
+
evaluationCount: 0,
|
|
20
|
+
createdAt: new Date(),
|
|
21
|
+
};
|
|
22
|
+
this.watches.set(id, watch);
|
|
23
|
+
logger.debug(`Watch added: ${id} = ${expression}`);
|
|
24
|
+
return watch;
|
|
25
|
+
}
|
|
26
|
+
removeWatch(id) {
|
|
27
|
+
const removed = this.watches.delete(id);
|
|
28
|
+
if (removed) {
|
|
29
|
+
logger.debug(`Watch removed: ${id}`);
|
|
30
|
+
}
|
|
31
|
+
return removed;
|
|
32
|
+
}
|
|
33
|
+
getWatch(id) {
|
|
34
|
+
return this.watches.get(id);
|
|
35
|
+
}
|
|
36
|
+
getAllWatches() {
|
|
37
|
+
return Array.from(this.watches.values());
|
|
38
|
+
}
|
|
39
|
+
clearAllWatches() {
|
|
40
|
+
this.watches.clear();
|
|
41
|
+
logger.debug('All watches cleared');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Evaluate all watch expressions in the current session context
|
|
45
|
+
*/
|
|
46
|
+
async evaluateAll(session, stackDepth = 0) {
|
|
47
|
+
const results = [];
|
|
48
|
+
for (const watch of this.watches.values()) {
|
|
49
|
+
const result = await this.evaluateWatch(session, watch, stackDepth);
|
|
50
|
+
results.push(result);
|
|
51
|
+
}
|
|
52
|
+
return results;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Evaluate a single watch expression
|
|
56
|
+
*/
|
|
57
|
+
async evaluateWatch(session, watch, stackDepth = 0) {
|
|
58
|
+
try {
|
|
59
|
+
const value = await session.evaluate(watch.expression, stackDepth);
|
|
60
|
+
// Track previous value for change detection
|
|
61
|
+
watch.previousValue = watch.lastValue;
|
|
62
|
+
watch.lastValue = value;
|
|
63
|
+
watch.lastEvaluatedAt = new Date();
|
|
64
|
+
watch.evaluationCount++;
|
|
65
|
+
watch.errorMessage = undefined;
|
|
66
|
+
// Detect changes
|
|
67
|
+
watch.hasChanged = this.hasValueChanged(watch.previousValue, watch.lastValue);
|
|
68
|
+
if (watch.hasChanged) {
|
|
69
|
+
this.emit('watchChanged', watch);
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
id: watch.id,
|
|
73
|
+
expression: watch.expression,
|
|
74
|
+
value,
|
|
75
|
+
previousValue: watch.previousValue || null,
|
|
76
|
+
hasChanged: watch.hasChanged,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
81
|
+
watch.errorMessage = errorMessage;
|
|
82
|
+
watch.lastEvaluatedAt = new Date();
|
|
83
|
+
watch.evaluationCount++;
|
|
84
|
+
return {
|
|
85
|
+
id: watch.id,
|
|
86
|
+
expression: watch.expression,
|
|
87
|
+
value: null,
|
|
88
|
+
previousValue: watch.previousValue || null,
|
|
89
|
+
hasChanged: false,
|
|
90
|
+
error: errorMessage,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Compare two property values to detect changes
|
|
96
|
+
*/
|
|
97
|
+
hasValueChanged(prev, curr) {
|
|
98
|
+
if (!prev && !curr)
|
|
99
|
+
return false;
|
|
100
|
+
if (!prev || !curr)
|
|
101
|
+
return true;
|
|
102
|
+
// Compare type
|
|
103
|
+
if (prev.type !== curr.type)
|
|
104
|
+
return true;
|
|
105
|
+
// Compare value
|
|
106
|
+
if (prev.value !== curr.value)
|
|
107
|
+
return true;
|
|
108
|
+
// For complex types, compare number of children
|
|
109
|
+
if (prev.numchildren !== curr.numchildren)
|
|
110
|
+
return true;
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get watches that have changed since last evaluation
|
|
115
|
+
*/
|
|
116
|
+
getChangedWatches() {
|
|
117
|
+
return Array.from(this.watches.values()).filter((w) => w.hasChanged);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Export watch configuration for saving
|
|
121
|
+
*/
|
|
122
|
+
exportConfig() {
|
|
123
|
+
return {
|
|
124
|
+
expressions: Array.from(this.watches.values()).map((w) => w.expression),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Import watch configuration
|
|
129
|
+
*/
|
|
130
|
+
importConfig(config) {
|
|
131
|
+
this.clearAllWatches();
|
|
132
|
+
for (const expr of config.expressions) {
|
|
133
|
+
this.addWatch(expr);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=watch-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-manager.js","sourceRoot":"","sources":["../../src/session/watch-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advanced Debugging MCP Tools
|
|
3
|
+
* Watch expressions, logpoints, profiling, coverage, and more.
|
|
4
|
+
*/
|
|
5
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
6
|
+
import { SessionManager } from '../session/manager.js';
|
|
7
|
+
import { WatchManager } from '../session/watch-manager.js';
|
|
8
|
+
import { LogpointManager } from '../session/logpoint-manager.js';
|
|
9
|
+
import { Profiler } from '../session/profiler.js';
|
|
10
|
+
import { RequestContextCapture } from '../session/request-context.js';
|
|
11
|
+
import { StepFilter } from '../session/step-filter.js';
|
|
12
|
+
import { DebugConfigManager } from '../session/debug-config.js';
|
|
13
|
+
import { CodeCoverageTracker } from '../session/code-coverage.js';
|
|
14
|
+
import { SessionExporter } from '../session/session-export.js';
|
|
15
|
+
export interface AdvancedToolsContext {
|
|
16
|
+
sessionManager: SessionManager;
|
|
17
|
+
watchManager: WatchManager;
|
|
18
|
+
logpointManager: LogpointManager;
|
|
19
|
+
profiler: Profiler;
|
|
20
|
+
requestCapture: RequestContextCapture;
|
|
21
|
+
stepFilter: StepFilter;
|
|
22
|
+
configManager: DebugConfigManager;
|
|
23
|
+
coverageTracker: CodeCoverageTracker;
|
|
24
|
+
sessionExporter: SessionExporter;
|
|
25
|
+
}
|
|
26
|
+
export declare function registerAdvancedTools(server: McpServer, ctx: AdvancedToolsContext): void;
|