@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,207 +0,0 @@
1
- import { JSDOM } from "jsdom";
2
- import { afterAll, beforeAll, beforeEach, describe, expect, it } from "vitest";
3
- import { rerenderMissingShadowHosts } from "../../lib/v3/dom/rerenderMissingShadows.runtime.js";
4
- const globalRef = globalThis;
5
- const originalGlobals = {
6
- window: globalRef.window,
7
- document: globalRef.document,
8
- Node: globalRef.Node,
9
- NodeFilter: globalRef.NodeFilter,
10
- Element: globalRef.Element,
11
- HTMLElement: globalRef.HTMLElement,
12
- Document: globalRef.Document,
13
- DocumentFragment: globalRef.DocumentFragment,
14
- ShadowRoot: globalRef.ShadowRoot,
15
- customElements: globalRef.customElements,
16
- };
17
- let dom;
18
- const installDomGlobals = () => {
19
- const win = dom.window;
20
- globalRef.window = win;
21
- globalRef.document = win.document;
22
- globalRef.Node = win.Node;
23
- globalRef.NodeFilter = win.NodeFilter;
24
- globalRef.Element = win.Element;
25
- globalRef.HTMLElement = win.HTMLElement;
26
- globalRef.Document = win.Document;
27
- globalRef.DocumentFragment =
28
- win.DocumentFragment;
29
- globalRef.ShadowRoot = win.ShadowRoot;
30
- globalRef.customElements =
31
- win.customElements;
32
- };
33
- const restoreDomGlobals = () => {
34
- for (const [key, value] of Object.entries(originalGlobals)) {
35
- if (value === undefined) {
36
- delete globalRef[key];
37
- }
38
- else {
39
- globalRef[key] = value;
40
- }
41
- }
42
- };
43
- /**
44
- * Helper: set up a fake piercer on `window.__stagehandV3__` backed by a WeakMap.
45
- * Returns the WeakMap so tests can inspect tracked roots.
46
- */
47
- function installFakePiercer() {
48
- const closedRoots = new WeakMap();
49
- const win = globalRef.window;
50
- win.__stagehandV3__ = {
51
- getClosedRoot: (el) => closedRoots.get(el) ?? null,
52
- stats: false,
53
- };
54
- return closedRoots;
55
- }
56
- describe("rerenderMissingShadowHosts", () => {
57
- beforeAll(() => {
58
- dom = new JSDOM("<!doctype html><html><body></body></html>");
59
- installDomGlobals();
60
- });
61
- afterAll(() => {
62
- dom.window.close();
63
- restoreDomGlobals();
64
- });
65
- beforeEach(() => {
66
- document.body.innerHTML = "";
67
- // Clean up any stale custom element registrations by recreating the DOM
68
- // (JSDOM doesn't support undefining custom elements, but we can use unique tag names per test)
69
- });
70
- it("re-renders a custom element with closed shadow so piercer can track it", () => {
71
- const closedRoots = installFakePiercer();
72
- const tag = "test-closed-a";
73
- let constructorCalled = 0;
74
- customElements.define(tag, class extends HTMLElement {
75
- constructor() {
76
- super();
77
- constructorCalled++;
78
- const root = this.attachShadow({ mode: "closed" });
79
- root.innerHTML = "<span>shadow</span>";
80
- // Simulate piercer intercepting attachShadow
81
- closedRoots.set(this, root);
82
- }
83
- });
84
- // Manually insert via innerHTML so the constructor fires once for the original
85
- document.body.innerHTML = `<${tag}></${tag}>`;
86
- const original = document.querySelector(tag);
87
- // The original was created by innerHTML which does call the constructor in JSDOM
88
- const callsBefore = constructorCalled;
89
- // Remove the tracked root to simulate "created before piercer was installed"
90
- closedRoots.delete(original);
91
- rerenderMissingShadowHosts();
92
- const fresh = document.querySelector(tag);
93
- // Constructor was called again for the fresh element
94
- expect(constructorCalled).toBe(callsBefore + 1);
95
- // Piercer now tracks the new element's closed root
96
- expect(closedRoots.has(fresh)).toBe(true);
97
- });
98
- it("skips elements that already have an open shadow root", () => {
99
- installFakePiercer();
100
- const tag = "test-open-b";
101
- customElements.define(tag, class extends HTMLElement {
102
- constructor() {
103
- super();
104
- this.attachShadow({ mode: "open" });
105
- }
106
- });
107
- document.body.innerHTML = `<${tag}></${tag}>`;
108
- const original = document.querySelector(tag);
109
- rerenderMissingShadowHosts();
110
- // Element should NOT have been replaced
111
- expect(document.querySelector(tag)).toBe(original);
112
- });
113
- it("skips elements whose closed root is already tracked by piercer", () => {
114
- const closedRoots = installFakePiercer();
115
- const tag = "test-tracked-c";
116
- customElements.define(tag, class extends HTMLElement {
117
- constructor() {
118
- super();
119
- const root = this.attachShadow({ mode: "closed" });
120
- closedRoots.set(this, root);
121
- }
122
- });
123
- document.body.innerHTML = `<${tag}></${tag}>`;
124
- const original = document.querySelector(tag);
125
- rerenderMissingShadowHosts();
126
- // Element should NOT have been replaced since piercer already knows about it
127
- expect(document.querySelector(tag)).toBe(original);
128
- });
129
- it("transfers attributes to the fresh element", () => {
130
- const closedRoots = installFakePiercer();
131
- const tag = "test-attrs-d";
132
- customElements.define(tag, class extends HTMLElement {
133
- constructor() {
134
- super();
135
- const root = this.attachShadow({ mode: "closed" });
136
- closedRoots.set(this, root);
137
- }
138
- });
139
- document.body.innerHTML = `<${tag} id="myid" class="foo bar" data-x="123"></${tag}>`;
140
- const original = document.querySelector(tag);
141
- // Remove tracking to force re-render
142
- closedRoots.delete(original);
143
- rerenderMissingShadowHosts();
144
- const fresh = document.querySelector(tag);
145
- expect(fresh).not.toBe(original);
146
- expect(fresh.getAttribute("id")).toBe("myid");
147
- expect(fresh.getAttribute("class")).toBe("foo bar");
148
- expect(fresh.getAttribute("data-x")).toBe("123");
149
- });
150
- it("moves light DOM children to the fresh element", () => {
151
- const closedRoots = installFakePiercer();
152
- const tag = "test-children-e";
153
- customElements.define(tag, class extends HTMLElement {
154
- constructor() {
155
- super();
156
- const root = this.attachShadow({ mode: "closed" });
157
- root.innerHTML = "<slot></slot>";
158
- closedRoots.set(this, root);
159
- }
160
- });
161
- document.body.innerHTML = `<${tag}><span class="child1">A</span><span class="child2">B</span></${tag}>`;
162
- const original = document.querySelector(tag);
163
- const child1 = original.querySelector(".child1");
164
- const child2 = original.querySelector(".child2");
165
- // Remove tracking to force re-render
166
- closedRoots.delete(original);
167
- rerenderMissingShadowHosts();
168
- const fresh = document.querySelector(tag);
169
- expect(fresh).not.toBe(original);
170
- // Children should have been moved (same DOM nodes, not cloned)
171
- expect(fresh.querySelector(".child1")).toBe(child1);
172
- expect(fresh.querySelector(".child2")).toBe(child2);
173
- expect(fresh.children.length).toBe(2);
174
- });
175
- it("skips elements whose constructor throws without breaking the rest", () => {
176
- const closedRoots = installFakePiercer();
177
- const tagBad = "test-throws-f";
178
- const tagGood = "test-good-f";
179
- let badCreated = false;
180
- customElements.define(tagBad, class extends HTMLElement {
181
- constructor() {
182
- super();
183
- if (badCreated) {
184
- throw new Error("constructor boom");
185
- }
186
- badCreated = true;
187
- }
188
- });
189
- customElements.define(tagGood, class extends HTMLElement {
190
- constructor() {
191
- super();
192
- const root = this.attachShadow({ mode: "closed" });
193
- closedRoots.set(this, root);
194
- }
195
- });
196
- document.body.innerHTML = `<${tagBad}></${tagBad}><${tagGood}></${tagGood}>`;
197
- // Remove tracking from the good element so it needs re-render
198
- const goodOriginal = document.querySelector(tagGood);
199
- closedRoots.delete(goodOriginal);
200
- // Should not throw even though tagBad's constructor will throw on re-create
201
- expect(() => rerenderMissingShadowHosts()).not.toThrow();
202
- // The good element should have been re-rendered successfully
203
- const freshGood = document.querySelector(tagGood);
204
- expect(closedRoots.has(freshGood)).toBe(true);
205
- });
206
- });
207
- //# sourceMappingURL=rerender-missing-shadows.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rerender-missing-shadows.test.js","sourceRoot":"","sources":["../../../../tests/unit/rerender-missing-shadows.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC/E,OAAO,EAAE,0BAA0B,EAAE,MAAM,oDAAoD,CAAC;AAehG,MAAM,SAAS,GAAG,UAAqD,CAAC;AACxE,MAAM,eAAe,GAAwB;IAC3C,MAAM,EAAE,SAAS,CAAC,MAAM;IACxB,QAAQ,EAAE,SAAS,CAAC,QAAQ;IAC5B,IAAI,EAAE,SAAS,CAAC,IAAI;IACpB,UAAU,EAAE,SAAS,CAAC,UAAU;IAChC,OAAO,EAAE,SAAS,CAAC,OAAO;IAC1B,WAAW,EAAE,SAAS,CAAC,WAAW;IAClC,QAAQ,EAAE,SAAS,CAAC,QAAQ;IAC5B,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;IAC5C,UAAU,EAAE,SAAS,CAAC,UAAU;IAChC,cAAc,EAAE,SAAS,CAAC,cAAc;CACzC,CAAC;AAEF,IAAI,GAAU,CAAC;AAEf,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IACvB,SAAS,CAAC,MAAM,GAAG,GAA4C,CAAC;IAChE,SAAS,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAClC,SAAS,CAAC,IAAI,GAAG,GAAG,CAAC,IAA8B,CAAC;IACpD,SAAS,CAAC,UAAU,GAAG,GAAG,CAAC,UAA0C,CAAC;IACtE,SAAS,CAAC,OAAO,GAAG,GAAG,CAAC,OAAoC,CAAC;IAC7D,SAAS,CAAC,WAAW,GAAG,GAAG,CAAC,WAA4C,CAAC;IACzE,SAAS,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAsC,CAAC;IAChE,SAAS,CAAC,gBAAgB;QACxB,GAAG,CAAC,gBAAsD,CAAC;IAC7D,SAAS,CAAC,UAAU,GAAG,GAAG,CAAC,UAA0C,CAAC;IACtE,SAAS,CAAC,cAAc;QACtB,GAAG,CAAC,cAAkD,CAAC;AAC3D,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,GAAG,EAAE;IAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAC3D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAQ,SAAqC,CAAC,GAAG,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACL,SAAqC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtD,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,SAAS,kBAAkB;IACzB,MAAM,WAAW,GAAG,IAAI,OAAO,EAAuB,CAAC;IACvD,MAAM,GAAG,GAAG,SAAS,CAAC,MAA4C,CAAC;IACnE,GAAG,CAAC,eAAe,GAAG;QACpB,aAAa,EAAE,CAAC,EAAW,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI;QAC3D,KAAK,EAAE,KAAK;KACb,CAAC;IACF,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,GAAG,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC7D,iBAAiB,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,GAAG,EAAE;QACZ,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACnB,iBAAiB,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;QAC7B,wEAAwE;QACxE,+FAA+F;IACjG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,eAAe,CAAC;QAC5B,IAAI,iBAAiB,GAAG,CAAC,CAAC;QAE1B,cAAc,CAAC,MAAM,CACnB,GAAG,EACH,KAAM,SAAQ,WAAW;YACvB;gBACE,KAAK,EAAE,CAAC;gBACR,iBAAiB,EAAE,CAAC;gBACpB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACnD,IAAI,CAAC,SAAS,GAAG,qBAAqB,CAAC;gBACvC,6CAA6C;gBAC7C,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;SACF,CACF,CAAC;QAEF,+EAA+E;QAC/E,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,GAAG,CAAC;QAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAE,CAAC;QAC9C,iFAAiF;QACjF,MAAM,WAAW,GAAG,iBAAiB,CAAC;QAEtC,6EAA6E;QAC7E,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE7B,0BAA0B,EAAE,CAAC;QAE7B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAE,CAAC;QAC3C,qDAAqD;QACrD,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;QAChD,mDAAmD;QACnD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,kBAAkB,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,aAAa,CAAC;QAE1B,cAAc,CAAC,MAAM,CACnB,GAAG,EACH,KAAM,SAAQ,WAAW;YACvB;gBACE,KAAK,EAAE,CAAC;gBACR,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACtC,CAAC;SACF,CACF,CAAC;QAEF,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,GAAG,CAAC;QAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAE,CAAC;QAE9C,0BAA0B,EAAE,CAAC;QAE7B,wCAAwC;QACxC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,gBAAgB,CAAC;QAE7B,cAAc,CAAC,MAAM,CACnB,GAAG,EACH,KAAM,SAAQ,WAAW;YACvB;gBACE,KAAK,EAAE,CAAC;gBACR,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACnD,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;SACF,CACF,CAAC;QAEF,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,MAAM,GAAG,GAAG,CAAC;QAC9C,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAE,CAAC;QAE9C,0BAA0B,EAAE,CAAC;QAE7B,6EAA6E;QAC7E,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,cAAc,CAAC;QAE3B,cAAc,CAAC,MAAM,CACnB,GAAG,EACH,KAAM,SAAQ,WAAW;YACvB;gBACE,KAAK,EAAE,CAAC;gBACR,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACnD,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;SACF,CACF,CAAC;QAEF,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,6CAA6C,GAAG,GAAG,CAAC;QACrF,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAE,CAAC;QAC9C,qCAAqC;QACrC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE7B,0BAA0B,EAAE,CAAC;QAE7B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAE,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAG,iBAAiB,CAAC;QAE9B,cAAc,CAAC,MAAM,CACnB,GAAG,EACH,KAAM,SAAQ,WAAW;YACvB;gBACE,KAAK,EAAE,CAAC;gBACR,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACnD,IAAI,CAAC,SAAS,GAAG,eAAe,CAAC;gBACjC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;SACF,CACF,CAAC;QAEF,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,gEAAgE,GAAG,GAAG,CAAC;QACxG,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAE,CAAC;QAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAE,CAAC;QAClD,qCAAqC;QACrC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE7B,0BAA0B,EAAE,CAAC;QAE7B,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAE,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,+DAA+D;QAC/D,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,eAAe,CAAC;QAC/B,MAAM,OAAO,GAAG,aAAa,CAAC;QAC9B,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,cAAc,CAAC,MAAM,CACnB,MAAM,EACN,KAAM,SAAQ,WAAW;YACvB;gBACE,KAAK,EAAE,CAAC;gBACR,IAAI,UAAU,EAAE,CAAC;oBACf,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;gBACtC,CAAC;gBACD,UAAU,GAAG,IAAI,CAAC;YACpB,CAAC;SACF,CACF,CAAC;QAEF,cAAc,CAAC,MAAM,CACnB,OAAO,EACP,KAAM,SAAQ,WAAW;YACvB;gBACE,KAAK,EAAE,CAAC;gBACR,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACnD,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC9B,CAAC;SACF,CACF,CAAC;QAEF,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,MAAM,MAAM,MAAM,KAAK,OAAO,MAAM,OAAO,GAAG,CAAC;QAC7E,8DAA8D;QAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAE,CAAC;QACtD,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAEjC,4EAA4E;QAC5E,MAAM,CAAC,GAAG,EAAE,CAAC,0BAA0B,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAEzD,6DAA6D;QAC7D,MAAM,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAE,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { JSDOM } from \"jsdom\";\nimport { afterAll, beforeAll, beforeEach, describe, expect, it } from \"vitest\";\nimport { rerenderMissingShadowHosts } from \"../../lib/v3/dom/rerenderMissingShadows.runtime.js\";\n\ntype DomGlobals = {\n window: Window & typeof globalThis;\n document: Document;\n Node: typeof Node;\n NodeFilter: typeof NodeFilter;\n Element: typeof Element;\n HTMLElement: typeof HTMLElement;\n Document: typeof Document;\n DocumentFragment: typeof DocumentFragment;\n ShadowRoot: typeof ShadowRoot;\n customElements: CustomElementRegistry;\n};\n\nconst globalRef = globalThis as typeof globalThis & Partial<DomGlobals>;\nconst originalGlobals: Partial<DomGlobals> = {\n window: globalRef.window,\n document: globalRef.document,\n Node: globalRef.Node,\n NodeFilter: globalRef.NodeFilter,\n Element: globalRef.Element,\n HTMLElement: globalRef.HTMLElement,\n Document: globalRef.Document,\n DocumentFragment: globalRef.DocumentFragment,\n ShadowRoot: globalRef.ShadowRoot,\n customElements: globalRef.customElements,\n};\n\nlet dom: JSDOM;\n\nconst installDomGlobals = () => {\n const win = dom.window;\n globalRef.window = win as unknown as Window & typeof globalThis;\n globalRef.document = win.document;\n globalRef.Node = win.Node as unknown as typeof Node;\n globalRef.NodeFilter = win.NodeFilter as unknown as typeof NodeFilter;\n globalRef.Element = win.Element as unknown as typeof Element;\n globalRef.HTMLElement = win.HTMLElement as unknown as typeof HTMLElement;\n globalRef.Document = win.Document as unknown as typeof Document;\n globalRef.DocumentFragment =\n win.DocumentFragment as unknown as typeof DocumentFragment;\n globalRef.ShadowRoot = win.ShadowRoot as unknown as typeof ShadowRoot;\n globalRef.customElements =\n win.customElements as unknown as CustomElementRegistry;\n};\n\nconst restoreDomGlobals = () => {\n for (const [key, value] of Object.entries(originalGlobals)) {\n if (value === undefined) {\n delete (globalRef as Record<string, unknown>)[key];\n } else {\n (globalRef as Record<string, unknown>)[key] = value;\n }\n }\n};\n\n/**\n * Helper: set up a fake piercer on `window.__stagehandV3__` backed by a WeakMap.\n * Returns the WeakMap so tests can inspect tracked roots.\n */\nfunction installFakePiercer(): WeakMap<Element, ShadowRoot> {\n const closedRoots = new WeakMap<Element, ShadowRoot>();\n const win = globalRef.window as unknown as Record<string, unknown>;\n win.__stagehandV3__ = {\n getClosedRoot: (el: Element) => closedRoots.get(el) ?? null,\n stats: false,\n };\n return closedRoots;\n}\n\ndescribe(\"rerenderMissingShadowHosts\", () => {\n beforeAll(() => {\n dom = new JSDOM(\"<!doctype html><html><body></body></html>\");\n installDomGlobals();\n });\n\n afterAll(() => {\n dom.window.close();\n restoreDomGlobals();\n });\n\n beforeEach(() => {\n document.body.innerHTML = \"\";\n // Clean up any stale custom element registrations by recreating the DOM\n // (JSDOM doesn't support undefining custom elements, but we can use unique tag names per test)\n });\n\n it(\"re-renders a custom element with closed shadow so piercer can track it\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-closed-a\";\n let constructorCalled = 0;\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n constructorCalled++;\n const root = this.attachShadow({ mode: \"closed\" });\n root.innerHTML = \"<span>shadow</span>\";\n // Simulate piercer intercepting attachShadow\n closedRoots.set(this, root);\n }\n },\n );\n\n // Manually insert via innerHTML so the constructor fires once for the original\n document.body.innerHTML = `<${tag}></${tag}>`;\n const original = document.querySelector(tag)!;\n // The original was created by innerHTML which does call the constructor in JSDOM\n const callsBefore = constructorCalled;\n\n // Remove the tracked root to simulate \"created before piercer was installed\"\n closedRoots.delete(original);\n\n rerenderMissingShadowHosts();\n\n const fresh = document.querySelector(tag)!;\n // Constructor was called again for the fresh element\n expect(constructorCalled).toBe(callsBefore + 1);\n // Piercer now tracks the new element's closed root\n expect(closedRoots.has(fresh)).toBe(true);\n });\n\n it(\"skips elements that already have an open shadow root\", () => {\n installFakePiercer();\n const tag = \"test-open-b\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: \"open\" });\n }\n },\n );\n\n document.body.innerHTML = `<${tag}></${tag}>`;\n const original = document.querySelector(tag)!;\n\n rerenderMissingShadowHosts();\n\n // Element should NOT have been replaced\n expect(document.querySelector(tag)).toBe(original);\n });\n\n it(\"skips elements whose closed root is already tracked by piercer\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-tracked-c\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tag}></${tag}>`;\n const original = document.querySelector(tag)!;\n\n rerenderMissingShadowHosts();\n\n // Element should NOT have been replaced since piercer already knows about it\n expect(document.querySelector(tag)).toBe(original);\n });\n\n it(\"transfers attributes to the fresh element\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-attrs-d\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tag} id=\"myid\" class=\"foo bar\" data-x=\"123\"></${tag}>`;\n const original = document.querySelector(tag)!;\n // Remove tracking to force re-render\n closedRoots.delete(original);\n\n rerenderMissingShadowHosts();\n\n const fresh = document.querySelector(tag)!;\n expect(fresh).not.toBe(original);\n expect(fresh.getAttribute(\"id\")).toBe(\"myid\");\n expect(fresh.getAttribute(\"class\")).toBe(\"foo bar\");\n expect(fresh.getAttribute(\"data-x\")).toBe(\"123\");\n });\n\n it(\"moves light DOM children to the fresh element\", () => {\n const closedRoots = installFakePiercer();\n const tag = \"test-children-e\";\n\n customElements.define(\n tag,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n root.innerHTML = \"<slot></slot>\";\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tag}><span class=\"child1\">A</span><span class=\"child2\">B</span></${tag}>`;\n const original = document.querySelector(tag)!;\n const child1 = original.querySelector(\".child1\")!;\n const child2 = original.querySelector(\".child2\")!;\n // Remove tracking to force re-render\n closedRoots.delete(original);\n\n rerenderMissingShadowHosts();\n\n const fresh = document.querySelector(tag)!;\n expect(fresh).not.toBe(original);\n // Children should have been moved (same DOM nodes, not cloned)\n expect(fresh.querySelector(\".child1\")).toBe(child1);\n expect(fresh.querySelector(\".child2\")).toBe(child2);\n expect(fresh.children.length).toBe(2);\n });\n\n it(\"skips elements whose constructor throws without breaking the rest\", () => {\n const closedRoots = installFakePiercer();\n const tagBad = \"test-throws-f\";\n const tagGood = \"test-good-f\";\n let badCreated = false;\n\n customElements.define(\n tagBad,\n class extends HTMLElement {\n constructor() {\n super();\n if (badCreated) {\n throw new Error(\"constructor boom\");\n }\n badCreated = true;\n }\n },\n );\n\n customElements.define(\n tagGood,\n class extends HTMLElement {\n constructor() {\n super();\n const root = this.attachShadow({ mode: \"closed\" });\n closedRoots.set(this, root);\n }\n },\n );\n\n document.body.innerHTML = `<${tagBad}></${tagBad}><${tagGood}></${tagGood}>`;\n // Remove tracking from the good element so it needs re-render\n const goodOriginal = document.querySelector(tagGood)!;\n closedRoots.delete(goodOriginal);\n\n // Should not throw even though tagBad's constructor will throw on re-create\n expect(() => rerenderMissingShadowHosts()).not.toThrow();\n\n // The good element should have been re-rendered successfully\n const freshGood = document.querySelector(tagGood)!;\n expect(closedRoots.has(freshGood)).toBe(true);\n });\n});\n"]}