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,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network Monitor
|
|
3
|
+
* Tracks network requests from the browser
|
|
4
|
+
*/
|
|
5
|
+
import { Page } from 'puppeteer-core';
|
|
6
|
+
export interface StoredNetworkRequest {
|
|
7
|
+
id: string;
|
|
8
|
+
url: string;
|
|
9
|
+
method: string;
|
|
10
|
+
resourceType: string;
|
|
11
|
+
requestHeaders: Record<string, string>;
|
|
12
|
+
postData?: string;
|
|
13
|
+
response?: {
|
|
14
|
+
status: number;
|
|
15
|
+
statusText: string;
|
|
16
|
+
headers: Record<string, string>;
|
|
17
|
+
body?: string;
|
|
18
|
+
bodySize?: number;
|
|
19
|
+
bodyTokens?: number;
|
|
20
|
+
bodyPath?: string;
|
|
21
|
+
};
|
|
22
|
+
timing?: {
|
|
23
|
+
startTime: number;
|
|
24
|
+
endTime?: number;
|
|
25
|
+
duration?: number;
|
|
26
|
+
};
|
|
27
|
+
failed: boolean;
|
|
28
|
+
errorText?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* One WebSocket's life. Puppeteer's page events do not cover WebSockets, so
|
|
32
|
+
* these come from the raw CDP Network domain.
|
|
33
|
+
*
|
|
34
|
+
* A socket that opened and is still open is healthy. One that CLOSED during a
|
|
35
|
+
* run is the interesting case: an app whose reads come over a socket can keep
|
|
36
|
+
* rendering the last synced snapshot afterwards and pass every assertion.
|
|
37
|
+
*/
|
|
38
|
+
export interface StoredWebSocket {
|
|
39
|
+
id: string;
|
|
40
|
+
url: string;
|
|
41
|
+
openedAt: number;
|
|
42
|
+
closedAt?: number;
|
|
43
|
+
/** Frame-level protocol errors, which do not necessarily close the socket. */
|
|
44
|
+
errors: string[];
|
|
45
|
+
/**
|
|
46
|
+
* CDP target type that owns the socket - 'page', or a worker type such as
|
|
47
|
+
* 'worker'/'shared_worker'/'service_worker'. An app that syncs from a worker
|
|
48
|
+
* has its real transport here, not on the page.
|
|
49
|
+
*/
|
|
50
|
+
target: string;
|
|
51
|
+
/** CDP session the socket was seen on; scopes its id and its lifetime. */
|
|
52
|
+
sessionId: string;
|
|
53
|
+
/**
|
|
54
|
+
* Its target is gone, so the close came with the teardown rather than from
|
|
55
|
+
* the transport failing. Decided when the socket is read, not when it closed:
|
|
56
|
+
* a close event and its target's detach race, and blaming whichever arrived
|
|
57
|
+
* first made healthy navigations and identity changes look like drops.
|
|
58
|
+
*/
|
|
59
|
+
closedWithTarget?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* The page sent a close frame - it hung up on purpose (an app dropping a
|
|
62
|
+
* socket on sign-out or an identity change), rather than losing the
|
|
63
|
+
* transport. `Network.webSocketClosed` carries no close code, so the sent
|
|
64
|
+
* opcode-8 frame is the only CDP-visible signal of intent.
|
|
65
|
+
*/
|
|
66
|
+
clientClosed?: boolean;
|
|
67
|
+
}
|
|
68
|
+
export declare class NetworkMonitor {
|
|
69
|
+
private sockets;
|
|
70
|
+
/**
|
|
71
|
+
* Sessions still attached. Whether a socket's target is gone has to be
|
|
72
|
+
* answered when the question is asked, not when the socket closed: the close
|
|
73
|
+
* event and the target's detach race, and if the close lands first the socket
|
|
74
|
+
* looks self-inflicted when its worker was actually being torn down.
|
|
75
|
+
*/
|
|
76
|
+
private liveSessions;
|
|
77
|
+
private wsClient;
|
|
78
|
+
/** The page wsClient belongs to, so re-entry can tell "again" from "elsewhere". */
|
|
79
|
+
private wsPage;
|
|
80
|
+
private requests;
|
|
81
|
+
private requestIdCounter;
|
|
82
|
+
private maxRequests;
|
|
83
|
+
private isMonitoring;
|
|
84
|
+
private lastActivityTime;
|
|
85
|
+
/**
|
|
86
|
+
* Start monitoring network requests on a page
|
|
87
|
+
*/
|
|
88
|
+
startMonitoring(page: Page): void;
|
|
89
|
+
/**
|
|
90
|
+
* Subscribe to the CDP WebSocket lifecycle events for this page and its workers.
|
|
91
|
+
*
|
|
92
|
+
* Called again after every navigation (page-tools restartMonitoring), but the
|
|
93
|
+
* page's CDP session and its auto-attach both survive navigation - so one
|
|
94
|
+
* session per page is set up once and kept.
|
|
95
|
+
*
|
|
96
|
+
* Recreating it per navigation is worse than redundant. A second session
|
|
97
|
+
* auto-attaches to the same workers and records every socket twice, and
|
|
98
|
+
* detaching the first orphans whatever it had already recorded: nothing is
|
|
99
|
+
* left to deliver those sockets' close events, so they read open forever. A
|
|
100
|
+
* frozen-open entry is exactly what makes a "is the transport up?" check pass
|
|
101
|
+
* over a dead socket.
|
|
102
|
+
*/
|
|
103
|
+
private startSocketMonitoring;
|
|
104
|
+
/**
|
|
105
|
+
* Funnel one session's WebSocket lifecycle into the shared store.
|
|
106
|
+
*
|
|
107
|
+
* CDP requestIds are unique per session, not globally, so the store is keyed
|
|
108
|
+
* by session and id together - two targets can otherwise overwrite each
|
|
109
|
+
* other's sockets.
|
|
110
|
+
*/
|
|
111
|
+
private bindSocketEvents;
|
|
112
|
+
/** Every WebSocket seen, oldest first. */
|
|
113
|
+
getSockets(): StoredWebSocket[];
|
|
114
|
+
/** Open / closed / errored counts, for a health check. */
|
|
115
|
+
getSocketHealth(): {
|
|
116
|
+
total: number;
|
|
117
|
+
open: number;
|
|
118
|
+
closed: number;
|
|
119
|
+
errored: number;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* Stop monitoring
|
|
123
|
+
*/
|
|
124
|
+
stopMonitoring(page: Page): void;
|
|
125
|
+
/**
|
|
126
|
+
* Handle request start
|
|
127
|
+
*/
|
|
128
|
+
private onRequest;
|
|
129
|
+
/**
|
|
130
|
+
* Handle response
|
|
131
|
+
*/
|
|
132
|
+
private onResponse;
|
|
133
|
+
/**
|
|
134
|
+
* Handle request failure
|
|
135
|
+
*/
|
|
136
|
+
private onRequestFailed;
|
|
137
|
+
/**
|
|
138
|
+
* Get all requests
|
|
139
|
+
*/
|
|
140
|
+
getRequests(filter?: {
|
|
141
|
+
resourceType?: string;
|
|
142
|
+
limit?: number;
|
|
143
|
+
offset?: number;
|
|
144
|
+
}): StoredNetworkRequest[];
|
|
145
|
+
/**
|
|
146
|
+
* Get a request by ID
|
|
147
|
+
*/
|
|
148
|
+
getRequest(id: string): StoredNetworkRequest | undefined;
|
|
149
|
+
/**
|
|
150
|
+
* Clear all requests
|
|
151
|
+
*/
|
|
152
|
+
clearSockets(): void;
|
|
153
|
+
clear(): void;
|
|
154
|
+
/**
|
|
155
|
+
* Get request count
|
|
156
|
+
*/
|
|
157
|
+
getCount(resourceType?: string): number;
|
|
158
|
+
/**
|
|
159
|
+
* Check if monitoring
|
|
160
|
+
*/
|
|
161
|
+
isActive(): boolean;
|
|
162
|
+
/**
|
|
163
|
+
* Get the timestamp of the last network activity
|
|
164
|
+
*/
|
|
165
|
+
getLastActivityTime(): number;
|
|
166
|
+
/**
|
|
167
|
+
* Check if there has been network activity within the specified duration
|
|
168
|
+
* @param withinMs - Duration in milliseconds to check for activity
|
|
169
|
+
*/
|
|
170
|
+
hasRecentActivity(withinMs: number): boolean;
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=network-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-monitor.d.ts","sourceRoot":"","sources":["../src/network-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Network Monitor
|
|
3
|
+
* Tracks network requests from the browser
|
|
4
|
+
*/
|
|
5
|
+
export class NetworkMonitor {
|
|
6
|
+
sockets = new Map();
|
|
7
|
+
/**
|
|
8
|
+
* Sessions still attached. Whether a socket's target is gone has to be
|
|
9
|
+
* answered when the question is asked, not when the socket closed: the close
|
|
10
|
+
* event and the target's detach race, and if the close lands first the socket
|
|
11
|
+
* looks self-inflicted when its worker was actually being torn down.
|
|
12
|
+
*/
|
|
13
|
+
liveSessions = new Set();
|
|
14
|
+
wsClient = null;
|
|
15
|
+
/** The page wsClient belongs to, so re-entry can tell "again" from "elsewhere". */
|
|
16
|
+
wsPage = null;
|
|
17
|
+
requests = new Map();
|
|
18
|
+
requestIdCounter = 0;
|
|
19
|
+
maxRequests = 1000;
|
|
20
|
+
isMonitoring = false;
|
|
21
|
+
lastActivityTime = Date.now();
|
|
22
|
+
/**
|
|
23
|
+
* Start monitoring network requests on a page
|
|
24
|
+
*/
|
|
25
|
+
startMonitoring(page) {
|
|
26
|
+
// Remove any existing listeners first to avoid duplicates
|
|
27
|
+
page.removeAllListeners('request');
|
|
28
|
+
page.removeAllListeners('response');
|
|
29
|
+
page.removeAllListeners('requestfailed');
|
|
30
|
+
// Attach network listeners
|
|
31
|
+
page.on('request', (request) => {
|
|
32
|
+
this.onRequest(request);
|
|
33
|
+
});
|
|
34
|
+
page.on('response', async (response) => {
|
|
35
|
+
await this.onResponse(response);
|
|
36
|
+
});
|
|
37
|
+
page.on('requestfailed', (request) => {
|
|
38
|
+
this.onRequestFailed(request);
|
|
39
|
+
});
|
|
40
|
+
// WebSocket lifecycle rides the CDP Network domain - puppeteer surfaces no
|
|
41
|
+
// page event for it. Failing to attach must not break HTTP monitoring.
|
|
42
|
+
void this.startSocketMonitoring(page);
|
|
43
|
+
this.isMonitoring = true;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Subscribe to the CDP WebSocket lifecycle events for this page and its workers.
|
|
47
|
+
*
|
|
48
|
+
* Called again after every navigation (page-tools restartMonitoring), but the
|
|
49
|
+
* page's CDP session and its auto-attach both survive navigation - so one
|
|
50
|
+
* session per page is set up once and kept.
|
|
51
|
+
*
|
|
52
|
+
* Recreating it per navigation is worse than redundant. A second session
|
|
53
|
+
* auto-attaches to the same workers and records every socket twice, and
|
|
54
|
+
* detaching the first orphans whatever it had already recorded: nothing is
|
|
55
|
+
* left to deliver those sockets' close events, so they read open forever. A
|
|
56
|
+
* frozen-open entry is exactly what makes a "is the transport up?" check pass
|
|
57
|
+
* over a dead socket.
|
|
58
|
+
*/
|
|
59
|
+
async startSocketMonitoring(page) {
|
|
60
|
+
if (this.wsClient && this.wsPage === page)
|
|
61
|
+
return;
|
|
62
|
+
// A genuinely different page: that session's sockets belong to a document
|
|
63
|
+
// that is gone.
|
|
64
|
+
const previous = this.wsClient;
|
|
65
|
+
this.wsClient = null;
|
|
66
|
+
if (previous) {
|
|
67
|
+
try {
|
|
68
|
+
await previous.detach();
|
|
69
|
+
}
|
|
70
|
+
catch { /* already gone with its target */ }
|
|
71
|
+
for (const sock of this.sockets.values())
|
|
72
|
+
if (!sock.closedAt)
|
|
73
|
+
sock.closedAt = Date.now();
|
|
74
|
+
this.liveSessions.clear();
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
this.wsPage = page;
|
|
78
|
+
const client = await page.createCDPSession();
|
|
79
|
+
this.wsClient = client;
|
|
80
|
+
await client.send('Network.enable');
|
|
81
|
+
// The page's own session outlives every navigation, so its sockets are
|
|
82
|
+
// judged on their own close events, never as target teardown.
|
|
83
|
+
this.liveSessions.add('page');
|
|
84
|
+
this.bindSocketEvents(client, 'page', 'page');
|
|
85
|
+
// A socket opened inside a Web Worker belongs to that worker's target and
|
|
86
|
+
// emits nothing on the page session, so each worker needs its own session
|
|
87
|
+
// with Network enabled. waitForDebuggerOnStart holds the worker before its
|
|
88
|
+
// first line runs - otherwise a socket opened at worker boot is missed.
|
|
89
|
+
client.on('Target.attachedToTarget', async (e) => {
|
|
90
|
+
const child = client.connection?.()?.session(e.sessionId);
|
|
91
|
+
try {
|
|
92
|
+
if (child) {
|
|
93
|
+
await child.send('Network.enable');
|
|
94
|
+
this.liveSessions.add(e.sessionId);
|
|
95
|
+
this.bindSocketEvents(child, String(e.targetInfo?.type || 'worker'), e.sessionId);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Target went away mid-attach; nothing to unwind.
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
// Must run on EVERY path, including no child session. The target is
|
|
103
|
+
// held before its first line, so failing to resume it does not lose
|
|
104
|
+
// monitoring - it stops the worker existing, and an app whose sync
|
|
105
|
+
// lives in that worker simply never starts.
|
|
106
|
+
if (e.waitingForDebugger) {
|
|
107
|
+
const resume = child ?? client;
|
|
108
|
+
await resume.send('Runtime.runIfWaitingForDebugger', child ? undefined : { sessionId: e.sessionId })
|
|
109
|
+
.catch(() => { });
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
// A target that goes away takes its sockets with it and delivers no
|
|
114
|
+
// webSocketClosed for them - a navigation replaces the worker, and its
|
|
115
|
+
// socket would otherwise read as open forever.
|
|
116
|
+
client.on('Target.detachedFromTarget', (e) => {
|
|
117
|
+
this.liveSessions.delete(e.sessionId);
|
|
118
|
+
for (const sock of this.sockets.values()) {
|
|
119
|
+
if (sock.sessionId === e.sessionId && !sock.closedAt) {
|
|
120
|
+
sock.closedAt = Date.now();
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
await client.send('Target.setAutoAttach', {
|
|
125
|
+
autoAttach: true,
|
|
126
|
+
waitForDebuggerOnStart: true,
|
|
127
|
+
flatten: true,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// No CDP session: HTTP monitoring still works, sockets are simply unseen.
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Funnel one session's WebSocket lifecycle into the shared store.
|
|
136
|
+
*
|
|
137
|
+
* CDP requestIds are unique per session, not globally, so the store is keyed
|
|
138
|
+
* by session and id together - two targets can otherwise overwrite each
|
|
139
|
+
* other's sockets.
|
|
140
|
+
*/
|
|
141
|
+
bindSocketEvents(client, target, sessionId) {
|
|
142
|
+
const key = (requestId) => `${sessionId}:${requestId}`;
|
|
143
|
+
client.on('Network.webSocketCreated', (e) => {
|
|
144
|
+
this.sockets.set(key(e.requestId), {
|
|
145
|
+
id: e.requestId, url: e.url, openedAt: Date.now(), errors: [], target, sessionId,
|
|
146
|
+
});
|
|
147
|
+
this.lastActivityTime = Date.now();
|
|
148
|
+
});
|
|
149
|
+
client.on('Network.webSocketClosed', (e) => {
|
|
150
|
+
const sock = this.sockets.get(key(e.requestId));
|
|
151
|
+
if (sock)
|
|
152
|
+
sock.closedAt = Date.now();
|
|
153
|
+
this.lastActivityTime = Date.now();
|
|
154
|
+
});
|
|
155
|
+
client.on('Network.webSocketFrameError', (e) => {
|
|
156
|
+
const sock = this.sockets.get(key(e.requestId));
|
|
157
|
+
if (sock)
|
|
158
|
+
sock.errors.push(String(e.errorMessage || 'frame error'));
|
|
159
|
+
});
|
|
160
|
+
// Opcode 8 is the close frame. Sent by the page means it chose to hang up.
|
|
161
|
+
client.on('Network.webSocketFrameSent', (e) => {
|
|
162
|
+
if (e?.response?.opcode !== 8)
|
|
163
|
+
return;
|
|
164
|
+
const sock = this.sockets.get(key(e.requestId));
|
|
165
|
+
if (sock)
|
|
166
|
+
sock.clientClosed = true;
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/** Every WebSocket seen, oldest first. */
|
|
170
|
+
getSockets() {
|
|
171
|
+
return [...this.sockets.values()]
|
|
172
|
+
.map(s => ({
|
|
173
|
+
...s,
|
|
174
|
+
// Answered now rather than at close time - see closedWithTarget. The
|
|
175
|
+
// page session is never detached while monitoring runs, so a page
|
|
176
|
+
// socket is only ever judged on its own close.
|
|
177
|
+
closedWithTarget: !!s.closedAt && !this.liveSessions.has(s.sessionId),
|
|
178
|
+
}))
|
|
179
|
+
.sort((a, b) => a.openedAt - b.openedAt);
|
|
180
|
+
}
|
|
181
|
+
/** Open / closed / errored counts, for a health check. */
|
|
182
|
+
getSocketHealth() {
|
|
183
|
+
const all = this.getSockets();
|
|
184
|
+
return {
|
|
185
|
+
total: all.length,
|
|
186
|
+
open: all.filter(s => !s.closedAt).length,
|
|
187
|
+
closed: all.filter(s => s.closedAt).length,
|
|
188
|
+
errored: all.filter(s => s.errors.length > 0).length,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Stop monitoring
|
|
193
|
+
*/
|
|
194
|
+
stopMonitoring(page) {
|
|
195
|
+
page.removeAllListeners('request');
|
|
196
|
+
page.removeAllListeners('response');
|
|
197
|
+
page.removeAllListeners('requestfailed');
|
|
198
|
+
this.isMonitoring = false;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Handle request start
|
|
202
|
+
*/
|
|
203
|
+
onRequest(request) {
|
|
204
|
+
const id = `network-${this.requestIdCounter++}`;
|
|
205
|
+
this.lastActivityTime = Date.now();
|
|
206
|
+
const storedRequest = {
|
|
207
|
+
id,
|
|
208
|
+
url: request.url(),
|
|
209
|
+
method: request.method(),
|
|
210
|
+
resourceType: request.resourceType(),
|
|
211
|
+
requestHeaders: request.headers(),
|
|
212
|
+
postData: request.postData(),
|
|
213
|
+
timing: {
|
|
214
|
+
startTime: Date.now(),
|
|
215
|
+
},
|
|
216
|
+
failed: false,
|
|
217
|
+
};
|
|
218
|
+
this.requests.set(id, storedRequest);
|
|
219
|
+
// Keep only last N requests
|
|
220
|
+
if (this.requests.size > this.maxRequests) {
|
|
221
|
+
const firstKey = this.requests.keys().next().value;
|
|
222
|
+
if (firstKey) {
|
|
223
|
+
this.requests.delete(firstKey);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Handle response
|
|
229
|
+
*/
|
|
230
|
+
async onResponse(response) {
|
|
231
|
+
const request = response.request();
|
|
232
|
+
const url = request.url();
|
|
233
|
+
// Find the stored request
|
|
234
|
+
const storedRequest = Array.from(this.requests.values()).find(r => r.url === url && !r.response);
|
|
235
|
+
if (storedRequest && storedRequest.timing) {
|
|
236
|
+
storedRequest.timing.endTime = Date.now();
|
|
237
|
+
storedRequest.timing.duration = storedRequest.timing.endTime - storedRequest.timing.startTime;
|
|
238
|
+
try {
|
|
239
|
+
// Get response body (only for certain content types to avoid binary data issues)
|
|
240
|
+
let body;
|
|
241
|
+
let bodySize;
|
|
242
|
+
let bodyTokens;
|
|
243
|
+
const contentType = response.headers()['content-type'] || '';
|
|
244
|
+
const isText = contentType.includes('text') ||
|
|
245
|
+
contentType.includes('json') ||
|
|
246
|
+
contentType.includes('javascript');
|
|
247
|
+
if (isText) {
|
|
248
|
+
try {
|
|
249
|
+
body = await response.text();
|
|
250
|
+
// Track body size and estimate token count
|
|
251
|
+
if (body) {
|
|
252
|
+
bodySize = body.length;
|
|
253
|
+
// Rough estimation: 1 token ≈ 4 characters
|
|
254
|
+
bodyTokens = Math.ceil(bodySize / 4);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
// Ignore errors when reading body
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
storedRequest.response = {
|
|
262
|
+
status: response.status(),
|
|
263
|
+
statusText: response.statusText(),
|
|
264
|
+
headers: response.headers(),
|
|
265
|
+
body,
|
|
266
|
+
bodySize,
|
|
267
|
+
bodyTokens,
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
// Response might not be available
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Handle request failure
|
|
277
|
+
*/
|
|
278
|
+
onRequestFailed(request) {
|
|
279
|
+
const url = request.url();
|
|
280
|
+
// Find the stored request
|
|
281
|
+
const storedRequest = Array.from(this.requests.values()).find(r => r.url === url && !r.failed);
|
|
282
|
+
if (storedRequest) {
|
|
283
|
+
storedRequest.failed = true;
|
|
284
|
+
storedRequest.errorText = request.failure()?.errorText;
|
|
285
|
+
if (storedRequest.timing) {
|
|
286
|
+
storedRequest.timing.endTime = Date.now();
|
|
287
|
+
storedRequest.timing.duration = storedRequest.timing.endTime - storedRequest.timing.startTime;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Get all requests
|
|
293
|
+
*/
|
|
294
|
+
getRequests(filter) {
|
|
295
|
+
let filtered = Array.from(this.requests.values());
|
|
296
|
+
// Filter by resource type
|
|
297
|
+
if (filter?.resourceType) {
|
|
298
|
+
filtered = filtered.filter(req => req.resourceType === filter.resourceType);
|
|
299
|
+
}
|
|
300
|
+
// Apply offset and limit
|
|
301
|
+
const offset = filter?.offset || 0;
|
|
302
|
+
const limit = filter?.limit || filtered.length;
|
|
303
|
+
return filtered.slice(offset, offset + limit);
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Get a request by ID
|
|
307
|
+
*/
|
|
308
|
+
getRequest(id) {
|
|
309
|
+
return this.requests.get(id);
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Clear all requests
|
|
313
|
+
*/
|
|
314
|
+
clearSockets() {
|
|
315
|
+
this.sockets.clear();
|
|
316
|
+
}
|
|
317
|
+
clear() {
|
|
318
|
+
this.requests.clear();
|
|
319
|
+
this.requestIdCounter = 0;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Get request count
|
|
323
|
+
*/
|
|
324
|
+
getCount(resourceType) {
|
|
325
|
+
if (resourceType) {
|
|
326
|
+
return Array.from(this.requests.values()).filter(req => req.resourceType === resourceType).length;
|
|
327
|
+
}
|
|
328
|
+
return this.requests.size;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Check if monitoring
|
|
332
|
+
*/
|
|
333
|
+
isActive() {
|
|
334
|
+
return this.isMonitoring;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Get the timestamp of the last network activity
|
|
338
|
+
*/
|
|
339
|
+
getLastActivityTime() {
|
|
340
|
+
return this.lastActivityTime;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Check if there has been network activity within the specified duration
|
|
344
|
+
* @param withinMs - Duration in milliseconds to check for activity
|
|
345
|
+
*/
|
|
346
|
+
hasRecentActivity(withinMs) {
|
|
347
|
+
return Date.now() - this.lastActivityTime < withinMs;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
//# sourceMappingURL=network-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-monitor.js","sourceRoot":"","sources":["../src/network-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared overlay system for cdp-tools
|
|
3
|
+
* Provides consistent UI for issue workflows (workOn, resolve, replay)
|
|
4
|
+
*/
|
|
5
|
+
import type { Page } from 'puppeteer-core';
|
|
6
|
+
export type OverlayAction = 'cancel' | 'record' | 'explore' | 'begin' | 'yes' | 'no';
|
|
7
|
+
export interface OverlayButton {
|
|
8
|
+
id: string;
|
|
9
|
+
label: string;
|
|
10
|
+
action: OverlayAction;
|
|
11
|
+
primary?: boolean;
|
|
12
|
+
danger?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface OverlayConfig {
|
|
15
|
+
id: string;
|
|
16
|
+
title: string;
|
|
17
|
+
description: string;
|
|
18
|
+
instructions?: string;
|
|
19
|
+
buttons: OverlayButton[];
|
|
20
|
+
showComment?: boolean;
|
|
21
|
+
commentPlaceholder?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface OverlayResult {
|
|
24
|
+
action: OverlayAction;
|
|
25
|
+
comment?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Overlay for workOn when there's no sequence - offers Record or Explore
|
|
29
|
+
*/
|
|
30
|
+
export declare function getWorkOnNoSequenceConfig(issueType: 'bug' | 'feature', issueId: number, issueTitle: string): OverlayConfig;
|
|
31
|
+
/**
|
|
32
|
+
* Overlay for workOn/resolve when there IS a sequence - just Begin or Cancel
|
|
33
|
+
*/
|
|
34
|
+
export declare function getTestReadyConfig(issueType: 'bug' | 'feature', issueId: number, issueTitle: string): OverlayConfig;
|
|
35
|
+
/**
|
|
36
|
+
* Overlay for resolve verification - asks if issue is fixed
|
|
37
|
+
*/
|
|
38
|
+
export declare function getVerificationConfig(issueType: 'bug' | 'feature', issueId: number, issueTitle: string): OverlayConfig;
|
|
39
|
+
/**
|
|
40
|
+
* Show a modal overlay with configurable buttons
|
|
41
|
+
* Returns the action taken and optional comment
|
|
42
|
+
*/
|
|
43
|
+
export declare function showOverlay(page: Page, config: OverlayConfig): Promise<OverlayResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Show a "Replay in progress" overlay that blocks user interaction
|
|
46
|
+
* Returns a cleanup function to remove the overlay
|
|
47
|
+
*/
|
|
48
|
+
export declare function showReplayBanner(page: Page, issueType: 'bug' | 'feature', issueTitle: string, issueId: number): Promise<() => Promise<void>>;
|
|
49
|
+
//# sourceMappingURL=overlays.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"overlays.d.ts","sourceRoot":"","sources":["../src/overlays.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAM3C,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC;AAErF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAMD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,KAAK,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,aAAa,CAef;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,KAAK,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,aAAa,CAaf;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,KAAK,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,aAAa,CAoBf;AAMD;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,aAAa,CAAC,CAgNxB;AAMD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,KAAK,GAAG,SAAS,EAC5B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAyJ9B"}
|