claude-chrome-parallel 3.0.3 → 3.4.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/LICENSE +21 -21
- package/README.md +398 -464
- package/assets/demo.svg +278 -173
- package/dist/cdp/client.d.ts +60 -2
- package/dist/cdp/client.d.ts.map +1 -1
- package/dist/cdp/client.js +344 -5
- package/dist/cdp/client.js.map +1 -1
- package/dist/cdp/connection-pool.d.ts.map +1 -1
- package/dist/cdp/connection-pool.js +20 -4
- package/dist/cdp/connection-pool.js.map +1 -1
- package/dist/chrome/launcher.d.ts +11 -0
- package/dist/chrome/launcher.d.ts.map +1 -1
- package/dist/chrome/launcher.js +124 -10
- package/dist/chrome/launcher.js.map +1 -1
- package/dist/chrome/pool.d.ts +54 -0
- package/dist/chrome/pool.d.ts.map +1 -0
- package/dist/chrome/pool.js +301 -0
- package/dist/chrome/pool.js.map +1 -0
- package/dist/chrome/profile-detector.d.ts +52 -0
- package/dist/chrome/profile-detector.d.ts.map +1 -0
- package/dist/chrome/profile-detector.js +246 -0
- package/dist/chrome/profile-detector.js.map +1 -0
- package/dist/cli/claude-session.js +15 -15
- package/dist/cli/index.js +162 -37
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/update-check.d.ts +9 -0
- package/dist/cli/update-check.js +141 -0
- package/dist/cli/update-check.js.map +1 -0
- package/dist/config/global.d.ts +31 -0
- package/dist/config/global.d.ts.map +1 -1
- package/dist/config/global.js.map +1 -1
- package/dist/dashboard/activity-tracker.d.ts +60 -0
- package/dist/dashboard/activity-tracker.d.ts.map +1 -0
- package/dist/dashboard/activity-tracker.js +178 -0
- package/dist/dashboard/activity-tracker.js.map +1 -0
- package/dist/dashboard/ansi.d.ts +117 -0
- package/dist/dashboard/ansi.d.ts.map +1 -0
- package/dist/dashboard/ansi.js +199 -0
- package/dist/dashboard/ansi.js.map +1 -0
- package/dist/dashboard/index.d.ts +110 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +412 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/keyboard-handler.d.ts +43 -0
- package/dist/dashboard/keyboard-handler.d.ts.map +1 -0
- package/dist/dashboard/keyboard-handler.js +215 -0
- package/dist/dashboard/keyboard-handler.js.map +1 -0
- package/dist/dashboard/operation-controller.d.ts +76 -0
- package/dist/dashboard/operation-controller.d.ts.map +1 -0
- package/dist/dashboard/operation-controller.js +167 -0
- package/dist/dashboard/operation-controller.js.map +1 -0
- package/dist/dashboard/renderer.d.ts +76 -0
- package/dist/dashboard/renderer.d.ts.map +1 -0
- package/dist/dashboard/renderer.js +193 -0
- package/dist/dashboard/renderer.js.map +1 -0
- package/dist/dashboard/types.d.ts +56 -0
- package/dist/dashboard/types.d.ts.map +1 -0
- package/dist/dashboard/types.js +12 -0
- package/dist/dashboard/types.js.map +1 -0
- package/dist/dashboard/views/main-view.d.ts +23 -0
- package/dist/dashboard/views/main-view.d.ts.map +1 -0
- package/dist/dashboard/views/main-view.js +143 -0
- package/dist/dashboard/views/main-view.js.map +1 -0
- package/dist/dashboard/views/sessions-view.d.ts +22 -0
- package/dist/dashboard/views/sessions-view.d.ts.map +1 -0
- package/dist/dashboard/views/sessions-view.js +104 -0
- package/dist/dashboard/views/sessions-view.js.map +1 -0
- package/dist/dashboard/views/tabs-view.d.ts +21 -0
- package/dist/dashboard/views/tabs-view.d.ts.map +1 -0
- package/dist/dashboard/views/tabs-view.js +92 -0
- package/dist/dashboard/views/tabs-view.js.map +1 -0
- package/dist/hints/hint-engine.d.ts +65 -0
- package/dist/hints/hint-engine.d.ts.map +1 -0
- package/dist/hints/hint-engine.js +156 -0
- package/dist/hints/hint-engine.js.map +1 -0
- package/dist/hints/index.d.ts +8 -0
- package/dist/hints/index.d.ts.map +1 -0
- package/dist/hints/index.js +11 -0
- package/dist/hints/index.js.map +1 -0
- package/dist/hints/pattern-learner.d.ts +76 -0
- package/dist/hints/pattern-learner.d.ts.map +1 -0
- package/dist/hints/pattern-learner.js +254 -0
- package/dist/hints/pattern-learner.js.map +1 -0
- package/dist/hints/rules/composite-suggestions.d.ts +6 -0
- package/dist/hints/rules/composite-suggestions.d.ts.map +1 -0
- package/dist/hints/rules/composite-suggestions.js +66 -0
- package/dist/hints/rules/composite-suggestions.js.map +1 -0
- package/dist/hints/rules/error-recovery.d.ts +7 -0
- package/dist/hints/rules/error-recovery.d.ts.map +1 -0
- package/dist/hints/rules/error-recovery.js +47 -0
- package/dist/hints/rules/error-recovery.js.map +1 -0
- package/dist/hints/rules/learned-rules.d.ts +13 -0
- package/dist/hints/rules/learned-rules.d.ts.map +1 -0
- package/dist/hints/rules/learned-rules.js +27 -0
- package/dist/hints/rules/learned-rules.js.map +1 -0
- package/dist/hints/rules/repetition-detection.d.ts +7 -0
- package/dist/hints/rules/repetition-detection.d.ts.map +1 -0
- package/dist/hints/rules/repetition-detection.js +82 -0
- package/dist/hints/rules/repetition-detection.js.map +1 -0
- package/dist/hints/rules/sequence-detection.d.ts +6 -0
- package/dist/hints/rules/sequence-detection.d.ts.map +1 -0
- package/dist/hints/rules/sequence-detection.js +61 -0
- package/dist/hints/rules/sequence-detection.js.map +1 -0
- package/dist/hints/rules/success-hints.d.ts +6 -0
- package/dist/hints/rules/success-hints.d.ts.map +1 -0
- package/dist/hints/rules/success-hints.js +62 -0
- package/dist/hints/rules/success-hints.js.map +1 -0
- package/dist/index.js +190 -55
- package/dist/index.js.map +1 -1
- package/dist/lightpanda/launcher.d.ts +58 -0
- package/dist/lightpanda/launcher.d.ts.map +1 -0
- package/dist/lightpanda/launcher.js +199 -0
- package/dist/lightpanda/launcher.js.map +1 -0
- package/dist/mcp-server.d.ts +38 -1
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +220 -6
- package/dist/mcp-server.js.map +1 -1
- package/dist/orchestration/state-manager.js +46 -46
- package/dist/orchestration/workflow-engine.d.ts +1 -0
- package/dist/orchestration/workflow-engine.d.ts.map +1 -1
- package/dist/orchestration/workflow-engine.js +112 -114
- package/dist/orchestration/workflow-engine.js.map +1 -1
- package/dist/resources/usage-guide.d.ts +13 -0
- package/dist/resources/usage-guide.d.ts.map +1 -0
- package/dist/resources/usage-guide.js +101 -0
- package/dist/resources/usage-guide.js.map +1 -0
- package/dist/router/browser-router.d.ts +51 -0
- package/dist/router/browser-router.d.ts.map +1 -0
- package/dist/router/browser-router.js +178 -0
- package/dist/router/browser-router.js.map +1 -0
- package/dist/router/cookie-sync.d.ts +48 -0
- package/dist/router/cookie-sync.d.ts.map +1 -0
- package/dist/router/cookie-sync.js +106 -0
- package/dist/router/cookie-sync.js.map +1 -0
- package/dist/router/index.d.ts +5 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +10 -0
- package/dist/router/index.js.map +1 -0
- package/dist/router/tool-routing-registry.d.ts +21 -0
- package/dist/router/tool-routing-registry.d.ts.map +1 -0
- package/dist/router/tool-routing-registry.js +90 -0
- package/dist/router/tool-routing-registry.js.map +1 -0
- package/dist/session-manager.d.ts +41 -1
- package/dist/session-manager.d.ts.map +1 -1
- package/dist/session-manager.js +216 -21
- package/dist/session-manager.js.map +1 -1
- package/dist/tools/click-element.d.ts +8 -0
- package/dist/tools/click-element.d.ts.map +1 -0
- package/dist/tools/click-element.js +383 -0
- package/dist/tools/click-element.js.map +1 -0
- package/dist/tools/computer.d.ts.map +1 -1
- package/dist/tools/computer.js +198 -34
- package/dist/tools/computer.js.map +1 -1
- package/dist/tools/console-capture.d.ts +6 -0
- package/dist/tools/console-capture.d.ts.map +1 -0
- package/dist/tools/console-capture.js +320 -0
- package/dist/tools/console-capture.js.map +1 -0
- package/dist/tools/cookies.d.ts +6 -0
- package/dist/tools/cookies.d.ts.map +1 -0
- package/dist/tools/cookies.js +263 -0
- package/dist/tools/cookies.js.map +1 -0
- package/dist/tools/drag-drop.d.ts +6 -0
- package/dist/tools/drag-drop.d.ts.map +1 -0
- package/dist/tools/drag-drop.js +252 -0
- package/dist/tools/drag-drop.js.map +1 -0
- package/dist/tools/emulate-device.d.ts +6 -0
- package/dist/tools/emulate-device.d.ts.map +1 -0
- package/dist/tools/emulate-device.js +221 -0
- package/dist/tools/emulate-device.js.map +1 -0
- package/dist/tools/file-upload.d.ts +6 -0
- package/dist/tools/file-upload.d.ts.map +1 -0
- package/dist/tools/file-upload.js +208 -0
- package/dist/tools/file-upload.js.map +1 -0
- package/dist/tools/fill-form.d.ts +8 -0
- package/dist/tools/fill-form.d.ts.map +1 -0
- package/dist/tools/fill-form.js +342 -0
- package/dist/tools/fill-form.js.map +1 -0
- package/dist/tools/find.d.ts.map +1 -1
- package/dist/tools/find.js +153 -65
- package/dist/tools/find.js.map +1 -1
- package/dist/tools/form-input.js +52 -52
- package/dist/tools/form-input.js.map +1 -1
- package/dist/tools/geolocation.d.ts +6 -0
- package/dist/tools/geolocation.d.ts.map +1 -0
- package/dist/tools/geolocation.js +172 -0
- package/dist/tools/geolocation.js.map +1 -0
- package/dist/tools/http-auth.d.ts +6 -0
- package/dist/tools/http-auth.d.ts.map +1 -0
- package/dist/tools/http-auth.js +136 -0
- package/dist/tools/http-auth.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +50 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/javascript.js +1 -1
- package/dist/tools/javascript.js.map +1 -1
- package/dist/tools/navigate.d.ts.map +1 -1
- package/dist/tools/navigate.js +5 -2
- package/dist/tools/navigate.js.map +1 -1
- package/dist/tools/network.js +4 -4
- package/dist/tools/network.js.map +1 -1
- package/dist/tools/orchestration.d.ts.map +1 -1
- package/dist/tools/orchestration.js +13 -8
- package/dist/tools/orchestration.js.map +1 -1
- package/dist/tools/page-content.d.ts +6 -0
- package/dist/tools/page-content.d.ts.map +1 -0
- package/dist/tools/page-content.js +120 -0
- package/dist/tools/page-content.js.map +1 -0
- package/dist/tools/page-pdf.d.ts +6 -0
- package/dist/tools/page-pdf.d.ts.map +1 -0
- package/dist/tools/page-pdf.js +245 -0
- package/dist/tools/page-pdf.js.map +1 -0
- package/dist/tools/page-reload.d.ts +6 -0
- package/dist/tools/page-reload.d.ts.map +1 -0
- package/dist/tools/page-reload.js +89 -0
- package/dist/tools/page-reload.js.map +1 -0
- package/dist/tools/performance-metrics.d.ts +6 -0
- package/dist/tools/performance-metrics.d.ts.map +1 -0
- package/dist/tools/performance-metrics.js +158 -0
- package/dist/tools/performance-metrics.js.map +1 -0
- package/dist/tools/read-page.d.ts.map +1 -1
- package/dist/tools/read-page.js +4 -2
- package/dist/tools/read-page.js.map +1 -1
- package/dist/tools/request-intercept.d.ts +6 -0
- package/dist/tools/request-intercept.d.ts.map +1 -0
- package/dist/tools/request-intercept.js +439 -0
- package/dist/tools/request-intercept.js.map +1 -0
- package/dist/tools/selector-query.d.ts +6 -0
- package/dist/tools/selector-query.d.ts.map +1 -0
- package/dist/tools/selector-query.js +206 -0
- package/dist/tools/selector-query.js.map +1 -0
- package/dist/tools/storage.d.ts +6 -0
- package/dist/tools/storage.d.ts.map +1 -0
- package/dist/tools/storage.js +264 -0
- package/dist/tools/storage.js.map +1 -0
- package/dist/tools/tabs-close.d.ts +6 -0
- package/dist/tools/tabs-close.d.ts.map +1 -0
- package/dist/tools/tabs-close.js +124 -0
- package/dist/tools/tabs-close.js.map +1 -0
- package/dist/tools/tabs-context.js +1 -1
- package/dist/tools/tabs-context.js.map +1 -1
- package/dist/tools/user-agent.d.ts +6 -0
- package/dist/tools/user-agent.d.ts.map +1 -0
- package/dist/tools/user-agent.js +128 -0
- package/dist/tools/user-agent.js.map +1 -0
- package/dist/tools/wait-and-click.d.ts +8 -0
- package/dist/tools/wait-and-click.d.ts.map +1 -0
- package/dist/tools/wait-and-click.js +290 -0
- package/dist/tools/wait-and-click.js.map +1 -0
- package/dist/tools/wait-for.d.ts +6 -0
- package/dist/tools/wait-for.d.ts.map +1 -0
- package/dist/tools/wait-for.js +248 -0
- package/dist/tools/wait-for.js.map +1 -0
- package/dist/tools/xpath-query.d.ts +6 -0
- package/dist/tools/xpath-query.d.ts.map +1 -0
- package/dist/tools/xpath-query.js +230 -0
- package/dist/tools/xpath-query.js.map +1 -0
- package/dist/types/browser-backend.d.ts +30 -0
- package/dist/types/browser-backend.d.ts.map +1 -0
- package/dist/types/browser-backend.js +9 -0
- package/dist/types/browser-backend.js.map +1 -0
- package/dist/types/profile.d.ts +76 -0
- package/dist/types/profile.d.ts.map +1 -0
- package/dist/types/profile.js +35 -0
- package/dist/types/profile.js.map +1 -0
- package/dist/types/session.d.ts +7 -3
- package/dist/types/session.d.ts.map +1 -1
- package/package.json +78 -75
- package/dist/master/index.d.ts +0 -18
- package/dist/master/index.d.ts.map +0 -1
- package/dist/master/index.js +0 -75
- package/dist/master/index.js.map +0 -1
- package/dist/master/ipc-server.d.ts +0 -21
- package/dist/master/ipc-server.d.ts.map +0 -1
- package/dist/master/ipc-server.js +0 -175
- package/dist/master/ipc-server.js.map +0 -1
- package/dist/master/request-handler.d.ts +0 -17
- package/dist/master/request-handler.d.ts.map +0 -1
- package/dist/master/request-handler.js +0 -134
- package/dist/master/request-handler.js.map +0 -1
- package/dist/master/session-registry.d.ts +0 -120
- package/dist/master/session-registry.d.ts.map +0 -1
- package/dist/master/session-registry.js +0 -247
- package/dist/master/session-registry.js.map +0 -1
- package/dist/shared/ipc-constants.d.ts +0 -16
- package/dist/shared/ipc-constants.d.ts.map +0 -1
- package/dist/shared/ipc-constants.js +0 -66
- package/dist/shared/ipc-constants.js.map +0 -1
- package/dist/shared/ipc-protocol.d.ts +0 -33
- package/dist/shared/ipc-protocol.d.ts.map +0 -1
- package/dist/shared/ipc-protocol.js +0 -20
- package/dist/shared/ipc-protocol.js.map +0 -1
- package/dist/worker/auto-master.d.ts +0 -24
- package/dist/worker/auto-master.d.ts.map +0 -1
- package/dist/worker/auto-master.js +0 -135
- package/dist/worker/auto-master.js.map +0 -1
- package/dist/worker/index.d.ts +0 -25
- package/dist/worker/index.d.ts.map +0 -1
- package/dist/worker/index.js +0 -93
- package/dist/worker/index.js.map +0 -1
- package/dist/worker/ipc-client.d.ts +0 -26
- package/dist/worker/ipc-client.d.ts.map +0 -1
- package/dist/worker/ipc-client.js +0 -211
- package/dist/worker/ipc-client.js.map +0 -1
- package/dist/worker/remote-session-manager.d.ts +0 -114
- package/dist/worker/remote-session-manager.d.ts.map +0 -1
- package/dist/worker/remote-session-manager.js +0 -151
- package/dist/worker/remote-session-manager.js.map +0 -1
- package/dist/worker/tools.d.ts +0 -7
- package/dist/worker/tools.d.ts.map +0 -1
- package/dist/worker/tools.js +0 -340
- package/dist/worker/tools.js.map +0 -1
- package/dist/worker/worker-mcp-server.d.ts +0 -70
- package/dist/worker/worker-mcp-server.d.ts.map +0 -1
- package/dist/worker/worker-mcp-server.js +0 -295
- package/dist/worker/worker-mcp-server.js.map +0 -1
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Chrome Profile Detector - Detects and manages Chrome profiles
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
17
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
18
|
+
}) : function(o, v) {
|
|
19
|
+
o["default"] = v;
|
|
20
|
+
});
|
|
21
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
22
|
+
var ownKeys = function(o) {
|
|
23
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
24
|
+
var ar = [];
|
|
25
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
return ownKeys(o);
|
|
29
|
+
};
|
|
30
|
+
return function (mod) {
|
|
31
|
+
if (mod && mod.__esModule) return mod;
|
|
32
|
+
var result = {};
|
|
33
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
34
|
+
__setModuleDefault(result, mod);
|
|
35
|
+
return result;
|
|
36
|
+
};
|
|
37
|
+
})();
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.getChromeUserDataDir = getChromeUserDataDir;
|
|
40
|
+
exports.isProfileInUse = isProfileInUse;
|
|
41
|
+
exports.parseLocalState = parseLocalState;
|
|
42
|
+
exports.getProfileMetadata = getProfileMetadata;
|
|
43
|
+
exports.detectProfiles = detectProfiles;
|
|
44
|
+
exports.getProfile = getProfile;
|
|
45
|
+
exports.getProfileDetector = getProfileDetector;
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
48
|
+
const os = __importStar(require("os"));
|
|
49
|
+
/**
|
|
50
|
+
* Get Chrome user data directory path for the current platform
|
|
51
|
+
*/
|
|
52
|
+
function getChromeUserDataDir(platform) {
|
|
53
|
+
const p = platform || os.platform();
|
|
54
|
+
switch (p) {
|
|
55
|
+
case 'darwin':
|
|
56
|
+
return path.join(os.homedir(), 'Library', 'Application Support', 'Google', 'Chrome');
|
|
57
|
+
case 'win32':
|
|
58
|
+
return path.join(process.env.LOCALAPPDATA || path.join(os.homedir(), 'AppData', 'Local'), 'Google', 'Chrome', 'User Data');
|
|
59
|
+
case 'linux':
|
|
60
|
+
default:
|
|
61
|
+
return path.join(os.homedir(), '.config', 'google-chrome');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check if a profile is currently in use by checking lock files
|
|
66
|
+
*
|
|
67
|
+
* Chrome uses different lock mechanisms on different platforms:
|
|
68
|
+
* - Linux: SingletonLock (symlink)
|
|
69
|
+
* - macOS/Windows: lockfile
|
|
70
|
+
*/
|
|
71
|
+
async function isProfileInUse(profilePath) {
|
|
72
|
+
const platform = os.platform();
|
|
73
|
+
// Check for SingletonLock (Linux)
|
|
74
|
+
const singletonLock = path.join(profilePath, 'SingletonLock');
|
|
75
|
+
if (fs.existsSync(singletonLock)) {
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
// Check for lockfile (macOS/Windows)
|
|
79
|
+
const lockfile = path.join(profilePath, 'lockfile');
|
|
80
|
+
if (fs.existsSync(lockfile)) {
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
// Check parent directory for singleton lock (user data dir level)
|
|
84
|
+
const userDataDir = path.dirname(profilePath);
|
|
85
|
+
const userDataLock = path.join(userDataDir, 'SingletonLock');
|
|
86
|
+
if (fs.existsSync(userDataLock)) {
|
|
87
|
+
// This means Chrome is running with this user data dir
|
|
88
|
+
// but we can't know which specific profile is active
|
|
89
|
+
// For safety, we'll check if there's activity in the profile
|
|
90
|
+
// Check for running lock in the profile
|
|
91
|
+
const runningLock = path.join(profilePath, 'LOCK');
|
|
92
|
+
if (fs.existsSync(runningLock)) {
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Parse Chrome's Local State file
|
|
100
|
+
*/
|
|
101
|
+
async function parseLocalState(userDataDir) {
|
|
102
|
+
const localStatePath = path.join(userDataDir, 'Local State');
|
|
103
|
+
if (!fs.existsSync(localStatePath)) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const content = fs.readFileSync(localStatePath, 'utf8');
|
|
108
|
+
return JSON.parse(content);
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error('[ProfileDetector] Failed to parse Local State:', error);
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Get metadata for a specific profile
|
|
117
|
+
*/
|
|
118
|
+
async function getProfileMetadata(profilePath, localState) {
|
|
119
|
+
const profileId = path.basename(profilePath);
|
|
120
|
+
const result = {
|
|
121
|
+
id: profileId,
|
|
122
|
+
name: profileId,
|
|
123
|
+
path: profilePath,
|
|
124
|
+
};
|
|
125
|
+
// Get info from Local State if available
|
|
126
|
+
if (localState?.profile?.info_cache) {
|
|
127
|
+
const info = localState.profile.info_cache[profileId];
|
|
128
|
+
if (info) {
|
|
129
|
+
result.name = info.name || info.shortcut_name || profileId;
|
|
130
|
+
result.email = info.user_name || info.gaia_name;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Try to read Preferences file for additional info
|
|
134
|
+
const prefsPath = path.join(profilePath, 'Preferences');
|
|
135
|
+
if (fs.existsSync(prefsPath)) {
|
|
136
|
+
try {
|
|
137
|
+
const prefs = JSON.parse(fs.readFileSync(prefsPath, 'utf8'));
|
|
138
|
+
// Get account info if available
|
|
139
|
+
if (prefs.account_info && Array.isArray(prefs.account_info) && prefs.account_info.length > 0) {
|
|
140
|
+
const account = prefs.account_info[0];
|
|
141
|
+
if (account.email && !result.email) {
|
|
142
|
+
result.email = account.email;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Get profile name from preferences
|
|
146
|
+
if (prefs.profile?.name && result.name === profileId) {
|
|
147
|
+
result.name = prefs.profile.name;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// Ignore parse errors
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Detect all Chrome profiles
|
|
158
|
+
*/
|
|
159
|
+
async function detectProfiles(options) {
|
|
160
|
+
const userDataDir = options?.userDataDir || getChromeUserDataDir();
|
|
161
|
+
const profiles = [];
|
|
162
|
+
if (!fs.existsSync(userDataDir)) {
|
|
163
|
+
console.error(`[ProfileDetector] Chrome user data directory not found: ${userDataDir}`);
|
|
164
|
+
return { userDataDir, profiles };
|
|
165
|
+
}
|
|
166
|
+
// Parse Local State for profile metadata
|
|
167
|
+
const localState = await parseLocalState(userDataDir);
|
|
168
|
+
// Find profile directories
|
|
169
|
+
const entries = fs.readdirSync(userDataDir, { withFileTypes: true });
|
|
170
|
+
for (const entry of entries) {
|
|
171
|
+
if (!entry.isDirectory())
|
|
172
|
+
continue;
|
|
173
|
+
// Profile directories are "Default" or "Profile N"
|
|
174
|
+
const name = entry.name;
|
|
175
|
+
if (name !== 'Default' && !name.startsWith('Profile '))
|
|
176
|
+
continue;
|
|
177
|
+
const profilePath = path.join(userDataDir, name);
|
|
178
|
+
// Verify it's actually a profile directory (has Preferences file)
|
|
179
|
+
const prefsPath = path.join(profilePath, 'Preferences');
|
|
180
|
+
if (!fs.existsSync(prefsPath))
|
|
181
|
+
continue;
|
|
182
|
+
// Get profile metadata
|
|
183
|
+
const metadata = await getProfileMetadata(profilePath, localState);
|
|
184
|
+
// Check if profile is in use
|
|
185
|
+
const inUse = await isProfileInUse(profilePath);
|
|
186
|
+
profiles.push({
|
|
187
|
+
id: name,
|
|
188
|
+
name: metadata.name || name,
|
|
189
|
+
path: profilePath,
|
|
190
|
+
email: metadata.email,
|
|
191
|
+
isInUse: inUse,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
// Sort profiles: Default first, then by name
|
|
195
|
+
profiles.sort((a, b) => {
|
|
196
|
+
if (a.id === 'Default')
|
|
197
|
+
return -1;
|
|
198
|
+
if (b.id === 'Default')
|
|
199
|
+
return 1;
|
|
200
|
+
return a.id.localeCompare(b.id);
|
|
201
|
+
});
|
|
202
|
+
return { userDataDir, profiles };
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get a specific profile by ID
|
|
206
|
+
*/
|
|
207
|
+
async function getProfile(profileId, options) {
|
|
208
|
+
const result = await detectProfiles(options);
|
|
209
|
+
return result.profiles.find(p => p.id === profileId) || null;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Profile detector singleton
|
|
213
|
+
*/
|
|
214
|
+
class ProfileDetector {
|
|
215
|
+
cache = null;
|
|
216
|
+
cacheTime = 0;
|
|
217
|
+
cacheTTL = 5000; // 5 seconds
|
|
218
|
+
async getProfiles(options) {
|
|
219
|
+
const now = Date.now();
|
|
220
|
+
if (!options?.refresh &&
|
|
221
|
+
this.cache &&
|
|
222
|
+
!options?.userDataDir &&
|
|
223
|
+
now - this.cacheTime < this.cacheTTL) {
|
|
224
|
+
return this.cache;
|
|
225
|
+
}
|
|
226
|
+
const result = await detectProfiles(options);
|
|
227
|
+
if (!options?.userDataDir) {
|
|
228
|
+
this.cache = result;
|
|
229
|
+
this.cacheTime = now;
|
|
230
|
+
}
|
|
231
|
+
return result;
|
|
232
|
+
}
|
|
233
|
+
clearCache() {
|
|
234
|
+
this.cache = null;
|
|
235
|
+
this.cacheTime = 0;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Singleton instance
|
|
239
|
+
let detectorInstance = null;
|
|
240
|
+
function getProfileDetector() {
|
|
241
|
+
if (!detectorInstance) {
|
|
242
|
+
detectorInstance = new ProfileDetector();
|
|
243
|
+
}
|
|
244
|
+
return detectorInstance;
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=profile-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-detector.js","sourceRoot":"","sources":["../../src/chrome/profile-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -296,21 +296,21 @@ function startIsolatedSession(claudeArgs) {
|
|
|
296
296
|
// Main
|
|
297
297
|
const args = process.argv.slice(2);
|
|
298
298
|
if (args.includes('--help') || args.includes('-h')) {
|
|
299
|
-
console.log(`
|
|
300
|
-
Claude Session - Run Claude Code with isolated config
|
|
301
|
-
|
|
302
|
-
Usage:
|
|
303
|
-
claude-session [claude-args...] Start Claude Code with isolated config
|
|
304
|
-
claude-session --list List active sessions
|
|
305
|
-
claude-session --cleanup [hours] Clean up sessions older than N hours (default: 24)
|
|
306
|
-
claude-session --recover Recover corrupted .claude.json
|
|
307
|
-
claude-session --help Show this help
|
|
308
|
-
|
|
309
|
-
Examples:
|
|
310
|
-
claude-session Start interactive session
|
|
311
|
-
claude-session "Fix the bug" Start with prompt
|
|
312
|
-
claude-session --list Show active sessions
|
|
313
|
-
claude-session --cleanup 12 Clean up sessions older than 12 hours
|
|
299
|
+
console.log(`
|
|
300
|
+
Claude Session - Run Claude Code with isolated config
|
|
301
|
+
|
|
302
|
+
Usage:
|
|
303
|
+
claude-session [claude-args...] Start Claude Code with isolated config
|
|
304
|
+
claude-session --list List active sessions
|
|
305
|
+
claude-session --cleanup [hours] Clean up sessions older than N hours (default: 24)
|
|
306
|
+
claude-session --recover Recover corrupted .claude.json
|
|
307
|
+
claude-session --help Show this help
|
|
308
|
+
|
|
309
|
+
Examples:
|
|
310
|
+
claude-session Start interactive session
|
|
311
|
+
claude-session "Fix the bug" Start with prompt
|
|
312
|
+
claude-session --list Show active sessions
|
|
313
|
+
claude-session --cleanup 12 Clean up sessions older than 12 hours
|
|
314
314
|
`);
|
|
315
315
|
process.exit(0);
|
|
316
316
|
}
|
package/dist/cli/index.js
CHANGED
|
@@ -47,12 +47,14 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
47
47
|
})();
|
|
48
48
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
49
|
const commander_1 = require("commander");
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
// Legacy imports - kept for backward compatibility but deprecated
|
|
51
|
+
// import { install, installNativeHost } from './install';
|
|
52
|
+
// import { uninstall } from './uninstall';
|
|
52
53
|
const path = __importStar(require("path"));
|
|
53
54
|
const fs = __importStar(require("fs"));
|
|
54
55
|
const os = __importStar(require("os"));
|
|
55
56
|
const child_process_1 = require("child_process");
|
|
57
|
+
const update_check_1 = require("./update-check");
|
|
56
58
|
const program = new commander_1.Command();
|
|
57
59
|
// Package info - from dist/cli/ go up two levels to root
|
|
58
60
|
const packageJsonPath = path.join(__dirname, '..', '..', 'package.json');
|
|
@@ -66,43 +68,103 @@ catch {
|
|
|
66
68
|
}
|
|
67
69
|
program
|
|
68
70
|
.name('claude-chrome-parallel')
|
|
69
|
-
.description('
|
|
71
|
+
.description('MCP server for parallel Claude Code browser sessions via CDP')
|
|
70
72
|
.version(version);
|
|
71
73
|
program
|
|
72
74
|
.command('install')
|
|
73
|
-
.description('
|
|
75
|
+
.description('[DEPRECATED] Extension install is no longer needed. Use CDP mode instead.')
|
|
74
76
|
.option('-f, --force', 'Force reinstall even if already installed')
|
|
75
77
|
.option('--extension-id <id>', 'Chrome extension ID (for native host configuration)')
|
|
78
|
+
.action(async () => {
|
|
79
|
+
console.log('⚠️ DEPRECATED: Extension installation is no longer needed.\n');
|
|
80
|
+
console.log('Claude Chrome Parallel now uses CDP (Chrome DevTools Protocol) mode,');
|
|
81
|
+
console.log('which does not require a Chrome extension.\n');
|
|
82
|
+
console.log('Quick Start:');
|
|
83
|
+
console.log(' 1. Start Chrome with debugging port:');
|
|
84
|
+
console.log(' chrome --remote-debugging-port=9222\n');
|
|
85
|
+
console.log(' 2. Add to ~/.claude.json:');
|
|
86
|
+
console.log(' {');
|
|
87
|
+
console.log(' "mcpServers": {');
|
|
88
|
+
console.log(' "chrome-parallel": {');
|
|
89
|
+
console.log(' "command": "ccp",');
|
|
90
|
+
console.log(' "args": ["serve"]');
|
|
91
|
+
console.log(' }');
|
|
92
|
+
console.log(' }');
|
|
93
|
+
console.log(' }\n');
|
|
94
|
+
console.log(' 3. Restart Claude Code\n');
|
|
95
|
+
console.log('Run "ccp doctor" to verify your setup.');
|
|
96
|
+
});
|
|
97
|
+
program
|
|
98
|
+
.command('uninstall')
|
|
99
|
+
.description('[DEPRECATED] No longer needed - CDP mode has no extension to uninstall')
|
|
100
|
+
.action(async () => {
|
|
101
|
+
console.log('⚠️ DEPRECATED: Uninstall is no longer needed.\n');
|
|
102
|
+
console.log('Claude Chrome Parallel now uses CDP mode, which has no extension to uninstall.');
|
|
103
|
+
console.log('Simply remove the MCP server config from ~/.claude.json if you want to disable it.');
|
|
104
|
+
});
|
|
105
|
+
program
|
|
106
|
+
.command('setup')
|
|
107
|
+
.description('Automatically configure MCP server for Claude Code')
|
|
108
|
+
.option('--dashboard', 'Enable terminal dashboard')
|
|
109
|
+
.option('--auto-launch', 'Auto-launch Chrome if not running (default: true)')
|
|
110
|
+
.option('-s, --scope <scope>', 'Installation scope: "user" (global, default) or "project" (current project only)', 'user')
|
|
76
111
|
.action(async (options) => {
|
|
77
|
-
|
|
112
|
+
const { execSync, spawnSync } = require('child_process');
|
|
113
|
+
console.log('Setting up Claude Chrome Parallel for Claude Code...\n');
|
|
114
|
+
// Check if claude CLI is available
|
|
78
115
|
try {
|
|
79
|
-
|
|
80
|
-
console.log('\n✅ Installation complete!\n');
|
|
81
|
-
console.log('Next steps:');
|
|
82
|
-
console.log('1. Open chrome://extensions/ in Chrome');
|
|
83
|
-
console.log('2. Enable "Developer mode" (top right)');
|
|
84
|
-
console.log('3. Click "Load unpacked"');
|
|
85
|
-
console.log(`4. Select: ${getExtensionPath()}`);
|
|
86
|
-
console.log('\n5. Note the Extension ID and run:');
|
|
87
|
-
console.log(' claude-chrome-parallel install --extension-id <YOUR_ID>');
|
|
116
|
+
execSync('claude --version', { stdio: 'pipe' });
|
|
88
117
|
}
|
|
89
|
-
catch
|
|
90
|
-
console.error('❌
|
|
118
|
+
catch {
|
|
119
|
+
console.error('❌ Claude Code CLI not found.');
|
|
120
|
+
console.error(' Please install Claude Code first: https://claude.ai/code');
|
|
91
121
|
process.exit(1);
|
|
92
122
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
123
|
+
// Validate scope
|
|
124
|
+
const scope = options.scope || 'user';
|
|
125
|
+
if (scope !== 'user' && scope !== 'project') {
|
|
126
|
+
console.error('❌ Invalid scope. Use "user" (global) or "project" (current project only).');
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
// Build the serve arguments
|
|
130
|
+
const serveArgs = ['serve', '--auto-launch'];
|
|
131
|
+
if (options.dashboard) {
|
|
132
|
+
serveArgs.push('--dashboard');
|
|
133
|
+
}
|
|
134
|
+
// Remove existing configuration first (if any)
|
|
99
135
|
try {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
136
|
+
execSync('claude mcp remove claude-chrome-parallel 2>/dev/null', { stdio: 'pipe' });
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Ignore if not exists
|
|
140
|
+
}
|
|
141
|
+
// Use npx for auto-updates: every server start fetches the latest version
|
|
142
|
+
const fullCommand = `claude mcp add claude-chrome-parallel -s ${scope} -- npx -y claude-chrome-parallel ${serveArgs.join(' ')}`;
|
|
143
|
+
console.log(`Running: claude mcp add claude-chrome-parallel (scope: ${scope})...`);
|
|
144
|
+
try {
|
|
145
|
+
execSync(fullCommand, { stdio: 'inherit' });
|
|
146
|
+
console.log('\n✅ MCP server configured successfully!\n');
|
|
147
|
+
console.log(`Scope: ${scope === 'user' ? 'Global (all projects)' : 'Project (this directory only)'}\n`);
|
|
148
|
+
console.log('Auto-updates: enabled (via npx)\n');
|
|
149
|
+
console.log('Next steps:');
|
|
150
|
+
console.log(' 1. Restart Claude Code');
|
|
151
|
+
console.log(' 2. Just say "ccp" — that\'s it.\n');
|
|
152
|
+
console.log('Examples:');
|
|
153
|
+
console.log(' "ccp screenshot my Gmail"');
|
|
154
|
+
console.log(' "use ccp to check AWS billing"');
|
|
155
|
+
console.log(' "ccp search on naver.com"\n');
|
|
103
156
|
}
|
|
104
157
|
catch (error) {
|
|
105
|
-
console.error('❌
|
|
158
|
+
console.error('\n❌ Failed to configure MCP server.');
|
|
159
|
+
console.error(' You can manually add to ~/.claude.json:');
|
|
160
|
+
console.error(' {');
|
|
161
|
+
console.error(' "mcpServers": {');
|
|
162
|
+
console.error(' "claude-chrome-parallel": {');
|
|
163
|
+
console.error(' "command": "npx",');
|
|
164
|
+
console.error(` "args": ["-y", "claude-chrome-parallel", ${serveArgs.map(a => `"${a}"`).join(', ')}]`);
|
|
165
|
+
console.error(' }');
|
|
166
|
+
console.error(' }');
|
|
167
|
+
console.error(' }');
|
|
106
168
|
process.exit(1);
|
|
107
169
|
}
|
|
108
170
|
});
|
|
@@ -111,23 +173,56 @@ program
|
|
|
111
173
|
.description('Start MCP server for Claude Code')
|
|
112
174
|
.option('-p, --port <port>', 'Chrome remote debugging port', '9222')
|
|
113
175
|
.option('--auto-launch', 'Auto-launch Chrome if not running (default: false)')
|
|
176
|
+
.option('--dashboard', 'Enable terminal dashboard for real-time monitoring')
|
|
177
|
+
.option('--hybrid', 'Enable hybrid mode (Lightpanda + Chrome routing)')
|
|
178
|
+
.option('--lp-port <port>', 'Lightpanda debugging port (default: 9223)', '9223')
|
|
114
179
|
.action(async (options) => {
|
|
115
180
|
const port = parseInt(options.port, 10);
|
|
116
181
|
const autoLaunch = options.autoLaunch || false;
|
|
182
|
+
const dashboard = options.dashboard || false;
|
|
183
|
+
// Non-blocking update check (fires in background)
|
|
184
|
+
(0, update_check_1.checkForUpdates)(version).catch(() => { });
|
|
117
185
|
console.error(`[claude-chrome-parallel] Starting MCP server`);
|
|
118
186
|
console.error(`[claude-chrome-parallel] Chrome debugging port: ${port}`);
|
|
119
187
|
console.error(`[claude-chrome-parallel] Auto-launch Chrome: ${autoLaunch}`);
|
|
188
|
+
console.error(`[claude-chrome-parallel] Dashboard: ${dashboard}`);
|
|
120
189
|
// Import from built dist/ files (relative to dist/cli/)
|
|
121
190
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
122
191
|
const { setGlobalConfig } = require('../config/global');
|
|
123
192
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
124
|
-
const { getMCPServer } = require('../mcp-server');
|
|
193
|
+
const { getMCPServer, setMCPServerOptions } = require('../mcp-server');
|
|
125
194
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
126
195
|
const { registerAllTools } = require('../tools');
|
|
127
196
|
// Set global config before initializing anything
|
|
128
197
|
setGlobalConfig({ port, autoLaunch });
|
|
198
|
+
// Configure hybrid mode if enabled
|
|
199
|
+
const hybrid = options.hybrid || false;
|
|
200
|
+
const lpPort = parseInt(options.lpPort || '9223', 10);
|
|
201
|
+
if (hybrid) {
|
|
202
|
+
setGlobalConfig({
|
|
203
|
+
hybrid: {
|
|
204
|
+
enabled: true,
|
|
205
|
+
lightpandaPort: lpPort,
|
|
206
|
+
},
|
|
207
|
+
});
|
|
208
|
+
console.error(`[claude-chrome-parallel] Hybrid mode: enabled`);
|
|
209
|
+
console.error(`[claude-chrome-parallel] Lightpanda port: ${lpPort}`);
|
|
210
|
+
}
|
|
211
|
+
// Set MCP server options (including dashboard)
|
|
212
|
+
setMCPServerOptions({ dashboard });
|
|
129
213
|
const server = getMCPServer();
|
|
130
214
|
registerAllTools(server);
|
|
215
|
+
// Initialize hybrid routing if enabled
|
|
216
|
+
if (hybrid) {
|
|
217
|
+
const { getSessionManager } = require('../session-manager');
|
|
218
|
+
const sm = getSessionManager();
|
|
219
|
+
await sm.initHybrid({
|
|
220
|
+
enabled: true,
|
|
221
|
+
lightpandaPort: lpPort,
|
|
222
|
+
circuitBreaker: { maxFailures: 3, cooldownMs: 60000 },
|
|
223
|
+
cookieSync: { intervalMs: 5000 },
|
|
224
|
+
});
|
|
225
|
+
}
|
|
131
226
|
server.start();
|
|
132
227
|
});
|
|
133
228
|
program
|
|
@@ -148,24 +243,33 @@ program
|
|
|
148
243
|
.description('Check installation status')
|
|
149
244
|
.action(async () => {
|
|
150
245
|
console.log('Checking installation status...\n');
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
'
|
|
154
|
-
'Node.js version': checkNodeVersion(),
|
|
246
|
+
// Core checks (required for CDP mode)
|
|
247
|
+
const coreChecks = {
|
|
248
|
+
'Node.js version (>=18)': checkNodeVersion(),
|
|
155
249
|
'.claude.json health': await checkClaudeConfigHealth(),
|
|
250
|
+
'Chrome debugging port': await checkChromeDebugPort(),
|
|
156
251
|
};
|
|
157
|
-
|
|
252
|
+
console.log('Core Requirements:');
|
|
253
|
+
for (const [name, passed] of Object.entries(coreChecks)) {
|
|
158
254
|
const status = passed ? '✅' : '❌';
|
|
159
|
-
console.log(
|
|
255
|
+
console.log(` ${status} ${name}`);
|
|
160
256
|
}
|
|
161
|
-
const allPassed = Object.values(
|
|
257
|
+
const allPassed = Object.values(coreChecks).every(Boolean);
|
|
162
258
|
console.log();
|
|
163
259
|
if (allPassed) {
|
|
164
|
-
console.log('All checks passed!
|
|
260
|
+
console.log('All checks passed! Ready to use with Claude Code.');
|
|
261
|
+
console.log('\nUsage:');
|
|
262
|
+
console.log(' 1. Start Chrome with: chrome --remote-debugging-port=9222');
|
|
263
|
+
console.log(' 2. Add to ~/.claude.json:');
|
|
264
|
+
console.log(' "mcpServers": { "chrome-parallel": { "command": "ccp", "args": ["serve"] } }');
|
|
265
|
+
console.log(' 3. Restart Claude Code');
|
|
165
266
|
}
|
|
166
267
|
else {
|
|
167
|
-
|
|
168
|
-
|
|
268
|
+
if (!coreChecks['Chrome debugging port']) {
|
|
269
|
+
console.log('Chrome is not running with debugging port.');
|
|
270
|
+
console.log('Start Chrome with: chrome --remote-debugging-port=9222');
|
|
271
|
+
}
|
|
272
|
+
if (!coreChecks['.claude.json health']) {
|
|
169
273
|
console.log('Run "claude-chrome-parallel recover" to fix .claude.json');
|
|
170
274
|
}
|
|
171
275
|
}
|
|
@@ -578,6 +682,27 @@ function checkNodeVersion() {
|
|
|
578
682
|
const major = parseInt(version.slice(1).split('.')[0], 10);
|
|
579
683
|
return major >= 18;
|
|
580
684
|
}
|
|
685
|
+
/**
|
|
686
|
+
* Check if Chrome is running with debugging port
|
|
687
|
+
*/
|
|
688
|
+
async function checkChromeDebugPort(port = 9222) {
|
|
689
|
+
try {
|
|
690
|
+
const http = await Promise.resolve().then(() => __importStar(require('http')));
|
|
691
|
+
return new Promise((resolve) => {
|
|
692
|
+
const req = http.get(`http://localhost:${port}/json/version`, (res) => {
|
|
693
|
+
resolve(res.statusCode === 200);
|
|
694
|
+
});
|
|
695
|
+
req.on('error', () => resolve(false));
|
|
696
|
+
req.setTimeout(2000, () => {
|
|
697
|
+
req.destroy();
|
|
698
|
+
resolve(false);
|
|
699
|
+
});
|
|
700
|
+
});
|
|
701
|
+
}
|
|
702
|
+
catch {
|
|
703
|
+
return false;
|
|
704
|
+
}
|
|
705
|
+
}
|
|
581
706
|
/**
|
|
582
707
|
* Check .claude.json health
|
|
583
708
|
*/
|