@dynamicu/chromedebug-mcp 2.2.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 (95) hide show
  1. package/CLAUDE.md +344 -0
  2. package/LICENSE +21 -0
  3. package/README.md +250 -0
  4. package/chrome-extension/README.md +41 -0
  5. package/chrome-extension/background.js +3917 -0
  6. package/chrome-extension/chrome-session-manager.js +706 -0
  7. package/chrome-extension/content.css +181 -0
  8. package/chrome-extension/content.js +3022 -0
  9. package/chrome-extension/data-buffer.js +435 -0
  10. package/chrome-extension/dom-tracker.js +411 -0
  11. package/chrome-extension/extension-config.js +78 -0
  12. package/chrome-extension/firebase-client.js +278 -0
  13. package/chrome-extension/firebase-config.js +32 -0
  14. package/chrome-extension/firebase-config.module.js +22 -0
  15. package/chrome-extension/firebase-config.module.template.js +27 -0
  16. package/chrome-extension/firebase-config.template.js +36 -0
  17. package/chrome-extension/frame-capture.js +407 -0
  18. package/chrome-extension/icon128.png +1 -0
  19. package/chrome-extension/icon16.png +1 -0
  20. package/chrome-extension/icon48.png +1 -0
  21. package/chrome-extension/license-helper.js +181 -0
  22. package/chrome-extension/logger.js +23 -0
  23. package/chrome-extension/manifest.json +73 -0
  24. package/chrome-extension/network-tracker.js +510 -0
  25. package/chrome-extension/offscreen.html +10 -0
  26. package/chrome-extension/options.html +203 -0
  27. package/chrome-extension/options.js +282 -0
  28. package/chrome-extension/pako.min.js +2 -0
  29. package/chrome-extension/performance-monitor.js +533 -0
  30. package/chrome-extension/pii-redactor.js +405 -0
  31. package/chrome-extension/popup.html +532 -0
  32. package/chrome-extension/popup.js +2446 -0
  33. package/chrome-extension/upload-manager.js +323 -0
  34. package/chrome-extension/web-vitals.iife.js +1 -0
  35. package/config/api-keys.json +11 -0
  36. package/config/chrome-pilot-config.json +45 -0
  37. package/package.json +126 -0
  38. package/scripts/cleanup-processes.js +109 -0
  39. package/scripts/config-manager.js +280 -0
  40. package/scripts/generate-extension-config.js +53 -0
  41. package/scripts/setup-security.js +64 -0
  42. package/src/capture/architecture.js +426 -0
  43. package/src/capture/error-handling-tests.md +38 -0
  44. package/src/capture/error-handling-types.ts +360 -0
  45. package/src/capture/index.js +508 -0
  46. package/src/capture/interfaces.js +625 -0
  47. package/src/capture/memory-manager.js +713 -0
  48. package/src/capture/types.js +342 -0
  49. package/src/chrome-controller.js +2658 -0
  50. package/src/cli.js +19 -0
  51. package/src/config-loader.js +303 -0
  52. package/src/database.js +2178 -0
  53. package/src/firebase-license-manager.js +462 -0
  54. package/src/firebase-privacy-guard.js +397 -0
  55. package/src/http-server.js +1516 -0
  56. package/src/index-direct.js +157 -0
  57. package/src/index-modular.js +219 -0
  58. package/src/index-monolithic-backup.js +2230 -0
  59. package/src/index.js +305 -0
  60. package/src/legacy/chrome-controller-old.js +1406 -0
  61. package/src/legacy/index-express.js +625 -0
  62. package/src/legacy/index-old.js +977 -0
  63. package/src/legacy/routes.js +260 -0
  64. package/src/legacy/shared-storage.js +101 -0
  65. package/src/logger.js +10 -0
  66. package/src/mcp/handlers/chrome-tool-handler.js +306 -0
  67. package/src/mcp/handlers/element-tool-handler.js +51 -0
  68. package/src/mcp/handlers/frame-tool-handler.js +957 -0
  69. package/src/mcp/handlers/request-handler.js +104 -0
  70. package/src/mcp/handlers/workflow-tool-handler.js +636 -0
  71. package/src/mcp/server.js +68 -0
  72. package/src/mcp/tools/index.js +701 -0
  73. package/src/middleware/auth.js +371 -0
  74. package/src/middleware/security.js +267 -0
  75. package/src/port-discovery.js +258 -0
  76. package/src/routes/admin.js +182 -0
  77. package/src/services/browser-daemon.js +494 -0
  78. package/src/services/chrome-service.js +375 -0
  79. package/src/services/failover-manager.js +412 -0
  80. package/src/services/git-safety-service.js +675 -0
  81. package/src/services/heartbeat-manager.js +200 -0
  82. package/src/services/http-client.js +195 -0
  83. package/src/services/process-manager.js +318 -0
  84. package/src/services/process-tracker.js +574 -0
  85. package/src/services/profile-manager.js +449 -0
  86. package/src/services/project-manager.js +415 -0
  87. package/src/services/session-manager.js +497 -0
  88. package/src/services/session-registry.js +491 -0
  89. package/src/services/unified-session-manager.js +678 -0
  90. package/src/shared-storage-old.js +267 -0
  91. package/src/standalone-server.js +53 -0
  92. package/src/utils/extension-path.js +145 -0
  93. package/src/utils.js +187 -0
  94. package/src/validation/log-transformer.js +125 -0
  95. package/src/validation/schemas.js +391 -0
package/src/index.js ADDED
@@ -0,0 +1,305 @@
1
+ /**
2
+ * Chrome Debug MCP Server - Modular Architecture
3
+ * Refactored from monolithic design to modular components
4
+ * Maintains all security fixes and functionality while improving maintainability
5
+ */
6
+
7
+ import { ChromeController } from './chrome-controller.js';
8
+ import { MCPServer } from './mcp/server.js';
9
+ import { ChromeService } from './services/chrome-service.js';
10
+ import { ProcessManager } from './services/process-manager.js';
11
+ import {
12
+ initializeSessionManager,
13
+ getSessionInfo,
14
+ registerProcess,
15
+ findActiveSessions
16
+ } from './services/unified-session-manager.js';
17
+
18
+ /**
19
+ * Main application class that orchestrates all components
20
+ */
21
+ class ChromePilotApp {
22
+ constructor() {
23
+ this.chromeController = null;
24
+ this.chromeService = null;
25
+ this.mcpServer = null;
26
+ this.processManager = null;
27
+ this.sessionManager = null;
28
+ this.initialized = false;
29
+ }
30
+
31
+ /**
32
+ * Initializes all components
33
+ * @param {Object} options - Initialization options
34
+ */
35
+ async initialize(options = {}) {
36
+ try {
37
+ // Parse command line arguments
38
+ const args = this.parseArguments();
39
+ const finalOptions = { ...options, ...args };
40
+
41
+ // Create Chrome controller instance
42
+ this.chromeController = new ChromeController();
43
+
44
+ // Create Chrome service wrapper with process management
45
+ this.chromeService = new ChromeService(this.chromeController);
46
+ this.processManager = this.chromeService.getProcessManager();
47
+
48
+ // Initialize Chrome service (starts HTTP server if needed)
49
+ const serviceResult = await this.chromeService.initialize({
50
+ ...finalOptions,
51
+ sessionManager: this.sessionManager
52
+ });
53
+
54
+ if (serviceResult.httpServer) {
55
+ console.error(`Chrome service initialized with HTTP server on port ${serviceResult.httpServer.port}`);
56
+ }
57
+
58
+ // Create and configure MCP server
59
+ this.mcpServer = new MCPServer(this.chromeService);
60
+
61
+ this.initialized = true;
62
+ return {
63
+ status: 'initialized',
64
+ options: finalOptions,
65
+ serviceResult
66
+ };
67
+ } catch (error) {
68
+ console.error('Failed to initialize Chrome Debug:', error);
69
+ throw error;
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Starts the MCP server
75
+ */
76
+ async start() {
77
+ if (!this.initialized) {
78
+ await this.initialize();
79
+ }
80
+
81
+ try {
82
+ // Clean up any existing Chrome Debug processes
83
+ const cleanupResult = await this.processManager.cleanupChromePilotProcesses();
84
+ if (cleanupResult.total > 0) {
85
+ console.error(`Cleaned up ${cleanupResult.killed.length} existing processes`);
86
+ }
87
+
88
+ // Start the MCP server
89
+ await this.mcpServer.start();
90
+ } catch (error) {
91
+ console.error('Failed to start Chrome Debug MCP server:', error);
92
+ process.exit(1);
93
+ }
94
+ }
95
+
96
+ /**
97
+ * Gets the status of all components
98
+ */
99
+ async getStatus() {
100
+ if (!this.initialized) {
101
+ return { status: 'not_initialized' };
102
+ }
103
+
104
+ return {
105
+ status: 'running',
106
+ components: {
107
+ chromeService: await this.chromeService.getStatus(),
108
+ processManager: this.processManager.getStatistics(),
109
+ mcpServer: {
110
+ initialized: !!this.mcpServer,
111
+ tools: this.mcpServer ? this.mcpServer.toolRegistry.getAllTools().length : 0
112
+ }
113
+ },
114
+ timestamp: new Date().toISOString()
115
+ };
116
+ }
117
+
118
+ /**
119
+ * Parses command line arguments
120
+ * @returns {Object} Parsed arguments
121
+ */
122
+ parseArguments() {
123
+ const args = {
124
+ singleServer: false,
125
+ watch: false,
126
+ debug: false,
127
+ sessionId: null,
128
+ noCleanup: false,
129
+ verbose: false
130
+ };
131
+
132
+ const argv = process.argv.slice(2);
133
+ for (let i = 0; i < argv.length; i++) {
134
+ const arg = argv[i];
135
+
136
+ switch (arg) {
137
+ case '--single-server':
138
+ args.singleServer = true;
139
+ break;
140
+ case '--watch':
141
+ args.watch = true;
142
+ break;
143
+ case '--debug':
144
+ args.debug = true;
145
+ break;
146
+ case '--session-id':
147
+ if (i + 1 < argv.length) {
148
+ args.sessionId = argv[++i];
149
+ } else {
150
+ console.error('--session-id requires a value');
151
+ process.exit(1);
152
+ }
153
+ break;
154
+ case '--no-cleanup':
155
+ args.noCleanup = true;
156
+ break;
157
+ case '--verbose':
158
+ args.verbose = true;
159
+ break;
160
+ case '--help':
161
+ this.showHelp();
162
+ process.exit(0);
163
+ break;
164
+ default:
165
+ if (arg.startsWith('--session-id=')) {
166
+ args.sessionId = arg.split('=')[1];
167
+ } else if (arg.startsWith('--')) {
168
+ console.error(`Unknown argument: ${arg}`);
169
+ this.showHelp();
170
+ process.exit(1);
171
+ }
172
+ break;
173
+ }
174
+ }
175
+
176
+ return args;
177
+ }
178
+
179
+ /**
180
+ * Shows help information
181
+ */
182
+ showHelp() {
183
+ console.log(`
184
+ Chrome Debug MCP Server - Modular Architecture with Session Isolation
185
+
186
+ Usage: node src/index.js [options]
187
+
188
+ Options:
189
+ --single-server Run without HTTP server (MCP only)
190
+ --watch Watch for file changes (development mode)
191
+ --debug Enable debug logging
192
+ --session-id ID Set custom session ID for resource isolation
193
+ --no-cleanup Skip cleanup of dead processes on startup
194
+ --verbose Enable verbose logging including session info
195
+ --help Show this help message
196
+
197
+ Session Isolation:
198
+ Each session gets isolated process tracking and port discovery.
199
+ This allows multiple Chrome Debug MCP instances to run simultaneously
200
+ without interfering with each other.
201
+
202
+ Examples:
203
+ node src/index.js --session-id claude-session-1 --verbose
204
+ node src/index.js --no-cleanup --debug
205
+
206
+ Environment Variables:
207
+ NODE_ENV Set to 'development' for debug mode
208
+ CHROME_PILOT_PORT Configure HTTP server port
209
+
210
+ For more information, see the documentation in CLAUDE.md
211
+ `);
212
+ }
213
+
214
+ /**
215
+ * Graceful shutdown
216
+ */
217
+ async shutdown() {
218
+ console.error('Shutting down Chrome Debug...');
219
+
220
+ try {
221
+ if (this.chromeService) {
222
+ await this.chromeService.cleanup();
223
+ }
224
+
225
+ if (this.processManager) {
226
+ await this.processManager.killAllManagedProcesses();
227
+ }
228
+
229
+ console.error('Chrome Debug shutdown complete');
230
+ } catch (error) {
231
+ console.error('Error during shutdown:', error);
232
+ }
233
+ }
234
+ }
235
+
236
+ /**
237
+ * Main entry point
238
+ */
239
+ async function main() {
240
+ const app = new ChromePilotApp();
241
+
242
+ // Parse arguments first to get session settings
243
+ const args = app.parseArguments();
244
+
245
+ try {
246
+ // Initialize unified session manager with options
247
+ const sessionManager = await initializeSessionManager({
248
+ sessionId: args.sessionId,
249
+ skipCleanup: args.noCleanup,
250
+ verbose: args.verbose
251
+ });
252
+
253
+ // Register this process for tracking
254
+ await registerProcess(process.pid, 'mcp-server');
255
+
256
+ // Log session information if verbose
257
+ if (args.verbose) {
258
+ const sessionInfo = getSessionInfo();
259
+ console.log('Session Information:');
260
+ console.log(` Session ID: ${sessionInfo.sessionId}`);
261
+ console.log(` PID: ${sessionInfo.pid}`);
262
+ console.log(` Port: ${sessionInfo.port}`);
263
+ console.log(` Session File: ${sessionInfo.sessionFile}`);
264
+
265
+ // Show other active sessions
266
+ const activeSessions = await findActiveSessions();
267
+ if (activeSessions.length > 1) {
268
+ console.log(` Other active sessions: ${activeSessions.length - 1}`);
269
+ activeSessions.filter(s => s.sessionId !== sessionInfo.sessionId).forEach(session => {
270
+ console.log(` - ${session.sessionId} (PID: ${session.pid}, Port: ${session.port})`);
271
+ });
272
+ }
273
+ }
274
+
275
+ // Pass session manager to app
276
+ app.sessionManager = sessionManager;
277
+
278
+ await app.start();
279
+ } catch (error) {
280
+ console.error('Fatal error starting Chrome Debug:', error);
281
+ process.exit(1);
282
+ }
283
+ }
284
+
285
+ // Handle graceful shutdown
286
+ process.on('SIGINT', async () => {
287
+ console.error('Received SIGINT, shutting down gracefully...');
288
+ process.exit(0);
289
+ });
290
+
291
+ process.on('SIGTERM', async () => {
292
+ console.error('Received SIGTERM, shutting down gracefully...');
293
+ process.exit(0);
294
+ });
295
+
296
+ // Export for testing
297
+ export { ChromePilotApp };
298
+
299
+ // Run if this is the main module
300
+ if (import.meta.url === `file://${process.argv[1]}`) {
301
+ main().catch((error) => {
302
+ console.error('Unhandled error:', error);
303
+ process.exit(1);
304
+ });
305
+ }