@browserbasehq/orca 3.2.0-preview.5 → 3.2.1-preview.1

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.
Files changed (176) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/lib/inference.js +29 -22
  3. package/dist/cjs/lib/inference.js.map +1 -1
  4. package/dist/cjs/lib/prompt.js +18 -21
  5. package/dist/cjs/lib/prompt.js.map +1 -1
  6. package/dist/cjs/lib/v3/agent/AgentProvider.js +1 -0
  7. package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
  8. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.d.ts +3 -1
  9. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +60 -9
  10. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  11. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js +15 -0
  12. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
  13. package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +8 -2
  14. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +103 -49
  15. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  16. package/dist/cjs/lib/v3/agent/tools/index.js +1 -1
  17. package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
  18. package/dist/cjs/lib/v3/agent/tools/keys.d.ts +2 -1
  19. package/dist/cjs/lib/v3/agent/tools/keys.js +57 -49
  20. package/dist/cjs/lib/v3/agent/tools/keys.js.map +1 -1
  21. package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js +3 -5
  22. package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
  23. package/dist/cjs/lib/v3/api.d.ts +5 -3
  24. package/dist/cjs/lib/v3/api.js +3 -6
  25. package/dist/cjs/lib/v3/api.js.map +1 -1
  26. package/dist/cjs/lib/v3/cache/AgentCache.js +5 -3
  27. package/dist/cjs/lib/v3/cache/AgentCache.js.map +1 -1
  28. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +6 -15
  29. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  30. package/dist/cjs/lib/v3/index.d.ts +1 -1
  31. package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +5 -2
  32. package/dist/cjs/lib/v3/llm/LLMProvider.js +14 -6
  33. package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
  34. package/dist/cjs/lib/v3/llm/OpenAIClient.js +1 -0
  35. package/dist/cjs/lib/v3/llm/OpenAIClient.js.map +1 -1
  36. package/dist/cjs/lib/v3/llm/aisdk.d.ts +3 -1
  37. package/dist/cjs/lib/v3/llm/aisdk.js +67 -17
  38. package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
  39. package/dist/cjs/lib/v3/types/public/agent.d.ts +8 -3
  40. package/dist/cjs/lib/v3/types/public/agent.js +1 -0
  41. package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
  42. package/dist/cjs/lib/v3/types/public/api.d.ts +30 -0
  43. package/dist/cjs/lib/v3/types/public/api.js +6 -2
  44. package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
  45. package/dist/cjs/lib/v3/types/public/model.d.ts +32 -2
  46. package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
  47. package/dist/cjs/lib/v3/understudy/context.js +11 -3
  48. package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
  49. package/dist/cjs/lib/v3/understudy/page.js +1 -1
  50. package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
  51. package/dist/cjs/lib/v3/v3.d.ts +18 -2
  52. package/dist/cjs/lib/v3/v3.js +92 -9
  53. package/dist/cjs/lib/v3/v3.js.map +1 -1
  54. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
  55. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js +56 -0
  56. package/dist/cjs/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
  57. package/dist/cjs/tests/integration/flowLogger.spec.js +12 -8
  58. package/dist/cjs/tests/integration/flowLogger.spec.js.map +1 -1
  59. package/dist/cjs/tests/integration/testUtils.js +1 -1
  60. package/dist/cjs/tests/integration/testUtils.js.map +1 -1
  61. package/dist/cjs/tests/integration/timeouts.spec.js +6 -4
  62. package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
  63. package/dist/cjs/tests/unit/agent-captcha-hooks.test.js +56 -0
  64. package/dist/cjs/tests/unit/agent-captcha-hooks.test.js.map +1 -1
  65. package/dist/cjs/tests/unit/agent-metrics.test.d.ts +1 -0
  66. package/dist/cjs/tests/unit/agent-metrics.test.js +112 -0
  67. package/dist/cjs/tests/unit/agent-metrics.test.js.map +1 -0
  68. package/dist/cjs/tests/unit/aisdk-clients.test.d.ts +1 -0
  69. package/dist/cjs/tests/unit/aisdk-clients.test.js +90 -0
  70. package/dist/cjs/tests/unit/aisdk-clients.test.js.map +1 -0
  71. package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.d.ts +1 -0
  72. package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.js +250 -0
  73. package/dist/cjs/tests/unit/anthropic-cua-adaptive-thinking.test.js.map +1 -0
  74. package/dist/cjs/tests/unit/api-optional-model-api-key.test.d.ts +1 -0
  75. package/dist/cjs/tests/unit/api-optional-model-api-key.test.js +95 -0
  76. package/dist/cjs/tests/unit/api-optional-model-api-key.test.js.map +1 -0
  77. package/dist/cjs/tests/unit/browserbase-session-accessors.test.js +20 -0
  78. package/dist/cjs/tests/unit/browserbase-session-accessors.test.js.map +1 -1
  79. package/dist/cjs/tests/unit/llm-middleware.test.d.ts +1 -0
  80. package/dist/cjs/tests/unit/llm-middleware.test.js +495 -0
  81. package/dist/cjs/tests/unit/llm-middleware.test.js.map +1 -0
  82. package/dist/cjs/tests/unit/microsoft-cua-client.test.d.ts +1 -0
  83. package/dist/cjs/tests/unit/microsoft-cua-client.test.js +86 -0
  84. package/dist/cjs/tests/unit/microsoft-cua-client.test.js.map +1 -0
  85. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js +1 -0
  86. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  87. package/dist/esm/lib/inference.js +29 -22
  88. package/dist/esm/lib/inference.js.map +1 -1
  89. package/dist/esm/lib/prompt.js +18 -21
  90. package/dist/esm/lib/prompt.js.map +1 -1
  91. package/dist/esm/lib/v3/agent/AgentProvider.js +1 -0
  92. package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
  93. package/dist/esm/lib/v3/agent/AnthropicCUAClient.d.ts +3 -1
  94. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +60 -9
  95. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  96. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js +15 -0
  97. package/dist/esm/lib/v3/agent/MicrosoftCUAClient.js.map +1 -1
  98. package/dist/esm/lib/v3/agent/OpenAICUAClient.d.ts +8 -2
  99. package/dist/esm/lib/v3/agent/OpenAICUAClient.js +103 -49
  100. package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  101. package/dist/esm/lib/v3/agent/tools/index.js +1 -1
  102. package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
  103. package/dist/esm/lib/v3/agent/tools/keys.d.ts +2 -1
  104. package/dist/esm/lib/v3/agent/tools/keys.js +57 -49
  105. package/dist/esm/lib/v3/agent/tools/keys.js.map +1 -1
  106. package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js +3 -5
  107. package/dist/esm/lib/v3/agent/utils/coordinateNormalization.js.map +1 -1
  108. package/dist/esm/lib/v3/api.d.ts +5 -3
  109. package/dist/esm/lib/v3/api.js +3 -6
  110. package/dist/esm/lib/v3/api.js.map +1 -1
  111. package/dist/esm/lib/v3/cache/AgentCache.js +5 -3
  112. package/dist/esm/lib/v3/cache/AgentCache.js.map +1 -1
  113. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +6 -15
  114. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  115. package/dist/esm/lib/v3/index.d.ts +1 -1
  116. package/dist/esm/lib/v3/llm/LLMProvider.d.ts +5 -2
  117. package/dist/esm/lib/v3/llm/LLMProvider.js +15 -7
  118. package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
  119. package/dist/esm/lib/v3/llm/OpenAIClient.js +1 -0
  120. package/dist/esm/lib/v3/llm/OpenAIClient.js.map +1 -1
  121. package/dist/esm/lib/v3/llm/aisdk.d.ts +3 -1
  122. package/dist/esm/lib/v3/llm/aisdk.js +67 -17
  123. package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
  124. package/dist/esm/lib/v3/types/public/agent.d.ts +8 -3
  125. package/dist/esm/lib/v3/types/public/agent.js +1 -0
  126. package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
  127. package/dist/esm/lib/v3/types/public/api.d.ts +30 -0
  128. package/dist/esm/lib/v3/types/public/api.js +6 -2
  129. package/dist/esm/lib/v3/types/public/api.js.map +1 -1
  130. package/dist/esm/lib/v3/types/public/model.d.ts +32 -2
  131. package/dist/esm/lib/v3/types/public/model.js.map +1 -1
  132. package/dist/esm/lib/v3/understudy/context.js +11 -3
  133. package/dist/esm/lib/v3/understudy/context.js.map +1 -1
  134. package/dist/esm/lib/v3/understudy/page.js +1 -1
  135. package/dist/esm/lib/v3/understudy/page.js.map +1 -1
  136. package/dist/esm/lib/v3/v3.d.ts +18 -2
  137. package/dist/esm/lib/v3/v3.js +92 -10
  138. package/dist/esm/lib/v3/v3.js.map +1 -1
  139. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.d.ts +1 -0
  140. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js +54 -0
  141. package/dist/esm/tests/integration/chrome-newtab-page-tracking.spec.js.map +1 -0
  142. package/dist/esm/tests/integration/flowLogger.spec.js +12 -8
  143. package/dist/esm/tests/integration/flowLogger.spec.js.map +1 -1
  144. package/dist/esm/tests/integration/testUtils.js +1 -1
  145. package/dist/esm/tests/integration/testUtils.js.map +1 -1
  146. package/dist/esm/tests/integration/timeouts.spec.js +6 -4
  147. package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
  148. package/dist/esm/tests/unit/agent-captcha-hooks.test.js +56 -0
  149. package/dist/esm/tests/unit/agent-captcha-hooks.test.js.map +1 -1
  150. package/dist/esm/tests/unit/agent-metrics.test.d.ts +1 -0
  151. package/dist/esm/tests/unit/agent-metrics.test.js +110 -0
  152. package/dist/esm/tests/unit/agent-metrics.test.js.map +1 -0
  153. package/dist/esm/tests/unit/aisdk-clients.test.d.ts +1 -0
  154. package/dist/esm/tests/unit/aisdk-clients.test.js +88 -0
  155. package/dist/esm/tests/unit/aisdk-clients.test.js.map +1 -0
  156. package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.d.ts +1 -0
  157. package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.js +245 -0
  158. package/dist/esm/tests/unit/anthropic-cua-adaptive-thinking.test.js.map +1 -0
  159. package/dist/esm/tests/unit/api-optional-model-api-key.test.d.ts +1 -0
  160. package/dist/esm/tests/unit/api-optional-model-api-key.test.js +93 -0
  161. package/dist/esm/tests/unit/api-optional-model-api-key.test.js.map +1 -0
  162. package/dist/esm/tests/unit/browserbase-session-accessors.test.js +20 -0
  163. package/dist/esm/tests/unit/browserbase-session-accessors.test.js.map +1 -1
  164. package/dist/esm/tests/unit/llm-middleware.test.d.ts +1 -0
  165. package/dist/esm/tests/unit/llm-middleware.test.js +460 -0
  166. package/dist/esm/tests/unit/llm-middleware.test.js.map +1 -0
  167. package/dist/esm/tests/unit/microsoft-cua-client.test.d.ts +1 -0
  168. package/dist/esm/tests/unit/microsoft-cua-client.test.js +84 -0
  169. package/dist/esm/tests/unit/microsoft-cua-client.test.js.map +1 -0
  170. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js +1 -0
  171. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  172. package/package.json +4 -8
  173. package/dist/cjs/lib/v3/dom/build/rerender-index.js +0 -1
  174. package/dist/cjs/lib/v3/dom/build/v3-index.js +0 -1
  175. package/dist/esm/lib/v3/dom/build/rerender-index.js +0 -1
  176. package/dist/esm/lib/v3/dom/build/v3-index.js +0 -1
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const test_1 = require("@playwright/test");
4
+ const v3_js_1 = require("../../lib/v3/v3.js");
5
+ const v3_dynamic_config_js_1 = require("./v3.dynamic.config.js");
6
+ const testUtils_js_1 = require("./testUtils.js");
7
+ test_1.test.describe("V3 chrome:// new-tab page tracking", () => {
8
+ let v3;
9
+ test_1.test.beforeEach(async () => {
10
+ v3 = new v3_js_1.V3(v3_dynamic_config_js_1.v3DynamicTestConfig);
11
+ await v3.init();
12
+ });
13
+ test_1.test.afterEach(async () => {
14
+ await (0, testUtils_js_1.closeV3)(v3);
15
+ });
16
+ (0, test_1.test)("pages() includes a tab opened via chrome://newtab/", async () => {
17
+ const ctx = v3.context;
18
+ const initialPages = ctx.pages();
19
+ (0, test_1.expect)(initialPages.length).toBe(1);
20
+ // Simulate a manually-opened tab by creating a target at chrome://newtab/.
21
+ // This is the same CDP path the browser takes when the user presses Ctrl+T.
22
+ const { targetId } = await ctx.conn.send("Target.createTarget", { url: "chrome://newtab/" });
23
+ // Wait for the page to be registered (onAttachedToTarget is async).
24
+ const deadline = Date.now() + 5000;
25
+ while (Date.now() < deadline) {
26
+ if (ctx.pages().length >= 2)
27
+ break;
28
+ await new Promise((r) => setTimeout(r, 50));
29
+ }
30
+ const pages = ctx.pages();
31
+ (0, test_1.expect)(pages.length).toBe(2);
32
+ // The new page's target should match the one we created.
33
+ const newPage = pages.find((p) => p.targetId() === targetId);
34
+ (0, test_1.expect)(newPage).toBeTruthy();
35
+ });
36
+ (0, test_1.test)("chrome://newtab/ tab becomes usable after navigating to a web URL", async () => {
37
+ const ctx = v3.context;
38
+ // Create a tab at chrome://newtab/ (same as user pressing Ctrl+T).
39
+ const { targetId } = await ctx.conn.send("Target.createTarget", { url: "chrome://newtab/" });
40
+ // Wait for registration.
41
+ const deadline = Date.now() + 5000;
42
+ while (Date.now() < deadline) {
43
+ if (ctx.pages().some((p) => p.targetId() === targetId))
44
+ break;
45
+ await new Promise((r) => setTimeout(r, 50));
46
+ }
47
+ const newPage = ctx.pages().find((p) => p.targetId() === targetId);
48
+ (0, test_1.expect)(newPage).toBeTruthy();
49
+ // Navigate the new tab to a real web page.
50
+ await newPage.goto("https://example.com/", {
51
+ waitUntil: "domcontentloaded",
52
+ });
53
+ (0, test_1.expect)(newPage.url()).toContain("example.com");
54
+ });
55
+ });
56
+ //# sourceMappingURL=chrome-newtab-page-tracking.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chrome-newtab-page-tracking.spec.js","sourceRoot":"","sources":["../../../../tests/integration/chrome-newtab-page-tracking.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 { closeV3 } from \"./testUtils.js\";\n\ntest.describe(\"V3 chrome:// new-tab page tracking\", () => {\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(\"pages() includes a tab opened via chrome://newtab/\", async () => {\n const ctx = v3.context;\n const initialPages = ctx.pages();\n expect(initialPages.length).toBe(1);\n\n // Simulate a manually-opened tab by creating a target at chrome://newtab/.\n // This is the same CDP path the browser takes when the user presses Ctrl+T.\n const { targetId } = await ctx.conn.send<{ targetId: string }>(\n \"Target.createTarget\",\n { url: \"chrome://newtab/\" },\n );\n\n // Wait for the page to be registered (onAttachedToTarget is async).\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n if (ctx.pages().length >= 2) break;\n await new Promise((r) => setTimeout(r, 50));\n }\n\n const pages = ctx.pages();\n expect(pages.length).toBe(2);\n\n // The new page's target should match the one we created.\n const newPage = pages.find((p) => p.targetId() === targetId);\n expect(newPage).toBeTruthy();\n });\n\n test(\"chrome://newtab/ tab becomes usable after navigating to a web URL\", async () => {\n const ctx = v3.context;\n\n // Create a tab at chrome://newtab/ (same as user pressing Ctrl+T).\n const { targetId } = await ctx.conn.send<{ targetId: string }>(\n \"Target.createTarget\",\n { url: \"chrome://newtab/\" },\n );\n\n // Wait for registration.\n const deadline = Date.now() + 5000;\n while (Date.now() < deadline) {\n if (ctx.pages().some((p) => p.targetId() === targetId)) break;\n await new Promise((r) => setTimeout(r, 50));\n }\n\n const newPage = ctx.pages().find((p) => p.targetId() === targetId);\n expect(newPage).toBeTruthy();\n\n // Navigate the new tab to a real web page.\n await newPage!.goto(\"https://example.com/\", {\n waitUntil: \"domcontentloaded\",\n });\n\n expect(newPage!.url()).toContain(\"example.com\");\n });\n});\n"]}
@@ -134,10 +134,12 @@ test_1.test.describe("flow logger integration", () => {
134
134
  const llmClient = (0, testUtils_js_1.createScriptedAisdkTestLlmClient)({
135
135
  jsonResponses: {
136
136
  act: (options) => ({
137
- elementId: (0, testUtils_js_1.findLastEncodedId)(options),
138
- description: `click ${buttonText}`,
139
- method: "click",
140
- arguments: [],
137
+ action: {
138
+ elementId: (0, testUtils_js_1.findLastEncodedId)(options),
139
+ description: `click ${buttonText}`,
140
+ method: "click",
141
+ arguments: [],
142
+ },
141
143
  twoStep: false,
142
144
  }),
143
145
  },
@@ -298,10 +300,12 @@ test_1.test.describe("flow logger integration", () => {
298
300
  const llmClient = (0, testUtils_js_1.createScriptedAisdkTestLlmClient)({
299
301
  jsonResponses: {
300
302
  act: (options) => ({
301
- elementId: (0, testUtils_js_1.findLastEncodedId)(options),
302
- description: `click ${buttonText}`,
303
- method: "click",
304
- arguments: [],
303
+ action: {
304
+ elementId: (0, testUtils_js_1.findLastEncodedId)(options),
305
+ description: `click ${buttonText}`,
306
+ method: "click",
307
+ arguments: [],
308
+ },
305
309
  twoStep: false,
306
310
  }),
307
311
  },
@@ -1 +1 @@
1
- {"version":3,"file":"flowLogger.spec.js","sourceRoot":"","sources":["../../../../tests/integration/flowLogger.spec.ts"],"names":[],"mappings":"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","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
+ {"version":3,"file":"flowLogger.spec.js","sourceRoot":"","sources":["../../../../tests/integration/flowLogger.spec.ts"],"names":[],"mappings":";;AAAA,2CAAgD;AAChD,6BAAwB;AACxB,uEAAyE;AACzE,yEAAkE;AAClE,8FAAgG;AAChG,8CAAwC;AACxC,iDAMwB;AACxB,iDAAiD;AAEjD,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,kBAAkB,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,0BAA0B,CACjC,YAAmD,EAAE;IAErD,MAAM,EAAE,GAAG,IAAI,UAAE,CAAC,IAAA,8BAAe,EAAC,SAAS,CAAC,CAAC,CAAC;IAC9C,MAAM,IAAI,GAAG,IAAI,gCAAiB,EAAE,CAAC;IACrC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAc,EAAE,EAAE;QAChC,IAAI,KAAK,YAAY,yBAAS,EAAE,CAAC;YAC/B,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,EAAE,CAC9B,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;IAC/D,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,EAAM;IAC1C,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,KAAK,UAAU,wBAAwB,CAAC,EAAM;IAC5C,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAChD,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,EAAM,EACN,QAAqB;IAErB,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,YAAY,CAAC,MAAmB,EAAE,SAAiB;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,kBAAkB,CAAC,MAAmB,EAAE,SAAiB;IAChE,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChD,IAAA,aAAM,EAAC,OAAO,EAAE,qBAAqB,SAAS,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CAAC,KAAgB;IACvC,IAAA,aAAM,EAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAgB,EAAE,MAAiB;IAC7D,IAAA,aAAM,EAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;QACnC,GAAG,MAAM,CAAC,cAAc;QACxB,MAAM,CAAC,OAAO;KACf,CAAC,CAAC;AACL,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAmB;IACpD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAE/D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,cAAc,EAAE,CAAC;YAC5C,IAAA,aAAM,EACJ,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EACtB,GAAG,KAAK,CAAC,SAAS,8BAA8B,QAAQ,EAAE,CAC3D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAmB,EAAE,SAAiB;IAC9D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAA,aAAM,EAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,MAAmB,EACnB,MAAiB,EACjB,SAAiB;IAEjB,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,SAAS,KAAK,SAAS;QAC7B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CACtC,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAAmB,EACnB,SAAiB,EACjB,kBAAkB,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,gBAAgB;IAEvE,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACjE,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAmB;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAC7B,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,SAAS,KAAK,iBAAiB;QACrC,KAAK,CAAC,SAAS,KAAK,kBAAkB,CACzC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAEpE,IAAA,aAAM,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAA,aAAM,EACJ,KAAK,CAAC,cAAc,CAAC,MAAM,EAC3B,GAAG,KAAK,CAAC,SAAS,cAAc,CACjC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,IAAA,aAAM,EACJ,UAAU,EACV,GAAG,KAAK,CAAC,SAAS,yBAAyB,CAC5C,CAAC,WAAW,EAAE,CAAC;QAChB,IAAA,aAAM,EAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAAC,MAAmB;IACpD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAEpE,IAAA,aAAM,EAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAE5C,KAAK,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;QAC9B,IAAA,aAAM,EACJ,KAAK,CAAC,cAAc,CAAC,MAAM,EAC3B,GAAG,KAAK,CAAC,SAAS,cAAc,CACjC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACrB,MAAM,YAAY,GAAG,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,UAAU,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACrE,IAAA,aAAM,EACJ,UAAU,EACV,GAAG,KAAK,CAAC,SAAS,yBAAyB,CAC5C,CAAC,WAAW,EAAE,CAAC;QAEhB,IAAI,KAAK,CAAC,SAAS,KAAK,cAAc,EAAE,CAAC;YACvC,IAAA,aAAM,EAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,IAAA,aAAM,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAChC,MAAmB,EACnB,SAAiB;IAEjB,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,CAAC,kBAAkB,EAAE,uBAAuB,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CACrC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CACxC,CAAC;IAEF,IAAA,aAAM,EAAC,QAAQ,EAAE,sCAAsC,CAAC,CAAC,WAAW,EAAE,CAAC;IACvE,gBAAgB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,IAAA,aAAM,EAAC,QAAQ,EAAE,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,eAAe,CACtB,KAA6B;IAE7B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAC3E,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAAmB,EACnB,QAAgC;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAyB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QACrE,IAAI,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YACtC,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAA,aAAM,EAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,WAAI,CAAC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IAC5C,WAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE5C,IAAA,WAAI,EAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,UAAU,GAAG,wBAAwB,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAA,+CAAgC,EAAC;YACjD,aAAa,EAAE;gBACb,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACjB,MAAM,EAAE;wBACN,SAAS,EAAE,IAAA,gCAAiB,EAAC,OAAO,CAAC;wBACrC,WAAW,EAAE,SAAS,UAAU,EAAE;wBAClC,MAAM,EAAE,OAAO;wBACf,SAAS,EAAE,EAAE;qBACd;oBACD,OAAO,EAAE,KAAK;iBACf,CAAC;aACH;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,0BAA0B,CAAC;YACpC,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,CACb,UAAU,CAAC;;;;;;;;kBAQD,UAAU;;;;SAInB,CAAC,CACH,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE/D,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,IAAA,aAAM,EACJ,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAC/D,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACf,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAC7D,MAAM,SAAS,GAAG,kBAAkB,CAClC,MAAM,EACN,4BAA4B,CAC7B,CAAC;YACF,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YACjE,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;YACnE,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;YACtE,MAAM,mBAAmB,GAAG,kBAAkB,CAC5C,MAAM,EACN,+BAA+B,CAChC,CAAC;YAEF,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,6BAA6B,EAAE,CAAC;gBAChC,oBAAoB,EAAE,CAAC;aACxB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;YACpC,IAAA,aAAM,EAAC,UAAU,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1D,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3D,IAAA,aAAM,EAAC,UAAU,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1D,kBAAkB,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YACpD,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,WAAW,GAAG,4BAA4B,CAAC;QACjD,MAAM,YAAY,GAAG,2BAA2B,CAAC;QACjD,MAAM,SAAS,GAAG,IAAA,+CAAgC,EAAC;YACjD,aAAa,EAAE;gBACb,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACzB,QAAQ,EAAE;wBACR;4BACE,SAAS,EAAE,IAAA,gCAAiB,EAAC,OAAO,CAAC;4BACrC,WAAW,EAAE,WAAW;4BACxB,MAAM,EAAE,OAAO;4BACf,SAAS,EAAE,EAAE;yBACd;qBACF;iBACF,CAAC;gBACF,UAAU,EAAE;oBACV,KAAK,EAAE,YAAY;iBACpB;gBACD,QAAQ,EAAE;oBACR,SAAS,EAAE,IAAI;oBACf,QAAQ,EAAE,MAAM;iBACjB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,0BAA0B,CAAC;YACpC,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,CACb,UAAU,CAAC;;;;4CAIyB,WAAW;oBACnC,YAAY;;;SAGvB,CAAC,CACH,CAAC;YAEF,MAAM,eAAe,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,WAAW,EAAE,CAAC,CAAC;YAElE,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACtC,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE9C,MAAM,aAAa,GAAG,MAAM,2BAA2B,CACrD,EAAE,EACF,eAAe,CAChB,CAAC;YACF,MAAM,WAAW,GAAG,kBAAkB,CACpC,aAAa,EACb,uBAAuB,CACxB,CAAC;YACF,MAAM,gBAAgB,GAAG,kBAAkB,CACzC,aAAa,EACb,gCAAgC,CACjC,CAAC;YACF,MAAM,kBAAkB,GAAG,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;YAC1E,MAAM,mBAAmB,GAAG,YAAY,CACtC,aAAa,EACb,kBAAkB,CACnB,CAAC;YAEF,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACzC,uBAAuB,CAAC,aAAa,EAAE;gBACrC,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,8BAA8B,EAAE,CAAC;gBACjC,qBAAqB,EAAE,CAAC;aACzB,CAAC,CAAC;YACH,gBAAgB,CAAC,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAChE,eAAe,CAAC,WAAW,CAAC,CAAC;YAC7B,kBAAkB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;gBACnD,WAAW,CAAC,OAAO;aACpB,CAAC,CAAC;YACH,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC;gBACpD,WAAW,CAAC,OAAO;aACpB,CAAC,CAAC;YACH,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACzC,yBAAyB,CAAC,aAAa,CAAC,CAAC;YAEzC,MAAM,eAAe,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAG,MAAM,EAAE,CAAC,OAAO,CACpC,mBAAmB,EACnB,OAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAChC,CAAC;YAEF,IAAA,aAAM,EAAC,aAAa,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;YAEvD,MAAM,aAAa,GAAG,MAAM,2BAA2B,CACrD,EAAE,EACF,eAAe,CAChB,CAAC;YACF,MAAM,WAAW,GAAG,kBAAkB,CACpC,aAAa,EACb,uBAAuB,CACxB,CAAC;YACF,MAAM,gBAAgB,GAAG,kBAAkB,CACzC,aAAa,EACb,gCAAgC,CACjC,CAAC;YACF,MAAM,kBAAkB,GAAG,YAAY,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;YAC1E,MAAM,mBAAmB,GAAG,YAAY,CACtC,aAAa,EACb,kBAAkB,CACnB,CAAC;YAEF,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACzC,uBAAuB,CAAC,aAAa,EAAE;gBACrC,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,8BAA8B,EAAE,CAAC;gBACjC,qBAAqB,EAAE,CAAC;aACzB,CAAC,CAAC;YACH,gBAAgB,CAAC,aAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAChE,eAAe,CAAC,WAAW,CAAC,CAAC;YAC7B,kBAAkB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAA,aAAM,EAAC,mBAAmB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAE5C,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,kBAAkB,EAAE,GAAG,mBAAmB,CAAC,EAAE,CAAC;gBACpE,IAAA,aAAM,EAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9D,CAAC;YAED,yBAAyB,CAAC,aAAa,CAAC,CAAC;YACzC,yBAAyB,CAAC,aAAa,CAAC,CAAC;QAC3C,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;QAC/G,MAAM,UAAU,GAAG,kBAAkB,CAAC;QACtC,MAAM,SAAS,GAAG,IAAA,+CAAgC,EAAC;YACjD,aAAa,EAAE;gBACb,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACjB,MAAM,EAAE;wBACN,SAAS,EAAE,IAAA,gCAAiB,EAAC,OAAO,CAAC;wBACrC,WAAW,EAAE,SAAS,UAAU,EAAE;wBAClC,MAAM,EAAE,OAAO;wBACf,SAAS,EAAE,EAAE;qBACd;oBACD,OAAO,EAAE,KAAK;iBACf,CAAC;aACH;YACD,iBAAiB,EAAE;gBACjB,IAAA,+BAAgB,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,aAAa,UAAU,EAAE,EAAE,EAAE,OAAO,CAAC;gBACvE,IAAA,+BAAgB,EAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC;aAC7C;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,0BAA0B,CAAC;YACpC,YAAY,EAAE,IAAI;YAClB,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,CACb,UAAU,CAAC;;;;;;;;kBAQD,UAAU;;;;SAInB,CAAC,CACH,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC;gBACtC,WAAW,EAAE,aAAa,UAAU,cAAc;gBAClD,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE/D,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,IAAA,aAAM,EACJ,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAChE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACf,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,kBAAkB,CACrC,MAAM,EACN,4BAA4B,CAC7B,CAAC;YACF,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;YACtE,MAAM,mBAAmB,GAAG,kBAAkB,CAC5C,MAAM,EACN,+BAA+B,CAChC,CAAC;YAEF,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,6BAA6B,EAAE,CAAC;gBAChC,oBAAoB,EAAE,CAAC;aACxB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAA,aAAM,EAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5D,kBAAkB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC1C,kBAAkB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACxC,kBAAkB,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;YACpD,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAC3D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAC5D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,CACzD,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAC1D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,qGAAqG,EAAE,KAAK,IAAI,EAAE;QACrH,MAAM,SAAS,GAAG,IAAA,+CAAgC,EAAC;YACjD,aAAa,EAAE;gBACb,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBACzB,QAAQ,EAAE;wBACR;4BACE,SAAS,EAAE,IAAA,gCAAiB,EAAC,OAAO,CAAC;4BACrC,WAAW,EAAE,YAAY;4BACzB,MAAM,EAAE,MAAM;4BACd,SAAS,EAAE,CAAC,OAAO,CAAC;yBACrB;qBACF;iBACF,CAAC;aACH;YACD,iBAAiB,EAAE;gBACjB,IAAA,+BAAgB,EACd,UAAU,EACV;oBACE,MAAM,EAAE;wBACN;4BACE,MAAM,EAAE,gCAAgC;4BACxC,KAAK,EAAE,OAAO;yBACf;qBACF;iBACF,EACD,YAAY,CACb;gBACD,IAAA,+BAAgB,EAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC;aAC7C;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,0BAA0B,CAAC;YACpC,YAAY,EAAE,IAAI;YAClB,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,CACb,UAAU,CAAC;;;;;;;SAOV,CAAC,CACH,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC;gBACtC,WAAW,EAAE,2BAA2B;gBACxC,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAE/D,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,IAAA,aAAM,EAAC,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAE/D,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YACvE,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;YACxE,MAAM,gBAAgB,GAAG,kBAAkB,CACzC,MAAM,EACN,gCAAgC,CACjC,CAAC;YACF,MAAM,OAAO,GAAG,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAChE,MAAM,YAAY,GAAG,kBAAkB,CACrC,MAAM,EACN,4BAA4B,CAC7B,CAAC;YACF,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;YACzE,MAAM,uBAAuB,GAAG,kBAAkB,CAChD,MAAM,EACN,8BAA8B,CAC/B,CAAC;YAEF,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,8BAA8B,EAAE,CAAC;gBACjC,qBAAqB,EAAE,CAAC;gBACxB,4BAA4B,EAAE,CAAC;gBAC/B,mBAAmB,EAAE,CAAC;aACvB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAChE,kBAAkB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAClD,IAAA,aAAM,EAAC,OAAO,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5D,kBAAkB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC1C,kBAAkB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;YAC5C,kBAAkB,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAC;YAC5D,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAC7D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAC9D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAC3D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAC5D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,CACzD,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAC1D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACnG,MAAM,YAAY,GAAG,qBAAqB,CAAC;QAC3C,MAAM,SAAS,GAAG,IAAA,+CAAgC,EAAC;YACjD,aAAa,EAAE;gBACb,UAAU,EAAE;oBACV,KAAK,EAAE,YAAY;iBACpB;gBACD,QAAQ,EAAE;oBACR,SAAS,EAAE,IAAI;oBACf,QAAQ,EAAE,MAAM;iBACjB;aACF;YACD,iBAAiB,EAAE;gBACjB,IAAA,+BAAgB,EACd,SAAS,EACT;oBACE,WAAW,EAAE,mBAAmB;oBAChC,MAAM,EAAE;wBACN,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBAC1B;qBACF;iBACF,EACD,WAAW,CACZ;gBACD,IAAA,+BAAgB,EAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC;aAC7C;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,0BAA0B,CAAC;YACpC,YAAY,EAAE,IAAI;YAClB,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,CACb,UAAU,CAAC;;;;oBAIC,YAAY;;;SAGvB,CAAC,CACH,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YACpD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC;gBACtC,WAAW,EAAE,+BAA+B;gBAC5C,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAElC,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC/D,MAAM,SAAS,GAAG,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YACvE,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;YACxE,MAAM,gBAAgB,GAAG,kBAAkB,CACzC,MAAM,EACN,gCAAgC,CACjC,CAAC;YAEF,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,8BAA8B,EAAE,CAAC;gBACjC,qBAAqB,EAAE,CAAC;aACzB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAA,aAAM,EAAC,WAAW,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAChE,kBAAkB,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;YAClD,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAC3D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,kBAAkB,CAAC,CAC5D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAC7D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,IAAA,aAAM,EACJ,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAC9D,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAClB,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,4FAA4F,EAAE,KAAK,IAAI,EAAE;QAC5G,MAAM,YAAY,GAAG,UAAU,CAAC;;;;;;;KAO/B,CAAC,CAAC;QACH,MAAM,cAAc,GAAG,IAAA,+CAAgC,EAAC;YACtD,iBAAiB,EAAE;gBACjB,IAAA,+BAAgB,EAAC,MAAM,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,QAAQ,CAAC;gBACzD,IAAA,+BAAgB,EAAC,YAAY,EAAE,EAAE,EAAE,cAAc,CAAC;gBAClD,IAAA,+BAAgB,EAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC;aAC7C;SACF,CAAC,CAAC;QAEH,MAAM,OAAO,GAAG,0BAA0B,CAAC;YACzC,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAC;QAEH,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;QAErB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,OAAO,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC;gBAC3C,WAAW,EAAE,qDAAqD;gBAClE,QAAQ,EAAE,CAAC;aACZ,CAAC,CAAC;YAEH,IAAA,aAAM,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,IAAA,aAAM,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEpC,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAClE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YAC7D,MAAM,iBAAiB,GAAG,kBAAkB,CAC1C,MAAM,EACN,wBAAwB,CACzB,CAAC;YACF,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;YACzE,MAAM,uBAAuB,GAAG,kBAAkB,CAChD,MAAM,EACN,8BAA8B,CAC/B,CAAC;YACF,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAC5D,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;YAE9D,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,gBAAgB,EAAE,CAAC;gBACnB,sBAAsB,EAAE,CAAC;gBACzB,aAAa,EAAE,CAAC;gBAChB,4BAA4B,EAAE,CAAC;gBAC/B,mBAAmB,EAAE,CAAC;aACvB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC9D,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,IAAA,aAAM,EAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACxD,kBAAkB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAChD,IAAA,aAAM,EAAC,cAAc,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAC9D,kBAAkB,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAC;YAC5D,IAAA,aAAM,EAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpC,IAAA,aAAM,EAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAErC,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,GAAG,YAAY,CAAC,EAAE,CAAC;gBACtD,IAAA,aAAM,EAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YACvD,CAAC;YAED,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAED,MAAM,QAAQ,GAAG,0BAA0B,EAAE,CAAC;QAC9C,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,QAAQ,GAAG,MAAM,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YAE1D,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9B,MAAM,IAAI,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAE3C,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACrE,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YAC7D,MAAM,iBAAiB,GAAG,kBAAkB,CAC1C,MAAM,EACN,wBAAwB,CACzB,CAAC;YACF,MAAM,cAAc,GAAG,kBAAkB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;YACzE,MAAM,uBAAuB,GAAG,kBAAkB,CAChD,MAAM,EACN,8BAA8B,CAC/B,CAAC;YAEF,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,sBAAsB,EAAE,CAAC;gBACzB,aAAa,EAAE,CAAC;gBAChB,4BAA4B,EAAE,CAAC;gBAC/B,mBAAmB,EAAE,CAAC;aACvB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC/D,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC1B,kBAAkB,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;YAChD,eAAe,CAAC,cAAc,CAAC,CAAC;YAChC,kBAAkB,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAC;YAC5D,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjE,yBAAyB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,QAAQ,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAA,WAAI,EAAC,iHAAiH,EAAE,KAAK,IAAI,EAAE;QACjI,MAAM,EAAE,GAAG,0BAA0B,EAAE,CAAC;QACxC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,IAAI,CACb,UAAU,CAAC;;;;;;;;;;;;;SAaV,CAAC,CACH,CAAC;YAEF,IAAI,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,WAAW,CAAC,CAAC;YACzE,IAAI,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YAC7D,IAAI,IAAI,GAAG,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAChE,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;aACrB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjE,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAElC,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACzD,IAAI,GAAG,uBAAuB,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAC5D,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,0BAA0B,EAAE,CAAC;gBAC7B,iBAAiB,EAAE,CAAC;aACrB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjE,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAElC,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAA,4CAAuB,EAC3B,IAAI,EACJ,IAAI,CAAC,SAAS,EAAE,EAChB,OAAO,EACP,mBAAmB,EACnB,EAAE,EACF,MAAM,CACP,CAAC;YACF,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACzD,IAAI,GAAG,uBAAuB,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;YAC/D,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,uBAAuB,CAAC,MAAM,EAAE;gBAC9B,6BAA6B,EAAE,CAAC;gBAChC,oBAAoB,EAAE,CAAC;aACxB,CAAC,CAAC;YACH,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACzD,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjE,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,IAAA,aAAM,EACJ,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CACnE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEf,QAAQ,GAAG,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,OAAO,CAEjC,kBAAkB,EAAE;gBACrB,UAAU,EAAE,OAAO;gBACnB,aAAa,EAAE,IAAI;aACpB,CAAC,CAAC;YACH,MAAM,GAAG,MAAM,2BAA2B,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;YACzD,IAAA,aAAM,EAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxC,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAChE,IAAA,aAAM,EAAC,YAAY,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjE,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAClC,yBAAyB,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;QACpE,CAAC;gBAAS,CAAC;YACT,MAAM,IAAA,sBAAO,EAAC,EAAE,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { expect, test } from \"@playwright/test\";\nimport { z } from \"zod\";\nimport { InMemoryEventSink } from \"../../lib/v3/flowlogger/EventSink.js\";\nimport { FlowEvent } from \"../../lib/v3/flowlogger/FlowLogger.js\";\nimport { performUnderstudyMethod } from \"../../lib/v3/handlers/handlerUtils/actHandlerUtils.js\";\nimport { V3 } from \"../../lib/v3/v3.js\";\nimport {\n createScriptedAisdkTestLlmClient,\n closeV3,\n doneToolResponse,\n findLastEncodedId,\n toolCallResponse,\n} from \"./testUtils.js\";\nimport { getV3TestConfig } from \"./v3.config.js\";\n\nfunction encodeHtml(html: string): string {\n return `data:text/html,${encodeURIComponent(html)}`;\n}\n\nfunction createRecordedFlowLoggerV3(\n overrides: Parameters<typeof getV3TestConfig>[0] = {},\n): V3 {\n const v3 = new V3(getV3TestConfig(overrides));\n const sink = new InMemoryEventSink();\n v3.bus.on(\"*\", (event: unknown) => {\n if (event instanceof FlowEvent) {\n void sink.emit(event);\n }\n });\n v3.eventStore.query = (query) =>\n sink.query({ ...query, sessionId: v3.eventStore.sessionId });\n return v3;\n}\n\nasync function listRecordedFlowEvents(v3: V3): Promise<FlowEvent[]> {\n return v3.eventStore.query({});\n}\n\nasync function captureFlowEventBaseline(v3: V3): Promise<Set<string>> {\n const events = await listRecordedFlowEvents(v3);\n return new Set(events.map((event) => event.eventId));\n}\n\nasync function listRecordedFlowEventsSince(\n v3: V3,\n baseline: Set<string>,\n): Promise<FlowEvent[]> {\n const events = await listRecordedFlowEvents(v3);\n return events.filter((event) => !baseline.has(event.eventId));\n}\n\nfunction eventsOfType(events: FlowEvent[], eventType: string): FlowEvent[] {\n return events.filter((event) => event.eventType === eventType);\n}\n\nfunction requireSingleEvent(events: FlowEvent[], eventType: string): FlowEvent {\n const matches = eventsOfType(events, eventType);\n expect(matches, `expected a single ${eventType}`).toHaveLength(1);\n return matches[0];\n}\n\nfunction expectRootEvent(event: FlowEvent): void {\n expect(event.eventParentIds).toEqual([]);\n}\n\nfunction expectDirectParent(child: FlowEvent, parent: FlowEvent): void {\n expect(child.eventParentIds).toEqual([\n ...parent.eventParentIds,\n parent.eventId,\n ]);\n}\n\nfunction assertAllParentIdsResolve(events: FlowEvent[]): void {\n const eventIds = new Set(events.map((event) => event.eventId));\n\n for (const event of events) {\n for (const parentId of event.eventParentIds) {\n expect(\n eventIds.has(parentId),\n `${event.eventType} references missing parent ${parentId}`,\n ).toBe(true);\n }\n }\n}\n\nfunction assertSessionIds(events: FlowEvent[], sessionId: string): void {\n for (const event of events) {\n expect(event.sessionId).toBe(sessionId);\n }\n}\n\nfunction directChildrenOfType(\n events: FlowEvent[],\n parent: FlowEvent,\n eventType: string,\n): FlowEvent[] {\n const expectedParentIds = [...parent.eventParentIds, parent.eventId];\n return events.filter(\n (event) =>\n event.eventType === eventType &&\n JSON.stringify(event.eventParentIds) ===\n JSON.stringify(expectedParentIds),\n );\n}\n\nfunction assertCompletedEnvelope(\n events: FlowEvent[],\n eventType: string,\n completedEventType = `${eventType.replace(/Event$/, \"\")}CompletedEvent`,\n): FlowEvent {\n const root = requireSingleEvent(events, eventType);\n const completed = requireSingleEvent(events, completedEventType);\n expectDirectParent(completed, root);\n return root;\n}\n\nfunction assertNoFloatingLlmEvents(events: FlowEvent[]): void {\n const llmEvents = events.filter(\n (event) =>\n event.eventType === \"LlmRequestEvent\" ||\n event.eventType === \"LlmResponseEvent\",\n );\n const byId = new Map(events.map((event) => [event.eventId, event]));\n\n expect(llmEvents.length).toBeGreaterThan(0);\n\n for (const event of llmEvents) {\n expect(\n event.eventParentIds.length,\n `${event.eventType} is floating`,\n ).toBeGreaterThan(0);\n const lastParentId = event.eventParentIds.at(-1);\n const lastParent = lastParentId ? byId.get(lastParentId) : undefined;\n expect(\n lastParent,\n `${event.eventType} has no resolved parent`,\n ).toBeDefined();\n expect(lastParent?.eventType.startsWith(\"Llm\")).toBe(false);\n }\n}\n\nfunction assertNoFloatingCdpEvents(events: FlowEvent[]): void {\n const cdpEvents = events.filter((event) => event.eventType.startsWith(\"Cdp\"));\n const byId = new Map(events.map((event) => [event.eventId, event]));\n\n expect(cdpEvents.length).toBeGreaterThan(0);\n\n for (const event of cdpEvents) {\n expect(\n event.eventParentIds.length,\n `${event.eventType} is floating`,\n ).toBeGreaterThan(0);\n const lastParentId = event.eventParentIds.at(-1);\n const lastParent = lastParentId ? byId.get(lastParentId) : undefined;\n expect(\n lastParent,\n `${event.eventType} has no resolved parent`,\n ).toBeDefined();\n\n if (event.eventType === \"CdpCallEvent\") {\n expect(lastParent?.eventType.startsWith(\"Cdp\")).toBe(false);\n } else {\n expect(lastParent?.eventType).toBe(\"CdpCallEvent\");\n }\n }\n}\n\nfunction assertDirectRootCdpEvents(\n events: FlowEvent[],\n sessionId: string,\n): void {\n const call = requireSingleEvent(events, \"CdpCallEvent\");\n const responseTypes = [\"CdpResponseEvent\", \"CdpResponseErrorEvent\"];\n const response = events.find((event) =>\n responseTypes.includes(event.eventType),\n );\n\n expect(response, \"expected a direct CDP response event\").toBeDefined();\n assertSessionIds(events, sessionId);\n expectRootEvent(call);\n expect(response?.eventParentIds).toEqual([call.eventId]);\n}\n\nfunction sortCountRecord(\n input: Record<string, number>,\n): Record<string, number> {\n return Object.fromEntries(\n Object.entries(input).sort(([left], [right]) => left.localeCompare(right)),\n );\n}\n\nfunction assertNonCdpEventCounts(\n events: FlowEvent[],\n expected: Record<string, number>,\n): void {\n const actual = events.reduce<Record<string, number>>((counts, event) => {\n if (event.eventType.startsWith(\"Cdp\")) {\n return counts;\n }\n\n counts[event.eventType] = (counts[event.eventType] ?? 0) + 1;\n return counts;\n }, {});\n\n expect(sortCountRecord(actual)).toEqual(sortCountRecord(expected));\n}\n\ntest.describe(\"flow logger integration\", () => {\n test.describe.configure({ mode: \"serial\" });\n\n test(\"act emits a rooted tree with nested understudy, llm, and cdp events\", async () => {\n const buttonText = \"Flow Logger Act Button\";\n const llmClient = createScriptedAisdkTestLlmClient({\n jsonResponses: {\n act: (options) => ({\n action: {\n elementId: findLastEncodedId(options),\n description: `click ${buttonText}`,\n method: \"click\",\n arguments: [],\n },\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 action: {\n elementId: findLastEncodedId(options),\n description: `click ${buttonText}`,\n method: \"click\",\n arguments: [],\n },\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"]}
@@ -75,7 +75,7 @@ function resolveJsonResponseKey(options) {
75
75
  }
76
76
  const schema = responseFormat.schema;
77
77
  const properties = schema?.properties ?? {};
78
- if ("elementId" in properties && "twoStep" in properties) {
78
+ if ("action" in properties && "twoStep" in properties) {
79
79
  return "act";
80
80
  }
81
81
  if ("elements" in properties) {
@@ -1 +1 @@
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"]}
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 (\"action\" 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"]}
@@ -68,10 +68,12 @@ function createToolTimeoutTestLlmClient(toolName, toolInput) {
68
68
  if (responseModelName === "act") {
69
69
  return {
70
70
  data: {
71
- elementId: "1-0",
72
- description: "click body",
73
- method: "click",
74
- arguments: [],
71
+ action: {
72
+ elementId: "1-0",
73
+ description: "click body",
74
+ method: "click",
75
+ arguments: [],
76
+ },
75
77
  twoStep: false,
76
78
  },
77
79
  usage,