devharness 0.8.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 +185 -0
- package/build/atomic-write.d.ts +28 -0
- package/build/atomic-write.d.ts.map +1 -0
- package/build/atomic-write.js +126 -0
- package/build/atomic-write.js.map +1 -0
- package/build/cdp-manager.d.ts +524 -0
- package/build/cdp-manager.d.ts.map +1 -0
- package/build/cdp-manager.js +1828 -0
- package/build/cdp-manager.js.map +1 -0
- package/build/cdp-manager.test.d.ts +6 -0
- package/build/cdp-manager.test.d.ts.map +1 -0
- package/build/cdp-manager.test.js +546 -0
- package/build/cdp-manager.test.js.map +1 -0
- package/build/chrome-launcher.d.ts +400 -0
- package/build/chrome-launcher.d.ts.map +1 -0
- package/build/chrome-launcher.js +1071 -0
- package/build/chrome-launcher.js.map +1 -0
- package/build/chrome-launcher.test.d.ts +11 -0
- package/build/chrome-launcher.test.d.ts.map +1 -0
- package/build/chrome-launcher.test.js +204 -0
- package/build/chrome-launcher.test.js.map +1 -0
- package/build/clickable-cache.d.ts +73 -0
- package/build/clickable-cache.d.ts.map +1 -0
- package/build/clickable-cache.js +90 -0
- package/build/clickable-cache.js.map +1 -0
- package/build/command-recorder.d.ts +401 -0
- package/build/command-recorder.d.ts.map +1 -0
- package/build/command-recorder.js +701 -0
- package/build/command-recorder.js.map +1 -0
- package/build/config.d.ts +390 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +826 -0
- package/build/config.js.map +1 -0
- package/build/config.test.d.ts +2 -0
- package/build/config.test.d.ts.map +1 -0
- package/build/config.test.js +112 -0
- package/build/config.test.js.map +1 -0
- package/build/connection-manager.d.ts +159 -0
- package/build/connection-manager.d.ts.map +1 -0
- package/build/connection-manager.js +432 -0
- package/build/connection-manager.js.map +1 -0
- package/build/connection-manager.test.d.ts +11 -0
- package/build/connection-manager.test.d.ts.map +1 -0
- package/build/connection-manager.test.js +114 -0
- package/build/connection-manager.test.js.map +1 -0
- package/build/console-monitor.d.ts +150 -0
- package/build/console-monitor.d.ts.map +1 -0
- package/build/console-monitor.js +454 -0
- package/build/console-monitor.js.map +1 -0
- package/build/dashboard/bundle.js +1 -0
- package/build/dashboard/dashboard-client.d.ts +42 -0
- package/build/dashboard/dashboard-client.d.ts.map +1 -0
- package/build/dashboard/dashboard-client.js +184 -0
- package/build/dashboard/dashboard-client.js.map +1 -0
- package/build/dashboard/dashboard-hub.d.ts +50 -0
- package/build/dashboard/dashboard-hub.d.ts.map +1 -0
- package/build/dashboard/dashboard-hub.js +654 -0
- package/build/dashboard/dashboard-hub.js.map +1 -0
- package/build/dashboard/hub-lock.d.ts +16 -0
- package/build/dashboard/hub-lock.d.ts.map +1 -0
- package/build/dashboard/hub-lock.js +77 -0
- package/build/dashboard/hub-lock.js.map +1 -0
- package/build/dashboard/index.d.ts +25 -0
- package/build/dashboard/index.d.ts.map +1 -0
- package/build/dashboard/index.js +77 -0
- package/build/dashboard/index.js.map +1 -0
- package/build/dashboard/types.d.ts +83 -0
- package/build/dashboard/types.d.ts.map +1 -0
- package/build/dashboard/types.js +6 -0
- package/build/dashboard/types.js.map +1 -0
- package/build/debug-logger.d.ts +85 -0
- package/build/debug-logger.d.ts.map +1 -0
- package/build/debug-logger.js +195 -0
- package/build/debug-logger.js.map +1 -0
- package/build/debugger-aware-wrapper.d.ts +37 -0
- package/build/debugger-aware-wrapper.d.ts.map +1 -0
- package/build/debugger-aware-wrapper.js +128 -0
- package/build/debugger-aware-wrapper.js.map +1 -0
- package/build/dom-change-monitor.d.ts +92 -0
- package/build/dom-change-monitor.d.ts.map +1 -0
- package/build/dom-change-monitor.js +437 -0
- package/build/dom-change-monitor.js.map +1 -0
- package/build/element-collector.d.ts +16 -0
- package/build/element-collector.d.ts.map +1 -0
- package/build/element-collector.js +207 -0
- package/build/element-collector.js.map +1 -0
- package/build/error-helpers.d.ts +43 -0
- package/build/error-helpers.d.ts.map +1 -0
- package/build/error-helpers.js +143 -0
- package/build/error-helpers.js.map +1 -0
- package/build/formatters/console-formatter.d.ts +160 -0
- package/build/formatters/console-formatter.d.ts.map +1 -0
- package/build/formatters/console-formatter.js +338 -0
- package/build/formatters/console-formatter.js.map +1 -0
- package/build/helpers/parser-plugins.d.ts +44 -0
- package/build/helpers/parser-plugins.d.ts.map +1 -0
- package/build/helpers/parser-plugins.js +102 -0
- package/build/helpers/parser-plugins.js.map +1 -0
- package/build/helpers/paths.d.ts +79 -0
- package/build/helpers/paths.d.ts.map +1 -0
- package/build/helpers/paths.js +168 -0
- package/build/helpers/paths.js.map +1 -0
- package/build/helpers/process-liveness.d.ts +24 -0
- package/build/helpers/process-liveness.d.ts.map +1 -0
- package/build/helpers/process-liveness.js +36 -0
- package/build/helpers/process-liveness.js.map +1 -0
- package/build/helpers/process-liveness.test.d.ts +2 -0
- package/build/helpers/process-liveness.test.d.ts.map +1 -0
- package/build/helpers/process-liveness.test.js +40 -0
- package/build/helpers/process-liveness.test.js.map +1 -0
- package/build/helpers/sequence-tree.d.ts +27 -0
- package/build/helpers/sequence-tree.d.ts.map +1 -0
- package/build/helpers/sequence-tree.js +80 -0
- package/build/helpers/sequence-tree.js.map +1 -0
- package/build/helpers/sequence-tree.test.d.ts +2 -0
- package/build/helpers/sequence-tree.test.d.ts.map +1 -0
- package/build/helpers/sequence-tree.test.js +122 -0
- package/build/helpers/sequence-tree.test.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +2007 -0
- package/build/index.js.map +1 -0
- package/build/interaction-recorder.d.ts +214 -0
- package/build/interaction-recorder.d.ts.map +1 -0
- package/build/interaction-recorder.js +2007 -0
- package/build/interaction-recorder.js.map +1 -0
- package/build/issue-tracker.d.ts +107 -0
- package/build/issue-tracker.d.ts.map +1 -0
- package/build/issue-tracker.js +582 -0
- package/build/issue-tracker.js.map +1 -0
- package/build/issue-tracker.test.d.ts +2 -0
- package/build/issue-tracker.test.d.ts.map +1 -0
- package/build/issue-tracker.test.js +88 -0
- package/build/issue-tracker.test.js.map +1 -0
- package/build/launch-chrome-port.test.d.ts +14 -0
- package/build/launch-chrome-port.test.d.ts.map +1 -0
- package/build/launch-chrome-port.test.js +97 -0
- package/build/launch-chrome-port.test.js.map +1 -0
- package/build/log-processor/orchestrator.d.ts +32 -0
- package/build/log-processor/orchestrator.d.ts.map +1 -0
- package/build/log-processor/orchestrator.js +27 -0
- package/build/log-processor/orchestrator.js.map +1 -0
- package/build/logpoint-execution-tracker.d.ts +57 -0
- package/build/logpoint-execution-tracker.d.ts.map +1 -0
- package/build/logpoint-execution-tracker.js +112 -0
- package/build/logpoint-execution-tracker.js.map +1 -0
- package/build/mcp-supervisor.d.ts +3 -0
- package/build/mcp-supervisor.d.ts.map +1 -0
- package/build/mcp-supervisor.js +211 -0
- package/build/mcp-supervisor.js.map +1 -0
- package/build/messages.d.ts +165 -0
- package/build/messages.d.ts.map +1 -0
- package/build/messages.js +574 -0
- package/build/messages.js.map +1 -0
- package/build/network-monitor.d.ts +172 -0
- package/build/network-monitor.d.ts.map +1 -0
- package/build/network-monitor.js +350 -0
- package/build/network-monitor.js.map +1 -0
- package/build/overlays.d.ts +49 -0
- package/build/overlays.d.ts.map +1 -0
- package/build/overlays.js +409 -0
- package/build/overlays.js.map +1 -0
- package/build/persistent-profiles.test.d.ts +15 -0
- package/build/persistent-profiles.test.d.ts.map +1 -0
- package/build/persistent-profiles.test.js +470 -0
- package/build/persistent-profiles.test.js.map +1 -0
- package/build/port-reserver.d.ts +32 -0
- package/build/port-reserver.d.ts.map +1 -0
- package/build/port-reserver.js +118 -0
- package/build/port-reserver.js.map +1 -0
- package/build/puppeteer-manager.d.ts +47 -0
- package/build/puppeteer-manager.d.ts.map +1 -0
- package/build/puppeteer-manager.js +116 -0
- package/build/puppeteer-manager.js.map +1 -0
- package/build/recording-coverage.test.d.ts +12 -0
- package/build/recording-coverage.test.d.ts.map +1 -0
- package/build/recording-coverage.test.js +72 -0
- package/build/recording-coverage.test.js.map +1 -0
- package/build/reference-validator.d.ts +47 -0
- package/build/reference-validator.d.ts.map +1 -0
- package/build/reference-validator.js +86 -0
- package/build/reference-validator.js.map +1 -0
- package/build/reference-validator.test.d.ts +5 -0
- package/build/reference-validator.test.d.ts.map +1 -0
- package/build/reference-validator.test.js +243 -0
- package/build/reference-validator.test.js.map +1 -0
- package/build/replay-cursor.d.ts +27 -0
- package/build/replay-cursor.d.ts.map +1 -0
- package/build/replay-cursor.js +240 -0
- package/build/replay-cursor.js.map +1 -0
- package/build/runners/docker-compose-runner.d.ts +69 -0
- package/build/runners/docker-compose-runner.d.ts.map +1 -0
- package/build/runners/docker-compose-runner.js +438 -0
- package/build/runners/docker-compose-runner.js.map +1 -0
- package/build/runners/docker-runner.d.ts +65 -0
- package/build/runners/docker-runner.d.ts.map +1 -0
- package/build/runners/docker-runner.js +414 -0
- package/build/runners/docker-runner.js.map +1 -0
- package/build/runners/index.d.ts +19 -0
- package/build/runners/index.d.ts.map +1 -0
- package/build/runners/index.js +35 -0
- package/build/runners/index.js.map +1 -0
- package/build/runners/native-runner.d.ts +95 -0
- package/build/runners/native-runner.d.ts.map +1 -0
- package/build/runners/native-runner.js +370 -0
- package/build/runners/native-runner.js.map +1 -0
- package/build/runners/types.d.ts +147 -0
- package/build/runners/types.d.ts.map +1 -0
- package/build/runners/types.js +25 -0
- package/build/runners/types.js.map +1 -0
- package/build/self-restart.d.ts +12 -0
- package/build/self-restart.d.ts.map +1 -0
- package/build/self-restart.js +41 -0
- package/build/self-restart.js.map +1 -0
- package/build/self-restart.test.d.ts +2 -0
- package/build/self-restart.test.d.ts.map +1 -0
- package/build/self-restart.test.js +34 -0
- package/build/self-restart.test.js.map +1 -0
- package/build/server-claims.d.ts +161 -0
- package/build/server-claims.d.ts.map +1 -0
- package/build/server-claims.js +382 -0
- package/build/server-claims.js.map +1 -0
- package/build/server-claims.test.d.ts +2 -0
- package/build/server-claims.test.d.ts.map +1 -0
- package/build/server-claims.test.js +197 -0
- package/build/server-claims.test.js.map +1 -0
- package/build/server-manager.d.ts +438 -0
- package/build/server-manager.d.ts.map +1 -0
- package/build/server-manager.js +1674 -0
- package/build/server-manager.js.map +1 -0
- package/build/server-manager.test.d.ts +17 -0
- package/build/server-manager.test.d.ts.map +1 -0
- package/build/server-manager.test.js +122 -0
- package/build/server-manager.test.js.map +1 -0
- package/build/server-ownership.test.d.ts +2 -0
- package/build/server-ownership.test.d.ts.map +1 -0
- package/build/server-ownership.test.js +238 -0
- package/build/server-ownership.test.js.map +1 -0
- package/build/server-watcher.d.ts +21 -0
- package/build/server-watcher.d.ts.map +1 -0
- package/build/server-watcher.js +105 -0
- package/build/server-watcher.js.map +1 -0
- package/build/session-detector.d.ts +47 -0
- package/build/session-detector.d.ts.map +1 -0
- package/build/session-detector.js +229 -0
- package/build/session-detector.js.map +1 -0
- package/build/session-detector.test.d.ts +9 -0
- package/build/session-detector.test.d.ts.map +1 -0
- package/build/session-detector.test.js +45 -0
- package/build/session-detector.test.js.map +1 -0
- package/build/sourcemap-handler.d.ts +114 -0
- package/build/sourcemap-handler.d.ts.map +1 -0
- package/build/sourcemap-handler.js +479 -0
- package/build/sourcemap-handler.js.map +1 -0
- package/build/supervisor/child-manager.d.ts +43 -0
- package/build/supervisor/child-manager.d.ts.map +1 -0
- package/build/supervisor/child-manager.js +148 -0
- package/build/supervisor/child-manager.js.map +1 -0
- package/build/supervisor/child-manager.test.d.ts +2 -0
- package/build/supervisor/child-manager.test.d.ts.map +1 -0
- package/build/supervisor/child-manager.test.js +107 -0
- package/build/supervisor/child-manager.test.js.map +1 -0
- package/build/supervisor/client-watcher.d.ts +48 -0
- package/build/supervisor/client-watcher.d.ts.map +1 -0
- package/build/supervisor/client-watcher.js +186 -0
- package/build/supervisor/client-watcher.js.map +1 -0
- package/build/supervisor/client-watcher.test.d.ts +2 -0
- package/build/supervisor/client-watcher.test.d.ts.map +1 -0
- package/build/supervisor/client-watcher.test.js +121 -0
- package/build/supervisor/client-watcher.test.js.map +1 -0
- package/build/supervisor/idle-config.d.ts +30 -0
- package/build/supervisor/idle-config.d.ts.map +1 -0
- package/build/supervisor/idle-config.js +76 -0
- package/build/supervisor/idle-config.js.map +1 -0
- package/build/supervisor/idle-config.test.d.ts +2 -0
- package/build/supervisor/idle-config.test.d.ts.map +1 -0
- package/build/supervisor/idle-config.test.js +119 -0
- package/build/supervisor/idle-config.test.js.map +1 -0
- package/build/supervisor/ndjson-reader.d.ts +47 -0
- package/build/supervisor/ndjson-reader.d.ts.map +1 -0
- package/build/supervisor/ndjson-reader.js +75 -0
- package/build/supervisor/ndjson-reader.js.map +1 -0
- package/build/supervisor/ndjson-reader.test.d.ts +2 -0
- package/build/supervisor/ndjson-reader.test.d.ts.map +1 -0
- package/build/supervisor/ndjson-reader.test.js +92 -0
- package/build/supervisor/ndjson-reader.test.js.map +1 -0
- package/build/supervisor/pidfile.d.ts +11 -0
- package/build/supervisor/pidfile.d.ts.map +1 -0
- package/build/supervisor/pidfile.js +29 -0
- package/build/supervisor/pidfile.js.map +1 -0
- package/build/supervisor/pidfile.test.d.ts +8 -0
- package/build/supervisor/pidfile.test.d.ts.map +1 -0
- package/build/supervisor/pidfile.test.js +46 -0
- package/build/supervisor/pidfile.test.js.map +1 -0
- package/build/supervisor/restart-coordinator.d.ts +73 -0
- package/build/supervisor/restart-coordinator.d.ts.map +1 -0
- package/build/supervisor/restart-coordinator.js +300 -0
- package/build/supervisor/restart-coordinator.js.map +1 -0
- package/build/supervisor/restart-coordinator.test.d.ts +2 -0
- package/build/supervisor/restart-coordinator.test.d.ts.map +1 -0
- package/build/supervisor/restart-coordinator.test.js +434 -0
- package/build/supervisor/restart-coordinator.test.js.map +1 -0
- package/build/test-support/fake-execute-tool-call.d.ts +11 -0
- package/build/test-support/fake-execute-tool-call.d.ts.map +1 -0
- package/build/test-support/fake-execute-tool-call.js +19 -0
- package/build/test-support/fake-execute-tool-call.js.map +1 -0
- package/build/tool-error.d.ts +14 -0
- package/build/tool-error.d.ts.map +1 -0
- package/build/tool-error.js +18 -0
- package/build/tool-error.js.map +1 -0
- package/build/tool-response.d.ts +293 -0
- package/build/tool-response.d.ts.map +1 -0
- package/build/tool-response.js +365 -0
- package/build/tool-response.js.map +1 -0
- package/build/tools/assert-tools.d.ts +62 -0
- package/build/tools/assert-tools.d.ts.map +1 -0
- package/build/tools/assert-tools.js +330 -0
- package/build/tools/assert-tools.js.map +1 -0
- package/build/tools/breakpoint-await-abort.test.d.ts +2 -0
- package/build/tools/breakpoint-await-abort.test.d.ts.map +1 -0
- package/build/tools/breakpoint-await-abort.test.js +124 -0
- package/build/tools/breakpoint-await-abort.test.js.map +1 -0
- package/build/tools/breakpoint-tools.d.ts +99 -0
- package/build/tools/breakpoint-tools.d.ts.map +1 -0
- package/build/tools/breakpoint-tools.js +1197 -0
- package/build/tools/breakpoint-tools.js.map +1 -0
- package/build/tools/config-tools.d.ts +58 -0
- package/build/tools/config-tools.d.ts.map +1 -0
- package/build/tools/config-tools.js +180 -0
- package/build/tools/config-tools.js.map +1 -0
- package/build/tools/connection-routing.test.d.ts +12 -0
- package/build/tools/connection-routing.test.d.ts.map +1 -0
- package/build/tools/connection-routing.test.js +206 -0
- package/build/tools/connection-routing.test.js.map +1 -0
- package/build/tools/console-tools.d.ts +84 -0
- package/build/tools/console-tools.d.ts.map +1 -0
- package/build/tools/console-tools.js +241 -0
- package/build/tools/console-tools.js.map +1 -0
- package/build/tools/content-tools.d.ts +74 -0
- package/build/tools/content-tools.d.ts.map +1 -0
- package/build/tools/content-tools.js +582 -0
- package/build/tools/content-tools.js.map +1 -0
- package/build/tools/dashboard-tools.d.ts +38 -0
- package/build/tools/dashboard-tools.d.ts.map +1 -0
- package/build/tools/dashboard-tools.js +123 -0
- package/build/tools/dashboard-tools.js.map +1 -0
- package/build/tools/dom-tools.d.ts +41 -0
- package/build/tools/dom-tools.d.ts.map +1 -0
- package/build/tools/dom-tools.js +277 -0
- package/build/tools/dom-tools.js.map +1 -0
- package/build/tools/download-tools.d.ts +55 -0
- package/build/tools/download-tools.d.ts.map +1 -0
- package/build/tools/download-tools.js +280 -0
- package/build/tools/download-tools.js.map +1 -0
- package/build/tools/execution-tools.d.ts +40 -0
- package/build/tools/execution-tools.d.ts.map +1 -0
- package/build/tools/execution-tools.js +121 -0
- package/build/tools/execution-tools.js.map +1 -0
- package/build/tools/input-abort.test.d.ts +2 -0
- package/build/tools/input-abort.test.d.ts.map +1 -0
- package/build/tools/input-abort.test.js +227 -0
- package/build/tools/input-abort.test.js.map +1 -0
- package/build/tools/input-ambiguous-selector.test.d.ts +2 -0
- package/build/tools/input-ambiguous-selector.test.d.ts.map +1 -0
- package/build/tools/input-ambiguous-selector.test.js +34 -0
- package/build/tools/input-ambiguous-selector.test.js.map +1 -0
- package/build/tools/input-tools.d.ts +168 -0
- package/build/tools/input-tools.d.ts.map +1 -0
- package/build/tools/input-tools.js +1397 -0
- package/build/tools/input-tools.js.map +1 -0
- package/build/tools/inspection-tools.d.ts +112 -0
- package/build/tools/inspection-tools.d.ts.map +1 -0
- package/build/tools/inspection-tools.js +637 -0
- package/build/tools/inspection-tools.js.map +1 -0
- package/build/tools/interpolation.d.ts +30 -0
- package/build/tools/interpolation.d.ts.map +1 -0
- package/build/tools/interpolation.js +143 -0
- package/build/tools/interpolation.js.map +1 -0
- package/build/tools/issues-abort-hygiene.test.d.ts +2 -0
- package/build/tools/issues-abort-hygiene.test.d.ts.map +1 -0
- package/build/tools/issues-abort-hygiene.test.js +79 -0
- package/build/tools/issues-abort-hygiene.test.js.map +1 -0
- package/build/tools/issues-tools.d.ts +98 -0
- package/build/tools/issues-tools.d.ts.map +1 -0
- package/build/tools/issues-tools.js +821 -0
- package/build/tools/issues-tools.js.map +1 -0
- package/build/tools/issues-tools.test.d.ts +8 -0
- package/build/tools/issues-tools.test.d.ts.map +1 -0
- package/build/tools/issues-tools.test.js +184 -0
- package/build/tools/issues-tools.test.js.map +1 -0
- package/build/tools/modal-tools.d.ts +73 -0
- package/build/tools/modal-tools.d.ts.map +1 -0
- package/build/tools/modal-tools.js +161 -0
- package/build/tools/modal-tools.js.map +1 -0
- package/build/tools/network-tools.d.ts +72 -0
- package/build/tools/network-tools.d.ts.map +1 -0
- package/build/tools/network-tools.js +432 -0
- package/build/tools/network-tools.js.map +1 -0
- package/build/tools/page-tools.d.ts +78 -0
- package/build/tools/page-tools.d.ts.map +1 -0
- package/build/tools/page-tools.js +255 -0
- package/build/tools/page-tools.js.map +1 -0
- package/build/tools/plugin-tools.d.ts +16 -0
- package/build/tools/plugin-tools.d.ts.map +1 -0
- package/build/tools/plugin-tools.js +17 -0
- package/build/tools/plugin-tools.js.map +1 -0
- package/build/tools/replay-abort.test.d.ts +2 -0
- package/build/tools/replay-abort.test.d.ts.map +1 -0
- package/build/tools/replay-abort.test.js +259 -0
- package/build/tools/replay-abort.test.js.map +1 -0
- package/build/tools/replay-add-conditional.test.d.ts +2 -0
- package/build/tools/replay-add-conditional.test.d.ts.map +1 -0
- package/build/tools/replay-add-conditional.test.js +205 -0
- package/build/tools/replay-add-conditional.test.js.map +1 -0
- package/build/tools/replay-background-run.test.d.ts +2 -0
- package/build/tools/replay-background-run.test.d.ts.map +1 -0
- package/build/tools/replay-background-run.test.js +176 -0
- package/build/tools/replay-background-run.test.js.map +1 -0
- package/build/tools/replay-capture-variables.test.d.ts +2 -0
- package/build/tools/replay-capture-variables.test.d.ts.map +1 -0
- package/build/tools/replay-capture-variables.test.js +331 -0
- package/build/tools/replay-capture-variables.test.js.map +1 -0
- package/build/tools/replay-conditional-idb-and-launch.test.d.ts +11 -0
- package/build/tools/replay-conditional-idb-and-launch.test.d.ts.map +1 -0
- package/build/tools/replay-conditional-idb-and-launch.test.js +429 -0
- package/build/tools/replay-conditional-idb-and-launch.test.js.map +1 -0
- package/build/tools/replay-conditional-timeout.test.d.ts +14 -0
- package/build/tools/replay-conditional-timeout.test.d.ts.map +1 -0
- package/build/tools/replay-conditional-timeout.test.js +126 -0
- package/build/tools/replay-conditional-timeout.test.js.map +1 -0
- package/build/tools/replay-declare.test.d.ts +2 -0
- package/build/tools/replay-declare.test.d.ts.map +1 -0
- package/build/tools/replay-declare.test.js +106 -0
- package/build/tools/replay-declare.test.js.map +1 -0
- package/build/tools/replay-declared-browser-cleanup.test.d.ts +2 -0
- package/build/tools/replay-declared-browser-cleanup.test.d.ts.map +1 -0
- package/build/tools/replay-declared-browser-cleanup.test.js +103 -0
- package/build/tools/replay-declared-browser-cleanup.test.js.map +1 -0
- package/build/tools/replay-declared-profile.test.d.ts +2 -0
- package/build/tools/replay-declared-profile.test.d.ts.map +1 -0
- package/build/tools/replay-declared-profile.test.js +116 -0
- package/build/tools/replay-declared-profile.test.js.map +1 -0
- package/build/tools/replay-executor.d.ts +556 -0
- package/build/tools/replay-executor.d.ts.map +1 -0
- package/build/tools/replay-executor.js +2347 -0
- package/build/tools/replay-executor.js.map +1 -0
- package/build/tools/replay-folder-save.test.d.ts +2 -0
- package/build/tools/replay-folder-save.test.d.ts.map +1 -0
- package/build/tools/replay-folder-save.test.js +63 -0
- package/build/tools/replay-folder-save.test.js.map +1 -0
- package/build/tools/replay-formatters.d.ts +148 -0
- package/build/tools/replay-formatters.d.ts.map +1 -0
- package/build/tools/replay-formatters.js +856 -0
- package/build/tools/replay-formatters.js.map +1 -0
- package/build/tools/replay-kill-chrome-on-finish.test.d.ts +2 -0
- package/build/tools/replay-kill-chrome-on-finish.test.d.ts.map +1 -0
- package/build/tools/replay-kill-chrome-on-finish.test.js +175 -0
- package/build/tools/replay-kill-chrome-on-finish.test.js.map +1 -0
- package/build/tools/replay-multi-connection.test.d.ts +2 -0
- package/build/tools/replay-multi-connection.test.d.ts.map +1 -0
- package/build/tools/replay-multi-connection.test.js +547 -0
- package/build/tools/replay-multi-connection.test.js.map +1 -0
- package/build/tools/replay-output-and-record-options.test.d.ts +2 -0
- package/build/tools/replay-output-and-record-options.test.d.ts.map +1 -0
- package/build/tools/replay-output-and-record-options.test.js +240 -0
- package/build/tools/replay-output-and-record-options.test.js.map +1 -0
- package/build/tools/replay-production-error-shape.test.d.ts +7 -0
- package/build/tools/replay-production-error-shape.test.d.ts.map +1 -0
- package/build/tools/replay-production-error-shape.test.js +93 -0
- package/build/tools/replay-production-error-shape.test.js.map +1 -0
- package/build/tools/replay-rebase.test.d.ts +2 -0
- package/build/tools/replay-rebase.test.d.ts.map +1 -0
- package/build/tools/replay-rebase.test.js +58 -0
- package/build/tools/replay-rebase.test.js.map +1 -0
- package/build/tools/replay-retry-classification.test.d.ts +9 -0
- package/build/tools/replay-retry-classification.test.d.ts.map +1 -0
- package/build/tools/replay-retry-classification.test.js +57 -0
- package/build/tools/replay-retry-classification.test.js.map +1 -0
- package/build/tools/replay-run-registry.d.ts +55 -0
- package/build/tools/replay-run-registry.d.ts.map +1 -0
- package/build/tools/replay-run-registry.js +65 -0
- package/build/tools/replay-run-registry.js.map +1 -0
- package/build/tools/replay-sequence-reload.test.d.ts +2 -0
- package/build/tools/replay-sequence-reload.test.d.ts.map +1 -0
- package/build/tools/replay-sequence-reload.test.js +82 -0
- package/build/tools/replay-sequence-reload.test.js.map +1 -0
- package/build/tools/replay-socket-scope.test.d.ts +2 -0
- package/build/tools/replay-socket-scope.test.d.ts.map +1 -0
- package/build/tools/replay-socket-scope.test.js +75 -0
- package/build/tools/replay-socket-scope.test.js.map +1 -0
- package/build/tools/replay-step-connection.test.d.ts +2 -0
- package/build/tools/replay-step-connection.test.d.ts.map +1 -0
- package/build/tools/replay-step-connection.test.js +292 -0
- package/build/tools/replay-step-connection.test.js.map +1 -0
- package/build/tools/replay-step-timeout.test.d.ts +2 -0
- package/build/tools/replay-step-timeout.test.d.ts.map +1 -0
- package/build/tools/replay-step-timeout.test.js +204 -0
- package/build/tools/replay-step-timeout.test.js.map +1 -0
- package/build/tools/replay-tags.test.d.ts +2 -0
- package/build/tools/replay-tags.test.d.ts.map +1 -0
- package/build/tools/replay-tags.test.js +99 -0
- package/build/tools/replay-tags.test.js.map +1 -0
- package/build/tools/replay-teardown-and-foreach.test.d.ts +13 -0
- package/build/tools/replay-teardown-and-foreach.test.d.ts.map +1 -0
- package/build/tools/replay-teardown-and-foreach.test.js +318 -0
- package/build/tools/replay-teardown-and-foreach.test.js.map +1 -0
- package/build/tools/replay-tool-name-validation.test.d.ts +2 -0
- package/build/tools/replay-tool-name-validation.test.d.ts.map +1 -0
- package/build/tools/replay-tool-name-validation.test.js +280 -0
- package/build/tools/replay-tool-name-validation.test.js.map +1 -0
- package/build/tools/replay-tools.d.ts +288 -0
- package/build/tools/replay-tools.d.ts.map +1 -0
- package/build/tools/replay-tools.js +2994 -0
- package/build/tools/replay-tools.js.map +1 -0
- package/build/tools/request-abort.test.d.ts +2 -0
- package/build/tools/request-abort.test.d.ts.map +1 -0
- package/build/tools/request-abort.test.js +130 -0
- package/build/tools/request-abort.test.js.map +1 -0
- package/build/tools/request-tools.d.ts +56 -0
- package/build/tools/request-tools.d.ts.map +1 -0
- package/build/tools/request-tools.js +174 -0
- package/build/tools/request-tools.js.map +1 -0
- package/build/tools/screenshot-tools.d.ts +135 -0
- package/build/tools/screenshot-tools.d.ts.map +1 -0
- package/build/tools/screenshot-tools.js +636 -0
- package/build/tools/screenshot-tools.js.map +1 -0
- package/build/tools/server-tools.d.ts +88 -0
- package/build/tools/server-tools.d.ts.map +1 -0
- package/build/tools/server-tools.js +485 -0
- package/build/tools/server-tools.js.map +1 -0
- package/build/tools/source-tools.d.ts +46 -0
- package/build/tools/source-tools.d.ts.map +1 -0
- package/build/tools/source-tools.js +47 -0
- package/build/tools/source-tools.js.map +1 -0
- package/build/tools/storage-tools.d.ts +141 -0
- package/build/tools/storage-tools.d.ts.map +1 -0
- package/build/tools/storage-tools.js +894 -0
- package/build/tools/storage-tools.js.map +1 -0
- package/build/tools/storage-tools.test.d.ts +13 -0
- package/build/tools/storage-tools.test.d.ts.map +1 -0
- package/build/tools/storage-tools.test.js +707 -0
- package/build/tools/storage-tools.test.js.map +1 -0
- package/build/tools/tab-tools.d.ts +42 -0
- package/build/tools/tab-tools.d.ts.map +1 -0
- package/build/tools/tab-tools.js +296 -0
- package/build/tools/tab-tools.js.map +1 -0
- package/build/tools/wait-tools.d.ts +85 -0
- package/build/tools/wait-tools.d.ts.map +1 -0
- package/build/tools/wait-tools.js +236 -0
- package/build/tools/wait-tools.js.map +1 -0
- package/build/tools/wait-tools.test.d.ts +9 -0
- package/build/tools/wait-tools.test.d.ts.map +1 -0
- package/build/tools/wait-tools.test.js +193 -0
- package/build/tools/wait-tools.test.js.map +1 -0
- package/build/types.d.ts +133 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +5 -0
- package/build/types.js.map +1 -0
- package/build/ui-verifier.d.ts +88 -0
- package/build/ui-verifier.d.ts.map +1 -0
- package/build/ui-verifier.js +540 -0
- package/build/ui-verifier.js.map +1 -0
- package/build/utils/abort.d.ts +68 -0
- package/build/utils/abort.d.ts.map +1 -0
- package/build/utils/abort.js +159 -0
- package/build/utils/abort.js.map +1 -0
- package/build/utils/abort.test.d.ts +2 -0
- package/build/utils/abort.test.d.ts.map +1 -0
- package/build/utils/abort.test.js +174 -0
- package/build/utils/abort.test.js.map +1 -0
- package/build/utils/modal-detection-core.d.ts +150 -0
- package/build/utils/modal-detection-core.d.ts.map +1 -0
- package/build/utils/modal-detection-core.js +332 -0
- package/build/utils/modal-detection-core.js.map +1 -0
- package/build/utils/modal-detection-core.test.d.ts +5 -0
- package/build/utils/modal-detection-core.test.d.ts.map +1 -0
- package/build/utils/modal-detection-core.test.js +492 -0
- package/build/utils/modal-detection-core.test.js.map +1 -0
- package/build/utils/modal-detector.d.ts +29 -0
- package/build/utils/modal-detector.d.ts.map +1 -0
- package/build/utils/modal-detector.js +281 -0
- package/build/utils/modal-detector.js.map +1 -0
- package/build/utils/modal-dismissal.d.ts +32 -0
- package/build/utils/modal-dismissal.d.ts.map +1 -0
- package/build/utils/modal-dismissal.js +190 -0
- package/build/utils/modal-dismissal.js.map +1 -0
- package/build/utils/port-check.d.ts +31 -0
- package/build/utils/port-check.d.ts.map +1 -0
- package/build/utils/port-check.js +87 -0
- package/build/utils/port-check.js.map +1 -0
- package/build/utils/port-check.test.d.ts +2 -0
- package/build/utils/port-check.test.d.ts.map +1 -0
- package/build/utils/port-check.test.js +66 -0
- package/build/utils/port-check.test.js.map +1 -0
- package/build/utils/selector-resolver.d.ts +66 -0
- package/build/utils/selector-resolver.d.ts.map +1 -0
- package/build/utils/selector-resolver.js +200 -0
- package/build/utils/selector-resolver.js.map +1 -0
- package/build/validation-helpers.d.ts +41 -0
- package/build/validation-helpers.d.ts.map +1 -0
- package/build/validation-helpers.js +236 -0
- package/build/validation-helpers.js.map +1 -0
- package/build/window-sizing.d.ts +26 -0
- package/build/window-sizing.d.ts.map +1 -0
- package/build/window-sizing.js +87 -0
- package/build/window-sizing.js.map +1 -0
- package/build/window-sizing.test.d.ts +8 -0
- package/build/window-sizing.test.d.ts.map +1 -0
- package/build/window-sizing.test.js +113 -0
- package/build/window-sizing.test.js.map +1 -0
- package/docs/README.md +74 -0
- package/docs/automation.md +562 -0
- package/docs/debugging.md +229 -0
- package/docs/installation.md +133 -0
- package/docs/instructions.md +227 -0
- package/docs/mcp-instructions.md +15 -0
- package/docs/message-system.md +327 -0
- package/docs/messages.md +3480 -0
- package/docs/parser-plugins.md +132 -0
- package/docs/replay.md +1411 -0
- package/docs/troubleshooting.md +272 -0
- package/docs/working_with_llm_notes.md +5 -0
- package/package.json +87 -0
- package/skills/devharness/SKILL.md +195 -0
- package/skills/devharness/references/sequences.md +613 -0
- package/skills/devharness/references/tool-categories.md +99 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chrome Launcher
|
|
3
|
+
* Utilities for launching Chrome with debugging enabled
|
|
4
|
+
*/
|
|
5
|
+
import type { PortReserver } from './port-reserver.js';
|
|
6
|
+
export type ChromeCloseReason = 'inactivity' | 'manual' | 'crash' | 'external' | 'signal' | 'unknown';
|
|
7
|
+
export interface ChromeCloseEvent {
|
|
8
|
+
port: number;
|
|
9
|
+
pid: number;
|
|
10
|
+
reason: ChromeCloseReason;
|
|
11
|
+
timestamp: Date;
|
|
12
|
+
exitCode?: number | null;
|
|
13
|
+
signal?: string | null;
|
|
14
|
+
}
|
|
15
|
+
export type ChromeExitCallback = (event: ChromeCloseEvent) => void | Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Prefix used for all launcher-created temporary Chrome profile directories.
|
|
18
|
+
* The startup sweep only ever considers directories with this prefix.
|
|
19
|
+
*/
|
|
20
|
+
export declare const EPHEMERAL_PROFILE_PREFIX = "chrome-debug-profile-";
|
|
21
|
+
/**
|
|
22
|
+
* A Chrome user-data-dir tracked by the launcher.
|
|
23
|
+
*
|
|
24
|
+
* `ephemeral` records a throwaway profile we created and are therefore allowed
|
|
25
|
+
* to delete when the instance goes away. Named/persistent profiles (see issue
|
|
26
|
+
* 13) will be registered with `ephemeral: false` and must never be deleted by
|
|
27
|
+
* the launcher, neither on kill nor by the startup sweep.
|
|
28
|
+
*/
|
|
29
|
+
export interface ChromeProfileRecord {
|
|
30
|
+
dir: string;
|
|
31
|
+
ephemeral: boolean;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Legal characters for a named persistent profile (issue 13).
|
|
35
|
+
*
|
|
36
|
+
* Deliberately strict: the name becomes a directory under the profile root, so
|
|
37
|
+
* anything that could escape it (`/`, `..`, leading dot) or confuse the startup
|
|
38
|
+
* sweep is rejected rather than sanitised - silently renaming a profile would
|
|
39
|
+
* hand the caller a different identity than they asked for.
|
|
40
|
+
*/
|
|
41
|
+
export declare const PROFILE_NAME_PATTERN: RegExp;
|
|
42
|
+
/** Thrown when a profile name is not a safe single directory segment. */
|
|
43
|
+
export declare class InvalidProfileNameError extends Error {
|
|
44
|
+
readonly profile: string;
|
|
45
|
+
constructor(profile: string);
|
|
46
|
+
}
|
|
47
|
+
/** Thrown when an operation would disturb a profile a live Chrome is holding. */
|
|
48
|
+
export declare class ProfileInUseError extends Error {
|
|
49
|
+
readonly profile: string;
|
|
50
|
+
readonly port: number;
|
|
51
|
+
constructor(profile: string, port: number);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Thrown when a profile is held by a Chrome this process did not launch -
|
|
55
|
+
* typically another cdp-tools session on the same machine, because the default
|
|
56
|
+
* persistent profile root (`~/.cdp-tools/profiles`) is global.
|
|
57
|
+
*
|
|
58
|
+
* Detected from the profile's Chrome `SingletonLock`, so we know the holding
|
|
59
|
+
* PID but not which debug port it listens on.
|
|
60
|
+
*
|
|
61
|
+
* LIMITATION: the check is POSIX-only. `SingletonLock` is a symlink on
|
|
62
|
+
* macOS/Linux; on Windows Chrome uses a plain lock file we cannot read a PID
|
|
63
|
+
* from, so this error is never raised there and the cross-session races it
|
|
64
|
+
* guards against remain possible.
|
|
65
|
+
*/
|
|
66
|
+
export declare class ProfileLockedError extends Error {
|
|
67
|
+
readonly profile: string;
|
|
68
|
+
readonly pid: number;
|
|
69
|
+
readonly dir: string;
|
|
70
|
+
constructor(profile: string, pid: number, dir: string);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Validate a persistent profile name, returning it trimmed.
|
|
74
|
+
* @throws InvalidProfileNameError
|
|
75
|
+
*/
|
|
76
|
+
export declare function normalizeProfileName(name: string): string;
|
|
77
|
+
/** Outcome of resolveLaunchPort(). */
|
|
78
|
+
export type LaunchPortDecision = {
|
|
79
|
+
decision: 'use';
|
|
80
|
+
port: number;
|
|
81
|
+
}
|
|
82
|
+
/** forceNewInstance asked for a specific port that is already taken. */
|
|
83
|
+
| {
|
|
84
|
+
decision: 'forced-port-in-use';
|
|
85
|
+
port: number;
|
|
86
|
+
};
|
|
87
|
+
export interface LaunchPortRequest {
|
|
88
|
+
/** `port` as passed to launchChrome, if the caller gave one. */
|
|
89
|
+
explicitPort?: number;
|
|
90
|
+
forceNewInstance?: boolean;
|
|
91
|
+
/** This session's reserved port - the default when no port is given. */
|
|
92
|
+
reservedPort: number;
|
|
93
|
+
/** Is `port` held by anything other than our own reservation? */
|
|
94
|
+
isPortOccupied: (port: number) => Promise<boolean>;
|
|
95
|
+
/** Pick a genuinely free port (only consulted for a portless forceNewInstance). */
|
|
96
|
+
findFreePort: () => Promise<number>;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Decide which port a launchChrome call should use (bug-005).
|
|
100
|
+
*
|
|
101
|
+
* Extracted from the MCP handler so the decision is testable without a browser
|
|
102
|
+
* or an MCP server: src/index.ts calls main() on import, so anything left
|
|
103
|
+
* inline there can only be "tested" by grepping the source.
|
|
104
|
+
*
|
|
105
|
+
* Rules:
|
|
106
|
+
* - An explicit `port` is always honoured, never silently relocated.
|
|
107
|
+
* - `forceNewInstance` must produce a fresh process, so an explicit port that
|
|
108
|
+
* is already occupied is an error rather than a hand-off to whatever is
|
|
109
|
+
* listening; occupancy is only consulted in that case.
|
|
110
|
+
* - `forceNewInstance` without a port picks a known-free port instead of the
|
|
111
|
+
* reserved one, which an existing instance may already be using.
|
|
112
|
+
*/
|
|
113
|
+
export declare function resolveLaunchPort(req: LaunchPortRequest): Promise<LaunchPortDecision>;
|
|
114
|
+
/** Outcome of decideProfileReuse(). */
|
|
115
|
+
export type ProfileReuseDecision =
|
|
116
|
+
/** Nothing in the way: reuse the existing instance, or spawn if there is none. */
|
|
117
|
+
{
|
|
118
|
+
decision: 'ok';
|
|
119
|
+
}
|
|
120
|
+
/** The requested profile is held by a different live Chrome on `port`. */
|
|
121
|
+
| {
|
|
122
|
+
decision: 'in-use';
|
|
123
|
+
port: number;
|
|
124
|
+
}
|
|
125
|
+
/** The instance we would reuse is running a different profile. */
|
|
126
|
+
| {
|
|
127
|
+
decision: 'mismatch';
|
|
128
|
+
port: number;
|
|
129
|
+
actualProfile?: string;
|
|
130
|
+
};
|
|
131
|
+
export interface ProfileReuseRequest {
|
|
132
|
+
/** Directory of the requested named profile; undefined when none was asked for. */
|
|
133
|
+
wantedProfileDir?: string;
|
|
134
|
+
/**
|
|
135
|
+
* The live Chrome this call would otherwise reuse (matched by reference or by
|
|
136
|
+
* target port), and the profile dir we have tracked for it (undefined when it
|
|
137
|
+
* was not launched by us, so we cannot know).
|
|
138
|
+
*/
|
|
139
|
+
existing?: {
|
|
140
|
+
port: number;
|
|
141
|
+
profileDir?: string;
|
|
142
|
+
};
|
|
143
|
+
/** Port of the live Chrome currently holding the requested profile, if any. */
|
|
144
|
+
holderPort?: number;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Decide whether a launchChrome call may reuse an existing Chrome, given the
|
|
148
|
+
* named profile it asked for (issue 13 / bug: profile pre-check ordering).
|
|
149
|
+
*
|
|
150
|
+
* The ordering this encodes is the whole point: a live instance already running
|
|
151
|
+
* the requested profile is REUSED, exactly as it would be without a profile, so
|
|
152
|
+
* the idempotent `launchChrome({ profile, reference })` "make sure it's up"
|
|
153
|
+
* pattern keeps working. "Profile in use" is only an error when the call would
|
|
154
|
+
* have to put a SECOND Chrome on a profile another instance holds.
|
|
155
|
+
*/
|
|
156
|
+
export declare function decideProfileReuse(req: ProfileReuseRequest): ProfileReuseDecision;
|
|
157
|
+
export interface ChromeLauncherOptions {
|
|
158
|
+
/** Directory the temporary profiles live in. Defaults to os.tmpdir(). */
|
|
159
|
+
profileRoot?: string;
|
|
160
|
+
/**
|
|
161
|
+
* Directory named persistent profiles (issue 13) live in. Defaults to
|
|
162
|
+
* `~/.cdp-tools/profiles`. A function is resolved on every use so a live
|
|
163
|
+
* config reload (`chrome.persistentProfileRoot`) takes effect immediately.
|
|
164
|
+
*/
|
|
165
|
+
persistentProfileRoot?: string | (() => string);
|
|
166
|
+
/** Sweep stale ephemeral profiles on construction. Defaults to true. */
|
|
167
|
+
sweepStaleProfilesOnStartup?: boolean;
|
|
168
|
+
/**
|
|
169
|
+
* A stale profile dir must be at least this old (mtime) before the startup
|
|
170
|
+
* sweep will remove it. Guards against deleting a profile belonging to a
|
|
171
|
+
* Chrome that another MCP instance is launching right now. Defaults to 1h.
|
|
172
|
+
*/
|
|
173
|
+
staleProfileMaxAgeMs?: number;
|
|
174
|
+
}
|
|
175
|
+
export declare class ChromeLauncher {
|
|
176
|
+
private chromeProcesses;
|
|
177
|
+
private launchLocks;
|
|
178
|
+
/** profile name -> in-flight launch for that profile (see launch()) */
|
|
179
|
+
private profileLaunchLocks;
|
|
180
|
+
private lastCloseEvents;
|
|
181
|
+
private maxCloseEvents;
|
|
182
|
+
private pendingCloseReason;
|
|
183
|
+
private onExitCallback;
|
|
184
|
+
/** port -> profile dir currently in use by the Chrome on that port */
|
|
185
|
+
private profileDirs;
|
|
186
|
+
private profileRoot;
|
|
187
|
+
private persistentProfileRootOption;
|
|
188
|
+
private staleProfileMaxAgeMs;
|
|
189
|
+
/** Resolves once the startup sweep (if any) has finished. Exposed for tests. */
|
|
190
|
+
readonly startupSweep: Promise<string[]>;
|
|
191
|
+
constructor(options?: ChromeLauncherOptions);
|
|
192
|
+
/**
|
|
193
|
+
* Set a callback to be invoked when any Chrome process exits.
|
|
194
|
+
* Used for cleanup (closing stale connections) and port re-reservation.
|
|
195
|
+
*/
|
|
196
|
+
setOnExitCallback(callback: ChromeExitCallback): void;
|
|
197
|
+
/**
|
|
198
|
+
* Get the Chrome executable path for the current platform
|
|
199
|
+
*/
|
|
200
|
+
private getChromePath;
|
|
201
|
+
/**
|
|
202
|
+
* Create Chrome preferences file that disables password manager popups
|
|
203
|
+
* This is required because command-line flags alone don't reliably disable
|
|
204
|
+
* the "Change your password" leak detection popup
|
|
205
|
+
*/
|
|
206
|
+
private createChromePreferences;
|
|
207
|
+
/**
|
|
208
|
+
* Check if a port is already in use using TCP connection
|
|
209
|
+
*/
|
|
210
|
+
private isPortInUse;
|
|
211
|
+
/**
|
|
212
|
+
* Wait for Chrome debugging port to become ready
|
|
213
|
+
* Polls the /json/version endpoint until Chrome is inspectable
|
|
214
|
+
*/
|
|
215
|
+
private waitForChromeReady;
|
|
216
|
+
/**
|
|
217
|
+
* Launch Chrome with debugging enabled
|
|
218
|
+
* Uses atomic release-and-launch to prevent race conditions
|
|
219
|
+
* Waits for Chrome to actually bind to the port before resolving
|
|
220
|
+
*/
|
|
221
|
+
launch(port?: number, url?: string, portReserver?: PortReserver, headless?: boolean, extraArgs?: string[], profileName?: string): Promise<{
|
|
222
|
+
port: number;
|
|
223
|
+
pid: number;
|
|
224
|
+
}>;
|
|
225
|
+
/**
|
|
226
|
+
* Port-scoped half of launch(): the per-port lock, the "already running" and
|
|
227
|
+
* profile-ownership guards, and the spawn itself.
|
|
228
|
+
*/
|
|
229
|
+
private launchOnPort;
|
|
230
|
+
/**
|
|
231
|
+
* Internal method that performs the actual Chrome launch
|
|
232
|
+
* Separated from launch() to allow mutex/locking logic
|
|
233
|
+
*/
|
|
234
|
+
private performLaunch;
|
|
235
|
+
/**
|
|
236
|
+
* Check if a process with the given PID is actually running
|
|
237
|
+
* This handles the case where Chrome is killed externally (e.g., Activity Monitor, kill command)
|
|
238
|
+
*/
|
|
239
|
+
private isProcessAlive;
|
|
240
|
+
/**
|
|
241
|
+
* Check if Chrome is running on a specific port, or if any Chrome instance is running
|
|
242
|
+
* This verifies the process is actually alive, not just tracked
|
|
243
|
+
*/
|
|
244
|
+
isRunning(port?: number): boolean;
|
|
245
|
+
/**
|
|
246
|
+
* Get all running Chrome ports
|
|
247
|
+
*/
|
|
248
|
+
getRunningPorts(): number[];
|
|
249
|
+
/**
|
|
250
|
+
* Kill Chrome process(es)
|
|
251
|
+
* If port is specified, kills only that instance. Otherwise kills all instances.
|
|
252
|
+
* First attempts graceful shutdown with SIGTERM, then force kills with SIGKILL if needed
|
|
253
|
+
*/
|
|
254
|
+
kill(port?: number): Promise<void>;
|
|
255
|
+
/**
|
|
256
|
+
* Kill a specific Chrome instance by port
|
|
257
|
+
*/
|
|
258
|
+
private killInstance;
|
|
259
|
+
/**
|
|
260
|
+
* Build the profile record for a launch on `port`.
|
|
261
|
+
*
|
|
262
|
+
* The name embeds the port (only one live Chrome can hold a debug port, so
|
|
263
|
+
* this alone separates concurrent launches) plus a timestamp and 4 random
|
|
264
|
+
* bytes (so sequential relaunches on the same port within one millisecond
|
|
265
|
+
* still differ). Naming on Date.now() alone let same-millisecond launches on
|
|
266
|
+
* different ports share a profile - bug-006.
|
|
267
|
+
*
|
|
268
|
+
* With `profileName` (issue 13) the record is a stable directory under the
|
|
269
|
+
* persistent profile root and is marked `ephemeral: false`, which every
|
|
270
|
+
* cleanup path skips. The port is deliberately NOT part of a named profile's
|
|
271
|
+
* directory: the profile is the identity, the port is just where this run of
|
|
272
|
+
* it happens to listen.
|
|
273
|
+
*/
|
|
274
|
+
private createProfileRecord;
|
|
275
|
+
/**
|
|
276
|
+
* Directory named persistent profiles live under (see
|
|
277
|
+
* `chrome.persistentProfileRoot`; defaults to `~/.cdp-tools/profiles`).
|
|
278
|
+
*/
|
|
279
|
+
getPersistentProfileRoot(): string;
|
|
280
|
+
/**
|
|
281
|
+
* Absolute path of a named persistent profile. Does not create it.
|
|
282
|
+
* @throws InvalidProfileNameError
|
|
283
|
+
*/
|
|
284
|
+
getPersistentProfilePath(profileName: string): string;
|
|
285
|
+
/**
|
|
286
|
+
* Port of the live Chrome currently holding a named profile, if any.
|
|
287
|
+
* @throws InvalidProfileNameError
|
|
288
|
+
*/
|
|
289
|
+
findPortForProfile(profileName: string): number | undefined;
|
|
290
|
+
/**
|
|
291
|
+
* PID of a live Chrome holding a named persistent profile, if the profile's
|
|
292
|
+
* SingletonLock says so. Unlike findPortForProfile() this sees Chromes we did
|
|
293
|
+
* NOT launch (other cdp-tools sessions sharing the global profile root, or a
|
|
294
|
+
* Chrome started by hand on the same user-data-dir).
|
|
295
|
+
*
|
|
296
|
+
* LIMITATION: POSIX-only. It reads the SingletonLock symlink target, which
|
|
297
|
+
* Windows Chrome does not create - there it always reports "not locked", so
|
|
298
|
+
* callers must treat a negative result as "no evidence of a holder" rather
|
|
299
|
+
* than proof the profile is free.
|
|
300
|
+
*
|
|
301
|
+
* @throws InvalidProfileNameError
|
|
302
|
+
*/
|
|
303
|
+
findProfileLockHolder(profileName: string): Promise<number | undefined>;
|
|
304
|
+
/**
|
|
305
|
+
* Names of persistent profiles that exist on disk.
|
|
306
|
+
*/
|
|
307
|
+
listPersistentProfiles(): Promise<string[]>;
|
|
308
|
+
/**
|
|
309
|
+
* Wipe a named persistent profile and recreate it empty, so the next launch
|
|
310
|
+
* starts from a clean browser (no cookies, no IndexedDB, no enrolment).
|
|
311
|
+
*
|
|
312
|
+
* Refuses while a Chrome we launched still holds the profile: deleting a
|
|
313
|
+
* live user-data-dir corrupts the running browser and the deletion would be
|
|
314
|
+
* partly undone as Chrome flushes state back out on exit. Kill that instance
|
|
315
|
+
* (`killChrome({ port })`) first.
|
|
316
|
+
*
|
|
317
|
+
* Also refuses when the profile's Chrome SingletonLock names a live PID we
|
|
318
|
+
* did not launch. The default profile root is global (`~/.cdp-tools/profiles`),
|
|
319
|
+
* so another cdp-tools session may be running this exact profile; without the
|
|
320
|
+
* lock check this call would rm -rf a live browser's user-data-dir and destroy
|
|
321
|
+
* the very identity persistent profiles exist to preserve. That check is
|
|
322
|
+
* POSIX-only (see ProfileLockedError) - on Windows this remains unguarded.
|
|
323
|
+
*
|
|
324
|
+
* @throws InvalidProfileNameError | ProfileInUseError | ProfileLockedError
|
|
325
|
+
*/
|
|
326
|
+
resetPersistentProfile(profileName: string): Promise<{
|
|
327
|
+
profile: string;
|
|
328
|
+
path: string;
|
|
329
|
+
existed: boolean;
|
|
330
|
+
}>;
|
|
331
|
+
/**
|
|
332
|
+
* Profile directory currently tracked for a port (if any).
|
|
333
|
+
*/
|
|
334
|
+
getProfileDir(port: number): string | undefined;
|
|
335
|
+
/**
|
|
336
|
+
* All tracked profiles, keyed by port. Persistent profiles are included but
|
|
337
|
+
* are never deleted by the launcher.
|
|
338
|
+
*/
|
|
339
|
+
getProfiles(): Map<number, ChromeProfileRecord>;
|
|
340
|
+
/**
|
|
341
|
+
* Stop tracking a port's profile and, if it is ephemeral, delete it from disk.
|
|
342
|
+
*
|
|
343
|
+
* `expected` guards against a late exit event from a previous Chrome deleting
|
|
344
|
+
* the freshly created profile of a relaunch on the same port: if the tracked
|
|
345
|
+
* record is no longer the one we started with, nothing is touched.
|
|
346
|
+
*/
|
|
347
|
+
private removeProfileDir;
|
|
348
|
+
/**
|
|
349
|
+
* Delete ephemeral profile directories left behind by previous sessions
|
|
350
|
+
* (crashes, SIGKILL, machine restart). Returns the directories removed.
|
|
351
|
+
*
|
|
352
|
+
* Conservative on purpose - a directory is skipped when:
|
|
353
|
+
* - it is younger than staleProfileMaxAgeMs (another MCP instance may be
|
|
354
|
+
* launching Chrome into it right now), or
|
|
355
|
+
* - its Chrome SingletonLock names a PID that is still alive, or
|
|
356
|
+
* - it is currently tracked by this launcher.
|
|
357
|
+
*/
|
|
358
|
+
sweepStaleProfiles(): Promise<string[]>;
|
|
359
|
+
/**
|
|
360
|
+
* Is a profile directory still held by a running Chrome?
|
|
361
|
+
* Chrome writes a SingletonLock symlink whose target is "<hostname>-<pid>".
|
|
362
|
+
* Unreadable/absent lock means "not locked" (Windows uses a plain lockfile).
|
|
363
|
+
*/
|
|
364
|
+
private isProfileLocked;
|
|
365
|
+
/**
|
|
366
|
+
* PID named by a profile directory's Chrome SingletonLock, if that process is
|
|
367
|
+
* still alive. POSIX-only: on Windows the lock is a plain file with no
|
|
368
|
+
* readable PID, so this always returns undefined ("no evidence of a holder").
|
|
369
|
+
*/
|
|
370
|
+
private readProfileLockPid;
|
|
371
|
+
/**
|
|
372
|
+
* Reset the launcher state (useful if Chrome was closed externally)
|
|
373
|
+
*/
|
|
374
|
+
reset(port?: number): void;
|
|
375
|
+
/**
|
|
376
|
+
* Record a Chrome close event
|
|
377
|
+
*/
|
|
378
|
+
private recordCloseEvent;
|
|
379
|
+
/**
|
|
380
|
+
* Get the last close events
|
|
381
|
+
*/
|
|
382
|
+
getLastCloseEvents(): ChromeCloseEvent[];
|
|
383
|
+
/**
|
|
384
|
+
* Get Chrome launcher status for all instances
|
|
385
|
+
* Verifies each process is actually alive and cleans up dead ones
|
|
386
|
+
*/
|
|
387
|
+
getStatus(): {
|
|
388
|
+
instances: Array<{
|
|
389
|
+
port: number;
|
|
390
|
+
pid: number;
|
|
391
|
+
running: boolean;
|
|
392
|
+
}>;
|
|
393
|
+
lastCloseEvents: ChromeCloseEvent[];
|
|
394
|
+
};
|
|
395
|
+
/**
|
|
396
|
+
* Set the pending close reason for a port (call before killing)
|
|
397
|
+
*/
|
|
398
|
+
setPendingCloseReason(port: number, reason: ChromeCloseReason): void;
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=chrome-launcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chrome-launcher.d.ts","sourceRoot":"","sources":["../src/chrome-launcher.ts"],"names":[],"mappings":"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"}
|