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 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Performance Profiler
3
+ * Tracks memory usage, execution time, and function call statistics.
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { DebugSession } from './session.js';
7
+ export interface ProfileSnapshot {
8
+ timestamp: Date;
9
+ file: string;
10
+ line: number;
11
+ memoryUsage?: number;
12
+ peakMemoryUsage?: number;
13
+ executionTime?: number;
14
+ functionName?: string;
15
+ }
16
+ export interface FunctionProfile {
17
+ name: string;
18
+ callCount: number;
19
+ totalTime: number;
20
+ avgTime: number;
21
+ minTime: number;
22
+ maxTime: number;
23
+ lastCalledAt?: Date;
24
+ }
25
+ export interface ProfilingSession {
26
+ id: string;
27
+ startedAt: Date;
28
+ endedAt?: Date;
29
+ snapshots: ProfileSnapshot[];
30
+ functionProfiles: Map<string, FunctionProfile>;
31
+ totalMemorySnapshots: number;
32
+ peakMemoryUsage: number;
33
+ }
34
+ export declare class Profiler extends EventEmitter {
35
+ private currentSession;
36
+ private sessionIdCounter;
37
+ private lastSnapshotTime;
38
+ constructor();
39
+ /**
40
+ * Start a new profiling session
41
+ */
42
+ startSession(): ProfilingSession;
43
+ /**
44
+ * End the current profiling session
45
+ */
46
+ endSession(): ProfilingSession | null;
47
+ /**
48
+ * Take a snapshot at the current execution point
49
+ */
50
+ takeSnapshot(session: DebugSession, functionName?: string): Promise<ProfileSnapshot | null>;
51
+ /**
52
+ * Record a function call for profiling
53
+ */
54
+ private recordFunctionCall;
55
+ /**
56
+ * Get current session statistics
57
+ */
58
+ getStatistics(): {
59
+ sessionId: string | null;
60
+ isActive: boolean;
61
+ duration: number;
62
+ snapshotCount: number;
63
+ peakMemoryUsage: number;
64
+ functionCount: number;
65
+ topFunctions: FunctionProfile[];
66
+ } | null;
67
+ /**
68
+ * Get memory timeline
69
+ */
70
+ getMemoryTimeline(): Array<{
71
+ timestamp: Date;
72
+ usage: number;
73
+ peak: number;
74
+ }>;
75
+ /**
76
+ * Get function profiles sorted by total time
77
+ */
78
+ getFunctionProfiles(): FunctionProfile[];
79
+ /**
80
+ * Format bytes to human readable string
81
+ */
82
+ static formatBytes(bytes: number): string;
83
+ /**
84
+ * Format duration to human readable string
85
+ */
86
+ static formatDuration(ms: number): string;
87
+ get isActive(): boolean;
88
+ get currentSessionId(): string | null;
89
+ }
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Performance Profiler
3
+ * Tracks memory usage, execution time, and function call statistics.
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { logger } from '../utils/logger.js';
7
+ export class Profiler extends EventEmitter {
8
+ currentSession = null;
9
+ sessionIdCounter = 0;
10
+ lastSnapshotTime = 0;
11
+ constructor() {
12
+ super();
13
+ }
14
+ /**
15
+ * Start a new profiling session
16
+ */
17
+ startSession() {
18
+ if (this.currentSession && !this.currentSession.endedAt) {
19
+ this.endSession();
20
+ }
21
+ this.currentSession = {
22
+ id: `profile_${++this.sessionIdCounter}`,
23
+ startedAt: new Date(),
24
+ snapshots: [],
25
+ functionProfiles: new Map(),
26
+ totalMemorySnapshots: 0,
27
+ peakMemoryUsage: 0,
28
+ };
29
+ this.lastSnapshotTime = Date.now();
30
+ logger.info(`Profiling session started: ${this.currentSession.id}`);
31
+ return this.currentSession;
32
+ }
33
+ /**
34
+ * End the current profiling session
35
+ */
36
+ endSession() {
37
+ if (!this.currentSession)
38
+ return null;
39
+ this.currentSession.endedAt = new Date();
40
+ const session = this.currentSession;
41
+ logger.info(`Profiling session ended: ${session.id}`);
42
+ return session;
43
+ }
44
+ /**
45
+ * Take a snapshot at the current execution point
46
+ */
47
+ async takeSnapshot(session, functionName) {
48
+ if (!this.currentSession)
49
+ return null;
50
+ const now = Date.now();
51
+ const executionTime = now - this.lastSnapshotTime;
52
+ this.lastSnapshotTime = now;
53
+ // Get memory usage via eval
54
+ let memoryUsage;
55
+ let peakMemoryUsage;
56
+ try {
57
+ const memResult = await session.evaluate('memory_get_usage(true)');
58
+ if (memResult?.value) {
59
+ memoryUsage = parseInt(memResult.value, 10);
60
+ }
61
+ const peakResult = await session.evaluate('memory_get_peak_usage(true)');
62
+ if (peakResult?.value) {
63
+ peakMemoryUsage = parseInt(peakResult.value, 10);
64
+ }
65
+ }
66
+ catch {
67
+ // Memory functions may not be available
68
+ }
69
+ const snapshot = {
70
+ timestamp: new Date(),
71
+ file: session.currentFile || '',
72
+ line: session.currentLine || 0,
73
+ memoryUsage,
74
+ peakMemoryUsage,
75
+ executionTime,
76
+ functionName,
77
+ };
78
+ this.currentSession.snapshots.push(snapshot);
79
+ this.currentSession.totalMemorySnapshots++;
80
+ if (peakMemoryUsage && peakMemoryUsage > this.currentSession.peakMemoryUsage) {
81
+ this.currentSession.peakMemoryUsage = peakMemoryUsage;
82
+ }
83
+ // Track function profile
84
+ if (functionName) {
85
+ this.recordFunctionCall(functionName, executionTime);
86
+ }
87
+ this.emit('snapshot', snapshot);
88
+ return snapshot;
89
+ }
90
+ /**
91
+ * Record a function call for profiling
92
+ */
93
+ recordFunctionCall(name, executionTime) {
94
+ if (!this.currentSession)
95
+ return;
96
+ let profile = this.currentSession.functionProfiles.get(name);
97
+ if (!profile) {
98
+ profile = {
99
+ name,
100
+ callCount: 0,
101
+ totalTime: 0,
102
+ avgTime: 0,
103
+ minTime: Infinity,
104
+ maxTime: 0,
105
+ };
106
+ this.currentSession.functionProfiles.set(name, profile);
107
+ }
108
+ profile.callCount++;
109
+ profile.totalTime += executionTime;
110
+ profile.avgTime = profile.totalTime / profile.callCount;
111
+ profile.minTime = Math.min(profile.minTime, executionTime);
112
+ profile.maxTime = Math.max(profile.maxTime, executionTime);
113
+ profile.lastCalledAt = new Date();
114
+ }
115
+ /**
116
+ * Get current session statistics
117
+ */
118
+ getStatistics() {
119
+ if (!this.currentSession)
120
+ return null;
121
+ const duration = this.currentSession.endedAt
122
+ ? this.currentSession.endedAt.getTime() - this.currentSession.startedAt.getTime()
123
+ : Date.now() - this.currentSession.startedAt.getTime();
124
+ const functions = Array.from(this.currentSession.functionProfiles.values());
125
+ const topFunctions = functions
126
+ .sort((a, b) => b.totalTime - a.totalTime)
127
+ .slice(0, 10);
128
+ return {
129
+ sessionId: this.currentSession.id,
130
+ isActive: !this.currentSession.endedAt,
131
+ duration,
132
+ snapshotCount: this.currentSession.snapshots.length,
133
+ peakMemoryUsage: this.currentSession.peakMemoryUsage,
134
+ functionCount: functions.length,
135
+ topFunctions,
136
+ };
137
+ }
138
+ /**
139
+ * Get memory timeline
140
+ */
141
+ getMemoryTimeline() {
142
+ if (!this.currentSession)
143
+ return [];
144
+ return this.currentSession.snapshots
145
+ .filter((s) => s.memoryUsage !== undefined)
146
+ .map((s) => ({
147
+ timestamp: s.timestamp,
148
+ usage: s.memoryUsage,
149
+ peak: s.peakMemoryUsage || s.memoryUsage,
150
+ }));
151
+ }
152
+ /**
153
+ * Get function profiles sorted by total time
154
+ */
155
+ getFunctionProfiles() {
156
+ if (!this.currentSession)
157
+ return [];
158
+ return Array.from(this.currentSession.functionProfiles.values()).sort((a, b) => b.totalTime - a.totalTime);
159
+ }
160
+ /**
161
+ * Format bytes to human readable string
162
+ */
163
+ static formatBytes(bytes) {
164
+ if (bytes < 1024)
165
+ return `${bytes} B`;
166
+ if (bytes < 1024 * 1024)
167
+ return `${(bytes / 1024).toFixed(2)} KB`;
168
+ if (bytes < 1024 * 1024 * 1024)
169
+ return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;
170
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`;
171
+ }
172
+ /**
173
+ * Format duration to human readable string
174
+ */
175
+ static formatDuration(ms) {
176
+ if (ms < 1)
177
+ return `${(ms * 1000).toFixed(2)} μs`;
178
+ if (ms < 1000)
179
+ return `${ms.toFixed(2)} ms`;
180
+ if (ms < 60000)
181
+ return `${(ms / 1000).toFixed(2)} s`;
182
+ return `${(ms / 60000).toFixed(2)} min`;
183
+ }
184
+ get isActive() {
185
+ return this.currentSession !== null && !this.currentSession.endedAt;
186
+ }
187
+ get currentSessionId() {
188
+ return this.currentSession?.id || null;
189
+ }
190
+ }
191
+ //# sourceMappingURL=profiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiler.js","sourceRoot":"","sources":["../../src/session/profiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Request Context Capture
3
+ * Captures and stores PHP request context ($_GET, $_POST, $_SESSION, etc.)
4
+ */
5
+ import { DebugSession } from './session.js';
6
+ export interface RequestContext {
7
+ capturedAt: Date;
8
+ method?: string;
9
+ uri?: string;
10
+ get: Record<string, unknown>;
11
+ post: Record<string, unknown>;
12
+ session: Record<string, unknown>;
13
+ cookie: Record<string, unknown>;
14
+ server: Record<string, unknown>;
15
+ files: Record<string, unknown>;
16
+ headers: Record<string, string>;
17
+ requestBody?: string;
18
+ }
19
+ export declare class RequestContextCapture {
20
+ private lastContext;
21
+ /**
22
+ * Capture the current request context from a debug session
23
+ */
24
+ capture(session: DebugSession): Promise<RequestContext>;
25
+ /**
26
+ * Get the last captured context
27
+ */
28
+ getLastContext(): RequestContext | null;
29
+ /**
30
+ * Convert a Property to a plain object
31
+ */
32
+ private propertyToObject;
33
+ /**
34
+ * Format context as a readable report
35
+ */
36
+ formatReport(context: RequestContext): string;
37
+ /**
38
+ * Get simplified context for quick viewing
39
+ */
40
+ getSummary(context: RequestContext): {
41
+ method: string;
42
+ uri: string;
43
+ hasGet: boolean;
44
+ hasPost: boolean;
45
+ hasSession: boolean;
46
+ hasCookies: boolean;
47
+ hasFiles: boolean;
48
+ headerCount: number;
49
+ };
50
+ }
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Request Context Capture
3
+ * Captures and stores PHP request context ($_GET, $_POST, $_SESSION, etc.)
4
+ */
5
+ import { logger } from '../utils/logger.js';
6
+ export class RequestContextCapture {
7
+ lastContext = null;
8
+ /**
9
+ * Capture the current request context from a debug session
10
+ */
11
+ async capture(session) {
12
+ const context = {
13
+ capturedAt: new Date(),
14
+ get: {},
15
+ post: {},
16
+ session: {},
17
+ cookie: {},
18
+ server: {},
19
+ files: {},
20
+ headers: {},
21
+ };
22
+ // Capture superglobals
23
+ const superglobals = [
24
+ { name: '$_GET', target: 'get' },
25
+ { name: '$_POST', target: 'post' },
26
+ { name: '$_SESSION', target: 'session' },
27
+ { name: '$_COOKIE', target: 'cookie' },
28
+ { name: '$_SERVER', target: 'server' },
29
+ { name: '$_FILES', target: 'files' },
30
+ ];
31
+ for (const { name, target } of superglobals) {
32
+ try {
33
+ const result = await session.getVariable(name, { contextId: 1 }); // 1 = superglobals
34
+ if (result) {
35
+ const obj = this.propertyToObject(result);
36
+ if (target === 'get')
37
+ context.get = obj;
38
+ else if (target === 'post')
39
+ context.post = obj;
40
+ else if (target === 'session')
41
+ context.session = obj;
42
+ else if (target === 'cookie')
43
+ context.cookie = obj;
44
+ else if (target === 'server')
45
+ context.server = obj;
46
+ else if (target === 'files')
47
+ context.files = obj;
48
+ }
49
+ }
50
+ catch {
51
+ logger.debug(`Failed to capture ${name}`);
52
+ }
53
+ }
54
+ // Extract useful server info
55
+ if (context.server) {
56
+ const server = context.server;
57
+ context.method = server['REQUEST_METHOD'];
58
+ context.uri = server['REQUEST_URI'];
59
+ // Extract headers from $_SERVER
60
+ for (const [key, value] of Object.entries(server)) {
61
+ if (key.startsWith('HTTP_')) {
62
+ const headerName = key
63
+ .slice(5)
64
+ .toLowerCase()
65
+ .replace(/_/g, '-')
66
+ .replace(/\b\w/g, (c) => c.toUpperCase());
67
+ context.headers[headerName] = String(value);
68
+ }
69
+ }
70
+ if (server['CONTENT_TYPE']) {
71
+ context.headers['Content-Type'] = server['CONTENT_TYPE'];
72
+ }
73
+ if (server['CONTENT_LENGTH']) {
74
+ context.headers['Content-Length'] = server['CONTENT_LENGTH'];
75
+ }
76
+ }
77
+ // Try to capture raw request body
78
+ try {
79
+ const bodyResult = await session.evaluate('file_get_contents("php://input")');
80
+ if (bodyResult?.value) {
81
+ context.requestBody = bodyResult.value;
82
+ }
83
+ }
84
+ catch {
85
+ // Request body may not be available
86
+ }
87
+ this.lastContext = context;
88
+ return context;
89
+ }
90
+ /**
91
+ * Get the last captured context
92
+ */
93
+ getLastContext() {
94
+ return this.lastContext;
95
+ }
96
+ /**
97
+ * Convert a Property to a plain object
98
+ */
99
+ propertyToObject(prop) {
100
+ const result = {};
101
+ if (prop.properties) {
102
+ for (const child of prop.properties) {
103
+ const key = child.name || child.key || '';
104
+ if (child.properties && child.properties.length > 0) {
105
+ result[key] = this.propertyToObject(child);
106
+ }
107
+ else {
108
+ result[key] = child.value;
109
+ }
110
+ }
111
+ }
112
+ else if (prop.value !== undefined) {
113
+ return { value: prop.value };
114
+ }
115
+ return result;
116
+ }
117
+ /**
118
+ * Format context as a readable report
119
+ */
120
+ formatReport(context) {
121
+ const lines = [];
122
+ lines.push('=== Request Context ===');
123
+ lines.push(`Captured at: ${context.capturedAt.toISOString()}`);
124
+ lines.push(`Method: ${context.method || 'N/A'}`);
125
+ lines.push(`URI: ${context.uri || 'N/A'}`);
126
+ lines.push('');
127
+ if (Object.keys(context.headers).length > 0) {
128
+ lines.push('--- Headers ---');
129
+ for (const [key, value] of Object.entries(context.headers)) {
130
+ lines.push(` ${key}: ${value}`);
131
+ }
132
+ lines.push('');
133
+ }
134
+ if (Object.keys(context.get).length > 0) {
135
+ lines.push('--- GET Parameters ---');
136
+ lines.push(JSON.stringify(context.get, null, 2));
137
+ lines.push('');
138
+ }
139
+ if (Object.keys(context.post).length > 0) {
140
+ lines.push('--- POST Data ---');
141
+ lines.push(JSON.stringify(context.post, null, 2));
142
+ lines.push('');
143
+ }
144
+ if (context.requestBody) {
145
+ lines.push('--- Request Body ---');
146
+ lines.push(context.requestBody);
147
+ lines.push('');
148
+ }
149
+ if (Object.keys(context.cookie).length > 0) {
150
+ lines.push('--- Cookies ---');
151
+ lines.push(JSON.stringify(context.cookie, null, 2));
152
+ lines.push('');
153
+ }
154
+ if (Object.keys(context.session).length > 0) {
155
+ lines.push('--- Session ---');
156
+ lines.push(JSON.stringify(context.session, null, 2));
157
+ lines.push('');
158
+ }
159
+ if (Object.keys(context.files).length > 0) {
160
+ lines.push('--- Uploaded Files ---');
161
+ lines.push(JSON.stringify(context.files, null, 2));
162
+ lines.push('');
163
+ }
164
+ return lines.join('\n');
165
+ }
166
+ /**
167
+ * Get simplified context for quick viewing
168
+ */
169
+ getSummary(context) {
170
+ return {
171
+ method: context.method || 'N/A',
172
+ uri: context.uri || 'N/A',
173
+ hasGet: Object.keys(context.get).length > 0,
174
+ hasPost: Object.keys(context.post).length > 0,
175
+ hasSession: Object.keys(context.session).length > 0,
176
+ hasCookies: Object.keys(context.cookie).length > 0,
177
+ hasFiles: Object.keys(context.files).length > 0,
178
+ headerCount: Object.keys(context.headers).length,
179
+ };
180
+ }
181
+ }
182
+ //# sourceMappingURL=request-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-context.js","sourceRoot":"","sources":["../../src/session/request-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Session Export
3
+ * Export debug sessions as JSON/HTML reports for sharing.
4
+ */
5
+ import { DebugSession, SessionState } from './session.js';
6
+ import { StackFrame, Property, Breakpoint } from '../dbgp/types.js';
7
+ import { RequestContext } from './request-context.js';
8
+ import { LogEntry } from './logpoint-manager.js';
9
+ export interface DebugSnapshot {
10
+ timestamp: Date;
11
+ sessionId: string;
12
+ state: SessionState;
13
+ stackTrace: StackFrame[];
14
+ variables: Record<string, Property>;
15
+ watchValues: Array<{
16
+ expression: string;
17
+ value: Property | null;
18
+ error?: string;
19
+ }>;
20
+ breakpoints: Breakpoint[];
21
+ requestContext?: RequestContext;
22
+ logEntries?: LogEntry[];
23
+ }
24
+ export interface ExportedSession {
25
+ exportedAt: Date;
26
+ sessionInfo: {
27
+ id: string;
28
+ startTime: Date;
29
+ endTime?: Date;
30
+ initialFile: string;
31
+ ideKey: string;
32
+ };
33
+ snapshots: DebugSnapshot[];
34
+ summary: {
35
+ totalSnapshots: number;
36
+ filesVisited: string[];
37
+ breakpointsHit: number;
38
+ totalSteps: number;
39
+ };
40
+ }
41
+ export declare class SessionExporter {
42
+ private snapshots;
43
+ private filesVisited;
44
+ private breakpointsHit;
45
+ private totalSteps;
46
+ /**
47
+ * Capture a snapshot of the current debug state
48
+ */
49
+ captureSnapshot(session: DebugSession, additionalData?: {
50
+ watchValues?: Array<{
51
+ expression: string;
52
+ value: Property | null;
53
+ error?: string;
54
+ }>;
55
+ requestContext?: RequestContext;
56
+ logEntries?: LogEntry[];
57
+ }): Promise<DebugSnapshot>;
58
+ /**
59
+ * Record a breakpoint hit
60
+ */
61
+ recordBreakpointHit(): void;
62
+ /**
63
+ * Export session as JSON
64
+ */
65
+ exportAsJson(session: DebugSession): string;
66
+ /**
67
+ * Export session as HTML report
68
+ */
69
+ exportAsHtml(session: DebugSession): string;
70
+ /**
71
+ * Build the exported session object
72
+ */
73
+ private buildExportedSession;
74
+ /**
75
+ * Generate HTML report
76
+ */
77
+ private generateHtmlReport;
78
+ /**
79
+ * Clear all captured data
80
+ */
81
+ reset(): void;
82
+ get snapshotCount(): number;
83
+ }