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,432 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection Manager
|
|
3
|
+
* Manages multiple debugger connections (Chrome, Node.js, etc.)
|
|
4
|
+
*/
|
|
5
|
+
export class ConnectionManager {
|
|
6
|
+
connections = new Map();
|
|
7
|
+
browsers = new Map(); // Key: "host:port"
|
|
8
|
+
activeConnectionId = null;
|
|
9
|
+
connectionCounter = 0;
|
|
10
|
+
chromeLauncher;
|
|
11
|
+
/**
|
|
12
|
+
* Set the Chrome launcher instance for automatic cleanup
|
|
13
|
+
*/
|
|
14
|
+
setChromeLauncher(launcher) {
|
|
15
|
+
this.chromeLauncher = launcher;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create a new connection (tab)
|
|
19
|
+
*/
|
|
20
|
+
createConnection(cdpManager, puppeteerManager, consoleMonitor, networkMonitor, host = 'localhost', port = 9222, reference, pageIndex) {
|
|
21
|
+
const id = `conn-${++this.connectionCounter}`;
|
|
22
|
+
const type = cdpManager.getRuntimeType();
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
const connection = {
|
|
25
|
+
id,
|
|
26
|
+
type,
|
|
27
|
+
cdpManager,
|
|
28
|
+
puppeteerManager,
|
|
29
|
+
consoleMonitor,
|
|
30
|
+
networkMonitor,
|
|
31
|
+
host,
|
|
32
|
+
port,
|
|
33
|
+
createdAt: now,
|
|
34
|
+
lastActivityAt: now,
|
|
35
|
+
reference,
|
|
36
|
+
pageIndex,
|
|
37
|
+
};
|
|
38
|
+
this.connections.set(id, connection);
|
|
39
|
+
// Track browser instance
|
|
40
|
+
const browserKey = `${host}:${port}`;
|
|
41
|
+
if (!this.browsers.has(browserKey)) {
|
|
42
|
+
this.browsers.set(browserKey, {
|
|
43
|
+
host,
|
|
44
|
+
port,
|
|
45
|
+
connectionIds: [id],
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
this.browsers.get(browserKey).connectionIds.push(id);
|
|
50
|
+
}
|
|
51
|
+
// Set as active if it's the first connection
|
|
52
|
+
if (this.connections.size === 1) {
|
|
53
|
+
this.activeConnectionId = id;
|
|
54
|
+
}
|
|
55
|
+
return id;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Check if a browser instance exists at this host:port
|
|
59
|
+
*/
|
|
60
|
+
hasBrowser(host, port) {
|
|
61
|
+
const browserKey = `${host}:${port}`;
|
|
62
|
+
return this.browsers.has(browserKey);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get all connections for a specific browser
|
|
66
|
+
*/
|
|
67
|
+
getConnectionsForBrowser(host, port) {
|
|
68
|
+
const browserKey = `${host}:${port}`;
|
|
69
|
+
const browser = this.browsers.get(browserKey);
|
|
70
|
+
if (!browser) {
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
return browser.connectionIds
|
|
74
|
+
.map(id => this.connections.get(id))
|
|
75
|
+
.filter((conn) => conn !== undefined);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Find a connection by host/port (e.g. a Node --inspect port). Returns the
|
|
79
|
+
* first match if more than one connection somehow shares the same port.
|
|
80
|
+
*/
|
|
81
|
+
findConnectionByPort(host, port) {
|
|
82
|
+
return this.getConnectionsForBrowser(host, port)[0] ?? null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get all connections
|
|
86
|
+
*/
|
|
87
|
+
getAllConnections() {
|
|
88
|
+
return Array.from(this.connections.values());
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Update tab reference for a connection
|
|
92
|
+
*/
|
|
93
|
+
updateReference(connectionId, reference) {
|
|
94
|
+
const connection = this.connections.get(connectionId);
|
|
95
|
+
if (!connection) {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
connection.reference = reference;
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Get a connection by ID (or active if not specified)
|
|
103
|
+
*/
|
|
104
|
+
getConnection(id) {
|
|
105
|
+
if (id) {
|
|
106
|
+
return this.connections.get(id) || null;
|
|
107
|
+
}
|
|
108
|
+
if (this.activeConnectionId) {
|
|
109
|
+
return this.connections.get(this.activeConnectionId) || null;
|
|
110
|
+
}
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Find a connection by reference name
|
|
115
|
+
* Sanitizes input to match stored references (lowercase, trimmed, spaces to hyphens)
|
|
116
|
+
*/
|
|
117
|
+
findConnectionByReference(reference) {
|
|
118
|
+
// Sanitize: lowercase, trim, spaces to hyphens
|
|
119
|
+
const sanitized = reference.toLowerCase().trim().replace(/\s+/g, '-');
|
|
120
|
+
for (const connection of this.connections.values()) {
|
|
121
|
+
if (connection.reference === sanitized) {
|
|
122
|
+
return connection;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Check if a connection is still alive by attempting a lightweight CDP call
|
|
129
|
+
* Returns false if the connection is dead or the CDP client is not responding
|
|
130
|
+
* Uses a short timeout to avoid hanging when Chrome is killed or page is stuck
|
|
131
|
+
*
|
|
132
|
+
* This checks at the TARGET level (specific tab), not browser level.
|
|
133
|
+
* When a tab is closed, the CDP connection to that target becomes invalid
|
|
134
|
+
* even if the browser is still running.
|
|
135
|
+
*/
|
|
136
|
+
async isConnectionAlive(connection) {
|
|
137
|
+
try {
|
|
138
|
+
// Quick check: if cdpManager says not connected, it's definitely dead
|
|
139
|
+
if (!connection.cdpManager.isConnected()) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
const client = connection.cdpManager.client;
|
|
143
|
+
if (!client) {
|
|
144
|
+
return false;
|
|
145
|
+
}
|
|
146
|
+
// Check WebSocket state first - this is instant and doesn't require a round-trip
|
|
147
|
+
// The CDP client uses a WebSocket internally
|
|
148
|
+
const ws = client._ws;
|
|
149
|
+
if (ws && ws.readyState !== 1) { // 1 = WebSocket.OPEN
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
// Use a short timeout to avoid hanging on dead/stuck connections
|
|
153
|
+
const timeoutPromise = new Promise((resolve) => {
|
|
154
|
+
setTimeout(() => resolve(false), 1500);
|
|
155
|
+
});
|
|
156
|
+
const healthCheckPromise = (async () => {
|
|
157
|
+
try {
|
|
158
|
+
// IMPORTANT: Use Runtime.evaluate instead of Browser.getVersion
|
|
159
|
+
// Browser.getVersion is browser-level and works even when the tab is closed
|
|
160
|
+
// Runtime.evaluate is target-level and will fail if the tab is closed
|
|
161
|
+
// This properly detects closed tabs, not just killed Chrome processes
|
|
162
|
+
await client.Runtime.evaluate({ expression: '1', silent: true });
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
})();
|
|
169
|
+
return await Promise.race([healthCheckPromise, timeoutPromise]);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Remove a stale/dead connection from the registry without attempting cleanup operations
|
|
177
|
+
* Use this when the connection is known to be dead (e.g., Chrome was killed externally)
|
|
178
|
+
*/
|
|
179
|
+
async removeStaleConnection(connectionId) {
|
|
180
|
+
const connection = this.connections.get(connectionId);
|
|
181
|
+
if (!connection) {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
console.error(`[ConnectionManager] Removing stale connection: ${connection.reference || connectionId}`);
|
|
185
|
+
// Best-effort: let the CDP manager release its state and fire any pending
|
|
186
|
+
// resume callback (e.g. to un-pause port monitoring) even though the
|
|
187
|
+
// underlying connection is already dead - this is the more common path a
|
|
188
|
+
// paused-then-killed process actually gets cleaned up through (discovered
|
|
189
|
+
// as dead on the next tool call, rather than an explicit disconnect).
|
|
190
|
+
try {
|
|
191
|
+
await connection.cdpManager.disconnect();
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
console.error(`[ConnectionManager] Error disconnecting stale cdpManager: ${error}`);
|
|
195
|
+
}
|
|
196
|
+
// Remove from browser tracking
|
|
197
|
+
const browserKey = `${connection.host}:${connection.port}`;
|
|
198
|
+
const browser = this.browsers.get(browserKey);
|
|
199
|
+
if (browser) {
|
|
200
|
+
browser.connectionIds = browser.connectionIds.filter(connId => connId !== connectionId);
|
|
201
|
+
if (browser.connectionIds.length === 0) {
|
|
202
|
+
this.browsers.delete(browserKey);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Remove from registry
|
|
206
|
+
this.connections.delete(connectionId);
|
|
207
|
+
// Update active connection if we just removed it
|
|
208
|
+
if (this.activeConnectionId === connectionId) {
|
|
209
|
+
const remaining = Array.from(this.connections.keys());
|
|
210
|
+
this.activeConnectionId = remaining.length > 0 ? remaining[0] : null;
|
|
211
|
+
}
|
|
212
|
+
return true;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Find a connection by reference and validate it's still alive
|
|
216
|
+
* If the connection is dead, automatically removes it and returns null
|
|
217
|
+
* Use this instead of findConnectionByReference when you need to verify the connection is usable
|
|
218
|
+
*/
|
|
219
|
+
async findConnectionByReferenceValidated(reference) {
|
|
220
|
+
const connection = this.findConnectionByReference(reference);
|
|
221
|
+
if (!connection) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
const alive = await this.isConnectionAlive(connection);
|
|
225
|
+
if (!alive) {
|
|
226
|
+
console.error(`[ConnectionManager] Connection "${connection.reference}" is dead, removing stale reference`);
|
|
227
|
+
await this.removeStaleConnection(connection.id);
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
return connection;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get all connections
|
|
234
|
+
*/
|
|
235
|
+
listConnections() {
|
|
236
|
+
return Array.from(this.connections.values());
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Set the active connection
|
|
240
|
+
*/
|
|
241
|
+
setActiveConnection(id) {
|
|
242
|
+
if (this.connections.has(id)) {
|
|
243
|
+
this.activeConnectionId = id;
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get the active connection ID
|
|
250
|
+
*/
|
|
251
|
+
getActiveConnectionId() {
|
|
252
|
+
return this.activeConnectionId;
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Close a connection (tab)
|
|
256
|
+
* @param options.reason - Why this connection is being closed. 'inactivity' triggers a
|
|
257
|
+
* last-chance activity check (see below) and tags the resulting Chrome kill correctly
|
|
258
|
+
* instead of it being misreported as an 'external' close.
|
|
259
|
+
* @param options.inactivityThresholdMs - Required when reason is 'inactivity'; used for
|
|
260
|
+
* the last-chance activity check.
|
|
261
|
+
*/
|
|
262
|
+
async closeConnection(id, options) {
|
|
263
|
+
const connection = this.connections.get(id);
|
|
264
|
+
if (!connection) {
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
// Last-chance check for automatic inactivity sweeps only: lastActivityAt only tracks
|
|
268
|
+
// explicit tool calls, but the browser can still be genuinely in use via background
|
|
269
|
+
// console/network traffic (e.g. a logpoint firing on an interval) with no tool call in
|
|
270
|
+
// between. Check the monitors - which are still alive at this point - before tearing
|
|
271
|
+
// anything down, instead of after (by which point they'd already be destroyed below).
|
|
272
|
+
if (options?.reason === 'inactivity' && options.inactivityThresholdMs !== undefined) {
|
|
273
|
+
const stillActive = connection.networkMonitor?.hasRecentActivity(options.inactivityThresholdMs) ||
|
|
274
|
+
connection.consoleMonitor?.hasRecentActivity(options.inactivityThresholdMs);
|
|
275
|
+
if (stillActive) {
|
|
276
|
+
connection.lastActivityAt = Date.now();
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
// Stop monitoring if applicable
|
|
281
|
+
if (connection.puppeteerManager?.isConnected()) {
|
|
282
|
+
const page = connection.puppeteerManager.getPage();
|
|
283
|
+
connection.consoleMonitor?.stopMonitoring(page);
|
|
284
|
+
connection.networkMonitor?.stopMonitoring(page);
|
|
285
|
+
// Close the page/tab
|
|
286
|
+
try {
|
|
287
|
+
await page.close();
|
|
288
|
+
}
|
|
289
|
+
catch (error) {
|
|
290
|
+
console.error(`[ConnectionManager] Error closing page: ${error}`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
// Disconnect managers only for this connection. Best-effort: the underlying
|
|
294
|
+
// connection may already be dead (e.g. the process was killed), and we
|
|
295
|
+
// still need the rest of this cleanup (browser tracking, Chrome kill,
|
|
296
|
+
// registry removal below) to run either way.
|
|
297
|
+
try {
|
|
298
|
+
await connection.cdpManager.disconnect();
|
|
299
|
+
}
|
|
300
|
+
catch (error) {
|
|
301
|
+
console.error(`[ConnectionManager] Error disconnecting cdpManager for ${id}: ${error}`);
|
|
302
|
+
}
|
|
303
|
+
// Note: Don't disconnect puppeteerManager as it's shared across tabs
|
|
304
|
+
// Remove from browser tracking
|
|
305
|
+
const browserKey = `${connection.host}:${connection.port}`;
|
|
306
|
+
const browser = this.browsers.get(browserKey);
|
|
307
|
+
if (browser) {
|
|
308
|
+
browser.connectionIds = browser.connectionIds.filter(connId => connId !== id);
|
|
309
|
+
// If no more connections, remove browser entry and kill Chrome
|
|
310
|
+
if (browser.connectionIds.length === 0) {
|
|
311
|
+
this.browsers.delete(browserKey);
|
|
312
|
+
// Kill Chrome instance if this was the last connection to it
|
|
313
|
+
if (this.chromeLauncher && connection.type === 'chrome') {
|
|
314
|
+
try {
|
|
315
|
+
if (options?.reason === 'inactivity') {
|
|
316
|
+
this.chromeLauncher.setPendingCloseReason(connection.port, 'inactivity');
|
|
317
|
+
}
|
|
318
|
+
await this.chromeLauncher.kill(connection.port);
|
|
319
|
+
console.error(`[ConnectionManager] Killed Chrome on port ${connection.port} (last connection closed)`);
|
|
320
|
+
}
|
|
321
|
+
catch (error) {
|
|
322
|
+
console.error(`[ConnectionManager] Error killing Chrome on port ${connection.port}: ${error}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
// Remove from registry
|
|
328
|
+
this.connections.delete(id);
|
|
329
|
+
// Update active connection if we just closed it
|
|
330
|
+
if (this.activeConnectionId === id) {
|
|
331
|
+
const remaining = Array.from(this.connections.keys());
|
|
332
|
+
this.activeConnectionId = remaining.length > 0 ? remaining[0] : null;
|
|
333
|
+
}
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Close all connections
|
|
338
|
+
*/
|
|
339
|
+
async closeAll() {
|
|
340
|
+
const ids = Array.from(this.connections.keys());
|
|
341
|
+
for (const id of ids) {
|
|
342
|
+
await this.closeConnection(id);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Check if there are any connections
|
|
347
|
+
*/
|
|
348
|
+
hasConnections() {
|
|
349
|
+
return this.connections.size > 0;
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Get connection count
|
|
353
|
+
*/
|
|
354
|
+
getConnectionCount() {
|
|
355
|
+
return this.connections.size;
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Update the lastActivityAt timestamp for a connection
|
|
359
|
+
*/
|
|
360
|
+
updateActivity(id) {
|
|
361
|
+
const connection = this.connections.get(id);
|
|
362
|
+
if (connection) {
|
|
363
|
+
connection.lastActivityAt = Date.now();
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Close connections that have been inactive for longer than the specified duration
|
|
368
|
+
* @param inactivityMs - Inactivity duration in milliseconds (default: 5 minutes)
|
|
369
|
+
* @returns Number of connections closed
|
|
370
|
+
*/
|
|
371
|
+
async closeInactiveConnections(inactivityMs = 5 * 60 * 1000) {
|
|
372
|
+
const now = Date.now();
|
|
373
|
+
const connectionsToClose = [];
|
|
374
|
+
for (const [id, connection] of this.connections.entries()) {
|
|
375
|
+
const inactiveDuration = now - connection.lastActivityAt;
|
|
376
|
+
if (inactiveDuration > inactivityMs) {
|
|
377
|
+
connectionsToClose.push(id);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
let closedCount = 0;
|
|
381
|
+
for (const id of connectionsToClose) {
|
|
382
|
+
const closed = await this.closeConnection(id, { reason: 'inactivity', inactivityThresholdMs: inactivityMs });
|
|
383
|
+
if (closed) {
|
|
384
|
+
closedCount++;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
return closedCount;
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Get list of inactive connections
|
|
391
|
+
* @param inactivityMs - Inactivity duration in milliseconds (default: 5 minutes)
|
|
392
|
+
* @returns Array of inactive connections with their info
|
|
393
|
+
*/
|
|
394
|
+
getInactiveConnections(inactivityMs = 5 * 60 * 1000) {
|
|
395
|
+
const now = Date.now();
|
|
396
|
+
const inactive = [];
|
|
397
|
+
for (const connection of this.connections.values()) {
|
|
398
|
+
const inactiveDuration = now - connection.lastActivityAt;
|
|
399
|
+
if (inactiveDuration > inactivityMs) {
|
|
400
|
+
inactive.push({
|
|
401
|
+
id: connection.id,
|
|
402
|
+
reference: connection.reference,
|
|
403
|
+
inactiveForMs: inactiveDuration,
|
|
404
|
+
createdAt: connection.createdAt,
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
return inactive;
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Get console log stats from all connections
|
|
412
|
+
* Returns an array of stats per connection that has new messages
|
|
413
|
+
*/
|
|
414
|
+
getConsoleLogStats() {
|
|
415
|
+
const stats = [];
|
|
416
|
+
for (const connection of this.connections.values()) {
|
|
417
|
+
if (connection.consoleMonitor) {
|
|
418
|
+
const logStats = connection.consoleMonitor.getLogStats();
|
|
419
|
+
if (logStats.newMessages > 0) {
|
|
420
|
+
stats.push({
|
|
421
|
+
reference: connection.reference || connection.id,
|
|
422
|
+
newMessages: logStats.newMessages,
|
|
423
|
+
newErrors: logStats.newErrors,
|
|
424
|
+
newWarnings: logStats.newWarnings,
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
return stats;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
//# sourceMappingURL=connection-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-manager.js","sourceRoot":"","sources":["../src/connection-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for ConnectionManager cleanup paths:
|
|
3
|
+
* - Inactivity-triggered closeConnection() correctly checks for recent
|
|
4
|
+
* console/network activity before tearing anything down, and tags the
|
|
5
|
+
* resulting Chrome kill with the right reason (not a manual close).
|
|
6
|
+
* - Stale/close cleanup best-effort disconnects the cdpManager even when the
|
|
7
|
+
* underlying connection is already dead, so a paused-then-killed process
|
|
8
|
+
* doesn't leave dependent state (e.g. port monitoring) stuck forever.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=connection-manager.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-manager.test.d.ts","sourceRoot":"","sources":["../src/connection-manager.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for ConnectionManager cleanup paths:
|
|
3
|
+
* - Inactivity-triggered closeConnection() correctly checks for recent
|
|
4
|
+
* console/network activity before tearing anything down, and tags the
|
|
5
|
+
* resulting Chrome kill with the right reason (not a manual close).
|
|
6
|
+
* - Stale/close cleanup best-effort disconnects the cdpManager even when the
|
|
7
|
+
* underlying connection is already dead, so a paused-then-killed process
|
|
8
|
+
* doesn't leave dependent state (e.g. port monitoring) stuck forever.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
11
|
+
import { ConnectionManager } from './connection-manager.js';
|
|
12
|
+
function mockCdpManager(overrides = {}) {
|
|
13
|
+
return {
|
|
14
|
+
getRuntimeType: overrides.getRuntimeType ?? (() => 'chrome'),
|
|
15
|
+
disconnect: overrides.disconnect ?? vi.fn().mockResolvedValue(undefined),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function mockChromeLauncher() {
|
|
19
|
+
const calls = { setPendingCloseReason: [], kill: [] };
|
|
20
|
+
return {
|
|
21
|
+
calls,
|
|
22
|
+
setPendingCloseReason(port, reason) {
|
|
23
|
+
calls.setPendingCloseReason.push({ port, reason });
|
|
24
|
+
},
|
|
25
|
+
async kill(port) {
|
|
26
|
+
calls.kill.push(port);
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
describe('ConnectionManager.closeConnection - inactivity activity check', () => {
|
|
31
|
+
it('does not close a connection with recent console/network activity', async () => {
|
|
32
|
+
const cm = new ConnectionManager();
|
|
33
|
+
const launcher = mockChromeLauncher();
|
|
34
|
+
cm.setChromeLauncher(launcher);
|
|
35
|
+
const consoleMonitor = { hasRecentActivity: () => true };
|
|
36
|
+
const id = cm.createConnection(mockCdpManager(), undefined, consoleMonitor, undefined, 'localhost', 9201);
|
|
37
|
+
const conn = cm.getConnection(id);
|
|
38
|
+
conn.lastActivityAt = Date.now() - 10 * 60 * 1000;
|
|
39
|
+
const closed = await cm.closeConnection(id, { reason: 'inactivity', inactivityThresholdMs: 5 * 60 * 1000 });
|
|
40
|
+
expect(closed).toBe(false);
|
|
41
|
+
expect(cm.getConnection(id)).not.toBeNull();
|
|
42
|
+
expect(launcher.calls.kill).toHaveLength(0);
|
|
43
|
+
});
|
|
44
|
+
it('closes a genuinely idle connection and tags the Chrome kill as inactivity', async () => {
|
|
45
|
+
const cm = new ConnectionManager();
|
|
46
|
+
const launcher = mockChromeLauncher();
|
|
47
|
+
cm.setChromeLauncher(launcher);
|
|
48
|
+
const consoleMonitor = { hasRecentActivity: () => false };
|
|
49
|
+
const networkMonitor = { hasRecentActivity: () => false };
|
|
50
|
+
const id = cm.createConnection(mockCdpManager(), undefined, consoleMonitor, networkMonitor, 'localhost', 9202);
|
|
51
|
+
const conn = cm.getConnection(id);
|
|
52
|
+
conn.lastActivityAt = Date.now() - 10 * 60 * 1000;
|
|
53
|
+
const closed = await cm.closeConnection(id, { reason: 'inactivity', inactivityThresholdMs: 5 * 60 * 1000 });
|
|
54
|
+
expect(closed).toBe(true);
|
|
55
|
+
expect(cm.getConnection(id)).toBeNull();
|
|
56
|
+
expect(launcher.calls.setPendingCloseReason).toEqual([{ port: 9202, reason: 'inactivity' }]);
|
|
57
|
+
expect(launcher.calls.kill).toEqual([9202]);
|
|
58
|
+
});
|
|
59
|
+
it('manual close (e.g. tab close) ignores the activity check and does not tag a reason', async () => {
|
|
60
|
+
const cm = new ConnectionManager();
|
|
61
|
+
const launcher = mockChromeLauncher();
|
|
62
|
+
cm.setChromeLauncher(launcher);
|
|
63
|
+
const consoleMonitor = { hasRecentActivity: () => true }; // even with recent activity...
|
|
64
|
+
const id = cm.createConnection(mockCdpManager(), undefined, consoleMonitor, undefined, 'localhost', 9203);
|
|
65
|
+
const closed = await cm.closeConnection(id); // ...manual close (no options) should just close
|
|
66
|
+
expect(closed).toBe(true);
|
|
67
|
+
expect(launcher.calls.setPendingCloseReason).toHaveLength(0);
|
|
68
|
+
expect(launcher.calls.kill).toEqual([9203]);
|
|
69
|
+
});
|
|
70
|
+
it('closeInactiveConnections only counts connections actually closed', async () => {
|
|
71
|
+
const cm = new ConnectionManager();
|
|
72
|
+
const launcher = mockChromeLauncher();
|
|
73
|
+
cm.setChromeLauncher(launcher);
|
|
74
|
+
const activeConsole = { hasRecentActivity: () => true };
|
|
75
|
+
const idleConsole = { hasRecentActivity: () => false };
|
|
76
|
+
const activeId = cm.createConnection(mockCdpManager(), undefined, activeConsole, undefined, 'localhost', 9204);
|
|
77
|
+
const idleId = cm.createConnection(mockCdpManager(), undefined, idleConsole, undefined, 'localhost', 9205);
|
|
78
|
+
cm.getConnection(activeId).lastActivityAt = Date.now() - 10 * 60 * 1000;
|
|
79
|
+
cm.getConnection(idleId).lastActivityAt = Date.now() - 10 * 60 * 1000;
|
|
80
|
+
const closedCount = await cm.closeInactiveConnections(5 * 60 * 1000);
|
|
81
|
+
expect(closedCount).toBe(1);
|
|
82
|
+
expect(cm.getConnection(activeId)).not.toBeNull();
|
|
83
|
+
expect(cm.getConnection(idleId)).toBeNull();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
describe('ConnectionManager - best-effort cdpManager.disconnect() on cleanup', () => {
|
|
87
|
+
it('removeStaleConnection disconnects the cdpManager', async () => {
|
|
88
|
+
const cm = new ConnectionManager();
|
|
89
|
+
const disconnect = vi.fn().mockResolvedValue(undefined);
|
|
90
|
+
const id = cm.createConnection(mockCdpManager({ disconnect }), undefined, undefined, undefined, 'localhost', 9206);
|
|
91
|
+
const removed = await cm.removeStaleConnection(id);
|
|
92
|
+
expect(removed).toBe(true);
|
|
93
|
+
expect(disconnect).toHaveBeenCalledTimes(1);
|
|
94
|
+
expect(cm.getConnection(id)).toBeNull();
|
|
95
|
+
});
|
|
96
|
+
it('removeStaleConnection still removes the connection if disconnect() throws', async () => {
|
|
97
|
+
const cm = new ConnectionManager();
|
|
98
|
+
const disconnect = vi.fn().mockRejectedValue(new Error('already dead'));
|
|
99
|
+
const id = cm.createConnection(mockCdpManager({ disconnect }), undefined, undefined, undefined, 'localhost', 9207);
|
|
100
|
+
const removed = await cm.removeStaleConnection(id);
|
|
101
|
+
expect(removed).toBe(true);
|
|
102
|
+
expect(cm.getConnection(id)).toBeNull();
|
|
103
|
+
});
|
|
104
|
+
it('closeConnection still cleans up if cdpManager.disconnect() throws', async () => {
|
|
105
|
+
const cm = new ConnectionManager();
|
|
106
|
+
const disconnect = vi.fn().mockRejectedValue(new Error('socket already closed'));
|
|
107
|
+
const id = cm.createConnection(mockCdpManager({ disconnect }), undefined, undefined, undefined, 'localhost', 9208);
|
|
108
|
+
const closed = await cm.closeConnection(id);
|
|
109
|
+
expect(closed).toBe(true);
|
|
110
|
+
expect(disconnect).toHaveBeenCalledTimes(1);
|
|
111
|
+
expect(cm.getConnection(id)).toBeNull();
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=connection-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection-manager.test.js","sourceRoot":"","sources":["../src/connection-manager.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,SAAS,cAAc,CAAC,YAGpB,EAAE;IACJ,OAAO;QACL,cAAc,EAAE,SAAS,CAAC,cAAc,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC;QAC5D,UAAU,EAAE,SAAS,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;KACzE,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB;IACzB,MAAM,KAAK,GAAG,EAAE,qBAAqB,EAAE,EAA6C,EAAE,IAAI,EAAE,EAAc,EAAE,CAAC;IAC7G,OAAO;QACL,KAAK;QACL,qBAAqB,CAAC,IAAY,EAAE,MAAc;YAChD,KAAK,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,IAAY;YACrB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,+DAA+D,EAAE,GAAG,EAAE;IAC7E,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,EAAE,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;QACtC,EAAE,CAAC,iBAAiB,CAAC,QAAe,CAAC,CAAC;QAEtC,MAAM,cAAc,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAS,EAAE,SAAS,EAAE,cAAqB,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QACxH,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAE,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAElD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,qBAAqB,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAE5G,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,EAAE,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;QACtC,EAAE,CAAC,iBAAiB,CAAC,QAAe,CAAC,CAAC;QAEtC,MAAM,cAAc,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QAC1D,MAAM,cAAc,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QAC1D,MAAM,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAS,EAAE,SAAS,EAAE,cAAqB,EAAE,cAAqB,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QACpI,MAAM,IAAI,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAE,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAElD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,qBAAqB,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAE5G,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QAC7F,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,MAAM,EAAE,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;QACtC,EAAE,CAAC,iBAAiB,CAAC,QAAe,CAAC,CAAC;QAEtC,MAAM,cAAc,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,+BAA+B;QACzF,MAAM,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAS,EAAE,SAAS,EAAE,cAAqB,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAExH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,iDAAiD;QAE9F,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,EAAE,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,kBAAkB,EAAE,CAAC;QACtC,EAAE,CAAC,iBAAiB,CAAC,QAAe,CAAC,CAAC;QAEtC,MAAM,aAAa,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;QACxD,MAAM,WAAW,GAAG,EAAE,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC;QAEvD,MAAM,QAAQ,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAS,EAAE,SAAS,EAAE,aAAoB,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAC7H,MAAM,MAAM,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,EAAS,EAAE,SAAS,EAAE,WAAkB,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QACzH,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAE,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACzE,EAAE,CAAC,aAAa,CAAC,MAAM,CAAE,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAEvE,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,wBAAwB,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAErE,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClD,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oEAAoE,EAAE,GAAG,EAAE;IAClF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,EAAE,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,CAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAE1H,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAEnD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,EAAE,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;QACxE,MAAM,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,CAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAE1H,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAEnD,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,EAAE,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACjF,MAAM,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,CAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;QAE1H,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAE5C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,UAAU,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|