agent-web-interface 4.0.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 +226 -0
- package/dist/src/browser/ensure-browser.d.ts +39 -0
- package/dist/src/browser/ensure-browser.d.ts.map +1 -0
- package/dist/src/browser/ensure-browser.js +65 -0
- package/dist/src/browser/ensure-browser.js.map +1 -0
- package/dist/src/browser/index.d.ts +8 -0
- package/dist/src/browser/index.d.ts.map +1 -0
- package/dist/src/browser/index.js +8 -0
- package/dist/src/browser/index.js.map +1 -0
- package/dist/src/browser/page-network-tracker.d.ts +96 -0
- package/dist/src/browser/page-network-tracker.d.ts.map +1 -0
- package/dist/src/browser/page-network-tracker.js +235 -0
- package/dist/src/browser/page-network-tracker.js.map +1 -0
- package/dist/src/browser/page-registry.d.ts +137 -0
- package/dist/src/browser/page-registry.d.ts.map +1 -0
- package/dist/src/browser/page-registry.js +194 -0
- package/dist/src/browser/page-registry.js.map +1 -0
- package/dist/src/browser/page-stabilization.d.ts +35 -0
- package/dist/src/browser/page-stabilization.d.ts.map +1 -0
- package/dist/src/browser/page-stabilization.js +42 -0
- package/dist/src/browser/page-stabilization.js.map +1 -0
- package/dist/src/browser/session-manager.d.ts +336 -0
- package/dist/src/browser/session-manager.d.ts.map +1 -0
- package/dist/src/browser/session-manager.js +964 -0
- package/dist/src/browser/session-manager.js.map +1 -0
- package/dist/src/cdp/cdp-client.interface.d.ts +193 -0
- package/dist/src/cdp/cdp-client.interface.d.ts.map +1 -0
- package/dist/src/cdp/cdp-client.interface.js +9 -0
- package/dist/src/cdp/cdp-client.interface.js.map +1 -0
- package/dist/src/cdp/index.d.ts +9 -0
- package/dist/src/cdp/index.d.ts.map +1 -0
- package/dist/src/cdp/index.js +8 -0
- package/dist/src/cdp/index.js.map +1 -0
- package/dist/src/cdp/puppeteer-cdp-client.d.ts +97 -0
- package/dist/src/cdp/puppeteer-cdp-client.d.ts.map +1 -0
- package/dist/src/cdp/puppeteer-cdp-client.js +273 -0
- package/dist/src/cdp/puppeteer-cdp-client.js.map +1 -0
- package/dist/src/cli/args.d.ts +35 -0
- package/dist/src/cli/args.d.ts.map +1 -0
- package/dist/src/cli/args.js +76 -0
- package/dist/src/cli/args.js.map +1 -0
- package/dist/src/delta/dom-stabilizer.d.ts +46 -0
- package/dist/src/delta/dom-stabilizer.d.ts.map +1 -0
- package/dist/src/delta/dom-stabilizer.js +121 -0
- package/dist/src/delta/dom-stabilizer.js.map +1 -0
- package/dist/src/delta/index.d.ts +8 -0
- package/dist/src/delta/index.d.ts.map +1 -0
- package/dist/src/delta/index.js +7 -0
- package/dist/src/delta/index.js.map +1 -0
- package/dist/src/factpack/action-selector.d.ts +36 -0
- package/dist/src/factpack/action-selector.d.ts.map +1 -0
- package/dist/src/factpack/action-selector.js +367 -0
- package/dist/src/factpack/action-selector.js.map +1 -0
- package/dist/src/factpack/dialog-detector.d.ts +19 -0
- package/dist/src/factpack/dialog-detector.d.ts.map +1 -0
- package/dist/src/factpack/dialog-detector.js +354 -0
- package/dist/src/factpack/dialog-detector.js.map +1 -0
- package/dist/src/factpack/form-detector.d.ts +28 -0
- package/dist/src/factpack/form-detector.d.ts.map +1 -0
- package/dist/src/factpack/form-detector.js +555 -0
- package/dist/src/factpack/form-detector.js.map +1 -0
- package/dist/src/factpack/index.d.ts +32 -0
- package/dist/src/factpack/index.d.ts.map +1 -0
- package/dist/src/factpack/index.js +73 -0
- package/dist/src/factpack/index.js.map +1 -0
- package/dist/src/factpack/page-classifier.d.ts +22 -0
- package/dist/src/factpack/page-classifier.d.ts.map +1 -0
- package/dist/src/factpack/page-classifier.js +526 -0
- package/dist/src/factpack/page-classifier.js.map +1 -0
- package/dist/src/factpack/types.d.ts +307 -0
- package/dist/src/factpack/types.d.ts.map +1 -0
- package/dist/src/factpack/types.js +12 -0
- package/dist/src/factpack/types.js.map +1 -0
- package/dist/src/form/dependency-tracker.d.ts +108 -0
- package/dist/src/form/dependency-tracker.d.ts.map +1 -0
- package/dist/src/form/dependency-tracker.js +298 -0
- package/dist/src/form/dependency-tracker.js.map +1 -0
- package/dist/src/form/field-extractor.d.ts +32 -0
- package/dist/src/form/field-extractor.d.ts.map +1 -0
- package/dist/src/form/field-extractor.js +544 -0
- package/dist/src/form/field-extractor.js.map +1 -0
- package/dist/src/form/form-detector.d.ts +103 -0
- package/dist/src/form/form-detector.d.ts.map +1 -0
- package/dist/src/form/form-detector.js +704 -0
- package/dist/src/form/form-detector.js.map +1 -0
- package/dist/src/form/form-state.d.ts +23 -0
- package/dist/src/form/form-state.d.ts.map +1 -0
- package/dist/src/form/form-state.js +39 -0
- package/dist/src/form/form-state.js.map +1 -0
- package/dist/src/form/index.d.ts +23 -0
- package/dist/src/form/index.d.ts.map +1 -0
- package/dist/src/form/index.js +27 -0
- package/dist/src/form/index.js.map +1 -0
- package/dist/src/form/runtime-value-reader.d.ts +72 -0
- package/dist/src/form/runtime-value-reader.d.ts.map +1 -0
- package/dist/src/form/runtime-value-reader.js +232 -0
- package/dist/src/form/runtime-value-reader.js.map +1 -0
- package/dist/src/form/types.d.ts +384 -0
- package/dist/src/form/types.d.ts.map +1 -0
- package/dist/src/form/types.js +17 -0
- package/dist/src/form/types.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +212 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/constants.d.ts +27 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +63 -0
- package/dist/src/lib/constants.js.map +1 -0
- package/dist/src/lib/index.d.ts +12 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +17 -0
- package/dist/src/lib/index.js.map +1 -0
- package/dist/src/lib/regions.d.ts +29 -0
- package/dist/src/lib/regions.d.ts.map +1 -0
- package/dist/src/lib/regions.js +93 -0
- package/dist/src/lib/regions.js.map +1 -0
- package/dist/src/lib/scoring.d.ts +47 -0
- package/dist/src/lib/scoring.d.ts.map +1 -0
- package/dist/src/lib/scoring.js +79 -0
- package/dist/src/lib/scoring.js.map +1 -0
- package/dist/src/lib/selectors.d.ts +42 -0
- package/dist/src/lib/selectors.d.ts.map +1 -0
- package/dist/src/lib/selectors.js +138 -0
- package/dist/src/lib/selectors.js.map +1 -0
- package/dist/src/lib/text-utils.d.ts +155 -0
- package/dist/src/lib/text-utils.d.ts.map +1 -0
- package/dist/src/lib/text-utils.js +391 -0
- package/dist/src/lib/text-utils.js.map +1 -0
- package/dist/src/observation/eid-linker.d.ts +104 -0
- package/dist/src/observation/eid-linker.d.ts.map +1 -0
- package/dist/src/observation/eid-linker.js +403 -0
- package/dist/src/observation/eid-linker.js.map +1 -0
- package/dist/src/observation/index.d.ts +12 -0
- package/dist/src/observation/index.d.ts.map +1 -0
- package/dist/src/observation/index.js +15 -0
- package/dist/src/observation/index.js.map +1 -0
- package/dist/src/observation/observation-accumulator.d.ts +58 -0
- package/dist/src/observation/observation-accumulator.d.ts.map +1 -0
- package/dist/src/observation/observation-accumulator.js +213 -0
- package/dist/src/observation/observation-accumulator.js.map +1 -0
- package/dist/src/observation/observation.types.d.ts +139 -0
- package/dist/src/observation/observation.types.d.ts.map +1 -0
- package/dist/src/observation/observation.types.js +59 -0
- package/dist/src/observation/observation.types.js.map +1 -0
- package/dist/src/observation/observer-script.d.ts +19 -0
- package/dist/src/observation/observer-script.d.ts.map +1 -0
- package/dist/src/observation/observer-script.js +569 -0
- package/dist/src/observation/observer-script.js.map +1 -0
- package/dist/src/query/index.d.ts +9 -0
- package/dist/src/query/index.d.ts.map +1 -0
- package/dist/src/query/index.js +10 -0
- package/dist/src/query/index.js.map +1 -0
- package/dist/src/query/query-engine.d.ts +111 -0
- package/dist/src/query/query-engine.d.ts.map +1 -0
- package/dist/src/query/query-engine.js +509 -0
- package/dist/src/query/query-engine.js.map +1 -0
- package/dist/src/query/types/index.d.ts +5 -0
- package/dist/src/query/types/index.d.ts.map +1 -0
- package/dist/src/query/types/index.js +5 -0
- package/dist/src/query/types/index.js.map +1 -0
- package/dist/src/query/types/query.types.d.ts +141 -0
- package/dist/src/query/types/query.types.d.ts.map +1 -0
- package/dist/src/query/types/query.types.js +19 -0
- package/dist/src/query/types/query.types.js.map +1 -0
- package/dist/src/renderer/budget-manager.d.ts +46 -0
- package/dist/src/renderer/budget-manager.d.ts.map +1 -0
- package/dist/src/renderer/budget-manager.js +133 -0
- package/dist/src/renderer/budget-manager.js.map +1 -0
- package/dist/src/renderer/constants.d.ts +38 -0
- package/dist/src/renderer/constants.d.ts.map +1 -0
- package/dist/src/renderer/constants.js +29 -0
- package/dist/src/renderer/constants.js.map +1 -0
- package/dist/src/renderer/index.d.ts +12 -0
- package/dist/src/renderer/index.d.ts.map +1 -0
- package/dist/src/renderer/index.js +16 -0
- package/dist/src/renderer/index.js.map +1 -0
- package/dist/src/renderer/section-renderers.d.ts +42 -0
- package/dist/src/renderer/section-renderers.d.ts.map +1 -0
- package/dist/src/renderer/section-renderers.js +252 -0
- package/dist/src/renderer/section-renderers.js.map +1 -0
- package/dist/src/renderer/token-counter.d.ts +45 -0
- package/dist/src/renderer/token-counter.d.ts.map +1 -0
- package/dist/src/renderer/token-counter.js +65 -0
- package/dist/src/renderer/token-counter.js.map +1 -0
- package/dist/src/renderer/types.d.ts +71 -0
- package/dist/src/renderer/types.d.ts.map +1 -0
- package/dist/src/renderer/types.js +7 -0
- package/dist/src/renderer/types.js.map +1 -0
- package/dist/src/renderer/xml-renderer.d.ts +42 -0
- package/dist/src/renderer/xml-renderer.d.ts.map +1 -0
- package/dist/src/renderer/xml-renderer.js +103 -0
- package/dist/src/renderer/xml-renderer.js.map +1 -0
- package/dist/src/server/index.d.ts +8 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +8 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/server/mcp-server.d.ts +59 -0
- package/dist/src/server/mcp-server.d.ts.map +1 -0
- package/dist/src/server/mcp-server.js +140 -0
- package/dist/src/server/mcp-server.js.map +1 -0
- package/dist/src/server/server-config.d.ts +41 -0
- package/dist/src/server/server-config.d.ts.map +1 -0
- package/dist/src/server/server-config.js +80 -0
- package/dist/src/server/server-config.js.map +1 -0
- package/dist/src/server/session-store.d.ts +148 -0
- package/dist/src/server/session-store.d.ts.map +1 -0
- package/dist/src/server/session-store.js +224 -0
- package/dist/src/server/session-store.js.map +1 -0
- package/dist/src/shared/errors/browser-session.error.d.ts +102 -0
- package/dist/src/shared/errors/browser-session.error.d.ts.map +1 -0
- package/dist/src/shared/errors/browser-session.error.js +153 -0
- package/dist/src/shared/errors/browser-session.error.js.map +1 -0
- package/dist/src/shared/errors/index.d.ts +5 -0
- package/dist/src/shared/errors/index.d.ts.map +1 -0
- package/dist/src/shared/errors/index.js +5 -0
- package/dist/src/shared/errors/index.js.map +1 -0
- package/dist/src/shared/services/dom-transformer.service.d.ts +71 -0
- package/dist/src/shared/services/dom-transformer.service.d.ts.map +1 -0
- package/dist/src/shared/services/dom-transformer.service.js +190 -0
- package/dist/src/shared/services/dom-transformer.service.js.map +1 -0
- package/dist/src/shared/services/index.d.ts +7 -0
- package/dist/src/shared/services/index.d.ts.map +1 -0
- package/dist/src/shared/services/index.js +7 -0
- package/dist/src/shared/services/index.js.map +1 -0
- package/dist/src/shared/services/logging.service.d.ts +154 -0
- package/dist/src/shared/services/logging.service.d.ts.map +1 -0
- package/dist/src/shared/services/logging.service.js +267 -0
- package/dist/src/shared/services/logging.service.js.map +1 -0
- package/dist/src/shared/services/selector-builder.service.d.ts +53 -0
- package/dist/src/shared/services/selector-builder.service.d.ts.map +1 -0
- package/dist/src/shared/services/selector-builder.service.js +240 -0
- package/dist/src/shared/services/selector-builder.service.js.map +1 -0
- package/dist/src/shared/types/base.types.d.ts +45 -0
- package/dist/src/shared/types/base.types.d.ts.map +1 -0
- package/dist/src/shared/types/base.types.js +8 -0
- package/dist/src/shared/types/base.types.js.map +1 -0
- package/dist/src/shared/types/index.d.ts +5 -0
- package/dist/src/shared/types/index.d.ts.map +1 -0
- package/dist/src/shared/types/index.js +5 -0
- package/dist/src/shared/types/index.js.map +1 -0
- package/dist/src/snapshot/element-resolver.d.ts +102 -0
- package/dist/src/snapshot/element-resolver.d.ts.map +1 -0
- package/dist/src/snapshot/element-resolver.js +379 -0
- package/dist/src/snapshot/element-resolver.js.map +1 -0
- package/dist/src/snapshot/extractors/attribute-extractor.d.ts +40 -0
- package/dist/src/snapshot/extractors/attribute-extractor.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/attribute-extractor.js +237 -0
- package/dist/src/snapshot/extractors/attribute-extractor.js.map +1 -0
- package/dist/src/snapshot/extractors/ax-extractor.d.ts +36 -0
- package/dist/src/snapshot/extractors/ax-extractor.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/ax-extractor.js +144 -0
- package/dist/src/snapshot/extractors/ax-extractor.js.map +1 -0
- package/dist/src/snapshot/extractors/dom-extractor.d.ts +21 -0
- package/dist/src/snapshot/extractors/dom-extractor.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/dom-extractor.js +137 -0
- package/dist/src/snapshot/extractors/dom-extractor.js.map +1 -0
- package/dist/src/snapshot/extractors/grouping-resolver.d.ts +39 -0
- package/dist/src/snapshot/extractors/grouping-resolver.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/grouping-resolver.js +260 -0
- package/dist/src/snapshot/extractors/grouping-resolver.js.map +1 -0
- package/dist/src/snapshot/extractors/index.d.ts +19 -0
- package/dist/src/snapshot/extractors/index.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/index.js +27 -0
- package/dist/src/snapshot/extractors/index.js.map +1 -0
- package/dist/src/snapshot/extractors/label-resolver.d.ts +44 -0
- package/dist/src/snapshot/extractors/label-resolver.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/label-resolver.js +173 -0
- package/dist/src/snapshot/extractors/label-resolver.js.map +1 -0
- package/dist/src/snapshot/extractors/layout-extractor.d.ts +52 -0
- package/dist/src/snapshot/extractors/layout-extractor.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/layout-extractor.js +382 -0
- package/dist/src/snapshot/extractors/layout-extractor.js.map +1 -0
- package/dist/src/snapshot/extractors/locator-builder.d.ts +27 -0
- package/dist/src/snapshot/extractors/locator-builder.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/locator-builder.js +223 -0
- package/dist/src/snapshot/extractors/locator-builder.js.map +1 -0
- package/dist/src/snapshot/extractors/region-resolver.d.ts +31 -0
- package/dist/src/snapshot/extractors/region-resolver.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/region-resolver.js +168 -0
- package/dist/src/snapshot/extractors/region-resolver.js.map +1 -0
- package/dist/src/snapshot/extractors/state-extractor.d.ts +30 -0
- package/dist/src/snapshot/extractors/state-extractor.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/state-extractor.js +181 -0
- package/dist/src/snapshot/extractors/state-extractor.js.map +1 -0
- package/dist/src/snapshot/extractors/types.d.ts +213 -0
- package/dist/src/snapshot/extractors/types.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/types.js +145 -0
- package/dist/src/snapshot/extractors/types.js.map +1 -0
- package/dist/src/snapshot/index.d.ts +14 -0
- package/dist/src/snapshot/index.d.ts.map +1 -0
- package/dist/src/snapshot/index.js +18 -0
- package/dist/src/snapshot/index.js.map +1 -0
- package/dist/src/snapshot/snapshot-compiler.d.ts +73 -0
- package/dist/src/snapshot/snapshot-compiler.d.ts.map +1 -0
- package/dist/src/snapshot/snapshot-compiler.js +763 -0
- package/dist/src/snapshot/snapshot-compiler.js.map +1 -0
- package/dist/src/snapshot/snapshot-health.d.ts +97 -0
- package/dist/src/snapshot/snapshot-health.d.ts.map +1 -0
- package/dist/src/snapshot/snapshot-health.js +214 -0
- package/dist/src/snapshot/snapshot-health.js.map +1 -0
- package/dist/src/snapshot/snapshot-store.d.ts +137 -0
- package/dist/src/snapshot/snapshot-store.d.ts.map +1 -0
- package/dist/src/snapshot/snapshot-store.js +202 -0
- package/dist/src/snapshot/snapshot-store.js.map +1 -0
- package/dist/src/snapshot/snapshot.types.d.ts +250 -0
- package/dist/src/snapshot/snapshot.types.d.ts.map +1 -0
- package/dist/src/snapshot/snapshot.types.js +54 -0
- package/dist/src/snapshot/snapshot.types.js.map +1 -0
- package/dist/src/state/actionables-filter.d.ts +47 -0
- package/dist/src/state/actionables-filter.d.ts.map +1 -0
- package/dist/src/state/actionables-filter.js +173 -0
- package/dist/src/state/actionables-filter.js.map +1 -0
- package/dist/src/state/atoms-extractor.d.ts +23 -0
- package/dist/src/state/atoms-extractor.d.ts.map +1 -0
- package/dist/src/state/atoms-extractor.js +160 -0
- package/dist/src/state/atoms-extractor.js.map +1 -0
- package/dist/src/state/constants.d.ts +125 -0
- package/dist/src/state/constants.d.ts.map +1 -0
- package/dist/src/state/constants.js +131 -0
- package/dist/src/state/constants.js.map +1 -0
- package/dist/src/state/diff-engine.d.ts +23 -0
- package/dist/src/state/diff-engine.d.ts.map +1 -0
- package/dist/src/state/diff-engine.js +475 -0
- package/dist/src/state/diff-engine.js.map +1 -0
- package/dist/src/state/element-identity.d.ts +75 -0
- package/dist/src/state/element-identity.d.ts.map +1 -0
- package/dist/src/state/element-identity.js +129 -0
- package/dist/src/state/element-identity.js.map +1 -0
- package/dist/src/state/element-ref.types.d.ts +135 -0
- package/dist/src/state/element-ref.types.d.ts.map +1 -0
- package/dist/src/state/element-ref.types.js +13 -0
- package/dist/src/state/element-ref.types.js.map +1 -0
- package/dist/src/state/element-registry.d.ts +118 -0
- package/dist/src/state/element-registry.d.ts.map +1 -0
- package/dist/src/state/element-registry.js +222 -0
- package/dist/src/state/element-registry.js.map +1 -0
- package/dist/src/state/health.types.d.ts +93 -0
- package/dist/src/state/health.types.d.ts.map +1 -0
- package/dist/src/state/health.types.js +56 -0
- package/dist/src/state/health.types.js.map +1 -0
- package/dist/src/state/layer-detector.d.ts +23 -0
- package/dist/src/state/layer-detector.d.ts.map +1 -0
- package/dist/src/state/layer-detector.js +368 -0
- package/dist/src/state/layer-detector.js.map +1 -0
- package/dist/src/state/locator-generator.d.ts +21 -0
- package/dist/src/state/locator-generator.d.ts.map +1 -0
- package/dist/src/state/locator-generator.js +137 -0
- package/dist/src/state/locator-generator.js.map +1 -0
- package/dist/src/state/state-manager.d.ts +104 -0
- package/dist/src/state/state-manager.d.ts.map +1 -0
- package/dist/src/state/state-manager.js +618 -0
- package/dist/src/state/state-manager.js.map +1 -0
- package/dist/src/state/state-renderer.d.ts +63 -0
- package/dist/src/state/state-renderer.d.ts.map +1 -0
- package/dist/src/state/state-renderer.js +340 -0
- package/dist/src/state/state-renderer.js.map +1 -0
- package/dist/src/state/types.d.ts +353 -0
- package/dist/src/state/types.d.ts.map +1 -0
- package/dist/src/state/types.js +8 -0
- package/dist/src/state/types.js.map +1 -0
- package/dist/src/tools/browser-tools.d.ts +140 -0
- package/dist/src/tools/browser-tools.d.ts.map +1 -0
- package/dist/src/tools/browser-tools.js +657 -0
- package/dist/src/tools/browser-tools.js.map +1 -0
- package/dist/src/tools/errors.d.ts +63 -0
- package/dist/src/tools/errors.d.ts.map +1 -0
- package/dist/src/tools/errors.js +86 -0
- package/dist/src/tools/errors.js.map +1 -0
- package/dist/src/tools/execute-action.d.ts +135 -0
- package/dist/src/tools/execute-action.d.ts.map +1 -0
- package/dist/src/tools/execute-action.js +579 -0
- package/dist/src/tools/execute-action.js.map +1 -0
- package/dist/src/tools/form-tools.d.ts +109 -0
- package/dist/src/tools/form-tools.d.ts.map +1 -0
- package/dist/src/tools/form-tools.js +434 -0
- package/dist/src/tools/form-tools.js.map +1 -0
- package/dist/src/tools/index.d.ts +11 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +49 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/response-builder.d.ts +98 -0
- package/dist/src/tools/response-builder.d.ts.map +1 -0
- package/dist/src/tools/response-builder.js +219 -0
- package/dist/src/tools/response-builder.js.map +1 -0
- package/dist/src/tools/tool-schemas.d.ts +2482 -0
- package/dist/src/tools/tool-schemas.d.ts.map +1 -0
- package/dist/src/tools/tool-schemas.js +606 -0
- package/dist/src/tools/tool-schemas.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +16 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,579 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute Action
|
|
3
|
+
*
|
|
4
|
+
* Action execution wrapper with StateManager integration.
|
|
5
|
+
* Captures snapshot and generates StateHandle + Diff + Actionables response.
|
|
6
|
+
* Includes automatic retry logic for stale element errors.
|
|
7
|
+
*
|
|
8
|
+
* Navigation-aware click outcome model for better error classification.
|
|
9
|
+
*/
|
|
10
|
+
import { compileSnapshot } from '../snapshot/index.js';
|
|
11
|
+
import { stabilizeDom } from '../delta/dom-stabilizer.js';
|
|
12
|
+
import { StateManager } from '../state/state-manager.js';
|
|
13
|
+
import { createHealthyRuntime } from '../state/health.types.js';
|
|
14
|
+
import { observationAccumulator } from '../observation/index.js';
|
|
15
|
+
import { ATTACHMENT_SIGNIFICANCE_THRESHOLD } from '../observation/observation.types.js';
|
|
16
|
+
import { waitForNetworkQuiet, ACTION_NETWORK_IDLE_TIMEOUT_MS, NAVIGATION_NETWORK_IDLE_TIMEOUT_MS, } from '../browser/page-stabilization.js';
|
|
17
|
+
import { getDependencyTracker, createObservedEffect } from '../form/index.js';
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// State Manager Registry
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Global registry of state managers (one per page).
|
|
23
|
+
*/
|
|
24
|
+
const stateManagers = new Map();
|
|
25
|
+
/**
|
|
26
|
+
* Get or create state manager for a page.
|
|
27
|
+
*
|
|
28
|
+
* @param pageId - Page ID
|
|
29
|
+
* @returns State manager instance
|
|
30
|
+
*/
|
|
31
|
+
export function getStateManager(pageId) {
|
|
32
|
+
if (!stateManagers.has(pageId)) {
|
|
33
|
+
stateManagers.set(pageId, new StateManager({ pageId }));
|
|
34
|
+
}
|
|
35
|
+
return stateManagers.get(pageId);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Remove state manager for a page (call on page close).
|
|
39
|
+
*
|
|
40
|
+
* @param pageId - Page ID
|
|
41
|
+
*/
|
|
42
|
+
export function removeStateManager(pageId) {
|
|
43
|
+
stateManagers.delete(pageId);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Clear all state managers (call on session close).
|
|
47
|
+
*/
|
|
48
|
+
export function clearAllStateManagers() {
|
|
49
|
+
stateManagers.clear();
|
|
50
|
+
}
|
|
51
|
+
// ============================================================================
|
|
52
|
+
// Dependency Tracking Helpers
|
|
53
|
+
// ============================================================================
|
|
54
|
+
/**
|
|
55
|
+
* Compute an ObservedEffect by comparing snapshots before and after an action.
|
|
56
|
+
*
|
|
57
|
+
* This function analyzes differences between two snapshots to determine:
|
|
58
|
+
* - Which elements became enabled/disabled
|
|
59
|
+
* - Which elements appeared/disappeared
|
|
60
|
+
* - Which elements had their values change
|
|
61
|
+
*
|
|
62
|
+
* @param triggerEid - EID of the element that triggered the action
|
|
63
|
+
* @param actionType - Type of action performed
|
|
64
|
+
* @param prevSnapshot - Snapshot before the action (null if first action)
|
|
65
|
+
* @param currSnapshot - Snapshot after the action
|
|
66
|
+
* @returns ObservedEffect if meaningful changes detected, null otherwise
|
|
67
|
+
*/
|
|
68
|
+
function computeObservedEffect(triggerEid, actionType, prevSnapshot, currSnapshot) {
|
|
69
|
+
// Skip if no previous snapshot to compare
|
|
70
|
+
if (!prevSnapshot) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
// Build maps of enabled/visible states
|
|
74
|
+
const beforeEids = new Map();
|
|
75
|
+
const beforeVisible = new Set();
|
|
76
|
+
const beforeValues = new Map();
|
|
77
|
+
for (const node of prevSnapshot.nodes) {
|
|
78
|
+
beforeEids.set(node.node_id, node.state?.enabled ?? true);
|
|
79
|
+
if (node.state?.visible) {
|
|
80
|
+
beforeVisible.add(node.node_id);
|
|
81
|
+
}
|
|
82
|
+
if (node.attributes?.value !== undefined) {
|
|
83
|
+
beforeValues.set(node.node_id, node.attributes.value);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const afterEids = new Map();
|
|
87
|
+
const afterVisible = new Set();
|
|
88
|
+
const valueChanges = [];
|
|
89
|
+
for (const node of currSnapshot.nodes) {
|
|
90
|
+
afterEids.set(node.node_id, node.state?.enabled ?? true);
|
|
91
|
+
if (node.state?.visible) {
|
|
92
|
+
afterVisible.add(node.node_id);
|
|
93
|
+
}
|
|
94
|
+
// Detect value changes
|
|
95
|
+
const prevValue = beforeValues.get(node.node_id);
|
|
96
|
+
const currValue = node.attributes?.value;
|
|
97
|
+
if (currValue !== undefined && currValue !== prevValue) {
|
|
98
|
+
// Skip if this is the trigger element itself (self-change from typing)
|
|
99
|
+
if (node.node_id !== triggerEid) {
|
|
100
|
+
valueChanges.push(node.node_id);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
// Create the observed effect
|
|
105
|
+
const effect = createObservedEffect(triggerEid, actionType, beforeEids, afterEids, beforeVisible, afterVisible, valueChanges);
|
|
106
|
+
// Only return if there are meaningful changes
|
|
107
|
+
const hasChanges = effect.enabled.length > 0 ||
|
|
108
|
+
effect.disabled.length > 0 ||
|
|
109
|
+
effect.appeared.length > 0 ||
|
|
110
|
+
effect.disappeared.length > 0 ||
|
|
111
|
+
effect.value_changed.length > 0;
|
|
112
|
+
return hasChanges ? effect : null;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Check if an error is a stale element error.
|
|
116
|
+
*/
|
|
117
|
+
function isStaleElementError(err) {
|
|
118
|
+
if (!(err instanceof Error))
|
|
119
|
+
return false;
|
|
120
|
+
const message = err.message.toLowerCase();
|
|
121
|
+
return (message.includes('no node found for given backend id') ||
|
|
122
|
+
message.includes('protocol error (dom.scrollintoviewifneeded)') ||
|
|
123
|
+
message.includes('node is detached from document') ||
|
|
124
|
+
message.includes('node has been deleted'));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Capture snapshot without recovery (fallback path).
|
|
128
|
+
*/
|
|
129
|
+
async function captureSnapshotFallback(handle) {
|
|
130
|
+
const snapshot = await compileSnapshot(handle.cdp, handle.page, handle.page_id);
|
|
131
|
+
return { snapshot, runtime_health: createHealthyRuntime() };
|
|
132
|
+
}
|
|
133
|
+
// ============================================================================
|
|
134
|
+
// Navigation-Aware Stabilization
|
|
135
|
+
// ============================================================================
|
|
136
|
+
/**
|
|
137
|
+
* Stabilize page after an action using tiered waiting strategy.
|
|
138
|
+
*
|
|
139
|
+
* This addresses the core issue: actions may trigger API calls that complete
|
|
140
|
+
* after DOM mutations settle. The tiered approach:
|
|
141
|
+
*
|
|
142
|
+
* 1. Wait for DOM to stabilize (MutationObserver) - catches SPA rendering
|
|
143
|
+
* 2. Wait for network to quiet down (networkidle) - catches pending API calls
|
|
144
|
+
* 3. If DOM stabilization fails (navigation), fall back to network idle wait
|
|
145
|
+
*
|
|
146
|
+
* Timeouts are generous but never throw - we proceed even if network stays busy
|
|
147
|
+
* (common with analytics, long-polling, websockets).
|
|
148
|
+
*
|
|
149
|
+
* @param page - Puppeteer Page instance
|
|
150
|
+
* @param networkTimeoutMs - Optional custom timeout for network idle (default: 3000ms)
|
|
151
|
+
* @returns Stabilization result with status
|
|
152
|
+
*/
|
|
153
|
+
async function stabilizeAfterAction(page, networkTimeoutMs = ACTION_NETWORK_IDLE_TIMEOUT_MS) {
|
|
154
|
+
// Step 1: Try MutationObserver-based DOM stabilization first
|
|
155
|
+
const result = await stabilizeDom(page);
|
|
156
|
+
// Step 2: Handle based on DOM stabilization result
|
|
157
|
+
if (result.status === 'stable' || result.status === 'timeout') {
|
|
158
|
+
// DOM settled (or timed out) - now wait for network to quiet down
|
|
159
|
+
// This catches API calls that haven't rendered to DOM yet
|
|
160
|
+
const networkIdle = await waitForNetworkQuiet(page, networkTimeoutMs);
|
|
161
|
+
if (!networkIdle && result.status === 'stable') {
|
|
162
|
+
// DOM was stable but network didn't idle - add a note
|
|
163
|
+
return {
|
|
164
|
+
...result,
|
|
165
|
+
warning: result.warning ?? 'Network did not reach idle state within timeout',
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
// status === 'error' means page.evaluate() failed, likely due to navigation
|
|
171
|
+
// Fall back to waiting for network idle on the new page
|
|
172
|
+
try {
|
|
173
|
+
// Wait for network to settle on the new page
|
|
174
|
+
await waitForNetworkQuiet(page, networkTimeoutMs);
|
|
175
|
+
return {
|
|
176
|
+
status: 'stable',
|
|
177
|
+
waitTimeMs: result.waitTimeMs,
|
|
178
|
+
warning: 'Navigation detected; waited for networkidle',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
catch (waitError) {
|
|
182
|
+
// If network wait also fails, the page might be in an unusual state
|
|
183
|
+
// Return the original error but with additional context
|
|
184
|
+
const message = waitError instanceof Error ? waitError.message : String(waitError);
|
|
185
|
+
return {
|
|
186
|
+
status: 'error',
|
|
187
|
+
waitTimeMs: result.waitTimeMs,
|
|
188
|
+
warning: `${result.warning}. Fallback network wait also failed: ${message}`,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Stabilize page after explicit navigation (goto, back, forward, reload).
|
|
194
|
+
*
|
|
195
|
+
* Uses a longer network timeout since navigations typically trigger more
|
|
196
|
+
* requests than in-page actions.
|
|
197
|
+
*
|
|
198
|
+
* @param page - Puppeteer Page instance
|
|
199
|
+
* @returns Stabilization result with status
|
|
200
|
+
*/
|
|
201
|
+
export async function stabilizeAfterNavigation(page) {
|
|
202
|
+
return stabilizeAfterAction(page, NAVIGATION_NETWORK_IDLE_TIMEOUT_MS);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Execute a mutating action with automatic snapshot capture and state response generation.
|
|
206
|
+
*
|
|
207
|
+
* Simple flow:
|
|
208
|
+
* 1. Record pre-action timestamp for observation capture
|
|
209
|
+
* 2. Execute action (try/catch with retry for stale elements)
|
|
210
|
+
* 3. Stabilize DOM
|
|
211
|
+
* 4. Capture observations from the action window
|
|
212
|
+
* 5. Capture snapshot
|
|
213
|
+
* 6. Generate state_response
|
|
214
|
+
* 7. Return {success, state_response, metadata}
|
|
215
|
+
*
|
|
216
|
+
* @param handle - Page handle with CDP client
|
|
217
|
+
* @param action - The action to execute
|
|
218
|
+
* @returns Action result with page brief and metadata
|
|
219
|
+
*/
|
|
220
|
+
export async function executeAction(handle, action, captureSnapshot) {
|
|
221
|
+
let success = true;
|
|
222
|
+
let error;
|
|
223
|
+
// Record pre-action timestamp for observation capture
|
|
224
|
+
const actionStartTime = Date.now();
|
|
225
|
+
// Ensure observation accumulator is injected
|
|
226
|
+
await observationAccumulator.ensureInjected(handle.page);
|
|
227
|
+
// Execute action - if this throws, we catch and return error
|
|
228
|
+
try {
|
|
229
|
+
await action();
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
success = false;
|
|
233
|
+
error = err instanceof Error ? err.message : String(err);
|
|
234
|
+
}
|
|
235
|
+
// Stabilize page after action (handles both SPA updates and full navigations)
|
|
236
|
+
await stabilizeAfterAction(handle.page);
|
|
237
|
+
// Capture observations from the action window
|
|
238
|
+
const observations = await observationAccumulator.getObservations(handle.page, actionStartTime);
|
|
239
|
+
// Capture snapshot
|
|
240
|
+
const capture = captureSnapshot ?? (() => captureSnapshotFallback(handle));
|
|
241
|
+
const captureResult = await capture();
|
|
242
|
+
const snapshot = captureResult.snapshot;
|
|
243
|
+
// Filter observations to reduce noise (threshold 5 requires semantic signals)
|
|
244
|
+
const filteredObservations = observationAccumulator.filterBySignificance(observations, ATTACHMENT_SIGNIFICANCE_THRESHOLD);
|
|
245
|
+
// Attach observations to snapshot if any were captured
|
|
246
|
+
if (filteredObservations.duringAction.length > 0 ||
|
|
247
|
+
filteredObservations.sincePrevious.length > 0) {
|
|
248
|
+
snapshot.observations = filteredObservations;
|
|
249
|
+
}
|
|
250
|
+
// Generate state response using StateManager
|
|
251
|
+
const stateManager = getStateManager(handle.page_id);
|
|
252
|
+
const state_response = stateManager.generateResponse(snapshot);
|
|
253
|
+
return {
|
|
254
|
+
success,
|
|
255
|
+
snapshot_id: snapshot.snapshot_id,
|
|
256
|
+
node_count: snapshot.meta.node_count,
|
|
257
|
+
interactive_count: snapshot.meta.interactive_count,
|
|
258
|
+
state_response,
|
|
259
|
+
error,
|
|
260
|
+
snapshot,
|
|
261
|
+
runtime_health: captureResult.runtime_health,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Execute an element-based action with automatic retry on stale element errors.
|
|
266
|
+
*
|
|
267
|
+
* If the element becomes stale, this will:
|
|
268
|
+
* 1. Capture a fresh snapshot
|
|
269
|
+
* 2. Find the element by label
|
|
270
|
+
* 3. Retry the action once with the fresh backend_node_id
|
|
271
|
+
*
|
|
272
|
+
* Also captures DOM observations during the action window.
|
|
273
|
+
*
|
|
274
|
+
* @param handle - Page handle with CDP client
|
|
275
|
+
* @param node - The target node from snapshot
|
|
276
|
+
* @param action - The action to execute (takes backend_node_id)
|
|
277
|
+
* @param snapshotStore - Snapshot store to update with fresh snapshot
|
|
278
|
+
* @returns Action result with page brief and metadata
|
|
279
|
+
*/
|
|
280
|
+
export async function executeActionWithRetry(handle, node, action, snapshotStore, captureSnapshot) {
|
|
281
|
+
let success = true;
|
|
282
|
+
let error;
|
|
283
|
+
let retried = false;
|
|
284
|
+
// Record pre-action timestamp for observation capture
|
|
285
|
+
const actionStartTime = Date.now();
|
|
286
|
+
// Ensure observation accumulator is injected
|
|
287
|
+
await observationAccumulator.ensureInjected(handle.page);
|
|
288
|
+
const capture = captureSnapshot ?? (() => captureSnapshotFallback(handle));
|
|
289
|
+
// Try the action
|
|
290
|
+
try {
|
|
291
|
+
await action(node.backend_node_id);
|
|
292
|
+
}
|
|
293
|
+
catch (err) {
|
|
294
|
+
// Check if this is a stale element error
|
|
295
|
+
if (isStaleElementError(err)) {
|
|
296
|
+
retried = true;
|
|
297
|
+
try {
|
|
298
|
+
// Capture fresh snapshot
|
|
299
|
+
const freshSnapshot = (await capture()).snapshot;
|
|
300
|
+
// Update snapshot store if provided
|
|
301
|
+
if (snapshotStore) {
|
|
302
|
+
snapshotStore.store(handle.page_id, freshSnapshot);
|
|
303
|
+
}
|
|
304
|
+
// Find element by label in fresh snapshot
|
|
305
|
+
const freshNode = freshSnapshot.nodes.find((n) => n.label === node.label && n.kind === node.kind);
|
|
306
|
+
if (!freshNode) {
|
|
307
|
+
throw new Error(`Element no longer found after refresh: ${node.label}`);
|
|
308
|
+
}
|
|
309
|
+
// Retry action with fresh backend_node_id
|
|
310
|
+
await action(freshNode.backend_node_id);
|
|
311
|
+
}
|
|
312
|
+
catch (retryErr) {
|
|
313
|
+
success = false;
|
|
314
|
+
error =
|
|
315
|
+
retryErr instanceof Error
|
|
316
|
+
? `Retry failed: ${retryErr.message}`
|
|
317
|
+
: `Retry failed: ${String(retryErr)}`;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
// Not a stale element error - propagate immediately
|
|
322
|
+
success = false;
|
|
323
|
+
error = err instanceof Error ? err.message : String(err);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
// Stabilize page after action (handles both SPA updates and full navigations)
|
|
327
|
+
await stabilizeAfterAction(handle.page);
|
|
328
|
+
// Capture observations from the action window
|
|
329
|
+
const observations = await observationAccumulator.getObservations(handle.page, actionStartTime);
|
|
330
|
+
// Capture final snapshot
|
|
331
|
+
const captureResult = await capture();
|
|
332
|
+
const snapshot = captureResult.snapshot;
|
|
333
|
+
// Filter observations to reduce noise (threshold 5 requires semantic signals)
|
|
334
|
+
const filteredObservations = observationAccumulator.filterBySignificance(observations, ATTACHMENT_SIGNIFICANCE_THRESHOLD);
|
|
335
|
+
// Attach observations to snapshot if any were captured
|
|
336
|
+
if (filteredObservations.duringAction.length > 0 ||
|
|
337
|
+
filteredObservations.sincePrevious.length > 0) {
|
|
338
|
+
snapshot.observations = filteredObservations;
|
|
339
|
+
}
|
|
340
|
+
// Generate state response using StateManager
|
|
341
|
+
const stateManager = getStateManager(handle.page_id);
|
|
342
|
+
// Get previous snapshot BEFORE generateResponse shifts it
|
|
343
|
+
const prevSnapshot = stateManager.getPreviousSnapshot();
|
|
344
|
+
const state_response = stateManager.generateResponse(snapshot);
|
|
345
|
+
// Record effect for dependency tracking (after state response, so we have prevSnapshot)
|
|
346
|
+
if (success) {
|
|
347
|
+
const effect = computeObservedEffect(node.node_id, 'type', prevSnapshot, snapshot);
|
|
348
|
+
if (effect) {
|
|
349
|
+
getDependencyTracker().recordEffect(handle.page_id, effect);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
// Add note about retry if it happened
|
|
353
|
+
if (retried && success) {
|
|
354
|
+
error = 'Element was stale; automatically retried with fresh reference';
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
success,
|
|
358
|
+
snapshot_id: snapshot.snapshot_id,
|
|
359
|
+
node_count: snapshot.meta.node_count,
|
|
360
|
+
interactive_count: snapshot.meta.interactive_count,
|
|
361
|
+
state_response,
|
|
362
|
+
error,
|
|
363
|
+
snapshot,
|
|
364
|
+
runtime_health: captureResult.runtime_health,
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Capture current navigation state (URL and loaderId).
|
|
369
|
+
*
|
|
370
|
+
* @param handle - Page handle with CDP client
|
|
371
|
+
* @returns Navigation state with URL and optional loaderId
|
|
372
|
+
*/
|
|
373
|
+
async function captureNavigationState(handle) {
|
|
374
|
+
const url = handle.page.url();
|
|
375
|
+
let loaderId;
|
|
376
|
+
try {
|
|
377
|
+
const frameTree = await handle.cdp.send('Page.getFrameTree', undefined);
|
|
378
|
+
loaderId = frameTree.frameTree.frame.loaderId;
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
// Ignore - we can still detect navigation via URL
|
|
382
|
+
}
|
|
383
|
+
return { url, loaderId };
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Check if navigation occurred between two states.
|
|
387
|
+
*
|
|
388
|
+
* @param before - State before action
|
|
389
|
+
* @param after - State after action
|
|
390
|
+
* @returns True if navigation detected
|
|
391
|
+
*/
|
|
392
|
+
function checkNavigationOccurred(before, after) {
|
|
393
|
+
// URL changed = navigation
|
|
394
|
+
if (before.url !== after.url) {
|
|
395
|
+
return true;
|
|
396
|
+
}
|
|
397
|
+
// LoaderId changed (and both defined) = navigation
|
|
398
|
+
if (before.loaderId !== undefined &&
|
|
399
|
+
after.loaderId !== undefined &&
|
|
400
|
+
before.loaderId !== after.loaderId) {
|
|
401
|
+
return true;
|
|
402
|
+
}
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Handle stale element retry logic.
|
|
407
|
+
*
|
|
408
|
+
* @param handle - Page handle
|
|
409
|
+
* @param node - Original target node
|
|
410
|
+
* @param action - Action to retry
|
|
411
|
+
* @param capture - Snapshot capture function
|
|
412
|
+
* @param snapshotStore - Optional snapshot store to update
|
|
413
|
+
* @returns Retry result with success/error/outcome
|
|
414
|
+
*/
|
|
415
|
+
async function handleStaleElementRetry(handle, node, action, capture, snapshotStore) {
|
|
416
|
+
try {
|
|
417
|
+
// Capture fresh snapshot
|
|
418
|
+
const freshSnapshot = (await capture()).snapshot;
|
|
419
|
+
// Update snapshot store if provided
|
|
420
|
+
if (snapshotStore) {
|
|
421
|
+
snapshotStore.store(handle.page_id, freshSnapshot);
|
|
422
|
+
}
|
|
423
|
+
// Find element by label in fresh snapshot
|
|
424
|
+
const freshNode = freshSnapshot.nodes.find((n) => n.label === node.label && n.kind === node.kind);
|
|
425
|
+
if (!freshNode) {
|
|
426
|
+
return {
|
|
427
|
+
success: false,
|
|
428
|
+
error: `Element no longer found after refresh: ${node.label}`,
|
|
429
|
+
outcome: {
|
|
430
|
+
status: 'element_not_found',
|
|
431
|
+
eid: '', // Will be filled by caller if available
|
|
432
|
+
last_known_label: node.label,
|
|
433
|
+
},
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
// Retry action with fresh backend_node_id
|
|
437
|
+
await action(freshNode.backend_node_id);
|
|
438
|
+
return {
|
|
439
|
+
success: true,
|
|
440
|
+
outcome: { status: 'stale_element', reason: 'dom_mutation', retried: true },
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
catch (retryErr) {
|
|
444
|
+
return {
|
|
445
|
+
success: false,
|
|
446
|
+
error: retryErr instanceof Error
|
|
447
|
+
? `Retry failed: ${retryErr.message}`
|
|
448
|
+
: `Retry failed: ${String(retryErr)}`,
|
|
449
|
+
outcome: { status: 'stale_element', reason: 'dom_mutation', retried: true },
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
// ============================================================================
|
|
454
|
+
// Navigation-Aware Click Outcome
|
|
455
|
+
// ============================================================================
|
|
456
|
+
/**
|
|
457
|
+
* Execute an element-based click action with navigation-aware outcome detection.
|
|
458
|
+
*
|
|
459
|
+
* This extends executeActionWithRetry with:
|
|
460
|
+
* - Pre-click URL/loaderId capture
|
|
461
|
+
* - Post-click navigation detection
|
|
462
|
+
* - ClickOutcome classification (success/navigated vs stale_element)
|
|
463
|
+
* - DOM observation capture during the action window
|
|
464
|
+
*
|
|
465
|
+
* @param handle - Page handle with CDP client
|
|
466
|
+
* @param node - The target node from snapshot
|
|
467
|
+
* @param action - The action to execute (takes backend_node_id)
|
|
468
|
+
* @param snapshotStore - Snapshot store to update with fresh snapshot
|
|
469
|
+
* @returns ActionResultWithOutcome including ClickOutcome
|
|
470
|
+
*/
|
|
471
|
+
export async function executeActionWithOutcome(handle, node, action, snapshotStore, captureSnapshot) {
|
|
472
|
+
let success = true;
|
|
473
|
+
let error;
|
|
474
|
+
let retried = false;
|
|
475
|
+
let outcome;
|
|
476
|
+
// Record pre-action timestamp for observation capture
|
|
477
|
+
const actionStartTime = Date.now();
|
|
478
|
+
// Ensure observation accumulator is injected
|
|
479
|
+
await observationAccumulator.ensureInjected(handle.page);
|
|
480
|
+
const capture = captureSnapshot ?? (() => captureSnapshotFallback(handle));
|
|
481
|
+
// Capture pre-click navigation state
|
|
482
|
+
const preClickState = await captureNavigationState(handle);
|
|
483
|
+
// Try the action
|
|
484
|
+
try {
|
|
485
|
+
await action(node.backend_node_id);
|
|
486
|
+
// Action succeeded - check if navigation occurred
|
|
487
|
+
const postClickState = await captureNavigationState(handle);
|
|
488
|
+
const navigated = checkNavigationOccurred(preClickState, postClickState);
|
|
489
|
+
// Clear dependency tracker on navigation (old dependencies no longer valid)
|
|
490
|
+
if (navigated) {
|
|
491
|
+
getDependencyTracker().clearPage(handle.page_id);
|
|
492
|
+
}
|
|
493
|
+
outcome = { status: 'success', navigated };
|
|
494
|
+
}
|
|
495
|
+
catch (err) {
|
|
496
|
+
// Check if this is a stale element error
|
|
497
|
+
if (isStaleElementError(err)) {
|
|
498
|
+
// Check if navigation caused the staleness
|
|
499
|
+
const currentState = await captureNavigationState(handle);
|
|
500
|
+
const isNavigation = checkNavigationOccurred(preClickState, currentState);
|
|
501
|
+
if (isNavigation) {
|
|
502
|
+
// Element gone due to navigation - this is often success!
|
|
503
|
+
// Clear dependency tracker on navigation (old dependencies no longer valid)
|
|
504
|
+
getDependencyTracker().clearPage(handle.page_id);
|
|
505
|
+
outcome = { status: 'success', navigated: true };
|
|
506
|
+
// Don't retry - navigation happened
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
// Element stale due to DOM mutation - try retry
|
|
510
|
+
retried = true;
|
|
511
|
+
const retryResult = await handleStaleElementRetry(handle, node, action, capture, snapshotStore);
|
|
512
|
+
success = retryResult.success;
|
|
513
|
+
error = retryResult.error;
|
|
514
|
+
outcome = retryResult.outcome;
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
// Not a stale element error - propagate immediately
|
|
519
|
+
success = false;
|
|
520
|
+
error = err instanceof Error ? err.message : String(err);
|
|
521
|
+
outcome = { status: 'error', message: error };
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
// Stabilize page after action (handles both SPA updates and full navigations)
|
|
525
|
+
await stabilizeAfterAction(handle.page);
|
|
526
|
+
// Capture observations from the action window
|
|
527
|
+
const observations = await observationAccumulator.getObservations(handle.page, actionStartTime);
|
|
528
|
+
// Capture final snapshot
|
|
529
|
+
const captureResult = await capture();
|
|
530
|
+
const snapshot = captureResult.snapshot;
|
|
531
|
+
// Filter observations to reduce noise (threshold 5 requires semantic signals)
|
|
532
|
+
const filteredObservations = observationAccumulator.filterBySignificance(observations, ATTACHMENT_SIGNIFICANCE_THRESHOLD);
|
|
533
|
+
// Attach observations to snapshot if any were captured
|
|
534
|
+
if (filteredObservations.duringAction.length > 0 ||
|
|
535
|
+
filteredObservations.sincePrevious.length > 0) {
|
|
536
|
+
snapshot.observations = filteredObservations;
|
|
537
|
+
}
|
|
538
|
+
// Late navigation detection: SPA/Turbo frameworks change URL asynchronously
|
|
539
|
+
// after the click resolves but before stabilization completes.
|
|
540
|
+
// Re-check URL now that the page has stabilized.
|
|
541
|
+
if (outcome.status === 'success' && !outcome.navigated) {
|
|
542
|
+
const postStabilizeUrl = handle.page.url();
|
|
543
|
+
if (postStabilizeUrl !== preClickState.url) {
|
|
544
|
+
outcome = { status: 'success', navigated: true };
|
|
545
|
+
getDependencyTracker().clearPage(handle.page_id);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
// Determine if click caused a navigation (used for trimming and dependency tracking)
|
|
549
|
+
const didNavigate = outcome.status === 'success' && outcome.navigated;
|
|
550
|
+
// Generate state response using StateManager
|
|
551
|
+
// Trim regions when navigation occurred (same rationale as navigate() tool)
|
|
552
|
+
const stateManager = getStateManager(handle.page_id);
|
|
553
|
+
// Get previous snapshot BEFORE generateResponse shifts it
|
|
554
|
+
const prevSnapshot = stateManager.getPreviousSnapshot();
|
|
555
|
+
const state_response = stateManager.generateResponse(snapshot, didNavigate ? { trimRegions: true } : undefined);
|
|
556
|
+
// Record effect for dependency tracking (skip if navigation occurred - tracker was cleared)
|
|
557
|
+
if (success && !didNavigate) {
|
|
558
|
+
const effect = computeObservedEffect(node.node_id, 'click', prevSnapshot, snapshot);
|
|
559
|
+
if (effect) {
|
|
560
|
+
getDependencyTracker().recordEffect(handle.page_id, effect);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
// Add note about retry if it happened and we recovered
|
|
564
|
+
if (retried && success) {
|
|
565
|
+
error = 'Element was stale; automatically retried with fresh reference';
|
|
566
|
+
}
|
|
567
|
+
return {
|
|
568
|
+
success,
|
|
569
|
+
outcome,
|
|
570
|
+
snapshot_id: snapshot.snapshot_id,
|
|
571
|
+
node_count: snapshot.meta.node_count,
|
|
572
|
+
interactive_count: snapshot.meta.interactive_count,
|
|
573
|
+
state_response,
|
|
574
|
+
error,
|
|
575
|
+
snapshot,
|
|
576
|
+
runtime_health: captureResult.runtime_health,
|
|
577
|
+
};
|
|
578
|
+
}
|
|
579
|
+
//# sourceMappingURL=execute-action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-action.js","sourceRoot":"","sources":["../../../src/tools/execute-action.ts"],"names":[],"mappings":"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"}
|