@mk-co/neox-cli 2.0.7 → 2.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -45,13 +45,15 @@
45
45
  ### CLI
46
46
 
47
47
  ```bash
48
- # 安装
48
+ # 安装(默认:轻量版,无需编译)
49
49
  npm install -g @mk-co/neox-cli
50
50
 
51
51
  # 启动
52
52
  neox
53
53
  ```
54
54
 
55
+ **需要 Electron UI?** 参见 [Windows 安装指南](docs/WINDOWS.md)
56
+
55
57
  ### Desktop
56
58
 
57
59
  从 [Releases](https://github.com/mk-co/Neox/releases) 下载对应平台安装包。
package/dist/cli/main.js CHANGED
@@ -5,7 +5,7 @@ import*as an from'fs';import an__default,{readFileSync,createReadStream,realpath
5
5
  `));}function vg(s,e,t){if(process.env.CLI_DEBUG==="1"&&(f.debug(s,e,t),process.env.CLI_DEBUG_CONSOLE==="1")){let n=s?`[${s}]`:"";t!==void 0?console.log(n,e,t):console.log(n,e);}}function ma(){process.on("uncaughtException",s=>{f.error("CRASH","Uncaught Exception",{name:s.name,message:s.message,stack:s.stack}),setTimeout(()=>process.exit(1),100);}),process.on("unhandledRejection",s=>{f.error("CRASH","Unhandled Rejection",{reason:s instanceof Error?{name:s.name,message:s.message,stack:s.stack}:s});});try{process.on("SIGTTIN","ignore"),process.on("SIGTTOU","ignore"),f.info("SIGNAL","TTY control signals (SIGTTIN/SIGTTOU) initialized in crashHandler");}catch{}process.on("exit",()=>{f.close();});}var ua,f,da,Je,le=K(()=>{ua=class{logDir;enabled=true;initialized=false;writeStream=null;currentLogFile=null;backpressured=false;constructor(){this.logDir=te__default.join(ti__default.homedir(),".neox","logs");}init(){if(!this.initialized)try{an__default.existsSync(this.logDir)||an__default.mkdirSync(this.logDir,{recursive:!0}),this.initialized=!0;}catch{this.enabled=false;}}getLogFilePath(){let e=new Date().toISOString().split("T")[0];return te__default.join(this.logDir,`cli-${e}.log`)}ensureStream(){if(!this.enabled||(this.init(),!this.initialized))return null;let e=this.getLogFilePath();return this.currentLogFile!==e&&(this.writeStream&&this.writeStream.end(),this.writeStream=an__default.createWriteStream(e,{flags:"a"}),this.currentLogFile=e),this.writeStream}formatLocalTime(){let e=new Date,t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0"),i=String(e.getHours()).padStart(2,"0"),o=String(e.getMinutes()).padStart(2,"0"),a=String(e.getSeconds()).padStart(2,"0"),l=String(e.getMilliseconds()).padStart(3,"0");return `${t}-${n}-${r} ${i}:${o}:${a}.${l}`}formatMessage(e,t,n,r){let i=this.formatLocalTime(),o=e.toUpperCase().padEnd(5),a=t?`[${t}]`:"",l=`${i} ${o} ${a} ${n}`;if(r!==void 0)try{let c=this.safeStringify(r);l+=` ${c}`;}catch{l+=" [Serialization Error]";}return l+`
6
6
  `}safeStringify(e){let t=new WeakSet;return JSON.stringify(e,(n,r)=>{if(typeof r=="object"&&r!==null){if(t.has(r))return "[Circular]";t.add(r);}return n==="parser"||n==="socket"||n==="_httpMessage"||n==="req"||n==="res"?"[Omitted]":r&&r.type==="Buffer"&&Array.isArray(r.data)?"[Buffer]":typeof r=="function"?"[Function]":r instanceof Error?{name:r.name,message:r.message,stack:r.stack}:r})}write(e,t,n,r){if(!this.enabled)return;let i=this.ensureStream();if(!i||this.backpressured&&e==="debug")return;let o=this.formatMessage(e,t,n,r);!i.write(o)&&!this.backpressured&&(this.backpressured=true,i.once("drain",()=>{this.backpressured=false;}));}debug(e,t,n){this.write("debug",e,t,n);}info(e,t,n){this.write("info",e,t,n);}warn(e,t,n){this.write("warn",e,t,n);}error(e,t,n){this.write("error",e,t,n);}log(e,...t){let n=t.map(r=>{if(typeof r=="string")return r;try{return this.safeStringify(r)}catch{return String(r)}}).join(" ");this.write("info",e,n);}setEnabled(e){this.enabled=e;}getLogDir(){return this.logDir}getCurrentLogFile(){return this.currentLogFile}close(){this.writeStream&&(this.writeStream.end(),this.writeStream=null,this.currentLogFile=null);}},f=new ua;da=class{intervalId=null;lastHeartbeat=Date.now();heartbeatCount=0;stdinPausedCount=0;enabled=false;pid=process.pid;start(e=5e3){if(!(this.intervalId||process.env.CLI_DEBUG!=="1")){if(!process.stdin.isTTY){f.debug("HEALTH",`Skipping health monitor in non-TTY process (pid=${this.pid})`);return}this.enabled=true,this.lastHeartbeat=Date.now(),this.heartbeatCount=0,this.stdinPausedCount=0,f.info("HEALTH",`Health monitor started (interval: ${e}ms, pid=${this.pid})`),this.intervalId=setInterval(()=>{this.checkHealth();},e),this.intervalId.unref();}}stop(){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null,this.enabled=false,f.info("HEALTH","Health monitor stopped"));}stdinDestroyedCount=0;checkHealth(){let e=Date.now(),t=e-this.lastHeartbeat;this.lastHeartbeat=e,this.heartbeatCount++;let n=this.getStdinState();if(n.isPaused?this.stdinPausedCount++:this.stdinPausedCount=0,n.destroyed){if(this.stdinDestroyedCount++,this.stdinDestroyedCount>=3){f.warn("HEALTH",`[pid=${this.pid}] stdin destroyed for ${this.stdinDestroyedCount} checks, exiting to avoid zombie process`),this.stop(),setTimeout(()=>{process.exit(0);},100);return}}else this.stdinDestroyedCount=0;f.debug("HEALTH",`[pid=${this.pid}] Heartbeat #${this.heartbeatCount}`,{elapsed:`${t}ms`,stdin:n,stdinPausedCount:this.stdinPausedCount}),this.stdinPausedCount>=3&&f.warn("HEALTH",`[pid=${this.pid}] \u26A0\uFE0F stdin has been paused for ${this.stdinPausedCount} consecutive checks!`,{stdin:n}),t>1e4&&f.warn("HEALTH",`[pid=${this.pid}] \u26A0\uFE0F Event loop delay detected: ${t}ms (expected ~5000ms)`);}getStdinState(){let e=process.stdin;return {isPaused:typeof e.isPaused=="function"?e.isPaused():false,isTTY:!!e.isTTY,isRaw:!!e.isRaw,readable:e.readable,destroyed:e.destroyed}}logStdinState(e){if(process.env.CLI_DEBUG!=="1")return;let t=this.getStdinState();f.debug("STDIN",`[${e}] stdin state`,t);}logInkState(e,t){process.env.CLI_DEBUG==="1"&&f.debug("INK",`[${e}]`,t);}},Je=new da;});var Ou=Us((L0,Lu)=>{var Au=fu("fs"),ya=fu("path"),Mu=ya.join(__dirname,"path.txt");function Eg(){let s;if(Au.existsSync(Mu)&&(s=Au.readFileSync(Mu,"utf-8")),process.env.ELECTRON_OVERRIDE_DIST_PATH)return ya.join(process.env.ELECTRON_OVERRIDE_DIST_PATH,s||"electron");if(s)return ya.join(__dirname,"dist",s);throw new Error("Electron failed to install correctly, please delete node_modules/electron and try installing again")}Lu.exports=Eg();});var Nu,zs,fi,gi,zn,qs=K(()=>{Nu={enabled:false,autoPrompt:true,languages:["typescript","javascript","python","java","go","rust"],include:["**/*.ts","**/*.tsx","**/*.js","**/*.jsx","**/*.py","**/*.java","**/*.go","**/*.rs"],exclude:["**/node_modules/**","**/.git/**","**/dist/**","**/build/**","**/__pycache__/**","**/target/**","**/vendor/**"],cacheDir:".neox/index",maxFileSize:5},zs=200,fi=10,gi=4e3,zn=700;});function Uu(s){return createHash("md5").update(s).digest("hex")}async function Fu(s){try{return await he.access(s),!0}catch{return false}}async function Ks(s){try{await he.mkdir(s,{recursive:!0});}catch(e){if(e.code!=="EEXIST")throw e}}async function Ta(s,e,t){let r=(await he.readFile(s,"utf-8")).split(`
7
7
  `),i=r.length,o=Math.max(0,e-1),a=Math.min(r.length,t);return {lines:r.slice(o,a),totalLines:i}}function Ke(s,e){return s.map((t,n)=>`${String(e+n).padStart(6)} \u2502 ${t}`).join(`
8
- `)}function Vn(s,e){let n=te.relative(e,s).split(te.sep),r=n.findIndex(i=>["src","lib","app","core","packages","modules"].includes(i));return r>=0&&r+1<n.length?n[r+1]:n[0]||"root"}function wa(s){let e=te.extname(s).toLowerCase();return {".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".java":"java",".go":"go",".rs":"rust",".c":"c",".cpp":"cpp",".cc":"cpp",".h":"c",".hpp":"cpp",".cs":"csharp",".rb":"ruby",".php":"php",".swift":"swift",".kt":"kotlin",".scala":"scala",".vue":"vue",".svelte":"svelte"}[e]||null}function mn(s,e,t="{([",n="})]"){let r=[],i=false;for(let o=e;o<s.length;o++){let a=s[o];for(let l of a){let c=t.indexOf(l),u=n.indexOf(l);c!==-1?(r.push(n[c]),i=true):u!==-1&&r.length>0&&r[r.length-1]===l&&r.pop();}if(i&&r.length===0)return o+1}return Math.min(e+500,s.length)}function Bu(s,e,t=["^\\s*(export\\s+)?(async\\s+)?function\\s+","^\\s*(export\\s+)?class\\s+","^\\s*(export\\s+)?(const|let|var)\\s+\\w+\\s*=\\s*(async\\s+)?\\(","^\\s*(export\\s+)?(const|let|var)\\s+\\w+\\s*=\\s*(async\\s+)?function","^\\s*(public|private|protected|static|async)*\\s*\\w+\\s*\\(","^\\s*def\\s+","^\\s*class\\s+","^\\s*func\\s+","^\\s*fn\\s+"]){let n=t.map(r=>new RegExp(r));for(let r=e;r>=0;r--){let i=s[r];for(let o of n)if(o.test(i))return r;if(r<e&&i.trim()===""){let o=s.slice(0,r).reverse().findIndex(a=>a.trim()!=="");if(o>=0){let a=s[r-1-o];if(!a.trim().startsWith("@")&&!a.trim().startsWith("#")&&!a.trim().startsWith("//")&&!a.trim().startsWith("/*"))break}}}return Math.max(0,e-5)}function ka(s,e){let t=s.length>e.length?s:e,n=s.length>e.length?e:s;if(t.length===0)return 1;let r=qg(t,n);return (t.length-r)/t.length}function qg(s,e){let t=s.length,n=e.length,r=Array(t+1).fill(null).map(()=>Array(n+1).fill(0));for(let i=0;i<=t;i++)r[i][0]=i;for(let i=0;i<=n;i++)r[0][i]=i;for(let i=1;i<=t;i++)for(let o=1;o<=n;o++)s[i-1]===e[o-1]?r[i][o]=r[i-1][o-1]:r[i][o]=Math.min(r[i-1][o]+1,r[i][o-1]+1,r[i-1][o-1]+1);return r[t][n]}function Yn(s){return s.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")}var Rn=K(()=>{});function Ca(s){return new yi(s)}var yi,Ea=K(()=>{qs();Rn();yi=class{workspacePath;indexManager=null;constructor(e){this.workspacePath=e;}setIndexManager(e){this.indexManager=e;}async read(e){let{path:t,locator:n,mode:r="smart",autoFullThreshold:i,chunkSize:o=zs,expandContext:a=fi,maxLines:l=gi,useIndex:c=true}=e;try{let u=this.resolvePath(t);if((await he.stat(u)).isDirectory())return this.errorResult(t,"\u8FD9\u662F\u4E00\u4E2A\u76EE\u5F55\uFF0C\u4E0D\u662F\u6587\u4EF6");switch(r){case "full":return this.readFull(u,t,l);case "chunk":return !n||n.type!=="line"?this.readChunk(u,t,1,o):this.readChunk(u,t,n.start,n.end?n.end-n.start+1:o);case "smart":default:return this.smartRead(u,t,n,{autoFullThreshold:i,chunkSize:o,expandContext:a,maxLines:l,useIndex:c})}}catch(u){return u.code==="ENOENT"?this.errorResult(t,"\u6587\u4EF6\u4E0D\u5B58\u5728"):this.errorResult(t,u.message)}}async smartRead(e,t,n,r){let{autoFullThreshold:i,chunkSize:o,expandContext:a,maxLines:l,useIndex:c}=r;if(!n){if(typeof i=="number"&&i>0){let u=await he.readFile(e,"utf-8"),d=Yn(u).split(`
8
+ `)}function Vn(s,e){let n=te.relative(e,s).split(te.sep),r=n.findIndex(i=>["src","lib","app","core","packages","modules"].includes(i));return r>=0&&r+1<n.length?n[r+1]:n[0]||"root"}function wa(s){let e=te.extname(s).toLowerCase();return {".ts":"typescript",".tsx":"typescript",".js":"javascript",".jsx":"javascript",".mjs":"javascript",".cjs":"javascript",".py":"python",".java":"java",".go":"go",".rs":"rust",".c":"c",".cpp":"cpp",".cc":"cpp",".h":"c",".hpp":"cpp",".cs":"csharp",".rb":"ruby",".php":"php",".swift":"swift",".kt":"kotlin",".scala":"scala",".vue":"vue",".svelte":"svelte"}[e]||null}function mn(s,e,t="{([",n="})]"){let r=[],i=false;for(let o=e;o<s.length;o++){let a=s[o];for(let l of a){let c=t.indexOf(l),u=n.indexOf(l);c!==-1?(r.push(n[c]),i=true):u!==-1&&r.length>0&&r[r.length-1]===l&&r.pop();}if(i&&r.length===0)return o+1}return Math.min(e+500,s.length)}function Bu(s,e,t=["^\\s*(export\\s+)?(async\\s+)?function\\s+","^\\s*(export\\s+)?class\\s+","^\\s*(export\\s+)?(const|let|var)\\s+\\w+\\s*=\\s*(async\\s+)?\\(","^\\s*(export\\s+)?(const|let|var)\\s+\\w+\\s*=\\s*(async\\s+)?function","^\\s*(public|private|protected|static|async)*\\s*\\w+\\s*\\(","^\\s*def\\s+","^\\s*class\\s+","^\\s*func\\s+","^\\s*fn\\s+"]){let n=t.map(r=>new RegExp(r));for(let r=e;r>=0;r--){let i=s[r];for(let o of n)if(o.test(i))return r;if(r<e&&i.trim()===""){let o=s.slice(0,r).reverse().findIndex(a=>a.trim()!=="");if(o>=0){let a=s[r-1-o];if(!a.trim().startsWith("@")&&!a.trim().startsWith("#")&&!a.trim().startsWith("//")&&!a.trim().startsWith("/*"))break}}}return Math.max(0,e-5)}function ka(s,e){let t=s.length>e.length?s:e,n=s.length>e.length?e:s;if(t.length===0)return 1;let r=qg(t,n);return (t.length-r)/t.length}function qg(s,e){let t=s.length,n=e.length,r=Array(t+1).fill(null).map(()=>Array(n+1).fill(0));for(let i=0;i<=t;i++)r[i][0]=i;for(let i=0;i<=n;i++)r[0][i]=i;for(let i=1;i<=t;i++)for(let o=1;o<=n;o++)s[i-1]===e[o-1]?r[i][o]=r[i-1][o-1]:r[i][o]=Math.min(r[i-1][o]+1,r[i][o-1]+1,r[i-1][o-1]+1);return r[t][n]}function Yn(s){return s.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")}var Rn=K(()=>{});function Ca(s){return new yi(s)}var yi,Ea=K(()=>{qs();Rn();yi=class{workspacePath;indexManager=null;constructor(e){this.workspacePath=e;}setIndexManager(e){this.indexManager=e;}async read(e){let{path:t,locator:n,mode:r="smart",autoFullThreshold:i,chunkSize:o=zs,expandContext:a=fi,maxLines:l=gi,useIndex:c=true}=e;try{let u=this.resolvePath(t);if((await he.stat(u)).isDirectory())return this.errorResult(t,"\u8FD9\u662F\u4E00\u4E2A\u76EE\u5F55\uFF0C\u4E0D\u662F\u6587\u4EF6");switch(r){case "full":return this.readFull(u,t,l);case "chunk":return !n||n.type!=="line"?this.readChunk(u,t,1,o):this.readChunk(u,t,n.start,n.end?n.end-n.start+1:o);default:return this.smartRead(u,t,n,{autoFullThreshold:i,chunkSize:o,expandContext:a,maxLines:l,useIndex:c})}}catch(u){return u.code==="ENOENT"?this.errorResult(t,"\u6587\u4EF6\u4E0D\u5B58\u5728"):this.errorResult(t,u.message)}}async smartRead(e,t,n,r){let{autoFullThreshold:i,chunkSize:o,expandContext:a,maxLines:l,useIndex:c}=r;if(!n){if(typeof i=="number"&&i>0){let u=await he.readFile(e,"utf-8"),d=Yn(u).split(`
9
9
  `),p=d.length;if(p<=i){let g=Math.min(p,l),y=d.slice(0,g);return {success:true,path:t,totalLines:p,startLine:1,endLine:g,content:Ke(y,1),truncated:g<p,strategy:"full"}}let m=Math.min(o,p),h=d.slice(0,m);return {success:true,path:t,totalLines:p,startLine:1,endLine:m,content:Ke(h,1),truncated:m<p,strategy:"chunk"}}return this.readChunk(e,t,1,o)}switch(n.type){case "line":return this.readByLine(e,t,n.start,n.end,o);case "pattern":return this.readByPattern(e,t,n.regex,{matchIndex:n.matchIndex||1,context:n.context||a,chunkSize:o});case "symbol":return this.readBySymbol(e,t,n.name,{kind:n.kind,fuzzy:n.fuzzy,chunkSize:o,useIndex:c});case "function":return this.readBySymbol(e,t,n.name,{kind:"function",className:n.className,chunkSize:o,useIndex:c});case "class":return this.readBySymbol(e,t,n.name,{kind:"class",chunkSize:o,useIndex:c});case "range":return this.readByRange(e,t,n.startPattern,n.endPattern,o);default:return this.readChunk(e,t,1,o)}}async readByLine(e,t,n,r,i){let o=r||n+i-1,{lines:a,totalLines:l}=await Ta(e,n,o);return {success:true,path:t,totalLines:l,startLine:n,endLine:Math.min(o,l),content:Ke(a,n),truncated:o<l,strategy:"chunk"}}async readByPattern(e,t,n,r){let{matchIndex:i,context:o,chunkSize:a}=r,c=(await he.readFile(e,"utf-8")).split(`
10
10
  `),u=c.length,d;try{d=new RegExp(n,"gi");}catch(x){return this.errorResult(t,`\u65E0\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F: ${x.message}`)}let p=[];if(c.forEach((x,S)=>{d.test(x)&&p.push(S+1),d.lastIndex=0;}),p.length===0)return {success:true,path:t,totalLines:u,startLine:1,endLine:Math.min(a,u),content:`\u672A\u627E\u5230\u5339\u914D: "${n}"
11
11
 
@@ -871,7 +871,7 @@ Command: ${D} ${se.join(" ")}`;throw new Error(`ripgrep failed (exit code ${Re})
871
871
  `)){if(y(),De++,De%x===0&&await S(),!Pe.trim())continue;let Se;try{Se=JSON.parse(Pe);}catch{continue}if(Se.type==="summary"){let Bn=Se.data?.stats;Bn&&typeof Bn.searches=="number"&&(pe=Math.max(pe,Bn.searches));continue}let Ae=Se.type==="match",pt=Se.type==="context";if(!Ae&&!pt)continue;let Me=Se.data,Tt=Me?.path?.text,$s=Me?.line_number,pu=Me?.lines?.text,mu=Array.isArray(Me?.submatches)?Me.submatches[0]:void 0;if(!Tt||!$s||typeof pu!="string")continue;let hu=pu.replace(/\n$/,""),la=J.get(Tt)||new Map,Ns=la.get($s)||{line:hu,queryIds:new Set};if(Ns.line=hu,Ae){Ns.queryIds.add(ie.id),Ns.column===void 0&&mu?.start!==void 0&&(Ns.column=mu.start+1);let Bn=ye.get(Tt)||new Set;Bn.add(ie.id),ye.set(Tt,Bn);}la.set($s,Ns),J.set(Tt,la);}}}let _e=new Set(W.map(D=>D.id)),Q=[],be=0,Te=0,P=0,O=[],q=[],X=0;for(let[D,ie]of J.entries()){if(y(),be>=p&&!m)break;X++,X%x===0&&await S();let se=ye.get(D)||new Set,fe=!0;if(_e.forEach(Se=>{se.has(Se)||(fe=!1);}),!fe)continue;let Re=Array.from(ie.keys()).sort((Se,Ae)=>Se-Ae).filter(Se=>{let Ae=ie.get(Se);return Ae?!ce.some(pt=>pt.test(Ae.line)):!1});if(Re.length===0)continue;Te++,be+=Re.length;let ue=Ue(D);if(O.push({file:ue,anchor_lines:Re.slice(0,20),num_lines:Ie}),m){Q.push({file:D,matches:[],matchCount:Re.length});continue}y();let De=[];Array.from(ie.keys()).sort((Se,Ae)=>Se-Ae).forEach(Se=>{let Ae=ie.get(Se);if(!Ae)return;let pt=Re.includes(Se);if(De.push({lineNum:Se,line:Ae.line,isMatch:pt}),pt&&q.length<p){for(let Me of Ae.queryIds)if(q.push({file:ue,line:Se,column:Ae.column,preview:Ae.line,queryId:Me}),q.length>=p)break}}),Q.push({file:D,matches:De,matchCount:Re.length});}Q.sort((D,ie)=>Ue(D.file).localeCompare(Ue(ie.file)));let de=D=>{let se=Ue(D).split(te__default.sep),fe=se.findIndex(xe=>["src","lib","app","core","packages"].includes(xe));return fe>=0&&fe+1<se.length?se[fe+1]:se[0]||"root"},V=[`\u2713 \u641C\u7D22: ${U}`,`\u25B8 \u8DEF\u5F84: ${I}${E?" (\u9012\u5F52)":""}${L==="ancestor"?" (auto-resolved)":""}`,l?`\u25B8 \u6587\u4EF6\u8FC7\u6EE4: ${l}`:"",u?"\u25B8 \u6A21\u5F0F: \u5FFD\u7565\u5927\u5C0F\u5199":"",H?"\u25B8 \u7B56\u7565: ripgrep":"\u25B8 \u7B56\u7565: fallback","","\u2501\u2501\u2501\u2501 \u7ED3\u679C\u6458\u8981 \u2501\u2501\u2501\u2501",pe>0?`\u6587\u4EF6: ${pe} \u5DF2\u641C\u7D22, ${Te} \u6709\u5339\u914D`:`\u6587\u4EF6: ${Te} \u6709\u5339\u914D`,`\u5339\u914D: ${be}${be>=p?" (\u5DF2\u8FBE\u4E0A\u9650)":""}`].filter(D=>D!==""),re=new Map;for(let D of Q){let ie=de(D.file);re.set(ie,(re.get(ie)||0)+D.matchCount);}if(re.size>1){V.push(""),V.push("\u{1F4E6} \u6A21\u5757\u5206\u5E03:");let D=Array.from(re.entries()).sort((ie,se)=>se[1]-ie[1]);for(let[ie,se]of D.slice(0,5))V.push(` ${ie}: ${se}`);D.length>5&&V.push(` ... \u8FD8\u6709 ${D.length-5} \u4E2A\u6A21\u5757`);}if(V.push(""),m)V.push("\u{1F4CB} \u6587\u4EF6\u5217\u8868:"),Q.forEach(D=>{let ie=Ue(D.file),se=de(D.file);V.push(` [${se}] ${ie}: ${D.matchCount}`);});else for(let D of Q){if(y(),P>=p){V.push(`
872
872
  ... \u8FD8\u6709\u66F4\u591A\u5339\u914D (\u5DF2\u8FBE ${p} \u4E0A\u9650)`);break}let ie=Ue(D.file),se=de(D.file);V.push(`
873
873
  \u25B8 [${se}] ${ie} (${D.matchCount} \u5904)`),V.push("\u2500".repeat(50));let fe=-10;for(let xe of D.matches){if(P>=p)break;xe.lineNum>fe+1&&fe>0&&V.push(" \u2504\u2504\u2504");let Re=xe.isMatch?"\u25B6":" ";V.push(`${Re}${String(xe.lineNum).padStart(5)} \u2502 ${xe.line}`),fe=xe.lineNum,xe.isMatch&&P++;}}return Q.length===0?(V.push("\u672A\u627E\u5230\u5339\u914D\u5185\u5BB9"),V.push(""),V.push("\u{1F4A1} \u5EFA\u8BAE:"),V.push(" - \u5C1D\u8BD5 case_insensitive: true"),V.push(" - \u5C1D\u8BD5 recursive: true \u641C\u7D22\u5B50\u76EE\u5F55"),V.push(" - \u4F7F\u7528 keywords \u6216 queries \u7EC4\u5408\u641C\u7D22"),V.push(' - \u67E5\u6587\u4EF6\u540D\u8BF7\u7528 mode="files"')):O.length>0&&(V.push(""),V.push("\u{1F4A1} \u6279\u91CF\u8BFB\u53D6:"),O.slice(0,3).forEach(D=>{V.push(` readfile(path="${D.file}", anchor_lines=[${D.anchor_lines.join(",")}], num_lines=${D.num_lines})`);})),JSON.stringify(ke("search","success",Q.length>0?`search "${U}" (${be} matches)`:`search "${U}" (no matches)`,V.join(`
874
- `),{metadata:{mode:"content",strategy:H?"rg":"fallback",regex:M.some(D=>D.regex),case_insensitive:u,path:I,resolved_from:L,queries:M,matches:q,read_hints:O,files_with_matches:Te,command:Oe.length>0?Oe[0]:void 0}}))}catch(g){return JSON.stringify(ke("search","error",`search failed: ${g.message}`,void 0,{error:g.message}))}}},Pm=[cm,um,hm,fm,gm,dm,pm,mm,vm,xm,Sm,_m,Tm,wm,km,Cm,Em,ym,bm,Fp,Im,Rm,El,Il,Rl,Wp];Bx=[...Pm,Wl];});var Lr={};Fs(Lr,{SafeTTYWriter:()=>bo,SignalCategory:()=>Lm,safeTTYWriter:()=>Gx,setupCommonSignals:()=>Wx,signalManager:()=>en});function Wx(s){en.initialize(),s.onSIGINT&&en.register("SIGINT",s.onSIGINT,"user_interrupt"),s.onSIGTERM&&en.register("SIGTERM",s.onSIGTERM,"process_control"),s.onSIGHUP&&en.register("SIGHUP",s.onSIGHUP,"terminal_disconnect"),s.onSIGUSR1&&en.register("SIGUSR1",s.onSIGUSR1,"custom_recovery"),s.onSIGUSR2&&en.register("SIGUSR2",s.onSIGUSR2,"custom_recovery"),s.onSIGCONT&&en.register("SIGCONT",s.onSIGCONT,"process_control"),s.onSIGTSTP&&en.register("SIGTSTP",s.onSIGTSTP,"process_control");}var Lm,cc,en,bo,Gx,Or=K(()=>{le();Lm=(i=>(i.TTY_CONTROL="tty_control",i.TERMINAL_DISCONNECT="terminal_disconnect",i.PROCESS_CONTROL="process_control",i.USER_INTERRUPT="user_interrupt",i.CUSTOM_RECOVERY="custom_recovery",i))(Lm||{}),cc=class{handlers=new Map;initialized=false;isInForeground=true;initialize(){if(this.initialized){f.warn("SIGNAL","SignalManager already initialized");return}f.info("SIGNAL","Initializing SignalManager"),this.setupTTYControlSignals(),this.initialized=true;}setupTTYControlSignals(){if(process.platform==="win32"){f.debug("SIGNAL","Windows platform, skipping POSIX TTY signals");return}try{process.on("SIGTTIN","ignore"),process.on("SIGTTOU","ignore"),f.info("SIGNAL","TTY control signals (SIGTTIN/SIGTTOU) set to ignore");}catch(e){f.error("SIGNAL","Failed to setup TTY control signals",{error:e.message});}}register(e,t,n){this.initialized||(f.warn("SIGNAL",`Registering ${e} before initialization`),this.initialize()),this.handlers.has(e)||(this.handlers.set(e,[]),process.on(e,async()=>{let r=this.handlers.get(e)||[];f.debug("SIGNAL",`Received ${e}, executing ${r.length} handlers`);for(let i of r)try{await i();}catch(o){f.error("SIGNAL",`Handler failed for ${e}`,{error:o.message});}})),this.handlers.get(e).push(t),f.debug("SIGNAL",`Registered handler for ${e} (category: ${n})`);}unregister(e,t){let n=this.handlers.get(e);if(!n)return;let r=n.indexOf(t);r!==-1&&(n.splice(r,1),f.debug("SIGNAL",`Unregistered handler for ${e}`)),n.length===0&&(this.handlers.delete(e),process.removeAllListeners(e),f.debug("SIGNAL",`Removed all listeners for ${e}`));}unregisterAll(){for(let e of this.handlers.keys())process.removeAllListeners(e);this.handlers.clear(),f.info("SIGNAL","Unregistered all signal handlers");}checkForeground(){if(process.platform==="win32")return true;try{let e=process.pid,t=process.getpgid?.(e)??e;return process.stdin.isTTY?(this.isInForeground=!0,!0):!1}catch{return true}}getRegisteredSignals(){return Array.from(this.handlers.keys())}reset(){this.unregisterAll(),this.initialized=false,f.info("SIGNAL","SignalManager reset");}},en=new cc,bo=class s{static instance;static getInstance(){return s.instance||(s.instance=new s),s.instance}writeStdout(e){try{return process.stdout.destroyed||!process.stdout.writable?!1:(process.stdout.write(e),!0)}catch(t){return process.env.CLI_DEBUG==="1"&&f.debug("TTY","stdout write failed",{error:t.message}),false}}writeStderr(e){try{return process.stderr.destroyed||!process.stderr.writable?!1:(process.stderr.write(e),!0)}catch(t){return process.env.CLI_DEBUG==="1"&&f.debug("TTY","stderr write failed",{error:t.message}),false}}safeWriteStdout(e,t){let n=this.writeStdout(e);return !n&&t?.fallbackToStderr?this.writeStderr(e):(!n&&t?.onError&&t.onError(new Error("Failed to write to stdout")),n)}},Gx=bo.getInstance();});var jm={};Fs(jm,{default:()=>oS});var oS,Gm=K(()=>{oS={};});var Km=Us((LA,pS)=>{pS.exports={single:{topLeft:"\u250C",top:"\u2500",topRight:"\u2510",right:"\u2502",bottomRight:"\u2518",bottom:"\u2500",bottomLeft:"\u2514",left:"\u2502"},double:{topLeft:"\u2554",top:"\u2550",topRight:"\u2557",right:"\u2551",bottomRight:"\u255D",bottom:"\u2550",bottomLeft:"\u255A",left:"\u2551"},round:{topLeft:"\u256D",top:"\u2500",topRight:"\u256E",right:"\u2502",bottomRight:"\u256F",bottom:"\u2500",bottomLeft:"\u2570",left:"\u2502"},bold:{topLeft:"\u250F",top:"\u2501",topRight:"\u2513",right:"\u2503",bottomRight:"\u251B",bottom:"\u2501",bottomLeft:"\u2517",left:"\u2503"},singleDouble:{topLeft:"\u2553",top:"\u2500",topRight:"\u2556",right:"\u2551",bottomRight:"\u255C",bottom:"\u2500",bottomLeft:"\u2559",left:"\u2551"},doubleSingle:{topLeft:"\u2552",top:"\u2550",topRight:"\u2555",right:"\u2502",bottomRight:"\u255B",bottom:"\u2550",bottomLeft:"\u2558",left:"\u2502"},classic:{topLeft:"+",top:"-",topRight:"+",right:"|",bottomRight:"+",bottom:"-",bottomLeft:"+",left:"|"},arrow:{topLeft:"\u2198",top:"\u2193",topRight:"\u2199",right:"\u2190",bottomRight:"\u2196",bottom:"\u2191",bottomLeft:"\u2197",left:"\u2192"}};});var Ym=Us((OA,vc)=>{var Vm=Km();vc.exports=Vm;vc.exports.default=Vm;});var ig={};Fs(ig,{runExecuteShellWorker:()=>s0});function YT(s){let e={};for(let[t,n]of Object.entries(s))typeof n=="string"&&(e[t]=n);return e}function rg(){if(oa.value)return oa.value;let s=YT(process.env),e=s;if(process.platform==="win32")return oa.value=e,e;try{let t=process.env.SHELL||"/bin/zsh",n=execaSync(t,["-ilc","env"],{env:s,timeout:3e3,stdio:["ignore","pipe","ignore"]}),r={};n.stdout.split(`
874
+ `),{metadata:{mode:"content",strategy:H?"rg":"fallback",regex:M.some(D=>D.regex),case_insensitive:u,path:I,resolved_from:L,queries:M,matches:q,read_hints:O,files_with_matches:Te,command:Oe.length>0?Oe[0]:void 0}}))}catch(g){return JSON.stringify(ke("search","error",`search failed: ${g.message}`,void 0,{error:g.message}))}}},Pm=[cm,um,hm,fm,gm,dm,pm,mm,vm,xm,Sm,_m,Tm,wm,km,Cm,Em,ym,bm,Fp,Im,Rm,El,Il,Rl,Wp];Bx=[...Pm,Wl];});var Lr={};Fs(Lr,{SafeTTYWriter:()=>bo,SignalCategory:()=>Lm,safeTTYWriter:()=>Gx,setupCommonSignals:()=>Wx,signalManager:()=>en});function Wx(s){en.initialize(),s.onSIGINT&&en.register("SIGINT",s.onSIGINT,"user_interrupt"),s.onSIGTERM&&en.register("SIGTERM",s.onSIGTERM,"process_control"),s.onSIGHUP&&en.register("SIGHUP",s.onSIGHUP,"terminal_disconnect"),s.onSIGUSR1&&en.register("SIGUSR1",s.onSIGUSR1,"custom_recovery"),s.onSIGUSR2&&en.register("SIGUSR2",s.onSIGUSR2,"custom_recovery"),s.onSIGCONT&&en.register("SIGCONT",s.onSIGCONT,"process_control"),s.onSIGTSTP&&en.register("SIGTSTP",s.onSIGTSTP,"process_control");}var Lm,cc,en,bo,Gx,Or=K(()=>{le();Lm=(i=>(i.TTY_CONTROL="tty_control",i.TERMINAL_DISCONNECT="terminal_disconnect",i.PROCESS_CONTROL="process_control",i.USER_INTERRUPT="user_interrupt",i.CUSTOM_RECOVERY="custom_recovery",i))(Lm||{}),cc=class{handlers=new Map;initialized=false;isInForeground=true;initialize(){if(this.initialized){f.warn("SIGNAL","SignalManager already initialized");return}f.info("SIGNAL","Initializing SignalManager"),this.setupTTYControlSignals(),this.initialized=true;}setupTTYControlSignals(){if(process.platform==="win32"){f.debug("SIGNAL","Windows platform, skipping POSIX TTY signals");return}try{process.on("SIGTTIN","ignore"),process.on("SIGTTOU","ignore"),f.info("SIGNAL","TTY control signals (SIGTTIN/SIGTTOU) set to ignore");}catch(e){f.error("SIGNAL","Failed to setup TTY control signals",{error:e.message});}}register(e,t,n){this.initialized||(f.warn("SIGNAL",`Registering ${e} before initialization`),this.initialize()),this.handlers.has(e)||(this.handlers.set(e,[]),process.on(e,async()=>{let r=this.handlers.get(e)||[];f.debug("SIGNAL",`Received ${e}, executing ${r.length} handlers`);for(let i of r)try{await i();}catch(o){f.error("SIGNAL",`Handler failed for ${e}`,{error:o.message});}})),this.handlers.get(e).push(t),f.debug("SIGNAL",`Registered handler for ${e} (category: ${n})`);}unregister(e,t){let n=this.handlers.get(e);if(!n)return;let r=n.indexOf(t);r!==-1&&(n.splice(r,1),f.debug("SIGNAL",`Unregistered handler for ${e}`)),n.length===0&&(this.handlers.delete(e),process.removeAllListeners(e),f.debug("SIGNAL",`Removed all listeners for ${e}`));}unregisterAll(){for(let e of this.handlers.keys())process.removeAllListeners(e);this.handlers.clear(),f.info("SIGNAL","Unregistered all signal handlers");}checkForeground(){if(process.platform==="win32")return true;try{let e=process.pid,t=process.getpgid?.(e)??e;return process.stdin.isTTY?(this.isInForeground=!0,!0):!1}catch{return true}}getRegisteredSignals(){return Array.from(this.handlers.keys())}reset(){this.unregisterAll(),this.initialized=false,f.info("SIGNAL","SignalManager reset");}},en=new cc,bo=class s{static instance;static getInstance(){return s.instance||(s.instance=new s),s.instance}writeStdout(e){try{return process.stdout.destroyed||!process.stdout.writable?!1:(process.stdout.write(e),!0)}catch(t){return process.env.CLI_DEBUG==="1"&&f.debug("TTY","stdout write failed",{error:t.message}),false}}writeStderr(e){try{return process.stderr.destroyed||!process.stderr.writable?!1:(process.stderr.write(e),!0)}catch(t){return process.env.CLI_DEBUG==="1"&&f.debug("TTY","stderr write failed",{error:t.message}),false}}safeWriteStdout(e,t){let n=this.writeStdout(e);return !n&&t?.fallbackToStderr?this.writeStderr(e):(!n&&t?.onError&&t.onError(new Error("Failed to write to stdout")),n)}},Gx=bo.getInstance();});var jm={};Fs(jm,{default:()=>oS});var oS,Gm=K(()=>{oS={};});var Km=Us((MA,pS)=>{pS.exports={single:{topLeft:"\u250C",top:"\u2500",topRight:"\u2510",right:"\u2502",bottomRight:"\u2518",bottom:"\u2500",bottomLeft:"\u2514",left:"\u2502"},double:{topLeft:"\u2554",top:"\u2550",topRight:"\u2557",right:"\u2551",bottomRight:"\u255D",bottom:"\u2550",bottomLeft:"\u255A",left:"\u2551"},round:{topLeft:"\u256D",top:"\u2500",topRight:"\u256E",right:"\u2502",bottomRight:"\u256F",bottom:"\u2500",bottomLeft:"\u2570",left:"\u2502"},bold:{topLeft:"\u250F",top:"\u2501",topRight:"\u2513",right:"\u2503",bottomRight:"\u251B",bottom:"\u2501",bottomLeft:"\u2517",left:"\u2503"},singleDouble:{topLeft:"\u2553",top:"\u2500",topRight:"\u2556",right:"\u2551",bottomRight:"\u255C",bottom:"\u2500",bottomLeft:"\u2559",left:"\u2551"},doubleSingle:{topLeft:"\u2552",top:"\u2550",topRight:"\u2555",right:"\u2502",bottomRight:"\u255B",bottom:"\u2550",bottomLeft:"\u2558",left:"\u2502"},classic:{topLeft:"+",top:"-",topRight:"+",right:"|",bottomRight:"+",bottom:"-",bottomLeft:"+",left:"|"},arrow:{topLeft:"\u2198",top:"\u2193",topRight:"\u2199",right:"\u2190",bottomRight:"\u2196",bottom:"\u2191",bottomLeft:"\u2197",left:"\u2192"}};});var Ym=Us((LA,vc)=>{var Vm=Km();vc.exports=Vm;vc.exports.default=Vm;});var ig={};Fs(ig,{runExecuteShellWorker:()=>s0});function YT(s){let e={};for(let[t,n]of Object.entries(s))typeof n=="string"&&(e[t]=n);return e}function rg(){if(oa.value)return oa.value;let s=YT(process.env),e=s;if(process.platform==="win32")return oa.value=e,e;try{let t=process.env.SHELL||"/bin/zsh",n=execaSync(t,["-ilc","env"],{env:s,timeout:3e3,stdio:["ignore","pipe","ignore"]}),r={};n.stdout.split(`
875
875
  `).forEach(i=>{let o=i.indexOf("=");if(o>0){let a=i.slice(0,o),l=i.slice(o+1);r[a]=l;}}),e={...r,...s,PATH:r.PATH||s.PATH||"",JAVA_HOME:r.JAVA_HOME||s.JAVA_HOME||"",MAVEN_HOME:r.MAVEN_HOME||s.MAVEN_HOME||"",M2_HOME:r.M2_HOME||s.M2_HOME||"",NODE_PATH:r.NODE_PATH||s.NODE_PATH||"",GOPATH:r.GOPATH||s.GOPATH||"",CARGO_HOME:r.CARGO_HOME||s.CARGO_HOME||"",RUSTUP_HOME:r.RUSTUP_HOME||s.RUSTUP_HOME||"",PYENV_ROOT:r.PYENV_ROOT||s.PYENV_ROOT||"",CONDA_PREFIX:r.CONDA_PREFIX||s.CONDA_PREFIX||""};}catch(t){f.warn("SHELL_WORKER","Failed to load shell environment",{error:t?.message||t}),e=s;}return oa.value=e,e}function aa(s,e){return {success:true,output:`\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
876
876
  \u25B8 \u5DE5\u4F5C\u76EE\u5F55: ${s}
877
877
  \u25B8 \u6267\u884C\u547D\u4EE4: ${e}
@@ -1622,7 +1622,7 @@ To install use this command:
1622
1622
 
1623
1623
  $ npm install --save-dev react-devtools-core
1624
1624
  `.trim()+`
1625
- `);else throw s}var Hm=(s,e)=>{if(s===e)return;if(!s)return e;let t={},n=false;for(let r of Object.keys(s))(e?!Object.hasOwn(e,r):true)&&(t[r]=void 0,n=true);if(e)for(let r of Object.keys(e))e[r]!==s[r]&&(t[r]=e[r],n=true);return n?t:void 0},Jm=s=>{s?.unsetMeasureFunc(),s?.freeRecursive();},ko=NoEventPriority,yc,tn=lS({getRootHostContext:()=>({isInsideText:false}),prepareForCommit:()=>null,preparePortalMount:()=>null,clearContainer:()=>false,resetAfterCommit(s){if(typeof s.onComputeLayout=="function"&&s.onComputeLayout(),s.isStaticDirty){s.isStaticDirty=false,typeof s.onImmediateRender=="function"&&s.onImmediateRender();return}typeof s.onRender=="function"&&s.onRender();},getChildHostContext(s,e){let t=s.isInsideText,n=e==="ink-text"||e==="ink-virtual-text";return t===n?s:{isInsideText:n}},shouldSetTextContent:()=>false,createInstance(s,e,t,n){if(n.isInsideText&&s==="ink-box")throw new Error("<Box> can\u2019t be nested inside <Text> component");let r=s==="ink-text"&&n.isInsideText?"ink-virtual-text":s,i=_o(r);for(let[o,a]of Object.entries(e))if(o!=="children"){if(o==="style"){fc(i,a),i.yogaNode&&gc(i.yogaNode,a);continue}if(o==="internal_transform"){i.internal_transform=a;continue}if(o==="internal_static"){yc=t,i.internal_static=true,t.isStaticDirty=true,t.staticNode=i;continue}hc(i,o,a);}return i},createTextInstance(s,e,t){if(!t.isInsideText)throw new Error(`Text string "${s}" must be rendered inside <Text> component`);return Fm(s)},resetTextContent(){},hideTextInstance(s){Gr(s,"");},unhideTextInstance(s,e){Gr(s,e);},getPublicInstance:s=>s,hideInstance(s){s.yogaNode?.setDisplay(ae.DISPLAY_NONE);},unhideInstance(s){s.yogaNode?.setDisplay(ae.DISPLAY_FLEX);},appendInitialChild:To,appendChild:To,insertBefore:mc,finalizeInitialChildren(){return false},isPrimaryRenderer:true,supportsMutation:true,supportsPersistence:false,supportsHydration:false,scheduleTimeout:setTimeout,cancelTimeout:clearTimeout,noTimeout:-1,beforeActiveInstanceBlur(){},afterActiveInstanceBlur(){},detachDeletedInstance(){},getInstanceFromNode:()=>null,prepareScopeUpdate(){},getInstanceFromScope:()=>null,appendChildToContainer:To,insertInContainerBefore:mc,removeChildFromContainer(s,e){jr(s,e),Jm(e.yogaNode);},commitUpdate(s,e,t,n){yc&&s.internal_static&&(yc.isStaticDirty=true);let r=Hm(t,n),i=Hm(t.style,n.style);if(!(!r&&!i)){if(r)for(let[o,a]of Object.entries(r)){if(o==="style"){fc(s,a);continue}if(o==="internal_transform"){s.internal_transform=a;continue}if(o==="internal_static"){s.internal_static=true;continue}hc(s,o,a);}i&&s.yogaNode&&gc(s.yogaNode,i);}},commitTextUpdate(s,e,t){Gr(s,t);},removeChild(s,e){jr(s,e),Jm(e.yogaNode);},setCurrentUpdatePriority(s){ko=s;},getCurrentUpdatePriority:()=>ko,resolveUpdatePriority(){return ko!==NoEventPriority?ko:DefaultEventPriority},maySuspendCommit(){return false},NotPendingTransition:void 0,HostTransitionContext:createContext(null),resetFormInstance(){},requestPostPaintCallback(){},shouldAttemptEagerTransition(){return false},trackSchedulerEvent(){},resolveEventType(){return null},resolveEventTimeStamp(){return -1.1},preloadInstance(){return true},startSuspendingCommit(){},suspendInstance(){},waitForCommitToBeReady(){return null}});function bc(s,e=1,t={}){let{indent:n=" ",includeEmptyLines:r=false}=t;if(typeof s!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof s}\``);if(typeof e!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof e}\``);if(e<0)throw new RangeError(`Expected \`count\` to be at least 0, got \`${e}\``);if(typeof n!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof n}\``);if(e===0)return s;let i=r?/^/gm:/^(?!\s*$)/gm;return s.replace(i,n.repeat(e))}var dS=s=>s.getComputedWidth()-s.getComputedPadding(ae.EDGE_LEFT)-s.getComputedPadding(ae.EDGE_RIGHT)-s.getComputedBorder(ae.EDGE_LEFT)-s.getComputedBorder(ae.EDGE_RIGHT),qm=dS;var Xm=yu(Ym());var mS=/^rgb\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,hS=/^ansi256\(\s?(\d+)\s?\)$/,fS=s=>s in j,gS=(s,e,t)=>{if(!e)return s;if(fS(e)){if(t==="foreground")return j[e](s);let n=`bg${e[0].toUpperCase()+e.slice(1)}`;return j[n](s)}if(e.startsWith("#"))return t==="foreground"?j.hex(e)(s):j.bgHex(e)(s);if(e.startsWith("ansi256")){let n=hS.exec(e);if(!n)return s;let r=Number(n[1]);return t==="foreground"?j.ansi256(r)(s):j.bgAnsi256(r)(s)}if(e.startsWith("rgb")){let n=mS.exec(e);if(!n)return s;let r=Number(n[1]),i=Number(n[2]),o=Number(n[3]);return t==="foreground"?j.rgb(r,i,o)(s):j.bgRgb(r,i,o)(s)}return s},Ut=gS;var yS=(s,e,t,n)=>{if(t.style.borderStyle){let r=t.yogaNode.getComputedWidth(),i=t.yogaNode.getComputedHeight(),o=typeof t.style.borderStyle=="string"?Xm.default[t.style.borderStyle]:t.style.borderStyle,a=t.style.borderTopColor??t.style.borderColor,l=t.style.borderBottomColor??t.style.borderColor,c=t.style.borderLeftColor??t.style.borderColor,u=t.style.borderRightColor??t.style.borderColor,d=t.style.borderTopDimColor??t.style.borderDimColor,p=t.style.borderBottomDimColor??t.style.borderDimColor,m=t.style.borderLeftDimColor??t.style.borderDimColor,h=t.style.borderRightDimColor??t.style.borderDimColor,g=t.style.borderTop!==false,y=t.style.borderBottom!==false,x=t.style.borderLeft!==false,S=t.style.borderRight!==false,T=r-(x?1:0)-(S?1:0),w=g?Ut((x?o.topLeft:"")+o.top.repeat(T)+(S?o.topRight:""),a,"foreground"):void 0;g&&d&&(w=j.dim(w));let L=i;g&&(L-=1),y&&(L-=1);let B=(Ut(o.left,c,"foreground")+`
1625
+ `);else throw s}var Hm=(s,e)=>{if(s===e)return;if(!s)return e;let t={},n=false;for(let r of Object.keys(s))(!e||!Object.hasOwn(e,r))&&(t[r]=void 0,n=true);if(e)for(let r of Object.keys(e))e[r]!==s[r]&&(t[r]=e[r],n=true);return n?t:void 0},Jm=s=>{s?.unsetMeasureFunc(),s?.freeRecursive();},ko=NoEventPriority,yc,tn=lS({getRootHostContext:()=>({isInsideText:false}),prepareForCommit:()=>null,preparePortalMount:()=>null,clearContainer:()=>false,resetAfterCommit(s){if(typeof s.onComputeLayout=="function"&&s.onComputeLayout(),s.isStaticDirty){s.isStaticDirty=false,typeof s.onImmediateRender=="function"&&s.onImmediateRender();return}typeof s.onRender=="function"&&s.onRender();},getChildHostContext(s,e){let t=s.isInsideText,n=e==="ink-text"||e==="ink-virtual-text";return t===n?s:{isInsideText:n}},shouldSetTextContent:()=>false,createInstance(s,e,t,n){if(n.isInsideText&&s==="ink-box")throw new Error("<Box> can\u2019t be nested inside <Text> component");let r=s==="ink-text"&&n.isInsideText?"ink-virtual-text":s,i=_o(r);for(let[o,a]of Object.entries(e))if(o!=="children"){if(o==="style"){fc(i,a),i.yogaNode&&gc(i.yogaNode,a);continue}if(o==="internal_transform"){i.internal_transform=a;continue}if(o==="internal_static"){yc=t,i.internal_static=true,t.isStaticDirty=true,t.staticNode=i;continue}hc(i,o,a);}return i},createTextInstance(s,e,t){if(!t.isInsideText)throw new Error(`Text string "${s}" must be rendered inside <Text> component`);return Fm(s)},resetTextContent(){},hideTextInstance(s){Gr(s,"");},unhideTextInstance(s,e){Gr(s,e);},getPublicInstance:s=>s,hideInstance(s){s.yogaNode?.setDisplay(ae.DISPLAY_NONE);},unhideInstance(s){s.yogaNode?.setDisplay(ae.DISPLAY_FLEX);},appendInitialChild:To,appendChild:To,insertBefore:mc,finalizeInitialChildren(){return false},isPrimaryRenderer:true,supportsMutation:true,supportsPersistence:false,supportsHydration:false,scheduleTimeout:setTimeout,cancelTimeout:clearTimeout,noTimeout:-1,beforeActiveInstanceBlur(){},afterActiveInstanceBlur(){},detachDeletedInstance(){},getInstanceFromNode:()=>null,prepareScopeUpdate(){},getInstanceFromScope:()=>null,appendChildToContainer:To,insertInContainerBefore:mc,removeChildFromContainer(s,e){jr(s,e),Jm(e.yogaNode);},commitUpdate(s,e,t,n){yc&&s.internal_static&&(yc.isStaticDirty=true);let r=Hm(t,n),i=Hm(t.style,n.style);if(!(!r&&!i)){if(r)for(let[o,a]of Object.entries(r)){if(o==="style"){fc(s,a);continue}if(o==="internal_transform"){s.internal_transform=a;continue}if(o==="internal_static"){s.internal_static=true;continue}hc(s,o,a);}i&&s.yogaNode&&gc(s.yogaNode,i);}},commitTextUpdate(s,e,t){Gr(s,t);},removeChild(s,e){jr(s,e),Jm(e.yogaNode);},setCurrentUpdatePriority(s){ko=s;},getCurrentUpdatePriority:()=>ko,resolveUpdatePriority(){return ko!==NoEventPriority?ko:DefaultEventPriority},maySuspendCommit(){return false},NotPendingTransition:void 0,HostTransitionContext:createContext(null),resetFormInstance(){},requestPostPaintCallback(){},shouldAttemptEagerTransition(){return false},trackSchedulerEvent(){},resolveEventType(){return null},resolveEventTimeStamp(){return -1.1},preloadInstance(){return true},startSuspendingCommit(){},suspendInstance(){},waitForCommitToBeReady(){return null}});function bc(s,e=1,t={}){let{indent:n=" ",includeEmptyLines:r=false}=t;if(typeof s!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof s}\``);if(typeof e!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof e}\``);if(e<0)throw new RangeError(`Expected \`count\` to be at least 0, got \`${e}\``);if(typeof n!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof n}\``);if(e===0)return s;let i=r?/^/gm:/^(?!\s*$)/gm;return s.replace(i,n.repeat(e))}var dS=s=>s.getComputedWidth()-s.getComputedPadding(ae.EDGE_LEFT)-s.getComputedPadding(ae.EDGE_RIGHT)-s.getComputedBorder(ae.EDGE_LEFT)-s.getComputedBorder(ae.EDGE_RIGHT),qm=dS;var Xm=yu(Ym());var mS=/^rgb\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,hS=/^ansi256\(\s?(\d+)\s?\)$/,fS=s=>s in j,gS=(s,e,t)=>{if(!e)return s;if(fS(e)){if(t==="foreground")return j[e](s);let n=`bg${e[0].toUpperCase()+e.slice(1)}`;return j[n](s)}if(e.startsWith("#"))return t==="foreground"?j.hex(e)(s):j.bgHex(e)(s);if(e.startsWith("ansi256")){let n=hS.exec(e);if(!n)return s;let r=Number(n[1]);return t==="foreground"?j.ansi256(r)(s):j.bgAnsi256(r)(s)}if(e.startsWith("rgb")){let n=mS.exec(e);if(!n)return s;let r=Number(n[1]),i=Number(n[2]),o=Number(n[3]);return t==="foreground"?j.rgb(r,i,o)(s):j.bgRgb(r,i,o)(s)}return s},Ut=gS;var yS=(s,e,t,n)=>{if(t.style.borderStyle){let r=t.yogaNode.getComputedWidth(),i=t.yogaNode.getComputedHeight(),o=typeof t.style.borderStyle=="string"?Xm.default[t.style.borderStyle]:t.style.borderStyle,a=t.style.borderTopColor??t.style.borderColor,l=t.style.borderBottomColor??t.style.borderColor,c=t.style.borderLeftColor??t.style.borderColor,u=t.style.borderRightColor??t.style.borderColor,d=t.style.borderTopDimColor??t.style.borderDimColor,p=t.style.borderBottomDimColor??t.style.borderDimColor,m=t.style.borderLeftDimColor??t.style.borderDimColor,h=t.style.borderRightDimColor??t.style.borderDimColor,g=t.style.borderTop!==false,y=t.style.borderBottom!==false,x=t.style.borderLeft!==false,S=t.style.borderRight!==false,T=r-(x?1:0)-(S?1:0),w=g?Ut((x?o.topLeft:"")+o.top.repeat(T)+(S?o.topRight:""),a,"foreground"):void 0;g&&d&&(w=j.dim(w));let L=i;g&&(L-=1),y&&(L-=1);let B=(Ut(o.left,c,"foreground")+`
1626
1626
  `).repeat(L);m&&(B=j.dim(B));let I=(Ut(o.right,u,"foreground")+`
1627
1627
  `).repeat(L);h&&(I=j.dim(I));let k=y?Ut((x?o.bottomLeft:"")+o.bottom.repeat(T)+(S?o.bottomRight:""),l,"foreground"):void 0;y&&p&&(k=j.dim(k));let R=g?1:0;w&&n.write(s,e,w,{transformers:[]}),x&&n.write(s,e+R,B,{transformers:[]}),S&&n.write(s+r-1,e+R,I,{transformers:[]}),k&&n.write(s,e+i-1,k,{transformers:[]});}},Zm=yS;var bS=(s,e,t,n)=>{if(!t.style.backgroundColor)return;let r=t.yogaNode.getComputedWidth(),i=t.yogaNode.getComputedHeight(),o=t.style.borderStyle&&t.style.borderLeft!==false?1:0,a=t.style.borderStyle&&t.style.borderRight!==false?1:0,l=t.style.borderStyle&&t.style.borderTop!==false?1:0,c=t.style.borderStyle&&t.style.borderBottom!==false?1:0,u=r-o-a,d=i-l-c;if(!(u>0&&d>0))return;let p=Ut(" ".repeat(u),t.style.backgroundColor,"background");for(let m=0;m<d;m++)n.write(s+o,e+l+m,p,{transformers:[]});},Qm=bS;var xS=(s,e)=>{let t=s.childNodes[0]?.yogaNode;if(t){let n=t.getComputedLeft(),r=t.getComputedTop();e=`
1628
1628
  `.repeat(r)+bc(e,n);}return e},Io=(s,e={})=>{if(e.skipStaticElements&&s.internal_static||s.yogaNode?.getDisplay()===ae.DISPLAY_NONE)return "";let t="";if(s.nodeName==="ink-text")t=Br(s);else if(s.nodeName==="ink-box"||s.nodeName==="ink-root"){let n=s.style.flexDirection==="row"||s.style.flexDirection==="row-reverse"?" ":`
@@ -1660,7 +1660,7 @@ Read about how to prevent this error on https://github.com/vadimdemedes/ink/#isr
1660
1660
  `);return Z.createElement(F,{flexDirection:"column",marginBottom:1,borderStyle:"round",borderColor:"magenta",paddingX:1},Z.createElement(F,null,Z.createElement(C,{color:"magenta",bold:true},"\u{1F4AD} Thinking"),e&&Z.createElement(C,{color:"magenta"}," ",Z.createElement(E_,{type:"dots"}))),Z.createElement(F,{flexDirection:"column",paddingLeft:1,paddingTop:0},r.map((i,o)=>Z.createElement(C,{key:o,color:"white"},i))),t&&s.length>200&&Z.createElement(F,null,Z.createElement(C,{color:"yellow",italic:true},"[Truncated - ",s.length," chars total]")))};var Uo={tool_call:{icon:"\u25B6",color:"yellow",prefix:"Tool"},tool_result:{icon:"\u2713",color:"green",prefix:"Result"},tool_error:{icon:"\u2717",color:"red",prefix:"Error"},file_update:{icon:"\u270E",color:"blue",prefix:"Edit"},command_exec:{icon:"$",color:"yellow",prefix:"Shell"},code_exec:{icon:"\u03BB",color:"yellow",prefix:"Code"},web_search:{icon:"\u2315",color:"cyan",prefix:"Search"},web_fetch:{icon:"\u21E3",color:"cyan",prefix:"Fetch"},readfile:{icon:"\u2263",color:"cyan",prefix:"Read"},search:{icon:"\u2387",color:"cyan",prefix:"Search"},search_files:{icon:"\u27D0",color:"cyan",prefix:"Glob"},show_tree:{icon:"\u2301",color:"cyan",prefix:"Tree"},browser_debug:{icon:"\u25CD",color:"cyan",prefix:"Browser"}};function I_(s){let e=s.match(/^(\s*\d+\s+)([-+])\s*(.*)$/);if(e){let[,t,n,r]=e;if(n==="-")return {color:"red",bgColor:"bgRed",text:`${t}- ${r}`};if(n==="+")return {color:"green",bgColor:"bgGreen",text:`${t}+ ${r}`}}return s.startsWith("\u2500\u2500\u2500")||s.startsWith("\u2500\u2500\u2500 old:")?{color:"gray",text:s}:s.startsWith("+++")||s.startsWith("+++ new:")?{color:"gray",text:s}:{text:s}}var Mh=({type:s,message:e,details:t,timestamp:n,isStreaming:r=false})=>{let i=Uo[s]||Uo.tool_call,o=Bt(n),a=[];if(a.push(e),t){let l=t.split(`
1661
1661
  `);a.push(...l);}return Z.createElement(F,{flexDirection:"column"},Z.createElement(F,null,Z.createElement(C,{dimColor:true},o," \u2022 "),Z.createElement(C,{color:i.color},"\u256D\u2500 ",i.icon," "),Z.createElement(C,{color:i.color,bold:true},i.prefix),r&&Z.createElement(C,{color:"yellow"}," \u2026")),a.map((l,c)=>{let u=I_(l);return Z.createElement(F,{key:c,flexDirection:"row"},Z.createElement(C,{color:i.color}," \u2502 "),Z.createElement(F,{flexDirection:"column",flexShrink:1},Z.createElement(C,{wrap:"wrap",color:u.color,dimColor:u.color==="gray"},u.text)))}),Z.createElement(F,null,Z.createElement(C,{color:i.color}," \u2570","\u2500".repeat(40))))};var R_=({entry:s})=>{let e=null;return s.type==="info"&&s.text?e=Z.createElement(No,{text:s.text,details:s.details,type:"info",timestamp:s.timestamp}):s.type==="warning"&&s.text?e=Z.createElement(No,{text:s.text,details:s.details,type:"warning",timestamp:s.timestamp}):s.type==="error"&&s.text?e=Z.createElement(No,{text:s.text,details:s.details,type:"error",timestamp:s.timestamp}):(s.type==="thinking"||s.type==="reasoning")&&s.text?e=Z.createElement(Ah,{content:s.text,streaming:s.isStreaming}):Uo[s.type]&&s.text?e=Z.createElement(Mh,{type:s.type,message:s.text,details:s.details,timestamp:s.timestamp,isStreaming:s.isStreaming}):s.message&&(e=P_(s.message,s.id,s.isStreaming,s.timestamp)),e?Z.createElement(F,{flexDirection:"column"},e):null};function P_(s,e,t,n){let r=`msg-${e}`;switch(s.role){case "user":return Z.createElement(Eh,{key:r,message:s,timestamp:n});case "assistant":return Z.createElement(Rh,{key:r,message:s,streaming:t,timestamp:n});case "system":case "tool":let i=s;return i.role==="user"&&Array.isArray(i.content)&&i.content.some(o=>o.type==="tool_result")?Z.createElement(Ph,{key:r,message:i,timestamp:n}):Z.createElement(F,{key:r},Z.createElement(C,{color:"gray",dimColor:true},"[Unknown message type: ",s.role,"]"))}}var Pc=Z.memo(R_,(s,e)=>s.entry.id===e.entry.id&&s.entry.isStreaming===e.entry.isStreaming);le();var Lh=({value:s,placeholder:e="Type a message... (? for help)",disabled:t=false,multiline:n=false,completions:r=[],onChange:i,onSubmit:o,onHistoryUp:a,onHistoryDown:l,onTabComplete:c})=>{let[u,d]=useState(0),[p,m]=useState(false),[h,g]=useState(0),y=s.length-u;$n((B,I)=>{if(!t&&!I.escape){if(I.tab){if(c){let k=c(s);k&&(i(k),d(0));}return}if(I.return){if(n&&!I.shift){let k=s.slice(0,y)+`
1662
1662
  `+s.slice(y);i(k);return}process.env.CLI_DEBUG==="1"&&f.debug("INPUT_LINE","Enter pressed - submitting",{valueLength:s.length,value:s.substring(0,50),disabled:t}),o(),d(0),m(false);return}if(I.upArrow){a(),d(0);return}if(I.downArrow){l(),d(0);return}if(I.leftArrow){d(Math.min(u+1,s.length));return}if(I.rightArrow){d(Math.max(u-1,0));return}if(I.home||I.ctrl&&B==="a"){d(s.length);return}if(I.end||I.ctrl&&B==="e"){d(0);return}if(I.backspace||I.delete){if(u===s.length)return;let k=y-1,R=s.slice(0,k)+s.slice(k+1);i(R);return}if(!I.ctrl&&!I.meta&&B){let k=s.slice(0,y)+B+s.slice(y);i(k);return}}},{isActive:true});let x=s.slice(0,y),S=s[y]||" ",T=s.slice(y+1),w=n?s.split(`
1663
- `):[s];return Z.createElement(F,{flexDirection:"column"},Z.createElement(F,{flexDirection:n?"column":"row"},!n&&Z.createElement(C,{color:"green",bold:true},"> "),t?Z.createElement(C,{dimColor:true},s||e):!s?Z.createElement(F,null,!n&&Z.createElement(C,{inverse:true}," "),Z.createElement(C,{dimColor:true},e)):n?w.map((B,I)=>Z.createElement(F,{key:I},Z.createElement(C,{color:"green",bold:true},I===0?"> ":"\u2502 "),Z.createElement(C,null,B))):Z.createElement(C,null,x,Z.createElement(C,{inverse:true},S),T)),p&&r.length>0&&Z.createElement(F,{paddingLeft:2,flexDirection:"column"},Z.createElement(C,{color:"yellow"},"Suggestions:"),r.slice(0,5).map((B,I)=>Z.createElement(C,{key:I,color:I===h?"cyan":"white",bold:I===h},I===h?"\u2192 ":" ",B))))};var M_=({isRunning:s,statusText:e="",tokenStats:t,streamingTokens:n=0,streamingStartTime:r=null,provider:i,model:o})=>{let[a,l]=useState(null),[c,u]=useState(0),[d,p]=useState(0),[m,h]=useState(0),[g,y]=useState(0);useEffect(()=>{s&&a===null?l(r||Date.now()):!s&&(t?.output||0)===0&&(l(null),u(0));},[s,r,a,t?.output]),useEffect(()=>{if(!s||a===null)return;let R=setInterval(()=>{u(Math.floor((Date.now()-a)/1e3));},500);return ()=>clearInterval(R)},[s,a]),useEffect(()=>{if(!s||n===0){p(0);return}let R=Math.floor(n);if(d===R)return;let E=R-d,M=Math.min(Math.abs(E),20),_=E/M,$=setInterval(()=>{p(A=>{let G=A+_;return Math.abs(G-R)<1?R:G});},50);return ()=>clearInterval($)},[n,s,d]),useEffect(()=>{let R=t?.output||0;if(m===R)return;let E=R-m;if(Math.abs(E)>100){h(R);return}let M=Math.max(Math.ceil(Math.abs(E)/10),3),_=E/M,$=setInterval(()=>{h(A=>{let G=A+_;return Math.abs(G-R)<1?R:G});},10);return ()=>clearInterval($)},[t?.output,m]),useEffect(()=>{if(!s){y(0);return}let E=(e||"Thinking...").length,M=setInterval(()=>{y(_=>(_+1)%(E+3));},80);return ()=>clearInterval(M)},[s,e]);let x=()=>{if(c<60)return `${c}s`;let R=Math.floor(c/60),E=c%60;return `${R}m ${E}s`},S=R=>R>=1e6?(R/1e6).toFixed(1)+"M":R>=1e3?(R/1e3).toFixed(1)+"K":R.toString(),T=t?.contextWindow||0,w=t?.tokensUsedForContext||t?.total||0,L=t?.pressure||0,B=Math.round(L*100),I=()=>L>.8?"red":L>.5?"yellow":"green";return Z.createElement(F,{justifyContent:"space-between"},Z.createElement(F,null,s?Z.createElement(F,null,Z.createElement(E_,{type:"dots"}),Z.createElement(C,null," "),Z.createElement(C,{bold:true,color:"cyan"},"\u25CF"),Z.createElement(C,null," "),(R=>R.split("").map((M,_)=>{let W=_-g;return W>=0&&W<2?Z.createElement(C,{key:_,color:"white",bold:true},M):W>=-1&&W<0?Z.createElement(C,{key:_,color:"cyanBright"},M):Z.createElement(C,{key:_,color:"cyan"},M)}))(e||"Thinking..."),c>0&&Z.createElement(Z.Fragment,null,Z.createElement(C,{dimColor:true}," ("),Z.createElement(C,{color:"yellow"},x()),Z.createElement(C,{dimColor:true}," \u2022 esc to interrupt"),d>0&&Z.createElement(Z.Fragment,null,Z.createElement(C,{dimColor:true}," \u2022 "),Z.createElement(C,{color:"green"},"\u2193 ",Math.floor(d)),Z.createElement(C,{dimColor:true}," tokens")),Z.createElement(C,{dimColor:true},")"))):Z.createElement(F,null,(t?.output||0)>0?Z.createElement(Z.Fragment,null,Z.createElement(C,{color:"green",bold:true},"\u25A0"),Z.createElement(C,null," "),Z.createElement(C,{color:"green"},"Complete!"),c>0&&Z.createElement(Z.Fragment,null,Z.createElement(C,{dimColor:true}," ("),Z.createElement(C,{color:"yellow"},x()),Z.createElement(C,{dimColor:true},")"))):Z.createElement(Z.Fragment,null,Z.createElement(C,{color:"cyan",bold:true},"\u25CF"),Z.createElement(C,null," "),Z.createElement(C,{color:"cyan"},"Ready")))),Z.createElement(F,null,Z.createElement(C,{dimColor:true},"in "),Z.createElement(C,{color:"cyan"},S(t?.input||0)),Z.createElement(C,null," "),Z.createElement(C,{dimColor:true},"out "),Z.createElement(C,{color:"green"},S(Math.floor(m))),T>0&&Z.createElement(Z.Fragment,null,Z.createElement(C,null," "),Z.createElement(C,{dimColor:true},"context "),Z.createElement(C,{color:"yellow"},S(w)),Z.createElement(C,{dimColor:true}," tokens "),Z.createElement(C,{color:I()},B,"%"))))},Oh=Z.memo(M_,(s,e)=>s.isRunning===e.isRunning&&s.statusText===e.statusText&&s.streamingTokens===e.streamingTokens&&s.streamingStartTime===e.streamingStartTime&&s.tokenStats?.input===e.tokenStats?.input&&s.tokenStats?.output===e.tokenStats?.output&&s.tokenStats?.total===e.tokenStats?.total&&s.tokenStats?.pressure===e.tokenStats?.pressure);var Dh=({isRunning:s,hasInput:e,customHints:t,menuActive:n=false,thinkingEnabled:r=true})=>t?Z.createElement(F,{justifyContent:"space-between"},Z.createElement(C,{color:"yellow"},t)):n?Z.createElement(F,{justifyContent:"space-between"},Z.createElement(C,{dimColor:true}," ","\u2191\u2193 to select, Enter to confirm, ESC to cancel")):Z.createElement(F,{justifyContent:"space-between"},Z.createElement(C,{dimColor:true}," ","? for shortcuts"),Z.createElement(F,null,r?Z.createElement(C,{color:"cyan"},"Thinking on"):Z.createElement(C,{dimColor:true},"Thinking off"),Z.createElement(C,{dimColor:true}," (tab to toggle)")));var $h=({attachments:s,onRemove:e})=>s.length===0?null:Z.createElement(F,{flexDirection:"column",paddingLeft:2,marginBottom:1},Z.createElement(C,{color:"magenta",dimColor:true},"Attachments:"),s.map((t,n)=>{let r=t.name||t.path.split("/").pop()||"unknown",i=t.type?.startsWith("image/")||r.match(/\.(png|jpg|jpeg|gif|webp)$/i);return Z.createElement(F,{key:n},Z.createElement(C,{color:"magenta"},i?"\u{1F4CE} \u{1F5BC}\uFE0F ":"\u{1F4CE} ",r),e&&Z.createElement(C,{color:"gray",dimColor:true}," (press Del to remove)"))}));le();var L_=({inputValue:s,isRunning:e,statusText:t="",tokenStats:n,streamingTokens:r=0,streamingStartTime:i=null,provider:o,model:a,customHints:l,attachments:c=[],multiline:u=false,completions:d=[],menuActive:p=false,thinkingEnabled:m=true,onInputChange:h,onSubmit:g,onInterrupt:y,onExit:x,onHistoryUp:S,onHistoryDown:T,onTabComplete:w,onRemoveAttachment:L})=>($n((B,I)=>{if(process.env.CLI_DEBUG==="1"&&f.debug("INK_INPUT","BottomBar useInput",{key:I,input:B,menuActive:p,isRunning:e,inputValue:s.substring(0,20)}),!p){if(I.ctrl&&B==="z"){process.env.CLI_DEBUG==="1"&&f.debug("INK_INPUT","Ctrl+Z blocked (prevents suspension)");return}if(I.escape){f.debug("INK_INPUT","ESC pressed in BottomBar",{isRunning:e,hasInput:!!s}),e?y():s&&h("");return}I.ctrl&&B==="c"&&(process.env.CLI_DEBUG==="1"&&f.debug("INK_INPUT","Ctrl+C pressed",{isRunning:e}),e?y():(f.info("INK_INPUT","\u26A0\uFE0F Ctrl+C pressed - exiting"),x()));}},{isActive:true}),Z.createElement(F,{flexDirection:"column"},Z.createElement(Oh,{isRunning:e,statusText:t,tokenStats:n,streamingTokens:r,streamingStartTime:i,provider:o,model:a}),c.length>0&&Z.createElement($h,{attachments:c,onRemove:L}),Z.createElement(F,{flexDirection:"column"},Z.createElement(C,{color:"gray"},"\u2500".repeat(process.stdout.columns||80)),Z.createElement(Lh,{value:s,placeholder:"Type a message...",disabled:e,multiline:u,completions:d,onChange:h,onSubmit:()=>g(s),onHistoryUp:S,onHistoryDown:T,onTabComplete:w}),Z.createElement(C,{color:"gray"},"\u2500".repeat(process.stdout.columns||80))),Z.createElement(Dh,{isRunning:e,hasInput:s.length>0,customHints:l,menuActive:p,thinkingEnabled:m}))),Nh=Z.memo(L_);var Bh=({message:s,choices:e,initialIndex:t=0,hint:n,maxVisible:r=20,onSelect:i,onCancel:o})=>{let[a,l]=useState(t),[c,u]=useState(0);useEffect(()=>{l(t);},[t]),useEffect(()=>{if(e.length<=r){u(0);return}a<c?u(a):a>=c+r&&u(a-r+1);},[a,e.length,r,c]),$n((h,g)=>{if(g.escape&&o){process.nextTick(()=>o());return}if(g.upArrow){l(y=>y>0?y-1:e.length-1);return}if(g.downArrow){l(y=>y<e.length-1?y+1:0);return}if(g.return){i(e[a].value);return}});let d=Math.min(e.length,r),p=c>0,m=c+d<e.length;return Z.createElement(F,{flexDirection:"column"},s&&Z.createElement(F,{marginBottom:1,paddingX:2},Z.createElement(C,{bold:true,color:"cyan"},s)),n&&Z.createElement(F,{marginBottom:1,paddingX:2},Z.createElement(C,{dimColor:true},n)),p&&Z.createElement(F,{paddingX:2},Z.createElement(C,{dimColor:true}," \u2191 more")),e.slice(c,c+d).map((h,g)=>{let y=c+g,x=y===a,S=x?"\u276F ":" ";return Z.createElement(F,{key:`${h.value}-${y}`,flexDirection:"row",paddingX:2},Z.createElement(C,{color:x?"cyan":void 0,bold:x},S,h.label),h.description&&Z.createElement(C,{dimColor:true}," - ",h.description))}),m&&Z.createElement(F,{paddingX:2},Z.createElement(C,{dimColor:true}," \u2193 more")))};var N_=fileURLToPath(import.meta.url),Lc=dirname(N_),ws=null;function U_(){if(ws)return ws;try{let s=[join(Lc,"../package.json"),join(Lc,"../../package.json"),join(Lc,"../../../package.json")];for(let e of s)try{let t=JSON.parse(readFileSync(e,"utf-8"));if(t.version)return ws=t.version,ws}catch{continue}throw new Error("package.json not found")}catch{ws="2.0.7";}return ws}var Fo=U_();var Dc=({staticEntries:s=[],pendingEntries:e=[],isRunning:t,statusText:n="",tokenStats:r,streamingTokens:i=0,streamingStartTime:o=null,version:a=Fo,provider:l="OpenAI",model:c="gpt-4",workDir:u=process.cwd(),showHeader:d=true,thinkingEnabled:p=true,selectMenuOptions:m=null,getCompletions:h,onStaticRendered:g,onSubmit:y,onInterrupt:x,onExit:S})=>{let[T,w]=useState(""),[L,B]=useState([]),[I,k]=useState(-1),R=useRef(false),E=e,M=d&&!R.current,_=Z.useCallback((U,H)=>U,[]),W=useMemo(()=>{let U=[];return M&&U.push(Z.createElement(Ch,{key:"header",version:a,provider:l,model:c,workDir:u})),s.forEach(H=>{U.push(Z.createElement(Pc,{key:`static-entry-${H.id}`,entry:H}));}),U},[M,s,a,l,c,u]);useEffect(()=>{!M&&s.length===0||(M&&(R.current=true),g?.());},[M,s.length,g]);let $=U=>{U.trim()&&(B([...L,U]),k(-1),w(""),y(U));},A=()=>{if(L.length===0)return;let U=I+1;U<L.length&&(k(U),w(L[L.length-1-U]));},G=()=>{if(I<=0){k(-1),w("");return}let U=I-1;k(U),w(L[L.length-1-U]);},N=U=>{if(!h)return null;let H=h(U);return H.length===0?null:H[0]};return Z.createElement(F,{flexDirection:"column",width:"100%"},Z.createElement(Do,{items:W},_),E.map(U=>Z.createElement(Pc,{key:`pending-${U.id}`,entry:U})),Z.createElement(C,null,`
1663
+ `):[s];return Z.createElement(F,{flexDirection:"column"},Z.createElement(F,{flexDirection:n?"column":"row"},!n&&Z.createElement(C,{color:"green",bold:true},"> "),t?Z.createElement(C,{dimColor:true},s||e):!s?Z.createElement(F,null,!n&&Z.createElement(C,{inverse:true}," "),Z.createElement(C,{dimColor:true},e)):n?w.map((B,I)=>Z.createElement(F,{key:I},Z.createElement(C,{color:"green",bold:true},I===0?"> ":"\u2502 "),Z.createElement(C,null,B))):Z.createElement(C,null,x,Z.createElement(C,{inverse:true},S),T)),p&&r.length>0&&Z.createElement(F,{paddingLeft:2,flexDirection:"column"},Z.createElement(C,{color:"yellow"},"Suggestions:"),r.slice(0,5).map((B,I)=>Z.createElement(C,{key:I,color:I===h?"cyan":"white",bold:I===h},I===h?"\u2192 ":" ",B))))};var M_=({isRunning:s,statusText:e="",tokenStats:t,streamingTokens:n=0,streamingStartTime:r=null,provider:i,model:o})=>{let[a,l]=useState(null),[c,u]=useState(0),[d,p]=useState(0),[m,h]=useState(0),[g,y]=useState(0);useEffect(()=>{s&&a===null?l(r||Date.now()):!s&&(t?.output||0)===0&&(l(null),u(0));},[s,r,a,t?.output]),useEffect(()=>{if(!s||a===null)return;let R=setInterval(()=>{u(Math.floor((Date.now()-a)/1e3));},500);return ()=>clearInterval(R)},[s,a]),useEffect(()=>{if(!s||n===0){p(0);return}let R=Math.floor(n);if(d===R)return;let E=R-d,M=Math.min(Math.abs(E),20),_=E/M,$=setInterval(()=>{p(A=>{let G=A+_;return Math.abs(G-R)<1?R:G});},50);return ()=>clearInterval($)},[n,s,d]),useEffect(()=>{let R=t?.output||0;if(m===R)return;let E=R-m;if(Math.abs(E)>100){h(R);return}let M=Math.max(Math.ceil(Math.abs(E)/10),3),_=E/M,$=setInterval(()=>{h(A=>{let G=A+_;return Math.abs(G-R)<1?R:G});},10);return ()=>clearInterval($)},[t?.output,m]),useEffect(()=>{if(!s){y(0);return}let E=(e||"Thinking...").length,M=setInterval(()=>{y(_=>(_+1)%(E+3));},80);return ()=>clearInterval(M)},[s,e]);let x=()=>{if(c<60)return `${c}s`;let R=Math.floor(c/60),E=c%60;return `${R}m ${E}s`},S=R=>R>=1e6?(R/1e6).toFixed(1)+"M":R>=1e3?(R/1e3).toFixed(1)+"K":R.toString(),T=t?.contextWindow||0,w=t?.tokensUsedForContext||t?.total||0,L=t?.pressure||0,B=Math.round(L*100),I=()=>L>.8?"red":L>.5?"yellow":"green";return Z.createElement(F,{justifyContent:"space-between"},Z.createElement(F,null,s?Z.createElement(F,null,Z.createElement(E_,{type:"dots"}),Z.createElement(C,null," "),Z.createElement(C,{bold:true,color:"cyan"},"\u25CF"),Z.createElement(C,null," "),(R=>R.split("").map((M,_)=>{let W=_-g;return W>=0&&W<2?Z.createElement(C,{key:_,color:"white",bold:true},M):W>=-1&&W<0?Z.createElement(C,{key:_,color:"cyanBright"},M):Z.createElement(C,{key:_,color:"cyan"},M)}))(e||"Thinking..."),c>0&&Z.createElement(Z.Fragment,null,Z.createElement(C,{dimColor:true}," ("),Z.createElement(C,{color:"yellow"},x()),Z.createElement(C,{dimColor:true}," \u2022 esc to interrupt"),d>0&&Z.createElement(Z.Fragment,null,Z.createElement(C,{dimColor:true}," \u2022 "),Z.createElement(C,{color:"green"},"\u2193 ",Math.floor(d)),Z.createElement(C,{dimColor:true}," tokens")),Z.createElement(C,{dimColor:true},")"))):Z.createElement(F,null,(t?.output||0)>0?Z.createElement(Z.Fragment,null,Z.createElement(C,{color:"green",bold:true},"\u25A0"),Z.createElement(C,null," "),Z.createElement(C,{color:"green"},"Complete!"),c>0&&Z.createElement(Z.Fragment,null,Z.createElement(C,{dimColor:true}," ("),Z.createElement(C,{color:"yellow"},x()),Z.createElement(C,{dimColor:true},")"))):Z.createElement(Z.Fragment,null,Z.createElement(C,{color:"cyan",bold:true},"\u25CF"),Z.createElement(C,null," "),Z.createElement(C,{color:"cyan"},"Ready")))),Z.createElement(F,null,Z.createElement(C,{dimColor:true},"in "),Z.createElement(C,{color:"cyan"},S(t?.input||0)),Z.createElement(C,null," "),Z.createElement(C,{dimColor:true},"out "),Z.createElement(C,{color:"green"},S(Math.floor(m))),T>0&&Z.createElement(Z.Fragment,null,Z.createElement(C,null," "),Z.createElement(C,{dimColor:true},"context "),Z.createElement(C,{color:"yellow"},S(w)),Z.createElement(C,{dimColor:true}," tokens "),Z.createElement(C,{color:I()},B,"%"))))},Oh=Z.memo(M_,(s,e)=>s.isRunning===e.isRunning&&s.statusText===e.statusText&&s.streamingTokens===e.streamingTokens&&s.streamingStartTime===e.streamingStartTime&&s.tokenStats?.input===e.tokenStats?.input&&s.tokenStats?.output===e.tokenStats?.output&&s.tokenStats?.total===e.tokenStats?.total&&s.tokenStats?.pressure===e.tokenStats?.pressure);var Dh=({isRunning:s,hasInput:e,customHints:t,menuActive:n=false,thinkingEnabled:r=true})=>t?Z.createElement(F,{justifyContent:"space-between"},Z.createElement(C,{color:"yellow"},t)):n?Z.createElement(F,{justifyContent:"space-between"},Z.createElement(C,{dimColor:true}," ","\u2191\u2193 to select, Enter to confirm, ESC to cancel")):Z.createElement(F,{justifyContent:"space-between"},Z.createElement(C,{dimColor:true}," ","? for shortcuts"),Z.createElement(F,null,r?Z.createElement(C,{color:"cyan"},"Thinking on"):Z.createElement(C,{dimColor:true},"Thinking off"),Z.createElement(C,{dimColor:true}," (tab to toggle)")));var $h=({attachments:s,onRemove:e})=>s.length===0?null:Z.createElement(F,{flexDirection:"column",paddingLeft:2,marginBottom:1},Z.createElement(C,{color:"magenta",dimColor:true},"Attachments:"),s.map((t,n)=>{let r=t.name||t.path.split("/").pop()||"unknown",i=t.type?.startsWith("image/")||r.match(/\.(png|jpg|jpeg|gif|webp)$/i);return Z.createElement(F,{key:n},Z.createElement(C,{color:"magenta"},i?"\u{1F4CE} \u{1F5BC}\uFE0F ":"\u{1F4CE} ",r),e&&Z.createElement(C,{color:"gray",dimColor:true}," (press Del to remove)"))}));le();var L_=({inputValue:s,isRunning:e,statusText:t="",tokenStats:n,streamingTokens:r=0,streamingStartTime:i=null,provider:o,model:a,customHints:l,attachments:c=[],multiline:u=false,completions:d=[],menuActive:p=false,thinkingEnabled:m=true,onInputChange:h,onSubmit:g,onInterrupt:y,onExit:x,onHistoryUp:S,onHistoryDown:T,onTabComplete:w,onRemoveAttachment:L})=>($n((B,I)=>{if(process.env.CLI_DEBUG==="1"&&f.debug("INK_INPUT","BottomBar useInput",{key:I,input:B,menuActive:p,isRunning:e,inputValue:s.substring(0,20)}),!p){if(I.ctrl&&B==="z"){process.env.CLI_DEBUG==="1"&&f.debug("INK_INPUT","Ctrl+Z blocked (prevents suspension)");return}if(I.escape){f.debug("INK_INPUT","ESC pressed in BottomBar",{isRunning:e,hasInput:!!s}),e?y():s&&h("");return}I.ctrl&&B==="c"&&(process.env.CLI_DEBUG==="1"&&f.debug("INK_INPUT","Ctrl+C pressed",{isRunning:e}),e?y():(f.info("INK_INPUT","\u26A0\uFE0F Ctrl+C pressed - exiting"),x()));}},{isActive:true}),Z.createElement(F,{flexDirection:"column"},Z.createElement(Oh,{isRunning:e,statusText:t,tokenStats:n,streamingTokens:r,streamingStartTime:i,provider:o,model:a}),c.length>0&&Z.createElement($h,{attachments:c,onRemove:L}),Z.createElement(F,{flexDirection:"column"},Z.createElement(C,{color:"gray"},"\u2500".repeat(process.stdout.columns||80)),Z.createElement(Lh,{value:s,placeholder:"Type a message...",disabled:e,multiline:u,completions:d,onChange:h,onSubmit:()=>g(s),onHistoryUp:S,onHistoryDown:T,onTabComplete:w}),Z.createElement(C,{color:"gray"},"\u2500".repeat(process.stdout.columns||80))),Z.createElement(Dh,{isRunning:e,hasInput:s.length>0,customHints:l,menuActive:p,thinkingEnabled:m}))),Nh=Z.memo(L_);var Bh=({message:s,choices:e,initialIndex:t=0,hint:n,maxVisible:r=20,onSelect:i,onCancel:o})=>{let[a,l]=useState(t),[c,u]=useState(0);useEffect(()=>{l(t);},[t]),useEffect(()=>{if(e.length<=r){u(0);return}a<c?u(a):a>=c+r&&u(a-r+1);},[a,e.length,r,c]),$n((h,g)=>{if(g.escape&&o){process.nextTick(()=>o());return}if(g.upArrow){l(y=>y>0?y-1:e.length-1);return}if(g.downArrow){l(y=>y<e.length-1?y+1:0);return}if(g.return){i(e[a].value);return}});let d=Math.min(e.length,r),p=c>0,m=c+d<e.length;return Z.createElement(F,{flexDirection:"column"},s&&Z.createElement(F,{marginBottom:1,paddingX:2},Z.createElement(C,{bold:true,color:"cyan"},s)),n&&Z.createElement(F,{marginBottom:1,paddingX:2},Z.createElement(C,{dimColor:true},n)),p&&Z.createElement(F,{paddingX:2},Z.createElement(C,{dimColor:true}," \u2191 more")),e.slice(c,c+d).map((h,g)=>{let y=c+g,x=y===a,S=x?"\u276F ":" ";return Z.createElement(F,{key:`${h.value}-${y}`,flexDirection:"row",paddingX:2},Z.createElement(C,{color:x?"cyan":void 0,bold:x},S,h.label),h.description&&Z.createElement(C,{dimColor:true}," - ",h.description))}),m&&Z.createElement(F,{paddingX:2},Z.createElement(C,{dimColor:true}," \u2193 more")))};var N_=fileURLToPath(import.meta.url),Lc=dirname(N_),ws=null;function U_(){if(ws)return ws;try{let s=[join(Lc,"../package.json"),join(Lc,"../../package.json"),join(Lc,"../../../package.json")];for(let e of s)try{let t=JSON.parse(readFileSync(e,"utf-8"));if(t.version)return ws=t.version,ws}catch{continue}throw new Error("package.json not found")}catch{ws="2.0.9";}return ws}var Fo=U_();var Dc=({staticEntries:s=[],pendingEntries:e=[],isRunning:t,statusText:n="",tokenStats:r,streamingTokens:i=0,streamingStartTime:o=null,version:a=Fo,provider:l="OpenAI",model:c="gpt-4",workDir:u=process.cwd(),showHeader:d=true,thinkingEnabled:p=true,selectMenuOptions:m=null,getCompletions:h,onStaticRendered:g,onSubmit:y,onInterrupt:x,onExit:S})=>{let[T,w]=useState(""),[L,B]=useState([]),[I,k]=useState(-1),R=useRef(false),E=e,M=d&&!R.current,_=Z.useCallback((U,H)=>U,[]),W=useMemo(()=>{let U=[];return M&&U.push(Z.createElement(Ch,{key:"header",version:a,provider:l,model:c,workDir:u})),s.forEach(H=>{U.push(Z.createElement(Pc,{key:`static-entry-${H.id}`,entry:H}));}),U},[M,s,a,l,c,u]);useEffect(()=>{!M&&s.length===0||(M&&(R.current=true),g?.());},[M,s.length,g]);let $=U=>{U.trim()&&(B([...L,U]),k(-1),w(""),y(U));},A=()=>{if(L.length===0)return;let U=I+1;U<L.length&&(k(U),w(L[L.length-1-U]));},G=()=>{if(I<=0){k(-1),w("");return}let U=I-1;k(U),w(L[L.length-1-U]);},N=U=>{if(!h)return null;let H=h(U);return H.length===0?null:H[0]};return Z.createElement(F,{flexDirection:"column",width:"100%"},Z.createElement(Do,{items:W},_),E.map(U=>Z.createElement(Pc,{key:`pending-${U.id}`,entry:U})),Z.createElement(C,null,`
1664
1664
  `),Z.createElement(F,{flexShrink:0,flexDirection:"column"},Z.createElement(Nh,{inputValue:T,isRunning:t,statusText:n,tokenStats:r,streamingTokens:i,streamingStartTime:o,provider:l,model:c,menuActive:!!m,thinkingEnabled:p,onInputChange:w,onSubmit:$,onInterrupt:x,onExit:S,onHistoryUp:A,onHistoryDown:G,onTabComplete:N}),m&&Z.createElement(Bh,{message:m.message,choices:m.choices,initialIndex:m.initialIndex,onSelect:m.onSelect,onCancel:m.onCancel})))};le();var Kr=class s{appInstance=null;messages=[];staticEntries=[];nextEntryId=1;isRunning=false;statusText="";tokenStats={input:0,output:0,total:0};version="";provider="";model="";workDir="";showHeader=true;thinkingEnabled=true;callbacks;forceUpdate=null;selectMenuOptions=null;getCompletions;memoryLogTimer=null;pendingEntries=[];streamingTokens=0;streamingStartTime=null;static MAX_QUEUED_STATIC=50;constructor(e){this.callbacks=e;}setCompletionFunction(e){this.getCompletions=e;}start(){f.info("INK","Starting Ink runtime"),this.startMemorySampler();let e=()=>{let[,t]=useState(0);return useEffect(()=>(this.forceUpdate=()=>t(n=>n+1),()=>{this.forceUpdate=null;}),[]),Z.createElement(Dc,{staticEntries:this.staticEntries,pendingEntries:this.pendingEntries,isRunning:this.isRunning,statusText:this.statusText,tokenStats:this.tokenStats,streamingTokens:this.streamingTokens,streamingStartTime:this.streamingStartTime,version:this.version,provider:this.provider,model:this.model,workDir:this.workDir,showHeader:this.showHeader,thinkingEnabled:this.thinkingEnabled,selectMenuOptions:this.selectMenuOptions,getCompletions:this.getCompletions,onStaticRendered:void 0,onSubmit:this.callbacks.onSubmit,onInterrupt:this.callbacks.onInterrupt,onExit:this.callbacks.onExit})};this.appInstance=Ec(Z.createElement(e,null),{stdout:process.stdout,stdin:process.stdin,exitOnCtrlC:false,patchConsole:false});try{process.removeAllListeners("SIGTSTP"),process.on("SIGTSTP","ignore"),process.env.CLI_DEBUG==="1"&&f.debug("INK","SIGTSTP handler registered (Ctrl+Z ignored)");}catch{process.env.CLI_DEBUG==="1"&&f.debug("INK","SIGTSTP not supported on this platform");}f.info("INK","Ink runtime started");}stop(){this.appInstance&&(this.appInstance.unmount(),this.appInstance=null,f.info("INK","Ink runtime stopped")),this.stopMemorySampler();}addMessage(e){this.messages=[...this.messages.slice(-4),e],this.forceUpdate?.();}addEntry(e){let t={...e,id:this.nextEntryId++,timestamp:new Date};return this.staticEntries.length>=s.MAX_QUEUED_STATIC&&(f.warn("INK_RUNTIME",`Static queue reached limit (${this.staticEntries.length}). Forcing immediate render to prevent OOM.`),this.forceUpdate?.(),setImmediate(()=>{this.clearStaticEntries();})),this.staticEntries=[...this.staticEntries,t],f.debug("INK_RUNTIME",`Queued static entry ${t.id}. Pending static: ${this.staticEntries.length}`),this.forceUpdate?.(),t.id}updateEntry(e,t){let n=this.staticEntries.findIndex(i=>i.id===e);if(n>=0){this.staticEntries=this.staticEntries.map((i,o)=>o===n?{...i,...t}:i),this.forceUpdate?.();return}let r=this.pendingEntries.findIndex(i=>i.id===e);r>=0&&(this.pendingEntries=this.pendingEntries.map((i,o)=>o===r?{...i,...t}:i),this.forceUpdate?.());}getEntry(e){return this.staticEntries.find(t=>t.id===e)||this.pendingEntries.find(t=>t.id===e)}addPendingEntry(e){let t={...e,id:this.nextEntryId++,timestamp:new Date};if(this.pendingEntries.length>=10){f.warn("INK_RUNTIME",`Too many pending entries (${this.pendingEntries.length}). Auto-committing oldest.`);let r=this.pendingEntries[0];this.staticEntries=[...this.staticEntries,r],this.pendingEntries=this.pendingEntries.slice(1);}return this.pendingEntries=[...this.pendingEntries,t],f.debug("INK_RUNTIME",`Added pending entry ${t.id}. Pending: ${this.pendingEntries.length}`),this.forceUpdate?.(),t.id}updatePendingEntry(e,t){let n=this.pendingEntries.findIndex(r=>r.id===e);n>=0&&(this.pendingEntries=this.pendingEntries.map((r,i)=>i===n?{...r,...t}:r),this.forceUpdate?.());}commitPendingEntry(e){let t=this.pendingEntries.findIndex(n=>n.id===e);if(t>=0){let n=this.pendingEntries[t];this.pendingEntries=this.pendingEntries.filter((r,i)=>i!==t),this.staticEntries=[...this.staticEntries,n],f.debug("INK_RUNTIME",`Committed entry ${e}. Static: ${this.staticEntries.length}, Pending: ${this.pendingEntries.length}`),this.forceUpdate?.();}else f.warn("INK_RUNTIME",`Cannot commit entry ${e} - not found in pending entries`);}clearPendingEntries(){this.pendingEntries.length>0&&(this.pendingEntries=[],this.forceUpdate?.());}updateStreamingStats(e){this.streamingTokens=e,this.streamingStartTime||(this.streamingStartTime=Date.now()),this.forceUpdate?.();}resetStreamingStats(){this.streamingTokens=0,this.streamingStartTime=null;}updateLastMessage(e){if(this.messages.length===0)return;let t=this.messages[this.messages.length-1];if(typeof t.content=="string")t.content=e;else if(Array.isArray(t.content)){let n=t.content.find(r=>r.type==="text");n&&"text"in n&&(n.text=e);}this.forceUpdate?.();}getLastMessageText(){if(this.messages.length===0)return "";let e=this.messages[this.messages.length-1];if(typeof e.content=="string")return e.content;if(Array.isArray(e.content)){let t=e.content.find(n=>n.type==="text");if(t&&"text"in t)return t.text||""}return ""}setRunning(e){this.isRunning!==e&&(this.isRunning=e,this.forceUpdate?.());}setStatusText(e){this.statusText!==e&&(this.statusText=e,this.forceUpdate?.());}setTokenStats(e){(this.tokenStats.input!==e.input||this.tokenStats.output!==e.output||this.tokenStats.total!==e.total||this.tokenStats.contextWindow!==e.contextWindow||this.tokenStats.tokensUsedForContext!==e.tokensUsedForContext||this.tokenStats.pressure!==e.pressure)&&(this.tokenStats={...e},this.forceUpdate?.());}clearMessages(){f.warn("INK_RUNTIME",`clearMessages called! This will clear pending/static queues. Messages: ${this.messages.length}`),this.messages=[],this.staticEntries=[],this.pendingEntries=[],this.forceUpdate?.();}setVersion(e){this.version=e,this.forceUpdate?.();}setProvider(e){this.provider=e,this.forceUpdate?.();}setModel(e){this.model=e,this.forceUpdate?.();}setWorkDir(e){this.workDir=e,this.forceUpdate?.();}setShowHeader(e){this.showHeader=e,this.forceUpdate?.();}setThinkingEnabled(e){this.thinkingEnabled!==e&&(this.thinkingEnabled=e,this.forceUpdate?.());}showSelectMenu(e){f.debug("INK_RUNTIME","Show select menu",{options:e}),this.selectMenuOptions=e,this.forceUpdate?.();}hideSelectMenu(){f.debug("INK_RUNTIME","Hide select menu"),this.selectMenuOptions=null,this.forceUpdate?.();}clearStaticEntries(){if(this.staticEntries.length===0)return;let e=this.staticEntries.length;f.debug("INK_RUNTIME",`Clearing ${e} static entries from memory`),this.staticEntries=[],global.gc&&e>10&&(f.debug("INK_RUNTIME","Triggering manual GC after clearing entries"),setImmediate(()=>{global.gc&&global.gc();}));}startMemorySampler(){this.memoryLogTimer||process.env.INK_MEM!=="1"||(this.memoryLogTimer=setInterval(()=>{let e=process.memoryUsage(),t=n=>Math.round(n/1024/1024*10)/10;f.info("INK_MEM","usage",{rssMB:t(e.rss),heapUsedMB:t(e.heapUsed),heapTotalMB:t(e.heapTotal),externalMB:t(e.external),arrayBuffersMB:t(e.arrayBuffers??0),pendingEntries:this.pendingEntries.length,queuedStatic:this.staticEntries.length,isRunning:this.isRunning});},1e4));}stopMemorySampler(){this.memoryLogTimer&&(clearInterval(this.memoryLogTimer),this.memoryLogTimer=null);}};le();var Vr=class{runtime;config;callbacks;currentThinkingText="";lastMessageRole=null;lastEntryId=null;tokenStats={inputTokens:0,outputTokens:0,totalTokens:0};memory;streamingTextPendingId=null;streamingReasoningPendingId=null;streamingTextBuffer="";streamingReasoningBuffer="";constructor(e){this.config=e,this.memory=e.memory,this.runtime=new Kr({onSubmit:t=>{this.callbacks?.onSubmit&&this.callbacks.onSubmit(t,[]);},onInterrupt:()=>{this.callbacks?.onInterrupt&&this.callbacks.onInterrupt();},onExit:()=>{this.callbacks?.onExit&&this.callbacks.onExit();}});}start(e){this.callbacks=e,this.runtime.setVersion(this.config.version),this.runtime.setProvider(this.config.provider),this.runtime.setModel(this.config.model),this.runtime.setWorkDir(this.config.workDir),this.config.getCompletions&&this.runtime.setCompletionFunction(this.config.getCompletions),this.runtime.start(),f.info("INK_ADAPTER","Ink UI started");}stop(){this.runtime.stop(),this.callbacks=void 0,f.info("INK_ADAPTER","Ink UI stopped");}addUserMessage(e,t){let n=[{type:"text",text:e}];if(t&&t.length>0)for(let i of t)n.push({type:"image_url",image_url:{url:`data:${i.mediaType};base64,${i.data}`}});let r={role:"user",content:n};this.lastEntryId=this.runtime.addEntry({type:"user",message:r}),this.lastMessageRole="user";}addAssistantMessage(e=""){if(e===""){this.lastMessageRole="assistant";return}let t={role:"assistant",content:[{type:"text",text:e}]};this.lastEntryId=this.runtime.addEntry({type:"assistant",message:t,isStreaming:false}),this.lastMessageRole="assistant";}streamText(e){this.streamingTextBuffer+=e;}addTextDelta(e){this.streamText(e);}addToolCall(e,t){let n={role:"assistant",content:[{type:"tool_use",id:`tool_${Date.now()}`,name:e,input:t}]};this.runtime.addMessage(n),this.lastMessageRole="tool_call";}addToolResult(e,t=false){let n={role:"user",content:[{type:"tool_result",tool_use_id:`tool_${Date.now()}`,content:e,is_error:t}]};this.runtime.addMessage(n),this.lastMessageRole="tool_result";}addInfo(e,t,n="info"){f.info("INK_ADAPTER",`Info: ${e}`,t?{details:t}:void 0);let r=n==="warning"||e.includes("\u26A0")||e.includes("\u23F3")||e.includes("\u23F1\uFE0F")||e.includes("\u{1F504}");this.runtime.addEntry({type:r?"warning":"info",text:e,details:t});}addError(e,t){f.error("INK_ADAPTER",e,t?{details:t}:void 0),this.runtime.addEntry({type:"error",text:e,details:t});}updateStatus(e,t){this.runtime.setStatusText(e);}setRunning(e){this.runtime.setRunning(e);}updateTokenStats(e,t){this.tokenStats.inputTokens=e,this.tokenStats.outputTokens=t,this.tokenStats.totalTokens=e+t,this.runtime.setTokenStats({input:e,output:t,total:e+t});}getTokenStats(){return {...this.tokenStats}}setTokenStats(e,t,n){this.tokenStats={inputTokens:e,outputTokens:t,totalTokens:e+t,...n};let r=n?.contextWindow||0,i=n?.tokensUsedForContext||e+t,o=r>0?i/r:0;this.runtime.setTokenStats({input:e,output:t,total:e+t,contextWindow:n?.contextWindow,tokensUsedForContext:n?.tokensUsedForContext,pressure:o});}startThinking(){this.streamingReasoningBuffer="";}streamThinking(e){this.streamingReasoningBuffer+=e,this.streamingReasoningPendingId?this.runtime.updatePendingEntry(this.streamingReasoningPendingId,{text:this.streamingReasoningBuffer}):this.streamingReasoningPendingId=this.runtime.addPendingEntry({type:"thinking",text:this.streamingReasoningBuffer,isStreaming:true});}endThinking(){if(!this.streamingReasoningPendingId){this.updateStatus("","info");return}this.runtime.updatePendingEntry(this.streamingReasoningPendingId,{isStreaming:false,isComplete:true}),this.runtime.commitPendingEntry(this.streamingReasoningPendingId),this.streamingReasoningPendingId=null,this.streamingReasoningBuffer="",this.runtime.resetStreamingStats(),this.updateStatus("","info");}startTaskTimer(){this.runtime.setRunning(true);}stopTaskTimer(){this.runtime.setRunning(false);}clear(){this.runtime.clearMessages(),this.lastMessageRole=null;}resetStreamingState(){this.streamingTextBuffer="",this.streamingReasoningBuffer="",this.streamingTextPendingId=null,this.streamingReasoningPendingId=null,this.currentThinkingText="",this.runtime.clearPendingEntries(),this.runtime.resetStreamingStats(),this.runtime.setStatusText(""),f.debug("INK_ADAPTER","Reset streaming state");}startReasoningStreaming(){this.startThinking();}streamReasoningText(e){this.streamThinking(e);}addReasoningDelta(e){this.streamThinking(e);}completeReasoningStreaming(){this.endThinking();}addThinking(e){}completeTextStreaming(){if(!this.streamingTextBuffer){f.debug("INK_ADAPTER","Complete text streaming - no text to commit");return}let e={role:"assistant",content:[{type:"text",text:this.streamingTextBuffer}]};this.runtime.addEntry({type:"assistant",message:e,isStreaming:false,isComplete:true}),this.streamingTextBuffer="",this.lastMessageRole="assistant",this.runtime.resetStreamingStats(),f.debug("INK_ADAPTER","Complete text streaming - added to static entries");}printCommandOutput(e){f.info("INK_ADAPTER",`Command output: ${e}`);}startToolCallWithId(e,t,n,r){f.debug("INK_ADAPTER",`Start tool call: ${t}`,{toolId:e,args:n}),this.addToolCall(t,n);}updateToolCallOutput(e,t,n){f.debug("INK_ADAPTER",`Update tool output: ${e}`,{output:t});}completeToolCall(e,t){f.debug("INK_ADAPTER",`Complete tool call: ${e}`),t.result&&this.addToolResult(t.result,t.isError||false);}updateTaskTokens(e,t=false){f.debug("INK_ADAPTER",`Update task tokens: ${e}`,{isActual:t}),!t&&this.runtime.updateStreamingStats(e);}addToolError(e,t){f.error("INK_ADAPTER",`Tool error: ${e}`,{error:t}),this.addToolResult(t,true);}printCommandOutputLines(e){e.forEach(t=>this.printCommandOutput(t));}resetTokenStats(){this.tokenStats={inputTokens:0,outputTokens:0,totalTokens:0},this.runtime.setTokenStats({input:0,output:0,total:0});}pause(){f.debug("INK_ADAPTER","Pause UI");}resume(){f.debug("INK_ADAPTER","Resume UI");}refreshUI(){f.debug("INK_ADAPTER","Refresh UI");}updateProvider(e,t){this.config.provider=e,this.config.model=t,this.runtime.setProvider(e),this.runtime.setModel(t);}setThinkingEnabled(e){this.runtime.setThinkingEnabled(e);}async promptText(e){return null}async promptSelect(e){return new Promise(t=>{let n=e.choices.map(i=>({label:i.title,value:i.value,description:i.description})),r=e.initial||0;if(e.initialValue){let i=e.choices.findIndex(o=>o.value===e.initialValue);i>=0&&(r=i);}this.runtime.showSelectMenu({message:e.message,choices:n,initialIndex:r,onSelect:i=>{this.runtime.hideSelectMenu(),t(i);},onCancel:()=>{this.runtime.hideSelectMenu(),t(null);}});})}handleSelectBack(){return f.debug("INK_ADAPTER","Handle select back"),false}addWebSearchResult(e){if(e.status==="searching"){f.debug("INK_ADAPTER","Skip web search start (waiting for completion)");return}f.debug("INK_ADAPTER","Add web search result",{options:e});let t=e.query||"query",n=e.results?`Found ${e.results.length} results`:void 0;this.runtime.addEntry({type:"web_search",text:t,details:n});}addWebFetchResult(e){if(e.status==="fetching"){f.debug("INK_ADAPTER","Skip web fetch start (waiting for completion)");return}f.debug("INK_ADAPTER","Add web fetch result",{options:e});let t=e.url||"URL",n=e.contentLength?`${(e.contentLength/1024).toFixed(1)}KB`:e.contentPreview?`${e.contentPreview.length} chars`:void 0;this.runtime.addEntry({type:"web_fetch",text:t,details:n});}addReadFileResult(e){if(e.status==="reading"){f.debug("INK_ADAPTER","Skip read file start (waiting for completion)");return}f.debug("INK_ADAPTER","Add read file result",{options:e});let t=e.filePath||"file",n=[];e.totalLines&&n.push(`${e.totalLines} lines`),e.fileSize&&n.push(e.fileSize);let r=n.length>0?n.join(", "):void 0;this.runtime.addEntry({type:"readfile",text:t,details:r});}addSearchResult(e){if(e.status==="searching"){f.debug("INK_ADAPTER","Skip search start (waiting for completion)");return}f.debug("INK_ADAPTER","Add search result",{options:e});let t=[];if(e.pattern&&t.push(`pattern="${e.pattern}"`),e.filePath){let o=e.filePath==="."?".":e.filePath;t.push(`path="${o}"`);}e.mode&&t.push(`mode="${e.mode}"`),e.status==="completed"?e.matchCount!==void 0&&t.push(`matches=${e.matchCount}`):e.status==="error"&&t.push("\u274C ERROR");let n=t.join(", "),r=[];if(e.command){let o=this.simplifyRipgrepCommand(e.command);r.push(`$ ${o}`),r.push("");}e.status==="error"&&e.error?r.push(this.parseErrorMessage(e.error)):e.details&&r.push(e.details);let i=r.length>0?r.join(`
1665
1665
  `):void 0;this.runtime.addEntry({type:"search",text:n,details:i});}addSearchFilesResult(e){if(e.status==="searching"){f.debug("INK_ADAPTER","Skip search files start (waiting for completion)");return}f.debug("INK_ADAPTER","Add search files result",{options:e});let t=[];e.pattern&&t.push(`pattern="${e.pattern}"`),e.path&&t.push(`path="${e.path}"`),e.fileCount!==void 0&&t.push(`files=${e.fileCount}`);let n=t.length>0?t.join(", "):"Glob";this.runtime.addEntry({type:"search_files",text:n});}addShowTreeResult(e){if(e.status==="loading"){f.debug("INK_ADAPTER","Skip show tree start (waiting for completion)");return}f.debug("INK_ADAPTER","Add show tree result",{options:e});let n=[`path="${e.path||"."}"`];if(e.mode&&n.push(`mode="${e.mode}"`),e.maxDepth!==void 0&&e.maxDepth!==null&&n.push(`depth=${e.maxDepth}`),e.status==="completed"&&e.totalChars){let a=(e.totalChars/1024).toFixed(1);n.push(`${a}KB`);}else e.status==="error"&&n.push("\u274C ERROR");let r=n.join(", "),i=this.formatSmartTreeDetails(e.content),o;e.status==="error"&&e.error?o=`Error: ${e.error}`:i?o=i:e.content&&(o=e.content.length>500?e.content.slice(0,500)+"...":e.content),this.runtime.addEntry({type:"show_tree",text:r,details:o});}addCommandExecResult(e){if(e.status==="running"){f.debug("INK_ADAPTER","Skip command exec start (waiting for completion)");return}f.debug("INK_ADAPTER","Add command exec result",{options:e});let t=`$ ${e.command||"command"}`,n=e.output?.slice(0,500);this.runtime.addEntry({type:"command_exec",text:t,details:n});}addCodeExecResult(e){if(e.status==="running"){f.debug("INK_ADAPTER","Skip code exec start (waiting for completion)");return}f.debug("INK_ADAPTER","Add code exec result",{options:e});let t=`Code: ${e.toolName||"execute"}`,n=e.output?.slice(0,500);this.runtime.addEntry({type:"code_exec",text:t,details:n});}addBrowserDebugResult(e){if(e.status==="detecting"){f.debug("INK_ADAPTER","Skip browser debug start (waiting for completion)");return}f.debug("INK_ADAPTER","Add browser debug result",{data:e});let t=e.url||"unknown",n=[];e.summary&&n.push(e.summary),e.loadTime&&n.push(`Load: ${e.loadTime}ms`),e.consoleLogs&&n.push(`Logs: ${e.consoleLogs}`),e.errors?.length&&n.push(`Errors: ${e.errors.length}`);let r=n.length>0?n.join(", "):void 0;this.runtime.addEntry({type:"browser_debug",text:t,details:r});}formatSmartTreeDetails(e){if(!e)return;let t=e.trim();if(!t.startsWith("{")||!t.endsWith("}"))return;let n;try{n=JSON.parse(t);}catch{return}if(!n||typeof n!="object"||Array.isArray(n)||!["path","project_types","root_dirs","modules","config_files","tip","error"].some(p=>Object.prototype.hasOwnProperty.call(n,p)))return;if(typeof n.error=="string"&&n.error.trim())return `error: ${n.error.trim()}`;let i=[],o=typeof n.path=="string"?n.path.trim():"";o&&i.push(`\u{1F4C1} Path: ${o}`);let a=this.formatSmartTreeList(n.project_types,6);a!==void 0&&i.push(`\u{1F4E6} Project Type: ${a}`);let l=this.formatSmartTreeList(n.root_dirs,12);l!==void 0&&i.push(`\u{1F4C2} Root Directories: ${l}`);let c=this.formatSmartTreeList(n.modules,12);c!==void 0&&i.push(`\u{1F527} Modules: ${c}`);let u=this.formatSmartTreeList(n.config_files,8);u!==void 0&&i.push(`\u2699\uFE0F Config Files: ${u}`);let d=typeof n.tip=="string"?n.tip.trim():"";if(d&&i.push(`\u{1F4A1} Tip: ${d}`),i.length!==0)return i.join(`
1666
1666
  `)}formatSmartTreeList(e,t){if(!Array.isArray(e))return;let n=e.filter(a=>typeof a=="string").map(a=>a.trim()).filter(a=>a.length>0);if(n.length===0)return "(none)";let r=n.slice(0,t),i=n.length-r.length,o=i>0?` ...(+${i} more)`:"";return `${r.join(", ")}${o}`}addWriteFileCall(e,t){f.debug("INK_ADAPTER","Add write file call",{filePath:e});let n=t.split(`
@@ -1868,7 +1868,7 @@ Model: ${r}`);}else await au(s,r);Bf(s,n);}async function Wf(s,e){if(!s.provider
1868
1868
  \u6A21\u578B: ${s.model}`);}Sn();async function Zf(s){if(b(""),b(v.warning(" \u26A0\uFE0F This will delete your configuration file and reset all settings.")),b(v.dim(" You will need to reconfigure providers and API keys.")),b(""),!(await kn({type:"confirm",name:"value",message:"Are you sure you want to clear the configuration?",initial:false})).value){b(""),b(v.info(" Configuration clear cancelled.")),b("");return}try{an.existsSync(lt)?(an.unlinkSync(lt),b(""),b(v.success(" \u2713 Configuration file deleted successfully!")),b(v.dim(` ${lt}`)),b(""),b(v.info(" Please restart the CLI to reconfigure.")),b(""),await s.cleanup(),process.exit(0)):(b(""),b(v.info(" No configuration file found.")),b(""));}catch(t){b(""),b(v.error(" \u2717 Failed to delete configuration file.")),b(v.dim(` ${t.message}`)),b("");}}async function Qf(s,e){let t="Usage: /approval auto | manual",n=e?e.toLowerCase():"";if(!n)try{n=await s.promptSelect("\u9009\u62E9\u5BA1\u6279\u6A21\u5F0F (Approval Mode)",[{label:"auto - \u81EA\u52A8\u6267\u884C (Default)",value:"auto",description:"\u5DE5\u5177\u65E0\u9700\u786E\u8BA4\u5373\u53EF\u8FD0\u884C"},{label:"manual - \u9700\u8981\u5BA1\u6279",value:"manual",description:"\u6BCF\u6B21\u5DE5\u5177\u8FD0\u884C\u524D\u624B\u52A8\u786E\u8BA4"}],s.approvalMode,"\u6309 \u2191\u2193 \u9009\u62E9\uFF0CEnter \u786E\u8BA4");}catch(o){o?.message!=="cancelled"&&s.logInfo("\u5BA1\u6279\u6A21\u5F0F\u5207\u6362\u5931\u8D25",o?.message);return}if(n!=="auto"&&n!=="manual"){s.logInfo("\u65E0\u6548\u7684\u5BA1\u6279\u6A21\u5F0F",`${t}`);return}if(s.approvalMode===n){s.logInfo("\u5BA1\u6279\u6A21\u5F0F\u672A\u53D8\u5316",`\u4ECD\u4E3A ${n}`);return}s.setApprovalMode(n);let r={...s.userConfig,approvalMode:n};s.updateConfig(r),ct(r);let i=n==="manual"?"\u5DF2\u5207\u6362\u4E3A\u9700\u8981\u5BA1\u6279\u6A21\u5F0F\uFF1A\u6267\u884C\u5DE5\u5177\u524D\u5C06\u5F39\u51FA Yes/No\u3002":"\u5DF2\u5207\u6362\u4E3A\u81EA\u52A8\u6A21\u5F0F\uFF1A\u5DE5\u5177\u6267\u884C\u4E0D\u518D\u63D0\u793A\u5BA1\u6279\u3002";s.logInfo("\u5BA1\u6279\u6A21\u5F0F\u5DF2\u66F4\u65B0",i);}Sn();ji();async function tg(s,e){let t=fr(s.workspacePath),n=await t.getStats();if(!e)try{e=await s.promptSelect("\u4EE3\u7801\u7D22\u5F15\u7BA1\u7406",[{label:n.hasIndex?"\u{1F4CA} \u67E5\u770B\u7D22\u5F15\u72B6\u6001":"\u{1F4CA} \u7D22\u5F15\u72B6\u6001 (\u672A\u6784\u5EFA)",value:"status",description:n.hasIndex?`${n.fileCount} \u4E2A\u6587\u4EF6, ${n.symbolCount} \u4E2A\u7B26\u53F7`:"\u5C1A\u672A\u6784\u5EFA\u7D22\u5F15"},{label:"\u{1F528} \u6784\u5EFA\u7D22\u5F15",value:"build",description:"\u89E3\u6790\u9879\u76EE\u4EE3\u7801\uFF0C\u63D0\u53D6\u51FD\u6570/\u7C7B/\u63A5\u53E3\u7B49\u7B26\u53F7"},{label:"\u{1F504} \u91CD\u5EFA\u7D22\u5F15",value:"rebuild",description:"\u5F3A\u5236\u91CD\u65B0\u6784\u5EFA\u7D22\u5F15 (\u5FFD\u7565\u7F13\u5B58)"},{label:"\u{1F5D1}\uFE0F \u6E05\u9664\u7D22\u5F15",value:"clear",description:"\u5220\u9664\u6240\u6709\u7D22\u5F15\u6587\u4EF6"},{label:"\u2699\uFE0F \u914D\u7F6E\u7D22\u5F15",value:"config",description:"\u8BBE\u7F6E\u7D22\u5F15\u8BED\u8A00\u3001\u6392\u9664\u8DEF\u5F84\u7B49"}],"status","\u6309 \u2191\u2193 \u9009\u62E9\uFF0CEnter \u786E\u8BA4");}catch(r){r?.message!=="cancelled"&&s.logInfo("\u7D22\u5F15\u64CD\u4F5C\u5931\u8D25",r?.message);return}switch(e){case "status":await jT(s,t);break;case "build":await eg(s,t,false);break;case "rebuild":await eg(s,t,true);break;case "clear":await GT(s,t);break;case "config":await WT(s);break;default:s.logInfo("\u65E0\u6548\u7684\u64CD\u4F5C","\u4F7F\u7528 /index \u67E5\u770B\u53EF\u7528\u64CD\u4F5C");}}async function jT(s,e){let t=await e.getStats(),n=[];if(!t.hasIndex)n.push(v.warning("\u72B6\u6001: \u672A\u6784\u5EFA")),n.push(""),n.push(v.dim("\u8FD0\u884C /index build \u6784\u5EFA\u7D22\u5F15"));else {n.push(v.success("\u72B6\u6001: \u5DF2\u6784\u5EFA \u2713")),n.push(`\u6587\u4EF6\u6570: ${t.fileCount}`),n.push(`\u7B26\u53F7\u6570: ${t.symbolCount}`);let r=(t.size/1024).toFixed(1),i=(t.size/(1024*1024)).toFixed(2),o=t.size>1024*1024?`${i}MB`:`${r}KB`;n.push(`\u7D22\u5F15\u5927\u5C0F: ${o}`),t.lastUpdated&&n.push(`\u6700\u540E\u66F4\u65B0: ${t.lastUpdated.toLocaleString()}`);}s.logInfo("\u{1F4CA} \u4EE3\u7801\u7D22\u5F15\u72B6\u6001",n.join(`
1869
1869
  `));}async function eg(s,e,t){s.logInfo(t?"\u{1F504} \u6B63\u5728\u91CD\u5EFA\u7D22\u5F15...":"\u{1F528} \u6B63\u5728\u6784\u5EFA\u7D22\u5F15...");let n=Date.now(),r=await e.buildIndex({force:t,onProgress:(c,u,d)=>{}}),i=((Date.now()-n)/1e3).toFixed(2),o=[];if(o.push(`\u6587\u4EF6\u6570: ${r.filesIndexed}`),o.push(`\u7B26\u53F7\u6570: ${r.symbolsFound}`),o.push(`\u8017\u65F6: ${i}s`),r.errors.length>0){o.push(""),o.push(v.warning("\u9519\u8BEF:"));for(let c of r.errors.slice(0,3))o.push(v.dim(` ${c.file}: ${c.error}`));r.errors.length>3&&o.push(v.dim(` ... \u8FD8\u6709 ${r.errors.length-3} \u4E2A\u9519\u8BEF`));}let a=r.success?v.success("\u2713 \u7D22\u5F15\u6784\u5EFA\u5B8C\u6210"):v.warning("\u26A0\uFE0F \u7D22\u5F15\u6784\u5EFA\u5B8C\u6210 (\u6709\u9519\u8BEF)");s.logInfo(a,o.join(`
1870
1870
  `));let l={...s.userConfig,smartRead:{...s.userConfig.smartRead,enabled:true}};s.updateConfig(l),ct(l);}async function GT(s,e){if(!(await e.getStats()).hasIndex){s.logInfo("\u7D22\u5F15\u4E0D\u5B58\u5728","\u65E0\u9700\u6E05\u9664");return}try{if(await s.promptSelect("\u26A0\uFE0F \u786E\u5B9A\u8981\u6E05\u9664\u6240\u6709\u7D22\u5F15\u6587\u4EF6\u5417?",[{label:"\u53D6\u6D88",value:"no",description:"\u4FDD\u7559\u7D22\u5F15\u6587\u4EF6"},{label:"\u786E\u5B9A\u6E05\u9664",value:"yes",description:"\u5220\u9664\u6240\u6709\u7D22\u5F15\u6587\u4EF6"}],"no","\u6309 \u2191\u2193 \u9009\u62E9")!=="yes"){s.logInfo("\u64CD\u4F5C\u5DF2\u53D6\u6D88");return}await e.clear(),s.logInfo(v.success("\u2713 \u7D22\u5F15\u5DF2\u6E05\u9664"));}catch(n){n?.message!=="cancelled"&&s.logInfo("\u6E05\u9664\u5931\u8D25",n?.message);}}async function WT(s){let e=s.userConfig.smartRead||{enabled:true},t=[{label:"Web \u5F00\u53D1 (TS + JS)",value:"web",languages:["typescript","javascript"]},{label:"Full Stack (TS + JS + Python)",value:"fullstack",languages:["typescript","javascript","python"]},{label:"\u5168\u90E8\u8BED\u8A00",value:"all",languages:["typescript","javascript","python","java","go","rust"]},{label:"\u4EC5 TypeScript",value:"ts",languages:["typescript"]},{label:"\u4EC5 Python",value:"python",languages:["python"]},{label:"\u4EC5 Go",value:"go",languages:["go"]}];try{let n=await s.promptSelect("\u9009\u62E9\u8981\u7D22\u5F15\u7684\u8BED\u8A00",t.map(o=>({label:o.label,value:o.value,description:o.languages.join(", ")})),"fullstack","\u6309 \u2191\u2193 \u9009\u62E9\uFF0CEnter \u786E\u8BA4"),r=t.find(o=>o.value===n);if(!r){s.logInfo("\u914D\u7F6E\u5DF2\u53D6\u6D88");return}let i={...s.userConfig,smartRead:{...e,enabled:!0,languages:r.languages}};s.updateConfig(i),ct(i),s.logInfo(v.success("\u2713 \u914D\u7F6E\u5DF2\u4FDD\u5B58"),`\u8BED\u8A00: ${r.languages.join(", ")}
1871
- \u8FD0\u884C /index rebuild \u4EE5\u5E94\u7528\u65B0\u914D\u7F6E`);}catch(n){n?.message!=="cancelled"&&s.logInfo("\u914D\u7F6E\u5931\u8D25",n?.message);}}Sn();function HT(s){return {compressionMode:s.context?.compressionMode??"sync",thresholdPercent:s.context?.thresholdPercent??85}}async function ng(s,e){let t=HT(s.userConfig);if(!e)try{e=await s.promptSelect("\u4E0A\u4E0B\u6587\u7BA1\u7406",[{label:"\u{1F4CA} \u67E5\u770B\u72B6\u6001",value:"status",description:`\u538B\u7F29\u6A21\u5F0F: ${t.compressionMode}, \u9608\u503C: ${t.thresholdPercent}%`},{label:"\u{1F504} \u5207\u6362\u538B\u7F29\u6A21\u5F0F",value:"mode",description:t.compressionMode==="sync"?"\u5F53\u524D: \u540C\u6B65\u88C1\u526A":"\u5F53\u524D: \u5F02\u6B65LLM\u538B\u7F29"},{label:"\u2699\uFE0F \u8BBE\u7F6E\u538B\u7F29\u9608\u503C",value:"threshold",description:`\u89E6\u53D1\u538B\u7F29\u7684 token \u4F7F\u7528\u7387 (\u5F53\u524D: ${t.thresholdPercent}%)`}],"status","\u6309 \u2191\u2193 \u9009\u62E9\uFF0CEnter \u786E\u8BA4");}catch(n){n?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u5931\u8D25",n?.message);return}switch(e){case "status":JT(s,t);break;case "mode":await zT(s,t);break;case "threshold":await qT(s,t);break;default:s.logInfo("\u65E0\u6548\u7684\u64CD\u4F5C","\u4F7F\u7528 /context \u67E5\u770B\u53EF\u7528\u64CD\u4F5C");}}function JT(s,e){b(""),b(v.info(" \u{1F4CA} \u4E0A\u4E0B\u6587\u7BA1\u7406\u72B6\u6001")),b(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");let t=e.compressionMode==="sync"?v.success("\u540C\u6B65\u88C1\u526A (FIFO)"):v.warning("\u5F02\u6B65LLM\u538B\u7F29");b(` \u538B\u7F29\u6A21\u5F0F: ${t}`),b(` \u89E6\u53D1\u9608\u503C: ${e.thresholdPercent}%`),b(""),e.compressionMode==="sync"?(b(v.dim(" \u540C\u6B65\u6A21\u5F0F\u8BF4\u660E:")),b(v.dim(" \u2022 \u4F7F\u7528 FIFO \u7B56\u7565\u5220\u9664\u6700\u65E7\u7684\u6D88\u606F")),b(v.dim(" \u2022 \u901F\u5EA6\u5FEB\uFF0C\u65E0\u989D\u5916 API \u8C03\u7528")),b(v.dim(" \u2022 \u9002\u5408\u5927\u591A\u6570\u573A\u666F"))):(b(v.dim(" \u5F02\u6B65\u6A21\u5F0F\u8BF4\u660E:")),b(v.dim(" \u2022 \u4F7F\u7528 LLM \u667A\u80FD\u538B\u7F29\u5386\u53F2\u6D88\u606F")),b(v.dim(" \u2022 \u4FDD\u7559\u66F4\u591A\u4E0A\u4E0B\u6587\u4FE1\u606F")),b(v.dim(" \u2022 \u4F1A\u4EA7\u751F\u989D\u5916\u7684 API \u8C03\u7528"))),b("");}async function zT(s,e){try{let t=await s.promptSelect("\u9009\u62E9\u538B\u7F29\u6A21\u5F0F",[{label:"\u{1F680} \u540C\u6B65\u88C1\u526A (\u63A8\u8350)",value:"sync",description:"\u5FEB\u901F FIFO \u5220\u9664\uFF0C\u65E0\u989D\u5916 API \u8C03\u7528"},{label:"\u{1F9E0} \u5F02\u6B65LLM\u538B\u7F29",value:"async",description:"\u667A\u80FD\u538B\u7F29\uFF0C\u4FDD\u7559\u66F4\u591A\u4E0A\u4E0B\u6587\uFF0C\u6709\u989D\u5916 API \u8C03\u7528"}],e.compressionMode,"\u6309 \u2191\u2193 \u9009\u62E9");if(t===e.compressionMode){b(""),b(v.dim(" \u538B\u7F29\u6A21\u5F0F\u672A\u6539\u53D8")),b("");return}let n={...s.userConfig,context:{...e,compressionMode:t}};s.updateConfig(n),ct(n),s.runner&&s.runner.setCompressionMode(t),b(""),b(v.success(` \u2713 \u538B\u7F29\u6A21\u5F0F\u5DF2\u5207\u6362\u4E3A: ${t==="sync"?"\u540C\u6B65\u88C1\u526A":"\u5F02\u6B65LLM\u538B\u7F29"}`)),b("");}catch(t){t?.message!=="cancelled"&&s.logInfo("\u5207\u6362\u5931\u8D25",t?.message);}}async function qT(s,e){try{let t=await s.promptSelect("\u9009\u62E9\u89E6\u53D1\u538B\u7F29\u7684\u9608\u503C",[{label:"70%",value:"70",description:"\u8F83\u65E9\u89E6\u53D1\uFF0C\u66F4\u79EF\u6781\u7684\u538B\u7F29"},{label:"80%",value:"80",description:"\u5E73\u8861\u9009\u62E9"},{label:"85% (\u9ED8\u8BA4)",value:"85",description:"\u63A8\u8350\u8BBE\u7F6E"},{label:"90%",value:"90",description:"\u5EF6\u8FDF\u89E6\u53D1\uFF0C\u4FDD\u7559\u66F4\u591A\u4E0A\u4E0B\u6587"}],String(e.thresholdPercent),"\u6309 \u2191\u2193 \u9009\u62E9"),n=parseInt(t,10);if(n===e.thresholdPercent){b(""),b(v.dim(" \u9608\u503C\u672A\u6539\u53D8")),b("");return}let r={...s.userConfig,context:{...e,thresholdPercent:n}};s.updateConfig(r),ct(r),b(""),b(v.success(` \u2713 \u538B\u7F29\u9608\u503C\u5DF2\u8BBE\u7F6E\u4E3A: ${n}%`)),b("");}catch(t){t?.message!=="cancelled"&&s.logInfo("\u8BBE\u7F6E\u5931\u8D25",t?.message);}}ma();f.info("CLI","Starting Neox CLI");process.env.CLI_DEBUG==="1"&&(Je.start(5e3),f.info("CLI","Health monitor started for debugging"));var nF={log:console.log.bind(console),error:console.error.bind(console),warn:console.warn.bind(console)};process.env.CLI_DEBUG==="1"&&(console.log=(...s)=>{let e=s.map(t=>typeof t=="string"?t:JSON.stringify(t)).join(" ");f.debug("CONSOLE",e);},console.error=(...s)=>{let e=s.map(t=>typeof t=="string"?t:JSON.stringify(t)).join(" ");f.error("CONSOLE",e);},console.warn=(...s)=>{let e=s.map(t=>typeof t=="string"?t:JSON.stringify(t)).join(" ");f.warn("CONSOLE",e);});setInterval(()=>{performance$1.clearMarks(),performance$1.clearMeasures();},6e4);var o0=fileURLToPath(import.meta.url);dirname(o0);var oi=false,uu=false,du=class{runner=null;memory;llmProvider;workDir;model;provider;providerId;providerSettings;providerStore;sessionRequests=0;uiController=null;useModernUI=true;useInkUI=process.env.USE_ANSI!=="1";agentLogger=null;tracingEnabled=false;userConfig={};promptLock=null;promptLockResolver=null;approvalMode="auto";structuredOutput;compatProfile=null;memoryPressure;lastMemoryPressureState="unknown";autoCompactionInProgress=false;interactionMode="agent";pendingAttachments=[];tools=[];lastToolCallArgs=new Map;toolIdToName=new Map;sessionSync=null;sessionManager;sessionEnabled=true;cliArgs;runtimeHost;runtimeEventUnsubscribe=null;isTaskRunning=false;exiting=false;runtimeInputTokens=0;runtimeOutputTokens=0;streamingTokenCount=0;currentSession;thinkingMode;permissionManager;currentMode="agent";constructor(e,t,n,r){this.cliArgs=r||Kc(),this.userConfig=Xt(),this.approvalMode=this.userConfig.approvalMode||"auto",this.providerStore=new Cs(this.userConfig),this.workDir=te.resolve(t||this.cliArgs.workDir||process.cwd()),this.structuredOutput=yf(this.cliArgs.outputSchema),this.sessionManager=new Es,this.sessionEnabled=!this.cliArgs.noSession;let i=this.resolveProvider(n);this.providerSettings=i,this.providerId=i.id,this.provider=i.protocol;let o=e||this.providerStore.resolveModel(i.id);if(!o)throw new Error(`Provider "${i.name}" does not have any models configured. Use /model add to configure one.`);this.model=o,this.providerStore.setLastSelectedModel(i.id,this.model),this.refreshProviderSettings(),process.chdir(this.workDir),process.env.NEOX_WORKDIR=this.workDir;}async init(){this.approvalMode==="auto"?this.currentMode="auto":this.approvalMode==="manual"&&(this.currentMode="agent"),this.permissionManager=up(),this.tools=await go(this.workDir),this.llmProvider=this.createProvider(),this.memory=new ds(500);let e={maxIterations:0,temperature:.7,mode:this.currentMode};this.runner=new Sr({llmProvider:this.llmProvider,model:this.model,tools:this.tools,memory:this.memory,config:e,agentName:"CLI Assistant",agentDescription:"\u547D\u4EE4\u884C\u52A9\u624B\uFF0C\u53EF\u4EE5\u641C\u7D22\u6587\u4EF6\u3001\u5206\u6790\u4EE3\u7801\u3001\u8BFB\u5199\u6587\u4EF6",instructions:this.buildSystemPrompt(),plannerMode:this.isPlannerModeEnabled(),structuredOutput:this.structuredOutput,providerName:this.providerSettings?.name,contextWindow:this.compatProfile?.contextWindow,tailTokenBudget:this.compatProfile?.tailTokenBudget,maxInputTokensOverride:this.providerSettings?.maxInputTokens,toolInputGuardrails:eu,toolOutputGuardrails:tu,compressionMode:this.userConfig.context?.compressionMode??"sync",workspacePath:this.workDir,permissionManager:this.permissionManager}),this.runtimeHost=new Qo({runner:this.runner,memory:this.memory,sessionManager:this.sessionManager,sessionEnabled:this.sessionEnabled,workDir:this.workDir,model:this.model,memoryPressure:this.memoryPressure,compatProfile:this.compatProfile,agentLogger:this.agentLogger,systemPrompt:this.buildStaticSystemPrompt(),setSandboxMode:r=>ic(r),llmProvider:this.llmProvider}),this.runtimeHost.setAgentLogger(this.agentLogger),this.runtimeHost.setSandboxMode(fo()),lp((r,i,o,a)=>this.promptSelect(r,i,o,a)),this.compatProfile&&!this.memoryPressure&&this.resetMemoryPressureMonitor(),this.useModernUI||this.setupKeyboardHandling(),this.useModernUI||this.displayHeader();let t=process.env.MARKOR_TRACING==="1",n=this.userConfig.tracingEnabled===true;t||n?(this.initializeAgentLogger(true,false),!t&&n&&this.updateTracingPreference(true)):(this.tracingEnabled=false,oe.setEnabled(false));}createProvider(){if(!this.providerSettings)throw new Error("No provider configured. Use /provider add to configure one.");if(!this.model)throw new Error("No model selected for provider.");if(process.env.CLI_DEBUG==="1"&&f.debug("PROVIDER","Creating provider",{protocol:this.providerSettings.protocol,name:this.providerSettings.name,baseUrl:this.providerSettings.baseUrl,model:this.model}),this.providerSettings.protocol==="anthropic"){let e=new Yi({authToken:this.providerSettings.apiKey,baseUrl:this.providerSettings.baseUrl,defaultModel:this.model});return (this.model.includes("opus-4-5")||this.model.includes("opus-4.5")||this.model.endsWith("-thinking"))&&(this.thinkingMode="enabled",e.setThinking({type:"enabled"}),process.env.CLI_DEBUG==="1"&&f.debug("PROVIDER",`Claude thinking auto-enabled for model: ${this.model}`)),e}else {if(this.providerSettings.protocol==="doubao")return new Xi({apiKey:this.providerSettings.apiKey,baseUrl:this.providerSettings.baseUrl||"https://ark.cn-beijing.volces.com/api/v3",defaultModel:this.model});if(this.providerSettings.protocol==="gemini")return process.env.CLI_DEBUG==="1"&&f.debug("PROVIDER","Creating GeminiProvider"),new Zi(this.providerSettings.apiKey,this.providerSettings.baseUrl||"https://generativelanguage.googleapis.com");{let e=this.providerSettings.protocol==="openai-responses";return process.env.CLI_DEBUG==="1"&&f.debug("PROVIDER",`Creating OpenAIProvider (useResponsesAPI: ${e})`),new zi({apiKey:this.providerSettings.apiKey,baseUrl:this.providerSettings.baseUrl||"https://api.openai.com/v1",defaultModel:this.model,useResponsesAPI:e})}}}initializeAgentLogger(e=false,t=true){let n=e||process.env.MARKOR_TRACING==="1";if(this.tracingEnabled=n,oe.setEnabled(n),!n)return false;if(this.agentLogger)return this.tracingEnabled=true,this.runtimeHost.setAgentLogger(this.agentLogger),true;try{let r=this.getTracingLogDir(),i=new Qr({logDir:r,autoRotate:!0,bufferSize:10});return this.agentLogger=new Zr({enabled:!0,exporters:[i]}),this.tracingEnabled=!0,this.runtimeHost.setAgentLogger(this.agentLogger),t&&f.info("TRACE",`Tracing enabled: ${r}`),!0}catch(r){return f.error("TRACE","Failed to initialize AgentLogger:",r),this.tracingEnabled=false,false}}resolveProvider(e){if(e){let n=this.providerStore.getProvider(e);if(n)return n;let r=e,i=this.providerStore.getProviders().find(o=>o.protocol===r);if(i)return i}let t=this.providerStore.getDefaultProvider();if(!t)throw new Error("No LLM providers configured. Run /provider add to set up a provider.");return t}getProviderByIdentifier(e){if(e){let t=this.providerStore.getProvider(e);if(t)return t;let n=this.providerStore.getProviders().find(r=>r.protocol===e);return n||null}return this.providerSettings||null}getProviderDisplayName(){if(!this.providerSettings)return "Not configured";let e=ln[this.providerSettings.protocol]||"OpenAI";return `${this.providerSettings.name} (${e})`}isPlannerModeEnabled(){return this.provider==="openai-responses"}async promptText(e,t={}){await this.acquirePromptLock();try{return this.useModernUI&&this.uiController?await this.uiController.promptText({message:e,defaultValue:t.defaultValue,allowEmpty:t.allowEmpty,hint:t.hint})??"":await this.promptTextLegacy(e,t)}finally{this.releasePromptLock();}}async promptSelect(e,t,n,r){if(await this.acquirePromptLock(),t.length===0)throw this.releasePromptLock(),new Error("No available options");if(this.useModernUI&&this.uiController){let i=t.map(o=>({title:o.label,value:o.value,description:o.description}));try{let o=await this.uiController.promptSelect({message:e,choices:i,initialValue:n,hint:r});return this.releasePromptLock(),o??""}catch(o){throw this.releasePromptLock(),o}}try{return await this.promptSelectLegacy(e,t,n)}finally{this.releasePromptLock();}}async promptYesNo(e,t=false){return await this.promptSelect(e,[{label:"Yes",value:"yes"},{label:"No",value:"no"}],t?"yes":"no")==="yes"}async promptConfirmKeyword(e,t){return (await this.promptText(e,{allowEmpty:false})).trim().toLowerCase()===t.toLowerCase()}async handleToolApprovalRequest(e){let t=nu(e.args||{}),n=`\u5141\u8BB8\u6267\u884C ${e.name}${t}?`,r="";try{r=JSON.stringify(e.args,null,2),r.length>600&&(r=`${r.slice(0,600)} ...`);}catch{r="";}this.uiController?(this.uiController.updateStatus(`\u9700\u8981\u5BA1\u6279: ${e.name}`,"thinking"),this.uiController.addInfo(`\u5BA1\u6279\u8BF7\u6C42 \xB7 ${e.name}`,r||void 0)):(b(""),b(v.warning(`\u26A0\uFE0F \u9700\u8981\u5BA1\u6279: ${e.name}${t}`)),r&&b(v.dim(r)),b(""));try{let i=await this.promptYesNo(n,!1);return this.uiController?this.uiController.addInfo(i?`[v] \u5DF2\u6279\u51C6 ${e.name}`:`\u26D4 \u5DF2\u62D2\u7EDD ${e.name}`):b(v.info(i?`\u5DF2\u6279\u51C6 ${e.name}`:`\u5DF2\u62D2\u7EDD ${e.name}`)),i}catch(i){return i?.message!=="cancelled"&&this.logInfo("\u5BA1\u6279\u63D0\u793A\u5931\u8D25",i?.message),this.uiController?this.uiController.addInfo(`\u26D4 \u5DF2\u62D2\u7EDD ${e.name}`,"\u5BA1\u6279\u88AB\u53D6\u6D88"):b(v.warning(`\u5BA1\u6279\u5DF2\u53D6\u6D88: ${e.name}`)),false}}async promptTextLegacy(e,t){let r=(await kn({type:"text",name:"value",message:e,initial:t.defaultValue},{onCancel:()=>{throw new Error("cancelled")}})).value??"";if(!r&&!t.allowEmpty)if(t.defaultValue)r=t.defaultValue;else throw new Error("cancelled");return r}async promptSelectLegacy(e,t,n){let r=n?Math.max(0,t.findIndex(o=>o.value===n)):0,i=await kn({type:"select",name:"value",message:e,choices:t.map(o=>({title:o.label,description:o.description,value:o.value})),initial:r},{onCancel:()=>{throw new Error("cancelled")}});if(i.value===void 0)throw new Error("cancelled");return i.value}refreshProviderSettings(){if(!this.providerId)return;let e=this.providerStore.getProvider(this.providerId);e&&(this.providerSettings=e,this.rebuildCompatProfile());}getActiveModelConfig(){return this.providerSettings?.models?.find(e=>e.name===this.model)}rebuildCompatProfile(){if(!this.model||!this.providerSettings){this.compatProfile=null,this.memoryPressure=void 0,this.lastMemoryPressureState="unknown",this.updateContextWindowDisplay();return}let e=this.getActiveModelConfig();this.compatProfile=Gh(this.model,e?.compat),this.resetMemoryPressureMonitor(),this.updateContextWindowDisplay();}resetMemoryPressureMonitor(){this.compatProfile?this.memoryPressure=new mi(this.compatProfile):this.memoryPressure=void 0,this.lastMemoryPressureState="unknown";}buildDefaultContextExtras(e){return this.compatProfile?{contextWindow:this.compatProfile.contextWindow,autoCompactLimit:this.compatProfile.autoCompactLimit,tokensUsedForContext:e?.tokensUsedForContext??0,pressure:e?.pressure??0,warningLevel:e?.warningLevel??"normal"}:e}updateContextWindowDisplay(){if(!this.uiController)return;let e=this.buildDefaultContextExtras();if(!e)return;let t=this.uiController.getTokenStats();this.uiController.setTokenStats(t.inputTokens,t.outputTokens,{...e,tokensUsedForContext:e.tokensUsedForContext??t.tokensUsedForContext??0,pressure:e.pressure??t.pressure??0,warningLevel:e.warningLevel??t.warningLevel??"normal"});}pushTokenStats(e,t,n,r){if(this.uiController){let i=this.uiController.getTokenStats(),o=n?{contextWindow:n.profile.contextWindow,autoCompactLimit:n.profile.autoCompactLimit,pressure:n.pressure,warningLevel:n.state,tokensUsedForContext:n.tokensUsed,messageCount:n.messageCount}:this.buildDefaultContextExtras({tokensUsedForContext:i.tokensUsedForContext??0,pressure:i.pressure??0,warningLevel:i.warningLevel??"normal",messageCount:i.messageCount}),a={...o,...r&&{cachedTokens:r.cachedTokens,openaiCachedTokens:r.openaiCachedTokens,anthropicCacheReadTokens:r.anthropicCacheReadTokens,anthropicCacheCreationTokens:r.anthropicCacheCreationTokens}};process.env.CLI_DEBUG&&(f.debug("MAIN","pushTokenStats calling setTokenStats:"),f.debug("MAIN",` inputTokens=${e}, outputTokens=${t}`),f.debug("MAIN",` extras.tokensUsedForContext=${o?.tokensUsedForContext}, extras.contextWindow=${o?.contextWindow}`),f.debug("MAIN",` hasSnapshot=${!!n}, hasCacheStats=${!!r}`)),this.uiController.setTokenStats(e,t,a);}}async acquirePromptLock(){for(;this.promptLock;)await this.promptLock;this.promptLock=new Promise(e=>{this.promptLockResolver=e;});}releasePromptLock(){this.promptLockResolver&&this.promptLockResolver(),this.promptLock=null,this.promptLockResolver=null;}async selectProviderFromList(e){let t=this.providerStore.getProviders();if(t.length===0)return this.logInfo("No providers configured","Use /provider add to create one."),null;let n=await this.promptSelect(e,t.map(r=>({label:`${r.name} (${ln[r.protocol]||"OpenAI"})`,value:r.id,description:r.models.length>0?r.models.map(i=>i.name).join(", "):"No models configured"})),this.providerId);return this.providerStore.getProvider(n)||null}async selectModelFromProvider(e,t){if(!e||e.models.length===0)return this.logInfo("No models configured",`Use /model add to register a model for ${e?.name||"provider"}.`),null;let n=(e.id===this.providerId?this.model:null)||e.lastSelectedModel||e.defaultModel||e.models[0].name;return this.promptSelect(t,e.models.map(r=>({label:e.id===this.providerId&&r.name===this.model?`${r.name} (current)`:r.name,value:r.name})),n)}async selectModelFromCurrentProvider(e){return this.providerSettings?this.selectModelFromProvider(this.providerSettings,e):(this.logInfo("No provider configured","Add a provider before managing models."),null)}getCompletionContext(){return {providerStore:this.providerStore,providerSettings:this.providerSettings}}getCompletionSuggestions(e){return df(this.getCompletionContext(),e)}getTracingLogDir(){return te.join(ti.homedir(),".neox","traces")}updateTracingPreference(e){this.userConfig={...this.userConfig,tracingEnabled:e},ct(this.userConfig);}async disableTracing(e=true){if(!this.agentLogger){this.tracingEnabled=false,oe.setEnabled(false),this.updateTracingPreference(false),this.runtimeHost.setAgentLogger(null),e&&(b(""),b(v.dim(" Tracing is already disabled.")),b(""));return}try{await this.agentLogger.close(),this.agentLogger=null,this.tracingEnabled=!1,oe.setEnabled(!1),this.updateTracingPreference(!1),this.runtimeHost.setAgentLogger(null),e&&(b(""),b(v.success(" \u2713 Tracing disabled")),b(v.dim(" Logs will no longer be recorded.")),b(""));}catch(t){b(v.error(" [x] Failed to disable tracing: ")+t.message),b("");}}async initializeSession(){if(this.sessionEnabled)try{let e;if(this.cliArgs.continue){let n=await this.sessionManager.getMostRecent();n?(e=n,b(v.dim(` \u21AA Continuing session: ${e.sessionId}`))):(e=await this.sessionManager.createSession({model:this.model}),b(v.dim(` \u2726 New session: ${e.sessionId}`)));}else if(this.cliArgs.resume)if(typeof this.cliArgs.resume=="string"){let n=await this.sessionManager.getSession(this.cliArgs.resume);n?(e=n,b(v.dim(` \u21AA Resuming session: ${e.sessionId}`))):(b(v.error(` [x] Session not found: ${this.cliArgs.resume}`)),e=await this.sessionManager.createSession({model:this.model}));}else {let n=await this.showSessionSelector();n?e=n:(e=await this.sessionManager.createSession({model:this.model}),b(v.dim(` \u2726 New session: ${e.sessionId}`)));}else e=await this.sessionManager.createSession({model:this.model});let t=await this.activateSession(e,{loadHistory:!!(this.cliArgs.continue||this.cliArgs.resume)});if(t>0)b(v.dim(` \u21B3 Loaded ${t} messages from history`));else {let n=await this.runtimeHost.createCheckpoint("session_start");b(v.dim(` \u2713 Checkpoint created: ${n}`));}}catch(e){b(v.warning(` \u26A0 Session initialization failed: ${e.message}`)),this.sessionEnabled=false;}}async showSessionSelector(){let e=await this.sessionManager.listSessions();if(e.length===0)return b(v.dim(" No sessions found")),null;b(""),b(v.highlight(" Select Session:")),b("");let t=e.slice(0,10).map((i,o)=>({title:`${i.sessionId} (${i.itemCount} items, ${ta(i.updatedAt)})`,value:i.sessionId}));t.push({title:"Create new session",value:"new"});let n=await kn({type:"select",name:"session",message:"Session",choices:t});if(!n.session||n.session==="new")return null;let r=await this.sessionManager.getSession(n.session);return r&&b(v.dim(` \u21AA Selected: ${r.sessionId}`)),r}async activateSession(e,t){return this.sessionSync=new Is({session:e,memory:this.memory,systemPrompt:this.buildStaticSystemPrompt()}),this.currentSession=e,this.runtimeHost.setSession(e,this.sessionSync),this.memory.clear(),t?.loadHistory===false?(this.memory.add({role:"system",content:this.buildStaticSystemPrompt()}),0):await this.sessionSync.loadHistory()}setupKeyboardHandling(){process.stdin.isTTY&&(zo.emitKeypressEvents(process.stdin),process.stdin.setRawMode(true),process.stdin.on("keypress",(e,t)=>{t.name==="escape"&&oi&&(console.log(j.magenta(`
1871
+ \u8FD0\u884C /index rebuild \u4EE5\u5E94\u7528\u65B0\u914D\u7F6E`);}catch(n){n?.message!=="cancelled"&&s.logInfo("\u914D\u7F6E\u5931\u8D25",n?.message);}}Sn();function HT(s){return {compressionMode:s.context?.compressionMode??"sync",thresholdPercent:s.context?.thresholdPercent??85}}async function ng(s,e){let t=HT(s.userConfig);if(!e)try{e=await s.promptSelect("\u4E0A\u4E0B\u6587\u7BA1\u7406",[{label:"\u{1F4CA} \u67E5\u770B\u72B6\u6001",value:"status",description:`\u538B\u7F29\u6A21\u5F0F: ${t.compressionMode}, \u9608\u503C: ${t.thresholdPercent}%`},{label:"\u{1F504} \u5207\u6362\u538B\u7F29\u6A21\u5F0F",value:"mode",description:t.compressionMode==="sync"?"\u5F53\u524D: \u540C\u6B65\u88C1\u526A":"\u5F53\u524D: \u5F02\u6B65LLM\u538B\u7F29"},{label:"\u2699\uFE0F \u8BBE\u7F6E\u538B\u7F29\u9608\u503C",value:"threshold",description:`\u89E6\u53D1\u538B\u7F29\u7684 token \u4F7F\u7528\u7387 (\u5F53\u524D: ${t.thresholdPercent}%)`}],"status","\u6309 \u2191\u2193 \u9009\u62E9\uFF0CEnter \u786E\u8BA4");}catch(n){n?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u5931\u8D25",n?.message);return}switch(e){case "status":JT(s,t);break;case "mode":await zT(s,t);break;case "threshold":await qT(s,t);break;default:s.logInfo("\u65E0\u6548\u7684\u64CD\u4F5C","\u4F7F\u7528 /context \u67E5\u770B\u53EF\u7528\u64CD\u4F5C");}}function JT(s,e){b(""),b(v.info(" \u{1F4CA} \u4E0A\u4E0B\u6587\u7BA1\u7406\u72B6\u6001")),b(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");let t=e.compressionMode==="sync"?v.success("\u540C\u6B65\u88C1\u526A (FIFO)"):v.warning("\u5F02\u6B65LLM\u538B\u7F29");b(` \u538B\u7F29\u6A21\u5F0F: ${t}`),b(` \u89E6\u53D1\u9608\u503C: ${e.thresholdPercent}%`),b(""),e.compressionMode==="sync"?(b(v.dim(" \u540C\u6B65\u6A21\u5F0F\u8BF4\u660E:")),b(v.dim(" \u2022 \u4F7F\u7528 FIFO \u7B56\u7565\u5220\u9664\u6700\u65E7\u7684\u6D88\u606F")),b(v.dim(" \u2022 \u901F\u5EA6\u5FEB\uFF0C\u65E0\u989D\u5916 API \u8C03\u7528")),b(v.dim(" \u2022 \u9002\u5408\u5927\u591A\u6570\u573A\u666F"))):(b(v.dim(" \u5F02\u6B65\u6A21\u5F0F\u8BF4\u660E:")),b(v.dim(" \u2022 \u4F7F\u7528 LLM \u667A\u80FD\u538B\u7F29\u5386\u53F2\u6D88\u606F")),b(v.dim(" \u2022 \u4FDD\u7559\u66F4\u591A\u4E0A\u4E0B\u6587\u4FE1\u606F")),b(v.dim(" \u2022 \u4F1A\u4EA7\u751F\u989D\u5916\u7684 API \u8C03\u7528"))),b("");}async function zT(s,e){try{let t=await s.promptSelect("\u9009\u62E9\u538B\u7F29\u6A21\u5F0F",[{label:"\u{1F680} \u540C\u6B65\u88C1\u526A (\u63A8\u8350)",value:"sync",description:"\u5FEB\u901F FIFO \u5220\u9664\uFF0C\u65E0\u989D\u5916 API \u8C03\u7528"},{label:"\u{1F9E0} \u5F02\u6B65LLM\u538B\u7F29",value:"async",description:"\u667A\u80FD\u538B\u7F29\uFF0C\u4FDD\u7559\u66F4\u591A\u4E0A\u4E0B\u6587\uFF0C\u6709\u989D\u5916 API \u8C03\u7528"}],e.compressionMode,"\u6309 \u2191\u2193 \u9009\u62E9");if(t===e.compressionMode){b(""),b(v.dim(" \u538B\u7F29\u6A21\u5F0F\u672A\u6539\u53D8")),b("");return}let n={...s.userConfig,context:{...e,compressionMode:t}};s.updateConfig(n),ct(n),s.runner&&s.runner.setCompressionMode(t),b(""),b(v.success(` \u2713 \u538B\u7F29\u6A21\u5F0F\u5DF2\u5207\u6362\u4E3A: ${t==="sync"?"\u540C\u6B65\u88C1\u526A":"\u5F02\u6B65LLM\u538B\u7F29"}`)),b("");}catch(t){t?.message!=="cancelled"&&s.logInfo("\u5207\u6362\u5931\u8D25",t?.message);}}async function qT(s,e){try{let t=await s.promptSelect("\u9009\u62E9\u89E6\u53D1\u538B\u7F29\u7684\u9608\u503C",[{label:"70%",value:"70",description:"\u8F83\u65E9\u89E6\u53D1\uFF0C\u66F4\u79EF\u6781\u7684\u538B\u7F29"},{label:"80%",value:"80",description:"\u5E73\u8861\u9009\u62E9"},{label:"85% (\u9ED8\u8BA4)",value:"85",description:"\u63A8\u8350\u8BBE\u7F6E"},{label:"90%",value:"90",description:"\u5EF6\u8FDF\u89E6\u53D1\uFF0C\u4FDD\u7559\u66F4\u591A\u4E0A\u4E0B\u6587"}],String(e.thresholdPercent),"\u6309 \u2191\u2193 \u9009\u62E9"),n=parseInt(t,10);if(n===e.thresholdPercent){b(""),b(v.dim(" \u9608\u503C\u672A\u6539\u53D8")),b("");return}let r={...s.userConfig,context:{...e,thresholdPercent:n}};s.updateConfig(r),ct(r),b(""),b(v.success(` \u2713 \u538B\u7F29\u9608\u503C\u5DF2\u8BBE\u7F6E\u4E3A: ${n}%`)),b("");}catch(t){t?.message!=="cancelled"&&s.logInfo("\u8BBE\u7F6E\u5931\u8D25",t?.message);}}ma();f.info("CLI","Starting Neox CLI");process.env.CLI_DEBUG==="1"&&(Je.start(5e3),f.info("CLI","Health monitor started for debugging"));var tF={log:console.log.bind(console),error:console.error.bind(console),warn:console.warn.bind(console)};process.env.CLI_DEBUG==="1"&&(console.log=(...s)=>{let e=s.map(t=>typeof t=="string"?t:JSON.stringify(t)).join(" ");f.debug("CONSOLE",e);},console.error=(...s)=>{let e=s.map(t=>typeof t=="string"?t:JSON.stringify(t)).join(" ");f.error("CONSOLE",e);},console.warn=(...s)=>{let e=s.map(t=>typeof t=="string"?t:JSON.stringify(t)).join(" ");f.warn("CONSOLE",e);});setInterval(()=>{performance$1.clearMarks(),performance$1.clearMeasures();},6e4);var o0=fileURLToPath(import.meta.url);dirname(o0);var oi=false,uu=false,du=class{runner=null;memory;llmProvider;workDir;model;provider;providerId;providerSettings;providerStore;sessionRequests=0;uiController=null;useModernUI=true;useInkUI=process.env.USE_ANSI!=="1";agentLogger=null;tracingEnabled=false;userConfig={};promptLock=null;promptLockResolver=null;approvalMode="auto";structuredOutput;compatProfile=null;memoryPressure;lastMemoryPressureState="unknown";autoCompactionInProgress=false;interactionMode="agent";pendingAttachments=[];tools=[];lastToolCallArgs=new Map;toolIdToName=new Map;sessionSync=null;sessionManager;sessionEnabled=true;cliArgs;runtimeHost;runtimeEventUnsubscribe=null;isTaskRunning=false;exiting=false;runtimeInputTokens=0;runtimeOutputTokens=0;streamingTokenCount=0;currentSession;thinkingMode;permissionManager;currentMode="agent";constructor(e,t,n,r){this.cliArgs=r||Kc(),this.userConfig=Xt(),this.approvalMode=this.userConfig.approvalMode||"auto",this.providerStore=new Cs(this.userConfig),this.workDir=te.resolve(t||this.cliArgs.workDir||process.cwd()),this.structuredOutput=yf(this.cliArgs.outputSchema),this.sessionManager=new Es,this.sessionEnabled=!this.cliArgs.noSession;let i=this.resolveProvider(n);this.providerSettings=i,this.providerId=i.id,this.provider=i.protocol;let o=e||this.providerStore.resolveModel(i.id);if(!o)throw new Error(`Provider "${i.name}" does not have any models configured. Use /model add to configure one.`);this.model=o,this.providerStore.setLastSelectedModel(i.id,this.model),this.refreshProviderSettings(),process.chdir(this.workDir),process.env.NEOX_WORKDIR=this.workDir;}async init(){this.approvalMode==="auto"?this.currentMode="auto":this.approvalMode==="manual"&&(this.currentMode="agent"),this.permissionManager=up(),this.tools=await go(this.workDir),this.llmProvider=this.createProvider(),this.memory=new ds(500);let e={maxIterations:0,temperature:.7,mode:this.currentMode};this.runner=new Sr({llmProvider:this.llmProvider,model:this.model,tools:this.tools,memory:this.memory,config:e,agentName:"CLI Assistant",agentDescription:"\u547D\u4EE4\u884C\u52A9\u624B\uFF0C\u53EF\u4EE5\u641C\u7D22\u6587\u4EF6\u3001\u5206\u6790\u4EE3\u7801\u3001\u8BFB\u5199\u6587\u4EF6",instructions:this.buildSystemPrompt(),plannerMode:this.isPlannerModeEnabled(),structuredOutput:this.structuredOutput,providerName:this.providerSettings?.name,contextWindow:this.compatProfile?.contextWindow,tailTokenBudget:this.compatProfile?.tailTokenBudget,maxInputTokensOverride:this.providerSettings?.maxInputTokens,toolInputGuardrails:eu,toolOutputGuardrails:tu,compressionMode:this.userConfig.context?.compressionMode??"sync",workspacePath:this.workDir,permissionManager:this.permissionManager}),this.runtimeHost=new Qo({runner:this.runner,memory:this.memory,sessionManager:this.sessionManager,sessionEnabled:this.sessionEnabled,workDir:this.workDir,model:this.model,memoryPressure:this.memoryPressure,compatProfile:this.compatProfile,agentLogger:this.agentLogger,systemPrompt:this.buildStaticSystemPrompt(),setSandboxMode:r=>ic(r),llmProvider:this.llmProvider}),this.runtimeHost.setAgentLogger(this.agentLogger),this.runtimeHost.setSandboxMode(fo()),lp((r,i,o,a)=>this.promptSelect(r,i,o,a)),this.compatProfile&&!this.memoryPressure&&this.resetMemoryPressureMonitor(),this.useModernUI||this.setupKeyboardHandling(),this.useModernUI||this.displayHeader();let t=process.env.MARKOR_TRACING==="1",n=this.userConfig.tracingEnabled===true;t||n?(this.initializeAgentLogger(true,false),!t&&n&&this.updateTracingPreference(true)):(this.tracingEnabled=false,oe.setEnabled(false));}createProvider(){if(!this.providerSettings)throw new Error("No provider configured. Use /provider add to configure one.");if(!this.model)throw new Error("No model selected for provider.");if(process.env.CLI_DEBUG==="1"&&f.debug("PROVIDER","Creating provider",{protocol:this.providerSettings.protocol,name:this.providerSettings.name,baseUrl:this.providerSettings.baseUrl,model:this.model}),this.providerSettings.protocol==="anthropic"){let e=new Yi({authToken:this.providerSettings.apiKey,baseUrl:this.providerSettings.baseUrl,defaultModel:this.model});return (this.model.includes("opus-4-5")||this.model.includes("opus-4.5")||this.model.endsWith("-thinking"))&&(this.thinkingMode="enabled",e.setThinking({type:"enabled"}),process.env.CLI_DEBUG==="1"&&f.debug("PROVIDER",`Claude thinking auto-enabled for model: ${this.model}`)),e}else {if(this.providerSettings.protocol==="doubao")return new Xi({apiKey:this.providerSettings.apiKey,baseUrl:this.providerSettings.baseUrl||"https://ark.cn-beijing.volces.com/api/v3",defaultModel:this.model});if(this.providerSettings.protocol==="gemini")return process.env.CLI_DEBUG==="1"&&f.debug("PROVIDER","Creating GeminiProvider"),new Zi(this.providerSettings.apiKey,this.providerSettings.baseUrl||"https://generativelanguage.googleapis.com");{let e=this.providerSettings.protocol==="openai-responses";return process.env.CLI_DEBUG==="1"&&f.debug("PROVIDER",`Creating OpenAIProvider (useResponsesAPI: ${e})`),new zi({apiKey:this.providerSettings.apiKey,baseUrl:this.providerSettings.baseUrl||"https://api.openai.com/v1",defaultModel:this.model,useResponsesAPI:e})}}}initializeAgentLogger(e=false,t=true){let n=e||process.env.MARKOR_TRACING==="1";if(this.tracingEnabled=n,oe.setEnabled(n),!n)return false;if(this.agentLogger)return this.tracingEnabled=true,this.runtimeHost.setAgentLogger(this.agentLogger),true;try{let r=this.getTracingLogDir(),i=new Qr({logDir:r,autoRotate:!0,bufferSize:10});return this.agentLogger=new Zr({enabled:!0,exporters:[i]}),this.tracingEnabled=!0,this.runtimeHost.setAgentLogger(this.agentLogger),t&&f.info("TRACE",`Tracing enabled: ${r}`),!0}catch(r){return f.error("TRACE","Failed to initialize AgentLogger:",r),this.tracingEnabled=false,false}}resolveProvider(e){if(e){let n=this.providerStore.getProvider(e);if(n)return n;let r=e,i=this.providerStore.getProviders().find(o=>o.protocol===r);if(i)return i}let t=this.providerStore.getDefaultProvider();if(!t)throw new Error("No LLM providers configured. Run /provider add to set up a provider.");return t}getProviderByIdentifier(e){if(e){let t=this.providerStore.getProvider(e);if(t)return t;let n=this.providerStore.getProviders().find(r=>r.protocol===e);return n||null}return this.providerSettings||null}getProviderDisplayName(){if(!this.providerSettings)return "Not configured";let e=ln[this.providerSettings.protocol]||"OpenAI";return `${this.providerSettings.name} (${e})`}isPlannerModeEnabled(){return this.provider==="openai-responses"}async promptText(e,t={}){await this.acquirePromptLock();try{return this.useModernUI&&this.uiController?await this.uiController.promptText({message:e,defaultValue:t.defaultValue,allowEmpty:t.allowEmpty,hint:t.hint})??"":await this.promptTextLegacy(e,t)}finally{this.releasePromptLock();}}async promptSelect(e,t,n,r){if(await this.acquirePromptLock(),t.length===0)throw this.releasePromptLock(),new Error("No available options");if(this.useModernUI&&this.uiController){let i=t.map(o=>({title:o.label,value:o.value,description:o.description}));try{let o=await this.uiController.promptSelect({message:e,choices:i,initialValue:n,hint:r});return this.releasePromptLock(),o??""}catch(o){throw this.releasePromptLock(),o}}try{return await this.promptSelectLegacy(e,t,n)}finally{this.releasePromptLock();}}async promptYesNo(e,t=false){return await this.promptSelect(e,[{label:"Yes",value:"yes"},{label:"No",value:"no"}],t?"yes":"no")==="yes"}async promptConfirmKeyword(e,t){return (await this.promptText(e,{allowEmpty:false})).trim().toLowerCase()===t.toLowerCase()}async handleToolApprovalRequest(e){let t=nu(e.args||{}),n=`\u5141\u8BB8\u6267\u884C ${e.name}${t}?`,r="";try{r=JSON.stringify(e.args,null,2),r.length>600&&(r=`${r.slice(0,600)} ...`);}catch{r="";}this.uiController?(this.uiController.updateStatus(`\u9700\u8981\u5BA1\u6279: ${e.name}`,"thinking"),this.uiController.addInfo(`\u5BA1\u6279\u8BF7\u6C42 \xB7 ${e.name}`,r||void 0)):(b(""),b(v.warning(`\u26A0\uFE0F \u9700\u8981\u5BA1\u6279: ${e.name}${t}`)),r&&b(v.dim(r)),b(""));try{let i=await this.promptYesNo(n,!1);return this.uiController?this.uiController.addInfo(i?`[v] \u5DF2\u6279\u51C6 ${e.name}`:`\u26D4 \u5DF2\u62D2\u7EDD ${e.name}`):b(v.info(i?`\u5DF2\u6279\u51C6 ${e.name}`:`\u5DF2\u62D2\u7EDD ${e.name}`)),i}catch(i){return i?.message!=="cancelled"&&this.logInfo("\u5BA1\u6279\u63D0\u793A\u5931\u8D25",i?.message),this.uiController?this.uiController.addInfo(`\u26D4 \u5DF2\u62D2\u7EDD ${e.name}`,"\u5BA1\u6279\u88AB\u53D6\u6D88"):b(v.warning(`\u5BA1\u6279\u5DF2\u53D6\u6D88: ${e.name}`)),false}}async promptTextLegacy(e,t){let r=(await kn({type:"text",name:"value",message:e,initial:t.defaultValue},{onCancel:()=>{throw new Error("cancelled")}})).value??"";if(!r&&!t.allowEmpty)if(t.defaultValue)r=t.defaultValue;else throw new Error("cancelled");return r}async promptSelectLegacy(e,t,n){let r=n?Math.max(0,t.findIndex(o=>o.value===n)):0,i=await kn({type:"select",name:"value",message:e,choices:t.map(o=>({title:o.label,description:o.description,value:o.value})),initial:r},{onCancel:()=>{throw new Error("cancelled")}});if(i.value===void 0)throw new Error("cancelled");return i.value}refreshProviderSettings(){if(!this.providerId)return;let e=this.providerStore.getProvider(this.providerId);e&&(this.providerSettings=e,this.rebuildCompatProfile());}getActiveModelConfig(){return this.providerSettings?.models?.find(e=>e.name===this.model)}rebuildCompatProfile(){if(!this.model||!this.providerSettings){this.compatProfile=null,this.memoryPressure=void 0,this.lastMemoryPressureState="unknown",this.updateContextWindowDisplay();return}let e=this.getActiveModelConfig();this.compatProfile=Gh(this.model,e?.compat),this.resetMemoryPressureMonitor(),this.updateContextWindowDisplay();}resetMemoryPressureMonitor(){this.compatProfile?this.memoryPressure=new mi(this.compatProfile):this.memoryPressure=void 0,this.lastMemoryPressureState="unknown";}buildDefaultContextExtras(e){return this.compatProfile?{contextWindow:this.compatProfile.contextWindow,autoCompactLimit:this.compatProfile.autoCompactLimit,tokensUsedForContext:e?.tokensUsedForContext??0,pressure:e?.pressure??0,warningLevel:e?.warningLevel??"normal"}:e}updateContextWindowDisplay(){if(!this.uiController)return;let e=this.buildDefaultContextExtras();if(!e)return;let t=this.uiController.getTokenStats();this.uiController.setTokenStats(t.inputTokens,t.outputTokens,{...e,tokensUsedForContext:e.tokensUsedForContext??t.tokensUsedForContext??0,pressure:e.pressure??t.pressure??0,warningLevel:e.warningLevel??t.warningLevel??"normal"});}pushTokenStats(e,t,n,r){if(this.uiController){let i=this.uiController.getTokenStats(),o=n?{contextWindow:n.profile.contextWindow,autoCompactLimit:n.profile.autoCompactLimit,pressure:n.pressure,warningLevel:n.state,tokensUsedForContext:n.tokensUsed,messageCount:n.messageCount}:this.buildDefaultContextExtras({tokensUsedForContext:i.tokensUsedForContext??0,pressure:i.pressure??0,warningLevel:i.warningLevel??"normal",messageCount:i.messageCount}),a={...o,...r&&{cachedTokens:r.cachedTokens,openaiCachedTokens:r.openaiCachedTokens,anthropicCacheReadTokens:r.anthropicCacheReadTokens,anthropicCacheCreationTokens:r.anthropicCacheCreationTokens}};process.env.CLI_DEBUG&&(f.debug("MAIN","pushTokenStats calling setTokenStats:"),f.debug("MAIN",` inputTokens=${e}, outputTokens=${t}`),f.debug("MAIN",` extras.tokensUsedForContext=${o?.tokensUsedForContext}, extras.contextWindow=${o?.contextWindow}`),f.debug("MAIN",` hasSnapshot=${!!n}, hasCacheStats=${!!r}`)),this.uiController.setTokenStats(e,t,a);}}async acquirePromptLock(){for(;this.promptLock;)await this.promptLock;this.promptLock=new Promise(e=>{this.promptLockResolver=e;});}releasePromptLock(){this.promptLockResolver&&this.promptLockResolver(),this.promptLock=null,this.promptLockResolver=null;}async selectProviderFromList(e){let t=this.providerStore.getProviders();if(t.length===0)return this.logInfo("No providers configured","Use /provider add to create one."),null;let n=await this.promptSelect(e,t.map(r=>({label:`${r.name} (${ln[r.protocol]||"OpenAI"})`,value:r.id,description:r.models.length>0?r.models.map(i=>i.name).join(", "):"No models configured"})),this.providerId);return this.providerStore.getProvider(n)||null}async selectModelFromProvider(e,t){if(!e||e.models.length===0)return this.logInfo("No models configured",`Use /model add to register a model for ${e?.name||"provider"}.`),null;let n=(e.id===this.providerId?this.model:null)||e.lastSelectedModel||e.defaultModel||e.models[0].name;return this.promptSelect(t,e.models.map(r=>({label:e.id===this.providerId&&r.name===this.model?`${r.name} (current)`:r.name,value:r.name})),n)}async selectModelFromCurrentProvider(e){return this.providerSettings?this.selectModelFromProvider(this.providerSettings,e):(this.logInfo("No provider configured","Add a provider before managing models."),null)}getCompletionContext(){return {providerStore:this.providerStore,providerSettings:this.providerSettings}}getCompletionSuggestions(e){return df(this.getCompletionContext(),e)}getTracingLogDir(){return te.join(ti.homedir(),".neox","traces")}updateTracingPreference(e){this.userConfig={...this.userConfig,tracingEnabled:e},ct(this.userConfig);}async disableTracing(e=true){if(!this.agentLogger){this.tracingEnabled=false,oe.setEnabled(false),this.updateTracingPreference(false),this.runtimeHost.setAgentLogger(null),e&&(b(""),b(v.dim(" Tracing is already disabled.")),b(""));return}try{await this.agentLogger.close(),this.agentLogger=null,this.tracingEnabled=!1,oe.setEnabled(!1),this.updateTracingPreference(!1),this.runtimeHost.setAgentLogger(null),e&&(b(""),b(v.success(" \u2713 Tracing disabled")),b(v.dim(" Logs will no longer be recorded.")),b(""));}catch(t){b(v.error(" [x] Failed to disable tracing: ")+t.message),b("");}}async initializeSession(){if(this.sessionEnabled)try{let e;if(this.cliArgs.continue){let n=await this.sessionManager.getMostRecent();n?(e=n,b(v.dim(` \u21AA Continuing session: ${e.sessionId}`))):(e=await this.sessionManager.createSession({model:this.model}),b(v.dim(` \u2726 New session: ${e.sessionId}`)));}else if(this.cliArgs.resume)if(typeof this.cliArgs.resume=="string"){let n=await this.sessionManager.getSession(this.cliArgs.resume);n?(e=n,b(v.dim(` \u21AA Resuming session: ${e.sessionId}`))):(b(v.error(` [x] Session not found: ${this.cliArgs.resume}`)),e=await this.sessionManager.createSession({model:this.model}));}else {let n=await this.showSessionSelector();n?e=n:(e=await this.sessionManager.createSession({model:this.model}),b(v.dim(` \u2726 New session: ${e.sessionId}`)));}else e=await this.sessionManager.createSession({model:this.model});let t=await this.activateSession(e,{loadHistory:!!(this.cliArgs.continue||this.cliArgs.resume)});if(t>0)b(v.dim(` \u21B3 Loaded ${t} messages from history`));else {let n=await this.runtimeHost.createCheckpoint("session_start");b(v.dim(` \u2713 Checkpoint created: ${n}`));}}catch(e){b(v.warning(` \u26A0 Session initialization failed: ${e.message}`)),this.sessionEnabled=false;}}async showSessionSelector(){let e=await this.sessionManager.listSessions();if(e.length===0)return b(v.dim(" No sessions found")),null;b(""),b(v.highlight(" Select Session:")),b("");let t=e.slice(0,10).map((i,o)=>({title:`${i.sessionId} (${i.itemCount} items, ${ta(i.updatedAt)})`,value:i.sessionId}));t.push({title:"Create new session",value:"new"});let n=await kn({type:"select",name:"session",message:"Session",choices:t});if(!n.session||n.session==="new")return null;let r=await this.sessionManager.getSession(n.session);return r&&b(v.dim(` \u21AA Selected: ${r.sessionId}`)),r}async activateSession(e,t){return this.sessionSync=new Is({session:e,memory:this.memory,systemPrompt:this.buildStaticSystemPrompt()}),this.currentSession=e,this.runtimeHost.setSession(e,this.sessionSync),this.memory.clear(),t?.loadHistory===false?(this.memory.add({role:"system",content:this.buildStaticSystemPrompt()}),0):await this.sessionSync.loadHistory()}setupKeyboardHandling(){process.stdin.isTTY&&(zo.emitKeypressEvents(process.stdin),process.stdin.setRawMode(true),process.stdin.on("keypress",(e,t)=>{t.name==="escape"&&oi&&(console.log(j.magenta(`
1872
1872
 
1873
1873
  \u26A0\uFE0F Session interrupted (ESC)`)),uu=true,this.runtimeHost.interrupt()),t.ctrl&&t.name==="c"&&(console.log(v.info(`
1874
1874
 
@@ -1888,4 +1888,4 @@ Model: ${r}`);}else await au(s,r);Bf(s,n);}async function Wf(s,e){if(!s.provider
1888
1888
  `));}}else sa(!!this.agentLogger);break;case "/schema-example":await bf(this.workDir,i[0]);break;case "/mode":{let a=(i[0]||"").toLowerCase();if(a&&a!=="status"){if(a!=="agent"&&a!=="ask"){this.logInfo("\u65E0\u6548\u7684\u6A21\u5F0F","\u53EF\u7528\u6A21\u5F0F: agent, ask");break}if(this.interactionMode===a){this.logInfo("\u6A21\u5F0F\u672A\u53D8\u5316",`\u4ECD\u4E3A ${a}`);break}this.interactionMode=a,this.logInfo("\u4EA4\u4E92\u6A21\u5F0F\u5DF2\u66F4\u65B0",a==="ask"?"\u5C06\u4EE5\u66F4\u5BF9\u8BDD\u7684\u65B9\u5F0F\u56DE\u7B54\uFF0C\u5E76\u51CF\u5C11\u5DE5\u5177\u8C03\u7528\u3002":"\u6062\u590D\u9ED8\u8BA4\u7684 Agent \u6A21\u5F0F\uFF0C\u53EF\u81EA\u52A8\u8C03\u7528\u5DE5\u5177\u3002");break}try{let l=await this.promptSelect("Select mode",[{label:"Agent",value:"agent",description:"\u667A\u80FD\u4F53\u81EA\u52A8\u4F7F\u7528\u5DE5\u5177\uFF0C\u9002\u5408\u4EE3\u7801\u4EFB\u52A1"},{label:"Ask",value:"ask",description:"\u4EC5\u56DE\u7B54\u95EE\u9898\uFF0C\u5C3D\u91CF\u907F\u514D\u5DE5\u5177\u8C03\u7528"}],this.interactionMode);this.interactionMode!==l?(this.interactionMode=l,this.logInfo("\u4EA4\u4E92\u6A21\u5F0F\u5DF2\u66F4\u65B0",l==="ask"?"\u5C06\u4EE5\u66F4\u5BF9\u8BDD\u7684\u65B9\u5F0F\u56DE\u7B54\uFF0C\u5E76\u51CF\u5C11\u5DE5\u5177\u8C03\u7528\u3002":"\u6062\u590D\u9ED8\u8BA4\u7684 Agent \u6A21\u5F0F\uFF0C\u53EF\u81EA\u52A8\u8C03\u7528\u5DE5\u5177\u3002")):this.logInfo("\u6A21\u5F0F",`\u5F53\u524D\u6A21\u5F0F: ${l}`);}catch(l){l.message!=="cancelled"&&this.logInfo("Mode selection failed",l.message);}break}case "/attach":{if(!i.length){this.logInfo("\u7528\u6CD5","/attach <\u56FE\u7247\u8DEF\u5F84\u6216 URL>");break}if(i[0].toLowerCase()==="clear"){this.clearPendingAttachments();break}await this.addPendingAttachment(i.join(" "));break}case "/attachments":{if(!i.length||i[0].toLowerCase()==="list"){this.listPendingAttachments();break}if(i[0].toLowerCase()==="clear"){this.clearPendingAttachments();break}if(i[0].toLowerCase()==="remove"){let a=parseInt(i[1],10);if(isNaN(a)||a<1){this.logInfo("\u7528\u6CD5","/attachments remove <\u7F16\u53F7>");break}this.removePendingAttachment(a-1);break}this.logInfo("\u7528\u6CD5","/attachments [list|clear|remove <\u7F16\u53F7>]");break}case "/approval":await Qf(this.getConfigCommandContext(),i[0]);break;case "/provider":{let a=(i[0]||"").toLowerCase(),l=this.getProviderCommandContext();switch(a){case "":await Ff(l);break;case "list":ii(l);break;case "add":await Df(l);break;case "edit":case "update":await $f(l,i[1]);break;case "remove":case "delete":await Nf(l,i[1]);break;case "use":await ou(l,i[1]);break;case "default":await Uf(l,i[1]);break;default:await ou(l,a);break}break}case "/sandbox":{let a=(i[0]||"").toLowerCase(),l=fo();if(a==="on"||a==="enable"){this.runtimeHost.setSandboxMode(true),this.logInfo("Sandbox enabled","\u6C99\u7BB1\u6A21\u5F0F\u5DF2\u542F\u7528\uFF0C\u4EC5\u5141\u8BB8\u5B89\u5168\u547D\u4EE4");break}if(a==="off"||a==="disable"){this.runtimeHost.setSandboxMode(false),this.logInfo("Sandbox disabled","\u5168\u529F\u80FD\u6A21\u5F0F\uFF0C\u6240\u6709\u547D\u4EE4\u53EF\u6267\u884C");break}try{let u=await this.promptSelect("Sandbox mode",[{label:"Off (Full mode)",value:"off",description:"\u6240\u6709 shell \u547D\u4EE4\u90FD\u53EF\u4EE5\u6267\u884C"},{label:"On (Restricted)",value:"on",description:"\u4EC5\u5141\u8BB8 ls, pwd, cat, grep \u7B49\u5B89\u5168\u547D\u4EE4"}],l?"on":"off")==="on";u!==l?(this.runtimeHost.setSandboxMode(u),this.logInfo(u?"Sandbox enabled":"Sandbox disabled",u?"\u6C99\u7BB1\u6A21\u5F0F\u5DF2\u542F\u7528\uFF0C\u4EC5\u5141\u8BB8\u5B89\u5168\u547D\u4EE4":"\u5168\u529F\u80FD\u6A21\u5F0F\uFF0C\u6240\u6709\u547D\u4EE4\u53EF\u6267\u884C")):this.logInfo("Sandbox",`\u5F53\u524D\u72B6\u6001: ${u?"\u5DF2\u542F\u7528":"\u5DF2\u7981\u7528"}`);}catch(c){c.message!=="cancelled"&&this.logInfo("Sandbox selection failed",c.message);}break}case "/model":{let a=(i[0]||"").toLowerCase(),l=i.slice(1),c=this.getProviderCommandContext();switch(a){case "":await Jf(c);break;case "list":await jf(c,l[0]);break;case "add":await Gf(c,l[0]);break;case "remove":case "delete":await Wf(c,l[0]);break;case "default":await Hf(c,l[0]);break;case "use":await lu(c,l[0],l[1]);break;default:await lu(c,void 0,a);break}break}case "/clear":this.memory.clear(),this.logInfo("Conversation history cleared","\u5BF9\u8BDD\u5386\u53F2\u5DF2\u6E05\u7A7A");break;case "/config-clear":case "/config-reset":await Zf(this.getConfigCommandContext());break;case "/index":case "/index-build":case "/index-status":await tg(this.getIndexCommandContext(),i[0]);break;case "/context":await ng(this.getContextCommandContext(),i[0]);break;case "/stats":{let a=this.workDir.replace(process.env.HOME||"","~"),l=await this.runtimeHost.getSessionInfo().catch(()=>null),c=["",v.highlight(" Statistics:"),"",v.dim(" Directory: ")+v.info(a),v.dim(" Provider: ")+v.info(this.getProviderDisplayName()),v.dim(" Model: ")+v.info(this.model),v.dim(" Messages: ")+v.info(this.memory.length.toString()),v.dim(" Tools: ")+v.info(this.tools.length.toString()),v.dim(" Requests: ")+v.info(this.sessionRequests.toString())];if(l&&(c.push(v.dim(" Session: ")+v.info(l.sessionId)),c.push(v.dim(" Turns: ")+v.info(l.turnCount.toString()))),c.push(""),this.uiController)for(let u of c)this.uiController.printCommandOutput(u);else for(let u of c)b(u);break}case "/sessions":await ru(this.getCommandContext());break;case "/session":i[0]?await _f(this.getCommandContext(),i[0]):await ru(this.getCommandContext());break;case "/session-new":await Tf(this.getCommandContext(),this.model);break;case "/session-info":await wf(this.getCommandContext());break;case "/undo":await kf(this.getCommandContext(),i[0]);break;case "/checkpoint":await Cf(this.getCommandContext(),i.join(" "));break;case "/checkpoints":await Ef(this.getCommandContext());break;case "/rollback":await If(this.getCommandContext(),i[0]);break;case "/session-clear":await Rf(this.getCommandContext());break;case "/session-export":await Pf(this.getCommandContext(),i[0]);break;case "/compact":this.autoCompactionInProgress=await Af(this.getCommandContext(),oi);break;case "/processes":case "/ps":await Mf(i[0]);break;case "/kill":await Lf(i[0]);break;case "/trace":qf(this.getTracingCommandContext());break;case "/trace-history":await Kf(this.getTracingCommandContext());break;case "/trace-stats":await Vf(this.getTracingCommandContext());break;case "/trace-clean":await Yf(this.getTracingCommandContext());break;default:b(""),b(v.error(` [x] Unknown command: ${r}`)),b(v.dim(" Type /help for available commands"));}}async rebuildAgentAndRunner(){if(!this.providerSettings)throw new Error("No provider configured.");this.llmProvider=this.createProvider(),this.memory=new ds(500),this.tools=await go(this.workDir);let e={maxIterations:0,temperature:.7};if(this.runner=new Sr({llmProvider:this.llmProvider,model:this.model,tools:this.tools,memory:this.memory,config:e,agentName:"CLI Assistant",agentDescription:"\u547D\u4EE4\u884C\u52A9\u624B\uFF0C\u53EF\u4EE5\u641C\u7D22\u6587\u4EF6\u3001\u5206\u6790\u4EE3\u7801\u3001\u8BFB\u5199\u6587\u4EF6",instructions:this.buildSystemPrompt(),plannerMode:this.isPlannerModeEnabled(),providerName:this.providerSettings.name,contextWindow:this.compatProfile?.contextWindow,tailTokenBudget:this.compatProfile?.tailTokenBudget,maxInputTokensOverride:this.providerSettings.maxInputTokens,toolInputGuardrails:eu,toolOutputGuardrails:tu,compressionMode:this.userConfig.context?.compressionMode??"sync",workspacePath:this.workDir,permissionManager:this.permissionManager}),this.resetMemoryPressureMonitor(),this.runtimeHost.updateRuntime({runner:this.runner,memory:this.memory,model:this.model,systemPrompt:this.buildStaticSystemPrompt()}),this.sessionEnabled&&this.currentSession){this.sessionSync=new Is({session:this.currentSession,memory:this.memory,systemPrompt:this.buildStaticSystemPrompt()}),this.runtimeHost.setSession(this.currentSession,this.sessionSync);let t=await this.sessionSync.loadHistory();t>0&&f.info("MODEL",`Model switched, reloaded ${t} messages from session history`);}}logInfo(e,t){this.uiController?this.uiController.addInfo(e,t):(b(""),b(v.highlight(` ${e}`)),t&&b(v.dim(t)),b(""));}getCommandContext(){return {runtimeHost:this.runtimeHost,uiController:this.uiController,colors:v,sessionEnabled:this.sessionEnabled,sessionManager:this.sessionManager,sessionSync:this.sessionSync,currentSession:this.currentSession,compatProfile:this.compatProfile,autoCompactionInProgress:this.autoCompactionInProgress,isRunning:this.isTaskRunning,logInfo:(e,t)=>this.logInfo(e,t),activateSession:(e,t)=>this.activateSession(e,t),normalizeCheckpoints:vf,promptSelect:(e,t,n)=>this.promptSelect(e,t,n)}}getProviderCommandContext(){return {providerId:this.providerId,provider:this.provider,model:this.model,providerSettings:this.providerSettings,getProviders:()=>this.providerStore.getProviders(),getProvider:e=>this.providerStore.getProvider(e),getDefaultProvider:()=>this.providerStore.getDefaultProvider(),getProviderCount:()=>this.providerStore.getProviderCount(),resolveModel:e=>this.providerStore.resolveModel(e),addProvider:e=>this.providerStore.addProvider(e),updateProvider:(e,t)=>this.providerStore.updateProvider(e,t),deleteProvider:e=>this.providerStore.deleteProvider(e),renameProvider:(e,t)=>this.providerStore.renameProvider(e,t),setDefaultProvider:e=>this.providerStore.setDefaultProvider(e),setLastSelectedModel:(e,t)=>this.providerStore.setLastSelectedModel(e,t),addModel:(e,t,n)=>this.providerStore.addModel(e,t,n),removeModel:(e,t)=>this.providerStore.removeModel(e,t),promptText:(e,t)=>this.promptText(e,t),promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),promptYesNo:(e,t)=>this.promptYesNo(e,t),promptConfirmKeyword:(e,t)=>this.promptConfirmKeyword(e,t),selectProviderFromList:e=>this.selectProviderFromList(e),selectModelFromProvider:(e,t)=>this.selectModelFromProvider(e,t),selectModelFromCurrentProvider:e=>this.selectModelFromCurrentProvider(e),getProviderByIdentifier:e=>this.getProviderByIdentifier(e),applyProviderState:async e=>{this.providerId=e.providerId,this.provider=e.provider,this.model=e.model,this.providerSettings=e.providerSettings,this.refreshProviderSettings(),await this.rebuildAgentAndRunner();},refreshProviderSettings:()=>this.refreshProviderSettings(),getProviderDisplayName:()=>this.getProviderDisplayName(),logInfo:(e,t)=>this.logInfo(e,t),updateProviderDisplay:(e,t)=>{this.uiController&&this.uiController.updateProvider(e,t);},outputFn:this.uiController?e=>this.uiController.printCommandOutput(e):void 0}}getTracingCommandContext(){return {agentLogger:this.agentLogger,getTracingLogDir:()=>this.getTracingLogDir(),initializeAgentLogger:(e,t)=>this.initializeAgentLogger(e,t),disableTracing:e=>this.disableTracing(e),updateTracingPreference:e=>this.updateTracingPreference(e),promptSelect:(e,t,n)=>this.promptSelect(e,t,n),logInfo:(e,t)=>this.logInfo(e,t)}}getThinkingCommandContext(){return {model:this.model,providerSettings:this.providerSettings,thinkingMode:this.thinkingMode,llmProvider:this.llmProvider,setThinkingMode:e=>{this.thinkingMode=e;},promptSelect:(e,t,n)=>this.promptSelect(e,t,n),logInfo:(e,t)=>this.logInfo(e,t)}}getConfigCommandContext(){return {approvalMode:this.approvalMode,userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),logInfo:(e,t)=>this.logInfo(e,t),cleanup:()=>this.cleanup(),setApprovalMode:e=>{this.approvalMode=e,e==="auto"?(this.currentMode="auto",this.runner&&this.runner.setMode("auto")):e==="manual"&&(this.currentMode="agent",this.runner&&this.runner.setMode("agent"));},updateConfig:e=>{this.userConfig=e;}}}getIndexCommandContext(){return {userConfig:this.userConfig,workspacePath:this.workDir,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;}}}getContextCommandContext(){return {userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;},runner:this.runner}}async addPendingAttachment(e){let t=e.trim();if(!t){this.logInfo("\u9644\u4EF6\u65E0\u6548","\u8BF7\u8F93\u5165\u672C\u5730\u56FE\u7247\u8DEF\u5F84\u6216 https \u94FE\u63A5");return}if(/^https?:\/\//i.test(t)){try{let o=new URL(t);this.pendingAttachments.push({type:"url",data:t,name:o.hostname}),this.logInfo("\u5DF2\u6DFB\u52A0\u94FE\u63A5\u9644\u4EF6",t);}catch{this.logInfo("\u65E0\u6548\u7684 URL",t);}return}let n=te.isAbsolute(t)?t:te.resolve(process.cwd(),t);if(!an.existsSync(n)){this.logInfo("\u6587\u4EF6\u4E0D\u5B58\u5728",n);return}let r=te.extname(n).toLowerCase(),i=ea[r];if(!i){this.logInfo("\u4EC5\u652F\u6301\u56FE\u7247\u9644\u4EF6",`\u5141\u8BB8\u7684\u7C7B\u578B: ${Object.keys(ea).join(", ")}`);return}try{let o=await an.promises.readFile(n),a=`data:${i};base64,${o.toString("base64")}`;this.pendingAttachments.push({type:"image",data:a,name:te.basename(n)}),this.logInfo("\u5DF2\u6DFB\u52A0\u56FE\u7247\u9644\u4EF6",te.basename(n));}catch(o){this.logInfo("\u8BFB\u53D6\u9644\u4EF6\u5931\u8D25",o?.message||"\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6");}}listPendingAttachments(){if(this.pendingAttachments.length===0){this.logInfo("\u9644\u4EF6\u5217\u8868","\u6CA1\u6709\u5F85\u53D1\u9001\u7684\u9644\u4EF6\u3002");return}b(""),b(v.highlight(" Pending attachments:")),this.pendingAttachments.forEach((e,t)=>{let n=e.type==="url"?e.data:e.name||`Image ${t+1}`;b(v.dim(` ${t+1}. `)+v.info(n));}),b("");}clearPendingAttachments(){if(this.pendingAttachments.length===0){this.logInfo("\u9644\u4EF6\u5217\u8868","\u6CA1\u6709\u53EF\u6E05\u9664\u7684\u9644\u4EF6\u3002");return}this.pendingAttachments=[],this.logInfo("\u9644\u4EF6\u5DF2\u6E05\u9664","\u6240\u6709\u5F85\u53D1\u9001\u9644\u4EF6\u5DF2\u79FB\u9664\u3002");}removePendingAttachment(e){if(e<0||e>=this.pendingAttachments.length){this.logInfo("\u9644\u4EF6\u7D22\u5F15\u65E0\u6548",`\u5F53\u524D\u5171\u6709 ${this.pendingAttachments.length} \u4E2A\u9644\u4EF6\u3002`);return}let[t]=this.pendingAttachments.splice(e,1),n=t.type==="url"?t.data:t.name||`Attachment #${e+1}`;this.logInfo("\u5DF2\u79FB\u9664\u9644\u4EF6",n);}};function a0(){let s=[],e=process.env.ANTHROPIC_API_KEY||process.env.ANTHROPIC_AUTH_TOKEN;e&&e.trim()&&s.push({name:"Anthropic",protocol:"anthropic",apiKey:e.trim(),baseUrl:process.env.ANTHROPIC_BASE_URL?.trim(),models:["claude-sonnet-4-5-20250929","claude-3-5-sonnet-20241022"]});let t=process.env.OPENAI_API_KEY,n=process.env.OPENAI_BASE_URL?.trim();if(t&&t.trim()){let o=process.env.OPENAI_PROTOCOL==="responses"||process.env.OPENAI_PROTOCOL==="openai-responses"?"openai-responses":process.env.OPENAI_PROTOCOL==="anthropic"||process.env.OPENAI_PROTOCOL==="anthropic-openai"?"anthropic-openai":"openai",a=o==="openai-responses"?["gpt-5.1","o3-mini"]:["gpt-4o","gpt-4-turbo","gpt-3.5-turbo"];s.push({name:n?"OpenAI Proxy":"OpenAI",protocol:o,apiKey:t.trim(),baseUrl:n,models:a});}let r=process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY;r&&r.trim()&&s.push({name:"Gemini",protocol:"gemini",apiKey:r.trim(),baseUrl:process.env.GEMINI_BASE_URL?.trim(),models:["gemini-2.0-flash-exp","gemini-1.5-pro"]});let i=process.env.DOUBAO_API_KEY||process.env.VOLCENGINE_API_KEY;return i&&i.trim()&&s.push({name:"Doubao",protocol:"doubao",apiKey:i.trim(),baseUrl:process.env.DOUBAO_BASE_URL?.trim(),models:["doubao-pro-256k"]}),s}async function l0(){let s=Xt(),e=new Cs(s),t=e.getDefaultProvider();if(t&&t.apiKey&&t.apiKey.trim().length>0)return;let n=a0();if(n.length>0){console.log(),console.log(j.green("\u2713 Detected API credentials from environment variables:"));for(let g of n)console.log(j.cyan(` \u2022 ${g.name} (${g.protocol})`)),g.baseUrl&&console.log(j.dim(` Base URL: ${g.baseUrl}`));console.log();let{autoCreate:h}=await kn({type:"confirm",name:"autoCreate",message:"Auto-create provider(s) from environment variables?",initial:true},{onCancel:()=>{}});if(h){for(let g of n)e.addProvider({name:g.name,protocol:g.protocol,apiKey:g.apiKey,baseUrl:g.baseUrl,models:g.models,defaultModel:g.models[0],setAsDefault:n.length===1});console.log(),console.log(j.green(`\u2713 Created ${n.length} provider(s) successfully!`)),console.log(j.dim(` Config saved to: ${lt}`)),console.log();return}}if(!an.existsSync(lt)){let h={providers:{default:{id:"default",name:"My Provider",protocol:"openai",apiKey:"",baseUrl:"https://api.openai.com/v1",models:[{name:"gpt-4",createdAt:new Date().toISOString()}],defaultModel:"gpt-4",createdAt:new Date().toISOString(),updatedAt:new Date().toISOString()}},defaultProviderId:"default"};ct(h);}console.log(),console.log(j.yellow("[*] No LLM provider configured yet.")),console.log(),console.log(j.dim("Config file location:")),console.log(j.cyan(` ${lt}`)),console.log();let{setupMethod:i}=await kn({type:"select",name:"setupMethod",message:"How would you like to configure?",choices:[{title:"[>] Interactive setup (recommended)",value:"interactive"},{title:"[.] Edit config file manually",value:"manual"}],initial:0},{onCancel:()=>{console.log(),console.log(j.red("Setup cancelled. Exiting.")),process.exit(1);}});i==="manual"&&(console.log(),console.log(j.yellow("Please edit the config file and fill in your API key:")),console.log(j.cyan(` ${lt}`)),console.log(),console.log(j.dim("Then restart the CLI.")),console.log(),process.exit(0)),console.log(),console.log(j.dim("You can adjust providers later via /provider commands.")),console.log();let o=await kn([{type:"text",name:"name",message:"Provider display name",initial:"My Provider",validate:h=>h.trim().length>0||"Name is required"},{type:"select",name:"protocol",message:"Protocol format",choices:[{title:"OpenAI (Chat Completions) - GPT-4, GPT-3.5 \u7B49",value:"openai"},{title:"OpenAI (Responses API) - GPT-5, o3 \u7B49\u63A8\u7406\u6A21\u578B",value:"openai-responses"},{title:"Anthropic (Claude API)",value:"anthropic"},{title:"Anthropic (OpenAI \u683C\u5F0F)",value:"anthropic-openai"},{title:"\u8C46\u5305 (Doubao) - \u706B\u5C71\u65B9\u821F\u6DF1\u5EA6\u601D\u8003\u6A21\u578B",value:"doubao"}],initial:0},{type:"text",name:"baseUrl",message:"Base URL (leave empty for default)",initial:""},{type:"password",name:"apiKey",message:"API key / token",validate:h=>h.trim().length>0||"API key is required"},{type:"autocomplete",name:"model",message:"Default model name (choose from list or type custom)",choices:[{title:"gpt-5.1",value:"gpt-5.1"},{title:"claude-sonnet-4-5-20250929",value:"claude-sonnet-4-5-20250929"},{title:"claude-haiku-4-5-20251001",value:"claude-haiku-4-5-20251001"},{title:"gemini-3-pro-preview",value:"gemini-3-pro-preview"}],suggest:(h,g)=>{if(!h)return Promise.resolve(g);let y=g.filter(x=>x.title.toLowerCase().includes(h.toLowerCase())||x.value.toLowerCase().includes(h.toLowerCase()));return Promise.resolve(y.length>0?y:[{title:h,value:h}])},validate:h=>h.trim().length>0||"Model name is required"}],{onCancel:()=>{console.log(),console.log(j.red("Provider setup cancelled. Exiting.")),process.exit(1);}}),a=o.protocol,l=o.baseUrl?.trim()||As[a],c=(o.model||"").trim(),u=[c],d=c,p={providers:{}};new Cs(p).addProvider({name:o.name.trim(),protocol:a,apiKey:o.apiKey.trim(),baseUrl:l,defaultModel:d,models:u,setAsDefault:true}),console.log(),console.log(j.green(`\u2713 Provider "${o.name.trim()}" configured successfully!`)),console.log(j.dim(` Config saved to: ${lt}`)),console.log();}async function c0(){let s=Kc();f.info("CLI","Arguments parsed",{model:s.model,provider:s.provider,workDir:s.workDir}),s.help&&(Yh(Ps),process.exit(0)),s.version&&(Xh(Ps),process.exit(0));try{await l0();let e=new du(s.model,s.workDir,s.provider,s);await e.init(),f.info("CLI","CLI initialized successfully"),await e.runInteractive();}catch(e){throw f.error("CLI","Fatal error in main",{error:e.message,stack:e.stack}),e}}process.on("SIGINT",()=>{Ee.getBackgroundRunning().length>0&&Ee.killAll(true);});var lg=Date.now(),u0=1e3,d0=5e3,p0=6e4,m0=setInterval(()=>{let s=Date.now(),e=s-lg;lg=s,e>d0&&e<p0&&Promise.resolve().then(()=>(Or(),Lr)).then(({safeTTYWriter:t})=>{t.writeStderr(`
1889
1889
  \u26A0\uFE0F \u4E8B\u4EF6\u5FAA\u73AF\u963B\u585E ${Math.round(e/1e3)}s\uFF0C\u6309 Ctrl+C \u4E24\u6B21\u5F3A\u5236\u9000\u51FA
1890
1890
  `);});},u0);m0.unref();process.on("SIGTERM",()=>{Ee.killAll(true),process.stdin.isTTY&&process.stdin.setRawMode(false),process.exit(0);});try{process.on("SIGTSTP","ignore");}catch{}try{process.on("SIGTTIN","ignore");}catch{}try{process.on("SIGTTOU","ignore");}catch{}process.on("SIGCONT",()=>{if(process.stdin.isTTY&&!process.stdin.destroyed)try{process.stdin.isRaw!==!1&&process.stdin.setRawMode(!0),process.stdin.resume(),f.debug("SIGNAL","SIGCONT: stdin recovered after resume");}catch(s){f.warn("SIGNAL","SIGCONT: failed to recover stdin",{error:s});}});process.on("exit",()=>{process.stdin.isTTY&&process.stdin.setRawMode(false);});if(process.env.NEOX_WORKER==="execute_shell"){let{runExecuteShellWorker:s}=await Promise.resolve().then(()=>(og(),ig));await s(),process.exit(0);}c0().catch(s=>{process.stdin.isTTY&&process.stdin.setRawMode(false),console.error(j.red(`
1891
- [x] Unexpected error:`),s.message),process.exit(1);});export{nF as originalConsole};
1891
+ [x] Unexpected error:`),s.message),process.exit(1);});export{tF as originalConsole};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mk-co/neox-cli",
3
- "version": "2.0.7",
3
+ "version": "2.0.9",
4
4
  "description": "Professional AI code assistant CLI powered by Node.js",
5
5
  "type": "module",
6
6
  "main": "dist/cli/main.js",
@@ -20,7 +20,6 @@
20
20
  "build:legacy": "tsc && chmod +x dist/cli/main.js",
21
21
  "dev": "tsx src/cli/main.ts",
22
22
  "electron:rebuild": "electron-rebuild -f -w node-pty",
23
- "postinstall": "node scripts/postinstall.js",
24
23
  "ui:build-electron": "tsc --project tsconfig.electron.json && node scripts/build-electron.js && cp src/ui/electron/preload.js dist/ui-electron/electron/",
25
24
  "ui:dev": "npm run ui:build-electron && concurrently -k -s first \"cross-env NODE_ENV=development VITE_DEV_SERVER_URL=http://127.0.0.1:5180 vite --config vite.config.ui.ts\" \"wait-on tcp:127.0.0.1:5180 && cross-env NODE_ENV=development VITE_DEV_SERVER_URL=http://127.0.0.1:5180 electron ./dist/ui-electron/electron/main.js\"",
26
25
  "ui:build": "npm run ui:build-electron && cross-env NODE_ENV=production vite build --config vite.config.ui.ts",
@@ -50,6 +49,7 @@
50
49
  "ajv": "^8.17.1",
51
50
  "axios": "^1.6.7",
52
51
  "chalk": "^4.1.2",
52
+ "chokidar": "^4.0.3",
53
53
  "duck-duck-scrape": "^2.2.7",
54
54
  "execa": "^8.0.1",
55
55
  "fast-glob": "^3.3.2",
@@ -83,20 +83,6 @@
83
83
  "typescript": "^5.3.3",
84
84
  "wait-on": "^8.0.2"
85
85
  },
86
- "optionalDependencies": {
87
- "@monaco-editor/react": "^4.7.0",
88
- "@xterm/addon-fit": "^0.10.0",
89
- "@xterm/addon-web-links": "^0.11.0",
90
- "@xterm/xterm": "^5.5.0",
91
- "chokidar": "^5.0.0",
92
- "monaco-editor": "^0.55.1",
93
- "node-pty": "^1.0.0",
94
- "react-dom": "^19.0.0",
95
- "react-markdown": "^10.1.0",
96
- "rehype-highlight": "^7.0.2",
97
- "remark-gfm": "^4.0.1",
98
- "xterm": "^5.3.0"
99
- },
100
86
  "engines": {
101
87
  "node": ">=20.0.0"
102
88
  }