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,618 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* State Manager
|
|
3
|
+
*
|
|
4
|
+
* Central orchestrator for state tracking and response generation.
|
|
5
|
+
* Coordinates layer detection, diff computation, actionables filtering, and atoms extraction.
|
|
6
|
+
*
|
|
7
|
+
* Security: Masks sensitive values (passwords, tokens) and sanitizes URLs.
|
|
8
|
+
* Reliability: Includes concurrency protection and error recovery.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash, randomUUID } from 'crypto';
|
|
11
|
+
import { computeEid, resolveEidCollision } from './element-identity.js';
|
|
12
|
+
import { detectLayers } from './layer-detector.js';
|
|
13
|
+
import { computeDiff } from './diff-engine.js';
|
|
14
|
+
import { selectActionables, isInteractiveKind } from './actionables-filter.js';
|
|
15
|
+
import { extractAtoms } from './atoms-extractor.js';
|
|
16
|
+
import { linkObservationsToSnapshot } from '../observation/index.js';
|
|
17
|
+
import { generateLocator } from './locator-generator.js';
|
|
18
|
+
import { ElementRegistry } from './element-registry.js';
|
|
19
|
+
import { validateSnapshotHealth, isErrorHealth } from '../snapshot/snapshot-health.js';
|
|
20
|
+
import { renderStateXml } from './state-renderer.js';
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Default Configuration
|
|
23
|
+
// ============================================================================
|
|
24
|
+
const DEFAULT_CONFIG = {
|
|
25
|
+
maxActionables: 1000, // Show all elements (practically unlimited)
|
|
26
|
+
};
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Security: Sensitive Field Detection
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Sensitive field name patterns (case-insensitive).
|
|
32
|
+
* Values in these fields will be masked.
|
|
33
|
+
*/
|
|
34
|
+
const SENSITIVE_FIELD_PATTERNS = [
|
|
35
|
+
'password',
|
|
36
|
+
'passwd',
|
|
37
|
+
'pass',
|
|
38
|
+
'secret',
|
|
39
|
+
'token',
|
|
40
|
+
'auth',
|
|
41
|
+
'key',
|
|
42
|
+
'api_key',
|
|
43
|
+
'apikey',
|
|
44
|
+
'otp',
|
|
45
|
+
'pin',
|
|
46
|
+
'cvv',
|
|
47
|
+
'cvc',
|
|
48
|
+
'ssn',
|
|
49
|
+
'social',
|
|
50
|
+
'credit',
|
|
51
|
+
'card',
|
|
52
|
+
];
|
|
53
|
+
/**
|
|
54
|
+
* Input types that should always be masked.
|
|
55
|
+
*/
|
|
56
|
+
const MASKED_INPUT_TYPES = ['password'];
|
|
57
|
+
/**
|
|
58
|
+
* Input types with partial masking (show first/last chars).
|
|
59
|
+
*/
|
|
60
|
+
const PARTIAL_MASK_TYPES = ['email', 'tel', 'phone'];
|
|
61
|
+
/**
|
|
62
|
+
* URL query parameters that are safe to keep.
|
|
63
|
+
* All others will be stripped.
|
|
64
|
+
*/
|
|
65
|
+
const SAFE_QUERY_PARAMS = new Set([
|
|
66
|
+
'page',
|
|
67
|
+
'p',
|
|
68
|
+
'sort',
|
|
69
|
+
'order',
|
|
70
|
+
'q',
|
|
71
|
+
'query',
|
|
72
|
+
'search',
|
|
73
|
+
'tab',
|
|
74
|
+
'view',
|
|
75
|
+
'limit',
|
|
76
|
+
'offset',
|
|
77
|
+
'lang',
|
|
78
|
+
'locale',
|
|
79
|
+
]);
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// State Manager Class
|
|
82
|
+
// ============================================================================
|
|
83
|
+
/**
|
|
84
|
+
* State manager for a single page.
|
|
85
|
+
* Tracks snapshots and generates state responses.
|
|
86
|
+
*/
|
|
87
|
+
export class StateManager {
|
|
88
|
+
context;
|
|
89
|
+
isProcessing = false;
|
|
90
|
+
pendingSnapshot = null;
|
|
91
|
+
elementRegistry;
|
|
92
|
+
/**
|
|
93
|
+
* Create a new state manager.
|
|
94
|
+
*
|
|
95
|
+
* @param options - Initialization options
|
|
96
|
+
*/
|
|
97
|
+
constructor(options) {
|
|
98
|
+
this.context = {
|
|
99
|
+
sessionId: options.sessionId ?? randomUUID(),
|
|
100
|
+
pageId: options.pageId,
|
|
101
|
+
stepCounter: 0,
|
|
102
|
+
currentSnapshot: null,
|
|
103
|
+
previousSnapshot: null,
|
|
104
|
+
currentDocId: null,
|
|
105
|
+
config: { ...DEFAULT_CONFIG, ...options.config },
|
|
106
|
+
};
|
|
107
|
+
this.elementRegistry = new ElementRegistry();
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Get the element registry for this page.
|
|
111
|
+
* Used by action tools to resolve eid to ElementRef.
|
|
112
|
+
*/
|
|
113
|
+
getElementRegistry() {
|
|
114
|
+
return this.elementRegistry;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get the previous snapshot for this page.
|
|
118
|
+
* Used for dependency tracking to compute effects.
|
|
119
|
+
*/
|
|
120
|
+
getPreviousSnapshot() {
|
|
121
|
+
return this.context.previousSnapshot;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Get the active layer for the current snapshot.
|
|
125
|
+
* Returns 'main' if no snapshot is available.
|
|
126
|
+
*/
|
|
127
|
+
getActiveLayer() {
|
|
128
|
+
if (!this.context.currentSnapshot) {
|
|
129
|
+
return 'main';
|
|
130
|
+
}
|
|
131
|
+
const layerResult = detectLayers(this.context.currentSnapshot);
|
|
132
|
+
return layerResult.active;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Generate an error response.
|
|
136
|
+
*
|
|
137
|
+
* @param errorMessage - The error message to include
|
|
138
|
+
* @returns XML state response with error baseline
|
|
139
|
+
*/
|
|
140
|
+
generateErrorResponse(errorMessage) {
|
|
141
|
+
return this.createErrorBaseline('error', errorMessage);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Generate state response for a new snapshot.
|
|
145
|
+
* Includes concurrency protection and error recovery.
|
|
146
|
+
*
|
|
147
|
+
* @param snapshot - Current snapshot
|
|
148
|
+
* @returns State response with StateHandle + Diff/Baseline + Actionables + Atoms
|
|
149
|
+
*/
|
|
150
|
+
generateResponse(snapshot, options) {
|
|
151
|
+
// Concurrency protection: if already processing, use latest snapshot
|
|
152
|
+
if (this.isProcessing) {
|
|
153
|
+
this.pendingSnapshot = snapshot;
|
|
154
|
+
// Return a minimal baseline response while processing
|
|
155
|
+
return this.createErrorBaseline('concurrent_call', 'Response generation in progress');
|
|
156
|
+
}
|
|
157
|
+
this.isProcessing = true;
|
|
158
|
+
try {
|
|
159
|
+
const response = this.doGenerateResponse(snapshot, options);
|
|
160
|
+
// Check if there's a pending snapshot that came in during processing
|
|
161
|
+
if (this.pendingSnapshot) {
|
|
162
|
+
const pending = this.pendingSnapshot;
|
|
163
|
+
this.pendingSnapshot = null;
|
|
164
|
+
// Process the pending snapshot (recursively, but now isProcessing will be false)
|
|
165
|
+
this.isProcessing = false;
|
|
166
|
+
return this.generateResponse(pending, options);
|
|
167
|
+
}
|
|
168
|
+
return response;
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
// Error recovery: return baseline with error reason
|
|
172
|
+
const errorMessage = err instanceof Error ? err.message : String(err);
|
|
173
|
+
return this.createErrorBaseline('error', errorMessage);
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
this.isProcessing = false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Internal response generation (called with concurrency protection).
|
|
181
|
+
*/
|
|
182
|
+
doGenerateResponse(snapshot, options) {
|
|
183
|
+
// Increment step counter
|
|
184
|
+
this.context.stepCounter++;
|
|
185
|
+
// Shift current snapshot to previous BEFORE baseline check
|
|
186
|
+
// This ensures the second call has previousSnapshot set correctly
|
|
187
|
+
this.context.previousSnapshot = this.context.currentSnapshot;
|
|
188
|
+
// Validate snapshot health (Bug #2: handle empty snapshots)
|
|
189
|
+
const health = validateSnapshotHealth(snapshot);
|
|
190
|
+
if (isErrorHealth(health)) {
|
|
191
|
+
// Return error baseline for empty/failed snapshots
|
|
192
|
+
return this.createErrorBaseline('error', health.message ?? 'Empty snapshot');
|
|
193
|
+
}
|
|
194
|
+
// Compute document ID
|
|
195
|
+
const docId = computeDocId(snapshot);
|
|
196
|
+
const isNavigation = docId !== this.context.currentDocId;
|
|
197
|
+
this.context.currentDocId = docId;
|
|
198
|
+
// Detect layers
|
|
199
|
+
const layerResult = detectLayers(snapshot);
|
|
200
|
+
// Update element registry with new snapshot
|
|
201
|
+
this.elementRegistry.updateFromSnapshot(snapshot, layerResult.active);
|
|
202
|
+
// Link observations to snapshot nodes (set eid for interactivity)
|
|
203
|
+
if (snapshot.observations) {
|
|
204
|
+
linkObservationsToSnapshot(snapshot.observations, snapshot, this.elementRegistry);
|
|
205
|
+
}
|
|
206
|
+
// Decide baseline vs diff and get reason
|
|
207
|
+
const baselineInfo = this.getBaselineInfo(snapshot, isNavigation);
|
|
208
|
+
// Generate state handle (with sanitized URL)
|
|
209
|
+
const state = this.generateStateHandle(snapshot, layerResult);
|
|
210
|
+
// Generate diff or baseline
|
|
211
|
+
const diff = baselineInfo.sendBaseline
|
|
212
|
+
? { mode: 'baseline', reason: baselineInfo.reason }
|
|
213
|
+
: computeDiff(this.context.previousSnapshot, snapshot);
|
|
214
|
+
// Select actionables (scoped to active layer)
|
|
215
|
+
const context = {
|
|
216
|
+
activeLayer: layerResult.active,
|
|
217
|
+
};
|
|
218
|
+
// Get actionable nodes with focused element guarantee
|
|
219
|
+
const actionableNodes = this.selectActionablesWithFocusGuarantee(snapshot, layerResult.active, context);
|
|
220
|
+
// Format actionables (with sensitive value masking and ref for direct targeting)
|
|
221
|
+
const actionables = this.formatActionables(actionableNodes, layerResult.active, snapshot.snapshot_id);
|
|
222
|
+
// Count total actionables in active layer
|
|
223
|
+
const totalInLayer = snapshot.nodes.filter((n) => isInteractiveKind(n.kind) && n.state?.visible && getNodeLayer(n) === layerResult.active).length;
|
|
224
|
+
const counts = {
|
|
225
|
+
shown: actionables.length,
|
|
226
|
+
total_in_layer: totalInLayer,
|
|
227
|
+
};
|
|
228
|
+
// Limits applied
|
|
229
|
+
const limits = {
|
|
230
|
+
max_actionables: this.context.config.maxActionables,
|
|
231
|
+
actionables_capped: totalInLayer > this.context.config.maxActionables,
|
|
232
|
+
};
|
|
233
|
+
// Extract atoms
|
|
234
|
+
const atoms = extractAtoms(snapshot);
|
|
235
|
+
// Store current snapshot (previous was already shifted at the start)
|
|
236
|
+
this.context.currentSnapshot = snapshot;
|
|
237
|
+
// Estimate tokens
|
|
238
|
+
const tokens = this.estimateTokens({ state, diff, actionables, atoms, counts, limits });
|
|
239
|
+
const response = {
|
|
240
|
+
state,
|
|
241
|
+
diff,
|
|
242
|
+
actionables,
|
|
243
|
+
counts,
|
|
244
|
+
limits,
|
|
245
|
+
atoms,
|
|
246
|
+
tokens,
|
|
247
|
+
};
|
|
248
|
+
// Add observations if present in snapshot
|
|
249
|
+
if (snapshot.observations) {
|
|
250
|
+
response.observations = snapshot.observations;
|
|
251
|
+
}
|
|
252
|
+
// Return dense XML representation
|
|
253
|
+
return renderStateXml(response, options);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Get baseline decision info with reason.
|
|
257
|
+
*
|
|
258
|
+
* Baselines are only sent when absolutely necessary:
|
|
259
|
+
* - first: No previous snapshot (LLM has no context)
|
|
260
|
+
* - navigation: URL changed (old elements no longer exist)
|
|
261
|
+
* - error: State corrupted, need to resync
|
|
262
|
+
*
|
|
263
|
+
* For same-page mutations (autocomplete, dropdowns, modals), we always
|
|
264
|
+
* send diffs regardless of how many elements changed. The LLM already
|
|
265
|
+
* has context from the previous response - repeating unchanged elements
|
|
266
|
+
* wastes context window tokens.
|
|
267
|
+
*/
|
|
268
|
+
getBaselineInfo(_snapshot, isNavigation) {
|
|
269
|
+
if (!this.context.previousSnapshot) {
|
|
270
|
+
return { sendBaseline: true, reason: 'first' };
|
|
271
|
+
}
|
|
272
|
+
if (isNavigation) {
|
|
273
|
+
return { sendBaseline: true, reason: 'navigation' };
|
|
274
|
+
}
|
|
275
|
+
// Always use diff for same-page mutations - no threshold or periodic baselines
|
|
276
|
+
return { sendBaseline: false, reason: 'first' }; // reason unused when not baseline
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Create error baseline response for recovery.
|
|
280
|
+
* Always uses 'error' reason - the specific error type is in the message.
|
|
281
|
+
*/
|
|
282
|
+
createErrorBaseline(_reason, errorMessage) {
|
|
283
|
+
// Minimal state for error baseline
|
|
284
|
+
const state = {
|
|
285
|
+
sid: this.context.sessionId,
|
|
286
|
+
step: this.context.stepCounter,
|
|
287
|
+
doc: {
|
|
288
|
+
url: '',
|
|
289
|
+
origin: '',
|
|
290
|
+
title: '',
|
|
291
|
+
doc_id: '',
|
|
292
|
+
nav_type: 'soft',
|
|
293
|
+
history_idx: 0,
|
|
294
|
+
},
|
|
295
|
+
layer: {
|
|
296
|
+
active: 'main',
|
|
297
|
+
stack: ['main'],
|
|
298
|
+
pointer_lock: false,
|
|
299
|
+
},
|
|
300
|
+
timing: {
|
|
301
|
+
ts: new Date().toISOString(),
|
|
302
|
+
dom_ready: false,
|
|
303
|
+
network_busy: false,
|
|
304
|
+
},
|
|
305
|
+
hash: {
|
|
306
|
+
ui: '',
|
|
307
|
+
layer: '',
|
|
308
|
+
},
|
|
309
|
+
};
|
|
310
|
+
const atoms = { viewport: { w: 0, h: 0, dpr: 1 }, scroll: { x: 0, y: 0 } };
|
|
311
|
+
const response = {
|
|
312
|
+
state,
|
|
313
|
+
diff: { mode: 'baseline', reason: 'error', error: errorMessage },
|
|
314
|
+
actionables: [],
|
|
315
|
+
counts: { shown: 0, total_in_layer: 0 },
|
|
316
|
+
limits: { max_actionables: this.context.config.maxActionables, actionables_capped: false },
|
|
317
|
+
atoms,
|
|
318
|
+
tokens: 0,
|
|
319
|
+
};
|
|
320
|
+
return renderStateXml(response);
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Select actionables with guaranteed focus element inclusion.
|
|
324
|
+
* Also prioritizes modal close/cancel affordances.
|
|
325
|
+
*/
|
|
326
|
+
selectActionablesWithFocusGuarantee(snapshot, activeLayer, context) {
|
|
327
|
+
const maxCount = this.context.config.maxActionables;
|
|
328
|
+
// Find focused element first
|
|
329
|
+
const focusedNode = snapshot.nodes.find((n) => n.state?.focused &&
|
|
330
|
+
isInteractiveKind(n.kind) &&
|
|
331
|
+
n.state?.visible &&
|
|
332
|
+
getNodeLayer(n) === activeLayer);
|
|
333
|
+
// Find modal close/cancel affordances (high priority in modal layer)
|
|
334
|
+
const closeAffordances = [];
|
|
335
|
+
if (activeLayer === 'modal') {
|
|
336
|
+
for (const node of snapshot.nodes) {
|
|
337
|
+
if (!isInteractiveKind(node.kind) || !node.state?.visible)
|
|
338
|
+
continue;
|
|
339
|
+
if (getNodeLayer(node) !== activeLayer)
|
|
340
|
+
continue;
|
|
341
|
+
const label = node.label.toLowerCase();
|
|
342
|
+
const isCloseAffordance = label.includes('close') ||
|
|
343
|
+
label.includes('cancel') ||
|
|
344
|
+
label.includes('dismiss') ||
|
|
345
|
+
label === 'x' ||
|
|
346
|
+
label === '×';
|
|
347
|
+
if (isCloseAffordance) {
|
|
348
|
+
closeAffordances.push(node);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
// Get regular scored actionables
|
|
353
|
+
const regularActionables = selectActionables(snapshot, activeLayer, maxCount, context);
|
|
354
|
+
// Build final list: focused first, then close affordances, then others
|
|
355
|
+
const result = [];
|
|
356
|
+
const includedNodeIds = new Set();
|
|
357
|
+
// 1. Add focused element if present
|
|
358
|
+
if (focusedNode) {
|
|
359
|
+
result.push(focusedNode);
|
|
360
|
+
includedNodeIds.add(focusedNode.node_id);
|
|
361
|
+
}
|
|
362
|
+
// 2. Add close affordances (up to 2)
|
|
363
|
+
for (const node of closeAffordances.slice(0, 2)) {
|
|
364
|
+
if (!includedNodeIds.has(node.node_id)) {
|
|
365
|
+
result.push(node);
|
|
366
|
+
includedNodeIds.add(node.node_id);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// 3. Fill remaining slots with regular actionables
|
|
370
|
+
for (const node of regularActionables) {
|
|
371
|
+
if (result.length >= maxCount)
|
|
372
|
+
break;
|
|
373
|
+
if (!includedNodeIds.has(node.node_id)) {
|
|
374
|
+
result.push(node);
|
|
375
|
+
includedNodeIds.add(node.node_id);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return result;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Generate state handle with sanitized URL.
|
|
382
|
+
*/
|
|
383
|
+
generateStateHandle(snapshot, layerResult) {
|
|
384
|
+
const sanitizedUrl = sanitizeUrl(snapshot.url);
|
|
385
|
+
const url = new URL(snapshot.url);
|
|
386
|
+
const dom_ready = snapshot.meta.node_count > 0 &&
|
|
387
|
+
!snapshot.meta.warnings?.some((warning) => warning.toLowerCase().includes('dom extraction failed'));
|
|
388
|
+
return {
|
|
389
|
+
sid: this.context.sessionId,
|
|
390
|
+
step: this.context.stepCounter,
|
|
391
|
+
doc: {
|
|
392
|
+
url: sanitizedUrl,
|
|
393
|
+
origin: url.origin,
|
|
394
|
+
title: snapshot.title,
|
|
395
|
+
doc_id: this.context.currentDocId ?? '',
|
|
396
|
+
nav_type: this.context.stepCounter === 1 ? 'hard' : 'soft',
|
|
397
|
+
history_idx: 0,
|
|
398
|
+
},
|
|
399
|
+
layer: {
|
|
400
|
+
active: layerResult.active,
|
|
401
|
+
stack: layerResult.stack.map((l) => l.type),
|
|
402
|
+
focus_eid: layerResult.focusEid,
|
|
403
|
+
pointer_lock: layerResult.pointerLock,
|
|
404
|
+
},
|
|
405
|
+
timing: {
|
|
406
|
+
ts: new Date().toISOString(),
|
|
407
|
+
dom_ready,
|
|
408
|
+
network_busy: false,
|
|
409
|
+
},
|
|
410
|
+
hash: {
|
|
411
|
+
ui: computeUiHash(snapshot),
|
|
412
|
+
layer: computeLayerHash(layerResult.stack.map((l) => l.type)),
|
|
413
|
+
},
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Format actionables with sensitive value masking.
|
|
418
|
+
* Now includes ref for direct element targeting.
|
|
419
|
+
*/
|
|
420
|
+
formatActionables(nodes, activeLayer, snapshotId) {
|
|
421
|
+
const actionables = [];
|
|
422
|
+
// Used only for fallback case when element not in registry
|
|
423
|
+
const fallbackUsedEids = new Set();
|
|
424
|
+
for (const node of nodes) {
|
|
425
|
+
// Look up EID from registry - single source of truth
|
|
426
|
+
// Registry was updated in generateResponse() before this method is called
|
|
427
|
+
let eid = this.elementRegistry.getEidBySnapshotAndBackendNodeId(snapshotId, node.backend_node_id);
|
|
428
|
+
if (!eid) {
|
|
429
|
+
// Defensive fallback: compute if not in registry
|
|
430
|
+
// This can happen for non-interactive elements or edge cases
|
|
431
|
+
const baseEid = computeEid(node, activeLayer);
|
|
432
|
+
eid = resolveEidCollision(baseEid, fallbackUsedEids);
|
|
433
|
+
fallbackUsedEids.add(eid);
|
|
434
|
+
}
|
|
435
|
+
const loc = generateLocator(node, activeLayer);
|
|
436
|
+
// Build element target ref for direct interaction
|
|
437
|
+
const ref = {
|
|
438
|
+
snapshot_id: snapshotId,
|
|
439
|
+
backend_node_id: node.backend_node_id,
|
|
440
|
+
};
|
|
441
|
+
const actionable = {
|
|
442
|
+
eid,
|
|
443
|
+
kind: node.kind,
|
|
444
|
+
name: node.label,
|
|
445
|
+
role: node.attributes?.role ?? node.kind,
|
|
446
|
+
vis: node.state?.visible ?? false,
|
|
447
|
+
ena: node.state?.enabled ?? false,
|
|
448
|
+
ref,
|
|
449
|
+
loc,
|
|
450
|
+
ctx: {
|
|
451
|
+
layer: getNodeLayer(node),
|
|
452
|
+
region: node.where.region ?? 'unknown',
|
|
453
|
+
},
|
|
454
|
+
};
|
|
455
|
+
// Optional state flags (only if true)
|
|
456
|
+
if (node.state?.checked)
|
|
457
|
+
actionable.chk = true;
|
|
458
|
+
if (node.state?.selected)
|
|
459
|
+
actionable.sel = true;
|
|
460
|
+
if (node.state?.expanded)
|
|
461
|
+
actionable.exp = true;
|
|
462
|
+
if (node.state?.focused)
|
|
463
|
+
actionable.foc = true;
|
|
464
|
+
if (node.state?.required)
|
|
465
|
+
actionable.req = true;
|
|
466
|
+
if (node.state?.invalid)
|
|
467
|
+
actionable.inv = true;
|
|
468
|
+
if (node.state?.readonly)
|
|
469
|
+
actionable.rdo = true;
|
|
470
|
+
// Masked value hint (P0 security fix)
|
|
471
|
+
if (node.attributes?.value) {
|
|
472
|
+
actionable.val_hint = maskValue(node.attributes.value, node.attributes?.input_type, node.label);
|
|
473
|
+
}
|
|
474
|
+
if (node.attributes?.placeholder) {
|
|
475
|
+
actionable.placeholder = node.attributes.placeholder;
|
|
476
|
+
}
|
|
477
|
+
if (node.attributes?.href) {
|
|
478
|
+
actionable.href = sanitizeHref(node.attributes.href);
|
|
479
|
+
}
|
|
480
|
+
if (node.attributes?.input_type) {
|
|
481
|
+
actionable.type = node.attributes.input_type;
|
|
482
|
+
}
|
|
483
|
+
actionables.push(actionable);
|
|
484
|
+
}
|
|
485
|
+
return actionables;
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Estimate token count for response.
|
|
489
|
+
*/
|
|
490
|
+
estimateTokens(response) {
|
|
491
|
+
const jsonString = JSON.stringify(response);
|
|
492
|
+
return Math.ceil(jsonString.length / 4);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
// ============================================================================
|
|
496
|
+
// Security: Value Masking
|
|
497
|
+
// ============================================================================
|
|
498
|
+
/**
|
|
499
|
+
* Mask sensitive values in val_hint.
|
|
500
|
+
*
|
|
501
|
+
* Rules:
|
|
502
|
+
* - password type: always full mask
|
|
503
|
+
* - sensitive field names: always full mask
|
|
504
|
+
* - email/tel: partial mask (show first/last chars)
|
|
505
|
+
* - default: truncate to 12 chars, mask middle
|
|
506
|
+
*/
|
|
507
|
+
function maskValue(value, inputType, label) {
|
|
508
|
+
// Strip newlines first
|
|
509
|
+
const cleanValue = value.replace(/[\r\n]/g, ' ').trim();
|
|
510
|
+
if (!cleanValue)
|
|
511
|
+
return '';
|
|
512
|
+
// Password type: always full mask
|
|
513
|
+
if (inputType && MASKED_INPUT_TYPES.includes(inputType.toLowerCase())) {
|
|
514
|
+
return '••••••••';
|
|
515
|
+
}
|
|
516
|
+
// Check sensitive field names
|
|
517
|
+
const lowerLabel = (label ?? '').toLowerCase();
|
|
518
|
+
for (const pattern of SENSITIVE_FIELD_PATTERNS) {
|
|
519
|
+
if (lowerLabel.includes(pattern)) {
|
|
520
|
+
return '***';
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
// Email/tel: partial mask
|
|
524
|
+
if (inputType && PARTIAL_MASK_TYPES.includes(inputType.toLowerCase())) {
|
|
525
|
+
return partialMask(cleanValue);
|
|
526
|
+
}
|
|
527
|
+
// Default: truncate and partial mask if long
|
|
528
|
+
if (cleanValue.length <= 12) {
|
|
529
|
+
return cleanValue;
|
|
530
|
+
}
|
|
531
|
+
return partialMask(cleanValue.substring(0, 12));
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Partial mask: show first 2 and last 2 chars.
|
|
535
|
+
* Example: "example@email.com" -> "ex•••om"
|
|
536
|
+
*/
|
|
537
|
+
function partialMask(value) {
|
|
538
|
+
if (value.length <= 4) {
|
|
539
|
+
return '••••';
|
|
540
|
+
}
|
|
541
|
+
const first = value.substring(0, 2);
|
|
542
|
+
const last = value.substring(value.length - 2);
|
|
543
|
+
return `${first}•••${last}`;
|
|
544
|
+
}
|
|
545
|
+
// ============================================================================
|
|
546
|
+
// Security: URL Sanitization
|
|
547
|
+
// ============================================================================
|
|
548
|
+
/**
|
|
549
|
+
* Sanitize URL by stripping sensitive query parameters.
|
|
550
|
+
* Only keeps safe params like page, sort, q.
|
|
551
|
+
*/
|
|
552
|
+
function sanitizeUrl(rawUrl) {
|
|
553
|
+
try {
|
|
554
|
+
const url = new URL(rawUrl);
|
|
555
|
+
// Build new search params with only safe ones
|
|
556
|
+
const safeParams = new URLSearchParams();
|
|
557
|
+
for (const [key, value] of url.searchParams) {
|
|
558
|
+
if (SAFE_QUERY_PARAMS.has(key.toLowerCase())) {
|
|
559
|
+
safeParams.set(key, value);
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
// Reconstruct URL with sanitized params
|
|
563
|
+
url.search = safeParams.toString();
|
|
564
|
+
return url.toString();
|
|
565
|
+
}
|
|
566
|
+
catch {
|
|
567
|
+
// If URL parsing fails, return origin only
|
|
568
|
+
return rawUrl.split('?')[0];
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* Sanitize href attribute (remove tokens from URLs).
|
|
573
|
+
*/
|
|
574
|
+
function sanitizeHref(href) {
|
|
575
|
+
// For relative URLs, return as-is
|
|
576
|
+
if (!href.startsWith('http://') && !href.startsWith('https://')) {
|
|
577
|
+
return href;
|
|
578
|
+
}
|
|
579
|
+
return sanitizeUrl(href);
|
|
580
|
+
}
|
|
581
|
+
// ============================================================================
|
|
582
|
+
// Utilities
|
|
583
|
+
// ============================================================================
|
|
584
|
+
/**
|
|
585
|
+
* Compute document ID from snapshot.
|
|
586
|
+
*
|
|
587
|
+
* Uses only URL origin + pathname for navigation detection.
|
|
588
|
+
* This ensures DOM mutations (like autocomplete suggestions appearing)
|
|
589
|
+
* are NOT falsely detected as navigation events.
|
|
590
|
+
*
|
|
591
|
+
* NOTE: Previously this included a hash of the first 10 interactive node IDs,
|
|
592
|
+
* which caused false navigation detection when typing triggered autocomplete
|
|
593
|
+
* or other dynamic UI updates. See: https://github.com/lespaceman/agent-web-interface/issues/XXX
|
|
594
|
+
*/
|
|
595
|
+
function computeDocId(snapshot) {
|
|
596
|
+
const url = new URL(snapshot.url);
|
|
597
|
+
// Only use origin + pathname for navigation detection
|
|
598
|
+
// Query params and fragments are ignored (same page, different state)
|
|
599
|
+
return hash(`${url.origin}:${url.pathname}`);
|
|
600
|
+
}
|
|
601
|
+
function computeUiHash(snapshot) {
|
|
602
|
+
const interactiveNodeIds = snapshot.nodes
|
|
603
|
+
.filter((n) => isInteractiveKind(n.kind) && n.state?.visible)
|
|
604
|
+
.map((n) => computeEid(n))
|
|
605
|
+
.join(',');
|
|
606
|
+
return hash(interactiveNodeIds).substring(0, 6);
|
|
607
|
+
}
|
|
608
|
+
function computeLayerHash(stack) {
|
|
609
|
+
return hash(stack.join(',')).substring(0, 6);
|
|
610
|
+
}
|
|
611
|
+
function hash(input) {
|
|
612
|
+
return createHash('sha256').update(input).digest('hex').substring(0, 12);
|
|
613
|
+
}
|
|
614
|
+
function getNodeLayer(node) {
|
|
615
|
+
const region = node.where.region ?? 'unknown';
|
|
616
|
+
return region === 'dialog' ? 'modal' : 'main';
|
|
617
|
+
}
|
|
618
|
+
//# sourceMappingURL=state-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-manager.js","sourceRoot":"","sources":["../../../src/state/state-manager.ts"],"names":[],"mappings":"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"}
|