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,293 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Response Helpers
|
|
3
|
+
* Functions for modifying tool responses with pre/post content
|
|
4
|
+
*/
|
|
5
|
+
import type { PortFailureInfo, PendingStartupFailureInfo, PendingRestartInfo } from './server-manager.js';
|
|
6
|
+
import type { Connection } from './connection-manager.js';
|
|
7
|
+
/**
|
|
8
|
+
* Tool response content item
|
|
9
|
+
*/
|
|
10
|
+
export interface ContentItem {
|
|
11
|
+
type: string;
|
|
12
|
+
text?: string;
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Click action metadata
|
|
17
|
+
*/
|
|
18
|
+
export interface ClickActionMeta {
|
|
19
|
+
selector: string;
|
|
20
|
+
preClickUrl: string;
|
|
21
|
+
postClickUrl: string;
|
|
22
|
+
navigationOccurred: boolean;
|
|
23
|
+
hasClickHandler: boolean;
|
|
24
|
+
domChanges: {
|
|
25
|
+
mutationCount: number;
|
|
26
|
+
added: number;
|
|
27
|
+
removed: number;
|
|
28
|
+
shown: number;
|
|
29
|
+
hidden: number;
|
|
30
|
+
} | null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Type action metadata
|
|
34
|
+
*/
|
|
35
|
+
export interface TypeActionMeta {
|
|
36
|
+
selector: string;
|
|
37
|
+
text: string;
|
|
38
|
+
actualValue: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Navigate action metadata
|
|
42
|
+
*/
|
|
43
|
+
export interface NavigateActionMeta {
|
|
44
|
+
url: string;
|
|
45
|
+
title: string;
|
|
46
|
+
action: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Console tool metadata
|
|
50
|
+
*/
|
|
51
|
+
export interface ConsoleToolMeta {
|
|
52
|
+
totalCount: number;
|
|
53
|
+
matchCount?: number;
|
|
54
|
+
errorCount?: number;
|
|
55
|
+
warnCount?: number;
|
|
56
|
+
/** Number of messages that were truncated */
|
|
57
|
+
truncatedCount?: number;
|
|
58
|
+
/** Total estimated tokens for all full messages */
|
|
59
|
+
totalTokens?: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Network tool metadata
|
|
63
|
+
*/
|
|
64
|
+
export interface NetworkToolMeta {
|
|
65
|
+
totalCount: number;
|
|
66
|
+
matchCount?: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Content tool metadata (findInteractive)
|
|
70
|
+
*/
|
|
71
|
+
export interface ContentToolMeta {
|
|
72
|
+
/** interactive elements on the page */
|
|
73
|
+
totalCount: number;
|
|
74
|
+
/** of those, not currently visible */
|
|
75
|
+
hiddenCount?: number;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Request tool metadata (HTTP request/response, capturable via saveAs)
|
|
79
|
+
*/
|
|
80
|
+
export interface RequestToolMeta {
|
|
81
|
+
ok: boolean;
|
|
82
|
+
status: number;
|
|
83
|
+
statusText: string;
|
|
84
|
+
headers: Record<string, string>;
|
|
85
|
+
body: string;
|
|
86
|
+
durationMs: number;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Inspect tool metadata (evaluateExpression result, capturable via saveAs).
|
|
90
|
+
*
|
|
91
|
+
* `value` is a best-effort de-formatted view of the evaluated result: the
|
|
92
|
+
* CDP layer returns values already shaped for display (strings arrive quoted,
|
|
93
|
+
* numbers/booleans arrive as strings), so this reverses that so a captured
|
|
94
|
+
* variable holds the real type rather than its display text.
|
|
95
|
+
*/
|
|
96
|
+
export interface InspectToolMeta {
|
|
97
|
+
expression: string;
|
|
98
|
+
value: unknown;
|
|
99
|
+
/** typeof `value` ('undefined' when the expression evaluated to undefined) */
|
|
100
|
+
valueType: string;
|
|
101
|
+
/**
|
|
102
|
+
* How `value` was obtained: 'exact' = by-value CDP capture (faithful
|
|
103
|
+
* machine-readable value); 'display' = reconstructed from the rendered
|
|
104
|
+
* display text (best effort - non-serializable values only).
|
|
105
|
+
*/
|
|
106
|
+
valueSource?: 'exact' | 'display';
|
|
107
|
+
/** Set when the expression was evaluated against a paused call frame */
|
|
108
|
+
callFrameId?: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Storage tool metadata (IndexedDB reads).
|
|
112
|
+
*
|
|
113
|
+
* Exists so a caller can ask "is this record there?" without grepping the
|
|
114
|
+
* rendered markdown: a stored value that happens to contain the tool's own
|
|
115
|
+
* "No record found for this key." text made a present record read as absent.
|
|
116
|
+
*/
|
|
117
|
+
export interface StorageToolMeta {
|
|
118
|
+
/** IndexedDB only */
|
|
119
|
+
database?: string;
|
|
120
|
+
/** IndexedDB only */
|
|
121
|
+
store?: string;
|
|
122
|
+
/** idbGet / getLocalStorage / getSessionStorage: whether the key resolved */
|
|
123
|
+
found?: boolean;
|
|
124
|
+
/** the key that was probed, where the call named one */
|
|
125
|
+
key?: string;
|
|
126
|
+
/** getCookies: the names present, so a caller can test for one without reading the rendered text */
|
|
127
|
+
cookieNames?: string[];
|
|
128
|
+
/** idbGetAll: records returned (bounded by `limit`). getCookies / whole-store reads: entries present */
|
|
129
|
+
count?: number;
|
|
130
|
+
/** idbGetAll: records in the store, ignoring `limit` */
|
|
131
|
+
total?: number;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Assert tool metadata
|
|
135
|
+
*/
|
|
136
|
+
export interface AssertToolMeta {
|
|
137
|
+
left: unknown;
|
|
138
|
+
operator: string;
|
|
139
|
+
right?: unknown;
|
|
140
|
+
passed: boolean;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Wait tool metadata
|
|
144
|
+
*/
|
|
145
|
+
export interface WaitToolMeta {
|
|
146
|
+
/** Which form ran */
|
|
147
|
+
form: 'selector' | 'selectorGone' | 'expression' | 'ms';
|
|
148
|
+
/** The selector/expression waited on (or "Nms" for the sleep form) */
|
|
149
|
+
condition: string;
|
|
150
|
+
/** True when the condition was met (always true for the sleep form) */
|
|
151
|
+
satisfied: boolean;
|
|
152
|
+
elapsedMs: number;
|
|
153
|
+
/** Number of MCP-side evaluations performed (0 for the sleep form) */
|
|
154
|
+
polls: number;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Replay run metadata - structured completion signal, since a "run" can
|
|
158
|
+
* finish with failed steps or pause (stepTo/breakpoint/click-validation)
|
|
159
|
+
* while still returning a non-isError response (a caller has to read this
|
|
160
|
+
* to tell those apart from a clean run instead of text-scraping the reply).
|
|
161
|
+
*/
|
|
162
|
+
export interface ReplayRunMeta {
|
|
163
|
+
/** Not set on a background-start response (runId + background instead). */
|
|
164
|
+
success?: boolean;
|
|
165
|
+
totalSteps: number;
|
|
166
|
+
failedSteps?: number;
|
|
167
|
+
paused?: boolean;
|
|
168
|
+
/** Id of the registered background run (background start / status replies). */
|
|
169
|
+
runId?: string;
|
|
170
|
+
/** True on the immediate response of a background `run` start. */
|
|
171
|
+
background?: boolean;
|
|
172
|
+
/** Registry status of the run (status action replies). */
|
|
173
|
+
runStatus?: string;
|
|
174
|
+
/** 1-based step currently executing (status action replies). */
|
|
175
|
+
currentStep?: number;
|
|
176
|
+
/** recordInteraction: the person closed the recorder without saving. */
|
|
177
|
+
cancelled?: boolean;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Root metadata structure for tool responses
|
|
181
|
+
* This provides structured data for programmatic use (validation, replay)
|
|
182
|
+
* while keeping text content free to evolve for human/LLM display
|
|
183
|
+
*/
|
|
184
|
+
export interface ToolResponseMeta {
|
|
185
|
+
tool: string;
|
|
186
|
+
action?: string;
|
|
187
|
+
timestamp: number;
|
|
188
|
+
click?: ClickActionMeta;
|
|
189
|
+
type?: TypeActionMeta;
|
|
190
|
+
navigate?: NavigateActionMeta;
|
|
191
|
+
console?: ConsoleToolMeta;
|
|
192
|
+
network?: NetworkToolMeta;
|
|
193
|
+
content?: ContentToolMeta;
|
|
194
|
+
request?: RequestToolMeta;
|
|
195
|
+
inspect?: InspectToolMeta;
|
|
196
|
+
assert?: AssertToolMeta;
|
|
197
|
+
wait?: WaitToolMeta;
|
|
198
|
+
storage?: StorageToolMeta;
|
|
199
|
+
replay?: ReplayRunMeta;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Tool response structure
|
|
203
|
+
*/
|
|
204
|
+
export interface ToolResponse {
|
|
205
|
+
content: ContentItem[];
|
|
206
|
+
isError?: boolean;
|
|
207
|
+
/** Structured metadata for programmatic use (validation, replay). Decoupled from text output. */
|
|
208
|
+
_meta?: ToolResponseMeta;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Blocking response - prevents tool execution
|
|
212
|
+
*/
|
|
213
|
+
export interface BlockingResponse {
|
|
214
|
+
blocked: true;
|
|
215
|
+
response: ToolResponse;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Non-blocking response - allows tool execution with optional modifications
|
|
219
|
+
*/
|
|
220
|
+
export interface NonBlockingResponse {
|
|
221
|
+
blocked: false;
|
|
222
|
+
prefix: string;
|
|
223
|
+
markAsError: boolean;
|
|
224
|
+
}
|
|
225
|
+
export type PreExecutionResult = BlockingResponse | NonBlockingResponse;
|
|
226
|
+
/**
|
|
227
|
+
* Check for port failures and determine pre-execution behavior
|
|
228
|
+
*/
|
|
229
|
+
export declare function checkPortFailures(failedPorts: PortFailureInfo[], toolName: string): PreExecutionResult;
|
|
230
|
+
/**
|
|
231
|
+
* Check for blocking bugs from recordings
|
|
232
|
+
* Only allows the 'acknowledge' action in the issues tool
|
|
233
|
+
*/
|
|
234
|
+
export declare function checkBugBlocking(toolName: string, toolArgs?: Record<string, unknown>): Promise<PreExecutionResult>;
|
|
235
|
+
/**
|
|
236
|
+
* Information about a paused breakpoint
|
|
237
|
+
*/
|
|
238
|
+
export interface BreakpointPauseInfo {
|
|
239
|
+
reference: string;
|
|
240
|
+
location?: {
|
|
241
|
+
url: string;
|
|
242
|
+
lineNumber: number;
|
|
243
|
+
};
|
|
244
|
+
callFrameId?: string;
|
|
245
|
+
/** Set when a watch-mode restart is queued behind this pause - see server-manager's WatchRestartState. */
|
|
246
|
+
pendingRestart?: PendingRestartInfo;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Check for breakpoint pauses and determine pre-execution behavior
|
|
250
|
+
* Similar to checkPortFailures, but for breakpoint blocking
|
|
251
|
+
*/
|
|
252
|
+
export declare function checkBreakpointPause(connections: Connection[], toolName: string, getPendingRestart?: (port: number) => PendingRestartInfo | null, action?: string): PreExecutionResult;
|
|
253
|
+
/**
|
|
254
|
+
* Check for pending startup failures and determine pre-execution behavior
|
|
255
|
+
* Blocks tools when servers have failed to start (timeout or died) and not acknowledged
|
|
256
|
+
*/
|
|
257
|
+
export declare function checkPendingStartups(failures: PendingStartupFailureInfo[], toolName: string): PreExecutionResult;
|
|
258
|
+
/**
|
|
259
|
+
* Duplicate session info for blocking check
|
|
260
|
+
*/
|
|
261
|
+
export interface DuplicateSessionInfo {
|
|
262
|
+
sessionId: string;
|
|
263
|
+
shortId: string;
|
|
264
|
+
allPids: number[];
|
|
265
|
+
allPpids: number[];
|
|
266
|
+
currentPid: number;
|
|
267
|
+
currentPpid: number;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Check for duplicate session (multiple MCPs sharing same Claude session)
|
|
271
|
+
* Both original and duplicate sessions are blocked with appropriate messages
|
|
272
|
+
*/
|
|
273
|
+
export declare function checkDuplicateSession(info: DuplicateSessionInfo | null, toolName: string): PreExecutionResult;
|
|
274
|
+
/**
|
|
275
|
+
* Prepend text to the first text content item in a response
|
|
276
|
+
*/
|
|
277
|
+
export declare function prependToResponse(response: ToolResponse, prefix: string): void;
|
|
278
|
+
/**
|
|
279
|
+
* Append text to the last text content item in a response
|
|
280
|
+
*/
|
|
281
|
+
export declare function appendToResponse(response: ToolResponse, suffix: string): void;
|
|
282
|
+
/**
|
|
283
|
+
* Status line item for post-response status
|
|
284
|
+
*/
|
|
285
|
+
export interface StatusLineItem {
|
|
286
|
+
label: string;
|
|
287
|
+
value: string;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Build status lines suffix from items
|
|
291
|
+
*/
|
|
292
|
+
export declare function buildStatusSuffix(items: StatusLineItem[]): string;
|
|
293
|
+
//# sourceMappingURL=tool-response.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-response.d.ts","sourceRoot":"","sources":["../src/tool-response.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Response Helpers
|
|
3
|
+
* Functions for modifying tool responses with pre/post content
|
|
4
|
+
*/
|
|
5
|
+
import { hasPendingBugs, getPendingBugs } from './issue-tracker.js';
|
|
6
|
+
import { createErrorResponse } from './messages.js';
|
|
7
|
+
import { readFileSync } from 'fs';
|
|
8
|
+
import { join, dirname } from 'path';
|
|
9
|
+
import { fileURLToPath } from 'url';
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = dirname(__filename);
|
|
12
|
+
// Get MCP version from package.json
|
|
13
|
+
let MCP_VERSION = 'unknown';
|
|
14
|
+
try {
|
|
15
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
|
|
16
|
+
MCP_VERSION = pkg.version;
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// Ignore errors
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Check for port failures and determine pre-execution behavior
|
|
23
|
+
*/
|
|
24
|
+
export function checkPortFailures(failedPorts, toolName) {
|
|
25
|
+
// Check for blocking failures (block level ports that haven't been acknowledged)
|
|
26
|
+
const blockingPorts = failedPorts.filter(p => p.level === 'block');
|
|
27
|
+
// Tools that should not be blocked by port failures
|
|
28
|
+
// - server: needed to acknowledge/manage ports
|
|
29
|
+
// - execution: needed to resume from breakpoints (otherwise deadlock with breakpoint blocking)
|
|
30
|
+
// - breakpoint: needed to manage breakpoints while debugging
|
|
31
|
+
// - issues: logging/tracking bugs shouldn't be gated on unrelated server health
|
|
32
|
+
const portFailureExemptTools = new Set(['server', 'execution', 'breakpoint', 'issues']);
|
|
33
|
+
if (blockingPorts.length > 0 && !portFailureExemptTools.has(toolName)) {
|
|
34
|
+
// Block all tools except exempt tools
|
|
35
|
+
const portList = blockingPorts.map(p => `Port ${p.port}${p.description ? ` (${p.description})` : ''} - down since ${p.failedAt.toISOString()}`).join('\n');
|
|
36
|
+
return {
|
|
37
|
+
blocked: true,
|
|
38
|
+
response: {
|
|
39
|
+
content: [
|
|
40
|
+
{
|
|
41
|
+
type: 'text',
|
|
42
|
+
text: `**BLOCKED: Monitored port(s) failed**\n\nThe following monitored port(s) have failed and require acknowledgment before tools can be used:\n\n${portList}\n\nUse \`server({ action: 'acknowledgePort', port: <port> })\` to acknowledge each failure and continue.`,
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
isError: true
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
// Build prefix for error/inform level failures
|
|
50
|
+
let prefix = '';
|
|
51
|
+
const errorPorts = failedPorts.filter(p => p.level === 'error');
|
|
52
|
+
const informPorts = failedPorts.filter(p => p.level === 'inform');
|
|
53
|
+
if (errorPorts.length > 0) {
|
|
54
|
+
const portList = errorPorts.map(p => `Port ${p.port}${p.description ? ` (${p.description})` : ''}`).join(', ');
|
|
55
|
+
prefix += `**ERROR: Monitored port(s) failed:** ${portList}\n\n`;
|
|
56
|
+
}
|
|
57
|
+
if (informPorts.length > 0) {
|
|
58
|
+
const portList = informPorts.map(p => `Port ${p.port}${p.description ? ` (${p.description})` : ''}`).join(', ');
|
|
59
|
+
prefix += `**INFO: Monitored port(s) down:** ${portList}\n\n`;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
blocked: false,
|
|
63
|
+
prefix,
|
|
64
|
+
markAsError: errorPorts.length > 0
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check for blocking bugs from recordings
|
|
69
|
+
* Only allows the 'acknowledge' action in the issues tool
|
|
70
|
+
*/
|
|
71
|
+
export async function checkBugBlocking(toolName, toolArgs) {
|
|
72
|
+
const hasBugs = await hasPendingBugs();
|
|
73
|
+
if (!hasBugs) {
|
|
74
|
+
return { blocked: false, prefix: '', markAsError: false };
|
|
75
|
+
}
|
|
76
|
+
// Only allow issues tool with acknowledge action
|
|
77
|
+
if (toolName === 'issues' && toolArgs?.action === 'acknowledge') {
|
|
78
|
+
return { blocked: false, prefix: '', markAsError: false };
|
|
79
|
+
}
|
|
80
|
+
// Also allow issues tool with list action (to see what's blocking)
|
|
81
|
+
if (toolName === 'issues' && toolArgs?.action === 'list') {
|
|
82
|
+
return { blocked: false, prefix: '', markAsError: false };
|
|
83
|
+
}
|
|
84
|
+
const pendingBugs = await getPendingBugs();
|
|
85
|
+
const bugList = pendingBugs.map(b => `- [#${b.id}] "${b.title}" (from ${b.recordingName})`).join('\n');
|
|
86
|
+
return {
|
|
87
|
+
blocked: true,
|
|
88
|
+
response: createErrorResponse('BUGS_BLOCKING', { bugList })
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Tools that are allowed to execute when blocked due to breakpoint pause
|
|
93
|
+
* These are tools needed to inspect the paused state or resume execution
|
|
94
|
+
*/
|
|
95
|
+
const BREAKPOINT_ALLOWED_TOOLS = new Set([
|
|
96
|
+
'execution', // Resume, step, pause operations
|
|
97
|
+
'inspect', // Get call stack, variables, evaluate expression
|
|
98
|
+
'breakpoint', // Manage breakpoints
|
|
99
|
+
'console', // View console logs
|
|
100
|
+
]);
|
|
101
|
+
/**
|
|
102
|
+
* Specific tool+action combos allowed even when otherwise blocked - narrower
|
|
103
|
+
* than BREAKPOINT_ALLOWED_TOOLS, for actions that need to run precisely
|
|
104
|
+
* because a pause is blocking things (e.g. discarding a restart that's
|
|
105
|
+
* queued behind this very pause - blocking it would make it uncancellable).
|
|
106
|
+
*/
|
|
107
|
+
const BREAKPOINT_ALLOWED_TOOL_ACTIONS = {
|
|
108
|
+
server: new Set(['cancelPendingRestart']),
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Check for breakpoint pauses and determine pre-execution behavior
|
|
112
|
+
* Similar to checkPortFailures, but for breakpoint blocking
|
|
113
|
+
*/
|
|
114
|
+
export function checkBreakpointPause(connections, toolName, getPendingRestart, action) {
|
|
115
|
+
// Find connections that are paused and not acknowledged
|
|
116
|
+
const pausedConnections = [];
|
|
117
|
+
for (const conn of connections) {
|
|
118
|
+
if (conn.cdpManager.isPaused() && !conn.breakpointPauseAcknowledged) {
|
|
119
|
+
const pauseInfo = conn.cdpManager.getPausedInfo();
|
|
120
|
+
const topFrame = pauseInfo.callStack?.[0];
|
|
121
|
+
pausedConnections.push({
|
|
122
|
+
reference: conn.reference || conn.id,
|
|
123
|
+
location: pauseInfo.location,
|
|
124
|
+
callFrameId: topFrame?.callFrameId,
|
|
125
|
+
pendingRestart: getPendingRestart?.(conn.port) ?? undefined,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// No paused connections, allow execution
|
|
130
|
+
if (pausedConnections.length === 0) {
|
|
131
|
+
return {
|
|
132
|
+
blocked: false,
|
|
133
|
+
prefix: '',
|
|
134
|
+
markAsError: false
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
// Check if tool is allowed when paused
|
|
138
|
+
if (BREAKPOINT_ALLOWED_TOOLS.has(toolName) || (action !== undefined && BREAKPOINT_ALLOWED_TOOL_ACTIONS[toolName]?.has(action))) {
|
|
139
|
+
// Allow but prepend info about paused state
|
|
140
|
+
const pauseList = pausedConnections.map(p => {
|
|
141
|
+
const loc = p.location
|
|
142
|
+
? ` at ${p.location.url}:${p.location.lineNumber}`
|
|
143
|
+
: '';
|
|
144
|
+
return `"${p.reference}"${loc}`;
|
|
145
|
+
}).join(', ');
|
|
146
|
+
const restartNotes = pausedConnections
|
|
147
|
+
.filter(p => p.pendingRestart)
|
|
148
|
+
.map(p => `⚠️ A file change was detected for "${p.reference}" - its watch-mode restart is queued and will run as soon as you resume. Use \`server({ action: 'cancelPendingRestart', serverId: '${p.pendingRestart.serverId}' })\` to discard it and keep debugging.`)
|
|
149
|
+
.join('\n');
|
|
150
|
+
return {
|
|
151
|
+
blocked: false,
|
|
152
|
+
prefix: `**Paused at breakpoint:** ${pauseList}\n\n${restartNotes ? restartNotes + '\n\n' : ''}`,
|
|
153
|
+
markAsError: false
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
// Block other tools
|
|
157
|
+
const pauseDetails = pausedConnections.map(p => {
|
|
158
|
+
const loc = p.location
|
|
159
|
+
? `\n Location: ${p.location.url}:${p.location.lineNumber}`
|
|
160
|
+
: '';
|
|
161
|
+
const frameId = p.callFrameId
|
|
162
|
+
? `\n callFrameId: "${p.callFrameId}"`
|
|
163
|
+
: '';
|
|
164
|
+
const restart = p.pendingRestart
|
|
165
|
+
? `\n ⚠️ Watch-mode restart queued (server "${p.pendingRestart.serverId}") - will run once resumed`
|
|
166
|
+
: '';
|
|
167
|
+
return `- "${p.reference}"${loc}${frameId}${restart}`;
|
|
168
|
+
}).join('\n');
|
|
169
|
+
// Build getVariables hint with callFrameId if available
|
|
170
|
+
const firstCallFrameId = pausedConnections[0]?.callFrameId;
|
|
171
|
+
const getVariablesHint = firstCallFrameId
|
|
172
|
+
? `\`inspect({ action: 'getVariables', callFrameId: '${firstCallFrameId}' })\``
|
|
173
|
+
: `\`inspect({ action: 'getVariables' })\``;
|
|
174
|
+
const firstPendingRestart = pausedConnections.find(p => p.pendingRestart)?.pendingRestart;
|
|
175
|
+
const cancelRestartHint = firstPendingRestart
|
|
176
|
+
? `\n- A watch-mode restart is queued for server "${firstPendingRestart.serverId}" - use \`server({ action: 'cancelPendingRestart', serverId: '${firstPendingRestart.serverId}' })\` to discard it and keep debugging, instead of resuming into a restart`
|
|
177
|
+
: '';
|
|
178
|
+
return {
|
|
179
|
+
blocked: true,
|
|
180
|
+
response: {
|
|
181
|
+
content: [
|
|
182
|
+
{
|
|
183
|
+
type: 'text',
|
|
184
|
+
text: `**BLOCKED: Execution paused at breakpoint**
|
|
185
|
+
|
|
186
|
+
The following connection(s) are paused at a breakpoint:
|
|
187
|
+
${pauseDetails}
|
|
188
|
+
|
|
189
|
+
**To continue:**
|
|
190
|
+
- Use \`execution({ action: 'resume' })\` to resume execution
|
|
191
|
+
- Use \`execution({ action: 'acknowledge' })\` to acknowledge and continue using other tools while paused
|
|
192
|
+
- Use \`inspect({ action: 'getCallStack' })\` or ${getVariablesHint} to examine state${cancelRestartHint}
|
|
193
|
+
|
|
194
|
+
Other tools are blocked until execution is resumed or acknowledged.`,
|
|
195
|
+
},
|
|
196
|
+
],
|
|
197
|
+
isError: true
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Check for pending startup failures and determine pre-execution behavior
|
|
203
|
+
* Blocks tools when servers have failed to start (timeout or died) and not acknowledged
|
|
204
|
+
*/
|
|
205
|
+
export function checkPendingStartups(failures, toolName) {
|
|
206
|
+
// No failures, allow execution
|
|
207
|
+
if (failures.length === 0) {
|
|
208
|
+
return {
|
|
209
|
+
blocked: false,
|
|
210
|
+
prefix: '',
|
|
211
|
+
markAsError: false
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
// Server tool is always allowed (needed to acknowledge/manage servers)
|
|
215
|
+
// Issues tool is always allowed (logging/tracking bugs shouldn't be gated on unrelated server health)
|
|
216
|
+
if (toolName === 'server' || toolName === 'issues') {
|
|
217
|
+
return {
|
|
218
|
+
blocked: false,
|
|
219
|
+
prefix: '',
|
|
220
|
+
markAsError: false
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
// Build blocking message based on failure reasons
|
|
224
|
+
const timeoutFailures = failures.filter(f => f.reason === 'timeout');
|
|
225
|
+
const diedFailures = failures.filter(f => f.reason === 'died');
|
|
226
|
+
let message = 'BLOCKED: Server startup issue(s)\n\n';
|
|
227
|
+
if (timeoutFailures.length > 0) {
|
|
228
|
+
message += `Startup timeout - The following server(s) started but no port was detected within 30 seconds:\n`;
|
|
229
|
+
for (const f of timeoutFailures) {
|
|
230
|
+
const elapsed = Math.round((Date.now() - f.startedAt.getTime()) / 1000);
|
|
231
|
+
message += `- "${f.serverId}" (started ${elapsed}s ago)\n`;
|
|
232
|
+
}
|
|
233
|
+
message += '\n';
|
|
234
|
+
}
|
|
235
|
+
if (diedFailures.length > 0) {
|
|
236
|
+
message += `Server died - The following server(s) died before port was detected:\n`;
|
|
237
|
+
for (const f of diedFailures) {
|
|
238
|
+
message += `- "${f.serverId}"\n`;
|
|
239
|
+
}
|
|
240
|
+
message += '\n';
|
|
241
|
+
}
|
|
242
|
+
message += `Options:\n`;
|
|
243
|
+
message += `- Check logs: server({ action: 'logs', serverId: '<id>' })\n`;
|
|
244
|
+
message += `- Acknowledge and continue: server({ action: 'acknowledgeStartup', serverId: '<id>' })\n`;
|
|
245
|
+
if (timeoutFailures.length > 0) {
|
|
246
|
+
message += `- Extend timeout 30s: server({ action: 'extendStartup', serverId: '<id>' })\n`;
|
|
247
|
+
}
|
|
248
|
+
if (diedFailures.length > 0) {
|
|
249
|
+
message += `- Restart server: server({ action: 'restart', serverId: '<id>' })\n`;
|
|
250
|
+
}
|
|
251
|
+
message += `- Stop server: server({ action: 'stop', serverId: '<id>' })`;
|
|
252
|
+
return {
|
|
253
|
+
blocked: true,
|
|
254
|
+
response: {
|
|
255
|
+
content: [
|
|
256
|
+
{
|
|
257
|
+
type: 'text',
|
|
258
|
+
text: message,
|
|
259
|
+
},
|
|
260
|
+
],
|
|
261
|
+
isError: true
|
|
262
|
+
}
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Check for duplicate session (multiple MCPs sharing same Claude session)
|
|
267
|
+
* Both original and duplicate sessions are blocked with appropriate messages
|
|
268
|
+
*/
|
|
269
|
+
export function checkDuplicateSession(info, toolName) {
|
|
270
|
+
// No session info or not a duplicate - allow
|
|
271
|
+
if (!info || info.allPids.length <= 1) {
|
|
272
|
+
return { blocked: false, prefix: '', markAsError: false };
|
|
273
|
+
}
|
|
274
|
+
const firstPid = info.allPids[0];
|
|
275
|
+
const isOriginal = info.currentPid === firstPid;
|
|
276
|
+
const duplicatePids = info.allPids.filter(p => p !== firstPid);
|
|
277
|
+
const duplicatePpids = info.allPpids.filter(p => p !== info.allPpids[0]);
|
|
278
|
+
if (isOriginal) {
|
|
279
|
+
// Original session - tell them about the duplicate and how to kill it
|
|
280
|
+
return {
|
|
281
|
+
blocked: true,
|
|
282
|
+
response: {
|
|
283
|
+
content: [
|
|
284
|
+
{
|
|
285
|
+
type: 'text',
|
|
286
|
+
text: `**BLOCKED: Duplicate MCP session detected**
|
|
287
|
+
|
|
288
|
+
**To fix:** Kill the duplicate Claude session:
|
|
289
|
+
\`\`\`
|
|
290
|
+
kill ${duplicatePpids.length > 0 ? duplicatePpids.join(' ') : duplicatePids.join(' ')}
|
|
291
|
+
\`\`\`
|
|
292
|
+
|
|
293
|
+
Another Claude session has connected with the same session ID:
|
|
294
|
+
|
|
295
|
+
- Session ID: ${info.shortId} (${info.sessionId})
|
|
296
|
+
- This Claude PID: ${info.currentPpid} (original)
|
|
297
|
+
- Duplicate Claude PID(s): ${duplicatePpids.join(', ') || duplicatePids.join(', ')}
|
|
298
|
+
- MCP Version: ${MCP_VERSION}`,
|
|
299
|
+
},
|
|
300
|
+
],
|
|
301
|
+
isError: true
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
// Duplicate session - tell them to fork
|
|
307
|
+
const firstPpid = info.allPpids[0] || firstPid;
|
|
308
|
+
return {
|
|
309
|
+
blocked: true,
|
|
310
|
+
response: {
|
|
311
|
+
content: [
|
|
312
|
+
{
|
|
313
|
+
type: 'text',
|
|
314
|
+
text: `**BLOCKED: Duplicate MCP session detected**
|
|
315
|
+
|
|
316
|
+
**To fix:** Exit this session and run:
|
|
317
|
+
\`\`\`
|
|
318
|
+
claude --resume ${info.sessionId} --fork-session
|
|
319
|
+
\`\`\`
|
|
320
|
+
|
|
321
|
+
Another Claude session is already running with this session ID:
|
|
322
|
+
|
|
323
|
+
- Session ID: ${info.shortId} (${info.sessionId})
|
|
324
|
+
- Original Claude PID: ${firstPpid}
|
|
325
|
+
- This Claude PID: ${info.currentPpid} (duplicate)
|
|
326
|
+
- MCP Version: ${MCP_VERSION}`,
|
|
327
|
+
},
|
|
328
|
+
],
|
|
329
|
+
isError: true
|
|
330
|
+
}
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Prepend text to the first text content item in a response
|
|
336
|
+
*/
|
|
337
|
+
export function prependToResponse(response, prefix) {
|
|
338
|
+
if (!prefix || !response.content || response.content.length === 0)
|
|
339
|
+
return;
|
|
340
|
+
const firstContent = response.content[0];
|
|
341
|
+
if (firstContent && firstContent.type === 'text' && firstContent.text) {
|
|
342
|
+
firstContent.text = prefix + firstContent.text;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Append text to the last text content item in a response
|
|
347
|
+
*/
|
|
348
|
+
export function appendToResponse(response, suffix) {
|
|
349
|
+
if (!suffix || !response.content || response.content.length === 0)
|
|
350
|
+
return;
|
|
351
|
+
const lastContent = response.content[response.content.length - 1];
|
|
352
|
+
if (lastContent && lastContent.type === 'text' && lastContent.text) {
|
|
353
|
+
lastContent.text += suffix;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Build status lines suffix from items
|
|
358
|
+
*/
|
|
359
|
+
export function buildStatusSuffix(items) {
|
|
360
|
+
if (items.length === 0)
|
|
361
|
+
return '';
|
|
362
|
+
const lines = items.map(item => `**${item.label}:** ${item.value}`);
|
|
363
|
+
return `\n\n---\n${lines.join('\n')}`;
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=tool-response.js.map
|