autohand-cli 0.8.0 → 0.8.2
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 +97 -2
- package/dist/{ImportWizard-IWVPRKFF.cjs → ImportWizard-35YBJ4AM.cjs} +8 -8
- package/dist/{ImportWizard-KASGQPUY.js → ImportWizard-XH7CINCH.js} +3 -3
- package/dist/LearnAdvisor-A4Q5PPBI.js +9 -0
- package/dist/LearnAdvisor-GASQD7HT.cjs +9 -0
- package/dist/{PermissionManager-K7UWSNB6.js → PermissionManager-ATUV34LQ.js} +1 -1
- package/dist/{PermissionManager-2GO5PQ6M.cjs → PermissionManager-KMN53FJP.cjs} +2 -2
- package/dist/{ProviderFactory-S3LWTQQC.js → ProviderFactory-MR5B23QJ.js} +1 -1
- package/dist/ProviderFactory-VFGCJJX6.cjs +9 -0
- package/dist/{SkillsRegistry-GDEGFP6O.cjs → SkillsRegistry-KPQFTRIT.cjs} +2 -2
- package/dist/{SkillsRegistry-SI5RUHQ4.js → SkillsRegistry-XJSKPDF2.js} +1 -1
- package/dist/{SubAgent-I75HELJG.js → SubAgent-NYH6GWQ3.js} +1 -1
- package/dist/{SubAgent-K3QP6WHC.cjs → SubAgent-PZKBDUBA.cjs} +2 -2
- package/dist/{about-B2AGTV6N.js → about-HHTF2YFL.js} +3 -3
- package/dist/about-JGRVNNQC.cjs +12 -0
- package/dist/{actionExecutor-YRUJNB5G.cjs → actionExecutor-U6IBN2TU.cjs} +7 -7
- package/dist/{actionExecutor-6XCVL2SJ.js → actionExecutor-XT5FW3W6.js} +6 -6
- package/dist/{add-dir-7FBQ5IFV.js → add-dir-247K3XRY.js} +2 -2
- package/dist/add-dir-GS4DXKKH.cjs +10 -0
- package/dist/agents-R6ZEFTVR.cjs +12 -0
- package/dist/{agents-FENGUSJD.js → agents-WJPQWQF2.js} +2 -2
- package/dist/agents-new-HKVEIBDJ.js +14 -0
- package/dist/agents-new-X6GTHIO6.cjs +14 -0
- package/dist/autoSkill-6TGBTEQD.js +20 -0
- package/dist/autoSkill-H4T6VVDA.cjs +20 -0
- package/dist/{automode-O7G3DUYN.js → automode-BC6NVECO.js} +2 -2
- package/dist/automode-WN2RSOGW.cjs +10 -0
- package/dist/{chunk-MUBW5UDH.cjs → chunk-245KJE5Y.cjs} +4 -4
- package/dist/{chunk-GCHELXLO.js → chunk-33RSHBDH.js} +2 -2
- package/dist/{chunk-Q5RN7RXC.js → chunk-34M3HWLR.js} +2 -2
- package/dist/{chunk-XMNHZRUB.cjs → chunk-3K2ESU53.cjs} +2 -2
- package/dist/{chunk-OI7OIGNB.cjs → chunk-3L53OA4E.cjs} +10 -10
- package/dist/{chunk-2JYIR3EC.cjs → chunk-3OTU3RS3.cjs} +435 -4
- package/dist/{chunk-MVWOQBCC.cjs → chunk-3PCTTUNW.cjs} +11 -11
- package/dist/{chunk-JJWCQLOU.cjs → chunk-47CKWKEX.cjs} +2 -2
- package/dist/{chunk-ITB3FS72.js → chunk-4PKF7WPD.js} +3 -3
- package/dist/{chunk-2RIAPTET.js → chunk-5P2NXKP3.js} +64 -54
- package/dist/{chunk-5YJG6H6P.cjs → chunk-6HYLHBQG.cjs} +8 -8
- package/dist/{chunk-SO3QQJAZ.js → chunk-6RF7UKUS.js} +11 -4
- package/dist/{chunk-VNQ5GL34.js → chunk-6ZCULLCA.js} +1 -1
- package/dist/{chunk-WJDPVW7T.js → chunk-72FKPBT5.js} +3 -3
- package/dist/{chunk-RVUQKMXX.cjs → chunk-7BTSG4ME.cjs} +5067 -2204
- package/dist/{chunk-YYB42DCU.cjs → chunk-A4IJHHV7.cjs} +10 -4
- package/dist/{chunk-IUMJYXBX.cjs → chunk-AEJH23FO.cjs} +6 -6
- package/dist/{chunk-HFMLWH7B.js → chunk-APIXPPMT.js} +5067 -2204
- package/dist/chunk-AS6RTLN7.cjs +203 -0
- package/dist/{chunk-ZSE42BRE.js → chunk-AYS2ASM7.js} +1 -1
- package/dist/{chunk-IWVQ2EW3.js → chunk-AYSFIUFW.js} +3 -3
- package/dist/{chunk-UJTCTTUF.cjs → chunk-BWN2CLLM.cjs} +30 -3
- package/dist/{chunk-EEGK5DYE.cjs → chunk-C5IJIM2V.cjs} +20 -14
- package/dist/{chunk-OBLIITWJ.js → chunk-CAMZTXV6.js} +2 -2
- package/dist/{chunk-5DDDUUBM.cjs → chunk-CDBPBM2K.cjs} +3 -3
- package/dist/{chunk-XWASJ2QL.js → chunk-CWMZKFTT.js} +3 -3
- package/dist/{chunk-UBS46QL3.cjs → chunk-CZXGCVTR.cjs} +2 -2
- package/dist/{chunk-AFN7LH5N.cjs → chunk-DJDE4DTT.cjs} +17 -17
- package/dist/{chunk-LL3PQ2U6.js → chunk-DRE2RXBZ.js} +33 -5
- package/dist/{chunk-QT2VZNFA.js → chunk-DSPQEHDT.js} +2 -2
- package/dist/{chunk-BT35E7NE.cjs → chunk-DVUHHH3B.cjs} +4 -4
- package/dist/{chunk-MHSDHPC4.cjs → chunk-DVZOENQ7.cjs} +2 -2
- package/dist/{chunk-Y2SXUCNJ.js → chunk-EGMZDTSL.js} +1 -1
- package/dist/{chunk-2ELK5DMH.js → chunk-FKSDEWDH.js} +3 -3
- package/dist/{chunk-YKS55CMT.js → chunk-FW774QXH.js} +19 -3
- package/dist/{chunk-T63AMO6H.js → chunk-G27PQQFD.js} +1 -1
- package/dist/{chunk-H6ZGZEBG.cjs → chunk-G3V4SFET.cjs} +9 -9
- package/dist/{chunk-CWALFEGU.js → chunk-G4CAKI3V.js} +1 -1
- package/dist/{chunk-FYZ67R4R.js → chunk-GJH7XMSK.js} +14 -0
- package/dist/{chunk-EIU7K7CM.js → chunk-H5SWOLG6.js} +3 -3
- package/dist/{chunk-OUHQZFN4.js → chunk-HBXAA3XB.js} +6 -1
- package/dist/{chunk-E23CMMNJ.js → chunk-HIVRCQS2.js} +8 -2
- package/dist/{chunk-TFSRRZWP.cjs → chunk-HLHTG5ZU.cjs} +15 -1
- package/dist/{chunk-WFUUXADU.js → chunk-HLQV64Y5.js} +170 -4
- package/dist/{chunk-7QEE6SW6.cjs → chunk-HOAHWIQ5.cjs} +26 -26
- package/dist/{chunk-63WXWFDI.cjs → chunk-HVKOZ2VP.cjs} +11 -11
- package/dist/{chunk-LQ4LQQG6.cjs → chunk-HXGBSJL5.cjs} +2 -2
- package/dist/chunk-I5IW3T2Y.js +310 -0
- package/dist/{chunk-D3YCFT5O.cjs → chunk-IFFXSTOM.cjs} +3 -3
- package/dist/{chunk-OPR34VHL.cjs → chunk-IKGWDOGU.cjs} +174 -8
- package/dist/{chunk-55B6SBHK.js → chunk-J4Q7XR3G.js} +3 -3
- package/dist/{chunk-LXDOQTXQ.cjs → chunk-J6QET7EF.cjs} +24 -4
- package/dist/{chunk-5EIEWVYX.js → chunk-JCLYQ2JC.js} +2 -2
- package/dist/{chunk-GHSBZ3YB.js → chunk-JX3DFKBI.js} +2 -2
- package/dist/{chunk-SALLHB2I.js → chunk-JYTDYJVW.js} +1 -1
- package/dist/{chunk-G7SZIOHF.js → chunk-KPELYZ6L.js} +2 -2
- package/dist/{chunk-S6BDWWUG.cjs → chunk-KWXVKLQ5.cjs} +5 -5
- package/dist/{chunk-GO3N7LRW.cjs → chunk-L3WAH3EM.cjs} +6 -6
- package/dist/{chunk-MGMXR67S.cjs → chunk-LA7H35XM.cjs} +9 -9
- package/dist/{chunk-XUDSXGGV.cjs → chunk-LENHP55G.cjs} +19 -3
- package/dist/{chunk-WGTJOIB7.cjs → chunk-LNMYK2F5.cjs} +10 -10
- package/dist/{chunk-JMFDD7IZ.js → chunk-LWUJFGOZ.js} +2 -2
- package/dist/chunk-MAKMSQMQ.cjs +504 -0
- package/dist/chunk-MSED7RH2.cjs +267 -0
- package/dist/{chunk-RO46YAPI.js → chunk-MYISNQH4.js} +1 -1
- package/dist/{chunk-Q2VYSHWU.js → chunk-N23UAW4I.js} +1 -1
- package/dist/{chunk-DH7DKCUL.js → chunk-NDMIPTV4.js} +1 -1
- package/dist/{chunk-YDCDGTK6.cjs → chunk-NNPAM4HC.cjs} +5 -5
- package/dist/{chunk-SRQW3B6J.cjs → chunk-O4IF4NJT.cjs} +24 -17
- package/dist/{chunk-SHFA46CS.cjs → chunk-OGV4WJ5L.cjs} +8 -8
- package/dist/chunk-OHUZKDGX.js +348 -0
- package/dist/{chunk-AMT2UZBI.cjs → chunk-OLSBBZW6.cjs} +5 -5
- package/dist/{chunk-SIHRD34Z.js → chunk-OOKY3HPZ.js} +8 -2
- package/dist/{chunk-WTNBX2JO.js → chunk-P47WPOXN.js} +30 -3
- package/dist/{chunk-3WCOFXQS.cjs → chunk-PRRCJFU3.cjs} +23 -23
- package/dist/{chunk-5GGX6WNY.cjs → chunk-Q7XSCYND.cjs} +11 -11
- package/dist/{chunk-EF4LKUQY.js → chunk-QNGEW5TC.js} +1 -1
- package/dist/chunk-QOXPOR5D.js +267 -0
- package/dist/chunk-R33VKSH5.cjs +348 -0
- package/dist/{chunk-CVVEYUFR.js → chunk-RO6WYEWH.js} +23 -3
- package/dist/{chunk-TWEKBHUO.js → chunk-SCXX4LW5.js} +3 -3
- package/dist/{chunk-YS34SVY5.js → chunk-SKV2F3NM.js} +1 -1
- package/dist/{chunk-MHLE6AVN.cjs → chunk-SKYG33B2.cjs} +3 -3
- package/dist/{chunk-EPNYD4NV.js → chunk-SLQAYV3W.js} +1 -1
- package/dist/{chunk-DLG43ZJ7.cjs → chunk-SYVYLZZF.cjs} +2 -2
- package/dist/{chunk-QUFAULH7.js → chunk-T73IDKDF.js} +2 -1
- package/dist/chunk-TBEGGJNC.cjs +310 -0
- package/dist/{chunk-TQHOVHRS.js → chunk-TNZRZQ7Q.js} +1 -1
- package/dist/{chunk-D6VG7B5X.cjs → chunk-TXSDBGKX.cjs} +2 -1
- package/dist/{chunk-LVE6Z5SL.cjs → chunk-U46VYPLR.cjs} +7 -7
- package/dist/{chunk-F23EVNJU.js → chunk-WHE2SWHU.js} +1 -1
- package/dist/{chunk-CDMGQR4L.cjs → chunk-WM5PAOTQ.cjs} +38 -10
- package/dist/{chunk-PEC45WYS.js → chunk-X2MSVKDV.js} +1 -1
- package/dist/chunk-X3WS5LDG.js +504 -0
- package/dist/{chunk-Q5RX3XGB.cjs → chunk-X5VSP65C.cjs} +2 -2
- package/dist/{chunk-HA7OAVOB.cjs → chunk-X5YJ34FZ.cjs} +12 -12
- package/dist/{chunk-TERCG25S.js → chunk-XRZEUWKF.js} +1 -1
- package/dist/{chunk-VJYPP6PP.cjs → chunk-XTB6VJVQ.cjs} +6 -6
- package/dist/{chunk-UGTFKUW4.js → chunk-XX2ZO7DS.js} +2 -2
- package/dist/{chunk-UTI6ZQEY.cjs → chunk-Y72HH2TF.cjs} +9 -9
- package/dist/{chunk-PUOE5BCN.js → chunk-YGN4CQIP.js} +1 -1
- package/dist/{chunk-5OBNULPU.js → chunk-YZXUDM5X.js} +1 -1
- package/dist/{chunk-AHD5JJ6F.cjs → chunk-Z36XBUMX.cjs} +6 -1
- package/dist/{chunk-4HKTYHNL.cjs → chunk-ZQE72E6W.cjs} +14 -14
- package/dist/{chunk-7GDVDSNI.js → chunk-ZVY2XD6T.js} +435 -4
- package/dist/{chunk-FPAE6ORV.cjs → chunk-ZYQMLKOK.cjs} +6 -6
- package/dist/clear-UO4MNWZW.cjs +12 -0
- package/dist/{clear-J7XS6T5W.js → clear-ZJ5NYP6E.js} +2 -2
- package/dist/communityInstaller-6KCFN7YZ.js +19 -0
- package/dist/communityInstaller-PVSOFDZD.cjs +19 -0
- package/dist/{completion-XR6ZONJQ.js → completion-MMF2PN2H.js} +4 -4
- package/dist/completion-UI5WKHXI.cjs +14 -0
- package/dist/config-E7RINK4R.cjs +18 -0
- package/dist/{config-2TB3A55J.js → config-ZN66VXPS.js} +1 -1
- package/dist/export-N4XIVDSL.cjs +12 -0
- package/dist/export-W22L4D5C.js +12 -0
- package/dist/feedback-DR6ADSNE.cjs +15 -0
- package/dist/feedback-FEEAP4QW.js +15 -0
- package/dist/{help-I5GRCA3S.js → help-2BLR7L43.js} +2 -2
- package/dist/help-AQHGTS7P.cjs +12 -0
- package/dist/{history-OCHJBJW7.js → history-5FZ3M2AK.js} +2 -2
- package/dist/history-NIUDRMKA.cjs +14 -0
- package/dist/hooks-2EY4IPKV.js +13 -0
- package/dist/hooks-LJVORRIG.cjs +13 -0
- package/dist/i18n-ARDG2SMC.cjs +33 -0
- package/dist/{i18n-KHBXUALK.js → i18n-K7QOWIBH.js} +1 -1
- package/dist/ide-GFW6IJHD.js +12 -0
- package/dist/ide-N2ZNSSB3.cjs +12 -0
- package/dist/{import-KRVVYJCZ.js → import-DFVN3KNZ.js} +2 -2
- package/dist/{import-PQJPNXA4.cjs → import-QEME3E4T.cjs} +3 -3
- package/dist/{import-EAAX5HJR.js → import-UXM3VK7B.js} +3 -3
- package/dist/import-ZS6DPGU5.cjs +10 -0
- package/dist/index.cjs +5451 -2274
- package/dist/index.js +5345 -2168
- package/dist/init-PY75HA3S.cjs +10 -0
- package/dist/{init-6K3NRDOM.js → init-QNMWLAVY.js} +2 -2
- package/dist/language-5UE4G2BT.cjs +18 -0
- package/dist/{language-Y6ZC7LET.js → language-UXMHEZUJ.js} +5 -5
- package/dist/learn-HJ3FLNZC.cjs +20 -0
- package/dist/learn-MVYS3RU5.js +20 -0
- package/dist/{login-DL3377MD.js → login-DSE7H63A.js} +6 -6
- package/dist/{login-6OAH2NEH.cjs → login-V3MEWPKN.cjs} +7 -7
- package/dist/{logout-TLYA5W45.js → logout-BMVCLKKW.js} +6 -6
- package/dist/logout-XEG7FHOZ.cjs +18 -0
- package/dist/{mcp-BHOIBYUB.js → mcp-PYUR4PHO.js} +4 -4
- package/dist/mcp-SG6JFLGC.cjs +18 -0
- package/dist/{mcp-install-GROTZHAW.cjs → mcp-install-G27HSS3Z.cjs} +9 -9
- package/dist/{mcp-install-KSADVDBE.js → mcp-install-VESN42PI.js} +5 -5
- package/dist/{memory-6DRFA43C.js → memory-4ZMMEZ2Z.js} +2 -2
- package/dist/memory-QSGMVVGH.cjs +10 -0
- package/dist/model-NANLBZ4Z.cjs +10 -0
- package/dist/{model-MQXC56ES.js → model-ZXNV4AF7.js} +2 -2
- package/dist/{new-7VYM36RC.js → new-5QJY5JP2.js} +2 -2
- package/dist/new-PMMG55UX.cjs +12 -0
- package/dist/permissions-LECTCJ4H.cjs +13 -0
- package/dist/permissions-VP5VGIBL.js +13 -0
- package/dist/quit-BKOOPHU5.cjs +10 -0
- package/dist/{quit-PKBSEJOL.js → quit-FVFNYACP.js} +2 -2
- package/dist/{registry-WQLWHOLY.js → registry-KWZGYJC2.js} +289 -9
- package/dist/{registry-A5XLMQVC.cjs → registry-YN4FQPOO.cjs} +298 -18
- package/dist/{resume-FBKXSDOA.js → resume-EXFQSQPH.js} +4 -4
- package/dist/resume-PP2IQM5S.cjs +13 -0
- package/dist/search-C56FBN67.cjs +17 -0
- package/dist/{search-7RNYTCNO.js → search-XGZDYBF4.js} +5 -5
- package/dist/{sessions-WAXBUQTU.js → sessions-54KI3F2Q.js} +2 -2
- package/dist/sessions-DDTSPNVW.cjs +10 -0
- package/dist/settings-BDO37TTO.cjs +30 -0
- package/dist/{settings-D6JXX5RG.js → settings-FHRDFPLK.js} +5 -5
- package/dist/share-IERCTBGN.cjs +14 -0
- package/dist/share-TGROUE6R.js +14 -0
- package/dist/skills-6OL4OSGA.js +76 -0
- package/dist/skills-FYY6F2WV.cjs +76 -0
- package/dist/skills-OM4IGBAA.cjs +26 -0
- package/dist/skills-S3GRN323.js +26 -0
- package/dist/{skills-install-QNQWC2MV.js → skills-install-6CSWC24P.js} +7 -7
- package/dist/{skills-install-UMK5H3SO.cjs → skills-install-O3LZ2ETC.cjs} +11 -11
- package/dist/{skills-new-NZFGFKML.js → skills-new-ALD2PTHN.js} +5 -5
- package/dist/skills-new-PWLKK7GW.cjs +15 -0
- package/dist/slashCommands-L4ZD33LJ.js +75 -0
- package/dist/slashCommands-YY2VUUDF.cjs +75 -0
- package/dist/status-3PC5XWSS.cjs +11 -0
- package/dist/{status-BKC7GBNQ.js → status-KCLVOYPD.js} +3 -3
- package/dist/{sync-YVPFT7SL.js → sync-6SDWG5RK.js} +3 -3
- package/dist/sync-WHURZL3U.cjs +18 -0
- package/dist/{team-RWIKCLTG.js → team-5YXP3JGR.js} +1 -1
- package/dist/team-IIWEZKNR.cjs +9 -0
- package/dist/{teammate-7C3UDQSH.cjs → teammate-2KMKJXAM.cjs} +4 -4
- package/dist/{teammate-3C4MLRGH.js → teammate-L6EZQ3I2.js} +4 -4
- package/dist/theme-BE5A4FPN.cjs +18 -0
- package/dist/{theme-A2CEHI7W.js → theme-YMFCQP7J.js} +5 -5
- package/dist/ui/questionModal.cjs +5 -5
- package/dist/ui/questionModal.js +4 -4
- package/dist/undo-KZHUUZTD.cjs +10 -0
- package/dist/{undo-F2IZJQUV.js → undo-NEIEHQVX.js} +2 -2
- package/package.json +2 -1
- package/dist/ProviderFactory-EFFQBRQ6.cjs +0 -9
- package/dist/about-V2HWEZZO.cjs +0 -12
- package/dist/add-dir-ALBSYRV3.cjs +0 -10
- package/dist/agents-FCGEWTA3.cjs +0 -12
- package/dist/agents-new-FU3O55CO.js +0 -14
- package/dist/agents-new-SAFTJ7TK.cjs +0 -14
- package/dist/automode-CYLGXQ4A.cjs +0 -10
- package/dist/chunk-Q3MJ6CYS.cjs +0 -193
- package/dist/clear-ES5WCZRF.cjs +0 -12
- package/dist/completion-XQTDTJLK.cjs +0 -14
- package/dist/config-RDMVIV26.cjs +0 -18
- package/dist/export-EWAYH353.cjs +0 -12
- package/dist/export-ZWA6XGVS.js +0 -12
- package/dist/feedback-5RV6ODW4.js +0 -15
- package/dist/feedback-ZPITHFJR.cjs +0 -15
- package/dist/help-X52PZM24.cjs +0 -12
- package/dist/history-4WIOZ4TW.cjs +0 -14
- package/dist/hooks-IAVTXUAI.cjs +0 -13
- package/dist/hooks-YF6HL23E.js +0 -13
- package/dist/i18n-MVQIAZWS.cjs +0 -33
- package/dist/ide-4R3BEBIS.js +0 -12
- package/dist/ide-C7WSPQTR.cjs +0 -12
- package/dist/import-2ICSKDL7.cjs +0 -10
- package/dist/init-AOUGGITS.cjs +0 -10
- package/dist/language-Q7YFDVSR.cjs +0 -18
- package/dist/logout-ELQBUMTU.cjs +0 -18
- package/dist/mcp-TNUEXR5T.cjs +0 -18
- package/dist/memory-IORZE6WF.cjs +0 -10
- package/dist/model-CJPSPGIC.cjs +0 -10
- package/dist/new-7D2B7IWM.cjs +0 -12
- package/dist/permissions-MM77OSFO.js +0 -13
- package/dist/permissions-W2F62DJ6.cjs +0 -13
- package/dist/quit-7D2RDGTD.cjs +0 -10
- package/dist/resume-KLPDYPWQ.cjs +0 -13
- package/dist/search-UESMQZC3.cjs +0 -17
- package/dist/sessions-TSSUFWIJ.cjs +0 -10
- package/dist/settings-RKYGXKDG.cjs +0 -30
- package/dist/share-GLX4YHS4.cjs +0 -14
- package/dist/share-U2M2KBFJ.js +0 -14
- package/dist/skills-63QLZMUO.cjs +0 -14
- package/dist/skills-BAMMXP3Q.js +0 -14
- package/dist/skills-new-NYKNHJHV.cjs +0 -15
- package/dist/slashCommands-EJ23C3Z4.cjs +0 -69
- package/dist/slashCommands-JQIL4EWX.js +0 -69
- package/dist/status-FU3CPJWQ.cjs +0 -11
- package/dist/sync-3IEIHXIP.cjs +0 -18
- package/dist/team-GVK5L73L.cjs +0 -9
- package/dist/theme-LNOQOVR4.cjs +0 -18
- package/dist/undo-QEV42XLU.cjs +0 -10
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunkZYQMLKOKcjs = require('./chunk-ZYQMLKOK.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _chunk7BTSG4MEcjs = require('./chunk-7BTSG4ME.cjs');
|
|
9
9
|
|
|
10
10
|
// src/commands/export.ts
|
|
11
11
|
var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
|
|
@@ -245,7 +245,7 @@ function getSuggestedFilename(metadata2, format) {
|
|
|
245
245
|
// src/commands/export.ts
|
|
246
246
|
var metadata = {
|
|
247
247
|
command: "/export",
|
|
248
|
-
description:
|
|
248
|
+
description: _chunk7BTSG4MEcjs.t.call(void 0, "commands.export.description"),
|
|
249
249
|
implemented: true
|
|
250
250
|
};
|
|
251
251
|
async function execute(args, context) {
|
|
@@ -265,7 +265,7 @@ async function execute(args, context) {
|
|
|
265
265
|
label: `${s.projectName} - ${new Date(s.createdAt).toLocaleString()} (${s.messageCount} messages)`,
|
|
266
266
|
value: s.sessionId
|
|
267
267
|
}));
|
|
268
|
-
const sessionResult = await
|
|
268
|
+
const sessionResult = await _chunkZYQMLKOKcjs.showModal.call(void 0, {
|
|
269
269
|
title: "Select a session to export:",
|
|
270
270
|
options: sessionOptions
|
|
271
271
|
});
|
|
@@ -286,7 +286,7 @@ async function execute(args, context) {
|
|
|
286
286
|
{ label: "JSON (.json)", value: "json" },
|
|
287
287
|
{ label: "HTML (.html)", value: "html" }
|
|
288
288
|
];
|
|
289
|
-
const formatResult = await
|
|
289
|
+
const formatResult = await _chunkZYQMLKOKcjs.showModal.call(void 0, {
|
|
290
290
|
title: "Export format:",
|
|
291
291
|
options: formatOptions
|
|
292
292
|
});
|
|
@@ -297,17 +297,17 @@ async function execute(args, context) {
|
|
|
297
297
|
const format = formatResult.value;
|
|
298
298
|
const options = {};
|
|
299
299
|
if (format === "md" || format === "html") {
|
|
300
|
-
options.includeToolOutputs = await
|
|
300
|
+
options.includeToolOutputs = await _chunkZYQMLKOKcjs.showConfirm.call(void 0, {
|
|
301
301
|
title: "Include tool outputs?",
|
|
302
302
|
defaultValue: true
|
|
303
303
|
});
|
|
304
|
-
options.includeToc = await
|
|
304
|
+
options.includeToc = await _chunkZYQMLKOKcjs.showConfirm.call(void 0, {
|
|
305
305
|
title: "Include table of contents?",
|
|
306
306
|
defaultValue: false
|
|
307
307
|
});
|
|
308
308
|
}
|
|
309
309
|
const suggestedFilename = getSuggestedFilename(metadata2, format);
|
|
310
|
-
const filename = await
|
|
310
|
+
const filename = await _chunkZYQMLKOKcjs.showInput.call(void 0, {
|
|
311
311
|
title: "Save as:",
|
|
312
312
|
defaultValue: suggestedFilename
|
|
313
313
|
});
|
|
@@ -331,11 +331,11 @@ async function execute(args, context) {
|
|
|
331
331
|
try {
|
|
332
332
|
await saveExport(content, filePath);
|
|
333
333
|
console.log();
|
|
334
|
-
console.log(_chalk2.default.green(
|
|
334
|
+
console.log(_chalk2.default.green(_chunk7BTSG4MEcjs.t.call(void 0, "commands.export.success", { path: filePath })));
|
|
335
335
|
console.log(_chalk2.default.gray(` ${messages.length} messages, ${(Buffer.byteLength(content, "utf8") / 1024).toFixed(1)} KB`));
|
|
336
336
|
console.log();
|
|
337
337
|
} catch (error) {
|
|
338
|
-
console.log(_chalk2.default.red(
|
|
338
|
+
console.log(_chalk2.default.red(_chunk7BTSG4MEcjs.t.call(void 0, "commands.export.failed", { error: error.message })));
|
|
339
339
|
}
|
|
340
340
|
}
|
|
341
341
|
|
|
@@ -472,8 +472,9 @@ var OpenRouterClient = class {
|
|
|
472
472
|
}
|
|
473
473
|
const headers = {
|
|
474
474
|
"Content-Type": "application/json",
|
|
475
|
-
"HTTP-Referer": "https://
|
|
476
|
-
"X-Title": "
|
|
475
|
+
"HTTP-Referer": "https://autohand.dev",
|
|
476
|
+
"X-OpenRouter-Title": "Autohand Code CLI",
|
|
477
|
+
"X-OpenRouter-Categories": "cli-agent"
|
|
477
478
|
};
|
|
478
479
|
if (this.apiKey) {
|
|
479
480
|
headers.Authorization = `Bearer ${this.apiKey}`;
|
|
@@ -1074,6 +1075,431 @@ var LLMGatewayProvider = class {
|
|
|
1074
1075
|
}
|
|
1075
1076
|
};
|
|
1076
1077
|
|
|
1078
|
+
// src/providers/azure/tokenManager.ts
|
|
1079
|
+
var EXPIRY_BUFFER_MS = 5 * 60 * 1e3;
|
|
1080
|
+
var IMDS_ENDPOINT = "http://169.254.169.254/metadata/identity/oauth2/token";
|
|
1081
|
+
var COGNITIVE_SCOPE = "https://cognitiveservices.azure.com/.default";
|
|
1082
|
+
var AzureTokenManager = class {
|
|
1083
|
+
constructor() {
|
|
1084
|
+
this.cache = null;
|
|
1085
|
+
}
|
|
1086
|
+
async getToken(request) {
|
|
1087
|
+
if (request.authMethod === "api-key") {
|
|
1088
|
+
if (!request.apiKey) {
|
|
1089
|
+
throw new Error("API key is required for api-key authentication.");
|
|
1090
|
+
}
|
|
1091
|
+
return request.apiKey;
|
|
1092
|
+
}
|
|
1093
|
+
if (this.cache && !this.isTokenExpired()) {
|
|
1094
|
+
return this.cache.token;
|
|
1095
|
+
}
|
|
1096
|
+
if (request.authMethod === "entra-id") {
|
|
1097
|
+
return this.acquireEntraIdToken(request);
|
|
1098
|
+
}
|
|
1099
|
+
if (request.authMethod === "managed-identity") {
|
|
1100
|
+
return this.acquireManagedIdentityToken();
|
|
1101
|
+
}
|
|
1102
|
+
throw new Error(`Unsupported auth method: ${request.authMethod}`);
|
|
1103
|
+
}
|
|
1104
|
+
async getAuthHeaders(request) {
|
|
1105
|
+
if (request.authMethod === "api-key") {
|
|
1106
|
+
const key = await this.getToken(request);
|
|
1107
|
+
return { "api-key": key };
|
|
1108
|
+
}
|
|
1109
|
+
const token = await this.getToken(request);
|
|
1110
|
+
return { Authorization: `Bearer ${token}` };
|
|
1111
|
+
}
|
|
1112
|
+
async acquireEntraIdToken(request) {
|
|
1113
|
+
if (!request.tenantId) {
|
|
1114
|
+
throw new Error("tenantId is required for Entra ID authentication.");
|
|
1115
|
+
}
|
|
1116
|
+
if (!request.clientId) {
|
|
1117
|
+
throw new Error("clientId is required for Entra ID authentication.");
|
|
1118
|
+
}
|
|
1119
|
+
if (!request.clientSecret) {
|
|
1120
|
+
throw new Error("clientSecret is required for Entra ID authentication.");
|
|
1121
|
+
}
|
|
1122
|
+
const url = `https://login.microsoftonline.com/${request.tenantId}/oauth2/v2.0/token`;
|
|
1123
|
+
const body = new URLSearchParams({
|
|
1124
|
+
grant_type: "client_credentials",
|
|
1125
|
+
client_id: request.clientId,
|
|
1126
|
+
client_secret: request.clientSecret,
|
|
1127
|
+
scope: COGNITIVE_SCOPE
|
|
1128
|
+
});
|
|
1129
|
+
const response = await fetch(url, {
|
|
1130
|
+
method: "POST",
|
|
1131
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
1132
|
+
body: body.toString()
|
|
1133
|
+
});
|
|
1134
|
+
if (!response.ok) {
|
|
1135
|
+
const error = await response.json().catch(() => ({}));
|
|
1136
|
+
const description = error.error_description || error.error || `HTTP ${response.status}`;
|
|
1137
|
+
throw new Error(`Entra ID authentication failed: ${description}`);
|
|
1138
|
+
}
|
|
1139
|
+
const data = await response.json();
|
|
1140
|
+
this.cacheToken(data.access_token, data.expires_in);
|
|
1141
|
+
return data.access_token;
|
|
1142
|
+
}
|
|
1143
|
+
async acquireManagedIdentityToken() {
|
|
1144
|
+
const url = `${IMDS_ENDPOINT}?api-version=2018-02-01&resource=https://cognitiveservices.azure.com`;
|
|
1145
|
+
let response;
|
|
1146
|
+
try {
|
|
1147
|
+
response = await fetch(url, {
|
|
1148
|
+
headers: { Metadata: "true" }
|
|
1149
|
+
});
|
|
1150
|
+
} catch (e14) {
|
|
1151
|
+
throw new Error(
|
|
1152
|
+
"Managed Identity token acquisition failed. This auth method only works inside Azure VMs, App Service, or containers with managed identity enabled."
|
|
1153
|
+
);
|
|
1154
|
+
}
|
|
1155
|
+
if (!response.ok) {
|
|
1156
|
+
const error = await response.json().catch(() => ({}));
|
|
1157
|
+
throw new Error(
|
|
1158
|
+
`Managed Identity token error (${response.status}): ${error.error_description || error.error || "Unknown"}`
|
|
1159
|
+
);
|
|
1160
|
+
}
|
|
1161
|
+
const data = await response.json();
|
|
1162
|
+
this.cacheToken(data.access_token, data.expires_in);
|
|
1163
|
+
return data.access_token;
|
|
1164
|
+
}
|
|
1165
|
+
cacheToken(token, expiresInSeconds) {
|
|
1166
|
+
this.cache = {
|
|
1167
|
+
token,
|
|
1168
|
+
expiresAt: Date.now() + expiresInSeconds * 1e3
|
|
1169
|
+
};
|
|
1170
|
+
}
|
|
1171
|
+
isTokenExpired() {
|
|
1172
|
+
if (!this.cache) return true;
|
|
1173
|
+
return Date.now() >= this.cache.expiresAt - EXPIRY_BUFFER_MS;
|
|
1174
|
+
}
|
|
1175
|
+
};
|
|
1176
|
+
|
|
1177
|
+
// src/providers/AzureClient.ts
|
|
1178
|
+
function sanitizeMessages3(messages) {
|
|
1179
|
+
return messages.map((msg) => {
|
|
1180
|
+
const sanitized = {
|
|
1181
|
+
role: msg.role,
|
|
1182
|
+
content: msg.content
|
|
1183
|
+
};
|
|
1184
|
+
if (msg.role === "tool" && msg.tool_call_id) {
|
|
1185
|
+
sanitized.tool_call_id = msg.tool_call_id;
|
|
1186
|
+
}
|
|
1187
|
+
if (msg.role === "assistant" && _optionalChain([msg, 'access', _75 => _75.tool_calls, 'optionalAccess', _76 => _76.length])) {
|
|
1188
|
+
sanitized.tool_calls = msg.tool_calls;
|
|
1189
|
+
}
|
|
1190
|
+
if (msg.name) {
|
|
1191
|
+
sanitized.name = msg.name;
|
|
1192
|
+
}
|
|
1193
|
+
return sanitized;
|
|
1194
|
+
});
|
|
1195
|
+
}
|
|
1196
|
+
var DEFAULT_API_VERSION = "2024-10-21";
|
|
1197
|
+
var DEFAULT_MAX_RETRIES3 = 3;
|
|
1198
|
+
var MAX_ALLOWED_RETRIES3 = 5;
|
|
1199
|
+
var DEFAULT_RETRY_DELAY3 = 1e3;
|
|
1200
|
+
var DEFAULT_TIMEOUT3 = 3e4;
|
|
1201
|
+
var FRIENDLY_ERRORS3 = {
|
|
1202
|
+
400: "The request was malformed. This often happens when the context is too long. Try /undo to remove recent turns or /new to start fresh.",
|
|
1203
|
+
401: "Authentication failed. Please verify your Azure API key or credentials in ~/.autohand/config.json.",
|
|
1204
|
+
402: "Payment required. Please check your Azure subscription and billing settings.",
|
|
1205
|
+
403: "Access denied. Your credentials may not have permission for this Azure deployment.",
|
|
1206
|
+
404: "The Azure deployment was not found. Verify your resourceName and deploymentName in ~/.autohand/config.json.",
|
|
1207
|
+
429: "Rate limit exceeded. Please wait a moment and try again, or adjust your Azure deployment capacity.",
|
|
1208
|
+
500: "Azure OpenAI encountered an internal error. Please try again later.",
|
|
1209
|
+
502: "Azure OpenAI is temporarily unavailable. Please try again in a few moments.",
|
|
1210
|
+
503: "Azure OpenAI is currently overloaded. Please try again later.",
|
|
1211
|
+
504: "The request timed out. Azure OpenAI may be experiencing high load."
|
|
1212
|
+
};
|
|
1213
|
+
var AzureClient = class {
|
|
1214
|
+
constructor(options, networkSettings) {
|
|
1215
|
+
this.options = options;
|
|
1216
|
+
this.tokenManager = new AzureTokenManager();
|
|
1217
|
+
this.defaultModel = options.model;
|
|
1218
|
+
const configuredRetries = _nullishCoalesce(_optionalChain([networkSettings, 'optionalAccess', _77 => _77.maxRetries]), () => ( DEFAULT_MAX_RETRIES3));
|
|
1219
|
+
this.maxRetries = Math.min(
|
|
1220
|
+
Math.max(0, configuredRetries),
|
|
1221
|
+
MAX_ALLOWED_RETRIES3
|
|
1222
|
+
);
|
|
1223
|
+
this.retryDelay = _nullishCoalesce(_optionalChain([networkSettings, 'optionalAccess', _78 => _78.retryDelay]), () => ( DEFAULT_RETRY_DELAY3));
|
|
1224
|
+
this.timeout = _nullishCoalesce(_optionalChain([networkSettings, 'optionalAccess', _79 => _79.timeout]), () => ( DEFAULT_TIMEOUT3));
|
|
1225
|
+
}
|
|
1226
|
+
setDefaultModel(model) {
|
|
1227
|
+
this.defaultModel = model;
|
|
1228
|
+
}
|
|
1229
|
+
/**
|
|
1230
|
+
* Build the full Azure OpenAI endpoint URL.
|
|
1231
|
+
*
|
|
1232
|
+
* If baseUrl is provided:
|
|
1233
|
+
* {baseUrl}/chat/completions?api-version={apiVersion}
|
|
1234
|
+
*
|
|
1235
|
+
* If resourceName is a full URL (starts with https://):
|
|
1236
|
+
* {origin}/openai/deployments/{deploymentName}/chat/completions?api-version={apiVersion}
|
|
1237
|
+
* Supports all Azure endpoint domains:
|
|
1238
|
+
* - *.openai.azure.com (Azure OpenAI)
|
|
1239
|
+
* - *.services.ai.azure.com (Microsoft Foundry)
|
|
1240
|
+
* - *.cognitiveservices.azure.com (Azure AI Services)
|
|
1241
|
+
*
|
|
1242
|
+
* Otherwise, from resourceName + deploymentName:
|
|
1243
|
+
* https://{resourceName}.openai.azure.com/openai/deployments/{deploymentName}/chat/completions?api-version={apiVersion}
|
|
1244
|
+
*/
|
|
1245
|
+
buildEndpointUrl() {
|
|
1246
|
+
const apiVersion = _nullishCoalesce(this.options.apiVersion, () => ( DEFAULT_API_VERSION));
|
|
1247
|
+
if (this.options.baseUrl) {
|
|
1248
|
+
return `${this.options.baseUrl}/chat/completions?api-version=${apiVersion}`;
|
|
1249
|
+
}
|
|
1250
|
+
const { resourceName, deploymentName } = this.options;
|
|
1251
|
+
if (!resourceName || !deploymentName) {
|
|
1252
|
+
throw new Error(
|
|
1253
|
+
"Azure OpenAI requires either baseUrl or both resourceName and deploymentName in ~/.autohand/config.json."
|
|
1254
|
+
);
|
|
1255
|
+
}
|
|
1256
|
+
if (resourceName.startsWith("http://") || resourceName.startsWith("https://")) {
|
|
1257
|
+
try {
|
|
1258
|
+
const parsed = new URL(resourceName);
|
|
1259
|
+
return `${parsed.origin}/openai/deployments/${deploymentName}/chat/completions?api-version=${apiVersion}`;
|
|
1260
|
+
} catch (e15) {
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
return `https://${resourceName}.openai.azure.com/openai/deployments/${deploymentName}/chat/completions?api-version=${apiVersion}`;
|
|
1264
|
+
}
|
|
1265
|
+
async complete(request) {
|
|
1266
|
+
const payload = {
|
|
1267
|
+
messages: sanitizeMessages3(request.messages),
|
|
1268
|
+
temperature: _nullishCoalesce(request.temperature, () => ( 0.2)),
|
|
1269
|
+
max_tokens: _nullishCoalesce(request.maxTokens, () => ( 16e3)),
|
|
1270
|
+
stream: _nullishCoalesce(request.stream, () => ( false))
|
|
1271
|
+
};
|
|
1272
|
+
if (request.tools && request.tools.length > 0) {
|
|
1273
|
+
payload.tools = request.tools.map((tool) => ({
|
|
1274
|
+
type: "function",
|
|
1275
|
+
function: {
|
|
1276
|
+
name: tool.name,
|
|
1277
|
+
description: tool.description,
|
|
1278
|
+
parameters: _nullishCoalesce(tool.parameters, () => ( { type: "object", properties: {} }))
|
|
1279
|
+
}
|
|
1280
|
+
}));
|
|
1281
|
+
if (request.toolChoice) {
|
|
1282
|
+
payload.tool_choice = request.toolChoice;
|
|
1283
|
+
}
|
|
1284
|
+
}
|
|
1285
|
+
const authHeaders = await this.tokenManager.getAuthHeaders({
|
|
1286
|
+
authMethod: this.options.authMethod,
|
|
1287
|
+
apiKey: this.options.apiKey,
|
|
1288
|
+
tenantId: this.options.tenantId,
|
|
1289
|
+
clientId: this.options.clientId,
|
|
1290
|
+
clientSecret: this.options.clientSecret
|
|
1291
|
+
});
|
|
1292
|
+
const headers = {
|
|
1293
|
+
"Content-Type": "application/json",
|
|
1294
|
+
...authHeaders
|
|
1295
|
+
};
|
|
1296
|
+
const payloadJson = JSON.stringify(payload);
|
|
1297
|
+
const payloadSizeBytes = payloadJson.length;
|
|
1298
|
+
const maxPayloadSize = 5 * 1024 * 1024;
|
|
1299
|
+
if (payloadSizeBytes > maxPayloadSize) {
|
|
1300
|
+
const sizeMB = (payloadSizeBytes / (1024 * 1024)).toFixed(2);
|
|
1301
|
+
throw new Error(
|
|
1302
|
+
`Request payload too large (${sizeMB}MB). This usually happens when the conversation history grows too long. Try using /undo to remove recent turns or /new to start fresh.`
|
|
1303
|
+
);
|
|
1304
|
+
}
|
|
1305
|
+
let lastError = null;
|
|
1306
|
+
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
1307
|
+
try {
|
|
1308
|
+
const response = await this.makeRequest(
|
|
1309
|
+
payload,
|
|
1310
|
+
headers,
|
|
1311
|
+
request.signal,
|
|
1312
|
+
payloadJson
|
|
1313
|
+
);
|
|
1314
|
+
return response;
|
|
1315
|
+
} catch (error) {
|
|
1316
|
+
lastError = error;
|
|
1317
|
+
if (this.isNonRetryableError(error)) {
|
|
1318
|
+
throw error;
|
|
1319
|
+
}
|
|
1320
|
+
if (attempt < this.maxRetries) {
|
|
1321
|
+
const delay = this.retryDelay * Math.pow(2, attempt);
|
|
1322
|
+
await this.sleep(delay);
|
|
1323
|
+
}
|
|
1324
|
+
}
|
|
1325
|
+
}
|
|
1326
|
+
throw _nullishCoalesce(lastError, () => ( new Error(
|
|
1327
|
+
"Failed to communicate with Azure OpenAI. Please try again."
|
|
1328
|
+
)));
|
|
1329
|
+
}
|
|
1330
|
+
async makeRequest(payload, headers, signal, preSerializedBody) {
|
|
1331
|
+
let response;
|
|
1332
|
+
const url = this.buildEndpointUrl();
|
|
1333
|
+
try {
|
|
1334
|
+
const timeoutController = new AbortController();
|
|
1335
|
+
const timeoutId = setTimeout(
|
|
1336
|
+
() => timeoutController.abort(),
|
|
1337
|
+
this.timeout
|
|
1338
|
+
);
|
|
1339
|
+
const combinedSignal = signal ? this.combineSignals(signal, timeoutController.signal) : timeoutController.signal;
|
|
1340
|
+
try {
|
|
1341
|
+
response = await fetch(url, {
|
|
1342
|
+
method: "POST",
|
|
1343
|
+
headers,
|
|
1344
|
+
body: _nullishCoalesce(preSerializedBody, () => ( JSON.stringify(payload))),
|
|
1345
|
+
signal: combinedSignal
|
|
1346
|
+
});
|
|
1347
|
+
} finally {
|
|
1348
|
+
clearTimeout(timeoutId);
|
|
1349
|
+
}
|
|
1350
|
+
} catch (error) {
|
|
1351
|
+
const err = error;
|
|
1352
|
+
if (err.name === "AbortError" && _optionalChain([signal, 'optionalAccess', _80 => _80.aborted])) {
|
|
1353
|
+
throw new Error("Request cancelled.");
|
|
1354
|
+
}
|
|
1355
|
+
if (err.name === "AbortError") {
|
|
1356
|
+
throw new Error(
|
|
1357
|
+
"Request timed out. Azure OpenAI may be experiencing high load."
|
|
1358
|
+
);
|
|
1359
|
+
}
|
|
1360
|
+
throw new Error(
|
|
1361
|
+
"Unable to connect to Azure OpenAI. Please check your internet connection and Azure configuration."
|
|
1362
|
+
);
|
|
1363
|
+
}
|
|
1364
|
+
if (!response.ok) {
|
|
1365
|
+
throw new Error(await this.buildFriendlyError(response));
|
|
1366
|
+
}
|
|
1367
|
+
const json = await response.json();
|
|
1368
|
+
const message = _optionalChain([json, 'optionalAccess', _81 => _81.choices, 'optionalAccess', _82 => _82[0], 'optionalAccess', _83 => _83.message]);
|
|
1369
|
+
const text = _nullishCoalesce(_optionalChain([message, 'optionalAccess', _84 => _84.content]), () => ( ""));
|
|
1370
|
+
const finishReason = _optionalChain([json, 'optionalAccess', _85 => _85.choices, 'optionalAccess', _86 => _86[0], 'optionalAccess', _87 => _87.finish_reason]);
|
|
1371
|
+
let toolCalls;
|
|
1372
|
+
if (_optionalChain([message, 'optionalAccess', _88 => _88.tool_calls]) && Array.isArray(message.tool_calls)) {
|
|
1373
|
+
toolCalls = message.tool_calls.map((tc) => {
|
|
1374
|
+
const rawArgs = _optionalChain([tc, 'access', _89 => _89.function, 'optionalAccess', _90 => _90.arguments]);
|
|
1375
|
+
return {
|
|
1376
|
+
id: tc.id,
|
|
1377
|
+
type: "function",
|
|
1378
|
+
function: {
|
|
1379
|
+
name: _nullishCoalesce(_optionalChain([tc, 'access', _91 => _91.function, 'optionalAccess', _92 => _92.name]), () => ( "")),
|
|
1380
|
+
arguments: _nullishCoalesce(rawArgs, () => ( "{}"))
|
|
1381
|
+
}
|
|
1382
|
+
};
|
|
1383
|
+
});
|
|
1384
|
+
}
|
|
1385
|
+
let usage;
|
|
1386
|
+
if (_optionalChain([json, 'optionalAccess', _93 => _93.usage])) {
|
|
1387
|
+
usage = {
|
|
1388
|
+
promptTokens: _nullishCoalesce(json.usage.prompt_tokens, () => ( 0)),
|
|
1389
|
+
completionTokens: _nullishCoalesce(json.usage.completion_tokens, () => ( 0)),
|
|
1390
|
+
totalTokens: _nullishCoalesce(json.usage.total_tokens, () => ( 0))
|
|
1391
|
+
};
|
|
1392
|
+
}
|
|
1393
|
+
return {
|
|
1394
|
+
id: _nullishCoalesce(json.id, () => ( "autohand-azure")),
|
|
1395
|
+
created: _nullishCoalesce(json.created, () => ( Date.now())),
|
|
1396
|
+
content: text,
|
|
1397
|
+
toolCalls,
|
|
1398
|
+
finishReason,
|
|
1399
|
+
usage,
|
|
1400
|
+
raw: json
|
|
1401
|
+
};
|
|
1402
|
+
}
|
|
1403
|
+
async buildFriendlyError(response) {
|
|
1404
|
+
const status = response.status;
|
|
1405
|
+
let errorDetail = "";
|
|
1406
|
+
try {
|
|
1407
|
+
const body = await response.json();
|
|
1408
|
+
errorDetail = _optionalChain([body, 'optionalAccess', _94 => _94.error, 'optionalAccess', _95 => _95.message]) || _optionalChain([body, 'optionalAccess', _96 => _96.error]) || _optionalChain([body, 'optionalAccess', _97 => _97.message]) || "";
|
|
1409
|
+
if (typeof errorDetail === "object") {
|
|
1410
|
+
errorDetail = JSON.stringify(errorDetail);
|
|
1411
|
+
}
|
|
1412
|
+
} catch (e16) {
|
|
1413
|
+
try {
|
|
1414
|
+
errorDetail = await response.text();
|
|
1415
|
+
} catch (e17) {
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
const friendlyMessage = FRIENDLY_ERRORS3[status];
|
|
1419
|
+
if (friendlyMessage) {
|
|
1420
|
+
return errorDetail ? `${friendlyMessage}
|
|
1421
|
+
${errorDetail}` : friendlyMessage;
|
|
1422
|
+
}
|
|
1423
|
+
if (status >= 500) {
|
|
1424
|
+
const base = "Azure OpenAI is temporarily unavailable. Please try again later.";
|
|
1425
|
+
return errorDetail ? `${base}
|
|
1426
|
+
(${status}: ${errorDetail})` : base;
|
|
1427
|
+
}
|
|
1428
|
+
if (status >= 400) {
|
|
1429
|
+
const base = "The request could not be processed by Azure OpenAI.";
|
|
1430
|
+
return errorDetail ? `${base} (${status}: ${errorDetail})` : `${base} (HTTP ${status}) Please try again or adjust your prompt.`;
|
|
1431
|
+
}
|
|
1432
|
+
return errorDetail ? `An unexpected Azure OpenAI error occurred: ${errorDetail}` : "An unexpected Azure OpenAI error occurred. Please try again.";
|
|
1433
|
+
}
|
|
1434
|
+
isNonRetryableError(error) {
|
|
1435
|
+
const message = error.message.toLowerCase();
|
|
1436
|
+
if (message.includes("cancelled") || message.includes("aborted")) {
|
|
1437
|
+
return true;
|
|
1438
|
+
}
|
|
1439
|
+
if (message.includes("authentication") || message.includes("api key")) {
|
|
1440
|
+
return true;
|
|
1441
|
+
}
|
|
1442
|
+
if (message.includes("payment") || message.includes("access denied")) {
|
|
1443
|
+
return true;
|
|
1444
|
+
}
|
|
1445
|
+
if (message.includes("not found")) {
|
|
1446
|
+
return true;
|
|
1447
|
+
}
|
|
1448
|
+
return false;
|
|
1449
|
+
}
|
|
1450
|
+
combineSignals(signal1, signal2) {
|
|
1451
|
+
const controller = new AbortController();
|
|
1452
|
+
const abort = () => controller.abort();
|
|
1453
|
+
signal1.addEventListener("abort", abort);
|
|
1454
|
+
signal2.addEventListener("abort", abort);
|
|
1455
|
+
if (signal1.aborted || signal2.aborted) {
|
|
1456
|
+
controller.abort();
|
|
1457
|
+
}
|
|
1458
|
+
return controller.signal;
|
|
1459
|
+
}
|
|
1460
|
+
sleep(ms) {
|
|
1461
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
1462
|
+
}
|
|
1463
|
+
};
|
|
1464
|
+
|
|
1465
|
+
// src/providers/AzureProvider.ts
|
|
1466
|
+
var AzureProvider = class {
|
|
1467
|
+
constructor(config, networkSettings) {
|
|
1468
|
+
this.client = new AzureClient(
|
|
1469
|
+
{
|
|
1470
|
+
model: config.model,
|
|
1471
|
+
resourceName: config.resourceName,
|
|
1472
|
+
deploymentName: config.deploymentName,
|
|
1473
|
+
baseUrl: config.baseUrl,
|
|
1474
|
+
apiVersion: config.apiVersion,
|
|
1475
|
+
apiKey: config.apiKey,
|
|
1476
|
+
authMethod: _nullishCoalesce(config.authMethod, () => ( "api-key")),
|
|
1477
|
+
tenantId: config.tenantId,
|
|
1478
|
+
clientId: config.clientId,
|
|
1479
|
+
clientSecret: config.clientSecret
|
|
1480
|
+
},
|
|
1481
|
+
networkSettings
|
|
1482
|
+
);
|
|
1483
|
+
this.model = config.model;
|
|
1484
|
+
}
|
|
1485
|
+
getName() {
|
|
1486
|
+
return "azure";
|
|
1487
|
+
}
|
|
1488
|
+
setModel(model) {
|
|
1489
|
+
this.model = model;
|
|
1490
|
+
this.client.setDefaultModel(model);
|
|
1491
|
+
}
|
|
1492
|
+
async listModels() {
|
|
1493
|
+
return ["gpt-4o", "gpt-4o-mini", "gpt-4-turbo", "gpt-4", "gpt-3.5-turbo"];
|
|
1494
|
+
}
|
|
1495
|
+
async isAvailable() {
|
|
1496
|
+
return true;
|
|
1497
|
+
}
|
|
1498
|
+
async complete(request) {
|
|
1499
|
+
return this.client.complete(request);
|
|
1500
|
+
}
|
|
1501
|
+
};
|
|
1502
|
+
|
|
1077
1503
|
// src/providers/ProviderFactory.ts
|
|
1078
1504
|
var ProviderNotConfiguredError = class extends Error {
|
|
1079
1505
|
constructor(providerName) {
|
|
@@ -1135,6 +1561,11 @@ var ProviderFactory = class {
|
|
|
1135
1561
|
return new UnconfiguredProvider("llmgateway");
|
|
1136
1562
|
}
|
|
1137
1563
|
return new LLMGatewayProvider(config.llmgateway, config.network);
|
|
1564
|
+
case "azure":
|
|
1565
|
+
if (!config.azure) {
|
|
1566
|
+
return new UnconfiguredProvider("azure");
|
|
1567
|
+
}
|
|
1568
|
+
return new AzureProvider(config.azure, config.network);
|
|
1138
1569
|
case "openrouter":
|
|
1139
1570
|
default:
|
|
1140
1571
|
if (!config.openrouter) {
|
|
@@ -1148,7 +1579,7 @@ var ProviderFactory = class {
|
|
|
1148
1579
|
* MLX is only included on Apple Silicon (macOS + arm64).
|
|
1149
1580
|
*/
|
|
1150
1581
|
static getProviderNames() {
|
|
1151
|
-
const providers = ["openrouter", "ollama", "openai", "llamacpp", "llmgateway"];
|
|
1582
|
+
const providers = ["openrouter", "ollama", "openai", "llamacpp", "llmgateway", "azure"];
|
|
1152
1583
|
if (isMLXSupported()) {
|
|
1153
1584
|
providers.push("mlx");
|
|
1154
1585
|
}
|
|
@@ -1160,7 +1591,7 @@ var ProviderFactory = class {
|
|
|
1160
1591
|
* MLX is always a valid provider name, but may not be available on non-Apple Silicon systems.
|
|
1161
1592
|
*/
|
|
1162
1593
|
static isValidProvider(name) {
|
|
1163
|
-
const allProviders = ["openrouter", "ollama", "openai", "llamacpp", "mlx", "llmgateway"];
|
|
1594
|
+
const allProviders = ["openrouter", "ollama", "openai", "llamacpp", "mlx", "llmgateway", "azure"];
|
|
1164
1595
|
return allProviders.includes(name);
|
|
1165
1596
|
}
|
|
1166
1597
|
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } 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
|
-
var
|
|
3
|
+
var _chunkTXSDBGKXcjs = require('./chunk-TXSDBGKX.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunk7BTSG4MEcjs = require('./chunk-7BTSG4ME.cjs');
|
|
7
7
|
|
|
8
8
|
// src/commands/status.ts
|
|
9
9
|
var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
|
|
@@ -28,7 +28,7 @@ async function gatherStatusData(ctx) {
|
|
|
28
28
|
apiConnected = false;
|
|
29
29
|
}
|
|
30
30
|
return {
|
|
31
|
-
version:
|
|
31
|
+
version: _chunkTXSDBGKXcjs.package_default.version,
|
|
32
32
|
sessionId: _nullishCoalesce(_optionalChain([currentSession, 'optionalAccess', _ => _.metadata, 'access', _2 => _2.sessionId]), () => ( null)),
|
|
33
33
|
cwd: ctx.workspaceRoot,
|
|
34
34
|
provider: _nullishCoalesce(ctx.provider, () => ( "openrouter")),
|
|
@@ -158,21 +158,21 @@ function renderTabContent(tab, data) {
|
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
160
|
function renderStatusTab(data) {
|
|
161
|
-
console.log(_chalk2.default.bold(`${
|
|
162
|
-
console.log(_chalk2.default.bold(`${
|
|
163
|
-
console.log(_chalk2.default.bold(`${
|
|
164
|
-
console.log(_chalk2.default.bold(`${
|
|
165
|
-
console.log(_chalk2.default.bold(`${
|
|
161
|
+
console.log(_chalk2.default.bold(`${_chunk7BTSG4MEcjs.t.call(void 0, "commands.status.version")}:`), data.version);
|
|
162
|
+
console.log(_chalk2.default.bold(`${_chunk7BTSG4MEcjs.t.call(void 0, "commands.status.sessionId")}:`), _nullishCoalesce(data.sessionId, () => ( _chalk2.default.gray("none"))));
|
|
163
|
+
console.log(_chalk2.default.bold(`${_chunk7BTSG4MEcjs.t.call(void 0, "commands.status.cwd")}:`), data.cwd);
|
|
164
|
+
console.log(_chalk2.default.bold(`${_chunk7BTSG4MEcjs.t.call(void 0, "commands.status.provider")}:`), data.provider);
|
|
165
|
+
console.log(_chalk2.default.bold(`${_chunk7BTSG4MEcjs.t.call(void 0, "commands.status.model")}:`), data.model);
|
|
166
166
|
console.log(
|
|
167
167
|
_chalk2.default.bold("Context Compaction:"),
|
|
168
168
|
data.contextCompactionEnabled ? _chalk2.default.green("ON") : _chalk2.default.yellow("OFF")
|
|
169
169
|
);
|
|
170
170
|
console.log();
|
|
171
171
|
console.log(
|
|
172
|
-
_chalk2.default.bold(`${
|
|
173
|
-
data.apiConnected ? _chalk2.default.green(
|
|
172
|
+
_chalk2.default.bold(`${_chunk7BTSG4MEcjs.t.call(void 0, "commands.status.apiStatus")}:`),
|
|
173
|
+
data.apiConnected ? _chalk2.default.green(_chunk7BTSG4MEcjs.t.call(void 0, "commands.status.connected")) : _chalk2.default.red(_chunk7BTSG4MEcjs.t.call(void 0, "commands.status.disconnected"))
|
|
174
174
|
);
|
|
175
|
-
console.log(_chalk2.default.bold(`${
|
|
175
|
+
console.log(_chalk2.default.bold(`${_chunk7BTSG4MEcjs.t.call(void 0, "commands.status.sessions")}:`), _chunk7BTSG4MEcjs.t.call(void 0, "commands.status.total", { count: String(data.sessionsCount) }));
|
|
176
176
|
console.log(_chalk2.default.bold("Memory:"), "user (~/.autohand/memory/), project (.autohand/memory/)");
|
|
177
177
|
}
|
|
178
178
|
function renderConfigTab(data) {
|
|
@@ -6,7 +6,7 @@ var _chunkCNBKZEX5cjs = require('./chunk-CNBKZEX5.cjs');
|
|
|
6
6
|
var _chunkYFXTE422cjs = require('./chunk-YFXTE422.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunk7BTSG4MEcjs = require('./chunk-7BTSG4ME.cjs');
|
|
10
10
|
|
|
11
11
|
// src/commands/new.ts
|
|
12
12
|
var _chalk = require('chalk'); var _chalk2 = _interopRequireDefault(_chalk);
|
|
@@ -37,7 +37,7 @@ async function newConversation(ctx) {
|
|
|
37
37
|
)
|
|
38
38
|
);
|
|
39
39
|
} else {
|
|
40
|
-
console.log(_chalk2.default.cyan(
|
|
40
|
+
console.log(_chalk2.default.cyan(_chunk7BTSG4MEcjs.t.call(void 0, "commands.new.cleared")));
|
|
41
41
|
}
|
|
42
42
|
console.log();
|
|
43
43
|
return null;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
package_default
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-T73IDKDF.js";
|
|
4
4
|
import {
|
|
5
5
|
getTheme,
|
|
6
6
|
isThemeInitialized
|
|
7
7
|
} from "./chunk-JS7IPR7P.js";
|
|
8
8
|
import {
|
|
9
9
|
t
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-APIXPPMT.js";
|
|
11
11
|
|
|
12
12
|
// src/commands/about.ts
|
|
13
13
|
import { execSync } from "child_process";
|
|
@@ -19,7 +19,7 @@ function getCommitFromAlphaVersion(version) {
|
|
|
19
19
|
}
|
|
20
20
|
function getGitCommit() {
|
|
21
21
|
if (true) {
|
|
22
|
-
return "
|
|
22
|
+
return "f12701b";
|
|
23
23
|
}
|
|
24
24
|
const alphaCommit = getCommitFromAlphaVersion(package_default.version);
|
|
25
25
|
if (alphaCommit) {
|