opendevbrowser 0.0.17 → 0.0.19

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 (529) hide show
  1. package/README.md +172 -73
  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 +4 -1
  12. package/dist/browser/annotation-manager.d.ts.map +1 -1
  13. package/dist/browser/browser-manager.d.ts +147 -47
  14. package/dist/browser/browser-manager.d.ts.map +1 -1
  15. package/dist/browser/canvas-client.d.ts +1 -0
  16. package/dist/browser/canvas-client.d.ts.map +1 -1
  17. package/dist/browser/canvas-code-sync-manager.d.ts +9 -1
  18. package/dist/browser/canvas-code-sync-manager.d.ts.map +1 -1
  19. package/dist/browser/canvas-manager.d.ts +29 -1
  20. package/dist/browser/canvas-manager.d.ts.map +1 -1
  21. package/dist/browser/global-challenge-coordinator.d.ts +27 -0
  22. package/dist/browser/global-challenge-coordinator.d.ts.map +1 -0
  23. package/dist/browser/manager-types.d.ts +167 -1
  24. package/dist/browser/manager-types.d.ts.map +1 -1
  25. package/dist/browser/ops-browser-manager.d.ts +103 -3
  26. package/dist/browser/ops-browser-manager.d.ts.map +1 -1
  27. package/dist/browser/ops-client.d.ts +17 -1
  28. package/dist/browser/ops-client.d.ts.map +1 -1
  29. package/dist/browser/playwright-runtime.d.ts +4 -0
  30. package/dist/browser/playwright-runtime.d.ts.map +1 -0
  31. package/dist/browser/review-surface.d.ts +9 -0
  32. package/dist/browser/review-surface.d.ts.map +1 -0
  33. package/dist/browser/screencast-recorder.d.ts +57 -0
  34. package/dist/browser/screencast-recorder.d.ts.map +1 -0
  35. package/dist/browser/session-inspector.d.ts +71 -0
  36. package/dist/browser/session-inspector.d.ts.map +1 -0
  37. package/dist/browser/session-store.d.ts +5 -1
  38. package/dist/browser/session-store.d.ts.map +1 -1
  39. package/dist/browser/system-chrome-cookies.d.ts +46 -0
  40. package/dist/browser/system-chrome-cookies.d.ts.map +1 -0
  41. package/dist/browser/target-manager.d.ts +1 -0
  42. package/dist/browser/target-manager.d.ts.map +1 -1
  43. package/dist/cache/chrome-locator.d.ts.map +1 -1
  44. package/dist/cache/chrome-user-data.d.ts +17 -0
  45. package/dist/cache/chrome-user-data.d.ts.map +1 -0
  46. package/dist/canvas/adapter-plugins/loader.d.ts +13 -0
  47. package/dist/canvas/adapter-plugins/loader.d.ts.map +1 -0
  48. package/dist/canvas/adapter-plugins/manifest.d.ts +146 -0
  49. package/dist/canvas/adapter-plugins/manifest.d.ts.map +1 -0
  50. package/dist/canvas/adapter-plugins/types.d.ts +83 -0
  51. package/dist/canvas/adapter-plugins/types.d.ts.map +1 -0
  52. package/dist/canvas/adapter-plugins/validator.d.ts +10 -0
  53. package/dist/canvas/adapter-plugins/validator.d.ts.map +1 -0
  54. package/dist/canvas/code-sync/apply-tsx.d.ts +3 -1
  55. package/dist/canvas/code-sync/apply-tsx.d.ts.map +1 -1
  56. package/dist/canvas/code-sync/import.d.ts +1 -0
  57. package/dist/canvas/code-sync/import.d.ts.map +1 -1
  58. package/dist/canvas/code-sync/manifest.d.ts +2 -1
  59. package/dist/canvas/code-sync/manifest.d.ts.map +1 -1
  60. package/dist/canvas/code-sync/tsx-adapter.d.ts.map +1 -1
  61. package/dist/canvas/code-sync/types.d.ts +102 -10
  62. package/dist/canvas/code-sync/types.d.ts.map +1 -1
  63. package/dist/canvas/document-store.d.ts +11 -1
  64. package/dist/canvas/document-store.d.ts.map +1 -1
  65. package/dist/canvas/export.d.ts.map +1 -1
  66. package/dist/canvas/framework-adapters/custom-elements-v1.d.ts +3 -0
  67. package/dist/canvas/framework-adapters/custom-elements-v1.d.ts.map +1 -0
  68. package/dist/canvas/framework-adapters/html-static-v1.d.ts +3 -0
  69. package/dist/canvas/framework-adapters/html-static-v1.d.ts.map +1 -0
  70. package/dist/canvas/framework-adapters/markup.d.ts +9 -0
  71. package/dist/canvas/framework-adapters/markup.d.ts.map +1 -0
  72. package/dist/canvas/framework-adapters/react-tsx-v2.d.ts +3 -0
  73. package/dist/canvas/framework-adapters/react-tsx-v2.d.ts.map +1 -0
  74. package/dist/canvas/framework-adapters/registry.d.ts +12 -0
  75. package/dist/canvas/framework-adapters/registry.d.ts.map +1 -0
  76. package/dist/canvas/framework-adapters/svelte-sfc-v1.d.ts +3 -0
  77. package/dist/canvas/framework-adapters/svelte-sfc-v1.d.ts.map +1 -0
  78. package/dist/canvas/framework-adapters/types.d.ts +57 -0
  79. package/dist/canvas/framework-adapters/types.d.ts.map +1 -0
  80. package/dist/canvas/framework-adapters/vue-sfc-v1.d.ts +3 -0
  81. package/dist/canvas/framework-adapters/vue-sfc-v1.d.ts.map +1 -0
  82. package/dist/canvas/kits/catalog.d.ts +5 -0
  83. package/dist/canvas/kits/catalog.d.ts.map +1 -0
  84. package/dist/canvas/library-adapters/react/index.d.ts +3 -0
  85. package/dist/canvas/library-adapters/react/index.d.ts.map +1 -0
  86. package/dist/canvas/library-adapters/registry.d.ts +11 -0
  87. package/dist/canvas/library-adapters/registry.d.ts.map +1 -0
  88. package/dist/canvas/library-adapters/types.d.ts +43 -0
  89. package/dist/canvas/library-adapters/types.d.ts.map +1 -0
  90. package/dist/canvas/repo-store.d.ts +2 -0
  91. package/dist/canvas/repo-store.d.ts.map +1 -1
  92. package/dist/canvas/starters/catalog.d.ts +34 -0
  93. package/dist/canvas/starters/catalog.d.ts.map +1 -0
  94. package/dist/canvas/token-references.d.ts +22 -0
  95. package/dist/canvas/token-references.d.ts.map +1 -0
  96. package/dist/canvas/types.d.ts +345 -6
  97. package/dist/canvas/types.d.ts.map +1 -1
  98. package/dist/challenges/action-loop.d.ts +13 -0
  99. package/dist/challenges/action-loop.d.ts.map +1 -0
  100. package/dist/challenges/capability-matrix.d.ts +3 -0
  101. package/dist/challenges/capability-matrix.d.ts.map +1 -0
  102. package/dist/challenges/evidence-bundle.d.ts +48 -0
  103. package/dist/challenges/evidence-bundle.d.ts.map +1 -0
  104. package/dist/challenges/governed-adapter-gateway.d.ts +4 -0
  105. package/dist/challenges/governed-adapter-gateway.d.ts.map +1 -0
  106. package/dist/challenges/human-yield-gate.d.ts +20 -0
  107. package/dist/challenges/human-yield-gate.d.ts.map +1 -0
  108. package/dist/challenges/index.d.ts +15 -0
  109. package/dist/challenges/index.d.ts.map +1 -0
  110. package/dist/challenges/interpreter.d.ts +3 -0
  111. package/dist/challenges/interpreter.d.ts.map +1 -0
  112. package/dist/challenges/optional-computer-use-bridge.d.ts +9 -0
  113. package/dist/challenges/optional-computer-use-bridge.d.ts.map +1 -0
  114. package/dist/challenges/orchestrator.d.ts +32 -0
  115. package/dist/challenges/orchestrator.d.ts.map +1 -0
  116. package/dist/challenges/outcome-recorder.d.ts +8 -0
  117. package/dist/challenges/outcome-recorder.d.ts.map +1 -0
  118. package/dist/challenges/owned-environment-lane.d.ts +3 -0
  119. package/dist/challenges/owned-environment-lane.d.ts.map +1 -0
  120. package/dist/challenges/policy-gate.d.ts +9 -0
  121. package/dist/challenges/policy-gate.d.ts.map +1 -0
  122. package/dist/challenges/sanctioned-identity-lane.d.ts +3 -0
  123. package/dist/challenges/sanctioned-identity-lane.d.ts.map +1 -0
  124. package/dist/challenges/service-adapter-lane.d.ts +3 -0
  125. package/dist/challenges/service-adapter-lane.d.ts.map +1 -0
  126. package/dist/challenges/strategy-selector.d.ts +10 -0
  127. package/dist/challenges/strategy-selector.d.ts.map +1 -0
  128. package/dist/challenges/types.d.ts +277 -0
  129. package/dist/challenges/types.d.ts.map +1 -0
  130. package/dist/challenges/verification-gate.d.ts +15 -0
  131. package/dist/challenges/verification-gate.d.ts.map +1 -0
  132. package/dist/chunk-5FZQJRBQ.js +15256 -0
  133. package/dist/chunk-5FZQJRBQ.js.map +1 -0
  134. package/dist/chunk-W4IHGDXV.js +33519 -0
  135. package/dist/chunk-W4IHGDXV.js.map +1 -0
  136. package/dist/chunk-YBQECXZX.js +409 -0
  137. package/dist/chunk-YBQECXZX.js.map +1 -0
  138. package/dist/cli/args.d.ts +4 -4
  139. package/dist/cli/args.d.ts.map +1 -1
  140. package/dist/cli/commands/artifacts.d.ts.map +1 -1
  141. package/dist/cli/commands/canvas.d.ts +7 -7
  142. package/dist/cli/commands/canvas.d.ts.map +1 -1
  143. package/dist/cli/commands/daemon.d.ts +7 -0
  144. package/dist/cli/commands/daemon.d.ts.map +1 -1
  145. package/dist/cli/commands/desktop/accessibility-snapshot.d.ts +3 -0
  146. package/dist/cli/commands/desktop/accessibility-snapshot.d.ts.map +1 -0
  147. package/dist/cli/commands/desktop/active-window.d.ts +3 -0
  148. package/dist/cli/commands/desktop/active-window.d.ts.map +1 -0
  149. package/dist/cli/commands/desktop/capture-desktop.d.ts +3 -0
  150. package/dist/cli/commands/desktop/capture-desktop.d.ts.map +1 -0
  151. package/dist/cli/commands/desktop/capture-window.d.ts +3 -0
  152. package/dist/cli/commands/desktop/capture-window.d.ts.map +1 -0
  153. package/dist/cli/commands/desktop/shared.d.ts +19 -0
  154. package/dist/cli/commands/desktop/shared.d.ts.map +1 -0
  155. package/dist/cli/commands/desktop/status.d.ts +3 -0
  156. package/dist/cli/commands/desktop/status.d.ts.map +1 -0
  157. package/dist/cli/commands/desktop/windows.d.ts +3 -0
  158. package/dist/cli/commands/desktop/windows.d.ts.map +1 -0
  159. package/dist/cli/commands/devtools/dialog.d.ts +19 -0
  160. package/dist/cli/commands/devtools/dialog.d.ts.map +1 -0
  161. package/dist/cli/commands/devtools/screencast-start.d.ts +20 -0
  162. package/dist/cli/commands/devtools/screencast-start.d.ts.map +1 -0
  163. package/dist/cli/commands/devtools/screencast-stop.d.ts +17 -0
  164. package/dist/cli/commands/devtools/screencast-stop.d.ts.map +1 -0
  165. package/dist/cli/commands/devtools/screenshot.d.ts +2 -0
  166. package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -1
  167. package/dist/cli/commands/interact/click.d.ts.map +1 -1
  168. package/dist/cli/commands/interact/pointer-down.d.ts +7 -0
  169. package/dist/cli/commands/interact/pointer-down.d.ts.map +1 -0
  170. package/dist/cli/commands/interact/pointer-drag.d.ts +7 -0
  171. package/dist/cli/commands/interact/pointer-drag.d.ts.map +1 -0
  172. package/dist/cli/commands/interact/pointer-move.d.ts +7 -0
  173. package/dist/cli/commands/interact/pointer-move.d.ts.map +1 -0
  174. package/dist/cli/commands/interact/pointer-shared.d.ts +6 -0
  175. package/dist/cli/commands/interact/pointer-shared.d.ts.map +1 -0
  176. package/dist/cli/commands/interact/pointer-up.d.ts +7 -0
  177. package/dist/cli/commands/interact/pointer-up.d.ts.map +1 -0
  178. package/dist/cli/commands/interact/upload.d.ts +18 -0
  179. package/dist/cli/commands/interact/upload.d.ts.map +1 -0
  180. package/dist/cli/commands/macro-resolve.d.ts +2 -0
  181. package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
  182. package/dist/cli/commands/native.d.ts +10 -7
  183. package/dist/cli/commands/native.d.ts.map +1 -1
  184. package/dist/cli/commands/nav/review.d.ts +7 -0
  185. package/dist/cli/commands/nav/review.d.ts.map +1 -0
  186. package/dist/cli/commands/nav/snapshot.d.ts.map +1 -1
  187. package/dist/cli/commands/pages/open.d.ts.map +1 -1
  188. package/dist/cli/commands/product-video.d.ts +2 -0
  189. package/dist/cli/commands/product-video.d.ts.map +1 -1
  190. package/dist/cli/commands/research.d.ts +3 -0
  191. package/dist/cli/commands/research.d.ts.map +1 -1
  192. package/dist/cli/commands/run.d.ts +14 -0
  193. package/dist/cli/commands/run.d.ts.map +1 -1
  194. package/dist/cli/commands/serve.d.ts +1 -26
  195. package/dist/cli/commands/serve.d.ts.map +1 -1
  196. package/dist/cli/commands/session/connect.d.ts.map +1 -1
  197. package/dist/cli/commands/session/disconnect.d.ts.map +1 -1
  198. package/dist/cli/commands/session/inspector.d.ts +21 -0
  199. package/dist/cli/commands/session/inspector.d.ts.map +1 -0
  200. package/dist/cli/commands/session/launch.d.ts.map +1 -1
  201. package/dist/cli/commands/shopping.d.ts +5 -0
  202. package/dist/cli/commands/shopping.d.ts.map +1 -1
  203. package/dist/cli/commands/status.d.ts +2 -14
  204. package/dist/cli/commands/status.d.ts.map +1 -1
  205. package/dist/cli/commands/targets/new.d.ts.map +1 -1
  206. package/dist/cli/daemon-autostart.d.ts +11 -0
  207. package/dist/cli/daemon-autostart.d.ts.map +1 -1
  208. package/dist/cli/daemon-client.d.ts +3 -0
  209. package/dist/cli/daemon-client.d.ts.map +1 -1
  210. package/dist/cli/daemon-commands.d.ts.map +1 -1
  211. package/dist/cli/daemon-state.d.ts +16 -0
  212. package/dist/cli/daemon-state.d.ts.map +1 -1
  213. package/dist/cli/daemon-status.d.ts +7 -2
  214. package/dist/cli/daemon-status.d.ts.map +1 -1
  215. package/dist/cli/daemon.d.ts +1 -0
  216. package/dist/cli/daemon.d.ts.map +1 -1
  217. package/dist/cli/help.d.ts +15 -4
  218. package/dist/cli/help.d.ts.map +1 -1
  219. package/dist/cli/index.js +2476 -1036
  220. package/dist/cli/index.js.map +1 -1
  221. package/dist/cli/install-autostart-output.d.ts +6 -0
  222. package/dist/cli/install-autostart-output.d.ts.map +1 -0
  223. package/dist/cli/install-autostart-reconciliation.d.ts +23 -0
  224. package/dist/cli/install-autostart-reconciliation.d.ts.map +1 -0
  225. package/dist/cli/installers/skills.d.ts +42 -6
  226. package/dist/cli/installers/skills.d.ts.map +1 -1
  227. package/dist/cli/output.d.ts +3 -0
  228. package/dist/cli/output.d.ts.map +1 -1
  229. package/dist/cli/remote-desktop-runtime.d.ts +15 -0
  230. package/dist/cli/remote-desktop-runtime.d.ts.map +1 -0
  231. package/dist/cli/remote-manager.d.ts +24 -2
  232. package/dist/cli/remote-manager.d.ts.map +1 -1
  233. package/dist/cli/transport-timeouts.d.ts +8 -0
  234. package/dist/cli/transport-timeouts.d.ts.map +1 -0
  235. package/dist/cli/utils/http.d.ts +9 -0
  236. package/dist/cli/utils/http.d.ts.map +1 -1
  237. package/dist/cli/utils/parse.d.ts +2 -0
  238. package/dist/cli/utils/parse.d.ts.map +1 -1
  239. package/dist/cli/utils/skills.d.ts +1 -2
  240. package/dist/cli/utils/skills.d.ts.map +1 -1
  241. package/dist/cli/utils/workflow-message.d.ts +2 -0
  242. package/dist/cli/utils/workflow-message.d.ts.map +1 -0
  243. package/dist/config.d.ts +47 -0
  244. package/dist/config.d.ts.map +1 -1
  245. package/dist/core/bootstrap.d.ts.map +1 -1
  246. package/dist/core/index.d.ts +1 -0
  247. package/dist/core/index.d.ts.map +1 -1
  248. package/dist/core/logging.d.ts +3 -1
  249. package/dist/core/logging.d.ts.map +1 -1
  250. package/dist/core/runtime-assemblies.d.ts +22 -0
  251. package/dist/core/runtime-assemblies.d.ts.map +1 -0
  252. package/dist/core/types.d.ts +15 -0
  253. package/dist/core/types.d.ts.map +1 -1
  254. package/dist/desktop/audit.d.ts +37 -0
  255. package/dist/desktop/audit.d.ts.map +1 -0
  256. package/dist/desktop/errors.d.ts +7 -0
  257. package/dist/desktop/errors.d.ts.map +1 -0
  258. package/dist/desktop/index.d.ts +6 -0
  259. package/dist/desktop/index.d.ts.map +1 -0
  260. package/dist/desktop/runtime.d.ts +26 -0
  261. package/dist/desktop/runtime.d.ts.map +1 -0
  262. package/dist/desktop/types.d.ts +76 -0
  263. package/dist/desktop/types.d.ts.map +1 -0
  264. package/dist/extension-extractor.d.ts +6 -0
  265. package/dist/extension-extractor.d.ts.map +1 -1
  266. package/dist/index.d.ts.map +1 -1
  267. package/dist/index.js +1103 -467
  268. package/dist/index.js.map +1 -1
  269. package/dist/integrations/figma/assets.d.ts +13 -0
  270. package/dist/integrations/figma/assets.d.ts.map +1 -0
  271. package/dist/integrations/figma/auth.d.ts +3 -0
  272. package/dist/integrations/figma/auth.d.ts.map +1 -0
  273. package/dist/integrations/figma/client.d.ts +42 -0
  274. package/dist/integrations/figma/client.d.ts.map +1 -0
  275. package/dist/integrations/figma/mappers.d.ts +23 -0
  276. package/dist/integrations/figma/mappers.d.ts.map +1 -0
  277. package/dist/integrations/figma/normalize.d.ts +99 -0
  278. package/dist/integrations/figma/normalize.d.ts.map +1 -0
  279. package/dist/integrations/figma/url.d.ts +17 -0
  280. package/dist/integrations/figma/url.d.ts.map +1 -0
  281. package/dist/integrations/figma/variables.d.ts +21 -0
  282. package/dist/integrations/figma/variables.d.ts.map +1 -0
  283. package/dist/macros/execute-runtime.d.ts +19 -0
  284. package/dist/macros/execute-runtime.d.ts.map +1 -0
  285. package/dist/macros/execute.d.ts +3 -1
  286. package/dist/macros/execute.d.ts.map +1 -1
  287. package/dist/opendevbrowser.d.ts.map +1 -1
  288. package/dist/opendevbrowser.js +1103 -467
  289. package/dist/opendevbrowser.js.map +1 -1
  290. package/dist/providers/blocker.d.ts.map +1 -1
  291. package/dist/providers/browser-fallback.d.ts +30 -0
  292. package/dist/providers/browser-fallback.d.ts.map +1 -0
  293. package/dist/providers/constraint.d.ts +45 -0
  294. package/dist/providers/constraint.d.ts.map +1 -0
  295. package/dist/providers/index.d.ts +11 -2
  296. package/dist/providers/index.d.ts.map +1 -1
  297. package/dist/providers/policy.d.ts.map +1 -1
  298. package/dist/providers/product-video-compiler.d.ts +92 -0
  299. package/dist/providers/product-video-compiler.d.ts.map +1 -0
  300. package/dist/providers/registry.d.ts +37 -1
  301. package/dist/providers/registry.d.ts.map +1 -1
  302. package/dist/providers/renderer.d.ts.map +1 -1
  303. package/dist/providers/research-compiler.d.ts +64 -0
  304. package/dist/providers/research-compiler.d.ts.map +1 -0
  305. package/dist/providers/research-executor.d.ts +27 -0
  306. package/dist/providers/research-executor.d.ts.map +1 -0
  307. package/dist/providers/runtime-bundle.d.ts +26 -0
  308. package/dist/providers/runtime-bundle.d.ts.map +1 -0
  309. package/dist/providers/runtime-factory.d.ts +6 -1
  310. package/dist/providers/runtime-factory.d.ts.map +1 -1
  311. package/dist/providers/runtime-policy.d.ts +24 -0
  312. package/dist/providers/runtime-policy.d.ts.map +1 -0
  313. package/dist/providers/shared/anti-bot-policy.d.ts +3 -2
  314. package/dist/providers/shared/anti-bot-policy.d.ts.map +1 -1
  315. package/dist/providers/shopping/index.d.ts +11 -1
  316. package/dist/providers/shopping/index.d.ts.map +1 -1
  317. package/dist/providers/shopping-compiler.d.ts +51 -0
  318. package/dist/providers/shopping-compiler.d.ts.map +1 -0
  319. package/dist/providers/shopping-executor.d.ts +18 -0
  320. package/dist/providers/shopping-executor.d.ts.map +1 -0
  321. package/dist/providers/shopping-postprocess.d.ts +46 -0
  322. package/dist/providers/shopping-postprocess.d.ts.map +1 -0
  323. package/dist/providers/shopping-workflow.d.ts +33 -0
  324. package/dist/providers/shopping-workflow.d.ts.map +1 -0
  325. package/dist/providers/social/platform.d.ts +2 -1
  326. package/dist/providers/social/platform.d.ts.map +1 -1
  327. package/dist/providers/social/search-quality.d.ts +16 -0
  328. package/dist/providers/social/search-quality.d.ts.map +1 -0
  329. package/dist/providers/social/youtube-resolver.d.ts +2 -1
  330. package/dist/providers/social/youtube-resolver.d.ts.map +1 -1
  331. package/dist/providers/social/youtube.d.ts.map +1 -1
  332. package/dist/providers/types.d.ts +116 -4
  333. package/dist/providers/types.d.ts.map +1 -1
  334. package/dist/providers/web/crawl-worker.d.ts.map +1 -1
  335. package/dist/providers/web/extract.d.ts +16 -0
  336. package/dist/providers/web/extract.d.ts.map +1 -1
  337. package/dist/providers/web/index.d.ts.map +1 -1
  338. package/dist/providers/workflow-contracts.d.ts +53 -0
  339. package/dist/providers/workflow-contracts.d.ts.map +1 -0
  340. package/dist/providers/workflows.d.ts +30 -6
  341. package/dist/providers/workflows.d.ts.map +1 -1
  342. package/dist/{providers-G3LRHQXX.js → providers-G36AM3Z2.js} +2 -2
  343. package/dist/public-surface/generated-manifest.d.ts +1168 -0
  344. package/dist/public-surface/generated-manifest.d.ts.map +1 -0
  345. package/dist/public-surface/source.d.ts +437 -0
  346. package/dist/public-surface/source.d.ts.map +1 -0
  347. package/dist/relay/protocol.d.ts +25 -3
  348. package/dist/relay/protocol.d.ts.map +1 -1
  349. package/dist/relay/relay-endpoints.d.ts +21 -0
  350. package/dist/relay/relay-endpoints.d.ts.map +1 -1
  351. package/dist/relay/relay-server.d.ts +18 -0
  352. package/dist/relay/relay-server.d.ts.map +1 -1
  353. package/dist/skills/bundled-skill-directories.d.ts +8 -0
  354. package/dist/skills/bundled-skill-directories.d.ts.map +1 -0
  355. package/dist/skills/skill-loader.d.ts +9 -1
  356. package/dist/skills/skill-loader.d.ts.map +1 -1
  357. package/dist/skills/skill-loader.js +7 -0
  358. package/dist/skills/skill-nudge.d.ts.map +1 -1
  359. package/dist/skills/types.d.ts +31 -0
  360. package/dist/skills/types.d.ts.map +1 -1
  361. package/dist/snapshot/ops-snapshot.d.ts +1 -1
  362. package/dist/snapshot/ops-snapshot.d.ts.map +1 -1
  363. package/dist/snapshot/refs.d.ts +6 -1
  364. package/dist/snapshot/refs.d.ts.map +1 -1
  365. package/dist/snapshot/snapshotter.d.ts.map +1 -1
  366. package/dist/tools/connect.d.ts.map +1 -1
  367. package/dist/tools/deps.d.ts +4 -0
  368. package/dist/tools/deps.d.ts.map +1 -1
  369. package/dist/tools/desktop-shared.d.ts +6 -0
  370. package/dist/tools/desktop-shared.d.ts.map +1 -0
  371. package/dist/tools/desktop_accessibility_snapshot.d.ts +4 -0
  372. package/dist/tools/desktop_accessibility_snapshot.d.ts.map +1 -0
  373. package/dist/tools/desktop_active_window.d.ts +4 -0
  374. package/dist/tools/desktop_active_window.d.ts.map +1 -0
  375. package/dist/tools/desktop_capture_desktop.d.ts +4 -0
  376. package/dist/tools/desktop_capture_desktop.d.ts.map +1 -0
  377. package/dist/tools/desktop_capture_window.d.ts +4 -0
  378. package/dist/tools/desktop_capture_window.d.ts.map +1 -0
  379. package/dist/tools/desktop_status.d.ts +4 -0
  380. package/dist/tools/desktop_status.d.ts.map +1 -0
  381. package/dist/tools/desktop_windows.d.ts +4 -0
  382. package/dist/tools/desktop_windows.d.ts.map +1 -0
  383. package/dist/tools/dialog.d.ts +4 -0
  384. package/dist/tools/dialog.d.ts.map +1 -0
  385. package/dist/tools/index.d.ts +3 -0
  386. package/dist/tools/index.d.ts.map +1 -1
  387. package/dist/tools/launch.d.ts.map +1 -1
  388. package/dist/tools/macro_resolve.d.ts.map +1 -1
  389. package/dist/tools/pointer_down.d.ts +4 -0
  390. package/dist/tools/pointer_down.d.ts.map +1 -0
  391. package/dist/tools/pointer_drag.d.ts +4 -0
  392. package/dist/tools/pointer_drag.d.ts.map +1 -0
  393. package/dist/tools/pointer_move.d.ts +4 -0
  394. package/dist/tools/pointer_move.d.ts.map +1 -0
  395. package/dist/tools/pointer_up.d.ts +4 -0
  396. package/dist/tools/pointer_up.d.ts.map +1 -0
  397. package/dist/tools/product_video_run.d.ts.map +1 -1
  398. package/dist/tools/prompting_guide.d.ts.map +1 -1
  399. package/dist/tools/research_run.d.ts.map +1 -1
  400. package/dist/tools/review.d.ts +4 -0
  401. package/dist/tools/review.d.ts.map +1 -0
  402. package/dist/tools/screencast_start.d.ts +4 -0
  403. package/dist/tools/screencast_start.d.ts.map +1 -0
  404. package/dist/tools/screencast_stop.d.ts +4 -0
  405. package/dist/tools/screencast_stop.d.ts.map +1 -0
  406. package/dist/tools/screenshot.d.ts.map +1 -1
  407. package/dist/tools/session_inspector.d.ts +4 -0
  408. package/dist/tools/session_inspector.d.ts.map +1 -0
  409. package/dist/tools/shopping_run.d.ts.map +1 -1
  410. package/dist/tools/skill_list.d.ts.map +1 -1
  411. package/dist/tools/skill_load.d.ts.map +1 -1
  412. package/dist/tools/upload.d.ts +4 -0
  413. package/dist/tools/upload.d.ts.map +1 -0
  414. package/dist/tools/workflow-runtime.d.ts +4 -1
  415. package/dist/tools/workflow-runtime.d.ts.map +1 -1
  416. package/dist/utils/package-assets.d.ts +4 -0
  417. package/dist/utils/package-assets.d.ts.map +1 -0
  418. package/extension/canvas.html +379 -9
  419. package/extension/dist/annotate-content.js +62 -32
  420. package/extension/dist/annotation-payload.js +57 -21
  421. package/extension/dist/background.js +406 -61
  422. package/extension/dist/canvas/canvas-runtime.js +481 -52
  423. package/extension/dist/canvas/model.js +129 -1
  424. package/extension/dist/canvas-page.js +1882 -74
  425. package/extension/dist/ops/dom-bridge.js +139 -0
  426. package/extension/dist/ops/ops-runtime.js +2854 -295
  427. package/extension/dist/ops/ops-session-store.js +83 -5
  428. package/extension/dist/ops/snapshot-builder.js +2 -2
  429. package/extension/dist/ops/snapshot-shared.js +2 -2
  430. package/extension/dist/ops/target-session-coordinator.js +5 -3
  431. package/extension/dist/popup.js +50 -15
  432. package/extension/dist/services/CDPRouter.js +1567 -63
  433. package/extension/dist/services/ConnectionManager.js +436 -78
  434. package/extension/dist/services/RelayClient.js +70 -30
  435. package/extension/dist/services/TabManager.js +83 -10
  436. package/extension/dist/services/TargetSessionMap.js +127 -3
  437. package/extension/dist/services/attach-errors.js +20 -0
  438. package/extension/dist/services/cdp-router-commands.js +135 -8
  439. package/extension/dist/services/url-restrictions.js +9 -13
  440. package/extension/manifest.json +2 -2
  441. package/extension/popup.html +7 -6
  442. package/package.json +15 -7
  443. package/skills/AGENTS.md +9 -8
  444. package/skills/opendevbrowser-best-practices/SKILL.md +118 -9
  445. package/skills/opendevbrowser-best-practices/artifacts/browser-agent-known-issues-matrix.md +1 -0
  446. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +26 -12
  447. package/skills/opendevbrowser-best-practices/artifacts/parity-gates.md +9 -2
  448. package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +6 -0
  449. package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +58 -0
  450. package/skills/opendevbrowser-best-practices/assets/templates/skill-runtime-pack-matrix.json +674 -0
  451. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +9 -4
  452. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +89 -20
  453. package/skills/opendevbrowser-best-practices/scripts/resolve-odb-cli.sh +100 -0
  454. package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +1 -0
  455. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +256 -116
  456. package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +208 -0
  457. package/skills/opendevbrowser-continuity-ledger/SKILL.md +14 -1
  458. package/skills/opendevbrowser-continuity-ledger/scripts/validate-skill-assets.sh +61 -0
  459. package/skills/opendevbrowser-data-extraction/SKILL.md +6 -0
  460. package/skills/opendevbrowser-data-extraction/scripts/validate-skill-assets.sh +112 -0
  461. package/skills/opendevbrowser-design-agent/SKILL.md +275 -0
  462. package/skills/opendevbrowser-design-agent/artifacts/app-shell-and-state-wiring.md +84 -0
  463. package/skills/opendevbrowser-design-agent/artifacts/async-search-state-ownership.md +58 -0
  464. package/skills/opendevbrowser-design-agent/artifacts/component-pattern-index.md +130 -0
  465. package/skills/opendevbrowser-design-agent/artifacts/design-contract-playbook.md +157 -0
  466. package/skills/opendevbrowser-design-agent/artifacts/design-release-gate.md +40 -0
  467. package/skills/opendevbrowser-design-agent/artifacts/design-workflows.md +153 -0
  468. package/skills/opendevbrowser-design-agent/artifacts/existing-surface-adaptation.md +56 -0
  469. package/skills/opendevbrowser-design-agent/artifacts/external-pattern-synthesis.md +103 -0
  470. package/skills/opendevbrowser-design-agent/artifacts/frontend-evaluation-rubric.md +61 -0
  471. package/skills/opendevbrowser-design-agent/artifacts/implementation-anti-patterns.md +163 -0
  472. package/skills/opendevbrowser-design-agent/artifacts/isolated-preview-validation.md +68 -0
  473. package/skills/opendevbrowser-design-agent/artifacts/loading-and-feedback-surfaces.md +56 -0
  474. package/skills/opendevbrowser-design-agent/artifacts/opendevbrowser-ui-example-map.md +44 -0
  475. package/skills/opendevbrowser-design-agent/artifacts/performance-audit-playbook.md +70 -0
  476. package/skills/opendevbrowser-design-agent/artifacts/research-harvest-workflow.md +81 -0
  477. package/skills/opendevbrowser-design-agent/artifacts/scroll-reveal-surface-planning.md +64 -0
  478. package/skills/opendevbrowser-design-agent/artifacts/state-ownership-matrix.md +36 -0
  479. package/skills/opendevbrowser-design-agent/artifacts/theming-and-token-ownership.md +43 -0
  480. package/skills/opendevbrowser-design-agent/assets/templates/canvas-generation-plan.design.v1.json +58 -0
  481. package/skills/opendevbrowser-design-agent/assets/templates/design-audit-report.v1.md +34 -0
  482. package/skills/opendevbrowser-design-agent/assets/templates/design-brief.v1.md +40 -0
  483. package/skills/opendevbrowser-design-agent/assets/templates/design-contract.v1.json +226 -0
  484. package/skills/opendevbrowser-design-agent/assets/templates/design-release-gate.v1.json +35 -0
  485. package/skills/opendevbrowser-design-agent/assets/templates/design-review-checklist.json +57 -0
  486. package/skills/opendevbrowser-design-agent/assets/templates/real-surface-design-matrix.json +32 -0
  487. package/skills/opendevbrowser-design-agent/assets/templates/reference-pattern-board.v1.json +31 -0
  488. package/skills/opendevbrowser-design-agent/scripts/design-workflow.sh +171 -0
  489. package/skills/opendevbrowser-design-agent/scripts/extract-canvas-plan.sh +56 -0
  490. package/skills/opendevbrowser-design-agent/scripts/validate-skill-assets.sh +223 -0
  491. package/skills/opendevbrowser-form-testing/SKILL.md +19 -3
  492. package/skills/opendevbrowser-form-testing/artifacts/form-workflows.md +5 -4
  493. package/skills/opendevbrowser-form-testing/assets/templates/challenge-decision-tree.json +2 -0
  494. package/skills/opendevbrowser-form-testing/scripts/validate-skill-assets.sh +109 -0
  495. package/skills/opendevbrowser-login-automation/SKILL.md +21 -3
  496. package/skills/opendevbrowser-login-automation/artifacts/login-workflows.md +5 -4
  497. package/skills/opendevbrowser-login-automation/assets/templates/auth-signals.json +5 -0
  498. package/skills/opendevbrowser-login-automation/assets/templates/login-scenario-matrix.json +3 -2
  499. package/skills/opendevbrowser-login-automation/scripts/run-login-workflow.sh +17 -1
  500. package/skills/opendevbrowser-login-automation/scripts/validate-skill-assets.sh +133 -0
  501. package/skills/opendevbrowser-product-presentation-asset/SKILL.md +23 -11
  502. package/skills/opendevbrowser-product-presentation-asset/artifacts/asset-pack-assembly.md +5 -3
  503. package/skills/opendevbrowser-product-presentation-asset/assets/templates/shot-list.md +2 -0
  504. package/skills/opendevbrowser-product-presentation-asset/assets/templates/video-assembly.md +3 -2
  505. package/skills/opendevbrowser-product-presentation-asset/scripts/capture-screenshots.sh +5 -1
  506. package/skills/opendevbrowser-product-presentation-asset/scripts/collect-product.sh +6 -2
  507. package/skills/opendevbrowser-product-presentation-asset/scripts/download-images.sh +5 -1
  508. package/skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh +20 -7
  509. package/skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh +39 -0
  510. package/skills/opendevbrowser-product-presentation-asset/scripts/write-manifest.sh +5 -1
  511. package/skills/opendevbrowser-research/SKILL.md +14 -6
  512. package/skills/opendevbrowser-research/scripts/render-output.sh +5 -1
  513. package/skills/opendevbrowser-research/scripts/run-research.sh +5 -1
  514. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +45 -0
  515. package/skills/opendevbrowser-research/scripts/write-artifacts.sh +5 -1
  516. package/skills/opendevbrowser-shopping/SKILL.md +20 -1
  517. package/skills/opendevbrowser-shopping/scripts/normalize-offers.sh +6 -2
  518. package/skills/opendevbrowser-shopping/scripts/run-deal-hunt.sh +5 -1
  519. package/skills/opendevbrowser-shopping/scripts/run-shopping.sh +5 -1
  520. package/skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh +54 -0
  521. package/dist/chunk-5J3IFL3X.js +0 -16706
  522. package/dist/chunk-5J3IFL3X.js.map +0 -1
  523. package/dist/chunk-D633UO34.js +0 -8149
  524. package/dist/chunk-D633UO34.js.map +0 -1
  525. package/dist/chunk-V7KUDHDG.js +0 -276
  526. package/dist/chunk-V7KUDHDG.js.map +0 -1
  527. package/dist/runtime-factory-BICHDPE7.js +0 -13
  528. /package/dist/{providers-G3LRHQXX.js.map → providers-G36AM3Z2.js.map} +0 -0
  529. /package/dist/{runtime-factory-BICHDPE7.js.map → skills/skill-loader.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/extension-extractor.ts","../src/browser/script-runner.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/browser/canvas-manager.ts","../src/browser/canvas-client.ts","../src/canvas/document-store.ts","../src/canvas/types.ts","../src/canvas/code-sync/types.ts","../src/canvas/surface-palette.ts","../src/canvas/export.ts","../src/canvas/repo-store.ts","../src/canvas/code-sync/manifest.ts","../src/browser/canvas-code-sync-manager.ts","../src/canvas/code-sync/apply-tsx.ts","../src/canvas/code-sync/hash.ts","../src/canvas/code-sync/tsx-adapter.ts","../src/canvas/code-sync/import.ts","../src/canvas/code-sync/graph.ts","../src/canvas/code-sync/write.ts","../src/browser/canvas-session-sync-manager.ts","../src/config.ts","../src/utils/crypto.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\", \"canvas.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 { 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\";\nimport {\n applyRuntimePreviewBridge as runRuntimePreviewBridge,\n type RuntimePreviewBridgeInput,\n type RuntimePreviewBridgeResult\n} from \"./canvas-runtime-preview-bridge\";\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 startUrl?: string;\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 const result = await this.connectWithEndpoint(wsEndpoint, \"cdpConnect\");\n const startUrl = options.startUrl?.trim();\n if (startUrl && result.activeTargetId) {\n await this.goto(result.sessionId, startUrl);\n }\n return result;\n }\n\n async connectRelay(\n wsEndpoint: string,\n options?: { startUrl?: string }\n ): 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 const result = await this.connectWithEndpoint(connectEndpoint, \"extension\", reportedEndpoint);\n const startUrl = options?.startUrl?.trim();\n if (startUrl && result.activeTargetId) {\n await this.goto(result.sessionId, startUrl);\n }\n return result;\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 applyRuntimePreviewBridge(\n sessionId: string,\n targetId: string | null,\n input: RuntimePreviewBridgeInput\n ): Promise<RuntimePreviewBridgeResult> {\n return await this.withPage(sessionId, targetId, async (page) => {\n return await runRuntimePreviewBridge(page as {\n evaluate: <TArg, TResult>(\n pageFunction: (arg: TArg) => TResult | Promise<TResult>,\n arg: TArg\n ) => Promise<TResult>;\n }, input);\n });\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\" || mode === \"cdpConnect\") {\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\";\nimport type {\n RuntimePreviewBridgeInput,\n RuntimePreviewBridgeResult\n} from \"./canvas-runtime-preview-bridge\";\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, options?: { startUrl?: string }): ReturnType<BrowserManagerLike[\"connectRelay\"]> {\n const endpoint = new URL(wsEndpoint);\n if (endpoint.pathname.endsWith(\"/cdp\")) {\n return options?.startUrl\n ? this.base.connectRelay(wsEndpoint, options)\n : 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 ...(typeof options?.startUrl === \"string\" && options.startUrl.trim().length > 0\n ? { startUrl: options.startUrl.trim() }\n : {})\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 applyRuntimePreviewBridge(\n sessionId: string,\n targetId: string | null,\n input: RuntimePreviewBridgeInput\n ): Promise<RuntimePreviewBridgeResult> {\n if (!this.opsSessions.has(sessionId)) {\n if (typeof this.base.applyRuntimePreviewBridge === \"function\") {\n return await this.base.applyRuntimePreviewBridge(sessionId, targetId, input);\n }\n return await this.base.withPage(sessionId, targetId, async (page) => {\n const { applyRuntimePreviewBridge: runRuntimePreviewBridge } = await import(\"./canvas-runtime-preview-bridge\");\n return await runRuntimePreviewBridge(page as {\n evaluate: <TArg, TResult>(\n pageFunction: (arg: TArg) => TResult | Promise<TResult>,\n arg: TArg\n ) => Promise<TResult>;\n }, input);\n });\n }\n return await this.requestOps<RuntimePreviewBridgeResult>(\n sessionId,\n \"canvas.applyRuntimePreviewBridge\",\n this.withTarget({\n bindingId: input.bindingId,\n rootSelector: input.rootSelector,\n html: input.html\n }, targetId)\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 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 registerCanvasTarget(\n sessionId: string,\n targetId: string\n ): Promise<{ targetId: string; url?: string; title?: string; adopted?: boolean }> {\n if (!this.opsSessions.has(sessionId)) {\n return { targetId, adopted: false };\n }\n return await this.requestOps(sessionId, \"targets.registerCanvas\", { targetId });\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 canvasConnected: 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 const CANVAS_PROTOCOL_VERSION = \"1\";\nexport const MAX_CANVAS_PAYLOAD_BYTES = 12 * 1024 * 1024;\n\nexport type CanvasErrorCode =\n | \"canvas_unavailable\"\n | \"invalid_request\"\n | \"invalid_session\"\n | \"not_owner\"\n | \"restricted_url\"\n | \"timeout\"\n | \"not_supported\"\n | \"execution_failed\"\n | \"plan_required\"\n | \"revision_conflict\"\n | \"unsupported_target\"\n | \"lease_reclaim_required\"\n | \"policy_violation\"\n | \"code_sync_required\"\n | \"code_sync_conflict\"\n | \"code_sync_unsupported\"\n | \"code_sync_out_of_date\";\n\nexport type CanvasError = {\n code: CanvasErrorCode;\n message: string;\n retryable: boolean;\n details?: Record<string, unknown>;\n};\n\nexport type CanvasHello = {\n type: \"canvas_hello\";\n version: string;\n clientId?: string;\n capabilities?: string[];\n maxPayloadBytes?: number;\n};\n\nexport type CanvasHelloAck = {\n type: \"canvas_hello_ack\";\n version: string;\n clientId?: string;\n capabilities?: string[];\n maxPayloadBytes: number;\n};\n\nexport type CanvasPing = {\n type: \"canvas_ping\";\n id: string;\n clientId?: string;\n};\n\nexport type CanvasPong = {\n type: \"canvas_pong\";\n id: string;\n clientId?: string;\n};\n\nexport type CanvasRequest = {\n type: \"canvas_request\";\n requestId: string;\n clientId?: string;\n canvasSessionId?: string;\n leaseId?: string;\n command: string;\n payload?: unknown;\n};\n\nexport type CanvasResponse = {\n type: \"canvas_response\";\n requestId: string;\n clientId?: string;\n canvasSessionId?: string;\n payload?: unknown;\n chunked?: boolean;\n payloadId?: string;\n totalChunks?: number;\n};\n\nexport type CanvasErrorResponse = {\n type: \"canvas_error\";\n requestId: string;\n clientId?: string;\n canvasSessionId?: string;\n error: CanvasError;\n};\n\nexport type CanvasEventType =\n | \"canvas_session_created\"\n | \"canvas_session_closed\"\n | \"canvas_session_expired\"\n | \"canvas_target_closed\"\n | \"canvas_document_snapshot\"\n | \"canvas_document_update\"\n | \"canvas_presence\"\n | \"canvas_lease_changed\"\n | \"canvas_feedback_item\"\n | \"canvas_patch_requested\"\n | \"canvas_code_sync_started\"\n | \"canvas_code_sync_applied\"\n | \"canvas_code_sync_conflict\"\n | \"canvas_code_sync_failed\"\n | \"canvas_client_disconnected\";\n\nexport type CanvasEvent = {\n type: \"canvas_event\";\n clientId?: string;\n canvasSessionId?: string;\n event: CanvasEventType;\n payload?: unknown;\n};\n\nexport type CanvasChunk = {\n type: \"canvas_chunk\";\n requestId: string;\n clientId?: string;\n canvasSessionId?: string;\n payloadId: string;\n chunkIndex: number;\n totalChunks: number;\n data: string;\n};\n\nexport type CanvasEnvelope =\n | CanvasHello\n | CanvasHelloAck\n | CanvasPing\n | CanvasPong\n | CanvasRequest\n | CanvasResponse\n | CanvasErrorResponse\n | CanvasEvent\n | CanvasChunk;\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 | \"canvas_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 canvasConnected: 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 AnnotationDispatchSource =\n | \"annotate_item\"\n | \"annotate_all\"\n | \"popup_item\"\n | \"popup_all\"\n | \"canvas_item\"\n | \"canvas_all\";\n\nexport type AnnotationCommand = {\n version: 1;\n requestId: string;\n command: \"start\" | \"cancel\" | \"fetch_stored\";\n url?: string;\n tabId?: number;\n options?: {\n screenshotMode?: AnnotationScreenshotMode;\n debug?: boolean;\n context?: string;\n includeScreenshots?: boolean;\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 | \"payload_unavailable\"\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 stored?: boolean;\n includeScreenshots?: boolean;\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 if (options.stored) {\n return this.requestStored(options);\n }\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 requestStored(options: AnnotationRequestOptions): Promise<AnnotationResponse> {\n if (options.transport === \"direct\") {\n return {\n version: 1,\n requestId: randomUUID(),\n status: \"error\",\n error: { code: \"invalid_request\", message: \"Stored annotations require relay transport.\" }\n };\n }\n return this.requestRelay(\n {\n ...options,\n transport: \"relay\"\n },\n true,\n \"fetch_stored\"\n );\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(\n options: AnnotationRequestOptions,\n requireExtension: boolean,\n commandName: AnnotationCommand[\"command\"] = \"start\"\n ): Promise<AnnotationResponse> {\n const requestId = randomUUID();\n const timeoutMs = options.timeoutMs ?? 120_000;\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 command: AnnotationCommand = {\n version: 1,\n requestId,\n command: commandName,\n url: options.url,\n tabId: options.tabId,\n options: {\n screenshotMode: options.screenshotMode,\n debug: options.debug,\n context: options.context,\n includeScreenshots: options.includeScreenshots\n }\n };\n\n if (this.relay?.requestAnnotation) {\n return await this.relay.requestAnnotation(command, timeoutMs);\n }\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 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 relayCommand: RelayAnnotationCommand = {\n type: \"annotationCommand\",\n payload: command\n };\n\n let terminalResponse: AnnotationResponse | null = null;\n let readySeen = false;\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 terminalResponse = response.payload;\n resolve(response.payload);\n }\n } else if (record.type === \"annotationEvent\") {\n const event = record as RelayAnnotationEvent;\n if (event.payload?.requestId === requestId) {\n if (event.payload.event === \"ready\") {\n readySeen = true;\n }\n return;\n }\n }\n });\n socket.on(\"error\", (error) => reject(error));\n socket.on(\"close\", () => {\n if (terminalResponse) {\n resolve(terminalResponse);\n return;\n }\n if (commandName === \"start\" && readySeen) {\n resolve({\n version: 1,\n requestId,\n status: \"cancelled\",\n error: { code: \"cancelled\", message: \"Annotation cancelled.\" }\n });\n return;\n }\n reject(new Error(\"Relay closed annotation socket\"));\n });\n });\n\n let timedOut = false;\n const timeoutPromise = new Promise<AnnotationResponse>((resolve) => {\n const id = setTimeout(() => {\n clearTimeout(id);\n timedOut = true;\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 let locallyAborted = false;\n const abortPromise = new Promise<AnnotationResponse>((resolve) => {\n if (!options.signal) return;\n if (options.signal.aborted) {\n locallyAborted = true;\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 locallyAborted = true;\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 const shouldCancel = commandName === \"start\" && (locallyAborted || timedOut);\n if (shouldCancel) {\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 { randomUUID } from \"crypto\";\nimport { mkdir } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport type { OpenDevBrowserConfig } from \"../config\";\nimport type { RelayLike } from \"../relay/relay-types\";\nimport { resolveRelayEndpoint } from \"../relay/relay-endpoints\";\nimport type { BrowserManagerLike } from \"./manager-types\";\nimport { CanvasClient } from \"./canvas-client\";\nimport {\n buildDocumentContext,\n buildGovernanceBlockStates,\n CANVAS_PROJECT_DEFAULTS,\n CanvasDocumentStore,\n createDefaultCanvasDocument,\n evaluateCanvasWarnings,\n missingRequiredSaveBlocks,\n normalizeCanvasDocument,\n readCanvasIconRoles,\n resolveCanvasLibraryPolicy,\n validateCanvasSave,\n validateGenerationPlan\n} from \"../canvas/document-store\";\nimport {\n buildCanvasParityArtifact,\n renderCanvasBindingHtml,\n renderCanvasDocumentComponent,\n renderCanvasDocumentHtml\n} from \"../canvas/export\";\nimport { loadCanvasDocument, loadCanvasDocumentById, resolveCanvasRepoPath, saveCanvasDocument } from \"../canvas/repo-store\";\nimport type {\n CanvasBlocker,\n CanvasBinding,\n CanvasDegradeReason,\n CanvasDocument,\n CanvasFeedbackItem,\n CanvasPatch,\n CanvasPlanStatus,\n CanvasPreflightState,\n CanvasPreviewState,\n CanvasPrototype,\n CanvasSessionMode,\n CanvasSessionSummary,\n CanvasTargetState,\n CanvasValidationWarning\n} from \"../canvas/types\";\nimport { CANVAS_SCHEMA_VERSION } from \"../canvas/types\";\nimport { CanvasCodeSyncManager } from \"./canvas-code-sync-manager\";\nimport { CanvasSessionSyncManager } from \"./canvas-session-sync-manager\";\nimport type { CodeSyncAttachMode, CodeSyncOwnership, CodeSyncResolutionPolicy } from \"../canvas/code-sync/types\";\nimport { applyRuntimePreviewBridge } from \"./canvas-runtime-preview-bridge\";\n\ntype CanvasCommandParams = Record<string, unknown>;\n\nexport const PUBLIC_CANVAS_COMMANDS = [\n \"canvas.session.open\",\n \"canvas.session.attach\",\n \"canvas.session.status\",\n \"canvas.session.close\",\n \"canvas.capabilities.get\",\n \"canvas.plan.set\",\n \"canvas.plan.get\",\n \"canvas.document.load\",\n \"canvas.document.patch\",\n \"canvas.document.save\",\n \"canvas.document.export\",\n \"canvas.tab.open\",\n \"canvas.tab.close\",\n \"canvas.overlay.mount\",\n \"canvas.overlay.unmount\",\n \"canvas.overlay.select\",\n \"canvas.preview.render\",\n \"canvas.preview.refresh\",\n \"canvas.feedback.poll\",\n \"canvas.feedback.subscribe\",\n \"canvas.code.bind\",\n \"canvas.code.unbind\",\n \"canvas.code.pull\",\n \"canvas.code.push\",\n \"canvas.code.status\",\n \"canvas.code.resolve\"\n] as const;\n\ntype CanvasSession = {\n canvasSessionId: string;\n browserSessionId: string | null;\n documentRepoPath: string | null;\n leaseId: string;\n mode: CanvasSessionMode;\n store: CanvasDocumentStore;\n preflightState: CanvasPreflightState;\n planStatus: CanvasPlanStatus;\n activeTargets: Map<string, CanvasTargetState>;\n overlayMounts: Map<string, { mountId: string; targetId: string; mountedAt: string }>;\n designTabTargetId: string | null;\n feedback: CanvasFeedbackItem[];\n nextFeedbackSeq: number;\n editorSelection: {\n pageId: string | null;\n nodeId: string | null;\n targetId: string | null;\n updatedAt: string | null;\n };\n feedbackSubscriptions: Map<string, CanvasFeedbackSubscription>;\n};\n\ntype CanvasFeedbackStreamEvent =\n | {\n eventType: \"feedback.item\";\n item: CanvasFeedbackItem;\n }\n | {\n eventType: \"feedback.heartbeat\";\n cursor: string | null;\n ts: string;\n activeTargetIds: string[];\n }\n | {\n eventType: \"feedback.complete\";\n cursor: string | null;\n ts: string;\n reason: \"session_closed\" | \"lease_revoked\" | \"subscription_replaced\" | \"document_unloaded\";\n };\n\ntype CanvasFeedbackSubscription = {\n id: string;\n categories: Set<string>;\n targetIds: Set<string>;\n queue: CanvasFeedbackStreamEvent[];\n waiters: Array<(event: CanvasFeedbackStreamEvent | null) => void>;\n cursor: string | null;\n heartbeatTimer: NodeJS.Timeout;\n active: boolean;\n};\n\ntype ExtensionOverlayResult = {\n mountId?: string;\n targetId?: string;\n overlayState?: string;\n previewState?: CanvasPreviewState;\n capabilities?: Record<string, unknown>;\n selection?: Record<string, unknown>;\n warnings?: CanvasValidationWarning[];\n ok?: boolean;\n};\n\ntype DirectPageLike = {\n addStyleTag: (options: { content: string }) => Promise<unknown>;\n evaluate: <TArg, TResult>(pageFunction: (arg: TArg) => TResult | Promise<TResult>, arg: TArg) => Promise<TResult>;\n};\n\ntype PreviewSyncSource = \"agent\" | \"editor\";\n\ntype PreviewRenderContext = {\n cause: \"manual\" | \"patch_sync\";\n source?: PreviewSyncSource;\n syncAfter?: boolean;\n};\n\nconst DIRECT_OVERLAY_STYLE = `\n#opendevbrowser-canvas-overlay {\n position: fixed;\n top: 16px;\n right: 16px;\n z-index: 2147483647;\n max-width: 320px;\n padding: 12px 14px;\n border-radius: 14px;\n border: 1px solid rgba(255,255,255,0.16);\n background: rgba(7,17,29,0.92);\n color: #f3f6fb;\n font: 12px/1.4 \"Segoe UI\", sans-serif;\n box-shadow: 0 18px 40px rgba(0,0,0,0.3);\n}\n#opendevbrowser-canvas-overlay strong { display:block; margin-bottom:4px; }\n.opendevbrowser-canvas-highlight {\n outline: 2px solid #20d5c6 !important;\n outline-offset: 3px !important;\n}\n`;\n\nconst FEEDBACK_BATCH_SIZE = 25;\nconst FEEDBACK_RETENTION_LIMIT = 200;\n\nexport type CanvasManagerLike = {\n execute: (command: string, params?: CanvasCommandParams) => Promise<unknown>;\n};\n\nexport class CanvasManager implements CanvasManagerLike {\n private readonly worktree: string;\n private readonly browserManager: BrowserManagerLike;\n private readonly config: OpenDevBrowserConfig;\n private readonly relay?: RelayLike;\n private readonly sessionSyncManager = new CanvasSessionSyncManager();\n private readonly codeSyncManager: CanvasCodeSyncManager;\n private readonly sessions = new Map<string, CanvasSession>();\n private canvasClient: CanvasClient | null = null;\n private canvasEndpoint: string | null = null;\n\n constructor(options: {\n worktree: string;\n browserManager: BrowserManagerLike;\n config: OpenDevBrowserConfig;\n relay?: RelayLike;\n }) {\n this.worktree = options.worktree;\n this.browserManager = options.browserManager;\n this.config = options.config;\n this.relay = options.relay;\n this.codeSyncManager = new CanvasCodeSyncManager({\n worktree: this.worktree,\n onWatchedSourceChanged: async (canvasSessionId, bindingId) => {\n await this.handleWatchedSourceChange(canvasSessionId, bindingId);\n }\n });\n }\n\n async execute(command: string, params: CanvasCommandParams = {}): Promise<unknown> {\n switch (command) {\n case \"canvas.session.open\":\n return await this.openSession(params);\n case \"canvas.session.attach\":\n return this.attachSession(params);\n case \"canvas.session.status\":\n return this.getSessionStatus(params);\n case \"canvas.session.close\":\n return await this.closeSession(params);\n case \"canvas.capabilities.get\":\n return this.getCapabilities(params);\n case \"canvas.plan.set\":\n return this.setPlan(params);\n case \"canvas.plan.get\":\n return this.getPlan(params);\n case \"canvas.document.load\":\n return await this.loadDocument(params);\n case \"canvas.document.patch\":\n return await this.patchDocument(params);\n case \"canvas.document.save\":\n return await this.saveDocument(params);\n case \"canvas.document.export\":\n return await this.exportDocument(params);\n case \"canvas.tab.open\":\n return await this.openTab(params);\n case \"canvas.tab.close\":\n return await this.closeTab(params);\n case \"canvas.overlay.mount\":\n return await this.mountOverlay(params);\n case \"canvas.overlay.unmount\":\n return await this.unmountOverlay(params);\n case \"canvas.overlay.select\":\n return await this.selectOverlay(params);\n case \"canvas.preview.render\":\n return await this.renderPreview(params);\n case \"canvas.preview.refresh\":\n return await this.refreshPreview(params);\n case \"canvas.feedback.poll\":\n return this.pollFeedback(params);\n case \"canvas.feedback.subscribe\":\n return this.subscribeFeedback(params);\n case \"canvas.code.bind\":\n return await this.bindCodeSync(params);\n case \"canvas.code.unbind\":\n return await this.unbindCodeSync(params);\n case \"canvas.code.pull\":\n return await this.pullCodeSync(params);\n case \"canvas.code.push\":\n return await this.pushCodeSync(params);\n case \"canvas.code.status\":\n return await this.codeSyncStatus(params);\n case \"canvas.code.resolve\":\n return await this.resolveCodeSync(params);\n default:\n throw new Error(`Unsupported canvas command: ${command}`);\n }\n }\n\n private async openSession(params: CanvasCommandParams): Promise<unknown> {\n const browserSessionId = optionalString(params.browserSessionId);\n const requestedDocumentId = optionalString(params.documentId);\n const repoPath = optionalString(params.repoPath);\n const mode = (optionalString(params.mode) as CanvasSessionMode | null) ?? \"dual-track\";\n const document = repoPath\n ? normalizeCanvasDocument(await loadCanvasDocument(this.worktree, repoPath))\n : createDefaultCanvasDocument(requestedDocumentId ?? undefined);\n const sessionId = `canvas_${randomUUID()}`;\n const leaseId = `lease_${randomUUID()}`;\n const session: CanvasSession = {\n canvasSessionId: sessionId,\n browserSessionId,\n documentRepoPath: repoPath ?? null,\n leaseId,\n mode,\n store: new CanvasDocumentStore(document),\n preflightState: \"handshake_read\",\n planStatus: isNonEmptyRecord(document.designGovernance.generationPlan) ? \"accepted\" : \"missing\",\n activeTargets: new Map<string, CanvasTargetState>(),\n overlayMounts: new Map(),\n designTabTargetId: null,\n feedback: [],\n nextFeedbackSeq: 1,\n editorSelection: {\n pageId: document.pages[0]?.id ?? null,\n nodeId: null,\n targetId: null,\n updatedAt: null\n },\n feedbackSubscriptions: new Map()\n };\n this.sessions.set(sessionId, session);\n this.sessionSyncManager.initializeSession(sessionId, leaseId, optionalString(params.clientId));\n await this.registerDocumentCodeSyncBindings(session);\n return this.buildHandshake(session);\n }\n\n private attachSession(params: CanvasCommandParams): unknown {\n const session = this.requireSession(params);\n const attachMode = requireAttachMode(params.attachMode);\n const nextLeaseId = attachMode === \"lease_reclaim\" ? `lease_${randomUUID()}` : session.leaseId;\n const attached = this.sessionSyncManager.attach(\n session.canvasSessionId,\n nextLeaseId,\n optionalString(params.clientId),\n attachMode\n );\n session.leaseId = attached.leaseId;\n return {\n clientId: attached.clientId,\n attachMode: attached.attachMode,\n leaseId: attached.leaseId,\n role: attached.role,\n documentRevision: session.store.getRevision(),\n document: session.store.getDocument(),\n summary: this.buildSessionSummary(session)\n };\n }\n\n private getSessionStatus(params: CanvasCommandParams): unknown {\n const session = this.requireSession(params);\n this.sessionSyncManager.touch(session.canvasSessionId, optionalString(params.clientId));\n return this.buildSessionSummary(session);\n }\n\n private async closeSession(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const releasedTargets = [...session.activeTargets.keys()];\n for (const mount of session.overlayMounts.values()) {\n await this.unmountOverlay({ canvasSessionId: session.canvasSessionId, leaseId: session.leaseId, mountId: mount.mountId, targetId: mount.targetId });\n }\n if (session.designTabTargetId) {\n await this.closeTab({\n canvasSessionId: session.canvasSessionId,\n leaseId: session.leaseId,\n targetId: session.designTabTargetId\n });\n }\n this.completeFeedbackSubscriptions(session, \"session_closed\");\n this.sessionSyncManager.removeSession(session.canvasSessionId);\n this.codeSyncManager.disposeSession(session.canvasSessionId);\n this.sessions.delete(session.canvasSessionId);\n return { ok: true, releasedTargets, releasedOverlays: true };\n }\n\n private getCapabilities(params: CanvasCommandParams): unknown {\n const session = this.requireSession(params);\n return this.buildHandshake(session);\n }\n\n private setPlan(params: CanvasCommandParams): unknown {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const plan = requireRecord(params.generationPlan, \"generationPlan\");\n session.planStatus = \"submitted\";\n session.preflightState = \"plan_submitted\";\n const validation = validateGenerationPlan(plan);\n if (!validation.ok) {\n throw new Error(`Generation plan missing fields: ${validation.missing.join(\", \")}`);\n }\n const result = session.store.setGenerationPlan(plan);\n session.planStatus = result.planStatus;\n session.preflightState = \"plan_accepted\";\n this.emitWarnings(session, result.warnings, { category: \"validation\" });\n void this.syncLiveViews(session).catch(() => {});\n return {\n planStatus: result.planStatus,\n documentRevision: result.documentRevision,\n preflightState: session.preflightState,\n warnings: result.warnings\n };\n }\n\n private getPlan(params: CanvasCommandParams): unknown {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n return {\n generationPlan: session.store.getDocument().designGovernance.generationPlan,\n planStatus: session.planStatus,\n documentRevision: session.store.getRevision(),\n preflightState: session.preflightState\n };\n }\n\n private async loadDocument(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const documentId = optionalString(params.documentId);\n const repoPath = optionalString(params.repoPath);\n if (Boolean(documentId) === Boolean(repoPath)) {\n throw new Error(\"Provide exactly one of documentId or repoPath.\");\n }\n const sessionRepoPath = !repoPath && documentId === session.store.getDocumentId()\n ? session.documentRepoPath\n : null;\n const resolvedRepoPath = repoPath ?? sessionRepoPath;\n const document = resolvedRepoPath\n ? normalizeCanvasDocument(await loadCanvasDocument(this.worktree, resolvedRepoPath))\n : normalizeCanvasDocument(await loadCanvasDocumentById(this.worktree, documentId as string) ?? createDefaultCanvasDocument(documentId as string));\n session.store.loadDocument(document);\n session.documentRepoPath = resolvedRepoPath;\n session.planStatus = isNonEmptyRecord(document.designGovernance.generationPlan) ? \"accepted\" : \"missing\";\n session.preflightState = session.planStatus === \"accepted\" ? \"plan_accepted\" : \"handshake_read\";\n session.editorSelection = {\n pageId: document.pages[0]?.id ?? null,\n nodeId: null,\n targetId: null,\n updatedAt: new Date().toISOString()\n };\n await this.registerDocumentCodeSyncBindings(session);\n await this.syncLiveViews(session);\n return {\n documentId: session.store.getDocumentId(),\n documentRevision: session.store.getRevision(),\n document: session.store.getDocument(),\n handshake: this.buildHandshake(session)\n };\n }\n\n private async patchDocument(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n if (session.planStatus !== \"accepted\") {\n throw this.planRequired(\"canvas.document.patch\", session);\n }\n const baseRevision = requireNumber(params.baseRevision, \"baseRevision\");\n const patches = requirePatches(params.patches);\n try {\n return await this.applyDocumentPatches(session, baseRevision, patches, \"agent\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (message.startsWith(\"Revision conflict\")) {\n throw this.revisionConflict(\"canvas.document.patch\", session);\n }\n throw error;\n }\n }\n\n private async applyDocumentPatches(\n session: CanvasSession,\n baseRevision: number,\n patches: CanvasPatch[],\n source: \"agent\" | \"editor\"\n ): Promise<{\n transactionId: string;\n appliedRevision: number;\n warnings: CanvasValidationWarning[];\n evidenceRefs: string[];\n }> {\n const result = session.store.applyPatches(baseRevision, patches);\n session.preflightState = \"patching_enabled\";\n this.pushFeedback(session, {\n category: \"validation\",\n class: source === \"editor\" ? \"editor-document-patched\" : \"document-patched\",\n severity: \"info\",\n message: `Applied ${patches.length} canvas patch${patches.length === 1 ? \"\" : \"es\"} from ${source}.`,\n pageId: session.editorSelection.pageId,\n prototypeId: null,\n targetId: session.editorSelection.targetId,\n evidenceRefs: [],\n details: { source }\n });\n this.emitWarnings(session, result.warnings, { category: \"validation\" });\n await this.registerDocumentCodeSyncBindings(session);\n await this.syncLiveViews(session, { refreshPreviewTargets: true, source });\n return result;\n }\n\n private async bindCodeSync(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const nodeId = requireString(params.nodeId, \"nodeId\");\n const bindingId = optionalString(params.bindingId) ?? `binding_sync_${randomUUID().slice(0, 8)}`;\n const binding = createCodeSyncBinding(params, nodeId, bindingId);\n const baseRevision = session.store.getRevision();\n await this.applyDocumentPatches(session, baseRevision, [{\n op: \"binding.set\",\n nodeId,\n binding\n }], \"agent\");\n const nextBinding = requireCanvasBinding(session.store.getDocument(), binding.id);\n const bindingStatus = await this.codeSyncManager.bind({\n canvasSessionId: session.canvasSessionId,\n document: session.store.getDocument(),\n documentRevision: session.store.getRevision(),\n binding: nextBinding\n });\n this.pushFeedback(session, {\n category: \"code-sync\",\n class: \"code-sync-bound\",\n severity: \"info\",\n message: `Bound ${binding.codeSync?.repoPath ?? binding.selector ?? binding.id} for code sync.`,\n pageId: session.editorSelection.pageId,\n prototypeId: null,\n targetId: session.editorSelection.targetId,\n evidenceRefs: [],\n details: {\n bindingId: binding.id,\n nodeId\n }\n });\n return {\n ok: true,\n binding: nextBinding,\n bindingStatus,\n documentRevision: session.store.getRevision(),\n summary: this.buildSessionSummary(session)\n };\n }\n\n private async unbindCodeSync(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const bindingId = requireString(params.bindingId, \"bindingId\");\n requireCanvasBinding(session.store.getDocument(), bindingId);\n await this.applyDocumentPatches(session, session.store.getRevision(), [{\n op: \"binding.remove\",\n bindingId\n }], \"agent\");\n this.codeSyncManager.unbind(session.canvasSessionId, bindingId);\n this.pushFeedback(session, {\n category: \"code-sync\",\n class: \"code-sync-unbound\",\n severity: \"info\",\n message: `Removed code-sync binding ${bindingId}.`,\n pageId: session.editorSelection.pageId,\n prototypeId: null,\n targetId: session.editorSelection.targetId,\n evidenceRefs: [],\n details: { bindingId }\n });\n return {\n ok: true,\n bindingId,\n documentRevision: session.store.getRevision(),\n summary: this.buildSessionSummary(session)\n };\n }\n\n private async pullCodeSync(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const binding = requireCodeSyncBinding(session.store.getDocument(), requireString(params.bindingId, \"bindingId\"));\n this.pushFeedback(session, {\n category: \"code-sync\",\n class: \"code-sync-started\",\n severity: \"info\",\n message: `Pulling source into canvas for ${binding.id}.`,\n pageId: session.editorSelection.pageId,\n prototypeId: null,\n targetId: session.editorSelection.targetId,\n evidenceRefs: [],\n details: { bindingId: binding.id, direction: \"pull\" }\n });\n const result = await this.codeSyncManager.pull({\n canvasSessionId: session.canvasSessionId,\n document: session.store.getDocument(),\n documentRevision: session.store.getRevision(),\n binding,\n resolutionPolicy: requireResolutionPolicy(optionalString(params.resolutionPolicy)),\n applyPatches: async (patches) => {\n const applied = await this.applyDocumentPatches(session, session.store.getRevision(), patches, \"agent\");\n return { documentRevision: applied.appliedRevision };\n }\n });\n if (!result.ok) {\n this.pushFeedback(session, {\n category: \"code-sync\",\n class: \"code-sync-conflict\",\n severity: \"warning\",\n message: result.conflicts[0]?.message ?? \"Code-sync pull failed.\",\n pageId: session.editorSelection.pageId,\n prototypeId: null,\n targetId: session.editorSelection.targetId,\n evidenceRefs: [],\n details: { bindingId: binding.id, conflicts: result.conflicts }\n });\n return { ...result, summary: this.buildSessionSummary(session) };\n }\n await this.syncLiveViews(session, { refreshPreviewTargets: true, source: \"agent\" });\n this.pushFeedback(session, {\n category: \"code-sync\",\n class: \"code-sync-applied\",\n severity: \"info\",\n message: `Pulled ${result.patchesApplied} code-sync patch${result.patchesApplied === 1 ? \"\" : \"es\"} into the canvas document.`,\n pageId: session.editorSelection.pageId,\n prototypeId: null,\n targetId: session.editorSelection.targetId,\n evidenceRefs: [],\n details: {\n bindingId: binding.id,\n repoPath: result.repoPath,\n changedNodeIds: result.changedNodeIds,\n unsupportedRegions: result.unsupportedRegions\n }\n });\n return { ...result, summary: this.buildSessionSummary(session) };\n }\n\n private async pushCodeSync(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const binding = requireCodeSyncBinding(session.store.getDocument(), requireString(params.bindingId, \"bindingId\"));\n this.pushFeedback(session, {\n category: \"code-sync\",\n class: \"code-sync-started\",\n severity: \"info\",\n message: `Pushing canvas changes into source for ${binding.id}.`,\n pageId: session.editorSelection.pageId,\n prototypeId: null,\n targetId: session.editorSelection.targetId,\n evidenceRefs: [],\n details: { bindingId: binding.id, direction: \"push\" }\n });\n const result = await this.codeSyncManager.push({\n canvasSessionId: session.canvasSessionId,\n document: session.store.getDocument(),\n documentRevision: session.store.getRevision(),\n binding,\n resolutionPolicy: requireResolutionPolicy(optionalString(params.resolutionPolicy))\n });\n if (!result.ok) {\n this.pushFeedback(session, {\n category: \"code-sync\",\n class: \"code-sync-conflict\",\n severity: \"warning\",\n message: result.conflicts[0]?.message ?? \"Code-sync push failed.\",\n pageId: session.editorSelection.pageId,\n prototypeId: null,\n targetId: session.editorSelection.targetId,\n evidenceRefs: [],\n details: { bindingId: binding.id, conflicts: result.conflicts }\n });\n return { ...result, summary: this.buildSessionSummary(session) };\n }\n await this.syncLiveViews(session, { refreshPreviewTargets: true, source: \"agent\" });\n this.pushFeedback(session, {\n category: \"code-sync\",\n class: \"code-sync-applied\",\n severity: \"info\",\n message: `Pushed canvas changes into ${result.repoPath}.`,\n pageId: session.editorSelection.pageId,\n prototypeId: null,\n targetId: session.editorSelection.targetId,\n evidenceRefs: [result.repoPath],\n details: {\n bindingId: binding.id,\n changedNodeIds: result.changedNodeIds\n }\n });\n return { ...result, summary: this.buildSessionSummary(session) };\n }\n\n private async codeSyncStatus(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n const bindingId = optionalString(params.bindingId);\n if (bindingId) {\n const binding = requireCodeSyncBinding(session.store.getDocument(), bindingId);\n let bindingStatus = await this.codeSyncManager.getBindingStatus(\n session.canvasSessionId,\n session.store.getDocument().documentId,\n binding,\n session.store.getRevision()\n );\n if (binding.codeSync?.syncMode === \"watch\" && bindingStatus.state === \"drift_detected\" && bindingStatus.driftState === \"source_changed\") {\n await this.handleWatchedSourceChange(session.canvasSessionId, binding.id);\n bindingStatus = await this.codeSyncManager.getBindingStatus(\n session.canvasSessionId,\n session.store.getDocument().documentId,\n binding,\n session.store.getRevision()\n );\n }\n return {\n bindingStatus,\n summary: this.buildSessionSummary(session)\n };\n }\n await this.registerDocumentCodeSyncBindings(session);\n for (const binding of session.store.getDocument().bindings) {\n if (binding.codeSync?.syncMode !== \"watch\") {\n continue;\n }\n const bindingStatus = await this.codeSyncManager.getBindingStatus(\n session.canvasSessionId,\n session.store.getDocument().documentId,\n binding,\n session.store.getRevision()\n );\n if (bindingStatus.state === \"drift_detected\" && bindingStatus.driftState === \"source_changed\") {\n await this.handleWatchedSourceChange(session.canvasSessionId, binding.id);\n }\n }\n return this.buildSessionSummary(session);\n }\n\n private async resolveCodeSync(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const binding = requireCodeSyncBinding(session.store.getDocument(), requireString(params.bindingId, \"bindingId\"));\n const resolutionPolicy = requireResolutionPolicy(requireString(params.resolutionPolicy, \"resolutionPolicy\")) ?? \"manual\";\n const result = await this.codeSyncManager.resolve({\n canvasSessionId: session.canvasSessionId,\n document: session.store.getDocument(),\n documentRevision: session.store.getRevision(),\n binding,\n resolutionPolicy,\n applyPatches: async (patches) => {\n const applied = await this.applyDocumentPatches(session, session.store.getRevision(), patches, \"agent\");\n return { documentRevision: applied.appliedRevision };\n }\n });\n if (result.ok) {\n await this.syncLiveViews(session, { refreshPreviewTargets: true, source: \"agent\" });\n }\n return { ...result, summary: this.buildSessionSummary(session) };\n }\n\n private async registerDocumentCodeSyncBindings(session: CanvasSession): Promise<void> {\n const attachedClients = this.sessionSyncManager.listAttachedClients(session.canvasSessionId);\n const leaseHolderClientId = this.sessionSyncManager.getLeaseHolderClientId(session.canvasSessionId);\n const knownBindings = new Set(\n this.codeSyncManager.getSessionStatus(session.canvasSessionId, attachedClients.length, leaseHolderClientId).bindings\n .map((entry) => entry.bindingId)\n );\n const nextBindings = session.store.getDocument().bindings.filter((binding) => Boolean(binding.codeSync));\n for (const binding of nextBindings) {\n knownBindings.delete(binding.id);\n await this.codeSyncManager.bind({\n canvasSessionId: session.canvasSessionId,\n document: session.store.getDocument(),\n documentRevision: session.store.getRevision(),\n binding\n });\n }\n for (const staleBindingId of knownBindings) {\n this.codeSyncManager.unbind(session.canvasSessionId, staleBindingId);\n }\n }\n\n private async handleWatchedSourceChange(canvasSessionId: string, bindingId: string): Promise<void> {\n const session = this.sessions.get(canvasSessionId);\n if (!session) {\n return;\n }\n const binding = requireCodeSyncBinding(session.store.getDocument(), bindingId);\n const result = await this.codeSyncManager.pull({\n canvasSessionId: session.canvasSessionId,\n document: session.store.getDocument(),\n documentRevision: session.store.getRevision(),\n binding,\n resolutionPolicy: \"prefer_code\",\n applyPatches: async (patches) => {\n const applied = await this.applyDocumentPatches(session, session.store.getRevision(), patches, \"agent\");\n return { documentRevision: applied.appliedRevision };\n }\n });\n if (!result.ok) {\n this.pushFeedback(session, {\n category: \"code-sync\",\n class: \"code-sync-watch-conflict\",\n severity: \"warning\",\n message: result.conflicts[0]?.message ?? \"Watched source change could not be imported.\",\n pageId: session.editorSelection.pageId,\n prototypeId: null,\n targetId: session.editorSelection.targetId,\n evidenceRefs: [],\n details: { bindingId, conflicts: result.conflicts }\n });\n return;\n }\n await this.syncLiveViews(session, { refreshPreviewTargets: true, source: \"agent\" });\n }\n\n private async saveDocument(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const document = session.store.getDocument();\n const validation = validateCanvasSave(document);\n if (validation.missingBlocks.length > 0) {\n throw this.policyViolation(\"canvas.document.save\", session, validation.missingBlocks, validation.warnings);\n }\n const repoPath = await saveCanvasDocument(this.worktree, document, optionalString(params.repoPath));\n session.documentRepoPath = repoPath;\n this.emitWarnings(session, validation.warnings, { category: \"validation\" });\n return {\n repoPath,\n documentRevision: session.store.getRevision(),\n schemaVersion: document.schemaVersion,\n migrationWarnings: [],\n warnings: validation.warnings\n };\n }\n\n private async exportDocument(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const exportTarget = requireString(params.exportTarget, \"exportTarget\");\n const document = session.store.getDocument();\n const warnings = evaluateCanvasWarnings(document, { forSave: exportTarget === \"design_document\" });\n const exportBase = resolveCanvasRepoPath(this.worktree, document.documentId, \".opendevbrowser/canvas/exports\");\n await mkdir(dirname(exportBase), { recursive: true });\n if (exportTarget === \"design_document\") {\n const validation = validateCanvasSave(document);\n if (validation.missingBlocks.length > 0) {\n throw this.policyViolation(\"canvas.document.export\", session, validation.missingBlocks, validation.warnings);\n }\n const repoPath = await saveCanvasDocument(this.worktree, document, optionalString(params.repoPath));\n this.emitWarnings(session, validation.warnings, { category: \"validation\" });\n return {\n exportTarget,\n documentRevision: session.store.getRevision(),\n artifactRefs: [repoPath],\n resolvedSavePath: repoPath,\n schemaVersion: document.schemaVersion,\n migrationWarnings: [],\n warnings: validation.warnings\n };\n }\n if (exportTarget === \"react_component\") {\n const repoPath = `${exportBase}-${session.canvasSessionId}.tsx`;\n await saveText(repoPath, renderCanvasDocumentComponent(document));\n this.emitWarnings(session, warnings, { category: \"export\" });\n return {\n exportTarget,\n documentRevision: session.store.getRevision(),\n artifactRefs: [repoPath],\n exportMetadata: { format: \"tsx\", documentId: document.documentId },\n warnings\n };\n }\n if (exportTarget === \"html_bundle\") {\n const repoPath = `${exportBase}-${session.canvasSessionId}.html`;\n await saveText(repoPath, renderCanvasDocumentHtml(document));\n this.emitWarnings(session, warnings, { category: \"export\" });\n return {\n exportTarget,\n documentRevision: session.store.getRevision(),\n artifactRefs: [repoPath],\n exportMetadata: { format: \"html\", documentId: document.documentId },\n warnings\n };\n }\n throw new Error(`Unsupported exportTarget: ${exportTarget}`);\n }\n\n private async openTab(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const prototypeId = requireString(params.prototypeId, \"prototypeId\");\n const previewMode = requireTabPreviewMode(params.previewMode, \"previewMode\");\n const html = renderCanvasDocumentHtml(session.store.getDocument());\n if (session.browserSessionId) {\n const status = await this.browserManager.status(session.browserSessionId);\n if (status.mode === \"extension\") {\n const result = await this.requestCanvasExtension(session, \"canvas.tab.open\", {\n prototypeId,\n previewMode,\n html,\n document: session.store.getDocument(),\n documentRevision: session.store.getRevision(),\n summary: this.buildSessionSummary(session),\n targets: [...session.activeTargets.values()],\n overlayMounts: [...session.overlayMounts.values()],\n feedback: this.buildFeedbackSnapshot(session),\n feedbackCursor: this.getLatestFeedbackCursor(session),\n selection: session.editorSelection\n });\n session.designTabTargetId = typeof result.targetId === \"string\" ? result.targetId : null;\n if (session.designTabTargetId && typeof this.browserManager.registerCanvasTarget === \"function\") {\n await this.browserManager.registerCanvasTarget(session.browserSessionId, session.designTabTargetId);\n }\n return {\n targetId: session.designTabTargetId,\n targetIds: session.designTabTargetId ? [session.designTabTargetId] : [],\n previewState: result.previewState ?? previewMode,\n designTab: true\n };\n }\n const url = `data:text/html;charset=utf-8,${encodeURIComponent(html)}`;\n const page = await this.browserManager.page(session.browserSessionId, `canvas-${prototypeId}`, url);\n session.designTabTargetId = page.targetId;\n return {\n targetId: page.targetId,\n targetIds: [page.targetId],\n previewState: previewMode,\n designTab: true\n };\n }\n throw new Error(\"canvas.tab.open requires a browserSessionId.\");\n }\n\n private async closeTab(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const targetId = requireString(params.targetId, \"targetId\");\n if (!session.browserSessionId) {\n throw new Error(\"canvas.tab.close requires a browserSessionId.\");\n }\n const status = await this.browserManager.status(session.browserSessionId);\n if (status.mode === \"extension\" && session.designTabTargetId === targetId) {\n await this.requestCanvasExtension(session, \"canvas.tab.close\", { targetId });\n } else {\n await this.browserManager.closeTarget(session.browserSessionId, targetId);\n }\n if (session.designTabTargetId === targetId) {\n session.designTabTargetId = null;\n }\n session.activeTargets.delete(targetId);\n return {\n ok: true,\n targetId,\n targetIds: [...session.activeTargets.keys()],\n releasedTargetIds: [targetId],\n previewState: \"background\"\n };\n }\n\n private async mountOverlay(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const targetId = requireString(params.targetId, \"targetId\");\n const prototypeId = requireString(params.prototypeId, \"prototypeId\");\n if (!session.browserSessionId) {\n throw new Error(\"canvas.overlay.mount requires a browserSessionId.\");\n }\n const status = await this.browserManager.status(session.browserSessionId);\n let result: ExtensionOverlayResult;\n if (status.mode === \"extension\") {\n result = await this.requestCanvasExtension(session, \"canvas.overlay.mount\", {\n targetId,\n prototypeId,\n document: session.store.getDocument(),\n documentRevision: session.store.getRevision()\n });\n } else {\n result = await this.mountDirectOverlay(session.browserSessionId, targetId, session.store.getDocument(), prototypeId);\n }\n const mountId = typeof result.mountId === \"string\" ? result.mountId : `mount_${randomUUID()}`;\n session.overlayMounts.set(mountId, { mountId, targetId, mountedAt: new Date().toISOString() });\n const previewState = session.activeTargets.get(targetId)?.previewState ?? \"background\";\n await this.syncLiveViews(session);\n return {\n mountId,\n targetId,\n previewState,\n overlayState: result.overlayState ?? \"mounted\",\n capabilities: result.capabilities ?? { selection: true, guides: true }\n };\n }\n\n private async unmountOverlay(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const mountId = requireString(params.mountId, \"mountId\");\n const targetId = optionalString(params.targetId);\n const mount = session.overlayMounts.get(mountId);\n if (!mount || !session.browserSessionId) {\n return { ok: true, mountId, previewState: (targetId ? session.activeTargets.get(targetId)?.previewState : null) ?? \"background\", overlayState: \"idle\" };\n }\n const status = await this.browserManager.status(session.browserSessionId);\n if (status.mode === \"extension\") {\n await this.requestCanvasExtension(session, \"canvas.overlay.unmount\", { mountId, targetId: mount.targetId });\n } else {\n await this.unmountDirectOverlay(session.browserSessionId, mount.targetId);\n }\n session.overlayMounts.delete(mountId);\n await this.syncLiveViews(session);\n return { ok: true, mountId, previewState: session.activeTargets.get(mount.targetId)?.previewState ?? \"background\", overlayState: \"idle\" };\n }\n\n private async selectOverlay(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const mountId = requireString(params.mountId, \"mountId\");\n const targetId = requireString(params.targetId, \"targetId\");\n const nodeId = optionalString(params.nodeId);\n const hint = isRecord(params.selectionHint) ? params.selectionHint : {};\n if (!nodeId && !isNonEmptyRecord(hint)) {\n throw new Error(\"canvas.overlay.select requires nodeId or selectionHint.\");\n }\n if (!session.browserSessionId) {\n throw new Error(\"canvas.overlay.select requires a browserSessionId.\");\n }\n const status = await this.browserManager.status(session.browserSessionId);\n const selection = status.mode === \"extension\"\n ? await this.requestCanvasExtension(session, \"canvas.overlay.select\", { mountId, targetId, nodeId, selectionHint: hint })\n : { selection: await this.selectDirectOverlay(session.browserSessionId, targetId, nodeId, hint) };\n if (nodeId) {\n session.editorSelection = {\n pageId: session.editorSelection.pageId ?? session.store.getDocument().pages[0]?.id ?? null,\n nodeId,\n targetId,\n updatedAt: new Date().toISOString()\n };\n await this.syncLiveViews(session);\n }\n return {\n targetId,\n selection: selection.selection ?? selection,\n mountId\n };\n }\n\n private async renderPreview(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const prototypeId = requireString(params.prototypeId, \"prototypeId\");\n const targetId = requireString(params.targetId, \"targetId\");\n if (!session.browserSessionId) {\n throw new Error(\"canvas.preview.render requires a browserSessionId.\");\n }\n if (session.planStatus !== \"accepted\") {\n throw this.planRequired(\"canvas.preview.render\", session);\n }\n return await this.renderPreviewTarget(session, targetId, prototypeId, { cause: \"manual\", syncAfter: true });\n }\n\n private async refreshPreview(params: CanvasCommandParams): Promise<unknown> {\n const session = this.requireSession(params);\n this.assertLease(session, params);\n const targetId = requireString(params.targetId, \"targetId\");\n const refreshMode = requireRefreshMode(params.refreshMode, \"refreshMode\");\n const existing = session.activeTargets.get(targetId);\n if (!existing) {\n throw this.unsupportedTarget(\"canvas.preview.refresh\", session, targetId);\n }\n if (refreshMode === \"full\") {\n if (typeof existing.prototypeId !== \"string\" || existing.prototypeId.length === 0) {\n throw this.unsupportedTarget(\"canvas.preview.refresh\", session, targetId);\n }\n return await this.renderPreviewTarget(session, targetId, existing.prototypeId, { cause: \"manual\", syncAfter: true });\n }\n const screenshot = await this.browserManager.screenshot(\n requireString(session.browserSessionId, \"browserSessionId\"),\n undefined,\n targetId\n );\n this.pushFeedback(session, {\n category: \"render\",\n class: \"thumbnail-refresh\",\n severity: \"info\",\n message: \"Thumbnail refresh completed.\",\n pageId: null,\n prototypeId: existing.prototypeId,\n targetId,\n evidenceRefs: screenshot.path ? [screenshot.path] : []\n });\n await this.syncLiveViews(session);\n return {\n targetId,\n previewState: existing.previewState,\n renderStatus: existing.renderStatus,\n documentRevision: session.store.getRevision(),\n degradeReason: existing.degradeReason\n };\n }\n\n private async renderPreviewTarget(\n session: CanvasSession,\n targetId: string,\n prototypeId: string,\n context: PreviewRenderContext\n ): Promise<{\n renderStatus: CanvasTargetState[\"renderStatus\"];\n targetId: string;\n prototypeId: string;\n previewState: CanvasPreviewState;\n previewMode: CanvasPreviewState;\n documentRevision: number;\n degradeReason: CanvasDegradeReason | null;\n warnings: CanvasValidationWarning[];\n }> {\n const browserSessionId = requireString(session.browserSessionId, \"browserSessionId\");\n const document = session.store.getDocument();\n const prototype = this.requirePrototype(document, prototypeId);\n const status = await this.browserManager.status(browserSessionId);\n const existingTarget = session.activeTargets.get(targetId);\n const previewTarget = this.allocatePreviewTarget(session, targetId, status.activeTargetId);\n const telemetryMode = previewTarget.previewState === \"degraded\"\n ? \"paused\"\n : previewTarget.previewState === \"background\"\n ? \"sampled\"\n : \"full\";\n const sourceUrl = resolvePreviewUrl(selectPreviewSourceCandidate(status.url, existingTarget?.sourceUrl), prototype.route);\n const runtimeBinding = findPrototypeRuntimeBinding(document, prototype);\n const html = this.buildPreviewHtml(document, prototype, targetId, sourceUrl);\n let projection: CanvasTargetState[\"projection\"] = \"canvas_html\";\n let fallbackReason: string | null = null;\n let parityArtifact = runtimeBinding ? buildCanvasParityArtifact(document, runtimeBinding.id, \"canvas_html\") : null;\n if (\n runtimeBinding?.codeSync?.projection === \"bound_app_runtime\"\n && sourceUrl\n && runtimeBinding.codeSync.runtimeRootSelector\n ) {\n try {\n await this.browserManager.goto(browserSessionId, sourceUrl, \"load\", 30000, undefined, targetId);\n const bindingHtml = renderCanvasBindingHtml(document, runtimeBinding.id);\n if (!bindingHtml) {\n fallbackReason = \"runtime_projection_unsupported\";\n } else {\n const bridgeResult = typeof this.browserManager.applyRuntimePreviewBridge === \"function\"\n ? await this.browserManager.applyRuntimePreviewBridge(browserSessionId, targetId, {\n bindingId: runtimeBinding.id,\n rootSelector: runtimeBinding.codeSync?.runtimeRootSelector ?? `[data-binding-id=\"${runtimeBinding.id}\"]`,\n html: bindingHtml\n })\n : await this.browserManager.withPage(browserSessionId, targetId, async (page) => {\n return await applyRuntimePreviewBridge(page as { evaluate: typeof page.evaluate }, {\n bindingId: runtimeBinding.id,\n rootSelector: runtimeBinding.codeSync?.runtimeRootSelector ?? `[data-binding-id=\"${runtimeBinding.id}\"]`,\n html: bindingHtml\n });\n });\n if (bridgeResult.ok) {\n projection = \"bound_app_runtime\";\n fallbackReason = null;\n parityArtifact = bridgeResult.artifact;\n } else {\n fallbackReason = bridgeResult.fallbackReason;\n }\n }\n } catch (error) {\n fallbackReason = \"runtime_projection_failed\";\n this.pushFeedback(session, {\n category: \"parity\",\n class: \"runtime-preview-bridge-failed\",\n severity: \"warning\",\n message: error instanceof Error ? error.message : String(error),\n pageId: prototype.pageId,\n prototypeId,\n targetId,\n evidenceRefs: [],\n details: {\n bindingId: runtimeBinding.id,\n projection: \"bound_app_runtime\"\n }\n });\n }\n } else if (runtimeBinding?.codeSync?.projection === \"bound_app_runtime\") {\n fallbackReason = sourceUrl ? \"runtime_bridge_unavailable\" : \"runtime_projection_unsupported\";\n }\n if (projection === \"canvas_html\") {\n const previewUrl = `data:text/html;charset=utf-8,${encodeURIComponent(html)}`;\n await this.browserManager.goto(browserSessionId, previewUrl, \"load\", 30000, undefined, targetId);\n }\n const screenshot = await this.browserManager.screenshot(browserSessionId, undefined, targetId);\n const consoleData = telemetryMode === \"paused\"\n ? { events: [], nextSeq: 0 }\n : await this.browserManager.consolePoll(browserSessionId, 0, telemetryMode === \"sampled\" ? 5 : 25);\n const networkData = telemetryMode === \"paused\"\n ? { events: [], nextSeq: 0 }\n : await this.browserManager.networkPoll(browserSessionId, 0, telemetryMode === \"sampled\" ? 5 : 25);\n const perfData = telemetryMode === \"paused\"\n ? { metrics: [] }\n : await this.collectPerfMetrics(browserSessionId, targetId);\n const previewState: CanvasTargetState = {\n targetId,\n prototypeId,\n previewMode: previewTarget.previewMode,\n previewState: previewTarget.previewState,\n renderStatus: previewTarget.previewState === \"degraded\" ? \"degraded\" : \"rendered\",\n degradeReason: previewTarget.degradeReason,\n lastRenderedAt: new Date().toISOString(),\n sourceUrl: isPreviewSourceCandidate(sourceUrl) ? sourceUrl : existingTarget?.sourceUrl ?? null,\n projection,\n fallbackReason,\n parityArtifact\n };\n session.activeTargets.set(targetId, previewState);\n if (consoleData.events.length > 0) {\n this.pushFeedback(session, {\n category: \"console\",\n class: \"console-signal\",\n severity: \"warning\",\n message: `Preview emitted ${consoleData.events.length} console event${consoleData.events.length === 1 ? \"\" : \"s\"}.`,\n pageId: prototype.pageId,\n prototypeId,\n targetId,\n evidenceRefs: [],\n details: {\n cause: context.cause,\n source: context.source ?? null,\n previewState: previewState.previewState\n }\n });\n }\n if (networkData.events.some((event) => typeof event.status === \"number\" && event.status >= 400)) {\n this.pushFeedback(session, {\n category: \"network\",\n class: \"network-failure\",\n severity: \"warning\",\n message: \"Preview reported network failures.\",\n pageId: prototype.pageId,\n prototypeId,\n targetId,\n evidenceRefs: [],\n details: {\n cause: context.cause,\n source: context.source ?? null,\n previewState: previewState.previewState\n }\n });\n }\n if (perfData.metrics.length > 0) {\n this.pushFeedback(session, {\n category: \"performance\",\n class: \"perf-summary\",\n severity: \"info\",\n message: `Captured ${perfData.metrics.length} performance metrics for ${previewState.previewState} preview.`,\n pageId: prototype.pageId,\n prototypeId,\n targetId,\n evidenceRefs: [],\n details: {\n cause: context.cause,\n source: context.source ?? null,\n previewState: previewState.previewState,\n metrics: perfData.metrics\n }\n });\n }\n const warnings = evaluateCanvasWarnings(document, { degradeReason: previewState.degradeReason ?? null });\n this.emitWarnings(session, warnings, {\n pageId: prototype.pageId,\n prototypeId,\n targetId\n });\n this.pushFeedback(session, {\n category: \"render\",\n class: previewState.renderStatus === \"degraded\" ? \"render-degraded\" : \"render-complete\",\n severity: previewState.renderStatus === \"degraded\" ? \"warning\" : \"info\",\n message: previewState.renderStatus === \"degraded\"\n ? context.cause === \"patch_sync\"\n ? \"Live preview refresh completed in degraded thumbnail-only mode.\"\n : \"Preview render completed in degraded thumbnail-only mode.\"\n : context.cause === \"patch_sync\"\n ? \"Live preview refresh completed.\"\n : \"Preview render completed.\",\n pageId: prototype.pageId,\n prototypeId,\n targetId,\n evidenceRefs: screenshot.path ? [screenshot.path] : [],\n details: {\n cause: context.cause,\n source: context.source ?? null,\n previewState: previewState.previewState,\n degradeReason: previewState.degradeReason ?? null,\n projection,\n fallbackReason,\n sourceUrl\n }\n });\n if (context.syncAfter) {\n await this.syncLiveViews(session);\n }\n return {\n renderStatus: previewState.renderStatus,\n targetId,\n prototypeId,\n previewState: previewState.previewState,\n previewMode: previewState.previewMode,\n documentRevision: session.store.getRevision(),\n degradeReason: previewState.degradeReason ?? null,\n warnings\n };\n }\n\n private pollFeedback(params: CanvasCommandParams): unknown {\n const session = this.requireSession(params);\n const afterCursor = optionalString(params.afterCursor);\n const items = this.filterFeedback(session, params);\n const startIndex = afterCursor ? items.findIndex((item) => item.cursor === afterCursor) + 1 : 0;\n const batch = items.slice(Math.max(startIndex, 0), Math.max(startIndex, 0) + FEEDBACK_BATCH_SIZE);\n const nextCursor = batch.length > 0 ? batch[batch.length - 1]!.cursor : afterCursor;\n const retentionByTarget: Record<string, number> = {};\n for (const item of session.feedback) {\n const targetKey = item.targetId ?? \"session\";\n retentionByTarget[targetKey] = (retentionByTarget[targetKey] ?? 0) + 1;\n }\n const targetIds = normalizeStringArray(params.targetIds);\n const singleTarget = optionalString(params.targetId);\n if (singleTarget) {\n targetIds.push(singleTarget);\n }\n const activeTargetIds = [...session.activeTargets.keys()];\n return {\n items: batch,\n nextCursor: nextCursor ?? null,\n retention: {\n total: session.feedback.length,\n filteredTotal: items.length,\n byTarget: targetIds.length > 0\n ? Object.fromEntries(Object.entries(retentionByTarget).filter(([key]) => key === \"session\" || targetIds.includes(key)))\n : retentionByTarget,\n activeTargetIds\n }\n };\n }\n\n private subscribeFeedback(params: CanvasCommandParams): unknown {\n const session = this.requireSession(params);\n const polled = this.pollFeedback(params) as { items: CanvasFeedbackItem[]; nextCursor: string | null };\n const subscriptionId = `canvas_sub_${randomUUID()}`;\n const subscription: CanvasFeedbackSubscription = {\n id: subscriptionId,\n categories: new Set(normalizeStringArray(params.categories)),\n targetIds: new Set([...normalizeStringArray(params.targetIds), ...normalizeOptionalString(optionalString(params.targetId))]),\n queue: [],\n waiters: [],\n cursor: polled.nextCursor,\n heartbeatTimer: setInterval(() => {\n if (!subscription.active) {\n return;\n }\n this.enqueueFeedbackEvent(subscription, {\n eventType: \"feedback.heartbeat\",\n cursor: subscription.cursor,\n ts: new Date().toISOString(),\n activeTargetIds: [...session.activeTargets.keys()]\n });\n }, 15000),\n active: true\n };\n subscription.heartbeatTimer.unref?.();\n session.feedbackSubscriptions.set(subscriptionId, subscription);\n const response: Record<string, unknown> = {\n subscriptionId,\n items: polled.items,\n cursor: polled.nextCursor,\n eventTypes: [\"feedback.item\", \"feedback.heartbeat\", \"feedback.complete\"],\n heartbeatMs: 15000,\n activeTargetIds: [...session.activeTargets.keys()],\n completeReason: null\n };\n Object.defineProperty(response, \"stream\", {\n enumerable: false,\n value: this.createFeedbackStream(subscription)\n });\n Object.defineProperty(response, \"unsubscribe\", {\n enumerable: false,\n value: () => {\n this.completeFeedbackSubscription(session, subscriptionId, \"subscription_replaced\");\n }\n });\n return response;\n }\n\n private createFeedbackStream(subscription: CanvasFeedbackSubscription): AsyncIterable<CanvasFeedbackStreamEvent> {\n const self = this;\n return {\n async *[Symbol.asyncIterator]() {\n while (subscription.active || subscription.queue.length > 0) {\n if (subscription.queue.length > 0) {\n const next = subscription.queue.shift();\n if (next) {\n yield next;\n }\n continue;\n }\n const awaited = await new Promise<CanvasFeedbackStreamEvent | null>((resolve) => {\n subscription.waiters.push(resolve);\n });\n if (awaited) {\n yield awaited;\n }\n }\n self.flushSubscriptionWaiters(subscription, null);\n }\n };\n }\n\n private enqueueFeedbackEvent(subscription: CanvasFeedbackSubscription, event: CanvasFeedbackStreamEvent): void {\n if (!subscription.active && event.eventType !== \"feedback.complete\") {\n return;\n }\n subscription.cursor = event.eventType === \"feedback.item\"\n ? event.item.cursor\n : event.cursor;\n const waiter = subscription.waiters.shift();\n if (waiter) {\n waiter(event);\n return;\n }\n subscription.queue.push(event);\n }\n\n private flushSubscriptionWaiters(subscription: CanvasFeedbackSubscription, event: CanvasFeedbackStreamEvent | null): void {\n while (subscription.waiters.length > 0) {\n const waiter = subscription.waiters.shift();\n waiter?.(event);\n }\n }\n\n private completeFeedbackSubscription(\n session: CanvasSession,\n subscriptionId: string,\n reason: \"session_closed\" | \"lease_revoked\" | \"subscription_replaced\" | \"document_unloaded\"\n ): void {\n const subscription = session.feedbackSubscriptions.get(subscriptionId);\n if (!subscription || !subscription.active) {\n return;\n }\n subscription.active = false;\n clearInterval(subscription.heartbeatTimer);\n this.enqueueFeedbackEvent(subscription, {\n eventType: \"feedback.complete\",\n cursor: subscription.cursor,\n ts: new Date().toISOString(),\n reason\n });\n session.feedbackSubscriptions.delete(subscriptionId);\n }\n\n private completeFeedbackSubscriptions(\n session: CanvasSession,\n reason: \"session_closed\" | \"lease_revoked\" | \"subscription_replaced\" | \"document_unloaded\"\n ): void {\n for (const subscriptionId of [...session.feedbackSubscriptions.keys()]) {\n this.completeFeedbackSubscription(session, subscriptionId, reason);\n }\n }\n\n private buildHandshake(session: CanvasSession): Record<string, unknown> {\n const document = session.store.getDocument();\n const governanceBlockStates = buildGovernanceBlockStates(document);\n const runtimeBudgets = getRuntimeBudgets(document);\n const libraryPolicy = resolveCanvasLibraryPolicy(document);\n const attachedClients = this.sessionSyncManager.listAttachedClients(session.canvasSessionId);\n const leaseHolderClientId = this.sessionSyncManager.getLeaseHolderClientId(session.canvasSessionId);\n const codeSyncStatus = this.codeSyncManager.getSessionStatus(\n session.canvasSessionId,\n attachedClients.length,\n leaseHolderClientId\n );\n return {\n canvasSessionId: session.canvasSessionId,\n browserSessionId: session.browserSessionId,\n leaseId: session.leaseId,\n attachModes: [\"observer\", \"lease_reclaim\"],\n schemaVersion: CANVAS_SCHEMA_VERSION,\n policyVersion: \"2026-03-09\",\n documentId: session.store.getDocumentId(),\n preflightState: session.preflightState,\n governanceRequirements: {\n requiredBeforeMutation: [\n \"intent\",\n \"generationPlan\",\n \"designLanguage\",\n \"contentModel\",\n \"layoutSystem\",\n \"typographySystem\",\n \"motionSystem\",\n \"responsiveSystem\",\n \"accessibilityPolicy\"\n ],\n requiredBeforeSave: [\n \"intent\",\n \"generationPlan\",\n \"designLanguage\",\n \"contentModel\",\n \"layoutSystem\",\n \"typographySystem\",\n \"colorSystem\",\n \"surfaceSystem\",\n \"iconSystem\",\n \"motionSystem\",\n \"responsiveSystem\",\n \"accessibilityPolicy\",\n \"libraryPolicy\",\n \"runtimeBudgets\"\n ],\n optionalInherited: [\"colorSystem\", \"surfaceSystem\", \"iconSystem\", \"libraryPolicy\", \"runtimeBudgets\"]\n },\n generationPlanRequirements: {\n requiredBeforeMutation: [\n \"targetOutcome\",\n \"visualDirection\",\n \"layoutStrategy\",\n \"contentStrategy\",\n \"componentStrategy\",\n \"motionPosture\",\n \"responsivePosture\",\n \"accessibilityPosture\",\n \"validationTargets\"\n ]\n },\n supportedVariantDimensions: [\"viewport\", \"theme\", \"interaction\", \"content\"],\n allowedLibraries: libraryPolicy,\n governanceBlockStates,\n runtimeBudgets,\n warningClasses: [\n \"missing-generation-plan\",\n \"missing-governance-block\",\n \"missing-intent\",\n \"missing-typography-system\",\n \"hierarchy-weak\",\n \"overflow\",\n \"token-missing\",\n \"contrast-failure\",\n \"broken-asset-reference\",\n \"font-policy-missing\",\n \"font-load-failure\",\n \"missing-state-coverage\",\n \"reduced-motion-violation\",\n \"unresolved-component-binding\",\n \"library-policy-violation\",\n \"responsive-mismatch\",\n \"runtime-budget-exceeded\",\n \"unsupported-target\"\n ],\n mutationPolicy: {\n planRequiredBeforePatch: true,\n allowedBeforePlan: [\n \"canvas.capabilities.get\",\n \"canvas.plan.get\",\n \"canvas.plan.set\",\n \"canvas.document.load\",\n \"canvas.session.attach\",\n \"canvas.session.status\"\n ]\n },\n documentContext: buildDocumentContext(document),\n attachedClients,\n leaseHolderClientId,\n codeSyncStatus\n };\n }\n\n private buildSessionSummary(session: CanvasSession): CanvasSessionSummary {\n const document = session.store.getDocument();\n const attachedClients = this.sessionSyncManager.listAttachedClients(session.canvasSessionId);\n const leaseHolderClientId = this.sessionSyncManager.getLeaseHolderClientId(session.canvasSessionId);\n const codeSyncStatus = this.codeSyncManager.getSessionStatus(\n session.canvasSessionId,\n attachedClients.length,\n leaseHolderClientId\n );\n return {\n canvasSessionId: session.canvasSessionId,\n browserSessionId: session.browserSessionId,\n documentId: session.store.getDocumentId(),\n leaseId: session.leaseId,\n attachModes: [\"observer\", \"lease_reclaim\"],\n preflightState: session.preflightState,\n planStatus: session.planStatus,\n mode: session.mode,\n documentRevision: session.store.getRevision(),\n libraryPolicy: resolveCanvasLibraryPolicy(document),\n componentInventoryCount: document.componentInventory.length,\n componentSourceKinds: getComponentSourceKinds(document),\n iconRoles: readCanvasIconRoles(document),\n targets: [...session.activeTargets.values()],\n overlayMounts: [...session.overlayMounts.values()],\n designTabTargetId: session.designTabTargetId,\n attachedClients,\n leaseHolderClientId,\n watchState: codeSyncStatus.watchState,\n codeSyncState: codeSyncStatus.state,\n boundFiles: codeSyncStatus.boundFiles,\n conflictCount: codeSyncStatus.conflictCount,\n driftState: codeSyncStatus.driftState,\n lastImportAt: codeSyncStatus.lastImportAt,\n lastPushAt: codeSyncStatus.lastPushAt,\n bindings: codeSyncStatus.bindings\n };\n }\n\n private requireSession(params: CanvasCommandParams): CanvasSession {\n const canvasSessionId = requireString(params.canvasSessionId, \"canvasSessionId\");\n const session = this.sessions.get(canvasSessionId);\n if (!session) {\n throw new Error(`Unknown canvas session: ${canvasSessionId}`);\n }\n return session;\n }\n\n private assertLease(session: CanvasSession, params: CanvasCommandParams): void {\n const leaseId = requireString(params.leaseId, \"leaseId\");\n if (leaseId !== session.leaseId) {\n throw this.leaseReclaimRequired(session);\n }\n }\n\n private planRequired(command: string, session: CanvasSession): Error {\n const blocker: CanvasBlocker = {\n code: \"plan_required\",\n blockingCommand: command,\n requiredNextCommands: [\"canvas.plan.set\"],\n latestRevision: session.store.getRevision(),\n message: \"generationPlan must be accepted before mutation.\"\n };\n return attachDetails(new Error(blocker.message), { code: blocker.code, blocker, details: { auditId: \"CANVAS-01\" } });\n }\n\n private revisionConflict(command: string, session: CanvasSession): Error {\n const blocker: CanvasBlocker = {\n code: \"revision_conflict\",\n blockingCommand: command,\n requiredNextCommands: [\"canvas.document.load\"],\n latestRevision: session.store.getRevision(),\n message: \"The canvas document revision changed before this patch batch was applied.\"\n };\n return attachDetails(new Error(blocker.message), { code: blocker.code, blocker, details: { auditId: \"CANVAS-07\" } });\n }\n\n private policyViolation(\n command: string,\n session: CanvasSession,\n missingBlocks: string[],\n warnings: CanvasValidationWarning[]\n ): Error {\n const blocker: CanvasBlocker = {\n code: \"policy_violation\",\n blockingCommand: command,\n requiredNextCommands: [\"canvas.plan.get\", \"canvas.document.load\"],\n latestRevision: session.store.getRevision(),\n message: `Required save governance blocks are missing: ${missingBlocks.join(\", \")}.`\n };\n return attachDetails(new Error(blocker.message), {\n code: blocker.code,\n blocker,\n details: {\n auditId: \"CANVAS-02\",\n missingBlocks,\n warnings\n }\n });\n }\n\n private unsupportedTarget(command: string, session: CanvasSession, targetId: string): Error {\n const blocker: CanvasBlocker = {\n code: \"unsupported_target\",\n blockingCommand: command,\n requiredNextCommands: [\"canvas.session.status\"],\n latestRevision: session.store.getRevision(),\n message: `Canvas target is unavailable: ${targetId}.`\n };\n return attachDetails(new Error(blocker.message), {\n code: blocker.code,\n blocker,\n details: {\n auditId: \"CANVAS-05\",\n targetId\n }\n });\n }\n\n private leaseReclaimRequired(session: CanvasSession): Error {\n const blocker: CanvasBlocker = {\n code: \"lease_reclaim_required\",\n blockingCommand: \"canvas.session.status\",\n requiredNextCommands: [\"canvas.session.status\"],\n latestRevision: session.store.getRevision(),\n message: \"The canvas lease was reclaimed or replaced.\"\n };\n return attachDetails(new Error(blocker.message), {\n code: blocker.code,\n blocker,\n details: {\n auditId: \"CANVAS-08\",\n leaseId: session.leaseId\n }\n });\n }\n\n private emitWarnings(\n session: CanvasSession,\n warnings: CanvasValidationWarning[],\n context: {\n category?: CanvasFeedbackItem[\"category\"];\n pageId?: string | null;\n prototypeId?: string | null;\n targetId?: string | null;\n } = {}\n ): void {\n for (const warning of warnings) {\n this.pushFeedback(session, {\n category: context.category ?? categoryForWarning(warning),\n class: warning.code,\n severity: warning.severity,\n message: warning.message,\n pageId: context.pageId ?? null,\n prototypeId: context.prototypeId ?? null,\n targetId: context.targetId ?? null,\n evidenceRefs: [],\n details: {\n ...(warning.details ?? {}),\n auditId: warning.auditId ?? null\n }\n });\n }\n }\n\n private filterFeedback(session: CanvasSession, params: CanvasCommandParams): CanvasFeedbackItem[] {\n const categoryFilter = new Set(normalizeStringArray(params.categories));\n const targetFilter = new Set(normalizeStringArray(params.targetIds));\n const singleTarget = optionalString(params.targetId);\n if (singleTarget) {\n targetFilter.add(singleTarget);\n }\n const filtered = session.feedback.filter((item) => {\n if (categoryFilter.size > 0 && !categoryFilter.has(item.category)) {\n return false;\n }\n if (targetFilter.size > 0 && item.targetId && !targetFilter.has(item.targetId)) {\n return false;\n }\n return targetFilter.size === 0 || item.targetId === null || targetFilter.has(item.targetId);\n });\n const blocker = session.planStatus === \"accepted\" ? null : this.buildPreflightFeedback(session);\n return blocker ? dedupeFeedback([blocker, ...filtered]) : filtered;\n }\n\n private buildPreflightFeedback(session: CanvasSession): CanvasFeedbackItem {\n const blocker = {\n code: \"plan_required\",\n blockingCommand: \"canvas.feedback.poll\",\n requiredNextCommands: [\"canvas.plan.set\"],\n latestRevision: session.store.getRevision(),\n message: \"generationPlan must be accepted before the live design loop is ready.\"\n } satisfies CanvasBlocker;\n return {\n id: `fb_preflight_${session.store.getRevision()}`,\n cursor: `fb_preflight_${session.store.getRevision()}`,\n severity: \"warning\",\n category: \"validation\",\n class: \"preflight-blocker\",\n documentId: session.store.getDocumentId(),\n pageId: null,\n prototypeId: null,\n targetId: null,\n documentRevision: session.store.getRevision(),\n message: blocker.message,\n evidenceRefs: [],\n details: {\n blocker,\n auditId: \"CANVAS-01\"\n }\n };\n }\n\n private pushFeedback(\n session: CanvasSession,\n payload: Omit<CanvasFeedbackItem, \"id\" | \"cursor\" | \"documentId\" | \"documentRevision\" | \"details\"> & { details?: Record<string, unknown> }\n ): void {\n const id = `fb_${session.nextFeedbackSeq++}`;\n const item: CanvasFeedbackItem = {\n id,\n cursor: id,\n documentId: session.store.getDocumentId(),\n documentRevision: session.store.getRevision(),\n details: payload.details ?? {},\n ...payload\n };\n session.feedback.push(item);\n if (session.feedback.length > FEEDBACK_RETENTION_LIMIT) {\n session.feedback.shift();\n }\n for (const subscription of session.feedbackSubscriptions.values()) {\n if (!this.subscriptionMatchesItem(subscription, item)) {\n continue;\n }\n this.enqueueFeedbackEvent(subscription, {\n eventType: \"feedback.item\",\n item\n });\n }\n }\n\n private subscriptionMatchesItem(subscription: CanvasFeedbackSubscription, item: CanvasFeedbackItem): boolean {\n if (subscription.categories.size > 0 && !subscription.categories.has(item.category)) {\n return false;\n }\n if (subscription.targetIds.size === 0) {\n return true;\n }\n return item.targetId === null || subscription.targetIds.has(item.targetId);\n }\n\n private buildFeedbackSnapshot(session: CanvasSession): CanvasFeedbackStreamEvent[] {\n const items = this.filterFeedback(session, {}).slice(-Math.min(FEEDBACK_BATCH_SIZE, 20));\n const snapshot: CanvasFeedbackStreamEvent[] = items.map((item) => ({\n eventType: \"feedback.item\" as const,\n item\n }));\n snapshot.push({\n eventType: \"feedback.heartbeat\",\n cursor: items.at(-1)?.cursor ?? null,\n ts: new Date().toISOString(),\n activeTargetIds: [...session.activeTargets.keys()]\n });\n return snapshot;\n }\n\n private getLatestFeedbackCursor(session: CanvasSession): string | null {\n return session.feedback.at(-1)?.cursor ?? null;\n }\n\n private allocatePreviewTarget(\n session: CanvasSession,\n targetId: string,\n activeTargetId: string | null | undefined\n ): { previewMode: CanvasPreviewState; previewState: CanvasPreviewState; degradeReason?: CanvasDegradeReason } {\n const existing = session.activeTargets.get(targetId);\n if (existing) {\n return {\n previewMode: existing.previewMode,\n previewState: existing.previewState,\n degradeReason: existing.degradeReason\n };\n }\n const budgets = getRuntimeBudgets(session.store.getDocument());\n const nonDesignTargets = [...session.activeTargets.values()].filter((entry) => entry.targetId !== session.designTabTargetId);\n const limit = budgets.defaultLivePreviewLimit + budgets.maxPinnedFullPreviewExtra;\n const previewMode: CanvasPreviewState = targetId === activeTargetId ? \"focused\" : \"background\";\n if (nonDesignTargets.length >= limit) {\n return {\n previewMode: \"degraded\",\n previewState: \"degraded\",\n degradeReason: \"overflow\"\n };\n }\n return {\n previewMode,\n previewState: previewMode\n };\n }\n\n private async collectPerfMetrics(sessionId: string, targetId: string): Promise<{ metrics: Array<{ name: string; value: number }> }> {\n const perfMetrics = (this.browserManager as { perfMetrics?: (sessionId: string, targetId?: string | null) => Promise<{ metrics: Array<{ name: string; value: number }> }> }).perfMetrics;\n if (typeof perfMetrics !== \"function\") {\n return { metrics: [] };\n }\n try {\n return await perfMetrics.call(this.browserManager, sessionId, targetId);\n } catch {\n return { metrics: [] };\n }\n }\n\n private async syncLiveViews(\n session: CanvasSession,\n options: { refreshPreviewTargets?: boolean; source?: PreviewSyncSource } = {}\n ): Promise<void> {\n await this.syncDesignTab(session);\n if (options.refreshPreviewTargets) {\n await this.syncPreviewTargets(session, options.source ?? \"agent\");\n }\n await this.syncOverlays(session);\n }\n\n private async syncDesignTab(session: CanvasSession): Promise<void> {\n if (!session.designTabTargetId || !session.browserSessionId) {\n return;\n }\n const status = await this.browserManager.status(session.browserSessionId);\n if (status.mode !== \"extension\") {\n const html = renderCanvasDocumentHtml(session.store.getDocument());\n const url = `data:text/html;charset=utf-8,${encodeURIComponent(html)}`;\n await this.browserManager.goto(session.browserSessionId, url, \"load\", 30000, undefined, session.designTabTargetId).catch(() => {});\n return;\n }\n const html = renderCanvasDocumentHtml(session.store.getDocument());\n await this.requestCanvasExtension(session, \"canvas.tab.sync\", {\n targetId: session.designTabTargetId,\n html,\n document: session.store.getDocument(),\n documentRevision: session.store.getRevision(),\n summary: this.buildSessionSummary(session),\n targets: [...session.activeTargets.values()],\n overlayMounts: [...session.overlayMounts.values()],\n feedback: this.buildFeedbackSnapshot(session),\n feedbackCursor: this.getLatestFeedbackCursor(session),\n selection: session.editorSelection\n }).catch(() => {});\n }\n\n private async syncOverlays(session: CanvasSession): Promise<void> {\n if (!session.browserSessionId || session.overlayMounts.size === 0) {\n return;\n }\n const status = await this.browserManager.status(session.browserSessionId);\n for (const mount of session.overlayMounts.values()) {\n if (status.mode === \"extension\") {\n await this.requestCanvasExtension(session, \"canvas.overlay.sync\", {\n mountId: mount.mountId,\n targetId: mount.targetId,\n selection: session.editorSelection\n }).catch(() => {});\n continue;\n }\n await this.syncDirectOverlay(\n session.browserSessionId,\n mount.mountId,\n mount.targetId,\n session.store.getDocument().title,\n session.editorSelection\n ).catch(() => {});\n }\n }\n\n private async syncPreviewTargets(session: CanvasSession, source: PreviewSyncSource): Promise<void> {\n if (!session.browserSessionId || session.activeTargets.size === 0) {\n return;\n }\n for (const target of [...session.activeTargets.values()]) {\n if (target.targetId === session.designTabTargetId || typeof target.prototypeId !== \"string\" || target.prototypeId.length === 0) {\n continue;\n }\n try {\n await this.renderPreviewTarget(session, target.targetId, target.prototypeId, {\n cause: \"patch_sync\",\n source,\n syncAfter: false\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.pushFeedback(session, {\n category: \"render\",\n class: \"preview-sync-failed\",\n severity: \"warning\",\n message,\n pageId: null,\n prototypeId: target.prototypeId,\n targetId: target.targetId,\n evidenceRefs: [],\n details: {\n cause: \"patch_sync\",\n source\n }\n });\n }\n }\n }\n\n private requirePrototype(document: CanvasDocument, prototypeId: string): CanvasPrototype {\n const prototype = document.prototypes.find((entry) => entry.id === prototypeId);\n if (!prototype) {\n throw new Error(`Unknown prototype: ${prototypeId}`);\n }\n return prototype;\n }\n\n private buildPreviewHtml(\n document: CanvasDocument,\n prototype: CanvasPrototype,\n targetId: string,\n sourceUrl: string | null\n ): string {\n const baseHref = toAbsoluteUrl(sourceUrl);\n return renderCanvasDocumentHtml(document, {\n pageIds: [prototype.pageId],\n baseHref,\n rootAttributes: {\n \"data-preview-target-id\": targetId,\n \"data-preview-prototype-id\": prototype.id,\n \"data-preview-route\": prototype.route || \"\",\n \"data-preview-source-url\": sourceUrl ?? \"\"\n }\n });\n }\n\n private async requestCanvasExtension(\n session: CanvasSession,\n command: string,\n payload: Record<string, unknown>\n ): Promise<ExtensionOverlayResult> {\n const client = await this.ensureCanvasClient();\n return await client.request<ExtensionOverlayResult>(command, payload, session.canvasSessionId, 30000, session.leaseId);\n }\n\n private async ensureCanvasClient(): Promise<CanvasClient> {\n const url = this.relay?.getCanvasUrl?.();\n if (!url) {\n throw new Error(\"Canvas relay unavailable.\");\n }\n if (!this.canvasClient || this.canvasEndpoint !== url) {\n const { connectEndpoint } = await resolveRelayEndpoint({\n wsEndpoint: url,\n path: \"canvas\",\n config: this.config\n });\n this.canvasClient?.disconnect();\n this.canvasClient = new CanvasClient(connectEndpoint, {\n onEvent: (event) => {\n void this.handleCanvasEvent(event).catch(() => {});\n }\n });\n this.canvasEndpoint = url;\n await this.canvasClient.connect();\n }\n return this.canvasClient;\n }\n\n private async handleCanvasEvent(event: { event: string; canvasSessionId?: string; payload?: unknown }): Promise<void> {\n if (event.event !== \"canvas_patch_requested\" || typeof event.canvasSessionId !== \"string\") {\n return;\n }\n const session = this.sessions.get(event.canvasSessionId);\n if (!session) {\n return;\n }\n const payload = isRecord(event.payload) ? event.payload : null;\n if (!payload) {\n return;\n }\n const baseRevision = requireNumber(payload.baseRevision, \"baseRevision\");\n const patches = requirePatches(payload.patches);\n if (isRecord(payload.selection)) {\n session.editorSelection = {\n pageId: optionalString(payload.selection.pageId) ?? session.editorSelection.pageId,\n nodeId: optionalString(payload.selection.nodeId),\n targetId: optionalString(payload.selection.targetId),\n updatedAt: new Date().toISOString()\n };\n }\n try {\n await this.applyDocumentPatches(session, baseRevision, patches, \"editor\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.pushFeedback(session, {\n category: \"validation\",\n class: \"editor-patch-rejected\",\n severity: \"warning\",\n message,\n pageId: session.editorSelection.pageId,\n prototypeId: null,\n targetId: session.editorSelection.targetId,\n evidenceRefs: [],\n details: { source: \"editor\" }\n });\n await this.syncLiveViews(session);\n }\n }\n\n private async mountDirectOverlay(\n sessionId: string,\n targetId: string,\n canvasDocument: CanvasDocument,\n prototypeId: string\n ): Promise<ExtensionOverlayResult> {\n return await this.browserManager.withPage(sessionId, targetId, async (page: DirectPageLike) => {\n await page.addStyleTag({ content: DIRECT_OVERLAY_STYLE });\n return await page.evaluate(({ title, prototype, targetId: pageTargetId }) => {\n const existing = document.getElementById(\"opendevbrowser-canvas-overlay\");\n if (existing) existing.remove();\n const root = document.createElement(\"div\");\n root.id = \"opendevbrowser-canvas-overlay\";\n root.innerHTML = `<strong>OpenDevBrowser Canvas</strong><div>${title}</div><div>${prototype}</div>`;\n document.body.append(root);\n return {\n mountId: `mount_${crypto.randomUUID()}`,\n targetId: pageTargetId,\n previewState: \"background\",\n overlayState: \"mounted\",\n capabilities: { selection: true, guides: true }\n };\n }, { title: canvasDocument.title, prototype: prototypeId, targetId });\n }) as ExtensionOverlayResult;\n }\n\n private async unmountDirectOverlay(sessionId: string, targetId: string): Promise<void> {\n await this.browserManager.withPage(sessionId, targetId, async (page: DirectPageLike) => {\n await page.evaluate(() => {\n document.getElementById(\"opendevbrowser-canvas-overlay\")?.remove();\n document.querySelectorAll(\".opendevbrowser-canvas-highlight\").forEach((element) => {\n element.classList.remove(\"opendevbrowser-canvas-highlight\");\n });\n }, undefined);\n return null;\n });\n }\n\n private async syncDirectOverlay(\n sessionId: string,\n mountId: string,\n targetId: string,\n title: string,\n selection: CanvasSession[\"editorSelection\"]\n ): Promise<void> {\n await this.browserManager.withPage(sessionId, targetId, async (page: DirectPageLike) => {\n await page.addStyleTag({ content: DIRECT_OVERLAY_STYLE });\n await page.evaluate((input) => {\n let root = document.getElementById(input.mountId);\n if (!(root instanceof HTMLElement)) {\n root = document.createElement(\"div\");\n root.id = input.mountId;\n root.innerHTML = \"<strong>OpenDevBrowser Canvas</strong><div></div><div></div>\";\n document.body.append(root);\n }\n const [heading, titleDetail, selectionDetail] = Array.from(root.children);\n if (heading instanceof HTMLElement) {\n heading.textContent = \"OpenDevBrowser Canvas\";\n }\n if (titleDetail instanceof HTMLElement) {\n titleDetail.textContent = input.title;\n }\n if (selectionDetail instanceof HTMLElement) {\n selectionDetail.textContent = input.selection.nodeId ? `Selected ${input.selection.nodeId}` : \"Canvas overlay synced\";\n }\n document.querySelectorAll(\".opendevbrowser-canvas-highlight\").forEach((element) => {\n element.classList.remove(\"opendevbrowser-canvas-highlight\");\n });\n if (input.selection.nodeId) {\n const element = document.querySelector(`[data-node-id=\"${input.selection.nodeId}\"]`);\n if (element instanceof HTMLElement) {\n element.classList.add(\"opendevbrowser-canvas-highlight\");\n }\n }\n }, { mountId, title, selection });\n return null;\n });\n }\n\n private async selectDirectOverlay(\n sessionId: string,\n targetId: string,\n nodeId: string | null,\n selectionHint: Record<string, unknown>\n ): Promise<Record<string, unknown>> {\n return await this.browserManager.withPage(sessionId, targetId, async (page: DirectPageLike) => {\n return await page.evaluate((input) => {\n document.querySelectorAll(\".opendevbrowser-canvas-highlight\").forEach((element) => {\n element.classList.remove(\"opendevbrowser-canvas-highlight\");\n });\n const selector = typeof input.selectionHint.selector === \"string\"\n ? input.selectionHint.selector\n : (input.nodeId ? `[data-node-id=\"${input.nodeId}\"]` : null);\n const element = selector ? document.querySelector(selector) : null;\n if (!(element instanceof HTMLElement)) {\n return { matched: false };\n }\n element.classList.add(\"opendevbrowser-canvas-highlight\");\n return {\n matched: true,\n selector,\n tagName: element.tagName.toLowerCase(),\n text: element.innerText.slice(0, 160),\n id: element.id || null,\n /* c8 ignore next -- the highlight class is always added immediately above */\n className: element.className || null\n };\n }, { nodeId, selectionHint });\n }) as Record<string, unknown>;\n }\n}\n\nfunction resolvePreviewUrl(currentUrl: string | undefined, route: string): string | null {\n if (!route) return currentUrl ?? null;\n try {\n const absolute = new URL(route);\n return absolute.toString();\n } catch {\n if (!currentUrl) {\n return route.startsWith(\"/\") ? null : route;\n }\n try {\n const base = new URL(currentUrl);\n return new URL(route, `${base.origin}/`).toString();\n } catch {\n return null;\n }\n }\n}\n\nfunction selectPreviewSourceCandidate(currentUrl: string | undefined, existingSourceUrl: string | null | undefined): string | undefined {\n if (isPreviewSourceCandidate(currentUrl)) {\n return currentUrl;\n }\n if (isPreviewSourceCandidate(existingSourceUrl)) {\n return existingSourceUrl;\n }\n return currentUrl ?? existingSourceUrl ?? undefined;\n}\n\nfunction isPreviewSourceCandidate(url: string | null | undefined): url is string {\n if (!url) {\n return false;\n }\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\" || parsed.protocol === \"file:\";\n } catch {\n return false;\n }\n}\n\nfunction findPrototypeRuntimeBinding(document: CanvasDocument, prototype: CanvasPrototype): CanvasBinding | null {\n const page = document.pages.find((entry) => entry.id === prototype.pageId);\n if (!page) {\n return null;\n }\n const pageNodeIds = new Set(page.nodes.map((node) => node.id));\n const candidates = document.bindings.filter((binding) => {\n return binding.codeSync?.projection === \"bound_app_runtime\"\n && pageNodeIds.has(binding.nodeId);\n });\n if (candidates.length === 0) {\n return null;\n }\n const route = prototype.route.trim();\n const routeMatch = route\n ? candidates.find((binding) => binding.codeSync?.route?.trim() === route)\n : null;\n if (routeMatch) {\n return routeMatch;\n }\n const rootBinding = page.rootNodeId\n ? candidates.find((binding) => binding.nodeId === page.rootNodeId)\n : null;\n return rootBinding ?? candidates[0] ?? null;\n}\n\nfunction toAbsoluteUrl(value: string | null): string | null {\n if (!value) {\n return null;\n }\n try {\n return new URL(value).toString();\n } catch {\n return null;\n }\n}\n\nasync function saveText(path: string, content: string): Promise<void> {\n await mkdir(dirname(path), { recursive: true });\n const { writeFileAtomic } = await import(\"../utils/fs\");\n writeFileAtomic(path, `${content}\\n`, { encoding: \"utf-8\" });\n}\n\nfunction requireString(value: unknown, name: string): string {\n if (typeof value !== \"string\" || !value.trim()) {\n throw new Error(`Missing ${name}`);\n }\n return value;\n}\n\nfunction requireAttachMode(value: unknown): CodeSyncAttachMode {\n const normalized = optionalString(value) ?? \"observer\";\n if (normalized !== \"observer\" && normalized !== \"lease_reclaim\") {\n throw new Error(`Unsupported attachMode: ${normalized}`);\n }\n return normalized;\n}\n\nfunction requireResolutionPolicy(value: unknown): CodeSyncResolutionPolicy | undefined {\n const normalized = optionalString(value);\n if (!normalized) {\n return undefined;\n }\n if (normalized !== \"prefer_code\" && normalized !== \"prefer_canvas\" && normalized !== \"manual\") {\n throw new Error(`Unsupported resolutionPolicy: ${normalized}`);\n }\n return normalized;\n}\n\nfunction requireCanvasBinding(document: CanvasDocument, bindingId: string): CanvasBinding {\n const binding = document.bindings.find((entry) => entry.id === bindingId);\n if (!binding) {\n throw new Error(`Unknown canvas binding: ${bindingId}`);\n }\n return binding;\n}\n\nfunction requireCodeSyncBinding(document: CanvasDocument, bindingId: string): CanvasBinding {\n const binding = requireCanvasBinding(document, bindingId);\n if (!binding.codeSync) {\n throw attachDetails(new Error(`Binding ${bindingId} is not configured for code sync.`), {\n code: \"code_sync_required\",\n details: { bindingId }\n });\n }\n return binding;\n}\n\nfunction createCodeSyncBinding(params: CanvasCommandParams, nodeId: string, bindingId: string): Omit<CanvasBinding, \"nodeId\"> & Partial<Pick<CanvasBinding, \"nodeId\">> {\n const ownership: CodeSyncOwnership = isRecord(params.ownership)\n ? params.ownership as CodeSyncOwnership\n : {\n structure: \"shared\",\n text: \"shared\",\n style: \"shared\",\n tokens: \"shared\",\n behavior: \"code\",\n data: \"code\"\n };\n return {\n id: bindingId,\n nodeId,\n kind: \"code-sync\",\n selector: optionalString(params.selector) ?? undefined,\n componentName: optionalString(params.componentName) ?? undefined,\n metadata: {},\n codeSync: {\n adapter: \"tsx-react-v1\",\n repoPath: requireString(params.repoPath, \"repoPath\"),\n exportName: optionalString(params.exportName) ?? undefined,\n selector: optionalString(params.selector) ?? undefined,\n syncMode: (optionalString(params.syncMode) as \"manual\" | \"watch\" | null) ?? \"manual\",\n ownership,\n route: optionalString(params.route) ?? undefined,\n verificationTarget: optionalString(params.verificationTarget) ?? undefined,\n runtimeRootSelector: optionalString(params.runtimeRootSelector) ?? undefined,\n projection: (optionalString(params.projection) as \"canvas_html\" | \"bound_app_runtime\" | null) ?? \"canvas_html\"\n }\n };\n}\n\nfunction requireNumber(value: unknown, name: string): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(`Missing ${name}`);\n }\n return value;\n}\n\nfunction optionalString(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value : null;\n}\n\nfunction normalizeOptionalString(value: string | null): string[] {\n return value ? [value] : [];\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0) : [];\n}\n\nfunction requireRecord(value: unknown, name: string): Record<string, unknown> {\n if (!isRecord(value)) {\n throw new Error(`Missing ${name}`);\n }\n return value;\n}\n\nfunction requirePatches(value: unknown): CanvasPatch[] {\n if (!Array.isArray(value)) {\n throw new Error(\"Missing patches\");\n }\n return value as CanvasPatch[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isNonEmptyRecord(value: unknown): value is Record<string, unknown> {\n return isRecord(value) && Object.keys(value).length > 0;\n}\n\nfunction requireTabPreviewMode(value: unknown, name: string): \"focused\" | \"pinned\" | \"background\" {\n if (value === \"focused\" || value === \"pinned\" || value === \"background\") {\n return value;\n }\n throw new Error(`Missing ${name}`);\n}\n\nfunction requireRefreshMode(value: unknown, name: string): \"full\" | \"thumbnail\" {\n if (value === \"full\" || value === \"thumbnail\") {\n return value;\n }\n throw new Error(`Missing ${name}`);\n}\n\nfunction categoryForWarning(warning: CanvasValidationWarning): CanvasFeedbackItem[\"category\"] {\n switch (warning.code) {\n case \"broken-asset-reference\":\n case \"asset-provenance-missing\":\n return \"asset\";\n case \"export-warning\":\n return \"export\";\n default:\n return \"validation\";\n }\n}\n\nfunction dedupeFeedback(items: CanvasFeedbackItem[]): CanvasFeedbackItem[] {\n const seen = new Set<string>();\n return items.filter((item) => {\n if (seen.has(item.id)) {\n return false;\n }\n seen.add(item.id);\n return true;\n });\n}\n\nfunction getRuntimeBudgets(document: CanvasDocument): {\n defaultLivePreviewLimit: number;\n maxPinnedFullPreviewExtra: number;\n reconnectGraceMs: number;\n overflowRenderMode: string;\n backgroundTelemetryMode: string;\n} {\n const raw = document.designGovernance.runtimeBudgets;\n const runtimeBudgets = isRecord(raw) ? raw : {};\n return {\n defaultLivePreviewLimit: readNumber(runtimeBudgets.defaultLivePreviewLimit, CANVAS_PROJECT_DEFAULTS.runtimeBudgets.defaultLivePreviewLimit),\n maxPinnedFullPreviewExtra: readNumber(runtimeBudgets.maxPinnedFullPreviewExtra, CANVAS_PROJECT_DEFAULTS.runtimeBudgets.maxPinnedFullPreviewExtra),\n reconnectGraceMs: readNumber(runtimeBudgets.reconnectGraceMs, CANVAS_PROJECT_DEFAULTS.runtimeBudgets.reconnectGraceMs),\n overflowRenderMode: typeof runtimeBudgets.overflowRenderMode === \"string\"\n ? runtimeBudgets.overflowRenderMode\n : CANVAS_PROJECT_DEFAULTS.runtimeBudgets.overflowRenderMode,\n backgroundTelemetryMode: typeof runtimeBudgets.backgroundTelemetryMode === \"string\"\n ? runtimeBudgets.backgroundTelemetryMode\n : CANVAS_PROJECT_DEFAULTS.runtimeBudgets.backgroundTelemetryMode\n };\n}\n\nfunction getComponentSourceKinds(document: CanvasDocument): string[] {\n const kinds = new Set<string>();\n for (const component of document.componentInventory) {\n if (!isRecord(component)) {\n continue;\n }\n const sourceKind = optionalString(component.sourceKind);\n if (sourceKind) {\n kinds.add(sourceKind);\n }\n }\n return [...kinds].sort((left, right) => left.localeCompare(right));\n}\n\nfunction readNumber(value: unknown, fallback: number): number {\n return typeof value === \"number\" && Number.isFinite(value) ? value : fallback;\n}\n\nfunction attachDetails(error: Error, details: Record<string, unknown>): Error {\n Object.assign(error, details);\n return error;\n}\n","import { randomUUID } from \"crypto\";\nimport { WebSocket } from \"ws\";\nimport {\n CANVAS_PROTOCOL_VERSION,\n MAX_CANVAS_PAYLOAD_BYTES,\n type CanvasChunk,\n type CanvasError,\n type CanvasErrorResponse,\n type CanvasEvent,\n type CanvasHello,\n type CanvasHelloAck,\n type CanvasPing,\n type CanvasPong,\n type CanvasRequest,\n type CanvasResponse\n} from \"../relay/protocol\";\n\nexport type CanvasClientOptions = {\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: CanvasEvent) => 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 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 CanvasClient {\n private readonly url: string;\n private socket: WebSocket | null = null;\n private lastHelloAck: CanvasHelloAck | null = null;\n private connectPromise: Promise<CanvasHelloAck> | 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 readonly handshakeTimeoutMs: number;\n private readonly pingIntervalMs: number;\n private readonly pingTimeoutMs: number;\n private readonly maxPayloadBytes: number;\n private readonly onEvent?: (event: CanvasEvent) => void;\n private readonly onClose?: (detail?: { code?: number; reason?: string }) => void;\n private autoReconnect: boolean;\n private readonly reconnectBaseDelayMs: number;\n private readonly reconnectMaxDelayMs: number;\n private reconnectAttempts = 0;\n private reconnectTimer: NodeJS.Timeout | null = null;\n private shouldReconnectOnClose = true;\n private missedPongs = 0;\n private readonly maxMissedPongs: number;\n\n constructor(url: string, options: CanvasClientOptions = {}) {\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_CANVAS_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<CanvasHelloAck> {\n if (this.connectPromise) {\n return await this.connectPromise;\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 -- socket is assigned immediately above unless the constructor throws */\n if (!this.socket) {\n reject(new Error(\"Canvas socket not created\"));\n return;\n }\n const timeoutId = setTimeout(() => {\n cleanup();\n try {\n this.socket?.close(1000, \"Canvas handshake timeout\");\n } catch {\n // ignore\n }\n reject(new Error(\"Canvas handshake timeout\"));\n }, this.handshakeTimeoutMs);\n const onOpen = () => {\n cleanup();\n resolve();\n };\n const onError = (error: Error) => {\n cleanup();\n reject(error);\n };\n const onClose = () => {\n cleanup();\n reject(new Error(\"Canvas socket closed before handshake\"));\n };\n const cleanup = () => {\n clearTimeout(timeoutId);\n this.socket?.removeListener(\"open\", onOpen);\n this.socket?.removeListener(\"error\", onError);\n this.socket?.removeListener(\"close\", onClose);\n };\n timeoutId.unref?.();\n this.socket.once(\"open\", onOpen);\n this.socket.once(\"error\", onError);\n this.socket.once(\"close\", onClose);\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 }\n\n const hello: CanvasHello = {\n type: \"canvas_hello\",\n version: CANVAS_PROTOCOL_VERSION,\n maxPayloadBytes: this.maxPayloadBytes\n };\n\n const ack = await new Promise<CanvasHelloAck>((resolve, reject) => {\n const cleanup = () => {\n clearTimeout(timeoutId);\n this.socket?.removeListener(\"canvas_hello_ack\", onAck as unknown as (...args: unknown[]) => void);\n this.socket?.removeListener(\"canvas_hello_error\", onError as unknown as (...args: unknown[]) => void);\n this.socket?.removeListener(\"close\", onClose);\n };\n const timeoutId = setTimeout(() => {\n cleanup();\n try {\n this.socket?.close(1000, \"Canvas handshake timeout\");\n } catch {\n // ignore\n }\n reject(new Error(\"Canvas handshake timeout\"));\n }, this.handshakeTimeoutMs);\n const onAck = (message: CanvasHelloAck) => {\n cleanup();\n resolve(message);\n };\n const onError = (message: CanvasErrorResponse) => {\n cleanup();\n reject(buildCanvasError(message.error));\n };\n const onClose = () => {\n cleanup();\n reject(new Error(\"Canvas socket closed before handshake\"));\n };\n timeoutId.unref?.();\n this.socket?.once(\"canvas_hello_ack\", onAck as unknown as (...args: unknown[]) => void);\n this.socket?.once(\"canvas_hello_error\", onError as unknown as (...args: unknown[]) => void);\n this.socket?.once(\"close\", onClose);\n try {\n this.send(hello);\n } catch (error) {\n cleanup();\n reject(error instanceof Error ? error : new Error(\"Canvas 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 && (this.socket.readyState === WebSocket.OPEN || this.socket.readyState === WebSocket.CONNECTING)) {\n try {\n this.socket.close(1000, \"Canvas disconnect\");\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(\"Canvas socket closed\"));\n }\n this.pendingRequests.clear();\n this.pendingChunks.clear();\n }\n\n async request<T>(\n command: string,\n payload?: unknown,\n canvasSessionId?: string,\n timeoutMs = 30000,\n leaseId?: string\n ): Promise<T> {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n await this.connect();\n }\n const requestId = randomUUID();\n const request: CanvasRequest = {\n type: \"canvas_request\",\n requestId,\n canvasSessionId,\n leaseId,\n command,\n payload\n };\n const serialized = JSON.stringify(request);\n if (Buffer.byteLength(serialized) > this.maxPayloadBytes) {\n throw new Error(\"Canvas request payload exceeded max size\");\n }\n return await new Promise<T>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new Error(\"Canvas request timed out\"));\n }, timeoutMs);\n timeoutId.unref?.();\n this.pendingRequests.set(requestId, { resolve: (value) => resolve(value as T), 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(\"Canvas send failed\"));\n }\n });\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 switch (record.type) {\n case \"canvas_hello_ack\":\n this.socket?.emit(\"canvas_hello_ack\", record);\n return;\n case \"canvas_error\": {\n const requestId = typeof record.requestId === \"string\" ? record.requestId : \"unknown\";\n if (requestId === \"canvas_hello\") {\n this.socket?.emit(\"canvas_hello_error\", record);\n return;\n }\n const pending = this.pendingRequests.get(requestId);\n if (pending && isCanvasErrorResponse(record)) {\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(requestId);\n pending.reject(buildCanvasError(record.error));\n }\n return;\n }\n case \"canvas_response\": {\n if (!isCanvasResponse(record)) return;\n const pending = this.pendingRequests.get(record.requestId);\n if (!pending) return;\n if (record.chunked) {\n this.pendingChunks.set(record.requestId, {\n totalChunks: record.totalChunks ?? 0,\n chunks: new Array(record.totalChunks ?? 0).fill(\"\")\n });\n return;\n }\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(record.requestId);\n pending.resolve(record.payload ?? null);\n return;\n }\n case \"canvas_chunk\": {\n if (!isCanvasChunk(record)) return;\n const pending = this.pendingRequests.get(record.requestId);\n const chunkState = this.pendingChunks.get(record.requestId);\n if (!pending || !chunkState) return;\n chunkState.chunks[record.chunkIndex] = record.data;\n const received = chunkState.chunks.filter((chunk) => chunk.length > 0).length;\n if (received === chunkState.totalChunks) {\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(record.requestId);\n this.pendingChunks.delete(record.requestId);\n const raw = chunkState.chunks.join(\"\");\n /* c8 ignore next -- completion only happens after all chunks are non-empty */\n pending.resolve(raw ? JSON.parse(raw) : null);\n }\n return;\n }\n case \"canvas_event\":\n if (isCanvasEvent(record)) {\n this.onEvent?.(record);\n }\n return;\n case \"canvas_pong\": {\n const id = typeof record.id === \"string\" ? record.id : \"\";\n const pending = this.pendingPings.get(id);\n if (!pending) return;\n clearTimeout(pending.timeoutId);\n this.pendingPings.delete(id);\n this.missedPongs = 0;\n pending.resolve();\n }\n }\n }\n\n private handleClose(detail?: { code?: number; reason?: string }): void {\n this.stopHeartbeat();\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeoutId);\n pending.reject(new Error(\"Canvas socket closed\"));\n }\n this.pendingRequests.clear();\n this.pendingChunks.clear();\n for (const pending of this.pendingPings.values()) {\n clearTimeout(pending.timeoutId);\n pending.reject(new Error(\"Canvas socket closed\"));\n }\n this.pendingPings.clear();\n this.lastHelloAck = null;\n this.socket = null;\n this.onClose?.(detail);\n if (!this.autoReconnect || !this.shouldReconnectOnClose) {\n return;\n }\n const delay = Math.min(this.reconnectBaseDelayMs * (2 ** this.reconnectAttempts), this.reconnectMaxDelayMs);\n this.reconnectAttempts += 1;\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n void this.connect().catch(() => {});\n }, delay);\n this.reconnectTimer.unref?.();\n }\n\n private startHeartbeat(): void {\n if (this.heartbeatTimer) return;\n this.heartbeatTimer = setInterval(() => {\n void this.sendPing().catch(() => {});\n }, this.pingIntervalMs);\n this.heartbeatTimer.unref?.();\n }\n\n private stopHeartbeat(): void {\n if (!this.heartbeatTimer) return;\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\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: CanvasPing = { type: \"canvas_ping\", id };\n await new Promise<void>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pendingPings.delete(id);\n this.missedPongs += 1;\n if (this.missedPongs > this.maxMissedPongs && this.socket) {\n this.socket.close(1011, \"Canvas heartbeat timed out\");\n }\n reject(new Error(\"Canvas ping timed out\"));\n }, this.pingTimeoutMs);\n timeoutId.unref?.();\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(\"Canvas ping failed\"));\n }\n });\n }\n\n private send(payload: unknown): void {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n throw new Error(\"Canvas socket not connected\");\n }\n this.socket.send(JSON.stringify(payload));\n }\n\n private sendRaw(payload: string): void {\n if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {\n throw new Error(\"Canvas socket not connected\");\n }\n this.socket.send(payload);\n }\n\n private clearReconnectTimer(): void {\n if (!this.reconnectTimer) return;\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n}\n\nconst parseJson = (data: WebSocket.RawData): unknown => {\n try {\n return JSON.parse(typeof data === \"string\" ? data : data.toString());\n } catch {\n return null;\n }\n};\n\nconst buildCanvasError = (error: CanvasError): Error => {\n const result = new Error(`[${error.code}] ${error.message}`);\n Object.assign(result, { code: error.code, details: error.details });\n return result;\n};\n\nconst isCanvasErrorResponse = (value: Record<string, unknown>): value is CanvasErrorResponse => {\n return value.type === \"canvas_error\" && isRecord(value.error);\n};\n\nconst isCanvasResponse = (value: Record<string, unknown>): value is CanvasResponse => {\n return value.type === \"canvas_response\" && typeof value.requestId === \"string\";\n};\n\nconst isCanvasChunk = (value: Record<string, unknown>): value is CanvasChunk => {\n return value.type === \"canvas_chunk\"\n && typeof value.requestId === \"string\"\n && typeof value.chunkIndex === \"number\"\n && typeof value.totalChunks === \"number\"\n && typeof value.data === \"string\";\n};\n\nconst isCanvasEvent = (value: Record<string, unknown>): value is CanvasEvent => {\n return value.type === \"canvas_event\" && typeof value.event === \"string\";\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n","import { randomUUID } from \"crypto\";\nimport * as Y from \"yjs\";\nimport type {\n CanvasBinding,\n CanvasBlockState,\n CanvasDocument,\n CanvasFeedbackItem,\n CanvasGenerationPlan,\n CanvasGovernanceBlockKey,\n CanvasGovernanceBlockState,\n CanvasIconRoles,\n CanvasLibraryPolicy,\n CanvasNode,\n CanvasPage,\n CanvasPatch,\n CanvasPrototype,\n CanvasValidationWarning,\n CanvasVariantPatch,\n CanvasVariantSelector\n} from \"./types\";\nimport { CANVAS_SCHEMA_VERSION } from \"./types\";\nimport { normalizeCodeSyncBindingMetadata } from \"./code-sync/types\";\n\nconst GOVERNANCE_KEYS: CanvasGovernanceBlockKey[] = [\n \"intent\",\n \"generationPlan\",\n \"designLanguage\",\n \"contentModel\",\n \"layoutSystem\",\n \"typographySystem\",\n \"colorSystem\",\n \"surfaceSystem\",\n \"iconSystem\",\n \"motionSystem\",\n \"responsiveSystem\",\n \"accessibilityPolicy\",\n \"libraryPolicy\",\n \"runtimeBudgets\"\n];\n\nconst OPTIONAL_INHERITED_KEYS = new Set<CanvasGovernanceBlockKey>([\n \"colorSystem\",\n \"surfaceSystem\",\n \"iconSystem\",\n \"libraryPolicy\",\n \"runtimeBudgets\"\n]);\n\nconst REQUIRED_BEFORE_SAVE_KEYS: CanvasGovernanceBlockKey[] = [\n \"intent\",\n \"generationPlan\",\n \"designLanguage\",\n \"contentModel\",\n \"layoutSystem\",\n \"typographySystem\",\n \"colorSystem\",\n \"surfaceSystem\",\n \"iconSystem\",\n \"motionSystem\",\n \"responsiveSystem\",\n \"accessibilityPolicy\",\n \"libraryPolicy\",\n \"runtimeBudgets\"\n];\n\nconst REQUIRED_PLAN_FIELDS = [\n \"targetOutcome\",\n \"visualDirection\",\n \"layoutStrategy\",\n \"contentStrategy\",\n \"componentStrategy\",\n \"motionPosture\",\n \"responsivePosture\",\n \"accessibilityPosture\",\n \"validationTargets\"\n] as const;\n\nconst PROJECT_DEFAULT_LIBRARY_POLICY: CanvasLibraryPolicy = {\n icons: [\"3dicons\", \"tabler\", \"microsoft-fluent-ui-system-icons\", \"@lobehub/fluent-emoji-3d\"],\n components: [\"shadcn\"],\n styling: [\"tailwindcss\"],\n motion: [],\n threeD: []\n};\n\nconst APPROVED_LIBRARY_ENTRIES: Record<keyof CanvasLibraryPolicy, ReadonlySet<string>> = {\n icons: new Set(PROJECT_DEFAULT_LIBRARY_POLICY.icons),\n components: new Set(PROJECT_DEFAULT_LIBRARY_POLICY.components),\n styling: new Set(PROJECT_DEFAULT_LIBRARY_POLICY.styling),\n motion: new Set(PROJECT_DEFAULT_LIBRARY_POLICY.motion),\n threeD: new Set(PROJECT_DEFAULT_LIBRARY_POLICY.threeD)\n};\n\nconst PROJECT_DEFAULT_RUNTIME_BUDGETS = {\n defaultLivePreviewLimit: 2,\n maxPinnedFullPreviewExtra: 1,\n reconnectGraceMs: 20_000,\n overflowRenderMode: \"thumbnail_only\",\n backgroundTelemetryMode: \"sampled\"\n};\n\nfunction inheritedDefaultForGovernanceKey(key: CanvasGovernanceBlockKey): Record<string, unknown> | null {\n switch (key) {\n case \"libraryPolicy\":\n return PROJECT_DEFAULT_LIBRARY_POLICY;\n case \"runtimeBudgets\":\n return PROJECT_DEFAULT_RUNTIME_BUDGETS;\n default:\n return null;\n }\n}\n\nconst clone = <T>(value: T): T => JSON.parse(JSON.stringify(value)) as T;\n\nconst stableStringify = (value: 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((entry) => stableStringify(entry)).join(\",\")}]`;\n if (!value || typeof value !== \"object\") return JSON.stringify(value);\n const entries = Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entryValue]) => `${JSON.stringify(key)}:${stableStringify(entryValue)}`);\n return `{${entries.join(\",\")}}`;\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst isNonEmptyRecord = (value: unknown): value is Record<string, unknown> => isRecord(value) && Object.keys(value).length > 0;\n\nconst uniqueStrings = (values: string[]): string[] => [...new Set(values)];\n\nconst normalizeLibraryPolicyField = (value: unknown, fallback: readonly string[]): string[] => {\n if (!Array.isArray(value)) {\n return [...fallback];\n }\n return uniqueStrings(value.filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0));\n};\n\nconst nowIso = (): string => new Date().toISOString();\n\nfunction normalizeGovernance(document: CanvasDocument[\"designGovernance\"]): CanvasDocument[\"designGovernance\"] {\n const next = {} as CanvasDocument[\"designGovernance\"];\n for (const key of GOVERNANCE_KEYS) {\n const value = document[key];\n next[key] = isRecord(value) ? clone(value) : {};\n }\n if (!isNonEmptyRecord(next.libraryPolicy)) {\n next.libraryPolicy = clone(PROJECT_DEFAULT_LIBRARY_POLICY);\n }\n if (!isNonEmptyRecord(next.runtimeBudgets)) {\n next.runtimeBudgets = clone(PROJECT_DEFAULT_RUNTIME_BUDGETS);\n }\n return next;\n}\n\nfunction createDefaultNode(pageId: string, nodeId: string, name: string): CanvasNode {\n return {\n id: nodeId,\n kind: \"frame\",\n name,\n pageId,\n parentId: null,\n childIds: [],\n rect: { x: 0, y: 0, width: 1440, height: 960 },\n props: {},\n style: {},\n tokenRefs: {},\n bindingRefs: {},\n variantPatches: [],\n metadata: {}\n };\n}\n\nexport function createDefaultCanvasDocument(documentId = `dc_${randomUUID()}`): CanvasDocument {\n const createdAt = nowIso();\n const rootNodeId = `node_root_${documentId.slice(-8)}`;\n const pageId = \"page_home\";\n return {\n schemaVersion: CANVAS_SCHEMA_VERSION,\n documentId,\n title: \"Untitled Design Canvas\",\n createdAt,\n updatedAt: createdAt,\n designGovernance: normalizeGovernance({} as CanvasDocument[\"designGovernance\"]),\n pages: [{\n id: pageId,\n name: \"Home\",\n path: \"/\",\n rootNodeId,\n prototypeIds: [\"proto_home_default\"],\n nodes: [createDefaultNode(pageId, rootNodeId, \"Home Root\")],\n metadata: {}\n }],\n components: [],\n componentInventory: [],\n tokens: {},\n assets: [],\n viewports: [\n { id: \"desktop\", width: 1440 },\n { id: \"tablet\", width: 1024 },\n { id: \"mobile\", width: 390 }\n ],\n themes: [{ id: \"light\" }],\n bindings: [],\n prototypes: [{\n id: \"proto_home_default\",\n pageId,\n route: \"/\",\n name: \"Home Default\",\n defaultVariants: { viewport: \"desktop\", theme: \"light\" },\n metadata: {}\n }],\n meta: {}\n };\n}\n\nexport function normalizeCanvasDocument(input: CanvasDocument): CanvasDocument {\n const base = clone(input);\n const createdAt = typeof base.createdAt === \"string\" ? base.createdAt : nowIso();\n const updatedAt = typeof base.updatedAt === \"string\" ? base.updatedAt : createdAt;\n return {\n schemaVersion: typeof base.schemaVersion === \"string\" ? base.schemaVersion : CANVAS_SCHEMA_VERSION,\n documentId: typeof base.documentId === \"string\" ? base.documentId : `dc_${randomUUID()}`,\n title: typeof base.title === \"string\" && base.title.trim() ? base.title : \"Untitled Design Canvas\",\n createdAt,\n updatedAt,\n designGovernance: normalizeGovernance(base.designGovernance ?? ({} as CanvasDocument[\"designGovernance\"])),\n pages: Array.isArray(base.pages) ? base.pages.map((page) => ({\n id: page.id,\n name: page.name || page.id,\n description: page.description,\n path: page.path || \"/\",\n rootNodeId: page.rootNodeId ?? null,\n prototypeIds: Array.isArray(page.prototypeIds) ? [...page.prototypeIds] : [],\n nodes: Array.isArray(page.nodes) ? page.nodes.map((node) => ({\n ...node,\n name: node.name || node.id,\n childIds: Array.isArray(node.childIds) ? [...node.childIds] : [],\n rect: node.rect ?? { x: 0, y: 0, width: 320, height: 180 },\n props: isRecord(node.props) ? clone(node.props) : {},\n style: isRecord(node.style) ? clone(node.style) : {},\n tokenRefs: isRecord(node.tokenRefs) ? clone(node.tokenRefs) : {},\n bindingRefs: isRecord(node.bindingRefs) ? clone(node.bindingRefs) : {},\n variantPatches: Array.isArray(node.variantPatches) ? node.variantPatches.map((patch) => ({\n selector: isRecord(patch.selector) ? clone(patch.selector as CanvasVariantSelector) : {},\n changes: isRecord(patch.changes) ? clone(patch.changes) : {}\n })) : [],\n metadata: isRecord(node.metadata) ? clone(node.metadata) : {}\n })) : [],\n metadata: isRecord(page.metadata) ? clone(page.metadata) : {}\n })) : [],\n components: Array.isArray(base.components) ? clone(base.components) : [],\n componentInventory: Array.isArray(base.componentInventory) ? clone(base.componentInventory) : [],\n tokens: isRecord(base.tokens) ? clone(base.tokens) : {},\n assets: Array.isArray(base.assets) ? base.assets.map((asset) => ({\n id: typeof asset.id === \"string\" ? asset.id : `asset_${randomUUID()}`,\n sourceType: typeof asset.sourceType === \"string\" ? asset.sourceType : undefined,\n kind: typeof asset.kind === \"string\" ? asset.kind : undefined,\n repoPath: typeof asset.repoPath === \"string\" ? asset.repoPath : null,\n url: typeof asset.url === \"string\" ? asset.url : null,\n mime: typeof asset.mime === \"string\" ? asset.mime : undefined,\n width: typeof asset.width === \"number\" ? asset.width : undefined,\n height: typeof asset.height === \"number\" ? asset.height : undefined,\n hash: typeof asset.hash === \"string\" ? asset.hash : undefined,\n status: typeof asset.status === \"string\" ? asset.status : undefined,\n variants: Array.isArray(asset.variants) ? clone(asset.variants) : [],\n metadata: isRecord(asset.metadata) ? clone(asset.metadata) : {}\n })) : [],\n viewports: Array.isArray(base.viewports) ? clone(base.viewports) : [],\n themes: Array.isArray(base.themes) ? clone(base.themes) : [],\n bindings: Array.isArray(base.bindings) ? base.bindings.map((binding) => normalizeBinding(binding)) : [],\n prototypes: Array.isArray(base.prototypes) ? clone(base.prototypes) : [],\n meta: isRecord(base.meta) ? clone(base.meta) : {}\n };\n}\n\nfunction normalizeBinding(binding: CanvasBinding): CanvasBinding {\n const normalized: CanvasBinding = {\n id: binding.id,\n nodeId: binding.nodeId,\n kind: binding.kind,\n selector: typeof binding.selector === \"string\" ? binding.selector : undefined,\n componentName: typeof binding.componentName === \"string\" ? binding.componentName : undefined,\n metadata: isRecord(binding.metadata) ? clone(binding.metadata) : {}\n };\n if (binding.kind === \"code-sync\" || binding.codeSync) {\n normalized.codeSync = normalizeCodeSyncBindingMetadata(binding.codeSync ?? binding.metadata?.codeSync);\n }\n return normalized;\n}\n\nexport function validateGenerationPlan(plan: unknown): { ok: true } | { ok: false; missing: string[] } {\n if (!isRecord(plan)) {\n return { ok: false, missing: [...REQUIRED_PLAN_FIELDS] };\n }\n const missing = REQUIRED_PLAN_FIELDS.filter((field) => !isNonEmptyRecord(plan[field]));\n return missing.length === 0 ? { ok: true } : { ok: false, missing: [...missing] };\n}\n\nexport function resolveCanvasLibraryPolicy(document: CanvasDocument): CanvasLibraryPolicy {\n const policy = getGovernanceBlock(document, \"libraryPolicy\");\n return {\n icons: normalizeLibraryPolicyField(policy.icons, PROJECT_DEFAULT_LIBRARY_POLICY.icons),\n components: normalizeLibraryPolicyField(policy.components, PROJECT_DEFAULT_LIBRARY_POLICY.components),\n styling: normalizeLibraryPolicyField(policy.styling, PROJECT_DEFAULT_LIBRARY_POLICY.styling),\n motion: normalizeLibraryPolicyField(policy.motion, PROJECT_DEFAULT_LIBRARY_POLICY.motion),\n threeD: normalizeLibraryPolicyField(policy.threeD, PROJECT_DEFAULT_LIBRARY_POLICY.threeD)\n };\n}\n\nexport function readCanvasIconRoles(document: CanvasDocument): CanvasIconRoles {\n const iconPolicy = getGovernanceBlock(document, \"iconSystem\");\n return {\n primary: readString(iconPolicy, \"primary\"),\n secondary: readString(iconPolicy, \"secondary\"),\n secondaryAlt: readString(iconPolicy, \"secondaryAlt\"),\n decorative: readString(iconPolicy, \"decorative\")\n };\n}\n\nexport function buildGovernanceBlockStates(document: CanvasDocument): Record<CanvasGovernanceBlockKey, CanvasGovernanceBlockState> {\n const states = {} as Record<CanvasGovernanceBlockKey, CanvasGovernanceBlockState>;\n for (const key of GOVERNANCE_KEYS) {\n const block = document.designGovernance[key];\n let status: CanvasBlockState = \"missing\";\n let source: \"document\" | \"project-default\" = \"document\";\n if (isNonEmptyRecord(block)) {\n const inheritedDefault = OPTIONAL_INHERITED_KEYS.has(key) ? inheritedDefaultForGovernanceKey(key) : null;\n status = inheritedDefault && stableStringify(block) === stableStringify(inheritedDefault)\n ? \"inherited\"\n : \"present\";\n if (status === \"inherited\") {\n source = \"project-default\";\n }\n } else if (OPTIONAL_INHERITED_KEYS.has(key)) {\n status = \"inherited\";\n source = \"project-default\";\n }\n states[key] = { status, source, editable: true };\n }\n return states;\n}\n\nexport function buildDocumentContext(document: CanvasDocument): {\n status: \"existing\";\n existingGovernanceBlocks: CanvasGovernanceBlockKey[];\n missingGovernanceBlocks: CanvasGovernanceBlockKey[];\n tokensPresent: boolean;\n themesPresent: boolean;\n viewportsPresent: boolean;\n componentInventoryPresent: boolean;\n} {\n const states = buildGovernanceBlockStates(document);\n const existingGovernanceBlocks = GOVERNANCE_KEYS.filter((key) => states[key].status !== \"missing\");\n const missingGovernanceBlocks = GOVERNANCE_KEYS.filter((key) => states[key].status === \"missing\");\n return {\n status: \"existing\",\n existingGovernanceBlocks,\n missingGovernanceBlocks,\n tokensPresent: Object.keys(document.tokens).length > 0,\n themesPresent: document.themes.length > 0,\n viewportsPresent: document.viewports.length > 0,\n componentInventoryPresent: document.componentInventory.length > 0\n };\n}\n\nconst buildWarning = (\n code: CanvasValidationWarning[\"code\"],\n message: string,\n options: {\n severity?: CanvasValidationWarning[\"severity\"];\n details?: Record<string, unknown>;\n auditId?: string;\n } = {}\n): CanvasValidationWarning => ({\n code,\n severity: options.severity ?? \"warning\",\n message,\n details: options.details,\n auditId: options.auditId\n});\n\nexport function evaluateCanvasWarnings(\n document: CanvasDocument,\n options: {\n forSave?: boolean;\n degradeReason?: string | null;\n unsupportedTarget?: string | null;\n } = {}\n): CanvasValidationWarning[] {\n const warnings: CanvasValidationWarning[] = [];\n const states = buildGovernanceBlockStates(document);\n const generationPlan = getGovernanceBlock(document, \"generationPlan\");\n const typographySystem = getGovernanceBlock(document, \"typographySystem\");\n if (!isNonEmptyRecord(generationPlan)) {\n warnings.push(buildWarning(\"missing-generation-plan\", \"generationPlan is required before mutation or save.\", { auditId: \"CANVAS-03\" }));\n }\n if (states.intent.status === \"missing\") {\n warnings.push(buildWarning(\"missing-intent\", \"designGovernance.intent is missing.\", { auditId: \"CANVAS-02\" }));\n }\n if (states.designLanguage.status === \"missing\") {\n warnings.push(buildWarning(\"missing-design-language\", \"designGovernance.designLanguage is missing.\", { auditId: \"CANVAS-02\" }));\n }\n if (states.contentModel.status === \"missing\") {\n warnings.push(buildWarning(\"missing-content-model\", \"designGovernance.contentModel is missing.\", { auditId: \"CANVAS-02\" }));\n }\n if (states.typographySystem.status === \"missing\") {\n warnings.push(buildWarning(\"missing-typography-system\", \"designGovernance.typographySystem is missing.\", { auditId: \"CANVAS-02\" }));\n }\n if (states.responsiveSystem.status === \"missing\") {\n warnings.push(buildWarning(\"missing-responsive-policy\", \"designGovernance.responsiveSystem is missing.\", { auditId: \"CANVAS-02\" }));\n }\n if (!hasTypographyHierarchy(document)) {\n warnings.push(buildWarning(\"hierarchy-weak\", \"Typography hierarchy is missing from the governance model.\", { auditId: \"CANVAS-02\" }));\n }\n if (!hasTypographyFontPolicy(typographySystem)) {\n warnings.push(buildWarning(\"font-policy-missing\", \"Typography font policy is missing from the governance model.\", { auditId: \"CANVAS-02\" }));\n }\n if (!hasReducedMotionPolicy(document)) {\n warnings.push(buildWarning(\"missing-reduced-motion-policy\", \"Reduced-motion policy is missing from the governance model.\", { auditId: \"CANVAS-02\" }));\n }\n if (!hasRequiredStateCoverage(document)) {\n warnings.push(buildWarning(\"missing-state-coverage\", \"Variant state coverage is incomplete for the required viewport/theme/content model.\", { auditId: \"CANVAS-02\" }));\n }\n if (!hasResponsiveViewportCoverage(document)) {\n warnings.push(buildWarning(\"responsive-mismatch\", \"Viewport coverage is incomplete for desktop, tablet, and mobile previews.\", { auditId: \"CANVAS-02\" }));\n }\n if (hasDisallowedLibrary(document)) {\n warnings.push(buildWarning(\"library-policy-violation\", \"Library policy references a non-approved canvas library.\", { auditId: \"CANVAS-04\", severity: \"error\" }));\n }\n if (hasIconPolicyViolation(document)) {\n warnings.push(buildWarning(\"icon-policy-violation\", \"Icon policy references a non-approved icon family.\", { auditId: \"CANVAS-04\", severity: \"error\" }));\n }\n if (hasUnresolvedComponentBindings(document)) {\n warnings.push(buildWarning(\"unresolved-component-binding\", \"One or more nodes reference bindings that are missing from the document.\", {\n auditId: \"CANVAS-02\",\n severity: \"error\"\n }));\n }\n if (hasMissingTokenRefs(document)) {\n warnings.push(buildWarning(\"token-missing\", \"One or more nodes reference missing tokens.\", {\n auditId: \"CANVAS-02\",\n severity: \"error\"\n }));\n }\n for (const asset of document.assets) {\n if (hasBrokenAssetReference(asset)) {\n warnings.push(buildWarning(\"broken-asset-reference\", `Asset ${asset.id} is missing the required repoPath or URL reference.`, {\n auditId: \"CANVAS-02\",\n severity: \"error\",\n details: { assetId: asset.id, sourceType: asset.sourceType ?? null }\n }));\n }\n if (assetRequiresProvenance(asset) && !isNonEmptyRecord(asset.metadata?.provenance)) {\n warnings.push(buildWarning(\"asset-provenance-missing\", `Asset ${asset.id} is missing provenance metadata.`, {\n auditId: \"CANVAS-02\",\n details: { assetId: asset.id, sourceType: asset.sourceType ?? null }\n }));\n }\n }\n if (options.degradeReason) {\n warnings.push(buildWarning(\"runtime-budget-exceeded\", \"Canvas preview exceeded the configured live-preview budget.\", {\n auditId: \"CANVAS-06\",\n details: { degradeReason: options.degradeReason }\n }));\n }\n if (options.unsupportedTarget) {\n warnings.push(buildWarning(\"unsupported-target\", `Canvas preview target is unavailable: ${options.unsupportedTarget}.`, {\n auditId: \"CANVAS-05\",\n severity: \"error\",\n details: { targetId: options.unsupportedTarget }\n }));\n }\n if (options.forSave) {\n for (const key of missingRequiredSaveBlocks(document)) {\n warnings.push(buildWarning(warningCodeForGovernanceBlock(key), `Required save governance block ${key} is missing.`, {\n auditId: \"CANVAS-02\",\n details: { block: key },\n severity: \"error\"\n }));\n }\n }\n return dedupeWarnings(warnings);\n}\n\nexport function missingRequiredSaveBlocks(document: CanvasDocument): CanvasGovernanceBlockKey[] {\n const states = buildGovernanceBlockStates(document);\n return REQUIRED_BEFORE_SAVE_KEYS.filter((key) => states[key].status === \"missing\");\n}\n\nexport function validateCanvasSave(document: CanvasDocument): {\n missingBlocks: CanvasGovernanceBlockKey[];\n warnings: CanvasValidationWarning[];\n} {\n const missingBlocks = missingRequiredSaveBlocks(document);\n return {\n missingBlocks,\n warnings: evaluateCanvasWarnings(document, { forSave: true })\n };\n}\n\nfunction dedupeWarnings(warnings: CanvasValidationWarning[]): CanvasValidationWarning[] {\n const seen = new Set<string>();\n const deduped: CanvasValidationWarning[] = [];\n for (const warning of warnings) {\n const key = stableStringify([warning.code, warning.message, warning.details ?? null]);\n if (seen.has(key)) continue;\n seen.add(key);\n deduped.push(warning);\n }\n return deduped;\n}\n\nfunction hasRequiredStateCoverage(document: CanvasDocument): boolean {\n const viewportIds = new Set(document.viewports.map((viewport) => typeof viewport.id === \"string\" ? viewport.id : \"\"));\n const themeIds = new Set(document.themes.map((theme) => typeof theme.id === \"string\" ? theme.id : \"\"));\n const contentModel = getGovernanceBlock(document, \"contentModel\");\n const requiredContentStates = new Set(readStringArray(contentModel, \"requiredStates\"));\n return viewportIds.has(\"desktop\")\n && viewportIds.has(\"tablet\")\n && viewportIds.has(\"mobile\")\n && themeIds.has(\"light\")\n && requiredContentStates.has(\"default\")\n && requiredContentStates.has(\"loading\")\n && requiredContentStates.has(\"empty\")\n && requiredContentStates.has(\"error\");\n}\n\nfunction hasReducedMotionPolicy(document: CanvasDocument): boolean {\n const motionSystem = getGovernanceBlock(document, \"motionSystem\");\n const accessibilityPolicy = getGovernanceBlock(document, \"accessibilityPolicy\");\n return Boolean(readString(motionSystem, \"reducedMotion\") ?? readString(accessibilityPolicy, \"reducedMotion\"));\n}\n\nfunction hasDisallowedLibrary(document: CanvasDocument): boolean {\n const policy = resolveCanvasLibraryPolicy(document);\n return (Object.entries(policy) as Array<[keyof CanvasLibraryPolicy, string[]]>)\n .some(([category, entries]) => entries.some((entry) => !APPROVED_LIBRARY_ENTRIES[category].has(entry)));\n}\n\nfunction hasIconPolicyViolation(document: CanvasDocument): boolean {\n const iconRoles = readCanvasIconRoles(document);\n return Object.values(iconRoles)\n .filter((entry): entry is string => Boolean(entry))\n .some((entry) => !APPROVED_LIBRARY_ENTRIES.icons.has(entry));\n}\n\nfunction assetRequiresProvenance(asset: CanvasDocument[\"assets\"][number]): boolean {\n return asset.sourceType === \"remote\" || asset.sourceType === \"generated\" || asset.sourceType === \"page-derived\";\n}\n\nfunction getGovernanceBlock(document: CanvasDocument, key: CanvasGovernanceBlockKey): Record<string, unknown> {\n const block = document.designGovernance[key];\n return isRecord(block) ? block : {};\n}\n\nfunction readString(record: Record<string, unknown>, key: string): string | null {\n const value = record[key];\n return typeof value === \"string\" && value.trim().length > 0 ? value : null;\n}\n\nfunction readStringArray(record: Record<string, unknown>, key: string): string[] {\n const value = record[key];\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0) : [];\n}\n\nfunction warningCodeForGovernanceBlock(key: CanvasGovernanceBlockKey): CanvasValidationWarning[\"code\"] {\n switch (key) {\n case \"generationPlan\":\n return \"missing-generation-plan\";\n case \"intent\":\n return \"missing-intent\";\n case \"designLanguage\":\n return \"missing-design-language\";\n case \"contentModel\":\n return \"missing-content-model\";\n case \"typographySystem\":\n return \"missing-typography-system\";\n case \"responsiveSystem\":\n return \"missing-responsive-policy\";\n default:\n return \"missing-governance-block\";\n }\n}\n\nfunction hasTypographyHierarchy(document: CanvasDocument): boolean {\n const typographySystem = getGovernanceBlock(document, \"typographySystem\");\n return isNonEmptyRecord(getNestedRecord(typographySystem, \"hierarchy\"));\n}\n\nfunction hasTypographyFontPolicy(typographySystem: Record<string, unknown>): boolean {\n return isNonEmptyRecord(getNestedRecord(typographySystem, \"fontPolicy\"))\n || readString(typographySystem, \"fontPolicy\") !== null;\n}\n\nfunction getNestedRecord(record: Record<string, unknown>, key: string): Record<string, unknown> {\n const value = record[key];\n return isRecord(value) ? value : {};\n}\n\nfunction hasResponsiveViewportCoverage(document: CanvasDocument): boolean {\n const viewportIds = new Set(document.viewports.map((viewport) => typeof viewport.id === \"string\" ? viewport.id : \"\"));\n return viewportIds.has(\"desktop\") && viewportIds.has(\"tablet\") && viewportIds.has(\"mobile\");\n}\n\nfunction hasUnresolvedComponentBindings(document: CanvasDocument): boolean {\n const bindingIds = new Set(document.bindings.map((binding) => binding.id));\n for (const page of document.pages) {\n for (const node of page.nodes) {\n const primaryBinding = typeof node.bindingRefs.primary === \"string\" ? node.bindingRefs.primary : null;\n if (primaryBinding && !bindingIds.has(primaryBinding)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction hasMissingTokenRefs(document: CanvasDocument): boolean {\n for (const page of document.pages) {\n for (const node of page.nodes) {\n for (const value of Object.values(node.tokenRefs)) {\n if (typeof value === \"string\" && getTokenValue(document.tokens, value) === undefined) {\n return true;\n }\n }\n }\n }\n return false;\n}\n\nfunction getTokenValue(tokens: Record<string, unknown>, path: string): unknown {\n const segments = path.split(\".\");\n let current: unknown = tokens;\n for (const segment of segments) {\n if (!isRecord(current) || !(segment in current)) {\n return undefined;\n }\n current = current[segment];\n }\n return current;\n}\n\nfunction hasBrokenAssetReference(asset: CanvasDocument[\"assets\"][number]): boolean {\n if (asset.sourceType === \"repo\") {\n return typeof asset.repoPath !== \"string\" || asset.repoPath.trim().length === 0;\n }\n if (asset.sourceType === \"remote\" || asset.sourceType === \"page-derived\") {\n return typeof asset.url !== \"string\" || asset.url.trim().length === 0;\n }\n return false;\n}\n\nfunction validatePath(path: string): string[] {\n const segments = path.split(\".\");\n if (segments.length === 0 || segments.some((segment) => !/^[A-Za-z][A-Za-z0-9_]*$/.test(segment))) {\n throw new Error(`Invalid path: ${path}`);\n }\n return segments;\n}\n\nfunction assertNoOverlappingPaths(changes: Record<string, unknown>): void {\n const paths = Object.keys(changes);\n for (const path of paths) {\n validatePath(path);\n }\n for (const [index, left] of paths.entries()) {\n for (const right of paths.slice(index + 1)) {\n if (left === right || left.startsWith(`${right}.`) || right.startsWith(`${left}.`)) {\n throw new Error(`Overlapping change paths: ${left} vs ${right}`);\n }\n }\n }\n}\n\nfunction setNestedValue(target: Record<string, unknown>, path: string, value: unknown): void {\n const segments = validatePath(path);\n const [leaf, ...parents] = segments.slice().reverse();\n let current: Record<string, unknown> = target;\n for (const segment of parents.reverse()) {\n const existing = current[segment];\n if (!isRecord(existing)) {\n current[segment] = {};\n }\n current = current[segment] as Record<string, unknown>;\n }\n current[leaf as string] = clone(value);\n}\n\nfunction ensureAllowedRoots(changes: Record<string, unknown>, allowedRoots: string[]): void {\n for (const key of Object.keys(changes)) {\n if (!allowedRoots.some((root) => key === root || key.startsWith(`${root}.`))) {\n throw new Error(`Policy violation for change root: ${key}`);\n }\n }\n}\n\nfunction upsertVariantPatch(list: CanvasVariantPatch[], selector: CanvasVariantSelector, changes: Record<string, unknown>): CanvasVariantPatch[] {\n const key = stableStringify(selector);\n const next = list.map((entry) => clone(entry));\n const existing = next.find((entry) => stableStringify(entry.selector) === key);\n if (existing) {\n assertNoOverlappingPaths(changes);\n for (const [path, value] of Object.entries(changes)) {\n setNestedValue(existing.changes, path, value);\n }\n return next;\n }\n return [...next, { selector: clone(selector), changes: clone(changes) }];\n}\n\ntype PatchResult = {\n transactionId: string;\n appliedRevision: number;\n warnings: CanvasValidationWarning[];\n evidenceRefs: string[];\n};\n\nexport type CanvasDocumentStoreUpdate = {\n documentId: string;\n revision: number;\n encodedState: string;\n origin: unknown;\n};\n\ntype CanvasDocumentStoreListener = (update: CanvasDocumentStoreUpdate) => void;\n\nconst Y_ROOT_KEYS = [\n \"schemaVersion\",\n \"documentId\",\n \"title\",\n \"createdAt\",\n \"updatedAt\",\n \"designGovernance\",\n \"pages\",\n \"components\",\n \"componentInventory\",\n \"tokens\",\n \"assets\",\n \"viewports\",\n \"themes\",\n \"bindings\",\n \"prototypes\",\n \"meta\",\n \"revision\"\n] as const;\n\ntype YRootKey = typeof Y_ROOT_KEYS[number];\n\nfunction clearYMap(map: Y.Map<unknown>): void {\n if (!map.doc) {\n return;\n }\n for (const key of Array.from(map.keys())) {\n map.delete(key);\n }\n}\n\nfunction clearYArray(array: Y.Array<unknown>): void {\n if (!array.doc) {\n return;\n }\n if (array.length > 0) {\n array.delete(0, array.length);\n }\n}\n\nfunction toYValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n const array = new Y.Array<unknown>();\n array.insert(0, value.map((entry) => toYValue(entry)));\n return array;\n }\n if (isRecord(value)) {\n const map = new Y.Map<unknown>();\n for (const [key, entry] of Object.entries(value)) {\n map.set(key, toYValue(entry));\n }\n return map;\n }\n return value ?? null;\n}\n\nfunction fromYValue(value: unknown): unknown {\n if (value instanceof Y.Map) {\n const record: Record<string, unknown> = {};\n for (const [key, entry] of value.entries()) {\n record[key] = fromYValue(entry);\n }\n return record;\n }\n if (value instanceof Y.Array) {\n return value.toArray().map((entry) => fromYValue(entry));\n }\n return value ?? null;\n}\n\nfunction setYMapContents(target: Y.Map<unknown>, value: Record<string, unknown>): void {\n clearYMap(target);\n for (const [key, entry] of Object.entries(value)) {\n target.set(key, toYValue(entry));\n }\n}\n\nfunction setYArrayContents(target: Y.Array<unknown>, value: unknown[]): void {\n clearYArray(target);\n if (value.length > 0) {\n target.insert(0, value.map((entry) => toYValue(entry)));\n }\n}\n\nfunction projectRootValue(root: Y.Map<unknown>, key: YRootKey): unknown {\n return fromYValue(root.get(key));\n}\n\nfunction encodeYState(ydoc: Y.Doc): string {\n return Buffer.from(Y.encodeStateAsUpdate(ydoc)).toString(\"base64\");\n}\n\nexport class CanvasDocumentStore {\n private readonly ydoc = new Y.Doc();\n private readonly root = this.ydoc.getMap<unknown>(\"canvas\");\n private readonly listeners = new Set<CanvasDocumentStoreListener>();\n private document: CanvasDocument;\n private revision = 1;\n\n constructor(document?: CanvasDocument) {\n this.document = normalizeCanvasDocument(document ?? createDefaultCanvasDocument());\n this.ydoc.on(\"update\", this.handleYUpdate);\n this.replaceDocument(this.document, 1, \"canvas.store.init\");\n }\n\n observe(listener: CanvasDocumentStoreListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n getDocument(): CanvasDocument {\n return clone(this.document);\n }\n\n getDocumentId(): string {\n return this.document.documentId;\n }\n\n getRevision(): number {\n return this.revision;\n }\n\n getEncodedState(): string {\n return encodeYState(this.ydoc);\n }\n\n applyEncodedState(encodedState: string): void {\n const update = Buffer.from(encodedState, \"base64\");\n const snapshot = new Y.Doc();\n Y.applyUpdate(snapshot, update, \"canvas.store.remote-update\");\n const root = snapshot.getMap<unknown>(\"canvas\");\n const revision = typeof root.get(\"revision\") === \"number\" ? root.get(\"revision\") as number : this.revision;\n const document = normalizeCanvasDocument({\n schemaVersion: projectRootValue(root, \"schemaVersion\"),\n documentId: projectRootValue(root, \"documentId\"),\n title: projectRootValue(root, \"title\"),\n createdAt: projectRootValue(root, \"createdAt\"),\n updatedAt: projectRootValue(root, \"updatedAt\"),\n designGovernance: projectRootValue(root, \"designGovernance\"),\n pages: projectRootValue(root, \"pages\"),\n components: projectRootValue(root, \"components\"),\n componentInventory: projectRootValue(root, \"componentInventory\"),\n tokens: projectRootValue(root, \"tokens\"),\n assets: projectRootValue(root, \"assets\"),\n viewports: projectRootValue(root, \"viewports\"),\n themes: projectRootValue(root, \"themes\"),\n bindings: projectRootValue(root, \"bindings\"),\n prototypes: projectRootValue(root, \"prototypes\"),\n meta: projectRootValue(root, \"meta\")\n } as CanvasDocument);\n this.replaceDocument(document, revision, \"canvas.store.remote-update\");\n }\n\n setGenerationPlan(plan: CanvasGenerationPlan): { planStatus: \"accepted\"; documentRevision: number; warnings: CanvasValidationWarning[] } {\n const validation = validateGenerationPlan(plan);\n if (!validation.ok) {\n throw new Error(`Generation plan missing fields: ${validation.missing.join(\", \")}`);\n }\n const nextDocument = normalizeCanvasDocument(this.document);\n nextDocument.designGovernance.generationPlan = clone(plan);\n this.replaceDocument(nextDocument, this.revision + 1, \"canvas.store.set-generation-plan\");\n return {\n planStatus: \"accepted\",\n documentRevision: this.revision,\n warnings: evaluateCanvasWarnings(this.document)\n };\n }\n\n applyPatches(baseRevision: number, patches: CanvasPatch[]): PatchResult {\n if (baseRevision !== this.revision) {\n throw new Error(`Revision conflict: expected ${this.revision}, got ${baseRevision}`);\n }\n const nextDocument = normalizeCanvasDocument(this.document);\n for (const patch of patches) {\n this.applyPatch(nextDocument, patch);\n }\n this.replaceDocument(nextDocument, this.revision + 1, \"canvas.store.apply-patches\");\n return {\n transactionId: `txn_${randomUUID()}`,\n appliedRevision: this.revision,\n warnings: evaluateCanvasWarnings(this.document),\n evidenceRefs: []\n };\n }\n\n loadDocument(document: CanvasDocument): void {\n this.replaceDocument(normalizeCanvasDocument(document), 1, \"canvas.store.load-document\");\n }\n\n private readonly handleYUpdate = (_update: Uint8Array, origin: unknown): void => {\n this.refreshProjectionFromY();\n const detail: CanvasDocumentStoreUpdate = {\n documentId: this.document.documentId,\n revision: this.revision,\n encodedState: encodeYState(this.ydoc),\n origin\n };\n for (const listener of this.listeners) {\n listener(detail);\n }\n };\n\n private refreshProjectionFromY(): void {\n const projected = normalizeCanvasDocument({\n schemaVersion: projectRootValue(this.root, \"schemaVersion\"),\n documentId: projectRootValue(this.root, \"documentId\"),\n title: projectRootValue(this.root, \"title\"),\n createdAt: projectRootValue(this.root, \"createdAt\"),\n updatedAt: projectRootValue(this.root, \"updatedAt\"),\n designGovernance: projectRootValue(this.root, \"designGovernance\"),\n pages: projectRootValue(this.root, \"pages\"),\n components: projectRootValue(this.root, \"components\"),\n componentInventory: projectRootValue(this.root, \"componentInventory\"),\n tokens: projectRootValue(this.root, \"tokens\"),\n assets: projectRootValue(this.root, \"assets\"),\n viewports: projectRootValue(this.root, \"viewports\"),\n themes: projectRootValue(this.root, \"themes\"),\n bindings: projectRootValue(this.root, \"bindings\"),\n prototypes: projectRootValue(this.root, \"prototypes\"),\n meta: projectRootValue(this.root, \"meta\")\n } as CanvasDocument);\n this.document = projected;\n this.revision = typeof this.root.get(\"revision\") === \"number\" ? this.root.get(\"revision\") as number : this.revision;\n }\n\n private replaceDocument(document: CanvasDocument, revision: number, origin: string): void {\n const nextDocument = normalizeCanvasDocument(document);\n nextDocument.updatedAt = nowIso();\n this.ydoc.transact(() => {\n clearYMap(this.root);\n this.root.set(\"schemaVersion\", nextDocument.schemaVersion);\n this.root.set(\"documentId\", nextDocument.documentId);\n this.root.set(\"title\", nextDocument.title);\n this.root.set(\"createdAt\", nextDocument.createdAt);\n this.root.set(\"updatedAt\", nextDocument.updatedAt);\n const governance = new Y.Map<unknown>();\n setYMapContents(governance, nextDocument.designGovernance);\n this.root.set(\"designGovernance\", governance);\n const pages = new Y.Array<unknown>();\n setYArrayContents(pages, nextDocument.pages);\n this.root.set(\"pages\", pages);\n const components = new Y.Array<unknown>();\n setYArrayContents(components, nextDocument.components);\n this.root.set(\"components\", components);\n const componentInventory = new Y.Array<unknown>();\n setYArrayContents(componentInventory, nextDocument.componentInventory);\n this.root.set(\"componentInventory\", componentInventory);\n const tokens = new Y.Map<unknown>();\n setYMapContents(tokens, nextDocument.tokens);\n this.root.set(\"tokens\", tokens);\n const assets = new Y.Array<unknown>();\n setYArrayContents(assets, nextDocument.assets);\n this.root.set(\"assets\", assets);\n const viewports = new Y.Array<unknown>();\n setYArrayContents(viewports, nextDocument.viewports);\n this.root.set(\"viewports\", viewports);\n const themes = new Y.Array<unknown>();\n setYArrayContents(themes, nextDocument.themes);\n this.root.set(\"themes\", themes);\n const bindings = new Y.Array<unknown>();\n setYArrayContents(bindings, nextDocument.bindings);\n this.root.set(\"bindings\", bindings);\n const prototypes = new Y.Array<unknown>();\n setYArrayContents(prototypes, nextDocument.prototypes);\n this.root.set(\"prototypes\", prototypes);\n const meta = new Y.Map<unknown>();\n setYMapContents(meta, nextDocument.meta);\n this.root.set(\"meta\", meta);\n this.root.set(\"revision\", revision);\n }, origin);\n this.document = nextDocument;\n this.revision = revision;\n }\n\n private applyPatch(document: CanvasDocument, patch: CanvasPatch): void {\n switch (patch.op) {\n case \"page.create\": {\n if (document.pages.some((page) => page.id === patch.page.id)) {\n throw new Error(`Page already exists: ${patch.page.id}`);\n }\n document.pages.push({\n id: patch.page.id,\n name: patch.page.name ?? patch.page.id,\n description: patch.page.description,\n path: patch.page.path ?? \"/\",\n rootNodeId: patch.page.rootNodeId,\n prototypeIds: Array.isArray(patch.page.prototypeIds) ? [...patch.page.prototypeIds] : [],\n nodes: Array.isArray(patch.page.nodes) ? clone(patch.page.nodes) : [],\n metadata: isRecord(patch.page.metadata) ? clone(patch.page.metadata) : {}\n });\n return;\n }\n case \"page.update\": {\n const page = document.pages.find((entry) => entry.id === patch.pageId);\n if (!page) throw new Error(`Unknown page: ${patch.pageId}`);\n assertNoOverlappingPaths(patch.changes);\n ensureAllowedRoots(patch.changes, [\"name\", \"description\", \"rootNodeId\", \"prototypeIds\", \"metadata\"]);\n for (const [path, value] of Object.entries(patch.changes)) {\n setNestedValue(page as unknown as Record<string, unknown>, path, value);\n }\n return;\n }\n case \"node.insert\": {\n const page = document.pages.find((entry) => entry.id === patch.pageId);\n if (!page) throw new Error(`Unknown page: ${patch.pageId}`);\n if (page.nodes.some((entry) => entry.id === patch.node.id)) {\n throw new Error(`Node already exists: ${patch.node.id}`);\n }\n const node: CanvasNode = {\n id: patch.node.id,\n kind: patch.node.kind,\n name: patch.node.name ?? patch.node.id,\n pageId: patch.pageId,\n parentId: patch.parentId,\n childIds: Array.isArray(patch.node.childIds) ? [...patch.node.childIds] : [],\n rect: patch.node.rect ?? { x: 0, y: 0, width: 320, height: 180 },\n props: isRecord(patch.node.props) ? clone(patch.node.props) : {},\n style: isRecord(patch.node.style) ? clone(patch.node.style) : {},\n tokenRefs: isRecord(patch.node.tokenRefs) ? clone(patch.node.tokenRefs) : {},\n bindingRefs: isRecord(patch.node.bindingRefs) ? clone(patch.node.bindingRefs) : {},\n variantPatches: Array.isArray(patch.node.variantPatches) ? clone(patch.node.variantPatches) : [],\n metadata: isRecord(patch.node.metadata) ? clone(patch.node.metadata) : {}\n };\n page.nodes.push(node);\n if (patch.parentId) {\n const parent = page.nodes.find((entry) => entry.id === patch.parentId);\n if (!parent) throw new Error(`Unknown parent node: ${patch.parentId}`);\n parent.childIds.push(node.id);\n } else {\n page.rootNodeId = node.id;\n }\n return;\n }\n case \"node.update\": {\n const node = findNode(document, patch.nodeId);\n assertNoOverlappingPaths(patch.changes);\n ensureAllowedRoots(patch.changes, [\"name\", \"rect\", \"props\", \"style\", \"tokenRefs\", \"bindingRefs\", \"metadata\"]);\n for (const [path, value] of Object.entries(patch.changes)) {\n setNestedValue(node as unknown as Record<string, unknown>, path, value);\n }\n return;\n }\n case \"node.remove\": {\n const removedNodeIds = removeNode(document, patch.nodeId);\n const removedSet = new Set(removedNodeIds);\n document.bindings = document.bindings.filter((binding) => !removedSet.has(binding.nodeId));\n return;\n }\n case \"variant.patch\": {\n const node = findNode(document, patch.nodeId);\n assertNoOverlappingPaths(patch.changes);\n ensureAllowedRoots(patch.changes, [\"props\", \"style\", \"tokenRefs\", \"bindingRefs\", \"metadata\"]);\n node.variantPatches = upsertVariantPatch(node.variantPatches, patch.selector, patch.changes);\n return;\n }\n case \"token.set\": {\n const segments = validatePath(patch.path);\n if (![\"colorSystem\", \"typographySystem\", \"layoutSystem\", \"surfaceSystem\", \"motionSystem\", \"iconSystem\"].includes(segments[0] as string)) {\n throw new Error(`Policy violation for token path: ${patch.path}`);\n }\n setNestedValue(document.designGovernance as unknown as Record<string, unknown>, patch.path, patch.value);\n return;\n }\n case \"governance.update\": {\n const block = document.designGovernance[patch.block];\n assertNoOverlappingPaths(patch.changes);\n for (const [path, value] of Object.entries(patch.changes)) {\n setNestedValue(block, path, value);\n }\n return;\n }\n case \"asset.attach\": {\n const node = findNode(document, patch.nodeId);\n const assetIds = Array.isArray(node.metadata.assetIds) ? [...node.metadata.assetIds as string[]] : [];\n if (!assetIds.includes(patch.assetId)) {\n assetIds.push(patch.assetId);\n }\n node.metadata.assetIds = assetIds;\n if (!document.assets.some((asset) => asset.id === patch.assetId)) {\n document.assets.push({\n id: patch.assetId,\n sourceType: \"transient\",\n status: \"attached\",\n variants: [],\n metadata: {}\n });\n }\n return;\n }\n case \"binding.set\": {\n findNode(document, patch.nodeId);\n const binding = normalizeBinding({\n id: patch.binding.id,\n nodeId: patch.nodeId,\n kind: patch.binding.kind,\n selector: patch.binding.selector,\n componentName: patch.binding.componentName,\n metadata: isRecord(patch.binding.metadata) ? clone(patch.binding.metadata) : {},\n codeSync: patch.binding.codeSync\n });\n const existing = document.bindings.findIndex((entry) => entry.id === binding.id);\n if (existing >= 0) {\n document.bindings[existing] = binding;\n } else {\n document.bindings.push(binding);\n }\n const node = findNode(document, patch.nodeId);\n node.bindingRefs.primary = binding.id;\n return;\n }\n case \"binding.remove\": {\n const existing = document.bindings.find((entry) => entry.id === patch.bindingId);\n if (!existing) {\n return;\n }\n document.bindings = document.bindings.filter((entry) => entry.id !== patch.bindingId);\n const node = findNode(document, existing.nodeId);\n if (node.bindingRefs.primary === patch.bindingId) {\n delete node.bindingRefs.primary;\n }\n return;\n }\n case \"prototype.upsert\": {\n const prototype = clone(patch.prototype);\n const existing = document.prototypes.findIndex((entry) => entry.id === prototype.id);\n if (existing >= 0) {\n document.prototypes[existing] = prototype;\n } else {\n document.prototypes.push(prototype);\n }\n }\n }\n }\n}\n\nfunction findNode(document: CanvasDocument, nodeId: string): CanvasNode {\n for (const page of document.pages) {\n const match = page.nodes.find((node) => node.id === nodeId);\n if (match) {\n return match;\n }\n }\n throw new Error(`Unknown node: ${nodeId}`);\n}\n\nfunction removeNode(document: CanvasDocument, nodeId: string): string[] {\n for (const page of document.pages) {\n const node = page.nodes.find((entry) => entry.id === nodeId);\n if (!node) continue;\n const removedNodeIds = [nodeId];\n for (const childId of [...node.childIds]) {\n removedNodeIds.push(...removeNode(document, childId));\n }\n page.nodes = page.nodes.filter((entry) => entry.id !== nodeId);\n for (const parent of page.nodes) {\n parent.childIds = parent.childIds.filter((childId) => childId !== nodeId);\n }\n if (page.rootNodeId === nodeId) {\n page.rootNodeId = null;\n }\n return removedNodeIds;\n }\n throw new Error(`Unknown node: ${nodeId}`);\n}\n\nexport const CANVAS_PROJECT_DEFAULTS = {\n libraryPolicy: PROJECT_DEFAULT_LIBRARY_POLICY,\n runtimeBudgets: PROJECT_DEFAULT_RUNTIME_BUDGETS\n};\n","import type {\n CanvasCodeSyncBindingMetadata,\n CanvasParityArtifact,\n CodeSyncAttachMode,\n CodeSyncBindingStatus,\n CodeSyncLeaseRole,\n CodeSyncProjectionMode,\n CodeSyncSessionStatus,\n CodeSyncState\n} from \"./code-sync/types\";\nexport type { CanvasParityArtifact } from \"./code-sync/types\";\n\nexport const CANVAS_SCHEMA_VERSION = \"1.0.0\";\n\nexport type CanvasPreflightState =\n | \"opened\"\n | \"handshake_read\"\n | \"plan_submitted\"\n | \"plan_accepted\"\n | \"patching_enabled\";\n\nexport type CanvasPlanStatus = \"missing\" | \"submitted\" | \"accepted\";\n\nexport type CanvasSessionMode = \"low-fi-wireframe\" | \"high-fi-live-edit\" | \"dual-track\";\n\nexport type CanvasGovernanceBlockKey =\n | \"intent\"\n | \"generationPlan\"\n | \"designLanguage\"\n | \"contentModel\"\n | \"layoutSystem\"\n | \"typographySystem\"\n | \"colorSystem\"\n | \"surfaceSystem\"\n | \"iconSystem\"\n | \"motionSystem\"\n | \"responsiveSystem\"\n | \"accessibilityPolicy\"\n | \"libraryPolicy\"\n | \"runtimeBudgets\";\n\nexport type CanvasVariantSelector = Partial<Record<\"viewport\" | \"theme\" | \"interaction\" | \"content\", string>>;\n\nexport type CanvasLibraryPolicy = {\n icons: string[];\n components: string[];\n styling: string[];\n motion: string[];\n threeD: string[];\n};\n\nexport type CanvasIconRoles = {\n primary: string | null;\n secondary: string | null;\n secondaryAlt: string | null;\n decorative: string | null;\n};\n\nexport type CanvasNodeKind =\n | \"frame\"\n | \"group\"\n | \"text\"\n | \"shape\"\n | \"note\"\n | \"connector\"\n | \"wire-block\"\n | \"component-instance\"\n | \"dom-binding\";\n\nexport type CanvasFeedbackCategory =\n | \"render\"\n | \"console\"\n | \"network\"\n | \"validation\"\n | \"performance\"\n | \"asset\"\n | \"export\"\n | \"code-sync\"\n | \"parity\";\n\nexport type CanvasFeedbackSeverity = \"info\" | \"warning\" | \"error\";\n\nexport type CanvasValidationWarningCode =\n | \"missing-generation-plan\"\n | \"missing-governance-block\"\n | \"missing-intent\"\n | \"missing-design-language\"\n | \"missing-content-model\"\n | \"missing-typography-system\"\n | \"missing-color-role\"\n | \"missing-surface-policy\"\n | \"missing-state-coverage\"\n | \"missing-reduced-motion-policy\"\n | \"missing-responsive-policy\"\n | \"overflow\"\n | \"token-missing\"\n | \"broken-asset-reference\"\n | \"contrast-failure\"\n | \"hierarchy-weak\"\n | \"asset-provenance-missing\"\n | \"font-policy-missing\"\n | \"font-load-failure\"\n | \"reduced-motion-violation\"\n | \"unresolved-component-binding\"\n | \"icon-policy-violation\"\n | \"library-policy-violation\"\n | \"responsive-mismatch\"\n | \"runtime-budget-exceeded\"\n | \"unsupported-target\"\n | \"export-warning\";\n\nexport type CanvasPreviewState = \"focused\" | \"pinned\" | \"background\" | \"degraded\";\n\nexport type CanvasDegradeReason = \"overflow\" | \"memory_pressure\" | \"queue_pressure\" | \"frozen\" | \"discarded\";\n\nexport type CanvasBlockerCode =\n | \"plan_required\"\n | \"revision_conflict\"\n | \"unsupported_target\"\n | \"lease_reclaim_required\"\n | \"policy_violation\"\n | \"code_sync_required\"\n | \"code_sync_conflict\"\n | \"code_sync_unsupported\"\n | \"code_sync_out_of_date\";\n\nexport type CanvasBindingKind = string;\n\nexport type CanvasBlockState = \"present\" | \"missing\" | \"inherited\" | \"locked\";\n\nexport type CanvasGovernanceBlockState = {\n status: CanvasBlockState;\n source: \"document\" | \"project-default\";\n editable: boolean;\n};\n\nexport type CanvasRect = {\n x: number;\n y: number;\n width: number;\n height: number;\n};\n\nexport type CanvasVariantPatch = {\n selector: CanvasVariantSelector;\n changes: Record<string, unknown>;\n};\n\nexport type CanvasBinding = {\n id: string;\n nodeId: string;\n kind: CanvasBindingKind;\n selector?: string;\n componentName?: string;\n metadata?: Record<string, unknown>;\n codeSync?: CanvasCodeSyncBindingMetadata;\n};\n\nexport type CanvasAsset = {\n id: string;\n sourceType?: \"repo\" | \"remote\" | \"page-derived\" | \"generated\" | \"transient\";\n kind?: string;\n repoPath?: string | null;\n url?: string | null;\n mime?: string;\n width?: number;\n height?: number;\n hash?: string;\n status?: string;\n variants?: Array<Record<string, unknown>>;\n metadata?: Record<string, unknown>;\n};\n\nexport type CanvasNode = {\n id: string;\n kind: CanvasNodeKind;\n name: string;\n pageId: string;\n parentId: string | null;\n childIds: string[];\n rect: CanvasRect;\n props: Record<string, unknown>;\n style: Record<string, unknown>;\n tokenRefs: Record<string, unknown>;\n bindingRefs: Record<string, unknown>;\n variantPatches: CanvasVariantPatch[];\n metadata: Record<string, unknown>;\n};\n\nexport type CanvasPage = {\n id: string;\n name: string;\n description?: string;\n path: string;\n rootNodeId: string | null;\n prototypeIds: string[];\n nodes: CanvasNode[];\n metadata: Record<string, unknown>;\n};\n\nexport type CanvasPrototype = {\n id: string;\n pageId: string;\n route: string;\n name?: string;\n defaultVariants?: CanvasVariantSelector;\n targetPreferences?: Record<string, unknown>;\n metadata?: Record<string, unknown>;\n};\n\nexport type CanvasDocument = {\n schemaVersion: string;\n documentId: string;\n title: string;\n createdAt: string;\n updatedAt: string;\n designGovernance: Record<CanvasGovernanceBlockKey, Record<string, unknown>>;\n pages: CanvasPage[];\n components: Array<Record<string, unknown>>;\n componentInventory: Array<Record<string, unknown>>;\n tokens: Record<string, unknown>;\n assets: CanvasAsset[];\n viewports: Array<Record<string, unknown>>;\n themes: Array<Record<string, unknown>>;\n bindings: CanvasBinding[];\n prototypes: CanvasPrototype[];\n meta: Record<string, unknown>;\n};\n\nexport type CanvasGenerationPlan = Record<string, unknown>;\n\nexport type CanvasPatch =\n | {\n op: \"page.create\";\n page: Partial<CanvasPage> & Pick<CanvasPage, \"id\" | \"rootNodeId\">;\n }\n | {\n op: \"page.update\";\n pageId: string;\n changes: Record<string, unknown>;\n }\n | {\n op: \"node.insert\";\n pageId: string;\n parentId: string | null;\n node: Partial<CanvasNode> & Pick<CanvasNode, \"id\" | \"kind\">;\n }\n | {\n op: \"node.update\";\n nodeId: string;\n changes: Record<string, unknown>;\n }\n | {\n op: \"node.remove\";\n nodeId: string;\n }\n | {\n op: \"variant.patch\";\n nodeId: string;\n selector: CanvasVariantSelector;\n changes: Record<string, unknown>;\n }\n | {\n op: \"token.set\";\n path: string;\n value: unknown;\n }\n | {\n op: \"governance.update\";\n block: CanvasGovernanceBlockKey;\n changes: Record<string, unknown>;\n }\n | {\n op: \"asset.attach\";\n nodeId: string;\n assetId: string;\n }\n | {\n op: \"binding.set\";\n nodeId: string;\n binding: Omit<CanvasBinding, \"nodeId\"> & Partial<Pick<CanvasBinding, \"nodeId\">>;\n }\n | {\n op: \"binding.remove\";\n bindingId: string;\n }\n | {\n op: \"prototype.upsert\";\n prototype: CanvasPrototype;\n };\n\nexport type CanvasFeedbackItem = {\n id: string;\n cursor: string;\n severity: CanvasFeedbackSeverity;\n category: CanvasFeedbackCategory;\n class: string;\n documentId: string;\n pageId: string | null;\n prototypeId: string | null;\n targetId: string | null;\n documentRevision: number;\n message: string;\n evidenceRefs: string[];\n details: Record<string, unknown>;\n};\n\nexport type CanvasValidationWarning = {\n code: CanvasValidationWarningCode;\n severity: CanvasFeedbackSeverity;\n message: string;\n details?: Record<string, unknown>;\n auditId?: string;\n};\n\nexport type CanvasBlocker = {\n code: CanvasBlockerCode;\n blockingCommand: string;\n requiredNextCommands: string[];\n latestRevision?: number;\n message: string;\n details?: Record<string, unknown>;\n};\n\nexport type CanvasTargetState = {\n targetId: string;\n prototypeId: string | null;\n previewMode: CanvasPreviewState;\n previewState: CanvasPreviewState;\n renderStatus: \"idle\" | \"rendered\" | \"degraded\";\n degradeReason?: CanvasDegradeReason;\n lastRenderedAt?: string;\n sourceUrl?: string | null;\n projection?: CodeSyncProjectionMode;\n fallbackReason?: string | null;\n parityArtifact?: CanvasParityArtifact | null;\n};\n\nexport type CanvasAttachedClient = {\n clientId: string;\n role: CodeSyncLeaseRole;\n attachedAt: string;\n lastSeenAt: string;\n};\n\nexport type CanvasSessionSummary = {\n canvasSessionId: string;\n browserSessionId: string | null;\n documentId: string;\n leaseId: string;\n attachModes?: CodeSyncAttachMode[];\n preflightState: CanvasPreflightState;\n planStatus: CanvasPlanStatus;\n mode: CanvasSessionMode;\n documentRevision: number;\n libraryPolicy: CanvasLibraryPolicy;\n componentInventoryCount: number;\n componentSourceKinds: string[];\n iconRoles: CanvasIconRoles;\n targets: CanvasTargetState[];\n overlayMounts: Array<{ mountId: string; targetId: string; mountedAt: string }>;\n designTabTargetId?: string | null;\n attachedClients?: CanvasAttachedClient[];\n leaseHolderClientId?: string | null;\n watchState?: CodeSyncSessionStatus[\"watchState\"];\n codeSyncState?: CodeSyncState;\n boundFiles?: string[];\n conflictCount?: number;\n driftState?: CodeSyncSessionStatus[\"driftState\"];\n lastImportAt?: string;\n lastPushAt?: string;\n bindings?: CodeSyncBindingStatus[];\n};\n\nexport type CanvasCommandContext = {\n command: string;\n canvasSessionId?: string;\n leaseId?: string;\n};\n","export const CODE_SYNC_ADAPTERS = [\"tsx-react-v1\"] as const;\nexport const CODE_SYNC_SYNC_MODES = [\"manual\", \"watch\"] as const;\nexport const CODE_SYNC_PROJECTIONS = [\"canvas_html\", \"bound_app_runtime\"] as const;\nexport const CODE_SYNC_ATTACH_MODES = [\"observer\", \"lease_reclaim\"] as const;\nexport const CODE_SYNC_LEASE_ROLES = [\"lease_holder\", \"observer\"] as const;\nexport const CODE_SYNC_STATES = [\n \"idle\",\n \"session_join_pending\",\n \"pull_pending\",\n \"push_pending\",\n \"in_sync\",\n \"drift_detected\",\n \"conflict\",\n \"unsupported\",\n \"lease_lost\",\n \"projection_fallback\"\n] as const;\nexport const CODE_SYNC_OWNERSHIP_DIMENSIONS = [\n \"structure\",\n \"text\",\n \"style\",\n \"tokens\",\n \"behavior\",\n \"data\"\n] as const;\nexport const CODE_SYNC_OWNERSHIP_STATES = [\"shared\", \"canvas\", \"code\"] as const;\n\nexport type CodeSyncAdapter = typeof CODE_SYNC_ADAPTERS[number];\nexport type CodeSyncSyncMode = typeof CODE_SYNC_SYNC_MODES[number];\nexport type CodeSyncProjectionMode = typeof CODE_SYNC_PROJECTIONS[number];\nexport type CodeSyncAttachMode = typeof CODE_SYNC_ATTACH_MODES[number];\nexport type CodeSyncLeaseRole = typeof CODE_SYNC_LEASE_ROLES[number];\nexport type CodeSyncState = typeof CODE_SYNC_STATES[number];\nexport type CodeSyncOwnershipDimension = typeof CODE_SYNC_OWNERSHIP_DIMENSIONS[number];\nexport type CodeSyncOwnershipState = typeof CODE_SYNC_OWNERSHIP_STATES[number];\n\nexport type CodeSyncOwnership = Record<CodeSyncOwnershipDimension, CodeSyncOwnershipState>;\n\nexport type CanvasCodeSyncBindingMetadata = {\n adapter: CodeSyncAdapter;\n repoPath: string;\n exportName?: string;\n selector?: string;\n syncMode: CodeSyncSyncMode;\n ownership: CodeSyncOwnership;\n route?: string;\n verificationTarget?: string;\n runtimeRootSelector?: string;\n projection?: CodeSyncProjectionMode;\n};\n\nexport type CodeSyncSourcePosition = {\n offset: number;\n line: number;\n column: number;\n};\n\nexport type CodeSyncSourceSpan = {\n start: CodeSyncSourcePosition;\n end: CodeSyncSourcePosition;\n};\n\nexport type CodeSyncSourceLocator = {\n sourcePath: string;\n sourceSpan: CodeSyncSourceSpan;\n astPath: string;\n};\n\nexport type CodeSyncUnsupportedFragment = {\n key: string;\n reason: string;\n raw: string;\n locator?: CodeSyncSourceLocator;\n};\n\nexport type CodeSyncNodeKind = \"element\" | \"text\" | \"unsupported\";\n\nexport type CodeSyncNode = {\n key: string;\n kind: CodeSyncNodeKind;\n bindingId: string;\n locator: CodeSyncSourceLocator;\n tagName?: string;\n text?: string;\n attributes: Record<string, string>;\n style: Record<string, string | number>;\n preservedAttributes: string[];\n childKeys: string[];\n raw?: string;\n unsupportedReason?: string;\n};\n\nexport type CodeSyncGraph = {\n adapter: CodeSyncAdapter;\n bindingId: string;\n repoPath: string;\n rootKey: string;\n nodes: Record<string, CodeSyncNode>;\n sourceHash: string;\n unsupportedFragments: CodeSyncUnsupportedFragment[];\n};\n\nexport type CodeSyncRootLocator = {\n exportName?: string;\n selector?: string;\n};\n\nexport type CodeSyncManifestNodeMapping = {\n nodeId: string;\n locator: CodeSyncSourceLocator;\n};\n\nexport type CodeSyncManifest = {\n bindingId: string;\n documentId: string;\n repoPath: string;\n adapter: CodeSyncAdapter;\n rootLocator: CodeSyncRootLocator;\n sourceHash: string;\n documentRevision: number;\n nodeMappings: CodeSyncManifestNodeMapping[];\n lastImportedAt?: string;\n lastPushedAt?: string;\n};\n\nexport type CodeSyncConflictKind =\n | \"source_hash_changed\"\n | \"document_revision_changed\"\n | \"ownership_violation\"\n | \"unsupported_change\";\n\nexport type CodeSyncConflict = {\n kind: CodeSyncConflictKind;\n bindingId: string;\n nodeId?: string;\n message: string;\n details?: Record<string, unknown>;\n};\n\nexport type CodeSyncResolutionPolicy = \"prefer_code\" | \"prefer_canvas\" | \"manual\";\n\nexport type CodeSyncDriftState = \"clean\" | \"source_changed\" | \"document_changed\" | \"conflict\";\n\nexport type CodeSyncBindingStatus = {\n bindingId: string;\n nodeId: string;\n repoPath: string;\n adapter: CodeSyncAdapter;\n syncMode: CodeSyncSyncMode;\n projection: CodeSyncProjectionMode;\n state: CodeSyncState;\n driftState: CodeSyncDriftState;\n watchEnabled: boolean;\n lastImportedAt?: string;\n lastPushedAt?: string;\n conflictCount: number;\n unsupportedCount: number;\n};\n\nexport type CodeSyncWatchState = \"idle\" | \"watching\" | \"stopped\";\n\nexport type CodeSyncSessionStatus = {\n state: CodeSyncState;\n boundFiles: string[];\n attachedClients: number;\n activeLeaseHolder: string | null;\n watchState: CodeSyncWatchState;\n lastImportAt?: string;\n lastPushAt?: string;\n conflictCount: number;\n driftState: CodeSyncDriftState;\n bindings: CodeSyncBindingStatus[];\n};\n\nexport type CanvasParityNodeArtifact = {\n nodeId: string;\n bindingId: string;\n text: string;\n childOrderHash: string;\n attributes: Record<string, string>;\n styleProjection: Record<string, string>;\n};\n\nexport type CanvasParityArtifact = {\n projection: CodeSyncProjectionMode;\n rootBindingId: string;\n capturedAt: string;\n hierarchyHash: string;\n nodes: CanvasParityNodeArtifact[];\n};\n\nexport const DEFAULT_CODE_SYNC_OWNERSHIP: CodeSyncOwnership = {\n structure: \"shared\",\n text: \"shared\",\n style: \"shared\",\n tokens: \"shared\",\n behavior: \"code\",\n data: \"code\"\n};\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nexport function isCodeSyncState(value: unknown): value is CodeSyncState {\n return typeof value === \"string\" && (CODE_SYNC_STATES as readonly string[]).includes(value);\n}\n\nexport function isCodeSyncProjectionMode(value: unknown): value is CodeSyncProjectionMode {\n return typeof value === \"string\" && (CODE_SYNC_PROJECTIONS as readonly string[]).includes(value);\n}\n\nexport function normalizeCodeSyncOwnership(value: unknown): CodeSyncOwnership {\n if (!isRecord(value)) {\n return { ...DEFAULT_CODE_SYNC_OWNERSHIP };\n }\n const normalized = {} as CodeSyncOwnership;\n for (const dimension of CODE_SYNC_OWNERSHIP_DIMENSIONS) {\n const entry = value[dimension];\n normalized[dimension] = typeof entry === \"string\" && (CODE_SYNC_OWNERSHIP_STATES as readonly string[]).includes(entry)\n ? entry as CodeSyncOwnershipState\n : DEFAULT_CODE_SYNC_OWNERSHIP[dimension];\n }\n return normalized;\n}\n\nexport function normalizeCodeSyncBindingMetadata(value: unknown): CanvasCodeSyncBindingMetadata {\n if (!isRecord(value)) {\n throw new Error(\"Invalid code sync binding metadata.\");\n }\n const adapter = typeof value.adapter === \"string\" ? value.adapter : \"\";\n const repoPath = typeof value.repoPath === \"string\" ? value.repoPath.trim() : \"\";\n const syncMode = typeof value.syncMode === \"string\" ? value.syncMode : \"\";\n if (!(CODE_SYNC_ADAPTERS as readonly string[]).includes(adapter)) {\n throw new Error(`Unsupported code sync adapter: ${adapter || \"unknown\"}`);\n }\n if (!repoPath) {\n throw new Error(\"codeSync.repoPath is required.\");\n }\n if (!(CODE_SYNC_SYNC_MODES as readonly string[]).includes(syncMode)) {\n throw new Error(`Unsupported code sync mode: ${syncMode || \"unknown\"}`);\n }\n const exportName = typeof value.exportName === \"string\" && value.exportName.trim().length > 0 ? value.exportName : undefined;\n const selector = typeof value.selector === \"string\" && value.selector.trim().length > 0 ? value.selector : undefined;\n if (!exportName && !selector) {\n throw new Error(\"codeSync.exportName or codeSync.selector is required.\");\n }\n const projection = typeof value.projection === \"string\" && (CODE_SYNC_PROJECTIONS as readonly string[]).includes(value.projection)\n ? value.projection as CodeSyncProjectionMode\n : \"canvas_html\";\n return {\n adapter: adapter as CodeSyncAdapter,\n repoPath,\n exportName,\n selector,\n syncMode: syncMode as CodeSyncSyncMode,\n ownership: normalizeCodeSyncOwnership(value.ownership),\n route: typeof value.route === \"string\" && value.route.trim().length > 0 ? value.route : undefined,\n verificationTarget: typeof value.verificationTarget === \"string\" && value.verificationTarget.trim().length > 0\n ? value.verificationTarget\n : undefined,\n runtimeRootSelector: typeof value.runtimeRootSelector === \"string\" && value.runtimeRootSelector.trim().length > 0\n ? value.runtimeRootSelector\n : undefined,\n projection\n };\n}\n","export const CANVAS_SURFACE_TOKENS = {\n background: \"#ffffff\",\n text: \"#0f172a\",\n grid: \"rgba(148, 163, 184, 0.18)\",\n accent: \"#20d5c6\",\n accentStrong: \"#0ea5e9\"\n} as const;\n\nexport const CANVAS_SURFACE_TOKEN_VARIABLES = {\n background: \"--surface-bg\",\n text: \"--surface-text\",\n grid: \"--surface-grid\",\n accent: \"--accent\",\n accentStrong: \"--accent-strong\"\n} as const;\n","import { resolveCanvasLibraryPolicy } from \"./document-store\";\nimport { CANVAS_SURFACE_TOKENS, CANVAS_SURFACE_TOKEN_VARIABLES } from \"./surface-palette\";\nimport type { CanvasBinding, CanvasDocument, CanvasNode, CanvasPage, CanvasParityArtifact, CanvasRect } from \"./types\";\n\ntype RenderElement = {\n tag: string;\n classNames?: string[];\n attributes?: Record<string, string>;\n style?: Record<string, string | number>;\n text?: string;\n children?: RenderElement[];\n selfClosing?: boolean;\n};\n\ntype RenderContext = {\n bindingById: Map<string, CanvasBinding>;\n nodeById: Map<string, CanvasNode>;\n tailwindEnabled: boolean;\n};\n\ntype RenderHtmlOptions = {\n pageIds?: string[];\n baseHref?: string | null;\n rootAttributes?: Record<string, string>;\n};\n\ntype ResolvedBinding = {\n componentName: string | null;\n sourceKind: string | null;\n};\n\ntype ComponentKind = \"badge\" | \"button\" | \"card\" | \"dialog\" | \"motion\" | \"tabs\";\n\ntype IconDescriptor = {\n componentRef: string | null;\n identifier: string;\n role: string | null;\n sourceLibrary: string;\n};\n\ntype MediaKind = \"image\" | \"video\" | \"audio\";\n\ntype MediaDescriptor = {\n kind: MediaKind;\n tagName: \"img\" | \"video\" | \"audio\";\n src: string | null;\n poster: string | null;\n alt: string | null;\n controls: boolean;\n autoPlay: boolean;\n loop: boolean;\n muted: boolean;\n playsInline: boolean;\n preload: string | null;\n};\n\nconst TAILWIND_STYLING_LIBRARY = \"tailwindcss\";\n\nconst UNIT_LESS_STYLES = new Set([\n \"flex\",\n \"flexGrow\",\n \"flexShrink\",\n \"fontWeight\",\n \"lineHeight\",\n \"opacity\",\n \"order\",\n \"scale\",\n \"zIndex\"\n]);\n\nconst SVG_HTML_ATTRIBUTE_MAP: Record<string, string> = {\n strokeWidth: \"stroke-width\",\n strokeLinecap: \"stroke-linecap\",\n strokeLinejoin: \"stroke-linejoin\",\n autoPlay: \"autoplay\",\n playsInline: \"playsinline\",\n srcSet: \"srcset\",\n controlsList: \"controlslist\",\n crossOrigin: \"crossorigin\",\n referrerPolicy: \"referrerpolicy\"\n};\n\nconst renderSurfaceTokenStyles = (): string => [\n `:root {`,\n ` ${CANVAS_SURFACE_TOKEN_VARIABLES.background}: ${CANVAS_SURFACE_TOKENS.background};`,\n ` ${CANVAS_SURFACE_TOKEN_VARIABLES.text}: ${CANVAS_SURFACE_TOKENS.text};`,\n ` ${CANVAS_SURFACE_TOKEN_VARIABLES.grid}: ${CANVAS_SURFACE_TOKENS.grid};`,\n ` ${CANVAS_SURFACE_TOKEN_VARIABLES.accent}: ${CANVAS_SURFACE_TOKENS.accent};`,\n ` ${CANVAS_SURFACE_TOKEN_VARIABLES.accentStrong}: ${CANVAS_SURFACE_TOKENS.accentStrong};`,\n `}`\n].join(\" \");\n\nconst escapeHtml = (value: string): string => value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\")\n .replaceAll('\"', \"&quot;\")\n .replaceAll(\"'\", \"&#39;\");\n\nconst slugify = (value: string): string => value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/(^-|-$)/g, \"\");\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst readString = (value: unknown): string | null => typeof value === \"string\" && value.trim().length > 0 ? value : null;\n\nconst readBoolean = (value: unknown): boolean | null => {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"string\") {\n if (value === \"true\") {\n return true;\n }\n if (value === \"false\") {\n return false;\n }\n }\n return null;\n};\n\nconst readNodeText = (node: CanvasNode): string => {\n const raw = node.props.text ?? node.metadata.text;\n if (raw !== undefined && raw !== null) {\n return typeof raw === \"string\" ? raw : String(raw);\n }\n return node.kind === \"text\" || node.kind === \"note\" || node.kind === \"component-instance\"\n ? node.name\n : \"\";\n};\n\nconst parseNumericStyle = (value: unknown): number | null => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n return null;\n};\n\nconst formatCssValue = (key: string, value: string | number): string => {\n if (typeof value === \"number\" && !UNIT_LESS_STYLES.has(key)) {\n return `${value}px`;\n }\n return String(value);\n};\n\nconst toHtmlAttributeName = (key: string): string => SVG_HTML_ATTRIBUTE_MAP[key] ?? key;\n\nconst appendUtilityClasses = (classNames: Array<string | undefined>, enabled: boolean, utilityClasses: string[]): string[] => {\n const values = classNames.filter((entry): entry is string => Boolean(entry));\n return enabled ? [...values, ...utilityClasses] : values;\n};\n\nconst toHtmlStyle = (style: Record<string, string | number> | undefined): string => {\n if (!style) {\n return \"\";\n }\n const pairs = Object.entries(style)\n .filter(([, value]) => typeof value === \"string\" || typeof value === \"number\")\n .map(([key, value]) => `${key.replace(/[A-Z]/g, (match) => `-${match.toLowerCase()}`)}:${escapeHtml(formatCssValue(key, value))}`);\n return pairs.length > 0 ? ` style=\"${pairs.join(\";\")}\"` : \"\";\n};\n\nconst toTsxStyle = (style: Record<string, string | number> | undefined): string => {\n if (!style) {\n return \"\";\n }\n const pairs = Object.entries(style)\n .filter(([, value]) => typeof value === \"string\" || typeof value === \"number\")\n .map(([key, value]) => `${JSON.stringify(key)}: ${JSON.stringify(formatCssValue(key, value))}`);\n return pairs.length > 0 ? ` style={{ ${pairs.join(\", \")} }}` : \"\";\n};\n\nconst renderHtmlAttributes = (element: RenderElement): string => {\n const attrs: string[] = [];\n if (element.classNames && element.classNames.length > 0) {\n attrs.push(` class=\"${escapeHtml(element.classNames.join(\" \"))}\"`);\n }\n if (element.attributes) {\n for (const [key, value] of Object.entries(element.attributes)) {\n attrs.push(` ${toHtmlAttributeName(key)}=\"${escapeHtml(value)}\"`);\n }\n }\n return `${attrs.join(\"\")}${toHtmlStyle(element.style)}`;\n};\n\nconst renderTsxAttributes = (element: RenderElement): string => {\n const attrs: string[] = [];\n if (element.classNames && element.classNames.length > 0) {\n attrs.push(` className=\"${escapeHtml(element.classNames.join(\" \"))}\"`);\n }\n if (element.attributes) {\n for (const [key, value] of Object.entries(element.attributes)) {\n attrs.push(` ${key}=\"${escapeHtml(value)}\"`);\n }\n }\n return `${attrs.join(\"\")}${toTsxStyle(element.style)}`;\n};\n\nconst emitHtml = (element: RenderElement): string => {\n const attrs = renderHtmlAttributes(element);\n if (element.selfClosing) {\n return `<${element.tag}${attrs} />`;\n }\n const children = element.children?.map((child) => emitHtml(child)).join(\"\") ?? \"\";\n const text = typeof element.text === \"string\" ? escapeHtml(element.text) : \"\";\n return `<${element.tag}${attrs}>${text}${children}</${element.tag}>`;\n};\n\nconst emitTsx = (element: RenderElement, depth: number): string => {\n const indent = \" \".repeat(depth);\n const attrs = renderTsxAttributes(element);\n if (element.selfClosing) {\n return `${indent}<${element.tag}${attrs} />`;\n }\n const childLines: string[] = [];\n if (typeof element.text === \"string\") {\n childLines.push(`${indent} {${JSON.stringify(element.text)}}`);\n }\n if (element.children) {\n for (const child of element.children) {\n childLines.push(emitTsx(child, depth + 1));\n }\n }\n if (childLines.length === 0) {\n return `${indent}<${element.tag}${attrs}></${element.tag}>`;\n }\n return [\n `${indent}<${element.tag}${attrs}>`,\n ...childLines,\n `${indent}</${element.tag}>`\n ].join(\"\\n\");\n};\n\nconst buildContext = (document: CanvasDocument, page: CanvasPage): RenderContext => {\n const policy = resolveCanvasLibraryPolicy(document);\n return {\n bindingById: new Map(document.bindings.map((binding) => [binding.id, binding])),\n nodeById: new Map(page.nodes.map((node) => [node.id, node])),\n tailwindEnabled: policy.styling.includes(TAILWIND_STYLING_LIBRARY)\n };\n};\n\nconst readNodeAttributes = (node: CanvasNode): Record<string, unknown> => {\n return isRecord(node.props.attributes) ? node.props.attributes : {};\n};\n\nconst resolveNodeTagName = (node: CanvasNode): string | null => {\n const propTag = readString(node.props.tagName);\n if (propTag) {\n return propTag.toLowerCase();\n }\n const codeSync = isRecord(node.metadata.codeSync) ? node.metadata.codeSync : null;\n return readString(codeSync?.tagName)?.toLowerCase() ?? null;\n};\n\nconst resolvePrimaryAsset = (document: CanvasDocument, node: CanvasNode): CanvasDocument[\"assets\"][number] | null => {\n const assetIds = Array.isArray(node.metadata.assetIds)\n ? node.metadata.assetIds.filter((entry): entry is string => typeof entry === \"string\" && entry.trim().length > 0)\n : [];\n const firstAssetId = assetIds[0];\n if (!firstAssetId) {\n return null;\n }\n return document.assets.find((asset) => asset.id === firstAssetId) ?? null;\n};\n\nconst resolveMediaDescriptor = (document: CanvasDocument, node: CanvasNode): MediaDescriptor | null => {\n const tagName = resolveNodeTagName(node);\n const asset = resolvePrimaryAsset(document, node);\n const assetKind = readString(asset?.kind)?.toLowerCase();\n const assetMime = readString(asset?.mime)?.toLowerCase();\n const attributes = readNodeAttributes(node);\n const src = readString(node.props.src)\n ?? readString(attributes.src)\n ?? readString(asset?.url)\n ?? readString(asset?.repoPath);\n const poster = readString(node.props.poster) ?? readString(attributes.poster);\n const alt = readString(node.props.alt)\n ?? readString(attributes.alt)\n ?? readString(isRecord(asset?.metadata) ? asset?.metadata.alt : null)\n ?? readString(node.name);\n const controls = readBoolean(node.props.controls) ?? readBoolean(attributes.controls) ?? true;\n const autoPlay = readBoolean(node.props.autoPlay) ?? readBoolean(attributes.autoPlay) ?? false;\n const loop = readBoolean(node.props.loop) ?? readBoolean(attributes.loop) ?? false;\n const muted = readBoolean(node.props.muted) ?? readBoolean(attributes.muted) ?? (tagName === \"video\");\n const playsInline = readBoolean(node.props.playsInline) ?? readBoolean(attributes.playsInline) ?? (tagName === \"video\");\n const preload = readString(node.props.preload) ?? readString(attributes.preload);\n if (tagName === \"img\" || assetKind === \"image\" || assetMime?.startsWith(\"image/\")) {\n return {\n kind: \"image\",\n tagName: \"img\",\n src,\n poster: null,\n alt,\n controls: false,\n autoPlay: false,\n loop: false,\n muted: true,\n playsInline: false,\n preload: null\n };\n }\n if (tagName === \"video\" || assetKind === \"video\" || assetMime?.startsWith(\"video/\")) {\n return {\n kind: \"video\",\n tagName: \"video\",\n src,\n poster,\n alt,\n controls,\n autoPlay,\n loop,\n muted,\n playsInline,\n preload\n };\n }\n if (tagName === \"audio\" || assetKind === \"audio\" || assetMime?.startsWith(\"audio/\")) {\n return {\n kind: \"audio\",\n tagName: \"audio\",\n src,\n poster: null,\n alt,\n controls,\n autoPlay,\n loop,\n muted,\n playsInline: false,\n preload\n };\n }\n return null;\n};\n\nconst resolvePrimaryBinding = (context: RenderContext, node: CanvasNode): ResolvedBinding | null => {\n const bindingId = typeof node.bindingRefs.primary === \"string\" ? node.bindingRefs.primary : null;\n if (!bindingId) {\n return null;\n }\n const binding = context.bindingById.get(bindingId);\n if (!binding) {\n return null;\n }\n const metadata = isRecord(binding.metadata) ? binding.metadata : {};\n return {\n componentName: readString(binding.componentName) ?? readString(metadata.exportName),\n sourceKind: readString(metadata.sourceKind)\n };\n};\n\nconst resolveComponentKind = (node: CanvasNode, binding: ResolvedBinding | null, text: string): ComponentKind | null => {\n const componentName = binding?.componentName?.toLowerCase() ?? \"\";\n if (componentName.includes(\"button\")) {\n return \"button\";\n }\n if (componentName.includes(\"badge\")) {\n return \"badge\";\n }\n if (componentName.includes(\"tabs\")) {\n return \"tabs\";\n }\n if (componentName.includes(\"card\")) {\n return \"card\";\n }\n if (componentName.includes(\"dialog\")) {\n return \"dialog\";\n }\n if (componentName.includes(\"motion\")) {\n return \"motion\";\n }\n if (node.kind !== \"component-instance\") {\n return null;\n }\n const lineCount = text.split(\"\\n\").filter((entry) => entry.trim().length > 0).length;\n if (lineCount > 1 || node.rect.height >= 96) {\n return \"card\";\n }\n if (node.rect.height <= 56) {\n return \"badge\";\n }\n return \"button\";\n};\n\nconst readNodeIcons = (node: CanvasNode): IconDescriptor[] => {\n const refs = Array.isArray(node.metadata.iconRefs)\n ? node.metadata.iconRefs\n : node.metadata.iconRef\n ? [node.metadata.iconRef]\n : [];\n return refs.flatMap((entry) => {\n if (!isRecord(entry)) {\n return [];\n }\n const sourceLibrary = readString(entry.sourceLibrary);\n if (!sourceLibrary) {\n return [];\n }\n return [{\n componentRef: readString(entry.componentRef),\n identifier: readString(entry.identifier) ?? \"generic\",\n role: readString(entry.role),\n sourceLibrary\n }];\n });\n};\n\nconst buildNodeStyle = (\n node: CanvasNode,\n parentRect: CanvasRect | null,\n isRootSurface: boolean,\n componentKind: ComponentKind | null,\n text: string\n): Record<string, string | number> => {\n const style = Object.entries(node.style).reduce<Record<string, string | number>>((acc, [key, value]) => {\n if (typeof value === \"string\" || typeof value === \"number\") {\n acc[key] = value;\n }\n return acc;\n }, {});\n if (text.includes(\"\\n\") && style.whiteSpace === undefined) {\n style.whiteSpace = \"pre-line\";\n }\n if (isRootSurface) {\n style.position = \"relative\";\n style.width = node.rect.width;\n style.minHeight = node.rect.height;\n style.overflow ??= \"hidden\";\n return style;\n }\n const baseRect = parentRect as CanvasRect;\n style.position = \"absolute\";\n style.left = node.rect.x - baseRect.x;\n style.top = node.rect.y - baseRect.y;\n style.width = Math.max(node.rect.width, 40);\n style.minHeight = Math.max(node.rect.height, node.kind === \"connector\" ? 2 : componentKind === \"badge\" ? 32 : 44);\n return style;\n};\n\nconst buildNodeClassNames = (\n node: CanvasNode,\n binding: ResolvedBinding | null,\n componentKind: ComponentKind | null,\n isRootSurface: boolean,\n tailwindEnabled: boolean\n): string[] => {\n return appendUtilityClasses([\n \"odb-canvas-node\",\n `odb-canvas-${slugify(node.kind)}`,\n slugify(node.name) ? `odb-node-${slugify(node.name)}` : undefined,\n isRootSurface ? \"odb-canvas-surface\" : undefined,\n componentKind ? `odb-canvas-component-${componentKind}` : undefined,\n binding?.sourceKind ? `odb-source-${slugify(binding.sourceKind)}` : undefined,\n binding?.componentName ? `odb-binding-${slugify(binding.componentName)}` : undefined\n ], tailwindEnabled, [\n \"box-border\",\n ...(isRootSurface ? [\"relative\", \"isolate\", \"overflow-hidden\"] : [\"absolute\"]),\n ...(componentKind === \"button\" ? [\"inline-flex\", \"items-center\", \"justify-center\", \"gap-3\", \"rounded-full\", \"font-semibold\", \"shadow-2xl\"] : []),\n ...(componentKind === \"badge\" ? [\"inline-flex\", \"items-center\", \"gap-2\", \"rounded-full\", \"font-semibold\"] : []),\n ...(componentKind === \"tabs\" ? [\"inline-flex\", \"items-center\", \"rounded-full\", \"p-1\", \"shadow-2xl\"] : []),\n ...(componentKind === \"card\" || componentKind === \"dialog\" || componentKind === \"motion\"\n ? [\"grid\", \"content-start\", \"gap-4\", \"rounded-3xl\", \"shadow-2xl\"]\n : []),\n ...(node.kind === \"note\" ? [\"rounded-2xl\"] : []),\n ...(node.kind === \"connector\" ? [\"h-px\", \"w-full\"] : [])\n ]);\n};\n\nconst buildNodeAttributes = (node: CanvasNode, binding: ResolvedBinding | null, icons: IconDescriptor[]): Record<string, string> => {\n const attrs: Record<string, string> = {\n \"data-node-id\": node.id\n };\n const primaryBindingId = typeof node.bindingRefs.primary === \"string\" ? node.bindingRefs.primary : null;\n if (primaryBindingId) {\n attrs[\"data-binding-id\"] = primaryBindingId;\n }\n if (binding?.componentName) {\n attrs[\"data-component-name\"] = binding.componentName;\n }\n if (binding?.sourceKind) {\n attrs[\"data-source-kind\"] = binding.sourceKind;\n }\n if (icons.length > 0) {\n attrs[\"data-icon-library\"] = [...new Set(icons.map((icon) => icon.sourceLibrary))].join(\",\");\n }\n return attrs;\n};\n\nconst splitInlineItems = (text: string): string[] => {\n const items = text.split(/\\s{2,}/).map((entry) => entry.trim()).filter(Boolean);\n return items.length > 1 ? items : [];\n};\n\nconst resolveTextTag = (node: CanvasNode): string => {\n const fontSize = parseNumericStyle(node.style.fontSize);\n const name = node.name.toLowerCase();\n if (name.includes(\"title\") || (fontSize !== null && fontSize >= 48)) {\n return \"h1\";\n }\n if (name.includes(\"section\") || (fontSize !== null && fontSize >= 28)) {\n return \"h2\";\n }\n if (name.includes(\"brand\") || name.includes(\"nav\") || name.includes(\"logos\")) {\n return \"div\";\n }\n return \"p\";\n};\n\nconst createSvgIcon = (classNames: string[], children: RenderElement[]): RenderElement => ({\n tag: \"span\",\n classNames,\n attributes: { \"aria-hidden\": \"true\" },\n children: [{\n tag: \"svg\",\n attributes: {\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n },\n children\n }]\n});\n\nconst createOutlinePath = (attributes: Record<string, string>): RenderElement => ({\n tag: \"path\",\n selfClosing: true,\n attributes: {\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: \"1.85\",\n ...attributes\n }\n});\n\nconst buildTablerIcon = (icon: IconDescriptor): RenderElement => {\n switch (icon.identifier) {\n case \"arrow-right\":\n return createSvgIcon([\"odb-canvas-icon\", \"odb-canvas-icon-tabler\"], [\n createOutlinePath({ d: \"M5 12h14\" }),\n createOutlinePath({ d: \"m12 5 7 7-7 7\" })\n ]);\n case \"rocket\":\n return createSvgIcon([\"odb-canvas-icon\", \"odb-canvas-icon-tabler\"], [\n createOutlinePath({ d: \"M5 19c2.5-6.5 7.5-11.5 14-14-2.5 6.5-7.5 11.5-14 14Z\" }),\n createOutlinePath({ d: \"m9 15-4 4\" }),\n {\n tag: \"circle\",\n selfClosing: true,\n attributes: {\n cx: \"14.5\",\n cy: \"9.5\",\n r: \"1.75\",\n stroke: \"currentColor\",\n strokeWidth: \"1.85\"\n }\n }\n ]);\n case \"components\":\n return createSvgIcon([\"odb-canvas-icon\", \"odb-canvas-icon-tabler\"], [\n { tag: \"rect\", selfClosing: true, attributes: { x: \"4\", y: \"4\", width: \"7\", height: \"7\", rx: \"2\", stroke: \"currentColor\", strokeWidth: \"1.85\" } },\n { tag: \"rect\", selfClosing: true, attributes: { x: \"13\", y: \"4\", width: \"7\", height: \"7\", rx: \"2\", stroke: \"currentColor\", strokeWidth: \"1.85\" } },\n { tag: \"rect\", selfClosing: true, attributes: { x: \"8.5\", y: \"13\", width: \"7\", height: \"7\", rx: \"2\", stroke: \"currentColor\", strokeWidth: \"1.85\" } }\n ]);\n case \"layout-dashboard\":\n return createSvgIcon([\"odb-canvas-icon\", \"odb-canvas-icon-tabler\"], [\n { tag: \"rect\", selfClosing: true, attributes: { x: \"4\", y: \"4\", width: \"7\", height: \"7\", rx: \"2\", stroke: \"currentColor\", strokeWidth: \"1.85\" } },\n { tag: \"rect\", selfClosing: true, attributes: { x: \"13\", y: \"4\", width: \"7\", height: \"5\", rx: \"2\", stroke: \"currentColor\", strokeWidth: \"1.85\" } },\n { tag: \"rect\", selfClosing: true, attributes: { x: \"13\", y: \"11\", width: \"7\", height: \"9\", rx: \"2\", stroke: \"currentColor\", strokeWidth: \"1.85\" } },\n { tag: \"rect\", selfClosing: true, attributes: { x: \"4\", y: \"13\", width: \"7\", height: \"7\", rx: \"2\", stroke: \"currentColor\", strokeWidth: \"1.85\" } }\n ]);\n default:\n return createSvgIcon([\"odb-canvas-icon\", \"odb-canvas-icon-tabler\"], [\n { tag: \"circle\", selfClosing: true, attributes: { cx: \"12\", cy: \"12\", r: \"7\", stroke: \"currentColor\", strokeWidth: \"1.85\" } },\n createOutlinePath({ d: \"M12 9v6\" }),\n createOutlinePath({ d: \"M9 12h6\" })\n ]);\n }\n};\n\nconst buildFluentIcon = (icon: IconDescriptor): RenderElement => {\n switch (icon.identifier) {\n case \"grid-dots-24\":\n return createSvgIcon([\"odb-canvas-icon\", \"odb-canvas-icon-fluent\"], Array.from({ length: 9 }, (_, index) => {\n const x = 7 + (index % 3) * 5;\n const y = 7 + Math.floor(index / 3) * 5;\n return {\n tag: \"circle\",\n selfClosing: true,\n attributes: { cx: String(x), cy: String(y), r: \"1.4\", fill: \"currentColor\" }\n };\n }));\n case \"chat-bubbles-24\":\n return createSvgIcon([\"odb-canvas-icon\", \"odb-canvas-icon-fluent\"], [\n {\n tag: \"path\",\n selfClosing: true,\n attributes: {\n d: \"M5.5 8.5a3.5 3.5 0 0 1 3.5-3.5h8a3.5 3.5 0 0 1 3.5 3.5v4A3.5 3.5 0 0 1 17 16H11l-4.5 3v-3.1A3.49 3.49 0 0 1 5.5 12.5v-4Z\",\n stroke: \"currentColor\",\n strokeWidth: \"1.8\"\n }\n },\n {\n tag: \"path\",\n selfClosing: true,\n attributes: {\n d: \"M8 9.75h7M8 12.75h4.5\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeWidth: \"1.8\"\n }\n }\n ]);\n case \"branch-24\":\n return createSvgIcon([\"odb-canvas-icon\", \"odb-canvas-icon-fluent\"], [\n createOutlinePath({ d: \"M8 7.5v9\" }),\n createOutlinePath({ d: \"M8 12.5h7\" }),\n createOutlinePath({ d: \"M15 12.5V7.5\" }),\n { tag: \"circle\", selfClosing: true, attributes: { cx: \"8\", cy: \"6\", r: \"2\", fill: \"currentColor\" } },\n { tag: \"circle\", selfClosing: true, attributes: { cx: \"15\", cy: \"6\", r: \"2\", fill: \"currentColor\" } },\n { tag: \"circle\", selfClosing: true, attributes: { cx: \"15\", cy: \"18\", r: \"2\", fill: \"currentColor\" } }\n ]);\n case \"sparkle-24\":\n default:\n return createSvgIcon([\"odb-canvas-icon\", \"odb-canvas-icon-fluent\"], [\n {\n tag: \"path\",\n selfClosing: true,\n attributes: {\n d: \"M12 3.5 14.4 9l5.6 2.4-5.6 2.4L12 19.5l-2.4-5.7L4 11.4 9.6 9 12 3.5Z\",\n fill: \"currentColor\"\n }\n }\n ]);\n }\n};\n\nconst buildDecorativeIcon = (icon: IconDescriptor): RenderElement => {\n if (icon.sourceLibrary === \"3dicons\") {\n return {\n tag: \"span\",\n classNames: [\"odb-canvas-icon\", \"odb-canvas-icon-3d\"],\n attributes: { \"aria-hidden\": \"true\" },\n children: [{ tag: \"span\", classNames: [\"odb-canvas-icon-orb\"] }]\n };\n }\n const emoji = icon.identifier.includes(\"party\") ? \"🎉\" : \"✨\";\n return {\n tag: \"span\",\n classNames: [\"odb-canvas-icon\", \"odb-canvas-icon-emoji\"],\n attributes: { \"aria-hidden\": \"true\" },\n text: emoji\n };\n};\n\nconst buildIconElement = (icon: IconDescriptor, tailwindEnabled: boolean): RenderElement => {\n const iconElement = icon.sourceLibrary === \"tabler\"\n ? buildTablerIcon(icon)\n : icon.sourceLibrary === \"microsoft-fluent-ui-system-icons\"\n ? buildFluentIcon(icon)\n : buildDecorativeIcon(icon);\n return {\n ...iconElement,\n classNames: appendUtilityClasses(iconElement.classNames!, tailwindEnabled, [\n \"inline-flex\",\n \"items-center\",\n \"justify-center\",\n \"shrink-0\",\n icon.sourceLibrary === \"3dicons\" || icon.sourceLibrary === \"@lobehub/fluent-emoji-3d\" ? \"h-5\" : \"h-4\",\n icon.sourceLibrary === \"3dicons\" || icon.sourceLibrary === \"@lobehub/fluent-emoji-3d\" ? \"w-5\" : \"w-4\"\n ])\n };\n};\n\nconst buildIconStack = (icons: IconDescriptor[], tailwindEnabled: boolean): RenderElement | null => {\n if (icons.length === 0) {\n return null;\n }\n if (icons.length === 1) {\n return buildIconElement(icons[0] as IconDescriptor, tailwindEnabled);\n }\n return {\n tag: \"span\",\n classNames: appendUtilityClasses([\"odb-canvas-icon-stack\"], tailwindEnabled, [\"inline-flex\", \"items-center\", \"gap-2\"]),\n children: icons.map((icon) => buildIconElement(icon, tailwindEnabled))\n };\n};\n\nconst buildButtonElement = (\n node: CanvasNode,\n classNames: string[],\n attributes: Record<string, string>,\n style: Record<string, string | number>,\n icons: IconDescriptor[],\n label: string,\n tailwindEnabled: boolean\n): RenderElement => {\n const leading = icons.filter((icon) => !icon.identifier.includes(\"arrow\"));\n const trailing = icons.filter((icon) => icon.identifier.includes(\"arrow\"));\n return {\n tag: \"button\",\n classNames,\n attributes: { ...attributes, type: \"button\" },\n style,\n children: [\n ...leading.map((icon) => buildIconElement(icon, tailwindEnabled)),\n { tag: \"span\", classNames: appendUtilityClasses([\"odb-canvas-label\"], tailwindEnabled, [\"leading-none\"]), text: label },\n ...trailing.map((icon) => buildIconElement(icon, tailwindEnabled))\n ]\n };\n};\n\nconst buildBadgeElement = (\n classNames: string[],\n attributes: Record<string, string>,\n style: Record<string, string | number>,\n icons: IconDescriptor[],\n label: string,\n tailwindEnabled: boolean\n): RenderElement => ({\n tag: \"span\",\n classNames,\n attributes,\n style,\n children: [\n ...icons.map((icon) => buildIconElement(icon, tailwindEnabled)),\n { tag: \"span\", classNames: appendUtilityClasses([\"odb-canvas-label\"], tailwindEnabled, [\"leading-none\"]), text: label }\n ]\n});\n\nconst buildTabsElement = (\n classNames: string[],\n attributes: Record<string, string>,\n style: Record<string, string | number>,\n icons: IconDescriptor[],\n label: string,\n tailwindEnabled: boolean\n): RenderElement => ({\n tag: \"div\",\n classNames,\n attributes,\n style,\n children: [{\n tag: \"button\",\n classNames: appendUtilityClasses([\"odb-canvas-tabs-trigger\"], tailwindEnabled, [\"inline-flex\", \"items-center\", \"justify-center\", \"gap-2\", \"w-full\", \"rounded-full\", \"leading-none\"]),\n attributes: {\n type: \"button\",\n role: \"tab\",\n \"aria-selected\": \"true\"\n },\n children: [\n ...icons.map((icon) => buildIconElement(icon, tailwindEnabled)),\n { tag: \"span\", classNames: appendUtilityClasses([\"odb-canvas-label\"], tailwindEnabled, [\"leading-none\"]), text: label }\n ]\n }]\n});\n\nconst buildCardElement = (\n classNames: string[],\n attributes: Record<string, string>,\n style: Record<string, string | number>,\n icons: IconDescriptor[],\n text: string,\n childNodes: RenderElement[],\n tailwindEnabled: boolean\n): RenderElement => {\n const lines = text.split(\"\\n\").map((entry) => entry.trim()).filter(Boolean);\n const title = lines[0] ?? \"Canvas Component\";\n const bodyLines = lines.slice(1);\n const iconStack = buildIconStack(icons, tailwindEnabled);\n return {\n tag: \"article\",\n classNames,\n attributes,\n style,\n children: [\n {\n tag: \"div\",\n classNames: appendUtilityClasses([\"odb-canvas-card-header\"], tailwindEnabled, [\"flex\", \"items-center\", \"justify-between\", \"gap-4\"]),\n children: [\n {\n tag: \"div\",\n classNames: appendUtilityClasses([\"odb-canvas-card-title-wrap\"], tailwindEnabled, [\"grid\", \"gap-2\"]),\n children: [{ tag: \"p\", classNames: appendUtilityClasses([\"odb-canvas-card-title\"], tailwindEnabled, [\"leading-none\"]), text: title }]\n },\n ...(iconStack ? [iconStack] : [])\n ]\n },\n ...(bodyLines.length > 0\n ? [{\n tag: \"div\",\n classNames: appendUtilityClasses([\"odb-canvas-card-copy\"], tailwindEnabled, [\"grid\", \"gap-2\"]),\n children: bodyLines.map((line) => ({ tag: \"p\", text: line }))\n }]\n : []),\n ...childNodes\n ]\n };\n};\n\nconst buildMediaElement = (\n classNames: string[],\n attributes: Record<string, string>,\n style: Record<string, string | number>,\n descriptor: MediaDescriptor,\n tailwindEnabled: boolean\n): RenderElement => {\n const mediaClassNames = appendUtilityClasses([\n ...classNames,\n \"odb-canvas-media-surface\",\n `odb-canvas-media-${descriptor.kind}`\n ], tailwindEnabled, descriptor.kind === \"audio\" ? [\"grid\", \"content-start\"] : []);\n if (!descriptor.src) {\n return {\n tag: \"div\",\n classNames: mediaClassNames,\n attributes: {\n ...attributes,\n \"data-media-missing\": \"true\"\n },\n style,\n children: [{\n tag: \"span\",\n classNames: [\"odb-canvas-media-placeholder\"],\n text: `${descriptor.kind} source missing`\n }]\n };\n }\n const mediaAttributes: Record<string, string> = {\n ...attributes,\n src: descriptor.src\n };\n if (descriptor.tagName === \"img\") {\n mediaAttributes.alt = descriptor.alt ?? \"Canvas media\";\n mediaAttributes.loading = mediaAttributes.loading ?? \"lazy\";\n return {\n tag: \"img\",\n classNames: mediaClassNames,\n attributes: mediaAttributes,\n style: {\n ...style,\n objectFit: typeof style.objectFit === \"string\" ? style.objectFit : \"cover\"\n },\n selfClosing: true\n };\n }\n if (descriptor.poster) {\n mediaAttributes.poster = descriptor.poster;\n }\n if (descriptor.controls) {\n mediaAttributes.controls = \"true\";\n }\n if (descriptor.autoPlay) {\n mediaAttributes.autoPlay = \"true\";\n }\n if (descriptor.loop) {\n mediaAttributes.loop = \"true\";\n }\n if (descriptor.muted) {\n mediaAttributes.muted = \"true\";\n }\n if (descriptor.playsInline) {\n mediaAttributes.playsInline = \"true\";\n }\n if (descriptor.preload) {\n mediaAttributes.preload = descriptor.preload;\n }\n return {\n tag: descriptor.tagName,\n classNames: mediaClassNames,\n attributes: mediaAttributes,\n style: descriptor.kind === \"audio\"\n ? style\n : {\n ...style,\n objectFit: typeof style.objectFit === \"string\" ? style.objectFit : \"cover\"\n }\n };\n};\n\nconst buildPlainTextElement = (\n node: CanvasNode,\n classNames: string[],\n attributes: Record<string, string>,\n style: Record<string, string | number>,\n text: string,\n tailwindEnabled: boolean\n): RenderElement => {\n const inlineItems = splitInlineItems(text);\n return {\n tag: resolveTextTag(node),\n classNames: appendUtilityClasses([...classNames, inlineItems.length > 0 ? \"odb-canvas-inline-list\" : undefined], tailwindEnabled, inlineItems.length > 0 ? [\"flex\", \"flex-wrap\", \"items-center\", \"gap-4\"] : []),\n attributes,\n style,\n text: inlineItems.length === 0 ? text : undefined,\n children: inlineItems.length > 0\n ? inlineItems.map((item) => ({\n tag: \"span\",\n classNames: [\"odb-canvas-inline-item\"],\n text: item\n }))\n : undefined\n };\n};\n\nconst buildGenericContainer = (\n node: CanvasNode,\n classNames: string[],\n attributes: Record<string, string>,\n style: Record<string, string | number>,\n text: string,\n childNodes: RenderElement[]\n): RenderElement => {\n const tag = node.kind === \"note\" ? \"aside\" : node.kind === \"connector\" ? \"div\" : \"div\";\n return {\n tag,\n classNames: [...classNames, node.kind === \"connector\" ? \"odb-canvas-connector\" : \"\"].filter(Boolean),\n attributes: node.kind === \"connector\" ? { ...attributes, role: \"separator\" } : attributes,\n style,\n text: node.kind === \"connector\" || text.length === 0 ? undefined : text,\n children: childNodes\n };\n};\n\nconst buildNodeElement = (\n document: CanvasDocument,\n context: RenderContext,\n nodeId: string,\n parentRect: CanvasRect | null,\n isRootSurface = false\n): RenderElement | null => {\n const node = context.nodeById.get(nodeId);\n if (!node) {\n return null;\n }\n const text = readNodeText(node);\n const binding = resolvePrimaryBinding(context, node);\n const componentKind = resolveComponentKind(node, binding, text);\n const media = resolveMediaDescriptor(document, node);\n const icons = readNodeIcons(node);\n const style = buildNodeStyle(node, parentRect, isRootSurface, componentKind, text);\n const classNames = buildNodeClassNames(node, binding, componentKind, isRootSurface, context.tailwindEnabled);\n const attributes = buildNodeAttributes(node, binding, icons);\n const childNodes = node.childIds\n .map((childId) => buildNodeElement(document, context, childId, node.rect))\n .filter((entry): entry is RenderElement => Boolean(entry));\n\n if (media) {\n return buildMediaElement(classNames, attributes, style, media, context.tailwindEnabled);\n }\n if (componentKind === \"button\") {\n return buildButtonElement(node, classNames, attributes, style, icons, text || node.name, context.tailwindEnabled);\n }\n if (componentKind === \"badge\") {\n return buildBadgeElement(classNames, attributes, style, icons, text || node.name, context.tailwindEnabled);\n }\n if (componentKind === \"tabs\") {\n return buildTabsElement(classNames, attributes, style, icons, text || node.name, context.tailwindEnabled);\n }\n if (componentKind === \"card\" || componentKind === \"dialog\" || componentKind === \"motion\") {\n return buildCardElement(classNames, attributes, style, icons, text || node.name, childNodes, context.tailwindEnabled);\n }\n if (node.kind === \"text\") {\n return buildPlainTextElement(node, classNames, attributes, style, text || node.name, context.tailwindEnabled);\n }\n return buildGenericContainer(node, classNames, attributes, style, text, childNodes);\n};\n\nconst computeBounds = (nodes: CanvasNode[]): CanvasRect => {\n if (nodes.length === 0) {\n return { x: 0, y: 0, width: 1200, height: 720 };\n }\n const minX = Math.min(...nodes.map((node) => node.rect.x));\n const minY = Math.min(...nodes.map((node) => node.rect.y));\n const maxX = Math.max(...nodes.map((node) => node.rect.x + node.rect.width));\n const maxY = Math.max(...nodes.map((node) => node.rect.y + node.rect.height));\n return {\n x: minX,\n y: minY,\n width: Math.max(maxX - minX, 320),\n height: Math.max(maxY - minY, 240)\n };\n};\n\nconst buildPageElement = (document: CanvasDocument, page: CanvasPage): RenderElement => {\n const context = buildContext(document, page);\n if (page.rootNodeId) {\n const root = buildNodeElement(document, context, page.rootNodeId, null, true);\n return {\n tag: \"section\",\n classNames: appendUtilityClasses([\"odb-canvas-page\"], context.tailwindEnabled, [\"w-full\", \"grid\", \"place-items-center\"]),\n attributes: { \"data-page-id\": page.id },\n children: root ? [root] : []\n };\n }\n const bounds = computeBounds(page.nodes);\n const childNodes = page.nodes\n .filter((node) => node.parentId === null)\n .map((node) => buildNodeElement(document, context, node.id, bounds))\n .filter((entry): entry is RenderElement => Boolean(entry));\n return {\n tag: \"section\",\n classNames: appendUtilityClasses([\"odb-canvas-page\"], context.tailwindEnabled, [\"w-full\", \"grid\", \"place-items-center\"]),\n attributes: { \"data-page-id\": page.id },\n children: [{\n tag: \"div\",\n classNames: appendUtilityClasses([\"odb-canvas-page-surface\"], context.tailwindEnabled, [\"relative\", \"isolate\", \"overflow-hidden\", \"mx-auto\"]),\n style: {\n position: \"relative\",\n width: bounds.width,\n minHeight: bounds.height,\n overflow: \"hidden\"\n },\n children: childNodes\n }]\n };\n};\n\nconst renderLibraryAttributes = (document: CanvasDocument): string => {\n const policy = resolveCanvasLibraryPolicy(document);\n const attrs = [\n [\"data-component-libraries\", policy.components.join(\",\")],\n [\"data-icon-libraries\", policy.icons.join(\",\")],\n [\"data-styling-libraries\", policy.styling.join(\",\")]\n ] as Array<[string, string]>;\n return attrs\n .flatMap(([key, value]) => value.length > 0 ? [` ${key}=\"${escapeHtml(value)}\"`] : [])\n .join(\"\");\n};\n\nconst renderRootAttributes = (attributes: Record<string, string> | undefined): string => {\n if (!attributes) {\n return \"\";\n }\n return Object.entries(attributes)\n .flatMap(([key, value]) => key.trim().length > 0 ? [` ${key}=\"${escapeHtml(value)}\"`] : [])\n .join(\"\");\n};\n\nconst renderTailwindUtilityStyles = (): string => [\n \".min-h-screen { min-height: 100vh; }\",\n \".w-full { width: 100%; }\",\n \".mx-auto { margin-left: auto; margin-right: auto; }\",\n \".grid { display: grid; }\",\n \".flex { display: flex; }\",\n \".inline-flex { display: inline-flex; }\",\n \".place-items-center { place-items: center; }\",\n \".items-center { align-items: center; }\",\n \".justify-center { justify-content: center; }\",\n \".justify-between { justify-content: space-between; }\",\n \".content-start { align-content: start; }\",\n \".flex-wrap { flex-wrap: wrap; }\",\n \".gap-2 { gap: 0.5rem; }\",\n \".gap-3 { gap: 0.75rem; }\",\n \".gap-4 { gap: 1rem; }\",\n \".p-1 { padding: 0.25rem; }\",\n \".rounded-2xl { border-radius: 1rem; }\",\n \".rounded-3xl { border-radius: 1.5rem; }\",\n \".rounded-full { border-radius: 9999px; }\",\n \".font-semibold { font-weight: 600; }\",\n \".leading-none { line-height: 1; }\",\n \".absolute { position: absolute; }\",\n \".relative { position: relative; }\",\n \".isolate { isolation: isolate; }\",\n \".overflow-hidden { overflow: hidden; }\",\n \".box-border { box-sizing: border-box; }\",\n \".h-px { height: 1px; }\",\n \".h-4 { height: 1rem; }\",\n \".w-4 { width: 1rem; }\",\n \".h-5 { height: 1.25rem; }\",\n \".w-5 { width: 1.25rem; }\",\n \".shrink-0 { flex-shrink: 0; }\",\n \".shadow-2xl { box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.42); }\",\n \".antialiased { -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }\",\n \".bg-white { background-color: #ffffff; }\",\n \".text-slate-950 { color: #020617; }\",\n \".bg-slate-950 { background-color: #020617; }\",\n \".text-slate-100 { color: #f1f5f9; }\"\n].join(\"\\n \");\n\nconst renderDocumentStyles = (tailwindEnabled: boolean): string => [\n renderSurfaceTokenStyles(),\n \"html, body { min-height: 100%; }\",\n \"html { scroll-behavior: smooth; }\",\n \"body { margin: 0; font-family: \\\"Segoe UI\\\", sans-serif; background: var(--surface-bg); color: var(--surface-text); }\",\n \".odb-canvas-root { display: grid; gap: 32px; padding: 32px; place-items: center; }\",\n \".odb-canvas-page { width: 100%; display: grid; place-items: center; }\",\n \".odb-canvas-page-surface, .odb-canvas-surface { position: relative; overflow: hidden; isolation: isolate; }\",\n \".odb-canvas-node { box-sizing: border-box; margin: 0; }\",\n \".odb-canvas-component-button { display: inline-flex; align-items: center; justify-content: center; gap: 0.7rem; border: 0; cursor: pointer; text-align: center; }\",\n \".odb-canvas-component-badge { display: inline-flex; align-items: center; gap: 0.6rem; }\",\n \".odb-canvas-component-tabs { display: flex; align-items: center; padding: 4px; }\",\n \".odb-canvas-tabs-trigger { display: inline-flex; align-items: center; justify-content: center; gap: 0.55rem; width: 100%; min-height: 100%; border: 0; border-radius: 999px; background: rgba(15,23,42,0.06); color: inherit; font: inherit; }\",\n \".odb-canvas-component-card, .odb-canvas-component-dialog, .odb-canvas-component-motion { display: grid; gap: 0.95rem; align-content: start; }\",\n \".odb-canvas-card-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 0.9rem; }\",\n \".odb-canvas-card-title-wrap { display: grid; gap: 0.2rem; }\",\n \".odb-canvas-card-title { margin: 0; font: inherit; }\",\n \".odb-canvas-card-copy { display: grid; gap: 0.55rem; }\",\n \".odb-canvas-card-copy p { margin: 0; font-size: 0.92em; color: inherit; opacity: 0.84; }\",\n \".odb-canvas-inline-list { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem; }\",\n \".odb-canvas-inline-item { white-space: nowrap; }\",\n \".odb-canvas-label { line-height: 1.1; }\",\n \".odb-canvas-connector { border: 0; padding: 0; min-height: 2px; background: linear-gradient(90deg, transparent, rgba(15,23,42,0.24), transparent); }\",\n \".odb-canvas-media-surface { display: block; border: 0; background: rgba(15,23,42,0.04); }\",\n \".odb-canvas-media-image, .odb-canvas-media-video { width: 100%; height: 100%; object-fit: cover; }\",\n \".odb-canvas-media-audio { width: 100%; min-height: 52px; }\",\n \".odb-canvas-media-placeholder { display: inline-flex; align-items: center; justify-content: center; width: 100%; min-height: 100%; padding: 1rem; color: inherit; opacity: 0.7; font-size: 0.88rem; text-transform: capitalize; }\",\n \".odb-canvas-component-button, .odb-canvas-component-card, .odb-canvas-component-dialog, .odb-canvas-component-motion, .odb-canvas-media-surface { transition: transform 160ms ease, box-shadow 160ms ease, filter 160ms ease; }\",\n \".odb-canvas-component-button:hover, .odb-canvas-component-card:hover, .odb-canvas-component-dialog:hover, .odb-canvas-component-motion:hover, .odb-canvas-media-surface:hover { transform: translateY(-2px); filter: brightness(1.03); }\",\n \".odb-canvas-icon { display: inline-flex; align-items: center; justify-content: center; width: 1.1rem; height: 1.1rem; flex: none; }\",\n \".odb-canvas-icon svg { width: 100%; height: 100%; }\",\n \".odb-canvas-icon-fluent { color: #dbeafe; }\",\n \".odb-canvas-icon-3d { width: 1.2rem; height: 1.2rem; }\",\n \".odb-canvas-icon-orb { width: 100%; height: 100%; border-radius: 50%; background: radial-gradient(circle at 30% 25%, rgba(255,255,255,0.92), rgba(255,255,255,0) 28%), linear-gradient(145deg, #7ef9e9 0%, #22c3ee 48%, #ff7aa2 100%); box-shadow: inset -8px -8px 14px rgba(7, 17, 29, 0.18), 0 6px 14px rgba(34, 195, 238, 0.32); }\",\n \".odb-canvas-icon-emoji { font-size: 1rem; line-height: 1; }\",\n \".odb-canvas-icon-stack { display: inline-flex; align-items: center; gap: 0.45rem; }\",\n \"@media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } .odb-canvas-component-button, .odb-canvas-component-card, .odb-canvas-component-dialog, .odb-canvas-component-motion, .odb-canvas-media-surface { transition: none; } .odb-canvas-component-button:hover, .odb-canvas-component-card:hover, .odb-canvas-component-dialog:hover, .odb-canvas-component-motion:hover, .odb-canvas-media-surface:hover { transform: none; filter: none; } }\",\n ...(tailwindEnabled ? [renderTailwindUtilityStyles()] : [])\n].join(\"\\n \");\n\nexport function renderCanvasDocumentHtml(document: CanvasDocument, options: RenderHtmlOptions = {}): string {\n const tailwindEnabled = resolveCanvasLibraryPolicy(document).styling.includes(TAILWIND_STYLING_LIBRARY);\n const pageFilter = options.pageIds && options.pageIds.length > 0\n ? new Set(options.pageIds)\n : null;\n const pages = document.pages\n .filter((page) => !pageFilter || pageFilter.has(page.id))\n .map((page) => emitHtml(buildPageElement(document, page)))\n .join(\"\\n\");\n const libraryAttrs = renderLibraryAttributes(document);\n const rootAttrs = renderRootAttributes(options.rootAttributes);\n const rootClasses = appendUtilityClasses([\"odb-canvas-root\"], tailwindEnabled, [\"min-h-screen\", \"w-full\", \"bg-white\", \"text-slate-950\", \"antialiased\"]).join(\" \");\n return [\n \"<!doctype html>\",\n \"<html lang=\\\"en\\\">\",\n \"<head>\",\n \" <meta charset=\\\"utf-8\\\" />\",\n \" <meta name=\\\"viewport\\\" content=\\\"width=device-width, initial-scale=1\\\" />\",\n ...(options.baseHref ? [` <base href=\"${escapeHtml(options.baseHref)}\" />`] : []),\n ` <title>${escapeHtml(document.title)}</title>`,\n \" <style>\",\n ` ${renderDocumentStyles(tailwindEnabled)}`,\n \" </style>\",\n \"</head>\",\n \"<body>\",\n ` <main class=\\\"${rootClasses}\\\" data-document-id=\\\"${escapeHtml(document.documentId)}\\\"${libraryAttrs}${rootAttrs}>`,\n pages,\n \" </main>\",\n \"</body>\",\n \"</html>\"\n ].join(\"\\n\");\n}\n\nexport function renderCanvasDocumentComponent(document: CanvasDocument): string {\n const tailwindEnabled = resolveCanvasLibraryPolicy(document).styling.includes(TAILWIND_STYLING_LIBRARY);\n const pages = document.pages.map((page) => emitTsx(buildPageElement(document, page), 2)).join(\"\\n\");\n const libraryAttrs = renderLibraryAttributes(document);\n const rootClasses = appendUtilityClasses([\"odb-canvas-root\"], tailwindEnabled, [\"min-h-screen\", \"w-full\", \"bg-white\", \"text-slate-950\", \"antialiased\"]).join(\" \");\n return [\n \"export function OpenDevBrowserCanvasDocument() {\",\n \" return (\",\n ` <main className=\\\"${rootClasses}\\\" data-document-id=\\\"${escapeHtml(document.documentId)}\\\"${libraryAttrs}>`,\n pages,\n \" </main>\",\n \" );\",\n \"}\",\n \"\"\n ].join(\"\\n\");\n}\n\nexport function renderCanvasBindingHtml(document: CanvasDocument, bindingId: string): string | null {\n const binding = document.bindings.find((entry) => entry.id === bindingId);\n if (!binding) {\n return null;\n }\n const page = document.pages.find((entry) => entry.nodes.some((node) => node.id === binding.nodeId));\n if (!page) {\n return null;\n }\n const context = buildContext(document, page);\n const root = buildNodeElement(document, context, binding.nodeId, null, true);\n return emitHtml(root as RenderElement);\n}\n\nexport function buildCanvasParityArtifact(\n document: CanvasDocument,\n bindingId: string,\n projection: CanvasParityArtifact[\"projection\"]\n): CanvasParityArtifact | null {\n const binding = document.bindings.find((entry) => entry.id === bindingId);\n if (!binding) {\n return null;\n }\n const nodeById = new Map(document.pages.flatMap((page) => page.nodes.map((node) => [node.id, node] as const)));\n const rootNode = nodeById.get(binding.nodeId);\n if (!rootNode) {\n return null;\n }\n const orderedNodes = collectBindingNodes(nodeById, rootNode.id);\n const nodes = orderedNodes.map((node) => ({\n nodeId: node.id,\n bindingId,\n text: readNodeText(node),\n childOrderHash: node.childIds.join(\"|\"),\n attributes: {\n \"data-node-id\": node.id,\n ...(typeof node.bindingRefs.primary === \"string\" ? { \"data-binding-id\": node.bindingRefs.primary } : {})\n },\n styleProjection: Object.fromEntries(\n Object.entries(node.style)\n .filter(([, value]) => typeof value === \"string\" || typeof value === \"number\")\n .map(([key, value]) => [key, String(value)])\n )\n }));\n return {\n projection,\n rootBindingId: bindingId,\n capturedAt: new Date().toISOString(),\n hierarchyHash: orderedNodes.map((node) => `${node.id}:${node.childIds.join(\",\")}`).join(\"|\"),\n nodes\n };\n}\n\nfunction collectBindingNodes(nodeById: Map<string, CanvasNode>, nodeId: string): CanvasNode[] {\n const node = nodeById.get(nodeId);\n if (!node) {\n return [];\n }\n return [node, ...node.childIds.flatMap((childId) => collectBindingNodes(nodeById, childId))];\n}\n","import { access, mkdir, readFile } from \"fs/promises\";\nimport { join, dirname, isAbsolute, resolve } from \"path\";\nimport { writeFileAtomic } from \"../utils/fs\";\nimport type { CanvasDocument } from \"./types\";\nimport type { CodeSyncManifest } from \"./code-sync/types\";\nimport { parseCodeSyncManifest } from \"./code-sync/manifest\";\n\nfunction stableValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => stableValue(entry));\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n return Object.fromEntries(\n Object.entries(value)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, entryValue]) => [key, stableValue(entryValue)])\n );\n}\n\nexport function resolveCanvasRepoPath(worktree: string, documentId: string, repoPath?: string | null): string {\n if (repoPath && repoPath.trim()) {\n return isAbsolute(repoPath) ? repoPath : resolve(worktree, repoPath);\n }\n return join(worktree, \".opendevbrowser\", \"canvas\", `${documentId}.canvas.json`);\n}\n\nexport function resolveCanvasCodeSyncManifestPath(\n worktree: string,\n documentId: string,\n bindingId: string,\n repoPath?: string | null\n): string {\n if (repoPath && repoPath.trim()) {\n return isAbsolute(repoPath) ? repoPath : resolve(worktree, repoPath);\n }\n return join(worktree, \".opendevbrowser\", \"canvas\", \"code-sync\", documentId, `${bindingId}.json`);\n}\n\nexport async function saveCanvasDocument(worktree: string, document: CanvasDocument, repoPath?: string | null): Promise<string> {\n const resolvedPath = resolveCanvasRepoPath(worktree, document.documentId, repoPath);\n await mkdir(dirname(resolvedPath), { recursive: true });\n writeFileAtomic(resolvedPath, `${JSON.stringify(stableValue(document), null, 2)}\\n`, { encoding: \"utf-8\" });\n return resolvedPath;\n}\n\nexport async function loadCanvasDocument(worktree: string, repoPath: string): Promise<CanvasDocument> {\n const resolvedPath = isAbsolute(repoPath) ? repoPath : resolve(worktree, repoPath);\n const raw = await readFile(resolvedPath, \"utf-8\");\n const parsed = JSON.parse(raw) as CanvasDocument;\n return parsed;\n}\n\nexport async function loadCanvasDocumentById(worktree: string, documentId: string): Promise<CanvasDocument | null> {\n const resolvedPath = resolveCanvasRepoPath(worktree, documentId);\n try {\n await access(resolvedPath);\n } catch {\n return null;\n }\n return await loadCanvasDocument(worktree, resolvedPath);\n}\n\nexport async function saveCanvasCodeSyncManifest(\n worktree: string,\n manifest: CodeSyncManifest,\n repoPath?: string | null\n): Promise<string> {\n const resolvedPath = resolveCanvasCodeSyncManifestPath(worktree, manifest.documentId, manifest.bindingId, repoPath);\n await mkdir(dirname(resolvedPath), { recursive: true });\n writeFileAtomic(resolvedPath, `${JSON.stringify(stableValue(manifest), null, 2)}\\n`, { encoding: \"utf-8\" });\n return resolvedPath;\n}\n\nexport async function loadCanvasCodeSyncManifest(\n worktree: string,\n documentId: string,\n bindingId: string,\n repoPath?: string | null\n): Promise<CodeSyncManifest | null> {\n const resolvedPath = resolveCanvasCodeSyncManifestPath(worktree, documentId, bindingId, repoPath);\n try {\n const raw = await readFile(resolvedPath, \"utf-8\");\n return parseCodeSyncManifest(JSON.parse(raw));\n } catch {\n return null;\n }\n}\n","import type {\n CodeSyncManifest,\n CodeSyncManifestNodeMapping,\n CodeSyncRootLocator,\n CodeSyncSourceLocator\n} from \"./types\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nfunction readNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction normalizeSourceLocator(value: unknown): CodeSyncSourceLocator {\n if (!isRecord(value)) {\n throw new Error(\"Invalid code sync locator.\");\n }\n const sourceSpan = isRecord(value.sourceSpan) ? value.sourceSpan : null;\n const start = sourceSpan && isRecord(sourceSpan.start) ? sourceSpan.start : null;\n const end = sourceSpan && isRecord(sourceSpan.end) ? sourceSpan.end : null;\n const sourcePath = typeof value.sourcePath === \"string\" ? value.sourcePath : \"\";\n const astPath = typeof value.astPath === \"string\" ? value.astPath : \"\";\n if (!sourcePath || !astPath || !start || !end) {\n throw new Error(\"Invalid code sync locator.\");\n }\n const startOffset = readNumber(start.offset);\n const startLine = readNumber(start.line);\n const startColumn = readNumber(start.column);\n const endOffset = readNumber(end.offset);\n const endLine = readNumber(end.line);\n const endColumn = readNumber(end.column);\n if (\n startOffset === null\n || startLine === null\n || startColumn === null\n || endOffset === null\n || endLine === null\n || endColumn === null\n ) {\n throw new Error(\"Invalid code sync locator positions.\");\n }\n return {\n sourcePath,\n astPath,\n sourceSpan: {\n start: { offset: startOffset, line: startLine, column: startColumn },\n end: { offset: endOffset, line: endLine, column: endColumn }\n }\n };\n}\n\nfunction normalizeNodeMappings(value: unknown): CodeSyncManifestNodeMapping[] {\n if (!Array.isArray(value)) {\n return [];\n }\n const mappings: CodeSyncManifestNodeMapping[] = [];\n for (const entry of value) {\n if (!isRecord(entry) || typeof entry.nodeId !== \"string\") {\n continue;\n }\n mappings.push({\n nodeId: entry.nodeId,\n locator: normalizeSourceLocator(entry.locator)\n });\n }\n return mappings;\n}\n\nexport function normalizeCodeSyncManifest(input: CodeSyncManifest): CodeSyncManifest {\n return {\n bindingId: input.bindingId,\n documentId: input.documentId,\n repoPath: input.repoPath,\n adapter: input.adapter,\n rootLocator: normalizeRootLocator(input.rootLocator),\n sourceHash: input.sourceHash,\n documentRevision: input.documentRevision,\n nodeMappings: normalizeNodeMappings(input.nodeMappings),\n lastImportedAt: input.lastImportedAt,\n lastPushedAt: input.lastPushedAt\n };\n}\n\nexport function normalizeRootLocator(value: CodeSyncRootLocator | Record<string, unknown> | undefined): CodeSyncRootLocator {\n const source = isRecord(value) ? value : {};\n const exportName = typeof source.exportName === \"string\" && source.exportName.trim().length > 0 ? source.exportName : undefined;\n const selector = typeof source.selector === \"string\" && source.selector.trim().length > 0 ? source.selector : undefined;\n return { exportName, selector };\n}\n\nexport function parseCodeSyncManifest(input: unknown): CodeSyncManifest {\n if (!isRecord(input)) {\n throw new Error(\"Invalid code sync manifest payload.\");\n }\n const bindingId = typeof input.bindingId === \"string\" ? input.bindingId : \"\";\n const documentId = typeof input.documentId === \"string\" ? input.documentId : \"\";\n const repoPath = typeof input.repoPath === \"string\" ? input.repoPath : \"\";\n const adapter = typeof input.adapter === \"string\" ? input.adapter : \"\";\n const sourceHash = typeof input.sourceHash === \"string\" ? input.sourceHash : \"\";\n const documentRevision = readNumber(input.documentRevision);\n if (!bindingId || !documentId || !repoPath || !adapter || !sourceHash || documentRevision === null) {\n throw new Error(\"Invalid code sync manifest payload.\");\n }\n return normalizeCodeSyncManifest({\n bindingId,\n documentId,\n repoPath,\n adapter,\n rootLocator: normalizeRootLocator(isRecord(input.rootLocator) ? input.rootLocator : undefined),\n sourceHash,\n documentRevision,\n nodeMappings: normalizeNodeMappings(input.nodeMappings),\n lastImportedAt: typeof input.lastImportedAt === \"string\" ? input.lastImportedAt : undefined,\n lastPushedAt: typeof input.lastPushedAt === \"string\" ? input.lastPushedAt : undefined\n } as CodeSyncManifest);\n}\n","import { readFile } from \"fs/promises\";\nimport { watch, type FSWatcher } from \"fs\";\nimport { resolve, isAbsolute } from \"path\";\nimport type { CanvasBinding, CanvasDocument, CanvasPatch } from \"../canvas/types\";\nimport {\n loadCanvasCodeSyncManifest,\n saveCanvasCodeSyncManifest\n} from \"../canvas/repo-store\";\nimport { applyCanvasToTsx } from \"../canvas/code-sync/apply-tsx\";\nimport { hashCodeSyncValue } from \"../canvas/code-sync/hash\";\nimport { importCodeSyncGraph } from \"../canvas/code-sync/import\";\nimport { finalizeCodeSyncManifest, writeCodeSyncSource } from \"../canvas/code-sync/write\";\nimport { parseTsxCodeSyncBinding } from \"../canvas/code-sync/tsx-adapter\";\nimport type {\n CanvasCodeSyncBindingMetadata,\n CodeSyncBindingStatus,\n CodeSyncConflict,\n CodeSyncDriftState,\n CodeSyncManifest,\n CodeSyncResolutionPolicy,\n CodeSyncSessionStatus,\n CodeSyncState,\n CodeSyncUnsupportedFragment,\n CodeSyncWatchState\n} from \"../canvas/code-sync/types\";\n\ntype WatchContext = {\n watcher: FSWatcher;\n debounceTimer: NodeJS.Timeout | null;\n lastSourceHash: string | null;\n};\n\ntype BindingRuntimeState = {\n status: CodeSyncBindingStatus;\n manifest: CodeSyncManifest | null;\n conflicts: CodeSyncConflict[];\n unsupportedRegions: CodeSyncUnsupportedFragment[];\n watch: WatchContext | null;\n};\n\ntype SessionRuntimeState = {\n state: CodeSyncState;\n driftState: CodeSyncDriftState;\n bindings: Map<string, BindingRuntimeState>;\n lastImportAt?: string;\n lastPushAt?: string;\n};\n\ntype ApplyPatches = (patches: CanvasPatch[]) => Promise<{ documentRevision: number }>;\n\nexport type CanvasCodeSyncPullResult =\n | {\n ok: true;\n bindingStatus: CodeSyncBindingStatus;\n manifest: CodeSyncManifest;\n patchesApplied: number;\n changedNodeIds: string[];\n unsupportedRegions: CodeSyncUnsupportedFragment[];\n documentRevision: number;\n repoPath: string;\n }\n | {\n ok: false;\n bindingStatus: CodeSyncBindingStatus;\n conflicts: CodeSyncConflict[];\n };\n\nexport type CanvasCodeSyncPushResult =\n | {\n ok: true;\n bindingStatus: CodeSyncBindingStatus;\n manifest: CodeSyncManifest;\n changedNodeIds: string[];\n repoPath: string;\n }\n | {\n ok: false;\n bindingStatus: CodeSyncBindingStatus;\n conflicts: CodeSyncConflict[];\n };\n\nexport class CanvasCodeSyncManager {\n private readonly worktree: string;\n private readonly onWatchedSourceChanged: (canvasSessionId: string, bindingId: string) => Promise<void>;\n private readonly sessions = new Map<string, SessionRuntimeState>();\n\n constructor(options: {\n worktree: string;\n onWatchedSourceChanged: (canvasSessionId: string, bindingId: string) => Promise<void>;\n }) {\n this.worktree = options.worktree;\n this.onWatchedSourceChanged = options.onWatchedSourceChanged;\n }\n\n async bind(options: {\n canvasSessionId: string;\n document: CanvasDocument;\n documentRevision: number;\n binding: CanvasBinding;\n }): Promise<CodeSyncBindingStatus> {\n const metadata = requireCodeSyncMetadata(options.binding);\n const runtime = this.ensureBindingState(options.canvasSessionId, options.binding);\n runtime.manifest = await loadCanvasCodeSyncManifest(\n this.worktree,\n options.document.documentId,\n options.binding.id\n );\n runtime.status = await this.refreshBindingStatus(\n options.canvasSessionId,\n options.document.documentId,\n options.binding,\n runtime,\n options.documentRevision\n );\n this.ensureWatch(options.canvasSessionId, options.binding, runtime);\n return runtime.status;\n }\n\n unbind(canvasSessionId: string, bindingId: string): void {\n const session = this.sessions.get(canvasSessionId);\n const runtime = session?.bindings.get(bindingId);\n runtime?.watch?.watcher.close();\n if (runtime?.watch?.debounceTimer) {\n clearTimeout(runtime.watch.debounceTimer);\n }\n session?.bindings.delete(bindingId);\n this.recomputeSession(canvasSessionId);\n }\n\n async getBindingStatus(\n canvasSessionId: string,\n documentId: string,\n binding: CanvasBinding,\n documentRevision: number\n ): Promise<CodeSyncBindingStatus> {\n const runtime = this.ensureBindingState(canvasSessionId, binding);\n runtime.status = await this.refreshBindingStatus(canvasSessionId, documentId, binding, runtime, documentRevision);\n return runtime.status;\n }\n\n getSessionStatus(\n canvasSessionId: string,\n attachedClients: number,\n leaseHolderClientId: string | null\n ): CodeSyncSessionStatus {\n const session = this.ensureSession(canvasSessionId);\n const bindings = [...session.bindings.values()].map((entry) => entry.status);\n return {\n state: session.state,\n boundFiles: unique(bindings.map((entry) => entry.repoPath)),\n attachedClients,\n activeLeaseHolder: leaseHolderClientId,\n watchState: bindings.some((entry) => entry.watchEnabled) ? \"watching\" : \"idle\",\n lastImportAt: session.lastImportAt,\n lastPushAt: session.lastPushAt,\n conflictCount: bindings.reduce((sum, entry) => sum + entry.conflictCount, 0),\n driftState: session.driftState,\n bindings\n };\n }\n\n async pull(options: {\n canvasSessionId: string;\n document: CanvasDocument;\n documentRevision: number;\n binding: CanvasBinding;\n resolutionPolicy?: CodeSyncResolutionPolicy;\n applyPatches: ApplyPatches;\n }): Promise<CanvasCodeSyncPullResult> {\n const runtime = this.ensureBindingState(options.canvasSessionId, options.binding);\n runtime.status = { ...runtime.status, state: \"pull_pending\" };\n this.recomputeSession(options.canvasSessionId);\n\n const metadata = requireCodeSyncMetadata(options.binding);\n const repoPath = resolveRepoPath(this.worktree, metadata.repoPath);\n const sourceText = await readFile(repoPath, \"utf-8\");\n const sourceHash = hashCodeSyncValue(sourceText);\n runtime.manifest = await loadCanvasCodeSyncManifest(\n this.worktree,\n options.document.documentId,\n options.binding.id\n );\n\n const resolutionPolicy = options.resolutionPolicy ?? \"manual\";\n const conflicts = detectBidirectionalConflicts(runtime.manifest, sourceHash, options.documentRevision, options.binding.id, resolutionPolicy);\n if (conflicts.length > 0) {\n runtime.conflicts = conflicts;\n runtime.status = {\n ...runtime.status,\n state: \"conflict\",\n driftState: \"conflict\",\n conflictCount: conflicts.length\n };\n this.recomputeSession(options.canvasSessionId);\n return { ok: false, bindingStatus: runtime.status, conflicts };\n }\n\n const parsed = parseTsxCodeSyncBinding(sourceText, repoPath, options.binding.id, metadata);\n const imported = importCodeSyncGraph({\n document: options.document,\n binding: options.binding,\n documentRevision: options.documentRevision,\n graph: parsed.graph,\n manifest: runtime.manifest\n });\n const applied = await options.applyPatches(imported.patches);\n const manifest = finalizeCodeSyncManifest(imported.manifest, {\n sourceHash: imported.manifest.sourceHash,\n documentRevision: applied.documentRevision,\n lastImportedAt: imported.manifest.lastImportedAt,\n lastPushedAt: imported.manifest.lastPushedAt\n });\n await saveCanvasCodeSyncManifest(this.worktree, manifest);\n runtime.manifest = manifest;\n runtime.conflicts = [];\n runtime.unsupportedRegions = imported.unsupportedRegions;\n runtime.status = {\n ...buildBindingStatus(options.binding, {\n state: imported.unsupportedRegions.length > 0 ? \"unsupported\" : \"in_sync\",\n driftState: \"clean\",\n watchEnabled: metadata.syncMode === \"watch\",\n lastImportedAt: manifest.lastImportedAt,\n lastPushedAt: manifest.lastPushedAt,\n conflictCount: 0,\n unsupportedCount: imported.unsupportedRegions.length\n })\n };\n if (runtime.watch) {\n runtime.watch.lastSourceHash = manifest.sourceHash;\n }\n const session = this.ensureSession(options.canvasSessionId);\n session.lastImportAt = manifest.lastImportedAt;\n session.state = runtime.status.state;\n session.driftState = runtime.status.driftState;\n this.ensureWatch(options.canvasSessionId, options.binding, runtime);\n this.recomputeSession(options.canvasSessionId);\n return {\n ok: true,\n bindingStatus: runtime.status,\n manifest,\n patchesApplied: imported.patches.length,\n changedNodeIds: imported.changedNodeIds,\n unsupportedRegions: imported.unsupportedRegions,\n documentRevision: applied.documentRevision,\n repoPath\n };\n }\n\n async push(options: {\n canvasSessionId: string;\n document: CanvasDocument;\n documentRevision: number;\n binding: CanvasBinding;\n resolutionPolicy?: CodeSyncResolutionPolicy;\n }): Promise<CanvasCodeSyncPushResult> {\n const runtime = this.ensureBindingState(options.canvasSessionId, options.binding);\n runtime.status = { ...runtime.status, state: \"push_pending\" };\n this.recomputeSession(options.canvasSessionId);\n\n const metadata = requireCodeSyncMetadata(options.binding);\n const repoPath = resolveRepoPath(this.worktree, metadata.repoPath);\n const sourceText = await readFile(repoPath, \"utf-8\");\n runtime.manifest = await loadCanvasCodeSyncManifest(\n this.worktree,\n options.document.documentId,\n options.binding.id\n );\n if (!runtime.manifest) {\n const conflicts = [{\n kind: \"unsupported_change\",\n bindingId: options.binding.id,\n message: \"No existing code-sync manifest found. Run canvas.code.pull first.\"\n }] satisfies CodeSyncConflict[];\n runtime.conflicts = conflicts;\n runtime.status = {\n ...runtime.status,\n state: \"conflict\",\n driftState: \"conflict\",\n conflictCount: conflicts.length\n };\n this.recomputeSession(options.canvasSessionId);\n return { ok: false, bindingStatus: runtime.status, conflicts };\n }\n\n const applied = applyCanvasToTsx({\n document: options.document,\n binding: options.binding,\n manifest: runtime.manifest,\n sourceText,\n resolutionPolicy: options.resolutionPolicy\n });\n if (!applied.ok) {\n runtime.conflicts = applied.conflicts;\n runtime.status = {\n ...runtime.status,\n state: \"conflict\",\n driftState: \"conflict\",\n conflictCount: applied.conflicts.length\n };\n this.recomputeSession(options.canvasSessionId);\n return { ok: false, bindingStatus: runtime.status, conflicts: applied.conflicts };\n }\n\n await writeCodeSyncSource(repoPath, applied.nextSource);\n const manifest = finalizeCodeSyncManifest({\n ...runtime.manifest,\n nodeMappings: applied.nodeMappings\n }, {\n sourceHash: applied.sourceHash,\n documentRevision: options.documentRevision,\n lastImportedAt: runtime.manifest.lastImportedAt,\n lastPushedAt: new Date().toISOString()\n });\n await saveCanvasCodeSyncManifest(this.worktree, manifest);\n runtime.manifest = manifest;\n runtime.conflicts = [];\n runtime.unsupportedRegions = [];\n runtime.status = buildBindingStatus(options.binding, {\n state: \"in_sync\",\n driftState: \"clean\",\n watchEnabled: metadata.syncMode === \"watch\",\n lastImportedAt: manifest.lastImportedAt,\n lastPushedAt: manifest.lastPushedAt,\n conflictCount: 0,\n unsupportedCount: 0\n });\n if (runtime.watch) {\n runtime.watch.lastSourceHash = manifest.sourceHash;\n }\n const session = this.ensureSession(options.canvasSessionId);\n session.lastPushAt = manifest.lastPushedAt;\n session.state = runtime.status.state;\n session.driftState = runtime.status.driftState;\n this.ensureWatch(options.canvasSessionId, options.binding, runtime);\n this.recomputeSession(options.canvasSessionId);\n return {\n ok: true,\n bindingStatus: runtime.status,\n manifest,\n changedNodeIds: applied.changedNodeIds,\n repoPath\n };\n }\n\n async resolve(options: {\n canvasSessionId: string;\n document: CanvasDocument;\n documentRevision: number;\n binding: CanvasBinding;\n resolutionPolicy: CodeSyncResolutionPolicy;\n applyPatches: ApplyPatches;\n }): Promise<CanvasCodeSyncPullResult | CanvasCodeSyncPushResult> {\n if (options.resolutionPolicy === \"manual\") {\n const status = await this.getBindingStatus(\n options.canvasSessionId,\n options.document.documentId,\n options.binding,\n options.documentRevision\n );\n return {\n ok: false,\n bindingStatus: {\n ...status,\n state: \"conflict\",\n driftState: \"conflict\"\n },\n conflicts: [{\n kind: \"ownership_violation\",\n bindingId: options.binding.id,\n message: \"Manual conflict resolution is not automatable. Choose prefer_code or prefer_canvas.\"\n }]\n };\n }\n return options.resolutionPolicy === \"prefer_code\"\n ? await this.pull(options)\n : await this.push(options);\n }\n\n disposeSession(canvasSessionId: string): void {\n const session = this.sessions.get(canvasSessionId);\n if (!session) {\n return;\n }\n for (const runtime of session.bindings.values()) {\n runtime.watch?.watcher.close();\n if (runtime.watch?.debounceTimer) {\n clearTimeout(runtime.watch.debounceTimer);\n }\n }\n this.sessions.delete(canvasSessionId);\n }\n\n private ensureSession(canvasSessionId: string): SessionRuntimeState {\n let session = this.sessions.get(canvasSessionId);\n if (!session) {\n session = {\n state: \"idle\",\n driftState: \"clean\",\n bindings: new Map()\n };\n this.sessions.set(canvasSessionId, session);\n }\n return session;\n }\n\n private ensureBindingState(canvasSessionId: string, binding: CanvasBinding): BindingRuntimeState {\n const session = this.ensureSession(canvasSessionId);\n let runtime = session.bindings.get(binding.id);\n if (!runtime) {\n runtime = {\n status: buildBindingStatus(binding, {\n state: \"idle\",\n driftState: \"clean\",\n watchEnabled: binding.codeSync?.syncMode === \"watch\",\n conflictCount: 0,\n unsupportedCount: 0\n }),\n manifest: null,\n conflicts: [],\n unsupportedRegions: [],\n watch: null\n };\n session.bindings.set(binding.id, runtime);\n }\n return runtime;\n }\n\n private async refreshBindingStatus(\n canvasSessionId: string,\n documentId: string,\n binding: CanvasBinding,\n runtime: BindingRuntimeState,\n documentRevision: number\n ): Promise<CodeSyncBindingStatus> {\n const metadata = requireCodeSyncMetadata(binding);\n const repoPath = resolveRepoPath(this.worktree, metadata.repoPath);\n let driftState: CodeSyncDriftState = runtime.status.driftState;\n let state: CodeSyncState = runtime.status.state;\n try {\n const sourceHash = hashCodeSyncValue(await readFile(repoPath, \"utf-8\"));\n if (!runtime.manifest) {\n runtime.manifest = await loadCanvasCodeSyncManifest(this.worktree, documentId, binding.id);\n }\n if (runtime.manifest) {\n const sourceChanged = runtime.manifest.sourceHash !== sourceHash;\n const documentChanged = runtime.manifest.documentRevision !== documentRevision;\n driftState = sourceChanged && documentChanged ? \"conflict\" : sourceChanged ? \"source_changed\" : documentChanged ? \"document_changed\" : \"clean\";\n if (driftState === \"clean\") {\n state = runtime.unsupportedRegions.length > 0 ? \"unsupported\" : \"in_sync\";\n } else if (driftState === \"conflict\") {\n state = \"conflict\";\n } else {\n state = \"drift_detected\";\n }\n }\n } catch {\n driftState = \"source_changed\";\n state = \"drift_detected\";\n }\n runtime.status = buildBindingStatus(binding, {\n state,\n driftState,\n watchEnabled: metadata.syncMode === \"watch\",\n lastImportedAt: runtime.manifest?.lastImportedAt,\n lastPushedAt: runtime.manifest?.lastPushedAt,\n conflictCount: runtime.conflicts.length,\n unsupportedCount: runtime.unsupportedRegions.length\n });\n this.recomputeSession(canvasSessionId);\n return runtime.status;\n }\n\n private ensureWatch(canvasSessionId: string, binding: CanvasBinding, runtime: BindingRuntimeState): void {\n const metadata = binding.codeSync;\n if (!metadata || metadata.syncMode !== \"watch\" || runtime.watch) {\n return;\n }\n const repoPath = resolveRepoPath(this.worktree, metadata.repoPath);\n const watcher = watch(repoPath, () => {\n const watchState = runtime.watch;\n if (!watchState) {\n return;\n }\n if (watchState.debounceTimer) {\n clearTimeout(watchState.debounceTimer);\n }\n watchState.debounceTimer = setTimeout(async () => {\n try {\n const nextSource = await readFile(repoPath, \"utf-8\");\n const nextHash = hashCodeSyncValue(nextSource);\n if (watchState.lastSourceHash && watchState.lastSourceHash === nextHash) {\n return;\n }\n watchState.lastSourceHash = nextHash;\n await this.onWatchedSourceChanged(canvasSessionId, binding.id);\n } catch {\n runtime.status = {\n ...runtime.status,\n state: \"drift_detected\",\n driftState: \"source_changed\"\n };\n this.recomputeSession(canvasSessionId);\n }\n }, 150);\n });\n runtime.watch = {\n watcher,\n debounceTimer: null,\n lastSourceHash: runtime.manifest?.sourceHash ?? null\n };\n }\n\n private recomputeSession(canvasSessionId: string): void {\n const session = this.sessions.get(canvasSessionId);\n if (!session) {\n return;\n }\n const bindings = [...session.bindings.values()].map((entry) => entry.status);\n session.lastImportAt = maxIso(bindings.map((entry) => entry.lastImportedAt));\n session.lastPushAt = maxIso(bindings.map((entry) => entry.lastPushedAt));\n if (bindings.some((entry) => entry.state === \"conflict\")) {\n session.state = \"conflict\";\n session.driftState = \"conflict\";\n return;\n }\n if (bindings.some((entry) => entry.state === \"unsupported\")) {\n session.state = \"unsupported\";\n } else if (bindings.some((entry) => entry.state === \"pull_pending\")) {\n session.state = \"pull_pending\";\n } else if (bindings.some((entry) => entry.state === \"push_pending\")) {\n session.state = \"push_pending\";\n } else if (bindings.some((entry) => entry.state === \"drift_detected\")) {\n session.state = \"drift_detected\";\n } else if (bindings.some((entry) => entry.state === \"in_sync\")) {\n session.state = \"in_sync\";\n } else {\n session.state = \"idle\";\n }\n if (bindings.some((entry) => entry.driftState === \"source_changed\")) {\n session.driftState = \"source_changed\";\n } else if (bindings.some((entry) => entry.driftState === \"document_changed\")) {\n session.driftState = \"document_changed\";\n } else {\n session.driftState = \"clean\";\n }\n }\n}\n\nfunction resolveRepoPath(worktree: string, repoPath: string): string {\n return isAbsolute(repoPath) ? repoPath : resolve(worktree, repoPath);\n}\n\nfunction requireCodeSyncMetadata(binding: CanvasBinding): CanvasCodeSyncBindingMetadata {\n if (!binding.codeSync) {\n throw new Error(`Binding ${binding.id} is missing code-sync metadata.`);\n }\n return binding.codeSync;\n}\n\nfunction buildBindingStatus(\n binding: CanvasBinding,\n input: {\n state: CodeSyncState;\n driftState: CodeSyncDriftState;\n watchEnabled: boolean;\n lastImportedAt?: string;\n lastPushedAt?: string;\n conflictCount: number;\n unsupportedCount: number;\n }\n): CodeSyncBindingStatus {\n const metadata = requireCodeSyncMetadata(binding);\n return {\n bindingId: binding.id,\n nodeId: binding.nodeId,\n repoPath: metadata.repoPath,\n adapter: metadata.adapter,\n syncMode: metadata.syncMode,\n projection: metadata.projection ?? \"canvas_html\",\n state: input.state,\n driftState: input.driftState,\n watchEnabled: input.watchEnabled,\n lastImportedAt: input.lastImportedAt,\n lastPushedAt: input.lastPushedAt,\n conflictCount: input.conflictCount,\n unsupportedCount: input.unsupportedCount\n };\n}\n\nfunction detectBidirectionalConflicts(\n manifest: CodeSyncManifest | null,\n sourceHash: string,\n documentRevision: number,\n bindingId: string,\n resolutionPolicy: CodeSyncResolutionPolicy\n): CodeSyncConflict[] {\n if (!manifest || resolutionPolicy !== \"manual\") {\n return [];\n }\n const sourceChanged = manifest.sourceHash !== sourceHash;\n const documentChanged = manifest.documentRevision !== documentRevision;\n if (!sourceChanged || !documentChanged) {\n return [];\n }\n return [\n {\n kind: \"source_hash_changed\",\n bindingId,\n message: \"Source changed since the last code-sync baseline.\"\n },\n {\n kind: \"document_revision_changed\",\n bindingId,\n message: \"Canvas document changed since the last code-sync baseline.\"\n }\n ];\n}\n\nfunction unique(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction maxIso(values: Array<string | undefined>): string | undefined {\n return values.filter((value): value is string => typeof value === \"string\").sort().at(-1);\n}\n","import * as ts from \"typescript\";\nimport type { CanvasBinding, CanvasDocument, CanvasNode } from \"../types\";\nimport { hashCodeSyncValue } from \"./hash\";\nimport { parseTsxCodeSyncBinding } from \"./tsx-adapter\";\nimport type {\n CodeSyncConflict,\n CodeSyncGraph,\n CodeSyncManifest,\n CodeSyncManifestNodeMapping,\n CodeSyncResolutionPolicy\n} from \"./types\";\n\ntype ApplyCanvasToTsxResult =\n | {\n ok: true;\n nextSource: string;\n sourceHash: string;\n graph: CodeSyncGraph;\n nodeMappings: CodeSyncManifestNodeMapping[];\n changedNodeIds: string[];\n }\n | {\n ok: false;\n conflicts: CodeSyncConflict[];\n };\n\ntype ApplyCanvasToTsxOptions = {\n document: CanvasDocument;\n binding: CanvasBinding;\n manifest: CodeSyncManifest;\n sourceText: string;\n resolutionPolicy?: CodeSyncResolutionPolicy;\n};\n\nconst CODE_SYNC_MARKER_ATTRIBUTES = new Set([\"data-node-id\", \"data-binding-id\"]);\n\nfunction findNode(document: CanvasDocument, nodeId: string): CanvasNode {\n for (const page of document.pages) {\n const match = page.nodes.find((node) => node.id === nodeId);\n if (match) {\n return match;\n }\n }\n throw new Error(`Unknown canvas node: ${nodeId}`);\n}\n\nfunction collectSubtree(document: CanvasDocument, nodeId: string): CanvasNode[] {\n const root = findNode(document, nodeId);\n const nodes = [root];\n for (const childId of root.childIds) {\n nodes.push(...collectSubtree(document, childId));\n }\n return nodes;\n}\n\nfunction escapeJsxText(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction stringifyStyle(style: Record<string, unknown>): string | null {\n const entries = Object.entries(style)\n .filter(([, value]) => typeof value === \"string\" || typeof value === \"number\")\n .map(([key, value]) => `${key}: ${JSON.stringify(value)}`);\n return entries.length > 0 ? `{{ ${entries.join(\", \")} }}` : null;\n}\n\nfunction isCodeSyncMarkerAttribute(name: string): boolean {\n return CODE_SYNC_MARKER_ATTRIBUTES.has(name.trim());\n}\n\nfunction isCodeSyncMarkerJsxAttribute(rawAttribute: string): boolean {\n return /^\\s*data-(?:node|binding)-id\\b/.test(rawAttribute);\n}\n\nfunction emitAttributes(node: CanvasNode, bindingId: string): string[] {\n const attributes = isRecord(node.props.attributes) ? { ...node.props.attributes } : {};\n const className = typeof node.props.className === \"string\" ? node.props.className : null;\n const metadata = isRecord(node.metadata.codeSync) ? node.metadata.codeSync : {};\n const preserved = Array.isArray(metadata.preservedAttributes)\n ? metadata.preservedAttributes.filter((entry): entry is string =>\n typeof entry === \"string\" &&\n entry.trim().length > 0 &&\n !isCodeSyncMarkerJsxAttribute(entry)\n )\n : [];\n const parts: string[] = [];\n if (className) {\n parts.push(`className=${escapeJsxText(className)}`);\n }\n const style = stringifyStyle(node.style);\n if (style) {\n parts.push(`style=${style}`);\n }\n for (const [key, value] of Object.entries(attributes)) {\n if (typeof value === \"string\" && !isCodeSyncMarkerAttribute(key)) {\n parts.push(`${key}=${escapeJsxText(value)}`);\n }\n }\n parts.push(`data-node-id=${escapeJsxText(node.id)}`);\n if (node.id === bindingId || node.bindingRefs.primary === bindingId) {\n parts.push(`data-binding-id=${escapeJsxText(bindingId)}`);\n }\n parts.push(...preserved);\n return parts;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction emitNode(document: CanvasDocument, nodeId: string, bindingId: string, order: string[]): string {\n const node = findNode(document, nodeId);\n order.push(node.id);\n const metadata = isRecord(node.metadata.codeSync) ? node.metadata.codeSync : {};\n const tagName = typeof metadata.tagName === \"string\" ? metadata.tagName : typeof node.props.tagName === \"string\" ? node.props.tagName : \"div\";\n if (typeof metadata.unsupportedReason === \"string\" && metadata.unsupportedReason.length > 0) {\n throw new Error(`Unsupported code sync node ${node.id}: ${metadata.unsupportedReason}`);\n }\n if (node.kind === \"text\") {\n return `{${escapeJsxText(typeof node.props.text === \"string\" ? node.props.text : node.name)}}`;\n }\n const attributes = emitAttributes(node, bindingId);\n if (node.childIds.length === 0) {\n return `<${tagName} ${attributes.join(\" \")} />`;\n }\n const children = node.childIds.map((childId) => emitNode(document, childId, bindingId, order)).join(\"\");\n return `<${tagName} ${attributes.join(\" \")}>${children}</${tagName}>`;\n}\n\nfunction rootMapping(manifest: CodeSyncManifest, bindingId: string): CodeSyncManifestNodeMapping | null {\n return manifest.nodeMappings.find((entry) => entry.nodeId === bindingId) ?? null;\n}\n\nexport function applyCanvasToTsx(options: ApplyCanvasToTsxOptions): ApplyCanvasToTsxResult {\n const resolutionPolicy = options.resolutionPolicy ?? \"manual\";\n const currentSourceHash = hashCodeSyncValue(options.sourceText);\n if (currentSourceHash !== options.manifest.sourceHash && resolutionPolicy !== \"prefer_canvas\") {\n return {\n ok: false,\n conflicts: [{\n kind: \"source_hash_changed\",\n bindingId: options.binding.id,\n message: \"Source file changed since the last code-sync baseline.\",\n details: {\n expectedSourceHash: options.manifest.sourceHash,\n actualSourceHash: currentSourceHash\n }\n }]\n };\n }\n const mapping = rootMapping(options.manifest, options.binding.nodeId);\n if (!mapping) {\n return {\n ok: false,\n conflicts: [{\n kind: \"unsupported_change\",\n bindingId: options.binding.id,\n nodeId: options.binding.nodeId,\n message: \"Missing root manifest mapping for the bound TSX region.\"\n }]\n };\n }\n\n const emissionOrder: string[] = [];\n let jsx: string;\n try {\n jsx = emitNode(options.document, options.binding.nodeId, options.binding.id, emissionOrder);\n } catch (error) {\n return {\n ok: false,\n conflicts: [{\n kind: \"unsupported_change\",\n bindingId: options.binding.id,\n message: error instanceof Error ? error.message : String(error)\n }]\n };\n }\n\n const nextSource = [\n options.sourceText.slice(0, mapping.locator.sourceSpan.start.offset),\n jsx,\n options.sourceText.slice(mapping.locator.sourceSpan.end.offset)\n ].join(\"\");\n\n const sourceFile = ts.createSourceFile(options.manifest.repoPath, nextSource, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);\n const diagnostics = (sourceFile as ts.SourceFile & { parseDiagnostics: readonly ts.DiagnosticWithLocation[] }).parseDiagnostics\n .filter((diagnostic: ts.DiagnosticWithLocation) => diagnostic.category === ts.DiagnosticCategory.Error);\n if (diagnostics.length > 0) {\n return {\n ok: false,\n conflicts: [{\n kind: \"unsupported_change\",\n bindingId: options.binding.id,\n message: `Generated TSX is invalid: ${ts.flattenDiagnosticMessageText(diagnostics[0]!.messageText, \"\\n\")}`\n }]\n };\n }\n\n const metadata = options.binding.codeSync;\n if (!metadata) {\n return {\n ok: false,\n conflicts: [{\n kind: \"unsupported_change\",\n bindingId: options.binding.id,\n message: \"Binding is missing code-sync metadata.\"\n }]\n };\n }\n\n const parsed = parseTsxCodeSyncBinding(nextSource, options.manifest.repoPath, options.binding.id, metadata);\n const graphOrder = collectGraphOrder(parsed.graph, parsed.graph.rootKey);\n if (graphOrder.length !== emissionOrder.length) {\n return {\n ok: false,\n conflicts: [{\n kind: \"unsupported_change\",\n bindingId: options.binding.id,\n message: \"Re-parsed TSX graph drifted from the emitted canvas subtree.\"\n }]\n };\n }\n\n const nodeMappings = graphOrder.map((graphNode, index) => ({\n nodeId: emissionOrder[index] as string,\n locator: graphNode.locator\n }));\n\n return {\n ok: true,\n nextSource,\n sourceHash: hashCodeSyncValue(nextSource),\n graph: parsed.graph,\n nodeMappings,\n changedNodeIds: [...emissionOrder]\n };\n}\n\nfunction collectGraphOrder(graph: CodeSyncGraph, nodeKey: string): Array<CodeSyncGraph[\"nodes\"][string]> {\n const node = graph.nodes[nodeKey];\n if (!node) {\n throw new Error(`Unknown graph node: ${nodeKey}`);\n }\n const ordered = [node];\n for (const childKey of node.childKeys) {\n ordered.push(...collectGraphOrder(graph, childKey));\n }\n return ordered;\n}\n","import { createHash } from \"crypto\";\n\nexport function hashCodeSyncValue(value: string): string {\n return createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nexport function hashCodeSyncJson(value: unknown): string {\n return hashCodeSyncValue(JSON.stringify(value));\n}\n","import * as ts from \"typescript\";\nimport { hashCodeSyncValue } from \"./hash\";\nimport type {\n CanvasCodeSyncBindingMetadata,\n CodeSyncGraph,\n CodeSyncNode,\n CodeSyncRootLocator,\n CodeSyncSourceLocator,\n CodeSyncUnsupportedFragment\n} from \"./types\";\n\ntype ParsedTsxBinding = {\n graph: CodeSyncGraph;\n rootLocator: CodeSyncRootLocator;\n};\n\ntype BoundJsxRoot = {\n jsx: ts.JsxElement | ts.JsxSelfClosingElement | ts.JsxFragment;\n rootLocator: CodeSyncRootLocator;\n astPath: string;\n};\n\ntype BuildState = {\n sourceFile: ts.SourceFile;\n sourceText: string;\n repoPath: string;\n bindingId: string;\n nodes: Record<string, CodeSyncNode>;\n unsupportedFragments: CodeSyncUnsupportedFragment[];\n};\n\nconst isIntrinsicTag = (tagName: ts.JsxTagNameExpression): tagName is ts.Identifier => {\n if (!ts.isIdentifier(tagName)) {\n return false;\n }\n return tagName.text === tagName.text.toLowerCase();\n};\n\nconst selectedLiteralAttribute = (name: string): boolean => ![\n \"className\",\n \"style\",\n \"data-node-id\",\n \"data-binding-id\"\n].includes(name);\n\nfunction createLocator(sourceFile: ts.SourceFile, repoPath: string, astPath: string, node: ts.Node): CodeSyncSourceLocator {\n const start = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));\n const end = sourceFile.getLineAndCharacterOfPosition(node.getEnd());\n return {\n sourcePath: repoPath,\n astPath,\n sourceSpan: {\n start: {\n offset: node.getStart(sourceFile),\n line: start.line + 1,\n column: start.character + 1\n },\n end: {\n offset: node.getEnd(),\n line: end.line + 1,\n column: end.character + 1\n }\n }\n };\n}\n\nfunction readLiteralExpression(expression: ts.Expression): string | number | null {\n if (ts.isStringLiteralLike(expression)) {\n return expression.text;\n }\n if (ts.isNumericLiteral(expression)) {\n return Number(expression.text);\n }\n if (expression.kind === ts.SyntaxKind.TrueKeyword) {\n return \"true\";\n }\n if (expression.kind === ts.SyntaxKind.FalseKeyword) {\n return \"false\";\n }\n return null;\n}\n\nfunction readStyleObject(expression: ts.Expression): Record<string, string | number> | null {\n if (!ts.isObjectLiteralExpression(expression)) {\n return null;\n }\n const style: Record<string, string | number> = {};\n for (const property of expression.properties) {\n if (!ts.isPropertyAssignment(property)) {\n return null;\n }\n const key = ts.isIdentifier(property.name) || ts.isStringLiteralLike(property.name)\n ? property.name.text\n : null;\n if (!key) {\n return null;\n }\n const value = readLiteralExpression(property.initializer);\n if (value === null) {\n return null;\n }\n style[key] = value;\n }\n return style;\n}\n\nfunction pushUnsupported(state: BuildState, reason: string, raw: string, locator?: CodeSyncSourceLocator): void {\n state.unsupportedFragments.push({\n key: `${reason}:${state.unsupportedFragments.length + 1}`,\n reason,\n raw,\n locator\n });\n}\n\nfunction buildUnsupportedNode(state: BuildState, astPath: string, node: ts.Node, reason: string): CodeSyncNode {\n const locator = createLocator(state.sourceFile, state.repoPath, astPath, node);\n const key = astPath;\n const raw = node.getText(state.sourceFile);\n pushUnsupported(state, reason, raw, locator);\n return {\n key,\n kind: \"unsupported\",\n bindingId: state.bindingId,\n locator,\n attributes: {},\n style: {},\n preservedAttributes: [],\n childKeys: [],\n raw,\n unsupportedReason: reason\n };\n}\n\nfunction buildTextNode(state: BuildState, astPath: string, node: ts.JsxText | ts.JsxExpression): CodeSyncNode | null {\n let text: string | null = null;\n if (ts.isJsxText(node)) {\n text = node.getText(state.sourceFile).replace(/\\s+/g, \" \").trim();\n } else if (node.expression) {\n const literal = readLiteralExpression(node.expression);\n if (literal !== null) {\n text = String(literal);\n }\n }\n if (!text) {\n return null;\n }\n const locator = createLocator(state.sourceFile, state.repoPath, astPath, node);\n return {\n key: astPath,\n kind: \"text\",\n bindingId: state.bindingId,\n locator,\n text,\n attributes: {},\n style: {},\n preservedAttributes: [],\n childKeys: []\n };\n}\n\nfunction walkJsx(state: BuildState, astPath: string, node: ts.JsxChild | ts.JsxElement | ts.JsxSelfClosingElement | ts.JsxFragment): CodeSyncNode {\n if (ts.isJsxText(node) || ts.isJsxExpression(node)) {\n const textNode = buildTextNode(state, astPath, node);\n if (textNode) {\n state.nodes[textNode.key] = textNode;\n return textNode;\n }\n const unsupported = buildUnsupportedNode(state, astPath, node, \"unsupported_jsx_expression\");\n state.nodes[unsupported.key] = unsupported;\n return unsupported;\n }\n\n if (ts.isJsxFragment(node)) {\n const locator = createLocator(state.sourceFile, state.repoPath, astPath, node);\n const fragmentNode: CodeSyncNode = {\n key: astPath,\n kind: \"element\",\n bindingId: state.bindingId,\n locator,\n tagName: \"fragment\",\n attributes: {},\n style: {},\n preservedAttributes: [],\n childKeys: []\n };\n node.children.forEach((child, index) => {\n const childNode = walkJsx(state, `${astPath}.child.${index}`, child);\n fragmentNode.childKeys.push(childNode.key);\n });\n state.nodes[fragmentNode.key] = fragmentNode;\n return fragmentNode;\n }\n\n const opening = ts.isJsxElement(node) ? node.openingElement : node;\n if (!isIntrinsicTag(opening.tagName)) {\n const unsupported = buildUnsupportedNode(state, astPath, node, \"unsupported_component_tag\");\n state.nodes[unsupported.key] = unsupported;\n return unsupported;\n }\n\n const locator = createLocator(state.sourceFile, state.repoPath, astPath, node);\n const elementNode: CodeSyncNode = {\n key: astPath,\n kind: \"element\",\n bindingId: state.bindingId,\n locator,\n tagName: opening.tagName.text,\n attributes: {},\n style: {},\n preservedAttributes: [],\n childKeys: []\n };\n\n for (const attribute of opening.attributes.properties) {\n if (ts.isJsxSpreadAttribute(attribute)) {\n elementNode.preservedAttributes.push(attribute.getText(state.sourceFile));\n continue;\n }\n const attributeName = ts.isIdentifier(attribute.name) || ts.isStringLiteral(attribute.name)\n ? attribute.name.text\n : attribute.name.getText(state.sourceFile);\n if (!attribute.initializer) {\n if (selectedLiteralAttribute(attributeName)) {\n elementNode.attributes[attributeName] = \"true\";\n } else {\n elementNode.preservedAttributes.push(attribute.getText(state.sourceFile));\n }\n continue;\n }\n if (ts.isStringLiteral(attribute.initializer)) {\n if (attributeName === \"className\") {\n elementNode.attributes.className = attribute.initializer.text;\n } else if (selectedLiteralAttribute(attributeName)) {\n elementNode.attributes[attributeName] = attribute.initializer.text;\n } else {\n elementNode.preservedAttributes.push(attribute.getText(state.sourceFile));\n }\n continue;\n }\n if (!ts.isJsxExpression(attribute.initializer) || !attribute.initializer.expression) {\n elementNode.preservedAttributes.push(attribute.getText(state.sourceFile));\n continue;\n }\n if (attributeName === \"style\") {\n const style = readStyleObject(attribute.initializer.expression);\n if (style) {\n elementNode.style = style;\n continue;\n }\n }\n const literal = readLiteralExpression(attribute.initializer.expression);\n if (literal !== null && selectedLiteralAttribute(attributeName)) {\n elementNode.attributes[attributeName] = String(literal);\n continue;\n }\n elementNode.preservedAttributes.push(attribute.getText(state.sourceFile));\n }\n\n if (ts.isJsxElement(node)) {\n node.children.forEach((child, index) => {\n if (ts.isJsxText(child) && child.getText(state.sourceFile).trim().length === 0) {\n return;\n }\n const childNode = walkJsx(state, `${astPath}.child.${index}`, child);\n elementNode.childKeys.push(childNode.key);\n });\n }\n\n state.nodes[elementNode.key] = elementNode;\n return elementNode;\n}\n\nfunction findBoundJsxRoot(sourceFile: ts.SourceFile, sourceText: string, metadata: CanvasCodeSyncBindingMetadata): BoundJsxRoot {\n if (!metadata.exportName) {\n throw new Error(\"tsx-react-v1 requires codeSync.exportName.\");\n }\n const exportName = metadata.exportName;\n const statements = sourceFile.statements;\n for (const statement of statements) {\n if (ts.isFunctionDeclaration(statement) && statement.name?.text === exportName) {\n const jsx = readReturnedJsx(statement.body);\n if (jsx) {\n return { jsx, rootLocator: { exportName }, astPath: `export:${exportName}` };\n }\n }\n if (ts.isVariableStatement(statement)) {\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name) || declaration.name.text !== exportName || !declaration.initializer) {\n continue;\n }\n const jsx = readReturnedJsxFromExpression(declaration.initializer);\n if (jsx) {\n return { jsx, rootLocator: { exportName }, astPath: `export:${exportName}` };\n }\n }\n }\n if (ts.isExportAssignment(statement)) {\n const jsx = readReturnedJsxFromExpression(statement.expression);\n if (jsx && exportName === \"default\") {\n return { jsx, rootLocator: { exportName }, astPath: \"export:default\" };\n }\n }\n }\n throw new Error(`Unable to locate TSX export root: ${exportName}`);\n}\n\nfunction readReturnedJsx(body: ts.Block | undefined): ts.JsxElement | ts.JsxSelfClosingElement | ts.JsxFragment | null {\n if (!body) {\n return null;\n }\n for (const statement of body.statements) {\n if (!ts.isReturnStatement(statement) || !statement.expression) {\n continue;\n }\n if (ts.isJsxElement(statement.expression) || ts.isJsxSelfClosingElement(statement.expression) || ts.isJsxFragment(statement.expression)) {\n return statement.expression;\n }\n }\n return null;\n}\n\nfunction readReturnedJsxFromExpression(\n expression: ts.Expression\n): ts.JsxElement | ts.JsxSelfClosingElement | ts.JsxFragment | null {\n if (ts.isParenthesizedExpression(expression)) {\n return readReturnedJsxFromExpression(expression.expression);\n }\n if (ts.isJsxElement(expression) || ts.isJsxSelfClosingElement(expression) || ts.isJsxFragment(expression)) {\n return expression;\n }\n if (ts.isArrowFunction(expression)) {\n if (ts.isBlock(expression.body)) {\n return readReturnedJsx(expression.body);\n }\n return readReturnedJsxFromExpression(expression.body);\n }\n if (ts.isFunctionExpression(expression)) {\n return readReturnedJsx(expression.body);\n }\n return null;\n}\n\nexport function parseTsxCodeSyncBinding(\n sourceText: string,\n repoPath: string,\n bindingId: string,\n metadata: CanvasCodeSyncBindingMetadata\n): ParsedTsxBinding {\n const sourceFile = ts.createSourceFile(repoPath, sourceText, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);\n const diagnostics = (sourceFile as ts.SourceFile & { parseDiagnostics: readonly ts.DiagnosticWithLocation[] }).parseDiagnostics\n .filter((diagnostic: ts.DiagnosticWithLocation) => diagnostic.category === ts.DiagnosticCategory.Error);\n if (diagnostics.length > 0) {\n const message = ts.flattenDiagnosticMessageText(diagnostics[0]!.messageText, \"\\n\");\n throw new Error(`TSX parse failed: ${message}`);\n }\n const boundRoot = findBoundJsxRoot(sourceFile, sourceText, metadata);\n const state: BuildState = {\n sourceFile,\n sourceText,\n repoPath,\n bindingId,\n nodes: {},\n unsupportedFragments: []\n };\n const rootNode = walkJsx(state, boundRoot.astPath, boundRoot.jsx);\n return {\n graph: {\n adapter: metadata.adapter,\n bindingId,\n repoPath,\n rootKey: rootNode.key,\n nodes: state.nodes,\n sourceHash: hashCodeSyncValue(sourceText),\n unsupportedFragments: state.unsupportedFragments\n },\n rootLocator: boundRoot.rootLocator\n };\n}\n","import { randomUUID } from \"crypto\";\nimport type { CanvasBinding, CanvasDocument, CanvasNode, CanvasPatch } from \"../types\";\nimport { buildGraphMappings, buildManifestLookup, locatorKey } from \"./graph\";\nimport type {\n CodeSyncGraph,\n CodeSyncManifest,\n CodeSyncManifestNodeMapping,\n CodeSyncUnsupportedFragment\n} from \"./types\";\n\ntype ImportCodeSyncGraphOptions = {\n document: CanvasDocument;\n binding: CanvasBinding;\n documentRevision: number;\n graph: CodeSyncGraph;\n manifest?: CodeSyncManifest | null;\n};\n\ntype ImportCodeSyncGraphResult = {\n patches: CanvasPatch[];\n manifest: CodeSyncManifest;\n unsupportedRegions: CodeSyncUnsupportedFragment[];\n changedNodeIds: string[];\n};\n\nfunction findNode(document: CanvasDocument, nodeId: string): CanvasNode {\n for (const page of document.pages) {\n const node = page.nodes.find((entry) => entry.id === nodeId);\n if (node) {\n return node;\n }\n }\n throw new Error(`Unknown canvas node: ${nodeId}`);\n}\n\nfunction collectDescendantIds(document: CanvasDocument, nodeId: string): string[] {\n const node = findNode(document, nodeId);\n const descendants: string[] = [];\n for (const childId of node.childIds) {\n descendants.push(childId);\n descendants.push(...collectDescendantIds(document, childId));\n }\n return descendants;\n}\n\nfunction toCanvasKind(graphNode: CodeSyncGraph[\"nodes\"][string]): CanvasNode[\"kind\"] {\n if (graphNode.kind === \"text\") {\n return \"text\";\n }\n if (graphNode.kind === \"unsupported\") {\n return \"dom-binding\";\n }\n if (graphNode.tagName === \"button\" || graphNode.tagName === \"input\" || graphNode.tagName === \"select\") {\n return \"component-instance\";\n }\n return \"frame\";\n}\n\nfunction buildCanvasNodeMetadata(graphNode: CodeSyncGraph[\"nodes\"][string]): Record<string, unknown> {\n const attributes = { ...graphNode.attributes };\n const className = typeof attributes.className === \"string\" ? attributes.className : undefined;\n if (className) {\n delete attributes.className;\n }\n return {\n codeSync: {\n tagName: graphNode.tagName ?? graphNode.kind,\n attributes,\n preservedAttributes: [...graphNode.preservedAttributes],\n locator: graphNode.locator,\n raw: graphNode.raw ?? null,\n unsupportedReason: graphNode.unsupportedReason ?? null\n },\n importedFromCodeSync: true,\n className: className ?? null\n };\n}\n\nfunction buildCanvasNodeProps(graphNode: CodeSyncGraph[\"nodes\"][string]): Record<string, unknown> {\n const attributes = { ...graphNode.attributes };\n const className = typeof attributes.className === \"string\" ? attributes.className : undefined;\n if (className) {\n delete attributes.className;\n }\n const props: Record<string, unknown> = {\n tagName: graphNode.tagName ?? graphNode.kind,\n attributes\n };\n if (className) {\n props.className = className;\n }\n if (graphNode.kind === \"text\") {\n props.text = graphNode.text ?? \"\";\n }\n return props;\n}\n\nfunction buildNodeName(graphNode: CodeSyncGraph[\"nodes\"][string]): string {\n if (graphNode.kind === \"text\") {\n return (graphNode.text ?? \"Text\").slice(0, 48);\n }\n if (graphNode.kind === \"unsupported\") {\n return \"Unsupported Runtime Node\";\n }\n return graphNode.tagName ?? \"Element\";\n}\n\nfunction buildNodeId(\n graphNode: CodeSyncGraph[\"nodes\"][string],\n manifestLookup: Map<string, string>\n): string {\n return manifestLookup.get(locatorKey(graphNode.locator)) ?? `node_sync_${randomUUID().slice(0, 8)}`;\n}\n\nfunction preorder(graph: CodeSyncGraph, nodeKey: string): Array<CodeSyncGraph[\"nodes\"][string]> {\n const node = graph.nodes[nodeKey];\n if (!node) {\n throw new Error(`Unknown graph node: ${nodeKey}`);\n }\n const ordered = [node];\n for (const childKey of node.childKeys) {\n ordered.push(...preorder(graph, childKey));\n }\n return ordered;\n}\n\nexport function importCodeSyncGraph(options: ImportCodeSyncGraphOptions): ImportCodeSyncGraphResult {\n const rootNode = findNode(options.document, options.binding.nodeId);\n const pageId = rootNode.pageId;\n const manifestLookup = buildManifestLookup(options.manifest?.nodeMappings ?? []);\n const descendantIds = collectDescendantIds(options.document, options.binding.nodeId);\n const patches: CanvasPatch[] = [];\n const changedNodeIds = new Set<string>([rootNode.id, ...descendantIds]);\n const nodeIdByLocator = new Map<string, string>();\n nodeIdByLocator.set(locatorKey(options.graph.nodes[options.graph.rootKey]!.locator), options.binding.nodeId);\n\n const rootMetadata = buildCanvasNodeMetadata(options.graph.nodes[options.graph.rootKey]!);\n const rootProps = buildCanvasNodeProps(options.graph.nodes[options.graph.rootKey]!);\n patches.push({\n op: \"node.update\",\n nodeId: rootNode.id,\n changes: {\n name: buildNodeName(options.graph.nodes[options.graph.rootKey]!),\n props: rootProps,\n style: options.graph.nodes[options.graph.rootKey]!.style,\n bindingRefs: { ...rootNode.bindingRefs, primary: options.binding.id },\n metadata: { ...rootNode.metadata, ...rootMetadata }\n }\n });\n\n descendantIds.reverse().forEach((nodeId) => {\n patches.push({ op: \"node.remove\", nodeId });\n });\n\n const orderedNodes = preorder(options.graph, options.graph.rootKey).slice(1);\n const canvasChildren = new Map<string, string[]>();\n for (const graphNode of orderedNodes) {\n const nodeId = buildNodeId(graphNode, manifestLookup);\n nodeIdByLocator.set(locatorKey(graphNode.locator), nodeId);\n const parentKey = orderedNodes.find((candidate) => candidate.childKeys.includes(graphNode.key))?.key ?? options.graph.rootKey;\n const parentId = parentKey === options.graph.rootKey\n ? options.binding.nodeId\n : nodeIdByLocator.get(locatorKey(options.graph.nodes[parentKey]!.locator)) ?? options.binding.nodeId;\n const siblings = canvasChildren.get(parentId) ?? [];\n siblings.push(nodeId);\n canvasChildren.set(parentId, siblings);\n patches.push({\n op: \"node.insert\",\n pageId,\n parentId,\n node: {\n id: nodeId,\n kind: toCanvasKind(graphNode),\n name: buildNodeName(graphNode),\n rect: graphNode.kind === \"text\"\n ? { x: 0, y: 0, width: 240, height: 28 }\n : { x: 0, y: 0, width: 320, height: 120 },\n props: buildCanvasNodeProps(graphNode),\n style: graphNode.style,\n bindingRefs: { primary: options.binding.id },\n metadata: buildCanvasNodeMetadata(graphNode)\n }\n });\n changedNodeIds.add(nodeId);\n }\n\n const nodeMappings: CodeSyncManifestNodeMapping[] = buildGraphMappings(options.graph, nodeIdByLocator);\n const manifest: CodeSyncManifest = {\n bindingId: options.binding.id,\n documentId: options.document.documentId,\n repoPath: options.binding.codeSync?.repoPath ?? options.binding.selector ?? \"\",\n adapter: options.binding.codeSync?.adapter ?? options.graph.adapter,\n rootLocator: {\n exportName: options.binding.codeSync?.exportName,\n selector: options.binding.codeSync?.selector\n },\n sourceHash: options.graph.sourceHash,\n documentRevision: options.documentRevision,\n nodeMappings,\n lastImportedAt: new Date().toISOString(),\n lastPushedAt: options.manifest?.lastPushedAt\n };\n\n return {\n patches,\n manifest,\n unsupportedRegions: options.graph.unsupportedFragments,\n changedNodeIds: [...changedNodeIds]\n };\n}\n","import type { CodeSyncGraph, CodeSyncManifestNodeMapping, CodeSyncSourceLocator } from \"./types\";\n\nexport function locatorKey(locator: CodeSyncSourceLocator): string {\n return [\n locator.sourcePath,\n locator.astPath\n ].join(\":\");\n}\n\nexport function buildManifestLookup(mappings: CodeSyncManifestNodeMapping[]): Map<string, string> {\n const lookup = new Map<string, string>();\n for (const mapping of mappings) {\n lookup.set(locatorKey(mapping.locator), mapping.nodeId);\n }\n return lookup;\n}\n\nexport function buildGraphMappings(graph: CodeSyncGraph, nodeIdByLocator: Map<string, string>): CodeSyncManifestNodeMapping[] {\n const mappings: CodeSyncManifestNodeMapping[] = [];\n for (const node of Object.values(graph.nodes)) {\n const nodeId = nodeIdByLocator.get(locatorKey(node.locator));\n if (!nodeId) {\n continue;\n }\n mappings.push({\n nodeId,\n locator: node.locator\n });\n }\n return mappings.sort((left, right) => left.nodeId.localeCompare(right.nodeId));\n}\n","import { mkdir } from \"fs/promises\";\nimport { dirname } from \"path\";\nimport { writeFileAtomic } from \"../../utils/fs\";\nimport type { CodeSyncManifest } from \"./types\";\n\nexport async function writeCodeSyncSource(repoPath: string, sourceText: string): Promise<void> {\n await mkdir(dirname(repoPath), { recursive: true });\n writeFileAtomic(repoPath, sourceText, { encoding: \"utf-8\" });\n}\n\nexport function finalizeCodeSyncManifest(\n manifest: CodeSyncManifest,\n updates: {\n sourceHash: string;\n documentRevision: number;\n lastImportedAt?: string;\n lastPushedAt?: string;\n }\n): CodeSyncManifest {\n return {\n ...manifest,\n sourceHash: updates.sourceHash,\n documentRevision: updates.documentRevision,\n lastImportedAt: updates.lastImportedAt ?? manifest.lastImportedAt,\n lastPushedAt: updates.lastPushedAt ?? manifest.lastPushedAt\n };\n}\n","import { randomUUID } from \"crypto\";\nimport type { CanvasAttachedClient } from \"../canvas/types\";\nimport type { CodeSyncAttachMode, CodeSyncLeaseRole } from \"../canvas/code-sync/types\";\n\ntype SessionState = {\n leaseId: string;\n leaseHolderClientId: string;\n attachedClients: Map<string, CanvasAttachedClient>;\n};\n\nexport type CanvasSessionAttachResult = {\n clientId: string;\n leaseId: string;\n leaseHolderClientId: string;\n attachedClients: CanvasAttachedClient[];\n role: CodeSyncLeaseRole;\n attachMode: CodeSyncAttachMode;\n};\n\nexport class CanvasSessionSyncManager {\n private readonly sessions = new Map<string, SessionState>();\n\n initializeSession(canvasSessionId: string, leaseId: string, clientId?: string | null): CanvasSessionAttachResult {\n const initialClientId = normalizeClientId(clientId) ?? `canvas_owner_${randomUUID().slice(0, 8)}`;\n const attachedAt = new Date().toISOString();\n const attachedClients = new Map<string, CanvasAttachedClient>();\n attachedClients.set(initialClientId, {\n clientId: initialClientId,\n role: \"lease_holder\",\n attachedAt,\n lastSeenAt: attachedAt\n });\n this.sessions.set(canvasSessionId, {\n leaseId,\n leaseHolderClientId: initialClientId,\n attachedClients\n });\n return {\n clientId: initialClientId,\n leaseId,\n leaseHolderClientId: initialClientId,\n attachedClients: [...attachedClients.values()],\n role: \"lease_holder\",\n attachMode: \"lease_reclaim\"\n };\n }\n\n attach(canvasSessionId: string, leaseId: string, clientId?: string | null, attachMode: CodeSyncAttachMode = \"observer\"): CanvasSessionAttachResult {\n const state = this.sessions.get(canvasSessionId);\n if (!state) {\n throw new Error(`Unknown canvas session for attach: ${canvasSessionId}`);\n }\n const resolvedClientId = normalizeClientId(clientId) ?? `canvas_client_${randomUUID().slice(0, 8)}`;\n const previous = state.attachedClients.get(resolvedClientId);\n const attachedAt = previous?.attachedAt ?? new Date().toISOString();\n let role: CodeSyncLeaseRole = \"observer\";\n if (attachMode === \"lease_reclaim\") {\n state.leaseId = leaseId;\n state.leaseHolderClientId = resolvedClientId;\n role = \"lease_holder\";\n }\n state.attachedClients.set(resolvedClientId, {\n clientId: resolvedClientId,\n role,\n attachedAt,\n lastSeenAt: new Date().toISOString()\n });\n if (attachMode === \"lease_reclaim\") {\n for (const [entryClientId, entry] of state.attachedClients.entries()) {\n if (entryClientId === resolvedClientId) {\n continue;\n }\n state.attachedClients.set(entryClientId, {\n ...entry,\n role: \"observer\",\n lastSeenAt: new Date().toISOString()\n });\n }\n }\n return {\n clientId: resolvedClientId,\n leaseId: state.leaseId,\n leaseHolderClientId: state.leaseHolderClientId,\n attachedClients: this.listAttachedClients(canvasSessionId),\n role,\n attachMode\n };\n }\n\n touch(canvasSessionId: string, clientId?: string | null): void {\n const state = this.sessions.get(canvasSessionId);\n const resolvedClientId = normalizeClientId(clientId);\n if (!state || !resolvedClientId) {\n return;\n }\n const existing = state.attachedClients.get(resolvedClientId);\n if (!existing) {\n return;\n }\n state.attachedClients.set(resolvedClientId, {\n ...existing,\n lastSeenAt: new Date().toISOString()\n });\n }\n\n updateLease(canvasSessionId: string, leaseId: string): void {\n const state = this.sessions.get(canvasSessionId);\n if (!state) {\n return;\n }\n state.leaseId = leaseId;\n const holder = state.attachedClients.get(state.leaseHolderClientId);\n if (holder) {\n state.attachedClients.set(state.leaseHolderClientId, {\n ...holder,\n role: \"lease_holder\",\n lastSeenAt: new Date().toISOString()\n });\n }\n }\n\n listAttachedClients(canvasSessionId: string): CanvasAttachedClient[] {\n const state = this.sessions.get(canvasSessionId);\n if (!state) {\n return [];\n }\n return [...state.attachedClients.values()].sort((left, right) => left.attachedAt.localeCompare(right.attachedAt));\n }\n\n getLeaseHolderClientId(canvasSessionId: string): string | null {\n return this.sessions.get(canvasSessionId)?.leaseHolderClientId ?? null;\n }\n\n removeSession(canvasSessionId: string): void {\n this.sessions.delete(canvasSessionId);\n }\n}\n\nfunction normalizeClientId(value: string | null | undefined): string | null {\n return typeof value === \"string\" && value.trim().length > 0 ? value.trim() : null;\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 { createServer, type IncomingMessage, type ServerResponse } from \"http\";\nimport type { AddressInfo } from \"net\";\nimport { timingSafeEqual, randomUUID } from \"crypto\";\nimport { WebSocket, WebSocketServer } from \"ws\";\nimport {\n AnnotationCommand,\n AnnotationErrorCode,\n AnnotationResponse,\n CanvasEnvelope,\n CanvasError,\n CanvasErrorResponse,\n CanvasEvent,\n CanvasHello,\n CanvasPing,\n CanvasRequest,\n MAX_OPS_PAYLOAD_BYTES,\n MAX_CANVAS_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 canvasConnected: 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 canvasWss: 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 canvasClients = 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 annotationDirectPending = new Map<string, { resolve: (response: AnnotationResponse) => void; timeout: NodeJS.Timeout }>();\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 MAX_OPS_PAYLOAD_BYTES = MAX_OPS_PAYLOAD_BYTES;\n private static readonly MAX_CANVAS_PAYLOAD_BYTES = MAX_CANVAS_PAYLOAD_BYTES;\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 this.canvasWss = 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.canvasWss.on(\"connection\", (socket: WebSocket, _request: IncomingMessage) => {\n const clientId = randomUUID();\n this.canvasClients.set(clientId, socket);\n socket.on(\"message\", (data: WebSocket.RawData) => {\n this.handleCanvasClientMessage(clientId, data);\n });\n socket.on(\"close\", () => {\n if (this.canvasClients.get(clientId) === socket) {\n this.canvasClients.delete(clientId);\n this.notifyCanvasClientClosed(clientId);\n }\n });\n socket.on(\"error\", () => {\n if (this.canvasClients.get(clientId) === socket) {\n this.canvasClients.delete(clientId);\n this.notifyCanvasClientClosed(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 if (pathname === \"/canvas\") {\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(\"canvas_unauthorized\", { ip });\n socket.write(\"HTTP/1.1 401 Unauthorized\\r\\n\\r\\n\");\n socket.destroy();\n return;\n }\n this.canvasWss?.handleUpgrade(request, socket, head, (ws: WebSocket) => {\n this.canvasWss?.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 for (const [requestId, pending] of this.annotationDirectPending.entries()) {\n clearTimeout(pending.timeout);\n pending.resolve({\n version: 1,\n requestId,\n status: \"error\",\n error: { code: \"relay_unavailable\", message: \"Relay stopped.\" }\n });\n }\n this.annotationDirectPending.clear();\n\n for (const socket of this.opsClients.values()) {\n socket.close(1000, \"Relay stopped\");\n }\n this.opsClients.clear();\n for (const socket of this.canvasClients.values()) {\n socket.close(1000, \"Relay stopped\");\n }\n this.canvasClients.clear();\n this.opsOwnedTabIds.clear();\n\n this.extensionWss?.close();\n this.cdpWss?.close();\n this.annotationWss?.close();\n this.opsWss?.close();\n this.canvasWss?.close();\n this.server?.close();\n\n this.extensionWss = null;\n this.cdpWss = null;\n this.annotationWss = null;\n this.opsWss = null;\n this.canvasWss = 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 canvasConnected: this.canvasClients.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 async requestAnnotation(command: AnnotationCommand, timeoutMs = RelayServer.ANNOTATION_REQUEST_TIMEOUT_MS): Promise<AnnotationResponse> {\n if (!this.hasReadyExtensionSocket()) {\n return {\n version: 1,\n requestId: command.requestId,\n status: \"error\",\n error: { code: \"relay_unavailable\", message: \"Extension not connected to relay.\" }\n };\n }\n\n if (this.annotationDirectPending.has(command.requestId)) {\n return {\n version: 1,\n requestId: command.requestId,\n status: \"error\",\n error: { code: \"invalid_request\", message: \"Duplicate annotation requestId.\" }\n };\n }\n\n return await new Promise<AnnotationResponse>((resolve) => {\n const timeout = setTimeout(() => {\n this.annotationDirectPending.delete(command.requestId);\n resolve({\n version: 1,\n requestId: command.requestId,\n status: \"error\",\n error: { code: \"timeout\", message: \"Annotation request timed out.\" }\n });\n }, timeoutMs);\n\n this.annotationDirectPending.set(command.requestId, { resolve, timeout });\n this.sendJson(this.extensionSocket, {\n type: \"annotationCommand\",\n payload: command\n } satisfies RelayAnnotationCommand);\n });\n }\n\n getOpsUrl(): string | null {\n return this.baseUrl ? `${this.baseUrl}/ops` : null;\n }\n\n getCanvasUrl(): string | null {\n return this.baseUrl ? `${this.baseUrl}/canvas` : 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 canvasConnected: this.canvasClients.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 (isCanvasEnvelope(message)) {\n this.handleCanvasExtensionMessage(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.hasReadyExtensionSocket()) {\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 > RelayServer.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: RelayServer.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 handleCanvasClientMessage(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.sendCanvasError(clientId, {\n code: \"canvas_unavailable\",\n message: \"Extension not connected to relay.\",\n retryable: true\n }, getCanvasRequestId(message), getCanvasSessionId(message));\n return;\n }\n\n if (isCanvasHello(message) || isCanvasRequest(message) || isCanvasPing(message)) {\n const sizeBytes = Buffer.byteLength(JSON.stringify(message));\n if (sizeBytes > RelayServer.MAX_CANVAS_PAYLOAD_BYTES) {\n this.sendCanvasError(clientId, {\n code: \"invalid_request\",\n message: \"Canvas payload exceeded relay limits.\",\n retryable: false,\n details: { maxPayloadBytes: RelayServer.MAX_CANVAS_PAYLOAD_BYTES }\n }, getCanvasRequestId(message), getCanvasSessionId(message));\n return;\n }\n\n this.sendJson(this.extensionSocket, { ...message, clientId } satisfies CanvasEnvelope);\n return;\n }\n\n this.sendCanvasError(clientId, {\n code: \"invalid_request\",\n message: \"Invalid canvas message.\",\n retryable: false\n }, getCanvasRequestId(message), getCanvasSessionId(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 handleCanvasExtensionMessage(message: CanvasEnvelope): void {\n if (message.type === \"canvas_hello_ack\" && this.canvasClients.size === 0) {\n return;\n }\n const clientId = message.clientId;\n if (!clientId) {\n return;\n }\n const client = this.canvasClients.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 notifyCanvasClientClosed(clientId: string): void {\n if (!this.extensionSocket) return;\n const event: CanvasEvent = {\n type: \"canvas_event\",\n clientId,\n event: \"canvas_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 sendCanvasError(clientId: string, error: CanvasError, requestId?: string, canvasSessionId?: string): void {\n const client = this.canvasClients.get(clientId);\n if (!client) return;\n const payload: CanvasErrorResponse = {\n type: \"canvas_error\",\n requestId: requestId ?? \"unknown\",\n clientId,\n canvasSessionId,\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 const directPending = this.annotationDirectPending.get(requestId);\n if (directPending) {\n clearTimeout(directPending.timeout);\n this.annotationDirectPending.delete(requestId);\n directPending.resolve(payload);\n }\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 for (const [requestId, pending] of this.annotationDirectPending.entries()) {\n clearTimeout(pending.timeout);\n pending.resolve({\n version: 1,\n requestId,\n status: \"error\",\n error: { code, message }\n });\n }\n this.annotationDirectPending.clear();\n }\n\n private buildHealthStatus(): RelayHealthStatus {\n const opsConnected = this.opsClients.size > 0;\n const canvasConnected = this.canvasClients.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 canvasConnected,\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 canvasConnected,\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 canvasConnected,\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 canvasConnected,\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 canvasConnected,\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 canvasConnected,\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 hasReadyExtensionSocket(): boolean {\n return Boolean(this.extensionSocket && this.extensionSocket.readyState === WebSocket.OPEN && this.extensionHandshakeComplete);\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 isCanvasHello = (value: Record<string, unknown>): value is CanvasHello => {\n return value.type === \"canvas_hello\" && typeof value.version === \"string\";\n};\n\nconst isCanvasPing = (value: Record<string, unknown>): value is CanvasPing => {\n return value.type === \"canvas_ping\" && typeof value.id === \"string\";\n};\n\nconst isCanvasRequest = (value: Record<string, unknown>): value is CanvasRequest => {\n return value.type === \"canvas_request\" && typeof value.requestId === \"string\" && typeof value.command === \"string\";\n};\n\nconst isCanvasEnvelope = (value: Record<string, unknown>): value is CanvasEnvelope => {\n const type = value.type;\n return typeof type === \"string\" && type.startsWith(\"canvas_\");\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 getCanvasRequestId = (value: Record<string, unknown>): string | undefined => {\n return typeof value.requestId === \"string\" ? value.requestId : undefined;\n};\n\nconst getCanvasSessionId = (value: Record<string, unknown>): string | undefined => {\n return typeof value.canvasSessionId === \"string\" ? value.canvasSessionId : 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\" && value.command !== \"fetch_stored\") 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 { CanvasManager } from \"../browser/canvas-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 const canvasManager = new CanvasManager({\n worktree: cacheRoot,\n browserManager: manager,\n config,\n relay\n });\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 canvasManager,\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.canvasUrl\":\n return core.relay.getCanvasUrl?.() ?? null;\n case \"canvas.execute\":\n return core.canvasManager.execute(\n requireString(params.command, \"command\"),\n requireRecord(params.params ?? {}, \"params\")\n );\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 stored = optionalBoolean(params.stored) ?? false;\n const transport = stored ? \"relay\" : 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 includeScreenshots = optionalBoolean(params.includeScreenshots) ?? true;\n const timeoutMs = optionalNumber(params.timeoutMs, \"timeoutMs\");\n return core.annotationManager.requestAnnotation({\n sessionId,\n transport,\n stored,\n includeScreenshots,\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 startUrl = optionalString(params.startUrl);\n const result = startUrl\n ? await core.manager.connectRelay(relayUrl, { startUrl })\n : 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 startUrl = optionalString(params.startUrl);\n const result = startUrl\n ? await core.manager.connectRelay(relayEndpoint ?? relayUrl ?? \"\", { startUrl })\n : 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 startUrl: optionalString(params.startUrl)\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 requireRecord(value: unknown, label: string): Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(`Invalid ${label}`);\n }\n return value as Record<string, unknown>;\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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","names":["delay","resolve","randomUUID","mkdir","join","homedir","join","path","join","homedir","join","path","clone","el","redactText","nowMs","randomUUID","resolve","join","randomUUID","mkdir","page","targetId","startTime","path","resolve","randomUUID","randomUUID","resolve","randomUUID","delay","randomUUID","path","randomUUID","WebSocket","randomUUID","existsSync","join","join","existsSync","randomUUID","resolve","randomUUID","WebSocket","resolve","parseJson","randomUUID","mkdir","dirname","randomUUID","WebSocket","WebSocket","resolve","randomUUID","parseJson","delay","randomUUID","isRecord","isRecord","isRecord","document","randomUUID","binding","path","isRecord","document","randomUUID","path","binding","isRecord","readString","document","binding","access","mkdir","join","dirname","isRecord","join","document","mkdir","dirname","access","readFile","resolve","isAbsolute","ts","createHash","locator","findNode","document","isRecord","document","findNode","randomUUID","findNode","document","randomUUID","mkdir","dirname","mkdir","dirname","binding","readFile","isAbsolute","resolve","randomUUID","document","randomUUID","isNonEmptyRecord","requireNumber","requireString","binding","mkdir","dirname","isRecord","resolve","html","element","path","writeFileAtomic","readNumber","content","isRecord","randomUUID","WebSocket","randomUUID","resolve","parseJson","isRecord","requestId","WebSocket","readFile","join","os","createServer","timingSafeEqual","mkdirSync","readFileSync","writeFileSync","existsSync","homedir","join","randomUUID","randomUUID","resolve","optionalString","requireString","requireRecord","binding","optionalBoolean","requireWaitUntil","requireState","requireSnapshotMode","requireStringArray","randomUUID","optionalStringArray","observedPort","path","delay","resolve","DEFAULT_DAEMON_PORT","join","homedir","existsSync","readFileSync","mkdirSync","writeFileSync","timingSafeEqual","createServer","resolve","existsSync","readFileSync","join","randomUUID","join","existsSync","readFileSync","randomUUID","requireBinding","sessionId","randomUUID","fs","path","os","truncateText"]}