opendevbrowser 0.0.28 → 0.0.30

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 (325) hide show
  1. package/README.md +2 -2
  2. package/dist/accessibility-snapshot-CQ4ZKWKC.js +39 -0
  3. package/dist/accessibility-snapshot-CQ4ZKWKC.js.map +1 -0
  4. package/dist/active-window-TD5HYJ72.js +37 -0
  5. package/dist/active-window-TD5HYJ72.js.map +1 -0
  6. package/dist/annotate-VTLFS2XV.js +205 -0
  7. package/dist/annotate-VTLFS2XV.js.map +1 -0
  8. package/dist/artifacts-KJ6RNDO2.js +120 -0
  9. package/dist/artifacts-KJ6RNDO2.js.map +1 -0
  10. package/dist/attr-BCI5KYCW.js +84 -0
  11. package/dist/attr-BCI5KYCW.js.map +1 -0
  12. package/dist/browser/ops-client.d.ts +1 -0
  13. package/dist/browser/ops-client.d.ts.map +1 -1
  14. package/dist/canvas-5DFEEOKM.js +309 -0
  15. package/dist/canvas-5DFEEOKM.js.map +1 -0
  16. package/dist/capture-desktop-HFTTWY4Z.js +38 -0
  17. package/dist/capture-desktop-HFTTWY4Z.js.map +1 -0
  18. package/dist/capture-window-X63XPIFF.js +40 -0
  19. package/dist/capture-window-X63XPIFF.js.map +1 -0
  20. package/dist/check-LWAUY7GC.js +71 -0
  21. package/dist/check-LWAUY7GC.js.map +1 -0
  22. package/dist/checked-ZSOUKVYT.js +71 -0
  23. package/dist/checked-ZSOUKVYT.js.map +1 -0
  24. package/dist/chunk-2SIMIPLY.js +67 -0
  25. package/dist/chunk-2SIMIPLY.js.map +1 -0
  26. package/dist/chunk-37VSRUW4.js +141 -0
  27. package/dist/chunk-37VSRUW4.js.map +1 -0
  28. package/dist/{chunk-T3VVHJTK.js → chunk-4BEJVZRK.js} +1078 -1458
  29. package/dist/chunk-4BEJVZRK.js.map +1 -0
  30. package/dist/chunk-5SWZDVOW.js +144 -0
  31. package/dist/chunk-5SWZDVOW.js.map +1 -0
  32. package/dist/chunk-6PVZ2ABC.js +429 -0
  33. package/dist/chunk-6PVZ2ABC.js.map +1 -0
  34. package/dist/chunk-7GVOUZMQ.js +64 -0
  35. package/dist/chunk-7GVOUZMQ.js.map +1 -0
  36. package/dist/chunk-7THCPS52.js +84 -0
  37. package/dist/chunk-7THCPS52.js.map +1 -0
  38. package/dist/chunk-AHEWXOKY.js +64 -0
  39. package/dist/chunk-AHEWXOKY.js.map +1 -0
  40. package/dist/chunk-ASMHEEKY.js +10 -0
  41. package/dist/chunk-ASMHEEKY.js.map +1 -0
  42. package/dist/chunk-COAOWH3G.js +3651 -0
  43. package/dist/chunk-COAOWH3G.js.map +1 -0
  44. package/dist/chunk-DBF5OKH3.js +111 -0
  45. package/dist/chunk-DBF5OKH3.js.map +1 -0
  46. package/dist/chunk-DW4TX7MU.js +54 -0
  47. package/dist/chunk-DW4TX7MU.js.map +1 -0
  48. package/dist/chunk-GQJ5S3BL.js +20 -0
  49. package/dist/chunk-GQJ5S3BL.js.map +1 -0
  50. package/dist/chunk-IPE7TF2P.js +54 -0
  51. package/dist/chunk-IPE7TF2P.js.map +1 -0
  52. package/dist/chunk-IQTJHXZJ.js +126 -0
  53. package/dist/chunk-IQTJHXZJ.js.map +1 -0
  54. package/dist/chunk-J47N77VG.js +2969 -0
  55. package/dist/chunk-J47N77VG.js.map +1 -0
  56. package/dist/chunk-JZXD6FWR.js +25 -0
  57. package/dist/chunk-JZXD6FWR.js.map +1 -0
  58. package/dist/{chunk-QVWOPIZJ.js → chunk-KDSNXS6N.js} +75 -149
  59. package/dist/chunk-KDSNXS6N.js.map +1 -0
  60. package/dist/chunk-KZ2IXVQT.js +219 -0
  61. package/dist/chunk-KZ2IXVQT.js.map +1 -0
  62. package/dist/chunk-MD655IPO.js +838 -0
  63. package/dist/chunk-MD655IPO.js.map +1 -0
  64. package/dist/chunk-MX3NFLCE.js +940 -0
  65. package/dist/chunk-MX3NFLCE.js.map +1 -0
  66. package/dist/chunk-OW5HMYMI.js +19 -0
  67. package/dist/chunk-OW5HMYMI.js.map +1 -0
  68. package/dist/chunk-PPUWQKIC.js +26 -0
  69. package/dist/chunk-PPUWQKIC.js.map +1 -0
  70. package/dist/{chunk-I5ZCOZZV.js → chunk-QOMWCRE3.js} +1202 -9561
  71. package/dist/chunk-QOMWCRE3.js.map +1 -0
  72. package/dist/chunk-RCZZGGJS.js +226 -0
  73. package/dist/chunk-RCZZGGJS.js.map +1 -0
  74. package/dist/chunk-RJNI3BHT.js +1 -0
  75. package/dist/chunk-RPXWUCQQ.js +112 -0
  76. package/dist/chunk-RPXWUCQQ.js.map +1 -0
  77. package/dist/chunk-S5KZQJJI.js +107 -0
  78. package/dist/chunk-S5KZQJJI.js.map +1 -0
  79. package/dist/chunk-T4GMCW6Z.js +46 -0
  80. package/dist/chunk-T4GMCW6Z.js.map +1 -0
  81. package/dist/chunk-WHQZBUNY.js +982 -0
  82. package/dist/chunk-WHQZBUNY.js.map +1 -0
  83. package/dist/chunk-WOXBLP7V.js +610 -0
  84. package/dist/chunk-WOXBLP7V.js.map +1 -0
  85. package/dist/cli/commands/inspiredesign.d.ts.map +1 -1
  86. package/dist/cli/commands/macro-resolve.d.ts +4 -1
  87. package/dist/cli/commands/macro-resolve.d.ts.map +1 -1
  88. package/dist/cli/commands/product-video.d.ts.map +1 -1
  89. package/dist/cli/commands/research.d.ts.map +1 -1
  90. package/dist/cli/commands/serve.d.ts.map +1 -1
  91. package/dist/cli/commands/shopping.d.ts.map +1 -1
  92. package/dist/cli/commands/workflow-output.d.ts +2 -0
  93. package/dist/cli/commands/workflow-output.d.ts.map +1 -0
  94. package/dist/cli/daemon-commands.d.ts.map +1 -1
  95. package/dist/cli/daemon.d.ts.map +1 -1
  96. package/dist/cli/index.js +204 -8123
  97. package/dist/cli/index.js.map +1 -1
  98. package/dist/cli/installers/postinstall-skill-sync.js +2 -1
  99. package/dist/cli/installers/postinstall-skill-sync.js.map +1 -1
  100. package/dist/cli/remote-relay.d.ts.map +1 -1
  101. package/dist/click-2AILSEIZ.js +81 -0
  102. package/dist/click-2AILSEIZ.js.map +1 -0
  103. package/dist/clone-component-TPJS3PEG.js +82 -0
  104. package/dist/clone-component-TPJS3PEG.js.map +1 -0
  105. package/dist/clone-page-LE74CIFC.js +69 -0
  106. package/dist/clone-page-LE74CIFC.js.map +1 -0
  107. package/dist/close-HN4YI47K.js +63 -0
  108. package/dist/close-HN4YI47K.js.map +1 -0
  109. package/dist/close-WFERRHX6.js +63 -0
  110. package/dist/close-WFERRHX6.js.map +1 -0
  111. package/dist/connect-RWBV2UCQ.js +107 -0
  112. package/dist/connect-RWBV2UCQ.js.map +1 -0
  113. package/dist/console-poll-PP4YYPDF.js +76 -0
  114. package/dist/console-poll-PP4YYPDF.js.map +1 -0
  115. package/dist/cookie-import-6IP776FC.js +177 -0
  116. package/dist/cookie-import-6IP776FC.js.map +1 -0
  117. package/dist/cookie-list-O2KG6DPU.js +117 -0
  118. package/dist/cookie-list-O2KG6DPU.js.map +1 -0
  119. package/dist/daemon-2BSAZXLT.js +194 -0
  120. package/dist/daemon-2BSAZXLT.js.map +1 -0
  121. package/dist/daemon-fingerprint.json +1 -1
  122. package/dist/debug-trace-snapshot-F3BDVZXS.js +136 -0
  123. package/dist/debug-trace-snapshot-F3BDVZXS.js.map +1 -0
  124. package/dist/dialog-6JQYUWMQ.js +75 -0
  125. package/dist/dialog-6JQYUWMQ.js.map +1 -0
  126. package/dist/disconnect-763TP7GH.js +58 -0
  127. package/dist/disconnect-763TP7GH.js.map +1 -0
  128. package/dist/enabled-DLYQFNIP.js +71 -0
  129. package/dist/enabled-DLYQFNIP.js.map +1 -0
  130. package/dist/extension-extractor-GKWSFHPN.js +11 -0
  131. package/dist/extension-extractor-GKWSFHPN.js.map +1 -0
  132. package/dist/global-D6WLWBXA.js +56 -0
  133. package/dist/global-D6WLWBXA.js.map +1 -0
  134. package/dist/goto-S346TJJH.js +98 -0
  135. package/dist/goto-S346TJJH.js.map +1 -0
  136. package/dist/help-EKKKEDL5.js +491 -0
  137. package/dist/help-EKKKEDL5.js.map +1 -0
  138. package/dist/hover-6JVJFGO7.js +71 -0
  139. package/dist/hover-6JVJFGO7.js.map +1 -0
  140. package/dist/html-EVOSPBIT.js +84 -0
  141. package/dist/html-EVOSPBIT.js.map +1 -0
  142. package/dist/index.d.ts.map +1 -1
  143. package/dist/index.js +87 -38
  144. package/dist/index.js.map +1 -1
  145. package/dist/inspector-H57BVUJP.js +62 -0
  146. package/dist/inspector-H57BVUJP.js.map +1 -0
  147. package/dist/inspector-audit-NQBAJWC7.js +84 -0
  148. package/dist/inspector-audit-NQBAJWC7.js.map +1 -0
  149. package/dist/inspector-plan-ZDIQVND3.js +69 -0
  150. package/dist/inspector-plan-ZDIQVND3.js.map +1 -0
  151. package/dist/inspiredesign-IEUL4PX3.js +234 -0
  152. package/dist/inspiredesign-IEUL4PX3.js.map +1 -0
  153. package/dist/install-autostart-output-5DOMKCQL.js +41 -0
  154. package/dist/install-autostart-output-5DOMKCQL.js.map +1 -0
  155. package/dist/install-autostart-reconciliation-NHKOFYTD.js +73 -0
  156. package/dist/install-autostart-reconciliation-NHKOFYTD.js.map +1 -0
  157. package/dist/launch-EK66VQPF.js +225 -0
  158. package/dist/launch-EK66VQPF.js.map +1 -0
  159. package/dist/list-ADZAQ2IU.js +51 -0
  160. package/dist/list-ADZAQ2IU.js.map +1 -0
  161. package/dist/list-KKUKN467.js +54 -0
  162. package/dist/list-KKUKN467.js.map +1 -0
  163. package/dist/local-HXJLUUNT.js +54 -0
  164. package/dist/local-HXJLUUNT.js.map +1 -0
  165. package/dist/macro-resolve-6DOQJ7CA.js +253 -0
  166. package/dist/macro-resolve-6DOQJ7CA.js.map +1 -0
  167. package/dist/macros/execute-runtime.d.ts +3 -1
  168. package/dist/macros/execute-runtime.d.ts.map +1 -1
  169. package/dist/macros/execute.d.ts +2 -0
  170. package/dist/macros/execute.d.ts.map +1 -1
  171. package/dist/native-UPLVQ2SG.js +22 -0
  172. package/dist/native-UPLVQ2SG.js.map +1 -0
  173. package/dist/network-poll-NUL4PDPY.js +76 -0
  174. package/dist/network-poll-NUL4PDPY.js.map +1 -0
  175. package/dist/new-5NKYPEFT.js +69 -0
  176. package/dist/new-5NKYPEFT.js.map +1 -0
  177. package/dist/onboarding-metadata-7E3KLYSZ.js +27 -0
  178. package/dist/onboarding-metadata-7E3KLYSZ.js.map +1 -0
  179. package/dist/open-NR3BPLXV.js +81 -0
  180. package/dist/open-NR3BPLXV.js.map +1 -0
  181. package/dist/opendevbrowser.d.ts.map +1 -1
  182. package/dist/opendevbrowser.js +87 -38
  183. package/dist/opendevbrowser.js.map +1 -1
  184. package/dist/perf-HJ36ZI6H.js +58 -0
  185. package/dist/perf-HJ36ZI6H.js.map +1 -0
  186. package/dist/pointer-down-IYTTQWXZ.js +55 -0
  187. package/dist/pointer-down-IYTTQWXZ.js.map +1 -0
  188. package/dist/pointer-drag-A2YC5PWI.js +54 -0
  189. package/dist/pointer-drag-A2YC5PWI.js.map +1 -0
  190. package/dist/pointer-move-W5K5FUI4.js +52 -0
  191. package/dist/pointer-move-W5K5FUI4.js.map +1 -0
  192. package/dist/pointer-up-6GWVO64Y.js +55 -0
  193. package/dist/pointer-up-6GWVO64Y.js.map +1 -0
  194. package/dist/press-A3V5WB3S.js +83 -0
  195. package/dist/press-A3V5WB3S.js.map +1 -0
  196. package/dist/product-video-52REKWF3.js +235 -0
  197. package/dist/product-video-52REKWF3.js.map +1 -0
  198. package/dist/providers/artifacts.d.ts +0 -2
  199. package/dist/providers/artifacts.d.ts.map +1 -1
  200. package/dist/providers/blocker.d.ts.map +1 -1
  201. package/dist/providers/bounded-map.d.ts +2 -0
  202. package/dist/providers/bounded-map.d.ts.map +1 -0
  203. package/dist/providers/community/index.d.ts.map +1 -1
  204. package/dist/providers/constraint.d.ts.map +1 -1
  205. package/dist/providers/index.d.ts +1 -0
  206. package/dist/providers/index.d.ts.map +1 -1
  207. package/dist/providers/renderer.d.ts.map +1 -1
  208. package/dist/providers/research-compiler.d.ts +1 -1
  209. package/dist/providers/research-compiler.d.ts.map +1 -1
  210. package/dist/providers/research-executor.d.ts.map +1 -1
  211. package/dist/providers/runtime-factory.d.ts.map +1 -1
  212. package/dist/providers/shared/traversal-url.d.ts +3 -0
  213. package/dist/providers/shared/traversal-url.d.ts.map +1 -1
  214. package/dist/providers/shopping/index.d.ts.map +1 -1
  215. package/dist/providers/social/search-quality.d.ts.map +1 -1
  216. package/dist/providers/workflow-handoff.d.ts +4 -0
  217. package/dist/providers/workflow-handoff.d.ts.map +1 -1
  218. package/dist/providers/workflow-output-root.d.ts +6 -0
  219. package/dist/providers/workflow-output-root.d.ts.map +1 -0
  220. package/dist/providers/workflows.d.ts.map +1 -1
  221. package/dist/{providers-QF2RFB4J.js → providers-IMFYMMHQ.js} +19 -14
  222. package/dist/providers-IMFYMMHQ.js.map +1 -0
  223. package/dist/public-surface/generated-manifest.d.ts +2 -2
  224. package/dist/public-surface/generated-manifest.d.ts.map +1 -1
  225. package/dist/public-surface/source.d.ts +2 -2
  226. package/dist/public-surface/source.d.ts.map +1 -1
  227. package/dist/relay/protocol.d.ts +3 -1
  228. package/dist/relay/protocol.d.ts.map +1 -1
  229. package/dist/relay/relay-server.d.ts +6 -0
  230. package/dist/relay/relay-server.d.ts.map +1 -1
  231. package/dist/research-WB6BBCDD.js +295 -0
  232. package/dist/research-WB6BBCDD.js.map +1 -0
  233. package/dist/review-BGWVY4RA.js +48 -0
  234. package/dist/review-BGWVY4RA.js.map +1 -0
  235. package/dist/review-desktop-LEORC5VS.js +54 -0
  236. package/dist/review-desktop-LEORC5VS.js.map +1 -0
  237. package/dist/rpc-4TSKSFGC.js +159 -0
  238. package/dist/rpc-4TSKSFGC.js.map +1 -0
  239. package/dist/run-3NBLVWXD.js +180 -0
  240. package/dist/run-3NBLVWXD.js.map +1 -0
  241. package/dist/screencast-start-UZVIT3IN.js +67 -0
  242. package/dist/screencast-start-UZVIT3IN.js.map +1 -0
  243. package/dist/screencast-stop-NOSJSIUO.js +59 -0
  244. package/dist/screencast-stop-NOSJSIUO.js.map +1 -0
  245. package/dist/screenshot-LARG4JQG.js +68 -0
  246. package/dist/screenshot-LARG4JQG.js.map +1 -0
  247. package/dist/scroll-VNFMV6TW.js +84 -0
  248. package/dist/scroll-VNFMV6TW.js.map +1 -0
  249. package/dist/scroll-into-view-VYRT3JPT.js +71 -0
  250. package/dist/scroll-into-view-VYRT3JPT.js.map +1 -0
  251. package/dist/select-KJTUZDVO.js +86 -0
  252. package/dist/select-KJTUZDVO.js.map +1 -0
  253. package/dist/serve-EV7K4HKR.js +498 -0
  254. package/dist/serve-EV7K4HKR.js.map +1 -0
  255. package/dist/shopping-DTXHVQ2X.js +273 -0
  256. package/dist/shopping-DTXHVQ2X.js.map +1 -0
  257. package/dist/skill-lifecycle-5UAZGKSN.js +89 -0
  258. package/dist/skill-lifecycle-5UAZGKSN.js.map +1 -0
  259. package/dist/skills-NSXDX6YM.js +26 -0
  260. package/dist/skills-NSXDX6YM.js.map +1 -0
  261. package/dist/snapshot-3XQMCMRJ.js +113 -0
  262. package/dist/snapshot-3XQMCMRJ.js.map +1 -0
  263. package/dist/status-OXSYA5XD.js +35 -0
  264. package/dist/status-OXSYA5XD.js.map +1 -0
  265. package/dist/status-YUMDP5KY.js +132 -0
  266. package/dist/status-YUMDP5KY.js.map +1 -0
  267. package/dist/status-capabilities-P4KDSE2Y.js +57 -0
  268. package/dist/status-capabilities-P4KDSE2Y.js.map +1 -0
  269. package/dist/text-V3B7UVIH.js +84 -0
  270. package/dist/text-V3B7UVIH.js.map +1 -0
  271. package/dist/tools/deps.d.ts +1 -0
  272. package/dist/tools/deps.d.ts.map +1 -1
  273. package/dist/tools/inspiredesign_run.d.ts.map +1 -1
  274. package/dist/tools/macro_resolve.d.ts.map +1 -1
  275. package/dist/tools/product_video_run.d.ts.map +1 -1
  276. package/dist/tools/research_run.d.ts.map +1 -1
  277. package/dist/tools/shopping_run.d.ts.map +1 -1
  278. package/dist/tools/workflow-output.d.ts +3 -0
  279. package/dist/tools/workflow-output.d.ts.map +1 -0
  280. package/dist/type-IYBN3ZLR.js +94 -0
  281. package/dist/type-IYBN3ZLR.js.map +1 -0
  282. package/dist/uncheck-SG737EGI.js +71 -0
  283. package/dist/uncheck-SG737EGI.js.map +1 -0
  284. package/dist/uninstall-KYKGJAX7.js +91 -0
  285. package/dist/uninstall-KYKGJAX7.js.map +1 -0
  286. package/dist/update-SMXPYGXS.js +305 -0
  287. package/dist/update-SMXPYGXS.js.map +1 -0
  288. package/dist/update-skill-modes-BVX7IVMW.js +38 -0
  289. package/dist/update-skill-modes-BVX7IVMW.js.map +1 -0
  290. package/dist/upload-KH6ZABJA.js +56 -0
  291. package/dist/upload-KH6ZABJA.js.map +1 -0
  292. package/dist/use-7YDKO3U4.js +63 -0
  293. package/dist/use-7YDKO3U4.js.map +1 -0
  294. package/dist/value-RZBWSKKM.js +71 -0
  295. package/dist/value-RZBWSKKM.js.map +1 -0
  296. package/dist/visible-BSFTAKXR.js +71 -0
  297. package/dist/visible-BSFTAKXR.js.map +1 -0
  298. package/dist/wait-TMTEAYOP.js +109 -0
  299. package/dist/wait-TMTEAYOP.js.map +1 -0
  300. package/dist/windows-HIZ23OHS.js +37 -0
  301. package/dist/windows-HIZ23OHS.js.map +1 -0
  302. package/extension/dist/background.js +99 -22
  303. package/extension/dist/ops/ops-runtime.js +85 -7
  304. package/extension/dist/ops/ops-session-store.js +3 -0
  305. package/extension/dist/ops/target-session-coordinator.js +3 -0
  306. package/extension/dist/services/CDPRouter.js +9 -0
  307. package/extension/manifest.json +1 -1
  308. package/package.json +1 -1
  309. package/skills/opendevbrowser-best-practices/SKILL.md +8 -6
  310. package/skills/opendevbrowser-best-practices/artifacts/skill-runtime-surface-matrix.md +1 -1
  311. package/skills/opendevbrowser-best-practices/scripts/odb-workflow.sh +3 -2
  312. package/skills/opendevbrowser-best-practices/scripts/validator-fixture-cli.sh +39 -2
  313. package/skills/opendevbrowser-research/SKILL.md +64 -12
  314. package/skills/opendevbrowser-research/artifacts/research-workflows.md +56 -19
  315. package/skills/opendevbrowser-research/assets/templates/compact.md +31 -5
  316. package/skills/opendevbrowser-research/assets/templates/context.json +52 -1
  317. package/skills/opendevbrowser-research/assets/templates/report.md +57 -4
  318. package/skills/opendevbrowser-research/examples/sample-input.json +1 -1
  319. package/skills/opendevbrowser-research/examples/sample-output.md +27 -2
  320. package/skills/opendevbrowser-research/scripts/run-research.sh +2 -6
  321. package/skills/opendevbrowser-research/scripts/validate-skill-assets.sh +115 -1
  322. package/dist/chunk-I5ZCOZZV.js.map +0 -1
  323. package/dist/chunk-QVWOPIZJ.js.map +0 -1
  324. package/dist/chunk-T3VVHJTK.js.map +0 -1
  325. /package/dist/{providers-QF2RFB4J.js.map → chunk-RJNI3BHT.js.map} +0 -0
@@ -0,0 +1,111 @@
1
+ import {
2
+ generateSecureToken
3
+ } from "./chunk-ASMHEEKY.js";
4
+ import {
5
+ writeFileAtomic
6
+ } from "./chunk-TBUCZX4A.js";
7
+
8
+ // src/cli/templates/config.ts
9
+ import * as fs from "fs";
10
+ import * as path from "path";
11
+ import * as os from "os";
12
+ function buildConfigTemplate(relayToken, daemonToken) {
13
+ return `{
14
+ // OpenDevBrowser Plugin Configuration
15
+ // See: https://github.com/anthropics/opendevbrowser#configuration
16
+
17
+ "headless": false,
18
+ "profile": "default",
19
+ "persistProfile": true,
20
+
21
+ "snapshot": {
22
+ "maxChars": 16000,
23
+ "maxNodes": 1000
24
+ },
25
+
26
+ "export": {
27
+ "maxNodes": 1000,
28
+ "inlineStyles": true
29
+ },
30
+
31
+ "devtools": {
32
+ "showFullUrls": false,
33
+ "showFullConsole": false
34
+ },
35
+
36
+ "security": {
37
+ "allowRawCDP": false,
38
+ "allowNonLocalCdp": false,
39
+ "allowUnsafeExport": false
40
+ },
41
+
42
+ "skillPaths": [],
43
+ "skills": {
44
+ "nudge": {
45
+ "enabled": true,
46
+ "keywords": ["quick start", "getting started", "launch", "connect", "setup"],
47
+ "maxAgeMs": 60000
48
+ }
49
+ },
50
+
51
+ "continuity": {
52
+ "enabled": true,
53
+ "filePath": "opendevbrowser_continuity.md",
54
+ "nudge": {
55
+ "enabled": true,
56
+ "keywords": [
57
+ "plan",
58
+ "multi-step",
59
+ "multi step",
60
+ "long-running",
61
+ "long running",
62
+ "refactor",
63
+ "migration",
64
+ "rollout",
65
+ "release",
66
+ "upgrade",
67
+ "investigate",
68
+ "follow-up",
69
+ "continue"
70
+ ],
71
+ "maxAgeMs": 60000
72
+ }
73
+ },
74
+
75
+ "relayPort": 8787,
76
+ "relayToken": "${relayToken}",
77
+ "daemonPort": 8788,
78
+ "daemonToken": "${daemonToken}",
79
+
80
+ "flags": [],
81
+
82
+ "checkForUpdates": false
83
+ }
84
+ `;
85
+ }
86
+ function getPluginConfigPath(mode) {
87
+ if (mode === "global") {
88
+ const configDir = process.env.OPENCODE_CONFIG_DIR || path.join(os.homedir(), ".config", "opencode");
89
+ return path.join(configDir, "opendevbrowser.jsonc");
90
+ }
91
+ return path.join(process.cwd(), "opendevbrowser.jsonc");
92
+ }
93
+ function createPluginConfig(mode) {
94
+ const configPath = getPluginConfigPath(mode);
95
+ if (fs.existsSync(configPath)) {
96
+ return { created: false, path: configPath };
97
+ }
98
+ const dir = path.dirname(configPath);
99
+ if (!fs.existsSync(dir)) {
100
+ fs.mkdirSync(dir, { recursive: true });
101
+ }
102
+ const relayToken = generateSecureToken();
103
+ const daemonToken = generateSecureToken();
104
+ writeFileAtomic(configPath, buildConfigTemplate(relayToken, daemonToken));
105
+ return { created: true, path: configPath };
106
+ }
107
+
108
+ export {
109
+ createPluginConfig
110
+ };
111
+ //# sourceMappingURL=chunk-DBF5OKH3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/templates/config.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { generateSecureToken } from \"../../utils/crypto\";\nimport { writeFileAtomic } from \"../../utils/fs\";\n\nfunction buildConfigTemplate(relayToken: string, daemonToken: string): string {\n return `{\n // OpenDevBrowser Plugin Configuration\n // See: https://github.com/anthropics/opendevbrowser#configuration\n\n \"headless\": false,\n \"profile\": \"default\",\n \"persistProfile\": true,\n\n \"snapshot\": {\n \"maxChars\": 16000,\n \"maxNodes\": 1000\n },\n\n \"export\": {\n \"maxNodes\": 1000,\n \"inlineStyles\": true\n },\n\n \"devtools\": {\n \"showFullUrls\": false,\n \"showFullConsole\": false\n },\n\n \"security\": {\n \"allowRawCDP\": false,\n \"allowNonLocalCdp\": false,\n \"allowUnsafeExport\": false\n },\n\n \"skillPaths\": [],\n \"skills\": {\n \"nudge\": {\n \"enabled\": true,\n \"keywords\": [\"quick start\", \"getting started\", \"launch\", \"connect\", \"setup\"],\n \"maxAgeMs\": 60000\n }\n },\n\n \"continuity\": {\n \"enabled\": true,\n \"filePath\": \"opendevbrowser_continuity.md\",\n \"nudge\": {\n \"enabled\": true,\n \"keywords\": [\n \"plan\",\n \"multi-step\",\n \"multi step\",\n \"long-running\",\n \"long running\",\n \"refactor\",\n \"migration\",\n \"rollout\",\n \"release\",\n \"upgrade\",\n \"investigate\",\n \"follow-up\",\n \"continue\"\n ],\n \"maxAgeMs\": 60000\n }\n },\n\n \"relayPort\": 8787,\n \"relayToken\": \"${relayToken}\",\n \"daemonPort\": 8788,\n \"daemonToken\": \"${daemonToken}\",\n\n \"flags\": [],\n\n \"checkForUpdates\": false\n}\n`;\n}\n\nexport function getPluginConfigPath(mode: \"global\" | \"local\"): string {\n if (mode === \"global\") {\n const configDir = process.env.OPENCODE_CONFIG_DIR\n || path.join(os.homedir(), \".config\", \"opencode\");\n return path.join(configDir, \"opendevbrowser.jsonc\");\n }\n return path.join(process.cwd(), \"opendevbrowser.jsonc\");\n}\n\nexport function createPluginConfig(mode: \"global\" | \"local\"): { created: boolean; path: string } {\n const configPath = getPluginConfigPath(mode);\n\n if (fs.existsSync(configPath)) {\n return { created: false, path: configPath };\n }\n\n const dir = path.dirname(configPath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n\n const relayToken = generateSecureToken();\n const daemonToken = generateSecureToken();\n writeFileAtomic(configPath, buildConfigTemplate(relayToken, daemonToken));\n return { created: true, path: configPath };\n}\n\nexport function getConfigTemplate(): string {\n return buildConfigTemplate(generateSecureToken(), generateSecureToken());\n}\n"],"mappings":";;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AAIpB,SAAS,oBAAoB,YAAoB,aAA6B;AAC5E,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBA+DU,UAAU;AAAA;AAAA,oBAET,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO/B;AAEO,SAAS,oBAAoB,MAAkC;AACpE,MAAI,SAAS,UAAU;AACrB,UAAM,YAAY,QAAQ,IAAI,uBACpB,UAAQ,WAAQ,GAAG,WAAW,UAAU;AAClD,WAAY,UAAK,WAAW,sBAAsB;AAAA,EACpD;AACA,SAAY,UAAK,QAAQ,IAAI,GAAG,sBAAsB;AACxD;AAEO,SAAS,mBAAmB,MAA8D;AAC/F,QAAM,aAAa,oBAAoB,IAAI;AAE3C,MAAO,cAAW,UAAU,GAAG;AAC7B,WAAO,EAAE,SAAS,OAAO,MAAM,WAAW;AAAA,EAC5C;AAEA,QAAM,MAAW,aAAQ,UAAU;AACnC,MAAI,CAAI,cAAW,GAAG,GAAG;AACvB,IAAG,aAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AAEA,QAAM,aAAa,oBAAoB;AACvC,QAAM,cAAc,oBAAoB;AACxC,kBAAgB,YAAY,oBAAoB,YAAY,WAAW,CAAC;AACxE,SAAO,EAAE,SAAS,MAAM,MAAM,WAAW;AAC3C;","names":[]}
@@ -0,0 +1,54 @@
1
+ // src/cli/onboarding-metadata.json
2
+ var sectionTitle = "Agent Quick Start";
3
+ var sectionSummary = 'Start with opendevbrowser_prompting_guide or opendevbrowser_skill_load opendevbrowser-best-practices "quick start" before low-level browser commands, then load validated capability lanes when you need the current transcript, evidence-gated research, shopping, browser replay, desktop observation, and browser-scoped computer-use workflows.';
4
+ var skillName = "opendevbrowser-best-practices";
5
+ var skillTopic = "quick start";
6
+ var validatedSkillTopic = "validated capability lanes";
7
+ var designSkillName = "opendevbrowser-design-agent";
8
+ var designSkillTopic = "canvas-contract";
9
+ var localOnlyToolNames = [
10
+ "opendevbrowser_prompting_guide",
11
+ "opendevbrowser_skill_list",
12
+ "opendevbrowser_skill_load"
13
+ ];
14
+ var quickStartCommands = {
15
+ promptingGuide: "opendevbrowser_prompting_guide",
16
+ skillList: "opendevbrowser_skill_list",
17
+ skillLoad: 'opendevbrowser_skill_load opendevbrowser-best-practices "quick start"',
18
+ validatedLanes: 'opendevbrowser_skill_load opendevbrowser-best-practices "validated capability lanes"',
19
+ validatedResearch: 'npx opendevbrowser research run --topic "Chrome extension debugging workflows" --days 30 --sources web,community --browser-mode managed --mode json --output-format json',
20
+ validatedShopping: 'npx opendevbrowser shopping run --query "wireless ergonomic mouse" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json',
21
+ computerUseEntry: 'npx opendevbrowser research run --topic "account recovery flow" --sources web,community --challenge-automation-mode browser --mode json --output-format json',
22
+ happyPath: "npx opendevbrowser launch --no-extension --headless --start-url https://example.com --output-format json"
23
+ };
24
+ var referencePaths = {
25
+ onboardingDoc: "docs/FIRST_RUN_ONBOARDING.md",
26
+ skillDoc: "skills/opendevbrowser-best-practices/SKILL.md"
27
+ };
28
+ var onboarding_metadata_default = {
29
+ sectionTitle,
30
+ sectionSummary,
31
+ skillName,
32
+ skillTopic,
33
+ validatedSkillTopic,
34
+ designSkillName,
35
+ designSkillTopic,
36
+ localOnlyToolNames,
37
+ quickStartCommands,
38
+ referencePaths
39
+ };
40
+
41
+ export {
42
+ sectionTitle,
43
+ sectionSummary,
44
+ skillName,
45
+ skillTopic,
46
+ validatedSkillTopic,
47
+ designSkillName,
48
+ designSkillTopic,
49
+ localOnlyToolNames,
50
+ quickStartCommands,
51
+ referencePaths,
52
+ onboarding_metadata_default
53
+ };
54
+ //# sourceMappingURL=chunk-DW4TX7MU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/onboarding-metadata.json"],"sourcesContent":["{\n \"sectionTitle\": \"Agent Quick Start\",\n \"sectionSummary\": \"Start with opendevbrowser_prompting_guide or opendevbrowser_skill_load opendevbrowser-best-practices \\\"quick start\\\" before low-level browser commands, then load validated capability lanes when you need the current transcript, evidence-gated research, shopping, browser replay, desktop observation, and browser-scoped computer-use workflows.\",\n \"skillName\": \"opendevbrowser-best-practices\",\n \"skillTopic\": \"quick start\",\n \"validatedSkillTopic\": \"validated capability lanes\",\n \"designSkillName\": \"opendevbrowser-design-agent\",\n \"designSkillTopic\": \"canvas-contract\",\n \"localOnlyToolNames\": [\n \"opendevbrowser_prompting_guide\",\n \"opendevbrowser_skill_list\",\n \"opendevbrowser_skill_load\"\n ],\n \"quickStartCommands\": {\n \"promptingGuide\": \"opendevbrowser_prompting_guide\",\n \"skillList\": \"opendevbrowser_skill_list\",\n \"skillLoad\": \"opendevbrowser_skill_load opendevbrowser-best-practices \\\"quick start\\\"\",\n \"validatedLanes\": \"opendevbrowser_skill_load opendevbrowser-best-practices \\\"validated capability lanes\\\"\",\n \"validatedResearch\": \"npx opendevbrowser research run --topic \\\"Chrome extension debugging workflows\\\" --days 30 --sources web,community --browser-mode managed --mode json --output-format json\",\n \"validatedShopping\": \"npx opendevbrowser shopping run --query \\\"wireless ergonomic mouse\\\" --providers shopping/bestbuy,shopping/ebay --budget 150 --browser-mode managed --use-cookies --challenge-automation-mode browser_with_helper --mode json --output-format json\",\n \"computerUseEntry\": \"npx opendevbrowser research run --topic \\\"account recovery flow\\\" --sources web,community --challenge-automation-mode browser --mode json --output-format json\",\n \"happyPath\": \"npx opendevbrowser launch --no-extension --headless --start-url https://example.com --output-format json\"\n },\n \"referencePaths\": {\n \"onboardingDoc\": \"docs/FIRST_RUN_ONBOARDING.md\",\n \"skillDoc\": \"skills/opendevbrowser-best-practices/SKILL.md\"\n }\n}\n"],"mappings":";AACE,mBAAgB;AAChB,qBAAkB;AAClB,gBAAa;AACb,iBAAc;AACd,0BAAuB;AACvB,sBAAmB;AACnB,uBAAoB;AACpB,yBAAsB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF;AACA,yBAAsB;AAAA,EACpB,gBAAkB;AAAA,EAClB,WAAa;AAAA,EACb,WAAa;AAAA,EACb,gBAAkB;AAAA,EAClB,mBAAqB;AAAA,EACrB,mBAAqB;AAAA,EACrB,kBAAoB;AAAA,EACpB,WAAa;AACf;AACA,qBAAkB;AAAA,EAChB,eAAiB;AAAA,EACjB,UAAY;AACd;AA1BF;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAKA;AAAA,EAUA;AAIF;","names":[]}
@@ -0,0 +1,20 @@
1
+ import {
2
+ createUsageError
3
+ } from "./chunk-IPE7TF2P.js";
4
+ import {
5
+ WORKFLOW_ARTIFACT_DIRECTORY
6
+ } from "./chunk-4BEJVZRK.js";
7
+
8
+ // src/cli/commands/workflow-output.ts
9
+ import { resolve } from "path";
10
+ var resolveWorkflowOutputDirFlag = (value = WORKFLOW_ARTIFACT_DIRECTORY, flag = "--output-dir") => {
11
+ if (value.trim() === "") {
12
+ throw createUsageError(`Missing value for ${flag}`);
13
+ }
14
+ return resolve(value);
15
+ };
16
+
17
+ export {
18
+ resolveWorkflowOutputDirFlag
19
+ };
20
+ //# sourceMappingURL=chunk-GQJ5S3BL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/workflow-output.ts"],"sourcesContent":["import { resolve } from \"path\";\nimport { createUsageError } from \"../errors\";\nimport { WORKFLOW_ARTIFACT_DIRECTORY } from \"../../providers/workflow-output-root\";\n\nexport const resolveWorkflowOutputDirFlag = (\n value = WORKFLOW_ARTIFACT_DIRECTORY,\n flag = \"--output-dir\"\n): string => {\n if (value.trim() === \"\") {\n throw createUsageError(`Missing value for ${flag}`);\n }\n return resolve(value);\n};\n"],"mappings":";;;;;;;;AAAA,SAAS,eAAe;AAIjB,IAAM,+BAA+B,CAC1C,QAAQ,6BACR,OAAO,mBACI;AACX,MAAI,MAAM,KAAK,MAAM,IAAI;AACvB,UAAM,iBAAiB,qBAAqB,IAAI,EAAE;AAAA,EACpD;AACA,SAAO,QAAQ,KAAK;AACtB;","names":[]}
@@ -0,0 +1,54 @@
1
+ // src/cli/errors.ts
2
+ var EXIT_SUCCESS = 0;
3
+ var EXIT_USAGE = 1;
4
+ var EXIT_EXECUTION = 2;
5
+ var EXIT_DISCONNECTED = 10;
6
+ var CliError = class extends Error {
7
+ exitCode;
8
+ constructor(message, exitCode) {
9
+ super(message);
10
+ this.exitCode = exitCode;
11
+ }
12
+ };
13
+ function createUsageError(message) {
14
+ return new CliError(message, EXIT_USAGE);
15
+ }
16
+ function createDisconnectedError(message) {
17
+ return new CliError(message, EXIT_DISCONNECTED);
18
+ }
19
+ function toCliError(error, fallbackExitCode = EXIT_EXECUTION) {
20
+ if (error instanceof CliError) {
21
+ return error;
22
+ }
23
+ const message = error instanceof Error ? error.message : String(error);
24
+ return new CliError(message, fallbackExitCode);
25
+ }
26
+ function formatErrorPayload(error) {
27
+ return {
28
+ success: false,
29
+ error: error.message,
30
+ exitCode: error.exitCode
31
+ };
32
+ }
33
+ function resolveExitCode(result) {
34
+ if (result.exitCode === null) {
35
+ return null;
36
+ }
37
+ if (typeof result.exitCode === "number") {
38
+ return result.exitCode;
39
+ }
40
+ return result.success ? EXIT_SUCCESS : EXIT_EXECUTION;
41
+ }
42
+
43
+ export {
44
+ EXIT_USAGE,
45
+ EXIT_EXECUTION,
46
+ EXIT_DISCONNECTED,
47
+ CliError,
48
+ createUsageError,
49
+ createDisconnectedError,
50
+ toCliError,
51
+ formatErrorPayload,
52
+ resolveExitCode
53
+ };
54
+ //# sourceMappingURL=chunk-IPE7TF2P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/errors.ts"],"sourcesContent":["import type { CommandResult } from \"./commands/types\";\n\nexport const EXIT_SUCCESS = 0;\nexport const EXIT_USAGE = 1;\nexport const EXIT_EXECUTION = 2;\nexport const EXIT_DISCONNECTED = 10;\n\nexport class CliError extends Error {\n exitCode: number;\n\n constructor(message: string, exitCode: number) {\n super(message);\n this.exitCode = exitCode;\n }\n}\n\nexport function createUsageError(message: string): CliError {\n return new CliError(message, EXIT_USAGE);\n}\n\nexport function createDisconnectedError(message: string): CliError {\n return new CliError(message, EXIT_DISCONNECTED);\n}\n\nexport function toCliError(error: unknown, fallbackExitCode = EXIT_EXECUTION): CliError {\n if (error instanceof CliError) {\n return error;\n }\n const message = error instanceof Error ? error.message : String(error);\n return new CliError(message, fallbackExitCode);\n}\n\nexport type ErrorPayload = {\n success: false;\n error: string;\n exitCode: number;\n};\n\nexport function formatErrorPayload(error: CliError): ErrorPayload {\n return {\n success: false,\n error: error.message,\n exitCode: error.exitCode\n };\n}\n\nexport function resolveExitCode(result: CommandResult): number | null {\n if (result.exitCode === null) {\n return null;\n }\n if (typeof result.exitCode === \"number\") {\n return result.exitCode;\n }\n return result.success ? EXIT_SUCCESS : EXIT_EXECUTION;\n}\n"],"mappings":";AAEO,IAAM,eAAe;AACrB,IAAM,aAAa;AACnB,IAAM,iBAAiB;AACvB,IAAM,oBAAoB;AAE1B,IAAM,WAAN,cAAuB,MAAM;AAAA,EAClC;AAAA,EAEA,YAAY,SAAiB,UAAkB;AAC7C,UAAM,OAAO;AACb,SAAK,WAAW;AAAA,EAClB;AACF;AAEO,SAAS,iBAAiB,SAA2B;AAC1D,SAAO,IAAI,SAAS,SAAS,UAAU;AACzC;AAEO,SAAS,wBAAwB,SAA2B;AACjE,SAAO,IAAI,SAAS,SAAS,iBAAiB;AAChD;AAEO,SAAS,WAAW,OAAgB,mBAAmB,gBAA0B;AACtF,MAAI,iBAAiB,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,SAAO,IAAI,SAAS,SAAS,gBAAgB;AAC/C;AAQO,SAAS,mBAAmB,OAA+B;AAChE,SAAO;AAAA,IACL,SAAS;AAAA,IACT,OAAO,MAAM;AAAA,IACb,UAAU,MAAM;AAAA,EAClB;AACF;AAEO,SAAS,gBAAgB,QAAsC;AACpE,MAAI,OAAO,aAAa,MAAM;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,OAAO,aAAa,UAAU;AACvC,WAAO,OAAO;AAAA,EAChB;AACA,SAAO,OAAO,UAAU,eAAe;AACzC;","names":[]}
@@ -0,0 +1,126 @@
1
+ // src/annotate/output.ts
2
+ import { randomUUID } from "crypto";
3
+ import { promises as fs } from "fs";
4
+ import path from "path";
5
+ import os from "os";
6
+ var MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;
7
+ var sanitizeScreenshotLabel = (label) => {
8
+ const safe = label.replace(/[^a-z0-9-_]+/gi, "-").slice(0, 40);
9
+ return safe || "annotation";
10
+ };
11
+ var writeAnnotationScreenshots = async (screenshots) => {
12
+ const results = [];
13
+ for (const screenshot of screenshots) {
14
+ if (!screenshot.base64) continue;
15
+ const buffer = Buffer.from(screenshot.base64, "base64");
16
+ if (buffer.length > MAX_SCREENSHOT_BYTES) {
17
+ continue;
18
+ }
19
+ const safeLabel = sanitizeScreenshotLabel(screenshot.label);
20
+ const fileName = `opendevbrowser-annotate-${safeLabel}-${randomUUID().slice(0, 8)}.png`;
21
+ const filePath = path.join(os.tmpdir(), fileName);
22
+ await fs.writeFile(filePath, buffer);
23
+ results.push({ id: screenshot.id, path: filePath });
24
+ }
25
+ return results;
26
+ };
27
+ var roundNumber = (value) => {
28
+ return Math.round(value).toString();
29
+ };
30
+ var formatRect = (rect) => {
31
+ return `x=${roundNumber(rect.x)}, y=${roundNumber(rect.y)}, w=${roundNumber(rect.width)}, h=${roundNumber(rect.height)}`;
32
+ };
33
+ var truncateText = (value, max) => {
34
+ if (value.length <= max) return value;
35
+ return `${value.slice(0, max)}...`;
36
+ };
37
+ var isSensitiveKey = (key) => {
38
+ const lowered = key.toLowerCase();
39
+ return ["password", "passwd", "token", "secret", "api-key", "apikey", "auth", "session", "csrf", "value"].some((term) => lowered.includes(term));
40
+ };
41
+ var looksSensitive = (value) => {
42
+ const trimmed = value.trim();
43
+ if (trimmed.length < 12) return false;
44
+ if (/[A-Z0-9]{20,}/.test(trimmed)) return true;
45
+ if (/(token|secret|apikey|password)/i.test(trimmed)) return true;
46
+ if (/^[A-Za-z0-9+/_-]{24,}={0,2}$/.test(trimmed)) return true;
47
+ return false;
48
+ };
49
+ var redactAnnotationItem = (item) => {
50
+ const attributes = {};
51
+ for (const [key, value] of Object.entries(item.attributes)) {
52
+ if (isSensitiveKey(key)) {
53
+ continue;
54
+ }
55
+ if (looksSensitive(value)) {
56
+ continue;
57
+ }
58
+ attributes[key] = value;
59
+ }
60
+ const note = item.note && looksSensitive(item.note) ? "[redacted]" : item.note;
61
+ const text = item.text && looksSensitive(item.text) ? "[redacted]" : item.text;
62
+ return {
63
+ ...item,
64
+ attributes,
65
+ note,
66
+ text
67
+ };
68
+ };
69
+ var redactAnnotationPayload = (payload) => {
70
+ const redacted = {
71
+ ...payload,
72
+ annotations: payload.annotations.map((item) => redactAnnotationItem(item))
73
+ };
74
+ return redacted;
75
+ };
76
+ var formatAnnotationMarkdown = (payload, screenshotPaths) => {
77
+ const screenshotIndex = new Map(screenshotPaths.map((entry) => [entry.id, entry.path]));
78
+ const lines = [];
79
+ lines.push("# Annotation Summary");
80
+ lines.push("");
81
+ lines.push(`- URL: ${payload.url}`);
82
+ if (payload.title) {
83
+ lines.push(`- Title: ${payload.title}`);
84
+ }
85
+ lines.push(`- Timestamp: ${payload.timestamp}`);
86
+ lines.push(`- Screenshot mode: ${payload.screenshotMode}`);
87
+ if (payload.context) {
88
+ lines.push(`- Context: ${payload.context}`);
89
+ }
90
+ lines.push("");
91
+ payload.annotations.forEach((annotation, index) => {
92
+ lines.push(`## ${index + 1}. ${annotation.tag}${annotation.idAttr ? `#${annotation.idAttr}` : ""}`);
93
+ if (annotation.note) {
94
+ lines.push(`> ${annotation.note}`);
95
+ }
96
+ lines.push(`- Selector: \`${annotation.selector}\``);
97
+ lines.push(`- Rect: ${formatRect(annotation.rect)}`);
98
+ if (annotation.a11y.role || annotation.a11y.label) {
99
+ lines.push(`- A11y: role=${annotation.a11y.role ?? "n/a"}, label=${annotation.a11y.label ?? "n/a"}`);
100
+ }
101
+ if (annotation.text) {
102
+ lines.push(`- Text: ${truncateText(annotation.text, 160)}`);
103
+ }
104
+ const shot = annotation.screenshotId ? screenshotIndex.get(annotation.screenshotId) : null;
105
+ if (shot) {
106
+ lines.push(`- Screenshot: ${shot}`);
107
+ }
108
+ lines.push("");
109
+ });
110
+ return lines.join("\n");
111
+ };
112
+ var buildAnnotateResult = async (payload) => {
113
+ const redacted = redactAnnotationPayload(payload);
114
+ const screenshots = await writeAnnotationScreenshots(redacted.screenshots ?? []);
115
+ const message = formatAnnotationMarkdown(redacted, screenshots);
116
+ return {
117
+ message,
118
+ details: redacted,
119
+ screenshots
120
+ };
121
+ };
122
+
123
+ export {
124
+ buildAnnotateResult
125
+ };
126
+ //# sourceMappingURL=chunk-IQTJHXZJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/annotate/output.ts"],"sourcesContent":["import { randomUUID } from \"crypto\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\nimport os from \"os\";\nimport type { AnnotationPayload, AnnotationItem, AnnotationScreenshot } from \"../relay/protocol\";\n\nconst MAX_SCREENSHOT_BYTES = 8 * 1024 * 1024;\n\nconst sanitizeScreenshotLabel = (label: string): string => {\n const safe = label.replace(/[^a-z0-9-_]+/gi, \"-\").slice(0, 40);\n return safe || \"annotation\";\n};\n\nconst writeAnnotationScreenshots = async (\n screenshots: AnnotationScreenshot[]\n): Promise<Array<{ id: string; path: string }>> => {\n const results: Array<{ id: string; path: string }> = [];\n for (const screenshot of screenshots) {\n if (!screenshot.base64) continue;\n const buffer = Buffer.from(screenshot.base64, \"base64\");\n if (buffer.length > MAX_SCREENSHOT_BYTES) {\n continue;\n }\n const safeLabel = sanitizeScreenshotLabel(screenshot.label);\n const fileName = `opendevbrowser-annotate-${safeLabel}-${randomUUID().slice(0, 8)}.png`;\n const filePath = path.join(os.tmpdir(), fileName);\n await fs.writeFile(filePath, buffer);\n results.push({ id: screenshot.id, path: filePath });\n }\n return results;\n};\n\nconst roundNumber = (value: number): string => {\n return Math.round(value).toString();\n};\n\nconst formatRect = (rect: AnnotationPayload[\"annotations\"][number][\"rect\"]): string => {\n return `x=${roundNumber(rect.x)}, y=${roundNumber(rect.y)}, w=${roundNumber(rect.width)}, h=${roundNumber(rect.height)}`;\n};\n\nconst truncateText = (value: string, max: number): string => {\n if (value.length <= max) return value;\n return `${value.slice(0, max)}...`;\n};\n\nconst isSensitiveKey = (key: string): boolean => {\n const lowered = key.toLowerCase();\n return [\"password\", \"passwd\", \"token\", \"secret\", \"api-key\", \"apikey\", \"auth\", \"session\", \"csrf\", \"value\"].some((term) => lowered.includes(term));\n};\n\nconst looksSensitive = (value: string): boolean => {\n const trimmed = value.trim();\n if (trimmed.length < 12) return false;\n if (/[A-Z0-9]{20,}/.test(trimmed)) return true;\n if (/(token|secret|apikey|password)/i.test(trimmed)) return true;\n if (/^[A-Za-z0-9+/_-]{24,}={0,2}$/.test(trimmed)) return true;\n return false;\n};\n\nconst redactAnnotationItem = (item: AnnotationItem): AnnotationItem => {\n const attributes: Record<string, string> = {};\n for (const [key, value] of Object.entries(item.attributes)) {\n if (isSensitiveKey(key)) {\n continue;\n }\n if (looksSensitive(value)) {\n continue;\n }\n attributes[key] = value;\n }\n const note = item.note && looksSensitive(item.note) ? \"[redacted]\" : item.note;\n const text = item.text && looksSensitive(item.text) ? \"[redacted]\" : item.text;\n return {\n ...item,\n attributes,\n note,\n text\n };\n};\n\nconst redactAnnotationPayload = (payload: AnnotationPayload): AnnotationPayload => {\n const redacted: AnnotationPayload = {\n ...payload,\n annotations: payload.annotations.map((item) => redactAnnotationItem(item))\n };\n return redacted;\n};\n\nconst formatAnnotationMarkdown = (\n payload: AnnotationPayload,\n screenshotPaths: Array<{ id: string; path: string }>\n): string => {\n const screenshotIndex = new Map(screenshotPaths.map((entry) => [entry.id, entry.path]));\n\n const lines: string[] = [];\n lines.push(\"# Annotation Summary\");\n lines.push(\"\");\n lines.push(`- URL: ${payload.url}`);\n if (payload.title) {\n lines.push(`- Title: ${payload.title}`);\n }\n lines.push(`- Timestamp: ${payload.timestamp}`);\n lines.push(`- Screenshot mode: ${payload.screenshotMode}`);\n if (payload.context) {\n lines.push(`- Context: ${payload.context}`);\n }\n lines.push(\"\");\n\n payload.annotations.forEach((annotation, index) => {\n lines.push(`## ${index + 1}. ${annotation.tag}${annotation.idAttr ? `#${annotation.idAttr}` : \"\"}`);\n if (annotation.note) {\n lines.push(`> ${annotation.note}`);\n }\n lines.push(`- Selector: \\`${annotation.selector}\\``);\n lines.push(`- Rect: ${formatRect(annotation.rect)}`);\n if (annotation.a11y.role || annotation.a11y.label) {\n lines.push(`- A11y: role=${annotation.a11y.role ?? \"n/a\"}, label=${annotation.a11y.label ?? \"n/a\"}`);\n }\n if (annotation.text) {\n lines.push(`- Text: ${truncateText(annotation.text, 160)}`);\n }\n const shot = annotation.screenshotId ? screenshotIndex.get(annotation.screenshotId) : null;\n if (shot) {\n lines.push(`- Screenshot: ${shot}`);\n }\n lines.push(\"\");\n });\n\n return lines.join(\"\\n\");\n};\n\nexport const buildAnnotateResult = async (\n payload: AnnotationPayload\n): Promise<{ message: string; details: AnnotationPayload; screenshots: Array<{ id: string; path: string }> }> => {\n const redacted = redactAnnotationPayload(payload);\n const screenshots = await writeAnnotationScreenshots(redacted.screenshots ?? []);\n const message = formatAnnotationMarkdown(redacted, screenshots);\n return {\n message,\n details: redacted,\n screenshots\n };\n};\n"],"mappings":";AAAA,SAAS,kBAAkB;AAC3B,SAAS,YAAY,UAAU;AAC/B,OAAO,UAAU;AACjB,OAAO,QAAQ;AAGf,IAAM,uBAAuB,IAAI,OAAO;AAExC,IAAM,0BAA0B,CAAC,UAA0B;AACzD,QAAM,OAAO,MAAM,QAAQ,kBAAkB,GAAG,EAAE,MAAM,GAAG,EAAE;AAC7D,SAAO,QAAQ;AACjB;AAEA,IAAM,6BAA6B,OACjC,gBACiD;AACjD,QAAM,UAA+C,CAAC;AACtD,aAAW,cAAc,aAAa;AACpC,QAAI,CAAC,WAAW,OAAQ;AACxB,UAAM,SAAS,OAAO,KAAK,WAAW,QAAQ,QAAQ;AACtD,QAAI,OAAO,SAAS,sBAAsB;AACxC;AAAA,IACF;AACA,UAAM,YAAY,wBAAwB,WAAW,KAAK;AAC1D,UAAM,WAAW,2BAA2B,SAAS,IAAI,WAAW,EAAE,MAAM,GAAG,CAAC,CAAC;AACjF,UAAM,WAAW,KAAK,KAAK,GAAG,OAAO,GAAG,QAAQ;AAChD,UAAM,GAAG,UAAU,UAAU,MAAM;AACnC,YAAQ,KAAK,EAAE,IAAI,WAAW,IAAI,MAAM,SAAS,CAAC;AAAA,EACpD;AACA,SAAO;AACT;AAEA,IAAM,cAAc,CAAC,UAA0B;AAC7C,SAAO,KAAK,MAAM,KAAK,EAAE,SAAS;AACpC;AAEA,IAAM,aAAa,CAAC,SAAmE;AACrF,SAAO,KAAK,YAAY,KAAK,CAAC,CAAC,OAAO,YAAY,KAAK,CAAC,CAAC,OAAO,YAAY,KAAK,KAAK,CAAC,OAAO,YAAY,KAAK,MAAM,CAAC;AACxH;AAEA,IAAM,eAAe,CAAC,OAAe,QAAwB;AAC3D,MAAI,MAAM,UAAU,IAAK,QAAO;AAChC,SAAO,GAAG,MAAM,MAAM,GAAG,GAAG,CAAC;AAC/B;AAEA,IAAM,iBAAiB,CAAC,QAAyB;AAC/C,QAAM,UAAU,IAAI,YAAY;AAChC,SAAO,CAAC,YAAY,UAAU,SAAS,UAAU,WAAW,UAAU,QAAQ,WAAW,QAAQ,OAAO,EAAE,KAAK,CAAC,SAAS,QAAQ,SAAS,IAAI,CAAC;AACjJ;AAEA,IAAM,iBAAiB,CAAC,UAA2B;AACjD,QAAM,UAAU,MAAM,KAAK;AAC3B,MAAI,QAAQ,SAAS,GAAI,QAAO;AAChC,MAAI,gBAAgB,KAAK,OAAO,EAAG,QAAO;AAC1C,MAAI,kCAAkC,KAAK,OAAO,EAAG,QAAO;AAC5D,MAAI,+BAA+B,KAAK,OAAO,EAAG,QAAO;AACzD,SAAO;AACT;AAEA,IAAM,uBAAuB,CAAC,SAAyC;AACrE,QAAM,aAAqC,CAAC;AAC5C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,UAAU,GAAG;AAC1D,QAAI,eAAe,GAAG,GAAG;AACvB;AAAA,IACF;AACA,QAAI,eAAe,KAAK,GAAG;AACzB;AAAA,IACF;AACA,eAAW,GAAG,IAAI;AAAA,EACpB;AACA,QAAM,OAAO,KAAK,QAAQ,eAAe,KAAK,IAAI,IAAI,eAAe,KAAK;AAC1E,QAAM,OAAO,KAAK,QAAQ,eAAe,KAAK,IAAI,IAAI,eAAe,KAAK;AAC1E,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,IAAM,0BAA0B,CAAC,YAAkD;AACjF,QAAM,WAA8B;AAAA,IAClC,GAAG;AAAA,IACH,aAAa,QAAQ,YAAY,IAAI,CAAC,SAAS,qBAAqB,IAAI,CAAC;AAAA,EAC3E;AACA,SAAO;AACT;AAEA,IAAM,2BAA2B,CAC/B,SACA,oBACW;AACX,QAAM,kBAAkB,IAAI,IAAI,gBAAgB,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,MAAM,IAAI,CAAC,CAAC;AAEtF,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAK,sBAAsB;AACjC,QAAM,KAAK,EAAE;AACb,QAAM,KAAK,UAAU,QAAQ,GAAG,EAAE;AAClC,MAAI,QAAQ,OAAO;AACjB,UAAM,KAAK,YAAY,QAAQ,KAAK,EAAE;AAAA,EACxC;AACA,QAAM,KAAK,gBAAgB,QAAQ,SAAS,EAAE;AAC9C,QAAM,KAAK,sBAAsB,QAAQ,cAAc,EAAE;AACzD,MAAI,QAAQ,SAAS;AACnB,UAAM,KAAK,cAAc,QAAQ,OAAO,EAAE;AAAA,EAC5C;AACA,QAAM,KAAK,EAAE;AAEb,UAAQ,YAAY,QAAQ,CAAC,YAAY,UAAU;AACjD,UAAM,KAAK,MAAM,QAAQ,CAAC,KAAK,WAAW,GAAG,GAAG,WAAW,SAAS,IAAI,WAAW,MAAM,KAAK,EAAE,EAAE;AAClG,QAAI,WAAW,MAAM;AACnB,YAAM,KAAK,KAAK,WAAW,IAAI,EAAE;AAAA,IACnC;AACA,UAAM,KAAK,iBAAiB,WAAW,QAAQ,IAAI;AACnD,UAAM,KAAK,WAAW,WAAW,WAAW,IAAI,CAAC,EAAE;AACnD,QAAI,WAAW,KAAK,QAAQ,WAAW,KAAK,OAAO;AACjD,YAAM,KAAK,gBAAgB,WAAW,KAAK,QAAQ,KAAK,WAAW,WAAW,KAAK,SAAS,KAAK,EAAE;AAAA,IACrG;AACA,QAAI,WAAW,MAAM;AACnB,YAAM,KAAK,WAAW,aAAa,WAAW,MAAM,GAAG,CAAC,EAAE;AAAA,IAC5D;AACA,UAAM,OAAO,WAAW,eAAe,gBAAgB,IAAI,WAAW,YAAY,IAAI;AACtF,QAAI,MAAM;AACR,YAAM,KAAK,iBAAiB,IAAI,EAAE;AAAA,IACpC;AACA,UAAM,KAAK,EAAE;AAAA,EACf,CAAC;AAED,SAAO,MAAM,KAAK,IAAI;AACxB;AAEO,IAAM,sBAAsB,OACjC,YAC+G;AAC/G,QAAM,WAAW,wBAAwB,OAAO;AAChD,QAAM,cAAc,MAAM,2BAA2B,SAAS,eAAe,CAAC,CAAC;AAC/E,QAAM,UAAU,yBAAyB,UAAU,WAAW;AAC9D,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,IACT;AAAA,EACF;AACF;","names":[]}