@browserbasehq/orca 3.1.0-patch.4 → 3.2.0-preview.2

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 (297) hide show
  1. package/dist/cjs/lib/inference.js +1 -4
  2. package/dist/cjs/lib/inference.js.map +1 -1
  3. package/dist/cjs/lib/utils.d.ts +1 -0
  4. package/dist/cjs/lib/utils.js +4 -0
  5. package/dist/cjs/lib/utils.js.map +1 -1
  6. package/dist/cjs/lib/v3/agent/AgentProvider.js +0 -1
  7. package/dist/cjs/lib/v3/agent/AgentProvider.js.map +1 -1
  8. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js +4 -6
  9. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  10. package/dist/cjs/lib/v3/agent/GoogleCUAClient.js +4 -6
  11. package/dist/cjs/lib/v3/agent/GoogleCUAClient.js.map +1 -1
  12. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js +4 -6
  13. package/dist/cjs/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  14. package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.d.ts +2 -0
  15. package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js +2 -2
  16. package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
  17. package/dist/cjs/lib/v3/agent/tools/act.d.ts +1 -1
  18. package/dist/cjs/lib/v3/agent/tools/act.js +20 -4
  19. package/dist/cjs/lib/v3/agent/tools/act.js.map +1 -1
  20. package/dist/cjs/lib/v3/agent/tools/ariaTree.d.ts +8 -1
  21. package/dist/cjs/lib/v3/agent/tools/ariaTree.js +60 -22
  22. package/dist/cjs/lib/v3/agent/tools/ariaTree.js.map +1 -1
  23. package/dist/cjs/lib/v3/agent/tools/{search.js → braveSearch.js} +1 -1
  24. package/dist/cjs/lib/v3/agent/tools/braveSearch.js.map +1 -0
  25. package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.d.ts +13 -0
  26. package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js +70 -0
  27. package/dist/cjs/lib/v3/agent/tools/browserbaseSearch.js.map +1 -0
  28. package/dist/cjs/lib/v3/agent/tools/click.js +23 -31
  29. package/dist/cjs/lib/v3/agent/tools/click.js.map +1 -1
  30. package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js +22 -30
  31. package/dist/cjs/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
  32. package/dist/cjs/lib/v3/agent/tools/extract.d.ts +2 -2
  33. package/dist/cjs/lib/v3/agent/tools/extract.js +16 -3
  34. package/dist/cjs/lib/v3/agent/tools/extract.js.map +1 -1
  35. package/dist/cjs/lib/v3/agent/tools/fillFormVision.js +30 -30
  36. package/dist/cjs/lib/v3/agent/tools/fillFormVision.js.map +1 -1
  37. package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +7 -1
  38. package/dist/cjs/lib/v3/agent/tools/fillform.js +60 -37
  39. package/dist/cjs/lib/v3/agent/tools/fillform.js.map +1 -1
  40. package/dist/cjs/lib/v3/agent/tools/index.d.ts +19 -3
  41. package/dist/cjs/lib/v3/agent/tools/index.js +12 -8
  42. package/dist/cjs/lib/v3/agent/tools/index.js.map +1 -1
  43. package/dist/cjs/lib/v3/agent/tools/screenshot.d.ts +8 -0
  44. package/dist/cjs/lib/v3/agent/tools/screenshot.js +32 -15
  45. package/dist/cjs/lib/v3/agent/tools/screenshot.js.map +1 -1
  46. package/dist/cjs/lib/v3/agent/tools/scroll.js +12 -0
  47. package/dist/cjs/lib/v3/agent/tools/scroll.js.map +1 -1
  48. package/dist/cjs/lib/v3/agent/tools/type.js +23 -31
  49. package/dist/cjs/lib/v3/agent/tools/type.js.map +1 -1
  50. package/dist/cjs/lib/v3/agent/tools/wait.js +6 -0
  51. package/dist/cjs/lib/v3/agent/tools/wait.js.map +1 -1
  52. package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js +4 -0
  53. package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
  54. package/dist/cjs/lib/v3/api.d.ts +2 -2
  55. package/dist/cjs/lib/v3/api.js +1 -1
  56. package/dist/cjs/lib/v3/api.js.map +1 -1
  57. package/dist/cjs/lib/v3/cache/ActCache.d.ts +0 -1
  58. package/dist/cjs/lib/v3/cache/ActCache.js +2 -18
  59. package/dist/cjs/lib/v3/cache/ActCache.js.map +1 -1
  60. package/dist/cjs/lib/v3/eventStore.d.ts +41 -0
  61. package/dist/cjs/lib/v3/eventStore.js +375 -0
  62. package/dist/cjs/lib/v3/eventStore.js.map +1 -0
  63. package/dist/cjs/lib/v3/flowLogger.d.ts +62 -103
  64. package/dist/cjs/lib/v3/flowLogger.js +362 -773
  65. package/dist/cjs/lib/v3/flowLogger.js.map +1 -1
  66. package/dist/cjs/lib/v3/handlers/actHandler.js +1 -2
  67. package/dist/cjs/lib/v3/handlers/actHandler.js.map +1 -1
  68. package/dist/cjs/lib/v3/handlers/extractHandler.js +2 -2
  69. package/dist/cjs/lib/v3/handlers/extractHandler.js.map +1 -1
  70. package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js +21 -33
  71. package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
  72. package/dist/cjs/lib/v3/handlers/observeHandler.js +1 -2
  73. package/dist/cjs/lib/v3/handlers/observeHandler.js.map +1 -1
  74. package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +0 -4
  75. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js +23 -48
  76. package/dist/cjs/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  77. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js +10 -12
  78. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  79. package/dist/cjs/lib/v3/index.d.ts +2 -1
  80. package/dist/cjs/lib/v3/launch/browserbase.d.ts +1 -1
  81. package/dist/cjs/lib/v3/launch/browserbase.js +4 -9
  82. package/dist/cjs/lib/v3/launch/browserbase.js.map +1 -1
  83. package/dist/cjs/lib/v3/llm/LLMProvider.js +0 -5
  84. package/dist/cjs/lib/v3/llm/LLMProvider.js.map +1 -1
  85. package/dist/cjs/lib/v3/llm/aisdk.js +10 -16
  86. package/dist/cjs/lib/v3/llm/aisdk.js.map +1 -1
  87. package/dist/cjs/lib/v3/runtimePaths.js +2 -1
  88. package/dist/cjs/lib/v3/runtimePaths.js.map +1 -1
  89. package/dist/cjs/lib/v3/shutdown/supervisor.js +2 -2
  90. package/dist/cjs/lib/v3/shutdown/supervisor.js.map +1 -1
  91. package/dist/cjs/lib/v3/timeoutConfig.d.ts +1 -1
  92. package/dist/cjs/lib/v3/timeoutConfig.js +5 -0
  93. package/dist/cjs/lib/v3/timeoutConfig.js.map +1 -1
  94. package/dist/cjs/lib/v3/types/private/shutdown.d.ts +1 -1
  95. package/dist/cjs/lib/v3/types/private/shutdown.js.map +1 -1
  96. package/dist/cjs/lib/v3/types/public/agent.d.ts +28 -3
  97. package/dist/cjs/lib/v3/types/public/agent.js +0 -1
  98. package/dist/cjs/lib/v3/types/public/agent.js.map +1 -1
  99. package/dist/cjs/lib/v3/types/public/api.d.ts +3 -0
  100. package/dist/cjs/lib/v3/types/public/api.js +1 -0
  101. package/dist/cjs/lib/v3/types/public/api.js.map +1 -1
  102. package/dist/cjs/lib/v3/types/public/model.d.ts +4 -2
  103. package/dist/cjs/lib/v3/types/public/model.js.map +1 -1
  104. package/dist/cjs/lib/v3/types/public/options.d.ts +6 -0
  105. package/dist/cjs/lib/v3/types/public/options.js.map +1 -1
  106. package/dist/cjs/lib/v3/understudy/cdp.d.ts +8 -13
  107. package/dist/cjs/lib/v3/understudy/cdp.js +137 -17
  108. package/dist/cjs/lib/v3/understudy/cdp.js.map +1 -1
  109. package/dist/cjs/lib/v3/understudy/context.d.ts +1 -0
  110. package/dist/cjs/lib/v3/understudy/context.js +142 -60
  111. package/dist/cjs/lib/v3/understudy/context.js.map +1 -1
  112. package/dist/cjs/lib/v3/understudy/frame.js +23 -6
  113. package/dist/cjs/lib/v3/understudy/frame.js.map +1 -1
  114. package/dist/cjs/lib/v3/understudy/page.d.ts +13 -0
  115. package/dist/cjs/lib/v3/understudy/page.js +88 -20
  116. package/dist/cjs/lib/v3/understudy/page.js.map +1 -1
  117. package/dist/cjs/lib/v3/understudy/screenshotUtils.d.ts +0 -1
  118. package/dist/cjs/lib/v3/understudy/screenshotUtils.js +0 -18
  119. package/dist/cjs/lib/v3/understudy/screenshotUtils.js.map +1 -1
  120. package/dist/cjs/lib/v3/v3.d.ts +10 -0
  121. package/dist/cjs/lib/v3/v3.js +210 -172
  122. package/dist/cjs/lib/v3/v3.js.map +1 -1
  123. package/dist/cjs/tests/integration/cdp-session-detached.spec.js +1 -1
  124. package/dist/cjs/tests/integration/cdp-session-detached.spec.js.map +1 -1
  125. package/dist/cjs/tests/integration/context-addInitScript.spec.js +104 -11
  126. package/dist/cjs/tests/integration/context-addInitScript.spec.js.map +1 -1
  127. package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.js +219 -0
  128. package/dist/cjs/tests/integration/iframe-ctx-addInitScript-race.spec.js.map +1 -0
  129. package/dist/cjs/tests/integration/page-extra-http-headers.spec.js +85 -0
  130. package/dist/cjs/tests/integration/page-extra-http-headers.spec.js.map +1 -0
  131. package/dist/cjs/tests/integration/page-screenshot.spec.js +1 -1
  132. package/dist/cjs/tests/integration/page-screenshot.spec.js.map +1 -1
  133. package/dist/cjs/tests/integration/timeouts.spec.js +168 -0
  134. package/dist/cjs/tests/integration/timeouts.spec.js.map +1 -1
  135. package/dist/cjs/tests/unit/model-deprecation.test.js +5 -8
  136. package/dist/cjs/tests/unit/model-deprecation.test.js.map +1 -1
  137. package/dist/cjs/tests/unit/page-extra-http-headers.test.d.ts +1 -0
  138. package/dist/cjs/tests/unit/page-extra-http-headers.test.js +92 -0
  139. package/dist/cjs/tests/unit/page-extra-http-headers.test.js.map +1 -0
  140. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js +13 -1
  141. package/dist/cjs/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  142. package/dist/cjs/tests/unit/public-api/public-types.test.js.map +1 -1
  143. package/dist/esm/lib/inference.js +1 -4
  144. package/dist/esm/lib/inference.js.map +1 -1
  145. package/dist/esm/lib/utils.d.ts +1 -0
  146. package/dist/esm/lib/utils.js +3 -0
  147. package/dist/esm/lib/utils.js.map +1 -1
  148. package/dist/esm/lib/v3/agent/AgentProvider.js +0 -1
  149. package/dist/esm/lib/v3/agent/AgentProvider.js.map +1 -1
  150. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js +5 -7
  151. package/dist/esm/lib/v3/agent/AnthropicCUAClient.js.map +1 -1
  152. package/dist/esm/lib/v3/agent/GoogleCUAClient.js +5 -7
  153. package/dist/esm/lib/v3/agent/GoogleCUAClient.js.map +1 -1
  154. package/dist/esm/lib/v3/agent/OpenAICUAClient.js +5 -7
  155. package/dist/esm/lib/v3/agent/OpenAICUAClient.js.map +1 -1
  156. package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.d.ts +2 -0
  157. package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js +2 -2
  158. package/dist/esm/lib/v3/agent/prompts/agentSystemPrompt.js.map +1 -1
  159. package/dist/esm/lib/v3/agent/tools/act.d.ts +1 -1
  160. package/dist/esm/lib/v3/agent/tools/act.js +20 -4
  161. package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
  162. package/dist/esm/lib/v3/agent/tools/ariaTree.d.ts +8 -1
  163. package/dist/esm/lib/v3/agent/tools/ariaTree.js +60 -22
  164. package/dist/esm/lib/v3/agent/tools/ariaTree.js.map +1 -1
  165. package/dist/esm/lib/v3/agent/tools/{search.js → braveSearch.js} +1 -1
  166. package/dist/esm/lib/v3/agent/tools/braveSearch.js.map +1 -0
  167. package/dist/esm/lib/v3/agent/tools/browserbaseSearch.d.ts +13 -0
  168. package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js +66 -0
  169. package/dist/esm/lib/v3/agent/tools/browserbaseSearch.js.map +1 -0
  170. package/dist/esm/lib/v3/agent/tools/click.js +23 -31
  171. package/dist/esm/lib/v3/agent/tools/click.js.map +1 -1
  172. package/dist/esm/lib/v3/agent/tools/dragAndDrop.js +22 -30
  173. package/dist/esm/lib/v3/agent/tools/dragAndDrop.js.map +1 -1
  174. package/dist/esm/lib/v3/agent/tools/extract.d.ts +2 -2
  175. package/dist/esm/lib/v3/agent/tools/extract.js +16 -3
  176. package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
  177. package/dist/esm/lib/v3/agent/tools/fillFormVision.js +30 -30
  178. package/dist/esm/lib/v3/agent/tools/fillFormVision.js.map +1 -1
  179. package/dist/esm/lib/v3/agent/tools/fillform.d.ts +7 -1
  180. package/dist/esm/lib/v3/agent/tools/fillform.js +60 -37
  181. package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
  182. package/dist/esm/lib/v3/agent/tools/index.d.ts +19 -3
  183. package/dist/esm/lib/v3/agent/tools/index.js +12 -8
  184. package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
  185. package/dist/esm/lib/v3/agent/tools/screenshot.d.ts +8 -0
  186. package/dist/esm/lib/v3/agent/tools/screenshot.js +32 -15
  187. package/dist/esm/lib/v3/agent/tools/screenshot.js.map +1 -1
  188. package/dist/esm/lib/v3/agent/tools/scroll.js +12 -0
  189. package/dist/esm/lib/v3/agent/tools/scroll.js.map +1 -1
  190. package/dist/esm/lib/v3/agent/tools/type.js +23 -31
  191. package/dist/esm/lib/v3/agent/tools/type.js.map +1 -1
  192. package/dist/esm/lib/v3/agent/tools/wait.js +6 -0
  193. package/dist/esm/lib/v3/agent/tools/wait.js.map +1 -1
  194. package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js +4 -0
  195. package/dist/esm/lib/v3/agent/utils/handleDoneToolCall.js.map +1 -1
  196. package/dist/esm/lib/v3/api.d.ts +2 -2
  197. package/dist/esm/lib/v3/api.js +1 -1
  198. package/dist/esm/lib/v3/api.js.map +1 -1
  199. package/dist/esm/lib/v3/cache/ActCache.d.ts +0 -1
  200. package/dist/esm/lib/v3/cache/ActCache.js +2 -18
  201. package/dist/esm/lib/v3/cache/ActCache.js.map +1 -1
  202. package/dist/esm/lib/v3/eventStore.d.ts +41 -0
  203. package/dist/esm/lib/v3/eventStore.js +363 -0
  204. package/dist/esm/lib/v3/eventStore.js.map +1 -0
  205. package/dist/esm/lib/v3/flowLogger.d.ts +62 -103
  206. package/dist/esm/lib/v3/flowLogger.js +356 -762
  207. package/dist/esm/lib/v3/flowLogger.js.map +1 -1
  208. package/dist/esm/lib/v3/handlers/actHandler.js +1 -2
  209. package/dist/esm/lib/v3/handlers/actHandler.js.map +1 -1
  210. package/dist/esm/lib/v3/handlers/extractHandler.js +2 -2
  211. package/dist/esm/lib/v3/handlers/extractHandler.js.map +1 -1
  212. package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +22 -34
  213. package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
  214. package/dist/esm/lib/v3/handlers/observeHandler.js +1 -2
  215. package/dist/esm/lib/v3/handlers/observeHandler.js.map +1 -1
  216. package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +0 -4
  217. package/dist/esm/lib/v3/handlers/v3AgentHandler.js +25 -50
  218. package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  219. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js +11 -13
  220. package/dist/esm/lib/v3/handlers/v3CuaAgentHandler.js.map +1 -1
  221. package/dist/esm/lib/v3/index.d.ts +2 -1
  222. package/dist/esm/lib/v3/launch/browserbase.d.ts +1 -1
  223. package/dist/esm/lib/v3/launch/browserbase.js +4 -9
  224. package/dist/esm/lib/v3/launch/browserbase.js.map +1 -1
  225. package/dist/esm/lib/v3/llm/LLMProvider.js +0 -5
  226. package/dist/esm/lib/v3/llm/LLMProvider.js.map +1 -1
  227. package/dist/esm/lib/v3/llm/aisdk.js +11 -17
  228. package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
  229. package/dist/esm/lib/v3/runtimePaths.js +2 -1
  230. package/dist/esm/lib/v3/runtimePaths.js.map +1 -1
  231. package/dist/esm/lib/v3/shutdown/supervisor.js +2 -2
  232. package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
  233. package/dist/esm/lib/v3/timeoutConfig.d.ts +1 -1
  234. package/dist/esm/lib/v3/timeoutConfig.js +5 -0
  235. package/dist/esm/lib/v3/timeoutConfig.js.map +1 -1
  236. package/dist/esm/lib/v3/types/private/shutdown.d.ts +1 -1
  237. package/dist/esm/lib/v3/types/private/shutdown.js.map +1 -1
  238. package/dist/esm/lib/v3/types/public/agent.d.ts +28 -3
  239. package/dist/esm/lib/v3/types/public/agent.js +0 -1
  240. package/dist/esm/lib/v3/types/public/agent.js.map +1 -1
  241. package/dist/esm/lib/v3/types/public/api.d.ts +3 -0
  242. package/dist/esm/lib/v3/types/public/api.js +1 -0
  243. package/dist/esm/lib/v3/types/public/api.js.map +1 -1
  244. package/dist/esm/lib/v3/types/public/model.d.ts +4 -2
  245. package/dist/esm/lib/v3/types/public/model.js.map +1 -1
  246. package/dist/esm/lib/v3/types/public/options.d.ts +6 -0
  247. package/dist/esm/lib/v3/types/public/options.js.map +1 -1
  248. package/dist/esm/lib/v3/understudy/cdp.d.ts +8 -13
  249. package/dist/esm/lib/v3/understudy/cdp.js +138 -18
  250. package/dist/esm/lib/v3/understudy/cdp.js.map +1 -1
  251. package/dist/esm/lib/v3/understudy/context.d.ts +1 -0
  252. package/dist/esm/lib/v3/understudy/context.js +142 -60
  253. package/dist/esm/lib/v3/understudy/context.js.map +1 -1
  254. package/dist/esm/lib/v3/understudy/frame.js +23 -6
  255. package/dist/esm/lib/v3/understudy/frame.js.map +1 -1
  256. package/dist/esm/lib/v3/understudy/page.d.ts +13 -0
  257. package/dist/esm/lib/v3/understudy/page.js +91 -23
  258. package/dist/esm/lib/v3/understudy/page.js.map +1 -1
  259. package/dist/esm/lib/v3/understudy/screenshotUtils.d.ts +0 -1
  260. package/dist/esm/lib/v3/understudy/screenshotUtils.js +0 -17
  261. package/dist/esm/lib/v3/understudy/screenshotUtils.js.map +1 -1
  262. package/dist/esm/lib/v3/v3.d.ts +10 -0
  263. package/dist/esm/lib/v3/v3.js +211 -173
  264. package/dist/esm/lib/v3/v3.js.map +1 -1
  265. package/dist/esm/tests/integration/cdp-session-detached.spec.js +1 -1
  266. package/dist/esm/tests/integration/cdp-session-detached.spec.js.map +1 -1
  267. package/dist/esm/tests/integration/context-addInitScript.spec.js +104 -11
  268. package/dist/esm/tests/integration/context-addInitScript.spec.js.map +1 -1
  269. package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.d.ts +1 -0
  270. package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.js +217 -0
  271. package/dist/esm/tests/integration/iframe-ctx-addInitScript-race.spec.js.map +1 -0
  272. package/dist/esm/tests/integration/page-extra-http-headers.spec.d.ts +1 -0
  273. package/dist/esm/tests/integration/page-extra-http-headers.spec.js +83 -0
  274. package/dist/esm/tests/integration/page-extra-http-headers.spec.js.map +1 -0
  275. package/dist/esm/tests/integration/page-screenshot.spec.js +1 -1
  276. package/dist/esm/tests/integration/page-screenshot.spec.js.map +1 -1
  277. package/dist/esm/tests/integration/timeouts.spec.js +168 -0
  278. package/dist/esm/tests/integration/timeouts.spec.js.map +1 -1
  279. package/dist/esm/tests/unit/model-deprecation.test.js +5 -8
  280. package/dist/esm/tests/unit/model-deprecation.test.js.map +1 -1
  281. package/dist/esm/tests/unit/page-extra-http-headers.test.d.ts +1 -0
  282. package/dist/esm/tests/unit/page-extra-http-headers.test.js +90 -0
  283. package/dist/esm/tests/unit/page-extra-http-headers.test.js.map +1 -0
  284. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js +13 -1
  285. package/dist/esm/tests/unit/public-api/llm-and-agents.test.js.map +1 -1
  286. package/dist/esm/tests/unit/public-api/public-types.test.js.map +1 -1
  287. package/package.json +2 -2
  288. package/dist/cjs/lib/v3/agent/tools/search.js.map +0 -1
  289. package/dist/cjs/tests/unit/rerender-missing-shadows.test.js +0 -209
  290. package/dist/cjs/tests/unit/rerender-missing-shadows.test.js.map +0 -1
  291. package/dist/esm/lib/v3/agent/tools/search.js.map +0 -1
  292. package/dist/esm/tests/unit/rerender-missing-shadows.test.js +0 -207
  293. package/dist/esm/tests/unit/rerender-missing-shadows.test.js.map +0 -1
  294. /package/dist/cjs/lib/v3/agent/tools/{search.d.ts → braveSearch.d.ts} +0 -0
  295. /package/dist/cjs/tests/{unit/rerender-missing-shadows.test.d.ts → integration/iframe-ctx-addInitScript-race.spec.d.ts} +0 -0
  296. /package/dist/{esm/tests/unit/rerender-missing-shadows.test.d.ts → cjs/tests/integration/page-extra-http-headers.spec.d.ts} +0 -0
  297. /package/dist/esm/lib/v3/agent/tools/{search.d.ts → braveSearch.d.ts} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"flowLogger.js","sourceRoot":"","sources":["../../../../lib/v3/flowLogger.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport fs from \"node:fs\";\nimport { Writable } from \"node:stream\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport path from \"node:path\";\nimport pino from \"pino\";\nimport type { LanguageModelMiddleware } from \"ai\";\nimport type { V3Options } from \"./types/public/index.js\";\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst MAX_LINE_LENGTH = 160;\n\n// Flow logging config dir - empty string disables logging entirely\nconst CONFIG_DIR = process.env.BROWSERBASE_CONFIG_DIR || \"\";\n\nconst NOISY_CDP_EVENTS = new Set([\n \"Target.targetInfoChanged\",\n \"Runtime.executionContextCreated\",\n \"Runtime.executionContextDestroyed\",\n \"Runtime.executionContextsCleared\",\n \"Page.lifecycleEvent\",\n \"Network.dataReceived\",\n \"Network.loadingFinished\",\n \"Network.requestWillBeSentExtraInfo\",\n \"Network.responseReceivedExtraInfo\",\n \"Network.requestWillBeSent\",\n \"Network.responseReceived\",\n]);\n\n// =============================================================================\n// Types\n// =============================================================================\n\ntype EventCategory =\n | \"AgentTask\"\n | \"StagehandStep\"\n | \"UnderstudyAction\"\n | \"CDP\"\n | \"LLM\";\n\ninterface FlowEvent {\n // Core identifiers (set via mixin from child logger bindings)\n eventId: string;\n sessionId: string;\n taskId?: string | null;\n stepId?: string | null;\n stepLabel?: string | null;\n actionId?: string | null;\n actionLabel?: string | null;\n\n // Event classification\n category: EventCategory;\n event: \"started\" | \"completed\" | \"call\" | \"message\" | \"request\" | \"response\";\n method?: string;\n msg?: string;\n\n // Event-specific payload (not truncated)\n params?: unknown;\n targetId?: string | null;\n\n // LLM event fields (for individual LLM request/response events only)\n requestId?: string; // Correlation ID linking LLM request to response\n model?: string;\n prompt?: unknown;\n output?: unknown;\n inputTokens?: number; // Tokens for THIS specific LLM call\n outputTokens?: number; // Tokens for THIS specific LLM call\n\n // Aggregate metrics (for completion events only - task/step/action)\n metrics?: {\n durationMs?: number;\n llmRequests?: number; // Total LLM calls in this span\n inputTokens?: number; // Total input tokens across all LLM calls\n outputTokens?: number; // Total output tokens across all LLM calls\n cdpEvents?: number; // Total CDP events in this span\n };\n}\n\ninterface FlowLoggerMetrics {\n taskStartTime?: number;\n stepStartTime?: number;\n actionStartTime?: number;\n llmRequests: number;\n llmInputTokens: number;\n llmOutputTokens: number;\n cdpEvents: number;\n}\n\nexport interface FlowLoggerContext {\n logger: pino.Logger;\n metrics: FlowLoggerMetrics;\n sessionId: string;\n sessionDir: string;\n configDir: string;\n initPromise: Promise<void>;\n initialized: boolean;\n // Current span context (mutable, injected via mixin)\n taskId: string | null;\n stepId: string | null;\n stepLabel: string | null;\n actionId: string | null;\n actionLabel: string | null;\n // File handles for pretty streams\n fileStreams: {\n agent: fs.WriteStream | null;\n stagehand: fs.WriteStream | null;\n understudy: fs.WriteStream | null;\n cdp: fs.WriteStream | null;\n llm: fs.WriteStream | null;\n jsonl: fs.WriteStream | null;\n };\n}\n\nconst loggerContext = new AsyncLocalStorage<FlowLoggerContext>();\n\n// =============================================================================\n// Formatting Utilities (used by pretty streams)\n// =============================================================================\n\n/** Calculate base64 data size in KB */\nconst dataToKb = (data: string): string =>\n ((data.length * 0.75) / 1024).toFixed(1);\n\n/** Truncate CDP IDs: frameId:363F03EB...EF8 → frameId:363F…5EF8 */\nfunction truncateCdpIds(value: string): string {\n return value.replace(\n /([iI]d:?\"?)([0-9A-F]{32})(?=\"?[,})\\s]|$)/g,\n (_, pre: string, id: string) => `${pre}${id.slice(0, 4)}…${id.slice(-4)}`,\n );\n}\n\n/** Truncate line showing start...end */\nfunction truncateLine(value: string, maxLen: number): string {\n const collapsed = value.replace(/\\s+/g, \" \");\n if (collapsed.length <= maxLen) return collapsed;\n const endLen = Math.floor(maxLen * 0.3);\n const startLen = maxLen - endLen - 1;\n return `${collapsed.slice(0, startLen)}…${collapsed.slice(-endLen)}`;\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") return `'${value}'`;\n if (value == null || typeof value !== \"object\") return String(value);\n try {\n return JSON.stringify(value);\n } catch {\n return \"[unserializable]\";\n }\n}\n\nfunction formatArgs(args?: unknown | unknown[]): string {\n if (args === undefined) return \"\";\n return (Array.isArray(args) ? args : [args])\n .filter((e) => e !== undefined)\n .map(formatValue)\n .filter((e) => e.length > 0)\n .join(\", \");\n}\n\nconst shortId = (id: string | null | undefined): string =>\n id ? id.slice(-4) : \"-\";\n\nfunction formatTag(\n label: string | null | undefined,\n id: string | null | undefined,\n icon: string,\n): string {\n return id ? `[${icon} #${shortId(id)}${label ? \" \" + label : \"\"}]` : \"⤑\";\n}\n\nlet nonce = 0;\nfunction formatTimestamp(): string {\n const d = new Date();\n const pad = (n: number, w = 2) => String(n).padStart(w, \"0\");\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}.${pad(d.getMilliseconds(), 3)}${pad(nonce++ % 100)}`;\n}\n\nconst SENSITIVE_KEYS =\n /apikey|api_key|key|secret|token|password|passwd|pwd|credential|auth/i;\n\nfunction sanitizeOptions(options: V3Options): Record<string, unknown> {\n const sanitize = (obj: unknown): unknown => {\n if (typeof obj !== \"object\" || obj === null) return obj;\n if (Array.isArray(obj)) return obj.map(sanitize);\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n result[key] = SENSITIVE_KEYS.test(key) ? \"******\" : sanitize(value);\n }\n return result;\n };\n return sanitize({ ...options }) as Record<string, unknown>;\n}\n\n/** Remove unescaped quotes for cleaner log output */\nfunction removeQuotes(str: string): string {\n return str\n .replace(/([^\\\\])[\"']/g, \"$1\")\n .replace(/^[\"']|[\"']$/g, \"\")\n .trim();\n}\n\n// =============================================================================\n// Pretty Formatting (converts FlowEvent to human-readable log line)\n// =============================================================================\n\nfunction prettifyEvent(event: FlowEvent): string | null {\n const parts: string[] = [];\n\n // Build context tags - always add parent span tags (formatTag returns ⤑ for null IDs)\n if (event.category === \"AgentTask\") {\n parts.push(formatTag(\"\", event.taskId, \"🅰\"));\n } else if (event.category === \"StagehandStep\") {\n parts.push(formatTag(\"\", event.taskId, \"🅰\"));\n parts.push(formatTag(event.stepLabel, event.stepId, \"🆂\"));\n } else if (event.category === \"UnderstudyAction\") {\n parts.push(formatTag(\"\", event.taskId, \"🅰\"));\n parts.push(formatTag(event.stepLabel, event.stepId, \"🆂\"));\n parts.push(formatTag(event.actionLabel, event.actionId, \"🆄\"));\n } else if (event.category === \"CDP\") {\n parts.push(formatTag(\"\", event.taskId, \"🅰\"));\n parts.push(formatTag(event.stepLabel, event.stepId, \"🆂\"));\n parts.push(formatTag(event.actionLabel, event.actionId, \"🆄\"));\n parts.push(formatTag(\"CDP\", event.targetId, \"🅲\"));\n } else if (event.category === \"LLM\") {\n parts.push(formatTag(\"\", event.taskId, \"🅰\"));\n parts.push(formatTag(event.stepLabel, event.stepId, \"🆂\"));\n parts.push(formatTag(\"LLM\", event.requestId, \"🧠\"));\n }\n\n // Build details based on event type\n let details = \"\";\n const argsStr = event.params ? formatArgs(event.params) : \"\";\n\n if (event.category === \"AgentTask\") {\n if (event.event === \"started\") {\n details = `▷ ${event.method}(${argsStr})`;\n } else if (event.event === \"completed\") {\n const m = event.metrics;\n const durationSec = m?.durationMs\n ? (m.durationMs / 1000).toFixed(1)\n : \"?\";\n const llmStats = `${m?.llmRequests ?? 0} LLM calls ꜛ${m?.inputTokens ?? 0} ꜜ${m?.outputTokens ?? 0} tokens`;\n const cdpStats = `${m?.cdpEvents ?? 0} CDP msgs`;\n details = `✓ Agent.execute() DONE in ${durationSec}s | ${llmStats} | ${cdpStats}`;\n }\n } else if (event.category === \"StagehandStep\") {\n if (event.event === \"started\") {\n details = `▷ ${event.method}(${argsStr})`;\n } else if (event.event === \"completed\") {\n const durationSec = event.metrics?.durationMs\n ? (event.metrics.durationMs / 1000).toFixed(2)\n : \"?\";\n details = `✓ ${event.stepLabel || \"STEP\"} completed in ${durationSec}s`;\n }\n } else if (event.category === \"UnderstudyAction\") {\n if (event.event === \"started\") {\n details = `▷ ${event.method}(${argsStr})`;\n } else if (event.event === \"completed\") {\n const durationSec = event.metrics?.durationMs\n ? (event.metrics.durationMs / 1000).toFixed(2)\n : \"?\";\n details = `✓ ${event.actionLabel || \"ACTION\"} completed in ${durationSec}s`;\n }\n } else if (event.category === \"CDP\") {\n const icon = event.event === \"call\" ? \"⏵\" : \"⏴\";\n details = `${icon} ${event.method}(${argsStr})`;\n } else if (event.category === \"LLM\") {\n if (event.event === \"request\") {\n const promptStr = event.prompt ? \" \" + String(event.prompt) : \"\";\n details = `${event.model} ⏴${promptStr}`;\n } else if (event.event === \"response\") {\n const hasTokens =\n event.inputTokens !== undefined || event.outputTokens !== undefined;\n const tokenStr = hasTokens\n ? ` ꜛ${event.inputTokens ?? 0} ꜜ${event.outputTokens ?? 0} |`\n : \"\";\n const outputStr = event.output ? \" \" + String(event.output) : \"\";\n details = `${event.model} ↳${tokenStr}${outputStr}`;\n }\n }\n\n if (!details) return null;\n\n // Assemble line and apply final truncation\n const fullLine = `${formatTimestamp()} ${parts.join(\" \")} ${details}`;\n const cleaned = removeQuotes(fullLine);\n const processed =\n event.category === \"CDP\" ? truncateCdpIds(cleaned) : cleaned;\n return truncateLine(processed, MAX_LINE_LENGTH);\n}\n\n/** Check if a CDP event should be filtered from pretty output */\nfunction shouldFilterCdpEvent(event: FlowEvent): boolean {\n if (event.category !== \"CDP\") return false;\n if (event.method?.endsWith(\".enable\") || event.method === \"enable\")\n return true;\n return event.event === \"message\" && NOISY_CDP_EVENTS.has(event.method!);\n}\n\n// =============================================================================\n// Stream Creation\n// =============================================================================\n\nconst isWritable = (s: fs.WriteStream | null): s is fs.WriteStream =>\n !!(s && !s.destroyed && s.writable);\n\nfunction createJsonlStream(ctx: FlowLoggerContext): Writable {\n return new Writable({\n objectMode: true,\n write(chunk: string, _, cb) {\n if (ctx.initialized && isWritable(ctx.fileStreams.jsonl)) {\n ctx.fileStreams.jsonl.write(chunk, cb);\n } else cb();\n },\n });\n}\n\nfunction createPrettyStream(\n ctx: FlowLoggerContext,\n category: EventCategory,\n streamKey: keyof FlowLoggerContext[\"fileStreams\"],\n): Writable {\n return new Writable({\n objectMode: true,\n write(chunk: string, _, cb) {\n const stream = ctx.fileStreams[streamKey];\n if (!ctx.initialized || !isWritable(stream)) return cb();\n try {\n const event = JSON.parse(chunk) as FlowEvent;\n if (event.category !== category || shouldFilterCdpEvent(event))\n return cb();\n const line = prettifyEvent(event);\n if (line) stream.write(line + \"\\n\", cb);\n else cb();\n } catch {\n cb();\n }\n },\n });\n}\n\n// =============================================================================\n// Public Helpers (used by external callers)\n// =============================================================================\n\n/**\n * Get the config directory. Returns empty string if logging is disabled.\n */\nexport function getConfigDir(): string {\n return CONFIG_DIR ? path.resolve(CONFIG_DIR) : \"\";\n}\n\n// =============================================================================\n// Prompt Preview Helpers\n// =============================================================================\n\ntype ContentPart = {\n type?: string;\n text?: string;\n content?: unknown[];\n source?: { data?: string };\n image_url?: { url?: string };\n inlineData?: { data?: string };\n};\n\n/** Extract text and image info from a content array (handles nested tool_result) */\nfunction extractFromContent(\n content: unknown[],\n result: { text?: string; extras: string[] },\n): void {\n for (const part of content) {\n const p = part as ContentPart;\n // Text\n if (!result.text && p.text) {\n result.text = p.type === \"text\" || !p.type ? p.text : undefined;\n }\n // Images - various formats\n if (p.type === \"image\" || p.type === \"image_url\") {\n const url = p.image_url?.url;\n if (url?.startsWith(\"data:\"))\n result.extras.push(`${dataToKb(url)}kb image`);\n else if (p.source?.data)\n result.extras.push(`${dataToKb(p.source.data)}kb image`);\n else result.extras.push(\"image\");\n } else if (p.source?.data) {\n result.extras.push(`${dataToKb(p.source.data)}kb image`);\n } else if (p.inlineData?.data) {\n result.extras.push(`${dataToKb(p.inlineData.data)}kb image`);\n }\n // Recurse into tool_result content\n if (p.type === \"tool_result\" && Array.isArray(p.content)) {\n extractFromContent(p.content, result);\n }\n }\n}\n\n/** Build final preview string with extras */\nfunction buildPreview(\n text: string | undefined,\n extras: string[],\n maxLen?: number,\n): string | undefined {\n if (!text && extras.length === 0) return undefined;\n let result = text || \"\";\n if (maxLen && result.length > maxLen)\n result = result.slice(0, maxLen) + \"...\";\n if (extras.length > 0) {\n const extrasStr = extras.map((e) => `+{${e}}`).join(\" \");\n result = result ? `${result} ${extrasStr}` : extrasStr;\n }\n return result || undefined;\n}\n\n/**\n * Format a prompt preview from LLM messages for logging.\n * Returns format like: \"some text... +{5.8kb image} +{schema} +{12 tools}\"\n */\nexport function formatLlmPromptPreview(\n messages: Array<{ role: string; content: unknown }>,\n options?: { toolCount?: number; hasSchema?: boolean },\n): string | undefined {\n try {\n const lastUserMsg = messages.filter((m) => m.role === \"user\").pop();\n if (!lastUserMsg) return undefined;\n\n const result = {\n text: undefined as string | undefined,\n extras: [] as string[],\n };\n\n if (typeof lastUserMsg.content === \"string\") {\n result.text = lastUserMsg.content;\n } else if (Array.isArray(lastUserMsg.content)) {\n extractFromContent(lastUserMsg.content, result);\n } else {\n return undefined;\n }\n\n // Clean instruction prefix\n if (result.text) {\n result.text = result.text.replace(/^[Ii]nstruction: /, \"\");\n }\n\n if (options?.hasSchema) result.extras.push(\"schema\");\n if (options?.toolCount) result.extras.push(`${options.toolCount} tools`);\n\n return buildPreview(result.text, result.extras);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Extract a text preview from CUA-style messages.\n * Accepts various message formats (Anthropic, OpenAI, Google).\n */\nexport function formatCuaPromptPreview(\n messages: unknown[],\n maxLen = 100,\n): string | undefined {\n try {\n const lastMsg = messages\n .filter((m) => {\n const msg = m as { role?: string; type?: string };\n return msg.role === \"user\" || msg.type === \"tool_result\";\n })\n .pop() as\n | { content?: unknown; parts?: unknown[]; text?: string }\n | undefined;\n\n if (!lastMsg) return undefined;\n\n const result = {\n text: undefined as string | undefined,\n extras: [] as string[],\n };\n\n if (typeof lastMsg.content === \"string\") {\n result.text = lastMsg.content;\n } else if (typeof lastMsg.text === \"string\") {\n result.text = lastMsg.text;\n } else if (Array.isArray(lastMsg.parts)) {\n extractFromContent(lastMsg.parts, result);\n } else if (Array.isArray(lastMsg.content)) {\n extractFromContent(lastMsg.content, result);\n }\n\n return buildPreview(result.text, result.extras, maxLen);\n } catch {\n return undefined;\n }\n}\n\n/** Format CUA response output for logging */\nexport function formatCuaResponsePreview(\n output: unknown,\n maxLen = 100,\n): string {\n try {\n // Handle Google format or array\n const items: unknown[] =\n (output as { candidates?: [{ content?: { parts?: unknown[] } }] })\n ?.candidates?.[0]?.content?.parts ??\n (Array.isArray(output) ? output : []);\n\n const preview = items\n .map((item) => {\n const i = item as {\n type?: string;\n text?: string;\n name?: string;\n functionCall?: { name?: string };\n };\n if (i.text) return i.text.slice(0, 50);\n if (i.functionCall?.name) return `fn:${i.functionCall.name}`;\n if (i.type === \"tool_use\" && i.name) return `tool_use:${i.name}`;\n return i.type ? `[${i.type}]` : \"[item]\";\n })\n .join(\" \");\n\n return preview.slice(0, maxLen);\n } catch {\n return \"[error]\";\n }\n}\n\n// =============================================================================\n// SessionFileLogger - Main API\n// =============================================================================\n\nexport class SessionFileLogger {\n /**\n * Initialize a new logging context. Call this at the start of a session.\n * If BROWSERBASE_CONFIG_DIR is not set, logging is disabled.\n */\n static init(sessionId: string, v3Options?: V3Options): void {\n const configDir = getConfigDir();\n if (!configDir) return; // Logging disabled\n\n const sessionDir = path.join(configDir, \"sessions\", sessionId);\n\n // Create context with placeholder logger (will be replaced after streams init)\n const ctx: FlowLoggerContext = {\n logger: pino({ level: \"silent\" }), // Placeholder, replaced below\n metrics: {\n llmRequests: 0,\n llmInputTokens: 0,\n llmOutputTokens: 0,\n cdpEvents: 0,\n },\n sessionId,\n sessionDir,\n configDir,\n initPromise: Promise.resolve(),\n initialized: false,\n // Span context - mutable, injected into every log via mixin\n taskId: null,\n stepId: null,\n stepLabel: null,\n actionId: null,\n actionLabel: null,\n fileStreams: {\n agent: null,\n stagehand: null,\n understudy: null,\n cdp: null,\n llm: null,\n jsonl: null,\n },\n };\n\n // Store init promise for awaiting in log methods\n ctx.initPromise = SessionFileLogger.initAsync(ctx, v3Options);\n\n loggerContext.enterWith(ctx);\n }\n\n private static async initAsync(\n ctx: FlowLoggerContext,\n v3Options?: V3Options,\n ): Promise<void> {\n try {\n await fs.promises.mkdir(ctx.sessionDir, { recursive: true });\n\n if (v3Options) {\n const sanitizedOptions = sanitizeOptions(v3Options);\n const sessionJsonPath = path.join(ctx.sessionDir, \"session.json\");\n await fs.promises.writeFile(\n sessionJsonPath,\n JSON.stringify(sanitizedOptions, null, 2),\n \"utf-8\",\n );\n }\n\n // Create symlink to latest session\n const latestLink = path.join(ctx.configDir, \"sessions\", \"latest\");\n try {\n try {\n await fs.promises.unlink(latestLink);\n } catch {\n // Ignore if doesn't exist\n }\n await fs.promises.symlink(ctx.sessionId, latestLink, \"dir\");\n } catch {\n // Symlink creation can fail on Windows or due to permissions\n }\n\n // Create file streams\n const dir = ctx.sessionDir;\n ctx.fileStreams.agent = fs.createWriteStream(\n path.join(dir, \"agent_events.log\"),\n { flags: \"a\" },\n );\n ctx.fileStreams.stagehand = fs.createWriteStream(\n path.join(dir, \"stagehand_events.log\"),\n { flags: \"a\" },\n );\n ctx.fileStreams.understudy = fs.createWriteStream(\n path.join(dir, \"understudy_events.log\"),\n { flags: \"a\" },\n );\n ctx.fileStreams.cdp = fs.createWriteStream(\n path.join(dir, \"cdp_events.log\"),\n { flags: \"a\" },\n );\n ctx.fileStreams.llm = fs.createWriteStream(\n path.join(dir, \"llm_events.log\"),\n { flags: \"a\" },\n );\n ctx.fileStreams.jsonl = fs.createWriteStream(\n path.join(dir, \"session_events.jsonl\"),\n { flags: \"a\" },\n );\n\n ctx.initialized = true;\n\n // Create pino multistream: JSONL + pretty streams per category\n const streams: pino.StreamEntry[] = [\n { stream: createJsonlStream(ctx) },\n { stream: createPrettyStream(ctx, \"AgentTask\", \"agent\") },\n { stream: createPrettyStream(ctx, \"StagehandStep\", \"stagehand\") },\n { stream: createPrettyStream(ctx, \"UnderstudyAction\", \"understudy\") },\n { stream: createPrettyStream(ctx, \"CDP\", \"cdp\") },\n { stream: createPrettyStream(ctx, \"LLM\", \"llm\") },\n ];\n\n // Create logger with mixin that injects span context from AsyncLocalStorage\n ctx.logger = pino(\n {\n level: \"info\",\n // Mixin adds eventId and current span context to every log\n mixin() {\n const store = loggerContext.getStore();\n return {\n eventId: uuidv7(),\n sessionId: store?.sessionId,\n taskId: store?.taskId,\n stepId: store?.stepId,\n stepLabel: store?.stepLabel,\n actionId: store?.actionId,\n actionLabel: store?.actionLabel,\n };\n },\n },\n pino.multistream(streams),\n );\n } catch {\n // Fail silently\n }\n }\n\n static async close(): Promise<void> {\n const ctx = loggerContext.getStore();\n if (!ctx) return;\n await ctx.initPromise;\n SessionFileLogger.logAgentTaskCompleted();\n await Promise.all(\n Object.values(ctx.fileStreams)\n .filter(Boolean)\n .map((s) => new Promise<void>((r) => s!.end(r))),\n ).catch(() => {});\n }\n\n static get sessionId(): string | null {\n return loggerContext.getStore()?.sessionId ?? null;\n }\n\n static get sessionDir(): string | null {\n return loggerContext.getStore()?.sessionDir ?? null;\n }\n\n /**\n * Get the current logger context object.\n */\n static getContext(): FlowLoggerContext | null {\n return loggerContext.getStore() ?? null;\n }\n\n // ===========================================================================\n // Agent Task Events\n // ===========================================================================\n\n /**\n * Start a new task and log it.\n */\n static logAgentTaskStarted({\n invocation,\n args,\n }: {\n invocation: string;\n args?: unknown | unknown[];\n }): void {\n const ctx = loggerContext.getStore();\n if (!ctx) return;\n\n // Set up task context\n ctx.taskId = uuidv7();\n ctx.stepId = null;\n ctx.stepLabel = null;\n ctx.actionId = null;\n ctx.actionLabel = null;\n\n // Reset metrics for new task\n ctx.metrics = {\n taskStartTime: Date.now(),\n llmRequests: 0,\n llmInputTokens: 0,\n llmOutputTokens: 0,\n cdpEvents: 0,\n };\n\n ctx.logger.info({\n category: \"AgentTask\",\n event: \"started\",\n method: invocation,\n params: args,\n } as FlowEvent);\n }\n\n /**\n * Log task completion with metrics summary.\n */\n static logAgentTaskCompleted(options?: { cacheHit?: boolean }): void {\n const ctx = loggerContext.getStore();\n if (!ctx || !ctx.metrics.taskStartTime) return;\n\n const durationMs = Date.now() - ctx.metrics.taskStartTime;\n\n const event: Partial<FlowEvent> = {\n category: \"AgentTask\",\n event: \"completed\",\n method: \"Agent.execute\",\n metrics: {\n durationMs,\n llmRequests: ctx.metrics.llmRequests,\n inputTokens: ctx.metrics.llmInputTokens,\n outputTokens: ctx.metrics.llmOutputTokens,\n cdpEvents: ctx.metrics.cdpEvents,\n },\n };\n\n if (options?.cacheHit) {\n event.msg = \"CACHE HIT, NO LLM NEEDED\";\n }\n\n ctx.logger.info(event);\n\n // Clear task context\n ctx.taskId = null;\n ctx.stepId = null;\n ctx.stepLabel = null;\n ctx.actionId = null;\n ctx.actionLabel = null;\n ctx.metrics.taskStartTime = undefined;\n }\n\n // ===========================================================================\n // Stagehand Step Events\n // ===========================================================================\n\n static logStagehandStepEvent({\n invocation,\n args,\n label,\n }: {\n invocation: string;\n args?: unknown | unknown[];\n label: string;\n }): string {\n const ctx = loggerContext.getStore();\n if (!ctx) return uuidv7();\n\n // Set up step context\n ctx.stepId = uuidv7();\n ctx.stepLabel = label.toUpperCase();\n ctx.actionId = null;\n ctx.actionLabel = null;\n ctx.metrics.stepStartTime = Date.now();\n\n ctx.logger.info({\n category: \"StagehandStep\",\n event: \"started\",\n method: invocation,\n params: args,\n } as FlowEvent);\n\n return ctx.stepId;\n }\n\n static logStagehandStepCompleted(): void {\n const ctx = loggerContext.getStore();\n if (!ctx || !ctx.stepId) return;\n\n const durationMs = ctx.metrics.stepStartTime\n ? Date.now() - ctx.metrics.stepStartTime\n : 0;\n\n ctx.logger.info({\n category: \"StagehandStep\",\n event: \"completed\",\n metrics: { durationMs },\n } as FlowEvent);\n\n // Clear step context\n ctx.stepId = null;\n ctx.stepLabel = null;\n ctx.actionId = null;\n ctx.actionLabel = null;\n ctx.metrics.stepStartTime = undefined;\n }\n\n // ===========================================================================\n // Understudy Action Events\n // ===========================================================================\n\n static logUnderstudyActionEvent({\n actionType,\n target,\n args,\n }: {\n actionType: string;\n target?: string;\n args?: unknown | unknown[];\n }): string {\n const ctx = loggerContext.getStore();\n if (!ctx) return uuidv7();\n\n // Set up action context\n ctx.actionId = uuidv7();\n ctx.actionLabel = actionType\n .toUpperCase()\n .replace(\"UNDERSTUDY.\", \"\")\n .replace(\"PAGE.\", \"\");\n ctx.metrics.actionStartTime = Date.now();\n\n const params: Record<string, unknown> = {};\n if (target) params.target = target;\n if (args) params.args = args;\n\n ctx.logger.info({\n category: \"UnderstudyAction\",\n event: \"started\",\n method: actionType,\n params: Object.keys(params).length > 0 ? params : undefined,\n } as FlowEvent);\n\n return ctx.actionId;\n }\n\n static logUnderstudyActionCompleted(): void {\n const ctx = loggerContext.getStore();\n if (!ctx || !ctx.actionId) return;\n\n const durationMs = ctx.metrics.actionStartTime\n ? Date.now() - ctx.metrics.actionStartTime\n : 0;\n\n ctx.logger.info({\n category: \"UnderstudyAction\",\n event: \"completed\",\n metrics: { durationMs },\n } as FlowEvent);\n\n // Clear action context\n ctx.actionId = null;\n ctx.actionLabel = null;\n ctx.metrics.actionStartTime = undefined;\n }\n\n // ===========================================================================\n // CDP Events\n // ===========================================================================\n\n private static logCdpEvent(\n eventType: \"call\" | \"message\",\n {\n method,\n params,\n targetId,\n }: { method: string; params?: unknown; targetId?: string | null },\n explicitCtx?: FlowLoggerContext | null,\n ): void {\n const ctx = explicitCtx ?? loggerContext.getStore();\n if (!ctx) return;\n if (eventType === \"call\") ctx.metrics.cdpEvents++;\n ctx.logger.info({\n category: \"CDP\",\n event: eventType,\n method,\n params,\n targetId,\n } as FlowEvent);\n }\n\n static logCdpCallEvent(\n data: { method: string; params?: object; targetId?: string | null },\n ctx?: FlowLoggerContext | null,\n ): void {\n SessionFileLogger.logCdpEvent(\"call\", data, ctx);\n }\n\n static logCdpMessageEvent(\n data: { method: string; params?: unknown; targetId?: string | null },\n ctx?: FlowLoggerContext | null,\n ): void {\n SessionFileLogger.logCdpEvent(\"message\", data, ctx);\n }\n\n // ===========================================================================\n // LLM Events\n // ===========================================================================\n\n static logLlmRequest(\n {\n requestId,\n model,\n prompt,\n }: {\n requestId: string;\n model: string;\n operation: string;\n prompt?: string;\n },\n explicitCtx?: FlowLoggerContext | null,\n ): void {\n const ctx = explicitCtx ?? loggerContext.getStore();\n if (!ctx) return;\n\n // Track LLM requests for task metrics\n ctx.metrics.llmRequests++;\n\n ctx.logger.info({\n category: \"LLM\",\n event: \"request\",\n requestId,\n method: \"LLM.request\",\n model,\n prompt,\n });\n }\n\n static logLlmResponse(\n {\n requestId,\n model,\n output,\n inputTokens,\n outputTokens,\n }: {\n requestId: string;\n model: string;\n operation: string;\n output?: string;\n inputTokens?: number;\n outputTokens?: number;\n },\n explicitCtx?: FlowLoggerContext | null,\n ): void {\n const ctx = explicitCtx ?? loggerContext.getStore();\n if (!ctx) return;\n\n // Track tokens for task metrics\n ctx.metrics.llmInputTokens += inputTokens ?? 0;\n ctx.metrics.llmOutputTokens += outputTokens ?? 0;\n\n ctx.logger.info({\n category: \"LLM\",\n event: \"response\",\n requestId,\n method: \"LLM.response\",\n model,\n output,\n inputTokens,\n outputTokens,\n });\n }\n\n // ===========================================================================\n // LLM Logging Middleware\n // ===========================================================================\n\n /**\n * Create middleware for wrapping language models with LLM call logging.\n * Returns a no-op middleware when logging is disabled.\n */\n static createLlmLoggingMiddleware(\n modelId: string,\n ): Pick<LanguageModelMiddleware, \"wrapGenerate\"> {\n // No-op middleware when logging is disabled\n if (!CONFIG_DIR) {\n return {\n wrapGenerate: async ({ doGenerate }) => doGenerate(),\n };\n }\n\n return {\n wrapGenerate: async ({ doGenerate, params }) => {\n const ctx = SessionFileLogger.getContext();\n // Skip logging overhead if no context (shouldn't happen but be safe)\n if (!ctx) {\n return doGenerate();\n }\n const llmRequestId = uuidv7();\n const toolCount = Array.isArray(params.tools) ? params.tools.length : 0;\n\n // Extract prompt preview from last non-system message\n const messages = (params.prompt ?? []) as Array<{\n role?: string;\n content?: unknown;\n }>;\n const lastMsg = messages.filter((m) => m.role !== \"system\").pop();\n const extracted = {\n text: undefined as string | undefined,\n extras: [] as string[],\n };\n\n let rolePrefix = lastMsg?.role ?? \"?\";\n if (lastMsg) {\n if (typeof lastMsg.content === \"string\") {\n extracted.text = lastMsg.content;\n } else if (Array.isArray(lastMsg.content)) {\n // Check for tool-result first\n const toolResult = (\n lastMsg.content as Array<{\n type?: string;\n toolName?: string;\n output?: { type?: string; value?: unknown };\n }>\n ).find((p) => p.type === \"tool-result\");\n if (toolResult) {\n rolePrefix = `tool result: ${toolResult.toolName}()`;\n const out = toolResult.output;\n if (out?.type === \"json\" && out.value) {\n extracted.text = JSON.stringify(out.value).slice(0, 150);\n } else if (Array.isArray(out?.value)) {\n extractFromContent(out.value as unknown[], extracted);\n }\n } else {\n extractFromContent(lastMsg.content as unknown[], extracted);\n }\n }\n }\n\n const promptText = extracted.text || \"(no text)\";\n const promptPreview = `${rolePrefix}: ${promptText} +{${toolCount} tools}`;\n\n SessionFileLogger.logLlmRequest(\n {\n requestId: llmRequestId,\n model: modelId,\n operation: \"generateText\",\n prompt: promptPreview,\n },\n ctx,\n );\n\n const result = await doGenerate();\n\n // Extract output preview\n const res = result as {\n text?: string;\n content?: unknown;\n toolCalls?: unknown[];\n };\n let outputPreview = res.text || \"\";\n if (!outputPreview && res.content) {\n if (typeof res.content === \"string\") {\n outputPreview = res.content;\n } else if (Array.isArray(res.content)) {\n outputPreview = (\n res.content as Array<{\n type?: string;\n text?: string;\n toolName?: string;\n }>\n )\n .map(\n (c) =>\n c.text ||\n (c.type === \"tool-call\"\n ? `tool call: ${c.toolName}()`\n : `[${c.type}]`),\n )\n .join(\" \");\n }\n }\n if (!outputPreview && res.toolCalls?.length) {\n outputPreview = `[${res.toolCalls.length} tool calls]`;\n }\n\n SessionFileLogger.logLlmResponse(\n {\n requestId: llmRequestId,\n model: modelId,\n operation: \"generateText\",\n output: outputPreview || \"[empty]\",\n inputTokens: result.usage?.inputTokens,\n outputTokens: result.usage?.outputTokens,\n },\n ctx,\n );\n\n return result;\n },\n };\n }\n}\n\n/**\n * Method decorator for logging understudy actions with automatic start/complete.\n * Logs all arguments automatically. No-op when CONFIG_DIR is empty.\n */\nexport function logAction(actionType: string) {\n return function <T extends (...args: never[]) => Promise<unknown>>(\n originalMethod: T,\n ): T {\n // No-op when logging is disabled\n if (!CONFIG_DIR) {\n return originalMethod;\n }\n\n return async function (this: unknown, ...args: unknown[]) {\n SessionFileLogger.logUnderstudyActionEvent({\n actionType,\n args: args.length > 0 ? args : undefined,\n });\n\n try {\n return await originalMethod.apply(this, args as never[]);\n } finally {\n SessionFileLogger.logUnderstudyActionCompleted();\n }\n } as T;\n };\n}\n\n/**\n * Method decorator for logging Stagehand step events (act, extract, observe).\n * Only adds logging - does NOT wrap with withInstanceLogContext (caller handles that).\n * No-op when CONFIG_DIR is empty.\n */\nexport function logStagehandStep(invocation: string, label: string) {\n return function <T extends (...args: never[]) => Promise<unknown>>(\n originalMethod: T,\n ): T {\n // No-op when logging is disabled\n if (!CONFIG_DIR) {\n return originalMethod;\n }\n\n return async function (\n this: unknown,\n ...args: unknown[]\n ): Promise<unknown> {\n SessionFileLogger.logStagehandStepEvent({\n invocation,\n args: args.length > 0 ? args : undefined,\n label,\n });\n\n try {\n return await originalMethod.apply(this, args as never[]);\n } finally {\n SessionFileLogger.logStagehandStepCompleted();\n }\n } as T;\n };\n}\n"]}
1
+ {"version":3,"file":"flowLogger.js","sourceRoot":"","sources":["../../../../lib/v3/flowLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC;AAoBpC,MAAM,OAAO,SAAS;IACpB,MAAM,CAAC,aAAa,CAAC,aAAqB;QACxC,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC;QAC5B,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,aAAa,IAAI,GAAG,EAAE,CAAC;IAC7D,CAAC;IAED,uCAAuC;IACvC,SAAS,CAAS;IAClB,OAAO,CAAS;IAChB,cAAc,CAAW;IACzB,SAAS,CAAS;IAClB,SAAS,CAAS;IAClB,IAAI,CAAgB,CAAC,2DAA2D;IAEhF,YAAY,KAAqB;QAC/B,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QACD,IACE,KAAK,CAAC,OAAO;YACb,KAAK,CAAC,aAAa;YACnB,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,EAC5C,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC;YAChD,CAAC,CAAC,KAAK,CAAC,SAAS;YACjB,CAAC,CAAC,GAAG,KAAK,CAAC,SAAS,OAAO,CAAC;QAC9B,IAAI,CAAC,OAAO;YACV,KAAK,CAAC,OAAO,IAAI,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC;QACvE,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC;QACjD,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7D,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/B,CAAC;CACF;AAkBD,MAAM,aAAa,GAAG,IAAI,iBAAiB,EAAqB,CAAC;AAEjE,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF,MAAM,OAAO,UAAU;IACb,MAAM,CAAC,YAAY,CAAC,GAAsB;QAChD,OAAO;YACL,GAAG,GAAG;YACN,YAAY,EAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC7C,GAAG,KAAK;gBACR,cAAc,EAAE,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC;aAC1C,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,IAAI,CAAC,KAAqB;QACvC,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC;QAEtC,MAAM,YAAY,GAAG,IAAI,SAAS,CAAC;YACjC,GAAG,KAAK;YACR,cAAc,EACZ,KAAK,CAAC,cAAc;gBACpB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;YAClD,SAAS,EAAE,GAAG,CAAC,SAAS;SACzB,CAAC,CAAC;QACH,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACxD,OAAO,YAAY,CAAC;IACtB,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAChD,OAA6B,EAC7B,cAAgD;QAEhD,MAAM,GAAG,GAAG,UAAU,CAAC,cAAc,CAAC;QACtC,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;QACnE,IAAI,WAAW,GAAY,IAAI,CAAC;QAEhC,+FAA+F;QAC/F,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClD,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC;QACxB,CAAC;QAED,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC;YACnC,aAAa;YACb,SAAS;YACT,IAAI;YACJ,cAAc;SACf,CAAC,CAAC;QAEH,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAEpC,IAAI,CAAC;YACH,OAAO,MAAM,cAAc,EAAE,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,GAAG,KAAK,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC;gBACd,aAAa;gBACb,SAAS,EAAE,GAAG,SAAS,YAAY;gBACnC,cAAc,EAAE,CAAC,GAAG,YAAY,CAAC,cAAc,EAAE,YAAY,CAAC,OAAO,CAAC;gBACtE,IAAI,EAAE;oBACJ,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;oBAC7D,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;iBACpE;aACF,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;YAC3C,IAAI,WAAW,EAAE,OAAO,KAAK,YAAY,CAAC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;gBAClE,UAAU,CAAC,IAAI,CAAC;oBACd,aAAa;oBACb,SAAS,EAAE,GAAG,SAAS,gBAAgB;oBACvC,cAAc,EAAE;wBACd,GAAG,YAAY,CAAC,cAAc;wBAC9B,YAAY,CAAC,OAAO;qBACrB;oBACD,IAAI,EAAE;wBACJ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE;qBACpE;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,SAAiB,EAAE,QAAsB;QACnD,MAAM,GAAG,GAAsB;YAC7B,SAAS;YACT,QAAQ;YACR,YAAY,EAAE,EAAE;SACjB,CAAC;QAEF,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAkC;QACnD,MAAM,GAAG,GAAG,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;QACxD,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,KAAK,cAAc;QACvB,MAAM,GAAG,GAAG,aAAa,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC;QAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpD,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAED,wFAAwF;IACxF,MAAM,CAAC,eAAe,CACpB,OAA6B;QAE7B,OAAO,UAML,cAA8B;YAC9B,MAAM,aAAa,GAAG,KAAK,WAEzB,GAAG,IAAgC;gBAEnC,OAAO,MAAM,UAAU,CAAC,cAAc,CACpC,OAAO,EACP,CAAC,GAAG,SAAqC,EAAE,EAAE,CAC3C,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAEnC,EACH,IAAI,CACL,CAAC;YACJ,CAAC,CAAC;YAEF,OAAO,aAA0C,CAAC;QACpD,CAAC,CAAC;IACJ,CAAC;IAeD,MAAM,CAAC,cAAc,CACnB,OAA6B,EAC7B,cAAuD,EACvD,MAA8B;QAE9B,MAAM,SAAS,GAAG;YAChB,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;SACpB,CAAC;QAEF,MAAM,OAAO,GAAG,GAAqB,EAAE,CACrC,UAAU,CAAC,6BAA6B,CACtC;YACE,GAAG,OAAO;YACV,IAAI,EAAE,SAAS;SAChB,EACD,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,MAAM,CAAC,CAChC,CAAC;QAEJ,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;YAC5D,OAAO,cAAc,CAAC,GAAG,MAAM,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,OAAO,CAAC,OAAO;YACpB,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;YACtE,CAAC,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAED,8EAA8E;IAC9E,aAAa;IACb,8EAA8E;IAEtE,MAAM,CAAU,gBAAgB,GAAG,IAAI,GAAG,CAAC;QACjD,0BAA0B;QAC1B,iCAAiC;QACjC,mCAAmC;QACnC,kCAAkC;QAClC,qBAAqB;QACrB,sBAAsB;QACtB,yBAAyB;QACzB,oCAAoC;QACpC,mCAAmC;QACnC,2BAA2B;QAC3B,0BAA0B;KAC3B,CAAC,CAAC;IAEK,MAAM,CAAC,WAAW,CACxB,OAA0B,EAC1B,SAA4D,EAC5D,EACE,MAAM,EACN,MAAM,EACN,MAAM,EACN,KAAK,EACL,QAAQ,GAOT,EACD,cAAyB;QAEzB,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;YACtD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,SAAS,KAAK,SAAS,IAAI,UAAU,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAC9D,UAAU,CAAC,IAAI,CAAC;YACd,aAAa,EAAE,GAAG;YAClB,SAAS,EACP,SAAS,KAAK,MAAM;gBAClB,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,SAAS,KAAK,UAAU;oBACxB,CAAC,CAAC,kBAAkB;oBACpB,CAAC,CAAC,SAAS,KAAK,eAAe;wBAC7B,CAAC,CAAC,uBAAuB;wBACzB,CAAC,CAAC,iBAAiB;YAC3B,cAAc;YACd,IAAI,EAAE;gBACJ,MAAM;gBACN,MAAM;gBACN,MAAM;gBACN,KAAK;gBACL,QAAQ;aACT;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,eAAe,CACpB,OAA0B,EAC1B,IAIC;QAED,OAAO,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,mBAAmB,CACxB,OAA0B,EAC1B,WAA0D,EAC1D,IAKC;QAED,UAAU,CAAC,WAAW,CACpB,OAAO,EACP,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,EACzC,IAAI,EACJ,CAAC,GAAG,WAAW,CAAC,cAAc,EAAE,WAAW,CAAC,OAAO,CAAC,CACrD,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,kBAAkB,CACvB,OAA0B,EAC1B,WAA0D,EAC1D,IAIC;QAED,UAAU,CAAC,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE;YAC/C,GAAG,WAAW,CAAC,cAAc;YAC7B,WAAW,CAAC,OAAO;SACpB,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,aAAa;IACb,8EAA8E;IAE9E,MAAM,CAAC,aAAa,CAAC,EACnB,SAAS,EACT,KAAK,EACL,MAAM,GAKP;QACC,UAAU,CAAC,IAAI,CAAC;YACd,aAAa,EAAE,GAAG;YAClB,SAAS,EAAE,iBAAiB;YAC5B,IAAI,EAAE;gBACJ,SAAS;gBACT,KAAK;gBACL,MAAM;aACP;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,EACpB,SAAS,EACT,KAAK,EACL,MAAM,EACN,WAAW,EACX,YAAY,GAOb;QACC,UAAU,CAAC,IAAI,CAAC;YACd,aAAa,EAAE,GAAG;YAClB,SAAS,EAAE,kBAAkB;YAC7B,IAAI,EAAE;gBACJ,SAAS;gBACT,KAAK;gBACL,MAAM;gBACN,WAAW;gBACX,YAAY;aACb;SACF,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,yBAAyB;IACzB,8EAA8E;IAE9E;;;OAGG;IACH,MAAM,CAAC,0BAA0B,CAC/B,OAAe;QAEf,OAAO;YACL,YAAY,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE;gBAC7C,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC;gBAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxE,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAGnC,CAAC;gBACH,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;gBAClE,IAAI,UAAU,GAAG,OAAO,EAAE,IAAI,IAAI,GAAG,CAAC;gBACtC,IAAI,aAAa,GAAG,eAAe,SAAS,SAAS,CAAC;gBAEtD,IAAI,OAAO,EAAE,CAAC;oBACZ,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;wBACxC,aAAa,GAAG,GAAG,OAAO,CAAC,OAAO,MAAM,SAAS,SAAS,CAAC;oBAC7D,CAAC;yBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;wBAC1C,MAAM,UAAU,GACd,OAAO,CAAC,OAKT,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC;wBAE9C,IAAI,UAAU,EAAE,CAAC;4BACf,UAAU,GAAG,gBAAgB,UAAU,CAAC,QAAQ,IAAI,CAAC;4BACrD,IACE,UAAU,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM;gCAClC,UAAU,CAAC,MAAM,CAAC,KAAK,EACvB,CAAC;gCACD,aAAa,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,SAAS,SAAS,CAAC;4BACrF,CAAC;iCAAM,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;gCACnD,aAAa,GAAG,GACd,wBAAwB,CAAC;oCACvB,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK;iCACjC,CAAC,IAAI,WACR,MAAM,SAAS,SAAS,CAAC;4BAC3B,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,aAAa,GAAG,GACd,wBAAwB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;gCACtD,WACF,MAAM,SAAS,SAAS,CAAC;wBAC3B,CAAC;oBACH,CAAC;oBAED,aAAa,GAAG,GAAG,UAAU,KAAK,aAAa,EAAE,CAAC;gBACpD,CAAC;qBAAM,CAAC;oBACN,aAAa,GAAG,MAAM,aAAa,EAAE,CAAC;gBACxC,CAAC;gBAED,UAAU,CAAC,aAAa,CAAC;oBACvB,SAAS,EAAE,YAAY;oBACvB,KAAK,EAAE,OAAO;oBACd,MAAM,EAAE,aAAa;iBACtB,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;gBAElC,yBAAyB;gBACzB,MAAM,GAAG,GAAG,MAIX,CAAC;gBACF,IAAI,aAAa,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;gBACnC,IAAI,CAAC,aAAa,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBAClC,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;wBACpC,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC;oBAC9B,CAAC;yBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;wBACtC,aAAa,GACX,GAAG,CAAC,OAKL;6BACE,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI;4BACN,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW;gCACrB,CAAC,CAAC,cAAc,CAAC,CAAC,QAAQ,IAAI;gCAC9B,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CACrB;6BACA,IAAI,CAAC,GAAG,CAAC,CAAC;oBACf,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,aAAa,IAAI,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;oBAC5C,aAAa,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,cAAc,CAAC;gBACzD,CAAC;gBAED,UAAU,CAAC,cAAc,CAAC;oBACxB,SAAS,EAAE,YAAY;oBACvB,KAAK,EAAE,OAAO;oBACd,MAAM,EAAE,aAAa,IAAI,SAAS;oBAClC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW;oBACtC,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY;iBACzC,CAAC,CAAC;gBAEH,OAAO,MAAM,CAAC;YAChB,CAAC;SACF,CAAC;IACJ,CAAC;;AAsBH,oFAAoF;AACpF,SAAS,wBAAwB,CAAC,OAAkB;IAIlD,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,SAA+B;QACrC,MAAM,EAAE,EAAc;KACvB,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,IAAmB,CAAC;QAC9B,OAAO;QACP,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,CAAC;QACD,2BAA2B;QAC3B,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACjD,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC;YAC7B,IAAI,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC;gBAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;iBAC5C,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI;gBACrB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;gBACtD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3D,CAAC;aAAM,IAAI,CAAC,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/D,CAAC;QACD,mCAAmC;QACnC,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YACzD,MAAM,MAAM,GAAG,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACnD,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YAC5B,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,wBAAwB,CAC/B,KAAwB,EACxB,OAGC;IAED,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,SAA+B;QACrC,MAAM,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC;KACrC,CAAC;IAEF,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,CAAC;SAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IAC3B,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,wBAAwB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxD,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,IAAI,OAAO,EAAE,qBAAqB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAE1D,IAAI,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC;IACzB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5D,CAAC;IACD,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,QAAmD,EACnD,OAAqD;IAErD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC;QACpE,IAAI,CAAC,WAAW;YAAE,OAAO,SAAS,CAAC;QAEnC,OAAO,wBAAwB,CAAC,WAAW,EAAE;YAC3C,qBAAqB,EAAE,IAAI;YAC3B,MAAM,EAAE;gBACN,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9D;SACF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CACxC,QAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACZ,MAAM,GAAG,GAAG,CAAqC,CAAC;YAClD,OAAO,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,CAAC;QAC3D,CAAC,CAAC;aACD,GAAG,EAEO,CAAC;QAEd,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAE/B,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,MAAM,UAAU,4BAA4B,CAAC,MAAe;IAC1D,IAAI,CAAC;QACH,gCAAgC;QAChC,MAAM,KAAK,GACR,MAAiE;YAChE,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK;YACnC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAExC,MAAM,OAAO,GAAG,KAAK;aAClB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,CAAC,GAAG,IAKT,CAAC;YACF,IAAI,CAAC,CAAC,IAAI;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC;YAC1B,IAAI,CAAC,CAAC,YAAY,EAAE,IAAI;gBAAE,OAAO,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;YACrD,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI;gBAAE,OAAO,CAAC,CAAC,IAAI,CAAC;YACnD,OAAO,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC;QAC5B,CAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\nimport { EventEmitter } from \"node:events\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport type { LanguageModelMiddleware } from \"ai\";\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nexport type FlowEventData = Record<string, unknown>;\nexport type FlowEventInput = Omit<\n FlowEvent,\n \"eventId\" | \"createdAt\" | \"sessionId\" | \"eventParentIds\" | \"data\"\n> & {\n eventId?: string;\n eventIdSuffix?: string;\n createdAt?: string;\n sessionId?: string;\n eventParentIds?: string[];\n data?: FlowEventData;\n};\n\nexport class FlowEvent {\n static createEventId(eventIdSuffix: string): string {\n const rawEventId = uuidv7();\n return `${rawEventId.slice(0, -1)}${eventIdSuffix || \"0\"}`;\n }\n\n // base required fields for all events:\n eventType: string;\n eventId: string;\n eventParentIds: string[];\n createdAt: string;\n sessionId: string;\n data: FlowEventData; // event payload (e.g. params, action, result, error, etc.)\n\n constructor(input: FlowEventInput) {\n if (!input.sessionId) {\n throw new Error(\"FlowEvent.sessionId is required.\");\n }\n if (\n input.eventId &&\n input.eventIdSuffix &&\n !input.eventId.endsWith(input.eventIdSuffix)\n ) {\n throw new Error(\"FlowEvent cannot take both eventId and eventIdSuffix.\");\n }\n\n this.eventType = input.eventType.endsWith(\"Event\")\n ? input.eventType\n : `${input.eventType}Event`;\n this.eventId =\n input.eventId ?? FlowEvent.createEventId(input.eventIdSuffix ?? \"0\");\n this.eventParentIds = input.eventParentIds ?? [];\n this.createdAt = input.createdAt ?? new Date().toISOString();\n this.sessionId = input.sessionId;\n this.data = input.data ?? {};\n }\n}\n\nexport interface FlowLoggerContext {\n sessionId: string;\n eventBus: EventEmitter;\n parentEvents: FlowEvent[];\n}\n\ntype AsyncOriginalMethod<\n TArgs extends unknown[] = unknown[],\n TResult = unknown,\n TThis = unknown,\n> = (this: TThis, ...args: TArgs) => Promise<TResult>;\n\ntype FlowLoggerLogOptions = FlowEventInput & {\n context?: FlowLoggerContext;\n};\n\nconst loggerContext = new AsyncLocalStorage<FlowLoggerContext>();\n\nfunction dataToKb(data: string): string {\n return ((data.length * 0.75) / 1024).toFixed(1);\n}\n\n// =============================================================================\n// Flow Logger - Main API\n// =============================================================================\n\nexport class FlowLogger {\n private static cloneContext(ctx: FlowLoggerContext): FlowLoggerContext {\n return {\n ...ctx,\n parentEvents: ctx.parentEvents.map((event) => ({\n ...event,\n eventParentIds: [...event.eventParentIds],\n })),\n };\n }\n\n private static emit(event: FlowEventInput): FlowEvent | null {\n const ctx = FlowLogger.currentContext;\n\n const emittedEvent = new FlowEvent({\n ...event,\n eventParentIds:\n event.eventParentIds ??\n ctx.parentEvents.map((parent) => parent.eventId),\n sessionId: ctx.sessionId,\n });\n ctx.eventBus.emit(emittedEvent.eventType, emittedEvent);\n return emittedEvent;\n }\n\n private static async runWithAutoStatusEventLogging<TResult>(\n options: FlowLoggerLogOptions,\n originalMethod: AsyncOriginalMethod<[], TResult>,\n ): Promise<TResult> {\n const ctx = FlowLogger.currentContext;\n const { data, eventParentIds, eventType, eventIdSuffix } = options;\n let caughtError: unknown = null;\n\n // if eventParentIds is explicitly [], this is a root event, clear the parent events in context\n if (eventParentIds && eventParentIds.length === 0) {\n ctx.parentEvents = [];\n }\n\n const startedEvent = FlowLogger.emit({\n eventIdSuffix,\n eventType,\n data,\n eventParentIds,\n });\n\n ctx.parentEvents.push(startedEvent);\n\n try {\n return await originalMethod();\n } catch (error) {\n caughtError = error;\n FlowLogger.emit({\n eventIdSuffix,\n eventType: `${eventType}ErrorEvent`,\n eventParentIds: [...startedEvent.eventParentIds, startedEvent.eventId],\n data: {\n error: error instanceof Error ? error.message : String(error),\n durationMs: Date.now() - new Date(startedEvent.createdAt).getTime(),\n },\n });\n throw error;\n } finally {\n const parentEvent = ctx.parentEvents.pop();\n if (parentEvent?.eventId === startedEvent.eventId && !caughtError) {\n FlowLogger.emit({\n eventIdSuffix,\n eventType: `${eventType}CompletedEvent`,\n eventParentIds: [\n ...startedEvent.eventParentIds,\n startedEvent.eventId,\n ],\n data: {\n durationMs: Date.now() - new Date(startedEvent.createdAt).getTime(),\n },\n });\n }\n }\n }\n\n /**\n * Initialize a new logging context. Call this at the start of a session.\n */\n static init(sessionId: string, eventBus: EventEmitter): FlowLoggerContext {\n const ctx: FlowLoggerContext = {\n sessionId,\n eventBus,\n parentEvents: [],\n };\n\n loggerContext.enterWith(ctx);\n return ctx;\n }\n\n static async close(context?: FlowLoggerContext | null): Promise<void> {\n const ctx = context ?? loggerContext.getStore() ?? null;\n if (!ctx) return;\n ctx.parentEvents = [];\n }\n\n static get currentContext(): FlowLoggerContext {\n const ctx = loggerContext.getStore() ?? null;\n if (!ctx) {\n throw new Error(\"FlowLogger context is missing.\");\n }\n\n return ctx;\n }\n\n // decorator method to wrap a class method with automatic started/completed/error events\n static wrapWithLogging<TMethod extends AsyncOriginalMethod>(\n options: FlowLoggerLogOptions,\n ) {\n return function <\n TWrappedMethod extends AsyncOriginalMethod<\n Parameters<TMethod>,\n Awaited<ReturnType<TMethod>>,\n ThisParameterType<TMethod>\n >,\n >(originalMethod: TWrappedMethod): TWrappedMethod {\n const wrappedMethod = async function (\n this: ThisParameterType<TWrappedMethod>,\n ...args: Parameters<TWrappedMethod>\n ): Promise<Awaited<ReturnType<TWrappedMethod>>> {\n return await FlowLogger.runWithLogging(\n options,\n (...boundArgs: Parameters<TWrappedMethod>) =>\n originalMethod.apply(this, boundArgs) as Promise<\n Awaited<ReturnType<TWrappedMethod>>\n >,\n args,\n );\n };\n\n return wrappedMethod as unknown as TWrappedMethod;\n };\n }\n\n // closure runner to wrap some async work with automatic started/completed/error events\n // Standard case: the logged params are the same tuple passed to the wrapped method.\n static runWithLogging<TMethod extends AsyncOriginalMethod>(\n options: FlowLoggerLogOptions,\n originalMethod: TMethod,\n params: Readonly<Parameters<TMethod>>,\n ): Promise<Awaited<ReturnType<TMethod>>>;\n // Special case: log an arbitrary params tuple while executing a zero-arg closure.\n static runWithLogging<TResult>(\n options: FlowLoggerLogOptions,\n originalMethod: AsyncOriginalMethod<[], TResult>,\n params: ReadonlyArray<unknown>,\n ): Promise<Awaited<TResult>>;\n static runWithLogging(\n options: FlowLoggerLogOptions,\n originalMethod: AsyncOriginalMethod<unknown[], unknown>,\n params: ReadonlyArray<unknown>,\n ): Promise<unknown> {\n const eventData = {\n ...(options.data ?? {}),\n params: [...params],\n };\n\n const execute = (): Promise<unknown> =>\n FlowLogger.runWithAutoStatusEventLogging(\n {\n ...options,\n data: eventData,\n },\n () => originalMethod(...params),\n );\n\n if (!options.context && !(loggerContext.getStore() ?? null)) {\n return originalMethod(...params);\n }\n\n return options.context\n ? loggerContext.run(FlowLogger.cloneContext(options.context), execute)\n : execute();\n }\n\n // ===========================================================================\n // CDP Events\n // ===========================================================================\n\n private static readonly NOISY_CDP_EVENTS = new Set([\n \"Target.targetInfoChanged\",\n \"Runtime.executionContextCreated\",\n \"Runtime.executionContextDestroyed\",\n \"Runtime.executionContextsCleared\",\n \"Page.lifecycleEvent\",\n \"Network.dataReceived\",\n \"Network.loadingFinished\",\n \"Network.requestWillBeSentExtraInfo\",\n \"Network.responseReceivedExtraInfo\",\n \"Network.requestWillBeSent\",\n \"Network.responseReceived\",\n ]);\n\n private static logCdpEvent(\n context: FlowLoggerContext,\n eventType: \"call\" | \"response\" | \"responseError\" | \"message\",\n {\n method,\n params,\n result,\n error,\n targetId,\n }: {\n method: string;\n params?: unknown;\n result?: unknown;\n error?: string;\n targetId?: string | null;\n },\n eventParentIds?: string[],\n ): FlowEvent | null {\n if (method.endsWith(\".enable\") || method === \"enable\") {\n return null;\n }\n\n if (eventType === \"message\" && FlowLogger.NOISY_CDP_EVENTS.has(method)) {\n return null;\n }\n\n return loggerContext.run(FlowLogger.cloneContext(context), () =>\n FlowLogger.emit({\n eventIdSuffix: \"6\",\n eventType:\n eventType === \"call\"\n ? \"CdpCallEvent\"\n : eventType === \"response\"\n ? \"CdpResponseEvent\"\n : eventType === \"responseError\"\n ? \"CdpResponseErrorEvent\"\n : \"CdpMessageEvent\",\n eventParentIds,\n data: {\n method,\n params,\n result,\n error,\n targetId,\n },\n }),\n );\n }\n\n static logCdpCallEvent(\n context: FlowLoggerContext,\n data: {\n method: string;\n params?: object;\n targetId?: string | null;\n },\n ): FlowEvent | null {\n return FlowLogger.logCdpEvent(context, \"call\", data);\n }\n\n static logCdpResponseEvent(\n context: FlowLoggerContext,\n parentEvent: Pick<FlowEvent, \"eventId\" | \"eventParentIds\">,\n data: {\n method: string;\n result?: unknown;\n error?: string;\n targetId?: string | null;\n },\n ): void {\n FlowLogger.logCdpEvent(\n context,\n data.error ? \"responseError\" : \"response\",\n data,\n [...parentEvent.eventParentIds, parentEvent.eventId],\n );\n }\n\n static logCdpMessageEvent(\n context: FlowLoggerContext,\n parentEvent: Pick<FlowEvent, \"eventId\" | \"eventParentIds\">,\n data: {\n method: string;\n params?: unknown;\n targetId?: string | null;\n },\n ): void {\n FlowLogger.logCdpEvent(context, \"message\", data, [\n ...parentEvent.eventParentIds,\n parentEvent.eventId,\n ]);\n }\n\n // ===========================================================================\n // LLM Events\n // ===========================================================================\n\n static logLlmRequest({\n requestId,\n model,\n prompt,\n }: {\n requestId: string;\n model: string;\n prompt?: string;\n }): void {\n FlowLogger.emit({\n eventIdSuffix: \"7\",\n eventType: \"LlmRequestEvent\",\n data: {\n requestId,\n model,\n prompt,\n },\n });\n }\n\n static logLlmResponse({\n requestId,\n model,\n output,\n inputTokens,\n outputTokens,\n }: {\n requestId: string;\n model: string;\n output?: string;\n inputTokens?: number;\n outputTokens?: number;\n }): void {\n FlowLogger.emit({\n eventIdSuffix: \"7\",\n eventType: \"LlmResponseEvent\",\n data: {\n requestId,\n model,\n output,\n inputTokens,\n outputTokens,\n },\n });\n }\n\n // ===========================================================================\n // LLM Logging Middleware\n // ===========================================================================\n\n /**\n * Create middleware for wrapping language models with LLM call logging.\n * Returns a no-op middleware when logging is disabled.\n */\n static createLlmLoggingMiddleware(\n modelId: string,\n ): Pick<LanguageModelMiddleware, \"wrapGenerate\"> {\n return {\n wrapGenerate: async ({ doGenerate, params }) => {\n const llmRequestId = uuidv7();\n const toolCount = Array.isArray(params.tools) ? params.tools.length : 0;\n const messages = (params.prompt ?? []) as Array<{\n role?: string;\n content?: unknown;\n }>;\n const lastMsg = messages.filter((m) => m.role !== \"system\").pop();\n let rolePrefix = lastMsg?.role ?? \"?\";\n let promptSummary = `(no text) +{${toolCount} tools}`;\n\n if (lastMsg) {\n if (typeof lastMsg.content === \"string\") {\n promptSummary = `${lastMsg.content} +{${toolCount} tools}`;\n } else if (Array.isArray(lastMsg.content)) {\n const toolResult = (\n lastMsg.content as Array<{\n type?: string;\n toolName?: string;\n output?: { type?: string; value?: unknown };\n }>\n ).find((part) => part.type === \"tool-result\");\n\n if (toolResult) {\n rolePrefix = `tool result: ${toolResult.toolName}()`;\n if (\n toolResult.output?.type === \"json\" &&\n toolResult.output.value\n ) {\n promptSummary = `${JSON.stringify(toolResult.output.value)} +{${toolCount} tools}`;\n } else if (Array.isArray(toolResult.output?.value)) {\n promptSummary = `${\n extractLlmMessageSummary({\n content: toolResult.output.value,\n }) ?? \"(no text)\"\n } +{${toolCount} tools}`;\n }\n } else {\n promptSummary = `${\n extractLlmMessageSummary({ content: lastMsg.content }) ??\n \"(no text)\"\n } +{${toolCount} tools}`;\n }\n }\n\n promptSummary = `${rolePrefix}: ${promptSummary}`;\n } else {\n promptSummary = `?: ${promptSummary}`;\n }\n\n FlowLogger.logLlmRequest({\n requestId: llmRequestId,\n model: modelId,\n prompt: promptSummary,\n });\n\n const result = await doGenerate();\n\n // Extract output summary\n const res = result as {\n text?: string;\n content?: unknown;\n toolCalls?: unknown[];\n };\n let outputSummary = res.text || \"\";\n if (!outputSummary && res.content) {\n if (typeof res.content === \"string\") {\n outputSummary = res.content;\n } else if (Array.isArray(res.content)) {\n outputSummary = (\n res.content as Array<{\n type?: string;\n text?: string;\n toolName?: string;\n }>\n )\n .map(\n (c) =>\n c.text ||\n (c.type === \"tool-call\"\n ? `tool call: ${c.toolName}()`\n : `[${c.type}]`),\n )\n .join(\" \");\n }\n }\n if (!outputSummary && res.toolCalls?.length) {\n outputSummary = `[${res.toolCalls.length} tool calls]`;\n }\n\n FlowLogger.logLlmResponse({\n requestId: llmRequestId,\n model: modelId,\n output: outputSummary || \"[empty]\",\n inputTokens: result.usage?.inputTokens,\n outputTokens: result.usage?.outputTokens,\n });\n\n return result;\n },\n };\n }\n}\n\n// =============================================================================\n// LLM Event Extraction Helpers\n// =============================================================================\n\ntype ContentPart = {\n type?: string;\n text?: string;\n content?: unknown[];\n source?: { data?: string };\n image_url?: { url?: string };\n inlineData?: { data?: string };\n};\n\ntype LlmMessageContent = {\n content?: unknown;\n text?: string;\n parts?: unknown[];\n};\n\n/** Extract text and image info from a content array (handles nested tool_result) */\nfunction extractLlmMessageContent(content: unknown[]): {\n text?: string;\n extras: string[];\n} {\n const result = {\n text: undefined as string | undefined,\n extras: [] as string[],\n };\n\n for (const part of content) {\n const p = part as ContentPart;\n // Text\n if (!result.text && p.text) {\n result.text = p.type === \"text\" || !p.type ? p.text : undefined;\n }\n // Images - various formats\n if (p.type === \"image\" || p.type === \"image_url\") {\n const url = p.image_url?.url;\n if (url?.startsWith(\"data:\"))\n result.extras.push(`${dataToKb(url)}kb image`);\n else if (p.source?.data)\n result.extras.push(`${dataToKb(p.source.data)}kb image`);\n else result.extras.push(\"image\");\n } else if (p.source?.data) {\n result.extras.push(`${dataToKb(p.source.data)}kb image`);\n } else if (p.inlineData?.data) {\n result.extras.push(`${dataToKb(p.inlineData.data)}kb image`);\n }\n // Recurse into tool_result content\n if (p.type === \"tool_result\" && Array.isArray(p.content)) {\n const nested = extractLlmMessageContent(p.content);\n if (!result.text && nested.text) {\n result.text = nested.text;\n }\n result.extras.push(...nested.extras);\n }\n }\n\n return result;\n}\n\nfunction extractLlmMessageSummary(\n input: LlmMessageContent,\n options?: {\n trimInstructionPrefix?: boolean;\n extras?: string[];\n },\n): string | undefined {\n const result = {\n text: undefined as string | undefined,\n extras: [...(options?.extras ?? [])],\n };\n\n if (typeof input.content === \"string\") {\n result.text = input.content;\n } else if (typeof input.text === \"string\") {\n result.text = input.text;\n } else if (Array.isArray(input.parts)) {\n const summary = extractLlmMessageContent(input.parts);\n result.text = summary.text;\n result.extras.push(...summary.extras);\n } else if (Array.isArray(input.content)) {\n const summary = extractLlmMessageContent(input.content);\n result.text = summary.text;\n result.extras.push(...summary.extras);\n }\n\n if (options?.trimInstructionPrefix && result.text) {\n result.text = result.text.replace(/^[Ii]nstruction: /, \"\");\n }\n\n const text = result.text;\n if (!text && result.extras.length === 0) return undefined;\n\n let summary = text || \"\";\n if (result.extras.length > 0) {\n const extrasStr = result.extras.map((e) => `+{${e}}`).join(\" \");\n summary = summary ? `${summary} ${extrasStr}` : extrasStr;\n }\n return summary || undefined;\n}\n\n/**\n * Format a prompt summary from LLM messages for logging.\n * Returns format like: \"some text +{5.8kb image} +{schema} +{12 tools}\"\n */\nexport function extractLlmPromptSummary(\n messages: Array<{ role: string; content: unknown }>,\n options?: { toolCount?: number; hasSchema?: boolean },\n): string | undefined {\n try {\n const lastUserMsg = messages.filter((m) => m.role === \"user\").pop();\n if (!lastUserMsg) return undefined;\n\n return extractLlmMessageSummary(lastUserMsg, {\n trimInstructionPrefix: true,\n extras: [\n ...(options?.hasSchema ? [\"schema\"] : []),\n ...(options?.toolCount ? [`${options.toolCount} tools`] : []),\n ],\n });\n } catch {\n return undefined;\n }\n}\n\n/**\n * Extract a text summary from CUA-style messages.\n * Accepts various message formats (Anthropic, OpenAI, Google).\n */\nexport function extractLlmCuaPromptSummary(\n messages: unknown[],\n): string | undefined {\n try {\n const lastMsg = messages\n .filter((m) => {\n const msg = m as { role?: string; type?: string };\n return msg.role === \"user\" || msg.type === \"tool_result\";\n })\n .pop() as\n | { content?: unknown; parts?: unknown[]; text?: string }\n | undefined;\n\n if (!lastMsg) return undefined;\n\n return extractLlmMessageSummary(lastMsg);\n } catch {\n return undefined;\n }\n}\n\n/** Format a CUA response summary for logging */\nexport function extractLlmCuaResponseSummary(output: unknown): string {\n try {\n // Handle Google format or array\n const items: unknown[] =\n (output as { candidates?: [{ content?: { parts?: unknown[] } }] })\n ?.candidates?.[0]?.content?.parts ??\n (Array.isArray(output) ? output : []);\n\n const summary = items\n .map((item) => {\n const i = item as {\n type?: string;\n text?: string;\n name?: string;\n functionCall?: { name?: string };\n };\n if (i.text) return i.text;\n if (i.functionCall?.name) return i.functionCall.name;\n if (i.type === \"tool_use\" && i.name) return i.name;\n return i.type ?? \"[item]\";\n })\n .join(\" \");\n\n return summary;\n } catch {\n return \"[error]\";\n }\n}\n"]}
@@ -56,8 +56,7 @@ export class ActHandler {
56
56
  async act(params) {
57
57
  const { instruction, page, variables, timeout, model } = params;
58
58
  const llmClient = this.resolveLlmClient(model);
59
- const effectiveTimeoutMs = typeof timeout === "number" && timeout > 0 ? timeout : undefined;
60
- const ensureTimeRemaining = createTimeoutGuard(effectiveTimeoutMs, (ms) => new ActTimeoutError(ms));
59
+ const ensureTimeRemaining = createTimeoutGuard(timeout, (ms) => new ActTimeoutError(ms));
61
60
  ensureTimeRemaining();
62
61
  await waitForDomNetworkQuiet(page.mainFrame(), this.defaultDomSettleTimeoutMs);
63
62
  ensureTimeRemaining();
@@ -1 +1 @@
1
- {"version":3,"file":"actHandler.js","sourceRoot":"","sources":["../../../../../lib/v3/handlers/actHandler.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/handlers/actHandler.ts\nimport { act as actInference } from \"../../inference.js\";\nimport { buildActPrompt, buildStepTwoPrompt } from \"../../prompt.js\";\nimport { trimTrailingTextNode } from \"../../utils.js\";\nimport { v3Logger } from \"../logger.js\";\nimport { ActHandlerParams } from \"../types/private/handlers.js\";\nimport { ActResult, Action, V3FunctionName } from \"../types/public/methods.js\";\nimport { ActTimeoutError } from \"../types/public/sdkErrors.js\";\nimport {\n captureHybridSnapshot,\n diffCombinedTrees,\n} from \"../understudy/a11y/snapshot/index.js\";\nimport { LLMClient } from \"../llm/LLMClient.js\";\nimport { SupportedUnderstudyAction } from \"../types/private/index.js\";\nimport { EncodedId } from \"../types/private/internal.js\";\nimport {\n AvailableModel,\n ClientOptions,\n ModelConfiguration,\n} from \"../types/public/model.js\";\nimport type { Variables } from \"../types/public/agent.js\";\nimport type { Page } from \"../understudy/page.js\";\nimport {\n performUnderstudyMethod,\n waitForDomNetworkQuiet,\n} from \"./handlerUtils/actHandlerUtils.js\";\nimport { createTimeoutGuard } from \"./handlerUtils/timeoutGuard.js\";\nimport { resolveVariableValue } from \"../agent/utils/variables.js\";\n\ntype ActInferenceElement = {\n elementId?: string;\n description: string;\n method?: string;\n arguments?: string[];\n};\n\ntype ActInferenceResponse = Awaited<ReturnType<typeof actInference>>;\n\nexport class ActHandler {\n private readonly llmClient: LLMClient;\n private readonly defaultModelName: AvailableModel;\n private readonly defaultClientOptions: ClientOptions;\n private readonly resolveLlmClient: (model?: ModelConfiguration) => LLMClient;\n private readonly systemPrompt: string;\n private readonly logInferenceToFile: boolean;\n private readonly selfHeal: boolean;\n private readonly onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void;\n private readonly defaultDomSettleTimeoutMs?: number;\n\n constructor(\n llmClient: LLMClient,\n defaultModelName: AvailableModel,\n defaultClientOptions: ClientOptions,\n resolveLlmClient: (model?: ModelConfiguration) => LLMClient,\n systemPrompt?: string,\n logInferenceToFile?: boolean,\n selfHeal?: boolean,\n onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void,\n defaultDomSettleTimeoutMs?: number,\n ) {\n this.llmClient = llmClient;\n this.defaultModelName = defaultModelName;\n this.defaultClientOptions = defaultClientOptions;\n this.resolveLlmClient = resolveLlmClient;\n this.systemPrompt = systemPrompt ?? \"\";\n this.logInferenceToFile = logInferenceToFile ?? false;\n this.selfHeal = !!selfHeal;\n this.onMetrics = onMetrics;\n this.defaultDomSettleTimeoutMs = defaultDomSettleTimeoutMs;\n }\n\n private recordActMetrics(response: ActInferenceResponse): void {\n this.onMetrics?.(\n V3FunctionName.ACT,\n response.prompt_tokens ?? 0,\n response.completion_tokens ?? 0,\n response.reasoning_tokens ?? 0,\n response.cached_input_tokens ?? 0,\n response.inference_time_ms ?? 0,\n );\n }\n\n private async getActionFromLLM({\n instruction,\n domElements,\n xpathMap,\n llmClient,\n requireMethodAndArguments = true,\n }: {\n instruction: string;\n domElements: string;\n xpathMap: Record<string, string>;\n llmClient: LLMClient;\n requireMethodAndArguments?: boolean;\n }): Promise<{ action?: Action; response: ActInferenceResponse }> {\n const response = await actInference({\n instruction,\n domElements,\n llmClient,\n userProvidedInstructions: this.systemPrompt,\n logger: v3Logger,\n logInferenceToFile: this.logInferenceToFile,\n });\n\n this.recordActMetrics(response);\n\n const normalized = normalizeActInferenceElement(\n response.element as ActInferenceElement | undefined,\n xpathMap,\n requireMethodAndArguments,\n );\n\n if (!normalized) {\n return { response };\n }\n\n return {\n action: { ...normalized } as Action,\n response,\n };\n }\n\n async act(params: ActHandlerParams): Promise<ActResult> {\n const { instruction, page, variables, timeout, model } = params;\n\n const llmClient = this.resolveLlmClient(model);\n const effectiveTimeoutMs =\n typeof timeout === \"number\" && timeout > 0 ? timeout : undefined;\n\n const ensureTimeRemaining = createTimeoutGuard(\n effectiveTimeoutMs,\n (ms) => new ActTimeoutError(ms),\n );\n\n ensureTimeRemaining();\n await waitForDomNetworkQuiet(\n page.mainFrame(),\n this.defaultDomSettleTimeoutMs,\n );\n ensureTimeRemaining();\n const { combinedTree, combinedXpathMap } = await captureHybridSnapshot(\n page,\n { experimental: true },\n );\n\n const actInstruction = buildActPrompt(\n instruction,\n Object.values(SupportedUnderstudyAction),\n variables,\n );\n\n ensureTimeRemaining();\n const { action: firstAction, response: actInferenceResponse } =\n await this.getActionFromLLM({\n instruction: actInstruction,\n domElements: combinedTree,\n xpathMap: combinedXpathMap,\n llmClient,\n });\n\n if (!firstAction) {\n v3Logger({\n category: \"action\",\n message: \"no actionable element returned by LLM\",\n level: 1,\n });\n return {\n success: false,\n message: \"Failed to perform act: No action found\",\n actionDescription: instruction,\n actions: [],\n };\n }\n\n // First action (self-heal aware path)\n ensureTimeRemaining();\n const firstResult = await this.takeDeterministicAction(\n firstAction,\n page,\n this.defaultDomSettleTimeoutMs,\n llmClient,\n ensureTimeRemaining,\n variables,\n );\n\n // If not two-step, return the first action result\n if (actInferenceResponse?.twoStep !== true) {\n return firstResult;\n }\n\n // Take a new focused snapshot and observe again\n ensureTimeRemaining();\n const { combinedTree: combinedTree2, combinedXpathMap: combinedXpathMap2 } =\n await captureHybridSnapshot(page, {\n experimental: true,\n });\n\n let diffedTree = diffCombinedTrees(combinedTree, combinedTree2);\n if (!diffedTree.trim()) {\n // Fallback: if no diff detected, use the fresh tree to avoid empty context\n diffedTree = combinedTree2;\n }\n\n const previousAction = `method: ${firstAction.method}, description: ${firstAction.description}, arguments: ${firstAction.arguments}`;\n\n const stepTwoInstructions = buildStepTwoPrompt(\n instruction,\n previousAction,\n Object.values(SupportedUnderstudyAction).filter(\n (\n action,\n ): action is Exclude<\n SupportedUnderstudyAction,\n SupportedUnderstudyAction.SELECT_OPTION_FROM_DROPDOWN\n > => action !== SupportedUnderstudyAction.SELECT_OPTION_FROM_DROPDOWN,\n ),\n variables,\n );\n\n ensureTimeRemaining();\n const { action: secondAction } = await this.getActionFromLLM({\n instruction: stepTwoInstructions,\n domElements: diffedTree,\n xpathMap: combinedXpathMap2,\n llmClient,\n });\n\n if (!secondAction) {\n // No second action found — return first result as-is\n return firstResult;\n }\n\n ensureTimeRemaining();\n const secondResult = await this.takeDeterministicAction(\n secondAction,\n page,\n this.defaultDomSettleTimeoutMs,\n llmClient,\n ensureTimeRemaining,\n variables,\n );\n\n // Combine results\n return {\n success: firstResult.success && secondResult.success,\n message: secondResult.success\n ? `${firstResult.message} → ${secondResult.message}`\n : `${firstResult.message} → ${secondResult.message}`,\n actionDescription: firstResult.actionDescription,\n actions: [\n ...(firstResult.actions || []),\n ...(secondResult.actions || []),\n ],\n };\n }\n\n async takeDeterministicAction(\n action: Action,\n page: Page,\n domSettleTimeoutMs?: number,\n llmClientOverride?: LLMClient,\n ensureTimeRemaining?: () => void,\n variables?: Variables,\n ): Promise<ActResult> {\n ensureTimeRemaining?.();\n const settleTimeout = domSettleTimeoutMs ?? this.defaultDomSettleTimeoutMs;\n const effectiveClient = llmClientOverride ?? this.llmClient;\n const method = action.method?.trim();\n if (!method || method === \"not-supported\") {\n v3Logger({\n category: \"action\",\n message: \"action has no supported method\",\n level: 0,\n auxiliary: {\n act: { value: JSON.stringify(action), type: \"object\" },\n },\n });\n return {\n success: false,\n message: `Unable to perform action: The method '${method ?? \"\"}' is not supported in Action. Please use a supported Playwright locator method.`,\n actionDescription:\n action.description || `Action (${method ?? \"unknown\"})`,\n actions: [],\n };\n }\n\n const placeholderArgs = Array.isArray(action.arguments)\n ? [...action.arguments]\n : [];\n const resolvedArgs =\n substituteVariablesInArguments(action.arguments, variables) ?? [];\n\n try {\n ensureTimeRemaining?.();\n await performUnderstudyMethod(\n page,\n page.mainFrame(),\n method,\n action.selector,\n resolvedArgs,\n settleTimeout,\n );\n return {\n success: true,\n message: `Action [${method}] performed successfully on selector: ${action.selector}`,\n actionDescription: action.description || `action (${method})`,\n actions: [\n {\n selector: action.selector,\n description: action.description || `action (${method})`,\n method,\n arguments: placeholderArgs,\n },\n ],\n };\n } catch (err) {\n if (err instanceof ActTimeoutError) {\n throw err;\n }\n const msg = err instanceof Error ? err.message : String(err);\n\n // Attempt self-heal: rerun actInference and retry with updated selector\n if (this.selfHeal) {\n v3Logger({\n category: \"action\",\n message:\n \"Error performing action. Reprocessing the page and trying again\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n action: {\n value: JSON.stringify(action),\n type: \"object\",\n },\n },\n });\n\n try {\n // Build an instruction combining method + description, avoiding duplication\n const actCommand = action.description\n ? action.description.toLowerCase().startsWith(method.toLowerCase())\n ? action.description\n : `${method} ${action.description}`\n : method;\n\n // Take a fresh snapshot and ask for a new actionable element\n ensureTimeRemaining?.();\n const { combinedTree, combinedXpathMap } =\n await captureHybridSnapshot(page, {\n experimental: true,\n });\n\n const instruction = buildActPrompt(\n actCommand,\n Object.values(SupportedUnderstudyAction),\n {},\n );\n\n ensureTimeRemaining?.();\n const { action: fallbackAction, response: fallbackResponse } =\n await this.getActionFromLLM({\n instruction,\n domElements: combinedTree,\n xpathMap: combinedXpathMap,\n llmClient: effectiveClient,\n requireMethodAndArguments: false,\n });\n\n const fallbackElement = fallbackResponse.element;\n if (!fallbackElement) {\n return {\n success: false,\n message:\n \"Failed to self-heal act: No observe results found for action\",\n actionDescription: actCommand,\n actions: [],\n };\n }\n\n // Retry with original method/args but new selector from fallback\n let newSelector = action.selector;\n if (fallbackAction?.selector) {\n newSelector = fallbackAction.selector;\n }\n\n ensureTimeRemaining?.();\n await performUnderstudyMethod(\n page,\n page.mainFrame(),\n method,\n newSelector,\n resolvedArgs,\n settleTimeout,\n );\n\n return {\n success: true,\n message: `Action [${method}] performed successfully on selector: ${newSelector}`,\n actionDescription: action.description || `action (${method})`,\n actions: [\n {\n selector: newSelector,\n description: action.description || `action (${method})`,\n method,\n arguments: placeholderArgs,\n },\n ],\n };\n } catch (retryErr) {\n if (retryErr instanceof ActTimeoutError) {\n throw retryErr;\n }\n const retryMsg =\n retryErr instanceof Error ? retryErr.message : String(retryErr);\n return {\n success: false,\n message: `Failed to perform act after self-heal: ${retryMsg}`,\n actionDescription: action.description || `action (${method})`,\n actions: [],\n };\n }\n }\n\n return {\n success: false,\n message: `Failed to perform act: ${msg}`,\n actionDescription: action.description || `action (${method})`,\n actions: [],\n };\n }\n }\n}\n\nfunction normalizeActInferenceElement(\n element: ActInferenceElement | undefined,\n xpathMap: Record<string, string>,\n requireMethodAndArguments = true,\n): Action | undefined {\n if (!element) {\n return undefined;\n }\n const { elementId, description, method, arguments: args } = element;\n const hasArgs = Array.isArray(args);\n\n if (\n requireMethodAndArguments &&\n (!method || method === \"not-supported\" || !hasArgs)\n ) {\n return undefined;\n }\n\n if (typeof elementId !== \"string\" || !elementId.includes(\"-\")) {\n return undefined;\n }\n\n const xp = xpathMap[elementId as EncodedId];\n const trimmed = trimTrailingTextNode(xp);\n if (!trimmed) {\n return undefined;\n }\n\n // For dragAndDrop, convert element ID in arguments to xpath (target element)\n let resolvedArgs = hasArgs ? args : undefined;\n if (method === \"dragAndDrop\" && hasArgs && args.length > 0) {\n const targetArg = args[0];\n // Check if argument looks like an element ID (e.g., \"1-67\")\n if (typeof targetArg === \"string\" && /^\\d+-\\d+$/.test(targetArg)) {\n const argXpath = xpathMap[targetArg as EncodedId];\n const trimmedArgXpath = trimTrailingTextNode(argXpath);\n if (trimmedArgXpath) {\n resolvedArgs = [`xpath=${trimmedArgXpath}`, ...args.slice(1)];\n } else {\n // Target element lookup failed, filter out this action\n v3Logger({\n category: \"action\",\n message: \"dragAndDrop target element lookup failed\",\n level: 1,\n auxiliary: {\n targetElementId: { value: targetArg, type: \"string\" },\n sourceElementId: { value: elementId, type: \"string\" },\n },\n });\n return undefined;\n }\n } else {\n v3Logger({\n category: \"action\",\n message: \"dragAndDrop target element invalid ID format\",\n level: 0,\n auxiliary: {\n targetElementId: { value: String(targetArg), type: \"string\" },\n sourceElementId: { value: elementId, type: \"string\" },\n },\n });\n return undefined;\n }\n }\n\n return {\n description,\n method,\n arguments: resolvedArgs,\n selector: `xpath=${trimmed}`,\n } as Action;\n}\n\nfunction substituteVariablesInArguments(\n args: string[] | undefined,\n variables?: Variables,\n): string[] | undefined {\n if (!variables || !Array.isArray(args)) {\n return args;\n }\n\n return args.map((arg: string) => {\n let out = arg;\n for (const [key, v] of Object.entries(variables)) {\n const token = `%${key}%`;\n out = out.split(token).join(resolveVariableValue(v));\n }\n return out;\n });\n}\n"]}
1
+ {"version":3,"file":"actHandler.js","sourceRoot":"","sources":["../../../../../lib/v3/handlers/actHandler.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/handlers/actHandler.ts\nimport { act as actInference } from \"../../inference.js\";\nimport { buildActPrompt, buildStepTwoPrompt } from \"../../prompt.js\";\nimport { trimTrailingTextNode } from \"../../utils.js\";\nimport { v3Logger } from \"../logger.js\";\nimport { ActHandlerParams } from \"../types/private/handlers.js\";\nimport { ActResult, Action, V3FunctionName } from \"../types/public/methods.js\";\nimport { ActTimeoutError } from \"../types/public/sdkErrors.js\";\nimport {\n captureHybridSnapshot,\n diffCombinedTrees,\n} from \"../understudy/a11y/snapshot/index.js\";\nimport { LLMClient } from \"../llm/LLMClient.js\";\nimport { SupportedUnderstudyAction } from \"../types/private/index.js\";\nimport { EncodedId } from \"../types/private/internal.js\";\nimport {\n AvailableModel,\n ClientOptions,\n ModelConfiguration,\n} from \"../types/public/model.js\";\nimport type { Variables } from \"../types/public/agent.js\";\nimport type { Page } from \"../understudy/page.js\";\nimport {\n performUnderstudyMethod,\n waitForDomNetworkQuiet,\n} from \"./handlerUtils/actHandlerUtils.js\";\nimport { createTimeoutGuard } from \"./handlerUtils/timeoutGuard.js\";\nimport { resolveVariableValue } from \"../agent/utils/variables.js\";\n\ntype ActInferenceElement = {\n elementId?: string;\n description: string;\n method?: string;\n arguments?: string[];\n};\n\ntype ActInferenceResponse = Awaited<ReturnType<typeof actInference>>;\n\nexport class ActHandler {\n private readonly llmClient: LLMClient;\n private readonly defaultModelName: AvailableModel;\n private readonly defaultClientOptions: ClientOptions;\n private readonly resolveLlmClient: (model?: ModelConfiguration) => LLMClient;\n private readonly systemPrompt: string;\n private readonly logInferenceToFile: boolean;\n private readonly selfHeal: boolean;\n private readonly onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void;\n private readonly defaultDomSettleTimeoutMs?: number;\n\n constructor(\n llmClient: LLMClient,\n defaultModelName: AvailableModel,\n defaultClientOptions: ClientOptions,\n resolveLlmClient: (model?: ModelConfiguration) => LLMClient,\n systemPrompt?: string,\n logInferenceToFile?: boolean,\n selfHeal?: boolean,\n onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void,\n defaultDomSettleTimeoutMs?: number,\n ) {\n this.llmClient = llmClient;\n this.defaultModelName = defaultModelName;\n this.defaultClientOptions = defaultClientOptions;\n this.resolveLlmClient = resolveLlmClient;\n this.systemPrompt = systemPrompt ?? \"\";\n this.logInferenceToFile = logInferenceToFile ?? false;\n this.selfHeal = !!selfHeal;\n this.onMetrics = onMetrics;\n this.defaultDomSettleTimeoutMs = defaultDomSettleTimeoutMs;\n }\n\n private recordActMetrics(response: ActInferenceResponse): void {\n this.onMetrics?.(\n V3FunctionName.ACT,\n response.prompt_tokens ?? 0,\n response.completion_tokens ?? 0,\n response.reasoning_tokens ?? 0,\n response.cached_input_tokens ?? 0,\n response.inference_time_ms ?? 0,\n );\n }\n\n private async getActionFromLLM({\n instruction,\n domElements,\n xpathMap,\n llmClient,\n requireMethodAndArguments = true,\n }: {\n instruction: string;\n domElements: string;\n xpathMap: Record<string, string>;\n llmClient: LLMClient;\n requireMethodAndArguments?: boolean;\n }): Promise<{ action?: Action; response: ActInferenceResponse }> {\n const response = await actInference({\n instruction,\n domElements,\n llmClient,\n userProvidedInstructions: this.systemPrompt,\n logger: v3Logger,\n logInferenceToFile: this.logInferenceToFile,\n });\n\n this.recordActMetrics(response);\n\n const normalized = normalizeActInferenceElement(\n response.element as ActInferenceElement | undefined,\n xpathMap,\n requireMethodAndArguments,\n );\n\n if (!normalized) {\n return { response };\n }\n\n return {\n action: { ...normalized } as Action,\n response,\n };\n }\n\n async act(params: ActHandlerParams): Promise<ActResult> {\n const { instruction, page, variables, timeout, model } = params;\n\n const llmClient = this.resolveLlmClient(model);\n const ensureTimeRemaining = createTimeoutGuard(\n timeout,\n (ms) => new ActTimeoutError(ms),\n );\n\n ensureTimeRemaining();\n await waitForDomNetworkQuiet(\n page.mainFrame(),\n this.defaultDomSettleTimeoutMs,\n );\n ensureTimeRemaining();\n const { combinedTree, combinedXpathMap } = await captureHybridSnapshot(\n page,\n { experimental: true },\n );\n\n const actInstruction = buildActPrompt(\n instruction,\n Object.values(SupportedUnderstudyAction),\n variables,\n );\n\n ensureTimeRemaining();\n const { action: firstAction, response: actInferenceResponse } =\n await this.getActionFromLLM({\n instruction: actInstruction,\n domElements: combinedTree,\n xpathMap: combinedXpathMap,\n llmClient,\n });\n\n if (!firstAction) {\n v3Logger({\n category: \"action\",\n message: \"no actionable element returned by LLM\",\n level: 1,\n });\n return {\n success: false,\n message: \"Failed to perform act: No action found\",\n actionDescription: instruction,\n actions: [],\n };\n }\n\n // First action (self-heal aware path)\n ensureTimeRemaining();\n const firstResult = await this.takeDeterministicAction(\n firstAction,\n page,\n this.defaultDomSettleTimeoutMs,\n llmClient,\n ensureTimeRemaining,\n variables,\n );\n\n // If not two-step, return the first action result\n if (actInferenceResponse?.twoStep !== true) {\n return firstResult;\n }\n\n // Take a new focused snapshot and observe again\n ensureTimeRemaining();\n const { combinedTree: combinedTree2, combinedXpathMap: combinedXpathMap2 } =\n await captureHybridSnapshot(page, {\n experimental: true,\n });\n\n let diffedTree = diffCombinedTrees(combinedTree, combinedTree2);\n if (!diffedTree.trim()) {\n // Fallback: if no diff detected, use the fresh tree to avoid empty context\n diffedTree = combinedTree2;\n }\n\n const previousAction = `method: ${firstAction.method}, description: ${firstAction.description}, arguments: ${firstAction.arguments}`;\n\n const stepTwoInstructions = buildStepTwoPrompt(\n instruction,\n previousAction,\n Object.values(SupportedUnderstudyAction).filter(\n (\n action,\n ): action is Exclude<\n SupportedUnderstudyAction,\n SupportedUnderstudyAction.SELECT_OPTION_FROM_DROPDOWN\n > => action !== SupportedUnderstudyAction.SELECT_OPTION_FROM_DROPDOWN,\n ),\n variables,\n );\n\n ensureTimeRemaining();\n const { action: secondAction } = await this.getActionFromLLM({\n instruction: stepTwoInstructions,\n domElements: diffedTree,\n xpathMap: combinedXpathMap2,\n llmClient,\n });\n\n if (!secondAction) {\n // No second action found — return first result as-is\n return firstResult;\n }\n\n ensureTimeRemaining();\n const secondResult = await this.takeDeterministicAction(\n secondAction,\n page,\n this.defaultDomSettleTimeoutMs,\n llmClient,\n ensureTimeRemaining,\n variables,\n );\n\n // Combine results\n return {\n success: firstResult.success && secondResult.success,\n message: secondResult.success\n ? `${firstResult.message} → ${secondResult.message}`\n : `${firstResult.message} → ${secondResult.message}`,\n actionDescription: firstResult.actionDescription,\n actions: [\n ...(firstResult.actions || []),\n ...(secondResult.actions || []),\n ],\n };\n }\n\n async takeDeterministicAction(\n action: Action,\n page: Page,\n domSettleTimeoutMs?: number,\n llmClientOverride?: LLMClient,\n ensureTimeRemaining?: () => void,\n variables?: Variables,\n ): Promise<ActResult> {\n ensureTimeRemaining?.();\n const settleTimeout = domSettleTimeoutMs ?? this.defaultDomSettleTimeoutMs;\n const effectiveClient = llmClientOverride ?? this.llmClient;\n const method = action.method?.trim();\n if (!method || method === \"not-supported\") {\n v3Logger({\n category: \"action\",\n message: \"action has no supported method\",\n level: 0,\n auxiliary: {\n act: { value: JSON.stringify(action), type: \"object\" },\n },\n });\n return {\n success: false,\n message: `Unable to perform action: The method '${method ?? \"\"}' is not supported in Action. Please use a supported Playwright locator method.`,\n actionDescription:\n action.description || `Action (${method ?? \"unknown\"})`,\n actions: [],\n };\n }\n\n const placeholderArgs = Array.isArray(action.arguments)\n ? [...action.arguments]\n : [];\n const resolvedArgs =\n substituteVariablesInArguments(action.arguments, variables) ?? [];\n\n try {\n ensureTimeRemaining?.();\n await performUnderstudyMethod(\n page,\n page.mainFrame(),\n method,\n action.selector,\n resolvedArgs,\n settleTimeout,\n );\n return {\n success: true,\n message: `Action [${method}] performed successfully on selector: ${action.selector}`,\n actionDescription: action.description || `action (${method})`,\n actions: [\n {\n selector: action.selector,\n description: action.description || `action (${method})`,\n method,\n arguments: placeholderArgs,\n },\n ],\n };\n } catch (err) {\n if (err instanceof ActTimeoutError) {\n throw err;\n }\n const msg = err instanceof Error ? err.message : String(err);\n\n // Attempt self-heal: rerun actInference and retry with updated selector\n if (this.selfHeal) {\n v3Logger({\n category: \"action\",\n message:\n \"Error performing action. Reprocessing the page and trying again\",\n level: 1,\n auxiliary: {\n error: { value: msg, type: \"string\" },\n action: {\n value: JSON.stringify(action),\n type: \"object\",\n },\n },\n });\n\n try {\n // Build an instruction combining method + description, avoiding duplication\n const actCommand = action.description\n ? action.description.toLowerCase().startsWith(method.toLowerCase())\n ? action.description\n : `${method} ${action.description}`\n : method;\n\n // Take a fresh snapshot and ask for a new actionable element\n ensureTimeRemaining?.();\n const { combinedTree, combinedXpathMap } =\n await captureHybridSnapshot(page, {\n experimental: true,\n });\n\n const instruction = buildActPrompt(\n actCommand,\n Object.values(SupportedUnderstudyAction),\n {},\n );\n\n ensureTimeRemaining?.();\n const { action: fallbackAction, response: fallbackResponse } =\n await this.getActionFromLLM({\n instruction,\n domElements: combinedTree,\n xpathMap: combinedXpathMap,\n llmClient: effectiveClient,\n requireMethodAndArguments: false,\n });\n\n const fallbackElement = fallbackResponse.element;\n if (!fallbackElement) {\n return {\n success: false,\n message:\n \"Failed to self-heal act: No observe results found for action\",\n actionDescription: actCommand,\n actions: [],\n };\n }\n\n // Retry with original method/args but new selector from fallback\n let newSelector = action.selector;\n if (fallbackAction?.selector) {\n newSelector = fallbackAction.selector;\n }\n\n ensureTimeRemaining?.();\n await performUnderstudyMethod(\n page,\n page.mainFrame(),\n method,\n newSelector,\n resolvedArgs,\n settleTimeout,\n );\n\n return {\n success: true,\n message: `Action [${method}] performed successfully on selector: ${newSelector}`,\n actionDescription: action.description || `action (${method})`,\n actions: [\n {\n selector: newSelector,\n description: action.description || `action (${method})`,\n method,\n arguments: placeholderArgs,\n },\n ],\n };\n } catch (retryErr) {\n if (retryErr instanceof ActTimeoutError) {\n throw retryErr;\n }\n const retryMsg =\n retryErr instanceof Error ? retryErr.message : String(retryErr);\n return {\n success: false,\n message: `Failed to perform act after self-heal: ${retryMsg}`,\n actionDescription: action.description || `action (${method})`,\n actions: [],\n };\n }\n }\n\n return {\n success: false,\n message: `Failed to perform act: ${msg}`,\n actionDescription: action.description || `action (${method})`,\n actions: [],\n };\n }\n }\n}\n\nfunction normalizeActInferenceElement(\n element: ActInferenceElement | undefined,\n xpathMap: Record<string, string>,\n requireMethodAndArguments = true,\n): Action | undefined {\n if (!element) {\n return undefined;\n }\n const { elementId, description, method, arguments: args } = element;\n const hasArgs = Array.isArray(args);\n\n if (\n requireMethodAndArguments &&\n (!method || method === \"not-supported\" || !hasArgs)\n ) {\n return undefined;\n }\n\n if (typeof elementId !== \"string\" || !elementId.includes(\"-\")) {\n return undefined;\n }\n\n const xp = xpathMap[elementId as EncodedId];\n const trimmed = trimTrailingTextNode(xp);\n if (!trimmed) {\n return undefined;\n }\n\n // For dragAndDrop, convert element ID in arguments to xpath (target element)\n let resolvedArgs = hasArgs ? args : undefined;\n if (method === \"dragAndDrop\" && hasArgs && args.length > 0) {\n const targetArg = args[0];\n // Check if argument looks like an element ID (e.g., \"1-67\")\n if (typeof targetArg === \"string\" && /^\\d+-\\d+$/.test(targetArg)) {\n const argXpath = xpathMap[targetArg as EncodedId];\n const trimmedArgXpath = trimTrailingTextNode(argXpath);\n if (trimmedArgXpath) {\n resolvedArgs = [`xpath=${trimmedArgXpath}`, ...args.slice(1)];\n } else {\n // Target element lookup failed, filter out this action\n v3Logger({\n category: \"action\",\n message: \"dragAndDrop target element lookup failed\",\n level: 1,\n auxiliary: {\n targetElementId: { value: targetArg, type: \"string\" },\n sourceElementId: { value: elementId, type: \"string\" },\n },\n });\n return undefined;\n }\n } else {\n v3Logger({\n category: \"action\",\n message: \"dragAndDrop target element invalid ID format\",\n level: 0,\n auxiliary: {\n targetElementId: { value: String(targetArg), type: \"string\" },\n sourceElementId: { value: elementId, type: \"string\" },\n },\n });\n return undefined;\n }\n }\n\n return {\n description,\n method,\n arguments: resolvedArgs,\n selector: `xpath=${trimmed}`,\n } as Action;\n}\n\nfunction substituteVariablesInArguments(\n args: string[] | undefined,\n variables?: Variables,\n): string[] | undefined {\n if (!variables || !Array.isArray(args)) {\n return args;\n }\n\n return args.map((arg: string) => {\n let out = arg;\n for (const [key, v] of Object.entries(variables)) {\n const token = `%${key}%`;\n out = out.split(token).join(resolveVariableValue(v));\n }\n return out;\n });\n}\n"]}
@@ -43,8 +43,7 @@ export class ExtractHandler {
43
43
  async extract(params) {
44
44
  const { instruction, schema, page, selector, timeout, model } = params;
45
45
  const llmClient = this.resolveLlmClient(model);
46
- const effectiveTimeoutMs = typeof timeout === "number" && timeout > 0 ? timeout : undefined;
47
- const ensureTimeRemaining = createTimeoutGuard(effectiveTimeoutMs, (ms) => new ExtractTimeoutError(ms));
46
+ const ensureTimeRemaining = createTimeoutGuard(timeout, (ms) => new ExtractTimeoutError(ms));
48
47
  // No-args → page text (parity with v2)
49
48
  const noArgs = !instruction && !schema;
50
49
  if (noArgs) {
@@ -54,6 +53,7 @@ export class ExtractHandler {
54
53
  experimental: this.experimental,
55
54
  focusSelector: focusSelector || undefined,
56
55
  });
56
+ ensureTimeRemaining();
57
57
  const result = { pageText: snap.combinedTree };
58
58
  // Validate via the same schema used in v2
59
59
  return pageTextSchema.parse(result);
@@ -1 +1 @@
1
- {"version":3,"file":"extractHandler.js","sourceRoot":"","sources":["../../../../../lib/v3/handlers/extractHandler.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/handlers/extractHandler.ts\nimport { extract as runExtract } from \"../../inference.js\";\nimport {\n getZFactory,\n getZodType,\n injectUrls,\n transformSchema,\n} from \"../../utils.js\";\nimport { v3Logger } from \"../logger.js\";\nimport { V3FunctionName } from \"../types/public/methods.js\";\nimport { captureHybridSnapshot } from \"../understudy/a11y/snapshot/index.js\";\nimport type { ZodTypeAny } from \"zod\";\nimport { LLMClient } from \"../llm/LLMClient.js\";\nimport { ExtractHandlerParams } from \"../types/private/handlers.js\";\nimport { EncodedId, ZodPathSegments } from \"../types/private/internal.js\";\nimport {\n defaultExtractSchema,\n pageTextSchema,\n} from \"../types/public/methods.js\";\nimport {\n AvailableModel,\n ClientOptions,\n ModelConfiguration,\n} from \"../types/public/model.js\";\nimport {\n StagehandInvalidArgumentError,\n ExtractTimeoutError,\n} from \"../types/public/sdkErrors.js\";\nimport { createTimeoutGuard } from \"./handlerUtils/timeoutGuard.js\";\nimport type {\n InferStagehandSchema,\n StagehandZodObject,\n StagehandZodSchema,\n} from \"../zodCompat.js\";\n\n/**\n * Scans the provided Zod schema for any `z.string().url()` fields and\n * replaces them with `z.number()`.\n *\n * @param schema - The Zod object schema to transform.\n * @returns A tuple containing:\n * 1. The transformed schema (or the original schema if no changes were needed).\n * 2. An array of {@link ZodPathSegments} objects representing all the replaced URL fields,\n * with each path segment showing where in the schema the replacement occurred.\n */\nexport function transformUrlStringsToNumericIds<T extends StagehandZodSchema>(\n schema: T,\n): [StagehandZodSchema, ZodPathSegments[]] {\n const [finalSchema, urlPaths] = transformSchema(schema, []);\n return [finalSchema, urlPaths];\n}\n\ninterface ExtractionResponseBase {\n metadata: { completed: boolean };\n prompt_tokens: number;\n completion_tokens: number;\n reasoning_tokens: number;\n cached_input_tokens?: number;\n inference_time_ms: number;\n}\n\ntype ExtractionResponse<T extends StagehandZodObject> = ExtractionResponseBase &\n InferStagehandSchema<T>;\n\nexport class ExtractHandler {\n private readonly llmClient: LLMClient;\n private readonly defaultModelName: AvailableModel;\n private readonly defaultClientOptions: ClientOptions;\n private readonly resolveLlmClient: (model?: ModelConfiguration) => LLMClient;\n private readonly systemPrompt: string;\n private readonly logInferenceToFile: boolean;\n private readonly experimental: boolean;\n private readonly onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void;\n\n constructor(\n llmClient: LLMClient,\n defaultModelName: AvailableModel,\n defaultClientOptions: ClientOptions,\n resolveLlmClient: (model?: ModelConfiguration) => LLMClient,\n systemPrompt?: string,\n logInferenceToFile?: boolean,\n experimental?: boolean,\n onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void,\n ) {\n this.llmClient = llmClient;\n this.defaultModelName = defaultModelName;\n this.defaultClientOptions = defaultClientOptions;\n this.resolveLlmClient = resolveLlmClient;\n this.systemPrompt = systemPrompt ?? \"\";\n this.logInferenceToFile = logInferenceToFile ?? false;\n this.experimental = experimental ?? false;\n this.onMetrics = onMetrics;\n }\n\n async extract<T extends StagehandZodSchema>(\n params: ExtractHandlerParams<T>,\n ): Promise<InferStagehandSchema<T> | { pageText: string }> {\n const { instruction, schema, page, selector, timeout, model } = params;\n\n const llmClient = this.resolveLlmClient(model);\n\n const effectiveTimeoutMs =\n typeof timeout === \"number\" && timeout > 0 ? timeout : undefined;\n const ensureTimeRemaining = createTimeoutGuard(\n effectiveTimeoutMs,\n (ms) => new ExtractTimeoutError(ms),\n );\n\n // No-args → page text (parity with v2)\n const noArgs = !instruction && !schema;\n if (noArgs) {\n const focusSelector = selector?.replace(/^xpath=/i, \"\") ?? \"\";\n ensureTimeRemaining();\n const snap = await captureHybridSnapshot(page, {\n experimental: this.experimental,\n focusSelector: focusSelector || undefined,\n });\n\n const result = { pageText: snap.combinedTree };\n // Validate via the same schema used in v2\n return pageTextSchema.parse(result);\n }\n\n if (!instruction && schema) {\n throw new StagehandInvalidArgumentError(\n \"extract() requires an instruction when a schema is provided.\",\n );\n }\n\n const focusSelector = selector?.replace(/^xpath=/, \"\") ?? \"\";\n\n // Build the hybrid snapshot (includes combinedTree; combinedUrlMap optional)\n ensureTimeRemaining();\n const { combinedTree, combinedUrlMap } = await captureHybridSnapshot(page, {\n experimental: this.experimental,\n focusSelector: focusSelector,\n });\n\n v3Logger({\n category: \"extraction\",\n message: \"Starting extraction using a11y snapshot\",\n level: 1,\n auxiliary: instruction\n ? { instruction: { value: instruction, type: \"string\" } }\n : undefined,\n });\n\n // Normalize schema: if instruction provided without schema, use defaultExtractSchema\n const baseSchema: StagehandZodSchema = (schema ??\n defaultExtractSchema) as StagehandZodSchema;\n // Ensure we pass an object schema into inference; wrap non-object schemas\n const isObjectSchema = getZodType(baseSchema) === \"object\";\n const WRAP_KEY = \"value\" as const;\n const factory = getZFactory(baseSchema);\n const objectSchema: StagehandZodObject = isObjectSchema\n ? (baseSchema as StagehandZodObject)\n : (factory.object({\n [WRAP_KEY]: baseSchema as ZodTypeAny,\n }) as StagehandZodObject);\n\n const [transformedSchema, urlFieldPaths] =\n transformUrlStringsToNumericIds(objectSchema);\n\n ensureTimeRemaining();\n const extractionResponse: ExtractionResponse<StagehandZodObject> =\n await runExtract<StagehandZodObject>({\n instruction,\n domElements: combinedTree,\n schema: transformedSchema as StagehandZodObject,\n llmClient,\n userProvidedInstructions: this.systemPrompt,\n logger: v3Logger,\n logInferenceToFile: this.logInferenceToFile,\n });\n\n const {\n metadata: { completed },\n prompt_tokens,\n completion_tokens,\n reasoning_tokens = 0,\n cached_input_tokens = 0,\n inference_time_ms,\n ...rest\n } = extractionResponse;\n let output = rest as InferStagehandSchema<StagehandZodObject>;\n\n // Update EXTRACT metrics from the LLM calls\n this.onMetrics?.(\n V3FunctionName.EXTRACT,\n prompt_tokens,\n completion_tokens,\n reasoning_tokens,\n cached_input_tokens,\n inference_time_ms,\n );\n\n // Re-inject URLs for any url() fields we temporarily converted to number()\n const idToUrl: Record<EncodedId, string> = (combinedUrlMap ?? {}) as Record<\n EncodedId,\n string\n >;\n for (const { segments } of urlFieldPaths) {\n injectUrls(\n output as Record<string, unknown>,\n segments,\n idToUrl as unknown as Record<string, string>,\n );\n }\n // If we wrapped a non-object schema, unwrap the value\n if (!isObjectSchema && output && typeof output === \"object\") {\n output = (output as Record<string, unknown>)[WRAP_KEY];\n }\n\n const resultPreviewLength = 200;\n const resultString = JSON.stringify(output) ?? \"undefined\";\n const resultPreview =\n resultString.length > resultPreviewLength\n ? resultString.slice(0, resultPreviewLength) + \"...\"\n : resultString;\n\n v3Logger({\n category: \"extraction\",\n message: completed\n ? \"Extraction completed successfully\"\n : \"Extraction incomplete after processing all data\",\n level: 1,\n auxiliary: {\n prompt_tokens: { value: String(prompt_tokens), type: \"string\" },\n completion_tokens: { value: String(completion_tokens), type: \"string\" },\n inference_time_ms: {\n value: String(inference_time_ms),\n type: \"string\",\n },\n result: { value: resultPreview, type: \"string\" },\n },\n });\n\n return output as InferStagehandSchema<T>;\n }\n}\n"]}
1
+ {"version":3,"file":"extractHandler.js","sourceRoot":"","sources":["../../../../../lib/v3/handlers/extractHandler.ts"],"names":[],"mappings":"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","sourcesContent":["// lib/v3/handlers/extractHandler.ts\nimport { extract as runExtract } from \"../../inference.js\";\nimport {\n getZFactory,\n getZodType,\n injectUrls,\n transformSchema,\n} from \"../../utils.js\";\nimport { v3Logger } from \"../logger.js\";\nimport { V3FunctionName } from \"../types/public/methods.js\";\nimport { captureHybridSnapshot } from \"../understudy/a11y/snapshot/index.js\";\nimport type { ZodTypeAny } from \"zod\";\nimport { LLMClient } from \"../llm/LLMClient.js\";\nimport { ExtractHandlerParams } from \"../types/private/handlers.js\";\nimport { EncodedId, ZodPathSegments } from \"../types/private/internal.js\";\nimport {\n defaultExtractSchema,\n pageTextSchema,\n} from \"../types/public/methods.js\";\nimport {\n AvailableModel,\n ClientOptions,\n ModelConfiguration,\n} from \"../types/public/model.js\";\nimport {\n StagehandInvalidArgumentError,\n ExtractTimeoutError,\n} from \"../types/public/sdkErrors.js\";\nimport { createTimeoutGuard } from \"./handlerUtils/timeoutGuard.js\";\nimport type {\n InferStagehandSchema,\n StagehandZodObject,\n StagehandZodSchema,\n} from \"../zodCompat.js\";\n\n/**\n * Scans the provided Zod schema for any `z.string().url()` fields and\n * replaces them with `z.number()`.\n *\n * @param schema - The Zod object schema to transform.\n * @returns A tuple containing:\n * 1. The transformed schema (or the original schema if no changes were needed).\n * 2. An array of {@link ZodPathSegments} objects representing all the replaced URL fields,\n * with each path segment showing where in the schema the replacement occurred.\n */\nexport function transformUrlStringsToNumericIds<T extends StagehandZodSchema>(\n schema: T,\n): [StagehandZodSchema, ZodPathSegments[]] {\n const [finalSchema, urlPaths] = transformSchema(schema, []);\n return [finalSchema, urlPaths];\n}\n\ninterface ExtractionResponseBase {\n metadata: { completed: boolean };\n prompt_tokens: number;\n completion_tokens: number;\n reasoning_tokens: number;\n cached_input_tokens?: number;\n inference_time_ms: number;\n}\n\ntype ExtractionResponse<T extends StagehandZodObject> = ExtractionResponseBase &\n InferStagehandSchema<T>;\n\nexport class ExtractHandler {\n private readonly llmClient: LLMClient;\n private readonly defaultModelName: AvailableModel;\n private readonly defaultClientOptions: ClientOptions;\n private readonly resolveLlmClient: (model?: ModelConfiguration) => LLMClient;\n private readonly systemPrompt: string;\n private readonly logInferenceToFile: boolean;\n private readonly experimental: boolean;\n private readonly onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void;\n\n constructor(\n llmClient: LLMClient,\n defaultModelName: AvailableModel,\n defaultClientOptions: ClientOptions,\n resolveLlmClient: (model?: ModelConfiguration) => LLMClient,\n systemPrompt?: string,\n logInferenceToFile?: boolean,\n experimental?: boolean,\n onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void,\n ) {\n this.llmClient = llmClient;\n this.defaultModelName = defaultModelName;\n this.defaultClientOptions = defaultClientOptions;\n this.resolveLlmClient = resolveLlmClient;\n this.systemPrompt = systemPrompt ?? \"\";\n this.logInferenceToFile = logInferenceToFile ?? false;\n this.experimental = experimental ?? false;\n this.onMetrics = onMetrics;\n }\n\n async extract<T extends StagehandZodSchema>(\n params: ExtractHandlerParams<T>,\n ): Promise<InferStagehandSchema<T> | { pageText: string }> {\n const { instruction, schema, page, selector, timeout, model } = params;\n\n const llmClient = this.resolveLlmClient(model);\n\n const ensureTimeRemaining = createTimeoutGuard(\n timeout,\n (ms) => new ExtractTimeoutError(ms),\n );\n\n // No-args → page text (parity with v2)\n const noArgs = !instruction && !schema;\n if (noArgs) {\n const focusSelector = selector?.replace(/^xpath=/i, \"\") ?? \"\";\n ensureTimeRemaining();\n const snap = await captureHybridSnapshot(page, {\n experimental: this.experimental,\n focusSelector: focusSelector || undefined,\n });\n ensureTimeRemaining();\n\n const result = { pageText: snap.combinedTree };\n // Validate via the same schema used in v2\n return pageTextSchema.parse(result);\n }\n\n if (!instruction && schema) {\n throw new StagehandInvalidArgumentError(\n \"extract() requires an instruction when a schema is provided.\",\n );\n }\n\n const focusSelector = selector?.replace(/^xpath=/, \"\") ?? \"\";\n\n // Build the hybrid snapshot (includes combinedTree; combinedUrlMap optional)\n ensureTimeRemaining();\n const { combinedTree, combinedUrlMap } = await captureHybridSnapshot(page, {\n experimental: this.experimental,\n focusSelector: focusSelector,\n });\n\n v3Logger({\n category: \"extraction\",\n message: \"Starting extraction using a11y snapshot\",\n level: 1,\n auxiliary: instruction\n ? { instruction: { value: instruction, type: \"string\" } }\n : undefined,\n });\n\n // Normalize schema: if instruction provided without schema, use defaultExtractSchema\n const baseSchema: StagehandZodSchema = (schema ??\n defaultExtractSchema) as StagehandZodSchema;\n // Ensure we pass an object schema into inference; wrap non-object schemas\n const isObjectSchema = getZodType(baseSchema) === \"object\";\n const WRAP_KEY = \"value\" as const;\n const factory = getZFactory(baseSchema);\n const objectSchema: StagehandZodObject = isObjectSchema\n ? (baseSchema as StagehandZodObject)\n : (factory.object({\n [WRAP_KEY]: baseSchema as ZodTypeAny,\n }) as StagehandZodObject);\n\n const [transformedSchema, urlFieldPaths] =\n transformUrlStringsToNumericIds(objectSchema);\n\n ensureTimeRemaining();\n const extractionResponse: ExtractionResponse<StagehandZodObject> =\n await runExtract<StagehandZodObject>({\n instruction,\n domElements: combinedTree,\n schema: transformedSchema as StagehandZodObject,\n llmClient,\n userProvidedInstructions: this.systemPrompt,\n logger: v3Logger,\n logInferenceToFile: this.logInferenceToFile,\n });\n\n const {\n metadata: { completed },\n prompt_tokens,\n completion_tokens,\n reasoning_tokens = 0,\n cached_input_tokens = 0,\n inference_time_ms,\n ...rest\n } = extractionResponse;\n let output = rest as InferStagehandSchema<StagehandZodObject>;\n\n // Update EXTRACT metrics from the LLM calls\n this.onMetrics?.(\n V3FunctionName.EXTRACT,\n prompt_tokens,\n completion_tokens,\n reasoning_tokens,\n cached_input_tokens,\n inference_time_ms,\n );\n\n // Re-inject URLs for any url() fields we temporarily converted to number()\n const idToUrl: Record<EncodedId, string> = (combinedUrlMap ?? {}) as Record<\n EncodedId,\n string\n >;\n for (const { segments } of urlFieldPaths) {\n injectUrls(\n output as Record<string, unknown>,\n segments,\n idToUrl as unknown as Record<string, string>,\n );\n }\n // If we wrapped a non-object schema, unwrap the value\n if (!isObjectSchema && output && typeof output === \"object\") {\n output = (output as Record<string, unknown>)[WRAP_KEY];\n }\n\n const resultPreviewLength = 200;\n const resultString = JSON.stringify(output) ?? \"undefined\";\n const resultPreview =\n resultString.length > resultPreviewLength\n ? resultString.slice(0, resultPreviewLength) + \"...\"\n : resultString;\n\n v3Logger({\n category: \"extraction\",\n message: completed\n ? \"Extraction completed successfully\"\n : \"Extraction incomplete after processing all data\",\n level: 1,\n auxiliary: {\n prompt_tokens: { value: String(prompt_tokens), type: \"string\" },\n completion_tokens: { value: String(completion_tokens), type: \"string\" },\n inference_time_ms: {\n value: String(inference_time_ms),\n type: \"string\",\n },\n result: { value: resultPreview, type: \"string\" },\n },\n });\n\n return output as InferStagehandSchema<T>;\n }\n}\n"]}
@@ -1,6 +1,7 @@
1
1
  import { resolveLocatorWithHops } from "../../understudy/deepLocator.js";
2
2
  import { v3Logger } from "../../logger.js";
3
- import { SessionFileLogger } from "../../flowLogger.js";
3
+ import { FlowLogger } from "../../flowLogger.js";
4
+ import { toTitleCase } from "../../../utils.js";
4
5
  import { StagehandClickError, UnderstudyCommandException, } from "../../types/public/sdkErrors.js";
5
6
  // Normalize cases where the XPath is the root "/" to point to the HTML element.
6
7
  function normalizeRootXPath(input) {
@@ -36,38 +37,28 @@ export async function performUnderstudyMethod(page, frame, method, rawXPath, arg
36
37
  initialUrl,
37
38
  domSettleTimeoutMs,
38
39
  };
39
- SessionFileLogger.logUnderstudyActionEvent({
40
- actionType: `Understudy.${method}`,
41
- target: selectorRaw,
42
- args: Array.from(args),
43
- });
40
+ const eventType = `Understudy${toTitleCase(method)}`; // e.g. "UnderstudyClick"
44
41
  try {
45
- const handler = METHOD_HANDLER_MAP[method] ?? null;
46
- if (handler) {
47
- await handler(ctx);
48
- }
49
- else {
50
- // Accept a few common locator method aliases
51
- switch (method) {
52
- case "click":
53
- await clickElement(ctx);
54
- break;
55
- case "fill":
56
- await fillOrType(ctx);
57
- break;
58
- case "type":
59
- await typeText(ctx);
60
- break;
61
- default:
62
- v3Logger({
63
- category: "action",
64
- message: "chosen method is invalid",
65
- level: 1,
66
- auxiliary: { method: { value: method, type: "string" } },
67
- });
68
- throw new UnderstudyCommandException(`Method ${method} not supported`);
42
+ await FlowLogger.runWithLogging({
43
+ eventType,
44
+ eventIdSuffix: "5",
45
+ data: {
46
+ target: selectorRaw,
47
+ },
48
+ }, async () => {
49
+ const handler = METHOD_HANDLER_MAP[method] ?? null;
50
+ if (handler) {
51
+ await handler(ctx);
52
+ return;
69
53
  }
70
- }
54
+ v3Logger({
55
+ category: "action",
56
+ message: "chosen method is invalid",
57
+ level: 1,
58
+ auxiliary: { method: { value: method, type: "string" } },
59
+ });
60
+ throw new UnderstudyCommandException(`Method ${method} not supported`);
61
+ }, args);
71
62
  }
72
63
  catch (e) {
73
64
  const msg = e instanceof Error ? e.message : String(e);
@@ -89,9 +80,6 @@ export async function performUnderstudyMethod(page, frame, method, rawXPath, arg
89
80
  }
90
81
  throw new UnderstudyCommandException(msg, e);
91
82
  }
92
- finally {
93
- SessionFileLogger.logUnderstudyActionCompleted();
94
- }
95
83
  }
96
84
  /* ===================== Handlers & Map ===================== */
97
85
  const METHOD_HANDLER_MAP = {