@syke1/mcp-server 1.6.1 → 1.7.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.
@@ -1 +1,925 @@
1
- 'use strict';const _0x25ff74=_0x2d75;(function(_0xdcc3f4,_0x136526){const _0x3bc294={_0x24f6ce:0x1f6,_0x7bc520:0x2ac,_0x4bcbb1:0x2e3,_0x550efe:0x31f,_0x33cdba:0x219,_0x466dbc:0x1ec,_0x5295c3:0x227,_0x2e7c1e:0x201},_0x5438b1=_0x2d75,_0x14bd0a=_0xdcc3f4();while(!![]){try{const _0x1d1e4f=-parseInt(_0x5438b1(_0x3bc294._0x24f6ce))/0x1+-parseInt(_0x5438b1(0x1ef))/0x2*(parseInt(_0x5438b1(0x324))/0x3)+-parseInt(_0x5438b1(_0x3bc294._0x7bc520))/0x4*(-parseInt(_0x5438b1(_0x3bc294._0x4bcbb1))/0x5)+-parseInt(_0x5438b1(_0x3bc294._0x550efe))/0x6+-parseInt(_0x5438b1(_0x3bc294._0x33cdba))/0x7*(-parseInt(_0x5438b1(_0x3bc294._0x466dbc))/0x8)+-parseInt(_0x5438b1(0x299))/0x9*(parseInt(_0x5438b1(0x1e1))/0xa)+-parseInt(_0x5438b1(_0x3bc294._0x5295c3))/0xb*(-parseInt(_0x5438b1(_0x3bc294._0x2e7c1e))/0xc);if(_0x1d1e4f===_0x136526)break;else _0x14bd0a['push'](_0x14bd0a['shift']());}catch(_0x141dae){_0x14bd0a['push'](_0x14bd0a['shift']());}}}(_0x11e9,0xbd6b0));function _0x2d75(_0x158e44,_0x5f0dff){_0x158e44=_0x158e44-0x1cf;const _0x11e992=_0x11e9();let _0x2d752=_0x11e992[_0x158e44];if(_0x2d75['xcRcZm']===undefined){var _0x2e5746=function(_0x348a5e){const _0x59006e='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x137874='',_0x53da0f='';for(let _0x25338b=0x0,_0x25b897,_0x252d90,_0x2cff48=0x0;_0x252d90=_0x348a5e['charAt'](_0x2cff48++);~_0x252d90&&(_0x25b897=_0x25338b%0x4?_0x25b897*0x40+_0x252d90:_0x252d90,_0x25338b++%0x4)?_0x137874+=String['fromCharCode'](0xff&_0x25b897>>(-0x2*_0x25338b&0x6)):0x0){_0x252d90=_0x59006e['indexOf'](_0x252d90);}for(let _0xfd256a=0x0,_0x3364ba=_0x137874['length'];_0xfd256a<_0x3364ba;_0xfd256a++){_0x53da0f+='%'+('00'+_0x137874['charCodeAt'](_0xfd256a)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x53da0f);};_0x2d75['xtrGkd']=_0x2e5746,_0x2d75['JURqgp']={},_0x2d75['xcRcZm']=!![];}const _0x3dadb6=_0x11e992[0x0],_0x4366dd=_0x158e44+_0x3dadb6,_0x1fd20c=_0x2d75['JURqgp'][_0x4366dd];return!_0x1fd20c?(_0x2d752=_0x2d75['xtrGkd'](_0x2d752),_0x2d75['JURqgp'][_0x4366dd]=_0x2d752):_0x2d752=_0x1fd20c,_0x2d752;}function _0x11e9(){const _0x550dea=['D2fYBMLUz3m','rgDPu1a','qvbj','vefVr3O','BM9Kzv9TB2r1BgvZ','y2fJAgvtAxPL','DxrMltG','Cg9ZDa','EvbetKW','C2v0rMLSzunHy2HL','u3LZDgvTifzVBhvTzsbjBMzVCM1HDgLVBG','DxbKyxrLzezPBgu','shvIigzPBgvZihjHBMTPBMC','CeDktwe','BuzgwuK','Ahr0Chm6lY9ZEwTLlMnSB3vKl2rHC2HIB2fYzc8','Dw5ZAgLMDa','yw5HBhL6zuLTCgfJDa','shblzgW','rMLSzsbWyxrOihjLCxvPCMvK','CMvHBhrPBwvbsuvUywjSzwq','Dw5RBM93BG','lM1VzgvSlNrZ','lI4VywKVCMvHBhrPBwuTyw5HBhL6zxi','zLjNuwS','CMvTB3zL','ywrKzwrfzgDLCW','EM54t1C','y291BNq','l3v0AwXZlW','l2fWAs9ODwiTzMLSzxm','rePsAe0','ChjVDMLKzxiGBxvZDcbIzsbNzw1PBMKSig9Wzw5HAsWGB3iGyw50AhjVCgLJ','igfMzMvJDgvKigzPBgvZkq','AxnbyNnVBhv0zq','l2fWAs9NCMfWAa','D2f0y2HLCI8','DxnL','C3vNz2vZDgLVBG','D09fELO','B2XK','zw5HyMXLza','nvfWuwPnsG','ChvZAa','l2fWAs9ZzxqTywKTA2v5','x3nLCNzPy2uUzgfYDa','q2Pzq2u','C3vTBwfYEq','AxDRwfu','vhjPywWGzxHWAxjLzc4GvxbNCMfKzsbHDca','y29UzMLNDxjHyMXL','DgLTzxn0yw1W','zMLSzsbPCYbYzxf1AxjLzcbPBIbIB2r5','CgfJA2fNzs5QC29U','C2XPy2u','yxbWlW','u0PZvwO','l3bYzxnLBNrHDgLVBI8','q09orKLh','Bejbreq','ELDxBwK','rgvSzxrLihnPBxvSyxrPB24','Dvn4Bui','CMvXDwLYzxnqCM8','lMH0BwW','r3jwvuW','zgv0ywLS','l3DPzgDLDhmV','tM1tsgq','suPjDvq','vLLrrhe','ywrKzwq','rMLSzsbUB3qGzM91BMqGAw4Gz3jHCgG6ia','CMvWBgfJzq','C29YDa','zgLMzKnVDw50','Effzr2G','x3jVDxrLCY5Kyxj0','BgvUz3rO','wMzqB0G','tu5LEhO','C0XHuuy','z3jHCgGTAw5JCMvTzw50ywWTDxbKyxrL','BerYvg0','z2vTAw5P','x3rLC3q','DKTvtee','zNLVDg8','AunJvLm','sxD6zue','l2rHDgeV','v2D3r3K','lNnLCNzPy2uUDhm','D1LKzLG','y2XVDwrFzNvUy3rPB24','A2vLCc1HBgL2zq','CMvSyxrPDMvqyxrO','Bxzesw8','zufgEvq','ywzMzwn0zwrgAwXLCW','yvDbA0O','x3nJAgvTys5Kyxj0','nZiYmJmYnMLctLzHyG','Dwn4DK0','lMHLBhbLCI50CW','x2nHCMqUzgfYDa','tg9vzvO','ndG5A09NqML4','z2v0shvIrMLSzxm','zw51BwvYywjSzq','CLvwrwW','DhLWzq','q3LJBguGzgv0zwn0Aw9U','yLnADMm','zNjVBq','tu5gy0y','zw52','lNnJAgvTys50CW','yw5HBhLZAxmTzxjYB3i','r1v2qLq','C1rOvfu','rMLSzsbUB3qGzM91BMqGAw4Gz3jHCgG','z2v0qwXSv2fYBMLUz3m','v3bTD1m','u21ryLK','ywzMzwn0zwroB2rLCW','lMnZCW','x19PBxbVCNrezwzHDwX0','zNjVBsbHBMqGDg8GCMvXDwLYzwq','vu1ADvK','zwrPDa','mtbQsNHbALq','wgfxCxO','C3bSyxq','rKrnzuy','zM9YrwfJAa','CMvTB3zLzevKz2vZ','DuT4qKm','x3vZzwnHC2uUzgfYDa','l3jVDxrPBMCV','txfrA3u','CMvHzezPBgvtEw5J','mJuXmZzyv0LQq2G','Dg9VBhmV','CerSuhG','mtG5nePuqKPhra','B3bLBMfP','CxvLCNK','y2XVC2u','ufjpra','y29UzMLNDxjLza','v0LIAhi','mtqYody4oeTVDe5oBa','q0Tfz0K','A2LIzNq','v0P4rxe','BgLI','qNrXCui','yxv0BW','r014zgi','DefzrMi','zMLSDgvY','runxBxG','ndaWmZG3ntzsuNzPt2q','y29TCg9Uzw50CY8','zxfAz0W','yNjVA2vUsw1WB3j0CW','A0XmyMm','sNv5BKO','BMDyyu8','vNffDfG','C291CMnL','DLrpAMq','sxrfzgi','zgvMAw5LuhjVCgvYDhK','rMfPBgvKihrVihn3AxrJAcbWCM9Qzwn0','C01Iy3e','CgXHDgzVCM0','wxjwDMm','yw5HBhL6zvDPDgHbsq','zMLSzxm','q2fYz28UDg9TBa','w3n5A2u6C3nLxsbgAwXLq2fJAguGCMuTD2LYzwqGka','x25VDgLMAwvYlMrHCNq','zgfMAMS','zMLSzq','tuvesvvn','mtq4nenXC0XYsa','wuzJB0e','x3DPzgDLDc5Kyxj0','x21VzgvSlMrHCNq','Aw5KzxHpzG','vwnNyKe','txvSDgLWBguGChjVAMvJDhmGCMvXDwLYzsbtwuTfifbYBY4GrNjLzsb0AwvYihn1ChbVCNrZideGChjVAMvJDc4','Dw5YzxnVBhzLza','C2HPzNq','x2rHDgfZB3vYy2u','Cg9W','C291CMnLrgLY','tfPPy1a','rNvUrha','mtfeDfjereC','Bg9JywXLq29TCgfYzq','x21PEgLUlMrHCNq','qvvxzNq','x3nJCMvLBG','BM9YBwfSAxPL','C2vYDMvYlMPZ','lMnVBMzPzY5QCW','l2nVBMzPzY8','Dg90ywXgAwXLCW','D3jPDgfIBgu','C3bSAxq','x3bHz2uUzgfYDa','Aw5JBhvKzxm','Dg9W','ihrVDgfSkq','Bgf5zxi','C2Hfvvi','C3rHDgLJ','vw5RBM93BIbLCNjVCG','CMLZA0XLDMvS','EejmqKq','DMfSDwvZ','ChjVAMvJDfjVB3q','twXYsMC','DgfYz2v0','Be1yAxi','q3bUB3q','x2HLBhbLCI5Kyxj0','x2rHDgfFC291CMnL','ywn0AxzLuhjVDMLKzxi','z3jHCgGTCMvIDwLSza','vu56t1u','rKrdz2m','C3rHDhvZ','ru5bqKXfra','vgHPCYbMAwXLigv4y2vLzhmGDgHLiezYzwuGDgLLCIbSAw1PDcaOntaGzMLSzxmPlIbvCgDYywrLihrVifbYBYbMB3iGDw5SAw1PDgvKigfUywX5C2LZlG','CMvHC29U','l3nJCMvLBNmV','x19JCMvHDgvcAw5KAw5N','BwfW','vMDmA3q','tg13rNK','zxzLBNq6ia','rMLSzsbUB3qGzM91BMq6ia','lI4VDg9VBhmVyw5HBhL6zs1PBxbHy3q','yw50AhjVCgLJ','z2v0','z0zMB3i','yw5HBhL6zunOyw5NzvjLywX0Aw1L','q1vvDee','u0rTz28','C2v0DxaUChK','zgvSzxrL','AM9PBG','D3rXAg8','C3vJy2vZCW','AgrxAxy','x2zHA2u','C0XuAKW','tM90ihn1ChbVCNrLza','BwvZC2fNzq','cI8Vic4UlIb0CNvUy2f0zwqGlI4U','ufHUyvi','zgvSzxrLza','reLtqujmruq','DxbNCMfKzq','l2fWAs8','Dg9mB3DLCKnHC2u','x3rOzw1LlMrHCNq','l21VzgvSCY8','C1PQy08','Cgf0Aa','uNnXrMq','x2v4DgvUC2LVBI5Kyxj0','qM5KwuS','x2zVCM0UzgfYDa','B3HmCgS','yM9KEq','CMvSyxrPDMu','C3rHDfn5BMm','zxHWCMvZCW','y3jLyxrL','CMvHzgrPCLn5BMm','DhrIENa','AxneAxjLy3rVCNK','AgfZ','vfj3EKu','ChjVAMvJDfjVB3qGAxmGCMvXDwLYzwq','qwnJzxnZlunVBNrYB2WTqwXSB3CTt3jPz2LU','lI4Vy29UzMLN','ChvIC3bLyY55yw1S','BgLJzw5ZzuTLEq','BgfUz3vHz2vZ','ufH4y1C','q01HA2vmAxn0CY50Ehq','zgLMzG','CMv2zxjZzq','C2LKzuvMzMvJDhm','zxHPC3rZu3LUyW','ywrK','ANnVBG','C3vIC3rYAw5N','zMf2D1u','x2vUDgL0Es5Kyxj0','l2fWAs93yxjUAw5NCY9Hy2TUB3DSzwrNzq','jfjfq1LdteuUqKLo','DMfSDwu','wKvYzMO','Dw5YzxnVBhzLzenVDw50','wgHxqNK','quKGyw5HBhLZAxmGzMfPBgvK','A2zQsei','l2rVBwfPBI8','oteZmtuWogznuefosW','C2L6zq','sLndD1m','z28UBw9K','zgLYBMfTzq','zMLSzs1JAgfUz2u','zM9YD2fYza','swPNz1K','CgXHBG','zxjYB3i','x2n1yML0lMrHCNq','lNrZEa','uKHQsvC','igzPBgvZkq','sfbWwLG','vLHmr2m','BM8Ty2fJAgu','zM9Yy2vK','BMfTzq','mJi5odi4neXyCeLlvG','zgvMyxvSDa','C3rYAw5NAwz5','zuHTD1O','l2fWAs9ZD2L0y2GTChjVAMvJDa','Dgv4Dc9LDMvUDc1ZDhjLyw0','l2fWAs9JywnOzs1ZDgf0Dxm','x2jSB2mUzgfYDa','q2fJAguTq29UDhjVBa','zw5KC1DPDgG','uuTgt0i','sMjiBMq','y2fSBa'];_0x11e9=function(){return _0x550dea;};return _0x11e9();}var __createBinding=this&&this[_0x25ff74(0x24e)]||(Object[_0x25ff74(0x279)]?function(_0x22552a,_0x3aa872,_0x6a55a2,_0xa01e39){const _0x44c160={_0x2780c6:0x238,_0x1a6d9e:0x2eb},_0x53be5f=_0x25ff74,_0x1ff042={};_0x1ff042['iSlvd']=function(_0x23a506,_0x3cae91){return _0x23a506 in _0x3cae91;},_0x1ff042[_0x53be5f(_0x44c160._0x2780c6)]='get';const _0x464300=_0x1ff042;if(_0xa01e39===undefined)_0xa01e39=_0x6a55a2;var _0x4c3695=Object['getOwnPropertyDescriptor'](_0x3aa872,_0x6a55a2);if(!_0x4c3695||(_0x464300['iSlvd'](_0x464300[_0x53be5f(0x238)],_0x4c3695)?!_0x3aa872['__esModule']:_0x4c3695[_0x53be5f(0x231)]||_0x4c3695[_0x53be5f(_0x44c160._0x1a6d9e)])){const _0x219f98={};_0x219f98[_0x53be5f(0x326)]=!![],_0x219f98['get']=function(){return _0x3aa872[_0x6a55a2];},_0x4c3695=_0x219f98;}Object[_0x53be5f(0x20c)](_0x22552a,_0xa01e39,_0x4c3695);}:function(_0xbf0101,_0x254fd2,_0x3254f4,_0x2e0ca6){if(_0x2e0ca6===undefined)_0x2e0ca6=_0x3254f4;_0xbf0101[_0x2e0ca6]=_0x254fd2[_0x3254f4];}),__setModuleDefault=this&&this['__setModuleDefault']||(Object[_0x25ff74(0x279)]?function(_0x129d42,_0x37099c){const _0x31900f={_0x53f569:0x20c},_0x47bd68=_0x25ff74,_0x153ce9={};_0x153ce9['whGTS']=_0x47bd68(0x2ad);const _0xb740ed=_0x153ce9,_0x45026a={};_0x45026a['enumerable']=!![],_0x45026a['value']=_0x37099c,Object[_0x47bd68(_0x31900f._0x53f569)](_0x129d42,_0xb740ed['whGTS'],_0x45026a);}:function(_0x5410f0,_0x14db9a){const _0x4bb86a=_0x25ff74;_0x5410f0[_0x4bb86a(0x2ad)]=_0x14db9a;}),__importStar=this&&this['__importStar']||(function(){const _0x2be3fb={_0x4c0a38:0x266,_0x504158:0x216},_0x174ece={'MPeBn':function(_0x1e7626,_0x1d267b){return _0x1e7626(_0x1d267b);},'PXnaR':function(_0x5810f9,_0xe0a5ed){return _0x5810f9!==_0xe0a5ed;},'dafjk':function(_0x1edc07,_0x5c1bfe,_0x163bdb,_0x477818){return _0x1edc07(_0x5c1bfe,_0x163bdb,_0x477818);},'VgLkt':function(_0x4dae63,_0x868ea4,_0x4edd6){return _0x4dae63(_0x868ea4,_0x4edd6);}};var _0x5c8656=function(_0x4aeda8){const _0x282ea4={_0x4918eb:0x2b8};return _0x5c8656=Object['getOwnPropertyNames']||function(_0x4bfa45){const _0x38eae0=_0x2d75;var _0x3f86be=[];for(var _0x537023 in _0x4bfa45)if(Object['prototype']['hasOwnProperty'][_0x38eae0(_0x282ea4._0x4918eb)](_0x4bfa45,_0x537023))_0x3f86be[_0x3f86be[_0x38eae0(0x307)]]=_0x537023;return _0x3f86be;},_0x174ece['MPeBn'](_0x5c8656,_0x4aeda8);};return function(_0x1c8817){const _0x2d8e2c=_0x2d75;if(_0x1c8817&&_0x1c8817['__esModule'])return _0x1c8817;var _0x33fb70={};if(_0x1c8817!=null){for(var _0x174e55=_0x5c8656(_0x1c8817),_0x115b5b=0x0;_0x115b5b<_0x174e55[_0x2d8e2c(0x307)];_0x115b5b++)if(_0x174ece[_0x2d8e2c(_0x2be3fb._0x4c0a38)](_0x174e55[_0x115b5b],'default'))_0x174ece[_0x2d8e2c(_0x2be3fb._0x504158)](__createBinding,_0x33fb70,_0x1c8817,_0x174e55[_0x115b5b]);}return _0x174ece[_0x2d8e2c(0x250)](__setModuleDefault,_0x33fb70,_0x1c8817),_0x33fb70;};}()),__importDefault=this&&this[_0x25ff74(0x1dd)]||function(_0x5117fe){return _0x5117fe&&_0x5117fe['__esModule']?_0x5117fe:{'default':_0x5117fe};};const _0x56206b={};_0x56206b[_0x25ff74(0x292)]=!![],Object[_0x25ff74(0x20c)](exports,'__esModule',_0x56206b),exports['addWarning']=addWarning,exports['getUnacknowledgedWarnings']=getUnacknowledgedWarnings,exports['acknowledgeWarnings']=acknowledgeWarnings,exports[_0x25ff74(0x1d8)]=getAllWarnings,exports['createWebServer']=createWebServer;const path=__importStar(require(_0x25ff74(0x26f))),fs=__importStar(require('fs')),express_1=__importDefault(require(_0x25ff74(0x278))),plugin_1=require('../languages/plugin'),analyze_impact_1=require(_0x25ff74(0x254)),analyzer_1=require('../ai/analyzer'),realtime_analyzer_1=require(_0x25ff74(0x2d0)),config_1=require(_0x25ff74(0x281));let realtimeAIEnabled=!![];function resolveFilePath(_0x29ec8b,_0x1b0976,_0x165d66){const _0x1268ba={_0x29889c:0x25e,_0x158e46:0x1fa,_0x598c9e:0x25e,_0x10b248:0x25d,_0x5430fa:0x22c},_0x10b490=_0x25ff74,_0x4cc7df={};_0x4cc7df[_0x10b490(_0x1268ba._0x29889c)]=_0x10b490(_0x1268ba._0x158e46),_0x4cc7df['sRBxc']=function(_0x41de51,_0x30c10d){return _0x41de51+_0x30c10d;};const _0xc7cd4e=_0x4cc7df,_0x2793de=_0x165d66||path['join'](_0x1b0976,_0xc7cd4e[_0x10b490(_0x1268ba._0x598c9e)]),_0x2ee69e=path['basename'](_0x2793de);if(path[_0x10b490(0x2db)](_0x29ec8b))return path['normalize'](_0x29ec8b);if(_0x29ec8b['startsWith'](_0x2ee69e+'/')||_0x29ec8b['startsWith'](_0xc7cd4e['sRBxc'](_0x2ee69e,'\x5c')))return path[_0x10b490(0x22c)](path[_0x10b490(_0x1268ba._0x10b248)](_0x1b0976,_0x29ec8b));return path[_0x10b490(_0x1268ba._0x5430fa)](path[_0x10b490(0x25d)](_0x2793de,_0x29ec8b));}function classifyFile(_0x4c271a){const _0x60b1c7={_0x5de102:0x202,_0x58eaf8:0x2f4,_0x4552ef:0x20b,_0x4caad0:0x2f9,_0x4d6411:0x2a4,_0x4143fa:0x248,_0x472ad0:0x244,_0x3a88e9:0x26d,_0x532502:0x2b7,_0xb89633:0x28f,_0x227ce1:0x1e7,_0x568a28:0x31e,_0x41fd32:0x313,_0x6d2af1:0x298,_0x550645:0x2d8,_0x1fb737:0x206,_0x2c0578:0x309,_0x383f2c:0x2dd,_0x452b2a:0x2f1,_0xb1c14c:0x2a3,_0x52112d:0x26c,_0x1daf15:0x30c,_0xdab2fb:0x22e,_0x396950:0x262,_0x40b2c5:0x2a5,_0x473456:0x271,_0x2f62fa:0x28e,_0xd947af:0x279,_0x2c1a66:0x31d,_0x3a6c22:0x226,_0x38db67:0x22b,_0x19bf65:0x1d9,_0x177885:0x305,_0x52ff39:0x203,_0x377346:0x241,_0x1f827a:0x26b,_0x3d5f84:0x232,_0x1ad11e:0x234,_0xadefce:0x2f2,_0x471fe8:0x270,_0x531b98:0x2b5,_0xf5a7bb:0x2f4,_0x4b4d4d:0x272,_0x5c3dfe:0x2b5,_0x51daf0:0x2b5,_0x3c737b:0x273,_0x59f6a0:0x2b5,_0x251c66:0x1fb,_0x4bdb25:0x1dc,_0x211d58:0x314,_0x32ecf9:0x234,_0x2c2eff:0x22d,_0x32e485:0x21c,_0x5e00d2:0x21e,_0x52de55:0x309,_0x24fbe8:0x234,_0x4ffe1d:0x30f,_0x533902:0x2f0,_0x110c7a:0x1df,_0x1ef135:0x2f3,_0x5d7342:0x2d6,_0xf57bfb:0x234,_0x13adb3:0x262,_0x1c2a9f:0x234,_0x5bf0e7:0x1cf,_0x229ddb:0x243,_0x59d887:0x2b5,_0x311781:0x1fd,_0x3b0383:0x234,_0x814aa6:0x234,_0x1405cd:0x1e0,_0x85f8cd:0x257,_0x55d3da:0x25c,_0x393fa3:0x261,_0x3e81a8:0x1d2},_0x54d56f=_0x25ff74,_0x5e8fe6={};_0x5e8fe6[_0x54d56f(0x2cb)]='web/public/',_0x5e8fe6['RsqFd']=_0x54d56f(_0x60b1c7._0x5de102),_0x5e8fe6[_0x54d56f(_0x60b1c7._0x58eaf8)]=_0x54d56f(0x21b),_0x5e8fe6['BndYK']='_dialog.dart',_0x5e8fe6['ibgzc']='_view.dart',_0x5e8fe6[_0x54d56f(0x1f5)]=_0x54d56f(0x322),_0x5e8fe6[_0x54d56f(0x2af)]='_tile.dart',_0x5e8fe6[_0x54d56f(0x1fb)]='_bottom_sheet.dart',_0x5e8fe6[_0x54d56f(_0x60b1c7._0x4552ef)]=_0x54d56f(_0x60b1c7._0x4caad0),_0x5e8fe6[_0x54d56f(0x2e9)]='.jsx',_0x5e8fe6[_0x54d56f(0x314)]=_0x54d56f(_0x60b1c7._0x4d6411),_0x5e8fe6[_0x54d56f(_0x60b1c7._0x4143fa)]=_0x54d56f(0x26a),_0x5e8fe6['yKbOD']=_0x54d56f(0x317),_0x5e8fe6['jjeOV']='_client.dart',_0x5e8fe6['LoUeZ']=_0x54d56f(_0x60b1c7._0x472ad0),_0x5e8fe6['agXcy']='server.ts',_0x5e8fe6[_0x54d56f(0x1ee)]=_0x54d56f(0x2bb),_0x5e8fe6['ufkhm']=_0x54d56f(_0x60b1c7._0x3a88e9),_0x5e8fe6[_0x54d56f(_0x60b1c7._0x532502)]='/entities/',_0x5e8fe6['uRRJj']=_0x54d56f(_0x60b1c7._0xb89633),_0x5e8fe6[_0x54d56f(_0x60b1c7._0x227ce1)]='_dto.dart',_0x5e8fe6['sZmhZ']=_0x54d56f(_0x60b1c7._0x568a28),_0x5e8fe6['ZDSIU']=_0x54d56f(0x2cf),_0x5e8fe6['JSCwS']='.entity.ts',_0x5e8fe6[_0x54d56f(0x311)]=_0x54d56f(0x1d3),_0x5e8fe6['UcgbA']=_0x54d56f(_0x60b1c7._0x41fd32),_0x5e8fe6['ZErfj']=_0x54d56f(_0x60b1c7._0x6d2af1),_0x5e8fe6[_0x54d56f(_0x60b1c7._0x550645)]='/notifiers/',_0x5e8fe6['mvWyC']=_0x54d56f(0x1ed),_0x5e8fe6[_0x54d56f(_0x60b1c7._0x1fb737)]='ai/',_0x5e8fe6[_0x54d56f(_0x60b1c7._0x2c0578)]=_0x54d56f(_0x60b1c7._0x383f2c),_0x5e8fe6['eQxiw']='_repository.dart',_0x5e8fe6['pUILj']=_0x54d56f(0x2e6),_0x5e8fe6['VXLGc']=_0x54d56f(0x1e8),_0x5e8fe6[_0x54d56f(_0x60b1c7._0x452b2a)]=_0x54d56f(_0x60b1c7._0xb1c14c),_0x5e8fe6['MqQku']='/theme/',_0x5e8fe6[_0x54d56f(0x30f)]='/router/',_0x5e8fe6['UdPXi']=_0x54d56f(_0x60b1c7._0x52112d),_0x5e8fe6[_0x54d56f(_0x60b1c7._0x1daf15)]=function(_0x20a3aa,_0x32560a){return _0x20a3aa===_0x32560a;},_0x5e8fe6[_0x54d56f(0x1df)]=_0x54d56f(_0x60b1c7._0xdab2fb),_0x5e8fe6[_0x54d56f(_0x60b1c7._0x396950)]='/helpers/',_0x5e8fe6['hdWiv']='/extensions/',_0x5e8fe6[_0x54d56f(_0x60b1c7._0x40b2c5)]='shared/',_0x5e8fe6['FeNNz']='languages/',_0x5e8fe6['bSZvc']='_util.dart',_0x5e8fe6['GMxdb']=_0x54d56f(_0x60b1c7._0x473456),_0x5e8fe6[_0x54d56f(0x1fe)]=_0x54d56f(0x229),_0x5e8fe6[_0x54d56f(_0x60b1c7._0x2f62fa)]='.util.ts',_0x5e8fe6[_0x54d56f(0x20e)]='UTIL',_0x5e8fe6[_0x54d56f(0x2f7)]=_0x54d56f(_0x60b1c7._0xd947af),_0x5e8fe6[_0x54d56f(_0x60b1c7._0x2c1a66)]='register',_0x5e8fe6['ZfSdl']='new',_0x5e8fe6[_0x54d56f(_0x60b1c7._0x3a6c22)]='show',_0x5e8fe6['XuAcN']=_0x54d56f(_0x60b1c7._0x38db67),_0x5e8fe6[_0x54d56f(0x20a)]='update',_0x5e8fe6[_0x54d56f(_0x60b1c7._0x19bf65)]='modify',_0x5e8fe6[_0x54d56f(0x257)]='change',_0x5e8fe6[_0x54d56f(_0x60b1c7._0x177885)]='_mock',_0x5e8fe6[_0x54d56f(_0x60b1c7._0x52ff39)]='/test/',_0x5e8fe6[_0x54d56f(_0x60b1c7._0x377346)]='DEV';const _0x1125a0=_0x5e8fe6,_0x2789b5=_0x4c271a[_0x54d56f(_0x60b1c7._0x1f827a)](),_0x1c884f=_0x2789b5[_0x54d56f(_0x60b1c7._0x3d5f84)]('/')['pop']()||'';let _0x1e5829='UTIL';const _0x453dad=(0x0,plugin_1['getPluginForFile'])(_0x4c271a),_0x3a35fb=_0x453dad?.['classifyLayer']?.(_0x4c271a);if(_0x3a35fb)_0x1e5829=_0x3a35fb;else{if(_0x2789b5[_0x54d56f(_0x60b1c7._0x1ad11e)](_0x54d56f(_0x60b1c7._0xadefce))||_0x2789b5[_0x54d56f(0x234)](_0x54d56f(0x2fc))||_0x2789b5[_0x54d56f(0x234)](_0x54d56f(0x24d))||_0x2789b5[_0x54d56f(0x234)]('/pages/')||_0x2789b5[_0x54d56f(0x234)](_0x1125a0[_0x54d56f(0x2cb)])||_0x2789b5['includes'](_0x1125a0[_0x54d56f(_0x60b1c7._0x471fe8)])||_0x1c884f[_0x54d56f(0x2b5)]('_screen.dart')||_0x1c884f[_0x54d56f(_0x60b1c7._0x531b98)](_0x54d56f(0x233))||_0x1c884f[_0x54d56f(0x2b5)](_0x1125a0[_0x54d56f(_0x60b1c7._0xf5a7bb)])||_0x1c884f[_0x54d56f(0x2b5)](_0x1125a0[_0x54d56f(_0x60b1c7._0x4b4d4d)])||_0x1c884f[_0x54d56f(_0x60b1c7._0x5c3dfe)](_0x1125a0['ibgzc'])||_0x1c884f[_0x54d56f(_0x60b1c7._0x51daf0)](_0x1125a0[_0x54d56f(0x1f5)])||_0x1c884f[_0x54d56f(0x2b5)](_0x1125a0[_0x54d56f(0x2af)])||_0x1c884f[_0x54d56f(0x2b5)](_0x54d56f(_0x60b1c7._0x3c737b))||_0x1c884f[_0x54d56f(_0x60b1c7._0x59f6a0)](_0x1125a0[_0x54d56f(_0x60b1c7._0x251c66)])||_0x1c884f['endsWith'](_0x1125a0['ItEdb'])||_0x1c884f['endsWith'](_0x54d56f(_0x60b1c7._0x4bdb25))||_0x1c884f['endsWith'](_0x1125a0['iwkXU'])||_0x1c884f[_0x54d56f(0x2b5)](_0x1125a0[_0x54d56f(_0x60b1c7._0x211d58)]))_0x1e5829='FE';else{if(_0x2789b5[_0x54d56f(_0x60b1c7._0x32ecf9)](_0x1125a0[_0x54d56f(_0x60b1c7._0x4143fa)])||_0x1c884f['includes'](_0x1125a0['yKbOD'])||_0x1c884f['endsWith']('_api.dart')||_0x1c884f['endsWith'](_0x1125a0['jjeOV'])||_0x1c884f['endsWith']('_remote.dart')||_0x1c884f['includes'](_0x54d56f(0x222))||_0x1c884f['includes'](_0x1125a0[_0x54d56f(0x323)])||_0x2789b5[_0x54d56f(0x234)]('web/server')||_0x1c884f[_0x54d56f(0x2b5)](_0x1125a0['agXcy'])||_0x1c884f[_0x54d56f(0x2b5)](_0x54d56f(_0x60b1c7._0x2c2eff)))_0x1e5829=_0x1125a0[_0x54d56f(0x1ee)];else{if(_0x2789b5[_0x54d56f(_0x60b1c7._0x1ad11e)](_0x1125a0['ufkhm'])||_0x2789b5['includes'](_0x1125a0[_0x54d56f(0x2b7)])||_0x1c884f[_0x54d56f(0x2b5)](_0x54d56f(_0x60b1c7._0x32e485))||_0x1c884f[_0x54d56f(0x2b5)](_0x1125a0['uRRJj'])||_0x1c884f['endsWith'](_0x1125a0['uKxBC'])||_0x1c884f[_0x54d56f(_0x60b1c7._0x531b98)](_0x1125a0['sZmhZ'])||_0x1c884f['endsWith'](_0x1125a0['ZDSIU'])||_0x1c884f['endsWith'](_0x1125a0[_0x54d56f(0x29b)])||_0x1c884f['endsWith'](_0x1125a0['iCcVS']))_0x1e5829='DB';else{if(_0x2789b5['includes'](_0x1125a0[_0x54d56f(_0x60b1c7._0x5e00d2)])||_0x2789b5[_0x54d56f(0x234)](_0x1125a0[_0x54d56f(0x293)])||_0x2789b5['includes']('/application/')||_0x2789b5['includes']('/providers/')||_0x2789b5[_0x54d56f(_0x60b1c7._0x1ad11e)](_0x1125a0[_0x54d56f(0x2d8)])||_0x2789b5[_0x54d56f(_0x60b1c7._0x1ad11e)](_0x1125a0['mvWyC'])||_0x2789b5['includes'](_0x1125a0['JuynJ'])||_0x2789b5['includes'](_0x1125a0[_0x54d56f(_0x60b1c7._0x52de55)])||_0x1c884f[_0x54d56f(0x2b5)](_0x1125a0['eQxiw'])||_0x1c884f['endsWith'](_0x1125a0['pUILj'])||_0x1c884f['endsWith']('_provider.dart')||_0x1c884f['endsWith'](_0x54d56f(0x215))||_0x1c884f[_0x54d56f(0x2b5)]('_controller.dart')||_0x1c884f[_0x54d56f(_0x60b1c7._0x531b98)](_0x1125a0[_0x54d56f(0x2a8)])||_0x1c884f['endsWith']('_state.dart')||_0x1c884f['endsWith'](_0x54d56f(0x2b3))||_0x1c884f['endsWith'](_0x1125a0[_0x54d56f(0x2f1)])||_0x1c884f['endsWith'](_0x54d56f(0x315))||_0x1c884f['endsWith']('.controller.ts'))_0x1e5829='BE';else{if(_0x2789b5[_0x54d56f(0x234)](_0x54d56f(0x22f))||_0x2789b5['includes'](_0x1125a0[_0x54d56f(0x1ea)])||_0x2789b5[_0x54d56f(_0x60b1c7._0x24fbe8)](_0x1125a0[_0x54d56f(_0x60b1c7._0x4ffe1d)])||_0x2789b5[_0x54d56f(0x234)](_0x54d56f(0x1e9))||_0x2789b5['startsWith'](_0x54d56f(_0x60b1c7._0x533902))||_0x1c884f['endsWith']('_config.dart')||_0x1c884f[_0x54d56f(0x2b5)](_0x1125a0['UdPXi'])||_0x1c884f['endsWith']('_constants.dart')||_0x1c884f[_0x54d56f(0x2b5)](_0x54d56f(0x306))||_0x1125a0['lDrTm'](_0x1c884f,'main.dart')||_0x1125a0[_0x54d56f(0x30c)](_0x1c884f,'index.ts')||_0x1c884f==='index.js'||_0x1c884f['endsWith']('.config.ts')||_0x1c884f['endsWith'](_0x1125a0[_0x54d56f(_0x60b1c7._0x110c7a)]))_0x1e5829=_0x54d56f(_0x60b1c7._0x1ef135);else(_0x2789b5['includes'](_0x54d56f(_0x60b1c7._0x5d7342))||_0x2789b5[_0x54d56f(_0x60b1c7._0xf57bfb)](_0x1125a0[_0x54d56f(_0x60b1c7._0x13adb3)])||_0x2789b5[_0x54d56f(0x234)](_0x1125a0[_0x54d56f(0x260)])||_0x2789b5[_0x54d56f(_0x60b1c7._0x1c2a9f)](_0x1125a0['RHjIW'])||_0x2789b5['includes'](_0x1125a0['FeNNz'])||_0x1c884f[_0x54d56f(0x2b5)](_0x1125a0[_0x54d56f(_0x60b1c7._0x5bf0e7)])||_0x1c884f['endsWith'](_0x54d56f(_0x60b1c7._0x229ddb))||_0x1c884f[_0x54d56f(_0x60b1c7._0x59d887)](_0x1125a0[_0x54d56f(_0x60b1c7._0x311781)])||_0x1c884f['endsWith'](_0x1125a0[_0x54d56f(0x1fe)])||_0x1c884f['endsWith'](_0x1125a0[_0x54d56f(0x28e)])||_0x1c884f['endsWith'](_0x54d56f(0x321)))&&(_0x1e5829=_0x1125a0['sMbcq']);}}}}}let _0x4f8942='X';if(_0x1c884f[_0x54d56f(0x234)](_0x1125a0['uSxmB'])||_0x1c884f['includes'](_0x54d56f(0x28b))||_0x1c884f[_0x54d56f(_0x60b1c7._0x3b0383)](_0x1125a0[_0x54d56f(_0x60b1c7._0x2c1a66)])||_0x1c884f['includes'](_0x1125a0['ZfSdl']))_0x4f8942='C';else{if(_0x1c884f[_0x54d56f(_0x60b1c7._0x32ecf9)]('list')||_0x1c884f[_0x54d56f(_0x60b1c7._0x814aa6)]('get')||_0x1c884f['includes']('fetch')||_0x1c884f['includes'](_0x1125a0['FunDp'])||_0x1c884f[_0x54d56f(0x234)](_0x54d56f(0x2fb))||_0x1c884f['includes'](_0x1125a0['XuAcN'])||_0x1c884f['includes']('_page'))_0x4f8942='R';else{if(_0x1c884f[_0x54d56f(0x234)](_0x1125a0[_0x54d56f(0x20a)])||_0x1c884f['includes'](_0x54d56f(_0x60b1c7._0x1405cd))||_0x1c884f['includes'](_0x1125a0['WpmwS'])||_0x1c884f['includes'](_0x1125a0[_0x54d56f(_0x60b1c7._0x85f8cd)]))_0x4f8942='U';else(_0x1c884f[_0x54d56f(_0x60b1c7._0x24fbe8)](_0x54d56f(_0x60b1c7._0x55d3da))||_0x1c884f['includes'](_0x54d56f(0x2d2)))&&(_0x4f8942='D');}}const _0x56a9e6=_0x1c884f[_0x54d56f(0x234)](_0x54d56f(0x30e))||_0x1c884f['includes'](_0x1125a0[_0x54d56f(0x305)])||_0x1c884f['includes'](_0x54d56f(_0x60b1c7._0x393fa3))||_0x2789b5['includes'](_0x1125a0['eqZgL'])?_0x1125a0[_0x54d56f(0x241)]:_0x54d56f(0x1f3),_0x519e06={};return _0x519e06[_0x54d56f(0x237)]=_0x1e5829,_0x519e06['action']=_0x4f8942,_0x519e06[_0x54d56f(_0x60b1c7._0x3e81a8)]=_0x56a9e6,_0x519e06;}const warningStore=[],MAX_WARNINGS=0x32;function addWarning(_0x4c0313){const _0x484dad={_0x2b2ce1:0x23b,_0x338646:0x2e8,_0x2a763c:0x204,_0x45a41f:0x2b9,_0x2ecc45:0x2df,_0x6033b2:0x1db,_0x3d89bd:0x2ec,_0x3e2c36:0x2c9,_0x43b7ab:0x223},_0x5ef87e=_0x25ff74,_0x5c55c1={};_0x5c55c1[_0x5ef87e(0x2e7)]=function(_0x3102b7,_0x5ede34){return _0x3102b7===_0x5ede34;},_0x5c55c1['VabyJ']=function(_0x124b1b,_0x42224d){return _0x124b1b>_0x42224d;};const _0x521762=_0x5c55c1;if(_0x521762['CjYCe'](_0x4c0313[_0x5ef87e(_0x484dad._0x2b2ce1)],'SAFE'))return;const _0x95ae6a={};_0x95ae6a['file']=_0x4c0313['file'],_0x95ae6a[_0x5ef87e(0x23b)]=_0x4c0313['riskLevel'],_0x95ae6a[_0x5ef87e(_0x484dad._0x338646)]=_0x4c0313['summary'],_0x95ae6a[_0x5ef87e(_0x484dad._0x2a763c)]=_0x4c0313['brokenImports'],_0x95ae6a[_0x5ef87e(0x289)]=_0x4c0313['sideEffects'],_0x95ae6a[_0x5ef87e(_0x484dad._0x45a41f)]=_0x4c0313[_0x5ef87e(0x2b9)],_0x95ae6a[_0x5ef87e(0x2df)]=_0x4c0313[_0x5ef87e(_0x484dad._0x2ecc45)],_0x95ae6a['affectedCount']=_0x4c0313[_0x5ef87e(_0x484dad._0x6033b2)]['length'],_0x95ae6a[_0x5ef87e(0x2ec)]=_0x4c0313[_0x5ef87e(_0x484dad._0x3d89bd)],_0x95ae6a['acknowledged']=![],warningStore[_0x5ef87e(_0x484dad._0x3e2c36)](_0x95ae6a);while(_0x521762['VabyJ'](warningStore['length'],MAX_WARNINGS))warningStore[_0x5ef87e(_0x484dad._0x43b7ab)]();}function getUnacknowledgedWarnings(){return warningStore['filter'](_0x520393=>!_0x520393['acknowledged']);}function acknowledgeWarnings(){let _0x43c538=0x0;for(const _0x27404d of warningStore){!_0x27404d['acknowledged']&&(_0x27404d['acknowledged']=!![],_0x43c538++);}return _0x43c538;}function getAllWarnings(){return[...warningStore];}function createWebServer(_0x1f2c40,_0x17fb62,_0x52a7d3,_0x1f4174,_0x412c65,_0x2793e9,_0x2ac834,_0x19e0f0,_0x48d88b,_0x213082,_0x37bb24){const _0x333633={_0x4c0aa6:0x318,_0x23082f:0x24a,_0x31336c:0x265,_0x3a33bb:0x329,_0x18b275:0x1d7,_0x1ec0e6:0x2f6,_0x4c1c16:0x2ce,_0x237f3d:0x2ee,_0x2e734a:0x255,_0x4d91b7:0x213,_0x12ef1b:0x286,_0x4b0d2f:0x27f,_0x2af5df:0x20d,_0x507de4:0x290,_0x672672:0x2b0,_0x3ce36b:0x2ad,_0x2e298d:0x2de,_0x9224cc:0x25d,_0x35f2a2:0x239,_0x22bec8:0x2c0,_0x3183cf:0x256,_0x8ec29f:0x2fa,_0x151f18:0x310,_0x8776bb:0x2c0},_0x44f5d7={_0x31f072:0x2a2,_0x58fa22:0x249,_0x41013e:0x22c,_0x35e23c:0x21f,_0x1fe156:0x269,_0x12f05e:0x242,_0x43c578:0x28c},_0x4d0086={_0x1d5c1e:0x2bd,_0x40532d:0x1f1,_0x12dcae:0x20f,_0x1d4ba9:0x27c,_0x3ddced:0x249,_0xcaf39f:0x282,_0x2c7d94:0x2a2},_0x237ed4={_0x5600f9:0x249,_0x35b94b:0x28c,_0x5dd0f1:0x1f0,_0x36c843:0x2e0,_0x2d7018:0x2a2,_0x512b1e:0x2fd,_0x33718c:0x23a,_0x176e33:0x249},_0x5a637b={_0x4f8f6a:0x28c,_0x159fac:0x249,_0x372cb5:0x251},_0x27f670={_0xfc9171:0x2a2,_0x54f950:0x28c,_0x1bc9c6:0x25f,_0x24a238:0x264,_0x4509d7:0x249},_0x35b777={_0x444201:0x23d,_0x53b234:0x1d6,_0x29a099:0x307,_0xd972d4:0x2c1,_0x2baed1:0x28d,_0x1e1643:0x28d,_0x11bc67:0x307,_0x1b5a13:0x1f0,_0x253e51:0x245,_0xc456f7:0x2aa,_0x411e6c:0x200,_0x141e22:0x327},_0x21de98={_0xd67b7e:0x31b,_0x37d396:0x23f,_0x53d072:0x253,_0x2960d1:0x249,_0x2389a8:0x28c,_0x5ae71e:0x288,_0x4fb661:0x256,_0x425cb2:0x288,_0x1b18bc:0x27d,_0x4c8075:0x28b,_0x21a13d:0x2e4,_0x21f7a0:0x22a,_0x55e058:0x307,_0x5388bc:0x307},_0x327ddc={_0x1a9e24:0x21a,_0x5c5a7c:0x212,_0x51f0fe:0x1d1,_0xd0fab0:0x295,_0x27759f:0x307,_0x4ba15d:0x256,_0xc00afc:0x1e5,_0x5d0aaa:0x288,_0x3a1769:0x28c},_0x595abd={_0x580ee3:0x28c,_0x4ae0e0:0x26e,_0x1267d9:0x27d,_0x11ebf4:0x2d5,_0x2b6ab2:0x307},_0x28b32a={_0x4838e6:0x2c7,_0x1e0937:0x30a,_0x18e423:0x249,_0x479fdd:0x28c},_0x964216={_0x239e0e:0x259,_0x459a60:0x224,_0x5739c4:0x212,_0x5e9a59:0x27d,_0x2216cc:0x2a2,_0x561d4b:0x249,_0x101a8c:0x256,_0x2d45fb:0x232,_0x933adf:0x2a7},_0x4636ed={_0x1db45d:0x249,_0x33f937:0x28c,_0x3c0550:0x2c5,_0x57fa8f:0x235},_0x59f1c4={_0xfc655e:0x2b6,_0x494109:0x297,_0x2d46cf:0x23e,_0x1e9ea2:0x27d,_0x404f80:0x303,_0x23abe2:0x2a2,_0x38ee75:0x2c8,_0x1d651e:0x2ca,_0x526c8b:0x211,_0xfe036b:0x217,_0x290981:0x264,_0x9d0079:0x249,_0x387beb:0x28c},_0x4ac42d={_0x596691:0x297,_0x522b67:0x23e,_0x1da5ff:0x224,_0x1fe588:0x301,_0xa013b0:0x28c},_0x928bd7={_0x35df44:0x1ff,_0x2c3135:0x24f,_0x4478c2:0x27d,_0x5c6a0a:0x307,_0x451dde:0x307,_0x1f7640:0x316,_0xed255d:0x2e4,_0x3ffcef:0x27d,_0x2803de:0x276,_0x3a73bf:0x224,_0x2e1e84:0x240,_0x568b5e:0x2e4,_0x552349:0x29a},_0x2d5e62={_0x1bedf7:0x31a,_0xa1a775:0x2a2,_0x376dea:0x2a0,_0x2d9dc8:0x28c},_0x2aed89={_0x4067f7:0x28c},_0x5a543a={_0x25e025:0x2a2,_0x21b8f2:0x2a6},_0x2f1e97={_0x378794:0x23c,_0x5ab7de:0x2c6},_0x51e971={_0x22d95d:0x1e4,_0x530f2b:0x25d,_0x56dd1d:0x288,_0x25ff49:0x217,_0x3aacf4:0x319,_0x3bceed:0x304,_0x5e985a:0x287,_0x5690e2:0x258,_0x2fdf21:0x328,_0x5a022f:0x246,_0x3d0eea:0x217,_0x2d22ce:0x319,_0x126e8f:0x264,_0x4eeace:0x2fe,_0x626ef1:0x1d4,_0x3b7332:0x319,_0x8083a:0x267},_0x46ea3c={_0x4ef677:0x1f7},_0x5c9dbd={_0x205414:0x249,_0x99dde6:0x2b4,_0x3aa37b:0x285,_0xa341c8:0x280,_0x57c1c1:0x2be,_0x49d94b:0x28b},_0x33e069={_0x349533:0x2a2,_0x2cd412:0x2a2,_0x7a3e86:0x2ea},_0x373a4b={_0x5279fb:0x252},_0x12bec0=_0x25ff74,_0x17cc43={'AUWft':function(_0x3ec248,_0x399684){return _0x3ec248===_0x399684;},'UNzOU':function(_0x58df14){return _0x58df14?.();},'Cpnot':_0x12bec0(0x2c8),'VVmQE':function(_0x610411,_0x15f4b8){return _0x610411===_0x15f4b8;},'PXxcW':_0x12bec0(_0x333633._0x4c0aa6),'zWWmi':_0x12bec0(0x1f2),'LVyxh':function(_0x15a7c2,_0x3a9bb0){return _0x15a7c2+_0x3a9bb0;},'dSufJ':function(_0x5c69eb,_0x2a707d,_0x7e46bf){return _0x5c69eb(_0x2a707d,_0x7e46bf);},'xBLBD':_0x12bec0(0x29e),'pGJMa':'added','CKEgI':function(_0x363596,_0x5e6f51){return _0x363596===_0x5e6f51;},'mvDIo':'boolean','IjggY':_0x12bec0(_0x333633._0x23082f),'ZgxyB':_0x12bec0(0x268),'kfjHB':function(_0x78907e){return _0x78907e();},'pNoHC':function(_0x4b8351,_0x3deff0){return _0x4b8351+_0x3deff0;},'sLaQF':function(_0x1bbaf4,_0x5bdb6b){return _0x1bbaf4>_0x5bdb6b;},'IwzeA':function(_0x542a34,_0x9a5525){return _0x542a34+_0x9a5525;},'wYdfX':'utf-8','LjFXp':function(_0x17fcac,_0x5ebca3){return _0x17fcac-_0x5ebca3;},'RRDAf':function(_0x29fc88,_0x5c1ac6){return _0x29fc88>_0x5c1ac6;},'mFFYI':_0x12bec0(0x2cc),'TRwzE':function(_0x10d3e2){return _0x10d3e2?.();},'tqqJn':function(_0x1c845c,_0x3949eb){return _0x1c845c&&_0x3949eb;},'QKFOB':'AI\x20analysis','NNNND':'Or\x20set\x20GEMINI_KEY\x20/\x20OPENAI_KEY\x20/\x20ANTHROPIC_KEY\x20to\x20use\x20ai_analyze\x20with\x20your\x20own\x20API\x20key.','dWHGC':_0x12bec0(0x2ed),'fRgQk':function(_0x3dc38f,_0xe15796,_0x45bf09,_0x383945){return _0x3dc38f(_0xe15796,_0x45bf09,_0x383945);},'CQemF':function(_0x4d2909,_0x5a9a37){return _0x4d2909<_0x5a9a37;},'FpURt':function(_0x3d8425,_0x4574b8){return _0x3d8425>=_0x4574b8;},'YrLMd':function(_0x115591){return _0x115591();},'CUUtA':function(_0x5e2b05,_0x20b9ee,_0x334d89,_0x1ed37c){return _0x5e2b05(_0x20b9ee,_0x334d89,_0x1ed37c);},'CxxxK':function(_0x37fe6a,_0x5a4990){return _0x37fe6a>=_0x5a4990;},'jUhPg':function(_0x389e1c,_0x36dc5b){return _0x389e1c(_0x36dc5b);},'HPpZX':function(_0x1e5cf9,_0x4fb3be){return _0x1e5cf9(_0x4fb3be);},'ttbzp':function(_0x355ba5,_0x5ce7c1){return _0x355ba5+_0x5ce7c1;},'kibft':_0x12bec0(_0x333633._0x31336c),'kLLbc':function(_0x1bba0a,_0x5ef692){return _0x1bba0a>=_0x5ef692;},'nRnFb':function(_0x4b4d31){return _0x4b4d31();},'LZicP':_0x12bec0(_0x333633._0x3a33bb),'sZjcO':function(_0x33901d){return _0x33901d();},'YFcoA':function(_0x1347cc,_0x21524b){return _0x1347cc||_0x21524b;},'YrVvc':_0x12bec0(0x1de),'MNFcF':_0x12bec0(_0x333633._0x18b275),'XhWBy':function(_0x2182d7,_0x88d6a6){return _0x2182d7>_0x88d6a6;},'SDmgo':function(_0x56f48){return _0x56f48();},'eAFyT':function(_0x51730c,_0x4ef21a){return _0x51730c(_0x4ef21a);},'MlrJg':_0x12bec0(_0x333633._0x1ec0e6),'ZfPoH':function(_0x51aa25,_0x2e71ef,_0x2b157c,_0x38eb70){return _0x51aa25(_0x2e71ef,_0x2b157c,_0x38eb70);},'ZLcoH':function(_0x4fc296,_0x265414){return _0x4fc296>_0x265414;},'CQkjv':function(_0x17dd90,_0x386b43){return _0x17dd90!==_0x386b43;},'MmqLe':_0x12bec0(0x218),'ECWmx':function(_0x58fca2){return _0x58fca2();},'sThTU':function(_0x5e4a72){return _0x5e4a72?.();},'ydxFQ':_0x12bec0(_0x333633._0x4c1c16),'znxOW':_0x12bec0(_0x333633._0x237f3d),'TAoGz':_0x12bec0(0x283),'RDZSt':'SYKE_LICENSE_KEY','SmQbY':function(_0x45d25a,_0x99f5d8){return _0x45d25a>_0x99f5d8;},'yPDNL':function(_0x19b3c6,_0xd39a37){return _0x19b3c6+_0xd39a37;},'XaWqz':'····','UCZHN':function(_0x3cf878){return _0x3cf878();},'JSlVy':function(_0x2a8333){return _0x2a8333();},'SZuXE':'free','rUVEl':'default','lGwoE':_0x12bec0(0x1f0),'LmwFy':_0x12bec0(0x23a),'rnpvb':_0x12bec0(0x263),'Hzbxk':_0x12bec0(_0x333633._0x2e734a),'wOEzZ':_0x12bec0(0x1fc),'TJvmR':'provider\x20must\x20be\x20gemini,\x20openai,\x20anthropic,\x20or\x20auto','NmSHd':function(_0x1afb00,_0xa1fc5f){return _0x1afb00(_0xa1fc5f);},'WJxEq':function(_0x310c71,_0xde2a72){return _0x310c71===_0xde2a72;},'ItDvO':_0x12bec0(_0x333633._0x4d91b7),'PbyAi':_0x12bec0(0x29c),'JXutd':'pom.xml','LuNbm':'build.gradle','ngXaO':_0x12bec0(_0x333633._0x12ef1b),'OjBek':'Makefile','MxsUh':'pyproject.toml','UvQjK':_0x12bec0(_0x333633._0x4b0d2f),'IZGFf':function(_0x5d6ca1){return _0x5d6ca1();},'rHtJr':function(_0x4a9d9d,_0x171429){return _0x4a9d9d!==_0x171429;},'EGEbM':'Switch\x20project\x20not\x20supported','ucxvM':_0x12bec0(_0x333633._0x2af5df),'oxLpk':'/api/toggle-realtime-ai','pylDX':_0x12bec0(0x2d7),'VqEtX':'/api/file-content/*splat','RIwvs':'/api/simulate-delete/*splat','GrVUL':_0x12bec0(_0x333633._0x507de4),'fyoto':'/api/project-info','UVFvI':'/api/set-license-key','gRcsw':'/api/set-ai-provider','TKuHM':_0x12bec0(_0x333633._0x672672)},_0x269298=(0x0,express_1[_0x12bec0(_0x333633._0x3ce36b)])();_0x269298[_0x12bec0(_0x333633._0x2e298d)](express_1[_0x12bec0(0x2ad)]['json']());function _0x3fc95d(){const _0x364256=_0x12bec0,_0x4b84d0=_0x2793e9?.();return _0x17cc43['AUWft'](_0x4b84d0?.[_0x364256(0x2a1)],'pro')||_0x17cc43[_0x364256(0x22a)](_0x4b84d0?.[_0x364256(0x2a1)],'pro_trial');}const _0x2c684b=path[_0x12bec0(_0x333633._0x9224cc)](__dirname,'public');_0x269298[_0x12bec0(0x2de)](express_1[_0x12bec0(_0x333633._0x3ce36b)][_0x12bec0(_0x333633._0x35f2a2)](_0x2c684b));const _0x3cd375=new Set();let _0xf59b2a=_0x17fb62||null;function _0xb4e422(_0x4093dd,_0x5f4362){const _0x98ea5c=_0x12bec0,_0x3bc853=_0x98ea5c(_0x373a4b._0x5279fb)+_0x4093dd+'\x0adata:\x20'+JSON[_0x98ea5c(0x2ae)](_0x5f4362)+'\x0a\x0a';for(const _0x141299 of _0x3cd375){try{_0x141299['write'](_0x3bc853);}catch(_0x111b86){_0x3cd375[_0x98ea5c(0x25c)](_0x141299);}}}function _0x2a2920(_0x26de0c){const _0x4cf64f=_0x12bec0,_0x16b36e=_0x17cc43['UNzOU'](_0x2793e9),_0x184768=_0x17cc43[_0x4cf64f(0x242)];if(_0x16b36e?.[_0x4cf64f(0x2a2)]){const _0x18a219={};return _0x18a219[_0x4cf64f(_0x33e069._0x349533)]=_0x26de0c+':\x20'+_0x16b36e['error'],_0x18a219['requiresPro']=!![],_0x18a219['upgrade']=_0x184768,_0x18a219;}if(_0x17cc43['VVmQE'](_0x16b36e?.['source'],'online')&&_0x16b36e?.['expiresAt']){const _0x4ef00f={};return _0x4ef00f[_0x4cf64f(_0x33e069._0x2cd412)]=_0x4cf64f(_0x33e069._0x7a3e86)+_0x184768,_0x4ef00f[_0x4cf64f(0x2f8)]=!![],_0x4ef00f[_0x4cf64f(0x269)]=_0x184768,_0x4ef00f;}const _0x5bcf91={};return _0x5bcf91[_0x4cf64f(0x2a2)]=_0x26de0c+'\x20requires\x20SYKE\x20Pro.\x20Set\x20SYKE_LICENSE_KEY\x20or\x20sign\x20up\x20at\x20https://syke.cloud',_0x5bcf91['requiresPro']=!![],_0x5bcf91[_0x4cf64f(0x269)]=_0x184768,_0x5bcf91;}_0x269298['get']('/api/events',(_0x5da6df,_0x242751)=>{const _0x538b0f={_0x421043:0x2a2},_0x4352ee=_0x12bec0;if(!_0x3fc95d()){_0x242751[_0x4352ee(_0x5c9dbd._0x205414)](0x193)['json'](_0x2a2920('Real-time\x20monitoring'));return;}const _0x600844={};_0x600844['Content-Type']=_0x4352ee(0x2b1),_0x600844[_0x4352ee(_0x5c9dbd._0x99dde6)]=_0x4352ee(0x2a9),_0x600844['Connection']=_0x17cc43[_0x4352ee(_0x5c9dbd._0x3aa37b)],_0x600844[_0x4352ee(_0x5c9dbd._0xa341c8)]='*',_0x242751['writeHead'](0xc8,_0x600844);const _0x995fb8={};_0x995fb8['clients']=_0x3cd375['size']+0x1,_0x995fb8[_0x4352ee(_0x5c9dbd._0x57c1c1)]=_0xf59b2a?.['size']||0x0,_0x242751['write']('event:\x20connected\x0adata:\x20'+JSON['stringify'](_0x995fb8)+'\x0a\x0a'),_0x3cd375[_0x4352ee(_0x5c9dbd._0x49d94b)](_0x242751),console['error']('[syke:sse]\x20Client\x20connected\x20('+_0x3cd375['size']+'\x20total)'),_0x5da6df['on'](_0x17cc43[_0x4352ee(0x2f5)],()=>{const _0x2423cf=_0x4352ee;_0x3cd375['delete'](_0x242751),console[_0x2423cf(_0x538b0f._0x421043)]('[syke:sse]\x20Client\x20disconnected\x20('+_0x3cd375['size']+_0x2423cf(0x236));});});function _0x43b52e(_0x455f6a){const _0x4e3cb8={_0x160b48:0x2c4,_0x47b094:0x276,_0x2b18d4:0x1d5,_0x14e399:0x2d3,_0x11d937:0x307,_0x5455bb:0x1e6,_0x34d1c0:0x307},_0x103e35=_0x12bec0,_0x3363ce={'FTFdj':function(_0x2f388a,_0x38c2eb){return _0x17cc43['LVyxh'](_0x2f388a,_0x38c2eb);},'IJIuT':function(_0x48dd8c,_0x3a5c6f,_0x215104){return _0x17cc43['dSufJ'](_0x48dd8c,_0x3a5c6f,_0x215104);},'GUvBT':function(_0x3583a8){return _0x17cc43['UNzOU'](_0x3583a8);},'FDMeF':function(_0x518125){return _0x518125();},'xCtOf':_0x17cc43[_0x103e35(_0x2f1e97._0x378794)],'gusdO':'analysis-result','bcGvi':function(_0x52aa19,_0x12f5f5){return _0x52aa19===_0x12f5f5;},'xfDZc':_0x17cc43[_0x103e35(_0x2f1e97._0x5ab7de)],'VYQDq':'graph-rebuild','kfxUM':function(_0x3ce3a1,_0x3d1412){const _0x52d25b=_0x103e35;return _0x17cc43[_0x52d25b(_0x46ea3c._0x4ef677)](_0x3ce3a1,_0x3d1412);}},_0x2704d8=_0x1f2c40();_0x455f6a['setGraph'](_0x2704d8),_0x455f6a['on']('graph-updated',_0xd31154=>{const _0x5d450d=_0x103e35;_0xd31154['edgesChanged']&&(console[_0x5d450d(0x2a2)](_0x3363ce['FTFdj']('[syke:sse]\x20Graph\x20incrementally\x20updated:\x20'+_0xd31154[_0x5d450d(_0x4e3cb8._0x160b48)]+'\x20','(+'+_0xd31154[_0x5d450d(0x2d3)][_0x5d450d(0x307)]+'/-'+_0xd31154[_0x5d450d(0x1e6)]['length']+'\x20edges,\x20')+(_0xd31154[_0x5d450d(0x31c)]['length']+_0x5d450d(0x2da))),_0x3363ce[_0x5d450d(0x2fe)](_0xb4e422,_0x5d450d(0x30b),{'file':path[_0x5d450d(_0x4e3cb8._0x47b094)](_0x3363ce[_0x5d450d(_0x4e3cb8._0x2b18d4)](_0x1f2c40)['sourceDir'],_0xd31154[_0x5d450d(0x2c4)])['replace'](/\\/g,'/'),'addedEdges':_0xd31154[_0x5d450d(_0x4e3cb8._0x14e399)][_0x5d450d(_0x4e3cb8._0x11d937)],'removedEdges':_0xd31154[_0x5d450d(_0x4e3cb8._0x5455bb)][_0x5d450d(_0x4e3cb8._0x34d1c0)],'affectedFiles':_0xd31154['affectedFiles'][_0x5d450d(0x307)]}));}),_0x455f6a['on']('change',async _0x4c517e=>{const _0x145e65=_0x103e35,_0xaabcc4=_0x3363ce[_0x145e65(_0x51e971._0x22d95d)](_0x1f2c40),_0x534445=path['normalize'](path[_0x145e65(_0x51e971._0x530f2b)](_0xaabcc4['sourceDir'],_0x4c517e['relativePath'])),_0x5539a8=_0xaabcc4[_0x145e65(_0x51e971._0x56dd1d)]['get'](_0x534445)||[],_0x27135e=_0xaabcc4['forward'][_0x145e65(0x256)](_0x534445)||[],_0x2ecdd6=[...new Set([..._0x5539a8,..._0x27135e])][_0x145e65(0x24f)](_0x2aeb1a=>path[_0x145e65(0x276)](_0xaabcc4[_0x145e65(0x224)],_0x2aeb1a)['replace'](/\\/g,'/')),_0x2fa848=_0x4c517e[_0x145e65(0x287)][_0x145e65(0x2ef)](0x0,0x64)['map'](_0x4c998c=>({'line':_0x4c998c['line'],'type':_0x4c998c['type'],'old':_0x4c998c[_0x145e65(0x2e1)],'new':_0x4c998c['new']})),_0x21ef11=_0x4c517e['newContent']?_0x4c517e['newContent']['split']('\x0a')[_0x145e65(0x2ef)](0x0,0x12c):[],_0x3594b5={};_0x3594b5[_0x145e65(_0x51e971._0x25ff49)]=_0x4c517e[_0x145e65(_0x51e971._0x3aacf4)],_0x3594b5['type']=_0x4c517e['type'],_0x3594b5[_0x145e65(_0x51e971._0x3bceed)]=_0x4c517e[_0x145e65(_0x51e971._0x5e985a)]['length'],_0x3594b5[_0x145e65(0x287)]=_0x2fa848,_0x3594b5['newContent']=_0x21ef11,_0x3594b5['connectedNodes']=_0x2ecdd6,_0x3594b5['timestamp']=_0x4c517e[_0x145e65(0x2ec)],_0xb4e422(_0x3363ce['xCtOf'],_0x3594b5);if(_0x3fc95d()&&realtimeAIEnabled){const _0x161579={};_0x161579['file']=_0x4c517e['relativePath'],_0x3363ce['IJIuT'](_0xb4e422,'analysis-start',_0x161579);try{const _0x30bcab=await(0x0,realtime_analyzer_1[_0x145e65(_0x51e971._0x5690e2)])(_0x4c517e,_0xaabcc4,_0x125957=>_0xf59b2a?.['getFileByRelPath'](_0x125957)??null);_0x3363ce['IJIuT'](_0xb4e422,_0x3363ce['gusdO'],_0x30bcab),addWarning(_0x30bcab);if(_0x4c517e[_0x145e65(0x328)]==='added'||_0x4c517e[_0x145e65(_0x51e971._0x2fdf21)]==='deleted'){const _0x8940c9={};_0x8940c9[_0x145e65(0x24c)]=_0x4c517e['type'],_0x8940c9['file']=_0x4c517e['relativePath'],_0x3363ce[_0x145e65(0x2fe)](_0xb4e422,_0x145e65(_0x51e971._0x5a022f),_0x8940c9);}}catch(_0x4f7c51){const _0x55403e={};_0x55403e[_0x145e65(_0x51e971._0x3d0eea)]=_0x4c517e[_0x145e65(_0x51e971._0x2d22ce)],_0x55403e[_0x145e65(0x2a2)]=_0x4f7c51[_0x145e65(_0x51e971._0x126e8f)],_0x3363ce[_0x145e65(_0x51e971._0x4eeace)](_0xb4e422,_0x145e65(_0x51e971._0x626ef1),_0x55403e);}}else{if(_0x3363ce[_0x145e65(0x1d5)](_0x3fc95d)&&!realtimeAIEnabled){console['error']('[syke:ai]\x20Real-time\x20AI\x20disabled\x20—\x20skipping\x20analysis\x20for\x20'+_0x4c517e[_0x145e65(_0x51e971._0x3b7332)]);if(_0x3363ce['bcGvi'](_0x4c517e['type'],_0x3363ce['xfDZc'])||_0x4c517e[_0x145e65(0x328)]===_0x145e65(0x267)){const _0x68947a={};_0x68947a[_0x145e65(0x24c)]=_0x4c517e[_0x145e65(_0x51e971._0x2fdf21)],_0x68947a[_0x145e65(0x217)]=_0x4c517e['relativePath'],_0xb4e422(_0x3363ce['VYQDq'],_0x68947a);}}else{if(_0x3363ce['kfxUM'](_0x4c517e[_0x145e65(0x328)],_0x145e65(0x300))||_0x3363ce['kfxUM'](_0x4c517e['type'],_0x145e65(_0x51e971._0x8083a))){const _0x9022c1={};_0x9022c1['reason']=_0x4c517e['type'],_0x9022c1[_0x145e65(0x217)]=_0x4c517e['relativePath'],_0xb4e422(_0x3363ce[_0x145e65(0x2ff)],_0x9022c1);}}}});}if(_0xf59b2a)_0x43b52e(_0xf59b2a);function _0x59686c(_0x179c95){const _0x343cd9=_0x12bec0;_0xf59b2a=_0x179c95,_0x43b52e(_0x179c95),console[_0x343cd9(_0x5a543a._0x25e025)](_0x343cd9(0x214)+_0x179c95['size']+_0x343cd9(_0x5a543a._0x21b8f2));}_0x269298['get'](_0x12bec0(0x2b2),(_0x2e5036,_0x226bad)=>{const _0x318e99=_0x12bec0;if(!_0xf59b2a){const _0x4d94f1={};return _0x4d94f1['enabled']=![],_0x226bad['json'](_0x4d94f1);}const _0x2c2a98={};_0x2c2a98[_0x318e99(0x2e2)]=!![],_0x2c2a98['fileCount']=_0xf59b2a['size'],_0x2c2a98['totalLines']=_0xf59b2a['totalLines'],_0x2c2a98['sseClients']=_0x3cd375['size'],_0x226bad[_0x318e99(_0x2aed89._0x4067f7)](_0x2c2a98);}),_0x269298[_0x12bec0(0x2c0)](_0x17cc43[_0x12bec0(0x274)],(_0x2ee0e2,_0x3f4cc0)=>{const _0x2c1606=_0x12bec0,{enabled:_0xcdfb4a}=_0x2ee0e2[_0x2c1606(0x275)];typeof _0xcdfb4a===_0x17cc43[_0x2c1606(_0x2d5e62._0x1bedf7)]?realtimeAIEnabled=_0xcdfb4a:realtimeAIEnabled=!realtimeAIEnabled;console[_0x2c1606(_0x2d5e62._0xa1a775)]('[syke:ai]\x20Real-time\x20AI\x20analysis\x20'+(realtimeAIEnabled?_0x17cc43[_0x2c1606(_0x2d5e62._0x376dea)]:_0x17cc43['ZgxyB']));const _0x5e2388={};_0x5e2388[_0x2c1606(0x2cd)]=realtimeAIEnabled,_0x3f4cc0[_0x2c1606(_0x2d5e62._0x2d9dc8)](_0x5e2388);}),_0x269298['get'](_0x12bec0(0x2dc),(_0x2b5c09,_0xbddc0e)=>{const _0x4fe275={_0x39b8ad:0x307},_0x383c39=_0x12bec0,_0x5c8c65={};_0x5c8c65[_0x383c39(0x2ba)]=function(_0x25b1a9,_0x5d14ad){return _0x25b1a9===_0x5d14ad;};const _0x4fc93e=_0x5c8c65,_0x27d43e=_0x17cc43[_0x383c39(0x297)](_0x1f2c40),_0x1f062b=_0x3fc95d(),_0x342600=0x32,_0x161ceb=[],_0x357cea=[],_0x180081=new Map(),_0x10b7ec=[..._0x27d43e[_0x383c39(0x212)]][_0x383c39(_0x928bd7._0x35df44)](_0x3a059a=>{const _0x274b07=_0x383c39,_0x63765e=_0x27d43e['reverse'][_0x274b07(0x256)](_0x3a059a);return!_0x63765e||_0x4fc93e['DgiSP'](_0x63765e[_0x274b07(_0x4fe275._0x39b8ad)],0x0);}),_0x4463f3=_0x10b7ec[_0x383c39(_0x928bd7._0x2c3135)](_0x2509b6=>[_0x2509b6,0x0]);while(_0x4463f3[_0x383c39(0x307)]>0x0){const [_0x14ba03,_0x33ab3c]=_0x4463f3['shift']();if(_0x180081[_0x383c39(_0x928bd7._0x4478c2)](_0x14ba03))continue;_0x180081['set'](_0x14ba03,_0x33ab3c);const _0x9f90ad=_0x27d43e[_0x383c39(0x29f)]['get'](_0x14ba03)||[];for(const _0xd4c654 of _0x9f90ad){if(!_0x180081[_0x383c39(_0x928bd7._0x4478c2)](_0xd4c654))_0x4463f3['push']([_0xd4c654,_0x17cc43['pNoHC'](_0x33ab3c,0x1)]);}}const _0x5d1d83=[..._0x27d43e[_0x383c39(0x212)]]['sort'](),_0x23dcaf=_0x1f062b?_0x5d1d83:_0x5d1d83[_0x383c39(0x2ef)](0x0,_0x342600),_0x1479e5=new Set(_0x23dcaf);for(const _0xffd4ad of _0x23dcaf){const _0x36cdd3=path['relative'](_0x27d43e[_0x383c39(0x224)],_0xffd4ad)['replace'](/\\/g,'/'),_0x49753b=_0x27d43e['reverse']['get'](_0xffd4ad)||[],_0x546e16=_0x49753b[_0x383c39(_0x928bd7._0x5c6a0a)],_0x28c4d5=(0x0,analyze_impact_1['classifyRisk'])(_0x546e16),_0x515f88=_0x36cdd3['split']('/'),_0x32ddb8=_0x17cc43[_0x383c39(0x30a)](_0x515f88[_0x383c39(_0x928bd7._0x451dde)],0x1)?_0x17cc43[_0x383c39(0x312)](_0x515f88[0x0]+'/',_0x515f88[0x1]):_0x515f88[0x0],{layer:_0x1efb2f,action:_0x5d6e77,env:_0x15bd66}=classifyFile(_0x36cdd3);let _0x5578ce=0x0;try{const _0x73e447=fs['readFileSync'](_0xffd4ad,_0x17cc43[_0x383c39(_0x928bd7._0x1f7640)]);_0x5578ce=_0x73e447['split']('\x0a')['length'];}catch(_0x2779fa){}const _0x16c7c9=(_0x27d43e[_0x383c39(0x29f)]['get'](_0xffd4ad)||[])['length'],_0x263db5=_0x180081['get'](_0xffd4ad)??0x0;_0x161ceb[_0x383c39(_0x928bd7._0xed255d)]({'data':{'id':_0x36cdd3,'label':_0x515f88[_0x17cc43['LjFXp'](_0x515f88['length'],0x1)],'fullPath':_0x36cdd3,'riskLevel':_0x28c4d5,'dependentCount':_0x546e16,'lineCount':_0x5578ce,'importsCount':_0x16c7c9,'depth':_0x263db5,'group':_0x32ddb8,'layer':_0x1efb2f,'action':_0x5d6e77,'env':_0x15bd66}});}for(const [_0x3f1e6b,_0x3af567]of _0x27d43e['forward']){if(!_0x1479e5[_0x383c39(_0x928bd7._0x3ffcef)](_0x3f1e6b))continue;const _0x5842ea=path['relative'](_0x27d43e['sourceDir'],_0x3f1e6b)['replace'](/\\/g,'/');for(const _0x52bfa7 of _0x3af567){if(!_0x1479e5[_0x383c39(0x27d)](_0x52bfa7))continue;const _0x4a2892=path[_0x383c39(_0x928bd7._0x2803de)](_0x27d43e[_0x383c39(_0x928bd7._0x3a73bf)],_0x52bfa7)['replace'](/\\/g,'/'),_0x44f239={};_0x44f239[_0x383c39(0x209)]=_0x5842ea,_0x44f239[_0x383c39(_0x928bd7._0x2e1e84)]=_0x4a2892;const _0x38de89={};_0x38de89['data']=_0x44f239,_0x357cea[_0x383c39(_0x928bd7._0x568b5e)](_0x38de89);}}_0xbddc0e['json']({'nodes':_0x161ceb,'edges':_0x357cea,'totalFiles':_0x27d43e[_0x383c39(0x212)][_0x383c39(_0x928bd7._0x552349)],'limited':!_0x1f062b&&_0x17cc43['RRDAf'](_0x27d43e[_0x383c39(0x212)]['size'],_0x342600)});}),_0x269298['get']('/api/impact/*splat',async(_0x4a3c30,_0x301939)=>{const _0x2bbc8c=_0x12bec0,_0x3575d1=_0x4a3c30['params']['splat'],_0x5b3513=Array['isArray'](_0x3575d1)?_0x3575d1['join']('/'):_0x3575d1;if(!_0x5b3513){const _0x542e7a={};return _0x542e7a['error']=_0x17cc43['mFFYI'],_0x301939['status'](0x190)[_0x2bbc8c(0x28c)](_0x542e7a);}const _0x1a271a=_0x17cc43[_0x2bbc8c(_0x4ac42d._0x596691)](_0x1f2c40),_0x4f38e5=resolveFilePath(_0x5b3513,_0x1a271a[_0x2bbc8c(_0x4ac42d._0x522b67)],_0x1a271a[_0x2bbc8c(_0x4ac42d._0x1da5ff)]);if(!_0x1a271a['files'][_0x2bbc8c(0x27d)](_0x4f38e5)){const _0x519f8e={};return _0x519f8e['error']=_0x2bbc8c(_0x4ac42d._0x1fe588)+_0x5b3513,_0x301939['status'](0x194)[_0x2bbc8c(_0x4ac42d._0xa013b0)](_0x519f8e);}const _0x272d37=await(0x0,analyze_impact_1['analyzeImpact'])(_0x4f38e5,_0x1a271a);_0x301939['json'](_0x272d37);}),_0x269298[_0x12bec0(_0x333633._0x22bec8)]('/api/ai-analyze',async(_0x4446e3,_0x5e6d8b)=>{const _0xce2c61=_0x12bec0,_0x138fb9=_0x3fc95d(),_0x4e442f=_0x17cc43[_0xce2c61(0x27e)](_0x2ac834)||![];if(_0x17cc43['tqqJn'](!_0x138fb9,!_0x4e442f))return _0x5e6d8b['status'](0x193)['json']({..._0x2a2920(_0x17cc43[_0xce2c61(_0x59f1c4._0xfc655e)]),'hint':_0x17cc43['NNNND']});const {file:_0x3ce830}=_0x4446e3['body'];if(!_0x3ce830){const _0x272ef6={};return _0x272ef6['error']=_0x17cc43['dWHGC'],_0x5e6d8b[_0xce2c61(0x249)](0x190)['json'](_0x272ef6);}const _0x4a3c89=_0x17cc43[_0xce2c61(_0x59f1c4._0x494109)](_0x1f2c40),_0x53aedb=_0x17cc43[_0xce2c61(0x2d1)](resolveFilePath,_0x3ce830,_0x4a3c89[_0xce2c61(_0x59f1c4._0x2d46cf)],_0x4a3c89['sourceDir']);if(!_0x4a3c89['files'][_0xce2c61(_0x59f1c4._0x1e9ea2)](_0x53aedb)){const _0x43c6ec={};return _0x43c6ec['error']='File\x20not\x20found\x20in\x20graph:\x20'+_0x3ce830,_0x5e6d8b[_0xce2c61(0x249)](0x194)[_0xce2c61(0x28c)](_0x43c6ec);}if(!_0x138fb9){const _0x3ebdda=[..._0x4a3c89['files']][_0xce2c61(_0x59f1c4._0x404f80)](),_0xeac536=_0x3ebdda['indexOf'](_0x53aedb);if(_0x17cc43['CQemF'](_0xeac536,0x0)||_0x17cc43['FpURt'](_0xeac536,0x32)){const _0x556655={};return _0x556655[_0xce2c61(_0x59f1c4._0x23abe2)]=_0xce2c61(0x24b),_0x556655[_0xce2c61(0x269)]=_0xce2c61(_0x59f1c4._0x38ee75),_0x5e6d8b[_0xce2c61(0x249)](0x193)['json'](_0x556655);}}const _0x4072a9=await(0x0,analyze_impact_1[_0xce2c61(_0x59f1c4._0x1d651e)])(_0x53aedb,_0x4a3c89);try{const _0x419909=await(0x0,analyzer_1[_0xce2c61(_0x59f1c4._0x526c8b)])(_0x53aedb,_0x4072a9,_0x4a3c89),_0x38e134=!_0x138fb9&&_0x4a3c89[_0xce2c61(0x212)][_0xce2c61(0x29a)]>0x32,_0x2a8418={};_0x2a8418[_0xce2c61(_0x59f1c4._0xfe036b)]=_0x4072a9[_0xce2c61(0x319)],_0x2a8418['analysis']=_0x419909,_0x2a8418['partial']=_0x38e134,_0x5e6d8b['json'](_0x2a8418);}catch(_0x18682d){const _0x42450d={};_0x42450d['error']=_0x18682d[_0xce2c61(_0x59f1c4._0x290981)]||_0xce2c61(0x296),_0x5e6d8b[_0xce2c61(_0x59f1c4._0x9d0079)](0x1f4)[_0xce2c61(_0x59f1c4._0x387beb)](_0x42450d);}}),_0x269298[_0x12bec0(0x256)](_0x17cc43['pylDX'],(_0x30b3a9,_0xd7610)=>{const _0x4ad008=_0x12bec0;if(!_0x3fc95d())return _0xd7610[_0x4ad008(_0x4636ed._0x1db45d)](0x193)[_0x4ad008(_0x4636ed._0x33f937)](_0x2a2920(_0x4ad008(_0x4636ed._0x3c0550)));const _0x1ac1df=parseInt(_0x30b3a9['query'][_0x4ad008(_0x4636ed._0x57fa8f)])||0xa,_0x306299=_0x17cc43['YrLMd'](_0x1f2c40),_0x2b8d04=(0x0,analyze_impact_1[_0x4ad008(0x325)])(_0x306299,_0x1ac1df),_0x129c0a={};_0x129c0a['hubs']=_0x2b8d04,_0x129c0a[_0x4ad008(0x230)]=_0x306299[_0x4ad008(0x212)]['size'],_0x129c0a['limited']=![],_0x129c0a[_0x4ad008(0x2a1)]='pro',_0xd7610['json'](_0x129c0a);}),_0x269298['post']('/api/connected-code',(_0x1dfb79,_0x4d1c4d)=>{const _0x4033c1=_0x12bec0,{file:_0xb6ead6,maxFiles:maxFiles=0x6,maxLinesPerFile:maxLinesPerFile=0x50}=_0x1dfb79['body'],_0x525006={};_0x525006[_0x4033c1(0x2a2)]='file\x20required';if(!_0xb6ead6)return _0x4d1c4d['status'](0x190)[_0x4033c1(0x28c)](_0x525006);const _0x27e7ff=_0x17cc43[_0x4033c1(0x247)](_0x1f2c40),_0x174b3f=_0x17cc43[_0x4033c1(_0x964216._0x239e0e)](resolveFilePath,_0xb6ead6,_0x27e7ff['projectRoot'],_0x27e7ff[_0x4033c1(_0x964216._0x459a60)]),_0x4c131f=_0x2c3daa=>path[_0x4033c1(0x276)](_0x27e7ff['sourceDir'],_0x2c3daa)[_0x4033c1(0x302)](/\\/g,'/');if(!_0x27e7ff[_0x4033c1(_0x964216._0x5739c4)][_0x4033c1(_0x964216._0x5e9a59)](_0x174b3f)){const _0x33ba01={};return _0x33ba01[_0x4033c1(_0x964216._0x2216cc)]='File\x20not\x20found:\x20'+_0xb6ead6,_0x4d1c4d[_0x4033c1(_0x964216._0x561d4b)](0x194)[_0x4033c1(0x28c)](_0x33ba01);}const _0x472d49=[_0x174b3f],_0x6b61dc=_0x27e7ff[_0x4033c1(0x288)][_0x4033c1(_0x964216._0x101a8c)](_0x174b3f)||[],_0x574898=_0x27e7ff['forward'][_0x4033c1(_0x964216._0x101a8c)](_0x174b3f)||[];for(const _0x4bd6e0 of[..._0x6b61dc,..._0x574898]){if(!_0x472d49['includes'](_0x4bd6e0))_0x472d49['push'](_0x4bd6e0);if(_0x17cc43['CxxxK'](_0x472d49[_0x4033c1(0x307)],maxFiles))break;}const _0x5d3eb9=[];for(const _0x257c06 of _0x472d49){try{const _0x412d88=fs['readFileSync'](_0x257c06,_0x17cc43['wYdfX']),_0x54fa99=_0x412d88[_0x4033c1(_0x964216._0x2d45fb)]('\x0a'),_0x34e3d5=_0x17cc43['jUhPg'](_0x4c131f,_0x257c06),{layer:_0x37f637}=_0x17cc43[_0x4033c1(_0x964216._0x933adf)](classifyFile,_0x34e3d5);_0x5d3eb9['push']({'path':_0x34e3d5,'layer':_0x37f637,'lines':_0x54fa99[_0x4033c1(0x2ef)](0x0,maxLinesPerFile),'lineCount':_0x54fa99[_0x4033c1(0x307)]});}catch(_0x3b596d){}}const _0x139559={};_0x139559['files']=_0x5d3eb9,_0x4d1c4d[_0x4033c1(0x28c)](_0x139559);}),_0x269298[_0x12bec0(0x256)](_0x17cc43[_0x12bec0(0x208)],(_0x45bd99,_0x27c877)=>{const _0x261f24=_0x12bec0,_0x1eec10=_0x45bd99['params'][_0x261f24(0x1e3)],_0x4ba04a=Array['isArray'](_0x1eec10)?_0x1eec10['join']('/'):_0x1eec10,_0xb5fef2={};_0xb5fef2[_0x261f24(0x2a2)]=_0x17cc43[_0x261f24(_0x28b32a._0x4838e6)];if(!_0x4ba04a)return _0x27c877['status'](0x190)['json'](_0xb5fef2);const _0x1e15c2=_0x17cc43[_0x261f24(0x297)](_0x1f2c40),_0x513cf9=resolveFilePath(_0x4ba04a,_0x1e15c2[_0x261f24(0x23e)],_0x1e15c2[_0x261f24(0x224)]);if(!_0x1e15c2['files']['has'](_0x513cf9)){const _0x1de2a1={};return _0x1de2a1[_0x261f24(0x2a2)]='File\x20not\x20found:\x20'+_0x4ba04a,_0x27c877['status'](0x194)['json'](_0x1de2a1);}try{const _0x1ccbbd=fs['readFileSync'](_0x513cf9,_0x17cc43['wYdfX']),_0x2bf50e=_0x1ccbbd[_0x261f24(0x232)]('\x0a');_0x27c877['json']({'path':_0x4ba04a,'lineCount':_0x2bf50e['length'],'content':_0x2bf50e['length']>0x1f4?_0x17cc43[_0x261f24(0x27b)](_0x2bf50e[_0x261f24(0x2ef)](0x0,0x1f4)['join']('\x0a'),_0x17cc43[_0x261f24(0x1f8)]):_0x1ccbbd,'truncated':_0x17cc43[_0x261f24(_0x28b32a._0x1e0937)](_0x2bf50e[_0x261f24(0x307)],0x1f4)});}catch(_0x2cf9f8){const _0x5f05df={};_0x5f05df[_0x261f24(0x2a2)]=_0x2cf9f8['message'],_0x27c877[_0x261f24(_0x28b32a._0x18e423)](0x1f4)[_0x261f24(_0x28b32a._0x479fdd)](_0x5f05df);}}),_0x269298[_0x12bec0(0x256)]('/api/cycles',(_0x3180f2,_0x128556)=>{const _0x12ee27={_0x358046:0x28b,_0x456c97:0x21d},_0x205a32=_0x12bec0;if(!_0x17cc43['nRnFb'](_0x3fc95d))return _0x128556[_0x205a32(0x249)](0x193)[_0x205a32(_0x595abd._0x580ee3)](_0x2a2920(_0x17cc43[_0x205a32(0x225)]));const _0x1f6dd5=_0x17cc43[_0x205a32(_0x595abd._0x4ae0e0)](_0x1f2c40),_0xce833d=_0xbcf078=>path['relative'](_0x1f6dd5['sourceDir'],_0xbcf078)[_0x205a32(0x302)](/\\/g,'/'),_0x1bca45=[],_0x5ee0b9=new Set(),_0x2fa4f3=new Set(),_0x2d8081=new Map();function _0x2d2805(_0x4dbf8e,_0xf89d1c){const _0x25196f=_0x205a32;if(_0x17cc43[_0x25196f(0x205)](_0x1bca45['length'],0x32))return;_0x5ee0b9['add'](_0x4dbf8e),_0x2fa4f3[_0x25196f(_0x12ee27._0x358046)](_0x4dbf8e);const _0x1dcb53=_0x1f6dd5[_0x25196f(0x29f)]['get'](_0x4dbf8e)||[];for(const _0x3f16fd of _0x1dcb53){if(_0x2fa4f3['has'](_0x3f16fd)){const _0x4a403f=_0xf89d1c[_0x25196f(_0x12ee27._0x456c97)](_0x3f16fd);if(_0x4a403f>=0x0){const _0x1c4fe2=_0xf89d1c['slice'](_0x4a403f)[_0x25196f(0x24f)](_0xce833d);_0x1c4fe2['push'](_0xce833d(_0x3f16fd)),_0x1bca45['push'](_0x1c4fe2);}}else!_0x5ee0b9[_0x25196f(0x27d)](_0x3f16fd)&&_0x2d2805(_0x3f16fd,[..._0xf89d1c,_0x3f16fd]);}_0x2fa4f3['delete'](_0x4dbf8e);}for(const _0x4f1cf5 of _0x1f6dd5['files']){!_0x5ee0b9[_0x205a32(_0x595abd._0x1267d9)](_0x4f1cf5)&&_0x2d2805(_0x4f1cf5,[_0x4f1cf5]);}const _0x3d048a={};_0x3d048a['cycles']=_0x1bca45,_0x3d048a[_0x205a32(_0x595abd._0x11ebf4)]=_0x1bca45[_0x205a32(_0x595abd._0x2b6ab2)],_0x128556['json'](_0x3d048a);}),_0x269298['get']('/api/shortest-path',(_0x24fabc,_0x3cb4fb)=>{const _0x7a246f=_0x12bec0,_0x4d33f0=_0x24fabc['query'][_0x7a246f(0x1d0)],_0x58835e=_0x24fabc['query']['to'];if(_0x17cc43[_0x7a246f(_0x327ddc._0x1a9e24)](!_0x4d33f0,!_0x58835e))return _0x3cb4fb['status'](0x190)[_0x7a246f(0x28c)]({'error':_0x17cc43[_0x7a246f(0x210)]});const _0x955b07=_0x1f2c40(),_0x324c25=_0x520b5d=>path['relative'](_0x955b07['sourceDir'],_0x520b5d)[_0x7a246f(0x302)](/\\/g,'/'),_0x125a37=resolveFilePath(_0x4d33f0,_0x955b07[_0x7a246f(0x23e)],_0x955b07[_0x7a246f(0x224)]),_0x2d65bc=_0x17cc43['CUUtA'](resolveFilePath,_0x58835e,_0x955b07[_0x7a246f(0x23e)],_0x955b07['sourceDir']);if(!_0x955b07['files']['has'](_0x125a37)||!_0x955b07[_0x7a246f(_0x327ddc._0x5c5a7c)][_0x7a246f(0x27d)](_0x2d65bc)){const _0x3cdd9f={};return _0x3cdd9f[_0x7a246f(0x2a2)]=_0x17cc43[_0x7a246f(_0x327ddc._0x51f0fe)],_0x3cb4fb[_0x7a246f(0x249)](0x194)['json'](_0x3cdd9f);}const _0x2f7ded=new Map(),_0x19ac0a=new Set(),_0x147daf=[_0x125a37];_0x19ac0a['add'](_0x125a37);let _0x13ac53=![];while(_0x17cc43[_0x7a246f(_0x327ddc._0xd0fab0)](_0x147daf[_0x7a246f(_0x327ddc._0x27759f)],0x0)&&!_0x13ac53){const _0x2a4665=_0x147daf[_0x7a246f(0x221)](),_0x5d7441=new Set();(_0x955b07['forward'][_0x7a246f(_0x327ddc._0x4ba15d)](_0x2a4665)||[])[_0x7a246f(_0x327ddc._0xc00afc)](_0x588195=>_0x5d7441['add'](_0x588195)),(_0x955b07[_0x7a246f(_0x327ddc._0x5d0aaa)]['get'](_0x2a4665)||[])[_0x7a246f(_0x327ddc._0xc00afc)](_0x322463=>_0x5d7441['add'](_0x322463));for(const _0x40aed4 of _0x5d7441){if(!_0x19ac0a['has'](_0x40aed4)){_0x19ac0a['add'](_0x40aed4),_0x2f7ded['set'](_0x40aed4,_0x2a4665);if(_0x40aed4===_0x2d65bc){_0x13ac53=!![];break;}_0x147daf['push'](_0x40aed4);}}}const _0x1d57a4={};_0x1d57a4[_0x7a246f(0x26f)]=[],_0x1d57a4['distance']=-0x1;if(!_0x13ac53)return _0x3cb4fb[_0x7a246f(_0x327ddc._0x3a1769)](_0x1d57a4);const _0x5c8c55=[];let _0x57ec18=_0x2d65bc;while(_0x57ec18){_0x5c8c55['unshift'](_0x324c25(_0x57ec18)),_0x57ec18=_0x2f7ded['get'](_0x57ec18);}_0x3cb4fb['json']({'path':_0x5c8c55,'distance':_0x17cc43['LjFXp'](_0x5c8c55[_0x7a246f(_0x327ddc._0x27759f)],0x1)});}),_0x269298[_0x12bec0(0x256)](_0x17cc43['RIwvs'],(_0x32f8d5,_0x1dee26)=>{const _0x35e1f0=_0x12bec0;if(!_0x17cc43[_0x35e1f0(0x25a)](_0x3fc95d))return _0x1dee26[_0x35e1f0(0x249)](0x193)['json'](_0x17cc43[_0x35e1f0(_0x21de98._0xd67b7e)](_0x2a2920,_0x17cc43[_0x35e1f0(_0x21de98._0x37d396)]));const _0x9f2a72=_0x32f8d5['params']['splat'],_0x271e49=Array['isArray'](_0x9f2a72)?_0x9f2a72['join']('/'):_0x9f2a72,_0x5a5062={};_0x5a5062['error']=_0x17cc43['mFFYI'];if(!_0x271e49)return _0x1dee26['status'](0x190)['json'](_0x5a5062);const _0x9630c9=_0x1f2c40(),_0x399acc=_0x17cc43[_0x35e1f0(0x308)](resolveFilePath,_0x271e49,_0x9630c9['projectRoot'],_0x9630c9[_0x35e1f0(0x224)]),_0x4dba04=_0x1721ee=>path['relative'](_0x9630c9['sourceDir'],_0x1721ee)[_0x35e1f0(0x302)](/\\/g,'/');if(!_0x9630c9[_0x35e1f0(0x212)]['has'](_0x399acc)){const _0x4d487f={};return _0x4d487f[_0x35e1f0(0x2a2)]=_0x35e1f0(_0x21de98._0x53d072)+_0x271e49,_0x1dee26[_0x35e1f0(_0x21de98._0x2960d1)](0x194)[_0x35e1f0(_0x21de98._0x2389a8)](_0x4d487f);}const _0x333ced=(_0x9630c9[_0x35e1f0(_0x21de98._0x5ae71e)]['get'](_0x399acc)||[])['map'](_0x4dba04),_0x25c4cb=new Set(),_0x36be59=[..._0x9630c9[_0x35e1f0(0x288)][_0x35e1f0(_0x21de98._0x4fb661)](_0x399acc)||[]];for(const _0x34f35a of _0x36be59)_0x25c4cb['add'](_0x34f35a);while(_0x17cc43['ZLcoH'](_0x36be59['length'],0x0)){const _0x48e057=_0x36be59['shift']();for(const _0x4d752e of _0x9630c9[_0x35e1f0(_0x21de98._0x425cb2)]['get'](_0x48e057)||[]){!_0x25c4cb[_0x35e1f0(_0x21de98._0x1b18bc)](_0x4d752e)&&_0x17cc43['CQkjv'](_0x4d752e,_0x399acc)&&(_0x25c4cb[_0x35e1f0(_0x21de98._0x4c8075)](_0x4d752e),_0x36be59[_0x35e1f0(_0x21de98._0x21a13d)](_0x4d752e));}}const _0x5bce6d=[];for(const _0x557b9c of _0x9630c9['forward']['get'](_0x399acc)||[]){const _0x3a6f48=_0x9630c9['reverse'][_0x35e1f0(0x256)](_0x557b9c)||[];_0x3a6f48['length']===0x1&&_0x17cc43[_0x35e1f0(_0x21de98._0x21f7a0)](_0x3a6f48[0x0],_0x399acc)&&_0x5bce6d['push'](_0x4dba04(_0x557b9c));}_0x1dee26['json']({'deletedFile':_0x271e49,'brokenImports':_0x333ced,'brokenCount':_0x333ced[_0x35e1f0(_0x21de98._0x55e058)],'cascadeFiles':[..._0x25c4cb]['map'](_0x4dba04),'cascadeCount':_0x25c4cb[_0x35e1f0(0x29a)],'orphanedFiles':_0x5bce6d,'orphanedCount':_0x5bce6d[_0x35e1f0(_0x21de98._0x5388bc)],'severity':_0x17cc43['FpURt'](_0x25c4cb['size'],0x14)?'CRITICAL':_0x25c4cb['size']>=0xa?'HIGH':_0x25c4cb[_0x35e1f0(0x29a)]>=0x5?_0x17cc43['MmqLe']:'LOW'});}),_0x269298[_0x12bec0(_0x333633._0x3183cf)]('/api/warnings',(_0x49317e,_0x3c831e)=>{const _0x3c3193=_0x12bec0,_0x3fa81c=_0x17cc43['ECWmx'](getUnacknowledgedWarnings),_0x470d7c=_0x17cc43['SDmgo'](getAllWarnings),_0x1f1912={};_0x1f1912[_0x3c3193(0x220)]=_0x3fa81c,_0x1f1912[_0x3c3193(0x294)]=_0x3fa81c['length'],_0x1f1912['totalCount']=_0x470d7c['length'],_0x3c831e[_0x3c3193(0x28c)](_0x1f1912);}),_0x269298[_0x12bec0(0x2c0)](_0x17cc43[_0x12bec0(_0x333633._0x8ec29f)],(_0x34e2e7,_0x1051c3)=>{const _0x1cb819=acknowledgeWarnings(),_0x4de2bd={};_0x4de2bd['acknowledged']=_0x1cb819,_0x1051c3['json'](_0x4de2bd);}),_0x269298['get'](_0x17cc43[_0x12bec0(_0x333633._0x151f18)],(_0x203132,_0x2c560a)=>{const _0x58b9ff=_0x12bec0,_0x1ad4d5=_0x17cc43['SDmgo'](_0x1f2c40);let _0x1d5eb9=0x0;for(const _0x160aa4 of _0x1ad4d5[_0x58b9ff(0x29f)][_0x58b9ff(_0x35b777._0x444201)]())_0x1d5eb9+=_0x160aa4[_0x58b9ff(0x307)];const _0xb2ac71=_0x17cc43[_0x58b9ff(_0x35b777._0x53b234)](_0x2793e9);let _0x52e0af=_0x17cc43['ydxFQ'];try{const _0x3f475d=JSON['parse'](fs[_0x58b9ff(0x1eb)](path[_0x58b9ff(0x25d)](__dirname,'..',_0x17cc43['znxOW']),_0x58b9ff(0x2bf)));_0x52e0af=_0x3f475d['version']||_0x17cc43['ydxFQ'];}catch{}const _0x40e09c=(0x0,config_1['getConfig'])(_0x17cc43[_0x58b9ff(0x2bc)],_0x17cc43['RDZSt'])||'',_0x1dc0d4=_0x17cc43[_0x58b9ff(0x1da)](_0x40e09c[_0x58b9ff(_0x35b777._0x29a099)],0xa)?_0x17cc43[_0x58b9ff(_0x35b777._0xd972d4)](_0x17cc43['ttbzp'](_0x40e09c[_0x58b9ff(_0x35b777._0x2baed1)](0x0,0x9),_0x17cc43[_0x58b9ff(0x1e2)]),_0x40e09c[_0x58b9ff(_0x35b777._0x1e1643)](_0x40e09c[_0x58b9ff(_0x35b777._0x11bc67)]-0x4)):'',_0x2e58b3={};_0x2e58b3[_0x58b9ff(0x30d)]=![],_0x2e58b3[_0x58b9ff(_0x35b777._0x1b5a13)]=![],_0x2e58b3[_0x58b9ff(0x255)]=![];const _0x5c0acc={};_0x5c0acc[_0x58b9ff(_0x35b777._0x253e51)]='disabled',_0x5c0acc[_0x58b9ff(0x1f4)]=_0x2e58b3,_0x5c0acc[_0x58b9ff(_0x35b777._0xc456f7)]=null;const _0x2b0c2d=_0x213082?_0x17cc43[_0x58b9ff(_0x35b777._0x411e6c)](_0x213082):_0x5c0acc;_0x2c560a['json']({'projectRoot':_0x1f4174?_0x17cc43['UCZHN'](_0x1f4174):_0x1ad4d5['projectRoot'],'packageName':_0x412c65?_0x17cc43['JSlVy'](_0x412c65):'','languages':_0x1ad4d5[_0x58b9ff(0x284)],'fileCount':_0x1ad4d5[_0x58b9ff(0x212)]['size'],'edgeCount':_0x1d5eb9,'plan':_0xb2ac71?.[_0x58b9ff(0x2a1)]||_0x17cc43['SZuXE'],'planSource':_0xb2ac71?.['source']||_0x17cc43[_0x58b9ff(_0x35b777._0x141e22)],'expiresAt':_0xb2ac71?.['expiresAt']||null,'licenseKey':_0x1dc0d4,'freeFileLimit':0x32,'sykeVersion':_0x52e0af,'aiProvider':_0x2b0c2d[_0x58b9ff(_0x35b777._0x253e51)],'aiKeys':_0x2b0c2d[_0x58b9ff(0x1f4)],'aiProviderForced':_0x2b0c2d[_0x58b9ff(_0x35b777._0xc456f7)]});}),_0x269298['post'](_0x17cc43['UVFvI'],async(_0x6505c9,_0x1bab1f)=>{const _0x2c04b3=_0x12bec0;if(!_0x19e0f0){const _0x433561={};_0x433561['success']=![],_0x433561[_0x2c04b3(_0x27f670._0xfc9171)]='Not\x20supported',_0x1bab1f['status'](0x1f5)['json'](_0x433561);return;}const {key:_0xaf2106}=_0x6505c9['body'];try{const _0x4ead57=await _0x19e0f0(_0xaf2106||null);_0x1bab1f[_0x2c04b3(_0x27f670._0x54f950)](_0x4ead57);}catch(_0x2ca8f0){const _0x5bf28d={};_0x5bf28d[_0x2c04b3(_0x27f670._0x1bc9c6)]=![],_0x5bf28d['error']=_0x2ca8f0[_0x2c04b3(_0x27f670._0x24a238)]||'Unknown\x20error',_0x1bab1f[_0x2c04b3(_0x27f670._0x4509d7)](0x1f4)['json'](_0x5bf28d);}}),_0x269298['post'](_0x12bec0(0x2e5),(_0x208b21,_0x567428)=>{const _0xa41a7c=_0x12bec0;if(!_0x48d88b){const _0x49d016={};_0x49d016['success']=![],_0x49d016['error']='Not\x20supported',_0x567428[_0xa41a7c(0x249)](0x1f5)[_0xa41a7c(_0x5a637b._0x4f8f6a)](_0x49d016);return;}const {provider:_0x3d5629,key:_0x4428ed}=_0x208b21['body'];if(!_0x3d5629||!['gemini',_0x17cc43['lGwoE'],'anthropic']['includes'](_0x3d5629)){const _0x13ca6c={};_0x13ca6c[_0xa41a7c(0x25f)]=![],_0x13ca6c[_0xa41a7c(0x2a2)]=_0xa41a7c(0x2d9),_0x567428[_0xa41a7c(_0x5a637b._0x159fac)](0x190)['json'](_0x13ca6c);return;}try{const _0x351dd8=_0x48d88b(_0x3d5629,_0x17cc43['YFcoA'](_0x4428ed,null));_0x567428[_0xa41a7c(_0x5a637b._0x4f8f6a)](_0x351dd8);}catch(_0x49c778){const _0x274e44={};_0x274e44['success']=![],_0x274e44['error']=_0x49c778['message']||_0x17cc43[_0xa41a7c(_0x5a637b._0x372cb5)],_0x567428['status'](0x1f4)['json'](_0x274e44);}}),_0x269298[_0x12bec0(_0x333633._0x8776bb)](_0x17cc43['gRcsw'],(_0x2587c6,_0x32b2d1)=>{const _0x244546=_0x12bec0;if(!_0x37bb24){const _0x35f090={};_0x35f090['success']=![],_0x35f090['error']=_0x17cc43['rnpvb'],_0x32b2d1[_0x244546(_0x237ed4._0x5600f9)](0x1f5)[_0x244546(_0x237ed4._0x35b94b)](_0x35f090);return;}const {provider:_0x376b73}=_0x2587c6[_0x244546(0x275)];if(!_0x376b73||![_0x244546(0x30d),_0x244546(_0x237ed4._0x5dd0f1),_0x17cc43['Hzbxk'],_0x17cc43[_0x244546(_0x237ed4._0x36c843)]]['includes'](_0x376b73)){const _0x512b7e={};_0x512b7e['success']=![],_0x512b7e[_0x244546(_0x237ed4._0x2d7018)]=_0x17cc43['TJvmR'],_0x32b2d1['status'](0x190)[_0x244546(_0x237ed4._0x35b94b)](_0x512b7e);return;}try{const _0x22190e=_0x17cc43[_0x244546(_0x237ed4._0x512b1e)](_0x37bb24,_0x376b73);_0x32b2d1['json'](_0x22190e);}catch(_0x29432d){const _0x137bbe={};_0x137bbe[_0x244546(0x25f)]=![],_0x137bbe['error']=_0x29432d['message']||_0x244546(_0x237ed4._0x33718c),_0x32b2d1[_0x244546(_0x237ed4._0x176e33)](0x1f4)[_0x244546(0x28c)](_0x137bbe);}}),_0x269298['get']('/api/browse-dirs',(_0xd1a744,_0x2db8bf)=>{const _0x36f3ce={_0x46a59c:0x27c,_0x3a30cd:0x291,_0x50f155:0x2c3},_0x29caee=_0x12bec0,_0x46fa4a={'YDltg':function(_0x130541,_0x2b10f7){return _0x130541===_0x2b10f7;},'ihtqa':_0x29caee(_0x4d0086._0x1d5c1e),'yMpph':function(_0x5a86e2,_0x216182){const _0x1c1757=_0x29caee;return _0x17cc43[_0x1c1757(0x1f9)](_0x5a86e2,_0x216182);}},_0x1f7560=_0xd1a744[_0x29caee(_0x4d0086._0x40532d)][_0x29caee(0x26f)]||(process[_0x29caee(_0x4d0086._0x12dcae)]==='win32'?'C:\x5c':'/'),_0x329eca=path[_0x29caee(0x22c)](_0x1f7560);if(!fs['existsSync'](_0x329eca)||!fs['statSync'](_0x329eca)[_0x29caee(_0x4d0086._0x1d4ba9)]()){const _0x54f9b3={};return _0x54f9b3['error']='Not\x20a\x20directory:\x20'+_0x329eca,_0x2db8bf[_0x29caee(_0x4d0086._0x3ddced)](0x190)['json'](_0x54f9b3);}try{const _0x128738={};_0x128738['withFileTypes']=!![];const _0x440a5b=fs[_0x29caee(0x27a)](_0x329eca,_0x128738),_0x263bcf=_0x440a5b['filter'](_0x50d3e4=>{const _0x86cced=_0x29caee;if(!_0x50d3e4[_0x86cced(_0x36f3ce._0x46a59c)]())return![];const _0x37cf38=_0x50d3e4[_0x86cced(0x2ab)];if(_0x37cf38['startsWith']('.')||_0x46fa4a['YDltg'](_0x37cf38,_0x46fa4a['ihtqa'])||_0x46fa4a['yMpph'](_0x37cf38,_0x86cced(_0x36f3ce._0x3a30cd))||_0x37cf38===_0x86cced(_0x36f3ce._0x50f155))return![];return!![];})['map'](_0x1c0466=>_0x1c0466['name'])['sort']((_0x51280d,_0x592f43)=>_0x51280d['toLowerCase']()[_0x29caee(0x228)](_0x592f43[_0x29caee(0x26b)]())),_0x112696=[_0x17cc43[_0x29caee(0x2d4)],_0x29caee(_0x4d0086._0xcaf39f),_0x17cc43['ItDvO'],_0x17cc43['PbyAi'],_0x17cc43['JXutd'],_0x17cc43['LuNbm'],_0x17cc43[_0x29caee(0x207)],_0x17cc43['OjBek'],_0x17cc43['MxsUh'],_0x29caee(0x25b)],_0x340a98=_0x112696['some'](_0x116b96=>fs[_0x29caee(0x28a)](path[_0x29caee(0x25d)](_0x329eca,_0x116b96))),_0x5b8b92=_0x112696['find'](_0x17c0bf=>fs['existsSync'](path[_0x29caee(0x25d)](_0x329eca,_0x17c0bf)))||null;_0x2db8bf[_0x29caee(0x28c)]({'current':_0x329eca,'parent':path['dirname'](_0x329eca)!==_0x329eca?path[_0x29caee(0x29d)](_0x329eca):null,'dirs':_0x263bcf,'isProject':_0x340a98,'detectedMarker':_0x5b8b92});}catch(_0x589a0c){const _0x2c7e93={};_0x2c7e93[_0x29caee(_0x4d0086._0x2c7d94)]=_0x589a0c[_0x29caee(0x264)],_0x2db8bf['status'](0x1f4)['json'](_0x2c7e93);}}),_0x269298[_0x12bec0(_0x333633._0x22bec8)](_0x17cc43['TKuHM'],(_0x3ab7c2,_0x2f7ecf)=>{const _0x10c185=_0x12bec0,{projectRoot:_0xc4e3ac}=_0x3ab7c2[_0x10c185(0x275)];if(!_0xc4e3ac||typeof _0xc4e3ac!=='string'){const _0x2d9204={};return _0x2d9204[_0x10c185(_0x44f5d7._0x31f072)]=_0x17cc43['UvQjK'],_0x2f7ecf[_0x10c185(_0x44f5d7._0x58fa22)](0x190)['json'](_0x2d9204);}const _0xa71f97=path[_0x10c185(_0x44f5d7._0x41013e)](_0xc4e3ac);if(!_0x17cc43['IZGFf'](_0x3fc95d)){const _0x2a327e=_0x1f4174?path[_0x10c185(_0x44f5d7._0x41013e)](_0x1f4174()):null;if(_0x2a327e&&_0x17cc43['rHtJr'](_0xa71f97,_0x2a327e)){const _0x3ecede={};return _0x3ecede[_0x10c185(_0x44f5d7._0x31f072)]=_0x10c185(_0x44f5d7._0x35e23c),_0x3ecede[_0x10c185(_0x44f5d7._0x1fe156)]=_0x17cc43[_0x10c185(_0x44f5d7._0x12f05e)],_0x2f7ecf[_0x10c185(_0x44f5d7._0x58fa22)](0x193)['json'](_0x3ecede);}}if(!fs['existsSync'](_0xa71f97)||!fs[_0x10c185(0x277)](_0xa71f97)[_0x10c185(0x27c)]()){const _0x4a15d9={};return _0x4a15d9[_0x10c185(0x2a2)]='Directory\x20not\x20found:\x20'+_0xa71f97,_0x2f7ecf['status'](0x190)['json'](_0x4a15d9);}if(!_0x52a7d3){const _0x499139={};return _0x499139[_0x10c185(0x2a2)]=_0x17cc43['EGEbM'],_0x2f7ecf[_0x10c185(_0x44f5d7._0x58fa22)](0x1f4)[_0x10c185(0x28c)](_0x499139);}try{const _0x3767b1=_0x17cc43['jUhPg'](_0x52a7d3,_0xa71f97);_0x17cc43['dSufJ'](_0xb4e422,'project-switched',_0x3767b1),_0x2f7ecf['json'](_0x3767b1);}catch(_0xe09b6c){const _0x3f209c={};_0x3f209c['error']=_0xe09b6c['message']||_0x17cc43[_0x10c185(0x320)],_0x2f7ecf[_0x10c185(0x249)](0x1f4)[_0x10c185(_0x44f5d7._0x43c578)](_0x3f209c);}});const _0xac9c8e={};return _0xac9c8e['app']=_0x269298,_0xac9c8e[_0x12bec0(0x2c2)]=_0x59686c,_0xac9c8e;}
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.addWarning = addWarning;
40
+ exports.getUnacknowledgedWarnings = getUnacknowledgedWarnings;
41
+ exports.acknowledgeWarnings = acknowledgeWarnings;
42
+ exports.getAllWarnings = getAllWarnings;
43
+ exports.createWebServer = createWebServer;
44
+ const path = __importStar(require("path"));
45
+ const fs = __importStar(require("fs"));
46
+ const express_1 = __importDefault(require("express"));
47
+ const plugin_1 = require("../languages/plugin");
48
+ const analyze_impact_1 = require("../tools/analyze-impact");
49
+ const analyzer_1 = require("../ai/analyzer");
50
+ const realtime_analyzer_1 = require("../ai/realtime-analyzer");
51
+ const config_1 = require("../config");
52
+ // ── Real-time AI analysis toggle ──
53
+ let realtimeAIEnabled = true;
54
+ function resolveFilePath(fileArg, projectRoot, sourceDir) {
55
+ const srcDir = sourceDir || path.join(projectRoot, "lib");
56
+ const srcDirName = path.basename(srcDir); // "lib" or "src"
57
+ if (path.isAbsolute(fileArg))
58
+ return path.normalize(fileArg);
59
+ if (fileArg.startsWith(srcDirName + "/") || fileArg.startsWith(srcDirName + "\\")) {
60
+ return path.normalize(path.join(projectRoot, fileArg));
61
+ }
62
+ return path.normalize(path.join(srcDir, fileArg));
63
+ }
64
+ function classifyFile(relPath) {
65
+ const lower = relPath.toLowerCase();
66
+ const fileName = lower.split("/").pop() || "";
67
+ // ── Layer — try plugin-specific classification first ──
68
+ let layer = "UTIL";
69
+ const plugin = (0, plugin_1.getPluginForFile)(relPath);
70
+ const pluginLayer = plugin?.classifyLayer?.(relPath);
71
+ if (pluginLayer) {
72
+ layer = pluginLayer;
73
+ }
74
+ else {
75
+ // FE: presentation layer, UI components
76
+ if (lower.includes("/presentation/") ||
77
+ lower.includes("/widgets/") ||
78
+ lower.includes("/screens/") ||
79
+ lower.includes("/pages/") ||
80
+ lower.includes("web/public/") ||
81
+ lower.includes("components/") ||
82
+ fileName.endsWith("_screen.dart") ||
83
+ fileName.endsWith("_page.dart") ||
84
+ fileName.endsWith("_widget.dart") ||
85
+ fileName.endsWith("_dialog.dart") ||
86
+ fileName.endsWith("_view.dart") ||
87
+ fileName.endsWith("_card.dart") ||
88
+ fileName.endsWith("_tile.dart") ||
89
+ fileName.endsWith("_form.dart") ||
90
+ fileName.endsWith("_bottom_sheet.dart") ||
91
+ fileName.endsWith(".html") ||
92
+ fileName.endsWith(".css") ||
93
+ fileName.endsWith(".jsx") ||
94
+ fileName.endsWith(".tsx")) {
95
+ layer = "FE";
96
+ }
97
+ // API: network/remote layer
98
+ else if (lower.includes("/api/") ||
99
+ fileName.includes("cloud_function") ||
100
+ fileName.endsWith("_api.dart") ||
101
+ fileName.endsWith("_client.dart") ||
102
+ fileName.endsWith("_remote.dart") ||
103
+ fileName.includes("_datasource") ||
104
+ fileName.includes("_data_source") ||
105
+ lower.includes("web/server") ||
106
+ fileName.endsWith("server.ts") ||
107
+ fileName.endsWith("server.js")) {
108
+ layer = "API";
109
+ }
110
+ // DB: data models, entities
111
+ else if (lower.includes("/models/") ||
112
+ lower.includes("/entities/") ||
113
+ fileName.endsWith("_model.dart") ||
114
+ fileName.endsWith("_entity.dart") ||
115
+ fileName.endsWith("_dto.dart") ||
116
+ fileName.endsWith("_schema.dart") ||
117
+ fileName.endsWith(".model.ts") ||
118
+ fileName.endsWith(".entity.ts") ||
119
+ fileName.endsWith(".schema.ts")) {
120
+ layer = "DB";
121
+ }
122
+ // BE: business logic, repositories, services, state management
123
+ else if (lower.includes("/data/") ||
124
+ lower.includes("/domain/") ||
125
+ lower.includes("/application/") ||
126
+ lower.includes("/providers/") ||
127
+ lower.includes("/notifiers/") ||
128
+ lower.includes("tools/") ||
129
+ lower.includes("ai/") ||
130
+ lower.includes("watcher/") ||
131
+ fileName.endsWith("_repository.dart") ||
132
+ fileName.endsWith("_service.dart") ||
133
+ fileName.endsWith("_provider.dart") ||
134
+ fileName.endsWith("_notifier.dart") ||
135
+ fileName.endsWith("_controller.dart") ||
136
+ fileName.endsWith("_usecase.dart") ||
137
+ fileName.endsWith("_state.dart") ||
138
+ fileName.endsWith("_bloc.dart") ||
139
+ fileName.endsWith("_cubit.dart") ||
140
+ fileName.endsWith(".service.ts") ||
141
+ fileName.endsWith(".controller.ts")) {
142
+ layer = "BE";
143
+ }
144
+ // CONFIG: app config, themes, routing, constants
145
+ else if (lower.includes("/config/") ||
146
+ lower.includes("/theme/") ||
147
+ lower.includes("/router/") ||
148
+ lower.includes("/routing/") ||
149
+ lower.startsWith("app/") ||
150
+ fileName.endsWith("_config.dart") ||
151
+ fileName.endsWith("_theme.dart") ||
152
+ fileName.endsWith("_constants.dart") ||
153
+ fileName.endsWith("_routes.dart") ||
154
+ fileName === "main.dart" ||
155
+ fileName === "index.ts" ||
156
+ fileName === "index.js" ||
157
+ fileName.endsWith(".config.ts") ||
158
+ fileName.endsWith(".config.js")) {
159
+ layer = "CONFIG";
160
+ }
161
+ // UTIL: utilities, helpers, extensions, shared
162
+ else if (lower.includes("/utils/") ||
163
+ lower.includes("/helpers/") ||
164
+ lower.includes("/extensions/") ||
165
+ lower.includes("shared/") ||
166
+ lower.includes("languages/") ||
167
+ fileName.endsWith("_util.dart") ||
168
+ fileName.endsWith("_helper.dart") ||
169
+ fileName.endsWith("_extension.dart") ||
170
+ fileName.endsWith("_mixin.dart") ||
171
+ fileName.endsWith(".util.ts") ||
172
+ fileName.endsWith(".helper.ts")) {
173
+ layer = "UTIL";
174
+ }
175
+ } // end plugin fallback
176
+ // ── Action (infer from filename patterns) ──
177
+ let action = "X";
178
+ if (fileName.includes("create") || fileName.includes("add") || fileName.includes("register") || fileName.includes("new")) {
179
+ action = "C";
180
+ }
181
+ else if (fileName.includes("list") || fileName.includes("get") || fileName.includes("fetch") || fileName.includes("show") || fileName.includes("detail") || fileName.includes("_screen") || fileName.includes("_page")) {
182
+ action = "R";
183
+ }
184
+ else if (fileName.includes("update") || fileName.includes("edit") || fileName.includes("modify") || fileName.includes("change")) {
185
+ action = "U";
186
+ }
187
+ else if (fileName.includes("delete") || fileName.includes("remove")) {
188
+ action = "D";
189
+ }
190
+ // ── Environment ──
191
+ const env = (fileName.includes("_test") || fileName.includes("_mock") || fileName.includes("_fake") || lower.includes("/test/")) ? "DEV" : "PROD";
192
+ return { layer, action, env };
193
+ }
194
+ const warningStore = [];
195
+ const MAX_WARNINGS = 50;
196
+ function addWarning(analysis) {
197
+ // Only store non-SAFE warnings
198
+ if (analysis.riskLevel === "SAFE")
199
+ return;
200
+ warningStore.unshift({
201
+ file: analysis.file,
202
+ riskLevel: analysis.riskLevel,
203
+ summary: analysis.summary,
204
+ brokenImports: analysis.brokenImports,
205
+ sideEffects: analysis.sideEffects,
206
+ warnings: analysis.warnings,
207
+ suggestion: analysis.suggestion,
208
+ affectedCount: analysis.affectedNodes.length,
209
+ timestamp: analysis.timestamp,
210
+ acknowledged: false,
211
+ });
212
+ // Cap the store
213
+ while (warningStore.length > MAX_WARNINGS)
214
+ warningStore.pop();
215
+ }
216
+ function getUnacknowledgedWarnings() {
217
+ return warningStore.filter(w => !w.acknowledged);
218
+ }
219
+ function acknowledgeWarnings() {
220
+ let count = 0;
221
+ for (const w of warningStore) {
222
+ if (!w.acknowledged) {
223
+ w.acknowledged = true;
224
+ count++;
225
+ }
226
+ }
227
+ return count;
228
+ }
229
+ function getAllWarnings() {
230
+ return [...warningStore];
231
+ }
232
+ function createWebServer(getGraphFn, initialFileCache, switchProjectFn, getProjectRoot, getPackageName, getLicenseStatus, hasAIKeyFn, setLicenseKeyFn, setAIKeyFn, getAIInfoFn, setAIProviderFn) {
233
+ const app = (0, express_1.default)();
234
+ app.use(express_1.default.json());
235
+ /** Check if current license is Pro (includes pro_trial) */
236
+ function isProPlan() {
237
+ const license = getLicenseStatus?.();
238
+ return license?.plan === "pro" || license?.plan === "pro_trial";
239
+ }
240
+ // Serve static files from public/
241
+ const publicDir = path.join(__dirname, "public");
242
+ app.use(express_1.default.static(publicDir));
243
+ // ── SSE: Server-Sent Events for real-time updates ──
244
+ const sseClients = new Set();
245
+ let currentFileCache = initialFileCache || null;
246
+ function broadcastSSE(event, data) {
247
+ const payload = `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`;
248
+ for (const client of sseClients) {
249
+ try {
250
+ client.write(payload);
251
+ }
252
+ catch (_) {
253
+ sseClients.delete(client);
254
+ }
255
+ }
256
+ }
257
+ /**
258
+ * Build a specific error message for Pro-only features based on license state.
259
+ */
260
+ function getProFeatureError(featureName) {
261
+ const license = getLicenseStatus?.();
262
+ const upgrade = "https://syke.cloud/dashboard/";
263
+ if (license?.error) {
264
+ return { error: `${featureName}: ${license.error}`, requiresPro: true, upgrade };
265
+ }
266
+ if (license?.source === "online" && license?.expiresAt) {
267
+ // Had a license but it's no longer valid (expired trial or subscription)
268
+ return { error: `Trial expired. Upgrade at ${upgrade}`, requiresPro: true, upgrade };
269
+ }
270
+ return { error: `${featureName} requires SYKE Pro. Set SYKE_LICENSE_KEY or sign up at https://syke.cloud`, requiresPro: true, upgrade };
271
+ }
272
+ app.get("/api/events", (_req, res) => {
273
+ // Pro-only: real-time monitoring via SSE
274
+ if (!isProPlan()) {
275
+ res.status(403).json(getProFeatureError("Real-time monitoring"));
276
+ return;
277
+ }
278
+ res.writeHead(200, {
279
+ "Content-Type": "text/event-stream",
280
+ "Cache-Control": "no-cache",
281
+ "Connection": "keep-alive",
282
+ "Access-Control-Allow-Origin": "*",
283
+ });
284
+ // Send initial connection event
285
+ res.write(`event: connected\ndata: ${JSON.stringify({ clients: sseClients.size + 1, cacheSize: currentFileCache?.size || 0 })}\n\n`);
286
+ sseClients.add(res);
287
+ console.error(`[syke:sse] Client connected (${sseClients.size} total)`);
288
+ _req.on("close", () => {
289
+ sseClients.delete(res);
290
+ console.error(`[syke:sse] Client disconnected (${sseClients.size} total)`);
291
+ });
292
+ });
293
+ // Wire FileCache change events → SSE broadcast + AI analysis
294
+ function wireFileCacheEvents(cache) {
295
+ // Give the FileCache a reference to the current graph for incremental updates
296
+ const graph = getGraphFn();
297
+ cache.setGraph(graph);
298
+ // Listen for incremental graph updates (emitted after file changes update edges)
299
+ cache.on("graph-updated", (result) => {
300
+ if (result.edgesChanged) {
301
+ console.error(`[syke:sse] Graph incrementally updated: ${result.updatedFile} ` +
302
+ `(+${result.addedEdges.length}/-${result.removedEdges.length} edges, ` +
303
+ `${result.affectedFiles.length} affected files)`);
304
+ broadcastSSE("graph-incremental-update", {
305
+ file: path.relative(getGraphFn().sourceDir, result.updatedFile).replace(/\\/g, "/"),
306
+ addedEdges: result.addedEdges.length,
307
+ removedEdges: result.removedEdges.length,
308
+ affectedFiles: result.affectedFiles.length,
309
+ });
310
+ }
311
+ });
312
+ cache.on("change", async (change) => {
313
+ const graph = getGraphFn();
314
+ const absPath = path.normalize(path.join(graph.sourceDir, change.relativePath));
315
+ // Compute affected nodes for visual pulse
316
+ const revDeps = graph.reverse.get(absPath) || [];
317
+ const fwdDeps = graph.forward.get(absPath) || [];
318
+ const connectedNodes = [...new Set([...revDeps, ...fwdDeps])].map(f => path.relative(graph.sourceDir, f).replace(/\\/g, "/"));
319
+ // Send diff lines (capped at 100 for bandwidth)
320
+ const diffLines = change.diff.slice(0, 100).map(d => ({
321
+ line: d.line,
322
+ type: d.type,
323
+ old: d.old,
324
+ new: d.new,
325
+ }));
326
+ // Send new file content (for code crawl display)
327
+ const newLines = change.newContent
328
+ ? change.newContent.split("\n").slice(0, 300)
329
+ : [];
330
+ // Immediately broadcast the file change event (node pulse starts)
331
+ broadcastSSE("file-change", {
332
+ file: change.relativePath,
333
+ type: change.type,
334
+ diffCount: change.diff.length,
335
+ diff: diffLines,
336
+ newContent: newLines,
337
+ connectedNodes,
338
+ timestamp: change.timestamp,
339
+ });
340
+ // Run Gemini real-time analysis (Pro only, when toggle is on)
341
+ if (isProPlan() && realtimeAIEnabled) {
342
+ broadcastSSE("analysis-start", { file: change.relativePath });
343
+ try {
344
+ const analysis = await (0, realtime_analyzer_1.analyzeChangeRealtime)(change, graph, (relPath) => currentFileCache?.getFileByRelPath(relPath) ?? null);
345
+ broadcastSSE("analysis-result", analysis);
346
+ // Store warnings for MCP check_warnings tool
347
+ addWarning(analysis);
348
+ // If graph structure changed (new/deleted files), rebuild
349
+ if (change.type === "added" || change.type === "deleted") {
350
+ broadcastSSE("graph-rebuild", { reason: change.type, file: change.relativePath });
351
+ }
352
+ }
353
+ catch (err) {
354
+ broadcastSSE("analysis-error", {
355
+ file: change.relativePath,
356
+ error: err.message,
357
+ });
358
+ }
359
+ }
360
+ else if (isProPlan() && !realtimeAIEnabled) {
361
+ // Pro but AI toggle is off — log and skip AI, still handle structural changes
362
+ console.error(`[syke:ai] Real-time AI disabled — skipping analysis for ${change.relativePath}`);
363
+ if (change.type === "added" || change.type === "deleted") {
364
+ broadcastSSE("graph-rebuild", { reason: change.type, file: change.relativePath });
365
+ }
366
+ }
367
+ else {
368
+ // Free: still rebuild graph on structural changes, but skip AI
369
+ if (change.type === "added" || change.type === "deleted") {
370
+ broadcastSSE("graph-rebuild", { reason: change.type, file: change.relativePath });
371
+ }
372
+ }
373
+ });
374
+ }
375
+ if (currentFileCache)
376
+ wireFileCacheEvents(currentFileCache);
377
+ /** Replace the FileCache (called after switchProject) */
378
+ function setFileCache(cache) {
379
+ currentFileCache = cache;
380
+ wireFileCacheEvents(cache);
381
+ console.error(`[syke:sse] FileCache re-wired (${cache.size} files)`);
382
+ }
383
+ // GET /api/cache-status — Memory cache stats
384
+ app.get("/api/cache-status", (_req, res) => {
385
+ if (!currentFileCache) {
386
+ return res.json({ enabled: false });
387
+ }
388
+ res.json({
389
+ enabled: true,
390
+ fileCount: currentFileCache.size,
391
+ totalLines: currentFileCache.totalLines,
392
+ sseClients: sseClients.size,
393
+ });
394
+ });
395
+ // POST /api/toggle-realtime-ai — Enable or disable real-time AI analysis
396
+ app.post("/api/toggle-realtime-ai", (req, res) => {
397
+ const { enabled } = req.body;
398
+ if (typeof enabled === "boolean") {
399
+ realtimeAIEnabled = enabled;
400
+ }
401
+ else {
402
+ realtimeAIEnabled = !realtimeAIEnabled;
403
+ }
404
+ console.error(`[syke:ai] Real-time AI analysis ${realtimeAIEnabled ? "ENABLED" : "DISABLED"}`);
405
+ res.json({ realtimeAIEnabled });
406
+ });
407
+ // GET /api/graph — Cytoscape.js compatible JSON
408
+ app.get("/api/graph", (_req, res) => {
409
+ const graph = getGraphFn();
410
+ const isPro = isProPlan();
411
+ const FREE_GRAPH_LIMIT = 50;
412
+ const nodes = [];
413
+ const edges = [];
414
+ // ── Compute depth for each file (BFS from roots) ──
415
+ const depthMap = new Map();
416
+ const roots = [...graph.files].filter(f => {
417
+ const rev = graph.reverse.get(f);
418
+ return !rev || rev.length === 0;
419
+ });
420
+ const queue = roots.map(r => [r, 0]);
421
+ while (queue.length > 0) {
422
+ const [file, d] = queue.shift();
423
+ if (depthMap.has(file))
424
+ continue;
425
+ depthMap.set(file, d);
426
+ const fwdDeps = graph.forward.get(file) || [];
427
+ for (const dep of fwdDeps) {
428
+ if (!depthMap.has(dep))
429
+ queue.push([dep, d + 1]);
430
+ }
431
+ }
432
+ // Free tier: limit to first 50 files sorted alphabetically
433
+ const allFiles = [...graph.files].sort();
434
+ const visibleFiles = isPro ? allFiles : allFiles.slice(0, FREE_GRAPH_LIMIT);
435
+ const visibleSet = new Set(visibleFiles);
436
+ for (const file of visibleFiles) {
437
+ const rel = path.relative(graph.sourceDir, file).replace(/\\/g, "/");
438
+ const revDeps = graph.reverse.get(file) || [];
439
+ const dependentCount = revDeps.length;
440
+ const riskLevel = (0, analyze_impact_1.classifyRisk)(dependentCount);
441
+ const parts = rel.split("/");
442
+ const group = parts.length > 1 ? parts[0] + "/" + parts[1] : parts[0];
443
+ const { layer, action, env } = classifyFile(rel);
444
+ // Count lines
445
+ let lineCount = 0;
446
+ try {
447
+ const content = fs.readFileSync(file, "utf-8");
448
+ lineCount = content.split("\n").length;
449
+ }
450
+ catch (_) { }
451
+ // Imports count (direct forward dependencies)
452
+ const importsCount = (graph.forward.get(file) || []).length;
453
+ // Depth in dependency tree
454
+ const depth = depthMap.get(file) ?? 0;
455
+ nodes.push({
456
+ data: {
457
+ id: rel,
458
+ label: parts[parts.length - 1],
459
+ fullPath: rel,
460
+ riskLevel,
461
+ dependentCount,
462
+ lineCount,
463
+ importsCount,
464
+ depth,
465
+ group,
466
+ layer,
467
+ action,
468
+ env,
469
+ },
470
+ });
471
+ }
472
+ for (const [file, deps] of graph.forward) {
473
+ // Only include edges where both source and target are in the visible set
474
+ if (!visibleSet.has(file))
475
+ continue;
476
+ const from = path.relative(graph.sourceDir, file).replace(/\\/g, "/");
477
+ for (const d of deps) {
478
+ if (!visibleSet.has(d))
479
+ continue;
480
+ const to = path.relative(graph.sourceDir, d).replace(/\\/g, "/");
481
+ edges.push({ data: { source: from, target: to } });
482
+ }
483
+ }
484
+ res.json({ nodes, edges, totalFiles: graph.files.size, limited: !isPro && graph.files.size > FREE_GRAPH_LIMIT });
485
+ });
486
+ // GET /api/impact/:file — Impact analysis for a specific file
487
+ app.get("/api/impact/*splat", async (req, res) => {
488
+ const splat = req.params.splat;
489
+ const fileParam = Array.isArray(splat) ? splat.join("/") : splat;
490
+ if (!fileParam) {
491
+ return res.status(400).json({ error: "File path required" });
492
+ }
493
+ const graph = getGraphFn();
494
+ const resolved = resolveFilePath(fileParam, graph.projectRoot, graph.sourceDir);
495
+ if (!graph.files.has(resolved)) {
496
+ return res.status(404).json({ error: `File not found in graph: ${fileParam}` });
497
+ }
498
+ const result = await (0, analyze_impact_1.analyzeImpact)(resolved, graph);
499
+ res.json(result);
500
+ });
501
+ // POST /api/ai-analyze — AI semantic analysis (Pro or BYOK)
502
+ app.post("/api/ai-analyze", async (req, res) => {
503
+ const isPro = isProPlan();
504
+ const hasKey = hasAIKeyFn?.() || false;
505
+ if (!isPro && !hasKey) {
506
+ return res.status(403).json({
507
+ ...getProFeatureError("AI analysis"),
508
+ hint: "Or set GEMINI_KEY / OPENAI_KEY / ANTHROPIC_KEY to use ai_analyze with your own API key.",
509
+ });
510
+ }
511
+ const { file } = req.body;
512
+ if (!file) {
513
+ return res.status(400).json({ error: "file is required in body" });
514
+ }
515
+ const graph = getGraphFn();
516
+ const resolved = resolveFilePath(file, graph.projectRoot, graph.sourceDir);
517
+ if (!graph.files.has(resolved)) {
518
+ return res.status(404).json({ error: `File not found in graph: ${file}` });
519
+ }
520
+ // Free tier: check file limit
521
+ if (!isPro) {
522
+ const allFiles = [...graph.files].sort();
523
+ const idx = allFiles.indexOf(resolved);
524
+ if (idx < 0 || idx >= 50) {
525
+ return res.status(403).json({ error: "This file exceeds the Free tier limit (50 files). Upgrade to Pro for unlimited analysis.", upgrade: "https://syke.cloud/dashboard/" });
526
+ }
527
+ }
528
+ const impactResult = await (0, analyze_impact_1.analyzeImpact)(resolved, graph);
529
+ try {
530
+ const aiResult = await (0, analyzer_1.analyzeWithAI)(resolved, impactResult, graph);
531
+ const partial = !isPro && graph.files.size > 50;
532
+ res.json({ file: impactResult.relativePath, analysis: aiResult, partial });
533
+ }
534
+ catch (err) {
535
+ res.status(500).json({ error: err.message || "AI analysis failed" });
536
+ }
537
+ });
538
+ // GET /api/hub-files — Top hub files ranking (Pro only)
539
+ app.get("/api/hub-files", (req, res) => {
540
+ if (!isProPlan()) {
541
+ return res.status(403).json(getProFeatureError("Hub files ranking"));
542
+ }
543
+ const requested = parseInt(req.query.top) || 10;
544
+ const graph = getGraphFn();
545
+ const hubs = (0, analyze_impact_1.getHubFiles)(graph, requested);
546
+ res.json({ hubs, totalFiles: graph.files.size, limited: false, plan: "pro" });
547
+ });
548
+ // POST /api/connected-code — Batch load code from file + connected nodes
549
+ app.post("/api/connected-code", (req, res) => {
550
+ const { file, maxFiles = 6, maxLinesPerFile = 80 } = req.body;
551
+ if (!file)
552
+ return res.status(400).json({ error: "file required" });
553
+ const graph = getGraphFn();
554
+ const resolved = resolveFilePath(file, graph.projectRoot, graph.sourceDir);
555
+ const toRel = (f) => path.relative(graph.sourceDir, f).replace(/\\/g, "/");
556
+ if (!graph.files.has(resolved)) {
557
+ return res.status(404).json({ error: `File not found: ${file}` });
558
+ }
559
+ // Gather: selected file + direct dependents + direct imports
560
+ const filesToLoad = [resolved];
561
+ const revDeps = graph.reverse.get(resolved) || [];
562
+ const fwdDeps = graph.forward.get(resolved) || [];
563
+ for (const d of [...revDeps, ...fwdDeps]) {
564
+ if (!filesToLoad.includes(d))
565
+ filesToLoad.push(d);
566
+ if (filesToLoad.length >= maxFiles)
567
+ break;
568
+ }
569
+ const results = [];
570
+ for (const f of filesToLoad) {
571
+ try {
572
+ const content = fs.readFileSync(f, "utf-8");
573
+ const allLines = content.split("\n");
574
+ const rel = toRel(f);
575
+ const { layer } = classifyFile(rel);
576
+ results.push({
577
+ path: rel,
578
+ layer,
579
+ lines: allLines.slice(0, maxLinesPerFile),
580
+ lineCount: allLines.length,
581
+ });
582
+ }
583
+ catch (_) { }
584
+ }
585
+ res.json({ files: results });
586
+ });
587
+ // GET /api/file-content/:file — Source code preview
588
+ app.get("/api/file-content/*splat", (req, res) => {
589
+ const splat = req.params.splat;
590
+ const fileParam = Array.isArray(splat) ? splat.join("/") : splat;
591
+ if (!fileParam)
592
+ return res.status(400).json({ error: "File path required" });
593
+ const graph = getGraphFn();
594
+ const resolved = resolveFilePath(fileParam, graph.projectRoot, graph.sourceDir);
595
+ if (!graph.files.has(resolved)) {
596
+ return res.status(404).json({ error: `File not found: ${fileParam}` });
597
+ }
598
+ try {
599
+ const content = fs.readFileSync(resolved, "utf-8");
600
+ const lines = content.split("\n");
601
+ res.json({
602
+ path: fileParam,
603
+ lineCount: lines.length,
604
+ content: lines.length > 500 ? lines.slice(0, 500).join("\n") + "\n// ... truncated ..." : content,
605
+ truncated: lines.length > 500,
606
+ });
607
+ }
608
+ catch (err) {
609
+ res.status(500).json({ error: err.message });
610
+ }
611
+ });
612
+ // GET /api/cycles — Detect circular dependencies (Pro only)
613
+ app.get("/api/cycles", (_req, res) => {
614
+ if (!isProPlan()) {
615
+ return res.status(403).json(getProFeatureError("Cycle detection"));
616
+ }
617
+ const graph = getGraphFn();
618
+ const toRel = (f) => path.relative(graph.sourceDir, f).replace(/\\/g, "/");
619
+ const cycles = [];
620
+ const visited = new Set();
621
+ const stack = new Set();
622
+ const parent = new Map();
623
+ function dfs(file, pathSoFar) {
624
+ if (cycles.length >= 50)
625
+ return; // cap
626
+ visited.add(file);
627
+ stack.add(file);
628
+ const deps = graph.forward.get(file) || [];
629
+ for (const dep of deps) {
630
+ if (stack.has(dep)) {
631
+ // Found cycle — extract it
632
+ const cycleStart = pathSoFar.indexOf(dep);
633
+ if (cycleStart >= 0) {
634
+ const cycle = pathSoFar.slice(cycleStart).map(toRel);
635
+ cycle.push(toRel(dep)); // close the loop
636
+ cycles.push(cycle);
637
+ }
638
+ }
639
+ else if (!visited.has(dep)) {
640
+ dfs(dep, [...pathSoFar, dep]);
641
+ }
642
+ }
643
+ stack.delete(file);
644
+ }
645
+ for (const file of graph.files) {
646
+ if (!visited.has(file)) {
647
+ dfs(file, [file]);
648
+ }
649
+ }
650
+ res.json({ cycles, count: cycles.length });
651
+ });
652
+ // GET /api/shortest-path?from=X&to=Y — BFS shortest path (follows forward edges)
653
+ app.get("/api/shortest-path", (req, res) => {
654
+ const fromParam = req.query.from;
655
+ const toParam = req.query.to;
656
+ if (!fromParam || !toParam)
657
+ return res.status(400).json({ error: "from and to required" });
658
+ const graph = getGraphFn();
659
+ const toRel = (f) => path.relative(graph.sourceDir, f).replace(/\\/g, "/");
660
+ const fromAbs = resolveFilePath(fromParam, graph.projectRoot, graph.sourceDir);
661
+ const toAbs = resolveFilePath(toParam, graph.projectRoot, graph.sourceDir);
662
+ if (!graph.files.has(fromAbs) || !graph.files.has(toAbs)) {
663
+ return res.status(404).json({ error: "File not found in graph" });
664
+ }
665
+ // BFS on combined forward + reverse (undirected shortest path)
666
+ const prev = new Map();
667
+ const visited = new Set();
668
+ const queue = [fromAbs];
669
+ visited.add(fromAbs);
670
+ let found = false;
671
+ while (queue.length > 0 && !found) {
672
+ const cur = queue.shift();
673
+ const neighbors = new Set();
674
+ (graph.forward.get(cur) || []).forEach(n => neighbors.add(n));
675
+ (graph.reverse.get(cur) || []).forEach(n => neighbors.add(n));
676
+ for (const nb of neighbors) {
677
+ if (!visited.has(nb)) {
678
+ visited.add(nb);
679
+ prev.set(nb, cur);
680
+ if (nb === toAbs) {
681
+ found = true;
682
+ break;
683
+ }
684
+ queue.push(nb);
685
+ }
686
+ }
687
+ }
688
+ if (!found)
689
+ return res.json({ path: [], distance: -1 });
690
+ // Reconstruct path
691
+ const pathResult = [];
692
+ let cur = toAbs;
693
+ while (cur) {
694
+ pathResult.unshift(toRel(cur));
695
+ cur = prev.get(cur);
696
+ }
697
+ res.json({ path: pathResult, distance: pathResult.length - 1 });
698
+ });
699
+ // GET /api/simulate-delete/:file — Simulate file removal (Pro only)
700
+ app.get("/api/simulate-delete/*splat", (req, res) => {
701
+ if (!isProPlan()) {
702
+ return res.status(403).json(getProFeatureError("Delete simulation"));
703
+ }
704
+ const splat = req.params.splat;
705
+ const fileParam = Array.isArray(splat) ? splat.join("/") : splat;
706
+ if (!fileParam)
707
+ return res.status(400).json({ error: "File path required" });
708
+ const graph = getGraphFn();
709
+ const resolved = resolveFilePath(fileParam, graph.projectRoot, graph.sourceDir);
710
+ const toRel = (f) => path.relative(graph.sourceDir, f).replace(/\\/g, "/");
711
+ if (!graph.files.has(resolved)) {
712
+ return res.status(404).json({ error: `File not found: ${fileParam}` });
713
+ }
714
+ // Files that directly import the deleted file → will have broken imports
715
+ const brokenImports = (graph.reverse.get(resolved) || []).map(toRel);
716
+ // Full cascade: all transitively affected files
717
+ const cascadeSet = new Set();
718
+ const queue = [...(graph.reverse.get(resolved) || [])];
719
+ for (const q of queue)
720
+ cascadeSet.add(q);
721
+ while (queue.length > 0) {
722
+ const cur = queue.shift();
723
+ for (const dep of (graph.reverse.get(cur) || [])) {
724
+ if (!cascadeSet.has(dep) && dep !== resolved) {
725
+ cascadeSet.add(dep);
726
+ queue.push(dep);
727
+ }
728
+ }
729
+ }
730
+ // Orphaned files: files that only had forward deps to the deleted file
731
+ const orphaned = [];
732
+ for (const dep of (graph.forward.get(resolved) || [])) {
733
+ const revDeps = graph.reverse.get(dep) || [];
734
+ // If the deleted file is the only one importing this dep
735
+ if (revDeps.length === 1 && revDeps[0] === resolved) {
736
+ orphaned.push(toRel(dep));
737
+ }
738
+ }
739
+ res.json({
740
+ deletedFile: fileParam,
741
+ brokenImports,
742
+ brokenCount: brokenImports.length,
743
+ cascadeFiles: [...cascadeSet].map(toRel),
744
+ cascadeCount: cascadeSet.size,
745
+ orphanedFiles: orphaned,
746
+ orphanedCount: orphaned.length,
747
+ severity: cascadeSet.size >= 20 ? "CRITICAL" : cascadeSet.size >= 10 ? "HIGH" : cascadeSet.size >= 5 ? "MEDIUM" : "LOW",
748
+ });
749
+ });
750
+ // GET /api/warnings — List unresolved warnings (for MCP/dashboard)
751
+ app.get("/api/warnings", (_req, res) => {
752
+ const unacked = getUnacknowledgedWarnings();
753
+ const all = getAllWarnings();
754
+ res.json({
755
+ unresolved: unacked,
756
+ unresolvedCount: unacked.length,
757
+ totalCount: all.length,
758
+ });
759
+ });
760
+ // POST /api/warnings/acknowledge — Mark all warnings as acknowledged
761
+ app.post("/api/warnings/acknowledge", (_req, res) => {
762
+ const count = acknowledgeWarnings();
763
+ res.json({ acknowledged: count });
764
+ });
765
+ // GET /api/project-info — Current project metadata
766
+ app.get("/api/project-info", (_req, res) => {
767
+ const graph = getGraphFn();
768
+ let edgeCount = 0;
769
+ for (const deps of graph.forward.values())
770
+ edgeCount += deps.length;
771
+ const license = getLicenseStatus?.();
772
+ // Read SYKE version from package.json
773
+ let sykeVersion = "unknown";
774
+ try {
775
+ const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, "..", "package.json"), "utf-8"));
776
+ sykeVersion = pkg.version || "unknown";
777
+ }
778
+ catch { }
779
+ // Read current license key (masked for display)
780
+ const rawKey = (0, config_1.getConfig)("licenseKey", "SYKE_LICENSE_KEY") || "";
781
+ const maskedKey = rawKey.length > 10
782
+ ? rawKey.substring(0, 9) + "····" + rawKey.substring(rawKey.length - 4)
783
+ : "";
784
+ const aiInfo = getAIInfoFn ? getAIInfoFn() : { activeProvider: "disabled", configured: { gemini: false, openai: false, anthropic: false }, forced: null };
785
+ res.json({
786
+ projectRoot: getProjectRoot ? getProjectRoot() : graph.projectRoot,
787
+ packageName: getPackageName ? getPackageName() : "",
788
+ languages: graph.languages,
789
+ fileCount: graph.files.size,
790
+ edgeCount,
791
+ plan: license?.plan || "free",
792
+ planSource: license?.source || "default",
793
+ expiresAt: license?.expiresAt || null,
794
+ licenseKey: maskedKey,
795
+ freeFileLimit: 50,
796
+ sykeVersion,
797
+ aiProvider: aiInfo.activeProvider,
798
+ aiKeys: aiInfo.configured,
799
+ aiProviderForced: aiInfo.forced,
800
+ });
801
+ });
802
+ // POST /api/set-license-key — Set or remove license key via dashboard
803
+ app.post("/api/set-license-key", async (req, res) => {
804
+ if (!setLicenseKeyFn) {
805
+ res.status(501).json({ success: false, error: "Not supported" });
806
+ return;
807
+ }
808
+ const { key } = req.body;
809
+ try {
810
+ const result = await setLicenseKeyFn(key || null);
811
+ res.json(result);
812
+ }
813
+ catch (err) {
814
+ res.status(500).json({ success: false, error: err.message || "Unknown error" });
815
+ }
816
+ });
817
+ // POST /api/set-ai-key — Set or remove an AI provider API key
818
+ app.post("/api/set-ai-key", (req, res) => {
819
+ if (!setAIKeyFn) {
820
+ res.status(501).json({ success: false, error: "Not supported" });
821
+ return;
822
+ }
823
+ const { provider, key } = req.body;
824
+ if (!provider || !["gemini", "openai", "anthropic"].includes(provider)) {
825
+ res.status(400).json({ success: false, error: "provider must be gemini, openai, or anthropic" });
826
+ return;
827
+ }
828
+ try {
829
+ const result = setAIKeyFn(provider, key || null);
830
+ res.json(result);
831
+ }
832
+ catch (err) {
833
+ res.status(500).json({ success: false, error: err.message || "Unknown error" });
834
+ }
835
+ });
836
+ // POST /api/set-ai-provider — Set or clear forced AI provider
837
+ app.post("/api/set-ai-provider", (req, res) => {
838
+ if (!setAIProviderFn) {
839
+ res.status(501).json({ success: false, error: "Not supported" });
840
+ return;
841
+ }
842
+ const { provider } = req.body;
843
+ if (!provider || !["gemini", "openai", "anthropic", "auto"].includes(provider)) {
844
+ res.status(400).json({ success: false, error: "provider must be gemini, openai, anthropic, or auto" });
845
+ return;
846
+ }
847
+ try {
848
+ const result = setAIProviderFn(provider);
849
+ res.json(result);
850
+ }
851
+ catch (err) {
852
+ res.status(500).json({ success: false, error: err.message || "Unknown error" });
853
+ }
854
+ });
855
+ // GET /api/browse-dirs — List subdirectories for folder browser
856
+ app.get("/api/browse-dirs", (req, res) => {
857
+ const dirPath = req.query.path || (process.platform === "win32" ? "C:\\" : "/");
858
+ const normalized = path.normalize(dirPath);
859
+ if (!fs.existsSync(normalized) || !fs.statSync(normalized).isDirectory()) {
860
+ return res.status(400).json({ error: `Not a directory: ${normalized}` });
861
+ }
862
+ try {
863
+ const entries = fs.readdirSync(normalized, { withFileTypes: true });
864
+ const dirs = entries
865
+ .filter(e => {
866
+ if (!e.isDirectory())
867
+ return false;
868
+ const name = e.name;
869
+ // Hide system/hidden dirs
870
+ if (name.startsWith(".") || name === "node_modules" || name === "$RECYCLE.BIN" || name === "System Volume Information")
871
+ return false;
872
+ return true;
873
+ })
874
+ .map(e => e.name)
875
+ .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
876
+ // Check if this looks like a project root (has package.json, pubspec.yaml, etc.)
877
+ const markers = ["package.json", "pubspec.yaml", "Cargo.toml", "go.mod", "pom.xml", "build.gradle", "CMakeLists.txt", "Makefile", "pyproject.toml", "setup.py"];
878
+ const isProject = markers.some(m => fs.existsSync(path.join(normalized, m)));
879
+ const detectedMarker = markers.find(m => fs.existsSync(path.join(normalized, m))) || null;
880
+ res.json({
881
+ current: normalized,
882
+ parent: path.dirname(normalized) !== normalized ? path.dirname(normalized) : null,
883
+ dirs,
884
+ isProject,
885
+ detectedMarker,
886
+ });
887
+ }
888
+ catch (err) {
889
+ res.status(500).json({ error: err.message });
890
+ }
891
+ });
892
+ // POST /api/switch-project — Switch to a different project folder (Pro only)
893
+ app.post("/api/switch-project", (req, res) => {
894
+ const { projectRoot } = req.body;
895
+ if (!projectRoot || typeof projectRoot !== "string") {
896
+ return res.status(400).json({ error: "projectRoot is required" });
897
+ }
898
+ const normalized = path.normalize(projectRoot);
899
+ // Free tier: only 1 project allowed — block switch to a different project
900
+ if (!isProPlan()) {
901
+ const currentRoot = getProjectRoot ? path.normalize(getProjectRoot()) : null;
902
+ if (currentRoot && normalized !== currentRoot) {
903
+ return res.status(403).json({
904
+ error: "Multiple projects require SYKE Pro. Free tier supports 1 project.",
905
+ upgrade: "https://syke.cloud/dashboard/",
906
+ });
907
+ }
908
+ }
909
+ if (!fs.existsSync(normalized) || !fs.statSync(normalized).isDirectory()) {
910
+ return res.status(400).json({ error: `Directory not found: ${normalized}` });
911
+ }
912
+ if (!switchProjectFn) {
913
+ return res.status(500).json({ error: "Switch project not supported" });
914
+ }
915
+ try {
916
+ const result = switchProjectFn(normalized);
917
+ broadcastSSE("project-switched", result);
918
+ res.json(result);
919
+ }
920
+ catch (err) {
921
+ res.status(500).json({ error: err.message || "Failed to switch project" });
922
+ }
923
+ });
924
+ return { app, setFileCache };
925
+ }