opendevbrowser 0.0.15 → 0.0.16

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 (568) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +229 -34
  3. package/dist/annotate/direct-annotator.d.ts +22 -0
  4. package/dist/annotate/direct-annotator.d.ts.map +1 -0
  5. package/dist/annotate/output.d.ts +10 -0
  6. package/dist/annotate/output.d.ts.map +1 -0
  7. package/dist/browser/annotation-manager.d.ts +30 -0
  8. package/dist/browser/annotation-manager.d.ts.map +1 -0
  9. package/dist/browser/browser-manager.d.ts +397 -0
  10. package/dist/browser/browser-manager.d.ts.map +1 -0
  11. package/dist/browser/fingerprint/adapters.d.ts +26 -0
  12. package/dist/browser/fingerprint/adapters.d.ts.map +1 -0
  13. package/dist/browser/fingerprint/canary.d.ts +25 -0
  14. package/dist/browser/fingerprint/canary.d.ts.map +1 -0
  15. package/dist/browser/fingerprint/profiles.d.ts +16 -0
  16. package/dist/browser/fingerprint/profiles.d.ts.map +1 -0
  17. package/dist/browser/fingerprint/tier1-coherence.d.ts +36 -0
  18. package/dist/browser/fingerprint/tier1-coherence.d.ts.map +1 -0
  19. package/dist/browser/fingerprint/tier2-runtime.d.ts +40 -0
  20. package/dist/browser/fingerprint/tier2-runtime.d.ts.map +1 -0
  21. package/dist/browser/fingerprint/tier3-adaptive.d.ts +30 -0
  22. package/dist/browser/fingerprint/tier3-adaptive.d.ts.map +1 -0
  23. package/dist/browser/manager-types.d.ts +3 -0
  24. package/dist/browser/manager-types.d.ts.map +1 -0
  25. package/dist/browser/ops-browser-manager.d.ts +131 -0
  26. package/dist/browser/ops-browser-manager.d.ts.map +1 -0
  27. package/dist/browser/ops-client.d.ts +56 -0
  28. package/dist/browser/ops-client.d.ts.map +1 -0
  29. package/dist/browser/parallelism-governor.d.ts +31 -0
  30. package/dist/browser/parallelism-governor.d.ts.map +1 -0
  31. package/dist/browser/script-runner.d.ts +23 -0
  32. package/dist/browser/script-runner.d.ts.map +1 -0
  33. package/dist/browser/session-store.d.ts +63 -0
  34. package/dist/browser/session-store.d.ts.map +1 -0
  35. package/dist/browser/target-manager.d.ts +36 -0
  36. package/dist/browser/target-manager.d.ts.map +1 -0
  37. package/dist/cache/chrome-locator.d.ts +2 -0
  38. package/dist/cache/chrome-locator.d.ts.map +1 -0
  39. package/dist/cache/downloader.d.ts +6 -0
  40. package/dist/cache/downloader.d.ts.map +1 -0
  41. package/dist/cache/paths.d.ts +9 -0
  42. package/dist/cache/paths.d.ts.map +1 -0
  43. package/dist/chunk-7W3SPXIB.js +166 -0
  44. package/dist/chunk-7W3SPXIB.js.map +1 -0
  45. package/dist/chunk-ST7CO5FA.js +18668 -0
  46. package/dist/chunk-ST7CO5FA.js.map +1 -0
  47. package/dist/cli/args.d.ts +25 -0
  48. package/dist/cli/args.d.ts.map +1 -0
  49. package/dist/cli/client.d.ts +2 -0
  50. package/dist/cli/client.d.ts.map +1 -0
  51. package/dist/cli/commands/annotate.d.ts +27 -0
  52. package/dist/cli/commands/annotate.d.ts.map +1 -0
  53. package/dist/cli/commands/artifacts.d.ts +24 -0
  54. package/dist/cli/commands/artifacts.d.ts.map +1 -0
  55. package/dist/cli/commands/daemon.d.ts +35 -0
  56. package/dist/cli/commands/daemon.d.ts.map +1 -0
  57. package/dist/cli/commands/devtools/console-poll.d.ts +7 -0
  58. package/dist/cli/commands/devtools/console-poll.d.ts.map +1 -0
  59. package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts +20 -0
  60. package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts.map +1 -0
  61. package/dist/cli/commands/devtools/network-poll.d.ts +7 -0
  62. package/dist/cli/commands/devtools/network-poll.d.ts.map +1 -0
  63. package/dist/cli/commands/devtools/perf.d.ts +7 -0
  64. package/dist/cli/commands/devtools/perf.d.ts.map +1 -0
  65. package/dist/cli/commands/devtools/screenshot.d.ts +17 -0
  66. package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -0
  67. package/dist/cli/commands/dom/attr.d.ts +7 -0
  68. package/dist/cli/commands/dom/attr.d.ts.map +1 -0
  69. package/dist/cli/commands/dom/checked.d.ts +7 -0
  70. package/dist/cli/commands/dom/checked.d.ts.map +1 -0
  71. package/dist/cli/commands/dom/enabled.d.ts +7 -0
  72. package/dist/cli/commands/dom/enabled.d.ts.map +1 -0
  73. package/dist/cli/commands/dom/html.d.ts +7 -0
  74. package/dist/cli/commands/dom/html.d.ts.map +1 -0
  75. package/dist/cli/commands/dom/text.d.ts +7 -0
  76. package/dist/cli/commands/dom/text.d.ts.map +1 -0
  77. package/dist/cli/commands/dom/value.d.ts +7 -0
  78. package/dist/cli/commands/dom/value.d.ts.map +1 -0
  79. package/dist/cli/commands/dom/visible.d.ts +7 -0
  80. package/dist/cli/commands/dom/visible.d.ts.map +1 -0
  81. package/dist/cli/commands/export/clone-component.d.ts +7 -0
  82. package/dist/cli/commands/export/clone-component.d.ts.map +1 -0
  83. package/dist/cli/commands/export/clone-page.d.ts +7 -0
  84. package/dist/cli/commands/export/clone-page.d.ts.map +1 -0
  85. package/dist/cli/commands/interact/check.d.ts +7 -0
  86. package/dist/cli/commands/interact/check.d.ts.map +1 -0
  87. package/dist/cli/commands/interact/click.d.ts +7 -0
  88. package/dist/cli/commands/interact/click.d.ts.map +1 -0
  89. package/dist/cli/commands/interact/hover.d.ts +7 -0
  90. package/dist/cli/commands/interact/hover.d.ts.map +1 -0
  91. package/dist/cli/commands/interact/press.d.ts +7 -0
  92. package/dist/cli/commands/interact/press.d.ts.map +1 -0
  93. package/dist/cli/commands/interact/scroll-into-view.d.ts +7 -0
  94. package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -0
  95. package/dist/cli/commands/interact/scroll.d.ts +7 -0
  96. package/dist/cli/commands/interact/scroll.d.ts.map +1 -0
  97. package/dist/cli/commands/interact/select.d.ts +7 -0
  98. package/dist/cli/commands/interact/select.d.ts.map +1 -0
  99. package/dist/cli/commands/interact/type.d.ts +7 -0
  100. package/dist/cli/commands/interact/type.d.ts.map +1 -0
  101. package/dist/cli/commands/interact/uncheck.d.ts +7 -0
  102. package/dist/cli/commands/interact/uncheck.d.ts.map +1 -0
  103. package/dist/cli/commands/macro-resolve.d.ts +18 -0
  104. package/dist/cli/commands/macro-resolve.d.ts.map +1 -0
  105. package/dist/cli/commands/native.d.ts +82 -0
  106. package/dist/cli/commands/native.d.ts.map +1 -0
  107. package/dist/cli/commands/nav/goto.d.ts +7 -0
  108. package/dist/cli/commands/nav/goto.d.ts.map +1 -0
  109. package/dist/cli/commands/nav/snapshot.d.ts +7 -0
  110. package/dist/cli/commands/nav/snapshot.d.ts.map +1 -0
  111. package/dist/cli/commands/nav/wait.d.ts +7 -0
  112. package/dist/cli/commands/nav/wait.d.ts.map +1 -0
  113. package/dist/cli/commands/pages/close.d.ts +6 -0
  114. package/dist/cli/commands/pages/close.d.ts.map +1 -0
  115. package/dist/cli/commands/pages/list.d.ts +7 -0
  116. package/dist/cli/commands/pages/list.d.ts.map +1 -0
  117. package/dist/cli/commands/pages/open.d.ts +7 -0
  118. package/dist/cli/commands/pages/open.d.ts.map +1 -0
  119. package/dist/cli/commands/product-video.d.ts +25 -0
  120. package/dist/cli/commands/product-video.d.ts.map +1 -0
  121. package/dist/cli/commands/registry.d.ts +5 -0
  122. package/dist/cli/commands/registry.d.ts.map +1 -0
  123. package/dist/cli/commands/research.d.ts +27 -0
  124. package/dist/cli/commands/research.d.ts.map +1 -0
  125. package/dist/cli/commands/rpc.d.ts +28 -0
  126. package/dist/cli/commands/rpc.d.ts.map +1 -0
  127. package/dist/cli/commands/run.d.ts +17 -0
  128. package/dist/cli/commands/run.d.ts.map +1 -0
  129. package/dist/cli/commands/serve.d.ts +59 -0
  130. package/dist/cli/commands/serve.d.ts.map +1 -0
  131. package/dist/cli/commands/session/connect.d.ts +9 -0
  132. package/dist/cli/commands/session/connect.d.ts.map +1 -0
  133. package/dist/cli/commands/session/cookie-import.d.ts +31 -0
  134. package/dist/cli/commands/session/cookie-import.d.ts.map +1 -0
  135. package/dist/cli/commands/session/cookie-list.d.ts +17 -0
  136. package/dist/cli/commands/session/cookie-list.d.ts.map +1 -0
  137. package/dist/cli/commands/session/disconnect.d.ts +6 -0
  138. package/dist/cli/commands/session/disconnect.d.ts.map +1 -0
  139. package/dist/cli/commands/session/launch.d.ts +29 -0
  140. package/dist/cli/commands/session/launch.d.ts.map +1 -0
  141. package/dist/cli/commands/session/status.d.ts +7 -0
  142. package/dist/cli/commands/session/status.d.ts.map +1 -0
  143. package/dist/cli/commands/shopping.d.ts +25 -0
  144. package/dist/cli/commands/shopping.d.ts.map +1 -0
  145. package/dist/cli/commands/status.d.ts +19 -0
  146. package/dist/cli/commands/status.d.ts.map +1 -0
  147. package/dist/cli/commands/targets/close.d.ts +6 -0
  148. package/dist/cli/commands/targets/close.d.ts.map +1 -0
  149. package/dist/cli/commands/targets/list.d.ts +7 -0
  150. package/dist/cli/commands/targets/list.d.ts.map +1 -0
  151. package/dist/cli/commands/targets/new.d.ts +7 -0
  152. package/dist/cli/commands/targets/new.d.ts.map +1 -0
  153. package/dist/cli/commands/targets/use.d.ts +7 -0
  154. package/dist/cli/commands/targets/use.d.ts.map +1 -0
  155. package/dist/cli/commands/types.d.ts +13 -0
  156. package/dist/cli/commands/types.d.ts.map +1 -0
  157. package/dist/cli/commands/uninstall.d.ts +14 -0
  158. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  159. package/dist/cli/commands/update.d.ts +7 -0
  160. package/dist/cli/commands/update.d.ts.map +1 -0
  161. package/dist/cli/daemon-autostart.d.ts +46 -0
  162. package/dist/cli/daemon-autostart.d.ts.map +1 -0
  163. package/dist/cli/daemon-client.d.ts +33 -0
  164. package/dist/cli/daemon-client.d.ts.map +1 -0
  165. package/dist/cli/daemon-commands.d.ts +7 -0
  166. package/dist/cli/daemon-commands.d.ts.map +1 -0
  167. package/dist/cli/daemon-state.d.ts +56 -0
  168. package/dist/cli/daemon-state.d.ts.map +1 -0
  169. package/dist/cli/daemon-status.d.ts +19 -0
  170. package/dist/cli/daemon-status.d.ts.map +1 -0
  171. package/dist/cli/daemon.d.ts +29 -0
  172. package/dist/cli/daemon.d.ts.map +1 -0
  173. package/dist/cli/errors.d.ts +20 -0
  174. package/dist/cli/errors.d.ts.map +1 -0
  175. package/dist/cli/help.d.ts +28 -0
  176. package/dist/cli/help.d.ts.map +1 -0
  177. package/dist/cli/index.d.ts +2 -0
  178. package/dist/cli/index.d.ts.map +1 -0
  179. package/dist/cli/index.js +2205 -267
  180. package/dist/cli/index.js.map +1 -1
  181. package/dist/cli/installers/global.d.ts +9 -0
  182. package/dist/cli/installers/global.d.ts.map +1 -0
  183. package/dist/cli/installers/local.d.ts +9 -0
  184. package/dist/cli/installers/local.d.ts.map +1 -0
  185. package/dist/cli/installers/skills.d.ts +19 -0
  186. package/dist/cli/installers/skills.d.ts.map +1 -0
  187. package/dist/cli/output.d.ts +7 -0
  188. package/dist/cli/output.d.ts.map +1 -0
  189. package/dist/cli/remote-manager.d.ts +96 -0
  190. package/dist/cli/remote-manager.d.ts.map +1 -0
  191. package/dist/cli/remote-relay.d.ts +17 -0
  192. package/dist/cli/remote-relay.d.ts.map +1 -0
  193. package/dist/cli/templates/config.d.ts +7 -0
  194. package/dist/cli/templates/config.d.ts.map +1 -0
  195. package/dist/cli/utils/config.d.ts +20 -0
  196. package/dist/cli/utils/config.d.ts.map +1 -0
  197. package/dist/cli/utils/http.d.ts +5 -0
  198. package/dist/cli/utils/http.d.ts.map +1 -0
  199. package/dist/cli/utils/parse.d.ts +8 -0
  200. package/dist/cli/utils/parse.d.ts.map +1 -0
  201. package/dist/cli/utils/skills.d.ts +12 -0
  202. package/dist/cli/utils/skills.d.ts.map +1 -0
  203. package/dist/config.d.ts +208 -0
  204. package/dist/config.d.ts.map +1 -0
  205. package/dist/core/bootstrap.d.ts +3 -0
  206. package/dist/core/bootstrap.d.ts.map +1 -0
  207. package/dist/core/index.d.ts +3 -0
  208. package/dist/core/index.d.ts.map +1 -0
  209. package/dist/core/logging.d.ts +34 -0
  210. package/dist/core/logging.d.ts.map +1 -0
  211. package/dist/core/types.d.ts +34 -0
  212. package/dist/core/types.d.ts.map +1 -0
  213. package/dist/devtools/console-tracker.d.ts +44 -0
  214. package/dist/devtools/console-tracker.d.ts.map +1 -0
  215. package/dist/devtools/exception-tracker.d.ts +42 -0
  216. package/dist/devtools/exception-tracker.d.ts.map +1 -0
  217. package/dist/devtools/network-tracker.d.ts +34 -0
  218. package/dist/devtools/network-tracker.d.ts.map +1 -0
  219. package/dist/export/css-extract.d.ts +5 -0
  220. package/dist/export/css-extract.d.ts.map +1 -0
  221. package/dist/export/dom-capture.d.ts +15 -0
  222. package/dist/export/dom-capture.d.ts.map +1 -0
  223. package/dist/export/react-emitter.d.ts +11 -0
  224. package/dist/export/react-emitter.d.ts.map +1 -0
  225. package/dist/extension-extractor.d.ts +3 -0
  226. package/dist/extension-extractor.d.ts.map +1 -0
  227. package/dist/index.d.ts +3 -4
  228. package/dist/index.d.ts.map +1 -0
  229. package/dist/index.js +867 -87
  230. package/dist/index.js.map +1 -1
  231. package/dist/macros/execute.d.ts +44 -0
  232. package/dist/macros/execute.d.ts.map +1 -0
  233. package/dist/macros/index.d.ts +9 -0
  234. package/dist/macros/index.d.ts.map +1 -0
  235. package/dist/macros/packs/core.d.ts +3 -0
  236. package/dist/macros/packs/core.d.ts.map +1 -0
  237. package/dist/macros/registry.d.ts +48 -0
  238. package/dist/macros/registry.d.ts.map +1 -0
  239. package/dist/macros-NUBRM44Y.js +399 -0
  240. package/dist/macros-NUBRM44Y.js.map +1 -0
  241. package/dist/opendevbrowser.d.ts +3 -4
  242. package/dist/opendevbrowser.d.ts.map +1 -0
  243. package/dist/opendevbrowser.js +867 -87
  244. package/dist/opendevbrowser.js.map +1 -1
  245. package/dist/providers/adaptive-concurrency.d.ts +42 -0
  246. package/dist/providers/adaptive-concurrency.d.ts.map +1 -0
  247. package/dist/providers/artifacts.d.ts +34 -0
  248. package/dist/providers/artifacts.d.ts.map +1 -0
  249. package/dist/providers/blocker.d.ts +47 -0
  250. package/dist/providers/blocker.d.ts.map +1 -0
  251. package/dist/providers/community/index.d.ts +44 -0
  252. package/dist/providers/community/index.d.ts.map +1 -0
  253. package/dist/providers/enrichment.d.ts +33 -0
  254. package/dist/providers/enrichment.d.ts.map +1 -0
  255. package/dist/providers/errors.d.ts +41 -0
  256. package/dist/providers/errors.d.ts.map +1 -0
  257. package/dist/providers/index.d.ts +121 -0
  258. package/dist/providers/index.d.ts.map +1 -0
  259. package/dist/providers/normalize.d.ts +39 -0
  260. package/dist/providers/normalize.d.ts.map +1 -0
  261. package/dist/providers/policy.d.ts +5 -0
  262. package/dist/providers/policy.d.ts.map +1 -0
  263. package/dist/providers/registry.d.ts +22 -0
  264. package/dist/providers/registry.d.ts.map +1 -0
  265. package/dist/providers/renderer.d.ts +49 -0
  266. package/dist/providers/renderer.d.ts.map +1 -0
  267. package/dist/providers/runtime-factory.d.ts +20 -0
  268. package/dist/providers/runtime-factory.d.ts.map +1 -0
  269. package/dist/providers/safety/prompt-guard.d.ts +34 -0
  270. package/dist/providers/safety/prompt-guard.d.ts.map +1 -0
  271. package/dist/providers/shared/anti-bot-policy.d.ts +51 -0
  272. package/dist/providers/shared/anti-bot-policy.d.ts.map +1 -0
  273. package/dist/providers/shared/post-policy.d.ts +31 -0
  274. package/dist/providers/shared/post-policy.d.ts.map +1 -0
  275. package/dist/providers/shared/request-headers.d.ts +5 -0
  276. package/dist/providers/shared/request-headers.d.ts.map +1 -0
  277. package/dist/providers/shared/traversal-url.d.ts +2 -0
  278. package/dist/providers/shared/traversal-url.d.ts.map +1 -0
  279. package/dist/providers/shopping/index.d.ts +63 -0
  280. package/dist/providers/shopping/index.d.ts.map +1 -0
  281. package/dist/providers/social/bluesky.d.ts +3 -0
  282. package/dist/providers/social/bluesky.d.ts.map +1 -0
  283. package/dist/providers/social/facebook.d.ts +3 -0
  284. package/dist/providers/social/facebook.d.ts.map +1 -0
  285. package/dist/providers/social/index.d.ts +31 -0
  286. package/dist/providers/social/index.d.ts.map +1 -0
  287. package/dist/providers/social/instagram.d.ts +3 -0
  288. package/dist/providers/social/instagram.d.ts.map +1 -0
  289. package/dist/providers/social/linkedin.d.ts +3 -0
  290. package/dist/providers/social/linkedin.d.ts.map +1 -0
  291. package/dist/providers/social/platform.d.ts +40 -0
  292. package/dist/providers/social/platform.d.ts.map +1 -0
  293. package/dist/providers/social/reddit.d.ts +3 -0
  294. package/dist/providers/social/reddit.d.ts.map +1 -0
  295. package/dist/providers/social/threads.d.ts +3 -0
  296. package/dist/providers/social/threads.d.ts.map +1 -0
  297. package/dist/providers/social/tiktok.d.ts +3 -0
  298. package/dist/providers/social/tiktok.d.ts.map +1 -0
  299. package/dist/providers/social/x.d.ts +3 -0
  300. package/dist/providers/social/x.d.ts.map +1 -0
  301. package/dist/providers/social/youtube-resolver.d.ts +78 -0
  302. package/dist/providers/social/youtube-resolver.d.ts.map +1 -0
  303. package/dist/providers/social/youtube.d.ts +34 -0
  304. package/dist/providers/social/youtube.d.ts.map +1 -0
  305. package/dist/providers/tier-router.d.ts +30 -0
  306. package/dist/providers/tier-router.d.ts.map +1 -0
  307. package/dist/providers/timebox.d.ts +20 -0
  308. package/dist/providers/timebox.d.ts.map +1 -0
  309. package/dist/providers/types.d.ts +344 -0
  310. package/dist/providers/types.d.ts.map +1 -0
  311. package/dist/providers/web/crawl-worker.d.ts +36 -0
  312. package/dist/providers/web/crawl-worker.d.ts.map +1 -0
  313. package/dist/providers/web/crawler.d.ts +101 -0
  314. package/dist/providers/web/crawler.d.ts.map +1 -0
  315. package/dist/providers/web/extract.d.ts +11 -0
  316. package/dist/providers/web/extract.d.ts.map +1 -0
  317. package/dist/providers/web/index.d.ts +24 -0
  318. package/dist/providers/web/index.d.ts.map +1 -0
  319. package/dist/providers/web/policy.d.ts +14 -0
  320. package/dist/providers/web/policy.d.ts.map +1 -0
  321. package/dist/providers/workflows.d.ts +67 -0
  322. package/dist/providers/workflows.d.ts.map +1 -0
  323. package/dist/relay/protocol.d.ts +317 -0
  324. package/dist/relay/protocol.d.ts.map +1 -0
  325. package/dist/relay/relay-endpoints.d.ts +16 -0
  326. package/dist/relay/relay-endpoints.d.ts.map +1 -0
  327. package/dist/relay/relay-server.d.ts +111 -0
  328. package/dist/relay/relay-server.d.ts.map +1 -0
  329. package/dist/relay/relay-types.d.ts +9 -0
  330. package/dist/relay/relay-types.d.ts.map +1 -0
  331. package/dist/skills/continuity-nudge.d.ts +12 -0
  332. package/dist/skills/continuity-nudge.d.ts.map +1 -0
  333. package/dist/skills/skill-loader.d.ts +20 -0
  334. package/dist/skills/skill-loader.d.ts.map +1 -0
  335. package/dist/skills/skill-nudge.d.ts +18 -0
  336. package/dist/skills/skill-nudge.d.ts.map +1 -0
  337. package/dist/skills/types.d.ts +12 -0
  338. package/dist/skills/types.d.ts.map +1 -0
  339. package/dist/snapshot/ops-snapshot.d.ts +16 -0
  340. package/dist/snapshot/ops-snapshot.d.ts.map +1 -0
  341. package/dist/snapshot/refs.d.ts +23 -0
  342. package/dist/snapshot/refs.d.ts.map +1 -0
  343. package/dist/snapshot/snapshotter.d.ts +27 -0
  344. package/dist/snapshot/snapshotter.d.ts.map +1 -0
  345. package/dist/tools/annotate.d.ts +4 -0
  346. package/dist/tools/annotate.d.ts.map +1 -0
  347. package/dist/tools/check.d.ts +4 -0
  348. package/dist/tools/check.d.ts.map +1 -0
  349. package/dist/tools/click.d.ts +4 -0
  350. package/dist/tools/click.d.ts.map +1 -0
  351. package/dist/tools/clone_component.d.ts +4 -0
  352. package/dist/tools/clone_component.d.ts.map +1 -0
  353. package/dist/tools/clone_page.d.ts +4 -0
  354. package/dist/tools/clone_page.d.ts.map +1 -0
  355. package/dist/tools/close.d.ts +4 -0
  356. package/dist/tools/close.d.ts.map +1 -0
  357. package/dist/tools/connect.d.ts +4 -0
  358. package/dist/tools/connect.d.ts.map +1 -0
  359. package/dist/tools/console_poll.d.ts +4 -0
  360. package/dist/tools/console_poll.d.ts.map +1 -0
  361. package/dist/tools/cookie_import.d.ts +25 -0
  362. package/dist/tools/cookie_import.d.ts.map +1 -0
  363. package/dist/tools/cookie_list.d.ts +9 -0
  364. package/dist/tools/cookie_list.d.ts.map +1 -0
  365. package/dist/tools/debug_trace_snapshot.d.ts +4 -0
  366. package/dist/tools/debug_trace_snapshot.d.ts.map +1 -0
  367. package/dist/tools/deps.d.ts +26 -0
  368. package/dist/tools/deps.d.ts.map +1 -0
  369. package/dist/tools/disconnect.d.ts +4 -0
  370. package/dist/tools/disconnect.d.ts.map +1 -0
  371. package/dist/tools/dom_get_html.d.ts +4 -0
  372. package/dist/tools/dom_get_html.d.ts.map +1 -0
  373. package/dist/tools/dom_get_text.d.ts +4 -0
  374. package/dist/tools/dom_get_text.d.ts.map +1 -0
  375. package/dist/tools/get_attr.d.ts +4 -0
  376. package/dist/tools/get_attr.d.ts.map +1 -0
  377. package/dist/tools/get_value.d.ts +4 -0
  378. package/dist/tools/get_value.d.ts.map +1 -0
  379. package/dist/tools/goto.d.ts +4 -0
  380. package/dist/tools/goto.d.ts.map +1 -0
  381. package/dist/tools/hover.d.ts +4 -0
  382. package/dist/tools/hover.d.ts.map +1 -0
  383. package/dist/tools/index.d.ts +4 -0
  384. package/dist/tools/index.d.ts.map +1 -0
  385. package/dist/tools/is_checked.d.ts +4 -0
  386. package/dist/tools/is_checked.d.ts.map +1 -0
  387. package/dist/tools/is_enabled.d.ts +4 -0
  388. package/dist/tools/is_enabled.d.ts.map +1 -0
  389. package/dist/tools/is_visible.d.ts +4 -0
  390. package/dist/tools/is_visible.d.ts.map +1 -0
  391. package/dist/tools/launch.d.ts +4 -0
  392. package/dist/tools/launch.d.ts.map +1 -0
  393. package/dist/tools/list.d.ts +4 -0
  394. package/dist/tools/list.d.ts.map +1 -0
  395. package/dist/tools/macro_resolve.d.ts +25 -0
  396. package/dist/tools/macro_resolve.d.ts.map +1 -0
  397. package/dist/tools/network_poll.d.ts +4 -0
  398. package/dist/tools/network_poll.d.ts.map +1 -0
  399. package/dist/tools/page.d.ts +4 -0
  400. package/dist/tools/page.d.ts.map +1 -0
  401. package/dist/tools/perf.d.ts +4 -0
  402. package/dist/tools/perf.d.ts.map +1 -0
  403. package/dist/tools/press.d.ts +4 -0
  404. package/dist/tools/press.d.ts.map +1 -0
  405. package/dist/tools/product_video_run.d.ts +4 -0
  406. package/dist/tools/product_video_run.d.ts.map +1 -0
  407. package/dist/tools/prompting_guide.d.ts +4 -0
  408. package/dist/tools/prompting_guide.d.ts.map +1 -0
  409. package/dist/tools/research_run.d.ts +4 -0
  410. package/dist/tools/research_run.d.ts.map +1 -0
  411. package/dist/tools/response.d.ts +16 -0
  412. package/dist/tools/response.d.ts.map +1 -0
  413. package/dist/tools/run.d.ts +4 -0
  414. package/dist/tools/run.d.ts.map +1 -0
  415. package/dist/tools/screenshot.d.ts +4 -0
  416. package/dist/tools/screenshot.d.ts.map +1 -0
  417. package/dist/tools/scroll.d.ts +4 -0
  418. package/dist/tools/scroll.d.ts.map +1 -0
  419. package/dist/tools/scroll_into_view.d.ts +4 -0
  420. package/dist/tools/scroll_into_view.d.ts.map +1 -0
  421. package/dist/tools/select.d.ts +4 -0
  422. package/dist/tools/select.d.ts.map +1 -0
  423. package/dist/tools/shopping_run.d.ts +4 -0
  424. package/dist/tools/shopping_run.d.ts.map +1 -0
  425. package/dist/tools/skill_list.d.ts +4 -0
  426. package/dist/tools/skill_list.d.ts.map +1 -0
  427. package/dist/tools/skill_load.d.ts +4 -0
  428. package/dist/tools/skill_load.d.ts.map +1 -0
  429. package/dist/tools/snapshot.d.ts +4 -0
  430. package/dist/tools/snapshot.d.ts.map +1 -0
  431. package/dist/tools/status.d.ts +4 -0
  432. package/dist/tools/status.d.ts.map +1 -0
  433. package/dist/tools/target_close.d.ts +4 -0
  434. package/dist/tools/target_close.d.ts.map +1 -0
  435. package/dist/tools/target_new.d.ts +4 -0
  436. package/dist/tools/target_new.d.ts.map +1 -0
  437. package/dist/tools/target_use.d.ts +4 -0
  438. package/dist/tools/target_use.d.ts.map +1 -0
  439. package/dist/tools/targets_list.d.ts +4 -0
  440. package/dist/tools/targets_list.d.ts.map +1 -0
  441. package/dist/tools/type.d.ts +4 -0
  442. package/dist/tools/type.d.ts.map +1 -0
  443. package/dist/tools/uncheck.d.ts +4 -0
  444. package/dist/tools/uncheck.d.ts.map +1 -0
  445. package/dist/tools/wait.d.ts +4 -0
  446. package/dist/tools/wait.d.ts.map +1 -0
  447. package/dist/tools/workflow-runtime.d.ts +4 -0
  448. package/dist/tools/workflow-runtime.d.ts.map +1 -0
  449. package/dist/utils/crypto.d.ts +2 -0
  450. package/dist/utils/crypto.d.ts.map +1 -0
  451. package/dist/utils/endpoint-validation.d.ts +2 -0
  452. package/dist/utils/endpoint-validation.d.ts.map +1 -0
  453. package/dist/utils/fs.d.ts +5 -0
  454. package/dist/utils/fs.d.ts.map +1 -0
  455. package/dist/utils/hub-enabled.d.ts +3 -0
  456. package/dist/utils/hub-enabled.d.ts.map +1 -0
  457. package/extension/dist/background.js +10 -4
  458. package/extension/dist/ops/ops-runtime.js +506 -4
  459. package/extension/dist/ops/ops-session-store.js +16 -2
  460. package/extension/dist/ops/parallelism-governor.js +117 -0
  461. package/extension/dist/ops/snapshot-shared.js +21 -5
  462. package/extension/dist/services/CDPRouter.js +70 -5
  463. package/extension/dist/services/ConnectionManager.js +5 -3
  464. package/extension/icons/icon128.png +0 -0
  465. package/extension/icons/icon16.png +0 -0
  466. package/extension/icons/icon32.png +0 -0
  467. package/extension/icons/icon48.png +0 -0
  468. package/extension/manifest.json +1 -1
  469. package/package.json +25 -16
  470. package/scripts/native/host.cjs +230 -0
  471. package/scripts/native/install.ps1 +73 -0
  472. package/scripts/native/install.sh +66 -0
  473. package/scripts/native/uninstall.ps1 +25 -0
  474. package/scripts/native/uninstall.sh +26 -0
  475. package/skills/AGENTS.md +17 -8
  476. package/skills/opendevbrowser-best-practices/SKILL.md +178 -72
  477. package/skills/opendevbrowser-best-practices/artifacts/browser-agent-known-issues-matrix.md +44 -0
  478. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +95 -0
  479. package/skills/opendevbrowser-best-practices/artifacts/debug-trace-playbook.md +36 -0
  480. package/skills/opendevbrowser-best-practices/artifacts/fingerprint-tiers.md +36 -0
  481. package/skills/opendevbrowser-best-practices/artifacts/macro-workflows.md +43 -0
  482. package/skills/opendevbrowser-best-practices/artifacts/parity-gates.md +36 -0
  483. package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +89 -0
  484. package/skills/opendevbrowser-best-practices/assets/templates/cdp-forward-envelope.json +11 -0
  485. package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +56 -0
  486. package/skills/opendevbrowser-best-practices/assets/templates/ops-request-envelope.json +9 -0
  487. package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +79 -0
  488. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +24 -0
  489. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +144 -0
  490. package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +83 -0
  491. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +93 -0
  492. package/skills/opendevbrowser-continuity-ledger/SKILL.md +10 -0
  493. package/skills/opendevbrowser-data-extraction/SKILL.md +126 -0
  494. package/skills/opendevbrowser-data-extraction/artifacts/extraction-workflows.md +31 -0
  495. package/skills/opendevbrowser-data-extraction/assets/templates/compliance-checklist.md +7 -0
  496. package/skills/opendevbrowser-data-extraction/assets/templates/extraction-schema.json +17 -0
  497. package/skills/opendevbrowser-data-extraction/assets/templates/pagination-state.json +11 -0
  498. package/skills/opendevbrowser-data-extraction/assets/templates/quality-gates.json +10 -0
  499. package/skills/opendevbrowser-data-extraction/examples/sample-schema.json +19 -0
  500. package/skills/opendevbrowser-data-extraction/scripts/run-extraction-workflow.sh +83 -0
  501. package/skills/opendevbrowser-data-extraction/scripts/validate-skill-assets.sh +49 -0
  502. package/skills/opendevbrowser-form-testing/SKILL.md +143 -0
  503. package/skills/opendevbrowser-form-testing/artifacts/form-workflows.md +37 -0
  504. package/skills/opendevbrowser-form-testing/assets/templates/a11y-assertions.md +7 -0
  505. package/skills/opendevbrowser-form-testing/assets/templates/challenge-decision-tree.json +16 -0
  506. package/skills/opendevbrowser-form-testing/assets/templates/multi-step-state.json +11 -0
  507. package/skills/opendevbrowser-form-testing/assets/templates/validation-matrix.json +24 -0
  508. package/skills/opendevbrowser-form-testing/examples/sample-validation-matrix.json +29 -0
  509. package/skills/opendevbrowser-form-testing/scripts/run-form-workflow.sh +82 -0
  510. package/skills/opendevbrowser-form-testing/scripts/validate-skill-assets.sh +49 -0
  511. package/skills/opendevbrowser-login-automation/SKILL.md +159 -0
  512. package/skills/opendevbrowser-login-automation/artifacts/login-workflows.md +39 -0
  513. package/skills/opendevbrowser-login-automation/assets/templates/auth-signals.json +21 -0
  514. package/skills/opendevbrowser-login-automation/assets/templates/challenge-checkpoint.md +10 -0
  515. package/skills/opendevbrowser-login-automation/assets/templates/login-scenario-matrix.json +26 -0
  516. package/skills/opendevbrowser-login-automation/examples/sample-auth-signals.json +14 -0
  517. package/skills/opendevbrowser-login-automation/scripts/record-auth-signals.sh +18 -0
  518. package/skills/opendevbrowser-login-automation/scripts/run-login-workflow.sh +99 -0
  519. package/skills/opendevbrowser-login-automation/scripts/validate-skill-assets.sh +50 -0
  520. package/skills/opendevbrowser-product-presentation-asset/SKILL.md +98 -0
  521. package/skills/opendevbrowser-product-presentation-asset/artifacts/asset-pack-assembly.md +23 -0
  522. package/skills/opendevbrowser-product-presentation-asset/artifacts/ugc-creative-guide.md +21 -0
  523. package/skills/opendevbrowser-product-presentation-asset/assets/templates/claims-evidence-map.md +5 -0
  524. package/skills/opendevbrowser-product-presentation-asset/assets/templates/copy.md +5 -0
  525. package/skills/opendevbrowser-product-presentation-asset/assets/templates/features.md +4 -0
  526. package/skills/opendevbrowser-product-presentation-asset/assets/templates/manifest.schema.json +14 -0
  527. package/skills/opendevbrowser-product-presentation-asset/assets/templates/shot-list.md +7 -0
  528. package/skills/opendevbrowser-product-presentation-asset/assets/templates/ugc-concepts.md +17 -0
  529. package/skills/opendevbrowser-product-presentation-asset/assets/templates/user-actions.md +7 -0
  530. package/skills/opendevbrowser-product-presentation-asset/assets/templates/video-assembly.md +18 -0
  531. package/skills/opendevbrowser-product-presentation-asset/examples/sample-input.json +6 -0
  532. package/skills/opendevbrowser-product-presentation-asset/examples/sample-manifest.json +18 -0
  533. package/skills/opendevbrowser-product-presentation-asset/scripts/capture-screenshots.sh +9 -0
  534. package/skills/opendevbrowser-product-presentation-asset/scripts/collect-product.sh +14 -0
  535. package/skills/opendevbrowser-product-presentation-asset/scripts/download-images.sh +9 -0
  536. package/skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh +96 -0
  537. package/skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh +56 -0
  538. package/skills/opendevbrowser-product-presentation-asset/scripts/write-manifest.sh +43 -0
  539. package/skills/opendevbrowser-research/SKILL.md +73 -0
  540. package/skills/opendevbrowser-research/artifacts/research-workflows.md +29 -0
  541. package/skills/opendevbrowser-research/assets/templates/compact.md +7 -0
  542. package/skills/opendevbrowser-research/assets/templates/context.json +18 -0
  543. package/skills/opendevbrowser-research/assets/templates/report.md +9 -0
  544. package/skills/opendevbrowser-research/examples/sample-input.json +6 -0
  545. package/skills/opendevbrowser-research/examples/sample-output.md +4 -0
  546. package/skills/opendevbrowser-research/scripts/render-output.sh +12 -0
  547. package/skills/opendevbrowser-research/scripts/run-research.sh +23 -0
  548. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +48 -0
  549. package/skills/opendevbrowser-research/scripts/write-artifacts.sh +29 -0
  550. package/skills/opendevbrowser-shopping/SKILL.md +118 -0
  551. package/skills/opendevbrowser-shopping/artifacts/deal-hunting-workflows.md +37 -0
  552. package/skills/opendevbrowser-shopping/assets/templates/deal-thresholds.json +8 -0
  553. package/skills/opendevbrowser-shopping/assets/templates/deals-context.json +9 -0
  554. package/skills/opendevbrowser-shopping/assets/templates/deals-table.md +4 -0
  555. package/skills/opendevbrowser-shopping/assets/templates/market-analysis.json +30 -0
  556. package/skills/opendevbrowser-shopping/examples/sample-deals.md +4 -0
  557. package/skills/opendevbrowser-shopping/examples/sample-query.json +5 -0
  558. package/skills/opendevbrowser-shopping/scripts/analyze-market.sh +307 -0
  559. package/skills/opendevbrowser-shopping/scripts/normalize-offers.sh +28 -0
  560. package/skills/opendevbrowser-shopping/scripts/render-deals.sh +13 -0
  561. package/skills/opendevbrowser-shopping/scripts/run-deal-hunt.sh +32 -0
  562. package/skills/opendevbrowser-shopping/scripts/run-shopping.sh +19 -0
  563. package/skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh +53 -0
  564. package/dist/chunk-JVBMT2O5.js +0 -7173
  565. package/dist/chunk-JVBMT2O5.js.map +0 -1
  566. package/skills/data-extraction/SKILL.md +0 -128
  567. package/skills/form-testing/SKILL.md +0 -106
  568. package/skills/login-automation/SKILL.md +0 -108
@@ -0,0 +1,4 @@
1
+ import type { ProviderExecutor } from "../providers";
2
+ import type { ToolDeps } from "./deps";
3
+ export declare const resolveProviderRuntime: (deps: ToolDeps) => ProviderExecutor;
4
+ //# sourceMappingURL=workflow-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-runtime.d.ts","sourceRoot":"","sources":["../../src/tools/workflow-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAErD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAEvC,eAAO,MAAM,sBAAsB,GAAI,MAAM,QAAQ,KAAG,gBAUvD,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function generateSecureToken(): string;
2
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/utils/crypto.ts"],"names":[],"mappings":"AAEA,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C"}
@@ -0,0 +1,2 @@
1
+ export declare function ensureLocalEndpoint(endpoint: string, allowNonLocal: boolean): void;
2
+ //# sourceMappingURL=endpoint-validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-validation.d.ts","sourceRoot":"","sources":["../../src/utils/endpoint-validation.ts"],"names":[],"mappings":"AAAA,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI,CAqBlF"}
@@ -0,0 +1,5 @@
1
+ export declare function writeFileAtomic(filePath: string, content: string, options?: {
2
+ encoding?: BufferEncoding;
3
+ mode?: number;
4
+ }): void;
5
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,cAAc,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,IAAI,CA2BN"}
@@ -0,0 +1,3 @@
1
+ import type { OpenDevBrowserConfig } from "../config";
2
+ export declare const isHubEnabled: (config: OpenDevBrowserConfig) => boolean;
3
+ //# sourceMappingURL=hub-enabled.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hub-enabled.d.ts","sourceRoot":"","sources":["../../src/utils/hub-enabled.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEtD,eAAO,MAAM,YAAY,GAAI,QAAQ,oBAAoB,KAAG,OAE3D,CAAC"}
@@ -31,6 +31,8 @@ const ANNOTATION_MAX_PAYLOAD_BYTES = 10 * 1024 * 1024;
31
31
  const ANNOTATION_REQUEST_TIMEOUT_MS = 120_000;
32
32
  const LAST_ANNOTATION_META_KEY = "annotationLastMeta";
33
33
  const LAST_ANNOTATION_PAYLOAD_KEY = "annotationLastPayloadSansScreenshots";
34
+ const BADGE_CONNECTED_DOT_COLOR = "#16a34a";
35
+ const BADGE_DISCONNECTED_DOT_COLOR = "#dc2626";
34
36
  const annotationSessions = new Map();
35
37
  let lastAnnotationFull = null;
36
38
  connection.onAnnotationCommand((command) => {
@@ -53,10 +55,14 @@ const RESTRICTED_PROTOCOLS = new Set([
53
55
  ]);
54
56
  const updateBadge = (status) => {
55
57
  const isConnected = status === "connected";
56
- chrome.action.setBadgeText({ text: isConnected ? "ON" : "OFF" });
57
- chrome.action.setBadgeBackgroundColor({
58
- color: isConnected ? "#20d5c6" : "#5b667a"
59
- });
58
+ const dotColor = isConnected ? BADGE_CONNECTED_DOT_COLOR : BADGE_DISCONNECTED_DOT_COLOR;
59
+ chrome.action.setBadgeText({ text: "●" });
60
+ if (typeof chrome.action.setBadgeTextColor === "function") {
61
+ chrome.action.setBadgeTextColor({ color: dotColor });
62
+ chrome.action.setBadgeBackgroundColor({ color: [0, 0, 0, 0] });
63
+ return;
64
+ }
65
+ chrome.action.setBadgeBackgroundColor({ color: dotColor });
60
66
  };
61
67
  const getEffectiveStatus = () => {
62
68
  if (connection.getStatus() === "connected") {
@@ -5,12 +5,40 @@ import { logError } from "../logging.js";
5
5
  import { DomBridge } from "./dom-bridge.js";
6
6
  import { buildSnapshot } from "./snapshot-builder.js";
7
7
  import { OpsSessionStore } from "./ops-session-store.js";
8
+ import { DEFAULT_OPS_PARALLELISM_POLICY, evaluateOpsGovernor } from "./parallelism-governor.js";
8
9
  import { redactConsoleText, redactUrl } from "./redaction.js";
9
10
  const MAX_CONSOLE_EVENTS = 200;
10
11
  const MAX_NETWORK_EVENTS = 300;
11
12
  const SESSION_TTL_MS = 20_000;
12
13
  const SCREENSHOT_TIMEOUT_MS = 8000;
13
14
  const TAB_CLOSE_TIMEOUT_MS = 5000;
15
+ const TARGET_SCOPED_COMMANDS = new Set([
16
+ "storage.setCookies",
17
+ "storage.getCookies",
18
+ "nav.goto",
19
+ "nav.wait",
20
+ "nav.snapshot",
21
+ "interact.click",
22
+ "interact.hover",
23
+ "interact.press",
24
+ "interact.check",
25
+ "interact.uncheck",
26
+ "interact.type",
27
+ "interact.select",
28
+ "interact.scroll",
29
+ "interact.scrollIntoView",
30
+ "dom.getHtml",
31
+ "dom.getText",
32
+ "dom.getAttr",
33
+ "dom.getValue",
34
+ "dom.isVisible",
35
+ "dom.isEnabled",
36
+ "dom.isChecked",
37
+ "export.clonePage",
38
+ "export.cloneComponent",
39
+ "devtools.perf",
40
+ "page.screenshot"
41
+ ]);
14
42
  export class OpsRuntime {
15
43
  sendEnvelope;
16
44
  cdp;
@@ -19,10 +47,12 @@ export class OpsRuntime {
19
47
  sessions = new OpsSessionStore();
20
48
  encoder = new TextEncoder();
21
49
  closingTimers = new Map();
50
+ parallelWaiters = new Map();
22
51
  constructor(options) {
23
52
  this.sendEnvelope = options.send;
24
53
  this.cdp = options.cdp;
25
54
  chrome.tabs.onRemoved.addListener(this.handleTabRemoved);
55
+ chrome.tabs.onUpdated.addListener(this.handleTabUpdated);
26
56
  chrome.debugger.onEvent.addListener(this.handleDebuggerEvent);
27
57
  chrome.debugger.onDetach.addListener(this.handleDebuggerDetach);
28
58
  }
@@ -95,6 +125,19 @@ export class OpsRuntime {
95
125
  handleTabRemoved = (tabId) => {
96
126
  this.handleClosedTarget(tabId, "ops_tab_closed");
97
127
  };
128
+ handleTabUpdated = (tabId, changeInfo, tab) => {
129
+ const session = this.sessions.getByTabId(tabId);
130
+ if (!session)
131
+ return;
132
+ if (changeInfo.discarded === true || tab.discarded === true) {
133
+ session.discardedSignals += 1;
134
+ }
135
+ const frozenChange = changeInfo.frozen === true;
136
+ const frozenTab = tab.frozen === true;
137
+ if (frozenChange || frozenTab) {
138
+ session.frozenSignals += 1;
139
+ }
140
+ };
98
141
  handleDebuggerDetach = (source) => {
99
142
  if (typeof source.tabId !== "number")
100
143
  return;
@@ -197,6 +240,12 @@ export class OpsRuntime {
197
240
  case "session.status":
198
241
  await this.handleSessionStatus(message, clientId);
199
242
  return;
243
+ case "storage.setCookies":
244
+ await this.withSession(message, clientId, (session) => this.handleStorageSetCookies(message, session));
245
+ return;
246
+ case "storage.getCookies":
247
+ await this.withSession(message, clientId, (session) => this.handleStorageGetCookies(message, session));
248
+ return;
200
249
  case "targets.list":
201
250
  await this.withSession(message, clientId, (session) => this.handleTargetsList(message, session));
202
251
  return;
@@ -299,6 +348,7 @@ export class OpsRuntime {
299
348
  }
300
349
  async handleSessionLaunch(message, clientId) {
301
350
  const payload = isRecord(message.payload) ? message.payload : {};
351
+ const parallelismPolicy = parseParallelismPolicy(payload.parallelismPolicy);
302
352
  const startUrl = typeof payload.startUrl === "string" ? payload.startUrl : undefined;
303
353
  if (startUrl) {
304
354
  try {
@@ -342,6 +392,8 @@ export class OpsRuntime {
342
392
  const session = this.sessions.createSession(clientId, activeTab.id, leaseId, {
343
393
  url: activeTab.url ?? undefined,
344
394
  title: activeTab.title ?? undefined
395
+ }, {
396
+ parallelismPolicy
345
397
  });
346
398
  await this.enableSessionDomains(session);
347
399
  this.sendEvent({
@@ -925,6 +977,90 @@ export class OpsRuntime {
925
977
  const nextSeq = lastEvent ? lastEvent.seq : sinceSeq;
926
978
  this.sendResponse(message, { events, nextSeq });
927
979
  }
980
+ async handleStorageSetCookies(message, session) {
981
+ const payload = isRecord(message.payload) ? message.payload : {};
982
+ const cookies = Array.isArray(payload.cookies) ? payload.cookies : null;
983
+ if (!cookies) {
984
+ this.sendError(message, buildError("invalid_request", "Missing cookies", false));
985
+ return;
986
+ }
987
+ const strict = payload.strict !== false;
988
+ const requestId = typeof payload.requestId === "string" && payload.requestId.trim().length > 0
989
+ ? payload.requestId
990
+ : createId();
991
+ const normalized = [];
992
+ const rejected = [];
993
+ cookies.forEach((entry, index) => {
994
+ if (!isRecord(entry)) {
995
+ rejected.push({ index, reason: "Invalid cookie entry: expected object." });
996
+ return;
997
+ }
998
+ const validation = validateCookieRecord(entry);
999
+ if (!validation.valid) {
1000
+ rejected.push({ index, reason: validation.reason });
1001
+ return;
1002
+ }
1003
+ normalized.push(validation.cookie);
1004
+ });
1005
+ if (strict && rejected.length > 0) {
1006
+ this.sendError(message, buildError("invalid_request", `Cookie import rejected ${rejected.length} entries.`, false));
1007
+ return;
1008
+ }
1009
+ if (normalized.length > 0) {
1010
+ const target = this.requireActiveTarget(session, message);
1011
+ if (!target)
1012
+ return;
1013
+ try {
1014
+ await this.cdp.sendCommand({ tabId: target.tabId }, "Network.setCookies", { cookies: normalized });
1015
+ }
1016
+ catch (error) {
1017
+ const detail = error instanceof Error ? error.message : "Cookie import failed";
1018
+ this.sendError(message, buildError("execution_failed", detail, false));
1019
+ return;
1020
+ }
1021
+ }
1022
+ this.sendResponse(message, {
1023
+ requestId,
1024
+ imported: normalized.length,
1025
+ rejected
1026
+ });
1027
+ }
1028
+ async handleStorageGetCookies(message, session) {
1029
+ const payload = isRecord(message.payload) ? message.payload : {};
1030
+ const requestId = typeof payload.requestId === "string" && payload.requestId.trim().length > 0
1031
+ ? payload.requestId
1032
+ : createId();
1033
+ let urls;
1034
+ try {
1035
+ urls = parseCookieFilterUrls(payload.urls);
1036
+ }
1037
+ catch (error) {
1038
+ const detail = error instanceof Error ? error.message : "Invalid cookie url filter.";
1039
+ this.sendError(message, buildError("invalid_request", detail, false));
1040
+ return;
1041
+ }
1042
+ const target = this.requireActiveTarget(session, message);
1043
+ if (!target)
1044
+ return;
1045
+ let rawCookies = [];
1046
+ try {
1047
+ const response = await this.cdp.sendCommand({ tabId: target.tabId }, "Network.getCookies", urls ? { urls } : {});
1048
+ rawCookies = Array.isArray(response.cookies) ? response.cookies : [];
1049
+ }
1050
+ catch (error) {
1051
+ const detail = error instanceof Error ? error.message : "Cookie list failed";
1052
+ this.sendError(message, buildError("execution_failed", detail, false));
1053
+ return;
1054
+ }
1055
+ const cookies = rawCookies
1056
+ .map((entry) => toCookieListRecord(entry))
1057
+ .filter((entry) => entry !== null);
1058
+ this.sendResponse(message, {
1059
+ requestId,
1060
+ cookies,
1061
+ count: cookies.length
1062
+ });
1063
+ }
928
1064
  async enableSessionDomains(session) {
929
1065
  try {
930
1066
  await this.cdp.sendCommand({ tabId: session.tabId }, "Runtime.enable", {});
@@ -939,8 +1075,175 @@ export class OpsRuntime {
939
1075
  const session = this.getSessionForMessage(message, clientId);
940
1076
  if (!session)
941
1077
  return;
942
- session.queue = session.queue.then(() => handler(session), () => handler(session));
943
- await session.queue;
1078
+ if (!TARGET_SCOPED_COMMANDS.has(message.command)) {
1079
+ session.queue = session.queue.then(() => handler(session), () => handler(session));
1080
+ await session.queue;
1081
+ return;
1082
+ }
1083
+ try {
1084
+ await this.withTargetQueue(message, session, handler);
1085
+ }
1086
+ catch (error) {
1087
+ if (isParallelismBackpressureError(error)) {
1088
+ this.sendError(message, buildError("parallelism_backpressure", error.message, true, error.details));
1089
+ return;
1090
+ }
1091
+ throw error;
1092
+ }
1093
+ }
1094
+ resolveTargetIdForQueue(session, message) {
1095
+ const payload = isRecord(message.payload) ? message.payload : {};
1096
+ const requested = typeof payload.targetId === "string" ? payload.targetId.trim() : "";
1097
+ return requested || session.activeTargetId || session.targetId;
1098
+ }
1099
+ sessionQueueAgeMs(session) {
1100
+ let oldest = null;
1101
+ for (const value of session.targetQueueOldestAt.values()) {
1102
+ if (oldest === null || value < oldest) {
1103
+ oldest = value;
1104
+ }
1105
+ }
1106
+ return oldest === null ? 0 : Math.max(0, Date.now() - oldest);
1107
+ }
1108
+ sampleParallelism(session) {
1109
+ const now = Date.now();
1110
+ const policy = session.parallelismPolicy;
1111
+ if (session.parallelismState.lastSampleAt > 0
1112
+ && now - session.parallelismState.lastSampleAt < policy.sampleIntervalMs) {
1113
+ return {
1114
+ state: session.parallelismState,
1115
+ pressure: session.parallelismState.lastPressure,
1116
+ targetCap: session.parallelismState.effectiveCap,
1117
+ waitQueueDepth: session.pendingParallel,
1118
+ waitQueueAgeMs: this.sessionQueueAgeMs(session)
1119
+ };
1120
+ }
1121
+ const snapshot = evaluateOpsGovernor(policy, session.parallelismState, {
1122
+ hostFreeMemPct: 100,
1123
+ rssUsagePct: 0,
1124
+ queueAgeMs: this.sessionQueueAgeMs(session),
1125
+ queueDepth: session.pendingParallel,
1126
+ discardedSignals: session.discardedSignals,
1127
+ frozenSignals: session.frozenSignals
1128
+ }, now);
1129
+ session.parallelismState = snapshot.state;
1130
+ session.discardedSignals = 0;
1131
+ session.frozenSignals = 0;
1132
+ return snapshot;
1133
+ }
1134
+ wakeParallelWaiters(session) {
1135
+ const waiters = this.parallelWaiters.get(session.id);
1136
+ if (!waiters || waiters.length === 0) {
1137
+ return;
1138
+ }
1139
+ this.sampleParallelism(session);
1140
+ while (waiters.length > 0 && session.parallelInFlight < session.parallelismState.effectiveCap) {
1141
+ const waiter = waiters.shift();
1142
+ if (!waiter)
1143
+ break;
1144
+ if (waiter.timer !== null) {
1145
+ clearTimeout(waiter.timer);
1146
+ waiter.timer = null;
1147
+ }
1148
+ session.parallelInFlight += 1;
1149
+ waiter.resolve();
1150
+ }
1151
+ if (waiters.length === 0) {
1152
+ this.parallelWaiters.delete(session.id);
1153
+ }
1154
+ }
1155
+ createParallelismBackpressureError(session, targetId, timeoutMs) {
1156
+ const snapshot = this.sampleParallelism(session);
1157
+ const details = {
1158
+ sessionId: session.id,
1159
+ targetId,
1160
+ effectiveParallelCap: session.parallelismState.effectiveCap,
1161
+ inFlight: session.parallelInFlight,
1162
+ waitQueueDepth: snapshot.waitQueueDepth,
1163
+ waitQueueAgeMs: snapshot.waitQueueAgeMs,
1164
+ pressure: snapshot.pressure,
1165
+ timeoutMs
1166
+ };
1167
+ const error = new Error(`Parallelism cap reached for target ${targetId}; retry later.`);
1168
+ error.code = "parallelism_backpressure";
1169
+ error.details = details;
1170
+ return error;
1171
+ }
1172
+ async acquireParallelSlot(session, targetId, timeoutMs) {
1173
+ const waiters = this.parallelWaiters.get(session.id) ?? [];
1174
+ this.parallelWaiters.set(session.id, waiters);
1175
+ this.sampleParallelism(session);
1176
+ if (session.parallelInFlight < session.parallelismState.effectiveCap && waiters.length === 0) {
1177
+ session.parallelInFlight += 1;
1178
+ return;
1179
+ }
1180
+ await new Promise((resolve, reject) => {
1181
+ const waiter = {
1182
+ targetId,
1183
+ enqueuedAt: Date.now(),
1184
+ timeoutMs,
1185
+ resolve,
1186
+ reject,
1187
+ timer: null
1188
+ };
1189
+ waiter.timer = setTimeout(() => {
1190
+ const index = waiters.indexOf(waiter);
1191
+ if (index >= 0) {
1192
+ waiters.splice(index, 1);
1193
+ }
1194
+ if (waiters.length === 0) {
1195
+ this.parallelWaiters.delete(session.id);
1196
+ }
1197
+ reject(this.createParallelismBackpressureError(session, targetId, timeoutMs));
1198
+ }, timeoutMs);
1199
+ waiters.push(waiter);
1200
+ this.wakeParallelWaiters(session);
1201
+ });
1202
+ }
1203
+ releaseParallelSlot(session) {
1204
+ session.parallelInFlight = Math.max(0, session.parallelInFlight - 1);
1205
+ this.wakeParallelWaiters(session);
1206
+ }
1207
+ async withTargetQueue(message, session, handler) {
1208
+ const targetId = this.resolveTargetIdForQueue(session, message);
1209
+ const enqueuedAt = Date.now();
1210
+ const previous = session.targetQueues.get(targetId) ?? Promise.resolve();
1211
+ let releaseQueue = () => { };
1212
+ const gate = new Promise((resolve) => {
1213
+ releaseQueue = resolve;
1214
+ });
1215
+ const tail = previous.then(() => gate, () => gate);
1216
+ session.targetQueues.set(targetId, tail);
1217
+ session.pendingParallel += 1;
1218
+ session.targetQueueDepth.set(targetId, (session.targetQueueDepth.get(targetId) ?? 0) + 1);
1219
+ if (!session.targetQueueOldestAt.has(targetId)) {
1220
+ session.targetQueueOldestAt.set(targetId, enqueuedAt);
1221
+ }
1222
+ await previous;
1223
+ let acquired = false;
1224
+ try {
1225
+ await this.acquireParallelSlot(session, targetId, session.parallelismPolicy.backpressureTimeoutMs);
1226
+ acquired = true;
1227
+ await handler(session);
1228
+ }
1229
+ finally {
1230
+ if (acquired) {
1231
+ this.releaseParallelSlot(session);
1232
+ }
1233
+ releaseQueue();
1234
+ const depth = (session.targetQueueDepth.get(targetId) ?? 1) - 1;
1235
+ if (depth <= 0) {
1236
+ session.targetQueueDepth.delete(targetId);
1237
+ session.targetQueueOldestAt.delete(targetId);
1238
+ }
1239
+ else {
1240
+ session.targetQueueDepth.set(targetId, depth);
1241
+ }
1242
+ session.pendingParallel = Math.max(0, session.pendingParallel - 1);
1243
+ if (session.targetQueues.get(targetId) === tail) {
1244
+ session.targetQueues.delete(targetId);
1245
+ }
1246
+ }
944
1247
  }
945
1248
  getSessionForMessage(message, clientId) {
946
1249
  const opsSessionId = message.opsSessionId;
@@ -974,8 +1277,15 @@ export class OpsRuntime {
974
1277
  session.lastUsedAt = Date.now();
975
1278
  return session;
976
1279
  }
1280
+ requestedTargetId(session, message) {
1281
+ const payload = isRecord(message.payload) ? message.payload : {};
1282
+ if (typeof payload.targetId === "string" && payload.targetId.trim().length > 0) {
1283
+ return payload.targetId.trim();
1284
+ }
1285
+ return session.activeTargetId || null;
1286
+ }
977
1287
  requireActiveTarget(session, message) {
978
- const targetId = session.activeTargetId;
1288
+ const targetId = this.requestedTargetId(session, message);
979
1289
  if (!targetId) {
980
1290
  this.sendError(message, buildError("invalid_request", "No active target", false));
981
1291
  return null;
@@ -1002,7 +1312,12 @@ export class OpsRuntime {
1002
1312
  this.sendError(message, buildError("invalid_request", "Missing ref", false));
1003
1313
  return null;
1004
1314
  }
1005
- const entry = session.refStore.resolve(session.activeTargetId, ref);
1315
+ const targetId = this.requestedTargetId(session, message);
1316
+ if (!targetId) {
1317
+ this.sendError(message, buildError("invalid_request", "No active target", false));
1318
+ return null;
1319
+ }
1320
+ const entry = session.refStore.resolve(targetId, ref);
1006
1321
  if (!entry) {
1007
1322
  this.sendError(message, buildError("invalid_request", `Unknown ref: ${ref}`, false));
1008
1323
  return null;
@@ -1025,6 +1340,17 @@ export class OpsRuntime {
1025
1340
  }
1026
1341
  cleanupSession(session, event) {
1027
1342
  this.clearClosingTimer(session.id);
1343
+ const waiters = this.parallelWaiters.get(session.id);
1344
+ if (waiters) {
1345
+ for (const waiter of waiters) {
1346
+ if (waiter.timer !== null) {
1347
+ clearTimeout(waiter.timer);
1348
+ waiter.timer = null;
1349
+ }
1350
+ waiter.reject(new Error("Ops session closed while waiting for parallelism slot."));
1351
+ }
1352
+ this.parallelWaiters.delete(session.id);
1353
+ }
1028
1354
  this.sessions.delete(session.id);
1029
1355
  for (const target of session.targets.values()) {
1030
1356
  void this.cdp.detachTab(target.tabId).catch(() => undefined);
@@ -1185,12 +1511,188 @@ export class OpsRuntime {
1185
1511
  });
1186
1512
  }
1187
1513
  }
1514
+ const numberInRange = (value, fallback, min, max) => {
1515
+ if (typeof value !== "number" || !Number.isFinite(value)) {
1516
+ return fallback;
1517
+ }
1518
+ return Math.min(max, Math.max(min, value));
1519
+ };
1520
+ const parseParallelismPolicy = (value) => {
1521
+ if (!isRecord(value)) {
1522
+ return DEFAULT_OPS_PARALLELISM_POLICY;
1523
+ }
1524
+ const modeCapsInput = isRecord(value.modeCaps) ? value.modeCaps : {};
1525
+ return {
1526
+ floor: numberInRange(value.floor, DEFAULT_OPS_PARALLELISM_POLICY.floor, 1, 32),
1527
+ backpressureTimeoutMs: numberInRange(value.backpressureTimeoutMs, DEFAULT_OPS_PARALLELISM_POLICY.backpressureTimeoutMs, 100, 120000),
1528
+ sampleIntervalMs: numberInRange(value.sampleIntervalMs, DEFAULT_OPS_PARALLELISM_POLICY.sampleIntervalMs, 250, 60000),
1529
+ recoveryStableWindows: numberInRange(value.recoveryStableWindows, DEFAULT_OPS_PARALLELISM_POLICY.recoveryStableWindows, 1, 20),
1530
+ hostFreeMemMediumPct: numberInRange(value.hostFreeMemMediumPct, DEFAULT_OPS_PARALLELISM_POLICY.hostFreeMemMediumPct, 1, 99),
1531
+ hostFreeMemHighPct: numberInRange(value.hostFreeMemHighPct, DEFAULT_OPS_PARALLELISM_POLICY.hostFreeMemHighPct, 1, 99),
1532
+ hostFreeMemCriticalPct: numberInRange(value.hostFreeMemCriticalPct, DEFAULT_OPS_PARALLELISM_POLICY.hostFreeMemCriticalPct, 1, 99),
1533
+ rssBudgetMb: numberInRange(value.rssBudgetMb, DEFAULT_OPS_PARALLELISM_POLICY.rssBudgetMb, 64, 65536),
1534
+ rssSoftPct: numberInRange(value.rssSoftPct, DEFAULT_OPS_PARALLELISM_POLICY.rssSoftPct, 1, 99),
1535
+ rssHighPct: numberInRange(value.rssHighPct, DEFAULT_OPS_PARALLELISM_POLICY.rssHighPct, 1, 99),
1536
+ rssCriticalPct: numberInRange(value.rssCriticalPct, DEFAULT_OPS_PARALLELISM_POLICY.rssCriticalPct, 1, 99),
1537
+ queueAgeHighMs: numberInRange(value.queueAgeHighMs, DEFAULT_OPS_PARALLELISM_POLICY.queueAgeHighMs, 100, 120000),
1538
+ queueAgeCriticalMs: numberInRange(value.queueAgeCriticalMs, DEFAULT_OPS_PARALLELISM_POLICY.queueAgeCriticalMs, 100, 120000),
1539
+ modeCaps: {
1540
+ managedHeaded: numberInRange(modeCapsInput.managedHeaded, DEFAULT_OPS_PARALLELISM_POLICY.modeCaps.managedHeaded, 1, 64),
1541
+ managedHeadless: numberInRange(modeCapsInput.managedHeadless, DEFAULT_OPS_PARALLELISM_POLICY.modeCaps.managedHeadless, 1, 64),
1542
+ cdpConnectHeaded: numberInRange(modeCapsInput.cdpConnectHeaded, DEFAULT_OPS_PARALLELISM_POLICY.modeCaps.cdpConnectHeaded, 1, 64),
1543
+ cdpConnectHeadless: numberInRange(modeCapsInput.cdpConnectHeadless, DEFAULT_OPS_PARALLELISM_POLICY.modeCaps.cdpConnectHeadless, 1, 64),
1544
+ extensionOpsHeaded: numberInRange(modeCapsInput.extensionOpsHeaded, DEFAULT_OPS_PARALLELISM_POLICY.modeCaps.extensionOpsHeaded, 1, 64),
1545
+ extensionLegacyCdpHeaded: numberInRange(modeCapsInput.extensionLegacyCdpHeaded, DEFAULT_OPS_PARALLELISM_POLICY.modeCaps.extensionLegacyCdpHeaded, 1, 64)
1546
+ }
1547
+ };
1548
+ };
1549
+ const isParallelismBackpressureError = (error) => {
1550
+ if (!(error instanceof Error)) {
1551
+ return false;
1552
+ }
1553
+ const typed = error;
1554
+ return typed.code === "parallelism_backpressure" && typeof typed.details === "object" && typed.details !== null;
1555
+ };
1188
1556
  const buildError = (code, message, retryable, details) => ({
1189
1557
  code,
1190
1558
  message,
1191
1559
  retryable,
1192
1560
  details
1193
1561
  });
1562
+ const validateCookieRecord = (cookie) => {
1563
+ const name = cookie.name?.trim();
1564
+ if (!name) {
1565
+ return { valid: false, reason: "Cookie name is required.", cookie };
1566
+ }
1567
+ if (!/^[^\s;=]+$/.test(name)) {
1568
+ return { valid: false, reason: `Invalid cookie name: ${cookie.name}.`, cookie };
1569
+ }
1570
+ if (typeof cookie.value !== "string" || /\r|\n|;/.test(cookie.value)) {
1571
+ return { valid: false, reason: `Invalid cookie value for ${name}.`, cookie };
1572
+ }
1573
+ const hasUrl = typeof cookie.url === "string" && cookie.url.trim().length > 0;
1574
+ const hasDomain = typeof cookie.domain === "string" && cookie.domain.trim().length > 0;
1575
+ if (!hasUrl && !hasDomain) {
1576
+ return { valid: false, reason: `Cookie ${name} requires url or domain.`, cookie };
1577
+ }
1578
+ let normalizedUrl;
1579
+ if (hasUrl) {
1580
+ try {
1581
+ const parsedUrl = new URL(cookie.url);
1582
+ if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
1583
+ return { valid: false, reason: `Cookie ${name} url must be http(s).`, cookie };
1584
+ }
1585
+ normalizedUrl = parsedUrl.toString();
1586
+ }
1587
+ catch {
1588
+ return { valid: false, reason: `Cookie ${name} has invalid url.`, cookie };
1589
+ }
1590
+ }
1591
+ let normalizedDomain;
1592
+ if (hasDomain) {
1593
+ normalizedDomain = String(cookie.domain).trim().toLowerCase();
1594
+ if (!/^\.?[a-z0-9.-]+$/.test(normalizedDomain) || normalizedDomain.includes("..")) {
1595
+ return { valid: false, reason: `Cookie ${name} has invalid domain.`, cookie };
1596
+ }
1597
+ }
1598
+ const normalizedPath = typeof cookie.path === "string" ? cookie.path.trim() : undefined;
1599
+ if (typeof normalizedPath === "string" && !normalizedPath.startsWith("/")) {
1600
+ return { valid: false, reason: `Cookie ${name} path must start with '/'.`, cookie };
1601
+ }
1602
+ if (typeof cookie.expires !== "undefined") {
1603
+ if (!Number.isFinite(cookie.expires) || cookie.expires < -1) {
1604
+ return { valid: false, reason: `Cookie ${name} has invalid expires.`, cookie };
1605
+ }
1606
+ }
1607
+ if (cookie.sameSite === "None" && cookie.secure !== true) {
1608
+ return { valid: false, reason: `Cookie ${name} with SameSite=None must set secure=true.`, cookie };
1609
+ }
1610
+ const normalizedCookie = {
1611
+ name,
1612
+ value: cookie.value,
1613
+ ...(typeof cookie.expires === "number" ? { expires: cookie.expires } : {}),
1614
+ ...(typeof cookie.httpOnly === "boolean" ? { httpOnly: cookie.httpOnly } : {}),
1615
+ ...(typeof cookie.secure === "boolean" ? { secure: cookie.secure } : {}),
1616
+ ...(cookie.sameSite ? { sameSite: cookie.sameSite } : {})
1617
+ };
1618
+ if (normalizedDomain) {
1619
+ normalizedCookie.domain = normalizedDomain;
1620
+ normalizedCookie.path = normalizedPath ?? "/";
1621
+ }
1622
+ else if (normalizedUrl) {
1623
+ normalizedCookie.url = normalizedUrl;
1624
+ }
1625
+ return {
1626
+ valid: true,
1627
+ reason: "",
1628
+ cookie: normalizedCookie
1629
+ };
1630
+ };
1631
+ const parseCookieFilterUrls = (value) => {
1632
+ if (typeof value === "undefined") {
1633
+ return undefined;
1634
+ }
1635
+ if (!Array.isArray(value)) {
1636
+ throw new Error("Cookie url filters must be an array of strings.");
1637
+ }
1638
+ const normalized = [];
1639
+ const seen = new Set();
1640
+ for (const entry of value) {
1641
+ if (typeof entry !== "string") {
1642
+ throw new Error("Cookie url filters must be an array of strings.");
1643
+ }
1644
+ const trimmed = entry.trim();
1645
+ if (!trimmed) {
1646
+ throw new Error("Cookie url filters must be non-empty strings.");
1647
+ }
1648
+ let parsedUrl;
1649
+ try {
1650
+ parsedUrl = new URL(trimmed);
1651
+ }
1652
+ catch {
1653
+ throw new Error(`Cookie url filter is invalid: ${trimmed}`);
1654
+ }
1655
+ if (parsedUrl.protocol !== "http:" && parsedUrl.protocol !== "https:") {
1656
+ throw new Error(`Cookie url filter must be http(s): ${trimmed}`);
1657
+ }
1658
+ const normalizedUrl = parsedUrl.toString();
1659
+ if (seen.has(normalizedUrl)) {
1660
+ continue;
1661
+ }
1662
+ seen.add(normalizedUrl);
1663
+ normalized.push(normalizedUrl);
1664
+ }
1665
+ return normalized.length > 0 ? normalized : undefined;
1666
+ };
1667
+ const toCookieListRecord = (entry) => {
1668
+ if (!isRecord(entry)) {
1669
+ return null;
1670
+ }
1671
+ const name = typeof entry.name === "string" ? entry.name : "";
1672
+ const value = typeof entry.value === "string" ? entry.value : "";
1673
+ const domain = typeof entry.domain === "string" ? entry.domain : "";
1674
+ const path = typeof entry.path === "string" ? entry.path : "";
1675
+ const expires = typeof entry.expires === "number" && Number.isFinite(entry.expires) ? entry.expires : -1;
1676
+ const httpOnly = entry.httpOnly === true;
1677
+ const secure = entry.secure === true;
1678
+ if (!name || !domain || !path) {
1679
+ return null;
1680
+ }
1681
+ const sameSiteRaw = entry.sameSite;
1682
+ const sameSite = sameSiteRaw === "Strict" || sameSiteRaw === "Lax" || sameSiteRaw === "None"
1683
+ ? sameSiteRaw
1684
+ : undefined;
1685
+ return {
1686
+ name,
1687
+ value,
1688
+ domain,
1689
+ path,
1690
+ expires,
1691
+ httpOnly,
1692
+ secure,
1693
+ ...(sameSite ? { sameSite } : {})
1694
+ };
1695
+ };
1194
1696
  const isRecord = (value) => {
1195
1697
  return Boolean(value && typeof value === "object" && !Array.isArray(value));
1196
1698
  };