opendevbrowser 0.0.12 → 0.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (585) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +425 -42
  3. package/dist/annotate/direct-annotator.d.ts +22 -0
  4. package/dist/annotate/direct-annotator.d.ts.map +1 -0
  5. package/dist/annotate/output.d.ts +10 -0
  6. package/dist/annotate/output.d.ts.map +1 -0
  7. package/dist/browser/annotation-manager.d.ts +30 -0
  8. package/dist/browser/annotation-manager.d.ts.map +1 -0
  9. package/dist/browser/browser-manager.d.ts +397 -0
  10. package/dist/browser/browser-manager.d.ts.map +1 -0
  11. package/dist/browser/fingerprint/adapters.d.ts +26 -0
  12. package/dist/browser/fingerprint/adapters.d.ts.map +1 -0
  13. package/dist/browser/fingerprint/canary.d.ts +25 -0
  14. package/dist/browser/fingerprint/canary.d.ts.map +1 -0
  15. package/dist/browser/fingerprint/profiles.d.ts +16 -0
  16. package/dist/browser/fingerprint/profiles.d.ts.map +1 -0
  17. package/dist/browser/fingerprint/tier1-coherence.d.ts +36 -0
  18. package/dist/browser/fingerprint/tier1-coherence.d.ts.map +1 -0
  19. package/dist/browser/fingerprint/tier2-runtime.d.ts +40 -0
  20. package/dist/browser/fingerprint/tier2-runtime.d.ts.map +1 -0
  21. package/dist/browser/fingerprint/tier3-adaptive.d.ts +30 -0
  22. package/dist/browser/fingerprint/tier3-adaptive.d.ts.map +1 -0
  23. package/dist/browser/manager-types.d.ts +3 -0
  24. package/dist/browser/manager-types.d.ts.map +1 -0
  25. package/dist/browser/ops-browser-manager.d.ts +131 -0
  26. package/dist/browser/ops-browser-manager.d.ts.map +1 -0
  27. package/dist/browser/ops-client.d.ts +56 -0
  28. package/dist/browser/ops-client.d.ts.map +1 -0
  29. package/dist/browser/parallelism-governor.d.ts +31 -0
  30. package/dist/browser/parallelism-governor.d.ts.map +1 -0
  31. package/dist/browser/script-runner.d.ts +23 -0
  32. package/dist/browser/script-runner.d.ts.map +1 -0
  33. package/dist/browser/session-store.d.ts +63 -0
  34. package/dist/browser/session-store.d.ts.map +1 -0
  35. package/dist/browser/target-manager.d.ts +36 -0
  36. package/dist/browser/target-manager.d.ts.map +1 -0
  37. package/dist/cache/chrome-locator.d.ts +2 -0
  38. package/dist/cache/chrome-locator.d.ts.map +1 -0
  39. package/dist/cache/downloader.d.ts +6 -0
  40. package/dist/cache/downloader.d.ts.map +1 -0
  41. package/dist/cache/paths.d.ts +9 -0
  42. package/dist/cache/paths.d.ts.map +1 -0
  43. package/dist/chunk-7W3SPXIB.js +166 -0
  44. package/dist/chunk-7W3SPXIB.js.map +1 -0
  45. package/dist/chunk-ST7CO5FA.js +18668 -0
  46. package/dist/chunk-ST7CO5FA.js.map +1 -0
  47. package/dist/cli/args.d.ts +25 -0
  48. package/dist/cli/args.d.ts.map +1 -0
  49. package/dist/cli/client.d.ts +2 -0
  50. package/dist/cli/client.d.ts.map +1 -0
  51. package/dist/cli/commands/annotate.d.ts +27 -0
  52. package/dist/cli/commands/annotate.d.ts.map +1 -0
  53. package/dist/cli/commands/artifacts.d.ts +24 -0
  54. package/dist/cli/commands/artifacts.d.ts.map +1 -0
  55. package/dist/cli/commands/daemon.d.ts +35 -0
  56. package/dist/cli/commands/daemon.d.ts.map +1 -0
  57. package/dist/cli/commands/devtools/console-poll.d.ts +7 -0
  58. package/dist/cli/commands/devtools/console-poll.d.ts.map +1 -0
  59. package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts +20 -0
  60. package/dist/cli/commands/devtools/debug-trace-snapshot.d.ts.map +1 -0
  61. package/dist/cli/commands/devtools/network-poll.d.ts +7 -0
  62. package/dist/cli/commands/devtools/network-poll.d.ts.map +1 -0
  63. package/dist/cli/commands/devtools/perf.d.ts +7 -0
  64. package/dist/cli/commands/devtools/perf.d.ts.map +1 -0
  65. package/dist/cli/commands/devtools/screenshot.d.ts +17 -0
  66. package/dist/cli/commands/devtools/screenshot.d.ts.map +1 -0
  67. package/dist/cli/commands/dom/attr.d.ts +7 -0
  68. package/dist/cli/commands/dom/attr.d.ts.map +1 -0
  69. package/dist/cli/commands/dom/checked.d.ts +7 -0
  70. package/dist/cli/commands/dom/checked.d.ts.map +1 -0
  71. package/dist/cli/commands/dom/enabled.d.ts +7 -0
  72. package/dist/cli/commands/dom/enabled.d.ts.map +1 -0
  73. package/dist/cli/commands/dom/html.d.ts +7 -0
  74. package/dist/cli/commands/dom/html.d.ts.map +1 -0
  75. package/dist/cli/commands/dom/text.d.ts +7 -0
  76. package/dist/cli/commands/dom/text.d.ts.map +1 -0
  77. package/dist/cli/commands/dom/value.d.ts +7 -0
  78. package/dist/cli/commands/dom/value.d.ts.map +1 -0
  79. package/dist/cli/commands/dom/visible.d.ts +7 -0
  80. package/dist/cli/commands/dom/visible.d.ts.map +1 -0
  81. package/dist/cli/commands/export/clone-component.d.ts +7 -0
  82. package/dist/cli/commands/export/clone-component.d.ts.map +1 -0
  83. package/dist/cli/commands/export/clone-page.d.ts +7 -0
  84. package/dist/cli/commands/export/clone-page.d.ts.map +1 -0
  85. package/dist/cli/commands/interact/check.d.ts +7 -0
  86. package/dist/cli/commands/interact/check.d.ts.map +1 -0
  87. package/dist/cli/commands/interact/click.d.ts +7 -0
  88. package/dist/cli/commands/interact/click.d.ts.map +1 -0
  89. package/dist/cli/commands/interact/hover.d.ts +7 -0
  90. package/dist/cli/commands/interact/hover.d.ts.map +1 -0
  91. package/dist/cli/commands/interact/press.d.ts +7 -0
  92. package/dist/cli/commands/interact/press.d.ts.map +1 -0
  93. package/dist/cli/commands/interact/scroll-into-view.d.ts +7 -0
  94. package/dist/cli/commands/interact/scroll-into-view.d.ts.map +1 -0
  95. package/dist/cli/commands/interact/scroll.d.ts +7 -0
  96. package/dist/cli/commands/interact/scroll.d.ts.map +1 -0
  97. package/dist/cli/commands/interact/select.d.ts +7 -0
  98. package/dist/cli/commands/interact/select.d.ts.map +1 -0
  99. package/dist/cli/commands/interact/type.d.ts +7 -0
  100. package/dist/cli/commands/interact/type.d.ts.map +1 -0
  101. package/dist/cli/commands/interact/uncheck.d.ts +7 -0
  102. package/dist/cli/commands/interact/uncheck.d.ts.map +1 -0
  103. package/dist/cli/commands/macro-resolve.d.ts +18 -0
  104. package/dist/cli/commands/macro-resolve.d.ts.map +1 -0
  105. package/dist/cli/commands/native.d.ts +82 -0
  106. package/dist/cli/commands/native.d.ts.map +1 -0
  107. package/dist/cli/commands/nav/goto.d.ts +7 -0
  108. package/dist/cli/commands/nav/goto.d.ts.map +1 -0
  109. package/dist/cli/commands/nav/snapshot.d.ts +7 -0
  110. package/dist/cli/commands/nav/snapshot.d.ts.map +1 -0
  111. package/dist/cli/commands/nav/wait.d.ts +7 -0
  112. package/dist/cli/commands/nav/wait.d.ts.map +1 -0
  113. package/dist/cli/commands/pages/close.d.ts +6 -0
  114. package/dist/cli/commands/pages/close.d.ts.map +1 -0
  115. package/dist/cli/commands/pages/list.d.ts +7 -0
  116. package/dist/cli/commands/pages/list.d.ts.map +1 -0
  117. package/dist/cli/commands/pages/open.d.ts +7 -0
  118. package/dist/cli/commands/pages/open.d.ts.map +1 -0
  119. package/dist/cli/commands/product-video.d.ts +25 -0
  120. package/dist/cli/commands/product-video.d.ts.map +1 -0
  121. package/dist/cli/commands/registry.d.ts +5 -0
  122. package/dist/cli/commands/registry.d.ts.map +1 -0
  123. package/dist/cli/commands/research.d.ts +27 -0
  124. package/dist/cli/commands/research.d.ts.map +1 -0
  125. package/dist/cli/commands/rpc.d.ts +28 -0
  126. package/dist/cli/commands/rpc.d.ts.map +1 -0
  127. package/dist/cli/commands/run.d.ts +17 -0
  128. package/dist/cli/commands/run.d.ts.map +1 -0
  129. package/dist/cli/commands/serve.d.ts +59 -0
  130. package/dist/cli/commands/serve.d.ts.map +1 -0
  131. package/dist/cli/commands/session/connect.d.ts +9 -0
  132. package/dist/cli/commands/session/connect.d.ts.map +1 -0
  133. package/dist/cli/commands/session/cookie-import.d.ts +31 -0
  134. package/dist/cli/commands/session/cookie-import.d.ts.map +1 -0
  135. package/dist/cli/commands/session/cookie-list.d.ts +17 -0
  136. package/dist/cli/commands/session/cookie-list.d.ts.map +1 -0
  137. package/dist/cli/commands/session/disconnect.d.ts +6 -0
  138. package/dist/cli/commands/session/disconnect.d.ts.map +1 -0
  139. package/dist/cli/commands/session/launch.d.ts +29 -0
  140. package/dist/cli/commands/session/launch.d.ts.map +1 -0
  141. package/dist/cli/commands/session/status.d.ts +7 -0
  142. package/dist/cli/commands/session/status.d.ts.map +1 -0
  143. package/dist/cli/commands/shopping.d.ts +25 -0
  144. package/dist/cli/commands/shopping.d.ts.map +1 -0
  145. package/dist/cli/commands/status.d.ts +19 -0
  146. package/dist/cli/commands/status.d.ts.map +1 -0
  147. package/dist/cli/commands/targets/close.d.ts +6 -0
  148. package/dist/cli/commands/targets/close.d.ts.map +1 -0
  149. package/dist/cli/commands/targets/list.d.ts +7 -0
  150. package/dist/cli/commands/targets/list.d.ts.map +1 -0
  151. package/dist/cli/commands/targets/new.d.ts +7 -0
  152. package/dist/cli/commands/targets/new.d.ts.map +1 -0
  153. package/dist/cli/commands/targets/use.d.ts +7 -0
  154. package/dist/cli/commands/targets/use.d.ts.map +1 -0
  155. package/dist/cli/commands/types.d.ts +13 -0
  156. package/dist/cli/commands/types.d.ts.map +1 -0
  157. package/dist/cli/commands/uninstall.d.ts +14 -0
  158. package/dist/cli/commands/uninstall.d.ts.map +1 -0
  159. package/dist/cli/commands/update.d.ts +7 -0
  160. package/dist/cli/commands/update.d.ts.map +1 -0
  161. package/dist/cli/daemon-autostart.d.ts +46 -0
  162. package/dist/cli/daemon-autostart.d.ts.map +1 -0
  163. package/dist/cli/daemon-client.d.ts +33 -0
  164. package/dist/cli/daemon-client.d.ts.map +1 -0
  165. package/dist/cli/daemon-commands.d.ts +7 -0
  166. package/dist/cli/daemon-commands.d.ts.map +1 -0
  167. package/dist/cli/daemon-state.d.ts +56 -0
  168. package/dist/cli/daemon-state.d.ts.map +1 -0
  169. package/dist/cli/daemon-status.d.ts +19 -0
  170. package/dist/cli/daemon-status.d.ts.map +1 -0
  171. package/dist/cli/daemon.d.ts +29 -0
  172. package/dist/cli/daemon.d.ts.map +1 -0
  173. package/dist/cli/errors.d.ts +20 -0
  174. package/dist/cli/errors.d.ts.map +1 -0
  175. package/dist/cli/help.d.ts +28 -0
  176. package/dist/cli/help.d.ts.map +1 -0
  177. package/dist/cli/index.d.ts +2 -0
  178. package/dist/cli/index.d.ts.map +1 -0
  179. package/dist/cli/index.js +4604 -769
  180. package/dist/cli/index.js.map +1 -1
  181. package/dist/cli/installers/global.d.ts +9 -0
  182. package/dist/cli/installers/global.d.ts.map +1 -0
  183. package/dist/cli/installers/local.d.ts +9 -0
  184. package/dist/cli/installers/local.d.ts.map +1 -0
  185. package/dist/cli/installers/skills.d.ts +19 -0
  186. package/dist/cli/installers/skills.d.ts.map +1 -0
  187. package/dist/cli/output.d.ts +7 -0
  188. package/dist/cli/output.d.ts.map +1 -0
  189. package/dist/cli/remote-manager.d.ts +96 -0
  190. package/dist/cli/remote-manager.d.ts.map +1 -0
  191. package/dist/cli/remote-relay.d.ts +17 -0
  192. package/dist/cli/remote-relay.d.ts.map +1 -0
  193. package/dist/cli/templates/config.d.ts +7 -0
  194. package/dist/cli/templates/config.d.ts.map +1 -0
  195. package/dist/cli/utils/config.d.ts +20 -0
  196. package/dist/cli/utils/config.d.ts.map +1 -0
  197. package/dist/cli/utils/http.d.ts +5 -0
  198. package/dist/cli/utils/http.d.ts.map +1 -0
  199. package/dist/cli/utils/parse.d.ts +8 -0
  200. package/dist/cli/utils/parse.d.ts.map +1 -0
  201. package/dist/cli/utils/skills.d.ts +12 -0
  202. package/dist/cli/utils/skills.d.ts.map +1 -0
  203. package/dist/config.d.ts +208 -0
  204. package/dist/config.d.ts.map +1 -0
  205. package/dist/core/bootstrap.d.ts +3 -0
  206. package/dist/core/bootstrap.d.ts.map +1 -0
  207. package/dist/core/index.d.ts +3 -0
  208. package/dist/core/index.d.ts.map +1 -0
  209. package/dist/core/logging.d.ts +34 -0
  210. package/dist/core/logging.d.ts.map +1 -0
  211. package/dist/core/types.d.ts +34 -0
  212. package/dist/core/types.d.ts.map +1 -0
  213. package/dist/devtools/console-tracker.d.ts +44 -0
  214. package/dist/devtools/console-tracker.d.ts.map +1 -0
  215. package/dist/devtools/exception-tracker.d.ts +42 -0
  216. package/dist/devtools/exception-tracker.d.ts.map +1 -0
  217. package/dist/devtools/network-tracker.d.ts +34 -0
  218. package/dist/devtools/network-tracker.d.ts.map +1 -0
  219. package/dist/export/css-extract.d.ts +5 -0
  220. package/dist/export/css-extract.d.ts.map +1 -0
  221. package/dist/export/dom-capture.d.ts +15 -0
  222. package/dist/export/dom-capture.d.ts.map +1 -0
  223. package/dist/export/react-emitter.d.ts +11 -0
  224. package/dist/export/react-emitter.d.ts.map +1 -0
  225. package/dist/extension-extractor.d.ts +3 -0
  226. package/dist/extension-extractor.d.ts.map +1 -0
  227. package/dist/index.d.ts +3 -4
  228. package/dist/index.d.ts.map +1 -0
  229. package/dist/index.js +1905 -262
  230. package/dist/index.js.map +1 -1
  231. package/dist/macros/execute.d.ts +44 -0
  232. package/dist/macros/execute.d.ts.map +1 -0
  233. package/dist/macros/index.d.ts +9 -0
  234. package/dist/macros/index.d.ts.map +1 -0
  235. package/dist/macros/packs/core.d.ts +3 -0
  236. package/dist/macros/packs/core.d.ts.map +1 -0
  237. package/dist/macros/registry.d.ts +48 -0
  238. package/dist/macros/registry.d.ts.map +1 -0
  239. package/dist/macros-NUBRM44Y.js +399 -0
  240. package/dist/macros-NUBRM44Y.js.map +1 -0
  241. package/dist/opendevbrowser.d.ts +3 -4
  242. package/dist/opendevbrowser.d.ts.map +1 -0
  243. package/dist/opendevbrowser.js +1905 -262
  244. package/dist/opendevbrowser.js.map +1 -1
  245. package/dist/providers/adaptive-concurrency.d.ts +42 -0
  246. package/dist/providers/adaptive-concurrency.d.ts.map +1 -0
  247. package/dist/providers/artifacts.d.ts +34 -0
  248. package/dist/providers/artifacts.d.ts.map +1 -0
  249. package/dist/providers/blocker.d.ts +47 -0
  250. package/dist/providers/blocker.d.ts.map +1 -0
  251. package/dist/providers/community/index.d.ts +44 -0
  252. package/dist/providers/community/index.d.ts.map +1 -0
  253. package/dist/providers/enrichment.d.ts +33 -0
  254. package/dist/providers/enrichment.d.ts.map +1 -0
  255. package/dist/providers/errors.d.ts +41 -0
  256. package/dist/providers/errors.d.ts.map +1 -0
  257. package/dist/providers/index.d.ts +121 -0
  258. package/dist/providers/index.d.ts.map +1 -0
  259. package/dist/providers/normalize.d.ts +39 -0
  260. package/dist/providers/normalize.d.ts.map +1 -0
  261. package/dist/providers/policy.d.ts +5 -0
  262. package/dist/providers/policy.d.ts.map +1 -0
  263. package/dist/providers/registry.d.ts +22 -0
  264. package/dist/providers/registry.d.ts.map +1 -0
  265. package/dist/providers/renderer.d.ts +49 -0
  266. package/dist/providers/renderer.d.ts.map +1 -0
  267. package/dist/providers/runtime-factory.d.ts +20 -0
  268. package/dist/providers/runtime-factory.d.ts.map +1 -0
  269. package/dist/providers/safety/prompt-guard.d.ts +34 -0
  270. package/dist/providers/safety/prompt-guard.d.ts.map +1 -0
  271. package/dist/providers/shared/anti-bot-policy.d.ts +51 -0
  272. package/dist/providers/shared/anti-bot-policy.d.ts.map +1 -0
  273. package/dist/providers/shared/post-policy.d.ts +31 -0
  274. package/dist/providers/shared/post-policy.d.ts.map +1 -0
  275. package/dist/providers/shared/request-headers.d.ts +5 -0
  276. package/dist/providers/shared/request-headers.d.ts.map +1 -0
  277. package/dist/providers/shared/traversal-url.d.ts +2 -0
  278. package/dist/providers/shared/traversal-url.d.ts.map +1 -0
  279. package/dist/providers/shopping/index.d.ts +63 -0
  280. package/dist/providers/shopping/index.d.ts.map +1 -0
  281. package/dist/providers/social/bluesky.d.ts +3 -0
  282. package/dist/providers/social/bluesky.d.ts.map +1 -0
  283. package/dist/providers/social/facebook.d.ts +3 -0
  284. package/dist/providers/social/facebook.d.ts.map +1 -0
  285. package/dist/providers/social/index.d.ts +31 -0
  286. package/dist/providers/social/index.d.ts.map +1 -0
  287. package/dist/providers/social/instagram.d.ts +3 -0
  288. package/dist/providers/social/instagram.d.ts.map +1 -0
  289. package/dist/providers/social/linkedin.d.ts +3 -0
  290. package/dist/providers/social/linkedin.d.ts.map +1 -0
  291. package/dist/providers/social/platform.d.ts +40 -0
  292. package/dist/providers/social/platform.d.ts.map +1 -0
  293. package/dist/providers/social/reddit.d.ts +3 -0
  294. package/dist/providers/social/reddit.d.ts.map +1 -0
  295. package/dist/providers/social/threads.d.ts +3 -0
  296. package/dist/providers/social/threads.d.ts.map +1 -0
  297. package/dist/providers/social/tiktok.d.ts +3 -0
  298. package/dist/providers/social/tiktok.d.ts.map +1 -0
  299. package/dist/providers/social/x.d.ts +3 -0
  300. package/dist/providers/social/x.d.ts.map +1 -0
  301. package/dist/providers/social/youtube-resolver.d.ts +78 -0
  302. package/dist/providers/social/youtube-resolver.d.ts.map +1 -0
  303. package/dist/providers/social/youtube.d.ts +34 -0
  304. package/dist/providers/social/youtube.d.ts.map +1 -0
  305. package/dist/providers/tier-router.d.ts +30 -0
  306. package/dist/providers/tier-router.d.ts.map +1 -0
  307. package/dist/providers/timebox.d.ts +20 -0
  308. package/dist/providers/timebox.d.ts.map +1 -0
  309. package/dist/providers/types.d.ts +344 -0
  310. package/dist/providers/types.d.ts.map +1 -0
  311. package/dist/providers/web/crawl-worker.d.ts +36 -0
  312. package/dist/providers/web/crawl-worker.d.ts.map +1 -0
  313. package/dist/providers/web/crawler.d.ts +101 -0
  314. package/dist/providers/web/crawler.d.ts.map +1 -0
  315. package/dist/providers/web/extract.d.ts +11 -0
  316. package/dist/providers/web/extract.d.ts.map +1 -0
  317. package/dist/providers/web/index.d.ts +24 -0
  318. package/dist/providers/web/index.d.ts.map +1 -0
  319. package/dist/providers/web/policy.d.ts +14 -0
  320. package/dist/providers/web/policy.d.ts.map +1 -0
  321. package/dist/providers/workflows.d.ts +67 -0
  322. package/dist/providers/workflows.d.ts.map +1 -0
  323. package/dist/relay/protocol.d.ts +317 -0
  324. package/dist/relay/protocol.d.ts.map +1 -0
  325. package/dist/relay/relay-endpoints.d.ts +16 -0
  326. package/dist/relay/relay-endpoints.d.ts.map +1 -0
  327. package/dist/relay/relay-server.d.ts +111 -0
  328. package/dist/relay/relay-server.d.ts.map +1 -0
  329. package/dist/relay/relay-types.d.ts +9 -0
  330. package/dist/relay/relay-types.d.ts.map +1 -0
  331. package/dist/skills/continuity-nudge.d.ts +12 -0
  332. package/dist/skills/continuity-nudge.d.ts.map +1 -0
  333. package/dist/skills/skill-loader.d.ts +20 -0
  334. package/dist/skills/skill-loader.d.ts.map +1 -0
  335. package/dist/skills/skill-nudge.d.ts +18 -0
  336. package/dist/skills/skill-nudge.d.ts.map +1 -0
  337. package/dist/skills/types.d.ts +12 -0
  338. package/dist/skills/types.d.ts.map +1 -0
  339. package/dist/snapshot/ops-snapshot.d.ts +16 -0
  340. package/dist/snapshot/ops-snapshot.d.ts.map +1 -0
  341. package/dist/snapshot/refs.d.ts +23 -0
  342. package/dist/snapshot/refs.d.ts.map +1 -0
  343. package/dist/snapshot/snapshotter.d.ts +27 -0
  344. package/dist/snapshot/snapshotter.d.ts.map +1 -0
  345. package/dist/tools/annotate.d.ts +4 -0
  346. package/dist/tools/annotate.d.ts.map +1 -0
  347. package/dist/tools/check.d.ts +4 -0
  348. package/dist/tools/check.d.ts.map +1 -0
  349. package/dist/tools/click.d.ts +4 -0
  350. package/dist/tools/click.d.ts.map +1 -0
  351. package/dist/tools/clone_component.d.ts +4 -0
  352. package/dist/tools/clone_component.d.ts.map +1 -0
  353. package/dist/tools/clone_page.d.ts +4 -0
  354. package/dist/tools/clone_page.d.ts.map +1 -0
  355. package/dist/tools/close.d.ts +4 -0
  356. package/dist/tools/close.d.ts.map +1 -0
  357. package/dist/tools/connect.d.ts +4 -0
  358. package/dist/tools/connect.d.ts.map +1 -0
  359. package/dist/tools/console_poll.d.ts +4 -0
  360. package/dist/tools/console_poll.d.ts.map +1 -0
  361. package/dist/tools/cookie_import.d.ts +25 -0
  362. package/dist/tools/cookie_import.d.ts.map +1 -0
  363. package/dist/tools/cookie_list.d.ts +9 -0
  364. package/dist/tools/cookie_list.d.ts.map +1 -0
  365. package/dist/tools/debug_trace_snapshot.d.ts +4 -0
  366. package/dist/tools/debug_trace_snapshot.d.ts.map +1 -0
  367. package/dist/tools/deps.d.ts +26 -0
  368. package/dist/tools/deps.d.ts.map +1 -0
  369. package/dist/tools/disconnect.d.ts +4 -0
  370. package/dist/tools/disconnect.d.ts.map +1 -0
  371. package/dist/tools/dom_get_html.d.ts +4 -0
  372. package/dist/tools/dom_get_html.d.ts.map +1 -0
  373. package/dist/tools/dom_get_text.d.ts +4 -0
  374. package/dist/tools/dom_get_text.d.ts.map +1 -0
  375. package/dist/tools/get_attr.d.ts +4 -0
  376. package/dist/tools/get_attr.d.ts.map +1 -0
  377. package/dist/tools/get_value.d.ts +4 -0
  378. package/dist/tools/get_value.d.ts.map +1 -0
  379. package/dist/tools/goto.d.ts +4 -0
  380. package/dist/tools/goto.d.ts.map +1 -0
  381. package/dist/tools/hover.d.ts +4 -0
  382. package/dist/tools/hover.d.ts.map +1 -0
  383. package/dist/tools/index.d.ts +4 -0
  384. package/dist/tools/index.d.ts.map +1 -0
  385. package/dist/tools/is_checked.d.ts +4 -0
  386. package/dist/tools/is_checked.d.ts.map +1 -0
  387. package/dist/tools/is_enabled.d.ts +4 -0
  388. package/dist/tools/is_enabled.d.ts.map +1 -0
  389. package/dist/tools/is_visible.d.ts +4 -0
  390. package/dist/tools/is_visible.d.ts.map +1 -0
  391. package/dist/tools/launch.d.ts +4 -0
  392. package/dist/tools/launch.d.ts.map +1 -0
  393. package/dist/tools/list.d.ts +4 -0
  394. package/dist/tools/list.d.ts.map +1 -0
  395. package/dist/tools/macro_resolve.d.ts +25 -0
  396. package/dist/tools/macro_resolve.d.ts.map +1 -0
  397. package/dist/tools/network_poll.d.ts +4 -0
  398. package/dist/tools/network_poll.d.ts.map +1 -0
  399. package/dist/tools/page.d.ts +4 -0
  400. package/dist/tools/page.d.ts.map +1 -0
  401. package/dist/tools/perf.d.ts +4 -0
  402. package/dist/tools/perf.d.ts.map +1 -0
  403. package/dist/tools/press.d.ts +4 -0
  404. package/dist/tools/press.d.ts.map +1 -0
  405. package/dist/tools/product_video_run.d.ts +4 -0
  406. package/dist/tools/product_video_run.d.ts.map +1 -0
  407. package/dist/tools/prompting_guide.d.ts +4 -0
  408. package/dist/tools/prompting_guide.d.ts.map +1 -0
  409. package/dist/tools/research_run.d.ts +4 -0
  410. package/dist/tools/research_run.d.ts.map +1 -0
  411. package/dist/tools/response.d.ts +16 -0
  412. package/dist/tools/response.d.ts.map +1 -0
  413. package/dist/tools/run.d.ts +4 -0
  414. package/dist/tools/run.d.ts.map +1 -0
  415. package/dist/tools/screenshot.d.ts +4 -0
  416. package/dist/tools/screenshot.d.ts.map +1 -0
  417. package/dist/tools/scroll.d.ts +4 -0
  418. package/dist/tools/scroll.d.ts.map +1 -0
  419. package/dist/tools/scroll_into_view.d.ts +4 -0
  420. package/dist/tools/scroll_into_view.d.ts.map +1 -0
  421. package/dist/tools/select.d.ts +4 -0
  422. package/dist/tools/select.d.ts.map +1 -0
  423. package/dist/tools/shopping_run.d.ts +4 -0
  424. package/dist/tools/shopping_run.d.ts.map +1 -0
  425. package/dist/tools/skill_list.d.ts +4 -0
  426. package/dist/tools/skill_list.d.ts.map +1 -0
  427. package/dist/tools/skill_load.d.ts +4 -0
  428. package/dist/tools/skill_load.d.ts.map +1 -0
  429. package/dist/tools/snapshot.d.ts +4 -0
  430. package/dist/tools/snapshot.d.ts.map +1 -0
  431. package/dist/tools/status.d.ts +4 -0
  432. package/dist/tools/status.d.ts.map +1 -0
  433. package/dist/tools/target_close.d.ts +4 -0
  434. package/dist/tools/target_close.d.ts.map +1 -0
  435. package/dist/tools/target_new.d.ts +4 -0
  436. package/dist/tools/target_new.d.ts.map +1 -0
  437. package/dist/tools/target_use.d.ts +4 -0
  438. package/dist/tools/target_use.d.ts.map +1 -0
  439. package/dist/tools/targets_list.d.ts +4 -0
  440. package/dist/tools/targets_list.d.ts.map +1 -0
  441. package/dist/tools/type.d.ts +4 -0
  442. package/dist/tools/type.d.ts.map +1 -0
  443. package/dist/tools/uncheck.d.ts +4 -0
  444. package/dist/tools/uncheck.d.ts.map +1 -0
  445. package/dist/tools/wait.d.ts +4 -0
  446. package/dist/tools/wait.d.ts.map +1 -0
  447. package/dist/tools/workflow-runtime.d.ts +4 -0
  448. package/dist/tools/workflow-runtime.d.ts.map +1 -0
  449. package/dist/utils/crypto.d.ts +2 -0
  450. package/dist/utils/crypto.d.ts.map +1 -0
  451. package/dist/utils/endpoint-validation.d.ts +2 -0
  452. package/dist/utils/endpoint-validation.d.ts.map +1 -0
  453. package/dist/utils/fs.d.ts +5 -0
  454. package/dist/utils/fs.d.ts.map +1 -0
  455. package/dist/utils/hub-enabled.d.ts +3 -0
  456. package/dist/utils/hub-enabled.d.ts.map +1 -0
  457. package/extension/dist/annotate-content.css +237 -0
  458. package/extension/dist/annotate-content.js +934 -0
  459. package/extension/dist/background.js +1203 -35
  460. package/extension/dist/logging.js +50 -0
  461. package/extension/dist/ops/dom-bridge.js +355 -0
  462. package/extension/dist/ops/ops-runtime.js +1751 -0
  463. package/extension/dist/ops/ops-session-store.js +203 -0
  464. package/extension/dist/ops/parallelism-governor.js +117 -0
  465. package/extension/dist/ops/redaction.js +52 -0
  466. package/extension/dist/ops/snapshot-builder.js +4 -0
  467. package/extension/dist/ops/snapshot-shared.js +236 -0
  468. package/extension/dist/popup.js +370 -25
  469. package/extension/dist/relay-settings.js +1 -0
  470. package/extension/dist/services/CDPRouter.js +567 -104
  471. package/extension/dist/services/ConnectionManager.js +469 -60
  472. package/extension/dist/services/NativePortManager.js +182 -0
  473. package/extension/dist/services/RelayClient.js +227 -26
  474. package/extension/dist/services/TabManager.js +81 -0
  475. package/extension/dist/services/TargetSessionMap.js +146 -0
  476. package/extension/dist/services/cdp-router-commands.js +203 -0
  477. package/extension/dist/services/url-restrictions.js +41 -0
  478. package/extension/dist/types.js +3 -1
  479. package/extension/icons/icon128.png +0 -0
  480. package/extension/icons/icon16.png +0 -0
  481. package/extension/icons/icon32.png +0 -0
  482. package/extension/icons/icon48.png +0 -0
  483. package/extension/manifest.json +17 -3
  484. package/extension/popup.html +144 -0
  485. package/package.json +26 -17
  486. package/scripts/native/host.cjs +230 -0
  487. package/scripts/native/install.ps1 +73 -0
  488. package/scripts/native/install.sh +66 -0
  489. package/scripts/native/uninstall.ps1 +25 -0
  490. package/scripts/native/uninstall.sh +26 -0
  491. package/skills/AGENTS.md +47 -66
  492. package/skills/opendevbrowser-best-practices/SKILL.md +196 -49
  493. package/skills/opendevbrowser-best-practices/artifacts/browser-agent-known-issues-matrix.md +44 -0
  494. package/skills/opendevbrowser-best-practices/artifacts/command-channel-reference.md +95 -0
  495. package/skills/opendevbrowser-best-practices/artifacts/debug-trace-playbook.md +36 -0
  496. package/skills/opendevbrowser-best-practices/artifacts/fingerprint-tiers.md +36 -0
  497. package/skills/opendevbrowser-best-practices/artifacts/macro-workflows.md +43 -0
  498. package/skills/opendevbrowser-best-practices/artifacts/parity-gates.md +36 -0
  499. package/skills/opendevbrowser-best-practices/artifacts/provider-workflows.md +89 -0
  500. package/skills/opendevbrowser-best-practices/assets/templates/cdp-forward-envelope.json +11 -0
  501. package/skills/opendevbrowser-best-practices/assets/templates/mode-flag-matrix.json +56 -0
  502. package/skills/opendevbrowser-best-practices/assets/templates/ops-request-envelope.json +9 -0
  503. package/skills/opendevbrowser-best-practices/assets/templates/robustness-checklist.json +79 -0
  504. package/skills/opendevbrowser-best-practices/assets/templates/surface-audit-checklist.json +24 -0
  505. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +144 -0
  506. package/skills/opendevbrowser-best-practices/scripts/run-robustness-audit.sh +83 -0
  507. package/skills/opendevbrowser-best-practices/scripts/validate-skill-assets.sh +93 -0
  508. package/skills/opendevbrowser-continuity-ledger/SKILL.md +67 -23
  509. package/skills/opendevbrowser-data-extraction/SKILL.md +126 -0
  510. package/skills/opendevbrowser-data-extraction/artifacts/extraction-workflows.md +31 -0
  511. package/skills/opendevbrowser-data-extraction/assets/templates/compliance-checklist.md +7 -0
  512. package/skills/opendevbrowser-data-extraction/assets/templates/extraction-schema.json +17 -0
  513. package/skills/opendevbrowser-data-extraction/assets/templates/pagination-state.json +11 -0
  514. package/skills/opendevbrowser-data-extraction/assets/templates/quality-gates.json +10 -0
  515. package/skills/opendevbrowser-data-extraction/examples/sample-schema.json +19 -0
  516. package/skills/opendevbrowser-data-extraction/scripts/run-extraction-workflow.sh +83 -0
  517. package/skills/opendevbrowser-data-extraction/scripts/validate-skill-assets.sh +49 -0
  518. package/skills/opendevbrowser-form-testing/SKILL.md +143 -0
  519. package/skills/opendevbrowser-form-testing/artifacts/form-workflows.md +37 -0
  520. package/skills/opendevbrowser-form-testing/assets/templates/a11y-assertions.md +7 -0
  521. package/skills/opendevbrowser-form-testing/assets/templates/challenge-decision-tree.json +16 -0
  522. package/skills/opendevbrowser-form-testing/assets/templates/multi-step-state.json +11 -0
  523. package/skills/opendevbrowser-form-testing/assets/templates/validation-matrix.json +24 -0
  524. package/skills/opendevbrowser-form-testing/examples/sample-validation-matrix.json +29 -0
  525. package/skills/opendevbrowser-form-testing/scripts/run-form-workflow.sh +82 -0
  526. package/skills/opendevbrowser-form-testing/scripts/validate-skill-assets.sh +49 -0
  527. package/skills/opendevbrowser-login-automation/SKILL.md +159 -0
  528. package/skills/opendevbrowser-login-automation/artifacts/login-workflows.md +39 -0
  529. package/skills/opendevbrowser-login-automation/assets/templates/auth-signals.json +21 -0
  530. package/skills/opendevbrowser-login-automation/assets/templates/challenge-checkpoint.md +10 -0
  531. package/skills/opendevbrowser-login-automation/assets/templates/login-scenario-matrix.json +26 -0
  532. package/skills/opendevbrowser-login-automation/examples/sample-auth-signals.json +14 -0
  533. package/skills/opendevbrowser-login-automation/scripts/record-auth-signals.sh +18 -0
  534. package/skills/opendevbrowser-login-automation/scripts/run-login-workflow.sh +99 -0
  535. package/skills/opendevbrowser-login-automation/scripts/validate-skill-assets.sh +50 -0
  536. package/skills/opendevbrowser-product-presentation-asset/SKILL.md +98 -0
  537. package/skills/opendevbrowser-product-presentation-asset/artifacts/asset-pack-assembly.md +23 -0
  538. package/skills/opendevbrowser-product-presentation-asset/artifacts/ugc-creative-guide.md +21 -0
  539. package/skills/opendevbrowser-product-presentation-asset/assets/templates/claims-evidence-map.md +5 -0
  540. package/skills/opendevbrowser-product-presentation-asset/assets/templates/copy.md +5 -0
  541. package/skills/opendevbrowser-product-presentation-asset/assets/templates/features.md +4 -0
  542. package/skills/opendevbrowser-product-presentation-asset/assets/templates/manifest.schema.json +14 -0
  543. package/skills/opendevbrowser-product-presentation-asset/assets/templates/shot-list.md +7 -0
  544. package/skills/opendevbrowser-product-presentation-asset/assets/templates/ugc-concepts.md +17 -0
  545. package/skills/opendevbrowser-product-presentation-asset/assets/templates/user-actions.md +7 -0
  546. package/skills/opendevbrowser-product-presentation-asset/assets/templates/video-assembly.md +18 -0
  547. package/skills/opendevbrowser-product-presentation-asset/examples/sample-input.json +6 -0
  548. package/skills/opendevbrowser-product-presentation-asset/examples/sample-manifest.json +18 -0
  549. package/skills/opendevbrowser-product-presentation-asset/scripts/capture-screenshots.sh +9 -0
  550. package/skills/opendevbrowser-product-presentation-asset/scripts/collect-product.sh +14 -0
  551. package/skills/opendevbrowser-product-presentation-asset/scripts/download-images.sh +9 -0
  552. package/skills/opendevbrowser-product-presentation-asset/scripts/render-video-brief.sh +96 -0
  553. package/skills/opendevbrowser-product-presentation-asset/scripts/validate-skill-assets.sh +56 -0
  554. package/skills/opendevbrowser-product-presentation-asset/scripts/write-manifest.sh +43 -0
  555. package/skills/opendevbrowser-research/SKILL.md +73 -0
  556. package/skills/opendevbrowser-research/artifacts/research-workflows.md +29 -0
  557. package/skills/opendevbrowser-research/assets/templates/compact.md +7 -0
  558. package/skills/opendevbrowser-research/assets/templates/context.json +18 -0
  559. package/skills/opendevbrowser-research/assets/templates/report.md +9 -0
  560. package/skills/opendevbrowser-research/examples/sample-input.json +6 -0
  561. package/skills/opendevbrowser-research/examples/sample-output.md +4 -0
  562. package/skills/opendevbrowser-research/scripts/render-output.sh +12 -0
  563. package/skills/opendevbrowser-research/scripts/run-research.sh +23 -0
  564. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +48 -0
  565. package/skills/opendevbrowser-research/scripts/write-artifacts.sh +29 -0
  566. package/skills/opendevbrowser-shopping/SKILL.md +118 -0
  567. package/skills/opendevbrowser-shopping/artifacts/deal-hunting-workflows.md +37 -0
  568. package/skills/opendevbrowser-shopping/assets/templates/deal-thresholds.json +8 -0
  569. package/skills/opendevbrowser-shopping/assets/templates/deals-context.json +9 -0
  570. package/skills/opendevbrowser-shopping/assets/templates/deals-table.md +4 -0
  571. package/skills/opendevbrowser-shopping/assets/templates/market-analysis.json +30 -0
  572. package/skills/opendevbrowser-shopping/examples/sample-deals.md +4 -0
  573. package/skills/opendevbrowser-shopping/examples/sample-query.json +5 -0
  574. package/skills/opendevbrowser-shopping/scripts/analyze-market.sh +307 -0
  575. package/skills/opendevbrowser-shopping/scripts/normalize-offers.sh +28 -0
  576. package/skills/opendevbrowser-shopping/scripts/render-deals.sh +13 -0
  577. package/skills/opendevbrowser-shopping/scripts/run-deal-hunt.sh +32 -0
  578. package/skills/opendevbrowser-shopping/scripts/run-shopping.sh +19 -0
  579. package/skills/opendevbrowser-shopping/scripts/validate-skill-assets.sh +53 -0
  580. package/dist/chunk-WTFSMBVH.js +0 -2815
  581. package/dist/chunk-WTFSMBVH.js.map +0 -1
  582. package/extension/dist/popup.jsx +0 -150
  583. package/skills/data-extraction/SKILL.md +0 -136
  584. package/skills/form-testing/SKILL.md +0 -113
  585. package/skills/login-automation/SKILL.md +0 -98
@@ -1,20 +1,63 @@
1
- import { DEFAULT_AUTO_CONNECT, DEFAULT_AUTO_PAIR, DEFAULT_DISCOVERY_PORT, DEFAULT_PAIRING_ENABLED, DEFAULT_PAIRING_TOKEN, DEFAULT_RELAY_PORT } from "./relay-settings.js";
1
+ import { DEFAULT_AUTO_CONNECT, DEFAULT_AUTO_PAIR, DEFAULT_DISCOVERY_PORT, DEFAULT_NATIVE_ENABLED, DEFAULT_PAIRING_ENABLED, DEFAULT_PAIRING_TOKEN, DEFAULT_RELAY_PORT } from "./relay-settings.js";
2
+ import { logError } from "./logging.js";
2
3
  const statusEl = document.getElementById("status");
3
4
  const statusIndicator = document.getElementById("statusIndicator");
4
5
  const statusPill = document.getElementById("statusPill");
5
6
  const statusNote = document.getElementById("statusNote");
6
7
  const toggleButton = document.getElementById("toggle");
8
+ const healthRelay = document.getElementById("healthRelay");
9
+ const healthHandshake = document.getElementById("healthHandshake");
10
+ const healthAnnotation = document.getElementById("healthAnnotation");
11
+ const healthInjected = document.getElementById("healthInjected");
12
+ const healthCdp = document.getElementById("healthCdp");
13
+ const healthPairing = document.getElementById("healthPairing");
14
+ const healthNative = document.getElementById("healthNative");
15
+ const healthNote = document.getElementById("healthNote");
7
16
  const relayPortInput = document.getElementById("relayPort");
8
17
  const pairingTokenInput = document.getElementById("pairingToken");
9
18
  const pairingEnabledInput = document.getElementById("pairingEnabled");
10
19
  const autoPairInput = document.getElementById("autoPair");
11
20
  const autoConnectInput = document.getElementById("autoConnect");
12
- if (!statusEl || !statusIndicator || !statusPill || !statusNote || !toggleButton || !relayPortInput || !pairingTokenInput || !pairingEnabledInput || !autoPairInput || !autoConnectInput) {
21
+ const nativeEnabledInput = document.getElementById("nativeEnabled");
22
+ const annotationContextInput = document.getElementById("annotationContext");
23
+ const annotationStartButton = document.getElementById("annotationStart");
24
+ const annotationCopyButton = document.getElementById("annotationCopy");
25
+ const annotationNote = document.getElementById("annotationNote");
26
+ if (!statusEl
27
+ || !statusIndicator
28
+ || !statusPill
29
+ || !statusNote
30
+ || !toggleButton
31
+ || !healthRelay
32
+ || !healthHandshake
33
+ || !healthAnnotation
34
+ || !healthInjected
35
+ || !healthCdp
36
+ || !healthPairing
37
+ || !healthNative
38
+ || !healthNote
39
+ || !relayPortInput
40
+ || !pairingTokenInput
41
+ || !pairingEnabledInput
42
+ || !autoPairInput
43
+ || !autoConnectInput
44
+ || !nativeEnabledInput
45
+ || !annotationContextInput
46
+ || !annotationStartButton
47
+ || !annotationCopyButton
48
+ || !annotationNote) {
13
49
  throw new Error("Popup DOM missing required elements");
14
50
  }
15
51
  const defaultNote = "Local relay only. Tokens stay on-device.";
16
- const setNote = (message = defaultNote) => {
17
- statusNote.textContent = message;
52
+ const defaultAnnotationNote = "No annotations captured yet.";
53
+ const LAST_ANNOTATION_META_KEY = "annotationLastMeta";
54
+ const setNote = (message) => {
55
+ const next = message && message.trim() ? message : defaultNote;
56
+ statusNote.textContent = next;
57
+ };
58
+ const setAnnotationNote = (message) => {
59
+ const next = message && message.trim() ? message : defaultAnnotationNote;
60
+ annotationNote.textContent = next;
18
61
  };
19
62
  const setStatus = (status) => {
20
63
  const isConnected = status === "connected";
@@ -29,17 +72,147 @@ const setStatus = (status) => {
29
72
  statusPill.classList.remove("connected");
30
73
  }
31
74
  };
75
+ const setHealthValue = (element, value, tone) => {
76
+ element.textContent = value;
77
+ element.dataset.tone = tone;
78
+ };
79
+ const formatReason = (reason) => {
80
+ return reason.replace(/_/g, " ");
81
+ };
82
+ const setHealth = (health) => {
83
+ if (!health) {
84
+ setHealthValue(healthRelay, "Unknown", "off");
85
+ setHealthValue(healthHandshake, "Unknown", "off");
86
+ setHealthValue(healthAnnotation, "Unknown", "off");
87
+ setHealthValue(healthInjected, "Unknown", "off");
88
+ setHealthValue(healthCdp, "Unknown", "off");
89
+ setHealthValue(healthPairing, "Unknown", "off");
90
+ healthNote.textContent = "Health check pending.";
91
+ return;
92
+ }
93
+ setHealthValue(healthRelay, health.ok ? "Online" : "Offline", health.ok ? "ok" : "warn");
94
+ setHealthValue(healthHandshake, health.extensionHandshakeComplete ? "Complete" : (health.extensionConnected ? "Pending" : "Offline"), health.extensionHandshakeComplete ? "ok" : (health.extensionConnected ? "warn" : "off"));
95
+ setHealthValue(healthAnnotation, health.annotationConnected ? "Connected" : "Idle", health.annotationConnected ? "ok" : "off");
96
+ setHealthValue(healthInjected, "Unknown", "off");
97
+ setHealthValue(healthCdp, health.cdpConnected ? "Active" : "Idle", health.cdpConnected ? "ok" : "off");
98
+ setHealthValue(healthPairing, health.pairingRequired ? "Required" : "Not required", health.pairingRequired ? "warn" : "ok");
99
+ if (health.lastHandshakeError) {
100
+ const detail = health.lastHandshakeError.message ? ` ${health.lastHandshakeError.message}` : "";
101
+ healthNote.textContent = `Last handshake error: ${health.lastHandshakeError.code}.${detail}`;
102
+ }
103
+ else if (!health.ok) {
104
+ healthNote.textContent = `Relay health: ${formatReason(health.reason)}.`;
105
+ }
106
+ else {
107
+ healthNote.textContent = "Relay health OK.";
108
+ }
109
+ };
110
+ const setInjectionStatus = (injected, detail) => {
111
+ if (injected === null) {
112
+ setHealthValue(healthInjected, "Unknown", "off");
113
+ return;
114
+ }
115
+ if (injected) {
116
+ setHealthValue(healthInjected, "Injected", "ok");
117
+ return;
118
+ }
119
+ setHealthValue(healthInjected, "Not injected", "warn");
120
+ if (detail && healthNote.textContent === "Relay health OK.") {
121
+ healthNote.textContent = `Annotation UI: ${detail}`;
122
+ }
123
+ };
124
+ const formatNativeHealth = (health) => {
125
+ if (!health) {
126
+ return { label: "Unknown", tone: "off" };
127
+ }
128
+ if (health.status === "connected") {
129
+ return { label: "Connected", tone: "ok" };
130
+ }
131
+ switch (health.error) {
132
+ case "host_not_installed":
133
+ return { label: "Not installed", tone: "warn", note: "Native host not installed." };
134
+ case "host_forbidden":
135
+ return { label: "Forbidden", tone: "warn", note: "Native host forbidden." };
136
+ case "host_timeout":
137
+ return { label: "Timeout", tone: "warn", note: "Native host timed out." };
138
+ case "host_message_too_large":
139
+ return { label: "Too large", tone: "warn", note: "Native host rejected message size." };
140
+ case "host_disconnect":
141
+ return { label: "Disconnected", tone: "off", note: "Native host disconnected." };
142
+ default:
143
+ return { label: "Unavailable", tone: "off", note: "Native host unavailable." };
144
+ }
145
+ };
146
+ const setNativeHealth = (health, enabled) => {
147
+ if (!enabled) {
148
+ setHealthValue(healthNative, "Disabled", "off");
149
+ return;
150
+ }
151
+ const formatted = formatNativeHealth(health);
152
+ setHealthValue(healthNative, formatted.label, formatted.tone);
153
+ if (formatted.note && healthNote.textContent === "Relay health OK.") {
154
+ healthNote.textContent = `${healthNote.textContent} ${formatted.note}`;
155
+ }
156
+ };
157
+ const applyStatus = (response) => {
158
+ setStatus(response.status);
159
+ setNote(response.note);
160
+ setHealth(response.relayHealth ?? null);
161
+ setNativeHealth(response.nativeHealth ?? null, response.nativeEnabled === true);
162
+ };
32
163
  const sendMessage = (message) => {
33
- return new Promise((resolve) => {
164
+ return new Promise((resolve, reject) => {
34
165
  chrome.runtime.sendMessage(message, (response) => {
166
+ const lastError = chrome.runtime.lastError;
167
+ if (lastError) {
168
+ reject(new Error(lastError.message));
169
+ return;
170
+ }
171
+ if (!response) {
172
+ reject(new Error("No response from background"));
173
+ return;
174
+ }
35
175
  resolve(response);
36
176
  });
37
177
  });
38
178
  };
179
+ const setStorage = (items) => {
180
+ return new Promise((resolve) => {
181
+ chrome.storage.local.set(items, () => resolve());
182
+ });
183
+ };
184
+ const refreshInjectionStatus = async () => {
185
+ try {
186
+ const response = await sendMessage({ type: "annotation:probe" });
187
+ setInjectionStatus(response.injected, response.detail);
188
+ }
189
+ catch (error) {
190
+ logError("popup.annotation_probe", error, { code: "annotation_probe_failed" });
191
+ setInjectionStatus(null);
192
+ }
193
+ };
39
194
  const refreshStatus = async () => {
40
- const response = await sendMessage({ type: "status" });
41
- setStatus(response.status);
42
- setNote();
195
+ try {
196
+ const response = await sendMessage({ type: "status" });
197
+ applyStatus(response);
198
+ void refreshInjectionStatus();
199
+ }
200
+ catch (error) {
201
+ logError("popup.status_refresh", error, { code: "status_refresh_failed" });
202
+ setStatus("disconnected");
203
+ const message = error instanceof Error ? error.message : "Background unavailable";
204
+ setNote(message);
205
+ setHealth(null);
206
+ setNativeHealth(null, nativeEnabledInput.checked);
207
+ setInjectionStatus(null);
208
+ }
209
+ };
210
+ const setCopyEnabled = (enabled) => {
211
+ annotationCopyButton.disabled = !enabled;
212
+ };
213
+ const buildPopupAnnotationOptions = () => {
214
+ const context = annotationContextInput.value.trim();
215
+ return context ? { context } : undefined;
43
216
  };
44
217
  const fetchTokenFromPlugin = async (port) => {
45
218
  try {
@@ -51,9 +224,17 @@ const fetchTokenFromPlugin = async (port) => {
51
224
  return null;
52
225
  }
53
226
  const data = await response.json();
54
- return typeof data.token === "string" ? data.token : null;
227
+ if (typeof data.token !== "string") {
228
+ return null;
229
+ }
230
+ return {
231
+ token: data.token,
232
+ instanceId: typeof data.instanceId === "string" ? data.instanceId : null,
233
+ epoch: typeof data.epoch === "number" ? data.epoch : null
234
+ };
55
235
  }
56
- catch {
236
+ catch (error) {
237
+ logError("popup.token_fetch", error, { code: "relay_pair_fetch_failed", extra: { port } });
57
238
  return null;
58
239
  }
59
240
  };
@@ -84,9 +265,12 @@ const fetchRelayConfig = async (port) => {
84
265
  return null;
85
266
  }
86
267
  const pairingRequired = typeof data.pairingRequired === "boolean" ? data.pairingRequired : true;
87
- return { relayPort, pairingRequired };
268
+ const instanceId = typeof data.instanceId === "string" ? data.instanceId : null;
269
+ const epoch = typeof data.epoch === "number" ? data.epoch : null;
270
+ return { relayPort, pairingRequired, instanceId, epoch };
88
271
  }
89
- catch {
272
+ catch (error) {
273
+ logError("popup.relay_config_fetch", error, { code: "relay_config_fetch_failed", extra: { port } });
90
274
  return null;
91
275
  }
92
276
  };
@@ -99,12 +283,13 @@ const applyRelayPort = (port) => {
99
283
  };
100
284
  const loadSettings = async () => {
101
285
  const data = await new Promise((resolve) => {
102
- chrome.storage.local.get(["pairingToken", "pairingEnabled", "relayPort", "autoPair", "autoConnect"], (items) => {
286
+ chrome.storage.local.get(["pairingToken", "pairingEnabled", "relayPort", "autoPair", "autoConnect", "nativeEnabled"], (items) => {
103
287
  resolve(items);
104
288
  });
105
289
  });
106
290
  const autoPair = typeof data.autoPair === "boolean" ? data.autoPair : DEFAULT_AUTO_PAIR;
107
291
  const autoConnect = typeof data.autoConnect === "boolean" ? data.autoConnect : DEFAULT_AUTO_CONNECT;
292
+ const nativeEnabled = typeof data.nativeEnabled === "boolean" ? data.nativeEnabled : DEFAULT_NATIVE_ENABLED;
108
293
  const pairingEnabled = typeof data.pairingEnabled === "boolean"
109
294
  ? data.pairingEnabled
110
295
  : DEFAULT_PAIRING_ENABLED;
@@ -113,6 +298,7 @@ const loadSettings = async () => {
113
298
  const portValue = parsePort(data.relayPort) ?? DEFAULT_RELAY_PORT;
114
299
  autoConnectInput.checked = autoConnect;
115
300
  autoPairInput.checked = autoPair;
301
+ nativeEnabledInput.checked = nativeEnabled;
116
302
  pairingEnabledInput.checked = pairingEnabled;
117
303
  pairingTokenInput.disabled = !pairingEnabled || autoPair;
118
304
  pairingTokenInput.value = tokenValue;
@@ -125,6 +311,9 @@ const loadSettings = async () => {
125
311
  if (typeof data.autoPair !== "boolean") {
126
312
  updates.autoPair = autoPair;
127
313
  }
314
+ if (typeof data.nativeEnabled !== "boolean") {
315
+ updates.nativeEnabled = nativeEnabled;
316
+ }
128
317
  if (typeof data.pairingEnabled !== "boolean") {
129
318
  updates.pairingEnabled = pairingEnabled;
130
319
  }
@@ -132,6 +321,62 @@ const loadSettings = async () => {
132
321
  chrome.storage.local.set(updates);
133
322
  }
134
323
  };
324
+ const formatAnnotationSummary = (meta) => {
325
+ if (meta.status !== "ok") {
326
+ if (meta.error?.message) {
327
+ return `Last annotation ${meta.status}: ${meta.error.message}`;
328
+ }
329
+ return `Last annotation ${meta.status}.`;
330
+ }
331
+ const count = meta.annotationCount ?? 0;
332
+ const target = meta.url ? ` on ${meta.url}` : "";
333
+ return `Last annotation: ${count} item${count === 1 ? "" : "s"}${target}.`;
334
+ };
335
+ const refreshLastAnnotationMeta = async () => {
336
+ try {
337
+ const response = await sendMessage({ type: "annotation:lastMeta" });
338
+ const meta = response.meta;
339
+ if (meta && meta.status === "ok") {
340
+ setCopyEnabled(true);
341
+ setAnnotationNote(formatAnnotationSummary(meta));
342
+ return;
343
+ }
344
+ setCopyEnabled(false);
345
+ if (meta) {
346
+ setAnnotationNote(formatAnnotationSummary(meta));
347
+ }
348
+ else {
349
+ setAnnotationNote();
350
+ }
351
+ }
352
+ catch (error) {
353
+ logError("popup.annotation_meta", error, { code: "annotation_meta_failed" });
354
+ setCopyEnabled(false);
355
+ setAnnotationNote("Annotation status unavailable.");
356
+ }
357
+ };
358
+ const copyTextToClipboard = async (text) => {
359
+ try {
360
+ await navigator.clipboard.writeText(text);
361
+ return;
362
+ }
363
+ catch (error) {
364
+ logError("popup.clipboard_async", error, { code: "clipboard_write_failed" });
365
+ }
366
+ const textarea = document.createElement("textarea");
367
+ textarea.value = text;
368
+ textarea.setAttribute("readonly", "true");
369
+ textarea.style.position = "fixed";
370
+ textarea.style.top = "-1000px";
371
+ textarea.style.opacity = "0";
372
+ document.body.appendChild(textarea);
373
+ textarea.select();
374
+ const ok = document.execCommand("copy");
375
+ document.body.removeChild(textarea);
376
+ if (!ok) {
377
+ throw new Error("Clipboard copy failed");
378
+ }
379
+ };
135
380
  const toggle = async () => {
136
381
  const isConnected = statusEl.textContent === "Connected";
137
382
  setNote();
@@ -141,32 +386,108 @@ const toggle = async () => {
141
386
  if (config?.relayPort) {
142
387
  applyRelayPort(config.relayPort);
143
388
  }
389
+ if (config?.relayPort || config?.instanceId || config?.epoch) {
390
+ await setStorage({
391
+ relayPort: config?.relayPort ?? relayPort,
392
+ relayInstanceId: config?.instanceId ?? null,
393
+ relayEpoch: config?.epoch ?? null
394
+ });
395
+ }
144
396
  const pairingRequired = config?.pairingRequired ?? true;
145
397
  if (pairingRequired) {
146
398
  const fetchedToken = await fetchTokenFromPlugin(relayPort);
147
399
  if (fetchedToken) {
148
- pairingTokenInput.value = fetchedToken;
149
- chrome.storage.local.set({ pairingToken: fetchedToken });
400
+ pairingTokenInput.value = fetchedToken.token;
401
+ await setStorage({
402
+ pairingToken: fetchedToken.token,
403
+ tokenEpoch: fetchedToken.epoch ?? config?.epoch ?? null,
404
+ relayInstanceId: config?.instanceId ?? fetchedToken.instanceId ?? null,
405
+ relayEpoch: config?.epoch ?? fetchedToken.epoch ?? null
406
+ });
150
407
  }
151
408
  else {
152
409
  setStatus("disconnected");
153
- setNote("Auto-pair failed. Start the plugin and retry.");
410
+ setNote("Auto-pair failed. Start the daemon and retry.");
154
411
  setTimeout(() => refreshStatus(), 2000);
155
412
  return;
156
413
  }
157
414
  }
158
415
  }
159
- const response = await sendMessage({
160
- type: isConnected ? "disconnect" : "connect"
161
- });
162
- setStatus(response.status);
163
- setNote();
416
+ try {
417
+ const response = await sendMessage({
418
+ type: isConnected ? "disconnect" : "connect"
419
+ });
420
+ applyStatus(response);
421
+ void refreshInjectionStatus();
422
+ }
423
+ catch (error) {
424
+ logError("popup.toggle", error, { code: "toggle_failed" });
425
+ setStatus("disconnected");
426
+ const message = error instanceof Error ? error.message : "Background unavailable";
427
+ setNote(message);
428
+ setHealth(null);
429
+ }
164
430
  };
165
431
  toggleButton.addEventListener("click", () => {
166
- toggle().catch(() => {
432
+ toggle().catch((error) => {
433
+ logError("popup.toggle", error, { code: "toggle_failed" });
167
434
  setStatus("disconnected");
168
435
  });
169
436
  });
437
+ annotationStartButton.addEventListener("click", () => {
438
+ (async () => {
439
+ setAnnotationNote("Starting annotation...");
440
+ const options = buildPopupAnnotationOptions();
441
+ const response = await sendMessage({
442
+ type: "annotation:start",
443
+ options
444
+ });
445
+ if (!response.ok) {
446
+ const message = response.error?.message ?? "Annotation start failed.";
447
+ setAnnotationNote(message);
448
+ setCopyEnabled(false);
449
+ return;
450
+ }
451
+ setAnnotationNote("Annotation started. Switch to the tab to select elements.");
452
+ setCopyEnabled(false);
453
+ void refreshInjectionStatus();
454
+ })().catch((error) => {
455
+ const message = error instanceof Error ? error.message : "Annotation start failed.";
456
+ setAnnotationNote(message);
457
+ setCopyEnabled(false);
458
+ });
459
+ });
460
+ annotationCopyButton.addEventListener("click", () => {
461
+ (async () => {
462
+ setAnnotationNote("Preparing annotation payload...");
463
+ let response = await sendMessage({
464
+ type: "annotation:getPayload",
465
+ includeScreenshots: true
466
+ });
467
+ if (!response.payload) {
468
+ response = await sendMessage({
469
+ type: "annotation:getPayload",
470
+ includeScreenshots: false
471
+ });
472
+ }
473
+ if (!response.payload) {
474
+ setAnnotationNote("No completed annotation payload available.");
475
+ setCopyEnabled(false);
476
+ return;
477
+ }
478
+ await copyTextToClipboard(JSON.stringify(response.payload, null, 2));
479
+ if (response.warning) {
480
+ setAnnotationNote(`Copied payload (${response.warning.replace(/\.$/, "")}).`);
481
+ }
482
+ else {
483
+ setAnnotationNote("Copied annotation payload to clipboard.");
484
+ }
485
+ await refreshLastAnnotationMeta();
486
+ })().catch((error) => {
487
+ const message = error instanceof Error ? error.message : "Copy failed.";
488
+ setAnnotationNote(message);
489
+ });
490
+ });
170
491
  autoPairInput.addEventListener("change", () => {
171
492
  const enabled = autoPairInput.checked;
172
493
  pairingTokenInput.disabled = !pairingEnabledInput.checked || enabled;
@@ -182,12 +503,19 @@ autoConnectInput.addEventListener("change", () => {
182
503
  const enabled = autoConnectInput.checked;
183
504
  chrome.storage.local.set({ autoConnect: enabled });
184
505
  if (enabled && statusEl.textContent !== "Connected") {
185
- toggle().catch(() => {
506
+ toggle().catch((error) => {
507
+ logError("popup.auto_connect", error, { code: "auto_connect_failed" });
186
508
  setStatus("disconnected");
187
509
  setNote();
188
510
  });
189
511
  }
190
512
  });
513
+ nativeEnabledInput.addEventListener("change", () => {
514
+ const enabled = nativeEnabledInput.checked;
515
+ chrome.storage.local.set({ nativeEnabled: enabled });
516
+ setNativeHealth(null, enabled);
517
+ void refreshStatus();
518
+ });
191
519
  pairingTokenInput.addEventListener("input", () => {
192
520
  const value = pairingTokenInput.value.trim();
193
521
  chrome.storage.local.set({ pairingToken: value });
@@ -214,16 +542,33 @@ relayPortInput.addEventListener("input", () => {
214
542
  chrome.storage.local.set({ relayPort: parsed });
215
543
  }
216
544
  });
217
- refreshStatus().catch(() => {
545
+ refreshStatus().catch((error) => {
546
+ logError("popup.refresh_status", error, { code: "status_refresh_failed" });
218
547
  setStatus("disconnected");
219
548
  setNote();
220
549
  });
221
- loadSettings().catch(() => {
550
+ loadSettings().catch((error) => {
551
+ logError("popup.load_settings", error, { code: "settings_load_failed" });
222
552
  autoConnectInput.checked = DEFAULT_AUTO_CONNECT;
223
553
  autoPairInput.checked = DEFAULT_AUTO_PAIR;
554
+ nativeEnabledInput.checked = DEFAULT_NATIVE_ENABLED;
224
555
  pairingEnabledInput.checked = DEFAULT_PAIRING_ENABLED;
225
556
  pairingTokenInput.disabled = !DEFAULT_PAIRING_ENABLED;
226
557
  pairingTokenInput.value = DEFAULT_PAIRING_TOKEN || "";
227
558
  relayPortInput.value = String(DEFAULT_RELAY_PORT);
228
559
  setNote();
229
560
  });
561
+ refreshLastAnnotationMeta().catch((error) => {
562
+ logError("popup.annotation_meta", error, { code: "annotation_meta_failed" });
563
+ setCopyEnabled(false);
564
+ setAnnotationNote();
565
+ });
566
+ chrome.storage.onChanged.addListener((changes, areaName) => {
567
+ if (areaName !== "local")
568
+ return;
569
+ if (!changes[LAST_ANNOTATION_META_KEY])
570
+ return;
571
+ refreshLastAnnotationMeta().catch((error) => {
572
+ logError("popup.annotation_meta", error, { code: "annotation_meta_failed" });
573
+ });
574
+ });
@@ -4,3 +4,4 @@ export const DEFAULT_PAIRING_TOKEN = null;
4
4
  export const DEFAULT_PAIRING_ENABLED = true;
5
5
  export const DEFAULT_AUTO_PAIR = true;
6
6
  export const DEFAULT_AUTO_CONNECT = true;
7
+ export const DEFAULT_NATIVE_ENABLED = false;