opendevbrowser 0.0.16 → 0.0.18

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 (616) hide show
  1. package/README.md +201 -79
  2. package/dist/annotate/agent-inbox-store.d.ts +58 -0
  3. package/dist/annotate/agent-inbox-store.d.ts.map +1 -0
  4. package/dist/annotate/agent-inbox.d.ts +25 -0
  5. package/dist/annotate/agent-inbox.d.ts.map +1 -0
  6. package/dist/annotate/direct-annotator.d.ts.map +1 -1
  7. package/dist/annotate/timeout-messages.d.ts +4 -0
  8. package/dist/annotate/timeout-messages.d.ts.map +1 -0
  9. package/dist/automation/coordinator.d.ts +55 -0
  10. package/dist/automation/coordinator.d.ts.map +1 -0
  11. package/dist/browser/annotation-manager.d.ts +7 -1
  12. package/dist/browser/annotation-manager.d.ts.map +1 -1
  13. package/dist/browser/browser-manager.d.ts +153 -48
  14. package/dist/browser/browser-manager.d.ts.map +1 -1
  15. package/dist/browser/canvas-client.d.ts +54 -0
  16. package/dist/browser/canvas-client.d.ts.map +1 -0
  17. package/dist/browser/canvas-code-sync-manager.d.ts +87 -0
  18. package/dist/browser/canvas-code-sync-manager.d.ts.map +1 -0
  19. package/dist/browser/canvas-manager.d.ts +122 -0
  20. package/dist/browser/canvas-manager.d.ts.map +1 -0
  21. package/dist/browser/canvas-runtime-preview-bridge.d.ts +20 -0
  22. package/dist/browser/canvas-runtime-preview-bridge.d.ts.map +1 -0
  23. package/dist/browser/canvas-session-sync-manager.d.ts +21 -0
  24. package/dist/browser/canvas-session-sync-manager.d.ts.map +1 -0
  25. package/dist/browser/global-challenge-coordinator.d.ts +27 -0
  26. package/dist/browser/global-challenge-coordinator.d.ts.map +1 -0
  27. package/dist/browser/manager-types.d.ts +179 -1
  28. package/dist/browser/manager-types.d.ts.map +1 -1
  29. package/dist/browser/ops-browser-manager.d.ts +114 -4
  30. package/dist/browser/ops-browser-manager.d.ts.map +1 -1
  31. package/dist/browser/ops-client.d.ts +17 -1
  32. package/dist/browser/ops-client.d.ts.map +1 -1
  33. package/dist/browser/playwright-runtime.d.ts +4 -0
  34. package/dist/browser/playwright-runtime.d.ts.map +1 -0
  35. package/dist/browser/review-surface.d.ts +9 -0
  36. package/dist/browser/review-surface.d.ts.map +1 -0
  37. package/dist/browser/screencast-recorder.d.ts +57 -0
  38. package/dist/browser/screencast-recorder.d.ts.map +1 -0
  39. package/dist/browser/session-inspector.d.ts +71 -0
  40. package/dist/browser/session-inspector.d.ts.map +1 -0
  41. package/dist/browser/session-store.d.ts +5 -1
  42. package/dist/browser/session-store.d.ts.map +1 -1
  43. package/dist/browser/system-chrome-cookies.d.ts +46 -0
  44. package/dist/browser/system-chrome-cookies.d.ts.map +1 -0
  45. package/dist/browser/target-manager.d.ts +1 -0
  46. package/dist/browser/target-manager.d.ts.map +1 -1
  47. package/dist/cache/chrome-locator.d.ts.map +1 -1
  48. package/dist/cache/chrome-user-data.d.ts +17 -0
  49. package/dist/cache/chrome-user-data.d.ts.map +1 -0
  50. package/dist/canvas/adapter-plugins/loader.d.ts +13 -0
  51. package/dist/canvas/adapter-plugins/loader.d.ts.map +1 -0
  52. package/dist/canvas/adapter-plugins/manifest.d.ts +146 -0
  53. package/dist/canvas/adapter-plugins/manifest.d.ts.map +1 -0
  54. package/dist/canvas/adapter-plugins/types.d.ts +83 -0
  55. package/dist/canvas/adapter-plugins/types.d.ts.map +1 -0
  56. package/dist/canvas/adapter-plugins/validator.d.ts +10 -0
  57. package/dist/canvas/adapter-plugins/validator.d.ts.map +1 -0
  58. package/dist/canvas/code-sync/apply-tsx.d.ts +25 -0
  59. package/dist/canvas/code-sync/apply-tsx.d.ts.map +1 -0
  60. package/dist/canvas/code-sync/graph.d.ts +5 -0
  61. package/dist/canvas/code-sync/graph.d.ts.map +1 -0
  62. package/dist/canvas/code-sync/hash.d.ts +3 -0
  63. package/dist/canvas/code-sync/hash.d.ts.map +1 -0
  64. package/dist/canvas/code-sync/import.d.ts +19 -0
  65. package/dist/canvas/code-sync/import.d.ts.map +1 -0
  66. package/dist/canvas/code-sync/manifest.d.ts +6 -0
  67. package/dist/canvas/code-sync/manifest.d.ts.map +1 -0
  68. package/dist/canvas/code-sync/tsx-adapter.d.ts +8 -0
  69. package/dist/canvas/code-sync/tsx-adapter.d.ts.map +1 -0
  70. package/dist/canvas/code-sync/types.d.ts +244 -0
  71. package/dist/canvas/code-sync/types.d.ts.map +1 -0
  72. package/dist/canvas/code-sync/write.d.ts +9 -0
  73. package/dist/canvas/code-sync/write.d.ts.map +1 -0
  74. package/dist/canvas/document-store.d.ts +91 -0
  75. package/dist/canvas/document-store.d.ts.map +1 -0
  76. package/dist/canvas/export.d.ts +12 -0
  77. package/dist/canvas/export.d.ts.map +1 -0
  78. package/dist/canvas/framework-adapters/custom-elements-v1.d.ts +3 -0
  79. package/dist/canvas/framework-adapters/custom-elements-v1.d.ts.map +1 -0
  80. package/dist/canvas/framework-adapters/html-static-v1.d.ts +3 -0
  81. package/dist/canvas/framework-adapters/html-static-v1.d.ts.map +1 -0
  82. package/dist/canvas/framework-adapters/markup.d.ts +9 -0
  83. package/dist/canvas/framework-adapters/markup.d.ts.map +1 -0
  84. package/dist/canvas/framework-adapters/react-tsx-v2.d.ts +3 -0
  85. package/dist/canvas/framework-adapters/react-tsx-v2.d.ts.map +1 -0
  86. package/dist/canvas/framework-adapters/registry.d.ts +12 -0
  87. package/dist/canvas/framework-adapters/registry.d.ts.map +1 -0
  88. package/dist/canvas/framework-adapters/svelte-sfc-v1.d.ts +3 -0
  89. package/dist/canvas/framework-adapters/svelte-sfc-v1.d.ts.map +1 -0
  90. package/dist/canvas/framework-adapters/types.d.ts +57 -0
  91. package/dist/canvas/framework-adapters/types.d.ts.map +1 -0
  92. package/dist/canvas/framework-adapters/vue-sfc-v1.d.ts +3 -0
  93. package/dist/canvas/framework-adapters/vue-sfc-v1.d.ts.map +1 -0
  94. package/dist/canvas/kits/catalog.d.ts +5 -0
  95. package/dist/canvas/kits/catalog.d.ts.map +1 -0
  96. package/dist/canvas/library-adapters/react/index.d.ts +3 -0
  97. package/dist/canvas/library-adapters/react/index.d.ts.map +1 -0
  98. package/dist/canvas/library-adapters/registry.d.ts +11 -0
  99. package/dist/canvas/library-adapters/registry.d.ts.map +1 -0
  100. package/dist/canvas/library-adapters/types.d.ts +43 -0
  101. package/dist/canvas/library-adapters/types.d.ts.map +1 -0
  102. package/dist/canvas/repo-store.d.ts +12 -0
  103. package/dist/canvas/repo-store.d.ts.map +1 -0
  104. package/dist/canvas/starters/catalog.d.ts +34 -0
  105. package/dist/canvas/starters/catalog.d.ts.map +1 -0
  106. package/dist/canvas/surface-palette.d.ts +15 -0
  107. package/dist/canvas/surface-palette.d.ts.map +1 -0
  108. package/dist/canvas/token-references.d.ts +22 -0
  109. package/dist/canvas/token-references.d.ts.map +1 -0
  110. package/dist/canvas/types.d.ts +594 -0
  111. package/dist/canvas/types.d.ts.map +1 -0
  112. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js +7 -0
  113. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js.map +1 -0
  114. package/dist/challenges/action-loop.d.ts +13 -0
  115. package/dist/challenges/action-loop.d.ts.map +1 -0
  116. package/dist/challenges/capability-matrix.d.ts +3 -0
  117. package/dist/challenges/capability-matrix.d.ts.map +1 -0
  118. package/dist/challenges/evidence-bundle.d.ts +48 -0
  119. package/dist/challenges/evidence-bundle.d.ts.map +1 -0
  120. package/dist/challenges/governed-adapter-gateway.d.ts +4 -0
  121. package/dist/challenges/governed-adapter-gateway.d.ts.map +1 -0
  122. package/dist/challenges/human-yield-gate.d.ts +20 -0
  123. package/dist/challenges/human-yield-gate.d.ts.map +1 -0
  124. package/dist/challenges/index.d.ts +15 -0
  125. package/dist/challenges/index.d.ts.map +1 -0
  126. package/dist/challenges/interpreter.d.ts +3 -0
  127. package/dist/challenges/interpreter.d.ts.map +1 -0
  128. package/dist/challenges/optional-computer-use-bridge.d.ts +9 -0
  129. package/dist/challenges/optional-computer-use-bridge.d.ts.map +1 -0
  130. package/dist/challenges/orchestrator.d.ts +32 -0
  131. package/dist/challenges/orchestrator.d.ts.map +1 -0
  132. package/dist/challenges/outcome-recorder.d.ts +8 -0
  133. package/dist/challenges/outcome-recorder.d.ts.map +1 -0
  134. package/dist/challenges/owned-environment-lane.d.ts +3 -0
  135. package/dist/challenges/owned-environment-lane.d.ts.map +1 -0
  136. package/dist/challenges/policy-gate.d.ts +9 -0
  137. package/dist/challenges/policy-gate.d.ts.map +1 -0
  138. package/dist/challenges/sanctioned-identity-lane.d.ts +3 -0
  139. package/dist/challenges/sanctioned-identity-lane.d.ts.map +1 -0
  140. package/dist/challenges/service-adapter-lane.d.ts +3 -0
  141. package/dist/challenges/service-adapter-lane.d.ts.map +1 -0
  142. package/dist/challenges/strategy-selector.d.ts +10 -0
  143. package/dist/challenges/strategy-selector.d.ts.map +1 -0
  144. package/dist/challenges/types.d.ts +277 -0
  145. package/dist/challenges/types.d.ts.map +1 -0
  146. package/dist/challenges/verification-gate.d.ts +15 -0
  147. package/dist/challenges/verification-gate.d.ts.map +1 -0
  148. package/dist/chunk-5FZQJRBQ.js +15256 -0
  149. package/dist/chunk-5FZQJRBQ.js.map +1 -0
  150. package/dist/{chunk-7W3SPXIB.js → chunk-FUSXMW3G.js} +4 -1
  151. package/dist/chunk-L57D35TB.js +33513 -0
  152. package/dist/chunk-L57D35TB.js.map +1 -0
  153. package/dist/chunk-TBUCZX4A.js +34 -0
  154. package/dist/chunk-TBUCZX4A.js.map +1 -0
  155. package/dist/chunk-Y2KL55OG.js +59 -0
  156. package/dist/chunk-Y2KL55OG.js.map +1 -0
  157. package/dist/chunk-YBQECXZX.js +409 -0
  158. package/dist/chunk-YBQECXZX.js.map +1 -0
  159. package/dist/cli/args.d.ts +4 -4
  160. package/dist/cli/args.d.ts.map +1 -1
  161. package/dist/cli/commands/annotate.d.ts +11 -0
  162. package/dist/cli/commands/annotate.d.ts.map +1 -1
  163. package/dist/cli/commands/artifacts.d.ts.map +1 -1
  164. package/dist/cli/commands/canvas.d.ts +45 -0
  165. package/dist/cli/commands/canvas.d.ts.map +1 -0
  166. package/dist/cli/commands/daemon.d.ts +7 -0
  167. package/dist/cli/commands/daemon.d.ts.map +1 -1
  168. package/dist/cli/commands/desktop/accessibility-snapshot.d.ts +3 -0
  169. package/dist/cli/commands/desktop/accessibility-snapshot.d.ts.map +1 -0
  170. package/dist/cli/commands/desktop/active-window.d.ts +3 -0
  171. package/dist/cli/commands/desktop/active-window.d.ts.map +1 -0
  172. package/dist/cli/commands/desktop/capture-desktop.d.ts +3 -0
  173. package/dist/cli/commands/desktop/capture-desktop.d.ts.map +1 -0
  174. package/dist/cli/commands/desktop/capture-window.d.ts +3 -0
  175. package/dist/cli/commands/desktop/capture-window.d.ts.map +1 -0
  176. package/dist/cli/commands/desktop/shared.d.ts +19 -0
  177. package/dist/cli/commands/desktop/shared.d.ts.map +1 -0
  178. package/dist/cli/commands/desktop/status.d.ts +3 -0
  179. package/dist/cli/commands/desktop/status.d.ts.map +1 -0
  180. package/dist/cli/commands/desktop/windows.d.ts +3 -0
  181. package/dist/cli/commands/desktop/windows.d.ts.map +1 -0
  182. package/dist/cli/commands/devtools/dialog.d.ts +19 -0
  183. package/dist/cli/commands/devtools/dialog.d.ts.map +1 -0
  184. package/dist/cli/commands/devtools/perf.d.ts.map +1 -1
  185. package/dist/cli/commands/devtools/screencast-start.d.ts +20 -0
  186. package/dist/cli/commands/devtools/screencast-start.d.ts.map +1 -0
  187. package/dist/cli/commands/devtools/screencast-stop.d.ts +17 -0
  188. package/dist/cli/commands/devtools/screencast-stop.d.ts.map +1 -0
  189. package/dist/cli/commands/devtools/screenshot.d.ts +3 -0
  190. package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -1
  191. package/dist/cli/commands/dom/attr.d.ts.map +1 -1
  192. package/dist/cli/commands/dom/checked.d.ts.map +1 -1
  193. package/dist/cli/commands/dom/enabled.d.ts.map +1 -1
  194. package/dist/cli/commands/dom/html.d.ts.map +1 -1
  195. package/dist/cli/commands/dom/text.d.ts.map +1 -1
  196. package/dist/cli/commands/dom/value.d.ts.map +1 -1
  197. package/dist/cli/commands/dom/visible.d.ts.map +1 -1
  198. package/dist/cli/commands/export/clone-component.d.ts +9 -0
  199. package/dist/cli/commands/export/clone-component.d.ts.map +1 -1
  200. package/dist/cli/commands/export/clone-page.d.ts +8 -0
  201. package/dist/cli/commands/export/clone-page.d.ts.map +1 -1
  202. package/dist/cli/commands/interact/check.d.ts.map +1 -1
  203. package/dist/cli/commands/interact/click.d.ts.map +1 -1
  204. package/dist/cli/commands/interact/hover.d.ts.map +1 -1
  205. package/dist/cli/commands/interact/pointer-down.d.ts +7 -0
  206. package/dist/cli/commands/interact/pointer-down.d.ts.map +1 -0
  207. package/dist/cli/commands/interact/pointer-drag.d.ts +7 -0
  208. package/dist/cli/commands/interact/pointer-drag.d.ts.map +1 -0
  209. package/dist/cli/commands/interact/pointer-move.d.ts +7 -0
  210. package/dist/cli/commands/interact/pointer-move.d.ts.map +1 -0
  211. package/dist/cli/commands/interact/pointer-shared.d.ts +6 -0
  212. package/dist/cli/commands/interact/pointer-shared.d.ts.map +1 -0
  213. package/dist/cli/commands/interact/pointer-up.d.ts +7 -0
  214. package/dist/cli/commands/interact/pointer-up.d.ts.map +1 -0
  215. package/dist/cli/commands/interact/press.d.ts.map +1 -1
  216. package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -1
  217. package/dist/cli/commands/interact/scroll.d.ts.map +1 -1
  218. package/dist/cli/commands/interact/select.d.ts.map +1 -1
  219. package/dist/cli/commands/interact/type.d.ts.map +1 -1
  220. package/dist/cli/commands/interact/uncheck.d.ts.map +1 -1
  221. package/dist/cli/commands/interact/upload.d.ts +18 -0
  222. package/dist/cli/commands/interact/upload.d.ts.map +1 -0
  223. package/dist/cli/commands/macro-resolve.d.ts +2 -0
  224. package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
  225. package/dist/cli/commands/native.d.ts +22 -8
  226. package/dist/cli/commands/native.d.ts.map +1 -1
  227. package/dist/cli/commands/nav/goto.d.ts.map +1 -1
  228. package/dist/cli/commands/nav/review.d.ts +7 -0
  229. package/dist/cli/commands/nav/review.d.ts.map +1 -0
  230. package/dist/cli/commands/nav/snapshot.d.ts.map +1 -1
  231. package/dist/cli/commands/nav/wait.d.ts.map +1 -1
  232. package/dist/cli/commands/pages/open.d.ts.map +1 -1
  233. package/dist/cli/commands/product-video.d.ts +2 -0
  234. package/dist/cli/commands/product-video.d.ts.map +1 -1
  235. package/dist/cli/commands/research.d.ts +3 -0
  236. package/dist/cli/commands/research.d.ts.map +1 -1
  237. package/dist/cli/commands/run.d.ts +14 -0
  238. package/dist/cli/commands/run.d.ts.map +1 -1
  239. package/dist/cli/commands/serve.d.ts +1 -21
  240. package/dist/cli/commands/serve.d.ts.map +1 -1
  241. package/dist/cli/commands/session/connect.d.ts.map +1 -1
  242. package/dist/cli/commands/session/disconnect.d.ts.map +1 -1
  243. package/dist/cli/commands/session/inspector.d.ts +21 -0
  244. package/dist/cli/commands/session/inspector.d.ts.map +1 -0
  245. package/dist/cli/commands/session/launch.d.ts.map +1 -1
  246. package/dist/cli/commands/shopping.d.ts +5 -0
  247. package/dist/cli/commands/shopping.d.ts.map +1 -1
  248. package/dist/cli/commands/status.d.ts +2 -9
  249. package/dist/cli/commands/status.d.ts.map +1 -1
  250. package/dist/cli/commands/targets/new.d.ts.map +1 -1
  251. package/dist/cli/daemon-autostart.d.ts +11 -0
  252. package/dist/cli/daemon-autostart.d.ts.map +1 -1
  253. package/dist/cli/daemon-client.d.ts +3 -0
  254. package/dist/cli/daemon-client.d.ts.map +1 -1
  255. package/dist/cli/daemon-commands.d.ts.map +1 -1
  256. package/dist/cli/daemon-state.d.ts +16 -0
  257. package/dist/cli/daemon-state.d.ts.map +1 -1
  258. package/dist/cli/daemon-status.d.ts +7 -2
  259. package/dist/cli/daemon-status.d.ts.map +1 -1
  260. package/dist/cli/daemon.d.ts +1 -0
  261. package/dist/cli/daemon.d.ts.map +1 -1
  262. package/dist/cli/help.d.ts +19 -3
  263. package/dist/cli/help.d.ts.map +1 -1
  264. package/dist/cli/index.js +2927 -932
  265. package/dist/cli/index.js.map +1 -1
  266. package/dist/cli/install-autostart-output.d.ts +6 -0
  267. package/dist/cli/install-autostart-output.d.ts.map +1 -0
  268. package/dist/cli/install-autostart-reconciliation.d.ts +23 -0
  269. package/dist/cli/install-autostart-reconciliation.d.ts.map +1 -0
  270. package/dist/cli/installers/skills.d.ts +42 -6
  271. package/dist/cli/installers/skills.d.ts.map +1 -1
  272. package/dist/cli/output.d.ts +3 -0
  273. package/dist/cli/output.d.ts.map +1 -1
  274. package/dist/cli/remote-canvas-manager.d.ts +8 -0
  275. package/dist/cli/remote-canvas-manager.d.ts.map +1 -0
  276. package/dist/cli/remote-desktop-runtime.d.ts +15 -0
  277. package/dist/cli/remote-desktop-runtime.d.ts.map +1 -0
  278. package/dist/cli/remote-manager.d.ts +27 -3
  279. package/dist/cli/remote-manager.d.ts.map +1 -1
  280. package/dist/cli/remote-relay.d.ts +2 -0
  281. package/dist/cli/remote-relay.d.ts.map +1 -1
  282. package/dist/cli/transport-timeouts.d.ts +8 -0
  283. package/dist/cli/transport-timeouts.d.ts.map +1 -0
  284. package/dist/cli/utils/http.d.ts +9 -0
  285. package/dist/cli/utils/http.d.ts.map +1 -1
  286. package/dist/cli/utils/parse.d.ts +3 -0
  287. package/dist/cli/utils/parse.d.ts.map +1 -1
  288. package/dist/cli/utils/skills.d.ts +1 -2
  289. package/dist/cli/utils/skills.d.ts.map +1 -1
  290. package/dist/cli/utils/workflow-message.d.ts +2 -0
  291. package/dist/cli/utils/workflow-message.d.ts.map +1 -0
  292. package/dist/config.d.ts +47 -0
  293. package/dist/config.d.ts.map +1 -1
  294. package/dist/core/bootstrap.d.ts.map +1 -1
  295. package/dist/core/index.d.ts +1 -0
  296. package/dist/core/index.d.ts.map +1 -1
  297. package/dist/core/logging.d.ts +3 -1
  298. package/dist/core/logging.d.ts.map +1 -1
  299. package/dist/core/runtime-assemblies.d.ts +22 -0
  300. package/dist/core/runtime-assemblies.d.ts.map +1 -0
  301. package/dist/core/types.d.ts +17 -0
  302. package/dist/core/types.d.ts.map +1 -1
  303. package/dist/desktop/audit.d.ts +37 -0
  304. package/dist/desktop/audit.d.ts.map +1 -0
  305. package/dist/desktop/errors.d.ts +7 -0
  306. package/dist/desktop/errors.d.ts.map +1 -0
  307. package/dist/desktop/index.d.ts +6 -0
  308. package/dist/desktop/index.d.ts.map +1 -0
  309. package/dist/desktop/runtime.d.ts +26 -0
  310. package/dist/desktop/runtime.d.ts.map +1 -0
  311. package/dist/desktop/types.d.ts +76 -0
  312. package/dist/desktop/types.d.ts.map +1 -0
  313. package/dist/extension-extractor.d.ts +6 -0
  314. package/dist/extension-extractor.d.ts.map +1 -1
  315. package/dist/fs-UMRKOBNN.js +7 -0
  316. package/dist/fs-UMRKOBNN.js.map +1 -0
  317. package/dist/index.d.ts.map +1 -1
  318. package/dist/index.js +1221 -460
  319. package/dist/index.js.map +1 -1
  320. package/dist/integrations/figma/assets.d.ts +13 -0
  321. package/dist/integrations/figma/assets.d.ts.map +1 -0
  322. package/dist/integrations/figma/auth.d.ts +3 -0
  323. package/dist/integrations/figma/auth.d.ts.map +1 -0
  324. package/dist/integrations/figma/client.d.ts +42 -0
  325. package/dist/integrations/figma/client.d.ts.map +1 -0
  326. package/dist/integrations/figma/mappers.d.ts +23 -0
  327. package/dist/integrations/figma/mappers.d.ts.map +1 -0
  328. package/dist/integrations/figma/normalize.d.ts +99 -0
  329. package/dist/integrations/figma/normalize.d.ts.map +1 -0
  330. package/dist/integrations/figma/url.d.ts +17 -0
  331. package/dist/integrations/figma/url.d.ts.map +1 -0
  332. package/dist/integrations/figma/variables.d.ts +21 -0
  333. package/dist/integrations/figma/variables.d.ts.map +1 -0
  334. package/dist/macros/execute-runtime.d.ts +19 -0
  335. package/dist/macros/execute-runtime.d.ts.map +1 -0
  336. package/dist/macros/execute.d.ts +3 -1
  337. package/dist/macros/execute.d.ts.map +1 -1
  338. package/dist/{macros-NUBRM44Y.js → macros-ND2M7LWU.js} +2 -2
  339. package/dist/opendevbrowser.d.ts.map +1 -1
  340. package/dist/opendevbrowser.js +1221 -460
  341. package/dist/opendevbrowser.js.map +1 -1
  342. package/dist/providers/blocker.d.ts.map +1 -1
  343. package/dist/providers/browser-fallback.d.ts +30 -0
  344. package/dist/providers/browser-fallback.d.ts.map +1 -0
  345. package/dist/providers/constraint.d.ts +45 -0
  346. package/dist/providers/constraint.d.ts.map +1 -0
  347. package/dist/providers/index.d.ts +11 -2
  348. package/dist/providers/index.d.ts.map +1 -1
  349. package/dist/providers/policy.d.ts.map +1 -1
  350. package/dist/providers/product-video-compiler.d.ts +92 -0
  351. package/dist/providers/product-video-compiler.d.ts.map +1 -0
  352. package/dist/providers/registry.d.ts +37 -1
  353. package/dist/providers/registry.d.ts.map +1 -1
  354. package/dist/providers/renderer.d.ts.map +1 -1
  355. package/dist/providers/research-compiler.d.ts +64 -0
  356. package/dist/providers/research-compiler.d.ts.map +1 -0
  357. package/dist/providers/research-executor.d.ts +27 -0
  358. package/dist/providers/research-executor.d.ts.map +1 -0
  359. package/dist/providers/runtime-bundle.d.ts +26 -0
  360. package/dist/providers/runtime-bundle.d.ts.map +1 -0
  361. package/dist/providers/runtime-factory.d.ts +6 -1
  362. package/dist/providers/runtime-factory.d.ts.map +1 -1
  363. package/dist/providers/runtime-policy.d.ts +24 -0
  364. package/dist/providers/runtime-policy.d.ts.map +1 -0
  365. package/dist/providers/shared/anti-bot-policy.d.ts +3 -2
  366. package/dist/providers/shared/anti-bot-policy.d.ts.map +1 -1
  367. package/dist/providers/shopping/index.d.ts +11 -1
  368. package/dist/providers/shopping/index.d.ts.map +1 -1
  369. package/dist/providers/shopping-compiler.d.ts +51 -0
  370. package/dist/providers/shopping-compiler.d.ts.map +1 -0
  371. package/dist/providers/shopping-executor.d.ts +18 -0
  372. package/dist/providers/shopping-executor.d.ts.map +1 -0
  373. package/dist/providers/shopping-postprocess.d.ts +46 -0
  374. package/dist/providers/shopping-postprocess.d.ts.map +1 -0
  375. package/dist/providers/shopping-workflow.d.ts +33 -0
  376. package/dist/providers/shopping-workflow.d.ts.map +1 -0
  377. package/dist/providers/social/platform.d.ts +2 -1
  378. package/dist/providers/social/platform.d.ts.map +1 -1
  379. package/dist/providers/social/search-quality.d.ts +16 -0
  380. package/dist/providers/social/search-quality.d.ts.map +1 -0
  381. package/dist/providers/social/youtube-resolver.d.ts +2 -1
  382. package/dist/providers/social/youtube-resolver.d.ts.map +1 -1
  383. package/dist/providers/social/youtube.d.ts.map +1 -1
  384. package/dist/providers/types.d.ts +116 -4
  385. package/dist/providers/types.d.ts.map +1 -1
  386. package/dist/providers/web/crawl-worker.d.ts.map +1 -1
  387. package/dist/providers/web/extract.d.ts +16 -0
  388. package/dist/providers/web/extract.d.ts.map +1 -1
  389. package/dist/providers/web/index.d.ts.map +1 -1
  390. package/dist/providers/workflow-contracts.d.ts +53 -0
  391. package/dist/providers/workflow-contracts.d.ts.map +1 -0
  392. package/dist/providers/workflows.d.ts +30 -6
  393. package/dist/providers/workflows.d.ts.map +1 -1
  394. package/dist/providers-G36AM3Z2.js +121 -0
  395. package/dist/providers-G36AM3Z2.js.map +1 -0
  396. package/dist/public-surface/generated-manifest.d.ts +1168 -0
  397. package/dist/public-surface/generated-manifest.d.ts.map +1 -0
  398. package/dist/public-surface/source.d.ts +437 -0
  399. package/dist/public-surface/source.d.ts.map +1 -0
  400. package/dist/relay/protocol.d.ts +108 -4
  401. package/dist/relay/protocol.d.ts.map +1 -1
  402. package/dist/relay/relay-endpoints.d.ts +21 -0
  403. package/dist/relay/relay-endpoints.d.ts.map +1 -1
  404. package/dist/relay/relay-server.d.ts +32 -1
  405. package/dist/relay/relay-server.d.ts.map +1 -1
  406. package/dist/relay/relay-types.d.ts +3 -0
  407. package/dist/relay/relay-types.d.ts.map +1 -1
  408. package/dist/skills/bundled-skill-directories.d.ts +8 -0
  409. package/dist/skills/bundled-skill-directories.d.ts.map +1 -0
  410. package/dist/skills/skill-loader.d.ts +9 -1
  411. package/dist/skills/skill-loader.d.ts.map +1 -1
  412. package/dist/skills/skill-loader.js +7 -0
  413. package/dist/skills/skill-loader.js.map +1 -0
  414. package/dist/skills/skill-nudge.d.ts.map +1 -1
  415. package/dist/skills/types.d.ts +31 -0
  416. package/dist/skills/types.d.ts.map +1 -1
  417. package/dist/snapshot/ops-snapshot.d.ts +1 -1
  418. package/dist/snapshot/ops-snapshot.d.ts.map +1 -1
  419. package/dist/snapshot/refs.d.ts +6 -1
  420. package/dist/snapshot/refs.d.ts.map +1 -1
  421. package/dist/snapshot/snapshotter.d.ts.map +1 -1
  422. package/dist/tools/annotate.d.ts.map +1 -1
  423. package/dist/tools/canvas.d.ts +4 -0
  424. package/dist/tools/canvas.d.ts.map +1 -0
  425. package/dist/tools/check.d.ts.map +1 -1
  426. package/dist/tools/click.d.ts.map +1 -1
  427. package/dist/tools/clone_component.d.ts.map +1 -1
  428. package/dist/tools/clone_page.d.ts.map +1 -1
  429. package/dist/tools/connect.d.ts.map +1 -1
  430. package/dist/tools/deps.d.ts +6 -0
  431. package/dist/tools/deps.d.ts.map +1 -1
  432. package/dist/tools/desktop-shared.d.ts +6 -0
  433. package/dist/tools/desktop-shared.d.ts.map +1 -0
  434. package/dist/tools/desktop_accessibility_snapshot.d.ts +4 -0
  435. package/dist/tools/desktop_accessibility_snapshot.d.ts.map +1 -0
  436. package/dist/tools/desktop_active_window.d.ts +4 -0
  437. package/dist/tools/desktop_active_window.d.ts.map +1 -0
  438. package/dist/tools/desktop_capture_desktop.d.ts +4 -0
  439. package/dist/tools/desktop_capture_desktop.d.ts.map +1 -0
  440. package/dist/tools/desktop_capture_window.d.ts +4 -0
  441. package/dist/tools/desktop_capture_window.d.ts.map +1 -0
  442. package/dist/tools/desktop_status.d.ts +4 -0
  443. package/dist/tools/desktop_status.d.ts.map +1 -0
  444. package/dist/tools/desktop_windows.d.ts +4 -0
  445. package/dist/tools/desktop_windows.d.ts.map +1 -0
  446. package/dist/tools/dialog.d.ts +4 -0
  447. package/dist/tools/dialog.d.ts.map +1 -0
  448. package/dist/tools/dom_get_html.d.ts.map +1 -1
  449. package/dist/tools/dom_get_text.d.ts.map +1 -1
  450. package/dist/tools/get_attr.d.ts.map +1 -1
  451. package/dist/tools/get_value.d.ts.map +1 -1
  452. package/dist/tools/goto.d.ts.map +1 -1
  453. package/dist/tools/hover.d.ts.map +1 -1
  454. package/dist/tools/index.d.ts +3 -0
  455. package/dist/tools/index.d.ts.map +1 -1
  456. package/dist/tools/is_checked.d.ts.map +1 -1
  457. package/dist/tools/is_enabled.d.ts.map +1 -1
  458. package/dist/tools/is_visible.d.ts.map +1 -1
  459. package/dist/tools/launch.d.ts.map +1 -1
  460. package/dist/tools/macro_resolve.d.ts.map +1 -1
  461. package/dist/tools/perf.d.ts.map +1 -1
  462. package/dist/tools/pointer_down.d.ts +4 -0
  463. package/dist/tools/pointer_down.d.ts.map +1 -0
  464. package/dist/tools/pointer_drag.d.ts +4 -0
  465. package/dist/tools/pointer_drag.d.ts.map +1 -0
  466. package/dist/tools/pointer_move.d.ts +4 -0
  467. package/dist/tools/pointer_move.d.ts.map +1 -0
  468. package/dist/tools/pointer_up.d.ts +4 -0
  469. package/dist/tools/pointer_up.d.ts.map +1 -0
  470. package/dist/tools/press.d.ts.map +1 -1
  471. package/dist/tools/product_video_run.d.ts.map +1 -1
  472. package/dist/tools/prompting_guide.d.ts.map +1 -1
  473. package/dist/tools/research_run.d.ts.map +1 -1
  474. package/dist/tools/response.d.ts +4 -1
  475. package/dist/tools/response.d.ts.map +1 -1
  476. package/dist/tools/review.d.ts +4 -0
  477. package/dist/tools/review.d.ts.map +1 -0
  478. package/dist/tools/screencast_start.d.ts +4 -0
  479. package/dist/tools/screencast_start.d.ts.map +1 -0
  480. package/dist/tools/screencast_stop.d.ts +4 -0
  481. package/dist/tools/screencast_stop.d.ts.map +1 -0
  482. package/dist/tools/screenshot.d.ts.map +1 -1
  483. package/dist/tools/scroll.d.ts.map +1 -1
  484. package/dist/tools/scroll_into_view.d.ts.map +1 -1
  485. package/dist/tools/select.d.ts.map +1 -1
  486. package/dist/tools/session_inspector.d.ts +4 -0
  487. package/dist/tools/session_inspector.d.ts.map +1 -0
  488. package/dist/tools/shopping_run.d.ts.map +1 -1
  489. package/dist/tools/skill_list.d.ts.map +1 -1
  490. package/dist/tools/skill_load.d.ts.map +1 -1
  491. package/dist/tools/snapshot.d.ts.map +1 -1
  492. package/dist/tools/type.d.ts.map +1 -1
  493. package/dist/tools/uncheck.d.ts.map +1 -1
  494. package/dist/tools/upload.d.ts +4 -0
  495. package/dist/tools/upload.d.ts.map +1 -0
  496. package/dist/tools/wait.d.ts.map +1 -1
  497. package/dist/tools/workflow-runtime.d.ts +4 -2
  498. package/dist/tools/workflow-runtime.d.ts.map +1 -1
  499. package/dist/utils/package-assets.d.ts +4 -0
  500. package/dist/utils/package-assets.d.ts.map +1 -0
  501. package/extension/canvas.html +1006 -0
  502. package/extension/dist/annotate-content.css +15 -6
  503. package/extension/dist/annotate-content.js +175 -35
  504. package/extension/dist/annotation-payload.js +199 -0
  505. package/extension/dist/background.js +544 -69
  506. package/extension/dist/canvas/canvas-runtime.js +1490 -0
  507. package/extension/dist/canvas/model.js +341 -0
  508. package/extension/dist/canvas/viewport-fit.js +67 -0
  509. package/extension/dist/canvas-page.js +3609 -0
  510. package/extension/dist/ops/dom-bridge.js +255 -3
  511. package/extension/dist/ops/ops-runtime.js +3324 -301
  512. package/extension/dist/ops/ops-session-store.js +97 -112
  513. package/extension/dist/ops/snapshot-builder.js +2 -2
  514. package/extension/dist/ops/snapshot-shared.js +2 -2
  515. package/extension/dist/ops/target-session-coordinator.js +159 -0
  516. package/extension/dist/popup.js +201 -42
  517. package/extension/dist/services/CDPRouter.js +1567 -63
  518. package/extension/dist/services/ConnectionManager.js +453 -78
  519. package/extension/dist/services/RelayClient.js +79 -30
  520. package/extension/dist/services/TabManager.js +118 -22
  521. package/extension/dist/services/TargetSessionMap.js +127 -3
  522. package/extension/dist/services/attach-errors.js +20 -0
  523. package/extension/dist/services/cdp-router-commands.js +135 -8
  524. package/extension/dist/services/url-restrictions.js +9 -13
  525. package/extension/dist/types.js +2 -0
  526. package/extension/manifest.json +2 -2
  527. package/extension/popup.html +59 -6
  528. package/package.json +19 -9
  529. package/skills/AGENTS.md +8 -4
  530. package/skills/opendevbrowser-best-practices/SKILL.md +183 -6
  531. package/skills/opendevbrowser-best-practices/artifacts/browser-agent-known-issues-matrix.md +1 -0
  532. package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +141 -0
  533. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +129 -19
  534. package/skills/opendevbrowser-best-practices/artifacts/parity-gates.md +9 -2
  535. package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +6 -0
  536. package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +58 -0
  537. package/skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json +70 -0
  538. package/skills/opendevbrowser-best-practices/assets/templates/canvas-feedback-eval.json +73 -0
  539. package/skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json +67 -0
  540. package/skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json +126 -0
  541. package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +57 -0
  542. package/skills/opendevbrowser-best-practices/assets/templates/skill-runtime-pack-matrix.json +674 -0
  543. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +12 -3
  544. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +107 -12
  545. package/skills/opendevbrowser-best-practices/scripts/resolve-odb-cli.sh +100 -0
  546. package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +83 -1
  547. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +365 -84
  548. package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +208 -0
  549. package/skills/opendevbrowser-continuity-ledger/SKILL.md +14 -1
  550. package/skills/opendevbrowser-continuity-ledger/scripts/validate-skill-assets.sh +61 -0
  551. package/skills/opendevbrowser-data-extraction/SKILL.md +6 -0
  552. package/skills/opendevbrowser-data-extraction/scripts/validate-skill-assets.sh +112 -0
  553. package/skills/opendevbrowser-design-agent/SKILL.md +275 -0
  554. package/skills/opendevbrowser-design-agent/artifacts/app-shell-and-state-wiring.md +84 -0
  555. package/skills/opendevbrowser-design-agent/artifacts/async-search-state-ownership.md +58 -0
  556. package/skills/opendevbrowser-design-agent/artifacts/component-pattern-index.md +130 -0
  557. package/skills/opendevbrowser-design-agent/artifacts/design-contract-playbook.md +157 -0
  558. package/skills/opendevbrowser-design-agent/artifacts/design-release-gate.md +40 -0
  559. package/skills/opendevbrowser-design-agent/artifacts/design-workflows.md +153 -0
  560. package/skills/opendevbrowser-design-agent/artifacts/existing-surface-adaptation.md +56 -0
  561. package/skills/opendevbrowser-design-agent/artifacts/external-pattern-synthesis.md +103 -0
  562. package/skills/opendevbrowser-design-agent/artifacts/frontend-evaluation-rubric.md +61 -0
  563. package/skills/opendevbrowser-design-agent/artifacts/implementation-anti-patterns.md +163 -0
  564. package/skills/opendevbrowser-design-agent/artifacts/isolated-preview-validation.md +68 -0
  565. package/skills/opendevbrowser-design-agent/artifacts/loading-and-feedback-surfaces.md +56 -0
  566. package/skills/opendevbrowser-design-agent/artifacts/opendevbrowser-ui-example-map.md +44 -0
  567. package/skills/opendevbrowser-design-agent/artifacts/performance-audit-playbook.md +70 -0
  568. package/skills/opendevbrowser-design-agent/artifacts/research-harvest-workflow.md +81 -0
  569. package/skills/opendevbrowser-design-agent/artifacts/scroll-reveal-surface-planning.md +64 -0
  570. package/skills/opendevbrowser-design-agent/artifacts/state-ownership-matrix.md +36 -0
  571. package/skills/opendevbrowser-design-agent/artifacts/theming-and-token-ownership.md +43 -0
  572. package/skills/opendevbrowser-design-agent/assets/templates/canvas-generation-plan.design.v1.json +58 -0
  573. package/skills/opendevbrowser-design-agent/assets/templates/design-audit-report.v1.md +34 -0
  574. package/skills/opendevbrowser-design-agent/assets/templates/design-brief.v1.md +40 -0
  575. package/skills/opendevbrowser-design-agent/assets/templates/design-contract.v1.json +226 -0
  576. package/skills/opendevbrowser-design-agent/assets/templates/design-release-gate.v1.json +35 -0
  577. package/skills/opendevbrowser-design-agent/assets/templates/design-review-checklist.json +57 -0
  578. package/skills/opendevbrowser-design-agent/assets/templates/real-surface-design-matrix.json +32 -0
  579. package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +31 -0
  580. package/skills/opendevbrowser-design-agent/scripts/design-workflow.sh +171 -0
  581. package/skills/opendevbrowser-design-agent/scripts/extract-canvas-plan.sh +56 -0
  582. package/skills/opendevbrowser-design-agent/scripts/validate-skill-assets.sh +223 -0
  583. package/skills/opendevbrowser-form-testing/SKILL.md +19 -3
  584. package/skills/opendevbrowser-form-testing/artifacts/form-workflows.md +5 -4
  585. package/skills/opendevbrowser-form-testing/assets/templates/challenge-decision-tree.json +2 -0
  586. package/skills/opendevbrowser-form-testing/scripts/validate-skill-assets.sh +109 -0
  587. package/skills/opendevbrowser-login-automation/SKILL.md +21 -3
  588. package/skills/opendevbrowser-login-automation/artifacts/login-workflows.md +5 -4
  589. package/skills/opendevbrowser-login-automation/assets/templates/auth-signals.json +5 -0
  590. package/skills/opendevbrowser-login-automation/assets/templates/login-scenario-matrix.json +3 -2
  591. package/skills/opendevbrowser-login-automation/scripts/run-login-workflow.sh +17 -1
  592. package/skills/opendevbrowser-login-automation/scripts/validate-skill-assets.sh +133 -0
  593. package/skills/opendevbrowser-product-presentation-asset/SKILL.md +23 -11
  594. package/skills/opendevbrowser-product-presentation-asset/artifacts/asset-pack-assembly.md +5 -3
  595. package/skills/opendevbrowser-product-presentation-asset/assets/templates/shot-list.md +2 -0
  596. package/skills/opendevbrowser-product-presentation-asset/assets/templates/video-assembly.md +3 -2
  597. package/skills/opendevbrowser-product-presentation-asset/scripts/capture-screenshots.sh +5 -1
  598. package/skills/opendevbrowser-product-presentation-asset/scripts/collect-product.sh +6 -2
  599. package/skills/opendevbrowser-product-presentation-asset/scripts/download-images.sh +5 -1
  600. package/skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh +20 -7
  601. package/skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh +39 -0
  602. package/skills/opendevbrowser-product-presentation-asset/scripts/write-manifest.sh +5 -1
  603. package/skills/opendevbrowser-research/SKILL.md +14 -6
  604. package/skills/opendevbrowser-research/scripts/render-output.sh +5 -1
  605. package/skills/opendevbrowser-research/scripts/run-research.sh +5 -1
  606. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +45 -0
  607. package/skills/opendevbrowser-research/scripts/write-artifacts.sh +5 -1
  608. package/skills/opendevbrowser-shopping/SKILL.md +20 -1
  609. package/skills/opendevbrowser-shopping/scripts/normalize-offers.sh +6 -2
  610. package/skills/opendevbrowser-shopping/scripts/run-deal-hunt.sh +5 -1
  611. package/skills/opendevbrowser-shopping/scripts/run-shopping.sh +5 -1
  612. package/skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh +54 -0
  613. package/dist/chunk-ST7CO5FA.js +0 -18668
  614. package/dist/chunk-ST7CO5FA.js.map +0 -1
  615. /package/dist/{chunk-7W3SPXIB.js.map → chunk-FUSXMW3G.js.map} +0 -0
  616. /package/dist/{macros-NUBRM44Y.js.map → macros-ND2M7LWU.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/extension-extractor.ts","../src/browser/script-runner.ts","../src/providers/runtime-factory.ts","../src/providers/normalize.ts","../src/providers/policy.ts","../src/providers/registry.ts","../src/providers/adaptive-concurrency.ts","../src/providers/safety/prompt-guard.ts","../src/providers/tier-router.ts","../src/core/logging.ts","../src/providers/shared/anti-bot-policy.ts","../src/providers/shared/post-policy.ts","../src/providers/shared/traversal-url.ts","../src/providers/web/policy.ts","../src/providers/web/crawl-worker.ts","../src/providers/web/extract.ts","../src/providers/web/crawler.ts","../src/providers/community/index.ts","../src/providers/social/platform.ts","../src/providers/social/bluesky.ts","../src/providers/social/facebook.ts","../src/providers/social/instagram.ts","../src/providers/social/linkedin.ts","../src/providers/social/reddit.ts","../src/providers/social/threads.ts","../src/providers/social/tiktok.ts","../src/providers/social/x.ts","../src/providers/shared/request-headers.ts","../src/providers/social/youtube-resolver.ts","../src/providers/social/youtube.ts","../src/providers/social/index.ts","../src/providers/shopping/index.ts","../src/providers/web/index.ts","../src/providers/blocker.ts","../src/providers/timebox.ts","../src/providers/enrichment.ts","../src/providers/renderer.ts","../src/providers/artifacts.ts","../src/providers/workflows.ts","../src/providers/index.ts","../src/browser/browser-manager.ts","../src/cache/paths.ts","../src/cache/chrome-locator.ts","../src/cache/downloader.ts","../src/devtools/console-tracker.ts","../src/devtools/exception-tracker.ts","../src/devtools/network-tracker.ts","../src/export/css-extract.ts","../src/export/dom-capture.ts","../src/export/react-emitter.ts","../src/snapshot/refs.ts","../src/snapshot/ops-snapshot.ts","../src/snapshot/snapshotter.ts","../src/utils/endpoint-validation.ts","../src/relay/relay-endpoints.ts","../src/browser/fingerprint/tier1-coherence.ts","../src/browser/fingerprint/profiles.ts","../src/browser/fingerprint/tier2-runtime.ts","../src/browser/fingerprint/adapters.ts","../src/browser/fingerprint/canary.ts","../src/browser/fingerprint/tier3-adaptive.ts","../src/browser/session-store.ts","../src/browser/target-manager.ts","../src/browser/parallelism-governor.ts","../src/browser/ops-browser-manager.ts","../src/browser/ops-client.ts","../src/relay/protocol.ts","../src/browser/annotation-manager.ts","../src/annotate/direct-annotator.ts","../src/config.ts","../src/utils/crypto.ts","../src/utils/fs.ts","../src/relay/relay-server.ts","../src/skills/skill-loader.ts","../src/core/bootstrap.ts","../src/cli/daemon.ts","../src/cli/daemon-commands.ts","../src/macros/execute.ts","../src/cli/daemon-state.ts","../src/cli/utils/http.ts","../src/cli/errors.ts","../src/cli/daemon-status.ts","../src/cli/daemon-client.ts","../src/annotate/output.ts"],"sourcesContent":["import { existsSync, mkdirSync, cpSync, readFileSync, writeFileSync, rmSync, renameSync } from \"fs\";\nimport { dirname, join } from \"path\";\nimport { homedir } from \"os\";\nimport { fileURLToPath } from \"url\";\n\nconst EXTENSION_DIR_NAME = \"opendevbrowser\";\nconst VERSION_FILE = \".version\";\n\nfunction getConfigDir(): string {\n return join(homedir(), \".config\", \"opencode\", EXTENSION_DIR_NAME, \"extension\");\n}\n\nfunction getPackageVersion(): string {\n try {\n const pkgPath = join(dirname(fileURLToPath(import.meta.url)), \"..\", \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n return pkg.version || \"0.0.0\";\n } catch (error) {\n console.warn(\"[opendevbrowser] Failed to read package.json for extension version:\", error);\n return \"0.0.0\";\n }\n}\n\nfunction getInstalledVersion(destDir: string): string | null {\n try {\n const versionPath = join(destDir, VERSION_FILE);\n if (existsSync(versionPath)) {\n return readFileSync(versionPath, \"utf-8\").trim();\n }\n } catch (error) {\n console.warn(\"[opendevbrowser] Failed to read installed extension version:\", error);\n }\n return null;\n}\n\nfunction getBundledExtensionPath(): string | null {\n const candidates = [\n join(dirname(fileURLToPath(import.meta.url)), \"..\", \"extension\"),\n join(dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"extension\")\n ];\n for (const candidate of candidates) {\n if (existsSync(join(candidate, \"manifest.json\"))) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction isCompleteInstall(dir: string): boolean {\n const required = [\"manifest.json\", VERSION_FILE];\n return required.every(file => existsSync(join(dir, file)));\n}\n\nexport function extractExtension(): string | null {\n const bundledPath = getBundledExtensionPath();\n if (!bundledPath) {\n return null;\n }\n\n const destDir = getConfigDir();\n const currentVersion = getPackageVersion();\n const installedVersion = getInstalledVersion(destDir);\n\n // Early return if version matches and installation is complete\n if (installedVersion === currentVersion && isCompleteInstall(destDir)) {\n return destDir;\n }\n\n // Create staging directory (sibling to destDir for same-device rename)\n const parentDir = dirname(destDir);\n const stagingDir = join(parentDir, `.opendevbrowser-staging-${process.pid}-${Date.now()}`);\n const backupDir = join(parentDir, `.opendevbrowser-backup-${process.pid}-${Date.now()}`);\n\n try {\n // Step 1: Copy to staging\n mkdirSync(stagingDir, { recursive: true });\n const itemsToCopy = [\"manifest.json\", \"popup.html\", \"dist\", \"icons\"];\n for (const item of itemsToCopy) {\n const src = join(bundledPath, item);\n const dest = join(stagingDir, item);\n if (existsSync(src)) {\n cpSync(src, dest, { recursive: true, force: true });\n }\n }\n writeFileSync(join(stagingDir, VERSION_FILE), currentVersion, \"utf-8\");\n\n // Step 2: Validate staging is complete\n if (!isCompleteInstall(stagingDir)) {\n throw new Error(\"Staging directory incomplete after copy\");\n }\n\n // Step 3: Atomic swap\n if (existsSync(destDir)) {\n renameSync(destDir, backupDir);\n }\n renameSync(stagingDir, destDir);\n\n // Step 4: Cleanup backup\n if (existsSync(backupDir)) {\n rmSync(backupDir, { recursive: true, force: true });\n }\n\n return destDir;\n } catch (error) {\n // Rollback: restore backup if it exists\n if (existsSync(backupDir) && !existsSync(destDir)) {\n try {\n renameSync(backupDir, destDir);\n } catch (rollbackError) {\n console.warn(`[opendevbrowser] Warning: Rollback failed for ${backupDir}:`, rollbackError);\n }\n }\n // Cleanup staging\n if (existsSync(stagingDir)) {\n try {\n rmSync(stagingDir, { recursive: true, force: true });\n } catch (stagingCleanupError) {\n console.warn(`[opendevbrowser] Warning: Failed to clean up staging directory ${stagingDir}:`, stagingCleanupError);\n }\n }\n // Cleanup backup\n if (existsSync(backupDir)) {\n try {\n rmSync(backupDir, { recursive: true, force: true });\n } catch (backupCleanupError) {\n console.warn(`[opendevbrowser] Warning: Failed to clean up backup directory ${backupDir}:`, backupCleanupError);\n }\n }\n throw error;\n }\n}\n\nexport function getExtensionPath(): string | null {\n const destDir = getConfigDir();\n if (isCompleteInstall(destDir)) {\n return destDir;\n }\n return getBundledExtensionPath();\n}\n","import type { BrowserManagerLike } from \"./manager-types\";\n\nexport type RunStep = {\n action: string;\n args?: Record<string, unknown>;\n};\n\nexport type RunResult = {\n i: number;\n ok: boolean;\n data?: unknown;\n error?: { message: string };\n};\n\nexport class ScriptRunner {\n private manager: BrowserManagerLike;\n\n constructor(manager: BrowserManagerLike) {\n this.manager = manager;\n }\n\n async run(sessionId: string, steps: RunStep[], stopOnError = true): Promise<{ results: RunResult[]; timingMs: number }> {\n const startTime = Date.now();\n const results: RunResult[] = [];\n\n for (let i = 0; i < steps.length; i += 1) {\n const step = steps[i];\n if (!step) {\n continue;\n }\n try {\n const data = await this.executeStep(sessionId, step);\n results.push({ i, ok: true, data });\n } catch (error) {\n results.push({\n i,\n ok: false,\n error: { message: error instanceof Error ? error.message : \"Unknown error\" }\n });\n if (stopOnError) {\n break;\n }\n }\n }\n\n return { results, timingMs: Date.now() - startTime };\n }\n\n private async executeStep(sessionId: string, step: RunStep): Promise<unknown> {\n const args = step.args ?? {};\n\n switch (step.action) {\n case \"goto\":\n return this.manager.goto(\n sessionId,\n requireString(args.url, \"url\"),\n requireWaitUntil(args.waitUntil),\n requireNumber(args.timeoutMs, 30000)\n );\n case \"wait\":\n if (typeof args.ref === \"string\") {\n const ref = args.ref;\n const state = requireState(args.state);\n const timeoutMs = requireNumber(args.timeoutMs, 30000);\n return withRetry(\"wait\", () => this.manager.waitForRef(\n sessionId,\n ref,\n state,\n timeoutMs\n ));\n }\n return withRetry(\"wait\", () => this.manager.waitForLoad(\n sessionId,\n requireWaitUntil(args.until),\n requireNumber(args.timeoutMs, 30000)\n ));\n case \"snapshot\":\n return this.manager.snapshot(\n sessionId,\n requireSnapshotMode(args.format ?? args.mode),\n requireNumber(args.maxChars, 16000),\n typeof args.cursor === \"string\" ? args.cursor : undefined\n );\n case \"click\":\n return withRetry(\"click\", () => this.manager.click(sessionId, requireString(args.ref, \"ref\")));\n case \"hover\":\n return withRetry(\"hover\", () => this.manager.hover(sessionId, requireString(args.ref, \"ref\")));\n case \"press\":\n return withRetry(\"press\", () => this.manager.press(\n sessionId,\n requireString(args.key, \"key\"),\n typeof args.ref === \"string\" ? args.ref : undefined\n ));\n case \"check\":\n return withRetry(\"check\", () => this.manager.check(sessionId, requireString(args.ref, \"ref\")));\n case \"uncheck\":\n return withRetry(\"uncheck\", () => this.manager.uncheck(sessionId, requireString(args.ref, \"ref\")));\n case \"type\":\n return withRetry(\"type\", () => this.manager.type(\n sessionId,\n requireString(args.ref, \"ref\"),\n requireString(args.text, \"text\"),\n Boolean(args.clear),\n Boolean(args.submit)\n ));\n case \"select\":\n return withRetry(\"select\", () => this.manager.select(\n sessionId,\n requireString(args.ref, \"ref\"),\n requireStringArray(args.values, \"values\")\n ));\n case \"scroll\":\n return withRetry(\"scroll\", () => this.manager.scroll(\n sessionId,\n requireNumber(args.dy, 0),\n typeof args.ref === \"string\" ? args.ref : undefined\n ));\n case \"scroll_into_view\":\n return withRetry(\"scroll_into_view\", () => this.manager.scrollIntoView(\n sessionId,\n requireString(args.ref, \"ref\")\n ));\n case \"dom_get_html\":\n return this.manager.domGetHtml(sessionId, requireString(args.ref, \"ref\"), requireNumber(args.maxChars, 8000));\n case \"dom_get_text\":\n return this.manager.domGetText(sessionId, requireString(args.ref, \"ref\"), requireNumber(args.maxChars, 8000));\n case \"dom_get_attr\":\n return this.manager.domGetAttr(sessionId, requireString(args.ref, \"ref\"), requireString(args.name, \"name\"));\n case \"dom_get_value\":\n return this.manager.domGetValue(sessionId, requireString(args.ref, \"ref\"));\n case \"dom_is_visible\":\n return this.manager.domIsVisible(sessionId, requireString(args.ref, \"ref\"));\n case \"dom_is_enabled\":\n return this.manager.domIsEnabled(sessionId, requireString(args.ref, \"ref\"));\n case \"dom_is_checked\":\n return this.manager.domIsChecked(sessionId, requireString(args.ref, \"ref\"));\n default:\n throw new Error(`Unknown action: ${step.action}`);\n }\n }\n}\n\nfunction requireString(value: unknown, label: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`Missing ${label}`);\n }\n return value;\n}\n\nfunction requireStringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(`Invalid ${label}`);\n }\n return value as string[];\n}\n\nfunction requireNumber(value: unknown, fallback: number): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n return fallback;\n}\n\nfunction requireWaitUntil(value: unknown): \"domcontentloaded\" | \"load\" | \"networkidle\" {\n if (value === \"domcontentloaded\" || value === \"load\" || value === \"networkidle\") {\n return value;\n }\n return \"load\";\n}\n\nfunction requireSnapshotMode(value: unknown): \"outline\" | \"actionables\" {\n if (value === \"actionables\") return \"actionables\";\n return \"outline\";\n}\n\nfunction requireState(value: unknown): \"attached\" | \"visible\" | \"hidden\" {\n if (value === \"visible\" || value === \"hidden\") return value;\n return \"attached\";\n}\n\nconst RETRY_ACTIONS = new Set([\n \"click\",\n \"hover\",\n \"press\",\n \"check\",\n \"uncheck\",\n \"type\",\n \"select\",\n \"scroll\",\n \"scroll_into_view\",\n \"wait\"\n]);\nconst RETRY_MAX_ATTEMPTS = 2;\nconst RETRY_BASE_DELAY_MS = 150;\nconst RETRY_MAX_DELAY_MS = 1000;\n\nasync function withRetry<T>(action: string, fn: () => Promise<T>): Promise<T> {\n if (!RETRY_ACTIONS.has(action)) {\n return fn();\n }\n\n let attempt = 0;\n let delay = RETRY_BASE_DELAY_MS;\n while (true) {\n try {\n return await fn();\n } catch (error) {\n attempt += 1;\n if (attempt >= RETRY_MAX_ATTEMPTS || !shouldRetry(error)) {\n throw error;\n }\n await sleep(delay);\n delay = Math.min(delay * 2, RETRY_MAX_DELAY_MS);\n }\n }\n}\n\nfunction shouldRetry(error: unknown): boolean {\n const message = error instanceof Error ? error.message : \"\";\n if (!message) return true;\n return !/missing|invalid|unknown ref|no active target/i.test(message);\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import * as path from \"path\";\nimport * as os from \"os\";\nimport { readFile } from \"fs/promises\";\nimport type { BrowserManagerLike } from \"../browser/manager-types\";\nimport type { OpenDevBrowserConfig } from \"../config\";\nimport { createDefaultRuntime, type RuntimeDefaults, type RuntimeInit } from \"./index\";\nimport type {\n BrowserFallbackMode,\n BrowserFallbackPort,\n BrowserFallbackResponse,\n ProviderCookieImportRecord,\n ProviderCookiePolicy,\n ProviderCookieSourceConfig\n} from \"./types\";\n\ntype RuntimeConfig = Pick<OpenDevBrowserConfig, \"blockerDetectionThreshold\" | \"security\" | \"providers\">;\n\ntype BrowserFallbackCookieConfig = {\n policy: ProviderCookiePolicy;\n source: ProviderCookieSourceConfig;\n};\n\ntype BrowserFallbackCookieDiagnostics = {\n policy: ProviderCookiePolicy;\n source: ProviderCookieSourceConfig[\"type\"];\n sourceRef: string;\n attempted: boolean;\n available: boolean;\n loaded: number;\n injected: number;\n rejected: number;\n verifiedCount: number;\n strict: boolean;\n reasonCode?: BrowserFallbackResponse[\"reasonCode\"];\n message?: string;\n};\n\nconst DEFAULT_COOKIE_POLICY: ProviderCookiePolicy = \"auto\";\nconst DEFAULT_COOKIE_SOURCE: ProviderCookieSourceConfig = {\n type: \"file\",\n value: \"~/.config/opencode/opendevbrowser.provider-cookies.json\"\n};\n\nconst toFallbackMode = (mode: unknown): BrowserFallbackMode => {\n return mode === \"extension\" ? \"extension\" : \"managed_headed\";\n};\n\nconst expandHomePath = (filePath: string): string => {\n if (filePath === \"~\") return os.homedir();\n if (filePath.startsWith(\"~/\")) {\n return path.join(os.homedir(), filePath.slice(2));\n }\n return filePath;\n};\n\nconst cookieSourceRef = (source: ProviderCookieSourceConfig): string => {\n if (source.type === \"file\") {\n return expandHomePath(source.value);\n }\n if (source.type === \"env\") {\n return source.value;\n }\n return \"inline\";\n};\n\nconst parseCookieArray = (payload: string): ProviderCookieImportRecord[] => {\n const parsed = JSON.parse(payload);\n if (!Array.isArray(parsed)) {\n throw new Error(\"Cookie payload must be a JSON array.\");\n }\n return parsed as ProviderCookieImportRecord[];\n};\n\nconst readCookiesFromSource = async (\n source: ProviderCookieSourceConfig\n): Promise<{ cookies: ProviderCookieImportRecord[]; available: boolean; message?: string }> => {\n if (source.type === \"inline\") {\n return {\n cookies: source.value,\n available: source.value.length > 0,\n ...(source.value.length === 0 ? { message: \"Inline cookie source is empty.\" } : {})\n };\n }\n\n if (source.type === \"env\") {\n const envValue = process.env[source.value];\n if (!envValue || envValue.trim().length === 0) {\n return {\n cookies: [],\n available: false,\n message: `Cookie env ${source.value} is not set.`\n };\n }\n try {\n const cookies = parseCookieArray(envValue);\n return { cookies, available: cookies.length > 0 };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n cookies: [],\n available: false,\n message: `Cookie env ${source.value} is invalid JSON: ${message}`\n };\n }\n }\n\n const resolvedPath = expandHomePath(source.value);\n try {\n const payload = await readFile(resolvedPath, \"utf8\");\n const cookies = parseCookieArray(payload);\n return { cookies, available: cookies.length > 0 };\n } catch (error) {\n if ((error as { code?: string }).code === \"ENOENT\") {\n return {\n cookies: [],\n available: false,\n message: `Cookie file not found: ${resolvedPath}`\n };\n }\n const message = error instanceof Error ? error.message : String(error);\n return {\n cookies: [],\n available: false,\n message: `Cookie file read failed: ${message}`\n };\n }\n};\n\nconst resolveEffectiveCookiePolicy = (\n defaults: BrowserFallbackCookieConfig,\n request: { useCookies?: boolean; cookiePolicyOverride?: ProviderCookiePolicy }\n): ProviderCookiePolicy => {\n if (request.cookiePolicyOverride) {\n return request.cookiePolicyOverride;\n }\n if (request.useCookies === false) {\n return \"off\";\n }\n if (request.useCookies === true && defaults.policy === \"off\") {\n return \"auto\";\n }\n return defaults.policy;\n};\n\nconst baseCookieDiagnostics = (\n policy: ProviderCookiePolicy,\n source: ProviderCookieSourceConfig\n): BrowserFallbackCookieDiagnostics => ({\n policy,\n source: source.type,\n sourceRef: cookieSourceRef(source),\n attempted: false,\n available: false,\n loaded: 0,\n injected: 0,\n rejected: 0,\n verifiedCount: 0,\n strict: false\n});\n\nconst fallbackFailure = (\n reasonCode: BrowserFallbackResponse[\"reasonCode\"],\n message: string,\n cookieDiagnostics?: BrowserFallbackCookieDiagnostics\n): BrowserFallbackResponse => ({\n ok: false,\n reasonCode,\n details: {\n message,\n ...(cookieDiagnostics ? { cookieDiagnostics } : {})\n }\n});\n\nexport const createBrowserFallbackPort = (\n manager: BrowserManagerLike | undefined,\n cookieDefaults: Partial<BrowserFallbackCookieConfig> = {}\n): BrowserFallbackPort | undefined => {\n if (!manager) return undefined;\n const defaults: BrowserFallbackCookieConfig = {\n policy: cookieDefaults.policy ?? DEFAULT_COOKIE_POLICY,\n source: cookieDefaults.source ?? DEFAULT_COOKIE_SOURCE\n };\n return {\n resolve: async (request) => {\n const requestUrl = request.url;\n if (!requestUrl) {\n return fallbackFailure(\"env_limited\", \"Browser fallback requires a URL.\");\n }\n\n let sessionId: string | null = null;\n const policy = resolveEffectiveCookiePolicy(defaults, request);\n const cookieDiagnostics = baseCookieDiagnostics(policy, defaults.source);\n try {\n const launched = await manager.launch({\n // Force managed fallback so retrieval recovery is not coupled to extension relay state.\n noExtension: true,\n headless: false,\n startUrl: \"about:blank\",\n // Browser fallback sessions are transient and should not contend for persisted profile locks.\n persistProfile: false\n });\n sessionId = launched.sessionId;\n\n if (policy !== \"off\") {\n const loaded = await readCookiesFromSource(defaults.source);\n cookieDiagnostics.available = loaded.available;\n cookieDiagnostics.loaded = loaded.cookies.length;\n if (loaded.message) {\n cookieDiagnostics.message = loaded.message;\n }\n\n if (loaded.cookies.length > 0) {\n cookieDiagnostics.attempted = true;\n const imported = await manager.cookieImport(sessionId, loaded.cookies, false);\n cookieDiagnostics.injected = imported.imported;\n cookieDiagnostics.rejected = imported.rejected.length;\n\n const verified = await manager.cookieList(sessionId, [requestUrl]);\n cookieDiagnostics.verifiedCount = verified.count;\n }\n\n if (policy === \"required\") {\n const reasonMessage = cookieDiagnostics.message\n ?? (\n cookieDiagnostics.loaded === 0\n ? \"Required provider cookies are missing.\"\n : cookieDiagnostics.injected === 0\n ? \"Provider cookie injection imported 0 entries.\"\n : cookieDiagnostics.verifiedCount === 0\n ? \"Provider cookies were not observable after injection.\"\n : undefined\n );\n if (reasonMessage) {\n cookieDiagnostics.reasonCode = \"auth_required\";\n cookieDiagnostics.message = reasonMessage;\n return fallbackFailure(\"auth_required\", reasonMessage, cookieDiagnostics);\n }\n }\n }\n\n await manager.goto(sessionId, requestUrl, \"load\", 45000);\n const html = await manager.withPage(sessionId, null, async (page: unknown) => {\n const candidate = page as { content?: () => Promise<string> };\n if (typeof candidate.content !== \"function\") return \"\";\n return await candidate.content();\n });\n const status = await manager.status(sessionId);\n\n return {\n ok: true,\n reasonCode: request.reasonCode,\n mode: toFallbackMode(status.mode),\n output: {\n html,\n url: status.url ?? requestUrl\n },\n details: {\n provider: request.provider,\n operation: request.operation,\n cookieDiagnostics\n }\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return fallbackFailure(\"env_limited\", message, cookieDiagnostics);\n } finally {\n if (sessionId) {\n await manager.disconnect(sessionId, true).catch(() => {\n // Best effort cleanup for fallback sessions.\n });\n }\n }\n }\n };\n};\n\nexport const buildRuntimeInitFromConfig = (\n config: RuntimeConfig | undefined,\n browserFallbackPort?: BrowserFallbackPort\n): Omit<RuntimeInit, \"providers\"> => {\n const providers = config?.providers;\n return {\n ...(typeof config?.blockerDetectionThreshold === \"number\"\n ? { blockerDetectionThreshold: config.blockerDetectionThreshold }\n : {}),\n promptInjectionGuard: {\n enabled: config?.security.promptInjectionGuard?.enabled ?? true\n },\n ...(providers?.tiers\n ? {\n tiers: {\n defaultTier: providers.tiers.default,\n enableHybrid: providers.tiers.enableHybrid,\n enableRestrictedSafe: providers.tiers.enableRestrictedSafe,\n hybridRiskThreshold: providers.tiers.hybridRiskThreshold,\n restrictedSafeRecoveryIntervalMs: providers.tiers.restrictedSafeRecoveryIntervalMs\n }\n }\n : {}),\n ...(providers?.adaptiveConcurrency\n ? {\n adaptiveConcurrency: {\n enabled: providers.adaptiveConcurrency.enabled,\n maxGlobal: providers.adaptiveConcurrency.maxGlobal,\n maxPerDomain: providers.adaptiveConcurrency.maxPerDomain\n }\n }\n : {}),\n ...(providers?.antiBotPolicy\n ? {\n antiBotPolicy: {\n enabled: providers.antiBotPolicy.enabled,\n cooldownMs: providers.antiBotPolicy.cooldownMs,\n maxChallengeRetries: providers.antiBotPolicy.maxChallengeRetries,\n proxyHint: providers.antiBotPolicy.proxyHint,\n sessionHint: providers.antiBotPolicy.sessionHint,\n allowBrowserEscalation: providers.antiBotPolicy.allowBrowserEscalation\n }\n }\n : {}),\n ...(providers?.transcript\n ? {\n transcript: {\n modeDefault: providers.transcript.modeDefault,\n strategyOrder: providers.transcript.strategyOrder,\n enableYtdlp: providers.transcript.enableYtdlp,\n enableAsr: providers.transcript.enableAsr,\n enableYtdlpAudioAsr: providers.transcript.enableYtdlpAudioAsr,\n enableApify: providers.transcript.enableApify,\n apifyActorId: providers.transcript.apifyActorId,\n enableBrowserFallback: providers.transcript.enableBrowserFallback,\n ytdlpTimeoutMs: providers.transcript.ytdlpTimeoutMs\n }\n }\n : {}),\n ...(providers?.cookiePolicy || providers?.cookieSource\n ? {\n cookies: {\n ...(providers.cookiePolicy ? { policy: providers.cookiePolicy } : {}),\n ...(providers.cookieSource ? { source: providers.cookieSource } : {})\n }\n }\n : {}),\n ...(browserFallbackPort ? { browserFallbackPort } : {})\n };\n};\n\nexport const createConfiguredProviderRuntime = (args: {\n config?: RuntimeConfig;\n defaults?: RuntimeDefaults;\n manager?: BrowserManagerLike;\n browserFallbackPort?: BrowserFallbackPort;\n init?: Omit<RuntimeInit, \"providers\">;\n}) => {\n const fallbackPort = args.browserFallbackPort ?? createBrowserFallbackPort(args.manager, {\n policy: args.config?.providers?.cookiePolicy,\n source: args.config?.providers?.cookieSource\n });\n const runtimeInit = {\n ...buildRuntimeInitFromConfig(args.config, fallbackPort),\n ...(args.init ?? {})\n };\n return createDefaultRuntime(args.defaults ?? {}, runtimeInit);\n};\n","import { createHash, randomUUID } from \"crypto\";\nimport { createProviderError, toProviderError } from \"./errors\";\nimport type {\n JsonValue,\n NormalizedRecord,\n ProviderExecutionMetadata,\n ProviderError,\n ProviderOperationFailure,\n ProviderOperationSuccess,\n ProviderSource,\n ProviderTierMetadata,\n TraceContext\n} from \"./types\";\n\nexport interface NormalizeRecordInput {\n id?: string;\n url?: string;\n title?: string;\n content?: string;\n timestamp?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n}\n\nexport const createTraceContext = (\n seed: Partial<TraceContext> = {},\n provider?: string\n): TraceContext => {\n return {\n requestId: seed.requestId ?? randomUUID(),\n ...(seed.sessionId ? { sessionId: seed.sessionId } : {}),\n ...(seed.targetId ? { targetId: seed.targetId } : {}),\n ...(provider ?? seed.provider ? { provider: provider ?? seed.provider } : {}),\n ts: seed.ts ?? new Date().toISOString()\n };\n};\n\nexport const clampConfidence = (value: number | undefined): number => {\n if (typeof value !== \"number\" || Number.isNaN(value)) return 0.5;\n if (value < 0) return 0;\n if (value > 1) return 1;\n return value;\n};\n\nexport const createStableRecordId = (\n provider: string,\n source: ProviderSource,\n value: NormalizeRecordInput\n): string => {\n const payload = stableStringify({\n provider,\n source,\n url: value.url ?? \"\",\n title: value.title ?? \"\",\n content: value.content ?? \"\",\n attributes: value.attributes ?? {}\n });\n\n return createHash(\"sha1\").update(payload).digest(\"hex\").slice(0, 16);\n};\n\nexport const normalizeRecord = (\n provider: string,\n source: ProviderSource,\n value: NormalizeRecordInput\n): NormalizedRecord => {\n const id = value.id ?? createStableRecordId(provider, source, value);\n const timestamp = value.timestamp ?? new Date().toISOString();\n\n return {\n id,\n source,\n provider,\n ...(value.url ? { url: value.url } : {}),\n ...(value.title ? { title: value.title } : {}),\n ...(value.content ? { content: value.content } : {}),\n timestamp,\n confidence: clampConfidence(value.confidence),\n attributes: value.attributes ?? {}\n };\n};\n\nexport const normalizeRecords = (\n provider: string,\n source: ProviderSource,\n records: NormalizeRecordInput[]\n): NormalizedRecord[] => {\n return records.map((record) => normalizeRecord(provider, source, record));\n};\n\nexport const normalizeSuccess = (\n provider: string,\n source: ProviderSource,\n records: NormalizeRecordInput[],\n options: {\n trace?: Partial<TraceContext>;\n startedAtMs?: number;\n attempts?: number;\n retries?: number;\n meta?: ProviderExecutionMetadata;\n provenance?: Record<string, JsonValue>;\n } = {}\n): ProviderOperationSuccess => {\n const trace = createTraceContext(options.trace, provider);\n const startedAtMs = options.startedAtMs ?? Date.now();\n\n return {\n ok: true,\n provider,\n source,\n trace,\n records: normalizeRecords(provider, source, records),\n latencyMs: Math.max(0, Date.now() - startedAtMs),\n attempts: options.attempts ?? 1,\n retries: options.retries ?? Math.max(0, (options.attempts ?? 1) - 1),\n ...(options.meta ? { meta: options.meta } : {}),\n ...(options.provenance ? { provenance: options.provenance } : {})\n };\n};\n\nexport const normalizeFailure = (\n provider: string,\n source: ProviderSource,\n error: unknown,\n options: {\n trace?: Partial<TraceContext>;\n startedAtMs?: number;\n attempts?: number;\n retries?: number;\n meta?: ProviderExecutionMetadata;\n defaultMessage?: string;\n defaultErrorCode?: ProviderError[\"code\"];\n } = {}\n): ProviderOperationFailure => {\n const trace = createTraceContext(options.trace, provider);\n const startedAtMs = options.startedAtMs ?? Date.now();\n const mapped = isProviderError(error)\n ? error\n : toProviderError(error, {\n provider,\n source,\n defaultCode: options.defaultErrorCode\n });\n const resolvedError = mapped.message\n ? mapped\n : createProviderError(mapped.code, options.defaultMessage ?? \"Provider request failed\", {\n retryable: mapped.retryable,\n provider,\n source\n });\n\n return {\n ok: false,\n provider,\n source,\n trace,\n error: resolvedError,\n latencyMs: Math.max(0, Date.now() - startedAtMs),\n attempts: options.attempts ?? 1,\n retries: options.retries ?? Math.max(0, (options.attempts ?? 1) - 1),\n ...(options.meta ? { meta: options.meta } : {})\n };\n};\n\nexport const createExecutionMetadata = (params: {\n tier: ProviderTierMetadata;\n provider: string;\n retrievalPath: string;\n retrievedAt?: string;\n}): ProviderExecutionMetadata => {\n return {\n tier: params.tier,\n provenance: {\n provider: params.provider,\n retrievalPath: params.retrievalPath,\n retrievedAt: params.retrievedAt ?? new Date().toISOString()\n }\n };\n};\n\nconst isProviderError = (value: unknown): value is ProviderError => {\n if (!value || typeof value !== \"object\") return false;\n const candidate = value as Record<string, unknown>;\n return typeof candidate.code === \"string\"\n && typeof candidate.message === \"string\"\n && typeof candidate.retryable === \"boolean\";\n};\n\nconst stableStringify = (value: JsonValue | Record<string, unknown>): string => {\n if (value === null) return \"null\";\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"number\" || typeof value === \"boolean\") return String(value);\n if (Array.isArray(value)) return `[${value.map((item) => stableStringify(item)).join(\",\")}]`;\n\n const entries = Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entryValue]) => `${JSON.stringify(key)}:${stableStringify(entryValue as JsonValue | Record<string, unknown>)}`);\n return `{${entries.join(\",\")}}`;\n};\n","import type { ProviderAdapter, ProviderOperation, ProviderSelection } from \"./types\";\nimport type { ProviderRegistry } from \"./registry\";\n\nconst SOURCE_ORDER = [\"web\", \"community\", \"social\", \"shopping\"] as const;\n\ntype HealthStatus = ReturnType<ProviderRegistry[\"getHealth\"]>[\"status\"];\n\nconst hasOperation = (provider: ProviderAdapter, operation: ProviderOperation): boolean => {\n switch (operation) {\n case \"search\":\n return typeof provider.search === \"function\";\n case \"fetch\":\n return typeof provider.fetch === \"function\";\n case \"crawl\":\n return typeof provider.crawl === \"function\";\n case \"post\":\n return typeof provider.post === \"function\";\n }\n};\n\nconst rankHealth = (status: HealthStatus): number => {\n if (status === \"healthy\") return 0;\n if (status === \"degraded\") return 1;\n return 2;\n};\n\nexport const selectProviders = (\n registry: ProviderRegistry,\n operation: ProviderOperation,\n selection: ProviderSelection = \"auto\"\n): ProviderAdapter[] => {\n const providers = registry.list().filter((provider) => hasOperation(provider, operation));\n\n const bySelection = providers.filter((provider) => {\n if (selection === \"all\") return true;\n if (selection === \"auto\") return provider.source !== \"shopping\";\n return provider.source === selection;\n });\n\n return bySelection.sort((left, right) => {\n const healthDelta = rankHealth(registry.getHealth(left.id).status) - rankHealth(registry.getHealth(right.id).status);\n if (healthDelta !== 0) return healthDelta;\n\n const leftSourceRank = SOURCE_ORDER.indexOf(left.source);\n const rightSourceRank = SOURCE_ORDER.indexOf(right.source);\n const sourceDelta = leftSourceRank - rightSourceRank;\n if (sourceDelta !== 0) return sourceDelta;\n\n return left.id.localeCompare(right.id);\n });\n};\n\nexport const shouldFallbackToNextProvider = (selection: ProviderSelection): boolean => {\n return selection === \"all\" || selection === \"auto\";\n};\n","import { createProviderError } from \"./errors\";\nimport type { ProviderAdapter, ProviderCapabilities, ProviderError, ProviderHealth, ProviderSource } from \"./types\";\n\ninterface ProviderState {\n health: ProviderHealth;\n failures: number;\n circuitOpenUntil: number;\n lastError?: ProviderError;\n}\n\nconst defaultHealth = (): ProviderHealth => ({\n status: \"healthy\",\n updatedAt: new Date().toISOString()\n});\n\nexport class ProviderRegistry {\n private readonly providers = new Map<string, ProviderAdapter>();\n private readonly state = new Map<string, ProviderState>();\n\n register(provider: ProviderAdapter): void {\n if (this.providers.has(provider.id)) {\n throw new Error(`Provider already registered: ${provider.id}`);\n }\n\n this.providers.set(provider.id, provider);\n this.state.set(provider.id, {\n health: defaultHealth(),\n failures: 0,\n circuitOpenUntil: 0\n });\n }\n\n get(providerId: string): ProviderAdapter {\n const provider = this.providers.get(providerId);\n if (!provider) {\n throw new Error(`Unknown provider: ${providerId}`);\n }\n return provider;\n }\n\n list(): ProviderAdapter[] {\n return [...this.providers.values()];\n }\n\n listBySource(source: ProviderSource): ProviderAdapter[] {\n return this.list().filter((provider) => provider.source === source);\n }\n\n capabilities(): ProviderCapabilities[] {\n return this.list().map((provider) => provider.capabilities());\n }\n\n setHealth(providerId: string, health: ProviderHealth): void {\n const existing = this.getState(providerId);\n existing.health = {\n ...health,\n updatedAt: health.updatedAt || new Date().toISOString()\n };\n }\n\n getHealth(providerId: string): ProviderHealth {\n return this.getState(providerId).health;\n }\n\n markSuccess(providerId: string, latencyMs: number): void {\n const existing = this.getState(providerId);\n existing.failures = 0;\n existing.circuitOpenUntil = 0;\n existing.lastError = undefined;\n existing.health = {\n status: \"healthy\",\n updatedAt: new Date().toISOString(),\n latencyMs\n };\n }\n\n markFailure(\n providerId: string,\n error: ProviderError,\n circuit: { failureThreshold: number; cooldownMs: number }\n ): void {\n const existing = this.getState(providerId);\n existing.failures += 1;\n existing.lastError = error;\n\n const now = Date.now();\n const threshold = Math.max(1, circuit.failureThreshold);\n if (existing.failures >= threshold) {\n existing.circuitOpenUntil = now + Math.max(0, circuit.cooldownMs);\n existing.health = {\n status: \"unhealthy\",\n updatedAt: new Date(now).toISOString(),\n reason: error.message\n };\n return;\n }\n\n existing.health = {\n status: \"degraded\",\n updatedAt: new Date(now).toISOString(),\n reason: error.message\n };\n }\n\n isCircuitOpen(providerId: string, nowMs = Date.now()): boolean {\n const existing = this.getState(providerId);\n if (existing.circuitOpenUntil <= 0) return false;\n if (existing.circuitOpenUntil > nowMs) return true;\n\n existing.circuitOpenUntil = 0;\n if (existing.health.status === \"unhealthy\") {\n existing.health = {\n status: \"degraded\",\n updatedAt: new Date(nowMs).toISOString(),\n reason: \"Circuit cooldown elapsed\"\n };\n }\n return false;\n }\n\n getCircuitError(providerId: string): ProviderError {\n const existing = this.getState(providerId);\n return createProviderError(\"circuit_open\", \"Provider circuit is open\", {\n provider: providerId,\n retryable: true,\n details: {\n openUntil: existing.circuitOpenUntil,\n failures: existing.failures,\n lastErrorCode: existing.lastError?.code ?? null\n }\n });\n }\n\n reset(providerId: string): void {\n const existing = this.getState(providerId);\n existing.failures = 0;\n existing.circuitOpenUntil = 0;\n existing.lastError = undefined;\n existing.health = defaultHealth();\n }\n\n private getState(providerId: string): ProviderState {\n const state = this.state.get(providerId);\n if (!state) {\n throw new Error(`Unknown provider state: ${providerId}`);\n }\n return state;\n }\n}\n","import type { AdaptiveConcurrencyDiagnostics } from \"./types\";\n\nexport interface AdaptiveConcurrencyConfig {\n enabled: boolean;\n baselineGlobal: number;\n baselineScoped: number;\n minGlobal?: number;\n maxGlobal: number;\n minScoped?: number;\n maxScoped: number;\n windowSize?: number;\n cooldownMs?: number;\n increaseStep?: number;\n decreaseFactor?: number;\n healthyLatencyMs?: number;\n}\n\nexport interface AdaptiveSignal {\n latencyMs: number;\n timeout?: boolean;\n challenge?: boolean;\n http4xx?: boolean;\n http5xx?: boolean;\n queuePressure?: number;\n}\n\ntype TrackState = {\n limit: number;\n lastAdjustedAt: number;\n samples: AdaptiveSignal[];\n};\n\nconst clamp = (value: number, min: number, max: number): number => {\n return Math.max(min, Math.min(max, value));\n};\n\nconst percentile = (values: number[], ratio: number): number => {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((left, right) => left - right);\n const index = Math.min(sorted.length - 1, Math.max(0, Math.ceil(sorted.length * ratio) - 1));\n return sorted[index] ?? 0;\n};\n\nconst rate = (values: AdaptiveSignal[], key: keyof AdaptiveSignal): number => {\n if (values.length === 0) return 0;\n const total = values.reduce((count, sample) => count + (sample[key] ? 1 : 0), 0);\n return total / values.length;\n};\n\nconst queuePressure = (values: AdaptiveSignal[]): number => {\n if (values.length === 0) return 0;\n const total = values.reduce((sum, sample) => sum + (sample.queuePressure ?? 0), 0);\n return total / values.length;\n};\n\nexport class AdaptiveConcurrencyController {\n private readonly global: TrackState;\n private readonly scoped = new Map<string, TrackState>();\n private readonly minGlobal: number;\n private readonly minScoped: number;\n private readonly windowSize: number;\n private readonly cooldownMs: number;\n private readonly increaseStep: number;\n private readonly decreaseFactor: number;\n private readonly healthyLatencyMs: number;\n\n constructor(private readonly config: AdaptiveConcurrencyConfig) {\n this.minGlobal = Math.max(1, config.minGlobal ?? 1);\n this.minScoped = Math.max(1, config.minScoped ?? 1);\n this.windowSize = clamp(Math.floor(config.windowSize ?? 20), 5, 100);\n this.cooldownMs = clamp(Math.floor(config.cooldownMs ?? 3000), 250, 60000);\n this.increaseStep = clamp(Math.floor(config.increaseStep ?? 1), 1, 8);\n this.decreaseFactor = clamp(config.decreaseFactor ?? 0.7, 0.1, 0.95);\n this.healthyLatencyMs = clamp(Math.floor(config.healthyLatencyMs ?? 1200), 50, 60000);\n this.global = {\n limit: clamp(config.baselineGlobal, this.minGlobal, Math.max(this.minGlobal, config.maxGlobal)),\n lastAdjustedAt: 0,\n samples: []\n };\n }\n\n snapshot(scope: string): AdaptiveConcurrencyDiagnostics {\n if (!this.config.enabled) {\n return {\n enabled: false,\n scope,\n global: {\n limit: this.global.limit,\n min: this.minGlobal,\n max: this.config.maxGlobal\n },\n scoped: {\n limit: clamp(this.config.baselineScoped, this.minScoped, this.config.maxScoped),\n min: this.minScoped,\n max: this.config.maxScoped\n }\n };\n }\n\n const scoped = this.getScoped(scope);\n return {\n enabled: true,\n scope,\n global: {\n limit: this.global.limit,\n min: this.minGlobal,\n max: this.config.maxGlobal\n },\n scoped: {\n limit: scoped.limit,\n min: this.minScoped,\n max: this.config.maxScoped\n }\n };\n }\n\n observe(scope: string, signal: AdaptiveSignal, nowMs = Date.now()): void {\n if (!this.config.enabled) return;\n\n this.record(this.global, signal);\n const scoped = this.getScoped(scope);\n this.record(scoped, signal);\n\n this.adjust(this.global, this.minGlobal, this.config.maxGlobal, nowMs);\n this.adjust(scoped, this.minScoped, this.config.maxScoped, nowMs);\n }\n\n private getScoped(scope: string): TrackState {\n const existing = this.scoped.get(scope);\n if (existing) return existing;\n const next: TrackState = {\n limit: clamp(this.config.baselineScoped, this.minScoped, this.config.maxScoped),\n lastAdjustedAt: 0,\n samples: []\n };\n this.scoped.set(scope, next);\n return next;\n }\n\n private record(track: TrackState, signal: AdaptiveSignal): void {\n track.samples.push(signal);\n if (track.samples.length > this.windowSize) {\n track.samples.splice(0, track.samples.length - this.windowSize);\n }\n }\n\n private adjust(track: TrackState, min: number, max: number, nowMs: number): void {\n if (nowMs - track.lastAdjustedAt < this.cooldownMs) {\n return;\n }\n\n const samples = track.samples;\n const p95Latency = percentile(samples.map((sample) => sample.latencyMs), 0.95);\n const timeoutRate = rate(samples, \"timeout\");\n const challengeRate = rate(samples, \"challenge\");\n const http5xxRate = rate(samples, \"http5xx\");\n const http4xxRate = rate(samples, \"http4xx\");\n const avgQueuePressure = queuePressure(samples);\n\n const unhealthy = timeoutRate > 0\n || challengeRate > 0\n || http5xxRate > 0.15\n || http4xxRate > 0.3\n || p95Latency > this.healthyLatencyMs * 1.35\n || avgQueuePressure > 0.85;\n\n if (unhealthy) {\n const reduced = Math.floor(track.limit * this.decreaseFactor);\n track.limit = clamp(reduced, min, max);\n track.lastAdjustedAt = nowMs;\n return;\n }\n\n const healthy = timeoutRate === 0\n && challengeRate === 0\n && http5xxRate === 0\n && p95Latency <= this.healthyLatencyMs\n && avgQueuePressure < 0.6;\n\n if (healthy) {\n track.limit = clamp(track.limit + this.increaseStep, min, max);\n track.lastAdjustedAt = nowMs;\n }\n }\n}\n","import type { JsonValue, NormalizedRecord } from \"../types\";\n\ntype PromptGuardSeverity = \"low\" | \"medium\" | \"high\";\ntype PromptGuardAction = \"strip\" | \"quarantine\";\ntype PromptGuardField = \"title\" | \"content\";\n\ntype PromptGuardRule = {\n id: string;\n regex: RegExp;\n severity: PromptGuardSeverity;\n action: PromptGuardAction;\n};\n\nexport interface PromptGuardEntry {\n pattern: string;\n action: PromptGuardAction;\n severity: PromptGuardSeverity;\n excerpt: string;\n}\n\nexport interface PromptGuardRecordEntry extends PromptGuardEntry {\n recordId: string;\n field: PromptGuardField;\n}\n\nexport interface PromptGuardTextResult {\n text: string;\n diagnostics: {\n entries: number;\n quarantinedSegments: number;\n };\n entries: PromptGuardEntry[];\n}\n\nexport interface PromptGuardResult {\n records: NormalizedRecord[];\n audit: {\n enabled: boolean;\n quarantinedSegments: number;\n entries: PromptGuardRecordEntry[];\n };\n}\n\nconst MAX_EXCERPT_LENGTH = 120;\n\nconst RULES: PromptGuardRule[] = [\n {\n id: \"reveal_system_prompt\",\n regex: /\\b(reveal|show|print|dump|expose|leak)\\b[^.!?\\n]{0,80}\\b(system prompt|hidden prompt|internal prompt)\\b/gi,\n severity: \"high\",\n action: \"quarantine\"\n },\n {\n id: \"tool_abuse_directive\",\n regex: /\\buse (?:the )?tool(?:ing)?\\b[^.!?\\n]{0,120}\\b(delete|remove|drop|wipe|exfiltrat|override|bypass)\\w*/gi,\n severity: \"high\",\n action: \"quarantine\"\n },\n {\n id: \"ignore_previous_instructions\",\n regex: /\\bignore (?:all )?previous instructions?\\b/gi,\n severity: \"medium\",\n action: \"strip\"\n },\n {\n id: \"reveal_hidden_data\",\n regex: /\\breveal (?:hidden|secret|confidential) (?:data|information)\\b/gi,\n severity: \"high\",\n action: \"quarantine\"\n }\n];\n\nconst sanitizeExcerpt = (value: string): string => {\n const compact = value.replace(/\\s+/g, \" \").trim();\n if (compact.length <= MAX_EXCERPT_LENGTH) return compact;\n return `${compact.slice(0, MAX_EXCERPT_LENGTH - 3)}...`;\n};\n\nconst isJsonObject = (value: JsonValue | undefined): value is Record<string, JsonValue> => {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n};\n\nconst withSecurityAttributes = (\n record: NormalizedRecord,\n enabled: boolean,\n guardEntries: number,\n quarantinedSegments: number\n): Record<string, JsonValue> => {\n const existingSecurity = isJsonObject(record.attributes.security)\n ? record.attributes.security\n : {};\n\n return {\n ...record.attributes,\n security: {\n ...existingSecurity,\n untrustedContent: true,\n dataOnlyContext: true,\n promptGuardEnabled: enabled,\n guardEntries,\n quarantinedSegments\n }\n };\n};\n\nexport function sanitizePromptGuardText(text: string, enabled: boolean): PromptGuardTextResult {\n if (!enabled || !text) {\n return {\n text,\n diagnostics: { entries: 0, quarantinedSegments: 0 },\n entries: []\n };\n }\n\n let output = text;\n const entries: PromptGuardEntry[] = [];\n\n for (const rule of RULES) {\n rule.regex.lastIndex = 0;\n output = output.replace(rule.regex, (match) => {\n entries.push({\n pattern: rule.id,\n action: rule.action,\n severity: rule.severity,\n excerpt: sanitizeExcerpt(match)\n });\n return rule.action === \"quarantine\" ? \"[QUARANTINED]\" : \" \";\n });\n }\n\n const normalized = output.replace(/\\s{2,}/g, \" \").trim();\n const quarantinedSegments = entries.reduce((count, entry) => {\n return entry.action === \"quarantine\" ? count + 1 : count;\n }, 0);\n\n return {\n text: normalized,\n diagnostics: {\n entries: entries.length,\n quarantinedSegments\n },\n entries\n };\n}\n\nexport function applyPromptGuard(records: NormalizedRecord[], enabled: boolean): PromptGuardResult {\n const auditEntries: PromptGuardRecordEntry[] = [];\n let totalQuarantinedSegments = 0;\n\n const guardedRecords = records.map((record) => {\n if (!enabled) {\n return {\n ...record,\n attributes: withSecurityAttributes(record, false, 0, 0)\n };\n }\n\n let title = record.title;\n let content = record.content;\n let recordEntries = 0;\n let recordQuarantinedSegments = 0;\n\n if (typeof record.title === \"string\") {\n const sanitizedTitle = sanitizePromptGuardText(record.title, true);\n title = sanitizedTitle.text;\n recordEntries += sanitizedTitle.diagnostics.entries;\n recordQuarantinedSegments += sanitizedTitle.diagnostics.quarantinedSegments;\n for (const entry of sanitizedTitle.entries) {\n auditEntries.push({\n ...entry,\n recordId: record.id,\n field: \"title\"\n });\n }\n }\n\n if (typeof record.content === \"string\") {\n const sanitizedContent = sanitizePromptGuardText(record.content, true);\n content = sanitizedContent.text;\n recordEntries += sanitizedContent.diagnostics.entries;\n recordQuarantinedSegments += sanitizedContent.diagnostics.quarantinedSegments;\n for (const entry of sanitizedContent.entries) {\n auditEntries.push({\n ...entry,\n recordId: record.id,\n field: \"content\"\n });\n }\n }\n\n totalQuarantinedSegments += recordQuarantinedSegments;\n\n return {\n ...record,\n ...(typeof title === \"string\" ? { title } : {}),\n ...(typeof content === \"string\" ? { content } : {}),\n attributes: withSecurityAttributes(record, true, recordEntries, recordQuarantinedSegments)\n };\n });\n\n return {\n records: guardedRecords,\n audit: {\n enabled,\n quarantinedSegments: enabled ? totalQuarantinedSegments : 0,\n entries: enabled ? auditEntries : []\n }\n };\n}\n","import type { ProviderTier, ProviderTierMetadata } from \"./types\";\n\nexport interface TierRouterConfig {\n defaultTier: ProviderTier;\n enableHybrid: boolean;\n enableRestrictedSafe: boolean;\n hybridRiskThreshold?: number;\n restrictedSafeRecoveryIntervalMs?: number;\n}\n\nexport interface TierRouterSignals {\n hybridEligible: boolean;\n preferredTier?: ProviderTier;\n forceRestrictedSafe?: boolean;\n challengePressure?: number;\n highFrictionTarget?: boolean;\n riskScore?: number;\n hybridHealthy?: boolean;\n policyRestrictedSafe?: boolean;\n latencyBudgetExceeded?: boolean;\n errorBudgetExceeded?: boolean;\n recoveryStableForMs?: number;\n policyAllowsRecovery?: boolean;\n}\n\nexport interface TierRouteDecision {\n tier: ProviderTierMetadata;\n fallbackTier: \"A\";\n}\n\nconst canSelectTier = (tier: ProviderTier, config: TierRouterConfig): boolean => {\n if (tier === \"A\") return true;\n if (tier === \"B\") return config.enableHybrid;\n return config.enableRestrictedSafe;\n};\n\nexport const selectTierRoute = (\n config: TierRouterConfig,\n signals: TierRouterSignals\n): TierRouteDecision => {\n const challengePressure = signals.challengePressure ?? 0;\n const hybridRiskThreshold = Math.max(0, Math.min(1, config.hybridRiskThreshold ?? 0.6));\n const riskScore = Math.max(0, Math.min(1, signals.riskScore ?? challengePressure));\n const hybridHealthy = signals.hybridHealthy ?? true;\n const policyRestrictedSafe = signals.policyRestrictedSafe ?? false;\n const latencyBudgetExceeded = signals.latencyBudgetExceeded ?? false;\n const errorBudgetExceeded = signals.errorBudgetExceeded ?? false;\n const policyAllowsRecovery = signals.policyAllowsRecovery ?? true;\n const recoveryStableForMs = Math.max(0, signals.recoveryStableForMs ?? 0);\n\n if (signals.preferredTier && canSelectTier(signals.preferredTier, config)) {\n return {\n tier: {\n selected: signals.preferredTier,\n reasonCode: \"operator_override\"\n },\n fallbackTier: \"A\"\n };\n }\n\n if (config.enableRestrictedSafe && policyRestrictedSafe) {\n return {\n tier: {\n selected: \"C\",\n reasonCode: \"policy_restricted_safe\"\n },\n fallbackTier: \"A\"\n };\n }\n\n if (config.enableRestrictedSafe && signals.forceRestrictedSafe) {\n return {\n tier: {\n selected: \"C\",\n reasonCode: \"restricted_safe_forced\"\n },\n fallbackTier: \"A\"\n };\n }\n\n if (config.enableRestrictedSafe && signals.highFrictionTarget) {\n return {\n tier: {\n selected: \"C\",\n reasonCode: \"high_friction_target\"\n },\n fallbackTier: \"A\"\n };\n }\n\n if (config.enableRestrictedSafe && challengePressure >= 0.5) {\n return {\n tier: {\n selected: \"C\",\n reasonCode: \"challenge_pressure\"\n },\n fallbackTier: \"A\"\n };\n }\n\n const resolveHybridTier = (\n reasonCode: \"default_tier\" | \"hybrid_eligible\"\n ): TierRouteDecision => {\n if (!hybridHealthy) {\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"hybrid_unhealthy\"\n },\n fallbackTier: \"A\"\n };\n }\n if (riskScore > hybridRiskThreshold) {\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"hybrid_risk_threshold\"\n },\n fallbackTier: \"A\"\n };\n }\n if (latencyBudgetExceeded) {\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"hybrid_latency_budget\"\n },\n fallbackTier: \"A\"\n };\n }\n if (errorBudgetExceeded) {\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"hybrid_error_budget\"\n },\n fallbackTier: \"A\"\n };\n }\n return {\n tier: {\n selected: \"B\",\n reasonCode\n },\n fallbackTier: \"A\"\n };\n };\n\n if (config.defaultTier === \"C\") {\n if (config.enableRestrictedSafe) {\n const recovered = policyAllowsRecovery\n && recoveryStableForMs >= Math.max(0, config.restrictedSafeRecoveryIntervalMs ?? 60000);\n if (recovered) {\n if (config.enableHybrid && signals.hybridEligible) {\n const route = resolveHybridTier(\"hybrid_eligible\");\n if (route.tier.selected === \"B\") {\n return {\n tier: {\n selected: \"B\",\n reasonCode: \"restricted_safe_recovered\"\n },\n fallbackTier: \"A\"\n };\n }\n }\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"restricted_safe_recovered\"\n },\n fallbackTier: \"A\"\n };\n }\n return {\n tier: {\n selected: \"C\",\n reasonCode: \"default_tier\"\n },\n fallbackTier: \"A\"\n };\n }\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"restricted_safe_disabled\"\n },\n fallbackTier: \"A\"\n };\n }\n\n if (config.defaultTier === \"B\") {\n if (!config.enableHybrid) {\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"hybrid_disabled\"\n },\n fallbackTier: \"A\"\n };\n }\n if (signals.hybridEligible) {\n return resolveHybridTier(\"default_tier\");\n }\n }\n\n if (config.enableHybrid && signals.hybridEligible) {\n return resolveHybridTier(\"hybrid_eligible\");\n }\n\n return {\n tier: {\n selected: \"A\",\n reasonCode: \"default_tier\"\n },\n fallbackTier: \"A\"\n };\n};\n\nexport const shouldFallbackToTierA = (tier: ProviderTier): boolean => {\n return tier !== \"A\";\n};\n\nexport const fallbackTierMetadata = (): ProviderTierMetadata => {\n return {\n selected: \"A\",\n reasonCode: \"fallback_to_tier_a\"\n };\n};\n","import { randomUUID } from \"crypto\";\n\nexport type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"audit\";\n\nexport type LogEnvelope = {\n ts: string;\n level: LogLevel;\n module: string;\n event: string;\n requestId: string;\n sessionId?: string;\n traceId?: string;\n data?: unknown;\n};\n\ntype LogFields = {\n requestId?: string;\n sessionId?: string;\n traceId?: string;\n data?: unknown;\n};\n\ntype LogSink = (entry: LogEnvelope) => void;\n\nconst SECRET_KEY_PATTERN = /(token|secret|password|authorization|cookie|api[-_]?key|session)/i;\nconst SECRET_VALUE_PATTERN = /(bearer\\s+[a-z0-9._-]+|sk_[a-z0-9_-]+|pk_[a-z0-9_-]+|eyJ[a-z0-9_-]+\\.[a-z0-9_-]+\\.[a-z0-9_-]+)/gi;\n\nfunction redactString(value: string): string {\n return value.replace(SECRET_VALUE_PATTERN, \"[REDACTED]\");\n}\n\nexport function redactSensitive(value: unknown, seen = new WeakSet<object>()): unknown {\n if (typeof value === \"string\") {\n return redactString(value);\n }\n if (typeof value !== \"object\" || value === null) {\n return value;\n }\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n if (Array.isArray(value)) {\n return value.map((item) => redactSensitive(item, seen));\n }\n\n const output: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n if (SECRET_KEY_PATTERN.test(key)) {\n output[key] = \"[REDACTED]\";\n continue;\n }\n output[key] = redactSensitive(entry, seen);\n }\n return output;\n}\n\nexport function createRequestId(): string {\n return randomUUID();\n}\n\nconst defaultSink: LogSink = (entry) => {\n const payload = JSON.stringify(entry);\n if (entry.level === \"error\") {\n console.error(payload);\n return;\n }\n if (entry.level === \"warn\") {\n console.warn(payload);\n return;\n }\n console.log(payload);\n};\n\nexport function createLogger(moduleName: string, sink: LogSink = defaultSink): {\n debug: (event: string, fields?: LogFields) => LogEnvelope;\n info: (event: string, fields?: LogFields) => LogEnvelope;\n warn: (event: string, fields?: LogFields) => LogEnvelope;\n error: (event: string, fields?: LogFields) => LogEnvelope;\n audit: (event: string, fields?: LogFields) => LogEnvelope;\n} {\n const emit = (level: LogLevel, event: string, fields: LogFields = {}): LogEnvelope => {\n const entry: LogEnvelope = {\n ts: new Date().toISOString(),\n level,\n module: moduleName,\n event,\n requestId: fields.requestId ?? createRequestId(),\n ...(fields.sessionId ? { sessionId: fields.sessionId } : {}),\n ...(fields.traceId ? { traceId: fields.traceId } : {}),\n ...(typeof fields.data === \"undefined\" ? {} : { data: redactSensitive(fields.data) })\n };\n sink(entry);\n return entry;\n };\n\n return {\n debug: (event, fields) => emit(\"debug\", event, fields),\n info: (event, fields) => emit(\"info\", event, fields),\n warn: (event, fields) => emit(\"warn\", event, fields),\n error: (event, fields) => emit(\"error\", event, fields),\n audit: (event, fields) => emit(\"audit\", event, fields)\n };\n}\n\nexport const __test__ = {\n redactString,\n defaultSink\n};\n","import type { ProviderOperation, ProviderReasonCode } from \"../types\";\n\nexport interface AntiBotPolicyConfig {\n enabled: boolean;\n cooldownMs: number;\n maxChallengeRetries: number;\n proxyHint?: string;\n sessionHint?: string;\n allowBrowserEscalation: boolean;\n}\n\nexport interface AntiBotPreflightContext {\n providerId: string;\n operation: ProviderOperation;\n nowMs?: number;\n}\n\nexport interface AntiBotPreflightResult {\n allow: boolean;\n reasonCode?: ProviderReasonCode;\n retryAfterMs?: number;\n retryGuidance?: string;\n proxyHint?: string;\n sessionHint?: string;\n escalationIntent: boolean;\n}\n\nexport interface AntiBotPostflightContext {\n providerId: string;\n operation: ProviderOperation;\n success: boolean;\n reasonCode?: ProviderReasonCode;\n retryable: boolean;\n attempt: number;\n maxAttempts: number;\n nowMs?: number;\n}\n\nexport interface AntiBotPostflightResult {\n allowRetry: boolean;\n reasonCode?: ProviderReasonCode;\n retryAfterMs?: number;\n escalationIntent: boolean;\n proxyHint?: string;\n sessionHint?: string;\n}\n\ntype ProviderCooldownState = {\n reasonCode: ProviderReasonCode;\n cooldownUntilMs: number;\n updatedAt: string;\n};\n\nconst clampInt = (value: number | undefined, fallback: number, min: number, max: number): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback;\n const rounded = Math.floor(value);\n if (rounded < min) return min;\n if (rounded > max) return max;\n return rounded;\n};\n\nexport const DEFAULT_ANTI_BOT_POLICY_CONFIG: AntiBotPolicyConfig = {\n enabled: true,\n cooldownMs: 30000,\n maxChallengeRetries: 1,\n allowBrowserEscalation: false\n};\n\nconst COOLDOWN_REASONS = new Set<ProviderReasonCode>([\n \"ip_blocked\",\n \"token_required\",\n \"auth_required\",\n \"challenge_detected\",\n \"rate_limited\"\n]);\n\nconst ESCALATION_REASONS = new Set<ProviderReasonCode>([\n \"ip_blocked\",\n \"token_required\",\n \"auth_required\",\n \"challenge_detected\"\n]);\n\nconst toKey = (providerId: string, operation: ProviderOperation): string => `${providerId}:${operation}`;\n\nexport const resolveAntiBotPolicyConfig = (\n config: Partial<AntiBotPolicyConfig> | undefined\n): AntiBotPolicyConfig => ({\n enabled: config?.enabled ?? DEFAULT_ANTI_BOT_POLICY_CONFIG.enabled,\n cooldownMs: clampInt(config?.cooldownMs, DEFAULT_ANTI_BOT_POLICY_CONFIG.cooldownMs, 0, 300000),\n maxChallengeRetries: clampInt(\n config?.maxChallengeRetries,\n DEFAULT_ANTI_BOT_POLICY_CONFIG.maxChallengeRetries,\n 0,\n 10\n ),\n ...(config?.proxyHint ? { proxyHint: config.proxyHint.trim() } : {}),\n ...(config?.sessionHint ? { sessionHint: config.sessionHint.trim() } : {}),\n allowBrowserEscalation: config?.allowBrowserEscalation ?? DEFAULT_ANTI_BOT_POLICY_CONFIG.allowBrowserEscalation\n});\n\nexport class AntiBotPolicyEngine {\n private readonly config: AntiBotPolicyConfig;\n private readonly cooldownByScope = new Map<string, ProviderCooldownState>();\n\n constructor(config: Partial<AntiBotPolicyConfig> | undefined = {}) {\n this.config = resolveAntiBotPolicyConfig(config);\n }\n\n preflight(context: AntiBotPreflightContext): AntiBotPreflightResult {\n if (!this.config.enabled) {\n return {\n allow: true,\n escalationIntent: false\n };\n }\n\n const key = toKey(context.providerId, context.operation);\n const nowMs = context.nowMs ?? Date.now();\n const cooldown = this.cooldownByScope.get(key);\n if (cooldown && cooldown.cooldownUntilMs > nowMs) {\n const retryAfterMs = cooldown.cooldownUntilMs - nowMs;\n return {\n allow: false,\n reasonCode: cooldown.reasonCode,\n retryAfterMs,\n retryGuidance: \"cooldown_active\",\n ...(this.config.proxyHint ? { proxyHint: this.config.proxyHint } : {}),\n ...(this.config.sessionHint ? { sessionHint: this.config.sessionHint } : {}),\n escalationIntent: this.config.allowBrowserEscalation && ESCALATION_REASONS.has(cooldown.reasonCode)\n };\n }\n\n if (cooldown && cooldown.cooldownUntilMs <= nowMs) {\n this.cooldownByScope.delete(key);\n }\n\n return {\n allow: true,\n escalationIntent: false\n };\n }\n\n postflight(context: AntiBotPostflightContext): AntiBotPostflightResult {\n if (!this.config.enabled) {\n return {\n allowRetry: context.retryable && context.attempt < context.maxAttempts,\n escalationIntent: false\n };\n }\n\n const key = toKey(context.providerId, context.operation);\n if (context.success) {\n this.cooldownByScope.delete(key);\n return {\n allowRetry: false,\n escalationIntent: false\n };\n }\n\n const reasonCode = context.reasonCode;\n const nowMs = context.nowMs ?? Date.now();\n if (reasonCode && COOLDOWN_REASONS.has(reasonCode) && this.config.cooldownMs > 0) {\n this.cooldownByScope.set(key, {\n reasonCode,\n cooldownUntilMs: nowMs + this.config.cooldownMs,\n updatedAt: new Date(nowMs).toISOString()\n });\n }\n\n const canRetryByAttempt = context.attempt < context.maxAttempts;\n const challengeRetryBudgetExceeded = reasonCode === \"challenge_detected\"\n && context.attempt > this.config.maxChallengeRetries + 1;\n const allowRetry = context.retryable && canRetryByAttempt && !challengeRetryBudgetExceeded;\n\n return {\n allowRetry,\n ...(reasonCode ? { reasonCode } : {}),\n ...(reasonCode && COOLDOWN_REASONS.has(reasonCode) && this.config.cooldownMs > 0\n ? { retryAfterMs: this.config.cooldownMs }\n : {}),\n ...(this.config.proxyHint ? { proxyHint: this.config.proxyHint } : {}),\n ...(this.config.sessionHint ? { sessionHint: this.config.sessionHint } : {}),\n escalationIntent: Boolean(\n reasonCode\n && this.config.allowBrowserEscalation\n && ESCALATION_REASONS.has(reasonCode)\n )\n };\n }\n}\n","import { createHash } from \"crypto\";\nimport { ProviderRuntimeError } from \"../errors\";\nimport type { JsonValue, ProviderPostInput, TraceContext } from \"../types\";\n\nexport interface PostPolicyContext {\n providerId: string;\n source: \"community\" | \"social\";\n payload: ProviderPostInput;\n trace: TraceContext;\n}\n\nexport interface PostPolicyDecision {\n allow: boolean;\n reason?: string;\n metadata?: Record<string, JsonValue>;\n}\n\nexport interface PostPolicyAuditEntry {\n providerId: string;\n source: \"community\" | \"social\";\n decision: \"allow\" | \"deny\";\n reason?: string;\n payloadHash: string;\n ts: string;\n requestId: string;\n}\n\nexport type PostPolicyHook = (context: PostPolicyContext) => Promise<PostPolicyDecision> | PostPolicyDecision;\n\nconst defaultPolicy: PostPolicyHook = (context) => {\n if (!context.payload.riskAccepted) {\n return {\n allow: false,\n reason: \"Posting requires risk acknowledgement\"\n };\n }\n\n if (!context.payload.confirm) {\n return {\n allow: false,\n reason: \"Posting requires explicit confirmation\"\n };\n }\n\n return { allow: true };\n};\n\nexport const hashPostPayload = (payload: ProviderPostInput): string => {\n const normalized = JSON.stringify({\n target: payload.target,\n content: payload.content,\n mediaUrls: payload.mediaUrls ?? [],\n metadata: payload.metadata ?? {}\n });\n return createHash(\"sha256\").update(normalized).digest(\"hex\");\n};\n\nexport const evaluatePostPolicy = async (\n context: PostPolicyContext,\n hooks: PostPolicyHook[] = []\n): Promise<{ allowed: boolean; reason?: string; audit: PostPolicyAuditEntry; metadata?: Record<string, JsonValue> }> => {\n const chain = [defaultPolicy, ...hooks];\n const payloadHash = hashPostPayload(context.payload);\n\n for (const hook of chain) {\n const decision = await hook(context);\n if (!decision.allow) {\n return {\n allowed: false,\n reason: decision.reason,\n ...(decision.metadata ? { metadata: decision.metadata } : {}),\n audit: {\n providerId: context.providerId,\n source: context.source,\n decision: \"deny\",\n reason: decision.reason,\n payloadHash,\n ts: new Date().toISOString(),\n requestId: context.trace.requestId\n }\n };\n }\n }\n\n return {\n allowed: true,\n audit: {\n providerId: context.providerId,\n source: context.source,\n decision: \"allow\",\n payloadHash,\n ts: new Date().toISOString(),\n requestId: context.trace.requestId\n }\n };\n};\n\nexport const assertPostPolicy = async (\n context: PostPolicyContext,\n hooks: PostPolicyHook[] = []\n): Promise<PostPolicyAuditEntry> => {\n const result = await evaluatePostPolicy(context, hooks);\n if (!result.allowed) {\n throw new ProviderRuntimeError(\"policy_blocked\", result.reason ?? \"Post policy blocked the request\", {\n provider: context.providerId,\n source: context.source,\n retryable: false,\n details: {\n payloadHash: result.audit.payloadHash,\n reason: result.reason ?? null,\n ...(result.metadata ? { metadata: result.metadata } : {})\n }\n });\n }\n\n return result.audit;\n};\n","const STATIC_HOST_PATTERNS = [\n /(^|\\.)redditstatic\\.com$/i,\n /(^|\\.)twimg\\.com$/i,\n /(^|\\.)static\\.licdn\\.com$/i,\n /(^|\\.)ytimg\\.com$/i,\n /(^|\\.)fbcdn\\.net$/i,\n /(^|\\.)cdninstagram\\.com$/i\n];\n\nconst STATIC_PATH_EXT_RE = /\\.(?:avif|bmp|css|csv|gif|ico|jpe?g|js|json|map|mjs|mp3|mp4|ogg|pdf|png|svg|txt|wav|webm|webp|woff2?|xml|zip)$/i;\n\nexport const isLikelyDocumentUrl = (value: string): boolean => {\n try {\n const parsed = new URL(value);\n const protocol = parsed.protocol.toLowerCase();\n if (protocol !== \"http:\" && protocol !== \"https:\") return false;\n\n if (STATIC_HOST_PATTERNS.some((pattern) => pattern.test(parsed.hostname))) {\n return false;\n }\n\n return !STATIC_PATH_EXT_RE.test(parsed.pathname);\n } catch {\n return false;\n }\n};\n","export type RobotsMode = \"strict\" | \"warn\" | \"off\";\n\nexport interface WebCrawlPolicy {\n robotsMode?: RobotsMode;\n allowDomains?: string[];\n denyDomains?: string[];\n robotsBlockedDomains?: string[];\n}\n\nexport interface CrawlPolicyDecision {\n allowed: boolean;\n warnings: string[];\n reason?: string;\n}\n\nconst normalizeDomain = (value: string): string => value.trim().toLowerCase();\n\nconst includesDomain = (list: string[] | undefined, value: string): boolean => {\n if (!list || list.length === 0) return false;\n const normalized = normalizeDomain(value);\n return list.some((entry) => normalized === normalizeDomain(entry));\n};\n\nexport const evaluateWebCrawlPolicy = (\n rawUrl: string,\n policy: WebCrawlPolicy = {}\n): CrawlPolicyDecision => {\n let hostname = \"\";\n try {\n hostname = new URL(rawUrl).hostname;\n } catch {\n return {\n allowed: false,\n warnings: [],\n reason: \"Invalid URL\"\n };\n }\n\n if (includesDomain(policy.denyDomains, hostname)) {\n return {\n allowed: false,\n warnings: [],\n reason: \"Domain denied by policy\"\n };\n }\n\n if ((policy.allowDomains?.length ?? 0) > 0 && !includesDomain(policy.allowDomains, hostname)) {\n return {\n allowed: false,\n warnings: [],\n reason: \"Domain not in allow list\"\n };\n }\n\n const mode = policy.robotsMode ?? \"warn\";\n if (!includesDomain(policy.robotsBlockedDomains, hostname)) {\n return { allowed: true, warnings: [] };\n }\n\n if (mode === \"off\") {\n return { allowed: true, warnings: [] };\n }\n\n if (mode === \"warn\") {\n return {\n allowed: true,\n warnings: [\"Blocked by robots policy but allowed due to warn mode\"]\n };\n }\n\n return {\n allowed: false,\n warnings: [],\n reason: \"Blocked by robots policy\"\n };\n};\n","import { Worker, isMainThread } from \"node:worker_threads\";\nimport { extractStructuredContent, type ExtractedContent } from \"./extract\";\n\nexport interface CrawlExtractInput {\n url: string;\n html: string;\n selectors: string[];\n}\n\nexport interface CrawlWorkerPoolOptions {\n workerThreads?: number;\n queueMax?: number;\n forceInline?: boolean;\n}\n\ninterface WorkerExtractRequest {\n id: number;\n url: string;\n html: string;\n selectors: string[];\n}\n\ninterface WorkerExtractSuccess {\n id: number;\n ok: true;\n extracted: ExtractedContent;\n}\n\ninterface WorkerExtractFailure {\n id: number;\n ok: false;\n error: string;\n}\n\ntype WorkerExtractResponse = WorkerExtractSuccess | WorkerExtractFailure;\n\ninterface CrawlTask {\n id: number;\n input: CrawlExtractInput;\n resolve: (value: ExtractedContent) => void;\n reject: (error: Error) => void;\n}\n\ninterface WorkerHandle {\n worker: Worker;\n busy: boolean;\n taskId?: number;\n}\n\nconst DEFAULT_WORKER_THREADS = 0;\nconst DEFAULT_QUEUE_MAX = 16;\n\nconst WORKER_SCRIPT = `\nconst { parentPort } = require(\"node:worker_threads\");\n\nconst SCRIPT_STYLE_RE = /<(script|style)[^>]*>[\\\\s\\\\S]*?<\\\\/\\\\1>/gi;\nconst TAG_RE = /<[^>]+>/g;\nconst SPACE_RE = /\\\\s+/g;\nconst HREF_RE = /href\\\\s*=\\\\s*([\"'])(.*?)\\\\1/gi;\n\nconst extractText = (html) => {\n return String(html)\n .replace(SCRIPT_STYLE_RE, \" \")\n .replace(TAG_RE, \" \")\n .replace(SPACE_RE, \" \")\n .trim();\n};\n\nconst normalizeLink = (href, baseUrl) => {\n if (!href || href.startsWith(\"javascript:\") || href.startsWith(\"mailto:\") || href.startsWith(\"tel:\")) {\n return null;\n }\n try {\n return new URL(href, baseUrl).toString();\n } catch {\n return null;\n }\n};\n\nconst extractLinks = (html, baseUrl) => {\n const links = new Set();\n for (const match of String(html).matchAll(HREF_RE)) {\n const raw = match[2]?.trim();\n if (!raw) continue;\n const normalized = normalizeLink(raw, baseUrl);\n if (!normalized) continue;\n links.add(normalized);\n }\n return [...links];\n};\n\nconst selectorRegex = (selector) => {\n const safe = selector.replace(/[-/\\\\\\\\^$*+?.()|[\\\\]{}]/g, \"\\\\\\\\$&\");\n if (selector.startsWith(\"#\")) {\n const id = selector.slice(1).replace(/[-/\\\\\\\\^$*+?.()|[\\\\]{}]/g, \"\\\\\\\\$&\");\n return new RegExp(\\`<([a-z0-9-]+)[^>]*id=[\"']\\${id}[\"'][^>]*>([\\\\\\\\s\\\\\\\\S]*?)<\\\\\\\\/\\\\\\\\1>\\`, \"gi\");\n }\n if (selector.startsWith(\".\")) {\n const className = selector.slice(1).replace(/[-/\\\\\\\\^$*+?.()|[\\\\]{}]/g, \"\\\\\\\\$&\");\n return new RegExp(\\`<([a-z0-9-]+)[^>]*class=[\"'][^\"']*\\\\\\\\b\\${className}\\\\\\\\b[^\"']*[\"'][^>]*>([\\\\\\\\s\\\\\\\\S]*?)<\\\\\\\\/\\\\\\\\1>\\`, \"gi\");\n }\n return new RegExp(\\`<\\${safe}[^>]*>([\\\\\\\\s\\\\\\\\S]*?)<\\\\\\\\/\\${safe}>\\`, \"gi\");\n};\n\nconst extractSelectors = (html, selectors = []) => {\n const out = {};\n for (const selector of selectors) {\n const values = [];\n for (const match of String(html).matchAll(selectorRegex(selector))) {\n const text = extractText(match[2] ?? match[1] ?? \"\");\n if (text) values.push(text);\n }\n out[selector] = values;\n }\n return out;\n};\n\nconst extractStructuredContent = (html, baseUrl, selectors = []) => {\n return {\n text: extractText(html),\n links: extractLinks(html, baseUrl),\n selectors: extractSelectors(html, selectors)\n };\n};\n\nparentPort?.on(\"message\", (message) => {\n const id = typeof message?.id === \"number\" ? message.id : null;\n if (id === null) return;\n\n try {\n const extracted = extractStructuredContent(\n String(message.html ?? \"\"),\n String(message.url ?? \"\"),\n Array.isArray(message.selectors) ? message.selectors.map((value) => String(value)) : []\n );\n parentPort?.postMessage({\n id,\n ok: true,\n extracted\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n parentPort?.postMessage({\n id,\n ok: false,\n error: reason\n });\n }\n});\n`;\n\nconst supportsWorkerThreads = (): boolean => {\n return isMainThread && typeof Worker === \"function\";\n};\n\nconst toError = (error: unknown, fallback: string): Error => {\n if (error instanceof Error) return error;\n return new Error(error === undefined ? fallback : String(error));\n};\n\nexport class CrawlWorkerPool {\n private readonly queueMax: number;\n private readonly queue: CrawlTask[] = [];\n private readonly inFlight = new Map<number, CrawlTask>();\n private readonly workers: WorkerHandle[] = [];\n private nextTaskId = 1;\n private inlineOnly: boolean;\n private closed = false;\n\n constructor(options: CrawlWorkerPoolOptions = {}) {\n const requestedWorkers = Math.max(0, Math.floor(options.workerThreads ?? DEFAULT_WORKER_THREADS));\n this.queueMax = Math.max(1, Math.floor(options.queueMax ?? DEFAULT_QUEUE_MAX));\n this.inlineOnly = options.forceInline === true || requestedWorkers === 0 || !supportsWorkerThreads();\n\n if (!this.inlineOnly) {\n for (let index = 0; index < requestedWorkers; index += 1) {\n this.spawnWorker();\n }\n if (this.workers.length === 0) {\n this.inlineOnly = true;\n }\n }\n }\n\n async extract(input: CrawlExtractInput): Promise<ExtractedContent> {\n if (this.closed) {\n throw new Error(\"crawl_worker_pool_closed\");\n }\n\n if (this.inlineOnly) {\n return extractStructuredContent(input.html, input.url, input.selectors);\n }\n\n if (this.queue.length + this.inFlight.size >= this.queueMax) {\n throw new Error(`crawl_worker_queue_overflow:${this.queueMax}`);\n }\n\n const taskId = this.nextTaskId;\n this.nextTaskId += 1;\n\n return new Promise<ExtractedContent>((resolve, reject) => {\n this.queue.push({ id: taskId, input, resolve, reject });\n this.dispatch();\n });\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n\n const closingError = new Error(\"crawl_worker_pool_closed\");\n for (const task of this.queue.splice(0)) {\n task.reject(closingError);\n }\n for (const task of this.inFlight.values()) {\n task.reject(closingError);\n }\n this.inFlight.clear();\n\n const handles = this.workers.splice(0);\n await Promise.all(handles.map((handle) => {\n return handle.worker.terminate()\n .then(() => undefined)\n .catch(() => undefined);\n }));\n }\n\n private spawnWorker(): void {\n try {\n const worker = new Worker(WORKER_SCRIPT, {\n eval: true\n });\n const handle: WorkerHandle = {\n worker,\n busy: false\n };\n\n worker.on(\"message\", (message: unknown) => {\n this.handleWorkerMessage(handle, message);\n });\n\n worker.on(\"error\", (error) => {\n this.handleWorkerFailure(handle, error);\n });\n\n worker.on(\"exit\", (code) => {\n if (code !== 0) {\n this.handleWorkerFailure(handle, new Error(`crawl_worker_exit:${code}`));\n }\n });\n\n this.workers.push(handle);\n } catch {\n this.inlineOnly = true;\n }\n }\n\n private dispatch(): void {\n if (this.inlineOnly || this.closed) return;\n for (const handle of this.workers) {\n if (handle.busy) continue;\n const task = this.queue.shift();\n if (!task) return;\n\n handle.busy = true;\n handle.taskId = task.id;\n this.inFlight.set(task.id, task);\n\n const request: WorkerExtractRequest = {\n id: task.id,\n url: task.input.url,\n html: task.input.html,\n selectors: task.input.selectors\n };\n\n try {\n handle.worker.postMessage(request);\n } catch (error) {\n this.inFlight.delete(task.id);\n handle.busy = false;\n handle.taskId = undefined;\n this.resolveTaskInline(task, error);\n }\n }\n }\n\n private handleWorkerMessage(handle: WorkerHandle, message: unknown): void {\n const response = this.parseWorkerResponse(message);\n const taskId = response?.id ?? handle.taskId;\n if (taskId === undefined) {\n handle.busy = false;\n handle.taskId = undefined;\n this.dispatch();\n return;\n }\n\n const task = this.inFlight.get(taskId);\n this.inFlight.delete(taskId);\n handle.busy = false;\n handle.taskId = undefined;\n\n if (!task) {\n this.dispatch();\n return;\n }\n\n if (response?.ok === true) {\n task.resolve(response.extracted);\n this.dispatch();\n return;\n }\n\n this.resolveTaskInline(task, response?.error);\n this.dispatch();\n }\n\n private handleWorkerFailure(handle: WorkerHandle, error: unknown): void {\n const taskId = handle.taskId;\n handle.busy = false;\n handle.taskId = undefined;\n\n if (taskId !== undefined) {\n const task = this.inFlight.get(taskId);\n if (task) {\n this.inFlight.delete(taskId);\n this.resolveTaskInline(task, error);\n }\n }\n\n const index = this.workers.indexOf(handle);\n if (index >= 0) {\n this.workers.splice(index, 1);\n }\n\n if (this.workers.length === 0) {\n this.inlineOnly = true;\n while (this.queue.length > 0) {\n const queuedTask = this.queue.shift();\n if (!queuedTask) continue;\n this.resolveTaskInline(queuedTask, error);\n }\n return;\n }\n\n this.dispatch();\n }\n\n private parseWorkerResponse(message: unknown): WorkerExtractResponse | null {\n if (!message || typeof message !== \"object\") return null;\n const candidate = message as Record<string, unknown>;\n if (typeof candidate.id !== \"number\") return null;\n if (candidate.ok === true) {\n const extracted = candidate.extracted;\n if (!extracted || typeof extracted !== \"object\") return null;\n const typedExtracted = extracted as Record<string, unknown>;\n if (typeof typedExtracted.text !== \"string\") return null;\n if (!Array.isArray(typedExtracted.links)) return null;\n if (!typedExtracted.selectors || typeof typedExtracted.selectors !== \"object\") return null;\n const selectors: Record<string, string[]> = {};\n for (const [key, value] of Object.entries(typedExtracted.selectors as Record<string, unknown>)) {\n selectors[key] = Array.isArray(value)\n ? value.filter((entry): entry is string => typeof entry === \"string\")\n : [];\n }\n return {\n id: candidate.id,\n ok: true,\n extracted: {\n text: typedExtracted.text,\n links: typedExtracted.links\n .filter((value): value is string => typeof value === \"string\"),\n selectors\n }\n };\n }\n\n return {\n id: candidate.id,\n ok: false,\n error: typeof candidate.error === \"string\" ? candidate.error : \"worker_parse_failed\"\n };\n }\n\n private resolveTaskInline(task: CrawlTask, cause: unknown): void {\n try {\n task.resolve(extractStructuredContent(task.input.html, task.input.url, task.input.selectors));\n } catch (error) {\n task.reject(toError(error, toError(cause, \"crawl_worker_inline_failed\").message));\n }\n }\n}\n\nexport const extractCrawlContentInline = (input: CrawlExtractInput): ExtractedContent => {\n return extractStructuredContent(input.html, input.url, input.selectors);\n};\n\nexport const createCrawlWorkerPool = (\n options: CrawlWorkerPoolOptions = {}\n): CrawlWorkerPool => {\n return new CrawlWorkerPool(options);\n};\n\nexport const __test__ = {\n supportsWorkerThreads,\n toError\n};\n","export interface ExtractedContent {\n text: string;\n links: string[];\n selectors: Record<string, string[]>;\n}\n\nconst SCRIPT_STYLE_RE = /<(script|style)[^>]*>[\\s\\S]*?<\\/\\1>/gi;\nconst TAG_RE = /<[^>]+>/g;\nconst SPACE_RE = /\\s+/g;\nconst HREF_RE = /href\\s*=\\s*([\"'])(.*?)\\1/gi;\n\nexport const extractText = (html: string): string => {\n return html\n .replace(SCRIPT_STYLE_RE, \" \")\n .replace(TAG_RE, \" \")\n .replace(SPACE_RE, \" \")\n .trim();\n};\n\nconst normalizeLink = (href: string, baseUrl: string): string | null => {\n if (!href || href.startsWith(\"javascript:\") || href.startsWith(\"mailto:\") || href.startsWith(\"tel:\")) {\n return null;\n }\n\n try {\n return new URL(href, baseUrl).toString();\n } catch {\n return null;\n }\n};\n\nexport const extractLinks = (html: string, baseUrl: string): string[] => {\n const links = new Set<string>();\n for (const match of html.matchAll(HREF_RE)) {\n const raw = match[2]?.trim();\n if (!raw) continue;\n const normalized = normalizeLink(raw, baseUrl);\n if (!normalized) continue;\n links.add(normalized);\n }\n return [...links];\n};\n\nconst selectorRegex = (selector: string): RegExp => {\n const safe = selector.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n if (selector.startsWith(\"#\")) {\n const id = selector.slice(1).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n return new RegExp(`<([a-z0-9-]+)[^>]*id=[\"']${id}[\"'][^>]*>([\\\\s\\\\S]*?)<\\\\/\\\\1>`, \"gi\");\n }\n if (selector.startsWith(\".\")) {\n const className = selector.slice(1).replace(/[-/\\\\^$*+?.()|[\\]{}]/g, \"\\\\$&\");\n return new RegExp(`<([a-z0-9-]+)[^>]*class=[\"'][^\"']*\\\\b${className}\\\\b[^\"']*[\"'][^>]*>([\\\\s\\\\S]*?)<\\\\/\\\\1>`, \"gi\");\n }\n return new RegExp(`<${safe}[^>]*>([\\\\s\\\\S]*?)<\\\\/${safe}>`, \"gi\");\n};\n\nexport const extractSelectors = (html: string, selectors: string[] = []): Record<string, string[]> => {\n const out: Record<string, string[]> = {};\n for (const selector of selectors) {\n const values: string[] = [];\n for (const match of html.matchAll(selectorRegex(selector))) {\n const text = extractText(match[2] ?? match[1] ?? \"\");\n if (text) {\n values.push(text);\n }\n }\n out[selector] = values;\n }\n return out;\n};\n\nexport const extractStructuredContent = (\n html: string,\n baseUrl: string,\n selectors: string[] = []\n): ExtractedContent => {\n return {\n text: extractText(html),\n links: extractLinks(html, baseUrl),\n selectors: extractSelectors(html, selectors)\n };\n};\n\nexport const toSnippet = (text: string, maxChars = 280): string => {\n if (text.length <= maxChars) return text;\n return `${text.slice(0, Math.max(0, maxChars - 1))}…`;\n};\n","import { evaluateWebCrawlPolicy, type WebCrawlPolicy } from \"./policy\";\nimport { createCrawlWorkerPool, extractCrawlContentInline, type CrawlWorkerPool } from \"./crawl-worker\";\nimport type { CrawlStrategy } from \"../types\";\n\nexport interface CrawlBudget {\n maxDepth: number;\n maxPages: number;\n maxPerDomain: number;\n}\n\nexport interface CrawlPipelineBudget {\n workerThreads: number;\n queueMax: number;\n fetchConcurrency: number;\n frontierMax: number;\n}\n\nexport interface CrawlPage {\n url: string;\n canonicalUrl: string;\n depth: number;\n status: number;\n text: string;\n links: string[];\n selectors: Record<string, string[]>;\n warnings: string[];\n}\n\nexport interface CrawlMetrics {\n visited: number;\n fetched: number;\n deduped: number;\n elapsedMs: number;\n pagesPerMinute: number;\n p50LatencyMs: number;\n p95LatencyMs: number;\n}\n\nexport interface CrawlResult {\n pages: CrawlPage[];\n graph: Array<{ from: string; to: string }>;\n warnings: string[];\n metrics: CrawlMetrics;\n}\n\nexport interface CrawlFetcherResponse {\n url?: string;\n html: string;\n status?: number;\n}\n\nexport type CrawlFetcher = (url: string) => Promise<CrawlFetcherResponse>;\n\nexport interface CrawlOptions {\n seeds: string[];\n strategy?: CrawlStrategy;\n budget?: Partial<CrawlBudget>;\n policy?: WebCrawlPolicy;\n selectors?: string[];\n pipeline?: Partial<CrawlPipelineBudget>;\n workerThreads?: number;\n queueMax?: number;\n forceInlineParse?: boolean;\n fetcher: CrawlFetcher;\n}\n\ninterface FrontierNode {\n url: string;\n depth: number;\n sequence: number;\n firstSeenOrder: number;\n firstSeenAtMs: number;\n sourcePriority: number;\n stableRecordId: string;\n}\n\ninterface CrawlTaskResult {\n sequence: number;\n firstSeenAtMs: number;\n sourcePriority: number;\n stableRecordId: string;\n page: CrawlPage | null;\n links: string[];\n warnings: string[];\n latencyMs: number;\n}\n\ninterface CrawlPageEntry {\n page: CrawlPage;\n firstSeenAtMs: number;\n sourcePriority: number;\n stableRecordId: string;\n sequence: number;\n}\n\nconst DEFAULT_BUDGET: CrawlBudget = {\n maxDepth: 2,\n maxPages: 20,\n maxPerDomain: 10\n};\n\nconst DEFAULT_PIPELINE: CrawlPipelineBudget = {\n workerThreads: 2,\n queueMax: 64,\n fetchConcurrency: 4,\n frontierMax: 256\n};\n\nconst TRACKING_QUERY_KEYS = new Set([\n \"utm_source\",\n \"utm_medium\",\n \"utm_campaign\",\n \"utm_term\",\n \"utm_content\",\n \"gclid\",\n \"fbclid\"\n]);\n\nexport const canonicalizeUrl = (rawUrl: string): string => {\n let parsed: URL;\n try {\n parsed = new URL(rawUrl);\n } catch {\n return rawUrl.trim();\n }\n\n parsed.hash = \"\";\n parsed.protocol = parsed.protocol.toLowerCase();\n parsed.hostname = parsed.hostname.toLowerCase();\n\n if ((parsed.protocol === \"http:\" && parsed.port === \"80\") || (parsed.protocol === \"https:\" && parsed.port === \"443\")) {\n parsed.port = \"\";\n }\n\n const next = new URL(parsed.toString());\n const params = [...next.searchParams.entries()]\n .filter(([key]) => !TRACKING_QUERY_KEYS.has(key.toLowerCase()))\n .sort(([a], [b]) => a.localeCompare(b));\n next.search = \"\";\n for (const [key, value] of params) {\n next.searchParams.append(key, value);\n }\n\n if (next.pathname.length > 1 && next.pathname.endsWith(\"/\")) {\n next.pathname = next.pathname.slice(0, -1);\n }\n\n if (next.pathname === \"/\") {\n return `${next.protocol}//${next.host}${next.search}`;\n }\n\n return next.toString();\n};\n\nconst percentile = (values: number[], ratio: number): number => {\n if (values.length === 0) return 0;\n const sorted = [...values].sort((a, b) => a - b);\n const index = Math.min(sorted.length - 1, Math.max(0, Math.ceil(sorted.length * ratio) - 1));\n return sorted[index] ?? 0;\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst compareFrontierNodes = (\n left: FrontierNode,\n right: FrontierNode,\n strategy: CrawlStrategy\n): number => {\n if (left.depth !== right.depth) {\n return strategy === \"dfs\"\n ? right.depth - left.depth\n : left.depth - right.depth;\n }\n if (left.firstSeenOrder !== right.firstSeenOrder) {\n return strategy === \"dfs\"\n ? right.firstSeenOrder - left.firstSeenOrder\n : left.firstSeenOrder - right.firstSeenOrder;\n }\n if (left.sourcePriority !== right.sourcePriority) {\n return left.sourcePriority - right.sourcePriority;\n }\n if (left.sequence !== right.sequence) {\n return strategy === \"dfs\"\n ? right.sequence - left.sequence\n : left.sequence - right.sequence;\n }\n return left.url.localeCompare(right.url);\n};\n\nconst dequeueNode = (\n frontier: FrontierNode[],\n strategy: CrawlStrategy\n): FrontierNode | undefined => {\n if (frontier.length === 0) return undefined;\n frontier.sort((left, right) => compareFrontierNodes(left, right, strategy));\n return frontier.shift();\n};\n\nconst resolveFrontierDomain = (url: string): string => {\n try {\n return new URL(url).hostname.toLowerCase();\n } catch {\n return \"__invalid__\";\n }\n};\n\nconst enqueueFrontierNode = (\n frontierByDomain: Map<string, FrontierNode[]>,\n node: FrontierNode\n): void => {\n const domain = resolveFrontierDomain(node.url);\n const queue = frontierByDomain.get(domain) ?? [];\n queue.push(node);\n frontierByDomain.set(domain, queue);\n};\n\nconst frontierSize = (frontierByDomain: Map<string, FrontierNode[]>): number => {\n let size = 0;\n for (const queue of frontierByDomain.values()) {\n size += queue.length;\n }\n return size;\n};\n\nconst dequeueFrontierByDomain = (\n frontierByDomain: Map<string, FrontierNode[]>,\n strategy: CrawlStrategy\n): FrontierNode | undefined => {\n let selectedDomain: string | undefined;\n let selected: FrontierNode | undefined;\n\n for (const [domain, queue] of frontierByDomain.entries()) {\n if (queue.length === 0) continue;\n queue.sort((left, right) => compareFrontierNodes(left, right, strategy));\n const candidate = queue[0];\n if (!candidate) continue;\n if (!selected || compareFrontierNodes(candidate, selected, strategy) < 0) {\n selected = candidate;\n selectedDomain = domain;\n }\n }\n\n if (!selectedDomain || !selected) {\n return undefined;\n }\n\n const queue = frontierByDomain.get(selectedDomain);\n if (!queue || queue.length === 0) {\n return undefined;\n }\n const next = queue.shift();\n if (queue.length === 0) {\n frontierByDomain.delete(selectedDomain);\n }\n return next;\n};\n\nconst waitForNextTask = async (\n tasks: Map<number, Promise<CrawlTaskResult>>\n): Promise<CrawlTaskResult> => {\n return Promise.race([...tasks.values()]);\n};\n\nconst sortPageEntries = (entries: CrawlPageEntry[]): CrawlPage[] => {\n return [...entries]\n .sort((left, right) => {\n if (left.firstSeenAtMs !== right.firstSeenAtMs) {\n return left.firstSeenAtMs - right.firstSeenAtMs;\n }\n if (left.sourcePriority !== right.sourcePriority) {\n return left.sourcePriority - right.sourcePriority;\n }\n if (left.stableRecordId !== right.stableRecordId) {\n return left.stableRecordId.localeCompare(right.stableRecordId);\n }\n return left.sequence - right.sequence;\n })\n .map((entry) => entry.page);\n};\n\nconst executeTask = async (args: {\n node: FrontierNode;\n fetcher: CrawlFetcher;\n selectors: string[];\n policyWarnings: string[];\n workerPool: CrawlWorkerPool;\n}): Promise<CrawlTaskResult> => {\n const startedAt = Date.now();\n const taskWarnings: string[] = [];\n let status = 0;\n let html = \"\";\n\n try {\n const response = await args.fetcher(args.node.url);\n status = response.status ?? 200;\n html = response.html;\n } catch {\n taskWarnings.push(`${args.node.url}: fetch failed`);\n return {\n sequence: args.node.sequence,\n firstSeenAtMs: args.node.firstSeenAtMs,\n sourcePriority: args.node.sourcePriority,\n stableRecordId: args.node.stableRecordId,\n page: null,\n links: [],\n warnings: taskWarnings,\n latencyMs: Math.max(0, Date.now() - startedAt)\n };\n }\n\n let extracted = extractCrawlContentInline({\n url: args.node.url,\n html,\n selectors: args.selectors\n });\n try {\n extracted = await args.workerPool.extract({\n url: args.node.url,\n html,\n selectors: args.selectors\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.startsWith(\"crawl_worker_queue_overflow:\")) {\n taskWarnings.push(`${args.node.url}: worker queue saturated`);\n } else {\n taskWarnings.push(`${args.node.url}: worker extraction fallback`);\n }\n }\n\n const links = extracted.links\n .map((link) => canonicalizeUrl(link))\n .filter((link) => isHttpUrl(link));\n\n return {\n sequence: args.node.sequence,\n firstSeenAtMs: args.node.firstSeenAtMs,\n sourcePriority: args.node.sourcePriority,\n stableRecordId: args.node.stableRecordId,\n page: {\n url: args.node.url,\n canonicalUrl: args.node.url,\n depth: args.node.depth,\n status,\n text: extracted.text,\n links,\n selectors: extracted.selectors,\n warnings: args.policyWarnings\n },\n links,\n warnings: taskWarnings,\n latencyMs: Math.max(0, Date.now() - startedAt)\n };\n};\n\nexport const crawlWeb = async (options: CrawlOptions): Promise<CrawlResult> => {\n const startedAt = Date.now();\n const budget: CrawlBudget = {\n ...DEFAULT_BUDGET,\n ...(options.budget ?? {})\n };\n const pipeline: CrawlPipelineBudget = {\n ...DEFAULT_PIPELINE,\n ...(options.pipeline ?? {}),\n ...(typeof options.workerThreads === \"number\" ? { workerThreads: options.workerThreads } : {}),\n ...(typeof options.queueMax === \"number\" ? { queueMax: options.queueMax } : {})\n };\n\n const strategy: CrawlStrategy = options.strategy ?? \"bfs\";\n const fetchConcurrency = Math.max(1, Math.floor(pipeline.fetchConcurrency));\n const workerPool = createCrawlWorkerPool({\n workerThreads: pipeline.workerThreads,\n queueMax: pipeline.queueMax,\n forceInline: options.forceInlineParse\n });\n\n let nextSequence = 0;\n let nextFirstSeenOrder = 0;\n const frontierByDomain = new Map<string, FrontierNode[]>();\n const visited = new Set<string>();\n const queued = new Set<string>();\n for (const seed of options.seeds) {\n const canonicalSeed = canonicalizeUrl(seed);\n const node: FrontierNode = {\n url: canonicalSeed,\n depth: 0,\n sequence: nextSequence++,\n firstSeenOrder: nextFirstSeenOrder,\n firstSeenAtMs: startedAt + nextFirstSeenOrder,\n sourcePriority: 0,\n stableRecordId: canonicalSeed\n };\n nextFirstSeenOrder += 1;\n enqueueFrontierNode(frontierByDomain, node);\n queued.add(canonicalSeed);\n }\n const domainCounts = new Map<string, number>();\n const pageEntries: CrawlPageEntry[] = [];\n const graph: Array<{ from: string; to: string }> = [];\n const warnings: string[] = [];\n const latencies: number[] = [];\n let deduped = 0;\n\n const inFlight = new Map<number, Promise<CrawlTaskResult>>();\n const completed = new Map<number, CrawlTaskResult>();\n const scheduledOrder: number[] = [];\n let appliedOrderIndex = 0;\n\n try {\n while (frontierSize(frontierByDomain) > 0 || inFlight.size > 0) {\n while (\n frontierSize(frontierByDomain) > 0\n && inFlight.size < fetchConcurrency\n && pageEntries.length + inFlight.size < budget.maxPages\n ) {\n const node = dequeueFrontierByDomain(frontierByDomain, strategy);\n if (!node) break;\n\n queued.delete(node.url);\n if (visited.has(node.url)) {\n deduped += 1;\n continue;\n }\n\n const decision = evaluateWebCrawlPolicy(node.url, options.policy);\n if (!decision.allowed) {\n warnings.push(`${node.url}: ${decision.reason ?? \"blocked\"}`);\n continue;\n }\n if (decision.warnings.length > 0) {\n warnings.push(...decision.warnings.map((warning) => `${node.url}: ${warning}`));\n }\n\n let hostname: string;\n try {\n hostname = new URL(node.url).hostname.toLowerCase();\n } catch {\n warnings.push(`${node.url}: invalid hostname`);\n continue;\n }\n\n const currentDomainCount = domainCounts.get(hostname) ?? 0;\n if (currentDomainCount >= budget.maxPerDomain) {\n warnings.push(`${node.url}: per-domain budget exceeded`);\n continue;\n }\n\n visited.add(node.url);\n domainCounts.set(hostname, currentDomainCount + 1);\n\n const task = executeTask({\n node,\n fetcher: options.fetcher,\n selectors: options.selectors ?? [],\n policyWarnings: decision.warnings,\n workerPool\n });\n inFlight.set(node.sequence, task);\n scheduledOrder.push(node.sequence);\n }\n\n if (inFlight.size === 0) {\n break;\n }\n\n const completedTask = await waitForNextTask(inFlight);\n inFlight.delete(completedTask.sequence);\n completed.set(completedTask.sequence, completedTask);\n\n while (appliedOrderIndex < scheduledOrder.length) {\n const sequence = scheduledOrder[appliedOrderIndex];\n if (typeof sequence !== \"number\") break;\n const ready = completed.get(sequence);\n if (!ready) break;\n\n appliedOrderIndex += 1;\n completed.delete(sequence);\n latencies.push(ready.latencyMs);\n if (ready.warnings.length > 0) {\n warnings.push(...ready.warnings);\n }\n if (!ready.page) {\n continue;\n }\n\n pageEntries.push({\n page: ready.page,\n firstSeenAtMs: ready.firstSeenAtMs,\n sourcePriority: ready.sourcePriority,\n stableRecordId: ready.stableRecordId,\n sequence: ready.sequence\n });\n if (pageEntries.length >= budget.maxPages) {\n continue;\n }\n\n for (const link of ready.links) {\n graph.push({ from: ready.page.url, to: link });\n if (ready.page.depth >= budget.maxDepth) continue;\n\n const linkDecision = evaluateWebCrawlPolicy(link, options.policy);\n if (!linkDecision.allowed) {\n warnings.push(`${link}: ${linkDecision.reason ?? \"blocked\"}`);\n continue;\n }\n if (linkDecision.warnings.length > 0) {\n warnings.push(...linkDecision.warnings.map((warning) => `${link}: ${warning}`));\n }\n\n if (visited.has(link) || queued.has(link)) {\n deduped += 1;\n continue;\n }\n if (frontierSize(frontierByDomain) >= pipeline.frontierMax) {\n warnings.push(`${link}: crawl frontier saturated`);\n continue;\n }\n\n const node: FrontierNode = {\n url: link,\n depth: ready.page.depth + 1,\n sequence: nextSequence++,\n firstSeenOrder: nextFirstSeenOrder,\n firstSeenAtMs: startedAt + nextFirstSeenOrder,\n sourcePriority: 1,\n stableRecordId: canonicalizeUrl(link)\n };\n nextFirstSeenOrder += 1;\n enqueueFrontierNode(frontierByDomain, node);\n queued.add(link);\n }\n }\n }\n } finally {\n await workerPool.close();\n }\n\n const pages = sortPageEntries(pageEntries);\n const elapsedMs = Math.max(1, Date.now() - startedAt);\n const pagesPerMinute = pages.length / (elapsedMs / 60000);\n\n return {\n pages,\n graph,\n warnings,\n metrics: {\n visited: visited.size,\n fetched: pages.length,\n deduped,\n elapsedMs,\n pagesPerMinute,\n p50LatencyMs: percentile(latencies, 0.5),\n p95LatencyMs: percentile(latencies, 0.95)\n }\n };\n};\n\nexport const __test__ = {\n percentile,\n isHttpUrl,\n compareFrontierNodes,\n dequeueNode,\n resolveFrontierDomain,\n enqueueFrontierNode,\n frontierSize,\n dequeueFrontierByDomain,\n sortPageEntries,\n waitForNextTask\n};\n","import { ProviderRuntimeError } from \"../errors\";\nimport { normalizeRecord, normalizeRecords } from \"../normalize\";\nimport { assertPostPolicy, type PostPolicyHook } from \"../shared/post-policy\";\nimport { isLikelyDocumentUrl } from \"../shared/traversal-url\";\nimport { canonicalizeUrl } from \"../web/crawler\";\nimport type {\n JsonValue,\n NormalizedRecord,\n ProviderAdapter,\n ProviderCapabilities,\n ProviderContext,\n ProviderCrawlInput,\n ProviderFetchInput,\n ProviderPostInput,\n ProviderSearchInput\n} from \"../types\";\n\nconst COMMUNITY_SOURCE = \"community\" as const;\n\ntype CommunityRow = {\n url: string;\n title?: string;\n content?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n};\n\ntype CommunityFetchRow = {\n url?: string;\n title?: string;\n content?: string;\n attributes?: Record<string, JsonValue>;\n};\n\ninterface TraversalNode {\n url: string;\n hop: number;\n page: number;\n parent: string;\n}\n\nexport interface CommunityTraversalBudget {\n pageLimit: number;\n hopLimit: number;\n expansionPerRecord: number;\n maxRecords: number;\n}\n\nexport interface CommunityProviderOptions {\n id?: string;\n platform?: string;\n search?: (input: ProviderSearchInput, context: ProviderContext) => Promise<CommunityRow[]>;\n fetch?: (input: ProviderFetchInput, context: ProviderContext) => Promise<CommunityFetchRow>;\n crawl?: (input: ProviderCrawlInput, context: ProviderContext) => Promise<Array<{ url: string; title?: string; content?: string; attributes?: Record<string, JsonValue> }>>;\n post?: (input: ProviderPostInput, context: ProviderContext) => Promise<{ url?: string; title?: string; content?: string; attributes?: Record<string, JsonValue> }>;\n postPolicyHooks?: PostPolicyHook[];\n defaultTraversal?: Partial<CommunityTraversalBudget>;\n}\n\nconst DEFAULT_TRAVERSAL: CommunityTraversalBudget = {\n pageLimit: 2,\n hopLimit: 1,\n expansionPerRecord: 5,\n maxRecords: 25\n};\n\nconst LINK_RE = /https?:\\/\\/[^\\s\"'<>]+/g;\n\nconst createCapabilities = (id: string, platform: string): ProviderCapabilities => ({\n providerId: id,\n source: COMMUNITY_SOURCE,\n operations: {\n search: { op: \"search\", supported: true, description: \"Search community threads\" },\n fetch: { op: \"fetch\", supported: true, description: \"Fetch a community thread or post\" },\n crawl: { op: \"crawl\", supported: true, description: \"Crawl linked community discussions\" },\n post: { op: \"post\", supported: true, description: \"Create a community post with policy gates\" }\n },\n policy: {\n posting: \"gated\",\n riskNoticeRequired: true,\n confirmationRequired: true\n },\n metadata: {\n platform,\n source: COMMUNITY_SOURCE\n }\n});\n\nconst asNumber = (value: JsonValue | undefined): number | undefined => {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return undefined;\n};\n\nconst toPositiveInt = (value: number | undefined, fallback: number): number => {\n if (typeof value !== \"number\" || Number.isNaN(value)) return fallback;\n return Math.max(1, Math.floor(value));\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst coerceStringArray = (value: JsonValue | undefined): string[] => {\n if (!Array.isArray(value)) return [];\n return value.filter((entry): entry is string => typeof entry === \"string\");\n};\n\nconst extractLinks = (\n row: { attributes?: Record<string, JsonValue>; content?: string },\n fallbackUrl: string\n): string[] => {\n const attributeLinks = [\n ...coerceStringArray(row.attributes?.links),\n ...coerceStringArray(row.attributes?.threadLinks),\n ...coerceStringArray(row.attributes?.replyLinks),\n ...coerceStringArray(row.attributes?.relatedUrls)\n ];\n const contentLinks = [...(row.content?.match(LINK_RE) ?? [])];\n const deduped = new Set<string>();\n for (const candidate of [...attributeLinks, ...contentLinks]) {\n const canonical = canonicalizeUrl(candidate);\n if (!isHttpUrl(canonical) || canonical === fallbackUrl || !isLikelyDocumentUrl(canonical)) continue;\n deduped.add(canonical);\n }\n return [...deduped].sort((left, right) => left.localeCompare(right));\n};\n\nconst qualityFlags = (args: {\n url: string;\n title?: string;\n content?: string;\n page: number;\n hop: number;\n expandedLinks: number;\n}): Record<string, JsonValue> => ({\n hasUrl: args.url.length > 0,\n hasTitle: typeof args.title === \"string\" && args.title.length > 0,\n hasContent: typeof args.content === \"string\" && args.content.length > 0,\n contentChars: args.content?.length ?? 0,\n page: args.page,\n hop: args.hop,\n expanded: args.hop > 0,\n expandedLinks: args.expandedLinks\n});\n\nconst mergedTraversal = (\n options: CommunityProviderOptions,\n input: { limit?: number; filters?: Record<string, JsonValue> }\n): CommunityTraversalBudget => {\n const filters = input.filters ?? {};\n return {\n pageLimit: toPositiveInt(\n asNumber(filters.pageLimit) ?? options.defaultTraversal?.pageLimit,\n DEFAULT_TRAVERSAL.pageLimit\n ),\n hopLimit: toPositiveInt(\n asNumber(filters.hopLimit) ?? options.defaultTraversal?.hopLimit,\n DEFAULT_TRAVERSAL.hopLimit\n ),\n expansionPerRecord: toPositiveInt(\n asNumber(filters.expansionPerRecord) ?? options.defaultTraversal?.expansionPerRecord,\n DEFAULT_TRAVERSAL.expansionPerRecord\n ),\n maxRecords: toPositiveInt(\n input.limit ?? asNumber(filters.maxRecords) ?? options.defaultTraversal?.maxRecords,\n DEFAULT_TRAVERSAL.maxRecords\n )\n };\n};\n\nconst unavailable = (id: string, message: string): ProviderRuntimeError => {\n return new ProviderRuntimeError(\"unavailable\", message, {\n provider: id,\n source: COMMUNITY_SOURCE\n });\n};\n\nconst shouldSkipExpansionError = (error: unknown): boolean => {\n if (!(error instanceof ProviderRuntimeError)) return false;\n return error.code === \"auth\"\n || error.code === \"network\"\n || error.code === \"rate_limited\"\n || error.code === \"timeout\"\n || error.code === \"unavailable\"\n || error.code === \"upstream\";\n};\n\nconst sortRows = <T extends { url: string; title?: string }>(rows: T[]): T[] => {\n return [...rows].sort((left, right) => {\n const leftUrl = canonicalizeUrl(left.url);\n const rightUrl = canonicalizeUrl(right.url);\n const byUrl = leftUrl.localeCompare(rightUrl);\n if (byUrl !== 0) return byUrl;\n return (left.title ?? \"\").localeCompare(right.title ?? \"\");\n });\n};\n\nexport const createCommunityProvider = (options: CommunityProviderOptions = {}): ProviderAdapter => {\n const id = options.id ?? \"community/default\";\n const platform = options.platform ?? \"community\";\n\n const search = async (input: ProviderSearchInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (!input.query.trim()) {\n throw new ProviderRuntimeError(\"invalid_input\", \"Community search query is required\", {\n provider: id,\n source: COMMUNITY_SOURCE,\n retryable: false\n });\n }\n if (!options.search) {\n throw unavailable(id, \"Community search retrieval is not configured\");\n }\n\n const traversal = mergedTraversal(options, input);\n const seen = new Set<string>();\n const pending: TraversalNode[] = [];\n const rows: CommunityRow[] = [];\n\n for (let page = 1; page <= traversal.pageLimit && rows.length < traversal.maxRecords; page += 1) {\n const pageRows = await options.search({\n ...input,\n filters: {\n ...(input.filters ?? {}),\n page\n }\n }, context);\n for (const row of sortRows(pageRows)) {\n const canonical = canonicalizeUrl(row.url);\n if (!isHttpUrl(canonical) || seen.has(canonical)) continue;\n seen.add(canonical);\n rows.push({\n ...row,\n url: canonical,\n attributes: {\n ...(row.attributes ?? {}),\n traversal: {\n page,\n hop: 0\n },\n extractionQuality: qualityFlags({\n url: canonical,\n title: row.title,\n content: row.content,\n page,\n hop: 0,\n expandedLinks: 0\n })\n }\n });\n if (rows.length >= traversal.maxRecords) break;\n\n const links = extractLinks(row, canonical).slice(0, traversal.expansionPerRecord);\n for (const link of links) {\n pending.push({\n url: link,\n hop: 1,\n page,\n parent: canonical\n });\n }\n }\n }\n\n while (options.fetch && pending.length > 0 && rows.length < traversal.maxRecords) {\n const next = pending.shift();\n if (!next || next.hop > traversal.hopLimit) continue;\n const canonical = canonicalizeUrl(next.url);\n if (seen.has(canonical)) continue;\n\n let fetched: CommunityFetchRow;\n try {\n fetched = await options.fetch({\n url: canonical,\n filters: {\n ...(input.filters ?? {}),\n hop: next.hop,\n parent: next.parent\n }\n }, context);\n } catch (error) {\n if (shouldSkipExpansionError(error)) continue;\n throw error;\n }\n const resolvedUrl = canonicalizeUrl(fetched.url ?? canonical);\n if (!isHttpUrl(resolvedUrl) || seen.has(resolvedUrl)) continue;\n seen.add(resolvedUrl);\n\n const links = extractLinks(fetched, resolvedUrl).slice(0, traversal.expansionPerRecord);\n rows.push({\n url: resolvedUrl,\n title: fetched.title,\n content: fetched.content,\n confidence: 0.6,\n attributes: {\n ...(fetched.attributes ?? {}),\n traversal: {\n page: next.page,\n hop: next.hop,\n parent: next.parent\n },\n extractionQuality: qualityFlags({\n url: resolvedUrl,\n title: fetched.title,\n content: fetched.content,\n page: next.page,\n hop: next.hop,\n expandedLinks: links.length\n })\n }\n });\n\n if (next.hop < traversal.hopLimit) {\n for (const link of links) {\n if (seen.has(link)) continue;\n pending.push({\n url: link,\n hop: next.hop + 1,\n page: next.page,\n parent: resolvedUrl\n });\n }\n }\n }\n\n return normalizeRecords(id, COMMUNITY_SOURCE, rows.slice(0, traversal.maxRecords).map((row) => ({\n url: row.url,\n title: row.title,\n content: row.content,\n confidence: row.confidence ?? 0.65,\n attributes: row.attributes\n })));\n };\n\n const fetch = async (input: ProviderFetchInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (!options.fetch) {\n throw unavailable(id, \"Community fetch retrieval is not configured\");\n }\n const row = await options.fetch(input, context);\n const resolvedUrl = canonicalizeUrl(row.url ?? input.url);\n const links = extractLinks(row, resolvedUrl);\n return [normalizeRecord(id, COMMUNITY_SOURCE, {\n url: resolvedUrl,\n title: row.title,\n content: row.content,\n confidence: 0.7,\n attributes: {\n ...(row.attributes ?? {}),\n extractionQuality: qualityFlags({\n url: resolvedUrl,\n title: row.title,\n content: row.content,\n page: 0,\n hop: 0,\n expandedLinks: links.length\n })\n }\n })];\n };\n\n const crawl = async (input: ProviderCrawlInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (options.crawl) {\n const rows = await options.crawl(input, context);\n return normalizeRecords(id, COMMUNITY_SOURCE, sortRows(rows).map((row) => ({\n url: canonicalizeUrl(row.url),\n title: row.title,\n content: row.content,\n confidence: 0.6,\n attributes: {\n ...(row.attributes ?? {}),\n extractionQuality: qualityFlags({\n url: canonicalizeUrl(row.url),\n title: row.title,\n content: row.content,\n page: 0,\n hop: 0,\n expandedLinks: 0\n })\n }\n })));\n }\n if (!options.fetch) {\n throw unavailable(id, \"Community crawl retrieval is not configured\");\n }\n\n const maxPages = Math.max(1, input.maxPages ?? DEFAULT_TRAVERSAL.maxRecords);\n const maxDepth = Math.max(0, input.maxDepth ?? DEFAULT_TRAVERSAL.hopLimit);\n const expansionPerRecord = mergedTraversal(options, {\n filters: input.filters\n }).expansionPerRecord;\n\n const records: Array<{\n url: string;\n title?: string;\n content?: string;\n attributes?: Record<string, JsonValue>;\n }> = [];\n const seen = new Set<string>();\n const queue: Array<{ url: string; depth: number; parent?: string }> = input.seedUrls.map((url) => ({\n url: canonicalizeUrl(url),\n depth: 0\n }));\n\n while (queue.length > 0 && records.length < maxPages) {\n const node = queue.shift();\n if (!node || node.depth > maxDepth) continue;\n const canonical = canonicalizeUrl(node.url);\n if (!isHttpUrl(canonical) || seen.has(canonical)) continue;\n seen.add(canonical);\n\n const row = await options.fetch({\n url: canonical,\n filters: {\n ...(input.filters ?? {}),\n depth: node.depth,\n parent: node.parent ?? \"\"\n }\n }, context);\n const resolvedUrl = canonicalizeUrl(row.url ?? canonical);\n const links = extractLinks(row, resolvedUrl).slice(0, expansionPerRecord);\n\n records.push({\n url: resolvedUrl,\n title: row.title,\n content: row.content,\n attributes: {\n ...(row.attributes ?? {}),\n traversal: {\n depth: node.depth,\n parent: node.parent ?? resolvedUrl\n },\n extractionQuality: qualityFlags({\n url: resolvedUrl,\n title: row.title,\n content: row.content,\n page: 0,\n hop: node.depth,\n expandedLinks: links.length\n })\n }\n });\n\n if (node.depth >= maxDepth) continue;\n for (const link of links) {\n if (seen.has(link)) continue;\n queue.push({\n url: link,\n depth: node.depth + 1,\n parent: resolvedUrl\n });\n }\n }\n\n return normalizeRecords(id, COMMUNITY_SOURCE, records.map((row) => ({\n url: row.url,\n title: row.title,\n content: row.content,\n confidence: 0.6,\n attributes: row.attributes\n })));\n };\n\n const post = async (input: ProviderPostInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n const audit = await assertPostPolicy({\n providerId: id,\n source: COMMUNITY_SOURCE,\n payload: input,\n trace: context.trace\n }, options.postPolicyHooks);\n\n if (!options.post) {\n throw unavailable(id, \"Community posting transport is not configured\");\n }\n\n const row = await options.post(input, context);\n return [normalizeRecord(id, COMMUNITY_SOURCE, {\n url: row.url ?? \"\",\n title: row.title ?? `Post to ${input.target}`,\n content: row.content ?? input.content,\n confidence: 1,\n attributes: {\n ...(row.attributes ?? {}),\n auditHash: audit.payloadHash,\n decision: audit.decision\n }\n })];\n };\n\n return {\n id,\n source: COMMUNITY_SOURCE,\n search,\n fetch,\n crawl,\n post,\n health: async () => ({\n status: options.search || options.fetch ? \"healthy\" : \"degraded\",\n updatedAt: new Date().toISOString(),\n ...(options.search || options.fetch ? {} : { reason: \"Retrieval not configured\" })\n }),\n capabilities: () => createCapabilities(id, platform)\n };\n};\n","import { ProviderRuntimeError } from \"../errors\";\nimport { normalizeRecords } from \"../normalize\";\nimport { assertPostPolicy, type PostPolicyHook } from \"../shared/post-policy\";\nimport { isLikelyDocumentUrl } from \"../shared/traversal-url\";\nimport { canonicalizeUrl } from \"../web/crawler\";\nimport type {\n JsonValue,\n NormalizedRecord,\n ProviderAdapter,\n ProviderCapabilities,\n ProviderContext,\n ProviderFetchInput,\n ProviderPostInput,\n ProviderSearchInput\n} from \"../types\";\n\nconst SOCIAL_SOURCE = \"social\" as const;\n\nexport interface SocialSearchRecord {\n url: string;\n title?: string;\n content?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n}\n\ntype SocialFetchRecord = {\n url?: string;\n title?: string;\n content?: string;\n attributes?: Record<string, JsonValue>;\n};\n\ninterface SocialTraversalNode {\n url: string;\n page: number;\n hop: number;\n parent: string;\n}\n\nexport interface SocialTraversalBudget {\n pageLimit: number;\n hopLimit: number;\n expansionPerRecord: number;\n maxRecords: number;\n}\n\nexport interface SocialProviderOptions {\n id?: string;\n search?: (input: ProviderSearchInput, context: ProviderContext) => Promise<SocialSearchRecord[]>;\n fetch?: (input: ProviderFetchInput, context: ProviderContext) => Promise<SocialFetchRecord>;\n post?: (input: ProviderPostInput, context: ProviderContext) => Promise<SocialFetchRecord>;\n postPolicyHooks?: PostPolicyHook[];\n defaultTraversal?: Partial<SocialTraversalBudget>;\n}\n\nexport interface SocialPlatformProfile {\n platform: \"x\" | \"reddit\" | \"bluesky\" | \"facebook\" | \"linkedin\" | \"instagram\" | \"tiktok\" | \"threads\" | \"youtube\";\n displayName: string;\n baseUrl: string;\n maxPostLength: number;\n supportsMedia: boolean;\n supportsThreads: boolean;\n}\n\nconst DEFAULT_TRAVERSAL: SocialTraversalBudget = {\n pageLimit: 2,\n hopLimit: 1,\n expansionPerRecord: 4,\n maxRecords: 20\n};\n\nconst LINK_RE = /https?:\\/\\/[^\\s\"'<>]+/g;\n\nconst capabilitiesForProfile = (providerId: string, profile: SocialPlatformProfile): ProviderCapabilities => ({\n providerId,\n source: SOCIAL_SOURCE,\n operations: {\n search: {\n op: \"search\",\n supported: true,\n description: `Search ${profile.displayName}`,\n metadata: {\n platform: profile.platform,\n supportsMedia: profile.supportsMedia\n }\n },\n fetch: {\n op: \"fetch\",\n supported: true,\n description: `Fetch ${profile.displayName} item`\n },\n crawl: {\n op: \"crawl\",\n supported: false,\n description: \"Social crawl is intentionally disabled\"\n },\n post: {\n op: \"post\",\n supported: true,\n description: `Post to ${profile.displayName} with policy confirmation`,\n metadata: {\n maxPostLength: profile.maxPostLength,\n supportsMedia: profile.supportsMedia,\n supportsThreads: profile.supportsThreads\n }\n }\n },\n policy: {\n posting: \"gated\",\n riskNoticeRequired: true,\n confirmationRequired: true\n },\n metadata: {\n platform: profile.platform,\n displayName: profile.displayName,\n source: SOCIAL_SOURCE,\n maxPostLength: profile.maxPostLength,\n supportsMedia: profile.supportsMedia,\n supportsThreads: profile.supportsThreads\n }\n});\n\nconst asNumber = (value: JsonValue | undefined): number | undefined => {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) return parsed;\n }\n return undefined;\n};\n\nconst toPositiveInt = (value: number | undefined, fallback: number): number => {\n if (typeof value !== \"number\" || Number.isNaN(value)) return fallback;\n return Math.max(1, Math.floor(value));\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst coerceStringArray = (value: JsonValue | undefined): string[] => {\n if (!Array.isArray(value)) return [];\n return value.filter((entry): entry is string => typeof entry === \"string\");\n};\n\nconst extractLinks = (\n row: { attributes?: Record<string, JsonValue>; content?: string },\n fallbackUrl: string\n): string[] => {\n const attributeLinks = [\n ...coerceStringArray(row.attributes?.links),\n ...coerceStringArray(row.attributes?.threadLinks),\n ...coerceStringArray(row.attributes?.replyLinks),\n ...coerceStringArray(row.attributes?.relatedUrls)\n ];\n const contentLinks = [...(row.content?.match(LINK_RE) ?? [])];\n const deduped = new Set<string>();\n for (const candidate of [...attributeLinks, ...contentLinks]) {\n const canonical = canonicalizeUrl(candidate);\n if (!isHttpUrl(canonical) || canonical === fallbackUrl || !isLikelyDocumentUrl(canonical)) continue;\n deduped.add(canonical);\n }\n return [...deduped].sort((left, right) => left.localeCompare(right));\n};\n\nconst qualityFlags = (args: {\n url: string;\n title?: string;\n content?: string;\n page: number;\n hop: number;\n expandedLinks: number;\n}): Record<string, JsonValue> => ({\n hasUrl: args.url.length > 0,\n hasTitle: typeof args.title === \"string\" && args.title.length > 0,\n hasContent: typeof args.content === \"string\" && args.content.length > 0,\n contentChars: args.content?.length ?? 0,\n page: args.page,\n hop: args.hop,\n expanded: args.hop > 0,\n expandedLinks: args.expandedLinks\n});\n\nconst unavailable = (providerId: string, message: string): ProviderRuntimeError => {\n return new ProviderRuntimeError(\"unavailable\", message, {\n provider: providerId,\n source: SOCIAL_SOURCE\n });\n};\n\nconst shouldSkipExpansionError = (error: unknown): boolean => {\n if (!(error instanceof ProviderRuntimeError)) return false;\n return error.code === \"auth\"\n || error.code === \"network\"\n || error.code === \"rate_limited\"\n || error.code === \"timeout\"\n || error.code === \"unavailable\"\n || error.code === \"upstream\";\n};\n\nconst sortRows = <T extends { url: string; title?: string }>(rows: T[]): T[] => {\n return [...rows].sort((left, right) => {\n const leftUrl = canonicalizeUrl(left.url);\n const rightUrl = canonicalizeUrl(right.url);\n const byUrl = leftUrl.localeCompare(rightUrl);\n if (byUrl !== 0) return byUrl;\n return (left.title ?? \"\").localeCompare(right.title ?? \"\");\n });\n};\n\nconst mergedTraversal = (\n input: ProviderSearchInput,\n options: SocialProviderOptions\n): SocialTraversalBudget => {\n const filters = input.filters ?? {};\n return {\n pageLimit: toPositiveInt(\n asNumber(filters.pageLimit) ?? options.defaultTraversal?.pageLimit,\n DEFAULT_TRAVERSAL.pageLimit\n ),\n hopLimit: toPositiveInt(\n asNumber(filters.hopLimit) ?? options.defaultTraversal?.hopLimit,\n DEFAULT_TRAVERSAL.hopLimit\n ),\n expansionPerRecord: toPositiveInt(\n asNumber(filters.expansionPerRecord) ?? options.defaultTraversal?.expansionPerRecord,\n DEFAULT_TRAVERSAL.expansionPerRecord\n ),\n maxRecords: toPositiveInt(\n input.limit ?? asNumber(filters.maxRecords) ?? options.defaultTraversal?.maxRecords,\n DEFAULT_TRAVERSAL.maxRecords\n )\n };\n};\n\nconst normalizeSocialRows = (\n providerId: string,\n profile: SocialPlatformProfile,\n rows: Array<{\n url: string;\n title?: string;\n content?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n }>\n): NormalizedRecord[] => {\n return normalizeRecords(providerId, SOCIAL_SOURCE, rows.map((row) => ({\n url: row.url,\n title: row.title,\n content: row.content,\n confidence: row.confidence,\n attributes: {\n platform: profile.platform,\n ...(row.attributes ?? {})\n }\n })));\n};\n\nexport const createSocialPlatformProvider = (\n profile: SocialPlatformProfile,\n options: SocialProviderOptions = {}\n): ProviderAdapter => {\n const providerId = options.id ?? `social/${profile.platform}`;\n\n const search = async (input: ProviderSearchInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (!input.query.trim()) {\n throw new ProviderRuntimeError(\"invalid_input\", `${profile.displayName} search query is required`, {\n provider: providerId,\n source: SOCIAL_SOURCE,\n retryable: false\n });\n }\n if (!options.search) {\n throw unavailable(providerId, `${profile.displayName} search retrieval is not configured`);\n }\n\n const traversal = mergedTraversal(input, options);\n const seen = new Set<string>();\n const queue: SocialTraversalNode[] = [];\n const rows: Array<{\n url: string;\n title?: string;\n content?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n }> = [];\n\n for (let page = 1; page <= traversal.pageLimit && rows.length < traversal.maxRecords; page += 1) {\n const pageRows = await options.search({\n ...input,\n filters: {\n ...(input.filters ?? {}),\n page\n }\n }, context);\n\n for (const row of sortRows(pageRows)) {\n const canonical = canonicalizeUrl(row.url);\n if (!isHttpUrl(canonical) || seen.has(canonical)) continue;\n seen.add(canonical);\n\n rows.push({\n ...row,\n url: canonical,\n attributes: {\n ...(row.attributes ?? {}),\n traversal: {\n page,\n hop: 0\n },\n extractionQuality: qualityFlags({\n url: canonical,\n title: row.title,\n content: row.content,\n page,\n hop: 0,\n expandedLinks: 0\n })\n }\n });\n if (rows.length >= traversal.maxRecords) break;\n\n const links = extractLinks(row, canonical).slice(0, traversal.expansionPerRecord);\n for (const link of links) {\n queue.push({\n url: link,\n page,\n hop: 1,\n parent: canonical\n });\n }\n }\n }\n\n while (options.fetch && queue.length > 0 && rows.length < traversal.maxRecords) {\n const next = queue.shift();\n if (!next || next.hop > traversal.hopLimit) continue;\n const canonical = canonicalizeUrl(next.url);\n if (seen.has(canonical)) continue;\n\n let fetched: SocialFetchRecord;\n try {\n fetched = await options.fetch({\n url: canonical,\n filters: {\n ...(input.filters ?? {}),\n hop: next.hop,\n parent: next.parent\n }\n }, context);\n } catch (error) {\n if (shouldSkipExpansionError(error)) continue;\n throw error;\n }\n const resolvedUrl = canonicalizeUrl(fetched.url ?? canonical);\n if (!isHttpUrl(resolvedUrl) || seen.has(resolvedUrl)) continue;\n seen.add(resolvedUrl);\n\n const links = extractLinks(fetched, resolvedUrl).slice(0, traversal.expansionPerRecord);\n rows.push({\n url: resolvedUrl,\n title: fetched.title,\n content: fetched.content,\n confidence: 0.6,\n attributes: {\n ...(fetched.attributes ?? {}),\n traversal: {\n page: next.page,\n hop: next.hop,\n parent: next.parent\n },\n extractionQuality: qualityFlags({\n url: resolvedUrl,\n title: fetched.title,\n content: fetched.content,\n page: next.page,\n hop: next.hop,\n expandedLinks: links.length\n })\n }\n });\n\n if (next.hop < traversal.hopLimit) {\n for (const link of links) {\n if (seen.has(link)) continue;\n queue.push({\n url: link,\n page: next.page,\n hop: next.hop + 1,\n parent: resolvedUrl\n });\n }\n }\n }\n\n return normalizeSocialRows(providerId, profile, rows.slice(0, traversal.maxRecords));\n };\n\n const fetch = async (input: ProviderFetchInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (!options.fetch) {\n throw unavailable(providerId, `${profile.displayName} fetch retrieval is not configured`);\n }\n const row = await options.fetch(input, context);\n const resolvedUrl = canonicalizeUrl(row.url ?? input.url);\n const links = extractLinks(row, resolvedUrl);\n return normalizeSocialRows(providerId, profile, [{\n url: resolvedUrl,\n title: row.title,\n content: row.content,\n confidence: 0.7,\n attributes: {\n ...(row.attributes ?? {}),\n extractionQuality: qualityFlags({\n url: resolvedUrl,\n title: row.title,\n content: row.content,\n page: 0,\n hop: 0,\n expandedLinks: links.length\n })\n }\n }]);\n };\n\n const post = async (input: ProviderPostInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (input.content.length > profile.maxPostLength) {\n throw new ProviderRuntimeError(\"invalid_input\", `${profile.displayName} post exceeds max length`, {\n provider: providerId,\n source: SOCIAL_SOURCE,\n retryable: false,\n details: {\n maxPostLength: profile.maxPostLength,\n contentLength: input.content.length\n }\n });\n }\n\n const audit = await assertPostPolicy({\n providerId,\n source: SOCIAL_SOURCE,\n payload: input,\n trace: context.trace\n }, options.postPolicyHooks);\n\n if (!options.post) {\n throw new ProviderRuntimeError(\"unavailable\", `${profile.displayName} posting transport is not configured`, {\n provider: providerId,\n source: SOCIAL_SOURCE,\n retryable: false,\n reasonCode: \"policy_blocked\",\n details: {\n reasonCode: \"policy_blocked\",\n postingTransportConfigured: false\n }\n });\n }\n\n const row = await options.post(input, context);\n return normalizeSocialRows(providerId, profile, [{\n url: canonicalizeUrl(row.url ?? `${profile.baseUrl}/${encodeURIComponent(input.target)}`),\n title: row.title ?? `${profile.displayName} post`,\n content: row.content ?? input.content,\n confidence: 1,\n attributes: {\n ...(row.attributes ?? {}),\n auditHash: audit.payloadHash,\n decision: audit.decision\n }\n }]);\n };\n\n return {\n id: providerId,\n source: SOCIAL_SOURCE,\n search,\n fetch,\n post,\n health: async () => ({\n status: options.search || options.fetch || options.post ? \"healthy\" : \"degraded\",\n updatedAt: new Date().toISOString(),\n ...(options.search || options.fetch || options.post ? {} : { reason: \"Retrieval not configured\" })\n }),\n capabilities: () => capabilitiesForProfile(providerId, profile)\n };\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createBlueskyProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"bluesky\",\n displayName: \"Bluesky\",\n baseUrl: \"https://bsky.app\",\n maxPostLength: 300,\n supportsMedia: true,\n supportsThreads: true\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createFacebookProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"facebook\",\n displayName: \"Facebook\",\n baseUrl: \"https://www.facebook.com\",\n maxPostLength: 63206,\n supportsMedia: true,\n supportsThreads: false\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createInstagramProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"instagram\",\n displayName: \"Instagram\",\n baseUrl: \"https://www.instagram.com\",\n maxPostLength: 2200,\n supportsMedia: true,\n supportsThreads: false\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createLinkedInProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"linkedin\",\n displayName: \"LinkedIn\",\n baseUrl: \"https://www.linkedin.com\",\n maxPostLength: 3000,\n supportsMedia: true,\n supportsThreads: false\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createRedditProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"reddit\",\n displayName: \"Reddit\",\n baseUrl: \"https://www.reddit.com\",\n maxPostLength: 40000,\n supportsMedia: true,\n supportsThreads: true\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createThreadsProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"threads\",\n displayName: \"Threads\",\n baseUrl: \"https://www.threads.net\",\n maxPostLength: 500,\n supportsMedia: true,\n supportsThreads: true\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createTikTokProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"tiktok\",\n displayName: \"TikTok\",\n baseUrl: \"https://www.tiktok.com\",\n maxPostLength: 2200,\n supportsMedia: true,\n supportsThreads: false\n }, options);\n};\n","import { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\n\nexport const createXProvider = (options: SocialProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"x\",\n displayName: \"X\",\n baseUrl: \"https://x.com\",\n maxPostLength: 280,\n supportsMedia: true,\n supportsThreads: true\n }, options);\n};\n","const DEFAULT_PROVIDER_USER_AGENT = \"Mozilla/5.0 (Macintosh; Intel Mac OS X 13_6_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36\";\nconst DEFAULT_PROVIDER_ACCEPT_LANGUAGE = \"en-US,en;q=0.9\";\n\nconst normalizeHeaderValue = (value: string | undefined, fallback: string): string => {\n const trimmed = value?.trim();\n return trimmed && trimmed.length > 0 ? trimmed : fallback;\n};\n\nexport const providerRequestHeaders = {\n \"user-agent\": normalizeHeaderValue(process.env.OPDEVBROWSER_PROVIDER_USER_AGENT, DEFAULT_PROVIDER_USER_AGENT),\n \"accept-language\": normalizeHeaderValue(process.env.OPDEVBROWSER_PROVIDER_ACCEPT_LANGUAGE, DEFAULT_PROVIDER_ACCEPT_LANGUAGE)\n} as const;\n\n","import { execFile } from \"child_process\";\nimport { mkdtemp, readdir, rm } from \"fs/promises\";\nimport { tmpdir } from \"os\";\nimport * as path from \"path\";\nimport { promisify } from \"util\";\nimport { providerErrorCodeFromReasonCode } from \"../errors\";\nimport type {\n BrowserFallbackPort,\n JsonValue,\n ProviderContext,\n ProviderReasonCode\n} from \"../types\";\n\nconst execFileAsync = promisify(execFile);\n\nconst TRANSCRIPT_FETCH_HEADERS = {\n accept: \"application/xml,text/xml,text/vtt,*/*\"\n} as const;\n\nconst YOUTUBEI_HEADERS = {\n accept: \"application/json\",\n \"content-type\": \"application/json\"\n} as const;\n\nconst APIFY_HEADERS = {\n accept: \"application/json\",\n \"content-type\": \"application/json\"\n} as const;\n\ntype TranscriptPlannerStrategy = \"youtubei\" | \"native_caption_parse\" | \"ytdlp_audio_asr\" | \"apify\";\n\ntype LegacyTranscriptStrategy = \"ytdlp_subtitle\" | \"optional_asr\";\n\nexport type YouTubeTranscriptMode = \"auto\" | \"web\" | \"no-auto\" | \"yt-dlp\" | \"apify\";\n\nexport type YouTubeTranscriptModeInput = YouTubeTranscriptMode | \"ytdlp\";\n\nexport type YouTubeTranscriptStrategyDetail =\n | \"youtubei\"\n | \"native_caption_parse\"\n | \"ytdlp_audio_asr\"\n | \"apify\"\n | \"browser_assisted\";\n\nexport type YouTubeTranscriptStrategy = \"native_caption_parse\" | \"optional_asr\" | \"browser_assisted\";\n\nexport interface YouTubeTranscriptLegalChecklist {\n approvalExpiryDate: string;\n signedOff: boolean;\n approvedTranscriptStrategies: Array<\n | YouTubeTranscriptStrategyDetail\n | YouTubeTranscriptStrategy\n | LegacyTranscriptStrategy\n >;\n}\n\nexport interface YouTubeTranscriptResolverConfig {\n modeDefault: YouTubeTranscriptMode;\n strategyOrder: Array<TranscriptPlannerStrategy | LegacyTranscriptStrategy>;\n enableYtdlp: boolean;\n enableAsr: boolean;\n enableYtdlpAudioAsr: boolean;\n enableApify: boolean;\n apifyActorId: string;\n enableBrowserFallback: boolean;\n ytdlpTimeoutMs: number;\n}\n\nexport interface YouTubeTranscriptAttempt {\n strategy: YouTubeTranscriptStrategyDetail;\n ok: boolean;\n reasonCode?: ProviderReasonCode;\n message?: string;\n details?: Record<string, JsonValue>;\n}\n\nexport interface YouTubeTranscriptSuccess {\n ok: true;\n mode: YouTubeTranscriptMode;\n text: string;\n language: string;\n transcriptStrategy: YouTubeTranscriptStrategy;\n transcriptStrategyDetail: YouTubeTranscriptStrategyDetail;\n attemptChain: YouTubeTranscriptAttempt[];\n}\n\nexport interface YouTubeTranscriptFailure {\n ok: false;\n mode: YouTubeTranscriptMode;\n reasonCode: ProviderReasonCode;\n attemptChain: YouTubeTranscriptAttempt[];\n}\n\nexport type YouTubeTranscriptResolution = YouTubeTranscriptSuccess | YouTubeTranscriptFailure;\n\nexport interface YouTubeTranscriptResolverDependencies {\n context: ProviderContext;\n watchUrl: string;\n pageHtml: string;\n legalChecklist: YouTubeTranscriptLegalChecklist;\n config?: Partial<YouTubeTranscriptResolverConfig>;\n mode?: YouTubeTranscriptModeInput | null;\n browserFallbackPort?: BrowserFallbackPort;\n allowBrowserFallbackEscalation?: boolean;\n asrTranscribe?: (args: {\n watchUrl: string;\n context: ProviderContext;\n audioFilePath?: string;\n }) => Promise<{ text: string; language?: string } | null>;\n}\n\ntype TranscriptFailureResult = {\n ok: false;\n reasonCode: ProviderReasonCode;\n message: string;\n};\n\ntype TranscriptSuccessResult = {\n ok: true;\n text: string;\n language: string;\n};\n\ntype TranscriptFetchResponse = {\n ok: boolean;\n status: number;\n payload: string;\n};\n\ntype CaptionTrack = {\n baseUrl: string;\n languageCode: string;\n name: string;\n kind?: string;\n vssId?: string;\n};\n\ntype ApifyRunResponse = {\n data?: {\n defaultDatasetId?: string;\n };\n};\n\nconst DEFAULT_TRANSCRIPT_RESOLVER_CONFIG: YouTubeTranscriptResolverConfig = {\n modeDefault: \"auto\",\n strategyOrder: [\"youtubei\", \"native_caption_parse\", \"ytdlp_audio_asr\", \"apify\"],\n enableYtdlp: false,\n enableAsr: false,\n enableYtdlpAudioAsr: true,\n enableApify: true,\n apifyActorId: \"streamers/youtube-scraper\",\n enableBrowserFallback: true,\n ytdlpTimeoutMs: 10000\n};\n\nconst dedupeStrategyOrder = (\n order: Array<TranscriptPlannerStrategy | LegacyTranscriptStrategy>\n): Array<TranscriptPlannerStrategy | LegacyTranscriptStrategy> => {\n const seen = new Set<string>();\n const output: Array<TranscriptPlannerStrategy | LegacyTranscriptStrategy> = [];\n for (const strategy of order) {\n if (seen.has(strategy)) continue;\n seen.add(strategy);\n output.push(strategy);\n }\n return output;\n};\n\nconst mapLegacyModeAlias = (value: string): YouTubeTranscriptMode | null => {\n if (value === \"ytdlp\") return \"yt-dlp\";\n if (value === \"auto\" || value === \"web\" || value === \"no-auto\" || value === \"yt-dlp\" || value === \"apify\") {\n return value;\n }\n return null;\n};\n\nexport const normalizeYouTubeTranscriptMode = (\n value: unknown\n): YouTubeTranscriptMode | null => {\n if (typeof value !== \"string\") return null;\n return mapLegacyModeAlias(value.trim().toLowerCase());\n};\n\nconst resolveMode = (\n inputMode: YouTubeTranscriptModeInput | null | undefined,\n fallbackMode: YouTubeTranscriptMode\n): YouTubeTranscriptMode => {\n const normalizedInput = normalizeYouTubeTranscriptMode(inputMode);\n if (normalizedInput) return normalizedInput;\n return normalizeYouTubeTranscriptMode(fallbackMode) ?? \"auto\";\n};\n\nexport const resolveYouTubeTranscriptConfig = (\n config: Partial<YouTubeTranscriptResolverConfig> | undefined\n): YouTubeTranscriptResolverConfig => {\n const merged: YouTubeTranscriptResolverConfig = {\n ...DEFAULT_TRANSCRIPT_RESOLVER_CONFIG,\n ...(config ?? {})\n };\n const dedupedOrder = dedupeStrategyOrder(merged.strategyOrder);\n const normalizedModeDefault = normalizeYouTubeTranscriptMode(merged.modeDefault) ?? \"auto\";\n const enableYtdlpAudioAsr = merged.enableYtdlpAudioAsr || merged.enableYtdlp || merged.enableAsr;\n\n return {\n ...merged,\n modeDefault: normalizedModeDefault,\n strategyOrder: dedupedOrder.includes(\"native_caption_parse\")\n ? dedupedOrder\n : [\"native_caption_parse\", ...dedupedOrder],\n enableYtdlpAudioAsr,\n ytdlpTimeoutMs: Math.min(120000, Math.max(1000, Math.floor(merged.ytdlpTimeoutMs))),\n apifyActorId: merged.apifyActorId.trim() || DEFAULT_TRANSCRIPT_RESOLVER_CONFIG.apifyActorId\n };\n};\n\nconst decodeHtml = (value: string): string => {\n return value\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&#39;/g, \"'\")\n .replace(/&quot;/g, '\"')\n .replace(/\\s+/g, \" \")\n .trim();\n};\n\nconst normalizeEscapedValue = (value: string): string => {\n return value\n .replace(/\\\\u0026/g, \"&\")\n .replace(/\\\\\\//g, \"/\")\n .replace(/\\\\u003d/g, \"=\")\n .replace(/\\\\u002F/g, \"/\");\n};\n\nconst findBalancedSlice = (\n value: string,\n startIndex: number,\n openChar: string,\n closeChar: string\n): string | null => {\n let depth = 0;\n let inString = false;\n let escaping = false;\n for (let index = startIndex; index < value.length; index += 1) {\n const char = value[index];\n if (escaping) {\n escaping = false;\n continue;\n }\n if (char === \"\\\\\") {\n if (inString) escaping = true;\n continue;\n }\n if (char === '\"') {\n inString = !inString;\n continue;\n }\n if (inString) continue;\n\n if (char === openChar) {\n depth += 1;\n continue;\n }\n if (char === closeChar) {\n depth -= 1;\n if (depth === 0) {\n return value.slice(startIndex, index + 1);\n }\n }\n }\n return null;\n};\n\nconst findJsonSegmentAfter = (\n value: string,\n marker: string,\n openChar: \"{\" | \"[\",\n closeChar: \"}\" | \"]\"\n): string | null => {\n const markerIndex = value.indexOf(marker);\n if (markerIndex < 0) return null;\n const openIndex = value.indexOf(openChar, markerIndex + marker.length);\n if (openIndex < 0) return null;\n return findBalancedSlice(value, openIndex, openChar, closeChar);\n};\n\nconst parseJson = <T>(value: string | null): T | null => {\n if (!value) return null;\n try {\n return JSON.parse(value) as T;\n } catch {\n try {\n return JSON.parse(normalizeEscapedValue(value)) as T;\n } catch {\n return null;\n }\n }\n};\n\nconst trackNameFromValue = (value: unknown): string => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return \"\";\n const record = value as Record<string, unknown>;\n if (typeof record.simpleText === \"string\") return decodeHtml(record.simpleText);\n if (Array.isArray(record.runs)) {\n return record.runs\n .filter((run): run is { text: string } => Boolean(run && typeof run === \"object\" && !Array.isArray(run) && typeof (run as { text?: unknown }).text === \"string\"))\n .map((run) => decodeHtml(run.text))\n .join(\"\")\n .trim();\n }\n return \"\";\n};\n\nconst extractCaptionTracks = (html: string): CaptionTrack[] => {\n const block = findJsonSegmentAfter(html, '\"captionTracks\":', \"[\", \"]\");\n const parsed = parseJson<unknown[]>(block);\n if (!Array.isArray(parsed)) return [];\n\n const tracks: CaptionTrack[] = [];\n for (const candidate of parsed) {\n if (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) continue;\n const record = candidate as Record<string, unknown>;\n const rawBaseUrl = record.baseUrl;\n const rawLanguage = record.languageCode;\n if (typeof rawBaseUrl !== \"string\" || typeof rawLanguage !== \"string\") continue;\n tracks.push({\n baseUrl: normalizeEscapedValue(rawBaseUrl),\n languageCode: rawLanguage,\n name: trackNameFromValue(record.name),\n kind: typeof record.kind === \"string\" ? record.kind : undefined,\n vssId: typeof record.vssId === \"string\" ? record.vssId : undefined\n });\n }\n return tracks;\n};\n\nconst isAutomaticCaptionTrack = (track: CaptionTrack): boolean => {\n if (track.kind?.toLowerCase() === \"asr\") return true;\n if (track.vssId?.startsWith(\"a.\")) return true;\n if (/auto[- ]generated/i.test(track.name)) return true;\n return false;\n};\n\nconst isEnglishLike = (languageCode: string): boolean => {\n return languageCode.toLowerCase().startsWith(\"en\");\n};\n\nconst pickCaptionTrack = (tracks: CaptionTrack[], manualOnly: boolean): CaptionTrack | null => {\n const eligible = manualOnly\n ? tracks.filter((track) => !isAutomaticCaptionTrack(track))\n : tracks;\n if (eligible.length === 0) return null;\n\n const sorted = [...eligible].sort((left, right) => {\n const leftManual = isAutomaticCaptionTrack(left) ? 0 : 1;\n const rightManual = isAutomaticCaptionTrack(right) ? 0 : 1;\n if (leftManual !== rightManual) return rightManual - leftManual;\n\n const leftEnglish = isEnglishLike(left.languageCode) ? 1 : 0;\n const rightEnglish = isEnglishLike(right.languageCode) ? 1 : 0;\n if (leftEnglish !== rightEnglish) return rightEnglish - leftEnglish;\n\n return left.languageCode.localeCompare(right.languageCode);\n });\n\n return sorted[0] ?? null;\n};\n\nexport const findCaptionBaseUrl = (html: string): string | null => {\n const track = pickCaptionTrack(extractCaptionTracks(html), false);\n return track?.baseUrl ?? null;\n};\n\nexport const findTranscriptLanguage = (html: string): string => {\n const track = pickCaptionTrack(extractCaptionTracks(html), false);\n return track?.languageCode ?? \"unknown\";\n};\n\nconst parseTranscriptXml = (xml: string): string => {\n const chunks = [...xml.matchAll(/<text[^>]*>([\\s\\S]*?)<\\/text>/g)]\n .map((match) => decodeHtml(match[1] ?? \"\"))\n .filter(Boolean);\n return chunks.join(\"\\n\").trim();\n};\n\nconst parseTranscriptVtt = (vtt: string): string => {\n return vtt\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .filter((line) => !/^WEBVTT/i.test(line))\n .filter((line) => !/^\\d{1,2}:\\d{2}(?::\\d{2})?\\.\\d{3}\\s+-->\\s+\\d{1,2}:\\d{2}(?::\\d{2})?\\.\\d{3}/.test(line))\n .filter((line) => !/^\\d+$/.test(line))\n .join(\"\\n\")\n .trim();\n};\n\nconst parseTranscriptPayload = (payload: string): string => {\n if (payload.includes(\"<text\")) return parseTranscriptXml(payload);\n return parseTranscriptVtt(payload);\n};\n\nconst parseTranscriptJson3 = (payload: string): string => {\n const parsed = parseJson<Record<string, unknown>>(payload);\n if (!parsed) return \"\";\n const events = parsed.events;\n if (!Array.isArray(events)) return \"\";\n\n const lines = events\n .map((event) => {\n if (!event || typeof event !== \"object\" || Array.isArray(event)) return \"\";\n const segs = (event as Record<string, unknown>).segs;\n if (!Array.isArray(segs)) return \"\";\n const text = segs\n .map((segment) => {\n if (!segment || typeof segment !== \"object\" || Array.isArray(segment)) return \"\";\n const utf8 = (segment as Record<string, unknown>).utf8;\n return typeof utf8 === \"string\" ? decodeHtml(utf8) : \"\";\n })\n .join(\"\")\n .trim();\n return text;\n })\n .filter(Boolean);\n\n return lines.join(\"\\n\").trim();\n};\n\nconst toTranscriptFetchReasonCode = (status: number): ProviderReasonCode => {\n if (status === 401 || status === 403) return \"token_required\";\n if (status === 429) return \"rate_limited\";\n return \"transcript_unavailable\";\n};\n\nconst fetchTranscriptPayload = async (\n transcriptUrl: string,\n context: ProviderContext,\n acceptHeader: string\n): Promise<TranscriptFetchResponse> => {\n try {\n const response = await fetch(transcriptUrl, {\n headers: {\n ...TRANSCRIPT_FETCH_HEADERS,\n accept: acceptHeader\n },\n signal: context.signal,\n redirect: \"follow\"\n });\n return {\n ok: response.ok,\n status: response.status,\n payload: await response.text()\n };\n } catch {\n return {\n ok: false,\n status: 0,\n payload: \"\"\n };\n }\n};\n\nconst withQueryParam = (baseUrl: string, key: string, value: string): string => {\n try {\n const url = new URL(baseUrl);\n url.searchParams.set(key, value);\n return url.toString();\n } catch {\n return baseUrl;\n }\n};\n\nconst resolveNativeCaptionTranscript = async (args: {\n pageHtml: string;\n context: ProviderContext;\n manualOnly: boolean;\n}): Promise<TranscriptSuccessResult | TranscriptFailureResult> => {\n const tracks = extractCaptionTracks(args.pageHtml);\n const selectedTrack = pickCaptionTrack(tracks, args.manualOnly);\n if (!selectedTrack) {\n return {\n ok: false,\n reasonCode: \"caption_missing\",\n message: args.manualOnly\n ? \"No creator-provided caption track was found.\"\n : \"No caption track URL found in page payload.\"\n };\n }\n\n const json3Url = withQueryParam(selectedTrack.baseUrl, \"fmt\", \"json3\");\n const json3Response = await fetchTranscriptPayload(json3Url, args.context, \"application/json,text/plain,*/*\");\n if (json3Response.ok) {\n const json3Text = parseTranscriptJson3(json3Response.payload);\n if (json3Text) {\n return {\n ok: true,\n text: json3Text,\n language: selectedTrack.languageCode || \"unknown\"\n };\n }\n } else if (json3Response.status === 401 || json3Response.status === 403 || json3Response.status === 429) {\n return {\n ok: false,\n reasonCode: toTranscriptFetchReasonCode(json3Response.status),\n message: `Caption JSON3 endpoint returned HTTP ${json3Response.status}.`\n };\n }\n\n const fallbackResponse = await fetchTranscriptPayload(selectedTrack.baseUrl, args.context, TRANSCRIPT_FETCH_HEADERS.accept);\n if (!fallbackResponse.ok) {\n return {\n ok: false,\n reasonCode: toTranscriptFetchReasonCode(fallbackResponse.status),\n message: fallbackResponse.status > 0\n ? `Caption endpoint returned HTTP ${fallbackResponse.status}.`\n : \"Caption endpoint request failed.\"\n };\n }\n\n const text = parseTranscriptPayload(fallbackResponse.payload);\n if (!text) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"Caption endpoint returned no transcript payload.\"\n };\n }\n\n return {\n ok: true,\n text,\n language: selectedTrack.languageCode || \"unknown\"\n };\n};\n\nconst firstNonEmptyMatch = (value: string, patterns: RegExp[]): string | null => {\n for (const pattern of patterns) {\n const match = value.match(pattern)?.[1];\n if (match && match.trim().length > 0) {\n return decodeHtml(normalizeEscapedValue(match));\n }\n }\n return null;\n};\n\nconst extractYoutubeiContext = (html: string): Record<string, unknown> | null => {\n const fromObject = parseJson<Record<string, unknown>>(findJsonSegmentAfter(html, '\"INNERTUBE_CONTEXT\":', \"{\", \"}\"));\n if (fromObject) return fromObject;\n\n const clientName = firstNonEmptyMatch(html, [\n /\"INNERTUBE_CONTEXT_CLIENT_NAME\":\"([^\"]+)\"/,\n /\"clientName\":\"([^\"]+)\"/\n ]);\n const clientVersion = firstNonEmptyMatch(html, [\n /\"INNERTUBE_CONTEXT_CLIENT_VERSION\":\"([^\"]+)\"/,\n /\"clientVersion\":\"([^\"]+)\"/\n ]);\n\n if (!clientName || !clientVersion) return null;\n return {\n client: {\n clientName,\n clientVersion\n }\n };\n};\n\nconst extractYoutubeiTranscriptParams = (html: string): string | null => {\n return firstNonEmptyMatch(html, [\n /\"getTranscriptEndpoint\"\\s*:\\s*\\{\\s*\"params\"\\s*:\\s*\"([^\"]+)\"/,\n /\"params\"\\s*:\\s*\"([^\"]+)\"\\s*,\\s*\"commandMetadata\"\\s*:\\s*\\{\\s*\"webCommandMetadata\"\\s*:\\s*\\{\\s*\"apiUrl\"\\s*:\\s*\"\\\\\\/youtubei\\\\\\/v1\\\\\\/get_transcript\"/\n ]);\n};\n\nconst runTextFromRenderer = (value: unknown): string => {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return \"\";\n const record = value as Record<string, unknown>;\n if (typeof record.simpleText === \"string\") return decodeHtml(record.simpleText);\n if (!Array.isArray(record.runs)) return \"\";\n return record.runs\n .map((entry) => {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return \"\";\n const text = (entry as Record<string, unknown>).text;\n return typeof text === \"string\" ? decodeHtml(text) : \"\";\n })\n .join(\"\")\n .trim();\n};\n\nconst collectYoutubeiSegments = (payload: unknown): string[] => {\n const segments: string[] = [];\n const queue: unknown[] = [payload];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) continue;\n\n if (Array.isArray(current)) {\n for (const entry of current) {\n queue.push(entry);\n }\n continue;\n }\n\n if (typeof current !== \"object\") continue;\n const record = current as Record<string, unknown>;\n\n const renderer = record.transcriptSegmentRenderer;\n if (renderer && typeof renderer === \"object\" && !Array.isArray(renderer)) {\n const text = runTextFromRenderer((renderer as Record<string, unknown>).snippet);\n if (text) segments.push(text);\n }\n\n for (const value of Object.values(record)) {\n queue.push(value);\n }\n }\n\n return segments;\n};\n\nconst findLanguageInPayload = (payload: unknown): string | null => {\n const stack: unknown[] = [payload];\n while (stack.length > 0) {\n const current = stack.pop();\n if (!current) continue;\n if (Array.isArray(current)) {\n for (const entry of current) stack.push(entry);\n continue;\n }\n if (typeof current !== \"object\") continue;\n\n const record = current as Record<string, unknown>;\n const languageCode = record.languageCode;\n if (typeof languageCode === \"string\" && languageCode.trim().length > 0) {\n return languageCode;\n }\n\n for (const value of Object.values(record)) {\n stack.push(value);\n }\n }\n\n return null;\n};\n\nconst resolveYoutubeiTranscript = async (args: {\n pageHtml: string;\n context: ProviderContext;\n}): Promise<TranscriptSuccessResult | TranscriptFailureResult> => {\n const apiKey = firstNonEmptyMatch(args.pageHtml, [\n /\"INNERTUBE_API_KEY\"\\s*:\\s*\"([^\"]+)\"/,\n /\"innertubeApiKey\"\\s*:\\s*\"([^\"]+)\"/\n ]);\n const context = extractYoutubeiContext(args.pageHtml);\n const params = extractYoutubeiTranscriptParams(args.pageHtml);\n\n if (!apiKey || !context || !params) {\n return {\n ok: false,\n reasonCode: \"caption_missing\",\n message: \"youtubei transcript bootstrap payload is missing API key, context, or transcript params.\"\n };\n }\n\n let response: Response;\n try {\n response = await fetch(`https://www.youtube.com/youtubei/v1/get_transcript?key=${encodeURIComponent(apiKey)}`, {\n method: \"POST\",\n headers: YOUTUBEI_HEADERS,\n body: JSON.stringify({ context, params }),\n signal: args.context.signal\n });\n } catch {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"youtubei transcript endpoint request failed.\"\n };\n }\n\n if (!response.ok) {\n return {\n ok: false,\n reasonCode: toTranscriptFetchReasonCode(response.status),\n message: `youtubei transcript endpoint returned HTTP ${response.status}.`\n };\n }\n\n const payloadText = await response.text();\n const payload = parseJson<unknown>(payloadText);\n if (!payload) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"youtubei transcript endpoint returned malformed JSON.\"\n };\n }\n\n const segments = collectYoutubeiSegments(payload);\n if (segments.length === 0) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"youtubei transcript payload did not include transcript segments.\"\n };\n }\n\n return {\n ok: true,\n text: segments.join(\"\\n\").trim(),\n language: findLanguageInPayload(payload) ?? findTranscriptLanguage(args.pageHtml)\n };\n};\n\nconst normalizeErrorMessage = (error: unknown): string => {\n if (error instanceof Error) return error.message;\n return String(error);\n};\n\nconst toExecFailureReasonCode = (\n message: string,\n fallback: ProviderReasonCode\n): ProviderReasonCode => {\n if (/ENOENT|not found|spawn\\s+yt-dlp/i.test(message)) return \"env_limited\";\n if (/timeout|timed out|ETIMEDOUT/i.test(message)) return \"transcript_unavailable\";\n if (/429|rate\\s*limit/i.test(message)) return \"rate_limited\";\n if (/401|403|forbidden|unauthorized/i.test(message)) return \"token_required\";\n return fallback;\n};\n\nconst resolveYtdlpAudioAsrTranscript = async (args: {\n watchUrl: string;\n context: ProviderContext;\n timeoutMs: number;\n asrTranscribe: NonNullable<YouTubeTranscriptResolverDependencies[\"asrTranscribe\"]>;\n}): Promise<TranscriptSuccessResult | TranscriptFailureResult> => {\n const tempDir = await mkdtemp(path.join(tmpdir(), \"opendevbrowser-ytdlp-\"));\n try {\n const outputTemplate = path.join(tempDir, \"audio.%(ext)s\");\n await execFileAsync(\n \"yt-dlp\",\n [\n \"-x\",\n \"--audio-format\",\n \"mp3\",\n \"--no-playlist\",\n \"--no-warnings\",\n \"-o\",\n outputTemplate,\n args.watchUrl\n ],\n {\n timeout: args.timeoutMs,\n maxBuffer: 8 * 1024 * 1024\n }\n );\n\n const files = await readdir(tempDir);\n const audioFile = files\n .filter((file) => /\\.(mp3|m4a|wav|opus|ogg)$/i.test(file))\n .sort()[0];\n if (!audioFile) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"yt-dlp audio download did not produce an audio file.\"\n };\n }\n\n const transcript = await args.asrTranscribe({\n watchUrl: args.watchUrl,\n context: args.context,\n audioFilePath: path.join(tempDir, audioFile)\n });\n\n if (!transcript?.text.trim()) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"ASR returned an empty transcript.\"\n };\n }\n\n return {\n ok: true,\n text: transcript.text,\n language: transcript.language ?? \"unknown\"\n };\n } catch (error) {\n const message = normalizeErrorMessage(error);\n return {\n ok: false,\n reasonCode: toExecFailureReasonCode(message, \"transcript_unavailable\"),\n message\n };\n } finally {\n await rm(tempDir, { recursive: true, force: true }).catch(() => {\n // Best-effort temp cleanup.\n });\n }\n};\n\nconst readApifyTextCandidate = (value: unknown): string => {\n if (typeof value === \"string\") return value.trim();\n if (Array.isArray(value)) {\n const joined = value\n .map((entry) => {\n if (typeof entry === \"string\") return entry;\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) return \"\";\n const text = (entry as Record<string, unknown>).text;\n return typeof text === \"string\" ? text : \"\";\n })\n .filter(Boolean)\n .join(\"\\n\")\n .trim();\n return joined;\n }\n return \"\";\n};\n\nconst resolveApifyTranscriptFromItems = (items: unknown): { text: string; language: string } | null => {\n if (!Array.isArray(items)) return null;\n const transcriptKeys = [\"transcript\", \"captions\", \"subtitles\", \"text\"];\n\n for (const item of items) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const record = item as Record<string, unknown>;\n\n for (const key of transcriptKeys) {\n const value = readApifyTextCandidate(record[key]);\n if (!value) continue;\n const language = typeof record.languageCode === \"string\"\n ? record.languageCode\n : typeof record.language === \"string\"\n ? record.language\n : \"unknown\";\n return {\n text: value,\n language\n };\n }\n }\n\n return null;\n};\n\nconst resolveApifyTranscript = async (args: {\n watchUrl: string;\n context: ProviderContext;\n actorId: string;\n token: string;\n}): Promise<TranscriptSuccessResult | TranscriptFailureResult> => {\n const encodedActorId = encodeURIComponent(args.actorId);\n const runUrl = `https://api.apify.com/v2/acts/${encodedActorId}/runs?token=${encodeURIComponent(args.token)}&waitForFinish=120`;\n\n let runResponse: Response;\n try {\n runResponse = await fetch(runUrl, {\n method: \"POST\",\n headers: APIFY_HEADERS,\n signal: args.context.signal,\n body: JSON.stringify({\n startUrls: [{ url: args.watchUrl }]\n })\n });\n } catch {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"Apify actor request failed.\"\n };\n }\n\n if (!runResponse.ok) {\n return {\n ok: false,\n reasonCode: toTranscriptFetchReasonCode(runResponse.status),\n message: `Apify actor request returned HTTP ${runResponse.status}.`\n };\n }\n\n const runPayload = parseJson<ApifyRunResponse>(await runResponse.text());\n const datasetId = runPayload?.data?.defaultDatasetId;\n if (!datasetId) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"Apify actor response did not include a dataset id.\"\n };\n }\n\n const datasetUrl = `https://api.apify.com/v2/datasets/${encodeURIComponent(datasetId)}/items?token=${encodeURIComponent(args.token)}&clean=true&format=json`;\n\n let datasetResponse: Response;\n try {\n datasetResponse = await fetch(datasetUrl, {\n headers: {\n accept: \"application/json\"\n },\n signal: args.context.signal\n });\n } catch {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"Apify dataset request failed.\"\n };\n }\n\n if (!datasetResponse.ok) {\n return {\n ok: false,\n reasonCode: toTranscriptFetchReasonCode(datasetResponse.status),\n message: `Apify dataset request returned HTTP ${datasetResponse.status}.`\n };\n }\n\n const transcript = resolveApifyTranscriptFromItems(parseJson<unknown>(await datasetResponse.text()));\n if (!transcript) {\n return {\n ok: false,\n reasonCode: \"transcript_unavailable\",\n message: \"Apify dataset did not include transcript text.\"\n };\n }\n\n return {\n ok: true,\n text: transcript.text,\n language: transcript.language\n };\n};\n\nconst isStrategyApproved = (\n checklist: YouTubeTranscriptLegalChecklist,\n strategy: YouTubeTranscriptStrategyDetail\n): boolean => {\n const expiry = Date.parse(checklist.approvalExpiryDate);\n if (!checklist.signedOff || Number.isNaN(expiry) || expiry <= Date.now()) {\n return false;\n }\n\n if (strategy === \"ytdlp_audio_asr\") {\n return checklist.approvedTranscriptStrategies.includes(\"ytdlp_audio_asr\")\n || checklist.approvedTranscriptStrategies.includes(\"optional_asr\")\n || checklist.approvedTranscriptStrategies.includes(\"ytdlp_subtitle\");\n }\n\n return checklist.approvedTranscriptStrategies.includes(strategy);\n};\n\nconst modeBaseStrategies = (mode: YouTubeTranscriptMode): TranscriptPlannerStrategy[] => {\n switch (mode) {\n case \"auto\":\n return [\"youtubei\", \"native_caption_parse\", \"ytdlp_audio_asr\", \"apify\"];\n case \"web\":\n return [\"youtubei\", \"native_caption_parse\"];\n case \"no-auto\":\n return [\"native_caption_parse\", \"ytdlp_audio_asr\"];\n case \"yt-dlp\":\n return [\"ytdlp_audio_asr\"];\n case \"apify\":\n return [\"apify\"];\n }\n};\n\nconst mapStrategyOrderEntry = (\n strategy: TranscriptPlannerStrategy | LegacyTranscriptStrategy\n): TranscriptPlannerStrategy[] => {\n if (strategy === \"youtubei\" || strategy === \"native_caption_parse\" || strategy === \"ytdlp_audio_asr\" || strategy === \"apify\") {\n return [strategy];\n }\n if (strategy === \"ytdlp_subtitle\") {\n return [\"ytdlp_audio_asr\"];\n }\n return [\"ytdlp_audio_asr\", \"apify\"];\n};\n\nconst planStrategies = (\n mode: YouTubeTranscriptMode,\n strategyOrder: Array<TranscriptPlannerStrategy | LegacyTranscriptStrategy>\n): TranscriptPlannerStrategy[] => {\n const base = modeBaseStrategies(mode);\n const allowed = new Set(base);\n const ordered: TranscriptPlannerStrategy[] = [];\n\n for (const entry of strategyOrder) {\n for (const mapped of mapStrategyOrderEntry(entry)) {\n if (!allowed.has(mapped) || ordered.includes(mapped)) continue;\n ordered.push(mapped);\n }\n }\n\n for (const fallback of base) {\n if (ordered.includes(fallback)) continue;\n ordered.push(fallback);\n }\n\n return ordered;\n};\n\nconst mapDetailToBucket = (detail: YouTubeTranscriptStrategyDetail): YouTubeTranscriptStrategy => {\n switch (detail) {\n case \"youtubei\":\n case \"native_caption_parse\":\n return \"native_caption_parse\";\n case \"ytdlp_audio_asr\":\n case \"apify\":\n return \"optional_asr\";\n case \"browser_assisted\":\n return \"browser_assisted\";\n }\n};\n\nconst createFailure = (\n mode: YouTubeTranscriptMode,\n reasonCode: ProviderReasonCode,\n attemptChain: YouTubeTranscriptAttempt[]\n): YouTubeTranscriptFailure => ({\n ok: false,\n mode,\n reasonCode,\n attemptChain\n});\n\nconst createAttempt = (\n strategy: YouTubeTranscriptStrategyDetail,\n reasonCode: ProviderReasonCode,\n message: string,\n details?: Record<string, JsonValue>\n): YouTubeTranscriptAttempt => ({\n strategy,\n ok: false,\n reasonCode,\n message,\n ...(details ? { details } : {})\n});\n\nconst isForcedMode = (mode: YouTubeTranscriptMode): boolean => {\n return mode === \"yt-dlp\" || mode === \"apify\";\n};\n\nconst isYtdlpSubtitleAliasConfigured = (\n config: YouTubeTranscriptResolverConfig\n): boolean => config.strategyOrder.includes(\"ytdlp_subtitle\");\n\nconst resolveApifyToken = (): string | null => {\n const token = process.env.APIFY_TOKEN ?? process.env.APIFY_API_TOKEN;\n if (!token || !token.trim()) return null;\n return token.trim();\n};\n\nconst precheckStrategyAvailability = (args: {\n strategy: TranscriptPlannerStrategy;\n config: YouTubeTranscriptResolverConfig;\n hasAsrTranscriber: boolean;\n apifyToken: string | null;\n}): TranscriptFailureResult | null => {\n if (args.strategy === \"youtubei\") {\n return null;\n }\n\n if (args.strategy === \"ytdlp_audio_asr\") {\n if (!args.config.enableYtdlpAudioAsr) {\n return {\n ok: false,\n reasonCode: \"env_limited\",\n message: \"yt-dlp audio ASR strategy is disabled by configuration.\"\n };\n }\n if (!args.hasAsrTranscriber) {\n return {\n ok: false,\n reasonCode: \"env_limited\",\n message: \"ASR engine is not configured.\"\n };\n }\n return null;\n }\n\n if (args.strategy === \"apify\") {\n if (!args.config.enableApify) {\n return {\n ok: false,\n reasonCode: \"env_limited\",\n message: \"Apify strategy is disabled by configuration.\"\n };\n }\n if (!args.apifyToken) {\n return {\n ok: false,\n reasonCode: \"token_required\",\n message: \"APIFY_TOKEN is required to use the Apify transcript strategy.\"\n };\n }\n return null;\n }\n\n return null;\n};\n\nconst withLegacyYtdlpAliasNote = (\n message: string,\n config: YouTubeTranscriptResolverConfig\n): string => {\n if (!isYtdlpSubtitleAliasConfigured(config)) return message;\n return `${message} (legacy ytdlp_subtitle alias mapped to ytdlp_audio_asr)`;\n};\n\nconst isDeferredFallbackReason = (reasonCode: ProviderReasonCode): boolean => {\n return reasonCode === \"env_limited\" || reasonCode === \"token_required\";\n};\n\nconst resolveStrategyFailureReason = (\n fallback: ProviderReasonCode,\n attempts: YouTubeTranscriptAttempt[]\n): ProviderReasonCode => {\n for (let index = attempts.length - 1; index >= 0; index -= 1) {\n const reasonCode = attempts[index]?.reasonCode;\n if (!reasonCode) continue;\n if (!isDeferredFallbackReason(reasonCode)) {\n return reasonCode;\n }\n }\n for (let index = attempts.length - 1; index >= 0; index -= 1) {\n const reasonCode = attempts[index]?.reasonCode;\n if (!reasonCode || reasonCode === \"env_limited\") continue;\n return reasonCode;\n }\n return attempts.at(-1)?.reasonCode ?? fallback;\n};\n\nexport const resolveYouTubeTranscript = async (\n deps: YouTubeTranscriptResolverDependencies\n): Promise<YouTubeTranscriptResolution> => {\n const config = resolveYouTubeTranscriptConfig(deps.config);\n const mode = resolveMode(deps.mode, config.modeDefault);\n const forcedMode = isForcedMode(mode);\n const attemptChain: YouTubeTranscriptAttempt[] = [];\n const planned = planStrategies(mode, config.strategyOrder);\n const apifyToken = resolveApifyToken();\n\n for (const strategy of planned) {\n const availability = precheckStrategyAvailability({\n strategy,\n config,\n hasAsrTranscriber: Boolean(deps.asrTranscribe),\n apifyToken\n });\n\n if (availability) {\n const message = strategy === \"ytdlp_audio_asr\"\n ? withLegacyYtdlpAliasNote(availability.message, config)\n : availability.message;\n attemptChain.push(createAttempt(strategy, availability.reasonCode, message));\n if (forcedMode) {\n return createFailure(mode, availability.reasonCode, attemptChain);\n }\n continue;\n }\n\n if (!isStrategyApproved(deps.legalChecklist, strategy)) {\n const message = `Legal gate blocked transcript strategy: ${strategy}`;\n attemptChain.push(createAttempt(strategy, \"strategy_unapproved\", message));\n if (forcedMode) {\n return createFailure(mode, \"strategy_unapproved\", attemptChain);\n }\n continue;\n }\n\n if (strategy === \"youtubei\") {\n const resolved = await resolveYoutubeiTranscript({\n pageHtml: deps.pageHtml,\n context: deps.context\n });\n\n if (!resolved.ok) {\n attemptChain.push(createAttempt(strategy, resolved.reasonCode, resolved.message));\n continue;\n }\n\n attemptChain.push({ strategy, ok: true });\n return {\n ok: true,\n mode,\n text: resolved.text,\n language: resolved.language,\n transcriptStrategy: mapDetailToBucket(strategy),\n transcriptStrategyDetail: strategy,\n attemptChain\n };\n }\n\n if (strategy === \"native_caption_parse\") {\n const resolved = await resolveNativeCaptionTranscript({\n pageHtml: deps.pageHtml,\n context: deps.context,\n manualOnly: mode === \"no-auto\"\n });\n\n if (!resolved.ok) {\n attemptChain.push(createAttempt(strategy, resolved.reasonCode, resolved.message));\n continue;\n }\n\n attemptChain.push({ strategy, ok: true });\n return {\n ok: true,\n mode,\n text: resolved.text,\n language: resolved.language,\n transcriptStrategy: mapDetailToBucket(strategy),\n transcriptStrategyDetail: strategy,\n attemptChain\n };\n }\n\n if (strategy === \"ytdlp_audio_asr\") {\n const asrTranscribe = deps.asrTranscribe as NonNullable<YouTubeTranscriptResolverDependencies[\"asrTranscribe\"]>;\n\n const resolved = await resolveYtdlpAudioAsrTranscript({\n watchUrl: deps.watchUrl,\n context: deps.context,\n timeoutMs: config.ytdlpTimeoutMs,\n asrTranscribe\n });\n\n if (!resolved.ok) {\n const message = withLegacyYtdlpAliasNote(resolved.message, config);\n attemptChain.push(createAttempt(strategy, resolved.reasonCode, message));\n continue;\n }\n\n const successMessage = isYtdlpSubtitleAliasConfigured(config)\n ? \"legacy ytdlp_subtitle alias mapped to ytdlp_audio_asr\"\n : undefined;\n attemptChain.push({\n strategy,\n ok: true,\n ...(successMessage ? { message: successMessage } : {})\n });\n return {\n ok: true,\n mode,\n text: resolved.text,\n language: resolved.language,\n transcriptStrategy: mapDetailToBucket(strategy),\n transcriptStrategyDetail: strategy,\n attemptChain\n };\n }\n\n if (strategy === \"apify\") {\n const ensuredApifyToken = apifyToken as string;\n\n const resolved = await resolveApifyTranscript({\n watchUrl: deps.watchUrl,\n context: deps.context,\n actorId: config.apifyActorId,\n token: ensuredApifyToken\n });\n\n if (!resolved.ok) {\n attemptChain.push(createAttempt(strategy, resolved.reasonCode, resolved.message));\n continue;\n }\n\n attemptChain.push({ strategy, ok: true });\n return {\n ok: true,\n mode,\n text: resolved.text,\n language: resolved.language,\n transcriptStrategy: mapDetailToBucket(strategy),\n transcriptStrategyDetail: strategy,\n attemptChain\n };\n }\n }\n\n if (\n !forcedMode\n && config.enableBrowserFallback\n && deps.browserFallbackPort\n && deps.allowBrowserFallbackEscalation\n ) {\n const fallback = await deps.browserFallbackPort.resolve({\n provider: \"social/youtube\",\n source: \"social\",\n operation: \"fetch\",\n reasonCode: \"transcript_unavailable\",\n trace: deps.context.trace,\n url: deps.watchUrl,\n preferredModes: [\"extension\", \"managed_headed\"],\n ...(typeof deps.context.useCookies === \"boolean\"\n ? { useCookies: deps.context.useCookies }\n : {}),\n ...(deps.context.cookiePolicyOverride\n ? { cookiePolicyOverride: deps.context.cookiePolicyOverride }\n : {}),\n details: {\n request: \"youtube_transcript\"\n }\n });\n\n if (!fallback.ok) {\n const fallbackDiagnostics = (\n fallback.details?.cookieDiagnostics\n && typeof fallback.details.cookieDiagnostics === \"object\"\n && !Array.isArray(fallback.details.cookieDiagnostics)\n )\n ? { cookieDiagnostics: fallback.details.cookieDiagnostics as Record<string, JsonValue> }\n : undefined;\n attemptChain.push({\n strategy: \"browser_assisted\",\n ok: false,\n reasonCode: fallback.reasonCode,\n message: typeof fallback.details?.message === \"string\" ? fallback.details.message : \"Browser fallback failed.\",\n ...(fallbackDiagnostics ? { details: fallbackDiagnostics } : {})\n });\n return createFailure(mode, fallback.reasonCode, attemptChain);\n }\n\n const html = fallback.output?.html;\n if (typeof html !== \"string\" || html.trim().length === 0) {\n attemptChain.push(createAttempt(\"browser_assisted\", \"env_limited\", \"Browser fallback did not return page HTML.\"));\n return createFailure(mode, \"env_limited\", attemptChain);\n }\n\n const nativeResolved = await resolveNativeCaptionTranscript({\n pageHtml: html,\n context: deps.context,\n manualOnly: mode === \"no-auto\"\n });\n\n if (!nativeResolved.ok) {\n attemptChain.push(createAttempt(\"browser_assisted\", nativeResolved.reasonCode, nativeResolved.message));\n return createFailure(mode, nativeResolved.reasonCode, attemptChain);\n }\n\n attemptChain.push({ strategy: \"browser_assisted\", ok: true });\n return {\n ok: true,\n mode,\n text: nativeResolved.text,\n language: nativeResolved.language,\n transcriptStrategy: \"browser_assisted\",\n transcriptStrategyDetail: \"browser_assisted\",\n attemptChain\n };\n }\n\n return createFailure(\n mode,\n resolveStrategyFailureReason(\"transcript_unavailable\", attemptChain),\n attemptChain\n );\n};\n\nexport const asTranscriptProviderError = (\n message: string,\n reasonCode: ProviderReasonCode\n): {\n code: ReturnType<typeof providerErrorCodeFromReasonCode>;\n message: string;\n reasonCode: ProviderReasonCode;\n details: Record<string, JsonValue>;\n} => ({\n code: providerErrorCodeFromReasonCode(reasonCode),\n message,\n reasonCode,\n details: {\n reasonCode\n }\n});\n","import { ProviderRuntimeError, providerErrorCodeFromReasonCode } from \"../errors\";\nimport type { AntiBotPolicyConfig } from \"../shared/anti-bot-policy\";\nimport { providerRequestHeaders } from \"../shared/request-headers\";\nimport { createSocialPlatformProvider, type SocialProviderOptions } from \"./platform\";\nimport {\n normalizeYouTubeTranscriptMode,\n resolveYouTubeTranscript,\n resolveYouTubeTranscriptConfig,\n type YouTubeTranscriptLegalChecklist,\n type YouTubeTranscriptMode,\n type YouTubeTranscriptResolverConfig,\n type YouTubeTranscriptStrategy\n} from \"./youtube-resolver\";\nimport { extractStructuredContent, toSnippet } from \"../web/extract\";\nimport type {\n BrowserFallbackPort,\n JsonValue,\n ProviderContext,\n ProviderFetchInput,\n ProviderSearchInput\n} from \"../types\";\n\nconst YOUTUBE_HEADERS = {\n accept: \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n ...providerRequestHeaders\n} as const;\n\nexport interface YouTubeLegalReviewChecklist extends YouTubeTranscriptLegalChecklist {\n providerId: \"social/youtube\";\n termsReviewDate: string;\n allowedExtractionSurfaces: string[];\n prohibitedFlows: string[];\n reviewer: string;\n}\n\nexport type YouTubeLegalReviewReasonCode =\n | \"missing_terms_review_date\"\n | \"invalid_terms_review_date\"\n | \"missing_allowed_surfaces\"\n | \"missing_prohibited_flows\"\n | \"missing_reviewer\"\n | \"missing_approval_expiry\"\n | \"invalid_approval_expiry\"\n | \"approval_expired\"\n | \"not_signed_off\"\n | \"missing_approved_transcript_strategies\";\n\nexport interface YouTubeProviderOptions extends SocialProviderOptions {\n transcriptResolver?: Partial<YouTubeTranscriptResolverConfig>;\n browserFallbackPort?: BrowserFallbackPort;\n antiBotPolicy?: Partial<AntiBotPolicyConfig>;\n asrTranscribe?: (args: {\n watchUrl: string;\n context: ProviderContext;\n audioFilePath?: string;\n }) => Promise<{ text: string; language?: string } | null>;\n}\n\nexport const YOUTUBE_LEGAL_REVIEW_CHECKLIST: YouTubeLegalReviewChecklist = {\n providerId: \"social/youtube\",\n termsReviewDate: \"2026-02-16\",\n allowedExtractionSurfaces: [\n \"public search pages\",\n \"public watch pages\",\n \"public transcript/subtitle endpoints\"\n ],\n prohibitedFlows: [\n \"account pages\",\n \"authenticated user inbox/subscriptions APIs\",\n \"paid membership purchase flows\"\n ],\n reviewer: \"opendevbrowser-compliance\",\n approvalExpiryDate: \"2030-12-31T00:00:00.000Z\",\n signedOff: true,\n approvedTranscriptStrategies: [\n \"youtubei\",\n \"native_caption_parse\",\n \"ytdlp_audio_asr\",\n \"apify\",\n \"browser_assisted\"\n ]\n};\n\nconst hasValues = (values: string[]): boolean => values.some((value) => value.trim().length > 0);\n\nconst parseIsoDate = (value: string): number => {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? NaN : parsed;\n};\n\nexport const validateYouTubeLegalReviewChecklist = (\n now: Date = new Date()\n): { valid: boolean; reasonCode?: YouTubeLegalReviewReasonCode } => {\n const checklist = YOUTUBE_LEGAL_REVIEW_CHECKLIST;\n if (!checklist.termsReviewDate.trim()) return { valid: false, reasonCode: \"missing_terms_review_date\" };\n if (Number.isNaN(parseIsoDate(checklist.termsReviewDate))) return { valid: false, reasonCode: \"invalid_terms_review_date\" };\n if (!hasValues(checklist.allowedExtractionSurfaces)) return { valid: false, reasonCode: \"missing_allowed_surfaces\" };\n if (!hasValues(checklist.prohibitedFlows)) return { valid: false, reasonCode: \"missing_prohibited_flows\" };\n if (!checklist.reviewer.trim()) return { valid: false, reasonCode: \"missing_reviewer\" };\n if (!checklist.approvalExpiryDate.trim()) return { valid: false, reasonCode: \"missing_approval_expiry\" };\n if (!hasValues(checklist.approvedTranscriptStrategies)) return { valid: false, reasonCode: \"missing_approved_transcript_strategies\" };\n\n const expiry = parseIsoDate(checklist.approvalExpiryDate);\n if (Number.isNaN(expiry)) return { valid: false, reasonCode: \"invalid_approval_expiry\" };\n if (expiry <= now.getTime()) return { valid: false, reasonCode: \"approval_expired\" };\n if (!checklist.signedOff) return { valid: false, reasonCode: \"not_signed_off\" };\n return { valid: true };\n};\n\nconst assertYouTubeLegalReviewChecklist = (): void => {\n const validation = validateYouTubeLegalReviewChecklist();\n if (validation.valid) return;\n\n throw new ProviderRuntimeError(\"policy_blocked\", \"social/youtube legal review checklist is invalid or expired\", {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: false,\n reasonCode: \"policy_blocked\",\n details: {\n reasonCode: validation.reasonCode as YouTubeLegalReviewReasonCode,\n policyReasonCode: \"policy_blocked\",\n approvalExpiryDate: YOUTUBE_LEGAL_REVIEW_CHECKLIST.approvalExpiryDate\n }\n });\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst decodeHtml = (value: string): string => {\n return value\n .replace(/&amp;/g, \"&\")\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&#39;/g, \"'\")\n .replace(/&quot;/g, '\"')\n .replace(/\\s+/g, \" \")\n .trim();\n};\n\nconst normalizeEscapedValue = (value: string): string => {\n return value\n .replace(/\\\\u0026/g, \"&\")\n .replace(/\\\\\\//g, \"/\")\n .replace(/\\\\u003d/g, \"=\")\n .replace(/\\\\u002F/g, \"/\");\n};\n\nconst parseVideoId = (url: string): string | null => {\n try {\n const parsed = new URL(url);\n if (parsed.hostname === \"youtu.be\") {\n const id = parsed.pathname.replace(/^\\//, \"\").trim();\n return id || null;\n }\n const queryId = parsed.searchParams.get(\"v\");\n if (queryId) return queryId;\n const shortsMatch = parsed.pathname.match(/\\/shorts\\/([^/?#]+)/);\n return shortsMatch?.[1] ?? null;\n } catch {\n return null;\n }\n};\n\nconst firstNonEmptyMatch = (html: string, patterns: RegExp[]): string | null => {\n for (const pattern of patterns) {\n const match = html.match(pattern)?.[1];\n if (match && match.trim()) {\n return decodeHtml(normalizeEscapedValue(match));\n }\n }\n return null;\n};\n\nconst toIsoIfValid = (value: string | null): string | null => {\n if (!value) return null;\n const timestamp = Date.parse(value);\n if (Number.isNaN(timestamp)) return null;\n return new Date(timestamp).toISOString();\n};\n\nconst parseInteger = (value: string | null): number | null => {\n if (!value) return null;\n const normalized = value.replace(/[^\\d]/g, \"\");\n if (!normalized) return null;\n const parsed = Number(normalized);\n return Number.isFinite(parsed) ? parsed : null;\n};\n\nconst findChannel = (html: string): string | null => {\n return firstNonEmptyMatch(html, [\n /\"ownerChannelName\":\"([^\"]+)\"/,\n /\"channelName\":\"([^\"]+)\"/,\n /\"shortBylineText\":\\{\"runs\":\\[\\{\"text\":\"([^\"]+)\"/,\n /itemprop=\"author\"\\s+content=\"([^\"]+)\"/\n ]);\n};\n\nconst findPublishedAt = (html: string): string | null => {\n const rawDate = firstNonEmptyMatch(html, [\n /\"publishDate\":\"([^\"]+)\"/,\n /\"uploadDate\":\"([^\"]+)\"/,\n /itemprop=\"datePublished\"\\s+content=\"([^\"]+)\"/\n ]);\n return toIsoIfValid(rawDate);\n};\n\nconst findViews = (html: string, extractedText: string): number | null => {\n const viewCount = firstNonEmptyMatch(html, [\n /\"viewCount\":\"([^\"]+)\"/,\n /\"viewCountText\":\\{\"simpleText\":\"([^\"]+)\"/\n ]);\n const parsedFromHtml = parseInteger(viewCount);\n if (parsedFromHtml !== null) return parsedFromHtml;\n\n const parsedFromText = parseInteger(extractedText.match(/([0-9][0-9,]*)\\s+views/i)?.[1] ?? null);\n return parsedFromText;\n};\n\nconst summarizeTranscript = (transcript: string): string => {\n if (!transcript) return \"\";\n const lines = transcript\n .split(/\\n+/)\n .map((line) => line.trim())\n .filter(Boolean);\n return lines.slice(0, 8).join(\" \").slice(0, 800);\n};\n\nconst fetchPage = async (url: string, context: ProviderContext): Promise<{ status: number; url: string; html: string }> => {\n let response: Response;\n try {\n response = await fetch(url, {\n headers: YOUTUBE_HEADERS,\n signal: context.signal,\n redirect: \"follow\"\n });\n } catch (error) {\n throw new ProviderRuntimeError(\"network\", `Failed to retrieve ${url}`, {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: true,\n cause: error\n });\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new ProviderRuntimeError(\"auth\", `Authentication required for ${url}`, {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: false,\n reasonCode: \"token_required\",\n details: { status: response.status, url, reasonCode: \"token_required\" }\n });\n }\n if (response.status === 429) {\n throw new ProviderRuntimeError(\"rate_limited\", `Rate limited while retrieving ${url}`, {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: true,\n reasonCode: \"rate_limited\",\n details: { status: response.status, url, reasonCode: \"rate_limited\" }\n });\n }\n if (response.status >= 400) {\n throw new ProviderRuntimeError(\"unavailable\", `Retrieval failed for ${url}`, {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: response.status >= 500,\n reasonCode: response.status >= 500 ? \"ip_blocked\" : \"transcript_unavailable\",\n details: {\n status: response.status,\n url,\n reasonCode: response.status >= 500 ? \"ip_blocked\" : \"transcript_unavailable\"\n }\n });\n }\n\n return {\n status: response.status,\n url: response.url || url,\n html: await response.text()\n };\n};\n\nconst parseBooleanFilter = (value: unknown, fallback = false): boolean => {\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n }\n return fallback;\n};\n\nconst parseYouTubeModeFilter = (value: unknown): YouTubeTranscriptMode | null => {\n return normalizeYouTubeTranscriptMode(value);\n};\n\nconst toJsonRecord = (value: Record<string, unknown>): Record<string, JsonValue> => {\n return JSON.parse(JSON.stringify(value)) as Record<string, JsonValue>;\n};\n\nconst toAttemptChainJson = (attempts: Array<{\n strategy: string;\n ok: boolean;\n reasonCode?: string;\n message?: string;\n details?: Record<string, unknown>;\n}>): Array<Record<string, JsonValue>> => {\n return attempts.map((attempt) => ({\n strategy: attempt.strategy,\n ok: attempt.ok,\n ...(attempt.reasonCode ? { reasonCode: attempt.reasonCode } : {}),\n ...(attempt.message ? { message: attempt.message } : {}),\n ...(attempt.details ? toJsonRecord(attempt.details) : {})\n }));\n};\n\nconst resolveTranscriptStrategyDetail = (\n transcript: Awaited<ReturnType<typeof resolveYouTubeTranscript>>\n): string | undefined => {\n if (transcript.ok) {\n return transcript.transcriptStrategyDetail;\n }\n for (let index = transcript.attemptChain.length - 1; index >= 0; index -= 1) {\n const attempt = transcript.attemptChain[index];\n if (!attempt?.reasonCode) continue;\n if (attempt.reasonCode !== \"env_limited\" && attempt.reasonCode !== \"token_required\") {\n return attempt.strategy;\n }\n }\n for (let index = transcript.attemptChain.length - 1; index >= 0; index -= 1) {\n const attempt = transcript.attemptChain[index];\n if (!attempt?.reasonCode || attempt.reasonCode === \"env_limited\") continue;\n return attempt.strategy;\n }\n return transcript.attemptChain.at(-1)?.strategy;\n};\n\nconst buildSearch = (options: YouTubeProviderOptions[\"search\"]) => {\n if (options) return options;\n return async (input: ProviderSearchInput, context: ProviderContext) => {\n assertYouTubeLegalReviewChecklist();\n const query = input.query.trim();\n if (!query) {\n throw new ProviderRuntimeError(\"invalid_input\", \"YouTube search query is required\", {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: false\n });\n }\n\n const lookupUrl = isHttpUrl(query)\n ? query\n : `https://www.youtube.com/results?search_query=${encodeURIComponent(query)}`;\n const page = await fetchPage(lookupUrl, context);\n const extracted = extractStructuredContent(page.html, page.url);\n const firstVideoId = page.html.match(/\"videoId\":\"([a-zA-Z0-9_-]{11})\"/)?.[1] ?? null;\n const watchUrl = firstVideoId ? `https://www.youtube.com/watch?v=${firstVideoId}` : page.url;\n\n return [{\n url: watchUrl,\n title: toSnippet(extracted.text, 120) || `YouTube search: ${query}`,\n content: toSnippet(extracted.text, 1800),\n confidence: 0.62,\n attributes: {\n platform: \"youtube\",\n query,\n status: page.status,\n retrievalPath: isHttpUrl(query) ? \"social:youtube:search:url\" : \"social:youtube:search:index\",\n video_id: firstVideoId,\n links: extracted.links.slice(0, 20)\n }\n }];\n };\n};\n\nconst buildFetch = (options: YouTubeProviderOptions) => {\n if (options.fetch) return options.fetch;\n return async (input: ProviderFetchInput, context: ProviderContext) => {\n assertYouTubeLegalReviewChecklist();\n const page = await fetchPage(input.url, context);\n const extracted = extractStructuredContent(page.html, page.url);\n\n const includeFullTranscript = parseBooleanFilter(input.filters?.include_full_transcript, false);\n const requireTranscript = parseBooleanFilter(input.filters?.requireTranscript, false);\n const translateToEnglish = parseBooleanFilter(input.filters?.translateToEnglish, true);\n const requestedMode = parseYouTubeModeFilter(input.filters?.youtube_mode);\n\n const transcriptConfig = resolveYouTubeTranscriptConfig(options.transcriptResolver);\n const transcript = await resolveYouTubeTranscript({\n context,\n watchUrl: page.url,\n pageHtml: page.html,\n legalChecklist: YOUTUBE_LEGAL_REVIEW_CHECKLIST,\n config: transcriptConfig,\n mode: requestedMode,\n browserFallbackPort: options.browserFallbackPort,\n allowBrowserFallbackEscalation: options.antiBotPolicy?.allowBrowserEscalation ?? true,\n asrTranscribe: options.asrTranscribe\n });\n\n if (!transcript.ok && requireTranscript) {\n const requiredReasonCode = transcript.reasonCode === \"caption_missing\"\n ? \"transcript_unavailable\"\n : transcript.reasonCode;\n throw new ProviderRuntimeError(\n providerErrorCodeFromReasonCode(requiredReasonCode),\n `YouTube transcript unavailable (${requiredReasonCode})`,\n {\n provider: \"social/youtube\",\n source: \"social\",\n retryable: requiredReasonCode === \"rate_limited\",\n reasonCode: requiredReasonCode,\n details: {\n reasonCode: requiredReasonCode,\n transcriptReasonCode: transcript.reasonCode,\n url: page.url,\n attemptChain: toAttemptChainJson(transcript.attemptChain)\n }\n }\n );\n }\n\n const transcriptRaw = transcript.ok ? transcript.text : \"\";\n const transcriptLanguage = transcript.ok ? transcript.language : \"unknown\";\n const translationApplied = Boolean(transcriptRaw && translateToEnglish && !transcriptLanguage.startsWith(\"en\"));\n const transcriptContent = translationApplied\n ? `[translated:${transcriptLanguage}] ${transcriptRaw}`\n : transcriptRaw;\n const transcriptSummary = summarizeTranscript(transcriptContent || extracted.text);\n const transcriptOutput = includeFullTranscript || transcriptContent.length < 1200\n ? transcriptContent\n : transcriptSummary;\n const transcriptStrategyDetail = resolveTranscriptStrategyDetail(transcript);\n\n const videoId = parseVideoId(page.url);\n const channel = findChannel(page.html);\n const publishedAt = findPublishedAt(page.html);\n const views = findViews(page.html, extracted.text);\n const dateConfidence = publishedAt\n ? { score: 1, source: \"explicit\" as const }\n : { score: 0.8, source: \"inferred\" as const };\n\n return {\n url: page.url,\n title: toSnippet(extracted.text, 120) || page.url,\n content: transcriptOutput || toSnippet(extracted.text, 1800),\n attributes: {\n platform: \"youtube\",\n status: page.status,\n links: extracted.links.slice(0, 30),\n retrievalPath: \"social:youtube:fetch:url\",\n video_id: videoId,\n ...(channel ? { channel } : {}),\n ...(publishedAt ? { published_at: publishedAt } : {}),\n ...(typeof views === \"number\" ? { views } : {}),\n transcript_language: transcriptLanguage,\n transcript_retrieved_at: new Date().toISOString(),\n transcript_available: transcript.ok,\n transcript_mode: transcript.mode,\n translation_applied: translationApplied,\n transcript_summary: transcriptSummary,\n ...(includeFullTranscript ? { transcript_full: transcriptContent } : {}),\n ...(transcriptStrategyDetail ? { transcript_strategy_detail: transcriptStrategyDetail } : {}),\n ...(transcript.ok\n ? {\n transcript_strategy: transcript.transcriptStrategy,\n attempt_chain: toAttemptChainJson(transcript.attemptChain)\n }\n : {\n reasonCode: transcript.reasonCode,\n attempt_chain: toAttemptChainJson(transcript.attemptChain)\n }),\n date_confidence: dateConfidence\n }\n };\n };\n};\n\nexport const createYouTubeProvider = (options: YouTubeProviderOptions = {}) => {\n return createSocialPlatformProvider({\n platform: \"youtube\",\n displayName: \"YouTube\",\n baseUrl: \"https://www.youtube.com\",\n maxPostLength: 10000,\n supportsMedia: true,\n supportsThreads: false\n }, options);\n};\n\nexport const withDefaultYouTubeOptions = (options: YouTubeProviderOptions = {}): YouTubeProviderOptions => ({\n ...options,\n defaultTraversal: {\n pageLimit: options.defaultTraversal?.pageLimit ?? 1,\n hopLimit: options.defaultTraversal?.hopLimit ?? 0,\n expansionPerRecord: options.defaultTraversal?.expansionPerRecord ?? 1,\n maxRecords: options.defaultTraversal?.maxRecords ?? 8\n },\n search: buildSearch(options.search),\n fetch: buildFetch(options)\n});\n\nexport type { YouTubeTranscriptStrategy };\n","import { createBlueskyProvider } from \"./bluesky\";\nimport { createFacebookProvider } from \"./facebook\";\nimport { createInstagramProvider } from \"./instagram\";\nimport { createLinkedInProvider } from \"./linkedin\";\nimport { createRedditProvider } from \"./reddit\";\nimport { createThreadsProvider } from \"./threads\";\nimport { createTikTokProvider } from \"./tiktok\";\nimport { createXProvider } from \"./x\";\nimport { createYouTubeProvider, type YouTubeProviderOptions } from \"./youtube\";\nimport type { ProviderAdapter } from \"../types\";\nimport type { SocialProviderOptions } from \"./platform\";\n\nexport { createXProvider } from \"./x\";\nexport { createRedditProvider } from \"./reddit\";\nexport { createBlueskyProvider } from \"./bluesky\";\nexport { createFacebookProvider } from \"./facebook\";\nexport { createLinkedInProvider } from \"./linkedin\";\nexport { createInstagramProvider } from \"./instagram\";\nexport { createTikTokProvider } from \"./tiktok\";\nexport { createThreadsProvider } from \"./threads\";\nexport { createYouTubeProvider } from \"./youtube\";\nexport { withDefaultYouTubeOptions } from \"./youtube\";\nexport { validateYouTubeLegalReviewChecklist, YOUTUBE_LEGAL_REVIEW_CHECKLIST } from \"./youtube\";\nexport type { YouTubeProviderOptions } from \"./youtube\";\nexport type { SocialProviderOptions, SocialPlatformProfile } from \"./platform\";\n\nexport type SocialPlatform =\n | \"x\"\n | \"reddit\"\n | \"bluesky\"\n | \"facebook\"\n | \"linkedin\"\n | \"instagram\"\n | \"tiktok\"\n | \"threads\"\n | \"youtube\";\n\nexport interface SocialProvidersOptions {\n x?: SocialProviderOptions;\n reddit?: SocialProviderOptions;\n bluesky?: SocialProviderOptions;\n facebook?: SocialProviderOptions;\n linkedin?: SocialProviderOptions;\n instagram?: SocialProviderOptions;\n tiktok?: SocialProviderOptions;\n threads?: SocialProviderOptions;\n youtube?: YouTubeProviderOptions;\n}\n\nexport const createSocialProviders = (options: SocialProvidersOptions = {}): ProviderAdapter[] => {\n return [\n createXProvider(options.x),\n createRedditProvider(options.reddit),\n createBlueskyProvider(options.bluesky),\n createFacebookProvider(options.facebook),\n createLinkedInProvider(options.linkedin),\n createInstagramProvider(options.instagram),\n createTikTokProvider(options.tiktok),\n createThreadsProvider(options.threads),\n createYouTubeProvider(options.youtube)\n ];\n};\n\nexport const createSocialProvider = (\n platform: SocialPlatform,\n options: SocialProviderOptions = {}\n): ProviderAdapter => {\n switch (platform) {\n case \"x\":\n return createXProvider(options);\n case \"reddit\":\n return createRedditProvider(options);\n case \"bluesky\":\n return createBlueskyProvider(options);\n case \"facebook\":\n return createFacebookProvider(options);\n case \"linkedin\":\n return createLinkedInProvider(options);\n case \"instagram\":\n return createInstagramProvider(options);\n case \"tiktok\":\n return createTikTokProvider(options);\n case \"threads\":\n return createThreadsProvider(options);\n case \"youtube\":\n return createYouTubeProvider(options);\n }\n};\n","import { ProviderRuntimeError, normalizeProviderReasonCode, toProviderError } from \"../errors\";\nimport { normalizeRecord, normalizeRecords } from \"../normalize\";\nimport { providerRequestHeaders } from \"../shared/request-headers\";\nimport { canonicalizeUrl } from \"../web/crawler\";\nimport { extractStructuredContent, toSnippet } from \"../web/extract\";\nimport type {\n JsonValue,\n NormalizedRecord,\n ProviderAdapter,\n ProviderCapabilities,\n ProviderContext,\n ProviderErrorCode,\n ProviderFetchInput,\n ProviderHealth,\n ProviderReasonCode,\n ProviderSearchInput\n} from \"../types\";\n\nconst SHOPPING_SOURCE = \"shopping\" as const;\nconst DEFAULT_CURRENCY = \"USD\";\n\nexport type ShoppingProviderName =\n | \"amazon\"\n | \"walmart\"\n | \"bestbuy\"\n | \"ebay\"\n | \"target\"\n | \"costco\"\n | \"macys\"\n | \"aliexpress\"\n | \"temu\"\n | \"newegg\"\n | \"others\";\n\nexport type ShoppingProviderId = `shopping/${ShoppingProviderName}`;\n\nexport interface ShoppingProviderProfile {\n name: ShoppingProviderName;\n id: ShoppingProviderId;\n displayName: string;\n domains: string[];\n tier: \"tier1\" | \"tier2\";\n extractionFocus: string;\n legalReview: ProviderLegalReviewChecklist;\n searchPath: (query: string) => string;\n}\n\nexport interface ProviderLegalReviewChecklist {\n providerId: string;\n termsReviewDate: string;\n allowedExtractionSurfaces: string[];\n prohibitedFlows: string[];\n reviewer: string;\n approvalExpiryDate: string;\n signedOff: boolean;\n}\n\nexport type LegalReviewReasonCode =\n | \"missing_checklist\"\n | \"provider_mismatch\"\n | \"missing_terms_review_date\"\n | \"invalid_terms_review_date\"\n | \"missing_allowed_surfaces\"\n | \"missing_prohibited_flows\"\n | \"missing_reviewer\"\n | \"missing_approval_expiry\"\n | \"invalid_approval_expiry\"\n | \"approval_expired\"\n | \"not_signed_off\";\n\nexport interface LegalReviewValidationResult {\n valid: boolean;\n reasonCode?: LegalReviewReasonCode;\n}\n\nexport interface ShoppingSearchRecord {\n url: string;\n title?: string;\n content?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n}\n\ninterface ShoppingFetchRecord {\n status: number;\n url: string;\n html: string;\n}\n\nexport type ShoppingFetcher = (args: {\n url: string;\n signal?: AbortSignal;\n provider: string;\n operation: \"search\" | \"fetch\";\n context?: ProviderContext;\n}) => Promise<ShoppingFetchRecord>;\n\nexport interface ShoppingProviderOptions {\n id?: string;\n search?: (input: ProviderSearchInput, context: ProviderContext) => Promise<ShoppingSearchRecord[]>;\n fetch?: (input: ProviderFetchInput, context: ProviderContext) => Promise<ShoppingSearchRecord>;\n fetcher?: ShoppingFetcher;\n}\n\nexport type ShoppingProvidersOptions = Partial<Record<ShoppingProviderName, ShoppingProviderOptions>>;\n\nconst DEFAULT_ALLOWED_SURFACES = [\n \"public search result pages\",\n \"public product detail pages\",\n \"public metadata tags\"\n];\n\nconst DEFAULT_PROHIBITED_FLOWS = [\n \"checkout workflows\",\n \"account/profile pages\",\n \"authenticated purchase APIs\"\n];\n\nconst DEFAULT_REVIEWER = \"opendevbrowser-compliance\";\nconst DEFAULT_TERMS_REVIEW_DATE = \"2026-02-16\";\nconst DEFAULT_APPROVAL_EXPIRY = \"2030-12-31T00:00:00.000Z\";\n\nconst createLegalReviewChecklist = (\n providerId: ShoppingProviderId,\n termsReviewDate = DEFAULT_TERMS_REVIEW_DATE,\n approvalExpiryDate = DEFAULT_APPROVAL_EXPIRY\n): ProviderLegalReviewChecklist => ({\n providerId,\n termsReviewDate,\n allowedExtractionSurfaces: [...DEFAULT_ALLOWED_SURFACES],\n prohibitedFlows: [...DEFAULT_PROHIBITED_FLOWS],\n reviewer: DEFAULT_REVIEWER,\n approvalExpiryDate,\n signedOff: true\n});\n\nexport const SHOPPING_PROVIDER_PROFILES: ShoppingProviderProfile[] = [\n {\n name: \"amazon\",\n id: \"shopping/amazon\",\n displayName: \"Amazon\",\n domains: [\"amazon.com\"],\n tier: \"tier1\",\n extractionFocus: \"PDP title/price/availability, offer blocks, image gallery\",\n legalReview: createLegalReviewChecklist(\"shopping/amazon\"),\n searchPath: (query) => `https://www.amazon.com/s?k=${encodeURIComponent(query)}`\n },\n {\n name: \"walmart\",\n id: \"shopping/walmart\",\n displayName: \"Walmart\",\n domains: [\"walmart.com\"],\n tier: \"tier1\",\n extractionFocus: \"Search cards, PDP price modules, delivery/pickup availability\",\n legalReview: createLegalReviewChecklist(\"shopping/walmart\"),\n searchPath: (query) => `https://www.walmart.com/search?q=${encodeURIComponent(query)}`\n },\n {\n name: \"bestbuy\",\n id: \"shopping/bestbuy\",\n displayName: \"Best Buy\",\n domains: [\"bestbuy.com\"],\n tier: \"tier1\",\n extractionFocus: \"Search results, PDP pricing/condition, fulfillment options\",\n legalReview: createLegalReviewChecklist(\"shopping/bestbuy\"),\n searchPath: (query) => `https://www.bestbuy.com/site/searchpage.jsp?st=${encodeURIComponent(query)}`\n },\n {\n name: \"ebay\",\n id: \"shopping/ebay\",\n displayName: \"eBay\",\n domains: [\"ebay.com\"],\n tier: \"tier1\",\n extractionFocus: \"Listing cards, seller/condition, buy-it-now vs auction fields\",\n legalReview: createLegalReviewChecklist(\"shopping/ebay\"),\n searchPath: (query) => `https://www.ebay.com/sch/i.html?_nkw=${encodeURIComponent(query)}`\n },\n {\n name: \"target\",\n id: \"shopping/target\",\n displayName: \"Target\",\n domains: [\"target.com\"],\n tier: \"tier2\",\n extractionFocus: \"PDP variants, store/ship availability, promotion blocks\",\n legalReview: createLegalReviewChecklist(\"shopping/target\"),\n searchPath: (query) => `https://www.target.com/s?searchTerm=${encodeURIComponent(query)}`\n },\n {\n name: \"costco\",\n id: \"shopping/costco\",\n displayName: \"Costco\",\n domains: [\"costco.com\"],\n tier: \"tier2\",\n extractionFocus: \"Membership-aware price blocks, stock notes, package quantity\",\n legalReview: createLegalReviewChecklist(\"shopping/costco\"),\n searchPath: (query) => `https://www.costco.com/CatalogSearch?dept=All&keyword=${encodeURIComponent(query)}`\n },\n {\n name: \"macys\",\n id: \"shopping/macys\",\n displayName: \"Macy's\",\n domains: [\"macys.com\"],\n tier: \"tier2\",\n extractionFocus: \"Category cards, PDP discounts, variant pricing\",\n legalReview: createLegalReviewChecklist(\"shopping/macys\"),\n searchPath: (query) => `https://www.macys.com/shop/featured/${encodeURIComponent(query)}`\n },\n {\n name: \"aliexpress\",\n id: \"shopping/aliexpress\",\n displayName: \"AliExpress\",\n domains: [\"aliexpress.com\"],\n tier: \"tier2\",\n extractionFocus: \"Listing pricing ranges, shipping estimates, seller signals\",\n legalReview: createLegalReviewChecklist(\"shopping/aliexpress\"),\n searchPath: (query) => `https://www.aliexpress.com/wholesale?SearchText=${encodeURIComponent(query)}`\n },\n {\n name: \"temu\",\n id: \"shopping/temu\",\n displayName: \"Temu\",\n domains: [\"temu.com\"],\n tier: \"tier2\",\n extractionFocus: \"Offer cards, coupon/discount overlays, shipping badges\",\n legalReview: createLegalReviewChecklist(\"shopping/temu\"),\n searchPath: (query) => `https://www.temu.com/search_result.html?search_key=${encodeURIComponent(query)}`\n },\n {\n name: \"newegg\",\n id: \"shopping/newegg\",\n displayName: \"Newegg\",\n domains: [\"newegg.com\"],\n tier: \"tier2\",\n extractionFocus: \"Tech catalog cards, seller conditions, shipping price/time\",\n legalReview: createLegalReviewChecklist(\"shopping/newegg\"),\n searchPath: (query) => `https://www.newegg.com/p/pl?d=${encodeURIComponent(query)}`\n },\n {\n name: \"others\",\n id: \"shopping/others\",\n displayName: \"Others\",\n domains: [],\n tier: \"tier2\",\n extractionFocus: \"JSON-LD Product/Offer, OpenGraph, common PDP selectors\",\n legalReview: createLegalReviewChecklist(\"shopping/others\"),\n searchPath: (query) => `https://duckduckgo.com/?q=${encodeURIComponent(`${query} buy`)}`\n }\n];\n\nexport const SHOPPING_PROVIDER_IDS = SHOPPING_PROVIDER_PROFILES.map((profile) => profile.id);\n\nconst hasValues = (values: string[]): boolean => values.some((value) => value.trim().length > 0);\n\nconst parseIsoDate = (value: string): number => {\n const parsed = Date.parse(value);\n return Number.isNaN(parsed) ? NaN : parsed;\n};\n\nconst SHOPPING_FALLBACK_ERROR_CODES = new Set<ProviderErrorCode>([\n \"auth\",\n \"rate_limited\",\n \"timeout\",\n \"network\",\n \"upstream\",\n \"unavailable\"\n]);\n\nconst fallbackReasonCodeForError = (error: {\n code: ProviderErrorCode;\n message: string;\n details?: Record<string, JsonValue>;\n reasonCode?: ProviderReasonCode;\n}): ProviderReasonCode | undefined => {\n if (error.reasonCode) return error.reasonCode;\n const normalized = normalizeProviderReasonCode({\n code: error.code,\n message: error.message,\n details: error.details\n });\n if (normalized) return normalized;\n if (error.code === \"auth\") return \"token_required\";\n if (error.code === \"rate_limited\") return \"rate_limited\";\n if (error.code === \"upstream\") return \"ip_blocked\";\n if (error.code === \"timeout\" || error.code === \"network\" || error.code === \"unavailable\") return \"env_limited\";\n return undefined;\n};\n\nconst readFallbackString = (output: Record<string, JsonValue> | undefined, key: \"html\" | \"url\"): string | undefined => {\n const value = output?.[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n};\n\nconst resolveBrowserFallback = async (args: {\n error: ProviderRuntimeError;\n url: string;\n provider: string;\n operation: \"search\" | \"fetch\";\n context?: ProviderContext;\n}): Promise<ShoppingFetchRecord | null> => {\n const fallbackPort = args.context?.browserFallbackPort;\n if (!fallbackPort) return null;\n\n const normalized = toProviderError(args.error, {\n provider: args.provider,\n source: SHOPPING_SOURCE\n });\n if (!SHOPPING_FALLBACK_ERROR_CODES.has(normalized.code)) {\n return null;\n }\n const reasonCode = fallbackReasonCodeForError(normalized) ?? \"env_limited\";\n\n const fallback = await fallbackPort.resolve({\n provider: args.provider,\n source: SHOPPING_SOURCE,\n operation: args.operation,\n reasonCode,\n trace: args.context?.trace ?? {\n requestId: `shopping-fallback-${Date.now()}`,\n provider: args.provider,\n ts: new Date().toISOString()\n },\n url: args.url,\n details: {\n errorCode: normalized.code,\n message: normalized.message,\n ...(normalized.details ?? {})\n },\n ...(typeof args.context?.useCookies === \"boolean\" ? { useCookies: args.context.useCookies } : {}),\n ...(args.context?.cookiePolicyOverride ? { cookiePolicyOverride: args.context.cookiePolicyOverride } : {})\n });\n if (!fallback.ok) {\n return null;\n }\n\n const resolvedUrl = canonicalizeUrl(readFallbackString(fallback.output, \"url\") ?? args.url);\n return {\n status: 200,\n url: resolvedUrl,\n html: readFallbackString(fallback.output, \"html\") ?? \"\"\n };\n};\n\nexport const validateLegalReviewChecklist = (\n checklist: ProviderLegalReviewChecklist | undefined,\n expectedProviderId: string,\n now: Date = new Date()\n): LegalReviewValidationResult => {\n if (!checklist) return { valid: false, reasonCode: \"missing_checklist\" };\n if (checklist.providerId !== expectedProviderId) return { valid: false, reasonCode: \"provider_mismatch\" };\n if (!checklist.termsReviewDate.trim()) return { valid: false, reasonCode: \"missing_terms_review_date\" };\n if (Number.isNaN(parseIsoDate(checklist.termsReviewDate))) return { valid: false, reasonCode: \"invalid_terms_review_date\" };\n if (!hasValues(checklist.allowedExtractionSurfaces)) return { valid: false, reasonCode: \"missing_allowed_surfaces\" };\n if (!hasValues(checklist.prohibitedFlows)) return { valid: false, reasonCode: \"missing_prohibited_flows\" };\n if (!checklist.reviewer.trim()) return { valid: false, reasonCode: \"missing_reviewer\" };\n if (!checklist.approvalExpiryDate.trim()) return { valid: false, reasonCode: \"missing_approval_expiry\" };\n\n const expiry = parseIsoDate(checklist.approvalExpiryDate);\n if (Number.isNaN(expiry)) return { valid: false, reasonCode: \"invalid_approval_expiry\" };\n if (expiry <= now.getTime()) return { valid: false, reasonCode: \"approval_expired\" };\n if (!checklist.signedOff) return { valid: false, reasonCode: \"not_signed_off\" };\n return { valid: true };\n};\n\nexport const getShoppingProviderProfile = (providerId: string): ShoppingProviderProfile | null => {\n return SHOPPING_PROVIDER_PROFILES.find((profile) => profile.id === providerId) ?? null;\n};\n\nexport const validateShoppingLegalReviewChecklist = (\n providerId: string,\n now: Date = new Date()\n): LegalReviewValidationResult => {\n const profile = getShoppingProviderProfile(providerId);\n if (!profile) return { valid: false, reasonCode: \"missing_checklist\" };\n return validateLegalReviewChecklist(profile.legalReview, profile.id, now);\n};\n\nconst defaultFetcher: ShoppingFetcher = async ({ url, signal, provider, operation, context }) => {\n const providerId = provider;\n const resolveFallbackOrThrow = async (error: ProviderRuntimeError): Promise<ShoppingFetchRecord> => {\n const fallback = await resolveBrowserFallback({\n error,\n url,\n provider: providerId,\n operation,\n context\n });\n if (fallback) return fallback;\n throw error;\n };\n\n let response: Response;\n try {\n response = await fetch(url, {\n signal,\n headers: {\n accept: \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n ...providerRequestHeaders\n },\n redirect: \"follow\"\n });\n } catch (error) {\n const runtimeError = new ProviderRuntimeError(\"network\", `Failed to retrieve ${url}`, {\n provider: providerId,\n source: SHOPPING_SOURCE,\n retryable: true,\n cause: error\n });\n return resolveFallbackOrThrow(runtimeError);\n }\n\n if (response.status === 401 || response.status === 403) {\n const runtimeError = new ProviderRuntimeError(\"auth\", `Authentication required for ${url}`, {\n provider: providerId,\n source: SHOPPING_SOURCE,\n retryable: false,\n reasonCode: \"token_required\",\n details: { status: response.status, url, reasonCode: \"token_required\" }\n });\n return resolveFallbackOrThrow(runtimeError);\n }\n if (response.status === 429) {\n const runtimeError = new ProviderRuntimeError(\"rate_limited\", `Rate limited while retrieving ${url}`, {\n provider: providerId,\n source: SHOPPING_SOURCE,\n retryable: true,\n details: { status: response.status, url }\n });\n return resolveFallbackOrThrow(runtimeError);\n }\n if (response.status >= 400) {\n const runtimeError = new ProviderRuntimeError(\"unavailable\", `Retrieval failed for ${url}`, {\n provider: providerId,\n source: SHOPPING_SOURCE,\n retryable: response.status >= 500,\n details: { status: response.status, url }\n });\n return resolveFallbackOrThrow(runtimeError);\n }\n\n return {\n status: response.status,\n url: response.url || url,\n html: await response.text()\n };\n};\n\nconst PRICE_RE = /([$€£])\\s*([0-9]{1,3}(?:[.,][0-9]{3})*(?:[.,][0-9]{1,2})?)/;\nconst RATING_RE = /([0-5](?:\\.[0-9])?)\\s*(?:out of 5|\\/5)/i;\nconst REVIEWS_RE = /([0-9][0-9,]*)\\s*(?:ratings|reviews)/i;\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst parsePrice = (text: string): { amount: number; currency: string } => {\n const match = text.match(PRICE_RE);\n if (!match) {\n return { amount: 0, currency: DEFAULT_CURRENCY };\n }\n\n const currencySymbol = match[1];\n const raw = match[2]!.replace(/,/g, \"\");\n const amount = Number(raw);\n const currency = currencySymbol === \"€\"\n ? \"EUR\"\n : currencySymbol === \"£\"\n ? \"GBP\"\n : DEFAULT_CURRENCY;\n\n return {\n amount: Number.isFinite(amount) ? amount : 0,\n currency\n };\n};\n\nconst parseRating = (text: string): number => {\n const match = text.match(RATING_RE);\n if (!match) return 0;\n return Math.max(0, Math.min(5, Number(match[1])));\n};\n\nconst parseReviews = (text: string): number => {\n const match = text.match(REVIEWS_RE);\n if (!match) return 0;\n const value = Number(match[1]!.replace(/,/g, \"\"));\n return Number.isFinite(value) ? Math.max(0, value) : 0;\n};\n\nconst parseAvailability = (text: string): \"in_stock\" | \"limited\" | \"out_of_stock\" | \"unknown\" => {\n const lower = text.toLowerCase();\n if (/out of stock|sold out|unavailable/.test(lower)) return \"out_of_stock\";\n if (/limited|few left|only \\d+ left/.test(lower)) return \"limited\";\n if (/in stock|available now|ships/.test(lower)) return \"in_stock\";\n return \"unknown\";\n};\n\nconst dedupeLinks = (links: string[], limit: number): string[] => {\n const seen = new Set<string>();\n const normalized: string[] = [];\n for (const link of links) {\n const url = canonicalizeUrl(link);\n if (!isHttpUrl(url) || seen.has(url)) continue;\n seen.add(url);\n normalized.push(url);\n if (normalized.length >= limit) break;\n }\n return normalized.sort((left, right) => left.localeCompare(right));\n};\n\nconst deriveOfferAttributes = (args: {\n profile: ShoppingProviderProfile;\n url: string;\n title: string;\n text: string;\n rank: number;\n}): Record<string, JsonValue> => {\n const nowIso = new Date().toISOString();\n const price = parsePrice(args.text);\n const rating = parseRating(args.text);\n const reviews = parseReviews(args.text);\n const availability = parseAvailability(args.text);\n\n return {\n shopping_offer: {\n provider: args.profile.id,\n product_id: `${args.profile.id}:${args.rank}:${Buffer.from(args.url).toString(\"base64\").slice(0, 8)}`,\n title: args.title,\n url: args.url,\n price: {\n amount: price.amount,\n currency: price.currency,\n retrieved_at: nowIso\n },\n shipping: {\n amount: 0,\n currency: price.currency,\n notes: \"unknown\"\n },\n availability,\n rating,\n reviews_count: reviews,\n capture_timestamp: nowIso\n },\n extractionQuality: {\n hasUrl: args.url.length > 0,\n hasTitle: args.title.length > 0,\n hasContent: args.text.length > 0,\n contentChars: args.text.length,\n linkCount: 0\n },\n providerTier: args.profile.tier,\n extractionFocus: args.profile.extractionFocus,\n canonicalUrl: canonicalizeUrl(args.url)\n };\n};\n\nconst buildCapabilities = (profile: ShoppingProviderProfile, providerId: string): ProviderCapabilities => ({\n providerId,\n source: SHOPPING_SOURCE,\n operations: {\n search: {\n op: \"search\",\n supported: true,\n description: `Search ${profile.displayName}`\n },\n fetch: {\n op: \"fetch\",\n supported: true,\n description: `Fetch ${profile.displayName} product details`\n },\n crawl: {\n op: \"crawl\",\n supported: false,\n description: \"Shopping crawl is disabled by default\"\n },\n post: {\n op: \"post\",\n supported: false,\n description: \"Shopping posting is not supported\"\n }\n },\n policy: {\n posting: \"unsupported\",\n riskNoticeRequired: false,\n confirmationRequired: false\n },\n metadata: {\n provider: profile.displayName,\n domains: profile.domains,\n tier: profile.tier,\n extractionFocus: profile.extractionFocus,\n legalReview: {\n termsReviewDate: profile.legalReview.termsReviewDate,\n approvalExpiryDate: profile.legalReview.approvalExpiryDate,\n reviewer: profile.legalReview.reviewer,\n signedOff: profile.legalReview.signedOff\n }\n }\n});\n\nconst normalizeRows = (\n providerId: string,\n rows: ShoppingSearchRecord[]\n): NormalizedRecord[] => normalizeRecords(providerId, SHOPPING_SOURCE, rows);\n\nconst createDefaultSearch = (\n profile: ShoppingProviderProfile,\n providerId: string,\n fetcher: ShoppingFetcher\n) => async (input: ProviderSearchInput, context: ProviderContext): Promise<ShoppingSearchRecord[]> => {\n const query = input.query.trim();\n if (!query) {\n throw new ProviderRuntimeError(\"invalid_input\", `${profile.displayName} query is required`, {\n provider: providerId,\n source: SHOPPING_SOURCE,\n retryable: false\n });\n }\n\n const lookupUrl = isHttpUrl(query)\n ? query\n : profile.searchPath(query);\n const fetched = await fetcher({\n url: lookupUrl,\n signal: context.signal,\n provider: providerId,\n operation: \"search\",\n context\n });\n const extracted = extractStructuredContent(fetched.html, fetched.url);\n\n const limit = Math.max(1, Math.min(input.limit ?? 10, 20));\n const links = dedupeLinks(extracted.links, limit);\n const content = toSnippet(extracted.text, 2000);\n\n const rows: ShoppingSearchRecord[] = [\n {\n url: fetched.url,\n title: `${profile.displayName} search: ${query}`,\n content,\n confidence: 0.68,\n attributes: {\n ...deriveOfferAttributes({\n profile,\n url: fetched.url,\n title: `${profile.displayName} search: ${query}`,\n text: extracted.text,\n rank: 0\n }),\n status: fetched.status,\n links,\n retrievalPath: isHttpUrl(query) ? \"shopping:search:url\" : \"shopping:search:index\"\n }\n }\n ];\n\n links.forEach((link, index) => {\n rows.push({\n url: link,\n title: link,\n content: index === 0 ? content : undefined,\n confidence: Math.max(0.45, 0.72 - index * 0.03),\n attributes: {\n ...deriveOfferAttributes({\n profile,\n url: link,\n title: link,\n text: extracted.text,\n rank: index + 1\n }),\n rank: index + 1,\n retrievalPath: \"shopping:search:link\"\n }\n });\n });\n\n return rows.slice(0, limit + 1);\n};\n\nconst createDefaultFetch = (\n profile: ShoppingProviderProfile,\n providerId: string,\n fetcher: ShoppingFetcher\n) => async (input: ProviderFetchInput, context: ProviderContext): Promise<ShoppingSearchRecord> => {\n const fetched = await fetcher({\n url: input.url,\n signal: context.signal,\n provider: providerId,\n operation: \"fetch\",\n context\n });\n const extracted = extractStructuredContent(fetched.html, fetched.url);\n const title = toSnippet(extracted.text, 120) || fetched.url;\n\n return {\n url: fetched.url,\n title,\n content: extracted.text,\n attributes: {\n ...deriveOfferAttributes({\n profile,\n url: fetched.url,\n title,\n text: extracted.text,\n rank: 1\n }),\n status: fetched.status,\n links: dedupeLinks(extracted.links, 30),\n selectors: extracted.selectors,\n retrievalPath: \"shopping:fetch:url\"\n }\n };\n};\n\nconst resolveHealth = (): ProviderHealth => ({\n status: \"healthy\",\n updatedAt: new Date().toISOString()\n});\n\nexport const createShoppingProvider = (\n profile: ShoppingProviderProfile,\n options: ShoppingProviderOptions = {}\n): ProviderAdapter => {\n const providerId = options.id ?? profile.id;\n const fetcher = options.fetcher ?? defaultFetcher;\n const search = options.search ?? createDefaultSearch(profile, providerId, fetcher);\n const fetch = options.fetch ?? createDefaultFetch(profile, providerId, fetcher);\n\n return {\n id: providerId,\n source: SHOPPING_SOURCE,\n search: async (input, context) => normalizeRows(providerId, await search(input, context)),\n fetch: async (input, context) => {\n const row = await fetch(input, context);\n return [normalizeRecord(providerId, SHOPPING_SOURCE, row)];\n },\n health: async () => resolveHealth(),\n capabilities: () => buildCapabilities(profile, providerId)\n };\n};\n\nexport const createShoppingProviders = (options: ShoppingProvidersOptions = {}): ProviderAdapter[] => {\n return SHOPPING_PROVIDER_PROFILES.map((profile) => createShoppingProvider(profile, options[profile.name]));\n};\n\nexport const createShoppingProviderById = (\n providerId: string,\n options: ShoppingProviderOptions = {}\n): ProviderAdapter => {\n const profile = SHOPPING_PROVIDER_PROFILES.find((entry) => entry.id === providerId || entry.name === providerId.replace(/^shopping\\//, \"\"));\n if (!profile) {\n throw new ProviderRuntimeError(\"invalid_input\", `Unknown shopping provider: ${providerId}`, {\n source: SHOPPING_SOURCE,\n retryable: false,\n details: {\n providerId,\n available: SHOPPING_PROVIDER_IDS\n }\n });\n }\n return createShoppingProvider(profile, options);\n};\n","import { ProviderRuntimeError } from \"../errors\";\nimport { normalizeRecord, normalizeRecords } from \"../normalize\";\nimport { crawlWeb, type CrawlBudget, type CrawlFetcher, type CrawlPipelineBudget } from \"./crawler\";\nimport { extractStructuredContent, toSnippet } from \"./extract\";\nimport type {\n JsonValue,\n NormalizedRecord,\n ProviderAdapter,\n ProviderCapabilities,\n ProviderContext,\n ProviderCrawlInput,\n ProviderFetchInput,\n ProviderSearchInput\n} from \"../types\";\nimport type { WebCrawlPolicy } from \"./policy\";\n\nexport interface WebSearchRecord {\n url: string;\n title?: string;\n content?: string;\n confidence?: number;\n attributes?: Record<string, JsonValue>;\n}\n\nexport interface WebProviderOptions {\n id?: string;\n fetcher?: CrawlFetcher;\n searchIndex?: (input: ProviderSearchInput, context: ProviderContext) => Promise<WebSearchRecord[]>;\n defaultBudget?: Partial<CrawlBudget>;\n defaultPipeline?: Partial<CrawlPipelineBudget>;\n selectors?: string[];\n workerThreads?: number;\n queueMax?: number;\n forceInlineParse?: boolean;\n policy?: WebCrawlPolicy;\n}\n\nconst WEB_SOURCE = \"web\" as const;\n\nconst capabilities = (id: string, policy: WebCrawlPolicy | undefined): ProviderCapabilities => ({\n providerId: id,\n source: WEB_SOURCE,\n operations: {\n search: { op: \"search\", supported: true, description: \"Query web content\" },\n fetch: { op: \"fetch\", supported: true, description: \"Fetch one web document\" },\n crawl: { op: \"crawl\", supported: true, description: \"Budgeted web crawl\" },\n post: { op: \"post\", supported: false, description: \"Posting is not supported for web provider\" }\n },\n policy: {\n posting: \"unsupported\",\n riskNoticeRequired: false,\n confirmationRequired: false\n },\n metadata: {\n crawler: true,\n robotsMode: policy?.robotsMode ?? \"warn\"\n }\n});\n\nconst fetchOne = async (fetcher: CrawlFetcher, url: string): Promise<{ status: number; html: string }> => {\n const result = await fetcher(url);\n return {\n status: result.status ?? 200,\n html: result.html\n };\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst toQualityFlags = (value: {\n url?: string;\n title?: string;\n content?: string;\n linkCount?: number;\n}): Record<string, JsonValue> => ({\n hasUrl: typeof value.url === \"string\" && value.url.length > 0,\n hasTitle: typeof value.title === \"string\" && value.title.length > 0,\n hasContent: typeof value.content === \"string\" && value.content.length > 0,\n contentChars: value.content?.length ?? 0,\n linkCount: value.linkCount ?? 0\n});\n\nconst asPositiveInt = (value: JsonValue | undefined): number | undefined => {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return undefined;\n const normalized = Math.floor(value);\n return normalized > 0 ? normalized : undefined;\n};\n\nexport const createWebProvider = (options: WebProviderOptions = {}): ProviderAdapter => {\n const id = options.id ?? \"web/default\";\n\n const search = async (input: ProviderSearchInput, context: ProviderContext): Promise<NormalizedRecord[]> => {\n if (!input.query.trim()) {\n throw new ProviderRuntimeError(\"invalid_input\", \"Search query is required\", {\n provider: id,\n source: WEB_SOURCE,\n retryable: false\n });\n }\n\n if (options.searchIndex) {\n const rows = await options.searchIndex(input, context);\n return normalizeRecords(id, WEB_SOURCE, rows.map((row) => ({\n url: row.url,\n title: row.title,\n content: row.content,\n confidence: row.confidence,\n attributes: {\n ...(row.attributes ?? {}),\n extractionQuality: toQualityFlags({\n url: row.url,\n title: row.title,\n content: row.content\n })\n }\n })));\n }\n\n if (!options.fetcher) {\n throw new ProviderRuntimeError(\"unavailable\", \"Web search retrieval is not configured\", {\n provider: id,\n source: WEB_SOURCE\n });\n }\n\n const queryUrl = input.query.trim();\n if (!isHttpUrl(queryUrl)) {\n throw new ProviderRuntimeError(\"invalid_input\", \"Web search query must be an HTTP URL when search index is not configured\", {\n provider: id,\n source: WEB_SOURCE,\n retryable: false\n });\n }\n\n const response = await fetchOne(options.fetcher, queryUrl);\n const extracted = extractStructuredContent(response.html, queryUrl);\n return [normalizeRecord(id, WEB_SOURCE, {\n url: queryUrl,\n title: queryUrl,\n content: toSnippet(extracted.text),\n confidence: 0.4,\n attributes: {\n status: response.status,\n links: extracted.links.length,\n extractionQuality: toQualityFlags({\n url: queryUrl,\n title: queryUrl,\n content: extracted.text,\n linkCount: extracted.links.length\n })\n }\n })];\n };\n\n const fetch = async (input: ProviderFetchInput): Promise<NormalizedRecord[]> => {\n if (!options.fetcher) {\n throw new ProviderRuntimeError(\"unavailable\", \"Web fetcher is not configured\", {\n provider: id,\n source: WEB_SOURCE\n });\n }\n\n const response = await fetchOne(options.fetcher, input.url);\n const extracted = extractStructuredContent(response.html, input.url);\n\n return [normalizeRecord(id, WEB_SOURCE, {\n url: input.url,\n title: input.url,\n content: extracted.text,\n confidence: 0.6,\n attributes: {\n status: response.status,\n links: extracted.links,\n selectors: extracted.selectors,\n extractionQuality: toQualityFlags({\n url: input.url,\n title: input.url,\n content: extracted.text,\n linkCount: extracted.links.length\n })\n }\n })];\n };\n\n const crawl = async (input: ProviderCrawlInput): Promise<NormalizedRecord[]> => {\n if (!options.fetcher) {\n throw new ProviderRuntimeError(\"unavailable\", \"Web crawler fetcher is not configured\", {\n provider: id,\n source: WEB_SOURCE\n });\n }\n\n if (input.seedUrls.length === 0) {\n throw new ProviderRuntimeError(\"invalid_input\", \"At least one crawl seed URL is required\", {\n provider: id,\n source: WEB_SOURCE,\n retryable: false\n });\n }\n\n const adaptiveFetchConcurrency = asPositiveInt(input.filters?.fetchConcurrency);\n const adaptiveFrontierMax = asPositiveInt(input.filters?.frontierMax);\n\n const crawlResult = await crawlWeb({\n fetcher: options.fetcher,\n strategy: input.strategy,\n policy: options.policy,\n selectors: options.selectors,\n seeds: input.seedUrls,\n budget: {\n ...options.defaultBudget,\n maxDepth: input.maxDepth ?? options.defaultBudget?.maxDepth,\n maxPages: input.maxPages ?? options.defaultBudget?.maxPages,\n maxPerDomain: input.maxPerDomain ?? options.defaultBudget?.maxPerDomain\n },\n pipeline: {\n ...(options.defaultPipeline ?? {}),\n ...(adaptiveFetchConcurrency !== undefined ? { fetchConcurrency: adaptiveFetchConcurrency } : {}),\n ...(adaptiveFrontierMax !== undefined ? { frontierMax: adaptiveFrontierMax } : {}),\n ...(typeof options.workerThreads === \"number\" ? { workerThreads: options.workerThreads } : {}),\n ...(typeof options.queueMax === \"number\" ? { queueMax: options.queueMax } : {})\n },\n workerThreads: options.workerThreads,\n queueMax: options.queueMax,\n forceInlineParse: options.forceInlineParse\n });\n\n return crawlResult.pages.map((page) => normalizeRecord(id, WEB_SOURCE, {\n url: page.url,\n title: page.url,\n content: page.text,\n confidence: 0.7,\n attributes: {\n depth: page.depth,\n status: page.status,\n links: page.links,\n warnings: page.warnings,\n crawlWarnings: crawlResult.warnings,\n crawlMetrics: {\n visited: crawlResult.metrics.visited,\n fetched: crawlResult.metrics.fetched,\n deduped: crawlResult.metrics.deduped,\n elapsedMs: crawlResult.metrics.elapsedMs,\n pagesPerMinute: crawlResult.metrics.pagesPerMinute,\n p50LatencyMs: crawlResult.metrics.p50LatencyMs,\n p95LatencyMs: crawlResult.metrics.p95LatencyMs\n },\n extractionQuality: toQualityFlags({\n url: page.url,\n title: page.url,\n content: page.text,\n linkCount: page.links.length\n })\n }\n }));\n };\n\n return {\n id,\n source: WEB_SOURCE,\n search,\n fetch,\n crawl,\n health: async () => ({\n status: options.fetcher ? \"healthy\" : \"degraded\",\n updatedAt: new Date().toISOString(),\n ...(options.fetcher ? {} : { reason: \"Fetcher not configured\" })\n }),\n capabilities: () => capabilities(id, options.policy)\n };\n};\n","import { redactSensitive } from \"../core/logging\";\nimport { sanitizePromptGuardText } from \"./safety/prompt-guard\";\nimport type {\n BlockerActionHint,\n BlockerArtifactCaps,\n BlockerArtifactsV1,\n BlockerSignalV1,\n BlockerType,\n JsonValue,\n ProviderReasonCode\n} from \"./types\";\n\nconst AUTH_URL_PATTERNS: Array<{ id: string; regex: RegExp; confidence: number }> = [\n { id: \"redirect_login_flow\", regex: /\\/i\\/flow\\/login/i, confidence: 0.97 },\n { id: \"auth_login_path\", regex: /\\/(login|signin|sign-in|auth)(\\/|\\?|$)/i, confidence: 0.9 }\n];\n\nconst AUTH_TITLE_PATTERNS: Array<{ id: string; regex: RegExp; confidence: number }> = [\n { id: \"title_login\", regex: /\\b(log in|sign in)\\b/i, confidence: 0.92 },\n { id: \"title_auth_required\", regex: /authentication required/i, confidence: 0.9 }\n];\n\nconst CHALLENGE_PATTERNS: Array<{ id: string; regex: RegExp; confidence: number }> = [\n { id: \"challenge_keyword\", regex: /\\b(challenge|captcha|verify|interstitial|cf_chl|bot)\\b/i, confidence: 0.88 },\n { id: \"prove_humanity\", regex: /prove your humanity/i, confidence: 0.96 }\n];\n\nconst RECAPTCHA_HOST_PATTERNS = [/recaptcha/i, /hcaptcha/i, /challenges\\.cloudflare\\.com/i];\nconst STATIC_BLOCK_HOST_PATTERNS = [/redditstatic\\.com$/i, /abs\\.twimg\\.com$/i, /twimg\\.com$/i];\n\nconst ENV_LIMITED_PATTERNS = [\n /extension not connected/i,\n /connect the extension/i,\n /manual interaction/i,\n /timed out/i,\n /not available in this environment/i\n];\n\nconst RESTRICTED_TARGET_PATTERNS = [/^chrome:\\/\\//i, /^chrome-extension:\\/\\//i, /^about:blank$/i, /^devtools:\\/\\//i];\n\nexport const DEFAULT_BLOCKER_ARTIFACT_CAPS: BlockerArtifactCaps = {\n maxNetworkEvents: 20,\n maxConsoleEvents: 20,\n maxExceptionEvents: 10,\n maxHosts: 10,\n maxTextLength: 512\n};\n\nexport interface BlockerClassificationInput {\n source: BlockerSignalV1[\"source\"];\n url?: string;\n finalUrl?: string;\n title?: string;\n status?: number;\n providerErrorCode?: string;\n message?: string;\n matchedPatterns?: string[];\n networkHosts?: string[];\n traceRequestId?: string;\n retryable?: boolean;\n envLimited?: boolean;\n restrictedTarget?: boolean;\n promptGuardEnabled?: boolean;\n threshold?: number;\n detectedAt?: string;\n}\n\nexport interface BlockerArtifactInput {\n networkEvents?: unknown[];\n consoleEvents?: unknown[];\n exceptionEvents?: unknown[];\n promptGuardEnabled?: boolean;\n caps?: Partial<BlockerArtifactCaps>;\n}\n\nconst toLower = (value: string): string => value.trim().toLowerCase();\n\nconst clampNumber = (value: number, min: number, max: number): number => {\n if (!Number.isFinite(value)) return min;\n if (value < min) return min;\n if (value > max) return max;\n return value;\n};\n\nexport const clampBlockerConfidence = (value: number): number => {\n return clampNumber(value, 0, 1);\n};\n\nconst clampThreshold = (value: number | undefined): number => {\n if (typeof value !== \"number\") return 0.7;\n return clampNumber(value, 0, 1);\n};\n\nexport const clampText = (value: string | undefined, maxLength: number): string | undefined => {\n if (typeof value !== \"string\") return undefined;\n if (maxLength <= 0) return \"\";\n return value.length <= maxLength ? value : `${value.slice(0, Math.max(0, maxLength - 3))}...`;\n};\n\nexport const boundedUniqueList = (\n values: readonly string[] | undefined,\n maxLength: number\n): string[] => {\n if (!values || values.length === 0 || maxLength <= 0) return [];\n const seen = new Set<string>();\n const list: string[] = [];\n for (const value of values) {\n if (typeof value !== \"string\") continue;\n const normalized = value.trim();\n if (!normalized) continue;\n const key = normalized.toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n list.push(normalized);\n if (list.length >= maxLength) break;\n }\n return list;\n};\n\nconst extractHost = (value: string | undefined): string | null => {\n if (!value) return null;\n try {\n return toLower(new URL(value).hostname);\n } catch {\n return null;\n }\n};\n\nconst scorePatternMatches = (\n text: string,\n patterns: Array<{ id: string; regex: RegExp; confidence: number }>\n): { matched: string[]; confidence: number } => {\n const matched: string[] = [];\n let confidence = 0;\n for (const pattern of patterns) {\n if (!pattern.regex.test(text)) continue;\n matched.push(pattern.id);\n confidence = Math.max(confidence, pattern.confidence);\n }\n return { matched, confidence };\n};\n\nconst hasAnyPattern = (value: string, patterns: RegExp[]): boolean => {\n return patterns.some((pattern) => pattern.test(value));\n};\n\nconst isLoopbackHost = (value: string): boolean => {\n const normalized = toLower(value).replace(/^\\[|\\]$/g, \"\");\n if (!normalized) return false;\n if (normalized === \"localhost\" || normalized === \"::1\") return true;\n if (normalized === \"127.0.0.1\" || normalized.startsWith(\"127.\")) return true;\n return /^::ffff:127\\.\\d+\\.\\d+\\.\\d+$/.test(normalized);\n};\n\nconst buildHints = (type: BlockerType): BlockerActionHint[] => {\n switch (type) {\n case \"auth_required\":\n return [\n { id: \"manual_login\", reason: \"Authentication flow requires interactive login.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Headed mode can complete login and persist session state.\", priority: 2 },\n { id: \"switch_extension_mode\", reason: \"Extension mode can reuse an already logged-in browser profile.\", priority: 3 }\n ];\n case \"anti_bot_challenge\":\n return [\n { id: \"manual_challenge\", reason: \"Challenge page requires manual completion.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Headed mode improves challenge completion reliability.\", priority: 2 },\n { id: \"collect_debug_trace\", reason: \"Collect trace artifacts to compare challenge indicators before and after manual action.\", priority: 3 }\n ];\n case \"rate_limited\":\n return [\n { id: \"retry_after_backoff\", reason: \"Rate-limited responses should be retried after a bounded delay.\", priority: 1 },\n { id: \"collect_debug_trace\", reason: \"Trace data can confirm cooldown and request pacing behavior.\", priority: 2 }\n ];\n case \"upstream_block\":\n return [\n { id: \"retry_after_backoff\", reason: \"Upstream blocks may clear after network or host recovery.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Browser-assisted retrieval may bypass runtime fetch limitations.\", priority: 2 },\n { id: \"collect_debug_trace\", reason: \"Trace host evidence helps confirm blocked upstream dependencies.\", priority: 3 }\n ];\n case \"restricted_target\":\n return [\n { id: \"switch_managed_headed\", reason: \"Restricted internal targets require navigation to a normal http(s) tab.\", priority: 1 },\n { id: \"collect_debug_trace\", reason: \"Trace confirms blocked scheme or tab restriction source.\", priority: 2 }\n ];\n case \"env_limited\":\n return [\n { id: \"switch_extension_mode\", reason: \"Extension relay availability is required for this operation.\", priority: 1 },\n { id: \"switch_managed_headed\", reason: \"Managed headed mode is a deterministic fallback when extension is unavailable.\", priority: 2 },\n { id: \"collect_debug_trace\", reason: \"Diagnostics can confirm environment capability gaps.\", priority: 3 }\n ];\n case \"unknown\":\n return [{ id: \"collect_debug_trace\", reason: \"Additional trace evidence is required for reliable classification.\", priority: 1 }];\n }\n};\n\nconst classifyFromInputs = (\n input: BlockerClassificationInput,\n normalizedHosts: string[],\n matchedPatterns: string[]\n): { type: BlockerType; reasonCode?: ProviderReasonCode; confidence: number; retryable: boolean; matches: string[] } | null => {\n const status = input.status;\n const code = toLower(input.providerErrorCode ?? \"\");\n const url = input.url ?? \"\";\n const finalUrl = input.finalUrl ?? \"\";\n const title = input.title ?? \"\";\n const message = input.message ?? \"\";\n const challengeText = `${title} ${message}`;\n const urlSignals = `${url} ${finalUrl}`;\n const isUpstreamCode = code === \"upstream\" || code === \"network\" || code === \"unavailable\";\n const hasStaticBlockHost = normalizedHosts.some((host) => hasAnyPattern(host, STATIC_BLOCK_HOST_PATTERNS));\n const isLoopbackContext = [\n extractHost(url),\n extractHost(finalUrl),\n ...normalizedHosts\n ].some((host): host is string => typeof host === \"string\" && isLoopbackHost(host));\n\n const authMatches: string[] = [];\n let authConfidence = 0;\n if (status === 401 || status === 403) {\n authMatches.push(`status:${status}`);\n authConfidence = Math.max(authConfidence, status === 401 ? 0.94 : 0.9);\n }\n if (code === \"auth\") {\n authMatches.push(\"provider_code:auth\");\n authConfidence = Math.max(authConfidence, 0.9);\n }\n const authPathMatches = scorePatternMatches(`${url} ${finalUrl}`, AUTH_URL_PATTERNS);\n authMatches.push(...authPathMatches.matched);\n authConfidence = Math.max(authConfidence, authPathMatches.confidence);\n const authTitleMatches = scorePatternMatches(title, AUTH_TITLE_PATTERNS);\n authMatches.push(...authTitleMatches.matched);\n authConfidence = Math.max(authConfidence, authTitleMatches.confidence);\n if (authConfidence > 0) {\n return {\n type: \"auth_required\",\n reasonCode: \"token_required\",\n confidence: authConfidence,\n retryable: false,\n matches: boundedUniqueList([...matchedPatterns, ...authMatches], 16)\n };\n }\n\n if (!isLoopbackContext) {\n const challengeMatches: string[] = [];\n let challengeConfidence = 0;\n const challengePatternMatches = scorePatternMatches(challengeText, CHALLENGE_PATTERNS);\n challengeMatches.push(...challengePatternMatches.matched);\n challengeConfidence = Math.max(challengeConfidence, challengePatternMatches.confidence);\n if (/(captcha|cf_chl|hcaptcha|recaptcha|interstitial)/i.test(urlSignals)) {\n challengeMatches.push(\"url:challenge_token\");\n challengeConfidence = Math.max(challengeConfidence, 0.9);\n }\n if (hasAnyPattern(title, CHALLENGE_PATTERNS.map((entry) => entry.regex)) && status === 200) {\n challengeMatches.push(\"status:200_challenge_title\");\n challengeConfidence = Math.max(challengeConfidence, 0.92);\n }\n if (normalizedHosts.some((host) => hasAnyPattern(host, RECAPTCHA_HOST_PATTERNS))) {\n challengeMatches.push(\"network:challenge_host\");\n challengeConfidence = Math.max(challengeConfidence, 0.96);\n }\n if (challengeConfidence > 0) {\n return {\n type: \"anti_bot_challenge\",\n reasonCode: \"challenge_detected\",\n confidence: challengeConfidence,\n retryable: false,\n matches: boundedUniqueList([...matchedPatterns, ...challengeMatches], 16)\n };\n }\n }\n\n if (status === 429 || code === \"rate_limited\") {\n return {\n type: \"rate_limited\",\n reasonCode: \"rate_limited\",\n confidence: 0.95,\n retryable: true,\n matches: boundedUniqueList([...matchedPatterns, status === 429 ? \"status:429\" : \"provider_code:rate_limited\"], 16)\n };\n }\n\n if (isUpstreamCode && (hasStaticBlockHost || /retrieval failed/i.test(message) || (typeof status === \"number\" && status >= 500))) {\n return {\n type: \"upstream_block\",\n reasonCode: \"ip_blocked\",\n confidence: hasStaticBlockHost ? 0.9 : 0.8,\n retryable: input.retryable ?? true,\n matches: boundedUniqueList(\n [\n ...matchedPatterns,\n `provider_code:${code}`,\n ...(hasStaticBlockHost ? [\"network:blocked_static_host\"] : [])\n ],\n 16\n )\n };\n }\n\n if (\n input.restrictedTarget\n || RESTRICTED_TARGET_PATTERNS.some((pattern) => pattern.test(url))\n || RESTRICTED_TARGET_PATTERNS.some((pattern) => pattern.test(finalUrl))\n ) {\n return {\n type: \"restricted_target\",\n confidence: 0.92,\n retryable: false,\n matches: boundedUniqueList([...matchedPatterns, \"restricted_target\"], 16)\n };\n }\n\n if (input.envLimited || (code === \"unavailable\" && ENV_LIMITED_PATTERNS.some((pattern) => pattern.test(message)))) {\n return {\n type: \"env_limited\",\n reasonCode: \"env_limited\",\n confidence: input.envLimited ? 0.9 : 0.78,\n retryable: true,\n matches: boundedUniqueList([...matchedPatterns, \"env_limited\"], 16)\n };\n }\n\n if (status || code || title || message || normalizedHosts.length > 0) {\n return {\n type: \"unknown\",\n confidence: 0.5,\n retryable: input.retryable ?? false,\n matches: boundedUniqueList(matchedPatterns, 16)\n };\n }\n\n return null;\n};\n\nconst coerceJsonValue = (\n value: unknown,\n maxTextLength: number,\n promptGuardEnabled: boolean,\n diagnostics: { entries: number; quarantinedSegments: number },\n seen: WeakSet<object>\n): JsonValue => {\n if (value === null || typeof value === \"number\" || typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"string\") {\n const sanitized = sanitizePromptGuardText(value, promptGuardEnabled);\n diagnostics.entries += sanitized.diagnostics.entries;\n diagnostics.quarantinedSegments += sanitized.diagnostics.quarantinedSegments;\n const redacted = redactSensitive(sanitized.text);\n const asString = typeof redacted === \"string\" ? redacted : String(redacted);\n return clampText(asString, maxTextLength) ?? \"\";\n }\n\n if (Array.isArray(value)) {\n return value.slice(0, 20).map((entry) => coerceJsonValue(entry, maxTextLength, promptGuardEnabled, diagnostics, seen));\n }\n\n if (typeof value !== \"object\") {\n return String(value);\n }\n\n if (seen.has(value)) {\n return \"[Circular]\";\n }\n seen.add(value);\n\n const objectValue = value as Record<string, unknown>;\n const entries = Object.entries(objectValue).slice(0, 30);\n const output: Record<string, JsonValue> = {};\n for (const [key, entryValue] of entries) {\n output[key] = coerceJsonValue(entryValue, maxTextLength, promptGuardEnabled, diagnostics, seen);\n }\n return output;\n};\n\nconst coerceEventList = (\n values: unknown[] | undefined,\n maxItems: number,\n maxTextLength: number,\n promptGuardEnabled: boolean,\n diagnostics: { entries: number; quarantinedSegments: number }\n): Array<Record<string, JsonValue>> => {\n if (!Array.isArray(values) || maxItems <= 0) return [];\n return values.slice(-maxItems).map((entry) => {\n const sanitized = coerceJsonValue(\n redactSensitive(entry),\n maxTextLength,\n promptGuardEnabled,\n diagnostics,\n new WeakSet<object>()\n );\n if (!sanitized || typeof sanitized !== \"object\" || Array.isArray(sanitized)) {\n return { value: sanitized };\n }\n return sanitized as Record<string, JsonValue>;\n });\n};\n\nexport const resolveBlockerArtifactCaps = (\n partial: Partial<BlockerArtifactCaps> | undefined\n): BlockerArtifactCaps => {\n return {\n maxNetworkEvents: clampNumber(partial?.maxNetworkEvents ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxNetworkEvents, 1, 500),\n maxConsoleEvents: clampNumber(partial?.maxConsoleEvents ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxConsoleEvents, 1, 500),\n maxExceptionEvents: clampNumber(partial?.maxExceptionEvents ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxExceptionEvents, 1, 200),\n maxHosts: clampNumber(partial?.maxHosts ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxHosts, 1, 200),\n maxTextLength: clampNumber(partial?.maxTextLength ?? DEFAULT_BLOCKER_ARTIFACT_CAPS.maxTextLength, 32, 4096)\n };\n};\n\nexport const classifyBlockerSignal = (\n input: BlockerClassificationInput\n): BlockerSignalV1 | null => {\n const promptGuardEnabled = input.promptGuardEnabled ?? true;\n const titleSanitized = sanitizePromptGuardText(input.title ?? \"\", promptGuardEnabled);\n const messageSanitized = sanitizePromptGuardText(input.message ?? \"\", promptGuardEnabled);\n const matchedPatterns = boundedUniqueList(input.matchedPatterns, 16);\n const normalizedHosts = boundedUniqueList(input.networkHosts?.map(toLower), 20);\n\n const classification = classifyFromInputs({\n ...input,\n title: titleSanitized.text,\n message: messageSanitized.text\n }, normalizedHosts, matchedPatterns);\n if (!classification) {\n return null;\n }\n\n const threshold = clampThreshold(input.threshold);\n const confidence = clampBlockerConfidence(classification.confidence);\n if (confidence < threshold) {\n return null;\n }\n\n const evidence = {\n ...(input.url ? { url: clampText(input.url, 512) } : {}),\n ...(input.finalUrl ? { finalUrl: clampText(input.finalUrl, 512) } : {}),\n ...(titleSanitized.text ? { title: clampText(titleSanitized.text, 512) } : {}),\n ...(typeof input.status === \"number\" ? { status: input.status } : {}),\n ...(input.providerErrorCode ? { providerErrorCode: input.providerErrorCode } : {}),\n matchedPatterns: boundedUniqueList(classification.matches, 16),\n networkHosts: boundedUniqueList(normalizedHosts, 10),\n ...(input.traceRequestId ? { traceRequestId: input.traceRequestId } : {})\n };\n\n const sanitationEntries = titleSanitized.diagnostics.entries + messageSanitized.diagnostics.entries;\n const sanitationQuarantined = titleSanitized.diagnostics.quarantinedSegments + messageSanitized.diagnostics.quarantinedSegments;\n\n return {\n schemaVersion: \"1.0\",\n type: classification.type,\n source: input.source,\n ...(classification.reasonCode ? { reasonCode: classification.reasonCode } : {}),\n confidence,\n retryable: classification.retryable,\n detectedAt: input.detectedAt ?? new Date().toISOString(),\n evidence,\n actionHints: buildHints(classification.type),\n ...(sanitationEntries > 0 || sanitationQuarantined > 0\n ? {\n sanitation: {\n entries: sanitationEntries,\n quarantinedSegments: sanitationQuarantined\n }\n }\n : {})\n };\n};\n\nexport const buildBlockerArtifacts = (input: BlockerArtifactInput): BlockerArtifactsV1 => {\n const caps = resolveBlockerArtifactCaps(input.caps);\n const promptGuardEnabled = input.promptGuardEnabled ?? true;\n const diagnostics = {\n entries: 0,\n quarantinedSegments: 0\n };\n\n const network = coerceEventList(\n input.networkEvents,\n caps.maxNetworkEvents,\n caps.maxTextLength,\n promptGuardEnabled,\n diagnostics\n );\n const console = coerceEventList(\n input.consoleEvents,\n caps.maxConsoleEvents,\n caps.maxTextLength,\n promptGuardEnabled,\n diagnostics\n );\n const exception = coerceEventList(\n input.exceptionEvents,\n caps.maxExceptionEvents,\n caps.maxTextLength,\n promptGuardEnabled,\n diagnostics\n );\n\n const hosts = boundedUniqueList(\n network\n .map((event) => (typeof event.url === \"string\" ? extractHost(event.url) : null))\n .filter((host): host is string => typeof host === \"string\"),\n caps.maxHosts\n );\n\n return {\n schemaVersion: \"1.0\",\n network,\n console,\n exception,\n hosts,\n sanitation: diagnostics\n };\n};\n\nexport const __test__ = {\n classifyFromInputs,\n extractHost,\n hasAnyPattern,\n clampThreshold,\n isLoopbackHost\n};\n","export interface TimeboxInput {\n days?: number;\n from?: string;\n to?: string;\n now?: Date;\n allowDaysWithRange?: boolean;\n}\n\nexport interface ResolvedTimebox {\n mode: \"days\" | \"range\";\n days?: number;\n from: string;\n to: string;\n applied: true;\n}\n\nconst MAX_DAYS = 365;\n\nconst ensureIsoDate = (value: string, label: string): Date => {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) {\n throw new Error(`Invalid ${label} date: ${value}`);\n }\n return date;\n};\n\nconst clampDays = (days: number): number => {\n if (!Number.isFinite(days) || days <= 0) {\n throw new Error(\"days must be a positive number\");\n }\n return Math.min(MAX_DAYS, Math.floor(days));\n};\n\nexport const resolveTimebox = (input: TimeboxInput): ResolvedTimebox => {\n const now = input.now ?? new Date();\n const hasDays = typeof input.days === \"number\";\n const hasFrom = typeof input.from === \"string\" && input.from.trim().length > 0;\n const hasTo = typeof input.to === \"string\" && input.to.trim().length > 0;\n\n if (hasDays && (hasFrom || hasTo) && !input.allowDaysWithRange) {\n throw new Error(\"days cannot be combined with from/to\");\n }\n\n if (hasTo && !hasFrom && !hasDays) {\n throw new Error(\"to cannot be provided without from or days\");\n }\n\n if (hasDays) {\n const days = clampDays(input.days as number);\n const toDate = now;\n const fromDate = new Date(toDate.getTime() - days * 24 * 60 * 60 * 1000);\n return {\n mode: \"days\",\n days,\n from: fromDate.toISOString(),\n to: toDate.toISOString(),\n applied: true\n };\n }\n\n if (hasFrom) {\n const fromDate = ensureIsoDate(input.from as string, \"from\");\n const toDate = hasTo ? ensureIsoDate(input.to as string, \"to\") : now;\n if (fromDate.getTime() > toDate.getTime()) {\n throw new Error(\"from cannot be later than to\");\n }\n const diffMs = toDate.getTime() - fromDate.getTime();\n const days = Math.max(1, Math.ceil(diffMs / (24 * 60 * 60 * 1000)));\n return {\n mode: \"range\",\n days,\n from: fromDate.toISOString(),\n to: toDate.toISOString(),\n applied: true\n };\n }\n\n const defaultDays = 30;\n const toDate = now;\n const fromDate = new Date(toDate.getTime() - defaultDays * 24 * 60 * 60 * 1000);\n return {\n mode: \"days\",\n days: defaultDays,\n from: fromDate.toISOString(),\n to: toDate.toISOString(),\n applied: true\n };\n};\n\nexport const isWithinTimebox = (\n timestamp: string | undefined,\n timebox: ResolvedTimebox,\n now?: Date\n): boolean => {\n if (!timestamp) return false;\n const value = new Date(timestamp);\n if (Number.isNaN(value.getTime())) return false;\n const from = new Date(timebox.from).getTime();\n const to = new Date(timebox.to).getTime();\n const upperBound =\n timebox.mode === \"days\" ? Math.max(to, now?.getTime() ?? to) : to;\n const current = value.getTime();\n return current >= from && current <= upperBound;\n};\n\nexport const filterByTimebox = <T extends { timestamp?: string }>(\n records: T[],\n timebox: ResolvedTimebox,\n now?: Date\n): T[] => {\n return records.filter((record) =>\n isWithinTimebox(record.timestamp, timebox, now)\n );\n};\n","import type { JsonValue, NormalizedRecord, ProviderSource } from \"./types\";\nimport type { ResolvedTimebox } from \"./timebox\";\nimport { isWithinTimebox } from \"./timebox\";\n\nexport interface EngagementMetrics {\n likes: number;\n comments: number;\n views: number;\n upvotes: number;\n}\n\nexport interface RecencyMetadata {\n within_timebox: boolean;\n age_hours: number;\n}\n\nexport interface DateConfidenceMetadata {\n score: number;\n source: \"explicit\" | \"inferred\" | \"missing\";\n}\n\nexport interface ResearchRecord {\n id: string;\n source: ProviderSource;\n provider: string;\n url?: string;\n title?: string;\n content?: string;\n timestamp: string;\n confidence: number;\n engagement: EngagementMetrics;\n recency: RecencyMetadata;\n date_confidence: DateConfidenceMetadata;\n attributes: Record<string, JsonValue>;\n}\n\nconst asNumber = (value: JsonValue | undefined): number => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.max(0, value);\n }\n if (typeof value === \"string\" && value.trim()) {\n const normalized = value.replace(/,/g, \"\").trim();\n const parsed = Number(normalized);\n if (Number.isFinite(parsed)) {\n return Math.max(0, parsed);\n }\n }\n return 0;\n};\n\nconst readEngagement = (attributes: Record<string, JsonValue>): EngagementMetrics => {\n const nested = (attributes.engagement ?? {}) as Record<string, JsonValue>;\n return {\n likes: asNumber(nested.likes ?? attributes.likes),\n comments: asNumber(nested.comments ?? attributes.comments),\n views: asNumber(nested.views ?? attributes.views),\n upvotes: asNumber(nested.upvotes ?? attributes.upvotes)\n };\n};\n\nconst computeDateConfidence = (record: NormalizedRecord): DateConfidenceMetadata => {\n const timestamp = new Date(record.timestamp);\n if (!Number.isNaN(timestamp.getTime())) {\n return {\n score: 1,\n source: \"explicit\"\n };\n }\n\n const inferred = record.attributes.published_at;\n if (typeof inferred === \"string\" && !Number.isNaN(new Date(inferred).getTime())) {\n return {\n score: 0.6,\n source: \"inferred\"\n };\n }\n\n return {\n score: 0,\n source: \"missing\"\n };\n};\n\nconst computeRecency = (\n record: NormalizedRecord,\n timebox: ResolvedTimebox,\n now: Date\n): RecencyMetadata => {\n const parsed = new Date(record.timestamp);\n if (Number.isNaN(parsed.getTime())) {\n return {\n within_timebox: false,\n age_hours: Number.POSITIVE_INFINITY\n };\n }\n\n const ageHours = Math.max(0, (now.getTime() - parsed.getTime()) / (60 * 60 * 1000));\n return {\n within_timebox: isWithinTimebox(record.timestamp, timebox, now),\n age_hours: Number(ageHours.toFixed(2))\n };\n};\n\nexport const toResearchRecord = (\n record: NormalizedRecord,\n timebox: ResolvedTimebox,\n now: Date = new Date()\n): ResearchRecord => {\n const engagement = readEngagement(record.attributes);\n const recency = computeRecency(record, timebox, now);\n const dateConfidence = computeDateConfidence(record);\n\n const engagementJson = {\n likes: engagement.likes,\n comments: engagement.comments,\n views: engagement.views,\n upvotes: engagement.upvotes\n };\n const recencyJson = {\n within_timebox: recency.within_timebox,\n age_hours: recency.age_hours\n };\n const dateConfidenceJson = {\n score: dateConfidence.score,\n source: dateConfidence.source\n };\n\n return {\n id: record.id,\n source: record.source,\n provider: record.provider,\n ...(record.url ? { url: record.url } : {}),\n ...(record.title ? { title: record.title } : {}),\n ...(record.content ? { content: record.content } : {}),\n timestamp: record.timestamp,\n confidence: record.confidence,\n engagement,\n recency,\n date_confidence: dateConfidence,\n attributes: {\n ...record.attributes,\n engagement: engagementJson,\n recency: recencyJson,\n date_confidence: dateConfidenceJson\n }\n };\n};\n\nexport const enrichResearchRecords = (\n records: NormalizedRecord[],\n timebox: ResolvedTimebox,\n now: Date = new Date()\n): ResearchRecord[] => {\n return records.map((record) => toResearchRecord(record, timebox, now));\n};\n","import { canonicalizeUrl } from \"./web/crawler\";\nimport type { ResearchRecord } from \"./enrichment\";\n\nexport type RenderMode = \"compact\" | \"json\" | \"md\" | \"context\" | \"path\";\n\nexport interface ShoppingOffer {\n offer_id: string;\n product_id: string;\n provider: string;\n url: string;\n title: string;\n price: {\n amount: number;\n currency: string;\n retrieved_at: string;\n };\n shipping: {\n amount: number;\n currency: string;\n notes: string;\n };\n availability: \"in_stock\" | \"limited\" | \"out_of_stock\" | \"unknown\";\n rating: number;\n reviews_count: number;\n deal_score: number;\n attributes: Record<string, unknown>;\n}\n\nconst toCurrency = (value: number): string => `$${value.toFixed(2)}`;\n\nconst compactResearchLines = (records: ResearchRecord[]): string[] => {\n if (records.length === 0) {\n return [\"No records matched the requested timebox.\"];\n }\n return records.slice(0, 10).map((record, index) => {\n const title = record.title ?? record.url ?? record.provider;\n const engagement = record.engagement.likes + record.engagement.comments + record.engagement.upvotes;\n return `${index + 1}. ${title} (${record.source}/${record.provider}) score=${record.confidence.toFixed(2)} engagement=${engagement}`;\n });\n};\n\nexport const renderResearch = (args: {\n mode: RenderMode;\n topic: string;\n records: ResearchRecord[];\n meta: Record<string, unknown>;\n}): {\n response: Record<string, unknown>;\n files: Array<{ path: string; content: string | Record<string, unknown> }>;\n} => {\n const lines = compactResearchLines(args.records);\n const summary = lines.join(\"\\n\");\n const markdown = [\n `# Research: ${args.topic}`,\n \"\",\n ...lines,\n \"\",\n \"## Metadata\",\n \"```json\",\n JSON.stringify(args.meta, null, 2),\n \"```\"\n ].join(\"\\n\");\n const contextPayload = {\n topic: args.topic,\n highlights: lines,\n records: args.records,\n meta: args.meta\n };\n\n const files = [\n { path: \"summary.md\", content: markdown },\n { path: \"records.json\", content: { records: args.records } },\n { path: \"context.json\", content: contextPayload },\n { path: \"meta.json\", content: args.meta }\n ];\n\n if (args.mode === \"compact\") {\n return {\n response: {\n mode: args.mode,\n summary,\n meta: args.meta\n },\n files\n };\n }\n if (args.mode === \"json\") {\n return {\n response: {\n mode: args.mode,\n records: args.records,\n meta: args.meta\n },\n files\n };\n }\n if (args.mode === \"md\") {\n return {\n response: {\n mode: args.mode,\n markdown,\n meta: args.meta\n },\n files\n };\n }\n\n if (args.mode === \"context\") {\n return {\n response: {\n mode: args.mode,\n context: contextPayload,\n meta: args.meta\n },\n files\n };\n }\n\n return {\n response: {\n mode: \"path\",\n meta: args.meta\n },\n files\n };\n};\n\nconst toComparisonCsv = (offers: ShoppingOffer[]): string => {\n const header = [\"provider\", \"title\", \"price\", \"shipping\", \"deal_score\", \"availability\", \"url\"].join(\",\");\n const rows = offers.map((offer) => {\n return [\n offer.provider,\n JSON.stringify(offer.title),\n offer.price.amount.toFixed(2),\n offer.shipping.amount.toFixed(2),\n offer.deal_score.toFixed(4),\n offer.availability,\n canonicalizeUrl(offer.url)\n ].join(\",\");\n });\n return [header, ...rows].join(\"\\n\");\n};\n\nconst compactShoppingLines = (offers: ShoppingOffer[]): string[] => {\n if (offers.length === 0) {\n return [\"No offers available from the selected providers.\"];\n }\n return offers.slice(0, 10).map((offer, index) => {\n const total = offer.price.amount + offer.shipping.amount;\n return `${index + 1}. ${offer.title} - ${toCurrency(total)} (${offer.provider}, deal=${offer.deal_score.toFixed(2)})`;\n });\n};\n\nexport const renderShopping = (args: {\n mode: RenderMode;\n query: string;\n offers: ShoppingOffer[];\n meta: Record<string, unknown>;\n}): {\n response: Record<string, unknown>;\n files: Array<{ path: string; content: string | Record<string, unknown> }>;\n} => {\n const lines = compactShoppingLines(args.offers);\n const markdown = [\n `# Shopping: ${args.query}`,\n \"\",\n ...lines,\n \"\",\n \"## Metadata\",\n \"```json\",\n JSON.stringify(args.meta, null, 2),\n \"```\"\n ].join(\"\\n\");\n\n const comparisonCsv = toComparisonCsv(args.offers);\n const contextPayload = {\n query: args.query,\n highlights: lines,\n offers: args.offers,\n meta: args.meta\n };\n\n const files = [\n { path: \"deals.md\", content: markdown },\n { path: \"offers.json\", content: { offers: args.offers } },\n { path: \"comparison.csv\", content: comparisonCsv },\n { path: \"meta.json\", content: args.meta },\n { path: \"deals-context.json\", content: contextPayload }\n ];\n\n if (args.mode === \"compact\") {\n return {\n response: {\n mode: args.mode,\n summary: lines.join(\"\\n\"),\n meta: args.meta\n },\n files\n };\n }\n if (args.mode === \"json\") {\n return {\n response: {\n mode: args.mode,\n offers: args.offers,\n meta: args.meta\n },\n files\n };\n }\n if (args.mode === \"md\") {\n return {\n response: {\n mode: args.mode,\n markdown,\n meta: args.meta\n },\n files\n };\n }\n if (args.mode === \"context\") {\n return {\n response: {\n mode: args.mode,\n context: contextPayload,\n meta: args.meta\n },\n files\n };\n }\n\n return {\n response: {\n mode: \"path\",\n meta: args.meta\n },\n files\n };\n};\n","import { mkdir, readdir, readFile, rm, stat, writeFile } from \"fs/promises\";\nimport { dirname, join, resolve } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { tmpdir } from \"os\";\n\nexport const DEFAULT_ARTIFACT_TTL_HOURS = 72;\nexport const MAX_ARTIFACT_TTL_HOURS = 168;\n\ntype ArtifactContent = string | Buffer | Record<string, unknown>;\n\nexport interface ArtifactFile {\n path: string;\n content: ArtifactContent;\n}\n\nexport interface ArtifactManifest {\n run_id: string;\n created_at: string;\n ttl_hours: number;\n expires_at: string;\n files: string[];\n}\n\nexport interface ArtifactBundle {\n runId: string;\n basePath: string;\n manifest: ArtifactManifest;\n manifestFileName: string;\n}\n\nconst clampTtlHours = (value: number | undefined): number => {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) {\n return DEFAULT_ARTIFACT_TTL_HOURS;\n }\n return Math.min(MAX_ARTIFACT_TTL_HOURS, Math.floor(value));\n};\n\nconst serializeContent = (content: ArtifactContent): string | Buffer => {\n if (typeof content === \"string\" || Buffer.isBuffer(content)) {\n return content;\n }\n return `${JSON.stringify(content, null, 2)}\\n`;\n};\n\nexport const createArtifactBundle = async (args: {\n namespace: string;\n files: ArtifactFile[];\n outputDir?: string;\n ttlHours?: number;\n manifestFileName?: string;\n now?: Date;\n}): Promise<ArtifactBundle> => {\n const runId = randomUUID();\n const now = args.now ?? new Date();\n const ttlHours = clampTtlHours(args.ttlHours);\n const manifestFileName = args.manifestFileName ?? \"bundle-manifest.json\";\n const expiresAt = new Date(now.getTime() + ttlHours * 60 * 60 * 1000);\n const root = args.outputDir ? resolve(args.outputDir) : join(tmpdir(), \"opendevbrowser\");\n const basePath = join(root, args.namespace, runId);\n\n await mkdir(basePath, { recursive: true, mode: 0o700 });\n\n const writtenFiles: string[] = [];\n for (const file of args.files) {\n const filePath = join(basePath, file.path);\n const directory = dirname(filePath);\n if (directory && directory !== basePath) {\n await mkdir(directory, { recursive: true, mode: 0o700 });\n }\n await writeFile(filePath, serializeContent(file.content), { mode: 0o600 });\n writtenFiles.push(file.path);\n }\n\n const manifest: ArtifactManifest = {\n run_id: runId,\n created_at: now.toISOString(),\n ttl_hours: ttlHours,\n expires_at: expiresAt.toISOString(),\n files: [...writtenFiles, manifestFileName]\n };\n\n await writeFile(join(basePath, manifestFileName), `${JSON.stringify(manifest, null, 2)}\\n`, { mode: 0o600 });\n\n return {\n runId,\n basePath,\n manifest,\n manifestFileName\n };\n};\n\nconst isExpired = (manifest: ArtifactManifest, now: Date): boolean => {\n const expiry = new Date(manifest.expires_at);\n if (Number.isNaN(expiry.getTime())) return false;\n return expiry.getTime() <= now.getTime();\n};\n\nexport const cleanupExpiredArtifacts = async (\n rootDir: string,\n now: Date = new Date()\n): Promise<{ removed: string[]; skipped: string[] }> => {\n const removed: string[] = [];\n const skipped: string[] = [];\n\n let namespaces: string[] = [];\n try {\n namespaces = await readdir(rootDir);\n } catch {\n return { removed, skipped };\n }\n\n for (const namespace of namespaces) {\n const namespacePath = join(rootDir, namespace);\n let runs: string[] = [];\n try {\n runs = await readdir(namespacePath);\n } catch {\n continue;\n }\n\n for (const run of runs) {\n const runPath = join(namespacePath, run);\n const manifestCandidates = [join(runPath, \"bundle-manifest.json\"), join(runPath, \"manifest.json\")];\n try {\n let manifestPath: string | null = null;\n for (const candidate of manifestCandidates) {\n try {\n const candidateMetadata = await stat(candidate);\n if (candidateMetadata.isFile()) {\n manifestPath = candidate;\n break;\n }\n } catch {\n // try next manifest path\n }\n }\n if (!manifestPath) {\n skipped.push(runPath);\n continue;\n }\n\n const metadata = await stat(manifestPath);\n if (!metadata.isFile()) {\n skipped.push(runPath);\n continue;\n }\n const manifestRaw = await readFile(manifestPath, \"utf8\");\n const manifest = JSON.parse(manifestRaw) as ArtifactManifest;\n if (isExpired(manifest, now)) {\n await rm(runPath, { recursive: true, force: true });\n removed.push(runPath);\n } else {\n skipped.push(runPath);\n }\n } catch {\n skipped.push(runPath);\n }\n }\n }\n\n return { removed, skipped };\n};\n","import { createHash } from \"crypto\";\nimport { createArtifactBundle, type ArtifactFile } from \"./artifacts\";\nimport { enrichResearchRecords, type ResearchRecord } from \"./enrichment\";\nimport { renderResearch, renderShopping, type RenderMode, type ShoppingOffer } from \"./renderer\";\nimport { filterByTimebox, resolveTimebox } from \"./timebox\";\nimport {\n SHOPPING_PROVIDER_IDS,\n SHOPPING_PROVIDER_PROFILES,\n validateShoppingLegalReviewChecklist\n} from \"./shopping\";\nimport { createLogger, redactSensitive } from \"../core/logging\";\nimport { normalizeProviderReasonCode } from \"./errors\";\nimport { providerRequestHeaders } from \"./shared/request-headers\";\nimport { canonicalizeUrl } from \"./web/crawler\";\nimport { toSnippet } from \"./web/extract\";\nimport type {\n JsonValue,\n NormalizedRecord,\n ProviderAggregateResult,\n ProviderCallResultByOperation,\n ProviderCookiePolicy,\n ProviderError,\n ProviderFailureEntry,\n ProviderReasonCode,\n ProviderRunOptions,\n ProviderSelection,\n ProviderSource\n} from \"./types\";\n\nexport interface ProviderExecutor {\n search: (\n input: ProviderCallResultByOperation[\"search\"],\n options?: ProviderRunOptions\n ) => Promise<ProviderAggregateResult>;\n fetch: (\n input: ProviderCallResultByOperation[\"fetch\"],\n options?: ProviderRunOptions\n ) => Promise<ProviderAggregateResult>;\n}\n\nexport interface ResearchRunInput {\n topic: string;\n days?: number;\n from?: string;\n to?: string;\n sourceSelection?: ProviderSelection;\n sources?: ProviderSource[];\n mode: RenderMode;\n includeEngagement?: boolean;\n limitPerSource?: number;\n outputDir?: string;\n ttlHours?: number;\n useCookies?: boolean;\n cookiePolicyOverride?: ProviderCookiePolicy;\n}\n\nexport interface ShoppingRunInput {\n query: string;\n providers?: string[];\n budget?: number;\n region?: string;\n sort?: \"best_deal\" | \"lowest_price\" | \"highest_rating\" | \"fastest_shipping\";\n mode: RenderMode;\n timeoutMs?: number;\n outputDir?: string;\n ttlHours?: number;\n useCookies?: boolean;\n cookiePolicyOverride?: ProviderCookiePolicy;\n}\n\nexport interface ProductVideoRunInput {\n product_url?: string;\n product_name?: string;\n provider_hint?: string;\n include_screenshots?: boolean;\n include_all_images?: boolean;\n include_copy?: boolean;\n output_dir?: string;\n ttl_hours?: number;\n useCookies?: boolean;\n cookiePolicyOverride?: ProviderCookiePolicy;\n}\n\nexport interface ProductVideoWorkflowOptions {\n captureScreenshot?: (url: string) => Promise<Buffer | null>;\n}\n\ntype ProviderSignal = \"ok\" | \"anti_bot_challenge\" | \"rate_limited\" | \"transcript_unavailable\";\ntype TrackedSignal = Exclude<ProviderSignal, \"ok\">;\ntype AlertState = \"none\" | \"warning\" | \"degraded\";\n\ntype ProviderSignalState = {\n entries: ProviderSignal[];\n previousWindowRates: Record<TrackedSignal, number>;\n signalState: Record<TrackedSignal, AlertState>;\n healthyWindows: Record<TrackedSignal, number>;\n};\n\nconst SIGNAL_WINDOW = 50;\nconst RECOVERY_WINDOWS_REQUIRED = 2;\nconst providerSignalMap = new Map<string, ProviderSignalState>();\nconst workflowLogger = createLogger(\"provider-workflows\");\n\nconst detectSignal = (error: ProviderError): ProviderSignal | null => {\n const reasonCode = error.reasonCode\n ?? normalizeProviderReasonCode({\n code: error.code,\n message: error.message,\n details: error.details\n });\n if (reasonCode === \"rate_limited\") return \"rate_limited\";\n if (reasonCode === \"challenge_detected\" || /captcha|challenge|anti.?bot|cf_chl/i.test(error.message)) {\n return \"anti_bot_challenge\";\n }\n if (reasonCode === \"transcript_unavailable\" || reasonCode === \"caption_missing\") {\n return \"transcript_unavailable\";\n }\n return null;\n};\n\nconst trackProviderSignals = (result: ProviderAggregateResult): void => {\n const failureByProvider = new Map<string, ProviderFailureEntry>();\n for (const failure of result.failures) {\n failureByProvider.set(failure.provider, failure);\n }\n\n for (const providerId of result.providerOrder) {\n const failure = failureByProvider.get(providerId);\n const signal = failure ? detectSignal(failure.error) ?? \"ok\" : \"ok\";\n const state = providerSignalMap.get(providerId) ?? {\n entries: [],\n previousWindowRates: {\n anti_bot_challenge: 0,\n rate_limited: 0,\n transcript_unavailable: 0\n },\n signalState: {\n anti_bot_challenge: \"none\",\n rate_limited: \"none\",\n transcript_unavailable: \"none\"\n },\n healthyWindows: {\n anti_bot_challenge: 0,\n rate_limited: 0,\n transcript_unavailable: 0\n }\n };\n state.entries.push(signal);\n if (state.entries.length > SIGNAL_WINDOW) {\n state.entries.splice(0, state.entries.length - SIGNAL_WINDOW);\n }\n providerSignalMap.set(providerId, state);\n }\n};\n\nconst isStagedAutoExclusionCandidate = (providerId: string): boolean => {\n return providerId === \"social/youtube\" || providerId.startsWith(\"shopping/\");\n};\n\nconst nextSignalState = (\n previous: AlertState,\n warning: boolean,\n degraded: boolean,\n healthyWindows: number\n): { state: AlertState; healthyWindows: number } => {\n if (degraded) {\n return { state: \"degraded\", healthyWindows: 0 };\n }\n if (warning) {\n return { state: \"warning\", healthyWindows: 0 };\n }\n\n const nextHealthyWindows = healthyWindows + 1;\n if (previous === \"degraded\" && nextHealthyWindows < RECOVERY_WINDOWS_REQUIRED) {\n return { state: \"degraded\", healthyWindows: nextHealthyWindows };\n }\n return { state: \"none\", healthyWindows: nextHealthyWindows };\n};\n\nconst buildAlerts = (): Array<Record<string, JsonValue>> => {\n const alerts: Array<Record<string, JsonValue>> = [];\n\n for (const [provider, state] of providerSignalMap.entries()) {\n const total = state.entries.length;\n if (total === 0) continue;\n\n for (const signal of [\"anti_bot_challenge\", \"rate_limited\", \"transcript_unavailable\"] as const) {\n const signalCount = state.entries.filter((entry) => entry === signal).length;\n const ratio = signalCount / total;\n\n let consecutive = 0;\n for (let index = state.entries.length - 1; index >= 0; index -= 1) {\n if (state.entries[index] !== signal) break;\n consecutive += 1;\n }\n\n const warning = ratio >= 0.15 || consecutive >= 3;\n const degraded = ratio >= 0.25 && state.previousWindowRates[signal] >= 0.25;\n state.previousWindowRates[signal] = ratio;\n\n const previousState = state.signalState[signal];\n const nextState = nextSignalState(previousState, warning, degraded, state.healthyWindows[signal]);\n state.signalState[signal] = nextState.state;\n state.healthyWindows[signal] = nextState.healthyWindows;\n\n if (\n (nextState.state === \"warning\" || nextState.state === \"degraded\")\n && nextState.state !== previousState\n ) {\n const transitionReason = degraded\n ? \"signal ratio >= 25% for two consecutive windows\"\n : consecutive >= 3\n ? \"3 consecutive events detected\"\n : \"signal ratio >= 15%\";\n workflowLogger.warn(\"provider.signal.transition\", {\n data: {\n provider,\n signal,\n previous_state: previousState,\n next_state: nextState.state,\n window_total: total,\n signal_count: signalCount,\n ratio: Number(ratio.toFixed(4)),\n consecutive,\n reason: transitionReason\n }\n });\n }\n\n if (nextState.state === \"none\") continue;\n\n alerts.push({\n provider,\n signal,\n reasonCode: signal === \"anti_bot_challenge\"\n ? \"challenge_detected\"\n : signal === \"rate_limited\"\n ? \"rate_limited\"\n : \"transcript_unavailable\",\n state: nextState.state,\n window_total: total,\n signal_count: signalCount,\n ratio: Number(ratio.toFixed(4)),\n consecutive,\n reason: nextState.state === \"degraded\" && !degraded\n ? `waiting for ${RECOVERY_WINDOWS_REQUIRED} healthy windows before recovery`\n : degraded\n ? \"signal ratio >= 25% for two consecutive windows\"\n : consecutive >= 3\n ? \"3 consecutive events detected\"\n : \"signal ratio >= 15%\"\n });\n }\n }\n\n return alerts;\n};\n\nconst getDegradedProviders = (): Set<string> => {\n const degradedProviders = new Set<string>();\n for (const [provider, state] of providerSignalMap.entries()) {\n if (!isStagedAutoExclusionCandidate(provider)) continue;\n if (state.signalState.anti_bot_challenge === \"degraded\" || state.signalState.rate_limited === \"degraded\") {\n degradedProviders.add(provider);\n }\n }\n return degradedProviders;\n};\n\nconst toProviderSource = (providerId: string): ProviderSource | null => {\n if (providerId.startsWith(\"web/\")) return \"web\";\n if (providerId.startsWith(\"community/\")) return \"community\";\n if (providerId.startsWith(\"social/\")) return \"social\";\n if (providerId.startsWith(\"shopping/\")) return \"shopping\";\n return null;\n};\n\nconst resolveAutoExcludedProviders = (\n sourceSelection: ProviderSelection,\n resolvedSources: ProviderSource[]\n): string[] => {\n if (sourceSelection !== \"auto\") return [];\n const sourceSet = new Set(resolvedSources);\n return [...getDegradedProviders()]\n .filter((provider) => {\n const source = toProviderSource(provider);\n return source !== null && sourceSet.has(source);\n })\n .sort((left, right) => left.localeCompare(right));\n};\n\nconst removeExcludedProviders = <T extends { provider: string }>(\n items: T[],\n excludedProviders: Set<string>\n): T[] => {\n if (excludedProviders.size === 0) return items;\n return items.filter((item) => !excludedProviders.has(item.provider));\n};\n\nconst redactRawCapture = (record: Record<string, unknown>): Record<string, unknown> => {\n const redacted = redactSensitive(record);\n if (!redacted || typeof redacted !== \"object\" || Array.isArray(redacted)) {\n return {};\n }\n return redacted as Record<string, unknown>;\n};\n\nconst withExcludedProviders = (\n selection: { source_selection: ProviderSelection; resolved_sources: ProviderSource[] },\n excludedProviders: string[]\n): { source_selection: ProviderSelection; resolved_sources: ProviderSource[]; excluded_providers?: string[] } => {\n if (excludedProviders.length === 0) return selection;\n return {\n ...selection,\n excluded_providers: excludedProviders\n };\n};\n\nconst withCookieOverrides = (\n options: ProviderRunOptions,\n input: { useCookies?: boolean; cookiePolicyOverride?: ProviderCookiePolicy }\n): ProviderRunOptions => {\n return {\n ...options,\n ...(typeof input.useCookies === \"boolean\" ? { useCookies: input.useCookies } : {}),\n ...(input.cookiePolicyOverride ? { cookiePolicyOverride: input.cookiePolicyOverride } : {})\n };\n};\n\nconst detectFailureReasonCode = (failure: ProviderFailureEntry): ProviderReasonCode | undefined => {\n return failure.error.reasonCode\n ?? normalizeProviderReasonCode({\n code: failure.error.code,\n message: failure.error.message,\n details: failure.error.details\n });\n};\n\nconst summarizeReasonCodeDistribution = (failures: ProviderFailureEntry[]): Record<string, number> => {\n const counts = new Map<string, number>();\n for (const failure of failures) {\n const reasonCode = detectFailureReasonCode(failure);\n if (!reasonCode) continue;\n counts.set(reasonCode, (counts.get(reasonCode) ?? 0) + 1);\n }\n return Object.fromEntries([...counts.entries()].sort(([left], [right]) => left.localeCompare(right)));\n};\n\nconst summarizeTranscriptStrategyFailures = (failures: ProviderFailureEntry[]): Record<string, number> => {\n const counts = new Map<string, number>();\n for (const failure of failures) {\n const attemptChain = failure.error.details?.attemptChain;\n if (!Array.isArray(attemptChain)) continue;\n for (const item of attemptChain) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) continue;\n const strategy = (item as Record<string, unknown>).strategy;\n const reasonCode = (item as Record<string, unknown>).reasonCode;\n if (typeof strategy !== \"string\" || typeof reasonCode !== \"string\") continue;\n const key = `${strategy}:${reasonCode}`;\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n }\n return Object.fromEntries([...counts.entries()].sort(([left], [right]) => left.localeCompare(right)));\n};\n\nconst summarizeTranscriptStrategyDetailDistribution = (records: NormalizedRecord[]): Record<string, number> => {\n const counts = new Map<string, number>();\n for (const record of records) {\n const strategyDetail = record.attributes.transcript_strategy_detail;\n const transcriptStrategy = record.attributes.transcript_strategy;\n const resolved = typeof strategyDetail === \"string\" && strategyDetail.trim().length > 0\n ? strategyDetail\n : typeof transcriptStrategy === \"string\" && transcriptStrategy.trim().length > 0\n ? transcriptStrategy\n : null;\n if (!resolved) continue;\n counts.set(resolved, (counts.get(resolved) ?? 0) + 1);\n }\n return Object.fromEntries([...counts.entries()].sort(([left], [right]) => left.localeCompare(right)));\n};\n\nconst TRANSCRIPT_REASON_CODES = new Set<ProviderReasonCode>([\n \"caption_missing\",\n \"transcript_unavailable\",\n \"strategy_unapproved\"\n]);\n\nconst ANTI_BOT_REASON_CODES = new Set<ProviderReasonCode>([\n \"ip_blocked\",\n \"token_required\",\n \"auth_required\",\n \"challenge_detected\",\n \"rate_limited\",\n \"cooldown_active\"\n]);\n\nconst summarizeCookieDiagnostics = (\n failures: ProviderFailureEntry[],\n records: NormalizedRecord[]\n): Array<Record<string, JsonValue>> => {\n const diagnostics: Array<Record<string, JsonValue>> = [];\n for (const failure of failures) {\n const candidate = failure.error.details?.cookieDiagnostics;\n if (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) continue;\n diagnostics.push({\n provider: failure.provider,\n source: failure.source,\n ...(detectFailureReasonCode(failure) ? { reasonCode: detectFailureReasonCode(failure) as JsonValue } : {}),\n ...(candidate as Record<string, JsonValue>)\n });\n }\n\n for (const record of records) {\n const candidate = record.attributes.browser_fallback_cookie_diagnostics;\n if (!candidate || typeof candidate !== \"object\" || Array.isArray(candidate)) continue;\n diagnostics.push({\n provider: record.provider,\n source: record.source,\n ...(candidate as Record<string, JsonValue>)\n });\n }\n\n for (const record of records) {\n const attemptChain = record.attributes.attempt_chain;\n if (!Array.isArray(attemptChain)) continue;\n for (const attempt of attemptChain) {\n if (!attempt || typeof attempt !== \"object\" || Array.isArray(attempt)) continue;\n const cookieDiagnostics = (attempt as Record<string, unknown>).cookieDiagnostics;\n if (!cookieDiagnostics || typeof cookieDiagnostics !== \"object\" || Array.isArray(cookieDiagnostics)) continue;\n diagnostics.push({\n provider: record.provider,\n source: record.source,\n ...(cookieDiagnostics as Record<string, JsonValue>)\n });\n }\n }\n return diagnostics;\n};\n\nconst hasTranscriptSuccess = (record: NormalizedRecord): boolean => {\n const transcriptAvailable = record.attributes.transcript_available;\n if (transcriptAvailable === true) return true;\n const transcriptStrategy = record.attributes.transcript_strategy;\n return typeof transcriptStrategy === \"string\" && transcriptStrategy.trim().length > 0;\n};\n\nconst summarizeTranscriptDurability = (\n records: NormalizedRecord[],\n failures: ProviderFailureEntry[]\n): {\n attempted: number;\n successful: number;\n failed: number;\n success_rate: number;\n} => {\n const successful = records.filter((record) => hasTranscriptSuccess(record)).length;\n const failed = failures.filter((failure) => {\n const reasonCode = detectFailureReasonCode(failure);\n if (reasonCode && TRANSCRIPT_REASON_CODES.has(reasonCode)) return true;\n return Array.isArray(failure.error.details?.attemptChain);\n }).length;\n const attempted = successful + failed;\n return {\n attempted,\n successful,\n failed,\n success_rate: attempted > 0 ? Number((successful / attempted).toFixed(4)) : 0\n };\n};\n\nconst summarizeAntiBotPressure = (failures: ProviderFailureEntry[]): {\n total_failures: number;\n anti_bot_failures: number;\n anti_bot_failure_ratio: number;\n} => {\n const totalFailures = failures.length;\n const antiBotFailures = failures.filter((failure) => {\n const reasonCode = detectFailureReasonCode(failure);\n return Boolean(reasonCode && ANTI_BOT_REASON_CODES.has(reasonCode));\n }).length;\n return {\n total_failures: totalFailures,\n anti_bot_failures: antiBotFailures,\n anti_bot_failure_ratio: totalFailures > 0 ? Number((antiBotFailures / totalFailures).toFixed(4)) : 0\n };\n};\n\nexport const workflowTestUtils = {\n resetProviderSignalState: (): void => {\n providerSignalMap.clear();\n },\n getDegradedProviders: (): string[] => [...getDegradedProviders()],\n nextSignalState: (\n previous: \"none\" | \"warning\" | \"degraded\",\n warning: boolean,\n degraded: boolean,\n healthyWindows: number\n ): { state: \"none\" | \"warning\" | \"degraded\"; healthyWindows: number } =>\n nextSignalState(previous, warning, degraded, healthyWindows),\n redactRawCapture: (record: unknown): Record<string, unknown> =>\n redactRawCapture(record as Record<string, unknown>),\n toProviderSource: (providerId: string): ProviderSource | null => toProviderSource(providerId),\n resolveShoppingProviderIdForUrl: (url: string): string | null => resolveShoppingProviderIdForUrl(url),\n fetchBinary: (url: string): Promise<Buffer | null> => fetchBinary(url),\n rankResearchRecords: (records: ResearchRecord[]): ResearchRecord[] => rankResearchRecords(records)\n};\n\nconst RESEARCH_AUTO_SOURCES: ProviderSource[] = [\"web\", \"community\", \"social\"];\nconst RESEARCH_ALL_SOURCES: ProviderSource[] = [\"web\", \"community\", \"social\", \"shopping\"];\n\nconst resolveResearchSources = (input: ResearchRunInput): { sourceSelection: ProviderSelection; resolved: ProviderSource[] } => {\n if (input.sources && input.sources.length > 0) {\n const deduped = [...new Set(input.sources)];\n return {\n sourceSelection: input.sourceSelection ?? \"auto\",\n resolved: deduped\n };\n }\n\n const selection = input.sourceSelection ?? \"auto\";\n if (selection === \"all\") {\n return { sourceSelection: selection, resolved: RESEARCH_ALL_SOURCES };\n }\n if (selection === \"auto\") {\n return { sourceSelection: selection, resolved: RESEARCH_AUTO_SOURCES };\n }\n return {\n sourceSelection: selection,\n resolved: [selection]\n };\n};\n\nconst toDedupeKey = (record: { url?: string; title?: string }): string => {\n const url = record.url ? canonicalizeUrl(record.url) : \"\";\n const title = (record.title ?? \"\").trim().toLowerCase();\n return `${url}::${title}`;\n};\n\nconst dedupeResearchRecords = (records: ResearchRecord[]): ResearchRecord[] => {\n const deduped = new Map<string, ResearchRecord>();\n for (const record of records) {\n const key = toDedupeKey(record);\n if (!deduped.has(key)) {\n deduped.set(key, record);\n continue;\n }\n\n const existing = deduped.get(key);\n if (!existing) continue;\n const existingScore = (existing.date_confidence.score * 2) + existing.confidence - existing.recency.age_hours * 0.001;\n const nextScore = (record.date_confidence.score * 2) + record.confidence - record.recency.age_hours * 0.001;\n if (nextScore > existingScore) {\n deduped.set(key, record);\n }\n }\n return [...deduped.values()];\n};\n\nconst rankResearchRecords = (records: ResearchRecord[]): ResearchRecord[] => {\n return [...records].sort((left, right) => {\n if (left.recency.within_timebox !== right.recency.within_timebox) {\n return left.recency.within_timebox ? -1 : 1;\n }\n if (left.date_confidence.score !== right.date_confidence.score) {\n return right.date_confidence.score - left.date_confidence.score;\n }\n if (left.recency.age_hours !== right.recency.age_hours) {\n return left.recency.age_hours - right.recency.age_hours;\n }\n if (left.confidence !== right.confidence) {\n return right.confidence - left.confidence;\n }\n return left.id.localeCompare(right.id);\n });\n};\n\nconst hash = (value: string): string => createHash(\"sha1\").update(value).digest(\"hex\").slice(0, 16);\n\nconst asNumber = (value: unknown): number => {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value.replace(/,/g, \"\"));\n if (Number.isFinite(parsed)) return parsed;\n }\n return 0;\n};\n\nconst parsePriceFromContent = (content: string | undefined): { amount: number; currency: string } => {\n if (!content) return { amount: 0, currency: \"USD\" };\n const match = content.match(/([$€£])\\s*([0-9]{1,3}(?:[.,][0-9]{3})*(?:[.,][0-9]{1,2})?)/);\n if (!match) return { amount: 0, currency: \"USD\" };\n const currency = match[1] === \"€\" ? \"EUR\" : match[1] === \"£\" ? \"GBP\" : \"USD\";\n const amount = Number((match[2] ?? \"0\").replace(/,/g, \"\"));\n return {\n amount: Number.isFinite(amount) ? amount : 0,\n currency\n };\n};\n\nconst availabilityRank = (availability: ShoppingOffer[\"availability\"]): number => {\n switch (availability) {\n case \"in_stock\":\n return 1;\n case \"limited\":\n return 0.75;\n case \"unknown\":\n return 0.45;\n case \"out_of_stock\":\n return 0.1;\n }\n};\n\nconst computeDealScore = (offer: ShoppingOffer, now: Date): number => {\n const total = Math.max(0, offer.price.amount + offer.shipping.amount);\n const priceScore = total > 0 ? 1 / (1 + total / 100) : 0.5;\n const availabilityScore = availabilityRank(offer.availability);\n const ratingScore = Math.max(0, Math.min(1, offer.rating / 5));\n const recencyHours = Math.max(0, (now.getTime() - new Date(offer.price.retrieved_at).getTime()) / (60 * 60 * 1000));\n const recencyScore = 1 / (1 + recencyHours / 24);\n const score = (priceScore * 0.55) + (availabilityScore * 0.2) + (ratingScore * 0.15) + (recencyScore * 0.1);\n return Number(score.toFixed(6));\n};\n\nconst resolveShoppingProviders = (providers?: string[]): string[] => {\n if (!providers || providers.length === 0) {\n return [...SHOPPING_PROVIDER_IDS];\n }\n\n const normalized = providers\n .map((provider) => provider.trim().toLowerCase())\n .filter(Boolean)\n .map((provider) => provider.startsWith(\"shopping/\") ? provider : `shopping/${provider}`);\n\n const deduped = [...new Set(normalized)].filter((provider) => SHOPPING_PROVIDER_IDS.includes(provider as (typeof SHOPPING_PROVIDER_IDS)[number]));\n if (deduped.length === 0) {\n throw new Error(\"No valid shopping providers were requested\");\n }\n return deduped;\n};\n\nconst enforceShoppingLegalReviewGate = (providerIds: string[], now: Date): void => {\n const blocked = providerIds\n .map((providerId) => ({ providerId, validation: validateShoppingLegalReviewChecklist(providerId, now) }))\n .filter((entry) => !entry.validation.valid);\n\n if (blocked.length === 0) return;\n const summary = blocked\n .map((entry) => `${entry.providerId}:${entry.validation.reasonCode ?? \"missing_checklist\"}`)\n .join(\", \");\n throw new Error(`Provider legal review checklist invalid or expired: ${summary}`);\n};\n\nconst resolveShoppingProviderIdForUrl = (url: string): string | null => {\n try {\n const host = new URL(url).hostname.toLowerCase();\n for (const profile of SHOPPING_PROVIDER_PROFILES) {\n if (profile.domains.some((domain) => host === domain || host.endsWith(`.${domain}`))) {\n return profile.id;\n }\n }\n return \"shopping/others\";\n } catch {\n return null;\n }\n};\n\nconst extractShoppingOffer = (record: NormalizedRecord, now: Date): ShoppingOffer => {\n const nested = (record.attributes.shopping_offer ?? {}) as Record<string, unknown>;\n const nestedPrice = (nested.price ?? {}) as Record<string, unknown>;\n const nestedShipping = (nested.shipping ?? {}) as Record<string, unknown>;\n\n const fallbackPrice = parsePriceFromContent(record.content);\n const priceAmount = asNumber(nestedPrice.amount) || fallbackPrice.amount;\n const priceCurrency = typeof nestedPrice.currency === \"string\" && nestedPrice.currency.trim()\n ? nestedPrice.currency\n : fallbackPrice.currency;\n const retrievedAt = typeof nestedPrice.retrieved_at === \"string\" && nestedPrice.retrieved_at.trim()\n ? nestedPrice.retrieved_at\n : now.toISOString();\n\n const title = (typeof nested.title === \"string\" && nested.title.trim())\n ? nested.title\n : record.title ?? record.url ?? record.provider;\n const url = (typeof nested.url === \"string\" && nested.url.trim())\n ? nested.url\n : record.url ?? \"\";\n\n const shippingAmount = asNumber(nestedShipping.amount);\n const shippingCurrency = typeof nestedShipping.currency === \"string\" && nestedShipping.currency.trim()\n ? nestedShipping.currency\n : priceCurrency;\n\n const availabilityRaw = typeof nested.availability === \"string\" ? nested.availability : \"unknown\";\n const availability: ShoppingOffer[\"availability\"] = availabilityRaw === \"in_stock\" || availabilityRaw === \"limited\" || availabilityRaw === \"out_of_stock\"\n ? availabilityRaw\n : \"unknown\";\n\n const offer: ShoppingOffer = {\n offer_id: `${record.provider}:${record.id}`,\n product_id: typeof nested.product_id === \"string\" && nested.product_id.trim()\n ? nested.product_id\n : hash(`${canonicalizeUrl(url)}::${title.toLowerCase()}`),\n provider: record.provider,\n url,\n title,\n price: {\n amount: priceAmount,\n currency: priceCurrency,\n retrieved_at: retrievedAt\n },\n shipping: {\n amount: shippingAmount,\n currency: shippingCurrency,\n notes: typeof nestedShipping.notes === \"string\" ? nestedShipping.notes : \"unknown\"\n },\n availability,\n rating: asNumber(nested.rating),\n reviews_count: asNumber(nested.reviews_count),\n deal_score: 0,\n attributes: {\n ...record.attributes,\n source_record_id: record.id\n }\n };\n\n offer.deal_score = computeDealScore(offer, now);\n return offer;\n};\n\nconst dedupeOffers = (offers: ShoppingOffer[]): ShoppingOffer[] => {\n const deduped = new Map<string, ShoppingOffer>();\n for (const offer of offers) {\n const key = `${canonicalizeUrl(offer.url)}::${offer.title.toLowerCase()}`;\n const existing = deduped.get(key);\n if (!existing || offer.deal_score > existing.deal_score) {\n deduped.set(key, offer);\n }\n }\n return [...deduped.values()];\n};\n\nconst rankOffers = (\n offers: ShoppingOffer[],\n sort: ShoppingRunInput[\"sort\"]\n): ShoppingOffer[] => {\n const ordered = [...offers];\n switch (sort) {\n case \"lowest_price\":\n return ordered.sort((left, right) => {\n const leftTotal = left.price.amount + left.shipping.amount;\n const rightTotal = right.price.amount + right.shipping.amount;\n return leftTotal - rightTotal;\n });\n case \"highest_rating\":\n return ordered.sort((left, right) => right.rating - left.rating || right.reviews_count - left.reviews_count);\n case \"fastest_shipping\":\n return ordered.sort((left, right) => left.shipping.amount - right.shipping.amount || right.deal_score - left.deal_score);\n case \"best_deal\":\n default:\n return ordered.sort((left, right) => right.deal_score - left.deal_score || (left.price.amount + left.shipping.amount) - (right.price.amount + right.shipping.amount));\n }\n};\n\nconst extractImageUrls = (record: NormalizedRecord): string[] => {\n const links = Array.isArray(record.attributes.links)\n ? record.attributes.links.filter((entry): entry is string => typeof entry === \"string\")\n : [];\n\n const imageLinks = links.filter((link) => /\\.(?:png|jpg|jpeg|webp|gif)(?:[?#].*)?$/i.test(link));\n return [...new Set(imageLinks.map((link) => canonicalizeUrl(link)))].slice(0, 50);\n};\n\nconst fetchBinary = async (url: string): Promise<Buffer | null> => {\n try {\n const response = await fetch(url, {\n headers: {\n accept: \"image/*,*/*;q=0.8\",\n ...providerRequestHeaders\n },\n redirect: \"follow\"\n });\n if (!response.ok) return null;\n const bytes = await response.arrayBuffer();\n return Buffer.from(bytes);\n } catch {\n return null;\n }\n};\n\nconst deriveFeatureList = (content: string | undefined): string[] => {\n if (!content) return [];\n const candidates = content\n .split(/[\\n.]/)\n .map((line) => line.trim())\n .filter((line) => line.length >= 20)\n .filter((line) => /[a-z]/i.test(line));\n return [...new Set(candidates)].slice(0, 12);\n};\n\nconst resolveShoppingSourceForUrl = (url: string): ProviderSource => {\n try {\n const host = new URL(url).hostname.toLowerCase();\n const match = SHOPPING_PROVIDER_PROFILES.some((profile) => profile.domains.some((domain) => host === domain || host.endsWith(`.${domain}`)));\n return match ? \"shopping\" : \"web\";\n } catch {\n return \"web\";\n }\n};\n\nexport const runResearchWorkflow = async (\n runtime: ProviderExecutor,\n input: ResearchRunInput\n): Promise<Record<string, unknown>> => {\n const topic = input.topic?.trim();\n if (!topic) {\n throw new Error(\"topic is required\");\n }\n\n const { sourceSelection, resolved } = resolveResearchSources(input);\n const now = new Date();\n const timebox = resolveTimebox({\n days: input.days,\n from: input.from,\n to: input.to,\n now\n });\n if (resolved.includes(\"shopping\")) {\n enforceShoppingLegalReviewGate(SHOPPING_PROVIDER_IDS, now);\n }\n const excludedProviders = resolveAutoExcludedProviders(sourceSelection, resolved);\n const excludedProviderSet = new Set(excludedProviders);\n\n const runs = await Promise.all(resolved.map(async (source) => {\n const result = await runtime.search({\n query: topic,\n limit: input.limitPerSource ?? 10,\n filters: {\n include_engagement: input.includeEngagement ?? false,\n timebox_from: timebox.from,\n timebox_to: timebox.to\n }\n }, withCookieOverrides({\n source\n }, input));\n trackProviderSignals(result);\n return {\n source,\n result\n };\n }));\n\n const mergedRecords = removeExcludedProviders(\n runs.flatMap((run) => run.result.records),\n excludedProviderSet\n );\n const mergedFailures = removeExcludedProviders(\n runs.flatMap((run) => run.result.failures),\n excludedProviderSet\n );\n const reasonCodeDistribution = summarizeReasonCodeDistribution(mergedFailures);\n const transcriptStrategyFailures = summarizeTranscriptStrategyFailures(mergedFailures);\n const evaluationNow = new Date();\n const withinTimebox = filterByTimebox(mergedRecords, timebox, evaluationNow);\n const enriched = enrichResearchRecords(withinTimebox, timebox, evaluationNow);\n const deduped = dedupeResearchRecords(enriched);\n const ranked = rankResearchRecords(deduped);\n const cookieDiagnostics = summarizeCookieDiagnostics(mergedFailures, mergedRecords);\n const transcriptStrategyDetailDistribution = summarizeTranscriptStrategyDetailDistribution(ranked);\n const transcriptDurability = summarizeTranscriptDurability(ranked, mergedFailures);\n const antiBotPressure = summarizeAntiBotPressure(mergedFailures);\n const resolvedTimebox = timebox.mode === \"days\"\n ? {\n ...timebox,\n to: new Date(Math.max(new Date(timebox.to).getTime(), evaluationNow.getTime())).toISOString()\n }\n : timebox;\n\n const meta = {\n timebox: resolvedTimebox,\n selection: withExcludedProviders({\n source_selection: sourceSelection,\n resolved_sources: resolved\n }, excludedProviders),\n metrics: {\n total_records: mergedRecords.length,\n within_timebox: withinTimebox.length,\n final_records: ranked.length,\n failed_sources: runs.filter((run) => !run.result.ok).map((run) => run.source),\n reason_code_distribution: reasonCodeDistribution,\n reasonCodeDistribution,\n transcript_strategy_failures: transcriptStrategyFailures,\n transcriptStrategyFailures,\n transcript_strategy_detail_failures: transcriptStrategyFailures,\n transcriptStrategyDetailFailures: transcriptStrategyFailures,\n transcript_strategy_detail_distribution: transcriptStrategyDetailDistribution,\n transcriptStrategyDetailDistribution,\n transcript_durability: transcriptDurability,\n transcriptDurability,\n cookie_diagnostics: cookieDiagnostics,\n cookieDiagnostics,\n anti_bot_pressure: antiBotPressure,\n antiBotPressure\n },\n failures: mergedFailures,\n alerts: buildAlerts()\n } as Record<string, unknown>;\n\n const rendered = renderResearch({\n mode: input.mode,\n topic,\n records: ranked,\n meta\n });\n\n const bundle = await createArtifactBundle({\n namespace: \"research\",\n outputDir: input.outputDir,\n ttlHours: input.ttlHours,\n files: rendered.files\n });\n\n if (input.mode === \"path\") {\n return {\n ...rendered.response,\n path: bundle.basePath,\n records: ranked,\n meta: {\n ...meta,\n artifact_manifest: bundle.manifest\n }\n };\n }\n\n return {\n ...rendered.response,\n artifact_path: bundle.basePath,\n records: ranked,\n meta: {\n ...meta,\n artifact_manifest: bundle.manifest\n }\n };\n};\n\nexport const runShoppingWorkflow = async (\n runtime: ProviderExecutor,\n input: ShoppingRunInput\n): Promise<Record<string, unknown>> => {\n const query = input.query?.trim();\n if (!query) {\n throw new Error(\"query is required\");\n }\n\n const providerIds = resolveShoppingProviders(input.providers);\n const hasExplicitProviderSelection = Boolean(input.providers && input.providers.length > 0);\n const degradedProviders = getDegradedProviders();\n const autoExcludedProviders = hasExplicitProviderSelection\n ? []\n : providerIds.filter((providerId) => degradedProviders.has(providerId));\n const effectiveProviderIds = hasExplicitProviderSelection\n ? providerIds\n : providerIds.filter((providerId) => !degradedProviders.has(providerId));\n const now = new Date();\n if (effectiveProviderIds.length === 0) {\n throw new Error(\"All default shopping providers are temporarily excluded due to degraded anti-bot/rate-limit state\");\n }\n enforceShoppingLegalReviewGate(effectiveProviderIds, now);\n\n const runs = await Promise.all(effectiveProviderIds.map(async (providerId) => {\n const result = await runtime.search({\n query,\n limit: 8,\n filters: {\n ...(typeof input.budget === \"number\" ? { budget: input.budget } : {}),\n ...(input.region ? { region: input.region } : {})\n }\n }, withCookieOverrides({\n source: \"shopping\",\n providerIds: [providerId],\n ...(typeof input.timeoutMs === \"number\" ? { timeoutMs: input.timeoutMs } : {})\n }, input));\n trackProviderSignals(result);\n return {\n providerId,\n result\n };\n }));\n\n const offers = rankOffers(\n dedupeOffers(\n runs\n .flatMap((run) => run.result.records)\n .map((record) => extractShoppingOffer(record, now))\n ),\n input.sort ?? \"best_deal\"\n );\n\n const failures = runs.flatMap((run) => run.result.failures);\n const records = runs.flatMap((run) => run.result.records);\n const reasonCodeDistribution = summarizeReasonCodeDistribution(failures);\n const transcriptStrategyFailures = summarizeTranscriptStrategyFailures(failures);\n const transcriptStrategyDetailDistribution = summarizeTranscriptStrategyDetailDistribution(records);\n const transcriptDurability = summarizeTranscriptDurability(records, failures);\n const cookieDiagnostics = summarizeCookieDiagnostics(failures, records);\n const antiBotPressure = summarizeAntiBotPressure(failures);\n const meta = {\n selection: {\n providers: effectiveProviderIds,\n ...(autoExcludedProviders.length > 0 ? { excluded_providers: autoExcludedProviders } : {})\n },\n metrics: {\n total_offers: offers.length,\n failed_providers: failures.map((entry) => entry.provider),\n reason_code_distribution: reasonCodeDistribution,\n reasonCodeDistribution,\n transcript_strategy_failures: transcriptStrategyFailures,\n transcriptStrategyFailures,\n transcript_strategy_detail_failures: transcriptStrategyFailures,\n transcriptStrategyDetailFailures: transcriptStrategyFailures,\n transcript_strategy_detail_distribution: transcriptStrategyDetailDistribution,\n transcriptStrategyDetailDistribution,\n transcript_durability: transcriptDurability,\n transcriptDurability,\n cookie_diagnostics: cookieDiagnostics,\n cookieDiagnostics,\n anti_bot_pressure: antiBotPressure,\n antiBotPressure\n },\n failures,\n alerts: buildAlerts()\n } as Record<string, unknown>;\n\n const rendered = renderShopping({\n mode: input.mode,\n query,\n offers,\n meta\n });\n\n const bundle = await createArtifactBundle({\n namespace: \"shopping\",\n outputDir: input.outputDir,\n ttlHours: input.ttlHours,\n files: rendered.files\n });\n\n if (input.mode === \"path\") {\n return {\n ...rendered.response,\n path: bundle.basePath,\n offers,\n meta: {\n ...meta,\n artifact_manifest: bundle.manifest\n }\n };\n }\n\n return {\n ...rendered.response,\n offers,\n artifact_path: bundle.basePath,\n meta: {\n ...meta,\n artifact_manifest: bundle.manifest\n }\n };\n};\n\nexport const runProductVideoWorkflow = async (\n runtime: ProviderExecutor,\n input: ProductVideoRunInput,\n options: ProductVideoWorkflowOptions = {}\n): Promise<Record<string, unknown>> => {\n const includeScreenshots = input.include_screenshots ?? true;\n const includeAllImages = input.include_all_images ?? true;\n const includeCopy = input.include_copy ?? true;\n\n const candidateUrl = input.product_url?.trim();\n const candidateName = input.product_name?.trim();\n\n if (!candidateUrl && !candidateName) {\n throw new Error(\"product_url or product_name is required\");\n }\n\n let productUrl = candidateUrl;\n let providerHint = input.provider_hint?.trim();\n\n if (!productUrl && candidateName) {\n const shoppingResult = await runShoppingWorkflow(runtime, {\n query: candidateName,\n providers: providerHint ? [providerHint] : undefined,\n mode: \"json\",\n useCookies: input.useCookies,\n cookiePolicyOverride: input.cookiePolicyOverride\n });\n\n const offers = Array.isArray(shoppingResult.offers)\n ? shoppingResult.offers as ShoppingOffer[]\n : [];\n if (offers.length === 0) {\n throw new Error(\"Unable to resolve product URL from product_name\");\n }\n productUrl = offers[0]?.url;\n providerHint = offers[0]?.provider;\n }\n\n if (!productUrl) {\n throw new Error(\"Unable to resolve product URL\");\n }\n\n const source = resolveShoppingSourceForUrl(productUrl);\n const shoppingProviderId = source === \"shopping\"\n ? (\n providerHint\n ? (providerHint.startsWith(\"shopping/\") ? providerHint : `shopping/${providerHint}`)\n : resolveShoppingProviderIdForUrl(productUrl)\n )\n : null;\n if (shoppingProviderId) {\n enforceShoppingLegalReviewGate([shoppingProviderId], new Date());\n }\n const details = await runtime.fetch(\n { url: productUrl },\n withCookieOverrides({\n source,\n providerIds: shoppingProviderId ? [shoppingProviderId] : undefined\n }, input)\n );\n trackProviderSignals(details);\n\n if (!details.ok || details.records.length === 0) {\n const reason = details.error?.message ?? \"Product details unavailable\";\n throw new Error(reason);\n }\n\n const primary = details.records[0] as NormalizedRecord;\n const primaryOffer = extractShoppingOffer(primary, new Date());\n\n const featureList = deriveFeatureList(primary.content);\n const imageUrls = extractImageUrls(primary);\n const selectedImageUrls = includeAllImages ? imageUrls : imageUrls.slice(0, 1);\n\n const files: ArtifactFile[] = [];\n const imagePaths: string[] = [];\n for (let index = 0; index < selectedImageUrls.length; index += 1) {\n const imageUrl = selectedImageUrls[index];\n if (!imageUrl) continue;\n const imageContent = await fetchBinary(imageUrl);\n if (!imageContent) continue;\n const extension = imageUrl.match(/\\.(png|jpg|jpeg|webp|gif)(?:[?#].*)?$/i)?.[1]?.toLowerCase() ?? \"jpg\";\n const relativePath = `images/image-${String(index + 1).padStart(2, \"0\")}.${extension}`;\n files.push({ path: relativePath, content: imageContent });\n imagePaths.push(relativePath);\n }\n\n const screenshotPaths: string[] = [];\n if (includeScreenshots) {\n const screenshotBuffer = options.captureScreenshot ? await options.captureScreenshot(productUrl) : null;\n if (screenshotBuffer) {\n const screenshotPath = \"screenshots/screenshot-01.png\";\n files.push({ path: screenshotPath, content: screenshotBuffer });\n screenshotPaths.push(screenshotPath);\n } else if (imagePaths[0]) {\n const firstImage = files.find((entry) => entry.path === imagePaths[0]);\n if (firstImage) {\n const fallbackPath = \"screenshots/screenshot-01.png\";\n files.push({ path: fallbackPath, content: firstImage.content });\n screenshotPaths.push(fallbackPath);\n }\n }\n }\n\n const copyText = includeCopy ? toSnippet(primary.content ?? \"\", 8000) : \"\";\n const pricing = {\n amount: primaryOffer.price.amount,\n currency: primaryOffer.price.currency,\n retrieved_at: primaryOffer.price.retrieved_at\n };\n\n const productPayload = {\n title: primary.title ?? primaryOffer.title,\n brand: typeof primary.attributes.brand === \"string\" ? primary.attributes.brand : \"unknown\",\n provider: providerHint ?? primary.provider,\n url: productUrl,\n features: featureList,\n copy: copyText\n };\n\n const manifestPayload = {\n run_id: hash(`${productUrl}:${Date.now()}`),\n created_at: new Date().toISOString(),\n source_url: productUrl,\n provider: providerHint ?? primary.provider,\n product: {\n title: productPayload.title,\n brand: productPayload.brand,\n price: pricing,\n features: featureList,\n copy: copyText\n },\n assets: {\n images: imagePaths,\n screenshots: screenshotPaths,\n raw: [\"raw/source-record.json\"]\n }\n };\n\n files.push(\n { path: \"manifest.json\", content: manifestPayload },\n { path: \"product.json\", content: productPayload },\n { path: \"pricing.json\", content: pricing },\n { path: \"copy.md\", content: copyText || \"\" },\n { path: \"features.md\", content: featureList.map((feature) => `- ${feature}`).join(\"\\n\") },\n {\n path: \"raw/source-record.json\",\n content: redactRawCapture(JSON.parse(JSON.stringify(primary)) as Record<string, unknown>)\n }\n );\n\n const bundle = await createArtifactBundle({\n namespace: \"product-assets\",\n outputDir: input.output_dir,\n ttlHours: input.ttl_hours,\n files,\n manifestFileName: \"bundle-manifest.json\"\n });\n\n const reasonCodeDistribution = summarizeReasonCodeDistribution(details.failures);\n const transcriptStrategyFailures = summarizeTranscriptStrategyFailures(details.failures);\n const transcriptStrategyDetailDistribution = summarizeTranscriptStrategyDetailDistribution(details.records);\n const transcriptDurability = summarizeTranscriptDurability(details.records, details.failures);\n const cookieDiagnostics = summarizeCookieDiagnostics(details.failures, details.records);\n const antiBotPressure = summarizeAntiBotPressure(details.failures);\n\n return {\n path: bundle.basePath,\n manifest: manifestPayload,\n product: productPayload,\n pricing,\n screenshots: screenshotPaths,\n images: imagePaths,\n meta: {\n alerts: buildAlerts(),\n failures: details.failures,\n reason_code_distribution: reasonCodeDistribution,\n reasonCodeDistribution,\n transcript_strategy_failures: transcriptStrategyFailures,\n transcriptStrategyFailures,\n transcript_strategy_detail_failures: transcriptStrategyFailures,\n transcriptStrategyDetailFailures: transcriptStrategyFailures,\n transcript_strategy_detail_distribution: transcriptStrategyDetailDistribution,\n transcriptStrategyDetailDistribution,\n transcript_durability: transcriptDurability,\n transcriptDurability,\n cookie_diagnostics: cookieDiagnostics,\n cookieDiagnostics,\n anti_bot_pressure: antiBotPressure,\n antiBotPressure,\n artifact_manifest: bundle.manifest\n }\n };\n};\n","import {\n ProviderRuntimeError,\n normalizeProviderReasonCode,\n providerErrorCodeFromReasonCode,\n toProviderError\n} from \"./errors\";\nimport { createExecutionMetadata, normalizeFailure, normalizeSuccess, createTraceContext } from \"./normalize\";\nimport { selectProviders } from \"./policy\";\nimport { ProviderRegistry } from \"./registry\";\nimport { AdaptiveConcurrencyController } from \"./adaptive-concurrency\";\nimport { applyPromptGuard } from \"./safety/prompt-guard\";\nimport { fallbackTierMetadata, selectTierRoute, shouldFallbackToTierA } from \"./tier-router\";\nimport { createLogger } from \"../core/logging\";\nimport {\n AntiBotPolicyEngine,\n type AntiBotPolicyConfig\n} from \"./shared/anti-bot-policy\";\nimport { createCommunityProvider, type CommunityProviderOptions } from \"./community\";\nimport {\n createSocialProviders,\n withDefaultYouTubeOptions,\n type SocialPlatform,\n type SocialProviderOptions,\n type SocialProvidersOptions\n} from \"./social\";\nimport { createShoppingProviders, type ShoppingProvidersOptions } from \"./shopping\";\nimport { providerRequestHeaders } from \"./shared/request-headers\";\nimport { isLikelyDocumentUrl } from \"./shared/traversal-url\";\nimport { createWebProvider, type WebProviderOptions } from \"./web\";\nimport { classifyBlockerSignal } from \"./blocker\";\nimport { canonicalizeUrl } from \"./web/crawler\";\nimport { extractStructuredContent, toSnippet } from \"./web/extract\";\nimport type {\n AdaptiveConcurrencyDiagnostics,\n BrowserFallbackPort,\n BlockerSignalV1,\n JsonValue,\n NormalizedRecord,\n ProviderAdapter,\n ProviderAggregateResult,\n ProviderCallResultByOperation,\n ProviderCookiePolicy,\n ProviderCookieSourceConfig,\n ProviderContext,\n ProviderExecutionMetadata,\n ProviderErrorCode,\n ProviderOperation,\n ProviderOperationResult,\n ProviderReasonCode,\n ProviderRunOptions,\n ProviderRuntimeBudgets,\n ProviderRuntimeDiagnostics,\n ProviderSelection,\n ProviderSource,\n ProviderTierMetadata,\n TraceContext\n} from \"./types\";\n\nclass Semaphore {\n private active = 0;\n private readonly queue: Array<() => void> = [];\n\n constructor(private limit: number) {}\n\n setLimit(limit: number): void {\n this.limit = Math.max(1, Math.floor(limit));\n this.drain();\n }\n\n snapshot(): { limit: number; active: number; queued: number } {\n return {\n limit: this.limit,\n active: this.active,\n queued: this.queue.length\n };\n }\n\n async use<T>(task: () => Promise<T>): Promise<T> {\n await this.acquire();\n try {\n return await task();\n } finally {\n this.release();\n }\n }\n\n private async acquire(): Promise<void> {\n if (this.limit <= 0) return;\n if (this.active < this.limit) {\n this.active += 1;\n return;\n }\n\n await new Promise<void>((resolve) => {\n this.queue.push(() => {\n this.active += 1;\n resolve();\n });\n });\n }\n\n private release(): void {\n if (this.limit <= 0) return;\n this.active = Math.max(0, this.active - 1);\n this.drain();\n }\n\n private drain(): void {\n if (this.limit <= 0) return;\n while (this.active < this.limit) {\n const next = this.queue.shift();\n if (!next) return;\n next();\n }\n }\n}\n\nexport const DEFAULT_PROVIDER_BUDGETS: ProviderRuntimeBudgets = {\n timeoutMs: {\n search: 12000,\n fetch: 12000,\n crawl: 20000,\n post: 15000\n },\n retries: {\n read: 1,\n write: 0\n },\n concurrency: {\n global: 4,\n perProvider: 2,\n perDomain: 2\n },\n circuitBreaker: {\n failureThreshold: 3,\n cooldownMs: 30000\n }\n};\n\nconst isReadOperation = (operation: ProviderOperation): boolean => operation !== \"post\";\n\ntype RuntimeTierConfig = {\n defaultTier: \"A\" | \"B\" | \"C\";\n enableHybrid: boolean;\n enableRestrictedSafe: boolean;\n hybridRiskThreshold: number;\n restrictedSafeRecoveryIntervalMs: number;\n};\n\nconst DEFAULT_TIER_CONFIG = {\n defaultTier: \"A\",\n enableHybrid: false,\n enableRestrictedSafe: false,\n hybridRiskThreshold: 0.6,\n restrictedSafeRecoveryIntervalMs: 60000\n} satisfies RuntimeTierConfig;\n\nconst PLACEHOLDER_PATTERNS: Array<{ code: string; regex: RegExp }> = [\n { code: \"placeholder_local_url\", regex: /https?:\\/\\/(?:placeholder|synthetic|example)\\.local(?:\\/|$)/i },\n { code: \"placeholder_token\", regex: /\\b(?:todo|placeholder|lorem ipsum)\\b/i },\n { code: \"echo_input\", regex: /\\b(?:seed url|query):\\s*[\"'`].{1,120}[\"'`]/i }\n];\n\nconst RUNTIME_FETCH_HEADERS = {\n accept: \"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\",\n ...providerRequestHeaders\n} as const;\n\nconst SOCIAL_SEARCH_ENDPOINTS: Record<SocialPlatform, (query: string, page: number) => string> = {\n x: (query, page) => `https://x.com/search?q=${encodeURIComponent(query)}&f=live&page=${page}`,\n reddit: (query, page) => `https://www.reddit.com/search/?q=${encodeURIComponent(query)}&sort=relevance&t=all&page=${page}`,\n bluesky: (query, page) => `https://bsky.app/search?q=${encodeURIComponent(query)}&page=${page}`,\n facebook: (query, page) => `https://www.facebook.com/search/top?q=${encodeURIComponent(query)}&page=${page}`,\n linkedin: (query, page) => `https://www.linkedin.com/search/results/content/?keywords=${encodeURIComponent(query)}&page=${page}`,\n instagram: (query, page) => `https://www.instagram.com/explore/search/keyword/?q=${encodeURIComponent(query)}&page=${page}`,\n tiktok: (query, page) => `https://www.tiktok.com/search?q=${encodeURIComponent(query)}&page=${page}`,\n threads: (query, page) => `https://www.threads.net/search?q=${encodeURIComponent(query)}&page=${page}`,\n youtube: (query, page) => `https://www.youtube.com/results?search_query=${encodeURIComponent(query)}&page=${page}`\n};\n\ntype RuntimeFetchSource = ProviderSource;\n\ntype RuntimeFetchedDocument = {\n url: string;\n status: number;\n html: string;\n text: string;\n links: string[];\n};\n\nconst isHttpUrl = (value: string): boolean => {\n try {\n const protocol = new URL(value).protocol;\n return protocol === \"http:\" || protocol === \"https:\";\n } catch {\n return false;\n }\n};\n\nconst toPositiveInt = (value: unknown, fallback: number): number => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.max(1, Math.floor(value));\n }\n if (typeof value === \"string\" && value.trim()) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return Math.max(1, Math.floor(parsed));\n }\n }\n return fallback;\n};\n\nconst clampBlockerThreshold = (value: number | undefined): number => {\n if (typeof value !== \"number\" || Number.isNaN(value)) return 0.7;\n if (value < 0) return 0;\n if (value > 1) return 1;\n return value;\n};\n\nconst stripUrls = (value: string): string => {\n return value.replace(/https?:\\/\\/[^\\s]+/gi, \" \").replace(/\\s+/g, \" \").trim();\n};\n\nconst normalizeHttpLink = (candidate: string, baseUrl: string): string | null => {\n try {\n const resolved = new URL(candidate, baseUrl).toString();\n if (!isHttpUrl(resolved)) return null;\n return canonicalizeUrl(resolved);\n } catch {\n return null;\n }\n};\n\nconst dedupeLinks = (links: string[], baseUrl: string, limit: number): string[] => {\n const seen = new Set<string>();\n const deduped: string[] = [];\n for (const candidate of links) {\n const normalized = normalizeHttpLink(candidate, baseUrl);\n if (!normalized || !isLikelyDocumentUrl(normalized) || seen.has(normalized)) continue;\n seen.add(normalized);\n deduped.push(normalized);\n if (deduped.length >= limit) break;\n }\n return deduped;\n};\n\nconst RUNTIME_FALLBACK_ERROR_CODES = new Set<ProviderErrorCode>([\n \"auth\",\n \"rate_limited\",\n \"timeout\",\n \"network\",\n \"upstream\",\n \"unavailable\"\n]);\n\nconst fallbackReasonCodeForError = (error: {\n code: ProviderErrorCode;\n message: string;\n details?: Record<string, JsonValue>;\n reasonCode?: ProviderReasonCode;\n}): ProviderReasonCode | undefined => {\n if (error.reasonCode) return error.reasonCode;\n const normalized = normalizeProviderReasonCode({\n code: error.code,\n message: error.message,\n details: error.details\n });\n if (normalized) return normalized;\n if (error.code === \"auth\") return \"token_required\";\n if (error.code === \"rate_limited\") return \"rate_limited\";\n if (error.code === \"upstream\") return \"ip_blocked\";\n if (error.code === \"timeout\" || error.code === \"network\" || error.code === \"unavailable\") return \"env_limited\";\n return undefined;\n};\n\nconst readFallbackString = (output: Record<string, JsonValue> | undefined, key: \"html\" | \"url\"): string | undefined => {\n const value = output?.[key];\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n};\n\nconst fetchRuntimeDocument = async (args: {\n url: string;\n provider: string;\n source: RuntimeFetchSource;\n signal?: AbortSignal;\n}): Promise<RuntimeFetchedDocument> => {\n if (!isHttpUrl(args.url)) {\n throw new ProviderRuntimeError(\"invalid_input\", \"Retrieval URL must be an HTTP(S) URL\", {\n provider: args.provider,\n source: args.source,\n retryable: false,\n details: { url: args.url }\n });\n }\n\n let response: Response;\n try {\n response = await fetch(args.url, {\n headers: RUNTIME_FETCH_HEADERS,\n redirect: \"follow\",\n signal: args.signal\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.toLowerCase().includes(\"abort\")) {\n throw new ProviderRuntimeError(\"timeout\", `Timed out retrieving ${args.url}`, {\n provider: args.provider,\n source: args.source,\n retryable: true,\n cause: error\n });\n }\n throw new ProviderRuntimeError(\"network\", `Failed to retrieve ${args.url}`, {\n provider: args.provider,\n source: args.source,\n retryable: true,\n cause: error\n });\n }\n\n if (response.status === 401 || response.status === 403) {\n throw new ProviderRuntimeError(\"auth\", `Authentication required for ${args.url}`, {\n provider: args.provider,\n source: args.source,\n retryable: false\n });\n }\n if (response.status === 429) {\n throw new ProviderRuntimeError(\"rate_limited\", `Rate limited while retrieving ${args.url}`, {\n provider: args.provider,\n source: args.source,\n retryable: true\n });\n }\n if (response.status >= 500) {\n throw new ProviderRuntimeError(\"upstream\", `Upstream failed while retrieving ${args.url}`, {\n provider: args.provider,\n source: args.source,\n retryable: true\n });\n }\n if (response.status >= 400) {\n throw new ProviderRuntimeError(\"unavailable\", `Retrieval failed for ${args.url}`, {\n provider: args.provider,\n source: args.source,\n retryable: false\n });\n }\n\n const resolvedUrl = canonicalizeUrl(response.url || args.url);\n const html = await response.text();\n const extracted = extractStructuredContent(html, resolvedUrl);\n return {\n url: resolvedUrl,\n status: response.status,\n html,\n text: extracted.text,\n links: extracted.links\n };\n};\n\nconst fetchRuntimeDocumentWithFallback = async (args: {\n url: string;\n provider: string;\n source: RuntimeFetchSource;\n operation: \"search\" | \"fetch\";\n signal?: AbortSignal;\n context?: ProviderContext;\n browserFallbackPort?: BrowserFallbackPort;\n}): Promise<RuntimeFetchedDocument> => {\n try {\n return await fetchRuntimeDocument({\n url: args.url,\n provider: args.provider,\n source: args.source,\n signal: args.signal\n });\n } catch (error) {\n const normalized = toProviderError(error, {\n provider: args.provider,\n source: args.source\n });\n const fallbackPort = args.context?.browserFallbackPort ?? args.browserFallbackPort;\n if (!fallbackPort) {\n throw error;\n }\n if (!RUNTIME_FALLBACK_ERROR_CODES.has(normalized.code)) {\n throw error;\n }\n const reasonCode = fallbackReasonCodeForError(normalized) ?? \"env_limited\";\n\n const fallback = await fallbackPort.resolve({\n provider: args.provider,\n source: args.source,\n operation: args.operation,\n reasonCode,\n trace: args.context?.trace ?? {\n requestId: `runtime-fallback-${Date.now()}`,\n provider: args.provider,\n ts: new Date().toISOString()\n },\n url: args.url,\n details: {\n errorCode: normalized.code,\n message: normalized.message,\n ...(normalized.details ?? {})\n },\n ...(typeof args.context?.useCookies === \"boolean\" ? { useCookies: args.context.useCookies } : {}),\n ...(args.context?.cookiePolicyOverride ? { cookiePolicyOverride: args.context.cookiePolicyOverride } : {})\n });\n if (!fallback.ok) {\n throw error;\n }\n\n const resolvedUrl = canonicalizeUrl(readFallbackString(fallback.output, \"url\") ?? args.url);\n const html = readFallbackString(fallback.output, \"html\") ?? \"\";\n const extracted = extractStructuredContent(html, resolvedUrl);\n return {\n url: resolvedUrl,\n status: 200,\n html,\n text: extracted.text,\n links: extracted.links\n };\n }\n};\n\nexport interface RuntimeInit {\n budgets?: Partial<ProviderRuntimeBudgets>;\n providers?: ProviderAdapter[];\n tiers?: Partial<RuntimeTierConfig>;\n adaptiveConcurrency?: {\n enabled?: boolean;\n maxGlobal?: number;\n maxPerDomain?: number;\n };\n blockerDetectionThreshold?: number;\n promptInjectionGuard?: {\n enabled?: boolean;\n };\n antiBotPolicy?: Partial<AntiBotPolicyConfig>;\n transcript?: {\n modeDefault?: \"auto\" | \"web\" | \"no-auto\" | \"yt-dlp\" | \"apify\";\n strategyOrder?: Array<\n \"youtubei\"\n | \"native_caption_parse\"\n | \"ytdlp_audio_asr\"\n | \"apify\"\n | \"ytdlp_subtitle\"\n | \"optional_asr\"\n >;\n enableYtdlp?: boolean;\n enableAsr?: boolean;\n enableYtdlpAudioAsr?: boolean;\n enableApify?: boolean;\n apifyActorId?: string;\n enableBrowserFallback?: boolean;\n ytdlpTimeoutMs?: number;\n };\n cookies?: {\n policy?: ProviderCookiePolicy;\n source?: ProviderCookieSourceConfig;\n };\n browserFallbackPort?: BrowserFallbackPort;\n}\n\nexport interface RuntimeDefaults {\n web?: WebProviderOptions;\n community?: CommunityProviderOptions;\n social?: SocialProvidersOptions;\n shopping?: ShoppingProvidersOptions;\n}\n\nexport class ProviderRuntime {\n readonly registry: ProviderRegistry;\n private readonly logger = createLogger(\"provider-runtime\");\n private budgets: ProviderRuntimeBudgets;\n private globalSemaphore: Semaphore;\n private readonly scopedSemaphores = new Map<string, Semaphore>();\n private readonly tierConfig: RuntimeTierConfig;\n private readonly promptGuardEnabled: boolean;\n private readonly blockerDetectionThreshold: number;\n private readonly antiBotPolicy: AntiBotPolicyEngine;\n private readonly adaptiveConfig: Required<NonNullable<RuntimeInit[\"adaptiveConcurrency\"]>>;\n private adaptiveConcurrency: AdaptiveConcurrencyController;\n private readonly browserFallbackPort?: BrowserFallbackPort;\n\n constructor(init: RuntimeInit = {}) {\n this.registry = new ProviderRegistry();\n this.budgets = mergeBudgets(DEFAULT_PROVIDER_BUDGETS, init.budgets);\n this.globalSemaphore = new Semaphore(this.budgets.concurrency.global);\n this.tierConfig = {\n ...DEFAULT_TIER_CONFIG,\n ...(init.tiers ?? {})\n };\n this.promptGuardEnabled = init.promptInjectionGuard?.enabled ?? true;\n this.blockerDetectionThreshold = clampBlockerThreshold(init.blockerDetectionThreshold);\n this.antiBotPolicy = new AntiBotPolicyEngine(init.antiBotPolicy);\n this.browserFallbackPort = init.browserFallbackPort;\n this.adaptiveConfig = {\n enabled: init.adaptiveConcurrency?.enabled ?? false,\n maxGlobal: Math.max(this.budgets.concurrency.global, init.adaptiveConcurrency?.maxGlobal ?? this.budgets.concurrency.global),\n maxPerDomain: Math.max(\n this.budgets.concurrency.perDomain ?? this.budgets.concurrency.perProvider,\n init.adaptiveConcurrency?.maxPerDomain ?? (this.budgets.concurrency.perDomain ?? this.budgets.concurrency.perProvider)\n )\n };\n this.adaptiveConcurrency = this.createAdaptiveConcurrencyController();\n\n for (const provider of init.providers ?? []) {\n this.register(provider);\n }\n }\n\n register(provider: ProviderAdapter): void {\n this.registry.register(provider);\n this.scopedSemaphores.set(provider.id, new Semaphore(this.budgets.concurrency.perProvider));\n }\n\n listProviders(): ProviderAdapter[] {\n return this.registry.list();\n }\n\n listCapabilities() {\n return this.registry.capabilities();\n }\n\n getHealth(providerId: string) {\n return this.registry.getHealth(providerId);\n }\n\n updateBudgets(partial: Partial<ProviderRuntimeBudgets>): ProviderRuntimeBudgets {\n this.budgets = mergeBudgets(this.budgets, partial);\n this.globalSemaphore = new Semaphore(this.budgets.concurrency.global);\n this.scopedSemaphores.clear();\n for (const provider of this.registry.list()) {\n this.scopedSemaphores.set(provider.id, new Semaphore(this.budgets.concurrency.perProvider));\n }\n this.adaptiveConcurrency = this.createAdaptiveConcurrencyController();\n return this.budgets;\n }\n\n getBudgets(): ProviderRuntimeBudgets {\n return this.budgets;\n }\n\n async search(input: ProviderCallResultByOperation[\"search\"], options: ProviderRunOptions = {}): Promise<ProviderAggregateResult> {\n return this.execute(\"search\", input, options);\n }\n\n async fetch(input: ProviderCallResultByOperation[\"fetch\"], options: ProviderRunOptions = {}): Promise<ProviderAggregateResult> {\n return this.execute(\"fetch\", input, options);\n }\n\n async crawl(input: ProviderCallResultByOperation[\"crawl\"], options: ProviderRunOptions = {}): Promise<ProviderAggregateResult> {\n return this.execute(\"crawl\", input, options);\n }\n\n async post(input: ProviderCallResultByOperation[\"post\"], options: ProviderRunOptions = {}): Promise<ProviderAggregateResult> {\n return this.execute(\"post\", input, options);\n }\n\n async execute<Operation extends ProviderOperation>(\n operation: Operation,\n input: ProviderCallResultByOperation[Operation],\n options: ProviderRunOptions = {}\n ): Promise<ProviderAggregateResult> {\n const startedAt = Date.now();\n const selection = options.source ?? \"auto\";\n const trace = createTraceContext(options.trace);\n\n const selectedProviders = selectProviders(this.registry, operation, selection)\n .filter((provider) => (options.providerIds?.length ?? 0) === 0 || options.providerIds?.includes(provider.id));\n const challengePressure = options.tier?.challengePressure ?? this.calculateChallengePressure(selectedProviders);\n const tierRoute = selectTierRoute(this.tierConfig, {\n hybridEligible: this.isHybridEligible(selectedProviders),\n preferredTier: options.tier?.preferred,\n forceRestrictedSafe: options.tier?.forceRestrictedSafe,\n challengePressure,\n highFrictionTarget: options.tier?.highFrictionTarget,\n riskScore: options.tier?.riskScore ?? this.calculateRiskScore(selectedProviders, challengePressure),\n hybridHealthy: options.tier?.hybridHealthy ?? this.isHybridHealthy(selectedProviders),\n policyRestrictedSafe: options.tier?.policyRestrictedSafe ?? false,\n latencyBudgetExceeded: options.tier?.latencyBudgetExceeded ?? this.isLatencyBudgetExceeded(selectedProviders, operation),\n errorBudgetExceeded: options.tier?.errorBudgetExceeded ?? this.isErrorBudgetExceeded(selectedProviders),\n recoveryStableForMs: options.tier?.recoveryStableForMs,\n policyAllowsRecovery: options.tier?.policyAllowsRecovery\n });\n const tierMetadata = tierRoute.tier;\n\n this.logger.info(\"provider.tier.selected\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n selected: tierMetadata.selected,\n reasonCode: tierMetadata.reasonCode,\n operation,\n selection\n }\n });\n\n if (selectedProviders.length === 0) {\n const meta = createExecutionMetadata({\n tier: tierMetadata,\n provider: \"runtime\",\n retrievalPath: `${operation}:${selection}:unavailable`\n });\n const failure = normalizeFailure(\"runtime\", \"web\", new ProviderRuntimeError(\"unavailable\", \"No providers available\", {\n retryable: false,\n details: {\n operation,\n selection\n }\n }), {\n trace,\n startedAtMs: startedAt,\n meta\n });\n\n return {\n ok: false,\n records: [],\n trace: failure.trace,\n partial: false,\n failures: [{ provider: failure.provider, source: failure.source, error: failure.error }],\n metrics: {\n attempted: 0,\n succeeded: 0,\n failed: 1,\n retries: 0,\n latencyMs: failure.latencyMs\n },\n sourceSelection: selection,\n providerOrder: [],\n meta,\n diagnostics: this.buildDiagnostics({\n enabled: false,\n scope: \"runtime\",\n global: { limit: this.budgets.concurrency.global, min: 1, max: this.budgets.concurrency.global },\n scoped: { limit: this.budgets.concurrency.perProvider, min: 1, max: this.budgets.concurrency.perProvider }\n }, { enabled: this.promptGuardEnabled, quarantinedSegments: 0, entries: 0 }, []),\n error: failure.error\n };\n }\n\n const timeout = options.timeoutMs ?? this.budgets.timeoutMs[operation];\n if (selection === \"all\") {\n return this.executeAll(\n selectedProviders,\n operation,\n input,\n trace,\n timeout,\n selection,\n startedAt,\n tierMetadata,\n options.providerIds,\n options\n );\n }\n\n return this.executeSequential(\n selectedProviders,\n operation,\n input,\n trace,\n timeout,\n selection,\n startedAt,\n tierMetadata,\n options.providerIds,\n options\n );\n }\n\n private async executeSequential<Operation extends ProviderOperation>(\n providers: ProviderAdapter[],\n operation: Operation,\n input: ProviderCallResultByOperation[Operation],\n trace: TraceContext,\n timeoutMs: number,\n selection: ProviderSelection,\n startedAt: number,\n tierMetadata: ProviderTierMetadata,\n providerIds?: string[],\n runOptions: ProviderRunOptions = {}\n ): Promise<ProviderAggregateResult> {\n const failures: ProviderAggregateResult[\"failures\"] = [];\n let retries = 0;\n const attemptedOrder: string[] = [];\n let diagnostics: ProviderRuntimeDiagnostics | undefined;\n let blocker: BlockerSignalV1 | undefined;\n\n for (const provider of providers) {\n attemptedOrder.push(provider.id);\n const result = await this.invokeProvider(provider, operation, input, trace, timeoutMs, tierMetadata, runOptions);\n retries += result.retries;\n diagnostics = result.diagnostics ?? diagnostics;\n blocker = result.meta?.blocker ?? blocker;\n if (result.ok) {\n return {\n ok: true,\n records: result.records,\n trace: result.trace,\n partial: failures.length > 0,\n failures,\n metrics: {\n attempted: failures.length + 1,\n succeeded: 1,\n failed: failures.length,\n retries,\n latencyMs: Math.max(0, Date.now() - startedAt)\n },\n sourceSelection: selection,\n providerOrder: providers.map((candidate) => candidate.id),\n ...(result.meta ? { meta: result.meta } : {}),\n ...(result.diagnostics ? { diagnostics: result.diagnostics } : {})\n };\n }\n failures.push({\n provider: result.provider,\n source: result.source,\n error: result.error\n });\n }\n\n if (shouldFallbackToTierA(tierMetadata.selected)) {\n const fallbackProviders = this.selectTierAProviders(operation, providerIds, attemptedOrder);\n if (fallbackProviders.length > 0) {\n this.logger.warn(\"provider.tier.transition\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n previousTier: tierMetadata.selected,\n nextTier: \"A\",\n reasonCode: \"fallback_to_tier_a\"\n }\n });\n }\n\n const fallbackTier = fallbackTierMetadata();\n for (const provider of fallbackProviders) {\n attemptedOrder.push(provider.id);\n const fallback = await this.invokeProvider(provider, operation, input, trace, timeoutMs, fallbackTier, runOptions);\n retries += fallback.retries;\n diagnostics = fallback.diagnostics ?? diagnostics;\n blocker = fallback.meta?.blocker ?? blocker;\n if (fallback.ok) {\n return {\n ok: true,\n records: fallback.records,\n trace: fallback.trace,\n partial: failures.length > 0,\n failures,\n metrics: {\n attempted: failures.length + 1,\n succeeded: 1,\n failed: failures.length,\n retries,\n latencyMs: Math.max(0, Date.now() - startedAt)\n },\n sourceSelection: selection,\n providerOrder: [...providers, ...fallbackProviders].map((candidate) => candidate.id),\n ...(fallback.meta ? { meta: fallback.meta } : {}),\n ...(fallback.diagnostics ? { diagnostics: fallback.diagnostics } : {})\n };\n }\n failures.push({\n provider: fallback.provider,\n source: fallback.source,\n error: fallback.error\n });\n }\n }\n\n const error = failures.at(-1)?.error;\n const meta = failures.length > 0\n ? createExecutionMetadata({\n tier: tierMetadata,\n provider: failures.at(-1)?.provider ?? \"runtime\",\n retrievalPath: `${operation}:${selection}:failure`\n })\n : undefined;\n if (meta && blocker) {\n meta.blocker = blocker;\n }\n return {\n ok: false,\n records: [],\n trace,\n partial: false,\n failures,\n metrics: {\n attempted: failures.length,\n succeeded: 0,\n failed: failures.length,\n retries,\n latencyMs: Math.max(0, Date.now() - startedAt)\n },\n sourceSelection: selection,\n providerOrder: attemptedOrder.length > 0 ? attemptedOrder : providers.map((provider) => provider.id),\n ...(meta ? { meta } : {}),\n ...(diagnostics ? { diagnostics } : {}),\n ...(error ? { error } : {})\n };\n }\n\n private async executeAll<Operation extends ProviderOperation>(\n providers: ProviderAdapter[],\n operation: Operation,\n input: ProviderCallResultByOperation[Operation],\n trace: TraceContext,\n timeoutMs: number,\n selection: ProviderSelection,\n startedAt: number,\n tierMetadata: ProviderTierMetadata,\n providerIds?: string[],\n runOptions: ProviderRunOptions = {}\n ): Promise<ProviderAggregateResult> {\n const results = await Promise.all(\n providers.map((provider) => this.invokeProvider(provider, operation, input, trace, timeoutMs, tierMetadata, runOptions))\n );\n\n const records: NormalizedRecord[] = [];\n const failures: ProviderAggregateResult[\"failures\"] = [];\n let retries = 0;\n let attempted = results.length;\n let meta: ProviderExecutionMetadata | undefined;\n let diagnostics: ProviderRuntimeDiagnostics | undefined;\n let fallbackProviderIds: string[] = [];\n let blocker: BlockerSignalV1 | undefined;\n\n for (const result of results) {\n retries += result.retries;\n if (result.ok) {\n records.push(...result.records);\n meta = result.meta ?? meta;\n blocker = result.meta?.blocker ?? blocker;\n diagnostics = result.diagnostics ?? diagnostics;\n continue;\n }\n failures.push({\n provider: result.provider,\n source: result.source,\n error: result.error\n });\n diagnostics = result.diagnostics ?? diagnostics;\n meta = result.meta ?? meta;\n blocker = result.meta?.blocker ?? blocker;\n }\n\n if (records.length === 0 && shouldFallbackToTierA(tierMetadata.selected)) {\n const fallbackTier = fallbackTierMetadata();\n const fallbackProviders = this.selectTierAProviders(operation, providerIds, providers.map((provider) => provider.id));\n fallbackProviderIds = fallbackProviders.map((provider) => provider.id);\n if (fallbackProviders.length > 0) {\n this.logger.warn(\"provider.tier.transition\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n previousTier: tierMetadata.selected,\n nextTier: \"A\",\n reasonCode: \"fallback_to_tier_a\"\n }\n });\n }\n\n const fallbackResults = await Promise.all(\n fallbackProviders.map((provider) => this.invokeProvider(provider, operation, input, trace, timeoutMs, fallbackTier, runOptions))\n );\n\n for (const result of fallbackResults) {\n attempted += 1;\n retries += result.retries;\n diagnostics = result.diagnostics ?? diagnostics;\n meta = result.meta ?? meta;\n blocker = result.meta?.blocker ?? blocker;\n if (result.ok) {\n records.push(...result.records);\n continue;\n }\n failures.push({\n provider: result.provider,\n source: result.source,\n error: result.error\n });\n }\n }\n\n const ok = records.length > 0;\n const attemptedProviders = [\n ...providers.map((provider) => provider.id),\n ...fallbackProviderIds\n ];\n if (meta && blocker) {\n meta.blocker = blocker;\n }\n return {\n ok,\n records,\n trace,\n partial: ok && failures.length > 0,\n failures,\n metrics: {\n attempted,\n succeeded: attempted - failures.length,\n failed: failures.length,\n retries,\n latencyMs: Math.max(0, Date.now() - startedAt)\n },\n sourceSelection: selection,\n providerOrder: attemptedProviders,\n ...(meta ? { meta } : {}),\n ...(diagnostics ? { diagnostics } : {}),\n ...(!ok && failures[0] ? { error: failures[0].error } : {})\n };\n }\n\n private async invokeProvider<Operation extends ProviderOperation>(\n provider: ProviderAdapter,\n operation: Operation,\n input: ProviderCallResultByOperation[Operation],\n trace: TraceContext,\n timeoutMs: number,\n tierMetadata: ProviderTierMetadata,\n runOptions: ProviderRunOptions\n ): Promise<ProviderOperationResult> {\n const startedAt = Date.now();\n const scopeKey = this.resolveScopeKey(provider.id, operation, input);\n const initialAdaptive = this.adaptiveConcurrency.snapshot(scopeKey);\n\n if (this.registry.isCircuitOpen(provider.id)) {\n const failure = normalizeFailure(provider.id, provider.source, this.registry.getCircuitError(provider.id), {\n trace,\n startedAtMs: startedAt,\n attempts: 1,\n retries: 0,\n meta: createExecutionMetadata({\n tier: tierMetadata,\n provider: provider.id,\n retrievalPath: `${operation}:${scopeKey}:circuit_open`\n })\n });\n failure.diagnostics = this.buildDiagnostics(initialAdaptive, {\n enabled: this.promptGuardEnabled,\n quarantinedSegments: 0,\n entries: 0\n }, []);\n return failure;\n }\n\n const retries = isReadOperation(operation)\n ? this.budgets.retries.read\n : this.budgets.retries.write;\n const maxAttempts = Math.max(1, retries + 1);\n const preparedInput = this.applyAdaptiveOperationInput(provider, operation, input, initialAdaptive);\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n try {\n const preflight = this.antiBotPolicy.preflight({\n providerId: provider.id,\n operation\n });\n if (!preflight.allow) {\n const reasonCode = preflight.reasonCode ?? \"cooldown_active\";\n throw new ProviderRuntimeError(\n providerErrorCodeFromReasonCode(reasonCode),\n `Provider execution paused by anti-bot policy for ${provider.id}`,\n {\n provider: provider.id,\n source: provider.source,\n retryable: false,\n reasonCode,\n details: {\n reasonCode,\n ...(typeof preflight.retryAfterMs === \"number\" ? { retryAfterMs: preflight.retryAfterMs } : {}),\n ...(preflight.retryGuidance ? { retryGuidance: preflight.retryGuidance } : {}),\n ...(preflight.proxyHint ? { proxyHint: preflight.proxyHint } : {}),\n ...(preflight.sessionHint ? { sessionHint: preflight.sessionHint } : {})\n }\n }\n );\n }\n\n const records = await this.withProviderConcurrency(provider.id, scopeKey, async () => {\n return this.withTimeout(timeoutMs, async (signal) => {\n const context: ProviderContext = {\n trace: createTraceContext(trace, provider.id),\n timeoutMs,\n attempt,\n signal,\n ...(typeof runOptions.useCookies === \"boolean\" ? { useCookies: runOptions.useCookies } : {}),\n ...(runOptions.cookiePolicyOverride\n ? { cookiePolicyOverride: runOptions.cookiePolicyOverride }\n : {}),\n ...(this.browserFallbackPort\n ? { browserFallbackPort: this.browserFallbackPort }\n : {})\n };\n return this.callOperation(provider, operation, preparedInput, context);\n });\n });\n const guarded = applyPromptGuard(records, this.promptGuardEnabled);\n if (guarded.audit.entries.length > 0) {\n this.logger.audit(\"provider.prompt_guard\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n provider: provider.id,\n operation,\n entries: guarded.audit.entries.length,\n quarantinedSegments: guarded.audit.quarantinedSegments\n }\n });\n }\n const realismPatterns = this.detectRealismViolations(guarded.records);\n if (realismPatterns.length > 0) {\n this.logger.warn(\"provider.realism.violation\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n provider: provider.id,\n operation,\n patterns: realismPatterns\n }\n });\n }\n\n const meta = createExecutionMetadata({\n tier: tierMetadata,\n provider: provider.id,\n retrievalPath: `${operation}:${scopeKey}`\n });\n\n const success = normalizeSuccess(provider.id, provider.source, guarded.records, {\n trace,\n startedAtMs: startedAt,\n attempts: attempt,\n retries: attempt - 1,\n meta,\n provenance: {\n provider: provider.id,\n source: provider.source,\n operation,\n retrievalPath: meta.provenance.retrievalPath,\n retrievedAt: meta.provenance.retrievedAt\n }\n });\n this.adaptiveConcurrency.observe(scopeKey, {\n latencyMs: success.latencyMs,\n queuePressure: this.queuePressure(scopeKey)\n });\n const adaptive = this.adaptiveConcurrency.snapshot(scopeKey);\n success.diagnostics = this.buildDiagnostics(adaptive, {\n enabled: guarded.audit.enabled,\n quarantinedSegments: guarded.audit.quarantinedSegments,\n entries: guarded.audit.entries.length\n }, realismPatterns);\n if (operation === \"post\") {\n this.logger.audit(\"provider.post\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n provider: provider.id,\n source: provider.source,\n operation,\n decision: \"allow\",\n recordCount: success.records.length,\n payloadHashes: success.records\n .map((record) => record.attributes?.auditHash)\n .filter((hash): hash is string => typeof hash === \"string\")\n }\n });\n }\n this.registry.markSuccess(provider.id, success.latencyMs);\n this.antiBotPolicy.postflight({\n providerId: provider.id,\n operation,\n success: true,\n retryable: false,\n attempt,\n maxAttempts\n });\n return success;\n } catch (error) {\n let normalizedError = toProviderError(error, {\n provider: provider.id,\n source: provider.source\n });\n const reasonCode = normalizedError.reasonCode\n ?? normalizeProviderReasonCode({\n code: normalizedError.code,\n message: normalizedError.message,\n details: normalizedError.details\n });\n if (reasonCode && normalizedError.reasonCode !== reasonCode) {\n normalizedError = {\n ...normalizedError,\n reasonCode,\n details: {\n ...(normalizedError.details ?? {}),\n reasonCode\n }\n };\n }\n this.adaptiveConcurrency.observe(scopeKey, {\n latencyMs: Math.max(0, Date.now() - startedAt),\n timeout: normalizedError.code === \"timeout\",\n challenge: this.isChallengeError(normalizedError.message),\n http4xx: this.isClientError(normalizedError.code, normalizedError.message),\n http5xx: this.isServerError(normalizedError.code, normalizedError.message),\n queuePressure: this.queuePressure(scopeKey)\n });\n this.registry.markFailure(provider.id, normalizedError, this.budgets.circuitBreaker);\n\n const postflight = this.antiBotPolicy.postflight({\n providerId: provider.id,\n operation,\n success: false,\n reasonCode,\n retryable: normalizedError.retryable,\n attempt,\n maxAttempts\n });\n if (attempt < maxAttempts && postflight.allowRetry) {\n continue;\n }\n\n const meta = createExecutionMetadata({\n tier: tierMetadata,\n provider: provider.id,\n retrievalPath: `${operation}:${scopeKey}:failure`\n });\n const blocker = this.detectRuntimeBlocker({\n operation,\n code: normalizedError.code,\n message: normalizedError.message,\n details: normalizedError.details,\n retryable: normalizedError.retryable,\n trace\n });\n if (blocker) {\n meta.blocker = blocker;\n }\n const failure = normalizeFailure(provider.id, provider.source, normalizedError, {\n trace,\n startedAtMs: startedAt,\n attempts: attempt,\n retries: attempt - 1,\n meta\n });\n failure.diagnostics = this.buildDiagnostics(this.adaptiveConcurrency.snapshot(scopeKey), {\n enabled: this.promptGuardEnabled,\n quarantinedSegments: 0,\n entries: 0\n }, []);\n if (operation === \"post\") {\n this.logger.audit(\"provider.post\", {\n requestId: trace.requestId,\n sessionId: trace.sessionId,\n data: {\n provider: provider.id,\n source: provider.source,\n operation,\n decision: \"deny\",\n error: failure.error.code\n }\n });\n }\n return failure;\n }\n }\n\n const exhausted = normalizeFailure(provider.id, provider.source, new ProviderRuntimeError(\"internal\", \"Provider invocation exhausted attempts\", {\n provider: provider.id,\n source: provider.source\n }), {\n trace,\n startedAtMs: startedAt,\n attempts: maxAttempts,\n retries: Math.max(0, maxAttempts - 1),\n meta: createExecutionMetadata({\n tier: tierMetadata,\n provider: provider.id,\n retrievalPath: `${operation}:${scopeKey}:exhausted`\n })\n });\n exhausted.diagnostics = this.buildDiagnostics(this.adaptiveConcurrency.snapshot(scopeKey), {\n enabled: this.promptGuardEnabled,\n quarantinedSegments: 0,\n entries: 0\n }, []);\n return exhausted;\n }\n\n private async callOperation<Operation extends ProviderOperation>(\n provider: ProviderAdapter,\n operation: Operation,\n input: ProviderCallResultByOperation[Operation],\n context: ProviderContext\n ): Promise<NormalizedRecord[]> {\n switch (operation) {\n case \"search\":\n if (!provider.search) {\n throw new ProviderRuntimeError(\"not_supported\", \"Search operation is not supported\", {\n provider: provider.id,\n source: provider.source,\n retryable: false\n });\n }\n return provider.search(input as ProviderCallResultByOperation[\"search\"], context);\n case \"fetch\":\n if (!provider.fetch) {\n throw new ProviderRuntimeError(\"not_supported\", \"Fetch operation is not supported\", {\n provider: provider.id,\n source: provider.source,\n retryable: false\n });\n }\n return provider.fetch(input as ProviderCallResultByOperation[\"fetch\"], context);\n case \"crawl\":\n if (!provider.crawl) {\n throw new ProviderRuntimeError(\"not_supported\", \"Crawl operation is not supported\", {\n provider: provider.id,\n source: provider.source,\n retryable: false\n });\n }\n return provider.crawl(input as ProviderCallResultByOperation[\"crawl\"], context);\n case \"post\":\n if (!provider.post) {\n throw new ProviderRuntimeError(\"not_supported\", \"Post operation is not supported\", {\n provider: provider.id,\n source: provider.source,\n retryable: false\n });\n }\n return provider.post(input as ProviderCallResultByOperation[\"post\"], context);\n }\n }\n\n private async withProviderConcurrency<T>(providerId: string, scopeKey: string, task: () => Promise<T>): Promise<T> {\n const adaptive = this.adaptiveConcurrency.snapshot(scopeKey);\n this.globalSemaphore.setLimit(adaptive.global.limit);\n const scopedSemaphore = this.scopedSemaphores.get(scopeKey)\n ?? this.scopedSemaphores.get(providerId)\n ?? new Semaphore(adaptive.scoped.limit);\n scopedSemaphore.setLimit(adaptive.scoped.limit);\n this.scopedSemaphores.set(scopeKey, scopedSemaphore);\n\n return this.globalSemaphore.use(async () => scopedSemaphore.use(task));\n }\n\n private createAdaptiveConcurrencyController(): AdaptiveConcurrencyController {\n return new AdaptiveConcurrencyController({\n enabled: this.adaptiveConfig.enabled,\n baselineGlobal: this.budgets.concurrency.global,\n baselineScoped: this.budgets.concurrency.perDomain ?? this.budgets.concurrency.perProvider,\n maxGlobal: this.adaptiveConfig.maxGlobal,\n maxScoped: this.adaptiveConfig.maxPerDomain\n });\n }\n\n private selectTierAProviders(\n operation: ProviderOperation,\n providerIds: string[] | undefined,\n excludeProviderIds: string[] = []\n ): ProviderAdapter[] {\n return selectProviders(this.registry, operation, \"web\")\n .filter((provider) => !excludeProviderIds.includes(provider.id))\n .filter((provider) => (providerIds?.length ?? 0) === 0 || providerIds?.includes(provider.id));\n }\n\n private calculateChallengePressure(providers: ProviderAdapter[]): number {\n if (providers.length === 0) return 0;\n let total = 0;\n for (const provider of providers) {\n const status = this.registry.getHealth(provider.id).status;\n if (status === \"unhealthy\") total += 1;\n else if (status === \"degraded\") total += 0.5;\n }\n return total / providers.length;\n }\n\n private calculateRiskScore(providers: ProviderAdapter[], challengePressure: number): number {\n if (providers.length === 0) return Math.max(0, Math.min(1, challengePressure));\n let unhealthy = 0;\n let degraded = 0;\n for (const provider of providers) {\n const health = this.registry.getHealth(provider.id);\n if (health.status === \"unhealthy\") unhealthy += 1;\n else if (health.status === \"degraded\") degraded += 1;\n }\n const healthPressure = (unhealthy + degraded * 0.5) / providers.length;\n return Math.max(0, Math.min(1, Math.max(challengePressure, healthPressure)));\n }\n\n private isHybridHealthy(providers: ProviderAdapter[]): boolean {\n const hybridProviders = providers.filter((provider) => provider.source !== \"web\");\n if (hybridProviders.length === 0) return false;\n return hybridProviders.some((provider) => {\n const health = this.registry.getHealth(provider.id);\n return health.status !== \"unhealthy\" && !this.registry.isCircuitOpen(provider.id);\n });\n }\n\n private isLatencyBudgetExceeded(\n providers: ProviderAdapter[],\n operation: ProviderOperation\n ): boolean {\n const timeoutBudget = this.budgets.timeoutMs[operation];\n return providers.some((provider) => {\n if (provider.source === \"web\") return false;\n const latency = this.registry.getHealth(provider.id).latencyMs;\n return typeof latency === \"number\" && latency > timeoutBudget;\n });\n }\n\n private isErrorBudgetExceeded(providers: ProviderAdapter[]): boolean {\n if (providers.length === 0) return false;\n let violations = 0;\n for (const provider of providers) {\n const status = this.registry.getHealth(provider.id).status;\n if (status === \"unhealthy\") {\n violations += 1;\n }\n }\n return violations / providers.length >= 0.5;\n }\n\n private isHybridEligible(providers: ProviderAdapter[]): boolean {\n return providers.some((provider) => provider.source !== \"web\");\n }\n\n private resolveScopeKey<Operation extends ProviderOperation>(\n providerId: string,\n operation: Operation,\n input: ProviderCallResultByOperation[Operation]\n ): string {\n const extractHost = (value: string | undefined): string | null => {\n if (!value) return null;\n try {\n return new URL(value).hostname.toLowerCase();\n } catch {\n return null;\n }\n };\n\n if (operation === \"fetch\") {\n return extractHost((input as ProviderCallResultByOperation[\"fetch\"]).url) ?? providerId;\n }\n if (operation === \"crawl\") {\n const first = (input as ProviderCallResultByOperation[\"crawl\"]).seedUrls[0];\n return extractHost(first) ?? providerId;\n }\n if (operation === \"search\") {\n return extractHost((input as ProviderCallResultByOperation[\"search\"]).query) ?? providerId;\n }\n return providerId;\n }\n\n private queuePressure(scopeKey: string): number {\n const global = this.globalSemaphore.snapshot();\n const scoped = this.scopedSemaphores.get(scopeKey)?.snapshot();\n const globalPressure = global.limit <= 0 ? 0 : Math.min(1, (global.active + global.queued) / global.limit);\n const scopedPressure = !scoped || scoped.limit <= 0\n ? 0\n : Math.min(1, (scoped.active + scoped.queued) / scoped.limit);\n return Math.max(globalPressure, scopedPressure);\n }\n\n private detectRealismViolations(records: NormalizedRecord[]): string[] {\n const matched = new Set<string>();\n for (const record of records) {\n const haystacks = [record.url ?? \"\", record.title ?? \"\", record.content ?? \"\"];\n for (const pattern of PLACEHOLDER_PATTERNS) {\n if (haystacks.some((value) => pattern.regex.test(value))) {\n matched.add(pattern.code);\n }\n }\n }\n return [...matched];\n }\n\n private applyAdaptiveOperationInput<Operation extends ProviderOperation>(\n provider: ProviderAdapter,\n operation: Operation,\n input: ProviderCallResultByOperation[Operation],\n adaptive: AdaptiveConcurrencyDiagnostics\n ): ProviderCallResultByOperation[Operation] {\n if (!adaptive.enabled || operation !== \"crawl\" || provider.source !== \"web\") {\n return input;\n }\n\n const crawlInput = input as ProviderCallResultByOperation[\"crawl\"];\n const scopedLimit = Math.max(1, Math.floor(adaptive.scoped.limit));\n const currentMaxPerDomain = typeof crawlInput.maxPerDomain === \"number\"\n ? Math.max(1, Math.floor(crawlInput.maxPerDomain))\n : undefined;\n const currentFetchConcurrency = toPositiveInt(crawlInput.filters?.fetchConcurrency, scopedLimit);\n const nextMaxPerDomain = currentMaxPerDomain !== undefined\n ? Math.min(currentMaxPerDomain, scopedLimit)\n : scopedLimit;\n const nextFetchConcurrency = Math.min(currentFetchConcurrency, scopedLimit);\n\n if (currentMaxPerDomain === nextMaxPerDomain && currentFetchConcurrency === nextFetchConcurrency) {\n return input;\n }\n\n return {\n ...crawlInput,\n maxPerDomain: nextMaxPerDomain,\n filters: {\n ...(crawlInput.filters ?? {}),\n fetchConcurrency: nextFetchConcurrency as JsonValue\n }\n } as unknown as ProviderCallResultByOperation[Operation];\n }\n\n private isChallengeError(message: string): boolean {\n return /captcha|challenge|cf_chl|interstitial|bot/i.test(message);\n }\n\n private isClientError(code: string, message: string): boolean {\n return code === \"auth\"\n || code === \"invalid_input\"\n || code === \"policy_blocked\"\n || /\\b4\\d{2}\\b/.test(message);\n }\n\n private isServerError(code: string, message: string): boolean {\n return code === \"upstream\"\n || code === \"unavailable\"\n || /\\b5\\d{2}\\b/.test(message);\n }\n\n private buildDiagnostics(\n adaptive: AdaptiveConcurrencyDiagnostics,\n promptGuard: { enabled: boolean; quarantinedSegments: number; entries: number },\n realismPatterns: string[]\n ): ProviderRuntimeDiagnostics {\n return {\n adaptiveConcurrency: adaptive,\n promptGuard,\n realism: {\n violations: realismPatterns.length,\n patterns: realismPatterns\n }\n };\n }\n\n private detectRuntimeBlocker(params: {\n operation: ProviderOperation;\n code: string;\n message: string;\n details?: Record<string, JsonValue>;\n retryable: boolean;\n trace: TraceContext;\n }): BlockerSignalV1 | undefined {\n const details = params.details;\n const url = typeof details?.url === \"string\"\n ? details.url\n : undefined;\n const hostFromUrl = (() => {\n if (!url) return null;\n try {\n return new URL(url).hostname.toLowerCase();\n } catch {\n return null;\n }\n })();\n const status = typeof details?.status === \"number\" ? details.status : undefined;\n const normalizedReasonCode = normalizeProviderReasonCode({\n code: params.code as ProviderErrorCode,\n message: params.message,\n status,\n details\n });\n const envLimited = normalizedReasonCode === \"env_limited\"\n || (\n params.code === \"unavailable\"\n && /extension not connected|not available in this environment|manual interaction/i.test(params.message)\n );\n const blocker = classifyBlockerSignal({\n source: params.operation === \"post\" ? \"macro_execution\" : \"runtime_fetch\",\n ...(url ? { url } : {}),\n ...(status !== undefined ? { status } : {}),\n providerErrorCode: params.code,\n message: params.message,\n networkHosts: hostFromUrl ? [hostFromUrl] : undefined,\n traceRequestId: params.trace.requestId,\n retryable: params.retryable,\n envLimited,\n promptGuardEnabled: this.promptGuardEnabled,\n threshold: this.blockerDetectionThreshold\n });\n if (!blocker) return undefined;\n if (blocker.reasonCode || !normalizedReasonCode) {\n return blocker;\n }\n return {\n ...blocker,\n reasonCode: normalizedReasonCode\n };\n }\n\n private async withTimeout<T>(\n timeoutMs: number,\n task: (signal: AbortSignal) => Promise<T>\n ): Promise<T> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => {\n controller.abort(\"timeout\");\n }, timeoutMs);\n\n try {\n const result = await task(controller.signal);\n if (controller.signal.aborted) {\n throw new ProviderRuntimeError(\"timeout\", `Provider request timed out after ${timeoutMs}ms`);\n }\n return result;\n } catch (error) {\n if (controller.signal.aborted) {\n throw new ProviderRuntimeError(\"timeout\", `Provider request timed out after ${timeoutMs}ms`, {\n retryable: true,\n cause: error\n });\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n\nexport const createProviderRuntime = (init: RuntimeInit = {}): ProviderRuntime => {\n return new ProviderRuntime(init);\n};\n\nconst withDefaultWebOptions = (\n options: WebProviderOptions | undefined,\n browserFallbackPort?: BrowserFallbackPort\n): WebProviderOptions => {\n const providerId = options?.id ?? \"web/default\";\n return {\n ...options,\n fetcher: options?.fetcher ?? (async (url: string) => {\n const document = await fetchRuntimeDocumentWithFallback({\n url,\n provider: providerId,\n source: \"web\",\n operation: \"fetch\",\n browserFallbackPort\n });\n return {\n url: document.url,\n status: document.status,\n html: document.html\n };\n }),\n searchIndex: options?.searchIndex ?? (async (input, context) => {\n const query = input.query.trim();\n const lookupUrl = isHttpUrl(query)\n ? query\n : `https://duckduckgo.com/html/?q=${encodeURIComponent(query)}&ia=web`;\n const document = await fetchRuntimeDocumentWithFallback({\n url: lookupUrl,\n provider: providerId,\n source: \"web\",\n operation: \"search\",\n signal: context.signal,\n context,\n browserFallbackPort\n });\n\n const limit = Math.max(1, Math.min(input.limit ?? 5, 10));\n const links = dedupeLinks(document.links, document.url, limit);\n const searchPath = isHttpUrl(query) ? \"web:search:url\" : \"web:search:index\";\n if (links.length === 0) {\n return [{\n url: document.url,\n title: document.url,\n content: toSnippet(stripUrls(document.text), 1500),\n confidence: isHttpUrl(query) ? 0.75 : 0.55,\n attributes: {\n query,\n status: document.status,\n retrievalPath: searchPath\n }\n }];\n }\n\n return links.map((url, index) => ({\n url,\n title: url,\n ...(index === 0 ? { content: toSnippet(stripUrls(document.text), 700) } : {}),\n confidence: Math.max(0.35, 0.75 - index * 0.05),\n attributes: {\n query,\n rank: index + 1,\n status: document.status,\n retrievalPath: searchPath\n }\n }));\n })\n };\n};\n\nconst withDefaultCommunityOptions = (\n options: CommunityProviderOptions | undefined,\n browserFallbackPort?: BrowserFallbackPort\n): CommunityProviderOptions => {\n const providerId = options?.id ?? \"community/default\";\n return {\n ...options,\n search: options?.search ?? (async (input, context) => {\n const query = input.query.trim();\n const page = toPositiveInt(input.filters?.page, 1);\n const lookupUrl = isHttpUrl(query)\n ? query\n : `https://www.reddit.com/search/?q=${encodeURIComponent(query)}&sort=relevance&t=all&page=${page}`;\n const document = await fetchRuntimeDocumentWithFallback({\n url: lookupUrl,\n provider: providerId,\n source: \"community\",\n operation: \"search\",\n signal: context.signal,\n context,\n browserFallbackPort\n });\n const links = dedupeLinks(document.links, document.url, 20);\n\n return [{\n url: document.url,\n title: isHttpUrl(query) ? document.url : `Community search: ${query}`,\n content: toSnippet(stripUrls(document.text), 1800),\n confidence: isHttpUrl(query) ? 0.75 : 0.6,\n attributes: {\n query,\n page,\n status: document.status,\n links,\n retrievalPath: isHttpUrl(query) ? \"community:search:url\" : \"community:search:index\"\n }\n }];\n }),\n fetch: options?.fetch ?? (async (input, context) => {\n const document = await fetchRuntimeDocumentWithFallback({\n url: input.url,\n provider: providerId,\n source: \"community\",\n operation: \"fetch\",\n signal: context.signal,\n context,\n browserFallbackPort\n });\n const links = dedupeLinks(document.links, document.url, 20);\n return {\n url: document.url,\n title: document.url,\n content: document.text,\n attributes: {\n status: document.status,\n links,\n retrievalPath: \"community:fetch:url\"\n }\n };\n })\n };\n};\n\nconst withDefaultSocialPlatformOptions = (\n platform: SocialPlatform,\n options: SocialProviderOptions | undefined,\n browserFallbackPort?: BrowserFallbackPort\n): SocialProviderOptions => {\n const providerId = options?.id ?? `social/${platform}`;\n return {\n ...options,\n search: options?.search ?? (async (input, context) => {\n const query = input.query.trim();\n const page = toPositiveInt(input.filters?.page, 1);\n const lookupUrl = isHttpUrl(query)\n ? query\n : SOCIAL_SEARCH_ENDPOINTS[platform](query, page);\n const document = await fetchRuntimeDocumentWithFallback({\n url: lookupUrl,\n provider: providerId,\n source: \"social\",\n operation: \"search\",\n signal: context.signal,\n context,\n browserFallbackPort\n });\n const links = dedupeLinks(document.links, document.url, 20);\n\n return [{\n url: document.url,\n title: isHttpUrl(query) ? document.url : `${platform} search: ${query}`,\n content: toSnippet(stripUrls(document.text), 1600),\n confidence: isHttpUrl(query) ? 0.72 : 0.58,\n attributes: {\n platform,\n query,\n page,\n status: document.status,\n links,\n retrievalPath: isHttpUrl(query) ? \"social:search:url\" : \"social:search:index\"\n }\n }];\n }),\n fetch: options?.fetch ?? (async (input, context) => {\n const document = await fetchRuntimeDocumentWithFallback({\n url: input.url,\n provider: providerId,\n source: \"social\",\n operation: \"fetch\",\n signal: context.signal,\n context,\n browserFallbackPort\n });\n const links = dedupeLinks(document.links, document.url, 20);\n return {\n url: document.url,\n title: document.url,\n content: document.text,\n attributes: {\n platform,\n status: document.status,\n links,\n retrievalPath: \"social:fetch:url\"\n }\n };\n })\n };\n};\n\nconst withDefaultSocialOptions = (\n options: SocialProvidersOptions | undefined,\n runtimeInit: Pick<RuntimeInit, \"transcript\" | \"browserFallbackPort\" | \"antiBotPolicy\">\n): SocialProvidersOptions => ({\n x: withDefaultSocialPlatformOptions(\"x\", options?.x, runtimeInit.browserFallbackPort),\n reddit: withDefaultSocialPlatformOptions(\"reddit\", options?.reddit, runtimeInit.browserFallbackPort),\n bluesky: withDefaultSocialPlatformOptions(\"bluesky\", options?.bluesky, runtimeInit.browserFallbackPort),\n facebook: withDefaultSocialPlatformOptions(\"facebook\", options?.facebook, runtimeInit.browserFallbackPort),\n linkedin: withDefaultSocialPlatformOptions(\"linkedin\", options?.linkedin, runtimeInit.browserFallbackPort),\n instagram: withDefaultSocialPlatformOptions(\"instagram\", options?.instagram, runtimeInit.browserFallbackPort),\n tiktok: withDefaultSocialPlatformOptions(\"tiktok\", options?.tiktok, runtimeInit.browserFallbackPort),\n threads: withDefaultSocialPlatformOptions(\"threads\", options?.threads, runtimeInit.browserFallbackPort),\n youtube: withDefaultYouTubeOptions({\n ...(options?.youtube ?? {}),\n ...(runtimeInit.transcript\n ? {\n transcriptResolver: {\n modeDefault: runtimeInit.transcript.modeDefault,\n strategyOrder: runtimeInit.transcript.strategyOrder,\n enableYtdlp: runtimeInit.transcript.enableYtdlp,\n enableAsr: runtimeInit.transcript.enableAsr,\n enableYtdlpAudioAsr: runtimeInit.transcript.enableYtdlpAudioAsr,\n enableApify: runtimeInit.transcript.enableApify,\n apifyActorId: runtimeInit.transcript.apifyActorId,\n enableBrowserFallback: runtimeInit.transcript.enableBrowserFallback,\n ytdlpTimeoutMs: runtimeInit.transcript.ytdlpTimeoutMs\n }\n }\n : {}),\n ...(runtimeInit.browserFallbackPort\n ? { browserFallbackPort: runtimeInit.browserFallbackPort }\n : {}),\n ...(runtimeInit.antiBotPolicy\n ? { antiBotPolicy: runtimeInit.antiBotPolicy }\n : {})\n })\n});\n\nexport const createDefaultRuntime = (\n defaults: RuntimeDefaults = {},\n init: Omit<RuntimeInit, \"providers\"> = {}\n): ProviderRuntime => {\n const runtime = new ProviderRuntime(init);\n runtime.register(createWebProvider(withDefaultWebOptions(defaults.web, init.browserFallbackPort)));\n runtime.register(createCommunityProvider(withDefaultCommunityOptions(defaults.community, init.browserFallbackPort)));\n for (const provider of createSocialProviders(withDefaultSocialOptions(defaults.social, {\n transcript: init.transcript,\n browserFallbackPort: init.browserFallbackPort,\n antiBotPolicy: init.antiBotPolicy\n }))) {\n runtime.register(provider);\n }\n for (const provider of createShoppingProviders(defaults.shopping)) {\n runtime.register(provider);\n }\n return runtime;\n};\n\nconst mergeBudgets = (\n base: ProviderRuntimeBudgets,\n partial: Partial<ProviderRuntimeBudgets> | undefined\n): ProviderRuntimeBudgets => {\n if (!partial) return base;\n\n return {\n timeoutMs: {\n ...base.timeoutMs,\n ...(partial.timeoutMs ?? {})\n },\n retries: {\n ...base.retries,\n ...(partial.retries ?? {})\n },\n concurrency: {\n ...base.concurrency,\n ...(partial.concurrency ?? {})\n },\n circuitBreaker: {\n ...base.circuitBreaker,\n ...(partial.circuitBreaker ?? {})\n }\n };\n};\n\nexport { ProviderRegistry } from \"./registry\";\nexport { selectProviders } from \"./policy\";\nexport { createWebProvider } from \"./web\";\nexport { createCommunityProvider } from \"./community\";\nexport { createSocialProvider, createSocialProviders } from \"./social\";\nexport { createShoppingProvider, createShoppingProviders, createShoppingProviderById, SHOPPING_PROVIDER_IDS } from \"./shopping\";\nexport * from \"./timebox\";\nexport * from \"./enrichment\";\nexport * from \"./renderer\";\nexport * from \"./artifacts\";\nexport * from \"./workflows\";\nexport * from \"./types\";\nexport * from \"./errors\";\nexport * from \"./normalize\";\nexport * from \"./tier-router\";\nexport * from \"./adaptive-concurrency\";\nexport * from \"./blocker\";\n","import { randomUUID } from \"crypto\";\nimport { mkdir, rm } from \"fs/promises\";\nimport { join } from \"path\";\nimport { freemem, totalmem } from \"os\";\nimport { chromium, type Browser, type BrowserContext, type Page } from \"playwright-core\";\nimport { Mutex } from \"async-mutex\";\nimport type { OpenDevBrowserConfig } from \"../config\";\nimport { resolveCachePaths } from \"../cache/paths\";\nimport { findChromeExecutable } from \"../cache/chrome-locator\";\nimport { downloadChromeForTesting } from \"../cache/downloader\";\nimport { createLogger, createRequestId } from \"../core/logging\";\nimport { ConsoleTracker } from \"../devtools/console-tracker\";\nimport { ExceptionTracker } from \"../devtools/exception-tracker\";\nimport { NetworkTracker } from \"../devtools/network-tracker\";\nimport { captureDom } from \"../export/dom-capture\";\nimport { extractCss } from \"../export/css-extract\";\nimport { emitReactComponent, type ReactExport } from \"../export/react-emitter\";\nimport { RefStore } from \"../snapshot/refs\";\nimport { Snapshotter } from \"../snapshot/snapshotter\";\nimport { resolveRelayEndpoint, sanitizeWsEndpoint } from \"../relay/relay-endpoints\";\nimport { ensureLocalEndpoint } from \"../utils/endpoint-validation\";\nimport { buildBlockerArtifacts, classifyBlockerSignal } from \"../providers/blocker\";\nimport type { BlockerSignalV1 } from \"../providers/types\";\nimport {\n evaluateTier1Coherence,\n formatTier1Warnings,\n type Tier1CoherenceResult\n} from \"./fingerprint/tier1-coherence\";\nimport {\n applyTier2NetworkEvent,\n createTier2RuntimeState,\n type Tier2RuntimeState\n} from \"./fingerprint/tier2-runtime\";\nimport {\n createTier3RuntimeState,\n evaluateTier3Adaptive,\n type Tier3RuntimeState\n} from \"./fingerprint/tier3-adaptive\";\nimport { SessionStore, type BrowserMode } from \"./session-store\";\nimport { TargetManager, type TargetInfo } from \"./target-manager\";\nimport {\n createGovernorState,\n evaluateGovernor,\n rssUsagePercent,\n type ParallelModeVariant,\n type ParallelismGovernorSnapshot,\n type ParallelismGovernorState\n} from \"./parallelism-governor\";\n\nexport type LaunchOptions = {\n profile?: string;\n headless?: boolean;\n startUrl?: string;\n chromePath?: string;\n flags?: string[];\n persistProfile?: boolean;\n // Used by hub/daemon callers to force managed launch when routing through relay.\n noExtension?: boolean;\n};\n\nexport type ConnectOptions = {\n wsEndpoint?: string;\n host?: string;\n port?: number;\n};\n\nexport type ManagedSession = {\n sessionId: string;\n mode: BrowserMode;\n headless: boolean;\n extensionLegacy: boolean;\n browser: Browser;\n context: BrowserContext;\n profileDir: string;\n persistProfile: boolean;\n targets: TargetManager;\n refStore: RefStore;\n snapshotter: Snapshotter;\n consoleTracker: ConsoleTracker;\n exceptionTracker: ExceptionTracker;\n networkTracker: NetworkTracker;\n fingerprint: {\n tier1: Tier1CoherenceResult;\n tier2: Tier2RuntimeState;\n tier3: Tier3RuntimeState;\n lastAppliedNetworkSeq: number;\n };\n};\n\ntype BackpressureErrorInfo = {\n code: \"parallelism_backpressure\";\n classification: \"timeout\";\n sessionId: string;\n targetId: string;\n modeVariant: ParallelModeVariant;\n effectiveParallelCap: number;\n inFlight: number;\n waitQueueDepth: number;\n waitQueueAgeMs: number;\n pressure: \"healthy\" | \"medium\" | \"high\" | \"critical\";\n timeoutMs: number;\n};\n\ntype ParallelWaiter = {\n targetId: string;\n enqueuedAt: number;\n timeoutMs: number;\n resolve: () => void;\n reject: (error: Error) => void;\n timer: NodeJS.Timeout | null;\n};\n\ntype SessionParallelState = {\n structural: Mutex;\n inflight: number;\n waiters: ParallelWaiter[];\n waitingByTarget: Map<string, number[]>;\n governor: ParallelismGovernorState;\n lastSnapshot: ParallelismGovernorSnapshot;\n};\n\ntype FingerprintSignalApplyOptions = {\n applyTier2?: boolean;\n applyTier3?: boolean;\n source?: \"debug-trace\" | \"continuous\";\n};\n\ntype CookieImportRecord = {\n name: string;\n value: string;\n url?: string;\n domain?: string;\n path?: string;\n expires?: number;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n};\n\ntype CookieListRecord = {\n name: string;\n value: string;\n domain: string;\n path: string;\n expires: number;\n httpOnly: boolean;\n secure: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n};\n\nconst DOM_GET_ATTR_DECLARATION = `\n function(name) {\n /* odb-dom-get-attr */\n if (!(this instanceof Element)) return null;\n const value = this.getAttribute(name);\n return value === null ? null : String(value);\n }\n`;\n\nconst DOM_GET_VALUE_DECLARATION = `\n function() {\n /* odb-dom-get-value */\n if (\n this instanceof HTMLInputElement\n || this instanceof HTMLTextAreaElement\n || this instanceof HTMLSelectElement\n ) {\n return this.value;\n }\n const value = this instanceof Element ? this.getAttribute(\"value\") : null;\n return typeof value === \"string\" ? value : \"\";\n }\n`;\n\nconst DOM_IS_VISIBLE_DECLARATION = `\n function() {\n /* odb-dom-is-visible */\n if (!(this instanceof Element)) return false;\n const style = window.getComputedStyle(this);\n if (!style) return false;\n if (style.display === \"none\" || style.visibility === \"hidden\" || style.opacity === \"0\") {\n return false;\n }\n const rect = this.getBoundingClientRect();\n return rect.width > 0 && rect.height > 0;\n }\n`;\n\nconst DOM_IS_ENABLED_DECLARATION = `\n function() {\n /* odb-dom-is-enabled */\n if (!(this instanceof Element)) return false;\n if (this.hasAttribute(\"disabled\")) return false;\n if (this.getAttribute(\"aria-disabled\") === \"true\") return false;\n return true;\n }\n`;\n\nconst DOM_IS_CHECKED_DECLARATION = `\n function() {\n /* odb-dom-is-checked */\n if (this instanceof HTMLInputElement && (this.type === \"checkbox\" || this.type === \"radio\")) {\n return this.checked;\n }\n if (!(this instanceof Element)) return false;\n return this.getAttribute(\"aria-checked\") === \"true\";\n }\n`;\n\nexport class BrowserManager {\n private store = new SessionStore();\n private sessions = new Map<string, ManagedSession>();\n private sessionParallel = new Map<string, SessionParallelState>();\n private targetQueues = new Map<string, Promise<void>>();\n private networkSignalSubscriptions = new Map<string, () => void>();\n private worktree: string;\n private config: OpenDevBrowserConfig;\n private pageListeners = new WeakMap<Page, () => void>();\n private logger = createLogger(\"browser-manager\");\n\n constructor(worktree: string, config: OpenDevBrowserConfig) {\n this.worktree = worktree;\n this.config = config;\n }\n\n private getParallelState(sessionId: string): SessionParallelState {\n let state = this.sessionParallel.get(sessionId);\n if (state) {\n return state;\n }\n const managed = this.getManaged(sessionId);\n const modeVariant = this.resolveModeVariant(managed);\n const governor = createGovernorState(this.config.parallelism, modeVariant);\n const snapshot: ParallelismGovernorSnapshot = {\n state: governor,\n pressure: \"healthy\",\n targetCap: governor.effectiveCap,\n waitQueueDepth: 0,\n waitQueueAgeMs: 0\n };\n state = {\n structural: new Mutex(),\n inflight: 0,\n waiters: [],\n waitingByTarget: new Map(),\n governor,\n lastSnapshot: snapshot\n };\n this.sessionParallel.set(sessionId, state);\n return state;\n }\n\n updateConfig(config: OpenDevBrowserConfig): void {\n this.config = config;\n for (const managed of this.sessions.values()) {\n managed.consoleTracker.setOptions({ showFullConsole: config.devtools.showFullConsole });\n managed.networkTracker.setOptions({ showFullUrls: config.devtools.showFullUrls });\n managed.fingerprint.tier2.enabled = config.fingerprint.tier2.enabled;\n managed.fingerprint.tier2.mode = config.fingerprint.tier2.mode;\n managed.fingerprint.tier3.enabled = config.fingerprint.tier3.enabled;\n managed.fingerprint.tier3.fallbackTier = config.fingerprint.tier3.fallbackTier;\n const state = this.sessionParallel.get(managed.sessionId);\n if (!state) {\n continue;\n }\n const modeVariant = this.resolveModeVariant(managed);\n const next = createGovernorState(config.parallelism, modeVariant);\n state.governor = {\n ...next,\n effectiveCap: Math.max(\n config.parallelism.floor,\n Math.min(state.governor.effectiveCap, next.staticCap)\n ),\n healthyWindows: 0,\n lastSampleAt: 0,\n lastPressure: state.governor.lastPressure\n };\n state.lastSnapshot = {\n state: state.governor,\n pressure: state.governor.lastPressure,\n targetCap: state.governor.effectiveCap,\n waitQueueDepth: state.waiters.length,\n waitQueueAgeMs: 0\n };\n this.wakeWaiters(managed.sessionId);\n }\n }\n\n async launch(options: LaunchOptions): Promise<{ sessionId: string; mode: BrowserMode; activeTargetId: string | null; warnings: string[]; wsEndpoint?: string }> {\n const resolvedProfile = options.profile ?? this.config.profile;\n const resolvedHeadless = options.headless ?? this.config.headless;\n const persistProfile = options.persistProfile ?? this.config.persistProfile;\n\n const cachePaths = await resolveCachePaths(this.worktree, resolvedProfile);\n const executable = await findChromeExecutable(options.chromePath ?? this.config.chromePath);\n const warnings: string[] = [];\n\n let executablePath = executable;\n if (!executablePath) {\n const download = await downloadChromeForTesting(cachePaths.chromeDir);\n warnings.push(\"System Chrome not found. Downloaded Chrome for Testing.\");\n executablePath = download.executablePath;\n }\n\n const profileDir = persistProfile\n ? cachePaths.profileDir\n : join(cachePaths.projectRoot, \"temp-profiles\", randomUUID());\n\n await mkdir(profileDir, { recursive: true });\n\n let context: BrowserContext | null = null;\n\n try {\n context = await chromium.launchPersistentContext(profileDir, {\n headless: resolvedHeadless,\n executablePath: executablePath ?? undefined,\n args: options.flags ?? this.config.flags,\n viewport: null\n });\n\n const browser = context.browser();\n if (!browser) {\n throw new Error(\"Browser instance unavailable\");\n }\n const sessionId = randomUUID();\n const targets = new TargetManager();\n const pages = context.pages();\n\n if (pages.length === 0) {\n const page = await context.newPage();\n targets.registerPage(page);\n } else {\n targets.registerExistingPages(pages);\n }\n\n const activeTargetId = targets.getActiveTargetId();\n\n if (options.startUrl && activeTargetId) {\n await this.goto(sessionId, options.startUrl, \"load\", 30000, { browser, context, targets });\n }\n\n const refStore = new RefStore();\n const snapshotter = new Snapshotter(refStore);\n const consoleTracker = new ConsoleTracker(200, { showFullConsole: this.config.devtools.showFullConsole });\n const exceptionTracker = new ExceptionTracker(200);\n const networkTracker = new NetworkTracker(300, { showFullUrls: this.config.devtools.showFullUrls });\n const fingerprint = this.initializeFingerprintState(\n sessionId,\n resolvedProfile,\n options.flags ?? this.config.flags\n );\n warnings.push(...formatTier1Warnings(fingerprint.tier1));\n\n const managed: ManagedSession = {\n sessionId,\n mode: \"managed\",\n headless: resolvedHeadless,\n extensionLegacy: false,\n browser,\n context,\n profileDir,\n persistProfile,\n targets,\n refStore,\n snapshotter,\n consoleTracker,\n exceptionTracker,\n networkTracker,\n fingerprint\n };\n\n this.store.add({ id: sessionId, mode: \"managed\", browser, context });\n this.sessions.set(sessionId, managed);\n\n this.attachContinuousFingerprintSignals(managed);\n this.attachTrackers(managed);\n this.attachRefInvalidation(managed);\n\n const wsEndpointProvider = browser as unknown as { wsEndpoint?: () => string };\n const wsEndpoint = typeof wsEndpointProvider.wsEndpoint === \"function\"\n ? wsEndpointProvider.wsEndpoint()\n : undefined;\n\n if (!fingerprint.tier1.ok) {\n this.logger.warn(\"fingerprint.tier1.mismatch\", {\n sessionId,\n data: { issues: fingerprint.tier1.issues }\n });\n }\n\n return { sessionId, mode: \"managed\", activeTargetId, warnings, wsEndpoint: wsEndpoint || undefined };\n } catch (error) {\n const launchMessage = error instanceof Error ? error.message : \"Unknown error\";\n const profileLockMessage = this.buildProfileLockLaunchMessage(launchMessage, profileDir);\n const cleanupErrors: unknown[] = [];\n\n if (context) {\n try {\n await context.close();\n } catch (closeError) {\n cleanupErrors.push(closeError);\n }\n }\n\n if (!persistProfile) {\n try {\n await rm(profileDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });\n } catch (cleanupError) {\n cleanupErrors.push(cleanupError);\n }\n }\n\n if (cleanupErrors.length > 0) {\n const message = profileLockMessage ?? `Failed to launch browser context: ${launchMessage}`;\n throw new AggregateError(\n [error, ...cleanupErrors],\n `${message}. Cleanup failed.`\n );\n }\n\n if (profileLockMessage) {\n throw new Error(profileLockMessage, { cause: error });\n }\n\n throw new Error(`Failed to launch browser context: ${launchMessage}`, { cause: error });\n }\n }\n\n async connect(options: ConnectOptions): Promise<{ sessionId: string; mode: BrowserMode; activeTargetId: string | null; warnings: string[]; wsEndpoint?: string }> {\n const wsEndpoint = await this.resolveWsEndpoint(options);\n return this.connectWithEndpoint(wsEndpoint, \"cdpConnect\");\n }\n\n async connectRelay(wsEndpoint: string): Promise<{ sessionId: string; mode: BrowserMode; activeTargetId: string | null; warnings: string[]; wsEndpoint?: string; leaseId?: string }> {\n ensureLocalEndpoint(wsEndpoint, this.config.security.allowNonLocalCdp);\n const { connectEndpoint, reportedEndpoint } = await this.resolveRelayEndpoints(wsEndpoint);\n return this.connectWithEndpoint(connectEndpoint, \"extension\", reportedEndpoint);\n }\n\n async closeAll(): Promise<void> {\n const sessions = Array.from(this.sessions.keys());\n await Promise.allSettled(sessions.map(id => this.disconnect(id, true)));\n }\n\n async disconnect(sessionId: string, closeBrowser = false): Promise<void> {\n const managed = this.getManaged(sessionId);\n const cleanupErrors: unknown[] = [];\n\n try {\n for (const entry of managed.targets.listPageEntries()) {\n const cleanup = this.pageListeners.get(entry.page);\n if (cleanup) {\n try {\n cleanup();\n } catch (error) {\n cleanupErrors.push(error);\n }\n this.pageListeners.delete(entry.page);\n }\n }\n\n try {\n const unsubscribeSignals = this.networkSignalSubscriptions.get(sessionId);\n if (unsubscribeSignals) {\n unsubscribeSignals();\n this.networkSignalSubscriptions.delete(sessionId);\n }\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n try {\n const shouldCloseBrowser = closeBrowser || managed.mode !== \"managed\";\n if (shouldCloseBrowser) {\n if (managed.mode !== \"managed\") {\n const closePromise = managed.browser.close();\n const result = await Promise.race([\n closePromise.then(() => \"closed\"),\n delay(5000).then(() => \"timeout\")\n ]);\n if (result === \"timeout\") {\n closePromise.catch(() => {});\n console.warn(\"BrowserManager.disconnect: timed out closing CDP connection; continuing cleanup.\");\n }\n } else {\n await managed.browser.close();\n }\n } else {\n await managed.context.close();\n }\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n try {\n managed.consoleTracker.detach();\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n try {\n managed.exceptionTracker.detach();\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n try {\n managed.networkTracker.detach();\n } catch (error) {\n cleanupErrors.push(error);\n }\n\n if (!managed.persistProfile && managed.profileDir) {\n try {\n await rm(managed.profileDir, { recursive: true, force: true, maxRetries: 5, retryDelay: 100 });\n } catch (error) {\n cleanupErrors.push(error);\n }\n }\n } finally {\n this.sessions.delete(sessionId);\n this.clearSessionParallelState(sessionId);\n this.store.delete(sessionId);\n }\n\n if (cleanupErrors.length === 1) {\n throw cleanupErrors[0];\n }\n if (cleanupErrors.length > 1) {\n throw new AggregateError(cleanupErrors, \"Failed to disconnect browser session.\");\n }\n }\n\n async status(sessionId: string): Promise<{\n mode: BrowserMode;\n activeTargetId: string | null;\n url?: string;\n title?: string;\n meta?: {\n blocker?: BlockerSignalV1;\n blockerState: \"clear\" | \"active\" | \"resolving\";\n blockerUpdatedAt?: string;\n blockerResolution?: {\n status: \"resolved\" | \"unresolved\" | \"deferred\";\n reason: \"verifier_passed\" | \"verification_timeout\" | \"verifier_failed\" | \"env_limited\" | \"manual_clear\";\n updatedAt: string;\n };\n };\n }> {\n const managed = this.getManaged(sessionId);\n const activeTargetId = managed.targets.getActiveTargetId();\n const page = activeTargetId ? managed.targets.getPage(activeTargetId) : null;\n const title = await this.safePageTitle(page, \"BrowserManager.status\");\n const url = this.safePageUrl(page, \"BrowserManager.status\");\n const summary = this.store.getBlockerSummary(sessionId);\n\n return {\n mode: managed.mode,\n activeTargetId,\n url,\n title,\n meta: {\n blockerState: summary.state,\n ...(summary.blocker ? { blocker: summary.blocker } : {}),\n ...(summary.updatedAt ? { blockerUpdatedAt: summary.updatedAt } : {}),\n ...(summary.resolution ? { blockerResolution: summary.resolution } : {})\n }\n };\n }\n\n async withPage<T>(\n sessionId: string,\n targetId: string | null,\n fn: (page: Page) => Promise<T>\n ): Promise<T> {\n const managed = this.getManaged(sessionId);\n const page = targetId ? managed.targets.getPage(targetId) : managed.targets.getActivePage();\n if (managed.mode === \"extension\") {\n await this.waitForExtensionTargetReady(page, \"withPage\");\n }\n return await fn(page);\n }\n\n async listTargets(sessionId: string, includeUrls = false): Promise<{ activeTargetId: string | null; targets: TargetInfo[] }> {\n return this.runStructural(sessionId, async () => {\n const managed = this.getManaged(sessionId);\n const targets = await managed.targets.listTargets(includeUrls);\n return {\n activeTargetId: managed.targets.getActiveTargetId(),\n targets\n };\n });\n }\n\n async page(sessionId: string, name: string, url?: string): Promise<{ targetId: string; created: boolean; url?: string; title?: string }> {\n return this.runStructural(sessionId, async () => {\n const managed = this.getManaged(sessionId);\n const existingTargetId = managed.targets.getTargetIdByName(name);\n let targetId = existingTargetId;\n let created = false;\n\n if (targetId) {\n managed.targets.setActiveTarget(targetId);\n } else if (managed.mode === \"extension\") {\n try {\n const page = await this.createExtensionPage(managed, \"page\");\n targetId = managed.targets.registerPage(page, name);\n managed.targets.setActiveTarget(targetId);\n this.attachRefInvalidationForPage(managed, targetId, page);\n created = true;\n } catch (error) {\n if (!this.isDetachedFrameError(error)) {\n throw error;\n }\n const activeTargetId = managed.targets.getActiveTargetId();\n if (!activeTargetId) {\n throw error;\n }\n managed.targets.setName(activeTargetId, name);\n targetId = activeTargetId;\n created = true;\n }\n } else {\n const page = await managed.context.newPage();\n targetId = managed.targets.registerPage(page, name);\n managed.targets.setActiveTarget(targetId);\n this.attachRefInvalidationForPage(managed, targetId, page);\n created = true;\n }\n\n this.attachTrackers(managed);\n\n if (url) {\n await this.goto(sessionId, url, \"load\", 30000, undefined, targetId);\n }\n\n const page = managed.targets.getPage(targetId);\n const title = await this.safePageTitle(page, \"BrowserManager.page\");\n const finalUrl = this.safePageUrl(page, \"BrowserManager.page\");\n\n return { targetId, created, url: finalUrl, title };\n });\n }\n\n async listPages(sessionId: string): Promise<{ pages: Array<{ name: string; targetId: string; url?: string; title?: string }> }> {\n return this.runStructural(sessionId, async () => {\n const managed = this.getManaged(sessionId);\n const named = managed.targets.listNamedTargets();\n const pages: Array<{ name: string; targetId: string; url?: string; title?: string }> = [];\n\n for (const entry of named) {\n const page = managed.targets.getPage(entry.targetId);\n const title = await this.safePageTitle(page, \"BrowserManager.listPages\");\n const url = this.safePageUrl(page, \"BrowserManager.listPages\");\n pages.push({ name: entry.name, targetId: entry.targetId, url, title });\n }\n\n return { pages };\n });\n }\n\n async closePage(sessionId: string, name: string): Promise<void> {\n await this.runStructural(sessionId, async () => {\n const managed = this.getManaged(sessionId);\n const targetId = managed.targets.getTargetIdByName(name);\n if (!targetId) {\n throw new Error(`Unknown page name: ${name}`);\n }\n if (managed.mode === \"extension\") {\n const entries = managed.targets.listPageEntries();\n if (entries.length <= 1) {\n managed.targets.removeName(name);\n managed.refStore.clearTarget(targetId);\n return;\n }\n }\n await managed.targets.closeTarget(targetId);\n managed.refStore.clearTarget(targetId);\n this.attachTrackers(managed);\n });\n }\n\n async useTarget(sessionId: string, targetId: string): Promise<{ activeTargetId: string; url?: string; title?: string }> {\n return this.runStructural(sessionId, async () => {\n const managed = this.getManaged(sessionId);\n managed.targets.setActiveTarget(targetId);\n this.attachTrackers(managed);\n\n const page = managed.targets.getPage(targetId);\n const title = await this.safePageTitle(page, \"BrowserManager.useTarget\");\n\n return {\n activeTargetId: targetId,\n url: this.safePageUrl(page, \"BrowserManager.useTarget\"),\n title\n };\n });\n }\n\n async newTarget(sessionId: string, url?: string): Promise<{ targetId: string }> {\n return this.runStructural(sessionId, async () => {\n const managed = this.getManaged(sessionId);\n if (managed.mode === \"extension\") {\n const previousTargetId = managed.targets.getActiveTargetId();\n let createdTargetId: string | null = null;\n try {\n const page = await this.createExtensionPage(managed, \"target-new\");\n const targetId = managed.targets.registerPage(page);\n createdTargetId = targetId;\n this.attachRefInvalidationForPage(managed, targetId, page);\n if (url) {\n await this.waitForExtensionTargetReady(page, \"target-new\");\n try {\n await page.goto(url, { waitUntil: \"load\" });\n } catch (error) {\n if (!this.isDetachedFrameError(error)) {\n throw error;\n }\n await delay(200);\n await this.waitForExtensionTargetReady(page, \"target-new\");\n await page.goto(url, { waitUntil: \"load\" });\n }\n }\n managed.targets.setActiveTarget(targetId);\n this.attachTrackers(managed);\n return { targetId };\n } catch (error) {\n if (!this.isDetachedFrameError(error)) {\n throw error;\n }\n if (createdTargetId) {\n try {\n await managed.targets.closeTarget(createdTargetId);\n } catch {\n // Best-effort cleanup; fall back to the existing tab.\n }\n }\n const fallbackTargetId = previousTargetId ?? managed.targets.getActiveTargetId();\n if (!fallbackTargetId) {\n throw error;\n }\n managed.targets.setActiveTarget(fallbackTargetId);\n const page = managed.targets.getPage(fallbackTargetId);\n if (url) {\n try {\n await page.goto(url, { waitUntil: \"load\" });\n } catch (retryError) {\n if (!this.isDetachedFrameError(retryError)) {\n throw retryError;\n }\n await delay(200);\n await page.goto(url, { waitUntil: \"load\" });\n }\n }\n this.attachTrackers(managed);\n return { targetId: fallbackTargetId };\n }\n }\n\n const page = await managed.context.newPage();\n const targetId = managed.targets.registerPage(page);\n managed.targets.setActiveTarget(targetId);\n this.attachRefInvalidationForPage(managed, targetId, page);\n if (url) {\n await page.goto(url, { waitUntil: \"load\" });\n }\n this.attachTrackers(managed);\n return { targetId };\n });\n }\n\n async closeTarget(sessionId: string, targetId: string): Promise<void> {\n await this.runStructural(sessionId, async () => {\n const managed = this.getManaged(sessionId);\n if (managed.mode === \"extension\") {\n const entries = managed.targets.listPageEntries();\n if (entries.length <= 1) {\n managed.refStore.clearTarget(targetId);\n return;\n }\n }\n await managed.targets.closeTarget(targetId);\n managed.refStore.clearTarget(targetId);\n this.attachTrackers(managed);\n });\n }\n\n async goto(\n sessionId: string,\n url: string,\n waitUntil: \"domcontentloaded\" | \"load\" | \"networkidle\" = \"load\",\n timeoutMs = 30000,\n sessionOverride?: { browser: Browser; context: BrowserContext; targets: TargetManager },\n targetId?: string | null\n ): Promise<{\n finalUrl?: string;\n status?: number;\n timingMs: number;\n meta?: {\n blocker?: BlockerSignalV1;\n blockerState: \"clear\" | \"active\" | \"resolving\";\n blockerUpdatedAt?: string;\n blockerResolution?: {\n status: \"resolved\" | \"unresolved\" | \"deferred\";\n reason: \"verifier_passed\" | \"verification_timeout\" | \"verifier_failed\" | \"env_limited\" | \"manual_clear\";\n updatedAt: string;\n };\n };\n }> {\n if (!sessionOverride && targetId) {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page }) => {\n const startTime = Date.now();\n try {\n if (managed.mode === \"extension\") {\n await this.waitForExtensionTargetReady(page, \"goto\", Math.min(timeoutMs, 5000));\n }\n const response = await page.goto(url, { waitUntil, timeout: timeoutMs });\n const finalUrl = this.safePageUrl(page, \"BrowserManager.goto\");\n const status = response?.status();\n const title = await this.safePageTitle(page, \"BrowserManager.goto\");\n const blockerMeta = this.reconcileSessionBlocker(sessionId, managed, {\n source: \"navigation\",\n url,\n finalUrl,\n title,\n status,\n verifier: true\n });\n return {\n finalUrl,\n ...(typeof status === \"number\" ? { status } : {}),\n timingMs: Date.now() - startTime,\n ...(blockerMeta ? { meta: blockerMeta } : {})\n };\n } catch (error) {\n this.markVerifierFailure(sessionId, error);\n throw error;\n }\n }, timeoutMs);\n }\n\n const startTime = Date.now();\n try {\n const managed = sessionOverride ? this.buildOverrideSession(sessionOverride) : this.getManaged(sessionId);\n let page = managed.targets.getActivePage();\n const syncExtensionTargets = (): void => {\n try {\n managed.targets.syncPages(managed.context.pages());\n } catch {\n // Best-effort sync only.\n }\n };\n const pickStableExtensionEntry = (): { targetId: string; page: Page } | null => {\n syncExtensionTargets();\n for (const entry of managed.targets.listPageEntries()) {\n try {\n const candidateUrl = entry.page.url();\n if (candidateUrl.startsWith(\"http://\") || candidateUrl.startsWith(\"https://\")) {\n return entry;\n }\n } catch {\n // Ignore pages that cannot report a URL.\n }\n }\n return null;\n };\n const selectFallbackExtensionPage = (): Page | null => {\n syncExtensionTargets();\n const entries = managed.targets.listPageEntries().filter((entry) => !entry.page.isClosed());\n if (entries.length === 0) {\n return null;\n }\n const stable = entries.find((entry) => {\n try {\n const candidateUrl = entry.page.url();\n return candidateUrl.startsWith(\"http://\") || candidateUrl.startsWith(\"https://\");\n } catch {\n return false;\n }\n }) ?? entries[0]!;\n managed.targets.setActiveTarget(stable.targetId);\n return stable.page;\n };\n const ensureActiveExtensionPage = async (): Promise<Page> => {\n const newPage = await this.createExtensionPage(managed, \"goto\");\n const targetId = managed.targets.registerPage(newPage);\n managed.targets.setActiveTarget(targetId);\n this.attachRefInvalidationForPage(managed, targetId, newPage);\n this.attachTrackers(managed);\n try {\n await this.waitForExtensionTargetReady(newPage, \"goto\", Math.min(timeoutMs, 5000));\n } catch (error) {\n if (!this.isExtensionTargetReadyTimeout(error)) {\n throw error;\n }\n console.warn(\"BrowserManager.goto: extension target readiness timed out; continuing.\");\n }\n return newPage;\n };\n\n if (managed.mode === \"extension\") {\n try {\n const currentUrl = page.url();\n if (!currentUrl || currentUrl === \"about:blank\" || currentUrl.startsWith(\"chrome://\") || currentUrl.startsWith(\"chrome-extension://\")) {\n const stable = pickStableExtensionEntry();\n if (stable) {\n managed.targets.setActiveTarget(stable.targetId);\n page = stable.page;\n } else {\n try {\n page = await ensureActiveExtensionPage();\n } catch (error) {\n if (!this.isTargetNotAllowedError(error)) {\n throw error;\n }\n }\n }\n }\n } catch {\n try {\n page = await ensureActiveExtensionPage();\n } catch (error) {\n if (!this.isTargetNotAllowedError(error)) {\n throw error;\n }\n }\n }\n try {\n await this.waitForExtensionTargetReady(page, \"goto\", Math.min(timeoutMs, 5000));\n } catch (error) {\n if (this.isDetachedFrameError(error)) {\n try {\n page = await ensureActiveExtensionPage();\n } catch (retryError) {\n if (!this.isTargetNotAllowedError(retryError)) {\n throw retryError;\n }\n page = selectFallbackExtensionPage() ?? page;\n }\n } else if (this.isExtensionTargetReadyTimeout(error)) {\n page = selectFallbackExtensionPage() ?? page;\n } else {\n throw error;\n }\n }\n }\n\n let response;\n if (managed.mode === \"extension\") {\n let lastError: unknown = null;\n for (let attempt = 0; attempt < 2; attempt += 1) {\n try {\n response = await page.goto(url, { waitUntil, timeout: timeoutMs });\n lastError = null;\n break;\n } catch (error) {\n if (!this.isDetachedFrameError(error)) {\n throw error;\n }\n lastError = error;\n try {\n page = await ensureActiveExtensionPage();\n } catch (retryError) {\n if (!this.isTargetNotAllowedError(retryError)) {\n throw retryError;\n }\n page = selectFallbackExtensionPage() ?? page;\n }\n }\n }\n if (lastError) {\n throw lastError;\n }\n } else {\n response = await page.goto(url, { waitUntil, timeout: timeoutMs });\n }\n\n const finalUrl = this.safePageUrl(page, \"BrowserManager.goto\");\n const status = response?.status();\n const title = await this.safePageTitle(page, \"BrowserManager.goto\");\n const blockerMeta = sessionOverride\n ? undefined\n : this.reconcileSessionBlocker(sessionId, managed, {\n source: \"navigation\",\n url,\n finalUrl,\n title,\n status,\n verifier: true\n });\n\n return {\n finalUrl,\n ...(typeof status === \"number\" ? { status } : {}),\n timingMs: Date.now() - startTime,\n ...(blockerMeta ? { meta: blockerMeta } : {})\n };\n } catch (error) {\n if (!sessionOverride) {\n this.markVerifierFailure(sessionId, error);\n }\n throw error;\n }\n }\n\n async waitForLoad(\n sessionId: string,\n until: \"domcontentloaded\" | \"load\" | \"networkidle\",\n timeoutMs = 30000,\n targetId?: string | null\n ): Promise<{\n timingMs: number;\n meta?: {\n blocker?: BlockerSignalV1;\n blockerState: \"clear\" | \"active\" | \"resolving\";\n blockerUpdatedAt?: string;\n blockerResolution?: {\n status: \"resolved\" | \"unresolved\" | \"deferred\";\n reason: \"verifier_passed\" | \"verification_timeout\" | \"verifier_failed\" | \"env_limited\" | \"manual_clear\";\n updatedAt: string;\n };\n };\n }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page }) => {\n const startTime = Date.now();\n try {\n await page.waitForLoadState(until, { timeout: timeoutMs });\n const blockerMeta = this.reconcileSessionBlocker(sessionId, managed, {\n source: \"navigation\",\n finalUrl: this.safePageUrl(page, \"BrowserManager.waitForLoad\"),\n title: await this.safePageTitle(page, \"BrowserManager.waitForLoad\"),\n verifier: true\n });\n return {\n timingMs: Date.now() - startTime,\n ...(blockerMeta ? { meta: blockerMeta } : {})\n };\n } catch (error) {\n this.markVerifierFailure(sessionId, error);\n throw error;\n }\n }, timeoutMs);\n }\n\n async waitForRef(\n sessionId: string,\n ref: string,\n state: \"attached\" | \"visible\" | \"hidden\" = \"attached\",\n timeoutMs = 30000,\n targetId?: string | null\n ): Promise<{\n timingMs: number;\n meta?: {\n blocker?: BlockerSignalV1;\n blockerState: \"clear\" | \"active\" | \"resolving\";\n blockerUpdatedAt?: string;\n blockerResolution?: {\n status: \"resolved\" | \"unresolved\" | \"deferred\";\n reason: \"verifier_passed\" | \"verification_timeout\" | \"verifier_failed\" | \"env_limited\" | \"manual_clear\";\n updatedAt: string;\n };\n };\n }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n const startTime = Date.now();\n try {\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n await page.locator(selector).waitFor({ state, timeout: timeoutMs });\n const blockerMeta = this.reconcileSessionBlocker(sessionId, managed, {\n source: \"navigation\",\n finalUrl: this.safePageUrl(page, \"BrowserManager.waitForRef\"),\n title: await this.safePageTitle(page, \"BrowserManager.waitForRef\"),\n verifier: true\n });\n return {\n timingMs: Date.now() - startTime,\n ...(blockerMeta ? { meta: blockerMeta } : {})\n };\n } catch (error) {\n this.markVerifierFailure(sessionId, error);\n throw error;\n }\n }, timeoutMs);\n }\n\n async snapshot(\n sessionId: string,\n mode: \"outline\" | \"actionables\",\n maxChars: number,\n cursor?: string,\n targetId?: string | null\n ): ReturnType<Snapshotter[\"snapshot\"]> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n return managed.snapshotter.snapshot(page, resolvedTargetId, {\n mode,\n maxChars,\n cursor,\n maxNodes: this.config.snapshot.maxNodes\n });\n });\n }\n\n async click(sessionId: string, ref: string, targetId?: string | null): Promise<{ timingMs: number; navigated: boolean }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n const startTime = Date.now();\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n const previousUrl = page.url();\n await page.locator(selector).click();\n const navigated = page.url() !== previousUrl;\n return { timingMs: Date.now() - startTime, navigated };\n });\n }\n\n async hover(sessionId: string, ref: string, targetId?: string | null): Promise<{ timingMs: number }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n const startTime = Date.now();\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n await page.locator(selector).hover();\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async press(sessionId: string, key: string, ref?: string, targetId?: string | null): Promise<{ timingMs: number }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n const startTime = Date.now();\n if (ref) {\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n await page.locator(selector).focus();\n }\n await page.keyboard.press(key);\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async check(sessionId: string, ref: string, targetId?: string | null): Promise<{ timingMs: number }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n const startTime = Date.now();\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n await page.locator(selector).check();\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async uncheck(sessionId: string, ref: string, targetId?: string | null): Promise<{ timingMs: number }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n const startTime = Date.now();\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n await page.locator(selector).uncheck();\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async type(\n sessionId: string,\n ref: string,\n text: string,\n clear = false,\n submit = false,\n targetId?: string | null\n ): Promise<{ timingMs: number }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n const startTime = Date.now();\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n const locator = page.locator(selector);\n if (clear) {\n await locator.fill(\"\");\n }\n await locator.fill(text);\n if (submit) {\n await locator.press(\"Enter\");\n }\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async select(sessionId: string, ref: string, values: string[], targetId?: string | null): Promise<void> {\n await this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n await page.locator(selector).selectOption(values);\n });\n }\n\n async scroll(sessionId: string, dy: number, ref?: string, targetId?: string | null): Promise<void> {\n await this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n if (ref) {\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n await page.locator(selector).evaluate((el, delta) => {\n (el as HTMLElement).scrollBy(0, delta as number);\n }, dy);\n } else {\n await page.mouse.wheel(0, dy);\n }\n });\n }\n\n async scrollIntoView(sessionId: string, ref: string, targetId?: string | null): Promise<{ timingMs: number }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n const startTime = Date.now();\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n await page.locator(selector).scrollIntoViewIfNeeded();\n return { timingMs: Date.now() - startTime };\n });\n }\n\n async domGetHtml(\n sessionId: string,\n ref: string,\n maxChars = 8000,\n targetId?: string | null\n ): Promise<{ outerHTML: string; truncated: boolean }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n const html = await page.$eval(selector, (el) => (el as Element).outerHTML);\n return truncateHtml(html, maxChars);\n });\n }\n\n async domGetText(\n sessionId: string,\n ref: string,\n maxChars = 8000,\n targetId?: string | null\n ): Promise<{ text: string; truncated: boolean }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n const text = await page.$eval(selector, (el) => (el as HTMLElement).innerText || el.textContent || \"\");\n return truncateText(text, maxChars);\n });\n }\n\n async domGetAttr(\n sessionId: string,\n ref: string,\n name: string,\n targetId?: string | null\n ): Promise<{ value: string | null }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n if (managed.mode === \"managed\") {\n try {\n const value = await this.evaluateDomStateByBackendNode(\n managed,\n ref,\n DOM_GET_ATTR_DECLARATION,\n [name],\n resolvedTargetId\n );\n if (typeof value === \"string\") {\n return { value };\n }\n return { value: null };\n } catch (error) {\n if (this.isSnapshotStaleError(error)) {\n throw error;\n }\n }\n }\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n const locator = page.locator(selector);\n return { value: await locator.getAttribute(name) };\n });\n }\n\n async domGetValue(sessionId: string, ref: string, targetId?: string | null): Promise<{ value: string }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n if (managed.mode === \"managed\") {\n try {\n const value = await this.evaluateDomStateByBackendNode(\n managed,\n ref,\n DOM_GET_VALUE_DECLARATION,\n [],\n resolvedTargetId\n );\n return { value: typeof value === \"string\" ? value : \"\" };\n } catch (error) {\n if (this.isSnapshotStaleError(error)) {\n throw error;\n }\n }\n }\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n const locator = page.locator(selector);\n return { value: await locator.inputValue() };\n });\n }\n\n async domIsVisible(sessionId: string, ref: string, targetId?: string | null): Promise<{ value: boolean }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n if (managed.mode === \"managed\") {\n try {\n const value = await this.evaluateDomStateByBackendNode(\n managed,\n ref,\n DOM_IS_VISIBLE_DECLARATION,\n [],\n resolvedTargetId\n );\n return { value: value === true };\n } catch (error) {\n if (this.isSnapshotStaleError(error)) {\n throw error;\n }\n }\n }\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n const locator = page.locator(selector);\n return { value: await locator.isVisible() };\n });\n }\n\n async domIsEnabled(sessionId: string, ref: string, targetId?: string | null): Promise<{ value: boolean }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n if (managed.mode === \"managed\") {\n try {\n const value = await this.evaluateDomStateByBackendNode(\n managed,\n ref,\n DOM_IS_ENABLED_DECLARATION,\n [],\n resolvedTargetId\n );\n return { value: value === true };\n } catch (error) {\n if (this.isSnapshotStaleError(error)) {\n throw error;\n }\n }\n }\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n const locator = page.locator(selector);\n return { value: await locator.isEnabled() };\n });\n }\n\n async domIsChecked(sessionId: string, ref: string, targetId?: string | null): Promise<{ value: boolean }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n if (managed.mode === \"managed\") {\n try {\n const value = await this.evaluateDomStateByBackendNode(\n managed,\n ref,\n DOM_IS_CHECKED_DECLARATION,\n [],\n resolvedTargetId\n );\n return { value: value === true };\n } catch (error) {\n if (this.isSnapshotStaleError(error)) {\n throw error;\n }\n }\n }\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n const locator = page.locator(selector);\n return { value: await locator.isChecked() };\n });\n }\n\n async clonePage(sessionId: string, targetId?: string | null): Promise<ReactExport> {\n return this.runTargetScoped(sessionId, targetId, async ({ page }) => {\n const allowUnsafeExport = this.config.security.allowUnsafeExport;\n const exportConfig = this.config.export;\n const capture = await captureDom(page, \"body\", {\n sanitize: !allowUnsafeExport,\n maxNodes: exportConfig.maxNodes,\n inlineStyles: exportConfig.inlineStyles\n });\n const css = extractCss(capture);\n return emitReactComponent(capture, css, { allowUnsafeExport });\n });\n }\n\n async cloneComponent(sessionId: string, ref: string, targetId?: string | null): Promise<ReactExport> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page, targetId: resolvedTargetId }) => {\n const selector = this.resolveSelector(managed, ref, resolvedTargetId);\n const allowUnsafeExport = this.config.security.allowUnsafeExport;\n const exportConfig = this.config.export;\n const capture = await captureDom(page, selector, {\n sanitize: !allowUnsafeExport,\n maxNodes: exportConfig.maxNodes,\n inlineStyles: exportConfig.inlineStyles\n });\n const css = extractCss(capture);\n return emitReactComponent(capture, css, { allowUnsafeExport });\n });\n }\n\n async perfMetrics(sessionId: string, targetId?: string | null): Promise<{ metrics: Array<{ name: string; value: number }> }> {\n return this.runTargetScoped(sessionId, targetId, async ({ managed, page }) => {\n const session = await managed.context.newCDPSession(page);\n const result = await session.send(\"Performance.getMetrics\") as { metrics?: Array<{ name: string; value: number }> };\n await session.detach();\n const metrics = Array.isArray(result.metrics) ? result.metrics : [];\n return { metrics };\n });\n }\n\n async screenshot(\n sessionId: string,\n path?: string,\n targetId?: string | null\n ): Promise<{ path?: string; base64?: string; warnings?: string[] }> {\n return this.runTargetScoped(sessionId, targetId, async ({ page }) => {\n if (path) {\n await page.screenshot({ path, type: \"png\" });\n return { path };\n }\n const buffer = await page.screenshot({ type: \"png\" });\n return { base64: buffer.toString(\"base64\") };\n });\n }\n\n async consolePoll(\n sessionId: string,\n sinceSeq?: number,\n max = 50\n ): Promise<{ events: ReturnType<ConsoleTracker[\"poll\"]>[\"events\"]; nextSeq: number; truncated?: boolean }> {\n const managed = this.getManaged(sessionId);\n return managed.consoleTracker.poll(sinceSeq, max);\n }\n\n async exceptionPoll(\n sessionId: string,\n sinceSeq?: number,\n max = 50\n ): Promise<{ events: ReturnType<ExceptionTracker[\"poll\"]>[\"events\"]; nextSeq: number; truncated?: boolean }> {\n const managed = this.getManaged(sessionId);\n return managed.exceptionTracker.poll(sinceSeq, max);\n }\n\n async networkPoll(\n sessionId: string,\n sinceSeq?: number,\n max = 50\n ): Promise<{ events: ReturnType<NetworkTracker[\"poll\"]>[\"events\"]; nextSeq: number; truncated?: boolean }> {\n const managed = this.getManaged(sessionId);\n return managed.networkTracker.poll(sinceSeq, max);\n }\n\n async debugTraceSnapshot(\n sessionId: string,\n options: {\n sinceConsoleSeq?: number;\n sinceNetworkSeq?: number;\n sinceExceptionSeq?: number;\n max?: number;\n requestId?: string;\n } = {}\n ): Promise<{\n requestId: string;\n generatedAt: string;\n page: { mode: BrowserMode; activeTargetId: string | null; url?: string; title?: string };\n channels: {\n console: {\n events: Array<ReturnType<ConsoleTracker[\"poll\"]>[\"events\"][number] & { requestId: string; sessionId: string }>;\n nextSeq: number;\n truncated?: boolean;\n };\n network: {\n events: Array<ReturnType<NetworkTracker[\"poll\"]>[\"events\"][number] & { requestId: string; sessionId: string }>;\n nextSeq: number;\n truncated?: boolean;\n };\n exception: {\n events: Array<ReturnType<ExceptionTracker[\"poll\"]>[\"events\"][number] & { requestId: string; sessionId: string }>;\n nextSeq: number;\n truncated?: boolean;\n };\n };\n fingerprint: ReturnType<BrowserManager[\"buildFingerprintSummary\"]>;\n meta?: {\n blocker?: BlockerSignalV1;\n blockerState: \"clear\" | \"active\" | \"resolving\";\n blockerUpdatedAt?: string;\n blockerResolution?: {\n status: \"resolved\" | \"unresolved\" | \"deferred\";\n reason: \"verifier_passed\" | \"verification_timeout\" | \"verifier_failed\" | \"env_limited\" | \"manual_clear\";\n updatedAt: string;\n };\n blockerArtifacts?: ReturnType<typeof buildBlockerArtifacts>;\n };\n }> {\n const requestId = options.requestId ?? createRequestId();\n try {\n const managed = this.getManaged(sessionId);\n const max = options.max ?? 500;\n const status = await this.status(sessionId);\n const consoleChannel = managed.consoleTracker.poll(options.sinceConsoleSeq, max);\n const networkChannel = managed.networkTracker.poll(options.sinceNetworkSeq, max);\n const exceptionChannel = managed.exceptionTracker.poll(options.sinceExceptionSeq, max);\n\n this.applyFingerprintSignals(managed, networkChannel.events, requestId, { source: \"debug-trace\" });\n\n const annotateTraceContext = <T extends Record<string, unknown>>(events: T[]) => (\n events.map((event) => ({\n ...event,\n requestId,\n sessionId\n }))\n );\n\n const blockerMeta = this.reconcileSessionBlocker(sessionId, managed, {\n source: \"network\",\n url: status.url,\n finalUrl: status.url,\n title: status.title,\n status: this.latestStatus(networkChannel.events),\n traceRequestId: requestId,\n networkEvents: networkChannel.events,\n consoleEvents: consoleChannel.events,\n exceptionEvents: exceptionChannel.events,\n verifier: true,\n includeArtifacts: true\n });\n\n return {\n requestId,\n generatedAt: new Date().toISOString(),\n page: status,\n channels: {\n console: {\n nextSeq: consoleChannel.nextSeq,\n truncated: consoleChannel.truncated,\n events: annotateTraceContext(consoleChannel.events)\n },\n network: {\n nextSeq: networkChannel.nextSeq,\n truncated: networkChannel.truncated,\n events: annotateTraceContext(networkChannel.events)\n },\n exception: {\n nextSeq: exceptionChannel.nextSeq,\n truncated: exceptionChannel.truncated,\n events: annotateTraceContext(exceptionChannel.events)\n }\n },\n fingerprint: this.buildFingerprintSummary(managed),\n ...(blockerMeta ? { meta: blockerMeta } : {})\n };\n } catch (error) {\n this.markVerifierFailure(sessionId, error);\n throw error;\n }\n }\n\n async cookieImport(\n sessionId: string,\n cookies: CookieImportRecord[],\n strict = true,\n requestId = createRequestId()\n ): Promise<{ requestId: string; imported: number; rejected: Array<{ index: number; reason: string }> }> {\n const managed = this.getManaged(sessionId);\n const normalized: CookieImportRecord[] = [];\n const rejected: Array<{ index: number; reason: string }> = [];\n\n cookies.forEach((cookie, index) => {\n const validation = this.validateCookieRecord(cookie);\n if (!validation.valid) {\n rejected.push({ index, reason: validation.reason });\n return;\n }\n normalized.push(validation.cookie);\n });\n\n if (strict && rejected.length > 0) {\n throw new Error(`Cookie import rejected ${rejected.length} entries.`);\n }\n\n if (normalized.length > 0) {\n await managed.context.addCookies(normalized);\n }\n\n this.logger.audit(\"session.cookie_import\", {\n requestId,\n sessionId,\n data: {\n imported: normalized.length,\n rejected\n }\n });\n\n return {\n requestId,\n imported: normalized.length,\n rejected\n };\n }\n\n async cookieList(\n sessionId: string,\n urls?: string[],\n requestId = createRequestId()\n ): Promise<{ requestId: string; cookies: CookieListRecord[]; count: number }> {\n const managed = this.getManaged(sessionId);\n const normalizedUrls = this.normalizeCookieListUrls(urls);\n const listed = normalizedUrls\n ? await managed.context.cookies(normalizedUrls)\n : await managed.context.cookies();\n\n const cookies: CookieListRecord[] = listed.map((cookie) => ({\n name: cookie.name,\n value: cookie.value,\n domain: cookie.domain,\n path: cookie.path,\n expires: cookie.expires,\n httpOnly: cookie.httpOnly,\n secure: cookie.secure,\n ...(cookie.sameSite ? { sameSite: cookie.sameSite } : {})\n }));\n\n this.logger.audit(\"session.cookie_list\", {\n requestId,\n sessionId,\n data: {\n count: cookies.length,\n filteredByUrlCount: normalizedUrls?.length ?? 0\n }\n });\n\n return {\n requestId,\n cookies,\n count: cookies.length\n };\n }\n\n private initializeFingerprintState(\n sessionId: string,\n profileName: string,\n flags: string[]\n ): ManagedSession[\"fingerprint\"] {\n const tier1Config = this.config.fingerprint.tier1;\n const languageFlag = readFlagValue(flags, \"--lang\");\n const timezoneFlag = readFlagValue(flags, \"--timezone\") ?? readFlagValue(flags, \"--timezone-for-testing\");\n const proxyFlag = readFlagValue(flags, \"--proxy-server\");\n\n const tier1 = evaluateTier1Coherence(\n {\n enabled: tier1Config.enabled,\n warnOnly: tier1Config.warnOnly,\n expectedLocale: tier1Config.locale,\n expectedTimezone: tier1Config.timezone,\n expectedLanguages: tier1Config.languages,\n requireProxy: tier1Config.requireProxy,\n geolocationRequired: tier1Config.geolocationRequired\n },\n {\n locale: tier1Config.locale ?? languageFlag,\n timezone: tier1Config.timezone ?? timezoneFlag,\n languages: tier1Config.languages.length > 0\n ? tier1Config.languages\n : languageFlag\n ? [languageFlag]\n : [],\n proxy: proxyFlag,\n geolocation: tier1Config.geolocation\n ? {\n latitude: tier1Config.geolocation.latitude,\n longitude: tier1Config.geolocation.longitude,\n accuracy: tier1Config.geolocation.accuracy\n }\n : undefined\n }\n );\n\n const tier2 = createTier2RuntimeState(\n {\n enabled: this.config.fingerprint.tier2.enabled,\n mode: this.config.fingerprint.tier2.mode,\n rotationIntervalMs: this.config.fingerprint.tier2.rotationIntervalMs,\n challengePatterns: this.config.fingerprint.tier2.challengePatterns,\n maxChallengeEvents: this.config.fingerprint.tier2.maxChallengeEvents,\n scorePenalty: this.config.fingerprint.tier2.scorePenalty,\n scoreRecovery: this.config.fingerprint.tier2.scoreRecovery,\n rotationHealthThreshold: this.config.fingerprint.tier2.rotationHealthThreshold\n },\n sessionId,\n profileName\n );\n\n const tier3 = createTier3RuntimeState({\n enabled: this.config.fingerprint.tier3.enabled,\n fallbackTier: this.config.fingerprint.tier3.fallbackTier,\n canary: {\n windowSize: this.config.fingerprint.tier3.canary.windowSize,\n minSamples: this.config.fingerprint.tier3.canary.minSamples,\n promoteThreshold: this.config.fingerprint.tier3.canary.promoteThreshold,\n rollbackThreshold: this.config.fingerprint.tier3.canary.rollbackThreshold\n }\n });\n\n return {\n tier1,\n tier2,\n tier3,\n lastAppliedNetworkSeq: 0\n };\n }\n\n private applyFingerprintSignals(\n managed: ManagedSession,\n events: ReturnType<NetworkTracker[\"poll\"]>[\"events\"],\n requestId: string,\n options: FingerprintSignalApplyOptions = {}\n ): void {\n const applyTier2 = options.applyTier2 ?? true;\n const applyTier3 = options.applyTier3 ?? true;\n if (!applyTier2 && !applyTier3) {\n return;\n }\n\n const pendingEvents = events.filter((event) => event.seq > managed.fingerprint.lastAppliedNetworkSeq);\n if (pendingEvents.length === 0) {\n return;\n }\n\n let tier2 = managed.fingerprint.tier2;\n let tier3 = managed.fingerprint.tier3;\n const tier2Config = this.config.fingerprint.tier2;\n const tier3Config = this.config.fingerprint.tier3;\n const signalSource = options.source ?? \"debug-trace\";\n\n for (const event of pendingEvents) {\n const evaluationTs = event.ts ?? Date.now();\n let hasChallenge = false;\n\n if (applyTier2) {\n const tier2Result = applyTier2NetworkEvent(\n tier2,\n {\n enabled: tier2Config.enabled,\n mode: tier2Config.mode,\n rotationIntervalMs: tier2Config.rotationIntervalMs,\n challengePatterns: tier2Config.challengePatterns,\n maxChallengeEvents: tier2Config.maxChallengeEvents,\n scorePenalty: tier2Config.scorePenalty,\n scoreRecovery: tier2Config.scoreRecovery,\n rotationHealthThreshold: tier2Config.rotationHealthThreshold\n },\n {\n url: event.url,\n status: event.status,\n ts: evaluationTs\n },\n evaluationTs\n );\n tier2 = tier2Result.state;\n hasChallenge = Boolean(tier2Result.challenge);\n\n if (tier2Result.challenge) {\n this.logger.warn(\"fingerprint.tier2.challenge\", {\n requestId,\n sessionId: managed.sessionId,\n data: {\n event: tier2Result.challenge,\n score: tier2.profile.healthScore\n }\n });\n }\n\n if (tier2Result.rotated) {\n this.logger.info(\"fingerprint.tier2.rotate\", {\n requestId,\n sessionId: managed.sessionId,\n data: {\n reason: tier2Result.reason,\n profileId: tier2.profile.id,\n rotationCount: tier2.profile.rotationCount\n }\n });\n }\n }\n\n if (!applyTier3) {\n continue;\n }\n\n const tier3Result = evaluateTier3Adaptive(\n tier3,\n {\n enabled: tier3Config.enabled,\n fallbackTier: tier3Config.fallbackTier,\n canary: {\n windowSize: tier3Config.canary.windowSize,\n minSamples: tier3Config.canary.minSamples,\n promoteThreshold: tier3Config.canary.promoteThreshold,\n rollbackThreshold: tier3Config.canary.rollbackThreshold\n }\n },\n {\n hasChallenge,\n healthScore: tier2.profile.healthScore,\n challengeCount: tier2.profile.challengeCount,\n rotationCount: tier2.profile.rotationCount,\n metadata: {\n url: event.url,\n status: event.status\n }\n },\n undefined,\n evaluationTs\n );\n\n tier3 = tier3Result.state;\n const targetClass = this.resolveCanaryTargetClass(event.url, event.status);\n const scoreWindow = this.buildCanaryScoreWindow(tier3.canary.samples);\n const thresholdComparison = {\n promoteDelta: tier3Result.decision.score - tier3Config.canary.promoteThreshold,\n rollbackDelta: tier3Result.decision.score - tier3Config.canary.rollbackThreshold\n };\n\n if (tier3Result.action === \"rollback\") {\n this.logger.warn(\"fingerprint.tier3.rollback\", {\n requestId,\n sessionId: managed.sessionId,\n data: {\n action: tier3Result.action,\n reason: tier3Result.decision.reason,\n score: tier3Result.decision.score,\n threshold: {\n windowSize: tier3Config.canary.windowSize,\n minSamples: tier3Config.canary.minSamples,\n promoteThreshold: tier3Config.canary.promoteThreshold,\n rollbackThreshold: tier3Config.canary.rollbackThreshold\n },\n canary: {\n level: tier3.canary.level,\n averageScore: tier3.canary.averageScore,\n sampleCount: tier3.canary.samples.length\n },\n targetClass,\n scoreWindow,\n thresholdComparison,\n fallbackTier: tier3.fallbackTier,\n status: tier3.status,\n source: signalSource\n }\n });\n } else if (tier3Result.action === \"promote\") {\n this.logger.info(\"fingerprint.tier3.promote\", {\n requestId,\n sessionId: managed.sessionId,\n data: {\n action: tier3Result.action,\n reason: tier3Result.decision.reason,\n score: tier3Result.decision.score,\n threshold: {\n windowSize: tier3Config.canary.windowSize,\n minSamples: tier3Config.canary.minSamples,\n promoteThreshold: tier3Config.canary.promoteThreshold,\n rollbackThreshold: tier3Config.canary.rollbackThreshold\n },\n canary: {\n level: tier3.canary.level,\n averageScore: tier3.canary.averageScore,\n sampleCount: tier3.canary.samples.length\n },\n targetClass,\n scoreWindow,\n thresholdComparison,\n source: signalSource\n }\n });\n }\n }\n\n managed.fingerprint.tier2 = tier2;\n managed.fingerprint.tier3 = tier3;\n managed.fingerprint.lastAppliedNetworkSeq = pendingEvents[pendingEvents.length - 1]?.seq ?? managed.fingerprint.lastAppliedNetworkSeq;\n\n if (tier3.enabled && tier3.status === \"fallback\") {\n managed.fingerprint.tier2 = {\n ...tier2,\n enabled: resolveTier3FallbackTarget(tier3.fallbackTier) === \"tier2\"\n };\n }\n }\n\n private attachContinuousFingerprintSignals(managed: ManagedSession): void {\n if (this.networkSignalSubscriptions.has(managed.sessionId)) {\n return;\n }\n\n const unsubscribe = managed.networkTracker.subscribe((event) => {\n const applyTier2 = this.isContinuousSignalsEnabled(this.config.fingerprint.tier2)\n && this.config.fingerprint.tier2.enabled;\n const applyTier3 = this.isContinuousSignalsEnabled(this.config.fingerprint.tier3)\n && this.config.fingerprint.tier3.enabled\n && applyTier2;\n if (!applyTier2 && !applyTier3) {\n return;\n }\n\n this.applyFingerprintSignals(managed, [event], createRequestId(), {\n applyTier2,\n applyTier3,\n source: \"continuous\"\n });\n });\n\n this.networkSignalSubscriptions.set(managed.sessionId, unsubscribe);\n }\n\n private isContinuousSignalsEnabled(config: { enabled: boolean }): boolean {\n const runtimeConfig = config as { continuousSignals?: unknown };\n if (typeof runtimeConfig.continuousSignals === \"boolean\") {\n return runtimeConfig.continuousSignals;\n }\n return true;\n }\n\n private resolveCanaryTargetClass(url: string, status?: number): string {\n if (!this.config.canary?.targets?.enabled) {\n return \"disabled\";\n }\n if (typeof status === \"number\" && status >= 400) {\n return \"error_surface\";\n }\n\n const lowered = url.toLowerCase();\n if (/(captcha|challenge|auth|login|verify|cf_chl)/.test(lowered)) {\n return \"high_friction\";\n }\n return \"standard\";\n }\n\n private buildCanaryScoreWindow(\n samples: Tier3RuntimeState[\"canary\"][\"samples\"]\n ): {\n sampleCount: number;\n averageScore: number;\n minScore: number;\n maxScore: number;\n latestScore: number | null;\n } {\n if (samples.length === 0) {\n return {\n sampleCount: 0,\n averageScore: 0,\n minScore: 0,\n maxScore: 0,\n latestScore: null\n };\n }\n\n let minScore = Number.POSITIVE_INFINITY;\n let maxScore = Number.NEGATIVE_INFINITY;\n let totalScore = 0;\n for (const sample of samples) {\n totalScore += sample.score;\n minScore = Math.min(minScore, sample.score);\n maxScore = Math.max(maxScore, sample.score);\n }\n\n return {\n sampleCount: samples.length,\n averageScore: totalScore / samples.length,\n minScore: Number.isFinite(minScore) ? minScore : 0,\n maxScore: Number.isFinite(maxScore) ? maxScore : 0,\n latestScore: samples[samples.length - 1]?.score ?? null\n };\n }\n\n private buildFingerprintSummary(managed: ManagedSession): {\n tier1: {\n ok: boolean;\n warnings: string[];\n issues: Tier1CoherenceResult[\"issues\"];\n };\n tier2: {\n enabled: boolean;\n mode: Tier2RuntimeState[\"mode\"];\n profileId: string;\n healthScore: number;\n challengeCount: number;\n rotationCount: number;\n lastRotationTs: number;\n lastAppliedNetworkSeq: number;\n recentChallenges: Tier2RuntimeState[\"challengeEvents\"];\n };\n tier3: {\n enabled: boolean;\n status: Tier3RuntimeState[\"status\"];\n adapterName: string;\n fallbackTier: Tier3RuntimeState[\"fallbackTier\"];\n fallbackReason?: string;\n canary: {\n level: number;\n averageScore: number;\n lastAction: string;\n sampleCount: number;\n };\n };\n } {\n return {\n tier1: {\n ok: managed.fingerprint.tier1.ok,\n warnings: managed.fingerprint.tier1.warnings,\n issues: managed.fingerprint.tier1.issues\n },\n tier2: {\n enabled: managed.fingerprint.tier2.enabled,\n mode: managed.fingerprint.tier2.mode,\n profileId: managed.fingerprint.tier2.profile.id,\n healthScore: managed.fingerprint.tier2.profile.healthScore,\n challengeCount: managed.fingerprint.tier2.profile.challengeCount,\n rotationCount: managed.fingerprint.tier2.profile.rotationCount,\n lastRotationTs: managed.fingerprint.tier2.lastRotationTs,\n lastAppliedNetworkSeq: managed.fingerprint.lastAppliedNetworkSeq,\n recentChallenges: managed.fingerprint.tier2.challengeEvents.slice(-5)\n },\n tier3: {\n enabled: managed.fingerprint.tier3.enabled,\n status: managed.fingerprint.tier3.status,\n adapterName: managed.fingerprint.tier3.adapterName,\n fallbackTier: managed.fingerprint.tier3.fallbackTier,\n ...(managed.fingerprint.tier3.fallbackReason\n ? { fallbackReason: managed.fingerprint.tier3.fallbackReason }\n : {}),\n canary: {\n level: managed.fingerprint.tier3.canary.level,\n averageScore: managed.fingerprint.tier3.canary.averageScore,\n lastAction: managed.fingerprint.tier3.canary.lastAction,\n sampleCount: managed.fingerprint.tier3.canary.samples.length\n }\n }\n };\n }\n\n private latestStatus(\n events: Array<{ status?: number }>\n ): number | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const status = events[index]?.status;\n if (typeof status === \"number\") {\n return status;\n }\n }\n return undefined;\n }\n\n private recentNetworkEvents(managed: ManagedSession): ReturnType<NetworkTracker[\"poll\"]>[\"events\"] {\n const max = this.config.blockerArtifactCaps.maxNetworkEvents;\n return managed.networkTracker.poll(undefined, max).events;\n }\n\n private extractNetworkHosts(events: Array<{ url?: string }>): string[] {\n const hosts: string[] = [];\n const seen = new Set<string>();\n for (const event of events) {\n if (typeof event.url !== \"string\") continue;\n try {\n const host = new URL(event.url).hostname.toLowerCase();\n if (!host || seen.has(host)) continue;\n seen.add(host);\n hosts.push(host);\n if (hosts.length >= this.config.blockerArtifactCaps.maxHosts) break;\n } catch {\n // Ignore invalid/partial URLs in debug events.\n }\n }\n return hosts;\n }\n\n private buildTargetKey(managed: ManagedSession, url?: string): string {\n const targetId = managed.targets.getActiveTargetId() ?? \"unknown\";\n const host = (() => {\n if (!url) return \"\";\n try {\n return new URL(url).hostname.toLowerCase();\n } catch {\n return \"\";\n }\n })();\n return `${targetId}:${host}`;\n }\n\n private isEnvLimitedVerifierError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return /extension not connected|connect the extension|not available in this environment|operation not permitted|eperm/i.test(message);\n }\n\n private isTimeoutVerifierError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return /timed out|timeout/i.test(message);\n }\n\n private markVerifierFailure(sessionId: string, error: unknown): void {\n if (!this.store.has(sessionId)) {\n return;\n }\n this.store.markVerificationFailure(sessionId, {\n envLimited: this.isEnvLimitedVerifierError(error),\n timedOut: this.isTimeoutVerifierError(error)\n });\n }\n\n private reconcileSessionBlocker(\n sessionId: string,\n managed: ManagedSession,\n input: {\n source: \"navigation\" | \"network\";\n url?: string;\n finalUrl?: string;\n title?: string;\n status?: number;\n message?: string;\n providerErrorCode?: string;\n traceRequestId?: string;\n networkEvents?: Array<{ url?: string; status?: number }>;\n consoleEvents?: unknown[];\n exceptionEvents?: unknown[];\n verifier?: boolean;\n includeArtifacts?: boolean;\n envLimited?: boolean;\n restrictedTarget?: boolean;\n }\n ): {\n blocker?: BlockerSignalV1;\n blockerState: \"clear\" | \"active\" | \"resolving\";\n blockerUpdatedAt?: string;\n blockerResolution?: {\n status: \"resolved\" | \"unresolved\" | \"deferred\";\n reason: \"verifier_passed\" | \"verification_timeout\" | \"verifier_failed\" | \"env_limited\" | \"manual_clear\";\n updatedAt: string;\n };\n blockerArtifacts?: ReturnType<typeof buildBlockerArtifacts>;\n } | undefined {\n if (!this.store.has(sessionId)) {\n return undefined;\n }\n\n const now = Date.now();\n if (input.verifier) {\n this.store.startResolving(sessionId, now);\n }\n\n const networkEvents = input.networkEvents ?? this.recentNetworkEvents(managed);\n const blocker = classifyBlockerSignal({\n source: input.source,\n url: input.url,\n finalUrl: input.finalUrl,\n title: input.title,\n status: input.status,\n providerErrorCode: input.providerErrorCode,\n message: input.message,\n matchedPatterns: this.config.fingerprint.tier2.challengePatterns,\n networkHosts: this.extractNetworkHosts(networkEvents),\n traceRequestId: input.traceRequestId,\n envLimited: input.envLimited,\n restrictedTarget: input.restrictedTarget,\n promptGuardEnabled: this.config.security.promptInjectionGuard?.enabled ?? true,\n threshold: this.config.blockerDetectionThreshold\n });\n\n this.store.reconcileBlocker(sessionId, blocker, {\n timeoutMs: this.config.blockerResolutionTimeoutMs,\n verifier: input.verifier,\n targetKey: this.buildTargetKey(managed, input.finalUrl ?? input.url),\n nowMs: now\n });\n\n const summary = this.store.getBlockerSummary(sessionId);\n const artifacts = input.includeArtifacts && summary.state !== \"clear\"\n ? buildBlockerArtifacts({\n networkEvents: networkEvents as unknown[],\n consoleEvents: input.consoleEvents,\n exceptionEvents: input.exceptionEvents,\n promptGuardEnabled: this.config.security.promptInjectionGuard?.enabled ?? true,\n caps: this.config.blockerArtifactCaps\n })\n : undefined;\n\n return {\n blockerState: summary.state,\n ...(summary.blocker ? { blocker: summary.blocker } : {}),\n ...(summary.updatedAt ? { blockerUpdatedAt: summary.updatedAt } : {}),\n ...(summary.resolution ? { blockerResolution: summary.resolution } : {}),\n ...(artifacts ? { blockerArtifacts: artifacts } : {})\n };\n }\n\n private validateCookieRecord(cookie: CookieImportRecord): {\n valid: boolean;\n reason: string;\n cookie: CookieImportRecord;\n } {\n const name = cookie.name?.trim();\n if (!name) {\n return { valid: false, reason: \"Cookie name is required.\", cookie };\n }\n if (!/^[^\\s;=]+$/.test(name)) {\n return { valid: false, reason: `Invalid cookie name: ${cookie.name}.`, cookie };\n }\n\n if (typeof cookie.value !== \"string\") {\n return { valid: false, reason: `Invalid cookie value for ${name}.`, cookie };\n }\n\n const value = cookie.value;\n if (/\\r|\\n|;/.test(value)) {\n return { valid: false, reason: `Invalid cookie value for ${name}.`, cookie };\n }\n\n const hasUrl = typeof cookie.url === \"string\" && cookie.url.trim().length > 0;\n const hasDomain = typeof cookie.domain === \"string\" && cookie.domain.trim().length > 0;\n if (!hasUrl && !hasDomain) {\n return { valid: false, reason: `Cookie ${name} requires url or domain.`, cookie };\n }\n\n let normalizedUrl: string | undefined;\n if (hasUrl) {\n try {\n const parsedUrl = new URL(cookie.url as string);\n if (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\") {\n return { valid: false, reason: `Cookie ${name} url must be http(s).`, cookie };\n }\n normalizedUrl = parsedUrl.toString();\n } catch {\n return { valid: false, reason: `Cookie ${name} has invalid url.`, cookie };\n }\n }\n\n let normalizedDomain: string | undefined;\n if (hasDomain) {\n normalizedDomain = String(cookie.domain).trim().toLowerCase();\n if (!/^\\.?[a-z0-9.-]+$/.test(normalizedDomain)) {\n return { valid: false, reason: `Cookie ${name} has invalid domain.`, cookie };\n }\n if (normalizedDomain.includes(\"..\")) {\n return { valid: false, reason: `Cookie ${name} has invalid domain.`, cookie };\n }\n }\n\n const normalizedPath = typeof cookie.path === \"string\" ? cookie.path.trim() : undefined;\n if (typeof normalizedPath === \"string\" && !normalizedPath.startsWith(\"/\")) {\n return { valid: false, reason: `Cookie ${name} path must start with '/'.`, cookie };\n }\n\n if (typeof cookie.expires !== \"undefined\") {\n if (!Number.isFinite(cookie.expires)) {\n return { valid: false, reason: `Cookie ${name} has invalid expires.`, cookie };\n }\n if ((cookie.expires as number) < -1) {\n return { valid: false, reason: `Cookie ${name} has invalid expires.`, cookie };\n }\n }\n\n if (cookie.sameSite === \"None\" && cookie.secure !== true) {\n return { valid: false, reason: `Cookie ${name} with SameSite=None must set secure=true.`, cookie };\n }\n\n // Playwright expects either URL-form cookies or domain+path cookies.\n // For URL-form cookies, avoid forcing a synthetic path to preserve runtime compatibility.\n const normalizedCookie: CookieImportRecord = {\n name,\n value,\n ...(typeof cookie.expires === \"number\" ? { expires: cookie.expires } : {}),\n ...(typeof cookie.httpOnly === \"boolean\" ? { httpOnly: cookie.httpOnly } : {}),\n ...(typeof cookie.secure === \"boolean\" ? { secure: cookie.secure } : {}),\n ...(cookie.sameSite ? { sameSite: cookie.sameSite } : {})\n };\n\n if (normalizedDomain) {\n normalizedCookie.domain = normalizedDomain;\n normalizedCookie.path = normalizedPath ?? \"/\";\n } else if (normalizedUrl) {\n normalizedCookie.url = normalizedUrl;\n }\n\n return {\n valid: true,\n reason: \"\",\n cookie: normalizedCookie\n };\n }\n\n private normalizeCookieListUrls(urls?: string[]): string[] | undefined {\n if (!urls || urls.length === 0) {\n return undefined;\n }\n\n const normalized: string[] = [];\n const seen = new Set<string>();\n for (const input of urls) {\n const trimmed = input.trim();\n if (!trimmed) {\n throw new Error(\"Cookie list urls must be non-empty strings.\");\n }\n\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(trimmed);\n } catch {\n throw new Error(`Cookie list url is invalid: ${trimmed}`);\n }\n if (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\") {\n throw new Error(`Cookie list url must be http(s): ${trimmed}`);\n }\n\n const normalizedUrl = parsedUrl.toString();\n if (seen.has(normalizedUrl)) {\n continue;\n }\n seen.add(normalizedUrl);\n normalized.push(normalizedUrl);\n }\n\n return normalized.length > 0 ? normalized : undefined;\n }\n\n private buildOverrideSession(input: { browser: Browser; context: BrowserContext; targets: TargetManager }): ManagedSession {\n const refStore = new RefStore();\n const fingerprint = this.initializeFingerprintState(\"override\", this.config.profile, this.config.flags);\n return {\n sessionId: \"override\",\n mode: \"managed\",\n headless: true,\n extensionLegacy: false,\n browser: input.browser,\n context: input.context,\n profileDir: \"\",\n persistProfile: true,\n targets: input.targets,\n refStore,\n snapshotter: new Snapshotter(refStore),\n consoleTracker: new ConsoleTracker(200, { showFullConsole: this.config.devtools.showFullConsole }),\n exceptionTracker: new ExceptionTracker(200),\n networkTracker: new NetworkTracker(300, { showFullUrls: this.config.devtools.showFullUrls }),\n fingerprint\n };\n }\n\n private getManaged(sessionId: string): ManagedSession {\n const managed = this.sessions.get(sessionId);\n if (!managed) {\n throw new Error(`Unknown sessionId: ${sessionId}`);\n }\n return managed;\n }\n\n private resolveModeVariant(managed: ManagedSession): ParallelModeVariant {\n if (managed.mode === \"managed\") {\n return managed.headless ? \"managedHeadless\" : \"managedHeaded\";\n }\n if (managed.mode === \"cdpConnect\") {\n return managed.headless ? \"cdpConnectHeadless\" : \"cdpConnectHeaded\";\n }\n return managed.extensionLegacy ? \"extensionLegacyCdpHeaded\" : \"extensionOpsHeaded\";\n }\n\n private clearSessionParallelState(sessionId: string): void {\n const state = this.sessionParallel.get(sessionId);\n if (state) {\n for (const waiter of state.waiters) {\n if (waiter.timer) {\n clearTimeout(waiter.timer);\n waiter.timer = null;\n }\n waiter.reject(new Error(\"Session closed while waiting for parallelism slot.\"));\n }\n state.waiters.length = 0;\n state.waitingByTarget.clear();\n this.sessionParallel.delete(sessionId);\n }\n for (const key of this.targetQueues.keys()) {\n if (key.startsWith(`${sessionId}:`)) {\n this.targetQueues.delete(key);\n }\n }\n }\n\n private resolveTargetContext(\n managed: ManagedSession,\n targetId: string | null | undefined\n ): { targetId: string; page: Page } {\n const resolvedTargetId = targetId ?? managed.targets.getActiveTargetId();\n if (!resolvedTargetId) {\n throw new Error(\"No active target\");\n }\n return {\n targetId: resolvedTargetId,\n page: managed.targets.getPage(resolvedTargetId)\n };\n }\n\n private refreshGovernorSnapshot(sessionId: string): ParallelismGovernorSnapshot {\n const state = this.getParallelState(sessionId);\n const now = Date.now();\n const oldestWaiter = state.waiters[0];\n const queueAgeMs = oldestWaiter ? Math.max(0, now - oldestWaiter.enqueuedAt) : 0;\n const queueDepth = state.waiters.length;\n const lastSampleAt = state.governor.lastSampleAt;\n const sampleIntervalMs = this.config.parallelism.sampleIntervalMs;\n if (lastSampleAt > 0 && now - lastSampleAt < sampleIntervalMs) {\n state.lastSnapshot = {\n ...state.lastSnapshot,\n waitQueueAgeMs: queueAgeMs,\n waitQueueDepth: queueDepth\n };\n return state.lastSnapshot;\n }\n\n const hostTotal = totalmem();\n const hostFreePct = hostTotal > 0 ? (freemem() / hostTotal) * 100 : 100;\n const rssPct = rssUsagePercent(process.memoryUsage().rss, this.config.parallelism.rssBudgetMb);\n const snapshot = evaluateGovernor(\n this.config.parallelism,\n state.governor,\n {\n hostFreeMemPct: hostFreePct,\n rssUsagePct: rssPct,\n queueAgeMs,\n queueDepth\n },\n now\n );\n state.governor = snapshot.state;\n state.lastSnapshot = snapshot;\n return snapshot;\n }\n\n private createBackpressureError(\n sessionId: string,\n targetId: string,\n timeoutMs: number,\n snapshot: ParallelismGovernorSnapshot,\n inflight: number\n ): Error {\n const info: BackpressureErrorInfo = {\n code: \"parallelism_backpressure\",\n classification: \"timeout\",\n sessionId,\n targetId,\n modeVariant: snapshot.state.modeVariant,\n effectiveParallelCap: snapshot.state.effectiveCap,\n inFlight: inflight,\n waitQueueDepth: snapshot.waitQueueDepth,\n waitQueueAgeMs: snapshot.waitQueueAgeMs,\n pressure: snapshot.pressure,\n timeoutMs\n };\n const error = new Error(`Parallelism cap reached for target ${targetId}; retry later.`);\n (error as Error & { code: string; details: BackpressureErrorInfo }).code = info.code;\n (error as Error & { code: string; details: BackpressureErrorInfo }).details = info;\n return error;\n }\n\n private wakeWaiters(sessionId: string): void {\n const state = this.sessionParallel.get(sessionId);\n if (!state) {\n return;\n }\n this.refreshGovernorSnapshot(sessionId);\n while (state.waiters.length > 0 && state.inflight < state.governor.effectiveCap) {\n const waiter = state.waiters.shift();\n if (!waiter) {\n break;\n }\n const queueForTarget = state.waitingByTarget.get(waiter.targetId);\n if (queueForTarget && queueForTarget.length > 0) {\n queueForTarget.shift();\n if (queueForTarget.length === 0) {\n state.waitingByTarget.delete(waiter.targetId);\n }\n }\n if (waiter.timer) {\n clearTimeout(waiter.timer);\n waiter.timer = null;\n }\n state.inflight += 1;\n waiter.resolve();\n }\n }\n\n private async acquireParallelSlot(sessionId: string, targetId: string, timeoutMs: number): Promise<void> {\n const state = this.getParallelState(sessionId);\n this.refreshGovernorSnapshot(sessionId);\n if (state.inflight < state.governor.effectiveCap && state.waiters.length === 0) {\n state.inflight += 1;\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n const enqueuedAt = Date.now();\n const waiter: ParallelWaiter = {\n targetId,\n enqueuedAt,\n timeoutMs,\n resolve,\n reject,\n timer: null\n };\n const byTarget = state.waitingByTarget.get(targetId) ?? [];\n byTarget.push(enqueuedAt);\n state.waitingByTarget.set(targetId, byTarget);\n waiter.timer = setTimeout(() => {\n const index = state.waiters.indexOf(waiter);\n if (index >= 0) {\n state.waiters.splice(index, 1);\n }\n const queueForTarget = state.waitingByTarget.get(targetId);\n if (queueForTarget && queueForTarget.length > 0) {\n queueForTarget.shift();\n if (queueForTarget.length === 0) {\n state.waitingByTarget.delete(targetId);\n }\n }\n const snapshot = this.refreshGovernorSnapshot(sessionId);\n reject(this.createBackpressureError(sessionId, targetId, timeoutMs, snapshot, state.inflight));\n }, timeoutMs);\n state.waiters.push(waiter);\n this.refreshGovernorSnapshot(sessionId);\n this.wakeWaiters(sessionId);\n });\n }\n\n private releaseParallelSlot(sessionId: string): void {\n const state = this.sessionParallel.get(sessionId);\n if (!state) {\n return;\n }\n state.inflight = Math.max(0, state.inflight - 1);\n this.wakeWaiters(sessionId);\n }\n\n private targetQueueKey(sessionId: string, targetId: string): string {\n return `${sessionId}:${targetId}`;\n }\n\n private async runTargetScoped<T>(\n sessionId: string,\n targetId: string | null | undefined,\n execute: (ctx: { managed: ManagedSession; targetId: string; page: Page }) => Promise<T>,\n timeoutMs = this.config.parallelism.backpressureTimeoutMs\n ): Promise<T> {\n const managed = this.getManaged(sessionId);\n const resolved = this.resolveTargetContext(managed, targetId);\n const queueKey = this.targetQueueKey(sessionId, resolved.targetId);\n const previous = this.targetQueues.get(queueKey) ?? Promise.resolve();\n let releaseQueue: () => void = () => {};\n const gate = new Promise<void>((resolve) => {\n releaseQueue = resolve;\n });\n const tail = previous.then(() => gate, () => gate);\n this.targetQueues.set(queueKey, tail);\n await previous;\n\n let slotAcquired = false;\n try {\n await this.acquireParallelSlot(sessionId, resolved.targetId, timeoutMs);\n slotAcquired = true;\n return await execute({\n managed,\n targetId: resolved.targetId,\n page: resolved.page\n });\n } finally {\n if (slotAcquired) {\n this.releaseParallelSlot(sessionId);\n }\n releaseQueue();\n if (this.targetQueues.get(queueKey) === tail) {\n this.targetQueues.delete(queueKey);\n }\n }\n }\n\n private async runStructural<T>(sessionId: string, execute: () => Promise<T>): Promise<T> {\n const state = this.getParallelState(sessionId);\n return state.structural.runExclusive(execute);\n }\n\n private resolveRefEntry(managed: ManagedSession, ref: string): {\n selector: string;\n backendNodeId: number;\n } {\n const targetId = managed.targets.getActiveTargetId();\n if (!targetId) {\n throw new Error(\"No active target for ref resolution\");\n }\n return this.resolveRefEntryForTarget(managed, ref, targetId);\n }\n\n private resolveRefEntryForTarget(\n managed: ManagedSession,\n ref: string,\n targetId: string\n ): {\n selector: string;\n backendNodeId: number;\n } {\n const entry = managed.refStore.resolve(targetId, ref);\n if (!entry) {\n throw this.buildStaleSnapshotError(ref);\n }\n return {\n selector: entry.selector,\n backendNodeId: entry.backendNodeId\n };\n }\n\n private resolveSelector(managed: ManagedSession, ref: string, targetId?: string): string {\n if (targetId) {\n return this.resolveRefEntryForTarget(managed, ref, targetId).selector;\n }\n return this.resolveRefEntry(managed, ref).selector;\n }\n\n private buildStaleSnapshotError(ref: string): Error {\n return new Error(`Unknown ref: ${ref}. Take a new snapshot first.`);\n }\n\n private isSnapshotStaleError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n if (message.includes(\"Take a new snapshot first.\")) {\n return true;\n }\n const normalized = message.toLowerCase();\n return (\n normalized.includes(\"no node with given id\")\n || normalized.includes(\"could not find node with given id\")\n || normalized.includes(\"cannot find object with id\")\n || normalized.includes(\"cannot find context with specified id\")\n || normalized.includes(\"execution context was destroyed\")\n || normalized.includes(\"inspected target navigated or closed\")\n );\n }\n\n private async evaluateDomStateByBackendNode(\n managed: ManagedSession,\n ref: string,\n functionDeclaration: string,\n args: unknown[] = [],\n targetId?: string\n ): Promise<unknown> {\n const resolvedTargetId = targetId ?? managed.targets.getActiveTargetId();\n if (!resolvedTargetId) {\n throw new Error(\"No active target for ref resolution\");\n }\n const entry = this.resolveRefEntryForTarget(managed, ref, resolvedTargetId);\n const page = managed.targets.getPage(resolvedTargetId);\n const session = await managed.context.newCDPSession(page);\n try {\n const resolved = await session.send(\"DOM.resolveNode\", {\n backendNodeId: entry.backendNodeId\n }) as { object?: { objectId?: string } };\n const objectId = resolved.object?.objectId;\n if (!objectId) {\n throw this.buildStaleSnapshotError(ref);\n }\n\n const evaluated = await session.send(\"Runtime.callFunctionOn\", {\n objectId,\n functionDeclaration,\n arguments: args.map((value) => ({ value })),\n returnByValue: true\n }) as { result?: { value?: unknown }; exceptionDetails?: { text?: string } };\n\n if (evaluated.exceptionDetails) {\n const message = typeof evaluated.exceptionDetails.text === \"string\"\n ? evaluated.exceptionDetails.text\n : \"Runtime.callFunctionOn failed\";\n throw new Error(message);\n }\n\n return evaluated.result?.value;\n } catch (error) {\n if (this.isSnapshotStaleError(error)) {\n throw this.buildStaleSnapshotError(ref);\n }\n throw error;\n } finally {\n try {\n await session.detach();\n } catch {\n // Best-effort cleanup.\n }\n }\n }\n\n private buildProfileLockLaunchMessage(launchMessage: string, profileDir: string): string | null {\n const normalized = launchMessage.toLowerCase();\n const profileLock = normalized.includes(\"singletonlock\")\n || normalized.includes(\"processsingleton\")\n || normalized.includes(\"profile in use\")\n || normalized.includes(\"already in use\")\n || normalized.includes(\"user data directory is already in use\");\n if (!profileLock) {\n return null;\n }\n return [\n \"Failed to launch browser context: browser profile is locked by another process.\",\n `Profile directory: ${profileDir}.`,\n \"Retry with a unique profile (--profile <name>) or disable persistence (--persist-profile false).\",\n `Original error: ${launchMessage}`\n ].join(\" \");\n }\n\n private async safePageTitle(page: Page | null, context: string): Promise<string | undefined> {\n if (!page) return undefined;\n try {\n const result = await Promise.race([\n page.title(),\n delay(2000).then(() => null)\n ]);\n if (result === null) {\n console.warn(`${context}: timed out reading page title`);\n return undefined;\n }\n return result;\n } catch {\n console.warn(`${context}: failed to read page title`);\n return undefined;\n }\n }\n\n private safePageUrl(page: Page | null, context: string): string | undefined {\n if (!page) return undefined;\n try {\n return page.url();\n } catch {\n console.warn(`${context}: failed to read page url`);\n return undefined;\n }\n }\n\n private async createExtensionPage(managed: ManagedSession, context: string): Promise<Page> {\n try {\n return await managed.context.newPage();\n } catch (error) {\n if (managed.mode !== \"extension\" || !this.isDetachedFrameError(error)) {\n throw error;\n }\n }\n\n await delay(200);\n\n try {\n return await managed.context.newPage();\n } catch (error) {\n throw this.describeExtensionFailure(context, error, managed);\n }\n }\n\n private async waitForExtensionTargetReady(page: Page, context: string, timeoutMs = 5000): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n let lastError: string | null = null;\n\n while (Date.now() < deadline) {\n if (page.isClosed()) {\n throw new Error(`EXTENSION_TARGET_READY_CLOSED: ${context} page closed before navigation.`);\n }\n try {\n const frame = page.mainFrame();\n if (!frame.isDetached()) {\n const remaining = Math.max(250, Math.min(750, deadline - Date.now()));\n await frame.waitForLoadState(\"domcontentloaded\", { timeout: remaining });\n return;\n }\n } catch (error) {\n if (this.isDetachedFrameError(error)) {\n lastError = error instanceof Error ? error.message : String(error);\n } else if (error instanceof Error && error.name === \"TimeoutError\") {\n // Continue polling until deadline.\n } else {\n throw error;\n }\n }\n await delay(100);\n }\n\n const detail = lastError ? ` Last error: ${lastError}` : \"\";\n throw new Error(`EXTENSION_TARGET_READY_TIMEOUT: ${context} exceeded ${timeoutMs}ms.${detail}`);\n }\n\n private isDetachedFrameError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.includes(\"Frame has been detached\");\n }\n\n private isTargetNotAllowedError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.includes(\"Target.createTarget\") && message.includes(\"Not allowed\");\n }\n\n private isExtensionTargetReadyTimeout(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.startsWith(\"EXTENSION_TARGET_READY_TIMEOUT\");\n }\n\n private describeExtensionFailure(context: string, error: unknown, managed: ManagedSession): Error {\n const message = error instanceof Error ? error.message : String(error);\n let url: string | undefined;\n try {\n url = this.safePageUrl(managed.targets.getActivePage(), `BrowserManager.${context}`);\n } catch {\n url = undefined;\n }\n const urlInfo = url ? ` Active tab: ${url}.` : \"\";\n return new Error(`Extension mode ${context} failed. Focus a stable http(s) tab and retry.${urlInfo} ${message}`);\n }\n\n private attachTrackers(managed: ManagedSession): void {\n const activeTargetId = managed.targets.getActiveTargetId();\n if (!activeTargetId) return;\n const page = managed.targets.getActivePage();\n managed.consoleTracker.attach(page);\n managed.exceptionTracker.attach(page);\n managed.networkTracker.attach(page);\n }\n\n private attachRefInvalidation(managed: ManagedSession): void {\n const entries = managed.targets.listPageEntries();\n for (const entry of entries) {\n this.attachRefInvalidationForPage(managed, entry.targetId, entry.page);\n }\n }\n\n private attachRefInvalidationForPage(managed: ManagedSession, targetId: string, page: Page): void {\n if (this.pageListeners.has(page)) return;\n\n const onNavigate = (frame: { parentFrame: () => unknown }) => {\n if (frame.parentFrame() === null) {\n managed.refStore.clearTarget(targetId);\n }\n };\n\n const onClose = () => {\n managed.refStore.clearTarget(targetId);\n };\n\n page.on(\"framenavigated\", onNavigate);\n page.on(\"close\", onClose);\n\n this.pageListeners.set(page, () => {\n page.off(\"framenavigated\", onNavigate);\n page.off(\"close\", onClose);\n });\n }\n\n private async resolveWsEndpoint(options: ConnectOptions): Promise<string> {\n if (options.wsEndpoint) {\n ensureLocalEndpoint(options.wsEndpoint, this.config.security.allowNonLocalCdp);\n return options.wsEndpoint;\n }\n\n const host = options.host ?? \"127.0.0.1\";\n const port = options.port ?? 9222;\n const url = `http://${host}:${port}/json/version`;\n ensureLocalEndpoint(url, this.config.security.allowNonLocalCdp);\n\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to fetch CDP endpoint from ${url}`);\n }\n\n const data = await response.json() as { webSocketDebuggerUrl?: string };\n if (!data.webSocketDebuggerUrl) {\n throw new Error(\"webSocketDebuggerUrl missing from /json/version response\");\n }\n\n ensureLocalEndpoint(data.webSocketDebuggerUrl, this.config.security.allowNonLocalCdp);\n\n return data.webSocketDebuggerUrl;\n }\n\n private async connectWithEndpoint(\n connectWsEndpoint: string,\n mode: BrowserMode,\n reportedWsEndpoint?: string\n ): Promise<{ sessionId: string; mode: BrowserMode; activeTargetId: string | null; warnings: string[]; wsEndpoint?: string }> {\n let browser: Browser | null = null;\n const connectAttempts = mode === \"extension\" ? 3 : 1;\n const sanitizedEndpoint = this.sanitizeWsEndpointForOutput(connectWsEndpoint);\n for (let attempt = 1; attempt <= connectAttempts; attempt += 1) {\n const connectStart = Date.now();\n try {\n browser = await chromium.connectOverCDP(connectWsEndpoint);\n break;\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"401\") || message.toLowerCase().includes(\"unauthorized\")) {\n throw new Error(\"Relay /cdp rejected the connection (unauthorized). Check relayToken configuration and ensure clients use the current token.\");\n }\n const staleExtensionTab = mode === \"extension\" && isExtensionStaleTabAttachError(message);\n if (staleExtensionTab && attempt < connectAttempts) {\n await delay(attempt * 250);\n continue;\n }\n throw new Error(\n `Relay /cdp connectOverCDP failed after ${Date.now() - connectStart}ms (mode=${mode}, endpoint=${sanitizedEndpoint}): ${message}`,\n { cause: error }\n );\n }\n }\n if (!browser) {\n throw new Error(`Relay /cdp connectOverCDP failed (mode=${mode}, endpoint=${sanitizedEndpoint}).`);\n }\n try {\n const contexts = browser.contexts();\n let context = contexts[0] ?? null;\n if (!context) {\n if (mode === \"extension\") {\n throw new Error(\"Extension relay did not expose a browser context. Ensure a normal tab is active and retry.\");\n }\n context = await browser.newContext();\n }\n\n const sessionId = randomUUID();\n const targets = new TargetManager();\n const pages = context.pages();\n\n if (pages.length === 0) {\n if (mode === \"extension\") {\n const page = await waitForPage(context, 8000);\n if (!page) {\n throw new Error(\"Extension relay connected but no page was detected. Focus a normal tab and retry.\");\n }\n targets.registerPage(page);\n } else {\n const page = await context.newPage();\n targets.registerPage(page);\n }\n } else {\n targets.registerExistingPages(pages);\n if (mode === \"extension\") {\n const entries = targets.listPageEntries();\n for (const entry of entries) {\n try {\n const url = entry.page.url();\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) {\n targets.setActiveTarget(entry.targetId);\n break;\n }\n } catch {\n // Skip pages that cannot report a URL.\n }\n }\n }\n }\n\n const refStore = new RefStore();\n const snapshotter = new Snapshotter(refStore);\n const consoleTracker = new ConsoleTracker(200, { showFullConsole: this.config.devtools.showFullConsole });\n const exceptionTracker = new ExceptionTracker(200);\n const networkTracker = new NetworkTracker(300, { showFullUrls: this.config.devtools.showFullUrls });\n const fingerprint = this.initializeFingerprintState(\n sessionId,\n this.config.profile,\n this.config.flags\n );\n const warnings = formatTier1Warnings(fingerprint.tier1);\n\n const managed: ManagedSession = {\n sessionId,\n mode,\n headless: false,\n extensionLegacy: mode === \"extension\",\n browser,\n context,\n profileDir: \"\",\n persistProfile: true,\n targets,\n refStore,\n snapshotter,\n consoleTracker,\n exceptionTracker,\n networkTracker,\n fingerprint\n };\n\n this.store.add({ id: sessionId, mode, browser, context });\n this.sessions.set(sessionId, managed);\n this.attachContinuousFingerprintSignals(managed);\n this.attachTrackers(managed);\n this.attachRefInvalidation(managed);\n\n if (!fingerprint.tier1.ok) {\n this.logger.warn(\"fingerprint.tier1.mismatch\", {\n sessionId,\n data: { issues: fingerprint.tier1.issues, mode }\n });\n }\n\n const wsEndpoint = reportedWsEndpoint ?? connectWsEndpoint;\n return { sessionId, mode, activeTargetId: targets.getActiveTargetId(), warnings, wsEndpoint };\n } catch (error) {\n try {\n await browser.close();\n } catch {\n // Best-effort cleanup to avoid orphaned /cdp connections.\n }\n throw error;\n }\n }\n\n private async resolveRelayEndpoints(wsEndpoint: string): Promise<{ connectEndpoint: string; reportedEndpoint: string }> {\n const result = await resolveRelayEndpoint({ wsEndpoint, path: \"cdp\", config: this.config });\n return { connectEndpoint: result.connectEndpoint, reportedEndpoint: result.reportedEndpoint };\n }\n\n private sanitizeWsEndpointForOutput(wsEndpoint: string): string {\n return sanitizeWsEndpoint(wsEndpoint);\n }\n}\n\nconst waitForPage = async (context: BrowserContext, timeoutMs: number): Promise<Page | null> => {\n const existing = context.pages()[0];\n if (existing) return existing;\n try {\n return await context.waitForEvent(\"page\", { timeout: timeoutMs });\n } catch {\n return context.pages()[0] ?? null;\n }\n};\n\nfunction truncateHtml(value: string, maxChars: number): { outerHTML: string; truncated: boolean } {\n if (value.length <= maxChars) {\n return { outerHTML: value, truncated: false };\n }\n return { outerHTML: value.slice(0, maxChars), truncated: true };\n}\n\nfunction readFlagValue(flags: string[], key: string): string | undefined {\n for (let index = 0; index < flags.length; index += 1) {\n const flag = flags[index];\n if (!flag) continue;\n if (flag === key) {\n const next = flags[index + 1];\n if (next && !next.startsWith(\"--\")) {\n return next;\n }\n continue;\n }\n if (flag.startsWith(`${key}=`)) {\n const value = flag.slice(key.length + 1);\n return value || undefined;\n }\n }\n return undefined;\n}\n\nfunction resolveTier3FallbackTarget(tier: \"tier1\" | \"tier2\"): \"tier1\" | \"tier2\" {\n return tier;\n}\n\nfunction isExtensionStaleTabAttachError(detail: string): boolean {\n const message = detail.toLowerCase();\n return message.includes(\"target.setautoattach\") && message.includes(\"no tab with given id\");\n}\n\nconst delay = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nfunction truncateText(value: string, maxChars: number): { text: string; truncated: boolean } {\n if (value.length <= maxChars) {\n return { text: value, truncated: false };\n }\n return { text: value.slice(0, maxChars), truncated: true };\n}\n","import { createHash } from \"crypto\";\nimport { mkdir, stat } from \"fs/promises\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\nexport type CachePaths = {\n root: string;\n projectRoot: string;\n profileDir: string;\n chromeDir: string;\n};\n\nfunction safeHash(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\").slice(0, 16);\n}\n\nasync function ensureDir(path: string): Promise<void> {\n await mkdir(path, { recursive: true });\n}\n\nasync function exists(path: string): Promise<boolean> {\n try {\n await stat(path);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function resolveCachePaths(worktree: string, profile: string): Promise<CachePaths> {\n const base = process.env.OPENCODE_CACHE_DIR\n ?? process.env.XDG_CACHE_HOME\n ?? join(homedir(), \".cache\");\n const root = join(base, \"opendevbrowser\");\n const projectRoot = join(root, \"projects\", safeHash(worktree));\n const profileDir = join(projectRoot, \"profiles\", profile);\n const chromeDir = join(root, \"chrome\");\n\n await ensureDir(root);\n await ensureDir(projectRoot);\n await ensureDir(profileDir);\n await ensureDir(chromeDir);\n\n return { root, projectRoot, profileDir, chromeDir };\n}\n\nexport async function ensureFileAbsent(path: string): Promise<void> {\n if (await exists(path)) {\n throw new Error(`Path already exists: ${path}`);\n }\n}\n","import { access } from \"fs/promises\";\nimport { delimiter, join } from \"path\";\n\nasync function pathExists(path: string): Promise<boolean> {\n try {\n await access(path);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction pathCandidatesByPlatform(): string[] {\n const platform = process.platform;\n\n if (platform === \"darwin\") {\n return [\n \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\",\n \"/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary\"\n ];\n }\n\n if (platform === \"win32\") {\n const programFiles = process.env.PROGRAMFILES || \"C:\\\\Program Files\";\n const programFilesX86 = process.env[\"PROGRAMFILES(X86)\"] || \"C:\\\\Program Files (x86)\";\n const localAppData = process.env.LOCALAPPDATA || \"\";\n\n return [\n join(programFiles, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(programFilesX86, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\"),\n join(localAppData, \"Google\", \"Chrome\", \"Application\", \"chrome.exe\")\n ];\n }\n\n return [];\n}\n\nfunction binaryCandidatesInPath(): string[] {\n return [\n \"google-chrome\",\n \"google-chrome-stable\",\n \"chromium\",\n \"chromium-browser\"\n ];\n}\n\nasync function findInPath(binary: string): Promise<string | null> {\n const pathValue = process.env.PATH;\n if (!pathValue) return null;\n\n const candidates = process.platform === \"win32\" ? [binary, `${binary}.exe`] : [binary];\n for (const dir of pathValue.split(delimiter)) {\n for (const name of candidates) {\n const fullPath = join(dir, name);\n if (await pathExists(fullPath)) return fullPath;\n }\n }\n\n return null;\n}\n\nexport async function findChromeExecutable(overridePath?: string): Promise<string | null> {\n if (overridePath && await pathExists(overridePath)) {\n return overridePath;\n }\n\n for (const candidate of pathCandidatesByPlatform()) {\n if (await pathExists(candidate)) return candidate;\n }\n\n for (const binary of binaryCandidatesInPath()) {\n const found = await findInPath(binary);\n if (found) return found;\n }\n\n return null;\n}\n","import { Browser, detectBrowserPlatform, install, resolveBuildId } from \"@puppeteer/browsers\";\n\nexport type DownloadResult = {\n executablePath: string;\n buildId: string;\n};\n\nexport async function downloadChromeForTesting(cacheDir: string): Promise<DownloadResult> {\n const platform = detectBrowserPlatform();\n if (!platform) {\n throw new Error(\"Unsupported platform for Chrome download\");\n }\n\n const buildId = await resolveBuildId(Browser.CHROME, platform, \"latest\");\n const result = await install({\n browser: Browser.CHROME,\n buildId,\n cacheDir,\n downloadProgressCallback: () => undefined\n });\n\n return {\n executablePath: result.executablePath,\n buildId\n };\n}\n","import type { Page } from \"playwright-core\";\n\nconst JWT_PATTERN = /\\beyJ[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\b/g;\nconst TOKEN_LIKE_PATTERN = /\\b[A-Za-z0-9_-]{16,}\\b/g;\nconst API_KEY_PREFIX_PATTERN = /\\b(sk_|pk_|api_|key_|token_|secret_|bearer_)[A-Za-z0-9_-]+\\b/gi;\nconst SENSITIVE_KV_PATTERN = /\\b(token|key|secret|password|auth|bearer|credential)[=:]\\s*\\S+/gi;\n\nfunction shouldRedactToken(token: string): boolean {\n if (/^(sk_|pk_|api_|key_|token_|secret_|bearer_)/i.test(token)) {\n return true;\n }\n const categories = [\n /[a-z]/.test(token),\n /[A-Z]/.test(token),\n /\\d/.test(token),\n /[_-]/.test(token)\n ].filter(Boolean).length;\n return categories >= 2;\n}\n\nfunction redactText(text: string): string {\n let result = text.replace(SENSITIVE_KV_PATTERN, (match) => {\n const sepIndex = match.search(/[=:]/);\n return match.slice(0, sepIndex + 1) + \"[REDACTED]\";\n });\n result = result.replace(JWT_PATTERN, \"[REDACTED]\");\n result = result.replace(API_KEY_PREFIX_PATTERN, \"[REDACTED]\");\n result = result.replace(TOKEN_LIKE_PATTERN, (match) => (\n shouldRedactToken(match) ? \"[REDACTED]\" : match\n ));\n return result;\n}\n\nexport type ConsoleEvent = {\n seq: number;\n level: string;\n category: \"log\" | \"warning\" | \"error\" | \"debug\" | \"trace\" | \"assert\" | \"other\";\n text: string;\n argsPreview: string;\n source?: string;\n line?: number;\n column?: number;\n ts: number;\n};\n\nexport type ConsoleTrackerOptions = {\n showFullConsole?: boolean;\n};\n\nexport class ConsoleTracker {\n private events: ConsoleEvent[] = [];\n private maxEvents: number;\n private seq: number = 0;\n private page: Page | null = null;\n private handler?: (msg: {\n type(): string;\n text(): string;\n location?(): {\n url?: string;\n lineNumber?: number;\n columnNumber?: number;\n };\n }) => void;\n private showFullConsole: boolean;\n\n constructor(maxEvents = 200, options: ConsoleTrackerOptions = {}) {\n this.maxEvents = maxEvents;\n this.showFullConsole = options.showFullConsole ?? false;\n }\n\n setOptions(options: ConsoleTrackerOptions): void {\n if (typeof options.showFullConsole === \"boolean\") {\n this.showFullConsole = options.showFullConsole;\n }\n }\n\n attach(page: Page): void {\n if (this.page === page) return;\n this.detach();\n\n this.page = page;\n this.handler = (msg) => {\n const rawText = msg.text();\n const text = this.showFullConsole ? rawText : redactText(rawText);\n const location = typeof msg.location === \"function\" ? msg.location() : undefined;\n const line = Number.isFinite(location?.lineNumber) ? Number(location?.lineNumber) : undefined;\n const column = Number.isFinite(location?.columnNumber) ? Number(location?.columnNumber) : undefined;\n const source = typeof location?.url === \"string\" && location.url.length > 0\n ? location.url\n : undefined;\n\n this.seq += 1;\n this.events.push({\n seq: this.seq,\n level: msg.type(),\n category: classifyConsoleCategory(msg.type()),\n text,\n argsPreview: buildArgsPreview(text),\n ...(source ? { source } : {}),\n ...(typeof line === \"number\" ? { line } : {}),\n ...(typeof column === \"number\" ? { column } : {}),\n ts: Date.now()\n });\n if (this.events.length > this.maxEvents) {\n this.events.shift();\n }\n };\n\n page.on(\"console\", this.handler);\n }\n\n detach(): void {\n if (this.page && this.handler) {\n this.page.off(\"console\", this.handler);\n }\n this.page = null;\n this.handler = undefined;\n }\n\n poll(sinceSeq = 0, max = 50): { events: ConsoleEvent[]; nextSeq: number; truncated?: boolean } {\n const pending = this.events.filter((event) => event.seq > sinceSeq);\n const events = pending.slice(0, max);\n const last = events[events.length - 1];\n const nextSeq = last ? last.seq : sinceSeq;\n return {\n events,\n nextSeq,\n truncated: pending.length > events.length\n };\n }\n}\n\nfunction classifyConsoleCategory(level: string): ConsoleEvent[\"category\"] {\n const normalized = level.toLowerCase();\n if (normalized === \"warning\" || normalized === \"warn\") return \"warning\";\n if (normalized === \"error\") return \"error\";\n if (normalized === \"debug\") return \"debug\";\n if (normalized === \"trace\") return \"trace\";\n if (normalized === \"assert\") return \"assert\";\n if (normalized === \"log\" || normalized === \"info\") return \"log\";\n return \"other\";\n}\n\nfunction buildArgsPreview(text: string): string {\n if (text.length <= 240) return text;\n return `${text.slice(0, 237)}...`;\n}\n\nexport const __test__ = {\n redactText,\n shouldRedactToken,\n classifyConsoleCategory,\n buildArgsPreview\n};\n","import type { Page } from \"playwright-core\";\n\nconst STACK_LOCATION_PATTERN = /\\(?((?:[a-zA-Z]+:)?\\/\\/[^\\s)]+|\\/[^\\s)]+):(\\d+):(\\d+)\\)?/;\nconst TRACE_ID_PATTERN = /\\btrace(?:_?id)?[:=]\\s*([a-zA-Z0-9_-]{8,64})\\b/i;\n\nexport type ExceptionEvent = {\n seq: number;\n ts: number;\n name: string;\n message: string;\n stack?: string;\n sourceUrl?: string;\n line?: number;\n column?: number;\n category: \"pageerror\" | \"runtime\" | \"unknown\";\n traceId?: string;\n};\n\ntype StackLocation = {\n sourceUrl?: string;\n line?: number;\n column?: number;\n};\n\nfunction parseStackLocation(stack: string | undefined): StackLocation {\n if (!stack) {\n return {};\n }\n for (const line of stack.split(\"\\n\")) {\n const match = STACK_LOCATION_PATTERN.exec(line);\n if (!match) {\n continue;\n }\n const sourceUrl = match[1];\n const lineNo = Number(match[2]);\n const columnNo = Number(match[3]);\n return {\n sourceUrl,\n line: Number.isFinite(lineNo) ? lineNo : undefined,\n column: Number.isFinite(columnNo) ? columnNo : undefined\n };\n }\n return {};\n}\n\nfunction deriveTraceId(error: Error): string | undefined {\n const match = TRACE_ID_PATTERN.exec(`${error.name} ${error.message} ${error.stack ?? \"\"}`);\n return match?.[1];\n}\n\nfunction normalizeError(error: Error): Omit<ExceptionEvent, \"seq\"> {\n const location = parseStackLocation(error.stack);\n return {\n ts: Date.now(),\n name: error.name || \"Error\",\n message: error.message || \"Unknown page error\",\n stack: error.stack,\n sourceUrl: location.sourceUrl,\n line: location.line,\n column: location.column,\n category: \"pageerror\",\n traceId: deriveTraceId(error)\n };\n}\n\nexport class ExceptionTracker {\n private events: ExceptionEvent[] = [];\n private readonly maxEvents: number;\n private seq = 0;\n private page: Page | null = null;\n private pageErrorHandler?: (error: Error) => void;\n\n constructor(maxEvents = 200) {\n this.maxEvents = maxEvents;\n }\n\n attach(page: Page): void {\n if (this.page === page) return;\n this.detach();\n\n this.page = page;\n this.pageErrorHandler = (error: Error) => {\n this.push(normalizeError(error));\n };\n\n page.on(\"pageerror\", this.pageErrorHandler);\n }\n\n detach(): void {\n if (this.page && this.pageErrorHandler) {\n this.page.off(\"pageerror\", this.pageErrorHandler);\n }\n this.page = null;\n this.pageErrorHandler = undefined;\n }\n\n poll(sinceSeq = 0, max = 50): { events: ExceptionEvent[]; nextSeq: number; truncated?: boolean } {\n const pending = this.events.filter((event) => event.seq > sinceSeq);\n const events = pending.slice(0, max);\n const last = events[events.length - 1];\n return {\n events,\n nextSeq: last ? last.seq : sinceSeq,\n truncated: pending.length > events.length\n };\n }\n\n private push(event: Omit<ExceptionEvent, \"seq\">): void {\n this.seq += 1;\n this.events.push({\n seq: this.seq,\n ...event\n });\n if (this.events.length > this.maxEvents) {\n this.events.shift();\n }\n }\n}\n\nexport const __test__ = {\n parseStackLocation,\n deriveTraceId\n};\n","import type { Page, Request, Response } from \"playwright-core\";\n\nfunction shouldRedactPathSegment(segment: string): boolean {\n if (segment.length < 16) return false;\n if (/^\\d+$/.test(segment)) return false;\n if (/^[a-f0-9-]{36}$/i.test(segment)) return false;\n if (/^(sk_|pk_|api_|key_|token_|secret_|bearer_)/i.test(segment)) return true;\n const categories = [/[a-z]/, /[A-Z]/, /\\d/, /[_-]/].filter(r => r.test(segment)).length;\n return categories >= 3 && segment.length >= 20;\n}\n\nfunction redactUrl(rawUrl: string): string {\n try {\n const parsed = new URL(rawUrl);\n parsed.search = \"\";\n parsed.hash = \"\";\n const segments = parsed.pathname.split(\"/\");\n const redactedSegments = segments.map(segment =>\n shouldRedactPathSegment(segment) ? \"[REDACTED]\" : segment\n );\n parsed.pathname = redactedSegments.join(\"/\");\n return parsed.toString();\n } catch {\n return rawUrl.split(/[?#]/)[0] || rawUrl;\n }\n}\n\nexport type NetworkEvent = {\n seq: number;\n method: string;\n url: string;\n status?: number;\n resourceType?: string;\n ts: number;\n};\n\nexport type NetworkTrackerOptions = {\n showFullUrls?: boolean;\n};\n\nexport class NetworkTracker {\n private events: NetworkEvent[] = [];\n private maxEvents: number;\n private seq: number = 0;\n private page: Page | null = null;\n private requestHandler?: (req: Request) => void;\n private responseHandler?: (res: Response) => void;\n private showFullUrls: boolean;\n private listeners = new Set<(event: NetworkEvent) => void>();\n\n constructor(maxEvents = 300, options: NetworkTrackerOptions = {}) {\n this.maxEvents = maxEvents;\n this.showFullUrls = options.showFullUrls ?? false;\n }\n\n setOptions(options: NetworkTrackerOptions): void {\n if (typeof options.showFullUrls === \"boolean\") {\n this.showFullUrls = options.showFullUrls;\n }\n }\n\n attach(page: Page): void {\n if (this.page === page) return;\n this.detach();\n\n this.page = page;\n this.requestHandler = (req) => {\n this.push({\n method: req.method(),\n url: this.showFullUrls ? req.url() : redactUrl(req.url()),\n resourceType: req.resourceType(),\n ts: Date.now()\n });\n };\n\n this.responseHandler = (res) => {\n const req = res.request();\n this.push({\n method: req.method(),\n url: this.showFullUrls ? res.url() : redactUrl(res.url()),\n status: res.status(),\n resourceType: req.resourceType(),\n ts: Date.now()\n });\n };\n\n page.on(\"request\", this.requestHandler);\n page.on(\"response\", this.responseHandler);\n }\n\n detach(): void {\n if (this.page && this.requestHandler) {\n this.page.off(\"request\", this.requestHandler);\n }\n if (this.page && this.responseHandler) {\n this.page.off(\"response\", this.responseHandler);\n }\n this.page = null;\n this.requestHandler = undefined;\n this.responseHandler = undefined;\n }\n\n poll(sinceSeq = 0, max = 50): { events: NetworkEvent[]; nextSeq: number; truncated?: boolean } {\n const pending = this.events.filter((event) => event.seq > sinceSeq);\n const events = pending.slice(0, max);\n const last = events[events.length - 1];\n const nextSeq = last ? last.seq : sinceSeq;\n return {\n events,\n nextSeq,\n truncated: pending.length > events.length\n };\n }\n\n subscribe(listener: (event: NetworkEvent) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n private push(event: Omit<NetworkEvent, \"seq\">): void {\n this.seq += 1;\n const nextEvent: NetworkEvent = {\n seq: this.seq,\n ...event\n };\n this.events.push(nextEvent);\n\n if (this.events.length > this.maxEvents) {\n this.events.shift();\n }\n\n for (const listener of this.listeners) {\n try {\n listener(nextEvent);\n } catch {\n // Listeners must not break network tracking.\n }\n }\n }\n}\n","import type { DomCapture } from \"./dom-capture\";\n\nexport const STYLE_ALLOWLIST = new Set([\n \"align-content\",\n \"align-items\",\n \"align-self\",\n \"background\",\n \"background-attachment\",\n \"background-clip\",\n \"background-color\",\n \"background-image\",\n \"background-origin\",\n \"background-position\",\n \"background-position-x\",\n \"background-position-y\",\n \"background-repeat\",\n \"background-size\",\n \"border\",\n \"border-bottom\",\n \"border-bottom-color\",\n \"border-bottom-left-radius\",\n \"border-bottom-right-radius\",\n \"border-bottom-style\",\n \"border-bottom-width\",\n \"border-color\",\n \"border-left\",\n \"border-left-color\",\n \"border-left-style\",\n \"border-left-width\",\n \"border-radius\",\n \"border-right\",\n \"border-right-color\",\n \"border-right-style\",\n \"border-right-width\",\n \"border-style\",\n \"border-top\",\n \"border-top-color\",\n \"border-top-left-radius\",\n \"border-top-right-radius\",\n \"border-top-style\",\n \"border-top-width\",\n \"border-width\",\n \"box-shadow\",\n \"box-sizing\",\n \"color\",\n \"column-gap\",\n \"contain\",\n \"direction\",\n \"display\",\n \"filter\",\n \"flex\",\n \"flex-direction\",\n \"flex-flow\",\n \"flex-wrap\",\n \"font\",\n \"font-family\",\n \"font-feature-settings\",\n \"font-kerning\",\n \"font-size\",\n \"font-size-adjust\",\n \"font-stretch\",\n \"font-style\",\n \"font-variant\",\n \"font-variant-caps\",\n \"font-variant-east-asian\",\n \"font-variant-ligatures\",\n \"font-variant-numeric\",\n \"font-variation-settings\",\n \"font-weight\",\n \"gap\",\n \"grid\",\n \"grid-auto-columns\",\n \"grid-auto-flow\",\n \"grid-auto-rows\",\n \"grid-template-areas\",\n \"grid-template-columns\",\n \"grid-template-rows\",\n \"height\",\n \"hyphens\",\n \"inset\",\n \"inset-block\",\n \"inset-inline\",\n \"isolation\",\n \"justify-content\",\n \"left\",\n \"letter-spacing\",\n \"line-height\",\n \"margin\",\n \"margin-bottom\",\n \"margin-left\",\n \"margin-right\",\n \"margin-top\",\n \"max-height\",\n \"max-width\",\n \"min-height\",\n \"min-width\",\n \"opacity\",\n \"outline\",\n \"outline-color\",\n \"outline-offset\",\n \"outline-style\",\n \"outline-width\",\n \"overflow\",\n \"overflow-wrap\",\n \"overflow-x\",\n \"overflow-y\",\n \"padding\",\n \"padding-bottom\",\n \"padding-left\",\n \"padding-right\",\n \"padding-top\",\n \"position\",\n \"right\",\n \"row-gap\",\n \"text-align\",\n \"text-align-last\",\n \"text-decoration\",\n \"text-decoration-color\",\n \"text-decoration-line\",\n \"text-decoration-style\",\n \"text-decoration-thickness\",\n \"text-indent\",\n \"text-rendering\",\n \"text-shadow\",\n \"text-transform\",\n \"top\",\n \"transform\",\n \"transform-origin\",\n \"visibility\",\n \"white-space\",\n \"width\",\n \"word-break\",\n \"word-spacing\",\n \"writing-mode\",\n \"z-index\"\n]);\n\nexport const SKIP_STYLE_VALUES = new Set([\n \"\",\n \"initial\",\n \"unset\",\n \"revert\",\n \"revert-layer\"\n]);\n\nexport function extractCss(capture: DomCapture): string {\n const shouldFilter = capture.inlineStyles !== false;\n const lines: string[] = [];\n lines.push(\".opendevbrowser-root {\");\n for (const [key, value] of Object.entries(capture.styles)) {\n const trimmed = value.trim();\n if (trimmed.length === 0) continue;\n if (shouldFilter) {\n if (!STYLE_ALLOWLIST.has(key)) continue;\n if (SKIP_STYLE_VALUES.has(trimmed)) continue;\n }\n lines.push(` ${key}: ${value};`);\n }\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n","import type { Page } from \"playwright-core\";\nimport { STYLE_ALLOWLIST, SKIP_STYLE_VALUES } from \"./css-extract\";\n\nexport type DomCapture = {\n html: string;\n styles: Record<string, string>;\n warnings: string[];\n inlineStyles: boolean;\n};\n\ntype CaptureOptions = {\n sanitize?: boolean;\n maxNodes?: number;\n inlineStyles?: boolean;\n};\n\nconst DEFAULT_MAX_NODES = 1000;\n\nexport async function captureDom(\n page: Page,\n selector: string,\n options: CaptureOptions = {}\n): Promise<DomCapture> {\n const shouldSanitize = options.sanitize !== false;\n const maxNodes = options.maxNodes ?? DEFAULT_MAX_NODES;\n const inlineStyles = options.inlineStyles !== false;\n const styleAllowlist = Array.from(STYLE_ALLOWLIST);\n const skipStyleValues = Array.from(SKIP_STYLE_VALUES);\n\n return page.$eval(\n selector,\n (el, opts) => {\n const style = window.getComputedStyle(el as Element);\n const styles: Record<string, string> = {};\n for (const prop of Array.from(style)) {\n styles[prop] = style.getPropertyValue(prop);\n }\n\n const warnings: string[] = [];\n const root = el as Element;\n const clone = root.cloneNode(true) as Element;\n const originalElements = [root, ...Array.from(root.querySelectorAll(\"*\"))];\n const cloneElements = [clone, ...Array.from(clone.querySelectorAll(\"*\"))];\n const nodeLimit = Math.max(1, opts.maxNodes);\n\n if (originalElements.length > nodeLimit) {\n const omitted = originalElements.length - nodeLimit;\n warnings.push(`Export truncated at ${nodeLimit} nodes; ${omitted} nodes omitted.`);\n }\n\n const limit = Math.min(originalElements.length, nodeLimit);\n if (opts.inlineStyles) {\n const skipSet = new Set(opts.skipStyleValues);\n for (let index = 0; index < limit; index += 1) {\n const source = originalElements[index];\n const target = cloneElements[index];\n if (!source || !target) continue;\n const computed = window.getComputedStyle(source);\n const parts: string[] = [];\n for (const prop of opts.styleAllowlist) {\n const value = computed.getPropertyValue(prop).trim();\n if (value && !skipSet.has(value)) {\n parts.push(`${prop}: ${value};`);\n }\n }\n if (parts.length > 0) {\n target.setAttribute(\"style\", parts.join(\" \"));\n }\n }\n }\n\n if (originalElements.length > nodeLimit) {\n for (let index = nodeLimit; index < cloneElements.length; index += 1) {\n const target = cloneElements[index];\n if (target) {\n target.remove();\n }\n }\n }\n\n const container = document.createElement(\"template\");\n container.content.appendChild(clone);\n\n if (opts.shouldSanitize) {\n const blockedTags = new Set([\n \"script\",\n \"iframe\",\n \"object\",\n \"embed\",\n \"frame\",\n \"frameset\",\n \"applet\",\n \"base\",\n \"link\",\n \"meta\",\n \"noscript\"\n ]);\n const urlAttrs = new Set([\"href\", \"src\", \"action\", \"formaction\", \"xlink:href\", \"srcset\"]);\n\n const isDangerousUrl = (value: string) => {\n const normalized = value.trim().toLowerCase();\n return normalized.startsWith(\"javascript:\")\n || normalized.startsWith(\"data:\")\n || normalized.startsWith(\"vbscript:\");\n };\n\n const isDangerousSrcset = (value: string) => {\n const entries = value.split(\",\");\n return entries.some((entry) => {\n const url = entry.trim().split(/\\s+/)[0] || \"\";\n return isDangerousUrl(url);\n });\n };\n\n const DANGEROUS_CSS_PATTERNS = [\n /url\\s*\\(/i,\n /expression\\s*\\(/i,\n /-moz-binding/i,\n /behavior\\s*:/i,\n /javascript\\s*:/i\n ];\n\n const sanitizeStyle = (styleValue: string): { sanitized: string; wasModified: boolean } => {\n let result = styleValue;\n let wasModified = false;\n for (const pattern of DANGEROUS_CSS_PATTERNS) {\n if (pattern.test(result)) {\n result = result.replace(new RegExp(pattern.source, \"gi\"), \"/* blocked */\");\n wasModified = true;\n }\n }\n return { sanitized: result, wasModified };\n };\n\n const sanitizeSvg = (svg: Element) => {\n const scripts = svg.querySelectorAll(\"script\");\n scripts.forEach(script => {\n script.remove();\n warnings.push(\"Removed script element from SVG\");\n });\n\n const foreignObjects = svg.querySelectorAll(\"foreignObject\");\n foreignObjects.forEach(fo => {\n fo.remove();\n warnings.push(\"Removed foreignObject from SVG\");\n });\n\n const allElements = svg.querySelectorAll(\"*\");\n allElements.forEach(el => {\n for (const attr of Array.from(el.attributes)) {\n if (attr.name.toLowerCase().startsWith(\"on\")) {\n el.removeAttribute(attr.name);\n }\n }\n });\n };\n\n const sanitizeElement = (element: Element) => {\n const tag = element.tagName.toLowerCase();\n if (blockedTags.has(tag)) {\n element.remove();\n return;\n }\n\n if (tag === \"svg\") {\n sanitizeSvg(element);\n }\n\n for (const attr of Array.from(element.attributes)) {\n const name = attr.name.toLowerCase();\n if (name.startsWith(\"on\")) {\n element.removeAttribute(attr.name);\n continue;\n }\n if (name === \"style\") {\n const { sanitized, wasModified } = sanitizeStyle(attr.value);\n if (wasModified) {\n element.setAttribute(\"style\", sanitized);\n warnings.push(\"Sanitized dangerous CSS in style attribute\");\n }\n continue;\n }\n if (urlAttrs.has(name)) {\n const value = attr.value || \"\";\n const dangerous = name === \"srcset\"\n ? isDangerousSrcset(value)\n : isDangerousUrl(value);\n if (dangerous) {\n element.removeAttribute(attr.name);\n }\n }\n }\n };\n\n for (const element of Array.from(container.content.querySelectorAll(\"*\"))) {\n sanitizeElement(element);\n }\n if (container.content.firstElementChild) {\n sanitizeElement(container.content.firstElementChild);\n }\n }\n\n return { html: container.innerHTML, styles, warnings, inlineStyles: opts.inlineStyles };\n },\n { shouldSanitize, maxNodes, inlineStyles, styleAllowlist, skipStyleValues }\n );\n}\n","import type { DomCapture } from \"./dom-capture\";\n\nexport type ReactExport = {\n component: string;\n css: string;\n warnings?: string[];\n};\n\nexport type ReactEmitterOptions = {\n allowUnsafeExport?: boolean;\n};\n\nexport function emitReactComponent(capture: DomCapture, css: string, options: ReactEmitterOptions = {}): ReactExport {\n const warnings = [...(capture.warnings ?? [])];\n if (options.allowUnsafeExport) {\n warnings.push(\"Unsafe export enabled: HTML sanitization disabled.\");\n }\n\n const warningComment = options.allowUnsafeExport\n ? \"// WARNING: Unsafe export enabled. HTML sanitization disabled.\\n\"\n : \"\";\n\n const component = `${warningComment}import \"./opendevbrowser.css\";\n\nexport default function OpenDevBrowserComponent() {\n return (\n <div className=\"opendevbrowser-root\" dangerouslySetInnerHTML={{ __html: ${JSON.stringify(capture.html)} }} />\n );\n}`;\n\n return { component, css, warnings: warnings.length > 0 ? warnings : undefined };\n}\n","import { randomUUID } from \"crypto\";\n\nexport type RefEntry = {\n ref: string;\n selector: string;\n backendNodeId: number;\n frameId?: string;\n role?: string;\n name?: string;\n};\n\nexport type RefSnapshot = {\n snapshotId: string;\n targetId: string;\n count: number;\n};\n\nexport class RefStore {\n private refsByTarget = new Map<string, Map<string, RefEntry>>();\n private snapshotByTarget = new Map<string, string>();\n\n setSnapshot(targetId: string, entries: RefEntry[]): RefSnapshot {\n const map = new Map<string, RefEntry>();\n for (const entry of entries) {\n map.set(entry.ref, entry);\n }\n\n const snapshotId = randomUUID();\n this.refsByTarget.set(targetId, map);\n this.snapshotByTarget.set(targetId, snapshotId);\n\n return { snapshotId, targetId, count: entries.length };\n }\n\n resolve(targetId: string, ref: string): RefEntry | null {\n const map = this.refsByTarget.get(targetId);\n if (!map) return null;\n return map.get(ref) ?? null;\n }\n\n getSnapshotId(targetId: string): string | null {\n return this.snapshotByTarget.get(targetId) ?? null;\n }\n\n getRefCount(targetId: string): number {\n const map = this.refsByTarget.get(targetId);\n return map ? map.size : 0;\n }\n\n clearTarget(targetId: string): void {\n this.refsByTarget.delete(targetId);\n this.snapshotByTarget.delete(targetId);\n }\n}\n","export type SnapshotMode = \"outline\" | \"actionables\";\n\nexport type SnapshotEntry = {\n ref: string;\n selector: string;\n backendNodeId: number;\n frameId?: string;\n role?: string;\n name?: string;\n};\n\ntype AxValue = {\n type?: string;\n value?: unknown;\n};\n\ntype AxProperty = {\n name: string;\n value?: AxValue;\n};\n\ntype AxNode = {\n nodeId: string;\n ignored?: boolean;\n role?: AxValue;\n chromeRole?: AxValue;\n name?: AxValue;\n value?: AxValue;\n properties?: AxProperty[];\n backendDOMNodeId?: number;\n frameId?: string;\n};\n\nconst DEFAULT_MAX_AX_NODES = 1000;\nconst ACTIONABLE_ROLES = new Set([\n \"button\",\n \"link\",\n \"textbox\",\n \"searchbox\",\n \"textarea\",\n \"checkbox\",\n \"radio\",\n \"combobox\",\n \"listbox\",\n \"menuitem\",\n \"menuitemcheckbox\",\n \"menuitemradio\",\n \"option\",\n \"switch\",\n \"tab\",\n \"slider\",\n \"spinbutton\",\n \"treeitem\"\n]);\nconst SEMANTIC_ROLES = new Set([\n \"heading\",\n \"article\",\n \"main\",\n \"navigation\",\n \"region\",\n \"section\",\n \"form\",\n \"list\",\n \"listitem\",\n \"paragraph\",\n \"img\",\n \"table\",\n \"row\",\n \"cell\",\n \"columnheader\",\n \"rowheader\",\n \"banner\",\n \"contentinfo\",\n \"complementary\"\n]);\n\nexport const selectorFunction = function(this: Element): string | null {\n if (!(this instanceof Element)) return null;\n const escape = (value: string): string => {\n if (typeof CSS !== \"undefined\" && CSS.escape) {\n return CSS.escape(value);\n }\n return String(value).replace(/([^\\w-])/g, \"\\\\$1\");\n };\n const isUniqueSelector = (selector: string): boolean => {\n try {\n return document.querySelectorAll(selector).length === 1;\n } catch {\n return false;\n }\n };\n const testId = this.getAttribute(\"data-testid\");\n if (testId) {\n const selector = '[data-testid=\"' + escape(testId) + '\"]';\n if (isUniqueSelector(selector)) {\n return selector;\n }\n }\n const ariaLabel = this.getAttribute(\"aria-label\");\n if (ariaLabel && ariaLabel.length < 50) {\n const selector = '[aria-label=\"' + escape(ariaLabel) + '\"]';\n if (isUniqueSelector(selector)) {\n return selector;\n }\n }\n const buildPathSelector = (start: Element): string => {\n const parts: string[] = [];\n let current: Element | null = start;\n while (current && current.nodeType === Node.ELEMENT_NODE) {\n let selector = current.nodeName.toLowerCase();\n if (current.id) {\n const withId = selector + \"#\" + escape(current.id);\n if (isUniqueSelector(withId)) {\n parts.unshift(withId);\n break;\n }\n }\n const parentEl: Element | null = current.parentElement;\n if (!parentEl) {\n parts.unshift(selector);\n break;\n }\n let index = 1;\n let sibling: Element | null = current;\n while (sibling && sibling.previousElementSibling) {\n sibling = sibling.previousElementSibling;\n index += 1;\n }\n selector += \":nth-child(\" + index + \")\";\n parts.unshift(selector);\n current = parentEl;\n }\n return parts.join(\" > \");\n };\n return buildPathSelector(this);\n};\nconst SELECTOR_FUNCTION = selectorFunction.toString();\n\nexport async function buildSnapshotFromCdp(\n send: (method: string, params: object) => Promise<unknown>,\n mode: SnapshotMode,\n mainFrameOnly: boolean = true,\n maxNodes?: number\n): Promise<{ entries: SnapshotEntry[]; lines: string[]; warnings: string[] }> {\n await send(\"Accessibility.enable\", {});\n await send(\"DOM.enable\", {});\n const result = await send(\"Accessibility.getFullAXTree\", {}) as { nodes?: AxNode[] };\n const nodes = Array.isArray(result.nodes) ? result.nodes : [];\n const entries: SnapshotEntry[] = [];\n const lines: string[] = [];\n const warnings: string[] = [];\n const maxEntries = typeof maxNodes === \"number\" ? maxNodes : DEFAULT_MAX_AX_NODES;\n let skippedFrameCount = 0;\n\n for (const node of nodes) {\n if (entries.length >= maxEntries) break;\n if (node.ignored) continue;\n if (typeof node.backendDOMNodeId !== \"number\") continue;\n if (mainFrameOnly && node.frameId) {\n skippedFrameCount += 1;\n continue;\n }\n const role = extractValue(node.role) || extractValue(node.chromeRole);\n if (!role) continue;\n if (!shouldInclude(role, mode)) continue;\n\n const selector = await resolveSelector(send, node.backendDOMNodeId);\n if (!selector) continue;\n\n const ref = `r${entries.length + 1}`;\n const name = redactText(extractValue(node.name));\n const value = redactText(extractValue(node.value));\n const disabled = isTruthyProperty(node.properties, \"disabled\");\n const checked = isTruthyProperty(node.properties, \"checked\");\n\n entries.push({\n ref,\n selector,\n backendNodeId: node.backendDOMNodeId,\n frameId: node.frameId,\n role,\n name\n });\n\n lines.push(formatNode({\n ref,\n role,\n name,\n value,\n disabled,\n checked\n }));\n }\n\n if (mainFrameOnly && skippedFrameCount > 0) {\n warnings.push(`Skipped ${skippedFrameCount} iframe nodes; snapshot limited to main frame.`);\n }\n\n return { entries, lines, warnings };\n}\n\nasync function resolveSelector(\n send: (method: string, params: object) => Promise<unknown>,\n backendNodeId: number\n): Promise<string | null> {\n const resolved = await send(\"DOM.resolveNode\", { backendNodeId }) as { object?: { objectId?: string } };\n const objectId = resolved.object?.objectId;\n if (!objectId) return null;\n const result = await send(\"Runtime.callFunctionOn\", {\n objectId,\n functionDeclaration: SELECTOR_FUNCTION,\n returnByValue: true\n }) as { result?: { value?: unknown } };\n const selector = result.result?.value;\n if (typeof selector !== \"string\" || selector.trim().length === 0) {\n return null;\n }\n return selector;\n}\n\nfunction shouldInclude(role: string, mode: SnapshotMode): boolean {\n const normalized = role.toLowerCase();\n if (ACTIONABLE_ROLES.has(normalized)) return true;\n if (mode === \"actionables\") return false;\n return SEMANTIC_ROLES.has(normalized);\n}\n\nfunction formatNode(node: {\n ref: string;\n role: string;\n name?: string;\n value?: string;\n disabled?: boolean;\n checked?: boolean;\n}): string {\n const name = redactText(node.name || \"\");\n const value = redactText(node.value || \"\");\n const parts: string[] = [];\n parts.push(`[${node.ref}]`);\n parts.push(node.role);\n\n if (node.disabled) {\n parts.push(\"disabled\");\n }\n\n if (node.checked) {\n parts.push(\"checked\");\n }\n\n if (name) {\n parts.push(`\\\"${name}\\\"`);\n }\n\n if (value) {\n parts.push(`value=\\\"${value}\\\"`);\n }\n\n return parts.join(\" \");\n}\n\nfunction redactText(text?: string): string {\n const trimmed = (text ?? \"\").trim();\n if (!trimmed) return \"\";\n return trimmed.replace(/[A-Za-z0-9+/_-]{24,}/g, \"[redacted]\");\n}\n\nfunction extractValue(value?: AxValue): string {\n if (!value || typeof value.value === \"undefined\" || value.value === null) return \"\";\n if (typeof value.value === \"string\") return value.value;\n if (typeof value.value === \"number\" || typeof value.value === \"boolean\") {\n return String(value.value);\n }\n return \"\";\n}\n\nfunction isTruthyProperty(properties: AxProperty[] | undefined, name: string): boolean {\n if (!properties) return false;\n const found = properties.find((prop) => prop.name === name);\n if (!found || !found.value) return false;\n const value = found.value.value;\n if (typeof value === \"boolean\") return value;\n if (typeof value === \"string\") return value.toLowerCase() === \"true\";\n if (typeof value === \"number\") return value !== 0;\n return false;\n}\n","import type { Page } from \"playwright-core\";\nimport type { RefStore } from \"./refs\";\nimport { buildSnapshotFromCdp, selectorFunction, type SnapshotMode } from \"./ops-snapshot\";\n\nexport { selectorFunction };\n\nexport type SnapshotResult = {\n snapshotId: string;\n url?: string;\n title?: string;\n content: string;\n truncated: boolean;\n nextCursor?: string;\n refCount: number;\n timingMs: number;\n warnings?: string[];\n};\n\nexport class Snapshotter {\n private refStore: RefStore;\n\n constructor(refStore: RefStore) {\n this.refStore = refStore;\n }\n\n async snapshot(page: Page, targetId: string, options: {\n mode: SnapshotMode;\n maxChars: number;\n cursor?: string;\n mainFrameOnly?: boolean;\n maxNodes?: number;\n }): Promise<SnapshotResult> {\n const startTime = Date.now();\n const session = await page.context().newCDPSession(page);\n let snapshotData: {\n entries: Array<{ ref: string; selector: string; backendNodeId: number; frameId?: string; role?: string; name?: string }>;\n lines: string[];\n warnings: string[];\n };\n try {\n snapshotData = await buildSnapshotFromCdp(\n (method, params) => session.send(\n method as Parameters<typeof session.send>[0],\n params as Parameters<typeof session.send>[1]\n ),\n options.mode,\n options.mainFrameOnly ?? true,\n options.maxNodes\n );\n } finally {\n await session.detach();\n }\n\n const snapshot = this.refStore.setSnapshot(targetId, snapshotData.entries);\n const formatted = snapshotData.lines;\n\n const startIndex = parseCursor(options.cursor);\n const { content, truncated, nextCursor } = paginate(formatted, startIndex, options.maxChars);\n\n const timingMs = Date.now() - startTime;\n let url: string | undefined;\n let title: string | undefined;\n\n try {\n url = page.url();\n title = await page.title();\n } catch (_err) {\n // Page may be closed or navigating; safely ignore and return undefined\n void _err;\n url = undefined;\n title = undefined;\n }\n\n return {\n snapshotId: snapshot.snapshotId,\n url,\n title,\n content,\n truncated,\n nextCursor,\n refCount: snapshot.count,\n timingMs,\n warnings: snapshotData.warnings\n };\n }\n}\n\nfunction parseCursor(cursor?: string): number {\n if (!cursor) return 0;\n const value = Number(cursor);\n if (!Number.isFinite(value) || value < 0) return 0;\n return Math.floor(value);\n}\n\nfunction paginate(lines: string[], startIndex: number, maxChars: number): {\n content: string;\n truncated: boolean;\n nextCursor?: string;\n} {\n let total = 0;\n const parts: string[] = [];\n let idx = startIndex;\n\n while (idx < lines.length) {\n const line = lines[idx];\n /* v8 ignore next -- @preserve */\n if (line === undefined) {\n break;\n }\n if (total + line.length + 1 > maxChars && parts.length > 0) {\n break;\n }\n parts.push(line);\n total += line.length + 1;\n idx += 1;\n }\n\n const truncated = idx < lines.length;\n const nextCursor = truncated ? String(idx) : undefined;\n return {\n content: parts.join(\"\\n\"),\n truncated,\n nextCursor\n };\n}\n","export function ensureLocalEndpoint(endpoint: string, allowNonLocal: boolean): void {\n if (allowNonLocal) return;\n\n const allowedProtocols = new Set([\"ws:\", \"wss:\", \"http:\", \"https:\"]);\n const localHostnames = new Set([\"localhost\", \"127.0.0.1\", \"::1\", \"[::1]\"]);\n\n let parsed: URL;\n try {\n parsed = new URL(endpoint);\n } catch {\n throw new Error(\"Invalid CDP endpoint URL.\");\n }\n\n if (!allowedProtocols.has(parsed.protocol)) {\n throw new Error(`Disallowed protocol \"${parsed.protocol}\" for CDP endpoint. Allowed: ws, wss, http, https.`);\n }\n\n const hostname = parsed.hostname.toLowerCase();\n if (!localHostnames.has(hostname) && !hostname.startsWith(\"::ffff:127.\")) {\n throw new Error(\"Non-local CDP endpoints are disabled by default.\");\n }\n}\n","import type { OpenDevBrowserConfig } from \"../config\";\nimport { ensureLocalEndpoint } from \"../utils/endpoint-validation\";\n\nexport type RelayEndpointResult = {\n connectEndpoint: string;\n reportedEndpoint: string;\n relayPort: number;\n pairingRequired: boolean;\n instanceId?: string;\n epoch?: number;\n};\n\nexport async function resolveRelayEndpoint(options: {\n wsEndpoint: string;\n path: string;\n config: OpenDevBrowserConfig;\n}): Promise<RelayEndpointResult> {\n const baseUrl = new URL(options.wsEndpoint);\n baseUrl.search = \"\";\n baseUrl.hash = \"\";\n\n const httpProtocol = baseUrl.protocol === \"wss:\" ? \"https:\" : \"http:\";\n const configBase = new URL(`${httpProtocol}//${baseUrl.hostname}:${baseUrl.port}`);\n const configUrl = new URL(\"/config\", configBase);\n ensureLocalEndpoint(configUrl.toString(), options.config.security.allowNonLocalCdp);\n\n const relayToken = typeof options.config.relayToken === \"string\" ? options.config.relayToken.trim() : \"\";\n const headers: Record<string, string> = { Accept: \"application/json\" };\n if (relayToken) {\n headers.Authorization = `Bearer ${relayToken}`;\n }\n\n const configResponse = await fetch(configUrl.toString(), { headers });\n if (!configResponse.ok) {\n throw new Error(\"Failed to fetch relay config. Ensure the relay is running and reachable.\");\n }\n const config = await configResponse.json() as {\n relayPort?: number;\n pairingRequired?: boolean;\n instanceId?: string;\n epoch?: number;\n };\n const relayPort = typeof config.relayPort === \"number\" ? config.relayPort : null;\n if (!relayPort || relayPort <= 0 || relayPort > 65535) {\n throw new Error(\"Relay config missing relayPort. Ensure the relay is running.\");\n }\n\n const relayWsBase = new URL(`${baseUrl.protocol}//${baseUrl.hostname}:${relayPort}/${options.path}`);\n const reportedEndpoint = sanitizeWsEndpoint(relayWsBase.toString());\n const pairingRequired = Boolean(config.pairingRequired);\n if (!pairingRequired) {\n return {\n connectEndpoint: relayWsBase.toString(),\n reportedEndpoint,\n relayPort,\n pairingRequired,\n instanceId: config.instanceId,\n epoch: config.epoch\n };\n }\n\n const pairBase = new URL(`${httpProtocol}//${baseUrl.hostname}:${relayPort}`);\n const pairUrl = new URL(\"/pair\", pairBase);\n ensureLocalEndpoint(pairUrl.toString(), options.config.security.allowNonLocalCdp);\n\n const pairResponse = await fetch(pairUrl.toString(), { headers });\n if (!pairResponse.ok) {\n throw new Error(\"Failed to fetch relay pairing token. Ensure the relay is running.\");\n }\n const pairData = await pairResponse.json() as { token?: string; instanceId?: string; epoch?: number };\n if (config.instanceId && typeof pairData.instanceId === \"string\" && pairData.instanceId !== config.instanceId) {\n throw new Error(\"Relay pairing mismatch detected. Restart the plugin and retry.\");\n }\n if (!pairData.token || typeof pairData.token !== \"string\") {\n throw new Error(\"Relay pairing token missing from /pair response.\");\n }\n\n const connectUrl = new URL(relayWsBase.toString());\n connectUrl.searchParams.set(\"token\", pairData.token);\n return {\n connectEndpoint: connectUrl.toString(),\n reportedEndpoint,\n relayPort,\n pairingRequired,\n instanceId: config.instanceId,\n epoch: config.epoch\n };\n}\n\nexport function sanitizeWsEndpoint(wsEndpoint: string): string {\n try {\n const url = new URL(wsEndpoint);\n url.searchParams.delete(\"token\");\n url.searchParams.delete(\"pairingToken\");\n url.hash = \"\";\n return url.toString();\n } catch {\n return wsEndpoint;\n }\n}\n","export type Tier1GeoPoint = {\n latitude: number;\n longitude: number;\n accuracy?: number;\n};\n\nexport type Tier1CoherenceConfig = {\n enabled: boolean;\n warnOnly: boolean;\n expectedLocale?: string;\n expectedTimezone?: string;\n expectedLanguages: string[];\n requireProxy: boolean;\n geolocationRequired: boolean;\n};\n\nexport type Tier1CoherenceInput = {\n locale?: string;\n timezone?: string;\n languages: string[];\n proxy?: string;\n geolocation?: Tier1GeoPoint;\n};\n\nexport type Tier1Issue = {\n code: string;\n field: string;\n message: string;\n expected?: string;\n actual?: string;\n};\n\nexport type Tier1CoherenceResult = {\n ok: boolean;\n warnings: string[];\n issues: Tier1Issue[];\n};\n\nconst TIMEZONE_REGION_MAP: Record<string, string> = {\n America: \"US\",\n Europe: \"EU\",\n Asia: \"AS\",\n Africa: \"AF\",\n Australia: \"OC\",\n Pacific: \"OC\"\n};\n\nfunction normalizeLocale(value: string | undefined): string | undefined {\n return value?.trim().replace(\"_\", \"-\").toLowerCase();\n}\n\nfunction normalizeTimezone(value: string | undefined): string | undefined {\n return value?.trim();\n}\n\nfunction localeRegion(locale: string | undefined): string | undefined {\n if (!locale) return undefined;\n const parts = locale.split(\"-\");\n const region = parts[1];\n return region ? region.toUpperCase() : undefined;\n}\n\nfunction timezoneRegion(timezone: string | undefined): string | undefined {\n if (!timezone) return undefined;\n const top = timezone.split(\"/\")[0];\n if (!top) return undefined;\n return TIMEZONE_REGION_MAP[top];\n}\n\nfunction isLocaleTimezoneCompatible(locale: string | undefined, timezone: string | undefined): boolean {\n const region = localeRegion(locale);\n const tzRegion = timezoneRegion(timezone);\n if (!region || !tzRegion) return true;\n if (region === \"US\" && tzRegion === \"US\") return true;\n if (region === \"CA\" && tzRegion === \"US\") return true;\n if (region === \"GB\" && tzRegion === \"EU\") return true;\n if (region === \"FR\" && tzRegion === \"EU\") return true;\n if (region === \"DE\" && tzRegion === \"EU\") return true;\n if (region === \"JP\" && tzRegion === \"AS\") return true;\n if (region === \"CN\" && tzRegion === \"AS\") return true;\n if (region === \"IN\" && tzRegion === \"AS\") return true;\n if (region === \"AU\" && tzRegion === \"OC\") return true;\n return false;\n}\n\nexport function evaluateTier1Coherence(\n config: Tier1CoherenceConfig,\n input: Tier1CoherenceInput\n): Tier1CoherenceResult {\n if (!config.enabled) {\n return { ok: true, warnings: [], issues: [] };\n }\n\n const issues: Tier1Issue[] = [];\n const locale = normalizeLocale(input.locale);\n const expectedLocale = normalizeLocale(config.expectedLocale);\n if (expectedLocale && locale && expectedLocale !== locale) {\n issues.push({\n code: \"locale_mismatch\",\n field: \"locale\",\n expected: expectedLocale,\n actual: locale,\n message: `Locale mismatch: expected ${expectedLocale}, got ${locale}.`\n });\n }\n\n const timezone = normalizeTimezone(input.timezone);\n const expectedTimezone = normalizeTimezone(config.expectedTimezone);\n if (expectedTimezone && timezone && expectedTimezone !== timezone) {\n issues.push({\n code: \"timezone_mismatch\",\n field: \"timezone\",\n expected: expectedTimezone,\n actual: timezone,\n message: `Timezone mismatch: expected ${expectedTimezone}, got ${timezone}.`\n });\n }\n\n const expectedLanguage = config.expectedLanguages[0]?.toLowerCase();\n const actualLanguage = input.languages[0]?.toLowerCase();\n if (expectedLanguage && actualLanguage && expectedLanguage !== actualLanguage) {\n issues.push({\n code: \"language_mismatch\",\n field: \"languages\",\n expected: expectedLanguage,\n actual: actualLanguage,\n message: `Language mismatch: expected ${expectedLanguage}, got ${actualLanguage}.`\n });\n }\n\n const localeLanguage = locale?.split(\"-\")[0];\n if (localeLanguage && actualLanguage && !actualLanguage.startsWith(localeLanguage)) {\n issues.push({\n code: \"locale_language_incoherent\",\n field: \"languages\",\n expected: localeLanguage,\n actual: actualLanguage,\n message: `Locale/language mismatch: locale ${locale} conflicts with language ${actualLanguage}.`\n });\n }\n\n if (!isLocaleTimezoneCompatible(locale, timezone)) {\n issues.push({\n code: \"locale_timezone_incoherent\",\n field: \"timezone\",\n expected: localeRegion(locale),\n actual: timezoneRegion(timezone),\n message: `Locale/timezone mismatch: locale ${locale ?? \"unknown\"} conflicts with timezone ${timezone ?? \"unknown\"}.`\n });\n }\n\n if (config.requireProxy && !input.proxy) {\n issues.push({\n code: \"proxy_missing\",\n field: \"proxy\",\n message: \"Proxy is required for this profile but missing.\"\n });\n }\n\n if (config.geolocationRequired && !input.geolocation) {\n issues.push({\n code: \"geolocation_missing\",\n field: \"geolocation\",\n message: \"Geolocation is required for this profile but missing.\"\n });\n }\n\n return {\n ok: issues.length === 0,\n warnings: issues.map((issue) => issue.message),\n issues\n };\n}\n\nexport function formatTier1Warnings(result: Tier1CoherenceResult): string[] {\n if (result.ok) return [];\n return result.warnings.map((message) => `[fingerprint:tier1] ${message}`);\n}\n","export type FingerprintProfile = {\n id: string;\n seed: string;\n index: number;\n userAgentBrand: string;\n webglVendor: string;\n webglRenderer: string;\n createdAt: number;\n healthScore: number;\n challengeCount: number;\n rotationCount: number;\n};\n\nconst USER_AGENT_BRANDS = [\n \"Chrome/122.0.0.0\",\n \"Chrome/123.0.0.0\",\n \"Chrome/124.0.0.0\"\n];\n\nconst WEBGL_VENDORS = [\n \"Google Inc.\",\n \"Intel Inc.\",\n \"NVIDIA Corporation\"\n];\n\nconst WEBGL_RENDERERS = [\n \"ANGLE (Intel, Intel(R) Iris OpenGL Engine, OpenGL 4.1)\",\n \"ANGLE (NVIDIA, NVIDIA GeForce RTX 3060, OpenGL 4.6)\",\n \"ANGLE (Apple, Apple M2, OpenGL 4.1)\"\n];\n\nfunction stableHash(input: string): number {\n let hash = 2166136261;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 16777619);\n }\n return hash >>> 0;\n}\n\nfunction pickBySeed(values: string[], seed: string): string {\n const index = stableHash(seed) % values.length;\n return values[index] ?? values[0]!;\n}\n\nexport function profileSeedFrom(sessionId: string, profileName?: string): string {\n return `${profileName ?? \"default\"}:${sessionId}`;\n}\n\nexport function createFingerprintProfile(seed: string, index = 0, now = Date.now()): FingerprintProfile {\n const profileSeed = `${seed}:${index}`;\n return {\n id: `fp-${stableHash(profileSeed).toString(16).padStart(8, \"0\")}`,\n seed,\n index,\n userAgentBrand: pickBySeed(USER_AGENT_BRANDS, `${profileSeed}:ua`),\n webglVendor: pickBySeed(WEBGL_VENDORS, `${profileSeed}:vendor`),\n webglRenderer: pickBySeed(WEBGL_RENDERERS, `${profileSeed}:renderer`),\n createdAt: now,\n healthScore: 100,\n challengeCount: 0,\n rotationCount: 0\n };\n}\n\nexport function rotateFingerprintProfile(\n current: FingerprintProfile,\n now = Date.now()\n): FingerprintProfile {\n const next = createFingerprintProfile(current.seed, current.index + 1, now);\n return {\n ...next,\n challengeCount: current.challengeCount,\n rotationCount: current.rotationCount + 1,\n healthScore: Math.max(40, current.healthScore)\n };\n}\n","import {\n createFingerprintProfile,\n profileSeedFrom,\n rotateFingerprintProfile,\n type FingerprintProfile\n} from \"./profiles\";\n\nexport type Tier2Mode = \"off\" | \"deterministic\" | \"adaptive\";\n\nexport type Tier2RuntimeConfig = {\n enabled: boolean;\n mode: Tier2Mode;\n rotationIntervalMs: number;\n challengePatterns: string[];\n maxChallengeEvents: number;\n scorePenalty: number;\n scoreRecovery: number;\n rotationHealthThreshold: number;\n};\n\nexport type Tier2ChallengeEvent = {\n ts: number;\n type: \"url-pattern\" | \"status\";\n pattern: string;\n url: string;\n status?: number;\n};\n\nexport type Tier2RuntimeState = {\n enabled: boolean;\n mode: Tier2Mode;\n profile: FingerprintProfile;\n lastRotationTs: number;\n challengeEvents: Tier2ChallengeEvent[];\n};\n\nexport type Tier2NetworkSignal = {\n url: string;\n status?: number;\n ts?: number;\n};\n\nfunction applyProfileScore(profile: FingerprintProfile, delta: number): FingerprintProfile {\n const score = Math.max(0, Math.min(100, profile.healthScore + delta));\n return {\n ...profile,\n healthScore: score\n };\n}\n\nfunction withChallenge(profile: FingerprintProfile): FingerprintProfile {\n return {\n ...profile,\n challengeCount: profile.challengeCount + 1\n };\n}\n\nfunction compilePatterns(patterns: string[]): RegExp[] {\n const compiled: RegExp[] = [];\n for (const pattern of patterns) {\n try {\n compiled.push(new RegExp(pattern, \"i\"));\n } catch {\n // Ignore invalid custom patterns.\n }\n }\n return compiled;\n}\n\nexport function detectTier2Challenge(\n signal: Tier2NetworkSignal,\n challengePatterns: string[]\n): Tier2ChallengeEvent | null {\n const timestamp = signal.ts ?? Date.now();\n if (signal.status === 403 || signal.status === 429 || signal.status === 503) {\n return {\n ts: timestamp,\n type: \"status\",\n pattern: `status:${signal.status}`,\n url: signal.url,\n status: signal.status\n };\n }\n\n const compiled = compilePatterns(challengePatterns);\n const matched = compiled.find((pattern) => pattern.test(signal.url));\n if (!matched) {\n return null;\n }\n return {\n ts: timestamp,\n type: \"url-pattern\",\n pattern: matched.source,\n url: signal.url,\n status: signal.status\n };\n}\n\nexport function createTier2RuntimeState(\n config: Tier2RuntimeConfig,\n sessionId: string,\n profileName?: string,\n now = Date.now()\n): Tier2RuntimeState {\n const seed = profileSeedFrom(sessionId, profileName);\n return {\n enabled: config.enabled,\n mode: config.mode,\n profile: createFingerprintProfile(seed, 0, now),\n lastRotationTs: now,\n challengeEvents: []\n };\n}\n\nfunction maybeRotateByInterval(\n state: Tier2RuntimeState,\n config: Tier2RuntimeConfig,\n now: number\n): { state: Tier2RuntimeState; rotated: boolean; reason?: string } {\n if (!config.enabled || config.mode === \"off\") {\n return { state, rotated: false };\n }\n if (config.rotationIntervalMs <= 0) {\n return { state, rotated: false };\n }\n if (now - state.lastRotationTs < config.rotationIntervalMs) {\n return { state, rotated: false };\n }\n return {\n state: {\n ...state,\n profile: rotateFingerprintProfile(state.profile, now),\n lastRotationTs: now\n },\n rotated: true,\n reason: \"interval\"\n };\n}\n\nexport function applyTier2NetworkEvent(\n state: Tier2RuntimeState,\n config: Tier2RuntimeConfig,\n signal: Tier2NetworkSignal,\n now = Date.now()\n): {\n state: Tier2RuntimeState;\n challenge: Tier2ChallengeEvent | null;\n rotated: boolean;\n reason?: string;\n} {\n let nextState = { ...state };\n\n const intervalRotation = maybeRotateByInterval(nextState, config, now);\n nextState = intervalRotation.state;\n let rotated = intervalRotation.rotated;\n let reason = intervalRotation.reason;\n\n if (!config.enabled || config.mode === \"off\") {\n return { state: nextState, challenge: null, rotated, reason };\n }\n\n const challenge = detectTier2Challenge(signal, config.challengePatterns);\n if (!challenge) {\n if (config.scoreRecovery > 0) {\n nextState = {\n ...nextState,\n profile: applyProfileScore(nextState.profile, config.scoreRecovery)\n };\n }\n return { state: nextState, challenge: null, rotated, reason };\n }\n\n const challengeEvents = [...nextState.challengeEvents, challenge].slice(-Math.max(1, config.maxChallengeEvents));\n let profile = withChallenge(nextState.profile);\n profile = applyProfileScore(profile, -Math.abs(config.scorePenalty));\n\n nextState = {\n ...nextState,\n challengeEvents,\n profile\n };\n\n const shouldRotateForChallenge = config.mode === \"adaptive\"\n && profile.healthScore <= config.rotationHealthThreshold;\n if (shouldRotateForChallenge) {\n nextState = {\n ...nextState,\n profile: rotateFingerprintProfile(profile, now),\n lastRotationTs: now\n };\n rotated = true;\n reason = \"challenge\";\n }\n\n return { state: nextState, challenge, rotated, reason };\n}\n","export type Tier3EvaluationInput = {\n hasChallenge: boolean;\n healthScore: number;\n challengeCount: number;\n rotationCount: number;\n metadata?: Record<string, unknown>;\n};\n\nexport type Tier3AdapterDecision = {\n score: number;\n reason: string;\n forceRollback?: boolean;\n};\n\nexport type Tier3AdapterCallbacks = {\n onPromote?: (level: number) => void;\n onRollback?: (level: number, reason: string) => void;\n};\n\nexport interface Tier3Adapter extends Tier3AdapterCallbacks {\n name: string;\n evaluate: (input: Tier3EvaluationInput) => Tier3AdapterDecision;\n}\n\nexport class DeterministicTier3Adapter implements Tier3Adapter {\n name = \"deterministic\";\n\n evaluate(input: Tier3EvaluationInput): Tier3AdapterDecision {\n let score = input.healthScore;\n if (input.hasChallenge) {\n score -= 25;\n }\n if (input.challengeCount > 4) {\n score -= 10;\n }\n if (input.rotationCount > 2) {\n score -= 5;\n }\n const boundedScore = Math.max(0, Math.min(100, score));\n if (boundedScore <= 20) {\n return {\n score: boundedScore,\n reason: \"health score critically low\",\n forceRollback: true\n };\n }\n return {\n score: boundedScore,\n reason: input.hasChallenge ? \"challenge detected\" : \"stable\"\n };\n }\n}\n\nexport function resolveTier3Adapter(adapter?: Tier3Adapter | null): Tier3Adapter {\n return adapter ?? new DeterministicTier3Adapter();\n}\n","export type Tier3CanaryPolicy = {\n windowSize: number;\n minSamples: number;\n promoteThreshold: number;\n rollbackThreshold: number;\n};\n\nexport type Tier3CanarySample = {\n ts: number;\n score: number;\n success: boolean;\n reason: string;\n};\n\nexport type Tier3CanaryAction = \"none\" | \"promote\" | \"rollback\";\n\nexport type Tier3CanaryState = {\n samples: Tier3CanarySample[];\n level: number;\n averageScore: number;\n lastAction: Tier3CanaryAction;\n};\n\nexport function createCanaryState(initialLevel = 0): Tier3CanaryState {\n return {\n samples: [],\n level: initialLevel,\n averageScore: 100,\n lastAction: \"none\"\n };\n}\n\nfunction average(values: number[]): number {\n if (values.length === 0) return 100;\n return values.reduce((sum, value) => sum + value, 0) / values.length;\n}\n\nexport function pushCanarySample(\n state: Tier3CanaryState,\n policy: Tier3CanaryPolicy,\n sample: Tier3CanarySample\n): { state: Tier3CanaryState; action: Tier3CanaryAction } {\n const windowSize = Math.max(1, policy.windowSize);\n const samples = [...state.samples, sample].slice(-windowSize);\n const averageScore = average(samples.map((entry) => Math.max(0, Math.min(100, entry.score))));\n const minSamples = Math.max(1, policy.minSamples);\n\n let action: Tier3CanaryAction = \"none\";\n let level = state.level;\n if (samples.length >= minSamples) {\n if (averageScore >= policy.promoteThreshold) {\n level += 1;\n action = \"promote\";\n } else if (averageScore <= policy.rollbackThreshold) {\n level = Math.max(0, level - 1);\n action = \"rollback\";\n }\n }\n\n return {\n action,\n state: {\n samples,\n level,\n averageScore,\n lastAction: action\n }\n };\n}\n","import {\n resolveTier3Adapter,\n type Tier3Adapter,\n type Tier3AdapterDecision,\n type Tier3EvaluationInput\n} from \"./adapters\";\nimport {\n createCanaryState,\n pushCanarySample,\n type Tier3CanaryAction,\n type Tier3CanaryPolicy,\n type Tier3CanaryState\n} from \"./canary\";\n\nexport type Tier3FallbackTier = \"tier1\" | \"tier2\";\n\nexport type Tier3RuntimeConfig = {\n enabled: boolean;\n fallbackTier: Tier3FallbackTier;\n canary: Tier3CanaryPolicy;\n};\n\nexport type Tier3HistoryEntry = {\n ts: number;\n action: Tier3CanaryAction;\n reason: string;\n};\n\nexport type Tier3RuntimeState = {\n enabled: boolean;\n adapterName: string;\n status: \"active\" | \"fallback\";\n fallbackTier: Tier3FallbackTier;\n fallbackReason?: string;\n canary: Tier3CanaryState;\n history: Tier3HistoryEntry[];\n};\n\nexport function createTier3RuntimeState(\n config: Tier3RuntimeConfig,\n adapter?: Tier3Adapter\n): Tier3RuntimeState {\n const resolved = resolveTier3Adapter(adapter);\n return {\n enabled: config.enabled,\n adapterName: resolved.name,\n status: \"active\",\n fallbackTier: config.fallbackTier,\n canary: createCanaryState(),\n history: []\n };\n}\n\nexport function resolveTier3Fallback(\n state: Tier3RuntimeState,\n reason: string,\n now = Date.now()\n): Tier3RuntimeState {\n const historyEntry: Tier3HistoryEntry = { ts: now, action: \"rollback\", reason };\n return {\n ...state,\n status: \"fallback\",\n fallbackReason: reason,\n history: [...state.history, historyEntry].slice(-50)\n };\n}\n\nexport function evaluateTier3Adaptive(\n state: Tier3RuntimeState,\n config: Tier3RuntimeConfig,\n input: Tier3EvaluationInput,\n adapter?: Tier3Adapter,\n now = Date.now()\n): {\n state: Tier3RuntimeState;\n action: Tier3CanaryAction;\n decision: Tier3AdapterDecision;\n} {\n const resolvedAdapter = resolveTier3Adapter(adapter);\n const decision = resolvedAdapter.evaluate(input);\n\n if (!config.enabled || !state.enabled) {\n return { state, action: \"none\", decision };\n }\n\n const canaryResult = pushCanarySample(state.canary, config.canary, {\n ts: now,\n score: decision.score,\n success: !decision.forceRollback,\n reason: decision.reason\n });\n\n let action = canaryResult.action;\n const historyEntry: Tier3HistoryEntry = {\n ts: now,\n action: canaryResult.action,\n reason: decision.reason\n };\n\n let nextState: Tier3RuntimeState = {\n ...state,\n canary: canaryResult.state,\n history: [...state.history, historyEntry].slice(-50)\n };\n\n if (decision.forceRollback) {\n action = \"rollback\";\n nextState = resolveTier3Fallback(nextState, decision.reason, now);\n resolvedAdapter.onRollback?.(nextState.canary.level, decision.reason);\n return { state: nextState, action, decision };\n }\n\n if (action === \"rollback\") {\n nextState = resolveTier3Fallback(nextState, decision.reason, now);\n resolvedAdapter.onRollback?.(nextState.canary.level, decision.reason);\n return { state: nextState, action, decision };\n }\n\n if (action === \"promote\") {\n nextState = {\n ...nextState,\n status: \"active\",\n fallbackReason: undefined\n };\n resolvedAdapter.onPromote?.(nextState.canary.level);\n }\n\n return { state: nextState, action, decision };\n}\n","import type { Browser, BrowserContext } from \"playwright-core\";\nimport type { BlockerSignalV1 } from \"../providers/types\";\n\nexport type BrowserMode = \"managed\" | \"cdpConnect\" | \"extension\";\nexport type SessionBlockerStateValue = \"clear\" | \"active\" | \"resolving\";\n\nexport type BrowserSession = {\n id: string;\n mode: BrowserMode;\n browser: Browser;\n context: BrowserContext;\n};\n\nexport type SessionBlockerResolutionStatus = \"resolved\" | \"unresolved\" | \"deferred\";\nexport type SessionBlockerResolutionReason =\n | \"verifier_passed\"\n | \"verification_timeout\"\n | \"verifier_failed\"\n | \"env_limited\"\n | \"manual_clear\";\n\nexport type SessionBlockerResolution = {\n status: SessionBlockerResolutionStatus;\n reason: SessionBlockerResolutionReason;\n updatedAtMs: number;\n};\n\nexport type SessionBlockerState = {\n state: SessionBlockerStateValue;\n blocker?: BlockerSignalV1;\n targetKey?: string;\n activatedAtMs?: number;\n lastDetectedAtMs?: number;\n updatedAtMs?: number;\n resolution?: SessionBlockerResolution;\n};\n\nexport type SessionBlockerSummary = {\n state: SessionBlockerStateValue;\n blocker?: BlockerSignalV1;\n targetKey?: string;\n updatedAt?: string;\n resolution?: {\n status: SessionBlockerResolutionStatus;\n reason: SessionBlockerResolutionReason;\n updatedAt: string;\n };\n};\n\nconst CLEAR_STATE: SessionBlockerState = { state: \"clear\" };\n\nexport class SessionStore {\n private sessions = new Map<string, BrowserSession>();\n private blockerStates = new Map<string, SessionBlockerState>();\n\n add(session: BrowserSession): void {\n this.sessions.set(session.id, session);\n this.blockerStates.set(session.id, { ...CLEAR_STATE });\n }\n\n get(sessionId: string): BrowserSession {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Unknown sessionId: ${sessionId}`);\n }\n return session;\n }\n\n has(sessionId: string): boolean {\n return this.sessions.has(sessionId);\n }\n\n delete(sessionId: string): void {\n this.sessions.delete(sessionId);\n this.blockerStates.delete(sessionId);\n }\n\n list(): BrowserSession[] {\n return Array.from(this.sessions.values());\n }\n\n getBlockerState(sessionId: string): SessionBlockerState {\n this.ensureSession(sessionId);\n return this.blockerStates.get(sessionId) ?? { ...CLEAR_STATE };\n }\n\n getBlockerSummary(sessionId: string): SessionBlockerSummary {\n const state = this.getBlockerState(sessionId);\n return {\n state: state.state,\n ...(state.blocker ? { blocker: state.blocker } : {}),\n ...(state.targetKey ? { targetKey: state.targetKey } : {}),\n ...(typeof state.updatedAtMs === \"number\" ? { updatedAt: new Date(state.updatedAtMs).toISOString() } : {}),\n ...(state.resolution\n ? {\n resolution: {\n status: state.resolution.status,\n reason: state.resolution.reason,\n updatedAt: new Date(state.resolution.updatedAtMs).toISOString()\n }\n }\n : {})\n };\n }\n\n startResolving(sessionId: string, nowMs = Date.now()): SessionBlockerState {\n const state = this.getBlockerState(sessionId);\n if (state.state !== \"active\") {\n return state;\n }\n const next: SessionBlockerState = {\n ...state,\n state: \"resolving\",\n updatedAtMs: nowMs,\n resolution: undefined\n };\n this.blockerStates.set(sessionId, next);\n return next;\n }\n\n reconcileBlocker(\n sessionId: string,\n blocker: BlockerSignalV1 | null,\n options: {\n timeoutMs: number;\n verifier?: boolean;\n targetKey?: string;\n nowMs?: number;\n }\n ): SessionBlockerState {\n const nowMs = options.nowMs ?? Date.now();\n const timeoutMs = Math.max(1, options.timeoutMs);\n const current = this.getBlockerState(sessionId);\n\n if (blocker) {\n const next: SessionBlockerState = {\n state: \"active\",\n blocker,\n targetKey: options.targetKey ?? current.targetKey,\n activatedAtMs: current.activatedAtMs ?? nowMs,\n lastDetectedAtMs: nowMs,\n updatedAtMs: nowMs,\n resolution: undefined\n };\n this.blockerStates.set(sessionId, next);\n return next;\n }\n\n if (current.state === \"clear\") {\n return current;\n }\n\n const lastDetectedAtMs = current.lastDetectedAtMs ?? current.updatedAtMs ?? nowMs;\n const timedOut = nowMs - lastDetectedAtMs >= timeoutMs;\n if (timedOut) {\n const unresolved: SessionBlockerState = {\n ...current,\n state: \"active\",\n updatedAtMs: nowMs,\n resolution: {\n status: \"unresolved\",\n reason: \"verification_timeout\",\n updatedAtMs: nowMs\n }\n };\n this.blockerStates.set(sessionId, unresolved);\n return unresolved;\n }\n\n const shouldClear = options.verifier === true || current.state === \"resolving\";\n\n if (!shouldClear) {\n const next = {\n ...current,\n updatedAtMs: nowMs\n };\n this.blockerStates.set(sessionId, next);\n return next;\n }\n\n const cleared: SessionBlockerState = {\n state: \"clear\",\n targetKey: current.targetKey,\n updatedAtMs: nowMs,\n resolution: {\n status: \"resolved\",\n reason: \"verifier_passed\",\n updatedAtMs: nowMs\n }\n };\n this.blockerStates.set(sessionId, cleared);\n return cleared;\n }\n\n markVerificationFailure(\n sessionId: string,\n options: {\n envLimited?: boolean;\n timedOut?: boolean;\n nowMs?: number;\n } = {}\n ): SessionBlockerState {\n const nowMs = options.nowMs ?? Date.now();\n const current = this.getBlockerState(sessionId);\n if (current.state === \"clear\") {\n return current;\n }\n\n const next: SessionBlockerState = {\n ...current,\n state: \"active\",\n updatedAtMs: nowMs,\n resolution: {\n status: options.envLimited ? \"deferred\" : \"unresolved\",\n reason: options.envLimited\n ? \"env_limited\"\n : options.timedOut\n ? \"verification_timeout\"\n : \"verifier_failed\",\n updatedAtMs: nowMs\n }\n };\n this.blockerStates.set(sessionId, next);\n return next;\n }\n\n clearBlocker(sessionId: string, nowMs = Date.now()): SessionBlockerState {\n this.ensureSession(sessionId);\n const cleared: SessionBlockerState = {\n state: \"clear\",\n updatedAtMs: nowMs,\n resolution: {\n status: \"resolved\",\n reason: \"manual_clear\",\n updatedAtMs: nowMs\n }\n };\n this.blockerStates.set(sessionId, cleared);\n return cleared;\n }\n\n private ensureSession(sessionId: string): void {\n if (!this.sessions.has(sessionId)) {\n throw new Error(`Unknown sessionId: ${sessionId}`);\n }\n }\n}\n","import { randomUUID } from \"crypto\";\nimport type { Page } from \"playwright-core\";\n\nexport type TargetInfo = {\n targetId: string;\n title?: string;\n url?: string;\n type: \"page\";\n};\n\nexport type NamedTargetInfo = {\n name: string;\n targetId: string;\n};\n\nconst TARGET_INFO_TIMEOUT_MS = 2000;\n\nexport class TargetManager {\n private targets = new Map<string, Page>();\n private activeTargetId: string | null = null;\n private nameToTarget = new Map<string, string>();\n private targetToName = new Map<string, string>();\n\n registerPage(page: Page, name?: string): string {\n const targetId = randomUUID();\n this.targets.set(targetId, page);\n if (!this.activeTargetId) {\n this.activeTargetId = targetId;\n }\n if (name) {\n this.setName(targetId, name);\n }\n return targetId;\n }\n\n registerExistingPages(pages: Page[]): void {\n for (const page of pages) {\n this.registerPage(page);\n }\n }\n\n setName(targetId: string, name: string): void {\n const trimmed = name.trim();\n if (!trimmed) {\n throw new Error(\"Name must be non-empty\");\n }\n if (!this.targets.has(targetId)) {\n throw new Error(`Unknown targetId: ${targetId}`);\n }\n const existing = this.nameToTarget.get(trimmed);\n if (existing && existing !== targetId) {\n throw new Error(`Name already in use: ${trimmed}`);\n }\n const previousName = this.targetToName.get(targetId);\n if (previousName && previousName !== trimmed) {\n this.nameToTarget.delete(previousName);\n }\n this.nameToTarget.set(trimmed, targetId);\n this.targetToName.set(targetId, trimmed);\n }\n\n getTargetIdByName(name: string): string | null {\n return this.nameToTarget.get(name.trim()) ?? null;\n }\n\n getName(targetId: string): string | null {\n return this.targetToName.get(targetId) ?? null;\n }\n\n listNamedTargets(): NamedTargetInfo[] {\n return Array.from(this.nameToTarget.entries()).map(([name, targetId]) => ({\n name,\n targetId\n }));\n }\n\n removeName(name: string): void {\n const trimmed = name.trim();\n const targetId = this.nameToTarget.get(trimmed);\n if (targetId) {\n this.nameToTarget.delete(trimmed);\n this.targetToName.delete(targetId);\n }\n }\n\n setActiveTarget(targetId: string): void {\n if (!this.targets.has(targetId)) {\n throw new Error(`Unknown targetId: ${targetId}`);\n }\n this.activeTargetId = targetId;\n }\n\n getActiveTargetId(): string | null {\n return this.activeTargetId;\n }\n\n getActivePage(): Page {\n if (!this.activeTargetId) {\n throw new Error(\"No active target\");\n }\n const page = this.targets.get(this.activeTargetId);\n if (!page) {\n throw new Error(`Missing active target: ${this.activeTargetId}`);\n }\n return page;\n }\n\n getPage(targetId: string): Page {\n const page = this.targets.get(targetId);\n if (!page) {\n throw new Error(`Unknown targetId: ${targetId}`);\n }\n return page;\n }\n\n async listTargets(includeUrls = false): Promise<TargetInfo[]> {\n const entries = Array.from(this.targets.entries());\n return Promise.all(entries.map(async ([targetId, page]) => {\n const info: TargetInfo = {\n targetId,\n title: undefined,\n url: undefined,\n type: \"page\"\n };\n\n try {\n if (!page.isClosed()) {\n info.title = await readWithTimeout(() => page.title());\n }\n } catch {\n info.title = undefined;\n }\n\n if (includeUrls) {\n try {\n if (!page.isClosed()) {\n info.url = await readWithTimeout(async () => page.url());\n }\n } catch {\n info.url = undefined;\n }\n }\n\n return info;\n }));\n }\n\n async closeTarget(targetId: string): Promise<void> {\n const page = this.getPage(targetId);\n let closeError: unknown;\n try {\n await page.close();\n } catch (error) {\n closeError = error;\n } finally {\n this.targets.delete(targetId);\n const name = this.targetToName.get(targetId);\n if (name) {\n this.nameToTarget.delete(name);\n this.targetToName.delete(targetId);\n }\n\n if (this.activeTargetId === targetId) {\n const remaining = Array.from(this.targets.keys());\n this.activeTargetId = remaining[0] ?? null;\n }\n }\n\n if (closeError) {\n throw closeError;\n }\n }\n\n listPageEntries(): Array<{ targetId: string; page: Page }> {\n return Array.from(this.targets.entries()).map(([targetId, page]) => ({\n targetId,\n page\n }));\n }\n\n syncPages(pages: Page[]): void {\n const current = new Set(pages);\n\n for (const [targetId, page] of this.targets.entries()) {\n if (page.isClosed() || !current.has(page)) {\n this.targets.delete(targetId);\n const name = this.targetToName.get(targetId);\n if (name) {\n this.nameToTarget.delete(name);\n this.targetToName.delete(targetId);\n }\n }\n }\n\n for (const page of pages) {\n let exists = false;\n for (const existing of this.targets.values()) {\n if (existing === page) {\n exists = true;\n break;\n }\n }\n if (!exists) {\n this.registerPage(page);\n }\n }\n\n if (this.activeTargetId && !this.targets.has(this.activeTargetId)) {\n this.activeTargetId = this.targets.keys().next().value ?? null;\n }\n }\n}\n\nconst readWithTimeout = async <T>(reader: () => Promise<T>, timeoutMs: number = TARGET_INFO_TIMEOUT_MS): Promise<T | undefined> => {\n return await new Promise<T | undefined>((resolve) => {\n const timeoutId = setTimeout(() => resolve(undefined), timeoutMs);\n reader().then((value) => {\n clearTimeout(timeoutId);\n resolve(value);\n }).catch(() => {\n clearTimeout(timeoutId);\n resolve(undefined);\n });\n });\n};\n","import type { ParallelismGovernorConfig } from \"../config\";\n\nexport type ParallelModeVariant =\n | \"managedHeaded\"\n | \"managedHeadless\"\n | \"cdpConnectHeaded\"\n | \"cdpConnectHeadless\"\n | \"extensionOpsHeaded\"\n | \"extensionLegacyCdpHeaded\";\n\nexport type ParallelPressureClass = \"healthy\" | \"medium\" | \"high\" | \"critical\";\n\nexport type ParallelismPressureInput = {\n hostFreeMemPct: number;\n rssUsagePct: number;\n queueAgeMs: number;\n queueDepth: number;\n discardedSignals?: number;\n frozenSignals?: number;\n};\n\nexport type ParallelismGovernorState = {\n modeVariant: ParallelModeVariant;\n staticCap: number;\n effectiveCap: number;\n healthyWindows: number;\n lastSampleAt: number;\n lastPressure: ParallelPressureClass;\n};\n\nexport type ParallelismGovernorSnapshot = {\n state: ParallelismGovernorState;\n pressure: ParallelPressureClass;\n targetCap: number;\n waitQueueDepth: number;\n waitQueueAgeMs: number;\n};\n\nconst clamp = (value: number, floor: number, ceil: number): number => {\n if (value < floor) return floor;\n if (value > ceil) return ceil;\n return value;\n};\n\nconst floorPercent = (value: number): number => clamp(Number.isFinite(value) ? value : 0, 0, 100);\n\nconst classifyPressure = (\n policy: ParallelismGovernorConfig,\n input: ParallelismPressureInput\n): ParallelPressureClass => {\n const hostFreeMemPct = floorPercent(input.hostFreeMemPct);\n const rssUsagePct = floorPercent(input.rssUsagePct);\n const queueAgeMs = Math.max(0, Number.isFinite(input.queueAgeMs) ? input.queueAgeMs : 0);\n const discardedSignals = Math.max(0, input.discardedSignals ?? 0);\n const frozenSignals = Math.max(0, input.frozenSignals ?? 0);\n\n const critical = hostFreeMemPct <= policy.hostFreeMemCriticalPct\n || rssUsagePct >= policy.rssCriticalPct\n || queueAgeMs >= policy.queueAgeCriticalMs;\n if (critical) return \"critical\";\n\n const high = hostFreeMemPct <= policy.hostFreeMemHighPct\n || rssUsagePct >= policy.rssHighPct\n || queueAgeMs >= policy.queueAgeHighMs\n || discardedSignals > 0;\n if (high) return \"high\";\n\n const medium = hostFreeMemPct <= policy.hostFreeMemMediumPct\n || rssUsagePct >= policy.rssSoftPct\n || frozenSignals > 0;\n return medium ? \"medium\" : \"healthy\";\n};\n\nconst pressurePenalty = (pressure: ParallelPressureClass): number => {\n switch (pressure) {\n case \"medium\":\n return 1;\n case \"high\":\n return 2;\n case \"critical\":\n return Number.MAX_SAFE_INTEGER;\n default:\n return 0;\n }\n};\n\nexport const resolveStaticCap = (\n policy: ParallelismGovernorConfig,\n modeVariant: ParallelModeVariant\n): number => {\n const cap = policy.modeCaps[modeVariant];\n return clamp(cap, policy.floor, cap);\n};\n\nexport const createGovernorState = (\n policy: ParallelismGovernorConfig,\n modeVariant: ParallelModeVariant\n): ParallelismGovernorState => {\n const staticCap = resolveStaticCap(policy, modeVariant);\n return {\n modeVariant,\n staticCap,\n effectiveCap: staticCap,\n healthyWindows: 0,\n lastSampleAt: 0,\n lastPressure: \"healthy\"\n };\n};\n\nexport const evaluateGovernor = (\n policy: ParallelismGovernorConfig,\n current: ParallelismGovernorState,\n input: ParallelismPressureInput,\n sampledAt = Date.now()\n): ParallelismGovernorSnapshot => {\n const normalizedQueueDepth = Math.max(0, Number.isFinite(input.queueDepth) ? input.queueDepth : 0);\n const normalizedQueueAgeMs = Math.max(0, Number.isFinite(input.queueAgeMs) ? input.queueAgeMs : 0);\n const pressure = classifyPressure(policy, input);\n const basePenalty = pressurePenalty(pressure);\n const lifecyclePenalty = Math.max(0, input.discardedSignals ?? 0) + Math.max(0, input.frozenSignals ?? 0);\n const targetCap = pressure === \"critical\"\n ? policy.floor\n : clamp(\n current.staticCap - basePenalty - lifecyclePenalty,\n policy.floor,\n current.staticCap\n );\n\n let effectiveCap = current.effectiveCap;\n let healthyWindows = pressure === \"healthy\" ? current.healthyWindows + 1 : 0;\n\n if (targetCap < current.effectiveCap) {\n effectiveCap = targetCap;\n healthyWindows = 0;\n } else if (targetCap > current.effectiveCap) {\n const windowsRequired = Math.max(1, policy.recoveryStableWindows);\n if (healthyWindows >= windowsRequired) {\n effectiveCap = clamp(current.effectiveCap + 1, policy.floor, targetCap);\n healthyWindows = 0;\n }\n }\n\n return {\n state: {\n modeVariant: current.modeVariant,\n staticCap: current.staticCap,\n effectiveCap,\n healthyWindows,\n lastSampleAt: sampledAt,\n lastPressure: pressure\n },\n pressure,\n targetCap,\n waitQueueDepth: normalizedQueueDepth,\n waitQueueAgeMs: normalizedQueueAgeMs\n };\n};\n\nexport const rssUsagePercent = (rssBytes: number, budgetMb: number): number => {\n const budgetBytes = Math.max(1, budgetMb) * 1024 * 1024;\n return Math.max(0, (rssBytes / budgetBytes) * 100);\n};\n","import { writeFile } from \"fs/promises\";\nimport { randomUUID } from \"crypto\";\nimport type { OpenDevBrowserConfig } from \"../config\";\nimport { createRequestId } from \"../core/logging\";\nimport { resolveRelayEndpoint, sanitizeWsEndpoint } from \"../relay/relay-endpoints\";\nimport type { ParallelismGovernorPolicyPayload } from \"../relay/protocol\";\nimport type { BrowserManagerLike } from \"./manager-types\";\nimport type { ConnectOptions, LaunchOptions } from \"./browser-manager\";\nimport type { BrowserMode } from \"./session-store\";\nimport type { TargetInfo } from \"./target-manager\";\nimport type { ReactExport } from \"../export/react-emitter\";\nimport { emitReactComponent } from \"../export/react-emitter\";\nimport { extractCss, STYLE_ALLOWLIST, SKIP_STYLE_VALUES } from \"../export/css-extract\";\nimport type { DomCapture } from \"../export/dom-capture\";\nimport { OpsClient } from \"./ops-client\";\nimport type { ConsoleTracker } from \"../devtools/console-tracker\";\nimport type { NetworkTracker } from \"../devtools/network-tracker\";\nimport { BrowserManager } from \"./browser-manager\";\n\ntype CookieImportRecord = {\n name: string;\n value: string;\n url?: string;\n domain?: string;\n path?: string;\n expires?: number;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n};\n\ntype CookieListRecord = {\n name: string;\n value: string;\n domain: string;\n path: string;\n expires: number;\n httpOnly: boolean;\n secure: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n};\n\nexport class OpsBrowserManager implements BrowserManagerLike {\n private readonly base: BrowserManager;\n private readonly config: OpenDevBrowserConfig;\n private opsClient: OpsClient | null = null;\n private opsEndpoint: string | null = null;\n private opsSessions = new Set<string>();\n private opsLeases = new Map<string, string>();\n private closedOpsSessions = new Map<string, number>();\n\n constructor(base: BrowserManager, config: OpenDevBrowserConfig) {\n this.base = base;\n this.config = config;\n }\n\n async launch(options: LaunchOptions): ReturnType<BrowserManagerLike[\"launch\"]> {\n return this.base.launch(options);\n }\n\n async connect(options: ConnectOptions): ReturnType<BrowserManagerLike[\"connect\"]> {\n return this.base.connect(options);\n }\n\n async connectRelay(wsEndpoint: string): ReturnType<BrowserManagerLike[\"connectRelay\"]> {\n const endpoint = new URL(wsEndpoint);\n if (endpoint.pathname.endsWith(\"/cdp\")) {\n return this.base.connectRelay(wsEndpoint);\n }\n\n const { connectEndpoint, reportedEndpoint } = await resolveRelayEndpoint({\n wsEndpoint,\n path: \"ops\",\n config: this.config\n });\n const client = await this.ensureOpsClient(connectEndpoint);\n const leaseId = randomUUID();\n const result = await client.request<{ opsSessionId: string; activeTargetId?: string | null; url?: string; title?: string; leaseId?: string }>(\n \"session.connect\",\n {\n parallelismPolicy: this.buildParallelismPolicyPayload()\n },\n undefined,\n 30000,\n leaseId\n );\n const sessionId = result.opsSessionId;\n this.opsSessions.add(sessionId);\n this.opsLeases.set(sessionId, result.leaseId ?? leaseId);\n this.trackClosedSessionCleanup();\n return {\n sessionId,\n mode: \"extension\",\n activeTargetId: result.activeTargetId ?? null,\n warnings: [],\n leaseId: result.leaseId ?? leaseId,\n wsEndpoint: sanitizeWsEndpoint(reportedEndpoint)\n };\n }\n\n private buildParallelismPolicyPayload(): ParallelismGovernorPolicyPayload {\n const policy = this.config.parallelism;\n return {\n floor: policy.floor,\n backpressureTimeoutMs: policy.backpressureTimeoutMs,\n sampleIntervalMs: policy.sampleIntervalMs,\n recoveryStableWindows: policy.recoveryStableWindows,\n hostFreeMemMediumPct: policy.hostFreeMemMediumPct,\n hostFreeMemHighPct: policy.hostFreeMemHighPct,\n hostFreeMemCriticalPct: policy.hostFreeMemCriticalPct,\n rssBudgetMb: policy.rssBudgetMb,\n rssSoftPct: policy.rssSoftPct,\n rssHighPct: policy.rssHighPct,\n rssCriticalPct: policy.rssCriticalPct,\n queueAgeHighMs: policy.queueAgeHighMs,\n queueAgeCriticalMs: policy.queueAgeCriticalMs,\n modeCaps: {\n managedHeaded: policy.modeCaps.managedHeaded,\n managedHeadless: policy.modeCaps.managedHeadless,\n cdpConnectHeaded: policy.modeCaps.cdpConnectHeaded,\n cdpConnectHeadless: policy.modeCaps.cdpConnectHeadless,\n extensionOpsHeaded: policy.modeCaps.extensionOpsHeaded,\n extensionLegacyCdpHeaded: policy.modeCaps.extensionLegacyCdpHeaded\n }\n };\n }\n\n async disconnect(sessionId: string, closeBrowser = false): ReturnType<BrowserManagerLike[\"disconnect\"]> {\n if (!this.opsSessions.has(sessionId)) {\n if (this.closedOpsSessions.has(sessionId)) {\n return;\n }\n return this.base.disconnect(sessionId, closeBrowser);\n }\n try {\n await this.requestOps(sessionId, \"session.disconnect\", { closeBrowser });\n } catch (error) {\n if (!isIgnorableOpsDisconnectError(error)) {\n throw error;\n }\n }\n this.opsSessions.delete(sessionId);\n this.opsLeases.delete(sessionId);\n this.closedOpsSessions.delete(sessionId);\n }\n\n async status(sessionId: string): ReturnType<BrowserManagerLike[\"status\"]> {\n if (!this.opsSessions.has(sessionId)) {\n if (this.closedOpsSessions.has(sessionId)) {\n throw new Error(\"[invalid_session] Session already closed\");\n }\n return this.base.status(sessionId);\n }\n const result = await this.requestOps<{ mode: BrowserMode; activeTargetId: string | null; url?: string; title?: string }>(\n sessionId,\n \"session.status\",\n {}\n );\n return result;\n }\n\n async withPage<T>(sessionId: string, targetId: string | null, fn: (page: never) => Promise<T>): Promise<T> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.withPage(sessionId, targetId, fn as never);\n }\n throw new Error(\"Direct annotate is unavailable via extension ops sessions.\");\n }\n\n async cookieImport(\n sessionId: string,\n cookies: CookieImportRecord[],\n strict = true,\n requestId = createRequestId()\n ): Promise<{ requestId: string; imported: number; rejected: Array<{ index: number; reason: string }> }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.cookieImport(sessionId, cookies, strict, requestId);\n }\n return await this.requestOps(\n sessionId,\n \"storage.setCookies\",\n { cookies, strict, requestId }\n );\n }\n\n async cookieList(\n sessionId: string,\n urls?: string[],\n requestId = createRequestId()\n ): Promise<{ requestId: string; cookies: CookieListRecord[]; count: number }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.cookieList(sessionId, urls, requestId);\n }\n return await this.requestOps(\n sessionId,\n \"storage.getCookies\",\n { urls, requestId }\n );\n }\n\n async goto(\n sessionId: string,\n url: string,\n waitUntil: \"domcontentloaded\" | \"load\" | \"networkidle\" = \"load\",\n timeoutMs = 30000,\n _sessionOverride?: { browser: unknown; context: unknown; targets: unknown },\n targetId?: string | null\n ): ReturnType<BrowserManagerLike[\"goto\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.goto(sessionId, url, waitUntil, timeoutMs, undefined, targetId);\n }\n return await this.requestOps(sessionId, \"nav.goto\", this.withTarget({ url, waitUntil, timeoutMs }, targetId));\n }\n\n async waitForLoad(\n sessionId: string,\n until: \"domcontentloaded\" | \"load\" | \"networkidle\",\n timeoutMs = 30000,\n targetId?: string | null\n ): ReturnType<BrowserManagerLike[\"waitForLoad\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.waitForLoad(sessionId, until, timeoutMs, targetId);\n }\n return await this.requestOps(sessionId, \"nav.wait\", this.withTarget({ until, timeoutMs }, targetId));\n }\n\n async waitForRef(\n sessionId: string,\n ref: string,\n state: \"attached\" | \"visible\" | \"hidden\" = \"attached\",\n timeoutMs = 30000,\n targetId?: string | null\n ): ReturnType<BrowserManagerLike[\"waitForRef\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.waitForRef(sessionId, ref, state, timeoutMs, targetId);\n }\n return await this.requestOps(sessionId, \"nav.wait\", this.withTarget({ ref, state, timeoutMs }, targetId));\n }\n\n async snapshot(\n sessionId: string,\n mode: \"outline\" | \"actionables\",\n maxChars: number,\n cursor?: string,\n targetId?: string | null\n ): ReturnType<BrowserManagerLike[\"snapshot\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.snapshot(sessionId, mode, maxChars, cursor, targetId);\n }\n return await this.requestOps(sessionId, \"nav.snapshot\", this.withTarget({\n mode,\n maxChars,\n cursor,\n maxNodes: this.config.snapshot.maxNodes\n }, targetId));\n }\n\n async click(sessionId: string, ref: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"click\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.click(sessionId, ref, targetId);\n }\n return await this.requestOps(sessionId, \"interact.click\", this.withTarget({ ref }, targetId));\n }\n\n async hover(sessionId: string, ref: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"hover\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.hover(sessionId, ref, targetId);\n }\n return await this.requestOps(sessionId, \"interact.hover\", this.withTarget({ ref }, targetId));\n }\n\n async press(sessionId: string, key: string, ref?: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"press\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.press(sessionId, key, ref, targetId);\n }\n return await this.requestOps(sessionId, \"interact.press\", this.withTarget({ key, ref }, targetId));\n }\n\n async check(sessionId: string, ref: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"check\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.check(sessionId, ref, targetId);\n }\n return await this.requestOps(sessionId, \"interact.check\", this.withTarget({ ref }, targetId));\n }\n\n async uncheck(sessionId: string, ref: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"uncheck\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.uncheck(sessionId, ref, targetId);\n }\n return await this.requestOps(sessionId, \"interact.uncheck\", this.withTarget({ ref }, targetId));\n }\n\n async type(\n sessionId: string,\n ref: string,\n text: string,\n clear = false,\n submit = false,\n targetId?: string | null\n ): ReturnType<BrowserManagerLike[\"type\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.type(sessionId, ref, text, clear, submit, targetId);\n }\n return await this.requestOps(sessionId, \"interact.type\", this.withTarget({ ref, text, clear, submit }, targetId));\n }\n\n async select(sessionId: string, ref: string, values: string[], targetId?: string | null): ReturnType<BrowserManagerLike[\"select\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.select(sessionId, ref, values, targetId);\n }\n return await this.requestOps(sessionId, \"interact.select\", this.withTarget({ ref, values }, targetId));\n }\n\n async scroll(sessionId: string, dy: number, ref?: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"scroll\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.scroll(sessionId, dy, ref, targetId);\n }\n return await this.requestOps(sessionId, \"interact.scroll\", this.withTarget({ dy, ref }, targetId));\n }\n\n async scrollIntoView(sessionId: string, ref: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"scrollIntoView\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.scrollIntoView(sessionId, ref, targetId);\n }\n return await this.requestOps(sessionId, \"interact.scrollIntoView\", this.withTarget({ ref }, targetId));\n }\n\n async domGetHtml(\n sessionId: string,\n ref: string,\n maxChars = 8000,\n targetId?: string | null\n ): ReturnType<BrowserManagerLike[\"domGetHtml\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domGetHtml(sessionId, ref, maxChars, targetId);\n }\n return await this.requestOps(sessionId, \"dom.getHtml\", this.withTarget({ ref, maxChars }, targetId));\n }\n\n async domGetText(\n sessionId: string,\n ref: string,\n maxChars = 8000,\n targetId?: string | null\n ): ReturnType<BrowserManagerLike[\"domGetText\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domGetText(sessionId, ref, maxChars, targetId);\n }\n return await this.requestOps(sessionId, \"dom.getText\", this.withTarget({ ref, maxChars }, targetId));\n }\n\n async domGetAttr(\n sessionId: string,\n ref: string,\n name: string,\n targetId?: string | null\n ): ReturnType<BrowserManagerLike[\"domGetAttr\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domGetAttr(sessionId, ref, name, targetId);\n }\n return await this.requestOps(sessionId, \"dom.getAttr\", this.withTarget({ ref, name }, targetId));\n }\n\n async domGetValue(sessionId: string, ref: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"domGetValue\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domGetValue(sessionId, ref, targetId);\n }\n return await this.requestOps(sessionId, \"dom.getValue\", this.withTarget({ ref }, targetId));\n }\n\n async domIsVisible(sessionId: string, ref: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"domIsVisible\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domIsVisible(sessionId, ref, targetId);\n }\n return await this.requestOps(sessionId, \"dom.isVisible\", this.withTarget({ ref }, targetId));\n }\n\n async domIsEnabled(sessionId: string, ref: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"domIsEnabled\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domIsEnabled(sessionId, ref, targetId);\n }\n return await this.requestOps(sessionId, \"dom.isEnabled\", this.withTarget({ ref }, targetId));\n }\n\n async domIsChecked(sessionId: string, ref: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"domIsChecked\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.domIsChecked(sessionId, ref, targetId);\n }\n return await this.requestOps(sessionId, \"dom.isChecked\", this.withTarget({ ref }, targetId));\n }\n\n async clonePage(sessionId: string, targetId?: string | null): Promise<ReactExport> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.clonePage(sessionId, targetId);\n }\n const capture = await this.requestOps<{ capture: DomCapture }>(sessionId, \"export.clonePage\", this.withTarget({\n sanitize: !this.config.security.allowUnsafeExport,\n maxNodes: this.config.export.maxNodes,\n inlineStyles: this.config.export.inlineStyles,\n styleAllowlist: Array.from(STYLE_ALLOWLIST),\n skipStyleValues: Array.from(SKIP_STYLE_VALUES)\n }, targetId));\n const css = extractCss(capture.capture);\n return emitReactComponent(capture.capture, css, { allowUnsafeExport: this.config.security.allowUnsafeExport });\n }\n\n async cloneComponent(sessionId: string, ref: string, targetId?: string | null): Promise<ReactExport> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.cloneComponent(sessionId, ref, targetId);\n }\n const capture = await this.requestOps<{ capture: DomCapture }>(sessionId, \"export.cloneComponent\", this.withTarget({\n ref,\n sanitize: !this.config.security.allowUnsafeExport,\n maxNodes: this.config.export.maxNodes,\n inlineStyles: this.config.export.inlineStyles,\n styleAllowlist: Array.from(STYLE_ALLOWLIST),\n skipStyleValues: Array.from(SKIP_STYLE_VALUES)\n }, targetId));\n const css = extractCss(capture.capture);\n return emitReactComponent(capture.capture, css, { allowUnsafeExport: this.config.security.allowUnsafeExport });\n }\n\n async perfMetrics(sessionId: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"perfMetrics\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.perfMetrics(sessionId, targetId);\n }\n return await this.requestOps(sessionId, \"devtools.perf\", this.withTarget({}, targetId));\n }\n\n async screenshot(sessionId: string, path?: string, targetId?: string | null): ReturnType<BrowserManagerLike[\"screenshot\"]> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.screenshot(sessionId, path, targetId);\n }\n const result = await this.requestOps<{ base64?: string; warning?: string }>(\n sessionId,\n \"page.screenshot\",\n this.withTarget({}, targetId)\n );\n if (!result.base64) {\n throw new Error(\"Screenshot failed\");\n }\n const warnings = result.warning ? [result.warning] : undefined;\n if (path) {\n await writeFile(path, Buffer.from(result.base64, \"base64\"));\n return warnings ? { path, warnings } : { path };\n }\n return warnings ? { base64: result.base64, warnings } : { base64: result.base64 };\n }\n\n async consolePoll(sessionId: string, sinceSeq?: number, max = 50): Promise<{ events: ReturnType<ConsoleTracker[\"poll\"]>[\"events\"]; nextSeq: number }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.consolePoll(sessionId, sinceSeq, max);\n }\n return await this.requestOps(sessionId, \"devtools.consolePoll\", { sinceSeq, max });\n }\n\n async networkPoll(sessionId: string, sinceSeq?: number, max = 50): Promise<{ events: ReturnType<NetworkTracker[\"poll\"]>[\"events\"]; nextSeq: number }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.networkPoll(sessionId, sinceSeq, max);\n }\n return await this.requestOps(sessionId, \"devtools.networkPoll\", { sinceSeq, max });\n }\n\n async listTargets(sessionId: string, includeUrls = false): Promise<{ activeTargetId: string | null; targets: TargetInfo[] }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.listTargets(sessionId, includeUrls);\n }\n return await this.requestOps(sessionId, \"targets.list\", { includeUrls });\n }\n\n async useTarget(sessionId: string, targetId: string): Promise<{ activeTargetId: string; url?: string; title?: string }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.useTarget(sessionId, targetId);\n }\n return await this.requestOps(sessionId, \"targets.use\", { targetId });\n }\n\n async newTarget(sessionId: string, url?: string): Promise<{ targetId: string }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.newTarget(sessionId, url);\n }\n return await this.requestOps(sessionId, \"targets.new\", { url });\n }\n\n async closeTarget(sessionId: string, targetId: string): Promise<void> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.closeTarget(sessionId, targetId);\n }\n await this.requestOps(sessionId, \"targets.close\", { targetId });\n }\n\n async page(sessionId: string, name: string, url?: string): Promise<{ targetId: string; created: boolean; url?: string; title?: string }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.page(sessionId, name, url);\n }\n return await this.requestOps(sessionId, \"page.open\", { name, url });\n }\n\n async listPages(sessionId: string): Promise<{ pages: Array<{ name: string; targetId: string; url?: string; title?: string }> }> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.listPages(sessionId);\n }\n return await this.requestOps(sessionId, \"page.list\", {});\n }\n\n async closePage(sessionId: string, name: string): Promise<void> {\n if (!this.opsSessions.has(sessionId)) {\n return this.base.closePage(sessionId, name);\n }\n await this.requestOps(sessionId, \"page.close\", { name });\n }\n\n private async ensureOpsClient(wsEndpoint: string): Promise<OpsClient> {\n if (this.opsClient && this.opsEndpoint === wsEndpoint) {\n await this.opsClient.connect();\n return this.opsClient;\n }\n this.opsClient?.disconnect();\n const client = new OpsClient(wsEndpoint, {\n onEvent: (event) => {\n this.handleOpsEvent(event);\n },\n onClose: () => {\n this.handleOpsClientClosed();\n }\n });\n await client.connect();\n this.opsClient = client;\n this.opsEndpoint = wsEndpoint;\n return client;\n }\n\n private withTarget(\n payload: Record<string, unknown>,\n targetId?: string | null\n ): Record<string, unknown> {\n if (typeof targetId !== \"string\" || targetId.trim().length === 0) {\n return payload;\n }\n return {\n ...payload,\n targetId: targetId.trim()\n };\n }\n\n private async requestOps<T>(sessionId: string, command: string, payload: Record<string, unknown>): Promise<T> {\n const client = this.opsClient;\n if (!client) {\n throw new Error(\"Ops client not connected\");\n }\n const leaseId = this.opsLeases.get(sessionId);\n if (!leaseId) {\n throw new Error(\"Ops lease not found for session\");\n }\n return await client.request<T>(command, payload, sessionId, 30000, leaseId);\n }\n\n private handleOpsEvent(event: { event?: string; opsSessionId?: string }): void {\n if (!event.opsSessionId) return;\n if (event.event === \"ops_session_closed\" || event.event === \"ops_session_expired\" || event.event === \"ops_tab_closed\") {\n this.opsSessions.delete(event.opsSessionId);\n this.opsLeases.delete(event.opsSessionId);\n this.closedOpsSessions.set(event.opsSessionId, Date.now());\n this.trackClosedSessionCleanup();\n }\n }\n\n private handleOpsClientClosed(): void {\n if (this.opsSessions.size === 0) return;\n const now = Date.now();\n for (const sessionId of this.opsSessions) {\n this.closedOpsSessions.set(sessionId, now);\n }\n this.opsSessions.clear();\n this.opsLeases.clear();\n this.trackClosedSessionCleanup();\n }\n\n private trackClosedSessionCleanup(): void {\n if (this.closedOpsSessions.size <= 100) return;\n const entries = Array.from(this.closedOpsSessions.entries()).sort((a, b) => a[1] - b[1]);\n const excess = entries.length - 100;\n for (let i = 0; i < excess; i += 1) {\n const sessionId = entries[i]?.[0];\n if (sessionId) {\n this.closedOpsSessions.delete(sessionId);\n }\n }\n }\n}\n\nconst isIgnorableOpsDisconnectError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.includes(\"Ops request timed out\")\n || message.includes(\"[invalid_session] Unknown ops session\")\n || message.includes(\"Ops socket closed\");\n};\n","import { randomUUID } from \"crypto\";\nimport { WebSocket } from \"ws\";\nimport {\n MAX_OPS_PAYLOAD_BYTES,\n OPS_PROTOCOL_VERSION,\n type OpsChunk,\n type OpsError,\n type OpsErrorResponse,\n type OpsEvent,\n type OpsHello,\n type OpsHelloAck,\n type OpsPing,\n type OpsPong,\n type OpsRequest,\n type OpsResponse\n} from \"../relay/protocol\";\n\nexport type OpsClientOptions = {\n handshakeTimeoutMs?: number;\n pingIntervalMs?: number;\n pingTimeoutMs?: number;\n maxPayloadBytes?: number;\n autoReconnect?: boolean;\n reconnectBaseDelayMs?: number;\n reconnectMaxDelayMs?: number;\n maxMissedPongs?: number;\n onEvent?: (event: OpsEvent) => void;\n onClose?: (detail?: { code?: number; reason?: string }) => void;\n};\n\ntype PendingRequest = {\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeoutId: NodeJS.Timeout;\n};\n\ntype PendingChunk = {\n requestId: string;\n totalChunks: number;\n chunks: string[];\n};\n\ntype PendingPing = {\n resolve: () => void;\n reject: (error: Error) => void;\n timeoutId: NodeJS.Timeout;\n};\n\nexport class OpsClient {\n private url: string;\n private socket: WebSocket | null = null;\n private lastHelloAck: OpsHelloAck | null = null;\n private connectPromise: Promise<OpsHelloAck> | null = null;\n private pendingRequests = new Map<string, PendingRequest>();\n private pendingChunks = new Map<string, PendingChunk>();\n private pendingPings = new Map<string, PendingPing>();\n private heartbeatTimer: NodeJS.Timeout | null = null;\n private handshakeTimeoutMs: number;\n private pingIntervalMs: number;\n private pingTimeoutMs: number;\n private maxPayloadBytes: number;\n private onEvent?: (event: OpsEvent) => void;\n private onClose?: (detail?: { code?: number; reason?: string }) => void;\n private autoReconnect: boolean;\n private reconnectBaseDelayMs: number;\n private reconnectMaxDelayMs: number;\n private reconnectAttempts = 0;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private shouldReconnectOnClose = true;\n private missedPongs = 0;\n private maxMissedPongs: number;\n\n constructor(url: string, options: OpsClientOptions = {}) {\n this.url = url;\n this.handshakeTimeoutMs = options.handshakeTimeoutMs ?? 3000;\n this.pingIntervalMs = options.pingIntervalMs ?? 25000;\n this.pingTimeoutMs = options.pingTimeoutMs ?? 2000;\n this.maxPayloadBytes = options.maxPayloadBytes ?? MAX_OPS_PAYLOAD_BYTES;\n this.autoReconnect = options.autoReconnect ?? true;\n this.reconnectBaseDelayMs = options.reconnectBaseDelayMs ?? 500;\n this.reconnectMaxDelayMs = options.reconnectMaxDelayMs ?? 10000;\n this.maxMissedPongs = options.maxMissedPongs ?? 2;\n this.onEvent = options.onEvent;\n this.onClose = options.onClose;\n }\n\n async connect(): Promise<OpsHelloAck> {\n if (this.connectPromise) {\n return await this.connectPromise;\n }\n\n const run = (async () => {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n this.clearReconnectTimer();\n this.socket = new WebSocket(this.url);\n await new Promise<void>((resolve, reject) => {\n /* c8 ignore next */\n if (!this.socket) {\n reject(new Error(\"Ops socket not created\"));\n return;\n }\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const cleanup = () => {\n this.socket?.removeListener(\"open\", onOpen);\n this.socket?.removeListener(\"error\", onError);\n };\n this.socket.once(\"open\", onOpen);\n this.socket.once(\"error\", onError);\n });\n\n this.socket.on(\"message\", (data) => {\n this.handleMessage(data);\n });\n this.socket.on(\"close\", (code, reason) => {\n this.handleClose({ code, reason: reason.toString() });\n });\n this.socket.on(\"error\", () => {\n // Errors are surfaced via close or pending requests.\n });\n }\n\n const hello: OpsHello = {\n type: \"ops_hello\",\n version: OPS_PROTOCOL_VERSION,\n maxPayloadBytes: this.maxPayloadBytes\n };\n\n const ack = await new Promise<OpsHelloAck>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(\"Ops handshake timeout\"));\n }, this.handshakeTimeoutMs);\n const handler = (message: OpsHelloAck) => {\n clearTimeout(timeoutId);\n resolve(message);\n };\n this.waitForHelloAck(handler, reject);\n try {\n this.send(hello);\n } catch (error) {\n clearTimeout(timeoutId);\n reject(error instanceof Error ? error : new Error(\"Ops handshake failed\"));\n }\n });\n\n this.lastHelloAck = ack;\n this.reconnectAttempts = 0;\n this.missedPongs = 0;\n this.startHeartbeat();\n return ack;\n })();\n\n this.connectPromise = run;\n try {\n return await run;\n } finally {\n if (this.connectPromise === run) {\n this.connectPromise = null;\n }\n }\n }\n\n disconnect(): void {\n this.autoReconnect = false;\n this.shouldReconnectOnClose = false;\n this.clearReconnectTimer();\n this.stopHeartbeat();\n if (this.socket) {\n try {\n if (this.socket.readyState === WebSocket.OPEN || this.socket.readyState === WebSocket.CONNECTING) {\n this.socket.close(1000, \"Ops disconnect\");\n }\n } catch {\n // ignore\n }\n }\n this.socket = null;\n this.lastHelloAck = null;\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeoutId);\n pending.reject(new Error(\"Ops socket closed\"));\n }\n this.pendingRequests.clear();\n this.pendingChunks.clear();\n for (const ping of this.pendingPings.values()) {\n clearTimeout(ping.timeoutId);\n ping.reject(new Error(\"Ops socket closed\"));\n }\n this.pendingPings.clear();\n }\n\n async request<T>(command: string, payload?: unknown, opsSessionId?: string, timeoutMs = 30000, leaseId?: string): Promise<T> {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n await this.connect();\n }\n\n const requestId = randomUUID();\n const request: OpsRequest = {\n type: \"ops_request\",\n requestId,\n opsSessionId,\n leaseId,\n command,\n payload\n };\n\n const serialized = JSON.stringify(request);\n if (Buffer.byteLength(serialized) > this.maxPayloadBytes) {\n throw new Error(\"Ops request payload exceeded max size\");\n }\n\n return await new Promise<T>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new Error(\"Ops request timed out\"));\n }, timeoutMs);\n const resolvePending = (value: unknown) => resolve(value as T);\n this.pendingRequests.set(requestId, { resolve: resolvePending, reject, timeoutId });\n try {\n this.sendRaw(serialized);\n } catch (error) {\n clearTimeout(timeoutId);\n this.pendingRequests.delete(requestId);\n reject(error instanceof Error ? error : new Error(\"Ops send failed\"));\n }\n });\n }\n\n private waitForHelloAck(handler: (message: OpsHelloAck) => void, reject: (error: Error) => void): void {\n const onAck = (message: OpsHelloAck) => {\n this.socket?.off(\"close\", onClose);\n this.socket?.off(\"ops_hello_error\", onError);\n handler(message);\n };\n const onError = (message: OpsErrorResponse) => {\n this.socket?.off(\"close\", onClose);\n const error = buildOpsError(message.error);\n reject(error);\n };\n const onClose = () => {\n reject(new Error(\"Ops socket closed before handshake\"));\n };\n this.socket?.once(\"ops_hello_ack\", onAck as unknown as (...args: unknown[]) => void);\n this.socket?.once(\"ops_hello_error\", onError as unknown as (...args: unknown[]) => void);\n this.socket?.once(\"close\", onClose);\n }\n\n private handleMessage(data: WebSocket.RawData): void {\n const message = parseJson(data);\n if (!message || typeof message !== \"object\") {\n return;\n }\n const record = message as Record<string, unknown>;\n const type = record.type;\n\n if (type === \"ops_hello_ack\" && isOpsHelloAck(record)) {\n this.socket?.emit(\"ops_hello_ack\", record);\n return;\n }\n\n if (type === \"ops_pong\" && isOpsPong(record)) {\n const pending = this.pendingPings.get(record.id);\n if (pending) {\n clearTimeout(pending.timeoutId);\n this.pendingPings.delete(record.id);\n pending.resolve();\n this.missedPongs = 0;\n }\n return;\n }\n\n if (type === \"ops_response\" && isOpsResponse(record)) {\n const pending = this.pendingRequests.get(record.requestId);\n if (!pending) return;\n if (record.chunked && record.payloadId && typeof record.totalChunks === \"number\") {\n this.pendingChunks.set(record.payloadId, {\n requestId: record.requestId,\n totalChunks: record.totalChunks,\n chunks: []\n });\n return;\n }\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(record.requestId);\n pending.resolve(record.payload as unknown);\n return;\n }\n\n if (type === \"ops_chunk\" && isOpsChunk(record)) {\n const pendingChunk = this.pendingChunks.get(record.payloadId);\n if (!pendingChunk) return;\n pendingChunk.chunks[record.chunkIndex] = record.data;\n const received = pendingChunk.chunks.filter(Boolean).length;\n if (received >= pendingChunk.totalChunks) {\n this.pendingChunks.delete(record.payloadId);\n const pending = this.pendingRequests.get(pendingChunk.requestId);\n if (!pending) return;\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(pendingChunk.requestId);\n try {\n const merged = pendingChunk.chunks.join(\"\");\n const payload = merged ? JSON.parse(merged) : null;\n pending.resolve(payload as unknown);\n } catch (error) {\n pending.reject(error instanceof Error ? error : new Error(\"Ops chunk parse failed\"));\n }\n }\n return;\n }\n\n if (type === \"ops_error\" && isOpsErrorResponse(record)) {\n if (record.requestId === \"ops_hello\") {\n this.socket?.emit(\"ops_hello_error\", record);\n return;\n }\n const pending = this.pendingRequests.get(record.requestId);\n if (!pending) return;\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(record.requestId);\n pending.reject(buildOpsError(record.error));\n return;\n }\n\n if (type === \"ops_event\" && isOpsEvent(record)) {\n this.onEvent?.(record);\n return;\n }\n }\n\n private handleClose(detail?: { code?: number; reason?: string }): void {\n this.stopHeartbeat();\n this.lastHelloAck = null;\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeoutId);\n pending.reject(new Error(\"Ops socket closed\"));\n }\n this.pendingRequests.clear();\n this.pendingChunks.clear();\n for (const ping of this.pendingPings.values()) {\n clearTimeout(ping.timeoutId);\n ping.reject(new Error(\"Ops socket closed\"));\n }\n this.pendingPings.clear();\n this.onClose?.(detail);\n if (this.autoReconnect && this.shouldReconnectOnClose) {\n this.scheduleReconnect();\n }\n this.shouldReconnectOnClose = true;\n }\n\n private startHeartbeat(): void {\n if (this.heartbeatTimer) return;\n this.heartbeatTimer = setInterval(() => {\n this.sendPing().catch(() => {\n this.missedPongs += 1;\n if (this.missedPongs >= this.maxMissedPongs) {\n this.closeSocket(1011, \"Ops heartbeat missed\", true);\n }\n });\n }, this.pingIntervalMs);\n }\n\n private stopHeartbeat(): void {\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n }\n\n private async sendPing(): Promise<void> {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n return;\n }\n const id = randomUUID();\n const ping: OpsPing = { type: \"ops_ping\", id };\n return await new Promise<void>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pendingPings.delete(id);\n reject(new Error(\"Ops ping timed out\"));\n }, this.pingTimeoutMs);\n this.pendingPings.set(id, { resolve, reject, timeoutId });\n try {\n this.send(ping);\n } catch (error) {\n clearTimeout(timeoutId);\n this.pendingPings.delete(id);\n reject(error instanceof Error ? error : new Error(\"Ops ping failed\"));\n }\n });\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer) return;\n const attempt = this.reconnectAttempts;\n const base = Math.min(this.reconnectMaxDelayMs, this.reconnectBaseDelayMs * Math.pow(2, attempt));\n const jitter = Math.floor(base * (Math.random() * 0.4 - 0.2));\n const delay = Math.max(200, base + jitter);\n this.reconnectAttempts += 1;\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n this.connect().catch(() => {\n this.scheduleReconnect();\n });\n }, delay);\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n }\n\n private closeSocket(code: number, reason: string, allowReconnect: boolean): void {\n this.shouldReconnectOnClose = allowReconnect;\n this.stopHeartbeat();\n if (this.socket) {\n try {\n this.socket.close(code, reason);\n } catch {\n // ignore\n }\n }\n }\n\n private send(payload: unknown): void {\n const serialized = JSON.stringify(payload);\n this.sendRaw(serialized);\n }\n\n private sendRaw(payload: string): void {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n throw new Error(\"Ops socket not connected\");\n }\n this.socket.send(payload);\n }\n}\n\nconst parseJson = (data: WebSocket.RawData): unknown => {\n const text = typeof data === \"string\" ? data : data.toString();\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n};\n\nconst isOpsHelloAck = (value: Record<string, unknown>): value is OpsHelloAck => {\n return value.type === \"ops_hello_ack\" && typeof value.version === \"string\";\n};\n\nconst isOpsPong = (value: Record<string, unknown>): value is OpsPong => {\n return value.type === \"ops_pong\" && typeof value.id === \"string\";\n};\n\nconst isOpsResponse = (value: Record<string, unknown>): value is OpsResponse => {\n return value.type === \"ops_response\" && typeof value.requestId === \"string\";\n};\n\nconst isOpsChunk = (value: Record<string, unknown>): value is OpsChunk => {\n return value.type === \"ops_chunk\" && typeof value.payloadId === \"string\" && typeof value.chunkIndex === \"number\";\n};\n\nconst isOpsErrorResponse = (value: Record<string, unknown>): value is OpsErrorResponse => {\n return value.type === \"ops_error\" && typeof value.requestId === \"string\" && typeof value.error === \"object\";\n};\n\nconst isOpsEvent = (value: Record<string, unknown>): value is OpsEvent => {\n return value.type === \"ops_event\" && typeof value.event === \"string\";\n};\n\nconst buildOpsError = (error: OpsError): Error => {\n const message = `[${error.code}] ${error.message}`;\n const err = new Error(message);\n (err as Error & { code?: string }).code = error.code;\n return err;\n};\n","export type RelayCommand = {\n id: string | number;\n method: \"forwardCDPCommand\";\n params: {\n method: string;\n params?: unknown;\n sessionId?: string;\n };\n};\n\nexport type RelayEvent = {\n method: \"forwardCDPEvent\";\n params: {\n method: string;\n params?: unknown;\n sessionId?: string;\n };\n};\n\nexport type RelayResponse = {\n id: string | number;\n result?: unknown;\n error?: { message: string };\n sessionId?: string;\n};\n\nexport type RelayHandshake = {\n type: \"handshake\";\n payload: {\n tabId: number;\n url?: string;\n title?: string;\n groupId?: number;\n pairingToken?: string;\n };\n};\n\nexport type RelayHandshakeAck = {\n type: \"handshakeAck\";\n payload: {\n instanceId: string;\n relayPort: number;\n pairingRequired: boolean;\n epoch?: number;\n };\n};\n\nexport type RelayHttpStatus = {\n instanceId: string;\n running: boolean;\n port?: number;\n extensionConnected: boolean;\n extensionHandshakeComplete: boolean;\n cdpConnected: boolean;\n annotationConnected: boolean;\n opsConnected: boolean;\n pairingRequired: boolean;\n health?: RelayHealthStatus;\n lastHandshakeError?: RelayHandshakeError;\n};\n\nexport type RelayHttpConfig = {\n relayPort: number;\n pairingRequired: boolean;\n instanceId: string;\n epoch?: number;\n discoveryPort: number | null;\n};\n\nexport type RelayHttpPair = {\n token: string | null;\n instanceId: string;\n epoch?: number;\n};\n\nexport type RelayHandshakeError = {\n code: \"pairing_missing\" | \"pairing_invalid\" | \"rate_limited\" | \"origin_blocked\";\n message: string;\n at: number;\n};\n\nexport const OPS_PROTOCOL_VERSION = \"1\";\nexport const MAX_OPS_PAYLOAD_BYTES = 12 * 1024 * 1024;\nexport const MAX_SNAPSHOT_BYTES = 2 * 1024 * 1024;\n\nexport type ParallelismModeCapsPolicy = {\n managedHeaded: number;\n managedHeadless: number;\n cdpConnectHeaded: number;\n cdpConnectHeadless: number;\n extensionOpsHeaded: number;\n extensionLegacyCdpHeaded: number;\n};\n\nexport type ParallelismGovernorPolicyPayload = {\n floor: number;\n backpressureTimeoutMs: number;\n sampleIntervalMs: number;\n recoveryStableWindows: number;\n hostFreeMemMediumPct: number;\n hostFreeMemHighPct: number;\n hostFreeMemCriticalPct: number;\n rssBudgetMb: number;\n rssSoftPct: number;\n rssHighPct: number;\n rssCriticalPct: number;\n queueAgeHighMs: number;\n queueAgeCriticalMs: number;\n modeCaps: ParallelismModeCapsPolicy;\n};\n\nexport type OpsErrorCode =\n | \"ops_unavailable\"\n | \"invalid_request\"\n | \"invalid_session\"\n | \"not_owner\"\n | \"restricted_url\"\n | \"timeout\"\n | \"not_supported\"\n | \"snapshot_too_large\"\n | \"execution_failed\"\n | \"parallelism_backpressure\"\n | \"cdp_attach_failed\"\n | \"cdp_session_lost\"\n | \"cdp_attach_blocked\";\n\nexport type OpsError = {\n code: OpsErrorCode;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\nexport type OpsHello = {\n type: \"ops_hello\";\n version: string;\n clientId?: string;\n capabilities?: string[];\n maxPayloadBytes?: number;\n};\n\nexport type OpsHelloAck = {\n type: \"ops_hello_ack\";\n version: string;\n clientId?: string;\n capabilities?: string[];\n maxPayloadBytes: number;\n};\n\nexport type OpsPing = {\n type: \"ops_ping\";\n id: string;\n clientId?: string;\n};\n\nexport type OpsPong = {\n type: \"ops_pong\";\n id: string;\n clientId?: string;\n};\n\nexport type OpsRequest = {\n type: \"ops_request\";\n requestId: string;\n clientId?: string;\n opsSessionId?: string;\n leaseId?: string;\n command: string;\n payload?: unknown;\n};\n\nexport type OpsResponse = {\n type: \"ops_response\";\n requestId: string;\n clientId?: string;\n opsSessionId?: string;\n payload?: unknown;\n chunked?: boolean;\n payloadId?: string;\n totalChunks?: number;\n};\n\nexport type OpsErrorResponse = {\n type: \"ops_error\";\n requestId: string;\n clientId?: string;\n opsSessionId?: string;\n error: OpsError;\n};\n\nexport type OpsEventType =\n | \"ops_session_created\"\n | \"ops_session_closed\"\n | \"ops_session_expired\"\n | \"ops_tab_closed\"\n | \"ops_client_disconnected\";\n\nexport type OpsEvent = {\n type: \"ops_event\";\n clientId?: string;\n opsSessionId?: string;\n event: OpsEventType;\n payload?: unknown;\n};\n\nexport type OpsChunk = {\n type: \"ops_chunk\";\n requestId: string;\n clientId?: string;\n opsSessionId?: string;\n payloadId: string;\n chunkIndex: number;\n totalChunks: number;\n data: string;\n};\n\nexport type OpsEnvelope =\n | OpsHello\n | OpsHelloAck\n | OpsPing\n | OpsPong\n | OpsRequest\n | OpsResponse\n | OpsErrorResponse\n | OpsEvent\n | OpsChunk;\n\nexport type RelayHealthReason =\n | \"ok\"\n | \"relay_down\"\n | \"extension_disconnected\"\n | \"handshake_incomplete\"\n | \"pairing_required\"\n | \"pairing_invalid\"\n | \"cdp_disconnected\"\n | \"annotation_disconnected\"\n | \"ops_disconnected\";\n\nexport type RelayHealthStatus = {\n ok: boolean;\n reason: RelayHealthReason;\n detail?: string;\n extensionConnected: boolean;\n extensionHandshakeComplete: boolean;\n cdpConnected: boolean;\n annotationConnected: boolean;\n opsConnected: boolean;\n pairingRequired: boolean;\n lastHandshakeError?: RelayHandshakeError;\n};\n\nexport type RelayPing = {\n type: \"ping\";\n id: string;\n};\n\nexport type RelayPong = {\n type: \"pong\";\n id: string;\n payload: RelayHealthStatus;\n};\n\nexport type RelayHealthCheck = {\n type: \"healthCheck\";\n id: string;\n};\n\nexport type RelayHealthResponse = {\n type: \"healthCheckResult\";\n id: string;\n payload: RelayHealthStatus;\n};\n\nexport type AnnotationScreenshotMode = \"visible\" | \"full\" | \"none\";\n\nexport type AnnotationTransport = \"auto\" | \"direct\" | \"relay\";\n\nexport type AnnotationCommand = {\n version: 1;\n requestId: string;\n command: \"start\" | \"cancel\";\n url?: string;\n tabId?: number;\n options?: {\n screenshotMode?: AnnotationScreenshotMode;\n debug?: boolean;\n context?: string;\n };\n};\n\nexport type AnnotationErrorCode =\n | \"invalid_request\"\n | \"payload_too_large\"\n | \"timeout\"\n | \"direct_unavailable\"\n | \"direct_failed\"\n | \"relay_unavailable\"\n | \"restricted_url\"\n | \"injection_failed\"\n | \"capture_failed\"\n | \"cancelled\"\n | \"unknown\";\n\nexport type AnnotationRect = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport type AnnotationStyle = {\n color?: string;\n backgroundColor?: string;\n fontSize?: string;\n fontFamily?: string;\n fontWeight?: string;\n lineHeight?: string;\n display?: string;\n position?: string;\n};\n\nexport type AnnotationA11y = {\n role?: string;\n label?: string;\n labelledBy?: string;\n describedBy?: string;\n hidden?: boolean;\n};\n\nexport type AnnotationDebug = {\n computedStyles?: Record<string, string>;\n cssVariables?: Record<string, string>;\n parentChain?: Array<{\n tag: string;\n id?: string;\n classes?: string[];\n role?: string;\n }>;\n};\n\nexport type AnnotationItem = {\n id: string;\n selector: string;\n tag: string;\n idAttr?: string;\n classes?: string[];\n text?: string;\n rect: AnnotationRect;\n attributes: Record<string, string>;\n a11y: AnnotationA11y;\n styles: AnnotationStyle;\n note?: string;\n screenshotId?: string;\n debug?: AnnotationDebug;\n};\n\nexport type AnnotationScreenshot = {\n id: string;\n label: string;\n base64: string;\n mime: \"image/png\";\n width?: number;\n height?: number;\n};\n\nexport type AnnotationPayload = {\n url: string;\n title?: string;\n timestamp: string;\n context?: string;\n screenshotMode: AnnotationScreenshotMode;\n screenshots?: AnnotationScreenshot[];\n annotations: AnnotationItem[];\n};\n\nexport type AnnotationResponse = {\n version: 1;\n requestId: string;\n status: \"ok\" | \"cancelled\" | \"error\";\n error?: { code: AnnotationErrorCode; message: string };\n payload?: AnnotationPayload;\n};\n\nexport type AnnotationEvent = {\n version: 1;\n requestId: string;\n event: \"progress\" | \"ready\" | \"warning\";\n message?: string;\n};\n\nexport type RelayAnnotationCommand = {\n type: \"annotationCommand\";\n payload: AnnotationCommand;\n};\n\nexport type RelayAnnotationResponse = {\n type: \"annotationResponse\";\n payload: AnnotationResponse;\n};\n\nexport type RelayAnnotationEvent = {\n type: \"annotationEvent\";\n payload: AnnotationEvent;\n};\n","import { randomUUID } from \"crypto\";\nimport { WebSocket } from \"ws\";\nimport type { OpenDevBrowserConfig } from \"../config\";\nimport { resolveDirectAnnotateAssets, runDirectAnnotate } from \"../annotate/direct-annotator\";\nimport type { RelayLike } from \"../relay/relay-types\";\nimport { resolveRelayEndpoint } from \"../relay/relay-endpoints\";\nimport type { BrowserManagerLike } from \"./manager-types\";\nimport type {\n AnnotationCommand,\n AnnotationResponse,\n AnnotationScreenshotMode,\n AnnotationTransport,\n RelayAnnotationCommand,\n RelayAnnotationEvent,\n RelayAnnotationResponse\n} from \"../relay/protocol\";\n\nexport type AnnotationRequestOptions = {\n sessionId?: string;\n targetId?: string;\n tabId?: number;\n transport?: AnnotationTransport;\n url?: string;\n screenshotMode?: AnnotationScreenshotMode;\n debug?: boolean;\n context?: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n};\n\nexport class AnnotationManager {\n private relay: RelayLike | undefined;\n private config: OpenDevBrowserConfig;\n private manager?: BrowserManagerLike;\n\n constructor(relay: RelayLike | undefined, config: OpenDevBrowserConfig, manager?: BrowserManagerLike) {\n this.relay = relay;\n this.config = config;\n this.manager = manager;\n }\n\n setRelay(relay: RelayLike | undefined): void {\n this.relay = relay;\n }\n\n setBrowserManager(manager?: BrowserManagerLike): void {\n this.manager = manager;\n }\n\n async requestAnnotation(options: AnnotationRequestOptions): Promise<AnnotationResponse> {\n const transport = options.transport ?? \"auto\";\n\n if (transport === \"relay\") {\n return this.requestRelay(options, true);\n }\n\n if (transport === \"direct\") {\n return this.requestDirect(options);\n }\n\n if (options.sessionId) {\n const directResult = await this.requestDirect(options);\n if (directResult.status === \"ok\" || directResult.status === \"cancelled\") {\n return directResult;\n }\n if (directResult.error?.code === \"direct_unavailable\" || directResult.error?.code === \"direct_failed\") {\n const canFallback = await this.canFallbackToRelay(options.sessionId);\n if (canFallback) {\n return this.requestRelay(options, true);\n }\n }\n return directResult;\n }\n\n return this.requestRelay(options, false);\n }\n\n private async canFallbackToRelay(sessionId: string): Promise<boolean> {\n if (!this.manager) {\n return false;\n }\n try {\n const status = await this.manager.status(sessionId);\n if (status.mode !== \"extension\") {\n return false;\n }\n } catch {\n return false;\n }\n return Boolean(this.getRelayEndpoint());\n }\n\n private getRelayEndpoint(): string | null {\n return this.relay?.getAnnotationUrl?.()\n ?? (this.config.relayPort > 0 ? `ws://127.0.0.1:${this.config.relayPort}/annotation` : null);\n }\n\n private async requestDirect(options: AnnotationRequestOptions): Promise<AnnotationResponse> {\n const requestId = randomUUID();\n if (!options.sessionId) {\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"direct_unavailable\", message: \"Direct annotate requires sessionId.\" }\n };\n }\n\n if (!this.manager) {\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"direct_unavailable\", message: \"Direct annotate unavailable for this session.\" }\n };\n }\n\n const assetsResult = resolveDirectAnnotateAssets();\n if (!assetsResult.assets) {\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"direct_unavailable\", message: assetsResult.error ?? \"Direct annotate unavailable.\" }\n };\n }\n\n try {\n return await runDirectAnnotate(this.manager, assetsResult.assets, {\n sessionId: options.sessionId,\n targetId: options.targetId,\n url: options.url,\n screenshotMode: options.screenshotMode,\n debug: options.debug,\n context: options.context,\n timeoutMs: options.timeoutMs,\n signal: options.signal\n });\n } catch (error) {\n const detail = error instanceof Error ? error.message : \"Direct annotate failed.\";\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"direct_failed\", message: detail }\n };\n }\n }\n\n private async requestRelay(options: AnnotationRequestOptions, requireExtension: boolean): Promise<AnnotationResponse> {\n const requestId = randomUUID();\n const timeoutMs = options.timeoutMs ?? 120_000;\n\n const baseEndpoint = this.getRelayEndpoint();\n if (!baseEndpoint) {\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"relay_unavailable\", message: \"Annotation relay unavailable. Start the daemon and retry.\" }\n };\n }\n\n if (requireExtension && options.sessionId && this.manager) {\n try {\n const status = await this.manager.status(options.sessionId);\n if (status.mode !== \"extension\") {\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"invalid_request\", message: \"Relay annotations require extension mode.\" }\n };\n }\n } catch (error) {\n const detail = error instanceof Error ? error.message : \"Annotation session unavailable.\";\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"invalid_request\", message: detail }\n };\n }\n }\n\n const { connectEndpoint } = await resolveRelayEndpoint({\n wsEndpoint: baseEndpoint,\n path: \"annotation\",\n config: this.config\n });\n\n const socket = new WebSocket(connectEndpoint);\n try {\n await waitForSocketOpen(socket, 3000);\n } catch (error) {\n const detail = error instanceof Error ? error.message : \"Relay unavailable\";\n socket.removeAllListeners();\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close(1000, \"Annotation socket open failed\");\n }\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"relay_unavailable\", message: detail }\n };\n }\n\n const command: AnnotationCommand = {\n version: 1,\n requestId,\n command: \"start\",\n url: options.url,\n tabId: options.tabId,\n options: {\n screenshotMode: options.screenshotMode,\n debug: options.debug,\n context: options.context\n }\n };\n\n const relayCommand: RelayAnnotationCommand = {\n type: \"annotationCommand\",\n payload: command\n };\n\n const cleanup = () => {\n socket.removeAllListeners();\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close(1000, \"Annotation complete\");\n }\n };\n\n const responsePromise = new Promise<AnnotationResponse>((resolve, reject) => {\n socket.on(\"message\", (data) => {\n const message = parseJson(data);\n if (!message || typeof message !== \"object\") return;\n const record = message as Record<string, unknown>;\n if (record.type === \"annotationResponse\") {\n const response = record as RelayAnnotationResponse;\n if (response.payload?.requestId === requestId) {\n resolve(response.payload);\n }\n } else if (record.type === \"annotationEvent\") {\n const event = record as RelayAnnotationEvent;\n if (event.payload?.requestId === requestId) {\n return;\n }\n }\n });\n socket.on(\"error\", (error) => reject(error));\n socket.on(\"close\", () => reject(new Error(\"Relay closed annotation socket\")));\n });\n\n const timeoutPromise = new Promise<AnnotationResponse>((resolve) => {\n const id = setTimeout(() => {\n clearTimeout(id);\n resolve({\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"timeout\", message: \"Annotation request timed out.\" }\n });\n }, timeoutMs);\n });\n\n const abortPromise = new Promise<AnnotationResponse>((resolve) => {\n if (!options.signal) return;\n if (options.signal.aborted) {\n resolve({\n version: 1,\n requestId,\n status: \"cancelled\",\n error: { code: \"cancelled\", message: \"Annotation request cancelled.\" }\n });\n return;\n }\n const onAbort = () => {\n resolve({\n version: 1,\n requestId,\n status: \"cancelled\",\n error: { code: \"cancelled\", message: \"Annotation request cancelled.\" }\n });\n };\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n\n socket.send(JSON.stringify(relayCommand));\n\n try {\n const result = await Promise.race([responsePromise, timeoutPromise, abortPromise]);\n if (result.status !== \"ok\") {\n sendCancel(socket, requestId);\n }\n return result;\n } catch (error) {\n const detail = error instanceof Error ? error.message : \"Relay unavailable\";\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"relay_unavailable\", message: detail }\n };\n } finally {\n cleanup();\n }\n }\n}\n\nconst waitForSocketOpen = (socket: WebSocket, timeoutMs: number): Promise<void> => {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"Annotation socket open timed out\"));\n }, timeoutMs);\n socket.once(\"open\", () => {\n clearTimeout(timeout);\n resolve();\n });\n socket.once(\"error\", (error) => {\n clearTimeout(timeout);\n reject(error);\n });\n });\n};\n\nconst sendCancel = (socket: WebSocket, requestId: string): void => {\n if (socket.readyState !== WebSocket.OPEN) return;\n const command: AnnotationCommand = {\n version: 1,\n requestId,\n command: \"cancel\"\n };\n const relayCommand: RelayAnnotationCommand = {\n type: \"annotationCommand\",\n payload: command\n };\n socket.send(JSON.stringify(relayCommand));\n};\n\nconst parseJson = (data: WebSocket.RawData): unknown => {\n const text = typeof data === \"string\" ? data : data.toString();\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n};\n","import { randomUUID } from \"crypto\";\nimport { existsSync } from \"fs\";\nimport { join } from \"path\";\nimport type { Page } from \"playwright-core\";\nimport type { BrowserManagerLike } from \"../browser/manager-types\";\nimport { getExtensionPath } from \"../extension-extractor\";\nimport type {\n AnnotationErrorCode,\n AnnotationPayload,\n AnnotationResponse,\n AnnotationScreenshotMode\n} from \"../relay/protocol\";\n\nexport type DirectAnnotateAssets = {\n scriptPath: string;\n stylePath: string;\n};\n\nexport type DirectAnnotateRequest = {\n sessionId: string;\n targetId?: string;\n url?: string;\n screenshotMode?: AnnotationScreenshotMode;\n debug?: boolean;\n context?: string;\n timeoutMs?: number;\n signal?: AbortSignal;\n};\n\ntype DirectCompletionMessage =\n | { type: \"annotation:complete\"; requestId: string; payload: AnnotationPayload }\n | { type: \"annotation:error\"; requestId: string; error: { code: AnnotationErrorCode; message: string } }\n | { type: \"annotation:cancelled\"; requestId: string };\n\ntype DirectDispatchRuntime = {\n dispatch: (message: Record<string, unknown>) => unknown;\n};\n\nconst DEFAULT_TIMEOUT_MS = 120_000;\nconst bindingState = new WeakSet<Page>();\nconst completionMap = new WeakMap<Page, Map<string, (message: DirectCompletionMessage) => void>>();\n\nexport function resolveDirectAnnotateAssets(\n resolvePath: () => string | null = getExtensionPath\n): { assets?: DirectAnnotateAssets; error?: string } {\n const extensionPath = resolvePath();\n if (!extensionPath) {\n return { error: \"Extension assets unavailable.\" };\n }\n const scriptPath = join(extensionPath, \"dist\", \"annotate-content.js\");\n const stylePath = join(extensionPath, \"dist\", \"annotate-content.css\");\n if (!existsSync(scriptPath) || !existsSync(stylePath)) {\n return { error: \"Direct annotate assets missing. Run `npm run extension:build` and retry.\" };\n }\n return { assets: { scriptPath, stylePath } };\n}\n\nexport async function runDirectAnnotate(\n manager: BrowserManagerLike,\n assets: DirectAnnotateAssets,\n request: DirectAnnotateRequest\n): Promise<AnnotationResponse> {\n const requestId = randomUUID();\n const timeoutMs = request.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n return manager.withPage(request.sessionId, request.targetId ?? null, async (page) => {\n await ensureBindings(page);\n await ensureShim(page);\n\n if (request.url) {\n await page.goto(request.url, { waitUntil: \"load\" });\n }\n\n await injectAssets(page, assets);\n await ensureAnnotationReady(page);\n\n const completionHandlers = getCompletionMap(page);\n const responsePromise = new Promise<AnnotationResponse>((resolve) => {\n completionHandlers.set(requestId, (message) => {\n resolve(mapCompletionToResponse(message, requestId));\n });\n });\n\n const timeoutPromise = new Promise<AnnotationResponse>((resolve) => {\n const timeoutId = setTimeout(() => {\n clearTimeout(timeoutId);\n resolve({\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"timeout\", message: \"Annotation request timed out.\" }\n });\n }, timeoutMs);\n });\n\n const abortPromise = new Promise<AnnotationResponse>((resolve) => {\n if (!request.signal) return;\n if (request.signal.aborted) {\n resolve({\n version: 1,\n requestId,\n status: \"cancelled\",\n error: { code: \"cancelled\", message: \"Annotation request cancelled.\" }\n });\n return;\n }\n const onAbort = () => {\n resolve({\n version: 1,\n requestId,\n status: \"cancelled\",\n error: { code: \"cancelled\", message: \"Annotation request cancelled.\" }\n });\n };\n request.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n\n await dispatchMessage(page, {\n type: \"annotation:start\",\n requestId,\n options: {\n screenshotMode: request.screenshotMode ?? \"visible\",\n debug: request.debug,\n context: request.context\n },\n url: request.url\n });\n\n const result = await Promise.race([responsePromise, timeoutPromise, abortPromise]);\n completionHandlers.delete(requestId);\n\n if (result.status !== \"ok\" && (result.error?.code === \"timeout\" || result.status === \"cancelled\")) {\n await dispatchMessage(page, { type: \"annotation:cancel\", requestId });\n }\n\n return result;\n });\n}\n\nfunction getCompletionMap(page: Page): Map<string, (message: DirectCompletionMessage) => void> {\n let existing = completionMap.get(page);\n if (!existing) {\n existing = new Map();\n completionMap.set(page, existing);\n }\n return existing;\n}\n\nasync function ensureBindings(page: Page): Promise<void> {\n if (!bindingState.has(page)) {\n try {\n await page.exposeBinding(\"__odbDirectCapture\", async (_source, _mode: AnnotationScreenshotMode) => {\n const buffer = await page.screenshot({ type: \"png\", fullPage: false });\n const base64 = buffer.toString(\"base64\");\n return `data:image/png;base64,${base64}`;\n });\n } catch (error) {\n if (!isBindingExistsError(error)) {\n throw error;\n }\n }\n\n try {\n await page.exposeBinding(\"__odbDirectComplete\", (_source, message: DirectCompletionMessage) => {\n if (!message || typeof message !== \"object\") return;\n const requestId = (message as DirectCompletionMessage).requestId;\n if (!requestId) return;\n const handlers = completionMap.get(page);\n const handler = handlers?.get(requestId);\n if (handler) {\n handler(message as DirectCompletionMessage);\n handlers?.delete(requestId);\n }\n });\n } catch (error) {\n if (!isBindingExistsError(error)) {\n throw error;\n }\n }\n\n bindingState.add(page);\n }\n}\n\nasync function ensureShim(page: Page): Promise<void> {\n await page.addInitScript(installShim);\n await page.evaluate(installShim);\n}\n\nfunction installShim(): void {\n const w = window as unknown as {\n chrome?: { runtime?: Record<string, unknown> };\n __odbDirectShim?: boolean;\n __odbDirectRuntime?: DirectDispatchRuntime;\n __odbDirectCapture?: (mode: AnnotationScreenshotMode) => Promise<string>;\n __odbDirectComplete?: (message: DirectCompletionMessage) => void;\n };\n if (w.__odbDirectShim) return;\n const listeners = new Set<(...args: unknown[]) => unknown>();\n\n const runtime = {\n onMessage: {\n addListener: (listener: (...args: unknown[]) => unknown) => {\n listeners.add(listener);\n }\n },\n sendMessage: (message: { type?: string; mode?: AnnotationScreenshotMode }, callback?: (response: Record<string, unknown>) => void) => {\n const type = message?.type ?? \"\";\n if (type === \"annotation:capture\") {\n const capture = w.__odbDirectCapture;\n if (!capture) {\n callback?.({ ok: false, error: \"Capture binding unavailable\" });\n return;\n }\n Promise.resolve(capture(message.mode ?? \"visible\"))\n .then((dataUrl) => {\n callback?.({ ok: true, dataUrl });\n })\n .catch((error) => {\n const detail = error instanceof Error ? error.message : \"Capture failed\";\n callback?.({ ok: false, error: detail });\n });\n return;\n }\n if (type === \"annotation:complete\" || type === \"annotation:error\" || type === \"annotation:cancelled\") {\n try {\n w.__odbDirectComplete?.(message as DirectCompletionMessage);\n } catch {\n // Ignore completion routing errors.\n }\n callback?.({ ok: true });\n return;\n }\n\n let responseSent = false;\n const sendResponse = (response: Record<string, unknown>) => {\n if (responseSent) return;\n responseSent = true;\n callback?.(response);\n };\n\n for (const listener of listeners) {\n try {\n listener(message, undefined, sendResponse);\n } catch {\n // ignore listener errors\n }\n }\n\n if (!responseSent) {\n callback?.({ ok: true });\n }\n }\n };\n\n const chromeRoot = w.chrome ?? {};\n chromeRoot.runtime = runtime;\n w.chrome = chromeRoot;\n\n w.__odbDirectRuntime = {\n dispatch: (message: Record<string, unknown>) => {\n let response: unknown = null;\n const sendResponse = (value: unknown) => {\n response = value;\n };\n for (const listener of listeners) {\n try {\n listener(message, undefined, sendResponse);\n } catch {\n // ignore listener errors\n }\n }\n return response;\n }\n };\n\n w.__odbDirectShim = true;\n}\n\nasync function injectAssets(page: Page, assets: DirectAnnotateAssets): Promise<void> {\n await page.addStyleTag({ path: assets.stylePath });\n await page.addScriptTag({ path: assets.scriptPath });\n}\n\nasync function ensureAnnotationReady(page: Page): Promise<void> {\n const response = await dispatchMessage(page, { type: \"annotation:ping\" });\n if (!response || typeof response !== \"object\" || (response as { ok?: boolean }).ok !== true) {\n throw new Error(\"Annotation content script unavailable\");\n }\n}\n\nasync function dispatchMessage(page: Page, message: Record<string, unknown>): Promise<unknown> {\n return await page.evaluate((payload) => {\n const runtime = (window as unknown as { __odbDirectRuntime?: DirectDispatchRuntime }).__odbDirectRuntime;\n if (!runtime?.dispatch) {\n throw new Error(\"Direct annotation runtime missing\");\n }\n return runtime.dispatch(payload);\n }, message);\n}\n\nfunction mapCompletionToResponse(message: DirectCompletionMessage, requestId: string): AnnotationResponse {\n if (message.type === \"annotation:complete\") {\n return {\n version: 1,\n requestId,\n status: \"ok\",\n payload: message.payload\n };\n }\n if (message.type === \"annotation:cancelled\") {\n return {\n version: 1,\n requestId,\n status: \"cancelled\",\n error: { code: \"cancelled\", message: \"Annotation cancelled.\" }\n };\n }\n return {\n version: 1,\n requestId,\n status: \"error\",\n error: {\n code: message.error?.code ?? \"unknown\",\n message: message.error?.message ?? \"Annotation failed.\"\n }\n };\n}\n\nfunction isBindingExistsError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return message.toLowerCase().includes(\"already registered\") || message.toLowerCase().includes(\"has been already exposed\");\n}\n","import { z } from \"zod\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { parse as parseJsonc, modify, applyEdits } from \"jsonc-parser\";\nimport { generateSecureToken } from \"./utils/crypto\";\nimport { writeFileAtomic } from \"./utils/fs\";\nimport type {\n ProviderCookieImportRecord,\n ProviderCookiePolicy,\n ProviderCookieSourceConfig\n} from \"./providers/types\";\n\nfunction isExecutable(filePath: string): boolean {\n try {\n fs.accessSync(filePath, fs.constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport type SnapshotConfig = {\n maxChars: number;\n maxNodes: number;\n};\n\nexport type SecurityConfig = {\n allowRawCDP: boolean;\n allowNonLocalCdp: boolean;\n allowUnsafeExport: boolean;\n promptInjectionGuard?: {\n enabled: boolean;\n };\n};\n\nexport type DevtoolsConfig = {\n showFullUrls: boolean;\n showFullConsole: boolean;\n};\n\nexport type ExportConfig = {\n maxNodes: number;\n inlineStyles: boolean;\n};\n\nexport type BlockerArtifactCapsConfig = {\n maxNetworkEvents: number;\n maxConsoleEvents: number;\n maxExceptionEvents: number;\n maxHosts: number;\n maxTextLength: number;\n};\n\nexport type SkillsNudgeConfig = {\n enabled: boolean;\n keywords: string[];\n maxAgeMs: number;\n};\n\nexport type SkillsConfig = {\n nudge: SkillsNudgeConfig;\n};\n\nexport type ContinuityNudgeConfig = {\n enabled: boolean;\n keywords: string[];\n maxAgeMs: number;\n};\n\nexport type ContinuityConfig = {\n enabled: boolean;\n filePath: string;\n nudge: ContinuityNudgeConfig;\n};\n\nexport type FingerprintTier1Config = {\n enabled: boolean;\n warnOnly: boolean;\n locale?: string;\n timezone?: string;\n languages: string[];\n requireProxy: boolean;\n geolocation?: {\n latitude: number;\n longitude: number;\n accuracy: number;\n };\n geolocationRequired: boolean;\n};\n\nexport type FingerprintTier2Config = {\n enabled: boolean;\n mode: \"deterministic\" | \"adaptive\";\n continuousSignals: boolean;\n rotationIntervalMs: number;\n challengePatterns: string[];\n maxChallengeEvents: number;\n scorePenalty: number;\n scoreRecovery: number;\n rotationHealthThreshold: number;\n};\n\nexport type FingerprintTier3CanaryConfig = {\n windowSize: number;\n minSamples: number;\n promoteThreshold: number;\n rollbackThreshold: number;\n};\n\nexport type FingerprintTier3Config = {\n enabled: boolean;\n continuousSignals: boolean;\n fallbackTier: \"tier1\" | \"tier2\";\n canary: FingerprintTier3CanaryConfig;\n};\n\nexport type FingerprintConfig = {\n tier1: FingerprintTier1Config;\n tier2: FingerprintTier2Config;\n tier3: FingerprintTier3Config;\n};\n\nexport type ProvidersTierConfig = {\n default: \"A\" | \"B\" | \"C\";\n enableHybrid: boolean;\n enableRestrictedSafe: boolean;\n hybridRiskThreshold: number;\n restrictedSafeRecoveryIntervalMs: number;\n};\n\nexport type ProvidersAdaptiveConcurrencyConfig = {\n enabled: boolean;\n maxGlobal: number;\n maxPerDomain: number;\n};\n\nexport type ProvidersCrawlerConfig = {\n workerThreads: number;\n queueMax: number;\n};\n\nexport type ProvidersAntiBotPolicyConfig = {\n enabled: boolean;\n cooldownMs: number;\n maxChallengeRetries: number;\n proxyHint?: string;\n sessionHint?: string;\n allowBrowserEscalation: boolean;\n};\n\nexport type ProvidersTranscriptConfig = {\n modeDefault: \"auto\" | \"web\" | \"no-auto\" | \"yt-dlp\" | \"apify\";\n strategyOrder: Array<\n \"youtubei\"\n | \"native_caption_parse\"\n | \"ytdlp_audio_asr\"\n | \"apify\"\n | \"ytdlp_subtitle\"\n | \"optional_asr\"\n >;\n enableYtdlp: boolean;\n enableAsr: boolean;\n enableYtdlpAudioAsr: boolean;\n enableApify: boolean;\n apifyActorId: string;\n enableBrowserFallback: boolean;\n ytdlpTimeoutMs: number;\n};\n\nexport type ProvidersConfig = {\n tiers: ProvidersTierConfig;\n adaptiveConcurrency: ProvidersAdaptiveConcurrencyConfig;\n crawler: ProvidersCrawlerConfig;\n antiBotPolicy: ProvidersAntiBotPolicyConfig;\n transcript: ProvidersTranscriptConfig;\n cookiePolicy?: ProviderCookiePolicy;\n cookieSource?: ProviderCookieSourceConfig;\n};\n\nexport type CanaryConfig = {\n targets: {\n enabled: boolean;\n };\n};\n\nexport type ParallelModeCapsConfig = {\n managedHeaded: number;\n managedHeadless: number;\n cdpConnectHeaded: number;\n cdpConnectHeadless: number;\n extensionOpsHeaded: number;\n extensionLegacyCdpHeaded: number;\n};\n\nexport type ParallelismGovernorConfig = {\n floor: number;\n backpressureTimeoutMs: number;\n sampleIntervalMs: number;\n recoveryStableWindows: number;\n hostFreeMemMediumPct: number;\n hostFreeMemHighPct: number;\n hostFreeMemCriticalPct: number;\n rssBudgetMb: number;\n rssSoftPct: number;\n rssHighPct: number;\n rssCriticalPct: number;\n queueAgeHighMs: number;\n queueAgeCriticalMs: number;\n modeCaps: ParallelModeCapsConfig;\n};\n\nexport type OpenDevBrowserConfig = {\n headless: boolean;\n profile: string;\n snapshot: SnapshotConfig;\n security: SecurityConfig;\n blockerDetectionThreshold: number;\n blockerResolutionTimeoutMs: number;\n blockerArtifactCaps: BlockerArtifactCapsConfig;\n providers?: ProvidersConfig;\n devtools: DevtoolsConfig;\n fingerprint: FingerprintConfig;\n canary?: CanaryConfig;\n export: ExportConfig;\n parallelism: ParallelismGovernorConfig;\n skills: SkillsConfig;\n continuity: ContinuityConfig;\n relayPort: number;\n relayToken: string | false;\n nativeExtensionId?: string;\n daemonPort: number;\n daemonToken: string;\n chromePath?: string;\n flags: string[];\n checkForUpdates: boolean;\n persistProfile: boolean;\n skillPaths: string[];\n};\n\nconst DEFAULT_RELAY_PORT = 8787;\nconst DEFAULT_DAEMON_PORT = 8788;\n\nfunction buildDefaultConfigJsonc(relayToken: string, daemonToken: string): string {\n return `{\n // Set relayToken to false to disable extension pairing.\n \"relayPort\": ${DEFAULT_RELAY_PORT},\n \"relayToken\": \"${relayToken}\",\n // Optional: extension ID for native host auto-install.\n // \"nativeExtensionId\": \"abcdefghijklmnopabcdefghijklmnop\",\n \"daemonPort\": ${DEFAULT_DAEMON_PORT},\n \"daemonToken\": \"${daemonToken}\"\n}\n`;\n}\n\nconst snapshotSchema = z.object({\n maxChars: z.number().int().min(500).max(200000).default(16000),\n maxNodes: z.number().int().min(50).max(5000).default(1000)\n});\n\nconst securitySchema = z.object({\n allowRawCDP: z.boolean().default(false),\n allowNonLocalCdp: z.boolean().default(false),\n allowUnsafeExport: z.boolean().default(false),\n promptInjectionGuard: z.object({\n enabled: z.boolean().default(true)\n }).default({})\n});\n\nconst DEFAULT_PROVIDER_COOKIE_FILE = \"~/.config/opencode/opendevbrowser.provider-cookies.json\";\nconst DEFAULT_PROVIDER_COOKIE_ENV = \"OPENDEVBROWSER_PROVIDER_COOKIES\";\n\nconst providerCookieRecordSchema: z.ZodType<ProviderCookieImportRecord> = z.object({\n name: z.string().min(1),\n value: z.string(),\n url: z.string().min(1).optional(),\n domain: z.string().min(1).optional(),\n path: z.string().optional(),\n expires: z.number().optional(),\n httpOnly: z.boolean().optional(),\n secure: z.boolean().optional(),\n sameSite: z.enum([\"Strict\", \"Lax\", \"None\"]).optional()\n}).superRefine((cookie, ctx) => {\n if (!cookie.url && !cookie.domain) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Provider cookie entries must set url or domain.\"\n });\n }\n});\n\nconst providersSchema = z.object({\n tiers: z.object({\n default: z.enum([\"A\", \"B\", \"C\"]).default(\"A\"),\n enableHybrid: z.boolean().default(false),\n enableRestrictedSafe: z.boolean().default(false),\n hybridRiskThreshold: z.number().min(0).max(1).default(0.6),\n restrictedSafeRecoveryIntervalMs: z.number().int().min(0).max(86_400_000).default(60000)\n }).default({}),\n adaptiveConcurrency: z.object({\n enabled: z.boolean().default(false),\n maxGlobal: z.number().int().min(1).max(512).default(8),\n maxPerDomain: z.number().int().min(1).max(256).default(4)\n }).default({}),\n crawler: z.object({\n workerThreads: z.number().int().min(1).max(64).default(4),\n queueMax: z.number().int().min(1).max(100000).default(2000)\n }).default({}),\n antiBotPolicy: z.object({\n enabled: z.boolean().default(true),\n cooldownMs: z.number().int().min(0).max(300000).default(30000),\n maxChallengeRetries: z.number().int().min(0).max(10).default(1),\n proxyHint: z.string().min(1).optional(),\n sessionHint: z.string().min(1).optional(),\n allowBrowserEscalation: z.boolean().default(true)\n }).default({}),\n transcript: z.object({\n modeDefault: z.union([\n z.enum([\"auto\", \"web\", \"no-auto\", \"yt-dlp\", \"apify\"]),\n z.literal(\"ytdlp\")\n ])\n .default(\"auto\")\n .transform((mode) => mode === \"ytdlp\" ? \"yt-dlp\" : mode),\n strategyOrder: z.array(z.enum([\n \"youtubei\",\n \"native_caption_parse\",\n \"ytdlp_audio_asr\",\n \"apify\",\n \"ytdlp_subtitle\",\n \"optional_asr\"\n ]))\n .default([\"youtubei\", \"native_caption_parse\", \"ytdlp_audio_asr\", \"apify\"]),\n enableYtdlp: z.boolean().default(false),\n enableAsr: z.boolean().default(false),\n enableYtdlpAudioAsr: z.boolean().default(true),\n enableApify: z.boolean().default(true),\n apifyActorId: z.string().min(1).default(\"streamers/youtube-scraper\"),\n enableBrowserFallback: z.boolean().default(true),\n ytdlpTimeoutMs: z.number().int().min(1000).max(120000).default(10000)\n }).default({}),\n cookiePolicy: z.enum([\"off\", \"auto\", \"required\"]).default(\"auto\"),\n cookieSource: z.object({\n type: z.enum([\"file\", \"env\", \"inline\"]).default(\"file\"),\n value: z.union([\n z.string(),\n z.array(providerCookieRecordSchema)\n ]).optional()\n }).transform((raw): ProviderCookieSourceConfig => {\n if (raw.type === \"inline\") {\n return {\n type: \"inline\",\n value: Array.isArray(raw.value) ? raw.value : []\n };\n }\n return {\n type: raw.type,\n value: typeof raw.value === \"string\"\n ? raw.value\n : raw.type === \"file\"\n ? DEFAULT_PROVIDER_COOKIE_FILE\n : DEFAULT_PROVIDER_COOKIE_ENV\n };\n }).default({\n type: \"file\",\n value: DEFAULT_PROVIDER_COOKIE_FILE\n })\n}).default({});\n\nconst canarySchema = z.object({\n targets: z.object({\n enabled: z.boolean().default(false)\n }).default({})\n});\n\nconst devtoolsSchema = z.object({\n showFullUrls: z.boolean().default(false),\n showFullConsole: z.boolean().default(false)\n});\n\nconst exportSchema = z.object({\n maxNodes: z.number().int().min(1).max(5000).default(1000),\n inlineStyles: z.boolean().default(true)\n});\n\nconst parallelismSchema = z.object({\n floor: z.number().int().min(1).max(32).default(1),\n backpressureTimeoutMs: z.number().int().min(100).max(120000).default(5000),\n sampleIntervalMs: z.number().int().min(250).max(60000).default(2000),\n recoveryStableWindows: z.number().int().min(1).max(20).default(3),\n hostFreeMemMediumPct: z.number().int().min(1).max(99).default(25),\n hostFreeMemHighPct: z.number().int().min(1).max(99).default(18),\n hostFreeMemCriticalPct: z.number().int().min(1).max(99).default(10),\n rssBudgetMb: z.number().int().min(64).max(65536).default(2048),\n rssSoftPct: z.number().int().min(1).max(99).default(65),\n rssHighPct: z.number().int().min(1).max(99).default(75),\n rssCriticalPct: z.number().int().min(1).max(99).default(85),\n queueAgeHighMs: z.number().int().min(100).max(120000).default(2000),\n queueAgeCriticalMs: z.number().int().min(100).max(120000).default(5000),\n modeCaps: z.object({\n managedHeaded: z.number().int().min(1).max(64).default(6),\n managedHeadless: z.number().int().min(1).max(64).default(8),\n cdpConnectHeaded: z.number().int().min(1).max(64).default(6),\n cdpConnectHeadless: z.number().int().min(1).max(64).default(8),\n extensionOpsHeaded: z.number().int().min(1).max(64).default(6),\n extensionLegacyCdpHeaded: z.number().int().min(1).max(64).default(1)\n }).default({})\n}).default({});\n\nconst blockerArtifactCapsSchema = z.object({\n maxNetworkEvents: z.number().int().min(1).max(500).default(20),\n maxConsoleEvents: z.number().int().min(1).max(500).default(20),\n maxExceptionEvents: z.number().int().min(1).max(200).default(10),\n maxHosts: z.number().int().min(1).max(200).default(10),\n maxTextLength: z.number().int().min(32).max(4096).default(512)\n}).default({});\n\nconst skillsNudgeSchema = z.object({\n enabled: z.boolean().default(true),\n keywords: z.array(z.string()).default([\n \"quick start\",\n \"getting started\",\n \"launch\",\n \"connect\",\n \"setup\"\n ]),\n maxAgeMs: z.number().int().min(1000).max(600000).default(60000)\n});\n\nconst skillsSchema = z.object({\n nudge: skillsNudgeSchema.default({})\n}).default({});\n\nconst continuityNudgeSchema = z.object({\n enabled: z.boolean().default(true),\n keywords: z.array(z.string()).default([\n \"plan\",\n \"multi-step\",\n \"multi step\",\n \"long-running\",\n \"long running\",\n \"refactor\",\n \"migration\",\n \"rollout\",\n \"release\",\n \"upgrade\",\n \"investigate\",\n \"follow-up\",\n \"continue\"\n ]),\n maxAgeMs: z.number().int().min(1000).max(600000).default(60000)\n});\n\nconst continuitySchema = z.object({\n enabled: z.boolean().default(true),\n filePath: z.string().min(1).default(\"opendevbrowser_continuity.md\"),\n nudge: continuityNudgeSchema.default({})\n}).default({});\n\nconst tier1GeolocationSchema = z.object({\n latitude: z.number().min(-90).max(90),\n longitude: z.number().min(-180).max(180),\n accuracy: z.number().min(1).max(10000).default(50)\n});\n\nconst fingerprintTier1Schema = z.object({\n enabled: z.boolean().default(true),\n warnOnly: z.boolean().default(true),\n locale: z.string().min(2).optional(),\n timezone: z.string().min(2).optional(),\n languages: z.array(z.string().min(2)).default([]),\n requireProxy: z.boolean().default(false),\n geolocation: tier1GeolocationSchema.optional(),\n geolocationRequired: z.boolean().default(false)\n}).default({});\n\nconst fingerprintTier2Schema = z.object({\n enabled: z.boolean().default(true),\n mode: z.union([z.enum([\"deterministic\", \"adaptive\"]), z.literal(\"off\")])\n .default(\"adaptive\")\n .transform((mode) => {\n return mode === \"off\" ? \"deterministic\" : mode;\n }),\n continuousSignals: z.boolean().default(true),\n rotationIntervalMs: z.number().int().min(0).max(86_400_000).default(900_000),\n challengePatterns: z.array(z.string().min(1)).default([\n \"captcha\",\n \"challenge\",\n \"interstitial\",\n \"cf_chl\",\n \"bot\"\n ]),\n maxChallengeEvents: z.number().int().min(1).max(100).default(20),\n scorePenalty: z.number().int().min(1).max(100).default(20),\n scoreRecovery: z.number().int().min(0).max(100).default(5),\n rotationHealthThreshold: z.number().int().min(0).max(100).default(55)\n}).default({});\n\nconst fingerprintTier3CanarySchema = z.object({\n windowSize: z.number().int().min(1).max(100).default(10),\n minSamples: z.number().int().min(1).max(100).default(3),\n promoteThreshold: z.number().int().min(0).max(100).default(80),\n rollbackThreshold: z.number().int().min(0).max(100).default(35)\n});\n\nconst fingerprintTier3Schema = z.object({\n enabled: z.boolean().default(true),\n continuousSignals: z.boolean().default(true),\n fallbackTier: z.enum([\"tier1\", \"tier2\"]).default(\"tier2\"),\n canary: fingerprintTier3CanarySchema.default({})\n}).default({});\n\nconst fingerprintSchema = z.object({\n tier1: fingerprintTier1Schema.default({}),\n tier2: fingerprintTier2Schema.default({}),\n tier3: fingerprintTier3Schema.default({})\n}).default({});\n\nconst configSchema = z.object({\n headless: z.boolean().default(false),\n profile: z.string().min(1).default(\"default\"),\n snapshot: snapshotSchema.default({}),\n security: securitySchema.default({}),\n blockerDetectionThreshold: z.number().min(0).max(1).default(0.7),\n blockerResolutionTimeoutMs: z.number().int().min(1000).max(86_400_000).default(600_000),\n blockerArtifactCaps: blockerArtifactCapsSchema,\n providers: providersSchema.default({}),\n devtools: devtoolsSchema.default({}),\n fingerprint: fingerprintSchema.default({}),\n canary: canarySchema.default({}),\n export: exportSchema.default({}),\n parallelism: parallelismSchema.default({}),\n skills: skillsSchema.default({}),\n continuity: continuitySchema.default({}),\n relayPort: z.number().int().min(0).max(65535).default(DEFAULT_RELAY_PORT),\n relayToken: z.union([z.string(), z.literal(false)]).optional(),\n nativeExtensionId: z.string().optional(),\n daemonPort: z.number().int().min(0).max(65535).default(DEFAULT_DAEMON_PORT),\n daemonToken: z.string().min(1).optional(),\n chromePath: z.string().min(1).optional().refine(\n (val) => val === undefined || isExecutable(val),\n { message: \"chromePath must point to an executable file\" }\n ),\n flags: z.array(z.string()).default([]),\n checkForUpdates: z.boolean().default(false),\n persistProfile: z.boolean().default(true),\n skillPaths: z.array(z.string()).default([])\n});\n\nconst CONFIG_FILE_NAME = \"opendevbrowser.jsonc\";\n\nfunction getGlobalConfigPath(): string {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, CONFIG_FILE_NAME);\n}\n\nfunction ensureConfigFile(filePath: string): { relayToken: string; daemonToken: string } {\n const relayToken = generateSecureToken();\n const daemonToken = generateSecureToken();\n if (fs.existsSync(filePath)) {\n return { relayToken, daemonToken };\n }\n try {\n fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });\n fs.writeFileSync(filePath, buildDefaultConfigJsonc(relayToken, daemonToken), { encoding: \"utf-8\", mode: 0o600 });\n } catch (error) {\n console.warn(`[opendevbrowser] Warning: Could not create config file at ${filePath}:`, error);\n }\n return { relayToken, daemonToken };\n}\n\nfunction loadConfigFile(filePath: string): {\n raw: unknown;\n content: string;\n generatedRelayToken: string | null;\n generatedDaemonToken: string | null;\n created: boolean;\n} {\n if (!fs.existsSync(filePath)) {\n const tokens = ensureConfigFile(filePath);\n const content = buildDefaultConfigJsonc(tokens.relayToken, tokens.daemonToken);\n return {\n raw: {},\n content,\n generatedRelayToken: tokens.relayToken,\n generatedDaemonToken: tokens.daemonToken,\n created: true\n };\n }\n const content = fs.readFileSync(filePath, \"utf-8\");\n const errors: Array<{ error: number; offset: number; length: number }> = [];\n const parsed = parseJsonc(content, errors, { allowTrailingComma: true });\n if (errors.length > 0) {\n const firstError = errors[0];\n if (!firstError) {\n throw new Error(`Invalid JSONC in opendevbrowser config at ${filePath}: parse error`);\n }\n throw new Error(`Invalid JSONC in opendevbrowser config at ${filePath}: parse error at offset ${firstError.offset}`);\n }\n return {\n raw: parsed ?? {},\n content,\n generatedRelayToken: null,\n generatedDaemonToken: null,\n created: false\n };\n}\n\nexport function loadGlobalConfig(): OpenDevBrowserConfig {\n const configPath = getGlobalConfigPath();\n const { raw, content, generatedRelayToken, generatedDaemonToken, created } = loadConfigFile(configPath);\n const parsed = configSchema.safeParse(raw);\n\n if (!parsed.success) {\n const issues = parsed.error.issues.map((issue) => issue.message).join(\"; \");\n throw new Error(`Invalid opendevbrowser config at ${configPath}: ${issues}`);\n }\n\n const data = parsed.data;\n const relayToken = data.relayToken ?? generatedRelayToken ?? generateSecureToken();\n const daemonToken = data.daemonToken ?? generatedDaemonToken ?? generateSecureToken();\n\n if (!created) {\n persistDaemonConfigDefaults({\n configPath,\n content,\n raw,\n daemonPort: data.daemonPort,\n daemonToken\n });\n }\n\n return { ...data, relayToken, daemonToken };\n}\n\nexport function resolveConfig(config: unknown): OpenDevBrowserConfig {\n if (typeof config === \"undefined\") {\n return loadGlobalConfig();\n }\n const parsed = configSchema.safeParse(config);\n if (!parsed.success) {\n const issues = parsed.error.issues.map((issue) => issue.message).join(\"; \");\n throw new Error(`Invalid opendevbrowser config override: ${issues}`);\n }\n const data = parsed.data;\n const relayToken = data.relayToken ?? generateSecureToken();\n const daemonToken = data.daemonToken ?? generateSecureToken();\n return { ...data, relayToken, daemonToken };\n}\n\nfunction persistDaemonConfigDefaults(params: {\n configPath: string;\n content: string;\n raw: unknown;\n daemonPort: number;\n daemonToken: string;\n}): void {\n if (!isRecord(params.raw)) {\n return;\n }\n const hasDaemonPort = Object.prototype.hasOwnProperty.call(params.raw, \"daemonPort\");\n const hasDaemonToken = Object.prototype.hasOwnProperty.call(params.raw, \"daemonToken\");\n if (hasDaemonPort && hasDaemonToken) {\n return;\n }\n const formattingOptions = { insertSpaces: true, tabSize: 2 };\n let updatedContent = params.content;\n if (!hasDaemonPort) {\n const edits = modify(updatedContent, [\"daemonPort\"], params.daemonPort, { formattingOptions });\n if (edits.length) {\n updatedContent = applyEdits(updatedContent, edits);\n }\n }\n if (!hasDaemonToken) {\n const edits = modify(updatedContent, [\"daemonToken\"], params.daemonToken, { formattingOptions });\n if (edits.length) {\n updatedContent = applyEdits(updatedContent, edits);\n }\n }\n if (updatedContent !== params.content) {\n writeFileAtomic(params.configPath, updatedContent, { mode: 0o600 });\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n\nexport class ConfigStore {\n private current: OpenDevBrowserConfig;\n\n constructor(initial: OpenDevBrowserConfig) {\n this.current = initial;\n }\n\n get(): OpenDevBrowserConfig {\n return this.current;\n }\n\n set(next: OpenDevBrowserConfig): void {\n this.current = next;\n }\n}\n\nexport const __test__ = {\n persistDaemonConfigDefaults\n};\n","import { randomBytes } from \"crypto\";\n\nexport function generateSecureToken(): string {\n return randomBytes(32).toString(\"hex\");\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as crypto from \"crypto\";\n\nexport function writeFileAtomic(\n filePath: string,\n content: string,\n options: { encoding?: BufferEncoding; mode?: number } = {}\n): void {\n const { encoding = \"utf-8\", mode } = options;\n const dir = path.dirname(filePath);\n const hash = crypto.randomBytes(8).toString(\"hex\");\n const tempPath = path.join(dir, `.${path.basename(filePath)}.${process.pid}.${hash}.tmp`);\n\n try {\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const writeOptions: fs.WriteFileOptions = { encoding };\n if (mode !== undefined) {\n writeOptions.mode = mode;\n }\n fs.writeFileSync(tempPath, content, writeOptions);\n fs.renameSync(tempPath, filePath);\n } catch (error) {\n try {\n if (fs.existsSync(tempPath)) {\n fs.unlinkSync(tempPath);\n }\n } catch {\n /* best-effort cleanup */\n }\n throw error;\n }\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"http\";\nimport type { AddressInfo } from \"net\";\nimport { timingSafeEqual, randomUUID } from \"crypto\";\nimport { WebSocket, WebSocketServer } from \"ws\";\nimport {\n AnnotationErrorCode,\n AnnotationResponse,\n MAX_OPS_PAYLOAD_BYTES,\n OpsEnvelope,\n OpsError,\n OpsErrorResponse,\n OpsEvent,\n OpsHello,\n OpsPing,\n OpsRequest,\n RelayAnnotationCommand,\n RelayAnnotationEvent,\n RelayAnnotationResponse,\n RelayCommand,\n RelayEvent,\n RelayHandshake,\n RelayHandshakeAck,\n RelayHandshakeError,\n RelayHealthCheck,\n RelayHealthResponse,\n RelayHealthStatus,\n RelayPing,\n RelayPong,\n RelayResponse\n} from \"./protocol\";\n\nconst DEFAULT_DISCOVERY_PORT = 8787;\nconst CONFIG_PATH = \"/config\";\nconst PAIR_PATH = \"/pair\";\nconst STATUS_PATH = \"/status\";\nconst CDP_TOKEN_QUERY_KEY = \"token\";\n\ntype ExtensionInfo = {\n tabId: number;\n url?: string;\n title?: string;\n groupId?: number;\n};\n\nexport type RelayStatus = {\n running: boolean;\n url?: string;\n port?: number;\n extensionConnected: boolean;\n extensionHandshakeComplete: boolean;\n cdpConnected: boolean;\n annotationConnected: boolean;\n opsConnected: boolean;\n pairingRequired: boolean;\n instanceId: string;\n extension?: ExtensionInfo;\n epoch: number;\n lastHandshakeError?: RelayHandshakeError;\n health: RelayHealthStatus;\n};\n\ntype RelayServerOptions = {\n discoveryPort?: number;\n};\n\nexport class RelayServer {\n private readonly instanceId = randomUUID();\n private readonly epoch = Date.now();\n private running = false;\n private baseUrl: string | null = null;\n private port: number | null = null;\n private server: ReturnType<typeof createServer> | null = null;\n private discoveryServer: ReturnType<typeof createServer> | null = null;\n private extensionWss: WebSocketServer | null = null;\n private cdpWss: WebSocketServer | null = null;\n private annotationWss: WebSocketServer | null = null;\n private opsWss: WebSocketServer | null = null;\n private extensionSocket: WebSocket | null = null;\n private cdpSocket: WebSocket | null = null;\n private annotationSocket: WebSocket | null = null;\n private opsClients = new Map<string, WebSocket>();\n private opsOwnedTabIds = new Set<number>();\n private extensionInfo: ExtensionInfo | null = null;\n private extensionHandshakeComplete = false;\n private pairingToken: string | null = null;\n private lastHandshakeError: RelayHandshakeError | null = null;\n private configuredDiscoveryPort: number;\n private discoveryPort: number | null = null;\n private handshakeAttempts = new Map<string, { count: number; resetAt: number }>();\n private httpAttempts = new Map<string, { count: number; resetAt: number }>();\n private cdpAllowlist: Set<string> | null = null;\n private annotationPending = new Map<string, { createdAt: number }>();\n private static readonly MAX_HANDSHAKE_ATTEMPTS = 5;\n private static readonly RATE_LIMIT_WINDOW_MS = 60_000;\n private static readonly MAX_HTTP_ATTEMPTS = 60;\n private static readonly MAX_ANNOTATION_PAYLOAD_BYTES = 12 * 1024 * 1024;\n private static readonly ANNOTATION_REQUEST_TIMEOUT_MS = 120_000;\n\n constructor(options: RelayServerOptions = {}) {\n this.configuredDiscoveryPort = options.discoveryPort ?? DEFAULT_DISCOVERY_PORT;\n }\n\n async start(port = 8787): Promise<{ url: string; port: number }> {\n if (this.running && this.baseUrl && this.port !== null) {\n return { url: this.baseUrl, port: this.port };\n }\n\n this.server = createServer();\n this.extensionWss = new WebSocketServer({ noServer: true });\n this.cdpWss = new WebSocketServer({ noServer: true });\n this.annotationWss = new WebSocketServer({ noServer: true });\n this.opsWss = new WebSocketServer({ noServer: true });\n\n this.extensionWss.on(\"connection\", (socket: WebSocket) => {\n if (this.extensionSocket) {\n this.extensionSocket.close(1000, \"Replaced by a new extension client\");\n }\n this.extensionSocket = socket;\n this.extensionInfo = null;\n this.extensionHandshakeComplete = false;\n socket.on(\"message\", (data: WebSocket.RawData) => {\n this.handleExtensionMessage(data);\n });\n socket.on(\"close\", () => {\n if (this.extensionSocket === socket) {\n this.extensionSocket = null;\n this.extensionInfo = null;\n this.extensionHandshakeComplete = false;\n this.opsOwnedTabIds.clear();\n this.failPendingAnnotations(\"relay_unavailable\", \"Extension disconnected.\");\n }\n if (this.cdpSocket) {\n this.cdpSocket.close(1011, \"Extension disconnected\");\n }\n });\n });\n\n this.cdpWss.on(\"connection\", (socket: WebSocket) => {\n if (this.cdpSocket) {\n socket.close(1008, \"Only one CDP client supported\");\n return;\n }\n this.cdpSocket = socket;\n socket.on(\"message\", (data: WebSocket.RawData) => {\n this.handleCdpMessage(data);\n });\n socket.on(\"close\", () => {\n if (this.cdpSocket === socket) {\n this.cdpSocket = null;\n }\n });\n });\n\n this.annotationWss.on(\"connection\", (socket: WebSocket) => {\n if (this.annotationSocket) {\n socket.close(1008, \"Only one annotation client supported\");\n return;\n }\n this.annotationSocket = socket;\n socket.on(\"message\", (data: WebSocket.RawData) => {\n this.handleAnnotationMessage(data);\n });\n socket.on(\"close\", () => {\n if (this.annotationSocket === socket) {\n this.annotationSocket = null;\n this.annotationPending.clear();\n }\n });\n });\n\n this.opsWss.on(\"connection\", (socket: WebSocket, _request: IncomingMessage) => {\n const clientId = randomUUID();\n this.opsClients.set(clientId, socket);\n socket.on(\"message\", (data: WebSocket.RawData) => {\n this.handleOpsClientMessage(clientId, data);\n });\n socket.on(\"close\", () => {\n if (this.opsClients.get(clientId) === socket) {\n this.opsClients.delete(clientId);\n this.notifyOpsClientClosed(clientId);\n }\n });\n socket.on(\"error\", () => {\n if (this.opsClients.get(clientId) === socket) {\n this.opsClients.delete(clientId);\n this.notifyOpsClientClosed(clientId);\n }\n });\n void _request;\n });\n\n this.server.on(\"request\", (request: IncomingMessage, response) => {\n const pathname = new URL(request.url ?? \"\", \"http://127.0.0.1\").pathname;\n const origin = request.headers.origin;\n \n if (pathname === CONFIG_PATH && request.method === \"OPTIONS\") {\n this.handleConfigPreflight(origin, request, response);\n return;\n }\n \n if (pathname === CONFIG_PATH && request.method === \"GET\") {\n this.handleConfigRequest(request, origin, response);\n return;\n }\n\n if (pathname === STATUS_PATH && request.method === \"OPTIONS\") {\n this.handleConfigPreflight(origin, request, response);\n return;\n }\n\n if (pathname === STATUS_PATH && request.method === \"GET\") {\n this.handleStatusRequest(request, origin, response);\n return;\n }\n \n if (pathname === PAIR_PATH && request.method === \"OPTIONS\") {\n if (origin && (origin.startsWith(\"chrome-extension://\") || this.isNullOrigin(origin))) {\n this.applyCorsOrigin(origin, response);\n response.setHeader(\"Access-Control-Allow-Methods\", \"GET, OPTIONS\");\n response.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\");\n this.applyPrivateNetworkPreflight(request, response);\n }\n response.writeHead(204);\n response.end();\n return;\n }\n \n if (pathname === PAIR_PATH && request.method === \"GET\") {\n if (!this.authorizeHttpRequest(origin, request, response)) {\n return;\n }\n\n this.applyCorsOrigin(origin, response);\n this.applyPrivateNetworkResponse(origin, response);\n\n response.writeHead(200, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ token: this.pairingToken, instanceId: this.instanceId, epoch: this.epoch }));\n return;\n }\n \n response.writeHead(404);\n response.end();\n });\n\n this.server.on(\"upgrade\", (request: IncomingMessage, socket, head) => {\n const rawOrigin = request.headers.origin;\n const origin = this.normalizeOrigin(rawOrigin);\n const ip = request.socket.remoteAddress ?? \"unknown\";\n const pathname = new URL(request.url ?? \"\", \"http://127.0.0.1\").pathname;\n\n if (pathname === \"/extension\") {\n if (!this.isExtensionOrigin(origin)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (this.isRateLimited(ip)) {\n this.logSecurityEvent(\"rate_limited\", { ip, path: pathname });\n socket.write(\"HTTP/1.1 429 Too Many Requests\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n this.extensionWss?.handleUpgrade(request, socket, head, (ws: WebSocket) => {\n this.extensionWss?.emit(\"connection\", ws, request);\n });\n return;\n }\n\n if (pathname === \"/cdp\") {\n if (this.isRateLimited(ip)) {\n this.logSecurityEvent(\"rate_limited\", { ip, path: pathname });\n socket.write(\"HTTP/1.1 429 Too Many Requests\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (origin && !this.isExtensionOrigin(origin)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (!origin && !this.isLoopbackAddress(ip)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n const token = this.getCdpTokenFromRequestUrl(request.url);\n if (!this.isTokenValid(token)) {\n this.logSecurityEvent(\"cdp_unauthorized\", { ip });\n socket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n this.cdpWss?.handleUpgrade(request, socket, head, (ws: WebSocket) => {\n this.cdpWss?.emit(\"connection\", ws, request);\n });\n return;\n }\n\n if (pathname === \"/annotation\") {\n if (this.isRateLimited(ip)) {\n this.logSecurityEvent(\"rate_limited\", { ip, path: pathname });\n socket.write(\"HTTP/1.1 429 Too Many Requests\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (origin && !this.isExtensionOrigin(origin)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (!origin && !this.isLoopbackAddress(ip)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n const token = this.getCdpTokenFromRequestUrl(request.url);\n if (!this.isTokenValid(token)) {\n this.logSecurityEvent(\"annotation_unauthorized\", { ip });\n socket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n this.annotationWss?.handleUpgrade(request, socket, head, (ws: WebSocket) => {\n this.annotationWss?.emit(\"connection\", ws, request);\n });\n return;\n }\n\n if (pathname === \"/ops\") {\n if (this.isRateLimited(ip)) {\n this.logSecurityEvent(\"rate_limited\", { ip, path: pathname });\n socket.write(\"HTTP/1.1 429 Too Many Requests\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (origin && !this.isExtensionOrigin(origin)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n if (!origin && !this.isLoopbackAddress(ip)) {\n this.logSecurityEvent(\"origin_blocked\", { origin: rawOrigin ?? \"\", ip, path: pathname });\n socket.write(\"HTTP/1.1 403 Forbidden\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n const token = this.getCdpTokenFromRequestUrl(request.url);\n if (!this.isTokenValid(token)) {\n this.logSecurityEvent(\"ops_unauthorized\", { ip });\n socket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n this.opsWss?.handleUpgrade(request, socket, head, (ws: WebSocket) => {\n this.opsWss?.emit(\"connection\", ws, request);\n });\n return;\n }\n\n socket.destroy();\n });\n\n await new Promise<void>((resolve, reject) => {\n this.server?.once(\"error\", reject);\n this.server?.listen(port, \"127.0.0.1\", () => {\n resolve();\n });\n });\n\n const address = this.server.address() as AddressInfo | null;\n if (!address) {\n throw new Error(\"Relay server did not expose a port\");\n }\n\n this.port = address.port;\n this.baseUrl = `ws://127.0.0.1:${address.port}`;\n this.running = true;\n\n try {\n await this.startDiscoveryServer();\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`[opendevbrowser] Discovery server failed to start: ${message}`);\n this.stopDiscoveryServer();\n }\n\n return { url: this.baseUrl, port: address.port };\n }\n\n stop(): void {\n this.running = false;\n this.baseUrl = null;\n this.port = null;\n this.extensionInfo = null;\n this.extensionHandshakeComplete = false;\n this.stopDiscoveryServer();\n\n if (this.extensionSocket) {\n this.extensionSocket.close(1000, \"Relay stopped\");\n this.extensionSocket = null;\n }\n\n if (this.cdpSocket) {\n this.cdpSocket.close(1000, \"Relay stopped\");\n this.cdpSocket = null;\n }\n\n if (this.annotationSocket) {\n this.annotationSocket.close(1000, \"Relay stopped\");\n this.annotationSocket = null;\n }\n\n for (const socket of this.opsClients.values()) {\n socket.close(1000, \"Relay stopped\");\n }\n this.opsClients.clear();\n this.opsOwnedTabIds.clear();\n\n this.extensionWss?.close();\n this.cdpWss?.close();\n this.annotationWss?.close();\n this.opsWss?.close();\n this.server?.close();\n\n this.extensionWss = null;\n this.cdpWss = null;\n this.annotationWss = null;\n this.opsWss = null;\n this.server = null;\n }\n\n status(): RelayStatus {\n const health = this.buildHealthStatus();\n return {\n running: this.running,\n url: this.baseUrl || undefined,\n port: this.port ?? undefined,\n extensionConnected: Boolean(this.extensionSocket),\n extensionHandshakeComplete: this.extensionHandshakeComplete,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected: this.opsClients.size > 0,\n pairingRequired: Boolean(this.pairingToken),\n instanceId: this.instanceId,\n extension: this.extensionInfo ?? undefined,\n epoch: this.epoch,\n lastHandshakeError: this.lastHandshakeError ?? undefined,\n health\n };\n }\n\n getCdpUrl(): string | null {\n return this.baseUrl ? `${this.baseUrl}/cdp` : null;\n }\n\n getAnnotationUrl(): string | null {\n return this.baseUrl ? `${this.baseUrl}/annotation` : null;\n }\n\n getOpsUrl(): string | null {\n return this.baseUrl ? `${this.baseUrl}/ops` : null;\n }\n\n getDiscoveryPort(): number | null {\n if (this.port !== null && this.port === this.configuredDiscoveryPort) {\n return this.port;\n }\n return this.discoveryPort;\n }\n\n setToken(token?: string | false | null): void {\n const trimmed = typeof token === \"string\" ? token.trim() : \"\";\n this.pairingToken = trimmed.length ? trimmed : null;\n }\n\n setCdpAllowlist(methods: string[] | undefined): void {\n if (!methods || methods.length === 0) {\n this.cdpAllowlist = null;\n return;\n }\n this.cdpAllowlist = new Set(methods);\n }\n\n private isExtensionOrigin(origin: string | undefined): boolean {\n return Boolean(origin && origin.startsWith(\"chrome-extension://\"));\n }\n\n private isNullOrigin(origin: string | undefined): boolean {\n return origin === \"null\";\n }\n\n private applyPrivateNetworkPreflight(request: IncomingMessage, response: ServerResponse): void {\n const pna = request.headers[\"access-control-request-private-network\"];\n if (typeof pna === \"string\" && pna.toLowerCase() === \"true\") {\n response.setHeader(\"Access-Control-Allow-Private-Network\", \"true\");\n }\n }\n\n private applyPrivateNetworkResponse(origin: string | undefined, response: ServerResponse): void {\n if (origin && (this.isExtensionOrigin(origin) || this.isNullOrigin(origin))) {\n response.setHeader(\"Access-Control-Allow-Private-Network\", \"true\");\n }\n }\n\n private applyCorsOrigin(origin: string | undefined, response: ServerResponse): void {\n if (origin && this.isExtensionOrigin(origin)) {\n response.setHeader(\"Access-Control-Allow-Origin\", origin);\n return;\n }\n if (this.isNullOrigin(origin)) {\n response.setHeader(\"Access-Control-Allow-Origin\", \"null\");\n }\n }\n\n private normalizeOrigin(origin: string | undefined): string | undefined {\n if (!origin || origin === \"null\") {\n return undefined;\n }\n return origin;\n }\n\n private isLoopbackAddress(ip: string): boolean {\n if (!ip) return false;\n return ip === \"127.0.0.1\"\n || ip === \"::1\"\n || ip.startsWith(\"::ffff:127.\");\n }\n\n private isHttpRateLimited(ip: string): boolean {\n const now = Date.now();\n const record = this.httpAttempts.get(ip);\n\n if (!record || now > record.resetAt) {\n this.httpAttempts.set(ip, { count: 1, resetAt: now + RelayServer.RATE_LIMIT_WINDOW_MS });\n return false;\n }\n\n record.count++;\n return record.count > RelayServer.MAX_HTTP_ATTEMPTS;\n }\n\n private authorizeHttpRequest(origin: string | undefined, request: IncomingMessage, response: ServerResponse): boolean {\n const normalizedOrigin = this.normalizeOrigin(origin);\n const ip = request.socket.remoteAddress ?? \"unknown\";\n\n if (this.isHttpRateLimited(ip)) {\n this.logSecurityEvent(\"http_rate_limited\", { ip });\n response.writeHead(429, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ error: \"Too Many Requests\" }));\n return false;\n }\n\n if (normalizedOrigin) {\n if (!this.isExtensionOrigin(normalizedOrigin)) {\n response.writeHead(403, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ error: \"Forbidden: extension origin required\" }));\n return false;\n }\n return true;\n }\n\n if (!this.isLoopbackAddress(ip)) {\n response.writeHead(403, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ error: \"Forbidden: local requests only\" }));\n return false;\n }\n\n return true;\n }\n\n private getCdpTokenFromRequestUrl(requestUrl: string | undefined): string | null {\n try {\n const url = new URL(requestUrl ?? \"\", \"http://127.0.0.1\");\n const token = url.searchParams.get(CDP_TOKEN_QUERY_KEY);\n if (!token || token.trim().length === 0) {\n return null;\n }\n return token;\n } catch {\n return null;\n }\n }\n\n private handleConfigPreflight(origin: string | undefined, request: IncomingMessage, response: ServerResponse): void {\n if (origin && (this.isExtensionOrigin(origin) || this.isNullOrigin(origin))) {\n this.applyCorsOrigin(origin, response);\n response.setHeader(\"Access-Control-Allow-Methods\", \"GET, OPTIONS\");\n response.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type, Authorization\");\n this.applyPrivateNetworkPreflight(request, response);\n }\n response.writeHead(204);\n response.end();\n }\n\n private handleConfigRequest(request: IncomingMessage, origin: string | undefined, response: ServerResponse): void {\n if (!this.authorizeHttpRequest(origin, request, response)) {\n return;\n }\n\n this.applyCorsOrigin(origin, response);\n this.applyPrivateNetworkResponse(origin, response);\n\n if (this.port === null) {\n response.writeHead(503, { \"Content-Type\": \"application/json\" });\n response.end(JSON.stringify({ error: \"Relay not running\" }));\n return;\n }\n\n response.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-store\"\n });\n response.end(JSON.stringify({\n relayPort: this.port,\n pairingRequired: Boolean(this.pairingToken),\n instanceId: this.instanceId,\n epoch: this.epoch,\n discoveryPort: this.getDiscoveryPort()\n }));\n }\n\n private handleStatusRequest(request: IncomingMessage, origin: string | undefined, response: ServerResponse): void {\n if (!this.authorizeHttpRequest(origin, request, response)) {\n return;\n }\n\n this.applyCorsOrigin(origin, response);\n this.applyPrivateNetworkResponse(origin, response);\n\n response.writeHead(200, {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-store\"\n });\n const health = this.buildHealthStatus();\n response.end(JSON.stringify({\n instanceId: this.instanceId,\n running: this.running,\n port: this.port ?? undefined,\n extensionConnected: Boolean(this.extensionSocket),\n extensionHandshakeComplete: this.extensionHandshakeComplete,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected: this.opsClients.size > 0,\n pairingRequired: Boolean(this.pairingToken),\n health,\n lastHandshakeError: this.lastHandshakeError ?? undefined\n }));\n }\n\n private async startDiscoveryServer(): Promise<void> {\n if (this.port === null || this.discoveryServer) {\n return;\n }\n\n if (this.configuredDiscoveryPort > 0 && this.configuredDiscoveryPort === this.port) {\n return;\n }\n\n this.discoveryServer = createServer((request: IncomingMessage, response) => {\n const pathname = new URL(request.url ?? \"\", \"http://127.0.0.1\").pathname;\n const origin = request.headers.origin;\n\n if (pathname === CONFIG_PATH && request.method === \"OPTIONS\") {\n this.handleConfigPreflight(origin, request, response);\n return;\n }\n\n if (pathname === CONFIG_PATH && request.method === \"GET\") {\n this.handleConfigRequest(request, origin, response);\n return;\n }\n\n if (pathname === STATUS_PATH && request.method === \"OPTIONS\") {\n this.handleConfigPreflight(origin, request, response);\n return;\n }\n\n if (pathname === STATUS_PATH && request.method === \"GET\") {\n this.handleStatusRequest(request, origin, response);\n return;\n }\n\n response.writeHead(404);\n response.end();\n });\n\n await new Promise<void>((resolve, reject) => {\n this.discoveryServer?.once(\"error\", reject);\n this.discoveryServer?.listen(this.configuredDiscoveryPort, \"127.0.0.1\", () => {\n resolve();\n });\n });\n\n const address = this.discoveryServer.address() as AddressInfo | null;\n if (!address) {\n throw new Error(\"Discovery server did not expose a port\");\n }\n\n this.discoveryPort = address.port;\n }\n\n private stopDiscoveryServer(): void {\n if (this.discoveryServer) {\n this.discoveryServer.close();\n this.discoveryServer = null;\n }\n this.discoveryPort = null;\n }\n\n private isRateLimited(ip: string): boolean {\n const now = Date.now();\n const record = this.handshakeAttempts.get(ip);\n\n if (!record || now > record.resetAt) {\n this.handshakeAttempts.set(ip, { count: 1, resetAt: now + RelayServer.RATE_LIMIT_WINDOW_MS });\n return false;\n }\n\n record.count++;\n return record.count > RelayServer.MAX_HANDSHAKE_ATTEMPTS;\n }\n\n private isCommandAllowed(method: string): boolean {\n if (!this.cdpAllowlist) return true;\n return this.cdpAllowlist.has(method);\n }\n\n private isOpsOwnedTargetId(targetId: string): boolean {\n if (!targetId.startsWith(\"tab-\")) return false;\n const raw = targetId.slice(4);\n if (!raw) return false;\n const tabId = Number(raw);\n if (!Number.isFinite(tabId)) return false;\n return this.opsOwnedTabIds.has(tabId);\n }\n\n private logSecurityEvent(event: string, details: Record<string, unknown>): void {\n const safeDetails = { ...details };\n delete safeDetails.token;\n delete safeDetails.pairingToken;\n console.warn(`[security] ${event}`, JSON.stringify(safeDetails));\n }\n\n private handleCdpMessage(data: WebSocket.RawData): void {\n const message = parseJson(data);\n if (!isRecord(message)) {\n return;\n }\n\n const id = message.id;\n const method = message.method;\n if ((typeof id !== \"string\" && typeof id !== \"number\") || typeof method !== \"string\") {\n return;\n }\n\n if (!this.extensionSocket) {\n this.sendJson(this.cdpSocket, {\n id,\n error: { message: \"Extension not connected to relay\" }\n } satisfies RelayResponse);\n return;\n }\n\n if (!this.isCommandAllowed(method)) {\n this.logSecurityEvent(\"command_blocked\", { method });\n this.sendJson(this.cdpSocket, {\n id,\n error: { message: `CDP command '${method}' not in allowlist` }\n } satisfies RelayResponse);\n return;\n }\n\n if (method === \"Target.attachToTarget\" && isRecord(message.params)) {\n const targetId = typeof message.params.targetId === \"string\" ? message.params.targetId : \"\";\n if (this.isOpsOwnedTargetId(targetId)) {\n this.sendJson(this.cdpSocket, {\n id,\n error: { message: \"cdp_attach_blocked: target is owned by an ops session\" }\n } satisfies RelayResponse);\n return;\n }\n }\n\n const relayCommand: RelayCommand = {\n id,\n method: \"forwardCDPCommand\",\n params: {\n method,\n params: message.params,\n sessionId: typeof message.sessionId === \"string\" ? message.sessionId : undefined\n }\n };\n\n this.sendJson(this.extensionSocket, relayCommand);\n }\n\n private handleAnnotationMessage(data: WebSocket.RawData): void {\n const message = parseJson(data);\n if (!isRecord(message)) {\n return;\n }\n\n if (isHealthCheck(message)) {\n this.sendJson(this.annotationSocket, this.buildHealthResponse(message));\n return;\n }\n if (isPing(message)) {\n this.sendJson(this.annotationSocket, this.buildPong(message));\n return;\n }\n\n if (isRelayAnnotationCommand(message)) {\n this.handleAnnotationCommand(message);\n return;\n }\n }\n\n private handleExtensionMessage(data: WebSocket.RawData): void {\n const message = parseJson(data);\n if (!isRecord(message)) {\n return;\n }\n\n if (isHandshake(message)) {\n if (!this.isPairingTokenValid(message)) {\n const hasToken = typeof message.payload.pairingToken === \"string\" && message.payload.pairingToken.length > 0;\n const code: RelayHandshakeError[\"code\"] = hasToken ? \"pairing_invalid\" : \"pairing_missing\";\n this.lastHandshakeError = {\n code,\n message: hasToken ? \"Invalid pairing token\" : \"Missing pairing token\",\n at: Date.now()\n };\n this.logSecurityEvent(\"handshake_failed\", { reason: hasToken ? \"invalid_token\" : \"missing_token\", tabId: message.payload.tabId });\n this.extensionInfo = null;\n this.extensionSocket?.close(1008, \"Invalid pairing token\");\n return;\n }\n if (this.extensionSocket) {\n this.extensionHandshakeComplete = true;\n }\n this.lastHandshakeError = null;\n this.extensionInfo = {\n tabId: message.payload.tabId,\n url: message.payload.url,\n title: message.payload.title,\n groupId: message.payload.groupId\n };\n if (this.extensionSocket && this.port !== null) {\n const ack: RelayHandshakeAck = {\n type: \"handshakeAck\",\n payload: {\n instanceId: this.instanceId,\n relayPort: this.port,\n pairingRequired: Boolean(this.pairingToken),\n epoch: this.epoch\n }\n };\n this.sendJson(this.extensionSocket, ack);\n }\n return;\n }\n\n if (isRelayAnnotationResponse(message)) {\n this.forwardAnnotationResponse(message);\n return;\n }\n\n if (isRelayAnnotationEvent(message)) {\n this.forwardAnnotationEvent(message);\n return;\n }\n\n if (isOpsEnvelope(message)) {\n this.handleOpsExtensionMessage(message);\n return;\n }\n\n if (isHealthCheck(message)) {\n this.sendJson(this.extensionSocket, this.buildHealthResponse(message));\n return;\n }\n if (isPing(message)) {\n this.sendJson(this.extensionSocket, this.buildPong(message));\n return;\n }\n\n if (message.method === \"forwardCDPEvent\" && isRecord(message.params)) {\n const params = message.params as RelayEvent[\"params\"];\n const event: Record<string, unknown> = {\n method: params.method,\n params: params.params ?? {}\n };\n if (params.sessionId) {\n event.sessionId = params.sessionId;\n }\n this.sendJson(this.cdpSocket, event);\n return;\n }\n\n if (typeof message.id === \"string\" || typeof message.id === \"number\") {\n const response: Record<string, unknown> = { id: message.id };\n if (typeof message.result !== \"undefined\") {\n response.result = message.result;\n }\n if (message.error) {\n response.error = message.error;\n }\n if (typeof message.sessionId === \"string\") {\n response.sessionId = message.sessionId;\n }\n this.sendJson(this.cdpSocket, response);\n }\n }\n\n private handleAnnotationCommand(message: RelayAnnotationCommand): void {\n const payload = message.payload as unknown;\n if (!isAnnotationCommand(payload)) {\n const requestId = isRecord(payload) && typeof payload.requestId === \"string\"\n ? payload.requestId\n : \"unknown\";\n this.sendAnnotationError(requestId, \"invalid_request\", \"Invalid annotation command payload.\");\n return;\n }\n\n const command = payload;\n if (!this.extensionSocket || !this.extensionHandshakeComplete) {\n this.sendAnnotationError(command.requestId, \"relay_unavailable\", \"Extension not connected to relay.\");\n return;\n }\n\n this.annotationPending.set(command.requestId, { createdAt: Date.now() });\n this.sendJson(this.extensionSocket, message);\n\n setTimeout(() => {\n if (!this.annotationPending.has(command.requestId)) return;\n this.annotationPending.delete(command.requestId);\n this.sendAnnotationError(command.requestId, \"timeout\", \"Annotation request timed out.\");\n }, RelayServer.ANNOTATION_REQUEST_TIMEOUT_MS);\n }\n\n private handleOpsClientMessage(clientId: string, data: WebSocket.RawData): void {\n const message = parseJson(data);\n if (!isRecord(message)) {\n return;\n }\n\n if (!this.extensionSocket || !this.extensionHandshakeComplete) {\n this.sendOpsError(clientId, {\n code: \"ops_unavailable\",\n message: \"Extension not connected to relay.\",\n retryable: true\n }, getOpsRequestId(message), getOpsSessionId(message));\n return;\n }\n\n if (isOpsHello(message) || isOpsRequest(message) || isOpsPing(message)) {\n const sizeBytes = Buffer.byteLength(JSON.stringify(message));\n if (sizeBytes > MAX_OPS_PAYLOAD_BYTES) {\n this.sendOpsError(clientId, {\n code: \"invalid_request\",\n message: \"Ops payload exceeded relay limits.\",\n retryable: false,\n details: { maxPayloadBytes: MAX_OPS_PAYLOAD_BYTES }\n }, getOpsRequestId(message), getOpsSessionId(message));\n return;\n }\n\n this.sendJson(this.extensionSocket, { ...message, clientId } satisfies OpsEnvelope);\n return;\n }\n\n this.sendOpsError(clientId, {\n code: \"invalid_request\",\n message: \"Invalid ops message.\",\n retryable: false\n }, getOpsRequestId(message), getOpsSessionId(message));\n }\n\n private handleOpsExtensionMessage(message: OpsEnvelope): void {\n if (message.type === \"ops_event\") {\n const tabId = extractOpsTabId(message.payload);\n if (typeof tabId === \"number\") {\n if (message.event === \"ops_session_created\") {\n this.opsOwnedTabIds.add(tabId);\n }\n if (message.event === \"ops_session_closed\" || message.event === \"ops_session_expired\" || message.event === \"ops_tab_closed\") {\n this.opsOwnedTabIds.delete(tabId);\n }\n }\n }\n\n if (message.type === \"ops_hello_ack\" && this.opsClients.size === 0) {\n return;\n }\n\n const clientId = message.clientId;\n if (!clientId) {\n return;\n }\n const client = this.opsClients.get(clientId);\n if (!client) {\n return;\n }\n this.sendJson(client, message);\n }\n\n private notifyOpsClientClosed(clientId: string): void {\n if (!this.extensionSocket) return;\n const event: OpsEvent = {\n type: \"ops_event\",\n clientId,\n event: \"ops_client_disconnected\",\n payload: { at: Date.now() }\n };\n this.sendJson(this.extensionSocket, event);\n }\n\n private sendOpsError(clientId: string, error: OpsError, requestId?: string, opsSessionId?: string): void {\n const client = this.opsClients.get(clientId);\n if (!client) return;\n const payload: OpsErrorResponse = {\n type: \"ops_error\",\n requestId: requestId ?? \"unknown\",\n clientId,\n opsSessionId,\n error\n };\n this.sendJson(client, payload);\n }\n\n private forwardAnnotationResponse(message: RelayAnnotationResponse): void {\n const payload = message.payload as unknown;\n if (!isAnnotationResponse(payload)) {\n const requestId = isRecord(payload) && typeof payload.requestId === \"string\"\n ? payload.requestId\n : \"unknown\";\n this.sendAnnotationError(requestId, \"invalid_request\", \"Invalid annotation response payload.\");\n return;\n }\n\n const requestId = payload.requestId;\n if (!this.annotationPending.has(requestId)) {\n return;\n }\n\n const sizeBytes = Buffer.byteLength(JSON.stringify(message));\n if (sizeBytes > RelayServer.MAX_ANNOTATION_PAYLOAD_BYTES) {\n this.annotationPending.delete(requestId);\n this.sendAnnotationError(requestId, \"payload_too_large\", \"Annotation payload exceeded relay limits.\");\n return;\n }\n\n this.annotationPending.delete(requestId);\n this.sendJson(this.annotationSocket, message);\n }\n\n private forwardAnnotationEvent(message: RelayAnnotationEvent): void {\n if (!isAnnotationEvent(message.payload)) {\n return;\n }\n const requestId = message.payload.requestId;\n if (!this.annotationPending.has(requestId)) {\n return;\n }\n const sizeBytes = Buffer.byteLength(JSON.stringify(message));\n if (sizeBytes > RelayServer.MAX_ANNOTATION_PAYLOAD_BYTES) {\n return;\n }\n this.sendJson(this.annotationSocket, message);\n }\n\n private sendAnnotationError(requestId: string, code: AnnotationErrorCode, message: string): void {\n const payload: AnnotationResponse = {\n version: 1,\n requestId,\n status: \"error\",\n error: { code, message }\n };\n const response: RelayAnnotationResponse = {\n type: \"annotationResponse\",\n payload\n };\n this.sendJson(this.annotationSocket, response);\n }\n\n private failPendingAnnotations(code: AnnotationErrorCode, message: string): void {\n for (const requestId of this.annotationPending.keys()) {\n this.sendAnnotationError(requestId, code, message);\n }\n this.annotationPending.clear();\n }\n\n private buildHealthStatus(): RelayHealthStatus {\n const opsConnected = this.opsClients.size > 0;\n if (!this.running) {\n return {\n ok: false,\n reason: \"relay_down\",\n detail: \"Relay not running\",\n extensionConnected: false,\n extensionHandshakeComplete: false,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected,\n pairingRequired: Boolean(this.pairingToken),\n lastHandshakeError: this.lastHandshakeError ?? undefined\n };\n }\n\n if (this.lastHandshakeError?.code === \"pairing_invalid\") {\n return {\n ok: false,\n reason: \"pairing_invalid\",\n detail: this.lastHandshakeError.message,\n extensionConnected: Boolean(this.extensionSocket),\n extensionHandshakeComplete: this.extensionHandshakeComplete,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected,\n pairingRequired: Boolean(this.pairingToken),\n lastHandshakeError: this.lastHandshakeError\n };\n }\n\n if (this.lastHandshakeError?.code === \"pairing_missing\") {\n return {\n ok: false,\n reason: \"pairing_required\",\n detail: this.lastHandshakeError.message,\n extensionConnected: Boolean(this.extensionSocket),\n extensionHandshakeComplete: this.extensionHandshakeComplete,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected,\n pairingRequired: Boolean(this.pairingToken),\n lastHandshakeError: this.lastHandshakeError\n };\n }\n\n if (!this.extensionSocket) {\n return {\n ok: false,\n reason: \"extension_disconnected\",\n detail: \"Extension not connected\",\n extensionConnected: false,\n extensionHandshakeComplete: false,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected,\n pairingRequired: Boolean(this.pairingToken),\n lastHandshakeError: this.lastHandshakeError ?? undefined\n };\n }\n\n if (!this.extensionHandshakeComplete) {\n return {\n ok: false,\n reason: \"handshake_incomplete\",\n detail: \"Extension handshake pending\",\n extensionConnected: true,\n extensionHandshakeComplete: false,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected,\n pairingRequired: Boolean(this.pairingToken),\n lastHandshakeError: this.lastHandshakeError ?? undefined\n };\n }\n\n return {\n ok: true,\n reason: \"ok\",\n extensionConnected: true,\n extensionHandshakeComplete: true,\n cdpConnected: Boolean(this.cdpSocket),\n annotationConnected: Boolean(this.annotationSocket),\n opsConnected,\n pairingRequired: Boolean(this.pairingToken),\n lastHandshakeError: this.lastHandshakeError ?? undefined\n };\n }\n\n private buildHealthResponse(request: RelayHealthCheck): RelayHealthResponse {\n return {\n type: \"healthCheckResult\",\n id: request.id,\n payload: this.buildHealthStatus()\n };\n }\n\n private buildPong(request: RelayPing): RelayPong {\n return {\n type: \"pong\",\n id: request.id,\n payload: this.buildHealthStatus()\n };\n }\n\n private sendJson(socket: WebSocket | null, payload: unknown): void {\n if (!socket || socket.readyState !== WebSocket.OPEN) {\n return;\n }\n socket.send(JSON.stringify(payload));\n }\n\n private isPairingTokenValid(handshake: RelayHandshake): boolean {\n return this.isTokenValid(handshake.payload.pairingToken);\n }\n\n private isTokenValid(received: string | undefined | null): boolean {\n if (!this.pairingToken) {\n return true;\n }\n\n if (typeof received !== \"string\") {\n return false;\n }\n\n const expected = this.pairingToken;\n const expectedBuf = Buffer.from(expected, \"utf-8\");\n const receivedBuf = Buffer.from(received, \"utf-8\");\n\n if (expectedBuf.length !== receivedBuf.length) {\n timingSafeEqual(expectedBuf, expectedBuf);\n return false;\n }\n\n return timingSafeEqual(expectedBuf, receivedBuf);\n }\n}\n\nconst parseJson = (data: WebSocket.RawData): unknown => {\n const text = typeof data === \"string\" ? data : data.toString();\n try {\n return JSON.parse(text);\n } catch {\n return null;\n }\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n\nconst isHandshake = (value: Record<string, unknown>): value is RelayHandshake => {\n if (value.type !== \"handshake\" || !isRecord(value.payload)) {\n return false;\n }\n return typeof value.payload.tabId === \"number\";\n};\n\nconst isHealthCheck = (value: Record<string, unknown>): value is RelayHealthCheck => {\n return value.type === \"healthCheck\" && typeof value.id === \"string\";\n};\n\nconst isPing = (value: Record<string, unknown>): value is RelayPing => {\n return value.type === \"ping\" && typeof value.id === \"string\";\n};\n\nconst isRelayAnnotationCommand = (value: Record<string, unknown>): value is RelayAnnotationCommand => {\n return value.type === \"annotationCommand\" && isRecord(value.payload);\n};\n\nconst isRelayAnnotationResponse = (value: Record<string, unknown>): value is RelayAnnotationResponse => {\n return value.type === \"annotationResponse\" && isRecord(value.payload);\n};\n\nconst isRelayAnnotationEvent = (value: Record<string, unknown>): value is RelayAnnotationEvent => {\n return value.type === \"annotationEvent\" && isRecord(value.payload);\n};\n\nconst isOpsHello = (value: Record<string, unknown>): value is OpsHello => {\n return value.type === \"ops_hello\" && typeof value.version === \"string\";\n};\n\nconst isOpsPing = (value: Record<string, unknown>): value is OpsPing => {\n return value.type === \"ops_ping\" && typeof value.id === \"string\";\n};\n\nconst isOpsRequest = (value: Record<string, unknown>): value is OpsRequest => {\n return value.type === \"ops_request\" && typeof value.requestId === \"string\" && typeof value.command === \"string\";\n};\n\nconst isOpsEnvelope = (value: Record<string, unknown>): value is OpsEnvelope => {\n const type = value.type;\n return typeof type === \"string\" && type.startsWith(\"ops_\");\n};\n\nconst getOpsRequestId = (value: Record<string, unknown>): string | undefined => {\n return typeof value.requestId === \"string\" ? value.requestId : undefined;\n};\n\nconst getOpsSessionId = (value: Record<string, unknown>): string | undefined => {\n return typeof value.opsSessionId === \"string\" ? value.opsSessionId : undefined;\n};\n\nconst extractOpsTabId = (payload: unknown): number | undefined => {\n if (!isRecord(payload)) return undefined;\n const tabId = payload.tabId;\n return typeof tabId === \"number\" ? tabId : undefined;\n};\n\nconst isAnnotationCommand = (value: unknown): value is RelayAnnotationCommand[\"payload\"] => {\n if (!isRecord(value)) return false;\n if (value.version !== 1) return false;\n if (typeof value.requestId !== \"string\") return false;\n if (value.command !== \"start\" && value.command !== \"cancel\") return false;\n if (value.options && !isRecord(value.options)) return false;\n return true;\n};\n\nconst isAnnotationResponse = (value: unknown): value is RelayAnnotationResponse[\"payload\"] => {\n if (!isRecord(value)) return false;\n if (value.version !== 1) return false;\n if (typeof value.requestId !== \"string\") return false;\n if (value.status !== \"ok\" && value.status !== \"cancelled\" && value.status !== \"error\") return false;\n if (value.error && !isRecord(value.error)) return false;\n return true;\n};\n\nconst isAnnotationEvent = (value: unknown): value is RelayAnnotationEvent[\"payload\"] => {\n if (!isRecord(value)) return false;\n if (value.version !== 1) return false;\n if (typeof value.requestId !== \"string\") return false;\n if (value.event !== \"progress\" && value.event !== \"ready\" && value.event !== \"warning\") return false;\n return true;\n};\n","import { readFile, readdir } from \"fs/promises\";\nimport { join } from \"path\";\nimport * as os from \"os\";\nimport type { SkillInfo, SkillMetadata } from \"./types\";\n\nexport class SkillLoader {\n private rootDir: string;\n private additionalPaths: string[];\n private skillCache: SkillInfo[] | null = null;\n\n constructor(rootDir: string, additionalPaths: string[] = []) {\n this.rootDir = rootDir;\n this.additionalPaths = additionalPaths.map((p) => this.expandPath(p));\n }\n\n private expandPath(p: string): string {\n if (p.startsWith(\"~\")) {\n return join(os.homedir(), p.slice(1));\n }\n return p;\n }\n\n private getCodexHome(): string {\n return process.env.CODEX_HOME || join(os.homedir(), \".codex\");\n }\n\n private getClaudeCodeHome(): string {\n return process.env.CLAUDECODE_HOME || process.env.CLAUDE_HOME || join(os.homedir(), \".claude\");\n }\n\n private getAmpHome(): string {\n return process.env.AMPCLI_HOME || process.env.AMP_CLI_HOME || process.env.AMP_HOME || join(os.homedir(), \".amp\");\n }\n\n async loadBestPractices(topic?: string): Promise<string> {\n return this.loadSkill(\"opendevbrowser-best-practices\", topic);\n }\n\n async loadSkill(name: string, topic?: string): Promise<string> {\n const skills = await this.listSkills();\n const skill = skills.find((s) => s.name === name);\n\n if (!skill) {\n const available = skills.map((s) => s.name).join(\", \") || \"none\";\n throw new Error(`Skill \"${name}\" not found. Available: ${available}`);\n }\n\n const content = await readFile(skill.path, \"utf8\");\n const trimmed = content.trim();\n\n if (!topic || !topic.trim()) {\n return trimmed;\n }\n\n const filtered = filterSections(trimmed, topic);\n return filtered || trimmed;\n }\n\n async listSkills(): Promise<SkillInfo[]> {\n if (this.skillCache) {\n return this.skillCache;\n }\n\n const skills: SkillInfo[] = [];\n const searchPaths = this.getSearchPaths();\n\n for (const searchPath of searchPaths) {\n const discovered = await this.discoverSkillsInPath(searchPath);\n for (const skill of discovered) {\n if (!skills.some((s) => s.name === skill.name)) {\n skills.push(skill);\n }\n }\n }\n\n this.skillCache = skills;\n return skills;\n }\n\n private getSearchPaths(): string[] {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || join(os.homedir(), \".config\", \"opencode\");\n\n const searchPaths = [\n join(this.rootDir, \".opencode\", \"skill\"),\n join(configDir, \"skill\"),\n join(this.rootDir, \".codex\", \"skills\"),\n join(this.getCodexHome(), \"skills\"),\n join(this.rootDir, \".claude\", \"skills\"),\n join(this.getClaudeCodeHome(), \"skills\"),\n join(this.rootDir, \".amp\", \"skills\"),\n join(this.getAmpHome(), \"skills\"),\n ...this.additionalPaths\n ];\n\n return Array.from(new Set(searchPaths));\n }\n\n private async discoverSkillsInPath(searchPath: string): Promise<SkillInfo[]> {\n const skills: SkillInfo[] = [];\n\n try {\n const entries = await readdir(searchPath, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillPath = join(searchPath, entry.name, \"SKILL.md\");\n try {\n const content = await readFile(skillPath, \"utf8\");\n const metadata = this.parseSkillMetadata(content, entry.name);\n\n skills.push({\n name: metadata.name,\n description: metadata.description,\n version: metadata.version ?? \"1.0.0\",\n path: skillPath\n });\n } catch {\n void 0;\n }\n }\n } catch {\n void 0;\n }\n\n return skills;\n }\n\n parseSkillMetadata(content: string, dirName: string): SkillMetadata {\n const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n\n if (!frontmatterMatch) {\n return {\n name: dirName,\n description: this.extractFirstParagraph(content) || `Skill: ${dirName}`\n };\n }\n\n const frontmatter = frontmatterMatch[1] || \"\";\n const metadata: SkillMetadata = {\n name: dirName,\n description: \"\"\n };\n\n const nameMatch = frontmatter.match(/^name:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (nameMatch?.[1]) {\n metadata.name = nameMatch[1].trim();\n }\n\n const descMatch = frontmatter.match(/^description:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (descMatch?.[1]) {\n metadata.description = descMatch[1].trim();\n }\n\n const versionMatch = frontmatter.match(/^version:\\s*[\"']?([^\"'\\n]+)[\"']?\\s*$/m);\n if (versionMatch?.[1]) {\n metadata.version = versionMatch[1].trim();\n }\n\n if (!metadata.description) {\n const afterFrontmatter = content.slice(frontmatterMatch[0].length);\n metadata.description = this.extractFirstParagraph(afterFrontmatter) || `Skill: ${metadata.name}`;\n }\n\n return metadata;\n }\n\n private extractFirstParagraph(content: string): string | null {\n const lines = content.trim().split(/\\n/);\n const paragraphLines: string[] = [];\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (trimmedLine.startsWith(\"#\")) continue;\n if (trimmedLine === \"\" && paragraphLines.length > 0) break;\n if (trimmedLine !== \"\") {\n paragraphLines.push(trimmedLine);\n }\n }\n\n const paragraph = paragraphLines.join(\" \").trim();\n return paragraph.length > 0 ? paragraph.slice(0, 200) : null;\n }\n\n clearCache(): void {\n this.skillCache = null;\n }\n}\n\nfunction filterSections(content: string, topic: string): string | null {\n const normalized = topic.trim().toLowerCase();\n const lines = content.split(/\\r?\\n/);\n const sections: Array<{ heading: string; body: string[] }> = [];\n let currentHeading = \"\";\n let currentBody: string[] = [];\n\n const flush = () => {\n if (currentHeading || currentBody.length > 0) {\n sections.push({ heading: currentHeading, body: [...currentBody] });\n }\n currentHeading = \"\";\n currentBody = [];\n };\n\n for (const line of lines) {\n const headingMatch = line.match(/^(#{1,3})\\s+(.*)$/);\n if (headingMatch) {\n flush();\n currentHeading = (headingMatch[2] || \"\").trim();\n currentBody.push(line);\n continue;\n }\n currentBody.push(line);\n }\n flush();\n\n const matches = sections.filter((section) => section.heading.toLowerCase().includes(normalized));\n if (matches.length === 0) {\n return null;\n }\n return matches.map((section) => section.body.join(\"\\n\")).join(\"\\n\\n\");\n}\n","import { BrowserManager } from \"../browser/browser-manager\";\nimport { OpsBrowserManager } from \"../browser/ops-browser-manager\";\nimport { AnnotationManager } from \"../browser/annotation-manager\";\nimport { ScriptRunner } from \"../browser/script-runner\";\nimport { ConfigStore, loadGlobalConfig } from \"../config\";\nimport { getExtensionPath } from \"../extension-extractor\";\nimport { RelayServer } from \"../relay/relay-server\";\nimport { SkillLoader } from \"../skills/skill-loader\";\nimport {\n createBrowserFallbackPort,\n createConfiguredProviderRuntime\n} from \"../providers/runtime-factory\";\nimport type { CoreOptions, OpenDevBrowserCore } from \"./types\";\n\nexport function createOpenDevBrowserCore(options: CoreOptions): OpenDevBrowserCore {\n const config = options.config ?? loadGlobalConfig();\n const configStore = new ConfigStore(config);\n const cacheRoot = options.worktree ?? options.directory;\n const baseManager = new BrowserManager(cacheRoot, config);\n const manager = new OpsBrowserManager(baseManager, config);\n const runner = new ScriptRunner(manager);\n const skills = new SkillLoader(cacheRoot, config.skillPaths);\n const browserFallbackPort = createBrowserFallbackPort(manager);\n const providerRuntime = createConfiguredProviderRuntime({\n config,\n manager,\n browserFallbackPort\n });\n const relay = new RelayServer();\n relay.setToken(config.relayToken);\n const annotationManager = new AnnotationManager(relay, config, manager);\n\n const ensureRelay = async (port = config.relayPort): Promise<void> => {\n if (port <= 0 || config.relayToken === false) {\n relay.stop();\n return;\n }\n const status = relay.status();\n if (status.running && status.port === port) {\n return;\n }\n relay.stop();\n try {\n await relay.start(port);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.includes(\"EADDRINUSE\") || message.includes(\"in use\")) {\n console.warn(`[opendevbrowser] Relay server port ${port} is already in use. Extension pairing will be unavailable.`);\n console.warn(`[opendevbrowser] To fix: kill the process using port ${port} or change relayPort in config.`);\n } else {\n console.warn(`[opendevbrowser] Failed to start relay server: ${message}`);\n }\n }\n };\n\n const cleanup = () => {\n relay.stop();\n baseManager.closeAll().catch(() => {});\n };\n\n return {\n cacheRoot,\n config,\n parallelismPolicy: config.parallelism,\n configStore,\n manager,\n annotationManager,\n runner,\n skills,\n providerRuntime,\n ...(browserFallbackPort ? { browserFallbackPort } : {}),\n relay,\n ensureRelay,\n cleanup,\n getExtensionPath\n };\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"http\";\nimport { timingSafeEqual } from \"crypto\";\nimport { mkdirSync, readFileSync, writeFileSync, unlinkSync, existsSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { generateSecureToken } from \"../utils/crypto\";\nimport { createOpenDevBrowserCore } from \"../core\";\nimport { loadGlobalConfig, type OpenDevBrowserConfig } from \"../config\";\nimport { handleDaemonCommand, type DaemonCommandRequest } from \"./daemon-commands\";\nimport { clearBinding, getBindingDiagnostics, getHubInstanceId } from \"./daemon-state\";\n\nconst DEFAULT_DAEMON_PORT = 8788;\n\nexport type DaemonState = {\n port: number;\n token: string;\n pid: number;\n relayPort: number;\n startedAt: string;\n hubInstanceId?: string;\n relayInstanceId?: string;\n relayEpoch?: number;\n};\n\ntype DaemonOptions = {\n port?: number;\n token?: string;\n config?: OpenDevBrowserConfig;\n directory?: string;\n worktree?: string | null;\n};\n\nexport function getCacheRoot(): string {\n const base = process.env.OPENCODE_CACHE_DIR\n ?? process.env.XDG_CACHE_HOME\n ?? join(homedir(), \".cache\");\n return join(base, \"opendevbrowser\");\n}\n\nexport function getDaemonMetadataPath(): string {\n return join(getCacheRoot(), \"daemon.json\");\n}\n\nexport function readDaemonMetadata(): DaemonState | null {\n const metadataPath = getDaemonMetadataPath();\n if (!existsSync(metadataPath)) {\n return null;\n }\n try {\n const content = readFileSync(metadataPath, \"utf-8\");\n return JSON.parse(content) as DaemonState;\n } catch {\n return null;\n }\n}\n\nexport function writeDaemonMetadata(state: DaemonState): void {\n const metadataPath = getDaemonMetadataPath();\n mkdirSync(join(getCacheRoot()), { recursive: true });\n writeFileSync(metadataPath, JSON.stringify(state, null, 2), { encoding: \"utf-8\", mode: 0o600 });\n}\n\nexport function clearDaemonMetadata(): void {\n const metadataPath = getDaemonMetadataPath();\n try {\n unlinkSync(metadataPath);\n } catch {\n void 0;\n }\n}\n\nfunction isAuthorized(request: IncomingMessage, token: string): boolean {\n const header = request.headers.authorization ?? \"\";\n if (!header.startsWith(\"Bearer \")) {\n return false;\n }\n const received = header.slice(\"Bearer \".length).trim();\n const expectedBuf = Buffer.from(token, \"utf-8\");\n const receivedBuf = Buffer.from(received, \"utf-8\");\n\n if (expectedBuf.length !== receivedBuf.length) {\n timingSafeEqual(expectedBuf, expectedBuf);\n return false;\n }\n return timingSafeEqual(expectedBuf, receivedBuf);\n}\n\nfunction sendJson(response: ServerResponse, status: number, payload: unknown): void {\n response.writeHead(status, {\n \"Content-Type\": \"application/json\",\n \"Cache-Control\": \"no-store\"\n });\n response.end(JSON.stringify(payload));\n}\n\nconst isDaemonCommandRequest = (value: Record<string, unknown>): value is DaemonCommandRequest => {\n if (typeof value.name !== \"string\") {\n return false;\n }\n if (typeof value.params === \"undefined\") {\n return true;\n }\n return typeof value.params === \"object\" && value.params !== null && !Array.isArray(value.params);\n};\n\nexport async function startDaemon(options: DaemonOptions = {}): Promise<{ state: DaemonState; stop: () => Promise<void> }> {\n const config = options.config ?? loadGlobalConfig();\n const port = options.port ?? config.daemonPort ?? DEFAULT_DAEMON_PORT;\n const token = options.token ?? config.daemonToken ?? generateSecureToken();\n const startedAt = new Date().toISOString();\n const core = createOpenDevBrowserCore({\n directory: options.directory ?? process.cwd(),\n worktree: options.worktree ?? null,\n config\n });\n\n await core.ensureRelay(config.relayPort);\n\n const server = createServer(async (request, response) => {\n if (!isAuthorized(request, token)) {\n sendJson(response, 401, { error: \"Unauthorized\" });\n return;\n }\n\n const url = new URL(request.url ?? \"/\", \"http://127.0.0.1\");\n\n if (request.method === \"GET\" && url.pathname === \"/status\") {\n const relayStatus = core.relay.status();\n writeDaemonMetadata({\n port,\n token,\n pid: process.pid,\n relayPort: relayStatus.port ?? config.relayPort,\n startedAt,\n hubInstanceId: getHubInstanceId(),\n relayInstanceId: relayStatus.instanceId,\n relayEpoch: relayStatus.epoch\n });\n sendJson(response, 200, {\n ok: true,\n pid: process.pid,\n hub: { instanceId: getHubInstanceId() },\n relay: relayStatus,\n binding: getBindingDiagnostics()\n });\n return;\n }\n\n if (request.method === \"POST\" && url.pathname === \"/stop\") {\n sendJson(response, 200, { ok: true });\n await stop();\n return;\n }\n\n if (request.method === \"POST\" && url.pathname === \"/command\") {\n try {\n const body = await readJson(request);\n if (!isDaemonCommandRequest(body)) {\n throw new Error(\"Invalid daemon command request\");\n }\n const data = await handleDaemonCommand(core, body);\n sendJson(response, 200, { ok: true, data });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n sendJson(response, 400, { ok: false, error: message });\n }\n return;\n }\n\n sendJson(response, 404, { error: \"Not found\" });\n });\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(port, \"127.0.0.1\", () => resolve());\n });\n\n const state: DaemonState = {\n port,\n token,\n pid: process.pid,\n relayPort: config.relayPort,\n startedAt,\n hubInstanceId: getHubInstanceId(),\n relayInstanceId: core.relay.status().instanceId,\n relayEpoch: core.relay.status().epoch\n };\n writeDaemonMetadata(state);\n\n const stop = async () => {\n clearDaemonMetadata();\n clearBinding();\n core.cleanup();\n await new Promise<void>((resolve) => {\n server.close(() => resolve());\n });\n };\n\n process.on(\"SIGINT\", () => {\n stop().catch(() => {});\n });\n process.on(\"SIGTERM\", () => {\n stop().catch(() => {});\n });\n\n return { state, stop };\n}\n\nfunction readJson(request: IncomingMessage): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n let data = \"\";\n request.setEncoding(\"utf8\");\n request.on(\"data\", (chunk) => {\n data += chunk;\n });\n request.on(\"end\", () => {\n try {\n const parsed = JSON.parse(data || \"{}\");\n if (!parsed || typeof parsed !== \"object\") {\n reject(new Error(\"Invalid JSON body\"));\n return;\n }\n resolve(parsed as Record<string, unknown>);\n } catch (error) {\n reject(error);\n }\n });\n request.on(\"error\", reject);\n });\n}\n","import { randomUUID } from \"crypto\";\nimport type { OpenDevBrowserCore } from \"../core\";\nimport { createConfiguredProviderRuntime } from \"../providers/runtime-factory\";\nimport { buildBlockerArtifacts, classifyBlockerSignal } from \"../providers/blocker\";\nimport { runProductVideoWorkflow, runResearchWorkflow, runShoppingWorkflow } from \"../providers/workflows\";\nimport {\n executeMacroResolution,\n shapeExecutionPayload,\n type MacroExecutionPayload,\n type MacroResolution\n} from \"../macros/execute\";\nimport {\n bindRelay,\n waitForBinding,\n releaseRelay,\n renewRelay,\n requireBinding,\n registerSessionLease,\n getSessionLease,\n requireSessionLease,\n releaseSessionLease,\n getBindingRenewConfig,\n getHubInstanceId\n} from \"./daemon-state\";\nimport { fetchWithTimeout } from \"./utils/http\";\n\nexport type DaemonCommandRequest = {\n name: string;\n params?: Record<string, unknown>;\n};\n\nexport async function handleDaemonCommand(core: OpenDevBrowserCore, request: DaemonCommandRequest): Promise<unknown> {\n const params = request.params ?? {};\n const bindingId = optionalString(params.bindingId);\n\n switch (request.name) {\n case \"relay.status\":\n return core.relay.status();\n case \"relay.cdpUrl\":\n return core.relay.getCdpUrl();\n case \"relay.annotationUrl\":\n return core.relay.getAnnotationUrl?.() ?? null;\n case \"relay.opsUrl\":\n return core.relay.getOpsUrl?.() ?? null;\n case \"relay.bind\": {\n const clientId = requireClientId(params);\n const binding = bindRelay(clientId);\n const relayStatus = core.relay.status();\n return {\n ...binding,\n hubInstanceId: getHubInstanceId(),\n relayInstanceId: relayStatus.instanceId,\n relayPort: relayStatus.port ?? null,\n bindingConfig: getBindingRenewConfig()\n };\n }\n case \"relay.wait\": {\n const clientId = requireClientId(params);\n const timeoutMs = optionalNumber(params.timeoutMs, \"timeoutMs\");\n const binding = await waitForBinding(clientId, timeoutMs);\n const relayStatus = core.relay.status();\n return {\n ...binding,\n hubInstanceId: getHubInstanceId(),\n relayInstanceId: relayStatus.instanceId,\n relayPort: relayStatus.port ?? null,\n bindingConfig: getBindingRenewConfig()\n };\n }\n case \"relay.renew\": {\n const clientId = requireClientId(params);\n const binding = renewRelay(clientId, requireString(bindingId, \"bindingId\"));\n const relayStatus = core.relay.status();\n return {\n ...binding,\n hubInstanceId: getHubInstanceId(),\n relayInstanceId: relayStatus.instanceId,\n relayPort: relayStatus.port ?? null,\n bindingConfig: getBindingRenewConfig()\n };\n }\n case \"relay.release\": {\n const clientId = requireClientId(params);\n return releaseRelay(clientId, requireString(bindingId, \"bindingId\"));\n }\n case \"session.launch\":\n return launchWithRelay(core, params, requireClientId(params), bindingId);\n case \"session.connect\":\n return connectWithRelayRouting(core, params, requireClientId(params), bindingId);\n case \"session.disconnect\":\n return disconnectSession(core, params, requireClientId(params), bindingId);\n case \"session.status\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.status(requireString(params.sessionId, \"sessionId\"));\n case \"annotate\": {\n await authorizeSessionCommand(core, params, request.name, bindingId);\n const sessionId = requireString(params.sessionId, \"sessionId\");\n const status = await core.manager.status(sessionId);\n const transport = requireAnnotationTransport(params.transport);\n if (transport === \"relay\" && status.mode !== \"extension\") {\n throw new Error(\"Relay annotations require extension mode.\");\n }\n const url = optionalString(params.url);\n const targetId = optionalString(params.targetId);\n const tabId = optionalNumber(params.tabId, \"tabId\");\n const screenshotMode = requireScreenshotMode(params.screenshotMode);\n const debug = optionalBoolean(params.debug) ?? false;\n const context = optionalString(params.context);\n const timeoutMs = optionalNumber(params.timeoutMs, \"timeoutMs\");\n return core.annotationManager.requestAnnotation({\n sessionId,\n transport,\n targetId,\n tabId,\n url,\n screenshotMode,\n debug,\n context,\n timeoutMs\n });\n }\n case \"targets.list\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.listTargets(\n requireString(params.sessionId, \"sessionId\"),\n optionalBoolean(params.includeUrls) ?? false\n );\n case \"targets.use\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.useTarget(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.targetId, \"targetId\")\n );\n case \"targets.new\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.newTarget(\n requireString(params.sessionId, \"sessionId\"),\n optionalString(params.url)\n );\n case \"targets.close\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n await core.manager.closeTarget(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.targetId, \"targetId\")\n );\n return { ok: true };\n case \"page.open\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.page(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.name, \"name\"),\n optionalString(params.url)\n );\n case \"page.list\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.listPages(requireString(params.sessionId, \"sessionId\"));\n case \"page.close\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n await core.manager.closePage(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.name, \"name\")\n );\n return { ok: true };\n case \"nav.goto\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n {\n const targetId = optionalString(params.targetId);\n const sessionId = requireString(params.sessionId, \"sessionId\");\n return attachBlockerMetaForNavigation(\n core,\n sessionId,\n await core.manager.goto(\n sessionId,\n requireString(params.url, \"url\"),\n requireWaitUntil(params.waitUntil),\n optionalNumber(params.timeoutMs, \"timeoutMs\") ?? 30000,\n undefined,\n targetId\n )\n );\n }\n case \"nav.wait\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n {\n const targetId = optionalString(params.targetId);\n const sessionId = requireString(params.sessionId, \"sessionId\");\n if (typeof params.ref === \"string\") {\n return attachBlockerMetaForNavigation(\n core,\n sessionId,\n await core.manager.waitForRef(\n sessionId,\n requireString(params.ref, \"ref\"),\n requireState(params.state),\n optionalNumber(params.timeoutMs, \"timeoutMs\") ?? 30000,\n targetId\n )\n );\n }\n return attachBlockerMetaForNavigation(\n core,\n sessionId,\n await core.manager.waitForLoad(\n sessionId,\n requireWaitUntil(params.until),\n optionalNumber(params.timeoutMs, \"timeoutMs\") ?? 30000,\n targetId\n )\n );\n }\n case \"nav.snapshot\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n {\n const targetId = optionalString(params.targetId);\n return core.manager.snapshot(\n requireString(params.sessionId, \"sessionId\"),\n requireSnapshotMode(params.mode),\n optionalNumber(params.maxChars, \"maxChars\") ?? 16000,\n optionalString(params.cursor),\n targetId\n );\n }\n case \"interact.click\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.click(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalString(params.targetId)\n );\n case \"interact.hover\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.hover(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalString(params.targetId)\n );\n case \"interact.press\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.press(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.key, \"key\"),\n optionalString(params.ref),\n optionalString(params.targetId)\n );\n case \"interact.check\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.check(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalString(params.targetId)\n );\n case \"interact.uncheck\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.uncheck(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalString(params.targetId)\n );\n case \"interact.type\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.type(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n requireString(params.text, \"text\"),\n optionalBoolean(params.clear) ?? false,\n optionalBoolean(params.submit) ?? false,\n optionalString(params.targetId)\n );\n case \"interact.select\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.select(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n requireStringArray(params.values, \"values\"),\n optionalString(params.targetId)\n );\n case \"interact.scroll\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.scroll(\n requireString(params.sessionId, \"sessionId\"),\n optionalNumber(params.dy, \"dy\") ?? 0,\n optionalString(params.ref),\n optionalString(params.targetId)\n );\n case \"interact.scrollIntoView\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.scrollIntoView(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalString(params.targetId)\n );\n case \"dom.getHtml\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domGetHtml(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalNumber(params.maxChars, \"maxChars\") ?? 8000,\n optionalString(params.targetId)\n );\n case \"dom.getText\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domGetText(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalNumber(params.maxChars, \"maxChars\") ?? 8000,\n optionalString(params.targetId)\n );\n case \"dom.getAttr\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domGetAttr(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n requireString(params.name, \"name\"),\n optionalString(params.targetId)\n );\n case \"dom.getValue\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domGetValue(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalString(params.targetId)\n );\n case \"dom.isVisible\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domIsVisible(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalString(params.targetId)\n );\n case \"dom.isEnabled\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domIsEnabled(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalString(params.targetId)\n );\n case \"dom.isChecked\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.domIsChecked(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalString(params.targetId)\n );\n case \"export.clonePage\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.clonePage(\n requireString(params.sessionId, \"sessionId\"),\n optionalString(params.targetId)\n );\n case \"export.cloneComponent\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.cloneComponent(\n requireString(params.sessionId, \"sessionId\"),\n requireString(params.ref, \"ref\"),\n optionalString(params.targetId)\n );\n case \"devtools.perf\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.perfMetrics(\n requireString(params.sessionId, \"sessionId\"),\n optionalString(params.targetId)\n );\n case \"page.screenshot\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.screenshot(\n requireString(params.sessionId, \"sessionId\"),\n optionalString(params.path),\n optionalString(params.targetId)\n );\n case \"devtools.consolePoll\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.consolePoll(\n requireString(params.sessionId, \"sessionId\"),\n optionalNumber(params.sinceSeq, \"sinceSeq\"),\n optionalNumber(params.max, \"max\") ?? 50\n );\n case \"devtools.networkPoll\":\n await authorizeSessionCommand(core, params, request.name, bindingId);\n return core.manager.networkPoll(\n requireString(params.sessionId, \"sessionId\"),\n optionalNumber(params.sinceSeq, \"sinceSeq\"),\n optionalNumber(params.max, \"max\") ?? 50\n );\n case \"devtools.debugTraceSnapshot\": {\n await authorizeSessionCommand(core, params, request.name, bindingId);\n const sessionId = requireString(params.sessionId, \"sessionId\");\n const manager = core.manager as OpenDevBrowserCore[\"manager\"] & {\n debugTraceSnapshot?: (\n sessionId: string,\n options?: {\n sinceConsoleSeq?: number;\n sinceNetworkSeq?: number;\n sinceExceptionSeq?: number;\n max?: number;\n requestId?: string;\n }\n ) => Promise<unknown>;\n exceptionPoll?: (\n sessionId: string,\n sinceSeq?: number,\n max?: number\n ) => Promise<{ events: unknown[]; nextSeq: number }>;\n };\n\n const max = optionalNumber(params.max, \"max\") ?? 50;\n const requestId = optionalString(params.requestId);\n const sinceConsoleSeq = optionalNumber(params.sinceConsoleSeq, \"sinceConsoleSeq\");\n const sinceNetworkSeq = optionalNumber(params.sinceNetworkSeq, \"sinceNetworkSeq\");\n const sinceExceptionSeq = optionalNumber(params.sinceExceptionSeq, \"sinceExceptionSeq\");\n\n if (typeof manager.debugTraceSnapshot === \"function\") {\n return manager.debugTraceSnapshot(sessionId, {\n sinceConsoleSeq,\n sinceNetworkSeq,\n sinceExceptionSeq,\n max,\n requestId\n });\n }\n\n const [page, consoleChannel, networkChannel] = await Promise.all([\n core.manager.status(sessionId),\n core.manager.consolePoll(sessionId, sinceConsoleSeq, max),\n core.manager.networkPoll(sessionId, sinceNetworkSeq, max)\n ]);\n const exceptionChannel = typeof manager.exceptionPoll === \"function\"\n ? await manager.exceptionPoll(sessionId, sinceExceptionSeq, max)\n : { events: [], nextSeq: sinceExceptionSeq ?? 0 };\n\n const fallbackResult = {\n requestId: requestId ?? randomUUID(),\n generatedAt: new Date().toISOString(),\n page,\n channels: {\n console: consoleChannel,\n network: networkChannel,\n exception: exceptionChannel\n }\n };\n return attachBlockerMetaForTrace(core, fallbackResult);\n }\n case \"session.cookieImport\": {\n await authorizeSessionCommand(core, params, request.name, bindingId);\n const sessionId = requireString(params.sessionId, \"sessionId\");\n const manager = core.manager as OpenDevBrowserCore[\"manager\"] & {\n cookieImport?: (\n sessionId: string,\n cookies: CookieImportRecord[],\n strict?: boolean,\n requestId?: string\n ) => Promise<{ requestId: string; imported: number; rejected: Array<{ index: number; reason: string }> }>;\n };\n\n const cookies = requireCookieArray(params.cookies, \"cookies\");\n const strict = optionalBoolean(params.strict) ?? true;\n const requestId = optionalString(params.requestId) ?? randomUUID();\n\n if (typeof manager.cookieImport === \"function\") {\n return manager.cookieImport(sessionId, cookies, strict, requestId);\n }\n\n const normalized: CookieImportRecord[] = [];\n const rejected: Array<{ index: number; reason: string }> = [];\n cookies.forEach((cookie, index) => {\n const validation = validateCookieRecord(cookie);\n if (!validation.valid) {\n rejected.push({ index, reason: validation.reason });\n return;\n }\n normalized.push(validation.cookie);\n });\n\n if (strict && rejected.length > 0) {\n throw new Error(`Cookie import rejected ${rejected.length} entries.`);\n }\n\n if (normalized.length > 0) {\n const targetId = optionalString(params.targetId);\n await core.manager.withPage(sessionId, targetId ?? null, async (page) => {\n await page.context().addCookies(normalized);\n return undefined;\n });\n }\n\n return {\n requestId,\n imported: normalized.length,\n rejected\n };\n }\n case \"session.cookieList\": {\n await authorizeSessionCommand(core, params, request.name, bindingId);\n const sessionId = requireString(params.sessionId, \"sessionId\");\n const manager = core.manager as OpenDevBrowserCore[\"manager\"] & {\n cookieList?: (\n sessionId: string,\n urls?: string[],\n requestId?: string\n ) => Promise<{ requestId: string; cookies: CookieListRecord[]; count: number }>;\n };\n\n const urls = requireOptionalCookieUrlArray(params.urls, \"urls\");\n const requestId = optionalString(params.requestId) ?? randomUUID();\n\n if (typeof manager.cookieList === \"function\") {\n return manager.cookieList(sessionId, urls, requestId);\n }\n\n const targetId = optionalString(params.targetId);\n const cookies = await core.manager.withPage(\n sessionId,\n targetId ?? null,\n async (page) => {\n const listed = urls ? await page.context().cookies(urls) : await page.context().cookies();\n return listed.map((cookie) => ({\n name: cookie.name,\n value: cookie.value,\n domain: cookie.domain,\n path: cookie.path,\n expires: cookie.expires,\n httpOnly: cookie.httpOnly,\n secure: cookie.secure,\n ...(cookie.sameSite ? { sameSite: cookie.sameSite as \"Strict\" | \"Lax\" | \"None\" } : {})\n }));\n }\n );\n\n return {\n requestId,\n cookies,\n count: cookies.length\n };\n }\n case \"macro.resolve\":\n return resolveMacroExpression(\n {\n expression: requireString(params.expression, \"expression\"),\n defaultProvider: optionalString(params.defaultProvider),\n includeCatalog: optionalBoolean(params.includeCatalog) ?? false,\n execute: optionalBoolean(params.execute) ?? false,\n timeoutMs: optionalNumber(params.timeoutMs, \"timeoutMs\")\n },\n core.config,\n core.manager\n );\n case \"research.run\":\n return runResearchWorkflow(\n createConfiguredProviderRuntime({\n config: core.config,\n manager: core.manager\n }),\n {\n topic: requireString(params.topic, \"topic\"),\n days: optionalNumber(params.days, \"days\"),\n from: optionalString(params.from),\n to: optionalString(params.to),\n sourceSelection: optionalProviderSelection(params.sourceSelection),\n sources: optionalProviderSources(params.sources),\n mode: optionalRenderMode(params.mode) ?? \"compact\",\n includeEngagement: optionalBoolean(params.includeEngagement),\n limitPerSource: optionalNumber(params.limitPerSource, \"limitPerSource\"),\n outputDir: optionalString(params.outputDir),\n ttlHours: optionalNumber(params.ttlHours, \"ttlHours\"),\n useCookies: optionalBoolean(params.useCookies),\n cookiePolicyOverride: optionalCookiePolicy(params.cookiePolicyOverride)\n }\n );\n case \"shopping.run\":\n return runShoppingWorkflow(\n createConfiguredProviderRuntime({\n config: core.config,\n manager: core.manager\n }),\n {\n query: requireString(params.query, \"query\"),\n providers: optionalStringArray(params.providers),\n budget: optionalNumber(params.budget, \"budget\"),\n region: optionalString(params.region),\n sort: optionalShoppingSort(params.sort),\n mode: optionalRenderMode(params.mode) ?? \"compact\",\n timeoutMs: optionalNumber(params.timeoutMs, \"timeoutMs\"),\n outputDir: optionalString(params.outputDir),\n ttlHours: optionalNumber(params.ttlHours, \"ttlHours\"),\n useCookies: optionalBoolean(params.useCookies),\n cookiePolicyOverride: optionalCookiePolicy(params.cookiePolicyOverride)\n }\n );\n case \"product.video.run\":\n return runProductVideoWorkflow(\n createConfiguredProviderRuntime({\n config: core.config,\n manager: core.manager\n }),\n {\n product_url: optionalString(params.product_url),\n product_name: optionalString(params.product_name),\n provider_hint: optionalString(params.provider_hint),\n include_screenshots: optionalBoolean(params.include_screenshots),\n include_all_images: optionalBoolean(params.include_all_images),\n include_copy: optionalBoolean(params.include_copy),\n output_dir: optionalString(params.output_dir),\n ttl_hours: optionalNumber(params.ttl_hours, \"ttl_hours\"),\n useCookies: optionalBoolean(params.useCookies),\n cookiePolicyOverride: optionalCookiePolicy(params.cookiePolicyOverride)\n },\n {\n captureScreenshot: async (url: string) => {\n const session = await core.manager.launch({\n headless: true,\n startUrl: url,\n // Capture sessions are ephemeral; avoid persisted profile lock contention.\n persistProfile: false\n });\n try {\n const screenshot = await core.manager.screenshot(session.sessionId);\n if (typeof screenshot.base64 !== \"string\" || screenshot.base64.length === 0) return null;\n return Buffer.from(screenshot.base64, \"base64\");\n } finally {\n await core.manager.disconnect(session.sessionId, true).catch(() => {\n // Best effort cleanup.\n });\n }\n }\n }\n );\n default:\n throw new Error(`Unknown daemon command: ${request.name}`);\n }\n}\n\nasync function launchWithRelay(\n core: OpenDevBrowserCore,\n params: Record<string, unknown>,\n clientId: string,\n bindingId?: string\n) {\n let relayStatus = core.relay.status();\n const extensionLegacy = optionalBoolean(params.extensionLegacy) ?? false;\n let relayUrl = extensionLegacy ? core.relay.getCdpUrl() : core.relay.getOpsUrl?.() ?? null;\n const relayPort = core.config.relayPort;\n const noExtension = optionalBoolean(params.noExtension) ?? false;\n const extensionOnly = optionalBoolean(params.extensionOnly) ?? false;\n const waitForExtension = optionalBoolean(params.waitForExtension) ?? false;\n const headlessExplicit = optionalBoolean(params.headless) === true;\n if (headlessExplicit && !noExtension) {\n throw unsupportedModeError(\n \"Extension mode does not support headless launches. Use --no-extension --headless for managed mode.\"\n );\n }\n const managedExplicit = Boolean(noExtension || headlessExplicit);\n const managedHeadless = headlessExplicit ? true : false;\n const waitTimeoutMs = clampWaitTimeout(optionalNumber(params.waitTimeoutMs, \"waitTimeoutMs\") ?? 30000);\n\n if (!managedExplicit && extensionLegacy) {\n requireBinding(clientId, bindingId);\n }\n\n if (waitForExtension && !managedExplicit) {\n const observedPort = resolveObservedPort(relayStatus, relayPort);\n const connected = await waitForRelayHandshake(core.relay, observedPort, waitTimeoutMs);\n if (connected) {\n relayStatus = core.relay.status();\n relayUrl = extensionLegacy ? core.relay.getCdpUrl() ?? relayUrl : core.relay.getOpsUrl?.() ?? relayUrl;\n }\n }\n\n const observedPort = resolveObservedPort(relayStatus, relayPort);\n const shouldFetchObserved = !managedExplicit && (!relayUrl || !(relayStatus.extensionHandshakeComplete || relayStatus.extensionConnected));\n const observedStatus = shouldFetchObserved ? await fetchRelayObservedStatus(observedPort) : null;\n if (!relayUrl) {\n const fallbackPort = isValidPort(observedStatus?.port) ? observedStatus?.port : observedPort;\n relayUrl = fallbackPort ? `ws://127.0.0.1:${fallbackPort}/${extensionLegacy ? \"cdp\" : \"ops\"}` : null;\n }\n const extensionReady = Boolean(\n relayUrl && (\n relayStatus.extensionHandshakeComplete ||\n observedStatus?.extensionHandshakeComplete ||\n relayStatus.extensionConnected ||\n observedStatus?.extensionConnected\n )\n );\n const diagnostics = observedStatus\n ? `Diagnostics: relayPort=${observedPort ?? \"?\"} instance=${observedStatus.instanceId.slice(0, 8)} ext=${observedStatus.extensionConnected} handshake=${observedStatus.extensionHandshakeComplete} ops=${observedStatus.opsConnected} cdp=${observedStatus.cdpConnected}`\n : null;\n const missingReason = diagnostics ? `Extension not connected. ${diagnostics}` : \"Extension not connected.\";\n\n if (extensionOnly && !extensionReady) {\n throw new Error(buildExtensionMissingMessage(missingReason));\n }\n\n if (!managedExplicit) {\n if (!extensionReady || !relayUrl) {\n throw new Error(buildExtensionMissingMessage(missingReason));\n }\n try {\n const result = await core.manager.connectRelay(relayUrl);\n const leaseId = extractLeaseId(result);\n if (result.mode === \"extension\" && leaseId) {\n registerSessionLease(result.sessionId, leaseId, clientId);\n }\n return { ...result, warnings: result.warnings ?? [], ...(leaseId ? { leaseId } : {}) };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const unauthorized = message.toLowerCase().includes(\"unauthorized\") || message.includes(\"401\");\n const relayLabel = extensionLegacy ? \"/cdp\" : \"/ops\";\n const reason = unauthorized\n ? `Extension relay connection failed: relay ${relayLabel} unauthorized (token mismatch).`\n : `Extension relay connection failed: ${message}`;\n throw new Error(buildExtensionMissingMessage(reason));\n }\n }\n\n try {\n const result = await core.manager.launch({\n profile: optionalString(params.profile),\n headless: managedHeadless,\n startUrl: optionalString(params.startUrl),\n chromePath: optionalString(params.chromePath),\n flags: optionalStringArray(params.flags),\n persistProfile: optionalBoolean(params.persistProfile)\n });\n return { ...result, warnings: result.warnings ?? [] };\n } catch (error) {\n throw new Error(buildManagedFailureMessage(error));\n }\n}\n\nfunction normalizeRelayEndpoint(\n wsEndpoint: string | undefined,\n path: \"cdp\" | \"ops\",\n allowBase: boolean\n): string | null {\n if (!wsEndpoint) return null;\n try {\n const url = new URL(wsEndpoint);\n if (url.protocol !== \"ws:\" && url.protocol !== \"wss:\") return null;\n if (url.hostname !== \"127.0.0.1\" && url.hostname !== \"localhost\") return null;\n if (!url.port || !/^\\d+$/.test(url.port)) return null;\n const normalizedPath = url.pathname.endsWith(\"/\") ? url.pathname.slice(0, -1) : url.pathname;\n if (!allowBase && normalizedPath === \"\") return null;\n if (normalizedPath && normalizedPath !== `/${path}`) return null;\n return `${url.protocol}//${url.hostname}:${url.port}/${path}`;\n } catch {\n return null;\n }\n}\n\nasync function connectWithRelayRouting(\n core: OpenDevBrowserCore,\n params: Record<string, unknown>,\n clientId: string,\n bindingId?: string\n) {\n const wsEndpoint = optionalString(params.wsEndpoint);\n const extensionLegacy = optionalBoolean(params.extensionLegacy) ?? false;\n const relayUrl = extensionLegacy ? core.relay.getCdpUrl() : core.relay.getOpsUrl?.() ?? null;\n const normalizedOpsEndpoint = normalizeRelayEndpoint(wsEndpoint, \"ops\", true);\n const normalizedLegacyEndpoint = normalizeRelayEndpoint(wsEndpoint, \"cdp\", extensionLegacy);\n const relayEndpoint = relayUrl && wsEndpoint === relayUrl\n ? relayUrl\n : extensionLegacy\n ? normalizedLegacyEndpoint ?? normalizedOpsEndpoint\n : normalizedOpsEndpoint;\n\n const hasExplicitCdp = Boolean(wsEndpoint || params.host || params.port);\n const headlessExplicit = optionalBoolean(params.headless) === true;\n if (normalizedLegacyEndpoint && !extensionLegacy) {\n throw new Error(\"Legacy extension relay (/cdp) requires --extension-legacy.\");\n }\n\n if (headlessExplicit && !hasExplicitCdp) {\n throw unsupportedModeError(\n \"Extension mode does not support headless connect routing. Use launch --no-extension --headless or connect to an explicit CDP endpoint.\"\n );\n }\n\n if (relayEndpoint || (!hasExplicitCdp && relayUrl)) {\n if (headlessExplicit) {\n throw unsupportedModeError(\n \"Extension mode does not support headless connect routing. Use launch --no-extension --headless or connect to an explicit CDP endpoint.\"\n );\n }\n if (extensionLegacy) {\n requireBinding(clientId, bindingId);\n }\n const result = await core.manager.connectRelay(relayEndpoint ?? relayUrl ?? \"\");\n const leaseId = extractLeaseId(result);\n if (result.mode === \"extension\" && leaseId) {\n registerSessionLease(result.sessionId, leaseId, clientId);\n }\n return { ...result, ...(leaseId ? { leaseId } : {}) };\n }\n\n if (!hasExplicitCdp) {\n throw new Error(\"Extension relay not available. Connect the extension or pass --cdp-port/--ws-endpoint.\");\n }\n\n return core.manager.connect({\n wsEndpoint,\n host: optionalString(params.host),\n port: optionalNumber(params.port, \"port\")\n });\n}\n\nasync function disconnectSession(\n core: OpenDevBrowserCore,\n params: Record<string, unknown>,\n clientId: string,\n bindingId?: string\n): Promise<{ ok: true; bindingReleased?: boolean }> {\n const sessionId = requireString(params.sessionId, \"sessionId\");\n let status: Awaited<ReturnType<OpenDevBrowserCore[\"manager\"][\"status\"]>> | null = null;\n try {\n status = await core.manager.status(sessionId);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n if (message.includes(\"[invalid_session]\") || message.includes(\"Unknown ops session\")) {\n releaseSessionLease(sessionId);\n return { ok: true };\n }\n throw error;\n }\n if (status.mode === \"extension\") {\n const lease = getSessionLease(sessionId);\n if (lease) {\n requireSessionLease(sessionId, clientId, optionalString(params.leaseId));\n } else {\n requireBinding(clientId, bindingId);\n }\n }\n await core.manager.disconnect(sessionId, optionalBoolean(params.closeBrowser) ?? false);\n releaseSessionLease(sessionId);\n if (status.mode === \"extension\" && bindingId) {\n releaseRelay(clientId, bindingId);\n return { ok: true, bindingReleased: true };\n }\n return { ok: true };\n}\n\nasync function authorizeSessionCommand(\n core: OpenDevBrowserCore,\n params: Record<string, unknown>,\n _commandName: string,\n bindingId?: string\n): Promise<void> {\n const sessionId = optionalString(params.sessionId);\n if (!sessionId) return;\n const clientId = requireClientId(params);\n const lease = getSessionLease(sessionId);\n if (lease) {\n requireSessionLease(sessionId, clientId, optionalString(params.leaseId));\n return;\n }\n const status = await core.manager.status(sessionId);\n if (status.mode !== \"extension\") {\n return;\n }\n requireBinding(clientId, bindingId);\n}\n\nfunction extractLeaseId(result: unknown): string | undefined {\n if (!result || typeof result !== \"object\") return undefined;\n const leaseId = (result as Record<string, unknown>).leaseId;\n return typeof leaseId === \"string\" ? leaseId : undefined;\n}\n\nfunction buildExtensionMissingMessage(reason: string): string {\n return [\n reason,\n \"Connect the extension: open the Chrome extension popup and click Connect, then retry.\",\n \"Tip: If the popup says Connected, it may be connected to a different relay instance/port than the daemon expects.\",\n \"Legend: ext=extension websocket, handshake=extension handshake, ops=active /ops client, cdp=active /cdp client, pairing=token required.\",\n \"\",\n \"Other options (explicit):\",\n \"- Managed (headed): npx opendevbrowser launch --no-extension\",\n \"- Managed (headless): npx opendevbrowser launch --no-extension --headless\",\n \"- Legacy extension relay: npx opendevbrowser launch --extension-legacy\",\n \"- CDPConnect (default port): npx opendevbrowser connect --cdp-port 9222\",\n \"- CDPConnect (explicit WS): npx opendevbrowser connect --ws-endpoint ws://127.0.0.1:9222/devtools/browser/<id>\",\n \"Note: CDPConnect requires Chrome started with --remote-debugging-port=9222.\"\n ].join(\"\\n\");\n}\n\nfunction buildManagedFailureMessage(error: unknown): string {\n const detail = error instanceof Error ? error.message : String(error);\n const normalized = detail.toLowerCase();\n const profileLocked = normalized.includes(\"singletonlock\")\n || normalized.includes(\"processsingleton\")\n || normalized.includes(\"profile in use\")\n || normalized.includes(\"already in use\")\n || normalized.includes(\"user data directory is already in use\")\n || normalized.includes(\"profile is locked\");\n\n if (profileLocked) {\n return [\n `Managed session failed: ${detail}`,\n \"\",\n \"Detected persisted profile lock (another Chrome process is using the same profile).\",\n \"Retry options (explicit):\",\n \"- Managed with a unique profile: npx opendevbrowser launch --no-extension --profile lock-safe-<timestamp>\",\n \"- Managed with a temporary profile: npx opendevbrowser launch --no-extension --persist-profile false\",\n \"- CDPConnect (default port): npx opendevbrowser connect --cdp-port 9222\",\n \"- CDPConnect (explicit WS): npx opendevbrowser connect --ws-endpoint ws://127.0.0.1:9222/devtools/browser/<id>\"\n ].join(\"\\n\");\n }\n\n return [\n `Managed session failed: ${detail}`,\n \"\",\n \"Final option (explicit):\",\n \"- CDPConnect (default port): npx opendevbrowser connect --cdp-port 9222\",\n \"- CDPConnect (explicit WS): npx opendevbrowser connect --ws-endpoint ws://127.0.0.1:9222/devtools/browser/<id>\"\n ].join(\"\\n\");\n}\n\nfunction unsupportedModeError(message: string): Error {\n return new Error(`[unsupported_mode] ${message}`);\n}\n\nasync function attachBlockerMetaForNavigation(\n core: OpenDevBrowserCore,\n sessionId: string,\n result: unknown\n): Promise<unknown> {\n if (!result || typeof result !== \"object\" || Array.isArray(result)) {\n return result;\n }\n\n const record = result as Record<string, unknown>;\n const existingMeta = (!Array.isArray(record.meta) && typeof record.meta === \"object\" && record.meta !== null)\n ? record.meta as Record<string, unknown>\n : undefined;\n if (existingMeta && typeof existingMeta.blockerState === \"string\") {\n return result;\n }\n\n const fallbackStatus = await core.manager.status(sessionId);\n let networkEvents: { events: Array<{ url?: string; status?: number }> } = { events: [] };\n try {\n const polled = await core.manager.networkPoll(\n sessionId,\n undefined,\n core.config.blockerArtifactCaps.maxNetworkEvents\n );\n if (polled && Array.isArray(polled.events)) {\n networkEvents = { events: polled.events as Array<{ url?: string; status?: number }> };\n }\n } catch {\n // Ignore polling failures for fallback blocker enrichment.\n }\n\n const blocker = classifyBlockerSignal({\n source: \"navigation\",\n url: typeof record.url === \"string\" ? record.url : fallbackStatus.url,\n finalUrl: typeof record.finalUrl === \"string\" ? record.finalUrl : fallbackStatus.url,\n title: fallbackStatus.title,\n status: typeof record.status === \"number\" ? record.status : findLatestStatus(networkEvents.events),\n networkHosts: extractHosts(networkEvents.events),\n threshold: core.config.blockerDetectionThreshold,\n promptGuardEnabled: core.config.security.promptInjectionGuard?.enabled ?? true\n });\n\n return {\n ...record,\n meta: {\n ...(existingMeta ?? {}),\n blockerState: blocker ? \"active\" : \"clear\",\n ...(blocker ? { blocker } : {})\n }\n };\n}\n\nfunction attachBlockerMetaForTrace(\n core: OpenDevBrowserCore,\n result: {\n requestId: string;\n generatedAt: string;\n page: { url?: string; title?: string };\n channels: {\n network: { events: Array<{ url?: string; status?: number }> };\n console: { events: unknown[] };\n exception: { events: unknown[] };\n };\n }\n): unknown {\n const blocker = classifyBlockerSignal({\n source: \"network\",\n url: result.page.url,\n finalUrl: result.page.url,\n title: result.page.title,\n status: findLatestStatus(result.channels.network.events),\n networkHosts: extractHosts(result.channels.network.events),\n traceRequestId: result.requestId,\n threshold: core.config.blockerDetectionThreshold,\n promptGuardEnabled: core.config.security.promptInjectionGuard?.enabled ?? true\n });\n const blockerArtifacts = blocker\n ? buildBlockerArtifacts({\n networkEvents: result.channels.network.events,\n consoleEvents: result.channels.console.events,\n exceptionEvents: result.channels.exception.events,\n promptGuardEnabled: core.config.security.promptInjectionGuard?.enabled ?? true,\n caps: core.config.blockerArtifactCaps\n })\n : undefined;\n return {\n ...result,\n meta: {\n blockerState: blocker ? \"active\" : \"clear\",\n ...(blocker ? { blocker } : {}),\n ...(blockerArtifacts ? { blockerArtifacts } : {})\n }\n };\n}\n\nfunction findLatestStatus(events: Array<{ status?: number }>): number | undefined {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const status = events[index]?.status;\n if (typeof status === \"number\") return status;\n }\n return undefined;\n}\n\nfunction extractHosts(events: Array<{ url?: string }>): string[] {\n const hosts: string[] = [];\n const seen = new Set<string>();\n for (const event of events) {\n if (typeof event.url !== \"string\") continue;\n try {\n const host = new URL(event.url).hostname.toLowerCase();\n if (!host || seen.has(host)) continue;\n seen.add(host);\n hosts.push(host);\n } catch {\n // Ignore invalid URLs.\n }\n }\n return hosts;\n}\n\nfunction requireString(value: unknown, label: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`Missing ${label}`);\n }\n return value;\n}\n\nfunction requireClientId(params: Record<string, unknown>): string {\n return requireString(params.clientId, \"clientId\");\n}\n\nfunction requireStringArray(value: unknown, label: string): string[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== \"string\")) {\n throw new Error(`Invalid ${label}`);\n }\n return value as string[];\n}\n\ntype CookieImportRecord = {\n name: string;\n value: string;\n url?: string;\n domain?: string;\n path?: string;\n expires?: number;\n httpOnly?: boolean;\n secure?: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n};\n\ntype CookieListRecord = {\n name: string;\n value: string;\n domain: string;\n path: string;\n expires: number;\n httpOnly: boolean;\n secure: boolean;\n sameSite?: \"Strict\" | \"Lax\" | \"None\";\n};\n\nfunction requireCookieArray(value: unknown, label: string): CookieImportRecord[] {\n if (!Array.isArray(value)) {\n throw new Error(`Invalid ${label}`);\n }\n const parsed: CookieImportRecord[] = [];\n for (const entry of value) {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) {\n throw new Error(`Invalid ${label}`);\n }\n const cookie = entry as Record<string, unknown>;\n if (typeof cookie.name !== \"string\" || typeof cookie.value !== \"string\") {\n throw new Error(`Invalid ${label}`);\n }\n if (typeof cookie.sameSite !== \"undefined\" && cookie.sameSite !== \"Strict\" && cookie.sameSite !== \"Lax\" && cookie.sameSite !== \"None\") {\n throw new Error(`Invalid ${label}`);\n }\n parsed.push({\n name: cookie.name,\n value: cookie.value,\n ...(typeof cookie.url === \"string\" ? { url: cookie.url } : {}),\n ...(typeof cookie.domain === \"string\" ? { domain: cookie.domain } : {}),\n ...(typeof cookie.path === \"string\" ? { path: cookie.path } : {}),\n ...(typeof cookie.expires === \"number\" ? { expires: cookie.expires } : {}),\n ...(typeof cookie.httpOnly === \"boolean\" ? { httpOnly: cookie.httpOnly } : {}),\n ...(typeof cookie.secure === \"boolean\" ? { secure: cookie.secure } : {}),\n ...(cookie.sameSite ? { sameSite: cookie.sameSite as \"Strict\" | \"Lax\" | \"None\" } : {})\n });\n }\n return parsed;\n}\n\nfunction requireOptionalCookieUrlArray(value: unknown, label: string): string[] | undefined {\n if (typeof value === \"undefined\") {\n return undefined;\n }\n if (!Array.isArray(value)) {\n throw new Error(`Invalid ${label}`);\n }\n\n const normalized: string[] = [];\n const seen = new Set<string>();\n for (const entry of value) {\n if (typeof entry !== \"string\") {\n throw new Error(`Invalid ${label}`);\n }\n const trimmed = entry.trim();\n if (!trimmed) {\n throw new Error(`Invalid ${label}`);\n }\n let parsedUrl: URL;\n try {\n parsedUrl = new URL(trimmed);\n } catch {\n throw new Error(`Invalid ${label}`);\n }\n if (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\") {\n throw new Error(`Invalid ${label}`);\n }\n const normalizedUrl = parsedUrl.toString();\n if (seen.has(normalizedUrl)) {\n continue;\n }\n seen.add(normalizedUrl);\n normalized.push(normalizedUrl);\n }\n\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction validateCookieRecord(cookie: CookieImportRecord): { valid: boolean; reason: string; cookie: CookieImportRecord } {\n const name = cookie.name?.trim();\n if (!name) {\n return { valid: false, reason: \"Cookie name is required.\", cookie };\n }\n if (!/^[^\\s;=]+$/.test(name)) {\n return { valid: false, reason: `Invalid cookie name: ${cookie.name}.`, cookie };\n }\n if (typeof cookie.value !== \"string\" || /\\r|\\n|;/.test(cookie.value)) {\n return { valid: false, reason: `Invalid cookie value for ${name}.`, cookie };\n }\n\n const hasUrl = typeof cookie.url === \"string\" && cookie.url.trim().length > 0;\n const hasDomain = typeof cookie.domain === \"string\" && cookie.domain.trim().length > 0;\n if (!hasUrl && !hasDomain) {\n return { valid: false, reason: `Cookie ${name} requires url or domain.`, cookie };\n }\n\n let normalizedUrl: string | undefined;\n if (hasUrl) {\n try {\n const parsedUrl = new URL(cookie.url as string);\n if (parsedUrl.protocol !== \"http:\" && parsedUrl.protocol !== \"https:\") {\n return { valid: false, reason: `Cookie ${name} url must be http(s).`, cookie };\n }\n normalizedUrl = parsedUrl.toString();\n } catch {\n return { valid: false, reason: `Cookie ${name} has invalid url.`, cookie };\n }\n }\n\n let normalizedDomain: string | undefined;\n if (hasDomain) {\n normalizedDomain = String(cookie.domain).trim().toLowerCase();\n if (!/^\\.?[a-z0-9.-]+$/.test(normalizedDomain) || normalizedDomain.includes(\"..\")) {\n return { valid: false, reason: `Cookie ${name} has invalid domain.`, cookie };\n }\n }\n\n const normalizedPath = typeof cookie.path === \"string\" ? cookie.path.trim() : undefined;\n if (typeof normalizedPath === \"string\" && !normalizedPath.startsWith(\"/\")) {\n return { valid: false, reason: `Cookie ${name} path must start with '/'.`, cookie };\n }\n\n if (typeof cookie.expires !== \"undefined\") {\n if (!Number.isFinite(cookie.expires) || cookie.expires < -1) {\n return { valid: false, reason: `Cookie ${name} has invalid expires.`, cookie };\n }\n }\n\n if (cookie.sameSite === \"None\" && cookie.secure !== true) {\n return { valid: false, reason: `Cookie ${name} with SameSite=None must set secure=true.`, cookie };\n }\n\n const normalizedCookie: CookieImportRecord = {\n name,\n value: cookie.value,\n ...(typeof cookie.expires === \"number\" ? { expires: cookie.expires } : {}),\n ...(typeof cookie.httpOnly === \"boolean\" ? { httpOnly: cookie.httpOnly } : {}),\n ...(typeof cookie.secure === \"boolean\" ? { secure: cookie.secure } : {}),\n ...(cookie.sameSite ? { sameSite: cookie.sameSite } : {})\n };\n\n if (normalizedDomain) {\n normalizedCookie.domain = normalizedDomain;\n normalizedCookie.path = normalizedPath ?? \"/\";\n } else if (normalizedUrl) {\n normalizedCookie.url = normalizedUrl;\n }\n\n return {\n valid: true,\n reason: \"\",\n cookie: normalizedCookie\n };\n}\n\nfunction optionalString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction optionalStringArray(value: unknown): string[] | undefined {\n return Array.isArray(value) && value.every((item) => typeof item === \"string\")\n ? value as string[]\n : undefined;\n}\n\nfunction optionalNumber(value: unknown, label: string): number | undefined {\n if (typeof value === \"undefined\") {\n return undefined;\n }\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n throw new Error(`Invalid ${label}`);\n}\n\nfunction optionalBoolean(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction optionalRenderMode(value: unknown): \"compact\" | \"json\" | \"md\" | \"context\" | \"path\" | undefined {\n if (typeof value === \"undefined\") return undefined;\n if (value === \"compact\" || value === \"json\" || value === \"md\" || value === \"context\" || value === \"path\") {\n return value;\n }\n throw new Error(\"Invalid mode\");\n}\n\nfunction optionalProviderSelection(value: unknown): \"auto\" | \"web\" | \"community\" | \"social\" | \"shopping\" | \"all\" | undefined {\n if (typeof value === \"undefined\") return undefined;\n if (value === \"auto\" || value === \"web\" || value === \"community\" || value === \"social\" || value === \"shopping\" || value === \"all\") {\n return value;\n }\n throw new Error(\"Invalid sourceSelection\");\n}\n\nfunction optionalProviderSources(value: unknown): Array<\"web\" | \"community\" | \"social\" | \"shopping\"> | undefined {\n if (typeof value === \"undefined\") return undefined;\n if (!Array.isArray(value)) {\n throw new Error(\"Invalid sources\");\n }\n const valid = value.every((entry) => entry === \"web\" || entry === \"community\" || entry === \"social\" || entry === \"shopping\");\n if (!valid) {\n throw new Error(\"Invalid sources\");\n }\n return value as Array<\"web\" | \"community\" | \"social\" | \"shopping\">;\n}\n\nfunction optionalCookiePolicy(value: unknown): \"off\" | \"auto\" | \"required\" | undefined {\n if (typeof value === \"undefined\") return undefined;\n if (value === \"off\" || value === \"auto\" || value === \"required\") {\n return value;\n }\n throw new Error(\"Invalid cookiePolicyOverride\");\n}\n\nfunction optionalShoppingSort(value: unknown): \"best_deal\" | \"lowest_price\" | \"highest_rating\" | \"fastest_shipping\" | undefined {\n if (typeof value === \"undefined\") return undefined;\n if (value === \"best_deal\" || value === \"lowest_price\" || value === \"highest_rating\" || value === \"fastest_shipping\") {\n return value;\n }\n throw new Error(\"Invalid shopping sort\");\n}\n\nfunction requireWaitUntil(value: unknown): \"domcontentloaded\" | \"load\" | \"networkidle\" {\n if (value === \"domcontentloaded\" || value === \"load\" || value === \"networkidle\") {\n return value;\n }\n return \"load\";\n}\n\nfunction requireSnapshotMode(value: unknown): \"outline\" | \"actionables\" {\n if (value === \"actionables\") return \"actionables\";\n return \"outline\";\n}\n\nfunction requireScreenshotMode(value: unknown): \"visible\" | \"full\" | \"none\" {\n if (value === \"visible\" || value === \"full\" || value === \"none\") {\n return value;\n }\n return \"visible\";\n}\n\nfunction requireAnnotationTransport(value: unknown): \"auto\" | \"direct\" | \"relay\" {\n if (value === \"auto\" || value === \"direct\" || value === \"relay\") {\n return value;\n }\n if (typeof value === \"undefined\") {\n return \"auto\";\n }\n throw new Error(\"Invalid transport\");\n}\n\nfunction requireState(value: unknown): \"attached\" | \"visible\" | \"hidden\" {\n if (value === \"visible\" || value === \"hidden\") return value;\n return \"attached\";\n}\n\ntype RelayObservedStatus = {\n instanceId: string;\n running: boolean;\n port?: number;\n extensionConnected: boolean;\n extensionHandshakeComplete: boolean;\n cdpConnected: boolean;\n opsConnected: boolean;\n pairingRequired: boolean;\n};\n\ntype MacroRuntimeModule = {\n createDefaultMacroRegistry?: () => {\n resolve: (expression: string, context?: { defaultProvider?: string }) => Promise<MacroResolution>;\n list: () => Array<{ name: string; pack?: string; description?: string }>;\n };\n};\n\ntype MacroResolveOptions = {\n expression: string;\n defaultProvider?: string;\n includeCatalog: boolean;\n execute: boolean;\n timeoutMs?: number;\n};\n\nconst MIN_WAIT_TIMEOUT_MS = 3000;\nconst WAIT_MIN_DELAY_MS = 250;\nconst WAIT_MAX_DELAY_MS = 2000;\nconst RELAY_STATUS_TIMEOUT_MS = 1500;\nconst MACRO_TIMEOUT_MIN_MS = 1_000;\nconst MACRO_TIMEOUT_MAX_MS = 300_000;\n\nfunction clampMacroRuntimeTimeout(timeoutMs: number | undefined): number | null {\n if (!Number.isFinite(timeoutMs ?? NaN)) {\n return null;\n }\n const parsed = Math.floor(timeoutMs as number);\n return Math.max(MACRO_TIMEOUT_MIN_MS, Math.min(MACRO_TIMEOUT_MAX_MS, parsed));\n}\n\nfunction clampWaitTimeout(timeoutMs: number): number {\n if (!Number.isFinite(timeoutMs)) {\n return MIN_WAIT_TIMEOUT_MS;\n }\n return Math.max(timeoutMs, MIN_WAIT_TIMEOUT_MS);\n}\n\nasync function waitForRelayHandshake(\n relay: { status: () => { extensionHandshakeComplete: boolean } },\n observedPort: number | null,\n timeoutMs: number\n): Promise<boolean> {\n const start = Date.now();\n let delay = WAIT_MIN_DELAY_MS;\n while (Date.now() - start < timeoutMs) {\n if (relay.status().extensionHandshakeComplete) {\n return true;\n }\n const observedStatus = await fetchRelayObservedStatus(observedPort);\n if (observedStatus?.extensionHandshakeComplete) {\n return true;\n }\n await new Promise((resolve) => setTimeout(resolve, delay));\n delay = Math.min(delay * 2, WAIT_MAX_DELAY_MS);\n }\n return false;\n}\n\nfunction resolveObservedPort(relayStatus: { port?: number }, configPort: number): number | null {\n if (isValidPort(relayStatus.port)) return relayStatus.port;\n if (isValidPort(configPort)) return configPort;\n return null;\n}\n\nfunction isValidPort(port: unknown): port is number {\n return typeof port === \"number\" && Number.isInteger(port) && port > 0 && port <= 65535;\n}\n\nasync function fetchRelayObservedStatus(port: number | null): Promise<RelayObservedStatus | null> {\n if (!isValidPort(port)) {\n return null;\n }\n try {\n const response = await fetchWithTimeout(\n `http://127.0.0.1:${port}/status`,\n undefined,\n RELAY_STATUS_TIMEOUT_MS\n );\n if (!response.ok) {\n return null;\n }\n const data = await response.json();\n if (!data || typeof data !== \"object\") {\n return null;\n }\n const record = data as Record<string, unknown>;\n if (typeof record.instanceId !== \"string\") {\n return null;\n }\n return {\n instanceId: record.instanceId,\n running: Boolean(record.running),\n port: typeof record.port === \"number\" ? record.port : undefined,\n extensionConnected: Boolean(record.extensionConnected),\n extensionHandshakeComplete: Boolean(record.extensionHandshakeComplete),\n cdpConnected: Boolean(record.cdpConnected),\n opsConnected: Boolean(record.opsConnected),\n pairingRequired: Boolean(record.pairingRequired)\n };\n } catch {\n return null;\n }\n}\n\nasync function loadMacroRuntime(): Promise<MacroRuntimeModule | null> {\n try {\n const module = await import(\"../macros\");\n return module as MacroRuntimeModule;\n } catch {\n return null;\n }\n}\n\nfunction parseFallbackMacro(expression: string, defaultProvider?: string): {\n action: {\n source: \"web\";\n operation: \"search\";\n input: { query: string; limit: number; providerId: string };\n };\n provenance: {\n macro: string;\n provider: string;\n resolvedQuery: string;\n pack: string;\n args: { positional: string[]; named: Record<string, string> };\n };\n} {\n const raw = expression.trim();\n if (!raw.startsWith(\"@\")) {\n throw new Error(\"Macro expressions must start with '@'\");\n }\n\n const body = raw.slice(1).trim();\n if (!body) {\n throw new Error(\"Macro name is required\");\n }\n\n const openParen = body.indexOf(\"(\");\n const closeParen = body.endsWith(\")\") ? body.length - 1 : -1;\n const macroName = openParen >= 0 ? body.slice(0, openParen).trim() : body;\n const argsBody = openParen >= 0 && closeParen > openParen\n ? body.slice(openParen + 1, closeParen).trim()\n : \"\";\n const positional = argsBody\n ? argsBody.split(\",\").map((part) => part.trim().replace(/^['\"]|['\"]$/g, \"\")).filter(Boolean)\n : [];\n const query = positional[0] ?? macroName;\n const provider = defaultProvider ?? \"web/default\";\n\n return {\n action: {\n source: \"web\",\n operation: \"search\",\n input: {\n query,\n limit: 10,\n providerId: provider\n }\n },\n provenance: {\n macro: macroName,\n provider,\n resolvedQuery: query,\n pack: \"fallback\",\n args: {\n positional,\n named: {}\n }\n }\n };\n}\n\nasync function resolveMacroExpression(\n options: MacroResolveOptions,\n config: Pick<OpenDevBrowserCore[\"config\"], \"blockerDetectionThreshold\" | \"security\" | \"providers\">,\n manager: OpenDevBrowserCore[\"manager\"]\n): Promise<{\n runtime: \"macros\" | \"fallback\";\n resolution: MacroResolution;\n catalog?: Array<{ name: string; pack?: string; description?: string }>;\n execution?: MacroExecutionPayload;\n}> {\n const runtime = await loadMacroRuntime();\n const registry = runtime?.createDefaultMacroRegistry?.();\n let resolvedRuntime: \"macros\" | \"fallback\" = \"fallback\";\n let resolution: MacroResolution;\n let catalog: Array<{ name: string; pack?: string; description?: string }> | undefined;\n\n if (registry) {\n resolvedRuntime = \"macros\";\n resolution = await registry.resolve(options.expression, {\n defaultProvider: options.defaultProvider\n });\n catalog = options.includeCatalog\n ? registry.list().map((entry) => ({\n name: entry.name,\n pack: entry.pack,\n description: entry.description\n }))\n : undefined;\n } else {\n resolution = parseFallbackMacro(options.expression, options.defaultProvider);\n }\n\n if (!options.execute) {\n return {\n runtime: resolvedRuntime,\n resolution,\n ...(catalog ? { catalog } : {})\n };\n }\n\n const macroTimeoutMs = clampMacroRuntimeTimeout(options.timeoutMs);\n const execution = shapeExecutionPayload(\n await executeMacroResolution(\n resolution,\n createConfiguredProviderRuntime({\n config,\n manager,\n ...(macroTimeoutMs !== null\n ? {\n init: {\n budgets: {\n timeoutMs: {\n search: macroTimeoutMs,\n fetch: macroTimeoutMs,\n crawl: macroTimeoutMs,\n post: macroTimeoutMs\n }\n }\n }\n }\n : {})\n })\n )\n );\n return {\n runtime: resolvedRuntime,\n resolution,\n ...(catalog ? { catalog } : {}),\n execution\n };\n}\n","import type {\n JsonValue,\n ProviderAggregateResult,\n ProviderCallResultByOperation,\n ProviderExecutionMetadata,\n ProviderOperation,\n ProviderRunOptions,\n ProviderSelection\n} from \"../providers/types\";\n\nexport type MacroResolution = {\n action: {\n source: ProviderSelection;\n operation: ProviderOperation;\n input: Record<string, unknown>;\n };\n provenance: {\n macro: string;\n provider: string;\n resolvedQuery: string;\n pack: string;\n args: {\n positional: string[];\n named: Record<string, string>;\n };\n };\n};\n\nexport type MacroRuntimeExecutor = {\n search: (\n input: ProviderCallResultByOperation[\"search\"],\n options?: ProviderRunOptions\n ) => Promise<ProviderAggregateResult>;\n fetch: (\n input: ProviderCallResultByOperation[\"fetch\"],\n options?: ProviderRunOptions\n ) => Promise<ProviderAggregateResult>;\n crawl: (\n input: ProviderCallResultByOperation[\"crawl\"],\n options?: ProviderRunOptions\n ) => Promise<ProviderAggregateResult>;\n post: (\n input: ProviderCallResultByOperation[\"post\"],\n options?: ProviderRunOptions\n ) => Promise<ProviderAggregateResult>;\n};\n\nexport type MacroExecutionPayload = {\n records: ProviderAggregateResult[\"records\"];\n failures: ProviderAggregateResult[\"failures\"];\n metrics: ProviderAggregateResult[\"metrics\"];\n meta: {\n ok: ProviderAggregateResult[\"ok\"];\n partial: ProviderAggregateResult[\"partial\"];\n sourceSelection: ProviderAggregateResult[\"sourceSelection\"];\n providerOrder: ProviderAggregateResult[\"providerOrder\"];\n trace: ProviderAggregateResult[\"trace\"];\n tier?: ProviderExecutionMetadata[\"tier\"];\n provenance?: ProviderExecutionMetadata[\"provenance\"];\n blocker?: ProviderExecutionMetadata[\"blocker\"];\n error?: ProviderAggregateResult[\"error\"];\n };\n diagnostics?: ProviderAggregateResult[\"diagnostics\"];\n};\n\nconst isRecordValue = (value: unknown): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst requireMacroString = (value: unknown, label: string): string => {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`Macro action missing ${label}`);\n }\n return value;\n};\n\nconst optionalPositiveInteger = (value: unknown): number | undefined =>\n typeof value === \"number\" && Number.isInteger(value) && value > 0 ? value : undefined;\n\nconst optionalBoolean = (value: unknown): boolean | undefined =>\n typeof value === \"boolean\" ? value : undefined;\n\nconst optionalJsonRecord = (value: unknown): Record<string, JsonValue> | undefined =>\n isRecordValue(value) ? value as Record<string, JsonValue> : undefined;\n\nconst optionalStringArray = (value: unknown): string[] | undefined => {\n if (!Array.isArray(value)) return undefined;\n const parsed = value\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n return parsed.length > 0 ? parsed : undefined;\n};\n\nconst normalizeSearchInput = (input: Record<string, unknown>): ProviderCallResultByOperation[\"search\"] => {\n const query = requireMacroString(input.query, \"search.query\");\n const limit = optionalPositiveInteger(input.limit);\n const filters = optionalJsonRecord(input.filters);\n return {\n query,\n ...(limit !== undefined ? { limit } : {}),\n ...(filters ? { filters } : {})\n };\n};\n\nconst normalizeFetchInput = (input: Record<string, unknown>): ProviderCallResultByOperation[\"fetch\"] => {\n const url = requireMacroString(input.url, \"fetch.url\");\n const filters = optionalJsonRecord(input.filters);\n return {\n url,\n ...(filters ? { filters } : {})\n };\n};\n\nconst normalizeCrawlInput = (input: Record<string, unknown>): ProviderCallResultByOperation[\"crawl\"] => {\n const seedUrls = optionalStringArray(input.seedUrls);\n if (!seedUrls || seedUrls.length === 0) {\n throw new Error(\"Macro action missing crawl.seedUrls\");\n }\n\n const strategy = input.strategy === \"bfs\" || input.strategy === \"dfs\"\n ? input.strategy\n : undefined;\n const maxDepth = optionalPositiveInteger(input.maxDepth);\n const maxPages = optionalPositiveInteger(input.maxPages);\n const maxPerDomain = optionalPositiveInteger(input.maxPerDomain);\n const filters = optionalJsonRecord(input.filters);\n\n return {\n seedUrls,\n ...(strategy ? { strategy } : {}),\n ...(maxDepth !== undefined ? { maxDepth } : {}),\n ...(maxPages !== undefined ? { maxPages } : {}),\n ...(maxPerDomain !== undefined ? { maxPerDomain } : {}),\n ...(filters ? { filters } : {})\n };\n};\n\nconst normalizePostInput = (input: Record<string, unknown>): ProviderCallResultByOperation[\"post\"] => {\n const target = requireMacroString(input.target, \"post.target\");\n const content = requireMacroString(input.content, \"post.content\");\n const mediaUrls = optionalStringArray(input.mediaUrls);\n const confirm = optionalBoolean(input.confirm);\n const riskAccepted = optionalBoolean(input.riskAccepted);\n const metadata = optionalJsonRecord(input.metadata);\n\n return {\n target,\n content,\n ...(mediaUrls ? { mediaUrls } : {}),\n ...(confirm !== undefined ? { confirm } : {}),\n ...(riskAccepted !== undefined ? { riskAccepted } : {}),\n ...(metadata ? { metadata } : {})\n };\n};\n\nconst buildRunOptions = (resolution: MacroResolution): ProviderRunOptions => {\n const source = resolution.action.source;\n const providerId = typeof resolution.action.input.providerId === \"string\"\n && resolution.action.input.providerId.trim()\n ? resolution.action.input.providerId.trim()\n : undefined;\n return {\n source,\n ...(providerId ? { providerIds: [providerId] } : {})\n };\n};\n\nexport const executeMacroResolution = async (\n resolution: MacroResolution,\n runtime: MacroRuntimeExecutor\n): Promise<ProviderAggregateResult> => {\n const { operation, input } = resolution.action;\n if (!isRecordValue(input)) {\n throw new Error(\"Macro action input is invalid\");\n }\n\n const options = buildRunOptions(resolution);\n switch (operation) {\n case \"search\":\n return runtime.search(normalizeSearchInput(input), options);\n case \"fetch\":\n return runtime.fetch(normalizeFetchInput(input), options);\n case \"crawl\":\n return runtime.crawl(normalizeCrawlInput(input), options);\n case \"post\":\n return runtime.post(normalizePostInput(input), options);\n default:\n throw new Error(`Macro operation is not supported: ${operation}`);\n }\n};\n\nexport const shapeExecutionPayload = (result: ProviderAggregateResult): MacroExecutionPayload => {\n return {\n records: result.records,\n failures: result.failures,\n metrics: result.metrics,\n meta: {\n ok: result.ok,\n partial: result.partial,\n sourceSelection: result.sourceSelection,\n providerOrder: result.providerOrder,\n trace: result.trace,\n ...(result.meta?.tier ? { tier: result.meta.tier } : {}),\n ...(result.meta?.provenance ? { provenance: result.meta.provenance } : {}),\n ...(result.meta?.blocker ? { blocker: result.meta.blocker } : {}),\n ...(result.error ? { error: result.error } : {})\n },\n ...(result.diagnostics ? { diagnostics: result.diagnostics } : {})\n };\n};\n","import { randomUUID } from \"crypto\";\n\nconst HUB_INSTANCE_ID = randomUUID();\nconst BINDING_TTL_MS = 60_000;\nconst RENEW_INTERVAL_MS = 20_000;\nconst RENEW_GRACE_MS = RENEW_INTERVAL_MS * 2;\nconst RENEW_JITTER_MS = 2000;\nconst WAIT_MAX_MS = 30_000;\n\nexport type RelayBindingState = {\n bindingId: string;\n clientId: string;\n expiresAt: number;\n lastRenewedAt: number;\n};\n\nexport type SessionLeaseState = {\n sessionId: string;\n leaseId: string;\n clientId: string;\n createdAt: number;\n lastUsedAt: number;\n};\n\nexport type RelayBindingResponse = {\n bindingId: string;\n expiresAt: string;\n ttlMs: number;\n renewAfterMs: number;\n};\n\nexport type RelayQueueResponse = {\n queued: true;\n position: number;\n waitUntil: string;\n waitMs: number;\n};\n\nexport type RelayBindResult = RelayBindingResponse | RelayQueueResponse;\n\ntype RelayQueueEntry = {\n clientId: string;\n requestedAt: number;\n timeoutAt: number;\n};\n\nlet binding: RelayBindingState | null = null;\nlet queue: RelayQueueEntry[] = [];\nconst sessionLeases = new Map<string, SessionLeaseState>();\n\nexport const getHubInstanceId = (): string => HUB_INSTANCE_ID;\n\nconst nowMs = (): number => Date.now();\n\nconst isExpired = (state: RelayBindingState): boolean => nowMs() > state.expiresAt + RENEW_GRACE_MS;\n\nconst computeRenewAfterMs = (): number => {\n const jitter = Math.floor((Math.random() * 2 - 1) * RENEW_JITTER_MS);\n return Math.max(1000, RENEW_INTERVAL_MS + jitter);\n};\n\nconst serializeBinding = (state: RelayBindingState): RelayBindingResponse => ({\n bindingId: state.bindingId,\n expiresAt: new Date(state.expiresAt).toISOString(),\n ttlMs: BINDING_TTL_MS,\n renewAfterMs: computeRenewAfterMs()\n});\n\nconst serializeQueue = (entry: RelayQueueEntry): RelayQueueResponse => ({\n queued: true,\n position: queue.findIndex((item) => item.clientId === entry.clientId) + 1,\n waitUntil: new Date(entry.timeoutAt).toISOString(),\n waitMs: Math.max(0, entry.timeoutAt - nowMs())\n});\n\nconst cleanupQueue = (): void => {\n const now = nowMs();\n queue = queue.filter((entry) => entry.timeoutAt > now);\n};\n\nconst getQueueEntry = (clientId: string): RelayQueueEntry | null => {\n return queue.find((entry) => entry.clientId === clientId) ?? null;\n};\n\nconst enqueueClient = (clientId: string): RelayQueueEntry => {\n cleanupQueue();\n const existing = getQueueEntry(clientId);\n if (existing) {\n return existing;\n }\n const entry: RelayQueueEntry = {\n clientId,\n requestedAt: nowMs(),\n timeoutAt: nowMs() + WAIT_MAX_MS\n };\n queue.push(entry);\n return entry;\n};\n\nconst dequeueClient = (clientId: string): void => {\n queue = queue.filter((entry) => entry.clientId !== clientId);\n};\n\nconst maybeGrantBinding = (clientId: string): RelayBindingResponse | null => {\n const existing = getBindingState();\n const now = nowMs();\n\n if (existing) {\n if (existing.clientId !== clientId) {\n return null;\n }\n existing.expiresAt = now + BINDING_TTL_MS;\n existing.lastRenewedAt = now;\n return serializeBinding(existing);\n }\n\n cleanupQueue();\n const head = queue[0];\n if (head && head.clientId !== clientId) {\n return null;\n }\n if (head && head.clientId === clientId) {\n queue.shift();\n }\n\n const state: RelayBindingState = {\n bindingId: randomUUID(),\n clientId: clientId.trim(),\n expiresAt: now + BINDING_TTL_MS,\n lastRenewedAt: now\n };\n binding = state;\n return serializeBinding(state);\n};\n\nexport const getBindingState = (): RelayBindingState | null => {\n if (binding && isExpired(binding)) {\n binding = null;\n }\n cleanupQueue();\n return binding;\n};\n\nexport const clearBinding = (): void => {\n binding = null;\n queue = [];\n};\n\nexport const registerSessionLease = (sessionId: string, leaseId: string, clientId: string): SessionLeaseState => {\n if (!sessionId || !sessionId.trim()) {\n throw new Error(\"RELAY_SESSION_REQUIRED: sessionId is required\");\n }\n if (!leaseId || !leaseId.trim()) {\n throw new Error(\"RELAY_LEASE_REQUIRED: leaseId is required\");\n }\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n const lease: SessionLeaseState = {\n sessionId,\n leaseId,\n clientId: clientId.trim(),\n createdAt: nowMs(),\n lastUsedAt: nowMs()\n };\n sessionLeases.set(sessionId, lease);\n return lease;\n};\n\nexport const getSessionLease = (sessionId: string): SessionLeaseState | null => {\n if (!sessionId || !sessionId.trim()) return null;\n return sessionLeases.get(sessionId) ?? null;\n};\n\nexport const touchSessionLease = (sessionId: string): void => {\n const lease = sessionLeases.get(sessionId);\n if (!lease) return;\n lease.lastUsedAt = nowMs();\n};\n\nexport const releaseSessionLease = (sessionId: string): void => {\n sessionLeases.delete(sessionId);\n};\n\nexport const clearSessionLeases = (): void => {\n sessionLeases.clear();\n};\n\nexport const requireSessionLease = (sessionId: string, clientId: string, leaseId: string | undefined): SessionLeaseState => {\n if (!sessionId || !sessionId.trim()) {\n throw new Error(\"RELAY_SESSION_REQUIRED: sessionId is required\");\n }\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n const lease = sessionLeases.get(sessionId);\n if (!lease) {\n throw new Error(\"RELAY_LEASE_REQUIRED: No active lease for session.\");\n }\n const normalizedClientId = clientId.trim();\n const normalizedLeaseId = leaseId?.trim() ?? \"\";\n\n if (!normalizedLeaseId) {\n if (lease.clientId !== normalizedClientId) {\n throw new Error(\"RELAY_LEASE_INVALID: Lease does not match session owner.\");\n }\n lease.lastUsedAt = nowMs();\n return lease;\n }\n if (lease.leaseId !== normalizedLeaseId || lease.clientId !== normalizedClientId) {\n throw new Error(\"RELAY_LEASE_INVALID: Lease does not match session owner.\");\n }\n lease.lastUsedAt = nowMs();\n return lease;\n};\n\nexport const bindRelay = (clientId: string): RelayBindResult => {\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n\n const result = maybeGrantBinding(clientId);\n if (result) {\n return result;\n }\n\n const entry = enqueueClient(clientId.trim());\n return serializeQueue(entry);\n};\n\nexport const waitForBinding = async (clientId: string, timeoutMs?: number): Promise<RelayBindingResponse> => {\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n\n const entry = enqueueClient(clientId.trim());\n const deadline = timeoutMs ? Math.min(entry.timeoutAt, nowMs() + timeoutMs) : entry.timeoutAt;\n\n while (nowMs() <= deadline) {\n const result = maybeGrantBinding(clientId);\n if (result) {\n return result;\n }\n cleanupQueue();\n if (!getQueueEntry(clientId)) {\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, 250));\n }\n\n dequeueClient(clientId);\n throw new Error(\"RELAY_WAIT_TIMEOUT: Timed out waiting for relay binding.\");\n};\n\nexport const renewRelay = (clientId: string, bindingId: string): RelayBindingResponse => {\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n if (!bindingId || !bindingId.trim()) {\n throw new Error(\"RELAY_BINDING_REQUIRED: bindingId is required\");\n }\n const existing = getBindingState();\n if (!existing) {\n throw new Error(\"RELAY_BINDING_REQUIRED: No active binding to renew.\");\n }\n if (existing.clientId !== clientId || existing.bindingId !== bindingId) {\n throw new Error(\"RELAY_BINDING_INVALID: Binding does not match the current owner.\");\n }\n const now = nowMs();\n existing.expiresAt = now + BINDING_TTL_MS;\n existing.lastRenewedAt = now;\n return serializeBinding(existing);\n};\n\nexport const releaseRelay = (clientId: string, bindingId: string): { released: boolean } => {\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n if (!bindingId || !bindingId.trim()) {\n throw new Error(\"RELAY_BINDING_REQUIRED: bindingId is required\");\n }\n const existing = getBindingState();\n if (!existing) {\n return { released: false };\n }\n if (existing.clientId !== clientId || existing.bindingId !== bindingId) {\n throw new Error(\"RELAY_BINDING_INVALID: Binding does not match the current owner.\");\n }\n binding = null;\n return { released: true };\n};\n\nexport const requireBinding = (clientId: string, bindingId: string | undefined): RelayBindingState => {\n if (!clientId || !clientId.trim()) {\n throw new Error(\"RELAY_CLIENT_ID_REQUIRED: clientId is required\");\n }\n const existing = getBindingState();\n if (!existing) {\n throw new Error(\"RELAY_BINDING_REQUIRED: Call relay.bind to acquire the relay binding.\");\n }\n if (!bindingId || !bindingId.trim()) {\n throw new Error(\"RELAY_BINDING_REQUIRED: bindingId is required for relay operations.\");\n }\n if (existing.clientId !== clientId || existing.bindingId !== bindingId) {\n throw new Error(\"RELAY_BINDING_INVALID: Binding does not match the current owner.\");\n }\n return existing;\n};\n\nexport const getBindingDiagnostics = (): {\n bindingId: string;\n clientId: string;\n expiresAt: string;\n expiresInMs: number;\n queueLength: number;\n} | null => {\n const existing = getBindingState();\n if (!existing) return null;\n const expiresInMs = Math.max(0, existing.expiresAt - nowMs());\n return {\n bindingId: existing.bindingId,\n clientId: existing.clientId,\n expiresAt: new Date(existing.expiresAt).toISOString(),\n expiresInMs,\n queueLength: queue.length\n };\n};\n\nexport const getBindingRenewConfig = (): { ttlMs: number; renewIntervalMs: number; graceMs: number; waitMaxMs: number } => ({\n ttlMs: BINDING_TTL_MS,\n renewIntervalMs: RENEW_INTERVAL_MS,\n graceMs: RENEW_GRACE_MS,\n waitMaxMs: WAIT_MAX_MS\n});\n","const DEFAULT_HTTP_TIMEOUT_MS = 5000;\n\ntype FetchInput = Parameters<typeof fetch>[0];\ntype FetchInit = Parameters<typeof fetch>[1];\n\nfunction isAbortError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n return \"name\" in error && (error as { name?: string }).name === \"AbortError\";\n}\n\nexport async function fetchWithTimeout(\n input: FetchInput,\n init: FetchInit = {},\n timeoutMs: number = DEFAULT_HTTP_TIMEOUT_MS\n): Promise<Response> {\n const resolvedTimeout = Number.isFinite(timeoutMs) && timeoutMs > 0\n ? timeoutMs\n : DEFAULT_HTTP_TIMEOUT_MS;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), resolvedTimeout);\n\n if (init?.signal) {\n if (init.signal.aborted) {\n controller.abort();\n } else {\n init.signal.addEventListener(\"abort\", () => controller.abort(), { once: true });\n }\n }\n\n try {\n return await fetch(input, { ...init, signal: controller.signal });\n } catch (error) {\n if (isAbortError(error)) {\n throw new Error(`Request timed out after ${resolvedTimeout}ms`);\n }\n throw error;\n } finally {\n clearTimeout(timeoutId);\n }\n}\n","import type { CommandResult } from \"./commands/types\";\n\nexport const EXIT_SUCCESS = 0;\nexport const EXIT_USAGE = 1;\nexport const EXIT_EXECUTION = 2;\nexport const EXIT_DISCONNECTED = 10;\n\nexport class CliError extends Error {\n exitCode: number;\n\n constructor(message: string, exitCode: number) {\n super(message);\n this.exitCode = exitCode;\n }\n}\n\nexport function createUsageError(message: string): CliError {\n return new CliError(message, EXIT_USAGE);\n}\n\nexport function createDisconnectedError(message: string): CliError {\n return new CliError(message, EXIT_DISCONNECTED);\n}\n\nexport function toCliError(error: unknown, fallbackExitCode = EXIT_EXECUTION): CliError {\n if (error instanceof CliError) {\n return error;\n }\n const message = error instanceof Error ? error.message : String(error);\n return new CliError(message, fallbackExitCode);\n}\n\nexport type ErrorPayload = {\n success: false;\n error: string;\n exitCode: number;\n};\n\nexport function formatErrorPayload(error: CliError): ErrorPayload {\n return {\n success: false,\n error: error.message,\n exitCode: error.exitCode\n };\n}\n\nexport function resolveExitCode(result: CommandResult): number | null {\n if (result.exitCode === null) {\n return null;\n }\n if (typeof result.exitCode === \"number\") {\n return result.exitCode;\n }\n return result.success ? EXIT_SUCCESS : EXIT_EXECUTION;\n}\n","import type { RelayStatus } from \"../relay/relay-server\";\nimport type { OpenDevBrowserConfig } from \"../config\";\nimport { loadGlobalConfig } from \"../config\";\nimport { readDaemonMetadata, writeDaemonMetadata, type DaemonState } from \"./daemon\";\nimport { fetchWithTimeout } from \"./utils/http\";\n\nexport type DaemonStatusPayload = {\n ok: true;\n pid: number;\n hub: { instanceId: string };\n relay: RelayStatus;\n binding: {\n bindingId: string;\n clientId: string;\n expiresAt: string;\n expiresInMs: number;\n } | null;\n};\n\nexport async function fetchDaemonStatus(port: number, token: string): Promise<DaemonStatusPayload | null> {\n try {\n const response = await fetchWithTimeout(`http://127.0.0.1:${port}/status`, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${token}` }\n });\n if (!response.ok) return null;\n return await response.json() as DaemonStatusPayload;\n } catch {\n return null;\n }\n}\n\nexport async function fetchDaemonStatusFromMetadata(config?: OpenDevBrowserConfig): Promise<DaemonStatusPayload | null> {\n const metadata = readDaemonMetadata();\n if (metadata) {\n const status = await fetchDaemonStatus(metadata.port, metadata.token);\n if (status?.ok) {\n persistDaemonMetadata(metadata, status, config);\n return status;\n }\n }\n\n const resolvedConfig = config ?? loadGlobalConfig();\n if (resolvedConfig.daemonPort > 0 && resolvedConfig.daemonToken) {\n const status = await fetchDaemonStatus(resolvedConfig.daemonPort, resolvedConfig.daemonToken);\n if (status?.ok) {\n persistDaemonMetadata({\n port: resolvedConfig.daemonPort,\n token: resolvedConfig.daemonToken,\n pid: status.pid,\n relayPort: status.relay.port ?? resolvedConfig.relayPort,\n startedAt: new Date().toISOString()\n }, status, resolvedConfig);\n return status;\n }\n }\n return null;\n}\n\nfunction persistDaemonMetadata(\n base: DaemonState,\n status: DaemonStatusPayload,\n config?: OpenDevBrowserConfig\n): void {\n const resolvedConfig = config ?? loadGlobalConfig();\n writeDaemonMetadata({\n port: base.port,\n token: base.token,\n pid: status.pid,\n relayPort: status.relay.port ?? resolvedConfig.relayPort,\n startedAt: base.startedAt ?? new Date().toISOString(),\n hubInstanceId: status.hub.instanceId,\n relayInstanceId: status.relay.instanceId,\n relayEpoch: status.relay.epoch\n });\n}\n","import { existsSync, readFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { randomUUID } from \"crypto\";\nimport { readDaemonMetadata, getCacheRoot, writeDaemonMetadata } from \"./daemon\";\nimport { CliError, createDisconnectedError, EXIT_EXECUTION } from \"./errors\";\nimport { writeFileAtomic } from \"../utils/fs\";\nimport { loadGlobalConfig } from \"../config\";\nimport { fetchDaemonStatus } from \"./daemon-status\";\nimport { fetchWithTimeout } from \"./utils/http\";\n\nconst CLIENT_ID_FILE = \"client.json\";\nconst DEFAULT_RENEW_AFTER_MS = 20_000;\nconst MIN_RENEW_AFTER_MS = 5_000;\nconst TRANSPORT_TIMEOUT_BUFFER_MS = 5_000;\nconst MAX_DERIVED_TRANSPORT_TIMEOUT_MS = 300_000;\nconst TRANSPORT_TIMEOUT_HINT_KEYS = [\"timeoutMs\", \"waitTimeoutMs\"] as const;\n\ntype DaemonResponse<T> = { ok?: boolean; data?: T; error?: string };\n\ntype BindingConfig = {\n ttlMs: number;\n renewIntervalMs: number;\n graceMs: number;\n waitMaxMs: number;\n};\n\ntype BindingResponse = {\n bindingId: string;\n expiresAt: string;\n ttlMs?: number;\n renewAfterMs?: number;\n};\n\ntype QueueResponse = {\n queued: true;\n position: number;\n waitUntil: string;\n waitMs?: number;\n};\n\ntype RelayBindResponse = (BindingResponse | QueueResponse) & {\n hubInstanceId?: string;\n relayInstanceId?: string;\n relayPort?: number | null;\n bindingConfig?: BindingConfig;\n};\n\ntype BindingState = {\n bindingId: string;\n expiresAtMs: number;\n renewAfterMs: number;\n};\n\ntype CallOptions = {\n requireBinding?: boolean;\n timeoutMs?: number;\n};\n\nlet cachedClientId: string | null = null;\n\nconst loadClientId = (): string => {\n if (cachedClientId) {\n return cachedClientId;\n }\n\n const cacheRoot = getCacheRoot();\n const filePath = join(cacheRoot, CLIENT_ID_FILE);\n if (existsSync(filePath)) {\n try {\n const content = readFileSync(filePath, \"utf-8\");\n const parsed = JSON.parse(content) as { clientId?: unknown };\n if (typeof parsed.clientId === \"string\" && parsed.clientId.trim()) {\n cachedClientId = parsed.clientId.trim();\n return cachedClientId;\n }\n } catch {\n // fallthrough to regenerate\n }\n }\n\n const clientId = randomUUID();\n const payload = JSON.stringify({ clientId, createdAt: new Date().toISOString() }, null, 2);\n writeFileAtomic(filePath, payload, { mode: 0o600 });\n cachedClientId = clientId;\n return clientId;\n};\n\nconst parseBindingResponse = (data: BindingResponse): BindingState => {\n const expiresAtMs = Date.parse(data.expiresAt);\n if (!Number.isFinite(expiresAtMs)) {\n throw new Error(\"Invalid binding expiry timestamp\");\n }\n const renewAfterMs = Math.max(\n MIN_RENEW_AFTER_MS,\n typeof data.renewAfterMs === \"number\" && Number.isFinite(data.renewAfterMs)\n ? data.renewAfterMs\n : DEFAULT_RENEW_AFTER_MS\n );\n return {\n bindingId: data.bindingId,\n expiresAtMs,\n renewAfterMs\n };\n};\n\nconst isBindingRequiredError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.startsWith(\"RELAY_BINDING_REQUIRED\") || message.startsWith(\"RELAY_BINDING_INVALID\");\n};\n\nconst isLeaseInvalidError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return message.startsWith(\"RELAY_LEASE_INVALID\");\n};\n\nexport class DaemonClient {\n private binding: BindingState | null = null;\n private renewTimer: NodeJS.Timeout | null = null;\n private readonly clientId: string;\n private readonly autoRenew: boolean;\n private sessionLeases = new Map<string, string>();\n\n constructor(options: { clientId?: string; autoRenew?: boolean } = {}) {\n this.clientId = options.clientId ?? loadClientId();\n this.autoRenew = options.autoRenew ?? false;\n }\n\n async call<T>(name: string, params: Record<string, unknown> = {}, options: CallOptions = {}): Promise<T> {\n try {\n const result = await this.callWithBinding<T>(name, params, options);\n this.maybeTrackLease(name, params, result);\n return result;\n } catch (error) {\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : undefined;\n if (sessionId && !(\"leaseId\" in params) && isLeaseInvalidError(error) && this.sessionLeases.has(sessionId)) {\n this.sessionLeases.delete(sessionId);\n const result = await this.callWithBinding<T>(name, params, options);\n this.maybeTrackLease(name, params, result);\n return result;\n }\n if (!options.requireBinding && isBindingRequiredError(error)) {\n await this.ensureBinding();\n const result = await this.callWithBinding<T>(name, params, { ...options, requireBinding: true });\n this.maybeTrackLease(name, params, result);\n return result;\n }\n throw error;\n }\n }\n\n async releaseBinding(): Promise<void> {\n if (!this.binding) return;\n const bindingId = this.binding.bindingId;\n try {\n await this.callRaw(\"relay.release\", { clientId: this.clientId, bindingId });\n } finally {\n this.clearBinding();\n }\n }\n\n private async callWithBinding<T>(name: string, params: Record<string, unknown>, options: CallOptions): Promise<T> {\n const requireBinding = options.requireBinding ?? false;\n const bindingId = requireBinding ? await this.ensureBinding() : this.binding?.bindingId;\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : undefined;\n const leaseId = sessionId ? this.sessionLeases.get(sessionId) : undefined;\n const payload = {\n ...params,\n clientId: this.clientId,\n ...(bindingId ? { bindingId } : {}),\n ...(leaseId ? { leaseId } : {})\n };\n return await this.callRaw<T>(name, payload, deriveTransportTimeoutMs(params, options.timeoutMs));\n }\n\n private maybeTrackLease<T>(name: string, params: Record<string, unknown>, result: T): void {\n if (name === \"session.disconnect\") {\n const sessionId = typeof params.sessionId === \"string\" ? params.sessionId : undefined;\n if (sessionId) {\n this.sessionLeases.delete(sessionId);\n }\n return;\n }\n if (name !== \"session.launch\" && name !== \"session.connect\") return;\n if (!result || typeof result !== \"object\") return;\n const record = result as Record<string, unknown>;\n const sessionId = record.sessionId;\n const leaseId = record.leaseId;\n if (typeof sessionId === \"string\" && typeof leaseId === \"string\") {\n this.sessionLeases.set(sessionId, leaseId);\n }\n }\n\n private async ensureBinding(): Promise<string> {\n if (this.binding && Date.now() < this.binding.expiresAtMs - MIN_RENEW_AFTER_MS) {\n return this.binding.bindingId;\n }\n const data = await this.callRaw<RelayBindResponse>(\"relay.bind\", { clientId: this.clientId });\n const state = await this.resolveBindingState(data);\n this.setBinding(state);\n return state.bindingId;\n }\n\n private async resolveBindingState(data: RelayBindResponse): Promise<BindingState> {\n if (\"queued\" in data && data.queued) {\n const waitMs = typeof data.waitMs === \"number\" && Number.isFinite(data.waitMs) ? data.waitMs : null;\n const timeoutMs = waitMs ? Math.max(1000, waitMs) : data.bindingConfig?.waitMaxMs;\n const waitResponse = await this.callRaw<RelayBindResponse>(\"relay.wait\", {\n clientId: this.clientId,\n ...(timeoutMs ? { timeoutMs } : {})\n });\n if (\"queued\" in waitResponse && waitResponse.queued) {\n throw new Error(\"RELAY_WAIT_TIMEOUT: Timed out waiting for relay binding.\");\n }\n return parseBindingResponse(waitResponse as BindingResponse);\n }\n return parseBindingResponse(data as BindingResponse);\n }\n\n private async renewBinding(): Promise<void> {\n if (!this.binding) return;\n const data = await this.callRaw<BindingResponse>(\"relay.renew\", {\n clientId: this.clientId,\n bindingId: this.binding.bindingId\n });\n this.setBinding(parseBindingResponse(data));\n }\n\n private setBinding(state: BindingState): void {\n this.binding = state;\n if (this.autoRenew) {\n this.scheduleRenew(state.renewAfterMs);\n }\n }\n\n private scheduleRenew(delayMs: number): void {\n if (!this.autoRenew) return;\n this.clearRenewTimer();\n this.renewTimer = setTimeout(() => {\n this.renewTimer = null;\n this.renewBinding().catch(() => this.clearBinding());\n }, delayMs);\n }\n\n private clearBinding(): void {\n this.binding = null;\n this.clearRenewTimer();\n }\n\n private clearRenewTimer(): void {\n if (this.renewTimer) {\n clearTimeout(this.renewTimer);\n this.renewTimer = null;\n }\n }\n\n private async callRaw<T>(name: string, params: Record<string, unknown>, timeoutMs?: number): Promise<T> {\n const connection = await resolveDaemonConnection();\n\n let response: Response;\n try {\n response = await fetchWithTimeout(`http://127.0.0.1:${connection.port}/command`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${connection.token}`\n },\n body: JSON.stringify({ name, params })\n }, timeoutMs);\n } catch {\n response = await retryWithRefreshedConnection(name, params, timeoutMs);\n }\n\n if (!response.ok) {\n const text = await response.text();\n let message = text || String(response.status);\n try {\n const parsed = JSON.parse(text) as Record<string, unknown> | null;\n if (parsed && typeof parsed === \"object\") {\n if (typeof parsed.error === \"string\" && parsed.error.trim()) {\n message = parsed.error;\n } else if (typeof parsed.message === \"string\" && parsed.message.trim()) {\n message = parsed.message;\n }\n }\n } catch {\n // Ignore JSON parse errors; fall back to raw text/status.\n }\n if (message.includes(\"Unauthorized\") || response.status === 401) {\n response = await retryWithRefreshedConnection(name, params, timeoutMs);\n if (!response.ok) {\n throw new CliError(message, EXIT_EXECUTION);\n }\n } else {\n throw new CliError(message, EXIT_EXECUTION);\n }\n }\n\n const payload = await response.json() as DaemonResponse<T>;\n if (!payload.ok) {\n throw new CliError(payload.error || \"Daemon command failed.\", EXIT_EXECUTION);\n }\n\n return payload.data as T;\n }\n}\n\nconst asPositiveNumber = (value: unknown): number | undefined => {\n return typeof value === \"number\" && Number.isFinite(value) && value > 0 ? value : undefined;\n};\n\nconst deriveTransportTimeoutMs = (\n params: Record<string, unknown>,\n explicitTimeoutMs?: number\n): number | undefined => {\n const explicit = asPositiveNumber(explicitTimeoutMs);\n if (explicit !== undefined) {\n return explicit;\n }\n for (const key of TRANSPORT_TIMEOUT_HINT_KEYS) {\n const value = asPositiveNumber(params[key]);\n if (value !== undefined) {\n return Math.min(value + TRANSPORT_TIMEOUT_BUFFER_MS, MAX_DERIVED_TRANSPORT_TIMEOUT_MS);\n }\n }\n return undefined;\n};\n\nconst cliClient = new DaemonClient({ autoRenew: false });\n\nexport async function callDaemon(command: string, params?: Record<string, unknown>, options?: CallOptions): Promise<unknown> {\n return cliClient.call(command, params ?? {}, options);\n}\n\nexport const __test__ = {\n deriveTransportTimeoutMs\n};\n\ntype DaemonConnection = {\n port: number;\n token: string;\n};\n\nconst resolveDaemonConnection = async (): Promise<DaemonConnection> => {\n const metadata = readDaemonMetadata();\n if (metadata) {\n return { port: metadata.port, token: metadata.token };\n }\n\n const config = loadGlobalConfig();\n if (config.daemonPort > 0 && config.daemonToken) {\n const status = await fetchDaemonStatus(config.daemonPort, config.daemonToken);\n if (status?.ok) {\n writeDaemonMetadata({\n port: config.daemonPort,\n token: config.daemonToken,\n pid: status.pid,\n relayPort: status.relay.port ?? config.relayPort,\n startedAt: new Date().toISOString(),\n hubInstanceId: status.hub.instanceId,\n relayInstanceId: status.relay.instanceId,\n relayEpoch: status.relay.epoch\n });\n return { port: config.daemonPort, token: config.daemonToken };\n }\n }\n\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n};\n\nconst retryWithRefreshedConnection = async (\n name: string,\n params: Record<string, unknown>,\n timeoutMs?: number\n): Promise<Response> => {\n const config = loadGlobalConfig();\n if (config.daemonPort <= 0 || !config.daemonToken) {\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n }\n const status = await fetchDaemonStatus(config.daemonPort, config.daemonToken);\n if (status?.ok) {\n writeDaemonMetadata({\n port: config.daemonPort,\n token: config.daemonToken,\n pid: status.pid,\n relayPort: status.relay.port ?? config.relayPort,\n startedAt: new Date().toISOString(),\n hubInstanceId: status.hub.instanceId,\n relayInstanceId: status.relay.instanceId,\n relayEpoch: status.relay.epoch\n });\n return await fetchWithTimeout(`http://127.0.0.1:${config.daemonPort}/command`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${config.daemonToken}`\n },\n body: JSON.stringify({ name, params })\n }, timeoutMs);\n }\n throw createDisconnectedError(\"Daemon not running. Start with `opendevbrowser serve`.\");\n};\n","import { randomUUID } from \"crypto\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\nimport type { AnnotationPayload, AnnotationItem, AnnotationScreenshot } from \"../relay/protocol\";\n\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\n\nconst sanitizeScreenshotLabel = (label: string): string => {\n const safe = label.replace(/[^a-z0-9-_]+/gi, \"-\").slice(0, 40);\n return safe || \"annotation\";\n};\n\nconst writeAnnotationScreenshots = async (\n screenshots: AnnotationScreenshot[]\n): Promise<Array<{ id: string; path: string }>> => {\n const results: Array<{ id: string; path: string }> = [];\n for (const screenshot of screenshots) {\n if (!screenshot.base64) continue;\n const buffer = Buffer.from(screenshot.base64, \"base64\");\n if (buffer.length > MAX_SCREENSHOT_BYTES) {\n continue;\n }\n const safeLabel = sanitizeScreenshotLabel(screenshot.label);\n const fileName = `opendevbrowser-annotate-${safeLabel}-${randomUUID().slice(0, 8)}.png`;\n const filePath = path.join(os.tmpdir(), fileName);\n await fs.writeFile(filePath, buffer);\n results.push({ id: screenshot.id, path: filePath });\n }\n return results;\n};\n\nconst roundNumber = (value: number): string => {\n return Math.round(value).toString();\n};\n\nconst formatRect = (rect: AnnotationPayload[\"annotations\"][number][\"rect\"]): string => {\n return `x=${roundNumber(rect.x)}, y=${roundNumber(rect.y)}, w=${roundNumber(rect.width)}, h=${roundNumber(rect.height)}`;\n};\n\nconst truncateText = (value: string, max: number): string => {\n if (value.length <= max) return value;\n return `${value.slice(0, max)}...`;\n};\n\nconst isSensitiveKey = (key: string): boolean => {\n const lowered = key.toLowerCase();\n return [\"password\", \"passwd\", \"token\", \"secret\", \"api-key\", \"apikey\", \"auth\", \"session\", \"csrf\", \"value\"].some((term) => lowered.includes(term));\n};\n\nconst looksSensitive = (value: string): boolean => {\n const trimmed = value.trim();\n if (trimmed.length < 12) return false;\n if (/[A-Z0-9]{20,}/.test(trimmed)) return true;\n if (/(token|secret|apikey|password)/i.test(trimmed)) return true;\n if (/^[A-Za-z0-9+/_-]{24,}={0,2}$/.test(trimmed)) return true;\n return false;\n};\n\nconst redactAnnotationItem = (item: AnnotationItem): AnnotationItem => {\n const attributes: Record<string, string> = {};\n for (const [key, value] of Object.entries(item.attributes)) {\n if (isSensitiveKey(key)) {\n continue;\n }\n if (looksSensitive(value)) {\n continue;\n }\n attributes[key] = value;\n }\n const note = item.note && looksSensitive(item.note) ? \"[redacted]\" : item.note;\n const text = item.text && looksSensitive(item.text) ? \"[redacted]\" : item.text;\n return {\n ...item,\n attributes,\n note,\n text\n };\n};\n\nconst redactAnnotationPayload = (payload: AnnotationPayload): AnnotationPayload => {\n const redacted: AnnotationPayload = {\n ...payload,\n annotations: payload.annotations.map((item) => redactAnnotationItem(item))\n };\n return redacted;\n};\n\nconst formatAnnotationMarkdown = (\n payload: AnnotationPayload,\n screenshotPaths: Array<{ id: string; path: string }>\n): string => {\n const screenshotIndex = new Map(screenshotPaths.map((entry) => [entry.id, entry.path]));\n\n const lines: string[] = [];\n lines.push(\"# Annotation Summary\");\n lines.push(\"\");\n lines.push(`- URL: ${payload.url}`);\n if (payload.title) {\n lines.push(`- Title: ${payload.title}`);\n }\n lines.push(`- Timestamp: ${payload.timestamp}`);\n lines.push(`- Screenshot mode: ${payload.screenshotMode}`);\n if (payload.context) {\n lines.push(`- Context: ${payload.context}`);\n }\n lines.push(\"\");\n\n payload.annotations.forEach((annotation, index) => {\n lines.push(`## ${index + 1}. ${annotation.tag}${annotation.idAttr ? `#${annotation.idAttr}` : \"\"}`);\n if (annotation.note) {\n lines.push(`> ${annotation.note}`);\n }\n lines.push(`- Selector: \\`${annotation.selector}\\``);\n lines.push(`- Rect: ${formatRect(annotation.rect)}`);\n if (annotation.a11y.role || annotation.a11y.label) {\n lines.push(`- A11y: role=${annotation.a11y.role ?? \"n/a\"}, label=${annotation.a11y.label ?? \"n/a\"}`);\n }\n if (annotation.text) {\n lines.push(`- Text: ${truncateText(annotation.text, 160)}`);\n }\n const shot = annotation.screenshotId ? screenshotIndex.get(annotation.screenshotId) : null;\n if (shot) {\n lines.push(`- Screenshot: ${shot}`);\n }\n lines.push(\"\");\n });\n\n return lines.join(\"\\n\");\n};\n\nexport const buildAnnotateResult = async (\n payload: AnnotationPayload\n): Promise<{ message: string; details: AnnotationPayload; screenshots: Array<{ id: string; path: string }> }> => {\n const redacted = redactAnnotationPayload(payload);\n const screenshots = await writeAnnotationScreenshots(redacted.screenshots ?? []);\n const message = formatAnnotationMarkdown(redacted, screenshots);\n return {\n message,\n details: redacted,\n screenshots\n };\n};\n"],"mappings":"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,IAAI;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAA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","names":["delay","resolve","path","readFile","nowMs","nowMs","randomUUID","nowMs","createHash","createHash","resolve","percentile","queue","percentile","isHttpUrl","extractLinks","fetch","queue","DEFAULT_TRAVERSAL","LINK_RE","asNumber","toPositiveInt","isHttpUrl","coerceStringArray","extractLinks","qualityFlags","unavailable","shouldSkipExpansionError","sortRows","mergedTraversal","queue","fetch","queue","isHttpUrl","decodeHtml","normalizeEscapedValue","firstNonEmptyMatch","hasValues","parseIsoDate","isHttpUrl","fetch","isHttpUrl","fetch","console","toDate","fromDate","asNumber","readdir","rm","dirname","join","randomUUID","tmpdir","createHash","createHash","asNumber","resolve","isHttpUrl","toPositiveInt","dedupeLinks","fallbackReasonCodeForError","readFallbackString","hash","extractHost","document","isHttpUrl","dedupeLinks","toPositiveInt","readFile","randomUUID","mkdir","rm","join","createHash","mkdir","stat","homedir","join","path","join","homedir","join","path","el","randomUUID","redactText","hash","nowMs","randomUUID","resolve","clamp","join","randomUUID","mkdir","rm","page","targetId","startTime","path","resolve","writeFile","randomUUID","randomUUID","resolve","randomUUID","parseJson","delay","randomUUID","path","writeFile","randomUUID","WebSocket","randomUUID","existsSync","join","join","existsSync","randomUUID","resolve","randomUUID","WebSocket","resolve","parseJson","fs","path","os","path","hash","content","randomUUID","WebSocket","randomUUID","resolve","parseJson","isRecord","requestId","WebSocket","readFile","readdir","join","os","createServer","timingSafeEqual","mkdirSync","readFileSync","writeFileSync","unlinkSync","existsSync","homedir","join","randomUUID","randomUUID","isExpired","resolve","binding","requireString","optionalBoolean","requireWaitUntil","requireState","requireSnapshotMode","requireStringArray","randomUUID","optionalStringArray","observedPort","path","delay","resolve","DEFAULT_DAEMON_PORT","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","unlinkSync","timingSafeEqual","createServer","resolve","existsSync","readFileSync","join","randomUUID","join","existsSync","readFileSync","randomUUID","requireBinding","sessionId","randomUUID","fs","path","os","truncateText"]}