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
@@ -3,6 +3,7 @@ import { logError } from "../logging.js";
3
3
  import { TabManager } from "../services/TabManager.js";
4
4
  import { TargetSessionCoordinator, createCoordinatorId } from "../ops/target-session-coordinator.js";
5
5
  import { normalizeCanvasSessionSummary, normalizeCanvasTargetStateSummaries } from "./model.js";
6
+ import { DEFAULT_EDITOR_VIEWPORT } from "./viewport-fit.js";
6
7
  const OVERLAY_STYLE = `
7
8
  #opendevbrowser-canvas-style,
8
9
  .opendevbrowser-canvas-highlight {
@@ -33,12 +34,18 @@ const OVERLAY_STYLE = `
33
34
  `;
34
35
  export class CanvasRuntime {
35
36
  sendEnvelope;
37
+ registerOpsCanvasTarget;
38
+ unregisterOpsCanvasTarget;
39
+ encoder = new TextEncoder();
36
40
  tabs = new TabManager();
37
41
  sessions = new TargetSessionCoordinator();
42
+ overlaySessions = new Map();
38
43
  pagePorts = new Map();
39
44
  pendingPageActions = new Map();
40
45
  constructor(options) {
41
46
  this.sendEnvelope = options.send;
47
+ this.registerOpsCanvasTarget = options.registerOpsCanvasTarget;
48
+ this.unregisterOpsCanvasTarget = options.unregisterOpsCanvasTarget;
42
49
  }
43
50
  attachPort(port) {
44
51
  if (port.name !== "canvas-page") {
@@ -175,6 +182,11 @@ export class CanvasRuntime {
175
182
  for (const session of this.sessions.listOwnedBy(clientId)) {
176
183
  void this.closeRuntimeSession(session, "client_disconnected");
177
184
  }
185
+ for (const [sessionId, session] of this.overlaySessions.entries()) {
186
+ if (session.ownerClientId === clientId) {
187
+ this.overlaySessions.delete(sessionId);
188
+ }
189
+ }
178
190
  }
179
191
  handlePagePortMessage(tabId, message) {
180
192
  if (message.type === "canvas-page-action-response") {
@@ -209,7 +221,7 @@ export class CanvasRuntime {
209
221
  if (!Array.isArray(message.patches) || message.patches.length === 0 || typeof message.baseRevision !== "number") {
210
222
  return;
211
223
  }
212
- this.mergeEditorState(session, undefined, message.selection);
224
+ this.mergeEditorState(session, message.viewport, message.selection);
213
225
  session.pendingMutation = true;
214
226
  this.broadcastCanvasState(tabId, "canvas-page:update");
215
227
  this.sendEvent({
@@ -222,7 +234,20 @@ export class CanvasRuntime {
222
234
  documentId: session.document.documentId,
223
235
  baseRevision: message.baseRevision,
224
236
  patches: message.patches,
225
- selection: session.selection
237
+ selection: session.selection,
238
+ viewport: session.viewport
239
+ }
240
+ });
241
+ return;
242
+ }
243
+ if (message.type === "canvas-page-history-request") {
244
+ this.sendEvent({
245
+ type: "canvas_event",
246
+ clientId: session.ownerClientId,
247
+ canvasSessionId: session.id,
248
+ event: "canvas_history_requested",
249
+ payload: {
250
+ direction: message.direction
226
251
  }
227
252
  });
228
253
  }
@@ -265,6 +290,12 @@ export class CanvasRuntime {
265
290
  const tab = await this.createTab(chrome.runtime.getURL("canvas.html"), previewMode);
266
291
  const tabId = requireTabId(tab);
267
292
  const session = this.createOrReplaceSession(message, tabId, document, previewMode, record);
293
+ await this.syncOpsTargetRegistration(session).catch((error) => {
294
+ logError("canvas.sync_ops_target_registration", error, {
295
+ code: "canvas_ops_target_registration_failed",
296
+ extra: { canvasSessionId: session.id, targetId: session.designTabTargetId }
297
+ });
298
+ });
268
299
  this.broadcastCanvasState(tabId, "canvas-page:init");
269
300
  this.sendEvent({
270
301
  type: "canvas_event",
@@ -279,15 +310,54 @@ export class CanvasRuntime {
279
310
  };
280
311
  }
281
312
  async closeTab(message) {
282
- const session = this.requireSessionForMessage(message);
283
313
  const record = requireRecord(message.payload, "payload");
284
314
  const tabId = parseTargetId(requireString(record.targetId, "targetId"));
285
315
  const targetId = formatTargetId(tabId);
316
+ let session = null;
317
+ try {
318
+ session = this.requireSessionForMessage(message, record);
319
+ }
320
+ catch (error) {
321
+ if (!isIgnorableCanvasCloseLookupError(error)) {
322
+ throw error;
323
+ }
324
+ }
325
+ if (!session) {
326
+ const browserSessionId = optionalString(record.browserSessionId)
327
+ ?? optionalString(isRecord(record.summary) ? record.summary.browserSessionId : undefined);
328
+ if (browserSessionId && this.unregisterOpsCanvasTarget) {
329
+ await Promise.resolve(this.unregisterOpsCanvasTarget(browserSessionId, targetId)).catch((error) => {
330
+ logError("canvas.unregister_ops_target", error, {
331
+ code: "canvas_ops_target_unregister_failed",
332
+ extra: { browserSessionId, targetId }
333
+ });
334
+ });
335
+ }
336
+ this.broadcastCanvasState(tabId, "canvas-page:closed", { reason: "target_closed" });
337
+ this.pagePorts.delete(tabId);
338
+ await this.tabs.closeTab(tabId).catch(() => undefined);
339
+ return {
340
+ ok: true,
341
+ targetId,
342
+ targetIds: [],
343
+ releasedTargetIds: [targetId],
344
+ previewState: "background"
345
+ };
346
+ }
286
347
  this.broadcastCanvasState(tabId, "canvas-page:closed", { reason: "target_closed" });
287
348
  session.designTabTargetId = null;
288
349
  session.pendingMutation = false;
289
350
  this.pagePorts.delete(tabId);
290
351
  this.sessions.removeTarget(session.id, targetId);
352
+ const browserSessionId = readBrowserSessionId(session.summary);
353
+ if (browserSessionId && this.unregisterOpsCanvasTarget) {
354
+ await Promise.resolve(this.unregisterOpsCanvasTarget(browserSessionId, targetId)).catch((error) => {
355
+ logError("canvas.unregister_ops_target", error, {
356
+ code: "canvas_ops_target_unregister_failed",
357
+ extra: { browserSessionId, targetId }
358
+ });
359
+ });
360
+ }
291
361
  await this.tabs.closeTab(tabId);
292
362
  this.sendEvent({
293
363
  type: "canvas_event",
@@ -296,16 +366,6 @@ export class CanvasRuntime {
296
366
  event: "canvas_target_closed",
297
367
  payload: { targetId, tabId }
298
368
  });
299
- if (session.targets.size === 0) {
300
- this.sessions.delete(session.id);
301
- this.sendEvent({
302
- type: "canvas_event",
303
- clientId: session.ownerClientId,
304
- canvasSessionId: session.id,
305
- event: "canvas_session_closed",
306
- payload: { reason: "target_closed" }
307
- });
308
- }
309
369
  return {
310
370
  ok: true,
311
371
  targetId,
@@ -343,10 +403,27 @@ export class CanvasRuntime {
343
403
  };
344
404
  }
345
405
  async mountOverlay(message) {
346
- const session = this.requireSessionForMessage(message);
347
406
  const record = requireRecord(message.payload, "payload");
407
+ const session = this.requireOverlaySession(message, record, true);
348
408
  const tabId = parseTargetId(requireString(record.targetId, "targetId"));
349
409
  const prototypeId = optionalString(record.prototypeId) ?? "default";
410
+ if (this.isDesignTabTarget(session, tabId)) {
411
+ const mountId = `mount_${crypto.randomUUID()}`;
412
+ const mount = {
413
+ mountId,
414
+ targetId: formatTargetId(tabId),
415
+ mountedAt: new Date().toISOString()
416
+ };
417
+ session.overlayMounts = dedupeOverlayMounts([...session.overlayMounts, mount]);
418
+ this.broadcastIfDesignTab(session);
419
+ return {
420
+ mountId,
421
+ targetId: formatTargetId(tabId),
422
+ previewState: session.previewState,
423
+ overlayState: "mounted",
424
+ capabilities: { selection: true, guides: true }
425
+ };
426
+ }
350
427
  await insertCss(tabId, OVERLAY_STYLE);
351
428
  const mountId = `mount_${crypto.randomUUID()}`;
352
429
  const result = await executeInTab(tabId, mountOverlayScript, [{
@@ -372,10 +449,20 @@ export class CanvasRuntime {
372
449
  };
373
450
  }
374
451
  async unmountOverlay(message) {
375
- const session = this.requireSessionForMessage(message);
376
452
  const record = requireRecord(message.payload, "payload");
453
+ const session = this.requireOverlaySession(message, record);
377
454
  const mountId = requireString(record.mountId, "mountId");
378
455
  const tabId = parseTargetId(requireString(record.targetId, "targetId"));
456
+ if (this.isDesignTabTarget(session, tabId)) {
457
+ session.overlayMounts = session.overlayMounts.filter((mount) => mount.mountId !== mountId);
458
+ this.broadcastIfDesignTab(session);
459
+ return {
460
+ ok: true,
461
+ mountId,
462
+ previewState: session.previewState,
463
+ overlayState: "idle"
464
+ };
465
+ }
379
466
  await executeInTab(tabId, unmountOverlayScript, [mountId]);
380
467
  session.overlayMounts = session.overlayMounts.filter((mount) => mount.mountId !== mountId);
381
468
  this.broadcastIfDesignTab(session);
@@ -387,16 +474,19 @@ export class CanvasRuntime {
387
474
  };
388
475
  }
389
476
  async selectOverlay(message) {
390
- const session = this.requireSessionForMessage(message);
391
477
  const record = requireRecord(message.payload, "payload");
478
+ const session = this.requireOverlaySession(message, record);
392
479
  const tabId = parseTargetId(requireString(record.targetId, "targetId"));
393
480
  const selectionHint = isRecord(record.selectionHint) ? record.selectionHint : {};
394
481
  const nodeId = optionalString(record.nodeId);
395
- const selection = await executeInTab(tabId, selectOverlayScript, [{ selectionHint, nodeId }]);
396
- if (typeof nodeId === "string") {
482
+ const selection = this.isDesignTabTarget(session, tabId)
483
+ ? resolveDesignTabOverlaySelection(session.document, nodeId, selectionHint)
484
+ : await executeInTab(tabId, selectOverlayScript, [{ selectionHint, nodeId }]);
485
+ const resolvedNodeId = typeof selection.nodeId === "string" ? selection.nodeId : nodeId;
486
+ if (typeof resolvedNodeId === "string") {
397
487
  session.selection = {
398
488
  pageId: session.document.pages[0]?.id ?? null,
399
- nodeId,
489
+ nodeId: resolvedNodeId,
400
490
  targetId: formatTargetId(tabId),
401
491
  updatedAt: new Date().toISOString()
402
492
  };
@@ -408,10 +498,19 @@ export class CanvasRuntime {
408
498
  };
409
499
  }
410
500
  async syncOverlay(message) {
411
- const session = this.requireSessionForMessage(message);
412
501
  const record = requireRecord(message.payload, "payload");
502
+ const session = this.requireOverlaySession(message, record);
413
503
  const tabId = parseTargetId(requireString(record.targetId, "targetId"));
414
504
  const mountId = requireString(record.mountId, "mountId");
505
+ if (this.isDesignTabTarget(session, tabId)) {
506
+ this.broadcastIfDesignTab(session);
507
+ return {
508
+ ok: true,
509
+ mountId,
510
+ targetId: formatTargetId(tabId),
511
+ overlayState: "mounted"
512
+ };
513
+ }
415
514
  await insertCss(tabId, OVERLAY_STYLE);
416
515
  const result = await executeInTab(tabId, syncOverlayScript, [{
417
516
  mountId,
@@ -432,6 +531,7 @@ export class CanvasRuntime {
432
531
  const summary = normalizeCanvasSessionSummary(record.summary);
433
532
  const existing = this.sessions.get(canvasSessionId);
434
533
  if (existing) {
534
+ this.overlaySessions.delete(existing.id);
435
535
  if (existing.ownerClientId !== clientId || (requestedLeaseId && existing.leaseId !== requestedLeaseId)) {
436
536
  throw new Error("Canvas session ownership mismatch.");
437
537
  }
@@ -450,11 +550,13 @@ export class CanvasRuntime {
450
550
  existing.previewMode = previewMode;
451
551
  existing.previewState = previewMode;
452
552
  existing.pendingMutation = false;
553
+ this.mergeEditorState(existing, normalizeViewport(record.viewport), normalizeSelection(record.selection));
453
554
  this.sessions.addTarget(existing.id, tabId, { title: document.title, url: chrome.runtime.getURL("canvas.html") });
454
555
  this.sessions.setActiveTarget(existing.id, formatTargetId(tabId));
455
556
  return existing;
456
557
  }
457
558
  const leaseId = requestedLeaseId ?? createCoordinatorId();
559
+ const viewport = normalizeViewportState(record.viewport);
458
560
  const session = this.sessions.createSession(clientId, tabId, leaseId, {
459
561
  title: document.title,
460
562
  url: chrome.runtime.getURL("canvas.html")
@@ -470,10 +572,59 @@ export class CanvasRuntime {
470
572
  overlayMounts: parseOverlayMounts(record.overlayMounts ?? summary.overlayMounts),
471
573
  feedback: parseFeedbackEvents(record.feedback),
472
574
  feedbackCursor: optionalString(record.feedbackCursor) ?? lastFeedbackCursor(parseFeedbackEvents(record.feedback)),
473
- selection: defaultSelection(document.pages[0]?.id ?? null),
474
- viewport: { x: 120, y: 96, zoom: 1 },
575
+ selection: normalizeSelectionState(record.selection, document.pages[0]?.id ?? null),
576
+ viewport,
475
577
  pendingMutation: false
476
578
  }, canvasSessionId);
579
+ this.overlaySessions.delete(session.id);
580
+ return session;
581
+ }
582
+ requireOverlaySession(message, record, createIfMissing = false) {
583
+ try {
584
+ return this.requireSessionForMessage(message, record);
585
+ }
586
+ catch (error) {
587
+ if (!isIgnorableCanvasCloseLookupError(error)) {
588
+ throw error;
589
+ }
590
+ }
591
+ const sessionId = optionalString(message.canvasSessionId)
592
+ ?? optionalString(record.canvasSessionId)
593
+ ?? optionalString(isRecord(record.summary) ? record.summary.canvasSessionId : undefined);
594
+ if (!sessionId) {
595
+ throw missingCanvasSession();
596
+ }
597
+ const clientId = requireString(message.clientId, "clientId");
598
+ const requestedLeaseId = optionalString(message.leaseId);
599
+ const existing = this.overlaySessions.get(sessionId);
600
+ if (existing) {
601
+ if (existing.ownerClientId !== clientId || (requestedLeaseId && existing.leaseId !== requestedLeaseId)) {
602
+ throw new Error("Canvas session ownership mismatch.");
603
+ }
604
+ if (record.document !== undefined) {
605
+ existing.document = requireCanvasDocument(record.document);
606
+ }
607
+ if (record.selection !== undefined) {
608
+ existing.selection = normalizeSelectionState(record.selection, existing.document.pages[0]?.id ?? null);
609
+ }
610
+ existing.previewState = normalizePreviewState(record.previewState) ?? existing.previewState;
611
+ return existing;
612
+ }
613
+ if (!createIfMissing) {
614
+ throw new Error(`Unknown sessionId: ${sessionId}`);
615
+ }
616
+ const document = requireCanvasDocument(record.document);
617
+ const session = {
618
+ id: sessionId,
619
+ ownerClientId: clientId,
620
+ leaseId: requestedLeaseId ?? createCoordinatorId(),
621
+ designTabTargetId: null,
622
+ document,
623
+ previewState: normalizePreviewState(record.previewState) ?? "background",
624
+ overlayMounts: parseOverlayMounts(record.overlayMounts),
625
+ selection: normalizeSelectionState(record.selection, document.pages[0]?.id ?? null)
626
+ };
627
+ this.overlaySessions.set(sessionId, session);
477
628
  return session;
478
629
  }
479
630
  requireSessionForMessage(message, record) {
@@ -532,6 +683,9 @@ export class CanvasRuntime {
532
683
  }
533
684
  return ports.values().next().value ?? null;
534
685
  }
686
+ isDesignTabTarget(session, tabId) {
687
+ return session.designTabTargetId === formatTargetId(tabId);
688
+ }
535
689
  sendResponse(message, payload) {
536
690
  const response = {
537
691
  type: "canvas_response",
@@ -540,7 +694,39 @@ export class CanvasRuntime {
540
694
  canvasSessionId: message.canvasSessionId,
541
695
  payload
542
696
  };
543
- this.sendEnvelope(response);
697
+ const serialized = JSON.stringify(payload ?? null);
698
+ if (this.encoder.encode(serialized).length <= MAX_CANVAS_PAYLOAD_BYTES) {
699
+ this.sendEnvelope(response);
700
+ return;
701
+ }
702
+ const payloadId = crypto.randomUUID();
703
+ const chunkSize = Math.max(1024, MAX_CANVAS_PAYLOAD_BYTES - 1024);
704
+ const chunks = [];
705
+ for (let i = 0; i < serialized.length; i += chunkSize) {
706
+ chunks.push(serialized.slice(i, i + chunkSize));
707
+ }
708
+ this.sendEnvelope({
709
+ type: "canvas_response",
710
+ requestId: message.requestId,
711
+ clientId: message.clientId,
712
+ canvasSessionId: message.canvasSessionId,
713
+ chunked: true,
714
+ payloadId,
715
+ totalChunks: chunks.length
716
+ });
717
+ chunks.forEach((data, index) => {
718
+ const chunk = {
719
+ type: "canvas_chunk",
720
+ requestId: message.requestId,
721
+ clientId: message.clientId,
722
+ canvasSessionId: message.canvasSessionId,
723
+ payloadId,
724
+ chunkIndex: index,
725
+ totalChunks: chunks.length,
726
+ data
727
+ };
728
+ this.sendEnvelope(chunk);
729
+ });
544
730
  }
545
731
  sendError(message, error) {
546
732
  this.sendEnvelope({
@@ -583,6 +769,7 @@ export class CanvasRuntime {
583
769
  this.broadcastCanvasState(parseTargetId(session.designTabTargetId), "canvas-page:update");
584
770
  }
585
771
  async closeRuntimeSession(session, reason) {
772
+ this.overlaySessions.delete(session.id);
586
773
  const released = [...session.targets.values()];
587
774
  for (const target of released) {
588
775
  this.broadcastCanvasState(target.tabId, "canvas-page:closed", { reason });
@@ -614,6 +801,16 @@ export class CanvasRuntime {
614
801
  });
615
802
  });
616
803
  }
804
+ async syncOpsTargetRegistration(session) {
805
+ const browserSessionId = readBrowserSessionId(session.summary);
806
+ if (!browserSessionId || !session.designTabTargetId || !this.registerOpsCanvasTarget) {
807
+ return;
808
+ }
809
+ const registered = await this.registerOpsCanvasTarget(browserSessionId, session.designTabTargetId);
810
+ if (registered?.targetId) {
811
+ session.designTabTargetId = registered.targetId;
812
+ }
813
+ }
617
814
  }
618
815
  function buildPageState(session, tabId) {
619
816
  return {
@@ -666,6 +863,27 @@ function normalizeSelection(value) {
666
863
  targetId: typeof value.targetId === "string" || value.targetId === null ? value.targetId : undefined
667
864
  };
668
865
  }
866
+ function normalizeViewportState(value) {
867
+ if (!isRecord(value)) {
868
+ return { ...DEFAULT_EDITOR_VIEWPORT };
869
+ }
870
+ return {
871
+ x: typeof value.x === "number" ? value.x : DEFAULT_EDITOR_VIEWPORT.x,
872
+ y: typeof value.y === "number" ? value.y : DEFAULT_EDITOR_VIEWPORT.y,
873
+ zoom: typeof value.zoom === "number" ? value.zoom : DEFAULT_EDITOR_VIEWPORT.zoom
874
+ };
875
+ }
876
+ function normalizeSelectionState(value, defaultPageId) {
877
+ if (!isRecord(value)) {
878
+ return defaultSelection(defaultPageId);
879
+ }
880
+ return {
881
+ pageId: typeof value.pageId === "string" || value.pageId === null ? value.pageId : defaultPageId,
882
+ nodeId: typeof value.nodeId === "string" || value.nodeId === null ? value.nodeId : null,
883
+ targetId: typeof value.targetId === "string" || value.targetId === null ? value.targetId : null,
884
+ updatedAt: typeof value.updatedAt === "string" ? value.updatedAt : new Date().toISOString()
885
+ };
886
+ }
669
887
  function requireCanvasDocument(value) {
670
888
  const document = requireRecord(value, "document");
671
889
  const pagesValue = Array.isArray(document.pages) ? document.pages : [];
@@ -706,38 +924,198 @@ function requireCanvasDocument(value) {
706
924
  })
707
925
  : [],
708
926
  componentInventory: Array.isArray(document.componentInventory)
709
- ? document.componentInventory.filter(isRecord)
927
+ ? document.componentInventory.flatMap((entry, index) => normalizeComponentInventoryItem(entry, index))
710
928
  : [],
711
- pages: pagesValue.map((pageValue) => {
712
- const page = requireRecord(pageValue, "page");
713
- const nodesValue = Array.isArray(page.nodes) ? page.nodes : [];
714
- return {
715
- id: requireString(page.id, "page.id"),
716
- name: optionalString(page.name) ?? requireString(page.id, "page.id"),
717
- path: optionalString(page.path) ?? "/",
718
- rootNodeId: optionalString(page.rootNodeId) ?? null,
719
- prototypeIds: Array.isArray(page.prototypeIds) ? page.prototypeIds.filter((entry) => typeof entry === "string") : [],
720
- nodes: nodesValue.map((nodeValue) => {
721
- const node = requireRecord(nodeValue, "node");
722
- return {
723
- id: requireString(node.id, "node.id"),
724
- kind: optionalString(node.kind) ?? "frame",
725
- name: optionalString(node.name) ?? "node",
726
- pageId: optionalString(node.pageId) ?? undefined,
727
- parentId: optionalString(node.parentId),
728
- childIds: Array.isArray(node.childIds) ? node.childIds.filter((entry) => typeof entry === "string") : [],
729
- rect: normalizeRect(node.rect),
730
- props: isRecord(node.props) ? node.props : {},
731
- style: isRecord(node.style) ? node.style : {},
732
- bindingRefs: isRecord(node.bindingRefs) ? node.bindingRefs : {},
733
- metadata: isRecord(node.metadata) ? node.metadata : {}
734
- };
735
- }),
736
- metadata: isRecord(page.metadata) ? page.metadata : {}
737
- };
738
- })
929
+ tokens: normalizeTokenStore(document.tokens),
930
+ meta: normalizeDocumentMeta(document.meta),
931
+ pages: pagesValue.flatMap((pageValue) => normalizePage(pageValue))
932
+ };
933
+ }
934
+ function normalizePage(value) {
935
+ if (!isRecord(value) || typeof value.id !== "string") {
936
+ return [];
937
+ }
938
+ const pageId = value.id;
939
+ return [{
940
+ id: pageId,
941
+ name: typeof value.name === "string" ? value.name : pageId,
942
+ path: typeof value.path === "string" ? value.path : "/",
943
+ rootNodeId: typeof value.rootNodeId === "string" ? value.rootNodeId : null,
944
+ prototypeIds: Array.isArray(value.prototypeIds) ? value.prototypeIds.filter((entry) => typeof entry === "string") : [],
945
+ nodes: Array.isArray(value.nodes) ? value.nodes.flatMap((entry) => normalizeNode(entry, pageId)) : [],
946
+ metadata: isRecord(value.metadata) ? value.metadata : {}
947
+ }];
948
+ }
949
+ function normalizeNode(value, pageId) {
950
+ if (!isRecord(value) || typeof value.id !== "string") {
951
+ return [];
952
+ }
953
+ return [{
954
+ id: value.id,
955
+ kind: typeof value.kind === "string" ? value.kind : "frame",
956
+ name: typeof value.name === "string" ? value.name : value.id,
957
+ pageId,
958
+ parentId: typeof value.parentId === "string" ? value.parentId : null,
959
+ childIds: Array.isArray(value.childIds) ? value.childIds.filter((entry) => typeof entry === "string") : [],
960
+ rect: isRecord(value.rect) ? {
961
+ x: typeof value.rect.x === "number" ? value.rect.x : 0,
962
+ y: typeof value.rect.y === "number" ? value.rect.y : 0,
963
+ width: typeof value.rect.width === "number" ? value.rect.width : 240,
964
+ height: typeof value.rect.height === "number" ? value.rect.height : 120
965
+ } : { x: 0, y: 0, width: 240, height: 120 },
966
+ props: isRecord(value.props) ? value.props : {},
967
+ style: isRecord(value.style) ? value.style : {},
968
+ tokenRefs: isRecord(value.tokenRefs) ? value.tokenRefs : {},
969
+ bindingRefs: isRecord(value.bindingRefs) ? value.bindingRefs : {},
970
+ variantPatches: Array.isArray(value.variantPatches) ? value.variantPatches.filter(isRecord) : [],
971
+ metadata: isRecord(value.metadata) ? value.metadata : {}
972
+ }];
973
+ }
974
+ function normalizeComponentInventoryItem(value, index) {
975
+ if (!isRecord(value)) {
976
+ return [];
977
+ }
978
+ const id = optionalString(value.id) ?? `inventory_${index + 1}`;
979
+ const name = optionalString(value.name) ?? optionalString(value.componentName) ?? id;
980
+ return [{
981
+ id,
982
+ name,
983
+ componentName: optionalString(value.componentName),
984
+ sourceKind: optionalString(value.sourceKind),
985
+ sourceFamily: optionalString(value.sourceFamily) ?? undefined,
986
+ origin: optionalString(value.origin) ?? undefined,
987
+ framework: normalizeComponentRef(value.framework),
988
+ adapter: normalizeComponentRef(value.adapter),
989
+ plugin: normalizeComponentRef(value.plugin),
990
+ variants: Array.isArray(value.variants) ? value.variants.filter(isRecord) : [],
991
+ props: Array.isArray(value.props) ? value.props.filter(isRecord) : [],
992
+ slots: Array.isArray(value.slots) ? value.slots.filter(isRecord) : [],
993
+ events: Array.isArray(value.events) ? value.events.filter(isRecord) : [],
994
+ content: isRecord(value.content) ? value.content : {},
995
+ metadata: isRecord(value.metadata) ? value.metadata : {}
996
+ }];
997
+ }
998
+ function normalizeComponentRef(value) {
999
+ if (!isRecord(value)) {
1000
+ return null;
1001
+ }
1002
+ const id = optionalString(value.id);
1003
+ if (!id) {
1004
+ return null;
1005
+ }
1006
+ return {
1007
+ id,
1008
+ label: optionalString(value.label) ?? optionalString(value.name),
1009
+ packageName: optionalString(value.packageName) ?? undefined,
1010
+ version: optionalString(value.version) ?? undefined,
1011
+ metadata: isRecord(value.metadata) ? value.metadata : {}
1012
+ };
1013
+ }
1014
+ function normalizeTokenStore(value) {
1015
+ if (!isRecord(value)) {
1016
+ return { values: {}, collections: [], aliases: [], bindings: [], metadata: {} };
1017
+ }
1018
+ const structured = "values" in value || "collections" in value || "aliases" in value || "bindings" in value || "metadata" in value;
1019
+ return {
1020
+ values: structured && isRecord(value.values) ? value.values : structured ? {} : value,
1021
+ collections: Array.isArray(value.collections) ? value.collections.flatMap((entry) => normalizeTokenCollection(entry)) : [],
1022
+ aliases: Array.isArray(value.aliases) ? value.aliases.flatMap((entry) => normalizeTokenAlias(entry)) : [],
1023
+ bindings: Array.isArray(value.bindings) ? value.bindings.flatMap((entry) => normalizeTokenBinding(entry)) : [],
1024
+ metadata: isRecord(value.metadata) ? value.metadata : {}
1025
+ };
1026
+ }
1027
+ function normalizeTokenCollection(value) {
1028
+ if (!isRecord(value) || typeof value.id !== "string") {
1029
+ return [];
1030
+ }
1031
+ return [{
1032
+ id: value.id,
1033
+ name: typeof value.name === "string" ? value.name : value.id,
1034
+ items: Array.isArray(value.items) ? value.items.flatMap((entry) => normalizeTokenItem(entry)) : [],
1035
+ metadata: isRecord(value.metadata) ? value.metadata : {}
1036
+ }];
1037
+ }
1038
+ function normalizeTokenItem(value) {
1039
+ if (!isRecord(value) || typeof value.id !== "string" || typeof value.path !== "string") {
1040
+ return [];
1041
+ }
1042
+ return [{
1043
+ id: value.id,
1044
+ path: normalizeTokenPath(value.path),
1045
+ value: value.value,
1046
+ type: typeof value.type === "string" ? value.type : undefined,
1047
+ description: typeof value.description === "string" ? value.description : undefined,
1048
+ modes: Array.isArray(value.modes) ? value.modes.flatMap((entry) => normalizeTokenMode(entry)) : [],
1049
+ metadata: isRecord(value.metadata) ? value.metadata : {}
1050
+ }];
1051
+ }
1052
+ function normalizeTokenMode(value) {
1053
+ if (!isRecord(value) || typeof value.id !== "string" || typeof value.name !== "string") {
1054
+ return [];
1055
+ }
1056
+ return [{
1057
+ id: value.id,
1058
+ name: value.name,
1059
+ value: value.value,
1060
+ metadata: isRecord(value.metadata) ? value.metadata : {}
1061
+ }];
1062
+ }
1063
+ function normalizeTokenAlias(value) {
1064
+ if (!isRecord(value) || typeof value.path !== "string" || typeof value.targetPath !== "string") {
1065
+ return [];
1066
+ }
1067
+ return [{
1068
+ path: normalizeTokenPath(value.path),
1069
+ targetPath: normalizeTokenPath(value.targetPath),
1070
+ modeId: typeof value.modeId === "string" ? value.modeId : null,
1071
+ metadata: isRecord(value.metadata) ? value.metadata : {}
1072
+ }];
1073
+ }
1074
+ function normalizeTokenBinding(value) {
1075
+ if (!isRecord(value) || typeof value.path !== "string") {
1076
+ return [];
1077
+ }
1078
+ return [{
1079
+ path: normalizeTokenPath(value.path),
1080
+ nodeId: typeof value.nodeId === "string" ? value.nodeId : null,
1081
+ bindingId: typeof value.bindingId === "string" ? value.bindingId : null,
1082
+ property: typeof value.property === "string" ? value.property : null,
1083
+ metadata: isRecord(value.metadata) ? value.metadata : {}
1084
+ }];
1085
+ }
1086
+ function normalizeTokenPath(path) {
1087
+ return path.trim().replace(/^tokens\./, "");
1088
+ }
1089
+ function normalizeDocumentMeta(value) {
1090
+ if (!isRecord(value)) {
1091
+ return { imports: [], starter: null, adapterPlugins: [], pluginErrors: [], metadata: {} };
1092
+ }
1093
+ return {
1094
+ imports: Array.isArray(value.imports) ? value.imports.filter(isRecord) : [],
1095
+ starter: isRecord(value.starter) ? value.starter : null,
1096
+ adapterPlugins: Array.isArray(value.adapterPlugins) ? value.adapterPlugins.filter(isRecord) : [],
1097
+ pluginErrors: Array.isArray(value.pluginErrors)
1098
+ ? value.pluginErrors.flatMap((entry) => normalizePluginError(entry))
1099
+ : [],
1100
+ metadata: isRecord(value.metadata) ? value.metadata : {}
739
1101
  };
740
1102
  }
1103
+ function normalizePluginError(value) {
1104
+ if (!isRecord(value)) {
1105
+ return [];
1106
+ }
1107
+ const code = optionalString(value.code);
1108
+ const message = optionalString(value.message);
1109
+ if (!code || !message) {
1110
+ return [];
1111
+ }
1112
+ return [{
1113
+ pluginId: optionalString(value.pluginId),
1114
+ code,
1115
+ message,
1116
+ details: isRecord(value.details) ? value.details : {}
1117
+ }];
1118
+ }
741
1119
  function requireRenderedHtml(record) {
742
1120
  return requireString(record.html, "html");
743
1121
  }
@@ -849,6 +1227,47 @@ function dedupeOverlayMounts(mounts) {
849
1227
  }
850
1228
  return [...byId.values()];
851
1229
  }
1230
+ function resolveDesignTabOverlaySelection(document, nodeId, selectionHint) {
1231
+ const selector = typeof selectionHint.selector === "string" && selectionHint.selector.trim().length > 0
1232
+ ? selectionHint.selector.trim()
1233
+ : null;
1234
+ const resolvedNodeId = nodeId
1235
+ ?? readNodeIdFromSelector(selector)
1236
+ ?? null;
1237
+ if (!resolvedNodeId) {
1238
+ return { matched: false, selector };
1239
+ }
1240
+ const node = findDocumentNode(document, resolvedNodeId);
1241
+ if (!node) {
1242
+ return { matched: false, selector: selector ?? `[data-node-id="${resolvedNodeId}"]` };
1243
+ }
1244
+ const text = typeof node.props.text === "string" ? node.props.text : null;
1245
+ return {
1246
+ matched: true,
1247
+ selector: selector ?? `[data-node-id="${resolvedNodeId}"]`,
1248
+ nodeId: resolvedNodeId,
1249
+ tagName: "div",
1250
+ text: text ? text.slice(0, 160) : "",
1251
+ id: null,
1252
+ className: "canvas-stage-node"
1253
+ };
1254
+ }
1255
+ function readNodeIdFromSelector(selector) {
1256
+ if (!selector) {
1257
+ return null;
1258
+ }
1259
+ const match = selector.match(/^\[data-node-id=["']([^"'\\]]+)["']\]$/);
1260
+ return match?.[1] ?? null;
1261
+ }
1262
+ function findDocumentNode(document, nodeId) {
1263
+ for (const page of document.pages) {
1264
+ const node = page.nodes.find((entry) => entry.id === nodeId);
1265
+ if (node) {
1266
+ return node;
1267
+ }
1268
+ }
1269
+ return null;
1270
+ }
852
1271
  function requireRecord(value, label) {
853
1272
  if (!value || typeof value !== "object" || Array.isArray(value)) {
854
1273
  throw new Error(`Invalid ${label}`);
@@ -861,6 +1280,12 @@ function resolveCanvasSessionId(message, payload) {
861
1280
  ?? optionalString(isRecord(payload.summary) ? payload.summary.canvasSessionId : undefined)
862
1281
  ?? createCoordinatorId();
863
1282
  }
1283
+ function readBrowserSessionId(summary) {
1284
+ if (!summary) {
1285
+ return null;
1286
+ }
1287
+ return optionalString(summary.browserSessionId);
1288
+ }
864
1289
  function resolveSessionForMessage(sessions, message, payload) {
865
1290
  const directId = optionalString(message.canvasSessionId)
866
1291
  ?? optionalString(payload.canvasSessionId)
@@ -880,6 +1305,10 @@ function resolveSessionForMessage(sessions, message, payload) {
880
1305
  function missingCanvasSession() {
881
1306
  return new Error("Missing canvasSessionId");
882
1307
  }
1308
+ function isIgnorableCanvasCloseLookupError(error) {
1309
+ const message = error instanceof Error ? error.message : String(error ?? "");
1310
+ return message.includes("Unknown sessionId:") || message === "Missing canvasSessionId";
1311
+ }
883
1312
  function isRecord(value) {
884
1313
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
885
1314
  }