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 @@
1
+ {"version":3,"sources":["../src/cli/commands/uninstall.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport {\n getGlobalConfigPath,\n getLocalConfigPath,\n readConfig,\n hasPlugin,\n removePluginFromContent\n} from \"../utils/config\";\nimport type { InstallMode } from \"../args\";\nimport { hasBundledSkillArtifacts, hasManagedBundledSkillInstall } from \"../installers/skills\";\n\nexport interface UninstallResult {\n success: boolean;\n message: string;\n configPath?: string;\n removed: boolean;\n configFileDeleted: boolean;\n}\n\nexport function hasInstalledConfig(mode: InstallMode): boolean {\n const configPath = mode === \"global\" ? getGlobalConfigPath() : getLocalConfigPath();\n\n try {\n const { config } = readConfig(configPath);\n return hasPlugin(config);\n } catch {\n return false;\n }\n}\n\nfunction getPluginConfigPath(mode: InstallMode): 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\nfunction removePluginConfigFile(mode: InstallMode): boolean {\n const configPath = getPluginConfigPath(mode);\n if (fs.existsSync(configPath)) {\n fs.unlinkSync(configPath);\n return true;\n }\n return false;\n}\n\nexport function runUninstall(\n mode: InstallMode,\n deleteConfigFile: boolean = false\n): UninstallResult {\n const configPath = mode === \"global\" ? getGlobalConfigPath() : getLocalConfigPath();\n\n try {\n const { content, config } = readConfig(configPath);\n\n if (!hasPlugin(config)) {\n return {\n success: true,\n message: `No plugin config found in ${configPath}`,\n configPath,\n removed: false,\n configFileDeleted: false\n };\n }\n\n const newContent = removePluginFromContent(content, \"opendevbrowser\");\n\n fs.writeFileSync(configPath, newContent, \"utf-8\");\n\n let configFileDeleted = false;\n if (deleteConfigFile) {\n configFileDeleted = removePluginConfigFile(mode);\n }\n\n return {\n success: true,\n message: `Removed opendevbrowser from ${configPath}`,\n configPath,\n removed: true,\n configFileDeleted\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to uninstall: ${message}`,\n configPath,\n removed: false,\n configFileDeleted: false\n };\n }\n}\n\nexport function findInstalledConfigs(): { global: boolean; local: boolean } {\n return {\n global: hasInstalledConfig(\"global\")\n || hasManagedBundledSkillInstall(\"global\")\n || hasBundledSkillArtifacts(\"global\"),\n local: hasInstalledConfig(\"local\")\n || hasManagedBundledSkillInstall(\"local\")\n || hasBundledSkillArtifacts(\"local\")\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;AAmBb,SAAS,mBAAmB,MAA4B;AAC7D,QAAM,aAAa,SAAS,WAAW,oBAAoB,IAAI,mBAAmB;AAElF,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,WAAW,UAAU;AACxC,WAAO,UAAU,MAAM;AAAA,EACzB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,oBAAoB,MAA2B;AACtD,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;AAEA,SAAS,uBAAuB,MAA4B;AAC1D,QAAM,aAAa,oBAAoB,IAAI;AAC3C,MAAO,cAAW,UAAU,GAAG;AAC7B,IAAG,cAAW,UAAU;AACxB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,aACd,MACA,mBAA4B,OACX;AACjB,QAAM,aAAa,SAAS,WAAW,oBAAoB,IAAI,mBAAmB;AAElF,MAAI;AACF,UAAM,EAAE,SAAS,OAAO,IAAI,WAAW,UAAU;AAEjD,QAAI,CAAC,UAAU,MAAM,GAAG;AACtB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,SAAS,6BAA6B,UAAU;AAAA,QAChD;AAAA,QACA,SAAS;AAAA,QACT,mBAAmB;AAAA,MACrB;AAAA,IACF;AAEA,UAAM,aAAa,wBAAwB,SAAS,gBAAgB;AAEpE,IAAG,iBAAc,YAAY,YAAY,OAAO;AAEhD,QAAI,oBAAoB;AACxB,QAAI,kBAAkB;AACpB,0BAAoB,uBAAuB,IAAI;AAAA,IACjD;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,+BAA+B,UAAU;AAAA,MAClD;AAAA,MACA,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,SAAS,wBAAwB,OAAO;AAAA,MACxC;AAAA,MACA,SAAS;AAAA,MACT,mBAAmB;AAAA,IACrB;AAAA,EACF;AACF;AAEO,SAAS,uBAA4D;AAC1E,SAAO;AAAA,IACL,QAAQ,mBAAmB,QAAQ,KAC9B,8BAA8B,QAAQ,KACtC,yBAAyB,QAAQ;AAAA,IACtC,OAAO,mBAAmB,OAAO,KAC5B,8BAA8B,OAAO,KACrC,yBAAyB,OAAO;AAAA,EACvC;AACF;","names":[]}
@@ -0,0 +1,305 @@
1
+ // src/cli/commands/update.ts
2
+ import * as fs from "fs";
3
+ import * as path from "path";
4
+ import * as os from "os";
5
+ import { randomUUID } from "crypto";
6
+ var PLUGIN_NAME = "opendevbrowser";
7
+ var CACHE_MANIFEST = "package.json";
8
+ var CACHE_LOCKFILE = "package-lock.json";
9
+ var CACHE_UPDATE_LOCK = ".opendevbrowser-update.lock";
10
+ var CACHE_LOCK_STALE_MS = 30 * 60 * 1e3;
11
+ var DEPENDENCY_SECTIONS = [
12
+ "dependencies",
13
+ "devDependencies",
14
+ "optionalDependencies",
15
+ "peerDependencies"
16
+ ];
17
+ function getCacheDir() {
18
+ return process.env.OPENCODE_CACHE_DIR || path.join(os.homedir(), ".cache", "opencode");
19
+ }
20
+ function assertCacheChild(targetPath, cacheDir) {
21
+ const resolvedCache = path.resolve(cacheDir);
22
+ const resolvedPath = path.resolve(targetPath);
23
+ const relativePath = path.relative(resolvedCache, resolvedPath);
24
+ if (!relativePath || relativePath.startsWith("..") || path.isAbsolute(relativePath)) {
25
+ throw new Error(`Security: refusing to modify path outside cache directory: ${targetPath}`);
26
+ }
27
+ }
28
+ function isMissingPathError(error) {
29
+ return error instanceof Error && "code" in error && error.code === "ENOENT";
30
+ }
31
+ function isExistingPathError(error) {
32
+ return error instanceof Error && "code" in error && error.code === "EEXIST";
33
+ }
34
+ function assertNoSymlinkCachePath(targetPath, cacheDir) {
35
+ assertCacheChild(targetPath, cacheDir);
36
+ const resolvedCache = path.resolve(cacheDir);
37
+ const relativeSegments = path.relative(resolvedCache, path.resolve(targetPath)).split(path.sep).filter(Boolean);
38
+ for (const candidate of [resolvedCache, ...relativeSegments.map((_, index) => path.join(resolvedCache, ...relativeSegments.slice(0, index + 1)))]) {
39
+ try {
40
+ if (fs.lstatSync(candidate).isSymbolicLink()) {
41
+ throw new Error(`Security: refusing to modify symlinked cache path: ${candidate}`);
42
+ }
43
+ } catch (error) {
44
+ if (isMissingPathError(error)) {
45
+ continue;
46
+ }
47
+ throw error;
48
+ }
49
+ }
50
+ }
51
+ function cacheDirectoryExists(cacheDir) {
52
+ try {
53
+ const stat = fs.lstatSync(cacheDir);
54
+ if (stat.isSymbolicLink()) {
55
+ throw new Error(`Security: refusing to modify symlinked cache path: ${cacheDir}`);
56
+ }
57
+ if (!stat.isDirectory()) {
58
+ throw new Error(`${cacheDir} must be a directory`);
59
+ }
60
+ return true;
61
+ } catch (error) {
62
+ if (isMissingPathError(error)) {
63
+ return false;
64
+ }
65
+ throw error;
66
+ }
67
+ }
68
+ function removePathIfExists(targetPath, cacheDir) {
69
+ assertNoSymlinkCachePath(targetPath, cacheDir);
70
+ if (!fs.existsSync(targetPath)) {
71
+ return false;
72
+ }
73
+ fs.rmSync(targetPath, { recursive: true, force: true });
74
+ return true;
75
+ }
76
+ function cacheFileExists(targetPath, cacheDir) {
77
+ assertNoSymlinkCachePath(targetPath, cacheDir);
78
+ try {
79
+ const stat = fs.lstatSync(targetPath);
80
+ if (stat.isSymbolicLink()) {
81
+ throw new Error(`Security: refusing to modify symlinked cache manifest: ${targetPath}`);
82
+ }
83
+ return stat.isFile();
84
+ } catch (error) {
85
+ if (isMissingPathError(error)) {
86
+ return false;
87
+ }
88
+ throw error;
89
+ }
90
+ }
91
+ function writeManifestAtomic(manifestPath, cacheDir, manifest) {
92
+ const tempPath = `${manifestPath}.${process.pid}.tmp`;
93
+ assertNoSymlinkCachePath(tempPath, cacheDir);
94
+ let fd = null;
95
+ try {
96
+ fd = fs.openSync(tempPath, "wx");
97
+ fs.writeFileSync(fd, `${JSON.stringify(manifest, null, 2)}
98
+ `, "utf8");
99
+ fs.closeSync(fd);
100
+ fd = null;
101
+ fs.renameSync(tempPath, manifestPath);
102
+ } catch (error) {
103
+ if (fd !== null) {
104
+ fs.closeSync(fd);
105
+ }
106
+ fs.rmSync(tempPath, { force: true });
107
+ throw error;
108
+ }
109
+ }
110
+ function withCacheMutationLock(cacheDir, action) {
111
+ const lockPath = path.join(cacheDir, CACHE_UPDATE_LOCK);
112
+ assertNoSymlinkCachePath(lockPath, cacheDir);
113
+ let lock = null;
114
+ try {
115
+ lock = openCacheMutationLock(lockPath);
116
+ return action();
117
+ } catch (error) {
118
+ if (isExistingPathError(error)) {
119
+ throw new Error("another update is already running for this OpenCode cache");
120
+ }
121
+ throw error;
122
+ } finally {
123
+ if (lock !== null) {
124
+ fs.closeSync(lock.fd);
125
+ removeOwnedCacheMutationLock(lockPath, lock.token);
126
+ }
127
+ }
128
+ }
129
+ function openCacheMutationLock(lockPath) {
130
+ try {
131
+ return writeCacheMutationLock(lockPath);
132
+ } catch (error) {
133
+ if (!isExistingPathError(error) || !isStaleCacheMutationLock(lockPath)) {
134
+ throw error;
135
+ }
136
+ removeStaleCacheMutationLock(lockPath);
137
+ return writeCacheMutationLock(lockPath);
138
+ }
139
+ }
140
+ function writeCacheMutationLock(lockPath) {
141
+ const fd = fs.openSync(lockPath, "wx");
142
+ const token = randomUUID();
143
+ try {
144
+ const lock = { pid: process.pid, createdAt: Date.now(), token };
145
+ fs.writeFileSync(fd, `${JSON.stringify(lock)}
146
+ `, "utf8");
147
+ return { fd, token };
148
+ } catch (error) {
149
+ fs.closeSync(fd);
150
+ fs.rmSync(lockPath, { force: true });
151
+ throw error;
152
+ }
153
+ }
154
+ function isStaleCacheMutationLock(lockPath) {
155
+ const lock = readCacheMutationLock(lockPath);
156
+ if (!lock) {
157
+ return isLegacyCacheMutationLockStale(lockPath);
158
+ }
159
+ if (Date.now() - lock.createdAt < CACHE_LOCK_STALE_MS) {
160
+ return false;
161
+ }
162
+ return !isProcessRunning(lock.pid);
163
+ }
164
+ function isLegacyCacheMutationLockStale(lockPath) {
165
+ try {
166
+ const pid = readLegacyCacheMutationLockPid(lockPath);
167
+ if (pid !== null && isProcessRunning(pid)) {
168
+ return false;
169
+ }
170
+ return Date.now() - fs.statSync(lockPath).mtimeMs >= CACHE_LOCK_STALE_MS;
171
+ } catch {
172
+ return false;
173
+ }
174
+ }
175
+ function readLegacyCacheMutationLockPid(lockPath) {
176
+ const raw = fs.readFileSync(lockPath, "utf8").trim();
177
+ if (!/^\d+$/.test(raw)) {
178
+ return null;
179
+ }
180
+ const pid = Number(raw);
181
+ return Number.isSafeInteger(pid) && pid > 0 ? pid : null;
182
+ }
183
+ function readCacheMutationLock(lockPath) {
184
+ try {
185
+ const parsed = JSON.parse(fs.readFileSync(lockPath, "utf8"));
186
+ const { pid, createdAt, token } = parsed;
187
+ const hasToken = token === void 0 || typeof token === "string" && token.length > 0;
188
+ if (typeof pid === "number" && typeof createdAt === "number" && hasToken && Number.isInteger(pid) && Number.isFinite(createdAt)) {
189
+ return token === void 0 ? { pid, createdAt } : { pid, createdAt, token };
190
+ }
191
+ } catch {
192
+ return null;
193
+ }
194
+ return null;
195
+ }
196
+ function isProcessRunning(pid) {
197
+ try {
198
+ process.kill(pid, 0);
199
+ return true;
200
+ } catch (error) {
201
+ return error instanceof Error && "code" in error && error.code === "EPERM";
202
+ }
203
+ }
204
+ function createExistingLockError() {
205
+ const error = new Error("cache update lock changed before stale cleanup");
206
+ error.code = "EEXIST";
207
+ return error;
208
+ }
209
+ function removeStaleCacheMutationLock(lockPath) {
210
+ const content = fs.readFileSync(lockPath, "utf8");
211
+ if (!isStaleCacheMutationLock(lockPath) || fs.readFileSync(lockPath, "utf8") !== content) {
212
+ throw createExistingLockError();
213
+ }
214
+ fs.rmSync(lockPath, { force: true });
215
+ }
216
+ function removeOwnedCacheMutationLock(lockPath, token) {
217
+ const lock = readCacheMutationLock(lockPath);
218
+ if (lock?.token === token) {
219
+ fs.rmSync(lockPath, { force: true });
220
+ }
221
+ }
222
+ function preflightCacheMutationPaths(cacheDir, paths) {
223
+ for (const targetPath of paths) {
224
+ assertNoSymlinkCachePath(targetPath, cacheDir);
225
+ }
226
+ }
227
+ function isJsonObject(value) {
228
+ return value !== null && typeof value === "object" && !Array.isArray(value);
229
+ }
230
+ function removeDependencyPin(manifest, section) {
231
+ const dependencies = manifest[section];
232
+ if (!isJsonObject(dependencies) || !(PLUGIN_NAME in dependencies)) {
233
+ return false;
234
+ }
235
+ delete dependencies[PLUGIN_NAME];
236
+ if (Object.keys(dependencies).length === 0) {
237
+ delete manifest[section];
238
+ }
239
+ return true;
240
+ }
241
+ function removeManifestPin(cacheDir) {
242
+ const manifestPath = path.join(cacheDir, CACHE_MANIFEST);
243
+ if (!cacheFileExists(manifestPath, cacheDir)) {
244
+ return false;
245
+ }
246
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, "utf8"));
247
+ if (!isJsonObject(manifest)) {
248
+ throw new Error(`${CACHE_MANIFEST} must contain a JSON object`);
249
+ }
250
+ const removed = DEPENDENCY_SECTIONS.map((section) => removeDependencyPin(manifest, section)).some(Boolean);
251
+ if (removed) {
252
+ writeManifestAtomic(manifestPath, cacheDir, manifest);
253
+ }
254
+ return removed;
255
+ }
256
+ function runUpdate() {
257
+ const cacheDir = getCacheDir();
258
+ const nodeModulesDir = path.join(cacheDir, "node_modules");
259
+ const pluginCacheDir = path.join(nodeModulesDir, PLUGIN_NAME);
260
+ const lockfilePath = path.join(cacheDir, CACHE_LOCKFILE);
261
+ try {
262
+ if (!cacheDirectoryExists(cacheDir)) {
263
+ return {
264
+ success: true,
265
+ message: "No cached plugin found. OpenCode will install the latest version on next run.",
266
+ cleared: false
267
+ };
268
+ }
269
+ preflightCacheMutationPaths(cacheDir, [
270
+ path.join(cacheDir, CACHE_MANIFEST),
271
+ pluginCacheDir,
272
+ lockfilePath,
273
+ path.join(cacheDir, CACHE_UPDATE_LOCK)
274
+ ]);
275
+ const cleared = withCacheMutationLock(cacheDir, () => {
276
+ const manifestPinRemoved = removeManifestPin(cacheDir);
277
+ const packageRemoved = removePathIfExists(pluginCacheDir, cacheDir);
278
+ const lockfileRemoved = removePathIfExists(lockfilePath, cacheDir);
279
+ return packageRemoved || manifestPinRemoved || lockfileRemoved;
280
+ });
281
+ if (!cleared) {
282
+ return {
283
+ success: true,
284
+ message: "No cached plugin found. OpenCode will install the latest version on next run.",
285
+ cleared: false
286
+ };
287
+ }
288
+ return {
289
+ success: true,
290
+ message: "Cache repaired. OpenCode will install the latest version on next run.",
291
+ cleared: true
292
+ };
293
+ } catch (error) {
294
+ const message = error instanceof Error ? error.message : String(error);
295
+ return {
296
+ success: false,
297
+ message: `Failed to clear cache: ${message}`,
298
+ cleared: false
299
+ };
300
+ }
301
+ }
302
+ export {
303
+ runUpdate
304
+ };
305
+ //# sourceMappingURL=update-SMXPYGXS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/update.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { randomUUID } from \"crypto\";\n\nconst PLUGIN_NAME = \"opendevbrowser\";\nconst CACHE_MANIFEST = \"package.json\";\nconst CACHE_LOCKFILE = \"package-lock.json\";\nconst CACHE_UPDATE_LOCK = \".opendevbrowser-update.lock\";\nconst CACHE_LOCK_STALE_MS = 30 * 60 * 1000;\nconst DEPENDENCY_SECTIONS = [\n \"dependencies\",\n \"devDependencies\",\n \"optionalDependencies\",\n \"peerDependencies\"\n] as const;\n\ntype DependencySection = typeof DEPENDENCY_SECTIONS[number];\ntype JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };\ntype JsonObject = { [key: string]: JsonValue };\ntype CacheMutationLock = {\n pid: number;\n createdAt: number;\n token?: string;\n};\ntype HeldCacheMutationLock = {\n fd: number;\n token: string;\n};\n\nexport interface UpdateResult {\n success: boolean;\n message: string;\n cleared: boolean;\n}\n\nfunction getCacheDir(): string {\n return process.env.OPENCODE_CACHE_DIR\n || path.join(os.homedir(), \".cache\", \"opencode\");\n}\n\nfunction assertCacheChild(targetPath: string, cacheDir: string): void {\n const resolvedCache = path.resolve(cacheDir);\n const resolvedPath = path.resolve(targetPath);\n const relativePath = path.relative(resolvedCache, resolvedPath);\n\n if (!relativePath || relativePath.startsWith(\"..\") || path.isAbsolute(relativePath)) {\n throw new Error(`Security: refusing to modify path outside cache directory: ${targetPath}`);\n }\n}\n\nfunction isMissingPathError(error: unknown): boolean {\n return error instanceof Error && \"code\" in error && error.code === \"ENOENT\";\n}\n\nfunction isExistingPathError(error: unknown): boolean {\n return error instanceof Error && \"code\" in error && error.code === \"EEXIST\";\n}\n\nfunction assertNoSymlinkCachePath(targetPath: string, cacheDir: string): void {\n assertCacheChild(targetPath, cacheDir);\n const resolvedCache = path.resolve(cacheDir);\n const relativeSegments = path.relative(resolvedCache, path.resolve(targetPath)).split(path.sep).filter(Boolean);\n for (const candidate of [resolvedCache, ...relativeSegments.map((_, index) => path.join(resolvedCache, ...relativeSegments.slice(0, index + 1)))]) {\n try {\n if (fs.lstatSync(candidate).isSymbolicLink()) {\n throw new Error(`Security: refusing to modify symlinked cache path: ${candidate}`);\n }\n } catch (error) {\n if (isMissingPathError(error)) {\n continue;\n }\n throw error;\n }\n }\n}\n\nfunction cacheDirectoryExists(cacheDir: string): boolean {\n try {\n const stat = fs.lstatSync(cacheDir);\n if (stat.isSymbolicLink()) {\n throw new Error(`Security: refusing to modify symlinked cache path: ${cacheDir}`);\n }\n if (!stat.isDirectory()) {\n throw new Error(`${cacheDir} must be a directory`);\n }\n return true;\n } catch (error) {\n if (isMissingPathError(error)) {\n return false;\n }\n throw error;\n }\n}\n\nfunction removePathIfExists(targetPath: string, cacheDir: string): boolean {\n assertNoSymlinkCachePath(targetPath, cacheDir);\n if (!fs.existsSync(targetPath)) {\n return false;\n }\n\n fs.rmSync(targetPath, { recursive: true, force: true });\n return true;\n}\n\nfunction cacheFileExists(targetPath: string, cacheDir: string): boolean {\n assertNoSymlinkCachePath(targetPath, cacheDir);\n try {\n const stat = fs.lstatSync(targetPath);\n if (stat.isSymbolicLink()) {\n throw new Error(`Security: refusing to modify symlinked cache manifest: ${targetPath}`);\n }\n return stat.isFile();\n } catch (error) {\n if (isMissingPathError(error)) {\n return false;\n }\n throw error;\n }\n}\n\nfunction writeManifestAtomic(manifestPath: string, cacheDir: string, manifest: JsonObject): void {\n const tempPath = `${manifestPath}.${process.pid}.tmp`;\n assertNoSymlinkCachePath(tempPath, cacheDir);\n let fd: number | null = null;\n try {\n fd = fs.openSync(tempPath, \"wx\");\n fs.writeFileSync(fd, `${JSON.stringify(manifest, null, 2)}\\n`, \"utf8\");\n fs.closeSync(fd);\n fd = null;\n fs.renameSync(tempPath, manifestPath);\n } catch (error) {\n if (fd !== null) {\n fs.closeSync(fd);\n }\n fs.rmSync(tempPath, { force: true });\n throw error;\n }\n}\n\nfunction withCacheMutationLock<T>(cacheDir: string, action: () => T): T {\n const lockPath = path.join(cacheDir, CACHE_UPDATE_LOCK);\n assertNoSymlinkCachePath(lockPath, cacheDir);\n let lock: HeldCacheMutationLock | null = null;\n try {\n lock = openCacheMutationLock(lockPath);\n return action();\n } catch (error) {\n if (isExistingPathError(error)) {\n throw new Error(\"another update is already running for this OpenCode cache\");\n }\n throw error;\n } finally {\n if (lock !== null) {\n fs.closeSync(lock.fd);\n removeOwnedCacheMutationLock(lockPath, lock.token);\n }\n }\n}\n\nfunction openCacheMutationLock(lockPath: string): HeldCacheMutationLock {\n try {\n return writeCacheMutationLock(lockPath);\n } catch (error) {\n if (!isExistingPathError(error) || !isStaleCacheMutationLock(lockPath)) {\n throw error;\n }\n removeStaleCacheMutationLock(lockPath);\n return writeCacheMutationLock(lockPath);\n }\n}\n\nfunction writeCacheMutationLock(lockPath: string): HeldCacheMutationLock {\n const fd = fs.openSync(lockPath, \"wx\");\n const token = randomUUID();\n try {\n const lock: CacheMutationLock = { pid: process.pid, createdAt: Date.now(), token };\n fs.writeFileSync(fd, `${JSON.stringify(lock)}\\n`, \"utf8\");\n return { fd, token };\n } catch (error) {\n fs.closeSync(fd);\n fs.rmSync(lockPath, { force: true });\n throw error;\n }\n}\n\nfunction isStaleCacheMutationLock(lockPath: string): boolean {\n const lock = readCacheMutationLock(lockPath);\n if (!lock) {\n return isLegacyCacheMutationLockStale(lockPath);\n }\n if (Date.now() - lock.createdAt < CACHE_LOCK_STALE_MS) {\n return false;\n }\n return !isProcessRunning(lock.pid);\n}\n\nfunction isLegacyCacheMutationLockStale(lockPath: string): boolean {\n try {\n const pid = readLegacyCacheMutationLockPid(lockPath);\n if (pid !== null && isProcessRunning(pid)) {\n return false;\n }\n return Date.now() - fs.statSync(lockPath).mtimeMs >= CACHE_LOCK_STALE_MS;\n } catch {\n return false;\n }\n}\n\nfunction readLegacyCacheMutationLockPid(lockPath: string): number | null {\n const raw = fs.readFileSync(lockPath, \"utf8\").trim();\n if (!/^\\d+$/.test(raw)) {\n return null;\n }\n const pid = Number(raw);\n return Number.isSafeInteger(pid) && pid > 0 ? pid : null;\n}\n\nfunction readCacheMutationLock(lockPath: string): CacheMutationLock | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(lockPath, \"utf8\")) as Partial<CacheMutationLock>;\n const { pid, createdAt, token } = parsed;\n const hasToken = token === undefined || (typeof token === \"string\" && token.length > 0);\n if (typeof pid === \"number\" && typeof createdAt === \"number\" && hasToken\n && Number.isInteger(pid) && Number.isFinite(createdAt)) {\n return token === undefined ? { pid, createdAt } : { pid, createdAt, token };\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction isProcessRunning(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return error instanceof Error && \"code\" in error && error.code === \"EPERM\";\n }\n}\n\nfunction createExistingLockError(): NodeJS.ErrnoException {\n const error = new Error(\"cache update lock changed before stale cleanup\") as NodeJS.ErrnoException;\n error.code = \"EEXIST\";\n return error;\n}\n\nfunction removeStaleCacheMutationLock(lockPath: string): void {\n const content = fs.readFileSync(lockPath, \"utf8\");\n if (!isStaleCacheMutationLock(lockPath) || fs.readFileSync(lockPath, \"utf8\") !== content) {\n throw createExistingLockError();\n }\n fs.rmSync(lockPath, { force: true });\n}\n\nfunction removeOwnedCacheMutationLock(lockPath: string, token: string): void {\n const lock = readCacheMutationLock(lockPath);\n if (lock?.token === token) {\n fs.rmSync(lockPath, { force: true });\n }\n}\n\nfunction preflightCacheMutationPaths(cacheDir: string, paths: readonly string[]): void {\n for (const targetPath of paths) {\n assertNoSymlinkCachePath(targetPath, cacheDir);\n }\n}\n\nfunction isJsonObject(value: JsonValue | undefined): value is JsonObject {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction removeDependencyPin(manifest: JsonObject, section: DependencySection): boolean {\n const dependencies = manifest[section];\n if (!isJsonObject(dependencies) || !(PLUGIN_NAME in dependencies)) {\n return false;\n }\n\n delete dependencies[PLUGIN_NAME];\n if (Object.keys(dependencies).length === 0) {\n delete manifest[section];\n }\n return true;\n}\n\nfunction removeManifestPin(cacheDir: string): boolean {\n const manifestPath = path.join(cacheDir, CACHE_MANIFEST);\n if (!cacheFileExists(manifestPath, cacheDir)) {\n return false;\n }\n\n const manifest = JSON.parse(fs.readFileSync(manifestPath, \"utf8\")) as JsonValue;\n if (!isJsonObject(manifest)) {\n throw new Error(`${CACHE_MANIFEST} must contain a JSON object`);\n }\n\n const removed = DEPENDENCY_SECTIONS\n .map((section) => removeDependencyPin(manifest, section))\n .some(Boolean);\n if (removed) {\n writeManifestAtomic(manifestPath, cacheDir, manifest);\n }\n return removed;\n}\n\nexport function runUpdate(): UpdateResult {\n const cacheDir = getCacheDir();\n const nodeModulesDir = path.join(cacheDir, \"node_modules\");\n const pluginCacheDir = path.join(nodeModulesDir, PLUGIN_NAME);\n const lockfilePath = path.join(cacheDir, CACHE_LOCKFILE);\n\n try {\n if (!cacheDirectoryExists(cacheDir)) {\n return {\n success: true,\n message: \"No cached plugin found. OpenCode will install the latest version on next run.\",\n cleared: false\n };\n }\n\n preflightCacheMutationPaths(cacheDir, [\n path.join(cacheDir, CACHE_MANIFEST),\n pluginCacheDir,\n lockfilePath,\n path.join(cacheDir, CACHE_UPDATE_LOCK)\n ]);\n const cleared = withCacheMutationLock(cacheDir, () => {\n const manifestPinRemoved = removeManifestPin(cacheDir);\n const packageRemoved = removePathIfExists(pluginCacheDir, cacheDir);\n const lockfileRemoved = removePathIfExists(lockfilePath, cacheDir);\n return packageRemoved || manifestPinRemoved || lockfileRemoved;\n });\n\n if (!cleared) {\n return {\n success: true,\n message: \"No cached plugin found. OpenCode will install the latest version on next run.\",\n cleared: false\n };\n }\n\n return {\n success: true,\n message: \"Cache repaired. OpenCode will install the latest version on next run.\",\n cleared: true\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return {\n success: false,\n message: `Failed to clear cache: ${message}`,\n cleared: false\n };\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,38 @@
1
+ import {
2
+ hasBundledSkillArtifacts,
3
+ hasManagedBundledSkillInstall
4
+ } from "./chunk-KDSNXS6N.js";
5
+ import "./chunk-7THCPS52.js";
6
+ import "./chunk-3ILXPKSJ.js";
7
+ import "./chunk-TBUCZX4A.js";
8
+
9
+ // src/cli/update-skill-modes.ts
10
+ function shouldRefreshManagedSkills(mode) {
11
+ return hasManagedBundledSkillInstall(mode) || hasBundledSkillArtifacts(mode);
12
+ }
13
+ function resolveUpdateSkillModes(args) {
14
+ if (args.rawArgs.includes("--no-skills")) {
15
+ return [];
16
+ }
17
+ if (args.rawArgs.includes("--skills-global")) {
18
+ return ["global"];
19
+ }
20
+ if (args.rawArgs.includes("--skills-local")) {
21
+ return ["local"];
22
+ }
23
+ if (args.mode) {
24
+ return [args.mode];
25
+ }
26
+ const modes = [];
27
+ if (shouldRefreshManagedSkills("global")) {
28
+ modes.push("global");
29
+ }
30
+ if (shouldRefreshManagedSkills("local")) {
31
+ modes.push("local");
32
+ }
33
+ return modes;
34
+ }
35
+ export {
36
+ resolveUpdateSkillModes
37
+ };
38
+ //# sourceMappingURL=update-skill-modes-BVX7IVMW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/update-skill-modes.ts"],"sourcesContent":["import type { InstallMode, ParsedArgs } from \"./args\";\nimport { hasBundledSkillArtifacts, hasManagedBundledSkillInstall } from \"./installers/skills\";\n\nfunction shouldRefreshManagedSkills(mode: InstallMode): boolean {\n return hasManagedBundledSkillInstall(mode) || hasBundledSkillArtifacts(mode);\n}\n\nexport function resolveUpdateSkillModes(args: ParsedArgs): InstallMode[] {\n if (args.rawArgs.includes(\"--no-skills\")) {\n return [];\n }\n if (args.rawArgs.includes(\"--skills-global\")) {\n return [\"global\"];\n }\n if (args.rawArgs.includes(\"--skills-local\")) {\n return [\"local\"];\n }\n if (args.mode) {\n return [args.mode];\n }\n\n const modes: InstallMode[] = [];\n if (shouldRefreshManagedSkills(\"global\")) {\n modes.push(\"global\");\n }\n if (shouldRefreshManagedSkills(\"local\")) {\n modes.push(\"local\");\n }\n return modes;\n}\n"],"mappings":";;;;;;;;;AAGA,SAAS,2BAA2B,MAA4B;AAC9D,SAAO,8BAA8B,IAAI,KAAK,yBAAyB,IAAI;AAC7E;AAEO,SAAS,wBAAwB,MAAiC;AACvE,MAAI,KAAK,QAAQ,SAAS,aAAa,GAAG;AACxC,WAAO,CAAC;AAAA,EACV;AACA,MAAI,KAAK,QAAQ,SAAS,iBAAiB,GAAG;AAC5C,WAAO,CAAC,QAAQ;AAAA,EAClB;AACA,MAAI,KAAK,QAAQ,SAAS,gBAAgB,GAAG;AAC3C,WAAO,CAAC,OAAO;AAAA,EACjB;AACA,MAAI,KAAK,MAAM;AACb,WAAO,CAAC,KAAK,IAAI;AAAA,EACnB;AAEA,QAAM,QAAuB,CAAC;AAC9B,MAAI,2BAA2B,QAAQ,GAAG;AACxC,UAAM,KAAK,QAAQ;AAAA,EACrB;AACA,MAAI,2BAA2B,OAAO,GAAG;AACvC,UAAM,KAAK,OAAO;AAAA,EACpB;AACA,SAAO;AACT;","names":[]}
@@ -0,0 +1,56 @@
1
+ import "./chunk-RJNI3BHT.js";
2
+ import {
3
+ parseOptionalStringFlag,
4
+ parseStringArrayFlag
5
+ } from "./chunk-RPXWUCQQ.js";
6
+ import {
7
+ callDaemon
8
+ } from "./chunk-MD655IPO.js";
9
+ import "./chunk-COAOWH3G.js";
10
+ import "./chunk-QOMWCRE3.js";
11
+ import "./chunk-MX3NFLCE.js";
12
+ import "./chunk-ASMHEEKY.js";
13
+ import {
14
+ createUsageError
15
+ } from "./chunk-IPE7TF2P.js";
16
+ import "./chunk-STGGGVYT.js";
17
+ import "./chunk-3ILXPKSJ.js";
18
+ import "./chunk-TBUCZX4A.js";
19
+ import "./chunk-Y2KL55OG.js";
20
+ import "./chunk-5SWZDVOW.js";
21
+ import "./chunk-4BEJVZRK.js";
22
+ import "./chunk-S5KZQJJI.js";
23
+ import "./chunk-KZ2IXVQT.js";
24
+ import "./chunk-WHQZBUNY.js";
25
+ import "./chunk-FUSXMW3G.js";
26
+
27
+ // src/cli/commands/interact/upload.ts
28
+ function parseUploadArgs(rawArgs) {
29
+ return {
30
+ sessionId: parseOptionalStringFlag(rawArgs, "--session-id"),
31
+ targetId: parseOptionalStringFlag(rawArgs, "--target-id"),
32
+ ref: parseOptionalStringFlag(rawArgs, "--ref"),
33
+ files: parseStringArrayFlag(rawArgs, "--files")
34
+ };
35
+ }
36
+ async function runUpload(args) {
37
+ const { sessionId, targetId, ref, files } = parseUploadArgs(args.rawArgs);
38
+ if (!sessionId) throw createUsageError("Missing --session-id");
39
+ if (!ref) throw createUsageError("Missing --ref");
40
+ if (!files) throw createUsageError("Missing --files");
41
+ const result = await callDaemon("interact.upload", {
42
+ sessionId,
43
+ ref,
44
+ files,
45
+ ...typeof targetId === "string" ? { targetId } : {}
46
+ });
47
+ return { success: true, message: "Upload complete.", data: result };
48
+ }
49
+ var __test__ = {
50
+ parseUploadArgs
51
+ };
52
+ export {
53
+ __test__,
54
+ runUpload
55
+ };
56
+ //# sourceMappingURL=upload-KH6ZABJA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/interact/upload.ts"],"sourcesContent":["import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\nimport { parseOptionalStringFlag, parseStringArrayFlag } from \"../../utils/parse\";\n\ntype UploadArgs = {\n sessionId?: string;\n targetId?: string;\n ref?: string;\n files?: string[];\n};\n\nfunction parseUploadArgs(rawArgs: string[]): UploadArgs {\n return {\n sessionId: parseOptionalStringFlag(rawArgs, \"--session-id\"),\n targetId: parseOptionalStringFlag(rawArgs, \"--target-id\"),\n ref: parseOptionalStringFlag(rawArgs, \"--ref\"),\n files: parseStringArrayFlag(rawArgs, \"--files\")\n };\n}\n\nexport async function runUpload(args: ParsedArgs) {\n const { sessionId, targetId, ref, files } = parseUploadArgs(args.rawArgs);\n if (!sessionId) throw createUsageError(\"Missing --session-id\");\n if (!ref) throw createUsageError(\"Missing --ref\");\n if (!files) throw createUsageError(\"Missing --files\");\n const result = await callDaemon(\"interact.upload\", {\n sessionId,\n ref,\n files,\n ...(typeof targetId === \"string\" ? { targetId } : {})\n });\n return { success: true, message: \"Upload complete.\", data: result };\n}\n\nexport const __test__ = {\n parseUploadArgs\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,SAAS,gBAAgB,SAA+B;AACtD,SAAO;AAAA,IACL,WAAW,wBAAwB,SAAS,cAAc;AAAA,IAC1D,UAAU,wBAAwB,SAAS,aAAa;AAAA,IACxD,KAAK,wBAAwB,SAAS,OAAO;AAAA,IAC7C,OAAO,qBAAqB,SAAS,SAAS;AAAA,EAChD;AACF;AAEA,eAAsB,UAAU,MAAkB;AAChD,QAAM,EAAE,WAAW,UAAU,KAAK,MAAM,IAAI,gBAAgB,KAAK,OAAO;AACxE,MAAI,CAAC,UAAW,OAAM,iBAAiB,sBAAsB;AAC7D,MAAI,CAAC,IAAK,OAAM,iBAAiB,eAAe;AAChD,MAAI,CAAC,MAAO,OAAM,iBAAiB,iBAAiB;AACpD,QAAM,SAAS,MAAM,WAAW,mBAAmB;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAI,OAAO,aAAa,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,EACrD,CAAC;AACD,SAAO,EAAE,SAAS,MAAM,SAAS,oBAAoB,MAAM,OAAO;AACpE;AAEO,IAAM,WAAW;AAAA,EACtB;AACF;","names":[]}
@@ -0,0 +1,63 @@
1
+ import "./chunk-RJNI3BHT.js";
2
+ import {
3
+ callDaemon
4
+ } from "./chunk-MD655IPO.js";
5
+ import "./chunk-COAOWH3G.js";
6
+ import "./chunk-QOMWCRE3.js";
7
+ import "./chunk-MX3NFLCE.js";
8
+ import "./chunk-ASMHEEKY.js";
9
+ import {
10
+ createUsageError
11
+ } from "./chunk-IPE7TF2P.js";
12
+ import "./chunk-STGGGVYT.js";
13
+ import "./chunk-3ILXPKSJ.js";
14
+ import "./chunk-TBUCZX4A.js";
15
+ import "./chunk-Y2KL55OG.js";
16
+ import "./chunk-5SWZDVOW.js";
17
+ import "./chunk-4BEJVZRK.js";
18
+ import "./chunk-S5KZQJJI.js";
19
+ import "./chunk-KZ2IXVQT.js";
20
+ import "./chunk-WHQZBUNY.js";
21
+ import "./chunk-FUSXMW3G.js";
22
+
23
+ // src/cli/commands/targets/use.ts
24
+ function parseTargetUseArgs(rawArgs) {
25
+ const parsed = {};
26
+ for (let i = 0; i < rawArgs.length; i += 1) {
27
+ const arg = rawArgs[i];
28
+ if (arg === "--session-id") {
29
+ const value = rawArgs[i + 1];
30
+ if (!value) throw createUsageError("Missing value for --session-id");
31
+ parsed.sessionId = value;
32
+ i += 1;
33
+ continue;
34
+ }
35
+ if (arg?.startsWith("--session-id=")) {
36
+ parsed.sessionId = arg.split("=", 2)[1];
37
+ continue;
38
+ }
39
+ if (arg === "--target-id") {
40
+ const value = rawArgs[i + 1];
41
+ if (!value) throw createUsageError("Missing value for --target-id");
42
+ parsed.targetId = value;
43
+ i += 1;
44
+ continue;
45
+ }
46
+ if (arg?.startsWith("--target-id=")) {
47
+ parsed.targetId = arg.split("=", 2)[1];
48
+ continue;
49
+ }
50
+ }
51
+ return parsed;
52
+ }
53
+ async function runTargetUse(args) {
54
+ const { sessionId, targetId } = parseTargetUseArgs(args.rawArgs);
55
+ if (!sessionId) throw createUsageError("Missing --session-id");
56
+ if (!targetId) throw createUsageError("Missing --target-id");
57
+ const result = await callDaemon("targets.use", { sessionId, targetId });
58
+ return { success: true, message: `Target selected: ${targetId}`, data: result };
59
+ }
60
+ export {
61
+ runTargetUse
62
+ };
63
+ //# sourceMappingURL=use-7YDKO3U4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/targets/use.ts"],"sourcesContent":["import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\n\nfunction parseTargetUseArgs(rawArgs: string[]): { sessionId?: string; targetId?: string } {\n const parsed: { sessionId?: string; targetId?: string } = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--target-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --target-id\");\n parsed.targetId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--target-id=\")) {\n parsed.targetId = arg.split(\"=\", 2)[1];\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runTargetUse(args: ParsedArgs) {\n const { sessionId, targetId } = parseTargetUseArgs(args.rawArgs);\n if (!sessionId) throw createUsageError(\"Missing --session-id\");\n if (!targetId) throw createUsageError(\"Missing --target-id\");\n const result = await callDaemon(\"targets.use\", { sessionId, targetId });\n return { success: true, message: `Target selected: ${targetId}`, data: result };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAIA,SAAS,mBAAmB,SAA8D;AACxF,QAAM,SAAoD,CAAC;AAC3D,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1C,UAAM,MAAM,QAAQ,CAAC;AACrB,QAAI,QAAQ,gBAAgB;AAC1B,YAAM,QAAQ,QAAQ,IAAI,CAAC;AAC3B,UAAI,CAAC,MAAO,OAAM,iBAAiB,gCAAgC;AACnE,aAAO,YAAY;AACnB,WAAK;AACL;AAAA,IACF;AACA,QAAI,KAAK,WAAW,eAAe,GAAG;AACpC,aAAO,YAAY,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;AACtC;AAAA,IACF;AACA,QAAI,QAAQ,eAAe;AACzB,YAAM,QAAQ,QAAQ,IAAI,CAAC;AAC3B,UAAI,CAAC,MAAO,OAAM,iBAAiB,+BAA+B;AAClE,aAAO,WAAW;AAClB,WAAK;AACL;AAAA,IACF;AACA,QAAI,KAAK,WAAW,cAAc,GAAG;AACnC,aAAO,WAAW,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;AACrC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,aAAa,MAAkB;AACnD,QAAM,EAAE,WAAW,SAAS,IAAI,mBAAmB,KAAK,OAAO;AAC/D,MAAI,CAAC,UAAW,OAAM,iBAAiB,sBAAsB;AAC7D,MAAI,CAAC,SAAU,OAAM,iBAAiB,qBAAqB;AAC3D,QAAM,SAAS,MAAM,WAAW,eAAe,EAAE,WAAW,SAAS,CAAC;AACtE,SAAO,EAAE,SAAS,MAAM,SAAS,oBAAoB,QAAQ,IAAI,MAAM,OAAO;AAChF;","names":[]}
@@ -0,0 +1,71 @@
1
+ import "./chunk-RJNI3BHT.js";
2
+ import {
3
+ parseOptionalStringFlag
4
+ } from "./chunk-RPXWUCQQ.js";
5
+ import {
6
+ callDaemon
7
+ } from "./chunk-MD655IPO.js";
8
+ import "./chunk-COAOWH3G.js";
9
+ import "./chunk-QOMWCRE3.js";
10
+ import "./chunk-MX3NFLCE.js";
11
+ import "./chunk-ASMHEEKY.js";
12
+ import {
13
+ createUsageError
14
+ } from "./chunk-IPE7TF2P.js";
15
+ import "./chunk-STGGGVYT.js";
16
+ import "./chunk-3ILXPKSJ.js";
17
+ import "./chunk-TBUCZX4A.js";
18
+ import "./chunk-Y2KL55OG.js";
19
+ import "./chunk-5SWZDVOW.js";
20
+ import "./chunk-4BEJVZRK.js";
21
+ import "./chunk-S5KZQJJI.js";
22
+ import "./chunk-KZ2IXVQT.js";
23
+ import "./chunk-WHQZBUNY.js";
24
+ import "./chunk-FUSXMW3G.js";
25
+
26
+ // src/cli/commands/dom/value.ts
27
+ function parseDomValueArgs(rawArgs) {
28
+ const parsed = {};
29
+ for (let i = 0; i < rawArgs.length; i += 1) {
30
+ const arg = rawArgs[i];
31
+ if (arg === "--session-id") {
32
+ const value = rawArgs[i + 1];
33
+ if (!value) throw createUsageError("Missing value for --session-id");
34
+ parsed.sessionId = value;
35
+ i += 1;
36
+ continue;
37
+ }
38
+ if (arg?.startsWith("--session-id=")) {
39
+ parsed.sessionId = arg.split("=", 2)[1];
40
+ continue;
41
+ }
42
+ if (arg === "--ref") {
43
+ const value = rawArgs[i + 1];
44
+ if (!value) throw createUsageError("Missing value for --ref");
45
+ parsed.ref = value;
46
+ i += 1;
47
+ continue;
48
+ }
49
+ if (arg?.startsWith("--ref=")) {
50
+ parsed.ref = arg.split("=", 2)[1];
51
+ continue;
52
+ }
53
+ }
54
+ return parsed;
55
+ }
56
+ async function runDomValue(args) {
57
+ const { sessionId, ref } = parseDomValueArgs(args.rawArgs);
58
+ const targetId = parseOptionalStringFlag(args.rawArgs, "--target-id");
59
+ if (!sessionId) throw createUsageError("Missing --session-id");
60
+ if (!ref) throw createUsageError("Missing --ref");
61
+ const result = await callDaemon("dom.getValue", {
62
+ sessionId,
63
+ ref,
64
+ ...typeof targetId === "string" ? { targetId } : {}
65
+ });
66
+ return { success: true, message: "DOM value captured.", data: result };
67
+ }
68
+ export {
69
+ runDomValue
70
+ };
71
+ //# sourceMappingURL=value-RZBWSKKM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/dom/value.ts"],"sourcesContent":["import type { ParsedArgs } from \"../../args\";\nimport { callDaemon } from \"../../client\";\nimport { createUsageError } from \"../../errors\";\nimport { parseOptionalStringFlag } from \"../../utils/parse\";\n\nfunction parseDomValueArgs(rawArgs: string[]): { sessionId?: string; ref?: string } {\n const parsed: { sessionId?: string; ref?: string } = {};\n for (let i = 0; i < rawArgs.length; i += 1) {\n const arg = rawArgs[i];\n if (arg === \"--session-id\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --session-id\");\n parsed.sessionId = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--session-id=\")) {\n parsed.sessionId = arg.split(\"=\", 2)[1];\n continue;\n }\n if (arg === \"--ref\") {\n const value = rawArgs[i + 1];\n if (!value) throw createUsageError(\"Missing value for --ref\");\n parsed.ref = value;\n i += 1;\n continue;\n }\n if (arg?.startsWith(\"--ref=\")) {\n parsed.ref = arg.split(\"=\", 2)[1];\n continue;\n }\n }\n return parsed;\n}\n\nexport async function runDomValue(args: ParsedArgs) {\n const { sessionId, ref } = parseDomValueArgs(args.rawArgs);\n const targetId = parseOptionalStringFlag(args.rawArgs, \"--target-id\");\n if (!sessionId) throw createUsageError(\"Missing --session-id\");\n if (!ref) throw createUsageError(\"Missing --ref\");\n const result = await callDaemon(\"dom.getValue\", {\n sessionId,\n ref,\n ...(typeof targetId === \"string\" ? { targetId } : {})\n });\n return { success: true, message: \"DOM value captured.\", data: result };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,SAAS,kBAAkB,SAAyD;AAClF,QAAM,SAA+C,CAAC;AACtD,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1C,UAAM,MAAM,QAAQ,CAAC;AACrB,QAAI,QAAQ,gBAAgB;AAC1B,YAAM,QAAQ,QAAQ,IAAI,CAAC;AAC3B,UAAI,CAAC,MAAO,OAAM,iBAAiB,gCAAgC;AACnE,aAAO,YAAY;AACnB,WAAK;AACL;AAAA,IACF;AACA,QAAI,KAAK,WAAW,eAAe,GAAG;AACpC,aAAO,YAAY,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;AACtC;AAAA,IACF;AACA,QAAI,QAAQ,SAAS;AACnB,YAAM,QAAQ,QAAQ,IAAI,CAAC;AAC3B,UAAI,CAAC,MAAO,OAAM,iBAAiB,yBAAyB;AAC5D,aAAO,MAAM;AACb,WAAK;AACL;AAAA,IACF;AACA,QAAI,KAAK,WAAW,QAAQ,GAAG;AAC7B,aAAO,MAAM,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;AAChC;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,YAAY,MAAkB;AAClD,QAAM,EAAE,WAAW,IAAI,IAAI,kBAAkB,KAAK,OAAO;AACzD,QAAM,WAAW,wBAAwB,KAAK,SAAS,aAAa;AACpE,MAAI,CAAC,UAAW,OAAM,iBAAiB,sBAAsB;AAC7D,MAAI,CAAC,IAAK,OAAM,iBAAiB,eAAe;AAChD,QAAM,SAAS,MAAM,WAAW,gBAAgB;AAAA,IAC9C;AAAA,IACA;AAAA,IACA,GAAI,OAAO,aAAa,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,EACrD,CAAC;AACD,SAAO,EAAE,SAAS,MAAM,SAAS,uBAAuB,MAAM,OAAO;AACvE;","names":[]}