opendevbrowser 0.0.15 → 0.0.17

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 (646) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +262 -43
  3. package/dist/annotate/direct-annotator.d.ts +22 -0
  4. package/dist/annotate/direct-annotator.d.ts.map +1 -0
  5. package/dist/annotate/output.d.ts +10 -0
  6. package/dist/annotate/output.d.ts.map +1 -0
  7. package/dist/browser/annotation-manager.d.ts +33 -0
  8. package/dist/browser/annotation-manager.d.ts.map +1 -0
  9. package/dist/browser/browser-manager.d.ts +402 -0
  10. package/dist/browser/browser-manager.d.ts.map +1 -0
  11. package/dist/browser/canvas-client.d.ts +53 -0
  12. package/dist/browser/canvas-client.d.ts.map +1 -0
  13. package/dist/browser/canvas-code-sync-manager.d.ts +79 -0
  14. package/dist/browser/canvas-code-sync-manager.d.ts.map +1 -0
  15. package/dist/browser/canvas-manager.d.ts +94 -0
  16. package/dist/browser/canvas-manager.d.ts.map +1 -0
  17. package/dist/browser/canvas-runtime-preview-bridge.d.ts +20 -0
  18. package/dist/browser/canvas-runtime-preview-bridge.d.ts.map +1 -0
  19. package/dist/browser/canvas-session-sync-manager.d.ts +21 -0
  20. package/dist/browser/canvas-session-sync-manager.d.ts.map +1 -0
  21. package/dist/browser/fingerprint/adapters.d.ts +26 -0
  22. package/dist/browser/fingerprint/adapters.d.ts.map +1 -0
  23. package/dist/browser/fingerprint/canary.d.ts +25 -0
  24. package/dist/browser/fingerprint/canary.d.ts.map +1 -0
  25. package/dist/browser/fingerprint/profiles.d.ts +16 -0
  26. package/dist/browser/fingerprint/profiles.d.ts.map +1 -0
  27. package/dist/browser/fingerprint/tier1-coherence.d.ts +36 -0
  28. package/dist/browser/fingerprint/tier1-coherence.d.ts.map +1 -0
  29. package/dist/browser/fingerprint/tier2-runtime.d.ts +40 -0
  30. package/dist/browser/fingerprint/tier2-runtime.d.ts.map +1 -0
  31. package/dist/browser/fingerprint/tier3-adaptive.d.ts +30 -0
  32. package/dist/browser/fingerprint/tier3-adaptive.d.ts.map +1 -0
  33. package/dist/browser/manager-types.d.ts +15 -0
  34. package/dist/browser/manager-types.d.ts.map +1 -0
  35. package/dist/browser/ops-browser-manager.d.ts +141 -0
  36. package/dist/browser/ops-browser-manager.d.ts.map +1 -0
  37. package/dist/browser/ops-client.d.ts +56 -0
  38. package/dist/browser/ops-client.d.ts.map +1 -0
  39. package/dist/browser/parallelism-governor.d.ts +31 -0
  40. package/dist/browser/parallelism-governor.d.ts.map +1 -0
  41. package/dist/browser/script-runner.d.ts +23 -0
  42. package/dist/browser/script-runner.d.ts.map +1 -0
  43. package/dist/browser/session-store.d.ts +63 -0
  44. package/dist/browser/session-store.d.ts.map +1 -0
  45. package/dist/browser/target-manager.d.ts +36 -0
  46. package/dist/browser/target-manager.d.ts.map +1 -0
  47. package/dist/cache/chrome-locator.d.ts +2 -0
  48. package/dist/cache/chrome-locator.d.ts.map +1 -0
  49. package/dist/cache/downloader.d.ts +6 -0
  50. package/dist/cache/downloader.d.ts.map +1 -0
  51. package/dist/cache/paths.d.ts +9 -0
  52. package/dist/cache/paths.d.ts.map +1 -0
  53. package/dist/canvas/code-sync/apply-tsx.d.ts +23 -0
  54. package/dist/canvas/code-sync/apply-tsx.d.ts.map +1 -0
  55. package/dist/canvas/code-sync/graph.d.ts +5 -0
  56. package/dist/canvas/code-sync/graph.d.ts.map +1 -0
  57. package/dist/canvas/code-sync/hash.d.ts +3 -0
  58. package/dist/canvas/code-sync/hash.d.ts.map +1 -0
  59. package/dist/canvas/code-sync/import.d.ts +18 -0
  60. package/dist/canvas/code-sync/import.d.ts.map +1 -0
  61. package/dist/canvas/code-sync/manifest.d.ts +5 -0
  62. package/dist/canvas/code-sync/manifest.d.ts.map +1 -0
  63. package/dist/canvas/code-sync/tsx-adapter.d.ts +8 -0
  64. package/dist/canvas/code-sync/tsx-adapter.d.ts.map +1 -0
  65. package/dist/canvas/code-sync/types.d.ts +152 -0
  66. package/dist/canvas/code-sync/types.d.ts.map +1 -0
  67. package/dist/canvas/code-sync/write.d.ts +9 -0
  68. package/dist/canvas/code-sync/write.d.ts.map +1 -0
  69. package/dist/canvas/document-store.d.ts +81 -0
  70. package/dist/canvas/document-store.d.ts.map +1 -0
  71. package/dist/canvas/export.d.ts +12 -0
  72. package/dist/canvas/export.d.ts.map +1 -0
  73. package/dist/canvas/repo-store.d.ts +10 -0
  74. package/dist/canvas/repo-store.d.ts.map +1 -0
  75. package/dist/canvas/surface-palette.d.ts +15 -0
  76. package/dist/canvas/surface-palette.d.ts.map +1 -0
  77. package/dist/canvas/types.d.ts +255 -0
  78. package/dist/canvas/types.d.ts.map +1 -0
  79. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js +7 -0
  80. package/dist/canvas-runtime-preview-bridge-HBEHXM4T.js.map +1 -0
  81. package/dist/chunk-5J3IFL3X.js +16706 -0
  82. package/dist/chunk-5J3IFL3X.js.map +1 -0
  83. package/dist/chunk-D633UO34.js +8149 -0
  84. package/dist/chunk-D633UO34.js.map +1 -0
  85. package/dist/chunk-FUSXMW3G.js +169 -0
  86. package/dist/chunk-FUSXMW3G.js.map +1 -0
  87. package/dist/chunk-TBUCZX4A.js +34 -0
  88. package/dist/chunk-TBUCZX4A.js.map +1 -0
  89. package/dist/chunk-V7KUDHDG.js +276 -0
  90. package/dist/chunk-V7KUDHDG.js.map +1 -0
  91. package/dist/chunk-Y2KL55OG.js +59 -0
  92. package/dist/chunk-Y2KL55OG.js.map +1 -0
  93. package/dist/cli/args.d.ts +25 -0
  94. package/dist/cli/args.d.ts.map +1 -0
  95. package/dist/cli/client.d.ts +2 -0
  96. package/dist/cli/client.d.ts.map +1 -0
  97. package/dist/cli/commands/annotate.d.ts +38 -0
  98. package/dist/cli/commands/annotate.d.ts.map +1 -0
  99. package/dist/cli/commands/artifacts.d.ts +24 -0
  100. package/dist/cli/commands/artifacts.d.ts.map +1 -0
  101. package/dist/cli/commands/canvas.d.ts +45 -0
  102. package/dist/cli/commands/canvas.d.ts.map +1 -0
  103. package/dist/cli/commands/daemon.d.ts +35 -0
  104. package/dist/cli/commands/daemon.d.ts.map +1 -0
  105. package/dist/cli/commands/devtools/console-poll.d.ts +7 -0
  106. package/dist/cli/commands/devtools/console-poll.d.ts.map +1 -0
  107. package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts +20 -0
  108. package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts.map +1 -0
  109. package/dist/cli/commands/devtools/network-poll.d.ts +7 -0
  110. package/dist/cli/commands/devtools/network-poll.d.ts.map +1 -0
  111. package/dist/cli/commands/devtools/perf.d.ts +7 -0
  112. package/dist/cli/commands/devtools/perf.d.ts.map +1 -0
  113. package/dist/cli/commands/devtools/screenshot.d.ts +18 -0
  114. package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -0
  115. package/dist/cli/commands/dom/attr.d.ts +7 -0
  116. package/dist/cli/commands/dom/attr.d.ts.map +1 -0
  117. package/dist/cli/commands/dom/checked.d.ts +7 -0
  118. package/dist/cli/commands/dom/checked.d.ts.map +1 -0
  119. package/dist/cli/commands/dom/enabled.d.ts +7 -0
  120. package/dist/cli/commands/dom/enabled.d.ts.map +1 -0
  121. package/dist/cli/commands/dom/html.d.ts +7 -0
  122. package/dist/cli/commands/dom/html.d.ts.map +1 -0
  123. package/dist/cli/commands/dom/text.d.ts +7 -0
  124. package/dist/cli/commands/dom/text.d.ts.map +1 -0
  125. package/dist/cli/commands/dom/value.d.ts +7 -0
  126. package/dist/cli/commands/dom/value.d.ts.map +1 -0
  127. package/dist/cli/commands/dom/visible.d.ts +7 -0
  128. package/dist/cli/commands/dom/visible.d.ts.map +1 -0
  129. package/dist/cli/commands/export/clone-component.d.ts +16 -0
  130. package/dist/cli/commands/export/clone-component.d.ts.map +1 -0
  131. package/dist/cli/commands/export/clone-page.d.ts +15 -0
  132. package/dist/cli/commands/export/clone-page.d.ts.map +1 -0
  133. package/dist/cli/commands/interact/check.d.ts +7 -0
  134. package/dist/cli/commands/interact/check.d.ts.map +1 -0
  135. package/dist/cli/commands/interact/click.d.ts +7 -0
  136. package/dist/cli/commands/interact/click.d.ts.map +1 -0
  137. package/dist/cli/commands/interact/hover.d.ts +7 -0
  138. package/dist/cli/commands/interact/hover.d.ts.map +1 -0
  139. package/dist/cli/commands/interact/press.d.ts +7 -0
  140. package/dist/cli/commands/interact/press.d.ts.map +1 -0
  141. package/dist/cli/commands/interact/scroll-into-view.d.ts +7 -0
  142. package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -0
  143. package/dist/cli/commands/interact/scroll.d.ts +7 -0
  144. package/dist/cli/commands/interact/scroll.d.ts.map +1 -0
  145. package/dist/cli/commands/interact/select.d.ts +7 -0
  146. package/dist/cli/commands/interact/select.d.ts.map +1 -0
  147. package/dist/cli/commands/interact/type.d.ts +7 -0
  148. package/dist/cli/commands/interact/type.d.ts.map +1 -0
  149. package/dist/cli/commands/interact/uncheck.d.ts +7 -0
  150. package/dist/cli/commands/interact/uncheck.d.ts.map +1 -0
  151. package/dist/cli/commands/macro-resolve.d.ts +18 -0
  152. package/dist/cli/commands/macro-resolve.d.ts.map +1 -0
  153. package/dist/cli/commands/native.d.ts +93 -0
  154. package/dist/cli/commands/native.d.ts.map +1 -0
  155. package/dist/cli/commands/nav/goto.d.ts +7 -0
  156. package/dist/cli/commands/nav/goto.d.ts.map +1 -0
  157. package/dist/cli/commands/nav/snapshot.d.ts +7 -0
  158. package/dist/cli/commands/nav/snapshot.d.ts.map +1 -0
  159. package/dist/cli/commands/nav/wait.d.ts +7 -0
  160. package/dist/cli/commands/nav/wait.d.ts.map +1 -0
  161. package/dist/cli/commands/pages/close.d.ts +6 -0
  162. package/dist/cli/commands/pages/close.d.ts.map +1 -0
  163. package/dist/cli/commands/pages/list.d.ts +7 -0
  164. package/dist/cli/commands/pages/list.d.ts.map +1 -0
  165. package/dist/cli/commands/pages/open.d.ts +7 -0
  166. package/dist/cli/commands/pages/open.d.ts.map +1 -0
  167. package/dist/cli/commands/product-video.d.ts +25 -0
  168. package/dist/cli/commands/product-video.d.ts.map +1 -0
  169. package/dist/cli/commands/registry.d.ts +5 -0
  170. package/dist/cli/commands/registry.d.ts.map +1 -0
  171. package/dist/cli/commands/research.d.ts +27 -0
  172. package/dist/cli/commands/research.d.ts.map +1 -0
  173. package/dist/cli/commands/rpc.d.ts +28 -0
  174. package/dist/cli/commands/rpc.d.ts.map +1 -0
  175. package/dist/cli/commands/run.d.ts +17 -0
  176. package/dist/cli/commands/run.d.ts.map +1 -0
  177. package/dist/cli/commands/serve.d.ts +64 -0
  178. package/dist/cli/commands/serve.d.ts.map +1 -0
  179. package/dist/cli/commands/session/connect.d.ts +9 -0
  180. package/dist/cli/commands/session/connect.d.ts.map +1 -0
  181. package/dist/cli/commands/session/cookie-import.d.ts +31 -0
  182. package/dist/cli/commands/session/cookie-import.d.ts.map +1 -0
  183. package/dist/cli/commands/session/cookie-list.d.ts +17 -0
  184. package/dist/cli/commands/session/cookie-list.d.ts.map +1 -0
  185. package/dist/cli/commands/session/disconnect.d.ts +6 -0
  186. package/dist/cli/commands/session/disconnect.d.ts.map +1 -0
  187. package/dist/cli/commands/session/launch.d.ts +29 -0
  188. package/dist/cli/commands/session/launch.d.ts.map +1 -0
  189. package/dist/cli/commands/session/status.d.ts +7 -0
  190. package/dist/cli/commands/session/status.d.ts.map +1 -0
  191. package/dist/cli/commands/shopping.d.ts +25 -0
  192. package/dist/cli/commands/shopping.d.ts.map +1 -0
  193. package/dist/cli/commands/status.d.ts +24 -0
  194. package/dist/cli/commands/status.d.ts.map +1 -0
  195. package/dist/cli/commands/targets/close.d.ts +6 -0
  196. package/dist/cli/commands/targets/close.d.ts.map +1 -0
  197. package/dist/cli/commands/targets/list.d.ts +7 -0
  198. package/dist/cli/commands/targets/list.d.ts.map +1 -0
  199. package/dist/cli/commands/targets/new.d.ts +7 -0
  200. package/dist/cli/commands/targets/new.d.ts.map +1 -0
  201. package/dist/cli/commands/targets/use.d.ts +7 -0
  202. package/dist/cli/commands/targets/use.d.ts.map +1 -0
  203. package/dist/cli/commands/types.d.ts +13 -0
  204. package/dist/cli/commands/types.d.ts.map +1 -0
  205. package/dist/cli/commands/uninstall.d.ts +14 -0
  206. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  207. package/dist/cli/commands/update.d.ts +7 -0
  208. package/dist/cli/commands/update.d.ts.map +1 -0
  209. package/dist/cli/daemon-autostart.d.ts +46 -0
  210. package/dist/cli/daemon-autostart.d.ts.map +1 -0
  211. package/dist/cli/daemon-client.d.ts +33 -0
  212. package/dist/cli/daemon-client.d.ts.map +1 -0
  213. package/dist/cli/daemon-commands.d.ts +7 -0
  214. package/dist/cli/daemon-commands.d.ts.map +1 -0
  215. package/dist/cli/daemon-state.d.ts +56 -0
  216. package/dist/cli/daemon-state.d.ts.map +1 -0
  217. package/dist/cli/daemon-status.d.ts +19 -0
  218. package/dist/cli/daemon-status.d.ts.map +1 -0
  219. package/dist/cli/daemon.d.ts +29 -0
  220. package/dist/cli/daemon.d.ts.map +1 -0
  221. package/dist/cli/errors.d.ts +20 -0
  222. package/dist/cli/errors.d.ts.map +1 -0
  223. package/dist/cli/help.d.ts +33 -0
  224. package/dist/cli/help.d.ts.map +1 -0
  225. package/dist/cli/index.d.ts +2 -0
  226. package/dist/cli/index.d.ts.map +1 -0
  227. package/dist/cli/index.js +2825 -326
  228. package/dist/cli/index.js.map +1 -1
  229. package/dist/cli/installers/global.d.ts +9 -0
  230. package/dist/cli/installers/global.d.ts.map +1 -0
  231. package/dist/cli/installers/local.d.ts +9 -0
  232. package/dist/cli/installers/local.d.ts.map +1 -0
  233. package/dist/cli/installers/skills.d.ts +19 -0
  234. package/dist/cli/installers/skills.d.ts.map +1 -0
  235. package/dist/cli/output.d.ts +7 -0
  236. package/dist/cli/output.d.ts.map +1 -0
  237. package/dist/cli/remote-canvas-manager.d.ts +8 -0
  238. package/dist/cli/remote-canvas-manager.d.ts.map +1 -0
  239. package/dist/cli/remote-manager.d.ts +98 -0
  240. package/dist/cli/remote-manager.d.ts.map +1 -0
  241. package/dist/cli/remote-relay.d.ts +19 -0
  242. package/dist/cli/remote-relay.d.ts.map +1 -0
  243. package/dist/cli/templates/config.d.ts +7 -0
  244. package/dist/cli/templates/config.d.ts.map +1 -0
  245. package/dist/cli/utils/config.d.ts +20 -0
  246. package/dist/cli/utils/config.d.ts.map +1 -0
  247. package/dist/cli/utils/http.d.ts +5 -0
  248. package/dist/cli/utils/http.d.ts.map +1 -0
  249. package/dist/cli/utils/parse.d.ts +9 -0
  250. package/dist/cli/utils/parse.d.ts.map +1 -0
  251. package/dist/cli/utils/skills.d.ts +12 -0
  252. package/dist/cli/utils/skills.d.ts.map +1 -0
  253. package/dist/config.d.ts +208 -0
  254. package/dist/config.d.ts.map +1 -0
  255. package/dist/core/bootstrap.d.ts +3 -0
  256. package/dist/core/bootstrap.d.ts.map +1 -0
  257. package/dist/core/index.d.ts +3 -0
  258. package/dist/core/index.d.ts.map +1 -0
  259. package/dist/core/logging.d.ts +34 -0
  260. package/dist/core/logging.d.ts.map +1 -0
  261. package/dist/core/types.d.ts +36 -0
  262. package/dist/core/types.d.ts.map +1 -0
  263. package/dist/devtools/console-tracker.d.ts +44 -0
  264. package/dist/devtools/console-tracker.d.ts.map +1 -0
  265. package/dist/devtools/exception-tracker.d.ts +42 -0
  266. package/dist/devtools/exception-tracker.d.ts.map +1 -0
  267. package/dist/devtools/network-tracker.d.ts +34 -0
  268. package/dist/devtools/network-tracker.d.ts.map +1 -0
  269. package/dist/export/css-extract.d.ts +5 -0
  270. package/dist/export/css-extract.d.ts.map +1 -0
  271. package/dist/export/dom-capture.d.ts +15 -0
  272. package/dist/export/dom-capture.d.ts.map +1 -0
  273. package/dist/export/react-emitter.d.ts +11 -0
  274. package/dist/export/react-emitter.d.ts.map +1 -0
  275. package/dist/extension-extractor.d.ts +3 -0
  276. package/dist/extension-extractor.d.ts.map +1 -0
  277. package/dist/fs-UMRKOBNN.js +7 -0
  278. package/dist/fs-UMRKOBNN.js.map +1 -0
  279. package/dist/index.d.ts +3 -4
  280. package/dist/index.d.ts.map +1 -0
  281. package/dist/index.js +1028 -123
  282. package/dist/index.js.map +1 -1
  283. package/dist/macros/execute.d.ts +44 -0
  284. package/dist/macros/execute.d.ts.map +1 -0
  285. package/dist/macros/index.d.ts +9 -0
  286. package/dist/macros/index.d.ts.map +1 -0
  287. package/dist/macros/packs/core.d.ts +3 -0
  288. package/dist/macros/packs/core.d.ts.map +1 -0
  289. package/dist/macros/registry.d.ts +48 -0
  290. package/dist/macros/registry.d.ts.map +1 -0
  291. package/dist/macros-ND2M7LWU.js +399 -0
  292. package/dist/macros-ND2M7LWU.js.map +1 -0
  293. package/dist/opendevbrowser.d.ts +3 -4
  294. package/dist/opendevbrowser.d.ts.map +1 -0
  295. package/dist/opendevbrowser.js +1028 -123
  296. package/dist/opendevbrowser.js.map +1 -1
  297. package/dist/providers/adaptive-concurrency.d.ts +42 -0
  298. package/dist/providers/adaptive-concurrency.d.ts.map +1 -0
  299. package/dist/providers/artifacts.d.ts +34 -0
  300. package/dist/providers/artifacts.d.ts.map +1 -0
  301. package/dist/providers/blocker.d.ts +47 -0
  302. package/dist/providers/blocker.d.ts.map +1 -0
  303. package/dist/providers/community/index.d.ts +44 -0
  304. package/dist/providers/community/index.d.ts.map +1 -0
  305. package/dist/providers/enrichment.d.ts +33 -0
  306. package/dist/providers/enrichment.d.ts.map +1 -0
  307. package/dist/providers/errors.d.ts +41 -0
  308. package/dist/providers/errors.d.ts.map +1 -0
  309. package/dist/providers/index.d.ts +121 -0
  310. package/dist/providers/index.d.ts.map +1 -0
  311. package/dist/providers/normalize.d.ts +39 -0
  312. package/dist/providers/normalize.d.ts.map +1 -0
  313. package/dist/providers/policy.d.ts +5 -0
  314. package/dist/providers/policy.d.ts.map +1 -0
  315. package/dist/providers/registry.d.ts +22 -0
  316. package/dist/providers/registry.d.ts.map +1 -0
  317. package/dist/providers/renderer.d.ts +49 -0
  318. package/dist/providers/renderer.d.ts.map +1 -0
  319. package/dist/providers/runtime-factory.d.ts +20 -0
  320. package/dist/providers/runtime-factory.d.ts.map +1 -0
  321. package/dist/providers/safety/prompt-guard.d.ts +34 -0
  322. package/dist/providers/safety/prompt-guard.d.ts.map +1 -0
  323. package/dist/providers/shared/anti-bot-policy.d.ts +51 -0
  324. package/dist/providers/shared/anti-bot-policy.d.ts.map +1 -0
  325. package/dist/providers/shared/post-policy.d.ts +31 -0
  326. package/dist/providers/shared/post-policy.d.ts.map +1 -0
  327. package/dist/providers/shared/request-headers.d.ts +5 -0
  328. package/dist/providers/shared/request-headers.d.ts.map +1 -0
  329. package/dist/providers/shared/traversal-url.d.ts +2 -0
  330. package/dist/providers/shared/traversal-url.d.ts.map +1 -0
  331. package/dist/providers/shopping/index.d.ts +63 -0
  332. package/dist/providers/shopping/index.d.ts.map +1 -0
  333. package/dist/providers/social/bluesky.d.ts +3 -0
  334. package/dist/providers/social/bluesky.d.ts.map +1 -0
  335. package/dist/providers/social/facebook.d.ts +3 -0
  336. package/dist/providers/social/facebook.d.ts.map +1 -0
  337. package/dist/providers/social/index.d.ts +31 -0
  338. package/dist/providers/social/index.d.ts.map +1 -0
  339. package/dist/providers/social/instagram.d.ts +3 -0
  340. package/dist/providers/social/instagram.d.ts.map +1 -0
  341. package/dist/providers/social/linkedin.d.ts +3 -0
  342. package/dist/providers/social/linkedin.d.ts.map +1 -0
  343. package/dist/providers/social/platform.d.ts +40 -0
  344. package/dist/providers/social/platform.d.ts.map +1 -0
  345. package/dist/providers/social/reddit.d.ts +3 -0
  346. package/dist/providers/social/reddit.d.ts.map +1 -0
  347. package/dist/providers/social/threads.d.ts +3 -0
  348. package/dist/providers/social/threads.d.ts.map +1 -0
  349. package/dist/providers/social/tiktok.d.ts +3 -0
  350. package/dist/providers/social/tiktok.d.ts.map +1 -0
  351. package/dist/providers/social/x.d.ts +3 -0
  352. package/dist/providers/social/x.d.ts.map +1 -0
  353. package/dist/providers/social/youtube-resolver.d.ts +78 -0
  354. package/dist/providers/social/youtube-resolver.d.ts.map +1 -0
  355. package/dist/providers/social/youtube.d.ts +34 -0
  356. package/dist/providers/social/youtube.d.ts.map +1 -0
  357. package/dist/providers/tier-router.d.ts +30 -0
  358. package/dist/providers/tier-router.d.ts.map +1 -0
  359. package/dist/providers/timebox.d.ts +20 -0
  360. package/dist/providers/timebox.d.ts.map +1 -0
  361. package/dist/providers/types.d.ts +344 -0
  362. package/dist/providers/types.d.ts.map +1 -0
  363. package/dist/providers/web/crawl-worker.d.ts +36 -0
  364. package/dist/providers/web/crawl-worker.d.ts.map +1 -0
  365. package/dist/providers/web/crawler.d.ts +101 -0
  366. package/dist/providers/web/crawler.d.ts.map +1 -0
  367. package/dist/providers/web/extract.d.ts +11 -0
  368. package/dist/providers/web/extract.d.ts.map +1 -0
  369. package/dist/providers/web/index.d.ts +24 -0
  370. package/dist/providers/web/index.d.ts.map +1 -0
  371. package/dist/providers/web/policy.d.ts +14 -0
  372. package/dist/providers/web/policy.d.ts.map +1 -0
  373. package/dist/providers/workflows.d.ts +67 -0
  374. package/dist/providers/workflows.d.ts.map +1 -0
  375. package/dist/providers-G3LRHQXX.js +121 -0
  376. package/dist/providers-G3LRHQXX.js.map +1 -0
  377. package/dist/relay/protocol.d.ts +399 -0
  378. package/dist/relay/protocol.d.ts.map +1 -0
  379. package/dist/relay/relay-endpoints.d.ts +16 -0
  380. package/dist/relay/relay-endpoints.d.ts.map +1 -0
  381. package/dist/relay/relay-server.d.ts +124 -0
  382. package/dist/relay/relay-server.d.ts.map +1 -0
  383. package/dist/relay/relay-types.d.ts +12 -0
  384. package/dist/relay/relay-types.d.ts.map +1 -0
  385. package/dist/runtime-factory-BICHDPE7.js +13 -0
  386. package/dist/runtime-factory-BICHDPE7.js.map +1 -0
  387. package/dist/skills/continuity-nudge.d.ts +12 -0
  388. package/dist/skills/continuity-nudge.d.ts.map +1 -0
  389. package/dist/skills/skill-loader.d.ts +20 -0
  390. package/dist/skills/skill-loader.d.ts.map +1 -0
  391. package/dist/skills/skill-nudge.d.ts +18 -0
  392. package/dist/skills/skill-nudge.d.ts.map +1 -0
  393. package/dist/skills/types.d.ts +12 -0
  394. package/dist/skills/types.d.ts.map +1 -0
  395. package/dist/snapshot/ops-snapshot.d.ts +16 -0
  396. package/dist/snapshot/ops-snapshot.d.ts.map +1 -0
  397. package/dist/snapshot/refs.d.ts +23 -0
  398. package/dist/snapshot/refs.d.ts.map +1 -0
  399. package/dist/snapshot/snapshotter.d.ts +27 -0
  400. package/dist/snapshot/snapshotter.d.ts.map +1 -0
  401. package/dist/tools/annotate.d.ts +4 -0
  402. package/dist/tools/annotate.d.ts.map +1 -0
  403. package/dist/tools/canvas.d.ts +4 -0
  404. package/dist/tools/canvas.d.ts.map +1 -0
  405. package/dist/tools/check.d.ts +4 -0
  406. package/dist/tools/check.d.ts.map +1 -0
  407. package/dist/tools/click.d.ts +4 -0
  408. package/dist/tools/click.d.ts.map +1 -0
  409. package/dist/tools/clone_component.d.ts +4 -0
  410. package/dist/tools/clone_component.d.ts.map +1 -0
  411. package/dist/tools/clone_page.d.ts +4 -0
  412. package/dist/tools/clone_page.d.ts.map +1 -0
  413. package/dist/tools/close.d.ts +4 -0
  414. package/dist/tools/close.d.ts.map +1 -0
  415. package/dist/tools/connect.d.ts +4 -0
  416. package/dist/tools/connect.d.ts.map +1 -0
  417. package/dist/tools/console_poll.d.ts +4 -0
  418. package/dist/tools/console_poll.d.ts.map +1 -0
  419. package/dist/tools/cookie_import.d.ts +25 -0
  420. package/dist/tools/cookie_import.d.ts.map +1 -0
  421. package/dist/tools/cookie_list.d.ts +9 -0
  422. package/dist/tools/cookie_list.d.ts.map +1 -0
  423. package/dist/tools/debug_trace_snapshot.d.ts +4 -0
  424. package/dist/tools/debug_trace_snapshot.d.ts.map +1 -0
  425. package/dist/tools/deps.d.ts +28 -0
  426. package/dist/tools/deps.d.ts.map +1 -0
  427. package/dist/tools/disconnect.d.ts +4 -0
  428. package/dist/tools/disconnect.d.ts.map +1 -0
  429. package/dist/tools/dom_get_html.d.ts +4 -0
  430. package/dist/tools/dom_get_html.d.ts.map +1 -0
  431. package/dist/tools/dom_get_text.d.ts +4 -0
  432. package/dist/tools/dom_get_text.d.ts.map +1 -0
  433. package/dist/tools/get_attr.d.ts +4 -0
  434. package/dist/tools/get_attr.d.ts.map +1 -0
  435. package/dist/tools/get_value.d.ts +4 -0
  436. package/dist/tools/get_value.d.ts.map +1 -0
  437. package/dist/tools/goto.d.ts +4 -0
  438. package/dist/tools/goto.d.ts.map +1 -0
  439. package/dist/tools/hover.d.ts +4 -0
  440. package/dist/tools/hover.d.ts.map +1 -0
  441. package/dist/tools/index.d.ts +4 -0
  442. package/dist/tools/index.d.ts.map +1 -0
  443. package/dist/tools/is_checked.d.ts +4 -0
  444. package/dist/tools/is_checked.d.ts.map +1 -0
  445. package/dist/tools/is_enabled.d.ts +4 -0
  446. package/dist/tools/is_enabled.d.ts.map +1 -0
  447. package/dist/tools/is_visible.d.ts +4 -0
  448. package/dist/tools/is_visible.d.ts.map +1 -0
  449. package/dist/tools/launch.d.ts +4 -0
  450. package/dist/tools/launch.d.ts.map +1 -0
  451. package/dist/tools/list.d.ts +4 -0
  452. package/dist/tools/list.d.ts.map +1 -0
  453. package/dist/tools/macro_resolve.d.ts +25 -0
  454. package/dist/tools/macro_resolve.d.ts.map +1 -0
  455. package/dist/tools/network_poll.d.ts +4 -0
  456. package/dist/tools/network_poll.d.ts.map +1 -0
  457. package/dist/tools/page.d.ts +4 -0
  458. package/dist/tools/page.d.ts.map +1 -0
  459. package/dist/tools/perf.d.ts +4 -0
  460. package/dist/tools/perf.d.ts.map +1 -0
  461. package/dist/tools/press.d.ts +4 -0
  462. package/dist/tools/press.d.ts.map +1 -0
  463. package/dist/tools/product_video_run.d.ts +4 -0
  464. package/dist/tools/product_video_run.d.ts.map +1 -0
  465. package/dist/tools/prompting_guide.d.ts +4 -0
  466. package/dist/tools/prompting_guide.d.ts.map +1 -0
  467. package/dist/tools/research_run.d.ts +4 -0
  468. package/dist/tools/research_run.d.ts.map +1 -0
  469. package/dist/tools/response.d.ts +19 -0
  470. package/dist/tools/response.d.ts.map +1 -0
  471. package/dist/tools/run.d.ts +4 -0
  472. package/dist/tools/run.d.ts.map +1 -0
  473. package/dist/tools/screenshot.d.ts +4 -0
  474. package/dist/tools/screenshot.d.ts.map +1 -0
  475. package/dist/tools/scroll.d.ts +4 -0
  476. package/dist/tools/scroll.d.ts.map +1 -0
  477. package/dist/tools/scroll_into_view.d.ts +4 -0
  478. package/dist/tools/scroll_into_view.d.ts.map +1 -0
  479. package/dist/tools/select.d.ts +4 -0
  480. package/dist/tools/select.d.ts.map +1 -0
  481. package/dist/tools/shopping_run.d.ts +4 -0
  482. package/dist/tools/shopping_run.d.ts.map +1 -0
  483. package/dist/tools/skill_list.d.ts +4 -0
  484. package/dist/tools/skill_list.d.ts.map +1 -0
  485. package/dist/tools/skill_load.d.ts +4 -0
  486. package/dist/tools/skill_load.d.ts.map +1 -0
  487. package/dist/tools/snapshot.d.ts +4 -0
  488. package/dist/tools/snapshot.d.ts.map +1 -0
  489. package/dist/tools/status.d.ts +4 -0
  490. package/dist/tools/status.d.ts.map +1 -0
  491. package/dist/tools/target_close.d.ts +4 -0
  492. package/dist/tools/target_close.d.ts.map +1 -0
  493. package/dist/tools/target_new.d.ts +4 -0
  494. package/dist/tools/target_new.d.ts.map +1 -0
  495. package/dist/tools/target_use.d.ts +4 -0
  496. package/dist/tools/target_use.d.ts.map +1 -0
  497. package/dist/tools/targets_list.d.ts +4 -0
  498. package/dist/tools/targets_list.d.ts.map +1 -0
  499. package/dist/tools/type.d.ts +4 -0
  500. package/dist/tools/type.d.ts.map +1 -0
  501. package/dist/tools/uncheck.d.ts +4 -0
  502. package/dist/tools/uncheck.d.ts.map +1 -0
  503. package/dist/tools/wait.d.ts +4 -0
  504. package/dist/tools/wait.d.ts.map +1 -0
  505. package/dist/tools/workflow-runtime.d.ts +3 -0
  506. package/dist/tools/workflow-runtime.d.ts.map +1 -0
  507. package/dist/utils/crypto.d.ts +2 -0
  508. package/dist/utils/crypto.d.ts.map +1 -0
  509. package/dist/utils/endpoint-validation.d.ts +2 -0
  510. package/dist/utils/endpoint-validation.d.ts.map +1 -0
  511. package/dist/utils/fs.d.ts +5 -0
  512. package/dist/utils/fs.d.ts.map +1 -0
  513. package/dist/utils/hub-enabled.d.ts +3 -0
  514. package/dist/utils/hub-enabled.d.ts.map +1 -0
  515. package/extension/canvas.html +636 -0
  516. package/extension/dist/annotate-content.css +15 -6
  517. package/extension/dist/annotate-content.js +119 -9
  518. package/extension/dist/annotation-payload.js +163 -0
  519. package/extension/dist/background.js +158 -22
  520. package/extension/dist/canvas/canvas-runtime.js +1061 -0
  521. package/extension/dist/canvas/model.js +213 -0
  522. package/extension/dist/canvas/viewport-fit.js +67 -0
  523. package/extension/dist/canvas-page.js +1801 -0
  524. package/extension/dist/ops/dom-bridge.js +116 -3
  525. package/extension/dist/ops/ops-runtime.js +1014 -48
  526. package/extension/dist/ops/ops-session-store.js +37 -116
  527. package/extension/dist/ops/parallelism-governor.js +117 -0
  528. package/extension/dist/ops/snapshot-shared.js +21 -5
  529. package/extension/dist/ops/target-session-coordinator.js +157 -0
  530. package/extension/dist/popup.js +155 -31
  531. package/extension/dist/services/CDPRouter.js +70 -5
  532. package/extension/dist/services/ConnectionManager.js +22 -3
  533. package/extension/dist/services/RelayClient.js +9 -0
  534. package/extension/dist/services/TabManager.js +35 -12
  535. package/extension/dist/types.js +2 -0
  536. package/extension/icons/icon128.png +0 -0
  537. package/extension/icons/icon16.png +0 -0
  538. package/extension/icons/icon32.png +0 -0
  539. package/extension/icons/icon48.png +0 -0
  540. package/extension/manifest.json +1 -1
  541. package/extension/popup.html +52 -0
  542. package/package.json +30 -19
  543. package/scripts/native/host.cjs +230 -0
  544. package/scripts/native/install.ps1 +73 -0
  545. package/scripts/native/install.sh +66 -0
  546. package/scripts/native/uninstall.ps1 +25 -0
  547. package/scripts/native/uninstall.sh +26 -0
  548. package/skills/AGENTS.md +20 -8
  549. package/skills/opendevbrowser-best-practices/SKILL.md +248 -74
  550. package/skills/opendevbrowser-best-practices/artifacts/browser-agent-known-issues-matrix.md +44 -0
  551. package/skills/opendevbrowser-best-practices/artifacts/canvas-governance-playbook.md +141 -0
  552. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +191 -0
  553. package/skills/opendevbrowser-best-practices/artifacts/debug-trace-playbook.md +36 -0
  554. package/skills/opendevbrowser-best-practices/artifacts/fingerprint-tiers.md +36 -0
  555. package/skills/opendevbrowser-best-practices/artifacts/macro-workflows.md +43 -0
  556. package/skills/opendevbrowser-best-practices/artifacts/parity-gates.md +36 -0
  557. package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +89 -0
  558. package/skills/opendevbrowser-best-practices/assets/templates/canvas-blocker-checklist.json +70 -0
  559. package/skills/opendevbrowser-best-practices/assets/templates/canvas-feedback-eval.json +73 -0
  560. package/skills/opendevbrowser-best-practices/assets/templates/canvas-generation-plan.v1.json +67 -0
  561. package/skills/opendevbrowser-best-practices/assets/templates/canvas-handshake-example.json +126 -0
  562. package/skills/opendevbrowser-best-practices/assets/templates/cdp-forward-envelope.json +11 -0
  563. package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +56 -0
  564. package/skills/opendevbrowser-best-practices/assets/templates/ops-request-envelope.json +9 -0
  565. package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +136 -0
  566. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +28 -0
  567. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +170 -0
  568. package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +164 -0
  569. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +234 -0
  570. package/skills/opendevbrowser-continuity-ledger/SKILL.md +10 -0
  571. package/skills/opendevbrowser-data-extraction/SKILL.md +126 -0
  572. package/skills/opendevbrowser-data-extraction/artifacts/extraction-workflows.md +31 -0
  573. package/skills/opendevbrowser-data-extraction/assets/templates/compliance-checklist.md +7 -0
  574. package/skills/opendevbrowser-data-extraction/assets/templates/extraction-schema.json +17 -0
  575. package/skills/opendevbrowser-data-extraction/assets/templates/pagination-state.json +11 -0
  576. package/skills/opendevbrowser-data-extraction/assets/templates/quality-gates.json +10 -0
  577. package/skills/opendevbrowser-data-extraction/examples/sample-schema.json +19 -0
  578. package/skills/opendevbrowser-data-extraction/scripts/run-extraction-workflow.sh +83 -0
  579. package/skills/opendevbrowser-data-extraction/scripts/validate-skill-assets.sh +49 -0
  580. package/skills/opendevbrowser-form-testing/SKILL.md +143 -0
  581. package/skills/opendevbrowser-form-testing/artifacts/form-workflows.md +37 -0
  582. package/skills/opendevbrowser-form-testing/assets/templates/a11y-assertions.md +7 -0
  583. package/skills/opendevbrowser-form-testing/assets/templates/challenge-decision-tree.json +16 -0
  584. package/skills/opendevbrowser-form-testing/assets/templates/multi-step-state.json +11 -0
  585. package/skills/opendevbrowser-form-testing/assets/templates/validation-matrix.json +24 -0
  586. package/skills/opendevbrowser-form-testing/examples/sample-validation-matrix.json +29 -0
  587. package/skills/opendevbrowser-form-testing/scripts/run-form-workflow.sh +82 -0
  588. package/skills/opendevbrowser-form-testing/scripts/validate-skill-assets.sh +49 -0
  589. package/skills/opendevbrowser-login-automation/SKILL.md +159 -0
  590. package/skills/opendevbrowser-login-automation/artifacts/login-workflows.md +39 -0
  591. package/skills/opendevbrowser-login-automation/assets/templates/auth-signals.json +21 -0
  592. package/skills/opendevbrowser-login-automation/assets/templates/challenge-checkpoint.md +10 -0
  593. package/skills/opendevbrowser-login-automation/assets/templates/login-scenario-matrix.json +26 -0
  594. package/skills/opendevbrowser-login-automation/examples/sample-auth-signals.json +14 -0
  595. package/skills/opendevbrowser-login-automation/scripts/record-auth-signals.sh +18 -0
  596. package/skills/opendevbrowser-login-automation/scripts/run-login-workflow.sh +99 -0
  597. package/skills/opendevbrowser-login-automation/scripts/validate-skill-assets.sh +50 -0
  598. package/skills/opendevbrowser-product-presentation-asset/SKILL.md +98 -0
  599. package/skills/opendevbrowser-product-presentation-asset/artifacts/asset-pack-assembly.md +23 -0
  600. package/skills/opendevbrowser-product-presentation-asset/artifacts/ugc-creative-guide.md +21 -0
  601. package/skills/opendevbrowser-product-presentation-asset/assets/templates/claims-evidence-map.md +5 -0
  602. package/skills/opendevbrowser-product-presentation-asset/assets/templates/copy.md +5 -0
  603. package/skills/opendevbrowser-product-presentation-asset/assets/templates/features.md +4 -0
  604. package/skills/opendevbrowser-product-presentation-asset/assets/templates/manifest.schema.json +14 -0
  605. package/skills/opendevbrowser-product-presentation-asset/assets/templates/shot-list.md +7 -0
  606. package/skills/opendevbrowser-product-presentation-asset/assets/templates/ugc-concepts.md +17 -0
  607. package/skills/opendevbrowser-product-presentation-asset/assets/templates/user-actions.md +7 -0
  608. package/skills/opendevbrowser-product-presentation-asset/assets/templates/video-assembly.md +18 -0
  609. package/skills/opendevbrowser-product-presentation-asset/examples/sample-input.json +6 -0
  610. package/skills/opendevbrowser-product-presentation-asset/examples/sample-manifest.json +18 -0
  611. package/skills/opendevbrowser-product-presentation-asset/scripts/capture-screenshots.sh +9 -0
  612. package/skills/opendevbrowser-product-presentation-asset/scripts/collect-product.sh +14 -0
  613. package/skills/opendevbrowser-product-presentation-asset/scripts/download-images.sh +9 -0
  614. package/skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh +96 -0
  615. package/skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh +56 -0
  616. package/skills/opendevbrowser-product-presentation-asset/scripts/write-manifest.sh +43 -0
  617. package/skills/opendevbrowser-research/SKILL.md +73 -0
  618. package/skills/opendevbrowser-research/artifacts/research-workflows.md +29 -0
  619. package/skills/opendevbrowser-research/assets/templates/compact.md +7 -0
  620. package/skills/opendevbrowser-research/assets/templates/context.json +18 -0
  621. package/skills/opendevbrowser-research/assets/templates/report.md +9 -0
  622. package/skills/opendevbrowser-research/examples/sample-input.json +6 -0
  623. package/skills/opendevbrowser-research/examples/sample-output.md +4 -0
  624. package/skills/opendevbrowser-research/scripts/render-output.sh +12 -0
  625. package/skills/opendevbrowser-research/scripts/run-research.sh +23 -0
  626. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +48 -0
  627. package/skills/opendevbrowser-research/scripts/write-artifacts.sh +29 -0
  628. package/skills/opendevbrowser-shopping/SKILL.md +118 -0
  629. package/skills/opendevbrowser-shopping/artifacts/deal-hunting-workflows.md +37 -0
  630. package/skills/opendevbrowser-shopping/assets/templates/deal-thresholds.json +8 -0
  631. package/skills/opendevbrowser-shopping/assets/templates/deals-context.json +9 -0
  632. package/skills/opendevbrowser-shopping/assets/templates/deals-table.md +4 -0
  633. package/skills/opendevbrowser-shopping/assets/templates/market-analysis.json +30 -0
  634. package/skills/opendevbrowser-shopping/examples/sample-deals.md +4 -0
  635. package/skills/opendevbrowser-shopping/examples/sample-query.json +5 -0
  636. package/skills/opendevbrowser-shopping/scripts/analyze-market.sh +307 -0
  637. package/skills/opendevbrowser-shopping/scripts/normalize-offers.sh +28 -0
  638. package/skills/opendevbrowser-shopping/scripts/render-deals.sh +13 -0
  639. package/skills/opendevbrowser-shopping/scripts/run-deal-hunt.sh +32 -0
  640. package/skills/opendevbrowser-shopping/scripts/run-shopping.sh +19 -0
  641. package/skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh +53 -0
  642. package/dist/chunk-JVBMT2O5.js +0 -7173
  643. package/dist/chunk-JVBMT2O5.js.map +0 -1
  644. package/skills/data-extraction/SKILL.md +0 -128
  645. package/skills/form-testing/SKILL.md +0 -106
  646. package/skills/login-automation/SKILL.md +0 -108
@@ -69,6 +69,7 @@ const ensureRoot = () => {
69
69
  <div class="odb-title">Annotate</div>
70
70
  <div class="odb-actions">
71
71
  <button class="odb-btn odb-btn-ghost" data-action="copy">Copy</button>
72
+ <button class="odb-btn odb-btn-ghost" data-action="send">Send</button>
72
73
  <button class="odb-btn odb-btn-ghost" data-action="cancel">Cancel</button>
73
74
  <button class="odb-btn odb-btn-primary" data-action="submit">Submit</button>
74
75
  <button class="odb-btn odb-btn-icon" data-action="close" aria-label="Close">×</button>
@@ -132,6 +133,12 @@ const ensureRoot = () => {
132
133
  setCopyFeedback("Copy failed");
133
134
  });
134
135
  }
136
+ if (action === "send") {
137
+ sendPayload(undefined, "annotate_all", "Annotation payload").catch((error) => {
138
+ logError("annotation.send_payload", error, { code: "annotation_send_failed" });
139
+ setCopyFeedback("Send failed");
140
+ });
141
+ }
135
142
  if (action === "cancel") {
136
143
  cancelSession();
137
144
  }
@@ -275,9 +282,15 @@ const handleClick = (event) => {
275
282
  return;
276
283
  event.preventDefault();
277
284
  event.stopPropagation();
278
- const target = state.hoverEl;
285
+ const clickedTarget = event.target instanceof Element && !isUiElement(event.target)
286
+ ? event.target
287
+ : null;
288
+ const target = clickedTarget ?? state.hoverEl;
279
289
  if (!target)
280
290
  return;
291
+ state.hoverEl = target;
292
+ state.hoverChain = buildAncestorChain(target);
293
+ state.hoverIndex = 0;
281
294
  if (event.shiftKey) {
282
295
  toggleSelection(target);
283
296
  }
@@ -372,17 +385,36 @@ const createNote = (element, id) => {
372
385
  note.innerHTML = `
373
386
  <div class="odb-note-header">
374
387
  <span>${describeElement(element)}</span>
375
- <button class="odb-note-close" aria-label="Remove">x</button>
388
+ <div class="odb-actions">
389
+ <button class="odb-btn odb-btn-ghost" data-role="copy-item" type="button">Copy</button>
390
+ <button class="odb-btn odb-btn-ghost" data-role="send-item" type="button">Send</button>
391
+ <button class="odb-note-close" data-role="remove-item" aria-label="Remove" type="button">x</button>
392
+ </div>
376
393
  </div>
377
394
  <textarea class="odb-note-input" rows="3" placeholder="Add annotation..."></textarea>
378
395
  `;
379
- const close = note.querySelector("button");
396
+ const close = note.querySelector("button[data-role='remove-item']");
380
397
  close.addEventListener("click", () => {
381
398
  note.remove();
382
399
  state.selections.delete(id);
383
400
  updateCount();
384
401
  scheduleConnectorUpdate();
385
402
  });
403
+ const copyButton = note.querySelector("button[data-role='copy-item']");
404
+ copyButton.addEventListener("click", () => {
405
+ void copyPayload([id], copyButton).catch((error) => {
406
+ logError("annotation.copy_item_payload", error, { code: "annotation_copy_item_failed", extra: { id } });
407
+ setButtonFeedback(copyButton, "Copy failed");
408
+ });
409
+ });
410
+ const sendButton = note.querySelector("button[data-role='send-item']");
411
+ sendButton.addEventListener("click", () => {
412
+ const selection = state.selections.get(id);
413
+ void sendPayload([id], "annotate_item", selection ? describeAnnotationItem(buildAnnotationItem(selection)) : "Annotation item", sendButton).catch((error) => {
414
+ logError("annotation.send_item_payload", error, { code: "annotation_send_item_failed", extra: { id } });
415
+ setButtonFeedback(sendButton, "Send failed");
416
+ });
417
+ });
386
418
  const textarea = note.querySelector("textarea");
387
419
  textarea.addEventListener("input", () => {
388
420
  const selection = state.selections.get(id);
@@ -495,7 +527,7 @@ const updateConnectors = () => {
495
527
  state.connectorLayer.appendChild(line);
496
528
  }
497
529
  };
498
- const buildPayload = async () => {
530
+ const buildCompletePayload = async () => {
499
531
  const url = window.location.href;
500
532
  const title = document.title;
501
533
  const timestamp = new Date().toISOString();
@@ -518,6 +550,15 @@ const buildPayload = async () => {
518
550
  annotations
519
551
  };
520
552
  };
553
+ const buildPayload = async (annotationIds) => {
554
+ const payload = await buildCompletePayload();
555
+ if (!annotationIds || annotationIds.length === 0) {
556
+ return payload;
557
+ }
558
+ return filterAnnotationPayload(payload, annotationIds, {
559
+ includeScreenshots: Boolean(payload.screenshots?.length)
560
+ });
561
+ };
521
562
  const extractBase64 = (dataUrl) => {
522
563
  if (!dataUrl.includes(","))
523
564
  return dataUrl;
@@ -841,12 +882,75 @@ const mergeOptions = (options) => {
841
882
  context: options?.context ?? DEFAULT_OPTIONS.context
842
883
  };
843
884
  };
844
- const copyPayload = async () => {
845
- const payload = await buildPayload();
885
+ const filterAnnotationPayload = (payload, annotationIds, options = {}) => {
886
+ const includeScreenshots = options.includeScreenshots ?? true;
887
+ const wanted = new Set(annotationIds);
888
+ const annotations = payload.annotations.filter((annotation) => wanted.has(annotation.id));
889
+ const screenshotIds = new Set(annotations
890
+ .map((annotation) => annotation.screenshotId)
891
+ .filter((value) => typeof value === "string" && value.length > 0));
892
+ const filtered = {
893
+ ...payload,
894
+ screenshotMode: includeScreenshots ? payload.screenshotMode : "none",
895
+ annotations: annotations.map((annotation) => {
896
+ if (includeScreenshots) {
897
+ return annotation;
898
+ }
899
+ const { screenshotId, ...next } = annotation;
900
+ void screenshotId;
901
+ return next;
902
+ })
903
+ };
904
+ if (includeScreenshots) {
905
+ filtered.screenshots = payload.screenshots?.filter((screenshot) => screenshotIds.has(screenshot.id));
906
+ }
907
+ else {
908
+ delete filtered.screenshots;
909
+ }
910
+ return filtered;
911
+ };
912
+ const describeAnnotationItem = (item) => {
913
+ const selector = item.selector?.trim().length ? item.selector : item.tag;
914
+ const label = item.note?.trim().length ? item.note.trim() : item.text?.trim();
915
+ return label ? `${selector} — ${label}` : selector;
916
+ };
917
+ const copyPayload = async (annotationIds, button) => {
918
+ const payload = await buildPayload(annotationIds);
846
919
  const text = JSON.stringify(payload);
847
920
  await writeClipboard(text);
921
+ if (button) {
922
+ setButtonFeedback(button, "Copied");
923
+ return;
924
+ }
848
925
  setCopyFeedback("Copied");
849
926
  };
927
+ const sendPayload = async (annotationIds, source, label, button) => {
928
+ const payload = await buildPayload(annotationIds);
929
+ await new Promise((resolve, reject) => {
930
+ chrome.runtime.sendMessage({
931
+ type: "annotation:sendPayload",
932
+ payload,
933
+ source,
934
+ label
935
+ }, (response) => {
936
+ const lastError = chrome.runtime.lastError;
937
+ if (lastError) {
938
+ reject(new Error(lastError.message));
939
+ return;
940
+ }
941
+ if (!response || response.ok !== true) {
942
+ reject(new Error(response?.error?.message ?? "Send failed"));
943
+ return;
944
+ }
945
+ resolve();
946
+ });
947
+ });
948
+ if (button) {
949
+ setButtonFeedback(button, "Sent");
950
+ return;
951
+ }
952
+ setCopyFeedback("Sent");
953
+ };
850
954
  const writeClipboard = async (value) => {
851
955
  if (navigator.clipboard?.writeText) {
852
956
  try {
@@ -874,17 +978,23 @@ const setCopyFeedback = (label) => {
874
978
  const button = state.copyButton;
875
979
  if (!button)
876
980
  return;
877
- const original = button.dataset.originalLabel ?? button.textContent ?? "Copy";
981
+ setButtonFeedback(button, label, true);
982
+ };
983
+ const setButtonFeedback = (button, label, useSharedTimer = false) => {
984
+ const original = button.dataset.originalLabel ?? button.textContent ?? button.getAttribute("aria-label") ?? "Action";
878
985
  if (!button.dataset.originalLabel) {
879
986
  button.dataset.originalLabel = original;
880
987
  }
881
988
  button.textContent = label;
882
- if (state.copyTimeout !== null) {
989
+ if (useSharedTimer && state.copyTimeout !== null) {
883
990
  window.clearTimeout(state.copyTimeout);
884
991
  }
885
- state.copyTimeout = window.setTimeout(() => {
992
+ const restore = window.setTimeout(() => {
886
993
  button.textContent = original;
887
994
  }, 1500);
995
+ if (useSharedTimer) {
996
+ state.copyTimeout = restore;
997
+ }
888
998
  };
889
999
  const bootstrap = () => {
890
1000
  if (window.__odbAnnotate) {
@@ -0,0 +1,163 @@
1
+ const isRecord = (value) => Boolean(value) && typeof value === "object" && !Array.isArray(value);
2
+ const readString = (value) => typeof value === "string" && value.trim().length > 0 ? value : null;
3
+ const formatCanvasUrl = (documentId, page) => {
4
+ const safePath = page.path && page.path.trim().length > 0 ? page.path : page.id;
5
+ return `canvas://${documentId}${safePath.startsWith("/") ? safePath : `/${safePath}`}`;
6
+ };
7
+ const readCanvasNodeText = (node) => {
8
+ const raw = node.props.text ?? node.metadata.text ?? node.name;
9
+ if (raw === undefined || raw === null) {
10
+ return undefined;
11
+ }
12
+ const text = typeof raw === "string" ? raw.trim() : String(raw).trim();
13
+ return text.length > 0 ? text.slice(0, 240) : undefined;
14
+ };
15
+ const formatCanvasStyleValue = (value) => {
16
+ if (typeof value === "number" && Number.isFinite(value)) {
17
+ return `${value}px`;
18
+ }
19
+ if (typeof value === "string" && value.trim().length > 0) {
20
+ return value;
21
+ }
22
+ return undefined;
23
+ };
24
+ const buildCanvasStyles = (node) => {
25
+ const style = isRecord(node.style) ? node.style : {};
26
+ return {
27
+ color: formatCanvasStyleValue(style.color),
28
+ backgroundColor: formatCanvasStyleValue(style.backgroundColor),
29
+ fontSize: formatCanvasStyleValue(style.fontSize),
30
+ fontFamily: formatCanvasStyleValue(style.fontFamily),
31
+ fontWeight: formatCanvasStyleValue(style.fontWeight),
32
+ lineHeight: formatCanvasStyleValue(style.lineHeight),
33
+ display: formatCanvasStyleValue(style.display),
34
+ position: formatCanvasStyleValue(style.position ?? "absolute")
35
+ };
36
+ };
37
+ const buildCanvasAttributes = (node) => {
38
+ const propsAttributes = isRecord(node.props.attributes) ? node.props.attributes : {};
39
+ const result = {
40
+ "data-node-id": node.id,
41
+ "data-canvas-kind": node.kind
42
+ };
43
+ for (const [key, value] of Object.entries(propsAttributes)) {
44
+ const next = readString(value);
45
+ if (next) {
46
+ result[key] = next;
47
+ }
48
+ }
49
+ const tagName = readString(node.props.tagName);
50
+ if (tagName) {
51
+ result["data-tag-name"] = tagName;
52
+ }
53
+ return result;
54
+ };
55
+ const resolveCanvasTag = (node) => {
56
+ return readString(node.props.tagName)?.toLowerCase()
57
+ ?? readString(isRecord(node.metadata.codeSync) ? node.metadata.codeSync.tagName : null)?.toLowerCase()
58
+ ?? node.kind;
59
+ };
60
+ export function stripAnnotationPayloadScreenshots(payload) {
61
+ const { screenshots, annotations, ...rest } = payload;
62
+ void screenshots;
63
+ return {
64
+ ...rest,
65
+ screenshotMode: "none",
66
+ annotations: annotations.map((annotation) => {
67
+ const { screenshotId, ...next } = annotation;
68
+ void screenshotId;
69
+ return next;
70
+ })
71
+ };
72
+ }
73
+ export function filterAnnotationPayload(payload, annotationIds, options = {}) {
74
+ const includeScreenshots = options.includeScreenshots ?? true;
75
+ const wanted = new Set(annotationIds);
76
+ const annotations = payload.annotations.filter((annotation) => wanted.has(annotation.id));
77
+ if (annotations.length === payload.annotations.length && includeScreenshots) {
78
+ return payload;
79
+ }
80
+ const screenshotIds = new Set(annotations
81
+ .map((annotation) => annotation.screenshotId)
82
+ .filter((value) => typeof value === "string" && value.length > 0));
83
+ const filtered = {
84
+ ...payload,
85
+ screenshotMode: includeScreenshots ? payload.screenshotMode : "none",
86
+ annotations: annotations.map((annotation) => {
87
+ if (includeScreenshots) {
88
+ return annotation;
89
+ }
90
+ const { screenshotId, ...next } = annotation;
91
+ void screenshotId;
92
+ return next;
93
+ })
94
+ };
95
+ if (includeScreenshots) {
96
+ filtered.screenshots = payload.screenshots?.filter((screenshot) => screenshotIds.has(screenshot.id));
97
+ return filtered;
98
+ }
99
+ delete filtered.screenshots;
100
+ return filtered;
101
+ }
102
+ export function describeAnnotationItem(item) {
103
+ const selector = item.selector?.trim().length ? item.selector : item.tag;
104
+ const label = item.note?.trim().length ? item.note.trim() : item.text?.trim();
105
+ return label ? `${selector} — ${label}` : selector;
106
+ }
107
+ export function formatDispatchSourceLabel(source) {
108
+ switch (source) {
109
+ case "annotate_item":
110
+ return "annotation item";
111
+ case "annotate_all":
112
+ return "annotation payload";
113
+ case "popup_item":
114
+ return "popup annotation item";
115
+ case "popup_all":
116
+ return "popup annotation payload";
117
+ case "canvas_item":
118
+ return "canvas annotation item";
119
+ case "canvas_all":
120
+ return "canvas annotation payload";
121
+ default:
122
+ return "annotation payload";
123
+ }
124
+ }
125
+ export function buildCanvasAnnotationPayload(options) {
126
+ const nodesById = new Map(options.page.nodes.map((node) => [node.id, node]));
127
+ const annotations = options.drafts.flatMap((draft) => {
128
+ const node = nodesById.get(draft.nodeId);
129
+ if (!node) {
130
+ return [];
131
+ }
132
+ const tag = resolveCanvasTag(node);
133
+ return [{
134
+ id: node.id,
135
+ selector: `[data-node-id="${node.id}"]`,
136
+ tag,
137
+ idAttr: node.id,
138
+ classes: [`canvas-node`, `canvas-${node.kind}`],
139
+ text: readCanvasNodeText(node),
140
+ rect: {
141
+ x: node.rect.x,
142
+ y: node.rect.y,
143
+ width: node.rect.width,
144
+ height: node.rect.height
145
+ },
146
+ attributes: buildCanvasAttributes(node),
147
+ a11y: {
148
+ role: readString(isRecord(node.metadata.accessibility) ? node.metadata.accessibility.role : null) ?? undefined,
149
+ label: readString(isRecord(node.metadata.accessibility) ? node.metadata.accessibility.label : null) ?? undefined
150
+ },
151
+ styles: buildCanvasStyles(node),
152
+ note: readString(draft.note) ?? undefined
153
+ }];
154
+ });
155
+ return {
156
+ url: formatCanvasUrl(options.document.documentId, options.page),
157
+ title: `${options.document.title} • ${options.page.name}`,
158
+ timestamp: new Date().toISOString(),
159
+ context: options.context,
160
+ screenshotMode: "none",
161
+ annotations
162
+ };
163
+ }
@@ -3,10 +3,17 @@ import { NativePortManager } from "./services/NativePortManager.js";
3
3
  import { DEFAULT_AUTO_CONNECT, DEFAULT_AUTO_PAIR, DEFAULT_DISCOVERY_PORT, DEFAULT_NATIVE_ENABLED, DEFAULT_PAIRING_ENABLED, DEFAULT_RELAY_PORT } from "./relay-settings.js";
4
4
  import { logError } from "./logging.js";
5
5
  import { OpsRuntime } from "./ops/ops-runtime.js";
6
+ import { CanvasRuntime } from "./canvas/canvas-runtime.js";
7
+ import { formatDispatchSourceLabel, stripAnnotationPayloadScreenshots } from "./annotation-payload.js";
6
8
  const connection = new ConnectionManager();
9
+ const canvasRuntime = new CanvasRuntime({
10
+ send: (message) => connection.sendCanvasMessage(message)
11
+ });
7
12
  const opsRuntime = new OpsRuntime({
8
13
  send: (message) => connection.sendOpsMessage(message),
9
- cdp: connection.getCdpRouter()
14
+ cdp: connection.getCdpRouter(),
15
+ getCanvasPageState: (targetId) => canvasRuntime.getPageStateByTargetId(targetId),
16
+ performCanvasPageAction: (targetId, action, selector) => canvasRuntime.performPageAction(targetId, action, selector)
10
17
  });
11
18
  const nativePort = new NativePortManager({
12
19
  onMessage: (payload) => {
@@ -31,8 +38,13 @@ const ANNOTATION_MAX_PAYLOAD_BYTES = 10 * 1024 * 1024;
31
38
  const ANNOTATION_REQUEST_TIMEOUT_MS = 120_000;
32
39
  const LAST_ANNOTATION_META_KEY = "annotationLastMeta";
33
40
  const LAST_ANNOTATION_PAYLOAD_KEY = "annotationLastPayloadSansScreenshots";
41
+ const LAST_AGENT_ANNOTATION_META_KEY = "annotationAgentMeta";
42
+ const LAST_AGENT_ANNOTATION_PAYLOAD_KEY = "annotationAgentPayloadSansScreenshots";
43
+ const BADGE_CONNECTED_DOT_COLOR = "#16a34a";
44
+ const BADGE_DISCONNECTED_DOT_COLOR = "#dc2626";
34
45
  const annotationSessions = new Map();
35
46
  let lastAnnotationFull = null;
47
+ let lastAgentAnnotationFull = null;
36
48
  connection.onAnnotationCommand((command) => {
37
49
  handleRelayAnnotationCommand(command).catch((error) => {
38
50
  logError("annotation.relay_command", error, { code: "annotation_command_failed" });
@@ -41,6 +53,9 @@ connection.onAnnotationCommand((command) => {
41
53
  connection.onOpsMessage((message) => {
42
54
  opsRuntime.handleMessage(message);
43
55
  });
56
+ connection.onCanvasMessage((message) => {
57
+ canvasRuntime.handleMessage(message);
58
+ });
44
59
  const RESTRICTED_PROTOCOLS = new Set([
45
60
  "chrome:",
46
61
  "chrome-extension:",
@@ -53,10 +68,14 @@ const RESTRICTED_PROTOCOLS = new Set([
53
68
  ]);
54
69
  const updateBadge = (status) => {
55
70
  const isConnected = status === "connected";
56
- chrome.action.setBadgeText({ text: isConnected ? "ON" : "OFF" });
57
- chrome.action.setBadgeBackgroundColor({
58
- color: isConnected ? "#20d5c6" : "#5b667a"
59
- });
71
+ const dotColor = isConnected ? BADGE_CONNECTED_DOT_COLOR : BADGE_DISCONNECTED_DOT_COLOR;
72
+ chrome.action.setBadgeText({ text: "●" });
73
+ if (typeof chrome.action.setBadgeTextColor === "function") {
74
+ chrome.action.setBadgeTextColor({ color: dotColor });
75
+ chrome.action.setBadgeBackgroundColor({ color: [0, 0, 0, 0] });
76
+ return;
77
+ }
78
+ chrome.action.setBadgeBackgroundColor({ color: dotColor });
60
79
  };
61
80
  const getEffectiveStatus = () => {
62
81
  if (connection.getStatus() === "connected") {
@@ -150,6 +169,8 @@ const buildRelayHealthNote = (health) => {
150
169
  return "Annotation channel disconnected. Keep the extension open and retry.";
151
170
  case "ops_disconnected":
152
171
  return "Ops channel disconnected. Start a new session and retry.";
172
+ case "canvas_disconnected":
173
+ return "Canvas channel disconnected. Reopen the design canvas command and retry.";
153
174
  case "cdp_disconnected":
154
175
  return "No CDP clients connected. Start a session and retry.";
155
176
  case "relay_down":
@@ -297,6 +318,7 @@ const fetchRelayHealth = async (port) => {
297
318
  const cdpConnected = data.cdpConnected === true;
298
319
  const annotationConnected = data.annotationConnected === true;
299
320
  const opsConnected = data.opsConnected === true;
321
+ const canvasConnected = data.canvasConnected === true;
300
322
  const pairingRequired = data.pairingRequired === true;
301
323
  const ok = extensionConnected && handshake;
302
324
  return {
@@ -307,6 +329,7 @@ const fetchRelayHealth = async (port) => {
307
329
  cdpConnected,
308
330
  annotationConnected,
309
331
  opsConnected,
332
+ canvasConnected,
310
333
  pairingRequired
311
334
  };
312
335
  }
@@ -669,19 +692,7 @@ const validatePayloadSize = (payload) => {
669
692
  const generateAnnotationRequestId = () => {
670
693
  return crypto.randomUUID();
671
694
  };
672
- const stripScreenshots = (payload) => {
673
- const { screenshots, annotations, ...rest } = payload;
674
- void screenshots;
675
- return {
676
- ...rest,
677
- annotations: annotations.map((item) => {
678
- const { screenshotId, ...restItem } = item;
679
- void screenshotId;
680
- return restItem;
681
- })
682
- };
683
- };
684
- const buildLastAnnotationMeta = (requestId, response, hasFullPayloadInMemory) => {
695
+ const buildLastAnnotationMeta = (requestId, response, hasFullPayloadInMemory, extras = {}) => {
685
696
  const payload = response.payload;
686
697
  const annotationCount = payload ? payload.annotations.length : undefined;
687
698
  const screenshotCount = payload?.screenshots?.length ?? 0;
@@ -689,6 +700,8 @@ const buildLastAnnotationMeta = (requestId, response, hasFullPayloadInMemory) =>
689
700
  requestId,
690
701
  status: response.status,
691
702
  error: response.error,
703
+ source: extras.source,
704
+ label: extras.label,
692
705
  url: payload?.url,
693
706
  title: payload?.title,
694
707
  timestamp: payload?.timestamp,
@@ -706,6 +719,12 @@ const persistLastAnnotation = async (meta, payload) => {
706
719
  [LAST_ANNOTATION_PAYLOAD_KEY]: payload
707
720
  });
708
721
  };
722
+ const persistAgentAnnotation = async (meta, payload) => {
723
+ await setStorage({
724
+ [LAST_AGENT_ANNOTATION_META_KEY]: meta,
725
+ [LAST_AGENT_ANNOTATION_PAYLOAD_KEY]: payload
726
+ });
727
+ };
709
728
  const loadPersistedLastAnnotation = async () => {
710
729
  const data = await new Promise((resolve) => {
711
730
  chrome.storage.local.get([LAST_ANNOTATION_META_KEY, LAST_ANNOTATION_PAYLOAD_KEY], (items) => resolve(items));
@@ -716,6 +735,77 @@ const loadPersistedLastAnnotation = async () => {
716
735
  const payload = payloadRecord && typeof payloadRecord === "object" ? payloadRecord : null;
717
736
  return { meta, payload };
718
737
  };
738
+ const loadPersistedAgentAnnotation = async () => {
739
+ const data = await new Promise((resolve) => {
740
+ chrome.storage.local.get([LAST_AGENT_ANNOTATION_META_KEY, LAST_AGENT_ANNOTATION_PAYLOAD_KEY], (items) => resolve(items));
741
+ });
742
+ const metaRecord = data[LAST_AGENT_ANNOTATION_META_KEY];
743
+ const payloadRecord = data[LAST_AGENT_ANNOTATION_PAYLOAD_KEY];
744
+ const meta = metaRecord && typeof metaRecord === "object" ? metaRecord : null;
745
+ const payload = payloadRecord && typeof payloadRecord === "object" ? payloadRecord : null;
746
+ return { meta, payload };
747
+ };
748
+ const isAnnotationPayload = (value) => {
749
+ if (!value || typeof value !== "object") {
750
+ return false;
751
+ }
752
+ const payload = value;
753
+ return typeof payload.url === "string"
754
+ && typeof payload.timestamp === "string"
755
+ && typeof payload.screenshotMode === "string"
756
+ && Array.isArray(payload.annotations);
757
+ };
758
+ const storeAgentAnnotationPayload = async (payload, source, label) => {
759
+ if (!validatePayloadSize(payload)) {
760
+ throw new Error("Annotation payload exceeded size limits.");
761
+ }
762
+ const response = {
763
+ version: 1,
764
+ requestId: crypto.randomUUID(),
765
+ status: "ok",
766
+ payload
767
+ };
768
+ const meta = buildLastAnnotationMeta(response.requestId, response, true, {
769
+ source,
770
+ label: label?.trim().length ? label.trim() : formatDispatchSourceLabel(source)
771
+ });
772
+ lastAgentAnnotationFull = { meta, payload };
773
+ await persistAgentAnnotation(meta, stripAnnotationPayloadScreenshots(payload));
774
+ return meta;
775
+ };
776
+ const loadAgentAnnotationPayload = async (includeScreenshots) => {
777
+ if (includeScreenshots && lastAgentAnnotationFull) {
778
+ return {
779
+ version: 1,
780
+ requestId: crypto.randomUUID(),
781
+ status: "ok",
782
+ payload: lastAgentAnnotationFull.payload
783
+ };
784
+ }
785
+ if (lastAgentAnnotationFull) {
786
+ return {
787
+ version: 1,
788
+ requestId: crypto.randomUUID(),
789
+ status: "ok",
790
+ payload: stripAnnotationPayloadScreenshots(lastAgentAnnotationFull.payload)
791
+ };
792
+ }
793
+ const stored = await loadPersistedAgentAnnotation();
794
+ if (stored.payload) {
795
+ return {
796
+ version: 1,
797
+ requestId: crypto.randomUUID(),
798
+ status: "ok",
799
+ payload: stored.payload
800
+ };
801
+ }
802
+ return {
803
+ version: 1,
804
+ requestId: crypto.randomUUID(),
805
+ status: "error",
806
+ error: { code: "payload_unavailable", message: "No agent-dispatched annotation payload available." }
807
+ };
808
+ };
719
809
  async function handleNativePortMessage(payload) {
720
810
  if (!payload || typeof payload !== "object") {
721
811
  return;
@@ -740,6 +830,14 @@ const handleRelayAnnotationCommand = async (command, transport = "relay") => {
740
830
  await cancelAnnotationSession(payload.requestId, transport);
741
831
  return;
742
832
  }
833
+ if (payload.command === "fetch_stored") {
834
+ const stored = await loadAgentAnnotationPayload(payload.options?.includeScreenshots === true);
835
+ sendAnnotationResponse({
836
+ ...stored,
837
+ requestId: payload.requestId
838
+ }, transport);
839
+ return;
840
+ }
743
841
  try {
744
842
  await startAnnotationSession(payload, transport);
745
843
  sendAnnotationEvent({
@@ -799,7 +897,7 @@ const handleAnnotationComplete = (requestId, payload) => {
799
897
  const meta = buildLastAnnotationMeta(requestId, response, true);
800
898
  lastAnnotationFull = { meta, payload };
801
899
  const storageMeta = { ...meta, hasFullPayloadInMemory: false };
802
- const sanitizedPayload = stripScreenshots(payload);
900
+ const sanitizedPayload = stripAnnotationPayloadScreenshots(payload);
803
901
  persistLastAnnotation(storageMeta, sanitizedPayload).catch((error) => {
804
902
  logError("annotation.persist_sanitized_payload", error, { code: "annotation_persist_failed" });
805
903
  });
@@ -1231,9 +1329,9 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
1231
1329
  if (message.includeScreenshots) {
1232
1330
  const response = {
1233
1331
  type: "annotation:payloadResult",
1234
- payload: null,
1332
+ payload: stored.payload,
1235
1333
  meta: storedMeta,
1236
- source: "none",
1334
+ source: stored.payload ? "storage" : "none",
1237
1335
  warning: "Full payload not available; screenshots may have been dropped."
1238
1336
  };
1239
1337
  sendResponse(response);
@@ -1242,7 +1340,7 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
1242
1340
  if (lastAnnotationFull) {
1243
1341
  const response = {
1244
1342
  type: "annotation:payloadResult",
1245
- payload: stripScreenshots(lastAnnotationFull.payload),
1343
+ payload: stripAnnotationPayloadScreenshots(lastAnnotationFull.payload),
1246
1344
  meta: { ...lastAnnotationFull.meta, hasFullPayloadInMemory: true },
1247
1345
  source: "memory"
1248
1346
  };
@@ -1279,6 +1377,39 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
1279
1377
  });
1280
1378
  return true;
1281
1379
  }
1380
+ if (message.type === "annotation:sendPayload") {
1381
+ (async () => {
1382
+ if (!isAnnotationPayload(message.payload)) {
1383
+ const response = {
1384
+ type: "annotation:sendPayloadResult",
1385
+ ok: false,
1386
+ meta: null,
1387
+ error: { code: "invalid_request", message: "Invalid annotation payload." }
1388
+ };
1389
+ sendResponse(response);
1390
+ return;
1391
+ }
1392
+ const meta = await storeAgentAnnotationPayload(message.payload, message.source ?? "popup_all", message.label);
1393
+ const response = {
1394
+ type: "annotation:sendPayloadResult",
1395
+ ok: true,
1396
+ meta: { ...meta, hasFullPayloadInMemory: true }
1397
+ };
1398
+ sendResponse(response);
1399
+ })().catch((error) => {
1400
+ const response = {
1401
+ type: "annotation:sendPayloadResult",
1402
+ ok: false,
1403
+ meta: null,
1404
+ error: {
1405
+ code: "payload_too_large",
1406
+ message: error instanceof Error ? error.message : "Annotation dispatch failed."
1407
+ }
1408
+ };
1409
+ sendResponse(response);
1410
+ });
1411
+ return true;
1412
+ }
1282
1413
  if (message.type === "annotation:capture") {
1283
1414
  (async () => {
1284
1415
  const tab = sender.tab;
@@ -1313,3 +1444,8 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
1313
1444
  }
1314
1445
  return false;
1315
1446
  });
1447
+ chrome.runtime.onConnect.addListener((port) => {
1448
+ if (port.name === "canvas-page") {
1449
+ canvasRuntime.attachPort(port);
1450
+ }
1451
+ });