@browserbasehq/orca 3.2.0-preview.2 → 3.2.0-preview.4
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/v3/agent/AnthropicCUAClient.js +5 -5
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js +5 -5
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +5 -5
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/act.js +1 -10
- package/dist/cjs/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/ariaTree.js +1 -12
- package/dist/cjs/lib/v3/agent/tools/ariaTree.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/braveSearch.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/click.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/clickAndHold.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/extract.js +1 -10
- package/dist/cjs/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.js +1 -10
- package/dist/cjs/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/index.d.ts +2 -2
- package/dist/cjs/lib/v3/agent/tools/index.js +53 -5
- package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/keys.d.ts +1 -1
- package/dist/cjs/lib/v3/agent/tools/keys.js.map +1 -1
- package/dist/cjs/lib/v3/agent/tools/type.js.map +1 -1
- package/dist/cjs/lib/v3/api.js +9 -2
- package/dist/cjs/lib/v3/api.js.map +1 -1
- package/dist/cjs/lib/v3/flowlogger/EventEmitter.d.ts +7 -0
- package/dist/cjs/lib/v3/flowlogger/EventEmitter.js +30 -0
- package/dist/cjs/lib/v3/flowlogger/EventEmitter.js.map +1 -0
- package/dist/cjs/lib/v3/flowlogger/EventSink.d.ts +44 -0
- package/dist/cjs/lib/v3/flowlogger/EventSink.js +217 -0
- package/dist/cjs/lib/v3/flowlogger/EventSink.js.map +1 -0
- package/dist/cjs/lib/v3/flowlogger/EventStore.d.ts +26 -0
- package/dist/cjs/lib/v3/flowlogger/EventStore.js +135 -0
- package/dist/cjs/lib/v3/flowlogger/EventStore.js.map +1 -0
- package/dist/{esm/lib/v3/flowLogger.d.ts → cjs/lib/v3/flowlogger/FlowLogger.d.ts} +32 -31
- package/dist/cjs/lib/v3/flowlogger/FlowLogger.js +591 -0
- package/dist/cjs/lib/v3/flowlogger/FlowLogger.js.map +1 -0
- package/dist/cjs/lib/v3/flowlogger/prettify.d.ts +6 -0
- package/dist/cjs/lib/v3/flowlogger/prettify.js +395 -0
- package/dist/cjs/lib/v3/flowlogger/prettify.js.map +1 -0
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js +26 -28
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +2 -2
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +3 -5
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/cjs/lib/v3/llm/aisdk.js +9 -9
- package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/options.d.ts +2 -0
- package/dist/cjs/lib/v3/types/public/options.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/cdp.d.ts +1 -1
- package/dist/cjs/lib/v3/understudy/cdp.js +83 -43
- package/dist/cjs/lib/v3/understudy/cdp.js.map +1 -1
- package/dist/cjs/lib/v3/understudy/page.js +18 -23
- package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
- package/dist/cjs/lib/v3/v3.d.ts +5 -5
- package/dist/cjs/lib/v3/v3.js +48 -46
- package/dist/cjs/lib/v3/v3.js.map +1 -1
- package/dist/cjs/tests/integration/flowLogger.spec.d.ts +1 -0
- package/dist/cjs/tests/integration/flowLogger.spec.js +714 -0
- package/dist/cjs/tests/integration/flowLogger.spec.js.map +1 -0
- package/dist/cjs/tests/integration/testUtils.d.ts +33 -0
- package/dist/cjs/tests/integration/testUtils.js +144 -0
- package/dist/cjs/tests/integration/testUtils.js.map +1 -1
- package/dist/cjs/tests/integration/timeouts.spec.js +112 -2
- package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.d.ts +1 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.js +95 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-cdp.test.js.map +1 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.d.ts +1 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.js +43 -0
- package/dist/cjs/tests/unit/flowlogger-capturing-llm.test.js.map +1 -0
- package/dist/cjs/tests/unit/flowlogger-eventstore.test.d.ts +1 -0
- package/dist/cjs/tests/unit/flowlogger-eventstore.test.js +250 -0
- package/dist/cjs/tests/unit/flowlogger-eventstore.test.js.map +1 -0
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +1 -1
- package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js +1 -1
- package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js +1 -1
- package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/act.js +1 -10
- package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/ariaTree.js +1 -12
- package/dist/esm/lib/v3/agent/tools/ariaTree.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/braveSearch.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/click.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/clickAndHold.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/extract.js +1 -10
- package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillFormVision.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillform.js +1 -10
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/index.d.ts +2 -2
- package/dist/esm/lib/v3/agent/tools/index.js +53 -5
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/keys.d.ts +1 -1
- package/dist/esm/lib/v3/agent/tools/keys.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/type.js.map +1 -1
- package/dist/esm/lib/v3/api.js +9 -2
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/flowlogger/EventEmitter.d.ts +7 -0
- package/dist/esm/lib/v3/flowlogger/EventEmitter.js +26 -0
- package/dist/esm/lib/v3/flowlogger/EventEmitter.js.map +1 -0
- package/dist/esm/lib/v3/flowlogger/EventSink.d.ts +44 -0
- package/dist/esm/lib/v3/flowlogger/EventSink.js +206 -0
- package/dist/esm/lib/v3/flowlogger/EventSink.js.map +1 -0
- package/dist/esm/lib/v3/flowlogger/EventStore.d.ts +26 -0
- package/dist/esm/lib/v3/flowlogger/EventStore.js +127 -0
- package/dist/esm/lib/v3/flowlogger/EventStore.js.map +1 -0
- package/dist/{cjs/lib/v3/flowLogger.d.ts → esm/lib/v3/flowlogger/FlowLogger.d.ts} +32 -31
- package/dist/esm/lib/v3/flowlogger/FlowLogger.js +583 -0
- package/dist/esm/lib/v3/flowlogger/FlowLogger.js.map +1 -0
- package/dist/esm/lib/v3/flowlogger/prettify.d.ts +6 -0
- package/dist/esm/lib/v3/flowlogger/prettify.js +389 -0
- package/dist/esm/lib/v3/flowlogger/prettify.js.map +1 -0
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +25 -27
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +2 -4
- package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.js +1 -1
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/types/public/options.d.ts +2 -0
- package/dist/esm/lib/v3/types/public/options.js.map +1 -1
- package/dist/esm/lib/v3/understudy/cdp.d.ts +1 -1
- package/dist/esm/lib/v3/understudy/cdp.js +78 -38
- package/dist/esm/lib/v3/understudy/cdp.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.js +13 -18
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/v3.d.ts +5 -5
- package/dist/esm/lib/v3/v3.js +43 -41
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/tests/integration/flowLogger.spec.d.ts +1 -0
- package/dist/esm/tests/integration/flowLogger.spec.js +712 -0
- package/dist/esm/tests/integration/flowLogger.spec.js.map +1 -0
- package/dist/esm/tests/integration/testUtils.d.ts +33 -0
- package/dist/esm/tests/integration/testUtils.js +138 -0
- package/dist/esm/tests/integration/testUtils.js.map +1 -1
- package/dist/esm/tests/integration/timeouts.spec.js +112 -2
- package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
- package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.d.ts +1 -0
- package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.js +93 -0
- package/dist/esm/tests/unit/flowlogger-capturing-cdp.test.js.map +1 -0
- package/dist/esm/tests/unit/flowlogger-capturing-llm.test.d.ts +1 -0
- package/dist/esm/tests/unit/flowlogger-capturing-llm.test.js +41 -0
- package/dist/esm/tests/unit/flowlogger-capturing-llm.test.js.map +1 -0
- package/dist/esm/tests/unit/flowlogger-eventstore.test.d.ts +1 -0
- package/dist/esm/tests/unit/flowlogger-eventstore.test.js +248 -0
- package/dist/esm/tests/unit/flowlogger-eventstore.test.js.map +1 -0
- package/package.json +3 -1
- package/dist/cjs/lib/v3/eventStore.d.ts +0 -41
- package/dist/cjs/lib/v3/eventStore.js +0 -375
- package/dist/cjs/lib/v3/eventStore.js.map +0 -1
- package/dist/cjs/lib/v3/flowLogger.js +0 -470
- package/dist/cjs/lib/v3/flowLogger.js.map +0 -1
- package/dist/esm/lib/v3/eventStore.d.ts +0 -41
- package/dist/esm/lib/v3/eventStore.js +0 -363
- package/dist/esm/lib/v3/eventStore.js.map +0 -1
- package/dist/esm/lib/v3/flowLogger.js +0 -462
- package/dist/esm/lib/v3/flowLogger.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowLogger.spec.js","sourceRoot":"","sources":["../../../../tests/integration/flowLogger.spec.ts"],"names":[],"mappings":";;AAAA,2CAAgD;AAChD,6BAAwB;AACxB,uEAAyE;AACzE,yEAAkE;AAClE,8FAAgG;AAChG,8CAAwC;AACxC,iDAMwB;AACxB,iDAAiD;AAEjD,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,kBAAkB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,0BAA0B,CACjC,YAAmD,EAAE;IAErD,MAAM,EAAE,GAAG,IAAI,UAAE,CAAC,IAAA,8BAAe,EAAC,SAAS,CAAC,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,gCAAiB,EAAE,CAAC;IACrC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAc,EAAE,EAAE;QAChC,IAAI,KAAK,YAAY,yBAAS,EAAE,CAAC;YAC/B,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE,CAC9B,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,EAAM;IAC1C,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,EAAM;IAC5C,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAChD,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,EAAM,EACN,QAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,YAAY,CAAC,MAAmB,EAAE,SAAiB;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAmB,EAAE,SAAiB;IAChE,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChD,IAAA,aAAM,EAAC,OAAO,EAAE,qBAAqB,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CAAC,KAAgB;IACvC,IAAA,aAAM,EAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAgB,EAAE,MAAiB;IAC7D,IAAA,aAAM,EAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;QACnC,GAAG,MAAM,CAAC,cAAc;QACxB,MAAM,CAAC,OAAO;KACf,CAAC,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAmB;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAE/D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YAC5C,IAAA,aAAM,EACJ,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EACtB,GAAG,KAAK,CAAC,SAAS,8BAA8B,QAAQ,EAAE,CAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAmB,EAAE,SAAiB;IAC9D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAA,aAAM,EAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,MAAmB,EACnB,MAAiB,EACjB,SAAiB;IAEjB,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,SAAS,KAAK,SAAS;QAC7B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CACtC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAAmB,EACnB,SAAiB,EACjB,kBAAkB,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,gBAAgB;IAEvE,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACjE,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAmB;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAC7B,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,SAAS,KAAK,iBAAiB;QACrC,KAAK,CAAC,SAAS,KAAK,kBAAkB,CACzC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAEpE,IAAA,aAAM,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAA,aAAM,EACJ,KAAK,CAAC,cAAc,CAAC,MAAM,EAC3B,GAAG,KAAK,CAAC,SAAS,cAAc,CACjC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,IAAA,aAAM,EACJ,UAAU,EACV,GAAG,KAAK,CAAC,SAAS,yBAAyB,CAC5C,CAAC,WAAW,EAAE,CAAC;QAChB,IAAA,aAAM,EAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAmB;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAEpE,IAAA,aAAM,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAA,aAAM,EACJ,KAAK,CAAC,cAAc,CAAC,MAAM,EAC3B,GAAG,KAAK,CAAC,SAAS,cAAc,CACjC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,IAAA,aAAM,EACJ,UAAU,EACV,GAAG,KAAK,CAAC,SAAS,yBAAyB,CAC5C,CAAC,WAAW,EAAE,CAAC;QAEhB,IAAI,KAAK,CAAC,SAAS,KAAK,cAAc,EAAE,CAAC;YACvC,IAAA,aAAM,EAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,IAAA,aAAM,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAChC,MAAmB,EACnB,SAAiB;IAEjB,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACrC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CACxC,CAAC;IAEF,IAAA,aAAM,EAAC,QAAQ,EAAE,sCAAsC,CAAC,CAAC,WAAW,EAAE,CAAC;IACvE,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,IAAA,aAAM,EAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,eAAe,CACtB,KAA6B;IAE7B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAAmB,EACnB,QAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACrE,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAA,aAAM,EAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,WAAI,CAAC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IAC5C,WAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE5C,IAAA,WAAI,EAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,UAAU,GAAG,wBAAwB,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAA,+CAAgC,EAAC;YACjD,aAAa,EAAE;gBACb,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACjB,SAAS,EAAE,IAAA,gCAAiB,EAAC,OAAO,CAAC;oBACrC,WAAW,EAAE,SAAS,UAAU,EAAE;oBAClC,MAAM,EAAE,OAAO;oBACf,SAAS,EAAE,EAAE;oBACb,OAAO,EAAE,KAAK;iBACf,CAAC;aACH;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,0BAA0B,CAAC;YACpC,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,CACb,UAAU,CAAC;;;;;;;;kBAQD,UAAU;;;;SAInB,CAAC,CACH,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE/D,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,IAAA,aAAM,EACJ,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAC/D,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACf,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAC7D,MAAM,SAAS,GAAG,kBAAkB,CAClC,MAAM,EACN,4BAA4B,CAC7B,CAAC;YACF,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YACjE,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;YACnE,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;YACtE,MAAM,mBAAmB,GAAG,kBAAkB,CAC5C,MAAM,EACN,+BAA+B,CAChC,CAAC;YAEF,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,6BAA6B,EAAE,CAAC;gBAChC,oBAAoB,EAAE,CAAC;aACxB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACpC,IAAA,aAAM,EAAC,UAAU,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1D,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,IAAA,aAAM,EAAC,UAAU,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1D,kBAAkB,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YACpD,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,WAAW,GAAG,4BAA4B,CAAC;QACjD,MAAM,YAAY,GAAG,2BAA2B,CAAC;QACjD,MAAM,SAAS,GAAG,IAAA,+CAAgC,EAAC;YACjD,aAAa,EAAE;gBACb,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACzB,QAAQ,EAAE;wBACR;4BACE,SAAS,EAAE,IAAA,gCAAiB,EAAC,OAAO,CAAC;4BACrC,WAAW,EAAE,WAAW;4BACxB,MAAM,EAAE,OAAO;4BACf,SAAS,EAAE,EAAE;yBACd;qBACF;iBACF,CAAC;gBACF,UAAU,EAAE;oBACV,KAAK,EAAE,YAAY;iBACpB;gBACD,QAAQ,EAAE;oBACR,SAAS,EAAE,IAAI;oBACf,QAAQ,EAAE,MAAM;iBACjB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,0BAA0B,CAAC;YACpC,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,CACb,UAAU,CAAC;;;;4CAIyB,WAAW;oBACnC,YAAY;;;SAGvB,CAAC,CACH,CAAC;YAEF,MAAM,eAAe,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;YAElE,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACtC,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE9C,MAAM,aAAa,GAAG,MAAM,2BAA2B,CACrD,EAAE,EACF,eAAe,CAChB,CAAC;YACF,MAAM,WAAW,GAAG,kBAAkB,CACpC,aAAa,EACb,uBAAuB,CACxB,CAAC;YACF,MAAM,gBAAgB,GAAG,kBAAkB,CACzC,aAAa,EACb,gCAAgC,CACjC,CAAC;YACF,MAAM,kBAAkB,GAAG,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;YAC1E,MAAM,mBAAmB,GAAG,YAAY,CACtC,aAAa,EACb,kBAAkB,CACnB,CAAC;YAEF,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACzC,uBAAuB,CAAC,aAAa,EAAE;gBACrC,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,8BAA8B,EAAE,CAAC;gBACjC,qBAAqB,EAAE,CAAC;aACzB,CAAC,CAAC;YACH,gBAAgB,CAAC,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAChE,eAAe,CAAC,WAAW,CAAC,CAAC;YAC7B,kBAAkB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;gBACnD,WAAW,CAAC,OAAO;aACpB,CAAC,CAAC;YACH,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;gBACpD,WAAW,CAAC,OAAO;aACpB,CAAC,CAAC;YACH,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACzC,yBAAyB,CAAC,aAAa,CAAC,CAAC;YAEzC,MAAM,eAAe,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,OAAO,CACpC,mBAAmB,EACnB,OAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAChC,CAAC;YAEF,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;YAEvD,MAAM,aAAa,GAAG,MAAM,2BAA2B,CACrD,EAAE,EACF,eAAe,CAChB,CAAC;YACF,MAAM,WAAW,GAAG,kBAAkB,CACpC,aAAa,EACb,uBAAuB,CACxB,CAAC;YACF,MAAM,gBAAgB,GAAG,kBAAkB,CACzC,aAAa,EACb,gCAAgC,CACjC,CAAC;YACF,MAAM,kBAAkB,GAAG,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;YAC1E,MAAM,mBAAmB,GAAG,YAAY,CACtC,aAAa,EACb,kBAAkB,CACnB,CAAC;YAEF,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACzC,uBAAuB,CAAC,aAAa,EAAE;gBACrC,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,8BAA8B,EAAE,CAAC;gBACjC,qBAAqB,EAAE,CAAC;aACzB,CAAC,CAAC;YACH,gBAAgB,CAAC,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAChE,eAAe,CAAC,WAAW,CAAC,CAAC;YAC7B,kBAAkB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAE5C,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,kBAAkB,EAAE,GAAG,mBAAmB,CAAC,EAAE,CAAC;gBACpE,IAAA,aAAM,EAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9D,CAAC;YAED,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACzC,yBAAyB,CAAC,aAAa,CAAC,CAAC;QAC3C,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;QAC/G,MAAM,UAAU,GAAG,kBAAkB,CAAC;QACtC,MAAM,SAAS,GAAG,IAAA,+CAAgC,EAAC;YACjD,aAAa,EAAE;gBACb,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACjB,SAAS,EAAE,IAAA,gCAAiB,EAAC,OAAO,CAAC;oBACrC,WAAW,EAAE,SAAS,UAAU,EAAE;oBAClC,MAAM,EAAE,OAAO;oBACf,SAAS,EAAE,EAAE;oBACb,OAAO,EAAE,KAAK;iBACf,CAAC;aACH;YACD,iBAAiB,EAAE;gBACjB,IAAA,+BAAgB,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,aAAa,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC;gBACvE,IAAA,+BAAgB,EAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC;aAC7C;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,0BAA0B,CAAC;YACpC,YAAY,EAAE,IAAI;YAClB,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,CACb,UAAU,CAAC;;;;;;;;kBAQD,UAAU;;;;SAInB,CAAC,CACH,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC;gBACtC,WAAW,EAAE,aAAa,UAAU,cAAc;gBAClD,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE/D,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,IAAA,aAAM,EACJ,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAChE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACf,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,kBAAkB,CACrC,MAAM,EACN,4BAA4B,CAC7B,CAAC;YACF,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;YACtE,MAAM,mBAAmB,GAAG,kBAAkB,CAC5C,MAAM,EACN,+BAA+B,CAChC,CAAC;YAEF,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,6BAA6B,EAAE,CAAC;gBAChC,oBAAoB,EAAE,CAAC;aACxB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAA,aAAM,EAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5D,kBAAkB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC1C,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACxC,kBAAkB,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YACpD,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAC3D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAC5D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,CACzD,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAC1D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,qGAAqG,EAAE,KAAK,IAAI,EAAE;QACrH,MAAM,SAAS,GAAG,IAAA,+CAAgC,EAAC;YACjD,aAAa,EAAE;gBACb,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACzB,QAAQ,EAAE;wBACR;4BACE,SAAS,EAAE,IAAA,gCAAiB,EAAC,OAAO,CAAC;4BACrC,WAAW,EAAE,YAAY;4BACzB,MAAM,EAAE,MAAM;4BACd,SAAS,EAAE,CAAC,OAAO,CAAC;yBACrB;qBACF;iBACF,CAAC;aACH;YACD,iBAAiB,EAAE;gBACjB,IAAA,+BAAgB,EACd,UAAU,EACV;oBACE,MAAM,EAAE;wBACN;4BACE,MAAM,EAAE,gCAAgC;4BACxC,KAAK,EAAE,OAAO;yBACf;qBACF;iBACF,EACD,YAAY,CACb;gBACD,IAAA,+BAAgB,EAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC;aAC7C;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,0BAA0B,CAAC;YACpC,YAAY,EAAE,IAAI;YAClB,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,CACb,UAAU,CAAC;;;;;;;SAOV,CAAC,CACH,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC;gBACtC,WAAW,EAAE,2BAA2B;gBACxC,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE/D,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,IAAA,aAAM,EAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE/D,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YACvE,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;YACxE,MAAM,gBAAgB,GAAG,kBAAkB,CACzC,MAAM,EACN,gCAAgC,CACjC,CAAC;YACF,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,kBAAkB,CACrC,MAAM,EACN,4BAA4B,CAC7B,CAAC;YACF,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;YACzE,MAAM,uBAAuB,GAAG,kBAAkB,CAChD,MAAM,EACN,8BAA8B,CAC/B,CAAC;YAEF,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,8BAA8B,EAAE,CAAC;gBACjC,qBAAqB,EAAE,CAAC;gBACxB,4BAA4B,EAAE,CAAC;gBAC/B,mBAAmB,EAAE,CAAC;aACvB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAChE,kBAAkB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5D,kBAAkB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC1C,kBAAkB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC5C,kBAAkB,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAC;YAC5D,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAC7D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAC9D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAC3D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAC5D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,CACzD,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAC1D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,YAAY,GAAG,qBAAqB,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAA,+CAAgC,EAAC;YACjD,aAAa,EAAE;gBACb,UAAU,EAAE;oBACV,KAAK,EAAE,YAAY;iBACpB;gBACD,QAAQ,EAAE;oBACR,SAAS,EAAE,IAAI;oBACf,QAAQ,EAAE,MAAM;iBACjB;aACF;YACD,iBAAiB,EAAE;gBACjB,IAAA,+BAAgB,EACd,SAAS,EACT;oBACE,WAAW,EAAE,mBAAmB;oBAChC,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBAC1B;qBACF;iBACF,EACD,WAAW,CACZ;gBACD,IAAA,+BAAgB,EAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC;aAC7C;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,0BAA0B,CAAC;YACpC,YAAY,EAAE,IAAI;YAClB,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,CACb,UAAU,CAAC;;;;oBAIC,YAAY;;;SAGvB,CAAC,CACH,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC;gBACtC,WAAW,EAAE,+BAA+B;gBAC5C,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAElC,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC/D,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YACvE,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;YACxE,MAAM,gBAAgB,GAAG,kBAAkB,CACzC,MAAM,EACN,gCAAgC,CACjC,CAAC;YAEF,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,8BAA8B,EAAE,CAAC;gBACjC,qBAAqB,EAAE,CAAC;aACzB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAChE,kBAAkB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAClD,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAC3D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAC5D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAC7D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAC9D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;QAC5G,MAAM,YAAY,GAAG,UAAU,CAAC;;;;;;;KAO/B,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,IAAA,+CAAgC,EAAC;YACtD,iBAAiB,EAAE;gBACjB,IAAA,+BAAgB,EAAC,MAAM,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,QAAQ,CAAC;gBACzD,IAAA,+BAAgB,EAAC,YAAY,EAAE,EAAE,EAAE,cAAc,CAAC;gBAClD,IAAA,+BAAgB,EAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC;aAC7C;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,0BAA0B,CAAC;YACzC,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAErB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC;gBAC3C,WAAW,EAAE,qDAAqD;gBAClE,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,IAAA,aAAM,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YAC7D,MAAM,iBAAiB,GAAG,kBAAkB,CAC1C,MAAM,EACN,wBAAwB,CACzB,CAAC;YACF,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;YACzE,MAAM,uBAAuB,GAAG,kBAAkB,CAChD,MAAM,EACN,8BAA8B,CAC/B,CAAC;YACF,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAC5D,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;YAE9D,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,sBAAsB,EAAE,CAAC;gBACzB,aAAa,EAAE,CAAC;gBAChB,4BAA4B,EAAE,CAAC;gBAC/B,mBAAmB,EAAE,CAAC;aACvB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC9D,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,IAAA,aAAM,EAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACxD,kBAAkB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAChD,IAAA,aAAM,EAAC,cAAc,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9D,kBAAkB,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAC;YAC5D,IAAA,aAAM,EAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,IAAA,aAAM,EAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAErC,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC;gBACtD,IAAA,aAAM,EAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACvD,CAAC;YAED,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,QAAQ,GAAG,0BAA0B,EAAE,CAAC;QAC9C,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YAE1D,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9B,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YAC7D,MAAM,iBAAiB,GAAG,kBAAkB,CAC1C,MAAM,EACN,wBAAwB,CACzB,CAAC;YACF,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;YACzE,MAAM,uBAAuB,GAAG,kBAAkB,CAChD,MAAM,EACN,8BAA8B,CAC/B,CAAC;YAEF,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,sBAAsB,EAAE,CAAC;gBACzB,aAAa,EAAE,CAAC;gBAChB,4BAA4B,EAAE,CAAC;gBAC/B,mBAAmB,EAAE,CAAC;aACvB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC/D,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC1B,kBAAkB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAChD,eAAe,CAAC,cAAc,CAAC,CAAC;YAChC,kBAAkB,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAC;YAC5D,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjE,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,iHAAiH,EAAE,KAAK,IAAI,EAAE;QACjI,MAAM,EAAE,GAAG,0BAA0B,EAAE,CAAC;QACxC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,CACb,UAAU,CAAC;;;;;;;;;;;;;SAaV,CAAC,CACH,CAAC;YAEF,IAAI,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;YACzE,IAAI,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC7D,IAAI,IAAI,GAAG,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAChE,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;aACrB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjE,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAElC,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACzD,IAAI,GAAG,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAC5D,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;aACrB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjE,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAElC,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAA,4CAAuB,EAC3B,IAAI,EACJ,IAAI,CAAC,SAAS,EAAE,EAChB,OAAO,EACP,mBAAmB,EACnB,EAAE,EACF,MAAM,CACP,CAAC;YACF,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACzD,IAAI,GAAG,uBAAuB,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;YAC/D,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,6BAA6B,EAAE,CAAC;gBAChC,oBAAoB,EAAE,CAAC;aACxB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjE,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,IAAA,aAAM,EACJ,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CACnE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEf,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAEjC,kBAAkB,EAAE;gBACrB,UAAU,EAAE,OAAO;gBACnB,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YACH,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACzD,IAAA,aAAM,EAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxC,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjE,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,yBAAyB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACpE,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { expect, test } from \"@playwright/test\";\nimport { z } from \"zod\";\nimport { InMemoryEventSink } from \"../../lib/v3/flowlogger/EventSink.js\";\nimport { FlowEvent } from \"../../lib/v3/flowlogger/FlowLogger.js\";\nimport { performUnderstudyMethod } from \"../../lib/v3/handlers/handlerUtils/actHandlerUtils.js\";\nimport { V3 } from \"../../lib/v3/v3.js\";\nimport {\n createScriptedAisdkTestLlmClient,\n closeV3,\n doneToolResponse,\n findLastEncodedId,\n toolCallResponse,\n} from \"./testUtils.js\";\nimport { getV3TestConfig } from \"./v3.config.js\";\n\nfunction encodeHtml(html: string): string {\n return `data:text/html,${encodeURIComponent(html)}`;\n}\n\nfunction createRecordedFlowLoggerV3(\n overrides: Parameters<typeof getV3TestConfig>[0] = {},\n): V3 {\n const v3 = new V3(getV3TestConfig(overrides));\n const sink = new InMemoryEventSink();\n v3.bus.on(\"*\", (event: unknown) => {\n if (event instanceof FlowEvent) {\n void sink.emit(event);\n }\n });\n v3.eventStore.query = (query) =>\n sink.query({ ...query, sessionId: v3.eventStore.sessionId });\n return v3;\n}\n\nasync function listRecordedFlowEvents(v3: V3): Promise<FlowEvent[]> {\n return v3.eventStore.query({});\n}\n\nasync function captureFlowEventBaseline(v3: V3): Promise<Set<string>> {\n const events = await listRecordedFlowEvents(v3);\n return new Set(events.map((event) => event.eventId));\n}\n\nasync function listRecordedFlowEventsSince(\n v3: V3,\n baseline: Set<string>,\n): Promise<FlowEvent[]> {\n const events = await listRecordedFlowEvents(v3);\n return events.filter((event) => !baseline.has(event.eventId));\n}\n\nfunction eventsOfType(events: FlowEvent[], eventType: string): FlowEvent[] {\n return events.filter((event) => event.eventType === eventType);\n}\n\nfunction requireSingleEvent(events: FlowEvent[], eventType: string): FlowEvent {\n const matches = eventsOfType(events, eventType);\n expect(matches, `expected a single ${eventType}`).toHaveLength(1);\n return matches[0];\n}\n\nfunction expectRootEvent(event: FlowEvent): void {\n expect(event.eventParentIds).toEqual([]);\n}\n\nfunction expectDirectParent(child: FlowEvent, parent: FlowEvent): void {\n expect(child.eventParentIds).toEqual([\n ...parent.eventParentIds,\n parent.eventId,\n ]);\n}\n\nfunction assertAllParentIdsResolve(events: FlowEvent[]): void {\n const eventIds = new Set(events.map((event) => event.eventId));\n\n for (const event of events) {\n for (const parentId of event.eventParentIds) {\n expect(\n eventIds.has(parentId),\n `${event.eventType} references missing parent ${parentId}`,\n ).toBe(true);\n }\n }\n}\n\nfunction assertSessionIds(events: FlowEvent[], sessionId: string): void {\n for (const event of events) {\n expect(event.sessionId).toBe(sessionId);\n }\n}\n\nfunction directChildrenOfType(\n events: FlowEvent[],\n parent: FlowEvent,\n eventType: string,\n): FlowEvent[] {\n const expectedParentIds = [...parent.eventParentIds, parent.eventId];\n return events.filter(\n (event) =>\n event.eventType === eventType &&\n JSON.stringify(event.eventParentIds) ===\n JSON.stringify(expectedParentIds),\n );\n}\n\nfunction assertCompletedEnvelope(\n events: FlowEvent[],\n eventType: string,\n completedEventType = `${eventType.replace(/Event$/, \"\")}CompletedEvent`,\n): FlowEvent {\n const root = requireSingleEvent(events, eventType);\n const completed = requireSingleEvent(events, completedEventType);\n expectDirectParent(completed, root);\n return root;\n}\n\nfunction assertNoFloatingLlmEvents(events: FlowEvent[]): void {\n const llmEvents = events.filter(\n (event) =>\n event.eventType === \"LlmRequestEvent\" ||\n event.eventType === \"LlmResponseEvent\",\n );\n const byId = new Map(events.map((event) => [event.eventId, event]));\n\n expect(llmEvents.length).toBeGreaterThan(0);\n\n for (const event of llmEvents) {\n expect(\n event.eventParentIds.length,\n `${event.eventType} is floating`,\n ).toBeGreaterThan(0);\n const lastParentId = event.eventParentIds.at(-1);\n const lastParent = lastParentId ? byId.get(lastParentId) : undefined;\n expect(\n lastParent,\n `${event.eventType} has no resolved parent`,\n ).toBeDefined();\n expect(lastParent?.eventType.startsWith(\"Llm\")).toBe(false);\n }\n}\n\nfunction assertNoFloatingCdpEvents(events: FlowEvent[]): void {\n const cdpEvents = events.filter((event) => event.eventType.startsWith(\"Cdp\"));\n const byId = new Map(events.map((event) => [event.eventId, event]));\n\n expect(cdpEvents.length).toBeGreaterThan(0);\n\n for (const event of cdpEvents) {\n expect(\n event.eventParentIds.length,\n `${event.eventType} is floating`,\n ).toBeGreaterThan(0);\n const lastParentId = event.eventParentIds.at(-1);\n const lastParent = lastParentId ? byId.get(lastParentId) : undefined;\n expect(\n lastParent,\n `${event.eventType} has no resolved parent`,\n ).toBeDefined();\n\n if (event.eventType === \"CdpCallEvent\") {\n expect(lastParent?.eventType.startsWith(\"Cdp\")).toBe(false);\n } else {\n expect(lastParent?.eventType).toBe(\"CdpCallEvent\");\n }\n }\n}\n\nfunction assertDirectRootCdpEvents(\n events: FlowEvent[],\n sessionId: string,\n): void {\n const call = requireSingleEvent(events, \"CdpCallEvent\");\n const responseTypes = [\"CdpResponseEvent\", \"CdpResponseErrorEvent\"];\n const response = events.find((event) =>\n responseTypes.includes(event.eventType),\n );\n\n expect(response, \"expected a direct CDP response event\").toBeDefined();\n assertSessionIds(events, sessionId);\n expectRootEvent(call);\n expect(response?.eventParentIds).toEqual([call.eventId]);\n}\n\nfunction sortCountRecord(\n input: Record<string, number>,\n): Record<string, number> {\n return Object.fromEntries(\n Object.entries(input).sort(([left], [right]) => left.localeCompare(right)),\n );\n}\n\nfunction assertNonCdpEventCounts(\n events: FlowEvent[],\n expected: Record<string, number>,\n): void {\n const actual = events.reduce<Record<string, number>>((counts, event) => {\n if (event.eventType.startsWith(\"Cdp\")) {\n return counts;\n }\n\n counts[event.eventType] = (counts[event.eventType] ?? 0) + 1;\n return counts;\n }, {});\n\n expect(sortCountRecord(actual)).toEqual(sortCountRecord(expected));\n}\n\ntest.describe(\"flow logger integration\", () => {\n test.describe.configure({ mode: \"serial\" });\n\n test(\"act emits a rooted tree with nested understudy, llm, and cdp events\", async () => {\n const buttonText = \"Flow Logger Act Button\";\n const llmClient = createScriptedAisdkTestLlmClient({\n jsonResponses: {\n act: (options) => ({\n elementId: findLastEncodedId(options),\n description: `click ${buttonText}`,\n method: \"click\",\n arguments: [],\n twoStep: false,\n }),\n },\n });\n\n const v3 = createRecordedFlowLoggerV3({\n llmClient,\n });\n\n await v3.init();\n\n try {\n const page = v3.context.pages()[0];\n await page.goto(\n encodeHtml(`\n <!doctype html>\n <html>\n <body>\n <button\n id=\"act-target\"\n onclick=\"document.body.dataset.clicked='true'\"\n >\n ${buttonText}\n </button>\n </body>\n </html>\n `),\n );\n\n const baseline = await captureFlowEventBaseline(v3);\n const result = await v3.act(`Click the ${buttonText}`);\n const events = await listRecordedFlowEventsSince(v3, baseline);\n\n expect(result.success).toBe(true);\n expect(\n await page.evaluate(() => document.body.dataset.clicked ?? \"\"),\n ).toBe(\"true\");\n const root = requireSingleEvent(events, \"StagehandActEvent\");\n const completed = requireSingleEvent(\n events,\n \"StagehandActCompletedEvent\",\n );\n const llmRequest = requireSingleEvent(events, \"LlmRequestEvent\");\n const llmResponse = requireSingleEvent(events, \"LlmResponseEvent\");\n const understudy = requireSingleEvent(events, \"UnderstudyClickEvent\");\n const understudyCompleted = requireSingleEvent(\n events,\n \"UnderstudyClickCompletedEvent\",\n );\n\n assertAllParentIdsResolve(events);\n assertNonCdpEventCounts(events, {\n LlmRequestEvent: 1,\n LlmResponseEvent: 1,\n StagehandActCompletedEvent: 1,\n StagehandActEvent: 1,\n UnderstudyClickCompletedEvent: 1,\n UnderstudyClickEvent: 1,\n });\n assertSessionIds(events, v3.flowLoggerContext.sessionId);\n expectRootEvent(root);\n expectDirectParent(completed, root);\n expect(llmRequest.eventParentIds).toEqual([root.eventId]);\n expect(llmResponse.eventParentIds).toEqual([root.eventId]);\n expect(understudy.eventParentIds).toEqual([root.eventId]);\n expectDirectParent(understudyCompleted, understudy);\n assertNoFloatingLlmEvents(events);\n assertNoFloatingCdpEvents(events);\n } finally {\n await closeV3(v3);\n }\n });\n\n test(\"observe and extract emit rooted trees with complete nested llm and cdp events\", async () => {\n const observeText = \"Flow Logger Observe Button\";\n const extractTitle = \"Flow Logger Extract Title\";\n const llmClient = createScriptedAisdkTestLlmClient({\n jsonResponses: {\n Observation: (options) => ({\n elements: [\n {\n elementId: findLastEncodedId(options),\n description: observeText,\n method: \"click\",\n arguments: [],\n },\n ],\n }),\n Extraction: {\n title: extractTitle,\n },\n Metadata: {\n completed: true,\n progress: \"done\",\n },\n },\n });\n\n const v3 = createRecordedFlowLoggerV3({\n llmClient,\n });\n\n await v3.init();\n\n try {\n const page = v3.context.pages()[0];\n await page.goto(\n encodeHtml(`\n <!doctype html>\n <html>\n <body>\n <button id=\"observe-target\">${observeText}</button>\n <h1>${extractTitle}</h1>\n </body>\n </html>\n `),\n );\n\n const observeBaseline = await captureFlowEventBaseline(v3);\n const observeResult = await v3.observe(`Find the ${observeText}`);\n\n expect(observeResult).toHaveLength(1);\n expect(observeResult[0].method).toBe(\"click\");\n\n const observeEvents = await listRecordedFlowEventsSince(\n v3,\n observeBaseline,\n );\n const observeRoot = requireSingleEvent(\n observeEvents,\n \"StagehandObserveEvent\",\n );\n const observeCompleted = requireSingleEvent(\n observeEvents,\n \"StagehandObserveCompletedEvent\",\n );\n const observeLlmRequests = eventsOfType(observeEvents, \"LlmRequestEvent\");\n const observeLlmResponses = eventsOfType(\n observeEvents,\n \"LlmResponseEvent\",\n );\n\n assertAllParentIdsResolve(observeEvents);\n assertNonCdpEventCounts(observeEvents, {\n LlmRequestEvent: 1,\n LlmResponseEvent: 1,\n StagehandObserveCompletedEvent: 1,\n StagehandObserveEvent: 1,\n });\n assertSessionIds(observeEvents, v3.flowLoggerContext.sessionId);\n expectRootEvent(observeRoot);\n expectDirectParent(observeCompleted, observeRoot);\n expect(observeLlmRequests).toHaveLength(1);\n expect(observeLlmResponses).toHaveLength(1);\n expect(observeLlmRequests[0].eventParentIds).toEqual([\n observeRoot.eventId,\n ]);\n expect(observeLlmResponses[0].eventParentIds).toEqual([\n observeRoot.eventId,\n ]);\n assertNoFloatingLlmEvents(observeEvents);\n assertNoFloatingCdpEvents(observeEvents);\n\n const extractBaseline = await captureFlowEventBaseline(v3);\n const extractResult = await v3.extract(\n \"Extract the title\",\n z.object({ title: z.string() }),\n );\n\n expect(extractResult).toEqual({ title: extractTitle });\n\n const extractEvents = await listRecordedFlowEventsSince(\n v3,\n extractBaseline,\n );\n const extractRoot = requireSingleEvent(\n extractEvents,\n \"StagehandExtractEvent\",\n );\n const extractCompleted = requireSingleEvent(\n extractEvents,\n \"StagehandExtractCompletedEvent\",\n );\n const extractLlmRequests = eventsOfType(extractEvents, \"LlmRequestEvent\");\n const extractLlmResponses = eventsOfType(\n extractEvents,\n \"LlmResponseEvent\",\n );\n\n assertAllParentIdsResolve(extractEvents);\n assertNonCdpEventCounts(extractEvents, {\n LlmRequestEvent: 2,\n LlmResponseEvent: 2,\n StagehandExtractCompletedEvent: 1,\n StagehandExtractEvent: 1,\n });\n assertSessionIds(extractEvents, v3.flowLoggerContext.sessionId);\n expectRootEvent(extractRoot);\n expectDirectParent(extractCompleted, extractRoot);\n expect(extractLlmRequests).toHaveLength(2);\n expect(extractLlmResponses).toHaveLength(2);\n\n for (const event of [...extractLlmRequests, ...extractLlmResponses]) {\n expect(event.eventParentIds).toEqual([extractRoot.eventId]);\n }\n\n assertNoFloatingLlmEvents(extractEvents);\n assertNoFloatingCdpEvents(extractEvents);\n } finally {\n await closeV3(v3);\n }\n });\n\n test(\"agent.execute -> act carries the full agent -> stagehand -> understudy -> cdp + llm hierarchy\", async () => {\n const buttonText = \"Agent Act Button\";\n const llmClient = createScriptedAisdkTestLlmClient({\n jsonResponses: {\n act: (options) => ({\n elementId: findLastEncodedId(options),\n description: `click ${buttonText}`,\n method: \"click\",\n arguments: [],\n twoStep: false,\n }),\n },\n generateResponses: [\n toolCallResponse(\"act\", { action: `click the ${buttonText}` }, \"act-1\"),\n doneToolResponse(\"finished\", true, \"done-1\"),\n ],\n });\n\n const v3 = createRecordedFlowLoggerV3({\n experimental: true,\n llmClient,\n });\n\n await v3.init();\n\n try {\n const page = v3.context.pages()[0];\n await page.goto(\n encodeHtml(`\n <!doctype html>\n <html>\n <body>\n <button\n id=\"agent-act-target\"\n onclick=\"document.body.dataset.agentAct='true'\"\n >\n ${buttonText}\n </button>\n </body>\n </html>\n `),\n );\n\n const baseline = await captureFlowEventBaseline(v3);\n const result = await v3.agent().execute({\n instruction: `Click the ${buttonText} and finish.`,\n maxSteps: 2,\n });\n const events = await listRecordedFlowEventsSince(v3, baseline);\n\n expect(result.success).toBe(true);\n expect(\n await page.evaluate(() => document.body.dataset.agentAct ?? \"\"),\n ).toBe(\"true\");\n const agentRoot = assertCompletedEnvelope(events, \"AgentExecuteEvent\");\n const actRoot = requireSingleEvent(events, \"StagehandActEvent\");\n const actCompleted = requireSingleEvent(\n events,\n \"StagehandActCompletedEvent\",\n );\n const understudy = requireSingleEvent(events, \"UnderstudyClickEvent\");\n const understudyCompleted = requireSingleEvent(\n events,\n \"UnderstudyClickCompletedEvent\",\n );\n\n assertAllParentIdsResolve(events);\n assertNonCdpEventCounts(events, {\n AgentExecuteCompletedEvent: 1,\n AgentExecuteEvent: 1,\n LlmRequestEvent: 3,\n LlmResponseEvent: 3,\n StagehandActCompletedEvent: 1,\n StagehandActEvent: 1,\n UnderstudyClickCompletedEvent: 1,\n UnderstudyClickEvent: 1,\n });\n assertSessionIds(events, v3.flowLoggerContext.sessionId);\n expectRootEvent(agentRoot);\n expect(actRoot.eventParentIds).toEqual([agentRoot.eventId]);\n expectDirectParent(actCompleted, actRoot);\n expectDirectParent(understudy, actRoot);\n expectDirectParent(understudyCompleted, understudy);\n expect(\n directChildrenOfType(events, agentRoot, \"LlmRequestEvent\"),\n ).toHaveLength(2);\n expect(\n directChildrenOfType(events, agentRoot, \"LlmResponseEvent\"),\n ).toHaveLength(2);\n expect(\n directChildrenOfType(events, actRoot, \"LlmRequestEvent\"),\n ).toHaveLength(1);\n expect(\n directChildrenOfType(events, actRoot, \"LlmResponseEvent\"),\n ).toHaveLength(1);\n assertNoFloatingLlmEvents(events);\n assertNoFloatingCdpEvents(events);\n } finally {\n await closeV3(v3);\n }\n });\n\n test(\"agent.execute -> fillForm carries the observe -> act -> understudy hierarchy with no missing layers\", async () => {\n const llmClient = createScriptedAisdkTestLlmClient({\n jsonResponses: {\n Observation: (options) => ({\n elements: [\n {\n elementId: findLastEncodedId(options),\n description: \"name input\",\n method: \"fill\",\n arguments: [\"hello\"],\n },\n ],\n }),\n },\n generateResponses: [\n toolCallResponse(\n \"fillForm\",\n {\n fields: [\n {\n action: \"type hello into the name field\",\n value: \"hello\",\n },\n ],\n },\n \"fillform-1\",\n ),\n doneToolResponse(\"finished\", true, \"done-1\"),\n ],\n });\n\n const v3 = createRecordedFlowLoggerV3({\n experimental: true,\n llmClient,\n });\n\n await v3.init();\n\n try {\n const page = v3.context.pages()[0];\n await page.goto(\n encodeHtml(`\n <!doctype html>\n <html>\n <body>\n <input id=\"name\" />\n </body>\n </html>\n `),\n );\n\n const baseline = await captureFlowEventBaseline(v3);\n const result = await v3.agent().execute({\n instruction: \"Fill the form and finish.\",\n maxSteps: 2,\n });\n const events = await listRecordedFlowEventsSince(v3, baseline);\n\n expect(result.success).toBe(true);\n expect(await page.locator(\"#name\").inputValue()).toBe(\"hello\");\n\n const agentRoot = assertCompletedEnvelope(events, \"AgentExecuteEvent\");\n const observeRoot = requireSingleEvent(events, \"StagehandObserveEvent\");\n const observeCompleted = requireSingleEvent(\n events,\n \"StagehandObserveCompletedEvent\",\n );\n const actRoot = requireSingleEvent(events, \"StagehandActEvent\");\n const actCompleted = requireSingleEvent(\n events,\n \"StagehandActCompletedEvent\",\n );\n const understudyFill = requireSingleEvent(events, \"UnderstudyFillEvent\");\n const understudyFillCompleted = requireSingleEvent(\n events,\n \"UnderstudyFillCompletedEvent\",\n );\n\n assertAllParentIdsResolve(events);\n assertNonCdpEventCounts(events, {\n AgentExecuteCompletedEvent: 1,\n AgentExecuteEvent: 1,\n LlmRequestEvent: 3,\n LlmResponseEvent: 3,\n StagehandActCompletedEvent: 1,\n StagehandActEvent: 1,\n StagehandObserveCompletedEvent: 1,\n StagehandObserveEvent: 1,\n UnderstudyFillCompletedEvent: 1,\n UnderstudyFillEvent: 1,\n });\n assertSessionIds(events, v3.flowLoggerContext.sessionId);\n expectRootEvent(agentRoot);\n expect(observeRoot.eventParentIds).toEqual([agentRoot.eventId]);\n expectDirectParent(observeCompleted, observeRoot);\n expect(actRoot.eventParentIds).toEqual([agentRoot.eventId]);\n expectDirectParent(actCompleted, actRoot);\n expectDirectParent(understudyFill, actRoot);\n expectDirectParent(understudyFillCompleted, understudyFill);\n expect(\n directChildrenOfType(events, observeRoot, \"LlmRequestEvent\"),\n ).toHaveLength(1);\n expect(\n directChildrenOfType(events, observeRoot, \"LlmResponseEvent\"),\n ).toHaveLength(1);\n expect(\n directChildrenOfType(events, agentRoot, \"LlmRequestEvent\"),\n ).toHaveLength(2);\n expect(\n directChildrenOfType(events, agentRoot, \"LlmResponseEvent\"),\n ).toHaveLength(2);\n expect(\n directChildrenOfType(events, actRoot, \"LlmRequestEvent\"),\n ).toHaveLength(0);\n expect(\n directChildrenOfType(events, actRoot, \"LlmResponseEvent\"),\n ).toHaveLength(0);\n assertNoFloatingLlmEvents(events);\n assertNoFloatingCdpEvents(events);\n } finally {\n await closeV3(v3);\n }\n });\n\n test(\"agent.execute -> extract carries the full agent -> extract -> cdp + llm hierarchy\", async () => {\n const extractTitle = \"Agent Extract Title\";\n const llmClient = createScriptedAisdkTestLlmClient({\n jsonResponses: {\n Extraction: {\n title: extractTitle,\n },\n Metadata: {\n completed: true,\n progress: \"done\",\n },\n },\n generateResponses: [\n toolCallResponse(\n \"extract\",\n {\n instruction: \"extract the title\",\n schema: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n },\n },\n },\n \"extract-1\",\n ),\n doneToolResponse(\"finished\", true, \"done-1\"),\n ],\n });\n\n const v3 = createRecordedFlowLoggerV3({\n experimental: true,\n llmClient,\n });\n\n await v3.init();\n\n try {\n const page = v3.context.pages()[0];\n await page.goto(\n encodeHtml(`\n <!doctype html>\n <html>\n <body>\n <h1>${extractTitle}</h1>\n </body>\n </html>\n `),\n );\n\n const baseline = await captureFlowEventBaseline(v3);\n const result = await v3.agent().execute({\n instruction: \"Extract the title and finish.\",\n maxSteps: 2,\n });\n\n expect(result.success).toBe(true);\n\n const events = await listRecordedFlowEventsSince(v3, baseline);\n const agentRoot = assertCompletedEnvelope(events, \"AgentExecuteEvent\");\n const extractRoot = requireSingleEvent(events, \"StagehandExtractEvent\");\n const extractCompleted = requireSingleEvent(\n events,\n \"StagehandExtractCompletedEvent\",\n );\n\n assertAllParentIdsResolve(events);\n assertNonCdpEventCounts(events, {\n AgentExecuteCompletedEvent: 1,\n AgentExecuteEvent: 1,\n LlmRequestEvent: 4,\n LlmResponseEvent: 4,\n StagehandExtractCompletedEvent: 1,\n StagehandExtractEvent: 1,\n });\n assertSessionIds(events, v3.flowLoggerContext.sessionId);\n expectRootEvent(agentRoot);\n expect(extractRoot.eventParentIds).toEqual([agentRoot.eventId]);\n expectDirectParent(extractCompleted, extractRoot);\n expect(\n directChildrenOfType(events, agentRoot, \"LlmRequestEvent\"),\n ).toHaveLength(2);\n expect(\n directChildrenOfType(events, agentRoot, \"LlmResponseEvent\"),\n ).toHaveLength(2);\n expect(\n directChildrenOfType(events, extractRoot, \"LlmRequestEvent\"),\n ).toHaveLength(2);\n expect(\n directChildrenOfType(events, extractRoot, \"LlmResponseEvent\"),\n ).toHaveLength(2);\n assertNoFloatingLlmEvents(events);\n assertNoFloatingCdpEvents(events);\n } finally {\n await closeV3(v3);\n }\n });\n\n test(\"agent.execute nests page events under the agent root and direct page calls root themselves\", async () => {\n const agentPageUrl = encodeHtml(`\n <!doctype html>\n <html>\n <body>\n <h1>Agent Flow Logger Page</h1>\n </body>\n </html>\n `);\n const agentLlmClient = createScriptedAisdkTestLlmClient({\n generateResponses: [\n toolCallResponse(\"goto\", { url: agentPageUrl }, \"goto-1\"),\n toolCallResponse(\"screenshot\", {}, \"screenshot-1\"),\n doneToolResponse(\"finished\", true, \"done-1\"),\n ],\n });\n\n const agentV3 = createRecordedFlowLoggerV3({\n experimental: true,\n llmClient: agentLlmClient,\n });\n\n await agentV3.init();\n\n try {\n const baseline = await captureFlowEventBaseline(agentV3);\n const result = await agentV3.agent().execute({\n instruction: \"Go to the test page, take a screenshot, and finish.\",\n maxSteps: 3,\n });\n\n expect(result.success).toBe(true);\n expect(result.completed).toBe(true);\n\n const events = await listRecordedFlowEventsSince(agentV3, baseline);\n const root = assertCompletedEnvelope(events, \"AgentExecuteEvent\");\n const pageGoto = requireSingleEvent(events, \"PageGotoEvent\");\n const pageGotoCompleted = requireSingleEvent(\n events,\n \"PageGotoCompletedEvent\",\n );\n const pageScreenshot = requireSingleEvent(events, \"PageScreenshotEvent\");\n const pageScreenshotCompleted = requireSingleEvent(\n events,\n \"PageScreenshotCompletedEvent\",\n );\n const llmRequests = eventsOfType(events, \"LlmRequestEvent\");\n const llmResponses = eventsOfType(events, \"LlmResponseEvent\");\n\n assertAllParentIdsResolve(events);\n assertNonCdpEventCounts(events, {\n AgentExecuteCompletedEvent: 1,\n AgentExecuteEvent: 1,\n LlmRequestEvent: 3,\n LlmResponseEvent: 3,\n PageGotoCompletedEvent: 1,\n PageGotoEvent: 1,\n PageScreenshotCompletedEvent: 1,\n PageScreenshotEvent: 1,\n });\n assertSessionIds(events, agentV3.flowLoggerContext.sessionId);\n expectRootEvent(root);\n expect(pageGoto.eventParentIds).toEqual([root.eventId]);\n expectDirectParent(pageGotoCompleted, pageGoto);\n expect(pageScreenshot.eventParentIds).toEqual([root.eventId]);\n expectDirectParent(pageScreenshotCompleted, pageScreenshot);\n expect(llmRequests).toHaveLength(3);\n expect(llmResponses).toHaveLength(3);\n\n for (const event of [...llmRequests, ...llmResponses]) {\n expect(event.eventParentIds).toEqual([root.eventId]);\n }\n\n assertNoFloatingLlmEvents(events);\n assertNoFloatingCdpEvents(events);\n } finally {\n await closeV3(agentV3);\n }\n\n const directV3 = createRecordedFlowLoggerV3();\n await directV3.init();\n\n try {\n const page = directV3.context.pages()[0];\n const baseline = await captureFlowEventBaseline(directV3);\n\n await page.goto(agentPageUrl);\n await page.screenshot({ fullPage: false });\n\n const events = await listRecordedFlowEventsSince(directV3, baseline);\n const pageGoto = requireSingleEvent(events, \"PageGotoEvent\");\n const pageGotoCompleted = requireSingleEvent(\n events,\n \"PageGotoCompletedEvent\",\n );\n const pageScreenshot = requireSingleEvent(events, \"PageScreenshotEvent\");\n const pageScreenshotCompleted = requireSingleEvent(\n events,\n \"PageScreenshotCompletedEvent\",\n );\n\n assertAllParentIdsResolve(events);\n assertNonCdpEventCounts(events, {\n PageGotoCompletedEvent: 1,\n PageGotoEvent: 1,\n PageScreenshotCompletedEvent: 1,\n PageScreenshotEvent: 1,\n });\n assertSessionIds(events, directV3.flowLoggerContext.sessionId);\n expectRootEvent(pageGoto);\n expectDirectParent(pageGotoCompleted, pageGoto);\n expectRootEvent(pageScreenshot);\n expectDirectParent(pageScreenshotCompleted, pageScreenshot);\n expect(eventsOfType(events, \"LlmRequestEvent\")).toHaveLength(0);\n expect(eventsOfType(events, \"LlmResponseEvent\")).toHaveLength(0);\n assertNoFloatingCdpEvents(events);\n } finally {\n await closeV3(directV3);\n }\n });\n\n test(\"direct page methods, direct understudy calls, and direct sendCDP all attach complete event trees to the session\", async () => {\n const v3 = createRecordedFlowLoggerV3();\n await v3.init();\n\n try {\n const page = v3.context.pages()[0];\n await page.goto(\n encodeHtml(`\n <!doctype html>\n <html>\n <body>\n <button\n id=\"direct-click\"\n onclick=\"document.body.dataset.directClick='true'\"\n >\n Direct Click\n </button>\n <div id=\"ready\">ready</div>\n </body>\n </html>\n `),\n );\n\n let baseline = await captureFlowEventBaseline(v3);\n await page.evaluate(() => document.getElementById(\"ready\")?.textContent);\n let events = await listRecordedFlowEventsSince(v3, baseline);\n let root = assertCompletedEnvelope(events, \"PageEvaluateEvent\");\n assertAllParentIdsResolve(events);\n assertNonCdpEventCounts(events, {\n PageEvaluateCompletedEvent: 1,\n PageEvaluateEvent: 1,\n });\n assertSessionIds(events, v3.flowLoggerContext.sessionId);\n expectRootEvent(root);\n expect(eventsOfType(events, \"LlmRequestEvent\")).toHaveLength(0);\n expect(eventsOfType(events, \"LlmResponseEvent\")).toHaveLength(0);\n assertNoFloatingCdpEvents(events);\n\n baseline = await captureFlowEventBaseline(v3);\n await page.snapshot();\n events = await listRecordedFlowEventsSince(v3, baseline);\n root = assertCompletedEnvelope(events, \"PageSnapshotEvent\");\n assertAllParentIdsResolve(events);\n assertNonCdpEventCounts(events, {\n PageSnapshotCompletedEvent: 1,\n PageSnapshotEvent: 1,\n });\n assertSessionIds(events, v3.flowLoggerContext.sessionId);\n expectRootEvent(root);\n expect(eventsOfType(events, \"LlmRequestEvent\")).toHaveLength(0);\n expect(eventsOfType(events, \"LlmResponseEvent\")).toHaveLength(0);\n assertNoFloatingCdpEvents(events);\n\n baseline = await captureFlowEventBaseline(v3);\n await performUnderstudyMethod(\n page,\n page.mainFrame(),\n \"click\",\n \"/html/body/button\",\n [],\n 30_000,\n );\n events = await listRecordedFlowEventsSince(v3, baseline);\n root = assertCompletedEnvelope(events, \"UnderstudyClickEvent\");\n assertAllParentIdsResolve(events);\n assertNonCdpEventCounts(events, {\n UnderstudyClickCompletedEvent: 1,\n UnderstudyClickEvent: 1,\n });\n assertSessionIds(events, v3.flowLoggerContext.sessionId);\n expectRootEvent(root);\n expect(eventsOfType(events, \"LlmRequestEvent\")).toHaveLength(0);\n expect(eventsOfType(events, \"LlmResponseEvent\")).toHaveLength(0);\n assertNoFloatingCdpEvents(events);\n expect(\n await page.evaluate(() => document.body.dataset.directClick ?? \"\"),\n ).toBe(\"true\");\n\n baseline = await captureFlowEventBaseline(v3);\n const cdpResult = await page.sendCDP<{\n result?: { value?: number };\n }>(\"Runtime.evaluate\", {\n expression: \"2 + 2\",\n returnByValue: true,\n });\n events = await listRecordedFlowEventsSince(v3, baseline);\n expect(cdpResult.result?.value).toBe(4);\n expect(eventsOfType(events, \"LlmRequestEvent\")).toHaveLength(0);\n expect(eventsOfType(events, \"LlmResponseEvent\")).toHaveLength(0);\n assertAllParentIdsResolve(events);\n assertDirectRootCdpEvents(events, v3.flowLoggerContext.sessionId);\n } finally {\n await closeV3(v3);\n }\n });\n});\n"]}
|
|
@@ -1,7 +1,40 @@
|
|
|
1
1
|
import type { V3 } from "../../lib/v3/v3.js";
|
|
2
|
+
import type { LanguageModelV2CallOptions, LanguageModelV2Content, LanguageModelV2FinishReason, LanguageModelV2Usage } from "@ai-sdk/provider";
|
|
3
|
+
import { AISdkClient } from "../../lib/v3/llm/aisdk.js";
|
|
2
4
|
/**
|
|
3
5
|
* Races a promise against a timeout.
|
|
4
6
|
* Resolves to the promise value or "timeout" if the deadline expires.
|
|
5
7
|
*/
|
|
6
8
|
export declare function raceTimeout<T>(promise: Promise<T>, ms: number): Promise<T | "timeout">;
|
|
7
9
|
export declare function closeV3(v3?: V3 | null): Promise<void>;
|
|
10
|
+
type JsonResponseKey = "act" | "Observation" | "Metadata" | "Extraction" | "default";
|
|
11
|
+
type JsonResponseValue = Record<string, unknown> | ((options: LanguageModelV2CallOptions) => Record<string, unknown>);
|
|
12
|
+
type JsonResponseScript = JsonResponseValue | JsonResponseValue[];
|
|
13
|
+
type GenerateResponseValue = {
|
|
14
|
+
content: LanguageModelV2Content[];
|
|
15
|
+
finishReason?: LanguageModelV2FinishReason;
|
|
16
|
+
usage?: Partial<LanguageModelV2Usage>;
|
|
17
|
+
} | ((options: LanguageModelV2CallOptions) => {
|
|
18
|
+
content: LanguageModelV2Content[];
|
|
19
|
+
finishReason?: LanguageModelV2FinishReason;
|
|
20
|
+
usage?: Partial<LanguageModelV2Usage>;
|
|
21
|
+
});
|
|
22
|
+
export declare function promptToText(prompt: LanguageModelV2CallOptions["prompt"]): string;
|
|
23
|
+
export declare function findEncodedIdForText(options: LanguageModelV2CallOptions, text: string): string;
|
|
24
|
+
export declare function findLastEncodedId(options: LanguageModelV2CallOptions): string;
|
|
25
|
+
export declare function toolCallResponse(toolName: string, input: Record<string, unknown>, toolCallId?: string): {
|
|
26
|
+
content: LanguageModelV2Content[];
|
|
27
|
+
finishReason: LanguageModelV2FinishReason;
|
|
28
|
+
usage: LanguageModelV2Usage;
|
|
29
|
+
};
|
|
30
|
+
export declare function doneToolResponse(reasoning?: string, taskComplete?: boolean, toolCallId?: string): {
|
|
31
|
+
content: LanguageModelV2Content[];
|
|
32
|
+
finishReason: LanguageModelV2FinishReason;
|
|
33
|
+
usage: LanguageModelV2Usage;
|
|
34
|
+
};
|
|
35
|
+
export declare function createScriptedAisdkTestLlmClient(options?: {
|
|
36
|
+
modelId?: string;
|
|
37
|
+
jsonResponses?: Partial<Record<JsonResponseKey, JsonResponseScript>>;
|
|
38
|
+
generateResponses?: GenerateResponseValue[];
|
|
39
|
+
}): AISdkClient;
|
|
40
|
+
export {};
|
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.raceTimeout = raceTimeout;
|
|
4
4
|
exports.closeV3 = closeV3;
|
|
5
|
+
exports.promptToText = promptToText;
|
|
6
|
+
exports.findEncodedIdForText = findEncodedIdForText;
|
|
7
|
+
exports.findLastEncodedId = findLastEncodedId;
|
|
8
|
+
exports.toolCallResponse = toolCallResponse;
|
|
9
|
+
exports.doneToolResponse = doneToolResponse;
|
|
10
|
+
exports.createScriptedAisdkTestLlmClient = createScriptedAisdkTestLlmClient;
|
|
11
|
+
const aisdk_js_1 = require("../../lib/v3/llm/aisdk.js");
|
|
5
12
|
/**
|
|
6
13
|
* Races a promise against a timeout.
|
|
7
14
|
* Resolves to the promise value or "timeout" if the deadline expires.
|
|
@@ -41,4 +48,141 @@ async function closeV3(v3) {
|
|
|
41
48
|
}
|
|
42
49
|
await settleWithTimeout(v3.close(), CLOSE_TIMEOUT_MS);
|
|
43
50
|
}
|
|
51
|
+
const DEFAULT_USAGE = {
|
|
52
|
+
inputTokens: 1,
|
|
53
|
+
outputTokens: 1,
|
|
54
|
+
totalTokens: 2,
|
|
55
|
+
reasoningTokens: 0,
|
|
56
|
+
cachedInputTokens: 0,
|
|
57
|
+
};
|
|
58
|
+
const mergeUsage = (usage) => ({
|
|
59
|
+
...DEFAULT_USAGE,
|
|
60
|
+
...(usage ?? {}),
|
|
61
|
+
});
|
|
62
|
+
function consumeScriptValue(value, fallback) {
|
|
63
|
+
if (!Array.isArray(value)) {
|
|
64
|
+
return value ?? fallback;
|
|
65
|
+
}
|
|
66
|
+
if (value.length <= 1) {
|
|
67
|
+
return value[0] ?? fallback;
|
|
68
|
+
}
|
|
69
|
+
return value.shift() ?? fallback;
|
|
70
|
+
}
|
|
71
|
+
function resolveJsonResponseKey(options) {
|
|
72
|
+
const responseFormat = options.responseFormat;
|
|
73
|
+
if (!responseFormat || responseFormat.type !== "json") {
|
|
74
|
+
return "default";
|
|
75
|
+
}
|
|
76
|
+
const schema = responseFormat.schema;
|
|
77
|
+
const properties = schema?.properties ?? {};
|
|
78
|
+
if ("elementId" in properties && "twoStep" in properties) {
|
|
79
|
+
return "act";
|
|
80
|
+
}
|
|
81
|
+
if ("elements" in properties) {
|
|
82
|
+
return "Observation";
|
|
83
|
+
}
|
|
84
|
+
if ("completed" in properties && "progress" in properties) {
|
|
85
|
+
return "Metadata";
|
|
86
|
+
}
|
|
87
|
+
return "Extraction";
|
|
88
|
+
}
|
|
89
|
+
function promptToText(prompt) {
|
|
90
|
+
return (prompt ?? [])
|
|
91
|
+
.flatMap((message) => {
|
|
92
|
+
if (typeof message.content === "string") {
|
|
93
|
+
return [message.content];
|
|
94
|
+
}
|
|
95
|
+
return (message.content ?? [])
|
|
96
|
+
.map((part) => (part.type === "text" ? part.text : ""))
|
|
97
|
+
.filter((text) => text.length > 0);
|
|
98
|
+
})
|
|
99
|
+
.join("\n");
|
|
100
|
+
}
|
|
101
|
+
function findEncodedIds(options) {
|
|
102
|
+
return [...promptToText(options.prompt).matchAll(/\b\d+-\d+\b/g)].map((match) => match[0]);
|
|
103
|
+
}
|
|
104
|
+
function findEncodedIdForText(options, text) {
|
|
105
|
+
const promptText = promptToText(options.prompt);
|
|
106
|
+
const lines = promptText.split("\n");
|
|
107
|
+
const line = lines.find((entry) => entry.includes(text));
|
|
108
|
+
const match = line?.match(/\b\d+-\d+\b/);
|
|
109
|
+
if (!match) {
|
|
110
|
+
throw new Error(`Could not find encoded id for text: ${text}`);
|
|
111
|
+
}
|
|
112
|
+
return match[0];
|
|
113
|
+
}
|
|
114
|
+
function findLastEncodedId(options) {
|
|
115
|
+
const matches = findEncodedIds(options);
|
|
116
|
+
if (matches.length === 0) {
|
|
117
|
+
throw new Error("Could not find any encoded ids in the prompt.");
|
|
118
|
+
}
|
|
119
|
+
return matches[matches.length - 1];
|
|
120
|
+
}
|
|
121
|
+
function toolCallResponse(toolName, input, toolCallId = `${toolName}-1`) {
|
|
122
|
+
return {
|
|
123
|
+
content: [
|
|
124
|
+
{
|
|
125
|
+
type: "tool-call",
|
|
126
|
+
toolCallId,
|
|
127
|
+
toolName,
|
|
128
|
+
input: JSON.stringify(input),
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
finishReason: "tool-calls",
|
|
132
|
+
usage: DEFAULT_USAGE,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function doneToolResponse(reasoning = "done", taskComplete = true, toolCallId = "done-1") {
|
|
136
|
+
return toolCallResponse("done", { reasoning, taskComplete }, toolCallId);
|
|
137
|
+
}
|
|
138
|
+
function createGenerateResult(result) {
|
|
139
|
+
return {
|
|
140
|
+
content: result.content,
|
|
141
|
+
finishReason: result.finishReason ?? "stop",
|
|
142
|
+
usage: mergeUsage(result.usage),
|
|
143
|
+
warnings: [],
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
function createScriptedAisdkTestLlmClient(options) {
|
|
147
|
+
const jsonResponses = Object.fromEntries(Object.entries(options?.jsonResponses ?? {}).map(([key, value]) => [
|
|
148
|
+
key,
|
|
149
|
+
Array.isArray(value) ? [...value] : value,
|
|
150
|
+
]));
|
|
151
|
+
const generateResponses = [...(options?.generateResponses ?? [])];
|
|
152
|
+
const model = {
|
|
153
|
+
provider: "mock",
|
|
154
|
+
modelId: options?.modelId ?? "mock/stagehand-flow-logger",
|
|
155
|
+
specificationVersion: "v2",
|
|
156
|
+
supportedUrls: {},
|
|
157
|
+
doGenerateCalls: [],
|
|
158
|
+
doGenerate: async (callOptions) => {
|
|
159
|
+
model.doGenerateCalls.push(callOptions);
|
|
160
|
+
if (callOptions.responseFormat?.type === "json") {
|
|
161
|
+
const key = resolveJsonResponseKey(callOptions);
|
|
162
|
+
const responseScripts = consumeScriptValue(jsonResponses[key], jsonResponses.default);
|
|
163
|
+
const responseScript = consumeScriptValue(responseScripts, undefined);
|
|
164
|
+
const response = typeof responseScript === "function"
|
|
165
|
+
? responseScript(callOptions)
|
|
166
|
+
: (responseScript ?? {});
|
|
167
|
+
return createGenerateResult({
|
|
168
|
+
content: [{ type: "text", text: JSON.stringify(response) }],
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
const responseScript = consumeScriptValue(generateResponses, undefined);
|
|
172
|
+
if (!responseScript) {
|
|
173
|
+
return createGenerateResult({
|
|
174
|
+
content: [{ type: "text", text: "done" }],
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
const response = typeof responseScript === "function"
|
|
178
|
+
? responseScript(callOptions)
|
|
179
|
+
: responseScript;
|
|
180
|
+
return createGenerateResult(response);
|
|
181
|
+
},
|
|
182
|
+
doStream: async () => {
|
|
183
|
+
throw new Error("Streaming is not implemented for this test model.");
|
|
184
|
+
},
|
|
185
|
+
};
|
|
186
|
+
return new aisdk_js_1.AISdkClient({ model });
|
|
187
|
+
}
|
|
44
188
|
//# sourceMappingURL=testUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../../../tests/integration/testUtils.ts"],"names":[],"mappings":";;AAMA,kCASC;AAmBD,0BAeC;AA/CD;;;GAGG;AACH,SAAgB,WAAW,CACzB,OAAmB,EACnB,EAAU;IAEV,IAAI,KAAoC,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAY,CAAC,OAAO,EAAE,EAAE;QACjD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAE/B,KAAK,UAAU,iBAAiB,CAC9B,OAAyB,EACzB,SAAiB;IAEjB,IAAI,SAAqC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAC5C,SAAS,GAAG,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;YAAS,CAAC;QACT,IAAI,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,OAAO,CAAC,EAAc;IAC1C,IAAI,CAAC,EAAE;QAAE,OAAO;IAChB,MAAM,aAAa,GAAG,EAAE,CAAC,aAAa,CAAC;IACvC,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,iBAAiB,CACrB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,EACrC,gBAAgB,CACjB,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,MAAM,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;AACxD,CAAC","sourcesContent":["import type { V3 } from \"../../lib/v3/v3.js\";\n\n/**\n * Races a promise against a timeout.\n * Resolves to the promise value or \"timeout\" if the deadline expires.\n */\nexport function raceTimeout<T>(\n promise: Promise<T>,\n ms: number,\n): Promise<T | \"timeout\"> {\n let timer: ReturnType<typeof setTimeout>;\n const timeout = new Promise<\"timeout\">((resolve) => {\n timer = setTimeout(() => resolve(\"timeout\"), ms);\n });\n return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));\n}\n\nconst CLOSE_TIMEOUT_MS = 5_000;\n\nasync function settleWithTimeout(\n promise: Promise<unknown>,\n timeoutMs: number,\n): Promise<void> {\n let timeoutId: NodeJS.Timeout | undefined;\n const timeout = new Promise<void>((resolve) => {\n timeoutId = setTimeout(resolve, timeoutMs);\n });\n try {\n await Promise.race([promise.catch(() => {}), timeout]);\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n}\n\nexport async function closeV3(v3?: V3 | null): Promise<void> {\n if (!v3) return;\n const isBrowserbase = v3.isBrowserbase;\n if (isBrowserbase) {\n try {\n await settleWithTimeout(\n v3.context.conn.send(\"Browser.close\"),\n CLOSE_TIMEOUT_MS,\n );\n } catch {\n // best-effort cleanup\n }\n }\n\n await settleWithTimeout(v3.close(), CLOSE_TIMEOUT_MS);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../../../tests/integration/testUtils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { V3 } from \"../../lib/v3/v3.js\";\nimport type {\n LanguageModelV2,\n LanguageModelV2CallOptions,\n LanguageModelV2Content,\n LanguageModelV2FinishReason,\n LanguageModelV2Usage,\n} from \"@ai-sdk/provider\";\nimport { AISdkClient } from \"../../lib/v3/llm/aisdk.js\";\n\n/**\n * Races a promise against a timeout.\n * Resolves to the promise value or \"timeout\" if the deadline expires.\n */\nexport function raceTimeout<T>(\n promise: Promise<T>,\n ms: number,\n): Promise<T | \"timeout\"> {\n let timer: ReturnType<typeof setTimeout>;\n const timeout = new Promise<\"timeout\">((resolve) => {\n timer = setTimeout(() => resolve(\"timeout\"), ms);\n });\n return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));\n}\n\nconst CLOSE_TIMEOUT_MS = 5_000;\n\nasync function settleWithTimeout(\n promise: Promise<unknown>,\n timeoutMs: number,\n): Promise<void> {\n let timeoutId: NodeJS.Timeout | undefined;\n const timeout = new Promise<void>((resolve) => {\n timeoutId = setTimeout(resolve, timeoutMs);\n });\n try {\n await Promise.race([promise.catch(() => {}), timeout]);\n } finally {\n if (timeoutId) clearTimeout(timeoutId);\n }\n}\n\nexport async function closeV3(v3?: V3 | null): Promise<void> {\n if (!v3) return;\n const isBrowserbase = v3.isBrowserbase;\n if (isBrowserbase) {\n try {\n await settleWithTimeout(\n v3.context.conn.send(\"Browser.close\"),\n CLOSE_TIMEOUT_MS,\n );\n } catch {\n // best-effort cleanup\n }\n }\n\n await settleWithTimeout(v3.close(), CLOSE_TIMEOUT_MS);\n}\n\ntype JsonResponseKey =\n | \"act\"\n | \"Observation\"\n | \"Metadata\"\n | \"Extraction\"\n | \"default\";\n\ntype JsonResponseValue =\n | Record<string, unknown>\n | ((options: LanguageModelV2CallOptions) => Record<string, unknown>);\n\ntype JsonResponseScript = JsonResponseValue | JsonResponseValue[];\n\ntype GenerateResponseValue =\n | {\n content: LanguageModelV2Content[];\n finishReason?: LanguageModelV2FinishReason;\n usage?: Partial<LanguageModelV2Usage>;\n }\n | ((options: LanguageModelV2CallOptions) => {\n content: LanguageModelV2Content[];\n finishReason?: LanguageModelV2FinishReason;\n usage?: Partial<LanguageModelV2Usage>;\n });\n\ntype ScriptedLanguageModel = LanguageModelV2 & {\n doGenerateCalls: LanguageModelV2CallOptions[];\n};\n\ntype ScriptedGenerateResult = {\n content: LanguageModelV2Content[];\n finishReason?: LanguageModelV2FinishReason;\n usage?: Partial<LanguageModelV2Usage>;\n};\n\nconst DEFAULT_USAGE: LanguageModelV2Usage = {\n inputTokens: 1,\n outputTokens: 1,\n totalTokens: 2,\n reasoningTokens: 0,\n cachedInputTokens: 0,\n};\n\nconst mergeUsage = (\n usage?: Partial<LanguageModelV2Usage>,\n): LanguageModelV2Usage => ({\n ...DEFAULT_USAGE,\n ...(usage ?? {}),\n});\n\nfunction consumeScriptValue<T>(value: T | T[] | undefined, fallback: T): T {\n if (!Array.isArray(value)) {\n return value ?? fallback;\n }\n\n if (value.length <= 1) {\n return value[0] ?? fallback;\n }\n\n return value.shift() ?? fallback;\n}\n\nfunction resolveJsonResponseKey(\n options: LanguageModelV2CallOptions,\n): JsonResponseKey {\n const responseFormat = options.responseFormat;\n if (!responseFormat || responseFormat.type !== \"json\") {\n return \"default\";\n }\n\n const schema = responseFormat.schema as {\n type?: string;\n properties?: Record<string, unknown>;\n };\n const properties = schema?.properties ?? {};\n\n if (\"elementId\" in properties && \"twoStep\" in properties) {\n return \"act\";\n }\n\n if (\"elements\" in properties) {\n return \"Observation\";\n }\n\n if (\"completed\" in properties && \"progress\" in properties) {\n return \"Metadata\";\n }\n\n return \"Extraction\";\n}\n\nexport function promptToText(\n prompt: LanguageModelV2CallOptions[\"prompt\"],\n): string {\n return (prompt ?? [])\n .flatMap((message) => {\n if (typeof message.content === \"string\") {\n return [message.content];\n }\n\n return (message.content ?? [])\n .map((part) => (part.type === \"text\" ? part.text : \"\"))\n .filter((text): text is string => text.length > 0);\n })\n .join(\"\\n\");\n}\n\nfunction findEncodedIds(options: LanguageModelV2CallOptions): string[] {\n return [...promptToText(options.prompt).matchAll(/\\b\\d+-\\d+\\b/g)].map(\n (match) => match[0],\n );\n}\n\nexport function findEncodedIdForText(\n options: LanguageModelV2CallOptions,\n text: string,\n): string {\n const promptText = promptToText(options.prompt);\n const lines = promptText.split(\"\\n\");\n const line = lines.find((entry) => entry.includes(text));\n const match = line?.match(/\\b\\d+-\\d+\\b/);\n\n if (!match) {\n throw new Error(`Could not find encoded id for text: ${text}`);\n }\n\n return match[0];\n}\n\nexport function findLastEncodedId(options: LanguageModelV2CallOptions): string {\n const matches = findEncodedIds(options);\n if (matches.length === 0) {\n throw new Error(\"Could not find any encoded ids in the prompt.\");\n }\n\n return matches[matches.length - 1];\n}\n\nexport function toolCallResponse(\n toolName: string,\n input: Record<string, unknown>,\n toolCallId = `${toolName}-1`,\n): {\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n usage: LanguageModelV2Usage;\n} {\n return {\n content: [\n {\n type: \"tool-call\",\n toolCallId,\n toolName,\n input: JSON.stringify(input),\n },\n ],\n finishReason: \"tool-calls\",\n usage: DEFAULT_USAGE,\n };\n}\n\nexport function doneToolResponse(\n reasoning = \"done\",\n taskComplete = true,\n toolCallId = \"done-1\",\n): {\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n usage: LanguageModelV2Usage;\n} {\n return toolCallResponse(\"done\", { reasoning, taskComplete }, toolCallId);\n}\n\nfunction createGenerateResult(result: ScriptedGenerateResult): {\n content: LanguageModelV2Content[];\n finishReason: LanguageModelV2FinishReason;\n usage: LanguageModelV2Usage;\n warnings: [];\n} {\n return {\n content: result.content,\n finishReason: result.finishReason ?? \"stop\",\n usage: mergeUsage(result.usage),\n warnings: [],\n };\n}\n\nexport function createScriptedAisdkTestLlmClient(options?: {\n modelId?: string;\n jsonResponses?: Partial<Record<JsonResponseKey, JsonResponseScript>>;\n generateResponses?: GenerateResponseValue[];\n}): AISdkClient {\n const jsonResponses = Object.fromEntries(\n Object.entries(options?.jsonResponses ?? {}).map(([key, value]) => [\n key,\n Array.isArray(value) ? [...value] : value,\n ]),\n ) as Partial<Record<JsonResponseKey, JsonResponseScript>>;\n const generateResponses = [...(options?.generateResponses ?? [])];\n\n const model: ScriptedLanguageModel = {\n provider: \"mock\",\n modelId: options?.modelId ?? \"mock/stagehand-flow-logger\",\n specificationVersion: \"v2\",\n supportedUrls: {},\n doGenerateCalls: [],\n doGenerate: async (callOptions) => {\n model.doGenerateCalls.push(callOptions);\n\n if (callOptions.responseFormat?.type === \"json\") {\n const key = resolveJsonResponseKey(callOptions);\n const responseScripts = consumeScriptValue<\n JsonResponseScript | undefined\n >(jsonResponses[key], jsonResponses.default);\n const responseScript = consumeScriptValue<\n JsonResponseValue | undefined\n >(responseScripts, undefined);\n const response =\n typeof responseScript === \"function\"\n ? responseScript(callOptions)\n : (responseScript ?? {});\n\n return createGenerateResult({\n content: [{ type: \"text\", text: JSON.stringify(response) }],\n });\n }\n\n const responseScript = consumeScriptValue<\n GenerateResponseValue | undefined\n >(generateResponses, undefined);\n\n if (!responseScript) {\n return createGenerateResult({\n content: [{ type: \"text\", text: \"done\" }],\n });\n }\n\n const response =\n typeof responseScript === \"function\"\n ? responseScript(callOptions)\n : responseScript;\n\n return createGenerateResult(response);\n },\n doStream: async () => {\n throw new Error(\"Streaming is not implemented for this test model.\");\n },\n };\n\n return new AISdkClient({ model });\n}\n"]}
|
|
@@ -102,7 +102,7 @@ function findToolOutput(stepEvents, toolName) {
|
|
|
102
102
|
}
|
|
103
103
|
return undefined;
|
|
104
104
|
}
|
|
105
|
-
async function runAgentToolTimeoutScenario(toolName, toolInput) {
|
|
105
|
+
async function runAgentToolTimeoutScenario(toolName, toolInput, options) {
|
|
106
106
|
const llmClient = createToolTimeoutTestLlmClient(toolName, toolInput);
|
|
107
107
|
const stepEvents = [];
|
|
108
108
|
const v3 = new v3_js_1.V3({
|
|
@@ -114,7 +114,9 @@ async function runAgentToolTimeoutScenario(toolName, toolInput) {
|
|
|
114
114
|
try {
|
|
115
115
|
const page = v3.context.pages()[0];
|
|
116
116
|
await page.goto("https://example.com");
|
|
117
|
-
const agent = v3.agent(
|
|
117
|
+
const agent = v3.agent({
|
|
118
|
+
...(options?.mode ? { mode: options.mode } : {}),
|
|
119
|
+
});
|
|
118
120
|
await agent.execute({
|
|
119
121
|
instruction: `Use ${toolName} and then finish`,
|
|
120
122
|
maxSteps: 2,
|
|
@@ -169,6 +171,7 @@ test_1.test.describe("V3 hard timeouts", () => {
|
|
|
169
171
|
const output = toolOutput;
|
|
170
172
|
(0, test_1.expect)(output.success).toBe(false);
|
|
171
173
|
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
174
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
172
175
|
});
|
|
173
176
|
(0, test_1.test)("agent toolTimeout enforces timeout for extract tool", async () => {
|
|
174
177
|
const { toolOutput } = await runAgentToolTimeoutScenario("extract", {
|
|
@@ -178,6 +181,7 @@ test_1.test.describe("V3 hard timeouts", () => {
|
|
|
178
181
|
const output = toolOutput;
|
|
179
182
|
(0, test_1.expect)(output.success).toBe(false);
|
|
180
183
|
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
184
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
181
185
|
});
|
|
182
186
|
(0, test_1.test)("agent toolTimeout enforces timeout for fillForm tool", async () => {
|
|
183
187
|
const { toolOutput } = await runAgentToolTimeoutScenario("fillForm", {
|
|
@@ -186,12 +190,118 @@ test_1.test.describe("V3 hard timeouts", () => {
|
|
|
186
190
|
const output = toolOutput;
|
|
187
191
|
(0, test_1.expect)(output.success).toBe(false);
|
|
188
192
|
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
193
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
189
194
|
});
|
|
190
195
|
(0, test_1.test)("agent toolTimeout enforces timeout for ariaTree", async () => {
|
|
191
196
|
const { toolOutput } = await runAgentToolTimeoutScenario("ariaTree", {});
|
|
192
197
|
const output = toolOutput;
|
|
193
198
|
(0, test_1.expect)(output.success).toBe(false);
|
|
194
199
|
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
200
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
201
|
+
});
|
|
202
|
+
(0, test_1.test)("agent toolTimeout enforces timeout for goto tool", async () => {
|
|
203
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("goto", {
|
|
204
|
+
url: "https://example.com/slow",
|
|
205
|
+
});
|
|
206
|
+
const output = toolOutput;
|
|
207
|
+
(0, test_1.expect)(output.success).toBe(false);
|
|
208
|
+
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
209
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
210
|
+
});
|
|
211
|
+
(0, test_1.test)("agent toolTimeout enforces timeout for navback tool", async () => {
|
|
212
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("navback", {
|
|
213
|
+
reasoningText: "going back",
|
|
214
|
+
});
|
|
215
|
+
const output = toolOutput;
|
|
216
|
+
(0, test_1.expect)(output.success).toBe(false);
|
|
217
|
+
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
218
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
219
|
+
});
|
|
220
|
+
(0, test_1.test)("agent toolTimeout enforces timeout for screenshot tool", async () => {
|
|
221
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("screenshot", {});
|
|
222
|
+
const output = toolOutput;
|
|
223
|
+
(0, test_1.expect)(output.success).toBe(false);
|
|
224
|
+
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
225
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
226
|
+
});
|
|
227
|
+
(0, test_1.test)("agent toolTimeout enforces timeout for scroll tool", async () => {
|
|
228
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("scroll", {
|
|
229
|
+
direction: "down",
|
|
230
|
+
});
|
|
231
|
+
const output = toolOutput;
|
|
232
|
+
(0, test_1.expect)(output.success).toBe(false);
|
|
233
|
+
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
234
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
235
|
+
});
|
|
236
|
+
(0, test_1.test)("agent toolTimeout enforces timeout for keys tool", async () => {
|
|
237
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("keys", {
|
|
238
|
+
method: "press",
|
|
239
|
+
value: "Enter",
|
|
240
|
+
});
|
|
241
|
+
const output = toolOutput;
|
|
242
|
+
(0, test_1.expect)(output.success).toBe(false);
|
|
243
|
+
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
244
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
245
|
+
});
|
|
246
|
+
(0, test_1.test)("agent toolTimeout enforces timeout for click tool (hybrid)", async () => {
|
|
247
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("click", { describe: "click element", coordinates: [100, 100] }, { mode: "hybrid" });
|
|
248
|
+
const output = toolOutput;
|
|
249
|
+
(0, test_1.expect)(output.success).toBe(false);
|
|
250
|
+
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
251
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
252
|
+
});
|
|
253
|
+
(0, test_1.test)("agent toolTimeout enforces timeout for type tool (hybrid)", async () => {
|
|
254
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("type", {
|
|
255
|
+
describe: "type into field",
|
|
256
|
+
text: "hello",
|
|
257
|
+
coordinates: [100, 100],
|
|
258
|
+
}, { mode: "hybrid" });
|
|
259
|
+
const output = toolOutput;
|
|
260
|
+
(0, test_1.expect)(output.success).toBe(false);
|
|
261
|
+
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
262
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
263
|
+
});
|
|
264
|
+
(0, test_1.test)("agent toolTimeout enforces timeout for dragAndDrop tool (hybrid)", async () => {
|
|
265
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("dragAndDrop", {
|
|
266
|
+
describe: "drag element",
|
|
267
|
+
startCoordinates: [100, 100],
|
|
268
|
+
endCoordinates: [200, 200],
|
|
269
|
+
}, { mode: "hybrid" });
|
|
270
|
+
const output = toolOutput;
|
|
271
|
+
(0, test_1.expect)(output.success).toBe(false);
|
|
272
|
+
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
273
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
274
|
+
});
|
|
275
|
+
(0, test_1.test)("agent toolTimeout enforces timeout for clickAndHold tool (hybrid)", async () => {
|
|
276
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("clickAndHold", {
|
|
277
|
+
describe: "hold element",
|
|
278
|
+
coordinates: [100, 100],
|
|
279
|
+
duration: 1000,
|
|
280
|
+
}, { mode: "hybrid" });
|
|
281
|
+
const output = toolOutput;
|
|
282
|
+
(0, test_1.expect)(output.success).toBe(false);
|
|
283
|
+
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
284
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
285
|
+
});
|
|
286
|
+
(0, test_1.test)("agent toolTimeout enforces timeout for fillFormVision tool (hybrid)", async () => {
|
|
287
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("fillFormVision", {
|
|
288
|
+
fields: [
|
|
289
|
+
{
|
|
290
|
+
action: "type hello into name",
|
|
291
|
+
value: "hello",
|
|
292
|
+
coordinates: { x: 100, y: 100 },
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
action: "type world into email",
|
|
296
|
+
value: "world",
|
|
297
|
+
coordinates: { x: 100, y: 200 },
|
|
298
|
+
},
|
|
299
|
+
],
|
|
300
|
+
}, { mode: "hybrid" });
|
|
301
|
+
const output = toolOutput;
|
|
302
|
+
(0, test_1.expect)(output.success).toBe(false);
|
|
303
|
+
(0, test_1.expect)(output.error).toContain("TimeoutError");
|
|
304
|
+
(0, test_1.expect)(output.error).toContain("1ms");
|
|
195
305
|
});
|
|
196
306
|
});
|
|
197
307
|
//# sourceMappingURL=timeouts.spec.js.map
|