@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,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,uCAAuC,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uDAAuD,CAAC;AAChG,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AACxC,OAAO,EACL,gCAAgC,EAChC,OAAO,EACP,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;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,EAAE,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACrC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAc,EAAE,EAAE;QAChC,IAAI,KAAK,YAAY,SAAS,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,MAAM,CAAC,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,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAgB,EAAE,MAAiB;IAC7D,MAAM,CAAC,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,MAAM,CACJ,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,MAAM,CAAC,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,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,CACJ,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,MAAM,CACJ,UAAU,EACV,GAAG,KAAK,CAAC,SAAS,yBAAyB,CAC5C,CAAC,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,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,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,CACJ,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,MAAM,CACJ,UAAU,EACV,GAAG,KAAK,CAAC,SAAS,yBAAyB,CAC5C,CAAC,WAAW,EAAE,CAAC;QAEhB,IAAI,KAAK,CAAC,SAAS,KAAK,cAAc,EAAE,CAAC;YACvC,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,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,MAAM,CAAC,QAAQ,EAAE,sCAAsC,CAAC,CAAC,WAAW,EAAE,CAAC;IACvE,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,MAAM,CAAC,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,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,IAAI,CAAC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IAC5C,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE5C,IAAI,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,UAAU,GAAG,wBAAwB,CAAC;QAC5C,MAAM,SAAS,GAAG,gCAAgC,CAAC;YACjD,aAAa,EAAE;gBACb,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACjB,SAAS,EAAE,iBAAiB,CAAC,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,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CACJ,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,MAAM,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,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,OAAO,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,WAAW,GAAG,4BAA4B,CAAC;QACjD,MAAM,YAAY,GAAG,2BAA2B,CAAC;QACjD,MAAM,SAAS,GAAG,gCAAgC,CAAC;YACjD,aAAa,EAAE;gBACb,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACzB,QAAQ,EAAE;wBACR;4BACE,SAAS,EAAE,iBAAiB,CAAC,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,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACtC,MAAM,CAAC,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,MAAM,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,mBAAmB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;gBACnD,WAAW,CAAC,OAAO;aACpB,CAAC,CAAC;YACH,MAAM,CAAC,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,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAChC,CAAC;YAEF,MAAM,CAAC,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,MAAM,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,mBAAmB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAE5C,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,kBAAkB,EAAE,GAAG,mBAAmB,CAAC,EAAE,CAAC;gBACpE,MAAM,CAAC,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,OAAO,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;QAC/G,MAAM,UAAU,GAAG,kBAAkB,CAAC;QACtC,MAAM,SAAS,GAAG,gCAAgC,CAAC;YACjD,aAAa,EAAE;gBACb,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACjB,SAAS,EAAE,iBAAiB,CAAC,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,gBAAgB,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,aAAa,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC;gBACvE,gBAAgB,CAAC,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,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CACJ,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,MAAM,CAAC,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,MAAM,CACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAC3D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAC5D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CACJ,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,CACzD,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CACJ,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,OAAO,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qGAAqG,EAAE,KAAK,IAAI,EAAE;QACrH,MAAM,SAAS,GAAG,gCAAgC,CAAC;YACjD,aAAa,EAAE;gBACb,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACzB,QAAQ,EAAE;wBACR;4BACE,SAAS,EAAE,iBAAiB,CAAC,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,gBAAgB,CACd,UAAU,EACV;oBACE,MAAM,EAAE;wBACN;4BACE,MAAM,EAAE,gCAAgC;4BACxC,KAAK,EAAE,OAAO;yBACf;qBACF;iBACF,EACD,YAAY,CACb;gBACD,gBAAgB,CAAC,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,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,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,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAChE,kBAAkB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAClD,MAAM,CAAC,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,MAAM,CACJ,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAC7D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CACJ,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAC9D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAC3D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAC5D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CACJ,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,CACzD,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CACJ,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,OAAO,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,YAAY,GAAG,qBAAqB,CAAC;QAC3C,MAAM,SAAS,GAAG,gCAAgC,CAAC;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,gBAAgB,CACd,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,gBAAgB,CAAC,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,MAAM,CAAC,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,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAChE,kBAAkB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAClD,MAAM,CACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAC3D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAC5D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CACJ,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAC7D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,CACJ,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,OAAO,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;QAC5G,MAAM,YAAY,GAAG,UAAU,CAAC;;;;;;;KAO/B,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,gCAAgC,CAAC;YACtD,iBAAiB,EAAE;gBACjB,gBAAgB,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,QAAQ,CAAC;gBACzD,gBAAgB,CAAC,YAAY,EAAE,EAAE,EAAE,cAAc,CAAC;gBAClD,gBAAgB,CAAC,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,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,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,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACxD,kBAAkB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAChD,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9D,kBAAkB,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAC;YAC5D,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAErC,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,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,OAAO,CAAC,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,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,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,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,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,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,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,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,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,uBAAuB,CAC3B,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,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjE,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,MAAM,CACJ,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,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,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,OAAO,CAAC,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 {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AISdkClient } from "../../lib/v3/llm/aisdk.js";
|
|
1
2
|
/**
|
|
2
3
|
* Races a promise against a timeout.
|
|
3
4
|
* Resolves to the promise value or "timeout" if the deadline expires.
|
|
@@ -37,4 +38,141 @@ export async function closeV3(v3) {
|
|
|
37
38
|
}
|
|
38
39
|
await settleWithTimeout(v3.close(), CLOSE_TIMEOUT_MS);
|
|
39
40
|
}
|
|
41
|
+
const DEFAULT_USAGE = {
|
|
42
|
+
inputTokens: 1,
|
|
43
|
+
outputTokens: 1,
|
|
44
|
+
totalTokens: 2,
|
|
45
|
+
reasoningTokens: 0,
|
|
46
|
+
cachedInputTokens: 0,
|
|
47
|
+
};
|
|
48
|
+
const mergeUsage = (usage) => ({
|
|
49
|
+
...DEFAULT_USAGE,
|
|
50
|
+
...(usage ?? {}),
|
|
51
|
+
});
|
|
52
|
+
function consumeScriptValue(value, fallback) {
|
|
53
|
+
if (!Array.isArray(value)) {
|
|
54
|
+
return value ?? fallback;
|
|
55
|
+
}
|
|
56
|
+
if (value.length <= 1) {
|
|
57
|
+
return value[0] ?? fallback;
|
|
58
|
+
}
|
|
59
|
+
return value.shift() ?? fallback;
|
|
60
|
+
}
|
|
61
|
+
function resolveJsonResponseKey(options) {
|
|
62
|
+
const responseFormat = options.responseFormat;
|
|
63
|
+
if (!responseFormat || responseFormat.type !== "json") {
|
|
64
|
+
return "default";
|
|
65
|
+
}
|
|
66
|
+
const schema = responseFormat.schema;
|
|
67
|
+
const properties = schema?.properties ?? {};
|
|
68
|
+
if ("elementId" in properties && "twoStep" in properties) {
|
|
69
|
+
return "act";
|
|
70
|
+
}
|
|
71
|
+
if ("elements" in properties) {
|
|
72
|
+
return "Observation";
|
|
73
|
+
}
|
|
74
|
+
if ("completed" in properties && "progress" in properties) {
|
|
75
|
+
return "Metadata";
|
|
76
|
+
}
|
|
77
|
+
return "Extraction";
|
|
78
|
+
}
|
|
79
|
+
export function promptToText(prompt) {
|
|
80
|
+
return (prompt ?? [])
|
|
81
|
+
.flatMap((message) => {
|
|
82
|
+
if (typeof message.content === "string") {
|
|
83
|
+
return [message.content];
|
|
84
|
+
}
|
|
85
|
+
return (message.content ?? [])
|
|
86
|
+
.map((part) => (part.type === "text" ? part.text : ""))
|
|
87
|
+
.filter((text) => text.length > 0);
|
|
88
|
+
})
|
|
89
|
+
.join("\n");
|
|
90
|
+
}
|
|
91
|
+
function findEncodedIds(options) {
|
|
92
|
+
return [...promptToText(options.prompt).matchAll(/\b\d+-\d+\b/g)].map((match) => match[0]);
|
|
93
|
+
}
|
|
94
|
+
export function findEncodedIdForText(options, text) {
|
|
95
|
+
const promptText = promptToText(options.prompt);
|
|
96
|
+
const lines = promptText.split("\n");
|
|
97
|
+
const line = lines.find((entry) => entry.includes(text));
|
|
98
|
+
const match = line?.match(/\b\d+-\d+\b/);
|
|
99
|
+
if (!match) {
|
|
100
|
+
throw new Error(`Could not find encoded id for text: ${text}`);
|
|
101
|
+
}
|
|
102
|
+
return match[0];
|
|
103
|
+
}
|
|
104
|
+
export function findLastEncodedId(options) {
|
|
105
|
+
const matches = findEncodedIds(options);
|
|
106
|
+
if (matches.length === 0) {
|
|
107
|
+
throw new Error("Could not find any encoded ids in the prompt.");
|
|
108
|
+
}
|
|
109
|
+
return matches[matches.length - 1];
|
|
110
|
+
}
|
|
111
|
+
export function toolCallResponse(toolName, input, toolCallId = `${toolName}-1`) {
|
|
112
|
+
return {
|
|
113
|
+
content: [
|
|
114
|
+
{
|
|
115
|
+
type: "tool-call",
|
|
116
|
+
toolCallId,
|
|
117
|
+
toolName,
|
|
118
|
+
input: JSON.stringify(input),
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
finishReason: "tool-calls",
|
|
122
|
+
usage: DEFAULT_USAGE,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
export function doneToolResponse(reasoning = "done", taskComplete = true, toolCallId = "done-1") {
|
|
126
|
+
return toolCallResponse("done", { reasoning, taskComplete }, toolCallId);
|
|
127
|
+
}
|
|
128
|
+
function createGenerateResult(result) {
|
|
129
|
+
return {
|
|
130
|
+
content: result.content,
|
|
131
|
+
finishReason: result.finishReason ?? "stop",
|
|
132
|
+
usage: mergeUsage(result.usage),
|
|
133
|
+
warnings: [],
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
export function createScriptedAisdkTestLlmClient(options) {
|
|
137
|
+
const jsonResponses = Object.fromEntries(Object.entries(options?.jsonResponses ?? {}).map(([key, value]) => [
|
|
138
|
+
key,
|
|
139
|
+
Array.isArray(value) ? [...value] : value,
|
|
140
|
+
]));
|
|
141
|
+
const generateResponses = [...(options?.generateResponses ?? [])];
|
|
142
|
+
const model = {
|
|
143
|
+
provider: "mock",
|
|
144
|
+
modelId: options?.modelId ?? "mock/stagehand-flow-logger",
|
|
145
|
+
specificationVersion: "v2",
|
|
146
|
+
supportedUrls: {},
|
|
147
|
+
doGenerateCalls: [],
|
|
148
|
+
doGenerate: async (callOptions) => {
|
|
149
|
+
model.doGenerateCalls.push(callOptions);
|
|
150
|
+
if (callOptions.responseFormat?.type === "json") {
|
|
151
|
+
const key = resolveJsonResponseKey(callOptions);
|
|
152
|
+
const responseScripts = consumeScriptValue(jsonResponses[key], jsonResponses.default);
|
|
153
|
+
const responseScript = consumeScriptValue(responseScripts, undefined);
|
|
154
|
+
const response = typeof responseScript === "function"
|
|
155
|
+
? responseScript(callOptions)
|
|
156
|
+
: (responseScript ?? {});
|
|
157
|
+
return createGenerateResult({
|
|
158
|
+
content: [{ type: "text", text: JSON.stringify(response) }],
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
const responseScript = consumeScriptValue(generateResponses, undefined);
|
|
162
|
+
if (!responseScript) {
|
|
163
|
+
return createGenerateResult({
|
|
164
|
+
content: [{ type: "text", text: "done" }],
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
const response = typeof responseScript === "function"
|
|
168
|
+
? responseScript(callOptions)
|
|
169
|
+
: responseScript;
|
|
170
|
+
return createGenerateResult(response);
|
|
171
|
+
},
|
|
172
|
+
doStream: async () => {
|
|
173
|
+
throw new Error("Streaming is not implemented for this test model.");
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
return new AISdkClient({ model });
|
|
177
|
+
}
|
|
40
178
|
//# sourceMappingURL=testUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.js","sourceRoot":"","sources":["../../../../tests/integration/testUtils.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,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;AAED,MAAM,CAAC,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"]}
|
|
@@ -100,7 +100,7 @@ function findToolOutput(stepEvents, toolName) {
|
|
|
100
100
|
}
|
|
101
101
|
return undefined;
|
|
102
102
|
}
|
|
103
|
-
async function runAgentToolTimeoutScenario(toolName, toolInput) {
|
|
103
|
+
async function runAgentToolTimeoutScenario(toolName, toolInput, options) {
|
|
104
104
|
const llmClient = createToolTimeoutTestLlmClient(toolName, toolInput);
|
|
105
105
|
const stepEvents = [];
|
|
106
106
|
const v3 = new V3({
|
|
@@ -112,7 +112,9 @@ async function runAgentToolTimeoutScenario(toolName, toolInput) {
|
|
|
112
112
|
try {
|
|
113
113
|
const page = v3.context.pages()[0];
|
|
114
114
|
await page.goto("https://example.com");
|
|
115
|
-
const agent = v3.agent(
|
|
115
|
+
const agent = v3.agent({
|
|
116
|
+
...(options?.mode ? { mode: options.mode } : {}),
|
|
117
|
+
});
|
|
116
118
|
await agent.execute({
|
|
117
119
|
instruction: `Use ${toolName} and then finish`,
|
|
118
120
|
maxSteps: 2,
|
|
@@ -167,6 +169,7 @@ test.describe("V3 hard timeouts", () => {
|
|
|
167
169
|
const output = toolOutput;
|
|
168
170
|
expect(output.success).toBe(false);
|
|
169
171
|
expect(output.error).toContain("TimeoutError");
|
|
172
|
+
expect(output.error).toContain("1ms");
|
|
170
173
|
});
|
|
171
174
|
test("agent toolTimeout enforces timeout for extract tool", async () => {
|
|
172
175
|
const { toolOutput } = await runAgentToolTimeoutScenario("extract", {
|
|
@@ -176,6 +179,7 @@ test.describe("V3 hard timeouts", () => {
|
|
|
176
179
|
const output = toolOutput;
|
|
177
180
|
expect(output.success).toBe(false);
|
|
178
181
|
expect(output.error).toContain("TimeoutError");
|
|
182
|
+
expect(output.error).toContain("1ms");
|
|
179
183
|
});
|
|
180
184
|
test("agent toolTimeout enforces timeout for fillForm tool", async () => {
|
|
181
185
|
const { toolOutput } = await runAgentToolTimeoutScenario("fillForm", {
|
|
@@ -184,12 +188,118 @@ test.describe("V3 hard timeouts", () => {
|
|
|
184
188
|
const output = toolOutput;
|
|
185
189
|
expect(output.success).toBe(false);
|
|
186
190
|
expect(output.error).toContain("TimeoutError");
|
|
191
|
+
expect(output.error).toContain("1ms");
|
|
187
192
|
});
|
|
188
193
|
test("agent toolTimeout enforces timeout for ariaTree", async () => {
|
|
189
194
|
const { toolOutput } = await runAgentToolTimeoutScenario("ariaTree", {});
|
|
190
195
|
const output = toolOutput;
|
|
191
196
|
expect(output.success).toBe(false);
|
|
192
197
|
expect(output.error).toContain("TimeoutError");
|
|
198
|
+
expect(output.error).toContain("1ms");
|
|
199
|
+
});
|
|
200
|
+
test("agent toolTimeout enforces timeout for goto tool", async () => {
|
|
201
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("goto", {
|
|
202
|
+
url: "https://example.com/slow",
|
|
203
|
+
});
|
|
204
|
+
const output = toolOutput;
|
|
205
|
+
expect(output.success).toBe(false);
|
|
206
|
+
expect(output.error).toContain("TimeoutError");
|
|
207
|
+
expect(output.error).toContain("1ms");
|
|
208
|
+
});
|
|
209
|
+
test("agent toolTimeout enforces timeout for navback tool", async () => {
|
|
210
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("navback", {
|
|
211
|
+
reasoningText: "going back",
|
|
212
|
+
});
|
|
213
|
+
const output = toolOutput;
|
|
214
|
+
expect(output.success).toBe(false);
|
|
215
|
+
expect(output.error).toContain("TimeoutError");
|
|
216
|
+
expect(output.error).toContain("1ms");
|
|
217
|
+
});
|
|
218
|
+
test("agent toolTimeout enforces timeout for screenshot tool", async () => {
|
|
219
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("screenshot", {});
|
|
220
|
+
const output = toolOutput;
|
|
221
|
+
expect(output.success).toBe(false);
|
|
222
|
+
expect(output.error).toContain("TimeoutError");
|
|
223
|
+
expect(output.error).toContain("1ms");
|
|
224
|
+
});
|
|
225
|
+
test("agent toolTimeout enforces timeout for scroll tool", async () => {
|
|
226
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("scroll", {
|
|
227
|
+
direction: "down",
|
|
228
|
+
});
|
|
229
|
+
const output = toolOutput;
|
|
230
|
+
expect(output.success).toBe(false);
|
|
231
|
+
expect(output.error).toContain("TimeoutError");
|
|
232
|
+
expect(output.error).toContain("1ms");
|
|
233
|
+
});
|
|
234
|
+
test("agent toolTimeout enforces timeout for keys tool", async () => {
|
|
235
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("keys", {
|
|
236
|
+
method: "press",
|
|
237
|
+
value: "Enter",
|
|
238
|
+
});
|
|
239
|
+
const output = toolOutput;
|
|
240
|
+
expect(output.success).toBe(false);
|
|
241
|
+
expect(output.error).toContain("TimeoutError");
|
|
242
|
+
expect(output.error).toContain("1ms");
|
|
243
|
+
});
|
|
244
|
+
test("agent toolTimeout enforces timeout for click tool (hybrid)", async () => {
|
|
245
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("click", { describe: "click element", coordinates: [100, 100] }, { mode: "hybrid" });
|
|
246
|
+
const output = toolOutput;
|
|
247
|
+
expect(output.success).toBe(false);
|
|
248
|
+
expect(output.error).toContain("TimeoutError");
|
|
249
|
+
expect(output.error).toContain("1ms");
|
|
250
|
+
});
|
|
251
|
+
test("agent toolTimeout enforces timeout for type tool (hybrid)", async () => {
|
|
252
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("type", {
|
|
253
|
+
describe: "type into field",
|
|
254
|
+
text: "hello",
|
|
255
|
+
coordinates: [100, 100],
|
|
256
|
+
}, { mode: "hybrid" });
|
|
257
|
+
const output = toolOutput;
|
|
258
|
+
expect(output.success).toBe(false);
|
|
259
|
+
expect(output.error).toContain("TimeoutError");
|
|
260
|
+
expect(output.error).toContain("1ms");
|
|
261
|
+
});
|
|
262
|
+
test("agent toolTimeout enforces timeout for dragAndDrop tool (hybrid)", async () => {
|
|
263
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("dragAndDrop", {
|
|
264
|
+
describe: "drag element",
|
|
265
|
+
startCoordinates: [100, 100],
|
|
266
|
+
endCoordinates: [200, 200],
|
|
267
|
+
}, { mode: "hybrid" });
|
|
268
|
+
const output = toolOutput;
|
|
269
|
+
expect(output.success).toBe(false);
|
|
270
|
+
expect(output.error).toContain("TimeoutError");
|
|
271
|
+
expect(output.error).toContain("1ms");
|
|
272
|
+
});
|
|
273
|
+
test("agent toolTimeout enforces timeout for clickAndHold tool (hybrid)", async () => {
|
|
274
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("clickAndHold", {
|
|
275
|
+
describe: "hold element",
|
|
276
|
+
coordinates: [100, 100],
|
|
277
|
+
duration: 1000,
|
|
278
|
+
}, { mode: "hybrid" });
|
|
279
|
+
const output = toolOutput;
|
|
280
|
+
expect(output.success).toBe(false);
|
|
281
|
+
expect(output.error).toContain("TimeoutError");
|
|
282
|
+
expect(output.error).toContain("1ms");
|
|
283
|
+
});
|
|
284
|
+
test("agent toolTimeout enforces timeout for fillFormVision tool (hybrid)", async () => {
|
|
285
|
+
const { toolOutput } = await runAgentToolTimeoutScenario("fillFormVision", {
|
|
286
|
+
fields: [
|
|
287
|
+
{
|
|
288
|
+
action: "type hello into name",
|
|
289
|
+
value: "hello",
|
|
290
|
+
coordinates: { x: 100, y: 100 },
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
action: "type world into email",
|
|
294
|
+
value: "world",
|
|
295
|
+
coordinates: { x: 100, y: 200 },
|
|
296
|
+
},
|
|
297
|
+
],
|
|
298
|
+
}, { mode: "hybrid" });
|
|
299
|
+
const output = toolOutput;
|
|
300
|
+
expect(output.success).toBe(false);
|
|
301
|
+
expect(output.error).toContain("TimeoutError");
|
|
302
|
+
expect(output.error).toContain("1ms");
|
|
193
303
|
});
|
|
194
304
|
});
|
|
195
305
|
//# sourceMappingURL=timeouts.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeouts.spec.js","sourceRoot":"","sources":["../../../../tests/integration/timeouts.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../../lib/v3/v3.js\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { z } from \"zod\";\nimport { closeV3 } from \"./testUtils.js\";\nimport type { LLMClient } from \"../../lib/v3/llm/LLMClient.js\";\nimport { generateText } from \"ai\";\n\ntype AgentToolNameWithTimeout = \"act\" | \"extract\" | \"fillForm\" | \"ariaTree\";\n\ntype ToolTimeoutTestModel = {\n provider: string;\n modelId: string;\n specificationVersion: \"v2\";\n supportedUrls: Record<string, RegExp[]>;\n doGenerate: () => Promise<{\n content: Array<{\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n input: string;\n }>;\n finishReason: \"tool-calls\";\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n warnings: [];\n }>;\n doStream: (_options: unknown) => Promise<never>;\n};\n\ntype ToolTimeoutTestLLMClient = LLMClient & {\n model: ToolTimeoutTestModel;\n};\n\nfunction createToolTimeoutTestLlmClient(\n toolName: AgentToolNameWithTimeout,\n toolInput: Record<string, unknown>,\n): ToolTimeoutTestLLMClient {\n const usage = {\n prompt_tokens: 0,\n completion_tokens: 0,\n reasoning_tokens: 0,\n cached_input_tokens: 0,\n total_tokens: 0,\n };\n let generateCallCount = 0;\n\n const model: ToolTimeoutTestModel = {\n provider: \"mock\",\n modelId: \"mock/tool-timeout-test\",\n specificationVersion: \"v2\",\n supportedUrls: {},\n doGenerate: async () => {\n generateCallCount += 1;\n if (generateCallCount === 1) {\n return {\n content: [\n {\n type: \"tool-call\",\n toolCallId: \"tool-1\",\n toolName,\n input: JSON.stringify(toolInput),\n },\n ],\n finishReason: \"tool-calls\",\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n warnings: [],\n };\n }\n\n return {\n content: [\n {\n type: \"tool-call\",\n toolCallId: \"done-1\",\n toolName: \"done\",\n input: JSON.stringify({ reasoning: \"done\", taskComplete: true }),\n },\n ],\n finishReason: \"tool-calls\",\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n warnings: [],\n };\n },\n doStream: async () => {\n throw new Error(\"doStream not implemented in timeout test model\");\n },\n };\n\n const llm = {\n type: \"openai\",\n modelName: \"openai/gpt-4.1-mini\",\n hasVision: false,\n clientOptions: {},\n model,\n getLanguageModel: () => model,\n generateText,\n createChatCompletion: async <T = unknown>(options: unknown): Promise<T> => {\n const responseModelName = (\n options as { options?: { response_model?: { name?: string } } }\n )?.options?.response_model?.name;\n\n if (responseModelName === \"act\") {\n return {\n data: {\n elementId: \"1-0\",\n description: \"click body\",\n method: \"click\",\n arguments: [],\n twoStep: false,\n },\n usage,\n } as T;\n }\n if (responseModelName === \"Observation\") {\n return { data: { elements: [] }, usage } as T;\n }\n if (responseModelName === \"Extraction\") {\n return { data: {}, usage } as T;\n }\n if (responseModelName === \"Metadata\") {\n return { data: { completed: true, progress: \"\" }, usage } as T;\n }\n return { data: {}, usage } as T;\n },\n };\n\n return llm as unknown as ToolTimeoutTestLLMClient;\n}\n\nfunction findToolOutput(\n stepEvents: Array<{\n toolCalls?: Array<{ toolName?: string }>;\n toolResults?: Array<{ output?: unknown }>;\n }>,\n toolName: string,\n) {\n for (const event of stepEvents) {\n if (!event.toolCalls || !event.toolResults) continue;\n const toolIndex = event.toolCalls.findIndex(\n (tc) => tc.toolName === toolName,\n );\n if (toolIndex !== -1) {\n return event.toolResults[toolIndex]?.output;\n }\n }\n return undefined;\n}\n\nasync function runAgentToolTimeoutScenario(\n toolName: AgentToolNameWithTimeout,\n toolInput: Record<string, unknown>,\n) {\n const llmClient = createToolTimeoutTestLlmClient(toolName, toolInput);\n const stepEvents: Array<{\n toolCalls?: Array<{ toolName?: string }>;\n toolResults?: Array<{ output?: unknown }>;\n }> = [];\n const v3 = new V3({\n ...v3DynamicTestConfig,\n experimental: true,\n llmClient,\n });\n await v3.init();\n try {\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n const agent = v3.agent();\n await agent.execute({\n instruction: `Use ${toolName} and then finish`,\n maxSteps: 2,\n toolTimeout: 1,\n callbacks: {\n onStepFinish: (event) => {\n stepEvents.push({\n toolCalls: event.toolCalls?.map((tc) => ({\n toolName: tc.toolName,\n })),\n toolResults: event.toolResults?.map((tr) => ({\n output: tr.output,\n })),\n });\n },\n },\n });\n const toolOutput = findToolOutput(stepEvents, toolName);\n if (!toolOutput) {\n throw new Error(`No tool output captured for ${toolName}`);\n }\n return { toolOutput };\n } finally {\n await closeV3(v3);\n }\n}\n\ntest.describe(\"V3 hard timeouts\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3DynamicTestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await closeV3(v3);\n });\n\n test(\"observe() enforces timeoutMs\", async () => {\n // Tiny timeout to force the race to hit the timeout branch\n await expect(v3.observe(\"find something\", { timeout: 5 })).rejects.toThrow(\n /timed out/i,\n );\n });\n\n test(\"extract() enforces timeoutMs\", async () => {\n const schema = z.object({ title: z.string().optional() });\n await expect(\n v3.extract(\"Extract title\", schema, { timeout: 5 }),\n ).rejects.toThrow(/timed out/i);\n });\n\n test(\"act() enforces timeoutMs\", async () => {\n await expect(v3.act(\"do nothing\", { timeout: 5 })).rejects.toThrow(\n /timed out/i,\n );\n });\n\n test(\"agent toolTimeout enforces timeout for act tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"act\", {\n action: \"click somewhere\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n });\n\n test(\"agent toolTimeout enforces timeout for extract tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"extract\", {\n instruction: \"extract the page title\",\n schema: { type: \"object\", properties: { title: { type: \"string\" } } },\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n });\n\n test(\"agent toolTimeout enforces timeout for fillForm tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"fillForm\", {\n fields: [{ action: \"type hello into name\", value: \"hello\" }],\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n });\n\n test(\"agent toolTimeout enforces timeout for ariaTree\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"ariaTree\", {});\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"timeouts.spec.js","sourceRoot":"","sources":["../../../../tests/integration/timeouts.spec.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../../lib/v3/v3.js\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { z } from \"zod\";\nimport { closeV3 } from \"./testUtils.js\";\nimport type { LLMClient } from \"../../lib/v3/llm/LLMClient.js\";\nimport { generateText } from \"ai\";\n\ntype AgentToolNameWithTimeout =\n | \"act\"\n | \"extract\"\n | \"fillForm\"\n | \"ariaTree\"\n | \"click\"\n | \"type\"\n | \"dragAndDrop\"\n | \"clickAndHold\"\n | \"fillFormVision\"\n | \"goto\"\n | \"navback\"\n | \"screenshot\"\n | \"scroll\"\n | \"keys\";\n\ntype ToolTimeoutTestModel = {\n provider: string;\n modelId: string;\n specificationVersion: \"v2\";\n supportedUrls: Record<string, RegExp[]>;\n doGenerate: () => Promise<{\n content: Array<{\n type: \"tool-call\";\n toolCallId: string;\n toolName: string;\n input: string;\n }>;\n finishReason: \"tool-calls\";\n usage: { inputTokens: number; outputTokens: number; totalTokens: number };\n warnings: [];\n }>;\n doStream: (_options: unknown) => Promise<never>;\n};\n\ntype ToolTimeoutTestLLMClient = LLMClient & {\n model: ToolTimeoutTestModel;\n};\n\nfunction createToolTimeoutTestLlmClient(\n toolName: AgentToolNameWithTimeout,\n toolInput: Record<string, unknown>,\n): ToolTimeoutTestLLMClient {\n const usage = {\n prompt_tokens: 0,\n completion_tokens: 0,\n reasoning_tokens: 0,\n cached_input_tokens: 0,\n total_tokens: 0,\n };\n let generateCallCount = 0;\n\n const model: ToolTimeoutTestModel = {\n provider: \"mock\",\n modelId: \"mock/tool-timeout-test\",\n specificationVersion: \"v2\",\n supportedUrls: {},\n doGenerate: async () => {\n generateCallCount += 1;\n if (generateCallCount === 1) {\n return {\n content: [\n {\n type: \"tool-call\",\n toolCallId: \"tool-1\",\n toolName,\n input: JSON.stringify(toolInput),\n },\n ],\n finishReason: \"tool-calls\",\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n warnings: [],\n };\n }\n\n return {\n content: [\n {\n type: \"tool-call\",\n toolCallId: \"done-1\",\n toolName: \"done\",\n input: JSON.stringify({ reasoning: \"done\", taskComplete: true }),\n },\n ],\n finishReason: \"tool-calls\",\n usage: { inputTokens: 0, outputTokens: 0, totalTokens: 0 },\n warnings: [],\n };\n },\n doStream: async () => {\n throw new Error(\"doStream not implemented in timeout test model\");\n },\n };\n\n const llm = {\n type: \"openai\",\n modelName: \"openai/gpt-4.1-mini\",\n hasVision: false,\n clientOptions: {},\n model,\n getLanguageModel: () => model,\n generateText,\n createChatCompletion: async <T = unknown>(options: unknown): Promise<T> => {\n const responseModelName = (\n options as { options?: { response_model?: { name?: string } } }\n )?.options?.response_model?.name;\n\n if (responseModelName === \"act\") {\n return {\n data: {\n elementId: \"1-0\",\n description: \"click body\",\n method: \"click\",\n arguments: [],\n twoStep: false,\n },\n usage,\n } as T;\n }\n if (responseModelName === \"Observation\") {\n return { data: { elements: [] }, usage } as T;\n }\n if (responseModelName === \"Extraction\") {\n return { data: {}, usage } as T;\n }\n if (responseModelName === \"Metadata\") {\n return { data: { completed: true, progress: \"\" }, usage } as T;\n }\n return { data: {}, usage } as T;\n },\n };\n\n return llm as unknown as ToolTimeoutTestLLMClient;\n}\n\nfunction findToolOutput(\n stepEvents: Array<{\n toolCalls?: Array<{ toolName?: string }>;\n toolResults?: Array<{ output?: unknown }>;\n }>,\n toolName: string,\n) {\n for (const event of stepEvents) {\n if (!event.toolCalls || !event.toolResults) continue;\n const toolIndex = event.toolCalls.findIndex(\n (tc) => tc.toolName === toolName,\n );\n if (toolIndex !== -1) {\n return event.toolResults[toolIndex]?.output;\n }\n }\n return undefined;\n}\n\nasync function runAgentToolTimeoutScenario(\n toolName: AgentToolNameWithTimeout,\n toolInput: Record<string, unknown>,\n options?: { mode?: \"dom\" | \"hybrid\" },\n) {\n const llmClient = createToolTimeoutTestLlmClient(toolName, toolInput);\n const stepEvents: Array<{\n toolCalls?: Array<{ toolName?: string }>;\n toolResults?: Array<{ output?: unknown }>;\n }> = [];\n const v3 = new V3({\n ...v3DynamicTestConfig,\n experimental: true,\n llmClient,\n });\n await v3.init();\n try {\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n const agent = v3.agent({\n ...(options?.mode ? { mode: options.mode } : {}),\n });\n await agent.execute({\n instruction: `Use ${toolName} and then finish`,\n maxSteps: 2,\n toolTimeout: 1,\n callbacks: {\n onStepFinish: (event) => {\n stepEvents.push({\n toolCalls: event.toolCalls?.map((tc) => ({\n toolName: tc.toolName,\n })),\n toolResults: event.toolResults?.map((tr) => ({\n output: tr.output,\n })),\n });\n },\n },\n });\n const toolOutput = findToolOutput(stepEvents, toolName);\n if (!toolOutput) {\n throw new Error(`No tool output captured for ${toolName}`);\n }\n return { toolOutput };\n } finally {\n await closeV3(v3);\n }\n}\n\ntest.describe(\"V3 hard timeouts\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3DynamicTestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await closeV3(v3);\n });\n\n test(\"observe() enforces timeoutMs\", async () => {\n // Tiny timeout to force the race to hit the timeout branch\n await expect(v3.observe(\"find something\", { timeout: 5 })).rejects.toThrow(\n /timed out/i,\n );\n });\n\n test(\"extract() enforces timeoutMs\", async () => {\n const schema = z.object({ title: z.string().optional() });\n await expect(\n v3.extract(\"Extract title\", schema, { timeout: 5 }),\n ).rejects.toThrow(/timed out/i);\n });\n\n test(\"act() enforces timeoutMs\", async () => {\n await expect(v3.act(\"do nothing\", { timeout: 5 })).rejects.toThrow(\n /timed out/i,\n );\n });\n\n test(\"agent toolTimeout enforces timeout for act tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"act\", {\n action: \"click somewhere\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for extract tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"extract\", {\n instruction: \"extract the page title\",\n schema: { type: \"object\", properties: { title: { type: \"string\" } } },\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for fillForm tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"fillForm\", {\n fields: [{ action: \"type hello into name\", value: \"hello\" }],\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for ariaTree\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"ariaTree\", {});\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for goto tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"goto\", {\n url: \"https://example.com/slow\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for navback tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"navback\", {\n reasoningText: \"going back\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for screenshot tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"screenshot\", {});\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for scroll tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"scroll\", {\n direction: \"down\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for keys tool\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\"keys\", {\n method: \"press\",\n value: \"Enter\",\n });\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for click tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"click\",\n { describe: \"click element\", coordinates: [100, 100] },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for type tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"type\",\n {\n describe: \"type into field\",\n text: \"hello\",\n coordinates: [100, 100],\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for dragAndDrop tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"dragAndDrop\",\n {\n describe: \"drag element\",\n startCoordinates: [100, 100],\n endCoordinates: [200, 200],\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for clickAndHold tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"clickAndHold\",\n {\n describe: \"hold element\",\n coordinates: [100, 100],\n duration: 1000,\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n\n test(\"agent toolTimeout enforces timeout for fillFormVision tool (hybrid)\", async () => {\n const { toolOutput } = await runAgentToolTimeoutScenario(\n \"fillFormVision\",\n {\n fields: [\n {\n action: \"type hello into name\",\n value: \"hello\",\n coordinates: { x: 100, y: 100 },\n },\n {\n action: \"type world into email\",\n value: \"world\",\n coordinates: { x: 100, y: 200 },\n },\n ],\n },\n { mode: \"hybrid\" },\n );\n const output = toolOutput as { success: boolean; error: string };\n expect(output.success).toBe(false);\n expect(output.error).toContain(\"TimeoutError\");\n expect(output.error).toContain(\"1ms\");\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|