@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.
- package/CLAUDE.md +344 -0
- package/LICENSE +21 -0
- package/README.md +250 -0
- package/chrome-extension/README.md +41 -0
- package/chrome-extension/background.js +3917 -0
- package/chrome-extension/chrome-session-manager.js +706 -0
- package/chrome-extension/content.css +181 -0
- package/chrome-extension/content.js +3022 -0
- package/chrome-extension/data-buffer.js +435 -0
- package/chrome-extension/dom-tracker.js +411 -0
- package/chrome-extension/extension-config.js +78 -0
- package/chrome-extension/firebase-client.js +278 -0
- package/chrome-extension/firebase-config.js +32 -0
- package/chrome-extension/firebase-config.module.js +22 -0
- package/chrome-extension/firebase-config.module.template.js +27 -0
- package/chrome-extension/firebase-config.template.js +36 -0
- package/chrome-extension/frame-capture.js +407 -0
- package/chrome-extension/icon128.png +1 -0
- package/chrome-extension/icon16.png +1 -0
- package/chrome-extension/icon48.png +1 -0
- package/chrome-extension/license-helper.js +181 -0
- package/chrome-extension/logger.js +23 -0
- package/chrome-extension/manifest.json +73 -0
- package/chrome-extension/network-tracker.js +510 -0
- package/chrome-extension/offscreen.html +10 -0
- package/chrome-extension/options.html +203 -0
- package/chrome-extension/options.js +282 -0
- package/chrome-extension/pako.min.js +2 -0
- package/chrome-extension/performance-monitor.js +533 -0
- package/chrome-extension/pii-redactor.js +405 -0
- package/chrome-extension/popup.html +532 -0
- package/chrome-extension/popup.js +2446 -0
- package/chrome-extension/upload-manager.js +323 -0
- package/chrome-extension/web-vitals.iife.js +1 -0
- package/config/api-keys.json +11 -0
- package/config/chrome-pilot-config.json +45 -0
- package/package.json +126 -0
- package/scripts/cleanup-processes.js +109 -0
- package/scripts/config-manager.js +280 -0
- package/scripts/generate-extension-config.js +53 -0
- package/scripts/setup-security.js +64 -0
- package/src/capture/architecture.js +426 -0
- package/src/capture/error-handling-tests.md +38 -0
- package/src/capture/error-handling-types.ts +360 -0
- package/src/capture/index.js +508 -0
- package/src/capture/interfaces.js +625 -0
- package/src/capture/memory-manager.js +713 -0
- package/src/capture/types.js +342 -0
- package/src/chrome-controller.js +2658 -0
- package/src/cli.js +19 -0
- package/src/config-loader.js +303 -0
- package/src/database.js +2178 -0
- package/src/firebase-license-manager.js +462 -0
- package/src/firebase-privacy-guard.js +397 -0
- package/src/http-server.js +1516 -0
- package/src/index-direct.js +157 -0
- package/src/index-modular.js +219 -0
- package/src/index-monolithic-backup.js +2230 -0
- package/src/index.js +305 -0
- package/src/legacy/chrome-controller-old.js +1406 -0
- package/src/legacy/index-express.js +625 -0
- package/src/legacy/index-old.js +977 -0
- package/src/legacy/routes.js +260 -0
- package/src/legacy/shared-storage.js +101 -0
- package/src/logger.js +10 -0
- package/src/mcp/handlers/chrome-tool-handler.js +306 -0
- package/src/mcp/handlers/element-tool-handler.js +51 -0
- package/src/mcp/handlers/frame-tool-handler.js +957 -0
- package/src/mcp/handlers/request-handler.js +104 -0
- package/src/mcp/handlers/workflow-tool-handler.js +636 -0
- package/src/mcp/server.js +68 -0
- package/src/mcp/tools/index.js +701 -0
- package/src/middleware/auth.js +371 -0
- package/src/middleware/security.js +267 -0
- package/src/port-discovery.js +258 -0
- package/src/routes/admin.js +182 -0
- package/src/services/browser-daemon.js +494 -0
- package/src/services/chrome-service.js +375 -0
- package/src/services/failover-manager.js +412 -0
- package/src/services/git-safety-service.js +675 -0
- package/src/services/heartbeat-manager.js +200 -0
- package/src/services/http-client.js +195 -0
- package/src/services/process-manager.js +318 -0
- package/src/services/process-tracker.js +574 -0
- package/src/services/profile-manager.js +449 -0
- package/src/services/project-manager.js +415 -0
- package/src/services/session-manager.js +497 -0
- package/src/services/session-registry.js +491 -0
- package/src/services/unified-session-manager.js +678 -0
- package/src/shared-storage-old.js +267 -0
- package/src/standalone-server.js +53 -0
- package/src/utils/extension-path.js +145 -0
- package/src/utils.js +187 -0
- package/src/validation/log-transformer.js +125 -0
- 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
|
+
}
|