@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,532 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <style>
6
+ body {
7
+ width: 300px;
8
+ padding: 20px;
9
+ font-family: Arial, sans-serif;
10
+ }
11
+
12
+ a {
13
+ color: #2196F3;
14
+ text-decoration: none;
15
+ transition: color 0.2s;
16
+ }
17
+
18
+ a:hover {
19
+ color: #1976D2;
20
+ text-decoration: underline;
21
+ }
22
+
23
+ h2 {
24
+ margin: 0 0 20px 0;
25
+ font-size: 18px;
26
+ color: #333;
27
+ }
28
+
29
+ .status {
30
+ background: #f0f0f0;
31
+ padding: 10px;
32
+ border-radius: 4px;
33
+ margin-bottom: 15px;
34
+ font-size: 14px;
35
+ }
36
+
37
+ .instructions {
38
+ font-size: 14px;
39
+ line-height: 1.6;
40
+ color: #666;
41
+ }
42
+
43
+ .instructions li {
44
+ margin-bottom: 8px;
45
+ }
46
+
47
+
48
+ .server-status {
49
+ display: inline-block;
50
+ width: 10px;
51
+ height: 10px;
52
+ border-radius: 50%;
53
+ margin-right: 5px;
54
+ }
55
+
56
+ .server-status.connected {
57
+ background: #4CAF50;
58
+ }
59
+
60
+ .server-status.disconnected {
61
+ background: #f44336;
62
+ }
63
+
64
+ .recording-section {
65
+ margin-top: 20px;
66
+ padding-top: 20px;
67
+ border-top: 1px solid #e0e0e0;
68
+ }
69
+
70
+ .record-btn {
71
+ width: 100%;
72
+ padding: 10px;
73
+ background: #f44336;
74
+ color: white;
75
+ border: none;
76
+ border-radius: 4px;
77
+ cursor: pointer;
78
+ font-size: 14px;
79
+ font-weight: 500;
80
+ margin-top: 10px;
81
+ }
82
+
83
+ .record-btn:hover {
84
+ background: #d32f2f;
85
+ }
86
+
87
+ .record-btn.recording {
88
+ background: #ff5252;
89
+ animation: pulse 1.5s infinite;
90
+ }
91
+
92
+ .record-btn:disabled {
93
+ background: #ccc;
94
+ cursor: not-allowed;
95
+ }
96
+
97
+ #manualSnapshotBtn:hover {
98
+ background: #45a049 !important;
99
+ }
100
+
101
+ @keyframes pulse {
102
+ 0% { opacity: 1; }
103
+ 50% { opacity: 0.7; }
104
+ 100% { opacity: 1; }
105
+ }
106
+
107
+ @keyframes countdown {
108
+ 0% { transform: scale(1); }
109
+ 50% { transform: scale(1.1); }
110
+ 100% { transform: scale(1); }
111
+ }
112
+
113
+ .countdown-timer {
114
+ animation: countdown 1s ease-in-out;
115
+ }
116
+
117
+ .recording-status {
118
+ font-size: 13px;
119
+ color: #666;
120
+ margin-top: 5px;
121
+ text-align: center;
122
+ }
123
+
124
+ .recording-timer {
125
+ font-family: monospace;
126
+ color: #f44336;
127
+ font-weight: bold;
128
+ }
129
+ </style>
130
+ </head>
131
+ <body>
132
+ <div style="position: absolute; top: 5px; right: 5px; font-size: 10px; color: #999; font-family: monospace;">v2.0.8</div>
133
+ <h2>Chrome Debug Assistant</h2>
134
+
135
+ <!-- License Section -->
136
+ <div id="license-section" style="padding: 10px; border-bottom: 1px solid #ccc; background: #f9f9f9; border-radius: 4px; margin-bottom: 15px;">
137
+ <h3 style="margin: 0 0 10px 0; font-size: 14px; color: #333;">License Status</h3>
138
+
139
+ <!-- Free Tier Display -->
140
+ <div id="free-tier-status" style="display: none;">
141
+ <p style="font-size: 13px; margin: 5px 0; color: #666;">
142
+ Free Plan: <span id="usage-count" style="font-weight: bold;">0</span>/<span id="usage-limit" style="font-weight: bold;">5</span> recordings today
143
+ </p>
144
+ <button id="upgrade-btn" style="background: #ff6b6b; color: white; padding: 8px 16px; border: none; border-radius: 4px; cursor: pointer; font-size: 13px; font-weight: 500; width: 100%; margin-top: 5px;">
145
+ Upgrade to Pro - $7.99/month
146
+ </button>
147
+ </div>
148
+
149
+ <!-- Pro Tier Display -->
150
+ <div id="pro-tier-status" style="display: none;">
151
+ <p style="font-size: 13px; margin: 5px 0; color: #4caf50; font-weight: 500;">
152
+ Pro License Active - Unlimited recordings
153
+ </p>
154
+ </div>
155
+
156
+ <!-- License Activation -->
157
+ <div id="license-activation" style="margin-top: 10px;">
158
+ <input type="text" id="license-key-input" placeholder="Enter license key"
159
+ style="width: 100%; padding: 6px; font-size: 13px; border: 1px solid #ddd; border-radius: 4px; margin-bottom: 5px; box-sizing: border-box;">
160
+ <button id="activate-license-btn" style="padding: 6px 12px; background: #2196F3; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 13px; width: 100%;">
161
+ Activate License
162
+ </button>
163
+ </div>
164
+
165
+ <div id="license-message" style="margin-top: 5px; font-size: 12px; text-align: center;"></div>
166
+ </div>
167
+
168
+ <div class="status">
169
+ <span class="server-status disconnected" id="serverStatus"></span>
170
+ <span id="statusText">Checking server...</span>
171
+ </div>
172
+
173
+ <div class="instructions">
174
+ <strong>Chrome Debug Assistant:</strong>
175
+ <p>Use the recording features below to capture screen recordings, workflow recordings, or debug data for your applications.</p>
176
+ </div>
177
+
178
+ <div class="site-restriction-section" style="margin-top: 15px; padding: 10px; background: #f9f9f9; border-radius: 4px; border: 1px solid #e0e0e0;">
179
+ <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;">
180
+ <strong style="font-size: 14px; color: #333;">Current Site Status:</strong>
181
+ <a href="/options.html" target="_blank" style="font-size: 12px;">Settings</a>
182
+ </div>
183
+ <div id="siteStatus" style="font-size: 13px; margin-bottom: 8px;">
184
+ <span id="siteStatusIcon">⏳</span> <span id="siteStatusText">Checking...</span>
185
+ </div>
186
+ <div style="display: flex; gap: 5px;">
187
+ <button id="toggleSiteBtn" class="site-toggle-btn" style="flex: 1; padding: 5px 8px; font-size: 12px; border: 1px solid #ddd; border-radius: 3px; background: #fff; cursor: pointer;" disabled>
188
+ Loading...
189
+ </button>
190
+ <button id="addSiteBtn" class="site-toggle-btn" style="flex: 1; padding: 5px 8px; font-size: 12px; border: 1px solid #ddd; border-radius: 3px; background: #fff; cursor: pointer;" disabled>
191
+ Add Site
192
+ </button>
193
+ </div>
194
+ </div>
195
+
196
+ <div class="enhanced-capture-section" style="margin-top: 15px; padding: 10px; background: #f9f9f9; border-radius: 4px; border: 1px solid #e0e0e0;">
197
+ <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;">
198
+ <strong style="font-size: 14px; color: #333;">Enhanced Click Capture:</strong>
199
+ <span class="info-icon" title="Captures detailed element information (HTML, handlers, state) when recording clicks. May impact performance.">ℹ️</span>
200
+ </div>
201
+ <label style="font-size: 13px; display: flex; align-items: center; cursor: pointer;">
202
+ <input type="checkbox" id="enhancedCaptureCheckbox" style="margin-right: 8px;">
203
+ Enable detailed click data capture
204
+ </label>
205
+ <div style="font-size: 11px; color: #666; margin-top: 5px;">
206
+ When enabled, captures element HTML, event handlers, component info, and performance metrics
207
+ </div>
208
+ </div>
209
+
210
+ <div class="recording-section" style="margin-top: 20px; padding-top: 20px; border-top: 1px solid #e0e0e0;">
211
+ <div style="display: flex; justify-content: space-between; align-items: center; margin: 0 0 10px 0;">
212
+ <h3 style="margin: 0; font-size: 16px;">Workflow Recording</h3>
213
+ <a href="#" id="viewWorkflowRecordings" style="font-size: 12px; color: #2196F3; text-decoration: none;">View Past Recordings</a>
214
+ </div>
215
+ <p style="font-size: 13px; color: #666; margin: 0 0 10px 0;">
216
+ Record user interactions to create replayable workflows
217
+ </p>
218
+
219
+ <!-- Session Name Input - DISABLED FOR v2.0 RELEASE -->
220
+ <!--
221
+ <div style="margin-bottom: 10px;">
222
+ <label style="font-size: 13px; display: block; margin-bottom: 5px;">Session Name (optional):</label>
223
+ <input type="text" id="sessionNameInput" placeholder="Enter a name for this workflow" style="width: 100%; padding: 5px; font-size: 13px; border: 1px solid #ddd; border-radius: 4px;">
224
+ </div>
225
+ -->
226
+
227
+ <!-- Screenshot Settings -->
228
+ <div style="margin-bottom: 10px; border: 1px solid #e0e0e0; padding: 10px; border-radius: 4px;">
229
+ <label style="font-size: 13px; display: flex; align-items: center; cursor: pointer; margin-bottom: 8px;">
230
+ <input type="checkbox" id="enableScreenshotsCheckbox" checked style="margin-right: 8px;">
231
+ Capture screenshots for each action
232
+ </label>
233
+
234
+ <div id="screenshotSettings" style="display: none; margin-left: 20px;">
235
+ <div style="margin-bottom: 5px;">
236
+ <label style="font-size: 12px;">Format: </label>
237
+ <select id="screenshotFormat" style="font-size: 12px; padding: 2px;">
238
+ <option value="jpeg">JPEG</option>
239
+ <option value="png">PNG</option>
240
+ </select>
241
+ </div>
242
+ <div style="margin-bottom: 5px;">
243
+ <label style="font-size: 12px;">Quality: </label>
244
+ <input type="range" id="screenshotQuality" min="10" max="100" value="30" style="width: 100px;">
245
+ <span id="qualityValue" style="font-size: 12px;">30</span>
246
+ </div>
247
+ <div>
248
+ <label style="font-size: 12px;">Max Width: </label>
249
+ <input type="number" id="screenshotMaxWidth" placeholder="e.g. 800" style="width: 80px; font-size: 12px; padding: 2px;">
250
+ </div>
251
+ </div>
252
+ </div>
253
+
254
+ <div style="margin-bottom: 10px;">
255
+ <label style="font-size: 13px; display: flex; align-items: center; cursor: pointer;">
256
+ <input type="checkbox" id="includeLogsCheckbox" style="margin-right: 8px;">
257
+ Include console logs and errors in export
258
+ </label>
259
+ </div>
260
+ <button class="record-btn" id="workflowRecordBtn" style="background: #9c27b0; position: relative;">
261
+ Start Workflow Recording
262
+ <span id="workflowProBadge" style="position: absolute; top: -8px; right: -8px; background: #ff6b6b; color: white; font-size: 9px; padding: 2px 6px; border-radius: 10px; font-weight: bold; display: none;">PRO</span>
263
+ </button>
264
+ <button class="record-btn" id="saveRestorePointBtn" style="background: #2196F3; display: none; margin-top: 5px;">📍 Save Restore Point</button>
265
+ <div class="recording-status" id="workflowRecordingStatus"></div>
266
+
267
+ <div class="recordings-list" id="workflowRecordingsList" style="margin-top: 15px; display: none;">
268
+ <h4 style="margin: 0 0 10px 0; font-size: 14px;">Saved Workflow Recordings:</h4>
269
+ <div id="workflowRecordingsContainer" style="max-height: 300px; overflow-y: auto; border: 1px solid #e0e0e0; border-radius: 4px; padding: 10px;"></div>
270
+ </div>
271
+
272
+ <div class="restore-points-list" id="restorePointsList" style="margin-top: 15px; display: none;">
273
+ <h4 style="margin: 0 0 10px 0; font-size: 14px;">Restore Points:</h4>
274
+ <div id="restorePointsContainer"></div>
275
+ </div>
276
+ </div>
277
+
278
+ <div class="recording-section" style="margin-top: 20px; padding-top: 20px; border-top: 1px solid #e0e0e0;">
279
+ <div style="display: flex; justify-content: space-between; align-items: center; margin: 0 0 10px 0;">
280
+ <h3 style="margin: 0; font-size: 16px;">Screen Recording</h3>
281
+ <a href="#" id="viewScreenRecordings" style="font-size: 12px; color: #2196F3; text-decoration: none;">View Past Recordings</a>
282
+ </div>
283
+ <p style="font-size: 13px; color: #666; margin: 0 0 10px 0;">
284
+ Record your screen with console logs to help explain issues
285
+ </p>
286
+
287
+ <!-- Session Name Input - DISABLED FOR v2.0 RELEASE -->
288
+ <!--
289
+ <div style="margin-bottom: 10px;">
290
+ <label style="font-size: 13px; display: block; margin-bottom: 5px;">Session Name (optional):</label>
291
+ <input type="text" id="screenRecordingSessionNameInput" placeholder="Enter a name for this recording" style="width: 100%; padding: 5px; font-size: 13px; border: 1px solid #ddd; border-radius: 4px;">
292
+ </div>
293
+ -->
294
+
295
+ <!-- Recording Settings -->
296
+ <div class="recording-settings" style="background: #f9f9f9; padding: 10px; border-radius: 4px; margin-bottom: 10px;">
297
+ <details>
298
+ <summary style="cursor: pointer; font-size: 12px; font-weight: bold; color: #333;">Recording Settings</summary>
299
+ <div style="margin-top: 8px;">
300
+ <div style="margin-bottom: 8px;">
301
+ <label for="frameRate" style="font-size: 11px; color: #666; display: block;">Frame Rate (seconds between frames):</label>
302
+ <select id="frameRate" style="width: 100%; padding: 4px; font-size: 11px;">
303
+ <option value="0.5">0.5s (2 fps)</option>
304
+ <option value="1" selected>1s (1 fps)</option>
305
+ <option value="2">2s (0.5 fps)</option>
306
+ <option value="3">3s (0.33 fps)</option>
307
+ <option value="5">5s (0.2 fps)</option>
308
+ </select>
309
+ </div>
310
+ <div style="margin-bottom: 8px;">
311
+ <label for="imageQuality" style="font-size: 11px; color: #666; display: block;">Image Quality (%):</label>
312
+ <select id="imageQuality" style="width: 100%; padding: 4px; font-size: 11px;">
313
+ <option value="10">10% (ultra small)</option>
314
+ <option value="20">20% (very small)</option>
315
+ <option value="30" selected>30% (balanced)</option>
316
+ <option value="50">50% (good)</option>
317
+ <option value="70">70% (high)</option>
318
+ </select>
319
+ </div>
320
+ <div style="margin-bottom: 8px;">
321
+ <label style="font-size: 11px; color: #666; display: block;">
322
+ <input type="checkbox" id="frameFlash"> Flash indicator when capturing frames
323
+ </label>
324
+ </div>
325
+ </div>
326
+ </details>
327
+ </div>
328
+
329
+ <button class="record-btn" id="recordBtn">Start Recording</button>
330
+ <button class="record-btn" id="manualSnapshotBtn" style="background: #4CAF50; display: none; margin-top: 5px;">Take Manual Snapshot</button>
331
+ <div class="recording-status" id="recordingStatus"></div>
332
+ <div class="countdown-display" id="countdownDisplay" style="display: none; text-align: center; margin-top: 10px; padding: 10px; background: #f0f0f0; border-radius: 4px;">
333
+ <div style="font-size: 12px; color: #666; margin-bottom: 5px;">Next snapshot in:</div>
334
+ <div class="countdown-timer" style="font-size: 24px; font-weight: bold; color: #f44336; font-family: monospace;" id="countdownTimer">0</div>
335
+ </div>
336
+
337
+ <div class="recordings-list" id="recordingsList" style="margin-top: 15px; display: none;">
338
+ <h4 style="margin: 0 0 10px 0; font-size: 14px;">Saved Recordings:</h4>
339
+ <div id="recordingsContainer" style="max-height: 300px; overflow-y: auto; border: 1px solid #e0e0e0; border-radius: 4px; padding: 10px;"></div>
340
+ </div>
341
+
342
+ <!--
343
+ SNAPSHOT FEATURE DISABLED (2025-10-01)
344
+
345
+ WHY DISABLED:
346
+ - Snapshots without console logs are just screenshots (users can do this natively)
347
+ - Console log capture requires always-on monitoring (privacy concern)
348
+ - Core value proposition (screenshot + searchable logs) cannot be achieved cleanly
349
+
350
+ TO RE-ENABLE:
351
+ - Solve console log persistence challenge (always-on monitoring with privacy controls)
352
+ - Implement proper log buffering system with user consent
353
+ - Add user controls for log retention and privacy
354
+ - Uncomment this section and related JavaScript functions in popup.js
355
+
356
+ RECOMMENDED ALTERNATIVE: Use screen recordings (captures screenshots + logs properly)
357
+
358
+ See: SNAPSHOT_FEATURE_DISABLED.md for full explanation
359
+ -->
360
+ <!-- Snapshot Section DISABLED
361
+ <div style="margin-top: 15px; padding-top: 15px; border-top: 1px solid #e0e0e0;">
362
+ <p style="font-size: 13px; color: #666; margin: 0 0 10px 0;">
363
+ Capture a single screenshot with console logs for quick debugging
364
+ </p>
365
+
366
+ <div style="margin-bottom: 10px;">
367
+ <label style="font-size: 13px; display: block; margin-bottom: 5px;">Note (optional):</label>
368
+ <input type="text" id="snapshotNoteInput" placeholder="Add a note to describe this snapshot" style="width: 100%; padding: 5px; font-size: 13px; border: 1px solid #ddd; border-radius: 4px;">
369
+ </div>
370
+
371
+ <button class="record-btn" id="takeSnapshotBtn" style="background: #FF9800;">📸 Take Snapshot</button>
372
+
373
+ <div style="margin-top: 10px;">
374
+ <a href="#" id="viewSnapshotsLink" style="font-size: 12px; color: #2196F3; text-decoration: none;">View Past Snapshots</a>
375
+ </div>
376
+
377
+ <div class="snapshots-list" id="snapshotsList" style="margin-top: 10px; display: none;">
378
+ <h4 style="margin: 0 0 10px 0; font-size: 14px;">Saved Snapshots:</h4>
379
+ <div id="snapshotsContainer" style="max-height: 300px; overflow-y: auto; border: 1px solid #e0e0e0; border-radius: 4px; padding: 10px;"></div>
380
+ </div>
381
+ </div>
382
+ -->
383
+ </div>
384
+
385
+ <style>
386
+ .recording-item {
387
+ background: #f5f5f5;
388
+ padding: 8px;
389
+ margin-bottom: 8px;
390
+ border-radius: 4px;
391
+ font-size: 12px;
392
+ display: flex;
393
+ flex-direction: column;
394
+ gap: 8px;
395
+ }
396
+
397
+ .recording-info {
398
+ flex: 1;
399
+ }
400
+
401
+ .recording-id {
402
+ font-family: monospace;
403
+ background: #fff;
404
+ padding: 4px 8px;
405
+ border-radius: 3px;
406
+ border: 1px solid #ddd;
407
+ overflow: hidden;
408
+ text-overflow: ellipsis;
409
+ white-space: nowrap;
410
+ }
411
+
412
+ .recording-id-text {
413
+ font-size: 11px;
414
+ }
415
+
416
+ .recording-buttons {
417
+ display: flex;
418
+ gap: 4px;
419
+ flex-wrap: wrap;
420
+ }
421
+
422
+ .copy-id-btn, .copy-prompt-btn, .view-btn, .edit-btn, .delete-btn {
423
+ padding: 4px 8px;
424
+ background: #fff;
425
+ border: 1px solid #ddd;
426
+ border-radius: 3px;
427
+ cursor: pointer;
428
+ font-size: 10px;
429
+ transition: all 0.2s;
430
+ flex: 1;
431
+ min-width: 0;
432
+ }
433
+
434
+ .copy-id-btn:hover {
435
+ background: #e3f2fd;
436
+ border-color: #2196F3;
437
+ }
438
+
439
+ .copy-prompt-btn:hover {
440
+ background: #f3e5f5;
441
+ border-color: #9c27b0;
442
+ }
443
+
444
+ .view-btn:hover {
445
+ background: #fce4ec;
446
+ border-color: #e91e63;
447
+ }
448
+
449
+ .edit-btn:hover {
450
+ background: #e8f5e9;
451
+ border-color: #4caf50;
452
+ }
453
+
454
+ .delete-btn {
455
+ background: #f44336;
456
+ color: white;
457
+ border: none;
458
+ }
459
+
460
+ .delete-btn:hover {
461
+ background: #d32f2f;
462
+ }
463
+
464
+ .restore-point-item {
465
+ background: #e3f2fd;
466
+ padding: 8px;
467
+ margin-bottom: 8px;
468
+ border-radius: 4px;
469
+ font-size: 12px;
470
+ border: 1px solid #90caf9;
471
+ }
472
+
473
+ .restore-point-info {
474
+ margin-bottom: 8px;
475
+ }
476
+
477
+ .restore-btn {
478
+ padding: 4px 8px;
479
+ background: #2196F3;
480
+ color: white;
481
+ border: none;
482
+ border-radius: 3px;
483
+ cursor: pointer;
484
+ font-size: 10px;
485
+ margin-right: 4px;
486
+ }
487
+
488
+ .restore-btn:hover {
489
+ background: #1976d2;
490
+ }
491
+
492
+ .info-icon {
493
+ display: inline-block;
494
+ margin-left: 4px;
495
+ color: #2196F3;
496
+ font-size: 11px;
497
+ cursor: help;
498
+ vertical-align: middle;
499
+ font-weight: bold;
500
+ }
501
+
502
+ .info-icon:hover {
503
+ color: #1976D2;
504
+ }
505
+
506
+ .site-toggle-btn:hover:not(:disabled) {
507
+ background: #f5f5f5;
508
+ border-color: #2196F3;
509
+ }
510
+
511
+ .site-toggle-btn:disabled {
512
+ opacity: 0.6;
513
+ cursor: not-allowed;
514
+ }
515
+
516
+ .site-toggle-btn.allow {
517
+ background: #e8f5e9 !important;
518
+ border-color: #4caf50 !important;
519
+ color: #2e7d32;
520
+ }
521
+
522
+ .site-toggle-btn.block {
523
+ background: #ffebee !important;
524
+ border-color: #f44336 !important;
525
+ color: #c62828;
526
+ }
527
+ </style>
528
+
529
+ <script src="extension-config.js"></script>
530
+ <script type="module" src="popup.js"></script>
531
+ </body>
532
+ </html>