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,434 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { RestartCoordinator } from './restart-coordinator.js';
|
|
3
|
+
function makeDeps(overrides = {}) {
|
|
4
|
+
const hostLines = [];
|
|
5
|
+
const childLines = [];
|
|
6
|
+
return {
|
|
7
|
+
hostLines,
|
|
8
|
+
childLines,
|
|
9
|
+
writeToChild: overrides.writeToChild ?? ((line) => childLines.push(line)),
|
|
10
|
+
writeToHost: overrides.writeToHost ?? ((line) => hostLines.push(line)),
|
|
11
|
+
killChild: overrides.killChild ?? vi.fn().mockResolvedValue(undefined),
|
|
12
|
+
spawnChild: overrides.spawnChild ?? vi.fn(),
|
|
13
|
+
logStderr: overrides.logStderr ?? (() => { }),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
const INIT_REQUEST = '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}}';
|
|
17
|
+
const INITIALIZED_NOTIF = '{"jsonrpc":"2.0","method":"notifications/initialized"}';
|
|
18
|
+
describe('RestartCoordinator - steady state passthrough', () => {
|
|
19
|
+
it('forwards host requests to the child and captures initialize/initialized', () => {
|
|
20
|
+
const deps = makeDeps();
|
|
21
|
+
const coordinator = new RestartCoordinator(deps);
|
|
22
|
+
coordinator.handleHostLine(INIT_REQUEST);
|
|
23
|
+
coordinator.handleHostLine(INITIALIZED_NOTIF);
|
|
24
|
+
expect(deps.childLines).toEqual([INIT_REQUEST, INITIALIZED_NOTIF]);
|
|
25
|
+
});
|
|
26
|
+
it('forwards child responses to the host untouched', () => {
|
|
27
|
+
const deps = makeDeps();
|
|
28
|
+
const coordinator = new RestartCoordinator(deps);
|
|
29
|
+
coordinator.handleHostLine(INIT_REQUEST);
|
|
30
|
+
const response = '{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05"}}';
|
|
31
|
+
coordinator.handleChildLine(response);
|
|
32
|
+
expect(deps.hostLines).toEqual([response]);
|
|
33
|
+
});
|
|
34
|
+
it('forwards a tool call request/response pair normally', () => {
|
|
35
|
+
const deps = makeDeps();
|
|
36
|
+
const coordinator = new RestartCoordinator(deps);
|
|
37
|
+
const req = '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{}}';
|
|
38
|
+
coordinator.handleHostLine(req);
|
|
39
|
+
expect(deps.childLines).toEqual([req]);
|
|
40
|
+
const res = '{"jsonrpc":"2.0","id":2,"result":{}}';
|
|
41
|
+
coordinator.handleChildLine(res);
|
|
42
|
+
expect(deps.hostLines).toEqual([res]);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
describe('RestartCoordinator - restart via requestRestart()', () => {
|
|
46
|
+
it('synthesizes an error for an in-flight request and does not double-deliver a late real response', async () => {
|
|
47
|
+
const deps = makeDeps();
|
|
48
|
+
const coordinator = new RestartCoordinator(deps);
|
|
49
|
+
const slowReq = '{"jsonrpc":"2.0","id":42,"method":"tools/call","params":{}}';
|
|
50
|
+
coordinator.handleHostLine(slowReq);
|
|
51
|
+
expect(deps.hostLines).toEqual([]);
|
|
52
|
+
coordinator.requestRestart('test');
|
|
53
|
+
await flushMicrotasks();
|
|
54
|
+
// Exactly one synthesized error for id 42
|
|
55
|
+
expect(deps.hostLines).toHaveLength(1);
|
|
56
|
+
const synthesized = JSON.parse(deps.hostLines[0]);
|
|
57
|
+
expect(synthesized).toMatchObject({ jsonrpc: '2.0', id: 42, error: { code: -32000 } });
|
|
58
|
+
// The old (now-dead) child's late real answer for the same id must be dropped, not forwarded again.
|
|
59
|
+
coordinator.handleChildLine('{"jsonrpc":"2.0","id":42,"result":{"late":true}}');
|
|
60
|
+
expect(deps.hostLines).toHaveLength(1);
|
|
61
|
+
});
|
|
62
|
+
it('replays the buffered initialize+initialized to the new child, in order, before anything else', async () => {
|
|
63
|
+
const deps = makeDeps();
|
|
64
|
+
const coordinator = new RestartCoordinator(deps);
|
|
65
|
+
coordinator.handleHostLine(INIT_REQUEST);
|
|
66
|
+
coordinator.handleHostLine(INITIALIZED_NOTIF);
|
|
67
|
+
deps.childLines.length = 0; // clear the initial forwarding, we only care about the replay
|
|
68
|
+
coordinator.requestRestart('test');
|
|
69
|
+
await flushMicrotasks();
|
|
70
|
+
expect(deps.childLines).toEqual([INIT_REQUEST, INITIALIZED_NOTIF]);
|
|
71
|
+
});
|
|
72
|
+
it('swallows the new child response to the replayed initialize exactly once (once the host already has its original answer)', async () => {
|
|
73
|
+
const deps = makeDeps();
|
|
74
|
+
const coordinator = new RestartCoordinator(deps);
|
|
75
|
+
coordinator.handleHostLine(INIT_REQUEST);
|
|
76
|
+
coordinator.handleHostLine(INITIALIZED_NOTIF);
|
|
77
|
+
// The original child answers normally, forwarded to the host - this is what
|
|
78
|
+
// makes it safe to swallow a *replayed* init's response on a later restart.
|
|
79
|
+
coordinator.handleChildLine('{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05"}}');
|
|
80
|
+
deps.hostLines.length = 0; // clear that forwarded response, we only care about what happens after restart
|
|
81
|
+
coordinator.requestRestart('test');
|
|
82
|
+
await flushMicrotasks();
|
|
83
|
+
// A restart with a captured init sends a best-effort tools/list_changed
|
|
84
|
+
// nudge to the host - not the thing under test here, so drop it before
|
|
85
|
+
// checking the swallow behavior below.
|
|
86
|
+
const TOOLS_LIST_CHANGED = '{"jsonrpc":"2.0","method":"notifications/tools/list_changed"}\n';
|
|
87
|
+
expect(deps.hostLines).toEqual([TOOLS_LIST_CHANGED]);
|
|
88
|
+
deps.hostLines.length = 0;
|
|
89
|
+
// New child answers the replayed initialize - must be swallowed.
|
|
90
|
+
coordinator.handleChildLine('{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05"}}');
|
|
91
|
+
expect(deps.hostLines).toEqual([]);
|
|
92
|
+
// A second, unrelated response with the same id shape after that should NOT also be swallowed
|
|
93
|
+
// (the swallow is one-shot).
|
|
94
|
+
coordinator.handleHostLine('{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{}}');
|
|
95
|
+
coordinator.handleChildLine('{"jsonrpc":"2.0","id":1,"result":{"ok":true}}');
|
|
96
|
+
expect(deps.hostLines).toEqual(['{"jsonrpc":"2.0","id":1,"result":{"ok":true}}']);
|
|
97
|
+
});
|
|
98
|
+
it('does NOT swallow a restart-triggered init replay response if the host never got its original answer', async () => {
|
|
99
|
+
// Edge case: the very first child dies/restarts before ever answering the
|
|
100
|
+
// host's original `initialize` - the host is still waiting for a real
|
|
101
|
+
// answer, so eating the replayed response here would hang it forever.
|
|
102
|
+
const deps = makeDeps();
|
|
103
|
+
const coordinator = new RestartCoordinator(deps);
|
|
104
|
+
coordinator.handleHostLine(INIT_REQUEST);
|
|
105
|
+
coordinator.handleHostLine(INITIALIZED_NOTIF);
|
|
106
|
+
// No response simulated yet - restart happens before any answer arrives.
|
|
107
|
+
coordinator.requestRestart('test');
|
|
108
|
+
await flushMicrotasks();
|
|
109
|
+
// The init request wasn't in the generic in-flight map, so no premature
|
|
110
|
+
// synthesized error for it - just the best-effort tools/list_changed nudge.
|
|
111
|
+
expect(deps.hostLines).toEqual(['{"jsonrpc":"2.0","method":"notifications/tools/list_changed"}\n']);
|
|
112
|
+
deps.hostLines.length = 0;
|
|
113
|
+
coordinator.handleChildLine('{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05"}}');
|
|
114
|
+
expect(deps.hostLines).toEqual(['{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05"}}']);
|
|
115
|
+
});
|
|
116
|
+
it('answers a request arriving mid-restart immediately instead of queuing it', async () => {
|
|
117
|
+
let resolveKill;
|
|
118
|
+
const killPromise = new Promise((resolve) => {
|
|
119
|
+
resolveKill = resolve;
|
|
120
|
+
});
|
|
121
|
+
const deps = makeDeps({ killChild: () => killPromise });
|
|
122
|
+
const coordinator = new RestartCoordinator(deps);
|
|
123
|
+
coordinator.requestRestart('test');
|
|
124
|
+
expect(coordinator.getPhase()).toBe('restarting');
|
|
125
|
+
coordinator.handleHostLine('{"jsonrpc":"2.0","id":99,"method":"tools/call","params":{}}');
|
|
126
|
+
expect(deps.hostLines).toHaveLength(1);
|
|
127
|
+
expect(JSON.parse(deps.hostLines[0])).toMatchObject({ id: 99, error: { code: -32000 } });
|
|
128
|
+
// Must not have been forwarded to spawnChild/child at all.
|
|
129
|
+
expect(deps.childLines).toEqual([]);
|
|
130
|
+
resolveKill();
|
|
131
|
+
await flushMicrotasks();
|
|
132
|
+
expect(coordinator.getPhase()).toBe('ready');
|
|
133
|
+
});
|
|
134
|
+
it('ignores a second requestRestart() while one is already in progress', async () => {
|
|
135
|
+
let resolveKill;
|
|
136
|
+
const killPromise = new Promise((resolve) => {
|
|
137
|
+
resolveKill = resolve;
|
|
138
|
+
});
|
|
139
|
+
const killChild = vi.fn(() => killPromise);
|
|
140
|
+
const deps = makeDeps({ killChild });
|
|
141
|
+
const coordinator = new RestartCoordinator(deps);
|
|
142
|
+
coordinator.requestRestart('first');
|
|
143
|
+
coordinator.requestRestart('second');
|
|
144
|
+
expect(killChild).toHaveBeenCalledTimes(1);
|
|
145
|
+
resolveKill();
|
|
146
|
+
await flushMicrotasks();
|
|
147
|
+
});
|
|
148
|
+
it('prepareForShutdown() prevents a deliberate shutdown kill from being mistaken for a crash', () => {
|
|
149
|
+
const spawnChild = vi.fn();
|
|
150
|
+
const logStderr = vi.fn();
|
|
151
|
+
const deps = makeDeps({ spawnChild, logStderr });
|
|
152
|
+
const coordinator = new RestartCoordinator(deps);
|
|
153
|
+
coordinator.prepareForShutdown();
|
|
154
|
+
coordinator.onChildExit(); // as mcp-supervisor.ts's real exit listener would call, unconditionally
|
|
155
|
+
expect(spawnChild).not.toHaveBeenCalled();
|
|
156
|
+
expect(coordinator.getPhase()).toBe('ready'); // never entered 'restarting'/crash-backoff at all
|
|
157
|
+
expect(logStderr).not.toHaveBeenCalledWith(expect.stringContaining('crashed'));
|
|
158
|
+
});
|
|
159
|
+
it('drops notifications arriving mid-restart with no synthesized response (nothing to respond to)', () => {
|
|
160
|
+
let resolveKill;
|
|
161
|
+
const killPromise = new Promise((resolve) => {
|
|
162
|
+
resolveKill = resolve;
|
|
163
|
+
});
|
|
164
|
+
const deps = makeDeps({ killChild: () => killPromise });
|
|
165
|
+
const coordinator = new RestartCoordinator(deps);
|
|
166
|
+
coordinator.requestRestart('test');
|
|
167
|
+
coordinator.handleHostLine('{"jsonrpc":"2.0","method":"notifications/cancelled","params":{}}');
|
|
168
|
+
expect(deps.hostLines).toEqual([]);
|
|
169
|
+
expect(deps.childLines).toEqual([]);
|
|
170
|
+
resolveKill();
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
describe('RestartCoordinator - onChildExit (crash) vs deliberate restart', () => {
|
|
174
|
+
it('a deliberate restart does not trigger crash backoff when onChildExit() fires for it', async () => {
|
|
175
|
+
let resolveKill;
|
|
176
|
+
const killPromise = new Promise((resolve) => {
|
|
177
|
+
resolveKill = resolve;
|
|
178
|
+
});
|
|
179
|
+
const logStderr = vi.fn();
|
|
180
|
+
const deps = makeDeps({ killChild: () => killPromise, logStderr });
|
|
181
|
+
const coordinator = new RestartCoordinator(deps);
|
|
182
|
+
coordinator.requestRestart('test');
|
|
183
|
+
// Simulate the real child's 'exit' event firing as a *result* of killChild(), same as
|
|
184
|
+
// child-manager.ts wiring would do, before killChild()'s own promise resolves.
|
|
185
|
+
coordinator.onChildExit();
|
|
186
|
+
resolveKill();
|
|
187
|
+
await flushMicrotasks();
|
|
188
|
+
expect(coordinator.getPhase()).toBe('ready');
|
|
189
|
+
expect(logStderr).not.toHaveBeenCalledWith(expect.stringContaining('crashed'));
|
|
190
|
+
});
|
|
191
|
+
it('an unplanned crash synthesizes errors, backs off, and respawns', () => {
|
|
192
|
+
vi.useFakeTimers();
|
|
193
|
+
try {
|
|
194
|
+
const spawnChild = vi.fn();
|
|
195
|
+
const deps = makeDeps({ spawnChild });
|
|
196
|
+
const coordinator = new RestartCoordinator(deps, { crashBackoffBaseMs: 500, crashBackoffCapMs: 30000 });
|
|
197
|
+
coordinator.handleHostLine('{"jsonrpc":"2.0","id":5,"method":"tools/call","params":{}}');
|
|
198
|
+
deps.hostLines.length = 0;
|
|
199
|
+
coordinator.onChildExit(); // unplanned - expectingExit was never set
|
|
200
|
+
expect(coordinator.getPhase()).toBe('restarting');
|
|
201
|
+
expect(JSON.parse(deps.hostLines[0])).toMatchObject({ id: 5, error: { code: -32000 } });
|
|
202
|
+
vi.advanceTimersByTime(499);
|
|
203
|
+
expect(spawnChild).not.toHaveBeenCalled();
|
|
204
|
+
vi.advanceTimersByTime(1);
|
|
205
|
+
expect(spawnChild).toHaveBeenCalledTimes(1);
|
|
206
|
+
expect(coordinator.getPhase()).toBe('ready');
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
vi.useRealTimers();
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
it('backoff follows 500*2^(n-1) capped at 30000, and gives up after 10 attempts', () => {
|
|
213
|
+
vi.useFakeTimers();
|
|
214
|
+
try {
|
|
215
|
+
const spawnChild = vi.fn();
|
|
216
|
+
const logStderr = vi.fn();
|
|
217
|
+
const deps = makeDeps({ spawnChild, logStderr });
|
|
218
|
+
const coordinator = new RestartCoordinator(deps, { crashBackoffBaseMs: 500, crashBackoffCapMs: 30000, maxCrashAttempts: 10 });
|
|
219
|
+
const expectedDelays = [500, 1000, 2000, 4000, 8000, 16000, 30000, 30000, 30000, 30000];
|
|
220
|
+
for (let attempt = 1; attempt <= 10; attempt++) {
|
|
221
|
+
coordinator.onChildExit();
|
|
222
|
+
expect(coordinator.getPhase()).toBe('restarting');
|
|
223
|
+
vi.advanceTimersByTime(expectedDelays[attempt - 1]);
|
|
224
|
+
expect(spawnChild).toHaveBeenCalledTimes(attempt);
|
|
225
|
+
}
|
|
226
|
+
// 11th consecutive crash (stability timer never got a chance to reset the counter
|
|
227
|
+
// since we advance straight from spawn to the next crash) - gives up.
|
|
228
|
+
coordinator.onChildExit();
|
|
229
|
+
expect(coordinator.getPhase()).toBe('idle-gave-up');
|
|
230
|
+
expect(spawnChild).toHaveBeenCalledTimes(10); // no 11th spawn attempt
|
|
231
|
+
expect(logStderr).toHaveBeenCalledWith(expect.stringContaining('Giving up'));
|
|
232
|
+
}
|
|
233
|
+
finally {
|
|
234
|
+
vi.useRealTimers();
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
it('an explicit requestRestart() resets the crash counter and exits idle-gave-up', async () => {
|
|
238
|
+
vi.useFakeTimers();
|
|
239
|
+
try {
|
|
240
|
+
const spawnChild = vi.fn();
|
|
241
|
+
const killChild = vi.fn().mockResolvedValue(undefined);
|
|
242
|
+
const deps = makeDeps({ spawnChild, killChild });
|
|
243
|
+
const coordinator = new RestartCoordinator(deps, { maxCrashAttempts: 2, crashBackoffBaseMs: 10 });
|
|
244
|
+
coordinator.onChildExit();
|
|
245
|
+
vi.advanceTimersByTime(10);
|
|
246
|
+
coordinator.onChildExit();
|
|
247
|
+
vi.advanceTimersByTime(20);
|
|
248
|
+
coordinator.onChildExit(); // 3rd consecutive crash, exceeds maxCrashAttempts=2
|
|
249
|
+
expect(coordinator.getPhase()).toBe('idle-gave-up');
|
|
250
|
+
coordinator.requestRestart('manual');
|
|
251
|
+
await flushPromises();
|
|
252
|
+
expect(coordinator.getPhase()).toBe('ready');
|
|
253
|
+
expect(killChild).toHaveBeenCalledTimes(1);
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
vi.useRealTimers();
|
|
257
|
+
}
|
|
258
|
+
});
|
|
259
|
+
it('requests during idle-gave-up get an immediate synthesized error, not a queue', () => {
|
|
260
|
+
vi.useFakeTimers();
|
|
261
|
+
try {
|
|
262
|
+
const deps = makeDeps();
|
|
263
|
+
const coordinator = new RestartCoordinator(deps, { maxCrashAttempts: 1, crashBackoffBaseMs: 10 });
|
|
264
|
+
coordinator.onChildExit();
|
|
265
|
+
vi.advanceTimersByTime(10);
|
|
266
|
+
coordinator.onChildExit(); // exceeds maxCrashAttempts=1
|
|
267
|
+
expect(coordinator.getPhase()).toBe('idle-gave-up');
|
|
268
|
+
coordinator.handleHostLine('{"jsonrpc":"2.0","id":7,"method":"tools/call","params":{}}');
|
|
269
|
+
expect(JSON.parse(deps.hostLines.at(-1))).toMatchObject({ id: 7, error: { code: -32000 } });
|
|
270
|
+
}
|
|
271
|
+
finally {
|
|
272
|
+
vi.useRealTimers();
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
});
|
|
276
|
+
describe('RestartCoordinator - cancelled requests', () => {
|
|
277
|
+
it('stops awaiting a cancelled request, so idle suspend is not blocked forever', async () => {
|
|
278
|
+
const deps = makeDeps();
|
|
279
|
+
deps.suspendChild = vi.fn().mockResolvedValue(undefined);
|
|
280
|
+
const coordinator = new RestartCoordinator(deps);
|
|
281
|
+
coordinator.handleHostLine('{"jsonrpc":"2.0","id":9,"method":"tools/call","params":{}}');
|
|
282
|
+
// MCP forbids answering a cancelled request, so no response will ever come.
|
|
283
|
+
coordinator.handleHostLine('{"jsonrpc":"2.0","method":"notifications/cancelled","params":{"requestId":9}}');
|
|
284
|
+
coordinator.suspend('idle');
|
|
285
|
+
await flushPromises();
|
|
286
|
+
expect(deps.suspendChild).toHaveBeenCalledTimes(1);
|
|
287
|
+
expect(coordinator.getPhase()).toBe('suspended');
|
|
288
|
+
});
|
|
289
|
+
it('swallows a late response to a cancelled request', () => {
|
|
290
|
+
const deps = makeDeps();
|
|
291
|
+
const coordinator = new RestartCoordinator(deps);
|
|
292
|
+
coordinator.handleHostLine('{"jsonrpc":"2.0","id":9,"method":"tools/call","params":{}}');
|
|
293
|
+
coordinator.handleHostLine('{"jsonrpc":"2.0","method":"notifications/cancelled","params":{"requestId":9}}');
|
|
294
|
+
deps.hostLines.length = 0;
|
|
295
|
+
coordinator.handleChildLine('{"jsonrpc":"2.0","id":9,"result":{}}');
|
|
296
|
+
expect(deps.hostLines).toEqual([]);
|
|
297
|
+
});
|
|
298
|
+
it('still blocks suspend for requests that were not cancelled', () => {
|
|
299
|
+
const deps = makeDeps();
|
|
300
|
+
deps.suspendChild = vi.fn().mockResolvedValue(undefined);
|
|
301
|
+
const coordinator = new RestartCoordinator(deps);
|
|
302
|
+
coordinator.handleHostLine('{"jsonrpc":"2.0","id":9,"method":"tools/call","params":{}}');
|
|
303
|
+
coordinator.handleHostLine('{"jsonrpc":"2.0","method":"notifications/cancelled","params":{"requestId":10}}');
|
|
304
|
+
coordinator.suspend('idle');
|
|
305
|
+
expect(deps.suspendChild).not.toHaveBeenCalled();
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
// Real timers, so `.then()` chains attached to already-resolved/pending native
|
|
309
|
+
// Promises actually get a chance to run.
|
|
310
|
+
async function flushMicrotasks() {
|
|
311
|
+
await Promise.resolve();
|
|
312
|
+
await Promise.resolve();
|
|
313
|
+
await Promise.resolve();
|
|
314
|
+
}
|
|
315
|
+
async function flushPromises() {
|
|
316
|
+
await flushMicrotasks();
|
|
317
|
+
}
|
|
318
|
+
describe('RestartCoordinator - idle suspend', () => {
|
|
319
|
+
const TOOL_CALL = '{"jsonrpc":"2.0","id":9,"method":"tools/call","params":{}}';
|
|
320
|
+
async function handshake(deps, coordinator) {
|
|
321
|
+
coordinator.handleHostLine(INIT_REQUEST);
|
|
322
|
+
coordinator.handleHostLine(INITIALIZED_NOTIF);
|
|
323
|
+
coordinator.handleChildLine('{"jsonrpc":"2.0","id":1,"result":{}}');
|
|
324
|
+
deps.childLines.length = 0;
|
|
325
|
+
deps.hostLines.length = 0;
|
|
326
|
+
}
|
|
327
|
+
it('tears the child down and stays suspended until the host speaks again', async () => {
|
|
328
|
+
const deps = makeDeps();
|
|
329
|
+
const suspendChild = vi.fn().mockResolvedValue(undefined);
|
|
330
|
+
deps.suspendChild = suspendChild;
|
|
331
|
+
const coordinator = new RestartCoordinator(deps);
|
|
332
|
+
await handshake(deps, coordinator);
|
|
333
|
+
coordinator.suspend('idle for 120 minute(s)');
|
|
334
|
+
expect(suspendChild).toHaveBeenCalledTimes(1);
|
|
335
|
+
await flushPromises();
|
|
336
|
+
expect(coordinator.getPhase()).toBe('suspended');
|
|
337
|
+
expect(deps.spawnChild).not.toHaveBeenCalled();
|
|
338
|
+
});
|
|
339
|
+
it('respawns and replays the handshake on the next host line', async () => {
|
|
340
|
+
const deps = makeDeps();
|
|
341
|
+
deps.suspendChild = vi.fn().mockResolvedValue(undefined);
|
|
342
|
+
const coordinator = new RestartCoordinator(deps);
|
|
343
|
+
await handshake(deps, coordinator);
|
|
344
|
+
coordinator.suspend('idle');
|
|
345
|
+
await flushPromises();
|
|
346
|
+
coordinator.handleHostLine(TOOL_CALL);
|
|
347
|
+
expect(deps.spawnChild).toHaveBeenCalledTimes(1);
|
|
348
|
+
expect(coordinator.getPhase()).toBe('ready');
|
|
349
|
+
// Replayed handshake first, then the request that woke us - and the
|
|
350
|
+
// request is forwarded rather than answered with an error.
|
|
351
|
+
expect(deps.childLines).toEqual([INIT_REQUEST, INITIALIZED_NOTIF, TOOL_CALL]);
|
|
352
|
+
expect(deps.hostLines.every((line) => !line.includes('"error"'))).toBe(true);
|
|
353
|
+
});
|
|
354
|
+
it('swallows the replayed initialize response the host already has', async () => {
|
|
355
|
+
const deps = makeDeps();
|
|
356
|
+
deps.suspendChild = vi.fn().mockResolvedValue(undefined);
|
|
357
|
+
const coordinator = new RestartCoordinator(deps);
|
|
358
|
+
await handshake(deps, coordinator);
|
|
359
|
+
coordinator.suspend('idle');
|
|
360
|
+
await flushPromises();
|
|
361
|
+
coordinator.handleHostLine(TOOL_CALL);
|
|
362
|
+
coordinator.handleChildLine('{"jsonrpc":"2.0","id":1,"result":{}}');
|
|
363
|
+
expect(deps.hostLines.some((line) => JSON.parse(line).id === 1)).toBe(false);
|
|
364
|
+
coordinator.handleChildLine('{"jsonrpc":"2.0","id":9,"result":{}}');
|
|
365
|
+
expect(JSON.parse(deps.hostLines.at(-1))).toMatchObject({ id: 9 });
|
|
366
|
+
});
|
|
367
|
+
it('queues a request that arrives while the child is still exiting', async () => {
|
|
368
|
+
const deps = makeDeps();
|
|
369
|
+
let releaseTeardown = () => { };
|
|
370
|
+
deps.suspendChild = vi.fn(() => new Promise((resolve) => { releaseTeardown = resolve; }));
|
|
371
|
+
const coordinator = new RestartCoordinator(deps);
|
|
372
|
+
await handshake(deps, coordinator);
|
|
373
|
+
coordinator.suspend('idle');
|
|
374
|
+
expect(coordinator.getPhase()).toBe('suspending');
|
|
375
|
+
coordinator.handleHostLine(TOOL_CALL);
|
|
376
|
+
// Nothing spawned yet - two children must never be alive at once.
|
|
377
|
+
expect(deps.spawnChild).not.toHaveBeenCalled();
|
|
378
|
+
expect(deps.hostLines).toEqual([]);
|
|
379
|
+
releaseTeardown();
|
|
380
|
+
await flushPromises();
|
|
381
|
+
expect(deps.spawnChild).toHaveBeenCalledTimes(1);
|
|
382
|
+
expect(deps.childLines).toContain(TOOL_CALL);
|
|
383
|
+
});
|
|
384
|
+
it('refuses to suspend with a request in flight', () => {
|
|
385
|
+
const deps = makeDeps();
|
|
386
|
+
deps.suspendChild = vi.fn().mockResolvedValue(undefined);
|
|
387
|
+
const coordinator = new RestartCoordinator(deps);
|
|
388
|
+
coordinator.handleHostLine(TOOL_CALL);
|
|
389
|
+
coordinator.suspend('idle');
|
|
390
|
+
expect(deps.suspendChild).not.toHaveBeenCalled();
|
|
391
|
+
expect(coordinator.getPhase()).toBe('ready');
|
|
392
|
+
});
|
|
393
|
+
it('refuses to suspend while restarting', () => {
|
|
394
|
+
const deps = makeDeps();
|
|
395
|
+
deps.suspendChild = vi.fn().mockResolvedValue(undefined);
|
|
396
|
+
const coordinator = new RestartCoordinator(deps);
|
|
397
|
+
coordinator.requestRestart('signal');
|
|
398
|
+
coordinator.suspend('idle');
|
|
399
|
+
expect(deps.suspendChild).not.toHaveBeenCalled();
|
|
400
|
+
});
|
|
401
|
+
it('ignores a restart trigger while suspended, leaving the next request to spawn a fresh build', async () => {
|
|
402
|
+
const deps = makeDeps();
|
|
403
|
+
deps.suspendChild = vi.fn().mockResolvedValue(undefined);
|
|
404
|
+
const coordinator = new RestartCoordinator(deps);
|
|
405
|
+
await handshake(deps, coordinator);
|
|
406
|
+
coordinator.suspend('idle');
|
|
407
|
+
await flushPromises();
|
|
408
|
+
coordinator.requestRestart('signal');
|
|
409
|
+
await flushPromises();
|
|
410
|
+
expect(deps.killChild).not.toHaveBeenCalled();
|
|
411
|
+
expect(deps.spawnChild).not.toHaveBeenCalled();
|
|
412
|
+
expect(coordinator.getPhase()).toBe('suspended');
|
|
413
|
+
});
|
|
414
|
+
it('does not treat the suspended child\'s exit as a crash', async () => {
|
|
415
|
+
const deps = makeDeps();
|
|
416
|
+
deps.suspendChild = vi.fn(async () => { coordinator.onChildExit(); });
|
|
417
|
+
const coordinator = new RestartCoordinator(deps);
|
|
418
|
+
await handshake(deps, coordinator);
|
|
419
|
+
coordinator.suspend('idle');
|
|
420
|
+
await flushPromises();
|
|
421
|
+
expect(deps.spawnChild).not.toHaveBeenCalled();
|
|
422
|
+
expect(coordinator.getPhase()).toBe('suspended');
|
|
423
|
+
});
|
|
424
|
+
it('falls back to killChild when no suspendChild is wired', async () => {
|
|
425
|
+
const deps = makeDeps();
|
|
426
|
+
const coordinator = new RestartCoordinator(deps);
|
|
427
|
+
await handshake(deps, coordinator);
|
|
428
|
+
coordinator.suspend('idle');
|
|
429
|
+
await flushPromises();
|
|
430
|
+
expect(deps.killChild).toHaveBeenCalledTimes(1);
|
|
431
|
+
expect(coordinator.getPhase()).toBe('suspended');
|
|
432
|
+
});
|
|
433
|
+
});
|
|
434
|
+
//# sourceMappingURL=restart-coordinator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"restart-coordinator.test.js","sourceRoot":"","sources":["../../src/supervisor/restart-coordinator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Make a test's fake `executeToolCall` behave the way the real one does: an
|
|
3
|
+
* `isError` response is RAISED as a ToolError, never returned.
|
|
4
|
+
*
|
|
5
|
+
* Harnesses that returned those responses instead are how a selector condition
|
|
6
|
+
* shipped broken with green tests - the code branched on `result.isError`,
|
|
7
|
+
* which is a shape production cannot produce, so the branch that actually runs
|
|
8
|
+
* was never exercised. Wrap every fake with this.
|
|
9
|
+
*/
|
|
10
|
+
export declare function productionShaped<T extends (...args: any[]) => Promise<any>>(fn: T): T;
|
|
11
|
+
//# sourceMappingURL=fake-execute-tool-call.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-execute-tool-call.d.ts","sourceRoot":"","sources":["../../src/test-support/fake-execute-tool-call.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAMrF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ToolError } from '../tool-error.js';
|
|
2
|
+
/**
|
|
3
|
+
* Make a test's fake `executeToolCall` behave the way the real one does: an
|
|
4
|
+
* `isError` response is RAISED as a ToolError, never returned.
|
|
5
|
+
*
|
|
6
|
+
* Harnesses that returned those responses instead are how a selector condition
|
|
7
|
+
* shipped broken with green tests - the code branched on `result.isError`,
|
|
8
|
+
* which is a shape production cannot produce, so the branch that actually runs
|
|
9
|
+
* was never exercised. Wrap every fake with this.
|
|
10
|
+
*/
|
|
11
|
+
export function productionShaped(fn) {
|
|
12
|
+
return (async (...args) => {
|
|
13
|
+
const response = await fn(...args);
|
|
14
|
+
if (response?.isError)
|
|
15
|
+
throw new ToolError(response);
|
|
16
|
+
return response;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=fake-execute-tool-call.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-execute-tool-call.js","sourceRoot":"","sources":["../../src/test-support/fake-execute-tool-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAA6C,EAAK;IAChF,OAAO,CAAC,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QACnC,IAAI,QAAQ,EAAE,OAAO;YAAE,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAM,CAAC;AACV,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A tool handler's error response, raised as an exception.
|
|
3
|
+
*
|
|
4
|
+
* `executeToolCall` converts any `isError` response into one of these, so every
|
|
5
|
+
* caller downstream of it sees tool failures as throws. Kept in its own module
|
|
6
|
+
* so tests can construct the real thing: a hand-rolled stand-in drifts from the
|
|
7
|
+
* `response` it carries, and code that classifies failures reads that response
|
|
8
|
+
* (`_errorId` above all).
|
|
9
|
+
*/
|
|
10
|
+
export declare class ToolError extends Error {
|
|
11
|
+
response: any;
|
|
12
|
+
constructor(response: any);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=tool-error.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-error.d.ts","sourceRoot":"","sources":["../src/tool-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,SAAU,SAAQ,KAAK;IACf,QAAQ,EAAE,GAAG;gBAAb,QAAQ,EAAE,GAAG;CAIjC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A tool handler's error response, raised as an exception.
|
|
3
|
+
*
|
|
4
|
+
* `executeToolCall` converts any `isError` response into one of these, so every
|
|
5
|
+
* caller downstream of it sees tool failures as throws. Kept in its own module
|
|
6
|
+
* so tests can construct the real thing: a hand-rolled stand-in drifts from the
|
|
7
|
+
* `response` it carries, and code that classifies failures reads that response
|
|
8
|
+
* (`_errorId` above all).
|
|
9
|
+
*/
|
|
10
|
+
export class ToolError extends Error {
|
|
11
|
+
response;
|
|
12
|
+
constructor(response) {
|
|
13
|
+
super(response?.content?.[0]?.text || 'Tool error');
|
|
14
|
+
this.response = response;
|
|
15
|
+
this.name = 'ToolError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=tool-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-error.js","sourceRoot":"","sources":["../src/tool-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IACf;IAAnB,YAAmB,QAAa;QAC9B,KAAK,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,YAAY,CAAC,CAAC;QADnC,aAAQ,GAAR,QAAQ,CAAK;QAE9B,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF"}
|