@iflow-mcp/shaun0927-openchrome 1.7.13
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 +387 -0
- package/assets/chart-tokens.svg +42 -0
- package/assets/demo.svg +278 -0
- package/assets/mascot.png +0 -0
- package/dist/cdp/client.d.ts +265 -0
- package/dist/cdp/client.d.ts.map +1 -0
- package/dist/cdp/client.js +1419 -0
- package/dist/cdp/client.js.map +1 -0
- package/dist/cdp/connection-pool.d.ts +117 -0
- package/dist/cdp/connection-pool.d.ts.map +1 -0
- package/dist/cdp/connection-pool.js +421 -0
- package/dist/cdp/connection-pool.js.map +1 -0
- package/dist/cdp/screenshot-scheduler.d.ts +55 -0
- package/dist/cdp/screenshot-scheduler.d.ts.map +1 -0
- package/dist/cdp/screenshot-scheduler.js +121 -0
- package/dist/cdp/screenshot-scheduler.js.map +1 -0
- package/dist/chrome/launcher.d.ts +113 -0
- package/dist/chrome/launcher.d.ts.map +1 -0
- package/dist/chrome/launcher.js +850 -0
- package/dist/chrome/launcher.js.map +1 -0
- package/dist/chrome/pool.d.ts +43 -0
- package/dist/chrome/pool.d.ts.map +1 -0
- package/dist/chrome/pool.js +219 -0
- package/dist/chrome/pool.js.map +1 -0
- package/dist/chrome/profile-manager.d.ts +156 -0
- package/dist/chrome/profile-manager.d.ts.map +1 -0
- package/dist/chrome/profile-manager.js +558 -0
- package/dist/chrome/profile-manager.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 +1013 -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 +10 -0
- package/dist/cli/update-check.js +187 -0
- package/dist/cli/update-check.js.map +1 -0
- package/dist/compression/snapshot-store.d.ts +54 -0
- package/dist/compression/snapshot-store.d.ts.map +1 -0
- package/dist/compression/snapshot-store.js +183 -0
- package/dist/compression/snapshot-store.js.map +1 -0
- package/dist/config/defaults.d.ts +102 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +102 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/global.d.ts +81 -0
- package/dist/config/global.d.ts.map +1 -0
- package/dist/config/global.js +30 -0
- package/dist/config/global.js.map +1 -0
- package/dist/config/index.d.ts +16 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +21 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/tool-tiers.d.ts +14 -0
- package/dist/config/tool-tiers.d.ts.map +1 -0
- package/dist/config/tool-tiers.js +69 -0
- package/dist/config/tool-tiers.js.map +1 -0
- package/dist/dashboard/activity-tracker.d.ts +95 -0
- package/dist/dashboard/activity-tracker.d.ts.map +1 -0
- package/dist/dashboard/activity-tracker.js +275 -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 +413 -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 +230 -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 +74 -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/dom/dom-serializer.d.ts +37 -0
- package/dist/dom/dom-serializer.d.ts.map +1 -0
- package/dist/dom/dom-serializer.js +429 -0
- package/dist/dom/dom-serializer.js.map +1 -0
- package/dist/dom/index.d.ts +2 -0
- package/dist/dom/index.d.ts.map +1 -0
- package/dist/dom/index.js +6 -0
- package/dist/dom/index.js.map +1 -0
- package/dist/errors/timeout.d.ts +20 -0
- package/dist/errors/timeout.d.ts.map +1 -0
- package/dist/errors/timeout.js +41 -0
- package/dist/errors/timeout.js.map +1 -0
- package/dist/hints/hint-engine.d.ts +117 -0
- package/dist/hints/hint-engine.d.ts.map +1 -0
- package/dist/hints/hint-engine.js +347 -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/progress-tracker.d.ts +44 -0
- package/dist/hints/progress-tracker.d.ts.map +1 -0
- package/dist/hints/progress-tracker.js +118 -0
- package/dist/hints/progress-tracker.js.map +1 -0
- package/dist/hints/rules/blocking-page.d.ts +8 -0
- package/dist/hints/rules/blocking-page.d.ts.map +1 -0
- package/dist/hints/rules/blocking-page.js +58 -0
- package/dist/hints/rules/blocking-page.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 +138 -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 +59 -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/pagination-detection.d.ts +7 -0
- package/dist/hints/rules/pagination-detection.d.ts.map +1 -0
- package/dist/hints/rules/pagination-detection.js +220 -0
- package/dist/hints/rules/pagination-detection.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 +271 -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 +99 -0
- package/dist/hints/rules/sequence-detection.js.map +1 -0
- package/dist/hints/rules/setup-hints.d.ts +6 -0
- package/dist/hints/rules/setup-hints.d.ts.map +1 -0
- package/dist/hints/rules/setup-hints.js +24 -0
- package/dist/hints/rules/setup-hints.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 +74 -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 +357 -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 +210 -0
- package/dist/lightpanda/launcher.js.map +1 -0
- package/dist/mcp-server.d.ts +154 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +962 -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 +224 -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 +276 -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 +256 -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 +748 -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 +123 -0
- package/dist/resources/usage-guide.js.map +1 -0
- package/dist/router/browser-router.d.ts +47 -0
- package/dist/router/browser-router.d.ts.map +1 -0
- package/dist/router/browser-router.js +157 -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 +89 -0
- package/dist/router/tool-routing-registry.js.map +1 -0
- package/dist/security/audit-logger.d.ts +2 -0
- package/dist/security/audit-logger.d.ts.map +1 -0
- package/dist/security/audit-logger.js +109 -0
- package/dist/security/audit-logger.js.map +1 -0
- package/dist/security/domain-guard.d.ts +11 -0
- package/dist/security/domain-guard.d.ts.map +1 -0
- package/dist/security/domain-guard.js +98 -0
- package/dist/security/domain-guard.js.map +1 -0
- package/dist/session-manager.d.ts +325 -0
- package/dist/session-manager.d.ts.map +1 -0
- package/dist/session-manager.js +1402 -0
- package/dist/session-manager.js.map +1 -0
- package/dist/storage-state/index.d.ts +2 -0
- package/dist/storage-state/index.d.ts.map +1 -0
- package/dist/storage-state/index.js +6 -0
- package/dist/storage-state/index.js.map +1 -0
- package/dist/storage-state/storage-state-manager.d.ts +52 -0
- package/dist/storage-state/storage-state-manager.d.ts.map +1 -0
- package/dist/storage-state/storage-state-manager.js +135 -0
- package/dist/storage-state/storage-state-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 +218 -0
- package/dist/tools/batch-execute.js.map +1 -0
- package/dist/tools/batch-paginate.d.ts +10 -0
- package/dist/tools/batch-paginate.d.ts.map +1 -0
- package/dist/tools/batch-paginate.js +436 -0
- package/dist/tools/batch-paginate.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 +281 -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 +832 -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 +380 -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 +366 -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 +263 -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 +219 -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 +224 -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 +311 -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 +163 -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 +219 -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 +170 -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 +132 -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 +107 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/inspect.d.ts +12 -0
- package/dist/tools/inspect.d.ts.map +1 -0
- package/dist/tools/inspect.js +483 -0
- package/dist/tools/inspect.js.map +1 -0
- package/dist/tools/interact.d.ts +9 -0
- package/dist/tools/interact.d.ts.map +1 -0
- package/dist/tools/interact.js +366 -0
- package/dist/tools/interact.js.map +1 -0
- package/dist/tools/javascript.d.ts +7 -0
- package/dist/tools/javascript.d.ts.map +1 -0
- package/dist/tools/javascript.js +214 -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 +314 -0
- package/dist/tools/lightweight-scroll.js.map +1 -0
- package/dist/tools/list-profiles.d.ts +10 -0
- package/dist/tools/list-profiles.d.ts.map +1 -0
- package/dist/tools/list-profiles.js +79 -0
- package/dist/tools/list-profiles.js.map +1 -0
- package/dist/tools/memory.d.ts +13 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +159 -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 +422 -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 +229 -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 +735 -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 +129 -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 +268 -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 +91 -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 +154 -0
- package/dist/tools/performance-metrics.js.map +1 -0
- package/dist/tools/profile-status.d.ts +10 -0
- package/dist/tools/profile-status.d.ts.map +1 -0
- package/dist/tools/profile-status.js +108 -0
- package/dist/tools/profile-status.js.map +1 -0
- package/dist/tools/query-dom.d.ts +8 -0
- package/dist/tools/query-dom.d.ts.map +1 -0
- package/dist/tools/query-dom.js +647 -0
- package/dist/tools/query-dom.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 +544 -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 +537 -0
- package/dist/tools/request-intercept.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 +124 -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 +262 -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 +117 -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 +90 -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 +126 -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 +165 -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 +290 -0
- package/dist/tools/wait-for.js.map +1 -0
- package/dist/tools/worker.d.ts +8 -0
- package/dist/tools/worker.d.ts.map +1 -0
- package/dist/tools/worker.js +160 -0
- package/dist/tools/worker.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 +63 -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/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/adaptive-screenshot.d.ts +57 -0
- package/dist/utils/adaptive-screenshot.d.ts.map +1 -0
- package/dist/utils/adaptive-screenshot.js +126 -0
- package/dist/utils/adaptive-screenshot.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/dom-delta.d.ts +36 -0
- package/dist/utils/dom-delta.d.ts.map +1 -0
- package/dist/utils/dom-delta.js +314 -0
- package/dist/utils/dom-delta.js.map +1 -0
- package/dist/utils/element-discovery.d.ts +115 -0
- package/dist/utils/element-discovery.d.ts.map +1 -0
- package/dist/utils/element-discovery.js +519 -0
- package/dist/utils/element-discovery.js.map +1 -0
- package/dist/utils/element-finder.d.ts +49 -0
- package/dist/utils/element-finder.d.ts.map +1 -0
- package/dist/utils/element-finder.js +130 -0
- package/dist/utils/element-finder.js.map +1 -0
- package/dist/utils/format-age.d.ts +5 -0
- package/dist/utils/format-age.d.ts.map +1 -0
- package/dist/utils/format-age.js +15 -0
- package/dist/utils/format-age.js.map +1 -0
- package/dist/utils/format-error.d.ts +5 -0
- package/dist/utils/format-error.d.ts.map +1 -0
- package/dist/utils/format-error.js +10 -0
- package/dist/utils/format-error.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +23 -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/page-diagnostics.d.ts +23 -0
- package/dist/utils/page-diagnostics.d.ts.map +1 -0
- package/dist/utils/page-diagnostics.js +95 -0
- package/dist/utils/page-diagnostics.js.map +1 -0
- package/dist/utils/pagination-detector.d.ts +22 -0
- package/dist/utils/pagination-detector.d.ts.map +1 -0
- package/dist/utils/pagination-detector.js +292 -0
- package/dist/utils/pagination-detector.js.map +1 -0
- package/dist/utils/pid-manager.d.ts +6 -0
- package/dist/utils/pid-manager.d.ts.map +1 -0
- package/dist/utils/pid-manager.js +135 -0
- package/dist/utils/pid-manager.js.map +1 -0
- package/dist/utils/puppeteer-helpers.d.ts +8 -0
- package/dist/utils/puppeteer-helpers.d.ts.map +1 -0
- package/dist/utils/puppeteer-helpers.js +12 -0
- package/dist/utils/puppeteer-helpers.js.map +1 -0
- package/dist/utils/ref-id-manager.d.ts +72 -0
- package/dist/utils/ref-id-manager.d.ts.map +1 -0
- package/dist/utils/ref-id-manager.js +325 -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 +114 -0
- package/dist/utils/request-queue.js.map +1 -0
- package/dist/utils/retry-with-fallback.d.ts +18 -0
- package/dist/utils/retry-with-fallback.d.ts.map +1 -0
- package/dist/utils/retry-with-fallback.js +39 -0
- package/dist/utils/retry-with-fallback.js.map +1 -0
- package/dist/utils/safe-title.d.ts +10 -0
- package/dist/utils/safe-title.d.ts.map +1 -0
- package/dist/utils/safe-title.js +24 -0
- package/dist/utils/safe-title.js.map +1 -0
- package/dist/utils/schema-validator.d.ts +12 -0
- package/dist/utils/schema-validator.d.ts.map +1 -0
- package/dist/utils/schema-validator.js +70 -0
- package/dist/utils/schema-validator.js.map +1 -0
- package/dist/utils/shadow-dom.d.ts +114 -0
- package/dist/utils/shadow-dom.d.ts.map +1 -0
- package/dist/utils/shadow-dom.js +385 -0
- package/dist/utils/shadow-dom.js.map +1 -0
- package/dist/utils/smart-goto.d.ts +39 -0
- package/dist/utils/smart-goto.d.ts.map +1 -0
- package/dist/utils/smart-goto.js +134 -0
- package/dist/utils/smart-goto.js.map +1 -0
- package/dist/utils/url-utils.d.ts +5 -0
- package/dist/utils/url-utils.d.ts.map +1 -0
- package/dist/utils/url-utils.js +15 -0
- package/dist/utils/url-utils.js.map +1 -0
- package/dist/utils/visual-summary.d.ts +17 -0
- package/dist/utils/visual-summary.d.ts.map +1 -0
- package/dist/utils/visual-summary.js +215 -0
- package/dist/utils/visual-summary.js.map +1 -0
- package/dist/utils/with-timeout.d.ts +5 -0
- package/dist/utils/with-timeout.d.ts.map +1 -0
- package/dist/utils/with-timeout.js +15 -0
- package/dist/utils/with-timeout.js.map +1 -0
- package/dist/version.d.ts +5 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +22 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* CLI Entry Point for openchrome
|
|
5
|
+
* MCP Server for parallel Claude Code browser sessions
|
|
6
|
+
*
|
|
7
|
+
* Uses puppeteer-core to directly connect to Chrome DevTools Protocol,
|
|
8
|
+
* enabling multiple Claude Code sessions to control Chrome simultaneously.
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
const commander_1 = require("commander");
|
|
12
|
+
const mcp_server_1 = require("./mcp-server");
|
|
13
|
+
const tools_1 = require("./tools");
|
|
14
|
+
const global_1 = require("./config/global");
|
|
15
|
+
const pid_manager_1 = require("./utils/pid-manager");
|
|
16
|
+
const version_1 = require("./version");
|
|
17
|
+
// Prevent silent crashes from unhandled promise rejections in background tasks
|
|
18
|
+
process.on('unhandledRejection', (reason) => {
|
|
19
|
+
console.error('[openchrome] Unhandled promise rejection:', reason);
|
|
20
|
+
});
|
|
21
|
+
process.on('uncaughtException', (error) => {
|
|
22
|
+
console.error('[openchrome] Uncaught exception:', error);
|
|
23
|
+
process.exit(1);
|
|
24
|
+
});
|
|
25
|
+
const program = new commander_1.Command();
|
|
26
|
+
program
|
|
27
|
+
.name('openchrome')
|
|
28
|
+
.description('MCP server for parallel Claude Code browser sessions')
|
|
29
|
+
.version((0, version_1.getVersion)());
|
|
30
|
+
program
|
|
31
|
+
.command('serve')
|
|
32
|
+
.description('Start the MCP server')
|
|
33
|
+
.option('-p, --port <port>', 'Chrome remote debugging port', '9222')
|
|
34
|
+
.option('--auto-launch', 'Auto-launch Chrome if not running (default: false)')
|
|
35
|
+
.option('--user-data-dir <dir>', 'Chrome user data directory (default: real Chrome profile on macOS)')
|
|
36
|
+
.option('--profile-directory <name>', 'Chrome profile directory name (e.g., "Profile 1", "Default")')
|
|
37
|
+
.option('--chrome-binary <path>', 'Path to Chrome binary (e.g., chrome-headless-shell)')
|
|
38
|
+
.option('--headless-shell', 'Use chrome-headless-shell if available (default: false)')
|
|
39
|
+
.option('--visible', 'Show Chrome window (default: headless when auto-launch)')
|
|
40
|
+
.option('--restart-chrome', 'Quit running Chrome to reuse real profile (default: uses temp profile)')
|
|
41
|
+
.option('--hybrid', 'Enable hybrid mode (Lightpanda + Chrome routing)')
|
|
42
|
+
.option('--lp-port <port>', 'Lightpanda debugging port (default: 9223)', '9223')
|
|
43
|
+
.option('--blocked-domains <domains>', 'Comma-separated list of blocked domains (e.g., "*.bank.com,mail.google.com")')
|
|
44
|
+
.option('--audit-log', 'Enable security audit logging (default: false)')
|
|
45
|
+
.option('--all-tools', 'Expose all tools from startup (bypass progressive disclosure)')
|
|
46
|
+
.option('--server-mode', 'Server/headless mode: auto-launch headless Chrome, skip cookie bridge')
|
|
47
|
+
.action(async (options) => {
|
|
48
|
+
const port = parseInt(options.port, 10);
|
|
49
|
+
let autoLaunch = options.autoLaunch || false;
|
|
50
|
+
// Server mode forces headless + auto-launch + no cookie bridge
|
|
51
|
+
if (options.serverMode) {
|
|
52
|
+
autoLaunch = true;
|
|
53
|
+
if (options.visible) {
|
|
54
|
+
console.error('[openchrome] Warning: --visible ignored in server mode (headless forced)');
|
|
55
|
+
}
|
|
56
|
+
options.visible = false;
|
|
57
|
+
console.error('[openchrome] Server mode: enabled (headless, no cookie bridge)');
|
|
58
|
+
}
|
|
59
|
+
const userDataDir = options.userDataDir || process.env.CHROME_USER_DATA_DIR || undefined;
|
|
60
|
+
const profileDirectory = options.profileDirectory || process.env.CHROME_PROFILE_DIRECTORY || undefined;
|
|
61
|
+
const chromeBinary = options.chromeBinary || process.env.CHROME_BINARY || undefined;
|
|
62
|
+
const useHeadlessShell = options.headlessShell || false;
|
|
63
|
+
const restartChrome = options.restartChrome || false;
|
|
64
|
+
console.error(`[openchrome] Starting MCP server`);
|
|
65
|
+
console.error(`[openchrome] Chrome debugging port: ${port}`);
|
|
66
|
+
console.error(`[openchrome] Auto-launch Chrome: ${autoLaunch}`);
|
|
67
|
+
if (userDataDir) {
|
|
68
|
+
console.error(`[openchrome] User data dir: ${userDataDir}`);
|
|
69
|
+
}
|
|
70
|
+
if (profileDirectory) {
|
|
71
|
+
console.error(`[openchrome] Profile directory: ${profileDirectory}`);
|
|
72
|
+
}
|
|
73
|
+
if (chromeBinary) {
|
|
74
|
+
console.error(`[openchrome] Chrome binary: ${chromeBinary}`);
|
|
75
|
+
}
|
|
76
|
+
if (useHeadlessShell) {
|
|
77
|
+
console.error(`[openchrome] Using headless-shell mode`);
|
|
78
|
+
}
|
|
79
|
+
// Headless by default when auto-launching, unless --visible is specified
|
|
80
|
+
const headless = autoLaunch && !options.visible;
|
|
81
|
+
if (autoLaunch) {
|
|
82
|
+
console.error(`[openchrome] Headless mode: ${headless}`);
|
|
83
|
+
}
|
|
84
|
+
// Set global config before initializing anything
|
|
85
|
+
(0, global_1.setGlobalConfig)({ port, autoLaunch, userDataDir, profileDirectory, chromeBinary, useHeadlessShell, headless, restartChrome });
|
|
86
|
+
if (restartChrome) {
|
|
87
|
+
console.error(`[openchrome] Restart Chrome mode: enabled (will quit existing Chrome)`);
|
|
88
|
+
}
|
|
89
|
+
// Apply server mode config (skip cookie bridge)
|
|
90
|
+
if (options.serverMode) {
|
|
91
|
+
(0, global_1.setGlobalConfig)({ skipCookieBridge: true });
|
|
92
|
+
}
|
|
93
|
+
// Configure hybrid mode if enabled
|
|
94
|
+
const hybrid = options.hybrid || false;
|
|
95
|
+
const lpPort = parseInt(options.lpPort || '9223', 10);
|
|
96
|
+
if (hybrid) {
|
|
97
|
+
(0, global_1.setGlobalConfig)({
|
|
98
|
+
hybrid: {
|
|
99
|
+
enabled: true,
|
|
100
|
+
lightpandaPort: lpPort,
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
console.error(`[openchrome] Hybrid mode: enabled`);
|
|
104
|
+
console.error(`[openchrome] Lightpanda port: ${lpPort}`);
|
|
105
|
+
}
|
|
106
|
+
// Configure domain blocklist if provided
|
|
107
|
+
if (options.blockedDomains) {
|
|
108
|
+
const blockedList = options.blockedDomains.split(',').map((d) => d.trim()).filter(Boolean);
|
|
109
|
+
const existing = (0, global_1.getGlobalConfig)().security || {};
|
|
110
|
+
(0, global_1.setGlobalConfig)({
|
|
111
|
+
security: { ...existing, blocked_domains: blockedList },
|
|
112
|
+
});
|
|
113
|
+
console.error(`[openchrome] Blocked domains: ${blockedList.join(', ')}`);
|
|
114
|
+
}
|
|
115
|
+
// Configure audit logging if enabled
|
|
116
|
+
if (options.auditLog) {
|
|
117
|
+
const existing = (0, global_1.getGlobalConfig)().security || {};
|
|
118
|
+
(0, global_1.setGlobalConfig)({
|
|
119
|
+
security: { ...existing, audit_log: true },
|
|
120
|
+
});
|
|
121
|
+
console.error('[openchrome] Audit logging: enabled');
|
|
122
|
+
}
|
|
123
|
+
// Tool tier configuration
|
|
124
|
+
const envTier = parseInt(process.env.OPENCHROME_TOOL_TIER || '', 10);
|
|
125
|
+
if (options.allTools || envTier >= 3) {
|
|
126
|
+
(0, mcp_server_1.setMCPServerOptions)({ initialToolTier: 3 });
|
|
127
|
+
console.error('[openchrome] All tools exposed from startup');
|
|
128
|
+
}
|
|
129
|
+
else if (envTier === 2) {
|
|
130
|
+
(0, mcp_server_1.setMCPServerOptions)({ initialToolTier: 2 });
|
|
131
|
+
console.error('[openchrome] Tier 2 tools exposed from startup');
|
|
132
|
+
}
|
|
133
|
+
const server = (0, mcp_server_1.getMCPServer)();
|
|
134
|
+
(0, tools_1.registerAllTools)(server);
|
|
135
|
+
// Write PID file for zombie process detection
|
|
136
|
+
(0, pid_manager_1.writePidFile)(port);
|
|
137
|
+
// Register signal handlers for graceful shutdown
|
|
138
|
+
const shutdown = async (signal) => {
|
|
139
|
+
console.error(`[openchrome] Received ${signal}, shutting down...`);
|
|
140
|
+
await server.stop();
|
|
141
|
+
process.exit(0);
|
|
142
|
+
};
|
|
143
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
144
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
145
|
+
// Windows: closing the console window sends CTRL_CLOSE_EVENT mapped to SIGHUP by libuv.
|
|
146
|
+
// Node.js will be force-killed by Windows ~5-10s later; shutdown() is best-effort.
|
|
147
|
+
if (process.platform === 'win32') {
|
|
148
|
+
process.on('SIGHUP', () => shutdown('SIGHUP'));
|
|
149
|
+
}
|
|
150
|
+
server.start();
|
|
151
|
+
});
|
|
152
|
+
program
|
|
153
|
+
.command('check')
|
|
154
|
+
.description('Check Chrome connection status')
|
|
155
|
+
.option('-p, --port <port>', 'Chrome remote debugging port', '9222')
|
|
156
|
+
.action(async (options) => {
|
|
157
|
+
const port = parseInt(options.port, 10);
|
|
158
|
+
console.log('=== OpenChrome Status ===\n');
|
|
159
|
+
// Check Chrome
|
|
160
|
+
let chromeConnected = false;
|
|
161
|
+
try {
|
|
162
|
+
const response = await fetch(`http://localhost:${port}/json/version`);
|
|
163
|
+
const data = (await response.json());
|
|
164
|
+
console.log(`Chrome (port ${port}): ✓ Connected`);
|
|
165
|
+
console.log(` Browser: ${data.Browser}`);
|
|
166
|
+
console.log(` WebSocket: ${data.webSocketDebuggerUrl}`);
|
|
167
|
+
chromeConnected = true;
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
console.log(`Chrome (port ${port}): ✗ Not connected`);
|
|
171
|
+
}
|
|
172
|
+
console.log('\n=== Instructions ===\n');
|
|
173
|
+
if (!chromeConnected) {
|
|
174
|
+
console.log('Start Chrome with debugging enabled:');
|
|
175
|
+
console.log(` chrome --remote-debugging-port=${port}\n`);
|
|
176
|
+
console.log('Or let openchrome auto-launch Chrome.\n');
|
|
177
|
+
}
|
|
178
|
+
if (chromeConnected) {
|
|
179
|
+
console.log('Chrome is ready! Add to your Claude Code MCP config:\n');
|
|
180
|
+
console.log(JSON.stringify({
|
|
181
|
+
"mcpServers": {
|
|
182
|
+
"openchrome": {
|
|
183
|
+
"command": "openchrome",
|
|
184
|
+
"args": ["serve"]
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}, null, 2));
|
|
188
|
+
}
|
|
189
|
+
process.exit(chromeConnected ? 0 : 1);
|
|
190
|
+
});
|
|
191
|
+
program
|
|
192
|
+
.command('verify')
|
|
193
|
+
.description('Verify performance optimizations are working')
|
|
194
|
+
.option('-p, --port <port>', 'Chrome remote debugging port', '9222')
|
|
195
|
+
.action(async (options) => {
|
|
196
|
+
const port = parseInt(options.port, 10);
|
|
197
|
+
console.log('=== OpenChrome - Optimization Verification ===\n');
|
|
198
|
+
let passed = 0;
|
|
199
|
+
let failed = 0;
|
|
200
|
+
let skipped = 0;
|
|
201
|
+
// 1. Check Chrome connection
|
|
202
|
+
try {
|
|
203
|
+
const response = await fetch(`http://localhost:${port}/json/version`);
|
|
204
|
+
const data = await response.json();
|
|
205
|
+
console.log(`✓ Chrome connected: ${data.Browser}`);
|
|
206
|
+
passed++;
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
console.log('✗ Chrome not connected - start Chrome with --remote-debugging-port=' + port);
|
|
210
|
+
console.log('\nCannot proceed without Chrome. Exiting.\n');
|
|
211
|
+
process.exit(1);
|
|
212
|
+
}
|
|
213
|
+
// 2. Verify launch flags (check Chrome command line)
|
|
214
|
+
try {
|
|
215
|
+
const response = await fetch(`http://localhost:${port}/json/version`);
|
|
216
|
+
const versionData = await response.json();
|
|
217
|
+
// Check if we launched Chrome (not user's existing instance)
|
|
218
|
+
const commandLine = versionData['Protocol-Version'] ? 'available' : 'unknown';
|
|
219
|
+
console.log(`✓ Chrome DevTools Protocol: ${commandLine}`);
|
|
220
|
+
passed++;
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
console.log('⚠ Could not verify protocol version');
|
|
224
|
+
skipped++;
|
|
225
|
+
}
|
|
226
|
+
// 3. Verify WebP screenshot support
|
|
227
|
+
try {
|
|
228
|
+
// Import dynamically to avoid loading everything
|
|
229
|
+
const puppeteer = require('puppeteer-core');
|
|
230
|
+
const browser = await puppeteer.connect({
|
|
231
|
+
browserURL: `http://localhost:${port}`,
|
|
232
|
+
defaultViewport: null,
|
|
233
|
+
});
|
|
234
|
+
const page = await browser.newPage();
|
|
235
|
+
await page.goto('about:blank');
|
|
236
|
+
// Test WebP screenshot
|
|
237
|
+
const webpBuffer = await page.screenshot({ type: 'webp', quality: 80, encoding: 'base64' });
|
|
238
|
+
const pngBuffer = await page.screenshot({ type: 'png', encoding: 'base64' });
|
|
239
|
+
const webpSize = webpBuffer.length;
|
|
240
|
+
const pngSize = pngBuffer.length;
|
|
241
|
+
const ratio = (pngSize / webpSize).toFixed(1);
|
|
242
|
+
console.log(`✓ WebP screenshots: ${ratio}x smaller (WebP: ${(webpSize / 1024).toFixed(1)}KB vs PNG: ${(pngSize / 1024).toFixed(1)}KB)`);
|
|
243
|
+
passed++;
|
|
244
|
+
// 4. Verify GC command support
|
|
245
|
+
try {
|
|
246
|
+
const client = await page.createCDPSession();
|
|
247
|
+
await client.send('HeapProfiler.collectGarbage');
|
|
248
|
+
console.log('✓ Forced GC (HeapProfiler.collectGarbage): supported');
|
|
249
|
+
passed++;
|
|
250
|
+
await client.detach();
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
console.log('⚠ Forced GC: not supported by this Chrome version');
|
|
254
|
+
skipped++;
|
|
255
|
+
}
|
|
256
|
+
// 5. Verify page creation speed (simulates pool benefit)
|
|
257
|
+
const startTime = Date.now();
|
|
258
|
+
const testPage = await browser.newPage();
|
|
259
|
+
const createTime = Date.now() - startTime;
|
|
260
|
+
await testPage.close();
|
|
261
|
+
console.log(`✓ Page creation: ${createTime}ms`);
|
|
262
|
+
passed++;
|
|
263
|
+
// 6. Check memory stats
|
|
264
|
+
try {
|
|
265
|
+
const response = await fetch(`http://localhost:${port}/json`);
|
|
266
|
+
const targets = await response.json();
|
|
267
|
+
const pageCount = targets.filter((t) => t.type === 'page').length;
|
|
268
|
+
console.log(`✓ Active targets: ${pageCount} pages`);
|
|
269
|
+
passed++;
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
console.log('⚠ Could not check active targets');
|
|
273
|
+
skipped++;
|
|
274
|
+
}
|
|
275
|
+
await page.close();
|
|
276
|
+
browser.disconnect();
|
|
277
|
+
}
|
|
278
|
+
catch (error) {
|
|
279
|
+
console.log(`✗ Browser verification failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
280
|
+
failed++;
|
|
281
|
+
}
|
|
282
|
+
// Summary
|
|
283
|
+
console.log(`\n=== Results: ${passed} passed, ${failed} failed, ${skipped} skipped ===`);
|
|
284
|
+
if (failed === 0) {
|
|
285
|
+
console.log('\nAll optimizations verified! Performance features are active.\n');
|
|
286
|
+
console.log('Optimization summary:');
|
|
287
|
+
console.log(' • WebP screenshots (3-5x smaller)');
|
|
288
|
+
console.log(' • Cookie bridge caching (30s TTL)');
|
|
289
|
+
console.log(' • Forced GC on tab close');
|
|
290
|
+
console.log(' • Memory-saving Chrome flags');
|
|
291
|
+
console.log(' • Find tool batched CDP calls');
|
|
292
|
+
console.log(' • Connection pool (pre-warmed pages)');
|
|
293
|
+
}
|
|
294
|
+
process.exit(failed > 0 ? 1 : 0);
|
|
295
|
+
});
|
|
296
|
+
program
|
|
297
|
+
.command('info')
|
|
298
|
+
.description('Show how it works')
|
|
299
|
+
.action(() => {
|
|
300
|
+
console.log(`
|
|
301
|
+
=== OpenChrome ===
|
|
302
|
+
|
|
303
|
+
Enables multiple Claude Code sessions to control Chrome simultaneously
|
|
304
|
+
without "Detached" errors.
|
|
305
|
+
|
|
306
|
+
HOW IT WORKS:
|
|
307
|
+
|
|
308
|
+
Claude Code 1 ──► puppeteer process 1 ──► CDP connection 1 ──┐
|
|
309
|
+
├──► Chrome
|
|
310
|
+
Claude Code 2 ──► puppeteer process 2 ──► CDP connection 2 ──┘
|
|
311
|
+
|
|
312
|
+
Each Claude Code session gets its own:
|
|
313
|
+
- Independent MCP server process
|
|
314
|
+
- Separate Chrome DevTools Protocol connection
|
|
315
|
+
- Isolated browser tabs
|
|
316
|
+
|
|
317
|
+
WHY NO "DETACHED" ERRORS:
|
|
318
|
+
|
|
319
|
+
Unlike the Chrome extension (which shares state),
|
|
320
|
+
each puppeteer-core process maintains its own CDP connection.
|
|
321
|
+
Chrome handles multiple CDP connections natively.
|
|
322
|
+
|
|
323
|
+
TESTED CONCURRENCY:
|
|
324
|
+
|
|
325
|
+
✓ 20+ simultaneous sessions confirmed working
|
|
326
|
+
|
|
327
|
+
USAGE:
|
|
328
|
+
|
|
329
|
+
# Check Chrome status
|
|
330
|
+
openchrome check
|
|
331
|
+
|
|
332
|
+
# Start Chrome with debugging enabled (required unless --auto-launch)
|
|
333
|
+
chrome --remote-debugging-port=9222
|
|
334
|
+
|
|
335
|
+
# Add to ~/.claude/.mcp.json
|
|
336
|
+
{
|
|
337
|
+
"mcpServers": {
|
|
338
|
+
"openchrome": {
|
|
339
|
+
"command": "openchrome",
|
|
340
|
+
"args": ["serve"]
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
# Or with auto-launch (Chrome starts automatically)
|
|
346
|
+
{
|
|
347
|
+
"mcpServers": {
|
|
348
|
+
"openchrome": {
|
|
349
|
+
"command": "openchrome",
|
|
350
|
+
"args": ["serve", "--auto-launch"]
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
`);
|
|
355
|
+
});
|
|
356
|
+
program.parse();
|
|
357
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightpanda Launcher - Manages the Lightpanda browser process lifecycle
|
|
3
|
+
*/
|
|
4
|
+
import type { Browser } from 'puppeteer-core';
|
|
5
|
+
export interface LightpandaLauncherConfig {
|
|
6
|
+
port: number;
|
|
7
|
+
binaryPath?: string;
|
|
8
|
+
startupTimeoutMs?: number;
|
|
9
|
+
healthCheckIntervalMs?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare class LightpandaLauncher {
|
|
12
|
+
private process;
|
|
13
|
+
private port;
|
|
14
|
+
private binaryPath;
|
|
15
|
+
private startupTimeoutMs;
|
|
16
|
+
private healthCheckIntervalMs;
|
|
17
|
+
private _isRunning;
|
|
18
|
+
private browser;
|
|
19
|
+
constructor(config: LightpandaLauncherConfig);
|
|
20
|
+
/**
|
|
21
|
+
* Start Lightpanda process on the configured port
|
|
22
|
+
*/
|
|
23
|
+
start(): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Stop the Lightpanda process
|
|
26
|
+
*/
|
|
27
|
+
stop(): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Check if Lightpanda is running
|
|
30
|
+
*/
|
|
31
|
+
isRunning(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Get the port Lightpanda is running on
|
|
34
|
+
*/
|
|
35
|
+
getPort(): number;
|
|
36
|
+
/**
|
|
37
|
+
* Connect via puppeteer-core and return Browser instance
|
|
38
|
+
*/
|
|
39
|
+
connect(): Promise<Browser>;
|
|
40
|
+
/**
|
|
41
|
+
* Disconnect browser (without stopping process)
|
|
42
|
+
*/
|
|
43
|
+
disconnect(): Promise<void>;
|
|
44
|
+
/**
|
|
45
|
+
* Get the connected browser instance
|
|
46
|
+
*/
|
|
47
|
+
getBrowser(): Browser | null;
|
|
48
|
+
/**
|
|
49
|
+
* Health check - verify Lightpanda is responsive
|
|
50
|
+
*/
|
|
51
|
+
private healthCheck;
|
|
52
|
+
/**
|
|
53
|
+
* Wait for Lightpanda to become ready using setInterval-based polling.
|
|
54
|
+
* Compatible with jest fake timers.
|
|
55
|
+
*/
|
|
56
|
+
private waitForReady;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/lightpanda/launcher.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,OAAO,CAAwB;gBAE3B,MAAM,EAAE,wBAAwB;IAO5C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA6C3B;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,OAAO,IAAI,MAAM;IAIjB;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAOjC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;OAEG;IACH,UAAU,IAAI,OAAO,GAAG,IAAI;IAI5B;;OAEG;YACW,WAAW;IASzB;;;OAGG;IACH,OAAO,CAAC,YAAY;CAoCrB"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Lightpanda Launcher - Manages the Lightpanda browser process lifecycle
|
|
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.LightpandaLauncher = void 0;
|
|
40
|
+
const child_process_1 = require("child_process");
|
|
41
|
+
const puppeteer = __importStar(require("puppeteer-core"));
|
|
42
|
+
class LightpandaLauncher {
|
|
43
|
+
process = null;
|
|
44
|
+
port;
|
|
45
|
+
binaryPath;
|
|
46
|
+
startupTimeoutMs;
|
|
47
|
+
healthCheckIntervalMs;
|
|
48
|
+
_isRunning = false;
|
|
49
|
+
browser = null;
|
|
50
|
+
constructor(config) {
|
|
51
|
+
this.port = config.port;
|
|
52
|
+
this.binaryPath = config.binaryPath ?? (process.platform === 'win32' ? 'lightpanda.exe' : 'lightpanda');
|
|
53
|
+
this.startupTimeoutMs = config.startupTimeoutMs ?? 10000;
|
|
54
|
+
this.healthCheckIntervalMs = config.healthCheckIntervalMs ?? 500;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Start Lightpanda process on the configured port
|
|
58
|
+
*/
|
|
59
|
+
async start() {
|
|
60
|
+
if (this._isRunning) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
this.process = (0, child_process_1.spawn)(this.binaryPath, ['--port', String(this.port)], {
|
|
64
|
+
stdio: ['ignore', 'ignore', 'ignore'],
|
|
65
|
+
shell: process.platform === 'win32',
|
|
66
|
+
});
|
|
67
|
+
this.process.on('exit', () => {
|
|
68
|
+
this._isRunning = false;
|
|
69
|
+
this.process = null;
|
|
70
|
+
});
|
|
71
|
+
await this.waitForReady();
|
|
72
|
+
this._isRunning = true;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Stop the Lightpanda process
|
|
76
|
+
*/
|
|
77
|
+
async stop() {
|
|
78
|
+
if (!this.process || !this._isRunning) {
|
|
79
|
+
this._isRunning = false;
|
|
80
|
+
this.process = null;
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const proc = this.process;
|
|
84
|
+
this._isRunning = false;
|
|
85
|
+
this.process = null;
|
|
86
|
+
await new Promise((resolve) => {
|
|
87
|
+
const killTimer = setTimeout(() => {
|
|
88
|
+
try {
|
|
89
|
+
// On Windows, SIGKILL is not supported; use default kill (TerminateProcess)
|
|
90
|
+
if (process.platform === 'win32') {
|
|
91
|
+
proc.kill();
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
proc.kill('SIGKILL');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// ignore
|
|
99
|
+
}
|
|
100
|
+
resolve();
|
|
101
|
+
}, 5000);
|
|
102
|
+
proc.once('exit', () => {
|
|
103
|
+
clearTimeout(killTimer);
|
|
104
|
+
resolve();
|
|
105
|
+
});
|
|
106
|
+
try {
|
|
107
|
+
// On Windows, SIGTERM is not supported; use default kill which calls TerminateProcess
|
|
108
|
+
if (process.platform === 'win32') {
|
|
109
|
+
proc.kill();
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
proc.kill('SIGTERM');
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
clearTimeout(killTimer);
|
|
117
|
+
resolve();
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check if Lightpanda is running
|
|
123
|
+
*/
|
|
124
|
+
isRunning() {
|
|
125
|
+
return this._isRunning;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get the port Lightpanda is running on
|
|
129
|
+
*/
|
|
130
|
+
getPort() {
|
|
131
|
+
return this.port;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Connect via puppeteer-core and return Browser instance
|
|
135
|
+
*/
|
|
136
|
+
async connect() {
|
|
137
|
+
this.browser = await puppeteer.connect({
|
|
138
|
+
browserWSEndpoint: `ws://localhost:${this.port}`,
|
|
139
|
+
});
|
|
140
|
+
return this.browser;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Disconnect browser (without stopping process)
|
|
144
|
+
*/
|
|
145
|
+
async disconnect() {
|
|
146
|
+
if (this.browser) {
|
|
147
|
+
await this.browser.disconnect();
|
|
148
|
+
this.browser = null;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get the connected browser instance
|
|
153
|
+
*/
|
|
154
|
+
getBrowser() {
|
|
155
|
+
return this.browser;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Health check - verify Lightpanda is responsive
|
|
159
|
+
*/
|
|
160
|
+
async healthCheck() {
|
|
161
|
+
try {
|
|
162
|
+
await fetch(`http://localhost:${this.port}/json/version`);
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Wait for Lightpanda to become ready using setInterval-based polling.
|
|
171
|
+
* Compatible with jest fake timers.
|
|
172
|
+
*/
|
|
173
|
+
waitForReady() {
|
|
174
|
+
return new Promise((resolve, reject) => {
|
|
175
|
+
const startTime = Date.now();
|
|
176
|
+
let settled = false;
|
|
177
|
+
const intervalId = setInterval(() => {
|
|
178
|
+
if (settled)
|
|
179
|
+
return;
|
|
180
|
+
if (Date.now() - startTime >= this.startupTimeoutMs) {
|
|
181
|
+
settled = true;
|
|
182
|
+
clearInterval(intervalId);
|
|
183
|
+
reject(new Error(`Lightpanda not ready: timed out after ${this.startupTimeoutMs}ms`));
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
this.healthCheck().then((ok) => {
|
|
187
|
+
if (settled)
|
|
188
|
+
return;
|
|
189
|
+
if (ok) {
|
|
190
|
+
settled = true;
|
|
191
|
+
clearInterval(intervalId);
|
|
192
|
+
resolve();
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}, this.healthCheckIntervalMs);
|
|
196
|
+
// Also check immediately (before first interval fires)
|
|
197
|
+
this.healthCheck().then((ok) => {
|
|
198
|
+
if (settled)
|
|
199
|
+
return;
|
|
200
|
+
if (ok) {
|
|
201
|
+
settled = true;
|
|
202
|
+
clearInterval(intervalId);
|
|
203
|
+
resolve();
|
|
204
|
+
}
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
exports.LightpandaLauncher = LightpandaLauncher;
|
|
210
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/lightpanda/launcher.ts"],"names":[],"mappings":"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"}
|