autohand-cli 0.8.3 → 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 (510) hide show
  1. package/README.md +173 -74
  2. package/dist/AgentRegistry-EGBDIUAK.cjs +10 -0
  3. package/dist/{AgentRegistry-ODDXPAFR.js → AgentRegistry-XPWSVO3Q.js} +2 -2
  4. package/dist/{AutomodeManager-EOVHGRPP.js → AutomodeManager-APLLPEYJ.js} +31 -17
  5. package/dist/{AutomodeManager-6ATBE7Q5.cjs → AutomodeManager-MPSXT2RH.cjs} +38 -24
  6. package/dist/CommunitySkillsCache-2OIUV227.cjs +8 -0
  7. package/dist/{CommunitySkillsCache-QLE57BN5.js → CommunitySkillsCache-ZEQWP6YM.js} +2 -2
  8. package/dist/GitHubRegistryFetcher-CYJLF2XL.cjs +7 -0
  9. package/dist/{GitHubRegistryFetcher-NT5GFZXS.js → GitHubRegistryFetcher-J2BWPXJF.js} +1 -1
  10. package/dist/{HookManager-B2F35M27.js → HookManager-CWLTFKWO.js} +1 -1
  11. package/dist/{HookManager-PFAFE3FK.cjs → HookManager-TMAJQU4S.cjs} +2 -2
  12. package/dist/{ImportWizard-CJRZPPHL.cjs → ImportWizard-MQXEED2U.cjs} +37 -13
  13. package/dist/{ImportWizard-OHRKBANZ.js → ImportWizard-QBKQEXDW.js} +33 -9
  14. package/dist/LearnAdvisor-46FG2XIP.js +9 -0
  15. package/dist/LearnAdvisor-XBRDNAGH.cjs +9 -0
  16. package/dist/{McpClientManager-NQ3EW2IF.cjs → McpClientManager-BNSKLHIN.cjs} +2 -2
  17. package/dist/{McpClientManager-VBIMGKXU.js → McpClientManager-SL35BR24.js} +1 -1
  18. package/dist/MemoryManager-34L4YOKA.cjs +8 -0
  19. package/dist/{MemoryManager-2LAT7IHS.js → MemoryManager-WJMLPWGU.js} +2 -2
  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-7NQHRCHY.js → PermissionManager-KMYILJ4Z.js} +3 -3
  24. package/dist/{ProjectProfiler-UG42W6WD.cjs → ProjectProfiler-CDAE7ECW.cjs} +1 -0
  25. package/dist/{ProjectProfiler-P4QJQWWA.js → ProjectProfiler-NZTJDRHD.js} +1 -0
  26. package/dist/ProviderFactory-C3YPXTDD.cjs +11 -0
  27. package/dist/{ProviderFactory-2IYJ5OPW.js → ProviderFactory-HFPRVQ25.js} +3 -1
  28. package/dist/{SessionManager-4U4JFQ3C.js → SessionManager-PNBTJJTQ.js} +2 -2
  29. package/dist/SessionManager-WAPTFMDO.cjs +10 -0
  30. package/dist/{SkillsRegistry-RFEINXRT.js → SkillsRegistry-4RRD5GMX.js} +2 -2
  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-B5RT2ECG.js → SyncApiClient-LRPFNCKJ.js} +1 -1
  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-TUJM3PG5.js → add-dir-VFX7QT4E.js} +3 -2
  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-LQEVQFIH.js → autoSkill-EFMK6WU6.js} +2 -2
  57. package/dist/autoSkill-YOLLFTP2.cjs +20 -0
  58. package/dist/{automode-R6P3VHLS.js → automode-BMYSRM34.js} +2 -2
  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/chrome-ATC4OO5I.cjs +20 -0
  63. package/dist/chrome-NHJ44WUN.js +50 -0
  64. package/dist/chrome-O62WXV7F.js +20 -0
  65. package/dist/chrome-XHJLCO4M.cjs +50 -0
  66. package/dist/chromeSkill-53TH55PM.js +105 -0
  67. package/dist/chromeSkill-THW7N4IY.cjs +105 -0
  68. package/dist/{chunk-EGPXJERY.cjs → chunk-2CGE7ZV3.cjs} +26 -26
  69. package/dist/chunk-2H5O745H.js +63 -0
  70. package/dist/chunk-2HOLOHVK.js +2219 -0
  71. package/dist/{chunk-3PDTTAKJ.js → chunk-2QL6MNXG.js} +15 -8
  72. package/dist/{chunk-U55TWFJI.cjs → chunk-2VHB43IX.cjs} +24 -6
  73. package/dist/{chunk-VG34MG2U.js → chunk-37M5UM6I.js} +9 -6
  74. package/dist/{chunk-KLWJIPU2.cjs → chunk-3DDL2E55.cjs} +20 -16
  75. package/dist/chunk-3EDDDZS2.cjs +5 -0
  76. package/dist/{chunk-2UC22DJU.js → chunk-3GUEUCZK.js} +28 -4
  77. package/dist/{chunk-DVUHHH3B.cjs → chunk-3KLSNNRW.cjs} +4 -4
  78. package/dist/chunk-3LJJG5YY.cjs +387 -0
  79. package/dist/chunk-3OF56EMA.cjs +197 -0
  80. package/dist/chunk-3PXKRVCW.js +108 -0
  81. package/dist/{chunk-ADUFCS4Q.cjs → chunk-3S563FNF.cjs} +160 -79
  82. package/dist/chunk-3UT7R3XV.js +663 -0
  83. package/dist/chunk-4256YRCO.cjs +80 -0
  84. package/dist/chunk-46C73ZKK.cjs +663 -0
  85. package/dist/chunk-46MTALKD.js +44 -0
  86. package/dist/{chunk-AEJH23FO.cjs → chunk-47PHDKNW.cjs} +6 -6
  87. package/dist/chunk-4LMUDS2K.js +124 -0
  88. package/dist/{chunk-HLHTG5ZU.cjs → chunk-5CMYEM3R.cjs} +14 -12
  89. package/dist/{chunk-MBBY4ZIK.js → chunk-5F6ZKSHO.js} +4 -1
  90. package/dist/chunk-5JFTY3VU.js +74 -0
  91. package/dist/chunk-5JTTM5SC.js +59 -0
  92. package/dist/{chunk-IETRBBMP.cjs → chunk-5K3CDSWZ.cjs} +108 -31
  93. package/dist/{chunk-GJH7XMSK.js → chunk-5VHP6HDQ.js} +8 -6
  94. package/dist/{chunk-6ZCULLCA.js → chunk-62RTC3XX.js} +1 -1
  95. package/dist/{chunk-64H4FRM3.cjs → chunk-6GUODJKM.cjs} +32 -34
  96. package/dist/{chunk-47CKWKEX.cjs → chunk-6HH236FV.cjs} +9 -4
  97. package/dist/{chunk-WHE2SWHU.js → chunk-6NVAK6CK.js} +2 -2
  98. package/dist/chunk-6R25D2H5.js +121 -0
  99. package/dist/{chunk-OUZQXMHL.cjs → chunk-6XVVIY54.cjs} +55 -25
  100. package/dist/{chunk-3L53OA4E.cjs → chunk-75EDROHL.cjs} +10 -10
  101. package/dist/{chunk-G4CAKI3V.js → chunk-7HPWMALN.js} +7 -2
  102. package/dist/chunk-7JLT2VNW.cjs +18963 -0
  103. package/dist/chunk-7LWQCE4Y.cjs +987 -0
  104. package/dist/{chunk-OLSBBZW6.cjs → chunk-7MU7LWF3.cjs} +5 -5
  105. package/dist/{chunk-TUD3Z3BD.js → chunk-7RFJB75Y.js} +140 -59
  106. package/dist/{chunk-X2MSVKDV.js → chunk-A7HHCIDQ.js} +2 -2
  107. package/dist/{chunk-SKYG33B2.cjs → chunk-AC7DZ6SK.cjs} +3 -3
  108. package/dist/{chunk-XX2ZO7DS.js → chunk-ACDQGA4Z.js} +90 -16
  109. package/dist/{chunk-CZXGCVTR.cjs → chunk-AOKCI722.cjs} +2 -2
  110. package/dist/chunk-ARBEHFCG.js +715 -0
  111. package/dist/{chunk-OOKY3HPZ.js → chunk-AT7OWLY5.js} +50 -9
  112. package/dist/chunk-AU6JAGZJ.cjs +231 -0
  113. package/dist/chunk-AUFNACED.js +18963 -0
  114. package/dist/{chunk-N2BLVUPM.cjs → chunk-AUYSIEVV.cjs} +3 -3
  115. package/dist/chunk-B4HSNOIH.cjs +354 -0
  116. package/dist/{chunk-EGMZDTSL.js → chunk-B5CGDNMR.js} +10 -2
  117. package/dist/{chunk-FTYY5JJD.js → chunk-BFQDQRDE.js} +2 -2
  118. package/dist/{chunk-2AA5MFES.js → chunk-BL2UC7HC.js} +8 -5
  119. package/dist/{chunk-T2M64VHA.cjs → chunk-BQ22N3TX.cjs} +56 -41
  120. package/dist/chunk-BQU3HAE7.js +21 -0
  121. package/dist/chunk-BWF4VDYE.js +3897 -0
  122. package/dist/chunk-BYE7RQFZ.cjs +121 -0
  123. package/dist/{chunk-APIXPPMT.js → chunk-CBFH2J3O.js} +855 -33
  124. package/dist/chunk-CCVMREXI.js +420 -0
  125. package/dist/chunk-CFAWTLSC.js +13 -0
  126. package/dist/{chunk-G27PQQFD.js → chunk-CFFE4VA3.js} +1 -1
  127. package/dist/{chunk-ZYQMLKOK.cjs → chunk-CH2J4PVE.cjs} +212 -70
  128. package/dist/{chunk-7BTSG4ME.cjs → chunk-CHI52KFR.cjs} +855 -33
  129. package/dist/{chunk-DJDE4DTT.cjs → chunk-CWINVFRI.cjs} +25 -19
  130. package/dist/{chunk-HXGBSJL5.cjs → chunk-D2OSPLYC.cjs} +2 -2
  131. package/dist/{chunk-GBHDROGL.js → chunk-D6GZBSOX.js} +16 -4
  132. package/dist/{chunk-CNBKZEX5.cjs → chunk-DA7NBAJK.cjs} +49 -17
  133. package/dist/chunk-DEQVRSV5.cjs +866 -0
  134. package/dist/{chunk-RGR6ME5J.cjs → chunk-DI57A4BX.cjs} +25 -28
  135. package/dist/{chunk-K2C56QGS.cjs → chunk-DIZTWFVR.cjs} +1499 -482
  136. package/dist/{chunk-YZXUDM5X.js → chunk-DLP436GI.js} +204 -62
  137. package/dist/{chunk-OHUZKDGX.js → chunk-DMRXF5DU.js} +3 -3
  138. package/dist/{chunk-U46VYPLR.cjs → chunk-DPSIGY6L.cjs} +9 -9
  139. package/dist/{chunk-SEKD5FH3.cjs → chunk-E26KKI46.cjs} +5 -2
  140. package/dist/{chunk-SJAVBCOA.js → chunk-E46DJH5S.js} +3 -3
  141. package/dist/{chunk-DV2ZHK7B.cjs → chunk-E6GFD7VR.cjs} +49 -26
  142. package/dist/chunk-ES2HJQ4N.js +37 -0
  143. package/dist/chunk-EZJHLOWP.js +80 -0
  144. package/dist/chunk-FFBDRUO5.cjs +59 -0
  145. package/dist/{chunk-SV2WA57F.js → chunk-FGT6KK6T.js} +38 -15
  146. package/dist/{chunk-SAHBLB3E.js → chunk-FP46B4X3.js} +208 -3
  147. package/dist/{chunk-QXH5RCFI.js → chunk-FQAVGSPW.js} +2 -2
  148. package/dist/chunk-FQVG6ZHF.js +197 -0
  149. package/dist/chunk-GBMDFWJX.cjs +152 -0
  150. package/dist/{chunk-NAGQ2PDC.js → chunk-GGLKUENP.js} +1453 -436
  151. package/dist/{chunk-S52YW5ZQ.js → chunk-GNBBIAMD.js} +16 -19
  152. package/dist/{chunk-MYISNQH4.js → chunk-GWO66KBI.js} +1 -1
  153. package/dist/chunk-GWY26SUD.cjs +63 -0
  154. package/dist/{chunk-YGN4CQIP.js → chunk-GZ6DV2UG.js} +1 -1
  155. package/dist/{chunk-EZMINVLU.js → chunk-H4D2Q2AL.js} +5 -2
  156. package/dist/{chunk-3WVJEL7K.cjs → chunk-HDK2EHVH.cjs} +3 -1
  157. package/dist/chunk-HJIXWGQZ.js +139 -0
  158. package/dist/{chunk-ULDM2SNB.js → chunk-HKYZSUQ5.js} +48 -47
  159. package/dist/{chunk-LQGVEP3E.js → chunk-HQUSEWT4.js} +45 -13
  160. package/dist/{chunk-HTLINWX6.cjs → chunk-HQWQZML5.cjs} +16 -13
  161. package/dist/{chunk-DVZOENQ7.cjs → chunk-HS4USDND.cjs} +9 -4
  162. package/dist/chunk-HSCUPEA4.cjs +3897 -0
  163. package/dist/{chunk-JCLYQ2JC.js → chunk-HXJEGMGB.js} +12 -6
  164. package/dist/{chunk-LJFUXC56.cjs → chunk-HXQREVTA.cjs} +9 -6
  165. package/dist/{chunk-N7LI55V4.js → chunk-I24CWKKK.js} +15 -8
  166. package/dist/chunk-IAGCRVJ3.js +355 -0
  167. package/dist/chunk-IEXKKKOF.cjs +92 -0
  168. package/dist/{chunk-5IXII4HX.cjs → chunk-IGMPWJ2I.cjs} +19 -12
  169. package/dist/chunk-IKUMVBCW.cjs +33 -0
  170. package/dist/{chunk-XTB6VJVQ.cjs → chunk-J2K57QM7.cjs} +6 -6
  171. package/dist/{chunk-56SWIDEL.cjs → chunk-J5ADZN6V.cjs} +57 -56
  172. package/dist/chunk-J5HE6CUM.cjs +124 -0
  173. package/dist/{chunk-LIEXWM2M.js → chunk-JAQO6XDB.js} +19 -1
  174. package/dist/chunk-JIMSII7R.js +987 -0
  175. package/dist/chunk-JJ4KA7HK.cjs +2219 -0
  176. package/dist/{chunk-ZLSGXMGQ.js → chunk-JMN3GZU6.js} +2 -0
  177. package/dist/{chunk-X5VSP65C.cjs → chunk-JP3YHTQ2.cjs} +4 -4
  178. package/dist/{chunk-SKV2F3NM.js → chunk-JYKPWK5O.js} +1 -1
  179. package/dist/{chunk-NNPAM4HC.cjs → chunk-KNTUI4TZ.cjs} +12 -6
  180. package/dist/{chunk-HIVRCQS2.js → chunk-L4F7SUYL.js} +56 -25
  181. package/dist/{chunk-C5IJIM2V.cjs → chunk-LDJQ5QHG.cjs} +68 -37
  182. package/dist/{chunk-ULQ6MDSJ.cjs → chunk-LFDPTJYF.cjs} +43 -35
  183. package/dist/chunk-LJD7KR3L.cjs +44 -0
  184. package/dist/chunk-LN7D3EJZ.js +387 -0
  185. package/dist/{chunk-KANW6OYC.cjs → chunk-LQBONA55.cjs} +32 -8
  186. package/dist/{chunk-NCC6ETZS.js → chunk-LUMV3DB2.js} +41 -33
  187. package/dist/chunk-M4KNC5BQ.js +78 -0
  188. package/dist/chunk-MO4KP6XS.cjs +229 -0
  189. package/dist/{chunk-BVKXEQVG.cjs → chunk-MOJ7ADW4.cjs} +22 -10
  190. package/dist/chunk-MPULXVC4.cjs +715 -0
  191. package/dist/{chunk-VEKDGU2Q.cjs → chunk-MQESBFBZ.cjs} +46 -23
  192. package/dist/chunk-MUNUUFU7.cjs +21 -0
  193. package/dist/{chunk-ZSPXQYG2.js → chunk-MX75JYIY.js} +7 -5
  194. package/dist/chunk-MXVIDIC6.cjs +139 -0
  195. package/dist/{chunk-3K2ESU53.cjs → chunk-N6O3XUZ2.cjs} +2 -2
  196. package/dist/{chunk-BYONM7UM.js → chunk-NBGOIFKP.js} +265 -18
  197. package/dist/{chunk-SLQAYV3W.js → chunk-NMQ47RCG.js} +8 -2
  198. package/dist/{chunk-JYTDYJVW.js → chunk-O64I2GYI.js} +1 -1
  199. package/dist/{chunk-IFFXSTOM.cjs → chunk-O6TQP7U7.cjs} +3 -3
  200. package/dist/{chunk-AYS2ASM7.js → chunk-OHWMWKJQ.js} +1 -1
  201. package/dist/{chunk-N23UAW4I.js → chunk-OM24WXEE.js} +7 -2
  202. package/dist/{chunk-NAJ4IZKD.cjs → chunk-OPNI6O7F.cjs} +8 -6
  203. package/dist/chunk-OR67YXQK.cjs +13 -0
  204. package/dist/{chunk-XVUHNWMX.js → chunk-OV3PVUYN.js} +17 -19
  205. package/dist/{chunk-TNZRZQ7Q.js → chunk-PB7W7R72.js} +3 -78
  206. package/dist/chunk-PCM3N3CL.cjs +37 -0
  207. package/dist/{chunk-A4IJHHV7.cjs → chunk-PDHT7LQS.cjs} +52 -11
  208. package/dist/{chunk-HPHJ73GU.cjs → chunk-PHJO5YAL.cjs} +9 -9
  209. package/dist/{chunk-KPELYZ6L.js → chunk-PQLKJCIE.js} +2 -2
  210. package/dist/chunk-PUD76XQT.cjs +78 -0
  211. package/dist/chunk-Q2IL4DDI.cjs +355 -0
  212. package/dist/{chunk-WPVWQSL7.cjs → chunk-Q6AC3PHY.cjs} +16 -13
  213. package/dist/{chunk-XRZEUWKF.js → chunk-QCHIDZBA.js} +1 -1
  214. package/dist/chunk-QKP772OZ.js +4291 -0
  215. package/dist/chunk-QQ7PANOP.js +59 -0
  216. package/dist/{chunk-YHD6TUIR.cjs → chunk-QW2RW2GY.cjs} +2 -0
  217. package/dist/chunk-RAKO7UN7.js +114 -0
  218. package/dist/chunk-RBHANOYY.js +33 -0
  219. package/dist/chunk-RBZ7AFX7.cjs +29 -0
  220. package/dist/{chunk-GCXYXLRA.cjs → chunk-REMGR23V.cjs} +46 -49
  221. package/dist/chunk-ROLA6EFO.cjs +85 -0
  222. package/dist/{chunk-RDF37HKB.cjs → chunk-SOLBYSLY.cjs} +3 -2
  223. package/dist/{chunk-KQGPTCQJ.js → chunk-SWCQM52V.js} +68 -25
  224. package/dist/{chunk-L3TWPROA.js → chunk-TBOLJDUG.js} +39 -24
  225. package/dist/chunk-TH26BQJG.js +101 -0
  226. package/dist/{chunk-245KJE5Y.cjs → chunk-TJNBASFD.cjs} +14 -6
  227. package/dist/chunk-TKKN34TV.js +229 -0
  228. package/dist/chunk-TQ33WBY5.cjs +74 -0
  229. package/dist/{chunk-EGFT4PGW.js → chunk-TWQDAUZU.js} +5 -2
  230. package/dist/{chunk-J2GSFVUV.cjs → chunk-TXPSTCG7.cjs} +74 -59
  231. package/dist/{chunk-5K6NGAVM.js → chunk-U4C3HW6P.js} +67 -52
  232. package/dist/{chunk-3WICOC33.js → chunk-UEIXJG45.js} +105 -81
  233. package/dist/{chunk-22D2CNTP.cjs → chunk-UGFVM77J.cjs} +5 -2
  234. package/dist/chunk-UOQECODR.js +34 -0
  235. package/dist/chunk-UR27UDTB.js +354 -0
  236. package/dist/chunk-UWFG2R2I.cjs +420 -0
  237. package/dist/{chunk-Y72HH2TF.cjs → chunk-UXLW45ZE.cjs} +102 -28
  238. package/dist/{chunk-FPHU2ES6.cjs → chunk-VBOFPU5M.cjs} +6 -0
  239. package/dist/{chunk-NTSDP2WB.js → chunk-VDWJMWDF.js} +54 -24
  240. package/dist/{chunk-3O3MOK5C.cjs → chunk-VGEV44V2.cjs} +944 -133
  241. package/dist/{chunk-IDFF5J2E.js → chunk-VKBIE6I6.js} +38 -7
  242. package/dist/{chunk-HBZU3RBZ.js → chunk-VRMZO6TB.js} +31 -8
  243. package/dist/chunk-VUGOOGHB.js +400 -0
  244. package/dist/chunk-WBU4Q4GS.cjs +400 -0
  245. package/dist/chunk-WGLBC5AY.cjs +59 -0
  246. package/dist/{chunk-KWXVKLQ5.cjs → chunk-WGNMOVMT.cjs} +7 -82
  247. package/dist/{chunk-RKJTGGMU.cjs → chunk-WKRDBCP2.cjs} +221 -16
  248. package/dist/chunk-WRTXCQ3V.cjs +4291 -0
  249. package/dist/chunk-WTB7AFL6.cjs +101 -0
  250. package/dist/{chunk-NDMIPTV4.js → chunk-WZV6UVPY.js} +8 -3
  251. package/dist/chunk-XF2WIKHR.cjs +34 -0
  252. package/dist/{chunk-W7RYQJLO.cjs → chunk-XGMI6IYB.cjs} +46 -15
  253. package/dist/{chunk-NA6WQDYW.js → chunk-XIVFAD2L.js} +918 -107
  254. package/dist/chunk-XV2HXRHX.js +85 -0
  255. package/dist/{chunk-3VTAFAL2.js → chunk-Y3M2DABP.js} +16 -12
  256. package/dist/{chunk-QNGEW5TC.js → chunk-YV63VW4K.js} +1 -1
  257. package/dist/{chunk-UJ2JSM6H.js → chunk-YVQI26H4.js} +2 -0
  258. package/dist/{chunk-X2YOZQIP.cjs → chunk-YWTIXHU6.cjs} +266 -19
  259. package/dist/chunk-YZWE7XSM.js +5 -0
  260. package/dist/{chunk-TUAITHWL.js → chunk-Z3XSSF7B.js} +2 -1
  261. package/dist/{chunk-6UJMCWRY.js → chunk-Z4LIPMPM.js} +6 -0
  262. package/dist/chunk-ZASDSY7P.cjs +114 -0
  263. package/dist/{chunk-R33VKSH5.cjs → chunk-ZHJ7JGME.cjs} +11 -11
  264. package/dist/chunk-ZPD2AO3U.js +866 -0
  265. package/dist/{chunk-7UOUW76C.js → chunk-ZQAT5VT5.js} +101 -24
  266. package/dist/chunk-ZR46OJNZ.js +152 -0
  267. package/dist/{chunk-7TQH3CL4.cjs → chunk-ZZ63NW7A.cjs} +78 -35
  268. package/dist/clear-33TWQ2ES.cjs +12 -0
  269. package/dist/{clear-A3N4GK2S.js → clear-OFLFQ3MR.js} +3 -3
  270. package/dist/{communityInstaller-LOP2EDH5.js → communityInstaller-COB2KTOW.js} +8 -5
  271. package/dist/communityInstaller-TWMGPSYM.cjs +22 -0
  272. package/dist/completion-IIZMHXYP.cjs +17 -0
  273. package/dist/completion-PT4VM2H2.js +17 -0
  274. package/dist/config-KL6WU7R2.cjs +20 -0
  275. package/dist/{config-HPJPKTO6.js → config-R4O7GBTY.js} +6 -4
  276. package/dist/{constants-LISJW3DD.js → constants-HVCHVQAF.js} +1 -1
  277. package/dist/constants-RLMJ5D5P.cjs +21 -0
  278. package/dist/{defaultHooks-IHSJR2AX.cjs → defaultHooks-2V2CQL63.cjs} +25 -10
  279. package/dist/{defaultHooks-KUKHK3AG.js → defaultHooks-TMHDU3FS.js} +25 -10
  280. package/dist/export-3PK3VFCE.js +15 -0
  281. package/dist/export-WLGNWEMJ.cjs +15 -0
  282. package/dist/feedback-G635NCLJ.js +18 -0
  283. package/dist/feedback-LLMK3TZH.cjs +18 -0
  284. package/dist/fffSearchProvider-2YCNKOYD.js +412 -0
  285. package/dist/fffSearchProvider-W6627E2V.cjs +412 -0
  286. package/dist/{filesystem-Z7BWAWMZ.js → filesystem-L6DQKGWK.js} +3 -2
  287. package/dist/filesystem-PGUPCMVK.cjs +11 -0
  288. package/dist/help-BAXLP2M2.cjs +12 -0
  289. package/dist/{help-GFQXNZOK.js → help-X3OAZ3CY.js} +2 -2
  290. package/dist/history-6HOJSEMT.cjs +14 -0
  291. package/dist/{history-E3N6BJP7.js → history-YKFPHBJN.js} +2 -2
  292. package/dist/hooks-7TA4PIIB.js +18 -0
  293. package/dist/hooks-XVFU67T2.cjs +18 -0
  294. package/dist/{i18n-SY7QRM22.js → i18n-2KBUU7XL.js} +1 -1
  295. package/dist/i18n-MUJMKTFM.cjs +33 -0
  296. package/dist/ide-CCQ33PGC.cjs +15 -0
  297. package/dist/ide-VLVFBZ5F.js +15 -0
  298. package/dist/immediateCommandRouter-MTEHZXQX.js +15 -0
  299. package/dist/immediateCommandRouter-ROXU3MWT.cjs +15 -0
  300. package/dist/{import-W7SVLSTC.js → import-4CHYLS4K.js} +3 -3
  301. package/dist/{import-ADI37ZUR.cjs → import-I7T4ZHYL.cjs} +3 -3
  302. package/dist/import-J46F54JY.cjs +10 -0
  303. package/dist/{import-KGKKZ3B7.js → import-JWPYKXCZ.js} +2 -2
  304. package/dist/index.cjs +744 -23015
  305. package/dist/index.d.cts +93 -0
  306. package/dist/index.d.ts +93 -0
  307. package/dist/index.js +780 -23051
  308. package/dist/{init-7MFK626E.js → init-262MWZV4.js} +2 -2
  309. package/dist/init-EE5Y7RBL.cjs +10 -0
  310. package/dist/inkMode-VUE6ZDLD.cjs +7 -0
  311. package/dist/inkMode-WBNFOSAT.js +7 -0
  312. package/dist/inputPrompt-IIFKCX5Q.cjs +90 -0
  313. package/dist/inputPrompt-YGBHDUEP.js +90 -0
  314. package/dist/language-CVLPB7OV.js +21 -0
  315. package/dist/language-ZTWFHUSV.cjs +21 -0
  316. package/dist/learn-PON7I5QS.js +23 -0
  317. package/dist/learn-XLRSVNA3.cjs +23 -0
  318. package/dist/login-223QTGBG.cjs +26 -0
  319. package/dist/login-6IKTBUBY.js +26 -0
  320. package/dist/logout-RN2AG6SI.js +23 -0
  321. package/dist/logout-U3M4FFX7.cjs +23 -0
  322. package/dist/mcp-5O6PUL4G.js +20 -0
  323. package/dist/mcp-NUQ76QQB.cjs +20 -0
  324. package/dist/{mcp-install-2FEROZTL.js → mcp-install-6XWXLFVY.js} +17 -10
  325. package/dist/{mcp-install-WM6BQRI5.cjs → mcp-install-P6DHES7V.cjs} +21 -14
  326. package/dist/memory-CYMDQ2YC.cjs +10 -0
  327. package/dist/{memory-J73WZH2I.js → memory-Q54CESNM.js} +2 -2
  328. package/dist/{model-AES267IN.js → model-6AJ77PJG.js} +2 -2
  329. package/dist/model-IDRCKDML.cjs +10 -0
  330. package/dist/new-7LEWOUF2.cjs +12 -0
  331. package/dist/{new-5CLF3MKH.js → new-ZXHEWC2S.js} +3 -3
  332. package/dist/onboarding-FXX7YHSJ.cjs +35 -0
  333. package/dist/onboarding-JYNMK6NI.js +35 -0
  334. package/dist/permissions-YBNSANIA.cjs +10 -0
  335. package/dist/permissions-YHJMVA6L.js +10 -0
  336. package/dist/plan-XEJMOT55.cjs +13 -0
  337. package/dist/{plan-65HMS5HQ.js → plan-YYUAXPTL.js} +3 -1
  338. package/dist/pr-review-CW6J7P62.cjs +9 -0
  339. package/dist/pr-review-YZSBQVT2.js +9 -0
  340. package/dist/quit-B43SJ6E4.cjs +10 -0
  341. package/dist/{quit-XDZYRSPU.js → quit-GWTNHQSP.js} +2 -2
  342. package/dist/rawMode-6W5AXAKI.cjs +7 -0
  343. package/dist/rawMode-GFNLXQPU.js +7 -0
  344. package/dist/{registry-PTHWERKC.js → registry-34GL6BNJ.js} +29 -44
  345. package/dist/{registry-IVT4G2RT.cjs → registry-V24W7YK6.cjs} +65 -80
  346. package/dist/repeat-P4FAPE3Y.cjs +17 -0
  347. package/dist/{repeat-EVCWUL6Z.js → repeat-RALE6AUO.js} +7 -3
  348. package/dist/resume-DYVOQN5L.cjs +16 -0
  349. package/dist/resume-M25UQKOX.js +16 -0
  350. package/dist/review-QHP2KP4Q.js +9 -0
  351. package/dist/review-UWHWQHCB.cjs +9 -0
  352. package/dist/ripgrep-67SCU2BA.cjs +9 -0
  353. package/dist/ripgrep-VHJQQ55W.js +9 -0
  354. package/dist/rpc-NPS3PU4O.cjs +3730 -0
  355. package/dist/rpc-S3DGW6KV.js +3730 -0
  356. package/dist/search-CPX4PWHP.js +20 -0
  357. package/dist/search-VUF3M4N3.cjs +20 -0
  358. package/dist/{sessions-6GWEBMKS.js → sessions-IYAXMK23.js} +2 -2
  359. package/dist/sessions-JODKER5D.cjs +10 -0
  360. package/dist/{settings-BXR6SBJP.js → settings-55BNW6BF.js} +11 -8
  361. package/dist/settings-BKTS7OMC.cjs +33 -0
  362. package/dist/setup-IRC5HQG2.js +29 -0
  363. package/dist/setup-MMQ7TWOP.cjs +29 -0
  364. package/dist/share-6JRQECAH.cjs +17 -0
  365. package/dist/share-YM5MJKMO.js +17 -0
  366. package/dist/{skills-PG542VEB.cjs → skills-GGMZOVIE.cjs} +13 -10
  367. package/dist/skills-LWSOKOSH.cjs +29 -0
  368. package/dist/{skills-ZZCIAS7C.js → skills-MVIZNHT4.js} +12 -9
  369. package/dist/skills-VWOMV3CR.js +29 -0
  370. package/dist/{skills-install-SRC3Z2MS.js → skills-install-QBA5RCV6.js} +21 -70
  371. package/dist/{skills-install-67DOBPJC.cjs → skills-install-VTAMCNNY.cjs} +34 -83
  372. package/dist/skills-new-GPL46YV2.js +18 -0
  373. package/dist/skills-new-L5BEZN5V.cjs +18 -0
  374. package/dist/slashCommands-FBPCIWM5.cjs +95 -0
  375. package/dist/slashCommands-FCWY5DXW.js +95 -0
  376. package/dist/status-3B5SDZPL.js +17 -0
  377. package/dist/status-TTGRF6NC.cjs +17 -0
  378. package/dist/summarizer-DGPHE5IQ.js +17 -0
  379. package/dist/summarizer-JNXLUAQG.cjs +17 -0
  380. package/dist/sync-77CXVVTK.cjs +21 -0
  381. package/dist/{sync-VU2NSJ4O.js → sync-7BILIQHP.js} +3 -3
  382. package/dist/sync-7OKF6636.js +21 -0
  383. package/dist/sync-EH4K5U3N.cjs +40 -0
  384. package/dist/{teammate-SD26GR37.js → teammate-GZQSCIMS.js} +28 -7
  385. package/dist/{teammate-SXRVXNQV.cjs → teammate-J6PHGL23.cjs} +29 -8
  386. package/dist/theme-64BYGJ57.cjs +21 -0
  387. package/dist/theme-YJE6HEON.js +21 -0
  388. package/dist/tools-3PPTTKFV.js +9 -0
  389. package/dist/tools-THIQA7WC.cjs +9 -0
  390. package/dist/ui/questionModal.cjs +8 -5
  391. package/dist/ui/questionModal.js +7 -4
  392. package/dist/undo-PRTEGL2J.cjs +10 -0
  393. package/dist/{undo-OL2EDBRY.js → undo-SZEHLX7X.js} +2 -2
  394. package/dist/web-3BA2WV37.cjs +37 -0
  395. package/dist/web-6FYGBX5K.js +37 -0
  396. package/dist/workspaceSafety-MDJGHK6D.cjs +9 -0
  397. package/dist/workspaceSafety-XOUMUBVB.js +9 -0
  398. package/dist/yolo-GF2YD7ZI.js +9 -0
  399. package/dist/yolo-OGDA7HNC.cjs +9 -0
  400. package/dist/yoloMode-3DJDA75U.cjs +17 -0
  401. package/dist/yoloMode-4JOOSU26.js +17 -0
  402. package/package.json +46 -49
  403. package/dist/AgentRegistry-HRPN6ZOF.cjs +0 -10
  404. package/dist/CommunitySkillsCache-KE435RAR.cjs +0 -8
  405. package/dist/GitHubRegistryFetcher-I45SESIL.cjs +0 -7
  406. package/dist/LearnAdvisor-FLBA6FDD.js +0 -9
  407. package/dist/LearnAdvisor-GG3CXQF3.cjs +0 -9
  408. package/dist/MemoryManager-2LQPIYVE.cjs +0 -8
  409. package/dist/PermissionManager-X57BXHJ6.cjs +0 -11
  410. package/dist/ProviderFactory-KPJOGQWF.cjs +0 -9
  411. package/dist/SessionManager-YBJAZXNO.cjs +0 -10
  412. package/dist/SkillsRegistry-7O72A6TZ.cjs +0 -9
  413. package/dist/SubAgent-JT4HZHN7.js +0 -11
  414. package/dist/SubAgent-VPNYDWAU.cjs +0 -11
  415. package/dist/SyncApiClient-HQXJL5BT.cjs +0 -11
  416. package/dist/about-4DB5KTHW.js +0 -12
  417. package/dist/about-LXAOXZFT.cjs +0 -12
  418. package/dist/actionExecutor-23JB2WUC.js +0 -19
  419. package/dist/actionExecutor-X5UEZSKH.cjs +0 -19
  420. package/dist/add-dir-YC37DMSF.cjs +0 -10
  421. package/dist/agents-YF3BSUU5.js +0 -12
  422. package/dist/agents-ZOUHPMYR.cjs +0 -12
  423. package/dist/agents-new-HSH4GQPG.js +0 -14
  424. package/dist/agents-new-VYUDOCE7.cjs +0 -14
  425. package/dist/autoSkill-X5W52WOE.cjs +0 -20
  426. package/dist/automode-SJGM7VEI.cjs +0 -10
  427. package/dist/chunk-ALYU6VTM.js +0 -105
  428. package/dist/chunk-B53A2NM2.js +0 -2030
  429. package/dist/chunk-BJXSNT46.js +0 -100
  430. package/dist/chunk-CB4E2T5N.cjs +0 -312
  431. package/dist/chunk-DNUOXBHL.js +0 -539
  432. package/dist/chunk-EFX2QSZX.cjs +0 -33
  433. package/dist/chunk-H2ZRHQQV.js +0 -33
  434. package/dist/chunk-HNRPK5MY.cjs +0 -85
  435. package/dist/chunk-HVKOZ2VP.cjs +0 -115
  436. package/dist/chunk-JJLYWH5Y.cjs +0 -100
  437. package/dist/chunk-LWUJFGOZ.js +0 -115
  438. package/dist/chunk-MERYP6AM.cjs +0 -539
  439. package/dist/chunk-MZAPWNAC.cjs +0 -207
  440. package/dist/chunk-PGESAU2W.cjs +0 -2030
  441. package/dist/chunk-SYVYLZZF.cjs +0 -24
  442. package/dist/chunk-SZOLA6FR.js +0 -111
  443. package/dist/chunk-VWDHR4HV.js +0 -168
  444. package/dist/chunk-Y45G6ZO5.cjs +0 -168
  445. package/dist/chunk-YRLYSQEQ.cjs +0 -105
  446. package/dist/chunk-ZYVS43MU.js +0 -312
  447. package/dist/clear-GK4IEUUS.cjs +0 -12
  448. package/dist/communityInstaller-XXC7RLE4.cjs +0 -19
  449. package/dist/completion-HWABSAEL.js +0 -14
  450. package/dist/completion-IUUVQG4D.cjs +0 -14
  451. package/dist/config-HF7WOLZF.cjs +0 -18
  452. package/dist/constants-PEO3P2SJ.cjs +0 -21
  453. package/dist/export-QJAV2FCZ.js +0 -12
  454. package/dist/export-XSRFXGWU.cjs +0 -12
  455. package/dist/feedback-4TCIL3ML.cjs +0 -15
  456. package/dist/feedback-SJ6VVEY3.js +0 -15
  457. package/dist/filesystem-W56QZUJF.cjs +0 -10
  458. package/dist/help-ISBVQL3S.cjs +0 -12
  459. package/dist/history-XQ4GTSFU.cjs +0 -14
  460. package/dist/hooks-CJNKJ5PF.js +0 -13
  461. package/dist/hooks-UTMBTAXT.cjs +0 -13
  462. package/dist/i18n-N7QQ7A5M.cjs +0 -33
  463. package/dist/ide-RTA4UJV4.js +0 -12
  464. package/dist/ide-VWVOLIFF.cjs +0 -12
  465. package/dist/immediateCommandRouter-BW34JNXL.js +0 -9
  466. package/dist/immediateCommandRouter-SHOVNB5X.cjs +0 -9
  467. package/dist/import-ZLJVONXH.cjs +0 -10
  468. package/dist/init-TBKAB4LZ.cjs +0 -10
  469. package/dist/language-MDSHEXHB.cjs +0 -18
  470. package/dist/language-PXTQSHIG.js +0 -18
  471. package/dist/learn-623TW5EK.cjs +0 -20
  472. package/dist/learn-BCPV7GM2.js +0 -20
  473. package/dist/localProjectPermissions-BHQXEWZJ.cjs +0 -18
  474. package/dist/localProjectPermissions-GMOUYQM6.js +0 -18
  475. package/dist/login-QMVEETWJ.js +0 -20
  476. package/dist/login-QYMXAL3K.cjs +0 -20
  477. package/dist/logout-2CMTDAOJ.js +0 -18
  478. package/dist/logout-ZOHVZAUK.cjs +0 -18
  479. package/dist/mcp-IUVKK65S.js +0 -18
  480. package/dist/mcp-TXC7PYG3.cjs +0 -18
  481. package/dist/memory-WRIHDEPK.cjs +0 -10
  482. package/dist/model-RLP75SF5.cjs +0 -10
  483. package/dist/new-HLSFL6A4.cjs +0 -12
  484. package/dist/permissions-GP6FTGZ2.js +0 -13
  485. package/dist/permissions-O6EKKPOG.cjs +0 -13
  486. package/dist/plan-MCAXDIM2.cjs +0 -11
  487. package/dist/quit-TQX6GXA5.cjs +0 -10
  488. package/dist/repeat-BSPS5TWD.cjs +0 -13
  489. package/dist/resume-2GOPDLL4.cjs +0 -13
  490. package/dist/resume-37IUVDA6.js +0 -13
  491. package/dist/search-7KUSHIBL.cjs +0 -17
  492. package/dist/search-OJGDRIMA.js +0 -17
  493. package/dist/sessions-CYYCHSQG.cjs +0 -10
  494. package/dist/settings-2D7CAO66.cjs +0 -30
  495. package/dist/share-BXQY5IQU.js +0 -14
  496. package/dist/share-OSFXZBGS.cjs +0 -14
  497. package/dist/skills-FL6O6AOM.cjs +0 -26
  498. package/dist/skills-PNKQZRNK.js +0 -26
  499. package/dist/skills-new-XFMEHHIF.cjs +0 -15
  500. package/dist/skills-new-ZNZPHUKS.js +0 -15
  501. package/dist/slashCommands-LLCNPK3X.js +0 -76
  502. package/dist/slashCommands-RXZZS6RE.cjs +0 -76
  503. package/dist/status-BCECUJXT.cjs +0 -11
  504. package/dist/status-EFO7MQU3.js +0 -11
  505. package/dist/sync-IJYJ6KKM.js +0 -18
  506. package/dist/sync-LFT6SBPF.cjs +0 -18
  507. package/dist/sync-U7SDPBNZ.cjs +0 -40
  508. package/dist/theme-AWBHSG7J.cjs +0 -18
  509. package/dist/theme-TQLBPJ2E.js +0 -18
  510. package/dist/undo-IBBGP7A2.cjs +0 -10
@@ -0,0 +1,866 @@
1
+ import {
2
+ addToLocalAllowList,
3
+ addToLocalDenyList,
4
+ loadLocalProjectSettings,
5
+ mergePermissions
6
+ } from "./chunk-HJIXWGQZ.js";
7
+ import {
8
+ PROJECT_DIR_NAME
9
+ } from "./chunk-TWQDAUZU.js";
10
+
11
+ // src/permissions/PermissionManager.ts
12
+ import path2 from "path";
13
+
14
+ // src/permissions/toolPatterns.ts
15
+ import { minimatch } from "minimatch";
16
+ function matchesToolPattern(pattern, call) {
17
+ if (pattern.kind !== call.kind) return false;
18
+ if (!pattern.argument) return true;
19
+ const arg = pattern.argument;
20
+ if (arg.endsWith(":*")) {
21
+ const stem = arg.slice(0, -2);
22
+ return call.target === stem || call.target.startsWith(stem + " ");
23
+ }
24
+ if (pattern.kind === "url") {
25
+ try {
26
+ const url = new URL(call.target);
27
+ const domain = url.hostname;
28
+ if (arg.startsWith("*.")) {
29
+ return domain.endsWith(arg.slice(1));
30
+ }
31
+ return domain === arg || domain.endsWith("." + arg);
32
+ } catch {
33
+ return call.target.includes(arg);
34
+ }
35
+ }
36
+ if (arg === call.target) return true;
37
+ if (arg.includes("*") || arg.includes("?")) {
38
+ return minimatch(call.target, arg);
39
+ }
40
+ return false;
41
+ }
42
+
43
+ // src/permissions/sessionProjectPermissions.ts
44
+ import fs from "fs-extra";
45
+ import path from "path";
46
+ var SESSION_PERMISSIONS_FILE = "session-permissions.json";
47
+ function getSessionPermissionsPath(workspaceRoot) {
48
+ return path.join(workspaceRoot, PROJECT_DIR_NAME, SESSION_PERMISSIONS_FILE);
49
+ }
50
+ async function loadSessionProjectPermissions(workspaceRoot) {
51
+ const filePath = getSessionPermissionsPath(workspaceRoot);
52
+ if (!await fs.pathExists(filePath)) {
53
+ return null;
54
+ }
55
+ const contents = await fs.readFile(filePath, "utf8");
56
+ return JSON.parse(contents);
57
+ }
58
+ async function saveSessionProjectPermissions(workspaceRoot, permissions) {
59
+ const filePath = getSessionPermissionsPath(workspaceRoot);
60
+ await fs.ensureDir(path.dirname(filePath));
61
+ await fs.writeJson(filePath, { ...permissions, version: 1 }, { spaces: 2 });
62
+ }
63
+ async function addToSessionAllowList(workspaceRoot, pattern) {
64
+ const current = await loadSessionProjectPermissions(workspaceRoot) ?? {};
65
+ const allowList = current.allowList ?? [];
66
+ if (!allowList.includes(pattern)) {
67
+ allowList.push(pattern);
68
+ }
69
+ await saveSessionProjectPermissions(workspaceRoot, {
70
+ ...current,
71
+ allowList
72
+ });
73
+ }
74
+ async function addToSessionDenyList(workspaceRoot, pattern) {
75
+ const current = await loadSessionProjectPermissions(workspaceRoot) ?? {};
76
+ const denyList = current.denyList ?? [];
77
+ if (!denyList.includes(pattern)) {
78
+ denyList.push(pattern);
79
+ }
80
+ await saveSessionProjectPermissions(workspaceRoot, {
81
+ ...current,
82
+ denyList
83
+ });
84
+ }
85
+
86
+ // src/permissions/PermissionManager.ts
87
+ var DEFAULT_SECURITY_BLACKLIST = [
88
+ // === Sensitive Files (read/write blocked) ===
89
+ // Environment files with secrets
90
+ "read_file:.env",
91
+ "read_file:.env.*",
92
+ "read_file:*.env",
93
+ "write_file:.env",
94
+ "write_file:.env.*",
95
+ "write_file:*.env",
96
+ // Git credentials and config
97
+ "read_file:.git/config",
98
+ "write_file:.git/config",
99
+ "read_file:.git/credentials",
100
+ "write_file:.git/credentials",
101
+ "read_file:.gitconfig",
102
+ "write_file:.gitconfig",
103
+ // SSH keys
104
+ "read_file:*/.ssh/*",
105
+ "write_file:*/.ssh/*",
106
+ "read_file:*/id_rsa*",
107
+ "read_file:*/id_ed25519*",
108
+ "read_file:*/id_ecdsa*",
109
+ "write_file:*/id_rsa*",
110
+ "write_file:*/id_ed25519*",
111
+ // Cloud credentials
112
+ "read_file:*/.aws/credentials",
113
+ "read_file:*/.aws/config",
114
+ "write_file:*/.aws/*",
115
+ "read_file:*/.azure/*",
116
+ "write_file:*/.azure/*",
117
+ "read_file:*/.gcloud/*",
118
+ "write_file:*/.gcloud/*",
119
+ // Private keys and certificates
120
+ "read_file:*.pem",
121
+ "read_file:*.key",
122
+ "read_file:*.p12",
123
+ "read_file:*.pfx",
124
+ "write_file:*.pem",
125
+ "write_file:*.key",
126
+ // GPG keys
127
+ "read_file:*/.gnupg/*",
128
+ "write_file:*/.gnupg/*",
129
+ // NPM tokens
130
+ "read_file:.npmrc",
131
+ "write_file:.npmrc",
132
+ // Docker credentials
133
+ "read_file:*/.docker/config.json",
134
+ "write_file:*/.docker/config.json",
135
+ // Kubernetes credentials
136
+ "read_file:*/.kube/config",
137
+ "write_file:*/.kube/config",
138
+ // === Dangerous Commands ===
139
+ // Environment exposure
140
+ "run_command:printenv",
141
+ "run_command:printenv *",
142
+ "run_command:env",
143
+ "run_command:export",
144
+ "run_command:set",
145
+ "shell:printenv",
146
+ "shell:printenv *",
147
+ "shell:env",
148
+ "shell:export",
149
+ "shell:set",
150
+ // System information
151
+ "run_command:cat /etc/passwd",
152
+ "run_command:cat /etc/shadow",
153
+ "run_command:cat /etc/sudoers",
154
+ "shell:cat /etc/passwd",
155
+ "shell:cat /etc/shadow",
156
+ "shell:cat /etc/sudoers",
157
+ // Privilege escalation
158
+ "run_command:sudo *",
159
+ "run_command:su *",
160
+ "run_command:doas *",
161
+ "shell:sudo *",
162
+ "shell:su *",
163
+ "shell:doas *",
164
+ // Destructive operations
165
+ "run_command:rm -rf /",
166
+ "run_command:rm -rf /*",
167
+ "run_command:rm -rf ~",
168
+ "run_command:rm -rf ~/*",
169
+ "run_command:dd if=* of=/dev/*",
170
+ "run_command:mkfs*",
171
+ "run_command:wipefs*",
172
+ "run_command:shred*",
173
+ "shell:rm -rf /",
174
+ "shell:rm -rf /*",
175
+ "shell:rm -rf ~",
176
+ "shell:rm -rf ~/*",
177
+ "shell:dd if=* of=/dev/*",
178
+ "shell:mkfs*",
179
+ "shell:wipefs*",
180
+ "shell:shred*",
181
+ // Remote code execution
182
+ "run_command:curl * | *sh",
183
+ "run_command:wget * | *sh",
184
+ "run_command:curl *|*sh",
185
+ "run_command:wget *|*sh",
186
+ "shell:curl * | *sh",
187
+ "shell:wget * | *sh",
188
+ "shell:curl *|*sh",
189
+ "shell:wget *|*sh",
190
+ // Network tools that can exfiltrate
191
+ "run_command:nc -e*",
192
+ "run_command:ncat -e*",
193
+ "run_command:netcat -e*",
194
+ "shell:nc -e*",
195
+ "shell:ncat -e*",
196
+ "shell:netcat -e*",
197
+ // Credential theft
198
+ "run_command:cat */.ssh/*",
199
+ "run_command:cat */.aws/*",
200
+ "run_command:cat *.pem",
201
+ "run_command:cat *.key",
202
+ "shell:cat */.ssh/*",
203
+ "shell:cat */.aws/*",
204
+ "shell:cat *.pem",
205
+ "shell:cat *.key"
206
+ ];
207
+ var PermissionManager = class _PermissionManager {
208
+ settings;
209
+ localSettings;
210
+ sessionProjectSettings;
211
+ sessionCache = /* @__PURE__ */ new Map();
212
+ mode;
213
+ onPersist;
214
+ workspaceRoot;
215
+ localSettingsLoaded = false;
216
+ normalizeSettings(settings) {
217
+ return {
218
+ mode: settings?.mode ?? "interactive",
219
+ allowList: [...settings?.allowList ?? settings?.whitelist ?? []],
220
+ denyList: [...settings?.denyList ?? settings?.blacklist ?? []],
221
+ rules: [...settings?.rules ?? []],
222
+ rememberSession: settings?.rememberSession ?? true,
223
+ allowPatterns: [...settings?.allowPatterns ?? []],
224
+ denyPatterns: [...settings?.denyPatterns ?? []],
225
+ availableTools: [...settings?.availableTools ?? []],
226
+ excludedTools: [...settings?.excludedTools ?? []],
227
+ allPathsAllowed: settings?.allPathsAllowed,
228
+ allUrlsAllowed: settings?.allUrlsAllowed
229
+ };
230
+ }
231
+ constructor(options = {}) {
232
+ const isOptions = "settings" in options || "onPersist" in options || "workspaceRoot" in options;
233
+ const settings = isOptions ? options.settings ?? {} : options;
234
+ this.onPersist = isOptions ? options.onPersist : void 0;
235
+ this.workspaceRoot = isOptions ? options.workspaceRoot : void 0;
236
+ this.settings = this.normalizeSettings(settings);
237
+ this.mode = this.settings.mode || "interactive";
238
+ }
239
+ /**
240
+ * Initialize local project settings (async)
241
+ * Call this after construction to load local .autohand/settings.local.json
242
+ */
243
+ async initLocalSettings() {
244
+ if (!this.workspaceRoot || this.localSettingsLoaded) return;
245
+ try {
246
+ const localSettings = await loadLocalProjectSettings(this.workspaceRoot);
247
+ if (localSettings?.permissions) {
248
+ this.localSettings = this.normalizeSettings(localSettings.permissions);
249
+ }
250
+ const sessionSettings = await loadSessionProjectPermissions(this.workspaceRoot);
251
+ if (sessionSettings) {
252
+ this.sessionProjectSettings = {
253
+ allowList: [...sessionSettings.allowList ?? []],
254
+ denyList: [...sessionSettings.denyList ?? []],
255
+ version: sessionSettings.version
256
+ };
257
+ }
258
+ this.localSettingsLoaded = true;
259
+ } catch {
260
+ }
261
+ }
262
+ /**
263
+ * Get merged settings (global + local)
264
+ */
265
+ getMergedSettings() {
266
+ return mergePermissions(this.settings, this.localSettings);
267
+ }
268
+ /**
269
+ * Set permission mode (can be overridden by CLI flags)
270
+ */
271
+ setMode(mode) {
272
+ this.mode = mode;
273
+ }
274
+ /**
275
+ * Get current mode
276
+ */
277
+ getMode() {
278
+ return this.mode;
279
+ }
280
+ /**
281
+ * Check if an action should be allowed, denied, or prompted
282
+ */
283
+ checkPermission(context) {
284
+ if (this.isSecurityBlacklisted(context)) {
285
+ return { allowed: false, reason: "blacklisted" };
286
+ }
287
+ const patternDecision = this.checkPatterns(context);
288
+ if (patternDecision) {
289
+ return patternDecision;
290
+ }
291
+ const cacheKey = this.getCacheKey(context);
292
+ if (this.settings.rememberSession && this.sessionCache.has(cacheKey)) {
293
+ return {
294
+ allowed: this.sessionCache.get(cacheKey),
295
+ reason: this.sessionCache.get(cacheKey) ? "user_approved" : "user_denied",
296
+ cached: true
297
+ };
298
+ }
299
+ if (this.mode === "unrestricted") {
300
+ return { allowed: true, reason: "mode_unrestricted" };
301
+ }
302
+ if (this.mode === "restricted") {
303
+ return { allowed: false, reason: "mode_restricted" };
304
+ }
305
+ const sessionDecision = this.checkScopedLists(
306
+ context,
307
+ this.sessionProjectSettings?.allowList,
308
+ this.sessionProjectSettings?.denyList,
309
+ "session"
310
+ );
311
+ if (sessionDecision) {
312
+ return sessionDecision;
313
+ }
314
+ const projectDecision = this.checkScopedLists(
315
+ context,
316
+ this.localSettings?.allowList,
317
+ this.localSettings?.denyList,
318
+ "project"
319
+ );
320
+ if (projectDecision) {
321
+ return projectDecision;
322
+ }
323
+ const userDecision = this.checkScopedLists(
324
+ context,
325
+ this.settings.allowList,
326
+ this.settings.denyList,
327
+ "user"
328
+ );
329
+ if (userDecision) {
330
+ return userDecision;
331
+ }
332
+ const ruleDecision = this.checkRules(context);
333
+ if (ruleDecision) {
334
+ return ruleDecision;
335
+ }
336
+ return { allowed: false, reason: "default" };
337
+ }
338
+ /**
339
+ * Record a user's decision using the legacy boolean API.
340
+ * Approved permissions are saved to the project allowList when possible.
341
+ */
342
+ async recordDecision(context, allowed) {
343
+ const merged = this.getMergedSettings();
344
+ if (merged.rememberSession) {
345
+ const cacheKey = this.getCacheKey(context);
346
+ this.sessionCache.set(cacheKey, allowed);
347
+ }
348
+ const pattern = this.contextToPattern(context);
349
+ const dirPattern = allowed && context.path ? this.buildDirectoryWildcard(context) : null;
350
+ if (allowed && this.workspaceRoot) {
351
+ try {
352
+ const patterns = dirPattern ? [pattern, dirPattern] : [pattern];
353
+ for (const p of patterns) {
354
+ await addToLocalAllowList(this.workspaceRoot, p);
355
+ }
356
+ if (!this.localSettings) {
357
+ this.localSettings = { allowList: [] };
358
+ }
359
+ if (!this.localSettings.allowList) {
360
+ this.localSettings.allowList = [];
361
+ }
362
+ for (const p of patterns) {
363
+ if (!this.localSettings.allowList.includes(p)) {
364
+ this.localSettings.allowList.push(p);
365
+ }
366
+ }
367
+ } catch {
368
+ this.addToAllowList(pattern);
369
+ if (dirPattern) this.addToAllowList(dirPattern);
370
+ }
371
+ } else if (allowed) {
372
+ this.addToAllowList(pattern);
373
+ if (dirPattern) this.addToAllowList(dirPattern);
374
+ } else {
375
+ this.addToDenyList(pattern);
376
+ }
377
+ if (this.onPersist) {
378
+ await this.onPersist(this.settings);
379
+ }
380
+ }
381
+ async applyPromptDecision(context, result) {
382
+ const pattern = this.contextToPattern(context);
383
+ const dirPattern = this.buildDirectoryWildcard(context);
384
+ const allowPatterns = dirPattern ? [pattern, dirPattern] : [pattern];
385
+ switch (result.decision) {
386
+ case "allow_once":
387
+ case "deny_once":
388
+ case "alternative":
389
+ return;
390
+ case "allow_session": {
391
+ if (!this.workspaceRoot) {
392
+ return;
393
+ }
394
+ for (const entry of allowPatterns) {
395
+ await addToSessionAllowList(this.workspaceRoot, entry);
396
+ }
397
+ this.sessionProjectSettings = {
398
+ ...this.sessionProjectSettings ?? {},
399
+ allowList: Array.from(/* @__PURE__ */ new Set([...this.sessionProjectSettings?.allowList ?? [], ...allowPatterns])),
400
+ denyList: [...this.sessionProjectSettings?.denyList ?? []]
401
+ };
402
+ return;
403
+ }
404
+ case "deny_session": {
405
+ if (!this.workspaceRoot) {
406
+ return;
407
+ }
408
+ await addToSessionDenyList(this.workspaceRoot, pattern);
409
+ this.sessionProjectSettings = {
410
+ ...this.sessionProjectSettings ?? {},
411
+ allowList: [...this.sessionProjectSettings?.allowList ?? []],
412
+ denyList: Array.from(/* @__PURE__ */ new Set([...this.sessionProjectSettings?.denyList ?? [], pattern]))
413
+ };
414
+ return;
415
+ }
416
+ case "allow_always_project": {
417
+ if (!this.workspaceRoot) {
418
+ this.addToAllowList(pattern);
419
+ if (dirPattern) this.addToAllowList(dirPattern);
420
+ if (this.onPersist) {
421
+ await this.onPersist(this.settings);
422
+ }
423
+ return;
424
+ }
425
+ for (const entry of allowPatterns) {
426
+ await addToLocalAllowList(this.workspaceRoot, entry);
427
+ }
428
+ if (!this.localSettings) {
429
+ this.localSettings = this.normalizeSettings({});
430
+ }
431
+ this.localSettings.allowList = Array.from(/* @__PURE__ */ new Set([...this.localSettings.allowList ?? [], ...allowPatterns]));
432
+ return;
433
+ }
434
+ case "deny_always_project": {
435
+ if (!this.workspaceRoot) {
436
+ this.addToDenyList(pattern);
437
+ if (this.onPersist) {
438
+ await this.onPersist(this.settings);
439
+ }
440
+ return;
441
+ }
442
+ await addToLocalDenyList(this.workspaceRoot, pattern);
443
+ if (!this.localSettings) {
444
+ this.localSettings = this.normalizeSettings({});
445
+ }
446
+ this.localSettings.denyList = Array.from(/* @__PURE__ */ new Set([...this.localSettings.denyList ?? [], pattern]));
447
+ return;
448
+ }
449
+ case "allow_always_user":
450
+ this.addToAllowList(pattern);
451
+ if (dirPattern) this.addToAllowList(dirPattern);
452
+ if (this.onPersist) {
453
+ await this.onPersist(this.settings);
454
+ }
455
+ return;
456
+ case "deny_always_user":
457
+ this.addToDenyList(pattern);
458
+ if (this.onPersist) {
459
+ await this.onPersist(this.settings);
460
+ }
461
+ return;
462
+ }
463
+ }
464
+ /**
465
+ * Convert context to a pattern string for whitelist/blacklist
466
+ */
467
+ contextToPattern(context) {
468
+ const tool = context.tool;
469
+ let value;
470
+ if (context.command) {
471
+ const args = context.args?.join(" ") || "";
472
+ value = args ? `${context.command} ${args}` : context.command;
473
+ } else if (context.path) {
474
+ value = context.path;
475
+ } else {
476
+ return `${tool}:*`;
477
+ }
478
+ return `${tool}:${value}`;
479
+ }
480
+ /**
481
+ * Build a directory-level wildcard pattern for path-based approvals.
482
+ * E.g., write_file:/project/tests/foo.ts → write_file:/project/tests/*
483
+ * This allows future writes in the same directory to be auto-approved.
484
+ */
485
+ buildDirectoryWildcard(context) {
486
+ if (!context.path) return null;
487
+ const dir = path2.dirname(context.path);
488
+ if (dir === "." || dir === "/") return null;
489
+ return `${context.tool}:${dir}/*`;
490
+ }
491
+ /**
492
+ * Convert a PermissionContext to the { kind, target } shape used by matchesToolPattern.
493
+ */
494
+ contextToCall(context) {
495
+ return { kind: context.tool, target: this.getFullCommand(context) };
496
+ }
497
+ /**
498
+ * Check pattern-based allow/deny rules (denyPatterns, availableTools, excludedTools,
499
+ * allowPatterns, allPathsAllowed, allUrlsAllowed).
500
+ * Returns a decision when a pattern fires, or null to continue with normal flow.
501
+ */
502
+ checkPatterns(context) {
503
+ const settings = this.getMergedSettings();
504
+ const call = this.contextToCall(context);
505
+ if (settings.denyPatterns?.length) {
506
+ for (const p of settings.denyPatterns) {
507
+ if (matchesToolPattern(p, call)) {
508
+ return { allowed: false, reason: "pattern_denied" };
509
+ }
510
+ }
511
+ }
512
+ if (settings.availableTools?.length) {
513
+ const inAvailable = settings.availableTools.some((p) => matchesToolPattern(p, call));
514
+ if (!inAvailable) {
515
+ return { allowed: false, reason: "not_in_available" };
516
+ }
517
+ }
518
+ if (settings.excludedTools?.length) {
519
+ for (const p of settings.excludedTools) {
520
+ if (matchesToolPattern(p, call)) {
521
+ return { allowed: false, reason: "excluded" };
522
+ }
523
+ }
524
+ }
525
+ if (settings.allowPatterns?.length) {
526
+ for (const p of settings.allowPatterns) {
527
+ if (matchesToolPattern(p, call)) {
528
+ return { allowed: true, reason: "pattern_allowed" };
529
+ }
530
+ }
531
+ }
532
+ const fileTools = /* @__PURE__ */ new Set(["read_file", "write_file", "list_dir", "delete_path", "move_path", "copy_path"]);
533
+ if (settings.allPathsAllowed && fileTools.has(context.tool)) {
534
+ return { allowed: true, reason: "all_paths_allowed" };
535
+ }
536
+ if (settings.allUrlsAllowed && context.tool === "url") {
537
+ return { allowed: true, reason: "all_urls_allowed" };
538
+ }
539
+ return null;
540
+ }
541
+ /**
542
+ * Check if context matches the immutable security blacklist
543
+ * This check CANNOT be bypassed by any mode, allowList, or user setting
544
+ */
545
+ isSecurityBlacklisted(context) {
546
+ return DEFAULT_SECURITY_BLACKLIST.some((pattern) => this.matchesPattern(context, pattern));
547
+ }
548
+ /**
549
+ * Check scoped allow/deny lists, returning a source-specific decision if matched.
550
+ */
551
+ checkScopedLists(context, allowList, denyList, scope) {
552
+ const normalizedAllowList = allowList ?? [];
553
+ const normalizedDenyList = denyList ?? [];
554
+ if (normalizedDenyList.some((pattern) => this.matchesPattern(context, pattern))) {
555
+ return {
556
+ allowed: false,
557
+ reason: scope === "user" ? "deny_list" : `${scope}_deny_list`
558
+ };
559
+ }
560
+ if (normalizedAllowList.some((pattern) => this.matchesPattern(context, pattern))) {
561
+ return {
562
+ allowed: true,
563
+ reason: scope === "user" ? "allow_list" : `${scope}_allow_list`
564
+ };
565
+ }
566
+ return null;
567
+ }
568
+ /**
569
+ * Check custom rules (uses merged global + local settings)
570
+ */
571
+ checkRules(context) {
572
+ const merged = this.getMergedSettings();
573
+ const rules = merged.rules || [];
574
+ for (const rule of rules) {
575
+ if (this.ruleMatches(context, rule)) {
576
+ if (rule.action === "allow") {
577
+ return { allowed: true, reason: "rule_match" };
578
+ }
579
+ if (rule.action === "deny") {
580
+ return { allowed: false, reason: "rule_match" };
581
+ }
582
+ }
583
+ }
584
+ return null;
585
+ }
586
+ /**
587
+ * Check if a rule matches the context
588
+ */
589
+ ruleMatches(context, rule) {
590
+ if (rule.tool !== "*" && rule.tool !== context.tool) {
591
+ return false;
592
+ }
593
+ if (rule.pattern) {
594
+ const fullCommand = this.getFullCommand(context);
595
+ return this.globMatch(fullCommand, rule.pattern);
596
+ }
597
+ return true;
598
+ }
599
+ /**
600
+ * Match context against a pattern string
601
+ * Format: "tool:pattern" or just "pattern" for run_command
602
+ * Supports prefix patterns like "write_file:*" and directory-specific patterns
603
+ */
604
+ matchesPattern(context, pattern) {
605
+ const colonIndex = pattern.indexOf(":");
606
+ let toolPattern;
607
+ let commandPattern;
608
+ if (colonIndex !== -1) {
609
+ toolPattern = pattern.substring(0, colonIndex);
610
+ commandPattern = pattern.substring(colonIndex + 1);
611
+ } else {
612
+ toolPattern = "run_command";
613
+ commandPattern = pattern;
614
+ }
615
+ if (toolPattern !== "*" && toolPattern !== context.tool) {
616
+ return false;
617
+ }
618
+ if (commandPattern === "*") {
619
+ return true;
620
+ }
621
+ if (commandPattern.endsWith(":*")) {
622
+ const prefix = commandPattern.slice(0, -2);
623
+ const fullCommand2 = this.getFullCommand(context);
624
+ if (fullCommand2.startsWith(prefix)) {
625
+ return fullCommand2 === prefix || fullCommand2.startsWith(prefix + " ") || fullCommand2.startsWith(prefix + "/") || fullCommand2.startsWith(prefix + path2.sep);
626
+ }
627
+ return false;
628
+ }
629
+ if (this.workspaceRoot && commandPattern.includes("/*")) {
630
+ if (context.path) {
631
+ const workspacePattern = path2.join(this.workspaceRoot, commandPattern);
632
+ const resolvedPath = path2.resolve(this.workspaceRoot, context.path);
633
+ return this.globMatch(resolvedPath, workspacePattern);
634
+ }
635
+ }
636
+ const fullCommand = this.getFullCommand(context);
637
+ return this.globMatch(fullCommand, commandPattern);
638
+ }
639
+ /**
640
+ * Get full command string from context
641
+ */
642
+ getFullCommand(context) {
643
+ if (context.command) {
644
+ const args = context.args?.join(" ") || "";
645
+ return args ? `${context.command} ${args}` : context.command;
646
+ }
647
+ if (context.path) {
648
+ return context.path;
649
+ }
650
+ return context.tool;
651
+ }
652
+ /**
653
+ * Simple glob matching (* for wildcards)
654
+ */
655
+ globMatch(text, pattern) {
656
+ const regexPattern = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*").replace(/\?/g, ".");
657
+ const regex = new RegExp(`^${regexPattern}$`, "i");
658
+ return regex.test(text);
659
+ }
660
+ /**
661
+ * Generate cache key from context
662
+ */
663
+ getCacheKey(context) {
664
+ const parts = [context.tool];
665
+ if (context.command) parts.push(context.command);
666
+ if (context.args?.length) parts.push(context.args.join(" "));
667
+ if (context.path) parts.push(context.path);
668
+ return parts.join("::");
669
+ }
670
+ /**
671
+ * Clear session cache
672
+ */
673
+ clearCache() {
674
+ this.sessionCache.clear();
675
+ }
676
+ /**
677
+ * Get session cache stats
678
+ */
679
+ getCacheStats() {
680
+ return {
681
+ size: this.sessionCache.size,
682
+ entries: Array.from(this.sessionCache.keys())
683
+ };
684
+ }
685
+ /**
686
+ * Add to allowList dynamically
687
+ */
688
+ addToAllowList(pattern) {
689
+ if (!this.settings.allowList) {
690
+ this.settings.allowList = [];
691
+ }
692
+ if (!this.settings.allowList.includes(pattern)) {
693
+ this.settings.allowList.push(pattern);
694
+ }
695
+ }
696
+ /**
697
+ * Add to denyList dynamically
698
+ */
699
+ addToDenyList(pattern) {
700
+ if (!this.settings.denyList) {
701
+ this.settings.denyList = [];
702
+ }
703
+ if (!this.settings.denyList.includes(pattern)) {
704
+ this.settings.denyList.push(pattern);
705
+ }
706
+ }
707
+ /**
708
+ * Remove from allowList
709
+ */
710
+ async removeFromAllowList(pattern) {
711
+ if (!this.settings.allowList) return false;
712
+ const index = this.settings.allowList.indexOf(pattern);
713
+ if (index !== -1) {
714
+ this.settings.allowList.splice(index, 1);
715
+ if (this.onPersist) {
716
+ await this.onPersist(this.settings);
717
+ }
718
+ return true;
719
+ }
720
+ return false;
721
+ }
722
+ /**
723
+ * Remove from denyList
724
+ */
725
+ async removeFromDenyList(pattern) {
726
+ if (!this.settings.denyList) return false;
727
+ const index = this.settings.denyList.indexOf(pattern);
728
+ if (index !== -1) {
729
+ this.settings.denyList.splice(index, 1);
730
+ if (this.onPersist) {
731
+ await this.onPersist(this.settings);
732
+ }
733
+ return true;
734
+ }
735
+ return false;
736
+ }
737
+ /**
738
+ * Get current allowList
739
+ */
740
+ getAllowList() {
741
+ return [...this.settings.allowList || []];
742
+ }
743
+ /**
744
+ * Get current denyList
745
+ */
746
+ getDenyList() {
747
+ return [...this.settings.denyList || []];
748
+ }
749
+ /**
750
+ * Get current settings (for display)
751
+ */
752
+ getSettings() {
753
+ return {
754
+ ...this.settings,
755
+ allowList: [...this.settings.allowList || []],
756
+ denyList: [...this.settings.denyList || []],
757
+ rules: [...this.settings.rules || []],
758
+ allowPatterns: [...this.settings.allowPatterns || []],
759
+ denyPatterns: [...this.settings.denyPatterns || []],
760
+ availableTools: [...this.settings.availableTools || []],
761
+ excludedTools: [...this.settings.excludedTools || []]
762
+ };
763
+ }
764
+ /**
765
+ * Create a prefix pattern for a tool (e.g., write_file:src:*)
766
+ */
767
+ static createPrefixPattern(tool, prefix) {
768
+ return `${tool}:${prefix}:*`;
769
+ }
770
+ /**
771
+ * Create a workspace-relative pattern (e.g., write_file:src/*)
772
+ */
773
+ static createWorkspacePattern(tool, workspaceDir) {
774
+ return `${tool}:${workspaceDir}/*`;
775
+ }
776
+ /**
777
+ * Create a tool wildcard pattern (e.g., write_file:*)
778
+ */
779
+ static createToolWildcardPattern(tool) {
780
+ return `${tool}:*`;
781
+ }
782
+ /**
783
+ * Add a prefix pattern to allowList
784
+ */
785
+ addPrefixPattern(tool, prefix) {
786
+ const pattern = _PermissionManager.createPrefixPattern(tool, prefix);
787
+ this.addToAllowList(pattern);
788
+ }
789
+ /**
790
+ * Add a workspace-relative pattern to allowList
791
+ */
792
+ addWorkspacePattern(tool, workspaceDir) {
793
+ const pattern = _PermissionManager.createWorkspacePattern(tool, workspaceDir);
794
+ this.addToAllowList(pattern);
795
+ }
796
+ /**
797
+ * Add a tool wildcard pattern to allowList
798
+ */
799
+ addToolWildcardPattern(tool) {
800
+ const pattern = _PermissionManager.createToolWildcardPattern(tool);
801
+ this.addToAllowList(pattern);
802
+ }
803
+ getWhitelist() {
804
+ return this.getAllowList();
805
+ }
806
+ getBlacklist() {
807
+ return this.getDenyList();
808
+ }
809
+ async removeFromWhitelist(pattern) {
810
+ return this.removeFromAllowList(pattern);
811
+ }
812
+ async removeFromBlacklist(pattern) {
813
+ return this.removeFromDenyList(pattern);
814
+ }
815
+ addToWhitelist(pattern) {
816
+ this.addToAllowList(pattern);
817
+ }
818
+ addToBlacklist(pattern) {
819
+ this.addToDenyList(pattern);
820
+ }
821
+ getPermissionSnapshot(userConfigPath) {
822
+ const effective = this.getMergedSettings();
823
+ const effectiveAllowList = Array.from(/* @__PURE__ */ new Set([
824
+ ...effective.allowList ?? [],
825
+ ...this.sessionProjectSettings?.allowList ?? []
826
+ ]));
827
+ const effectiveDenyList = Array.from(/* @__PURE__ */ new Set([
828
+ ...effective.denyList ?? [],
829
+ ...this.sessionProjectSettings?.denyList ?? []
830
+ ]));
831
+ return {
832
+ mode: this.mode,
833
+ rememberSession: effective.rememberSession !== false,
834
+ session: {
835
+ path: this.workspaceRoot ? getSessionPermissionsPath(this.workspaceRoot) : "(project session unavailable)",
836
+ allowList: [...this.sessionProjectSettings?.allowList ?? []],
837
+ denyList: [...this.sessionProjectSettings?.denyList ?? []]
838
+ },
839
+ project: {
840
+ path: this.workspaceRoot ? path2.join(this.workspaceRoot, ".autohand", "settings.local.json") : "(project unavailable)",
841
+ allowList: [...this.localSettings?.allowList ?? []],
842
+ denyList: [...this.localSettings?.denyList ?? []]
843
+ },
844
+ user: {
845
+ path: userConfigPath,
846
+ allowList: [...this.settings.allowList ?? []],
847
+ denyList: [...this.settings.denyList ?? []]
848
+ },
849
+ effective: {
850
+ path: "merged",
851
+ allowList: effectiveAllowList,
852
+ denyList: effectiveDenyList
853
+ }
854
+ };
855
+ }
856
+ };
857
+
858
+ export {
859
+ addToSessionAllowList,
860
+ DEFAULT_SECURITY_BLACKLIST,
861
+ PermissionManager
862
+ };
863
+ /**
864
+ * Permission Manager - Handles tool/command approval with allow/deny lists
865
+ * @license Apache-2.0
866
+ */