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,47 @@
1
+ export type { DiscoveredResource } from "./archive-assets.js";
2
+ /** Archive format. `directory` writes index.html + assets/ sidecar; `single-file`
3
+ * inlines every linked resource as a `data:` URI in one HTML file. */
4
+ export type ArchiveFormat = "directory" | "single-file";
5
+ export interface ArchiveArgs {
6
+ /** Workspace-rooted output path. For `directory` it's a directory; for
7
+ * `single-file` it's a `.html` file. When omitted, defaults to
8
+ * `archives/<sessionId>-<ISO>` (directory) or
9
+ * `archives/<sessionId>-<ISO>.html` (single-file). */
10
+ path?: string;
11
+ /** Archive format. Default `"directory"`. */
12
+ format?: ArchiveFormat;
13
+ /** Total archive size cap (MB). Default 200. Hard cap — fetches that
14
+ * would push past the budget are dropped and counted. */
15
+ maxSizeMb?: number;
16
+ }
17
+ export interface ArchiveResult {
18
+ ok: true;
19
+ format: ArchiveFormat;
20
+ /** Absolute, workspace-rooted output path (directory or file). */
21
+ path: string;
22
+ /** Total archive size on disk, in bytes. */
23
+ sizeBytes: number;
24
+ /** Resources successfully fetched + included. */
25
+ resourceCount: number;
26
+ /** Resources skipped — unsupported scheme, fetch failure, oversize, or
27
+ * size budget exhausted. The total `discovered = resourceCount + droppedCount`. */
28
+ droppedCount: number;
29
+ /** Non-fatal advisories — secrets-masking caveat (always), CSP `connect-src`
30
+ * blocks (when seen), oversized single-file output, per-resource oversize
31
+ * hits. The set is small + deterministic; never noise. */
32
+ warnings: string[];
33
+ }
34
+ /** Default output path when the caller omits one. Workspace-rooted under
35
+ * `archives/<sessionId>-<ISO>[.html]` — matches the `pdf_save` /
36
+ * `start_har` / `perf_stop` subdir-per-artefact convention. */
37
+ export declare function defaultArchivePath(sessionId: string, format: ArchiveFormat): string;
38
+ /** Page handle adapter — `page_archive` only needs `evaluate`. Exposing a
39
+ * thin interface keeps the unit test mock trivial. */
40
+ export interface ArchivePage {
41
+ evaluate(expression: string): Promise<unknown>;
42
+ }
43
+ /**
44
+ * Write the page archive. Workspace-rooted by construction; the caller
45
+ * (server.ts) has already gated on the `file-io` capability.
46
+ */
47
+ export declare function pageArchive(page: ArchivePage, workspaceRoot: string, sessionId: string, args?: ArchiveArgs): Promise<ArchiveResult>;
@@ -0,0 +1,349 @@
1
+ // `page_archive` — save the current page as a self-contained archive.
2
+ //
3
+ // Two formats:
4
+ //
5
+ // - `directory` (default) — write `<path>/index.html` plus a sidecar
6
+ // `<path>/assets/` containing every linked resource the DOM-walk
7
+ // discovered (images, fonts, scripts, stylesheets, CSS background
8
+ // images surfaced via `getComputedStyle`). Internal references in the
9
+ // serialised HTML are rewritten to relative `assets/...` paths. Browser-
10
+ // openable straight off disk; the archive is a real directory the
11
+ // adopter can grep / diff / repackage.
12
+ //
13
+ // - `single-file` — one self-contained HTML file at `path` with every
14
+ // resource inlined as a `data:` URI. The MHTML-equivalent without the
15
+ // MIME-multipart format (which Chromium has dropped good support for in
16
+ // the modern surface). One file to copy around; cap-bounded by `maxSizeMb`.
17
+ //
18
+ // Path safety mirrors `pdf_save` / `dump_storage_state`: every output path is
19
+ // resolved via `resolveWorkspacePath`, so a path that escapes
20
+ // `$BROWX_WORKSPACE` is rejected before any byte is written.
21
+ //
22
+ // Resource discovery walks the live DOM inside `page.evaluate` and pulls
23
+ // every node carrying a fetchable URL (`<img src>`, `<link href>`, `<script
24
+ // src>`, `<source>`, `<video poster>`, `<iframe src>` modulo cross-origin
25
+ // access, plus CSS `background-image: url(...)` from computed styles). Each
26
+ // URL is then fetched **from inside the page** via `await fetch(u)`, which
27
+ // inherits the page's origin (and credentials) — the only way to reliably
28
+ // pull resources that depend on session cookies or the page's CSP
29
+ // `connect-src` posture. Cross-origin fetches that CSP refuses are caught
30
+ // and surfaced in `droppedCount` + `warnings[]` rather than aborting the
31
+ // archive.
32
+ //
33
+ // Document HTML is captured with `document.documentElement.outerHTML` after
34
+ // the agent's own pre-archive wait. The tool does NOT inject its own wait;
35
+ // the agent is expected to navigate + settle the page BEFORE calling
36
+ // `page_archive`. Same posture as `pdf_save`.
37
+ //
38
+ // Secrets-masking interplay (DELIBERATE GAP):
39
+ // The output is a *faithful* capture of the rendered page. Running the
40
+ // per-session egress masking layer over the HTML / linked bytes would
41
+ // corrupt the archive — masking is literal-substring substitution, would
42
+ // break inline JSON state blobs, CSS, image bytes, and would produce a
43
+ // file that no longer opens correctly. So `page_archive` writes UNMASKED
44
+ // page state on purpose. The caller takes the same posture as
45
+ // `dump_storage_state` toward the result: it may carry credentials, treat
46
+ // the archive as sensitive material. Documented in tool-reference + flagged
47
+ // on every result through `warnings[]`.
48
+ import { resolve as resolvePath, dirname, join } from "node:path";
49
+ import { mkdirSync, writeFileSync, statSync } from "node:fs";
50
+ import { resolveWorkspacePath } from "../session/storage.js";
51
+ import { buildFetchScript, assetFilename, subdirForKind, rewriteHtml, mimeFromKind, directorySize, } from "./archive-assets.js";
52
+ /** Default size cap. Large enough for a meaty SPA + media, small enough that
53
+ * a runaway page (infinite-scroll, video stream) doesn't fill the
54
+ * workspace. Override with `maxSizeMb`. */
55
+ const DEFAULT_MAX_SIZE_MB = 200;
56
+ /** Hard ceiling for single-file mode beyond the user's cap. Browsers
57
+ * routinely struggle to load HTML > ~150 MB into a single document — the
58
+ * in-memory `data:` URI cost compounds. We surface a warning when the
59
+ * single-file output exceeds this, but never refuse: the cap is the cap. */
60
+ const SINGLE_FILE_SOFT_WARN_MB = 150;
61
+ /** Resource hard ceiling per fetch — refuse to inline a single 500 MB video
62
+ * even if `maxSizeMb` would permit it. The point of an archive is fidelity,
63
+ * not turning the agent into a CDN. Surfaces a warning. */
64
+ const PER_RESOURCE_HARD_MB = 50;
65
+ /** Default output path when the caller omits one. Workspace-rooted under
66
+ * `archives/<sessionId>-<ISO>[.html]` — matches the `pdf_save` /
67
+ * `start_har` / `perf_stop` subdir-per-artefact convention. */
68
+ export function defaultArchivePath(sessionId, format) {
69
+ // Match the sanitisation posture of `defaultPdfPath` — the registry
70
+ // already constrains ids, this is belt-and-braces.
71
+ const safe = sessionId.replace(/[^A-Za-z0-9._-]/g, "_") || "default";
72
+ const ts = new Date().toISOString().replace(/[:.]/g, "-");
73
+ const stem = `archives/${safe}-${ts}`;
74
+ return format === "single-file" ? `${stem}.html` : stem;
75
+ }
76
+ /** One linked resource the discovery script found. `kind` drives subdir
77
+ * placement in directory mode + content-type inference in single-file mode.
78
+ * Re-exported from `./archive-assets.js` (the type's home) at the top. */
79
+ /** Page-side discovery script — runs inside the page and returns the
80
+ * document HTML plus a list of every linked resource URL we can reach.
81
+ * Same pattern as `dom-walk.ts`: ECMAScript-only, stringified IIFE. */
82
+ const DISCOVERY_SCRIPT = `(() => {
83
+ function abs(u) {
84
+ try { return new URL(u, document.baseURI).href; } catch (_) { return null; }
85
+ }
86
+ function bgUrls(el) {
87
+ var out = [];
88
+ try {
89
+ var cs = getComputedStyle(el);
90
+ var bg = cs && cs.backgroundImage;
91
+ if (bg && bg !== 'none') {
92
+ var re = /url\\((['"]?)([^'")]+)\\1\\)/g, m;
93
+ while ((m = re.exec(bg)) !== null) out.push(m[2]);
94
+ }
95
+ } catch (_) {}
96
+ return out;
97
+ }
98
+ var resources = [];
99
+ var seen = Object.create(null);
100
+ function push(raw, kind) {
101
+ if (!raw) return;
102
+ var a = abs(raw);
103
+ if (!a) return;
104
+ // skip non-fetchable schemes — data:/blob:/about:/javascript: etc.
105
+ if (!/^https?:|^ftp:|^file:/i.test(a)) return;
106
+ var key = a + '|' + kind;
107
+ if (seen[key]) return;
108
+ seen[key] = 1;
109
+ resources.push({ url: a, kind: kind, rawRef: raw });
110
+ }
111
+ // <img src>, <img srcset> (first candidate only — keep the discovery cheap)
112
+ var imgs = document.querySelectorAll('img[src], img[srcset], source[src], source[srcset]');
113
+ for (var i = 0; i < imgs.length; i++) {
114
+ var el = imgs[i];
115
+ var s = el.getAttribute('src');
116
+ if (s) push(s, 'image');
117
+ var ss = el.getAttribute('srcset');
118
+ if (ss) {
119
+ var first = ss.split(',')[0].trim().split(/\\s+/)[0];
120
+ if (first) push(first, 'image');
121
+ }
122
+ }
123
+ // <link rel="stylesheet|icon|preload|prefetch">
124
+ var links = document.querySelectorAll('link[href]');
125
+ for (var i = 0; i < links.length; i++) {
126
+ var el = links[i];
127
+ var rel = (el.getAttribute('rel') || '').toLowerCase();
128
+ var href = el.getAttribute('href');
129
+ if (!href) continue;
130
+ var kind = 'other';
131
+ if (rel.indexOf('stylesheet') !== -1) kind = 'stylesheet';
132
+ else if (rel.indexOf('icon') !== -1) kind = 'image';
133
+ else if (rel.indexOf('preload') !== -1 || rel.indexOf('prefetch') !== -1) {
134
+ var as = (el.getAttribute('as') || '').toLowerCase();
135
+ if (as === 'font') kind = 'font';
136
+ else if (as === 'script') kind = 'script';
137
+ else if (as === 'image') kind = 'image';
138
+ else if (as === 'style') kind = 'stylesheet';
139
+ }
140
+ push(href, kind);
141
+ }
142
+ // <script src>
143
+ var scripts = document.querySelectorAll('script[src]');
144
+ for (var i = 0; i < scripts.length; i++) push(scripts[i].getAttribute('src'), 'script');
145
+ // <video|audio src|poster>, <track src>
146
+ var media = document.querySelectorAll('video[src], audio[src], video[poster], track[src]');
147
+ for (var i = 0; i < media.length; i++) {
148
+ var el = media[i];
149
+ var s = el.getAttribute('src'); if (s) push(s, 'media');
150
+ var p = el.getAttribute('poster'); if (p) push(p, 'image');
151
+ }
152
+ // <iframe src> — captured for fidelity even though cross-origin iframes
153
+ // won't be reachable from a fetch in this document. The agent gets a
154
+ // best-effort archive; cross-origin iframes are dropped at fetch time
155
+ // and counted in droppedCount.
156
+ var iframes = document.querySelectorAll('iframe[src]');
157
+ for (var i = 0; i < iframes.length; i++) push(iframes[i].getAttribute('src'), 'other');
158
+ // computed background-image — walk every visible element. Bounded — most
159
+ // pages have <100 background-images; a runaway page is bounded by the
160
+ // overall maxSizeMb cap downstream.
161
+ var all = document.querySelectorAll('*');
162
+ for (var i = 0; i < all.length && i < 5000; i++) {
163
+ var us = bgUrls(all[i]);
164
+ for (var j = 0; j < us.length; j++) push(us[j], 'image');
165
+ }
166
+ return {
167
+ html: document.documentElement ? document.documentElement.outerHTML : '',
168
+ baseUri: document.baseURI || '',
169
+ resources: resources,
170
+ };
171
+ })()`;
172
+ /**
173
+ * Write the page archive. Workspace-rooted by construction; the caller
174
+ * (server.ts) has already gated on the `file-io` capability.
175
+ */
176
+ export async function pageArchive(page, workspaceRoot, sessionId, args = {}) {
177
+ const format = args.format ?? "directory";
178
+ const maxSizeMb = args.maxSizeMb ?? DEFAULT_MAX_SIZE_MB;
179
+ if (!(maxSizeMb > 0) || maxSizeMb > 10_000) {
180
+ throw new Error(`page_archive: maxSizeMb must be in (0, 10000] — got ${maxSizeMb}.`);
181
+ }
182
+ const maxBytes = Math.floor(maxSizeMb * 1024 * 1024);
183
+ const relPath = args.path ?? defaultArchivePath(sessionId, format);
184
+ const resolved = resolveWorkspacePath(workspaceRoot, relPath, "page_archive");
185
+ // 1. Run discovery inside the page — one round-trip, returns
186
+ // documentElement.outerHTML + the URL set.
187
+ const discovered = (await page.evaluate(DISCOVERY_SCRIPT));
188
+ const warnings = [
189
+ // ALWAYS present — the secrets-masking caveat is part of the result
190
+ // envelope, not buried in docs. An adopter automating archive collection
191
+ // sees it on every call.
192
+ "page_archive output is UNMASKED — secrets-masking would corrupt the archive (literal-substring substitution breaks inline JSON / CSS / binary bytes). Treat the archive as sensitive material, same posture as dump_storage_state.",
193
+ ];
194
+ // 2. Fetch each resource (bounded concurrency + size budgets), then 3. emit.
195
+ const phase = await fetchArchiveResources(page, discovered.resources, maxBytes);
196
+ appendArchiveWarnings(phase, maxSizeMb, warnings);
197
+ const emit = format === "directory"
198
+ ? emitArchiveDirectory(resolved, discovered.html, phase.fetched, phase.runningBytes)
199
+ : emitArchiveSingleFile(resolved, discovered.html, phase.fetched, warnings);
200
+ return {
201
+ ok: true,
202
+ format,
203
+ path: resolvePath(resolved),
204
+ sizeBytes: emit.sizeBytes,
205
+ resourceCount: emit.resourceCount,
206
+ droppedCount: emit.droppedCount,
207
+ warnings,
208
+ };
209
+ }
210
+ const ARCHIVE_CSP_HINTS = ["connect-src", "refused to connect", "content security policy"];
211
+ /** Classify one fetched resource against the per-resource + total budget,
212
+ * mutating the running totals. Returns the (possibly budget-rejected) entry. */
213
+ function classifyArchiveFetched(f, maxBytes, phase) {
214
+ if (!f.r.ok) {
215
+ const err = (f.r.error ?? "").toLowerCase();
216
+ if (ARCHIVE_CSP_HINTS.some((h) => err.includes(h)))
217
+ phase.cspBlocked++;
218
+ return f;
219
+ }
220
+ const bytes = f.r.bytes ?? 0;
221
+ if (bytes > PER_RESOURCE_HARD_MB * 1024 * 1024) {
222
+ phase.perResourceOversize++;
223
+ return {
224
+ res: f.res,
225
+ r: { ok: false, error: `resource exceeded per-resource cap (${PER_RESOURCE_HARD_MB} MB)` },
226
+ };
227
+ }
228
+ if (phase.runningBytes + bytes > maxBytes) {
229
+ phase.budgetExhausted = true;
230
+ return { res: f.res, r: { ok: false, error: "size budget exhausted" } };
231
+ }
232
+ phase.runningBytes += bytes;
233
+ return f;
234
+ }
235
+ /** Fetch the discovered resources in bounded concurrency batches, applying the
236
+ * per-resource + total size budgets. Stops early once the budget is exhausted. */
237
+ async function fetchArchiveResources(page, resources, maxBytes) {
238
+ const CONCURRENCY = 6;
239
+ const phase = {
240
+ fetched: [],
241
+ cspBlocked: 0,
242
+ perResourceOversize: 0,
243
+ runningBytes: 0,
244
+ budgetExhausted: false,
245
+ };
246
+ for (let i = 0; i < resources.length; i += CONCURRENCY) {
247
+ const settled = await Promise.all(resources.slice(i, i + CONCURRENCY).map(async (res) => {
248
+ try {
249
+ return { res, r: (await page.evaluate(buildFetchScript(res.url))) };
250
+ }
251
+ catch (e) {
252
+ return { res, r: { ok: false, error: e instanceof Error ? e.message : String(e) } };
253
+ }
254
+ }));
255
+ for (const f of settled)
256
+ phase.fetched.push(classifyArchiveFetched(f, maxBytes, phase));
257
+ if (phase.budgetExhausted) {
258
+ for (let j = i + CONCURRENCY; j < resources.length; j++) {
259
+ phase.fetched.push({
260
+ res: resources[j],
261
+ r: { ok: false, error: "size budget exhausted" },
262
+ });
263
+ }
264
+ break;
265
+ }
266
+ }
267
+ return phase;
268
+ }
269
+ /** Push the post-fetch budget/CSP warnings onto the result warnings. */
270
+ function appendArchiveWarnings(phase, maxSizeMb, warnings) {
271
+ if (phase.cspBlocked > 0) {
272
+ warnings.push(`${phase.cspBlocked} resource(s) blocked by the page's Content-Security-Policy ` +
273
+ "(typically `connect-src` — fetch() inside the page is subject to the same " +
274
+ "policy as the page itself). These are counted in droppedCount.");
275
+ }
276
+ if (phase.perResourceOversize > 0) {
277
+ warnings.push(`${phase.perResourceOversize} resource(s) exceeded the per-resource ${PER_RESOURCE_HARD_MB} MB cap and were dropped. ` +
278
+ "Raise the per-resource cap by forking — the cap is hard-coded by design (an archive is fidelity, not a CDN).");
279
+ }
280
+ if (phase.budgetExhausted) {
281
+ warnings.push(`Archive size cap (maxSizeMb=${maxSizeMb}) reached — remaining resources were dropped. ` +
282
+ "Raise `maxSizeMb` to capture more, but note browsers struggle with single-file archives > " +
283
+ SINGLE_FILE_SOFT_WARN_MB +
284
+ " MB.");
285
+ }
286
+ }
287
+ /** Emit the multi-file directory archive — each asset under `assets/<kind>/`,
288
+ * the HTML rewritten to relative paths. Workspace-rooted by construction
289
+ * (`resolved` ⊆ $BROWX_WORKSPACE). */
290
+ function emitArchiveDirectory(resolved, html, fetched, runningBytes) {
291
+ mkdirSync(resolved, { recursive: true });
292
+ const assetsRoot = join(resolved, "assets");
293
+ mkdirSync(assetsRoot, { recursive: true });
294
+ let resourceCount = 0;
295
+ let droppedCount = 0;
296
+ const replacements = [];
297
+ for (const f of fetched) {
298
+ if (!f.r.ok || !f.r.base64) {
299
+ droppedCount++;
300
+ continue;
301
+ }
302
+ const subdir = subdirForKind(f.res.kind);
303
+ const dir = join(assetsRoot, subdir);
304
+ mkdirSync(dir, { recursive: true });
305
+ const filename = assetFilename(f.res.url, f.res.kind, f.r.contentType ?? "");
306
+ writeFileSync(join(dir, filename), Buffer.from(f.r.base64, "base64"));
307
+ replacements.push({ rawRef: f.res.rawRef, replacement: `assets/${subdir}/${filename}` });
308
+ resourceCount++;
309
+ }
310
+ const rewritten = rewriteHtml(html, replacements);
311
+ // workspace-rooted: `resolved` ⊆ $BROWX_WORKSPACE (resolveWorkspacePath gated it).
312
+ writeFileSync(join(resolved, "index.html"), rewritten, "utf8");
313
+ let sizeBytes;
314
+ try {
315
+ sizeBytes = directorySize(resolved);
316
+ }
317
+ catch {
318
+ sizeBytes = Buffer.byteLength(rewritten, "utf8") + runningBytes;
319
+ }
320
+ return { resourceCount, droppedCount, sizeBytes };
321
+ }
322
+ /** Emit the single-file archive — assets inlined as data: URIs in the HTML.
323
+ * Workspace-rooted by construction (`resolved` ⊆ $BROWX_WORKSPACE). */
324
+ function emitArchiveSingleFile(resolved, html, fetched, warnings) {
325
+ // workspace-rooted: dirname(resolved) is the parent of a $BROWX_WORKSPACE path.
326
+ mkdirSync(dirname(resolved), { recursive: true });
327
+ let resourceCount = 0;
328
+ let droppedCount = 0;
329
+ const replacements = [];
330
+ for (const f of fetched) {
331
+ if (!f.r.ok || !f.r.base64) {
332
+ droppedCount++;
333
+ continue;
334
+ }
335
+ const mime = (f.r.contentType ?? "").split(";")[0].trim() || mimeFromKind(f.res.kind);
336
+ replacements.push({ rawRef: f.res.rawRef, replacement: `data:${mime};base64,${f.r.base64}` });
337
+ resourceCount++;
338
+ }
339
+ const rewritten = rewriteHtml(html, replacements);
340
+ // workspace-rooted: `resolved` ⊆ $BROWX_WORKSPACE (resolveWorkspacePath gated it).
341
+ writeFileSync(resolved, rewritten, "utf8");
342
+ const sizeBytes = statSync(resolved).size;
343
+ if (sizeBytes > SINGLE_FILE_SOFT_WARN_MB * 1024 * 1024) {
344
+ warnings.push(`single-file archive is ${(sizeBytes / 1024 / 1024).toFixed(1)} MB. ` +
345
+ `Browsers commonly struggle to open inline-data HTML beyond ~${SINGLE_FILE_SOFT_WARN_MB} MB ` +
346
+ '(the data: URI cost compounds in-memory). Use `format:"directory"` for large pages.');
347
+ }
348
+ return { resourceCount, droppedCount, sizeBytes };
349
+ }
@@ -0,0 +1,122 @@
1
+ import type { CDPSession, Page } from "playwright-core";
2
+ import type { SessionNetworkRing, NetworkEntry } from "./network.js";
3
+ /** Hard ceiling on the per-call file count cap — even a caller-supplied
4
+ * `maxCount` is clamped to this. Bounds a runaway export on a long session. */
5
+ export declare const ASSET_EXPORT_HARD_MAX_COUNT = 50000;
6
+ /** Hard ceiling on the per-call byte cap. */
7
+ export declare const ASSET_EXPORT_HARD_MAX_BYTES: number;
8
+ /** Default per-call file count cap. Caller can override up to the hard max. */
9
+ export declare const ASSET_EXPORT_DEFAULT_MAX_COUNT = 10000;
10
+ /** Default per-call byte cap (500 MiB). */
11
+ export declare const ASSET_EXPORT_DEFAULT_MAX_BYTES: number;
12
+ export interface AssetFilter {
13
+ /** Substring match against response `Content-Type` (case-insensitive,
14
+ * any one match wins). Example: `["image/", "video/"]`. Undefined → any. */
15
+ mime?: string[];
16
+ /** RegExp source; matched case-insensitive against the response URL.
17
+ * Example: `"\\.(woff2?|ttf|otf)$"`. Invalid regex → throws at the tool
18
+ * boundary so the agent sees the structured error. */
19
+ urlPattern?: string;
20
+ /** Inclusive lower bound on the response's encoded byte size. */
21
+ minBytes?: number;
22
+ /** Inclusive upper bound on the response's encoded byte size. */
23
+ maxBytes?: number;
24
+ /** Allow-list of HTTP status codes. Default: 2xx (200..299). */
25
+ status?: number[];
26
+ }
27
+ export interface ManifestEntry {
28
+ url: string;
29
+ mime?: string;
30
+ status?: number;
31
+ sizeBytes: number;
32
+ savedAs: string;
33
+ }
34
+ export interface AssetExportResult {
35
+ ok: boolean;
36
+ intoDir: string;
37
+ totalCount: number;
38
+ matchedCount: number;
39
+ persistedCount: number;
40
+ droppedCount: number;
41
+ manifest: ManifestEntry[];
42
+ warnings: string[];
43
+ }
44
+ export interface AssetExportArgs {
45
+ filter: AssetFilter;
46
+ /** Workspace-rooted subdir for the exported files. Default
47
+ * `assets/<sessionId>-<ISO>/`. Escape rejected. */
48
+ intoDir?: string;
49
+ /** Override the per-call file count cap. Clamped to
50
+ * `ASSET_EXPORT_HARD_MAX_COUNT`. */
51
+ maxCount?: number;
52
+ /** Override the per-call total byte cap. Clamped to
53
+ * `ASSET_EXPORT_HARD_MAX_BYTES`. */
54
+ maxBytes?: number;
55
+ }
56
+ /** Build the regex once at the boundary. Throws `Error` on invalid source so
57
+ * the tool layer surfaces a structured failure instead of a runtime crash
58
+ * deep inside the loop. */
59
+ export declare function compileUrlPattern(src: string | undefined): RegExp | null;
60
+ /** Filter a single `NetworkEntry` against a normalised filter. Pure — uses
61
+ * only the entry's captured metadata; no I/O. Exported so the test suite
62
+ * can pin every branch without spinning a NetworkBuffer. */
63
+ interface NormalisedAssetFilter {
64
+ mime?: string[];
65
+ urlPattern: RegExp | null;
66
+ minBytes?: number;
67
+ maxBytes?: number;
68
+ status: ReadonlySet<number> | null;
69
+ }
70
+ /** Filter a single `NetworkEntry` against a normalised filter. Pure — uses only
71
+ * the entry's captured metadata; no I/O. Exported so the test suite can pin
72
+ * every branch without spinning a NetworkBuffer. */
73
+ export declare function matchesFilter(entry: NetworkEntry, filter: NormalisedAssetFilter): boolean;
74
+ /** Sanitise a URL-derived asset filename. Same posture as
75
+ * `downloads.sanitiseFilename`:
76
+ * - strip path separators (`/`, `\`) and NUL/control bytes — collapses any
77
+ * traversal attempt to a flat filename.
78
+ * - collapse runs of dots so the literal `..` substring never survives.
79
+ * - strip leading dots so we don't write a hidden file.
80
+ * - cap length (leaves room for a `-N` collision suffix).
81
+ * - empty / all-stripped → fall back to `"asset"`.
82
+ * Exported for unit tests. */
83
+ export declare function sanitiseAssetFilename(raw: string): string;
84
+ /** Derive a base filename from a URL: take the last path segment, decode
85
+ * percent-encoding, drop a query string. Falls back to `"asset"` when the
86
+ * URL has no usable basename (e.g. `https://example.com/`). Exported for
87
+ * unit tests. */
88
+ export declare function filenameFromUrl(url: string): string;
89
+ /** Resolve a collision by appending `-N` before the extension. Pure; uses
90
+ * the supplied `Set` of already-used names. Exported for unit tests. */
91
+ export declare function resolveCollision(name: string, used: Set<string>): string;
92
+ /** ISO-8601 timestamp safe for use in a directory name (`:` replaced with `-`). */
93
+ export declare function timestampForDir(d?: Date): string;
94
+ /** Resolve the export dir. Default: `assets/<sessionId>-<ISO>/`. Caller-
95
+ * supplied `intoDir` is resolved INSIDE `workspaceRoot`; any escape throws
96
+ * the same structured error as `upload_file` / `pdf_save`. */
97
+ export declare function resolveAssetExportDir(workspaceRoot: string, sessionId: string, intoDir?: string): string;
98
+ /** Try CDP `Network.getResponseBody` first; on "not available" fall back to
99
+ * an in-page `fetch()` against the original URL. Returns the bytes (decoded)
100
+ * + the effective content-type, or an `{ error }` envelope when both attempts
101
+ * fail. The CORS caveat: cross-origin URLs without permissive CORS headers
102
+ * will reject the in-page fetch; that's surfaced as `droppedCount` by the
103
+ * caller, not a crash. */
104
+ export declare function fetchBodyBytes(cdp: CDPSession, page: Page, entry: NetworkEntry): Promise<{
105
+ ok: true;
106
+ bytes: Buffer;
107
+ mimeType?: string;
108
+ } | {
109
+ ok: false;
110
+ error: string;
111
+ }>;
112
+ /** The live-session handles + workspace anchors `asset_export` threads through,
113
+ * bundled so the entry point stays within the parameter budget. */
114
+ export interface AssetExportDeps {
115
+ cdp: CDPSession;
116
+ page: Page;
117
+ buffer: SessionNetworkRing;
118
+ workspaceRoot: string;
119
+ sessionId: string;
120
+ }
121
+ export declare function assetExport(deps: AssetExportDeps, args: AssetExportArgs): Promise<AssetExportResult>;
122
+ export {};