tabwright 1.0.0 → 1.0.1
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/dist/aria-snapshot.d.ts +0 -1
- package/dist/aria-snapshot.js +9 -1
- package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts +0 -1
- package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js +0 -1
- package/dist/bippy.js +1 -1
- package/dist/browser-config.d.ts +0 -1
- package/dist/browser-config.js +0 -1
- package/dist/browser-install.d.ts +0 -1
- package/dist/browser-install.js +0 -1
- package/dist/browser-launch.d.ts +0 -1
- package/dist/browser-launch.js +0 -1
- package/dist/builtin-capabilities.d.ts +0 -1
- package/dist/builtin-capabilities.js +0 -1
- package/dist/capability-agent-skill.d.ts +0 -1
- package/dist/capability-agent-skill.js +0 -1
- package/dist/capability-auth-state.d.ts +0 -1
- package/dist/capability-auth-state.js +0 -1
- package/dist/capability-auth.d.ts +0 -1
- package/dist/capability-auth.js +0 -1
- package/dist/capability-options.d.ts +0 -1
- package/dist/capability-options.js +0 -1
- package/dist/capability-package.d.ts +0 -1
- package/dist/capability-package.js +0 -1
- package/dist/capability-registry.d.ts +0 -1
- package/dist/capability-registry.js +0 -1
- package/dist/capability-runner.d.ts +0 -1
- package/dist/capability-runner.js +0 -1
- package/dist/capability-studio.d.ts +0 -1
- package/dist/capability-studio.js +0 -1
- package/dist/cdp-log.d.ts +0 -1
- package/dist/cdp-log.js +0 -1
- package/dist/cdp-relay.d.ts +0 -1
- package/dist/cdp-relay.js +0 -1
- package/dist/cdp-session.d.ts +0 -1
- package/dist/cdp-session.js +0 -1
- package/dist/cdp-types.d.ts +0 -1
- package/dist/cdp-types.js +0 -1
- package/dist/chrome-discovery.d.ts +0 -1
- package/dist/chrome-discovery.js +0 -1
- package/dist/clean-html.d.ts +0 -1
- package/dist/clean-html.js +0 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +9 -2
- package/dist/cloud-client.d.ts +0 -1
- package/dist/cloud-client.js +0 -1
- package/dist/create-logger.d.ts +0 -1
- package/dist/create-logger.js +0 -1
- package/dist/debugger-examples-types.d.ts +0 -1
- package/dist/debugger-examples-types.js +0 -1
- package/dist/debugger-examples.d.ts +0 -1
- package/dist/debugger-examples.js +0 -1
- package/dist/debugger.d.ts +0 -1
- package/dist/debugger.js +0 -1
- package/dist/diff-utils.d.ts +0 -1
- package/dist/diff-utils.js +0 -1
- package/dist/doctor.d.ts +0 -1
- package/dist/doctor.js +5 -7
- package/dist/editor-examples.d.ts +0 -1
- package/dist/editor-examples.js +0 -1
- package/dist/editor.d.ts +0 -1
- package/dist/editor.js +0 -1
- package/dist/env-compat.d.ts +0 -1
- package/dist/env-compat.js +0 -1
- package/dist/executor.d.ts +0 -1
- package/dist/executor.js +1 -2
- package/dist/extension/background.js +7 -3
- package/dist/extension/manifest.json +1 -1
- package/dist/ghost-browser.d.ts +0 -1
- package/dist/ghost-browser.js +0 -1
- package/dist/ghost-cursor-controller.d.ts +0 -1
- package/dist/ghost-cursor-controller.js +0 -1
- package/dist/ghost-cursor.d.ts +0 -1
- package/dist/ghost-cursor.js +0 -1
- package/dist/htmlrewrite.d.ts +0 -1
- package/dist/htmlrewrite.js +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/kill-port.d.ts +0 -1
- package/dist/kill-port.js +0 -1
- package/dist/kitty-graphics.d.ts +0 -1
- package/dist/kitty-graphics.js +0 -1
- package/dist/mcp.d.ts +0 -1
- package/dist/mcp.js +0 -1
- package/dist/package-paths.d.ts +0 -1
- package/dist/package-paths.js +0 -1
- package/dist/page-markdown.d.ts +0 -1
- package/dist/page-markdown.js +0 -1
- package/dist/performance-examples.d.ts +0 -1
- package/dist/performance-examples.js +0 -1
- package/dist/playwright-import.d.ts +0 -1
- package/dist/playwright-import.js +0 -1
- package/dist/product-paths.d.ts +0 -1
- package/dist/product-paths.js +0 -1
- package/dist/protocol.d.ts +0 -1
- package/dist/protocol.js +0 -1
- package/dist/react-source.d.ts +0 -1
- package/dist/react-source.js +0 -1
- package/dist/readability.js +1 -1
- package/dist/relay-client.d.ts +0 -1
- package/dist/relay-client.js +0 -1
- package/dist/relay-state.d.ts +0 -1
- package/dist/relay-state.js +0 -1
- package/dist/replay-ai-index.d.ts +0 -1
- package/dist/replay-ai-index.js +0 -1
- package/dist/replay-eval.d.ts +0 -1
- package/dist/replay-eval.js +0 -1
- package/dist/replay-handoff.d.ts +0 -1
- package/dist/replay-handoff.js +0 -1
- package/dist/replay-workflow-compiler.d.ts +0 -1
- package/dist/replay-workflow-compiler.js +0 -1
- package/dist/rrweb-recording-relay.d.ts +0 -1
- package/dist/rrweb-recording-relay.js +0 -1
- package/dist/rrweb-recording.d.ts +0 -1
- package/dist/rrweb-recording.js +0 -1
- package/dist/scoped-fs.d.ts +0 -1
- package/dist/scoped-fs.js +0 -1
- package/dist/selector-generator.js +1 -1
- package/dist/start-relay-server.d.ts +0 -1
- package/dist/start-relay-server.js +0 -1
- package/dist/styles-examples.d.ts +0 -1
- package/dist/styles-examples.js +0 -1
- package/dist/styles.d.ts +0 -1
- package/dist/styles.js +0 -1
- package/dist/tabwright-agent-skill.d.ts +0 -1
- package/dist/tabwright-agent-skill.js +0 -1
- package/dist/test-declarations.d.ts +0 -1
- package/dist/test-declarations.js +0 -1
- package/dist/utils.d.ts +0 -1
- package/dist/utils.js +2 -2
- package/dist/wait-for-page-load.d.ts +0 -1
- package/dist/wait-for-page-load.js +0 -1
- package/dist/workflow-capability.d.ts +0 -1
- package/dist/workflow-capability.js +0 -1
- package/package.json +9 -4
- package/readme.md +35 -0
- package/dist/aria-snapshot.d.ts.map +0 -1
- package/dist/aria-snapshot.js.map +0 -1
- package/dist/aria-snapshot.test.d.ts +0 -2
- package/dist/aria-snapshot.test.d.ts.map +0 -1
- package/dist/aria-snapshot.test.js +0 -270
- package/dist/aria-snapshot.test.js.map +0 -1
- package/dist/aria-snapshot.unit.test.d.ts +0 -2
- package/dist/aria-snapshot.unit.test.d.ts.map +0 -1
- package/dist/aria-snapshot.unit.test.js +0 -542
- package/dist/aria-snapshot.unit.test.js.map +0 -1
- package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts.map +0 -1
- package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js.map +0 -1
- package/dist/browser-config.d.ts.map +0 -1
- package/dist/browser-config.js.map +0 -1
- package/dist/browser-install.d.ts.map +0 -1
- package/dist/browser-install.js.map +0 -1
- package/dist/browser-launch.d.ts.map +0 -1
- package/dist/browser-launch.js.map +0 -1
- package/dist/builtin-capabilities.d.ts.map +0 -1
- package/dist/builtin-capabilities.js.map +0 -1
- package/dist/capability-agent-skill.d.ts.map +0 -1
- package/dist/capability-agent-skill.js.map +0 -1
- package/dist/capability-auth-state.d.ts.map +0 -1
- package/dist/capability-auth-state.js.map +0 -1
- package/dist/capability-auth.d.ts.map +0 -1
- package/dist/capability-auth.js.map +0 -1
- package/dist/capability-cli-confirmation.test.d.ts +0 -2
- package/dist/capability-cli-confirmation.test.d.ts.map +0 -1
- package/dist/capability-cli-confirmation.test.js +0 -79
- package/dist/capability-cli-confirmation.test.js.map +0 -1
- package/dist/capability-options.d.ts.map +0 -1
- package/dist/capability-options.js.map +0 -1
- package/dist/capability-options.test.d.ts +0 -2
- package/dist/capability-options.test.d.ts.map +0 -1
- package/dist/capability-options.test.js +0 -81
- package/dist/capability-options.test.js.map +0 -1
- package/dist/capability-package.d.ts.map +0 -1
- package/dist/capability-package.js.map +0 -1
- package/dist/capability-package.test.d.ts +0 -2
- package/dist/capability-package.test.d.ts.map +0 -1
- package/dist/capability-package.test.js +0 -179
- package/dist/capability-package.test.js.map +0 -1
- package/dist/capability-registry.d.ts.map +0 -1
- package/dist/capability-registry.js.map +0 -1
- package/dist/capability-registry.test.d.ts +0 -2
- package/dist/capability-registry.test.d.ts.map +0 -1
- package/dist/capability-registry.test.js +0 -1683
- package/dist/capability-registry.test.js.map +0 -1
- package/dist/capability-runner.d.ts.map +0 -1
- package/dist/capability-runner.js.map +0 -1
- package/dist/capability-search-relevance.test.d.ts +0 -2
- package/dist/capability-search-relevance.test.d.ts.map +0 -1
- package/dist/capability-search-relevance.test.js +0 -67
- package/dist/capability-search-relevance.test.js.map +0 -1
- package/dist/capability-studio.d.ts.map +0 -1
- package/dist/capability-studio.js.map +0 -1
- package/dist/capability-studio.test.d.ts +0 -2
- package/dist/capability-studio.test.d.ts.map +0 -1
- package/dist/capability-studio.test.js +0 -41
- package/dist/capability-studio.test.js.map +0 -1
- package/dist/cdp-log.d.ts.map +0 -1
- package/dist/cdp-log.js.map +0 -1
- package/dist/cdp-log.test.d.ts +0 -2
- package/dist/cdp-log.test.d.ts.map +0 -1
- package/dist/cdp-log.test.js +0 -109
- package/dist/cdp-log.test.js.map +0 -1
- package/dist/cdp-relay.d.ts.map +0 -1
- package/dist/cdp-relay.js.map +0 -1
- package/dist/cdp-session.d.ts.map +0 -1
- package/dist/cdp-session.js.map +0 -1
- package/dist/cdp-types.d.ts.map +0 -1
- package/dist/cdp-types.js.map +0 -1
- package/dist/channel-owner-inspect.test.d.ts +0 -2
- package/dist/channel-owner-inspect.test.d.ts.map +0 -1
- package/dist/channel-owner-inspect.test.js +0 -75
- package/dist/channel-owner-inspect.test.js.map +0 -1
- package/dist/chrome-discovery.d.ts.map +0 -1
- package/dist/chrome-discovery.js.map +0 -1
- package/dist/chrome-discovery.test.d.ts +0 -2
- package/dist/chrome-discovery.test.d.ts.map +0 -1
- package/dist/chrome-discovery.test.js +0 -41
- package/dist/chrome-discovery.test.js.map +0 -1
- package/dist/clean-html.d.ts.map +0 -1
- package/dist/clean-html.js.map +0 -1
- package/dist/cli-help.test.d.ts +0 -2
- package/dist/cli-help.test.d.ts.map +0 -1
- package/dist/cli-help.test.js +0 -98
- package/dist/cli-help.test.js.map +0 -1
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/cloud-client.d.ts.map +0 -1
- package/dist/cloud-client.js.map +0 -1
- package/dist/create-logger.d.ts.map +0 -1
- package/dist/create-logger.js.map +0 -1
- package/dist/debugger-examples-types.d.ts.map +0 -1
- package/dist/debugger-examples-types.js.map +0 -1
- package/dist/debugger-examples.d.ts.map +0 -1
- package/dist/debugger-examples.js.map +0 -1
- package/dist/debugger.d.ts.map +0 -1
- package/dist/debugger.js.map +0 -1
- package/dist/diff-utils.d.ts.map +0 -1
- package/dist/diff-utils.js.map +0 -1
- package/dist/diff-utils.test.d.ts +0 -2
- package/dist/diff-utils.test.d.ts.map +0 -1
- package/dist/diff-utils.test.js +0 -137
- package/dist/diff-utils.test.js.map +0 -1
- package/dist/doctor.d.ts.map +0 -1
- package/dist/doctor.js.map +0 -1
- package/dist/doctor.test.d.ts +0 -2
- package/dist/doctor.test.d.ts.map +0 -1
- package/dist/doctor.test.js +0 -208
- package/dist/doctor.test.js.map +0 -1
- package/dist/editor-examples.d.ts.map +0 -1
- package/dist/editor-examples.js.map +0 -1
- package/dist/editor.d.ts.map +0 -1
- package/dist/editor.js.map +0 -1
- package/dist/env-compat.d.ts.map +0 -1
- package/dist/env-compat.js.map +0 -1
- package/dist/executor.d.ts.map +0 -1
- package/dist/executor.js.map +0 -1
- package/dist/executor.unit.test.d.ts +0 -2
- package/dist/executor.unit.test.d.ts.map +0 -1
- package/dist/executor.unit.test.js +0 -143
- package/dist/executor.unit.test.js.map +0 -1
- package/dist/extension-connection.test.d.ts +0 -2
- package/dist/extension-connection.test.d.ts.map +0 -1
- package/dist/extension-connection.test.js +0 -708
- package/dist/extension-connection.test.js.map +0 -1
- package/dist/extension-icon-warning.test.d.ts +0 -2
- package/dist/extension-icon-warning.test.d.ts.map +0 -1
- package/dist/extension-icon-warning.test.js +0 -33
- package/dist/extension-icon-warning.test.js.map +0 -1
- package/dist/ghost-browser.d.ts.map +0 -1
- package/dist/ghost-browser.js.map +0 -1
- package/dist/ghost-cursor-controller.d.ts.map +0 -1
- package/dist/ghost-cursor-controller.js.map +0 -1
- package/dist/ghost-cursor.d.ts.map +0 -1
- package/dist/ghost-cursor.js.map +0 -1
- package/dist/htmlrewrite.d.ts.map +0 -1
- package/dist/htmlrewrite.js.map +0 -1
- package/dist/htmlrewrite.test.d.ts +0 -2
- package/dist/htmlrewrite.test.d.ts.map +0 -1
- package/dist/htmlrewrite.test.js +0 -7975
- package/dist/htmlrewrite.test.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/kill-port.d.ts.map +0 -1
- package/dist/kill-port.js.map +0 -1
- package/dist/kitty-graphics.d.ts.map +0 -1
- package/dist/kitty-graphics.js.map +0 -1
- package/dist/kitty-graphics.test.d.ts +0 -2
- package/dist/kitty-graphics.test.d.ts.map +0 -1
- package/dist/kitty-graphics.test.js +0 -125
- package/dist/kitty-graphics.test.js.map +0 -1
- package/dist/locator-selector.test.d.ts +0 -2
- package/dist/locator-selector.test.d.ts.map +0 -1
- package/dist/locator-selector.test.js +0 -98
- package/dist/locator-selector.test.js.map +0 -1
- package/dist/mcp-client.d.ts +0 -20
- package/dist/mcp-client.d.ts.map +0 -1
- package/dist/mcp-client.js +0 -56
- package/dist/mcp-client.js.map +0 -1
- package/dist/mcp.d.ts.map +0 -1
- package/dist/mcp.js.map +0 -1
- package/dist/on-mouse-action.test.d.ts +0 -2
- package/dist/on-mouse-action.test.d.ts.map +0 -1
- package/dist/on-mouse-action.test.js +0 -180
- package/dist/on-mouse-action.test.js.map +0 -1
- package/dist/options-page.test.d.ts +0 -2
- package/dist/options-page.test.d.ts.map +0 -1
- package/dist/options-page.test.js +0 -773
- package/dist/options-page.test.js.map +0 -1
- package/dist/package-paths.d.ts.map +0 -1
- package/dist/package-paths.js.map +0 -1
- package/dist/page-markdown.d.ts.map +0 -1
- package/dist/page-markdown.js.map +0 -1
- package/dist/performance-examples.d.ts.map +0 -1
- package/dist/performance-examples.js.map +0 -1
- package/dist/playwright-import.d.ts.map +0 -1
- package/dist/playwright-import.js.map +0 -1
- package/dist/popup-relocation.test.d.ts +0 -7
- package/dist/popup-relocation.test.d.ts.map +0 -1
- package/dist/popup-relocation.test.js +0 -139
- package/dist/popup-relocation.test.js.map +0 -1
- package/dist/product-paths.d.ts.map +0 -1
- package/dist/product-paths.js.map +0 -1
- package/dist/product-paths.test.d.ts +0 -2
- package/dist/product-paths.test.d.ts.map +0 -1
- package/dist/product-paths.test.js +0 -39
- package/dist/product-paths.test.js.map +0 -1
- package/dist/protocol.d.ts.map +0 -1
- package/dist/protocol.js.map +0 -1
- package/dist/protocol.test.d.ts +0 -2
- package/dist/protocol.test.d.ts.map +0 -1
- package/dist/protocol.test.js +0 -31
- package/dist/protocol.test.js.map +0 -1
- package/dist/react-source.d.ts.map +0 -1
- package/dist/react-source.js.map +0 -1
- package/dist/relay-client.d.ts.map +0 -1
- package/dist/relay-client.js.map +0 -1
- package/dist/relay-client.test.d.ts +0 -2
- package/dist/relay-client.test.d.ts.map +0 -1
- package/dist/relay-client.test.js +0 -305
- package/dist/relay-client.test.js.map +0 -1
- package/dist/relay-core.test.d.ts +0 -2
- package/dist/relay-core.test.d.ts.map +0 -1
- package/dist/relay-core.test.js +0 -1427
- package/dist/relay-core.test.js.map +0 -1
- package/dist/relay-navigation.test.d.ts +0 -2
- package/dist/relay-navigation.test.d.ts.map +0 -1
- package/dist/relay-navigation.test.js +0 -661
- package/dist/relay-navigation.test.js.map +0 -1
- package/dist/relay-session.test.d.ts +0 -2
- package/dist/relay-session.test.d.ts.map +0 -1
- package/dist/relay-session.test.js +0 -1121
- package/dist/relay-session.test.js.map +0 -1
- package/dist/relay-state.d.ts.map +0 -1
- package/dist/relay-state.js.map +0 -1
- package/dist/relay-state.test.d.ts +0 -2
- package/dist/relay-state.test.d.ts.map +0 -1
- package/dist/relay-state.test.js +0 -594
- package/dist/relay-state.test.js.map +0 -1
- package/dist/replay-ai-index.d.ts.map +0 -1
- package/dist/replay-ai-index.js.map +0 -1
- package/dist/replay-ai-index.test.d.ts +0 -2
- package/dist/replay-ai-index.test.d.ts.map +0 -1
- package/dist/replay-ai-index.test.js +0 -255
- package/dist/replay-ai-index.test.js.map +0 -1
- package/dist/replay-cli.test.d.ts +0 -2
- package/dist/replay-cli.test.d.ts.map +0 -1
- package/dist/replay-cli.test.js +0 -275
- package/dist/replay-cli.test.js.map +0 -1
- package/dist/replay-eval.d.ts.map +0 -1
- package/dist/replay-eval.js.map +0 -1
- package/dist/replay-handoff.d.ts.map +0 -1
- package/dist/replay-handoff.js.map +0 -1
- package/dist/replay-handoff.test.d.ts +0 -2
- package/dist/replay-handoff.test.d.ts.map +0 -1
- package/dist/replay-handoff.test.js +0 -123
- package/dist/replay-handoff.test.js.map +0 -1
- package/dist/replay-workflow-compiler.d.ts.map +0 -1
- package/dist/replay-workflow-compiler.js.map +0 -1
- package/dist/replay-workflow-compiler.test.d.ts +0 -2
- package/dist/replay-workflow-compiler.test.d.ts.map +0 -1
- package/dist/replay-workflow-compiler.test.js +0 -223
- package/dist/replay-workflow-compiler.test.js.map +0 -1
- package/dist/rrweb-recording-relay.d.ts.map +0 -1
- package/dist/rrweb-recording-relay.js.map +0 -1
- package/dist/rrweb-recording-relay.test.d.ts +0 -2
- package/dist/rrweb-recording-relay.test.d.ts.map +0 -1
- package/dist/rrweb-recording-relay.test.js +0 -85
- package/dist/rrweb-recording-relay.test.js.map +0 -1
- package/dist/rrweb-recording.d.ts.map +0 -1
- package/dist/rrweb-recording.js.map +0 -1
- package/dist/scoped-fs.d.ts.map +0 -1
- package/dist/scoped-fs.js.map +0 -1
- package/dist/scoped-fs.test.d.ts +0 -5
- package/dist/scoped-fs.test.d.ts.map +0 -1
- package/dist/scoped-fs.test.js +0 -73
- package/dist/scoped-fs.test.js.map +0 -1
- package/dist/skill-stub.test.d.ts +0 -2
- package/dist/skill-stub.test.d.ts.map +0 -1
- package/dist/skill-stub.test.js +0 -22
- package/dist/skill-stub.test.js.map +0 -1
- package/dist/snapshot-tools.test.d.ts +0 -2
- package/dist/snapshot-tools.test.d.ts.map +0 -1
- package/dist/snapshot-tools.test.js +0 -856
- package/dist/snapshot-tools.test.js.map +0 -1
- package/dist/start-relay-server.d.ts.map +0 -1
- package/dist/start-relay-server.js.map +0 -1
- package/dist/styles-examples.d.ts.map +0 -1
- package/dist/styles-examples.js.map +0 -1
- package/dist/styles.d.ts.map +0 -1
- package/dist/styles.js.map +0 -1
- package/dist/tabwright-agent-skill.d.ts.map +0 -1
- package/dist/tabwright-agent-skill.js.map +0 -1
- package/dist/tabwright-agent-skill.test.d.ts +0 -2
- package/dist/tabwright-agent-skill.test.d.ts.map +0 -1
- package/dist/tabwright-agent-skill.test.js +0 -51
- package/dist/tabwright-agent-skill.test.js.map +0 -1
- package/dist/test-declarations.d.ts.map +0 -1
- package/dist/test-declarations.js.map +0 -1
- package/dist/test-utils.d.ts +0 -69
- package/dist/test-utils.d.ts.map +0 -1
- package/dist/test-utils.js +0 -448
- package/dist/test-utils.js.map +0 -1
- package/dist/test-utils.test.d.ts +0 -2
- package/dist/test-utils.test.d.ts.map +0 -1
- package/dist/test-utils.test.js +0 -55
- package/dist/test-utils.test.js.map +0 -1
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js.map +0 -1
- package/dist/wait-for-page-load.d.ts.map +0 -1
- package/dist/wait-for-page-load.js.map +0 -1
- package/dist/workflow-capability.d.ts.map +0 -1
- package/dist/workflow-capability.js.map +0 -1
- package/dist/workflow-script-flow.test.d.ts +0 -2
- package/dist/workflow-script-flow.test.d.ts.map +0 -1
- package/dist/workflow-script-flow.test.js +0 -285
- package/dist/workflow-script-flow.test.js.map +0 -1
- package/src/__snapshots__/x.com.processed.html +0 -1003
- package/src/__snapshots__/x.com.processed.withStyles.html +0 -2720
- package/src/a11y-client.ts +0 -241
- package/src/aria-snapshot.test.ts +0 -311
- package/src/aria-snapshot.ts +0 -1681
- package/src/aria-snapshot.unit.test.ts +0 -615
- package/src/aria-snapshots/github-interactive.txt +0 -193
- package/src/aria-snapshots/github-raw.txt +0 -309
- package/src/aria-snapshots/hackernews-interactive.txt +0 -477
- package/src/aria-snapshots/hackernews-raw.txt +0 -428
- package/src/aria-snapshots/prosemirror-interactive.txt +0 -66
- package/src/aria-snapshots/prosemirror-raw.txt +0 -145
- package/src/assets/aria-labels-hacker-news.png +0 -0
- package/src/assets/aria-labels-old-reddit.png +0 -0
- package/src/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.ts +0 -5
- package/src/assets/cursors/screen-studio/pointer-macos-tahoe.svg +0 -18
- package/src/assets/x.com.html +0 -32946
- package/src/browser-config.ts +0 -179
- package/src/browser-install.ts +0 -284
- package/src/browser-launch.ts +0 -75
- package/src/builtin-capabilities.ts +0 -2765
- package/src/capability-agent-skill.ts +0 -305
- package/src/capability-auth-state.ts +0 -197
- package/src/capability-auth.ts +0 -249
- package/src/capability-cli-confirmation.test.ts +0 -90
- package/src/capability-options.test.ts +0 -89
- package/src/capability-options.ts +0 -57
- package/src/capability-package.test.ts +0 -204
- package/src/capability-package.ts +0 -555
- package/src/capability-registry.test.ts +0 -1905
- package/src/capability-registry.ts +0 -1234
- package/src/capability-runner.ts +0 -801
- package/src/capability-search-relevance.test.ts +0 -73
- package/src/capability-studio.test.ts +0 -45
- package/src/capability-studio.ts +0 -641
- package/src/cdp-log.test.ts +0 -131
- package/src/cdp-log.ts +0 -112
- package/src/cdp-relay.ts +0 -2944
- package/src/cdp-session.ts +0 -77
- package/src/cdp-types.ts +0 -158
- package/src/channel-owner-inspect.test.ts +0 -94
- package/src/chrome-discovery.test.ts +0 -50
- package/src/chrome-discovery.ts +0 -220
- package/src/clean-html.ts +0 -141
- package/src/cli-help.test.ts +0 -123
- package/src/cli.ts +0 -3181
- package/src/cloud-client.ts +0 -179
- package/src/create-logger.ts +0 -38
- package/src/debugger-examples-types.ts +0 -16
- package/src/debugger-examples.ts +0 -66
- package/src/debugger.ts +0 -708
- package/src/diff-utils.test.ts +0 -152
- package/src/diff-utils.ts +0 -70
- package/src/doctor.test.ts +0 -244
- package/src/doctor.ts +0 -321
- package/src/editor-examples.ts +0 -158
- package/src/editor.ts +0 -426
- package/src/env-compat.ts +0 -28
- package/src/executor.ts +0 -1824
- package/src/executor.unit.test.ts +0 -168
- package/src/extension-connection.test.ts +0 -855
- package/src/extension-icon-warning.test.ts +0 -45
- package/src/ghost-browser.ts +0 -149
- package/src/ghost-cursor-client.ts +0 -494
- package/src/ghost-cursor-controller.ts +0 -129
- package/src/ghost-cursor.ts +0 -123
- package/src/htmlrewrite.test.ts +0 -8008
- package/src/htmlrewrite.ts +0 -390
- package/src/index.ts +0 -53
- package/src/kill-port.ts +0 -219
- package/src/kitty-graphics.test.ts +0 -139
- package/src/kitty-graphics.ts +0 -79
- package/src/locator-selector.test.ts +0 -119
- package/src/mcp-client.ts +0 -78
- package/src/mcp.ts +0 -629
- package/src/on-mouse-action.test.ts +0 -226
- package/src/options-page.test.ts +0 -839
- package/src/package-paths.ts +0 -38
- package/src/page-markdown.ts +0 -240
- package/src/performance-examples.ts +0 -186
- package/src/playwright-import.ts +0 -59
- package/src/popup-relocation.test.ts +0 -163
- package/src/product-paths.test.ts +0 -47
- package/src/product-paths.ts +0 -28
- package/src/protocol.test.ts +0 -52
- package/src/protocol.ts +0 -351
- package/src/react-source.ts +0 -379
- package/src/relay-client.test.ts +0 -375
- package/src/relay-client.ts +0 -572
- package/src/relay-core.test.ts +0 -1603
- package/src/relay-navigation.test.ts +0 -790
- package/src/relay-session.test.ts +0 -1375
- package/src/relay-state.test.ts +0 -729
- package/src/relay-state.ts +0 -561
- package/src/replay-ai-index.test.ts +0 -278
- package/src/replay-ai-index.ts +0 -872
- package/src/replay-cli.test.ts +0 -325
- package/src/replay-eval.ts +0 -1039
- package/src/replay-handoff.test.ts +0 -163
- package/src/replay-handoff.ts +0 -109
- package/src/replay-workflow-compiler.test.ts +0 -250
- package/src/replay-workflow-compiler.ts +0 -700
- package/src/resource.md +0 -409
- package/src/rrweb-recording-relay.test.ts +0 -99
- package/src/rrweb-recording-relay.ts +0 -400
- package/src/rrweb-recording.ts +0 -322
- package/src/scoped-fs.test.ts +0 -80
- package/src/scoped-fs.ts +0 -420
- package/src/skill-stub.test.ts +0 -24
- package/src/snapshot-tools.test.ts +0 -1017
- package/src/snapshots/hacker-news-accessibility-full.md +0 -81
- package/src/snapshots/hacker-news-accessibility-interactive.md +0 -43
- package/src/snapshots/page-markdown-output.txt +0 -16
- package/src/snapshots/shadcn-ui-accessibility-full.md +0 -201
- package/src/snapshots/shadcn-ui-accessibility-interactive.md +0 -109
- package/src/start-relay-server.ts +0 -69
- package/src/styles-examples.ts +0 -84
- package/src/styles.ts +0 -343
- package/src/tabwright-agent-skill.test.ts +0 -61
- package/src/tabwright-agent-skill.ts +0 -105
- package/src/test-declarations.ts +0 -13
- package/src/test-utils.test.ts +0 -70
- package/src/test-utils.ts +0 -566
- package/src/utils.ts +0 -78
- package/src/wait-for-page-load.ts +0 -198
- package/src/workflow-capability.ts +0 -417
- package/src/workflow-script-flow.test.ts +0 -388
package/src/relay-state.ts
DELETED
|
@@ -1,561 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Centralized relay state: one immutable atom for domain state + runtime resources.
|
|
3
|
-
*
|
|
4
|
-
* Follows the zustand-centralized-state skill pattern:
|
|
5
|
-
* - Single Zustand vanilla store holds all relay state
|
|
6
|
-
* - setState() callbacks remain deterministic data transitions
|
|
7
|
-
* - Runtime resources (WebSocket/timers/pending callbacks) are co-located on
|
|
8
|
-
* each extension entry in the same map
|
|
9
|
-
*
|
|
10
|
-
* See docs/plan-centralize-relay-state.md for the full refactor plan.
|
|
11
|
-
*/
|
|
12
|
-
import { createStore, type StoreApi } from 'zustand/vanilla'
|
|
13
|
-
import type { WSContext } from 'hono/ws'
|
|
14
|
-
import type WebSocket from 'ws'
|
|
15
|
-
import type { Protocol } from './cdp-types.js'
|
|
16
|
-
import { EXTENSION_FEATURE } from './protocol.js'
|
|
17
|
-
|
|
18
|
-
// ---------------------------------------------------------------------------
|
|
19
|
-
// Types
|
|
20
|
-
// ---------------------------------------------------------------------------
|
|
21
|
-
|
|
22
|
-
export type ConnectedTarget = {
|
|
23
|
-
sessionId: string
|
|
24
|
-
targetId: string
|
|
25
|
-
targetInfo: Protocol.Target.TargetInfo
|
|
26
|
-
frameIds: Set<string>
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export type ExtensionInfo = {
|
|
30
|
-
browser?: string
|
|
31
|
-
email?: string
|
|
32
|
-
id?: string
|
|
33
|
-
installId?: string
|
|
34
|
-
/** Tabwright package version the extension was built with (sent as ?v= query param) */
|
|
35
|
-
version?: string
|
|
36
|
-
/** Extension/relay protocol version sent during the additive query-string handshake. */
|
|
37
|
-
protocolVersion?: number
|
|
38
|
-
/** Optional features supported by this extension. Missing means a legacy connection. */
|
|
39
|
-
features?: string[]
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export type ExtensionPendingRequest = {
|
|
43
|
-
resolve: (result: unknown) => void
|
|
44
|
-
reject: (error: Error) => void
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Single aggregated extension object: domain state + runtime I/O.
|
|
49
|
-
*/
|
|
50
|
-
export type ExtensionEntry = {
|
|
51
|
-
id: string
|
|
52
|
-
info: ExtensionInfo
|
|
53
|
-
stableKey: string
|
|
54
|
-
connectedTargets: Map<string, ConnectedTarget>
|
|
55
|
-
// Runtime I/O fields
|
|
56
|
-
ws: WSContext<WebSocket> | null
|
|
57
|
-
pendingRequests: Map<number, ExtensionPendingRequest>
|
|
58
|
-
messageId: number
|
|
59
|
-
pingInterval: ReturnType<typeof setInterval> | null
|
|
60
|
-
lastPongAt: number | null
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export type PlaywrightClient = {
|
|
64
|
-
id: string
|
|
65
|
-
extensionId: string | null
|
|
66
|
-
ws: WSContext
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
export type RelayState = {
|
|
70
|
-
extensions: Map<string, ExtensionEntry>
|
|
71
|
-
playwrightClients: Map<string, PlaywrightClient>
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
export const EXTENSION_HEARTBEAT_TIMEOUT_MS = 15_000
|
|
75
|
-
|
|
76
|
-
export type ExtensionNegotiationStatus = {
|
|
77
|
-
connectionHealth: 'ready' | 'limited' | 'legacy'
|
|
78
|
-
missingFeatures: string[]
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// ---------------------------------------------------------------------------
|
|
82
|
-
// Store factory
|
|
83
|
-
// ---------------------------------------------------------------------------
|
|
84
|
-
|
|
85
|
-
export function createRelayStore(): StoreApi<RelayState> {
|
|
86
|
-
return createStore<RelayState>(() => ({
|
|
87
|
-
extensions: new Map(),
|
|
88
|
-
playwrightClients: new Map(),
|
|
89
|
-
}))
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// ---------------------------------------------------------------------------
|
|
93
|
-
// Derivation helpers
|
|
94
|
-
// ---------------------------------------------------------------------------
|
|
95
|
-
|
|
96
|
-
export function getExtensionNegotiationStatus(info: ExtensionInfo | undefined): ExtensionNegotiationStatus {
|
|
97
|
-
if (!info?.features) {
|
|
98
|
-
return { connectionHealth: 'legacy', missingFeatures: [] }
|
|
99
|
-
}
|
|
100
|
-
const missingFeatures = Object.values(EXTENSION_FEATURE).filter((feature) => {
|
|
101
|
-
return !info.features?.includes(feature)
|
|
102
|
-
})
|
|
103
|
-
return {
|
|
104
|
-
connectionHealth: missingFeatures.length === 0 ? 'ready' : 'limited',
|
|
105
|
-
missingFeatures,
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/**
|
|
110
|
-
* Linear scan over extensions to find one by stableKey. With <10 extensions this is free.
|
|
111
|
-
* Returns the LAST (newest) match because during reconnect both old and new connections
|
|
112
|
-
* coexist briefly. Map iteration order is insertion order, so last wins.
|
|
113
|
-
*/
|
|
114
|
-
export function findExtensionByStableKey(state: RelayState, stableKey: string): ExtensionEntry | undefined {
|
|
115
|
-
let match: ExtensionEntry | undefined
|
|
116
|
-
for (const ext of state.extensions.values()) {
|
|
117
|
-
if (ext.stableKey === stableKey) {
|
|
118
|
-
match = ext
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return match
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export function buildStableExtensionKey(info: ExtensionInfo, connectionId: string): string {
|
|
125
|
-
// chrome.identity ids and emails identify the signed-in Google account, not
|
|
126
|
-
// the Chrome profile. Use the per-profile extension storage install id first
|
|
127
|
-
// so two profiles signed into the same account never replace each other.
|
|
128
|
-
if (info.installId) {
|
|
129
|
-
return `install:${info.browser || 'unknown'}:${info.installId}`
|
|
130
|
-
}
|
|
131
|
-
if (info.id) {
|
|
132
|
-
return `profile:${info.id}`
|
|
133
|
-
}
|
|
134
|
-
if (info.email) {
|
|
135
|
-
return `email:${info.email}`
|
|
136
|
-
}
|
|
137
|
-
if (info.browser) {
|
|
138
|
-
return `browser:${info.browser}`
|
|
139
|
-
}
|
|
140
|
-
return `connection:${connectionId}`
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/** Find which extension owns a CDP tab sessionId (e.g. "pw-tab-1"). */
|
|
144
|
-
export function findExtensionIdByCdpSession(state: RelayState, cdpSessionId: string): string | null {
|
|
145
|
-
for (const [connectionId, ext] of state.extensions.entries()) {
|
|
146
|
-
if (ext.connectedTargets.has(cdpSessionId)) {
|
|
147
|
-
return connectionId
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
return null
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export function hasExtensionHeartbeatExpired({
|
|
154
|
-
lastPongAt,
|
|
155
|
-
now,
|
|
156
|
-
timeoutMs = EXTENSION_HEARTBEAT_TIMEOUT_MS,
|
|
157
|
-
}: {
|
|
158
|
-
lastPongAt: number | null
|
|
159
|
-
now: number
|
|
160
|
-
timeoutMs?: number
|
|
161
|
-
}): boolean {
|
|
162
|
-
if (lastPongAt === null) {
|
|
163
|
-
return false
|
|
164
|
-
}
|
|
165
|
-
return now - lastPongAt > timeoutMs
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// ---------------------------------------------------------------------------
|
|
169
|
-
// Pure state transition functions
|
|
170
|
-
//
|
|
171
|
-
// Each takes RelayState + event data and returns a new RelayState.
|
|
172
|
-
// No I/O, no side effects. Testable with data in / data out.
|
|
173
|
-
// ---------------------------------------------------------------------------
|
|
174
|
-
|
|
175
|
-
/**
|
|
176
|
-
* Add a new extension connection.
|
|
177
|
-
* Does NOT remove an existing connection with the same stableKey — that old
|
|
178
|
-
* connection stays routable until its WebSocket onClose fires and calls
|
|
179
|
-
* removeExtension(). This preserves in-flight message routing during reconnect.
|
|
180
|
-
* findExtensionByStableKey() returns the newest match so stableKey lookups
|
|
181
|
-
* resolve to the new connection immediately.
|
|
182
|
-
*/
|
|
183
|
-
export function addExtension(
|
|
184
|
-
state: RelayState,
|
|
185
|
-
{
|
|
186
|
-
id,
|
|
187
|
-
info,
|
|
188
|
-
stableKey,
|
|
189
|
-
ws,
|
|
190
|
-
}: {
|
|
191
|
-
id: string
|
|
192
|
-
info: ExtensionInfo
|
|
193
|
-
stableKey: string
|
|
194
|
-
ws: WSContext<WebSocket> | null
|
|
195
|
-
},
|
|
196
|
-
): RelayState {
|
|
197
|
-
const newExtensions = new Map(state.extensions)
|
|
198
|
-
|
|
199
|
-
newExtensions.set(id, {
|
|
200
|
-
id,
|
|
201
|
-
info,
|
|
202
|
-
stableKey,
|
|
203
|
-
connectedTargets: new Map(),
|
|
204
|
-
ws,
|
|
205
|
-
pendingRequests: new Map(),
|
|
206
|
-
messageId: 0,
|
|
207
|
-
pingInterval: null,
|
|
208
|
-
lastPongAt: null,
|
|
209
|
-
})
|
|
210
|
-
return { ...state, extensions: newExtensions }
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/** Remove an extension, its targets, and any playwright clients bound to it. */
|
|
214
|
-
export function removeExtension(state: RelayState, { extensionId }: { extensionId: string }): RelayState {
|
|
215
|
-
if (!state.extensions.has(extensionId)) {
|
|
216
|
-
return state
|
|
217
|
-
}
|
|
218
|
-
const newExtensions = new Map(state.extensions)
|
|
219
|
-
newExtensions.delete(extensionId)
|
|
220
|
-
|
|
221
|
-
// Also remove playwright clients bound to this extension
|
|
222
|
-
const clientsToRemove = Array.from(state.playwrightClients.values())
|
|
223
|
-
.filter((client) => client.extensionId === extensionId)
|
|
224
|
-
if (clientsToRemove.length === 0) {
|
|
225
|
-
return { ...state, extensions: newExtensions }
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
const newClients = new Map(state.playwrightClients)
|
|
229
|
-
for (const client of clientsToRemove) {
|
|
230
|
-
newClients.delete(client.id)
|
|
231
|
-
}
|
|
232
|
-
return { ...state, extensions: newExtensions, playwrightClients: newClients }
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
/** Add a playwright client (state + ws handle co-located). */
|
|
236
|
-
export function addPlaywrightClient(
|
|
237
|
-
state: RelayState,
|
|
238
|
-
{ id, extensionId, ws }: { id: string; extensionId: string | null; ws: WSContext },
|
|
239
|
-
): RelayState {
|
|
240
|
-
const newClients = new Map(state.playwrightClients)
|
|
241
|
-
newClients.set(id, { id, extensionId, ws })
|
|
242
|
-
return { ...state, playwrightClients: newClients }
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/** Remove a playwright client. */
|
|
246
|
-
export function removePlaywrightClient(state: RelayState, { clientId }: { clientId: string }): RelayState {
|
|
247
|
-
if (!state.playwrightClients.has(clientId)) {
|
|
248
|
-
return state
|
|
249
|
-
}
|
|
250
|
-
const newClients = new Map(state.playwrightClients)
|
|
251
|
-
newClients.delete(clientId)
|
|
252
|
-
return { ...state, playwrightClients: newClients }
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/** Rebind all clients from one extension id to another. */
|
|
256
|
-
export function rebindClientsToExtension(
|
|
257
|
-
state: RelayState,
|
|
258
|
-
{ fromExtensionId, toExtensionId }: { fromExtensionId: string; toExtensionId: string },
|
|
259
|
-
): RelayState {
|
|
260
|
-
if (fromExtensionId === toExtensionId) {
|
|
261
|
-
return state
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
let updated = false
|
|
265
|
-
const newClients = new Map(state.playwrightClients)
|
|
266
|
-
for (const [clientId, client] of newClients) {
|
|
267
|
-
if (client.extensionId !== fromExtensionId) {
|
|
268
|
-
continue
|
|
269
|
-
}
|
|
270
|
-
newClients.set(clientId, { ...client, extensionId: toExtensionId })
|
|
271
|
-
updated = true
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
if (!updated) {
|
|
275
|
-
return state
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
return { ...state, playwrightClients: newClients }
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
/** Update an extension entry's I/O fields (ws, pingInterval, lastPongAt). */
|
|
282
|
-
export function updateExtensionIO(
|
|
283
|
-
state: RelayState,
|
|
284
|
-
{
|
|
285
|
-
extensionId,
|
|
286
|
-
ws,
|
|
287
|
-
pingInterval,
|
|
288
|
-
lastPongAt,
|
|
289
|
-
}: {
|
|
290
|
-
extensionId: string
|
|
291
|
-
ws?: WSContext<WebSocket> | null
|
|
292
|
-
pingInterval?: ReturnType<typeof setInterval> | null
|
|
293
|
-
lastPongAt?: number | null
|
|
294
|
-
},
|
|
295
|
-
): RelayState {
|
|
296
|
-
const ext = state.extensions.get(extensionId)
|
|
297
|
-
if (!ext) {
|
|
298
|
-
return state
|
|
299
|
-
}
|
|
300
|
-
const newExtensions = new Map(state.extensions)
|
|
301
|
-
newExtensions.set(extensionId, {
|
|
302
|
-
...ext,
|
|
303
|
-
...(ws !== undefined ? { ws } : {}),
|
|
304
|
-
...(pingInterval !== undefined ? { pingInterval } : {}),
|
|
305
|
-
...(lastPongAt !== undefined ? { lastPongAt } : {}),
|
|
306
|
-
})
|
|
307
|
-
return { ...state, extensions: newExtensions }
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
/** Add or replace one pending extension request callback pair. */
|
|
311
|
-
export function addExtensionPendingRequest(
|
|
312
|
-
state: RelayState,
|
|
313
|
-
{
|
|
314
|
-
extensionId,
|
|
315
|
-
requestId,
|
|
316
|
-
pendingRequest,
|
|
317
|
-
}: {
|
|
318
|
-
extensionId: string
|
|
319
|
-
requestId: number
|
|
320
|
-
pendingRequest: ExtensionPendingRequest
|
|
321
|
-
},
|
|
322
|
-
): RelayState {
|
|
323
|
-
const ext = state.extensions.get(extensionId)
|
|
324
|
-
if (!ext) {
|
|
325
|
-
return state
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
const pendingRequests = new Map(ext.pendingRequests)
|
|
329
|
-
pendingRequests.set(requestId, pendingRequest)
|
|
330
|
-
const newExtensions = new Map(state.extensions)
|
|
331
|
-
newExtensions.set(extensionId, { ...ext, pendingRequests })
|
|
332
|
-
return { ...state, extensions: newExtensions }
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/** Remove one pending extension request callback pair. */
|
|
336
|
-
export function removeExtensionPendingRequest(
|
|
337
|
-
state: RelayState,
|
|
338
|
-
{ extensionId, requestId }: { extensionId: string; requestId: number },
|
|
339
|
-
): RelayState {
|
|
340
|
-
const ext = state.extensions.get(extensionId)
|
|
341
|
-
if (!ext || !ext.pendingRequests.has(requestId)) {
|
|
342
|
-
return state
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
const pendingRequests = new Map(ext.pendingRequests)
|
|
346
|
-
pendingRequests.delete(requestId)
|
|
347
|
-
const newExtensions = new Map(state.extensions)
|
|
348
|
-
newExtensions.set(extensionId, { ...ext, pendingRequests })
|
|
349
|
-
return { ...state, extensions: newExtensions }
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
/** Add a target to an extension's connectedTargets. No-op if extension doesn't exist. */
|
|
353
|
-
export function addTarget(
|
|
354
|
-
state: RelayState,
|
|
355
|
-
{
|
|
356
|
-
extensionId,
|
|
357
|
-
sessionId,
|
|
358
|
-
targetId,
|
|
359
|
-
targetInfo,
|
|
360
|
-
existingFrameIds,
|
|
361
|
-
}: {
|
|
362
|
-
extensionId: string
|
|
363
|
-
sessionId: string
|
|
364
|
-
targetId: string
|
|
365
|
-
targetInfo: Protocol.Target.TargetInfo
|
|
366
|
-
/** Preserve existing frameIds if target already existed (update scenario). */
|
|
367
|
-
existingFrameIds?: Set<string>
|
|
368
|
-
},
|
|
369
|
-
): RelayState {
|
|
370
|
-
const ext = state.extensions.get(extensionId)
|
|
371
|
-
if (!ext) {
|
|
372
|
-
return state
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
const existingTarget = ext.connectedTargets.get(sessionId)
|
|
376
|
-
const newTargets = new Map(ext.connectedTargets)
|
|
377
|
-
newTargets.set(sessionId, {
|
|
378
|
-
sessionId,
|
|
379
|
-
targetId,
|
|
380
|
-
targetInfo,
|
|
381
|
-
frameIds: existingFrameIds ?? existingTarget?.frameIds ?? new Set(),
|
|
382
|
-
})
|
|
383
|
-
|
|
384
|
-
const newExtensions = new Map(state.extensions)
|
|
385
|
-
newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
|
|
386
|
-
return { ...state, extensions: newExtensions }
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
/** Remove a target by sessionId. No-op if extension or target doesn't exist. */
|
|
390
|
-
export function removeTarget(
|
|
391
|
-
state: RelayState,
|
|
392
|
-
{ extensionId, sessionId }: { extensionId: string; sessionId: string },
|
|
393
|
-
): RelayState {
|
|
394
|
-
const ext = state.extensions.get(extensionId)
|
|
395
|
-
if (!ext || !ext.connectedTargets.has(sessionId)) {
|
|
396
|
-
return state
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
const newTargets = new Map(ext.connectedTargets)
|
|
400
|
-
newTargets.delete(sessionId)
|
|
401
|
-
|
|
402
|
-
const newExtensions = new Map(state.extensions)
|
|
403
|
-
newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
|
|
404
|
-
return { ...state, extensions: newExtensions }
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
/** Remove a crashed target by targetId (not sessionId). */
|
|
408
|
-
export function removeTargetByCrash(
|
|
409
|
-
state: RelayState,
|
|
410
|
-
{ extensionId, targetId }: { extensionId: string; targetId: string },
|
|
411
|
-
): RelayState {
|
|
412
|
-
const ext = state.extensions.get(extensionId)
|
|
413
|
-
if (!ext) {
|
|
414
|
-
return state
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
let found = false
|
|
418
|
-
const newTargets = new Map(ext.connectedTargets)
|
|
419
|
-
for (const [sid, target] of newTargets) {
|
|
420
|
-
if (target.targetId === targetId) {
|
|
421
|
-
newTargets.delete(sid)
|
|
422
|
-
found = true
|
|
423
|
-
break
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
if (!found) {
|
|
428
|
-
return state
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
const newExtensions = new Map(state.extensions)
|
|
432
|
-
newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
|
|
433
|
-
return { ...state, extensions: newExtensions }
|
|
434
|
-
}
|
|
435
|
-
|
|
436
|
-
/** Update targetInfo on a target matched by targetId. */
|
|
437
|
-
export function updateTargetInfo(
|
|
438
|
-
state: RelayState,
|
|
439
|
-
{ extensionId, targetInfo }: { extensionId: string; targetInfo: Protocol.Target.TargetInfo },
|
|
440
|
-
): RelayState {
|
|
441
|
-
const ext = state.extensions.get(extensionId)
|
|
442
|
-
if (!ext) {
|
|
443
|
-
return state
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
let updated = false
|
|
447
|
-
const newTargets = new Map(ext.connectedTargets)
|
|
448
|
-
for (const [sid, target] of newTargets) {
|
|
449
|
-
if (target.targetId === targetInfo.targetId) {
|
|
450
|
-
newTargets.set(sid, { ...target, targetInfo })
|
|
451
|
-
updated = true
|
|
452
|
-
break
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
if (!updated) {
|
|
457
|
-
return state
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
const newExtensions = new Map(state.extensions)
|
|
461
|
-
newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
|
|
462
|
-
return { ...state, extensions: newExtensions }
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
/** Add a frameId to a target's frameIds set. */
|
|
466
|
-
export function addFrameId(
|
|
467
|
-
state: RelayState,
|
|
468
|
-
{ extensionId, sessionId, frameId }: { extensionId: string; sessionId: string; frameId: string },
|
|
469
|
-
): RelayState {
|
|
470
|
-
const ext = state.extensions.get(extensionId)
|
|
471
|
-
if (!ext) {
|
|
472
|
-
return state
|
|
473
|
-
}
|
|
474
|
-
const target = ext.connectedTargets.get(sessionId)
|
|
475
|
-
if (!target) {
|
|
476
|
-
return state
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
// Already present — no-op
|
|
480
|
-
if (target.frameIds.has(frameId)) {
|
|
481
|
-
return state
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
const newFrameIds = new Set(target.frameIds)
|
|
485
|
-
newFrameIds.add(frameId)
|
|
486
|
-
|
|
487
|
-
const newTargets = new Map(ext.connectedTargets)
|
|
488
|
-
newTargets.set(sessionId, { ...target, frameIds: newFrameIds })
|
|
489
|
-
|
|
490
|
-
const newExtensions = new Map(state.extensions)
|
|
491
|
-
newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
|
|
492
|
-
return { ...state, extensions: newExtensions }
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
/** Remove a frameId from the target that owns it (scans all targets in the extension). */
|
|
496
|
-
export function removeFrameId(
|
|
497
|
-
state: RelayState,
|
|
498
|
-
{ extensionId, frameId }: { extensionId: string; frameId: string },
|
|
499
|
-
): RelayState {
|
|
500
|
-
const ext = state.extensions.get(extensionId)
|
|
501
|
-
if (!ext) {
|
|
502
|
-
return state
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
for (const [sid, target] of ext.connectedTargets) {
|
|
506
|
-
if (target.frameIds.has(frameId)) {
|
|
507
|
-
const newFrameIds = new Set(target.frameIds)
|
|
508
|
-
newFrameIds.delete(frameId)
|
|
509
|
-
|
|
510
|
-
const newTargets = new Map(ext.connectedTargets)
|
|
511
|
-
newTargets.set(sid, { ...target, frameIds: newFrameIds })
|
|
512
|
-
|
|
513
|
-
const newExtensions = new Map(state.extensions)
|
|
514
|
-
newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
|
|
515
|
-
return { ...state, extensions: newExtensions }
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
return state
|
|
520
|
-
}
|
|
521
|
-
|
|
522
|
-
/**
|
|
523
|
-
* Update URL (and optionally title) on a target.
|
|
524
|
-
* Used by Page.frameNavigated (top-level) and Page.navigatedWithinDocument.
|
|
525
|
-
*/
|
|
526
|
-
export function updateTargetUrl(
|
|
527
|
-
state: RelayState,
|
|
528
|
-
{
|
|
529
|
-
extensionId,
|
|
530
|
-
sessionId,
|
|
531
|
-
url,
|
|
532
|
-
title,
|
|
533
|
-
}: {
|
|
534
|
-
extensionId: string
|
|
535
|
-
sessionId: string
|
|
536
|
-
url: string
|
|
537
|
-
title?: string
|
|
538
|
-
},
|
|
539
|
-
): RelayState {
|
|
540
|
-
const ext = state.extensions.get(extensionId)
|
|
541
|
-
if (!ext) {
|
|
542
|
-
return state
|
|
543
|
-
}
|
|
544
|
-
const target = ext.connectedTargets.get(sessionId)
|
|
545
|
-
if (!target) {
|
|
546
|
-
return state
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
const newTargetInfo = {
|
|
550
|
-
...target.targetInfo,
|
|
551
|
-
url,
|
|
552
|
-
...(title !== undefined ? { title } : {}),
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
const newTargets = new Map(ext.connectedTargets)
|
|
556
|
-
newTargets.set(sessionId, { ...target, targetInfo: newTargetInfo })
|
|
557
|
-
|
|
558
|
-
const newExtensions = new Map(state.extensions)
|
|
559
|
-
newExtensions.set(extensionId, { ...ext, connectedTargets: newTargets })
|
|
560
|
-
return { ...state, extensions: newExtensions }
|
|
561
|
-
}
|