@browserbasehq/orca 3.7.0-preview.1 → 3.7.2-preview.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/dist/cjs/lib/modelUtils.d.ts +10 -0
- package/dist/cjs/lib/modelUtils.js +11 -0
- package/dist/cjs/lib/modelUtils.js.map +1 -1
- package/dist/cjs/lib/v3/agent/AgentProvider.js +3 -0
- package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/click.js +15 -4
- package/dist/cjs/lib/v3/agent/tools/click.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.js +12 -4
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/type.js +12 -3
- package/dist/cjs/lib/v3/agent/tools/type.js.map +1 -1
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js +3 -1
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
- package/dist/cjs/lib/v3/api.d.ts +1 -1
- package/dist/cjs/lib/v3/api.js +11 -1
- package/dist/cjs/lib/v3/api.js.map +1 -1
- package/dist/cjs/lib/v3/cache/AgentCache.js +6 -1
- package/dist/cjs/lib/v3/cache/AgentCache.js.map +1 -1
- package/dist/cjs/lib/v3/external_clients/aisdk.js +2 -0
- package/dist/cjs/lib/v3/external_clients/aisdk.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js +20 -0
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +5 -4
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +32 -0
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/index.d.ts +1 -1
- package/dist/cjs/lib/v3/llm/LLMProvider.js +9 -2
- package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/cjs/lib/v3/llm/aisdk.js +2 -0
- package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/cjs/lib/v3/llm/providerOptions.d.ts +7 -0
- package/dist/cjs/lib/v3/llm/providerOptions.js +9 -0
- package/dist/cjs/lib/v3/llm/providerOptions.js.map +1 -0
- package/dist/cjs/lib/v3/types/private/agent.d.ts +1 -1
- package/dist/cjs/lib/v3/types/private/agent.js +1 -0
- package/dist/cjs/lib/v3/types/private/agent.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/agent.d.ts +1 -1
- package/dist/cjs/lib/v3/types/public/agent.js +3 -0
- package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/api.d.ts +53 -0
- package/dist/cjs/lib/v3/types/public/api.js +8 -0
- package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/model.d.ts +7 -0
- package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/options.d.ts +13 -0
- package/dist/cjs/lib/v3/types/public/options.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/capture.js +4 -3
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/capture.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/locator.d.ts +12 -0
- package/dist/cjs/lib/v3/understudy/locator.js +44 -0
- package/dist/cjs/lib/v3/understudy/locator.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/page.d.ts +15 -0
- package/dist/cjs/lib/v3/understudy/page.js +50 -0
- package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
- package/dist/cjs/lib/v3/v3.d.ts +8 -0
- package/dist/cjs/lib/v3/v3.js +50 -3
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/cjs/lib/v3/verifier/types.d.ts +3 -2
- package/dist/cjs/lib/v3/verifier/types.js.map +1 -1
- package/dist/cjs/lib/version.d.ts +1 -1
- package/dist/cjs/lib/version.js +1 -1
- package/dist/cjs/lib/version.js.map +1 -1
- package/dist/esm/lib/modelUtils.d.ts +10 -0
- package/dist/esm/lib/modelUtils.js +9 -0
- package/dist/esm/lib/modelUtils.js.map +1 -1
- package/dist/esm/lib/v3/agent/AgentProvider.js +3 -0
- package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/click.js +15 -4
- package/dist/esm/lib/v3/agent/tools/click.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillFormVision.js +12 -4
- package/dist/esm/lib/v3/agent/tools/fillFormVision.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/type.js +12 -3
- package/dist/esm/lib/v3/agent/tools/type.js.map +1 -1
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js +3 -1
- package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
- package/dist/esm/lib/v3/api.d.ts +1 -1
- package/dist/esm/lib/v3/api.js +11 -1
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/cache/AgentCache.js +6 -1
- package/dist/esm/lib/v3/cache/AgentCache.js.map +1 -1
- package/dist/esm/lib/v3/external_clients/aisdk.js +2 -0
- package/dist/esm/lib/v3/external_clients/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +20 -0
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +5 -4
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +32 -0
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/index.d.ts +1 -1
- package/dist/esm/lib/v3/llm/LLMProvider.js +9 -2
- package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.js +2 -0
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/llm/providerOptions.d.ts +7 -0
- package/dist/esm/lib/v3/llm/providerOptions.js +6 -0
- package/dist/esm/lib/v3/llm/providerOptions.js.map +1 -0
- package/dist/esm/lib/v3/types/private/agent.d.ts +1 -1
- package/dist/esm/lib/v3/types/private/agent.js +1 -0
- package/dist/esm/lib/v3/types/private/agent.js.map +1 -1
- package/dist/esm/lib/v3/types/public/agent.d.ts +1 -1
- package/dist/esm/lib/v3/types/public/agent.js +3 -0
- package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
- package/dist/esm/lib/v3/types/public/api.d.ts +53 -0
- package/dist/esm/lib/v3/types/public/api.js +8 -0
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/model.d.ts +7 -0
- package/dist/esm/lib/v3/types/public/model.js.map +1 -1
- package/dist/esm/lib/v3/types/public/options.d.ts +13 -0
- package/dist/esm/lib/v3/types/public/options.js.map +1 -1
- package/dist/esm/lib/v3/understudy/a11y/snapshot/capture.js +4 -3
- package/dist/esm/lib/v3/understudy/a11y/snapshot/capture.js.map +1 -1
- package/dist/esm/lib/v3/understudy/locator.d.ts +12 -0
- package/dist/esm/lib/v3/understudy/locator.js +44 -0
- package/dist/esm/lib/v3/understudy/locator.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.d.ts +15 -0
- package/dist/esm/lib/v3/understudy/page.js +50 -0
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/v3.d.ts +8 -0
- package/dist/esm/lib/v3/v3.js +51 -4
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/lib/v3/verifier/types.d.ts +3 -2
- package/dist/esm/lib/v3/verifier/types.js.map +1 -1
- package/dist/esm/lib/version.d.ts +1 -1
- package/dist/esm/lib/version.js +1 -1
- package/dist/esm/lib/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../../../../../lib/v3/understudy/a11y/snapshot/capture.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EACL,qBAAqB,GAGtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAS9C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAQ9D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAU,EACV,OAAyB;IAEzB,MAAM,MAAM,GAAG,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,KAAK,KAAK,CAAC;IACzD,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAEvE,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAC5C,IAAI,EACJ,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,GAAG,EAA2B,EAClC,IAAI,GAAG,EAAE,CACV,CAAC;QACF,IAAI,cAAc;YAAE,OAAO,cAAc,CAAC;IAC5C,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAC9E,MAAM,mBAAmB,GAAG,MAAM,mBAAmB,CACnD,IAAI,EACJ,OAAO,EAAE,eAAe,EACxB,OAAO,EACP,cAAc,CACf,CAAC;IACF,MAAM,yBAAyB,GAAG,MAAM,4BAA4B,CAClE,IAAI,EACJ,OAAO,EACP,cAAc,EACd,mBAAmB,CACpB,CAAC;IACF,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAC5C,IAAI,EACJ,OAAO,EACP,OAAO,EACP,MAAM,EACN,cAAc,EACd,yBAAyB,CAC1B,CAAC;QACF,IAAI,cAAc;YAAE,OAAO,cAAc,CAAC;IAC5C,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,MAAM,mBAAmB,CAClE,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,MAAM,EACN,aAAa,EACb,yBAAyB,CAC1B,CAAC;IACF,MAAM,EAAE,SAAS,EAAE,oBAAoB,EAAE,GAAG,MAAM,oBAAoB,CACpE,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,aAAa,CACd,CAAC;IAEF,OAAO,uBAAuB,CAC5B,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,oBAAoB,EACpB,aAAa,CACd,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAU;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,aAAa,GAAqB,IAAI,GAAG,EAAE,CAAC;IAClD,CAAC,SAAS,KAAK,CAAC,CAA0B,EAAE,MAAqB;QAC/D,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,EAAE;YAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IACtC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAU,EACV,OAAoC,EACpC,OAAqB,EACrB,MAAe,EACf,cAA4C,EAC5C,yBAAoD;IAEpD,MAAM,cAAc,GAAG,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,QAAQ,CAAC;YACP,OAAO,EAAE,sEAAsE;YAC/E,KAAK,EAAE,CAAC;YACR,SAAS,EAAE;gBACT,SAAS,EAAE;oBACT,KAAK,EAAE,aAAa,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE;oBACpD,IAAI,EAAE,QAAQ;iBACf;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,IAAI,aAAqB,CAAC;QAC1B,IAAI,YAAgC,CAAC;QACrC,IAAI,SAA6B,CAAC;QAElC,MAAM,cAAc,GAClB,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;YAC7C,MAAM,GAAG,GAAG,MAAM,wBAAwB,CACxC,IAAI,EACJ,KAAK,EACL,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,MAAM,CACf,CAAC;YACF,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;YAClC,YAAY,GAAG,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC;YAC1C,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAC9C,IAAI,EACJ,cAAc,EACd,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,MAAM,CACf,CAAC;YACF,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;YACrC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC;YAChD,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAC/B,CAAC;QAED,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC1D,MAAM,mBAAmB,GACvB,CAAC,CAAC,QAAQ;YACV,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,iBAAiB,CACrE,UAAU,EACV,aAAa,EACb,MAAM,EACN,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAC5C,mBAAmB,CACpB,CAAC;QAEF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,YAAY,CAC1D,UAAU,EACV,aAAa,EACb;YACE,aAAa,EAAE,YAAY,IAAI,SAAS;YACxC,oBAAoB,EAAE,wBAAwB,CAC5C,aAAa,EACb,yBAAyB,CAAC,IAAI,EAAE,aAAa,EAAE,cAAc,CAAC,EAC9D,yBAAyB,CAC1B;YACD,UAAU;YACV,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,KAAK;YAC5C,aAAa;YACb,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,CACxB,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,aAAa,EAAE;SACvD,CACF,CAAC;QAEF,MAAM,cAAc,GAA2B,EAAE,CAAC;QAClD,MAAM,oBAAoB,GAAG,wBAAwB,CACnD,aAAa,EACb,yBAAyB,CAAC,IAAI,EAAE,aAAa,EAAE,cAAc,CAAC,EAC9D,yBAAyB,CAC1B,CAAC;QACF,MAAM,GAAG,GAAG,SAAS,IAAI,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC;QACnC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnD,MAAM,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;gBACvD,IACE,OAAO,aAAa,KAAK,QAAQ;oBACjC,oBAAoB,EAAE,CAAC,aAAa,CAAC,EACrC,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,2EAA2E;YAC3E,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnD,MAAM,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;gBACvD,IACE,OAAO,aAAa,KAAK,QAAQ;oBACjC,oBAAoB,EAAE,CAAC,aAAa,CAAC,EACrC,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,cAAc,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAA2B,EAAE,GAAG,MAAM,EAAE,CAAC;QAE3D,MAAM,QAAQ,GAAmB;YAC/B,YAAY,EAAE,OAAO;YACrB,gBAAgB,EAAE,cAAc;YAChC,cAAc,EAAE,YAAY;YAC5B,QAAQ,EAAE;gBACR;oBACE,OAAO,EAAE,aAAa;oBACtB,OAAO;oBACP,QAAQ;oBACR,MAAM;iBACP;aACF;SACF,CAAC;QAEF,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,gBAAgB,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAU,EACV,MAAgB,EAChB,MAAe;IAEf,MAAM,cAAc,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAU,EACV,OAAqB,EACrB,cAA4C,EAC5C,OAAoC,EACpC,MAAe,EACf,QAAkB,EAClB,yBAAoD;IAKpD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAwB,CAAC;IACrD,MAAM,gBAAgB,GAAgD,EAAE,CAAC;IAEzE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC;QAC9B,IAAI,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC/C,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,mBAAmB,GACvB,CAAC,CAAC,QAAQ,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;QAEtD,MAAM,SAAS,GAAG,MAAM,4BAA4B,CAClD,IAAI,EACJ,OAAO,EACP,GAAG,EACH,mBAAmB,CACpB,CAAC;QAEF,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAC5C,MAAM,aAAa,GAA4B,EAAE,CAAC;QAClD,MAAM,oBAAoB,GAAG,wBAAwB,CACnD,OAAO,EACP,GAAG,EACH,yBAAyB,CAC1B,CAAC;QACF,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC;QAElD,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAClD,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,WAAW,KAAK,SAAS;gBAAE,SAAS;YACxC,IAAI,oBAAoB,EAAE,CAAC,EAAE,CAAC;gBAAE,SAAS;YAEzC,wEAAwE;YACxE,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;YACpB,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,GAAG;gBAAE,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACxD,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE;YAC5D,oBAAoB;YACpB,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,KAAK;YAC5C,UAAU;YACV,aAAa;YACb,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,aAAa,EAAE;SAC1E,CAAC,CAAC;QAEH,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAU,EACV,eAAqC,EACrC,OAAqB,EACrB,cAA4C;IAE5C,MAAM,mBAAmB,GAAmB,IAAI,GAAG,EAAE,CAAC;IAEtD,KAAK,MAAM,WAAW,IAAI,eAAe,IAAI,EAAE,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,8BAA8B,CACnD,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,cAAc,CACf,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,MAAM,KAAK,GACT,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;gBAC9D,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAC/B,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,IAAU,EACV,QAAgB,EAChB,OAAqB,EACrB,cAA4C;IAE5C,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE7E,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,wBAAwB,CACxC,IAAI,EACJ,cAAc,CAAC,QAAQ,CAAC,EACxB,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,MAAM,CACf,CAAC;QACF,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;QACxC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC;QACvC,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,yBAAyB,CACnC,IAAI,EACJ,aAAa,EACb,cAAc,CACf,CAAC;YACF,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC1D,MAAM,mBAAmB,GACvB,CAAC,CAAC,QAAQ;gBACV,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YACrE,MAAM,aAAa,GAAG,MAAM,4BAA4B,CACtD,IAAI,EACJ,aAAa,EACb,GAAG,EACH,mBAAmB,CACpB,CAAC;YACF,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,0BAA0B,CAAC,IAAI,EAAE,aAAa,EAAE;YACrD,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,2BAA2B,CAC3C,IAAI,EACJ,QAAQ,EACR,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,MAAM,CACf,CAAC;IACF,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;IACxC,OAAO,0BAA0B,CAAC,IAAI,EAAE,aAAa,EAAE;QACrD,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,GAAG,CAAC,YAAY,IAAI,QAAQ;KACpC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,IAAU,EACV,OAAe,EACf,KAAoB;IAEpB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC,aAAa,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC3E,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,OAAuB,EACvB,aAA6B;IAE7B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,IAAI,CAAC;QACH,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAC7B,kBAAkB,EAClB,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,CACpC,CAAC;YACF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;YAC9C,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;gBACtC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,GAAG,CACf,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CACjC,OAAO;aACJ,IAAI,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC;aAClE,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CACnB,CACF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,cAAc,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,IAAU,EACV,OAAqB,EACrB,cAA4C,EAC5C,mBAAmC;IAEnC,MAAM,gBAAgB,GAA8B,IAAI,GAAG,EAAE,CAAC;IAC9D,IAAI,CAAC,mBAAmB,CAAC,IAAI;QAAE,OAAO,gBAAgB,CAAC;IACvD,MAAM,mBAAmB,GAAG,MAAM,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,KAAa,EAAE,GAAW,EAAE,EAAE;QACnE,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACtD,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/B,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAAe,EAAiB,EAAE;QACnE,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO;QACxC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE5B,MAAM,GAAG,GAAG,yBAAyB,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,mBAAmB,GACvB,CAAC,CAAC,QAAQ;YACV,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,MAAM,4BAA4B,CAClD,IAAI,EACJ,OAAO,EACP,GAAG,EACH,mBAAmB,CACpB,CAAC;QACF,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACzD,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;QAED,KAAK,MAAM,YAAY,IAAI,cAAc,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC;YAC1E,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,KAAK,EAC9B,OAAe,EACf,aAAqB,EACN,EAAE;QACjB,MAAM,GAAG,GAAG,yBAAyB,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO;QAEjE,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAClC,KAAK,MAAM,UAAU,IAAI,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAChE,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAClE,IAAI,OAAO,SAAS,KAAK,QAAQ;gBAAE,SAAS;YAC5C,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,GAAG;gBAAE,SAAS;YACnD,MAAM,mBAAmB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC;QACtE,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;YAC3C,MAAM,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9D,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,IAAI,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG;gBAAE,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;QACvD,CAAC;QACD,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,IAAU,EACV,OAAqB;IAErB,MAAM,mBAAmB,GAAwB,IAAI,GAAG,EAAE,CAAC;IAE3D,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,IAAI,CAAC;YACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAC1C,mBAAmB,EACnB,EAAE,OAAO,EAAE,CACZ,CAAC;YACF,IAAI,OAAO,aAAa,KAAK,QAAQ;gBAAE,SAAS;YAChD,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5D,WAAW,CAAC,IAAI,CAAC;gBACf,YAAY,EAAE,OAAO;gBACrB,iBAAiB,EAAE,aAAa;aACjC,CAAC,CAAC;YACH,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,SAAS,wBAAwB,CAC/B,OAAe,EACf,GAAgC,EAChC,yBAAoD;IAEpD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,SAAS,GAAG,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,SAAS,EAAE,MAAM;QAAE,OAAO,SAAS,CAAC;IAEzC,OAAO,CAAC,aAAqB,EAAW,EAAE;QACxC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE5C,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAE,CAAC;YACjC,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC3B,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;YACf,CAAC;iBAAM,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;gBAChC,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,SAAiB;IAClD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED,SAAS,yBAAyB,CAChC,IAAU,EACV,OAAe,EACf,cAA4C;IAE5C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,4BAA4B,CACzC,IAAU,EACV,OAAe,EACf,GAAoB,EACpB,mBAA4B;IAE5B,IAAI,CAAC,mBAAmB;QAAE,OAAO,GAAG,CAAC,WAAW,CAAC;IACjD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAC1C,mBAAmB,EACnB,EAAE,OAAO,EAAE,CACZ,CAAC;QACF,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAChE,IAAI,OAAO,SAAS,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;QACtD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,EAAE;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,WAAW,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAU,EACV,OAAqB,EACrB,YAAuC,EACvC,QAAkB;IAKlB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvD,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC9B,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAEzC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,SAAS;YACnC,IAAI,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,MAAM;gBAAE,SAAS;YAC1D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAElB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YAErE,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;gBAC3C,IAAI,CAAC;oBACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,CAE5C,mBAAmB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC5C,OAAO,aAAa,CAAC;gBACvB,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YAEL,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,qEAAqE;gBACrE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBAChC,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,kBAAkB,EAAE,CAAC;YACrE,MAAM,WAAW,GAAG,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;YAEnD,MAAM,QAAQ,GAAG,WAAW;gBAC1B,CAAC,CAAC,WAAW,CAAC,SAAS,IAAI,GAAG,EAAE,WAAW,CAAC;gBAC5C,CAAC,CAAC,SAAS,CAAC;YAEd,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC/B,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAqB,EACrB,YAAuC,EACvC,gBAA6D,EAC7D,SAA8B,EAC9B,oBAAyC,EACzC,QAAkB;IAElB,MAAM,gBAAgB,GAA2B,EAAE,CAAC;IACpD,MAAM,cAAc,GAA2B,EAAE,CAAC;IAElD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG,CAAC;QAEzC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QAED,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,gBAAgB,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,gBAAgB,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,8EAA8E;QAC9E,IAAI,SAAS;YAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,WAAW,GACf,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO;QACnE,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO;QAC5B,EAAE,CAAC;IACL,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAE3D,OAAO;QACL,YAAY;QACZ,gBAAgB;QAChB,cAAc;QACd,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvC,OAAO;gBACL,OAAO;gBACP,OAAO;gBACP,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE;gBAC9B,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE;aAC3B,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC","sourcesContent":["import type { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"../../cdp.js\";\nimport { Page } from \"../../page.js\";\nimport { Frame } from \"../../frame.js\";\nimport {\n FrameSelectorResolver,\n type ResolvedNode,\n type SelectorQuery,\n} from \"../../selectorResolver.js\";\nimport { v3Logger } from \"../../../logger.js\";\nimport type {\n FrameContext,\n FrameDomMaps,\n FrameParentIndex,\n HybridSnapshot,\n SnapshotOptions,\n SessionDomIndex,\n} from \"../../../types/private/index.js\";\nimport { a11yForFrame } from \"./a11yTree.js\";\nimport {\n resolveCssFocusFrameAndTail,\n resolveFocusFrameAndTail,\n listChildrenOf,\n} from \"./focusSelectors.js\";\nimport {\n buildSessionDomIndex,\n domMapsForSession,\n relativizeXPath,\n} from \"./domTree.js\";\nimport { injectSubtrees } from \"./treeFormatUtils.js\";\nimport { ownerSession, parentSession } from \"./sessions.js\";\nimport { normalizeXPath, prefixXPath } from \"./xpathUtils.js\";\n\ntype IgnoredNodeMap = Map<string, Set<number>>;\ntype Interval = { start: number; end: number };\ntype ExclusionIntervalsByFrame = Map<string, Interval[]>;\ntype ChildFrameHost = { childFrameId: string; hostBackendNodeId: number };\ntype ChildFramesByParent = Map<string, ChildFrameHost[]>;\n\n/**\n * Capture a hybrid DOM + Accessibility snapshot for the provided page.\n *\n * Flow overview:\n * 1. (Optional) Scope directly to a requested selector. We walk iframe hops to\n * find the owning frame, build just that frame’s DOM + AX tree, and bail out\n * early when the subtree satisfies the caller.\n * 2. Build DOM indexes for every unique CDP session. DOM.getDocument is called\n * once per session and hydrated so per-frame slices can share the result.\n * 3. Slice each frame’s DOM data from its session index and fetch its AX tree.\n * This yields relative XPath/tag/url maps for the document rooted at that frame.\n * 4. Walk the frame tree to compute absolute iframe prefixes. Every child frame\n * needs the XPath of the iframe element that hosts it so we can prefix maps.\n * 5. Merge all per-frame results into global combined maps and stitch the text\n * outline. The final payload mirrors the legacy shape but is built in layers.\n *\n * Each numbered block below references the step above for easier debugging.\n */\nexport async function captureHybridSnapshot(\n page: Page,\n options?: SnapshotOptions,\n): Promise<HybridSnapshot> {\n const pierce = options?.pierceShadow ?? true;\n const includeIframes = options?.includeIframes !== false;\n const hasIgnoreSelectors = (options?.ignoreSelectors?.length ?? 0) > 0;\n\n const context = buildFrameContext(page);\n const framesInScope = includeIframes ? [...context.frames] : [context.rootId];\n if (!framesInScope.includes(context.rootId)) {\n framesInScope.unshift(context.rootId);\n }\n\n if (!hasIgnoreSelectors) {\n const scopedSnapshot = await tryScopedSnapshot(\n page,\n options,\n context,\n pierce,\n new Map<string, SessionDomIndex>(),\n new Map(),\n );\n if (scopedSnapshot) return scopedSnapshot;\n }\n\n const sessionToIndex = await buildSessionIndexes(page, framesInScope, pierce);\n const ignoredNodesByFrame = await resolveIgnoredNodes(\n page,\n options?.ignoreSelectors,\n context,\n sessionToIndex,\n );\n const exclusionIntervalsByFrame = await buildFrameExclusionIntervals(\n page,\n context,\n sessionToIndex,\n ignoredNodesByFrame,\n );\n if (hasIgnoreSelectors) {\n const scopedSnapshot = await tryScopedSnapshot(\n page,\n options,\n context,\n pierce,\n sessionToIndex,\n exclusionIntervalsByFrame,\n );\n if (scopedSnapshot) return scopedSnapshot;\n }\n\n const { perFrameMaps, perFrameOutlines } = await collectPerFrameMaps(\n page,\n context,\n sessionToIndex,\n options,\n pierce,\n framesInScope,\n exclusionIntervalsByFrame,\n );\n const { absPrefix, iframeHostEncByChild } = await computeFramePrefixes(\n page,\n context,\n perFrameMaps,\n framesInScope,\n );\n\n return mergeFramesIntoSnapshot(\n context,\n perFrameMaps,\n perFrameOutlines,\n absPrefix,\n iframeHostEncByChild,\n framesInScope,\n );\n}\n\n/**\n * Snapshot the current frame tree so downstream helpers have consistent topology\n * without re-querying CDP. The map is intentionally shallow (frameId → parentId)\n * so it is serializable/testable without holding on to CDP handles.\n */\nexport function buildFrameContext(page: Page): FrameContext {\n const rootId = page.mainFrameId();\n const frameTree = page.asProtocolFrameTree(rootId);\n const parentByFrame: FrameParentIndex = new Map();\n (function index(n: Protocol.Page.FrameTree, parent: string | null) {\n parentByFrame.set(n.frame.id, parent);\n for (const c of n.childFrames ?? []) index(c, n.frame.id);\n })(frameTree, null);\n const frames = page.listAllFrameIds();\n return { rootId, parentByFrame, frames };\n}\n\n/**\n * Step 1 – scoped snapshot fast-path. If a selector is provided we try to:\n * 1) Resolve the selector (XPath or CSS) across iframes.\n * 2) Build DOM + AX data only for the owning frame.\n * 3) Bail out early when the selector's subtree satisfies the request.\n *\n * Returns `null` when scoping fails (e.g., selector miss) so the caller can\n * fall back to the full multi-frame snapshot.\n */\nexport async function tryScopedSnapshot(\n page: Page,\n options: SnapshotOptions | undefined,\n context: FrameContext,\n pierce: boolean,\n sessionToIndex: Map<string, SessionDomIndex>,\n exclusionIntervalsByFrame: ExclusionIntervalsByFrame,\n): Promise<HybridSnapshot | null> {\n const requestedFocus = options?.focusSelector?.trim();\n if (!requestedFocus) return null;\n\n const logScopeFallback = () => {\n v3Logger({\n message: `Unable to narrow scope with selector. Falling back to using full DOM`,\n level: 1,\n auxiliary: {\n arguments: {\n value: `selector: ${options?.focusSelector?.trim()}`,\n type: \"string\",\n },\n },\n });\n };\n\n try {\n let targetFrameId: string;\n let tailSelector: string | undefined;\n let absPrefix: string | undefined;\n\n const looksLikeXPath =\n /^xpath=/i.test(requestedFocus) || requestedFocus.startsWith(\"/\");\n if (looksLikeXPath) {\n const focus = normalizeXPath(requestedFocus);\n const hit = await resolveFocusFrameAndTail(\n page,\n focus,\n context.parentByFrame,\n context.rootId,\n );\n targetFrameId = hit.targetFrameId;\n tailSelector = hit.tailXPath || undefined;\n absPrefix = hit.absPrefix;\n } else {\n const cssHit = await resolveCssFocusFrameAndTail(\n page,\n requestedFocus,\n context.parentByFrame,\n context.rootId,\n );\n targetFrameId = cssHit.targetFrameId;\n tailSelector = cssHit.tailSelector || undefined;\n absPrefix = cssHit.absPrefix;\n }\n\n const owningSess = ownerSession(page, targetFrameId);\n const parentId = context.parentByFrame.get(targetFrameId);\n const sameSessionAsParent =\n !!parentId &&\n ownerSession(page, parentId) === ownerSession(page, targetFrameId);\n const { tagNameMap, xpathMap, scrollableMap } = await domMapsForSession(\n owningSess,\n targetFrameId,\n pierce,\n (fid, be) => `${page.getOrdinal(fid)}-${be}`,\n sameSessionAsParent,\n );\n\n const { outline, urlMap, scopeApplied } = await a11yForFrame(\n owningSess,\n targetFrameId,\n {\n focusSelector: tailSelector || undefined,\n isIgnoredBackendNode: makeIsIgnoredBackendNode(\n targetFrameId,\n ownerSessionIndexForFrame(page, targetFrameId, sessionToIndex),\n exclusionIntervalsByFrame,\n ),\n tagNameMap,\n experimental: options?.experimental ?? false,\n scrollableMap,\n encode: (backendNodeId) =>\n `${page.getOrdinal(targetFrameId)}-${backendNodeId}`,\n },\n );\n\n const scopedXpathMap: Record<string, string> = {};\n const isIgnoredBackendNode = makeIsIgnoredBackendNode(\n targetFrameId,\n ownerSessionIndexForFrame(page, targetFrameId, sessionToIndex),\n exclusionIntervalsByFrame,\n );\n const abs = absPrefix ?? \"\";\n const isRoot = !abs || abs === \"/\";\n if (isRoot) {\n for (const [encId, xp] of Object.entries(xpathMap)) {\n const backendNodeId = parseEncodedBackendNodeId(encId);\n if (\n typeof backendNodeId === \"number\" &&\n isIgnoredBackendNode?.(backendNodeId)\n ) {\n continue;\n }\n scopedXpathMap[encId] = xp;\n }\n } else {\n // Prefix relative XPaths so the scoped result matches the global encoding.\n for (const [encId, xp] of Object.entries(xpathMap)) {\n const backendNodeId = parseEncodedBackendNodeId(encId);\n if (\n typeof backendNodeId === \"number\" &&\n isIgnoredBackendNode?.(backendNodeId)\n ) {\n continue;\n }\n scopedXpathMap[encId] = prefixXPath(abs, xp);\n }\n }\n\n const scopedUrlMap: Record<string, string> = { ...urlMap };\n\n const snapshot: HybridSnapshot = {\n combinedTree: outline,\n combinedXpathMap: scopedXpathMap,\n combinedUrlMap: scopedUrlMap,\n perFrame: [\n {\n frameId: targetFrameId,\n outline,\n xpathMap,\n urlMap,\n },\n ],\n };\n\n if (scopeApplied) {\n return snapshot;\n }\n\n logScopeFallback();\n } catch {\n logScopeFallback();\n }\n return null;\n}\n\n/**\n * Step 2 – call DOM.getDocument once per unique CDP session and hydrate the\n * result so per-frame slices can share the structure. We key by session id\n * because same process iframes live inside the same session.\n */\nexport async function buildSessionIndexes(\n page: Page,\n frames: string[],\n pierce: boolean,\n): Promise<Map<string, SessionDomIndex>> {\n const sessionToIndex = new Map<string, SessionDomIndex>();\n const sessionById = new Map<string, CDPSessionLike>();\n for (const frameId of frames) {\n const sess = ownerSession(page, frameId);\n const sid = sess.id ?? \"root\";\n if (!sessionById.has(sid)) sessionById.set(sid, sess);\n }\n for (const [sid, sess] of sessionById.entries()) {\n const idx = await buildSessionDomIndex(sess, pierce);\n sessionToIndex.set(sid, idx);\n }\n return sessionToIndex;\n}\n\n/**\n * Step 3 – derive per-frame DOM maps and accessibility outlines.\n * Each frame:\n * - slices the shared session index down to its document root\n * - builds frame-aware encoded ids (ordinal-backendNodeId)\n * - collects tag/xpath/scrollability maps for DOM-based lookups\n * - fetches its AX tree to produce outlines and URL maps\n */\nexport async function collectPerFrameMaps(\n page: Page,\n context: FrameContext,\n sessionToIndex: Map<string, SessionDomIndex>,\n options: SnapshotOptions | undefined,\n pierce: boolean,\n frameIds: string[],\n exclusionIntervalsByFrame: ExclusionIntervalsByFrame,\n): Promise<{\n perFrameMaps: Map<string, FrameDomMaps>;\n perFrameOutlines: Array<{ frameId: string; outline: string }>;\n}> {\n const perFrameMaps = new Map<string, FrameDomMaps>();\n const perFrameOutlines: Array<{ frameId: string; outline: string }> = [];\n\n for (const frameId of frameIds) {\n const sess = ownerSession(page, frameId);\n const sid = sess.id ?? \"root\";\n let idx = sessionToIndex.get(sid);\n if (!idx) {\n idx = await buildSessionDomIndex(sess, pierce);\n sessionToIndex.set(sid, idx);\n }\n\n const parentId = context.parentByFrame.get(frameId);\n const sameSessionAsParent =\n !!parentId && ownerSession(page, parentId) === sess;\n\n const docRootBe = await resolveFrameDocRootBackendId(\n page,\n frameId,\n idx,\n sameSessionAsParent,\n );\n\n const tagNameMap: Record<string, string> = {};\n const xpathMap: Record<string, string> = {};\n const scrollableMap: Record<string, boolean> = {};\n const isIgnoredBackendNode = makeIsIgnoredBackendNode(\n frameId,\n idx,\n exclusionIntervalsByFrame,\n );\n const enc = (be: number) => `${page.getOrdinal(frameId)}-${be}`;\n const baseAbs = idx.absByBe.get(docRootBe) ?? \"/\";\n\n for (const [be, nodeAbs] of idx.absByBe.entries()) {\n const nodeDocRoot = idx.docRootOf.get(be);\n if (nodeDocRoot !== docRootBe) continue;\n if (isIgnoredBackendNode?.(be)) continue;\n\n // Translate absolute XPaths into document-relative ones for this frame.\n const rel = relativizeXPath(baseAbs, nodeAbs);\n const key = enc(be);\n xpathMap[key] = rel;\n const tag = idx.tagByBe.get(be);\n if (tag) tagNameMap[key] = tag;\n if (idx.scrollByBe.get(be)) scrollableMap[key] = true;\n }\n\n const { outline, urlMap } = await a11yForFrame(sess, frameId, {\n isIgnoredBackendNode,\n experimental: options?.experimental ?? false,\n tagNameMap,\n scrollableMap,\n encode: (backendNodeId) => `${page.getOrdinal(frameId)}-${backendNodeId}`,\n });\n\n perFrameOutlines.push({ frameId, outline });\n perFrameMaps.set(frameId, { tagNameMap, xpathMap, scrollableMap, urlMap });\n }\n\n return { perFrameMaps, perFrameOutlines };\n}\n\nexport async function resolveIgnoredNodes(\n page: Page,\n ignoreSelectors: string[] | undefined,\n context: FrameContext,\n sessionToIndex: Map<string, SessionDomIndex>,\n): Promise<IgnoredNodeMap> {\n const ignoredNodesByFrame: IgnoredNodeMap = new Map();\n\n for (const rawSelector of ignoreSelectors ?? []) {\n const selector = rawSelector.trim();\n if (!selector) continue;\n\n try {\n const resolved = await resolveIgnoredNodesForSelector(\n page,\n selector,\n context,\n sessionToIndex,\n );\n for (const match of resolved) {\n const nodes =\n ignoredNodesByFrame.get(match.frameId) ?? new Set<number>();\n nodes.add(match.backendNodeId);\n ignoredNodesByFrame.set(match.frameId, nodes);\n }\n } catch {\n continue;\n }\n }\n\n return ignoredNodesByFrame;\n}\n\nasync function resolveIgnoredNodesForSelector(\n page: Page,\n selector: string,\n context: FrameContext,\n sessionToIndex: Map<string, SessionDomIndex>,\n): Promise<Array<{ frameId: string; backendNodeId: number }>> {\n const looksLikeXPath = /^xpath=/i.test(selector) || selector.startsWith(\"/\");\n\n if (looksLikeXPath) {\n const hit = await resolveFocusFrameAndTail(\n page,\n normalizeXPath(selector),\n context.parentByFrame,\n context.rootId,\n );\n const targetFrameId = hit.targetFrameId;\n const tailXPath = hit.tailXPath || \"/\";\n if (tailXPath === \"/\") {\n const idx = ownerSessionIndexForFrame(\n page,\n targetFrameId,\n sessionToIndex,\n );\n if (!idx) return [];\n const parentId = context.parentByFrame.get(targetFrameId);\n const sameSessionAsParent =\n !!parentId &&\n ownerSession(page, parentId) === ownerSession(page, targetFrameId);\n const backendNodeId = await resolveFrameDocRootBackendId(\n page,\n targetFrameId,\n idx,\n sameSessionAsParent,\n );\n return [{ frameId: targetFrameId, backendNodeId }];\n }\n return resolveIgnoredNodesInFrame(page, targetFrameId, {\n kind: \"xpath\",\n value: tailXPath,\n });\n }\n\n const hit = await resolveCssFocusFrameAndTail(\n page,\n selector,\n context.parentByFrame,\n context.rootId,\n );\n const targetFrameId = hit.targetFrameId;\n return resolveIgnoredNodesInFrame(page, targetFrameId, {\n kind: \"css\",\n value: hit.tailSelector || selector,\n });\n}\n\nasync function resolveIgnoredNodesInFrame(\n page: Page,\n frameId: string,\n query: SelectorQuery,\n): Promise<Array<{ frameId: string; backendNodeId: number }>> {\n const session = ownerSession(page, frameId);\n const frame = new Frame(session, frameId, \"\", false);\n const resolver = new FrameSelectorResolver(frame);\n const resolvedNodes = await resolver.resolveAll(query);\n if (!resolvedNodes.length) return [];\n\n const backendNodeIds = await describeResolvedNodes(session, resolvedNodes);\n return backendNodeIds.map((backendNodeId) => ({ frameId, backendNodeId }));\n}\n\nasync function describeResolvedNodes(\n session: CDPSessionLike,\n resolvedNodes: ResolvedNode[],\n): Promise<number[]> {\n const backendNodeIds = new Set<number>();\n\n try {\n for (const resolvedNode of resolvedNodes) {\n const desc = await session.send<Protocol.DOM.DescribeNodeResponse>(\n \"DOM.describeNode\",\n { objectId: resolvedNode.objectId },\n );\n const backendNodeId = desc.node.backendNodeId;\n if (typeof backendNodeId === \"number\") {\n backendNodeIds.add(backendNodeId);\n }\n }\n } finally {\n await Promise.all(\n resolvedNodes.map((resolvedNode) =>\n session\n .send(\"Runtime.releaseObject\", { objectId: resolvedNode.objectId })\n .catch(() => {}),\n ),\n );\n }\n\n return [...backendNodeIds];\n}\n\nexport async function buildFrameExclusionIntervals(\n page: Page,\n context: FrameContext,\n sessionToIndex: Map<string, SessionDomIndex>,\n ignoredNodesByFrame: IgnoredNodeMap,\n): Promise<ExclusionIntervalsByFrame> {\n const intervalsByFrame: ExclusionIntervalsByFrame = new Map();\n if (!ignoredNodesByFrame.size) return intervalsByFrame;\n const childFramesByParent = await resolveChildFramesByParent(page, context);\n const excludedFrames = new Set<string>();\n\n const pushInterval = (frameId: string, start: number, end: number) => {\n const intervals = intervalsByFrame.get(frameId) ?? [];\n intervals.push({ start, end });\n intervalsByFrame.set(frameId, intervals);\n };\n\n const excludeFrameSubtree = async (frameId: string): Promise<void> => {\n if (excludedFrames.has(frameId)) return;\n excludedFrames.add(frameId);\n\n const idx = ownerSessionIndexForFrame(page, frameId, sessionToIndex);\n if (!idx) return;\n const parentId = context.parentByFrame.get(frameId);\n const sameSessionAsParent =\n !!parentId &&\n ownerSession(page, parentId) === ownerSession(page, frameId);\n const docRootBe = await resolveFrameDocRootBackendId(\n page,\n frameId,\n idx,\n sameSessionAsParent,\n );\n const start = idx.enterByBe.get(docRootBe);\n const end = idx.exitByBe.get(docRootBe);\n if (typeof start === \"number\" && typeof end === \"number\") {\n pushInterval(frameId, start, end);\n }\n\n for (const childFrameId of listChildrenOf(context.parentByFrame, frameId)) {\n await excludeFrameSubtree(childFrameId);\n }\n };\n\n const excludeIgnoredNode = async (\n frameId: string,\n backendNodeId: number,\n ): Promise<void> => {\n const idx = ownerSessionIndexForFrame(page, frameId, sessionToIndex);\n if (!idx) return;\n const start = idx.enterByBe.get(backendNodeId);\n const end = idx.exitByBe.get(backendNodeId);\n if (typeof start !== \"number\" || typeof end !== \"number\") return;\n\n pushInterval(frameId, start, end);\n for (const childFrame of childFramesByParent.get(frameId) ?? []) {\n const hostEnter = idx.enterByBe.get(childFrame.hostBackendNodeId);\n if (typeof hostEnter !== \"number\") continue;\n if (hostEnter < start || hostEnter > end) continue;\n await excludeFrameSubtree(childFrame.childFrameId);\n }\n };\n\n for (const [frameId, backendNodeIds] of ignoredNodesByFrame.entries()) {\n for (const backendNodeId of backendNodeIds) {\n await excludeIgnoredNode(frameId, backendNodeId);\n }\n }\n\n for (const [frameId, intervals] of intervalsByFrame.entries()) {\n intervals.sort((a, b) => a.start - b.start || a.end - b.end);\n const merged: Interval[] = [];\n for (const interval of intervals) {\n const prev = merged[merged.length - 1];\n if (!prev || interval.start > prev.end) {\n merged.push({ ...interval });\n continue;\n }\n if (interval.end > prev.end) prev.end = interval.end;\n }\n intervalsByFrame.set(frameId, merged);\n }\n\n return intervalsByFrame;\n}\n\nasync function resolveChildFramesByParent(\n page: Page,\n context: FrameContext,\n): Promise<ChildFramesByParent> {\n const childFramesByParent: ChildFramesByParent = new Map();\n\n for (const frameId of context.frames) {\n const parentId = context.parentByFrame.get(frameId);\n if (!parentId) continue;\n\n const session = parentSession(page, context.parentByFrame, frameId);\n if (!session) continue;\n\n try {\n const { backendNodeId } = await session.send<{ backendNodeId?: number }>(\n \"DOM.getFrameOwner\",\n { frameId },\n );\n if (typeof backendNodeId !== \"number\") continue;\n const childFrames = childFramesByParent.get(parentId) ?? [];\n childFrames.push({\n childFrameId: frameId,\n hostBackendNodeId: backendNodeId,\n });\n childFramesByParent.set(parentId, childFrames);\n } catch {\n continue;\n }\n }\n\n return childFramesByParent;\n}\n\nfunction makeIsIgnoredBackendNode(\n frameId: string,\n idx: SessionDomIndex | undefined,\n exclusionIntervalsByFrame: ExclusionIntervalsByFrame,\n): ((backendNodeId: number) => boolean) | undefined {\n if (!idx) return undefined;\n const intervals = exclusionIntervalsByFrame.get(frameId);\n if (!intervals?.length) return undefined;\n\n return (backendNodeId: number): boolean => {\n const enter = idx.enterByBe.get(backendNodeId);\n if (typeof enter !== \"number\") return false;\n\n let lo = 0;\n let hi = intervals.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const interval = intervals[mid]!;\n if (enter < interval.start) {\n hi = mid - 1;\n } else if (enter > interval.end) {\n lo = mid + 1;\n } else {\n return true;\n }\n }\n return false;\n };\n}\n\nfunction parseEncodedBackendNodeId(encodedId: string): number | undefined {\n const parts = encodedId.split(\"-\");\n if (parts.length !== 2) return undefined;\n const backendNodeId = Number(parts[1]);\n return Number.isFinite(backendNodeId) ? backendNodeId : undefined;\n}\n\nfunction ownerSessionIndexForFrame(\n page: Page,\n frameId: string,\n sessionToIndex: Map<string, SessionDomIndex>,\n): SessionDomIndex | undefined {\n const session = ownerSession(page, frameId);\n return sessionToIndex.get(session.id ?? \"root\");\n}\n\nasync function resolveFrameDocRootBackendId(\n page: Page,\n frameId: string,\n idx: SessionDomIndex,\n sameSessionAsParent: boolean,\n): Promise<number> {\n if (!sameSessionAsParent) return idx.rootBackend;\n const session = ownerSession(page, frameId);\n try {\n const { backendNodeId } = await session.send<{ backendNodeId?: number }>(\n \"DOM.getFrameOwner\",\n { frameId },\n );\n if (typeof backendNodeId === \"number\") {\n const docRootBe = idx.contentDocRootByIframe.get(backendNodeId);\n if (typeof docRootBe === \"number\") return docRootBe;\n }\n } catch {\n //\n }\n return idx.rootBackend;\n}\n\n/**\n * Step 4 – walk the frame tree (parent-first) to compute absolute prefixes for\n * every frame. The prefix is the absolute XPath of the iframe element hosting\n * the frame, so we can later convert relative XPaths into cross-frame ones.\n */\nexport async function computeFramePrefixes(\n page: Page,\n context: FrameContext,\n perFrameMaps: Map<string, FrameDomMaps>,\n frameIds: string[],\n): Promise<{\n absPrefix: Map<string, string>;\n iframeHostEncByChild: Map<string, string>;\n}> {\n const absPrefix = new Map<string, string>();\n const iframeHostEncByChild = new Map<string, string>();\n absPrefix.set(context.rootId, \"\");\n const included = new Set(frameIds);\n\n const queue: string[] = [];\n if (included.has(context.rootId)) {\n queue.push(context.rootId);\n }\n\n while (queue.length) {\n const parent = queue.shift()!;\n const parentAbs = absPrefix.get(parent)!;\n\n for (const child of context.frames) {\n if (!included.has(child)) continue;\n if (context.parentByFrame.get(child) !== parent) continue;\n queue.push(child);\n\n const parentSess = parentSession(page, context.parentByFrame, child);\n\n const ownerBackendNodeId = await (async () => {\n try {\n const { backendNodeId } = await parentSess.send<{\n backendNodeId?: number;\n }>(\"DOM.getFrameOwner\", { frameId: child });\n return backendNodeId;\n } catch {\n return undefined;\n }\n })();\n\n if (!ownerBackendNodeId) {\n // OOPIFs resolved via a different session inherit the parent prefix.\n absPrefix.set(child, parentAbs);\n continue;\n }\n\n const parentDom = perFrameMaps.get(parent);\n const iframeEnc = `${page.getOrdinal(parent)}-${ownerBackendNodeId}`;\n const iframeXPath = parentDom?.xpathMap[iframeEnc];\n\n const childAbs = iframeXPath\n ? prefixXPath(parentAbs || \"/\", iframeXPath)\n : parentAbs;\n\n absPrefix.set(child, childAbs);\n iframeHostEncByChild.set(child, iframeEnc);\n }\n }\n\n return { absPrefix, iframeHostEncByChild };\n}\n\n/**\n * Step 5 – merge per-frame maps into the combined snapshot payload. We prefix\n * each frame's relative XPaths with the absolute path collected in step 4,\n * merge URL maps, and stitch text outlines by nesting child trees under the\n * encoded id of their parent iframe host.\n */\nexport function mergeFramesIntoSnapshot(\n context: FrameContext,\n perFrameMaps: Map<string, FrameDomMaps>,\n perFrameOutlines: Array<{ frameId: string; outline: string }>,\n absPrefix: Map<string, string>,\n iframeHostEncByChild: Map<string, string>,\n frameIds: string[],\n): HybridSnapshot {\n const combinedXpathMap: Record<string, string> = {};\n const combinedUrlMap: Record<string, string> = {};\n\n for (const frameId of frameIds) {\n const maps = perFrameMaps.get(frameId);\n if (!maps) continue;\n\n const abs = absPrefix.get(frameId) ?? \"\";\n const isRoot = abs === \"\" || abs === \"/\";\n\n if (isRoot) {\n Object.assign(combinedXpathMap, maps.xpathMap);\n Object.assign(combinedUrlMap, maps.urlMap);\n continue;\n }\n\n for (const [encId, xp] of Object.entries(maps.xpathMap)) {\n combinedXpathMap[encId] = prefixXPath(abs, xp);\n }\n Object.assign(combinedUrlMap, maps.urlMap);\n }\n\n const idToTree = new Map<string, string>();\n for (const { frameId, outline } of perFrameOutlines) {\n const parentEnc = iframeHostEncByChild.get(frameId);\n // The key is the parent iframe's encoded id so injectSubtrees can nest lines.\n if (parentEnc) idToTree.set(parentEnc, outline);\n }\n\n const rootOutline =\n perFrameOutlines.find((o) => o.frameId === context.rootId)?.outline ??\n perFrameOutlines[0]?.outline ??\n \"\";\n const combinedTree = injectSubtrees(rootOutline, idToTree);\n\n return {\n combinedTree,\n combinedXpathMap,\n combinedUrlMap,\n perFrame: perFrameOutlines.map(({ frameId, outline }) => {\n const maps = perFrameMaps.get(frameId);\n return {\n frameId,\n outline,\n xpathMap: maps?.xpathMap ?? {},\n urlMap: maps?.urlMap ?? {},\n };\n }),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../../../../../lib/v3/understudy/a11y/snapshot/capture.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EACL,qBAAqB,GAGtB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAS9C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAS9D;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAU,EACV,OAAyB;IAEzB,MAAM,MAAM,GAAG,OAAO,EAAE,YAAY,IAAI,IAAI,CAAC;IAC7C,MAAM,cAAc,GAAG,OAAO,EAAE,cAAc,KAAK,KAAK,CAAC;IACzD,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IAEvE,MAAM,OAAO,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9E,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAC5C,IAAI,EACJ,OAAO,EACP,OAAO,EACP,MAAM,EACN,IAAI,GAAG,EAA2B,EAClC,IAAI,GAAG,EAAE,CACV,CAAC;QACF,IAAI,cAAc;YAAE,OAAO,cAAc,CAAC;IAC5C,CAAC;IAED,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;IAC9E,MAAM,mBAAmB,GAAG,MAAM,mBAAmB,CACnD,IAAI,EACJ,OAAO,EAAE,eAAe,EACxB,OAAO,EACP,cAAc,CACf,CAAC;IACF,MAAM,yBAAyB,GAAG,MAAM,4BAA4B,CAClE,IAAI,EACJ,OAAO,EACP,cAAc,EACd,mBAAmB,CACpB,CAAC;IACF,IAAI,kBAAkB,EAAE,CAAC;QACvB,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAC5C,IAAI,EACJ,OAAO,EACP,OAAO,EACP,MAAM,EACN,cAAc,EACd,yBAAyB,CAC1B,CAAC;QACF,IAAI,cAAc;YAAE,OAAO,cAAc,CAAC;IAC5C,CAAC;IAED,MAAM,EAAE,YAAY,EAAE,gBAAgB,EAAE,GAAG,MAAM,mBAAmB,CAClE,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,MAAM,EACN,aAAa,EACb,yBAAyB,CAC1B,CAAC;IACF,MAAM,EAAE,SAAS,EAAE,oBAAoB,EAAE,GAAG,MAAM,oBAAoB,CACpE,IAAI,EACJ,OAAO,EACP,YAAY,EACZ,aAAa,CACd,CAAC;IAEF,OAAO,uBAAuB,CAC5B,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,oBAAoB,EACpB,aAAa,CACd,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAU;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,aAAa,GAAqB,IAAI,GAAG,EAAE,CAAC;IAClD,CAAC,SAAS,KAAK,CAAC,CAA0B,EAAE,MAAqB;QAC/D,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,IAAI,EAAE;YAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;IACtC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AAC3C,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAU,EACV,OAAoC,EACpC,OAAqB,EACrB,MAAe,EACf,cAA4C,EAC5C,yBAAoD;IAEpD,MAAM,cAAc,GAAG,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAEjC,MAAM,gBAAgB,GAAG,GAAG,EAAE;QAC5B,QAAQ,CAAC;YACP,OAAO,EAAE,sEAAsE;YAC/E,KAAK,EAAE,CAAC;YACR,SAAS,EAAE;gBACT,SAAS,EAAE;oBACT,KAAK,EAAE,aAAa,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE;oBACpD,IAAI,EAAE,QAAQ;iBACf;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,IAAI,aAAqB,CAAC;QAC1B,IAAI,YAAgC,CAAC;QACrC,IAAI,SAA6B,CAAC;QAElC,MAAM,cAAc,GAClB,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACpE,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,KAAK,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC;YAC7C,MAAM,GAAG,GAAG,MAAM,wBAAwB,CACxC,IAAI,EACJ,KAAK,EACL,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,MAAM,CACf,CAAC;YACF,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;YAClC,YAAY,GAAG,GAAG,CAAC,SAAS,IAAI,SAAS,CAAC;YAC1C,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAC9C,IAAI,EACJ,cAAc,EACd,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,MAAM,CACf,CAAC;YACF,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;YACrC,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,SAAS,CAAC;YAChD,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAC/B,CAAC;QAED,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC1D,MAAM,mBAAmB,GACvB,CAAC,CAAC,QAAQ;YACV,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACrE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,MAAM,iBAAiB,CACrE,UAAU,EACV,aAAa,EACb,MAAM,EACN,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAC5C,mBAAmB,CACpB,CAAC;QAEF,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,YAAY,CAC1D,UAAU,EACV,aAAa,EACb;YACE,aAAa,EAAE,YAAY,IAAI,SAAS;YACxC,oBAAoB,EAAE,wBAAwB,CAC5C,aAAa,EACb,yBAAyB,CAAC,IAAI,EAAE,aAAa,EAAE,cAAc,CAAC,EAC9D,yBAAyB,CAC1B;YACD,UAAU;YACV,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,KAAK;YAC5C,aAAa;YACb,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,CACxB,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,aAAa,EAAE;SACvD,CACF,CAAC;QAEF,MAAM,cAAc,GAA2B,EAAE,CAAC;QAClD,MAAM,oBAAoB,GAAG,wBAAwB,CACnD,aAAa,EACb,yBAAyB,CAAC,IAAI,EAAE,aAAa,EAAE,cAAc,CAAC,EAC9D,yBAAyB,CAC1B,CAAC;QACF,MAAM,GAAG,GAAG,SAAS,IAAI,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,KAAK,GAAG,CAAC;QACnC,IAAI,MAAM,EAAE,CAAC;YACX,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnD,MAAM,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;gBACvD,IACE,OAAO,aAAa,KAAK,QAAQ;oBACjC,oBAAoB,EAAE,CAAC,aAAa,CAAC,EACrC,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,2EAA2E;YAC3E,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnD,MAAM,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;gBACvD,IACE,OAAO,aAAa,KAAK,QAAQ;oBACjC,oBAAoB,EAAE,CAAC,aAAa,CAAC,EACrC,CAAC;oBACD,SAAS;gBACX,CAAC;gBACD,cAAc,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAA2B,EAAE,GAAG,MAAM,EAAE,CAAC;QAE3D,MAAM,iBAAiB,GAAI,OAA4B,CAAC,YAAY,EAAE,CAAC;QAEvE,MAAM,QAAQ,GAAmB;YAC/B,YAAY,EAAE,iBAAiB;YAC/B,gBAAgB,EAAE,cAAc;YAChC,cAAc,EAAE,YAAY;YAC5B,QAAQ,EAAE;gBACR;oBACE,OAAO,EAAE,aAAa;oBACtB,OAAO,EAAE,iBAAiB;oBAC1B,QAAQ;oBACR,MAAM;iBACP;aACF;SACF,CAAC;QAEF,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,gBAAgB,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB,EAAE,CAAC;IACrB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAU,EACV,MAAgB,EAChB,MAAe;IAEf,MAAM,cAAc,GAAG,IAAI,GAAG,EAA2B,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC;QAC9B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrD,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAU,EACV,OAAqB,EACrB,cAA4C,EAC5C,OAAoC,EACpC,MAAe,EACf,QAAkB,EAClB,yBAAoD;IAKpD,MAAM,YAAY,GAAG,IAAI,GAAG,EAAwB,CAAC;IACrD,MAAM,gBAAgB,GAAgD,EAAE,CAAC;IAEzE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,MAAM,CAAC;QAC9B,IAAI,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC/C,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/B,CAAC;QAED,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,mBAAmB,GACvB,CAAC,CAAC,QAAQ,IAAI,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC;QAEtD,MAAM,SAAS,GAAG,MAAM,4BAA4B,CAClD,IAAI,EACJ,OAAO,EACP,GAAG,EACH,mBAAmB,CACpB,CAAC;QAEF,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAC5C,MAAM,aAAa,GAA4B,EAAE,CAAC;QAClD,MAAM,oBAAoB,GAAG,wBAAwB,CACnD,OAAO,EACP,GAAG,EACH,yBAAyB,CAC1B,CAAC;QACF,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QAChE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC;QAElD,KAAK,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YAClD,MAAM,WAAW,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1C,IAAI,WAAW,KAAK,SAAS;gBAAE,SAAS;YACxC,IAAI,oBAAoB,EAAE,CAAC,EAAE,CAAC;gBAAE,SAAS;YAEzC,wEAAwE;YACxE,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;YACpB,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YACpB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,GAAG;gBAAE,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;YAC/B,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACxD,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE;YAC5D,oBAAoB;YACpB,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,KAAK;YAC5C,UAAU;YACV,aAAa;YACb,MAAM,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,aAAa,EAAE;SAC1E,CAAC,CAAC;QAEH,gBAAgB,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5C,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;AAC5C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAU,EACV,eAAqC,EACrC,OAAqB,EACrB,cAA4C;IAE5C,MAAM,mBAAmB,GAAmB,IAAI,GAAG,EAAE,CAAC;IAEtD,KAAK,MAAM,WAAW,IAAI,eAAe,IAAI,EAAE,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,8BAA8B,CACnD,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,cAAc,CACf,CAAC;YACF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;gBAC7B,MAAM,KAAK,GACT,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,GAAG,EAAU,CAAC;gBAC9D,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAC/B,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,KAAK,UAAU,8BAA8B,CAC3C,IAAU,EACV,QAAgB,EAChB,OAAqB,EACrB,cAA4C;IAE5C,MAAM,cAAc,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAE7E,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,GAAG,GAAG,MAAM,wBAAwB,CACxC,IAAI,EACJ,cAAc,CAAC,QAAQ,CAAC,EACxB,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,MAAM,CACf,CAAC;QACF,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;QACxC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC;QACvC,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,yBAAyB,CACnC,IAAI,EACJ,aAAa,EACb,cAAc,CACf,CAAC;YACF,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAC1D,MAAM,mBAAmB,GACvB,CAAC,CAAC,QAAQ;gBACV,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YACrE,MAAM,aAAa,GAAG,MAAM,4BAA4B,CACtD,IAAI,EACJ,aAAa,EACb,GAAG,EACH,mBAAmB,CACpB,CAAC;YACF,OAAO,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,0BAA0B,CAAC,IAAI,EAAE,aAAa,EAAE;YACrD,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,2BAA2B,CAC3C,IAAI,EACJ,QAAQ,EACR,OAAO,CAAC,aAAa,EACrB,OAAO,CAAC,MAAM,CACf,CAAC;IACF,MAAM,aAAa,GAAG,GAAG,CAAC,aAAa,CAAC;IACxC,OAAO,0BAA0B,CAAC,IAAI,EAAE,aAAa,EAAE;QACrD,IAAI,EAAE,KAAK;QACX,KAAK,EAAE,GAAG,CAAC,YAAY,IAAI,QAAQ;KACpC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,IAAU,EACV,OAAe,EACf,KAAoB;IAEpB,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC,aAAa,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,cAAc,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IAC3E,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,OAAuB,EACvB,aAA6B;IAE7B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,IAAI,CAAC;QACH,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAC7B,kBAAkB,EAClB,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,CACpC,CAAC;YACF,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;YAC9C,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;gBACtC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,GAAG,CACf,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CACjC,OAAO;aACJ,IAAI,CAAC,uBAAuB,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC;aAClE,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CACnB,CACF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,GAAG,cAAc,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,IAAU,EACV,OAAqB,EACrB,cAA4C,EAC5C,mBAAmC;IAEnC,MAAM,gBAAgB,GAA8B,IAAI,GAAG,EAAE,CAAC;IAC9D,IAAI,CAAC,mBAAmB,CAAC,IAAI;QAAE,OAAO,gBAAgB,CAAC;IACvD,MAAM,mBAAmB,GAAG,MAAM,0BAA0B,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IAEzC,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,KAAa,EAAE,GAAW,EAAE,EAAE;QACnE,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACtD,SAAS,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/B,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAC;IAEF,MAAM,mBAAmB,GAAG,KAAK,EAAE,OAAe,EAAiB,EAAE;QACnE,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC;YAAE,OAAO;QACxC,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAE5B,MAAM,GAAG,GAAG,yBAAyB,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,mBAAmB,GACvB,CAAC,CAAC,QAAQ;YACV,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,KAAK,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,MAAM,4BAA4B,CAClD,IAAI,EACJ,OAAO,EACP,GAAG,EACH,mBAAmB,CACpB,CAAC;QACF,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC3C,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACzD,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACpC,CAAC;QAED,KAAK,MAAM,YAAY,IAAI,cAAc,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE,CAAC;YAC1E,MAAM,mBAAmB,CAAC,YAAY,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,KAAK,EAC9B,OAAe,EACf,aAAqB,EACN,EAAE;QACjB,MAAM,GAAG,GAAG,yBAAyB,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO;QAEjE,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAClC,KAAK,MAAM,UAAU,IAAI,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAChE,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;YAClE,IAAI,OAAO,SAAS,KAAK,QAAQ;gBAAE,SAAS;YAC5C,IAAI,SAAS,GAAG,KAAK,IAAI,SAAS,GAAG,GAAG;gBAAE,SAAS;YACnD,MAAM,mBAAmB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,mBAAmB,CAAC,OAAO,EAAE,EAAE,CAAC;QACtE,KAAK,MAAM,aAAa,IAAI,cAAc,EAAE,CAAC;YAC3C,MAAM,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;QAC9D,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;gBAC7B,SAAS;YACX,CAAC;YACD,IAAI,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG;gBAAE,IAAI,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;QACvD,CAAC;QACD,gBAAgB,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,IAAU,EACV,OAAqB;IAErB,MAAM,mBAAmB,GAAwB,IAAI,GAAG,EAAE,CAAC;IAE3D,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACpE,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,IAAI,CAAC;YACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAC1C,mBAAmB,EACnB,EAAE,OAAO,EAAE,CACZ,CAAC;YACF,IAAI,OAAO,aAAa,KAAK,QAAQ;gBAAE,SAAS;YAChD,MAAM,WAAW,GAAG,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5D,WAAW,CAAC,IAAI,CAAC;gBACf,YAAY,EAAE,OAAO;gBACrB,iBAAiB,EAAE,aAAa;aACjC,CAAC,CAAC;YACH,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACjD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IAED,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,SAAS,wBAAwB,CAC/B,OAAe,EACf,GAAgC,EAChC,yBAAoD;IAEpD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,SAAS,GAAG,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,CAAC,SAAS,EAAE,MAAM;QAAE,OAAO,SAAS,CAAC;IAEzC,OAAO,CAAC,aAAqB,EAAW,EAAE;QACxC,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE5C,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAE,CAAC;YACjC,IAAI,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAC3B,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;YACf,CAAC;iBAAM,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;gBAChC,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAAC,SAAiB;IAClD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AAED,SAAS,yBAAyB,CAChC,IAAU,EACV,OAAe,EACf,cAA4C;IAE5C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,KAAK,UAAU,4BAA4B,CACzC,IAAU,EACV,OAAe,EACf,GAAoB,EACpB,mBAA4B;IAE5B,IAAI,CAAC,mBAAmB;QAAE,OAAO,GAAG,CAAC,WAAW,CAAC;IACjD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAC1C,mBAAmB,EACnB,EAAE,OAAO,EAAE,CACZ,CAAC;QACF,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,GAAG,CAAC,sBAAsB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAChE,IAAI,OAAO,SAAS,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;QACtD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,EAAE;IACJ,CAAC;IACD,OAAO,GAAG,CAAC,WAAW,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAU,EACV,OAAqB,EACrB,YAAuC,EACvC,QAAkB;IAKlB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACvD,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC9B,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC;QAEzC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,SAAS;YACnC,IAAI,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,MAAM;gBAAE,SAAS;YAC1D,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAElB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YAErE,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE;gBAC3C,IAAI,CAAC;oBACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI,CAE5C,mBAAmB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;oBAC5C,OAAO,aAAa,CAAC;gBACvB,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,SAAS,CAAC;gBACnB,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;YAEL,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACxB,qEAAqE;gBACrE,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;gBAChC,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,kBAAkB,EAAE,CAAC;YACrE,MAAM,WAAW,GAAG,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;YAEnD,MAAM,QAAQ,GAAG,WAAW;gBAC1B,CAAC,CAAC,WAAW,CAAC,SAAS,IAAI,GAAG,EAAE,WAAW,CAAC;gBAC5C,CAAC,CAAC,SAAS,CAAC;YAEd,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC/B,oBAAoB,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAE,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAqB,EACrB,YAAuC,EACvC,gBAA6D,EAC7D,SAA8B,EAC9B,oBAAyC,EACzC,QAAkB;IAElB,MAAM,gBAAgB,GAA2B,EAAE,CAAC;IACpD,MAAM,cAAc,GAA2B,EAAE,CAAC;IAElD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG,CAAC;QAEzC,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3C,SAAS;QACX,CAAC;QAED,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,gBAAgB,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,gBAAgB,EAAE,CAAC;QACpD,MAAM,SAAS,GAAG,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACpD,8EAA8E;QAC9E,IAAI,SAAS;YAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,WAAW,GACf,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO;QACnE,gBAAgB,CAAC,CAAC,CAAC,EAAE,OAAO;QAC5B,EAAE,CAAC;IACL,MAAM,YAAY,GAChB,cAAc,CAAC,WAAW,EAAE,QAAQ,CACrC,CAAC,YAAY,EAAE,CAAC;IAEjB,OAAO;QACL,YAAY;QACZ,gBAAgB;QAChB,cAAc;QACd,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;YACtD,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvC,OAAO;gBACL,OAAO;gBACP,OAAO;gBACP,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE;gBAC9B,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE;aAC3B,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC","sourcesContent":["import type { Protocol } from \"devtools-protocol\";\nimport type { CDPSessionLike } from \"../../cdp.js\";\nimport { Page } from \"../../page.js\";\nimport { Frame } from \"../../frame.js\";\nimport {\n FrameSelectorResolver,\n type ResolvedNode,\n type SelectorQuery,\n} from \"../../selectorResolver.js\";\nimport { v3Logger } from \"../../../logger.js\";\nimport type {\n FrameContext,\n FrameDomMaps,\n FrameParentIndex,\n HybridSnapshot,\n SnapshotOptions,\n SessionDomIndex,\n} from \"../../../types/private/index.js\";\nimport { a11yForFrame } from \"./a11yTree.js\";\nimport {\n resolveCssFocusFrameAndTail,\n resolveFocusFrameAndTail,\n listChildrenOf,\n} from \"./focusSelectors.js\";\nimport {\n buildSessionDomIndex,\n domMapsForSession,\n relativizeXPath,\n} from \"./domTree.js\";\nimport { injectSubtrees } from \"./treeFormatUtils.js\";\nimport { ownerSession, parentSession } from \"./sessions.js\";\nimport { normalizeXPath, prefixXPath } from \"./xpathUtils.js\";\n\ntype IgnoredNodeMap = Map<string, Set<number>>;\ntype Interval = { start: number; end: number };\ntype ExclusionIntervalsByFrame = Map<string, Interval[]>;\ntype ChildFrameHost = { childFrameId: string; hostBackendNodeId: number };\ntype ChildFramesByParent = Map<string, ChildFrameHost[]>;\ntype WellFormedString = string & { toWellFormed(): string };\n\n/**\n * Capture a hybrid DOM + Accessibility snapshot for the provided page.\n *\n * Flow overview:\n * 1. (Optional) Scope directly to a requested selector. We walk iframe hops to\n * find the owning frame, build just that frame’s DOM + AX tree, and bail out\n * early when the subtree satisfies the caller.\n * 2. Build DOM indexes for every unique CDP session. DOM.getDocument is called\n * once per session and hydrated so per-frame slices can share the result.\n * 3. Slice each frame’s DOM data from its session index and fetch its AX tree.\n * This yields relative XPath/tag/url maps for the document rooted at that frame.\n * 4. Walk the frame tree to compute absolute iframe prefixes. Every child frame\n * needs the XPath of the iframe element that hosts it so we can prefix maps.\n * 5. Merge all per-frame results into global combined maps and stitch the text\n * outline. The final payload mirrors the legacy shape but is built in layers.\n *\n * Each numbered block below references the step above for easier debugging.\n */\nexport async function captureHybridSnapshot(\n page: Page,\n options?: SnapshotOptions,\n): Promise<HybridSnapshot> {\n const pierce = options?.pierceShadow ?? true;\n const includeIframes = options?.includeIframes !== false;\n const hasIgnoreSelectors = (options?.ignoreSelectors?.length ?? 0) > 0;\n\n const context = buildFrameContext(page);\n const framesInScope = includeIframes ? [...context.frames] : [context.rootId];\n if (!framesInScope.includes(context.rootId)) {\n framesInScope.unshift(context.rootId);\n }\n\n if (!hasIgnoreSelectors) {\n const scopedSnapshot = await tryScopedSnapshot(\n page,\n options,\n context,\n pierce,\n new Map<string, SessionDomIndex>(),\n new Map(),\n );\n if (scopedSnapshot) return scopedSnapshot;\n }\n\n const sessionToIndex = await buildSessionIndexes(page, framesInScope, pierce);\n const ignoredNodesByFrame = await resolveIgnoredNodes(\n page,\n options?.ignoreSelectors,\n context,\n sessionToIndex,\n );\n const exclusionIntervalsByFrame = await buildFrameExclusionIntervals(\n page,\n context,\n sessionToIndex,\n ignoredNodesByFrame,\n );\n if (hasIgnoreSelectors) {\n const scopedSnapshot = await tryScopedSnapshot(\n page,\n options,\n context,\n pierce,\n sessionToIndex,\n exclusionIntervalsByFrame,\n );\n if (scopedSnapshot) return scopedSnapshot;\n }\n\n const { perFrameMaps, perFrameOutlines } = await collectPerFrameMaps(\n page,\n context,\n sessionToIndex,\n options,\n pierce,\n framesInScope,\n exclusionIntervalsByFrame,\n );\n const { absPrefix, iframeHostEncByChild } = await computeFramePrefixes(\n page,\n context,\n perFrameMaps,\n framesInScope,\n );\n\n return mergeFramesIntoSnapshot(\n context,\n perFrameMaps,\n perFrameOutlines,\n absPrefix,\n iframeHostEncByChild,\n framesInScope,\n );\n}\n\n/**\n * Snapshot the current frame tree so downstream helpers have consistent topology\n * without re-querying CDP. The map is intentionally shallow (frameId → parentId)\n * so it is serializable/testable without holding on to CDP handles.\n */\nexport function buildFrameContext(page: Page): FrameContext {\n const rootId = page.mainFrameId();\n const frameTree = page.asProtocolFrameTree(rootId);\n const parentByFrame: FrameParentIndex = new Map();\n (function index(n: Protocol.Page.FrameTree, parent: string | null) {\n parentByFrame.set(n.frame.id, parent);\n for (const c of n.childFrames ?? []) index(c, n.frame.id);\n })(frameTree, null);\n const frames = page.listAllFrameIds();\n return { rootId, parentByFrame, frames };\n}\n\n/**\n * Step 1 – scoped snapshot fast-path. If a selector is provided we try to:\n * 1) Resolve the selector (XPath or CSS) across iframes.\n * 2) Build DOM + AX data only for the owning frame.\n * 3) Bail out early when the selector's subtree satisfies the request.\n *\n * Returns `null` when scoping fails (e.g., selector miss) so the caller can\n * fall back to the full multi-frame snapshot.\n */\nexport async function tryScopedSnapshot(\n page: Page,\n options: SnapshotOptions | undefined,\n context: FrameContext,\n pierce: boolean,\n sessionToIndex: Map<string, SessionDomIndex>,\n exclusionIntervalsByFrame: ExclusionIntervalsByFrame,\n): Promise<HybridSnapshot | null> {\n const requestedFocus = options?.focusSelector?.trim();\n if (!requestedFocus) return null;\n\n const logScopeFallback = () => {\n v3Logger({\n message: `Unable to narrow scope with selector. Falling back to using full DOM`,\n level: 1,\n auxiliary: {\n arguments: {\n value: `selector: ${options?.focusSelector?.trim()}`,\n type: \"string\",\n },\n },\n });\n };\n\n try {\n let targetFrameId: string;\n let tailSelector: string | undefined;\n let absPrefix: string | undefined;\n\n const looksLikeXPath =\n /^xpath=/i.test(requestedFocus) || requestedFocus.startsWith(\"/\");\n if (looksLikeXPath) {\n const focus = normalizeXPath(requestedFocus);\n const hit = await resolveFocusFrameAndTail(\n page,\n focus,\n context.parentByFrame,\n context.rootId,\n );\n targetFrameId = hit.targetFrameId;\n tailSelector = hit.tailXPath || undefined;\n absPrefix = hit.absPrefix;\n } else {\n const cssHit = await resolveCssFocusFrameAndTail(\n page,\n requestedFocus,\n context.parentByFrame,\n context.rootId,\n );\n targetFrameId = cssHit.targetFrameId;\n tailSelector = cssHit.tailSelector || undefined;\n absPrefix = cssHit.absPrefix;\n }\n\n const owningSess = ownerSession(page, targetFrameId);\n const parentId = context.parentByFrame.get(targetFrameId);\n const sameSessionAsParent =\n !!parentId &&\n ownerSession(page, parentId) === ownerSession(page, targetFrameId);\n const { tagNameMap, xpathMap, scrollableMap } = await domMapsForSession(\n owningSess,\n targetFrameId,\n pierce,\n (fid, be) => `${page.getOrdinal(fid)}-${be}`,\n sameSessionAsParent,\n );\n\n const { outline, urlMap, scopeApplied } = await a11yForFrame(\n owningSess,\n targetFrameId,\n {\n focusSelector: tailSelector || undefined,\n isIgnoredBackendNode: makeIsIgnoredBackendNode(\n targetFrameId,\n ownerSessionIndexForFrame(page, targetFrameId, sessionToIndex),\n exclusionIntervalsByFrame,\n ),\n tagNameMap,\n experimental: options?.experimental ?? false,\n scrollableMap,\n encode: (backendNodeId) =>\n `${page.getOrdinal(targetFrameId)}-${backendNodeId}`,\n },\n );\n\n const scopedXpathMap: Record<string, string> = {};\n const isIgnoredBackendNode = makeIsIgnoredBackendNode(\n targetFrameId,\n ownerSessionIndexForFrame(page, targetFrameId, sessionToIndex),\n exclusionIntervalsByFrame,\n );\n const abs = absPrefix ?? \"\";\n const isRoot = !abs || abs === \"/\";\n if (isRoot) {\n for (const [encId, xp] of Object.entries(xpathMap)) {\n const backendNodeId = parseEncodedBackendNodeId(encId);\n if (\n typeof backendNodeId === \"number\" &&\n isIgnoredBackendNode?.(backendNodeId)\n ) {\n continue;\n }\n scopedXpathMap[encId] = xp;\n }\n } else {\n // Prefix relative XPaths so the scoped result matches the global encoding.\n for (const [encId, xp] of Object.entries(xpathMap)) {\n const backendNodeId = parseEncodedBackendNodeId(encId);\n if (\n typeof backendNodeId === \"number\" &&\n isIgnoredBackendNode?.(backendNodeId)\n ) {\n continue;\n }\n scopedXpathMap[encId] = prefixXPath(abs, xp);\n }\n }\n\n const scopedUrlMap: Record<string, string> = { ...urlMap };\n\n const wellFormedOutline = (outline as WellFormedString).toWellFormed();\n\n const snapshot: HybridSnapshot = {\n combinedTree: wellFormedOutline,\n combinedXpathMap: scopedXpathMap,\n combinedUrlMap: scopedUrlMap,\n perFrame: [\n {\n frameId: targetFrameId,\n outline: wellFormedOutline,\n xpathMap,\n urlMap,\n },\n ],\n };\n\n if (scopeApplied) {\n return snapshot;\n }\n\n logScopeFallback();\n } catch {\n logScopeFallback();\n }\n return null;\n}\n\n/**\n * Step 2 – call DOM.getDocument once per unique CDP session and hydrate the\n * result so per-frame slices can share the structure. We key by session id\n * because same process iframes live inside the same session.\n */\nexport async function buildSessionIndexes(\n page: Page,\n frames: string[],\n pierce: boolean,\n): Promise<Map<string, SessionDomIndex>> {\n const sessionToIndex = new Map<string, SessionDomIndex>();\n const sessionById = new Map<string, CDPSessionLike>();\n for (const frameId of frames) {\n const sess = ownerSession(page, frameId);\n const sid = sess.id ?? \"root\";\n if (!sessionById.has(sid)) sessionById.set(sid, sess);\n }\n for (const [sid, sess] of sessionById.entries()) {\n const idx = await buildSessionDomIndex(sess, pierce);\n sessionToIndex.set(sid, idx);\n }\n return sessionToIndex;\n}\n\n/**\n * Step 3 – derive per-frame DOM maps and accessibility outlines.\n * Each frame:\n * - slices the shared session index down to its document root\n * - builds frame-aware encoded ids (ordinal-backendNodeId)\n * - collects tag/xpath/scrollability maps for DOM-based lookups\n * - fetches its AX tree to produce outlines and URL maps\n */\nexport async function collectPerFrameMaps(\n page: Page,\n context: FrameContext,\n sessionToIndex: Map<string, SessionDomIndex>,\n options: SnapshotOptions | undefined,\n pierce: boolean,\n frameIds: string[],\n exclusionIntervalsByFrame: ExclusionIntervalsByFrame,\n): Promise<{\n perFrameMaps: Map<string, FrameDomMaps>;\n perFrameOutlines: Array<{ frameId: string; outline: string }>;\n}> {\n const perFrameMaps = new Map<string, FrameDomMaps>();\n const perFrameOutlines: Array<{ frameId: string; outline: string }> = [];\n\n for (const frameId of frameIds) {\n const sess = ownerSession(page, frameId);\n const sid = sess.id ?? \"root\";\n let idx = sessionToIndex.get(sid);\n if (!idx) {\n idx = await buildSessionDomIndex(sess, pierce);\n sessionToIndex.set(sid, idx);\n }\n\n const parentId = context.parentByFrame.get(frameId);\n const sameSessionAsParent =\n !!parentId && ownerSession(page, parentId) === sess;\n\n const docRootBe = await resolveFrameDocRootBackendId(\n page,\n frameId,\n idx,\n sameSessionAsParent,\n );\n\n const tagNameMap: Record<string, string> = {};\n const xpathMap: Record<string, string> = {};\n const scrollableMap: Record<string, boolean> = {};\n const isIgnoredBackendNode = makeIsIgnoredBackendNode(\n frameId,\n idx,\n exclusionIntervalsByFrame,\n );\n const enc = (be: number) => `${page.getOrdinal(frameId)}-${be}`;\n const baseAbs = idx.absByBe.get(docRootBe) ?? \"/\";\n\n for (const [be, nodeAbs] of idx.absByBe.entries()) {\n const nodeDocRoot = idx.docRootOf.get(be);\n if (nodeDocRoot !== docRootBe) continue;\n if (isIgnoredBackendNode?.(be)) continue;\n\n // Translate absolute XPaths into document-relative ones for this frame.\n const rel = relativizeXPath(baseAbs, nodeAbs);\n const key = enc(be);\n xpathMap[key] = rel;\n const tag = idx.tagByBe.get(be);\n if (tag) tagNameMap[key] = tag;\n if (idx.scrollByBe.get(be)) scrollableMap[key] = true;\n }\n\n const { outline, urlMap } = await a11yForFrame(sess, frameId, {\n isIgnoredBackendNode,\n experimental: options?.experimental ?? false,\n tagNameMap,\n scrollableMap,\n encode: (backendNodeId) => `${page.getOrdinal(frameId)}-${backendNodeId}`,\n });\n\n perFrameOutlines.push({ frameId, outline });\n perFrameMaps.set(frameId, { tagNameMap, xpathMap, scrollableMap, urlMap });\n }\n\n return { perFrameMaps, perFrameOutlines };\n}\n\nexport async function resolveIgnoredNodes(\n page: Page,\n ignoreSelectors: string[] | undefined,\n context: FrameContext,\n sessionToIndex: Map<string, SessionDomIndex>,\n): Promise<IgnoredNodeMap> {\n const ignoredNodesByFrame: IgnoredNodeMap = new Map();\n\n for (const rawSelector of ignoreSelectors ?? []) {\n const selector = rawSelector.trim();\n if (!selector) continue;\n\n try {\n const resolved = await resolveIgnoredNodesForSelector(\n page,\n selector,\n context,\n sessionToIndex,\n );\n for (const match of resolved) {\n const nodes =\n ignoredNodesByFrame.get(match.frameId) ?? new Set<number>();\n nodes.add(match.backendNodeId);\n ignoredNodesByFrame.set(match.frameId, nodes);\n }\n } catch {\n continue;\n }\n }\n\n return ignoredNodesByFrame;\n}\n\nasync function resolveIgnoredNodesForSelector(\n page: Page,\n selector: string,\n context: FrameContext,\n sessionToIndex: Map<string, SessionDomIndex>,\n): Promise<Array<{ frameId: string; backendNodeId: number }>> {\n const looksLikeXPath = /^xpath=/i.test(selector) || selector.startsWith(\"/\");\n\n if (looksLikeXPath) {\n const hit = await resolveFocusFrameAndTail(\n page,\n normalizeXPath(selector),\n context.parentByFrame,\n context.rootId,\n );\n const targetFrameId = hit.targetFrameId;\n const tailXPath = hit.tailXPath || \"/\";\n if (tailXPath === \"/\") {\n const idx = ownerSessionIndexForFrame(\n page,\n targetFrameId,\n sessionToIndex,\n );\n if (!idx) return [];\n const parentId = context.parentByFrame.get(targetFrameId);\n const sameSessionAsParent =\n !!parentId &&\n ownerSession(page, parentId) === ownerSession(page, targetFrameId);\n const backendNodeId = await resolveFrameDocRootBackendId(\n page,\n targetFrameId,\n idx,\n sameSessionAsParent,\n );\n return [{ frameId: targetFrameId, backendNodeId }];\n }\n return resolveIgnoredNodesInFrame(page, targetFrameId, {\n kind: \"xpath\",\n value: tailXPath,\n });\n }\n\n const hit = await resolveCssFocusFrameAndTail(\n page,\n selector,\n context.parentByFrame,\n context.rootId,\n );\n const targetFrameId = hit.targetFrameId;\n return resolveIgnoredNodesInFrame(page, targetFrameId, {\n kind: \"css\",\n value: hit.tailSelector || selector,\n });\n}\n\nasync function resolveIgnoredNodesInFrame(\n page: Page,\n frameId: string,\n query: SelectorQuery,\n): Promise<Array<{ frameId: string; backendNodeId: number }>> {\n const session = ownerSession(page, frameId);\n const frame = new Frame(session, frameId, \"\", false);\n const resolver = new FrameSelectorResolver(frame);\n const resolvedNodes = await resolver.resolveAll(query);\n if (!resolvedNodes.length) return [];\n\n const backendNodeIds = await describeResolvedNodes(session, resolvedNodes);\n return backendNodeIds.map((backendNodeId) => ({ frameId, backendNodeId }));\n}\n\nasync function describeResolvedNodes(\n session: CDPSessionLike,\n resolvedNodes: ResolvedNode[],\n): Promise<number[]> {\n const backendNodeIds = new Set<number>();\n\n try {\n for (const resolvedNode of resolvedNodes) {\n const desc = await session.send<Protocol.DOM.DescribeNodeResponse>(\n \"DOM.describeNode\",\n { objectId: resolvedNode.objectId },\n );\n const backendNodeId = desc.node.backendNodeId;\n if (typeof backendNodeId === \"number\") {\n backendNodeIds.add(backendNodeId);\n }\n }\n } finally {\n await Promise.all(\n resolvedNodes.map((resolvedNode) =>\n session\n .send(\"Runtime.releaseObject\", { objectId: resolvedNode.objectId })\n .catch(() => {}),\n ),\n );\n }\n\n return [...backendNodeIds];\n}\n\nexport async function buildFrameExclusionIntervals(\n page: Page,\n context: FrameContext,\n sessionToIndex: Map<string, SessionDomIndex>,\n ignoredNodesByFrame: IgnoredNodeMap,\n): Promise<ExclusionIntervalsByFrame> {\n const intervalsByFrame: ExclusionIntervalsByFrame = new Map();\n if (!ignoredNodesByFrame.size) return intervalsByFrame;\n const childFramesByParent = await resolveChildFramesByParent(page, context);\n const excludedFrames = new Set<string>();\n\n const pushInterval = (frameId: string, start: number, end: number) => {\n const intervals = intervalsByFrame.get(frameId) ?? [];\n intervals.push({ start, end });\n intervalsByFrame.set(frameId, intervals);\n };\n\n const excludeFrameSubtree = async (frameId: string): Promise<void> => {\n if (excludedFrames.has(frameId)) return;\n excludedFrames.add(frameId);\n\n const idx = ownerSessionIndexForFrame(page, frameId, sessionToIndex);\n if (!idx) return;\n const parentId = context.parentByFrame.get(frameId);\n const sameSessionAsParent =\n !!parentId &&\n ownerSession(page, parentId) === ownerSession(page, frameId);\n const docRootBe = await resolveFrameDocRootBackendId(\n page,\n frameId,\n idx,\n sameSessionAsParent,\n );\n const start = idx.enterByBe.get(docRootBe);\n const end = idx.exitByBe.get(docRootBe);\n if (typeof start === \"number\" && typeof end === \"number\") {\n pushInterval(frameId, start, end);\n }\n\n for (const childFrameId of listChildrenOf(context.parentByFrame, frameId)) {\n await excludeFrameSubtree(childFrameId);\n }\n };\n\n const excludeIgnoredNode = async (\n frameId: string,\n backendNodeId: number,\n ): Promise<void> => {\n const idx = ownerSessionIndexForFrame(page, frameId, sessionToIndex);\n if (!idx) return;\n const start = idx.enterByBe.get(backendNodeId);\n const end = idx.exitByBe.get(backendNodeId);\n if (typeof start !== \"number\" || typeof end !== \"number\") return;\n\n pushInterval(frameId, start, end);\n for (const childFrame of childFramesByParent.get(frameId) ?? []) {\n const hostEnter = idx.enterByBe.get(childFrame.hostBackendNodeId);\n if (typeof hostEnter !== \"number\") continue;\n if (hostEnter < start || hostEnter > end) continue;\n await excludeFrameSubtree(childFrame.childFrameId);\n }\n };\n\n for (const [frameId, backendNodeIds] of ignoredNodesByFrame.entries()) {\n for (const backendNodeId of backendNodeIds) {\n await excludeIgnoredNode(frameId, backendNodeId);\n }\n }\n\n for (const [frameId, intervals] of intervalsByFrame.entries()) {\n intervals.sort((a, b) => a.start - b.start || a.end - b.end);\n const merged: Interval[] = [];\n for (const interval of intervals) {\n const prev = merged[merged.length - 1];\n if (!prev || interval.start > prev.end) {\n merged.push({ ...interval });\n continue;\n }\n if (interval.end > prev.end) prev.end = interval.end;\n }\n intervalsByFrame.set(frameId, merged);\n }\n\n return intervalsByFrame;\n}\n\nasync function resolveChildFramesByParent(\n page: Page,\n context: FrameContext,\n): Promise<ChildFramesByParent> {\n const childFramesByParent: ChildFramesByParent = new Map();\n\n for (const frameId of context.frames) {\n const parentId = context.parentByFrame.get(frameId);\n if (!parentId) continue;\n\n const session = parentSession(page, context.parentByFrame, frameId);\n if (!session) continue;\n\n try {\n const { backendNodeId } = await session.send<{ backendNodeId?: number }>(\n \"DOM.getFrameOwner\",\n { frameId },\n );\n if (typeof backendNodeId !== \"number\") continue;\n const childFrames = childFramesByParent.get(parentId) ?? [];\n childFrames.push({\n childFrameId: frameId,\n hostBackendNodeId: backendNodeId,\n });\n childFramesByParent.set(parentId, childFrames);\n } catch {\n continue;\n }\n }\n\n return childFramesByParent;\n}\n\nfunction makeIsIgnoredBackendNode(\n frameId: string,\n idx: SessionDomIndex | undefined,\n exclusionIntervalsByFrame: ExclusionIntervalsByFrame,\n): ((backendNodeId: number) => boolean) | undefined {\n if (!idx) return undefined;\n const intervals = exclusionIntervalsByFrame.get(frameId);\n if (!intervals?.length) return undefined;\n\n return (backendNodeId: number): boolean => {\n const enter = idx.enterByBe.get(backendNodeId);\n if (typeof enter !== \"number\") return false;\n\n let lo = 0;\n let hi = intervals.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const interval = intervals[mid]!;\n if (enter < interval.start) {\n hi = mid - 1;\n } else if (enter > interval.end) {\n lo = mid + 1;\n } else {\n return true;\n }\n }\n return false;\n };\n}\n\nfunction parseEncodedBackendNodeId(encodedId: string): number | undefined {\n const parts = encodedId.split(\"-\");\n if (parts.length !== 2) return undefined;\n const backendNodeId = Number(parts[1]);\n return Number.isFinite(backendNodeId) ? backendNodeId : undefined;\n}\n\nfunction ownerSessionIndexForFrame(\n page: Page,\n frameId: string,\n sessionToIndex: Map<string, SessionDomIndex>,\n): SessionDomIndex | undefined {\n const session = ownerSession(page, frameId);\n return sessionToIndex.get(session.id ?? \"root\");\n}\n\nasync function resolveFrameDocRootBackendId(\n page: Page,\n frameId: string,\n idx: SessionDomIndex,\n sameSessionAsParent: boolean,\n): Promise<number> {\n if (!sameSessionAsParent) return idx.rootBackend;\n const session = ownerSession(page, frameId);\n try {\n const { backendNodeId } = await session.send<{ backendNodeId?: number }>(\n \"DOM.getFrameOwner\",\n { frameId },\n );\n if (typeof backendNodeId === \"number\") {\n const docRootBe = idx.contentDocRootByIframe.get(backendNodeId);\n if (typeof docRootBe === \"number\") return docRootBe;\n }\n } catch {\n //\n }\n return idx.rootBackend;\n}\n\n/**\n * Step 4 – walk the frame tree (parent-first) to compute absolute prefixes for\n * every frame. The prefix is the absolute XPath of the iframe element hosting\n * the frame, so we can later convert relative XPaths into cross-frame ones.\n */\nexport async function computeFramePrefixes(\n page: Page,\n context: FrameContext,\n perFrameMaps: Map<string, FrameDomMaps>,\n frameIds: string[],\n): Promise<{\n absPrefix: Map<string, string>;\n iframeHostEncByChild: Map<string, string>;\n}> {\n const absPrefix = new Map<string, string>();\n const iframeHostEncByChild = new Map<string, string>();\n absPrefix.set(context.rootId, \"\");\n const included = new Set(frameIds);\n\n const queue: string[] = [];\n if (included.has(context.rootId)) {\n queue.push(context.rootId);\n }\n\n while (queue.length) {\n const parent = queue.shift()!;\n const parentAbs = absPrefix.get(parent)!;\n\n for (const child of context.frames) {\n if (!included.has(child)) continue;\n if (context.parentByFrame.get(child) !== parent) continue;\n queue.push(child);\n\n const parentSess = parentSession(page, context.parentByFrame, child);\n\n const ownerBackendNodeId = await (async () => {\n try {\n const { backendNodeId } = await parentSess.send<{\n backendNodeId?: number;\n }>(\"DOM.getFrameOwner\", { frameId: child });\n return backendNodeId;\n } catch {\n return undefined;\n }\n })();\n\n if (!ownerBackendNodeId) {\n // OOPIFs resolved via a different session inherit the parent prefix.\n absPrefix.set(child, parentAbs);\n continue;\n }\n\n const parentDom = perFrameMaps.get(parent);\n const iframeEnc = `${page.getOrdinal(parent)}-${ownerBackendNodeId}`;\n const iframeXPath = parentDom?.xpathMap[iframeEnc];\n\n const childAbs = iframeXPath\n ? prefixXPath(parentAbs || \"/\", iframeXPath)\n : parentAbs;\n\n absPrefix.set(child, childAbs);\n iframeHostEncByChild.set(child, iframeEnc);\n }\n }\n\n return { absPrefix, iframeHostEncByChild };\n}\n\n/**\n * Step 5 – merge per-frame maps into the combined snapshot payload. We prefix\n * each frame's relative XPaths with the absolute path collected in step 4,\n * merge URL maps, and stitch text outlines by nesting child trees under the\n * encoded id of their parent iframe host.\n */\nexport function mergeFramesIntoSnapshot(\n context: FrameContext,\n perFrameMaps: Map<string, FrameDomMaps>,\n perFrameOutlines: Array<{ frameId: string; outline: string }>,\n absPrefix: Map<string, string>,\n iframeHostEncByChild: Map<string, string>,\n frameIds: string[],\n): HybridSnapshot {\n const combinedXpathMap: Record<string, string> = {};\n const combinedUrlMap: Record<string, string> = {};\n\n for (const frameId of frameIds) {\n const maps = perFrameMaps.get(frameId);\n if (!maps) continue;\n\n const abs = absPrefix.get(frameId) ?? \"\";\n const isRoot = abs === \"\" || abs === \"/\";\n\n if (isRoot) {\n Object.assign(combinedXpathMap, maps.xpathMap);\n Object.assign(combinedUrlMap, maps.urlMap);\n continue;\n }\n\n for (const [encId, xp] of Object.entries(maps.xpathMap)) {\n combinedXpathMap[encId] = prefixXPath(abs, xp);\n }\n Object.assign(combinedUrlMap, maps.urlMap);\n }\n\n const idToTree = new Map<string, string>();\n for (const { frameId, outline } of perFrameOutlines) {\n const parentEnc = iframeHostEncByChild.get(frameId);\n // The key is the parent iframe's encoded id so injectSubtrees can nest lines.\n if (parentEnc) idToTree.set(parentEnc, outline);\n }\n\n const rootOutline =\n perFrameOutlines.find((o) => o.frameId === context.rootId)?.outline ??\n perFrameOutlines[0]?.outline ??\n \"\";\n const combinedTree = (\n injectSubtrees(rootOutline, idToTree) as WellFormedString\n ).toWellFormed();\n\n return {\n combinedTree,\n combinedXpathMap,\n combinedUrlMap,\n perFrame: perFrameOutlines.map(({ frameId, outline }) => {\n const maps = perFrameMaps.get(frameId);\n return {\n frameId,\n outline,\n xpathMap: maps?.xpathMap ?? {},\n urlMap: maps?.urlMap ?? {},\n };\n }),\n };\n}\n"]}
|
|
@@ -104,6 +104,18 @@ export declare class Locator {
|
|
|
104
104
|
button?: MouseButton;
|
|
105
105
|
clickCount?: number;
|
|
106
106
|
}): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* Tap the element at its visual center with a real (trusted) touch.
|
|
109
|
+
* Mirrors {@link click} but synthesizes touch input via `Input.dispatchTouchEvent`
|
|
110
|
+
* instead of mouse input, so mobile layouts that gate handlers on touch/pointer
|
|
111
|
+
* (`pointerType: "touch"`) events — where a mouse click never registers — respond
|
|
112
|
+
* correctly. This is the deterministic (selector-based) counterpart used when a
|
|
113
|
+
* recorded CUA `tap` step is replayed.
|
|
114
|
+
*
|
|
115
|
+
* Does not require touch emulation: CDP delivers a trusted touch sequence even on
|
|
116
|
+
* a session reporting `maxTouchPoints: 0`.
|
|
117
|
+
*/
|
|
118
|
+
tap(): Promise<void>;
|
|
107
119
|
/**
|
|
108
120
|
* Dispatch a DOM 'click' MouseEvent on the element itself.
|
|
109
121
|
* - Does not synthesize real pointer input; directly dispatches an event.
|
|
@@ -356,6 +356,50 @@ export class Locator {
|
|
|
356
356
|
}
|
|
357
357
|
}
|
|
358
358
|
}
|
|
359
|
+
/**
|
|
360
|
+
* Tap the element at its visual center with a real (trusted) touch.
|
|
361
|
+
* Mirrors {@link click} but synthesizes touch input via `Input.dispatchTouchEvent`
|
|
362
|
+
* instead of mouse input, so mobile layouts that gate handlers on touch/pointer
|
|
363
|
+
* (`pointerType: "touch"`) events — where a mouse click never registers — respond
|
|
364
|
+
* correctly. This is the deterministic (selector-based) counterpart used when a
|
|
365
|
+
* recorded CUA `tap` step is replayed.
|
|
366
|
+
*
|
|
367
|
+
* Does not require touch emulation: CDP delivers a trusted touch sequence even on
|
|
368
|
+
* a session reporting `maxTouchPoints: 0`.
|
|
369
|
+
*/
|
|
370
|
+
async tap() {
|
|
371
|
+
const session = this.frame.session;
|
|
372
|
+
const { objectId } = await this.resolveNode();
|
|
373
|
+
try {
|
|
374
|
+
await session.send("DOM.scrollIntoViewIfNeeded", { objectId });
|
|
375
|
+
const box = await session.send("DOM.getBoxModel", { objectId });
|
|
376
|
+
if (!box.model)
|
|
377
|
+
throw new ElementNotVisibleError(this.selector);
|
|
378
|
+
const { cx, cy } = this.centerFromBoxContent(box.model.content);
|
|
379
|
+
// Pipelined burst, matching click's press/release batching: CDP preserves
|
|
380
|
+
// per-session command order, so awaiting each dispatch in turn would only
|
|
381
|
+
// add a round trip (a full network RTT against a remote browser).
|
|
382
|
+
await Promise.all([
|
|
383
|
+
session.send("Input.dispatchTouchEvent", {
|
|
384
|
+
type: "touchStart",
|
|
385
|
+
touchPoints: [{ x: cx, y: cy }],
|
|
386
|
+
}),
|
|
387
|
+
session.send("Input.dispatchTouchEvent", {
|
|
388
|
+
type: "touchEnd",
|
|
389
|
+
touchPoints: [],
|
|
390
|
+
}),
|
|
391
|
+
]);
|
|
392
|
+
}
|
|
393
|
+
finally {
|
|
394
|
+
try {
|
|
395
|
+
await session.send("Runtime.releaseObject", { objectId });
|
|
396
|
+
}
|
|
397
|
+
catch {
|
|
398
|
+
// If the context navigated or was destroyed (e.g., link opens new tab),
|
|
399
|
+
// releaseObject may fail with -32000. Ignore as best-effort cleanup.
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
359
403
|
/**
|
|
360
404
|
* Dispatch a DOM 'click' MouseEvent on the element itself.
|
|
361
405
|
* - Does not synthesize real pointer input; directly dispatches an event.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locator.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/locator.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/understudy/locator.ts\nimport { Protocol } from \"devtools-protocol\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport {\n locatorScriptBootstrap,\n locatorScriptGlobalRefs,\n locatorScriptSources,\n} from \"../dom/build/locatorScripts.generated.js\";\nimport type { Frame } from \"./frame.js\";\nimport {\n FrameSelectorResolver,\n type SelectorQuery,\n} from \"./selectorResolver.js\";\nimport {\n StagehandElementNotFoundError,\n StagehandInvalidArgumentError,\n StagehandLocatorError,\n ElementNotVisibleError,\n} from \"../types/public/sdkErrors.js\";\nimport { normalizeInputFiles } from \"./fileUploadUtils.js\";\nimport { SetInputFilesArgument, MouseButton } from \"../types/public/locator.js\";\nimport { NormalizedFilePayload } from \"../types/private/locator.js\";\n\nconst MAX_REMOTE_UPLOAD_BYTES = 50 * 1024 * 1024; // 50MB guard copied from Playwright\n\n/**\n * Locator\n *\n * Purpose:\n * A small, CDP-based element interaction helper scoped to a specific `Frame`.\n * It resolves a CSS/XPath selector inside the frame’s **isolated world**, and then\n * performs low-level actions (click, type, select) using DOM/Runtime/Input\n * protocol domains with minimal abstraction.\n *\n * Key change:\n * - Prefer **objectId**-based CDP calls (scroll, geometry) to avoid brittle\n * frontend nodeId mappings. nodeId is resolved on a best-effort basis and\n * returned for compatibility, but actions do not depend on it.\n *\n * Notes:\n * - Resolution is lazy: every action resolves the selector again.\n * - Uses `Page.createIsolatedWorld` so evaluation is isolated from page scripts.\n * - Releases remote objects (`Runtime.releaseObject`) where appropriate.\n */\nexport class Locator {\n private readonly selectorResolver: FrameSelectorResolver;\n\n private readonly selectorQuery: SelectorQuery;\n\n // -1 means \"no explicit nth()\"; default locator resolves to first match for actions.\n private readonly nthIndex: number;\n\n constructor(\n private readonly frame: Frame,\n private readonly selector: string,\n private readonly options?: { deep?: boolean; depth?: number },\n nthIndex: number = -1,\n ) {\n this.selectorResolver = new FrameSelectorResolver(this.frame);\n this.selectorQuery = FrameSelectorResolver.parseSelector(selector);\n const normalized = Number.isFinite(nthIndex) ? Math.floor(nthIndex) : -1;\n this.nthIndex = normalized < 0 ? -1 : normalized;\n }\n\n /** Return the owning Frame for this locator (typed accessor, no private access). */\n public getFrame(): Frame {\n return this.frame;\n }\n\n /**\n * Set files on an <input type=\"file\"> element.\n *\n * Mirrors Playwright's Locator.setInputFiles basics:\n * - Accepts file path(s) or payload object(s) { name, mimeType, buffer }.\n * - Uses CDP DOM.setFileInputFiles under the hood.\n * - Best‑effort dispatches change/input via CDP (Chrome does by default).\n * - Passing an empty array clears the selection.\n */\n public async setInputFiles(files: SetInputFilesArgument): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n const tempFiles: string[] = [];\n\n try {\n // Validate element is an <input type=\"file\">\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.ensureFileInputElement,\n returnByValue: true,\n },\n );\n const ok = Boolean(res.result.value);\n if (!ok)\n throw new StagehandInvalidArgumentError(\n 'Target is not an <input type=\"file\"> element',\n );\n } catch (e) {\n throw new StagehandInvalidArgumentError(\n e instanceof Error\n ? e.message\n : \"Unable to verify file input element\",\n );\n }\n\n const normalized = await normalizeInputFiles(files);\n\n if (!normalized.length) {\n await session.send<never>(\"DOM.setFileInputFiles\", {\n objectId,\n files: [],\n });\n return;\n }\n\n if (this.frame.isBrowserRemote()) {\n await this.assignFilesViaPayloadInjection(objectId, normalized);\n return;\n }\n\n const filePaths: string[] = [];\n for (const payload of normalized) {\n if (payload.absolutePath) {\n filePaths.push(payload.absolutePath);\n continue;\n }\n const ext = path.extname(payload.name);\n const tmp = path.join(\n os.tmpdir(),\n `stagehand-upload-${Date.now()}-${Math.random().toString(36).slice(2)}${ext}`,\n );\n await fs.promises.writeFile(tmp, payload.buffer);\n tempFiles.push(tmp);\n filePaths.push(tmp);\n }\n\n await session.send<never>(\"DOM.setFileInputFiles\", {\n objectId,\n files: filePaths,\n });\n } finally {\n // Cleanup: release element and remove any temporary files we created\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n for (const p of tempFiles) {\n try {\n await fs.promises.unlink(p);\n } catch {\n // ignore\n }\n }\n }\n }\n\n /**\n * Remote browser fallback: build File objects inside the page and attach them via JS.\n *\n * When Stagehand is driving a browser that cannot see the local filesystem (Browserbase,\n * remote CDP, etc.), CDP's DOM.setFileInputFiles would fail because Chrome can't reach\n * our temp files. Instead we base64-encode the payloads, send them into the page, and\n * let a DOM helper create File objects + dispatch change/input events.\n */\n private async assignFilesViaPayloadInjection(\n objectId: Protocol.Runtime.RemoteObjectId,\n files: NormalizedFilePayload[],\n ): Promise<void> {\n const session = this.frame.session;\n\n for (const payload of files) {\n if (payload.buffer.length > MAX_REMOTE_UPLOAD_BYTES) {\n throw new StagehandInvalidArgumentError(\n `setInputFiles(): file \"${payload.name}\" is larger than the 50MB limit for remote uploads`,\n );\n }\n }\n\n const serialized = files.map((payload) => ({\n name: payload.name,\n mimeType: payload.mimeType,\n lastModified: payload.lastModified,\n base64: payload.buffer.toString(\"base64\"),\n }));\n\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration:\n locatorScriptSources.assignFilePayloadsToInputElement,\n arguments: [\n {\n value: serialized,\n },\n ],\n returnByValue: true,\n },\n );\n\n const ok = Boolean(res.result?.value);\n if (!ok) {\n throw new StagehandInvalidArgumentError(\n \"Unable to assign file payloads to remote input element\",\n );\n }\n }\n\n /**\n * Return the DOM backendNodeId for this locator's target element.\n * Useful for identity comparisons without needing element handles.\n */\n async backendNodeId(): Promise<Protocol.DOM.BackendNodeId> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session.send(\"DOM.enable\").catch(() => {});\n const { node } = await session.send<{ node: Protocol.DOM.Node }>(\n \"DOM.describeNode\",\n { objectId },\n );\n return node.backendNodeId as Protocol.DOM.BackendNodeId;\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /** Return how many nodes the current selector resolves to. */\n public async count(): Promise<number> {\n const session = this.frame.session;\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n return this.selectorResolver.count(this.selectorQuery);\n }\n\n /**\n * Return the center of the element's bounding box in the owning frame's viewport\n * (CSS pixels), rounded to integers. Scrolls into view best-effort.\n */\n public async centroid(): Promise<{ x: number; y: number }> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n return { x: Math.round(cx), y: Math.round(cy) };\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Highlight the element's bounding box using the CDP Overlay domain.\n * - Scrolls element into view best-effort.\n * - Shows a semi-transparent overlay briefly, then hides it.\n */\n public async highlight(options?: {\n durationMs?: number;\n borderColor?: { r: number; g: number; b: number; a?: number };\n contentColor?: { r: number; g: number; b: number; a?: number };\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n const duration = Math.max(0, options?.durationMs ?? 800);\n\n const borderColor = options?.borderColor ?? { r: 255, g: 0, b: 0, a: 0.9 };\n const contentColor =\n options?.contentColor ?? ({ r: 255, g: 200, b: 0, a: 0.2 } as const);\n\n try {\n await session.send(\"Overlay.enable\").catch(() => {});\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n\n // Prefer backendNodeId to keep highlight stable even if objectId is released.\n await session.send(\"DOM.enable\").catch(() => {});\n let backendNodeId: Protocol.DOM.BackendNodeId | undefined;\n try {\n const { node } = await session.send<{ node: Protocol.DOM.Node }>(\n \"DOM.describeNode\",\n { objectId },\n );\n backendNodeId = node.backendNodeId as Protocol.DOM.BackendNodeId;\n } catch {\n backendNodeId = undefined;\n }\n\n const highlightConfig: Protocol.Overlay.HighlightConfig = {\n showInfo: false,\n showStyles: false,\n showRulers: false,\n showExtensionLines: false,\n borderColor,\n contentColor,\n } as Protocol.Overlay.HighlightConfig;\n\n const highlightOnce = async () => {\n await session.send<never>(\"Overlay.highlightNode\", {\n ...(backendNodeId ? { backendNodeId } : { objectId }),\n highlightConfig,\n });\n };\n\n // Initial draw\n await highlightOnce();\n\n // Keep alive until duration elapses to resist overlay clears on mouse move/repaints\n if (duration > 0) {\n const start = Date.now();\n const tick = Math.min(300, Math.max(100, Math.floor(duration / 50)));\n while (Date.now() - start < duration) {\n await new Promise((r) => setTimeout(r, tick));\n try {\n await highlightOnce();\n } catch {\n // ignore transient errors\n }\n }\n await session.send<never>(\"Overlay.hideHighlight\").catch(() => {});\n }\n } finally {\n // Releasing objectId should not affect highlight when using backendNodeId.\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Move the mouse cursor to the element's visual center without clicking.\n * - Scrolls into view best-effort, resolves geometry, then dispatches a mouse move.\n */\n async hover(): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n\n await session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x: cx,\n y: cy,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest);\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Click the element at its visual center.\n * Steps:\n * 1) Resolve selector to { objectId } in the frame world.\n * 2) Scroll into view via `DOM.scrollIntoViewIfNeeded({ objectId })`.\n * 3) Read geometry via `DOM.getBoxModel({ objectId })` → compute a center point.\n * 4) Synthesize mouse press + release via `Input.dispatchMouseEvent`.\n */\n async click(options?: {\n button?: MouseButton;\n clickCount?: number;\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n const button = options?.button ?? \"left\";\n const clickCount = options?.clickCount ?? 1;\n\n try {\n // Scroll into view using objectId (avoids frontend nodeId dependence)\n await session.send(\"DOM.scrollIntoViewIfNeeded\", { objectId });\n\n // Get geometry using objectId\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n\n // Dispatch click events in a pipelined burst to reduce inter-click delay\n // from network/CPU jitter between round trips.\n const dispatches: Array<Promise<unknown>> = [];\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x: cx,\n y: cy,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n\n for (let i = 1; i <= clickCount; i++) {\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mousePressed\",\n x: cx,\n y: cy,\n button,\n clickCount: i,\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseReleased\",\n x: cx,\n y: cy,\n button,\n clickCount: i,\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n }\n await Promise.all(dispatches);\n } finally {\n // release the element handle\n try {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n } catch {\n // If the context navigated or was destroyed (e.g., link opens new tab),\n // releaseObject may fail with -32000. Ignore as best-effort cleanup.\n }\n }\n }\n\n /**\n * Dispatch a DOM 'click' MouseEvent on the element itself.\n * - Does not synthesize real pointer input; directly dispatches an event.\n * - Useful for elements that rely on click handlers without needing hit-testing.\n */\n async sendClickEvent(options?: {\n bubbles?: boolean;\n cancelable?: boolean;\n composed?: boolean;\n detail?: number;\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n const bubbles = options?.bubbles ?? true;\n const cancelable = options?.cancelable ?? true;\n const composed = options?.composed ?? true;\n const detail = options?.detail ?? 1;\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.dispatchDomClick,\n arguments: [\n {\n value: { bubbles, cancelable, composed, detail },\n },\n ],\n returnByValue: true,\n },\n );\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Scroll the element vertically to a given percentage (0–100).\n * - If the element is <html> or <body>, scrolls the window/document.\n * - Otherwise, scrolls the element itself via element.scrollTo.\n */\n async scrollTo(percent: number | string): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.scrollElementToPercent,\n arguments: [{ value: percent as unknown as number }],\n returnByValue: true,\n },\n );\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Fill an input/textarea/contenteditable element.\n * Mirrors Playwright semantics: the DOM helper either applies the native\n * value setter (for special input types) or asks us to type text via the CDP\n * Input domain after focusing/selecting.\n */\n async fill(value: string): Promise<void> {\n const session = this.frame.session;\n // Use the bundled locator globals; the raw fill snippet depends on helper symbols.\n const fillDeclaration = `function(value) { ${locatorScriptBootstrap}; return ${locatorScriptGlobalRefs.fillElementValue}.call(this, value); }`;\n const { objectId } = await this.resolveNode();\n\n let releaseNeeded = true;\n\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: fillDeclaration,\n arguments: [{ value }],\n returnByValue: true,\n },\n );\n if (res.exceptionDetails) {\n // prefer exception.description over text (eg \"Uncaught\")\n const message =\n res.exceptionDetails.exception?.description ??\n res.exceptionDetails.text ??\n \"Unknown exception during locator().fill()\";\n throw new StagehandLocatorError(\"Filling\", this.selector, message);\n }\n\n const result = res.result.value as\n | { status?: string; reason?: string; value?: string }\n | null\n | undefined;\n const status =\n typeof result === \"object\" && result ? result.status : undefined;\n\n if (status === \"done\") {\n return;\n }\n\n if (status === \"needsinput\") {\n // Release the current handle before synthesizing keyboard input to avoid leaking it.\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n releaseNeeded = false;\n\n const valueToType =\n typeof result?.value === \"string\" ? result.value : value;\n\n let prepared = false;\n try {\n const { objectId: prepObjectId } = await this.resolveNode();\n try {\n const prepRes =\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId: prepObjectId,\n functionDeclaration:\n locatorScriptSources.prepareElementForTyping,\n returnByValue: true,\n },\n );\n prepared = Boolean(prepRes.result.value);\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId: prepObjectId })\n .catch(() => {});\n }\n } catch {\n // Ignore preparation failures; we'll fall back to typing best-effort.\n }\n\n if (!prepared && valueToType.length > 0) {\n await this.type(valueToType);\n return;\n }\n\n if (valueToType.length === 0) {\n // Simulate deleting the currently selected text to clear the field.\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n key: \"Backspace\",\n code: \"Backspace\",\n windowsVirtualKeyCode: 8,\n nativeVirtualKeyCode: 8,\n } as Protocol.Input.DispatchKeyEventRequest);\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n key: \"Backspace\",\n code: \"Backspace\",\n windowsVirtualKeyCode: 8,\n nativeVirtualKeyCode: 8,\n } as Protocol.Input.DispatchKeyEventRequest);\n } else {\n await session.send<never>(\"Input.insertText\", { text: valueToType });\n }\n\n return;\n }\n\n if (status === \"error\") {\n const reason =\n typeof result?.reason === \"string\" && result.reason.length > 0\n ? result.reason\n : \"Failed to fill element\";\n throw new StagehandInvalidArgumentError(\n `Failed to fill element (${reason})`,\n );\n }\n\n // Backward compatibility: if no status is returned (older bundle), fall back to setter logic.\n if (!status) {\n await this.type(value);\n }\n } finally {\n if (releaseNeeded) {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n }\n\n /**\n * Type text into the element (focuses first).\n * - Focus via element.focus() in page JS (no DOM.focus(nodeId)).\n * - If no delay, uses `Input.insertText` for efficiency.\n * - With delay, synthesizes `keyDown`/`keyUp` per character.\n */\n async type(text: string, options?: { delay?: number }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n try {\n // Focus using JS (avoids DOM.focus(nodeId))\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.focusElement,\n returnByValue: true,\n },\n );\n\n if (!options?.delay) {\n await session.send<never>(\"Input.insertText\", { text });\n return;\n }\n\n for (const ch of text) {\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n text: ch,\n key: ch,\n } as Protocol.Input.DispatchKeyEventRequest);\n\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n text: ch,\n key: ch,\n } as Protocol.Input.DispatchKeyEventRequest);\n\n await new Promise((r) => setTimeout(r, options.delay));\n }\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Select one or more options on a `<select>` element.\n * Returns the values actually selected after the operation.\n */\n async selectOption(values: string | string[]): Promise<string[]> {\n const session = this.frame.session;\n const desired = Array.isArray(values) ? values : [values];\n const { objectId } = await this.resolveNode();\n\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.selectElementOptions,\n arguments: [{ value: desired }],\n returnByValue: true,\n },\n );\n\n return (res.result.value as string[]) ?? [];\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return true if the element is attached and visible (rough heuristic).\n */\n async isVisible(): Promise<boolean> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.isElementVisible,\n returnByValue: true,\n },\n );\n return Boolean(res.result.value);\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return true if the element is an input[type=checkbox|radio] and is checked.\n * Also considers aria-checked for ARIA widgets.\n */\n async isChecked(): Promise<boolean> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.isElementChecked,\n returnByValue: true,\n },\n );\n return Boolean(res.result.value);\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's input value (for input/textarea/select/contenteditable).\n */\n async inputValue(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInputValue,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's textContent (raw, not innerText).\n */\n async textContent(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementTextContent,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's innerHTML string.\n */\n async innerHtml(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInnerHTML,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's innerText (layout-aware, visible text).\n */\n async innerText(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInnerText,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return a locator narrowed to the first match.\n */\n first(): Locator {\n return this.nth(0);\n }\n\n /** Return a locator narrowed to the element at the given zero-based index. */\n nth(index: number): Locator {\n const value = Number(index);\n if (!Number.isFinite(value) || value < 0) {\n throw new StagehandInvalidArgumentError(\n \"locator().nth() expects a non-negative index\",\n );\n }\n\n const nextIndex = Math.floor(value);\n if (nextIndex === this.nthIndex) {\n return this;\n }\n\n return new Locator(this.frame, this.selector, this.options, nextIndex);\n }\n\n // ---------- helpers ----------\n\n /**\n * Resolve `this.selector` within the frame to `{ objectId, nodeId? }`:\n * Delegates to a shared selector resolver so all selector logic stays in sync.\n */\n public async resolveNode(): Promise<{\n nodeId: Protocol.DOM.NodeId | null;\n objectId: Protocol.Runtime.RemoteObjectId;\n }> {\n const session = this.frame.session;\n\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n\n const index = this.nthIndex < 0 ? 0 : this.nthIndex;\n const resolved = await this.selectorResolver.resolveAtIndex(\n this.selectorQuery,\n index,\n );\n if (!resolved) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n\n return resolved;\n }\n\n /**\n * Resolve all matching nodes for this locator.\n * If the locator is narrowed via nth(), only that index is returned.\n */\n public async resolveNodesForMask(): Promise<\n Array<{\n nodeId: Protocol.DOM.NodeId | null;\n objectId: Protocol.Runtime.RemoteObjectId;\n }>\n > {\n const session = this.frame.session;\n\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n\n if (this.nthIndex >= 0) {\n const resolved = await this.selectorResolver.resolveAtIndex(\n this.selectorQuery,\n this.nthIndex,\n );\n if (!resolved) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n return [resolved];\n }\n\n const resolved = await this.selectorResolver.resolveAll(this.selectorQuery);\n if (!resolved.length) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n return resolved;\n }\n\n /** Compute a center point from a BoxModel content quad */\n private centerFromBoxContent(content: number[]): { cx: number; cy: number } {\n // content is [x1,y1, x2,y2, x3,y3, x4,y4]\n if (!content || content.length < 8) {\n throw new StagehandInvalidArgumentError(\"Invalid box model content quad\");\n }\n const xs = [content[0], content[2], content[4], content[6]];\n const ys = [content[1], content[3], content[5], content[7]];\n const cx = (xs[0] + xs[1] + xs[2] + xs[3]) / 4;\n const cy = (ys[0] + ys[1] + ys[2] + ys[3]) / 4;\n return { cx, cy };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"locator.js","sourceRoot":"","sources":["../../../../../lib/v3/understudy/locator.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/understudy/locator.ts\nimport { Protocol } from \"devtools-protocol\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport {\n locatorScriptBootstrap,\n locatorScriptGlobalRefs,\n locatorScriptSources,\n} from \"../dom/build/locatorScripts.generated.js\";\nimport type { Frame } from \"./frame.js\";\nimport {\n FrameSelectorResolver,\n type SelectorQuery,\n} from \"./selectorResolver.js\";\nimport {\n StagehandElementNotFoundError,\n StagehandInvalidArgumentError,\n StagehandLocatorError,\n ElementNotVisibleError,\n} from \"../types/public/sdkErrors.js\";\nimport { normalizeInputFiles } from \"./fileUploadUtils.js\";\nimport { SetInputFilesArgument, MouseButton } from \"../types/public/locator.js\";\nimport { NormalizedFilePayload } from \"../types/private/locator.js\";\n\nconst MAX_REMOTE_UPLOAD_BYTES = 50 * 1024 * 1024; // 50MB guard copied from Playwright\n\n/**\n * Locator\n *\n * Purpose:\n * A small, CDP-based element interaction helper scoped to a specific `Frame`.\n * It resolves a CSS/XPath selector inside the frame’s **isolated world**, and then\n * performs low-level actions (click, type, select) using DOM/Runtime/Input\n * protocol domains with minimal abstraction.\n *\n * Key change:\n * - Prefer **objectId**-based CDP calls (scroll, geometry) to avoid brittle\n * frontend nodeId mappings. nodeId is resolved on a best-effort basis and\n * returned for compatibility, but actions do not depend on it.\n *\n * Notes:\n * - Resolution is lazy: every action resolves the selector again.\n * - Uses `Page.createIsolatedWorld` so evaluation is isolated from page scripts.\n * - Releases remote objects (`Runtime.releaseObject`) where appropriate.\n */\nexport class Locator {\n private readonly selectorResolver: FrameSelectorResolver;\n\n private readonly selectorQuery: SelectorQuery;\n\n // -1 means \"no explicit nth()\"; default locator resolves to first match for actions.\n private readonly nthIndex: number;\n\n constructor(\n private readonly frame: Frame,\n private readonly selector: string,\n private readonly options?: { deep?: boolean; depth?: number },\n nthIndex: number = -1,\n ) {\n this.selectorResolver = new FrameSelectorResolver(this.frame);\n this.selectorQuery = FrameSelectorResolver.parseSelector(selector);\n const normalized = Number.isFinite(nthIndex) ? Math.floor(nthIndex) : -1;\n this.nthIndex = normalized < 0 ? -1 : normalized;\n }\n\n /** Return the owning Frame for this locator (typed accessor, no private access). */\n public getFrame(): Frame {\n return this.frame;\n }\n\n /**\n * Set files on an <input type=\"file\"> element.\n *\n * Mirrors Playwright's Locator.setInputFiles basics:\n * - Accepts file path(s) or payload object(s) { name, mimeType, buffer }.\n * - Uses CDP DOM.setFileInputFiles under the hood.\n * - Best‑effort dispatches change/input via CDP (Chrome does by default).\n * - Passing an empty array clears the selection.\n */\n public async setInputFiles(files: SetInputFilesArgument): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n const tempFiles: string[] = [];\n\n try {\n // Validate element is an <input type=\"file\">\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.ensureFileInputElement,\n returnByValue: true,\n },\n );\n const ok = Boolean(res.result.value);\n if (!ok)\n throw new StagehandInvalidArgumentError(\n 'Target is not an <input type=\"file\"> element',\n );\n } catch (e) {\n throw new StagehandInvalidArgumentError(\n e instanceof Error\n ? e.message\n : \"Unable to verify file input element\",\n );\n }\n\n const normalized = await normalizeInputFiles(files);\n\n if (!normalized.length) {\n await session.send<never>(\"DOM.setFileInputFiles\", {\n objectId,\n files: [],\n });\n return;\n }\n\n if (this.frame.isBrowserRemote()) {\n await this.assignFilesViaPayloadInjection(objectId, normalized);\n return;\n }\n\n const filePaths: string[] = [];\n for (const payload of normalized) {\n if (payload.absolutePath) {\n filePaths.push(payload.absolutePath);\n continue;\n }\n const ext = path.extname(payload.name);\n const tmp = path.join(\n os.tmpdir(),\n `stagehand-upload-${Date.now()}-${Math.random().toString(36).slice(2)}${ext}`,\n );\n await fs.promises.writeFile(tmp, payload.buffer);\n tempFiles.push(tmp);\n filePaths.push(tmp);\n }\n\n await session.send<never>(\"DOM.setFileInputFiles\", {\n objectId,\n files: filePaths,\n });\n } finally {\n // Cleanup: release element and remove any temporary files we created\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n for (const p of tempFiles) {\n try {\n await fs.promises.unlink(p);\n } catch {\n // ignore\n }\n }\n }\n }\n\n /**\n * Remote browser fallback: build File objects inside the page and attach them via JS.\n *\n * When Stagehand is driving a browser that cannot see the local filesystem (Browserbase,\n * remote CDP, etc.), CDP's DOM.setFileInputFiles would fail because Chrome can't reach\n * our temp files. Instead we base64-encode the payloads, send them into the page, and\n * let a DOM helper create File objects + dispatch change/input events.\n */\n private async assignFilesViaPayloadInjection(\n objectId: Protocol.Runtime.RemoteObjectId,\n files: NormalizedFilePayload[],\n ): Promise<void> {\n const session = this.frame.session;\n\n for (const payload of files) {\n if (payload.buffer.length > MAX_REMOTE_UPLOAD_BYTES) {\n throw new StagehandInvalidArgumentError(\n `setInputFiles(): file \"${payload.name}\" is larger than the 50MB limit for remote uploads`,\n );\n }\n }\n\n const serialized = files.map((payload) => ({\n name: payload.name,\n mimeType: payload.mimeType,\n lastModified: payload.lastModified,\n base64: payload.buffer.toString(\"base64\"),\n }));\n\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration:\n locatorScriptSources.assignFilePayloadsToInputElement,\n arguments: [\n {\n value: serialized,\n },\n ],\n returnByValue: true,\n },\n );\n\n const ok = Boolean(res.result?.value);\n if (!ok) {\n throw new StagehandInvalidArgumentError(\n \"Unable to assign file payloads to remote input element\",\n );\n }\n }\n\n /**\n * Return the DOM backendNodeId for this locator's target element.\n * Useful for identity comparisons without needing element handles.\n */\n async backendNodeId(): Promise<Protocol.DOM.BackendNodeId> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session.send(\"DOM.enable\").catch(() => {});\n const { node } = await session.send<{ node: Protocol.DOM.Node }>(\n \"DOM.describeNode\",\n { objectId },\n );\n return node.backendNodeId as Protocol.DOM.BackendNodeId;\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /** Return how many nodes the current selector resolves to. */\n public async count(): Promise<number> {\n const session = this.frame.session;\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n return this.selectorResolver.count(this.selectorQuery);\n }\n\n /**\n * Return the center of the element's bounding box in the owning frame's viewport\n * (CSS pixels), rounded to integers. Scrolls into view best-effort.\n */\n public async centroid(): Promise<{ x: number; y: number }> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n return { x: Math.round(cx), y: Math.round(cy) };\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Highlight the element's bounding box using the CDP Overlay domain.\n * - Scrolls element into view best-effort.\n * - Shows a semi-transparent overlay briefly, then hides it.\n */\n public async highlight(options?: {\n durationMs?: number;\n borderColor?: { r: number; g: number; b: number; a?: number };\n contentColor?: { r: number; g: number; b: number; a?: number };\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n const duration = Math.max(0, options?.durationMs ?? 800);\n\n const borderColor = options?.borderColor ?? { r: 255, g: 0, b: 0, a: 0.9 };\n const contentColor =\n options?.contentColor ?? ({ r: 255, g: 200, b: 0, a: 0.2 } as const);\n\n try {\n await session.send(\"Overlay.enable\").catch(() => {});\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n\n // Prefer backendNodeId to keep highlight stable even if objectId is released.\n await session.send(\"DOM.enable\").catch(() => {});\n let backendNodeId: Protocol.DOM.BackendNodeId | undefined;\n try {\n const { node } = await session.send<{ node: Protocol.DOM.Node }>(\n \"DOM.describeNode\",\n { objectId },\n );\n backendNodeId = node.backendNodeId as Protocol.DOM.BackendNodeId;\n } catch {\n backendNodeId = undefined;\n }\n\n const highlightConfig: Protocol.Overlay.HighlightConfig = {\n showInfo: false,\n showStyles: false,\n showRulers: false,\n showExtensionLines: false,\n borderColor,\n contentColor,\n } as Protocol.Overlay.HighlightConfig;\n\n const highlightOnce = async () => {\n await session.send<never>(\"Overlay.highlightNode\", {\n ...(backendNodeId ? { backendNodeId } : { objectId }),\n highlightConfig,\n });\n };\n\n // Initial draw\n await highlightOnce();\n\n // Keep alive until duration elapses to resist overlay clears on mouse move/repaints\n if (duration > 0) {\n const start = Date.now();\n const tick = Math.min(300, Math.max(100, Math.floor(duration / 50)));\n while (Date.now() - start < duration) {\n await new Promise((r) => setTimeout(r, tick));\n try {\n await highlightOnce();\n } catch {\n // ignore transient errors\n }\n }\n await session.send<never>(\"Overlay.hideHighlight\").catch(() => {});\n }\n } finally {\n // Releasing objectId should not affect highlight when using backendNodeId.\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Move the mouse cursor to the element's visual center without clicking.\n * - Scrolls into view best-effort, resolves geometry, then dispatches a mouse move.\n */\n async hover(): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n\n await session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x: cx,\n y: cy,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest);\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Click the element at its visual center.\n * Steps:\n * 1) Resolve selector to { objectId } in the frame world.\n * 2) Scroll into view via `DOM.scrollIntoViewIfNeeded({ objectId })`.\n * 3) Read geometry via `DOM.getBoxModel({ objectId })` → compute a center point.\n * 4) Synthesize mouse press + release via `Input.dispatchMouseEvent`.\n */\n async click(options?: {\n button?: MouseButton;\n clickCount?: number;\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n const button = options?.button ?? \"left\";\n const clickCount = options?.clickCount ?? 1;\n\n try {\n // Scroll into view using objectId (avoids frontend nodeId dependence)\n await session.send(\"DOM.scrollIntoViewIfNeeded\", { objectId });\n\n // Get geometry using objectId\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n\n // Dispatch click events in a pipelined burst to reduce inter-click delay\n // from network/CPU jitter between round trips.\n const dispatches: Array<Promise<unknown>> = [];\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseMoved\",\n x: cx,\n y: cy,\n button: \"none\",\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n\n for (let i = 1; i <= clickCount; i++) {\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mousePressed\",\n x: cx,\n y: cy,\n button,\n clickCount: i,\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n dispatches.push(\n session.send<never>(\"Input.dispatchMouseEvent\", {\n type: \"mouseReleased\",\n x: cx,\n y: cy,\n button,\n clickCount: i,\n } as Protocol.Input.DispatchMouseEventRequest),\n );\n }\n await Promise.all(dispatches);\n } finally {\n // release the element handle\n try {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n } catch {\n // If the context navigated or was destroyed (e.g., link opens new tab),\n // releaseObject may fail with -32000. Ignore as best-effort cleanup.\n }\n }\n }\n\n /**\n * Tap the element at its visual center with a real (trusted) touch.\n * Mirrors {@link click} but synthesizes touch input via `Input.dispatchTouchEvent`\n * instead of mouse input, so mobile layouts that gate handlers on touch/pointer\n * (`pointerType: \"touch\"`) events — where a mouse click never registers — respond\n * correctly. This is the deterministic (selector-based) counterpart used when a\n * recorded CUA `tap` step is replayed.\n *\n * Does not require touch emulation: CDP delivers a trusted touch sequence even on\n * a session reporting `maxTouchPoints: 0`.\n */\n async tap(): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n try {\n await session.send(\"DOM.scrollIntoViewIfNeeded\", { objectId });\n\n const box = await session.send<Protocol.DOM.GetBoxModelResponse>(\n \"DOM.getBoxModel\",\n { objectId },\n );\n if (!box.model) throw new ElementNotVisibleError(this.selector);\n const { cx, cy } = this.centerFromBoxContent(box.model.content);\n\n // Pipelined burst, matching click's press/release batching: CDP preserves\n // per-session command order, so awaiting each dispatch in turn would only\n // add a round trip (a full network RTT against a remote browser).\n await Promise.all([\n session.send<never>(\"Input.dispatchTouchEvent\", {\n type: \"touchStart\",\n touchPoints: [{ x: cx, y: cy }],\n } as Protocol.Input.DispatchTouchEventRequest),\n session.send<never>(\"Input.dispatchTouchEvent\", {\n type: \"touchEnd\",\n touchPoints: [],\n } as Protocol.Input.DispatchTouchEventRequest),\n ]);\n } finally {\n try {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n } catch {\n // If the context navigated or was destroyed (e.g., link opens new tab),\n // releaseObject may fail with -32000. Ignore as best-effort cleanup.\n }\n }\n }\n\n /**\n * Dispatch a DOM 'click' MouseEvent on the element itself.\n * - Does not synthesize real pointer input; directly dispatches an event.\n * - Useful for elements that rely on click handlers without needing hit-testing.\n */\n async sendClickEvent(options?: {\n bubbles?: boolean;\n cancelable?: boolean;\n composed?: boolean;\n detail?: number;\n }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n const bubbles = options?.bubbles ?? true;\n const cancelable = options?.cancelable ?? true;\n const composed = options?.composed ?? true;\n const detail = options?.detail ?? 1;\n try {\n await session\n .send(\"DOM.scrollIntoViewIfNeeded\", { objectId })\n .catch(() => {});\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.dispatchDomClick,\n arguments: [\n {\n value: { bubbles, cancelable, composed, detail },\n },\n ],\n returnByValue: true,\n },\n );\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Scroll the element vertically to a given percentage (0–100).\n * - If the element is <html> or <body>, scrolls the window/document.\n * - Otherwise, scrolls the element itself via element.scrollTo.\n */\n async scrollTo(percent: number | string): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.scrollElementToPercent,\n arguments: [{ value: percent as unknown as number }],\n returnByValue: true,\n },\n );\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n\n /**\n * Fill an input/textarea/contenteditable element.\n * Mirrors Playwright semantics: the DOM helper either applies the native\n * value setter (for special input types) or asks us to type text via the CDP\n * Input domain after focusing/selecting.\n */\n async fill(value: string): Promise<void> {\n const session = this.frame.session;\n // Use the bundled locator globals; the raw fill snippet depends on helper symbols.\n const fillDeclaration = `function(value) { ${locatorScriptBootstrap}; return ${locatorScriptGlobalRefs.fillElementValue}.call(this, value); }`;\n const { objectId } = await this.resolveNode();\n\n let releaseNeeded = true;\n\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: fillDeclaration,\n arguments: [{ value }],\n returnByValue: true,\n },\n );\n if (res.exceptionDetails) {\n // prefer exception.description over text (eg \"Uncaught\")\n const message =\n res.exceptionDetails.exception?.description ??\n res.exceptionDetails.text ??\n \"Unknown exception during locator().fill()\";\n throw new StagehandLocatorError(\"Filling\", this.selector, message);\n }\n\n const result = res.result.value as\n | { status?: string; reason?: string; value?: string }\n | null\n | undefined;\n const status =\n typeof result === \"object\" && result ? result.status : undefined;\n\n if (status === \"done\") {\n return;\n }\n\n if (status === \"needsinput\") {\n // Release the current handle before synthesizing keyboard input to avoid leaking it.\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n releaseNeeded = false;\n\n const valueToType =\n typeof result?.value === \"string\" ? result.value : value;\n\n let prepared = false;\n try {\n const { objectId: prepObjectId } = await this.resolveNode();\n try {\n const prepRes =\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId: prepObjectId,\n functionDeclaration:\n locatorScriptSources.prepareElementForTyping,\n returnByValue: true,\n },\n );\n prepared = Boolean(prepRes.result.value);\n } finally {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId: prepObjectId })\n .catch(() => {});\n }\n } catch {\n // Ignore preparation failures; we'll fall back to typing best-effort.\n }\n\n if (!prepared && valueToType.length > 0) {\n await this.type(valueToType);\n return;\n }\n\n if (valueToType.length === 0) {\n // Simulate deleting the currently selected text to clear the field.\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n key: \"Backspace\",\n code: \"Backspace\",\n windowsVirtualKeyCode: 8,\n nativeVirtualKeyCode: 8,\n } as Protocol.Input.DispatchKeyEventRequest);\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n key: \"Backspace\",\n code: \"Backspace\",\n windowsVirtualKeyCode: 8,\n nativeVirtualKeyCode: 8,\n } as Protocol.Input.DispatchKeyEventRequest);\n } else {\n await session.send<never>(\"Input.insertText\", { text: valueToType });\n }\n\n return;\n }\n\n if (status === \"error\") {\n const reason =\n typeof result?.reason === \"string\" && result.reason.length > 0\n ? result.reason\n : \"Failed to fill element\";\n throw new StagehandInvalidArgumentError(\n `Failed to fill element (${reason})`,\n );\n }\n\n // Backward compatibility: if no status is returned (older bundle), fall back to setter logic.\n if (!status) {\n await this.type(value);\n }\n } finally {\n if (releaseNeeded) {\n await session\n .send<never>(\"Runtime.releaseObject\", { objectId })\n .catch(() => {});\n }\n }\n }\n\n /**\n * Type text into the element (focuses first).\n * - Focus via element.focus() in page JS (no DOM.focus(nodeId)).\n * - If no delay, uses `Input.insertText` for efficiency.\n * - With delay, synthesizes `keyDown`/`keyUp` per character.\n */\n async type(text: string, options?: { delay?: number }): Promise<void> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n\n try {\n // Focus using JS (avoids DOM.focus(nodeId))\n await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.focusElement,\n returnByValue: true,\n },\n );\n\n if (!options?.delay) {\n await session.send<never>(\"Input.insertText\", { text });\n return;\n }\n\n for (const ch of text) {\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyDown\",\n text: ch,\n key: ch,\n } as Protocol.Input.DispatchKeyEventRequest);\n\n await session.send<never>(\"Input.dispatchKeyEvent\", {\n type: \"keyUp\",\n text: ch,\n key: ch,\n } as Protocol.Input.DispatchKeyEventRequest);\n\n await new Promise((r) => setTimeout(r, options.delay));\n }\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Select one or more options on a `<select>` element.\n * Returns the values actually selected after the operation.\n */\n async selectOption(values: string | string[]): Promise<string[]> {\n const session = this.frame.session;\n const desired = Array.isArray(values) ? values : [values];\n const { objectId } = await this.resolveNode();\n\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.selectElementOptions,\n arguments: [{ value: desired }],\n returnByValue: true,\n },\n );\n\n return (res.result.value as string[]) ?? [];\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return true if the element is attached and visible (rough heuristic).\n */\n async isVisible(): Promise<boolean> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.isElementVisible,\n returnByValue: true,\n },\n );\n return Boolean(res.result.value);\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return true if the element is an input[type=checkbox|radio] and is checked.\n * Also considers aria-checked for ARIA widgets.\n */\n async isChecked(): Promise<boolean> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.isElementChecked,\n returnByValue: true,\n },\n );\n return Boolean(res.result.value);\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's input value (for input/textarea/select/contenteditable).\n */\n async inputValue(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInputValue,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's textContent (raw, not innerText).\n */\n async textContent(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementTextContent,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's innerHTML string.\n */\n async innerHtml(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInnerHTML,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return the element's innerText (layout-aware, visible text).\n */\n async innerText(): Promise<string> {\n const session = this.frame.session;\n const { objectId } = await this.resolveNode();\n try {\n const res = await session.send<Protocol.Runtime.CallFunctionOnResponse>(\n \"Runtime.callFunctionOn\",\n {\n objectId,\n functionDeclaration: locatorScriptSources.readElementInnerText,\n returnByValue: true,\n },\n );\n return String(res.result.value ?? \"\");\n } finally {\n await session.send<never>(\"Runtime.releaseObject\", { objectId });\n }\n }\n\n /**\n * Return a locator narrowed to the first match.\n */\n first(): Locator {\n return this.nth(0);\n }\n\n /** Return a locator narrowed to the element at the given zero-based index. */\n nth(index: number): Locator {\n const value = Number(index);\n if (!Number.isFinite(value) || value < 0) {\n throw new StagehandInvalidArgumentError(\n \"locator().nth() expects a non-negative index\",\n );\n }\n\n const nextIndex = Math.floor(value);\n if (nextIndex === this.nthIndex) {\n return this;\n }\n\n return new Locator(this.frame, this.selector, this.options, nextIndex);\n }\n\n // ---------- helpers ----------\n\n /**\n * Resolve `this.selector` within the frame to `{ objectId, nodeId? }`:\n * Delegates to a shared selector resolver so all selector logic stays in sync.\n */\n public async resolveNode(): Promise<{\n nodeId: Protocol.DOM.NodeId | null;\n objectId: Protocol.Runtime.RemoteObjectId;\n }> {\n const session = this.frame.session;\n\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n\n const index = this.nthIndex < 0 ? 0 : this.nthIndex;\n const resolved = await this.selectorResolver.resolveAtIndex(\n this.selectorQuery,\n index,\n );\n if (!resolved) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n\n return resolved;\n }\n\n /**\n * Resolve all matching nodes for this locator.\n * If the locator is narrowed via nth(), only that index is returned.\n */\n public async resolveNodesForMask(): Promise<\n Array<{\n nodeId: Protocol.DOM.NodeId | null;\n objectId: Protocol.Runtime.RemoteObjectId;\n }>\n > {\n const session = this.frame.session;\n\n await session.send(\"Runtime.enable\");\n await session.send(\"DOM.enable\");\n\n if (this.nthIndex >= 0) {\n const resolved = await this.selectorResolver.resolveAtIndex(\n this.selectorQuery,\n this.nthIndex,\n );\n if (!resolved) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n return [resolved];\n }\n\n const resolved = await this.selectorResolver.resolveAll(this.selectorQuery);\n if (!resolved.length) {\n throw new StagehandElementNotFoundError([this.selector]);\n }\n return resolved;\n }\n\n /** Compute a center point from a BoxModel content quad */\n private centerFromBoxContent(content: number[]): { cx: number; cy: number } {\n // content is [x1,y1, x2,y2, x3,y3, x4,y4]\n if (!content || content.length < 8) {\n throw new StagehandInvalidArgumentError(\"Invalid box model content quad\");\n }\n const xs = [content[0], content[2], content[4], content[6]];\n const ys = [content[1], content[3], content[5], content[7]];\n const cx = (xs[0] + xs[1] + xs[2] + xs[3]) / 4;\n const cy = (ys[0] + ys[1] + ys[2] + ys[3]) / 4;\n return { cx, cy };\n }\n}\n"]}
|
|
@@ -314,6 +314,21 @@ export declare class Page {
|
|
|
314
314
|
clickCount?: number;
|
|
315
315
|
returnXpath?: boolean;
|
|
316
316
|
}): Promise<string>;
|
|
317
|
+
/**
|
|
318
|
+
* Tap at absolute page coordinates (CSS pixels) with a real (trusted) touch.
|
|
319
|
+
* Mirrors {@link click} but synthesizes touch input via `Input.dispatchTouchEvent`
|
|
320
|
+
* instead of mouse input, so mobile layouts that gate their handlers on
|
|
321
|
+
* touch/pointer events (`pointerType: "touch"`) — where a synthesized mouse click
|
|
322
|
+
* never registers — respond correctly. Coordinates are relative to the viewport
|
|
323
|
+
* origin (top-left). Does not scroll.
|
|
324
|
+
*
|
|
325
|
+
* Does not require touch emulation: CDP delivers a trusted touch sequence even on
|
|
326
|
+
* a session reporting `maxTouchPoints: 0`. Whether the agent *chooses* this over
|
|
327
|
+
* {@link click} is decided by `V3.usesTouch`.
|
|
328
|
+
*/
|
|
329
|
+
tap(x: number, y: number, options?: {
|
|
330
|
+
returnXpath?: boolean;
|
|
331
|
+
}): Promise<string>;
|
|
317
332
|
/**
|
|
318
333
|
* Hover at absolute page coordinates (CSS pixels).
|
|
319
334
|
* Dispatches mouseMoved via CDP Input domain on the top-level page target's
|