autohand-cli 0.8.3 → 0.9.1
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.
- package/README.md +191 -74
- package/dist/{AgentRegistry-ODDXPAFR.js → AgentRegistry-GOV7FN2O.js} +2 -2
- package/dist/AgentRegistry-J2C6JBZ3.cjs +10 -0
- package/dist/{AutomodeManager-EOVHGRPP.js → AutomodeManager-APLLPEYJ.js} +31 -17
- package/dist/{AutomodeManager-6ATBE7Q5.cjs → AutomodeManager-MPSXT2RH.cjs} +38 -24
- package/dist/CommunitySkillsCache-22BB3J6H.cjs +8 -0
- package/dist/{CommunitySkillsCache-QLE57BN5.js → CommunitySkillsCache-ZACDPD4J.js} +2 -2
- package/dist/GitHubRegistryFetcher-CYJLF2XL.cjs +7 -0
- package/dist/{GitHubRegistryFetcher-NT5GFZXS.js → GitHubRegistryFetcher-J2BWPXJF.js} +1 -1
- package/dist/{HookManager-B2F35M27.js → HookManager-2S6AHOC3.js} +1 -1
- package/dist/{HookManager-PFAFE3FK.cjs → HookManager-TVEQI5ZU.cjs} +2 -2
- package/dist/{ImportWizard-OHRKBANZ.js → ImportWizard-AEBMAKXE.js} +33 -9
- package/dist/{ImportWizard-CJRZPPHL.cjs → ImportWizard-AF2XL6DS.cjs} +37 -13
- package/dist/LearnAdvisor-KKEQ5QCV.js +9 -0
- package/dist/LearnAdvisor-Q7RAYLPF.cjs +9 -0
- package/dist/{McpClientManager-NQ3EW2IF.cjs → McpClientManager-BNSKLHIN.cjs} +2 -2
- package/dist/{McpClientManager-VBIMGKXU.js → McpClientManager-SL35BR24.js} +1 -1
- package/dist/MemoryManager-PMNAEZMB.cjs +8 -0
- package/dist/{MemoryManager-2LAT7IHS.js → MemoryManager-QZRLTUB5.js} +2 -2
- package/dist/NVIDIAProvider-C3FWQOBZ.cjs +14 -0
- package/dist/NVIDIAProvider-SJPY3ONR.js +14 -0
- package/dist/{PermissionManager-7NQHRCHY.js → PermissionManager-MT7KBNNR.js} +3 -3
- package/dist/PermissionManager-URCNP5EC.cjs +11 -0
- package/dist/{ProjectProfiler-UG42W6WD.cjs → ProjectProfiler-CDAE7ECW.cjs} +1 -0
- package/dist/{ProjectProfiler-P4QJQWWA.js → ProjectProfiler-NZTJDRHD.js} +1 -0
- package/dist/ProviderFactory-56N3ECE4.cjs +12 -0
- package/dist/{ProviderFactory-2IYJ5OPW.js → ProviderFactory-RB4RVAF6.js} +4 -1
- package/dist/SessionManager-2IZGWASQ.cjs +10 -0
- package/dist/{SessionManager-4U4JFQ3C.js → SessionManager-554PHVPC.js} +2 -2
- package/dist/SkillsRegistry-GMRVONOQ.cjs +9 -0
- package/dist/{SkillsRegistry-RFEINXRT.js → SkillsRegistry-NHHMIUYJ.js} +2 -2
- package/dist/SubAgent-4GOR2FIJ.js +13 -0
- package/dist/SubAgent-ZJMDH4FI.cjs +13 -0
- package/dist/{SyncApiClient-B5RT2ECG.js → SyncApiClient-G3FM65IV.js} +1 -1
- package/dist/SyncApiClient-ODBDECOG.cjs +11 -0
- package/dist/about-3USFSGOH.js +15 -0
- package/dist/about-QR52U5DD.cjs +15 -0
- package/dist/acp-5Y2W6OZP.js +1556 -0
- package/dist/acp-GSYE75OB.cjs +1556 -0
- package/dist/actionExecutor-KHUU3Z3Q.cjs +28 -0
- package/dist/actionExecutor-PLQJZLZV.js +28 -0
- package/dist/add-dir-BTAD5OZS.cjs +11 -0
- package/dist/{add-dir-TUJM3PG5.js → add-dir-HCERJDBR.js} +3 -2
- package/dist/agent-B3EVT7NN.cjs +126 -0
- package/dist/agent-SATQ3WZ3.js +126 -0
- package/dist/agents/builtin/code-cleaner.md +1 -1
- package/dist/agents/builtin/docs-writer.md +1 -1
- package/dist/agents/builtin/researcher.md +2 -2
- package/dist/agents/builtin/reviewer.md +1 -1
- package/dist/agents/builtin/tester.md +1 -1
- package/dist/agents/builtin/todo-resolver.md +1 -1
- package/dist/agents-44CRJGM7.cjs +18 -0
- package/dist/agents-NN4ZAJ7R.js +18 -0
- package/dist/agents-new-6D6G4QS6.cjs +17 -0
- package/dist/agents-new-7GAQ25EK.js +17 -0
- package/dist/{autoSkill-LQEVQFIH.js → autoSkill-66PKCYTW.js} +2 -2
- package/dist/autoSkill-VQLGBELN.cjs +20 -0
- package/dist/automode-45DWV4TN.cjs +10 -0
- package/dist/{automode-R6P3VHLS.js → automode-BUF3VGXU.js} +2 -2
- package/dist/browserToolBridge-BXRQB4B4.cjs +58 -0
- package/dist/browserToolBridge-F5N66PE7.js +58 -0
- package/dist/chrome-Q2U73HZB.cjs +50 -0
- package/dist/chrome-Q54OALOK.cjs +21 -0
- package/dist/chrome-Y3T7EIHG.js +50 -0
- package/dist/chrome-ZNJ46OYW.js +21 -0
- package/dist/chromeSkill-53TH55PM.js +105 -0
- package/dist/chromeSkill-THW7N4IY.cjs +105 -0
- package/dist/{chunk-HXGBSJL5.cjs → chunk-22SCR3EV.cjs} +2 -2
- package/dist/chunk-26G7YGOW.js +367 -0
- package/dist/{chunk-3L53OA4E.cjs → chunk-2ESQR35E.cjs} +10 -10
- package/dist/chunk-2H5O745H.js +63 -0
- package/dist/{chunk-ULDM2SNB.js → chunk-2IW5YFJ4.js} +48 -47
- package/dist/{chunk-U55TWFJI.cjs → chunk-2VHB43IX.cjs} +24 -6
- package/dist/chunk-3EDDDZS2.cjs +5 -0
- package/dist/{chunk-X5VSP65C.cjs → chunk-3ICORF7M.cjs} +4 -4
- package/dist/chunk-3OF56EMA.cjs +197 -0
- package/dist/chunk-3UC6DMFI.cjs +93 -0
- package/dist/{chunk-64H4FRM3.cjs → chunk-3UHRCHKB.cjs} +32 -34
- package/dist/{chunk-JCLYQ2JC.js → chunk-3ZOOH44N.js} +12 -6
- package/dist/{chunk-TUD3Z3BD.js → chunk-44ZWOBTI.js} +136 -55
- package/dist/chunk-4567QNRB.js +444 -0
- package/dist/chunk-45CHNQM6.cjs +517 -0
- package/dist/chunk-46MTALKD.js +44 -0
- package/dist/{chunk-WHE2SWHU.js → chunk-4E7SHPNQ.js} +2 -2
- package/dist/chunk-4LMUDS2K.js +124 -0
- package/dist/{chunk-W7RYQJLO.cjs → chunk-4XFHP2SN.cjs} +46 -15
- package/dist/chunk-4XVLNOFA.js +360 -0
- package/dist/{chunk-GBHDROGL.js → chunk-575PXZX7.js} +16 -4
- package/dist/chunk-5A7ZL64N.js +139 -0
- package/dist/chunk-5GCQ5UMV.cjs +85 -0
- package/dist/chunk-5JTTM5SC.js +59 -0
- package/dist/{chunk-IETRBBMP.cjs → chunk-5K3CDSWZ.cjs} +108 -31
- package/dist/{chunk-KLWJIPU2.cjs → chunk-5SFV2NCY.cjs} +20 -16
- package/dist/chunk-5ZNYX4VH.cjs +71 -0
- package/dist/{chunk-A4IJHHV7.cjs → chunk-63ANVAOJ.cjs} +52 -11
- package/dist/{chunk-MYISNQH4.js → chunk-65LRPW5W.js} +1 -1
- package/dist/chunk-6AYJCDTA.js +360 -0
- package/dist/{chunk-X2MSVKDV.js → chunk-6HF6XSCC.js} +2 -2
- package/dist/{chunk-AEJH23FO.cjs → chunk-6JWCGQJU.cjs} +6 -6
- package/dist/chunk-6OECOAK5.cjs +360 -0
- package/dist/chunk-6R25D2H5.js +121 -0
- package/dist/chunk-7DJJGKM6.js +77 -0
- package/dist/{chunk-VG34MG2U.js → chunk-7IRQ7JEH.js} +9 -6
- package/dist/chunk-7MY4JHER.js +27 -0
- package/dist/chunk-7PJKTSRN.js +152 -0
- package/dist/{chunk-SKYG33B2.cjs → chunk-7PT646AL.cjs} +3 -3
- package/dist/chunk-7WAUCLLQ.js +229 -0
- package/dist/{chunk-U46VYPLR.cjs → chunk-7XTUL7ZD.cjs} +9 -9
- package/dist/chunk-AE2ILW25.cjs +152 -0
- package/dist/{chunk-T2M64VHA.cjs → chunk-AOKXYGBQ.cjs} +61 -41
- package/dist/chunk-AQ5PVHOC.cjs +113 -0
- package/dist/{chunk-N2BLVUPM.cjs → chunk-AZ47LKD5.cjs} +3 -3
- package/dist/chunk-B4HSNOIH.cjs +354 -0
- package/dist/chunk-B76FJKEJ.cjs +184 -0
- package/dist/chunk-BP37FVBM.js +85 -0
- package/dist/chunk-BQU3HAE7.js +21 -0
- package/dist/chunk-BYE7RQFZ.cjs +121 -0
- package/dist/chunk-C46B72VK.js +1034 -0
- package/dist/{chunk-HIVRCQS2.js → chunk-C5QIQQ37.js} +56 -25
- package/dist/chunk-CCIDL4SA.js +19931 -0
- package/dist/{chunk-XVUHNWMX.js → chunk-CECH6QQP.js} +17 -19
- package/dist/chunk-CFAWTLSC.js +13 -0
- package/dist/{chunk-ZYQMLKOK.cjs → chunk-CK4HAHVY.cjs} +212 -70
- package/dist/chunk-CO2AADYU.cjs +360 -0
- package/dist/chunk-CRTCZ4WL.cjs +19931 -0
- package/dist/chunk-CSTUTDTH.js +75 -0
- package/dist/{chunk-K2C56QGS.cjs → chunk-D546G7DA.cjs} +1650 -479
- package/dist/{chunk-CNBKZEX5.cjs → chunk-DA7NBAJK.cjs} +49 -17
- package/dist/{chunk-G4CAKI3V.js → chunk-DGBPWODD.js} +7 -2
- package/dist/chunk-DHUQZ53B.cjs +29 -0
- package/dist/{chunk-RGR6ME5J.cjs → chunk-DI57A4BX.cjs} +25 -28
- package/dist/{chunk-5K6NGAVM.js → chunk-DNSD7DVJ.js} +67 -52
- package/dist/{chunk-RDF37HKB.cjs → chunk-DSSCERHI.cjs} +3 -2
- package/dist/{chunk-NAJ4IZKD.cjs → chunk-EA2MS25U.cjs} +8 -6
- package/dist/{chunk-SJAVBCOA.js → chunk-EEHWALXA.js} +94 -3
- package/dist/chunk-ES2HJQ4N.js +37 -0
- package/dist/{chunk-G27PQQFD.js → chunk-EYHKL4QC.js} +1 -1
- package/dist/{chunk-SV2WA57F.js → chunk-FBQJZKFX.js} +38 -15
- package/dist/chunk-FFBDRUO5.cjs +59 -0
- package/dist/{chunk-N7LI55V4.js → chunk-FFHSCM5M.js} +15 -8
- package/dist/{chunk-SAHBLB3E.js → chunk-FP46B4X3.js} +208 -3
- package/dist/chunk-FQVG6ZHF.js +197 -0
- package/dist/{chunk-J2GSFVUV.cjs → chunk-GAOPJ5S3.cjs} +74 -59
- package/dist/{chunk-S52YW5ZQ.js → chunk-GNBBIAMD.js} +16 -19
- package/dist/chunk-GSDV75A5.js +715 -0
- package/dist/chunk-GWY26SUD.cjs +63 -0
- package/dist/{chunk-TUAITHWL.js → chunk-H426KOGY.js} +2 -1
- package/dist/{chunk-EZMINVLU.js → chunk-H4D2Q2AL.js} +5 -2
- package/dist/chunk-HC2Q6A3E.cjs +4967 -0
- package/dist/{chunk-3WVJEL7K.cjs → chunk-HDK2EHVH.cjs} +3 -1
- package/dist/{chunk-5IXII4HX.cjs → chunk-HG3ZASBH.cjs} +23 -16
- package/dist/chunk-HK5A54AV.cjs +280 -0
- package/dist/{chunk-LQGVEP3E.js → chunk-HQUSEWT4.js} +45 -13
- package/dist/chunk-HSWWM6AM.js +2340 -0
- package/dist/chunk-HTU4W3GB.js +183 -0
- package/dist/{chunk-HLHTG5ZU.cjs → chunk-HVCIB4SW.cjs} +14 -12
- package/dist/chunk-HXHE2KAO.js +385 -0
- package/dist/{chunk-LJFUXC56.cjs → chunk-HXQREVTA.cjs} +9 -6
- package/dist/{chunk-SLQAYV3W.js → chunk-HZWU6IO3.js} +11 -2
- package/dist/chunk-I2ZK3AOD.js +866 -0
- package/dist/chunk-IEPLQ47J.js +719 -0
- package/dist/chunk-J5HE6CUM.cjs +124 -0
- package/dist/{chunk-LIEXWM2M.js → chunk-JAQO6XDB.js} +19 -1
- package/dist/chunk-JB3JCYBJ.js +113 -0
- package/dist/chunk-JCUHCH37.cjs +247 -0
- package/dist/{chunk-FPHU2ES6.cjs → chunk-JM3ZTQUK.cjs} +19 -9
- package/dist/{chunk-NDMIPTV4.js → chunk-JMJRFSNJ.js} +8 -3
- package/dist/{chunk-ZLSGXMGQ.js → chunk-JMN3GZU6.js} +2 -0
- package/dist/chunk-JPFRI4L4.js +4967 -0
- package/dist/{chunk-BVKXEQVG.cjs → chunk-JV5HVCHU.cjs} +22 -10
- package/dist/chunk-KA2U6MY2.js +388 -0
- package/dist/{chunk-SEKD5FH3.cjs → chunk-KASXKDF2.cjs} +8 -3
- package/dist/chunk-KJ26T7GM.cjs +367 -0
- package/dist/chunk-KM7R5YPS.cjs +385 -0
- package/dist/{chunk-MBBY4ZIK.js → chunk-KMP6Y3LJ.js} +4 -1
- package/dist/chunk-KWXGDSYT.js +184 -0
- package/dist/{chunk-C5IJIM2V.cjs → chunk-L46OUKW5.cjs} +68 -37
- package/dist/{chunk-6UJMCWRY.js → chunk-L6OH44HL.js} +19 -9
- package/dist/chunk-LANGD5CO.js +280 -0
- package/dist/{chunk-APIXPPMT.js → chunk-LEZEWKPA.js} +1004 -39
- package/dist/{chunk-ULQ6MDSJ.cjs → chunk-LFDPTJYF.cjs} +43 -35
- package/dist/chunk-LJD7KR3L.cjs +44 -0
- package/dist/{chunk-NCC6ETZS.js → chunk-LUMV3DB2.js} +41 -33
- package/dist/{chunk-QXH5RCFI.js → chunk-M5DK524Z.js} +2 -2
- package/dist/chunk-M7B7RRBK.cjs +1034 -0
- package/dist/chunk-MANJ67D3.js +3897 -0
- package/dist/{chunk-HPHJ73GU.cjs → chunk-MGNXABSU.cjs} +9 -9
- package/dist/{chunk-6ZCULLCA.js → chunk-MMKZSJUN.js} +1 -1
- package/dist/{chunk-DVUHHH3B.cjs → chunk-MQQH4XQH.cjs} +4 -4
- package/dist/chunk-MUNUUFU7.cjs +21 -0
- package/dist/{chunk-DVZOENQ7.cjs → chunk-MZN6JBRZ.cjs} +9 -4
- package/dist/{chunk-OOKY3HPZ.js → chunk-NB6M6ESM.js} +50 -9
- package/dist/{chunk-BYONM7UM.js → chunk-NBGOIFKP.js} +265 -18
- package/dist/chunk-NHWHEW7M.cjs +75 -0
- package/dist/chunk-NQZH5CR2.cjs +468 -0
- package/dist/{chunk-EGPXJERY.cjs → chunk-NV6LCD2I.cjs} +119 -28
- package/dist/chunk-NVATU4V6.cjs +44 -0
- package/dist/{chunk-YZXUDM5X.js → chunk-NZ3ZWLUW.js} +204 -62
- package/dist/chunk-NZ7GCK7Y.cjs +92 -0
- package/dist/{chunk-VEKDGU2Q.cjs → chunk-NZQFKXM3.cjs} +49 -25
- package/dist/chunk-O5GI6SR3.js +59 -0
- package/dist/{chunk-56SWIDEL.cjs → chunk-OCATAKXV.cjs} +57 -56
- package/dist/{chunk-SKV2F3NM.js → chunk-OIGYWOL6.js} +1 -1
- package/dist/{chunk-IFFXSTOM.cjs → chunk-ONVYXTUT.cjs} +3 -3
- package/dist/chunk-OR67YXQK.cjs +13 -0
- package/dist/chunk-OV3T5MUH.cjs +715 -0
- package/dist/{chunk-OHUZKDGX.js → chunk-P4FUTSVK.js} +3 -3
- package/dist/chunk-P6SLT2F4.cjs +139 -0
- package/dist/{chunk-TNZRZQ7Q.js → chunk-PB7W7R72.js} +3 -78
- package/dist/chunk-PCM3N3CL.cjs +37 -0
- package/dist/{chunk-2AA5MFES.js → chunk-PGFLPURU.js} +8 -5
- package/dist/{chunk-DJDE4DTT.cjs → chunk-PIXQ2AVM.cjs} +25 -19
- package/dist/chunk-PNIAIOMZ.cjs +229 -0
- package/dist/{chunk-HTLINWX6.cjs → chunk-PQBYFEBL.cjs} +16 -13
- package/dist/{chunk-22D2CNTP.cjs → chunk-PSAH4ZQB.cjs} +5 -2
- package/dist/{chunk-3VTAFAL2.js → chunk-PTTZI4QZ.js} +16 -12
- package/dist/{chunk-WPVWQSL7.cjs → chunk-PY73W5MQ.cjs} +16 -13
- package/dist/{chunk-EGMZDTSL.js → chunk-PZZMIYII.js} +10 -2
- package/dist/{chunk-HBZU3RBZ.js → chunk-Q3BS6FPM.js} +34 -10
- package/dist/chunk-QBYGMMDD.js +517 -0
- package/dist/chunk-QLZOMZO5.cjs +388 -0
- package/dist/{chunk-ADUFCS4Q.cjs → chunk-QQ64HEHP.cjs} +160 -79
- package/dist/{chunk-L3TWPROA.js → chunk-QRQF3556.js} +44 -24
- package/dist/{chunk-YHD6TUIR.cjs → chunk-QW2RW2GY.cjs} +2 -0
- package/dist/chunk-RAKO7UN7.js +114 -0
- package/dist/{chunk-7TQH3CL4.cjs → chunk-RBXBH6EB.cjs} +78 -35
- package/dist/chunk-RFUKZIJF.cjs +78 -0
- package/dist/chunk-RS2E32YB.js +71 -0
- package/dist/{chunk-OLSBBZW6.cjs → chunk-S5JNQIGL.cjs} +5 -5
- package/dist/{chunk-FTYY5JJD.js → chunk-S5QKRA2V.js} +2 -2
- package/dist/chunk-SD3NTC7D.cjs +77 -0
- package/dist/{chunk-KPELYZ6L.js → chunk-SDLY4X3G.js} +2 -2
- package/dist/{chunk-IDFF5J2E.js → chunk-SFFEKZGC.js} +38 -7
- package/dist/{chunk-EGFT4PGW.js → chunk-SHRLFX6F.js} +8 -3
- package/dist/{chunk-3WICOC33.js → chunk-SNDDZG5H.js} +124 -84
- package/dist/{chunk-CZXGCVTR.cjs → chunk-SOVR7S3T.cjs} +2 -2
- package/dist/chunk-SPQ7QIQ6.js +78 -0
- package/dist/{chunk-XRZEUWKF.js → chunk-SRMGWMQO.js} +1 -1
- package/dist/{chunk-R33VKSH5.cjs → chunk-SVVP4UUZ.cjs} +11 -11
- package/dist/{chunk-7BTSG4ME.cjs → chunk-SY2P3Z5W.cjs} +1004 -39
- package/dist/chunk-SZD45IDG.js +468 -0
- package/dist/{chunk-3O3MOK5C.cjs → chunk-TE4SYTWR.cjs} +1114 -142
- package/dist/chunk-TH26BQJG.js +101 -0
- package/dist/{chunk-QNGEW5TC.js → chunk-TR6NECEZ.js} +1 -1
- package/dist/{chunk-YGN4CQIP.js → chunk-TYBPTKFT.js} +1 -1
- package/dist/{chunk-GJH7XMSK.js → chunk-U2QUMKCB.js} +8 -6
- package/dist/{chunk-47CKWKEX.cjs → chunk-U6PLSPMD.cjs} +9 -4
- package/dist/chunk-UOQECODR.js +34 -0
- package/dist/chunk-UR27UDTB.js +354 -0
- package/dist/chunk-UWZ4G3SQ.js +93 -0
- package/dist/{chunk-Y72HH2TF.cjs → chunk-V3SZLWEQ.cjs} +33 -24
- package/dist/chunk-V4HGZSKQ.cjs +183 -0
- package/dist/{chunk-3PDTTAKJ.js → chunk-V5ELP2XE.js} +19 -12
- package/dist/{chunk-3K2ESU53.cjs → chunk-VKOXFT4L.cjs} +2 -2
- package/dist/{chunk-XTB6VJVQ.cjs → chunk-VLGGMQUN.cjs} +6 -6
- package/dist/chunk-VQHSYAPZ.cjs +3897 -0
- package/dist/chunk-VUGOOGHB.js +400 -0
- package/dist/chunk-W5QLA6WP.cjs +866 -0
- package/dist/chunk-WBU4Q4GS.cjs +400 -0
- package/dist/{chunk-KWXVKLQ5.cjs → chunk-WGNMOVMT.cjs} +7 -82
- package/dist/chunk-WJYFLQ7G.cjs +27 -0
- package/dist/{chunk-RKJTGGMU.cjs → chunk-WKRDBCP2.cjs} +221 -16
- package/dist/{chunk-ZSPXQYG2.js → chunk-WNJXIACY.js} +7 -5
- package/dist/{chunk-AYS2ASM7.js → chunk-WPE2XHVX.js} +1 -1
- package/dist/chunk-WTB7AFL6.cjs +101 -0
- package/dist/{chunk-JYTDYJVW.js → chunk-X3TI5TJJ.js} +1 -1
- package/dist/chunk-X5P6QQOB.cjs +719 -0
- package/dist/{chunk-245KJE5Y.cjs → chunk-X7XMITIL.cjs} +14 -6
- package/dist/chunk-XF2WIKHR.cjs +34 -0
- package/dist/{chunk-DV2ZHK7B.cjs → chunk-XNIMSVS6.cjs} +49 -26
- package/dist/chunk-XW3XCK4E.cjs +59 -0
- package/dist/{chunk-N23UAW4I.js → chunk-XZVDYC5U.js} +7 -2
- package/dist/chunk-Y5BDE24P.cjs +444 -0
- package/dist/{chunk-NAGQ2PDC.js → chunk-YC5OBZQU.js} +1604 -433
- package/dist/chunk-YISPVAXO.cjs +2340 -0
- package/dist/{chunk-KQGPTCQJ.js → chunk-YQDI753V.js} +68 -25
- package/dist/{chunk-UJ2JSM6H.js → chunk-YVQI26H4.js} +2 -0
- package/dist/{chunk-NNPAM4HC.cjs → chunk-YWH55BWK.cjs} +15 -6
- package/dist/{chunk-X2YOZQIP.cjs → chunk-YWTIXHU6.cjs} +266 -19
- package/dist/{chunk-XX2ZO7DS.js → chunk-YXM6SA7P.js} +25 -16
- package/dist/chunk-YZWE7XSM.js +5 -0
- package/dist/chunk-ZASDSY7P.cjs +114 -0
- package/dist/{chunk-2UC22DJU.js → chunk-ZNGRLCFQ.js} +30 -4
- package/dist/{chunk-KANW6OYC.cjs → chunk-ZNYZB7XY.cjs} +34 -8
- package/dist/{chunk-NA6WQDYW.js → chunk-ZPLCAXJW.js} +1088 -116
- package/dist/{chunk-7UOUW76C.js → chunk-ZQAT5VT5.js} +101 -24
- package/dist/chunk-ZUYYHKQA.js +44 -0
- package/dist/clear-QJXU25IF.cjs +12 -0
- package/dist/{clear-A3N4GK2S.js → clear-Y5TO3RZA.js} +3 -3
- package/dist/communityInstaller-LXMVKVAV.cjs +22 -0
- package/dist/{communityInstaller-LOP2EDH5.js → communityInstaller-RVL4STPS.js} +8 -5
- package/dist/completion-JX4T2ONW.cjs +17 -0
- package/dist/completion-SE3XYG74.js +17 -0
- package/dist/config-3224PRW4.cjs +21 -0
- package/dist/{config-HPJPKTO6.js → config-7KPHKFTP.js} +7 -4
- package/dist/{constants-LISJW3DD.js → constants-EJFAWJQI.js} +1 -1
- package/dist/constants-MCCGUU5F.cjs +21 -0
- package/dist/{defaultHooks-IHSJR2AX.cjs → defaultHooks-2V2CQL63.cjs} +25 -10
- package/dist/{defaultHooks-KUKHK3AG.js → defaultHooks-TMHDU3FS.js} +25 -10
- package/dist/export-BJVIDZC4.js +15 -0
- package/dist/export-KU4557HK.cjs +15 -0
- package/dist/feature-K3LG5IJP.cjs +14 -0
- package/dist/feature-V4JF5TNJ.js +14 -0
- package/dist/features-5OJTLKS7.js +23 -0
- package/dist/features-VCBJQXCX.cjs +23 -0
- package/dist/feedback-D4437VE4.js +18 -0
- package/dist/feedback-VZPEHGFY.cjs +18 -0
- package/dist/fffSearchProvider-2YCNKOYD.js +412 -0
- package/dist/fffSearchProvider-W6627E2V.cjs +412 -0
- package/dist/{filesystem-Z7BWAWMZ.js → filesystem-L6DQKGWK.js} +3 -2
- package/dist/filesystem-PGUPCMVK.cjs +11 -0
- package/dist/go-X4E6BCD6.js +12 -0
- package/dist/go-XREVFS5I.cjs +12 -0
- package/dist/goal-4M3J6JS2.cjs +16 -0
- package/dist/goal-EI66BV7W.js +16 -0
- package/dist/help-GGFS7WHY.cjs +12 -0
- package/dist/{help-GFQXNZOK.js → help-MLIROWKM.js} +2 -2
- package/dist/{history-E3N6BJP7.js → history-GQJ6RZD6.js} +2 -2
- package/dist/history-J4LUIOSI.cjs +14 -0
- package/dist/hooks-FSRIUS6A.cjs +18 -0
- package/dist/hooks-PPFHCF7T.js +18 -0
- package/dist/i18n-CI6VFXL5.cjs +33 -0
- package/dist/{i18n-SY7QRM22.js → i18n-Q7UZJRPL.js} +1 -1
- package/dist/ide-BUSVE54P.js +15 -0
- package/dist/ide-YR27BPGM.cjs +15 -0
- package/dist/immediateCommandRouter-MTEHZXQX.js +15 -0
- package/dist/immediateCommandRouter-ROXU3MWT.cjs +15 -0
- package/dist/{import-W7SVLSTC.js → import-3VBKI6BN.js} +3 -3
- package/dist/{import-ADI37ZUR.cjs → import-C7S6UJMW.cjs} +3 -3
- package/dist/import-DBK4OCDF.cjs +10 -0
- package/dist/{import-KGKKZ3B7.js → import-U47DXCA7.js} +2 -2
- package/dist/index.cjs +837 -23011
- package/dist/index.d.cts +95 -0
- package/dist/index.d.ts +95 -0
- package/dist/index.js +864 -23038
- package/dist/init-OXTYS72D.cjs +10 -0
- package/dist/{init-7MFK626E.js → init-Q2O4R42R.js} +2 -2
- package/dist/inkMode-VUE6ZDLD.cjs +7 -0
- package/dist/inkMode-WBNFOSAT.js +7 -0
- package/dist/inputPrompt-3CFZDUBH.js +90 -0
- package/dist/inputPrompt-JMACL4EB.cjs +90 -0
- package/dist/language-EK3M6UBV.cjs +22 -0
- package/dist/language-Q3RUGGOW.js +22 -0
- package/dist/learn-3DSX7DYG.cjs +23 -0
- package/dist/learn-OPOH5L43.js +23 -0
- package/dist/login-GST7MWXJ.cjs +27 -0
- package/dist/login-Q7DZKAX4.js +27 -0
- package/dist/logout-2G7OUK7I.cjs +24 -0
- package/dist/logout-FNBBL2UI.js +24 -0
- package/dist/mcp-AH3MMUBU.js +21 -0
- package/dist/mcp-DW7R63IB.cjs +21 -0
- package/dist/{mcp-install-2FEROZTL.js → mcp-install-222PCKSW.js} +18 -10
- package/dist/{mcp-install-WM6BQRI5.cjs → mcp-install-IA4ZS2SV.cjs} +22 -14
- package/dist/memory-6NX3DAIY.cjs +10 -0
- package/dist/{memory-J73WZH2I.js → memory-VB46T5H3.js} +2 -2
- package/dist/model-64NAELFS.cjs +10 -0
- package/dist/{model-AES267IN.js → model-SJJG64AM.js} +2 -2
- package/dist/new-DU5SOOOY.cjs +12 -0
- package/dist/{new-5CLF3MKH.js → new-ERZ5C6CN.js} +3 -3
- package/dist/onboarding-2U2BV2KE.cjs +36 -0
- package/dist/onboarding-ZQXMPSMJ.js +36 -0
- package/dist/permissions-7ACNFK7A.js +10 -0
- package/dist/permissions-GSNNV7RJ.cjs +10 -0
- package/dist/plan-XEJMOT55.cjs +13 -0
- package/dist/{plan-65HMS5HQ.js → plan-YYUAXPTL.js} +3 -1
- package/dist/pr-review-CW6J7P62.cjs +9 -0
- package/dist/pr-review-YZSBQVT2.js +9 -0
- package/dist/{quit-XDZYRSPU.js → quit-WY6T267G.js} +2 -2
- package/dist/quit-XIRE2KRE.cjs +10 -0
- package/dist/rawMode-6W5AXAKI.cjs +7 -0
- package/dist/rawMode-GFNLXQPU.js +7 -0
- package/dist/{registry-PTHWERKC.js → registry-4DXUDKJN.js} +29 -44
- package/dist/{registry-IVT4G2RT.cjs → registry-UEO3ETZ7.cjs} +65 -80
- package/dist/repeat-P4FAPE3Y.cjs +17 -0
- package/dist/{repeat-EVCWUL6Z.js → repeat-RALE6AUO.js} +7 -3
- package/dist/resume-RQZ3WXBP.cjs +17 -0
- package/dist/resume-XSXZMDMD.js +17 -0
- package/dist/review-QHP2KP4Q.js +9 -0
- package/dist/review-UWHWQHCB.cjs +9 -0
- package/dist/ripgrep-67SCU2BA.cjs +9 -0
- package/dist/ripgrep-VHJQQ55W.js +9 -0
- package/dist/rpc-XH7QLN4H.js +3874 -0
- package/dist/rpc-YF54T7JU.cjs +3874 -0
- package/dist/search-VXXFGZWU.cjs +21 -0
- package/dist/search-YAWGX7P7.js +21 -0
- package/dist/{sessions-6GWEBMKS.js → sessions-NJYHJOEL.js} +2 -2
- package/dist/sessions-OSG3UJEZ.cjs +10 -0
- package/dist/settings-SO2UIGWV.cjs +42 -0
- package/dist/settings-ZXUQH3DO.js +42 -0
- package/dist/setup-KG7EGKF5.js +30 -0
- package/dist/setup-RSOPCQ57.cjs +30 -0
- package/dist/share-WFAGZ5PY.js +17 -0
- package/dist/share-ZU3SGACF.cjs +17 -0
- package/dist/skills-KBVAQAD2.cjs +29 -0
- package/dist/skills-NBTNDVAY.js +29 -0
- package/dist/{skills-ZZCIAS7C.js → skills-OB6RDW7D.js} +10 -7
- package/dist/{skills-PG542VEB.cjs → skills-ZROBG3RZ.cjs} +13 -10
- package/dist/{skills-install-SRC3Z2MS.js → skills-install-BHTIEMKH.js} +21 -70
- package/dist/{skills-install-67DOBPJC.cjs → skills-install-ILX6QVEF.cjs} +34 -83
- package/dist/skills-new-B45VQ2PP.cjs +18 -0
- package/dist/skills-new-YMRP2HNO.js +18 -0
- package/dist/slashCommands-53VYIBJU.js +105 -0
- package/dist/slashCommands-BG2RGGZ6.cjs +105 -0
- package/dist/status-CQ2IUOVK.cjs +24 -0
- package/dist/status-E7IGNVPC.js +24 -0
- package/dist/summarizer-DGPHE5IQ.js +17 -0
- package/dist/summarizer-JNXLUAQG.cjs +17 -0
- package/dist/sync-7C25MOT2.js +22 -0
- package/dist/{sync-VU2NSJ4O.js → sync-OCJN4ZSO.js} +3 -3
- package/dist/sync-XRP46IVG.cjs +40 -0
- package/dist/sync-ZMFVE7T4.cjs +22 -0
- package/dist/{teammate-SXRVXNQV.cjs → teammate-D77B6QRT.cjs} +31 -9
- package/dist/{teammate-SD26GR37.js → teammate-EZCMHOIL.js} +30 -8
- package/dist/templates-ARG2VRWW.cjs +11 -0
- package/dist/templates-UGVZV3KJ.js +11 -0
- package/dist/theme-KKRDE6P7.cjs +22 -0
- package/dist/theme-XF7XIWBQ.js +22 -0
- package/dist/tools-3PPTTKFV.js +9 -0
- package/dist/tools-THIQA7WC.cjs +9 -0
- package/dist/ui/questionModal.cjs +8 -5
- package/dist/ui/questionModal.js +7 -4
- package/dist/{undo-OL2EDBRY.js → undo-GNUTFXCW.js} +2 -2
- package/dist/undo-U4KN7QQM.cjs +10 -0
- package/dist/usage-QSTNSDAO.js +24 -0
- package/dist/usage-YDEMQBNQ.cjs +24 -0
- package/dist/web-3BA2WV37.cjs +37 -0
- package/dist/web-6FYGBX5K.js +37 -0
- package/dist/workspaceSafety-MDJGHK6D.cjs +9 -0
- package/dist/workspaceSafety-XOUMUBVB.js +9 -0
- package/dist/yolo-GF2YD7ZI.js +9 -0
- package/dist/yolo-OGDA7HNC.cjs +9 -0
- package/dist/yoloMode-3DJDA75U.cjs +17 -0
- package/dist/yoloMode-4JOOSU26.js +17 -0
- package/package.json +51 -49
- package/dist/AgentRegistry-HRPN6ZOF.cjs +0 -10
- package/dist/CommunitySkillsCache-KE435RAR.cjs +0 -8
- package/dist/GitHubRegistryFetcher-I45SESIL.cjs +0 -7
- package/dist/LearnAdvisor-FLBA6FDD.js +0 -9
- package/dist/LearnAdvisor-GG3CXQF3.cjs +0 -9
- package/dist/MemoryManager-2LQPIYVE.cjs +0 -8
- package/dist/PermissionManager-X57BXHJ6.cjs +0 -11
- package/dist/ProviderFactory-KPJOGQWF.cjs +0 -9
- package/dist/SessionManager-YBJAZXNO.cjs +0 -10
- package/dist/SkillsRegistry-7O72A6TZ.cjs +0 -9
- package/dist/SubAgent-JT4HZHN7.js +0 -11
- package/dist/SubAgent-VPNYDWAU.cjs +0 -11
- package/dist/SyncApiClient-HQXJL5BT.cjs +0 -11
- package/dist/about-4DB5KTHW.js +0 -12
- package/dist/about-LXAOXZFT.cjs +0 -12
- package/dist/actionExecutor-23JB2WUC.js +0 -19
- package/dist/actionExecutor-X5UEZSKH.cjs +0 -19
- package/dist/add-dir-YC37DMSF.cjs +0 -10
- package/dist/agents-YF3BSUU5.js +0 -12
- package/dist/agents-ZOUHPMYR.cjs +0 -12
- package/dist/agents-new-HSH4GQPG.js +0 -14
- package/dist/agents-new-VYUDOCE7.cjs +0 -14
- package/dist/autoSkill-X5W52WOE.cjs +0 -20
- package/dist/automode-SJGM7VEI.cjs +0 -10
- package/dist/chunk-ALYU6VTM.js +0 -105
- package/dist/chunk-B53A2NM2.js +0 -2030
- package/dist/chunk-BJXSNT46.js +0 -100
- package/dist/chunk-CB4E2T5N.cjs +0 -312
- package/dist/chunk-DNUOXBHL.js +0 -539
- package/dist/chunk-EFX2QSZX.cjs +0 -33
- package/dist/chunk-GCXYXLRA.cjs +0 -111
- package/dist/chunk-H2ZRHQQV.js +0 -33
- package/dist/chunk-HNRPK5MY.cjs +0 -85
- package/dist/chunk-HVKOZ2VP.cjs +0 -115
- package/dist/chunk-JJLYWH5Y.cjs +0 -100
- package/dist/chunk-LWUJFGOZ.js +0 -115
- package/dist/chunk-MERYP6AM.cjs +0 -539
- package/dist/chunk-MZAPWNAC.cjs +0 -207
- package/dist/chunk-NTSDP2WB.js +0 -226
- package/dist/chunk-OUZQXMHL.cjs +0 -226
- package/dist/chunk-PGESAU2W.cjs +0 -2030
- package/dist/chunk-SYVYLZZF.cjs +0 -24
- package/dist/chunk-SZOLA6FR.js +0 -111
- package/dist/chunk-VWDHR4HV.js +0 -168
- package/dist/chunk-Y45G6ZO5.cjs +0 -168
- package/dist/chunk-YRLYSQEQ.cjs +0 -105
- package/dist/chunk-ZYVS43MU.js +0 -312
- package/dist/clear-GK4IEUUS.cjs +0 -12
- package/dist/communityInstaller-XXC7RLE4.cjs +0 -19
- package/dist/completion-HWABSAEL.js +0 -14
- package/dist/completion-IUUVQG4D.cjs +0 -14
- package/dist/config-HF7WOLZF.cjs +0 -18
- package/dist/constants-PEO3P2SJ.cjs +0 -21
- package/dist/export-QJAV2FCZ.js +0 -12
- package/dist/export-XSRFXGWU.cjs +0 -12
- package/dist/feedback-4TCIL3ML.cjs +0 -15
- package/dist/feedback-SJ6VVEY3.js +0 -15
- package/dist/filesystem-W56QZUJF.cjs +0 -10
- package/dist/help-ISBVQL3S.cjs +0 -12
- package/dist/history-XQ4GTSFU.cjs +0 -14
- package/dist/hooks-CJNKJ5PF.js +0 -13
- package/dist/hooks-UTMBTAXT.cjs +0 -13
- package/dist/i18n-N7QQ7A5M.cjs +0 -33
- package/dist/ide-RTA4UJV4.js +0 -12
- package/dist/ide-VWVOLIFF.cjs +0 -12
- package/dist/immediateCommandRouter-BW34JNXL.js +0 -9
- package/dist/immediateCommandRouter-SHOVNB5X.cjs +0 -9
- package/dist/import-ZLJVONXH.cjs +0 -10
- package/dist/init-TBKAB4LZ.cjs +0 -10
- package/dist/language-MDSHEXHB.cjs +0 -18
- package/dist/language-PXTQSHIG.js +0 -18
- package/dist/learn-623TW5EK.cjs +0 -20
- package/dist/learn-BCPV7GM2.js +0 -20
- package/dist/localProjectPermissions-BHQXEWZJ.cjs +0 -18
- package/dist/localProjectPermissions-GMOUYQM6.js +0 -18
- package/dist/login-QMVEETWJ.js +0 -20
- package/dist/login-QYMXAL3K.cjs +0 -20
- package/dist/logout-2CMTDAOJ.js +0 -18
- package/dist/logout-ZOHVZAUK.cjs +0 -18
- package/dist/mcp-IUVKK65S.js +0 -18
- package/dist/mcp-TXC7PYG3.cjs +0 -18
- package/dist/memory-WRIHDEPK.cjs +0 -10
- package/dist/model-RLP75SF5.cjs +0 -10
- package/dist/new-HLSFL6A4.cjs +0 -12
- package/dist/permissions-GP6FTGZ2.js +0 -13
- package/dist/permissions-O6EKKPOG.cjs +0 -13
- package/dist/plan-MCAXDIM2.cjs +0 -11
- package/dist/quit-TQX6GXA5.cjs +0 -10
- package/dist/repeat-BSPS5TWD.cjs +0 -13
- package/dist/resume-2GOPDLL4.cjs +0 -13
- package/dist/resume-37IUVDA6.js +0 -13
- package/dist/search-7KUSHIBL.cjs +0 -17
- package/dist/search-OJGDRIMA.js +0 -17
- package/dist/sessions-CYYCHSQG.cjs +0 -10
- package/dist/settings-2D7CAO66.cjs +0 -30
- package/dist/settings-BXR6SBJP.js +0 -30
- package/dist/share-BXQY5IQU.js +0 -14
- package/dist/share-OSFXZBGS.cjs +0 -14
- package/dist/skills-FL6O6AOM.cjs +0 -26
- package/dist/skills-PNKQZRNK.js +0 -26
- package/dist/skills-new-XFMEHHIF.cjs +0 -15
- package/dist/skills-new-ZNZPHUKS.js +0 -15
- package/dist/slashCommands-LLCNPK3X.js +0 -76
- package/dist/slashCommands-RXZZS6RE.cjs +0 -76
- package/dist/status-BCECUJXT.cjs +0 -11
- package/dist/status-EFO7MQU3.js +0 -11
- package/dist/sync-IJYJ6KKM.js +0 -18
- package/dist/sync-LFT6SBPF.cjs +0 -18
- package/dist/sync-U7SDPBNZ.cjs +0 -40
- package/dist/theme-AWBHSG7J.cjs +0 -18
- package/dist/theme-TQLBPJ2E.js +0 -18
- package/dist/undo-IBBGP7A2.cjs +0 -10
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// src/permissions/yoloMode.ts
|
|
2
|
+
var DEFAULT_YOLO_FILE_TOOLS = [
|
|
3
|
+
"read_file",
|
|
4
|
+
"write_file",
|
|
5
|
+
"list_dir",
|
|
6
|
+
"file_search",
|
|
7
|
+
"grep_search",
|
|
8
|
+
"move_path",
|
|
9
|
+
"copy_path",
|
|
10
|
+
"run_command",
|
|
11
|
+
"shell"
|
|
12
|
+
];
|
|
13
|
+
function getDefaultYoloPattern() {
|
|
14
|
+
return "allow:*";
|
|
15
|
+
}
|
|
16
|
+
function normalizeYoloInput(pattern) {
|
|
17
|
+
if (pattern === void 0 || pattern === false) {
|
|
18
|
+
return void 0;
|
|
19
|
+
}
|
|
20
|
+
if (pattern === true) {
|
|
21
|
+
return getDefaultYoloPattern();
|
|
22
|
+
}
|
|
23
|
+
const trimmed = pattern.trim();
|
|
24
|
+
return trimmed.length > 0 ? trimmed : getDefaultYoloPattern();
|
|
25
|
+
}
|
|
26
|
+
function parseYoloPattern(pattern) {
|
|
27
|
+
const trimmed = pattern.trim();
|
|
28
|
+
if (trimmed.length === 0) {
|
|
29
|
+
throw new Error("YOLO pattern cannot be empty");
|
|
30
|
+
}
|
|
31
|
+
if (trimmed === "true") {
|
|
32
|
+
return { mode: "allow", tools: ["*"] };
|
|
33
|
+
}
|
|
34
|
+
const colonIndex = trimmed.indexOf(":");
|
|
35
|
+
if (colonIndex === -1) {
|
|
36
|
+
throw new Error(
|
|
37
|
+
`Invalid YOLO pattern "${pattern}". Expected format: allow:<tools> or deny:<tools>`
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
const mode = trimmed.slice(0, colonIndex).trim().toLowerCase();
|
|
41
|
+
const toolsPart = trimmed.slice(colonIndex + 1);
|
|
42
|
+
if (mode !== "allow" && mode !== "deny") {
|
|
43
|
+
throw new Error(
|
|
44
|
+
`Invalid YOLO mode "${mode}". Must be "allow" or "deny".`
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
const tools = toolsPart.split(",").map((t) => t.trim()).filter((t) => t.length > 0);
|
|
48
|
+
if (tools.length === 0) {
|
|
49
|
+
throw new Error("YOLO pattern must specify at least one tool");
|
|
50
|
+
}
|
|
51
|
+
return { mode, tools };
|
|
52
|
+
}
|
|
53
|
+
function isToolAllowedByYolo(toolName, pattern) {
|
|
54
|
+
const isWildcard = pattern.tools.includes("*");
|
|
55
|
+
const isListed = pattern.tools.includes(toolName);
|
|
56
|
+
if (pattern.mode === "allow") {
|
|
57
|
+
return isWildcard || isListed;
|
|
58
|
+
}
|
|
59
|
+
if (isWildcard) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return !isListed;
|
|
63
|
+
}
|
|
64
|
+
function buildPermissionSettingsFromYolo(pattern) {
|
|
65
|
+
if (pattern.mode === "allow" && pattern.tools.includes("*")) {
|
|
66
|
+
return { mode: "unrestricted" };
|
|
67
|
+
}
|
|
68
|
+
if (pattern.mode === "allow") {
|
|
69
|
+
const allowPatterns = pattern.tools.map((tool) => ({ kind: tool }));
|
|
70
|
+
const pathAffectingTools = /* @__PURE__ */ new Set(["read_file", "write_file", "multi_file_edit", "move_path", "copy_path"]);
|
|
71
|
+
const defaultTools = new Set(DEFAULT_YOLO_FILE_TOOLS);
|
|
72
|
+
const patternPathTools = pattern.tools.filter((tool) => pathAffectingTools.has(tool));
|
|
73
|
+
const allPathToolsAreDefault = patternPathTools.every((tool) => defaultTools.has(tool));
|
|
74
|
+
return {
|
|
75
|
+
allowPatterns,
|
|
76
|
+
allPathsAllowed: allPathToolsAreDefault
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
denyPatterns: pattern.tools.map((tool) => ({ kind: tool }))
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
var YoloTimer = class {
|
|
84
|
+
startTime;
|
|
85
|
+
durationMs;
|
|
86
|
+
constructor(timeoutSeconds) {
|
|
87
|
+
this.startTime = Date.now();
|
|
88
|
+
this.durationMs = timeoutSeconds * 1e3;
|
|
89
|
+
}
|
|
90
|
+
/** Whether the timer is still active (within the timeout window). */
|
|
91
|
+
isActive() {
|
|
92
|
+
if (this.durationMs <= 0) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return Date.now() - this.startTime < this.durationMs;
|
|
96
|
+
}
|
|
97
|
+
/** Seconds remaining before the timer expires (minimum 0). */
|
|
98
|
+
remainingSeconds() {
|
|
99
|
+
if (this.durationMs <= 0) {
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
const elapsed = Date.now() - this.startTime;
|
|
103
|
+
const remaining = Math.max(0, this.durationMs - elapsed);
|
|
104
|
+
return Math.ceil(remaining / 1e3);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
export {
|
|
109
|
+
getDefaultYoloPattern,
|
|
110
|
+
normalizeYoloInput,
|
|
111
|
+
parseYoloPattern,
|
|
112
|
+
isToolAllowedByYolo,
|
|
113
|
+
buildPermissionSettingsFromYolo,
|
|
114
|
+
YoloTimer
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* YOLO Mode - Granular Auto-Approve with Timeout
|
|
118
|
+
*
|
|
119
|
+
* Provides pattern-based tool allow/deny and time-bounded auto-approve.
|
|
120
|
+
*
|
|
121
|
+
* @license
|
|
122
|
+
* Copyright 2025 Autohand AI LLC
|
|
123
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
124
|
+
*/
|
|
@@ -1,30 +1,40 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkWKRDBCP2cjs = require('./chunk-WKRDBCP2.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _chunkCK4HAHVYcjs = require('./chunk-CK4HAHVY.cjs');
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
var
|
|
11
|
+
var _chunkX5P6QQOBcjs = require('./chunk-X5P6QQOB.cjs');
|
|
12
12
|
|
|
13
13
|
// src/commands/search.ts
|
|
14
14
|
var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
|
|
15
15
|
async function search(ctx) {
|
|
16
|
-
const currentConfig =
|
|
16
|
+
const currentConfig = _chunkWKRDBCP2cjs.getSearchConfig.call(void 0, );
|
|
17
17
|
const config = ctx.config;
|
|
18
18
|
console.log(_chalk2.default.bold("\nWeb Search Configuration\n"));
|
|
19
19
|
console.log(_chalk2.default.gray(`Current provider: ${_chalk2.default.cyan(currentConfig.provider)}`));
|
|
20
20
|
const braveKeySet = !!(currentConfig.braveApiKey || process.env.BRAVE_SEARCH_API_KEY);
|
|
21
21
|
const parallelKeySet = !!(currentConfig.parallelApiKey || process.env.PARALLEL_API_KEY);
|
|
22
|
+
const exaKeySet = !!(currentConfig.exaApiKey || process.env.EXA_API_KEY);
|
|
22
23
|
console.log(_chalk2.default.gray(`Brave API key: ${braveKeySet ? _chalk2.default.green("configured") : _chalk2.default.yellow("not set")}`));
|
|
23
24
|
console.log(_chalk2.default.gray(`Parallel API key: ${parallelKeySet ? _chalk2.default.green("configured") : _chalk2.default.yellow("not set")}`));
|
|
25
|
+
console.log(_chalk2.default.gray(`Exa API key: ${exaKeySet ? _chalk2.default.green("configured") : _chalk2.default.yellow("not set")}`));
|
|
24
26
|
console.log();
|
|
25
27
|
const providerOptions = [
|
|
26
28
|
{
|
|
27
|
-
label: `
|
|
29
|
+
label: `Browser Profile ${_chalk2.default.gray("(uses your Chrome/Brave cookies - no API key)")}`,
|
|
30
|
+
value: "browser-profile"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
label: `Exa.ai ${_chalk2.default.gray("(requires API key)")} ${exaKeySet ? _chalk2.default.green("\u2713") : ""}`,
|
|
34
|
+
value: "exa"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
label: `Google ${_chalk2.default.gray("(no API key required)")}`,
|
|
28
38
|
value: "google"
|
|
29
39
|
},
|
|
30
40
|
{
|
|
@@ -41,7 +51,7 @@ async function search(ctx) {
|
|
|
41
51
|
}
|
|
42
52
|
];
|
|
43
53
|
try {
|
|
44
|
-
const result = await
|
|
54
|
+
const result = await _chunkCK4HAHVYcjs.showModal.call(void 0, {
|
|
45
55
|
title: "Select search provider:",
|
|
46
56
|
options: providerOptions,
|
|
47
57
|
initialIndex: providerOptions.findIndex((c) => c.value === currentConfig.provider)
|
|
@@ -53,12 +63,25 @@ async function search(ctx) {
|
|
|
53
63
|
const provider = result.value;
|
|
54
64
|
let braveApiKey = currentConfig.braveApiKey;
|
|
55
65
|
let parallelApiKey = currentConfig.parallelApiKey;
|
|
66
|
+
let exaApiKey = currentConfig.exaApiKey;
|
|
67
|
+
if (provider === "exa" && !exaKeySet) {
|
|
68
|
+
console.log(_chalk2.default.gray("\nGet your Exa.ai API key at: https://exa.ai\n"));
|
|
69
|
+
const apiKey = await _chunkCK4HAHVYcjs.showPassword.call(void 0, {
|
|
70
|
+
title: "Enter Exa.ai API key:"
|
|
71
|
+
});
|
|
72
|
+
if (_optionalChain([apiKey, 'optionalAccess', _ => _.trim, 'call', _2 => _2()])) {
|
|
73
|
+
exaApiKey = apiKey.trim();
|
|
74
|
+
} else {
|
|
75
|
+
console.log(_chalk2.default.yellow("No API key entered. Exa.ai Search will not work without an API key."));
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
56
79
|
if (provider === "brave" && !braveKeySet) {
|
|
57
80
|
console.log(_chalk2.default.gray("\nGet your free Brave Search API key at: https://brave.com/search/api/\n"));
|
|
58
|
-
const apiKey = await
|
|
81
|
+
const apiKey = await _chunkCK4HAHVYcjs.showPassword.call(void 0, {
|
|
59
82
|
title: "Enter Brave Search API key:"
|
|
60
83
|
});
|
|
61
|
-
if (_optionalChain([apiKey, 'optionalAccess',
|
|
84
|
+
if (_optionalChain([apiKey, 'optionalAccess', _3 => _3.trim, 'call', _4 => _4()])) {
|
|
62
85
|
braveApiKey = apiKey.trim();
|
|
63
86
|
} else {
|
|
64
87
|
console.log(_chalk2.default.yellow("No API key entered. Brave Search will not work without an API key."));
|
|
@@ -67,28 +90,30 @@ async function search(ctx) {
|
|
|
67
90
|
}
|
|
68
91
|
if (provider === "parallel" && !parallelKeySet) {
|
|
69
92
|
console.log(_chalk2.default.gray("\nGet your Parallel.ai API key at: https://platform.parallel.ai\n"));
|
|
70
|
-
const apiKey = await
|
|
93
|
+
const apiKey = await _chunkCK4HAHVYcjs.showPassword.call(void 0, {
|
|
71
94
|
title: "Enter Parallel.ai API key:"
|
|
72
95
|
});
|
|
73
|
-
if (_optionalChain([apiKey, 'optionalAccess',
|
|
96
|
+
if (_optionalChain([apiKey, 'optionalAccess', _5 => _5.trim, 'call', _6 => _6()])) {
|
|
74
97
|
parallelApiKey = apiKey.trim();
|
|
75
98
|
} else {
|
|
76
99
|
console.log(_chalk2.default.yellow("No API key entered. Parallel.ai Search will not work without an API key."));
|
|
77
100
|
return null;
|
|
78
101
|
}
|
|
79
102
|
}
|
|
80
|
-
|
|
103
|
+
_chunkWKRDBCP2cjs.configureSearch.call(void 0, {
|
|
81
104
|
provider,
|
|
82
105
|
braveApiKey,
|
|
83
|
-
parallelApiKey
|
|
106
|
+
parallelApiKey,
|
|
107
|
+
exaApiKey
|
|
84
108
|
});
|
|
85
109
|
if (config) {
|
|
86
110
|
config.search = {
|
|
87
111
|
provider,
|
|
88
112
|
braveApiKey,
|
|
89
|
-
parallelApiKey
|
|
113
|
+
parallelApiKey,
|
|
114
|
+
exaApiKey
|
|
90
115
|
};
|
|
91
|
-
await
|
|
116
|
+
await _chunkX5P6QQOBcjs.saveConfig.call(void 0, config);
|
|
92
117
|
console.log(_chalk2.default.green(`
|
|
93
118
|
\u2713 Search provider set to ${provider} and saved to config`));
|
|
94
119
|
} else {
|
|
@@ -96,6 +121,12 @@ async function search(ctx) {
|
|
|
96
121
|
\u2713 Search provider set to ${provider} (session only)`));
|
|
97
122
|
}
|
|
98
123
|
switch (provider) {
|
|
124
|
+
case "browser-profile":
|
|
125
|
+
console.log(_chalk2.default.gray("Browser Profile Search is now active. Uses your Chrome/Brave cookies for better results."));
|
|
126
|
+
break;
|
|
127
|
+
case "exa":
|
|
128
|
+
console.log(_chalk2.default.gray("Exa.ai Search is now active with neural search capabilities."));
|
|
129
|
+
break;
|
|
99
130
|
case "google":
|
|
100
131
|
console.log(_chalk2.default.gray("Google Search is now active. No API key required."));
|
|
101
132
|
break;
|
|
@@ -116,7 +147,7 @@ async function search(ctx) {
|
|
|
116
147
|
}
|
|
117
148
|
var metadata = {
|
|
118
149
|
command: "/search",
|
|
119
|
-
description: "configure web search provider (google, brave, duckduckgo, parallel)",
|
|
150
|
+
description: "configure web search provider (browser-profile, exa, google, brave, duckduckgo, parallel)",
|
|
120
151
|
implemented: true
|
|
121
152
|
};
|
|
122
153
|
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getAssistantChatLogContent
|
|
3
|
+
} from "./chunk-RS2E32YB.js";
|
|
4
|
+
import {
|
|
5
|
+
package_default
|
|
6
|
+
} from "./chunk-JB3JCYBJ.js";
|
|
7
|
+
import {
|
|
8
|
+
AUTOHAND_FILES
|
|
9
|
+
} from "./chunk-SHRLFX6F.js";
|
|
10
|
+
|
|
11
|
+
// src/commands/go.ts
|
|
12
|
+
import os from "os";
|
|
13
|
+
import chalk from "chalk";
|
|
14
|
+
import QRCode from "qrcode";
|
|
15
|
+
import terminalLink from "terminal-link";
|
|
16
|
+
|
|
17
|
+
// src/mobile/MobileHandoffClient.ts
|
|
18
|
+
import crypto from "crypto";
|
|
19
|
+
import fs from "fs-extra";
|
|
20
|
+
import path from "path";
|
|
21
|
+
var DEFAULT_API_BASE_URL = "https://api.autohand.ai";
|
|
22
|
+
var DEFAULT_TIMEOUT_MS = 1e4;
|
|
23
|
+
function getMobileApiBaseUrl(config) {
|
|
24
|
+
return (config?.api?.baseUrl || process.env.AUTOHAND_API_URL || DEFAULT_API_BASE_URL).replace(/\/+$/, "");
|
|
25
|
+
}
|
|
26
|
+
var MobileHandoffClient = class {
|
|
27
|
+
baseUrl;
|
|
28
|
+
timeoutMs;
|
|
29
|
+
constructor(config = {}) {
|
|
30
|
+
this.baseUrl = (config.baseUrl || DEFAULT_API_BASE_URL).replace(/\/+$/, "");
|
|
31
|
+
this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
32
|
+
}
|
|
33
|
+
async getDeviceId() {
|
|
34
|
+
try {
|
|
35
|
+
await fs.ensureDir(path.dirname(AUTOHAND_FILES.deviceId));
|
|
36
|
+
if (await fs.pathExists(AUTOHAND_FILES.deviceId)) {
|
|
37
|
+
const existing = (await fs.readFile(AUTOHAND_FILES.deviceId, "utf8")).trim();
|
|
38
|
+
if (existing) return existing;
|
|
39
|
+
}
|
|
40
|
+
const next = crypto.randomUUID();
|
|
41
|
+
await fs.writeFile(AUTOHAND_FILES.deviceId, next);
|
|
42
|
+
return next;
|
|
43
|
+
} catch {
|
|
44
|
+
return crypto.randomUUID();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async registerDevice(token, payload) {
|
|
48
|
+
await this.request("/v1/devices/register", token, {
|
|
49
|
+
method: "POST",
|
|
50
|
+
body: JSON.stringify({
|
|
51
|
+
deviceId: payload.deviceId,
|
|
52
|
+
clientType: payload.clientType ?? "cli",
|
|
53
|
+
agentName: payload.agentName,
|
|
54
|
+
metadata: payload.metadata
|
|
55
|
+
}),
|
|
56
|
+
headers: {
|
|
57
|
+
"X-Device-ID": payload.deviceId
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async createPairing(token, payload) {
|
|
62
|
+
const data = await this.request(
|
|
63
|
+
"/v1/mobile/pairings",
|
|
64
|
+
token,
|
|
65
|
+
{
|
|
66
|
+
method: "POST",
|
|
67
|
+
body: JSON.stringify(payload),
|
|
68
|
+
headers: {
|
|
69
|
+
"X-CLI-Version": package_default.version,
|
|
70
|
+
"X-Device-ID": payload.deviceId
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
if (data.success !== true || !data.pairing?.pairingUrl) {
|
|
75
|
+
throw new Error(data.error || "Invalid mobile pairing response");
|
|
76
|
+
}
|
|
77
|
+
return data.pairing;
|
|
78
|
+
}
|
|
79
|
+
async sendRelayHeartbeat(token, payload) {
|
|
80
|
+
await this.request(`/v1/mobile/sessions/${encodeURIComponent(payload.sessionId)}/heartbeat`, token, {
|
|
81
|
+
method: "POST",
|
|
82
|
+
body: JSON.stringify({
|
|
83
|
+
deviceId: payload.deviceId,
|
|
84
|
+
pairingId: payload.pairingId,
|
|
85
|
+
mode: payload.mode
|
|
86
|
+
}),
|
|
87
|
+
headers: {
|
|
88
|
+
"X-Device-ID": payload.deviceId
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
async claimWork(token, deviceId) {
|
|
93
|
+
const data = await this.request(
|
|
94
|
+
"/v1/work/claim",
|
|
95
|
+
token,
|
|
96
|
+
{
|
|
97
|
+
method: "POST",
|
|
98
|
+
body: JSON.stringify({ deviceId }),
|
|
99
|
+
headers: {
|
|
100
|
+
"X-Device-ID": deviceId
|
|
101
|
+
},
|
|
102
|
+
allowNotFound: true
|
|
103
|
+
}
|
|
104
|
+
);
|
|
105
|
+
if (data.success === false && data.error === "No work available") {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
if (!data.success || !data.work) {
|
|
109
|
+
throw new Error(data.error || "Invalid work claim response");
|
|
110
|
+
}
|
|
111
|
+
return data.work;
|
|
112
|
+
}
|
|
113
|
+
async request(path2, token, options) {
|
|
114
|
+
const controller = new AbortController();
|
|
115
|
+
const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
|
|
116
|
+
try {
|
|
117
|
+
const response = await fetch(`${this.baseUrl}${path2}`, {
|
|
118
|
+
method: options.method,
|
|
119
|
+
headers: {
|
|
120
|
+
Authorization: `Bearer ${token}`,
|
|
121
|
+
"Content-Type": "application/json",
|
|
122
|
+
...options.headers
|
|
123
|
+
},
|
|
124
|
+
body: options.body,
|
|
125
|
+
signal: controller.signal
|
|
126
|
+
});
|
|
127
|
+
if (options.allowNotFound && response.status === 404) {
|
|
128
|
+
const data = await response.json().catch(() => ({ success: false, error: "No work available" }));
|
|
129
|
+
return data;
|
|
130
|
+
}
|
|
131
|
+
if (!response.ok) {
|
|
132
|
+
const text = await response.text().catch(() => "Unknown error");
|
|
133
|
+
throw new Error(`API error: ${response.status} ${text}`);
|
|
134
|
+
}
|
|
135
|
+
return await response.json();
|
|
136
|
+
} catch (error) {
|
|
137
|
+
if (error.name === "AbortError") {
|
|
138
|
+
throw new Error("Request timeout");
|
|
139
|
+
}
|
|
140
|
+
throw error;
|
|
141
|
+
} finally {
|
|
142
|
+
clearTimeout(timeout);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
// src/mobile/MobileRelay.ts
|
|
148
|
+
var activeRelay = null;
|
|
149
|
+
function startMobileRelay(options) {
|
|
150
|
+
stopMobileRelay();
|
|
151
|
+
activeRelay = {
|
|
152
|
+
deviceId: options.deviceId,
|
|
153
|
+
timer: setInterval(() => {
|
|
154
|
+
void pollOnce(options);
|
|
155
|
+
}, Math.max(options.pollIntervalMs, 1e3)),
|
|
156
|
+
polling: false
|
|
157
|
+
};
|
|
158
|
+
activeRelay.timer.unref?.();
|
|
159
|
+
void pollOnce(options);
|
|
160
|
+
}
|
|
161
|
+
function stopMobileRelay() {
|
|
162
|
+
if (!activeRelay) return;
|
|
163
|
+
clearInterval(activeRelay.timer);
|
|
164
|
+
activeRelay = null;
|
|
165
|
+
}
|
|
166
|
+
async function pollOnce(options) {
|
|
167
|
+
if (!activeRelay || activeRelay.deviceId !== options.deviceId || activeRelay.polling) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
activeRelay.polling = true;
|
|
171
|
+
try {
|
|
172
|
+
try {
|
|
173
|
+
await options.client.sendRelayHeartbeat(options.token, {
|
|
174
|
+
sessionId: options.sessionId,
|
|
175
|
+
deviceId: options.deviceId,
|
|
176
|
+
pairingId: options.pairingId,
|
|
177
|
+
mode: options.mode
|
|
178
|
+
});
|
|
179
|
+
} catch (error) {
|
|
180
|
+
options.onError?.(error);
|
|
181
|
+
}
|
|
182
|
+
const work = await options.client.claimWork(options.token, options.deviceId);
|
|
183
|
+
if (work?.prompt) {
|
|
184
|
+
options.enqueueInstruction(work.prompt);
|
|
185
|
+
}
|
|
186
|
+
} catch (error) {
|
|
187
|
+
options.onError?.(error);
|
|
188
|
+
} finally {
|
|
189
|
+
if (activeRelay?.deviceId === options.deviceId) {
|
|
190
|
+
activeRelay.polling = false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// src/commands/go.ts
|
|
196
|
+
var metadata = {
|
|
197
|
+
command: "/go",
|
|
198
|
+
description: "pair this session with the Autohand Code iOS app",
|
|
199
|
+
implemented: true
|
|
200
|
+
};
|
|
201
|
+
var MAX_MOBILE_SNAPSHOT_MESSAGES = 24;
|
|
202
|
+
function formatUrl(url) {
|
|
203
|
+
return terminalLink.isSupported ? terminalLink(url, url) : chalk.cyan.underline(url);
|
|
204
|
+
}
|
|
205
|
+
function formatExpiry(value) {
|
|
206
|
+
const date = new Date(value);
|
|
207
|
+
if (Number.isNaN(date.getTime())) return value;
|
|
208
|
+
return date.toLocaleString();
|
|
209
|
+
}
|
|
210
|
+
function nativeAppUrl(pairingUrl) {
|
|
211
|
+
const url = new URL(pairingUrl);
|
|
212
|
+
const nativeUrl = new URL("autohand-code://go");
|
|
213
|
+
const pairingId = url.searchParams.get("pairing");
|
|
214
|
+
const token = url.searchParams.get("token");
|
|
215
|
+
if (pairingId) nativeUrl.searchParams.set("pairing", pairingId);
|
|
216
|
+
if (token) nativeUrl.searchParams.set("token", token);
|
|
217
|
+
return nativeUrl.toString();
|
|
218
|
+
}
|
|
219
|
+
function buildMobileSessionSnapshot(session) {
|
|
220
|
+
const messages = [];
|
|
221
|
+
for (const message of session.getMessages()) {
|
|
222
|
+
if (message.role === "user") {
|
|
223
|
+
const content = message.content.trim();
|
|
224
|
+
if (content) {
|
|
225
|
+
messages.push({ role: "user", content, timestamp: message.timestamp });
|
|
226
|
+
}
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if (message.role === "assistant") {
|
|
230
|
+
const content = getAssistantChatLogContent(message.content);
|
|
231
|
+
if (content) {
|
|
232
|
+
messages.push({ role: "assistant", content, timestamp: message.timestamp });
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
const recentMessages = messages.slice(-MAX_MOBILE_SNAPSHOT_MESSAGES);
|
|
237
|
+
const firstUserMessage = messages.find((message) => message.role === "user");
|
|
238
|
+
const title = firstUserMessage?.content ? firstUserMessage.content.replace(/\s+/g, " ").slice(0, 80) : `Continue ${session.metadata.projectName}`;
|
|
239
|
+
return {
|
|
240
|
+
title,
|
|
241
|
+
summary: session.metadata.summary,
|
|
242
|
+
messageCount: session.metadata.messageCount,
|
|
243
|
+
lastActivity: session.metadata.lastActiveAt,
|
|
244
|
+
messages: recentMessages
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
function parseMode(args, canSteer) {
|
|
248
|
+
if (args.includes("--queue")) return "queue";
|
|
249
|
+
if (args.includes("--steer")) return "steer";
|
|
250
|
+
return canSteer ? "steer" : "queue";
|
|
251
|
+
}
|
|
252
|
+
async function go(ctx, args = []) {
|
|
253
|
+
const mode = parseMode(args, Boolean(ctx.enqueueInstruction));
|
|
254
|
+
if (mode === "steer" && !ctx.enqueueInstruction) {
|
|
255
|
+
return [
|
|
256
|
+
chalk.yellow("Steer mode requires an interactive CLI session."),
|
|
257
|
+
chalk.gray("Run /go --queue to create a durable queue-only handoff from this mode.")
|
|
258
|
+
].join("\n");
|
|
259
|
+
}
|
|
260
|
+
const token = ctx.config?.auth?.token;
|
|
261
|
+
if (!token) {
|
|
262
|
+
return [
|
|
263
|
+
chalk.yellow("Sign in first with /login."),
|
|
264
|
+
chalk.gray("Then run /go again to pair this laptop session with your phone.")
|
|
265
|
+
].join("\n");
|
|
266
|
+
}
|
|
267
|
+
const session = ctx.currentSession ?? ctx.sessionManager.getCurrentSession();
|
|
268
|
+
if (!session) {
|
|
269
|
+
return [
|
|
270
|
+
chalk.yellow("No active session to pair."),
|
|
271
|
+
chalk.gray("Start a conversation, then run /go from the project you want to control remotely.")
|
|
272
|
+
].join("\n");
|
|
273
|
+
}
|
|
274
|
+
const client = ctx.client ?? new MobileHandoffClient({
|
|
275
|
+
baseUrl: getMobileApiBaseUrl(ctx.config)
|
|
276
|
+
});
|
|
277
|
+
try {
|
|
278
|
+
const deviceId = await client.getDeviceId();
|
|
279
|
+
await client.registerDevice(token, {
|
|
280
|
+
deviceId,
|
|
281
|
+
clientType: "cli",
|
|
282
|
+
agentName: `${os.hostname()} Autohand Code`,
|
|
283
|
+
metadata: {
|
|
284
|
+
workspacePath: ctx.workspaceRoot,
|
|
285
|
+
projectName: session.metadata.projectName,
|
|
286
|
+
sessionId: session.metadata.sessionId,
|
|
287
|
+
model: ctx.model,
|
|
288
|
+
provider: ctx.provider,
|
|
289
|
+
platform: process.platform,
|
|
290
|
+
hostname: os.hostname(),
|
|
291
|
+
client: session.metadata.client,
|
|
292
|
+
clientVersion: session.metadata.clientVersion
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
const pairing = await client.createPairing(token, {
|
|
296
|
+
deviceId,
|
|
297
|
+
sessionId: session.metadata.sessionId,
|
|
298
|
+
workspacePath: ctx.workspaceRoot,
|
|
299
|
+
projectName: session.metadata.projectName,
|
|
300
|
+
model: ctx.model,
|
|
301
|
+
provider: ctx.provider,
|
|
302
|
+
capabilities: ["prompt", "approval", "notifications"],
|
|
303
|
+
metadata: {
|
|
304
|
+
platform: process.platform,
|
|
305
|
+
hostname: os.hostname(),
|
|
306
|
+
client: session.metadata.client,
|
|
307
|
+
clientVersion: session.metadata.clientVersion,
|
|
308
|
+
sessionSnapshot: JSON.stringify(buildMobileSessionSnapshot(session))
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
if (mode === "steer" && ctx.enqueueInstruction) {
|
|
312
|
+
startMobileRelay({
|
|
313
|
+
client,
|
|
314
|
+
token,
|
|
315
|
+
deviceId,
|
|
316
|
+
sessionId: session.metadata.sessionId,
|
|
317
|
+
pairingId: pairing.id,
|
|
318
|
+
mode,
|
|
319
|
+
pollIntervalMs: pairing.pollIntervalMs,
|
|
320
|
+
enqueueInstruction: ctx.enqueueInstruction
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
const appUrl = nativeAppUrl(pairing.pairingUrl);
|
|
324
|
+
const qr = await QRCode.toString(pairing.pairingUrl, {
|
|
325
|
+
type: "utf8",
|
|
326
|
+
errorCorrectionLevel: "M"
|
|
327
|
+
});
|
|
328
|
+
return [
|
|
329
|
+
"",
|
|
330
|
+
chalk.bold("Autohand Code mobile handoff"),
|
|
331
|
+
chalk.gray("Scan this with the iOS app to continue this session from your phone."),
|
|
332
|
+
"",
|
|
333
|
+
qr,
|
|
334
|
+
"",
|
|
335
|
+
`${chalk.gray("Scan or open:")} ${formatUrl(pairing.pairingUrl)}`,
|
|
336
|
+
`${chalk.gray("Simulator fallback:")} ${formatUrl(appUrl)}`,
|
|
337
|
+
`${chalk.gray("Project:")} ${chalk.cyan(session.metadata.projectName)}`,
|
|
338
|
+
`${chalk.gray("Session:")} ${chalk.cyan(session.metadata.sessionId)}`,
|
|
339
|
+
`${chalk.gray("Mode:")} ${mode === "steer" ? chalk.green("steer live") : chalk.yellow("queue")}`,
|
|
340
|
+
`${chalk.gray("Relay:")} ${mode === "steer" ? chalk.green("listening for mobile prompts") : chalk.yellow("prompts will wait in the queue")}`,
|
|
341
|
+
`${chalk.gray("Expires:")} ${chalk.cyan(formatExpiry(pairing.expiresAt))}`,
|
|
342
|
+
""
|
|
343
|
+
].join("\n");
|
|
344
|
+
} catch (error) {
|
|
345
|
+
return [
|
|
346
|
+
chalk.red("Could not create mobile handoff."),
|
|
347
|
+
chalk.gray(error.message)
|
|
348
|
+
].join("\n");
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
export {
|
|
353
|
+
metadata,
|
|
354
|
+
go
|
|
355
|
+
};
|
|
356
|
+
/**
|
|
357
|
+
* @license
|
|
358
|
+
* Copyright 2026 Autohand AI LLC
|
|
359
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
360
|
+
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AUTOHAND_PATHS
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-SHRLFX6F.js";
|
|
4
4
|
|
|
5
5
|
// src/core/agents/AgentRegistry.ts
|
|
6
6
|
import fs from "fs/promises";
|
|
@@ -50,9 +50,11 @@ function parseMarkdownAgent(content) {
|
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
52
|
var AgentRegistry = class _AgentRegistry {
|
|
53
|
+
static instance;
|
|
54
|
+
agents = /* @__PURE__ */ new Map();
|
|
55
|
+
agentsDir;
|
|
56
|
+
externalPaths = [];
|
|
53
57
|
constructor() {
|
|
54
|
-
this.agents = /* @__PURE__ */ new Map();
|
|
55
|
-
this.externalPaths = [];
|
|
56
58
|
this.agentsDir = AUTOHAND_PATHS.agents;
|
|
57
59
|
}
|
|
58
60
|
static getInstance() {
|
|
@@ -70,6 +72,16 @@ var AgentRegistry = class _AgentRegistry {
|
|
|
70
72
|
(p) => p.startsWith("~") ? path.join(os.homedir(), p.slice(1)) : p
|
|
71
73
|
);
|
|
72
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* Apply external agent settings from the loaded Autohand config.
|
|
77
|
+
*/
|
|
78
|
+
configureExternalAgents(config) {
|
|
79
|
+
if (config?.enabled !== true) {
|
|
80
|
+
this.setExternalPaths([]);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
this.setExternalPaths(config.paths ?? []);
|
|
84
|
+
}
|
|
73
85
|
/**
|
|
74
86
|
* Get configured external paths
|
|
75
87
|
*/
|
|
@@ -159,7 +171,7 @@ var AgentRegistry = class _AgentRegistry {
|
|
|
159
171
|
source,
|
|
160
172
|
description: parsed.description || `Agent ${name}`,
|
|
161
173
|
systemPrompt: parsed.systemPrompt,
|
|
162
|
-
tools: parsed.tools,
|
|
174
|
+
tools: parsed.tools.length > 0 ? parsed.tools : ["*"],
|
|
163
175
|
model: parsed.model
|
|
164
176
|
};
|
|
165
177
|
if (!this.agents.has(name)) {
|