@dynamicu/chromedebug-mcp 2.5.6 → 2.5.8

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.
@@ -918,10 +918,96 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
918
918
  }
919
919
  });
920
920
 
921
+ // Auto-activate PRO license on startup if activation file exists
922
+ async function checkAndActivateLicense() {
923
+ try {
924
+ console.log('[License Auto-Activation] Checking for activation file...');
925
+
926
+ // Try to fetch the activation file from the extension directory
927
+ const activationUrl = chrome.runtime.getURL('license-activation.json');
928
+ const response = await fetch(activationUrl);
929
+
930
+ if (!response.ok) {
931
+ console.log('[License Auto-Activation] No activation file found - using normal license flow');
932
+ return;
933
+ }
934
+
935
+ const activationData = await response.json();
936
+ console.log('[License Auto-Activation] Found activation file:', {
937
+ tier: activationData.tier,
938
+ activated_at: activationData.activated_at
939
+ });
940
+
941
+ // Check if license is already cached and valid
942
+ const cached = await chrome.storage.local.get('chromedebug_license_cache');
943
+ if (cached.chromedebug_license_cache?.valid && cached.chromedebug_license_cache?.tier === 'pro') {
944
+ console.log('[License Auto-Activation] License already activated and cached');
945
+ return;
946
+ }
947
+
948
+ // Activate the license
949
+ const licenseKey = activationData.license_key;
950
+ console.log('[License Auto-Activation] Activating license...');
951
+
952
+ // Call LemonSqueezy activation via Firebase Cloud Function
953
+ const instanceId = crypto.randomUUID();
954
+ await chrome.storage.local.set({
955
+ 'chromedebug_instance_id': instanceId,
956
+ 'ls_instance_id': instanceId,
957
+ 'ls_license_key': licenseKey
958
+ });
959
+
960
+ const activationResponse = await fetch(`${FUNCTIONS_URL}/activateLicense`, {
961
+ method: 'POST',
962
+ headers: {'Content-Type': 'application/json'},
963
+ body: JSON.stringify({
964
+ licenseKey,
965
+ instanceId,
966
+ instanceName: `ChromeDebug-${navigator.userAgent.match(/Chrome\/(\d+)/)?.[1] || 'Unknown'}`
967
+ })
968
+ });
969
+
970
+ if (!activationResponse.ok) {
971
+ throw new Error(`Activation failed: HTTP ${activationResponse.status}`);
972
+ }
973
+
974
+ const activationResult = await activationResponse.json();
975
+ console.log('[License Auto-Activation] Activation result:', activationResult);
976
+
977
+ if (activationResult.activated || activationResult.valid) {
978
+ // Cache the license status
979
+ const licenseCache = {
980
+ valid: true,
981
+ tier: 'pro',
982
+ licenseKey: licenseKey.substring(0, 8) + '...',
983
+ cachedAt: Date.now(),
984
+ graceUntil: Date.now() + (30 * 24 * 60 * 60 * 1000) // 30 days
985
+ };
986
+
987
+ await chrome.storage.local.set({
988
+ 'chromedebug_license_cache': licenseCache
989
+ });
990
+
991
+ console.log('[License Auto-Activation] ✓ PRO license activated successfully!');
992
+ console.log('[License Auto-Activation] Cached license status:', licenseCache);
993
+ } else {
994
+ console.error('[License Auto-Activation] Activation returned invalid status:', activationResult);
995
+ }
996
+
997
+ } catch (error) {
998
+ // Don't block extension startup on activation errors
999
+ console.error('[License Auto-Activation] Failed to auto-activate license:', error);
1000
+ console.log('[License Auto-Activation] Extension will continue with normal license flow');
1001
+ }
1002
+ }
1003
+
921
1004
  // Session recovery on startup - handle any stuck recordings from previous session
922
1005
  chrome.runtime.onStartup.addListener(async () => {
923
1006
  console.log('[Background] Extension startup detected - checking for stuck sessions');
924
1007
 
1008
+ // Check for PRO license auto-activation first
1009
+ await checkAndActivateLicense();
1010
+
925
1011
  if (sessionManager) {
926
1012
  try {
927
1013
  // Use existing recovery method from session manager
@@ -935,6 +1021,14 @@ chrome.runtime.onStartup.addListener(async () => {
935
1021
  }
936
1022
  });
937
1023
 
1024
+ // Extension install/update - also check for license activation
1025
+ chrome.runtime.onInstalled.addListener(async (details) => {
1026
+ console.log('[Background] Extension installed/updated:', details.reason);
1027
+
1028
+ // Check for PRO license auto-activation on install/update
1029
+ await checkAndActivateLicense();
1030
+ });
1031
+
938
1032
  // Listen for tab updates to handle restore points
939
1033
  chrome.tabs.onUpdated.addListener((tabId, changeInfo, tab) => {
940
1034
  // Inject console logging on navigation during recording
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamicu/chromedebug-mcp",
3
- "version": "2.5.6",
3
+ "version": "2.5.8",
4
4
  "description": "ChromeDebug MCP - MCP server that provides full control over a Chrome browser instance for debugging and automation with AI assistants like Claude Code",
5
5
  "main": "src/index.js",
6
6
  "type": "module",
@@ -22,8 +22,10 @@ const LICENSE_FILE = path.join(CHROMEDEBUG_DIR, 'license.json');
22
22
  const INSTALL_LOG = path.join(CHROMEDEBUG_DIR, 'install.log');
23
23
  const ENV_VAR_NAME = 'CHROMEDEBUG_EXTENSION_PATH';
24
24
 
25
- // License key format: LICENSEID-HASH (e.g., ABC12345-0123456789ABCDEF)
26
- const LICENSE_KEY_REGEX = /^[A-Z0-9]{8,}-[A-Z0-9]{16,}$/i;
25
+ // License key format: Accepts UUID format (LemonSqueezy) or custom format
26
+ // UUID: 0CD6ACFD-40B1-4EAF-955C-C4D581A8984B
27
+ // Custom: ABC12345-0123456789ABCDEF
28
+ const LICENSE_KEY_REGEX = /^[A-Z0-9]{8,}(-[A-Z0-9]{4,})+$/i;
27
29
 
28
30
  /**
29
31
  * Log installation activity
@@ -92,8 +94,9 @@ function validateLicenseKey(key) {
92
94
  console.error(`
93
95
  Error: Invalid license key format
94
96
 
95
- Expected format: LICENSEID-HASH
96
- Example: ABC12345-0123456789ABCDEF
97
+ Expected formats:
98
+ • UUID (LemonSqueezy): 0CD6ACFD-40B1-4EAF-955C-C4D581A8984B
99
+ • Custom: ABC12345-0123456789ABCDEF
97
100
 
98
101
  Your key: ${maskLicenseKey(key)}
99
102
 
@@ -483,6 +486,24 @@ This will overwrite the existing installation.`;
483
486
  // Set extension directory permissions
484
487
  await fs.chmod(EXTENSION_DIR, 0o755);
485
488
 
489
+ // 5.5. Create license activation file for auto-activation
490
+ console.log('Creating license activation file...');
491
+ const activationFile = {
492
+ license_key: license,
493
+ activated_at: new Date().toISOString(),
494
+ auto_activate: true,
495
+ tier: 'pro'
496
+ };
497
+
498
+ const activationFilePath = path.join(EXTENSION_DIR, 'license-activation.json');
499
+ await fs.writeFile(
500
+ activationFilePath,
501
+ JSON.stringify(activationFile, null, 2),
502
+ 'utf8'
503
+ );
504
+ await logInstall(`License activation file created: ${activationFilePath}`);
505
+ console.log(` Activation file created for auto-activation\n`);
506
+
486
507
  // 6. Save license information
487
508
  console.log('Saving license information...');
488
509
  await saveLicenseInfo(license, extensionInfo.version);