@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.
- package/dist/ai/analyzer.js +112 -1
- package/dist/ai/context-extractor.js +224 -1
- package/dist/ai/provider.js +186 -1
- package/dist/ai/realtime-analyzer.js +253 -1
- package/dist/config.js +121 -1
- package/dist/git/change-coupling.js +250 -1
- package/dist/graph/incremental.js +313 -1
- package/dist/graph/memo-cache.js +176 -1
- package/dist/graph/scc.js +206 -1
- package/dist/graph.d.ts +0 -3
- package/dist/graph.js +130 -1
- package/dist/index.js +813 -1
- package/dist/license/validator.js +344 -1
- package/dist/remote/proxy.d.ts +30 -0
- package/dist/remote/proxy.js +192 -0
- package/dist/remote/types.d.ts +70 -0
- package/dist/remote/types.js +8 -0
- package/dist/tools/analyze-impact.d.ts +5 -5
- package/dist/tools/analyze-impact.js +326 -1
- package/dist/tools/gate-build.d.ts +0 -3
- package/dist/tools/gate-build.js +361 -1
- package/dist/watcher/file-cache.js +281 -1
- package/dist/web/server.js +925 -1
- package/package.json +2 -3
- package/dist/scoring/pagerank.d.ts +0 -67
- package/dist/scoring/pagerank.js +0 -1
- package/dist/scoring/risk-scorer.d.ts +0 -99
- package/dist/scoring/risk-scorer.js +0 -1
|
@@ -1 +1,253 @@
|
|
|
1
|
-
'use strict';const _0x4ccec1=_0x310c;(function(_0x2853fa,_0x4fa9fa){const _0x2f68ba={_0x3bf68c:0x19e,_0x11d59d:0x15a,_0x5a455f:0x182,_0x589883:0x17e},_0x2abcc9=_0x310c,_0x2d45ea=_0x2853fa();while(!![]){try{const _0x5dde31=parseInt(_0x2abcc9(0x187))/0x1+parseInt(_0x2abcc9(0x1b2))/0x2*(-parseInt(_0x2abcc9(_0x2f68ba._0x3bf68c))/0x3)+parseInt(_0x2abcc9(_0x2f68ba._0x11d59d))/0x4*(parseInt(_0x2abcc9(0x178))/0x5)+parseInt(_0x2abcc9(0x14b))/0x6+parseInt(_0x2abcc9(_0x2f68ba._0x5a455f))/0x7+-parseInt(_0x2abcc9(_0x2f68ba._0x589883))/0x8+-parseInt(_0x2abcc9(0x1a8))/0x9;if(_0x5dde31===_0x4fa9fa)break;else _0x2d45ea['push'](_0x2d45ea['shift']());}catch(_0x53175e){_0x2d45ea['push'](_0x2d45ea['shift']());}}}(_0x315a,0x8e928));var __createBinding=this&&this['__createBinding']||(Object[_0x4ccec1(0x185)]?function(_0x3e9374,_0x5942c4,_0xb16ae0,_0x289e97){const _0x1981f6={_0x901c19:0x19b,_0x242a39:0x16d},_0xcfaf07=_0x4ccec1,_0x1a19e7={};_0x1a19e7[_0xcfaf07(_0x1981f6._0x901c19)]=function(_0x122ce7,_0x95dfd7){return _0x122ce7 in _0x95dfd7;},_0x1a19e7['dAhEp']='get';const _0x13aac1=_0x1a19e7;if(_0x289e97===undefined)_0x289e97=_0xb16ae0;var _0x24e8a5=Object['getOwnPropertyDescriptor'](_0x5942c4,_0xb16ae0);if(!_0x24e8a5||(_0x13aac1['fxThT'](_0x13aac1[_0xcfaf07(_0x1981f6._0x242a39)],_0x24e8a5)?!_0x5942c4['__esModule']:_0x24e8a5['writable']||_0x24e8a5[_0xcfaf07(0x15b)])){const _0x3f882e={};_0x3f882e['enumerable']=!![],_0x3f882e['get']=function(){return _0x5942c4[_0xb16ae0];},_0x24e8a5=_0x3f882e;}Object[_0xcfaf07(0x166)](_0x3e9374,_0x289e97,_0x24e8a5);}:function(_0x390c73,_0x43c4d8,_0x5e877b,_0x1c608b){const _0x9aa1f4=_0x4ccec1,_0x105070={};_0x105070[_0x9aa1f4(0x1af)]=function(_0xd842d4,_0x53d402){return _0xd842d4===_0x53d402;};const _0x4243ac=_0x105070;if(_0x4243ac[_0x9aa1f4(0x1af)](_0x1c608b,undefined))_0x1c608b=_0x5e877b;_0x390c73[_0x1c608b]=_0x43c4d8[_0x5e877b];}),__setModuleDefault=this&&this['__setModuleDefault']||(Object['create']?function(_0x3e3791,_0x223d04){const _0x167eae={_0x128c2:0x186},_0x20784c=_0x4ccec1,_0x161b6f={};_0x161b6f[_0x20784c(_0x167eae._0x128c2)]=!![],_0x161b6f['value']=_0x223d04,Object['defineProperty'](_0x3e3791,'default',_0x161b6f);}:function(_0x554cbf,_0x592279){const _0x212ced={_0xeaf241:0x1a3},_0x37d969=_0x4ccec1;_0x554cbf[_0x37d969(_0x212ced._0xeaf241)]=_0x592279;}),__importStar=this&&this['__importStar']||(function(){const _0x5b009a={_0x1405dd:0x194},_0x2f41dd={_0x1d3e95:0x170},_0x59011e={_0x43fcc7:0x156},_0x6cb637=_0x4ccec1,_0x3f2686={'xETUm':_0x6cb637(_0x5b009a._0x1405dd),'HWFIh':function(_0x35aff5,_0x456aa6,_0x37fe52){return _0x35aff5(_0x456aa6,_0x37fe52);},'OtbMR':function(_0x2e3b76,_0x347bd7){return _0x2e3b76!=_0x347bd7;},'ebMwZ':function(_0x1809f8,_0x3a186c){return _0x1809f8<_0x3a186c;},'eZuIT':function(_0x7c1ae0,_0x826982){return _0x7c1ae0!==_0x826982;},'uXaeM':function(_0x116f55,_0x401227,_0x494792,_0x1d5a47){return _0x116f55(_0x401227,_0x494792,_0x1d5a47);}};var _0x19fcc8=function(_0x2769f3){const _0x2f850b={_0x3e2409:0x151},_0x525e9b=_0x6cb637;return _0x19fcc8=Object[_0x525e9b(_0x59011e._0x43fcc7)]||function(_0x4b1c1a){const _0x50533e=_0x525e9b;var _0x1eca2f=[];for(var _0x39a1d5 in _0x4b1c1a)if(Object[_0x50533e(0x176)][_0x50533e(_0x2f850b._0x3e2409)][_0x50533e(0x19c)](_0x4b1c1a,_0x39a1d5))_0x1eca2f[_0x1eca2f[_0x50533e(0x193)]]=_0x39a1d5;return _0x1eca2f;},_0x19fcc8(_0x2769f3);};return function(_0x49a8d8){const _0x542454=_0x6cb637,_0x148a48=_0x3f2686['xETUm'][_0x542454(0x196)]('|');let _0x1761fc=0x0;while(!![]){switch(_0x148a48[_0x1761fc++]){case'0':if(_0x49a8d8&&_0x49a8d8['__esModule'])return _0x49a8d8;continue;case'1':_0x3f2686['HWFIh'](__setModuleDefault,_0x404afb,_0x49a8d8);continue;case'2':if(_0x3f2686['OtbMR'](_0x49a8d8,null)){for(var _0x1e7954=_0x19fcc8(_0x49a8d8),_0x3ae478=0x0;_0x3f2686[_0x542454(_0x2f41dd._0x1d3e95)](_0x3ae478,_0x1e7954[_0x542454(0x193)]);_0x3ae478++)if(_0x3f2686[_0x542454(0x158)](_0x1e7954[_0x3ae478],_0x542454(0x1a3)))_0x3f2686[_0x542454(0x18d)](__createBinding,_0x404afb,_0x49a8d8,_0x1e7954[_0x3ae478]);}continue;case'3':var _0x404afb={};continue;case'4':return _0x404afb;}break;}};}());const _0x4ccc03={};_0x4ccc03[_0x4ccec1(0x150)]=!![],Object['defineProperty'](exports,'__esModule',_0x4ccc03),exports[_0x4ccec1(0x1a4)]=analyzeChangeRealtime;const analyze_impact_1=require(_0x4ccec1(0x18b)),crypto=__importStar(require('crypto')),path=__importStar(require('path')),provider_1=require(_0x4ccec1(0x1b4)),context_extractor_1=require('./context-extractor'),analysisCache=new Map(),MAX_CACHE_SIZE=0x64;function computeContentHash(_0x4d9372,_0x281d75){const _0x28302a={_0x272084:0x195,_0x40ded3:0x184},_0x3dd157=_0x4ccec1,_0xa70ab2={};_0xa70ab2['ThHUR']='md5',_0xa70ab2['BVXhj']=function(_0x29b548,_0x107f4f){return _0x29b548+_0x107f4f;},_0xa70ab2['UQgcU']=function(_0x13d67d,_0x10b463){return _0x13d67d||_0x10b463;},_0xa70ab2[_0x3dd157(0x152)]='\x0a---\x0a',_0xa70ab2['ieLNq']='hex';const _0x4bab28=_0xa70ab2;return crypto[_0x3dd157(0x17b)](_0x4bab28[_0x3dd157(_0x28302a._0x272084)])[_0x3dd157(0x1b3)](_0x4bab28[_0x3dd157(0x184)](_0x4bab28[_0x3dd157(_0x28302a._0x40ded3)](_0x4bab28['UQgcU'](_0x4d9372,''),_0x4bab28['lgvwY']),_0x281d75))['digest'](_0x4bab28[_0x3dd157(0x1b9)]);}function evictOldestCacheEntry(){const _0x5bbbb4={_0x2a6452:0x153},_0x1d8acb=_0x4ccec1;let _0x3e532b=null,_0x1e54c2=Infinity;for(const [_0x243f0f,_0x65ec04]of analysisCache){_0x65ec04['insertedAt']<_0x1e54c2&&(_0x1e54c2=_0x65ec04['insertedAt'],_0x3e532b=_0x243f0f);}if(_0x3e532b)analysisCache[_0x1d8acb(_0x5bbbb4._0x2a6452)](_0x3e532b);}const RATE_LIMIT_MAX=0xa,RATE_LIMIT_WINDOW_MS=0xea60,callTimestamps=[];function isRateLimited(){const _0x3fb2d6={_0x5d15d7:0x15d,_0x2d8a87:0x1b8,_0x4b82d3:0x193},_0x44a98f=_0x4ccec1,_0x40f5cb={};_0x40f5cb[_0x44a98f(_0x3fb2d6._0x5d15d7)]=function(_0x1d467a,_0x3d62cf){return _0x1d467a<=_0x3d62cf;},_0x40f5cb[_0x44a98f(_0x3fb2d6._0x2d8a87)]=function(_0x590181,_0x560293){return _0x590181-_0x560293;};const _0x301080=_0x40f5cb,_0x500fd6=Date['now']();while(callTimestamps[_0x44a98f(_0x3fb2d6._0x4b82d3)]>0x0&&_0x301080['WlfnF'](callTimestamps[0x0],_0x301080[_0x44a98f(0x1b8)](_0x500fd6,RATE_LIMIT_WINDOW_MS))){callTimestamps[_0x44a98f(0x14c)]();}return callTimestamps[_0x44a98f(0x193)]>=RATE_LIMIT_MAX;}function recordCall(){const _0x1cff3f=_0x4ccec1;callTimestamps['push'](Date[_0x1cff3f(0x1bc)]());}function _0x315a(){const _0x2b4894=['nZeYodaXyMzOqunA','ww91igfYzsbHihnLBMLVCIbMDwXSlxn0ywnRigfYy2HPDgvJDcbHBMqGy29KzsbPBxbHy3qGBw9UAxrVCMLUzYbbssb3AxrOidiWihLLyxjZig9Migv4CgvYAwvUy2uUcLjVBgu6ierLDgvJDcbWB3rLBNrPywWGzxjYB3jZigfUzcbJyxnJywrPBMCGAw1Wywn0CYbIzwzVCMuGyNvPBgqGD2HLBIbMAwXLCYbHCMuGBw9KAwzPzwqVywrKzwqVzgvSzxrLzc4kcKfUywX5C2LZihbYAw5JAxbSzxm6cJeUiejYB2TLBIbPBxbVCNrZl2v4Cg9YDhm6ienOzwnRigLMigrLBgv0zwqVCMvUyw1LzcbJBgfZC2vZl2z1BMn0Aw9UCY92yxjPywjSzxmGyxjLihjLzMvYzw5JzwqGAw4GB3rOzxiGzMLSzxmkmI4GvhLWzsbTAxnTyxrJAgvZoIbwzxjPzNKGCgfYyw1LDgvYihr5CgvZigfUzcbYzxr1CM4GDhLWzsbJAgfUz2vZig1HDgnOignHBgWGC2L0zxmkmY4Gu3rHDguGBwfUywDLBwvUDcbJyxnJywrLoIbjBxbHy3qGB2yGuhjVDMLKzxiVtM90AwzPzxiGy2HHBMDLCYbVBIbvssbHBMqGyNvZAw5LC3mGBg9NAwmknc4GuM91DgLUzYbPBxbHy3q6ievMzMvJDcbVzIbYB3v0zs9WyxjHBwv0zxiGy2HHBMDLCYbVBIbUyxzPz2f0Aw9UcJuUie1PC3nPBMCGAw5PDgLHBgL6yxrPB246ifDOzxrOzxiGBMv3BhKGywrKzwqGuhjVDMLKzxjZigfYzsbWCM9WzxjSEsbYzwDPC3rLCMvKcGPszxnWB25ZzsbMB3jTyxqGkg11C3qGyMuGsLnptIK6cNSkicaICMLZA0XLDMvSiJOGiKnssvrjq0fmFeHjr0H8tuvesvvnFeXpv3XtquzfiIWkicaIC3vTBwfYEsi6icjpBMuTBgLUzsbZDw1Tyxj5iIWkicaIyNjVA2vUsw1WB3j0CYi6ifSItgLZDcbVzIbWB3rLBNrPywXSEsbICM9Rzw4GAw1WB3j0CYjDlaOGicjZAwrLrwzMzwn0CYi6ifSItgLZDcbVzIbLEhbLy3rLzcbZAwrLigvMzMvJDhmIxsWkicaID2fYBMLUz3mIoIbBiKXPC3qGB2yGD2fYBMLUz3mIxsWkicaIC3vNz2vZDgLVBIi6icjszwnVBw1LBMrLzcbHy3rPB24IcN0kcKnssvrjq0fmoIbcDwLSzcbMywLSDxjLignLCNrHAw4kseLhsdOGuNvUDgLTzsbLCNjVCIbWB3nZAwjSzqPnrurjvu06iejLAgf2Aw9YignOyw5NzsbWB3nZAwjSzqPmt1C6ie1PBM9YigLTCgfJDaPtquzfoIbtywzLignOyw5NzqOkuMvZCg9Uzcb3AxrOiePtt04GB25SEs4GtM8GzxHWBgfUyxrVCNKGDgv4DcWGANvZDcbWDxjLiePtt04U','z2v0','cLbYB2PLy3qGBgfUz3vHz2vZoIa','lI4VDg9VBhmVyw5HBhL6zs1PBxbHy3q','vu53ywC','DvHHzu0','tM8Gy29UBMvJDgvKigzPBgvZ','A3b0qKu','BwvZC2fNzq','iYmGq29UBMvJDgvKigzPBgvZicG','C2L6zq','BgvUz3rO','mhWZFdj8mxW0','vgHivvi','C3bSAxq','FIbm','w3n5A2u6ywLDifjHDguGBgLTAxqGCMvHy2HLzcaO','BgLUzq','CLfxDK0','zNHuAfq','y2fSBa','u2jpANi','mZzyA2nQCKy','cIaG4OAsicaGicaGia','qw5HBhLZAxmGy29TCgXLDgu','cMbGya','DhLWzq','zgvMyxvSDa','yw5HBhL6zunOyw5NzvjLywX0Aw1L','cKnOyw5Nzsb0ExbLoIa','BMv3','B2XKu2LNBMf0DxjL','mJy5nJy5n2LTBgPlwq','CMv2zxjZzq','tuvesvvn','CMvSyxrPDMvqyxrO','w3n5A2u6ywLDiefUywX5C2LZigvYCM9YigzVCIa','yNjVA2vUsw1WB3j0CW','yw5HBhL6zuLTCgfJDa','sxPVq3u','BMv3q29UDgvUDa','CMvWBgfJzq','mtiZnJCWEfHvD0Xy','DxbKyxrL','lI9WCM92AwrLCG','ktOkygbGcG','rMLSzsbKzwXLDgvKlIbqCMv2Aw91CYbJB250zw50oGPGyga','yNnlzfu','BKT5Egi','AwvmtNe','cGPbBMfSExPLihrOzsbPBxbHy3qGB2yGDgHPCYbJAgfUz2uGB24GDgHLihbYB2PLy3qU','cKfMzMvJDgvKigzPBgvZoIa','BM93','igzPBgvZigLTCgfJDgvK','BwfW','ntK4odC2ohHtDgPmAW','C2HPzNq','B2XKq29UDgvUDa','CMLZA0XLDMvS','twfUDwfSihjLDMLLDYbYzxf1AxjLza','DMfSDwu','AgfZt3DUuhjVCgvYDhK','BgD2D1K','zgvSzxrL','kYbm','zMLSzq','z2v0t3DUuhjVCgvYDhLoyw1LCW','zgLMzG','zvP1svq','BM9YBwfSAxPL','otq2mtK2zNbetfjZ','y29UzMLNDxjHyMXL','iokaLcbZA2LWCgLUzYbbssbJywXS','v2XMBKy','v2fPDcbHig1VBwvUDcbMB3iGquKGyw5HBhLZAxmGDg8GCMvZDw1L','C291CMnLrgLY','D2fYBMLUz3m','C2XPy2u','AM9PBG','quKGyw5HBhLZAxmGzxjYB3i6ia','zgLMzLnPz25HDhvYzxm','tMv3igzPBguGywrKzwq6cMbGya','zgvMAw5LuhjVCgvYDhK','cI0GuMvTB3zLzdOG','BgfUz3vHz2vZ','wuXTuKG','rfjlzLm','cGOJiYmGu3rYDwn0DxjHBcbJAgfUz2vZicHZAwDUyxr1CMuGzgLMzIK','yNvPBgrtBwfYDenVBNrLEhq','zefOrxa','BMv3u2LNBMf0DxjL','iokgKIa','zwjnD1O','l21PBIKG4OcuihnRAxbWAw5NiefjigzVCIa','C3Djve0','w3n5A2u6ywLDienHy2HLigHPDcbMB3iG','cISGqwrKzwq6ia','zgLYzwn0rgvWzw5Kzw50CW','ChjVDg90ExbL','q2HHBMDLzcbSAw5LCYaODg9WidmWig9Mia','nxD1CK9jyq','CMvZDwX0','quKGyw5HBhLZAxmGzMfPBgvKiokaLcbNCMfWAc1IyxnLzcbHBMfSExnPCZOG','y3jLyxrLsgfZAa','uMf0zsbSAw1PDgvKiokaLcbNCMfWAc1IyxnLzcbHBMfSExnPCZOG','iYmJia','nJeWmJa2neriCg5NAW','y2HHBMDLvhLWzq','te9x','z2v0quLqCM92AwrLCG','mZa4nJm2m2rZs2n2sa','iYmGrMLSzsbJAgfUz2uGzgv0zwn0zwq6ia','qLzyAgO','y3jLyxrL','zw51BwvYywjSzq'];_0x315a=function(){return _0x2b4894;};return _0x315a();}function _0x310c(_0x31a3d2,_0x384bbe){_0x31a3d2=_0x31a3d2-0x149;const _0x315aab=_0x315a();let _0x310c05=_0x315aab[_0x31a3d2];if(_0x310c['BlnuQZ']===undefined){var _0x24f8f5=function(_0x45c023){const _0x2955d6='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x51b8fb='',_0x42c11d='';for(let _0x44dcfa=0x0,_0x24b930,_0x20b58d,_0x21e8f7=0x0;_0x20b58d=_0x45c023['charAt'](_0x21e8f7++);~_0x20b58d&&(_0x24b930=_0x44dcfa%0x4?_0x24b930*0x40+_0x20b58d:_0x20b58d,_0x44dcfa++%0x4)?_0x51b8fb+=String['fromCharCode'](0xff&_0x24b930>>(-0x2*_0x44dcfa&0x6)):0x0){_0x20b58d=_0x2955d6['indexOf'](_0x20b58d);}for(let _0x54e673=0x0,_0x1a7d90=_0x51b8fb['length'];_0x54e673<_0x1a7d90;_0x54e673++){_0x42c11d+='%'+('00'+_0x51b8fb['charCodeAt'](_0x54e673)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x42c11d);};_0x310c['RbDOSb']=_0x24f8f5,_0x310c['trSmrb']={},_0x310c['BlnuQZ']=!![];}const _0x42f91f=_0x315aab[0x0],_0x30d9b2=_0x31a3d2+_0x42f91f,_0x1ee9ef=_0x310c['trSmrb'][_0x30d9b2];return!_0x1ee9ef?(_0x310c05=_0x310c['RbDOSb'](_0x310c05),_0x310c['trSmrb'][_0x30d9b2]=_0x310c05):_0x310c05=_0x1ee9ef,_0x310c05;}function getSystemPrompt(){const _0x292b69={_0x1bdc53:0x188},_0x4725ab=_0x4ccec1;return _0x4725ab(_0x292b69._0x1bdc53);}async function analyzeChangeRealtime(_0x46c033,_0x3ab22c,_0x4c432e){const _0x207440={_0x2ddb34:0x180,_0x487984:0x14f,_0x9b3c8c:0x1ab,_0x533fbd:0x159,_0x41936e:0x1ae,_0xf8ff12:0x175,_0x827f62:0x161,_0x3ee8f2:0x15f,_0x27adee:0x1b1,_0x3f5660:0x16c,_0x312a73:0x17d,_0x35dd7f:0x162,_0x39d29c:0x165,_0x4dd32b:0x1a1,_0x33deb4:0x161,_0x21754d:0x177,_0x5325cb:0x157,_0x44f481:0x1b5,_0x35050f:0x14d,_0x19a6af:0x16b,_0x2254cb:0x19d,_0x551135:0x1b7,_0x53c812:0x174,_0x89ce99:0x16e,_0x384535:0x167,_0x526724:0x1a7,_0x17e757:0x16c,_0xcbe7bf:0x18a,_0x10a09a:0x1bb,_0x3afe6f:0x169,_0x353bf2:0x173,_0x193ec2:0x198,_0x3f3e01:0x171,_0x13d10f:0x18c,_0x16f5b4:0x18c,_0x3605df:0x1bc,_0x2a7d62:0x14e,_0x5895a3:0x192,_0xfb62c5:0x1ac,_0x28f1a4:0x17a,_0x83fc52:0x190,_0x3c03f0:0x16a},_0x152b23=_0x4ccec1,_0x1e5eb0={'bsKdU':'added','YDyCD':function(_0x2f0ad0,_0x86ae04){return _0x2f0ad0===_0x86ae04;},'swITM':'removed','WlxRq':'text','RZIrP':function(_0xc8ecb1,_0x27b87a){return _0xc8ecb1(_0x27b87a);},'swbmw':'deleted','kptBE':function(_0x45187e,_0x48915d){return _0x45187e===_0x48915d;},'hXkYC':function(_0x1ce55e,_0x63e8cc){return _0x1ce55e>_0x63e8cc;},'SbOjr':function(_0x3af8c6,_0x23165e){return _0x3af8c6===_0x23165e;},'qGbhi':function(_0x383ce8,_0x2d5b56){return _0x383ce8===_0x2d5b56;},'nJTDa':function(_0x706b82,_0x49d8c4){return _0x706b82>_0x49d8c4;},'YLmRH':_0x152b23(0x18e),'Imrqw':function(_0x23aa29){return _0x23aa29();},'yBtJe':function(_0x3390c6,_0x12b712){return _0x3390c6-_0x12b712;},'UNwag':function(_0x571510,_0x488372){return _0x571510>=_0x488372;},'lqazO':'HIGH','IwjsG':_0x152b23(_0x207440._0x2ddb34),'rQWvM':function(_0x53c881,_0x19b2e8){return _0x53c881-_0x19b2e8;},'Przja':function(_0x1d2150,_0x2c935e){return _0x1d2150>=_0x2c935e;},'nNWwi':_0x152b23(0x1aa),'DRKfS':_0x152b23(_0x207440._0x487984)},_0x3e7742=Date['now'](),_0x96a420=_0x46c033[_0x152b23(_0x207440._0x9b3c8c)],_0x490b2d=_0x3ab22c[_0x152b23(0x168)][0x0]||_0x1e5eb0['WlxRq'],_0x1562e4=path[_0x152b23(_0x207440._0x533fbd)](path['join'](_0x3ab22c[_0x152b23(0x15f)],_0x96a420));let _0x459384=[];if(_0x3ab22c['files']['has'](_0x1562e4)){const _0x295376=await(0x0,analyze_impact_1[_0x152b23(_0x207440._0x41936e)])(_0x1562e4,_0x3ab22c);_0x459384=[..._0x295376[_0x152b23(_0x207440._0xf8ff12)],..._0x295376['transitiveDependents']];}const _0x25dc39=[],_0x308a1b=_0x3ab22c[_0x152b23(0x1a9)][_0x152b23(0x189)](_0x1562e4)||[],_0x51f949=_0x3ab22c['forward']['get'](_0x1562e4)||[],_0x2f0762=[...new Set([..._0x308a1b,..._0x51f949])][_0x152b23(_0x207440._0x827f62)](0x0,0x5);for(const _0x1d07fd of _0x2f0762){const _0x10f406=path['relative'](_0x3ab22c[_0x152b23(_0x207440._0x3ee8f2)],_0x1d07fd)[_0x152b23(_0x207440._0x27adee)](/\\/g,'/'),_0x592850=_0x1e5eb0['RZIrP'](_0x4c432e,_0x10f406);if(_0x592850){const _0x3cf7b0=(0x0,context_extractor_1[_0x152b23(_0x207440._0x3f5660)])(_0x592850,_0x490b2d);_0x25dc39['push'](_0x152b23(_0x207440._0x312a73)+_0x10f406+'\x0a```'+_0x490b2d+'\x0a'+_0x3cf7b0+'\x0a```');}}let _0x5a2332='';if(_0x46c033['type']===_0x1e5eb0['swbmw'])_0x5a2332=_0x152b23(0x1b6)+_0x490b2d+'\x0a'+(_0x46c033['oldContent']||'')['split']('\x0a')[_0x152b23(0x161)](0x0,0x28)[_0x152b23(_0x207440._0x35dd7f)]('\x0a')+'\x0a```';else{if(_0x1e5eb0[_0x152b23(0x18f)](_0x46c033['type'],'added')){const _0x2145e5=(0x0,context_extractor_1['buildSmartContext'])(_0x46c033['newContent']||'',_0x490b2d);_0x5a2332=_0x152b23(_0x207440._0x39d29c)+_0x490b2d+'\x0a'+_0x2145e5+_0x152b23(_0x207440._0x4dd32b);}else{const _0x24c596=_0x46c033['diff'][_0x152b23(_0x207440._0x33deb4)](0x0,0x1e)[_0x152b23(0x14a)](_0x20f2c1=>{const _0x380d28=_0x152b23;if(_0x20f2c1['type']===_0x1e5eb0[_0x380d28(0x1b7)])return _0x380d28(0x154)+_0x20f2c1['line']+':\x20'+_0x20f2c1['new'];if(_0x1e5eb0['YDyCD'](_0x20f2c1['type'],_0x1e5eb0[_0x380d28(0x172)]))return'-\x20L'+_0x20f2c1['line']+':\x20'+_0x20f2c1['old'];return _0x380d28(0x197)+_0x20f2c1[_0x380d28(0x199)]+':\x20'+_0x20f2c1['old']+_0x380d28(0x16f)+_0x20f2c1[_0x380d28(0x1a6)];});_0x5a2332=_0x152b23(_0x207440._0x21754d)+_0x46c033[_0x152b23(_0x207440._0x5325cb)]['length']+_0x152b23(_0x207440._0x44f481)+_0x24c596[_0x152b23(_0x207440._0x35dd7f)]('\x0a')+_0x152b23(0x1a1);if(_0x46c033[_0x152b23(_0x207440._0x35050f)]&&_0x46c033['newContent']){const _0x33fe5f=(0x0,context_extractor_1[_0x152b23(0x164)])(_0x46c033[_0x152b23(_0x207440._0x35050f)],_0x46c033['newContent'],_0x490b2d);if(_0x1e5eb0['hXkYC'](_0x33fe5f[_0x152b23(0x193)],0x0)){_0x5a2332+=_0x152b23(_0x207440._0x19a6af);for(const _0x342d7d of _0x33fe5f){if(_0x1e5eb0[_0x152b23(_0x207440._0x2254cb)](_0x342d7d[_0x152b23(0x1a2)],_0x1e5eb0[_0x152b23(_0x207440._0x551135)]))_0x5a2332+=_0x152b23(_0x207440._0x53c812)+_0x342d7d[_0x152b23(_0x207440._0x89ce99)];else _0x1e5eb0['qGbhi'](_0x342d7d['type'],_0x1e5eb0[_0x152b23(0x172)])?_0x5a2332+=_0x152b23(_0x207440._0x384535)+_0x342d7d['oldSignature']:_0x5a2332+='\x0a~\x20Changed:\x20'+_0x342d7d[_0x152b23(_0x207440._0x526724)]+_0x152b23(0x19f)+_0x342d7d[_0x152b23(0x16e)];}}}if(_0x46c033[_0x152b23(0x1b0)]){const _0x5dea3f=(0x0,context_extractor_1[_0x152b23(_0x207440._0x17e757)])(_0x46c033[_0x152b23(0x1b0)],_0x490b2d);_0x5a2332+='\x0a\x0aFull\x20file\x20after\x20modification:\x0a```'+_0x490b2d+'\x0a'+_0x5dea3f+'\x0a```';}}}const _0x5291ab=_0x152b23(0x183)+_0x96a420+_0x152b23(0x1a5)+_0x46c033['type']['toUpperCase']()+_0x152b23(_0x207440._0xcbe7bf)+(_0x3ab22c['languages'][_0x152b23(_0x207440._0x35dd7f)](',\x20')||'unknown')+_0x152b23(_0x207440._0x10a09a)+_0x459384['length']+'\x0a\x0a'+_0x5a2332+'\x0a\x0a'+(_0x1e5eb0['nJTDa'](_0x25dc39['length'],0x0)?_0x152b23(0x191)+_0x25dc39['length']+')\x0a'+_0x25dc39[_0x152b23(0x162)]('\x0a\x0a'):_0x1e5eb0[_0x152b23(_0x207440._0x3afe6f)])+_0x152b23(0x1ba),_0x2d578a=_0x46c033[_0x152b23(0x157)]['map'](_0x434aef=>_0x434aef[_0x152b23(0x1a2)]+':'+_0x434aef['line']+':'+(_0x434aef['old']||'')+':'+(_0x434aef['new']||''))['join']('|'),_0x3c2ccb=computeContentHash(_0x46c033['newContent'],_0x2d578a),_0x1e5e84=analysisCache['get'](_0x96a420);if(_0x1e5e84&&_0x1e5eb0['SbOjr'](_0x1e5e84['hash'],_0x3c2ccb)){console['error'](_0x152b23(_0x207440._0x353bf2)+_0x96a420+_0x152b23(0x15c));const _0x576614={..._0x1e5e84[_0x152b23(0x179)]};return _0x576614['timestamp']=_0x46c033['timestamp'],_0x576614['analysisMs']=0x0,_0x576614;}if(_0x1e5eb0['Imrqw'](isRateLimited)){const _0xfa3bbf=_0x1e5eb0['yBtJe'](Date[_0x152b23(0x1bc)](),_0x3e7742);return console['error'](_0x152b23(_0x207440._0x193ec2)+RATE_LIMIT_MAX+_0x152b23(_0x207440._0x3f3e01)+_0x96a420),{'file':_0x96a420,'changeType':_0x46c033[_0x152b23(0x1a2)],'timestamp':_0x46c033['timestamp'],'riskLevel':_0x1e5eb0[_0x152b23(_0x207440._0x13d10f)](_0x459384[_0x152b23(0x193)],0xa)?_0x1e5eb0['lqazO']:_0x1e5eb0[_0x152b23(_0x207440._0x16f5b4)](_0x459384['length'],0x5)?'MEDIUM':_0x1e5eb0['IwjsG'],'summary':_0x152b23(0x17c)+_0x459384[_0x152b23(0x193)]+_0x152b23(0x149),'brokenImports':[],'sideEffects':[],'warnings':['AI\x20analysis\x20skipped:\x20rate\x20limit\x20(10\x20calls/min)'],'suggestion':_0x152b23(0x15e),'affectedNodes':_0x459384,'analysisMs':_0xfa3bbf};}try{const _0xa9a7d5=(0x0,provider_1[_0x152b23(0x181)])();if(!_0xa9a7d5)throw new Error('No\x20AI\x20provider\x20available\x20(set\x20GEMINI_KEY,\x20OPENAI_KEY,\x20or\x20ANTHROPIC_KEY)');recordCall();const _0x4a1530=await _0xa9a7d5['analyzeJSON'](getSystemPrompt(),_0x5291ab),_0x64be6e=Date[_0x152b23(_0x207440._0x3605df)]()-_0x3e7742,_0xc17c62={};_0xc17c62[_0x152b23(0x155)]=_0x96a420,_0xc17c62[_0x152b23(0x17f)]=_0x46c033[_0x152b23(0x1a2)],_0xc17c62['timestamp']=_0x46c033['timestamp'],_0xc17c62[_0x152b23(_0x207440._0x2a7d62)]=_0x4a1530['riskLevel']||_0x152b23(0x180),_0xc17c62['summary']=_0x4a1530['summary']||_0x152b23(0x1a0),_0xc17c62[_0x152b23(0x1ad)]=_0x4a1530['brokenImports']||[],_0xc17c62['sideEffects']=_0x4a1530['sideEffects']||[],_0xc17c62[_0x152b23(0x160)]=_0x4a1530[_0x152b23(0x160)]||[],_0xc17c62['suggestion']=_0x4a1530['suggestion']||'',_0xc17c62['affectedNodes']=_0x459384,_0xc17c62['analysisMs']=_0x64be6e;const _0x51c146=_0xc17c62;if(analysisCache[_0x152b23(_0x207440._0x5895a3)]>=MAX_CACHE_SIZE)evictOldestCacheEntry();return analysisCache['set'](_0x96a420,{'hash':_0x3c2ccb,'result':_0x51c146,'insertedAt':Date['now']()}),_0x51c146;}catch(_0x4b3deb){const _0x19b965=_0x1e5eb0[_0x152b23(0x19a)](Date[_0x152b23(0x1bc)](),_0x3e7742);return console['error'](_0x152b23(_0x207440._0xfb62c5)+_0x96a420+':\x20'+_0x4b3deb['message']),{'file':_0x96a420,'changeType':_0x46c033['type'],'timestamp':_0x46c033['timestamp'],'riskLevel':_0x1e5eb0['Przja'](_0x459384['length'],0xa)?_0x1e5eb0['lqazO']:_0x459384['length']>=0x5?_0x1e5eb0['nNWwi']:_0x152b23(0x180),'summary':_0x152b23(_0x207440._0x28f1a4)+_0x459384[_0x152b23(0x193)]+_0x152b23(0x149),'brokenImports':[],'sideEffects':[],'warnings':[_0x152b23(0x163)+_0x4b3deb[_0x152b23(_0x207440._0x83fc52)]],'suggestion':_0x1e5eb0[_0x152b23(_0x207440._0x3c03f0)],'affectedNodes':_0x459384,'analysisMs':_0x19b965};}}
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.analyzeChangeRealtime = analyzeChangeRealtime;
|
|
37
|
+
const analyze_impact_1 = require("../tools/analyze-impact");
|
|
38
|
+
const crypto = __importStar(require("crypto"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const provider_1 = require("./provider");
|
|
41
|
+
const context_extractor_1 = require("./context-extractor");
|
|
42
|
+
const analysisCache = new Map();
|
|
43
|
+
const MAX_CACHE_SIZE = 100;
|
|
44
|
+
function computeContentHash(content, diff) {
|
|
45
|
+
return crypto.createHash("md5").update((content || "") + "\n---\n" + diff).digest("hex");
|
|
46
|
+
}
|
|
47
|
+
function evictOldestCacheEntry() {
|
|
48
|
+
let oldestKey = null;
|
|
49
|
+
let oldestTime = Infinity;
|
|
50
|
+
for (const [key, entry] of analysisCache) {
|
|
51
|
+
if (entry.insertedAt < oldestTime) {
|
|
52
|
+
oldestTime = entry.insertedAt;
|
|
53
|
+
oldestKey = key;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (oldestKey)
|
|
57
|
+
analysisCache.delete(oldestKey);
|
|
58
|
+
}
|
|
59
|
+
// ── Rate limiter: max 10 AI calls per minute (sliding window) ──
|
|
60
|
+
const RATE_LIMIT_MAX = 10;
|
|
61
|
+
const RATE_LIMIT_WINDOW_MS = 60000;
|
|
62
|
+
const callTimestamps = [];
|
|
63
|
+
function isRateLimited() {
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
// Remove timestamps outside the window
|
|
66
|
+
while (callTimestamps.length > 0 && callTimestamps[0] <= now - RATE_LIMIT_WINDOW_MS) {
|
|
67
|
+
callTimestamps.shift();
|
|
68
|
+
}
|
|
69
|
+
return callTimestamps.length >= RATE_LIMIT_MAX;
|
|
70
|
+
}
|
|
71
|
+
function recordCall() {
|
|
72
|
+
callTimestamps.push(Date.now());
|
|
73
|
+
}
|
|
74
|
+
function getSystemPrompt() {
|
|
75
|
+
return `You are a senior full-stack architect and code impact monitoring AI with 20 years of experience.
|
|
76
|
+
Role: Detect potential errors and cascading impacts before build when files are modified/added/deleted.
|
|
77
|
+
|
|
78
|
+
Analysis principles:
|
|
79
|
+
1. Broken imports/exports: Check if deleted/renamed classes/functions/variables are referenced in other files
|
|
80
|
+
2. Type mismatches: Verify parameter types and return type changes match call sites
|
|
81
|
+
3. State management cascade: Impact of Provider/Notifier changes on UI and business logic
|
|
82
|
+
4. Routing impact: Effect of route/parameter changes on navigation
|
|
83
|
+
5. Missing initialization: Whether newly added Providers are properly registered
|
|
84
|
+
|
|
85
|
+
Response format (must be JSON):
|
|
86
|
+
{
|
|
87
|
+
"riskLevel": "CRITICAL|HIGH|MEDIUM|LOW|SAFE",
|
|
88
|
+
"summary": "One-line summary",
|
|
89
|
+
"brokenImports": ["List of potentially broken imports"],
|
|
90
|
+
"sideEffects": ["List of expected side effects"],
|
|
91
|
+
"warnings": ["List of warnings"],
|
|
92
|
+
"suggestion": "Recommended action"
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
CRITICAL: Build failure certain
|
|
96
|
+
HIGH: Runtime error possible
|
|
97
|
+
MEDIUM: Behavior change possible
|
|
98
|
+
LOW: Minor impact
|
|
99
|
+
SAFE: Safe change
|
|
100
|
+
|
|
101
|
+
Respond with JSON only. No explanatory text, just pure JSON.`;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Analyze a file change in real-time using the configured AI provider.
|
|
105
|
+
* Receives the diff + connected files context from memory cache.
|
|
106
|
+
*/
|
|
107
|
+
async function analyzeChangeRealtime(change, graph, getFileContent) {
|
|
108
|
+
const start = Date.now();
|
|
109
|
+
const relPath = change.relativePath;
|
|
110
|
+
const codeBlockLang = graph.languages[0] || "text";
|
|
111
|
+
// Get impacted files from graph
|
|
112
|
+
const absPath = path.normalize(path.join(graph.sourceDir, relPath));
|
|
113
|
+
let affectedNodes = [];
|
|
114
|
+
if (graph.files.has(absPath)) {
|
|
115
|
+
const impact = await (0, analyze_impact_1.analyzeImpact)(absPath, graph);
|
|
116
|
+
affectedNodes = [...impact.directDependents, ...impact.transitiveDependents];
|
|
117
|
+
}
|
|
118
|
+
// Build context: changed file + top 5 connected files' smart context
|
|
119
|
+
const connectedFiles = [];
|
|
120
|
+
const revDeps = graph.reverse.get(absPath) || [];
|
|
121
|
+
const fwdDeps = graph.forward.get(absPath) || [];
|
|
122
|
+
const connected = [...new Set([...revDeps, ...fwdDeps])].slice(0, 5);
|
|
123
|
+
for (const dep of connected) {
|
|
124
|
+
const depRel = path.relative(graph.sourceDir, dep).replace(/\\/g, "/");
|
|
125
|
+
const content = getFileContent(depRel);
|
|
126
|
+
if (content) {
|
|
127
|
+
const smartCtx = (0, context_extractor_1.buildSmartContext)(content, codeBlockLang);
|
|
128
|
+
connectedFiles.push(`### ${depRel}\n\`\`\`${codeBlockLang}\n${smartCtx}\n\`\`\``);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Build diff summary with signature changes
|
|
132
|
+
let diffSummary = "";
|
|
133
|
+
if (change.type === "deleted") {
|
|
134
|
+
diffSummary = `File deleted. Previous content:\n\`\`\`${codeBlockLang}\n${(change.oldContent || "").split("\n").slice(0, 40).join("\n")}\n\`\`\``;
|
|
135
|
+
}
|
|
136
|
+
else if (change.type === "added") {
|
|
137
|
+
const smartNew = (0, context_extractor_1.buildSmartContext)(change.newContent || "", codeBlockLang);
|
|
138
|
+
diffSummary = `New file added:\n\`\`\`${codeBlockLang}\n${smartNew}\n\`\`\``;
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
// Modified — include signature diff
|
|
142
|
+
const diffLines = change.diff.slice(0, 30).map(d => {
|
|
143
|
+
if (d.type === "added")
|
|
144
|
+
return `+ L${d.line}: ${d.new}`;
|
|
145
|
+
if (d.type === "removed")
|
|
146
|
+
return `- L${d.line}: ${d.old}`;
|
|
147
|
+
return `~ L${d.line}: ${d.old} → ${d.new}`;
|
|
148
|
+
});
|
|
149
|
+
diffSummary = `Changed lines (top 30 of ${change.diff.length}):\n\`\`\`\n${diffLines.join("\n")}\n\`\`\``;
|
|
150
|
+
// Add structural signature changes
|
|
151
|
+
if (change.oldContent && change.newContent) {
|
|
152
|
+
const sigChanges = (0, context_extractor_1.diffSignatures)(change.oldContent, change.newContent, codeBlockLang);
|
|
153
|
+
if (sigChanges.length > 0) {
|
|
154
|
+
diffSummary += "\n\n### Structural changes (signature diff)";
|
|
155
|
+
for (const sc of sigChanges) {
|
|
156
|
+
if (sc.type === "added") {
|
|
157
|
+
diffSummary += `\n+ Added: ${sc.newSignature}`;
|
|
158
|
+
}
|
|
159
|
+
else if (sc.type === "removed") {
|
|
160
|
+
diffSummary += `\n- Removed: ${sc.oldSignature}`;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
diffSummary += `\n~ Changed: ${sc.oldSignature}\n → ${sc.newSignature}`;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (change.newContent) {
|
|
169
|
+
const smartNew = (0, context_extractor_1.buildSmartContext)(change.newContent, codeBlockLang);
|
|
170
|
+
diffSummary += `\n\nFull file after modification:\n\`\`\`${codeBlockLang}\n${smartNew}\n\`\`\``;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
const userPrompt = `## File change detected: ${relPath}
|
|
174
|
+
Change type: ${change.type.toUpperCase()}
|
|
175
|
+
Project languages: ${graph.languages.join(", ") || "unknown"}
|
|
176
|
+
Affected files: ${affectedNodes.length}
|
|
177
|
+
|
|
178
|
+
${diffSummary}
|
|
179
|
+
|
|
180
|
+
${connectedFiles.length > 0 ? `## Connected files (${connectedFiles.length})\n${connectedFiles.join("\n\n")}` : "No connected files"}
|
|
181
|
+
|
|
182
|
+
Analyze the impact of this change on the project.`;
|
|
183
|
+
// ── Hash cache check: skip AI if content+diff unchanged ──
|
|
184
|
+
const diffStr = change.diff.map(d => `${d.type}:${d.line}:${d.old || ""}:${d.new || ""}`).join("|");
|
|
185
|
+
const contentHash = computeContentHash(change.newContent, diffStr);
|
|
186
|
+
const cached = analysisCache.get(relPath);
|
|
187
|
+
if (cached && cached.hash === contentHash) {
|
|
188
|
+
console.error(`[syke:ai] Cache hit for ${relPath} — skipping AI call`);
|
|
189
|
+
return { ...cached.result, timestamp: change.timestamp, analysisMs: 0 };
|
|
190
|
+
}
|
|
191
|
+
// ── Rate limit check ──
|
|
192
|
+
if (isRateLimited()) {
|
|
193
|
+
const analysisMs = Date.now() - start;
|
|
194
|
+
console.error(`[syke:ai] Rate limit reached (${RATE_LIMIT_MAX}/min) — skipping AI for ${relPath}`);
|
|
195
|
+
return {
|
|
196
|
+
file: relPath,
|
|
197
|
+
changeType: change.type,
|
|
198
|
+
timestamp: change.timestamp,
|
|
199
|
+
riskLevel: affectedNodes.length >= 10 ? "HIGH" : affectedNodes.length >= 5 ? "MEDIUM" : "LOW",
|
|
200
|
+
summary: `Rate limited — graph-based analysis: ${affectedNodes.length} files impacted`,
|
|
201
|
+
brokenImports: [],
|
|
202
|
+
sideEffects: [],
|
|
203
|
+
warnings: ["AI analysis skipped: rate limit (10 calls/min)"],
|
|
204
|
+
suggestion: "Wait a moment for AI analysis to resume",
|
|
205
|
+
affectedNodes,
|
|
206
|
+
analysisMs,
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
try {
|
|
210
|
+
const provider = (0, provider_1.getAIProvider)();
|
|
211
|
+
if (!provider) {
|
|
212
|
+
throw new Error("No AI provider available (set GEMINI_KEY, OPENAI_KEY, or ANTHROPIC_KEY)");
|
|
213
|
+
}
|
|
214
|
+
recordCall();
|
|
215
|
+
const parsed = await provider.analyzeJSON(getSystemPrompt(), userPrompt);
|
|
216
|
+
const analysisMs = Date.now() - start;
|
|
217
|
+
const result = {
|
|
218
|
+
file: relPath,
|
|
219
|
+
changeType: change.type,
|
|
220
|
+
timestamp: change.timestamp,
|
|
221
|
+
riskLevel: parsed.riskLevel || "LOW",
|
|
222
|
+
summary: parsed.summary || "Analysis complete",
|
|
223
|
+
brokenImports: parsed.brokenImports || [],
|
|
224
|
+
sideEffects: parsed.sideEffects || [],
|
|
225
|
+
warnings: parsed.warnings || [],
|
|
226
|
+
suggestion: parsed.suggestion || "",
|
|
227
|
+
affectedNodes,
|
|
228
|
+
analysisMs,
|
|
229
|
+
};
|
|
230
|
+
// Store in cache
|
|
231
|
+
if (analysisCache.size >= MAX_CACHE_SIZE)
|
|
232
|
+
evictOldestCacheEntry();
|
|
233
|
+
analysisCache.set(relPath, { hash: contentHash, result, insertedAt: Date.now() });
|
|
234
|
+
return result;
|
|
235
|
+
}
|
|
236
|
+
catch (err) {
|
|
237
|
+
const analysisMs = Date.now() - start;
|
|
238
|
+
console.error(`[syke:ai] Analysis error for ${relPath}: ${err.message}`);
|
|
239
|
+
return {
|
|
240
|
+
file: relPath,
|
|
241
|
+
changeType: change.type,
|
|
242
|
+
timestamp: change.timestamp,
|
|
243
|
+
riskLevel: affectedNodes.length >= 10 ? "HIGH" : affectedNodes.length >= 5 ? "MEDIUM" : "LOW",
|
|
244
|
+
summary: `AI analysis failed — graph-based analysis: ${affectedNodes.length} files impacted`,
|
|
245
|
+
brokenImports: [],
|
|
246
|
+
sideEffects: [],
|
|
247
|
+
warnings: [`AI analysis error: ${err.message}`],
|
|
248
|
+
suggestion: "Manual review required",
|
|
249
|
+
affectedNodes,
|
|
250
|
+
analysisMs,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
}
|
package/dist/config.js
CHANGED
|
@@ -1 +1,121 @@
|
|
|
1
|
-
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.CONFIG_FILE_PATH = exports.CONFIG_DIR_PATH = void 0;
|
|
37
|
+
exports.getConfig = getConfig;
|
|
38
|
+
exports.getAllConfig = getAllConfig;
|
|
39
|
+
exports.setConfig = setConfig;
|
|
40
|
+
/**
|
|
41
|
+
* Central config reader for SYKE MCP Server.
|
|
42
|
+
*
|
|
43
|
+
* Priority: environment variables > ~/.syke/config.json
|
|
44
|
+
*
|
|
45
|
+
* IDE users (Cursor, Windsurf, etc.) set env vars in their MCP config.
|
|
46
|
+
* Terminal users (Claude Code CLI) edit ~/.syke/config.json directly.
|
|
47
|
+
*/
|
|
48
|
+
const fs = __importStar(require("fs"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const os = __importStar(require("os"));
|
|
51
|
+
const CONFIG_DIR = path.join(os.homedir(), ".syke");
|
|
52
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, "config.json");
|
|
53
|
+
let cached = null;
|
|
54
|
+
/**
|
|
55
|
+
* Read ~/.syke/config.json (cached after first read)
|
|
56
|
+
*/
|
|
57
|
+
function readConfigFile() {
|
|
58
|
+
if (cached)
|
|
59
|
+
return cached;
|
|
60
|
+
try {
|
|
61
|
+
if (fs.existsSync(CONFIG_FILE)) {
|
|
62
|
+
cached = JSON.parse(fs.readFileSync(CONFIG_FILE, "utf-8"));
|
|
63
|
+
return cached;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// ignore parse errors
|
|
68
|
+
}
|
|
69
|
+
cached = {};
|
|
70
|
+
return cached;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get a config value. Env var takes priority over config file.
|
|
74
|
+
*/
|
|
75
|
+
function getConfig(key, envVar) {
|
|
76
|
+
// 1. Environment variable
|
|
77
|
+
if (envVar && process.env[envVar]) {
|
|
78
|
+
return process.env[envVar];
|
|
79
|
+
}
|
|
80
|
+
// 2. Config file
|
|
81
|
+
const file = readConfigFile();
|
|
82
|
+
const val = file[key];
|
|
83
|
+
return val !== undefined && val !== null ? String(val) : undefined;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get all resolved config (for logging/debug)
|
|
87
|
+
*/
|
|
88
|
+
function getAllConfig() {
|
|
89
|
+
return {
|
|
90
|
+
licenseKey: getConfig("licenseKey", "SYKE_LICENSE_KEY"),
|
|
91
|
+
geminiKey: getConfig("geminiKey", "GEMINI_KEY"),
|
|
92
|
+
openaiKey: getConfig("openaiKey", "OPENAI_KEY"),
|
|
93
|
+
anthropicKey: getConfig("anthropicKey", "ANTHROPIC_KEY"),
|
|
94
|
+
aiProvider: getConfig("aiProvider", "SYKE_AI_PROVIDER"),
|
|
95
|
+
port: getConfig("port", "SYKE_WEB_PORT"),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Set a config value in ~/.syke/config.json
|
|
100
|
+
*/
|
|
101
|
+
function setConfig(key, value) {
|
|
102
|
+
const file = readConfigFile();
|
|
103
|
+
if (value === null) {
|
|
104
|
+
delete file[key];
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
file[key] = value;
|
|
108
|
+
}
|
|
109
|
+
try {
|
|
110
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
111
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
112
|
+
}
|
|
113
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(file, null, 2));
|
|
114
|
+
cached = file;
|
|
115
|
+
}
|
|
116
|
+
catch {
|
|
117
|
+
// ignore write errors
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
exports.CONFIG_DIR_PATH = CONFIG_DIR;
|
|
121
|
+
exports.CONFIG_FILE_PATH = CONFIG_FILE;
|