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.
Files changed (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +341 -0
  3. package/dist/config.d.ts +36 -0
  4. package/dist/config.js +47 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/dbgp/connection.d.ts +52 -0
  7. package/dist/dbgp/connection.js +362 -0
  8. package/dist/dbgp/connection.js.map +1 -0
  9. package/dist/dbgp/index.d.ts +3 -0
  10. package/dist/dbgp/index.js +4 -0
  11. package/dist/dbgp/index.js.map +1 -0
  12. package/dist/dbgp/server.d.ts +34 -0
  13. package/dist/dbgp/server.js +94 -0
  14. package/dist/dbgp/server.js.map +1 -0
  15. package/dist/dbgp/types.d.ts +112 -0
  16. package/dist/dbgp/types.js +28 -0
  17. package/dist/dbgp/types.js.map +1 -0
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.js +93 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/session/code-coverage.d.ts +94 -0
  22. package/dist/session/code-coverage.js +226 -0
  23. package/dist/session/code-coverage.js.map +1 -0
  24. package/dist/session/debug-config.d.ts +102 -0
  25. package/dist/session/debug-config.js +194 -0
  26. package/dist/session/debug-config.js.map +1 -0
  27. package/dist/session/index.d.ts +10 -0
  28. package/dist/session/index.js +11 -0
  29. package/dist/session/index.js.map +1 -0
  30. package/dist/session/logpoint-manager.d.ts +94 -0
  31. package/dist/session/logpoint-manager.js +167 -0
  32. package/dist/session/logpoint-manager.js.map +1 -0
  33. package/dist/session/manager.d.ts +41 -0
  34. package/dist/session/manager.js +135 -0
  35. package/dist/session/manager.js.map +1 -0
  36. package/dist/session/profiler.d.ts +89 -0
  37. package/dist/session/profiler.js +191 -0
  38. package/dist/session/profiler.js.map +1 -0
  39. package/dist/session/request-context.d.ts +50 -0
  40. package/dist/session/request-context.js +182 -0
  41. package/dist/session/request-context.js.map +1 -0
  42. package/dist/session/session-export.d.ts +83 -0
  43. package/dist/session/session-export.js +320 -0
  44. package/dist/session/session-export.js.map +1 -0
  45. package/dist/session/session.d.ts +92 -0
  46. package/dist/session/session.js +369 -0
  47. package/dist/session/session.js.map +1 -0
  48. package/dist/session/step-filter.d.ts +81 -0
  49. package/dist/session/step-filter.js +174 -0
  50. package/dist/session/step-filter.js.map +1 -0
  51. package/dist/session/watch-manager.d.ts +64 -0
  52. package/dist/session/watch-manager.js +137 -0
  53. package/dist/session/watch-manager.js.map +1 -0
  54. package/dist/tools/advanced.d.ts +26 -0
  55. package/dist/tools/advanced.js +502 -0
  56. package/dist/tools/advanced.js.map +1 -0
  57. package/dist/tools/breakpoints.d.ts +6 -0
  58. package/dist/tools/breakpoints.js +308 -0
  59. package/dist/tools/breakpoints.js.map +1 -0
  60. package/dist/tools/execution.d.ts +6 -0
  61. package/dist/tools/execution.js +283 -0
  62. package/dist/tools/execution.js.map +1 -0
  63. package/dist/tools/index.d.ts +31 -0
  64. package/dist/tools/index.js +44 -0
  65. package/dist/tools/index.js.map +1 -0
  66. package/dist/tools/inspection.d.ts +7 -0
  67. package/dist/tools/inspection.js +431 -0
  68. package/dist/tools/inspection.js.map +1 -0
  69. package/dist/tools/session.d.ts +6 -0
  70. package/dist/tools/session.js +164 -0
  71. package/dist/tools/session.js.map +1 -0
  72. package/dist/utils/logger.d.ts +16 -0
  73. package/dist/utils/logger.js +47 -0
  74. package/dist/utils/logger.js.map +1 -0
  75. package/dist/utils/path-mapper.d.ts +13 -0
  76. package/dist/utils/path-mapper.js +56 -0
  77. package/dist/utils/path-mapper.js.map +1 -0
  78. package/package.json +56 -0
@@ -0,0 +1,320 @@
1
+ /**
2
+ * Session Export
3
+ * Export debug sessions as JSON/HTML reports for sharing.
4
+ */
5
+ export class SessionExporter {
6
+ snapshots = [];
7
+ filesVisited = new Set();
8
+ breakpointsHit = 0;
9
+ totalSteps = 0;
10
+ /**
11
+ * Capture a snapshot of the current debug state
12
+ */
13
+ async captureSnapshot(session, additionalData) {
14
+ const state = session.getState();
15
+ let stackTrace = [];
16
+ let variables = {};
17
+ let breakpoints = [];
18
+ try {
19
+ stackTrace = await session.getStackTrace();
20
+ }
21
+ catch {
22
+ // May fail if session is not in break state
23
+ }
24
+ try {
25
+ const vars = await session.getVariables(0, 0);
26
+ for (const v of vars) {
27
+ variables[v.name] = v;
28
+ }
29
+ }
30
+ catch {
31
+ // May fail
32
+ }
33
+ try {
34
+ breakpoints = await session.listBreakpoints();
35
+ }
36
+ catch {
37
+ // May fail
38
+ }
39
+ if (state.filename) {
40
+ this.filesVisited.add(state.filename);
41
+ }
42
+ this.totalSteps++;
43
+ const snapshot = {
44
+ timestamp: new Date(),
45
+ sessionId: session.id,
46
+ state,
47
+ stackTrace,
48
+ variables,
49
+ watchValues: additionalData?.watchValues || [],
50
+ breakpoints,
51
+ requestContext: additionalData?.requestContext,
52
+ logEntries: additionalData?.logEntries,
53
+ };
54
+ this.snapshots.push(snapshot);
55
+ return snapshot;
56
+ }
57
+ /**
58
+ * Record a breakpoint hit
59
+ */
60
+ recordBreakpointHit() {
61
+ this.breakpointsHit++;
62
+ }
63
+ /**
64
+ * Export session as JSON
65
+ */
66
+ exportAsJson(session) {
67
+ const exported = this.buildExportedSession(session);
68
+ return JSON.stringify(exported, null, 2);
69
+ }
70
+ /**
71
+ * Export session as HTML report
72
+ */
73
+ exportAsHtml(session) {
74
+ const exported = this.buildExportedSession(session);
75
+ return this.generateHtmlReport(exported);
76
+ }
77
+ /**
78
+ * Build the exported session object
79
+ */
80
+ buildExportedSession(session) {
81
+ const initPacket = session.initPacket;
82
+ return {
83
+ exportedAt: new Date(),
84
+ sessionInfo: {
85
+ id: session.id,
86
+ startTime: session.startTime,
87
+ initialFile: initPacket?.fileUri || '',
88
+ ideKey: initPacket?.ideKey || '',
89
+ },
90
+ snapshots: this.snapshots,
91
+ summary: {
92
+ totalSnapshots: this.snapshots.length,
93
+ filesVisited: Array.from(this.filesVisited),
94
+ breakpointsHit: this.breakpointsHit,
95
+ totalSteps: this.totalSteps,
96
+ },
97
+ };
98
+ }
99
+ /**
100
+ * Generate HTML report
101
+ */
102
+ generateHtmlReport(exported) {
103
+ const escapeHtml = (str) => {
104
+ return str
105
+ .replace(/&/g, '&')
106
+ .replace(/</g, '&lt;')
107
+ .replace(/>/g, '&gt;')
108
+ .replace(/"/g, '&quot;');
109
+ };
110
+ return `<!DOCTYPE html>
111
+ <html>
112
+ <head>
113
+ <meta charset="UTF-8">
114
+ <title>Debug Session Report - ${exported.sessionInfo.id}</title>
115
+ <style>
116
+ body {
117
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
118
+ max-width: 1200px;
119
+ margin: 0 auto;
120
+ padding: 20px;
121
+ background: #f5f5f5;
122
+ }
123
+ h1, h2, h3 { color: #333; }
124
+ .card {
125
+ background: white;
126
+ border-radius: 8px;
127
+ padding: 20px;
128
+ margin: 20px 0;
129
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
130
+ }
131
+ .summary-grid {
132
+ display: grid;
133
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
134
+ gap: 15px;
135
+ }
136
+ .summary-item {
137
+ background: #f8f9fa;
138
+ padding: 15px;
139
+ border-radius: 4px;
140
+ text-align: center;
141
+ }
142
+ .summary-value {
143
+ font-size: 24px;
144
+ font-weight: bold;
145
+ color: #007bff;
146
+ }
147
+ .summary-label {
148
+ color: #666;
149
+ font-size: 14px;
150
+ }
151
+ .snapshot {
152
+ border-left: 4px solid #007bff;
153
+ padding-left: 15px;
154
+ margin: 15px 0;
155
+ }
156
+ .snapshot-header {
157
+ display: flex;
158
+ justify-content: space-between;
159
+ align-items: center;
160
+ margin-bottom: 10px;
161
+ }
162
+ .status {
163
+ padding: 4px 8px;
164
+ border-radius: 4px;
165
+ font-size: 12px;
166
+ font-weight: bold;
167
+ }
168
+ .status-break { background: #ffc107; color: #333; }
169
+ .status-running { background: #28a745; color: white; }
170
+ .status-stopped { background: #dc3545; color: white; }
171
+ pre {
172
+ background: #1e1e1e;
173
+ color: #d4d4d4;
174
+ padding: 15px;
175
+ border-radius: 4px;
176
+ overflow-x: auto;
177
+ font-size: 13px;
178
+ }
179
+ .stack-frame {
180
+ padding: 8px;
181
+ margin: 4px 0;
182
+ background: #f8f9fa;
183
+ border-radius: 4px;
184
+ }
185
+ .stack-frame-current {
186
+ background: #e7f1ff;
187
+ border-left: 3px solid #007bff;
188
+ }
189
+ .variable {
190
+ display: flex;
191
+ justify-content: space-between;
192
+ padding: 8px;
193
+ border-bottom: 1px solid #eee;
194
+ }
195
+ .variable-name { font-weight: bold; color: #007bff; }
196
+ .variable-type { color: #666; font-size: 12px; }
197
+ .timestamp { color: #888; font-size: 12px; }
198
+ table {
199
+ width: 100%;
200
+ border-collapse: collapse;
201
+ }
202
+ th, td {
203
+ padding: 10px;
204
+ text-align: left;
205
+ border-bottom: 1px solid #ddd;
206
+ }
207
+ th { background: #f8f9fa; }
208
+ </style>
209
+ </head>
210
+ <body>
211
+ <h1>Debug Session Report</h1>
212
+
213
+ <div class="card">
214
+ <h2>Session Information</h2>
215
+ <table>
216
+ <tr><th>Session ID</th><td>${escapeHtml(exported.sessionInfo.id)}</td></tr>
217
+ <tr><th>Initial File</th><td>${escapeHtml(exported.sessionInfo.initialFile)}</td></tr>
218
+ <tr><th>IDE Key</th><td>${escapeHtml(exported.sessionInfo.ideKey)}</td></tr>
219
+ <tr><th>Start Time</th><td>${exported.sessionInfo.startTime.toISOString()}</td></tr>
220
+ <tr><th>Export Time</th><td>${exported.exportedAt.toISOString()}</td></tr>
221
+ </table>
222
+ </div>
223
+
224
+ <div class="card">
225
+ <h2>Summary</h2>
226
+ <div class="summary-grid">
227
+ <div class="summary-item">
228
+ <div class="summary-value">${exported.summary.totalSnapshots}</div>
229
+ <div class="summary-label">Snapshots</div>
230
+ </div>
231
+ <div class="summary-item">
232
+ <div class="summary-value">${exported.summary.totalSteps}</div>
233
+ <div class="summary-label">Steps Taken</div>
234
+ </div>
235
+ <div class="summary-item">
236
+ <div class="summary-value">${exported.summary.breakpointsHit}</div>
237
+ <div class="summary-label">Breakpoints Hit</div>
238
+ </div>
239
+ <div class="summary-item">
240
+ <div class="summary-value">${exported.summary.filesVisited.length}</div>
241
+ <div class="summary-label">Files Visited</div>
242
+ </div>
243
+ </div>
244
+ </div>
245
+
246
+ <div class="card">
247
+ <h2>Files Visited</h2>
248
+ <ul>
249
+ ${exported.summary.filesVisited.map((f) => `<li>${escapeHtml(f)}</li>`).join('\n')}
250
+ </ul>
251
+ </div>
252
+
253
+ <div class="card">
254
+ <h2>Debug Timeline</h2>
255
+ ${exported.snapshots
256
+ .map((snap, i) => `
257
+ <div class="snapshot">
258
+ <div class="snapshot-header">
259
+ <strong>Snapshot #${i + 1}</strong>
260
+ <span class="status status-${snap.state.status}">${snap.state.status}</span>
261
+ <span class="timestamp">${snap.timestamp.toISOString()}</span>
262
+ </div>
263
+ <p><strong>Location:</strong> ${escapeHtml(snap.state.filename || 'N/A')}:${snap.state.lineno || 'N/A'}</p>
264
+
265
+ ${snap.stackTrace.length > 0
266
+ ? `
267
+ <h4>Stack Trace</h4>
268
+ ${snap.stackTrace
269
+ .map((frame, fi) => `
270
+ <div class="stack-frame ${fi === 0 ? 'stack-frame-current' : ''}">
271
+ #${frame.level} ${escapeHtml(frame.where || '(main)')} at ${escapeHtml(frame.filename)}:${frame.lineno}
272
+ </div>
273
+ `)
274
+ .join('')}
275
+ `
276
+ : ''}
277
+
278
+ ${Object.keys(snap.variables).length > 0
279
+ ? `
280
+ <h4>Variables</h4>
281
+ ${Object.entries(snap.variables)
282
+ .slice(0, 20)
283
+ .map(([name, prop]) => `
284
+ <div class="variable">
285
+ <span class="variable-name">${escapeHtml(name)}</span>
286
+ <span>
287
+ <span class="variable-type">(${escapeHtml(prop.type)})</span>
288
+ ${prop.value ? escapeHtml(String(prop.value).slice(0, 100)) : ''}
289
+ </span>
290
+ </div>
291
+ `)
292
+ .join('')}
293
+ `
294
+ : ''}
295
+ </div>
296
+ `)
297
+ .join('')}
298
+ </div>
299
+
300
+ <div class="card">
301
+ <h2>Raw Export Data</h2>
302
+ <pre>${escapeHtml(JSON.stringify(exported, null, 2))}</pre>
303
+ </div>
304
+ </body>
305
+ </html>`;
306
+ }
307
+ /**
308
+ * Clear all captured data
309
+ */
310
+ reset() {
311
+ this.snapshots = [];
312
+ this.filesVisited.clear();
313
+ this.breakpointsHit = 0;
314
+ this.totalSteps = 0;
315
+ }
316
+ get snapshotCount() {
317
+ return this.snapshots.length;
318
+ }
319
+ }
320
+ //# sourceMappingURL=session-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-export.js","sourceRoot":"","sources":["../../src/session/session-export.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Debug Session
3
+ * Represents a single PHP debug session with all debugging operations.
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { DbgpConnection } from '../dbgp/connection.js';
7
+ import { Breakpoint, DebugStatus, Property, StackFrame, Context, InitPacket, HitCondition } from '../dbgp/types.js';
8
+ export interface SessionState {
9
+ id: string;
10
+ status: DebugStatus;
11
+ filename?: string;
12
+ lineno?: number;
13
+ ideKey?: string;
14
+ startTime: Date;
15
+ }
16
+ export declare class DebugSession extends EventEmitter {
17
+ private connection;
18
+ readonly id: string;
19
+ status: DebugStatus;
20
+ currentFile?: string;
21
+ currentLine?: number;
22
+ readonly startTime: Date;
23
+ private breakpoints;
24
+ private initialized;
25
+ constructor(connection: DbgpConnection);
26
+ get initPacket(): InitPacket | null;
27
+ getState(): SessionState;
28
+ initialize(): Promise<void>;
29
+ setFeature(name: string, value: string): Promise<boolean>;
30
+ getFeature(name: string): Promise<string | null>;
31
+ setLineBreakpoint(filename: string, line: number, options?: {
32
+ condition?: string;
33
+ hitValue?: number;
34
+ hitCondition?: HitCondition;
35
+ temporary?: boolean;
36
+ }): Promise<Breakpoint>;
37
+ setExceptionBreakpoint(exception?: string): Promise<Breakpoint>;
38
+ setCallBreakpoint(functionName: string): Promise<Breakpoint>;
39
+ removeBreakpoint(breakpointId: string): Promise<boolean>;
40
+ updateBreakpoint(breakpointId: string, options: {
41
+ state?: 'enabled' | 'disabled';
42
+ hitValue?: number;
43
+ hitCondition?: HitCondition;
44
+ }): Promise<boolean>;
45
+ getBreakpoint(breakpointId: string): Promise<Breakpoint | null>;
46
+ listBreakpoints(): Promise<Breakpoint[]>;
47
+ run(): Promise<{
48
+ status: DebugStatus;
49
+ file?: string;
50
+ line?: number;
51
+ }>;
52
+ stepInto(): Promise<{
53
+ status: DebugStatus;
54
+ file?: string;
55
+ line?: number;
56
+ }>;
57
+ stepOver(): Promise<{
58
+ status: DebugStatus;
59
+ file?: string;
60
+ line?: number;
61
+ }>;
62
+ stepOut(): Promise<{
63
+ status: DebugStatus;
64
+ file?: string;
65
+ line?: number;
66
+ }>;
67
+ stop(): Promise<void>;
68
+ detach(): Promise<void>;
69
+ private handleStepResponse;
70
+ getStackDepth(): Promise<number>;
71
+ getStackTrace(depth?: number): Promise<StackFrame[]>;
72
+ getContexts(stackDepth?: number): Promise<Context[]>;
73
+ getVariables(contextId?: number, stackDepth?: number): Promise<Property[]>;
74
+ getVariable(name: string, options?: {
75
+ contextId?: number;
76
+ stackDepth?: number;
77
+ maxDepth?: number;
78
+ page?: number;
79
+ }): Promise<Property | null>;
80
+ setVariable(name: string, value: string, options?: {
81
+ contextId?: number;
82
+ stackDepth?: number;
83
+ type?: string;
84
+ }): Promise<boolean>;
85
+ evaluate(expression: string, stackDepth?: number): Promise<Property | null>;
86
+ getSource(fileUri: string, beginLine?: number, endLine?: number): Promise<string | null>;
87
+ redirectStdout(mode: 'disable' | 'copy' | 'redirect'): Promise<boolean>;
88
+ redirectStderr(mode: 'disable' | 'copy' | 'redirect'): Promise<boolean>;
89
+ private normalizeFileUri;
90
+ close(): void;
91
+ get isConnected(): boolean;
92
+ }