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,546 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unit tests for CDPManager getVariables token budget logic, and for
|
|
3
|
+
* disconnect()'s resume-callback handling.
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
6
|
+
import { CDPManager, EvaluateExpressionExceptionError } from './cdp-manager.js';
|
|
7
|
+
// We can't directly test the private methods, but we can test the logic
|
|
8
|
+
// by extracting and testing the calculations
|
|
9
|
+
describe('Token Budget Calculations', () => {
|
|
10
|
+
/**
|
|
11
|
+
* Mirror of the calculateEffectiveBudget logic for testing
|
|
12
|
+
*/
|
|
13
|
+
function calculateEffectiveBudget(maxTokens) {
|
|
14
|
+
const FIXED_OVERHEAD = 200; // Message template + code block + wrapper
|
|
15
|
+
const PROPORTIONAL_OVERHEAD = 1.3; // JSON indentation adds ~30%
|
|
16
|
+
return Math.floor((maxTokens - FIXED_OVERHEAD) / PROPORTIONAL_OVERHEAD);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Mirror of the estimateTokens logic for testing
|
|
20
|
+
*/
|
|
21
|
+
function estimateTokens(value) {
|
|
22
|
+
const str = typeof value === 'string' ? value : JSON.stringify(value);
|
|
23
|
+
return Math.ceil(str.length / 4);
|
|
24
|
+
}
|
|
25
|
+
describe('calculateEffectiveBudget', () => {
|
|
26
|
+
it('should return ~615 tokens for default maxTokens of 1000', () => {
|
|
27
|
+
// (1000 - 200) / 1.3 = 615.38... -> 615
|
|
28
|
+
const result = calculateEffectiveBudget(1000);
|
|
29
|
+
expect(result).toBe(615);
|
|
30
|
+
});
|
|
31
|
+
it('should return 0 for maxTokens <= 200 (all consumed by overhead)', () => {
|
|
32
|
+
expect(calculateEffectiveBudget(200)).toBe(0);
|
|
33
|
+
expect(calculateEffectiveBudget(100)).toBeLessThan(0);
|
|
34
|
+
});
|
|
35
|
+
it('should scale proportionally with larger budgets', () => {
|
|
36
|
+
// (2000 - 200) / 1.3 = 1384.61... -> 1384
|
|
37
|
+
expect(calculateEffectiveBudget(2000)).toBe(1384);
|
|
38
|
+
// (5000 - 200) / 1.3 = 3692.30... -> 3692
|
|
39
|
+
expect(calculateEffectiveBudget(5000)).toBe(3692);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('estimateTokens', () => {
|
|
43
|
+
it('should estimate ~4 chars per token', () => {
|
|
44
|
+
expect(estimateTokens('1234')).toBe(1);
|
|
45
|
+
expect(estimateTokens('12345678')).toBe(2);
|
|
46
|
+
expect(estimateTokens('123')).toBe(1); // ceil(3/4) = 1
|
|
47
|
+
});
|
|
48
|
+
it('should handle objects via JSON.stringify', () => {
|
|
49
|
+
const obj = { a: 1 };
|
|
50
|
+
// JSON.stringify({ a: 1 }) = '{"a":1}' = 7 chars -> ceil(7/4) = 2
|
|
51
|
+
expect(estimateTokens(obj)).toBe(2);
|
|
52
|
+
});
|
|
53
|
+
it('should handle arrays', () => {
|
|
54
|
+
const arr = [1, 2, 3];
|
|
55
|
+
// JSON.stringify([1,2,3]) = '[1,2,3]' = 7 chars -> ceil(7/4) = 2
|
|
56
|
+
expect(estimateTokens(arr)).toBe(2);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('Response Type Selection Logic', () => {
|
|
60
|
+
/**
|
|
61
|
+
* Simulates the getVariables response type selection
|
|
62
|
+
*/
|
|
63
|
+
function selectResponseType(fullAtDepthTokens, depth0Tokens, namesOnlyTokens, effectiveBudget, requestedDepth, hasFilter) {
|
|
64
|
+
// Step 1: Try full at requested depth
|
|
65
|
+
if (requestedDepth > 0 && fullAtDepthTokens <= effectiveBudget) {
|
|
66
|
+
return { responseType: 'full', filterInsufficient: false };
|
|
67
|
+
}
|
|
68
|
+
// Step 2: Try depth 0
|
|
69
|
+
if (depth0Tokens <= effectiveBudget) {
|
|
70
|
+
const wasDepthReduced = requestedDepth > 0;
|
|
71
|
+
return {
|
|
72
|
+
responseType: wasDepthReduced ? 'depth_reduced' : 'full',
|
|
73
|
+
filterInsufficient: false
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// Step 3: Try names only
|
|
77
|
+
if (namesOnlyTokens <= effectiveBudget) {
|
|
78
|
+
return { responseType: 'names_only', filterInsufficient: hasFilter };
|
|
79
|
+
}
|
|
80
|
+
// Step 4: Counts only (always fits)
|
|
81
|
+
return { responseType: 'counts_only', filterInsufficient: hasFilter };
|
|
82
|
+
}
|
|
83
|
+
it('should return full when data fits at requested depth', () => {
|
|
84
|
+
const result = selectResponseType(500, // fullAtDepthTokens
|
|
85
|
+
200, // depth0Tokens
|
|
86
|
+
50, // namesOnlyTokens
|
|
87
|
+
615, // effectiveBudget
|
|
88
|
+
2, // requestedDepth
|
|
89
|
+
false // hasFilter
|
|
90
|
+
);
|
|
91
|
+
expect(result.responseType).toBe('full');
|
|
92
|
+
expect(result.filterInsufficient).toBe(false);
|
|
93
|
+
});
|
|
94
|
+
it('should return depth_reduced when only depth 0 fits', () => {
|
|
95
|
+
const result = selectResponseType(1000, // fullAtDepthTokens - too big
|
|
96
|
+
500, // depth0Tokens - fits
|
|
97
|
+
50, // namesOnlyTokens
|
|
98
|
+
615, // effectiveBudget
|
|
99
|
+
2, // requestedDepth
|
|
100
|
+
false // hasFilter
|
|
101
|
+
);
|
|
102
|
+
expect(result.responseType).toBe('depth_reduced');
|
|
103
|
+
expect(result.filterInsufficient).toBe(false);
|
|
104
|
+
});
|
|
105
|
+
it('should return full (not depth_reduced) when depth 0 was requested', () => {
|
|
106
|
+
const result = selectResponseType(500, // fullAtDepthTokens
|
|
107
|
+
500, // depth0Tokens
|
|
108
|
+
50, // namesOnlyTokens
|
|
109
|
+
615, // effectiveBudget
|
|
110
|
+
0, // requestedDepth = 0
|
|
111
|
+
false // hasFilter
|
|
112
|
+
);
|
|
113
|
+
expect(result.responseType).toBe('full');
|
|
114
|
+
expect(result.filterInsufficient).toBe(false);
|
|
115
|
+
});
|
|
116
|
+
it('should return names_only when depth 0 is too big', () => {
|
|
117
|
+
const result = selectResponseType(2000, // fullAtDepthTokens - too big
|
|
118
|
+
1000, // depth0Tokens - too big
|
|
119
|
+
300, // namesOnlyTokens - fits
|
|
120
|
+
615, // effectiveBudget
|
|
121
|
+
2, // requestedDepth
|
|
122
|
+
false // hasFilter
|
|
123
|
+
);
|
|
124
|
+
expect(result.responseType).toBe('names_only');
|
|
125
|
+
expect(result.filterInsufficient).toBe(false);
|
|
126
|
+
});
|
|
127
|
+
it('should set filterInsufficient when filter provided but still too large', () => {
|
|
128
|
+
const result = selectResponseType(2000, // fullAtDepthTokens - too big
|
|
129
|
+
1000, // depth0Tokens - too big
|
|
130
|
+
300, // namesOnlyTokens - fits
|
|
131
|
+
615, // effectiveBudget
|
|
132
|
+
2, // requestedDepth
|
|
133
|
+
true // hasFilter
|
|
134
|
+
);
|
|
135
|
+
expect(result.responseType).toBe('names_only');
|
|
136
|
+
expect(result.filterInsufficient).toBe(true);
|
|
137
|
+
});
|
|
138
|
+
it('should return counts_only when names too big', () => {
|
|
139
|
+
const result = selectResponseType(5000, // fullAtDepthTokens - too big
|
|
140
|
+
3000, // depth0Tokens - too big
|
|
141
|
+
1000, // namesOnlyTokens - too big
|
|
142
|
+
615, // effectiveBudget
|
|
143
|
+
2, // requestedDepth
|
|
144
|
+
false // hasFilter
|
|
145
|
+
);
|
|
146
|
+
expect(result.responseType).toBe('counts_only');
|
|
147
|
+
expect(result.filterInsufficient).toBe(false);
|
|
148
|
+
});
|
|
149
|
+
it('should set filterInsufficient on counts_only when filter provided', () => {
|
|
150
|
+
const result = selectResponseType(5000, // fullAtDepthTokens - too big
|
|
151
|
+
3000, // depth0Tokens - too big
|
|
152
|
+
1000, // namesOnlyTokens - too big
|
|
153
|
+
615, // effectiveBudget
|
|
154
|
+
2, // requestedDepth
|
|
155
|
+
true // hasFilter
|
|
156
|
+
);
|
|
157
|
+
expect(result.responseType).toBe('counts_only');
|
|
158
|
+
expect(result.filterInsufficient).toBe(true);
|
|
159
|
+
});
|
|
160
|
+
});
|
|
161
|
+
describe('Real-world Scenarios', () => {
|
|
162
|
+
it('should handle small scope (5 local variables, no global) - expect full', () => {
|
|
163
|
+
const variables = [
|
|
164
|
+
{ name: 'count', value: 42, type: 'number', scopeType: 'local' },
|
|
165
|
+
{ name: 'name', value: 'test', type: 'string', scopeType: 'local' },
|
|
166
|
+
{ name: 'user', value: { id: 1, name: 'John' }, type: 'object', scopeType: 'local' },
|
|
167
|
+
{ name: 'items', value: [1, 2, 3], type: 'object', scopeType: 'local' },
|
|
168
|
+
{ name: 'config', value: { debug: true }, type: 'object', scopeType: 'local' },
|
|
169
|
+
];
|
|
170
|
+
const tokens = estimateTokens(variables);
|
|
171
|
+
const budget = calculateEffectiveBudget(1000);
|
|
172
|
+
// This should easily fit
|
|
173
|
+
expect(tokens).toBeLessThan(budget);
|
|
174
|
+
});
|
|
175
|
+
it('should handle large scope with many variables - may need fallback', () => {
|
|
176
|
+
// Create 100 variables
|
|
177
|
+
const variables = Array.from({ length: 100 }, (_, i) => ({
|
|
178
|
+
name: `variable${i}`,
|
|
179
|
+
value: { data: `value${i}`, nested: { deep: i } },
|
|
180
|
+
type: 'object',
|
|
181
|
+
scopeType: 'local',
|
|
182
|
+
}));
|
|
183
|
+
const tokens = estimateTokens(variables);
|
|
184
|
+
const budget = calculateEffectiveBudget(1000);
|
|
185
|
+
// This should exceed the budget
|
|
186
|
+
expect(tokens).toBeGreaterThan(budget);
|
|
187
|
+
// But names only should fit
|
|
188
|
+
const namesOnly = { local: variables.map(v => v.name) };
|
|
189
|
+
const namesTokens = estimateTokens(namesOnly);
|
|
190
|
+
expect(namesTokens).toBeLessThan(budget);
|
|
191
|
+
});
|
|
192
|
+
it('should demonstrate the overhead calculation is reasonable', () => {
|
|
193
|
+
// Test that our overhead accounts for realistic message formatting
|
|
194
|
+
const data = { local: [{ name: 'x', value: 1, type: 'number' }] };
|
|
195
|
+
const rawTokens = estimateTokens(data);
|
|
196
|
+
// Simulate what the final response might look like
|
|
197
|
+
const messageTemplate = 'Variables for call frame abc123: 1 of 1 total at depth 2';
|
|
198
|
+
const codeBlock = '```json\n' + JSON.stringify(data, null, 2) + '\n```';
|
|
199
|
+
const fullResponse = messageTemplate + '\n\n' + codeBlock;
|
|
200
|
+
const fullTokens = estimateTokens(fullResponse);
|
|
201
|
+
const overhead = fullTokens - rawTokens;
|
|
202
|
+
// Our FIXED_OVERHEAD of 200 should be greater than actual overhead
|
|
203
|
+
// to provide a safety buffer
|
|
204
|
+
expect(200).toBeGreaterThanOrEqual(overhead);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
describe('CDPManager.disconnect() resume-callback handling', () => {
|
|
209
|
+
// `client` and `state` are private, but typed loosely enough (client: any)
|
|
210
|
+
// that poking them directly is the simplest way to exercise disconnect()'s
|
|
211
|
+
// cleanup logic without standing up a real CDP connection.
|
|
212
|
+
function withMockClient(cdpManager, close, paused) {
|
|
213
|
+
cdpManager.client = { close };
|
|
214
|
+
cdpManager.state.paused = paused;
|
|
215
|
+
}
|
|
216
|
+
it('fires resumeCallback when disconnecting a paused connection', async () => {
|
|
217
|
+
const cdpManager = new CDPManager();
|
|
218
|
+
const resumeCallback = vi.fn();
|
|
219
|
+
cdpManager.setResumeCallback(resumeCallback);
|
|
220
|
+
const close = vi.fn().mockResolvedValue(undefined);
|
|
221
|
+
withMockClient(cdpManager, close, true);
|
|
222
|
+
await cdpManager.disconnect();
|
|
223
|
+
expect(close).toHaveBeenCalledTimes(1);
|
|
224
|
+
expect(resumeCallback).toHaveBeenCalledTimes(1);
|
|
225
|
+
});
|
|
226
|
+
it('does not fire resumeCallback when disconnecting a connection that was not paused', async () => {
|
|
227
|
+
const cdpManager = new CDPManager();
|
|
228
|
+
const resumeCallback = vi.fn();
|
|
229
|
+
cdpManager.setResumeCallback(resumeCallback);
|
|
230
|
+
const close = vi.fn().mockResolvedValue(undefined);
|
|
231
|
+
withMockClient(cdpManager, close, false);
|
|
232
|
+
await cdpManager.disconnect();
|
|
233
|
+
expect(resumeCallback).not.toHaveBeenCalled();
|
|
234
|
+
});
|
|
235
|
+
it('still fires resumeCallback even if client.close() throws', async () => {
|
|
236
|
+
const cdpManager = new CDPManager();
|
|
237
|
+
const resumeCallback = vi.fn();
|
|
238
|
+
cdpManager.setResumeCallback(resumeCallback);
|
|
239
|
+
const close = vi.fn().mockRejectedValue(new Error('socket already closed'));
|
|
240
|
+
withMockClient(cdpManager, close, true);
|
|
241
|
+
await expect(cdpManager.disconnect()).rejects.toThrow('socket already closed');
|
|
242
|
+
expect(resumeCallback).toHaveBeenCalledTimes(1);
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
describe('CDPManager.evaluateExpression() - bug-004 (hang on thrown RangeError)', () => {
|
|
246
|
+
// Root cause: Runtime.evaluate()/Debugger.evaluateOnCallFrame() report a
|
|
247
|
+
// thrown exception via `exceptionDetails` on an otherwise *successful*
|
|
248
|
+
// response, not via promise rejection. The old code never looked at
|
|
249
|
+
// exceptionDetails, so a genuinely wedged CDP response (e.g. triggered by
|
|
250
|
+
// a stack-exhaustion RangeError) had no code path that could ever produce
|
|
251
|
+
// a result, an error, or a timeout - it just hung.
|
|
252
|
+
function withMockRuntime(cdpManager, evaluate) {
|
|
253
|
+
cdpManager.client = { Runtime: { evaluate }, Debugger: {} };
|
|
254
|
+
cdpManager.state.connected = true;
|
|
255
|
+
}
|
|
256
|
+
beforeEach(() => {
|
|
257
|
+
vi.useRealTimers();
|
|
258
|
+
});
|
|
259
|
+
afterEach(() => {
|
|
260
|
+
vi.useRealTimers();
|
|
261
|
+
});
|
|
262
|
+
it('surfaces a thrown RangeError (exceptionDetails) as EvaluateExpressionExceptionError instead of hanging or swallowing it', async () => {
|
|
263
|
+
const cdpManager = new CDPManager();
|
|
264
|
+
const evaluate = vi.fn().mockResolvedValue({
|
|
265
|
+
result: { type: 'undefined' },
|
|
266
|
+
exceptionDetails: {
|
|
267
|
+
text: 'Uncaught RangeError',
|
|
268
|
+
exception: {
|
|
269
|
+
type: 'object',
|
|
270
|
+
subtype: 'error',
|
|
271
|
+
className: 'RangeError',
|
|
272
|
+
description: 'RangeError: Maximum call stack size exceeded\n at <anonymous>:1:1',
|
|
273
|
+
},
|
|
274
|
+
},
|
|
275
|
+
});
|
|
276
|
+
withMockRuntime(cdpManager, evaluate);
|
|
277
|
+
await expect(cdpManager.evaluateExpression('Math.max(...new Float32Array(32768))')).rejects.toMatchObject({
|
|
278
|
+
name: 'EvaluateExpressionExceptionError',
|
|
279
|
+
exceptionType: 'RangeError',
|
|
280
|
+
exceptionMessage: 'RangeError: Maximum call stack size exceeded',
|
|
281
|
+
});
|
|
282
|
+
});
|
|
283
|
+
it('does not treat a thrown-exception response as a successful result', async () => {
|
|
284
|
+
const cdpManager = new CDPManager();
|
|
285
|
+
const evaluate = vi.fn().mockResolvedValue({
|
|
286
|
+
result: { type: 'undefined' },
|
|
287
|
+
exceptionDetails: {
|
|
288
|
+
text: 'Uncaught RangeError',
|
|
289
|
+
exception: { className: 'RangeError', description: 'RangeError: boom' },
|
|
290
|
+
},
|
|
291
|
+
});
|
|
292
|
+
withMockRuntime(cdpManager, evaluate);
|
|
293
|
+
let threw = false;
|
|
294
|
+
try {
|
|
295
|
+
await cdpManager.evaluateExpression('boom()');
|
|
296
|
+
}
|
|
297
|
+
catch (error) {
|
|
298
|
+
threw = true;
|
|
299
|
+
expect(error).toBeInstanceOf(EvaluateExpressionExceptionError);
|
|
300
|
+
}
|
|
301
|
+
expect(threw).toBe(true);
|
|
302
|
+
});
|
|
303
|
+
it('rejects with EvaluateExpressionTimeoutError instead of hanging forever when CDP never responds', async () => {
|
|
304
|
+
vi.useFakeTimers();
|
|
305
|
+
const cdpManager = new CDPManager();
|
|
306
|
+
cdpManager.evaluateExpressionTimeoutMs = 5_000; // short bound, driven by fake timers
|
|
307
|
+
const evaluate = vi.fn().mockReturnValue(new Promise(() => { })); // never resolves - simulates the wedged renderer
|
|
308
|
+
withMockRuntime(cdpManager, evaluate);
|
|
309
|
+
const resultPromise = cdpManager.evaluateExpression('while(true){}');
|
|
310
|
+
// Attach a rejection handler immediately so Node doesn't complain about
|
|
311
|
+
// an unhandled rejection while fake timers are advanced below.
|
|
312
|
+
const assertion = expect(resultPromise).rejects.toMatchObject({
|
|
313
|
+
name: 'EvaluateExpressionTimeoutError',
|
|
314
|
+
timeoutMs: 5_000,
|
|
315
|
+
});
|
|
316
|
+
await vi.advanceTimersByTimeAsync(6_000);
|
|
317
|
+
await assertion;
|
|
318
|
+
});
|
|
319
|
+
it('still returns a normal formatted value when evaluation succeeds without an exception', async () => {
|
|
320
|
+
const cdpManager = new CDPManager();
|
|
321
|
+
const evaluate = vi.fn().mockResolvedValue({ result: { type: 'number', value: 42 } });
|
|
322
|
+
withMockRuntime(cdpManager, evaluate);
|
|
323
|
+
const result = await cdpManager.evaluateExpression('40 + 2');
|
|
324
|
+
expect(result).toBe('42');
|
|
325
|
+
});
|
|
326
|
+
it('passes CDP\'s own timeout param so well-behaved renderers can abort the runaway script themselves', async () => {
|
|
327
|
+
const cdpManager = new CDPManager();
|
|
328
|
+
cdpManager.evaluateExpressionTimeoutMs = 10_000;
|
|
329
|
+
const evaluate = vi.fn().mockResolvedValue({ result: { type: 'number', value: 1 } });
|
|
330
|
+
withMockRuntime(cdpManager, evaluate);
|
|
331
|
+
await cdpManager.evaluateExpression('1');
|
|
332
|
+
expect(evaluate).toHaveBeenCalledWith(expect.objectContaining({ expression: '1', timeout: expect.any(Number) }));
|
|
333
|
+
const passedTimeout = evaluate.mock.calls[0][0].timeout;
|
|
334
|
+
expect(passedTimeout).toBeLessThan(10_000); // strictly less than our own client-side bound
|
|
335
|
+
expect(passedTimeout).toBeGreaterThan(0);
|
|
336
|
+
});
|
|
337
|
+
});
|
|
338
|
+
describe('CDPManager.evaluateExpression() - bug-015 (promises not awaited)', () => {
|
|
339
|
+
// Empirically verified against Chrome 150 (see bug-015):
|
|
340
|
+
// - Runtime.evaluate({ awaitPromise: true }) resolves promises normally
|
|
341
|
+
// while the page is running, but HANGS if the debugger is paused (the
|
|
342
|
+
// event loop is stopped, so the promise can never settle).
|
|
343
|
+
// - Debugger.evaluateOnCallFrame IGNORES awaitPromise entirely and returns
|
|
344
|
+
// the Promise RemoteObject immediately.
|
|
345
|
+
// - While paused, an already-settled promise's value is still recoverable
|
|
346
|
+
// via the [[PromiseState]]/[[PromiseResult]] internal properties.
|
|
347
|
+
function withMockClient(cdpManager, mocks) {
|
|
348
|
+
cdpManager.client = {
|
|
349
|
+
Runtime: {
|
|
350
|
+
evaluate: mocks.evaluate,
|
|
351
|
+
getProperties: mocks.getProperties,
|
|
352
|
+
callFunctionOn: mocks.callFunctionOn,
|
|
353
|
+
},
|
|
354
|
+
Debugger: { evaluateOnCallFrame: mocks.evaluateOnCallFrame },
|
|
355
|
+
};
|
|
356
|
+
cdpManager.state.connected = true;
|
|
357
|
+
cdpManager.state.paused = mocks.paused ?? false;
|
|
358
|
+
}
|
|
359
|
+
const fulfilledPromiseRemote = {
|
|
360
|
+
type: 'object',
|
|
361
|
+
subtype: 'promise',
|
|
362
|
+
className: 'Promise',
|
|
363
|
+
description: 'Promise',
|
|
364
|
+
objectId: 'promise-1',
|
|
365
|
+
};
|
|
366
|
+
it('passes awaitPromise: true to Runtime.evaluate by default so async results resolve', async () => {
|
|
367
|
+
const cdpManager = new CDPManager();
|
|
368
|
+
const evaluate = vi.fn().mockResolvedValue({ result: { type: 'string', value: 'AWAITED_OK' } });
|
|
369
|
+
withMockClient(cdpManager, { evaluate });
|
|
370
|
+
const result = await cdpManager.evaluateExpression("(async () => 'AWAITED_OK')()");
|
|
371
|
+
expect(evaluate).toHaveBeenCalledWith(expect.objectContaining({ awaitPromise: true }));
|
|
372
|
+
expect(result).toBe('"AWAITED_OK"');
|
|
373
|
+
});
|
|
374
|
+
it('does NOT pass awaitPromise to Runtime.evaluate while the debugger is paused (it would hang until timeout)', async () => {
|
|
375
|
+
const cdpManager = new CDPManager();
|
|
376
|
+
const evaluate = vi.fn().mockResolvedValue({ result: fulfilledPromiseRemote });
|
|
377
|
+
const getProperties = vi.fn().mockResolvedValue({
|
|
378
|
+
result: [],
|
|
379
|
+
internalProperties: [
|
|
380
|
+
{ name: '[[PromiseState]]', value: { type: 'string', value: 'fulfilled' } },
|
|
381
|
+
{ name: '[[PromiseResult]]', value: { type: 'string', value: 'RECOVERED' } },
|
|
382
|
+
],
|
|
383
|
+
});
|
|
384
|
+
withMockClient(cdpManager, { evaluate, getProperties, paused: true });
|
|
385
|
+
const result = await cdpManager.evaluateExpression('Promise.resolve("RECOVERED")');
|
|
386
|
+
expect(evaluate.mock.calls[0][0]).not.toHaveProperty('awaitPromise');
|
|
387
|
+
// ...but a promise that already settled is still recovered exactly,
|
|
388
|
+
// via its [[PromiseResult]] internal property.
|
|
389
|
+
expect(result).toBe('"RECOVERED"');
|
|
390
|
+
});
|
|
391
|
+
it('never passes awaitPromise to Debugger.evaluateOnCallFrame and recovers a settled promise via internal properties', async () => {
|
|
392
|
+
const cdpManager = new CDPManager();
|
|
393
|
+
const evaluateOnCallFrame = vi.fn().mockResolvedValue({ result: fulfilledPromiseRemote });
|
|
394
|
+
const getProperties = vi.fn().mockResolvedValue({
|
|
395
|
+
result: [],
|
|
396
|
+
internalProperties: [
|
|
397
|
+
{ name: '[[PromiseState]]', value: { type: 'string', value: 'fulfilled' } },
|
|
398
|
+
{ name: '[[PromiseResult]]', value: { type: 'number', value: 42 } },
|
|
399
|
+
],
|
|
400
|
+
});
|
|
401
|
+
withMockClient(cdpManager, { evaluateOnCallFrame, getProperties, paused: true });
|
|
402
|
+
const result = await cdpManager.evaluateExpression('Promise.resolve(42)', 'frame-1');
|
|
403
|
+
expect(evaluateOnCallFrame.mock.calls[0][0]).not.toHaveProperty('awaitPromise');
|
|
404
|
+
expect(result).toBe('42');
|
|
405
|
+
});
|
|
406
|
+
it('fails fast with EvaluateExpressionPendingPromiseError when a promise cannot settle at a paused frame', async () => {
|
|
407
|
+
const cdpManager = new CDPManager();
|
|
408
|
+
const evaluateOnCallFrame = vi.fn().mockResolvedValue({ result: fulfilledPromiseRemote });
|
|
409
|
+
const getProperties = vi.fn().mockResolvedValue({
|
|
410
|
+
result: [],
|
|
411
|
+
internalProperties: [
|
|
412
|
+
{ name: '[[PromiseState]]', value: { type: 'string', value: 'pending' } },
|
|
413
|
+
{ name: '[[PromiseResult]]', value: { type: 'undefined' } },
|
|
414
|
+
],
|
|
415
|
+
});
|
|
416
|
+
withMockClient(cdpManager, { evaluateOnCallFrame, getProperties, paused: true });
|
|
417
|
+
const started = Date.now();
|
|
418
|
+
await expect(cdpManager.evaluateExpression('fetch("/never")', 'frame-1')).rejects.toMatchObject({ name: 'EvaluateExpressionPendingPromiseError' });
|
|
419
|
+
// Fail-fast, not a burn of the 10s client-side timeout.
|
|
420
|
+
expect(Date.now() - started).toBeLessThan(2_000);
|
|
421
|
+
});
|
|
422
|
+
it('surfaces a promise already rejected at a paused frame as EvaluateExpressionExceptionError', async () => {
|
|
423
|
+
const cdpManager = new CDPManager();
|
|
424
|
+
const evaluateOnCallFrame = vi.fn().mockResolvedValue({ result: fulfilledPromiseRemote });
|
|
425
|
+
const getProperties = vi.fn().mockResolvedValue({
|
|
426
|
+
result: [],
|
|
427
|
+
internalProperties: [
|
|
428
|
+
{ name: '[[PromiseState]]', value: { type: 'string', value: 'rejected' } },
|
|
429
|
+
{
|
|
430
|
+
name: '[[PromiseResult]]',
|
|
431
|
+
value: {
|
|
432
|
+
type: 'object',
|
|
433
|
+
subtype: 'error',
|
|
434
|
+
className: 'Error',
|
|
435
|
+
description: 'Error: PRE_PAUSE_REJ\n at <anonymous>:1:1',
|
|
436
|
+
},
|
|
437
|
+
},
|
|
438
|
+
],
|
|
439
|
+
});
|
|
440
|
+
withMockClient(cdpManager, { evaluateOnCallFrame, getProperties, paused: true });
|
|
441
|
+
await expect(cdpManager.evaluateExpression('globalThis.__rejected', 'frame-1')).rejects.toMatchObject({
|
|
442
|
+
name: 'EvaluateExpressionExceptionError',
|
|
443
|
+
exceptionType: 'Error',
|
|
444
|
+
exceptionMessage: 'Error: PRE_PAUSE_REJ',
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
it('surfaces an awaited rejection with a primitive reason (no description on the exception)', async () => {
|
|
448
|
+
const cdpManager = new CDPManager();
|
|
449
|
+
// Chrome reports Promise.reject('plain-reason') as exceptionDetails with
|
|
450
|
+
// text "Uncaught (in promise)" and the primitive as exception.value.
|
|
451
|
+
const evaluate = vi.fn().mockResolvedValue({
|
|
452
|
+
result: { type: 'undefined' },
|
|
453
|
+
exceptionDetails: {
|
|
454
|
+
text: 'Uncaught (in promise)',
|
|
455
|
+
exception: { type: 'string', value: 'plain-reason' },
|
|
456
|
+
},
|
|
457
|
+
});
|
|
458
|
+
withMockClient(cdpManager, { evaluate });
|
|
459
|
+
await expect(cdpManager.evaluateExpression("Promise.reject('plain-reason')")).rejects.toMatchObject({
|
|
460
|
+
name: 'EvaluateExpressionExceptionError',
|
|
461
|
+
exceptionMessage: 'plain-reason',
|
|
462
|
+
});
|
|
463
|
+
});
|
|
464
|
+
it('returns the Promise object itself when awaitPromise: false is passed', async () => {
|
|
465
|
+
const cdpManager = new CDPManager();
|
|
466
|
+
const evaluate = vi.fn().mockResolvedValue({ result: fulfilledPromiseRemote });
|
|
467
|
+
const getProperties = vi.fn();
|
|
468
|
+
withMockClient(cdpManager, { evaluate, getProperties });
|
|
469
|
+
const result = await cdpManager.evaluateExpression('Promise.resolve(1)', undefined, false, 2, {
|
|
470
|
+
awaitPromise: false,
|
|
471
|
+
});
|
|
472
|
+
expect(evaluate.mock.calls[0][0]).not.toHaveProperty('awaitPromise');
|
|
473
|
+
expect(getProperties).not.toHaveBeenCalled();
|
|
474
|
+
expect(result).toBe('Promise');
|
|
475
|
+
});
|
|
476
|
+
});
|
|
477
|
+
describe('CDPManager.evaluateExpressionDetailed() - exact raw capture for saveAs (bug-015)', () => {
|
|
478
|
+
function withMockClient(cdpManager, mocks) {
|
|
479
|
+
cdpManager.client = {
|
|
480
|
+
Runtime: {
|
|
481
|
+
evaluate: mocks.evaluate,
|
|
482
|
+
getProperties: mocks.getProperties,
|
|
483
|
+
callFunctionOn: mocks.callFunctionOn,
|
|
484
|
+
},
|
|
485
|
+
Debugger: { evaluateOnCallFrame: mocks.evaluateOnCallFrame },
|
|
486
|
+
};
|
|
487
|
+
cdpManager.state.connected = true;
|
|
488
|
+
cdpManager.state.paused = mocks.paused ?? false;
|
|
489
|
+
}
|
|
490
|
+
it('captures a plain object exactly via callFunctionOn returnByValue (no display round-trip)', async () => {
|
|
491
|
+
const cdpManager = new CDPManager();
|
|
492
|
+
const evaluate = vi.fn().mockResolvedValue({
|
|
493
|
+
result: { type: 'object', className: 'Object', description: 'Object', objectId: 'obj-1' },
|
|
494
|
+
});
|
|
495
|
+
const callFunctionOn = vi.fn().mockResolvedValue({
|
|
496
|
+
result: { type: 'object', value: { id: 7, name: 'kit', nested: { s: '42' } } },
|
|
497
|
+
});
|
|
498
|
+
// formatValue expansion path
|
|
499
|
+
const getProperties = vi.fn().mockResolvedValue({ result: [] });
|
|
500
|
+
withMockClient(cdpManager, { evaluate, getProperties, callFunctionOn });
|
|
501
|
+
const detailed = await cdpManager.evaluateExpressionDetailed('state', undefined, true, 2, {
|
|
502
|
+
captureRaw: true,
|
|
503
|
+
});
|
|
504
|
+
expect(callFunctionOn).toHaveBeenCalledWith(expect.objectContaining({ objectId: 'obj-1', returnByValue: true }));
|
|
505
|
+
expect(detailed.rawCaptured).toBe(true);
|
|
506
|
+
// The string "42" stays a string - no deformat quoting heuristics involved.
|
|
507
|
+
expect(detailed.rawValue).toEqual({ id: 7, name: 'kit', nested: { s: '42' } });
|
|
508
|
+
});
|
|
509
|
+
it('captures primitives exactly from the RemoteObject value', async () => {
|
|
510
|
+
const cdpManager = new CDPManager();
|
|
511
|
+
const evaluate = vi.fn().mockResolvedValue({ result: { type: 'string', value: 'x "quoted" y' } });
|
|
512
|
+
withMockClient(cdpManager, { evaluate });
|
|
513
|
+
const detailed = await cdpManager.evaluateExpressionDetailed('s', undefined, true, 2, {
|
|
514
|
+
captureRaw: true,
|
|
515
|
+
});
|
|
516
|
+
expect(detailed.rawCaptured).toBe(true);
|
|
517
|
+
expect(detailed.rawValue).toBe('x "quoted" y');
|
|
518
|
+
});
|
|
519
|
+
it('falls back (rawCaptured: false) when the value is not serializable by value', async () => {
|
|
520
|
+
const cdpManager = new CDPManager();
|
|
521
|
+
const evaluate = vi.fn().mockResolvedValue({
|
|
522
|
+
result: { type: 'object', className: 'Object', description: 'Window', objectId: 'win-1' },
|
|
523
|
+
});
|
|
524
|
+
const callFunctionOn = vi.fn().mockRejectedValue(new Error('Object reference chain is too long'));
|
|
525
|
+
const getProperties = vi.fn().mockResolvedValue({ result: [] });
|
|
526
|
+
withMockClient(cdpManager, { evaluate, getProperties, callFunctionOn });
|
|
527
|
+
const detailed = await cdpManager.evaluateExpressionDetailed('window', undefined, true, 2, {
|
|
528
|
+
captureRaw: true,
|
|
529
|
+
});
|
|
530
|
+
expect(detailed.rawCaptured).toBe(false);
|
|
531
|
+
});
|
|
532
|
+
it('does not attempt by-value capture for values that JSON-collapse to {} (Date, Map, DOM nodes)', async () => {
|
|
533
|
+
const cdpManager = new CDPManager();
|
|
534
|
+
const evaluate = vi.fn().mockResolvedValue({
|
|
535
|
+
result: { type: 'object', subtype: 'date', className: 'Date', description: 'Thu Jan 02 2026', objectId: 'date-1' },
|
|
536
|
+
});
|
|
537
|
+
const callFunctionOn = vi.fn();
|
|
538
|
+
withMockClient(cdpManager, { evaluate, callFunctionOn });
|
|
539
|
+
const detailed = await cdpManager.evaluateExpressionDetailed('new Date()', undefined, false, 2, {
|
|
540
|
+
captureRaw: true,
|
|
541
|
+
});
|
|
542
|
+
expect(callFunctionOn).not.toHaveBeenCalled();
|
|
543
|
+
expect(detailed.rawCaptured).toBe(false);
|
|
544
|
+
});
|
|
545
|
+
});
|
|
546
|
+
//# sourceMappingURL=cdp-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp-manager.test.js","sourceRoot":"","sources":["../src/cdp-manager.test.ts"],"names":[],"mappings":"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"}
|