claude-chrome-parallel 1.0.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 -0
- package/README.md +501 -0
- package/assets/demo.svg +278 -0
- package/dist/cdp/client.d.ts +218 -0
- package/dist/cdp/client.d.ts.map +1 -0
- package/dist/cdp/client.js +797 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/cdp/connection-pool.d.ts +125 -0
- package/dist/cdp/connection-pool.d.ts.map +1 -0
- package/dist/cdp/connection-pool.js +443 -0
- package/dist/cdp/connection-pool.js.map +1 -0
- package/dist/cdp/screenshot-scheduler.d.ts +54 -0
- package/dist/cdp/screenshot-scheduler.d.ts.map +1 -0
- package/dist/cdp/screenshot-scheduler.js +87 -0
- package/dist/cdp/screenshot-scheduler.js.map +1 -0
- package/dist/chrome/launcher.d.ts +55 -0
- package/dist/chrome/launcher.d.ts.map +1 -0
- package/dist/chrome/launcher.js +383 -0
- package/dist/chrome/launcher.js.map +1 -0
- 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.d.ts +11 -0
- package/dist/cli/claude-session.js +349 -0
- package/dist/cli/claude-session.js.map +1 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.js +858 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/install.d.ts +16 -0
- package/dist/cli/install.js +185 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/uninstall.d.ts +7 -0
- package/dist/cli/uninstall.js +126 -0
- package/dist/cli/uninstall.js.map +1 -0
- 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/config-recovery.d.ts +69 -0
- package/dist/config/config-recovery.d.ts.map +1 -0
- package/dist/config/config-recovery.js +302 -0
- package/dist/config/config-recovery.js.map +1 -0
- package/dist/config/global.d.ts +49 -0
- package/dist/config/global.d.ts.map +1 -0
- package/dist/config/global.js +24 -0
- package/dist/config/global.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +23 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/session-isolator.d.ts +76 -0
- package/dist/config/session-isolator.d.ts.map +1 -0
- package/dist/config/session-isolator.js +268 -0
- package/dist/config/session-isolator.js.map +1 -0
- package/dist/dashboard/activity-tracker.d.ts +76 -0
- package/dist/dashboard/activity-tracker.d.ts.map +1 -0
- package/dist/dashboard/activity-tracker.js +219 -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 +77 -0
- package/dist/hints/hint-engine.d.ts.map +1 -0
- package/dist/hints/hint-engine.js +191 -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 +55 -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 +89 -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.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +272 -0
- package/dist/index.js.map +1 -0
- 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 +129 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +641 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/memory/domain-memory.d.ts +68 -0
- package/dist/memory/domain-memory.d.ts.map +1 -0
- package/dist/memory/domain-memory.js +227 -0
- package/dist/memory/domain-memory.js.map +1 -0
- package/dist/orchestration/plan-executor.d.ts +19 -0
- package/dist/orchestration/plan-executor.d.ts.map +1 -0
- package/dist/orchestration/plan-executor.js +284 -0
- package/dist/orchestration/plan-executor.js.map +1 -0
- package/dist/orchestration/plan-registry.d.ts +55 -0
- package/dist/orchestration/plan-registry.d.ts.map +1 -0
- package/dist/orchestration/plan-registry.js +255 -0
- package/dist/orchestration/plan-registry.js.map +1 -0
- package/dist/orchestration/state-manager.d.ts +127 -0
- package/dist/orchestration/state-manager.d.ts.map +1 -0
- package/dist/orchestration/state-manager.js +438 -0
- package/dist/orchestration/state-manager.js.map +1 -0
- package/dist/orchestration/workflow-engine.d.ts +162 -0
- package/dist/orchestration/workflow-engine.d.ts.map +1 -0
- package/dist/orchestration/workflow-engine.js +731 -0
- package/dist/orchestration/workflow-engine.js.map +1 -0
- 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 +251 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +912 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/tools/batch-execute.d.ts +11 -0
- package/dist/tools/batch-execute.d.ts.map +1 -0
- package/dist/tools/batch-execute.js +226 -0
- package/dist/tools/batch-execute.js.map +1 -0
- 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 +455 -0
- package/dist/tools/click-element.js.map +1 -0
- package/dist/tools/computer.d.ts +6 -0
- package/dist/tools/computer.d.ts.map +1 -0
- package/dist/tools/computer.js +638 -0
- package/dist/tools/computer.js.map +1 -0
- 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 +6 -0
- package/dist/tools/find.d.ts.map +1 -0
- package/dist/tools/find.js +330 -0
- package/dist/tools/find.js.map +1 -0
- package/dist/tools/form-input.d.ts +6 -0
- package/dist/tools/form-input.d.ts.map +1 -0
- package/dist/tools/form-input.js +181 -0
- package/dist/tools/form-input.js.map +1 -0
- 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 +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +104 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/javascript.d.ts +6 -0
- package/dist/tools/javascript.d.ts.map +1 -0
- package/dist/tools/javascript.js +138 -0
- package/dist/tools/javascript.js.map +1 -0
- package/dist/tools/lightweight-scroll.d.ts +11 -0
- package/dist/tools/lightweight-scroll.d.ts.map +1 -0
- package/dist/tools/lightweight-scroll.js +266 -0
- package/dist/tools/lightweight-scroll.js.map +1 -0
- package/dist/tools/memory.d.ts +10 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +141 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/navigate.d.ts +6 -0
- package/dist/tools/navigate.d.ts.map +1 -0
- package/dist/tools/navigate.js +241 -0
- package/dist/tools/navigate.js.map +1 -0
- package/dist/tools/network.d.ts +6 -0
- package/dist/tools/network.d.ts.map +1 -0
- package/dist/tools/network.js +215 -0
- package/dist/tools/network.js.map +1 -0
- package/dist/tools/orchestration.d.ts +6 -0
- package/dist/tools/orchestration.d.ts.map +1 -0
- package/dist/tools/orchestration.js +746 -0
- package/dist/tools/orchestration.js.map +1 -0
- 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 +6 -0
- package/dist/tools/read-page.d.ts.map +1 -0
- package/dist/tools/read-page.js +287 -0
- package/dist/tools/read-page.js.map +1 -0
- 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/shutdown.d.ts +12 -0
- package/dist/tools/shutdown.d.ts.map +1 -0
- package/dist/tools/shutdown.js +120 -0
- package/dist/tools/shutdown.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.d.ts +6 -0
- package/dist/tools/tabs-context.d.ts.map +1 -0
- package/dist/tools/tabs-context.js +92 -0
- package/dist/tools/tabs-context.js.map +1 -0
- package/dist/tools/tabs-create.d.ts +6 -0
- package/dist/tools/tabs-create.d.ts.map +1 -0
- package/dist/tools/tabs-create.js +73 -0
- package/dist/tools/tabs-create.js.map +1 -0
- 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/worker-create.d.ts +7 -0
- package/dist/tools/worker-create.d.ts.map +1 -0
- package/dist/tools/worker-create.js +62 -0
- package/dist/tools/worker-create.js.map +1 -0
- package/dist/tools/worker-delete.d.ts +6 -0
- package/dist/tools/worker-delete.d.ts.map +1 -0
- package/dist/tools/worker-delete.js +80 -0
- package/dist/tools/worker-delete.js.map +1 -0
- package/dist/tools/worker-list.d.ts +6 -0
- package/dist/tools/worker-list.d.ts.map +1 -0
- package/dist/tools/worker-list.js +67 -0
- package/dist/tools/worker-list.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/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +19 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +54 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +14 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/plan-cache.d.ts +121 -0
- package/dist/types/plan-cache.d.ts.map +1 -0
- package/dist/types/plan-cache.js +9 -0
- package/dist/types/plan-cache.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 +65 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +6 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/tool-manifest.d.ts +52 -0
- package/dist/types/tool-manifest.d.ts.map +1 -0
- package/dist/types/tool-manifest.js +37 -0
- package/dist/types/tool-manifest.js.map +1 -0
- package/dist/utils/atomic-file.d.ts +50 -0
- package/dist/utils/atomic-file.d.ts.map +1 -0
- package/dist/utils/atomic-file.js +217 -0
- package/dist/utils/atomic-file.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +22 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json-validator.d.ts +40 -0
- package/dist/utils/json-validator.d.ts.map +1 -0
- package/dist/utils/json-validator.js +295 -0
- package/dist/utils/json-validator.js.map +1 -0
- package/dist/utils/ref-id-manager.d.ts +26 -0
- package/dist/utils/ref-id-manager.d.ts.map +1 -0
- package/dist/utils/ref-id-manager.js +81 -0
- package/dist/utils/ref-id-manager.js.map +1 -0
- package/dist/utils/request-queue.d.ts +37 -0
- package/dist/utils/request-queue.d.ts.map +1 -0
- package/dist/utils/request-queue.js +110 -0
- package/dist/utils/request-queue.js.map +1 -0
- package/package.json +78 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ChromePool - Manages multiple Chrome instances on different ports
|
|
4
|
+
* to solve the CDP same-origin renderer process contention issue.
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.ChromePool = void 0;
|
|
41
|
+
exports.getChromePool = getChromePool;
|
|
42
|
+
const http = __importStar(require("http"));
|
|
43
|
+
const launcher_1 = require("./launcher");
|
|
44
|
+
const DEFAULT_POOL_CONFIG = {
|
|
45
|
+
maxInstances: 5,
|
|
46
|
+
basePort: 9222,
|
|
47
|
+
autoLaunch: false,
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* Check if a Chrome debug port is responding
|
|
51
|
+
*/
|
|
52
|
+
async function checkDebugPort(port) {
|
|
53
|
+
return new Promise((resolve) => {
|
|
54
|
+
const req = http.request({
|
|
55
|
+
hostname: '127.0.0.1',
|
|
56
|
+
port,
|
|
57
|
+
path: '/json/version',
|
|
58
|
+
method: 'GET',
|
|
59
|
+
timeout: 2000,
|
|
60
|
+
}, (res) => {
|
|
61
|
+
let data = '';
|
|
62
|
+
res.on('data', (chunk) => (data += chunk));
|
|
63
|
+
res.on('end', () => {
|
|
64
|
+
try {
|
|
65
|
+
JSON.parse(data);
|
|
66
|
+
resolve(true);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
resolve(false);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
req.on('error', () => resolve(false));
|
|
74
|
+
req.on('timeout', () => {
|
|
75
|
+
req.destroy();
|
|
76
|
+
resolve(false);
|
|
77
|
+
});
|
|
78
|
+
req.end();
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Fetch cookies from a Chrome instance via CDP HTTP API
|
|
83
|
+
*/
|
|
84
|
+
async function fetchCookies(port, domain) {
|
|
85
|
+
return new Promise((resolve) => {
|
|
86
|
+
// Get list of tabs to find a usable websocket target
|
|
87
|
+
const req = http.request({
|
|
88
|
+
hostname: '127.0.0.1',
|
|
89
|
+
port,
|
|
90
|
+
path: '/json',
|
|
91
|
+
method: 'GET',
|
|
92
|
+
timeout: 3000,
|
|
93
|
+
}, (res) => {
|
|
94
|
+
let data = '';
|
|
95
|
+
res.on('data', (chunk) => (data += chunk));
|
|
96
|
+
res.on('end', () => {
|
|
97
|
+
try {
|
|
98
|
+
const tabs = JSON.parse(data);
|
|
99
|
+
resolve(tabs); // caller handles further CDP calls
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
resolve([]);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
req.on('error', () => resolve([]));
|
|
107
|
+
req.on('timeout', () => {
|
|
108
|
+
req.destroy();
|
|
109
|
+
resolve([]);
|
|
110
|
+
});
|
|
111
|
+
req.end();
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
class ChromePool {
|
|
115
|
+
config;
|
|
116
|
+
instances = new Map();
|
|
117
|
+
constructor(config = {}) {
|
|
118
|
+
this.config = { ...DEFAULT_POOL_CONFIG, ...config };
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Acquire a Chrome instance that does NOT already have a tab open to the given origin.
|
|
122
|
+
* If all instances have the origin, launch a new one (up to maxInstances).
|
|
123
|
+
*/
|
|
124
|
+
async acquireInstance(origin) {
|
|
125
|
+
// 1. Find an existing instance that does NOT have this origin
|
|
126
|
+
for (const [, instance] of this.instances) {
|
|
127
|
+
if (!instance.origins.has(origin)) {
|
|
128
|
+
instance.origins.add(origin);
|
|
129
|
+
instance.tabCount++;
|
|
130
|
+
console.error(`[ChromePool] Assigned origin "${origin}" to existing instance on port ${instance.port}`);
|
|
131
|
+
return instance;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// 2. All existing instances have this origin — try to launch a new one
|
|
135
|
+
if (this.instances.size < this.config.maxInstances) {
|
|
136
|
+
const newInstance = await this.launchNewInstance();
|
|
137
|
+
newInstance.origins.add(origin);
|
|
138
|
+
newInstance.tabCount++;
|
|
139
|
+
console.error(`[ChromePool] Launched new instance on port ${newInstance.port} for origin "${origin}"`);
|
|
140
|
+
return newInstance;
|
|
141
|
+
}
|
|
142
|
+
// 3. At capacity — fall back to the instance with the fewest tabs
|
|
143
|
+
console.error(`[ChromePool] At max capacity (${this.config.maxInstances}). ` +
|
|
144
|
+
`Assigning "${origin}" to least-loaded instance.`);
|
|
145
|
+
let leastLoaded = null;
|
|
146
|
+
for (const [, instance] of this.instances) {
|
|
147
|
+
if (!leastLoaded || instance.tabCount < leastLoaded.tabCount) {
|
|
148
|
+
leastLoaded = instance;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (!leastLoaded) {
|
|
152
|
+
throw new Error('[ChromePool] No instances available');
|
|
153
|
+
}
|
|
154
|
+
leastLoaded.origins.add(origin);
|
|
155
|
+
leastLoaded.tabCount++;
|
|
156
|
+
return leastLoaded;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Mark that an origin is no longer using a port.
|
|
160
|
+
*/
|
|
161
|
+
releaseInstance(port, origin) {
|
|
162
|
+
const instance = this.instances.get(port);
|
|
163
|
+
if (!instance) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const removed = instance.origins.delete(origin);
|
|
167
|
+
if (removed && instance.tabCount > 0) {
|
|
168
|
+
instance.tabCount--;
|
|
169
|
+
}
|
|
170
|
+
console.error(`[ChromePool] Released origin "${origin}" from port ${port}. ` +
|
|
171
|
+
`Remaining origins: ${instance.tabCount}`);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get the current instance assignment for an origin.
|
|
175
|
+
* Returns the first instance that has this origin registered, or null.
|
|
176
|
+
*/
|
|
177
|
+
getInstanceForOrigin(origin) {
|
|
178
|
+
for (const [, instance] of this.instances) {
|
|
179
|
+
if (instance.origins.has(origin)) {
|
|
180
|
+
return instance;
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Copy cookies between two Chrome instances for a given domain.
|
|
187
|
+
* Uses CDP Network.getAllCookies / Network.setCookies via WebSocket.
|
|
188
|
+
* This is a best-effort operation; failures are logged but not thrown.
|
|
189
|
+
*/
|
|
190
|
+
async copyCookiesBetweenInstances(sourcePort, destPort, domain) {
|
|
191
|
+
const sourceInstance = this.instances.get(sourcePort);
|
|
192
|
+
const destInstance = this.instances.get(destPort);
|
|
193
|
+
if (!sourceInstance || !destInstance) {
|
|
194
|
+
console.error(`[ChromePool] copyCookies: instance not found (source=${sourcePort}, dest=${destPort})`);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
try {
|
|
198
|
+
// Retrieve tab list from source to find a WS target for CDP
|
|
199
|
+
const tabs = await fetchCookies(sourcePort, domain);
|
|
200
|
+
if (!Array.isArray(tabs) || tabs.length === 0) {
|
|
201
|
+
console.error(`[ChromePool] copyCookies: no tabs found on source port ${sourcePort}`);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// Use the first available tab's WebSocket URL for CDP
|
|
205
|
+
const firstTab = tabs[0];
|
|
206
|
+
const wsUrl = firstTab.webSocketDebuggerUrl;
|
|
207
|
+
if (!wsUrl) {
|
|
208
|
+
console.error(`[ChromePool] copyCookies: no WebSocket URL on source port ${sourcePort}`);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
console.error(`[ChromePool] Cookie bridging from port ${sourcePort} to ${destPort} for domain "${domain}" ` +
|
|
212
|
+
`requires a CDP WebSocket client. Skipping (implement via CDP client if needed).`);
|
|
213
|
+
// Full cookie bridging requires a CDP WebSocket connection. The CDP client
|
|
214
|
+
// in this project (src/cdp/client.ts) should be used here. Left as a
|
|
215
|
+
// hook for integration — callers with a live CDP session can transfer
|
|
216
|
+
// cookies directly via Network.getAllCookies / Network.setCookies.
|
|
217
|
+
}
|
|
218
|
+
catch (err) {
|
|
219
|
+
console.error(`[ChromePool] copyCookies error:`, err);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Close all instances we launched (not pre-existing ones).
|
|
224
|
+
*/
|
|
225
|
+
async cleanup() {
|
|
226
|
+
const closurePromises = [];
|
|
227
|
+
for (const [port, instance] of this.instances) {
|
|
228
|
+
if (!instance.isPreExisting) {
|
|
229
|
+
console.error(`[ChromePool] Closing launched instance on port ${port}`);
|
|
230
|
+
closurePromises.push(instance.launcher.close());
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
console.error(`[ChromePool] Skipping pre-existing instance on port ${port}`);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
await Promise.all(closurePromises);
|
|
237
|
+
this.instances.clear();
|
|
238
|
+
console.error('[ChromePool] Cleanup complete.');
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Get all current pool instances (read-only snapshot).
|
|
242
|
+
*/
|
|
243
|
+
getInstances() {
|
|
244
|
+
return this.instances;
|
|
245
|
+
}
|
|
246
|
+
// ---------------------------------------------------------------------------
|
|
247
|
+
// Private helpers
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
async launchNewInstance() {
|
|
250
|
+
const port = this.nextAvailablePort();
|
|
251
|
+
const launcher = new launcher_1.ChromeLauncher(port);
|
|
252
|
+
const launchOptions = {
|
|
253
|
+
port,
|
|
254
|
+
autoLaunch: this.config.autoLaunch,
|
|
255
|
+
};
|
|
256
|
+
let isPreExisting = false;
|
|
257
|
+
// Check if something is already on this port
|
|
258
|
+
const alreadyRunning = await checkDebugPort(port);
|
|
259
|
+
if (alreadyRunning) {
|
|
260
|
+
console.error(`[ChromePool] Port ${port} already has Chrome running — treating as pre-existing.`);
|
|
261
|
+
isPreExisting = true;
|
|
262
|
+
// Still call ensureChrome so launcher caches the instance reference
|
|
263
|
+
await launcher.ensureChrome(launchOptions);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
await launcher.ensureChrome(launchOptions);
|
|
267
|
+
}
|
|
268
|
+
const pooled = {
|
|
269
|
+
port,
|
|
270
|
+
launcher,
|
|
271
|
+
origins: new Set(),
|
|
272
|
+
tabCount: 0,
|
|
273
|
+
isPreExisting,
|
|
274
|
+
};
|
|
275
|
+
this.instances.set(port, pooled);
|
|
276
|
+
return pooled;
|
|
277
|
+
}
|
|
278
|
+
nextAvailablePort() {
|
|
279
|
+
// Find the next port not already in use by our pool
|
|
280
|
+
for (let offset = 0; offset < this.config.maxInstances + 10; offset++) {
|
|
281
|
+
const candidate = this.config.basePort + offset;
|
|
282
|
+
if (!this.instances.has(candidate)) {
|
|
283
|
+
return candidate;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// Fallback: use a high ephemeral port
|
|
287
|
+
return this.config.basePort + this.instances.size;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
exports.ChromePool = ChromePool;
|
|
291
|
+
// ---------------------------------------------------------------------------
|
|
292
|
+
// Singleton
|
|
293
|
+
// ---------------------------------------------------------------------------
|
|
294
|
+
let poolInstance = null;
|
|
295
|
+
function getChromePool(config) {
|
|
296
|
+
if (!poolInstance) {
|
|
297
|
+
poolInstance = new ChromePool(config);
|
|
298
|
+
}
|
|
299
|
+
return poolInstance;
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../src/chrome/pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chrome Profile Detector - Detects and manages Chrome profiles
|
|
3
|
+
*/
|
|
4
|
+
import { ChromeProfile, ProfileListResult, LocalState } from '../types/profile';
|
|
5
|
+
/**
|
|
6
|
+
* Get Chrome user data directory path for the current platform
|
|
7
|
+
*/
|
|
8
|
+
export declare function getChromeUserDataDir(platform?: NodeJS.Platform): string;
|
|
9
|
+
/**
|
|
10
|
+
* Check if a profile is currently in use by checking lock files
|
|
11
|
+
*
|
|
12
|
+
* Chrome uses different lock mechanisms on different platforms:
|
|
13
|
+
* - Linux: SingletonLock (symlink)
|
|
14
|
+
* - macOS/Windows: lockfile
|
|
15
|
+
*/
|
|
16
|
+
export declare function isProfileInUse(profilePath: string): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Parse Chrome's Local State file
|
|
19
|
+
*/
|
|
20
|
+
export declare function parseLocalState(userDataDir: string): Promise<LocalState | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Get metadata for a specific profile
|
|
23
|
+
*/
|
|
24
|
+
export declare function getProfileMetadata(profilePath: string, localState: LocalState | null): Promise<Partial<ChromeProfile>>;
|
|
25
|
+
/**
|
|
26
|
+
* Detect all Chrome profiles
|
|
27
|
+
*/
|
|
28
|
+
export declare function detectProfiles(options?: {
|
|
29
|
+
userDataDir?: string;
|
|
30
|
+
}): Promise<ProfileListResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Get a specific profile by ID
|
|
33
|
+
*/
|
|
34
|
+
export declare function getProfile(profileId: string, options?: {
|
|
35
|
+
userDataDir?: string;
|
|
36
|
+
}): Promise<ChromeProfile | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Profile detector singleton
|
|
39
|
+
*/
|
|
40
|
+
declare class ProfileDetector {
|
|
41
|
+
private cache;
|
|
42
|
+
private cacheTime;
|
|
43
|
+
private cacheTTL;
|
|
44
|
+
getProfiles(options?: {
|
|
45
|
+
userDataDir?: string;
|
|
46
|
+
refresh?: boolean;
|
|
47
|
+
}): Promise<ProfileListResult>;
|
|
48
|
+
clearCache(): void;
|
|
49
|
+
}
|
|
50
|
+
export declare function getProfileDetector(): ProfileDetector;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=profile-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-detector.d.ts","sourceRoot":"","sources":["../../src/chrome/profile-detector.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,UAAU,EAEX,MAAM,kBAAkB,CAAC;AAE1B;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAuBvE;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA+B1E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAcrF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,UAAU,GAAG,IAAI,GAC5B,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAyCjC;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmD7B;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACjC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAG/B;AAED;;GAEG;AACH,cAAM,eAAe;IACnB,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,QAAQ,CAAgB;IAE1B,WAAW,CAAC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsBpG,UAAU,IAAI,IAAI;CAInB;AAKD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD"}
|
|
@@ -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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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Claude Session - Standalone wrapper for running Claude Code in isolated environments
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* claude-session [claude-args...] - Start Claude Code with isolated config
|
|
7
|
+
* claude-session --list - List active sessions
|
|
8
|
+
* claude-session --cleanup - Clean up stale sessions
|
|
9
|
+
* claude-session --recover - Recover corrupted .claude.json
|
|
10
|
+
*/
|
|
11
|
+
export {};
|