aggroot 1.4.3 → 1.4.4
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/index.cjs +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -44400,7 +44400,7 @@ ${l.error??"\u672A\u77E5\u9519\u8BEF"}`))}reset(){this._deps.cliService.resetAge
|
|
|
44400
44400
|
`)}catch{}let l=this.menuResolve,u=this.items[this.selectedIndex];if(this.menuMode==="navigation"){if(r==="\x1B[A")return this.selectedIndex=(this.selectedIndex-1+this.items.length)%this.items.length,this.render(),!0;if(r==="\x1B[B")return this.selectedIndex=(this.selectedIndex+1)%this.items.length,this.render(),!0;if(r==="\x1B[C"||r==="\x1BOC")return u?.isDirectory&&(this.cleanup(),l({action:"enter_dir",selected:u.value})),!0;if(r==="\x1B[D"||r==="\x1BOD")return this.cleanup(),l({action:"go_back",selected:""}),!0;if(r==="\r"||r===`
|
|
44401
44401
|
`||r.charCodeAt(0)===13||r.charCodeAt(0)===10)return u&&(this.cleanup(),l({action:"select",selected:u.value})),!0;if(r==="\x1B"||r.charCodeAt(0)===27)return this.cleanup(),l(null),!0;if(r.charCodeAt(0)===3)return this.cleanup(),process.emit("SIGINT"),l(null),!0;if(r.charCodeAt(0)===127||r.charCodeAt(0)===8)return this.cleanup(),l(null),!0}else{if(r==="\x1B[A")return this.selectedIndex=this.findNextSelectable(this.selectedIndex,-1),this.render(),!0;if(r==="\x1B[B")return this.selectedIndex=this.findNextSelectable(this.selectedIndex,1),this.render(),!0;if(r==="\r"||r===`
|
|
44402
44402
|
`||r.charCodeAt(0)===13||r.charCodeAt(0)===10){let f=this.items[this.selectedIndex];return!f||!this.isSelectable(this.selectedIndex)?(this.selectedIndex=this.findNextSelectable(this.selectedIndex,1),this.render(),!0):(this.cleanup(),l(f?{selected:f.value,prefix:this.prefix}:null),!0)}if(r==="\x1B"||r.charCodeAt(0)===27)return this.isFiltering?(this.filterText="",this.isFiltering=!1,this.applyFilter(),this.render(),!0):(this.cleanup(),l(null),!0);if(r.charCodeAt(0)===3)return this.cleanup(),process.emit("SIGINT"),l(null),!0;if(r.charCodeAt(0)===127||r.charCodeAt(0)===8)return this.isFiltering&&this.filterText.length>0?(this.filterText=this.filterText.slice(0,-1),this.filterText.length===0&&(this.isFiltering=!1),this.applyFilter(),this.render(),!0):(this.cleanup(),l(null),!0);if(r.length===1){let f=r.charCodeAt(0);if(f>=32&&f<=126)return this.filterText+=r.toLowerCase(),this.isFiltering=!0,this.applyFilter(),this.render(),!0}}return!1}insertLinesForMenu(){let t=process.stdout.rows||24,l=Math.min(this.items.length,15)+1,u=this.menuHeader?1:0,f=l+u+1,_=0;this.hasModelOutput?(this.lastPushedLines=0,this.hasModelOutput=!1,_=f):this.lastPushedLines>=f?_=0:_=f-this.lastPushedLines,this.lastPushedLines+=_;let y=process.stdout.columns||80,T=this.getStatusBar?this.getStatusBar():"",I=this.stripAnsi(T),O=2+Math.max(1,Math.ceil([...I].length/y))+1,L="";for(let J=0;J<O;J++){let V=t-J;V>0&&(L+=`\x1B[${V};1H\x1B[2K`)}if(this.stdout.write(L),_>0){this.stdout.write(`\x1B[${t-2};1H`);let J=`
|
|
44403
|
-
`.repeat(_);this.stdout.write(J)}this.savedCursorRow=Math.max(1,t-2-l-u)}applyFilter(){if(!this.filterText)this.items=[...this.allItems];else{let t=this.allItems.filter(r=>r.selectable===!1?!0:r.name.toLowerCase().includes(this.filterText)||(r.description?.toLowerCase().includes(this.filterText)??!1));this.items=t.filter((r,l)=>{if(r.selectable===!1){let u=t[l+1];return u&&u.selectable!==!1}return!0})}this.selectedIndex=this.isSelectable(0)?0:this.findNextSelectable(0,1)}render(){let t=Math.min(this.items.length,15),r=Math.max(0,Math.min(this.selectedIndex-3,this.items.length-t));this._visibleStart=r;let l=Math.min(this.items.length,r+t),u=[];this.menuHeader&&u.push(Ht.yellow.bold(this.menuHeader)),this.isFiltering&&u.push(Ht.yellow(` \u641C\u7D22: ${this.filterText}_`));for(let L=r;L<l;L++){let J=this.items[L],V=L===this.selectedIndex,K=V?"\u25B6":" ",ye=this.stripAnsi(J.name);if(J.selectable===!1){u.push(Ht.gray.dim(` ${ye}`));continue}let he=V?Ht.cyan.bold(ye):Ht.gray(ye);if(J.description){let Ae=V?Ht.cyan.dim(` \u2014 ${J.description}`):Ht.gray.dim(` \u2014 ${J.description}`);he+=Ae}u.push(` ${K} ${he}`)}let f=this.prefix==="@",_=this.isFiltering?f?"\u8F93\u5165\u7B5B\u9009 \u2191\u2193 \u2190\u2192 Enter Esc":"\u8F93\u5165\u7B5B\u9009 \u2191\u2193 Enter Esc":f?"\u2191\u2193 \u2190\u2192 Enter Esc":"\u2191\u2193 Enter Esc";u.push(Ht.gray(` ${_}`));let y="";y+="\x1B[?25l";let T=process.stdout.rows||24;this.menuStartRow=Math.max(1,this.savedCursorRow);let I=this.menuLines;for(let L=0;L<I;L++){let J=this.menuStartRow+L;J>0&&(y+=`\x1B[${J};1H`,y+="\x1B[2K")}let P=process.stdout.columns||80;for(let L=0;L<u.length;L++){let J=this.menuStartRow+L;y+=`\x1B[${J};1H`,y+="\x1B[2K",y+=this.truncateToWidth(u[L],P)}if(this.menuLines=Math.max(this.menuLines,u.length),this.getStatusBar){let L=this.menuStartRow+this.menuLines;for(let J=L;J<T;J++)J>0&&(y+=`\x1B[${J};1H`,y+="\x1B[2K");y+=`\x1B[${T};1H`,y+="\x1B[2K",y+=this.truncateToWidth(this.getStatusBar(),P)}let O=this.selectedIndex-this._visibleStart;if(O>=0&&O<u.length){let L=this.menuStartRow+(this.menuHeader?1:0)+O;y+=`\x1B[${L};1H`}y+="\x1B[?25h",this.stdout.write(y)}stripAnsi(t){return t.replace(/\x1b\[[0-9;]*m/g,"")}truncateToWidth(t,r){let l=t.split(/(\x1b\[[0-9;]*m)/),u=0,f="";for(let _ of l)if(_.startsWith("\x1B["))f+=_;else for(let y of _){let T=zk(y);if(u+T>r)return f;u+=T,f+=y}return f}cleanup(){this.isActive=!1,this.menuHeader="",this.menuResolve=null,this.filterText="",this.isFiltering=!1,this.stdout.write("\x1B[?25l");let t=this.menuStartRow>0?this.menuStartRow:this.savedCursorRow,r=process.stdout.rows||24;for(let l=t;l<=r;l++)this.stdout.write(`\x1B[${l};1H\x1B[2K`);this.stdout.write("\x1B[?25h"),this.menuLines=0,this.dispatcher?this.dispatcher.unregister(this.menuContextName):this.dataHandler&&(this.stdin.removeListener("data",this.dataHandler),this.dataHandler=null)}get active(){return this.isActive}};ne();var Wve=class{contexts=[];register(t){this.contexts.push(t),this.contexts.sort((r,l)=>l.priority-r.priority)}unregister(t){this.contexts=this.contexts.filter(r=>r.name!==t)}dispatch(t){for(let r of this.contexts)if(r.isActive()&&r.handle(t))return!0;return!1}getActiveContexts(){return this.contexts.filter(t=>t.isActive()).map(t=>t.name)}};ne();var Bve=class{getCommandRegistry;getAgents;suggestion=null;constructor(t,r){this.getCommandRegistry=t,this.getAgents=r}updateSuggestions(t,r){if(this.suggestion=null,!t||t.length===0)return;let l=[...t];if(r===l.length){if(t.startsWith("/")&&t.length>1&&!t.includes(" ")){let u=this.getCommandRegistry();if(u){let f=u.getCommands(),_=t.toLowerCase(),y=f.find(T=>T.name.toLowerCase().startsWith(_)&&T.name.toLowerCase()!==_);if(y){let T=y.name.slice(t.length);this.suggestion={text:T,fullReplacement:y.name,source:"command"}}}return}if(t.startsWith("#")&&t.length>1&&!t.includes(" ")){let u=this.getAgents(),f=t.toLowerCase(),_=u.find(y=>`#${y.toLowerCase()}`.startsWith(f)&&`#${y.toLowerCase()}`!==f);if(_){let y=`#${_}`,T=y.slice(t.length);this.suggestion={text:T,fullReplacement:y,source:"agent"}}return}}}getSuggestion(){return this.suggestion}clear(){this.suggestion=null}accept(){if(!this.suggestion)return null;let t=this.suggestion.fullReplacement;return this.suggestion=null,t}};cB();var oYe=require("node:path"),q5t=require("node:fs");ne();var zve=require("node:fs"),e$e=require("node:path"),t$e=require("node:fs"),Gve=class{filePath;heartbeatTimer=null;constructor(t){this.filePath=(0,e$e.join)(t,"instances.json")}async register(t){let l=(await this.loadAll()).filter(u=>u.pid!==t.pid);l.push(t),await this.saveAll(l)}async unregister(t){let l=(await this.loadAll()).filter(u=>u.id!==t);await this.saveAll(l)}async updateHeartbeat(t){let r=await this.loadAll(),l=r.find(u=>u.id===t);l&&(l.lastHeartbeat=Date.now(),await this.saveAll(r))}startHeartbeat(t,r=3e4){this.stopHeartbeat(),this.heartbeatTimer=setInterval(async()=>{try{await this.updateHeartbeat(t)}catch{}},r)}stopHeartbeat(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null)}async listInstances(){return this.loadAll()}async listResumable(){return(await this.loadAll()).filter(r=>r.sessionId).sort((r,l)=>l.lastHeartbeat-r.lastHeartbeat)}isProcessAlive(t){try{return process.kill(t,0),!0}catch{return!1}}async cleanup(t=10080*60*1e3){let r=await this.loadAll(),l=Date.now(),u=r.filter(_=>this.isProcessAlive(_.pid)?!0:l-_.lastHeartbeat<t),f=r.length-u.length;return f>0&&await this.saveAll(u),f}async loadAll(){if(!(0,t$e.existsSync)(this.filePath))return[];try{let t=await zve.promises.readFile(this.filePath,"utf-8");return JSON.parse(t).instances??[]}catch{return[]}}async saveAll(t){let r=(0,e$e.join)(this.filePath,"..");(0,t$e.existsSync)(r)||await zve.promises.mkdir(r,{recursive:!0}),await zve.promises.writeFile(this.filePath,JSON.stringify({version:1,instances:t},null,2),"utf-8")}};ne();var kF=bs(require("node:path"),1),D2t=bs(require("node:crypto"),1),Ev=require("node:fs");zd();var F4n=Ma("file-history-store"),jve=class{_baseDir;constructor(t){this._baseDir=t}async recordChange(t,r,l,u="unknown"){let f=this.getSessionDir(t);this.ensureDir(f);let _=this.hashContent(l),y=await this.loadIndex(t),T=y.filter(V=>V.filePath===r),P=(T.length>0?Math.max(...T.map(V=>V.version)):0)+1,O=`${_}@v${P}`,L=kF.join(f,O);(0,Ev.writeFileSync)(L,l,"utf-8");let J={version:P,filePath:r,contentHash:_,timestamp:Date.now(),source:u,sessionId:t};return y.push(J),await this.saveIndex(t,y),F4n.debug(`Recorded file change: ${r} v${P} (source: ${u})`),P}async undo(t,r){let l=await this.loadIndex(t);if(l.length===0)return[];let u=[];if(r){let f=await this.undoFile(t,r,l);f&&u.push(f)}else{let _=Math.max(...l.map(I=>I.timestamp))-2e3,y=l.filter(I=>I.timestamp>=_),T=[...new Set(y.map(I=>I.filePath))];for(let I of T){let P=await this.undoFile(t,I,l);P&&u.push(P)}}return u}async undoFile(t,r,l){let u=l.filter(P=>P.filePath===r).sort((P,O)=>O.version-P.version);if(u.length===0)return null;let f=u[0],_=this.getSessionDir(t),y=`${f.contentHash}@v${f.version}`,T=kF.join(_,y);if(u.length>1){let P=u[1],O=`${P.contentHash}@v${P.version}`,L=kF.join(_,O);try{let J=(0,Ev.readFileSync)(L,"utf-8");(0,Ev.writeFileSync)(r,J,"utf-8")}catch{return{success:!1,filePath:r,restoredVersion:f.version-1,error:"Failed to read previous version"}}}else try{let{unlink:P}=await import("node:fs/promises");await P(r)}catch{}let I=l.filter(P=>!(P.filePath===r&&P.version===f.version));await this.saveIndex(t,I);try{let{unlink:P}=await import("node:fs/promises");await P(T)}catch{}return{success:!0,filePath:r,restoredVersion:f.version-1}}async getFileHistory(t,r){return(await this.loadIndex(t)).filter(u=>u.filePath===r).sort((u,f)=>u.version-f.version)}async getSessionHistory(t){return(await this.loadIndex(t)).sort((l,u)=>l.timestamp-u.timestamp)}async cleanup(t){let r=this.getSessionDir(t);try{let{rm:l}=await import("node:fs/promises");await l(r,{recursive:!0,force:!0})}catch{}}async cleanupOldSessions(t=10080*60*1e3){let r=kF.join(this._baseDir,"file-history");if(!(0,Ev.existsSync)(r))return 0;let l=Date.now(),u=0;try{let f=(0,Ev.readdirSync)(r);for(let _ of f){let y=kF.join(r,_);try{let T=(0,Ev.statSync)(y);if(T.isDirectory()&&l-T.mtimeMs>t){let{rm:I}=await import("node:fs/promises");await I(y,{recursive:!0,force:!0}),u++}}catch{}}}catch{}return u}getSessionDir(t){return kF.join(this._baseDir,"file-history",t)}ensureDir(t){(0,Ev.existsSync)(t)||(0,Ev.mkdirSync)(t,{recursive:!0})}hashContent(t){return D2t.createHash("sha256").update(t).digest("hex").slice(0,12)}getIndexFilePath(t){return kF.join(this.getSessionDir(t),"_index.json")}async loadIndex(t){let r=this.getIndexFilePath(t);if(!(0,Ev.existsSync)(r))return[];try{let l=(0,Ev.readFileSync)(r,"utf-8");return JSON.parse(l)}catch{return[]}}async saveIndex(t,r){let l=this.getIndexFilePath(t),u=this.getSessionDir(t);this.ensureDir(u);let f=l+".tmp";(0,Ev.writeFileSync)(f,JSON.stringify(r,null,2),"utf-8");try{let{rename:_}=await import("node:fs/promises");await _(f,l)}catch{(0,Ev.writeFileSync)(l,JSON.stringify(r,null,2),"utf-8")}}};var GAe=require("node:fs"),J5t=bs(require("node:readline"),1);ef();ne();var fB=require("fs/promises"),Dte=require("path");Gx();zd();ef();var Vve=Ma("settings-loader"),Uve="settings.json",LF;(function(o){o[o.Enterprise=0]="Enterprise",o[o.User=1]="User",o[o.Project=2]="Project"})(LF||(LF={}));function W4n(){return process.platform==="win32"?(0,Dte.join)(process.env.ProgramData??"C:\\ProgramData","aggroot",Uve):"/etc/aggroot/settings.json"}function B4n(o){return[{path:W4n(),source:LF.Enterprise},{path:(0,Dte.join)(Ra,Uve),source:LF.User},{path:K3(o,Uve),source:LF.Project}]}async function z4n(o){try{let t=await(0,fB.readFile)(o,"utf-8"),r=JSON.parse(t);return Vve.debug({path:o},"Loaded settings file"),r}catch(t){return t.code==="ENOENT"||Vve.warn({path:o,error:String(t)},"Failed to load settings file"),null}}function G4n(o,t,r){let l={...o};return t.permissions&&(l.permissions={allow:[...l.permissions?.allow??[],...t.permissions.allow],deny:[...l.permissions?.deny??[],...t.permissions.deny],ask:[...l.permissions?.ask??[],...t.permissions.ask]}),t.hooks&&(l.hooks={...l.hooks,...t.hooks}),t.env&&(l.env={...l.env,...t.env}),t.mcp&&(l.mcp={...l.mcp,...t.mcp}),t.features&&(l.features={...l.features,...t.features}),t.preferences&&(l.preferences={...l.preferences,...t.preferences}),r===LF.Enterprise&&t.policy&&(l.policy=t.policy),t.version&&(!l.version||t.version>l.version)&&(l.version=t.version),l}function j4n(o){let t=o.policy;if(!t)return o;let r={...o};return t.allowManagedMcpServersOnly&&t.allowedMcpServers&&r.mcp?.autoConnectServers&&(r.mcp.autoConnectServers=r.mcp.autoConnectServers.filter(l=>t.allowedMcpServers.includes(l))),t.blockedTools?.length&&(r.permissions={allow:[...r.permissions?.allow??[]],deny:[...r.permissions?.deny??[],...t.blockedTools],ask:[...r.permissions?.ask??[]]}),t.requireApproval?.length&&(r.permissions={allow:[...r.permissions?.allow??[]],deny:[...r.permissions?.deny??[]],ask:[...r.permissions?.ask??[],...t.requireApproval]}),r}async function P2t(o){let t=B4n(o),r=await Promise.all(t.map(({path:u})=>z4n(u))),l={};for(let u=0;u<r.length;u++){let f=r[u];if(!f)continue;let _=t[u].source;l.policy?.disableUserOverride&&_===LF.User||l.policy?.disableProjectOverride&&_===LF.Project||(l=G4n(l,f,_))}return l=j4n(l),l}async function Pte(o){let t=(0,Dte.join)(Ra,Uve);try{let r={};try{let l=await(0,fB.readFile)(t,"utf-8");r=JSON.parse(l)}catch{}r.preferences={...r.preferences,...o},await(0,fB.mkdir)(Ra,{recursive:!0}),await(0,fB.writeFile)(t,JSON.stringify(r,null,2),"utf-8"),Vve.info({path:t,prefs:o},"User preferences saved")}catch(r){Vve.warn({error:String(r)},"Failed to save user preferences (non-fatal)")}}FQ();ne();ne();var aU=require("node:fs/promises"),n$e=require("node:path"),r$e=require("node:fs"),i$e=bs(require("node:https"),1);qT();qT();ef();var Rte=class{_cachePath;_registryBase;_checkIntervalMs;_enabled;constructor(t){this._cachePath=(0,n$e.join)(t?.dataDir??Ra,KIt),this._registryBase=t?.registryBase??"https://registry.npmjs.org",this._checkIntervalMs=t?.checkIntervalMs??$It,this._enabled=t?.enabled??!0}async checkForUpdate(){if(!this._enabled)return null;let t=await this._loadCache();if(t&&Date.now()-new Date(t.lastCheckTime).getTime()<this._checkIntervalMs)return{hasUpdate:this._isNewer(t.latestVersion,vv),currentVersion:vv,latestVersion:t.latestVersion,checkedAt:t.lastCheckTime};let r=await this._fetchLatestVersion();if(!r)return null;let l=this._isNewer(r,vv),u=new Date().toISOString(),f={lastCheckTime:u,latestVersion:r,currentVersionAtCheck:vv,hasUpdate:l};return await this._saveCache(f),{hasUpdate:l,currentVersion:vv,latestVersion:r,checkedAt:u}}async checkInBackground(){try{return await this.checkForUpdate()}catch{return null}}async getCachedResult(){let t=await this._loadCache();return t?{hasUpdate:this._isNewer(t.latestVersion,vv),currentVersion:vv,latestVersion:t.latestVersion,checkedAt:t.lastCheckTime}:null}_isNewer(t,r){let l=t.replace(/^v/,"").split(".").map(Number),u=r.replace(/^v/,"").split(".").map(Number);for(let f=0;f<3;f++){if((l[f]??0)>(u[f]??0))return!0;if((l[f]??0)<(u[f]??0))return!1}return!1}_fetchLatestVersion(){let t=`${this._registryBase}/aggroot/latest`;return new Promise(r=>{let l=setTimeout(()=>{u.destroy(),r(null)},hje),u=i$e.default.get(t,f=>{if(f.statusCode===301||f.statusCode===302){let y=f.headers.location;if(y){clearTimeout(l),r(this._fetchFromUrl(y));return}}if(f.statusCode!==200){clearTimeout(l),f.resume(),r(null);return}let _="";f.on("data",y=>{_+=y.toString()}),f.on("end",()=>{clearTimeout(l);try{let y=JSON.parse(_);r(y.version??null)}catch{r(null)}}),f.on("error",()=>{clearTimeout(l),r(null)})});u.on("error",()=>{clearTimeout(l),r(null)})})}_fetchFromUrl(t){return new Promise(r=>{let l=setTimeout(()=>{u.destroy(),r(null)},hje),u=i$e.default.get(t,f=>{if(f.statusCode!==200){clearTimeout(l),f.resume(),r(null);return}let _="";f.on("data",y=>{_+=y.toString()}),f.on("end",()=>{clearTimeout(l);try{let y=JSON.parse(_);r(y.version??null)}catch{r(null)}})});u.on("error",()=>{clearTimeout(l),r(null)})})}async _loadCache(){try{if(!(0,r$e.existsSync)(this._cachePath))return null;let t=await(0,aU.readFile)(this._cachePath,"utf-8");return JSON.parse(t)}catch{return null}}async _saveCache(t){try{let r=(0,n$e.join)(this._cachePath,"..");(0,r$e.existsSync)(r)||await(0,aU.mkdir)(r,{recursive:!0}),await(0,aU.writeFile)(this._cachePath,JSON.stringify(t,null,2),"utf-8")}catch{}}};ne();var Kve=require("node:child_process"),N2t=require("node:util"),k2t=require("node:fs"),s$e=require("node:path");qT();qT();ne();var lU=require("node:fs/promises"),o$e=require("node:path"),Hve=require("node:fs"),R2t=require("node:child_process"),M2t=require("node:util");ef();qT();var V4n=(0,M2t.promisify)(R2t.execFile),Mte=class{_rollbackPath;constructor(t){this._rollbackPath=(0,o$e.join)(t??Ra,qIt)}async createBackup(t,r){let l={previousVersion:t,upgradedFrom:t,upgradedTo:"",upgradedAt:new Date().toISOString(),installPath:r};await this._save(l)}async markUpgraded(t){let r=await this._load();r&&(r.upgradedTo=t,await this._save(r))}async isRollbackAvailable(){let t=await this._load();return t!==null&&!!t.previousVersion}async getRollbackInfo(){return this._load()}async rollback(t){let r=await this._load();if(!r||!r.previousVersion)return{success:!1,version:"",error:"\u6CA1\u6709\u53EF\u56DE\u6EDA\u7684\u7248\u672C\u4FE1\u606F"};let l=t??"npm";try{let{stdout:u,stderr:f}=await V4n(l,["install","-g",`aggroot@${r.previousVersion}`],{timeout:pge,encoding:"utf-8",shell:!0}),_=f?.trim();return _&&!_.includes("WARN")&&!_.includes("warn")?{success:!1,version:r.previousVersion,error:_}:(await this.clearRollback(),{success:!0,version:r.previousVersion})}catch(u){return{success:!1,version:r.previousVersion,error:u.message??String(u)}}}async clearRollback(){try{if((0,Hve.existsSync)(this._rollbackPath)){let{unlink:t}=await import("node:fs/promises");await t(this._rollbackPath)}}catch{}}async _load(){try{if(!(0,Hve.existsSync)(this._rollbackPath))return null;let t=await(0,lU.readFile)(this._rollbackPath,"utf-8");return JSON.parse(t)}catch{return null}}async _save(t){try{let r=(0,o$e.join)(this._rollbackPath,"..");(0,Hve.existsSync)(r)||await(0,lU.mkdir)(r,{recursive:!0}),await(0,lU.writeFile)(this._rollbackPath,JSON.stringify(t,null,2),"utf-8")}catch{}}};var $ve=(0,N2t.promisify)(Kve.execFile),Nte=class{_updateChecker;_rollbackManager;constructor(t){this._updateChecker=new Rte({dataDir:t?.dataDir}),this._rollbackManager=new Mte(t?.dataDir)}get updateChecker(){return this._updateChecker}get rollbackManager(){return this._rollbackManager}async getInstallInfo(){let t=await this._findNpm(),r=await this._isNpmGlobalInstall(),l="";if(t)try{let{stdout:u}=await $ve(t,["root","-g"],{timeout:1e4,encoding:"utf-8",shell:!0});l=(0,s$e.join)(u.trim(),"aggroot")}catch{}return{isNpmGlobalInstall:r,installPath:l,version:vv,npmPath:t}}async upgrade(t,r,l){let u=vv;t?.({step:"checking-env",message:"\u6B63\u5728\u68C0\u67E5\u5347\u7EA7\u73AF\u5883...",percent:5});let f=r??await this.getInstallInfo();if(!f.npmPath)return{success:!1,fromVersion:u,toVersion:"",error:"\u672A\u627E\u5230 npm \u547D\u4EE4\uFF0C\u65E0\u6CD5\u6267\u884C\u5347\u7EA7\u3002\u8BF7\u786E\u4FDD npm \u5DF2\u5B89\u88C5\u5E76\u5728 PATH \u4E2D\u3002"};if(!f.isNpmGlobalInstall)return{success:!1,fromVersion:u,toVersion:"",error:"\u5F53\u524D\u975E npm \u5168\u5C40\u5B89\u88C5\uFF0C\u4E0D\u652F\u6301\u81EA\u52A8\u5347\u7EA7\u3002\u8BF7\u901A\u8FC7\u6E90\u7801\u65B9\u5F0F\u624B\u52A8\u66F4\u65B0\u3002"};t?.({step:"checking-version",message:"\u6B63\u5728\u68C0\u67E5\u6700\u65B0\u7248\u672C...",percent:15});let _=l??await this._updateChecker.checkForUpdate();if(!_)return{success:!1,fromVersion:u,toVersion:"",error:"\u65E0\u6CD5\u83B7\u53D6\u6700\u65B0\u7248\u672C\u4FE1\u606F\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u3002"};if(!_.hasUpdate)return{success:!1,fromVersion:u,toVersion:vv,error:`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C (${vv})`};let y=_.latestVersion;t?.({step:"backing-up",message:"\u6B63\u5728\u5907\u4EFD\u56DE\u6EDA\u4FE1\u606F...",percent:25}),await this._rollbackManager.createBackup(u,f.installPath),t?.({step:"downloading",message:`\u6B63\u5728\u4E0B\u8F7D aggroot@${y}...`,percent:30});let T=await this._spawnNpmInstall(y,t);return T.success?(t?.({step:"verifying",message:"\u6B63\u5728\u9A8C\u8BC1\u5B89\u88C5...",percent:90}),await this._verifyInstallation(f.npmPath,y)?(await this._rollbackManager.markUpgraded(y),t?.({step:"done",message:"\u5347\u7EA7\u5B8C\u6210",percent:100}),{success:!0,fromVersion:u,toVersion:y}):{success:!1,fromVersion:u,toVersion:y,error:"\u5B89\u88C5\u9A8C\u8BC1\u5931\u8D25\uFF0C\u65B0\u7248\u672C\u53EF\u80FD\u672A\u6B63\u786E\u5B89\u88C5\u3002\u8BF7\u624B\u52A8\u68C0\u67E5\u3002"}):{success:!1,fromVersion:u,toVersion:y,error:T.error??"npm \u5B89\u88C5\u5931\u8D25"}}async rollback(t){if(!(await this.getInstallInfo()).npmPath)return{success:!1,version:"",error:"\u672A\u627E\u5230 npm \u547D\u4EE4\uFF0C\u65E0\u6CD5\u6267\u884C\u56DE\u6EDA\u3002"};t?.({step:"installing",message:"\u6B63\u5728\u56DE\u6EDA\u5230\u4E0A\u4E00\u7248\u672C...",percent:30});let l=await this._rollbackManager.getRollbackInfo();if(!l)return{success:!1,version:"",error:"\u6CA1\u6709\u53EF\u56DE\u6EDA\u7684\u7248\u672C\u4FE1\u606F"};let u=await this._spawnNpmInstall(l.previousVersion,t);return u.success?(await this._rollbackManager.clearRollback(),t?.({step:"done",message:"\u56DE\u6EDA\u5B8C\u6210",percent:100}),{success:!0,version:l.previousVersion}):{success:!1,version:l.previousVersion,error:u.error}}async checkForUpdate(){return this._updateChecker.checkForUpdate()}_spawnNpmInstall(t,r){return new Promise(l=>{let u=(0,Kve.spawn)("npm",["install","-g",`aggroot@${t}`],{shell:!0,timeout:pge}),f="";u.stdout?.on("data",_=>{let y=_.toString("utf-8");this._parseNpmProgress(y,t,r)}),u.stderr?.on("data",_=>{f+=_.toString("utf-8")}),u.on("close",_=>{if(_!==0){let T=f.split(`
|
|
44403
|
+
`.repeat(_);this.stdout.write(J)}this.savedCursorRow=Math.max(1,t-2-l-u)}applyFilter(){if(!this.filterText)this.items=[...this.allItems];else{let t=this.allItems.filter(r=>r.selectable===!1?!0:r.name.toLowerCase().includes(this.filterText)||(r.description?.toLowerCase().includes(this.filterText)??!1));this.items=t.filter((r,l)=>{if(r.selectable===!1){let u=t[l+1];return u&&u.selectable!==!1}return!0})}this.selectedIndex=this.isSelectable(0)?0:this.findNextSelectable(0,1)}render(){let t=Math.min(this.items.length,15),r=Math.max(0,Math.min(this.selectedIndex-3,this.items.length-t));this._visibleStart=r;let l=Math.min(this.items.length,r+t),u=[];this.menuHeader&&u.push(Ht.yellow.bold(this.menuHeader)),this.isFiltering&&u.push(Ht.yellow(` \u641C\u7D22: ${this.filterText}_`));for(let L=r;L<l;L++){let J=this.items[L],V=L===this.selectedIndex,K=V?"\u25B6":" ",ye=this.stripAnsi(J.name);if(J.selectable===!1){u.push(Ht.gray.dim(` ${ye}`));continue}let he=V?Ht.cyan.bold(ye):Ht.gray(ye);if(J.description){let Ae=V?Ht.cyan.dim(` \u2014 ${J.description}`):Ht.gray.dim(` \u2014 ${J.description}`);he+=Ae}u.push(` ${K} ${he}`)}let f=this.prefix==="@",_=this.isFiltering?f?"\u8F93\u5165\u7B5B\u9009 \u2191\u2193 \u2190\u2192 Enter Esc":"\u8F93\u5165\u7B5B\u9009 \u2191\u2193 Enter Esc":f?"\u2191\u2193 \u2190\u2192 Enter Esc":"\u2191\u2193 Enter Esc";u.push(Ht.gray(` ${_}`));let y="";y+="\x1B[?25l";let T=process.stdout.rows||24;this.menuStartRow=Math.max(1,this.savedCursorRow);let I=this.menuLines;for(let L=0;L<I;L++){let J=this.menuStartRow+L;J>0&&(y+=`\x1B[${J};1H`,y+="\x1B[2K")}let P=process.stdout.columns||80;for(let L=0;L<u.length;L++){let J=this.menuStartRow+L;y+=`\x1B[${J};1H`,y+="\x1B[2K",y+=this.truncateToWidth(u[L],P)}if(this.menuLines=Math.max(this.menuLines,u.length),this.getStatusBar){let L=this.menuStartRow+this.menuLines;for(let J=L;J<T;J++)J>0&&(y+=`\x1B[${J};1H`,y+="\x1B[2K");y+=`\x1B[${T};1H`,y+="\x1B[2K",y+=this.truncateToWidth(this.getStatusBar(),P)}let O=this.selectedIndex-this._visibleStart;if(O>=0&&O<u.length){let L=this.menuStartRow+(this.menuHeader?1:0)+O;y+=`\x1B[${L};1H`}y+="\x1B[?25h",this.stdout.write(y)}stripAnsi(t){return t.replace(/\x1b\[[0-9;]*m/g,"")}truncateToWidth(t,r){let l=t.split(/(\x1b\[[0-9;]*m)/),u=0,f="";for(let _ of l)if(_.startsWith("\x1B["))f+=_;else for(let y of _){let T=zk(y);if(u+T>r)return f;u+=T,f+=y}return f}cleanup(){this.isActive=!1,this.menuHeader="",this.menuResolve=null,this.filterText="",this.isFiltering=!1,this.stdout.write("\x1B[?25l");let t=this.menuStartRow>0?this.menuStartRow:this.savedCursorRow,r=process.stdout.rows||24;for(let l=t;l<=r;l++)this.stdout.write(`\x1B[${l};1H\x1B[2K`);this.stdout.write("\x1B[?25h"),this.menuLines=0,this.dispatcher?this.dispatcher.unregister(this.menuContextName):this.dataHandler&&(this.stdin.removeListener("data",this.dataHandler),this.dataHandler=null)}get active(){return this.isActive}};ne();var Wve=class{contexts=[];register(t){this.contexts.push(t),this.contexts.sort((r,l)=>l.priority-r.priority)}unregister(t){this.contexts=this.contexts.filter(r=>r.name!==t)}dispatch(t){for(let r of this.contexts)if(r.isActive()&&r.handle(t))return!0;return!1}getActiveContexts(){return this.contexts.filter(t=>t.isActive()).map(t=>t.name)}};ne();var Bve=class{getCommandRegistry;getAgents;suggestion=null;constructor(t,r){this.getCommandRegistry=t,this.getAgents=r}updateSuggestions(t,r){if(this.suggestion=null,!t||t.length===0)return;let l=[...t];if(r===l.length){if(t.startsWith("/")&&t.length>1&&!t.includes(" ")){let u=this.getCommandRegistry();if(u){let f=u.getCommands(),_=t.toLowerCase(),y=f.find(T=>T.name.toLowerCase().startsWith(_)&&T.name.toLowerCase()!==_);if(y){let T=y.name.slice(t.length);this.suggestion={text:T,fullReplacement:y.name,source:"command"}}}return}if(t.startsWith("#")&&t.length>1&&!t.includes(" ")){let u=this.getAgents(),f=t.toLowerCase(),_=u.find(y=>`#${y.toLowerCase()}`.startsWith(f)&&`#${y.toLowerCase()}`!==f);if(_){let y=`#${_}`,T=y.slice(t.length);this.suggestion={text:T,fullReplacement:y,source:"agent"}}return}}}getSuggestion(){return this.suggestion}clear(){this.suggestion=null}accept(){if(!this.suggestion)return null;let t=this.suggestion.fullReplacement;return this.suggestion=null,t}};cB();var oYe=require("node:path"),q5t=require("node:fs");ne();var zve=require("node:fs"),e$e=require("node:path"),t$e=require("node:fs"),Gve=class{filePath;heartbeatTimer=null;constructor(t){this.filePath=(0,e$e.join)(t,"instances.json")}async register(t){let l=(await this.loadAll()).filter(u=>u.pid!==t.pid);l.push(t),await this.saveAll(l)}async unregister(t){let l=(await this.loadAll()).filter(u=>u.id!==t);await this.saveAll(l)}async updateHeartbeat(t){let r=await this.loadAll(),l=r.find(u=>u.id===t);l&&(l.lastHeartbeat=Date.now(),await this.saveAll(r))}startHeartbeat(t,r=3e4){this.stopHeartbeat(),this.heartbeatTimer=setInterval(async()=>{try{await this.updateHeartbeat(t)}catch{}},r)}stopHeartbeat(){this.heartbeatTimer&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=null)}async listInstances(){return this.loadAll()}async listResumable(){return(await this.loadAll()).filter(r=>r.sessionId).sort((r,l)=>l.lastHeartbeat-r.lastHeartbeat)}isProcessAlive(t){try{return process.kill(t,0),!0}catch{return!1}}async cleanup(t=10080*60*1e3){let r=await this.loadAll(),l=Date.now(),u=r.filter(_=>this.isProcessAlive(_.pid)?!0:l-_.lastHeartbeat<t),f=r.length-u.length;return f>0&&await this.saveAll(u),f}async loadAll(){if(!(0,t$e.existsSync)(this.filePath))return[];try{let t=await zve.promises.readFile(this.filePath,"utf-8");return JSON.parse(t).instances??[]}catch{return[]}}async saveAll(t){let r=(0,e$e.join)(this.filePath,"..");(0,t$e.existsSync)(r)||await zve.promises.mkdir(r,{recursive:!0}),await zve.promises.writeFile(this.filePath,JSON.stringify({version:1,instances:t},null,2),"utf-8")}};ne();var kF=bs(require("node:path"),1),D2t=bs(require("node:crypto"),1),Ev=require("node:fs");zd();var F4n=Ma("file-history-store"),jve=class{_baseDir;constructor(t){this._baseDir=t}async recordChange(t,r,l,u="unknown"){let f=this.getSessionDir(t);this.ensureDir(f);let _=this.hashContent(l),y=await this.loadIndex(t),T=y.filter(V=>V.filePath===r),P=(T.length>0?Math.max(...T.map(V=>V.version)):0)+1,O=`${_}@v${P}`,L=kF.join(f,O);(0,Ev.writeFileSync)(L,l,"utf-8");let J={version:P,filePath:r,contentHash:_,timestamp:Date.now(),source:u,sessionId:t};return y.push(J),await this.saveIndex(t,y),F4n.debug(`Recorded file change: ${r} v${P} (source: ${u})`),P}async undo(t,r){let l=await this.loadIndex(t);if(l.length===0)return[];let u=[];if(r){let f=await this.undoFile(t,r,l);f&&u.push(f)}else{let _=Math.max(...l.map(I=>I.timestamp))-2e3,y=l.filter(I=>I.timestamp>=_),T=[...new Set(y.map(I=>I.filePath))];for(let I of T){let P=await this.undoFile(t,I,l);P&&u.push(P)}}return u}async undoFile(t,r,l){let u=l.filter(P=>P.filePath===r).sort((P,O)=>O.version-P.version);if(u.length===0)return null;let f=u[0],_=this.getSessionDir(t),y=`${f.contentHash}@v${f.version}`,T=kF.join(_,y);if(u.length>1){let P=u[1],O=`${P.contentHash}@v${P.version}`,L=kF.join(_,O);try{let J=(0,Ev.readFileSync)(L,"utf-8");(0,Ev.writeFileSync)(r,J,"utf-8")}catch{return{success:!1,filePath:r,restoredVersion:f.version-1,error:"Failed to read previous version"}}}else try{let{unlink:P}=await import("node:fs/promises");await P(r)}catch{}let I=l.filter(P=>!(P.filePath===r&&P.version===f.version));await this.saveIndex(t,I);try{let{unlink:P}=await import("node:fs/promises");await P(T)}catch{}return{success:!0,filePath:r,restoredVersion:f.version-1}}async getFileHistory(t,r){return(await this.loadIndex(t)).filter(u=>u.filePath===r).sort((u,f)=>u.version-f.version)}async getSessionHistory(t){return(await this.loadIndex(t)).sort((l,u)=>l.timestamp-u.timestamp)}async cleanup(t){let r=this.getSessionDir(t);try{let{rm:l}=await import("node:fs/promises");await l(r,{recursive:!0,force:!0})}catch{}}async cleanupOldSessions(t=10080*60*1e3){let r=kF.join(this._baseDir,"file-history");if(!(0,Ev.existsSync)(r))return 0;let l=Date.now(),u=0;try{let f=(0,Ev.readdirSync)(r);for(let _ of f){let y=kF.join(r,_);try{let T=(0,Ev.statSync)(y);if(T.isDirectory()&&l-T.mtimeMs>t){let{rm:I}=await import("node:fs/promises");await I(y,{recursive:!0,force:!0}),u++}}catch{}}}catch{}return u}getSessionDir(t){return kF.join(this._baseDir,"file-history",t)}ensureDir(t){(0,Ev.existsSync)(t)||(0,Ev.mkdirSync)(t,{recursive:!0})}hashContent(t){return D2t.createHash("sha256").update(t).digest("hex").slice(0,12)}getIndexFilePath(t){return kF.join(this.getSessionDir(t),"_index.json")}async loadIndex(t){let r=this.getIndexFilePath(t);if(!(0,Ev.existsSync)(r))return[];try{let l=(0,Ev.readFileSync)(r,"utf-8");return JSON.parse(l)}catch{return[]}}async saveIndex(t,r){let l=this.getIndexFilePath(t),u=this.getSessionDir(t);this.ensureDir(u);let f=l+".tmp";(0,Ev.writeFileSync)(f,JSON.stringify(r,null,2),"utf-8");try{let{rename:_}=await import("node:fs/promises");await _(f,l)}catch{(0,Ev.writeFileSync)(l,JSON.stringify(r,null,2),"utf-8")}}};var GAe=require("node:fs"),J5t=bs(require("node:readline"),1);ef();ne();var fB=require("fs/promises"),Dte=require("path");Gx();zd();ef();var Vve=Ma("settings-loader"),Uve="settings.json",LF;(function(o){o[o.Enterprise=0]="Enterprise",o[o.User=1]="User",o[o.Project=2]="Project"})(LF||(LF={}));function W4n(){return process.platform==="win32"?(0,Dte.join)(process.env.ProgramData??"C:\\ProgramData","aggroot",Uve):"/etc/aggroot/settings.json"}function B4n(o){return[{path:W4n(),source:LF.Enterprise},{path:(0,Dte.join)(Ra,Uve),source:LF.User},{path:K3(o,Uve),source:LF.Project}]}async function z4n(o){try{let t=await(0,fB.readFile)(o,"utf-8"),r=JSON.parse(t);return Vve.debug({path:o},"Loaded settings file"),r}catch(t){return t.code==="ENOENT"||Vve.warn({path:o,error:String(t)},"Failed to load settings file"),null}}function G4n(o,t,r){let l={...o};return t.permissions&&(l.permissions={allow:[...l.permissions?.allow??[],...t.permissions.allow],deny:[...l.permissions?.deny??[],...t.permissions.deny],ask:[...l.permissions?.ask??[],...t.permissions.ask]}),t.hooks&&(l.hooks={...l.hooks,...t.hooks}),t.env&&(l.env={...l.env,...t.env}),t.mcp&&(l.mcp={...l.mcp,...t.mcp}),t.features&&(l.features={...l.features,...t.features}),t.preferences&&(l.preferences={...l.preferences,...t.preferences}),r===LF.Enterprise&&t.policy&&(l.policy=t.policy),t.version&&(!l.version||t.version>l.version)&&(l.version=t.version),l}function j4n(o){let t=o.policy;if(!t)return o;let r={...o};return t.allowManagedMcpServersOnly&&t.allowedMcpServers&&r.mcp?.autoConnectServers&&(r.mcp.autoConnectServers=r.mcp.autoConnectServers.filter(l=>t.allowedMcpServers.includes(l))),t.blockedTools?.length&&(r.permissions={allow:[...r.permissions?.allow??[]],deny:[...r.permissions?.deny??[],...t.blockedTools],ask:[...r.permissions?.ask??[]]}),t.requireApproval?.length&&(r.permissions={allow:[...r.permissions?.allow??[]],deny:[...r.permissions?.deny??[]],ask:[...r.permissions?.ask??[],...t.requireApproval]}),r}async function P2t(o){let t=B4n(o),r=await Promise.all(t.map(({path:u})=>z4n(u))),l={};for(let u=0;u<r.length;u++){let f=r[u];if(!f)continue;let _=t[u].source;l.policy?.disableUserOverride&&_===LF.User||l.policy?.disableProjectOverride&&_===LF.Project||(l=G4n(l,f,_))}return l=j4n(l),l}async function Pte(o){let t=(0,Dte.join)(Ra,Uve);try{let r={};try{let l=await(0,fB.readFile)(t,"utf-8");r=JSON.parse(l)}catch{}r.preferences={...r.preferences,...o},await(0,fB.mkdir)(Ra,{recursive:!0}),await(0,fB.writeFile)(t,JSON.stringify(r,null,2),"utf-8"),Vve.info({path:t,prefs:o},"User preferences saved")}catch(r){Vve.warn({error:String(r)},"Failed to save user preferences (non-fatal)")}}FQ();ne();ne();var aU=require("node:fs/promises"),n$e=require("node:path"),r$e=require("node:fs"),i$e=bs(require("node:https"),1);qT();qT();ef();var Rte=class{_cachePath;_registryBase;_checkIntervalMs;_enabled;constructor(t){this._cachePath=(0,n$e.join)(t?.dataDir??Ra,KIt),this._registryBase=t?.registryBase??"https://registry.npmjs.org",this._checkIntervalMs=t?.checkIntervalMs??$It,this._enabled=t?.enabled??!0}async checkForUpdate(t){if(!this._enabled)return null;if(!t?.force){let _=await this._loadCache();if(_&&Date.now()-new Date(_.lastCheckTime).getTime()<this._checkIntervalMs)return{hasUpdate:this._isNewer(_.latestVersion,vv),currentVersion:vv,latestVersion:_.latestVersion,checkedAt:_.lastCheckTime}}let r=await this._fetchLatestVersion();if(!r)return null;let l=this._isNewer(r,vv),u=new Date().toISOString(),f={lastCheckTime:u,latestVersion:r,currentVersionAtCheck:vv,hasUpdate:l};return await this._saveCache(f),{hasUpdate:l,currentVersion:vv,latestVersion:r,checkedAt:u}}async checkInBackground(){try{return await this.checkForUpdate()}catch{return null}}async getCachedResult(){let t=await this._loadCache();return t?{hasUpdate:this._isNewer(t.latestVersion,vv),currentVersion:vv,latestVersion:t.latestVersion,checkedAt:t.lastCheckTime}:null}_isNewer(t,r){let l=t.replace(/^v/,"").split(".").map(Number),u=r.replace(/^v/,"").split(".").map(Number);for(let f=0;f<3;f++){if((l[f]??0)>(u[f]??0))return!0;if((l[f]??0)<(u[f]??0))return!1}return!1}_fetchLatestVersion(){let t=`${this._registryBase}/aggroot/latest`;return new Promise(r=>{let l=setTimeout(()=>{u.destroy(),r(null)},hje),u=i$e.default.get(t,f=>{if(f.statusCode===301||f.statusCode===302){let y=f.headers.location;if(y){clearTimeout(l),r(this._fetchFromUrl(y));return}}if(f.statusCode!==200){clearTimeout(l),f.resume(),r(null);return}let _="";f.on("data",y=>{_+=y.toString()}),f.on("end",()=>{clearTimeout(l);try{let y=JSON.parse(_);r(y.version??null)}catch{r(null)}}),f.on("error",()=>{clearTimeout(l),r(null)})});u.on("error",()=>{clearTimeout(l),r(null)})})}_fetchFromUrl(t){return new Promise(r=>{let l=setTimeout(()=>{u.destroy(),r(null)},hje),u=i$e.default.get(t,f=>{if(f.statusCode!==200){clearTimeout(l),f.resume(),r(null);return}let _="";f.on("data",y=>{_+=y.toString()}),f.on("end",()=>{clearTimeout(l);try{let y=JSON.parse(_);r(y.version??null)}catch{r(null)}})});u.on("error",()=>{clearTimeout(l),r(null)})})}async _loadCache(){try{if(!(0,r$e.existsSync)(this._cachePath))return null;let t=await(0,aU.readFile)(this._cachePath,"utf-8");return JSON.parse(t)}catch{return null}}async _saveCache(t){try{let r=(0,n$e.join)(this._cachePath,"..");(0,r$e.existsSync)(r)||await(0,aU.mkdir)(r,{recursive:!0}),await(0,aU.writeFile)(this._cachePath,JSON.stringify(t,null,2),"utf-8")}catch{}}};ne();var Kve=require("node:child_process"),N2t=require("node:util"),k2t=require("node:fs"),s$e=require("node:path");qT();qT();ne();var lU=require("node:fs/promises"),o$e=require("node:path"),Hve=require("node:fs"),R2t=require("node:child_process"),M2t=require("node:util");ef();qT();var V4n=(0,M2t.promisify)(R2t.execFile),Mte=class{_rollbackPath;constructor(t){this._rollbackPath=(0,o$e.join)(t??Ra,qIt)}async createBackup(t,r){let l={previousVersion:t,upgradedFrom:t,upgradedTo:"",upgradedAt:new Date().toISOString(),installPath:r};await this._save(l)}async markUpgraded(t){let r=await this._load();r&&(r.upgradedTo=t,await this._save(r))}async isRollbackAvailable(){let t=await this._load();return t!==null&&!!t.previousVersion}async getRollbackInfo(){return this._load()}async rollback(t){let r=await this._load();if(!r||!r.previousVersion)return{success:!1,version:"",error:"\u6CA1\u6709\u53EF\u56DE\u6EDA\u7684\u7248\u672C\u4FE1\u606F"};let l=t??"npm";try{let{stdout:u,stderr:f}=await V4n(l,["install","-g",`aggroot@${r.previousVersion}`],{timeout:pge,encoding:"utf-8",shell:!0}),_=f?.trim();return _&&!_.includes("WARN")&&!_.includes("warn")?{success:!1,version:r.previousVersion,error:_}:(await this.clearRollback(),{success:!0,version:r.previousVersion})}catch(u){return{success:!1,version:r.previousVersion,error:u.message??String(u)}}}async clearRollback(){try{if((0,Hve.existsSync)(this._rollbackPath)){let{unlink:t}=await import("node:fs/promises");await t(this._rollbackPath)}}catch{}}async _load(){try{if(!(0,Hve.existsSync)(this._rollbackPath))return null;let t=await(0,lU.readFile)(this._rollbackPath,"utf-8");return JSON.parse(t)}catch{return null}}async _save(t){try{let r=(0,o$e.join)(this._rollbackPath,"..");(0,Hve.existsSync)(r)||await(0,lU.mkdir)(r,{recursive:!0}),await(0,lU.writeFile)(this._rollbackPath,JSON.stringify(t,null,2),"utf-8")}catch{}}};var $ve=(0,N2t.promisify)(Kve.execFile),Nte=class{_updateChecker;_rollbackManager;constructor(t){this._updateChecker=new Rte({dataDir:t?.dataDir}),this._rollbackManager=new Mte(t?.dataDir)}get updateChecker(){return this._updateChecker}get rollbackManager(){return this._rollbackManager}async getInstallInfo(){let t=await this._findNpm(),r=await this._isNpmGlobalInstall(),l="";if(t)try{let{stdout:u}=await $ve(t,["root","-g"],{timeout:1e4,encoding:"utf-8",shell:!0});l=(0,s$e.join)(u.trim(),"aggroot")}catch{}return{isNpmGlobalInstall:r,installPath:l,version:vv,npmPath:t}}async upgrade(t,r,l){let u=vv;t?.({step:"checking-env",message:"\u6B63\u5728\u68C0\u67E5\u5347\u7EA7\u73AF\u5883...",percent:5});let f=r??await this.getInstallInfo();if(!f.npmPath)return{success:!1,fromVersion:u,toVersion:"",error:"\u672A\u627E\u5230 npm \u547D\u4EE4\uFF0C\u65E0\u6CD5\u6267\u884C\u5347\u7EA7\u3002\u8BF7\u786E\u4FDD npm \u5DF2\u5B89\u88C5\u5E76\u5728 PATH \u4E2D\u3002"};if(!f.isNpmGlobalInstall)return{success:!1,fromVersion:u,toVersion:"",error:"\u5F53\u524D\u975E npm \u5168\u5C40\u5B89\u88C5\uFF0C\u4E0D\u652F\u6301\u81EA\u52A8\u5347\u7EA7\u3002\u8BF7\u901A\u8FC7\u6E90\u7801\u65B9\u5F0F\u624B\u52A8\u66F4\u65B0\u3002"};t?.({step:"checking-version",message:"\u6B63\u5728\u68C0\u67E5\u6700\u65B0\u7248\u672C...",percent:15});let _=l??await this._updateChecker.checkForUpdate({force:!0});if(!_)return{success:!1,fromVersion:u,toVersion:"",error:"\u65E0\u6CD5\u83B7\u53D6\u6700\u65B0\u7248\u672C\u4FE1\u606F\uFF0C\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u3002"};if(!_.hasUpdate)return{success:!1,fromVersion:u,toVersion:vv,error:`\u5F53\u524D\u5DF2\u662F\u6700\u65B0\u7248\u672C (${vv})`};let y=_.latestVersion;t?.({step:"backing-up",message:"\u6B63\u5728\u5907\u4EFD\u56DE\u6EDA\u4FE1\u606F...",percent:25}),await this._rollbackManager.createBackup(u,f.installPath),t?.({step:"downloading",message:`\u6B63\u5728\u4E0B\u8F7D aggroot@${y}...`,percent:30});let T=await this._spawnNpmInstall(y,t);return T.success?(t?.({step:"verifying",message:"\u6B63\u5728\u9A8C\u8BC1\u5B89\u88C5...",percent:90}),await this._verifyInstallation(f.npmPath,y)?(await this._rollbackManager.markUpgraded(y),t?.({step:"done",message:"\u5347\u7EA7\u5B8C\u6210",percent:100}),{success:!0,fromVersion:u,toVersion:y}):{success:!1,fromVersion:u,toVersion:y,error:"\u5B89\u88C5\u9A8C\u8BC1\u5931\u8D25\uFF0C\u65B0\u7248\u672C\u53EF\u80FD\u672A\u6B63\u786E\u5B89\u88C5\u3002\u8BF7\u624B\u52A8\u68C0\u67E5\u3002"}):{success:!1,fromVersion:u,toVersion:y,error:T.error??"npm \u5B89\u88C5\u5931\u8D25"}}async rollback(t){if(!(await this.getInstallInfo()).npmPath)return{success:!1,version:"",error:"\u672A\u627E\u5230 npm \u547D\u4EE4\uFF0C\u65E0\u6CD5\u6267\u884C\u56DE\u6EDA\u3002"};t?.({step:"installing",message:"\u6B63\u5728\u56DE\u6EDA\u5230\u4E0A\u4E00\u7248\u672C...",percent:30});let l=await this._rollbackManager.getRollbackInfo();if(!l)return{success:!1,version:"",error:"\u6CA1\u6709\u53EF\u56DE\u6EDA\u7684\u7248\u672C\u4FE1\u606F"};let u=await this._spawnNpmInstall(l.previousVersion,t);return u.success?(await this._rollbackManager.clearRollback(),t?.({step:"done",message:"\u56DE\u6EDA\u5B8C\u6210",percent:100}),{success:!0,version:l.previousVersion}):{success:!1,version:l.previousVersion,error:u.error}}async checkForUpdate(){return this._updateChecker.checkForUpdate()}_spawnNpmInstall(t,r){return new Promise(l=>{let u=(0,Kve.spawn)("npm",["install","-g",`aggroot@${t}`],{shell:!0,timeout:pge}),f="";u.stdout?.on("data",_=>{let y=_.toString("utf-8");this._parseNpmProgress(y,t,r)}),u.stderr?.on("data",_=>{f+=_.toString("utf-8")}),u.on("close",_=>{if(_!==0){let T=f.split(`
|
|
44404
44404
|
`).filter(I=>I.trim()&&!I.includes("WARN")&&!I.includes("warn"));f.includes("ERR!")?l({success:!1,error:`npm \u5B89\u88C5\u5931\u8D25: ${T.join(`
|
|
44405
44405
|
`)}`}):l({success:!1,error:`npm \u5B89\u88C5\u5931\u8D25 (\u9000\u51FA\u7801: ${_})`});return}let y=f.split(`
|
|
44406
44406
|
`).filter(T=>T.trim()&&!T.includes("WARN")&&!T.includes("warn"));if(y.length>0&&f.includes("ERR!")){l({success:!1,error:`npm \u5B89\u88C5\u5931\u8D25: ${y.join(`
|