autohand-cli 0.8.2 → 0.9.0

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 (551) hide show
  1. package/README.md +173 -74
  2. package/dist/AgentRegistry-EGBDIUAK.cjs +10 -0
  3. package/dist/{AgentRegistry-7LDL5HJH.js → AgentRegistry-XPWSVO3Q.js} +3 -3
  4. package/dist/{AutomodeManager-MWLKGPZK.js → AutomodeManager-APLLPEYJ.js} +32 -18
  5. package/dist/{AutomodeManager-NYIZNODK.cjs → AutomodeManager-MPSXT2RH.cjs} +38 -24
  6. package/dist/CommunitySkillsCache-2OIUV227.cjs +8 -0
  7. package/dist/CommunitySkillsCache-ZEQWP6YM.js +8 -0
  8. package/dist/GitHubRegistryFetcher-CYJLF2XL.cjs +7 -0
  9. package/dist/{GitHubRegistryFetcher-6JQ5JEDZ.js → GitHubRegistryFetcher-J2BWPXJF.js} +2 -2
  10. package/dist/HookManager-CWLTFKWO.js +7 -0
  11. package/dist/HookManager-TMAJQU4S.cjs +7 -0
  12. package/dist/{ImportWizard-35YBJ4AM.cjs → ImportWizard-MQXEED2U.cjs} +41 -17
  13. package/dist/{ImportWizard-XH7CINCH.js → ImportWizard-QBKQEXDW.js} +35 -11
  14. package/dist/LearnAdvisor-46FG2XIP.js +9 -0
  15. package/dist/LearnAdvisor-XBRDNAGH.cjs +9 -0
  16. package/dist/McpClientManager-BNSKLHIN.cjs +8 -0
  17. package/dist/{McpClientManager-7RM6YT35.js → McpClientManager-SL35BR24.js} +2 -2
  18. package/dist/MemoryManager-34L4YOKA.cjs +8 -0
  19. package/dist/MemoryManager-WJMLPWGU.js +8 -0
  20. package/dist/NVIDIAProvider-2HR737UE.js +14 -0
  21. package/dist/NVIDIAProvider-MVTL62PR.cjs +14 -0
  22. package/dist/PermissionManager-5OOJ7FAT.cjs +11 -0
  23. package/dist/{PermissionManager-ATUV34LQ.js → PermissionManager-KMYILJ4Z.js} +4 -4
  24. package/dist/{ProjectProfiler-ZDWR2ODG.cjs → ProjectProfiler-CDAE7ECW.cjs} +2 -1
  25. package/dist/{ProjectProfiler-UMJJSOCE.js → ProjectProfiler-NZTJDRHD.js} +2 -1
  26. package/dist/ProviderFactory-C3YPXTDD.cjs +11 -0
  27. package/dist/ProviderFactory-HFPRVQ25.js +11 -0
  28. package/dist/SessionManager-PNBTJJTQ.js +10 -0
  29. package/dist/SessionManager-WAPTFMDO.cjs +10 -0
  30. package/dist/SkillsRegistry-4RRD5GMX.js +9 -0
  31. package/dist/SkillsRegistry-7AJP74GJ.cjs +9 -0
  32. package/dist/SubAgent-FDIH3DXB.js +11 -0
  33. package/dist/SubAgent-HVL2ICVZ.cjs +11 -0
  34. package/dist/{SyncApiClient-LVIO4C2S.js → SyncApiClient-LRPFNCKJ.js} +2 -2
  35. package/dist/SyncApiClient-VMBOLQ6H.cjs +11 -0
  36. package/dist/about-BW3PDZUU.js +14 -0
  37. package/dist/about-FCAX37YC.cjs +14 -0
  38. package/dist/acp-EOETGAHC.cjs +1517 -0
  39. package/dist/acp-VHEL7BOW.js +1517 -0
  40. package/dist/actionExecutor-33I47NZS.js +24 -0
  41. package/dist/actionExecutor-4YBMR3YH.cjs +24 -0
  42. package/dist/add-dir-7SS6KSH5.cjs +11 -0
  43. package/dist/add-dir-VFX7QT4E.js +11 -0
  44. package/dist/agent-DMRUFU4M.cjs +116 -0
  45. package/dist/agent-WCJEYQJT.js +116 -0
  46. package/dist/agents/builtin/code-cleaner.md +1 -1
  47. package/dist/agents/builtin/docs-writer.md +1 -1
  48. package/dist/agents/builtin/researcher.md +2 -2
  49. package/dist/agents/builtin/reviewer.md +1 -1
  50. package/dist/agents/builtin/tester.md +1 -1
  51. package/dist/agents/builtin/todo-resolver.md +1 -1
  52. package/dist/agents-CHROO3VU.cjs +17 -0
  53. package/dist/agents-UVDUL65K.js +17 -0
  54. package/dist/agents-new-AUBWSOXP.js +17 -0
  55. package/dist/agents-new-Y562WC47.cjs +17 -0
  56. package/dist/{autoSkill-6TGBTEQD.js → autoSkill-EFMK6WU6.js} +3 -3
  57. package/dist/autoSkill-YOLLFTP2.cjs +20 -0
  58. package/dist/automode-BMYSRM34.js +10 -0
  59. package/dist/automode-DBLKTTKD.cjs +10 -0
  60. package/dist/browserToolBridge-BXRQB4B4.cjs +58 -0
  61. package/dist/browserToolBridge-F5N66PE7.js +58 -0
  62. package/dist/{cc-7LEIJ3KF.js → cc-AYEP2CA3.js} +1 -1
  63. package/dist/{cc-Q5MM4AWC.cjs → cc-S2QLQFBR.cjs} +1 -1
  64. package/dist/chrome-ATC4OO5I.cjs +20 -0
  65. package/dist/chrome-NHJ44WUN.js +50 -0
  66. package/dist/chrome-O62WXV7F.js +20 -0
  67. package/dist/chrome-XHJLCO4M.cjs +50 -0
  68. package/dist/chromeSkill-53TH55PM.js +105 -0
  69. package/dist/chromeSkill-THW7N4IY.cjs +105 -0
  70. package/dist/{chunk-HOAHWIQ5.cjs → chunk-2CGE7ZV3.cjs} +26 -26
  71. package/dist/chunk-2H5O745H.js +63 -0
  72. package/dist/chunk-2HOLOHVK.js +2219 -0
  73. package/dist/{chunk-3PDTTAKJ.js → chunk-2QL6MNXG.js} +15 -8
  74. package/dist/{chunk-PGRH5Q77.cjs → chunk-2VHB43IX.cjs} +35 -6
  75. package/dist/{chunk-VG34MG2U.js → chunk-37M5UM6I.js} +9 -6
  76. package/dist/{chunk-6HYLHBQG.cjs → chunk-3DDL2E55.cjs} +20 -16
  77. package/dist/chunk-3EDDDZS2.cjs +5 -0
  78. package/dist/{chunk-6OYHF6MF.js → chunk-3GUEUCZK.js} +28 -4
  79. package/dist/{chunk-N254NRHT.cjs → chunk-3HT76LNN.cjs} +9 -2
  80. package/dist/{chunk-DVUHHH3B.cjs → chunk-3KLSNNRW.cjs} +4 -4
  81. package/dist/chunk-3LJJG5YY.cjs +387 -0
  82. package/dist/chunk-3OF56EMA.cjs +197 -0
  83. package/dist/chunk-3PXKRVCW.js +108 -0
  84. package/dist/{chunk-IKGWDOGU.cjs → chunk-3S563FNF.cjs} +160 -79
  85. package/dist/chunk-3UT7R3XV.js +663 -0
  86. package/dist/chunk-4256YRCO.cjs +80 -0
  87. package/dist/chunk-46C73ZKK.cjs +663 -0
  88. package/dist/chunk-46MTALKD.js +44 -0
  89. package/dist/{chunk-AEJH23FO.cjs → chunk-47PHDKNW.cjs} +6 -6
  90. package/dist/chunk-4LMUDS2K.js +124 -0
  91. package/dist/{chunk-HLHTG5ZU.cjs → chunk-5CMYEM3R.cjs} +14 -12
  92. package/dist/{chunk-MBBY4ZIK.js → chunk-5F6ZKSHO.js} +4 -1
  93. package/dist/chunk-5JFTY3VU.js +74 -0
  94. package/dist/chunk-5JTTM5SC.js +59 -0
  95. package/dist/{chunk-IETRBBMP.cjs → chunk-5K3CDSWZ.cjs} +108 -31
  96. package/dist/{chunk-GJH7XMSK.js → chunk-5VHP6HDQ.js} +8 -6
  97. package/dist/{chunk-6ZCULLCA.js → chunk-62RTC3XX.js} +1 -1
  98. package/dist/{chunk-MSED7RH2.cjs → chunk-6GUODJKM.cjs} +112 -41
  99. package/dist/{chunk-47CKWKEX.cjs → chunk-6HH236FV.cjs} +9 -4
  100. package/dist/{chunk-WHE2SWHU.js → chunk-6NVAK6CK.js} +2 -2
  101. package/dist/chunk-6R25D2H5.js +121 -0
  102. package/dist/{chunk-3PCTTUNW.cjs → chunk-6XVVIY54.cjs} +55 -25
  103. package/dist/{chunk-3L53OA4E.cjs → chunk-75EDROHL.cjs} +10 -10
  104. package/dist/{chunk-G4CAKI3V.js → chunk-7HPWMALN.js} +7 -2
  105. package/dist/chunk-7JLT2VNW.cjs +18963 -0
  106. package/dist/chunk-7LWQCE4Y.cjs +987 -0
  107. package/dist/{chunk-OLSBBZW6.cjs → chunk-7MU7LWF3.cjs} +5 -5
  108. package/dist/{chunk-HLQV64Y5.js → chunk-7RFJB75Y.js} +140 -59
  109. package/dist/{chunk-X2MSVKDV.js → chunk-A7HHCIDQ.js} +2 -2
  110. package/dist/{chunk-SKYG33B2.cjs → chunk-AC7DZ6SK.cjs} +3 -3
  111. package/dist/{chunk-XX2ZO7DS.js → chunk-ACDQGA4Z.js} +90 -16
  112. package/dist/{chunk-CZXGCVTR.cjs → chunk-AOKCI722.cjs} +2 -2
  113. package/dist/chunk-ARBEHFCG.js +715 -0
  114. package/dist/{chunk-OOKY3HPZ.js → chunk-AT7OWLY5.js} +50 -9
  115. package/dist/chunk-AU6JAGZJ.cjs +231 -0
  116. package/dist/chunk-AUFNACED.js +18963 -0
  117. package/dist/{chunk-CDBPBM2K.cjs → chunk-AUYSIEVV.cjs} +3 -3
  118. package/dist/chunk-B4HSNOIH.cjs +354 -0
  119. package/dist/{chunk-EGMZDTSL.js → chunk-B5CGDNMR.js} +10 -2
  120. package/dist/{chunk-34M3HWLR.js → chunk-BFQDQRDE.js} +2 -2
  121. package/dist/{chunk-2AA5MFES.js → chunk-BL2UC7HC.js} +8 -5
  122. package/dist/{chunk-LNMYK2F5.cjs → chunk-BQ22N3TX.cjs} +56 -41
  123. package/dist/chunk-BQU3HAE7.js +21 -0
  124. package/dist/chunk-BWF4VDYE.js +3897 -0
  125. package/dist/chunk-BYE7RQFZ.cjs +121 -0
  126. package/dist/{chunk-APIXPPMT.js → chunk-CBFH2J3O.js} +855 -33
  127. package/dist/chunk-CCVMREXI.js +420 -0
  128. package/dist/chunk-CFAWTLSC.js +13 -0
  129. package/dist/{chunk-G27PQQFD.js → chunk-CFFE4VA3.js} +1 -1
  130. package/dist/{chunk-ZYQMLKOK.cjs → chunk-CH2J4PVE.cjs} +212 -70
  131. package/dist/{chunk-7BTSG4ME.cjs → chunk-CHI52KFR.cjs} +855 -33
  132. package/dist/{chunk-DJDE4DTT.cjs → chunk-CWINVFRI.cjs} +25 -19
  133. package/dist/{chunk-HXGBSJL5.cjs → chunk-D2OSPLYC.cjs} +2 -2
  134. package/dist/{chunk-GBHDROGL.js → chunk-D6GZBSOX.js} +16 -4
  135. package/dist/{chunk-CNBKZEX5.cjs → chunk-DA7NBAJK.cjs} +49 -17
  136. package/dist/chunk-DEQVRSV5.cjs +866 -0
  137. package/dist/{chunk-RGR6ME5J.cjs → chunk-DI57A4BX.cjs} +25 -28
  138. package/dist/{chunk-WM5PAOTQ.cjs → chunk-DIZTWFVR.cjs} +1649 -484
  139. package/dist/{chunk-YZXUDM5X.js → chunk-DLP436GI.js} +204 -62
  140. package/dist/{chunk-OHUZKDGX.js → chunk-DMRXF5DU.js} +3 -3
  141. package/dist/{chunk-U46VYPLR.cjs → chunk-DPSIGY6L.cjs} +9 -9
  142. package/dist/{chunk-DN573ME7.cjs → chunk-DRWDEHE5.cjs} +4 -4
  143. package/dist/{chunk-SEKD5FH3.cjs → chunk-E26KKI46.cjs} +5 -2
  144. package/dist/{chunk-J4Q7XR3G.js → chunk-E46DJH5S.js} +3 -3
  145. package/dist/{chunk-Q7XSCYND.cjs → chunk-E6GFD7VR.cjs} +49 -26
  146. package/dist/chunk-ES2HJQ4N.js +37 -0
  147. package/dist/chunk-EZJHLOWP.js +80 -0
  148. package/dist/chunk-FFBDRUO5.cjs +59 -0
  149. package/dist/{chunk-AYSFIUFW.js → chunk-FGT6KK6T.js} +38 -15
  150. package/dist/{chunk-SAHBLB3E.js → chunk-FP46B4X3.js} +208 -3
  151. package/dist/{chunk-DSPQEHDT.js → chunk-FQAVGSPW.js} +2 -2
  152. package/dist/chunk-FQVG6ZHF.js +197 -0
  153. package/dist/chunk-GBMDFWJX.cjs +152 -0
  154. package/dist/{chunk-DRE2RXBZ.js → chunk-GGLKUENP.js} +1605 -440
  155. package/dist/{chunk-S52YW5ZQ.js → chunk-GNBBIAMD.js} +16 -19
  156. package/dist/{chunk-MYISNQH4.js → chunk-GWO66KBI.js} +1 -1
  157. package/dist/chunk-GWY26SUD.cjs +63 -0
  158. package/dist/{chunk-YGN4CQIP.js → chunk-GZ6DV2UG.js} +1 -1
  159. package/dist/{chunk-EZMINVLU.js → chunk-H4D2Q2AL.js} +5 -2
  160. package/dist/chunk-HDK2EHVH.cjs +570 -0
  161. package/dist/chunk-HJIXWGQZ.js +139 -0
  162. package/dist/{chunk-6RF7UKUS.js → chunk-HKYZSUQ5.js} +48 -47
  163. package/dist/{chunk-LQGVEP3E.js → chunk-HQUSEWT4.js} +45 -13
  164. package/dist/{chunk-HTLINWX6.cjs → chunk-HQWQZML5.cjs} +16 -13
  165. package/dist/{chunk-DVZOENQ7.cjs → chunk-HS4USDND.cjs} +9 -4
  166. package/dist/chunk-HSCUPEA4.cjs +3897 -0
  167. package/dist/{chunk-JCLYQ2JC.js → chunk-HXJEGMGB.js} +12 -6
  168. package/dist/{chunk-LJFUXC56.cjs → chunk-HXQREVTA.cjs} +9 -6
  169. package/dist/{chunk-SCXX4LW5.js → chunk-I24CWKKK.js} +15 -8
  170. package/dist/chunk-IAGCRVJ3.js +355 -0
  171. package/dist/chunk-IEXKKKOF.cjs +92 -0
  172. package/dist/{chunk-5IXII4HX.cjs → chunk-IGMPWJ2I.cjs} +19 -12
  173. package/dist/chunk-IKUMVBCW.cjs +33 -0
  174. package/dist/{chunk-XTB6VJVQ.cjs → chunk-J2K57QM7.cjs} +6 -6
  175. package/dist/{chunk-O4IF4NJT.cjs → chunk-J5ADZN6V.cjs} +57 -56
  176. package/dist/chunk-J5HE6CUM.cjs +124 -0
  177. package/dist/{chunk-JS7IPR7P.js → chunk-JAQO6XDB.js} +31 -2
  178. package/dist/chunk-JIMSII7R.js +987 -0
  179. package/dist/chunk-JJ4KA7HK.cjs +2219 -0
  180. package/dist/chunk-JMN3GZU6.js +570 -0
  181. package/dist/{chunk-X5VSP65C.cjs → chunk-JP3YHTQ2.cjs} +4 -4
  182. package/dist/{chunk-SKV2F3NM.js → chunk-JYKPWK5O.js} +1 -1
  183. package/dist/{chunk-NNPAM4HC.cjs → chunk-KNTUI4TZ.cjs} +12 -6
  184. package/dist/{chunk-HIVRCQS2.js → chunk-L4F7SUYL.js} +56 -25
  185. package/dist/{chunk-C5IJIM2V.cjs → chunk-LDJQ5QHG.cjs} +68 -37
  186. package/dist/{chunk-ULQ6MDSJ.cjs → chunk-LFDPTJYF.cjs} +43 -35
  187. package/dist/chunk-LJD7KR3L.cjs +44 -0
  188. package/dist/chunk-LN7D3EJZ.js +387 -0
  189. package/dist/{chunk-643VRA5S.cjs → chunk-LQBONA55.cjs} +32 -8
  190. package/dist/{chunk-NCC6ETZS.js → chunk-LUMV3DB2.js} +41 -33
  191. package/dist/chunk-M4KNC5BQ.js +78 -0
  192. package/dist/chunk-MO4KP6XS.cjs +229 -0
  193. package/dist/{chunk-BVKXEQVG.cjs → chunk-MOJ7ADW4.cjs} +22 -10
  194. package/dist/chunk-MPULXVC4.cjs +715 -0
  195. package/dist/{chunk-X5YJ34FZ.cjs → chunk-MQESBFBZ.cjs} +46 -23
  196. package/dist/chunk-MUNUUFU7.cjs +21 -0
  197. package/dist/{chunk-X3WS5LDG.js → chunk-MX75JYIY.js} +7 -5
  198. package/dist/chunk-MXVIDIC6.cjs +139 -0
  199. package/dist/{chunk-3K2ESU53.cjs → chunk-N6O3XUZ2.cjs} +2 -2
  200. package/dist/{chunk-IVM5F2AE.js → chunk-NBGOIFKP.js} +265 -18
  201. package/dist/{chunk-SLQAYV3W.js → chunk-NMQ47RCG.js} +8 -2
  202. package/dist/{chunk-JYTDYJVW.js → chunk-O64I2GYI.js} +1 -1
  203. package/dist/{chunk-IFFXSTOM.cjs → chunk-O6TQP7U7.cjs} +3 -3
  204. package/dist/{chunk-AYS2ASM7.js → chunk-OHWMWKJQ.js} +1 -1
  205. package/dist/{chunk-N23UAW4I.js → chunk-OM24WXEE.js} +7 -2
  206. package/dist/{chunk-MAKMSQMQ.cjs → chunk-OPNI6O7F.cjs} +8 -6
  207. package/dist/chunk-OR67YXQK.cjs +13 -0
  208. package/dist/{chunk-QOXPOR5D.js → chunk-OV3PVUYN.js} +115 -44
  209. package/dist/{chunk-TNZRZQ7Q.js → chunk-PB7W7R72.js} +3 -78
  210. package/dist/chunk-PCM3N3CL.cjs +37 -0
  211. package/dist/{chunk-A4IJHHV7.cjs → chunk-PDHT7LQS.cjs} +52 -11
  212. package/dist/{chunk-LA7H35XM.cjs → chunk-PHJO5YAL.cjs} +9 -9
  213. package/dist/{chunk-KPELYZ6L.js → chunk-PQLKJCIE.js} +2 -2
  214. package/dist/chunk-PUD76XQT.cjs +78 -0
  215. package/dist/chunk-Q2IL4DDI.cjs +355 -0
  216. package/dist/{chunk-WPVWQSL7.cjs → chunk-Q6AC3PHY.cjs} +16 -13
  217. package/dist/{chunk-XRZEUWKF.js → chunk-QCHIDZBA.js} +1 -1
  218. package/dist/{chunk-IQ5RXU6O.js → chunk-QEGOB6QV.js} +1 -1
  219. package/dist/{chunk-JSBRDJBE.js → chunk-QGM4M3NI.js} +8 -1
  220. package/dist/chunk-QKP772OZ.js +4291 -0
  221. package/dist/chunk-QQ7PANOP.js +59 -0
  222. package/dist/{chunk-YHD6TUIR.cjs → chunk-QW2RW2GY.cjs} +2 -0
  223. package/dist/chunk-RAKO7UN7.js +114 -0
  224. package/dist/chunk-RBHANOYY.js +33 -0
  225. package/dist/chunk-RBZ7AFX7.cjs +29 -0
  226. package/dist/{chunk-TXSDBGKX.cjs → chunk-REMGR23V.cjs} +46 -49
  227. package/dist/chunk-ROLA6EFO.cjs +85 -0
  228. package/dist/{chunk-TBEGGJNC.cjs → chunk-SOLBYSLY.cjs} +33 -16
  229. package/dist/{chunk-FKSDEWDH.js → chunk-SWCQM52V.js} +68 -25
  230. package/dist/{chunk-H5SWOLG6.js → chunk-TBOLJDUG.js} +39 -24
  231. package/dist/chunk-TH26BQJG.js +101 -0
  232. package/dist/{chunk-245KJE5Y.cjs → chunk-TJNBASFD.cjs} +14 -6
  233. package/dist/chunk-TKKN34TV.js +229 -0
  234. package/dist/chunk-TQ33WBY5.cjs +74 -0
  235. package/dist/{chunk-EGFT4PGW.js → chunk-TWQDAUZU.js} +5 -2
  236. package/dist/{chunk-OGV4WJ5L.cjs → chunk-TXPSTCG7.cjs} +74 -59
  237. package/dist/{chunk-CAMZTXV6.js → chunk-U4C3HW6P.js} +67 -52
  238. package/dist/{chunk-5P2NXKP3.js → chunk-UEIXJG45.js} +104 -76
  239. package/dist/{chunk-22D2CNTP.cjs → chunk-UGFVM77J.cjs} +5 -2
  240. package/dist/chunk-UOQECODR.js +34 -0
  241. package/dist/chunk-UR27UDTB.js +354 -0
  242. package/dist/chunk-UWFG2R2I.cjs +420 -0
  243. package/dist/{chunk-Y72HH2TF.cjs → chunk-UXLW45ZE.cjs} +102 -28
  244. package/dist/{chunk-FPHU2ES6.cjs → chunk-VBOFPU5M.cjs} +6 -0
  245. package/dist/{chunk-JX3DFKBI.js → chunk-VDWJMWDF.js} +54 -24
  246. package/dist/{chunk-LENHP55G.cjs → chunk-VGEV44V2.cjs} +1076 -158
  247. package/dist/{chunk-33RSHBDH.js → chunk-VKBIE6I6.js} +38 -7
  248. package/dist/{chunk-CWMZKFTT.js → chunk-VRMZO6TB.js} +31 -8
  249. package/dist/chunk-VUGOOGHB.js +400 -0
  250. package/dist/chunk-WBU4Q4GS.cjs +400 -0
  251. package/dist/chunk-WGLBC5AY.cjs +59 -0
  252. package/dist/{chunk-KWXVKLQ5.cjs → chunk-WGNMOVMT.cjs} +7 -82
  253. package/dist/{chunk-RKJTGGMU.cjs → chunk-WKRDBCP2.cjs} +221 -16
  254. package/dist/chunk-WRTXCQ3V.cjs +4291 -0
  255. package/dist/chunk-WTB7AFL6.cjs +101 -0
  256. package/dist/{chunk-NDMIPTV4.js → chunk-WZV6UVPY.js} +8 -3
  257. package/dist/chunk-XF2WIKHR.cjs +34 -0
  258. package/dist/{chunk-L3WAH3EM.cjs → chunk-XGMI6IYB.cjs} +46 -15
  259. package/dist/{chunk-FW774QXH.js → chunk-XIVFAD2L.js} +1048 -130
  260. package/dist/chunk-XV2HXRHX.js +85 -0
  261. package/dist/{chunk-72FKPBT5.js → chunk-Y3M2DABP.js} +16 -12
  262. package/dist/{chunk-QNGEW5TC.js → chunk-YV63VW4K.js} +1 -1
  263. package/dist/{chunk-UJ2JSM6H.js → chunk-YVQI26H4.js} +2 -0
  264. package/dist/{chunk-RD5XAJR2.cjs → chunk-YWTIXHU6.cjs} +266 -19
  265. package/dist/chunk-YZWE7XSM.js +5 -0
  266. package/dist/{chunk-I5IW3T2Y.js → chunk-Z3XSSF7B.js} +32 -15
  267. package/dist/{chunk-6UJMCWRY.js → chunk-Z4LIPMPM.js} +6 -0
  268. package/dist/chunk-ZASDSY7P.cjs +114 -0
  269. package/dist/{chunk-R33VKSH5.cjs → chunk-ZHJ7JGME.cjs} +11 -11
  270. package/dist/chunk-ZPD2AO3U.js +866 -0
  271. package/dist/{chunk-7UOUW76C.js → chunk-ZQAT5VT5.js} +101 -24
  272. package/dist/chunk-ZR46OJNZ.js +152 -0
  273. package/dist/{chunk-G3V4SFET.cjs → chunk-ZZ63NW7A.cjs} +78 -35
  274. package/dist/clear-33TWQ2ES.cjs +12 -0
  275. package/dist/clear-OFLFQ3MR.js +12 -0
  276. package/dist/{communityInstaller-6KCFN7YZ.js → communityInstaller-COB2KTOW.js} +9 -6
  277. package/dist/communityInstaller-TWMGPSYM.cjs +22 -0
  278. package/dist/completion-IIZMHXYP.cjs +17 -0
  279. package/dist/completion-PT4VM2H2.js +17 -0
  280. package/dist/config-KL6WU7R2.cjs +20 -0
  281. package/dist/{config-ZN66VXPS.js → config-R4O7GBTY.js} +7 -5
  282. package/dist/{constants-UFM5B232.js → constants-HVCHVQAF.js} +2 -2
  283. package/dist/constants-RLMJ5D5P.cjs +21 -0
  284. package/dist/{defaultHooks-RCXPHF4M.cjs → defaultHooks-2V2CQL63.cjs} +26 -11
  285. package/dist/{defaultHooks-RDRMER3Z.js → defaultHooks-TMHDU3FS.js} +26 -11
  286. package/dist/export-3PK3VFCE.js +15 -0
  287. package/dist/export-WLGNWEMJ.cjs +15 -0
  288. package/dist/{extractSessionMemories-V7K42ZHW.js → extractSessionMemories-A2JX5WJ2.js} +1 -1
  289. package/dist/{extractSessionMemories-SDW2MVBQ.cjs → extractSessionMemories-XL3MS37F.cjs} +1 -1
  290. package/dist/feedback-G635NCLJ.js +18 -0
  291. package/dist/feedback-LLMK3TZH.cjs +18 -0
  292. package/dist/fffSearchProvider-2YCNKOYD.js +412 -0
  293. package/dist/fffSearchProvider-W6627E2V.cjs +412 -0
  294. package/dist/filesystem-L6DQKGWK.js +11 -0
  295. package/dist/filesystem-PGUPCMVK.cjs +11 -0
  296. package/dist/{formatters-6K7QVWQL.cjs → formatters-53XTCNGQ.cjs} +1 -1
  297. package/dist/{formatters-DQHO5I36.js → formatters-T6KV4BPP.js} +1 -1
  298. package/dist/help-BAXLP2M2.cjs +12 -0
  299. package/dist/{help-2BLR7L43.js → help-X3OAZ3CY.js} +3 -3
  300. package/dist/history-6HOJSEMT.cjs +14 -0
  301. package/dist/{history-5FZ3M2AK.js → history-YKFPHBJN.js} +3 -3
  302. package/dist/hooks-7TA4PIIB.js +18 -0
  303. package/dist/hooks-XVFU67T2.cjs +18 -0
  304. package/dist/{i18n-K7QOWIBH.js → i18n-2KBUU7XL.js} +2 -2
  305. package/dist/i18n-MUJMKTFM.cjs +33 -0
  306. package/dist/ide-CCQ33PGC.cjs +15 -0
  307. package/dist/ide-VLVFBZ5F.js +15 -0
  308. package/dist/immediateCommandRouter-MTEHZXQX.js +15 -0
  309. package/dist/immediateCommandRouter-ROXU3MWT.cjs +15 -0
  310. package/dist/{import-UXM3VK7B.js → import-4CHYLS4K.js} +4 -4
  311. package/dist/{import-QEME3E4T.cjs → import-I7T4ZHYL.cjs} +4 -4
  312. package/dist/import-J46F54JY.cjs +10 -0
  313. package/dist/import-JWPYKXCZ.js +10 -0
  314. package/dist/index.cjs +747 -22356
  315. package/dist/index.d.cts +93 -0
  316. package/dist/index.d.ts +93 -0
  317. package/dist/index.js +786 -22395
  318. package/dist/init-262MWZV4.js +10 -0
  319. package/dist/init-EE5Y7RBL.cjs +10 -0
  320. package/dist/inkMode-VUE6ZDLD.cjs +7 -0
  321. package/dist/inkMode-WBNFOSAT.js +7 -0
  322. package/dist/inputPrompt-IIFKCX5Q.cjs +90 -0
  323. package/dist/inputPrompt-YGBHDUEP.js +90 -0
  324. package/dist/language-CVLPB7OV.js +21 -0
  325. package/dist/language-ZTWFHUSV.cjs +21 -0
  326. package/dist/learn-PON7I5QS.js +23 -0
  327. package/dist/learn-XLRSVNA3.cjs +23 -0
  328. package/dist/{lint-D5UOJWIK.cjs → lint-4NDGCSCL.cjs} +1 -1
  329. package/dist/{lint-NJPZWVN2.js → lint-FZ7ZJUB3.js} +1 -1
  330. package/dist/login-223QTGBG.cjs +26 -0
  331. package/dist/login-6IKTBUBY.js +26 -0
  332. package/dist/logout-RN2AG6SI.js +23 -0
  333. package/dist/logout-U3M4FFX7.cjs +23 -0
  334. package/dist/mcp-5O6PUL4G.js +20 -0
  335. package/dist/mcp-NUQ76QQB.cjs +20 -0
  336. package/dist/{mcp-install-VESN42PI.js → mcp-install-6XWXLFVY.js} +18 -11
  337. package/dist/{mcp-install-G27HSS3Z.cjs → mcp-install-P6DHES7V.cjs} +22 -15
  338. package/dist/memory-CYMDQ2YC.cjs +10 -0
  339. package/dist/memory-Q54CESNM.js +10 -0
  340. package/dist/{message-ZJ5AYAMT.cjs → message-4OKO775J.cjs} +1 -1
  341. package/dist/{message-JUBOK2VU.js → message-X3LOAAM7.js} +1 -1
  342. package/dist/model-6AJ77PJG.js +10 -0
  343. package/dist/model-IDRCKDML.cjs +10 -0
  344. package/dist/new-7LEWOUF2.cjs +12 -0
  345. package/dist/new-ZXHEWC2S.js +12 -0
  346. package/dist/onboarding-FXX7YHSJ.cjs +35 -0
  347. package/dist/onboarding-JYNMK6NI.js +35 -0
  348. package/dist/{patch-MOD7QC3D.cjs → patch-DJ2GPFST.cjs} +1 -1
  349. package/dist/{patch-5F6VBIT3.js → patch-NIJWIRHS.js} +1 -1
  350. package/dist/permissions-YBNSANIA.cjs +10 -0
  351. package/dist/permissions-YHJMVA6L.js +10 -0
  352. package/dist/plan-XEJMOT55.cjs +13 -0
  353. package/dist/plan-YYUAXPTL.js +13 -0
  354. package/dist/pr-review-CW6J7P62.cjs +9 -0
  355. package/dist/pr-review-YZSBQVT2.js +9 -0
  356. package/dist/quit-B43SJ6E4.cjs +10 -0
  357. package/dist/quit-GWTNHQSP.js +10 -0
  358. package/dist/rawMode-6W5AXAKI.cjs +7 -0
  359. package/dist/rawMode-GFNLXQPU.js +7 -0
  360. package/dist/{registry-KWZGYJC2.js → registry-34GL6BNJ.js} +30 -45
  361. package/dist/{registry-YN4FQPOO.cjs → registry-V24W7YK6.cjs} +66 -81
  362. package/dist/repeat-P4FAPE3Y.cjs +17 -0
  363. package/dist/repeat-RALE6AUO.js +17 -0
  364. package/dist/resume-DYVOQN5L.cjs +16 -0
  365. package/dist/resume-M25UQKOX.js +16 -0
  366. package/dist/review-QHP2KP4Q.js +9 -0
  367. package/dist/review-UWHWQHCB.cjs +9 -0
  368. package/dist/ripgrep-67SCU2BA.cjs +9 -0
  369. package/dist/ripgrep-VHJQQ55W.js +9 -0
  370. package/dist/rpc-NPS3PU4O.cjs +3730 -0
  371. package/dist/rpc-S3DGW6KV.js +3730 -0
  372. package/dist/search-CPX4PWHP.js +20 -0
  373. package/dist/search-VUF3M4N3.cjs +20 -0
  374. package/dist/{session-BSU2L5UI.cjs → session-LXKC4X5Q.cjs} +1 -1
  375. package/dist/{session-SZMRN5KG.js → session-NMMO4QOL.js} +1 -1
  376. package/dist/sessions-IYAXMK23.js +10 -0
  377. package/dist/sessions-JODKER5D.cjs +10 -0
  378. package/dist/settings-55BNW6BF.js +33 -0
  379. package/dist/settings-BKTS7OMC.cjs +33 -0
  380. package/dist/setup-IRC5HQG2.js +29 -0
  381. package/dist/setup-MMQ7TWOP.cjs +29 -0
  382. package/dist/share-6JRQECAH.cjs +17 -0
  383. package/dist/share-YM5MJKMO.js +17 -0
  384. package/dist/{skills-FYY6F2WV.cjs → skills-GGMZOVIE.cjs} +14 -11
  385. package/dist/skills-LWSOKOSH.cjs +29 -0
  386. package/dist/{skills-6OL4OSGA.js → skills-MVIZNHT4.js} +13 -10
  387. package/dist/skills-VWOMV3CR.js +29 -0
  388. package/dist/{skills-install-6CSWC24P.js → skills-install-QBA5RCV6.js} +22 -71
  389. package/dist/{skills-install-O3LZ2ETC.cjs → skills-install-VTAMCNNY.cjs} +35 -84
  390. package/dist/skills-new-GPL46YV2.js +18 -0
  391. package/dist/skills-new-L5BEZN5V.cjs +18 -0
  392. package/dist/slashCommands-FBPCIWM5.cjs +95 -0
  393. package/dist/slashCommands-FCWY5DXW.js +95 -0
  394. package/dist/status-3B5SDZPL.js +17 -0
  395. package/dist/status-TTGRF6NC.cjs +17 -0
  396. package/dist/summarizer-DGPHE5IQ.js +17 -0
  397. package/dist/summarizer-JNXLUAQG.cjs +17 -0
  398. package/dist/sync-77CXVVTK.cjs +21 -0
  399. package/dist/{sync-KWX67OUN.js → sync-7BILIQHP.js} +4 -4
  400. package/dist/sync-7OKF6636.js +21 -0
  401. package/dist/sync-EH4K5U3N.cjs +40 -0
  402. package/dist/{tasks-5FPBIFLC.js → tasks-R5MBGAQ6.js} +1 -1
  403. package/dist/{tasks-TXGKGNH6.cjs → tasks-V4WB3MFR.cjs} +1 -1
  404. package/dist/{team-5YXP3JGR.js → team-JESCHGWB.js} +1 -1
  405. package/dist/{team-IIWEZKNR.cjs → team-VQQKWGZB.cjs} +1 -1
  406. package/dist/{teammate-L6EZQ3I2.js → teammate-GZQSCIMS.js} +29 -8
  407. package/dist/{teammate-2KMKJXAM.cjs → teammate-J6PHGL23.cjs} +30 -9
  408. package/dist/theme-64BYGJ57.cjs +21 -0
  409. package/dist/theme-YJE6HEON.js +21 -0
  410. package/dist/tools-3PPTTKFV.js +9 -0
  411. package/dist/tools-THIQA7WC.cjs +9 -0
  412. package/dist/ui/questionModal.cjs +9 -6
  413. package/dist/ui/questionModal.js +8 -5
  414. package/dist/undo-PRTEGL2J.cjs +10 -0
  415. package/dist/undo-SZEHLX7X.js +10 -0
  416. package/dist/{update-TVAJMMBC.js → update-53WMKYVS.js} +1 -1
  417. package/dist/{update-Z6BIIQDC.cjs → update-NV6QRYY7.cjs} +1 -1
  418. package/dist/web-3BA2WV37.cjs +37 -0
  419. package/dist/web-6FYGBX5K.js +37 -0
  420. package/dist/workspaceSafety-MDJGHK6D.cjs +9 -0
  421. package/dist/workspaceSafety-XOUMUBVB.js +9 -0
  422. package/dist/yolo-GF2YD7ZI.js +9 -0
  423. package/dist/yolo-OGDA7HNC.cjs +9 -0
  424. package/dist/yoloMode-3DJDA75U.cjs +17 -0
  425. package/dist/yoloMode-4JOOSU26.js +17 -0
  426. package/package.json +46 -49
  427. package/dist/AgentRegistry-NQCLWABO.cjs +0 -10
  428. package/dist/CommunitySkillsCache-6QPRMTJO.js +0 -8
  429. package/dist/CommunitySkillsCache-GTQMOCCO.cjs +0 -8
  430. package/dist/GitHubRegistryFetcher-S7QFUEKV.cjs +0 -7
  431. package/dist/HookManager-Q2KYMCP4.cjs +0 -7
  432. package/dist/HookManager-TTP4Y6DC.js +0 -7
  433. package/dist/LearnAdvisor-A4Q5PPBI.js +0 -9
  434. package/dist/LearnAdvisor-GASQD7HT.cjs +0 -9
  435. package/dist/McpClientManager-RKD7C6OY.cjs +0 -8
  436. package/dist/MemoryManager-GUNLRP5S.js +0 -8
  437. package/dist/MemoryManager-TNSGKDKX.cjs +0 -8
  438. package/dist/PermissionManager-KMN53FJP.cjs +0 -11
  439. package/dist/ProviderFactory-MR5B23QJ.js +0 -9
  440. package/dist/ProviderFactory-VFGCJJX6.cjs +0 -9
  441. package/dist/SessionManager-FEUAU3ZJ.cjs +0 -10
  442. package/dist/SessionManager-IKWAK2PI.js +0 -10
  443. package/dist/SkillsRegistry-KPQFTRIT.cjs +0 -9
  444. package/dist/SkillsRegistry-XJSKPDF2.js +0 -9
  445. package/dist/SubAgent-NYH6GWQ3.js +0 -11
  446. package/dist/SubAgent-PZKBDUBA.cjs +0 -11
  447. package/dist/SyncApiClient-ZNYMT36M.cjs +0 -11
  448. package/dist/about-HHTF2YFL.js +0 -12
  449. package/dist/about-JGRVNNQC.cjs +0 -12
  450. package/dist/actionExecutor-U6IBN2TU.cjs +0 -19
  451. package/dist/actionExecutor-XT5FW3W6.js +0 -19
  452. package/dist/add-dir-247K3XRY.js +0 -10
  453. package/dist/add-dir-GS4DXKKH.cjs +0 -10
  454. package/dist/agents-R6ZEFTVR.cjs +0 -12
  455. package/dist/agents-WJPQWQF2.js +0 -12
  456. package/dist/agents-new-HKVEIBDJ.js +0 -14
  457. package/dist/agents-new-X6GTHIO6.cjs +0 -14
  458. package/dist/autoSkill-H4T6VVDA.cjs +0 -20
  459. package/dist/automode-BC6NVECO.js +0 -10
  460. package/dist/automode-WN2RSOGW.cjs +0 -10
  461. package/dist/chunk-33A755XB.cjs +0 -168
  462. package/dist/chunk-3OTU3RS3.cjs +0 -1607
  463. package/dist/chunk-4PKF7WPD.js +0 -100
  464. package/dist/chunk-ALYU6VTM.js +0 -105
  465. package/dist/chunk-AS6RTLN7.cjs +0 -203
  466. package/dist/chunk-BWN2CLLM.cjs +0 -298
  467. package/dist/chunk-HQ7YZKXE.js +0 -168
  468. package/dist/chunk-HVKOZ2VP.cjs +0 -115
  469. package/dist/chunk-J6QET7EF.cjs +0 -454
  470. package/dist/chunk-LWUJFGOZ.js +0 -115
  471. package/dist/chunk-P47WPOXN.js +0 -298
  472. package/dist/chunk-PRRCJFU3.cjs +0 -85
  473. package/dist/chunk-RO6WYEWH.js +0 -454
  474. package/dist/chunk-SYVYLZZF.cjs +0 -24
  475. package/dist/chunk-T73IDKDF.js +0 -111
  476. package/dist/chunk-YRLYSQEQ.cjs +0 -105
  477. package/dist/chunk-ZQE72E6W.cjs +0 -100
  478. package/dist/chunk-ZVY2XD6T.js +0 -1607
  479. package/dist/clear-UO4MNWZW.cjs +0 -12
  480. package/dist/clear-ZJ5NYP6E.js +0 -12
  481. package/dist/communityInstaller-PVSOFDZD.cjs +0 -19
  482. package/dist/completion-MMF2PN2H.js +0 -14
  483. package/dist/completion-UI5WKHXI.cjs +0 -14
  484. package/dist/config-E7RINK4R.cjs +0 -18
  485. package/dist/constants-6CPCJ3DY.cjs +0 -21
  486. package/dist/export-N4XIVDSL.cjs +0 -12
  487. package/dist/export-W22L4D5C.js +0 -12
  488. package/dist/feedback-DR6ADSNE.cjs +0 -15
  489. package/dist/feedback-FEEAP4QW.js +0 -15
  490. package/dist/filesystem-3SGCW2BF.js +0 -10
  491. package/dist/filesystem-MCFXJQ6R.cjs +0 -10
  492. package/dist/help-AQHGTS7P.cjs +0 -12
  493. package/dist/history-NIUDRMKA.cjs +0 -14
  494. package/dist/hooks-2EY4IPKV.js +0 -13
  495. package/dist/hooks-LJVORRIG.cjs +0 -13
  496. package/dist/i18n-ARDG2SMC.cjs +0 -33
  497. package/dist/ide-GFW6IJHD.js +0 -12
  498. package/dist/ide-N2ZNSSB3.cjs +0 -12
  499. package/dist/import-DFVN3KNZ.js +0 -10
  500. package/dist/import-ZS6DPGU5.cjs +0 -10
  501. package/dist/init-PY75HA3S.cjs +0 -10
  502. package/dist/init-QNMWLAVY.js +0 -10
  503. package/dist/language-5UE4G2BT.cjs +0 -18
  504. package/dist/language-UXMHEZUJ.js +0 -18
  505. package/dist/learn-HJ3FLNZC.cjs +0 -20
  506. package/dist/learn-MVYS3RU5.js +0 -20
  507. package/dist/localProjectPermissions-N77HA3XK.js +0 -18
  508. package/dist/localProjectPermissions-UFSMNTBJ.cjs +0 -18
  509. package/dist/login-DSE7H63A.js +0 -20
  510. package/dist/login-V3MEWPKN.cjs +0 -20
  511. package/dist/logout-BMVCLKKW.js +0 -18
  512. package/dist/logout-XEG7FHOZ.cjs +0 -18
  513. package/dist/mcp-PYUR4PHO.js +0 -18
  514. package/dist/mcp-SG6JFLGC.cjs +0 -18
  515. package/dist/memory-4ZMMEZ2Z.js +0 -10
  516. package/dist/memory-QSGMVVGH.cjs +0 -10
  517. package/dist/model-NANLBZ4Z.cjs +0 -10
  518. package/dist/model-ZXNV4AF7.js +0 -10
  519. package/dist/new-5QJY5JP2.js +0 -12
  520. package/dist/new-PMMG55UX.cjs +0 -12
  521. package/dist/permissions-LECTCJ4H.cjs +0 -13
  522. package/dist/permissions-VP5VGIBL.js +0 -13
  523. package/dist/plan-G5CEKJI4.js +0 -11
  524. package/dist/plan-QKOHE3LH.cjs +0 -11
  525. package/dist/quit-BKOOPHU5.cjs +0 -10
  526. package/dist/quit-FVFNYACP.js +0 -10
  527. package/dist/resume-EXFQSQPH.js +0 -13
  528. package/dist/resume-PP2IQM5S.cjs +0 -13
  529. package/dist/search-C56FBN67.cjs +0 -17
  530. package/dist/search-XGZDYBF4.js +0 -17
  531. package/dist/sessions-54KI3F2Q.js +0 -10
  532. package/dist/sessions-DDTSPNVW.cjs +0 -10
  533. package/dist/settings-BDO37TTO.cjs +0 -30
  534. package/dist/settings-FHRDFPLK.js +0 -30
  535. package/dist/share-IERCTBGN.cjs +0 -14
  536. package/dist/share-TGROUE6R.js +0 -14
  537. package/dist/skills-OM4IGBAA.cjs +0 -26
  538. package/dist/skills-S3GRN323.js +0 -26
  539. package/dist/skills-new-ALD2PTHN.js +0 -15
  540. package/dist/skills-new-PWLKK7GW.cjs +0 -15
  541. package/dist/slashCommands-L4ZD33LJ.js +0 -75
  542. package/dist/slashCommands-YY2VUUDF.cjs +0 -75
  543. package/dist/status-3PC5XWSS.cjs +0 -11
  544. package/dist/status-KCLVOYPD.js +0 -11
  545. package/dist/sync-6SDWG5RK.js +0 -18
  546. package/dist/sync-7JMZVEQD.cjs +0 -40
  547. package/dist/sync-WHURZL3U.cjs +0 -18
  548. package/dist/theme-BE5A4FPN.cjs +0 -18
  549. package/dist/theme-YMFCQP7J.js +0 -18
  550. package/dist/undo-KZHUUZTD.cjs +0 -10
  551. package/dist/undo-NEIEHQVX.js +0 -10
@@ -0,0 +1,715 @@
1
+ import {
2
+ AUTOHAND_HOME
3
+ } from "./chunk-TWQDAUZU.js";
4
+
5
+ // src/browser/chrome.ts
6
+ import crypto from "crypto";
7
+ import os from "os";
8
+ import path from "path";
9
+ import fs from "fs-extra";
10
+ import { spawn, spawnSync } from "child_process";
11
+ import open from "open";
12
+ import { execSync } from "child_process";
13
+ var { chmod, ensureDir, pathExists, readFile, readJson, remove, writeFile, writeJson } = fs;
14
+ var CHROME_NATIVE_HOST_NAME = "ai.autohand.rpc";
15
+ var DEFAULT_CHROME_INSTALL_URL = "https://autohand.ai/chrome/installed";
16
+ var DEFAULT_HANDOFF_TTL_MS = 10 * 60 * 1e3;
17
+ var ALL_BROWSERS = ["chrome", "chromium", "brave", "edge"];
18
+ function getChromeHome(homeDir = AUTOHAND_HOME) {
19
+ return path.join(homeDir, "chrome");
20
+ }
21
+ function getBrowserDataRoot(homeDir = AUTOHAND_HOME) {
22
+ return path.join(getChromeHome(homeDir), "native-host");
23
+ }
24
+ function getHandoffDir(homeDir = AUTOHAND_HOME) {
25
+ return path.join(getChromeHome(homeDir), "handoffs");
26
+ }
27
+ function jsString(value) {
28
+ return JSON.stringify(value);
29
+ }
30
+ function jsArray(value) {
31
+ return JSON.stringify(value);
32
+ }
33
+ function normalizeBrowsers(browser) {
34
+ if (!browser || browser === "all") {
35
+ return [...ALL_BROWSERS];
36
+ }
37
+ const value = browser.toLowerCase();
38
+ if (ALL_BROWSERS.includes(value)) {
39
+ return [value];
40
+ }
41
+ throw new Error(`Unsupported browser: ${browser}`);
42
+ }
43
+ function getBrowserLaunchTargets(browser, platform = process.platform) {
44
+ if (platform === "darwin") {
45
+ const targets = {
46
+ chrome: [
47
+ { probe: "/Applications/Google Chrome.app", appName: "Google Chrome", command: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" },
48
+ { probe: path.join(os.homedir(), "Applications", "Google Chrome.app"), appName: "Google Chrome", command: path.join(os.homedir(), "Applications", "Google Chrome.app", "Contents", "MacOS", "Google Chrome") }
49
+ ],
50
+ chromium: [
51
+ { probe: "/Applications/Chromium.app", appName: "Chromium", command: "/Applications/Chromium.app/Contents/MacOS/Chromium" },
52
+ { probe: path.join(os.homedir(), "Applications", "Chromium.app"), appName: "Chromium", command: path.join(os.homedir(), "Applications", "Chromium.app", "Contents", "MacOS", "Chromium") }
53
+ ],
54
+ brave: [
55
+ { probe: "/Applications/Brave Browser.app", appName: "Brave Browser", command: "/Applications/Brave Browser.app/Contents/MacOS/Brave Browser" },
56
+ { probe: path.join(os.homedir(), "Applications", "Brave Browser.app"), appName: "Brave Browser", command: path.join(os.homedir(), "Applications", "Brave Browser.app", "Contents", "MacOS", "Brave Browser") }
57
+ ],
58
+ edge: [
59
+ { probe: "/Applications/Microsoft Edge.app", appName: "Microsoft Edge", command: "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge" },
60
+ { probe: path.join(os.homedir(), "Applications", "Microsoft Edge.app"), appName: "Microsoft Edge", command: path.join(os.homedir(), "Applications", "Microsoft Edge.app", "Contents", "MacOS", "Microsoft Edge") }
61
+ ]
62
+ };
63
+ return targets[browser];
64
+ }
65
+ if (platform === "linux") {
66
+ const targets = {
67
+ chrome: [
68
+ { probe: "google-chrome", appName: "google-chrome", command: "google-chrome" },
69
+ { probe: "google-chrome-stable", appName: "google-chrome", command: "google-chrome-stable" }
70
+ ],
71
+ chromium: [
72
+ { probe: "chromium", appName: "chromium", command: "chromium" },
73
+ { probe: "chromium-browser", appName: "chromium-browser", command: "chromium-browser" }
74
+ ],
75
+ brave: [
76
+ { probe: "brave-browser", appName: "brave-browser", command: "brave-browser" },
77
+ { probe: "brave", appName: "brave", command: "brave" }
78
+ ],
79
+ edge: [
80
+ { probe: "microsoft-edge", appName: "microsoft-edge", command: "microsoft-edge" },
81
+ { probe: "microsoft-edge-stable", appName: "microsoft-edge", command: "microsoft-edge-stable" },
82
+ { probe: "msedge", appName: "msedge", command: "msedge" }
83
+ ]
84
+ };
85
+ return targets[browser];
86
+ }
87
+ if (platform === "win32") {
88
+ const localAppData = process.env.LOCALAPPDATA ?? "";
89
+ const programFiles = process.env["ProgramFiles"] ?? "C:\\Program Files";
90
+ const programFilesX86 = process.env["ProgramFiles(x86)"] ?? "C:\\Program Files (x86)";
91
+ const targets = {
92
+ chrome: [
93
+ { probe: path.join(programFiles, "Google", "Chrome", "Application", "chrome.exe"), appName: "chrome", command: path.join(programFiles, "Google", "Chrome", "Application", "chrome.exe") },
94
+ { probe: path.join(programFilesX86, "Google", "Chrome", "Application", "chrome.exe"), appName: "chrome", command: path.join(programFilesX86, "Google", "Chrome", "Application", "chrome.exe") },
95
+ { probe: path.join(localAppData, "Google", "Chrome", "Application", "chrome.exe"), appName: "chrome", command: path.join(localAppData, "Google", "Chrome", "Application", "chrome.exe") }
96
+ ],
97
+ chromium: [
98
+ { probe: path.join(programFiles, "Chromium", "Application", "chrome.exe"), appName: "chromium", command: path.join(programFiles, "Chromium", "Application", "chrome.exe") },
99
+ { probe: path.join(localAppData, "Chromium", "Application", "chrome.exe"), appName: "chromium", command: path.join(localAppData, "Chromium", "Application", "chrome.exe") }
100
+ ],
101
+ brave: [
102
+ { probe: path.join(programFiles, "BraveSoftware", "Brave-Browser", "Application", "brave.exe"), appName: "brave", command: path.join(programFiles, "BraveSoftware", "Brave-Browser", "Application", "brave.exe") },
103
+ { probe: path.join(programFilesX86, "BraveSoftware", "Brave-Browser", "Application", "brave.exe"), appName: "brave", command: path.join(programFilesX86, "BraveSoftware", "Brave-Browser", "Application", "brave.exe") },
104
+ { probe: path.join(localAppData, "BraveSoftware", "Brave-Browser", "Application", "brave.exe"), appName: "brave", command: path.join(localAppData, "BraveSoftware", "Brave-Browser", "Application", "brave.exe") }
105
+ ],
106
+ edge: [
107
+ { probe: path.join(programFiles, "Microsoft", "Edge", "Application", "msedge.exe"), appName: "msedge", command: path.join(programFiles, "Microsoft", "Edge", "Application", "msedge.exe") },
108
+ { probe: path.join(programFilesX86, "Microsoft", "Edge", "Application", "msedge.exe"), appName: "msedge", command: path.join(programFilesX86, "Microsoft", "Edge", "Application", "msedge.exe") },
109
+ { probe: path.join(localAppData, "Microsoft", "Edge", "Application", "msedge.exe"), appName: "msedge", command: path.join(localAppData, "Microsoft", "Edge", "Application", "msedge.exe") }
110
+ ]
111
+ };
112
+ return targets[browser];
113
+ }
114
+ return [];
115
+ }
116
+ async function defaultBrowserProbe(probe) {
117
+ if (probe.includes(path.sep) || /^[A-Za-z]:\\/.test(probe)) {
118
+ return pathExists(probe);
119
+ }
120
+ const command = process.platform === "win32" ? "where" : "which";
121
+ const result = spawnSync(command, [probe], { stdio: "pipe" });
122
+ return result.status === 0;
123
+ }
124
+ async function resolveBrowserLaunchTarget(browser, platform = process.platform, probe = defaultBrowserProbe) {
125
+ const order = browser === "auto" ? ["chrome", "edge", "brave", "chromium"] : [browser];
126
+ for (const candidateBrowser of order) {
127
+ const targets = getBrowserLaunchTargets(candidateBrowser, platform);
128
+ for (const target of targets) {
129
+ if (await probe(target.probe)) {
130
+ return target.appName;
131
+ }
132
+ }
133
+ }
134
+ return null;
135
+ }
136
+ async function resolveBrowserCommand(browser, platform = process.platform, probe = defaultBrowserProbe) {
137
+ const order = browser === "auto" ? ["chrome", "edge", "brave", "chromium"] : [browser];
138
+ for (const candidateBrowser of order) {
139
+ const targets = getBrowserLaunchTargets(candidateBrowser, platform);
140
+ for (const target of targets) {
141
+ if (await probe(target.probe)) {
142
+ return target.command;
143
+ }
144
+ }
145
+ }
146
+ return null;
147
+ }
148
+ function getBrowserUserDataRoots(platform = process.platform, homeDir = os.homedir()) {
149
+ if (platform === "darwin") {
150
+ return {
151
+ chrome: path.join(homeDir, "Library", "Application Support", "Google", "Chrome"),
152
+ chromium: path.join(homeDir, "Library", "Application Support", "Chromium"),
153
+ brave: path.join(homeDir, "Library", "Application Support", "BraveSoftware", "Brave-Browser"),
154
+ edge: path.join(homeDir, "Library", "Application Support", "Microsoft Edge")
155
+ };
156
+ }
157
+ if (platform === "linux") {
158
+ return {
159
+ chrome: path.join(homeDir, ".config", "google-chrome"),
160
+ chromium: path.join(homeDir, ".config", "chromium"),
161
+ brave: path.join(homeDir, ".config", "BraveSoftware", "Brave-Browser"),
162
+ edge: path.join(homeDir, ".config", "microsoft-edge")
163
+ };
164
+ }
165
+ if (platform === "win32") {
166
+ const localAppData = process.env.LOCALAPPDATA ?? "";
167
+ return {
168
+ chrome: path.join(localAppData, "Google", "Chrome", "User Data"),
169
+ chromium: path.join(localAppData, "Chromium", "User Data"),
170
+ brave: path.join(localAppData, "BraveSoftware", "Brave-Browser", "User Data"),
171
+ edge: path.join(localAppData, "Microsoft", "Edge", "User Data")
172
+ };
173
+ }
174
+ throw new Error(`Unsupported platform: ${platform}`);
175
+ }
176
+ async function detectExtensionProfile(extensionId, browsers = [...ALL_BROWSERS], platform = process.platform, homeDir = os.homedir()) {
177
+ const roots = getBrowserUserDataRoots(platform, homeDir);
178
+ for (const browser of browsers) {
179
+ const userDataDir = roots[browser];
180
+ if (!await pathExists(userDataDir)) {
181
+ continue;
182
+ }
183
+ const entries = await fs.readdir(userDataDir);
184
+ const candidates = entries.filter((entry) => entry === "Default" || entry.startsWith("Profile "));
185
+ for (const profileDirectory of candidates) {
186
+ const packedExtensionPath = path.join(userDataDir, profileDirectory, "Extensions", extensionId);
187
+ const unpackedExtensionPath = path.join(userDataDir, profileDirectory, "Local Extension Settings", extensionId);
188
+ if (await pathExists(packedExtensionPath) || await pathExists(unpackedExtensionPath)) {
189
+ return {
190
+ browser,
191
+ userDataDir,
192
+ profileDirectory
193
+ };
194
+ }
195
+ }
196
+ }
197
+ return null;
198
+ }
199
+ function resolveCliLaunchSpec(cliPath) {
200
+ if (cliPath && cliPath.trim()) {
201
+ return { command: cliPath.trim(), args: [] };
202
+ }
203
+ const argv1 = process.argv[1];
204
+ if (argv1 && path.isAbsolute(argv1) && !argv1.includes("$bunfs")) {
205
+ return {
206
+ command: process.execPath,
207
+ args: [argv1]
208
+ };
209
+ }
210
+ const execBase = path.basename(process.execPath).toLowerCase();
211
+ if (execBase.includes("autohand")) {
212
+ return { command: process.execPath, args: [] };
213
+ }
214
+ return { command: "autohand", args: [] };
215
+ }
216
+ function getManifestTarget(browser, platform = process.platform, homeDir = AUTOHAND_HOME) {
217
+ const hostName = CHROME_NATIVE_HOST_NAME;
218
+ const manifestPath = path.join(getBrowserDataRoot(homeDir), `${browser}.json`);
219
+ if (platform === "darwin") {
220
+ const roots = {
221
+ chrome: path.join(os.homedir(), "Library", "Application Support", "Google", "Chrome", "NativeMessagingHosts"),
222
+ chromium: path.join(os.homedir(), "Library", "Application Support", "Chromium", "NativeMessagingHosts"),
223
+ brave: path.join(os.homedir(), "Library", "Application Support", "BraveSoftware", "Brave-Browser", "NativeMessagingHosts"),
224
+ edge: path.join(os.homedir(), "Library", "Application Support", "Microsoft Edge", "NativeMessagingHosts")
225
+ };
226
+ return {
227
+ browser,
228
+ manifestPath: path.join(roots[browser], `${hostName}.json`),
229
+ registryKey: void 0
230
+ };
231
+ }
232
+ if (platform === "linux") {
233
+ const roots = {
234
+ chrome: path.join(os.homedir(), ".config", "google-chrome", "NativeMessagingHosts"),
235
+ chromium: path.join(os.homedir(), ".config", "chromium", "NativeMessagingHosts"),
236
+ brave: path.join(os.homedir(), ".config", "BraveSoftware", "Brave-Browser", "NativeMessagingHosts"),
237
+ edge: path.join(os.homedir(), ".config", "microsoft-edge", "NativeMessagingHosts")
238
+ };
239
+ return {
240
+ browser,
241
+ manifestPath: path.join(roots[browser], `${hostName}.json`),
242
+ registryKey: void 0
243
+ };
244
+ }
245
+ if (platform === "win32") {
246
+ const registryRoots = {
247
+ chrome: "HKCU\\Software\\Google\\Chrome\\NativeMessagingHosts",
248
+ chromium: "HKCU\\Software\\Chromium\\NativeMessagingHosts",
249
+ brave: "HKCU\\Software\\BraveSoftware\\Brave-Browser\\NativeMessagingHosts",
250
+ edge: "HKCU\\Software\\Microsoft\\Edge\\NativeMessagingHosts"
251
+ };
252
+ return {
253
+ browser,
254
+ manifestPath,
255
+ registryKey: `${registryRoots[browser]}\\${hostName}`
256
+ };
257
+ }
258
+ throw new Error(`Unsupported platform: ${platform}`);
259
+ }
260
+ function buildNativeHostManifest(options) {
261
+ const hostName = options.hostName ?? CHROME_NATIVE_HOST_NAME;
262
+ const allowedOrigins = Array.from(new Set(options.extensionIds.filter(Boolean))).map(
263
+ (extensionId) => `chrome-extension://${extensionId}/`
264
+ );
265
+ return {
266
+ name: hostName,
267
+ description: "Autohand Code native messaging bridge",
268
+ path: options.hostScriptPath,
269
+ type: "stdio",
270
+ allowed_origins: allowedOrigins
271
+ };
272
+ }
273
+ function extensionIdFromAllowedOrigin(origin) {
274
+ const match = /^chrome-extension:\/\/([^/]+)\/$/.exec(origin);
275
+ return match?.[1] ?? null;
276
+ }
277
+ function mergeExtensionIds(extensionIds, allowedOrigins) {
278
+ const existingIds = (allowedOrigins ?? []).map(extensionIdFromAllowedOrigin).filter((id) => Boolean(id));
279
+ return Array.from(new Set([...existingIds, ...extensionIds].filter(Boolean)));
280
+ }
281
+ function resolveNodePath() {
282
+ const execPath = process.execPath;
283
+ const execBase = path.basename(execPath).toLowerCase();
284
+ if (!execBase.includes("bun") && !execBase.includes("autohand")) {
285
+ return execPath;
286
+ }
287
+ const candidates = [
288
+ "/opt/homebrew/bin/node",
289
+ "/usr/local/bin/node",
290
+ "/usr/bin/node",
291
+ path.join(os.homedir(), ".nvm/versions/node"),
292
+ path.join(os.homedir(), ".local/bin/node")
293
+ ];
294
+ for (const candidate of candidates) {
295
+ if (candidate.includes(".nvm")) {
296
+ try {
297
+ const versions = fs.readdirSync(candidate);
298
+ if (versions.length) {
299
+ const latest = versions.sort().pop();
300
+ const nodeBin = path.join(candidate, latest, "bin/node");
301
+ if (fs.existsSync(nodeBin)) return nodeBin;
302
+ }
303
+ } catch {
304
+ }
305
+ continue;
306
+ }
307
+ try {
308
+ if (fs.existsSync(candidate)) return candidate;
309
+ } catch {
310
+ }
311
+ }
312
+ return "/usr/bin/env node";
313
+ }
314
+ function buildNativeHostScript(options) {
315
+ const cliCommand = options.cliCommand;
316
+ const cliArgPrefix = options.cliArgPrefix ?? [];
317
+ const shebang = options.nodePath ?? resolveNodePath();
318
+ return `#!${shebang}
319
+ const { spawn } = require("node:child_process");
320
+ const path = require("node:path");
321
+ const os = require("node:os");
322
+ let child = null;
323
+ let stdinBuffer = Buffer.alloc(0);
324
+ let stdoutBuffer = "";
325
+ let stderrBuffer = "";
326
+ let launchSettings = null;
327
+ const DEFAULT_CLI_COMMAND = ${jsString(cliCommand)};
328
+ const DEFAULT_CLI_ARG_PREFIX = ${jsArray(cliArgPrefix)};
329
+ process.stdin.on("data", handleNativeData);
330
+ process.on("SIGINT", shutdown);
331
+ process.on("SIGTERM", shutdown);
332
+ process.on("exit", shutdown);
333
+ process.on("uncaughtException", (err) => {
334
+ process.stderr.write("[HOST] uncaughtException: " + err.message + "\\n" + err.stack + "\\n");
335
+ shutdown();
336
+ });
337
+ process.stdout.on("error", (err) => {
338
+ process.stderr.write("[HOST] stdout error: " + err.message + "\\n");
339
+ });
340
+ function handleNativeData(chunk) {
341
+ stdinBuffer = Buffer.concat([stdinBuffer, chunk]);
342
+ while (stdinBuffer.length >= 4) {
343
+ const length = stdinBuffer.readUInt32LE(0);
344
+ if (stdinBuffer.length < 4 + length) {
345
+ return;
346
+ }
347
+ const body = stdinBuffer.subarray(4, 4 + length);
348
+ stdinBuffer = stdinBuffer.subarray(4 + length);
349
+ try {
350
+ handleNativeMessage(JSON.parse(body.toString("utf8")));
351
+ } catch (err) {
352
+ process.stderr.write("[HOST] Failed to parse native message: " + (err?.message || String(err)) + "\\n");
353
+ }
354
+ }
355
+ }
356
+ function handleNativeMessage(message) {
357
+ if (message.type === "connect") {
358
+ launchSettings = message.settings || {};
359
+ ensureChild();
360
+ return;
361
+ }
362
+ if (message.type === "shutdown") {
363
+ shutdown();
364
+ return;
365
+ }
366
+ if (message.type === "request") {
367
+ ensureChild();
368
+ child.stdin.write(JSON.stringify(message.payload) + "\\n");
369
+ }
370
+ }
371
+ function ensureChild() {
372
+ if (child) return;
373
+ const cliCommand = launchSettings?.cliPath || DEFAULT_CLI_COMMAND;
374
+ const args = [...DEFAULT_CLI_ARG_PREFIX, "--mode", "rpc"];
375
+ if (launchSettings?.workspacePath) args.push("--path", launchSettings.workspacePath);
376
+ if (launchSettings?.modelOverride) args.push("--model", launchSettings.modelOverride);
377
+ if (launchSettings?.thinkingLevel) args.push("--thinking", launchSettings.thinkingLevel);
378
+ if (launchSettings?.debug) args.push("--debug");
379
+ if (launchSettings?.unrestricted) args.push("--unrestricted");
380
+ if (launchSettings?.restricted) args.push("--restricted");
381
+ if (launchSettings?.autoCommit) args.push("--auto-commit");
382
+ if (launchSettings?.syncSettings === false) args.push("--sync-settings", "false");
383
+ if (launchSettings?.searchEngine) args.push("--search-engine", launchSettings.searchEngine);
384
+ if (launchSettings?.displayLanguage) args.push("--display-language", launchSettings.displayLanguage);
385
+ if (launchSettings?.teammateMode) args.push("--teammate-mode", launchSettings.teammateMode);
386
+ if (launchSettings?.yoloPattern) args.push("--yolo", launchSettings.yoloPattern);
387
+ if (launchSettings?.timeoutSeconds) args.push("--timeout", String(launchSettings.timeoutSeconds));
388
+ if (launchSettings?.contextCompact === false) args.push("--no-context-compact");
389
+ for (const dir of launchSettings?.extraDirs || []) args.push("--add-dir", dir);
390
+ const cwd = launchSettings?.workspacePath || path.join(os.homedir(), 'Desktop');
391
+ child = spawn(cliCommand, args, { env: process.env, stdio: ["pipe", "pipe", "pipe"], cwd });
392
+ child.stdout.on("data", (chunk) => handleCliStdout(chunk.toString("utf8")));
393
+ child.stdout.on("error", (err) => {
394
+ process.stderr.write("[HOST] child.stdout error: " + err.message + "\\n");
395
+ });
396
+ child.stderr.on("data", (chunk) => handleCliStderr(chunk.toString("utf8")));
397
+ child.stderr.on("error", (err) => {
398
+ process.stderr.write("[HOST] child.stderr error: " + err.message + "\\n");
399
+ });
400
+ child.on("exit", (code, signal) => {
401
+ sendNativeMessage({ type: "status", status: "exited", code, signal });
402
+ child = null;
403
+ });
404
+ child.on("error", (err) => {
405
+ process.stderr.write("[HOST] child process error: " + err.message + "\\n");
406
+ sendNativeMessage({ type: "status", status: "spawn-error", error: err.message });
407
+ child = null;
408
+ });
409
+ }
410
+ function handleCliStdout(text) { stdoutBuffer += text; flushLines("stdout"); }
411
+ function handleCliStderr(text) { stderrBuffer += text; flushLines("stderr"); }
412
+ function flushLines(stream) {
413
+ let buffer = stream === "stdout" ? stdoutBuffer : stderrBuffer;
414
+ const lines = buffer.split(/\\r?\\n/);
415
+ buffer = lines.pop() || "";
416
+ for (const line of lines) {
417
+ const trimmed = line.trim();
418
+ if (!trimmed) continue;
419
+ if (trimmed.startsWith("{") && trimmed.endsWith("}")) {
420
+ try {
421
+ sendNativeMessage({ type: "rpc", payload: JSON.parse(trimmed) });
422
+ continue;
423
+ } catch {}
424
+ }
425
+ try {
426
+ sendNativeMessage({ type: "log", stream, line: trimmed });
427
+ } catch (err) {
428
+ process.stderr.write("[HOST] sendNativeMessage(log) failed: " + (err?.message || String(err)) + "\\n");
429
+ }
430
+ }
431
+ if (stream === "stdout") stdoutBuffer = buffer;
432
+ else stderrBuffer = buffer;
433
+ }
434
+ function sendNativeMessage(message) {
435
+ try {
436
+ const body = Buffer.from(JSON.stringify(message), "utf8");
437
+ const header = Buffer.alloc(4);
438
+ header.writeUInt32LE(body.length, 0);
439
+ process.stdout.write(header);
440
+ process.stdout.write(body);
441
+ } catch (err) {
442
+ process.stderr.write("[HOST] sendNativeMessage failed: " + (err?.message || String(err)) + "\\n");
443
+ }
444
+ }
445
+ function shutdown() {
446
+ if (child) {
447
+ child.kill("SIGTERM");
448
+ child = null;
449
+ }
450
+ process.exit(0);
451
+ }
452
+ `;
453
+ }
454
+ async function installNativeHost(options) {
455
+ const homeDir = options.homeDir ?? AUTOHAND_HOME;
456
+ const browsers = options.browsers?.length ? options.browsers : [...ALL_BROWSERS];
457
+ const hostScriptPath = path.join(getBrowserDataRoot(homeDir), "host.js");
458
+ await ensureDir(path.dirname(hostScriptPath));
459
+ const script = buildNativeHostScript({
460
+ cliCommand: options.cliCommand ?? "autohand",
461
+ cliArgPrefix: options.cliArgPrefix ?? []
462
+ });
463
+ await writeFile(hostScriptPath, script, "utf8");
464
+ if (process.platform !== "win32") {
465
+ await chmod(hostScriptPath, 493);
466
+ }
467
+ const targets = [];
468
+ for (const browser of browsers) {
469
+ const target = getManifestTarget(browser, process.platform, homeDir);
470
+ const manifest = buildNativeHostManifest({
471
+ hostName: options.hostName,
472
+ extensionIds: options.extensionIds,
473
+ hostScriptPath
474
+ });
475
+ await ensureDir(path.dirname(target.manifestPath));
476
+ await writeJson(target.manifestPath, manifest, { spaces: 2 });
477
+ if (target.registryKey) {
478
+ const result = spawnSync("reg", ["add", target.registryKey, "/ve", "/t", "REG_SZ", "/d", target.manifestPath, "/f"], {
479
+ stdio: "pipe"
480
+ });
481
+ if (result.status !== 0) {
482
+ const stderr = result.stderr?.toString("utf8") || "";
483
+ throw new Error(`Failed to register native host for ${browser}: ${stderr.trim()}`);
484
+ }
485
+ }
486
+ targets.push({ browser, manifestPath: target.manifestPath, registryKey: target.registryKey });
487
+ }
488
+ return { hostScriptPath, targets };
489
+ }
490
+ async function ensureNativeHostInstalled(options) {
491
+ const homeDir = AUTOHAND_HOME;
492
+ const chromeManifest = getManifestTarget("chrome", process.platform, homeDir);
493
+ const expectedExtensionIds = [options?.extensionId].filter((id) => Boolean(id));
494
+ const expectedAllowedOrigins = expectedExtensionIds.map((extensionId) => `chrome-extension://${extensionId}/`);
495
+ const hostScriptPath = path.join(getBrowserDataRoot(homeDir), "host.js");
496
+ let installExtensionIds = expectedExtensionIds;
497
+ if (await pathExists(chromeManifest.manifestPath)) {
498
+ try {
499
+ const manifest = await readJson(chromeManifest.manifestPath);
500
+ installExtensionIds = mergeExtensionIds(expectedExtensionIds, manifest.allowed_origins);
501
+ if (manifest.path && await pathExists(manifest.path)) {
502
+ const firstLine = (await readFile(manifest.path, "utf8")).split("\n")[0] ?? "";
503
+ const shebangPath = firstLine.replace(/^#!/, "").trim();
504
+ const shebangParts = shebangPath.split(/\s+/).filter(Boolean);
505
+ const commandBase = shebangParts[0]?.split("/").pop()?.toLowerCase() ?? "";
506
+ const envTarget = commandBase === "env" ? shebangParts.slice(1).find((part) => !part.startsWith("-"))?.split("/").pop()?.toLowerCase() ?? "" : commandBase;
507
+ const isValidShebang = envTarget === "node";
508
+ const hasExpectedOrigin = expectedAllowedOrigins.length === 0 || expectedAllowedOrigins.every((origin) => manifest.allowed_origins?.includes(origin));
509
+ const pointsAtManagedHost = path.resolve(manifest.path) === path.resolve(hostScriptPath);
510
+ if (isValidShebang && hasExpectedOrigin && pointsAtManagedHost) {
511
+ return;
512
+ }
513
+ }
514
+ } catch {
515
+ }
516
+ }
517
+ const { command, args } = resolveCliLaunchSpec();
518
+ await installNativeHost({
519
+ extensionIds: installExtensionIds,
520
+ cliCommand: command,
521
+ cliArgPrefix: args.length ? args : void 0
522
+ });
523
+ }
524
+ async function createBrowserHandoff(options) {
525
+ const homeDir = options.homeDir ?? AUTOHAND_HOME;
526
+ const token = crypto.randomUUID();
527
+ const createdAt = (/* @__PURE__ */ new Date()).toISOString();
528
+ const expiresAt = new Date(Date.now() + DEFAULT_HANDOFF_TTL_MS).toISOString();
529
+ const record = {
530
+ token,
531
+ sessionId: options.sessionId,
532
+ workspaceRoot: options.workspaceRoot,
533
+ createdAt,
534
+ expiresAt,
535
+ ...options.socketPath ? { socketPath: options.socketPath } : {}
536
+ };
537
+ await ensureDir(getHandoffDir(homeDir));
538
+ await writeJson(path.join(getHandoffDir(homeDir), `${token}.json`), record, { spaces: 2 });
539
+ return {
540
+ ...record,
541
+ url: buildChromeLaunchUrl({
542
+ token,
543
+ extensionId: options.extensionId,
544
+ installUrl: options.installUrl,
545
+ launchTarget: options.launchTarget
546
+ })
547
+ };
548
+ }
549
+ async function hasActiveHandoff(homeDir = AUTOHAND_HOME) {
550
+ const handoffDir = getHandoffDir(homeDir);
551
+ if (!await pathExists(handoffDir)) return false;
552
+ const entries = await fs.readdir(handoffDir);
553
+ for (const entry of entries) {
554
+ if (!entry.endsWith(".json")) continue;
555
+ try {
556
+ const record = await readJson(path.join(handoffDir, entry));
557
+ if (new Date(record.expiresAt).getTime() > Date.now()) return true;
558
+ } catch {
559
+ }
560
+ }
561
+ return false;
562
+ }
563
+ async function attachBrowserHandoff(token, homeDir = AUTOHAND_HOME) {
564
+ const handoffPath = path.join(getHandoffDir(homeDir), `${token}.json`);
565
+ if (!await pathExists(handoffPath)) {
566
+ return null;
567
+ }
568
+ const record = await readJson(handoffPath);
569
+ if (new Date(record.expiresAt).getTime() < Date.now()) {
570
+ await remove(handoffPath);
571
+ return null;
572
+ }
573
+ await remove(handoffPath);
574
+ return record;
575
+ }
576
+ async function attachLatestBrowserHandoff(homeDir = AUTOHAND_HOME) {
577
+ const handoffDir = getHandoffDir(homeDir);
578
+ if (!await pathExists(handoffDir)) {
579
+ return null;
580
+ }
581
+ const entries = await fs.readdir(handoffDir);
582
+ const records = [];
583
+ for (const entry of entries) {
584
+ if (!entry.endsWith(".json")) {
585
+ continue;
586
+ }
587
+ const recordPath = path.join(handoffDir, entry);
588
+ const record = await readJson(recordPath);
589
+ if (new Date(record.expiresAt).getTime() < Date.now()) {
590
+ await remove(recordPath);
591
+ continue;
592
+ }
593
+ records.push({ path: recordPath, record });
594
+ }
595
+ records.sort((left, right) => {
596
+ return new Date(right.record.createdAt).getTime() - new Date(left.record.createdAt).getTime();
597
+ });
598
+ const latest = records[0];
599
+ if (!latest) {
600
+ return null;
601
+ }
602
+ await remove(latest.path);
603
+ return latest.record;
604
+ }
605
+ function buildChromeOpenUrl(options) {
606
+ if (options.extensionId) {
607
+ return `chrome-extension://${options.extensionId}/sidepanel.html`;
608
+ }
609
+ return options.installUrl || DEFAULT_CHROME_INSTALL_URL;
610
+ }
611
+ function buildChromeLaunchUrl(options) {
612
+ if (options.launchTarget !== "web" && options.extensionId) {
613
+ return `chrome-extension://${options.extensionId}/sidepanel.html?handoff=${encodeURIComponent(options.token)}`;
614
+ }
615
+ const baseUrl = options.installUrl || DEFAULT_CHROME_INSTALL_URL;
616
+ if (!/^https?:\/\//.test(baseUrl)) {
617
+ return baseUrl;
618
+ }
619
+ const separator = baseUrl.includes("?") ? "&" : "?";
620
+ return `${baseUrl}${separator}handoff=${encodeURIComponent(options.token)}`;
621
+ }
622
+ async function openUrl(url) {
623
+ try {
624
+ await open(url);
625
+ return;
626
+ } catch (err) {
627
+ const message = err instanceof Error ? err.message : String(err);
628
+ if (!message.includes("xdg-open") && !message.includes("Executable not found") && !message.includes("ENOENT")) {
629
+ throw err;
630
+ }
631
+ }
632
+ const openers = ["xdg-open", "sensible-browser", "x-www-browser", "firefox", "chromium", "google-chrome"];
633
+ for (const opener of openers) {
634
+ try {
635
+ execSync(`which ${opener}`, { stdio: "pipe" });
636
+ spawn(opener, [url], { detached: true, stdio: "ignore" }).unref();
637
+ return;
638
+ } catch {
639
+ }
640
+ }
641
+ console.log(`
642
+ Unable to open a browser automatically. Please open this URL manually:
643
+ ${url}
644
+ `);
645
+ }
646
+ async function openChromeContinuation(url, browser = "auto", options = {}) {
647
+ if (options.userDataDir || options.profileDirectory) {
648
+ const command = await resolveBrowserCommand(browser);
649
+ if (command) {
650
+ const args = [
651
+ ...options.userDataDir ? [`--user-data-dir=${options.userDataDir}`] : [],
652
+ ...options.profileDirectory ? [`--profile-directory=${options.profileDirectory}`] : [],
653
+ url
654
+ ];
655
+ const child = spawn(command, args, {
656
+ detached: true,
657
+ stdio: "ignore"
658
+ });
659
+ child.unref();
660
+ return;
661
+ }
662
+ }
663
+ const appName = await resolveBrowserLaunchTarget(browser);
664
+ if (!appName) {
665
+ await open(url);
666
+ return;
667
+ }
668
+ try {
669
+ await open(url, { app: { name: appName } });
670
+ } catch (err) {
671
+ const message = err instanceof Error ? err.message : String(err);
672
+ if (message.includes("xdg-open") || message.includes("Executable not found") || message.includes("ENOENT")) {
673
+ await open(url);
674
+ } else {
675
+ throw err;
676
+ }
677
+ }
678
+ }
679
+ function applyChromeSettings(config, updates) {
680
+ config.chrome = {
681
+ ...config.chrome ?? {},
682
+ ...updates
683
+ };
684
+ return config;
685
+ }
686
+
687
+ export {
688
+ CHROME_NATIVE_HOST_NAME,
689
+ DEFAULT_CHROME_INSTALL_URL,
690
+ DEFAULT_HANDOFF_TTL_MS,
691
+ normalizeBrowsers,
692
+ resolveBrowserLaunchTarget,
693
+ resolveBrowserCommand,
694
+ detectExtensionProfile,
695
+ resolveCliLaunchSpec,
696
+ getManifestTarget,
697
+ buildNativeHostManifest,
698
+ buildNativeHostScript,
699
+ installNativeHost,
700
+ ensureNativeHostInstalled,
701
+ createBrowserHandoff,
702
+ hasActiveHandoff,
703
+ attachBrowserHandoff,
704
+ attachLatestBrowserHandoff,
705
+ buildChromeOpenUrl,
706
+ buildChromeLaunchUrl,
707
+ openUrl,
708
+ openChromeContinuation,
709
+ applyChromeSettings
710
+ };
711
+ /**
712
+ * @license
713
+ * Copyright 2026 Autohand AI LLC
714
+ * SPDX-License-Identifier: Apache-2.0
715
+ */