browxai 0.7.0

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 (520) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +139 -0
  3. package/THIRD_PARTY_NOTICES.md +45 -0
  4. package/dist/cli/chrome.d.ts +1 -0
  5. package/dist/cli/chrome.js +130 -0
  6. package/dist/cli/command-registry.d.ts +15 -0
  7. package/dist/cli/command-registry.js +35 -0
  8. package/dist/cli/doctor-plugins.d.ts +18 -0
  9. package/dist/cli/doctor-plugins.js +338 -0
  10. package/dist/cli/doctor.d.ts +9 -0
  11. package/dist/cli/doctor.js +407 -0
  12. package/dist/cli/init.d.ts +1 -0
  13. package/dist/cli/init.js +200 -0
  14. package/dist/cli/register-commands.d.ts +1 -0
  15. package/dist/cli/register-commands.js +22 -0
  16. package/dist/cli/serve.d.ts +14 -0
  17. package/dist/cli/serve.js +151 -0
  18. package/dist/cli.d.ts +3 -0
  19. package/dist/cli.js +129 -0
  20. package/dist/engine/adapters/adb.d.ts +72 -0
  21. package/dist/engine/adapters/adb.js +200 -0
  22. package/dist/engine/adapters/android-cdp.d.ts +54 -0
  23. package/dist/engine/adapters/android-cdp.js +110 -0
  24. package/dist/engine/adapters/android.engine.d.ts +1 -0
  25. package/dist/engine/adapters/android.engine.js +31 -0
  26. package/dist/engine/adapters/chromium.engine.d.ts +1 -0
  27. package/dist/engine/adapters/chromium.engine.js +44 -0
  28. package/dist/engine/adapters/firefox.engine.d.ts +1 -0
  29. package/dist/engine/adapters/firefox.engine.js +43 -0
  30. package/dist/engine/adapters/playwright-chromium.d.ts +43 -0
  31. package/dist/engine/adapters/playwright-chromium.js +56 -0
  32. package/dist/engine/adapters/playwright-firefox.d.ts +52 -0
  33. package/dist/engine/adapters/playwright-firefox.js +97 -0
  34. package/dist/engine/adapters/playwright-webkit.d.ts +40 -0
  35. package/dist/engine/adapters/playwright-webkit.js +79 -0
  36. package/dist/engine/adapters/safari/bidi-client.d.ts +46 -0
  37. package/dist/engine/adapters/safari/bidi-client.js +130 -0
  38. package/dist/engine/adapters/safari/launch.d.ts +56 -0
  39. package/dist/engine/adapters/safari/launch.js +104 -0
  40. package/dist/engine/adapters/safari/webdriver-client.d.ts +102 -0
  41. package/dist/engine/adapters/safari/webdriver-client.js +175 -0
  42. package/dist/engine/adapters/safari.engine.d.ts +1 -0
  43. package/dist/engine/adapters/safari.engine.js +52 -0
  44. package/dist/engine/adapters/safaridriver-hybrid.d.ts +56 -0
  45. package/dist/engine/adapters/safaridriver-hybrid.js +127 -0
  46. package/dist/engine/adapters/webkit.engine.d.ts +1 -0
  47. package/dist/engine/adapters/webkit.engine.js +47 -0
  48. package/dist/engine/capabilities.d.ts +53 -0
  49. package/dist/engine/capabilities.js +122 -0
  50. package/dist/engine/capability-registry.d.ts +9 -0
  51. package/dist/engine/capability-registry.js +20 -0
  52. package/dist/engine/index.d.ts +18 -0
  53. package/dist/engine/index.js +14 -0
  54. package/dist/engine/register-engines.d.ts +5 -0
  55. package/dist/engine/register-engines.js +16 -0
  56. package/dist/engine/registry.d.ts +145 -0
  57. package/dist/engine/registry.js +67 -0
  58. package/dist/engine/select.d.ts +48 -0
  59. package/dist/engine/select.js +128 -0
  60. package/dist/engine/session-cdp.d.ts +13 -0
  61. package/dist/engine/session-cdp.js +22 -0
  62. package/dist/engine/tool-gate.d.ts +19 -0
  63. package/dist/engine/tool-gate.js +226 -0
  64. package/dist/engine/types.d.ts +71 -0
  65. package/dist/engine/types.js +16 -0
  66. package/dist/helper/bridge.d.ts +48 -0
  67. package/dist/helper/bridge.js +200 -0
  68. package/dist/helper/browx-page.d.ts +1 -0
  69. package/dist/helper/browx-page.js +47 -0
  70. package/dist/helper/overlay-hide.d.ts +9 -0
  71. package/dist/helper/overlay-hide.js +49 -0
  72. package/dist/helper/stealth.d.ts +10 -0
  73. package/dist/helper/stealth.js +88 -0
  74. package/dist/index.d.ts +7 -0
  75. package/dist/index.js +15 -0
  76. package/dist/page/a11y.d.ts +81 -0
  77. package/dist/page/a11y.js +219 -0
  78. package/dist/page/action-substrate.d.ts +64 -0
  79. package/dist/page/action-substrate.js +118 -0
  80. package/dist/page/actionresult-blocks.d.ts +99 -0
  81. package/dist/page/actionresult-blocks.js +144 -0
  82. package/dist/page/actionresult-shape.d.ts +48 -0
  83. package/dist/page/actionresult-shape.js +155 -0
  84. package/dist/page/actionresult-types.d.ts +368 -0
  85. package/dist/page/actionresult-types.js +4 -0
  86. package/dist/page/actionresult.d.ts +4 -0
  87. package/dist/page/actionresult.js +299 -0
  88. package/dist/page/actions-probe.d.ts +32 -0
  89. package/dist/page/actions-probe.js +294 -0
  90. package/dist/page/actions-scroll.d.ts +40 -0
  91. package/dist/page/actions-scroll.js +53 -0
  92. package/dist/page/actions.d.ts +132 -0
  93. package/dist/page/actions.js +453 -0
  94. package/dist/page/archive-assets.d.ts +39 -0
  95. package/dist/page/archive-assets.js +187 -0
  96. package/dist/page/archive.d.ts +47 -0
  97. package/dist/page/archive.js +349 -0
  98. package/dist/page/asset-export.d.ts +122 -0
  99. package/dist/page/asset-export.js +376 -0
  100. package/dist/page/await_network.d.ts +16 -0
  101. package/dist/page/await_network.js +23 -0
  102. package/dist/page/bbox.d.ts +37 -0
  103. package/dist/page/bbox.js +115 -0
  104. package/dist/page/canvas-capture.d.ts +82 -0
  105. package/dist/page/canvas-capture.js +257 -0
  106. package/dist/page/canvas-diff.d.ts +51 -0
  107. package/dist/page/canvas-diff.js +131 -0
  108. package/dist/page/canvas-gesture.d.ts +53 -0
  109. package/dist/page/canvas-gesture.js +167 -0
  110. package/dist/page/canvas-transform.d.ts +96 -0
  111. package/dist/page/canvas-transform.js +150 -0
  112. package/dist/page/canvas.d.ts +8 -0
  113. package/dist/page/canvas.js +50 -0
  114. package/dist/page/capture-substrate.d.ts +111 -0
  115. package/dist/page/capture-substrate.js +139 -0
  116. package/dist/page/clipboard.d.ts +25 -0
  117. package/dist/page/clipboard.js +50 -0
  118. package/dist/page/clock.d.ts +36 -0
  119. package/dist/page/clock.js +167 -0
  120. package/dist/page/compose.d.ts +55 -0
  121. package/dist/page/compose.js +169 -0
  122. package/dist/page/console.d.ts +39 -0
  123. package/dist/page/console.js +73 -0
  124. package/dist/page/coverage.d.ts +97 -0
  125. package/dist/page/coverage.js +280 -0
  126. package/dist/page/dom-export.d.ts +41 -0
  127. package/dist/page/dom-export.js +193 -0
  128. package/dist/page/dom-walk.d.ts +91 -0
  129. package/dist/page/dom-walk.js +267 -0
  130. package/dist/page/dom_diff.d.ts +48 -0
  131. package/dist/page/dom_diff.js +121 -0
  132. package/dist/page/downloads.d.ts +80 -0
  133. package/dist/page/downloads.js +244 -0
  134. package/dist/page/drop-files.d.ts +78 -0
  135. package/dist/page/drop-files.js +310 -0
  136. package/dist/page/element-export-discovery.d.ts +64 -0
  137. package/dist/page/element-export-discovery.js +346 -0
  138. package/dist/page/element-export.d.ts +46 -0
  139. package/dist/page/element-export.js +251 -0
  140. package/dist/page/emulation-substrate.d.ts +53 -0
  141. package/dist/page/emulation-substrate.js +87 -0
  142. package/dist/page/emulation.d.ts +60 -0
  143. package/dist/page/emulation.js +162 -0
  144. package/dist/page/export-playwright-script.d.ts +47 -0
  145. package/dist/page/export-playwright-script.js +304 -0
  146. package/dist/page/extract-resolve.d.ts +22 -0
  147. package/dist/page/extract-resolve.js +341 -0
  148. package/dist/page/extract-schema.d.ts +20 -0
  149. package/dist/page/extract-schema.js +200 -0
  150. package/dist/page/extract-types.d.ts +127 -0
  151. package/dist/page/extract-types.js +8 -0
  152. package/dist/page/extract-warnings.d.ts +8 -0
  153. package/dist/page/extract-warnings.js +56 -0
  154. package/dist/page/extract.d.ts +9 -0
  155. package/dist/page/extract.js +174 -0
  156. package/dist/page/fill-form.d.ts +58 -0
  157. package/dist/page/fill-form.js +261 -0
  158. package/dist/page/find.d.ts +158 -0
  159. package/dist/page/find.js +470 -0
  160. package/dist/page/frames.d.ts +45 -0
  161. package/dist/page/frames.js +133 -0
  162. package/dist/page/generate-locator.d.ts +57 -0
  163. package/dist/page/generate-locator.js +136 -0
  164. package/dist/page/gestures.d.ts +128 -0
  165. package/dist/page/gestures.js +198 -0
  166. package/dist/page/har.d.ts +91 -0
  167. package/dist/page/har.js +174 -0
  168. package/dist/page/heap.d.ts +97 -0
  169. package/dist/page/heap.js +285 -0
  170. package/dist/page/inspect.d.ts +34 -0
  171. package/dist/page/inspect.js +75 -0
  172. package/dist/page/layout-thrash.d.ts +34 -0
  173. package/dist/page/layout-thrash.js +232 -0
  174. package/dist/page/learning.d.ts +21 -0
  175. package/dist/page/learning.js +84 -0
  176. package/dist/page/locator.d.ts +54 -0
  177. package/dist/page/locator.js +142 -0
  178. package/dist/page/memory-diff.d.ts +48 -0
  179. package/dist/page/memory-diff.js +105 -0
  180. package/dist/page/network-mask.d.ts +8 -0
  181. package/dist/page/network-mask.js +18 -0
  182. package/dist/page/network-playwright.d.ts +96 -0
  183. package/dist/page/network-playwright.js +353 -0
  184. package/dist/page/network-substrate-select.d.ts +18 -0
  185. package/dist/page/network-substrate-select.js +32 -0
  186. package/dist/page/network-substrate.d.ts +109 -0
  187. package/dist/page/network-substrate.js +161 -0
  188. package/dist/page/network-ws.d.ts +46 -0
  189. package/dist/page/network-ws.js +113 -0
  190. package/dist/page/network.d.ts +194 -0
  191. package/dist/page/network.js +415 -0
  192. package/dist/page/overflow-detect.d.ts +102 -0
  193. package/dist/page/overflow-detect.js +449 -0
  194. package/dist/page/pdf.d.ts +69 -0
  195. package/dist/page/pdf.js +109 -0
  196. package/dist/page/perf-audit-analysers.d.ts +40 -0
  197. package/dist/page/perf-audit-analysers.js +369 -0
  198. package/dist/page/perf-audit-runner.d.ts +20 -0
  199. package/dist/page/perf-audit-runner.js +195 -0
  200. package/dist/page/perf-audit-types.d.ts +41 -0
  201. package/dist/page/perf-audit-types.js +5 -0
  202. package/dist/page/perf-audit.d.ts +37 -0
  203. package/dist/page/perf-audit.js +377 -0
  204. package/dist/page/perf.d.ts +127 -0
  205. package/dist/page/perf.js +373 -0
  206. package/dist/page/plan.d.ts +192 -0
  207. package/dist/page/plan.js +308 -0
  208. package/dist/page/point_probe.d.ts +46 -0
  209. package/dist/page/point_probe.js +99 -0
  210. package/dist/page/recording.d.ts +67 -0
  211. package/dist/page/recording.js +172 -0
  212. package/dist/page/refs.d.ts +92 -0
  213. package/dist/page/refs.js +134 -0
  214. package/dist/page/regions.d.ts +23 -0
  215. package/dist/page/regions.js +32 -0
  216. package/dist/page/routes.d.ts +40 -0
  217. package/dist/page/routes.js +87 -0
  218. package/dist/page/safari-actions.d.ts +12 -0
  219. package/dist/page/safari-actions.js +144 -0
  220. package/dist/page/sample.d.ts +64 -0
  221. package/dist/page/sample.js +216 -0
  222. package/dist/page/screenshot-on.d.ts +51 -0
  223. package/dist/page/screenshot-on.js +150 -0
  224. package/dist/page/screenshot-save.d.ts +36 -0
  225. package/dist/page/screenshot-save.js +53 -0
  226. package/dist/page/screenshot-schedule.d.ts +50 -0
  227. package/dist/page/screenshot-schedule.js +155 -0
  228. package/dist/page/script-substrate.d.ts +32 -0
  229. package/dist/page/script-substrate.js +47 -0
  230. package/dist/page/seed-random.d.ts +45 -0
  231. package/dist/page/seed-random.js +144 -0
  232. package/dist/page/set-of-marks.d.ts +96 -0
  233. package/dist/page/set-of-marks.js +245 -0
  234. package/dist/page/shadow.d.ts +136 -0
  235. package/dist/page/shadow.js +400 -0
  236. package/dist/page/shortcut.d.ts +50 -0
  237. package/dist/page/shortcut.js +147 -0
  238. package/dist/page/snapshot-substrate-safari.d.ts +30 -0
  239. package/dist/page/snapshot-substrate-safari.js +84 -0
  240. package/dist/page/snapshot-substrate-select.d.ts +24 -0
  241. package/dist/page/snapshot-substrate-select.js +34 -0
  242. package/dist/page/snapshot-substrate.d.ts +58 -0
  243. package/dist/page/snapshot-substrate.js +135 -0
  244. package/dist/page/snapshot.d.ts +24 -0
  245. package/dist/page/snapshot.js +162 -0
  246. package/dist/page/solve-captcha.d.ts +76 -0
  247. package/dist/page/solve-captcha.js +286 -0
  248. package/dist/page/storage-substrate-types.d.ts +221 -0
  249. package/dist/page/storage-substrate-types.js +6 -0
  250. package/dist/page/storage-substrate.d.ts +215 -0
  251. package/dist/page/storage-substrate.js +280 -0
  252. package/dist/page/structural.d.ts +9 -0
  253. package/dist/page/structural.js +152 -0
  254. package/dist/page/substrate-bundle-safari.d.ts +8 -0
  255. package/dist/page/substrate-bundle-safari.js +42 -0
  256. package/dist/page/substrate-bundle.d.ts +6 -0
  257. package/dist/page/substrate-bundle.js +53 -0
  258. package/dist/page/text_search.d.ts +44 -0
  259. package/dist/page/text_search.js +90 -0
  260. package/dist/page/upload.d.ts +28 -0
  261. package/dist/page/upload.js +62 -0
  262. package/dist/page/verify.d.ts +63 -0
  263. package/dist/page/verify.js +451 -0
  264. package/dist/page/video.d.ts +115 -0
  265. package/dist/page/video.js +169 -0
  266. package/dist/page/visibility.d.ts +22 -0
  267. package/dist/page/visibility.js +94 -0
  268. package/dist/page/watch.d.ts +29 -0
  269. package/dist/page/watch.js +99 -0
  270. package/dist/page/workers.d.ts +126 -0
  271. package/dist/page/workers.js +490 -0
  272. package/dist/page/ws-interactive.d.ts +82 -0
  273. package/dist/page/ws-interactive.js +318 -0
  274. package/dist/plugin/cli.d.ts +45 -0
  275. package/dist/plugin/cli.js +496 -0
  276. package/dist/plugin/command-registry.d.ts +9 -0
  277. package/dist/plugin/command-registry.js +23 -0
  278. package/dist/plugin/depgraph.d.ts +37 -0
  279. package/dist/plugin/depgraph.js +186 -0
  280. package/dist/plugin/manifest.d.ts +182 -0
  281. package/dist/plugin/manifest.js +219 -0
  282. package/dist/plugin/package-manager.d.ts +22 -0
  283. package/dist/plugin/package-manager.js +40 -0
  284. package/dist/plugin/resolver.d.ts +85 -0
  285. package/dist/plugin/resolver.js +166 -0
  286. package/dist/plugin/runtime.d.ts +77 -0
  287. package/dist/plugin/runtime.js +402 -0
  288. package/dist/plugin/types.d.ts +113 -0
  289. package/dist/plugin/types.js +4 -0
  290. package/dist/policy/confirm.d.ts +76 -0
  291. package/dist/policy/confirm.js +162 -0
  292. package/dist/policy/origin.d.ts +17 -0
  293. package/dist/policy/origin.js +79 -0
  294. package/dist/sdk/client.d.ts +21 -0
  295. package/dist/sdk/client.js +174 -0
  296. package/dist/sdk/index.d.ts +32 -0
  297. package/dist/sdk/index.js +61 -0
  298. package/dist/sdk/plugin-types.d.ts +33 -0
  299. package/dist/sdk/plugin-types.js +22 -0
  300. package/dist/sdk/registry.d.ts +17 -0
  301. package/dist/sdk/registry.js +94 -0
  302. package/dist/sdk/socket-transport.d.ts +20 -0
  303. package/dist/sdk/socket-transport.js +90 -0
  304. package/dist/sdk/tool-types.d.ts +634 -0
  305. package/dist/sdk/tool-types.js +28 -0
  306. package/dist/sdk/transport-in-process.d.ts +21 -0
  307. package/dist/sdk/transport-in-process.js +44 -0
  308. package/dist/sdk/transport-registry.d.ts +19 -0
  309. package/dist/sdk/transport-registry.js +31 -0
  310. package/dist/sdk/transport-socket.d.ts +12 -0
  311. package/dist/sdk/transport-socket.js +77 -0
  312. package/dist/sdk/transport-stdio-child.d.ts +10 -0
  313. package/dist/sdk/transport-stdio-child.js +47 -0
  314. package/dist/sdk/transport.d.ts +10 -0
  315. package/dist/sdk/transport.js +35 -0
  316. package/dist/sdk/types.d.ts +176 -0
  317. package/dist/sdk/types.js +10 -0
  318. package/dist/server.d.ts +33 -0
  319. package/dist/server.js +327 -0
  320. package/dist/session/artifacts.d.ts +52 -0
  321. package/dist/session/artifacts.js +177 -0
  322. package/dist/session/byob-attach.d.ts +26 -0
  323. package/dist/session/byob-attach.js +187 -0
  324. package/dist/session/byob.d.ts +8 -0
  325. package/dist/session/byob.js +20 -0
  326. package/dist/session/cache-storage.d.ts +100 -0
  327. package/dist/session/cache-storage.js +166 -0
  328. package/dist/session/device-emu.d.ts +149 -0
  329. package/dist/session/device-emu.js +545 -0
  330. package/dist/session/device.d.ts +14 -0
  331. package/dist/session/device.js +44 -0
  332. package/dist/session/dialog.d.ts +62 -0
  333. package/dist/session/dialog.js +164 -0
  334. package/dist/session/emulation.d.ts +69 -0
  335. package/dist/session/emulation.js +168 -0
  336. package/dist/session/extensions.d.ts +113 -0
  337. package/dist/session/extensions.js +237 -0
  338. package/dist/session/fs-picker.d.ts +144 -0
  339. package/dist/session/fs-picker.js +666 -0
  340. package/dist/session/idb-storage.d.ts +86 -0
  341. package/dist/session/idb-storage.js +229 -0
  342. package/dist/session/incognito.d.ts +3 -0
  343. package/dist/session/incognito.js +20 -0
  344. package/dist/session/launch-options.d.ts +41 -0
  345. package/dist/session/launch-options.js +200 -0
  346. package/dist/session/managed.d.ts +3 -0
  347. package/dist/session/managed.js +16 -0
  348. package/dist/session/metrics.d.ts +45 -0
  349. package/dist/session/metrics.js +75 -0
  350. package/dist/session/notification.d.ts +122 -0
  351. package/dist/session/notification.js +426 -0
  352. package/dist/session/permission.d.ts +144 -0
  353. package/dist/session/permission.js +600 -0
  354. package/dist/session/playwright-post-wire.d.ts +8 -0
  355. package/dist/session/playwright-post-wire.js +148 -0
  356. package/dist/session/policy-buffer.d.ts +21 -0
  357. package/dist/session/policy-buffer.js +47 -0
  358. package/dist/session/profile-snapshot.d.ts +11 -0
  359. package/dist/session/profile-snapshot.js +53 -0
  360. package/dist/session/registry.d.ts +365 -0
  361. package/dist/session/registry.js +98 -0
  362. package/dist/session/safari-post-wire.d.ts +8 -0
  363. package/dist/session/safari-post-wire.js +28 -0
  364. package/dist/session/safari-session.d.ts +10 -0
  365. package/dist/session/safari-session.js +39 -0
  366. package/dist/session/storage.d.ts +148 -0
  367. package/dist/session/storage.js +350 -0
  368. package/dist/session/types.d.ts +113 -0
  369. package/dist/session/types.js +5 -0
  370. package/dist/session/wedge.d.ts +15 -0
  371. package/dist/session/wedge.js +41 -0
  372. package/dist/tools/action-core-tools.d.ts +13 -0
  373. package/dist/tools/action-core-tools.js +156 -0
  374. package/dist/tools/action-form-tools.d.ts +12 -0
  375. package/dist/tools/action-form-tools.js +179 -0
  376. package/dist/tools/action-gesture-tools.d.ts +9 -0
  377. package/dist/tools/action-gesture-tools.js +115 -0
  378. package/dist/tools/action-history-tools.d.ts +8 -0
  379. package/dist/tools/action-history-tools.js +67 -0
  380. package/dist/tools/action-tool.d.ts +42 -0
  381. package/dist/tools/action-tool.js +58 -0
  382. package/dist/tools/action-tools.d.ts +20 -0
  383. package/dist/tools/action-tools.js +28 -0
  384. package/dist/tools/batch-act-tools.d.ts +10 -0
  385. package/dist/tools/batch-act-tools.js +276 -0
  386. package/dist/tools/batch-human-tools.d.ts +8 -0
  387. package/dist/tools/batch-human-tools.js +148 -0
  388. package/dist/tools/canvas-tools.d.ts +40 -0
  389. package/dist/tools/canvas-tools.js +368 -0
  390. package/dist/tools/capture-report-diagnostics-tools.d.ts +7 -0
  391. package/dist/tools/capture-report-diagnostics-tools.js +318 -0
  392. package/dist/tools/capture-report-element-export-tools.d.ts +8 -0
  393. package/dist/tools/capture-report-element-export-tools.js +197 -0
  394. package/dist/tools/capture-report-export-tools.d.ts +8 -0
  395. package/dist/tools/capture-report-export-tools.js +246 -0
  396. package/dist/tools/capture-report-marks-tools.d.ts +9 -0
  397. package/dist/tools/capture-report-marks-tools.js +221 -0
  398. package/dist/tools/capture-report-upload-tools.d.ts +8 -0
  399. package/dist/tools/capture-report-upload-tools.js +277 -0
  400. package/dist/tools/config-approval-tools.d.ts +8 -0
  401. package/dist/tools/config-approval-tools.js +166 -0
  402. package/dist/tools/deep-coverage-tools.d.ts +8 -0
  403. package/dist/tools/deep-coverage-tools.js +325 -0
  404. package/dist/tools/deep-determinism-tools.d.ts +8 -0
  405. package/dist/tools/deep-determinism-tools.js +276 -0
  406. package/dist/tools/deep-perf-tools.d.ts +19 -0
  407. package/dist/tools/deep-perf-tools.js +324 -0
  408. package/dist/tools/device-emulation-tools.d.ts +9 -0
  409. package/dist/tools/device-emulation-tools.js +137 -0
  410. package/dist/tools/extensions-batch-tools.d.ts +18 -0
  411. package/dist/tools/extensions-batch-tools.js +24 -0
  412. package/dist/tools/extensions-rebuild.d.ts +22 -0
  413. package/dist/tools/extensions-rebuild.js +208 -0
  414. package/dist/tools/extensions-tools.d.ts +2 -0
  415. package/dist/tools/extensions-tools.js +331 -0
  416. package/dist/tools/forms-fill-tools.d.ts +8 -0
  417. package/dist/tools/forms-fill-tools.js +109 -0
  418. package/dist/tools/forms-plan-tools.d.ts +7 -0
  419. package/dist/tools/forms-plan-tools.js +159 -0
  420. package/dist/tools/forms-recording-mode-tools.d.ts +8 -0
  421. package/dist/tools/forms-recording-mode-tools.js +71 -0
  422. package/dist/tools/forms-recording-tools.d.ts +14 -0
  423. package/dist/tools/forms-recording-tools.js +22 -0
  424. package/dist/tools/forms-refs-tools.d.ts +8 -0
  425. package/dist/tools/forms-refs-tools.js +90 -0
  426. package/dist/tools/gesture-coord-tools.d.ts +8 -0
  427. package/dist/tools/gesture-coord-tools.js +168 -0
  428. package/dist/tools/gesture-emulation-tools.d.ts +8 -0
  429. package/dist/tools/gesture-emulation-tools.js +135 -0
  430. package/dist/tools/gesture-network-tools.d.ts +17 -0
  431. package/dist/tools/gesture-network-tools.js +27 -0
  432. package/dist/tools/gesture-route-tools.d.ts +8 -0
  433. package/dist/tools/gesture-route-tools.js +142 -0
  434. package/dist/tools/gesture-websocket-tools.d.ts +8 -0
  435. package/dist/tools/gesture-websocket-tools.js +122 -0
  436. package/dist/tools/gesture-worker-tools.d.ts +9 -0
  437. package/dist/tools/gesture-worker-tools.js +200 -0
  438. package/dist/tools/host-build.d.ts +76 -0
  439. package/dist/tools/host-build.js +516 -0
  440. package/dist/tools/host.d.ts +287 -0
  441. package/dist/tools/host.js +1 -0
  442. package/dist/tools/input-tools.d.ts +10 -0
  443. package/dist/tools/input-tools.js +176 -0
  444. package/dist/tools/live-emulation-tools.d.ts +9 -0
  445. package/dist/tools/live-emulation-tools.js +353 -0
  446. package/dist/tools/plugin-runtime.d.ts +36 -0
  447. package/dist/tools/plugin-runtime.js +274 -0
  448. package/dist/tools/read-observe-buffer-tools.d.ts +9 -0
  449. package/dist/tools/read-observe-buffer-tools.js +385 -0
  450. package/dist/tools/read-observe-capture-tools.d.ts +12 -0
  451. package/dist/tools/read-observe-capture-tools.js +376 -0
  452. package/dist/tools/read-observe-dom-tools.d.ts +8 -0
  453. package/dist/tools/read-observe-dom-tools.js +308 -0
  454. package/dist/tools/read-observe-extract-tools.d.ts +8 -0
  455. package/dist/tools/read-observe-extract-tools.js +232 -0
  456. package/dist/tools/read-observe-verify-tools.d.ts +8 -0
  457. package/dist/tools/read-observe-verify-tools.js +316 -0
  458. package/dist/tools/schemas.d.ts +29 -0
  459. package/dist/tools/schemas.js +58 -0
  460. package/dist/tools/secrets-captcha-tools.d.ts +9 -0
  461. package/dist/tools/secrets-captcha-tools.js +231 -0
  462. package/dist/tools/session-dialog-permission-tools.d.ts +9 -0
  463. package/dist/tools/session-dialog-permission-tools.js +287 -0
  464. package/dist/tools/session-lifecycle-tools.d.ts +8 -0
  465. package/dist/tools/session-lifecycle-tools.js +314 -0
  466. package/dist/tools/session-notification-device-tools.d.ts +9 -0
  467. package/dist/tools/session-notification-device-tools.js +156 -0
  468. package/dist/tools/session-policy-tools.d.ts +16 -0
  469. package/dist/tools/session-policy-tools.js +22 -0
  470. package/dist/tools/session-registry.d.ts +28 -0
  471. package/dist/tools/session-registry.js +427 -0
  472. package/dist/tools/storage-artifact-har-video-tools.d.ts +8 -0
  473. package/dist/tools/storage-artifact-har-video-tools.js +311 -0
  474. package/dist/tools/storage-cache-idb-tools.d.ts +8 -0
  475. package/dist/tools/storage-cache-idb-tools.js +347 -0
  476. package/dist/tools/storage-state-cookies-tools.d.ts +8 -0
  477. package/dist/tools/storage-state-cookies-tools.js +223 -0
  478. package/dist/tools/storage-tools.d.ts +17 -0
  479. package/dist/tools/storage-tools.js +25 -0
  480. package/dist/tools/storage-web-auth-tools.d.ts +10 -0
  481. package/dist/tools/storage-web-auth-tools.js +230 -0
  482. package/dist/tools/tool-metadata.d.ts +8 -0
  483. package/dist/tools/tool-metadata.js +185 -0
  484. package/dist/util/batch.d.ts +83 -0
  485. package/dist/util/batch.js +191 -0
  486. package/dist/util/capabilities.d.ts +504 -0
  487. package/dist/util/capabilities.js +254 -0
  488. package/dist/util/config-store.d.ts +103 -0
  489. package/dist/util/config-store.js +206 -0
  490. package/dist/util/config.d.ts +11 -0
  491. package/dist/util/config.js +28 -0
  492. package/dist/util/credentials.d.ts +136 -0
  493. package/dist/util/credentials.js +622 -0
  494. package/dist/util/deadline.d.ts +22 -0
  495. package/dist/util/deadline.js +62 -0
  496. package/dist/util/diagnostics.d.ts +161 -0
  497. package/dist/util/diagnostics.js +579 -0
  498. package/dist/util/egress-sanitiser.d.ts +29 -0
  499. package/dist/util/egress-sanitiser.js +52 -0
  500. package/dist/util/failure.d.ts +8 -0
  501. package/dist/util/failure.js +50 -0
  502. package/dist/util/flake-check.d.ts +109 -0
  503. package/dist/util/flake-check.js +342 -0
  504. package/dist/util/invariant.d.ts +25 -0
  505. package/dist/util/invariant.js +66 -0
  506. package/dist/util/logging.d.ts +6 -0
  507. package/dist/util/logging.js +12 -0
  508. package/dist/util/predicates.d.ts +62 -0
  509. package/dist/util/predicates.js +340 -0
  510. package/dist/util/secrets.d.ts +104 -0
  511. package/dist/util/secrets.js +219 -0
  512. package/dist/util/tokens.d.ts +6 -0
  513. package/dist/util/tokens.js +24 -0
  514. package/dist/util/url-sanitizer.d.ts +19 -0
  515. package/dist/util/url-sanitizer.js +70 -0
  516. package/dist/util/version.d.ts +2 -0
  517. package/dist/util/version.js +21 -0
  518. package/dist/util/workspace.d.ts +7 -0
  519. package/dist/util/workspace.js +22 -0
  520. package/package.json +120 -0
@@ -0,0 +1,385 @@
1
+ import { inspectElement } from "../page/inspect.js";
2
+ import { generateLocator } from "../page/generate-locator.js";
3
+ import { watchWindow } from "../page/watch.js";
4
+ import { pointProbe } from "../page/point_probe.js";
5
+ import { sampleMetric, ELEMENT_METRICS } from "../page/sample.js";
6
+ import { withDeadline } from "../util/deadline.js";
7
+ import { estimateTokens } from "../util/tokens.js";
8
+ import { REF_OR_SELECTOR, SESSION_ARG, TIMEOUT_ARG } from "./schemas.js";
9
+ /**
10
+ * Read / observe — buffer reads + element diagnostics. The session ring-buffer
11
+ * reads (console_read / network_read / ws_read / network_body), the DOM-metric
12
+ * sampler + window watcher, element inspection / locator generation / point
13
+ * probing, and the gated `eval_js` escape hatch. Registered through the shared
14
+ * `ToolHost` seam.
15
+ */
16
+ export function registerReadObserveBufferTools(host) {
17
+ const { z, register, gateCheck, entryFor, asTarget, scriptFor, ctxFor, cfgActionTimeout, actionTimeout, egressFor, caps, } = host;
18
+ register("console_read", {
19
+ capability: "read",
20
+ batchable: true,
21
+ description: "Recent console messages from the page (ring buffer).",
22
+ inputSchema: { limit: z.number().int().positive().max(500).optional(), ...SESSION_ARG },
23
+ }, async ({ limit, session }) => {
24
+ const g = gateCheck("console_read");
25
+ if (g)
26
+ return g;
27
+ const e = await entryFor(session);
28
+ const rows = e.console.recent(limit ?? 50);
29
+ return { content: [{ type: "text", text: JSON.stringify(rows, null, 2) }] };
30
+ });
31
+ register("network_read", {
32
+ capability: "read",
33
+ batchable: true,
34
+ description: "Session-wide ring buffer of recent network requests (500 most recent; oldest evicted on overflow). For per-action attribution use `ActionResult.network` from any action tool — that's the primary surface. This is the 'what happened across the session' view; useful when an XHR isn't tied to a specific action you just ran. Noise types (Image/Font/Stylesheet/Media/beacons) folded into `summary.byType.other`.",
35
+ inputSchema: { limit: z.number().int().positive().max(500).optional(), ...SESSION_ARG },
36
+ }, async ({ limit, session }) => {
37
+ const g = gateCheck("network_read");
38
+ if (g)
39
+ return g;
40
+ const e = await entryFor(session);
41
+ const result = e.network.recent(limit ?? 50);
42
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
43
+ });
44
+ register("sample", {
45
+ capability: "read",
46
+ batchable: true,
47
+ description: "sample a DOM metric over a window and return the time series — jank / CLS / scroll-drift QA. `metric` is a **fixed enum** (no agent-supplied JS — that's `eval_js`, gated). With a `ref`/`selector`/`named` target: `scrollTop`/`scrollLeft`/`scrollHeight`/`scrollWidth`/`clientWidth`/`clientHeight`/`bboxX`/`bboxY`/`bboxWidth`/`bboxHeight`. Without a target: the document scroller (`bbox*` is rejected — needs an element). `everyFrame:true` uses requestAnimationFrame; else `intervalMs` (default 100, min 16). Returns `{ metric, scope, durationMs, mode, count, series:[{tMs,value}], truncated? }`. Caps: 30 s, 2000 points. Read-only (`read`).",
48
+ inputSchema: {
49
+ ...REF_OR_SELECTOR,
50
+ metric: z.enum(ELEMENT_METRICS).describe("Fixed metric to sample."),
51
+ durationMs: z.number().int().positive().max(30_000).describe("Window length (ms, ≤30000)."),
52
+ everyFrame: z
53
+ .boolean()
54
+ .optional()
55
+ .describe("Sample every animation frame (rAF). Default false → fixed interval."),
56
+ intervalMs: z
57
+ .number()
58
+ .int()
59
+ .positive()
60
+ .max(5000)
61
+ .optional()
62
+ .describe("Sampling interval (ms, default 100, min 16). Ignored when everyFrame:true."),
63
+ summary: z
64
+ .boolean()
65
+ .optional()
66
+ .describe("Series-omission control; the reduced summary ({count,min,max,first,last,distinctCount,firstChangeTMs}) is ALWAYS returned. true=omit the full series; false=always include it; omit this arg=auto (the series is dropped for large windows >300 points, with `autoSummarised:true` on the result — re-request with summary:false for the raw set)."),
67
+ ...SESSION_ARG,
68
+ },
69
+ }, async (args) => {
70
+ const g = gateCheck("sample");
71
+ if (g)
72
+ return g;
73
+ const e = await entryFor(args.session);
74
+ const hasTarget = !!(args.ref || args.selector || args.named || args.coords);
75
+ const target = hasTarget ? asTarget(args, "sample", e.refs) : undefined;
76
+ if (target && "coords" in target) {
77
+ return {
78
+ content: [
79
+ {
80
+ type: "text",
81
+ text: JSON.stringify({
82
+ error: "sample: coords targets unsupported — use a ref/selector/named element, or omit target for the window",
83
+ }, null, 2),
84
+ },
85
+ ],
86
+ };
87
+ }
88
+ try {
89
+ const result = await sampleMetric(e.session.page(), e.refs, {
90
+ target,
91
+ metric: args.metric,
92
+ durationMs: args.durationMs,
93
+ everyFrame: args.everyFrame,
94
+ intervalMs: args.intervalMs,
95
+ summary: args.summary,
96
+ });
97
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
98
+ }
99
+ catch (err) {
100
+ return {
101
+ content: [
102
+ {
103
+ type: "text",
104
+ text: JSON.stringify({ error: err instanceof Error ? err.message : String(err) }, null, 2),
105
+ },
106
+ ],
107
+ };
108
+ }
109
+ });
110
+ register("watch", {
111
+ capability: "read",
112
+ batchable: true,
113
+ description: "observe a fixed time window with NO driving action. Samples top-level transient surfaces (dialog/alert/status/toast/tooltip/log) across the window so a region that appears AND disappears inside it is caught (endpoint-only diffs miss it) — double-fire toasts, flash-of-content, 'notification never broadcast'. Returns `{ durationMs, samples, regions:[{ role, name, ref, appearedAtMs, disappearedAtMs }], console, network, wsFrames }`. Read-only (`read`). Caps at 60s.",
114
+ inputSchema: {
115
+ durationMs: z.number().int().positive().max(60_000).describe("Window length (ms, ≤60000)."),
116
+ sampleMs: z
117
+ .number()
118
+ .int()
119
+ .positive()
120
+ .max(5000)
121
+ .optional()
122
+ .describe("Sampling interval (ms, default 250, min 50)."),
123
+ ...SESSION_ARG,
124
+ },
125
+ }, async ({ durationMs, sampleMs, session }) => {
126
+ const g = gateCheck("watch");
127
+ if (g)
128
+ return g;
129
+ const e = await entryFor(session);
130
+ const result = await watchWindow(ctxFor(e), { durationMs, sampleMs });
131
+ // Egress sink — the NetworkTap inside `watchWindow` already saw the
132
+ // secrets registry (via `ctx.secrets`) and sanitised URLs / mutation
133
+ // responseShape keys. The remaining channel that can echo a literal
134
+ // value is `regions[].name` (a11y node names — e.g. a status-region
135
+ // whose visible text reads back the just-filled token). Deep-mask
136
+ // the whole result so any future string leaf is also covered. Routed
137
+ // through the injected egress chokepoint (RFC 0004 P3 / D4) — byte-identical
138
+ // to the prior `caps.enabled.has("secrets") ? e.secrets.applyMaskDeep(...) : ...`.
139
+ const masked = egressFor(e).maskDeep(result);
140
+ return { content: [{ type: "text", text: JSON.stringify(masked, null, 2) }] };
141
+ });
142
+ register("inspect", {
143
+ capability: "read",
144
+ batchable: true,
145
+ description: "read an element's whitelisted computed styles + box + overflow/clip state. The layout-break / control-state verification primitive — confirm `cursor: not-allowed` vs `wait`, a flex row's `childCount`, a label that overflows (`overflowing.y`), `display:none`/`visibility:hidden`. Returns `{ found, box, styles, overflowing:{x,y}, visible, childCount }`. Read-only (capability `read`); distinct from `find()` (ranking) and `text_search` (presence). Coords targets aren't supported (no element to resolve).",
146
+ inputSchema: {
147
+ ...REF_OR_SELECTOR,
148
+ styles: z
149
+ .array(z.string())
150
+ .optional()
151
+ .describe('Extra computed-style property names to include beyond the default set (camelCase, e.g. "borderBottomWidth").'),
152
+ ...SESSION_ARG,
153
+ },
154
+ }, async (args) => {
155
+ const g = gateCheck("inspect");
156
+ if (g)
157
+ return g;
158
+ const e = await entryFor(args.session);
159
+ const target = asTarget(args, "inspect", e.refs);
160
+ if ("coords" in target) {
161
+ return {
162
+ content: [
163
+ {
164
+ type: "text",
165
+ text: JSON.stringify({ found: false, error: "inspect requires ref/selector/named, not coords" }, null, 2),
166
+ },
167
+ ],
168
+ };
169
+ }
170
+ const { locatorFor } = await import("../page/locator.js");
171
+ const loc = locatorFor(e.session.page(), e.refs, target);
172
+ let result;
173
+ try {
174
+ result = await withDeadline(inspectElement(loc, args.styles ?? []), cfgActionTimeout(), "inspect");
175
+ }
176
+ catch (err) {
177
+ return {
178
+ content: [
179
+ {
180
+ type: "text",
181
+ text: JSON.stringify({ found: false, error: err instanceof Error ? err.message : String(err) }, null, 2),
182
+ },
183
+ ],
184
+ };
185
+ }
186
+ // Egress sink — `styles.content` / `background-image: url(...)` can echo
187
+ // a registered real-value rendered into the computed-style stream.
188
+ // Low-risk channel (the reviewer flagged as NIT) but the masking layer
189
+ // is cheap; pin the invariant per-sink.
190
+ const maskedInspect = egressFor(e).maskDeep(result);
191
+ return { content: [{ type: "text", text: JSON.stringify(maskedInspect, null, 2) }] };
192
+ });
193
+ register("generate_locator", {
194
+ capability: "read",
195
+ batchable: true,
196
+ description: "Convert a session-internal `ref` (from snapshot()/find()) into a Playwright-string locator expression an adopter can paste into a `.spec.ts` — the bridge between agent-driven exploration and a deterministic regression suite. Returns `{ ok, playwright, stability, components }` (or `{ ok:false, failure:{kind:\"ref-not-found\"} }` when the ref isn't in this session's registry — no throw). `playwright` is a real Playwright expression rooted on `page` (e.g. `page.getByRole('button', { name: 'Save' })`, `page.getByTestId('save-btn')`, `page.locator('main > table > tbody > tr:nth-child(4)')`). `stability` is the same per-tier label `find()` emits (high = testid OR role+name; medium = stable structural / text on stable role; low = positional / role-only). `components` is the structured breakdown of the parts the string is built from — adopters who want to compose their own locator (chain `.filter()`, combine two kinds) can read this without re-parsing the string. Read-only; no new capability — reuses `read`.",
197
+ inputSchema: {
198
+ ref: z.string().describe("Stable `eN` ref from a prior snapshot()/find()/plan() result."),
199
+ ...SESSION_ARG,
200
+ },
201
+ }, async ({ ref, session }) => {
202
+ const g = gateCheck("generate_locator");
203
+ if (g)
204
+ return g;
205
+ const e = await entryFor(session);
206
+ const result = generateLocator(ref, (r) => e.refs.locatorOf(r));
207
+ // Secrets masking: the emitted `playwright` string + `components`
208
+ // values can echo a real `name` / `testId` that was registered via the
209
+ // secrets registry. Same exposure class as `find()`'s `selectorHint`
210
+ // and `inspect`'s stringly outputs — mask through the per-session
211
+ // registry on egress (the injected chokepoint — RFC 0004 P3 / D4).
212
+ const masked = egressFor(e).maskDeep(result);
213
+ const tokensEstimate = estimateTokens(JSON.stringify(masked));
214
+ return {
215
+ content: [
216
+ { type: "text", text: JSON.stringify({ ...masked, tokensEstimate }, null, 2) },
217
+ ],
218
+ };
219
+ });
220
+ register("point_probe", {
221
+ capability: "read",
222
+ description: "Read-only: what is actually under a viewport coordinate. Returns the full `document.elementsFromPoint` stack (top-down, first = what a real click hits), each layer's tag/id/testId/role/name/classes + computed pointer-events/visibility/display/z-index/cursor + bbox, plus the nearest scroll container and nearest clickable ancestor of the top element. The coordinate-target verifier for canvas / virtualised-timeline / painted UIs where the target isn't a clean accessible element — prove a coordinate hits the intended layer before driving `click({coords})` instead of trusting a screenshot estimate. `crop:true` adds a small bounded PNG around the point (off by default — token-cheap). No agent JS.",
223
+ inputSchema: {
224
+ coords: z.object({ x: z.number(), y: z.number() }).describe("Viewport CSS px."),
225
+ crop: z
226
+ .boolean()
227
+ .optional()
228
+ .describe("Default false. Include a small (80×80) PNG crop (base64) around the point."),
229
+ ...SESSION_ARG,
230
+ },
231
+ }, async ({ coords, crop, session }) => {
232
+ const g = gateCheck("point_probe");
233
+ if (g)
234
+ return g;
235
+ const e = await entryFor(session);
236
+ try {
237
+ const result = await withDeadline(pointProbe(e.session.page(), coords, { crop }), cfgActionTimeout(), "point_probe");
238
+ // Egress sink — `point_probe.text` / `ancestorText` slice the
239
+ // textContent of the element-under-point + nearest clickable ancestor.
240
+ // Same exposure class as snapshot/find name fields; mask through the
241
+ // session registry before serialising.
242
+ const maskedProbe = egressFor(e).maskDeep(result);
243
+ return { content: [{ type: "text", text: JSON.stringify(maskedProbe, null, 2) }] };
244
+ }
245
+ catch (err) {
246
+ // structured failure — coordinate + page URL for triage.
247
+ let url = "";
248
+ try {
249
+ url = e.session.page().url();
250
+ }
251
+ catch {
252
+ /* page gone */
253
+ }
254
+ return {
255
+ content: [
256
+ {
257
+ type: "text",
258
+ text: JSON.stringify({
259
+ ok: false,
260
+ point: coords,
261
+ url,
262
+ error: err instanceof Error ? err.message : String(err),
263
+ }, null, 2),
264
+ },
265
+ ],
266
+ };
267
+ }
268
+ });
269
+ register("network_body", {
270
+ capability: "network-body",
271
+ batchable: true,
272
+ description: "fetch a full response body by `requestId` (from `network_read` / `ActionResult.network.requests[].requestId`). **Gated behind the off-by-default `network-body` capability** — full bodies can carry PII / auth tokens; 's `responseShape` (keys only) is the safe default. Bounded (256 KB, `truncated:true` past that). Best-effort: the renderer discards bodies fast — fetch right after the request, not retained across navigations. Pairs with for realtime payload assertions.",
273
+ inputSchema: {
274
+ requestId: z
275
+ .string()
276
+ .describe("CDP request id from network_read / ActionResult.network.requests[].requestId."),
277
+ ...SESSION_ARG,
278
+ },
279
+ }, async ({ requestId, session }) => {
280
+ const g = gateCheck("network_body");
281
+ if (g)
282
+ return g;
283
+ const e = await entryFor(session);
284
+ // secrets masking: a full response body routinely echoes auth tokens
285
+ // and session blobs. Pass the per-session registry so any registered
286
+ // real-value gets substituted with its alias on egress. Base64 bodies
287
+ // pass through unchanged (the literal scan would never match an
288
+ // encoded form; documented in tool-reference.md as a known limitation).
289
+ // Engine-agnostic via the network substrate: chromium fetches
290
+ // on demand (CDP Network.getResponseBody); firefox/webkit return the body
291
+ // captured at response time into the substrate's bounded recent-window cache.
292
+ const r = await e.networkSubstrate.fetchBody(requestId, caps.enabled.has("secrets") ? e.secrets : null);
293
+ return { content: [{ type: "text", text: JSON.stringify(r, null, 2) }] };
294
+ });
295
+ register("ws_read", {
296
+ capability: "read",
297
+ batchable: true,
298
+ description: "session-wide ring of recent WebSocket / Server-Sent-Events frames (HTTP is `network_read`; this is the realtime channel). Each frame: `{ url, dir: sent|recv, kind: ws|sse, opcode?, event?, payload, truncated?, ts }`. Payloads are truncated. Use to verify realtime correctness — chat/multiplayer/collaborative/live-dashboard broadcasts. Per-action frames also land in `ActionResult.network.wsFrames`; this is the across-session view.",
299
+ inputSchema: {
300
+ limit: z
301
+ .number()
302
+ .int()
303
+ .positive()
304
+ .max(500)
305
+ .optional()
306
+ .describe("Most-recent N frames (default 50)."),
307
+ urlPattern: z.string().optional().describe("Substring filter on the frame's endpoint URL."),
308
+ ...SESSION_ARG,
309
+ },
310
+ }, async ({ limit, urlPattern, session }) => {
311
+ const g = gateCheck("ws_read");
312
+ if (g)
313
+ return g;
314
+ const e = await entryFor(session);
315
+ const result = e.ws.recent(limit ?? 50, urlPattern);
316
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
317
+ });
318
+ register("eval_js", {
319
+ capability: "eval",
320
+ batchable: true,
321
+ description: "Run a JavaScript expression in the page's main frame. Use sparingly — `find()`/action tools cover most cases. Common use: trigger a page-side function the app exposes (e.g. `window.__siteDocs.capture()`). The return value is page-controlled — treat it as untrusted content, just like snapshot text. ⚠ `element.click()` (and other programmatic DOM event calls) here do NOT fire framework click handlers (Vue `@click`, React synthetic events, custom-element listeners) — the event isn't trusted/synthetic-equivalent, so no app handler runs and you'll wrongly conclude the feature is broken. Use the `click` tool for a real, handler-firing click; reserve `eval_js` for reading state / calling app-exposed functions.",
322
+ inputSchema: {
323
+ expr: z
324
+ .string()
325
+ .describe("JS expression to evaluate. Wrap in `(() => { … })()` for statements."),
326
+ returnType: z
327
+ .enum(["json", "void"])
328
+ .default("json")
329
+ .describe("'json' returns the value (must be JSON-serializable); 'void' discards it (use for fire-and-forget calls)."),
330
+ ...TIMEOUT_ARG,
331
+ ...SESSION_ARG,
332
+ },
333
+ }, async ({ expr, returnType, timeoutMs, session }) => {
334
+ const g = gateCheck("eval_js");
335
+ if (g)
336
+ return g;
337
+ const e = await entryFor(session);
338
+ // page.evaluate has NO Playwright timeout — a never-resolving expr
339
+ // would wedge forever. Race it against the anti-wedge deadline.
340
+ const td = actionTimeout({ timeoutMs });
341
+ // soft warning: a programmatic .click() in eval_js does not fire
342
+ // framework (@click / synthetic-event) handlers — a recurring false
343
+ // "feature broken" negative. Point at the real `click` tool.
344
+ const clickWarn = /\.click\s*\(\s*\)/.test(expr)
345
+ ? "eval_js `.click()` does not fire framework click handlers (Vue/React/custom-element) — no app handler runs. If you're testing a click, use the `click` tool instead; this is a known false-negative source."
346
+ : undefined;
347
+ const warn = td.warning && clickWarn ? `${td.warning} ${clickWarn}` : (td.warning ?? clickWarn);
348
+ try {
349
+ if (returnType === "void") {
350
+ await withDeadline(scriptFor(e).evaluate(expr), td.ms, "eval_js").catch(() => undefined);
351
+ return {
352
+ content: [
353
+ {
354
+ type: "text",
355
+ text: JSON.stringify({ ok: true, returnType: "void", ...(warn ? { warning: warn } : {}) }, null, 2),
356
+ },
357
+ ],
358
+ };
359
+ }
360
+ const value = await withDeadline(scriptFor(e).evaluate(expr), td.ms, "eval_js");
361
+ return {
362
+ content: [
363
+ {
364
+ type: "text",
365
+ text: JSON.stringify({ ok: true, value, ...(warn ? { warning: warn } : {}) }, null, 2),
366
+ },
367
+ ],
368
+ };
369
+ }
370
+ catch (err) {
371
+ return {
372
+ content: [
373
+ {
374
+ type: "text",
375
+ text: JSON.stringify({
376
+ ok: false,
377
+ error: err instanceof Error ? err.message : String(err),
378
+ ...(warn ? { warning: warn } : {}),
379
+ }, null, 2),
380
+ },
381
+ ],
382
+ };
383
+ }
384
+ });
385
+ }
@@ -0,0 +1,12 @@
1
+ import type { RegisterHost, GateHost, SessionHost, ActionHost, CaptureHost, ConfigHost, ServerServicesHost } from "./host.js";
2
+ /**
3
+ * Read / observe — screenshot capture. The viewport/element PNG-JPEG primitive
4
+ * plus its scheduled (`screenshot_schedule`) and event-driven (`screenshot_on`)
5
+ * automations, every one bounded by the anti-wedge deadline. Registered through
6
+ * the shared `ToolHost` seam.
7
+ *
8
+ * The parameter is narrowed to the sub-ports this family touches (RFC 0004 P3 /
9
+ * D3 ISP) — gating, session resolution, the capture port, target resolution, and
10
+ * config.
11
+ */
12
+ export declare function registerReadObserveCaptureTools(host: RegisterHost & GateHost & SessionHost & ActionHost & CaptureHost & ConfigHost & ServerServicesHost): void;