@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
@@ -0,0 +1,280 @@
1
+ #!/usr/bin/env node
2
+ // Configuration management CLI for Chrome Debug
3
+ import { configLoader } from '../src/config-loader.js';
4
+ import { generateExtensionConfig } from './generate-extension-config.js';
5
+
6
+ const args = process.argv.slice(2);
7
+ const command = args[0];
8
+
9
+ function showHelp() {
10
+ console.log(`
11
+ Chrome Debug Configuration Manager
12
+
13
+ Usage:
14
+ node scripts/config-manager.js <command> [options]
15
+
16
+ Commands:
17
+ show - Display current configuration
18
+ list-ports - Show current port configuration
19
+ set-http-ports <ports> - Set HTTP server ports (comma-separated)
20
+ set-mcp-ports <ports> - Set MCP server ports (comma-separated)
21
+ set-scan-order <order> - Set extension port scan order (httpFirst|mcpFirst|sequential)
22
+ set-timeout <ms> - Set server discovery timeout in milliseconds
23
+ set-range <start> <end> - Set port discovery range
24
+ reset - Reset to default configuration
25
+ help - Show this help message
26
+
27
+ Examples:
28
+ node scripts/config-manager.js list-ports
29
+ node scripts/config-manager.js set-http-ports 3001,3000,3002
30
+ node scripts/config-manager.js set-scan-order httpFirst
31
+ node scripts/config-manager.js set-timeout 5000
32
+ node scripts/config-manager.js set-range 3000 3030
33
+ `);
34
+ }
35
+
36
+ function showConfig() {
37
+ const config = configLoader.loadConfig();
38
+ console.log('\nšŸ“‹ Current Configuration:');
39
+ console.log(JSON.stringify(config, null, 2));
40
+ }
41
+
42
+ function listPorts() {
43
+ console.log('\nšŸ”Œ Current Port Configuration:');
44
+ console.log('HTTP Server Ports:', configLoader.getHttpServerPorts());
45
+ console.log('MCP Server Ports:', configLoader.getMcpServerPorts());
46
+ console.log('Extension Port List:', configLoader.getExtensionPortList());
47
+ console.log('Discovery Timeout:', configLoader.getDiscoveryTimeout() + 'ms');
48
+ }
49
+
50
+ function setHttpPorts(portsString) {
51
+ try {
52
+ const ports = portsString.split(',').map(p => parseInt(p.trim(), 10));
53
+ const invalidPorts = ports.filter(p => isNaN(p) || p < 1 || p > 65535);
54
+
55
+ if (invalidPorts.length > 0) {
56
+ console.error('āŒ Invalid ports:', invalidPorts);
57
+ return false;
58
+ }
59
+
60
+ const success = configLoader.updateConfig({
61
+ serverPorts: {
62
+ ...configLoader.loadConfig().serverPorts,
63
+ httpServer: {
64
+ ...configLoader.loadConfig().serverPorts.httpServer,
65
+ preferredPorts: ports
66
+ }
67
+ }
68
+ });
69
+
70
+ if (success) {
71
+ console.log('āœ… HTTP server ports updated:', ports);
72
+ generateExtensionConfig();
73
+ return true;
74
+ }
75
+ } catch (error) {
76
+ console.error('āŒ Error setting HTTP ports:', error.message);
77
+ return false;
78
+ }
79
+ }
80
+
81
+ function setMcpPorts(portsString) {
82
+ try {
83
+ const ports = portsString.split(',').map(p => parseInt(p.trim(), 10));
84
+ const invalidPorts = ports.filter(p => isNaN(p) || p < 1 || p > 65535);
85
+
86
+ if (invalidPorts.length > 0) {
87
+ console.error('āŒ Invalid ports:', invalidPorts);
88
+ return false;
89
+ }
90
+
91
+ const success = configLoader.updateConfig({
92
+ serverPorts: {
93
+ ...configLoader.loadConfig().serverPorts,
94
+ mcpServer: {
95
+ ...configLoader.loadConfig().serverPorts.mcpServer,
96
+ preferredPorts: ports
97
+ }
98
+ }
99
+ });
100
+
101
+ if (success) {
102
+ console.log('āœ… MCP server ports updated:', ports);
103
+ generateExtensionConfig();
104
+ return true;
105
+ }
106
+ } catch (error) {
107
+ console.error('āŒ Error setting MCP ports:', error.message);
108
+ return false;
109
+ }
110
+ }
111
+
112
+ function setScanOrder(order) {
113
+ const validOrders = ['httpFirst', 'mcpFirst', 'sequential'];
114
+
115
+ if (!validOrders.includes(order)) {
116
+ console.error('āŒ Invalid scan order. Must be one of:', validOrders.join(', '));
117
+ return false;
118
+ }
119
+
120
+ try {
121
+ const success = configLoader.updateConfig({
122
+ chromeExtension: {
123
+ ...configLoader.loadConfig().chromeExtension,
124
+ portScanOrder: order
125
+ }
126
+ });
127
+
128
+ if (success) {
129
+ console.log('āœ… Port scan order updated:', order);
130
+ generateExtensionConfig();
131
+ return true;
132
+ }
133
+ } catch (error) {
134
+ console.error('āŒ Error setting scan order:', error.message);
135
+ return false;
136
+ }
137
+ }
138
+
139
+ function setTimeout(timeoutMs) {
140
+ const timeout = parseInt(timeoutMs, 10);
141
+
142
+ if (isNaN(timeout) || timeout < 100 || timeout > 30000) {
143
+ console.error('āŒ Invalid timeout. Must be between 100ms and 30000ms');
144
+ return false;
145
+ }
146
+
147
+ try {
148
+ const success = configLoader.updateConfig({
149
+ chromeExtension: {
150
+ ...configLoader.loadConfig().chromeExtension,
151
+ serverDiscovery: {
152
+ ...configLoader.loadConfig().chromeExtension.serverDiscovery,
153
+ timeoutMs: timeout
154
+ }
155
+ }
156
+ });
157
+
158
+ if (success) {
159
+ console.log('āœ… Discovery timeout updated:', timeout + 'ms');
160
+ generateExtensionConfig();
161
+ return true;
162
+ }
163
+ } catch (error) {
164
+ console.error('āŒ Error setting timeout:', error.message);
165
+ return false;
166
+ }
167
+ }
168
+
169
+ function setRange(start, end) {
170
+ const startPort = parseInt(start, 10);
171
+ const endPort = parseInt(end, 10);
172
+
173
+ if (isNaN(startPort) || isNaN(endPort) || startPort < 1 || endPort > 65535 || startPort >= endPort) {
174
+ console.error('āŒ Invalid port range. Start must be < end, both between 1-65535');
175
+ return false;
176
+ }
177
+
178
+ try {
179
+ const success = configLoader.updateConfig({
180
+ serverPorts: {
181
+ ...configLoader.loadConfig().serverPorts,
182
+ discoveryRange: {
183
+ ...configLoader.loadConfig().serverPorts.discoveryRange,
184
+ start: startPort,
185
+ end: endPort
186
+ }
187
+ }
188
+ });
189
+
190
+ if (success) {
191
+ console.log(`āœ… Discovery range updated: ${startPort}-${endPort}`);
192
+ generateExtensionConfig();
193
+ return true;
194
+ }
195
+ } catch (error) {
196
+ console.error('āŒ Error setting range:', error.message);
197
+ return false;
198
+ }
199
+ }
200
+
201
+ function resetConfig() {
202
+ try {
203
+ const success = configLoader.updateConfig(configLoader.DEFAULT_CONFIG);
204
+
205
+ if (success) {
206
+ console.log('āœ… Configuration reset to defaults');
207
+ generateExtensionConfig();
208
+ return true;
209
+ }
210
+ } catch (error) {
211
+ console.error('āŒ Error resetting configuration:', error.message);
212
+ return false;
213
+ }
214
+ }
215
+
216
+ // Main command handler
217
+ switch (command) {
218
+ case 'show':
219
+ showConfig();
220
+ break;
221
+
222
+ case 'list-ports':
223
+ listPorts();
224
+ break;
225
+
226
+ case 'set-http-ports':
227
+ if (!args[1]) {
228
+ console.error('āŒ Please provide ports (comma-separated)');
229
+ process.exit(1);
230
+ }
231
+ setHttpPorts(args[1]);
232
+ break;
233
+
234
+ case 'set-mcp-ports':
235
+ if (!args[1]) {
236
+ console.error('āŒ Please provide ports (comma-separated)');
237
+ process.exit(1);
238
+ }
239
+ setMcpPorts(args[1]);
240
+ break;
241
+
242
+ case 'set-scan-order':
243
+ if (!args[1]) {
244
+ console.error('āŒ Please provide scan order (httpFirst|mcpFirst|sequential)');
245
+ process.exit(1);
246
+ }
247
+ setScanOrder(args[1]);
248
+ break;
249
+
250
+ case 'set-timeout':
251
+ if (!args[1]) {
252
+ console.error('āŒ Please provide timeout in milliseconds');
253
+ process.exit(1);
254
+ }
255
+ setTimeout(args[1]);
256
+ break;
257
+
258
+ case 'set-range':
259
+ if (!args[1] || !args[2]) {
260
+ console.error('āŒ Please provide start and end ports');
261
+ process.exit(1);
262
+ }
263
+ setRange(args[1], args[2]);
264
+ break;
265
+
266
+ case 'reset':
267
+ resetConfig();
268
+ break;
269
+
270
+ case 'help':
271
+ case '--help':
272
+ case '-h':
273
+ showHelp();
274
+ break;
275
+
276
+ default:
277
+ console.error('āŒ Unknown command:', command);
278
+ showHelp();
279
+ process.exit(1);
280
+ }
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ // Script to generate Chrome extension configuration from main config file
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ import { configLoader } from '../src/config-loader.js';
7
+
8
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
+ const EXTENSION_CONFIG_PATH = path.join(__dirname, '../chrome-extension/extension-config.js');
10
+
11
+ function generateExtensionConfig() {
12
+ try {
13
+ const ports = configLoader.getExtensionPortList();
14
+ const timeout = configLoader.getDiscoveryTimeout();
15
+
16
+ const configContent = `// Auto-generated configuration from Chrome Debug config
17
+ // DO NOT EDIT MANUALLY - Run 'npm run update-extension-config' to regenerate
18
+
19
+ const CHROMEDEBUG_CONFIG = {
20
+ ports: ${JSON.stringify(ports, null, 2)},
21
+ discoveryTimeout: ${timeout},
22
+ lastGenerated: '${new Date().toISOString()}'
23
+ };
24
+
25
+ // Export for use in extension scripts
26
+ if (typeof module !== 'undefined' && module.exports) {
27
+ module.exports = CHROMEDEBUG_CONFIG;
28
+ }
29
+
30
+ // For browser environments
31
+ if (typeof window !== 'undefined') {
32
+ window.CHROMEDEBUG_CONFIG = CHROMEDEBUG_CONFIG;
33
+ }
34
+ `;
35
+
36
+ fs.writeFileSync(EXTENSION_CONFIG_PATH, configContent);
37
+ console.log(`āœ… Extension configuration generated at: ${EXTENSION_CONFIG_PATH}`);
38
+ console.log(`šŸ“Š Port list (${ports.length} ports):`, ports);
39
+ console.log(`ā±ļø Discovery timeout: ${timeout}ms`);
40
+
41
+ return true;
42
+ } catch (error) {
43
+ console.error('āŒ Error generating extension configuration:', error.message);
44
+ return false;
45
+ }
46
+ }
47
+
48
+ // Run if called directly
49
+ if (import.meta.url === `file://${process.argv[1]}`) {
50
+ generateExtensionConfig();
51
+ }
52
+
53
+ export { generateExtensionConfig };
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { generateApiKey, listApiKeys, ROLES } from '../src/middleware/auth.js';
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ import { fileURLToPath } from 'url';
7
+
8
+ const __filename = fileURLToPath(import.meta.url);
9
+ const __dirname = path.dirname(__filename);
10
+
11
+ console.log('=== Chrome Debug Security Setup ===\n');
12
+
13
+ // Check if any API keys exist
14
+ const existingKeys = listApiKeys();
15
+ const adminKeys = existingKeys.filter(key => key.role === ROLES.ADMIN && key.active);
16
+
17
+ if (adminKeys.length === 0) {
18
+ console.log('No active admin API keys found. Creating default admin key...\n');
19
+
20
+ const adminKey = generateApiKey('Setup Admin', ROLES.ADMIN);
21
+
22
+ console.log('āœ… Admin API key created successfully!');
23
+ console.log(`\nAPI Key: ${adminKey.apiKey}`);
24
+ console.log('\nāš ļø IMPORTANT: Save this key securely! You won\'t see it again.\n');
25
+
26
+ // Save to a temporary file for reference
27
+ const keyFile = path.join(__dirname, '../.admin-key.txt');
28
+ fs.writeFileSync(keyFile, `Admin API Key: ${adminKey.apiKey}\nCreated: ${new Date().toISOString()}\n`);
29
+ console.log(`Key also saved to: ${keyFile}`);
30
+ console.log('Delete this file after copying the key to a secure location.\n');
31
+ } else {
32
+ console.log(`Found ${adminKeys.length} active admin key(s):\n`);
33
+ adminKeys.forEach(key => {
34
+ console.log(`- ${key.name} (created: ${key.createdAt})`);
35
+ });
36
+ console.log('\nNo new admin key created.\n');
37
+ }
38
+
39
+ console.log('Current API Keys:');
40
+ console.log('================');
41
+ const allKeys = listApiKeys();
42
+ if (allKeys.length === 0) {
43
+ console.log('No API keys found.');
44
+ } else {
45
+ allKeys.forEach(key => {
46
+ const status = key.active ? 'āœ… Active' : 'āŒ Revoked';
47
+ const lastUsed = key.lastUsed ? new Date(key.lastUsed).toLocaleString() : 'Never';
48
+ console.log(`${key.name} (${key.role}) - ${status} - Last used: ${lastUsed}`);
49
+ });
50
+ }
51
+
52
+ console.log('\nNext Steps:');
53
+ console.log('===========');
54
+ console.log('1. Copy your admin API key to a secure location');
55
+ console.log('2. Set up environment variables (see .env.example)');
56
+ console.log('3. Create additional API keys for your applications:');
57
+ console.log(' curl -X POST http://localhost:3000/chrome-pilot/admin/api-keys \\');
58
+ console.log(' -H "X-API-Key: YOUR_ADMIN_KEY" \\');
59
+ console.log(' -H "Content-Type: application/json" \\');
60
+ console.log(' -d \'{"name": "My App", "role": "user"}\'');
61
+ console.log('4. Test authentication:');
62
+ console.log(' curl -H "X-API-Key: YOUR_KEY" http://localhost:3000/chrome-pilot/auth-test');
63
+ console.log('\nSee SECURITY.md for complete security documentation.');
64
+ console.log('\n=== Setup Complete ===');