nex-code 0.4.25 → 0.4.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/nex-code.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- var Q=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var As=Q((fT,S$)=>{S$.exports={name:"nex-code",version:"0.4.25",description:"Run 400B+ open coding models on your codebase without the hardware bill. Ollama Cloud first \u2014 OpenAI, Anthropic, and Gemini when you need them.",bin:{"nex-code":"./dist/nex-code.js"},files:["dist/","examples/","README.md","LICENSE"],engines:{node:">=18.0.0"},scripts:{start:"node dist/nex-code.js",build:"esbuild bin/nex-code.js --bundle --platform=node --target=node18 --outfile=dist/nex-code.js --minify --external:axios --external:dotenv --external:playwright && cp -r cli/skills dist/skills",dev:"esbuild bin/nex-code.js --bundle --platform=node --target=node18 --outfile=dist/nex-code.js --external:axios --external:dotenv --external:playwright --watch",test:"jest --forceExit","test:orchestrator":"jest tests/orchestrator.test.js --forceExit",coverage:"jest --coverage --forceExit","test:watch":"jest --watch",typecheck:"tsc --noEmit",format:"prettier --write .","install-hooks":"ln -sf ../../hooks/pre-push .git/hooks/pre-push && chmod +x .git/hooks/pre-push && ln -sf ../../hooks/post-merge .git/hooks/post-merge && chmod +x .git/hooks/post-merge && echo 'Hooks installed (pre-push, post-merge).'",prepublishOnly:"npm run build && npm test","merge-to-main":"bash scripts/merge-to-main.sh",improve:"node scripts/improve.js","extract-examples":"node scripts/extract-examples.js","benchmark:realworld":"node scripts/benchmark-realworld.js",release:"npm version patch && git push --follow-tags && npm publish"},keywords:["ai","cli","coding","agent","ollama","ollama-cloud","openai","anthropic","claude","gemini","llm","gpt","agentic","terminal","coding-assistant","claude-code-alternative","gemini-cli-alternative","open-source","free","qwen3","devstral","kimi-k2","deepseek","local-llm","mcp","model-context-protocol","multi-provider"],repository:{type:"git",url:"https://github.com/hybridpicker/nex-code.git"},bugs:{url:"https://github.com/hybridpicker/nex-code/issues"},homepage:"https://github.com/hybridpicker/nex-code#readme",license:"MIT",dependencies:{axios:"^1.7.0",dotenv:"^16.4.0"},devDependencies:{esbuild:"^0.27.3",jest:"^29.7.0",prettier:"^3.8.1",typescript:"^5.9.3"},overrides:{"brace-expansion":">=5.0.5",picomatch:">=4.0.4"},jest:{coverageThreshold:{global:{lines:45,functions:30,branches:35},"./cli/sub-agent.js":{lines:70,functions:60,branches:55}}}}});var Yn=Q((pT,Ou)=>{"use strict";var Su="\x1B[0m",Eu="\x1B[1m",Os="\x1B[2m";function Z(t,e,n){return`\x1B[38;2;${t};${e};${n}m`}function E$(){if(!process.stdout.isTTY)return null;try{let{execFileSync:t}=require("child_process"),e=["import sys,os,tty,termios,select","f=open('/dev/tty','r+b',buffering=0)","fd=f.fileno()","s=termios.tcgetattr(fd)","try:"," tty.setraw(fd)"," f.write(bytes([0x1b,0x5d,0x31,0x31,0x3b,0x3f,0x1b,0x5c]))"," r=select.select([fd],[],[],0.1)[0]"," d=b''"," if r:"," while True:"," r2=select.select([fd],[],[],0.05)[0]"," if not r2:break"," c=os.read(fd,1)"," d+=c"," if d[-1:]==bytes([0x07]) or d[-2:]==bytes([0x1b,0x5c]):break"," sys.stdout.buffer.write(d)","finally:"," termios.tcsetattr(fd,termios.TCSADRAIN,s)"," f.close()"].join(`
2
+ var Q=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var As=Q((fT,S$)=>{S$.exports={name:"nex-code",version:"0.4.27",description:"Run 400B+ open coding models on your codebase without the hardware bill. Ollama Cloud first \u2014 OpenAI, Anthropic, and Gemini when you need them.",bin:{"nex-code":"./dist/nex-code.js"},files:["dist/","examples/","README.md","LICENSE"],engines:{node:">=18.0.0"},scripts:{start:"node dist/nex-code.js",build:"esbuild bin/nex-code.js --bundle --platform=node --target=node18 --outfile=dist/nex-code.js --minify --external:axios --external:dotenv --external:playwright && rm -rf dist/skills && cp -r cli/skills dist/skills",dev:"esbuild bin/nex-code.js --bundle --platform=node --target=node18 --outfile=dist/nex-code.js --external:axios --external:dotenv --external:playwright --watch",test:"jest --forceExit","test:orchestrator":"jest tests/orchestrator.test.js --forceExit",coverage:"jest --coverage --forceExit","test:watch":"jest --watch",typecheck:"tsc --noEmit",format:"prettier --write .","install-hooks":"ln -sf ../../hooks/pre-push .git/hooks/pre-push && chmod +x .git/hooks/pre-push && ln -sf ../../hooks/post-merge .git/hooks/post-merge && chmod +x .git/hooks/post-merge && echo 'Hooks installed (pre-push, post-merge).'",prepublishOnly:"npm run build && npm test","merge-to-main":"bash scripts/merge-to-main.sh",improve:"node scripts/improve.js","extract-examples":"node scripts/extract-examples.js","benchmark:realworld":"node scripts/benchmark-realworld.js",release:"npm version patch && git push --follow-tags && npm publish"},keywords:["ai","cli","coding","agent","ollama","ollama-cloud","openai","anthropic","claude","gemini","llm","gpt","agentic","terminal","coding-assistant","claude-code-alternative","gemini-cli-alternative","open-source","free","qwen3","devstral","kimi-k2","deepseek","local-llm","mcp","model-context-protocol","multi-provider"],repository:{type:"git",url:"https://github.com/hybridpicker/nex-code.git"},bugs:{url:"https://github.com/hybridpicker/nex-code/issues"},homepage:"https://github.com/hybridpicker/nex-code#readme",license:"MIT",dependencies:{axios:"^1.7.0",dotenv:"^16.4.0"},devDependencies:{esbuild:"^0.27.3",jest:"^29.7.0",prettier:"^3.8.1",typescript:"^5.9.3"},overrides:{"brace-expansion":">=5.0.5",picomatch:">=4.0.4"},jest:{coverageThreshold:{global:{lines:45,functions:30,branches:35},"./cli/sub-agent.js":{lines:70,functions:60,branches:55}}}}});var Yn=Q((pT,Ou)=>{"use strict";var Su="\x1B[0m",Eu="\x1B[1m",Os="\x1B[2m";function Z(t,e,n){return`\x1B[38;2;${t};${e};${n}m`}function E$(){if(!process.stdout.isTTY)return null;try{let{execFileSync:t}=require("child_process"),e=["import sys,os,tty,termios,select","f=open('/dev/tty','r+b',buffering=0)","fd=f.fileno()","s=termios.tcgetattr(fd)","try:"," tty.setraw(fd)"," f.write(bytes([0x1b,0x5d,0x31,0x31,0x3b,0x3f,0x1b,0x5c]))"," r=select.select([fd],[],[],0.1)[0]"," d=b''"," if r:"," while True:"," r2=select.select([fd],[],[],0.05)[0]"," if not r2:break"," c=os.read(fd,1)"," d+=c"," if d[-1:]==bytes([0x07]) or d[-2:]==bytes([0x1b,0x5c]):break"," sys.stdout.buffer.write(d)","finally:"," termios.tcsetattr(fd,termios.TCSADRAIN,s)"," f.close()"].join(`
3
3
  `),s=t("python3",["-c",e],{encoding:"buffer",timeout:400,stdio:["ignore","pipe","ignore"]}).toString("utf8").match(/rgb:([0-9a-fA-F]+)\/([0-9a-fA-F]+)\/([0-9a-fA-F]+)/);if(s){let r=parseInt(s[1].slice(0,2),16),i=parseInt(s[2].slice(0,2),16),c=parseInt(s[3].slice(0,2),16);return .299*r+.587*i+.114*c<128}}catch{}return null}function Tu(){let t=require("os");return require("path").join(t.homedir(),".nex-code",".theme_cache.json")}function T$(t){try{let n=require("fs").readFileSync(Tu(),"utf8"),o=JSON.parse(n);if(o&&typeof o[t]=="boolean")return o[t]}catch{}return null}function R$(t,e){try{let n=require("fs"),o=require("path"),s=Tu(),r=o.dirname(s),i={};try{i=JSON.parse(n.readFileSync(s,"utf8"))}catch{}i[t]=e;let c=Object.keys(i);c.length>50&&c.slice(0,c.length-50).forEach(l=>delete i[l]),n.existsSync(r)||n.mkdirSync(r,{recursive:!0}),n.writeFileSync(s,JSON.stringify(i),"utf8")}catch{}}function C$(){let t=(process.env.NEX_THEME||"").toLowerCase();if(t==="light")return!1;if(t==="dark")return!0;let e=process.env.COLORFGBG;if(e){let i=e.split(";"),c=parseInt(i[i.length-1],10);if(!isNaN(c))return c<8}let n=process.env.TERM_SESSION_ID||"default",o=T$(n);if(o!==null)return o;let s=E$(),r=s!==null?s:!0;return R$(n,r),r}var Ru=C$(),Cu={reset:Su,bold:Eu,dim:Os,primary:Z(80,190,255),secondary:Z(60,170,190),success:Z(80,210,120),warning:Z(245,175,50),error:Z(230,80,80),muted:Os,subtle:Z(130,130,145),tool_read:Z(80,190,255),tool_write:Z(245,165,55),tool_exec:Z(185,100,235),tool_search:Z(70,185,190),tool_git:Z(90,210,100),tool_web:Z(100,215,250),tool_sysadmin:Z(225,150,75),tool_default:Z(100,205,115),syn_keyword:Z(185,100,235),syn_string:Z(90,210,120),syn_number:Z(245,175,50),syn_comment:Os,syn_key:Z(80,190,255),diff_add:Z(80,210,120),diff_rem:Z(230,80,80),banner_logo:Z(80,200,255),banner_name:Z(80,200,255),banner_version:Os,banner_model:Os,banner_yolo:Z(245,175,50),footer_sep:Os,footer_model:Z(80,175,235),footer_branch:Z(80,210,100),footer_project:Z(130,130,145),footer_divider:Z(80,80,95),footer_mode:Z(210,150,50),white:"\x1B[37m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",gray:"\x1B[90m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",diff_add_bg:"\x1B[48;2;10;46;20m",diff_rem_bg:"\x1B[48;2;58;16;16m",brightCyan:"\x1B[96m",brightMagenta:"\x1B[95m",brightBlue:"\x1B[94m"},Au={reset:Su,bold:Eu,dim:Z(110,110,120),primary:Z(0,110,190),secondary:Z(0,125,148),success:Z(0,148,62),warning:Z(168,92,0),error:Z(188,32,32),muted:Z(110,110,120),subtle:Z(155,155,165),tool_read:Z(0,110,190),tool_write:Z(168,92,0),tool_exec:Z(128,42,188),tool_search:Z(0,122,148),tool_git:Z(0,138,62),tool_web:Z(0,112,178),tool_sysadmin:Z(168,82,0),tool_default:Z(0,138,62),syn_keyword:Z(128,42,188),syn_string:Z(0,138,62),syn_number:Z(168,92,0),syn_comment:Z(135,135,148),syn_key:Z(0,110,190),diff_add:Z(0,148,62),diff_rem:Z(188,32,32),banner_logo:Z(0,122,205),banner_name:Z(0,122,205),banner_version:Z(100,100,118),banner_model:Z(100,100,118),banner_yolo:Z(168,62,0),footer_sep:Z(168,168,178),footer_model:Z(0,102,175),footer_branch:Z(0,138,62),footer_project:Z(135,135,148),footer_divider:Z(168,168,178),footer_mode:Z(148,88,0),white:Z(40,40,52),red:Z(188,32,32),green:Z(0,148,62),yellow:Z(168,92,0),blue:Z(0,110,190),magenta:Z(128,42,188),cyan:Z(0,125,148),gray:Z(132,132,142),bgRed:"\x1B[41m",bgGreen:"\x1B[42m",diff_add_bg:"\x1B[48;2;215;245;220m",diff_rem_bg:"\x1B[48;2;255;215;215m",brightCyan:Z(0,158,182),brightMagenta:Z(158,52,208),brightBlue:Z(0,112,208)},A$=Ru?Cu:Au;Ou.exports={T:A$,isDark:Ru,DARK:Cu,LIGHT:Au}});var Ms=Q((mT,Mu)=>{var{T:ne}=Yn(),Pr=5,Ns=(()=>{let t=[];for(let e=0;e<Pr;e++)t.push(e);for(let e=Pr-2;e>=1;e--)t.push(e);return t})(),Nu=["\u273D","\u2726","\u2727","\u2726"],Ra=class{constructor(e="Thinking..."){this.text=e,this.frame=0,this.interval=null,this.startTime=null}_render(){if(this._stopped)return;let e=Ns[this.frame%Ns.length],n="";for(let s=0;s<Pr;s++)n+=s===e?`${ne.cyan}\u25CF${ne.reset}`:" ";let o="";if(this.startTime){let s=Math.floor((Date.now()-this.startTime)/1e3);if(s>=60){let r=Math.floor(s/60),i=s%60;o=` ${ne.dim}${r}m ${String(i).padStart(2,"0")}s${ne.reset}`}else s>=1&&(o=` ${ne.dim}${s}s${ne.reset}`)}process.stderr.write(`\x1B[2K\r${n} ${ne.dim}${this.text}${ne.reset}${o}`),this.frame++}start(){this._stopped=!1,this.startTime=Date.now(),process.stderr.isTTY&&(process.stderr.write("\x1B[?25l"),this._render(),this.interval=setInterval(()=>this._render(),100))}update(e){this.text=e}stop(){this._stopped=!0,this.interval&&(clearInterval(this.interval),this.interval=null),process.stderr.isTTY&&process.stderr.write("\x1B[2K\r\x1B[?25h"),this.startTime=null}},Ca=class{constructor(e){this.labels=e,this.statuses=e.map(()=>"running"),this.frame=0,this.interval=null,this.startTime=null,this.lineCount=e.length}_formatElapsed(){if(!this.startTime)return"";let e=Math.floor((Date.now()-this.startTime)/1e3);if(e<1)return"";let n=Math.floor(e/60),o=e%60;return n>0?`${n}m ${String(o).padStart(2,"0")}s`:`${o}s`}_render(){if(this._stopped)return;let e=Ns[this.frame%Ns.length],n=`${ne.cyan}\u25CF${ne.reset}`,o=this._formatElapsed(),s=o?` ${ne.dim}${o}${ne.reset}`:"",r=process.stderr.columns||80,i="";for(let c=0;c<this.labels.length;c++){let l,u;switch(this.statuses[c]){case"done":l=`${ne.green}\u2713${ne.reset}`,u=ne.dim;break;case"error":l=`${ne.red}\u2717${ne.reset}`,u=ne.dim;break;case"retry":l=`${ne.yellow}\u21BB${ne.reset}`,u=ne.yellow;break;default:l=c===e?n:" ",u=""}let d=c===this.labels.length-1?s:"",f=r-4-(d?o.length+1:0),p=this.labels[c].length>f?this.labels[c].substring(0,Math.max(10,f-3))+"...":this.labels[c];i+=`\x1B[2K ${l} ${u}${p}${ne.reset}${d}
4
4
  `}this.lineCount>0&&(i+=`\x1B[${this.lineCount}A`),process.stderr.write(i),this.frame++}start(){this._stopped=!1,this.startTime=Date.now();let e="\x1B[?25l";for(let n=0;n<this.lineCount;n++)e+=`
5
5
  `;this.lineCount>0&&(e+=`\x1B[${this.lineCount}A`),process.stderr.write(e),this._render(),this.interval=setInterval(()=>this._render(),100)}update(e,n){e>=0&&e<this.statuses.length&&(this.statuses[e]=n)}stop(e={}){if(this._stopped=!0,this.interval&&(clearInterval(this.interval),this.interval=null),!e.silent)this._renderFinal();else{let n="";for(let o=0;o<this.lineCount;o++)n+=`\x1B[2K
@@ -51,8 +51,8 @@ ${g}
51
51
  ${P.success}\u25C6${dt.reset} ${dt.bold}${t}${dt.reset}`;return l+=`${dt.dim} \xB7 ${c}`,r.size>0&&(l+=` \xB7 ${r.size} file${r.size!==1?"s":""} modified`),l+=dt.reset,l}Du.exports={C:dt,formatToolCall:B$,formatResult:W$,getToolSpinnerText:H$,formatToolSummary:K$,formatSectionHeader:U$,formatMilestone:G$}});var Fe=Q(($T,Uu)=>{var{T:zn}=Yn(),Pa=zn,Fu=["01100110","01111110","01111110","01011010","01111110","00111100"];function Y$(t,e){let n=[];for(let o=0;o<t.length;o+=2){let s="";for(let r=0;r<t[0].length;r++){let i=t[o][r]==="1",c=o+1<t.length&&t[o+1][r]==="1";i&&c?s+=`${e}\u2588\x1B[0m`:i&&!c?s+=`${e}\u2580\x1B[0m`:!i&&c?s+=`${e}\u2584\x1B[0m`:s+=" "}n.push(s)}return n}function z$(t,e,n={}){let o=Pa.bold,s=Pa.reset,r=Y$(Fu,zn.banner_logo),i=n.yolo?` ${o}${zn.banner_yolo}\u26A1 YOLO${s}`:"",c=As().version,l=[` ${zn.banner_name}${o}nex-code${s} ${zn.banner_version}v${c}${s}`,` ${zn.banner_model}${t}${s} ${zn.muted}\xB7 /help${s}${i}`,""],u=Math.max(r.length,l.length),d=Math.floor((u-r.length)/2),f=Math.floor((u-l.length)/2),p=Fu[0].length,h=[];for(let m=0;m<u;m++){let g=r[m-d]??" ".repeat(p),y=l[m-f]??"";h.push(g+y)}console.log(`
52
52
  `+h.join(`
53
53
  `)+`
54
- `)}var{Spinner:X$,MultiProgress:J$,TaskProgress:V$,ToolProgress:Z$,setActiveTaskProgress:Q$,getActiveTaskProgress:ey,cleanupTerminal:ty}=Ms(),{formatToolCall:ny,formatResult:sy,getToolSpinnerText:oy,formatToolSummary:ry,formatSectionHeader:iy,formatMilestone:ay}=qu();Uu.exports={C:Pa,banner:z$,Spinner:X$,MultiProgress:J$,TaskProgress:V$,ToolProgress:Z$,setActiveTaskProgress:Q$,getActiveTaskProgress:ey,cleanupTerminal:ty,formatToolCall:ny,formatResult:sy,getToolSpinnerText:oy,formatToolSummary:ry,formatSectionHeader:iy,formatMilestone:ay}});var ft=Q((yT,Yu)=>{var cy=require("readline"),{C:rn}=Fe(),ja=[/rm\s+-rf\s+\/(?:\s|$)/,/rm\s+-rf\s+~(?:\/|\s|$)/,/rm\s+-rf\s+\.(?:\/|\s|$)/,/rm\s+-rf\s+\*(?:\s|$)/,/mkfs/,/dd\s+if=/,/:\(\)\s*\{/,/>\/dev\/sd/,/curl.*\|\s*(?:ba)?sh/,/wget.*\|\s*(?:ba)?sh/,/cat\s+.*\.env\b/,/cat\s+.*credentials/i,/chmod\s+777/,/chown\s+root/,/passwd/,/userdel/,/useradd/,/\beval\s*\(/,/base64.*\|.*bash/,/\bprintenv\b/,/cat\s+.*\.ssh\/id_/,/cat\s+.*\.ssh\/config/,/\bnc\s+-[el]/,/\bncat\b/,/\bsocat\b/,/python3?\s+-c\s/,/node\s+-e\s/,/perl\s+-e\s/,/ruby\s+-e\s/,/(?:^|[;&|]\s*)history(?:\s|$)/,/curl.*-X\s*POST/,/curl.*--data/,/\bsed\s+-n\s+['"]?\d+,\d+p/],Bu=[...ja,/\bgrep\b.*\.env\b/,/\bawk\b.*\.env\b/,/\bsed\b.*\.env\b/,/\bhead\b.*\.env\b/,/\btail\b.*\.env\b/,/\bless\b.*\.env\b/,/\bmore\b.*\.env\b/,/\bstrings\b.*\.env\b/,/\bgrep\b.*credentials/i,/\bawk\b.*credentials/i,/\bsed\b.*credentials/i,/\bhead\b.*credentials/i,/\btail\b.*credentials/i,/\bcat\b.*private.*key/i,/\bgrep\b.*private_key/i,/\bcat\b.*google.*\.json/i,/\bcat\b.*service.?account/i];function ly(t){for(let e of Bu)if(e.test(t))return e;return null}var Wu=[/\.env\b/,/credentials\b/i,/\.ssh\b/,/\.gnupg\b/,/\.aws\b/,/\.npmrc\b/,/\.docker\/config/,/\.kube\/config/,/venv\b/,/\.venv\b/,/\.sqlite3\b/,/\.git\/(?!hooks)/],uy=/\b(?:rm|rmdir|unlink|truncate|shred|mv|cp)\b/,La=[/systemctl\s+(status|is-active|is-enabled|list-units|show)/,/journalctl\b/,/\btail\s/,/\bcat\s/,/\bhead\s/,/\bls\b/,/\bfind\s/,/\bgrep\s/,/\bwc\s/,/\bdf\b/,/\bfree\b/,/\buptime\b/,/\bwho\b/,/\bps\s/,/\bgit\s+(status|log|diff|branch|fetch)\b/,/\bgit\s+pull\b/,/\bss\s+-[tlnp]/,/\bnetstat\s/,/\bdu\s/,/\blscpu\b/,/\bnproc\b/,/\buname\b/,/\bhostname\b/,/\bgetent\b/,/\bid\b/,/psql\s.*-c\s/,/\bmysql\s.*-e\s/,/\bdnf\s+(check-update|list|info|history|repolist|updateinfo)\b/,/\brpm\s+-q/,/\bapt\s+list\b/,/\bopenssl\s+s_client\b/,/\bopenssl\s+x509\b/,/\bcertbot\s+certificates\b/,/\bcurl\s+-[sIkv]|curl\s+--head/,/\bdig\s/,/\bnslookup\s/,/\bping\s/,/\bgetenforce\b/,/\bsesearch\b/,/\bausearch\b/,/\bsealert\b/,/\bcrontab\s+-l\b/,/\btimedatectl\b/,/\bfirewall-cmd\s+--list/,/\bfirewall-cmd\s+--state/];function Hu(t){let e=t.match(/ssh\s+[^"]*"([^"]+)"/)?.[1]||t.match(/ssh\s+[^']*'([^']+)'/)?.[1];if(!e)return!1;let o=e.replace(/\bfor\s[\s\S]*?\bdone\b/g,r=>r.replace(/;/g,"\0")).replace(/\bwhile\s[\s\S]*?\bdone\b/g,r=>r.replace(/;/g,"\0")).split(/\s*(?:&&|;)\s*/).map(r=>r.replace(/\x00/g,";").trim()).filter(Boolean);if(o.length===0)return!1;let s=r=>{let i=r.replace(/^sudo\s+(?:-[ugCD]\s+\S+\s+|-[A-Za-z]+\s+)*/,"");if(/^\s*(?:echo|printf)\s/.test(i))return!0;if(/^\s*for\s/.test(r)||/^\s*while\s/.test(r)){let c=r.match(/\bdo\s+([\s\S]*?)\s*(?:done|$)/)?.[1];return c?c.split(/\s*;\s*/).map(u=>u.trim()).filter(Boolean).every(u=>s(u)):La.some(l=>l.test(r))}return/^\w+=\$?\(/.test(i)||/^\w+=["']/.test(i)||/^\w+=\S/.test(i)?!0:La.some(c=>c.test(i))};return o.every(s)}var Da=[/rm\s+-rf\s/,/docker\s+system\s+prune/,/kubectl\s+delete/,/sudo\s/,/--no-verify\b/,/git\s+reset\s+--hard\b/,/git\s+clean\s+-[a-z]*f/,/git\s+checkout\s+--\s/,/git\s+push\s+(?:--force\b|-f\b)/],Ku=[/git\s+push/,/npm\s+publish/,/\bHUSKY=0\b/,/\bSKIP_HUSKY=1\b/,/\bSKIP_PREFLIGHT_CHECK=true\b/,/npx\s+.*publish/,/docker\s+rm/,/ssh\s/,/wget\s/,/curl\s.*-o\s/,/pip\s+install/,/npm\s+install\s+-g/],Gu=[...Da,...Ku],qa=!1,Xn=null,Ia=null;function dy(t){qa=t}function fy(t){Ia=t}function py(){return qa}function my(t){Xn=t}function hy(t){for(let e of ja)if(e.test(t))return e;return null}function gy(t){if(/ssh\s/.test(t)&&Hu(t))return!1;for(let e of Gu)if(e.test(t))return!0;return!1}function $y(t){for(let e of Da)if(e.test(t))return!0;return!1}function yy(t){if(process.env.NEX_UNPROTECT==="1"||!uy.test(t))return null;for(let e of Wu)if(e.test(t))return e;return null}function wy(t,e={}){if(qa)return Promise.resolve(!0);if(Ia)return Ia(t,e);if(!process.stdout.isTTY||!process.stdin.isTTY)return by(t,e);let n=e.toolName?["Yes","No","Always allow"]:["Yes","No"];return new Promise(o=>{let s=0;Xn&&Xn.pause();let r=global._nexRawWrite||(f=>process.stdout.write(f)),i=()=>{let f=process.stdout.rows||24;return Math.max(1,f-n.length-2)},c=()=>{let f=i(),p=`\x1B[${f};1H\x1B[2K${rn.yellow}${t}${rn.reset}`;for(let h=0;h<n.length;h++){let m=h===s,g=m?`${rn.yellow}\u276F${rn.reset}`:" ",y=m?`${rn.yellow}${n[h]}${rn.reset}`:n[h];p+=`\x1B[${f+1+h};1H\x1B[2K ${g} ${y}`}r(p)},l=f=>{process.stdin.setRawMode(!1),process.stdin.pause(),process.stdin.removeListener("data",d);let p=global._nexRawWrite||(g=>process.stdout.write(g)),h=i(),m="";for(let g=0;g<n.length+1;g++)m+=`\x1B[${h+g};1H\x1B[2K`;p(m),global._nexFooter&&global._nexFooter.drawFooter(),Xn&&Xn.resume(),o(f)},u=f=>{if(f===1){l(!1);return}f===2&&e.toolName&&Ir(e.toolName),l(!0)},d=f=>{if(f[0]===3){l(!1);return}let p=f.toString();if(p==="\r"||p===`
55
- `){u(s);return}if(p==="\x1B[A"){s=(s-1+n.length)%n.length,c();return}if(p==="\x1B[B"){s=(s+1)%n.length,c();return}let h=p.toLowerCase().trim();if(h==="y"){l(!0);return}if(h==="n"){l(!1);return}if(h==="a"&&e.toolName){Ir(e.toolName),l(!0);return}};c(),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.on("data",d)})}function by(t,e){let n=e.toolName?"[Y/n/a] ":"[Y/n] ";return new Promise(o=>{let s=r=>{let i=r.trim().toLowerCase();i==="a"&&e.toolName?(Ir(e.toolName),o(!0)):o(i!=="n")};if(Xn)Xn.question(`${rn.yellow}${t} ${n}${rn.reset}`,s);else{let r=cy.createInterface({input:process.stdin,output:process.stdout});r.question(`${rn.yellow}${t} ${n}${rn.reset}`,i=>{r.close(),s(i)})}})}var Ir=()=>{};function _y(t){Ir=t}Yu.exports={FORBIDDEN_PATTERNS:ja,SSH_FORBIDDEN_PATTERNS:Bu,BASH_PROTECTED_PATHS:Wu,SSH_SAFE_PATTERNS:La,isSSHReadOnly:Hu,DANGEROUS_BASH:Gu,CRITICAL_BASH:Da,NOTABLE_BASH:Ku,isForbidden:hy,isSSHForbidden:ly,isDangerous:gy,isCritical:$y,isBashPathForbidden:yy,confirm:wy,setAutoConfirm:dy,getAutoConfirm:py,setConfirmHook:fy,setReadlineInterface:my,setAllowAlwaysHandler:_y}});var Ps=Q((wT,zu)=>{async function xy(t,e){if(!t.response?.data)return t.message;let n=t.response.data;if(typeof n=="object"&&n!==null&&typeof n.pipe!="function")return e(n)||t.message;try{let o=await new Promise((r,i)=>{let c=[];n.on("data",l=>c.push(l)),n.on("end",()=>r(Buffer.concat(c).toString("utf8"))),n.on("error",i)}),s=JSON.parse(o);return e(s)||o||t.message}catch{return t.message}}var Fa=class t{constructor(e={}){if(new.target===t)throw new Error("BaseProvider is abstract \u2014 use a concrete provider");this.name=e.name||"unknown",this.baseUrl=e.baseUrl||"",this.models=e.models||{},this.defaultModel=e.defaultModel||null}isConfigured(){throw new Error(`${this.name}: isConfigured() not implemented`)}getApiKey(){return null}getModels(){return this.models}getModelNames(){return Object.keys(this.models)}getModel(e){return this.models[e]||null}async chat(e,n,o={}){throw new Error(`${this.name}: chat() not implemented`)}async stream(e,n,o={}){throw new Error(`${this.name}: stream() not implemented`)}formatMessages(e){return{messages:e}}formatTools(e){return e}normalizeResponse(e){throw new Error(`${this.name}: normalizeResponse() not implemented`)}};zu.exports={BaseProvider:Fa,readStreamErrorBody:xy}});var js=Q((bT,Xu)=>{var Ls=class{buildRequestBody(e){throw new Error("buildRequestBody() not implemented")}getEndpoint(){throw new Error("getEndpoint() not implemented")}formatTools(e){return e}normalizeResponse(e){throw new Error("normalizeResponse() not implemented")}createStreamParser(e,n={}){throw new Error("createStreamParser() not implemented")}},Is=class{constructor(e,n={}){this.onToken=e,this.callbacks=n,this.content="",this.buffer=""}feed(e){this.buffer+=e;let n=this.buffer.split(`
54
+ `)}var{Spinner:X$,MultiProgress:J$,TaskProgress:V$,ToolProgress:Z$,setActiveTaskProgress:Q$,getActiveTaskProgress:ey,cleanupTerminal:ty}=Ms(),{formatToolCall:ny,formatResult:sy,getToolSpinnerText:oy,formatToolSummary:ry,formatSectionHeader:iy,formatMilestone:ay}=qu();Uu.exports={C:Pa,banner:z$,Spinner:X$,MultiProgress:J$,TaskProgress:V$,ToolProgress:Z$,setActiveTaskProgress:Q$,getActiveTaskProgress:ey,cleanupTerminal:ty,formatToolCall:ny,formatResult:sy,getToolSpinnerText:oy,formatToolSummary:ry,formatSectionHeader:iy,formatMilestone:ay}});var ft=Q((yT,Yu)=>{var cy=require("readline"),{C:an}=Fe(),ja=[/rm\s+-rf\s+\/(?:\s|$)/,/rm\s+-rf\s+~(?:\/|\s|$)/,/rm\s+-rf\s+\.(?:\/|\s|$)/,/rm\s+-rf\s+\*(?:\s|$)/,/mkfs/,/dd\s+if=/,/:\(\)\s*\{/,/>\/dev\/sd/,/curl.*\|\s*(?:ba)?sh/,/wget.*\|\s*(?:ba)?sh/,/cat\s+.*\.env\b/,/cat\s+.*credentials/i,/chmod\s+777/,/chown\s+root/,/passwd/,/userdel/,/useradd/,/\beval\s*\(/,/base64.*\|.*bash/,/\bprintenv\b/,/cat\s+.*\.ssh\/id_/,/cat\s+.*\.ssh\/config/,/\bnc\s+-[el]/,/\bncat\b/,/\bsocat\b/,/python3?\s+-c\s/,/node\s+-e\s/,/perl\s+-e\s/,/ruby\s+-e\s/,/(?:^|[;&|]\s*)history(?:\s|$)/,/curl.*-X\s*POST/,/curl.*--data/,/\bsed\s+-n\s+['"]?\d+,\d+p/],Bu=[...ja,/\bgrep\b.*\.env\b/,/\bawk\b.*\.env\b/,/\bsed\b.*\.env\b/,/\bhead\b.*\.env\b/,/\btail\b.*\.env\b/,/\bless\b.*\.env\b/,/\bmore\b.*\.env\b/,/\bstrings\b.*\.env\b/,/\bgrep\b.*credentials/i,/\bawk\b.*credentials/i,/\bsed\b.*credentials/i,/\bhead\b.*credentials/i,/\btail\b.*credentials/i,/\bcat\b.*private.*key/i,/\bgrep\b.*private_key/i,/\bcat\b.*google.*\.json/i,/\bcat\b.*service.?account/i];function ly(t){for(let e of Bu)if(e.test(t))return e;return null}var Wu=[/\.env\b/,/credentials\b/i,/\.ssh\b/,/\.gnupg\b/,/\.aws\b/,/\.npmrc\b/,/\.docker\/config/,/\.kube\/config/,/venv\b/,/\.venv\b/,/\.sqlite3\b/,/\.git\/(?!hooks)/],uy=/\b(?:rm|rmdir|unlink|truncate|shred|mv|cp)\b/,La=[/systemctl\s+(status|is-active|is-enabled|list-units|show)/,/journalctl\b/,/\btail\s/,/\bcat\s/,/\bhead\s/,/\bls\b/,/\bfind\s/,/\bgrep\s/,/\bwc\s/,/\bdf\b/,/\bfree\b/,/\buptime\b/,/\bwho\b/,/\bps\s/,/\bgit\s+(status|log|diff|branch|fetch)\b/,/\bgit\s+pull\b/,/\bss\s+-[tlnp]/,/\bnetstat\s/,/\bdu\s/,/\blscpu\b/,/\bnproc\b/,/\buname\b/,/\bhostname\b/,/\bgetent\b/,/\bid\b/,/psql\s.*-c\s/,/\bmysql\s.*-e\s/,/\bdnf\s+(check-update|list|info|history|repolist|updateinfo)\b/,/\brpm\s+-q/,/\bapt\s+list\b/,/\bopenssl\s+s_client\b/,/\bopenssl\s+x509\b/,/\bcertbot\s+certificates\b/,/\bcurl\s+-[sIkv]|curl\s+--head/,/\bdig\s/,/\bnslookup\s/,/\bping\s/,/\bgetenforce\b/,/\bsesearch\b/,/\bausearch\b/,/\bsealert\b/,/\bcrontab\s+-l\b/,/\btimedatectl\b/,/\bfirewall-cmd\s+--list/,/\bfirewall-cmd\s+--state/];function Hu(t){let e=t.match(/ssh\s+[^"]*"([^"]+)"/)?.[1]||t.match(/ssh\s+[^']*'([^']+)'/)?.[1];if(!e)return!1;let o=e.replace(/\bfor\s[\s\S]*?\bdone\b/g,r=>r.replace(/;/g,"\0")).replace(/\bwhile\s[\s\S]*?\bdone\b/g,r=>r.replace(/;/g,"\0")).split(/\s*(?:&&|;)\s*/).map(r=>r.replace(/\x00/g,";").trim()).filter(Boolean);if(o.length===0)return!1;let s=r=>{let i=r.replace(/^sudo\s+(?:-[ugCD]\s+\S+\s+|-[A-Za-z]+\s+)*/,"");if(/^\s*(?:echo|printf)\s/.test(i))return!0;if(/^\s*for\s/.test(r)||/^\s*while\s/.test(r)){let c=r.match(/\bdo\s+([\s\S]*?)\s*(?:done|$)/)?.[1];return c?c.split(/\s*;\s*/).map(u=>u.trim()).filter(Boolean).every(u=>s(u)):La.some(l=>l.test(r))}return/^\w+=\$?\(/.test(i)||/^\w+=["']/.test(i)||/^\w+=\S/.test(i)?!0:La.some(c=>c.test(i))};return o.every(s)}var Da=[/rm\s+-rf\s/,/docker\s+system\s+prune/,/kubectl\s+delete/,/sudo\s/,/--no-verify\b/,/git\s+reset\s+--hard\b/,/git\s+clean\s+-[a-z]*f/,/git\s+checkout\s+--\s/,/git\s+push\s+(?:--force\b|-f\b)/],Ku=[/git\s+push/,/npm\s+publish/,/\bHUSKY=0\b/,/\bSKIP_HUSKY=1\b/,/\bSKIP_PREFLIGHT_CHECK=true\b/,/npx\s+.*publish/,/docker\s+rm/,/ssh\s/,/wget\s/,/curl\s.*-o\s/,/pip\s+install/,/npm\s+install\s+-g/],Gu=[...Da,...Ku],qa=!1,Xn=null,Ia=null;function dy(t){qa=t}function fy(t){Ia=t}function py(){return qa}function my(t){Xn=t}function hy(t){for(let e of ja)if(e.test(t))return e;return null}function gy(t){if(/ssh\s/.test(t)&&Hu(t))return!1;for(let e of Gu)if(e.test(t))return!0;return!1}function $y(t){for(let e of Da)if(e.test(t))return!0;return!1}function yy(t){if(process.env.NEX_UNPROTECT==="1"||!uy.test(t))return null;for(let e of Wu)if(e.test(t))return e;return null}function wy(t,e={}){if(qa)return Promise.resolve(!0);if(Ia)return Ia(t,e);if(!process.stdout.isTTY||!process.stdin.isTTY)return by(t,e);let n=e.toolName?["Yes","No","Always allow"]:["Yes","No"];return new Promise(o=>{let s=0;Xn&&Xn.pause();let r=global._nexRawWrite||(f=>process.stdout.write(f)),i=()=>{let f=process.stdout.rows||24;return Math.max(1,f-n.length-2)},c=()=>{let f=i(),p=`\x1B[${f};1H\x1B[2K${an.yellow}${t}${an.reset}`;for(let h=0;h<n.length;h++){let m=h===s,g=m?`${an.yellow}\u276F${an.reset}`:" ",y=m?`${an.yellow}${n[h]}${an.reset}`:n[h];p+=`\x1B[${f+1+h};1H\x1B[2K ${g} ${y}`}r(p)},l=f=>{process.stdin.setRawMode(!1),process.stdin.pause(),process.stdin.removeListener("data",d);let p=global._nexRawWrite||(g=>process.stdout.write(g)),h=i(),m="";for(let g=0;g<n.length+1;g++)m+=`\x1B[${h+g};1H\x1B[2K`;p(m),global._nexFooter&&global._nexFooter.drawFooter(),Xn&&Xn.resume(),o(f)},u=f=>{if(f===1){l(!1);return}f===2&&e.toolName&&Ir(e.toolName),l(!0)},d=f=>{if(f[0]===3){l(!1);return}let p=f.toString();if(p==="\r"||p===`
55
+ `){u(s);return}if(p==="\x1B[A"){s=(s-1+n.length)%n.length,c();return}if(p==="\x1B[B"){s=(s+1)%n.length,c();return}let h=p.toLowerCase().trim();if(h==="y"){l(!0);return}if(h==="n"){l(!1);return}if(h==="a"&&e.toolName){Ir(e.toolName),l(!0);return}};c(),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.on("data",d)})}function by(t,e){let n=e.toolName?"[Y/n/a] ":"[Y/n] ";return new Promise(o=>{let s=r=>{let i=r.trim().toLowerCase();i==="a"&&e.toolName?(Ir(e.toolName),o(!0)):o(i!=="n")};if(Xn)Xn.question(`${an.yellow}${t} ${n}${an.reset}`,s);else{let r=cy.createInterface({input:process.stdin,output:process.stdout});r.question(`${an.yellow}${t} ${n}${an.reset}`,i=>{r.close(),s(i)})}})}var Ir=()=>{};function _y(t){Ir=t}Yu.exports={FORBIDDEN_PATTERNS:ja,SSH_FORBIDDEN_PATTERNS:Bu,BASH_PROTECTED_PATHS:Wu,SSH_SAFE_PATTERNS:La,isSSHReadOnly:Hu,DANGEROUS_BASH:Gu,CRITICAL_BASH:Da,NOTABLE_BASH:Ku,isForbidden:hy,isSSHForbidden:ly,isDangerous:gy,isCritical:$y,isBashPathForbidden:yy,confirm:wy,setAutoConfirm:dy,getAutoConfirm:py,setConfirmHook:fy,setReadlineInterface:my,setAllowAlwaysHandler:_y}});var Ps=Q((wT,zu)=>{async function xy(t,e){if(!t.response?.data)return t.message;let n=t.response.data;if(typeof n=="object"&&n!==null&&typeof n.pipe!="function")return e(n)||t.message;try{let o=await new Promise((r,i)=>{let c=[];n.on("data",l=>c.push(l)),n.on("end",()=>r(Buffer.concat(c).toString("utf8"))),n.on("error",i)}),s=JSON.parse(o);return e(s)||o||t.message}catch{return t.message}}var Fa=class t{constructor(e={}){if(new.target===t)throw new Error("BaseProvider is abstract \u2014 use a concrete provider");this.name=e.name||"unknown",this.baseUrl=e.baseUrl||"",this.models=e.models||{},this.defaultModel=e.defaultModel||null}isConfigured(){throw new Error(`${this.name}: isConfigured() not implemented`)}getApiKey(){return null}getModels(){return this.models}getModelNames(){return Object.keys(this.models)}getModel(e){return this.models[e]||null}async chat(e,n,o={}){throw new Error(`${this.name}: chat() not implemented`)}async stream(e,n,o={}){throw new Error(`${this.name}: stream() not implemented`)}formatMessages(e){return{messages:e}}formatTools(e){return e}normalizeResponse(e){throw new Error(`${this.name}: normalizeResponse() not implemented`)}};zu.exports={BaseProvider:Fa,readStreamErrorBody:xy}});var js=Q((bT,Xu)=>{var Ls=class{buildRequestBody(e){throw new Error("buildRequestBody() not implemented")}getEndpoint(){throw new Error("getEndpoint() not implemented")}formatTools(e){return e}normalizeResponse(e){throw new Error("normalizeResponse() not implemented")}createStreamParser(e,n={}){throw new Error("createStreamParser() not implemented")}},Is=class{constructor(e,n={}){this.onToken=e,this.callbacks=n,this.content="",this.buffer=""}feed(e){this.buffer+=e;let n=this.buffer.split(`
56
56
  `);this.buffer=n.pop()||"";for(let o of n){let s=this.parseLine(o);if(s?.done)return s}return{done:!1}}flush(){return this.buffer.trim()&&(this.parseLine(this.buffer),this.buffer=""),this.getResult()}parseLine(e){throw new Error("parseLine() not implemented")}getResult(){throw new Error("getResult() not implemented")}},jr=class extends Is{constructor(e,n={}){super(e,n),this.toolCallsMap={}}parseLine(e){let n=e.trim();if(!n||!n.startsWith("data: "))return{done:!1};let o=n.slice(6);if(o==="[DONE]")return{done:!0,result:this.getResult()};let s;try{s=JSON.parse(o)}catch{return{done:!1}}let r=s.choices?.[0]?.delta;if(!r)return{done:!1};if(r.content&&(this.onToken(r.content),this.content+=r.content),r.tool_calls)for(let i of r.tool_calls){let c=i.index??0;this.toolCallsMap[c]||(this.toolCallsMap[c]={id:i.id||"",name:"",arguments:""}),i.id&&(this.toolCallsMap[c].id=i.id),i.function?.name&&(this.toolCallsMap[c].name+=i.function.name),i.function?.arguments&&(this.toolCallsMap[c].arguments+=i.function.arguments)}return{done:!1}}getResult(){return{content:this.content,tool_calls:Object.values(this.toolCallsMap).filter(e=>e.name).map(e=>({id:e.id||`call-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,function:{name:e.name,arguments:e.arguments}}))}}},Dr=class extends Ls{getEndpoint(){return"/chat/completions"}buildRequestBody({model:e,messages:n,tools:o,maxTokens:s,temperature:r,stream:i}){let c={model:e,messages:n,max_tokens:s,temperature:r};return i&&(c.stream=!0),o&&o.length>0&&(c.tools=o),c}normalizeResponse(e){let n=e.choices?.[0]?.message||{},o=(n.tool_calls||[]).map(s=>({id:s.id,function:{name:s.function.name,arguments:s.function.arguments}}));return{content:n.content||"",tool_calls:o}}createStreamParser(e,n={}){return new jr(e,n)}},qr=class extends Is{constructor(e,n={}){super(e,n),this.toolUses=[],this.currentToolIndex=-1}parseLine(e){let n=e.trim();if(!n.startsWith("data: "))return{done:!1};let o=n.slice(6),s;try{s=JSON.parse(o)}catch{return{done:!1}}switch(s.type){case"content_block_start":{let r=s.content_block;r?.type==="tool_use"&&(this.currentToolIndex=this.toolUses.length,this.toolUses.push({id:r.id,name:r.name,inputJson:""}));break}case"content_block_delta":{let r=s.delta;r?.type==="text_delta"&&r.text&&(this.onToken(r.text),this.content+=r.text),r?.type==="input_json_delta"&&r.partial_json!==void 0&&this.currentToolIndex>=0&&(this.toolUses[this.currentToolIndex].inputJson+=r.partial_json);break}case"content_block_stop":this.currentToolIndex=-1;break;case"message_stop":return{done:!0,result:this.getResult()}}return{done:!1}}getResult(){return{content:this.content,tool_calls:this.toolUses.filter(e=>e.name).map(e=>{let n={};if(e.inputJson)try{n=JSON.parse(e.inputJson)}catch{n=e.inputJson}return{id:e.id||`anthropic-${Date.now()}`,function:{name:e.name,arguments:n}}})}}},Fr=class extends Ls{getEndpoint(){return"/messages"}buildRequestBody({model:e,messages:n,tools:o,maxTokens:s,temperature:r,stream:i,extra:c}){let l={model:e,messages:n,max_tokens:s,temperature:r};return i&&(l.stream=!0),c?.system&&(l.system=c.system),o&&o.length>0&&(l.tools=o),l}formatTools(e){return!e||e.length===0?[]:e.map(n=>({name:n.function.name,description:n.function.description||"",input_schema:n.function.parameters||{type:"object",properties:{}}}))}normalizeResponse(e){let n="",o=[];for(let s of e.content||[])s.type==="text"?n+=s.text:s.type==="tool_use"&&o.push({id:s.id,function:{name:s.name,arguments:s.input}});return{content:n,tool_calls:o}}createStreamParser(e,n={}){return new qr(e,n)}},Ur=class extends Is{constructor(e,n={}){super(e,n),this.toolCalls=[],this.onThinkingToken=n.onThinkingToken||(()=>{})}parseLine(e){if(!e.trim())return{done:!1};let n;try{n=JSON.parse(e)}catch{return{done:!1}}return n.message?.thinking&&this.onThinkingToken(n.message.thinking),n.message?.content&&(this.onToken(n.message.content),this.content+=n.message.content),n.message?.tool_calls&&(this.toolCalls=this.toolCalls.concat(n.message.tool_calls)),n.done?{done:!0,result:this.getResult()}:{done:!1}}getResult(){return{content:this.content,tool_calls:this.toolCalls.map((e,n)=>({id:e.id||`ollama-${Date.now()}-${n}`,function:{name:e.function?.name||e.name||"unknown",arguments:e.function?.arguments||e.arguments||{}}}))}}},Br=class extends Ls{getEndpoint(){return"/api/chat"}buildRequestBody({model:e,messages:n,tools:o,maxTokens:s,temperature:r,stream:i,extra:c}){let l={model:e,messages:n,stream:i,options:{temperature:r,num_predict:s,repeat_penalty:c?.repeat_penalty??1.05}};return o&&o.length>0&&(l.tools=o),l}normalizeResponse(e){let n=e.message||{};return{content:n.content||"",tool_calls:(n.tool_calls||[]).map((o,s)=>({id:o.id||`ollama-${Date.now()}-${s}`,function:{name:o.function?.name||o.name||"unknown",arguments:o.function?.arguments||o.arguments||{}}}))}}createStreamParser(e,n={}){return new Ur(e,n)}},vy=new Dr,ky=new Fr,Sy=new Br;Xu.exports={WireProtocol:Ls,StreamParser:Is,OpenAICompatibleProtocol:Dr,AnthropicProtocol:Fr,OllamaChatProtocol:Br,OpenAIStreamParser:jr,AnthropicStreamParser:qr,OllamaStreamParser:Ur,openaiProtocol:vy,anthropicProtocol:ky,ollamaProtocol:Sy}});var Zu=Q((_T,Vu)=>{var Wr=require("axios"),Ey=require("http"),Ty=require("https"),{BaseProvider:Ry,readStreamErrorBody:Cy}=Ps(),{ollamaProtocol:Jn}=js(),Hr=new Ey.Agent({keepAlive:!0,maxSockets:6,timeout:6e4}),Kr=new Ty.Agent({keepAlive:!0,maxSockets:6,timeout:6e4}),Ju={"qwen3-coder:480b":{id:"qwen3-coder:480b",name:"Qwen3 Coder 480B",maxTokens:16384,contextWindow:131072},"qwen3-coder-next":{id:"qwen3-coder-next",name:"Qwen3 Coder Next",maxTokens:16384,contextWindow:262144},"devstral-2:123b":{id:"devstral-2:123b",name:"Devstral 2 123B",maxTokens:16384,contextWindow:131072},"devstral-small-2:24b":{id:"devstral-small-2:24b",name:"Devstral Small 2 24B",maxTokens:16384,contextWindow:131072},"minimax-m2.7:cloud":{id:"minimax-m2.7:cloud",name:"MiniMax M2.7 Cloud",maxTokens:16384,contextWindow:131072},"kimi-k2.5":{id:"kimi-k2.5",name:"Kimi K2.5",maxTokens:16384,contextWindow:256e3},"kimi-k2:1t":{id:"kimi-k2:1t",name:"Kimi K2 1T",maxTokens:16384,contextWindow:256e3},"kimi-k2-thinking":{id:"kimi-k2-thinking",name:"Kimi K2 Thinking",maxTokens:16384,contextWindow:256e3},"deepseek-v3.2":{id:"deepseek-v3.2",name:"DeepSeek V3.2",maxTokens:16384,contextWindow:131072},"deepseek-v3.1:671b":{id:"deepseek-v3.1:671b",name:"DeepSeek V3.1 671B",maxTokens:16384,contextWindow:131072},"cogito-2.1:671b":{id:"cogito-2.1:671b",name:"Cogito 2.1 671B",maxTokens:16384,contextWindow:131072},"qwen3.5:397b-cloud":{id:"qwen3.5:397b-cloud",name:"Qwen3.5 397B Cloud",maxTokens:16384,contextWindow:262144},"qwen3.5:397b":{id:"qwen3.5:397b",name:"Qwen3.5 397B",maxTokens:16384,contextWindow:262144},"qwen3.5:122b-a10b":{id:"qwen3.5:122b-a10b",name:"Qwen3.5 122B-A10B",maxTokens:16384,contextWindow:262144},"qwen3.5:35b-a3b":{id:"qwen3.5:35b-a3b",name:"Qwen3.5 35B-A3B",maxTokens:16384,contextWindow:262144},"qwen3.5:27b":{id:"qwen3.5:27b",name:"Qwen3.5 27B",maxTokens:16384,contextWindow:262144},"qwen3-next:80b":{id:"qwen3-next:80b",name:"Qwen3 Next 80B",maxTokens:16384,contextWindow:131072},"mistral-large-3:675b":{id:"mistral-large-3:675b",name:"Mistral Large 3 675B",maxTokens:16384,contextWindow:131072},"gpt-oss:120b":{id:"gpt-oss:120b",name:"GPT-OSS 120B",maxTokens:16384,contextWindow:131072},"minimax-m2.5":{id:"minimax-m2.5",name:"MiniMax M2.5",maxTokens:16384,contextWindow:131072},"glm-5:cloud":{id:"glm-5:cloud",name:"GLM 5 Cloud",maxTokens:16384,contextWindow:2e5},"glm-5":{id:"glm-5",name:"GLM 5",maxTokens:16384,contextWindow:2e5},"glm-4.6":{id:"glm-4.6",name:"GLM 4.6",maxTokens:16384,contextWindow:2e5},"glm-4.7":{id:"glm-4.7",name:"GLM 4.7",maxTokens:16384,contextWindow:128e3},"nemotron-3-super:cloud":{id:"nemotron-3-super:cloud",name:"Nemotron 3 Super Cloud",maxTokens:16384,contextWindow:262144},"qwen3.5:9b":{id:"qwen3.5:9b",name:"Qwen3.5 9B",maxTokens:8192,contextWindow:262144},"qwen3.5:4b":{id:"qwen3.5:4b",name:"Qwen3.5 4B",maxTokens:8192,contextWindow:262144},"qwen3.5:2b":{id:"qwen3.5:2b",name:"Qwen3.5 2B",maxTokens:8192,contextWindow:262144},"qwen3.5:0.8b":{id:"qwen3.5:0.8b",name:"Qwen3.5 0.8B",maxTokens:8192,contextWindow:262144},"gemma3:27b":{id:"gemma3:27b",name:"Gemma 3 27B",maxTokens:8192,contextWindow:131072},"gemma3:12b":{id:"gemma3:12b",name:"Gemma 3 12B",maxTokens:8192,contextWindow:131072},"gemma3:4b":{id:"gemma3:4b",name:"Gemma 3 4B",maxTokens:8192,contextWindow:131072},"ministral-3:14b":{id:"ministral-3:14b",name:"Ministral 3 14B",maxTokens:8192,contextWindow:131072},"ministral-3:8b":{id:"ministral-3:8b",name:"Ministral 3 8B",maxTokens:8192,contextWindow:131072},"gemini-3-flash-preview":{id:"gemini-3-flash-preview",name:"Gemini 3 Flash Preview",maxTokens:16384,contextWindow:131072}},Ua=class extends Ry{constructor(e={}){super({name:"ollama",baseUrl:e.baseUrl||"https://ollama.com",models:e.models||Ju,defaultModel:e.defaultModel||"qwen3-coder:480b",...e}),this.timeout=e.timeout||18e4,this.temperature=e.temperature??.2,this._discovered=!1}async discoverModels(){if(!this._discovered){if(this._discovered=!0,!process.stdout.isTTY){Wr.get(`${this.baseUrl}/api/tags`,{timeout:5e3,headers:this._getHeaders(),httpAgent:Hr,httpsAgent:Kr}).then(e=>{let n=e.data?.models||[];for(let o of n){let s=(o.name||o.model||"").replace(/:latest$/,"");!s||this.models[s]||(this.models[s]={id:s,name:o.name||s,maxTokens:16384,contextWindow:131072})}}).catch(()=>{});return}try{let n=(await Wr.get(`${this.baseUrl}/api/tags`,{timeout:5e3,headers:this._getHeaders(),httpAgent:Hr,httpsAgent:Kr})).data?.models||[];for(let o of n){let s=(o.name||o.model||"").replace(/:latest$/,"");!s||this.models[s]||(this.models[s]={id:s,name:o.name||s,maxTokens:16384,contextWindow:131072})}}catch{}}}isConfigured(){return!!this.getApiKey()}getApiKey(){return process.env.OLLAMA_API_KEY||null}_getHeaders(){let e=this.getApiKey();if(!e)throw new Error("OLLAMA_API_KEY not set");return{Authorization:`Bearer ${e}`}}_formatMessages(e){return e.map(n=>{if(n.role==="user"&&Array.isArray(n.content)){let o=[],s=[];for(let i of n.content)i.type==="text"?o.push(i.text??""):i.type==="image"&&i.data&&s.push(i.data);let r={role:"user",content:o.join(`
57
57
  `)};return s.length>0&&(r.images=s),r}return n})}async chat(e,n,o={}){await this.discoverModels();let s=o.model||this.defaultModel,r=this.getModel(s),i=o.maxTokens||r?.maxTokens||16384,c=Jn.buildRequestBody({model:s,messages:this._formatMessages(e),tools:n,maxTokens:i,temperature:o.temperature??this.temperature,stream:!1,extra:{repeat_penalty:o.repeat_penalty}}),l;try{l=await Wr.post(`${this.baseUrl}${Jn.getEndpoint()}`,c,{timeout:o.timeout||this.timeout,headers:this._getHeaders(),httpAgent:Hr,httpsAgent:Kr})}catch(u){if(u.name==="CanceledError"||u.name==="AbortError"||u.code==="ERR_CANCELED")throw u;let d=u.response?.status?` [HTTP ${u.response.status}]`:"",f=u.response?.data?.error||u.message;throw new Error(`API Error${d}: ${f}`)}return Jn.normalizeResponse(l.data)}async stream(e,n,o={}){await this.discoverModels();let s=o.model||this.defaultModel,r=this.getModel(s),i=o.maxTokens||r?.maxTokens||16384,c=o.onToken||(()=>{}),l=o.onThinkingToken||(()=>{}),u=Jn.buildRequestBody({model:s,messages:this._formatMessages(e),tools:n,maxTokens:i,temperature:o.temperature??this.temperature,stream:!0,extra:{repeat_penalty:o.repeat_penalty}}),d;try{d=await Wr.post(`${this.baseUrl}${Jn.getEndpoint()}`,u,{timeout:o.timeout||this.timeout,headers:this._getHeaders(),responseType:"stream",signal:o.signal,httpAgent:Hr,httpsAgent:Kr})}catch(p){if(p.name==="CanceledError"||p.name==="AbortError"||p.code==="ERR_CANCELED")throw p;let h=p.response?.status?` [HTTP ${p.response.status}]`:"",m=await Cy(p,g=>g?.error);throw new Error(`API Error${h}: ${m}`)}let f=Jn.createStreamParser(c,{onThinkingToken:l});return new Promise((p,h)=>{o.signal&&o.signal.addEventListener("abort",()=>{d.data.destroy(),h(new DOMException("The operation was aborted","AbortError"))},{once:!0}),d.data.on("data",m=>{let{done:g,result:y}=f.feed(m.toString());g&&p(y)}),d.data.on("error",m=>{o.signal?.aborted||h(new Error(`Stream error: ${m.message}`))}),d.data.on("end",()=>{p(f.flush())})})}normalizeResponse(e){return Jn.normalizeResponse(e)}};Vu.exports={OllamaProvider:Ua,OLLAMA_MODELS:Ju}});var nd=Q((xT,td)=>{var Qu=require("axios"),{BaseProvider:Ay,readStreamErrorBody:Oy}=Ps(),{openaiProtocol:Vn}=js(),ed={"gpt-4o":{id:"gpt-4o",name:"GPT-4o",maxTokens:16384,contextWindow:128e3},"gpt-4o-mini":{id:"gpt-4o-mini",name:"GPT-4o Mini",maxTokens:16384,contextWindow:128e3},"gpt-4.1":{id:"gpt-4.1",name:"GPT-4.1",maxTokens:32768,contextWindow:128e3},"gpt-4.1-mini":{id:"gpt-4.1-mini",name:"GPT-4.1 Mini",maxTokens:32768,contextWindow:128e3},"gpt-4.1-nano":{id:"gpt-4.1-nano",name:"GPT-4.1 Nano",maxTokens:16384,contextWindow:128e3},o1:{id:"o1",name:"o1",maxTokens:1e5,contextWindow:2e5},o3:{id:"o3",name:"o3",maxTokens:1e5,contextWindow:2e5},"o3-mini":{id:"o3-mini",name:"o3 Mini",maxTokens:65536,contextWindow:2e5},"o4-mini":{id:"o4-mini",name:"o4 Mini",maxTokens:1e5,contextWindow:2e5}},Ba=class extends Ay{constructor(e={}){super({name:"openai",baseUrl:e.baseUrl||"https://api.openai.com/v1",models:e.models||ed,defaultModel:e.defaultModel||"gpt-4o",...e}),this.timeout=e.timeout||18e4,this.temperature=e.temperature??.2}isConfigured(){return!!this.getApiKey()}getApiKey(){return process.env.OPENAI_API_KEY||null}_getHeaders(){let e=this.getApiKey();if(!e)throw new Error("OPENAI_API_KEY not set");return{Authorization:`Bearer ${e}`,"Content-Type":"application/json"}}_messageFormatCache=new WeakMap;_messageStringCache=new Map;_maxCacheSize=200;formatMessages(e){let n=[];for(let o of e){if(this._messageFormatCache.has(o)){n.push(this._messageFormatCache.get(o));continue}let s=this._getMessageCacheKey(o);if(this._messageStringCache.has(s)){let i=this._messageStringCache.get(s);this._messageFormatCache.set(o,i),n.push(i);continue}let r=this._formatSingleMessage(o);this._messageStringCache.size<this._maxCacheSize&&this._messageStringCache.set(s,r),this._messageFormatCache.set(o,r),n.push(r)}return{messages:n}}_getMessageCacheKey(e){let n=e.role||"",o=typeof e.content=="string"?e.content.substring(0,100):"",s=e.tool_calls?e.tool_calls.length:0;return`${n}:${o.length}:${s}`}_formatSingleMessage(e){if(e.role==="assistant"&&e.tool_calls)return{role:"assistant",content:e.content||null,tool_calls:e.tool_calls.map(n=>({id:n.id||`call-${Date.now()}`,type:"function",function:{name:n.function.name,arguments:typeof n.function.arguments=="string"?n.function.arguments:JSON.stringify(n.function.arguments)}}))};if(e.role==="tool")return{role:"tool",content:typeof e.content=="string"?e.content:JSON.stringify(e.content),tool_call_id:e.tool_call_id};if(e.role==="user"&&Array.isArray(e.content)){let n=[];for(let o of e.content)if(o.type==="text")n.push({type:"text",text:o.text??""});else if(o.type==="image"&&o.data){let s=o.data.startsWith("data:")?o.data:`data:${o.media_type||"image/png"};base64,${o.data}`;n.push({type:"image_url",image_url:{url:s,detail:"auto"}})}return{role:"user",content:n}}return{role:e.role,content:e.content}}async chat(e,n,o={}){let s=o.model||this.defaultModel,r=this.getModel(s),i=o.maxTokens||r?.maxTokens||16384,{messages:c}=this.formatMessages(e),l=Vn.buildRequestBody({model:s,messages:c,tools:n,maxTokens:i,temperature:o.temperature??this.temperature,stream:!1}),u;try{u=await Qu.post(`${this.baseUrl}${Vn.getEndpoint()}`,l,{timeout:o.timeout||this.timeout,headers:this._getHeaders()})}catch(d){if(d.name==="CanceledError"||d.name==="AbortError"||d.code==="ERR_CANCELED")throw d;let f=d.response?.status?` [HTTP ${d.response.status}]`:"",p=d.response?.data?.error?.message||d.response?.data?.error||d.message;throw new Error(`API Error${f}: ${p}`)}return Vn.normalizeResponse(u.data)}async stream(e,n,o={}){let s=o.model||this.defaultModel,r=this.getModel(s),i=o.maxTokens||r?.maxTokens||16384,c=o.onToken||(()=>{}),{messages:l}=this.formatMessages(e),u=Vn.buildRequestBody({model:s,messages:l,tools:n,maxTokens:i,temperature:o.temperature??this.temperature,stream:!0}),d;try{d=await Qu.post(`${this.baseUrl}${Vn.getEndpoint()}`,u,{timeout:o.timeout||this.timeout,headers:this._getHeaders(),responseType:"stream",signal:o.signal})}catch(p){if(p.name==="CanceledError"||p.name==="AbortError"||p.code==="ERR_CANCELED")throw p;let h=p.response?.status?` [HTTP ${p.response.status}]`:"",m=await Oy(p,g=>g?.error?.message||g?.error);throw new Error(`API Error${h}: ${m}`)}let f=Vn.createStreamParser(c);return new Promise((p,h)=>{o.signal&&o.signal.addEventListener("abort",()=>{d.data.destroy(),h(new DOMException("The operation was aborted","AbortError"))},{once:!0}),d.data.on("data",m=>{let{done:g,result:y}=f.feed(m.toString());g&&p(y)}),d.data.on("error",m=>{o.signal?.aborted||h(new Error(`Stream error: ${m.message}`))}),d.data.on("end",()=>{p(f.flush())})})}normalizeResponse(e){return Vn.normalizeResponse(e)}};td.exports={OpenAIProvider:Ba,OPENAI_MODELS:ed}});var id=Q((vT,rd)=>{var sd=require("axios"),{BaseProvider:Ny,readStreamErrorBody:My}=Ps(),{anthropicProtocol:Cn}=js(),od={"claude-sonnet":{id:"claude-sonnet-4-6",name:"Claude Sonnet 4.6",maxTokens:64e3,contextWindow:2e5},"claude-opus":{id:"claude-opus-4-6",name:"Claude Opus 4.6",maxTokens:128e3,contextWindow:2e5},"claude-haiku":{id:"claude-haiku-4-5-20251001",name:"Claude Haiku 4.5",maxTokens:64e3,contextWindow:2e5},"claude-sonnet-4-5":{id:"claude-sonnet-4-5-20250929",name:"Claude Sonnet 4.5",maxTokens:64e3,contextWindow:2e5},"claude-sonnet-4":{id:"claude-sonnet-4-20250514",name:"Claude Sonnet 4",maxTokens:64e3,contextWindow:2e5}},Py="2023-06-01",Wa=class extends Ny{constructor(e={}){super({name:"anthropic",baseUrl:e.baseUrl||"https://api.anthropic.com/v1",models:e.models||od,defaultModel:e.defaultModel||"claude-sonnet",...e}),this.timeout=e.timeout||18e4,this.temperature=e.temperature??.2,this.apiVersion=e.apiVersion||Py}isConfigured(){return!!this.getApiKey()}getApiKey(){return process.env.ANTHROPIC_API_KEY||null}_getHeaders(){let e=this.getApiKey();if(!e)throw new Error("ANTHROPIC_API_KEY not set");return{"x-api-key":e,"anthropic-version":this.apiVersion,"Content-Type":"application/json"}}_messageFormatCache=new WeakMap;_messageStringCache=new Map;_maxCacheSize=200;formatMessages(e){let n="",o=[];for(let s of e){if(s.role==="system"){n+=(n?`
58
58
 
@@ -70,7 +70,7 @@ ${q.bold}${q.cyan} New file: ${t}${q.reset}`);let n=e.split(`
70
70
  ${q.bold}${q.cyan} Side-by-side: ${t}${q.reset}`),console.log(` ${q.dim}${"\u2500".repeat(r)}\u252C${"\u2500".repeat(r)}${q.reset}`);let i=wo(e,n),c=[],l=0;for(;l<i.length;)if(i[l].type==="same")c.push({left:i[l].line,right:i[l].line,type:"same"}),l++;else if(i[l].type==="remove"){let h=[];for(;l<i.length&&i[l].type==="remove";)h.push(i[l].line),l++;let m=[];for(;l<i.length&&i[l].type==="add";)m.push(i[l].line),l++;let g=Math.max(h.length,m.length);for(let y=0;y<g;y++)c.push({left:y<h.length?h[y]:"",right:y<m.length?m[y]:"",type:"changed"})}else i[l].type==="add"&&(c.push({left:"",right:i[l].line,type:"changed"}),l++);let u=c.map((h,m)=>h.type!=="same"?m:-1).filter(h=>h>=0);if(u.length===0){console.log(` ${q.gray}(no changes)${q.reset}`);return}let d=Math.max(0,u[0]-2),f=Math.min(c.length,u[u.length-1]+3),p=(h,m)=>{let g=h.replace(/\x1b\[[0-9;]*m/g,"");return g.length>=m?h.substring(0,m):h+" ".repeat(m-g.length)};d>0&&console.log(` ${q.dim}${"\xB7".repeat(r)}\u250A${"\xB7".repeat(r)}${q.reset}`);for(let h=d;h<f;h++){let m=c[h];if(m.type==="same")console.log(` ${q.gray}${p(m.left,r)}${q.reset}\u2502${q.gray}${p(m.right,r)}${q.reset}`);else{let g=m.left?`${q.red}${p(m.left,r)}${q.reset}`:`${p("",r)}`,y=m.right?`${q.green}${p(m.right,r)}${q.reset}`:`${p("",r)}`;console.log(` ${g}\u2502${y}`)}}f<c.length&&console.log(` ${q.dim}${"\xB7".repeat(r)}\u250A${"\xB7".repeat(r)}${q.reset}`),console.log(` ${q.dim}${"\u2500".repeat(r)}\u2534${"\u2500".repeat(r)}${q.reset}
71
71
  `)}function xw(t,e,n,o={}){let s=o.label||"Update",r=o.context||3,i=o.annotations||[],c=Xr.isAbsolute(t)?Xr.relative(process.cwd(),t):t,l=wo(e,n),u=1,d=1;for(let O of l)O.type==="same"?(O.oldLine=u++,O.newLine=d++):O.type==="remove"?(O.oldLine=u++,O.newLine=null):(O.oldLine=null,O.newLine=d++);let f=0,p=0;for(let O of l)O.type==="add"?f++:O.type==="remove"&&p++;if(console.log(`
72
72
  ${q.green}\u23FA${q.reset} ${q.bold}${s}(${c})${q.reset}`),f===0&&p===0){console.log(` ${q.dim}\u23BF (no changes)${q.reset}
73
- `);return}let h=[];if(f>0&&h.push(`Added ${f} line${f!==1?"s":""}`),p>0&&h.push(`removed ${p} line${p!==1?"s":""}`),i.length>0){let O=i.filter(X=>X.severity==="error").length,D=i.filter(X=>X.severity==="warn").length,K=i.filter(X=>X.severity==="info").length,V=[];O>0&&V.push(`${q.red}${O} error${O!==1?"s":""}${q.dim}`),D>0&&V.push(`${q.yellow}${D} warning${D!==1?"s":""}${q.dim}`),K>0&&V.push(`${q.cyan}${K} info${K!==1?"s":""}${q.dim}`),h.push(`found ${V.join(", ")}`)}console.log(` ${q.dim}\u23BF ${h.join(", ")}${q.reset}`);let g=[];l.forEach((O,D)=>{O.type!=="same"&&g.push(D)});let y=[],w=null,v=null;for(let O of g){let D=Math.max(0,O-r),K=Math.min(l.length-1,O+r);w===null?(w=D,v=K):(D<=v+1||(y.push([w,v]),w=D),v=K)}w!==null&&y.push([w,v]);let M=" ",C=process.stdout.columns||120;function S(O,D,K){let V=K.replace(/\x1b\[[0-9;]*m/g,""),X=K+" ".repeat(Math.max(0,C-V.length));return`${O}${D}${X}${q.reset}`}for(let O=0;O<y.length;O++){O>0&&console.log(`${M}${q.dim}\xB7\xB7\xB7${q.reset}`);let[D,K]=y[O];for(let V=D;V<=K;V++){let X=l[V],B=X.newLine!=null?X.newLine:X.oldLine,R=String(B).padStart(4),$e=X.type!=="remove"?i.filter(be=>be.line===X.newLine):[];X.type==="remove"?console.log(S(Ja.diff_rem_bg,q.red,`${M}${R} - ${X.line}`)):X.type==="add"?console.log(S(Ja.diff_add_bg,q.green,`${M}${R} + ${X.line}`)):console.log(`${M}${q.dim}${R} ${q.reset}${X.line}`);for(let be of $e){let fe=q.cyan,pe="\u2139";be.severity==="error"?(fe=q.red,pe="\u2716"):be.severity==="warn"&&(fe=q.yellow,pe="\u26A0"),console.log(`${M} ${fe}${pe} ${be.message}${q.reset}`)}}}console.log()}function vw(t,e,n={}){let o=Xr.isAbsolute(t)?Xr.relative(process.cwd(),t):t,s=e.split(`
73
+ `);return}let h=[];if(f>0&&h.push(`Added ${f} line${f!==1?"s":""}`),p>0&&h.push(`removed ${p} line${p!==1?"s":""}`),i.length>0){let O=i.filter(X=>X.severity==="error").length,D=i.filter(X=>X.severity==="warn").length,K=i.filter(X=>X.severity==="info").length,V=[];O>0&&V.push(`${q.red}${O} error${O!==1?"s":""}${q.dim}`),D>0&&V.push(`${q.yellow}${D} warning${D!==1?"s":""}${q.dim}`),K>0&&V.push(`${q.cyan}${K} info${K!==1?"s":""}${q.dim}`),h.push(`found ${V.join(", ")}`)}console.log(` ${q.dim}\u23BF ${h.join(", ")}${q.reset}`);let g=[];l.forEach((O,D)=>{O.type!=="same"&&g.push(D)});let y=[],w=null,v=null;for(let O of g){let D=Math.max(0,O-r),K=Math.min(l.length-1,O+r);w===null?(w=D,v=K):(D<=v+1||(y.push([w,v]),w=D),v=K)}w!==null&&y.push([w,v]);let M=" ",C=process.stdout.columns||120;function S(O,D,K){let V=K.replace(/\x1b\[[0-9;]*m/g,""),X=K+" ".repeat(Math.max(0,C-V.length));return`${O}${D}${X}${q.reset}`}for(let O=0;O<y.length;O++){O>0&&console.log(`${M}${q.dim}\xB7\xB7\xB7${q.reset}`);let[D,K]=y[O];for(let V=D;V<=K;V++){let X=l[V],B=X.newLine!=null?X.newLine:X.oldLine,R=String(B).padStart(4),ye=X.type!=="remove"?i.filter(be=>be.line===X.newLine):[];X.type==="remove"?console.log(S(Ja.diff_rem_bg,q.red,`${M}${R} - ${X.line}`)):X.type==="add"?console.log(S(Ja.diff_add_bg,q.green,`${M}${R} + ${X.line}`)):console.log(`${M}${q.dim}${R} ${q.reset}${X.line}`);for(let be of ye){let fe=q.cyan,pe="\u2139";be.severity==="error"?(fe=q.red,pe="\u2716"):be.severity==="warn"&&(fe=q.yellow,pe="\u26A0"),console.log(`${M} ${fe}${pe} ${be.message}${q.reset}`)}}}console.log()}function vw(t,e,n={}){let o=Xr.isAbsolute(t)?Xr.relative(process.cwd(),t):t,s=e.split(`
74
74
  `),r=n.annotations||[];console.log(`
75
75
  ${q.green}\u23FA${q.reset} ${q.bold}Create(${o})${q.reset}`);let i=[`${s.length} line${s.length!==1?"s":""}`];if(r.length>0){let f=r.filter(g=>g.severity==="error").length,p=r.filter(g=>g.severity==="warn").length,h=r.filter(g=>g.severity==="info").length,m=[];f>0&&m.push(`${q.red}${f} error${f!==1?"s":""}${q.dim}`),p>0&&m.push(`${q.yellow}${p} warning${p!==1?"s":""}${q.dim}`),h>0&&m.push(`${q.cyan}${h} info${h!==1?"s":""}${q.dim}`),i.push(`found ${m.join(", ")}`)}console.log(` ${q.dim}\u23BF ${i.join(", ")}${q.reset}`);let l=" ",u=process.stdout.columns||120,d=Math.min(s.length,20);for(let f=0;f<d;f++){let p=String(f+1).padStart(4),h=f+1,m=r.filter(v=>v.line===h),g=`${l}${p} + ${s[f]}`,y=g.replace(/\x1b\[[0-9;]*m/g,""),w=g+" ".repeat(Math.max(0,u-y.length));console.log(`${Ja.diff_add_bg}${q.green}${w}${q.reset}`);for(let v of m){let M=q.cyan,C="\u2139";v.severity==="error"?(M=q.red,C="\u2716"):v.severity==="warn"&&(M=q.yellow,C="\u26A0"),console.log(`${l} ${M}${C} ${v.message}${q.reset}`)}}s.length>20&&console.log(`${l}${q.dim} ...+${s.length-20} more lines${q.reset}`),console.log()}Cd.exports={diffLines:wo,showEditDiff:$w,showWriteDiff:yw,showNewFilePreview:ww,confirmFileChange:bw,showSideBySideDiff:_w,showClaudeDiff:xw,showClaudeNewFile:vw}});var Nn=Q((MT,Md)=>{var Od=require("util").promisify(require("child_process").exec),kw=require("util").promisify(require("child_process").execFile),{C:Ge}=Fe();async function Va(t){try{let{stdout:e}=await Od(t,{cwd:process.cwd(),timeout:3e4});return e.trim()}catch{return null}}async function Jr(...t){try{let{stdout:e}=await kw("git",t,{cwd:process.cwd(),timeout:3e4});return e.trim()}catch{return null}}async function Sw(){return await Va("git rev-parse --is-inside-work-tree")==="true"}async function Ew(){return await Va("git branch --show-current")}async function Za(){try{let{stdout:t}=await Od("git status --porcelain",{cwd:process.cwd(),timeout:3e4});return!t||!t.trim()?[]:t.split(`
76
76
  `).filter(Boolean).map(e=>{let n=e.substring(0,2).trim(),o=e.substring(3);return{status:n,file:o}})}catch{return[]}}async function Vr(t=!1){return await Va(`git diff ${t?"--cached":""}`)||""}async function Qa(){return(await Za()).map(e=>e.file)}async function Nd(){let t=await Qa();if(t.length===0)return null;let e=await Vr(),o=await Vr(!0)||e,s=0,r=0;if(o){let d=o.split(`
@@ -123,7 +123,7 @@ HINT: Cannot reach ${e.host}. Check: network connection, correct hostname/IP, DN
123
123
  HINT: Host key changed for ${e.host}. To reset: ssh-keygen -R ${e.host}`:/timed out/i.test(t)?`${t}
124
124
  HINT: Connection timed out to ${e.host}. Check firewall rules and network connectivity.`:/too many authentication failures/i.test(t)?`${t}
125
125
  HINT: Too many auth attempts. Add "-o IdentitiesOnly=yes -i ${e.key||"~/.ssh/id_rsa"}" or clear your SSH agent keys.`:t}function nb(t,e){let n=e.user?`${e.user}@${e.host}`:e.host,o=e.port&&Number(e.port)!==22?`:${e.port}`:"",s=e.os?` [${e.os}]`:"",r=e.key?` key:${e.key}`:"",i=e.sudo?" sudo:yes":"";return`${t}: ${n}${o}${s}${r}${i}`}xf.exports={loadServerProfiles:wf,resolveProfile:V0,buildSSHArgs:bf,sshExec:Q0,scpUpload:eb,scpDownload:tb,enrichSSHError:fi,formatProfile:nb,SSH_SOCKET_DIR:li}});var $c=Q((KT,kf)=>{var ko=require("fs"),hc=require("path"),sb=hc.join(".nex","deploy.json");function gc(){return hc.join(process.cwd(),sb)}function vf(){let t=gc();if(!ko.existsSync(t))return{};try{return JSON.parse(ko.readFileSync(t,"utf-8"))}catch{return{}}}function ob(t){let e=vf();if(e[t])return{...e[t],_name:t};let n=Object.keys(e),o=n.length?`Available: ${n.join(", ")}`:"No deploy configs found. Create .nex/deploy.json or use explicit params.";throw new Error(`Unknown deploy config: "${t}". ${o}`)}function rb(t){let e=hc.join(process.cwd(),".nex");ko.existsSync(e)||ko.mkdirSync(e,{recursive:!0}),ko.writeFileSync(gc(),JSON.stringify(t,null,2)+`
126
- `,"utf-8")}kf.exports={loadDeployConfigs:vf,resolveDeployConfig:ob,saveDeployConfigs:rb,getDeployConfigPath:gc}});var Ro=Q((GT,Tf)=>{var{getActiveModel:ib,getActiveProviderName:ab}=je(),So={essential:["bash","read_file","write_file","edit_file","list_directory"],standard:["bash","read_file","write_file","edit_file","list_directory","search_files","glob","grep","ask_user","git_status","git_diff","git_log","task_list","ssh_exec","service_manage","service_logs","container_list","container_logs","container_exec","container_manage","deploy"],full:null},Eo={"qwen3-coder:480b":"full","qwen3-coder-next":"full","kimi-k2.5":"full","kimi-k2:1t":"full","kimi-k2-thinking":"full","deepseek-v3.2":"full","deepseek-v3.1:671b":"full","devstral-2:123b":"full","devstral-small-2:24b":"standard","cogito-2.1:671b":"full","qwen3-next:80b":"full","qwen3.5:397b-cloud":"full","qwen3.5:397b":"full","qwen3.5:122b-a10b":"full","qwen3.5:35b-a3b":"full","qwen3.5:27b":"full","qwen3.5:9b":"standard","qwen3.5:4b":"essential","qwen3.5:2b":"essential","qwen3.5:0.8b":"essential","mistral-large-3:675b":"full","gpt-oss:120b":"full","minimax-m2.5":"full","glm-5":"full","glm-4.7":"standard","gemma3:27b":"standard","gemma3:12b":"essential","gemma3:4b":"essential","ministral-3:14b":"standard","ministral-3:8b":"essential","gpt-4o":"full","gpt-4.1":"full",o1:"full",o3:"full","o4-mini":"full","claude-sonnet":"full","claude-sonnet-4-5":"full","claude-opus":"full","claude-haiku":"standard","claude-sonnet-4":"full","gemini-3.1-pro-preview":"full","gemini-3-flash-preview":"full","gemini-2.5-pro":"full","gemini-2.5-flash":"full","gemini-2.0-flash":"standard","gemini-2.0-flash-lite":"essential"},To={ollama:"full",openai:"full",anthropic:"full",gemini:"full",local:"essential"},an={};function Ef(){try{let t=require("fs"),n=require("path").join(process.cwd(),".nex","config.json");t.existsSync(n)&&(an=JSON.parse(t.readFileSync(n,"utf-8")).toolTiers||{})}catch{an={}}}Ef();function yc(){let e=ib()?.id,n=ab();return e&&an[e]?an[e]:n&&an[`${n}:*`]?an[`${n}:*`]:e&&Eo[e]?Eo[e]:n&&To[n]?To[n]:"full"}var cb=new Set(["claude-sonnet","claude-sonnet-4-5","claude-sonnet-4","claude-opus","claude-haiku","gpt-4o","gpt-4.1","o1","o3","o4-mini","kimi-k2:1t","kimi-k2.5","kimi-k2-thinking","qwen3-coder:480b","qwen3-coder-next","deepseek-v3.2","deepseek-v3.1:671b"]),Sf={anthropic:"strict",openai:"strict",gemini:"strict",ollama:"fuzzy",local:"fuzzy"};function lb(t,e){return t&&(cb.has(t)||t.startsWith("claude-"))?"strict":e&&Sf[e]?Sf[e]:"fuzzy"}function ub(t,e){return t&&an[t]?an[t]:e&&an[`${e}:*`]?an[`${e}:*`]:t&&Eo[t]?Eo[t]:e&&To[e]?To[e]:"full"}function db(t,e){let n=e||yc();if(n==="full"||!So[n])return t;let o=new Set(So[n]);return t.filter(s=>o.has(s.function.name))}function fb(){let t=yc(),e=So[t]?So[t].length:"all";return{tier:t,toolCount:e}}Tf.exports={filterToolsForModel:db,getActiveTier:yc,getModelTier:ub,getEditMode:lb,getTierInfo:fb,TIERS:So,MODEL_TIERS:Eo,PROVIDER_DEFAULT_TIER:To,loadConfigOverrides:Ef}});var Ao=Q((YT,Af)=>{var wc=null,bn=null,Co=null,Rf=`Playwright is not installed. Install with:
126
+ `,"utf-8")}kf.exports={loadDeployConfigs:vf,resolveDeployConfig:ob,saveDeployConfigs:rb,getDeployConfigPath:gc}});var Ro=Q((GT,Tf)=>{var{getActiveModel:ib,getActiveProviderName:ab}=je(),So={essential:["bash","read_file","write_file","edit_file","list_directory"],standard:["bash","read_file","write_file","edit_file","list_directory","search_files","glob","grep","ask_user","git_status","git_diff","git_log","task_list","ssh_exec","service_manage","service_logs","container_list","container_logs","container_exec","container_manage","deploy"],full:null},Eo={"qwen3-coder:480b":"full","qwen3-coder-next":"full","kimi-k2.5":"full","kimi-k2:1t":"full","kimi-k2-thinking":"full","deepseek-v3.2":"full","deepseek-v3.1:671b":"full","devstral-2:123b":"full","devstral-small-2:24b":"standard","cogito-2.1:671b":"full","qwen3-next:80b":"full","qwen3.5:397b-cloud":"full","qwen3.5:397b":"full","qwen3.5:122b-a10b":"full","qwen3.5:35b-a3b":"full","qwen3.5:27b":"full","qwen3.5:9b":"standard","qwen3.5:4b":"essential","qwen3.5:2b":"essential","qwen3.5:0.8b":"essential","mistral-large-3:675b":"full","gpt-oss:120b":"full","minimax-m2.5":"full","glm-5":"full","glm-4.7":"standard","gemma3:27b":"standard","gemma3:12b":"essential","gemma3:4b":"essential","ministral-3:14b":"standard","ministral-3:8b":"essential","gpt-4o":"full","gpt-4.1":"full",o1:"full",o3:"full","o4-mini":"full","claude-sonnet":"full","claude-sonnet-4-5":"full","claude-opus":"full","claude-haiku":"standard","claude-sonnet-4":"full","gemini-3.1-pro-preview":"full","gemini-3-flash-preview":"full","gemini-2.5-pro":"full","gemini-2.5-flash":"full","gemini-2.0-flash":"standard","gemini-2.0-flash-lite":"essential"},To={ollama:"full",openai:"full",anthropic:"full",gemini:"full",local:"essential"},cn={};function Ef(){try{let t=require("fs"),n=require("path").join(process.cwd(),".nex","config.json");t.existsSync(n)&&(cn=JSON.parse(t.readFileSync(n,"utf-8")).toolTiers||{})}catch{cn={}}}Ef();function yc(){let e=ib()?.id,n=ab();return e&&cn[e]?cn[e]:n&&cn[`${n}:*`]?cn[`${n}:*`]:e&&Eo[e]?Eo[e]:n&&To[n]?To[n]:"full"}var cb=new Set(["claude-sonnet","claude-sonnet-4-5","claude-sonnet-4","claude-opus","claude-haiku","gpt-4o","gpt-4.1","o1","o3","o4-mini","kimi-k2:1t","kimi-k2.5","kimi-k2-thinking","qwen3-coder:480b","qwen3-coder-next","deepseek-v3.2","deepseek-v3.1:671b"]),Sf={anthropic:"strict",openai:"strict",gemini:"strict",ollama:"fuzzy",local:"fuzzy"};function lb(t,e){return t&&(cb.has(t)||t.startsWith("claude-"))?"strict":e&&Sf[e]?Sf[e]:"fuzzy"}function ub(t,e){return t&&cn[t]?cn[t]:e&&cn[`${e}:*`]?cn[`${e}:*`]:t&&Eo[t]?Eo[t]:e&&To[e]?To[e]:"full"}function db(t,e){let n=e||yc();if(n==="full"||!So[n])return t;let o=new Set(So[n]);return t.filter(s=>o.has(s.function.name))}function fb(){let t=yc(),e=So[t]?So[t].length:"all";return{tier:t,toolCount:e}}Tf.exports={filterToolsForModel:db,getActiveTier:yc,getModelTier:ub,getEditMode:lb,getTierInfo:fb,TIERS:So,MODEL_TIERS:Eo,PROVIDER_DEFAULT_TIER:To,loadConfigOverrides:Ef}});var Ao=Q((YT,Af)=>{var wc=null,bn=null,Co=null,Rf=`Playwright is not installed. Install with:
127
127
  npm install playwright && npx playwright install chromium
128
128
  Then restart nex-code.`;function Cf(){if(Co!==null)return Co;try{require("playwright"),Co=!0}catch{Co=!1}return Co}async function pi(){if(!Cf())throw new Error(Rf);return wc||(wc=require("playwright")),(!bn||!bn.isConnected())&&(bn=await wc.chromium.launch({headless:!0})),bn}async function pb(){if(bn){try{await bn.close()}catch{}bn=null}}process.on("exit",()=>{if(bn)try{bn.close()}catch{}});async function mb(t,{timeout:e=3e4,waitFor:n="domcontentloaded"}={}){let s=await(await pi()).newPage();try{await s.goto(t,{waitUntil:n,timeout:e});let r=await s.title(),i=await s.evaluate(()=>(document.querySelectorAll("script,style,nav,footer,header,aside,[role=navigation]").forEach(u=>u.remove()),document.body?.innerText||"")),c=await s.evaluate(()=>Array.from(document.querySelectorAll("a[href]")).slice(0,30).map(l=>({text:(l.innerText||l.textContent||"").trim().substring(0,80),href:l.href})).filter(l=>l.text&&l.href&&!l.href.startsWith("javascript:")));return{title:r,url:s.url(),text:i.substring(0,8e3)+(i.length>8e3?`
129
129
  ...(truncated)`:""),links:c.slice(0,20)}}finally{await s.close()}}async function hb(t,{width:e=1280,height:n=800,fullPage:o=!1,timeout:s=3e4}={}){let i=await(await pi()).newPage();try{await i.setViewportSize({width:e,height:n}),await i.goto(t,{waitUntil:"networkidle",timeout:s});let c=await i.screenshot({type:"png",fullPage:o}),l=require("os"),u=require("path"),d=require("fs"),f=u.join(l.tmpdir(),`nex-screenshot-${Date.now()}.png`);return d.writeFileSync(f,c),{path:f,base64:c.toString("base64"),media_type:"image/png",title:await i.title(),url:i.url()}}finally{await i.close()}}async function gb(t,{selector:e,text:n,timeout:o=3e4}={}){if(!e&&!n)throw new Error("selector or text is required");let r=await(await pi()).newPage();try{await r.goto(t,{waitUntil:"domcontentloaded",timeout:o}),n?await r.getByText(n,{exact:!1}).first().click({timeout:1e4}):await r.locator(e).first().click({timeout:1e4}),await r.waitForLoadState("domcontentloaded");let i=await r.title();return`Clicked \u2014 now at: ${r.url()} (${i})`}finally{await r.close()}}async function $b(t,{selector:e,value:n,submit:o=!1,timeout:s=3e4}={}){if(!e||n===void 0)throw new Error("selector and value are required");let i=await(await pi()).newPage();try{return await i.goto(t,{waitUntil:"domcontentloaded",timeout:s}),await i.fill(e,String(n)),o&&(await i.keyboard.press("Enter"),await i.waitForLoadState("domcontentloaded")),`Filled "${e}" with value. ${o?`Submitted \u2192 ${i.url()}`:"Not submitted."}`}finally{await i.close()}}Af.exports={isPlaywrightAvailable:Cf,browserNavigate:mb,browserScreenshot:hb,browserClick:gb,browserFill:$b,closeBrowser:pb,INSTALL_MSG:Rf}});var mi=Q((zT,Of)=>{var{C:Be}=Fe(),No="",gt=[],Oo=0,ts=null;function yb(t){ts=t}function wb(t,e){No=t,gt=[],Oo=0;for(let o of e){Oo++;let s=`t${Oo}`;gt.push({id:s,description:o.description||o.title||o.name||o.task||`Task ${Oo}`,status:"pending",dependsOn:o.depends_on||[],result:null})}let n=gt.map(o=>({...o}));return ts&&ts("create",{name:t,tasks:n}),n}function bb(t,e,n){let o=gt.find(s=>s.id===t);return o?(o.status=e,n!==void 0&&(o.result=n),ts&&ts("update",{id:t,status:e,result:n}),{...o}):null}function _b(){return{name:No,tasks:gt.map(t=>({...t}))}}function xb(){No="",gt=[],Oo=0,ts&&ts("clear",{})}function vb(){return gt.filter(t=>t.status!=="pending"?!1:t.dependsOn.length===0?!0:t.dependsOn.every(e=>{let n=gt.find(o=>o.id===e);return n&&n.status==="done"}))}function kb(){if(gt.length===0)return`${Be.dim}No active tasks${Be.reset}`;let t=[];No&&(t.push(` ${Be.bold}${Be.cyan}Tasks: ${No}${Be.reset}`),t.push(` ${Be.dim}${"\u2500".repeat(40)}${Be.reset}`));for(let s of gt){let r,i;switch(s.status){case"done":r="\u2713",i=Be.green;break;case"in_progress":r="\u2192",i=Be.cyan;break;case"failed":r="\u2717",i=Be.red;break;default:r="\xB7",i=Be.dim}let c=s.dependsOn.length>0?` ${Be.dim}(after: ${s.dependsOn.join(", ")})${Be.reset}`:"",l=`[${s.status}]`,u=s.description.length>50?s.description.substring(0,47)+"...":s.description;if(t.push(` ${i}${r}${Be.reset} ${Be.bold}${s.id}${Be.reset} ${u.padEnd(40)} ${i}${l}${Be.reset}${c}`),s.result&&s.status==="done"){let d=s.result.length>60?s.result.substring(0,57)+"...":s.result;t.push(` ${Be.dim}\u2192 ${d}${Be.reset}`)}}let e=gt.filter(s=>s.status==="done").length,n=gt.filter(s=>s.status==="failed").length,o=gt.length;return t.push(` ${Be.dim}${"\u2500".repeat(40)}${Be.reset}`),t.push(` ${Be.dim}${e}/${o} done${n>0?`, ${n} failed`:""}${Be.reset}`),t.join(`
@@ -157,14 +157,14 @@ ${o}`,_compacted:!0,_originalCount:t.length},tokensRemoved:s-r}}catch{return nul
157
157
  ...(${h} lines omitted, ${s.length} total)...
158
158
  `+d.join(`
159
159
  `)}function Ys(t,e="light"){let n=e==="aggressive"?100:e==="medium"?200:Fb,o=e==="aggressive"?50:e==="medium"?100:qb;if(t.role==="tool"){let s=typeof t.content=="string"?t.content:JSON.stringify(t.content);return s.length>o?{...t,content:Gf(s,o)}:t}if(t.role==="assistant"){let s={...t};return s.content&&s.content.length>n&&(s.content=s.content.substring(0,n)+`
160
- ...(truncated)`),s.tool_calls&&e==="aggressive"&&(s.tool_calls=s.tool_calls.map(r=>({...r,function:{name:r.function.name,arguments:typeof r.function.arguments=="string"?r.function.arguments.substring(0,50):r.function.arguments}}))),s}return t}function Yf(t,e,n,o){let s=0;if(t.role==="system")return 100;if(t.role==="user")s+=35;else if(t.role==="tool"){let i=typeof t.content=="string"?t.content:JSON.stringify(t.content||"");/^(ERROR|BLOCKED|CANCELLED)/i.test(i)?s+=30:s+=15}else t.role==="assistant"&&(s+=t.tool_calls?20:10);let r=n>1?e/(n-1):1;if(s+=Math.round(r*30),o&&o.size>0){let i=typeof t.content=="string"?t.content:JSON.stringify(t.content||""),c=0;for(let l of o)(i.includes(l)||i.includes(Ob.basename(l)))&&c++;s+=Math.min(30,c*10)}return Math.min(100,s)}function zf(t,e=10){let n=new Set,o=t.slice(-e),s=/(?:\/[\w.-]+)+\.\w+/g;for(let r of o){let c=(typeof r.content=="string"?r.content:JSON.stringify(r.content||"")).match(s);c&&c.forEach(l=>n.add(l))}return n}var Gs={msgCount:-1,lastMsgRef:null,result:null};function Ub(){Gs={msgCount:-1,lastMsgRef:null,result:null}}async function Bb(t,e,n={}){let o=t.length>0?t[t.length-1]:null;if(!n.force&&Gs.result&&t.length===Gs.msgCount&&o===Gs.lastMsgRef)return Gs.result;let s=n.threshold??Kf(),r=n.safetyMargin??Bf,i=n.keepRecent??Wf,c=$i(),l=gi(e),u=Math.floor(c*(s-r)),d=u-l,f=qt(t),p=f+l;if(p<=u){let X={messages:t,compressed:!1,compacted:!1,tokensRemoved:0};return Gs={msgCount:t.length,lastMsgRef:o,result:X},X}let h=f,m=null,g=0;t.length>0&&t[0].role==="system"&&(m=t[0],g=1);let y=Math.max(g,t.length-i),w=t.slice(g,y),v=t.slice(y),M=w.filter(X=>!X._compacted);if(M.length>=6)try{let{compactMessages:X}=qf(),B=await X(M);if(B){let $e=[...w.filter(pe=>pe._compacted),B.message],be=Pn(m,$e,v),fe=qt(be);if(fe+l<=u)return{messages:be,compressed:!0,compacted:!0,tokensRemoved:h-fe};w=$e}}catch(X){process.env.NEX_DEBUG&&console.error("[context-engine] LLM compacting failed:",X.message)}let C=(p-u)/u,S=w.map(X=>Ys(X,"light")),O=Pn(m,S,v),D=qt(O);if(D+l<=u)return{messages:O,compressed:!0,compacted:!1,tokensRemoved:h-D};if(S=w.map(X=>Ys(X,"medium")),O=Pn(m,S,v),D=qt(O),D+l<=u)return{messages:O,compressed:!0,compacted:!1,tokensRemoved:h-D};if(S=w.map(X=>Ys(X,"aggressive")),O=Pn(m,S,v),D=qt(O),D+l<=u)return{messages:O,compressed:!0,compacted:!1,tokensRemoved:h-D};let K=zf([...S,...v]),V=S.map((X,B)=>({msg:X,score:Yf(X,B,S.length,K),tokens:zs(X)}));for(;V.length>0&&D>d;){let X=0;for(let B=1;B<V.length;B++)V[B].score<V[X].score&&(X=B);D-=V[X].tokens,V.splice(X,1)}return S=V.map(X=>X.msg),O=Pn(m,S,v),D=qt(O),{messages:O,compressed:!0,compacted:!1,tokensRemoved:h-D}}function Pn(t,e,n){let o=[];return t&&o.push(t),o.push(...e,...n),o}function Wb(t,e){if(!t)return"";if(os(t)<=e)return t;let o=e*4,s=t.split(`
160
+ ...(truncated)`),s.tool_calls&&e==="aggressive"&&(s.tool_calls=s.tool_calls.map(r=>({...r,function:{name:r.function.name,arguments:typeof r.function.arguments=="string"?r.function.arguments.substring(0,50):r.function.arguments}}))),s}return t}function Yf(t,e,n,o){let s=0;if(t.role==="system")return 100;if(t.role==="user")s+=35;else if(t.role==="tool"){let i=typeof t.content=="string"?t.content:JSON.stringify(t.content||"");/^(ERROR|BLOCKED|CANCELLED)/i.test(i)?s+=30:s+=15}else t.role==="assistant"&&(s+=t.tool_calls?20:10);let r=n>1?e/(n-1):1;if(s+=Math.round(r*30),o&&o.size>0){let i=typeof t.content=="string"?t.content:JSON.stringify(t.content||""),c=0;for(let l of o)(i.includes(l)||i.includes(Ob.basename(l)))&&c++;s+=Math.min(30,c*10)}return Math.min(100,s)}function zf(t,e=10){let n=new Set,o=t.slice(-e),s=/(?:\/[\w.-]+)+\.\w+/g;for(let r of o){let c=(typeof r.content=="string"?r.content:JSON.stringify(r.content||"")).match(s);c&&c.forEach(l=>n.add(l))}return n}var Gs={msgCount:-1,lastMsgRef:null,result:null};function Ub(){Gs={msgCount:-1,lastMsgRef:null,result:null}}async function Bb(t,e,n={}){let o=t.length>0?t[t.length-1]:null;if(!n.force&&Gs.result&&t.length===Gs.msgCount&&o===Gs.lastMsgRef)return Gs.result;let s=n.threshold??Kf(),r=n.safetyMargin??Bf,i=n.keepRecent??Wf,c=$i(),l=gi(e),u=Math.floor(c*(s-r)),d=u-l,f=qt(t),p=f+l;if(p<=u){let X={messages:t,compressed:!1,compacted:!1,tokensRemoved:0};return Gs={msgCount:t.length,lastMsgRef:o,result:X},X}let h=f,m=null,g=0;t.length>0&&t[0].role==="system"&&(m=t[0],g=1);let y=Math.max(g,t.length-i),w=t.slice(g,y),v=t.slice(y),M=w.filter(X=>!X._compacted);if(M.length>=6)try{let{compactMessages:X}=qf(),B=await X(M);if(B){let ye=[...w.filter(pe=>pe._compacted),B.message],be=Pn(m,ye,v),fe=qt(be);if(fe+l<=u)return{messages:be,compressed:!0,compacted:!0,tokensRemoved:h-fe};w=ye}}catch(X){process.env.NEX_DEBUG&&console.error("[context-engine] LLM compacting failed:",X.message)}let C=(p-u)/u,S=w.map(X=>Ys(X,"light")),O=Pn(m,S,v),D=qt(O);if(D+l<=u)return{messages:O,compressed:!0,compacted:!1,tokensRemoved:h-D};if(S=w.map(X=>Ys(X,"medium")),O=Pn(m,S,v),D=qt(O),D+l<=u)return{messages:O,compressed:!0,compacted:!1,tokensRemoved:h-D};if(S=w.map(X=>Ys(X,"aggressive")),O=Pn(m,S,v),D=qt(O),D+l<=u)return{messages:O,compressed:!0,compacted:!1,tokensRemoved:h-D};let K=zf([...S,...v]),V=S.map((X,B)=>({msg:X,score:Yf(X,B,S.length,K),tokens:zs(X)}));for(;V.length>0&&D>d;){let X=0;for(let B=1;B<V.length;B++)V[B].score<V[X].score&&(X=B);D-=V[X].tokens,V.splice(X,1)}return S=V.map(X=>X.msg),O=Pn(m,S,v),D=qt(O),{messages:O,compressed:!0,compacted:!1,tokensRemoved:h-D}}function Pn(t,e,n){let o=[];return t&&o.push(t),o.push(...e,...n),o}function Wb(t,e){if(!t)return"";if(os(t)<=e)return t;let o=e*4,s=t.split(`
161
161
  `),r=Math.floor(o*.6),i=Math.floor(o*.4),c="",l=0;for(let h of s){if(c.length+h.length+1>r)break;c+=(c?`
162
162
  `:"")+h,l++}let u="",d=0;for(let h=s.length-1;h>=l;h--){let m=s[h]+(u?`
163
163
  `:"")+u;if(m.length>i)break;u=m,d++}let p=`
164
164
 
165
165
  ... (${s.length-l-d} lines omitted, ${s.length} total) ...
166
166
 
167
- `;return c+p+u}var Hb=6;function Kb(t,e,n=!1){let o=$i(),s=gi(e),r=Math.floor(o*(n?.35:.5))-s,i=qt(t),c=Math.floor(i*(n?.5:.8));r>c&&(r=c);let l=null,u=0;t.length>0&&t[0].role==="system"&&(l=t[0],u=1);let d=n?2:Hb,f=Math.max(u,t.length-d),p=t.slice(u,f),h=t.slice(f),m=p.map(S=>Ys(S,"aggressive"));n&&(h=h.map(S=>Ys(S,"aggressive")));let g=Pn(l,m,h),y=qt(g);for(;m.length>0&&y>r;){let S=m.shift();y-=zs(S)}n&&y>r&&(h=h.filter(O=>O.role==="user").slice(-1),g=Pn(l,[],h),y=qt(g)),g=Pn(l,m,h);let w=t.filter(S=>S.role==="user"),v=S=>{let O=typeof S.content=="string"?S.content:"";return O.startsWith("[SYSTEM WARNING]")||O.startsWith("[SYSTEM:")||O.startsWith("BLOCKED:")},M=w.find(S=>!v(S)),C=[...w].reverse().find(S=>!v(S));if(M&&!g.find(S=>S===M)){let S=g.findIndex(D=>D.role==="system"),O=S>=0?S+1:0;g.splice(O,0,M)}return C&&C!==M&&!g.find(S=>S===C)&&g.push(C),{messages:g,tokensRemoved:i-qt(g)}}Xf.exports={estimateTokens:os,estimateMessageTokens:zs,estimateMessagesTokens:qt,estimateDeltaTokens:jb,estimateToolsTokens:gi,serializeMessage:Ib,getContextWindow:$i,getUsage:Db,compressMessage:Ys,compressToolResult:Gf,scoreMessageRelevance:Yf,extractActiveFiles:zf,fitToContext:Bb,forceCompress:Kb,truncateFileContent:Wb,invalidateTokenRatioCache:Lb,invalidateFitToContextCache:Ub,getEffectiveCompressionThreshold:Kf,COMPRESSION_THRESHOLD:Po,TIER_COMPRESSION_THRESHOLDS:Hf,SAFETY_MARGIN:Bf,KEEP_RECENT:Wf}});var _i=Q((QT,$p)=>{var{callStream:Gb,getActiveProviderName:wi,getActiveModelId:Jf,getConfiguredProviders:Yb,getProvider:Vf,getActiveProvider:Zf,parseModelSpec:Qf}=je(),{parseToolArgs:ep}=Fs(),{filterToolsForModel:zb,getModelTier:yi}=Ro(),{getModelBriefing:Xb}=hi(),{trackUsage:tp,estimateTokens:np}=qs(),{MultiProgress:Jb,C:ZT}=Fe();function sp(t){return!t||typeof t!="string"?0:typeof np=="function"?np(t):Math.ceil(t.length/4)}var ip=15,Vb=5,op=3,ap=8,Zb=2,bi=new Map,cp=600*1e3;function Qb(t,e){let n=bi.get(t);return n&&n.agentId!==e&&Date.now()-n.timestamp<cp?!1:(bi.set(t,{agentId:e,timestamp:Date.now()}),!0)}function Lo(t){bi.delete(t)}function xc(){bi.clear()}function vc(t){let e=(t.message||"").toLowerCase(),n=t.code||"";return e.includes("429")||e.includes("rate limit")?"rate_limit":e.includes("401")||e.includes("403")||e.includes("unauthorized")||e.includes("forbidden")?"auth":e.includes("context")&&(e.includes("too long")||e.includes("overflow")||e.includes("maximum"))||e.includes("400")&&(e.includes("content")||e.includes("length"))?"context_overflow":e.includes("500")||e.includes("502")||e.includes("503")||e.includes("504")?"server":n==="ECONNRESET"||n==="ECONNABORTED"||n==="ETIMEDOUT"||n==="ECONNREFUSED"||n==="ENOTFOUND"||e.includes("socket disconnected")||e.includes("tls")||e.includes("econnreset")||e.includes("fetch failed")||e.includes("etimedout")||e.includes("enotfound")?"network":"unknown"}function lp(t){let e=vc(t);return e==="rate_limit"||e==="server"||e==="network"}async function up(t,e,n){let o;for(let s=0;s<=op;s++)try{return await Gb(t,e,n)}catch(r){o=r;let i=vc(r);if(i==="auth")throw r.message=`Authentication failed \u2014 check your API key or permissions. (${r.message})`,r;if(i==="context_overflow")throw r.message=`Context window exceeded \u2014 reduce message history or use a model with a larger context. (${r.message})`,r;if(s<op&&lp(r)){let l=i==="rate_limit"?Math.min(2e3*Math.pow(2,s),15e3):Math.min(500*Math.pow(2,s),4e3);await new Promise(u=>setTimeout(u,l).unref());continue}throw r}throw o}var rp=new Set(["ask_user","task_list"]);function dp(t){return t>=2?new Set([...rp,"spawn_agents"]):rp}var e_=new Set(["write_file","edit_file","patch_file"]),fp={explore:{allowedTools:new Set(["bash","read_file","list_directory","glob","grep","search_files","web_fetch","web_search"]),systemSuffix:"You are an exploration agent. Read and search code only. Do NOT modify any files."},review:{allowedTools:new Set(["read_file","list_directory","glob","grep","search_files"]),systemSuffix:"You are a code review agent. Read code and report findings. Do NOT make changes."},implement:{allowedTools:null,systemSuffix:""}},t_=/\b(read|summarize|search|find|list|check|count|inspect|scan)\b/i,n_=/\b(refactor|rewrite|implement|create|architect|design|generate|migrate)\b/i;function pp(t){return n_.test(t)?"full":t_.test(t)?"essential":t.length>300?"full":"standard"}function mp(t){let e=Yb(),n=wi(),o=[...e].sort((s,r)=>(s.name===n?-1:1)-(r.name===n?-1:1));for(let s of o)for(let r of s.models)if(yi(r.id,s.name)===t)return{provider:s.name,model:r.id};return null}var s_={essential:process.env.NEX_FAST_MODEL||null,standard:process.env.NEX_STANDARD_MODEL||null,full:process.env.NEX_HEAVY_MODEL||null};function kc(t){if(t.model){let{provider:s,model:r}=Qf(t.model),i=s?Vf(s):Zf(),c=s||wi();if(i&&i.isConfigured()&&(i.getModel(r)||c==="local")){let l=yi(r,c);return{provider:c,model:r,tier:l}}}let e=pp(t.task),n=s_[e];if(n){let{provider:s,model:r}=Qf(n),i=s?Vf(s):Zf(),c=s||wi();if(i&&i.isConfigured()&&(i.getModel(r)||c==="local")){let l=yi(r,c);return{provider:c,model:r,tier:l}}}let o=mp(e);if(o){let s=yi(o.model,o.provider);return{provider:o.provider,model:o.model,tier:s}}return{provider:null,model:null,tier:null}}async function hp(t,e={},n=0){let o=n===0?ip:ap,s=Math.min(t.max_iterations||10,o),r=`sub-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,i=[],c={input:0,output:0},l=new Set,u=new Map,d=t._systemPrompt||`You are a focused sub-agent. Complete this specific task efficiently.
167
+ `;return c+p+u}var Hb=6;function Kb(t,e,n=!1){let o=$i(),s=gi(e),r=Math.floor(o*(n?.35:.5))-s,i=qt(t),c=Math.floor(i*(n?.5:.8));r>c&&(r=c);let l=null,u=0;t.length>0&&t[0].role==="system"&&(l=t[0],u=1);let d=n?2:Hb,f=Math.max(u,t.length-d),p=t.slice(u,f),h=t.slice(f),m=p.map(S=>Ys(S,"aggressive"));n&&(h=h.map(S=>Ys(S,"aggressive")));let g=Pn(l,m,h),y=qt(g);for(;m.length>0&&y>r;){let S=m.shift();y-=zs(S)}n&&y>r&&(h=h.filter(O=>O.role==="user").slice(-1),g=Pn(l,[],h),y=qt(g)),g=Pn(l,m,h);let w=t.filter(S=>S.role==="user"),v=S=>{let O=typeof S.content=="string"?S.content:"";return O.startsWith("[SYSTEM WARNING]")||O.startsWith("[SYSTEM:")||O.startsWith("BLOCKED:")},M=w.find(S=>!v(S)),C=[...w].reverse().find(S=>!v(S));if(M&&!g.find(S=>S===M)){let S=g.findIndex(D=>D.role==="system"),O=S>=0?S+1:0;g.splice(O,0,M)}return C&&C!==M&&!g.find(S=>S===C)&&g.push(C),{messages:g,tokensRemoved:i-qt(g)}}Xf.exports={estimateTokens:os,estimateMessageTokens:zs,estimateMessagesTokens:qt,estimateDeltaTokens:jb,estimateToolsTokens:gi,serializeMessage:Ib,getContextWindow:$i,getUsage:Db,compressMessage:Ys,compressToolResult:Gf,scoreMessageRelevance:Yf,extractActiveFiles:zf,fitToContext:Bb,forceCompress:Kb,truncateFileContent:Wb,invalidateTokenRatioCache:Lb,invalidateFitToContextCache:Ub,getEffectiveCompressionThreshold:Kf,COMPRESSION_THRESHOLD:Po,TIER_COMPRESSION_THRESHOLDS:Hf,SAFETY_MARGIN:Bf,KEEP_RECENT:Wf}});var _i=Q((QT,$p)=>{var{callStream:Gb,getActiveProviderName:wi,getActiveModelId:Jf,getConfiguredProviders:Yb,getProvider:Vf,getActiveProvider:Zf,parseModelSpec:Qf}=je(),{parseToolArgs:ep}=Fs(),{filterToolsForModel:zb,getModelTier:yi}=Ro(),{getModelBriefing:Xb}=hi(),{trackUsage:tp,estimateTokens:np}=qs(),{MultiProgress:Jb,C:ZT}=Fe();function sp(t){return!t||typeof t!="string"?0:typeof np=="function"?np(t):Math.ceil(t.length/4)}var ip=15,Vb=5,op=3,ap=8,Zb=2,bi=new Map,cp=600*1e3;function Qb(t,e){let n=bi.get(t);return n&&n.agentId!==e&&Date.now()-n.timestamp<cp?!1:(bi.set(t,{agentId:e,timestamp:Date.now()}),!0)}function Lo(t){bi.delete(t)}function xc(){bi.clear()}function vc(t){let e=(t.message||"").toLowerCase(),n=t.code||"";return e.includes("429")||e.includes("rate limit")?"rate_limit":e.includes("401")||e.includes("403")||e.includes("unauthorized")||e.includes("forbidden")?"auth":e.includes("context")&&(e.includes("too long")||e.includes("overflow")||e.includes("maximum"))||e.includes("400")&&(e.includes("content")||e.includes("length"))?"context_overflow":e.includes("500")||e.includes("502")||e.includes("503")||e.includes("504")?"server":e.includes("timed out")||e.includes("timeout")?"timeout":n==="ECONNRESET"||n==="ECONNABORTED"||n==="ETIMEDOUT"||n==="ECONNREFUSED"||n==="ENOTFOUND"||e.includes("socket disconnected")||e.includes("tls")||e.includes("econnreset")||e.includes("fetch failed")||e.includes("etimedout")||e.includes("enotfound")?"network":"unknown"}function lp(t){let e=vc(t);return e==="rate_limit"||e==="server"||e==="network"||e==="timeout"}async function up(t,e,n){let o;for(let s=0;s<=op;s++)try{return await Gb(t,e,n)}catch(r){o=r;let i=vc(r);if(i==="auth")throw r.message=`Authentication failed \u2014 check your API key or permissions. (${r.message})`,r;if(i==="context_overflow")throw r.message=`Context window exceeded \u2014 reduce message history or use a model with a larger context. (${r.message})`,r;if(s<op&&lp(r)){let l=i==="rate_limit"?Math.min(2e3*Math.pow(2,s),15e3):Math.min(500*Math.pow(2,s),4e3);await new Promise(u=>setTimeout(u,l).unref());continue}throw r}throw o}var rp=new Set(["ask_user","task_list"]);function dp(t){return t>=2?new Set([...rp,"spawn_agents"]):rp}var e_=new Set(["write_file","edit_file","patch_file"]),fp={explore:{allowedTools:new Set(["bash","read_file","list_directory","glob","grep","search_files","web_fetch","web_search"]),systemSuffix:"You are an exploration agent. Read and search code only. Do NOT modify any files."},review:{allowedTools:new Set(["read_file","list_directory","glob","grep","search_files"]),systemSuffix:"You are a code review agent. Read code and report findings. Do NOT make changes."},implement:{allowedTools:null,systemSuffix:""}},t_=/\b(read|summarize|search|find|list|check|count|inspect|scan)\b/i,n_=/\b(refactor|rewrite|implement|create|architect|design|generate|migrate)\b/i;function pp(t){return n_.test(t)?"full":t_.test(t)?"essential":t.length>300?"full":"standard"}function mp(t){let e=Yb(),n=wi(),o=[...e].sort((s,r)=>(s.name===n?-1:1)-(r.name===n?-1:1));for(let s of o)for(let r of s.models)if(yi(r.id,s.name)===t)return{provider:s.name,model:r.id};return null}var s_={essential:process.env.NEX_FAST_MODEL||null,standard:process.env.NEX_STANDARD_MODEL||null,full:process.env.NEX_HEAVY_MODEL||null};function kc(t){if(t.model){let{provider:s,model:r}=Qf(t.model),i=s?Vf(s):Zf(),c=s||wi();if(i&&i.isConfigured()&&(i.getModel(r)||c==="local")){let l=yi(r,c);return{provider:c,model:r,tier:l}}}let e=pp(t.task),n=s_[e];if(n){let{provider:s,model:r}=Qf(n),i=s?Vf(s):Zf(),c=s||wi();if(i&&i.isConfigured()&&(i.getModel(r)||c==="local")){let l=yi(r,c);return{provider:c,model:r,tier:l}}}let o=mp(e);if(o){let s=yi(o.model,o.provider);return{provider:o.provider,model:o.model,tier:s}}return{provider:null,model:null,tier:null}}async function hp(t,e={},n=0){let o=n===0?ip:ap,s=Math.min(t.max_iterations||10,o),r=`sub-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,i=[],c={input:0,output:0},l=new Set,u=new Map,d=t._systemPrompt||`You are a focused sub-agent. Complete this specific task efficiently.
168
168
 
169
169
  TASK: ${t.task}
170
170
  ${t.context?`
@@ -194,8 +194,8 @@ ${w}
194
194
  ---
195
195
 
196
196
  `:"")+d+p}];M.push({role:"user",content:t.task});let{TOOL_DEFINITIONS:C,executeTool:S}=Gt(),O=dp(n),D=zb(C.filter(V=>!O.has(V.function.name)),y);if(f&&f.allowedTools&&(D=D.filter(V=>f.allowedTools.has(V.function.name))),g&&!t._skipLog){let V=y?` (${y})`:"";process.stderr.write(` [sub-agent: ${m}:${g}${V}]
197
- `)}let K={};m&&(K.provider=m),g&&(K.model=g);try{for(let X=0;X<s;X++){let B=await up(M,D,K);if(!B||typeof B!="object")throw new Error("Empty or invalid response from provider");{let xe=m||wi(),me=g||Jf();if(B.usage){let he=B.usage.prompt_tokens||0,Re=B.usage.completion_tokens||0;c.input+=he,c.output+=Re,tp(xe,me,he,Re)}else{let he=B.content||"",Re=M.map(x=>typeof x.content=="string"?x.content:Array.isArray(x.content)?x.content.map(E=>typeof E=="string"?E:E.text||"").join(""):"").join(" "),k=sp(Re),j=sp(he);c.input+=k,c.output+=j,c._estimated=!0,tp(xe,me,k,j)}}let R=B.content||"",$e=B.tool_calls,be={role:"assistant",content:R||""};if($e&&$e.length>0&&(be.tool_calls=$e),M.push(be),!$e||$e.length===0){for(let xe of l)Lo(xe);return{task:t.task,status:"done",result:R||"(no response)",toolsUsed:i,tokensUsed:c,modelSpec:m&&g?`${m}:${g}`:null}}let fe=$e.map(xe=>{let me=xe.function.name,he=ep(xe.function.arguments),Re=xe.id||`sub-${Date.now()}-${Math.random().toString(36).slice(2,6)}`;if(!he)return Promise.resolve({role:"tool",content:`ERROR: Malformed tool arguments for ${me}`,tool_call_id:Re});let k=null;if(e_.has(me)&&he.path){let x=require("path"),E=x.isAbsolute(he.path)?he.path:x.resolve(process.cwd(),he.path);if(t._readOnlyFiles&&t._readOnlyFiles.length>0){let A=x.relative(process.cwd(),E);if(t._readOnlyFiles.some(L=>A===L||A.startsWith(L+"/")||E===L||E.startsWith(L+"/")))return Promise.resolve({role:"tool",content:`ERROR: File '${he.path}' is owned by another agent and is READ ONLY. Write to your own scope files instead.`,tool_call_id:Re})}if(l.has(E)||!Qb(E,r))return Promise.resolve({role:"tool",content:`ERROR: File '${he.path}' is locked by another operation. Try a different approach or skip this file.`,tool_call_id:Re});l.add(E),k=E}return i.push(me),e.onUpdate&&e.onUpdate({type:"tool_call",tool:me,agentId:r}),(me==="spawn_agents"?gp(he,n+1):S(me,he,{autoConfirm:!0,silent:!0})).then(x=>{k&&(Lo(k),l.delete(k));let E=String(x??"");return{role:"tool",content:E.length>2e4?E.substring(0,2e4)+`
198
- ...(truncated)`:E,tool_call_id:Re}}).catch(x=>(k&&(Lo(k),l.delete(k)),{role:"tool",content:`ERROR: ${x.message}`,tool_call_id:Re}))}),pe=await Promise.all(fe);if(M.push(...pe),X>=7&&M.length>12)try{let{compressMessage:xe}=Rt(),me=M.length-6;for(let he=1;he<me;he++)M[he]._subAgentCompressed||(M[he]={...xe(M[he],"light"),_subAgentCompressed:!0})}catch{}for(let xe=0;xe<$e.length;xe++){let me=$e[xe];if(me.function.name==="bash_exec"){let he=ep(me.function.arguments);if((pe[xe]?.content||"").startsWith("ERROR")&&he&&he.command){let k=he.command.replace(/\s+/g," ").trim().slice(0,100);u.set(k,(u.get(k)||0)+1)}}}e.onUpdate&&e.onUpdate(`step ${X+1}/${s}`)}for(let X of l)Lo(X);let V=[...u.entries()].filter(([,X])=>X>=3).sort((X,B)=>B[1]-X[1]).slice(0,3).map(([X,B])=>`"${X}" (failed ${B}\xD7)`);return{task:t.task,status:"truncated",abortReason:"iteration_limit",repeatedFailures:V,result:M[M.length-1]?.content||"(max iterations reached)",toolsUsed:i,tokensUsed:c,modelSpec:m&&g?`${m}:${g}`:null}}catch(V){for(let X of l)Lo(X);return{task:t.task,status:"failed",result:`Error: ${V.message}`,toolsUsed:i,tokensUsed:c,modelSpec:m&&g?`${m}:${g}`:null}}}async function gp(t,e=0){if(e>=2)return"ERROR: max agent nesting depth (2) reached \u2014 reviewer agents cannot spawn further agents.";let n=e===0?Vb:Zb,o=e===0?ip:ap,s=(t.agents||[]).slice(0,n);if(s.length===0)return"ERROR: No agents specified";let r=e>0?" \u21B3 ":"",i=e>0?38:44,c=s.map(d=>kc(d)),l=s.map((d,f)=>{let p=c[f],h=p.model?` [${p.model}]`:"",m=d.task.substring(0,i-h.length);return`${r}Agent ${f+1}${h}: ${m}${d.task.length>m.length?"...":""}`}),u=new Jb(l);u.start();try{let d=s.map((g,y)=>{let w=c[y],v=Math.min(g.max_iterations||o,o),M=w.model?{...g,model:`${w.provider}:${w.model}`,_skipLog:!0,max_iterations:v}:{...g,_skipLog:!0,max_iterations:v};return hp(M,{onUpdate:()=>{}},e).then(C=>(u.update(y,C.status==="failed"?"error":"done"),C)).catch(C=>(u.update(y,"error"),{task:g.task,status:"failed",result:`Error: ${C.message}`,toolsUsed:[],tokensUsed:{input:0,output:0}}))}),f=await Promise.all(d);u.stop(),xc();let p=["Sub-agent results:",""],h=0,m=0;for(let g=0;g<f.length;g++){let y=f[g],w=y.status==="done"?"\u2713":y.status==="truncated"?"\u26A0":"\u2717",v=y.modelSpec?` [${y.modelSpec}]`:"";p.push(`${w} Agent ${g+1}${v}: ${y.task}`),p.push(` Status: ${y.status}`),p.push(` Tools used: ${y.toolsUsed.length>0?y.toolsUsed.join(", "):"none"}`),p.push(` Result: ${y.result}`),y.repeatedFailures&&y.repeatedFailures.length>0&&p.push(` Repeated failures: ${y.repeatedFailures.join("; ")}`),p.push(""),h+=y.tokensUsed.input,m+=y.tokensUsed.output}return p.push(`Total sub-agent tokens: ${h} input + ${m} output`),p.join(`
197
+ `)}let K={};m&&(K.provider=m),g&&(K.model=g);try{for(let X=0;X<s;X++){let B=await up(M,D,K);if(!B||typeof B!="object")throw new Error("Empty or invalid response from provider");{let xe=m||wi(),me=g||Jf();if(B.usage){let he=B.usage.prompt_tokens||0,Re=B.usage.completion_tokens||0;c.input+=he,c.output+=Re,tp(xe,me,he,Re)}else{let he=B.content||"",Re=M.map(x=>typeof x.content=="string"?x.content:Array.isArray(x.content)?x.content.map(E=>typeof E=="string"?E:E.text||"").join(""):"").join(" "),k=sp(Re),j=sp(he);c.input+=k,c.output+=j,c._estimated=!0,tp(xe,me,k,j)}}let R=B.content||"",ye=B.tool_calls,be={role:"assistant",content:R||""};if(ye&&ye.length>0&&(be.tool_calls=ye),M.push(be),!ye||ye.length===0){for(let xe of l)Lo(xe);return{task:t.task,status:"done",result:R||"(no response)",toolsUsed:i,tokensUsed:c,modelSpec:m&&g?`${m}:${g}`:null}}let fe=ye.map(xe=>{let me=xe.function.name,he=ep(xe.function.arguments),Re=xe.id||`sub-${Date.now()}-${Math.random().toString(36).slice(2,6)}`;if(!he)return Promise.resolve({role:"tool",content:`ERROR: Malformed tool arguments for ${me}`,tool_call_id:Re});let k=null;if(e_.has(me)&&he.path){let x=require("path"),E=x.isAbsolute(he.path)?he.path:x.resolve(process.cwd(),he.path);if(t._readOnlyFiles&&t._readOnlyFiles.length>0){let A=x.relative(process.cwd(),E);if(t._readOnlyFiles.some(L=>A===L||A.startsWith(L+"/")||E===L||E.startsWith(L+"/")))return Promise.resolve({role:"tool",content:`ERROR: File '${he.path}' is owned by another agent and is READ ONLY. Write to your own scope files instead.`,tool_call_id:Re})}if(l.has(E)||!Qb(E,r))return Promise.resolve({role:"tool",content:`ERROR: File '${he.path}' is locked by another operation. Try a different approach or skip this file.`,tool_call_id:Re});l.add(E),k=E}return i.push(me),e.onUpdate&&e.onUpdate({type:"tool_call",tool:me,agentId:r}),(me==="spawn_agents"?gp(he,n+1):S(me,he,{autoConfirm:!0,silent:!0})).then(x=>{k&&(Lo(k),l.delete(k));let E=String(x??"");return{role:"tool",content:E.length>2e4?E.substring(0,2e4)+`
198
+ ...(truncated)`:E,tool_call_id:Re}}).catch(x=>(k&&(Lo(k),l.delete(k)),{role:"tool",content:`ERROR: ${x.message}`,tool_call_id:Re}))}),pe=await Promise.all(fe);if(M.push(...pe),X>=7&&M.length>12)try{let{compressMessage:xe}=Rt(),me=M.length-6;for(let he=1;he<me;he++)M[he]._subAgentCompressed||(M[he]={...xe(M[he],"light"),_subAgentCompressed:!0})}catch{}for(let xe=0;xe<ye.length;xe++){let me=ye[xe];if(me.function.name==="bash_exec"){let he=ep(me.function.arguments);if((pe[xe]?.content||"").startsWith("ERROR")&&he&&he.command){let k=he.command.replace(/\s+/g," ").trim().slice(0,100);u.set(k,(u.get(k)||0)+1)}}}e.onUpdate&&e.onUpdate(`step ${X+1}/${s}`)}for(let X of l)Lo(X);let V=[...u.entries()].filter(([,X])=>X>=3).sort((X,B)=>B[1]-X[1]).slice(0,3).map(([X,B])=>`"${X}" (failed ${B}\xD7)`);return{task:t.task,status:"truncated",abortReason:"iteration_limit",repeatedFailures:V,result:M[M.length-1]?.content||"(max iterations reached)",toolsUsed:i,tokensUsed:c,modelSpec:m&&g?`${m}:${g}`:null}}catch(V){for(let X of l)Lo(X);return{task:t.task,status:"failed",result:`Error: ${V.message}`,toolsUsed:i,tokensUsed:c,modelSpec:m&&g?`${m}:${g}`:null}}}async function gp(t,e=0){if(e>=2)return"ERROR: max agent nesting depth (2) reached \u2014 reviewer agents cannot spawn further agents.";let n=e===0?Vb:Zb,o=e===0?ip:ap,s=(t.agents||[]).slice(0,n);if(s.length===0)return"ERROR: No agents specified";let r=e>0?" \u21B3 ":"",i=e>0?38:44,c=s.map(d=>kc(d)),l=s.map((d,f)=>{let p=c[f],h=p.model?` [${p.model}]`:"",m=d.task.substring(0,i-h.length);return`${r}Agent ${f+1}${h}: ${m}${d.task.length>m.length?"...":""}`}),u=new Jb(l);u.start();try{let d=s.map((g,y)=>{let w=c[y],v=Math.min(g.max_iterations||o,o),M=w.model?{...g,model:`${w.provider}:${w.model}`,_skipLog:!0,max_iterations:v}:{...g,_skipLog:!0,max_iterations:v};return hp(M,{onUpdate:()=>{}},e).then(C=>(u.update(y,C.status==="failed"?"error":"done"),C)).catch(C=>(u.update(y,"error"),{task:g.task,status:"failed",result:`Error: ${C.message}`,toolsUsed:[],tokensUsed:{input:0,output:0}}))}),f=await Promise.all(d);u.stop(),xc();let p=["Sub-agent results:",""],h=0,m=0;for(let g=0;g<f.length;g++){let y=f[g],w=y.status==="done"?"\u2713":y.status==="truncated"?"\u26A0":"\u2717",v=y.modelSpec?` [${y.modelSpec}]`:"";p.push(`${w} Agent ${g+1}${v}: ${y.task}`),p.push(` Status: ${y.status}`),p.push(` Tools used: ${y.toolsUsed.length>0?y.toolsUsed.join(", "):"none"}`),p.push(` Result: ${y.result}`),y.repeatedFailures&&y.repeatedFailures.length>0&&p.push(` Repeated failures: ${y.repeatedFailures.join("; ")}`),p.push(""),h+=y.tokensUsed.input,m+=y.tokensUsed.output}return p.push(`Total sub-agent tokens: ${h} input + ${m} output`),p.join(`
199
199
  `)}catch(d){return u.stop(),xc(),`ERROR: Sub-agent execution failed: ${d.message}`}}$p.exports={runSubAgent:hp,executeSpawnAgents:gp,clearAllLocks:xc,classifyTask:pp,pickModelForTier:mp,resolveSubAgentModel:kc,classifyError:vc,isRetryableError:lp,callWithRetry:up,getExcludedTools:dp,LOCK_TIMEOUT_MS:cp,SUB_AGENT_TYPES:fp}});var Do=Q((eR,Op)=>{var Ye=require("fs"),_n=require("path"),{atomicWrite:yp,withFileLockSync:wp}=An(),o_=new Set(["the","a","an","is","are","and","or","but","in","on","at","to","for","of","with","this","that","it","as","be","by","from","was","were","has","have","had","not","do","does","did","so","if","its","my","me","we","you","he","she","they","our","your","their","can","will","would","could","should","may","might","then","than","also","which","when","where","how","what","who","all","any","each","more","most","use","used","using","get","set","new","add","make","der","die","das","den","dem","des","ein","eine","einen","einem","eines","und","oder","aber","von","zu","mit","auf","bei","nach","aus","vor","ist","sind","war","hat","haben","wird","kann","soll","muss","nicht","auch","als","durch"]);function Js(){let t=_n.join(process.cwd(),".nex","brain");return Ye.existsSync(t)||Ye.mkdirSync(t,{recursive:!0}),t}function vi(){return _n.join(Js(),".brain-index.json")}function Tc(){return _n.join(Js(),".embeddings.json")}function Io(){let t=_n.join(process.cwd(),".nex","brain");if(!Ye.existsSync(t))return[];try{return Ye.readdirSync(t).filter(e=>e.endsWith(".md")&&!e.startsWith(".")).map(e=>{let n=_n.join(t,e),o=Ye.statSync(n);return{name:e.replace(/\.md$/,""),path:n,size:o.size,modified:new Date(o.mtimeMs)}}).sort((e,n)=>n.modified-e.modified)}catch{return[]}}function jo(t){let e={},n=t,o=t.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);if(o){let s=o[1].split(`
200
200
  `);for(let r of s){let i=r.match(/^(\w+):\s*(.+)$/);if(!i)continue;let c=i[1].trim(),l=i[2].trim();l.startsWith("[")&&l.endsWith("]")?e[c]=l.slice(1,-1).split(",").map(u=>u.trim()).filter(Boolean):e[c]=l}n=o[2]}return{frontmatter:e,body:n}}function bp(t){let e=_n.join(Js(),`${t}.md`);if(!Ye.existsSync(e))return{name:t,content:"",body:"",frontmatter:{}};let n=Ye.readFileSync(e,"utf-8"),{frontmatter:o,body:s}=jo(n);return{name:t,content:n,body:s,frontmatter:o}}function r_(t,e){let n=_n.join(Js(),`${t}.md`);yp(n,e),c_(t,e),i_()}function i_(){if(process.env.NEX_BRAIN_EMBEDDINGS==="false")return;let t=Tc();Ye.existsSync(t)&&setImmediate(async()=>{try{await Tp()}catch{}})}function a_(t){let e=_n.join(Js(),`${t}.md`);return Ye.existsSync(e)?(Ye.unlinkSync(e),l_(t),!0):!1}function xi(t){return t.toLowerCase().replace(/[^a-z0-9äöüß\s-]/g," ").split(/[\s-]+/).filter(e=>e.length>2&&!o_.has(e))}function Rc(t){let e={},{frontmatter:n,body:o}=jo(t),s=Array.isArray(n.tags)?n.tags:[];for(let i of s){let c=i.toLowerCase().replace(/[^a-z0-9-]/g,"");c.length>1&&(e[c]=(e[c]||0)+5)}let r=(o||t).split(`
201
201
  `);for(let i of r)if(i.startsWith("#")){let c=i.replace(/^#+\s*/,"");for(let l of xi(c))e[l]=(e[l]||0)+3}for(let i of xi(o||t))e[i]=(e[i]||0)+1;return e}function Cc(){let t=vi();if(!Ye.existsSync(t))return{documents:{}};try{return JSON.parse(Ye.readFileSync(t,"utf-8"))}catch{return{documents:{}}}}function Ac(t){yp(vi(),JSON.stringify(t,null,2))}function c_(t,e){wp(vi(),()=>{let n=Cc(),{frontmatter:o}=jo(e),s=Array.isArray(o.tags)?o.tags:[];n.documents[t]={keywords:Rc(e),tags:s,modified:new Date().toISOString()},Ac(n)})}function l_(t){wp(vi(),()=>{let e=Cc();delete e.documents[t],Ac(e)})}function Ec(){let t=Io(),e={documents:{}};for(let n of t){let o=Ye.readFileSync(n.path,"utf-8"),{frontmatter:s}=jo(o),r=Array.isArray(s.tags)?s.tags:[];e.documents[n.name]={keywords:Rc(o),tags:r,modified:n.modified.toISOString()}}return Ac(e),e}function _p(){let t=Cc(),e=Io();for(let n of e){let o=t.documents[n.name];if(!o||new Date(o.modified)<n.modified)return Ec()}for(let n of Object.keys(t.documents))if(!e.some(o=>o.name===n))return Ec();return t}function xp(t,e={}){let{topK:n=3,minScore:o=.1}=e,s=xi(t);if(s.length===0)return[];let r=_p(),i=[];for(let[c,l]of Object.entries(r.documents)){let u=0;for(let d of s){l.keywords[d]&&(u+=l.keywords[d]);for(let[f,p]of Object.entries(l.keywords))f!==d&&f.length>3&&d.length>3&&(f.includes(d)||d.includes(f))&&(u+=p*.3)}u>=o&&i.push({name:c,score:u})}return i.sort((c,l)=>l.score-c.score),i.slice(0,n)}var vp=process.env.NEX_EMBED_MODEL||"nomic-embed-text",Sc=400,u_=50;async function kp(){if(process.env.NEX_BRAIN_EMBEDDINGS==="false")return!1;try{let t=process.env.OLLAMA_HOST||"http://localhost:11434",e=require("http"),n=require("https"),o=new URL(`${t}/api/tags`),s=o.protocol==="https:"?n:e;return((await new Promise((c,l)=>{let u=s.get(o.toString(),{timeout:2e3},d=>{let f="";d.on("data",p=>f+=p),d.on("end",()=>{try{c(JSON.parse(f))}catch{l(new Error("bad json"))}})});u.on("error",l),u.on("timeout",()=>{u.destroy(),l(new Error("timeout"))})})).models||[]).map(c=>c.name).some(c=>c.startsWith(vp.split(":")[0]))}catch{return!1}}async function Oc(t){let e=process.env.OLLAMA_HOST||"http://localhost:11434",n=require("http"),o=require("https"),s=new URL(`${e}/api/embeddings`),r=s.protocol==="https:"?o:n,i=JSON.stringify({model:vp,prompt:t});return new Promise((c,l)=>{let u=r.request(s,{method:"POST",headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(i)},timeout:3e4},d=>{let f="";d.on("data",p=>f+=p),d.on("end",()=>{try{c(JSON.parse(f).embedding||[])}catch(p){l(p)}})});u.on("error",l),u.on("timeout",()=>{u.destroy(),l(new Error("embedding timeout"))}),u.write(i),u.end()})}function Sp(t,e){if(!t||!e||t.length!==e.length)return 0;let n=0,o=0,s=0;for(let i=0;i<t.length;i++)n+=t[i]*e[i],o+=t[i]*t[i],s+=e[i]*e[i];let r=Math.sqrt(o)*Math.sqrt(s);return r===0?0:n/r}function Ep(t){let e=t.split(/\s+/),n=[],o=0;for(;o<e.length;){let s=e.slice(o,o+Sc).join(" ");if(n.push({text:s,offset:o}),o+Sc>=e.length)break;o+=Sc-u_}return n}async function Tp(){let t=Io(),e={documents:{}},n=Tc();if(Ye.existsSync(n))try{e=JSON.parse(Ye.readFileSync(n,"utf-8"))}catch{}for(let o of t){let s=e.documents[o.name];if(s&&new Date(s.modified)>=o.modified)continue;let r=Ye.readFileSync(o.path,"utf-8"),i=Ep(r),c=[];for(let l of i){let u=await Oc(l.text);c.push({text:l.text,embedding:u,offset:l.offset})}e.documents[o.name]={chunks:c,modified:o.modified.toISOString()}}for(let o of Object.keys(e.documents))t.some(s=>s.name===o)||delete e.documents[o];return Ye.writeFileSync(n,JSON.stringify(e),"utf-8"),e}async function Rp(t,e={}){let{topK:n=3,minSimilarity:o=.3}=e,s=Tc();if(!Ye.existsSync(s))return[];let r;try{r=JSON.parse(Ye.readFileSync(s,"utf-8"))}catch{return[]}let i=await Oc(t),c=[];for(let[l,u]of Object.entries(r.documents||{})){let d=0,f="";for(let p of u.chunks||[]){let h=Sp(i,p.embedding);h>d&&(d=h,f=p.text)}d>=o&&c.push({name:l,score:d,bestChunk:f})}return c.sort((l,u)=>u.score-l.score),c.slice(0,n)}function Cp(t,e,n={}){let{k:o=60,topK:s=3}=n,r={};return t.forEach((i,c)=>{r[i.name]=(r[i.name]||0)+1/(o+c+1)}),e.forEach((i,c)=>{r[i.name]=(r[i.name]||0)+1/(o+c+1)}),Object.entries(r).map(([i,c])=>({name:i,score:c})).sort((i,c)=>c.score-i.score).slice(0,s)}async function Ap(t,e={}){let{topK:n=3,minScore:o=.1}=e,s=xp(t,{topK:n,minScore:o}),r=s;if(process.env.NEX_BRAIN_EMBEDDINGS!=="false")try{if(await kp()){let c=await Rp(t,{topK:n});r=Cp(s,c,{topK:n})}}catch{}return r.map(i=>{let c=bp(i.name),l=(c.body||c.content||"").slice(0,300).replace(/\n+/g," ")+"...";return{name:i.name,score:i.score,content:c.content,excerpt:l}})}var Xs={queryKey:null,result:null,ts:0},d_=3e5;async function f_(t){if(!t||!t.trim())return"";let e=_n.join(process.cwd(),".nex","brain");if(!Ye.existsSync(e)||Io().length===0)return"";let o=t.trim().toLowerCase().slice(0,200);if(Xs.result!==null&&Xs.queryKey===o&&Date.now()-Xs.ts<d_)return Xs.result;let s;try{s=await Ap(t,{topK:3})}catch{return""}if(!s||s.length===0)return"";let r;try{r=Rt().estimateTokens}catch{r=d=>Math.ceil(d.length/4)}let i=25e3,c=[],l=0;for(let d of s){let f=d.content||"",p=r(f);if(l+p>i){let m=i-l;if(m<100)break;let g=m/p;f=f.slice(0,Math.floor(f.length*g))+`
@@ -204,7 +204,7 @@ ${f}`),l+=r(f),l>=i)break}if(c.length===0)return Xs={queryKey:o,result:"",ts:Dat
204
204
 
205
205
  ${c.join(`
206
206
 
207
- `)}`;return Xs={queryKey:o,result:u,ts:Date.now()},u}Op.exports={getBrainDir:Js,listDocuments:Io,readDocument:bp,writeDocument:r_,removeDocument:a_,buildIndex:Ec,getIndex:_p,query:Ap,getBrainContext:f_,isEmbeddingAvailable:kp,generateEmbedding:Oc,buildEmbeddingIndex:Tp,semanticQuery:Rp,cosineSimilarity:Sp,_keywordQuery:xp,_extractKeywords:Rc,_chunkText:Ep,parseFrontmatter:jo,tokenize:xi,_fuseResults:Cp}});var cn=Q((tR,Wp)=>{var Ke=require("fs"),Ct=require("path"),p_=require("os"),{atomicWrite:ki,withFileLockSync:Np}=An(),qo=["user","feedback","project","reference"],m_=50;function rs(){return Ct.join(process.cwd(),".nex","memory")}function Vs(){return Ct.join(rs(),"memory.json")}function Mp(){return Ct.join(rs(),"MEMORY.md")}function h_(){return Ct.join(process.cwd(),"NEX.md")}function Pp(){return Ct.join(p_.homedir(),".nex","NEX.md")}function Si(){let t=rs();Ke.existsSync(t)||Ke.mkdirSync(t,{recursive:!0})}function Lp(t){let e=Ct.join(rs(),t);return Ke.existsSync(e)||Ke.mkdirSync(e,{recursive:!0}),e}function Fo(){let t=Vs();if(!Ke.existsSync(t))return{};try{return JSON.parse(Ke.readFileSync(t,"utf-8"))}catch{return{}}}function Ip(t){Si(),ki(Vs(),JSON.stringify(t,null,2))}function jp(){let t=Vs();if(!Ke.existsSync(t))return;let e=Fo(),n=Object.keys(e);if(n.length===0){try{Ke.renameSync(t,t+".bak")}catch{}return}for(let o of n){let s=e[o],r=s.value||String(s),i=o.replace(/[^a-z0-9_-]/gi,"-").toLowerCase().replace(/-+/g,"-").replace(/^-|-$/g,"");if(!i)continue;let c=Lp("project"),l=Ct.join(c,`${i}.md`),u=r.split(`
207
+ `)}`;return Xs={queryKey:o,result:u,ts:Date.now()},u}Op.exports={getBrainDir:Js,listDocuments:Io,readDocument:bp,writeDocument:r_,removeDocument:a_,buildIndex:Ec,getIndex:_p,query:Ap,getBrainContext:f_,isEmbeddingAvailable:kp,generateEmbedding:Oc,buildEmbeddingIndex:Tp,semanticQuery:Rp,cosineSimilarity:Sp,_keywordQuery:xp,_extractKeywords:Rc,_chunkText:Ep,parseFrontmatter:jo,tokenize:xi,_fuseResults:Cp}});var ln=Q((tR,Wp)=>{var Ke=require("fs"),Ct=require("path"),p_=require("os"),{atomicWrite:ki,withFileLockSync:Np}=An(),qo=["user","feedback","project","reference"],m_=50;function rs(){return Ct.join(process.cwd(),".nex","memory")}function Vs(){return Ct.join(rs(),"memory.json")}function Mp(){return Ct.join(rs(),"MEMORY.md")}function h_(){return Ct.join(process.cwd(),"NEX.md")}function Pp(){return Ct.join(p_.homedir(),".nex","NEX.md")}function Si(){let t=rs();Ke.existsSync(t)||Ke.mkdirSync(t,{recursive:!0})}function Lp(t){let e=Ct.join(rs(),t);return Ke.existsSync(e)||Ke.mkdirSync(e,{recursive:!0}),e}function Fo(){let t=Vs();if(!Ke.existsSync(t))return{};try{return JSON.parse(Ke.readFileSync(t,"utf-8"))}catch{return{}}}function Ip(t){Si(),ki(Vs(),JSON.stringify(t,null,2))}function jp(){let t=Vs();if(!Ke.existsSync(t))return;let e=Fo(),n=Object.keys(e);if(n.length===0){try{Ke.renameSync(t,t+".bak")}catch{}return}for(let o of n){let s=e[o],r=s.value||String(s),i=o.replace(/[^a-z0-9_-]/gi,"-").toLowerCase().replace(/-+/g,"-").replace(/^-|-$/g,"");if(!i)continue;let c=Lp("project"),l=Ct.join(c,`${i}.md`),u=r.split(`
208
208
  `)[0].slice(0,100),d=`---
209
209
  name: ${o}
210
210
  description: ${u}
@@ -473,7 +473,7 @@ ${d}`:d||"(empty log)"}case"find_large":{let l=e.path||"/",u=e.limit||20,d=e.min
473
473
  ${p}`:p||`(no files larger than ${d} in ${l})`}case"service":{if(!e.service_action)return"ERROR: service_action is required for action=service";if(e.service_action!=="list_failed"&&!e.service_name)return"ERROR: service_name is required (except for list_failed)";let l=e.service_name?e.service_name.includes(".")?e.service_name:`${e.service_name}.service`:"",u;switch(e.service_action){case"status":u=`systemctl status ${l} --no-pager -l 2>&1 | head -40`;break;case"list_failed":u="systemctl list-units --state=failed --no-legend 2>/dev/null";break;case"start":u=`systemctl start ${l} && systemctl status ${l} --no-pager -l 2>&1 | head -20`;break;case"stop":u=`systemctl stop ${l} && echo "${l} stopped"`;break;case"restart":u=`systemctl restart ${l} && systemctl status ${l} --no-pager -l 2>&1 | head -20`;break;case"reload":u=`systemctl reload ${l} 2>&1 || systemctl reload-or-restart ${l} 2>&1`;break;case"enable":u=`systemctl enable ${l} && echo "${l} enabled"`;break;case"disable":u=`systemctl disable ${l} && echo "${l} disabled"`;break;default:return`ERROR: Unknown service_action: ${e.service_action}`}let{out:d,exitCode:f}=await r(u,3e4);return f===0||e.service_action==="status"&&f===3?d||`service ${e.service_action} OK`:`EXIT ${f}
474
474
  ${d}`}case"kill_process":{if(!e.pid&&!e.process_name)return"ERROR: pid or process_name is required for kill_process";let l=e.signal||"SIGTERM",u;e.pid?u=`ps -p ${e.pid} -o pid,user,%cpu,%mem,etime,cmd 2>/dev/null && kill -${l} ${e.pid} && echo "Sent ${l} to PID ${e.pid}"`:u=`pgrep -a "${e.process_name}" 2>/dev/null | head -5 && pkill -${l} "${e.process_name}" && echo "Sent ${l} to all '${e.process_name}' processes"`;let{out:d,exitCode:f}=await r(u,15e3);return f!==0?`EXIT ${f}
475
475
  ${d}`:d}case"journalctl":{let l=e.lines||100,u=["journalctl","--no-pager","-n",String(l)];e.unit&&u.push("-u",e.unit.includes(".")?e.unit:`${e.unit}.service`),e.priority&&u.push("-p",e.priority),e.since&&u.push(`--since="${e.since}"`),u.push('2>/dev/null || echo "(journalctl not available)"');let{out:d,exitCode:f}=await r(u.join(" "),2e4);return f!==0?`EXIT ${f}
476
- ${d}`:d||"(no log entries)"}default:return`ERROR: Unknown sysadmin action: ${e.action}`}}case"save_memory":{let{saveMemory:o}=cn(),s=o(e.type,e.name,e.content,e.description);return s.ok?s.updated===!1?`Memory unchanged (duplicate): ${e.type}/${e.name}`:`Memory saved: ${e.type}/${e.name} \u2192 ${s.path}`:`ERROR: ${s.error}`}case"delete_memory":{let{deleteMemory:o}=cn();return o(e.type,e.name)?`Memory deleted: ${e.type}/${e.name}`:`Memory not found: ${e.type}/${e.name}`}default:{let{executePluginTool:o}=si(),s=await o(t,e,n);return s!==null?s:`ERROR: Unknown tool: ${t}`}}}async function J_(t,e,n={}){let{emit:o}=si(),{logToolExecution:s}=Lc(),r=Date.now(),i=n.silent?null:P_(t,e);if(!i){let l=await tm(t,e,n);return s({tool:t,args:e,result:l,duration:Date.now()-r,success:!l.startsWith?.("ERROR")}),await o("onToolResult",{tool:t,args:e,result:l}),l}let c=new M_(i);c.start();try{let l=await tm(t,e,n);return c.stop(),s({tool:t,args:e,result:l,duration:Date.now()-r,success:!l.startsWith?.("ERROR")}),await o("onToolResult",{tool:t,args:e,result:l}),l}catch(l){throw c.stop(),s({tool:t,args:e,result:l.message,duration:Date.now()-r,success:!1}),l}}om.exports={TOOL_DEFINITIONS:X_,executeTool:J_,resolvePath:vt,autoFixPath:Ci,autoFixEdit:sm,enrichBashError:nm,cancelPendingAskUser:G_,setAskUserHandler:Y_,fileExists:At}});var Gt=Q((iR,im)=>{im.exports=rm()});var Bc=Q((cR,am)=>{var{loadServerProfiles:Go,resolveProfile:aR,sshExec:V_}=Ks(),Uc={almalinux9:["Package manager: dnf (NOT apt). Install: dnf install <pkg>. Update: dnf update.","Service manager: systemctl. Logs: journalctl -u <service> -n 50.","Firewall: firewalld. Check: firewall-cmd --list-all. Open port: firewall-cmd --permanent --add-port=PORT/tcp && firewall-cmd --reload.","SELinux is active by default. Check: getenforce. Diagnose: ausearch -m avc -ts recent | audit2why. Fix context: restorecon -Rv /path.","Nginx config: /etc/nginx/. Test: nginx -t. Reload: systemctl reload nginx.","Process list: ps aux. Ports: ss -tuln.","Python: python3. Pip: pip3. Virtualenv: python3 -m venv."],almalinux8:["Package manager: dnf (NOT apt). Install: dnf install <pkg>. Update: dnf update.","Service manager: systemctl. Logs: journalctl -u <service> -n 50.","Firewall: firewalld. Check: firewall-cmd --list-all.","SELinux is active by default. Check: getenforce. Diagnose: ausearch -m avc -ts recent."],ubuntu:["Package manager: apt. Install: apt install <pkg>. Update: apt update && apt upgrade.","Service manager: systemctl. Logs: journalctl -u <service> -n 50.","Firewall: ufw. Status: ufw status. Allow port: ufw allow PORT/tcp.","SELinux NOT active by default (AppArmor instead). Check: aa-status."],debian:["Package manager: apt. Install: apt install <pkg>. Update: apt update && apt upgrade.","Service manager: systemctl. Logs: journalctl -u <service> -n 50.","Firewall: ufw or iptables."],macos:["Package manager: Homebrew (brew). Install: brew install <pkg>. Update: brew update && brew upgrade.","Service manager: launchctl (NOT systemctl). Start: brew services start <name>. List: brew services list.",`No systemd. No journalctl. Use: log show --predicate 'process == "nginx"' --last 1h instead.`,"Firewall: macOS built-in (pfctl or System Settings). Check: pfctl -s rules.","Process list: ps aux. Ports: lsof -i -n -P | grep LISTEN."]};function Z_(){let t=Go();if(Object.keys(t).length===0)return null;let n=["## Remote Servers (.nex/servers.json)"];n.push(""),n.push("Available server profiles (use with ssh_exec, ssh_upload, ssh_download, service_manage, service_logs, container_list, container_logs, container_exec, container_manage, deploy):");for(let[s,r]of Object.entries(t)){let i=r.user?`${r.user}@${r.host}`:r.host,c=r.port&&Number(r.port)!==22?`:${r.port}`:"",l=r.os?` \u2014 OS: ${r.os}`:"",u=r.sudo?", sudo available":"";n.push(`- **${s}**: ${i}${c}${l}${u}`)}let o=new Set;for(let s of Object.values(t))s.os&&Uc[s.os]&&o.add(s.os);if(o.size>0){n.push("");for(let s of o){let r={almalinux9:"AlmaLinux 9",almalinux8:"AlmaLinux 8",ubuntu:"Ubuntu",debian:"Debian",macos:"macOS"}[s]||s;n.push(`### ${r} Notes`);for(let i of Uc[s])n.push(`- ${i}`)}}return n.join(`
476
+ ${d}`:d||"(no log entries)"}default:return`ERROR: Unknown sysadmin action: ${e.action}`}}case"save_memory":{let{saveMemory:o}=ln(),s=o(e.type,e.name,e.content,e.description);return s.ok?s.updated===!1?`Memory unchanged (duplicate): ${e.type}/${e.name}`:`Memory saved: ${e.type}/${e.name} \u2192 ${s.path}`:`ERROR: ${s.error}`}case"delete_memory":{let{deleteMemory:o}=ln();return o(e.type,e.name)?`Memory deleted: ${e.type}/${e.name}`:`Memory not found: ${e.type}/${e.name}`}default:{let{executePluginTool:o}=si(),s=await o(t,e,n);return s!==null?s:`ERROR: Unknown tool: ${t}`}}}async function J_(t,e,n={}){let{emit:o}=si(),{logToolExecution:s}=Lc(),r=Date.now(),i=n.silent?null:P_(t,e);if(!i){let l=await tm(t,e,n);return s({tool:t,args:e,result:l,duration:Date.now()-r,success:!l.startsWith?.("ERROR")}),await o("onToolResult",{tool:t,args:e,result:l}),l}let c=new M_(i);c.start();try{let l=await tm(t,e,n);return c.stop(),s({tool:t,args:e,result:l,duration:Date.now()-r,success:!l.startsWith?.("ERROR")}),await o("onToolResult",{tool:t,args:e,result:l}),l}catch(l){throw c.stop(),s({tool:t,args:e,result:l.message,duration:Date.now()-r,success:!1}),l}}om.exports={TOOL_DEFINITIONS:X_,executeTool:J_,resolvePath:vt,autoFixPath:Ci,autoFixEdit:sm,enrichBashError:nm,cancelPendingAskUser:G_,setAskUserHandler:Y_,fileExists:At}});var Gt=Q((iR,im)=>{im.exports=rm()});var Bc=Q((cR,am)=>{var{loadServerProfiles:Go,resolveProfile:aR,sshExec:V_}=Ks(),Uc={almalinux9:["Package manager: dnf (NOT apt). Install: dnf install <pkg>. Update: dnf update.","Service manager: systemctl. Logs: journalctl -u <service> -n 50.","Firewall: firewalld. Check: firewall-cmd --list-all. Open port: firewall-cmd --permanent --add-port=PORT/tcp && firewall-cmd --reload.","SELinux is active by default. Check: getenforce. Diagnose: ausearch -m avc -ts recent | audit2why. Fix context: restorecon -Rv /path.","Nginx config: /etc/nginx/. Test: nginx -t. Reload: systemctl reload nginx.","Process list: ps aux. Ports: ss -tuln.","Python: python3. Pip: pip3. Virtualenv: python3 -m venv."],almalinux8:["Package manager: dnf (NOT apt). Install: dnf install <pkg>. Update: dnf update.","Service manager: systemctl. Logs: journalctl -u <service> -n 50.","Firewall: firewalld. Check: firewall-cmd --list-all.","SELinux is active by default. Check: getenforce. Diagnose: ausearch -m avc -ts recent."],ubuntu:["Package manager: apt. Install: apt install <pkg>. Update: apt update && apt upgrade.","Service manager: systemctl. Logs: journalctl -u <service> -n 50.","Firewall: ufw. Status: ufw status. Allow port: ufw allow PORT/tcp.","SELinux NOT active by default (AppArmor instead). Check: aa-status."],debian:["Package manager: apt. Install: apt install <pkg>. Update: apt update && apt upgrade.","Service manager: systemctl. Logs: journalctl -u <service> -n 50.","Firewall: ufw or iptables."],macos:["Package manager: Homebrew (brew). Install: brew install <pkg>. Update: brew update && brew upgrade.","Service manager: launchctl (NOT systemctl). Start: brew services start <name>. List: brew services list.",`No systemd. No journalctl. Use: log show --predicate 'process == "nginx"' --last 1h instead.`,"Firewall: macOS built-in (pfctl or System Settings). Check: pfctl -s rules.","Process list: ps aux. Ports: lsof -i -n -P | grep LISTEN."]};function Z_(){let t=Go();if(Object.keys(t).length===0)return null;let n=["## Remote Servers (.nex/servers.json)"];n.push(""),n.push("Available server profiles (use with ssh_exec, ssh_upload, ssh_download, service_manage, service_logs, container_list, container_logs, container_exec, container_manage, deploy):");for(let[s,r]of Object.entries(t)){let i=r.user?`${r.user}@${r.host}`:r.host,c=r.port&&Number(r.port)!==22?`:${r.port}`:"",l=r.os?` \u2014 OS: ${r.os}`:"",u=r.sudo?", sudo available":"";n.push(`- **${s}**: ${i}${c}${l}${u}`)}let o=new Set;for(let s of Object.values(t))s.os&&Uc[s.os]&&o.add(s.os);if(o.size>0){n.push("");for(let s of o){let r={almalinux9:"AlmaLinux 9",almalinux8:"AlmaLinux 8",ubuntu:"Ubuntu",debian:"Debian",macos:"macOS"}[s]||s;n.push(`### ${r} Notes`);for(let i of Uc[s])n.push(`- ${i}`)}}return n.join(`
477
477
  `)}function Q_(t){let e=Go();return Object.values(e).some(n=>n.os&&n.os.startsWith(t))}function ex(){return Object.keys(Go())}function tx(){let t=require("fs"),n=require("path").join(process.cwd(),"NEX.md"),o="";try{o=t.readFileSync(n,"utf-8")}catch{}let s=Go(),r=Object.keys(s);if(r.length===0)return null;let i=["server","deploy","remote","ssh","service","systemctl","production","linux","almalinux","ubuntu","debian"],c=o.toLowerCase();if(!i.some(p=>c.includes(p)))return null;let u=r.map(p=>{let h=s[p],m=h.user?`${h.user}@${h.host}`:h.host,g=h.port&&Number(h.port)!==22?`:${h.port}`:"";return` - **${p}**: ${m}${g}${h.os?` (${h.os})`:""}`}).join(`
478
478
  `),d=r.map(p=>s[p].log_path).filter(Boolean),f=d.length>0?`
479
479
  - Server log paths: ${d.join(", ")}`:"";return`# Deployment Context (Auto-detected)
@@ -518,9 +518,9 @@ ${c}`),l&&l.length>0){let u=l.map(d=>` ${d.file}`).join(`
518
518
  `);s.push(`MERGE CONFLICTS (resolve before editing these files):
519
519
  ${u}`)}try{let u=ox();u&&s.push(u)}catch{}return s.join(`
520
520
 
521
- `)}async function px(t){let e=$t.join(t,"package.json"),n="";if(await Ln(()=>zt.access(e).then(()=>!0).catch(()=>!1)))try{let i=await zt.readFile(e,"utf-8"),c=JSON.parse(i);n=`${c.name||"?"} v${c.version||"?"}`}catch{}let[s,r]=await Promise.all([Ln(async()=>{let{stdout:i}=await Ai("git branch --show-current",{cwd:t,timeout:5e3});return i.trim()}),lm()]);if(r&&r.length>0){console.log(`${Zs.red} \u26A0 ${r.length} unresolved merge conflict(s):${Zs.reset}`);for(let i of r)console.log(`${Zs.red} ${i.file}${Zs.reset}`);console.log(`${Zs.yellow} \u2192 Resolve conflicts before starting tasks${Zs.reset}`)}console.log()}um.exports={gatherProjectContext:fx,printContext:px,generateFileTree:cx,_clearContextCache:()=>{Wc.clear(),Qs.clear(),Oi=null}}});var Jt=Q((uR,pm)=>{var Xt=require("fs"),Mi=require("path"),{atomicWrite:mx}=An();function zo(){return Mi.join(process.cwd(),".nex","sessions")}function Hc(){let t=zo();Xt.existsSync(t)||Xt.mkdirSync(t,{recursive:!0})}function Kc(t){let e=t.replace(/[^a-zA-Z0-9_-]/g,"_").substring(0,100);return Mi.join(zo(),`${e}.json`)}function Gc(t,e,n={}){Hc();let o=Kc(t),s={name:t,createdAt:n.createdAt||new Date().toISOString(),updatedAt:new Date().toISOString(),messageCount:e.length,model:n.model||null,provider:n.provider||null,messages:e};return mx(o,JSON.stringify(s,null,2)),{path:o,name:t}}function dm(t){let e=Kc(t);if(!Xt.existsSync(e))return null;try{return JSON.parse(Xt.readFileSync(e,"utf-8"))}catch{return null}}function fm(){Hc();let t=zo(),e=Xt.readdirSync(t).filter(o=>o.endsWith(".json")),n=[];for(let o of e)try{let s=JSON.parse(Xt.readFileSync(Mi.join(t,o),"utf-8"));n.push({name:s.name||o.replace(".json",""),createdAt:s.createdAt,updatedAt:s.updatedAt,messageCount:s.messageCount||0,model:s.model,provider:s.provider,score:s.score!=null?s.score:null,scoreGrade:s.scoreGrade||null})}catch{}return n.sort((o,s)=>(s.updatedAt||"").localeCompare(o.updatedAt||""))}function hx(t){let e=Kc(t);return Xt.existsSync(e)?(Xt.unlinkSync(e),!0):!1}function gx(){let t=fm();return t.length===0?null:dm(t[0].name)}var cs=null,xn=null,Yo=null;function $x(t,e={}){t.length!==0&&(cs&&clearTimeout(cs),xn=t,Yo=e||{},cs=setTimeout(()=>{xn&&xn.length>0&&Gc("_autosave",xn,Yo),cs=null,xn=null,Yo=null},5e3))}function yx(){cs&&(clearTimeout(cs),cs=null),xn&&xn.length>0&&(Gc("_autosave",xn,Yo),xn=null,Yo=null)}function wx(){Hc();let t=zo(),e=Xt.readdirSync(t).filter(r=>r.endsWith(".json")),n=new Date,o=new Date(n.getTime()-720*60*60*1e3),s=0;for(let r of e){let i=Mi.join(t,r);try{let c=Xt.statSync(i);new Date(c.mtime)<o&&(Xt.unlinkSync(i),s++)}catch{}}return s}pm.exports={saveSession:Gc,loadSession:dm,listSessions:fm,deleteSession:hx,getLastSession:gx,autoSave:$x,flushAutoSave:yx,clearOldSessions:wx,_getSessionsDir:zo}});var Pi=Q((dR,_m)=>{"use strict";var Xo=require("fs"),mm=require("path");function hm(t){let e=[];return t.forEach((n,o)=>{n.role==="assistant"&&(Array.isArray(n.content)&&n.content.forEach(s=>{s&&s.type==="tool_use"&&e.push({name:s.name||"",input:s.input||{},index:o,id:s.id||null})}),Array.isArray(n.tool_calls)&&n.tool_calls.forEach(s=>{let r=s.function?.name||s.name||"",i={};try{i=typeof s.function?.arguments=="string"?JSON.parse(s.function.arguments):s.function?.arguments||s.input||{}}catch{}e.push({name:r,input:i,index:o,id:s.id||null})}))}),e}function bx(t){let e=new Set;return t.forEach(n=>{n.role==="tool"&&typeof n.content=="string"&&n.content.startsWith("BLOCKED:")&&n.tool_call_id&&e.add(n.tool_call_id),n.role==="user"&&Array.isArray(n.content)&&n.content.forEach(o=>{o&&o.type==="tool_result"&&o.tool_use_id&&typeof o.content=="string"&&o.content.startsWith("BLOCKED:")&&e.add(o.tool_use_id)})}),e}function gm(t){let e=[];return t.forEach((n,o)=>{if(n.role==="user"&&Array.isArray(n.content)&&n.content.forEach(s=>{if(s&&s.type==="tool_result"){let r=typeof s.content=="string"?s.content:Array.isArray(s.content)?s.content.map(i=>typeof i=="string"?i:i.text||"").join(""):JSON.stringify(s.content||"");e.push({content:r,index:o})}}),n.role==="tool"){let s=typeof n.content=="string"?n.content:JSON.stringify(n.content||"");e.push({content:s,index:o})}}),e}function $m(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.role==="assistant"){if(typeof n.content=="string")return n.content.trim();if(Array.isArray(n.content)){let o=n.content.filter(s=>s&&(s.type==="text"||typeof s=="string")).map(s=>typeof s=="string"?s:s.text||"").join("").trim();if(o)return o}}}return""}function ym(t,e){let n=[];for(let o=t.length-1;o>=0&&n.length<e;o--){let s=t[o];if(s.role!=="assistant")continue;let r="";typeof s.content=="string"?r=s.content.trim():Array.isArray(s.content)&&(r=s.content.filter(i=>i&&(i.type==="text"||typeof i=="string")).map(i=>typeof i=="string"?i:i.text||"").join("").trim()),r&&n.push(r)}return n}function wm(t){let e=new Map;for(let n of t){let o;try{o=JSON.stringify(n.input)}catch{o=String(n.input)}let s=`${n.name}|${o}`;e.set(s,(e.get(s)||0)+1)}return e}function bm(t){if(!Array.isArray(t)||t.length===0)return{score:0,issues:["Empty or invalid session \u2014 no messages to analyse"],summary:"No messages found"};let e=10,n=[],o=hm(t),s=gm(t),r=o.length,i=bx(t),c=o.filter(k=>!k.id||!i.has(k.id));t.some(k=>k.role==="user"&&typeof k.content=="string"&&k.content.startsWith("[SYSTEM WARNING]")&&(k.content.includes("edited")||k.content.includes("bash command")||k.content.includes("grep pattern")||k.content.includes("re-read")||k.content.includes("already in your context")))&&(e-=2,n.push("Loop-warning was fired during session (repeated file edits, bash commands, or re-reads)"));let u=o.find(k=>{let j=k.input?.command||k.input?.cmd||"";return/\bsed\s+-n\b/.test(j)});if(u){let k=(u.input?.command||u.input?.cmd||"").slice(0,80);s.some(x=>x.content.includes("BLOCKED: sed -n is forbidden")||x.content.includes("BLOCKED: sed -n"))?(e-=.25,n.push(`sed -n attempted but blocked by agent guard: ${k}`)):(e-=1.5,n.push(`sed -n anti-pattern used: ${k}`))}o.find(k=>{if(k.name!=="grep"&&k.name!=="bash"&&k.name!=="ssh_exec")return!1;let j=k.input?.command||k.input?.cmd||"",x=k.input?.pattern||"",E=`${j} ${x}`;return/(?:-[CAB]|--context|--after|--before)\s*[=\s]?([2-9][1-9]|\d{3,})/.test(E)||/grep.*-[CAB]\s*([2-9][1-9]|\d{3,})/.test(E)})&&(e-=1,n.push("grep used with >20 context lines (context flood risk)"));let f=t.some(k=>k.role==="assistant"),p=$m(t),m=ym(t,3).some(k=>k.length>100&&!/^[^.!]{0,40}\?$/.test(k));if(f&&!m&&(p.length<80||/^[^.!]{0,40}\?$/.test(p))){e-=2;let k=p.length>0?`"${p.slice(0,60)}..."`:"(no assistant text found)";n.push(`Session ends without diagnosis \u2014 last response too short or is only a question: ${k}`)}r>40?(e-=1.5,n.push(`Excessive tool calls: ${r} (>40 threshold)`)):r>25&&(e-=.5,n.push(`High tool call count: ${r} (>25 threshold)`)),t.some(k=>{let j=typeof k.content=="string"?k.content:Array.isArray(k.content)?k.content.map(x=>typeof x=="string"?x:x.text||"").join(""):"";return/\[auto-compressed|context compacted|force-compressed/.test(j)})&&(e-=.5,n.push("Auto-compress triggered (context flood indicator)"));let w=wm(c),v=0,M="";for(let[k,j]of w)j>v&&(v=j,M=k);if(v>=3){let[k]=M.split("|");e-=1,n.push(`Same tool call repeated ${v}\xD7 (tool: ${k})`)}let C=!1,S=t.findIndex(k=>k.role==="user"&&typeof k.content=="string"&&k.content.includes("[SYSTEM STOP]")&&k.content.includes('"valid":true'));S>=0&&o.filter(j=>j.index>S).length>0&&(C=!0),C&&(e-=1.5,n.push('Stop-trigger ignored: tool result contained "valid":true but session continued with more tool calls'));let O=o.filter(k=>k.name==="ssh_exec");if(O.length>=8){let k=0,j=1;for(let x=1;x<O.length;x++)O[x].index<=O[x-1].index+2?j++:(k=Math.max(k,j),j=1);k=Math.max(k,j),k>=8&&(e-=.5,n.push(`SSH reconnect storm: ${k} consecutive SSH calls`))}f&&O.length>0&&/\b(Könntest du|könntest du|Bitte (bereitstellen|kopier)|kannst du mir .* bereitstellen|could you (provide|share|paste)|please (provide|share|run .* and paste)|I (cannot|can't) access the server|nicht (auf den Server )?zugreifen|SSH .* (nicht verfügbar|unavailable|temporarily unavailable))\b/i.test(p)&&(e-=2,n.push("Surrender: model asked user to manually provide server output instead of gathering it"));let D=new Map;for(let k of c)if(k.name==="read_file"&&k.input?.path){let j=k.input.path;D.has(j)||D.set(j,{count:0,ranges:[]});let x=D.get(j);if(x.count++,k.input.line_start!=null){let E=k.input.line_start||1,A=k.input.line_end||E+350;x.ranges.push([E,A])}}function K(k,j,x){for(let[E,A]of x){let T=Math.max(k,E),L=Math.min(j,A);if(L>T){let ae=L-T,se=j-k||1;if(ae/se>=.7)return!0}}return!1}let V=0,X="";for(let[k,j]of D){if(j.count<3)continue;if(j.ranges.length===j.count){let A=!1,T=[];for(let[L,ae]of j.ranges){if(T.length>0&&K(L,ae,T)){A=!0;break}T.push([L,ae])}if(!A)continue}if(j.count-j.ranges.length<=2&&j.ranges.length>=1){let A=!1,T=[];for(let[L,ae]of j.ranges){if(T.length>0&&K(L,ae,T)){A=!0;break}T.push([L,ae])}if(!A)continue}j.count>V&&(V=j.count,X=k)}if(V>=3){e-=1;let k=X.split("/").slice(-2).join("/");n.push(`read_file loop: "${k}" read ${V}\xD7 (file already in context)`)}let B=0,R="";for(let[k,j]of D){if(j.ranges.length<4)continue;let x=[],E=!1;for(let[A,T]of j.ranges){if(x.length>0&&K(A,T,x)){E=!0;break}x.push([A,T])}!E&&j.ranges.length>B&&(B=j.ranges.length,R=k)}if(B>=4){e-=.5;let k=R.split("/").slice(-2).join("/");n.push(`File-scroll pattern: "${k}" read in ${B} sequential sections \u2014 use grep instead`)}let $e=new Map;for(let k of c)if(k.name==="grep"&&k.input?.path&&k.input?.pattern){let j=k.input.path;$e.has(j)||$e.set(j,new Set),$e.get(j).add(k.input.pattern)}let be=0,fe="";for(let[k,j]of $e)k.split("/").pop().includes(".")&&j.size>be&&(be=j.size,fe=k);if(be>=3){e-=.75;let k=fe.split("/").slice(-2).join("/");n.push(`grep flood on single file: "${k}" searched ${be}\xD7 with different patterns (file already in context)`)}{let k=new Set,j=new Set,x=/^(test_|demo_|temp_|tmp_|scratch_)/;for(let A of o){if(A.name==="write_file"&&A.input?.path){let T=A.input.path.split("/").pop(),L=A.input.path.includes("/tests/");x.test(T)&&!L&&k.add(A.input.path)}if((A.name==="bash"||A.name==="ssh_exec")&&A.input?.command){let T=A.input.command.match(/\brm\s+(?:-\w+\s+)?(\S+)/g);if(T)for(let L of T){let ae=L.split(/\s+/),se=ae[ae.length-1];for(let we of k)(we.endsWith(se)||se.endsWith(we.split("/").pop()))&&j.add(we)}}}let E=j.size;if(E>=1){let A=Math.min(E*.25,.5);e-=A;let T=[...j].map(L=>L.split("/").pop()).join(", ");n.push(`Temp file write-then-delete: ${T} \u2014 write inline logic or use tests/ instead`)}}let pe=s.filter(k=>k.content.startsWith("EXIT")).length;pe>=10?(e-=1,n.push(`Bash exit-error storm: ${pe} tool results started with EXIT (repeated failing commands)`)):pe>=5&&(e-=.5,n.push(`Repeated bash errors: ${pe} tool results with non-zero exit code`));for(let k of t){if(k.role!=="assistant")continue;let j="";if(typeof k.content=="string"?j=k.content:Array.isArray(k.content)&&(j=k.content.filter(se=>se&&(se.type==="text"||typeof se=="string")).map(se=>typeof se=="string"?se:se.text||"").join("")),j.length<=5e3)continue;let x=j.split(/(?<=\. )/).filter(se=>se.trim().length>0);if(x.length<6)continue;let E=new Map;for(let se=0;se<=x.length-3;se++){let we=x.slice(se,se+3).join("").trim();we.length>30&&E.set(we,(E.get(we)||0)+1)}let A=0,T="";for(let[se,we]of E)we>A&&(A=we,T=se);if(A<3)continue;let ae=T.length*A/j.length;if(ae>=.4||A>=10){e-=1.5,n.push(`llm output loop: assistant message repeated content detected (${A}\xD7 same paragraph, ${Math.round(ae*100)}% repeated)`);break}}{let k=new Set(["read_file","list_directory","search_files","glob","grep"]),j=t.some(E=>Array.isArray(E.tool_calls)?E.tool_calls.some(A=>k.has(A.function?.name)):Array.isArray(E.content)?E.content.some(A=>A.type==="tool_use"&&k.has(A.name)):!1);t.some(E=>E.role==="assistant"&&typeof E.content=="string"&&(E.content.includes("## Steps")||E.content.includes("/plan approve")))&&!j&&(e-=2,n.push("plan written without reading any files \u2014 LLM invented data structures from training knowledge (hallucination risk)"))}let xe=s.filter(k=>k.content.startsWith("BLOCKED:")&&!k.content.includes("BLOCKED: sed -n")&&!k.content.includes("SSH paused")&&!k.content.includes("SSH temporarily paused"));if(xe.length>0){let k=Math.min(xe.length*.5,1.5);e-=k,n.push(`${xe.length} tool call${xe.length===1?"":"s"} blocked (agent attempted denied actions)`)}let me=t.filter(k=>{let j=typeof k.content=="string"?k.content:"";return/\[SYSTEM WARNING\] Context wiped \d+×/.test(j)}).length;if(me>0){let k=Math.min(me*1,2);e-=k,n.push(`Super-nuclear context wipe fired ${me}\xD7 (context collapse \u2014 task too large or read loops)`)}{let k=!1,j=!1,x=!1;for(let A of o){if(A.name!=="bash")continue;let T=(A.input?.command||A.input?.cmd||"").trim();!(/cat\s*>/.test(T)||/<</.test(T))&&/\bcat\s+\S/.test(T)&&(k=!0),/^\s*ls(\s|$)/.test(T)&&!/npm|yarn|pnpm|make|git\b/.test(T)&&(j=!0),/\bfind\s+\S/.test(T)&&!/git\b|npm\b|-exec\b/.test(T)&&(x=!0)}let E=[k,j,x].filter(Boolean).length;if(E>0){let A=Math.min(E*.25,.75);e-=A;let T=[];k&&T.push("cat (use read_file)"),j&&T.push("ls (use list_directory)"),x&&T.push("find (use glob)"),n.push(`bash used instead of dedicated tool: ${T.join(", ")}`)}}{let k=o.some(T=>(T.name==="write_file"||T.name==="Write")&&T.input?.path&&(T.input.path.endsWith("requirements.txt")||T.input.path.endsWith("Pipfile")||T.input.path.endsWith("pyproject.toml"))),j=o.some(T=>(T.name==="write_file"||T.name==="Write")&&T.input?.path&&T.input.path.endsWith("package.json")),x=o.filter(T=>(T.name==="bash"||T.name==="Bash")&&T.input?.command).map(T=>T.input.command),E=x.some(T=>/pip\s+install|python\s+-m\s+venv/.test(T)),A=x.some(T=>/npm\s+install/.test(T));k&&!E?(e-=1,n.push("wrote requirements.txt but never ran pip install \u2014 environment not bootstrapped")):j&&!A&&o.some(L=>(L.name==="write_file"||L.name==="Write")&&L.input?.path&&/(\/src\/|index\.js|App\.js|main\.js)/.test(L.input.path))&&(e-=.75,n.push("created new React/Node project but never ran npm install \u2014 project is not runnable"))}if(f){let k=t.find(T=>T.role==="assistant"),j="";k&&(typeof k.content=="string"?j=k.content:Array.isArray(k.content)&&(j=k.content.filter(T=>T&&(T.type==="text"||typeof T=="string")).map(T=>typeof T=="string"?T:T.text||"").join("")));let x=j.slice(0,400),E=/^[\d\s\+\-\*\/×÷\(\)\.]+\s*=\s*[\d\s\+\-\*\/×÷\(\)\.]+[.\n]/m,A=x.split(`
521
+ `)}async function px(t){let e=$t.join(t,"package.json"),n="";if(await Ln(()=>zt.access(e).then(()=>!0).catch(()=>!1)))try{let i=await zt.readFile(e,"utf-8"),c=JSON.parse(i);n=`${c.name||"?"} v${c.version||"?"}`}catch{}let[s,r]=await Promise.all([Ln(async()=>{let{stdout:i}=await Ai("git branch --show-current",{cwd:t,timeout:5e3});return i.trim()}),lm()]);if(r&&r.length>0){console.log(`${Zs.red} \u26A0 ${r.length} unresolved merge conflict(s):${Zs.reset}`);for(let i of r)console.log(`${Zs.red} ${i.file}${Zs.reset}`);console.log(`${Zs.yellow} \u2192 Resolve conflicts before starting tasks${Zs.reset}`)}console.log()}um.exports={gatherProjectContext:fx,printContext:px,generateFileTree:cx,_clearContextCache:()=>{Wc.clear(),Qs.clear(),Oi=null}}});var Jt=Q((uR,pm)=>{var Xt=require("fs"),Mi=require("path"),{atomicWrite:mx}=An();function zo(){return Mi.join(process.cwd(),".nex","sessions")}function Hc(){let t=zo();Xt.existsSync(t)||Xt.mkdirSync(t,{recursive:!0})}function Kc(t){let e=t.replace(/[^a-zA-Z0-9_-]/g,"_").substring(0,100);return Mi.join(zo(),`${e}.json`)}function Gc(t,e,n={}){Hc();let o=Kc(t),s={name:t,createdAt:n.createdAt||new Date().toISOString(),updatedAt:new Date().toISOString(),messageCount:e.length,model:n.model||null,provider:n.provider||null,messages:e};return mx(o,JSON.stringify(s,null,2)),{path:o,name:t}}function dm(t){let e=Kc(t);if(!Xt.existsSync(e))return null;try{return JSON.parse(Xt.readFileSync(e,"utf-8"))}catch{return null}}function fm(){Hc();let t=zo(),e=Xt.readdirSync(t).filter(o=>o.endsWith(".json")),n=[];for(let o of e)try{let s=JSON.parse(Xt.readFileSync(Mi.join(t,o),"utf-8"));n.push({name:s.name||o.replace(".json",""),createdAt:s.createdAt,updatedAt:s.updatedAt,messageCount:s.messageCount||0,model:s.model,provider:s.provider,score:s.score!=null?s.score:null,scoreGrade:s.scoreGrade||null})}catch{}return n.sort((o,s)=>(s.updatedAt||"").localeCompare(o.updatedAt||""))}function hx(t){let e=Kc(t);return Xt.existsSync(e)?(Xt.unlinkSync(e),!0):!1}function gx(){let t=fm();return t.length===0?null:dm(t[0].name)}var cs=null,xn=null,Yo=null;function $x(t,e={}){t.length!==0&&(cs&&clearTimeout(cs),xn=t,Yo=e||{},cs=setTimeout(()=>{xn&&xn.length>0&&Gc("_autosave",xn,Yo),cs=null,xn=null,Yo=null},5e3))}function yx(){cs&&(clearTimeout(cs),cs=null),xn&&xn.length>0&&(Gc("_autosave",xn,Yo),xn=null,Yo=null)}function wx(){Hc();let t=zo(),e=Xt.readdirSync(t).filter(r=>r.endsWith(".json")),n=new Date,o=new Date(n.getTime()-720*60*60*1e3),s=0;for(let r of e){let i=Mi.join(t,r);try{let c=Xt.statSync(i);new Date(c.mtime)<o&&(Xt.unlinkSync(i),s++)}catch{}}return s}pm.exports={saveSession:Gc,loadSession:dm,listSessions:fm,deleteSession:hx,getLastSession:gx,autoSave:$x,flushAutoSave:yx,clearOldSessions:wx,_getSessionsDir:zo}});var Pi=Q((dR,_m)=>{"use strict";var Xo=require("fs"),mm=require("path");function hm(t){let e=[];return t.forEach((n,o)=>{n.role==="assistant"&&(Array.isArray(n.content)&&n.content.forEach(s=>{s&&s.type==="tool_use"&&e.push({name:s.name||"",input:s.input||{},index:o,id:s.id||null})}),Array.isArray(n.tool_calls)&&n.tool_calls.forEach(s=>{let r=s.function?.name||s.name||"",i={};try{i=typeof s.function?.arguments=="string"?JSON.parse(s.function.arguments):s.function?.arguments||s.input||{}}catch{}e.push({name:r,input:i,index:o,id:s.id||null})}))}),e}function bx(t){let e=new Set;return t.forEach(n=>{n.role==="tool"&&typeof n.content=="string"&&n.content.startsWith("BLOCKED:")&&n.tool_call_id&&e.add(n.tool_call_id),n.role==="user"&&Array.isArray(n.content)&&n.content.forEach(o=>{o&&o.type==="tool_result"&&o.tool_use_id&&typeof o.content=="string"&&o.content.startsWith("BLOCKED:")&&e.add(o.tool_use_id)})}),e}function gm(t){let e=[];return t.forEach((n,o)=>{if(n.role==="user"&&Array.isArray(n.content)&&n.content.forEach(s=>{if(s&&s.type==="tool_result"){let r=typeof s.content=="string"?s.content:Array.isArray(s.content)?s.content.map(i=>typeof i=="string"?i:i.text||"").join(""):JSON.stringify(s.content||"");e.push({content:r,index:o})}}),n.role==="tool"){let s=typeof n.content=="string"?n.content:JSON.stringify(n.content||"");e.push({content:s,index:o})}}),e}function $m(t){for(let e=t.length-1;e>=0;e--){let n=t[e];if(n.role==="assistant"){if(typeof n.content=="string")return n.content.trim();if(Array.isArray(n.content)){let o=n.content.filter(s=>s&&(s.type==="text"||typeof s=="string")).map(s=>typeof s=="string"?s:s.text||"").join("").trim();if(o)return o}}}return""}function ym(t,e){let n=[];for(let o=t.length-1;o>=0&&n.length<e;o--){let s=t[o];if(s.role!=="assistant")continue;let r="";typeof s.content=="string"?r=s.content.trim():Array.isArray(s.content)&&(r=s.content.filter(i=>i&&(i.type==="text"||typeof i=="string")).map(i=>typeof i=="string"?i:i.text||"").join("").trim()),r&&n.push(r)}return n}function wm(t){let e=new Map;for(let n of t){let o;try{o=JSON.stringify(n.input)}catch{o=String(n.input)}let s=`${n.name}|${o}`;e.set(s,(e.get(s)||0)+1)}return e}function bm(t){if(!Array.isArray(t)||t.length===0)return{score:0,issues:["Empty or invalid session \u2014 no messages to analyse"],summary:"No messages found"};let e=10,n=[],o=hm(t),s=gm(t),r=o.length,i=bx(t),c=o.filter(k=>!k.id||!i.has(k.id));t.some(k=>k.role==="user"&&typeof k.content=="string"&&k.content.startsWith("[SYSTEM WARNING]")&&(k.content.includes("edited")||k.content.includes("bash command")||k.content.includes("grep pattern")||k.content.includes("re-read")||k.content.includes("already in your context")))&&(e-=2,n.push("Loop-warning was fired during session (repeated file edits, bash commands, or re-reads)"));let u=o.find(k=>{let j=k.input?.command||k.input?.cmd||"";return/\bsed\s+-n\b/.test(j)});if(u){let k=(u.input?.command||u.input?.cmd||"").slice(0,80);s.some(x=>x.content.includes("BLOCKED: sed -n is forbidden")||x.content.includes("BLOCKED: sed -n"))?(e-=.25,n.push(`sed -n attempted but blocked by agent guard: ${k}`)):(e-=1.5,n.push(`sed -n anti-pattern used: ${k}`))}o.find(k=>{if(k.name!=="grep"&&k.name!=="bash"&&k.name!=="ssh_exec")return!1;let j=k.input?.command||k.input?.cmd||"",x=k.input?.pattern||"",E=`${j} ${x}`;return/(?:-[CAB]|--context|--after|--before)\s*[=\s]?([2-9][1-9]|\d{3,})/.test(E)||/grep.*-[CAB]\s*([2-9][1-9]|\d{3,})/.test(E)})&&(e-=1,n.push("grep used with >20 context lines (context flood risk)"));let f=t.some(k=>k.role==="assistant"),p=$m(t),m=ym(t,3).some(k=>k.length>100&&!/^[^.!]{0,40}\?$/.test(k));if(f&&!m&&(p.length<80||/^[^.!]{0,40}\?$/.test(p))){e-=2;let k=p.length>0?`"${p.slice(0,60)}..."`:"(no assistant text found)";n.push(`Session ends without diagnosis \u2014 last response too short or is only a question: ${k}`)}r>40?(e-=1.5,n.push(`Excessive tool calls: ${r} (>40 threshold)`)):r>25&&(e-=.5,n.push(`High tool call count: ${r} (>25 threshold)`)),t.some(k=>{let j=typeof k.content=="string"?k.content:Array.isArray(k.content)?k.content.map(x=>typeof x=="string"?x:x.text||"").join(""):"";return/\[auto-compressed|context compacted|force-compressed/.test(j)})&&(e-=.5,n.push("Auto-compress triggered (context flood indicator)"));let w=wm(c),v=0,M="";for(let[k,j]of w)j>v&&(v=j,M=k);if(v>=3){let[k]=M.split("|");e-=1,n.push(`Same tool call repeated ${v}\xD7 (tool: ${k})`)}let C=!1,S=t.findIndex(k=>k.role==="user"&&typeof k.content=="string"&&k.content.includes("[SYSTEM STOP]")&&k.content.includes('"valid":true'));S>=0&&o.filter(j=>j.index>S).length>0&&(C=!0),C&&(e-=1.5,n.push('Stop-trigger ignored: tool result contained "valid":true but session continued with more tool calls'));let O=o.filter(k=>k.name==="ssh_exec");if(O.length>=8){let k=0,j=1;for(let x=1;x<O.length;x++)O[x].index<=O[x-1].index+2?j++:(k=Math.max(k,j),j=1);k=Math.max(k,j),k>=8&&(e-=.5,n.push(`SSH reconnect storm: ${k} consecutive SSH calls`))}f&&O.length>0&&/\b(Könntest du|könntest du|Bitte (bereitstellen|kopier)|kannst du mir .* bereitstellen|could you (provide|share|paste)|please (provide|share|run .* and paste)|I (cannot|can't) access the server|nicht (auf den Server )?zugreifen|SSH .* (nicht verfügbar|unavailable|temporarily unavailable))\b/i.test(p)&&(e-=2,n.push("Surrender: model asked user to manually provide server output instead of gathering it"));let D=new Map;for(let k of c)if(k.name==="read_file"&&k.input?.path){let j=k.input.path;D.has(j)||D.set(j,{count:0,ranges:[]});let x=D.get(j);if(x.count++,k.input.line_start!=null){let E=k.input.line_start||1,A=k.input.line_end||E+350;x.ranges.push([E,A])}}function K(k,j,x){for(let[E,A]of x){let T=Math.max(k,E),L=Math.min(j,A);if(L>T){let ie=L-T,se=j-k||1;if(ie/se>=.7)return!0}}return!1}let V=0,X="";for(let[k,j]of D){if(j.count<3)continue;if(j.ranges.length===j.count){let A=!1,T=[];for(let[L,ie]of j.ranges){if(T.length>0&&K(L,ie,T)){A=!0;break}T.push([L,ie])}if(!A)continue}if(j.count-j.ranges.length<=2&&j.ranges.length>=1){let A=!1,T=[];for(let[L,ie]of j.ranges){if(T.length>0&&K(L,ie,T)){A=!0;break}T.push([L,ie])}if(!A)continue}j.count>V&&(V=j.count,X=k)}if(V>=3){e-=1;let k=X.split("/").slice(-2).join("/");n.push(`read_file loop: "${k}" read ${V}\xD7 (file already in context)`)}let B=0,R="";for(let[k,j]of D){if(j.ranges.length<4)continue;let x=[],E=!1;for(let[A,T]of j.ranges){if(x.length>0&&K(A,T,x)){E=!0;break}x.push([A,T])}!E&&j.ranges.length>B&&(B=j.ranges.length,R=k)}if(B>=4){e-=.5;let k=R.split("/").slice(-2).join("/");n.push(`File-scroll pattern: "${k}" read in ${B} sequential sections \u2014 use grep instead`)}let ye=new Map;for(let k of c)if(k.name==="grep"&&k.input?.path&&k.input?.pattern){let j=k.input.path;ye.has(j)||ye.set(j,new Set),ye.get(j).add(k.input.pattern)}let be=0,fe="";for(let[k,j]of ye)k.split("/").pop().includes(".")&&j.size>be&&(be=j.size,fe=k);if(be>=3){e-=.75;let k=fe.split("/").slice(-2).join("/");n.push(`grep flood on single file: "${k}" searched ${be}\xD7 with different patterns (file already in context)`)}{let k=new Set,j=new Set,x=/^(test_|demo_|temp_|tmp_|scratch_)/;for(let A of o){if(A.name==="write_file"&&A.input?.path){let T=A.input.path.split("/").pop(),L=A.input.path.includes("/tests/");x.test(T)&&!L&&k.add(A.input.path)}if((A.name==="bash"||A.name==="ssh_exec")&&A.input?.command){let T=A.input.command.match(/\brm\s+(?:-\w+\s+)?(\S+)/g);if(T)for(let L of T){let ie=L.split(/\s+/),se=ie[ie.length-1];for(let ge of k)(ge.endsWith(se)||se.endsWith(ge.split("/").pop()))&&j.add(ge)}}}let E=j.size;if(E>=1){let A=Math.min(E*.25,.5);e-=A;let T=[...j].map(L=>L.split("/").pop()).join(", ");n.push(`Temp file write-then-delete: ${T} \u2014 write inline logic or use tests/ instead`)}}let pe=s.filter(k=>k.content.startsWith("EXIT")).length;pe>=10?(e-=1,n.push(`Bash exit-error storm: ${pe} tool results started with EXIT (repeated failing commands)`)):pe>=5&&(e-=.5,n.push(`Repeated bash errors: ${pe} tool results with non-zero exit code`));for(let k of t){if(k.role!=="assistant")continue;let j="";if(typeof k.content=="string"?j=k.content:Array.isArray(k.content)&&(j=k.content.filter(se=>se&&(se.type==="text"||typeof se=="string")).map(se=>typeof se=="string"?se:se.text||"").join("")),j.length<=5e3)continue;let x=j.split(/(?<=\. )/).filter(se=>se.trim().length>0);if(x.length<6)continue;let E=new Map;for(let se=0;se<=x.length-3;se++){let ge=x.slice(se,se+3).join("").trim();ge.length>30&&E.set(ge,(E.get(ge)||0)+1)}let A=0,T="";for(let[se,ge]of E)ge>A&&(A=ge,T=se);if(A<3)continue;let ie=T.length*A/j.length;if(ie>=.4||A>=10){e-=1.5,n.push(`llm output loop: assistant message repeated content detected (${A}\xD7 same paragraph, ${Math.round(ie*100)}% repeated)`);break}}{let k=new Set(["read_file","list_directory","search_files","glob","grep"]),j=t.some(E=>Array.isArray(E.tool_calls)?E.tool_calls.some(A=>k.has(A.function?.name)):Array.isArray(E.content)?E.content.some(A=>A.type==="tool_use"&&k.has(A.name)):!1);t.some(E=>E.role==="assistant"&&typeof E.content=="string"&&(E.content.includes("## Steps")||E.content.includes("/plan approve")))&&!j&&(e-=2,n.push("plan written without reading any files \u2014 LLM invented data structures from training knowledge (hallucination risk)"))}let xe=s.filter(k=>k.content.startsWith("BLOCKED:")&&!k.content.includes("BLOCKED: sed -n")&&!k.content.includes("SSH paused")&&!k.content.includes("SSH temporarily paused"));if(xe.length>0){let k=Math.min(xe.length*.5,1.5);e-=k,n.push(`${xe.length} tool call${xe.length===1?"":"s"} blocked (agent attempted denied actions)`)}let me=t.filter(k=>{let j=typeof k.content=="string"?k.content:"";return/\[SYSTEM WARNING\] Context wiped \d+×/.test(j)}).length;if(me>0){let k=Math.min(me*1,2);e-=k,n.push(`Super-nuclear context wipe fired ${me}\xD7 (context collapse \u2014 task too large or read loops)`)}{let k=!1,j=!1,x=!1;for(let A of o){if(A.name!=="bash")continue;let T=(A.input?.command||A.input?.cmd||"").trim();!(/cat\s*>/.test(T)||/<</.test(T))&&/\bcat\s+\S/.test(T)&&(k=!0),/^\s*ls(\s|$)/.test(T)&&!/npm|yarn|pnpm|make|git\b/.test(T)&&(j=!0),/\bfind\s+\S/.test(T)&&!/git\b|npm\b|-exec\b/.test(T)&&(x=!0)}let E=[k,j,x].filter(Boolean).length;if(E>0){let A=Math.min(E*.25,.75);e-=A;let T=[];k&&T.push("cat (use read_file)"),j&&T.push("ls (use list_directory)"),x&&T.push("find (use glob)"),n.push(`bash used instead of dedicated tool: ${T.join(", ")}`)}}{let k=o.some(T=>(T.name==="write_file"||T.name==="Write")&&T.input?.path&&(T.input.path.endsWith("requirements.txt")||T.input.path.endsWith("Pipfile")||T.input.path.endsWith("pyproject.toml"))),j=o.some(T=>(T.name==="write_file"||T.name==="Write")&&T.input?.path&&T.input.path.endsWith("package.json")),x=o.filter(T=>(T.name==="bash"||T.name==="Bash")&&T.input?.command).map(T=>T.input.command),E=x.some(T=>/pip\s+install|python\s+-m\s+venv/.test(T)),A=x.some(T=>/npm\s+install/.test(T));k&&!E?(e-=1,n.push("wrote requirements.txt but never ran pip install \u2014 environment not bootstrapped")):j&&!A&&o.some(L=>(L.name==="write_file"||L.name==="Write")&&L.input?.path&&/(\/src\/|index\.js|App\.js|main\.js)/.test(L.input.path))&&(e-=.75,n.push("created new React/Node project but never ran npm install \u2014 project is not runnable"))}if(f){let k=t.find(T=>T.role==="assistant"),j="";k&&(typeof k.content=="string"?j=k.content:Array.isArray(k.content)&&(j=k.content.filter(T=>T&&(T.type==="text"||typeof T=="string")).map(T=>typeof T=="string"?T:T.text||"").join("")));let x=j.slice(0,400),E=/^[\d\s\+\-\*\/×÷\(\)\.]+\s*=\s*[\d\s\+\-\*\/×÷\(\)\.]+[.\n]/m,A=x.split(`
522
522
  `).find(T=>{let L=T.trim();return L.length>0&&L.length<=30&&/^\d/.test(L)&&/=/.test(L)&&!/[a-zA-Z]/.test(L)});if(E.test(x)||A){e-=1.5;let T=(A||x.split(`
523
- `)[0]).trim().slice(0,40);n.push(`Thinking-chain leak: non-sequitur artifact at response start: "${T}"`)}}if(f&&r>0){let k=t.findIndex(x=>x.role==="assistant"),j=t.findIndex(x=>!!(Array.isArray(x.tool_calls)&&x.tool_calls.length>0||Array.isArray(x.content)&&x.content.some(E=>E&&E.type==="tool_use")));if(k!==-1&&j!==-1&&k<j){let x=t[k],E="";typeof x.content=="string"?E=x.content:Array.isArray(x.content)&&(E=x.content.filter(L=>L&&(L.type==="text"||typeof L=="string")).map(L=>typeof L=="string"?L:L.text||"").join(""));let A=/ssh\s+\S+@\S+\s+"[^"]*\/[^"]*\./.test(E),T=/\/(?:home|var|etc|usr|opt|root|srv|data)\/[a-zA-Z0-9_.\-\/]+\.[a-zA-Z]{2,5}/.test(E);(A||T)&&(e-=1,n.push("Answer-before-verify: model gave concrete file paths/SSH commands before making any tool calls (paths guessed, not verified)"))}}if(f){let k=p;if(k.length>100){let x=(k.match(/^```/gm)||[]).length%2!==0,E=/"\s*:\s*$/.test(k.trimEnd()),A=/[,\[{]\s*$/.test(k.trimEnd());(x||E||A)&&(e-=.75,n.push("Truncated response: last assistant message ends mid-code-block or mid-JSON (model hit token limit)"))}}{let k=[];t.forEach((x,E)=>{let A=[];Array.isArray(x.tool_calls)&&x.tool_calls.forEach(T=>{if((T.function?.name||T.name||"")==="read_file"){let ae={};try{ae=typeof T.function?.arguments=="string"?JSON.parse(T.function.arguments):T.function?.arguments||{}}catch{}(ae.path||"").endsWith(".json")&&A.push({id:T.id,path:ae.path})}}),Array.isArray(x.content)&&x.content.forEach(T=>{T&&T.type==="tool_use"&&T.name==="read_file"&&(T.input?.path||"").endsWith(".json")&&A.push({id:T.id,path:T.input.path})}),A.forEach(T=>k.push({...T,msgIdx:E}))});let j=0;for(let x of k){let E=null;for(let T of t){if(T.role==="tool"&&T.tool_call_id===x.id&&typeof T.content=="string"){E=T.content;break}if(T.role==="user"&&Array.isArray(T.content)){let L=T.content.find(ae=>ae&&ae.type==="tool_result"&&ae.tool_use_id===x.id);if(L){E=typeof L.content=="string"?L.content:"";break}}}if(!E)continue;E.split(`
523
+ `)[0]).trim().slice(0,40);n.push(`Thinking-chain leak: non-sequitur artifact at response start: "${T}"`)}}if(f&&r>0){let k=t.findIndex(x=>x.role==="assistant"),j=t.findIndex(x=>!!(Array.isArray(x.tool_calls)&&x.tool_calls.length>0||Array.isArray(x.content)&&x.content.some(E=>E&&E.type==="tool_use")));if(k!==-1&&j!==-1&&k<j){let x=t[k],E="";typeof x.content=="string"?E=x.content:Array.isArray(x.content)&&(E=x.content.filter(L=>L&&(L.type==="text"||typeof L=="string")).map(L=>typeof L=="string"?L:L.text||"").join(""));let A=/ssh\s+\S+@\S+\s+"[^"]*\/[^"]*\./.test(E),T=/\/(?:home|var|etc|usr|opt|root|srv|data)\/[a-zA-Z0-9_.\-\/]+\.[a-zA-Z]{2,5}/.test(E);(A||T)&&(e-=1,n.push("Answer-before-verify: model gave concrete file paths/SSH commands before making any tool calls (paths guessed, not verified)"))}}if(f){let k=p;if(k.length>100){let x=(k.match(/^```/gm)||[]).length%2!==0,E=/"\s*:\s*$/.test(k.trimEnd()),A=/[,\[{]\s*$/.test(k.trimEnd());(x||E||A)&&(e-=.75,n.push("Truncated response: last assistant message ends mid-code-block or mid-JSON (model hit token limit)"))}}{let k=[];t.forEach((x,E)=>{let A=[];Array.isArray(x.tool_calls)&&x.tool_calls.forEach(T=>{if((T.function?.name||T.name||"")==="read_file"){let ie={};try{ie=typeof T.function?.arguments=="string"?JSON.parse(T.function.arguments):T.function?.arguments||{}}catch{}(ie.path||"").endsWith(".json")&&A.push({id:T.id,path:ie.path})}}),Array.isArray(x.content)&&x.content.forEach(T=>{T&&T.type==="tool_use"&&T.name==="read_file"&&(T.input?.path||"").endsWith(".json")&&A.push({id:T.id,path:T.input.path})}),A.forEach(T=>k.push({...T,msgIdx:E}))});let j=0;for(let x of k){let E=null;for(let T of t){if(T.role==="tool"&&T.tool_call_id===x.id&&typeof T.content=="string"){E=T.content;break}if(T.role==="user"&&Array.isArray(T.content)){let L=T.content.find(ie=>ie&&ie.type==="tool_result"&&ie.tool_use_id===x.id);if(L){E=typeof L.content=="string"?L.content:"";break}}}if(!E)continue;E.split(`
524
524
  `).filter(T=>T.trim()).length<5&&/^\s*\[/.test(E)&&!/\]\s*$/.test(E.trimEnd())&&j++}j>=1&&(e-=.75,n.push(`Shallow JSON read: ${j} .json file${j>1?"s":""} read with < 5 lines \u2014 array was incomplete, model drew conclusions from truncated data`))}{let k=s.filter(j=>/argument errors?/i.test(j.content)||/missing required (argument|parameter)/i.test(j.content)||/invalid argument/i.test(j.content));k.length>=3?(e-=.75,n.push(`Repeated tool argument errors: ${k.length} tool calls returned argument errors \u2014 model couldn't correct its tool usage`)):k.length>=2&&(e-=.25,n.push(`Tool argument errors: ${k.length} tool calls returned argument errors`))}{let k=!1,j=0,x=0;for(let E of c){if((E.name==="bash"||E.name==="Bash")&&E.input?.command&&/git\s+commit\b/.test(E.input.command)){k&&(x=Math.max(x,j)),k=!0,j=0;continue}k&&(E.name==="bash"||E.name==="Bash")&&E.input?.command&&/git\s+(status|diff|log|show)\b/.test(E.input.command)&&j++}x=Math.max(x,j),x>=3&&(e-=.75,n.push(`Post-commit verification waste: ${x} git status/diff/log calls after commit`))}e=Math.max(0,Math.min(10,e)),e=Math.round(e*10)/10;let he=e>=9?"A":e>=8?"B":e>=7?"C":e>=6?"D":"F",Re=n.length===0?`Clean session \u2014 no quality issues detected (${r} tool calls)`:`${n.length} issue${n.length===1?"":"s"} found \u2014 ${r} tool calls`;return{score:e,grade:he,issues:n,summary:Re}}function _x(t){try{let{loadSession:e}=Jt(),n=e(t);return n?bm(n.messages||[]):null}catch{return null}}function xx(t,e=null){let{score:n,issues:o}=t,s=e?.dim||"",r=e?.reset||"",i=e?.yellow||"";if(n>=8||o.length===0)return"";let c=o.map(d=>d.replace(/:\s+\d+.*$/,"").replace(/\s*\(.*?\)/,"").replace(/\s*—.*$/,""));if(n>=6){let d=c.slice(0,3),f=c.length-d.length,p=d.join(" \xB7 ");return f>0&&(p+=` (+${f})`),`
525
525
  ${s}${p}${r}`}let l="";for(let d of c.slice(0,4))l+=`
526
526
  ${i}\u26A0${r} ${s}${d}${r}`;let u=c.length-4;return u>0&&(l+=`
@@ -535,7 +535,7 @@ A: |
535
535
  ${e.assistant.split(`
536
536
  `).map(o=>` ${o}`).join(`
537
537
  `)}
538
- `;ls.writeFileSync(Qo.join(eo,`${t}.md`),n,"utf-8")}Am.exports={getFewShotForInput:Nx,loadExampleForCategory:Cm,listAvailableExamples:Mx,savePrivateExample:Px,PRIVATE_EXAMPLES_DIR:eo,BUNDLED_EXAMPLES_DIR:zc}});var tr=Q((hR,Im)=>{var Ot=require("fs"),to=require("path"),{C:mR}=Fe(),{atomicWrite:Lx,withFileLockSync:Ix}=An(),Ii={bash:"ask",read_file:"allow",write_file:"ask",edit_file:"ask",list_directory:"allow",search_files:"allow",glob:"allow",grep:"allow",patch_file:"ask",web_fetch:"allow",web_search:"allow",ask_user:"allow",task_list:"allow",spawn_agents:"ask",ssh_exec:"allow",ssh_upload:"ask",ssh_download:"ask"},no={...Ii};function Nm(){let t=to.join(process.cwd(),".nex","config.json");if(Ot.existsSync(t))try{let e=JSON.parse(Ot.readFileSync(t,"utf-8"));e.permissions&&(no={...Ii,...e.permissions})}catch{}}function jx(){let t=to.join(process.cwd(),".nex"),e=to.join(t,"config.json");Ot.existsSync(t)||Ot.mkdirSync(t,{recursive:!0}),Ix(e,()=>{let n={};if(Ot.existsSync(e))try{n=JSON.parse(Ot.readFileSync(e,"utf-8"))}catch{n={}}n.permissions=no,Lx(e,JSON.stringify(n,null,2))})}function Mm(t){return no[t]||"ask"}function Dx(t,e){return["allow","ask","deny"].includes(e)?(no[t]=e,!0):!1}function qx(t){return Mm(t)}function Fx(){return Object.entries(no).map(([t,e])=>({tool:t,mode:e}))}function Ux(){no={...Ii}}var er={readonly:{description:"Read-only access \u2014 can search and read but not modify",allowedTools:["read_file","list_directory","search_files","glob","grep","git_status","git_diff","git_log","ask_user","web_fetch","web_search","browser_open","browser_screenshot","task_list"],blockedTools:["bash","write_file","edit_file","patch_file","deploy","ssh_exec","service_manage","container_manage","container_exec","remote_agent"],autoConfirm:!1,allowDangerous:!1},developer:{description:"Standard developer access \u2014 can read, write, and run commands",allowedTools:null,blockedTools:["deploy","service_manage","container_manage","remote_agent"],autoConfirm:!1,allowDangerous:!1},admin:{description:"Full access \u2014 all tools, including deployment and infrastructure",allowedTools:null,blockedTools:[],autoConfirm:!1,allowDangerous:!0}};function Pm(){let t=to.join(process.cwd(),".nex","config.json");try{return Ot.existsSync(t)&&JSON.parse(Ot.readFileSync(t,"utf-8")).teamPermissions||null}catch{return null}}function Bx(t){let e=to.join(process.cwd(),".nex"),n=to.join(e,"config.json");Ot.existsSync(e)||Ot.mkdirSync(e,{recursive:!0});let o={};try{Ot.existsSync(n)&&(o=JSON.parse(Ot.readFileSync(n,"utf-8")))}catch{o={}}o.teamPermissions=t,Ot.writeFileSync(n,JSON.stringify(o,null,2),"utf-8")}function Lm(){let t=Pm();if(!t)return er.admin;let e=t.role||"admin",n=er[e]||er.admin;return{...n,...t.overrides,blockedTools:[...n.blockedTools||[],...t.overrides?.blockedTools||[]]}}function Wx(t){let e=Lm();return e.blockedTools&&e.blockedTools.includes(t)?{allowed:!1,reason:`Tool "${t}" is blocked by permission preset "${e.description||"custom"}"`}:e.allowedTools&&!e.allowedTools.includes(t)?{allowed:!1,reason:`Tool "${t}" is not in the allowed list for this permission level`}:{allowed:!0}}function Hx(){return Object.entries(er).map(([t,e])=>({name:t,description:e.description,toolCount:e.allowedTools?`${e.allowedTools.length} allowed`:"all allowed",blockedCount:e.blockedTools.length}))}Nm();Im.exports={getPermission:Mm,setPermission:Dx,checkPermission:qx,listPermissions:Fx,loadPermissions:Nm,savePermissions:jx,resetPermissions:Ux,DEFAULT_PERMISSIONS:Ii,PERMISSION_PRESETS:er,loadPresetConfig:Pm,savePresetConfig:Bx,getEffectivePreset:Lm,isToolAllowed:Wx,listPresets:Hx}});var ln=Q(($R,Um)=>{var ds=require("fs"),ji=require("path"),gR=require("readline"),{C:Me}=Fe(),Oe=null,Jc=!1,Vc=null,jm=new Set(["read_file","list_directory","search_files","glob","grep","web_search","web_fetch","git_status","git_diff","git_log","git_show"]);function Di(){return ji.join(process.cwd(),".nex","plans")}function Dm(){let t=Di();ds.existsSync(t)||ds.mkdirSync(t,{recursive:!0})}function Kx(t,e=[]){return Oe={name:`plan-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,task:t,steps:e.map(n=>({description:n.description||n,files:n.files||[],status:"pending"})),status:"draft",createdAt:new Date().toISOString()},Oe}function Gx(){return Oe}function Yx(t){Jc=t}function zx(){return Jc}function Xx(){return!Oe||Oe.status!=="draft"?!1:(Oe.status="approved",Oe.updatedAt=new Date().toISOString(),!0)}function Jx(){return!Oe||Oe.status!=="approved"?!1:(Oe.status="executing",!0)}function Xc(t,e){return!Oe||t<0||t>=Oe.steps.length?!1:(Oe.steps[t].status=e,Oe.updatedAt=new Date().toISOString(),Oe.steps.every(n=>n.status==="done"||n.status==="skipped")&&(Oe.status="completed"),!0)}function Vx(t){if(!t)return`${Me.dim}No active plan${Me.reset}`;let e={draft:`${Me.yellow}DRAFT${Me.reset}`,approved:`${Me.green}APPROVED${Me.reset}`,executing:`${Me.blue}EXECUTING${Me.reset}`,completed:`${Me.green}COMPLETED${Me.reset}`},n=[];n.push(`
538
+ `;ls.writeFileSync(Qo.join(eo,`${t}.md`),n,"utf-8")}Am.exports={getFewShotForInput:Nx,loadExampleForCategory:Cm,listAvailableExamples:Mx,savePrivateExample:Px,PRIVATE_EXAMPLES_DIR:eo,BUNDLED_EXAMPLES_DIR:zc}});var tr=Q((hR,Im)=>{var Ot=require("fs"),to=require("path"),{C:mR}=Fe(),{atomicWrite:Lx,withFileLockSync:Ix}=An(),Ii={bash:"ask",read_file:"allow",write_file:"ask",edit_file:"ask",list_directory:"allow",search_files:"allow",glob:"allow",grep:"allow",patch_file:"ask",web_fetch:"allow",web_search:"allow",ask_user:"allow",task_list:"allow",spawn_agents:"ask",ssh_exec:"allow",ssh_upload:"ask",ssh_download:"ask"},no={...Ii};function Nm(){let t=to.join(process.cwd(),".nex","config.json");if(Ot.existsSync(t))try{let e=JSON.parse(Ot.readFileSync(t,"utf-8"));e.permissions&&(no={...Ii,...e.permissions})}catch{}}function jx(){let t=to.join(process.cwd(),".nex"),e=to.join(t,"config.json");Ot.existsSync(t)||Ot.mkdirSync(t,{recursive:!0}),Ix(e,()=>{let n={};if(Ot.existsSync(e))try{n=JSON.parse(Ot.readFileSync(e,"utf-8"))}catch{n={}}n.permissions=no,Lx(e,JSON.stringify(n,null,2))})}function Mm(t){return no[t]||"ask"}function Dx(t,e){return["allow","ask","deny"].includes(e)?(no[t]=e,!0):!1}function qx(t){return Mm(t)}function Fx(){return Object.entries(no).map(([t,e])=>({tool:t,mode:e}))}function Ux(){no={...Ii}}var er={readonly:{description:"Read-only access \u2014 can search and read but not modify",allowedTools:["read_file","list_directory","search_files","glob","grep","git_status","git_diff","git_log","ask_user","web_fetch","web_search","browser_open","browser_screenshot","task_list"],blockedTools:["bash","write_file","edit_file","patch_file","deploy","ssh_exec","service_manage","container_manage","container_exec","remote_agent"],autoConfirm:!1,allowDangerous:!1},developer:{description:"Standard developer access \u2014 can read, write, and run commands",allowedTools:null,blockedTools:["deploy","service_manage","container_manage","remote_agent"],autoConfirm:!1,allowDangerous:!1},admin:{description:"Full access \u2014 all tools, including deployment and infrastructure",allowedTools:null,blockedTools:[],autoConfirm:!1,allowDangerous:!0}};function Pm(){let t=to.join(process.cwd(),".nex","config.json");try{return Ot.existsSync(t)&&JSON.parse(Ot.readFileSync(t,"utf-8")).teamPermissions||null}catch{return null}}function Bx(t){let e=to.join(process.cwd(),".nex"),n=to.join(e,"config.json");Ot.existsSync(e)||Ot.mkdirSync(e,{recursive:!0});let o={};try{Ot.existsSync(n)&&(o=JSON.parse(Ot.readFileSync(n,"utf-8")))}catch{o={}}o.teamPermissions=t,Ot.writeFileSync(n,JSON.stringify(o,null,2),"utf-8")}function Lm(){let t=Pm();if(!t)return er.admin;let e=t.role||"admin",n=er[e]||er.admin;return{...n,...t.overrides,blockedTools:[...n.blockedTools||[],...t.overrides?.blockedTools||[]]}}function Wx(t){let e=Lm();return e.blockedTools&&e.blockedTools.includes(t)?{allowed:!1,reason:`Tool "${t}" is blocked by permission preset "${e.description||"custom"}"`}:e.allowedTools&&!e.allowedTools.includes(t)?{allowed:!1,reason:`Tool "${t}" is not in the allowed list for this permission level`}:{allowed:!0}}function Hx(){return Object.entries(er).map(([t,e])=>({name:t,description:e.description,toolCount:e.allowedTools?`${e.allowedTools.length} allowed`:"all allowed",blockedCount:e.blockedTools.length}))}Nm();Im.exports={getPermission:Mm,setPermission:Dx,checkPermission:qx,listPermissions:Fx,loadPermissions:Nm,savePermissions:jx,resetPermissions:Ux,DEFAULT_PERMISSIONS:Ii,PERMISSION_PRESETS:er,loadPresetConfig:Pm,savePresetConfig:Bx,getEffectivePreset:Lm,isToolAllowed:Wx,listPresets:Hx}});var Vt=Q(($R,Um)=>{var ds=require("fs"),ji=require("path"),gR=require("readline"),{C:Me}=Fe(),Oe=null,Jc=!1,Vc=null,jm=new Set(["read_file","list_directory","search_files","glob","grep","web_search","web_fetch","git_status","git_diff","git_log","git_show"]);function Di(){return ji.join(process.cwd(),".nex","plans")}function Dm(){let t=Di();ds.existsSync(t)||ds.mkdirSync(t,{recursive:!0})}function Kx(t,e=[]){return Oe={name:`plan-${Date.now()}-${Math.random().toString(36).slice(2,6)}`,task:t,steps:e.map(n=>({description:n.description||n,files:n.files||[],status:"pending"})),status:"draft",createdAt:new Date().toISOString()},Oe}function Gx(){return Oe}function Yx(t){Jc=t}function zx(){return Jc}function Xx(){return!Oe||Oe.status!=="draft"?!1:(Oe.status="approved",Oe.updatedAt=new Date().toISOString(),!0)}function Jx(){return!Oe||Oe.status!=="approved"?!1:(Oe.status="executing",!0)}function Xc(t,e){return!Oe||t<0||t>=Oe.steps.length?!1:(Oe.steps[t].status=e,Oe.updatedAt=new Date().toISOString(),Oe.steps.every(n=>n.status==="done"||n.status==="skipped")&&(Oe.status="completed"),!0)}function Vx(t){if(!t)return`${Me.dim}No active plan${Me.reset}`;let e={draft:`${Me.yellow}DRAFT${Me.reset}`,approved:`${Me.green}APPROVED${Me.reset}`,executing:`${Me.blue}EXECUTING${Me.reset}`,completed:`${Me.green}COMPLETED${Me.reset}`},n=[];n.push(`
539
539
  ${Me.bold}${Me.cyan}Plan: ${t.task}${Me.reset}`),n.push(`${Me.dim}Status: ${e[t.status]||t.status}${Me.reset}
540
540
  `);for(let o=0;o<t.steps.length;o++){let s=t.steps[o],r;switch(s.status){case"done":r=`${Me.green}\u2713${Me.reset}`;break;case"in_progress":r=`${Me.blue}\u2192${Me.reset}`;break;case"skipped":r=`${Me.dim}\u25CB${Me.reset}`;break;default:r=`${Me.dim} ${Me.reset}`}n.push(` ${r} ${Me.bold}Step ${o+1}:${Me.reset} ${s.description}`),s.files.length>0&&n.push(` ${Me.dim}Files: ${s.files.join(", ")}${Me.reset}`)}return n.push(""),n.join(`
541
541
  `)}function Zx(t){if(t||(t=Oe),!t)return null;Dm();let e=ji.join(Di(),`${t.name}.json`);return ds.writeFileSync(e,JSON.stringify(t,null,2),"utf-8"),e}function Qx(t){let e=ji.join(Di(),`${t}.json`);if(!ds.existsSync(e))return null;try{let n=JSON.parse(ds.readFileSync(e,"utf-8"));return Oe=n,n}catch{return null}}function ev(){Dm();let t=Di(),e=ds.readdirSync(t).filter(o=>o.endsWith(".json")),n=[];for(let o of e)try{let s=JSON.parse(ds.readFileSync(ji.join(t,o),"utf-8"));n.push({name:s.name,task:s.task,status:s.status,steps:s.steps?s.steps.length:0,createdAt:s.createdAt})}catch{}return n.sort((o,s)=>(s.createdAt||"").localeCompare(o.createdAt||""))}function tv(t){if(!t)return[];let e=[],n=t.match(/##\s+Steps?\s*\n([\s\S]*?)(?:\n##|\s*$)/i),o=n?n[1]:t,s=/^\s*(\d+)[.)]\s+(.+)/gm,r;for(;(r=s.exec(o))!==null;){let c=r[2].trim().replace(/^\*\*What\*\*:\s*/i,"").replace(/^\*\*\d+\.\*\*\s*/,"").replace(/\*\*/g,"").trim();c.length>3&&e.push({description:c,files:[],status:"pending"})}if(e.length===0){let i=/\*\*Step\s+\d+[:.]\*\*\s*(.+)/gi;for(;(r=i.exec(t))!==null;){let c=r[1].replace(/\*\*/g,"").trim();c.length>3&&e.push({description:c,files:[],status:"pending"})}}if(e.length>0){let i=/\*\*(?:Where|Files?)\*\*:\s*(.+)/gi,c=[...t.matchAll(i)];for(let l=0;l<Math.min(e.length,c.length);l++){let u=c[l][1];e[l].files=u.split(/[,\s]+/).filter(d=>/[./]/.test(d)).slice(0,5)}}return e}function nv(t){Vc=t}function sv(){return Vc}function ov(){Oe=null,Jc=!1,Vc=null,cv()}function rv(){return`
@@ -602,18 +602,18 @@ Bullet list of potential issues and mitigations.
602
602
  `);return}if(/^\s*[-*]\s/.test(e)){let s=e.match(/^(\s*)/)[1],r=e.replace(/^\s*[-*]\s/,""),i=`${s}${N.cyan}\u2022${N.reset} ${ps(r)}`,c=ms(i,n,s+" ");this._safeWrite(`${c}
603
603
  `);return}if(/^\s*\d+\.\s/.test(e)){let s=e.match(/^(\s*)(\d+)\.\s(.*)/);if(s){let r=s[1],i=s[2],c=s[3],l=`${r}${N.cyan}${i}.${N.reset} ${ps(c)}`,u=r+" ".repeat(i.length+2),d=ms(l,n,u);this._safeWrite(`${d}
604
604
  `);return}}let o=ms(ps(e),n);this._safeWrite(`${o}
605
- `)}};Vm.exports={renderMarkdown:dv,renderInline:ps,stripHeadingMarkers:fs,highlightCode:Qc,highlightJS:Wm,highlightBash:Hm,highlightJSON:Km,highlightPython:Gm,highlightGo:Ym,highlightRust:zm,highlightCSS:Xm,highlightHTML:Jm,renderTable:fv,renderProgress:pv,wrapAnsi:ms,StreamRenderer:Zc}});var nl=Q((wR,nh)=>{var{execSync:mv}=require("child_process"),el=require("path"),nr=require("fs"),tl=["pre-tool","post-tool","pre-commit","post-response","session-start","session-end"];function Qm(){return el.join(process.cwd(),".nex","hooks")}function hv(){return el.join(process.cwd(),".nex","config.json")}function eh(){let t=hv();if(!nr.existsSync(t))return{};try{return JSON.parse(nr.readFileSync(t,"utf-8")).hooks||{}}catch{return{}}}function qi(t){if(!tl.includes(t))return[];let e=[],n=Qm(),o=el.join(n,t);nr.existsSync(o)&&e.push(o);let s=eh();if(s[t]){let r=Array.isArray(s[t])?s[t]:[s[t]];e.push(...r)}return e}function th(t,e={},n=3e4){try{return{success:!0,output:mv(t,{cwd:process.cwd(),encoding:"utf-8",timeout:n,env:{...process.env,...e},stdio:["pipe","pipe","pipe"]}).trim()}}catch(o){return{success:!1,error:o.stderr?o.stderr.trim():o.message}}}function gv(t,e={}){let n=qi(t);if(n.length===0)return[];let o={};for(let[r,i]of Object.entries(e))o[`NEX_${r.toUpperCase()}`]=String(i);let s=[];for(let r of n){let i=th(r,o);if(s.push({command:r,...i}),!i.success&&t.startsWith("pre-"))break}return s}function $v(t){return qi(t).length>0}function yv(){let t=[];for(let e of tl){let n=qi(e);n.length>0&&t.push({event:e,commands:n})}return t}function wv(){let t=Qm();return nr.existsSync(t)||nr.mkdirSync(t,{recursive:!0}),t}nh.exports={HOOK_EVENTS:tl,loadHookConfig:eh,getHooksForEvent:qi,executeHook:th,runHooks:gv,hasHooks:$v,listHooks:yv,initHooksDir:wv}});var sr=Q((vR,hh)=>{"use strict";var{callWithRetry:oh,runSubAgent:bv,clearAllLocks:_v}=_i(),{parseModelSpec:rh,getActiveProviderName:bR,getActiveModelId:_R}=je(),{detectCategory:xv,getModelForCategory:sh}=In(),{MultiProgress:vv,C:ge}=Fe(),{getModelBriefing:xR}=hi(),ih=parseInt(process.env.NEX_MAX_PARALLEL||"4",10),Fi=parseInt(process.env.NEX_MAX_SUBTASKS||"8",10),ah="devstral-2:123b",ch="kimi-k2.5",lh=`You are a task decomposition engine. Given a complex user request, split it into independent, atomic sub-tasks.
605
+ `)}};Vm.exports={renderMarkdown:dv,renderInline:ps,stripHeadingMarkers:fs,highlightCode:Qc,highlightJS:Wm,highlightBash:Hm,highlightJSON:Km,highlightPython:Gm,highlightGo:Ym,highlightRust:zm,highlightCSS:Xm,highlightHTML:Jm,renderTable:fv,renderProgress:pv,wrapAnsi:ms,StreamRenderer:Zc}});var nl=Q((wR,nh)=>{var{execSync:mv}=require("child_process"),el=require("path"),nr=require("fs"),tl=["pre-tool","post-tool","pre-commit","post-response","session-start","session-end"];function Qm(){return el.join(process.cwd(),".nex","hooks")}function hv(){return el.join(process.cwd(),".nex","config.json")}function eh(){let t=hv();if(!nr.existsSync(t))return{};try{return JSON.parse(nr.readFileSync(t,"utf-8")).hooks||{}}catch{return{}}}function qi(t){if(!tl.includes(t))return[];let e=[],n=Qm(),o=el.join(n,t);nr.existsSync(o)&&e.push(o);let s=eh();if(s[t]){let r=Array.isArray(s[t])?s[t]:[s[t]];e.push(...r)}return e}function th(t,e={},n=3e4){try{return{success:!0,output:mv(t,{cwd:process.cwd(),encoding:"utf-8",timeout:n,env:{...process.env,...e},stdio:["pipe","pipe","pipe"]}).trim()}}catch(o){return{success:!1,error:o.stderr?o.stderr.trim():o.message}}}function gv(t,e={}){let n=qi(t);if(n.length===0)return[];let o={};for(let[r,i]of Object.entries(e))o[`NEX_${r.toUpperCase()}`]=String(i);let s=[];for(let r of n){let i=th(r,o);if(s.push({command:r,...i}),!i.success&&t.startsWith("pre-"))break}return s}function $v(t){return qi(t).length>0}function yv(){let t=[];for(let e of tl){let n=qi(e);n.length>0&&t.push({event:e,commands:n})}return t}function wv(){let t=Qm();return nr.existsSync(t)||nr.mkdirSync(t,{recursive:!0}),t}nh.exports={HOOK_EVENTS:tl,loadHookConfig:eh,getHooksForEvent:qi,executeHook:th,runHooks:gv,hasHooks:$v,listHooks:yv,initHooksDir:wv}});var sr=Q((vR,hh)=>{"use strict";var{callWithRetry:oh,runSubAgent:bv,clearAllLocks:_v}=_i(),{parseModelSpec:rh,getActiveProviderName:bR,getActiveModelId:_R}=je(),{detectCategory:xv,getModelForCategory:sh}=In(),{MultiProgress:vv,C:$e}=Fe(),{getModelBriefing:xR}=hi(),ih=parseInt(process.env.NEX_MAX_PARALLEL||"4",10),Fi=parseInt(process.env.NEX_MAX_SUBTASKS||"8",10),ah="devstral-2:123b",ch="kimi-k2.5",lh=`You are a task decomposition engine. Given a complex user request, split it into independent, atomic sub-tasks.
606
606
 
607
607
  RULES:
608
608
  - Output ONLY a JSON array, no markdown fences, no explanation.
609
- - Each sub-task must be independently solvable by a coding agent.
609
+ - Each sub-task must be independently solvable by a specialized agent (coding, sysadmin, etc.).
610
610
  - Maximum {maxSubTasks} sub-tasks. Merge closely related items.
611
611
  - Each sub-task object must have these fields:
612
- { "id": "t1", "task": "description", "scope": ["file1.js", "dir/"], "estimatedCalls": 5, "priority": 1 }
613
- - "scope" lists files/directories the agent should focus on.
612
+ { "id": "t1", "task": "description", "scope": ["resource1", "resource2"], "estimatedCalls": 5, "priority": 1 }
613
+ - "scope" lists resources the agent should focus on (e.g., files, services, servers, commands).
614
614
  - "estimatedCalls" is a rough count of tool invocations needed (max 15).
615
- - "priority" is 1 (highest) to N (lowest) \u2014 controls execution order if sequential.
616
- - No overlapping scopes: each file should appear in at most one sub-task.
615
+ - "priority" is 1 (highest) to N (lowest) \u2014 controls execution order; set higher priority for prerequisite steps (e.g., stop service before config change).
616
+ - For system administration workflows, ensure sequential dependencies are captured via priority; overlapping resource scopes are allowed if ordered by priority.
617
617
  - If the request is simple (single goal), return an array with exactly 1 item.
618
618
 
619
619
  USER REQUEST:
@@ -621,10 +621,10 @@ USER REQUEST:
621
621
 
622
622
  RULES:
623
623
  - Output ONLY a JSON object with these fields:
624
- { "summary": "what was done", "conflicts": ["file.js: agent 1 and 2 both modified line 42"], "commitMessage": "fix: ...", "filesChanged": ["file1.js", "file2.js"] }
625
- - "conflicts" is an array of file conflicts where multiple agents modified the same file. Empty array if none.
624
+ { "summary": "what was done", "conflicts": ["file.js: agent 1 and 2 both modified line 42"], "commitMessage": "fix: ...", "resourcesChanged": ["resource1", "resource2"] }
625
+ - "conflicts" is an array of resource conflicts where multiple agents modified the same resource (e.g., services, servers, config files). Empty array if none.
626
626
  - "commitMessage" follows conventional commits (fix:, feat:, refactor:, etc.).
627
- - "filesChanged" is a deduplicated list of all files modified across all agents.
627
+ - "resourcesChanged" is a deduplicated list of all resources (files, services, servers, etc.) modified across all agents.
628
628
  - "summary" is a concise paragraph describing the overall result.
629
629
 
630
630
  ORIGINAL REQUEST:
@@ -632,15 +632,15 @@ ORIGINAL REQUEST:
632
632
 
633
633
  SUB-AGENT RESULTS:
634
634
  {results}`;async function dh(t,e=1,n=2e3){for(let o=0;o<=e;o++)try{return await t()}catch(s){if(o===e)throw s;await new Promise(r=>setTimeout(r,n))}}function fh(t){let e=0,n=[];return function(){return new Promise(s=>{let r=()=>{e<t?(e++,s(()=>{e--,n.length>0&&n.shift()()})):n.push(r)};r()})}}function kv(t){if(!t||typeof t!="string")return{isComplex:!1,estimatedGoals:0,reason:"empty"};let e=0,n=[],o=t.match(/(?:(?:^|\n)\s*|\s)(?:\d+[.)]\s|[(]\d+[)][\s,]|[(][a-z][)][\s,])/g);o&&o.length>=2&&(e=Math.max(e,o.length),n.push(`${o.length} numbered items`));let s=t.match(/(?:^|\n)\s*[-*]\s+\S/g);s&&s.length>=3&&(e=Math.max(e,s.length),n.push(`${s.length} bullet points`));let r=t.split(/;\s*/).filter(u=>u.trim().length>10);r.length>=3&&(e=Math.max(e,r.length),n.push(`${r.length} semicolon-separated goals`));let i=t.match(/\b(also|additionally|and\s+(?:fix|add|update|create|implement|remove|refactor))\b/gi);i&&i.length>=2&&(e=Math.max(e,i.length+1),n.push(`${i.length} transition keywords`));let c=parseInt(process.env.NEX_ORCHESTRATE_THRESHOLD||"3",10);return{isComplex:e>=c,estimatedGoals:e,reason:n.length>0?n.join(", "):"single goal"}}function sl(t){if(!t||typeof t!="string")throw new Error("Empty response from orchestrator model");let e=t.trim();try{return JSON.parse(e)}catch{}let n=e.match(/```(?:json)?\s*\n?([\s\S]*?)\n?\s*```/);if(n)try{return JSON.parse(n[1].trim())}catch{}let o=e.search(/[[\{]/);if(o>=0){let s=e.slice(o);try{return JSON.parse(s)}catch{}}throw new Error(`Could not extract valid JSON from response:
635
- ${e.slice(0,200)}`)}async function ph(t,e,n={}){let o=n.maxSubTasks||Fi,r=[{role:"system",content:lh.replace("{maxSubTasks}",String(o)).replace("{prompt}",t)},{role:"user",content:t}],i={};if(e){let g=rh(e);g.provider&&(i.provider=g.provider),g.model&&(i.model=g.model)}let l=(await oh(r,[],i)).content||"",u=sl(l);if(!Array.isArray(u))throw new Error(`Decompose returned non-array: ${typeof u}`);let d=10,p=u.slice(0,o).map((g,y)=>({id:g.id||`t${y+1}`,task:String(g.task||""),scope:Array.isArray(g.scope)?g.scope:[],estimatedCalls:typeof g.estimatedCalls=="number"?Math.min(g.estimatedCalls,d):8,priority:typeof g.priority=="number"?g.priority:y+1})).filter(g=>g.task.length>0),h=p.reduce((g,y)=>g+y.estimatedCalls,0),m=Fi*d;if(h>m){let{debugLog:g}=zr();g(`\x1B[33m \u26A0 Orchestrator: total estimated calls ${h} > ${m} \u2014 consider raising maxSubTasks\x1B[0m`)}return p}async function mh(t,e,n){if(!t||t.length===0)return{summary:"No sub-tasks were executed.",conflicts:[],commitMessage:"",filesChanged:[]};let o=t.map((d,f)=>{let p=d.status==="done"?"SUCCESS":d.status==="truncated"?"PARTIAL":"FAILED";return`--- Agent ${f+1} [${p}] ---
635
+ ${e.slice(0,200)}`)}async function ph(t,e,n={}){let o=n.maxSubTasks||Fi,r=[{role:"system",content:lh.replace("{maxSubTasks}",String(o)).replace("{prompt}",t)},{role:"user",content:t}],i={};if(e){let g=rh(e);g.provider&&(i.provider=g.provider),g.model&&(i.model=g.model)}let l=(await oh(r,[],i)).content||"",u=sl(l);if(!Array.isArray(u))throw new Error(`Decompose returned non-array: ${typeof u}`);let d=10,p=u.slice(0,o).map((g,y)=>({id:g.id||`t${y+1}`,task:String(g.task||""),scope:Array.isArray(g.scope)?g.scope:[],estimatedCalls:typeof g.estimatedCalls=="number"?Math.min(g.estimatedCalls,d):8,priority:typeof g.priority=="number"?g.priority:y+1})).filter(g=>g.task.length>0),h=p.reduce((g,y)=>g+y.estimatedCalls,0),m=Fi*d;if(h>m){let{debugLog:g}=zr();g(`\x1B[33m \u26A0 Orchestrator: total estimated calls ${h} > ${m} \u2014 consider raising maxSubTasks\x1B[0m`)}return p}async function mh(t,e,n){if(!t||t.length===0)return{summary:"No sub-tasks were executed.",conflicts:[],commitMessage:"",resourcesChanged:[]};let o=t.map((d,f)=>{let p=d.status==="done"?"SUCCESS":d.status==="truncated"?"PARTIAL":"FAILED";return`--- Agent ${f+1} [${p}] ---
636
636
  Task: ${d.task}
637
637
  Result: ${d.result}
638
638
  Tools: ${(d.toolsUsed||[]).join(", ")||"none"}`}).join(`
639
639
 
640
640
  `),r=[{role:"system",content:uh.replace("{prompt}",e).replace("{results}",o)},{role:"user",content:"Synthesize the sub-agent results above."}],i={};if(n){let d=rh(n);d.provider&&(i.provider=d.provider),d.model&&(i.model=d.model)}let l=(await oh(r,[],i)).content||"",u=sl(l);return{summary:String(u.summary||""),conflicts:Array.isArray(u.conflicts)?u.conflicts:[],commitMessage:String(u.commitMessage||""),filesChanged:Array.isArray(u.filesChanged)?u.filesChanged:[]}}async function Sv(t,e={}){let n=e.orchestratorModel||process.env.NEX_ORCHESTRATOR_MODEL||ch,o=e.workerModel||ah,s=e.maxParallel||ih,r=e.maxSubTasks||Fi,i=e.onProgress||(()=>{}),c={input:0,output:0};console.log(`
641
- ${ge.bold}Orchestrator${ge.reset} ${ge.dim}model: ${n} | workers: ${o} | max parallel: ${s}${ge.reset}
642
- `),i("decomposing"),console.log(`${ge.dim}Phase 1: Decomposing prompt into sub-tasks...${ge.reset}`);let l;try{l=await ph(t,n,{maxSubTasks:r})}catch(B){return console.log(`${ge.red}Decompose failed: ${B.message}${ge.reset}`),{results:[],synthesis:{summary:`Decompose failed: ${B.message}`,conflicts:[],commitMessage:"",filesChanged:[]},totalTokens:c}}if(l.length===0)return console.log(`${ge.yellow}No sub-tasks generated. Prompt may be too simple for orchestration.${ge.reset}`),{results:[],synthesis:{summary:"No sub-tasks generated.",conflicts:[],commitMessage:"",filesChanged:[]},totalTokens:c};console.log(`${ge.green}Decomposed into ${l.length} sub-tasks:${ge.reset}`);for(let B of l){console.log(` ${ge.dim}${B.id}:${ge.reset} ${B.task}`);let R=B.scope.filter(Boolean);R.length>0&&console.log(` ${ge.dim}scope: ${R.join(", ")}${ge.reset}`)}console.log("");let u=new Map;for(let B=0;B<l.length;B++)for(let R of l[B].scope)R&&!u.has(R)&&u.set(R,B);i("executing"),console.log(`${ge.dim}Phase 2: Running ${l.length} sub-agents (max ${s} parallel)...${ge.reset}
643
- `);let d=Date.now(),f=fh(s),p={findings:[],_lock:!1},h=l.map(B=>{let R=xv(B.task);return(R?sh(R.id):null)||o}),m=l.map((B,R)=>{let $e=`Agent ${R+1} [${h[R]}]: `,be=Math.max(20,60-$e.length),fe=B.task.substring(0,be)+(B.task.length>be?"...":"");return $e+fe}),g=new vv(m);g.start();let y=`
641
+ ${$e.bold}Orchestrator${$e.reset} ${$e.dim}model: ${n} | workers: ${o} | max parallel: ${s}${$e.reset}
642
+ `),i("decomposing"),console.log(`${$e.dim}Phase 1: Decomposing prompt into sub-tasks...${$e.reset}`);let l;try{l=await ph(t,n,{maxSubTasks:r})}catch(B){return console.log(`${$e.red}Decompose failed: ${B.message}${$e.reset}`),{results:[],synthesis:{summary:`Decompose failed: ${B.message}`,conflicts:[],commitMessage:"",resourcesChanged:[]},totalTokens:c}}if(l.length===0)return console.log(`${$e.yellow}No sub-tasks generated. Prompt may be too simple for orchestration.${$e.reset}`),{results:[],synthesis:{summary:"No sub-tasks generated.",conflicts:[],commitMessage:"",resourcesChanged:[]},totalTokens:c};console.log(`${$e.green}Decomposed into ${l.length} sub-tasks:${$e.reset}`);for(let B of l){console.log(` ${$e.dim}${B.id}:${$e.reset} ${B.task}`);let R=B.scope.filter(Boolean);R.length>0&&console.log(` ${$e.dim}scope: ${R.join(", ")}${$e.reset}`)}console.log("");let u=new Map;for(let B=0;B<l.length;B++)for(let R of l[B].scope)R&&!u.has(R)&&u.set(R,B);i("executing"),console.log(`${$e.dim}Phase 2: Running ${l.length} sub-agents (max ${s} parallel)...${$e.reset}
643
+ `);let d=Date.now(),f=fh(s),p={findings:[],_lock:!1},h=l.map(B=>{let R=xv(B.task);return(R?sh(R.id):null)||o}),m=l.map((B,R)=>{let ye=`Agent ${R+1} [${h[R]}]: `,be=Math.max(20,60-ye.length),fe=B.task.substring(0,be)+(B.task.length>be?"...":"");return ye+fe}),g=new vv(m);g.start();let y=`
644
644
  You are a focused coding agent executing ONE specific sub-task.
645
645
  Your scope is limited to the files listed in your task definition.
646
646
 
@@ -661,21 +661,21 @@ RULES:
661
661
  - If your task says "add X to README" \u2014 add it, don't check if it exists first.
662
662
  - Max 10 tool calls. If you need more, you are doing too much \u2014 narrow your scope.
663
663
  - When done: stop calling tools and write a one-line summary of what you changed.
664
- `,w=l.map(async(B,R)=>{let $e=await f();try{let be=p.findings.filter(x=>x.agentId!==B.id).map(x=>`Agent ${x.agentId} found: ${x.summary}`).join(`
664
+ `,w=l.map(async(B,R)=>{let ye=await f();try{let be=p.findings.filter(x=>x.agentId!==B.id).map(x=>`Agent ${x.agentId} found: ${x.summary}`).join(`
665
665
  `),fe=[...u.entries()].filter(([,x])=>x===R).map(([x])=>x),pe=[...u.entries()].filter(([,x])=>x!==R).map(([x])=>x),xe=[be?`Prior agent findings:
666
666
  ${be}
667
- `:"",B.scope.length>0?`Focus on files: ${B.scope.join(", ")}`:"",fe.length>0?`You OWN these files (may read+write): ${fe.join(", ")}`:"",pe.length>0?`READ ONLY (owned by other agents, do NOT write): ${pe.join(", ")}`:""].filter(Boolean),me=h[R],he=process.env.NEX_FALLBACK_MODEL||sh("agentic")||o,Re=0,k=await dh(async()=>{let x=Re>0;x&&(g.update(R,"retry"),process.stderr.write(` ${ge.dim}[Agent ${R+1}] retrying after error...${ge.reset}
667
+ `:"",B.scope.length>0?`Focus on files: ${B.scope.join(", ")}`:"",fe.length>0?`You OWN these files (may read+write): ${fe.join(", ")}`:"",pe.length>0?`READ ONLY (owned by other agents, do NOT write): ${pe.join(", ")}`:""].filter(Boolean),me=h[R],he=process.env.NEX_FALLBACK_MODEL||sh("agentic")||o,Re=0,k=await dh(async()=>{let x=Re>0;x&&(g.update(R,"retry"),process.stderr.write(` ${$e.dim}[Agent ${R+1}] retrying after error...${$e.reset}
668
668
  `)),Re++;let E=x&&me!==he?he:me;return bv({task:B.task,context:xe.length>0?xe.join(`
669
- `):void 0,max_iterations:Math.min(B.estimatedCalls||10,15),model:E,_skipLog:!0,_systemPrompt:y,_readOnlyFiles:pe},{onUpdate:A=>{if(A&&A.type==="tool_call"&&process.stderr.isTTY){let T=`Agent ${R+1} [${E}]`,L=A.tool||"...";g.labels[R]=`${T}: ${L}`}}})},1,2e3),j=typeof k.result=="string"?k.result.slice(0,200):String(k.result||"").slice(0,200);return p.findings.push({agentId:B.id,summary:j,files:Array.isArray(B.scope)?B.scope:[]}),g.labels[R]=m[R],g.update(R,k.status==="failed"?"error":"done"),c.input+=k.tokensUsed?.input||0,c.output+=k.tokensUsed?.output||0,k.tokensUsed?._estimated&&(c._estimated=!0),{...k,_scope:B.scope,_idx:R}}catch(be){return g.labels[R]=m[R],g.update(R,"error"),{task:B.task,status:"failed",result:`Error: ${be.message}`,toolsUsed:[],tokensUsed:{input:0,output:0}}}finally{$e()}}),v;try{v=await Promise.all(w)}finally{g.stop({silent:!0}),_v()}console.log("");let M=Math.round((Date.now()-d)/1e3),C=M>=60?`${Math.floor(M/60)}m ${M%60}s`:`${M}s`;for(let B=0;B<v.length;B++){let R=v[B],be=R.status==="done"||R.status==="truncated"&&R.result&&!R.result.startsWith("Error")?`${ge.green}\u2713${ge.reset}`:`${ge.red}\u2717${ge.reset}`,fe=R._scope&&R._scope.length>0?R._scope.map(me=>me.replace(/^.*\//,"").replace(/\/$/,"")).filter(Boolean):[],pe=fe.length>0?fe.join(", "):R.task.substring(0,35)+(R.task.length>35?"...":""),xe=B===v.length-1;console.log(` ${be} Agent ${B+1} ${ge.dim}${pe}${ge.reset}${xe?` ${ge.dim}${C}${ge.reset}`:""}`)}console.log(""),i("synthesizing"),console.log(`${ge.dim}Phase 3: Synthesizing results...${ge.reset}`);let S;try{S=await mh(v,t,n)}catch(B){console.log(`${ge.yellow}Synthesize failed: ${B.message} \u2014 using raw results.${ge.reset}`),S={summary:v.map(R=>R.result).join(`
670
- `),conflicts:[],commitMessage:"",filesChanged:[]}}let O=p.findings.flatMap(B=>B.files),D=new Map;for(let B of O)D.set(B,(D.get(B)||0)+1);let K=[...D.values()].some(B=>B>1),V=p.findings.length>1&&K?` ${ge.dim}(agents shared context)${ge.reset}`:"";if(console.log(`
671
- ${ge.bold}Summary:${ge.reset} ${S.summary}${V}`),S.conflicts.length>0){console.log(`${ge.yellow}Conflicts:${ge.reset}`);for(let B of S.conflicts)console.log(` - ${B}`)}S.commitMessage&&console.log(`${ge.dim}Suggested commit: ${S.commitMessage}${ge.reset}`);let X=c.input===0&&c.output===0?"n/a (provider does not report token counts)":c._estimated?`~${c.input} input / ~${c.output} output (est.)`:`${c.input} input + ${c.output} output`;return console.log(`${ge.dim}Tokens: ${X}${ge.reset}
672
- `),{results:v,synthesis:S,totalTokens:c}}hh.exports={runOrchestrated:Sv,decompose:ph,synthesize:mh,detectComplexPrompt:kv,extractJSON:sl,createSemaphore:fh,DECOMPOSE_PROMPT:lh,SYNTHESIZE_PROMPT:uh,DEFAULT_ORCHESTRATOR_MODEL:ch,DEFAULT_WORKER_MODEL:ah,DEFAULT_MAX_PARALLEL:ih,DEFAULT_MAX_SUBTASKS:Fi,withRetry:dh}});var Se=Q((CR,Dh)=>{var{C:$,Spinner:oo,TaskProgress:Ev,formatToolCall:Tv,formatToolSummary:Ah,formatSectionHeader:Ui,formatMilestone:Rv,setActiveTaskProgress:kR}=Fe(),{debugLog:W,warnLog:SR}=zr(),{MilestoneTracker:Cv}=Ed(),{callStream:gh}=je(),{parseToolArgs:Av}=Fs(),{executeTool:Ov}=Gt(),{gatherProjectContext:Nv}=Ni(),{fitToContext:Mv,forceCompress:un,getUsage:Vt,estimateTokens:Pv}=Rt(),{autoSave:Lv,flushAutoSave:Iv}=Jt(),{scoreMessages:jv,formatScore:Dv,appendScoreHistory:qv}=Pi(),{detectCategory:Fv,getModelForPhase:pl,getPhaseBudget:hs,isPhaseRoutingEnabled:Uv}=In();function Ze(t){Lv(t),Iv()}function Bv(t){if(!t||typeof t!="string")return!0;let e=t.trim();return!!(e.length<80||/^(done|complete|finished|all done|analysis complete|finally done)[.!]*$/i.test(e)||/^[^.!]{0,40}\?$/.test(e))}function $h(t){try{if(!t.some(o=>o.role!=="assistant"?!1:!!(Array.isArray(o.content)&&o.content.some(s=>s&&s.type==="tool_use")||Array.isArray(o.tool_calls)&&o.tool_calls.length>0)))return;let n=jv(t);if(!n)return;console.log(Dv(n,$));try{let{_getSessionsDir:o}=Jt(),s=require("fs"),r=require("path").join(o(),"_autosave.json");if(s.existsSync(r)){let i=JSON.parse(s.readFileSync(r,"utf-8"));i.score=n.score,i.scoreGrade=n.grade,i.scoreIssues=n.issues,s.writeFileSync(r,JSON.stringify(i,null,2))}}catch{}try{let{getActiveModel:o}=Fs(),s=As();qv(n.score,{version:s.version,model:o?o():null,sessionName:"_autosave",issues:n.issues})}catch{}}catch{}}var{getMemoryContext:Wv}=cn(),{getDeploymentContextBlock:Hv,probeUrlServer:Kv}=Bc(),{getFewShotForInput:Gv}=Om(),{checkPermission:Yv,setPermission:zv,savePermissions:Xv}=tr(),{confirm:Oh,setAllowAlwaysHandler:Jv,getAutoConfirm:Vv}=ft(),{isPlanMode:fr,getPlanModePrompt:Zv,PLAN_MODE_ALLOWED_TOOLS:Nh,setPlanContent:Qv,extractStepsFromText:ek,createPlan:tk,getActivePlan:ER,startExecution:TR,advancePlanStep:nk,getPlanStepInfo:sk}=ln(),{StreamRenderer:ok}=Zm(),{runHooks:yh}=nl(),{routeMCPCall:rk,getMCPToolDefinitions:ik}=ti(),{getSkillInstructions:ak,getSkillToolDefinitions:ck,routeSkillCall:lk,matchSkillTriggers:uk}=Mn(),{trackUsage:wh,estimateTokens:bh}=qs();function _h(t){return!t||typeof t!="string"?0:typeof bh=="function"?bh(t):Math.ceil(t.length/4)}var{validateToolArgs:dk}=ac(),{filterToolsForModel:xh,getModelTier:fk,PROVIDER_DEFAULT_TIER:RR}=Ro(),{getConfiguredProviders:pk,getActiveProviderName:ro,getActiveModelId:fn,setActiveModel:vh,MODEL_EQUIVALENTS:ea}=je(),{getModelProfile:mk,getModelBriefing:hk}=hi(),kl=require("fs"),Sl=require("path"),gk=(()=>{let t=parseInt(process.env.NEX_MILESTONE_STEPS??"5",10);return Number.isFinite(t)&&t>=0?t:5})();function $k(t){let e=Rv(t.phaseName,t.stepCount,t.toolCounts,t.elapsed,t.filesRead,t.filesModified);process.stdout.write(`${e}
669
+ `):void 0,max_iterations:Math.min(B.estimatedCalls||10,15),model:E,_skipLog:!0,_systemPrompt:y,_readOnlyFiles:pe},{onUpdate:A=>{if(A&&A.type==="tool_call"&&process.stderr.isTTY){let T=`Agent ${R+1} [${E}]`,L=A.tool||"...";g.labels[R]=`${T}: ${L}`}}})},1,2e3),j=typeof k.result=="string"?k.result.slice(0,200):String(k.result||"").slice(0,200);return p.findings.push({agentId:B.id,summary:j,files:Array.isArray(B.scope)?B.scope:[]}),g.labels[R]=m[R],g.update(R,k.status==="failed"?"error":"done"),c.input+=k.tokensUsed?.input||0,c.output+=k.tokensUsed?.output||0,k.tokensUsed?._estimated&&(c._estimated=!0),{...k,_scope:B.scope,_idx:R}}catch(be){return g.labels[R]=m[R],g.update(R,"error"),{task:B.task,status:"failed",result:`Error: ${be.message}`,toolsUsed:[],tokensUsed:{input:0,output:0}}}finally{ye()}}),v;try{v=await Promise.all(w)}finally{g.stop({silent:!0}),_v()}console.log("");let M=Math.round((Date.now()-d)/1e3),C=M>=60?`${Math.floor(M/60)}m ${M%60}s`:`${M}s`;for(let B=0;B<v.length;B++){let R=v[B],be=R.status==="done"||R.status==="truncated"&&R.result&&!R.result.startsWith("Error")?`${$e.green}\u2713${$e.reset}`:`${$e.red}\u2717${$e.reset}`,fe=R._scope&&R._scope.length>0?R._scope.map(me=>me.replace(/^.*\//,"").replace(/\/$/,"")).filter(Boolean):[],pe=fe.length>0?fe.join(", "):R.task.substring(0,35)+(R.task.length>35?"...":""),xe=B===v.length-1;console.log(` ${be} Agent ${B+1} ${$e.dim}${pe}${$e.reset}${xe?` ${$e.dim}${C}${$e.reset}`:""}`)}console.log(""),i("synthesizing"),console.log(`${$e.dim}Phase 3: Synthesizing results...${$e.reset}`);let S;try{S=await mh(v,t,n)}catch(B){console.log(`${$e.yellow}Synthesize failed: ${B.message} \u2014 using raw results.${$e.reset}`),S={summary:v.map(R=>R.result).join(`
670
+ `),conflicts:[],commitMessage:"",resourcesChanged:[]}}let O=p.findings.flatMap(B=>B.files),D=new Map;for(let B of O)D.set(B,(D.get(B)||0)+1);let K=[...D.values()].some(B=>B>1),V=p.findings.length>1&&K?` ${$e.dim}(agents shared context)${$e.reset}`:"";if(console.log(`
671
+ ${$e.bold}Summary:${$e.reset} ${S.summary}${V}`),S.conflicts.length>0){console.log(`${$e.yellow}Conflicts:${$e.reset}`);for(let B of S.conflicts)console.log(` - ${B}`)}S.commitMessage&&console.log(`${$e.dim}Suggested commit: ${S.commitMessage}${$e.reset}`);let X=c.input===0&&c.output===0?"n/a (provider does not report token counts)":c._estimated?`~${c.input} input / ~${c.output} output (est.)`:`${c.input} input + ${c.output} output`;return console.log(`${$e.dim}Tokens: ${X}${$e.reset}
672
+ `),{results:v,synthesis:S,totalTokens:c}}hh.exports={runOrchestrated:Sv,decompose:ph,synthesize:mh,detectComplexPrompt:kv,extractJSON:sl,createSemaphore:fh,DECOMPOSE_PROMPT:lh,SYNTHESIZE_PROMPT:uh,DEFAULT_ORCHESTRATOR_MODEL:ch,DEFAULT_WORKER_MODEL:ah,DEFAULT_MAX_PARALLEL:ih,DEFAULT_MAX_SUBTASKS:Fi,withRetry:dh}});var ve=Q((CR,Dh)=>{var{C:$,Spinner:oo,TaskProgress:Ev,formatToolCall:Tv,formatToolSummary:Ah,formatSectionHeader:Ui,formatMilestone:Rv,setActiveTaskProgress:kR}=Fe(),{debugLog:W,warnLog:SR}=zr(),{MilestoneTracker:Cv}=Ed(),{callStream:gh}=je(),{parseToolArgs:Av}=Fs(),{executeTool:Ov}=Gt(),{gatherProjectContext:Nv}=Ni(),{fitToContext:Mv,forceCompress:un,getUsage:Zt,estimateTokens:Pv}=Rt(),{autoSave:Lv,flushAutoSave:Iv}=Jt(),{scoreMessages:jv,formatScore:Dv,appendScoreHistory:qv}=Pi(),{detectCategory:Fv,getModelForPhase:pl,getPhaseBudget:hs,isPhaseRoutingEnabled:Uv}=In();function Ze(t){Lv(t),Iv()}function Bv(t){if(!t||typeof t!="string")return!0;let e=t.trim();return!!(e.length<80||/^(done|complete|finished|all done|analysis complete|finally done)[.!]*$/i.test(e)||/^[^.!]{0,40}\?$/.test(e))}function $h(t){try{if(!t.some(o=>o.role!=="assistant"?!1:!!(Array.isArray(o.content)&&o.content.some(s=>s&&s.type==="tool_use")||Array.isArray(o.tool_calls)&&o.tool_calls.length>0)))return;let n=jv(t);if(!n)return;console.log(Dv(n,$));try{let{_getSessionsDir:o}=Jt(),s=require("fs"),r=require("path").join(o(),"_autosave.json");if(s.existsSync(r)){let i=JSON.parse(s.readFileSync(r,"utf-8"));i.score=n.score,i.scoreGrade=n.grade,i.scoreIssues=n.issues,s.writeFileSync(r,JSON.stringify(i,null,2))}}catch{}try{let{getActiveModel:o}=Fs(),s=As();qv(n.score,{version:s.version,model:o?o():null,sessionName:"_autosave",issues:n.issues})}catch{}}catch{}}var{getMemoryContext:Wv}=ln(),{getDeploymentContextBlock:Hv,probeUrlServer:Kv}=Bc(),{getFewShotForInput:Gv}=Om(),{checkPermission:Yv,setPermission:zv,savePermissions:Xv}=tr(),{confirm:Oh,setAllowAlwaysHandler:Jv,getAutoConfirm:Vv}=ft(),{isPlanMode:fr,getPlanModePrompt:Zv,PLAN_MODE_ALLOWED_TOOLS:Nh,setPlanContent:Qv,extractStepsFromText:ek,createPlan:tk,getActivePlan:ER,startExecution:TR,advancePlanStep:nk,getPlanStepInfo:sk}=Vt(),{StreamRenderer:ok}=Zm(),{runHooks:yh}=nl(),{routeMCPCall:rk,getMCPToolDefinitions:ik}=ti(),{getSkillInstructions:ak,getSkillToolDefinitions:ck,routeSkillCall:lk,matchSkillTriggers:uk}=Mn(),{trackUsage:wh,estimateTokens:bh}=qs();function _h(t){return!t||typeof t!="string"?0:typeof bh=="function"?bh(t):Math.ceil(t.length/4)}var{validateToolArgs:dk}=ac(),{filterToolsForModel:xh,getModelTier:fk,PROVIDER_DEFAULT_TIER:RR}=Ro(),{getConfiguredProviders:pk,getActiveProviderName:ro,getActiveModelId:fn,setActiveModel:vh,MODEL_EQUIVALENTS:ea}=je(),{getModelProfile:mk,getModelBriefing:hk}=hi(),kl=require("fs"),Sl=require("path"),gk=(()=>{let t=parseInt(process.env.NEX_MILESTONE_STEPS??"5",10);return Number.isFinite(t)&&t>=0?t:5})();function $k(t){let e=Rv(t.phaseName,t.stepCount,t.toolCounts,t.elapsed,t.filesRead,t.filesModified);process.stdout.write(`${e}
673
673
  `)}var kh=/(?:^|\s)((?:~|\.{1,2})?(?:\/[\w.\-@() ]+)+\.(?:png|jpe?g|gif|webp|bmp|tiff?))(?:\s|$)/gi;function yk(t){let e=[],n;for(kh.lastIndex=0;(n=kh.exec(t))!==null;){let o=n[1].trim(),s=o.startsWith("~")?o.replace("~",process.env.HOME||""):Sl.resolve(o);kl.existsSync(s)&&e.push({raw:o,abs:s})}return e}function wk(t){let e=kl.readFileSync(t),n=Sl.extname(t).toLowerCase().replace(".",""),o=n==="jpg"||n==="jpeg"?"image/jpeg":n==="png"?"image/png":n==="gif"?"image/gif":n==="webp"?"image/webp":"image/png";return{data:e.toString("base64"),media_type:o}}function Mh(t){let e=yk(t);if(e.length===0)return t;let n=[{type:"text",text:t}];for(let o of e)try{let{data:s,media_type:r}=wk(o.abs);n.push({type:"image",media_type:r,data:s})}catch{}return n.length>1?n:t}function bk(t){if(!t||t.length<200)return{text:t,truncated:!1,repeatCount:0};let n=t.split(/(?<=\. )/).filter(l=>l.trim().length>0);if(n.length<6)return{text:t,truncated:!1,repeatCount:0};let o=new Map;for(let l=0;l<=n.length-3;l++){let u=n.slice(l,l+3).join("").trim();u.length>30&&o.set(u,(o.get(u)||0)+1)}let s=0,r="";for(let[l,u]of o)u>s&&(s=u,r=l);if(s<3)return{text:t,truncated:!1,repeatCount:s};let i=`
674
674
 
675
675
  [SYSTEM: Output repetition detected \u2014 response truncated (${s}\xD7 repeated paragraph)]`,c;if(t.length>8e3)c=t.slice(0,3e3)+i;else{let l=0,u=-1,d=0;for(;l<2;){let f=t.indexOf(r,d);if(f===-1)break;l++,u=f+r.length,d=f+1}c=u>0?t.slice(0,u)+i:t.slice(0,3e3)+i}return{text:c,truncated:!0,repeatCount:s}}function ml(t,e=5){if(!t||t.length<40)return{text:t,truncated:!1,repeatCount:0};let n=t.split(`
676
676
  `),o=new Map;for(let f of n){let p=f.trim();p.length>=20&&o.set(p,(o.get(p)||0)+1)}let s=0,r="";for(let[f,p]of o)p>s&&(s=p,r=f);if(s<=e)return{text:t,truncated:!1,repeatCount:s};let i=`
677
677
 
678
- \u26A0 [Response truncated: repeated paragraph detected (${s}\xD7)]`,c=0,l=-1,u=0;for(;c<e;){let f=t.indexOf(r,u);if(f===-1)break;c++,l=f+r.length,u=f+1}return{text:l>0?t.slice(0,l)+i:t.slice(0,2e3)+i,truncated:!0,repeatCount:s}}var ol=null,rl=null,il=null;function pt(){if(ol===null){let{TOOL_DEFINITIONS:t}=Gt();ol=t}return rl===null&&(rl=ck()),il===null&&(il=ik()),[...ol,...rl,...il]}var hl=50;function _k(t){Number.isFinite(t)&&t>0&&(hl=t)}var Hi=()=>null;function xk(t){Hi=t}var ir=null,gl=null,io=null,Ki=new Map,vk=1e4,kk=6e3,Sk=/\b((?:API|ACCESS|AUTH|BEARER|CLIENT|GITHUB|GITLAB|SLACK|STRIPE|TWILIO|SENDGRID|AWS|GCP|AZURE|OPENAI|ANTHROPIC|GEMINI|OLLAMA)[_A-Z0-9]*(?:KEY|TOKEN|SECRET|PASS(?:WORD)?|CREDENTIAL)[_A-Z0-9]*)\s*=\s*["']?([A-Za-z0-9\-_.+/=]{10,})["']?/g;function Ek(t){return!t||typeof t!="string"?t:t.replace(Sk,(e,n)=>`${n}=***REDACTED***`)}var Tk=7e3,Rk=4e3;function Ck(t,e=null){let n=Ek(t),o=Pv(n),s=e==="read_file"?Tk:vk,r=e==="read_file"?Rk:kk;if(o>s)try{let{compressToolResult:i}=Rt();return i(n,r)}catch{return n}return n}function Ph(t){try{let{getActiveModel:e}=je(),n=e(),o=n?`${n.provider}:${n.id}`:"default";if(Ki.has(o))return Ki.get(o);let s=xh(t);return Ki.set(o,s),s}catch{return xh(t)}}function Ak(){Ki.clear()}var ar={hash:null,ts:0},Ok=3e4;async function Lh(){if(ar.hash&&Date.now()-ar.ts<Ok)return ar.hash;try{let t=require("fs").promises,e=require("path"),n=[e.join(process.cwd(),"package.json"),e.join(process.cwd(),".git","HEAD"),e.join(process.cwd(),"README.md"),e.join(process.cwd(),"NEX.md")],s=(await Promise.allSettled(n.map(i=>t.stat(i).then(c=>`${i}:${c.mtimeMs}`)))).filter(i=>i.status==="fulfilled").map(i=>i.value);try{let{getMemoryContextHash:i}=cn(),c=i();c&&s.push(`memory:${c}`)}catch{}try{let i=e.join(process.cwd(),".nex","brain");if(kl.existsSync(i)){let c=await t.stat(i);s.push(`brain:${c.mtimeMs}`)}}catch{}let r=s.join("|");return ar={hash:r,ts:Date.now()},r}catch{return`fallback:${Date.now()}`}}function $l(){ir=null,gl=null,ar={hash:null,ts:0},io=null}var Nk=new Set(["spawn_agents"]),al=5,cl=3,Bi=2,Sh=6e4,ll=12e4,Mk=process.env.NEX_STALE_AUTO_SWITCH!=="0";function Pk(t){try{let e=require("fs"),n=require("path"),o=n.join(process.cwd(),".nex","plans");e.existsSync(o)||e.mkdirSync(o,{recursive:!0});let s=n.join(o,"current-plan.md");e.writeFileSync(s,t,"utf-8")}catch{}}Jv(t=>{zv(t,"allow"),Xv(),console.log(`${$.green} \u2713 ${t}: always allow${$.reset}`)});async function Lk(t){let e=t.function.name,n=Av(t.function.arguments),o=t.id||`cli-${Date.now()}-${Math.random().toString(36).slice(2,6)}`;if(!n){let d=pt().find(p=>p.function.name===e),f=d?JSON.stringify(d.function.parameters,null,2):"unknown";return W(`${$.yellow} \u26A0 ${e}: malformed arguments, sending schema hint${$.reset}`),{callId:o,fnName:e,args:null,canExecute:!1,errorResult:{role:"tool",content:`ERROR: Malformed tool arguments. Could not parse your arguments as JSON.
678
+ \u26A0 [Response truncated: repeated paragraph detected (${s}\xD7)]`,c=0,l=-1,u=0;for(;c<e;){let f=t.indexOf(r,u);if(f===-1)break;c++,l=f+r.length,u=f+1}return{text:l>0?t.slice(0,l)+i:t.slice(0,2e3)+i,truncated:!0,repeatCount:s}}var ol=null,rl=null,il=null;function pt(){if(ol===null){let{TOOL_DEFINITIONS:t}=Gt();ol=t}return rl===null&&(rl=ck()),il===null&&(il=ik()),[...ol,...rl,...il]}var hl=50;function _k(t){Number.isFinite(t)&&t>0&&(hl=t)}var Hi=()=>null;function xk(t){Hi=t}var ir=null,gl=null,io=null,Ki=new Map,vk=1e4,kk=6e3,Sk=/\b((?:API|ACCESS|AUTH|BEARER|CLIENT|GITHUB|GITLAB|SLACK|STRIPE|TWILIO|SENDGRID|AWS|GCP|AZURE|OPENAI|ANTHROPIC|GEMINI|OLLAMA)[_A-Z0-9]*(?:KEY|TOKEN|SECRET|PASS(?:WORD)?|CREDENTIAL)[_A-Z0-9]*)\s*=\s*["']?([A-Za-z0-9\-_.+/=]{10,})["']?/g;function Ek(t){return!t||typeof t!="string"?t:t.replace(Sk,(e,n)=>`${n}=***REDACTED***`)}var Tk=7e3,Rk=4e3;function Ck(t,e=null){let n=Ek(t),o=Pv(n),s=e==="read_file"?Tk:vk,r=e==="read_file"?Rk:kk;if(o>s)try{let{compressToolResult:i}=Rt();return i(n,r)}catch{return n}return n}function Ph(t){try{let{getActiveModel:e}=je(),n=e(),o=n?`${n.provider}:${n.id}`:"default";if(Ki.has(o))return Ki.get(o);let s=xh(t);return Ki.set(o,s),s}catch{return xh(t)}}function Ak(){Ki.clear()}var ar={hash:null,ts:0},Ok=3e4;async function Lh(){if(ar.hash&&Date.now()-ar.ts<Ok)return ar.hash;try{let t=require("fs").promises,e=require("path"),n=[e.join(process.cwd(),"package.json"),e.join(process.cwd(),".git","HEAD"),e.join(process.cwd(),"README.md"),e.join(process.cwd(),"NEX.md")],s=(await Promise.allSettled(n.map(i=>t.stat(i).then(c=>`${i}:${c.mtimeMs}`)))).filter(i=>i.status==="fulfilled").map(i=>i.value);try{let{getMemoryContextHash:i}=ln(),c=i();c&&s.push(`memory:${c}`)}catch{}try{let i=e.join(process.cwd(),".nex","brain");if(kl.existsSync(i)){let c=await t.stat(i);s.push(`brain:${c.mtimeMs}`)}}catch{}let r=s.join("|");return ar={hash:r,ts:Date.now()},r}catch{return`fallback:${Date.now()}`}}function $l(){ir=null,gl=null,ar={hash:null,ts:0},io=null}var Nk=new Set(["spawn_agents"]),al=5,cl=3,Bi=2,Sh=6e4,ll=12e4,Mk=process.env.NEX_STALE_AUTO_SWITCH!=="0";function Pk(t){try{let e=require("fs"),n=require("path"),o=n.join(process.cwd(),".nex","plans");e.existsSync(o)||e.mkdirSync(o,{recursive:!0});let s=n.join(o,"current-plan.md");e.writeFileSync(s,t,"utf-8")}catch{}}Jv(t=>{zv(t,"allow"),Xv(),console.log(`${$.green} \u2713 ${t}: always allow${$.reset}`)});async function Lk(t){let e=t.function.name,n=Av(t.function.arguments),o=t.id||`cli-${Date.now()}-${Math.random().toString(36).slice(2,6)}`;if(!n){let d=pt().find(p=>p.function.name===e),f=d?JSON.stringify(d.function.parameters,null,2):"unknown";return W(`${$.yellow} \u26A0 ${e}: malformed arguments, sending schema hint${$.reset}`),{callId:o,fnName:e,args:null,canExecute:!1,errorResult:{role:"tool",content:`ERROR: Malformed tool arguments. Could not parse your arguments as JSON.
679
679
  Raw input: ${typeof t.function.arguments=="string"?t.function.arguments.substring(0,200):"N/A"}
680
680
 
681
681
  Expected JSON schema for "${e}":
@@ -689,9 +689,9 @@ Please retry the tool call with valid JSON arguments matching this schema.`,tool
689
689
  `)[0],c=i.startsWith("ERROR")||i.includes("CANCELLED")||i.includes("BLOCKED")||t.fnName==="spawn_agents"&&!/✓ Agent/.test(r)&&/✗ Agent/.test(r),l=Ah(t.fnName,t.args,r,c);e||console.log(l),pn?.onToolEnd&&pn.onToolEnd(t.fnName,l,!c);let u=yh("post-tool",{tool_name:t.fnName});if(!e&&u.length>0)for(let h of u)h.success?console.log(`${$.dim} [hook post-tool] ${h.command} \u2192 ${h.output||"ok"}${$.reset}`):console.log(`${$.yellow} [hook post-tool] ${h.command} \u2192 ERROR: ${h.error}${$.reset}`);let f=Ck(r,t.fnName);if(t.fnName==="bash"&&t.args?.command){let h=t.args.command.trim();!/cat\s*>|<</.test(h)&&/\bcat\s+\S/.test(h)?f+=`
690
690
  HINT: use read_file instead of bash cat \u2014 it is faster, context-efficient, and the preferred tool for reading files.`:/^\s*ls(\s|$)/.test(h)&&!/npm|yarn|pnpm|make|git\b/.test(h)?f+=`
691
691
  HINT: use list_directory instead of bash ls \u2014 it is the preferred tool for listing directory contents.`:/\bfind\s+\S/.test(h)&&!/git\b|npm\b|-exec\b|-delete\b|-print0\b/.test(h)&&(f+=`
692
- HINT: use glob instead of bash find for file discovery \u2014 it is faster and the preferred tool (e.g. glob('**/*.jsx')).`)}return{msg:{role:"tool",content:f,tool_call_id:t.callId},summary:l}}var Dk=[{re:/TypeError:\s*([^\n]{0,120})/i,label:"TypeError"},{re:/SyntaxError:\s*([^\n]{0,120})/i,label:"SyntaxError"},{re:/ReferenceError:\s*([^\n]{0,120})/i,label:"ReferenceError"},{re:/Cannot find module\s*'([^']+)'/i,label:"Cannot find module"},{re:/Error:\s*ENOENT[^\n]{0,120}/i,label:"ENOENT"},{re:/Error:\s*EACCES[^\n]{0,120}/i,label:"EACCES"},{re:/Error:\s*EADDRINUSE[^\n]{0,120}/i,label:"EADDRINUSE"},{re:/ImportError:\s*([^\n]{0,120})/i,label:"ImportError"},{re:/ModuleNotFoundError:\s*([^\n]{0,120})/i,label:"ModuleNotFoundError"},{re:/NameError:\s*([^\n]{0,120})/i,label:"NameError"},{re:/AttributeError:\s*([^\n]{0,120})/i,label:"AttributeError"},{re:/KeyError:\s*([^\n]{0,120})/i,label:"KeyError"},{re:/ValueError:\s*([^\n]{0,120})/i,label:"ValueError"},{re:/panic:\s*([^\n]{0,120})/i,label:"Go panic"},{re:/java\.lang\.\w+Exception[^\n]{0,80}/i,label:"Java exception"}];function dl(t){for(let{re:e,label:n}of Dk){let o=t.match(e);if(o){let s=(o[1]||"").trim();return s?`${n}: ${s}`:n}}return null}async function qk(t,e=!1,n={}){let o=new Array(t.length),s=[],r=[],i=null;if(e&&!n.skipSpinner){let l=t.filter(u=>u.canExecute);if(l.length>0){let u;if(l.length===1){let d=l[0],f=jk(d.fnName,d.args);u=`\u23FA ${d.fnName}${f?`(${f})`:""}`}else{let d=l.map(f=>f.fnName).join(", ");u=`\u23FA ${l.length} tools: ${d.length>60?d.substring(0,57)+"\u2026":d}`}i=new oo(u),i.start()}}async function c(){if(r.length!==0){if(r.length===1){let l=r[0],{msg:u,summary:d}=await ul(t[l],e);o[l]=u,s.push(d)}else{let l=r.map(d=>ul(t[d],e)),u=await Promise.all(l);for(let d=0;d<r.length;d++)o[r[d]]=u[d].msg,s.push(u[d].summary)}r=[]}}for(let l=0;l<t.length;l++){let u=t[l];if(!u.canExecute){await c(),o[l]=u.errorResult,s.push(Ah(u.fnName,u.args||{},u.errorResult.content,!0));continue}if(Nk.has(u.fnName)){await c(),u.fnName==="spawn_agents"&&i&&(i.stop(),i=null);let{msg:d,summary:f}=await ul(u,e);o[l]=d,s.push(f)}else r.push(l)}if(await c(),i&&i.stop(),e&&s.length>0&&!n.skipSummaries)for(let l of s)console.log(l);return{results:o,summaries:s}}var H=[],Eh=300,Ih=900*1e3;function gs(t,e){let n=t.get(e);return n?Date.now()-n.ts>Ih?(t.delete(e),0):n.count:0}function $s(t,e){let n=t.get(e),o=n&&Date.now()-n.ts<=Ih?n.count+1:1;return t.set(e,{count:o,ts:Date.now()}),o}function Th(t,e,n){t.set(e,{count:n,ts:Date.now()})}var El=new Map,Tl=new Map,pr=new Map,Rl=new Map,mr=new Map,xs=new Map,Dn=new Map,Cl=new Map,ys=new Map,vs=new Map,Rh=new Map,ta=new Map,na=new Map,Ut=0,cr=0,Gi=0,yl="",Yi=0,Nt=!1,Wi=0,zi=0,ws=-1,wl=!1,Xi=0,Ji=!1,dn=0,Zt=!1,vn=0,Qt=0,ot=!1,kt="",lr=0,jn=0,Vi="",bs=0,_s=0,Zi="",Bt=!1,bl=!1,hr=new Map,gr=new Set,ur=null,fl=!1,or=0,Ch=!1,Xe="plan",sa=0,Te=!1,qn=0,kn=null,_l=null,xl=null,dr=0,ao=null;function so(t,e){t===yl?(Yi++,zr().DEBUG&&process.stdout.write(`\x1B[1A\x1B[2K${e} \u26A0 ${t} (\xD7${Yi})${$.reset}
692
+ HINT: use glob instead of bash find for file discovery \u2014 it is faster and the preferred tool (e.g. glob('**/*.jsx')).`)}return{msg:{role:"tool",content:f,tool_call_id:t.callId},summary:l}}var Dk=[{re:/TypeError:\s*([^\n]{0,120})/i,label:"TypeError"},{re:/SyntaxError:\s*([^\n]{0,120})/i,label:"SyntaxError"},{re:/ReferenceError:\s*([^\n]{0,120})/i,label:"ReferenceError"},{re:/Cannot find module\s*'([^']+)'/i,label:"Cannot find module"},{re:/Error:\s*ENOENT[^\n]{0,120}/i,label:"ENOENT"},{re:/Error:\s*EACCES[^\n]{0,120}/i,label:"EACCES"},{re:/Error:\s*EADDRINUSE[^\n]{0,120}/i,label:"EADDRINUSE"},{re:/ImportError:\s*([^\n]{0,120})/i,label:"ImportError"},{re:/ModuleNotFoundError:\s*([^\n]{0,120})/i,label:"ModuleNotFoundError"},{re:/NameError:\s*([^\n]{0,120})/i,label:"NameError"},{re:/AttributeError:\s*([^\n]{0,120})/i,label:"AttributeError"},{re:/KeyError:\s*([^\n]{0,120})/i,label:"KeyError"},{re:/ValueError:\s*([^\n]{0,120})/i,label:"ValueError"},{re:/panic:\s*([^\n]{0,120})/i,label:"Go panic"},{re:/java\.lang\.\w+Exception[^\n]{0,80}/i,label:"Java exception"}];function dl(t){for(let{re:e,label:n}of Dk){let o=t.match(e);if(o){let s=(o[1]||"").trim();return s?`${n}: ${s}`:n}}return null}async function qk(t,e=!1,n={}){let o=new Array(t.length),s=[],r=[],i=null;if(e&&!n.skipSpinner){let l=t.filter(u=>u.canExecute);if(l.length>0){let u;if(l.length===1){let d=l[0],f=jk(d.fnName,d.args);u=`\u23FA ${d.fnName}${f?`(${f})`:""}`}else{let d=l.map(f=>f.fnName).join(", ");u=`\u23FA ${l.length} tools: ${d.length>60?d.substring(0,57)+"\u2026":d}`}i=new oo(u),i.start()}}async function c(){if(r.length!==0){if(r.length===1){let l=r[0],{msg:u,summary:d}=await ul(t[l],e);o[l]=u,s.push(d)}else{let l=r.map(d=>ul(t[d],e)),u=await Promise.all(l);for(let d=0;d<r.length;d++)o[r[d]]=u[d].msg,s.push(u[d].summary)}r=[]}}for(let l=0;l<t.length;l++){let u=t[l];if(!u.canExecute){await c(),o[l]=u.errorResult,s.push(Ah(u.fnName,u.args||{},u.errorResult.content,!0));continue}if(Nk.has(u.fnName)){await c(),u.fnName==="spawn_agents"&&i&&(i.stop(),i=null);let{msg:d,summary:f}=await ul(u,e);o[l]=d,s.push(f)}else r.push(l)}if(await c(),i&&i.stop(),e&&s.length>0&&!n.skipSummaries)for(let l of s)console.log(l);return{results:o,summaries:s}}var H=[],Eh=300,Ih=900*1e3;function gs(t,e){let n=t.get(e);return n?Date.now()-n.ts>Ih?(t.delete(e),0):n.count:0}function $s(t,e){let n=t.get(e),o=n&&Date.now()-n.ts<=Ih?n.count+1:1;return t.set(e,{count:o,ts:Date.now()}),o}function Th(t,e,n){t.set(e,{count:n,ts:Date.now()})}var El=new Map,Tl=new Map,pr=new Map,Rl=new Map,mr=new Map,xs=new Map,Dn=new Map,Cl=new Map,ys=new Map,vs=new Map,Rh=new Map,ta=new Map,na=new Map,Ut=0,cr=0,Gi=0,yl="",Yi=0,Nt=!1,Wi=0,zi=0,ws=-1,wl=!1,Xi=0,Ji=!1,dn=0,Qt=!1,vn=0,en=0,ot=!1,kt="",lr=0,jn=0,Vi="",bs=0,_s=0,Zi="",Bt=!1,bl=!1,hr=new Map,gr=new Set,ur=null,fl=!1,or=0,Ch=!1,Xe="plan",sa=0,Te=!1,qn=0,kn=null,_l=null,xl=null,dr=0,ao=null;function so(t,e){t===yl?(Yi++,zr().DEBUG&&process.stdout.write(`\x1B[1A\x1B[2K${e} \u26A0 ${t} (\xD7${Yi})${$.reset}
693
693
  `)):(yl=t,Yi=1,W(`${e} \u26A0 ${t}${$.reset}`))}var Qi=[];function Fk(t){Qi.push(t.trim())}function Uk(){return Qi.length===0?null:Qi.splice(0,Qi.length).join(`
694
- `)}function rr(t,e,n,o){if(!Te)return null;let s=Xe;Xe=t,sa=0,kn=pl(t,ao),dn=0,Zt=!1,vn=0,Qt=0,xs.clear(),Dn.clear(),vs.clear(),ta.clear(),na.clear(),Tl.clear(),pr.clear(),Rl.clear(),mr.clear(),El.clear(),Cl.clear();let r;if(t==="implement")_l=e?.slice(0,800)||"",r=`[PHASE: IMPLEMENTATION] Analysis complete. Based on the analysis:
694
+ `)}function rr(t,e,n,o){if(!Te)return null;let s=Xe;Xe=t,sa=0,kn=pl(t,ao),dn=0,Qt=!1,vn=0,en=0,xs.clear(),Dn.clear(),vs.clear(),ta.clear(),na.clear(),Tl.clear(),pr.clear(),Rl.clear(),mr.clear(),El.clear(),Cl.clear();let r;if(t==="implement")_l=e?.slice(0,800)||"",r=`[PHASE: IMPLEMENTATION] Analysis complete. Based on the analysis:
695
695
  ${_l}
696
696
 
697
697
  Now implement the fix/changes. Do not investigate further \u2014 edit files directly.`;else if(t==="verify"){xl=e?.slice(0,500)||"";let i=n?[...n].join(", "):"none";r=`[PHASE: VERIFICATION] Implementation complete. Verify the changes:
@@ -1150,7 +1150,7 @@ class ErrorBoundary extends React.Component {
1150
1150
  - Use migrations for schema changes, never manual ALTER TABLE
1151
1151
  - Add database-level constraints (unique, foreign key, check) not just app-level
1152
1152
 
1153
- `,gl=t,ir}function jh(){El.clear(),Tl.clear(),pr.clear(),Rl.clear(),mr.clear(),xs.clear(),Dn.clear(),Cl.clear(),ys.clear(),vs.clear(),ta.clear(),na.clear(),Ut=0,cr=0,Gi=0,Nt=!1,zi=0,ws=-1,wl=!1,Xi=0,Ji=!1,dn=0,Zt=!1,vn=0,Qt=0,ot=!1,kt="",lr=0,Vi="",bs=0,Zi="",_s=0,Bt=!1,bl=!1,Xe="plan",sa=0,Te=!1,kn=null,_l=null,xl=null,dr=0,qn=0,ao=null,hr.clear(),gr.clear(),yl="",Yi=0}function Hk(){H=[],ur=null,jh()}function Kk(){H.length>Eh&&H.splice(0,H.length-Eh)}function Gk(){return H.length}function Yk(){return H}function zk(t){H=t}async function Xk(){let{execFile:t}=require("child_process"),e=require("fs"),n=process.cwd(),o=(f,p)=>new Promise(h=>{t(f,p,{cwd:n,timeout:3e3},(m,g)=>{h(m?"":(g||"").trim())})}),[s]=await Promise.all([o("find",[".","-type","f","-not","-path","*/node_modules/*","-not","-path","*/.git/*","-not","-path","*/dist/*","-not","-path","*/.next/*","-not","-path","*/build/*","-not","-path","*/__pycache__/*","-not","-path","*/vendor/*"])]),r=new Set(["js","ts","jsx","tsx","py","go","rs","rb","java","cpp","c","cs"]),i=(s?s.split(`
1153
+ `,gl=t,ir}function jh(){El.clear(),Tl.clear(),pr.clear(),Rl.clear(),mr.clear(),xs.clear(),Dn.clear(),Cl.clear(),ys.clear(),vs.clear(),ta.clear(),na.clear(),Ut=0,cr=0,Gi=0,Nt=!1,zi=0,ws=-1,wl=!1,Xi=0,Ji=!1,dn=0,Qt=!1,vn=0,en=0,ot=!1,kt="",lr=0,Vi="",bs=0,Zi="",_s=0,Bt=!1,bl=!1,Xe="plan",sa=0,Te=!1,kn=null,_l=null,xl=null,dr=0,qn=0,ao=null,hr.clear(),gr.clear(),yl="",Yi=0}function Hk(){H=[],ur=null,jh()}function Kk(){H.length>Eh&&H.splice(0,H.length-Eh)}function Gk(){return H.length}function Yk(){return H}function zk(t){H=t}async function Xk(){let{execFile:t}=require("child_process"),e=require("fs"),n=process.cwd(),o=(f,p)=>new Promise(h=>{t(f,p,{cwd:n,timeout:3e3},(m,g)=>{h(m?"":(g||"").trim())})}),[s]=await Promise.all([o("find",[".","-type","f","-not","-path","*/node_modules/*","-not","-path","*/.git/*","-not","-path","*/dist/*","-not","-path","*/.next/*","-not","-path","*/build/*","-not","-path","*/__pycache__/*","-not","-path","*/vendor/*"])]),r=new Set(["js","ts","jsx","tsx","py","go","rs","rb","java","cpp","c","cs"]),i=(s?s.split(`
1154
1154
  `):[]).filter(f=>{let p=f.split(".").pop();return r.has(p)});if(i.length<3)return null;let c={};for(let f of i){let p=f.split(".").pop();c[p]=(c[p]||0)+1}let u=` \u{1F4C1} ${Object.entries(c).sort((f,p)=>p[1]-f[1]).slice(0,4).map(([f,p])=>`${p} .${f}`).join(" \xB7 ")}`,d=Sl.join(n,"package.json");if(e.existsSync(d))try{let f=JSON.parse(e.readFileSync(d,"utf-8")),p=Object.keys({...f.dependencies||{},...f.devDependencies||{}});if(p.length>0){let h=p.slice(0,5).join(" \xB7 "),m=p.length>5?` +${p.length-5}`:"";u+=`
1155
1155
  \u{1F4E6} ${h}${m}`}}catch{}return u}function Jk(t){if(process.platform==="darwin")try{let{execFileSync:e}=require("child_process");e("osascript",["-e",`display notification "${t.replace(/"/g,'\\"')}" with title "nex-code"`],{timeout:3e3,stdio:"ignore"})}catch{}}function Qe(t,e,n,o,s,{suppressHint:r=!1}={}){if(t<1)return;let i=[...e.values()].reduce((u,d)=>u+d,0),c=`\u2500\u2500 ${t} ${t===1?"step":"steps"} \xB7 ${i} ${i===1?"tool":"tools"}`,l=0;if(s){let u=Date.now()-s;l=Math.round(u/1e3),c+=l>=60?` \xB7 ${Math.floor(l/60)}m ${l%60}s`:` \xB7 ${l}s`}if(n.size>0&&(c+=` \xB7 ${n.size} ${n.size===1?"file":"files"} modified`),c+=" \u2500\u2500",console.log(`
1156
1156
  ${$.dim} ${c}${$.reset}`),l>=30&&process.stdout.isTTY){let u=n.size>0?`Done \u2014 ${n.size} ${n.size===1?"file":"files"} modified in ${l}s`:`Done \u2014 ${t} ${t===1?"step":"steps"} in ${l}s`;Jk(u)}if(gr.size>0&&hr.size>0)for(let u of gr){let d=hr.get(u);d&&console.log(`${$.dim} \u2714 task #${u} auto-matched: ${d.slice(0,60)}${$.reset}`)}n.size>0?console.log(`${$.dim} \u{1F4A1} /diff \xB7 /commit \xB7 /undo${$.reset}`):!r&&o.size>=5&&n.size===0&&t>=3?console.log(`${$.dim} \u{1F4A1} Found issues? Say "fix 1" or "apply all fixes"${$.reset}`):o.size>0&&t>=2&&console.log(`${$.dim} \u{1F4A1} /save \xB7 /clear${$.reset}`)}async function Vk(){if(!process.stdout.isTTY)return{action:"quit"};let t=ro(),e=fn(),n=ea.fast?.[t],o=ea.strong?.[t],s=n&&n!==e,r=o&&o!==e&&o!==n,i=[];i.push({key:"r",label:`Retry with current model ${$.dim}(${e})${$.reset}`}),s&&i.push({key:"f",label:`Switch to ${$.bold}${n}${$.reset} ${$.dim}\u2014 fast, low latency${$.reset}`,model:n}),r&&i.push({key:"s",label:`Switch to ${$.bold}${o}${$.reset} ${$.dim}\u2014 reliable tool-calling, medium speed${$.reset}`,model:o}),i.push({key:"q",label:`${$.dim}Quit${$.reset}`}),console.log(),console.log(`${$.yellow} Stream stale \u2014 all retries exhausted.${$.reset} What would you like to do?`);for(let c of i)console.log(` ${$.cyan}[${c.key}]${$.reset} ${c.label}`);return process.stdout.write(` ${$.yellow}> ${$.reset}`),new Promise(c=>{let l=process.stdin,u=l.isRaw;l.setRawMode(!0),l.resume(),l.setEncoding("utf8");let d=!1,f=p=>{if(d)return;d=!0,l.removeListener("data",f),l.setRawMode(u||!1),l.pause();let h=p.toLowerCase().trim();if(process.stdout.write(`${h}
@@ -1162,49 +1162,49 @@ ${t}`,ur=null);let r=Mh(s);H.push({role:"user",content:r}),Kk();let i=n.autoOrch
1162
1162
  ${Ne.instructions}`).join(`
1163
1163
  `);p+=`
1164
1164
  `+Ae+`
1165
- `}let g=[{role:"system",content:p},...H],y=new oo("Thinking...");y.start();let w=H.length===1,v=w?Xk().catch(()=>null):Promise.resolve(null),M=w?Kv(typeof t=="string"?t:"").catch(()=>null):Promise.resolve(null),C=pt(),[{messages:S,compressed:O,compacted:D,tokensRemoved:K},V,X]=await Promise.all([Mv(g,C),v,M]),B=Vt(g,C);if(y.stop(),V&&console.log(`${$.dim}${V}${$.reset}`),D)console.log(`${$.dim} [context compacted \u2014 summary (~${K} tokens freed)]${$.reset}`);else if(O){let Ae=B.limit>0?Math.round(K/B.limit*100):0;W(`${$.dim} [context compressed \u2014 ~${K} tokens freed (${Ae}%)]${$.reset}`)}B.percentage>85&&W(`${$.yellow} \u26A0 Context ${Math.round(B.percentage)}% used (${Math.round(100-B.percentage)}% remaining) \u2014 consider /clear or /save + start fresh${$.reset}`);let R=S;if(X&&w&&(R=[R[0],{role:"user",content:`[Server probe at task start]
1166
- ${X}`},{role:"assistant",content:"Understood \u2014 I have the server context. Proceeding with the task."},...R.slice(1)]),w){let Ae=Gv(typeof t=="string"?t:"");Ae&&(R=[R[0],{role:"user",content:Ae.user},{role:"assistant",content:Ae.assistant},...R.slice(1)])}if(Vt(R,pt()).percentage>=65){let{messages:Ne,tokensRemoved:qe}=un(R,pt());qe>0&&(R=Ne,console.log(`${$.dim} [pre-flight compress \u2014 ${qe} tokens freed, now ${Math.round(Vt(R,pt()).percentage)}% used]${$.reset}`))}let $e=0,be=0,fe=0,pe=0,xe=0,me=9,he=0,Re=(()=>{let Ae=H.find(Ne=>Ne.role==="user");return typeof Ae?.content=="string"?Ae.content:""})(),k=/set_reminder|google.?auth|cron:|api\.log|jarvis.{0,30}(fehler|error|fail|broken|crash|nicht.{0,10}(funktioniert|läuft)|debug)|(?:fehler|error|crash|broken|gecrasht|abgestürzt).{0,30}jarvis|swarm.{0,30}(agent|crash|gecrasht|abgestürzt|fail)|agent.{0,30}(gecrasht|abgestürzt|crashed|fail)|server.{0,30}(passiert|fehler|crash|problem)|am.server/i.test(Re),j=0;if(!ot){let Ae=H.filter(qe=>qe.role==="user"||qe.role==="tool").map(qe=>typeof qe.content=="string"?qe.content:"").join(`
1167
- `),Ne=dl(Ae);Ne&&(ot=!0,kt=Ne.slice(0,120),W(`${$.yellow} \u26A1 Root cause in briefing: ${kt} \u2014 fix phase active from start (read budget: 3)${$.reset}`))}!ot&&!Bt&&/\b(create|build|generate|implement|write|make|develop|set\s*up|scaffold|add)\b.{0,80}\b(app|component|page|game|api|backend|frontend|server|service|module|class|function|feature|project|system|bot|script|tool)\b/i.test(Re)&&(Bt=!0,W(`${$.cyan} \u26A1 Creation task detected \u2014 tight investigation cap (4 pre-edit, 2 post-edit)${$.reset}`)),H.length<=1&&(Te=Uv(),Te&&(ao=Fv(Re)?.id||"coding",Xe="plan",kn=pl("plan",ao),sa=0,dr=0,qn=0,process.stdout.isTTY&&console.log(`${$.dim} \u21B3 Phase routing: plan(${kn||"default"}) \u2192 implement \u2192 verify${$.reset}`),W(`${$.cyan} \u26A1 Phase routing enabled \u2014 plan phase with ${kn||"default model"} (category: ${ao})${$.reset}`)));let x=0,E=new Map,A=new Set,T=new Set,L=Date.now(),ae=new Cv(gk),se=Cl,we=3,Ce=5,tt=El,nt=5,Tn=8,wa=Tl,ba=Te?6:4,i$=Te?10:7,du=pr,a$=Te?5:3,fu=Te?8:5,c$=Rl,l$=Te?4:3,u$=Te?6:4,d$=3,f$=4,Er=xs,p$=Te?3:2,m$=Te?5:3,ho=Te?6:4,h$=25,Hn=0,g$=6,$$=10,Kn=0,pu=5,Gn=0,y$=2,w$=3,_a=0,go=10,b$=16,mu=o.investigationCap,Ve,nn=Te?hs(Xe):hl,xa=0,hu=3,va=!1;e:for(;;){for(va=!1,Ve=0;Ve<nn&&!Hi()?.aborted;Ve++){{let _=pt(),b=Vt(R,_),re=x===0?65:78;if(b.percentage>=re){let{messages:I,tokensRemoved:F}=un(R,_,x===0);if(F>0&&(R=I,F>50&&console.log(`${$.dim} [auto-compressed \u2014 ~${F} tokens freed, now ${Math.round(Vt(R,_).percentage)}%]${$.reset}`),Bt&&A.size>=3)){let ce=[...A].map(ye=>ye.split("/").pop()).slice(0,10).join(", "),G={role:"user",content:`[FRAMEWORK \u2014 context compressed] Task is IN PROGRESS. Already created ${A.size} files: ${ce}. DO NOT restart or re-investigate what was already done. Continue from where you left off.`};R.push(G)}}}if(Nt&&!ot&&lr<2){lr++;let _={role:"user",content:"[SYSTEM] SSH paused \u2014 you have made many consecutive SSH calls. Synthesize your findings so far: summarize what you learned and what the likely issue is. After your synthesis, SSH will be available again for targeted follow-up commands."};R.push(_),H.push(_),W(`${$.yellow} \u26A0 Pre-call SSH-blocked nudge #${lr} injected \u2014 model told to synthesize${$.reset}`)}Nt||(lr=0);let Ne=!0;x>0&&nk();let qe=null;if(u&&u.isActive())u._paused&&u.resume();else if(!u){let _,b=sk();if(b&&b.total>1){let re=b.description.length>40?b.description.slice(0,37)+"\u2026":b.description;_=`Plan step ${b.current}/${b.total}: ${re}`}else _=x>0?`Thinking... (step ${x+1})`:"Thinking...";qe=new oo(_),qe.start()}let Es=!0,It="",Ts=!1,ct=new ok,sn,ka=Date.now(),Tr=!1,Sa=new AbortController,gu=setInterval(()=>{let _=Date.now()-ka;if(_>=ll)ct._clearCursorLine(),W(`${$.yellow} \u26A0 Stream stale for ${Math.round(_/1e3)}s \u2014 aborting and retrying${$.reset}`),Sa.abort();else if(_>=Sh&&!Tr){Tr=!0,ct._clearCursorLine();let b=ea.fast?.[ro()],re=fe>0?` (retry ${fe+1}/${Bi})`:"",I=Math.round((ll-_)/1e3);W(`${$.yellow} \u26A0 No tokens received for ${Math.round(_/1e3)}s \u2014 waiting...${re}${$.reset}`),b&&b!==fn()?console.log(`${$.dim} \u{1F4A1} Will auto-switch to ${b} in ~${I}s if no tokens arrive${$.reset}`):console.log(`${$.dim} \u{1F4A1} Ctrl+C to abort \xB7 auto-abort in ~${I}s${$.reset}`)}},5e3),jt="",mn=null;try{let _=Ph(pt()),b=new Set(["read_file","list_directory","search_files","glob","grep","git_status","git_diff","git_log","git_show","ssh_exec"]),re=new Set(["read_file","list_directory","glob","grep","bash","git_status","git_diff","git_log","ssh_exec"]),I;fr()?I=_.filter(G=>Nh.has(G.function.name)):Te&&Xe==="plan"?I=_.filter(G=>b.has(G.function.name)):Te&&Xe==="verify"?I=_.filter(G=>re.has(G.function.name)):I=_;let F=Hi(),ce=new AbortController;F&&F.addEventListener("abort",()=>ce.abort(),{once:!0}),Sa.signal.addEventListener("abort",()=>ce.abort(),{once:!0}),sn=await gh(R,I,{signal:ce.signal,...kn?{model:kn}:{},onThinkingToken:()=>{ka=Date.now(),Tr=!1,pn?.onThinkingToken&&pn.onThinkingToken()},onToken:G=>{if(ka=Date.now(),Tr=!1,pn?.onToken){pn.onToken(G),It+=G;return}if(It+=G,!Ts&&It.length>400&&It.length%250<G.length+1){let ye=ml(It,3);ye.truncated&&(Ts=!0,ct._clearCursorLine?.(),W(`${$.yellow} \u26A0 LLM stream loop detected (${ye.repeatCount}\xD7 repeated) \u2014 suppressing display${$.reset}`))}Ts||(jt+=G,process.stdout.isTTY?mn||(mn=setTimeout(()=>{jt&&ct&&ct.push(jt),jt="",mn=null},50)):(ct.push(jt),jt=""),Es&&(u&&!u._paused?u.pause():qe&&qe.stop(),Ne||(Ne=!0),ct.startCursor(),Es=!1))}})}catch(_){if(clearInterval(gu),mn&&(clearTimeout(mn),mn=null),jt&&ct&&(ct.push(jt),jt=""),u&&!u._paused&&u.pause(),qe&&qe.stop(),ct.stopCursor(),Sa.signal.aborted&&!Hi()?.aborted){if(fe++,fe>Bi){if(pe<1){pe++,so("Stale retries exhausted \u2014 last-resort force-compress...",$.yellow);let ye=pt(),{messages:U,tokensRemoved:Y}=un(R,ye);R=U,Y>50&&W(`${$.dim} [force-compressed \u2014 ~${Y} tokens freed]${$.reset}`),fe=0,Ve--;continue}u&&(u.stop(),u=null);let G=await Vk();if(G.action==="quit"){l(null),Qe(x,E,A,T,L),Ze(H);break}G.action==="switch"&&(vh(`${G.provider}:${G.model}`),console.log(`${$.green} \u2713 Switched to ${G.provider}:${G.model}${$.reset}`)),fe=0,Ve--;continue}let F=fe===1?3e3:5e3;if(fe>=1&&he<1){he++,so(`Stale retry ${fe}/${Bi} \u2014 force-compressing before retry...`,$.yellow);let G=pt(),{messages:ye,tokensRemoved:U}=un(R,G,!0);if(R=ye,U>0&&U>50&&W(`${$.dim} [force-compressed \u2014 ~${U} tokens freed]${$.reset}`),Mk){let Y=ea.fast?.[ro()];Y&&Y!==fn()&&(vh(`${ro()}:${Y}`),console.log(`${$.cyan} \u26A1 Auto-switched to ${Y} to avoid further stale timeouts${$.reset}`),console.log(`${$.dim} (disable with NEX_STALE_AUTO_SWITCH=0)${$.reset}`))}}else W(`${$.yellow} \u26A0 Stale retry ${fe}/${Bi} \u2014 retrying in ${F/1e3}s...${$.reset}`);let ce=new oo(`Waiting ${F/1e3}s before retry...`);ce.start(),await new Promise(G=>setTimeout(G,F)),ce.stop(),Ve--;continue}if(_.name==="AbortError"||_.name==="CanceledError"||_.message?.includes("canceled")||_.message?.includes("aborted")){u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Ze(H);break}let b=_.message;if(_.code==="ECONNREFUSED"||_.message.includes("ECONNREFUSED"))b="Connection refused \u2014 please check your internet connection or API endpoint";else if(_.code==="ENOTFOUND"||_.message.includes("ENOTFOUND"))b="Network error \u2014 could not reach the API server. Please check your connection";else if(_.code==="ETIMEDOUT"||_.message.includes("timeout"))b="Request timed out \u2014 the API server took too long to respond. Please try again";else if(_.message.includes("401")||_.message.includes("Unauthorized"))b="Authentication failed \u2014 please check your API key in the .env file";else if(_.message.includes("403")||_.message.includes("Forbidden"))b="Access denied \u2014 your API key may not have permission for this model";else if(_.message.includes("404")){b=`Model not found (404): ${fn?fn():"unknown"} \u2014 check your .env MODEL setting or run /models to list available models`,console.log(`${$.red} \u2717 ${b}${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Ze(H);break}else if(_.message.includes("400")){if(pe<3&&xe<me){pe++,xe++;let F=x===0&&pe===1,ce=F||pe===3||he>0;if(F){pe=3;let Y=_.message.replace(/^API Error(\s*\[HTTP \d+\])?:\s*/i,"").slice(0,150);so(`Bad request (400) \u2014 ${Y||"system prompt too large"}, compressing...`,$.yellow)}else so(ce?`Bad request (400) \u2014 nuclear compression (attempt ${pe}/3, dropping history)...`:`Bad request (400) \u2014 force-compressing and retrying... (attempt ${pe}/3)`,$.yellow);let G=pt(),{messages:ye,tokensRemoved:U}=un(R,G,ce);R=ye,U>50&&W(`${$.dim} [force-compressed \u2014 ~${U} tokens freed]${$.reset}`),Ve--;continue}{let F=R.find(z=>z.role==="system"),ce=R.find(z=>z.role==="user"&&!String(z.content).startsWith("[SYSTEM")&&!String(z.content).startsWith("BLOCKED:")),G=[F,ce].filter(Boolean),{getUsage:ye}=Rt(),U=Rt().estimateMessagesTokens(G),Y=Rt().estimateMessagesTokens(R);if(U<Y){let z=[],ee=H.filter(ie=>ie.role==="assistant"&&typeof ie.content=="string"&&ie.content.trim().length>30).slice(-5).map(ie=>ie.content.trim().slice(0,300).replace(/\n+/g," "));ee.length>0&&z.push(`Key findings:
1168
- `+ee.map(ie=>`- ${ie}`).join(`
1169
- `));let te=H.filter(ie=>ie.role==="tool"&&typeof ie.content=="string"&&!ie.content.startsWith("BLOCKED:")&&ie.content.trim().length>10).slice(-5).map(ie=>ie.content.trim().split(`
1165
+ `}let g=[{role:"system",content:p},...H],y=new oo("Thinking...");y.start();let w=H.length===1,v=w?Xk().catch(()=>null):Promise.resolve(null),M=w?Kv(typeof t=="string"?t:"").catch(()=>null):Promise.resolve(null),C=pt(),[{messages:S,compressed:O,compacted:D,tokensRemoved:K},V,X]=await Promise.all([Mv(g,C),v,M]),B=Zt(g,C);if(y.stop(),V&&console.log(`${$.dim}${V}${$.reset}`),D)console.log(`${$.dim} [context compacted \u2014 summary (~${K} tokens freed)]${$.reset}`);else if(O){let Ae=B.limit>0?Math.round(K/B.limit*100):0;W(`${$.dim} [context compressed \u2014 ~${K} tokens freed (${Ae}%)]${$.reset}`)}B.percentage>85&&W(`${$.yellow} \u26A0 Context ${Math.round(B.percentage)}% used (${Math.round(100-B.percentage)}% remaining) \u2014 consider /clear or /save + start fresh${$.reset}`);let R=S;if(X&&w&&(R=[R[0],{role:"user",content:`[Server probe at task start]
1166
+ ${X}`},{role:"assistant",content:"Understood \u2014 I have the server context. Proceeding with the task."},...R.slice(1)]),w){let Ae=Gv(typeof t=="string"?t:"");Ae&&(R=[R[0],{role:"user",content:Ae.user},{role:"assistant",content:Ae.assistant},...R.slice(1)])}if(Zt(R,pt()).percentage>=65){let{messages:Ne,tokensRemoved:qe}=un(R,pt());qe>0&&(R=Ne,console.log(`${$.dim} [pre-flight compress \u2014 ${qe} tokens freed, now ${Math.round(Zt(R,pt()).percentage)}% used]${$.reset}`))}let ye=0,be=0,fe=0,pe=0,xe=0,me=9,he=0,Re=(()=>{let Ae=H.find(Ne=>Ne.role==="user");return typeof Ae?.content=="string"?Ae.content:""})(),k=/set_reminder|google.?auth|cron:|api\.log|jarvis.{0,30}(fehler|error|fail|broken|crash|nicht.{0,10}(funktioniert|läuft)|debug)|(?:fehler|error|crash|broken|gecrasht|abgestürzt).{0,30}jarvis|swarm.{0,30}(agent|crash|gecrasht|abgestürzt|fail)|agent.{0,30}(gecrasht|abgestürzt|crashed|fail)|server.{0,30}(passiert|fehler|crash|problem)|am.server/i.test(Re),j=0;if(!ot){let Ae=H.filter(qe=>qe.role==="user"||qe.role==="tool").map(qe=>typeof qe.content=="string"?qe.content:"").join(`
1167
+ `),Ne=dl(Ae);Ne&&(ot=!0,kt=Ne.slice(0,120),W(`${$.yellow} \u26A1 Root cause in briefing: ${kt} \u2014 fix phase active from start (read budget: 3)${$.reset}`))}!ot&&!Bt&&/\b(create|build|generate|implement|write|make|develop|set\s*up|scaffold|add)\b.{0,80}\b(app|component|page|game|api|backend|frontend|server|service|module|class|function|feature|project|system|bot|script|tool)\b/i.test(Re)&&(Bt=!0,W(`${$.cyan} \u26A1 Creation task detected \u2014 tight investigation cap (4 pre-edit, 2 post-edit)${$.reset}`)),H.length<=1&&!n.skipPhaseRouting&&(Te=Uv(),Te&&(ao=Fv(Re)?.id||"coding",Xe="plan",kn=pl("plan",ao),sa=0,dr=0,qn=0,process.stdout.isTTY&&console.log(`${$.dim} \u21B3 Phase routing: plan(${kn||"default"}) \u2192 implement \u2192 verify${$.reset}`),W(`${$.cyan} \u26A1 Phase routing enabled \u2014 plan phase with ${kn||"default model"} (category: ${ao})${$.reset}`)));let x=0,E=new Map,A=new Set,T=new Set,L=Date.now(),ie=new Cv(gk),se=Cl,ge=3,Ce=5,tt=El,nt=5,Tn=8,wa=Tl,ba=Te?6:4,i$=Te?10:7,du=pr,a$=Te?5:3,fu=Te?8:5,c$=Rl,l$=Te?4:3,u$=Te?6:4,d$=3,f$=4,Er=xs,p$=Te?3:2,m$=Te?5:3,ho=Te?6:4,h$=25,Hn=0,g$=6,$$=10,Kn=0,pu=5,Gn=0,y$=2,w$=3,_a=0,go=10,b$=16,mu=o.investigationCap,Ve,sn=n.maxIterations||(Te?hs(Xe):hl),xa=0,hu=3,va=!1;e:for(;;){for(va=!1,Ve=0;Ve<sn&&!Hi()?.aborted;Ve++){{let _=pt(),b=Zt(R,_),re=x===0?65:78;if(b.percentage>=re){let{messages:I,tokensRemoved:F}=un(R,_,x===0);if(F>0&&(R=I,F>50&&console.log(`${$.dim} [auto-compressed \u2014 ~${F} tokens freed, now ${Math.round(Zt(R,_).percentage)}%]${$.reset}`),Bt&&A.size>=3)){let ce=[...A].map(we=>we.split("/").pop()).slice(0,10).join(", "),G={role:"user",content:`[FRAMEWORK \u2014 context compressed] Task is IN PROGRESS. Already created ${A.size} files: ${ce}. DO NOT restart or re-investigate what was already done. Continue from where you left off.`};R.push(G)}}}if(Nt&&!ot&&lr<2){lr++;let _={role:"user",content:"[SYSTEM] SSH paused \u2014 you have made many consecutive SSH calls. Synthesize your findings so far: summarize what you learned and what the likely issue is. After your synthesis, SSH will be available again for targeted follow-up commands."};R.push(_),H.push(_),W(`${$.yellow} \u26A0 Pre-call SSH-blocked nudge #${lr} injected \u2014 model told to synthesize${$.reset}`)}Nt||(lr=0);let Ne=!0;x>0&&nk();let qe=null;if(u&&u.isActive())u._paused&&u.resume();else if(!u){let _,b=sk();if(b&&b.total>1){let re=b.description.length>40?b.description.slice(0,37)+"\u2026":b.description;_=`Plan step ${b.current}/${b.total}: ${re}`}else _=x>0?`Thinking... (step ${x+1})`:"Thinking...";qe=new oo(_),qe.start()}let Es=!0,It="",Ts=!1,ct=new ok,on,ka=Date.now(),Tr=!1,Sa=new AbortController,gu=setInterval(()=>{let _=Date.now()-ka;if(_>=ll)ct._clearCursorLine(),W(`${$.yellow} \u26A0 Stream stale for ${Math.round(_/1e3)}s \u2014 aborting and retrying${$.reset}`),Sa.abort();else if(_>=Sh&&!Tr){Tr=!0,ct._clearCursorLine();let b=ea.fast?.[ro()],re=fe>0?` (retry ${fe+1}/${Bi})`:"",I=Math.round((ll-_)/1e3);W(`${$.yellow} \u26A0 No tokens received for ${Math.round(_/1e3)}s \u2014 waiting...${re}${$.reset}`),b&&b!==fn()?console.log(`${$.dim} \u{1F4A1} Will auto-switch to ${b} in ~${I}s if no tokens arrive${$.reset}`):console.log(`${$.dim} \u{1F4A1} Ctrl+C to abort \xB7 auto-abort in ~${I}s${$.reset}`)}},5e3),jt="",mn=null;try{let _=Ph(pt()),b=new Set(["read_file","list_directory","search_files","glob","grep","git_status","git_diff","git_log","git_show","ssh_exec"]),re=new Set(["read_file","list_directory","glob","grep","bash","git_status","git_diff","git_log","ssh_exec"]),I;fr()?I=_.filter(G=>Nh.has(G.function.name)):Te&&Xe==="plan"?I=_.filter(G=>b.has(G.function.name)):Te&&Xe==="verify"?I=_.filter(G=>re.has(G.function.name)):I=_;let F=Hi(),ce=new AbortController;F&&F.addEventListener("abort",()=>ce.abort(),{once:!0}),Sa.signal.addEventListener("abort",()=>ce.abort(),{once:!0}),on=await gh(R,I,{signal:ce.signal,...kn?{model:kn}:{},onThinkingToken:()=>{ka=Date.now(),Tr=!1,pn?.onThinkingToken&&pn.onThinkingToken()},onToken:G=>{if(ka=Date.now(),Tr=!1,pn?.onToken){pn.onToken(G),It+=G;return}if(It+=G,!Ts&&It.length>400&&It.length%250<G.length+1){let we=ml(It,3);we.truncated&&(Ts=!0,ct._clearCursorLine?.(),W(`${$.yellow} \u26A0 LLM stream loop detected (${we.repeatCount}\xD7 repeated) \u2014 suppressing display${$.reset}`))}Ts||(jt+=G,process.stdout.isTTY?mn||(mn=setTimeout(()=>{jt&&ct&&ct.push(jt),jt="",mn=null},50)):(ct.push(jt),jt=""),Es&&(u&&!u._paused?u.pause():qe&&qe.stop(),Ne||(Ne=!0),ct.startCursor(),Es=!1))}})}catch(_){if(clearInterval(gu),mn&&(clearTimeout(mn),mn=null),jt&&ct&&(ct.push(jt),jt=""),u&&!u._paused&&u.pause(),qe&&qe.stop(),ct.stopCursor(),Sa.signal.aborted&&!Hi()?.aborted){if(fe++,fe>Bi){if(pe<1){pe++,so("Stale retries exhausted \u2014 last-resort force-compress...",$.yellow);let we=pt(),{messages:U,tokensRemoved:Y}=un(R,we);R=U,Y>50&&W(`${$.dim} [force-compressed \u2014 ~${Y} tokens freed]${$.reset}`),fe=0,Ve--;continue}u&&(u.stop(),u=null);let G=await Vk();if(G.action==="quit"){l(null),Qe(x,E,A,T,L),Ze(H);break}G.action==="switch"&&(vh(`${G.provider}:${G.model}`),console.log(`${$.green} \u2713 Switched to ${G.provider}:${G.model}${$.reset}`)),fe=0,Ve--;continue}let F=fe===1?3e3:5e3;if(fe>=1&&he<1){he++,so(`Stale retry ${fe}/${Bi} \u2014 force-compressing before retry...`,$.yellow);let G=pt(),{messages:we,tokensRemoved:U}=un(R,G,!0);if(R=we,U>0&&U>50&&W(`${$.dim} [force-compressed \u2014 ~${U} tokens freed]${$.reset}`),Mk){let Y=ea.fast?.[ro()];Y&&Y!==fn()&&(vh(`${ro()}:${Y}`),console.log(`${$.cyan} \u26A1 Auto-switched to ${Y} to avoid further stale timeouts${$.reset}`),console.log(`${$.dim} (disable with NEX_STALE_AUTO_SWITCH=0)${$.reset}`))}}else W(`${$.yellow} \u26A0 Stale retry ${fe}/${Bi} \u2014 retrying in ${F/1e3}s...${$.reset}`);let ce=new oo(`Waiting ${F/1e3}s before retry...`);ce.start(),await new Promise(G=>setTimeout(G,F)),ce.stop(),Ve--;continue}if(_.name==="AbortError"||_.name==="CanceledError"||_.message?.includes("canceled")||_.message?.includes("aborted")){u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Ze(H);break}let b=_.message;if(_.code==="ECONNREFUSED"||_.message.includes("ECONNREFUSED"))b="Connection refused \u2014 please check your internet connection or API endpoint";else if(_.code==="ENOTFOUND"||_.message.includes("ENOTFOUND"))b="Network error \u2014 could not reach the API server. Please check your connection";else if(_.code==="ETIMEDOUT"||_.message.includes("timeout"))b="Request timed out \u2014 the API server took too long to respond. Please try again";else if(_.message.includes("401")||_.message.includes("Unauthorized"))b="Authentication failed \u2014 please check your API key in the .env file";else if(_.message.includes("403")||_.message.includes("Forbidden"))b="Access denied \u2014 your API key may not have permission for this model";else if(_.message.includes("404")){b=`Model not found (404): ${fn?fn():"unknown"} \u2014 check your .env MODEL setting or run /models to list available models`,console.log(`${$.red} \u2717 ${b}${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Ze(H);break}else if(_.message.includes("400")){if(pe<3&&xe<me){pe++,xe++;let F=x===0&&pe===1,ce=F||pe===3||he>0;if(F){pe=3;let Y=_.message.replace(/^API Error(\s*\[HTTP \d+\])?:\s*/i,"").slice(0,150);so(`Bad request (400) \u2014 ${Y||"system prompt too large"}, compressing...`,$.yellow)}else so(ce?`Bad request (400) \u2014 nuclear compression (attempt ${pe}/3, dropping history)...`:`Bad request (400) \u2014 force-compressing and retrying... (attempt ${pe}/3)`,$.yellow);let G=pt(),{messages:we,tokensRemoved:U}=un(R,G,ce);R=we,U>50&&W(`${$.dim} [force-compressed \u2014 ~${U} tokens freed]${$.reset}`),Ve--;continue}{let F=R.find(z=>z.role==="system"),ce=R.find(z=>z.role==="user"&&!String(z.content).startsWith("[SYSTEM")&&!String(z.content).startsWith("BLOCKED:")),G=[F,ce].filter(Boolean),{getUsage:we}=Rt(),U=Rt().estimateMessagesTokens(G),Y=Rt().estimateMessagesTokens(R);if(U<Y){let z=[],ee=H.filter(ae=>ae.role==="assistant"&&typeof ae.content=="string"&&ae.content.trim().length>30).slice(-5).map(ae=>ae.content.trim().slice(0,300).replace(/\n+/g," "));ee.length>0&&z.push(`Key findings:
1168
+ `+ee.map(ae=>`- ${ae}`).join(`
1169
+ `));let te=H.filter(ae=>ae.role==="tool"&&typeof ae.content=="string"&&!ae.content.startsWith("BLOCKED:")&&ae.content.trim().length>10).slice(-5).map(ae=>ae.content.trim().split(`
1170
1170
  `).slice(0,8).join(`
1171
1171
  `).slice(0,500));if(te.length>0&&z.push(`Tool results summary:
1172
- `+te.map(ie=>`- ${ie}`).join(`
1173
- `)),A.size>0){let ie=[...A].map(He=>He.split("/").slice(-2).join("/")).join(", ");z.unshift(`Already modified: ${ie} \u2014 use edit_file to add missing pieces only, DO NOT use write_file on these files.`)}if(T.size>0){let ie=[...T].map(He=>He.split("/").slice(-2).join("/")).join(", ");z.push(`Files already investigated: ${ie}`)}let le=require("os").tmpdir()+"/nex-session-checkpoint.json";try{require("fs").writeFileSync(le,JSON.stringify({filesWritten:[...A].map(ie=>ie.split("/").slice(-2).join("/")),filesRead:[...T].map(ie=>ie.split("/").slice(-2).join("/")),isCreationTask:Bt,wipeNumber:cr+1,timestamp:Date.now()},null,2)),z.push(`Session checkpoint: ${le} \u2014 read it for exact file list`)}catch{}let _e=0;{let He=((typeof ce?.content=="string"?ce.content:Array.isArray(ce?.content)?ce.content.filter(ut=>ut.type==="text").map(ut=>ut.text).join(" "):"").match(/(?:^|\s)([\w./\-]+\.(?:js|ts|jsx|tsx|py|json|yml|yaml|sh|css|scss|html|md|go|rs|java|rb|php))/gm)||[]).map(ut=>ut.trim()).filter(Boolean),lt=[...A],Kt=He.filter(ut=>!lt.some(Rs=>Rs.endsWith(ut)||ut.endsWith(Rs.split("/").pop())));_e=Kt.length;let Et=[...H].reverse().find(ut=>ut.role==="tool"&&typeof ut.content=="string"&&!ut.content.startsWith("BLOCKED:")&&ut.content.length>5),$n={completed:lt.map(ut=>ut.split("/").slice(-2).join("/")),pending:Kt.length>0?Kt:lt.length===0?["(task files not yet identified)"]:[],lastEdit:Et?Et.content.trim().slice(0,120):null};($n.completed.length>0||$n.pending.length>0)&&z.unshift(`Work manifest:
1174
- ${JSON.stringify($n,null,2)}`)}if(z.length>0){let ie={role:"user",content:`[SYSTEM: Findings from investigation before context wipe]
1172
+ `+te.map(ae=>`- ${ae}`).join(`
1173
+ `)),A.size>0){let ae=[...A].map(He=>He.split("/").slice(-2).join("/")).join(", ");z.unshift(`Already modified: ${ae} \u2014 use edit_file to add missing pieces only, DO NOT use write_file on these files.`)}if(T.size>0){let ae=[...T].map(He=>He.split("/").slice(-2).join("/")).join(", ");z.push(`Files already investigated: ${ae}`)}let le=require("os").tmpdir()+"/nex-session-checkpoint.json";try{require("fs").writeFileSync(le,JSON.stringify({filesWritten:[...A].map(ae=>ae.split("/").slice(-2).join("/")),filesRead:[...T].map(ae=>ae.split("/").slice(-2).join("/")),isCreationTask:Bt,wipeNumber:cr+1,timestamp:Date.now()},null,2)),z.push(`Session checkpoint: ${le} \u2014 read it for exact file list`)}catch{}let _e=0;{let He=((typeof ce?.content=="string"?ce.content:Array.isArray(ce?.content)?ce.content.filter(ut=>ut.type==="text").map(ut=>ut.text).join(" "):"").match(/(?:^|\s)([\w./\-]+\.(?:js|ts|jsx|tsx|py|json|yml|yaml|sh|css|scss|html|md|go|rs|java|rb|php))/gm)||[]).map(ut=>ut.trim()).filter(Boolean),lt=[...A],Kt=He.filter(ut=>!lt.some(Rs=>Rs.endsWith(ut)||ut.endsWith(Rs.split("/").pop())));_e=Kt.length;let Et=[...H].reverse().find(ut=>ut.role==="tool"&&typeof ut.content=="string"&&!ut.content.startsWith("BLOCKED:")&&ut.content.length>5),$n={completed:lt.map(ut=>ut.split("/").slice(-2).join("/")),pending:Kt.length>0?Kt:lt.length===0?["(task files not yet identified)"]:[],lastEdit:Et?Et.content.trim().slice(0,120):null};($n.completed.length>0||$n.pending.length>0)&&z.unshift(`Work manifest:
1174
+ ${JSON.stringify($n,null,2)}`)}if(z.length>0){let ae={role:"user",content:`[SYSTEM: Findings from investigation before context wipe]
1175
1175
  ${z.join(`
1176
1176
  `)}
1177
- Continue implementing the fixes based on these findings.`};G.push(ie)}if(cr>=3){let ie=A.size>0?`
1178
- Files modified so far: ${[...A].map(He=>He.split("/").slice(-1)[0]).join(", ")}`:"";W(`${$.red} \u2717 Super-nuclear limit reached (3\xD7) \u2014 aborting to prevent runaway context loop${$.reset}`),console.log(`${$.yellow} \u{1F4A1} Task may exceed model context. Try /clear and break it into smaller steps.${ie?$.dim+ie:""}${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);break}R=G,cr++,ws=12+Math.min(_e*3,15),wl=!0,Xi=A.size,Ji=!1,Ut=0,j=0;for(let[ie,He]of xs){let lt=He?.count??He??0;Th(xs,ie,lt>=2?lt:1)}for(let[ie]of Dn)gs(xs,ie)<2&&Dn.delete(ie);ys.clear(),vs.clear(),Bt&&Qt>0&&(Zt=!0,W(`${$.cyan} \u26A1 Post-wipe creation guard: cap pre-fired (${Qt} edits already made)${$.reset}`));for(let[ie]of pr)Th(pr,ie,fu-1);if(so(`Super-nuclear compression \u2014 dropped all history, keeping original task only (${Y-U} tokens freed)`,$.yellow),cr>=1){let ie=[...xs.entries()].filter(([,Et])=>Et>=ho).map(([Et])=>Et.split("/").slice(-1)[0]),He=ie.length>0?`
1177
+ Continue implementing the fixes based on these findings.`};G.push(ae)}if(cr>=3){let ae=A.size>0?`
1178
+ Files modified so far: ${[...A].map(He=>He.split("/").slice(-1)[0]).join(", ")}`:"";W(`${$.red} \u2717 Super-nuclear limit reached (3\xD7) \u2014 aborting to prevent runaway context loop${$.reset}`),console.log(`${$.yellow} \u{1F4A1} Task may exceed model context. Try /clear and break it into smaller steps.${ae?$.dim+ae:""}${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);break}R=G,cr++,ws=12+Math.min(_e*3,15),wl=!0,Xi=A.size,Ji=!1,Ut=0,j=0;for(let[ae,He]of xs){let lt=He?.count??He??0;Th(xs,ae,lt>=2?lt:1)}for(let[ae]of Dn)gs(xs,ae)<2&&Dn.delete(ae);ys.clear(),vs.clear(),Bt&&en>0&&(Qt=!0,W(`${$.cyan} \u26A1 Post-wipe creation guard: cap pre-fired (${en} edits already made)${$.reset}`));for(let[ae]of pr)Th(pr,ae,fu-1);if(so(`Super-nuclear compression \u2014 dropped all history, keeping original task only (${Y-U} tokens freed)`,$.yellow),cr>=1){let ae=[...xs.entries()].filter(([,Et])=>Et>=ho).map(([Et])=>Et.split("/").slice(-1)[0]),He=ae.length>0?`
1179
1179
 
1180
- Files already at read cap \u2014 use grep_search instead: ${ie.join(", ")}`:"",Kt={role:"user",content:Nt&&!ot?"[SYSTEM] Context was compressed. SSH is currently unavailable \u2014 do not read more local files. Summarize what you found and ask the user for the server output you need.":`[SYSTEM] Context was compressed. Use the findings above to implement your fix. If you need to re-read a file, use line_start/line_end for the specific section.${He}`};H.push(Kt),R.push(Kt)}pe=0,Ve--;continue}}b="Context too large to compress \u2014 use /clear to start fresh"}else _.message.includes("500")||_.message.includes("502")||_.message.includes("503")||_.message.includes("504")?b="API server error \u2014 the provider is experiencing issues. Please try again in a moment":(_.message.includes("fetch failed")||_.message.includes("fetch"))&&(b="Network request failed \u2014 please check your internet connection");if(console.log(`${$.red} \u2717 ${b}${$.reset}`),_.message.includes("429")){if($e++,$e>al){console.log(`${$.red} Rate limit: max retries (${al}) exceeded. Try again later or use /budget to check your limits.${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Ze(H);break}let F=Math.min(1e4*Math.pow(2,$e-1),12e4),ce=new oo(`Rate limit \u2014 waiting ${Math.round(F/1e3)}s (retry ${$e}/${al})`);ce.start(),await new Promise(G=>setTimeout(G,F)),ce.stop();continue}let re=process.env.NEX_PHASE_ROUTING!=="0"&&(()=>{try{return je().getActiveProviderName()==="ollama"}catch{return!1}})();if(_.message.includes("socket disconnected")||_.message.includes("TLS")||_.message.includes("ECONNRESET")||_.message.includes("ECONNABORTED")||_.message.includes("ETIMEDOUT")||re&&(_.message.includes("500")||_.message.includes("502")||_.message.includes("503")||_.message.includes("504")||_.message.includes("401")||_.message.includes("Unauthorized"))||_.code==="ECONNRESET"||_.code==="ECONNABORTED"){if(be++,be>cl){console.log(`${$.red} Network error: max retries (${cl}) exceeded. Check your connection and try again.
1181
- Use /undo to revert changes made during this session.${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Ze(H);break}let F=Math.min(2e3*Math.pow(2,be-1),3e4),ce=new oo(`API temporarily unavailable \u2014 retrying in ${Math.round(F/1e3)}s (${be}/${cl}). Your changes are safe.`);ce.start(),await new Promise(G=>setTimeout(G,F)),ce.stop(),Ve--;continue}u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Ze(H);break}if(clearInterval(gu),$e=0,be=0,Es&&(u&&!u._paused&&u.pause(),qe&&qe.stop()),mn&&(clearTimeout(mn),mn=null),jt&&ct&&(ct.push(jt),jt=""),It&&ct.flush(),be=0,fe=0,sn&&sn.usage){let _=sn.usage.prompt_tokens||0,b=sn.usage.completion_tokens||0;wh(ro(),fn(),_,b),d+=_+b,u&&u.setStats({tokens:d})}else if(sn&&!sn.usage){let _=R.map(I=>typeof I.content=="string"?I.content:Array.isArray(I.content)?I.content.map(F=>typeof F=="string"?F:F.text||"").join(""):"").join(" "),b=_h(_),re=_h(sn.content||It||"");wh(ro(),fn(),b,re),d+=b+re,u&&u.setStats({tokens:d})}let{content:$u,tool_calls:hn}=sn,Rr=ml($u||""),yu=Rr.truncated?Rr.text:$u;Rr.truncated&&W(`${$.yellow} \u26A0 LLM output loop detected (${Rr.repeatCount}\xD7 repeated paragraph) \u2014 response truncated${$.reset}`);let Cr=bk(yu||""),gn=Cr.truncated?Cr.text:yu;Cr.truncated&&W(`${$.yellow} \u26A0 LLM output loop detected (${Cr.repeatCount}\xD7 repeated window) \u2014 response truncated${$.reset}`);let Ea={role:"assistant",content:gn||""};if(hn&&hn.length>0&&(Ea.tool_calls=hn),H.push(Ea),R.push(Ea),!ot&&gn&&hn&&hn.length>0){let _=dl(gn);if(_){ot=!0,kt=_.slice(0,120),dn=0,Zt=!1,vn=0,W(`${$.yellow} \u26A1 Root cause in model analysis: ${kt} \u2014 fix phase (read budget: 3)${$.reset}`);let b={role:"user",content:`[SYSTEM] Root cause identified: ${kt}. Read only the file that needs fixing, then edit it. Do not read other files.`};H.push(b),R.push(b)}}if(!hn||hn.length===0){let _=(gn||"").trim().length>0||It.trim().length>0,b=!1;if(Nt&&_&&(Wi>=2?W(`${$.yellow} \u26A0 SSH permanently blocked after ${Wi} storm warnings \u2014 no further SSH calls allowed${$.reset}`):(Nt=!1,Ut=go-4,b=!0)),b&&_){let I=(gn||"").trim();if(I.endsWith("?")||/\b(Wo |Bitte |Kannst du|Soll ich)\b/.test(I.slice(-200))){let ce={role:"user",content:"[SYSTEM] Continue. Do not ask questions \u2014 implement the fix yourself using SSH. The server is at 94.130.37.43."};R.push(ce),H.push(ce);continue}}if(!_&&x>0&&Ve<hl-1){let I={role:"user",content:"[SYSTEM] You ran tools but produced no visible output. The user CANNOT see tool results \u2014 only your text. Please summarize your findings now."};R.push(I),H.push(I);continue}let re=/keine.*Tool|can.?t use.*tool|Tool.?Budget|nicht.*zugreifen|cannot.*access|no.*tool.*access|keine.*Werkzeug|da ich keine.*kann/i;if(_&&Ve<3&&re.test((gn||"").slice(0,600)))if(wl&&ws<=0||Nt){W(`${$.yellow} \u26A0 Tool avoidance (constrained context) \u2014 telling model to ask user${$.reset}`);let F={role:"user",content:"[SYSTEM] Correct \u2014 remote access is currently limited. Summarize what you have found so far and tell the user exactly what specific information (logs, process list, error output) you need from the server to continue."};R.push(F),H.push(F);continue}else{W(`${$.yellow} \u26A0 Tool avoidance detected \u2014 nudging model to use tools${$.reset}`);let F={role:"user",content:"[SYSTEM] You have full tool access. Use your tools to investigate and implement the fix directly \u2014 do not say you cannot use tools. If SSH is needed, use a single targeted command that captures the most relevant information rather than multiple sequential calls."};R.push(F),H.push(F);continue}if(Te&&Xe==="plan"&&qn>=2){W(`${$.cyan} \u21B3 Plan phase: ${qn} consecutive blocks \u2014 auto-advancing to implement${$.reset}`),qn=0;let I=rr("implement","[auto-advance: task only requires direct action]");if(I){H.push(I),R.push(I),Ve=0,nn=hs("implement");continue}}if(Te&&_){let I=(gn||It||"").trim();if(Xe==="plan"){let F=rr("implement",I);if(F){H.push(F),R.push(F),Ve=0,nn=hs("implement");continue}}else if(Xe==="implement"&&A.size>0){let F=H.find(ye=>ye.role==="user"),ce=typeof F?.content=="string"?F.content:"",G=rr("verify",I,A,ce);if(G){H.push(G),R.push(G),Ve=0,nn=Math.min(hs("verify")+Math.max(0,(A.size-2)*2),20);continue}}else if(Xe==="verify"){let ce=/\bFAIL\b|test.*fail|error|broken|missing|incorrect/i.test(I.slice(0,500));if(ce&&dr<1){dr++;let G={role:"user",content:`[PHASE: RE-IMPLEMENTATION] Verification found issues:
1180
+ Files already at read cap \u2014 use grep_search instead: ${ae.join(", ")}`:"",Kt={role:"user",content:Nt&&!ot?"[SYSTEM] Context was compressed. SSH is currently unavailable \u2014 do not read more local files. Summarize what you found and ask the user for the server output you need.":`[SYSTEM] Context was compressed. Use the findings above to implement your fix. If you need to re-read a file, use line_start/line_end for the specific section.${He}`};H.push(Kt),R.push(Kt)}pe=0,Ve--;continue}}b="Context too large to compress \u2014 use /clear to start fresh"}else _.message.includes("500")||_.message.includes("502")||_.message.includes("503")||_.message.includes("504")?b="API server error \u2014 the provider is experiencing issues. Please try again in a moment":(_.message.includes("fetch failed")||_.message.includes("fetch"))&&(b="Network request failed \u2014 please check your internet connection");if(console.log(`${$.red} \u2717 ${b}${$.reset}`),_.message.includes("429")){if(ye++,ye>al){console.log(`${$.red} Rate limit: max retries (${al}) exceeded. Try again later or use /budget to check your limits.${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Ze(H);break}let F=Math.min(1e4*Math.pow(2,ye-1),12e4),ce=new oo(`Rate limit \u2014 waiting ${Math.round(F/1e3)}s (retry ${ye}/${al})`);ce.start(),await new Promise(G=>setTimeout(G,F)),ce.stop();continue}let re=process.env.NEX_PHASE_ROUTING!=="0"&&(()=>{try{return je().getActiveProviderName()==="ollama"}catch{return!1}})();if(_.message.includes("socket disconnected")||_.message.includes("TLS")||_.message.includes("ECONNRESET")||_.message.includes("ECONNABORTED")||_.message.includes("ETIMEDOUT")||re&&(_.message.includes("500")||_.message.includes("502")||_.message.includes("503")||_.message.includes("504")||_.message.includes("401")||_.message.includes("Unauthorized"))||_.code==="ECONNRESET"||_.code==="ECONNABORTED"){if(be++,be>cl){console.log(`${$.red} Network error: max retries (${cl}) exceeded. Check your connection and try again.
1181
+ Use /undo to revert changes made during this session.${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Ze(H);break}let F=Math.min(2e3*Math.pow(2,be-1),3e4),ce=new oo(`API temporarily unavailable \u2014 retrying in ${Math.round(F/1e3)}s (${be}/${cl}). Your changes are safe.`);ce.start(),await new Promise(G=>setTimeout(G,F)),ce.stop(),Ve--;continue}u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Ze(H);break}if(clearInterval(gu),ye=0,be=0,Es&&(u&&!u._paused&&u.pause(),qe&&qe.stop()),mn&&(clearTimeout(mn),mn=null),jt&&ct&&(ct.push(jt),jt=""),It&&ct.flush(),be=0,fe=0,on&&on.usage){let _=on.usage.prompt_tokens||0,b=on.usage.completion_tokens||0;wh(ro(),fn(),_,b),d+=_+b,u&&u.setStats({tokens:d})}else if(on&&!on.usage){let _=R.map(I=>typeof I.content=="string"?I.content:Array.isArray(I.content)?I.content.map(F=>typeof F=="string"?F:F.text||"").join(""):"").join(" "),b=_h(_),re=_h(on.content||It||"");wh(ro(),fn(),b,re),d+=b+re,u&&u.setStats({tokens:d})}let{content:$u,tool_calls:hn}=on,Rr=ml($u||""),yu=Rr.truncated?Rr.text:$u;Rr.truncated&&W(`${$.yellow} \u26A0 LLM output loop detected (${Rr.repeatCount}\xD7 repeated paragraph) \u2014 response truncated${$.reset}`);let Cr=bk(yu||""),gn=Cr.truncated?Cr.text:yu;Cr.truncated&&W(`${$.yellow} \u26A0 LLM output loop detected (${Cr.repeatCount}\xD7 repeated window) \u2014 response truncated${$.reset}`);let Ea={role:"assistant",content:gn||""};if(hn&&hn.length>0&&(Ea.tool_calls=hn),H.push(Ea),R.push(Ea),!ot&&gn&&hn&&hn.length>0){let _=dl(gn);if(_){ot=!0,kt=_.slice(0,120),dn=0,Qt=!1,vn=0,W(`${$.yellow} \u26A1 Root cause in model analysis: ${kt} \u2014 fix phase (read budget: 3)${$.reset}`);let b={role:"user",content:`[SYSTEM] Root cause identified: ${kt}. Read only the file that needs fixing, then edit it. Do not read other files.`};H.push(b),R.push(b)}}if(!hn||hn.length===0){let _=(gn||"").trim().length>0||It.trim().length>0,b=!1;if(Nt&&_&&(Wi>=2?W(`${$.yellow} \u26A0 SSH permanently blocked after ${Wi} storm warnings \u2014 no further SSH calls allowed${$.reset}`):(Nt=!1,Ut=go-4,b=!0)),b&&_){let I=(gn||"").trim();if(I.endsWith("?")||/\b(Wo |Bitte |Kannst du|Soll ich)\b/.test(I.slice(-200))){let ce={role:"user",content:"[SYSTEM] Continue. Do not ask questions \u2014 implement the fix yourself using SSH. The server is at 94.130.37.43."};R.push(ce),H.push(ce);continue}}if(!_&&x>0&&Ve<hl-1){let I={role:"user",content:"[SYSTEM] You ran tools but produced no visible output. The user CANNOT see tool results \u2014 only your text. Please summarize your findings now."};R.push(I),H.push(I);continue}let re=/keine.*Tool|can.?t use.*tool|Tool.?Budget|nicht.*zugreifen|cannot.*access|no.*tool.*access|keine.*Werkzeug|da ich keine.*kann/i;if(_&&Ve<3&&re.test((gn||"").slice(0,600)))if(wl&&ws<=0||Nt){W(`${$.yellow} \u26A0 Tool avoidance (constrained context) \u2014 telling model to ask user${$.reset}`);let F={role:"user",content:"[SYSTEM] Correct \u2014 remote access is currently limited. Summarize what you have found so far and tell the user exactly what specific information (logs, process list, error output) you need from the server to continue."};R.push(F),H.push(F);continue}else{W(`${$.yellow} \u26A0 Tool avoidance detected \u2014 nudging model to use tools${$.reset}`);let F={role:"user",content:"[SYSTEM] You have full tool access. Use your tools to investigate and implement the fix directly \u2014 do not say you cannot use tools. If SSH is needed, use a single targeted command that captures the most relevant information rather than multiple sequential calls."};R.push(F),H.push(F);continue}if(Te&&Xe==="plan"&&qn>=2){W(`${$.cyan} \u21B3 Plan phase: ${qn} consecutive blocks \u2014 auto-advancing to implement${$.reset}`),qn=0;let I=rr("implement","[auto-advance: task only requires direct action]");if(I){H.push(I),R.push(I),Ve=0,sn=hs("implement");continue}}if(Te&&_){let I=(gn||It||"").trim();if(Xe==="plan"){let F=rr("implement",I);if(F){H.push(F),R.push(F),Ve=0,sn=hs("implement");continue}}else if(Xe==="implement"&&A.size>0){let F=H.find(we=>we.role==="user"),ce=typeof F?.content=="string"?F.content:"",G=rr("verify",I,A,ce);if(G){H.push(G),R.push(G),Ve=0,sn=Math.min(hs("verify")+Math.max(0,(A.size-2)*2),20);continue}}else if(Xe==="verify"){let ce=/\bFAIL\b|test.*fail|error|broken|missing|incorrect/i.test(I.slice(0,500));if(ce&&dr<1){dr++;let G={role:"user",content:`[PHASE: RE-IMPLEMENTATION] Verification found issues:
1182
1182
  ${I.slice(0,400)}
1183
1183
 
1184
- Fix the identified issues. This is the final attempt.`};Xe="implement",kn=pl("implement",ao),H.push(G),R.push(G),Ve=0,nn=hs("implement"),W(`${$.yellow} \u21B3 Verify \u2192 implement loop-back #${dr} (issues found)${$.reset}`);continue}W(`${$.green} \u2713 Verification phase complete${ce?" (loop-back exhausted)":" (PASS)"}${$.reset}`)}}if(fr()&&_&&x===0)if(Gi++,Gi>2)W(`${$.yellow} \u26A0 Plan accepted despite no file reads (rejection loop cap reached)${$.reset}`);else{let I={role:"user",content:`[SYSTEM] You wrote a plan without reading any files. This plan may be based on incorrect assumptions (wrong database type, wrong file structure, etc.).
1184
+ Fix the identified issues. This is the final attempt.`};Xe="implement",kn=pl("implement",ao),H.push(G),R.push(G),Ve=0,sn=hs("implement"),W(`${$.yellow} \u21B3 Verify \u2192 implement loop-back #${dr} (issues found)${$.reset}`);continue}W(`${$.green} \u2713 Verification phase complete${ce?" (loop-back exhausted)":" (PASS)"}${$.reset}`)}}if(fr()&&_&&x===0)if(Gi++,Gi>2)W(`${$.yellow} \u26A0 Plan accepted despite no file reads (rejection loop cap reached)${$.reset}`);else{let I={role:"user",content:`[SYSTEM] You wrote a plan without reading any files. This plan may be based on incorrect assumptions (wrong database type, wrong file structure, etc.).
1185
1185
 
1186
- MANDATORY: Use read_file, glob, or grep to investigate the actual codebase first. Read at least the relevant module file and route file before writing the plan.`};H.push(I),R.push(I),W(`${$.yellow} \u26A0 Plan rejected (${Gi}/2): no files read \u2014 forcing investigation${$.reset}`);continue}if(fr()&&_){let I=(gn||It||"").trim();Qv(I),Pk(I);let F=ek(I);if(F.length>0){let ce=H.find(Y=>Y.role==="user"),G=typeof ce?.content=="string"?ce.content.slice(0,120):"Task";tk(G,F);let ye=F.length===1?"step":"steps",U=!1;if(process.stdout.isTTY&&process.stdin.isTTY){let{approvePlan:Y,startExecution:z,setPlanMode:ee}=ln();process.stdout.write(`
1187
- ${$.cyan}${$.bold}Plan ready${$.reset} ${$.dim}(${F.length} ${ye})${$.reset} ${$.green}[A]${$.reset}${$.dim}pprove${$.reset} ${$.yellow}[E]${$.reset}${$.dim}dit${$.reset} ${$.red}[R]${$.reset}${$.dim}eject${$.reset} ${$.dim}[\u21B5 = approve]:${$.reset} `);let te=process.stdin.isRaw,le=await new Promise(_e=>{try{process.stdin.setRawMode(!0)}catch{}process.stdin.resume(),process.stdin.once("data",ie=>{try{process.stdin.setRawMode(te||!1)}catch{}let He=ie.toString().toLowerCase()[0]||"\r";_e(He)})});if(process.stdout.write(`
1188
- `),le==="r")console.log(`${$.red}Plan rejected.${$.reset} Ask follow-up questions to refine.`);else if(le==="e")console.log(`${$.yellow}Type /plan edit to open in editor, or give feedback.${$.reset}`);else if(Y()){z(),ee(!1),$l(),console.log(`${$.green}${$.bold}Approved!${$.reset} Executing ${F.length} ${ye}...`);let _e=`[PLAN APPROVED \u2014 EXECUTE NOW]
1186
+ MANDATORY: Use read_file, glob, or grep to investigate the actual codebase first. Read at least the relevant module file and route file before writing the plan.`};H.push(I),R.push(I),W(`${$.yellow} \u26A0 Plan rejected (${Gi}/2): no files read \u2014 forcing investigation${$.reset}`);continue}if(fr()&&_){let I=(gn||It||"").trim();Qv(I),Pk(I);let F=ek(I);if(F.length>0){let ce=H.find(Y=>Y.role==="user"),G=typeof ce?.content=="string"?ce.content.slice(0,120):"Task";tk(G,F);let we=F.length===1?"step":"steps",U=!1;if(process.stdout.isTTY&&process.stdin.isTTY){let{approvePlan:Y,startExecution:z,setPlanMode:ee}=Vt();process.stdout.write(`
1187
+ ${$.cyan}${$.bold}Plan ready${$.reset} ${$.dim}(${F.length} ${we})${$.reset} ${$.green}[A]${$.reset}${$.dim}pprove${$.reset} ${$.yellow}[E]${$.reset}${$.dim}dit${$.reset} ${$.red}[R]${$.reset}${$.dim}eject${$.reset} ${$.dim}[\u21B5 = approve]:${$.reset} `);let te=process.stdin.isRaw,le=await new Promise(_e=>{try{process.stdin.setRawMode(!0)}catch{}process.stdin.resume(),process.stdin.once("data",ae=>{try{process.stdin.setRawMode(te||!1)}catch{}let He=ae.toString().toLowerCase()[0]||"\r";_e(He)})});if(process.stdout.write(`
1188
+ `),le==="r")console.log(`${$.red}Plan rejected.${$.reset} Ask follow-up questions to refine.`);else if(le==="e")console.log(`${$.yellow}Type /plan edit to open in editor, or give feedback.${$.reset}`);else if(Y()){z(),ee(!1),$l(),console.log(`${$.green}${$.bold}Approved!${$.reset} Executing ${F.length} ${we}...`);let _e=`[PLAN APPROVED \u2014 EXECUTE NOW]
1189
1189
 
1190
1190
  Implement the following plan step by step. All tools are now available.
1191
1191
 
1192
1192
  ${I}`;H.push({role:"user",content:_e}),R.push({role:"user",content:_e}),U=!0}}else console.log(`
1193
- ${$.cyan}${$.bold}Plan ready${$.reset} ${$.dim}(${F.length} ${ye} extracted).${$.reset} Type ${$.cyan}/plan approve${$.reset}${$.dim} to execute, or ${$.reset}${$.cyan}/plan edit${$.reset}${$.dim} to review.${$.reset}`);if(U){u&&(u.stop(),u=null),Ve--;continue}}else{let ce=!1;if(process.stdout.isTTY&&process.stdin.isTTY){let{approvePlan:G,startExecution:ye,setPlanMode:U}=ln();process.stdout.write(`
1193
+ ${$.cyan}${$.bold}Plan ready${$.reset} ${$.dim}(${F.length} ${we} extracted).${$.reset} Type ${$.cyan}/plan approve${$.reset}${$.dim} to execute, or ${$.reset}${$.cyan}/plan edit${$.reset}${$.dim} to review.${$.reset}`);if(U){u&&(u.stop(),u=null),Ve--;continue}}else{let ce=!1;if(process.stdout.isTTY&&process.stdin.isTTY){let{approvePlan:G,startExecution:we,setPlanMode:U}=Vt();process.stdout.write(`
1194
1194
  ${$.cyan}${$.bold}Plan ready.${$.reset} ${$.green}[A]${$.reset}${$.dim}pprove${$.reset} ${$.red}[R]${$.reset}${$.dim}eject${$.reset} ${$.dim}[\u21B5 = approve]:${$.reset} `);let Y=process.stdin.isRaw,z=await new Promise(ee=>{try{process.stdin.setRawMode(!0)}catch{}process.stdin.resume(),process.stdin.once("data",te=>{try{process.stdin.setRawMode(Y||!1)}catch{}ee(te.toString().toLowerCase()[0]||"\r")})});if(process.stdout.write(`
1195
- `),z==="r")console.log(`${$.red}Plan rejected.${$.reset} Ask follow-up questions to refine.`);else if(G()){ye(),U(!1),$l(),console.log(`${$.green}${$.bold}Approved!${$.reset} Executing...`);let te=`[PLAN APPROVED \u2014 EXECUTE NOW]
1195
+ `),z==="r")console.log(`${$.red}Plan rejected.${$.reset} Ask follow-up questions to refine.`);else if(G()){we(),U(!1),$l(),console.log(`${$.green}${$.bold}Approved!${$.reset} Executing...`);let te=`[PLAN APPROVED \u2014 EXECUTE NOW]
1196
1196
 
1197
1197
  Implement the following plan step by step. All tools are now available.
1198
1198
 
1199
- ${getPlanContent()||sn.content}`;H.push({role:"user",content:te}),R.push({role:"user",content:te}),ce=!0}}else console.log(`
1200
- ${$.cyan}${$.bold}Plan ready.${$.reset} ${$.dim}Type ${$.reset}${$.cyan}/plan approve${$.reset}${$.dim} to execute, or ask follow-up questions to refine.${$.reset}`);if(ce){u&&(u.stop(),u=null),Ve--;continue}}}if(u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Bt&&A.size>=3){let I=[...A].map(U=>U.split("/").pop()).slice(0,8).join(", "),F=[...A].some(U=>U.endsWith("package.json")),ce=[...A].some(U=>U.endsWith("requirements.txt")),G=[...A].some(U=>U.endsWith("package-lock.json")||U.endsWith("yarn.lock")||U.endsWith("pnpm-lock.yaml")),ye=F&&!G?"npm install not yet run":ce?"pip install not yet run":null;ur=`[Previous session created ${A.size} files: ${I}`+(ye?` \u2014 ${ye}`:"")+". Use this context to answer follow-up questions without re-reading files.]"}if(Bt&&!bl&&x>0){let I=[...A].some(te=>te.endsWith("package.json")),F=[...A].some(te=>te.endsWith("requirements.txt")||te.endsWith("Pipfile")||te.endsWith("pyproject.toml")),ce=[...A].some(te=>te.endsWith("package-lock.json")||te.endsWith("yarn.lock")||te.endsWith("pnpm-lock.yaml")),G=H.flatMap(te=>{let le=Array.isArray(te.tool_calls)?te.tool_calls:[],_e=Array.isArray(te.content)?te.content.filter(ie=>ie?.type==="tool_use"):[];return[...le,..._e]}).filter(te=>{let le=te.function?.name||te.name||"";return le==="bash"||le==="Bash"}).map(te=>{try{let le=te.function?.arguments??te.input??{};return(typeof le=="string"?JSON.parse(le):le)?.command||""}catch{return""}}),ye=G.some(te=>/pip\s+install|python\s+-m\s+venv/.test(te)),U=G.some(te=>/npm\s+install/.test(te)),z=[...A].some(te=>/\/App\.(js|ts|jsx|tsx)$/.test(te))&&!I&&!U;if(F&&!ye||I&&!ce&&!U||z){bl=!0;let te=[];F&&!ye&&te.push("python -m venv venv && source venv/bin/activate && pip install -r requirements.txt"),z?te.push("create package.json for the React frontend (with react, react-dom, react-scripts dependencies), then run npm install"):I&&!ce&&!U&&te.push("npm install");let le=`[FRAMEWORK \u2014 post-creation check] You wrote dependency files but never ran the installer. Run now: ${te.join(" && ")}. Verify it succeeds, fix any errors, then write a closing summary.`;W(`${$.dim} [post-creation] bootstrapping environment (${te.join(", ")})${$.reset}`),H.push({role:"user",content:le}),R.push({role:"user",content:le});continue}}if(x>0&&!n._isSummaryTurn&&Bv(gn))try{W(`${$.dim} [post-turn] terse ending \u2014 requesting diagnosis/summary${$.reset}`);let I=A.size>0?"Write a closing summary (3+ sentences): what files changed and why, what the result is, anything the user should know or do next.":"Write a closing diagnosis (3+ sentences): what you investigated, what you found, and what the user should do next or what the root cause is.",F=[...R,{role:"user",content:I}],G=((await gh(F,[],{}))?.content||"").trim();G&&(console.log(`
1201
- ${G}`),H.push({role:"user",content:I},{role:"assistant",content:G}))}catch{}Ze(H),$h(H);return}x++,sa++,x>=1&&(Ne=!1);for(let _ of hn){let b=_.function.name;E.set(b,(E.get(b)||0)+1)}if(x>=30&&!Ch){Ch=!0,W(`${$.yellow} \u26A0 Tool budget warning: ${x} tool calls used \u2014 nudging model to wrap up${$.reset}`);let _={role:"user",content:"[SYSTEM] \u26A0 You have used "+x+" tool calls. This is approaching the quality threshold (40). Wrap up NOW: write your final summary and stop. Do NOT run additional verification commands (git status, git diff, git log) \u2014 your changes are already committed and verified. Further tool calls will hurt session quality."};H.push(_),R.push(_)}let ke=await Promise.all(hn.map(_=>Lk(_)));{let _=Vt(R,pt()),b=_.percentage,re=ke.some(G=>G.canExecute&&G.fnName==="read_file"&&!G.args?.line_end),I=ke.filter(G=>G.canExecute&&G.fnName==="read_file"&&G.args?.path&&gs(Er,G.args.path)>=1&&!G.args?.line_start).map(G=>G.args.path.split("/").slice(-2).join("/")),F=I.length>0;if(b>=70&&re&&_a<70||b>=85&&_a<85||F){_a=b;let G=b>=85?"URGENT":"WARNING",ye;F?(G="WARNING",ye=`Full-file read of ${I.join(", ")} already done \u2014 use line_start/line_end for specific sections instead.`):re?ye=`Unbounded read at ${Math.round(b)}% context \u2014 use line_start/line_end to avoid overflow.`:ye="Use targeted reads (line_start/line_end) to save space.";let U={role:"user",content:`[SYSTEM ${G}] Context ${Math.round(b)}% used (${_.used}/${_.limit} tokens). ${ye}`};if(H.push(U),R.push(U),b>=85){let Y=F?` (re-read of: ${I.join(", ")})`:"";W(`${$.yellow} \u26A0 Context ${Math.round(b)}% used \u2014 agent warned to use targeted reads${Y}${$.reset}`)}}}let Ta=new Map;for(let _ of ke){if(!_.canExecute||_.fnName!=="read_file")continue;let b=_.args?.path;if(!b)continue;let re=gs(Er,b),I=Ta.get(b)||0,F=re+I,ce=_.args?.line_start!=null,G=ys.get(b)||0,ye=G>0,U=2;if(F>=ho){let Y=b.split("/").slice(-2).join("/"),z=(vs.get(b)||0)+1;if(vs.set(b,z),z===1)W(`${$.red} \u2716 Blocked: "${Y}" read ${F}\xD7 \u2014 hard cap (${ho}) reached${$.reset}`);else if(z===2){W(`${$.red} \u2716 Escalated block: "${Y}" \u2014 model ignored BLOCKED, injecting system warning${$.reset}`);let ee={role:"user",content:`[SYSTEM WARNING] You already received a BLOCKED error for read_file("${b}") and tried again anyway. This file has reached its read cap (${ho}\xD7). Do NOT attempt to read it again. Use grep_search to find specific content, or proceed with what you already know.`};H.push(ee),R.push(ee)}_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: read_file("${b}") denied \u2014 file already read ${F}\xD7 (hard cap: ${ho}). You have seen enough of this file. Use grep to find specific content or proceed with what you know.`,tool_call_id:_.callId}}else if(F>=1&&ce)if(ye&&G<=U){let Y=b.split("/").slice(-2).join("/");console.log(`${$.cyan} \u21A9 Targeted re-read: "${Y}" (line_start=${_.args.line_start}) \u2014 edit recovery #${G}${$.reset}`),ys.set(b,G-1)}else if(ye&&G>U){let Y=b.split("/").slice(-2).join("/");W(`${$.red} \u2716 Edit recovery blocked: "${Y}" \u2014 ${U} recovery reads already used. Use grep to find the exact line numbers, then retry.${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: read_file("${b}") denied \u2014 edit recovery budget exhausted (${U} recovery reads used). You already have the file content. Use grep_search to find the exact line numbers of the text you want to change, then retry edit_file with the exact text shown.`,tool_call_id:_.callId}}else{let Y=_.args.line_start||1,z=_.args.line_end||Y+350,ee=Dn.get(b)||[],te=!1;for(let[le,_e]of ee){let ie=Math.max(Y,le),He=Math.min(z,_e);if(He>ie){let lt=He-ie,Kt=z-Y||1,Et=_e-le||1,$n=lt/Et>=.7&&lt/Kt<.7;if(!(z-Y<=h$)&&(lt/Kt>=.7||lt/Et>=.7)){let Rs=b.split("/").slice(-2).join("/"),vu=`${b}:${Y}-${z}`,Cs=(ta.get(vu)||0)+1;if(ta.set(vu,Cs),W($n?`${$.red} \u2716 Blocked superread: "${Rs}" lines ${Y}-${z} subsumes already-read ${le}-${_e} \u2014 use line_start=${_e+1} to skip known content (block #${Cs})${$.reset}`:`${$.red} \u2716 Blocked duplicate read: "${Rs}" lines ${Y}-${z} (\u226570% overlap with lines ${le}-${_e} already in context, block #${Cs})${$.reset}`),Cs>=2){W(`${$.red} \u2716 Escalated range-block: "${Rs}" lines ${Y}-${z} \u2014 model ignored BLOCKED, injecting system warning${$.reset}`);let ku={role:"user",content:$n?`[SYSTEM] Read blocked ${Cs}\xD7 for read_file("${b}", lines ${Y}-${z}). Lines ${le}-${_e} were already read. Use line_start=${_e+1} to read only new content, or use grep_search for specific lines.`:`[SYSTEM] Read blocked ${Cs}\xD7 for read_file("${b}", lines ${Y}-${z}). Lines ${le}-${_e} were already read and will NOT change. Use grep_search to find specific content instead.`};H.push(ku),R.push(ku)}_.canExecute=!1,_.errorResult={role:"tool",content:$n?`BLOCKED: read_file("${b}", lines ${Y}-${z}) re-reads lines ${le}-${_e} already in context. Use line_start=${_e+1} to read only the new content beyond line ${_e}.`:`BLOCKED: read_file("${b}", lines ${Y}-${z}) is a duplicate \u2014 lines ${le}-${_e} are already in your context (\u226570% overlap). Use grep to find specific content instead of re-reading.`,tool_call_id:_.callId},te=!0;break}}}if(!te){let le=ee.length,_e=2;if(le>=3){let He=b.split("/").slice(-2).join("/");W(`${$.red} \u2716 Blocked file-scroll: "${He}" \u2014 ${le} sections already read. Use grep to find specific content.${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: read_file("${b}") denied \u2014 you have already read ${le} different sections of this file (file-scroll pattern). You have seen most of this file. Use grep_search to find the exact lines you need instead of continuing to scroll.`,tool_call_id:_.callId}}else le>=_e&&(_._scrollWarn={sectionCount:le+1,path:b})}}else if(F>=1){let Y=b.split("/").slice(-2).join("/"),z=(vs.get(b)||0)+1;if(vs.set(b,z),z===1)W(`${$.red} \u2716 Blocked unbounded re-read: "${Y}" \u2014 already in context. Use line_start/line_end for specific sections.${$.reset}`);else if(z===2){W(`${$.red} \u2716 Escalated block: "${Y}" \u2014 model ignored unbounded re-read block, injecting system warning${$.reset}`);let ee={role:"user",content:`[SYSTEM] read_file("${b}") was blocked again \u2014 full-file reads are disabled after the first read. Use line_start/line_end for a specific section, or use grep_search to find what you need.`};H.push(ee),R.push(ee)}_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: read_file("${b}") denied \u2014 file already in context (read ${F}\xD7). Use line_start/line_end to read a specific section instead of the full file.`,tool_call_id:_.callId}}_.canExecute&&Ta.set(b,(Ta.get(b)||0)+1)}if(jn>=3)for(let _ of ke)_.canExecute&&(_.fnName!=="read_file"&&_.fnName!=="edit_file"||(W(`${$.red} \u2716 Blocked ${_.fnName} \u2014 ${jn} consecutive file-not-found errors, must search first${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: ${jn} consecutive "File not found" errors. You must call search_files or glob_files to locate the correct path before reading or editing. Do not guess file paths.`,tool_call_id:_.callId}));for(let _ of ke){if(!_.canExecute||_.fnName!=="bash")continue;let b=(_.args?.command||"").trim();if(/^\s*ls(\s+-[a-zA-Z]+)*(\s+\S+)?\s*$/.test(b)&&!/npm|yarn|pnpm|make|git/.test(b)){W(`${$.red} \u2716 Blocked bash ls \u2014 use list_directory tool instead${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:'BLOCKED: bash("ls ...") denied \u2014 use the list_directory tool instead. It returns structured output and does not penalize the session score.',tool_call_id:_.callId};continue}/\bfind\s+[\S.]/.test(b)&&!/git\s|npm\s|yarn\s|-exec\s+\S|-execdir/.test(b)&&(W(`${$.red} \u2716 Blocked bash find \u2014 use glob tool with a pattern instead${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:'BLOCKED: bash("find ...") denied \u2014 use the glob tool with a pattern like "**/*.py" or "src/**/*.js" instead. It is faster and does not penalize the session score.',tool_call_id:_.callId})}for(let _ of ke)_.canExecute&&(_.fnName!=="ssh_exec"&&_.fnName!=="bash"||/\bsed\s+-n\b/.test(_.args?.command||"")&&(W(`${$.red} \u2716 Blocked sed -n: use grep -n "pattern" <file> | head -30 instead${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:'BLOCKED: sed -n is forbidden \u2014 it floods context with line ranges. Use grep -n "pattern" <file> | head -30 to read a specific section, or cat <file> for the full file.',tool_call_id:_.callId}));for(let _ of ke){if(!_.canExecute||_.fnName!=="write_file")continue;let b=_.args?.path,re=_.args?.content||"";if(b)try{let I=require("fs"),F=require("path").resolve(process.cwd(),b);if(I.existsSync(F)){let ce=I.statSync(F).size,G=Buffer.byteLength(re,"utf8"),ye=ce>0?G/ce:1;if(ye<.6&&ce>200){let U=b.split("/").slice(-2).join("/");console.log(`${$.red} \u2716 write_file shrink guard: "${U}" would shrink to ${Math.round(ye*100)}% of original \u2014 likely context loss${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: write_file("${b}") denied \u2014 new content is only ${Math.round(ye*100)}% of current file size (${ce} \u2192 ${G} bytes). This looks like a partial rewrite after context loss. Use edit_file/patch_file to add only the new code, or read the file first to see full content before replacing.`,tool_call_id:_.callId}}}}catch{}}let wu=new Map;for(let _ of ke){if(!_.canExecute||_.fnName!=="grep")continue;let b=_.args?.path;if(!b)continue;let re=wu.get(b)||0,I=gs(du,b)+re;if(I>=fu){let F=b.split("/").slice(-2).join("/");W(`${$.red} \u2716 Blocked grep: "${F}" grepped ${I}\xD7 with different patterns \u2014 flood threshold exceeded${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: grep("${b}") denied \u2014 ${I} patterns already tried. Use existing results or read the file instead.`,tool_call_id:_.callId}}_.canExecute&&wu.set(b,re+1)}let _$=5,bu=new Map;for(let _ of ke){if(!_.canExecute||_.fnName!=="ssh_exec")continue;let re=(_.args?.command||"").replace(/\d+/g,"N").replace(/\s+/g," ").trim().slice(0,100),I=bu.get(re)||0,F=gs(tt,re)+I;F>=_$&&(W(`${$.yellow} \u26A0 Blocked ssh_exec: same command run ${F}\xD7 \u2014 result already in context${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: ssh_exec denied \u2014 this command has already run ${F} times and the output is in your context. Use existing results, try a different command, or run it as a local bash call: bash("ssh user@host 'your command'").`,tool_call_id:_.callId}),_.canExecute&&bu.set(re,I+1)}if(Nt){let _=ke.filter(I=>I.canExecute&&I.fnName==="ssh_exec"),b=ke.some(I=>I.canExecute&&I.fnName!=="ssh_exec"),re=k&&j<3;if(_.length>0&&!b&&re&&zi<1)Nt=!1,zi++,Ut=Math.max(0,go-2),W(`${$.dim} [dual-block deadlock: SSH storm relaxed \u2014 allowing 1 SSH call (relax ${zi}/1)]${$.reset}`);else for(let I of _)I.canExecute=!1,I.errorResult={role:"tool",content:ot?`BLOCKED: ssh_exec denied \u2014 SSH paused (${go}+ calls). Root cause is known (${kt}). Edit the file now. You can still use bash("ssh user@host 'cmd'") for a single targeted lookup if essential.`:`BLOCKED: ssh_exec denied \u2014 SSH temporarily paused (${go}+ calls). Provide a text summary of your findings first. Do NOT ask the user to run commands. SSH re-enables after your summary. For one-off lookups use bash("ssh user@host 'cmd'") instead.`,tool_call_id:I.callId}}if(k&&j<3&&!Nt){for(let _ of ke)if(_.canExecute&&["bash","read_file","find_files"].includes(_.fnName)){j++;{let b=pt(),{messages:re}=un(R,b);R=re}W(`${$.yellow} \u26A0 Jarvis-local guard: blocking local ${_.fnName} \u2014 use ssh_exec on 94.130.37.43${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: ${_.fnName} denied \u2014 this is a server issue. Use ssh_exec on 94.130.37.43 instead.`,tool_call_id:_.callId};break}}if(!Te&&Zt&&Bt&&Qt>=1){let _=["read_file","grep","search_files","glob","list_directory","find_files"];for(let b of ke)b.canExecute&&_.includes(b.fnName)&&(W(`${$.red} \u2716 Creation hard-block: ${b.fnName} denied \u2014 cap fired, files already written${$.reset}`),b.canExecute=!1,b.errorResult={role:"tool",content:"BLOCKED: files already written \u2014 continue with write_file or edit_file to finish the remaining tasks. Do not read more files.",tool_call_id:b.callId})}if(ws>=0){let _=ke.filter(b=>b.canExecute).length;if(_>0&&(ws-=_,ws<0))if(!Ji&&A.size>Xi){Ji=!0,ws=5,W(`${$.green} \u2713 Post-wipe progress detected (${A.size-Xi} files modified) \u2014 granting 5 bonus tool calls${$.reset}`);let b={role:"user",content:"[SYSTEM] Progress detected \u2014 5 bonus tool calls granted. Budget: 5 remaining."};H.push(b),R.push(b)}else{W(`${$.red} \u2716 Post-wipe tool budget exhausted \u2014 blocking all tool calls${$.reset}`);for(let re of ke)re.canExecute&&(re.canExecute=!1,re.errorResult={role:"tool",content:"BLOCKED: post-wipe tool budget exhausted. No further tool calls are allowed. Summarise what was accomplished and stop.",tool_call_id:re.callId});let b={role:"user",content:"[SYSTEM] Post-wipe tool budget exhausted. All tool calls are now blocked. Respond with a final summary of what was done and stop \u2014 do not attempt any more tool calls."};H.push(b),R.push(b)}}let x$=new Set(["edit_file","write_file","bash","ssh_exec","ask_user","spawn_agents","browser_click","browser_fill","browser_open"]);for(let _ of ke){if(!_.canExecute||x$.has(_.fnName))continue;let b=JSON.stringify(_.args||{}),re=`${_.fnName}|${b}`,I=gs(na,re);I>=2?(W(`${$.red} \u2716 Blocked duplicate: ${_.fnName}(${b.substring(0,80)}) \u2014 called ${I+1}\xD7 with identical args${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: ${_.fnName}() with these exact arguments has already been called ${I}\xD7 \u2014 the result is already in your context. Use the existing output instead of repeating the same call.`,tool_call_id:_.callId}):I===1&&W(`${$.yellow} \u26A0 Duplicate tool call: ${_.fnName}(${b.substring(0,80)}) \u2014 2nd call with identical args${$.reset}`),$s(na,re)}let $o=u?{skipSpinner:!0,skipSummaries:!0}:{},v$=ke.some(_=>_.fnName==="ask_user"),_u=!$o.skipSummaries&&!Ne,Ar=null;_u&&!v$?(Ne=!0,$o.skipSpinner=!0,process.stdout.isTTY?(process.stdout.write(Ui(ke,x,!1,"blink")),Ar=!0):pn||process.stdout.write(Ui(ke,x,!1)+`
1202
- `)):_u&&(Ne=!0,$o.skipSpinner=!0),u&&u._paused&&u.resume();let Or=null;if(Ar&&process.stdout.isTTY&&ke.some(b=>b.canExecute&&(b.fnName==="bash"||b.fnName==="ssh_exec"))){let b=Date.now();Or=setInterval(()=>{let re=Math.round((Date.now()-b)/1e3);re>=3&&process.stdout.write(`\r\x1B[2K${Ui(ke,x,!1,"blink")} ${$.dim}[${re}s]${$.reset}`)},1e3)}let{results:on,summaries:k$}=await qk(ke,!0,{...$o,skipSummaries:!0});if(Or&&(clearInterval(Or),Or=null),Ar&&(Ar=null,process.stdout.write(`\r\x1B[2K${Ui(ke,x,!1)}
1203
- `)),!$o.skipSummaries){let _=k$.filter((I,F)=>!(ke[F]&&ke[F].fnName==="ask_user"));for(let I of _)console.log(I);console.log("");let b=ke.filter(I=>I&&I.fnName!=="ask_user").map(I=>I.fnName),re=ae.record(0,b,T,A);re&&$k(re)}for(let _ of ke){if(_.canExecute||!_.errorResult)continue;let b=typeof _.errorResult.content=="string"?_.errorResult.content:"";if((b.startsWith("BLOCKED:")||b.startsWith("PLAN MODE:"))&&(Kn++,Kn>=pu)){W(`${$.red} \u2716 Loop abort: ${Kn} consecutive blocked calls (pre-execution) \u2014 model not heeding BLOCKED messages${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}}for(let _=0;_<ke.length;_++){let b=ke[_];if(!b.canExecute)continue;let re=on[_].content,I=re.split(`
1204
- `)[0],F=!I.startsWith("ERROR")&&!I.startsWith("CANCELLED")&&!I.startsWith("Command failed")&&!I.startsWith("EXIT");if(!F&&(b.fnName==="edit_file"||b.fnName==="patch_file")&&b.args?.path&&I.includes("old_text not found")){let U=ys.get(b.args.path)||0;ys.set(b.args.path,U+1)}if(!F&&(b.fnName==="read_file"||b.fnName==="edit_file")&&/file not found|does not exist|ENOENT/i.test(I)){if(jn++,jn>=2){W(`${$.yellow} \u26A0 File-not-found streak: ${jn} consecutive misses \u2014 forcing search${$.reset}`);let U={role:"user",content:`[SYSTEM] ${jn} consecutive "File not found" errors. STOP guessing paths. Use search_files or glob_files to locate the correct file first, then read/edit the path returned by the search.`};H.push(U),R.push(U)}}else F&&(b.fnName==="read_file"||b.fnName==="edit_file"||b.fnName==="search_files"||b.fnName==="glob_files")&&(jn=0);if(F&&b.fnName==="write_file"&&b.args?.path){let U=b.args.path.split("/").pop(),Y=b.args.path.includes("/tests/")||b.args.path.includes("\\tests\\");if(/^(test_|demo_|temp_|tmp_|scratch_)/.test(U)&&!Y){W(`${$.yellow} \u26A0 Temp file: "${U}" \u2014 delete with bash rm when done to keep the workspace clean${$.reset}`);let ee={role:"user",content:`[HINT] "${b.args.path}" looks like a temporary test/demo file. Delete it with bash("rm ${b.args.path}") as soon as you're done \u2014 orphaned temp files count against session quality.`};H.push(ee),R.push(ee)}}if(F&&["write_file","edit_file","patch_file"].includes(b.fnName)&&b.args&&b.args.path){ys.delete(b.args.path),A.add(b.args.path);let U=$s(se,b.args.path),Y=b.args.path.split("/").slice(-2).join("/");if(U===we){W(`${$.yellow} \u26A0 Loop warning: "${Y}" edited ${U}\xD7 \u2014 possible edit loop${$.reset}`);let z={role:"user",content:`[SYSTEM WARNING] "${b.args.path}" edited ${U}\xD7. One more edit max, then move on.`};H.push(z),R.push(z)}else if(U>=Ce){W(`${$.red} \u2716 Loop abort: "${Y}" edited ${U}\xD7 \u2014 aborting to prevent runaway loop${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}}if(F&&b.canExecute&&Te&&(qn=0),F&&b.canExecute&&!(Te&&Xe==="plan")){let U=["read_file","grep","search_files","glob","list_directory","ssh_exec","find_files"];["write_file","edit_file","patch_file"].includes(b.fnName)?(dn=0,Zt=!1,vn=0,Qt++):U.includes(b.fnName)&&(dn++,Zt&&vn++);let z=o.postEditCap,ee=Te&&Xe==="implement"?Math.min(mu,6):mu,te=ot?3:Bt?Qt>0?2:4:Qt>0?z:ee,le=3;if(!Te&&Zt&&(ot||Bt&&Qt>=1||vn>=le)&&U.includes(b.fnName)){let ie=ot?`root cause already identified (${kt})`:vn>=le?`${dn} consecutive reads without an edit`:`${Qt} file edit(s) already made`;W(`${$.red} \u2716 Blocked read-only tool: cap fired, ${ie}${$.reset}`),b.canExecute=!1,b.errorResult={role:"tool",content:ot?`BLOCKED: root cause already identified (${kt}). Use edit_file to fix the issue \u2014 do not read more files.`:Bt?"BLOCKED: files already written \u2014 continue with write_file or edit_file to finish the remaining tasks. Do not read more files.":vn>=le?`BLOCKED: You have read ${dn} files without making any edits. Stop investigating and either implement a fix with edit_file/write_file, or write your diagnosis as text output. Do not read more files.`:`BLOCKED: ${Qt} file edit(s) already made and post-edit investigation cap reached. The fix is in place. Do not read more files \u2014 proceed with the task.`,tool_call_id:b.callId}}else if(dn>=te&&!Zt){if(Zt=!0,W(`${$.yellow} \u26A0 Investigation cap: ${dn} read-only calls without an edit \u2014 forcing implementation${$.reset}`),Te&&Xe==="plan"){let lt=[...R].reverse().find($n=>$n.role==="assistant"),Kt=typeof lt?.content=="string"?lt.content:"",Et=rr("implement",Kt);Et&&(H.push(Et),R.push(Et),Ve=0,nn=hs("implement"))}let ie;ot?ie=`[SYSTEM] Root cause was already identified (${kt}). Edit the file now \u2014 do not read more files.`:Nt?ie="[SYSTEM] SSH temporarily paused. Summarize your findings and state the likely diagnosis. Do NOT ask the user to run commands \u2014 SSH re-enables after your summary.":ie="[SYSTEM] You have read enough files. Now implement your fix using edit_file.";let He={role:"user",content:ie};H.push(He),R.push(He)}}if((b.fnName==="bash"||b.fnName==="ssh_exec")&&b.args&&b.args.command){let U=b.args.command.replace(/\d+/g,"N").replace(/\s+/g," ").trim().slice(0,100),Y=$s(tt,U);if(Y===nt){W(`${$.yellow} \u26A0 Loop warning: same bash command run ${Y}\xD7 \u2014 possible debug loop${$.reset}`);let z={role:"user",content:`[SYSTEM WARNING] Same bash command ${Y}\xD7. Debug loop detected \u2014 try a different approach.`};H.push(z),R.push(z)}else if(Y>=Tn){W(`${$.red} \u2716 Loop abort: same bash command run ${Y}\xD7 \u2014 aborting runaway debug loop${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}}if(b.fnName==="ssh_exec"){Ut++;{let z=(on[_]?.content??"").split(`
1205
- `).map(ee=>ee.trim()).find(ee=>ee.length>0&&!ee.startsWith("**")&&(ee.startsWith("EXIT")||/^[\w./-]+:\s/.test(ee)||ee.startsWith("bash:")||ee.startsWith("sh:")))??"";if(z){if(z===Vi?bs++:(Vi=z,bs=1),bs===3&&!Nt){W(`${$.yellow} \u26A0 SSH repeated-error: "${z.slice(0,60)}" returned ${bs}\xD7 \u2014 nudging to change approach${$.reset}`);let ee={role:"user",content:`[SYSTEM WARNING] The last ${bs} SSH commands all failed with the same error: "${z}". Retrying variants of the same command will not help. Switch to a different approach to accomplish the task (e.g. use a different tool, read a local file, or change the command syntax entirely).`};H.push(ee),R.push(ee)}}else Vi="",bs=0}if(Ut>=b$){W(`${$.red} \u2716 SSH storm abort: ${Ut} consecutive ssh_exec calls \u2014 aborting${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}else if(Ut===go){{let z=pt(),{messages:ee}=un(R,z);R=ee}Nt=!0,Wi++,W(`${$.yellow} \u26A0 SSH storm warning (#${Wi}): ${Ut} consecutive ssh_exec calls \u2014 blocking further SSH${$.reset}`);let Y={role:"user",content:ot?`[SYSTEM WARNING] ${Ut} consecutive SSH calls. Root cause identified (${kt}). Read the file that needs fixing, then edit it.`:`[SYSTEM WARNING] ${Ut} consecutive SSH calls \u2014 SSH temporarily paused for synthesis. Summarize what you found and state the likely diagnosis. Do NOT ask the user to run commands or provide logs. SSH will be re-enabled after your summary so you can continue.`};H.push(Y),R.push(Y)}}else b.canExecute&&(Ut=0);if(b.fnName==="bash"&&b.canExecute){let z=(on[_]?.content??"").split(`
1206
- `).map(ee=>ee.trim()).find(ee=>ee.length>0&&(ee.startsWith("EXIT")||/^[\w./-]+:\s/.test(ee)||ee.startsWith("bash:")||ee.startsWith("sh:")))??"";if(z){if(z===Zi?_s++:(Zi=z,_s=1),_s===3){W(`${$.yellow} \u26A0 Bash repeated-error: "${z.slice(0,60)}" returned ${_s}\xD7 \u2014 nudging to change approach${$.reset}`);let ee={role:"user",content:`[SYSTEM WARNING] The last ${_s} bash commands all failed with the same error: "${z}". Retrying variants of the same command will not help. Switch to a completely different approach (e.g. use a different tool, change the command syntax, or use ssh_exec to run the command on the remote server instead).`};H.push(ee),R.push(ee)}}else Zi="",_s=0}if(b.fnName==="bash"&&b.canExecute&&!fl&&b.args?.command){let U=on[_]?.content??"";if(/git\s+commit\b/.test(b.args.command)&&!U.startsWith("EXIT")&&!U.startsWith("ERROR")&&(/\[\S+\s+[a-f0-9]+\]/.test(U)||U.includes("files changed")||U.includes("file changed")||U.includes("insertions(+)")||U.includes("create mode"))){fl=!0,or=0,W(`${$.green} \u2713 Git commit detected \u2014 post-commit verification cap active (max 2 git status/diff/log)${$.reset}`);let ee={role:"user",content:"[SYSTEM] \u2713 Git commit succeeded. Your changes are committed. Do NOT run further git status / git diff / git log calls \u2014 the commit is done. Write your final summary and stop. Running extra verification commands wastes tool calls and hurts session quality."};H.push(ee),R.push(ee)}}if(fl&&b.fnName==="bash"&&b.args?.command&&/git\s+(status|diff|log|show)\b/.test(b.args.command)&&(or++,or>2)){W(`${$.yellow} \u26A0 Post-commit git verification blocked (call ${or})${$.reset}`);let Y={role:"user",content:"[SYSTEM] \u26A0 STOP: You already ran "+(or-1)+" git verification commands after committing. The commit is confirmed. Write your final summary NOW and do not make any more tool calls."};H.push(Y),R.push(Y)}if(F&&b.fnName==="grep"&&b.args&&b.args.pattern){let U=`${b.args.pattern}|${b.args.path||""}`,Y=$s(wa,U);if(Y===ba){W(`${$.yellow} \u26A0 Loop warning: grep pattern "${b.args.pattern.slice(0,40)}" run ${Y}\xD7 \u2014 possible search loop${$.reset}`);let z={role:"user",content:`[SYSTEM WARNING] Same grep pattern ${Y}\xD7. Results unchanged \u2014 use existing data or try different pattern.`};H.push(z),R.push(z)}else if(Y>=i$){W(`${$.red} \u2716 Loop abort: grep pattern run ${Y}\xD7 \u2014 aborting runaway search loop${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}if(b.args.path){let z=$s(du,b.args.path),ee=gs(Er,b.args.path)>=1;if(z===(ee?1:a$)){let le=b.args.path.split("/").slice(-2).join("/");W(`${$.yellow} \u26A0 Loop warning: "${le}" grepped ${z}\xD7 with different patterns \u2014 context flood risk${$.reset}`);let _e={role:"user",content:ee?`[SYSTEM NOTE] "${b.args.path}" was already fully read \u2014 its content is in context. Grepping it again is redundant; use the context you already have.`:`[SYSTEM NOTE] "${b.args.path}" grepped ${z}\xD7 \u2014 use the search results already in context instead of searching again.`};H.push(_e),R.push(_e)}}}if(F&&(b.fnName==="glob"||b.fnName==="glob_files"||b.fnName==="search_files")&&b.args){let U=b.args.pattern||b.args.query||b.args.path||"",Y=$s(c$,U);if(Y===l$){W(`${$.yellow} \u26A0 Loop warning: glob pattern "${U.slice(0,40)}" run ${Y}\xD7 \u2014 possible search loop${$.reset}`);let ee={role:"user",content:`[SYSTEM WARNING] Same glob/search pattern ${Y}\xD7. Results unchanged \u2014 use existing data or try different pattern.`};H.push(ee),R.push(ee)}else if(Y>=u$){W(`${$.red} \u2716 Loop abort: glob pattern run ${Y}\xD7 \u2014 aborting runaway search loop${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}let z=U.replace(/\*+/g," ").replace(/[{}()\[\],.\/\\]/g," ").split(/\s+/).filter(ee=>ee.length>=4&&!/^\.(js|ts|py|json|md|yaml|yml|txt|css|html|sh)$/.test(ee));for(let ee of z){let te=ee.toLowerCase();mr.has(te)||mr.set(te,new Set);let le=mr.get(te);if(le.add(U),le.size===f$){W(`${$.red} \u2716 Glob core-term block: ${le.size} different patterns all searching for "${te}" \u2014 search loop${$.reset}`);let _e={role:"user",content:`[SYSTEM WARNING] You have searched for "${te}" using ${le.size} different glob patterns. This is a search loop \u2014 the file you are looking for likely does not exist. Stop searching and work with the files you have already found, or ask the user for clarification.`};H.push(_e),R.push(_e)}else if(le.size===d$){W(`${$.yellow} \u26A0 Glob core-term warning: ${le.size} different patterns searching for "${te}"${$.reset}`);let _e={role:"user",content:`[SYSTEM WARNING] ${le.size} different glob patterns all target "${te}". If previous searches returned no results, the file probably does not exist \u2014 stop searching and proceed with available information.`};H.push(_e),R.push(_e)}}}let ce=(b.args?.command||b.args?.cmd||b.args?.script||"").toLowerCase(),G=/\b(health|healthcheck|health-check|status|check|ping|validate|alive|ready)\b/.test(ce)||/\/(health|status|ping|ready|alive)\b/.test(ce);if(F&&(b.fnName==="bash"||b.fnName==="ssh_exec")&&G&&re.includes('"valid":true')){{let Y=pt();if(Vt(R,Y).percentage>=60){let{messages:ee,tokensRemoved:te}=un(R,Y);te>0&&(R=ee,console.log(`${$.dim} [pre-stop-compress \u2014 ~${te} tokens freed before STOP injection, now ${Math.round(Vt(R,Y).percentage)}%]${$.reset}`))}}let U={role:"user",content:'[SYSTEM STOP] Tool result contains {"valid":true}. The token/service is valid and reachable. STOP all further investigation immediately. Report to the user that the token is valid, the service is healthy, and no fix is needed. Do NOT read any more log files.'};H.push(U),R.push(U),console.log(`${$.cyan} \u2713 Health-check stop signal detected \u2014 injecting STOP instruction${$.reset}`)}if(re.startsWith("BLOCKED:")){if(Kn++,Kn>=pu){W(`${$.red} \u2716 Loop abort: ${Kn} consecutive blocked calls \u2014 model not heeding BLOCKED messages${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}}else Kn=0;if(F)Hn=0,va=!0;else if(Hn++,Hn===g$){W(`${$.yellow} \u26A0 Loop warning: ${Hn} consecutive tool errors \u2014 possible stuck loop${$.reset}`);let U={role:"user",content:`[SYSTEM WARNING] ${Hn} consecutive errors. Stuck loop \u2014 try fundamentally different approach or declare done.`};H.push(U),R.push(U)}else if(Hn>=$$){W(`${$.red} \u2716 Loop abort: ${Hn} consecutive errors \u2014 aborting stuck loop${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}if(F&&b.fnName==="read_file"&&b.args&&b.args.path){T.add(b.args.path);let U=$s(Er,b.args.path);if(b.args.line_start!=null){let te=b.args.line_start||1,le=b.args.line_end||te+350;Dn.has(b.args.path)||Dn.set(b.args.path,[]),Dn.get(b.args.path).push([te,le])}if(b._scrollWarn){let{sectionCount:te,path:le}=b._scrollWarn,_e={role:"user",content:`[SYSTEM WARNING] "${le}" \u2014 you have now read ${te} different sections of this file. This is a file-scroll pattern. Stop reading sections and use grep_search to find the specific lines you need instead.`};H.push(_e),R.push(_e),W(`${$.yellow} \u26A0 Scroll warning: "${le.split("/").slice(-2).join("/")}" \u2014 ${te} sections read \u2014 use grep instead${$.reset}`)}let Y=b.args.path.split("/").slice(-2).join("/"),z=!b.args?.line_start&&!b.args?.line_end,ee=Te&&Xe==="plan";if(!ee&&z&&U===p$){{let le=pt();if(Vt(R,le).percentage>=60){let{messages:ie}=un(R,le);R=ie}}W(`${$.yellow} \u26A0 Loop warning: "${Y}" read unbounded ${U}\xD7 \u2014 use line_start/line_end${$.reset}`);let te={role:"user",content:`[SYSTEM WARNING] "${b.args.path}" read ${U}\xD7 without line ranges. Use line_start/line_end to read specific sections \u2014 do not re-read the full file.`};H.push(te),R.push(te)}else if(!ee&&z&&U>=m$){W(`${$.red} \u2716 Loop abort: "${Y}" read unbounded ${U}\xD7 \u2014 aborting runaway read loop${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}}if(b.fnName==="spawn_agents"){let U=(re.match(/\bStatus: done\b/g)||[]).length;if((re.match(/\bStatus: truncated\b/g)||[]).length>0&&U===0){if(Gn++,Gn===y$){W(`${$.yellow} \u26A0 Swarm warning: all sub-agents hit iteration limit ${Gn}\xD7 in a row${$.reset}`);let z={role:"user",content:`[SYSTEM WARNING] Sub-agents truncated ${Gn}\xD7 in a row. Stop spawning \u2014 try different approach or report findings.`};H.push(z),R.push(z)}else if(Gn>=w$){console.log(`${$.red} \u2716 Swarm abort: all sub-agents hit iteration limit ${Gn}\xD7 \u2014 aborting stuck swarm${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}}else U>0&&(Gn=0)}}for(let _ of on)H.push(_),R.push(_);if(!ot)for(let _=0;_<on.length;_++){if(!ke[_]||ke[_].fnName!=="ssh_exec")continue;let b=on[_];if(!b||typeof b.content!="string")continue;let re=dl(b.content);if(re){ot=!0,kt=re.slice(0,120),dn=0,Zt=!1,vn=0,W(`${$.yellow} \u26A1 Root cause detected: ${kt} \u2014 fix phase (read budget: 3)${$.reset}`);let I={role:"user",content:`[SYSTEM] Root cause identified: ${kt}. Read only the file that needs fixing, then edit it. Do not read other files.`};H.push(I),R.push(I);break}}for(let _=0;_<on.length;_++){let b=ke[_];if(!b)continue;let re=typeof on[_]?.content=="string"?on[_].content:"";if(b.fnName==="create_task"){let I=re.match(/Task #(\d+) created/),F=typeof b.args?.subject=="string"?b.args.subject:"";I&&F&&hr.set(I[1],F)}else if((b.fnName==="write_file"||b.fnName==="edit_file")&&!re.startsWith("BLOCKED:")&&re.trim().length>0){let F=(typeof b.args?.path=="string"?b.args.path:typeof b.args?.file_path=="string"?b.args.file_path:"").split("/").pop().toLowerCase(),ce=F.split(/[._\-/]/).filter(G=>G.length>2);for(let[G,ye]of hr){if(gr.has(G))continue;let U=ye.toLowerCase().split(/\W+/).filter(z=>z.length>3);ce.filter(z=>U.some(ee=>ee.includes(z)||z.includes(ee))).length>=1&&(gr.add(G),W(`${$.green} \u2714 Auto-matched task #${G} to ${F}: ${ye.slice(0,60)}${$.reset}`))}}}{let _=pt();if(Vt(R,_).percentage>=78){let{messages:re,tokensRemoved:I}=un(R,_);I>0&&(R=re,console.log(`${$.dim} [auto-compressed \u2014 ~${I} tokens freed, now ${Math.round(Vt(R,_).percentage)}%]${$.reset}`))}}let xu=Uk();if(xu){let _={role:"user",content:`[User note mid-run]: ${xu}`};H.push(_),R.push(_),console.log(`${$.cyan} \u270E Context added${$.reset}`)}}if(Ve>=nn){if(u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Ze(H),$h(H),Te&&Xe==="plan"){let Es=[...H].reverse().find(ct=>ct.role==="assistant"),It=typeof Es?.content=="string"?Es.content:"",Ts=rr("implement",It);if(Ts){H.push(Ts),R=[{role:"system",content:await vl()},...H],nn=hs("implement"),W(`${$.yellow} \u26A0 Plan budget exhausted \u2014 auto-transitioning to implement${$.reset}`);continue e}}else if(Te&&Xe==="verify"){W(`${$.yellow} \u26A0 Verify budget exhausted \u2014 completing session${$.reset}`);break e}let{getActiveProviderName:Ae}=je();if(Ae()==="ollama"&&xa<hu){if(A.size===0&&!va){console.log(`${$.yellow} \u26A0 Max iterations reached with no progress. Stopping.${$.reset}`);break e}xa++,nn=20,console.log(`${$.dim} \u2500\u2500 auto-extending (+20 turns, ext ${xa}/${hu}) \u2500\u2500${$.reset}`);continue e}if(console.log(`
1207
- ${$.yellow}\u26A0 Max iterations reached.${$.reset}`),await Oh(" Continue for 20 more turns?")){nn=20;continue e}console.log(`${$.dim} Tip: set "maxIterations" in .nex/config.json or use --max-turns${$.reset}`)}break e}}Dh.exports={processInput:Zk,clearConversation:Hk,getConversationLength:Gk,getConversationMessages:Yk,setConversationMessages:zk,setAbortSignalGetter:xk,setMaxIterations:_k,invalidateSystemPromptCache:$l,clearToolFilterCache:Ak,getCachedFilteredTools:Ph,buildSystemPrompt:vl,getProjectContextHash:Lh,buildUserContent:Mh,detectAndTruncateLoop:ml,injectMidRunNote:Fk,resetSessionTracking:jh}});var je=Q((AR,Wh)=>{var{OllamaProvider:Qk}=Zu(),{OpenAIProvider:eS}=nd(),{AnthropicProvider:tS}=id(),{GeminiProvider:nS}=ud(),{LocalProvider:sS}=pd(),{checkBudget:oS}=qs(),Nl={top:{ollama:"kimi-k2:1t",openai:"gpt-4.1",anthropic:"claude-sonnet-4-5",gemini:"gemini-2.5-pro"},strong:{ollama:"qwen3-coder:480b",openai:"gpt-4o",anthropic:"claude-sonnet",gemini:"gemini-2.5-flash"},fast:{ollama:"devstral-small-2:24b",openai:"gpt-4.1-mini",anthropic:"claude-haiku",gemini:"gemini-2.0-flash"}},Al=(process.env.OLLAMA_FALLBACK_CHAIN||"").split(",").map(t=>t.trim()).filter(Boolean),Fh={};for(let[t,e]of Object.entries(Nl))for(let n of Object.values(e))Fh[n]=t;function Ol(t,e){let n=Fh[t];return n&&Nl[n][e]||t}var rt={},St=null,Je=null,$r=[];function Wt(){if(Object.keys(rt).length>0)return;co("ollama",new Qk),co("openai",new eS),co("anthropic",new tS),co("gemini",new nS),co("local",new sS);let t=process.env.DEFAULT_PROVIDER||"ollama",e=process.env.DEFAULT_MODEL||null;rt[t]?(St=t,Je=e||rt[t].defaultModel):(St="ollama",Je="kimi-k2.5");let n=process.env.FALLBACK_CHAIN;n&&($r=n.split(",").map(o=>o.trim()).filter(Boolean))}function co(t,e){rt[t]=e}function rS(t){return Wt(),rt[t]||null}function Ml(){return Wt(),rt[St]||null}function iS(){return Wt(),St}function aS(){return Wt(),Je}function cS(){Wt();let t=Ml();if(!t)return{id:Je,name:Je,provider:St};let e=t.getModel(Je);return e?{...e,provider:St}:{id:Je,name:Je,provider:St}}function Uh(t){if(!t)return{provider:null,model:null};let e=t.indexOf(":");if(e>0){let n=t.slice(0,e);if(rt[n]||["ollama","openai","anthropic","gemini","local"].includes(n))return{provider:n,model:t.slice(e+1)}}return{provider:null,model:t}}function lS(t){Wt();let{provider:e,model:n}=Uh(t);if(e){let s=rt[e];return s&&(s.getModel(n)||e==="local"||e==="ollama")?(St=e,Je=n,oa(),!0):!1}let o=Ml();if(o&&o.getModel(n))return Je=n,oa(),!0;for(let[s,r]of Object.entries(rt))if(r.getModel(n))return St=s,Je=n,oa(),!0;return!1}function oa(){try{let{invalidateSystemPromptCache:t,clearToolFilterCache:e}=Se();t(),e()}catch{}try{let{invalidateTokenRatioCache:t}=Rt();t()}catch{}}function uS(){Wt();let t=new Set;for(let e of Object.values(rt))for(let n of e.getModelNames())t.add(n);return Array.from(t)}function dS(){return Wt(),Object.entries(rt).map(([t,e])=>({provider:t,configured:e.isConfigured(),models:Object.values(e.getModels()).map(n=>({...n,active:t===St&&n.id===Je}))}))}function fS(){Wt();let t=[];for(let[e,n]of Object.entries(rt)){let o=n.isConfigured();for(let s of Object.values(n.getModels()))t.push({spec:`${e}:${s.id}`,name:s.name,provider:e,configured:o})}return t}function pS(t){$r=Array.isArray(t)?t:[]}function mS(){return[...$r]}function qh(t){let e=t.message||"",n=t.code||"";return!!(e.includes("429")||e.includes("500")||e.includes("502")||e.includes("503")||e.includes("504")||n==="ECONNABORTED"||n==="ETIMEDOUT"||n==="ECONNREFUSED"||n==="ECONNRESET"||n==="EHOSTUNREACH"||n==="ENETUNREACH"||n==="EPIPE"||n==="ERR_SOCKET_CONNECTION_TIMEOUT"||e.includes("socket disconnected")||e.includes("TLS")||e.includes("ECONNRESET")||e.includes("ECONNABORTED")||e.includes("network")||e.includes("ETIMEDOUT"))}async function Bh(t){let e=[St,...$r.filter(r=>r!==St)],n,o=0,s=0;for(let r=0;r<e.length;r++){let i=e[r],c=rt[i];if(!c||!c.isConfigured())continue;s++;let l=oS(i);if(!l.allowed){o++,n=new Error(`Budget limit reached for ${i}: $${l.spent.toFixed(2)} / $${l.limit.toFixed(2)}`);continue}try{let u=r>0,d=u?Ol(Je,i):Je;return u&&d!==Je&&process.stderr.write(` [fallback: ${i}:${d}]
1199
+ ${getPlanContent()||on.content}`;H.push({role:"user",content:te}),R.push({role:"user",content:te}),ce=!0}}else console.log(`
1200
+ ${$.cyan}${$.bold}Plan ready.${$.reset} ${$.dim}Type ${$.reset}${$.cyan}/plan approve${$.reset}${$.dim} to execute, or ask follow-up questions to refine.${$.reset}`);if(ce){u&&(u.stop(),u=null),Ve--;continue}}}if(u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Bt&&A.size>=3){let I=[...A].map(U=>U.split("/").pop()).slice(0,8).join(", "),F=[...A].some(U=>U.endsWith("package.json")),ce=[...A].some(U=>U.endsWith("requirements.txt")),G=[...A].some(U=>U.endsWith("package-lock.json")||U.endsWith("yarn.lock")||U.endsWith("pnpm-lock.yaml")),we=F&&!G?"npm install not yet run":ce?"pip install not yet run":null;ur=`[Previous session created ${A.size} files: ${I}`+(we?` \u2014 ${we}`:"")+". Use this context to answer follow-up questions without re-reading files.]"}if(Bt&&!bl&&x>0){let I=[...A].some(te=>te.endsWith("package.json")),F=[...A].some(te=>te.endsWith("requirements.txt")||te.endsWith("Pipfile")||te.endsWith("pyproject.toml")),ce=[...A].some(te=>te.endsWith("package-lock.json")||te.endsWith("yarn.lock")||te.endsWith("pnpm-lock.yaml")),G=H.flatMap(te=>{let le=Array.isArray(te.tool_calls)?te.tool_calls:[],_e=Array.isArray(te.content)?te.content.filter(ae=>ae?.type==="tool_use"):[];return[...le,..._e]}).filter(te=>{let le=te.function?.name||te.name||"";return le==="bash"||le==="Bash"}).map(te=>{try{let le=te.function?.arguments??te.input??{};return(typeof le=="string"?JSON.parse(le):le)?.command||""}catch{return""}}),we=G.some(te=>/pip\s+install|python\s+-m\s+venv/.test(te)),U=G.some(te=>/npm\s+install/.test(te)),z=[...A].some(te=>/\/App\.(js|ts|jsx|tsx)$/.test(te))&&!I&&!U;if(F&&!we||I&&!ce&&!U||z){bl=!0;let te=[];F&&!we&&te.push("python -m venv venv && source venv/bin/activate && pip install -r requirements.txt"),z?te.push("create package.json for the React frontend (with react, react-dom, react-scripts dependencies), then run npm install"):I&&!ce&&!U&&te.push("npm install");let le=`[FRAMEWORK \u2014 post-creation check] You wrote dependency files but never ran the installer. Run now: ${te.join(" && ")}. Verify it succeeds, fix any errors, then write a closing summary.`;W(`${$.dim} [post-creation] bootstrapping environment (${te.join(", ")})${$.reset}`),H.push({role:"user",content:le}),R.push({role:"user",content:le});continue}}if(x>0&&!n._isSummaryTurn&&Bv(gn))try{W(`${$.dim} [post-turn] terse ending \u2014 requesting diagnosis/summary${$.reset}`);let I=A.size>0?"Write a closing summary (3+ sentences): what files changed and why, what the result is, anything the user should know or do next.":"Write a closing diagnosis (3+ sentences): what you investigated, what you found, and what the user should do next or what the root cause is.",F=[...R,{role:"user",content:I}],G=((await gh(F,[],{}))?.content||"").trim();G&&(console.log(`
1201
+ ${G}`),H.push({role:"user",content:I},{role:"assistant",content:G}))}catch{}Ze(H),$h(H);return}x++,sa++,x>=1&&(Ne=!1);for(let _ of hn){let b=_.function.name;E.set(b,(E.get(b)||0)+1)}if(x>=30&&!Ch){Ch=!0,W(`${$.yellow} \u26A0 Tool budget warning: ${x} tool calls used \u2014 nudging model to wrap up${$.reset}`);let _={role:"user",content:"[SYSTEM] \u26A0 You have used "+x+" tool calls. This is approaching the quality threshold (40). Wrap up NOW: write your final summary and stop. Do NOT run additional verification commands (git status, git diff, git log) \u2014 your changes are already committed and verified. Further tool calls will hurt session quality."};H.push(_),R.push(_)}let Se=await Promise.all(hn.map(_=>Lk(_)));{let _=Zt(R,pt()),b=_.percentage,re=Se.some(G=>G.canExecute&&G.fnName==="read_file"&&!G.args?.line_end),I=Se.filter(G=>G.canExecute&&G.fnName==="read_file"&&G.args?.path&&gs(Er,G.args.path)>=1&&!G.args?.line_start).map(G=>G.args.path.split("/").slice(-2).join("/")),F=I.length>0;if(b>=70&&re&&_a<70||b>=85&&_a<85||F){_a=b;let G=b>=85?"URGENT":"WARNING",we;F?(G="WARNING",we=`Full-file read of ${I.join(", ")} already done \u2014 use line_start/line_end for specific sections instead.`):re?we=`Unbounded read at ${Math.round(b)}% context \u2014 use line_start/line_end to avoid overflow.`:we="Use targeted reads (line_start/line_end) to save space.";let U={role:"user",content:`[SYSTEM ${G}] Context ${Math.round(b)}% used (${_.used}/${_.limit} tokens). ${we}`};if(H.push(U),R.push(U),b>=85){let Y=F?` (re-read of: ${I.join(", ")})`:"";W(`${$.yellow} \u26A0 Context ${Math.round(b)}% used \u2014 agent warned to use targeted reads${Y}${$.reset}`)}}}let Ta=new Map;for(let _ of Se){if(!_.canExecute||_.fnName!=="read_file")continue;let b=_.args?.path;if(!b)continue;let re=gs(Er,b),I=Ta.get(b)||0,F=re+I,ce=_.args?.line_start!=null,G=ys.get(b)||0,we=G>0,U=2;if(F>=ho){let Y=b.split("/").slice(-2).join("/"),z=(vs.get(b)||0)+1;if(vs.set(b,z),z===1)W(`${$.red} \u2716 Blocked: "${Y}" read ${F}\xD7 \u2014 hard cap (${ho}) reached${$.reset}`);else if(z===2){W(`${$.red} \u2716 Escalated block: "${Y}" \u2014 model ignored BLOCKED, injecting system warning${$.reset}`);let ee={role:"user",content:`[SYSTEM WARNING] You already received a BLOCKED error for read_file("${b}") and tried again anyway. This file has reached its read cap (${ho}\xD7). Do NOT attempt to read it again. Use grep_search to find specific content, or proceed with what you already know.`};H.push(ee),R.push(ee)}_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: read_file("${b}") denied \u2014 file already read ${F}\xD7 (hard cap: ${ho}). You have seen enough of this file. Use grep to find specific content or proceed with what you know.`,tool_call_id:_.callId}}else if(F>=1&&ce)if(we&&G<=U){let Y=b.split("/").slice(-2).join("/");console.log(`${$.cyan} \u21A9 Targeted re-read: "${Y}" (line_start=${_.args.line_start}) \u2014 edit recovery #${G}${$.reset}`),ys.set(b,G-1)}else if(we&&G>U){let Y=b.split("/").slice(-2).join("/");W(`${$.red} \u2716 Edit recovery blocked: "${Y}" \u2014 ${U} recovery reads already used. Use grep to find the exact line numbers, then retry.${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: read_file("${b}") denied \u2014 edit recovery budget exhausted (${U} recovery reads used). You already have the file content. Use grep_search to find the exact line numbers of the text you want to change, then retry edit_file with the exact text shown.`,tool_call_id:_.callId}}else{let Y=_.args.line_start||1,z=_.args.line_end||Y+350,ee=Dn.get(b)||[],te=!1;for(let[le,_e]of ee){let ae=Math.max(Y,le),He=Math.min(z,_e);if(He>ae){let lt=He-ae,Kt=z-Y||1,Et=_e-le||1,$n=lt/Et>=.7&&lt/Kt<.7;if(!(z-Y<=h$)&&(lt/Kt>=.7||lt/Et>=.7)){let Rs=b.split("/").slice(-2).join("/"),vu=`${b}:${Y}-${z}`,Cs=(ta.get(vu)||0)+1;if(ta.set(vu,Cs),W($n?`${$.red} \u2716 Blocked superread: "${Rs}" lines ${Y}-${z} subsumes already-read ${le}-${_e} \u2014 use line_start=${_e+1} to skip known content (block #${Cs})${$.reset}`:`${$.red} \u2716 Blocked duplicate read: "${Rs}" lines ${Y}-${z} (\u226570% overlap with lines ${le}-${_e} already in context, block #${Cs})${$.reset}`),Cs>=2){W(`${$.red} \u2716 Escalated range-block: "${Rs}" lines ${Y}-${z} \u2014 model ignored BLOCKED, injecting system warning${$.reset}`);let ku={role:"user",content:$n?`[SYSTEM] Read blocked ${Cs}\xD7 for read_file("${b}", lines ${Y}-${z}). Lines ${le}-${_e} were already read. Use line_start=${_e+1} to read only new content, or use grep_search for specific lines.`:`[SYSTEM] Read blocked ${Cs}\xD7 for read_file("${b}", lines ${Y}-${z}). Lines ${le}-${_e} were already read and will NOT change. Use grep_search to find specific content instead.`};H.push(ku),R.push(ku)}_.canExecute=!1,_.errorResult={role:"tool",content:$n?`BLOCKED: read_file("${b}", lines ${Y}-${z}) re-reads lines ${le}-${_e} already in context. Use line_start=${_e+1} to read only the new content beyond line ${_e}.`:`BLOCKED: read_file("${b}", lines ${Y}-${z}) is a duplicate \u2014 lines ${le}-${_e} are already in your context (\u226570% overlap). Use grep to find specific content instead of re-reading.`,tool_call_id:_.callId},te=!0;break}}}if(!te){let le=ee.length,_e=2;if(le>=3){let He=b.split("/").slice(-2).join("/");W(`${$.red} \u2716 Blocked file-scroll: "${He}" \u2014 ${le} sections already read. Use grep to find specific content.${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: read_file("${b}") denied \u2014 you have already read ${le} different sections of this file (file-scroll pattern). You have seen most of this file. Use grep_search to find the exact lines you need instead of continuing to scroll.`,tool_call_id:_.callId}}else le>=_e&&(_._scrollWarn={sectionCount:le+1,path:b})}}else if(F>=1){let Y=b.split("/").slice(-2).join("/"),z=(vs.get(b)||0)+1;if(vs.set(b,z),z===1)W(`${$.red} \u2716 Blocked unbounded re-read: "${Y}" \u2014 already in context. Use line_start/line_end for specific sections.${$.reset}`);else if(z===2){W(`${$.red} \u2716 Escalated block: "${Y}" \u2014 model ignored unbounded re-read block, injecting system warning${$.reset}`);let ee={role:"user",content:`[SYSTEM] read_file("${b}") was blocked again \u2014 full-file reads are disabled after the first read. Use line_start/line_end for a specific section, or use grep_search to find what you need.`};H.push(ee),R.push(ee)}_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: read_file("${b}") denied \u2014 file already in context (read ${F}\xD7). Use line_start/line_end to read a specific section instead of the full file.`,tool_call_id:_.callId}}_.canExecute&&Ta.set(b,(Ta.get(b)||0)+1)}if(jn>=3)for(let _ of Se)_.canExecute&&(_.fnName!=="read_file"&&_.fnName!=="edit_file"||(W(`${$.red} \u2716 Blocked ${_.fnName} \u2014 ${jn} consecutive file-not-found errors, must search first${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: ${jn} consecutive "File not found" errors. You must call search_files or glob_files to locate the correct path before reading or editing. Do not guess file paths.`,tool_call_id:_.callId}));for(let _ of Se){if(!_.canExecute||_.fnName!=="bash")continue;let b=(_.args?.command||"").trim();if(/^\s*ls(\s+-[a-zA-Z]+)*(\s+\S+)?\s*$/.test(b)&&!/npm|yarn|pnpm|make|git/.test(b)){W(`${$.red} \u2716 Blocked bash ls \u2014 use list_directory tool instead${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:'BLOCKED: bash("ls ...") denied \u2014 use the list_directory tool instead. It returns structured output and does not penalize the session score.',tool_call_id:_.callId};continue}/\bfind\s+[\S.]/.test(b)&&!/git\s|npm\s|yarn\s|-exec\s+\S|-execdir/.test(b)&&(W(`${$.red} \u2716 Blocked bash find \u2014 use glob tool with a pattern instead${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:'BLOCKED: bash("find ...") denied \u2014 use the glob tool with a pattern like "**/*.py" or "src/**/*.js" instead. It is faster and does not penalize the session score.',tool_call_id:_.callId})}for(let _ of Se)_.canExecute&&(_.fnName!=="ssh_exec"&&_.fnName!=="bash"||/\bsed\s+-n\b/.test(_.args?.command||"")&&(W(`${$.red} \u2716 Blocked sed -n: use grep -n "pattern" <file> | head -30 instead${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:'BLOCKED: sed -n is forbidden \u2014 it floods context with line ranges. Use grep -n "pattern" <file> | head -30 to read a specific section, or cat <file> for the full file.',tool_call_id:_.callId}));for(let _ of Se){if(!_.canExecute||_.fnName!=="write_file")continue;let b=_.args?.path,re=_.args?.content||"";if(b)try{let I=require("fs"),F=require("path").resolve(process.cwd(),b);if(I.existsSync(F)){let ce=I.statSync(F).size,G=Buffer.byteLength(re,"utf8"),we=ce>0?G/ce:1;if(we<.6&&ce>200){let U=b.split("/").slice(-2).join("/");console.log(`${$.red} \u2716 write_file shrink guard: "${U}" would shrink to ${Math.round(we*100)}% of original \u2014 likely context loss${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: write_file("${b}") denied \u2014 new content is only ${Math.round(we*100)}% of current file size (${ce} \u2192 ${G} bytes). This looks like a partial rewrite after context loss. Use edit_file/patch_file to add only the new code, or read the file first to see full content before replacing.`,tool_call_id:_.callId}}}}catch{}}let wu=new Map;for(let _ of Se){if(!_.canExecute||_.fnName!=="grep")continue;let b=_.args?.path;if(!b)continue;let re=wu.get(b)||0,I=gs(du,b)+re;if(I>=fu){let F=b.split("/").slice(-2).join("/");W(`${$.red} \u2716 Blocked grep: "${F}" grepped ${I}\xD7 with different patterns \u2014 flood threshold exceeded${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: grep("${b}") denied \u2014 ${I} patterns already tried. Use existing results or read the file instead.`,tool_call_id:_.callId}}_.canExecute&&wu.set(b,re+1)}let _$=5,bu=new Map;for(let _ of Se){if(!_.canExecute||_.fnName!=="ssh_exec")continue;let re=(_.args?.command||"").replace(/\d+/g,"N").replace(/\s+/g," ").trim().slice(0,100),I=bu.get(re)||0,F=gs(tt,re)+I;F>=_$&&(W(`${$.yellow} \u26A0 Blocked ssh_exec: same command run ${F}\xD7 \u2014 result already in context${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: ssh_exec denied \u2014 this command has already run ${F} times and the output is in your context. Use existing results, try a different command, or run it as a local bash call: bash("ssh user@host 'your command'").`,tool_call_id:_.callId}),_.canExecute&&bu.set(re,I+1)}if(Nt){let _=Se.filter(I=>I.canExecute&&I.fnName==="ssh_exec"),b=Se.some(I=>I.canExecute&&I.fnName!=="ssh_exec"),re=k&&j<3;if(_.length>0&&!b&&re&&zi<1)Nt=!1,zi++,Ut=Math.max(0,go-2),W(`${$.dim} [dual-block deadlock: SSH storm relaxed \u2014 allowing 1 SSH call (relax ${zi}/1)]${$.reset}`);else for(let I of _)I.canExecute=!1,I.errorResult={role:"tool",content:ot?`BLOCKED: ssh_exec denied \u2014 SSH paused (${go}+ calls). Root cause is known (${kt}). Edit the file now. You can still use bash("ssh user@host 'cmd'") for a single targeted lookup if essential.`:`BLOCKED: ssh_exec denied \u2014 SSH temporarily paused (${go}+ calls). Provide a text summary of your findings first. Do NOT ask the user to run commands. SSH re-enables after your summary. For one-off lookups use bash("ssh user@host 'cmd'") instead.`,tool_call_id:I.callId}}if(k&&j<3&&!Nt){for(let _ of Se)if(_.canExecute&&["bash","read_file","find_files"].includes(_.fnName)){j++;{let b=pt(),{messages:re}=un(R,b);R=re}W(`${$.yellow} \u26A0 Jarvis-local guard: blocking local ${_.fnName} \u2014 use ssh_exec on 94.130.37.43${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: ${_.fnName} denied \u2014 this is a server issue. Use ssh_exec on 94.130.37.43 instead.`,tool_call_id:_.callId};break}}if(!Te&&Qt&&Bt&&en>=1){let _=["read_file","grep","search_files","glob","list_directory","find_files"];for(let b of Se)b.canExecute&&_.includes(b.fnName)&&(W(`${$.red} \u2716 Creation hard-block: ${b.fnName} denied \u2014 cap fired, files already written${$.reset}`),b.canExecute=!1,b.errorResult={role:"tool",content:"BLOCKED: files already written \u2014 continue with write_file or edit_file to finish the remaining tasks. Do not read more files.",tool_call_id:b.callId})}if(ws>=0){let _=Se.filter(b=>b.canExecute).length;if(_>0&&(ws-=_,ws<0))if(!Ji&&A.size>Xi){Ji=!0,ws=5,W(`${$.green} \u2713 Post-wipe progress detected (${A.size-Xi} files modified) \u2014 granting 5 bonus tool calls${$.reset}`);let b={role:"user",content:"[SYSTEM] Progress detected \u2014 5 bonus tool calls granted. Budget: 5 remaining."};H.push(b),R.push(b)}else{W(`${$.red} \u2716 Post-wipe tool budget exhausted \u2014 blocking all tool calls${$.reset}`);for(let re of Se)re.canExecute&&(re.canExecute=!1,re.errorResult={role:"tool",content:"BLOCKED: post-wipe tool budget exhausted. No further tool calls are allowed. Summarise what was accomplished and stop.",tool_call_id:re.callId});let b={role:"user",content:"[SYSTEM] Post-wipe tool budget exhausted. All tool calls are now blocked. Respond with a final summary of what was done and stop \u2014 do not attempt any more tool calls."};H.push(b),R.push(b)}}let x$=new Set(["edit_file","write_file","bash","ssh_exec","ask_user","spawn_agents","browser_click","browser_fill","browser_open","skill_ar_run_experiment","skill_ar_run_benchmark","skill_ar_checkpoint","skill_ar_revert","skill_ar_log_experiment","skill_ar_extract_metric"]);for(let _ of Se){if(!_.canExecute||x$.has(_.fnName))continue;let b=JSON.stringify(_.args||{}),re=`${_.fnName}|${b}`,I=gs(na,re);I>=2?(W(`${$.red} \u2716 Blocked duplicate: ${_.fnName}(${b.substring(0,80)}) \u2014 called ${I+1}\xD7 with identical args${$.reset}`),_.canExecute=!1,_.errorResult={role:"tool",content:`BLOCKED: ${_.fnName}() with these exact arguments has already been called ${I}\xD7 \u2014 the result is already in your context. Use the existing output instead of repeating the same call.`,tool_call_id:_.callId}):I===1&&W(`${$.yellow} \u26A0 Duplicate tool call: ${_.fnName}(${b.substring(0,80)}) \u2014 2nd call with identical args${$.reset}`),$s(na,re)}let $o=u?{skipSpinner:!0,skipSummaries:!0}:{},v$=Se.some(_=>_.fnName==="ask_user"),_u=!$o.skipSummaries&&!Ne,Ar=null;_u&&!v$?(Ne=!0,$o.skipSpinner=!0,process.stdout.isTTY?(process.stdout.write(Ui(Se,x,!1,"blink")),Ar=!0):pn||process.stdout.write(Ui(Se,x,!1)+`
1202
+ `)):_u&&(Ne=!0,$o.skipSpinner=!0),u&&u._paused&&u.resume();let Or=null;if(Ar&&process.stdout.isTTY&&Se.some(b=>b.canExecute&&(b.fnName==="bash"||b.fnName==="ssh_exec"))){let b=Date.now();Or=setInterval(()=>{let re=Math.round((Date.now()-b)/1e3);re>=3&&process.stdout.write(`\r\x1B[2K${Ui(Se,x,!1,"blink")} ${$.dim}[${re}s]${$.reset}`)},1e3)}let{results:rn,summaries:k$}=await qk(Se,!0,{...$o,skipSummaries:!0});if(Or&&(clearInterval(Or),Or=null),Ar&&(Ar=null,process.stdout.write(`\r\x1B[2K${Ui(Se,x,!1)}
1203
+ `)),!$o.skipSummaries){let _=k$.filter((I,F)=>!(Se[F]&&Se[F].fnName==="ask_user"));for(let I of _)console.log(I);console.log("");let b=Se.filter(I=>I&&I.fnName!=="ask_user").map(I=>I.fnName),re=ie.record(0,b,T,A);re&&$k(re)}for(let _ of Se){if(_.canExecute||!_.errorResult)continue;let b=typeof _.errorResult.content=="string"?_.errorResult.content:"";if((b.startsWith("BLOCKED:")||b.startsWith("PLAN MODE:"))&&(Kn++,Kn>=pu)){W(`${$.red} \u2716 Loop abort: ${Kn} consecutive blocked calls (pre-execution) \u2014 model not heeding BLOCKED messages${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}}for(let _=0;_<Se.length;_++){let b=Se[_];if(!b.canExecute)continue;let re=rn[_].content,I=re.split(`
1204
+ `)[0],F=!I.startsWith("ERROR")&&!I.startsWith("CANCELLED")&&!I.startsWith("Command failed")&&!I.startsWith("EXIT");if(!F&&(b.fnName==="edit_file"||b.fnName==="patch_file")&&b.args?.path&&I.includes("old_text not found")){let U=ys.get(b.args.path)||0;ys.set(b.args.path,U+1)}if(!F&&(b.fnName==="read_file"||b.fnName==="edit_file")&&/file not found|does not exist|ENOENT/i.test(I)){if(jn++,jn>=2){W(`${$.yellow} \u26A0 File-not-found streak: ${jn} consecutive misses \u2014 forcing search${$.reset}`);let U={role:"user",content:`[SYSTEM] ${jn} consecutive "File not found" errors. STOP guessing paths. Use search_files or glob_files to locate the correct file first, then read/edit the path returned by the search.`};H.push(U),R.push(U)}}else F&&(b.fnName==="read_file"||b.fnName==="edit_file"||b.fnName==="search_files"||b.fnName==="glob_files")&&(jn=0);if(F&&b.fnName==="write_file"&&b.args?.path){let U=b.args.path.split("/").pop(),Y=b.args.path.includes("/tests/")||b.args.path.includes("\\tests\\");if(/^(test_|demo_|temp_|tmp_|scratch_)/.test(U)&&!Y){W(`${$.yellow} \u26A0 Temp file: "${U}" \u2014 delete with bash rm when done to keep the workspace clean${$.reset}`);let ee={role:"user",content:`[HINT] "${b.args.path}" looks like a temporary test/demo file. Delete it with bash("rm ${b.args.path}") as soon as you're done \u2014 orphaned temp files count against session quality.`};H.push(ee),R.push(ee)}}if(F&&["write_file","edit_file","patch_file"].includes(b.fnName)&&b.args&&b.args.path){ys.delete(b.args.path),A.add(b.args.path);let U=$s(se,b.args.path),Y=b.args.path.split("/").slice(-2).join("/");if(U===ge){W(`${$.yellow} \u26A0 Loop warning: "${Y}" edited ${U}\xD7 \u2014 possible edit loop${$.reset}`);let z={role:"user",content:`[SYSTEM WARNING] "${b.args.path}" edited ${U}\xD7. One more edit max, then move on.`};H.push(z),R.push(z)}else if(U>=Ce){W(`${$.red} \u2716 Loop abort: "${Y}" edited ${U}\xD7 \u2014 aborting to prevent runaway loop${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}}if(F&&b.canExecute&&Te&&(qn=0),F&&b.canExecute&&!(Te&&Xe==="plan")){let U=["read_file","grep","search_files","glob","list_directory","ssh_exec","find_files"];["write_file","edit_file","patch_file"].includes(b.fnName)?(dn=0,Qt=!1,vn=0,en++):U.includes(b.fnName)&&(dn++,Qt&&vn++);let z=o.postEditCap,ee=Te&&Xe==="implement"?Math.min(mu,6):mu,te=ot?3:Bt?en>0?2:4:en>0?z:ee,le=3;if(!Te&&Qt&&(ot||Bt&&en>=1||vn>=le)&&U.includes(b.fnName)){let ae=ot?`root cause already identified (${kt})`:vn>=le?`${dn} consecutive reads without an edit`:`${en} file edit(s) already made`;W(`${$.red} \u2716 Blocked read-only tool: cap fired, ${ae}${$.reset}`),b.canExecute=!1,b.errorResult={role:"tool",content:ot?`BLOCKED: root cause already identified (${kt}). Use edit_file to fix the issue \u2014 do not read more files.`:Bt?"BLOCKED: files already written \u2014 continue with write_file or edit_file to finish the remaining tasks. Do not read more files.":vn>=le?`BLOCKED: You have read ${dn} files without making any edits. Stop investigating and either implement a fix with edit_file/write_file, or write your diagnosis as text output. Do not read more files.`:`BLOCKED: ${en} file edit(s) already made and post-edit investigation cap reached. The fix is in place. Do not read more files \u2014 proceed with the task.`,tool_call_id:b.callId}}else if(dn>=te&&!Qt){if(Qt=!0,W(`${$.yellow} \u26A0 Investigation cap: ${dn} read-only calls without an edit \u2014 forcing implementation${$.reset}`),Te&&Xe==="plan"){let lt=[...R].reverse().find($n=>$n.role==="assistant"),Kt=typeof lt?.content=="string"?lt.content:"",Et=rr("implement",Kt);Et&&(H.push(Et),R.push(Et),Ve=0,sn=hs("implement"))}let ae;ot?ae=`[SYSTEM] Root cause was already identified (${kt}). Edit the file now \u2014 do not read more files.`:Nt?ae="[SYSTEM] SSH temporarily paused. Summarize your findings and state the likely diagnosis. Do NOT ask the user to run commands \u2014 SSH re-enables after your summary.":ae="[SYSTEM] You have read enough files. Now implement your fix using edit_file.";let He={role:"user",content:ae};H.push(He),R.push(He)}}if((b.fnName==="bash"||b.fnName==="ssh_exec")&&b.args&&b.args.command){let U=b.args.command.replace(/\d+/g,"N").replace(/\s+/g," ").trim().slice(0,100),Y=$s(tt,U);if(Y===nt){W(`${$.yellow} \u26A0 Loop warning: same bash command run ${Y}\xD7 \u2014 possible debug loop${$.reset}`);let z={role:"user",content:`[SYSTEM WARNING] Same bash command ${Y}\xD7. Debug loop detected \u2014 try a different approach.`};H.push(z),R.push(z)}else if(Y>=Tn){W(`${$.red} \u2716 Loop abort: same bash command run ${Y}\xD7 \u2014 aborting runaway debug loop${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}}if(b.fnName==="ssh_exec"){Ut++;{let z=(rn[_]?.content??"").split(`
1205
+ `).map(ee=>ee.trim()).find(ee=>ee.length>0&&!ee.startsWith("**")&&(ee.startsWith("EXIT")||/^[\w./-]+:\s/.test(ee)||ee.startsWith("bash:")||ee.startsWith("sh:")))??"";if(z){if(z===Vi?bs++:(Vi=z,bs=1),bs===3&&!Nt){W(`${$.yellow} \u26A0 SSH repeated-error: "${z.slice(0,60)}" returned ${bs}\xD7 \u2014 nudging to change approach${$.reset}`);let ee={role:"user",content:`[SYSTEM WARNING] The last ${bs} SSH commands all failed with the same error: "${z}". Retrying variants of the same command will not help. Switch to a different approach to accomplish the task (e.g. use a different tool, read a local file, or change the command syntax entirely).`};H.push(ee),R.push(ee)}}else Vi="",bs=0}if(Ut>=b$){W(`${$.red} \u2716 SSH storm abort: ${Ut} consecutive ssh_exec calls \u2014 aborting${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}else if(Ut===go){{let z=pt(),{messages:ee}=un(R,z);R=ee}Nt=!0,Wi++,W(`${$.yellow} \u26A0 SSH storm warning (#${Wi}): ${Ut} consecutive ssh_exec calls \u2014 blocking further SSH${$.reset}`);let Y={role:"user",content:ot?`[SYSTEM WARNING] ${Ut} consecutive SSH calls. Root cause identified (${kt}). Read the file that needs fixing, then edit it.`:`[SYSTEM WARNING] ${Ut} consecutive SSH calls \u2014 SSH temporarily paused for synthesis. Summarize what you found and state the likely diagnosis. Do NOT ask the user to run commands or provide logs. SSH will be re-enabled after your summary so you can continue.`};H.push(Y),R.push(Y)}}else b.canExecute&&(Ut=0);if(b.fnName==="bash"&&b.canExecute){let z=(rn[_]?.content??"").split(`
1206
+ `).map(ee=>ee.trim()).find(ee=>ee.length>0&&(ee.startsWith("EXIT")||/^[\w./-]+:\s/.test(ee)||ee.startsWith("bash:")||ee.startsWith("sh:")))??"";if(z){if(z===Zi?_s++:(Zi=z,_s=1),_s===3){W(`${$.yellow} \u26A0 Bash repeated-error: "${z.slice(0,60)}" returned ${_s}\xD7 \u2014 nudging to change approach${$.reset}`);let ee={role:"user",content:`[SYSTEM WARNING] The last ${_s} bash commands all failed with the same error: "${z}". Retrying variants of the same command will not help. Switch to a completely different approach (e.g. use a different tool, change the command syntax, or use ssh_exec to run the command on the remote server instead).`};H.push(ee),R.push(ee)}}else Zi="",_s=0}if(b.fnName==="bash"&&b.canExecute&&!fl&&b.args?.command){let U=rn[_]?.content??"";if(/git\s+commit\b/.test(b.args.command)&&!U.startsWith("EXIT")&&!U.startsWith("ERROR")&&(/\[\S+\s+[a-f0-9]+\]/.test(U)||U.includes("files changed")||U.includes("file changed")||U.includes("insertions(+)")||U.includes("create mode"))){fl=!0,or=0,W(`${$.green} \u2713 Git commit detected \u2014 post-commit verification cap active (max 2 git status/diff/log)${$.reset}`);let ee={role:"user",content:"[SYSTEM] \u2713 Git commit succeeded. Your changes are committed. Do NOT run further git status / git diff / git log calls \u2014 the commit is done. Write your final summary and stop. Running extra verification commands wastes tool calls and hurts session quality."};H.push(ee),R.push(ee)}}if(fl&&b.fnName==="bash"&&b.args?.command&&/git\s+(status|diff|log|show)\b/.test(b.args.command)&&(or++,or>2)){W(`${$.yellow} \u26A0 Post-commit git verification blocked (call ${or})${$.reset}`);let Y={role:"user",content:"[SYSTEM] \u26A0 STOP: You already ran "+(or-1)+" git verification commands after committing. The commit is confirmed. Write your final summary NOW and do not make any more tool calls."};H.push(Y),R.push(Y)}if(F&&b.fnName==="grep"&&b.args&&b.args.pattern){let U=`${b.args.pattern}|${b.args.path||""}`,Y=$s(wa,U);if(Y===ba){W(`${$.yellow} \u26A0 Loop warning: grep pattern "${b.args.pattern.slice(0,40)}" run ${Y}\xD7 \u2014 possible search loop${$.reset}`);let z={role:"user",content:`[SYSTEM WARNING] Same grep pattern ${Y}\xD7. Results unchanged \u2014 use existing data or try different pattern.`};H.push(z),R.push(z)}else if(Y>=i$){W(`${$.red} \u2716 Loop abort: grep pattern run ${Y}\xD7 \u2014 aborting runaway search loop${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}if(b.args.path){let z=$s(du,b.args.path),ee=gs(Er,b.args.path)>=1;if(z===(ee?1:a$)){let le=b.args.path.split("/").slice(-2).join("/");W(`${$.yellow} \u26A0 Loop warning: "${le}" grepped ${z}\xD7 with different patterns \u2014 context flood risk${$.reset}`);let _e={role:"user",content:ee?`[SYSTEM NOTE] "${b.args.path}" was already fully read \u2014 its content is in context. Grepping it again is redundant; use the context you already have.`:`[SYSTEM NOTE] "${b.args.path}" grepped ${z}\xD7 \u2014 use the search results already in context instead of searching again.`};H.push(_e),R.push(_e)}}}if(F&&(b.fnName==="glob"||b.fnName==="glob_files"||b.fnName==="search_files")&&b.args){let U=b.args.pattern||b.args.query||b.args.path||"",Y=$s(c$,U);if(Y===l$){W(`${$.yellow} \u26A0 Loop warning: glob pattern "${U.slice(0,40)}" run ${Y}\xD7 \u2014 possible search loop${$.reset}`);let ee={role:"user",content:`[SYSTEM WARNING] Same glob/search pattern ${Y}\xD7. Results unchanged \u2014 use existing data or try different pattern.`};H.push(ee),R.push(ee)}else if(Y>=u$){W(`${$.red} \u2716 Loop abort: glob pattern run ${Y}\xD7 \u2014 aborting runaway search loop${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}let z=U.replace(/\*+/g," ").replace(/[{}()\[\],.\/\\]/g," ").split(/\s+/).filter(ee=>ee.length>=4&&!/^\.(js|ts|py|json|md|yaml|yml|txt|css|html|sh)$/.test(ee));for(let ee of z){let te=ee.toLowerCase();mr.has(te)||mr.set(te,new Set);let le=mr.get(te);if(le.add(U),le.size===f$){W(`${$.red} \u2716 Glob core-term block: ${le.size} different patterns all searching for "${te}" \u2014 search loop${$.reset}`);let _e={role:"user",content:`[SYSTEM WARNING] You have searched for "${te}" using ${le.size} different glob patterns. This is a search loop \u2014 the file you are looking for likely does not exist. Stop searching and work with the files you have already found, or ask the user for clarification.`};H.push(_e),R.push(_e)}else if(le.size===d$){W(`${$.yellow} \u26A0 Glob core-term warning: ${le.size} different patterns searching for "${te}"${$.reset}`);let _e={role:"user",content:`[SYSTEM WARNING] ${le.size} different glob patterns all target "${te}". If previous searches returned no results, the file probably does not exist \u2014 stop searching and proceed with available information.`};H.push(_e),R.push(_e)}}}let ce=(b.args?.command||b.args?.cmd||b.args?.script||"").toLowerCase(),G=/\b(health|healthcheck|health-check|status|check|ping|validate|alive|ready)\b/.test(ce)||/\/(health|status|ping|ready|alive)\b/.test(ce);if(F&&(b.fnName==="bash"||b.fnName==="ssh_exec")&&G&&re.includes('"valid":true')){{let Y=pt();if(Zt(R,Y).percentage>=60){let{messages:ee,tokensRemoved:te}=un(R,Y);te>0&&(R=ee,console.log(`${$.dim} [pre-stop-compress \u2014 ~${te} tokens freed before STOP injection, now ${Math.round(Zt(R,Y).percentage)}%]${$.reset}`))}}let U={role:"user",content:'[SYSTEM STOP] Tool result contains {"valid":true}. The token/service is valid and reachable. STOP all further investigation immediately. Report to the user that the token is valid, the service is healthy, and no fix is needed. Do NOT read any more log files.'};H.push(U),R.push(U),console.log(`${$.cyan} \u2713 Health-check stop signal detected \u2014 injecting STOP instruction${$.reset}`)}if(re.startsWith("BLOCKED:")){if(Kn++,Kn>=pu){W(`${$.red} \u2716 Loop abort: ${Kn} consecutive blocked calls \u2014 model not heeding BLOCKED messages${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}}else Kn=0;if(F)Hn=0,va=!0;else if(Hn++,Hn===g$){W(`${$.yellow} \u26A0 Loop warning: ${Hn} consecutive tool errors \u2014 possible stuck loop${$.reset}`);let U={role:"user",content:`[SYSTEM WARNING] ${Hn} consecutive errors. Stuck loop \u2014 try fundamentally different approach or declare done.`};H.push(U),R.push(U)}else if(Hn>=$$){W(`${$.red} \u2716 Loop abort: ${Hn} consecutive errors \u2014 aborting stuck loop${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}if(F&&b.fnName==="read_file"&&b.args&&b.args.path){T.add(b.args.path);let U=$s(Er,b.args.path);if(b.args.line_start!=null){let te=b.args.line_start||1,le=b.args.line_end||te+350;Dn.has(b.args.path)||Dn.set(b.args.path,[]),Dn.get(b.args.path).push([te,le])}if(b._scrollWarn){let{sectionCount:te,path:le}=b._scrollWarn,_e={role:"user",content:`[SYSTEM WARNING] "${le}" \u2014 you have now read ${te} different sections of this file. This is a file-scroll pattern. Stop reading sections and use grep_search to find the specific lines you need instead.`};H.push(_e),R.push(_e),W(`${$.yellow} \u26A0 Scroll warning: "${le.split("/").slice(-2).join("/")}" \u2014 ${te} sections read \u2014 use grep instead${$.reset}`)}let Y=b.args.path.split("/").slice(-2).join("/"),z=!b.args?.line_start&&!b.args?.line_end,ee=Te&&Xe==="plan";if(!ee&&z&&U===p$){{let le=pt();if(Zt(R,le).percentage>=60){let{messages:ae}=un(R,le);R=ae}}W(`${$.yellow} \u26A0 Loop warning: "${Y}" read unbounded ${U}\xD7 \u2014 use line_start/line_end${$.reset}`);let te={role:"user",content:`[SYSTEM WARNING] "${b.args.path}" read ${U}\xD7 without line ranges. Use line_start/line_end to read specific sections \u2014 do not re-read the full file.`};H.push(te),R.push(te)}else if(!ee&&z&&U>=m$){W(`${$.red} \u2716 Loop abort: "${Y}" read unbounded ${U}\xD7 \u2014 aborting runaway read loop${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}}if(b.fnName==="spawn_agents"){let U=(re.match(/\bStatus: done\b/g)||[]).length;if((re.match(/\bStatus: truncated\b/g)||[]).length>0&&U===0){if(Gn++,Gn===y$){W(`${$.yellow} \u26A0 Swarm warning: all sub-agents hit iteration limit ${Gn}\xD7 in a row${$.reset}`);let z={role:"user",content:`[SYSTEM WARNING] Sub-agents truncated ${Gn}\xD7 in a row. Stop spawning \u2014 try different approach or report findings.`};H.push(z),R.push(z)}else if(Gn>=w$){console.log(`${$.red} \u2716 Swarm abort: all sub-agents hit iteration limit ${Gn}\xD7 \u2014 aborting stuck swarm${$.reset}`),u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L,{suppressHint:!0}),Ze(H);return}}else U>0&&(Gn=0)}}for(let _ of rn)H.push(_),R.push(_);if(!ot)for(let _=0;_<rn.length;_++){if(!Se[_]||Se[_].fnName!=="ssh_exec")continue;let b=rn[_];if(!b||typeof b.content!="string")continue;let re=dl(b.content);if(re){ot=!0,kt=re.slice(0,120),dn=0,Qt=!1,vn=0,W(`${$.yellow} \u26A1 Root cause detected: ${kt} \u2014 fix phase (read budget: 3)${$.reset}`);let I={role:"user",content:`[SYSTEM] Root cause identified: ${kt}. Read only the file that needs fixing, then edit it. Do not read other files.`};H.push(I),R.push(I);break}}for(let _=0;_<rn.length;_++){let b=Se[_];if(!b)continue;let re=typeof rn[_]?.content=="string"?rn[_].content:"";if(b.fnName==="create_task"){let I=re.match(/Task #(\d+) created/),F=typeof b.args?.subject=="string"?b.args.subject:"";I&&F&&hr.set(I[1],F)}else if((b.fnName==="write_file"||b.fnName==="edit_file")&&!re.startsWith("BLOCKED:")&&re.trim().length>0){let F=(typeof b.args?.path=="string"?b.args.path:typeof b.args?.file_path=="string"?b.args.file_path:"").split("/").pop().toLowerCase(),ce=F.split(/[._\-/]/).filter(G=>G.length>2);for(let[G,we]of hr){if(gr.has(G))continue;let U=we.toLowerCase().split(/\W+/).filter(z=>z.length>3);ce.filter(z=>U.some(ee=>ee.includes(z)||z.includes(ee))).length>=1&&(gr.add(G),W(`${$.green} \u2714 Auto-matched task #${G} to ${F}: ${we.slice(0,60)}${$.reset}`))}}}{let _=pt();if(Zt(R,_).percentage>=78){let{messages:re,tokensRemoved:I}=un(R,_);I>0&&(R=re,console.log(`${$.dim} [auto-compressed \u2014 ~${I} tokens freed, now ${Math.round(Zt(R,_).percentage)}%]${$.reset}`))}}let xu=Uk();if(xu){let _={role:"user",content:`[User note mid-run]: ${xu}`};H.push(_),R.push(_),console.log(`${$.cyan} \u270E Context added${$.reset}`)}}if(Ve>=sn){if(u&&(u.stop(),u=null),l(null),Qe(x,E,A,T,L),Ze(H),$h(H),Te&&Xe==="plan"){let Es=[...H].reverse().find(ct=>ct.role==="assistant"),It=typeof Es?.content=="string"?Es.content:"",Ts=rr("implement",It);if(Ts){H.push(Ts),R=[{role:"system",content:await vl()},...H],sn=hs("implement"),W(`${$.yellow} \u26A0 Plan budget exhausted \u2014 auto-transitioning to implement${$.reset}`);continue e}}else if(Te&&Xe==="verify"){W(`${$.yellow} \u26A0 Verify budget exhausted \u2014 completing session${$.reset}`);break e}let{getActiveProviderName:Ae}=je();if(Ae()==="ollama"&&xa<hu){if(A.size===0&&!va){console.log(`${$.yellow} \u26A0 Max iterations reached with no progress. Stopping.${$.reset}`);break e}xa++,sn=20,console.log(`${$.dim} \u2500\u2500 auto-extending (+20 turns, ext ${xa}/${hu}) \u2500\u2500${$.reset}`);continue e}if(console.log(`
1207
+ ${$.yellow}\u26A0 Max iterations reached.${$.reset}`),await Oh(" Continue for 20 more turns?")){sn=20;continue e}console.log(`${$.dim} Tip: set "maxIterations" in .nex/config.json or use --max-turns${$.reset}`)}break e}}Dh.exports={processInput:Zk,clearConversation:Hk,getConversationLength:Gk,getConversationMessages:Yk,setConversationMessages:zk,setAbortSignalGetter:xk,setMaxIterations:_k,invalidateSystemPromptCache:$l,clearToolFilterCache:Ak,getCachedFilteredTools:Ph,buildSystemPrompt:vl,getProjectContextHash:Lh,buildUserContent:Mh,detectAndTruncateLoop:ml,injectMidRunNote:Fk,resetSessionTracking:jh}});var je=Q((AR,Wh)=>{var{OllamaProvider:Qk}=Zu(),{OpenAIProvider:eS}=nd(),{AnthropicProvider:tS}=id(),{GeminiProvider:nS}=ud(),{LocalProvider:sS}=pd(),{checkBudget:oS}=qs(),Nl={top:{ollama:"kimi-k2:1t",openai:"gpt-4.1",anthropic:"claude-sonnet-4-5",gemini:"gemini-2.5-pro"},strong:{ollama:"qwen3-coder:480b",openai:"gpt-4o",anthropic:"claude-sonnet",gemini:"gemini-2.5-flash"},fast:{ollama:"devstral-small-2:24b",openai:"gpt-4.1-mini",anthropic:"claude-haiku",gemini:"gemini-2.0-flash"}},Al=(process.env.OLLAMA_FALLBACK_CHAIN||"").split(",").map(t=>t.trim()).filter(Boolean),Fh={};for(let[t,e]of Object.entries(Nl))for(let n of Object.values(e))Fh[n]=t;function Ol(t,e){let n=Fh[t];return n&&Nl[n][e]||t}var rt={},St=null,Je=null,$r=[];function Wt(){if(Object.keys(rt).length>0)return;co("ollama",new Qk),co("openai",new eS),co("anthropic",new tS),co("gemini",new nS),co("local",new sS);let t=process.env.DEFAULT_PROVIDER||"ollama",e=process.env.DEFAULT_MODEL||null;rt[t]?(St=t,Je=e||rt[t].defaultModel):(St="ollama",Je="kimi-k2.5");let n=process.env.FALLBACK_CHAIN;n&&($r=n.split(",").map(o=>o.trim()).filter(Boolean))}function co(t,e){rt[t]=e}function rS(t){return Wt(),rt[t]||null}function Ml(){return Wt(),rt[St]||null}function iS(){return Wt(),St}function aS(){return Wt(),Je}function cS(){Wt();let t=Ml();if(!t)return{id:Je,name:Je,provider:St};let e=t.getModel(Je);return e?{...e,provider:St}:{id:Je,name:Je,provider:St}}function Uh(t){if(!t)return{provider:null,model:null};let e=t.indexOf(":");if(e>0){let n=t.slice(0,e);if(rt[n]||["ollama","openai","anthropic","gemini","local"].includes(n))return{provider:n,model:t.slice(e+1)}}return{provider:null,model:t}}function lS(t){Wt();let{provider:e,model:n}=Uh(t);if(e){let s=rt[e];return s&&(s.getModel(n)||e==="local"||e==="ollama")?(St=e,Je=n,oa(),!0):!1}let o=Ml();if(o&&o.getModel(n))return Je=n,oa(),!0;for(let[s,r]of Object.entries(rt))if(r.getModel(n))return St=s,Je=n,oa(),!0;return!1}function oa(){try{let{invalidateSystemPromptCache:t,clearToolFilterCache:e}=ve();t(),e()}catch{}try{let{invalidateTokenRatioCache:t}=Rt();t()}catch{}}function uS(){Wt();let t=new Set;for(let e of Object.values(rt))for(let n of e.getModelNames())t.add(n);return Array.from(t)}function dS(){return Wt(),Object.entries(rt).map(([t,e])=>({provider:t,configured:e.isConfigured(),models:Object.values(e.getModels()).map(n=>({...n,active:t===St&&n.id===Je}))}))}function fS(){Wt();let t=[];for(let[e,n]of Object.entries(rt)){let o=n.isConfigured();for(let s of Object.values(n.getModels()))t.push({spec:`${e}:${s.id}`,name:s.name,provider:e,configured:o})}return t}function pS(t){$r=Array.isArray(t)?t:[]}function mS(){return[...$r]}function qh(t){let e=t.message||"",n=t.code||"";return!!(e.includes("429")||e.includes("500")||e.includes("502")||e.includes("503")||e.includes("504")||n==="ECONNABORTED"||n==="ETIMEDOUT"||n==="ECONNREFUSED"||n==="ECONNRESET"||n==="EHOSTUNREACH"||n==="ENETUNREACH"||n==="EPIPE"||n==="ERR_SOCKET_CONNECTION_TIMEOUT"||e.includes("socket disconnected")||e.includes("TLS")||e.includes("ECONNRESET")||e.includes("ECONNABORTED")||e.includes("network")||e.includes("ETIMEDOUT"))}async function Bh(t){let e=[St,...$r.filter(r=>r!==St)],n,o=0,s=0;for(let r=0;r<e.length;r++){let i=e[r],c=rt[i];if(!c||!c.isConfigured())continue;s++;let l=oS(i);if(!l.allowed){o++,n=new Error(`Budget limit reached for ${i}: $${l.spent.toFixed(2)} / $${l.limit.toFixed(2)}`);continue}try{let u=r>0,d=u?Ol(Je,i):Je;return u&&d!==Je&&process.stderr.write(` [fallback: ${i}:${d}]
1208
1208
  `),await t(c,i,d)}catch(u){if(n=u,!qh(u)||r>=e.length-1)throw u;if(i==="ollama"&&Al.length>0){let d=isFallback?Ol(Je,i):Je;for(let f of Al)if(f!==d)try{return process.stderr.write(` [ollama fallback: ${f}]
1209
1209
  `),await t(c,i,f)}catch(p){if(n=p,!qh(p))throw p}}continue}}throw o>0&&o===s?new Error("All providers are over budget. Use /budget to check limits or /budget <provider> off to remove a limit."):s===0?new Error("No configured provider available"):n||new Error("No configured provider available")}async function hS(t,e,n={}){return Wt(),Bh((o,s,r)=>o.stream(t,e,{model:r,signal:n.signal,...n}))}async function gS(t,e,n={}){if(Wt(),n.provider){let o=rt[n.provider];if(!o||!o.isConfigured())throw new Error(`Provider '${n.provider}' is not available`);let s={model:n.model||Je,...n};try{return await o.chat(t,e,s)}catch(r){if(typeof o.stream=="function")try{return await o.stream(t,e,{...s,onToken:()=>{}})}catch{}throw r}}return Bh(async(o,s,r)=>{try{return await o.chat(t,e,{model:r,...n})}catch(i){if(typeof o.stream=="function")try{return await o.stream(t,e,{model:r,...n,onToken:()=>{}})}catch{}throw i}})}function $S(){Wt();let t=[];for(let[e,n]of Object.entries(rt))n.isConfigured()&&t.push({name:e,models:Object.values(n.getModels())});return t}function yS(){for(let t of Object.keys(rt))delete rt[t];St=null,Je=null,$r=[]}Wh.exports={registerProvider:co,getProvider:rS,getActiveProvider:Ml,getActiveProviderName:iS,getActiveModelId:aS,getActiveModel:cS,setActiveModel:lS,getModelNames:uS,parseModelSpec:Uh,listProviders:dS,listAllModels:fS,callStream:hS,callChat:gS,getConfiguredProviders:$S,setFallbackChain:pS,getFallbackChain:mS,resolveModelForProvider:Ol,MODEL_EQUIVALENTS:Nl,OLLAMA_FALLBACK_MODELS:Al,_reset:yS}});var Ll=Q((OR,Hh)=>{"use strict";var Sn=require("fs"),ra=require("path"),wS=require("readline"),Ee="\x1B[0m",ia="\x1B[1m",mt="\x1B[2m",aa="\x1B[33m",Pl="\x1B[36m",yr="\x1B[32m";function bS(t){return(e,n="")=>new Promise(o=>{let s=n?` ${mt}[${n}]${Ee}`:"";t.question(` ${Pl}${e}${s}${Ee}: `,r=>o(r.trim()||n))})}function wr(t,e){return new Promise(n=>{e&&e.pause(),process.stdout.write(` ${Pl}${t}${Ee}: `);let o=process.stdin,s=o.isRaw,r="";o.setRawMode(!0),o.resume(),o.setEncoding("utf8");let i=c=>{c==="\r"||c===`
1210
1210
  `?(o.setRawMode(s||!1),o.removeListener("data",i),process.stdout.write(`
@@ -1231,16 +1231,16 @@ ${aa} No key entered \u2014 cancelled.${Ee}
1231
1231
  `)),console.log(`
1232
1232
  ${yr} \u2713 Saved to ${u}${Ee}`),c.some(m=>m.includes("API_KEY"))&&console.log(`${mt} (key stored locally \u2014 never committed)${Ee}`)}if(process.env.DEFAULT_PROVIDER)try{let{setActiveModel:p}=je(),h=process.env.DEFAULT_MODEL?`${process.env.DEFAULT_PROVIDER}:${process.env.DEFAULT_MODEL}`:process.env.DEFAULT_PROVIDER;p(h),console.log(`${yr} \u2713 Switched to ${h} for this session${Ee}`)}catch{}console.log(`
1233
1233
  ${yr} \u2713 Setup complete!${Ee}
1234
- `)}Hh.exports={runSetupWizard:_S}});var zh=Q((NR,Yh)=>{"use strict";var ca=require("fs"),{T:en,isDark:xS}=Yn(),Mt="\x1B[0m",vS=!xS,kS=process.env.FOOTER_DEBUG==="1"||process.env.FOOTER_DEBUG==="2",SS=process.env.FOOTER_DEBUG==="2",lo=null;function Fn(...t){kS&&(lo||(lo=ca.openSync("/tmp/footer-debug.log","w")),ca.writeSync(lo,t.join(" ")+`
1234
+ `)}Hh.exports={runSetupWizard:_S}});var zh=Q((NR,Yh)=>{"use strict";var ca=require("fs"),{T:tn,isDark:xS}=Yn(),Mt="\x1B[0m",vS=!xS,kS=process.env.FOOTER_DEBUG==="1"||process.env.FOOTER_DEBUG==="2",SS=process.env.FOOTER_DEBUG==="2",lo=null;function Fn(...t){kS&&(lo||(lo=ca.openSync("/tmp/footer-debug.log","w")),ca.writeSync(lo,t.join(" ")+`
1235
1235
  `))}function Kh(t,e){if(!SS||typeof e!="string")return;lo||(lo=ca.openSync("/tmp/footer-debug.log","w"));let n=e.replace(/\x1b\[([^a-zA-Z]*)([a-zA-Z])/g,(o,s,r)=>`<ESC[${s}${r}>`).replace(/\x1b([^[])/g,(o,s)=>`<ESC${s}>`).replace(/\r/g,"<CR>").replace(/\n/g,`<LF>
1236
1236
  `).replace(/[\x00-\x08\x0b-\x1f\x7f]/g,o=>`<${o.charCodeAt(0).toString(16).padStart(2,"0")}>`);ca.writeSync(lo,`${t}: ${n}
1237
- `)}function Gh(t){return t.replace(/\x1b\[[^a-zA-Z]*[a-zA-Z]/g,"").length}var Il=class{constructor(){this._active=!1,this._rl=null,this._origWrite=null,this._origPrompt=null,this._origSetPr=null,this._origRefreshLine=null,this._origLog=null,this._origError=null,this._origStderrWrite=null,this._drawing=!1,this._offResize=null,this._cursorOnInputRow=!1,this._inRefreshLine=!1,this._lastOutputRow=1,this._prevTermRows=0,this._prevTermCols=0,this._consistencyTimer=null,this._dirty=!1,this._statusModel="",this._statusBranch="",this._statusProject="",this._statusMode=""}setStatusInfo({model:e,branch:n,project:o,mode:s}={}){e!==void 0&&(this._statusModel=e),n!==void 0&&(this._statusBranch=n),o!==void 0&&(this._statusProject=o),s!==void 0&&(this._statusMode=s),this._active&&this.drawFooter()}get _rows(){return process.stdout.rows||24}get _cols(){return process.stdout.columns||80}get _scrollEnd(){return this._rows-2}get _rowStatus(){return this._rows-1}get _rowInput(){return this._rows}_goto(e,n=1){return`\x1B[${e};${n}H`}_statusLine(){let e=this._cols,n=this._statusModel,o=this._statusBranch,s=this._statusProject,r=this._statusMode;if(!n)return en.footer_sep+"\u2500".repeat(e)+Mt;let i=` ${en.footer_divider}\xB7${Mt} `,c=[];n&&c.push(`${en.footer_model}${n}${Mt}`),o&&c.push(`${en.footer_branch}${o}${Mt}`),s&&c.push(`${en.footer_project}${s}${Mt}`);let l=c.join(i),u=[n,o,s].filter(Boolean).join(" \xB7 ").length,d="\u2500 ";if(r){let h=r.length,m=Math.max(0,e-d.length-u-1-1-h-3),g="\u2500".repeat(m);return`${en.footer_sep}${d}${Mt}${l}${en.footer_sep} ${g} ${Mt}${en.footer_mode}${r}${Mt}${en.footer_sep} \u2500\u2500${Mt}`}let f=Math.max(0,e-d.length-u-2),p="\u2500".repeat(f);return`${en.footer_sep}${d}${Mt}${l}${en.footer_sep} ${p}${Mt}`}drawFooter(e){!this._origWrite||this._drawing||(this._drawing=!0,this._origWrite("\x1B7"+this._goto(this._rowStatus)+"\x1B[2K"+this._statusLine(e)+"\x1B8"),this._drawing=!1)}_setScrollRegion(){if(vS)return;let e=Math.max(1,this._scrollEnd);this._origWrite(`\x1B[1;${e}r`)}_clearScrollRegion(){this._origWrite&&this._origWrite("\x1B[r")}_eraseStatus(){this._origWrite&&this._origWrite("\x1B7"+this._goto(this._rowStatus)+"\x1B[2K\x1B8")}rawWrite(e){return Kh("RAW",e),this._origWrite?this._origWrite(e):process.stdout.write(e)}_relayout(e){if(!this._origWrite)return;let n=this._origWrite,o=this._rows,s=this._cols,r=Math.max(1,o-2);Fn("RELAYOUT:",e,"rows="+o,"cols="+s,"scrollEnd="+r,"cursorOnInput="+this._cursorOnInputRow),this._prevTermRows=o,this._prevTermCols=s;let i=Math.min(this._lastOutputRow+1,r+1),c="";for(let l=i;l<=o;l++)c+=this._goto(l)+"\x1B[2K";n(c),this._setScrollRegion(),this._lastOutputRow=Math.min(this._lastOutputRow,r),this.drawFooter(),this._cursorOnInputRow&&this._rl&&this._rl.prompt(!0),this._dirty=!1}activate(e){if(!process.stdout.isTTY)return;this._rl=e,this._origWrite=process.stdout.write.bind(process.stdout),this._active=!0,this._prevTermRows=this._rows,this._prevTermCols=this._cols,this._origWrite("\x1B[r"),this._setScrollRegion(),this._lastOutputRow=1,this.drawFooter();let n=this,o=process.stdout.write.bind(process.stdout);this._origWrite=o,process.stdout.write=function(m,...g){if(Kh("PATCH",m),!n._active||typeof m!="string")return o(m,...g);if(n._inRefreshLine){let C=m.replace(/\n/g,"");return C?o(C,...g):!0}if(n._cursorOnInputRow){if(m.length<=4&&!m.includes(`
1237
+ `)}function Gh(t){return t.replace(/\x1b\[[^a-zA-Z]*[a-zA-Z]/g,"").length}var Il=class{constructor(){this._active=!1,this._rl=null,this._origWrite=null,this._origPrompt=null,this._origSetPr=null,this._origRefreshLine=null,this._origLog=null,this._origError=null,this._origStderrWrite=null,this._drawing=!1,this._offResize=null,this._cursorOnInputRow=!1,this._inRefreshLine=!1,this._lastOutputRow=1,this._prevTermRows=0,this._prevTermCols=0,this._consistencyTimer=null,this._dirty=!1,this._statusModel="",this._statusBranch="",this._statusProject="",this._statusMode=""}setStatusInfo({model:e,branch:n,project:o,mode:s}={}){e!==void 0&&(this._statusModel=e),n!==void 0&&(this._statusBranch=n),o!==void 0&&(this._statusProject=o),s!==void 0&&(this._statusMode=s),this._active&&this.drawFooter()}get _rows(){return process.stdout.rows||24}get _cols(){return process.stdout.columns||80}get _scrollEnd(){return this._rows-2}get _rowStatus(){return this._rows-1}get _rowInput(){return this._rows}_goto(e,n=1){return`\x1B[${e};${n}H`}_statusLine(){let e=this._cols,n=this._statusModel,o=this._statusBranch,s=this._statusProject,r=this._statusMode;if(!n)return tn.footer_sep+"\u2500".repeat(e)+Mt;let i=` ${tn.footer_divider}\xB7${Mt} `,c=[];n&&c.push(`${tn.footer_model}${n}${Mt}`),o&&c.push(`${tn.footer_branch}${o}${Mt}`),s&&c.push(`${tn.footer_project}${s}${Mt}`);let l=c.join(i),u=[n,o,s].filter(Boolean).join(" \xB7 ").length,d="\u2500 ";if(r){let h=r.length,m=Math.max(0,e-d.length-u-1-1-h-3),g="\u2500".repeat(m);return`${tn.footer_sep}${d}${Mt}${l}${tn.footer_sep} ${g} ${Mt}${tn.footer_mode}${r}${Mt}${tn.footer_sep} \u2500\u2500${Mt}`}let f=Math.max(0,e-d.length-u-2),p="\u2500".repeat(f);return`${tn.footer_sep}${d}${Mt}${l}${tn.footer_sep} ${p}${Mt}`}drawFooter(e){!this._origWrite||this._drawing||(this._drawing=!0,this._origWrite("\x1B7"+this._goto(this._rowStatus)+"\x1B[2K"+this._statusLine(e)+"\x1B8"),this._drawing=!1)}_setScrollRegion(){if(vS)return;let e=Math.max(1,this._scrollEnd);this._origWrite(`\x1B[1;${e}r`)}_clearScrollRegion(){this._origWrite&&this._origWrite("\x1B[r")}_eraseStatus(){this._origWrite&&this._origWrite("\x1B7"+this._goto(this._rowStatus)+"\x1B[2K\x1B8")}rawWrite(e){return Kh("RAW",e),this._origWrite?this._origWrite(e):process.stdout.write(e)}_relayout(e){if(!this._origWrite)return;let n=this._origWrite,o=this._rows,s=this._cols,r=Math.max(1,o-2);Fn("RELAYOUT:",e,"rows="+o,"cols="+s,"scrollEnd="+r,"cursorOnInput="+this._cursorOnInputRow),this._prevTermRows=o,this._prevTermCols=s;let i=Math.min(this._lastOutputRow+1,r+1),c="";for(let l=i;l<=o;l++)c+=this._goto(l)+"\x1B[2K";n(c),this._setScrollRegion(),this._lastOutputRow=Math.min(this._lastOutputRow,r),this.drawFooter(),this._cursorOnInputRow&&this._rl&&this._rl.prompt(!0),this._dirty=!1}activate(e){if(!process.stdout.isTTY)return;this._rl=e,this._origWrite=process.stdout.write.bind(process.stdout),this._active=!0,this._prevTermRows=this._rows,this._prevTermCols=this._cols,this._origWrite("\x1B[r"),this._setScrollRegion(),this._lastOutputRow=1,this.drawFooter();let n=this,o=process.stdout.write.bind(process.stdout);this._origWrite=o,process.stdout.write=function(m,...g){if(Kh("PATCH",m),!n._active||typeof m!="string")return o(m,...g);if(n._inRefreshLine){let C=m.replace(/\n/g,"");return C?o(C,...g):!0}if(n._cursorOnInputRow){if(m.length<=4&&!m.includes(`
1238
1238
  `)&&!m.includes("\r")&&!/[\x00-\x1f\x7f]/.test(m))return Fn("STDOUT: char intercept:",JSON.stringify(m)),n._origRefreshLine&&n._doRefreshLine(),!0;Fn("STDOUT: non-echo on input row, anchoring to workspace, data="+JSON.stringify(m).slice(0,100)),n._cursorOnInputRow=!1,o(n._goto(Math.min(n._lastOutputRow+1,n._scrollEnd)))}let y=n._cols||80,w=0,v=m.split(`
1239
1239
  `);for(let C=0;C<v.length;C++){let S=Gh(v[C]);S>0&&(w+=Math.floor((S-1)/y))}let M=v.length-1;return M+w>0&&(n._lastOutputRow=Math.min(n._lastOutputRow+M+w,n._scrollEnd)),o(m,...g)},this._cursorOnInputRow=!1,this._origStderrWrite=process.stderr.write.bind(process.stderr),process.stderr.write=function(m,...g){if(!n._active)return n._origStderrWrite(m,...g);if(typeof m=="string"&&m.includes("\r")){let w=Math.min(n._lastOutputRow+1,n._scrollEnd);if(n._cursorOnInputRow){n._origWrite("\x1B7"),n._origWrite(n._goto(w));let v=n._origStderrWrite(m,...g);return n._origWrite("\x1B8"),v}n._origWrite(n._goto(w))}let y=n._origStderrWrite(m,...g);return typeof m=="string"&&m.includes(`
1240
1240
  `)&&!/\x1b\[\d+A/.test(m)&&n._cursorOnInputRow&&(n.drawFooter(),n._origWrite(n._goto(n._rowInput)+"\x1B[2K")),y},this._origLog=console.log,this._origError=console.error;function s(...m){if(!n._active){n._origLog(...m);return}n._origWrite(n._goto(Math.min(n._lastOutputRow+1,n._scrollEnd))),n._cursorOnInputRow=!1,n._origLog(...m),n.drawFooter(),o(n._goto(n._rowInput)+"\x1B[2K"),n._cursorOnInputRow=!0}function r(...m){if(!n._active){n._origError(...m);return}n._origWrite(n._goto(Math.min(n._lastOutputRow+1,n._scrollEnd))),n._cursorOnInputRow=!1,n._origError(...m),n.drawFooter(),o(n._goto(n._rowInput)+"\x1B[2K"),n._cursorOnInputRow=!0}console.log=s,console.error=r,this._origSetPr=e.setPrompt.bind(e),e.setPrompt=function(m){n._origSetPr(m),n._active&&n.drawFooter(m)},this._origPrompt=e.prompt.bind(e),e.prompt=function(m){if(!n._active)return n._origPrompt(m);Fn("PROMPT: goto rowInput="+n._rowInput),e.prevRows=0,o(n._goto(n._rowInput)+Mt+"\x1B[2K"),n._cursorOnInputRow=!0,n._origPrompt(m)};let i=e.question.bind(e);e.question=function(m,g){if(!n._active)return i(m,g);o(n._goto(n._rowInput)+"\x1B[2K"),e.prevRows=0,n._cursorOnInputRow=!0,i(m,y=>{o(n._goto(n._rowInput)+"\x1B[2K"),n._cursorOnInputRow=!1,n.drawFooter(),g(y)})};let c=Object.getPrototypeOf(e),l=Object.getOwnPropertySymbols(c).find(m=>m.toString()==="Symbol(_refreshLine)"),u=l?c[l].bind(e):e._refreshLine?e._refreshLine.bind(e):null;if(this._origRefreshLine=u,this._doRefreshLine=function(){if(!n._active||!u)return;if(n._rows!==n._prevTermRows||n._cols!==n._prevTermCols){n._dirty=!0;return}e.prevRows=0,o(n._goto(n._rowInput)+Mt+"\x1B[2K");let m=n._cols,g=e._prompt||"",y=Gh(g),w=m-y-1;n._inRefreshLine=!0;try{if(e.line.length<=w){Fn("REFRESH: short line, len="+e.line.length),u();return}Fn("REFRESH: long line, len="+e.line.length+", max="+w);let v=e.line,M=e.cursor,C=Math.max(1,w-1),S=Math.max(0,M-C),O=(S>0?"\xAB":"")+v.slice(S,S+C+(S>0?0:1));e.line=O,e.cursor=O.length,u(),e.line=v,e.cursor=M}finally{n._inRefreshLine=!1}},u){let m=this._doRefreshLine;l&&Object.defineProperty(e,l,{value:m,writable:!0,configurable:!0}),e._refreshLine=m}e.on("line",()=>{n._active&&(Fn("LINE: leaving input row"),n._cursorOnInputRow=!1,o(n._goto(n._rowInput)+"\x1B[2K"),o(n._goto(Math.min(n._lastOutputRow+1,n._scrollEnd))),n.drawFooter())});let d=null,f=null,p=()=>{d=null,n._relayout("resize"),f&&clearTimeout(f),f=setTimeout(()=>{f=null,n._relayout("resize-cleanup")},300)},h=()=>{n._dirty=!0,d&&clearTimeout(d),d=setTimeout(p,80)};process.stdout.on("resize",h),this._offResize=()=>{process.stdout.off("resize",h),d&&(clearTimeout(d),d=null),f&&(clearTimeout(f),f=null)},this._consistencyTimer=setInterval(()=>{if(!n._active)return;let m=n._rows,g=n._cols;(n._dirty||m!==n._prevTermRows||g!==n._prevTermCols)&&(Fn("CONSISTENCY: dirty="+n._dirty+" rows="+m+"/"+n._prevTermRows+" cols="+g+"/"+n._prevTermCols),n._relayout("consistency"))},800)}deactivate(){if(this._active){if(this._active=!1,this._offResize&&(this._offResize(),this._offResize=null),this._consistencyTimer&&(clearInterval(this._consistencyTimer),this._consistencyTimer=null),this._origStderrWrite&&(process.stderr.write=this._origStderrWrite,this._origStderrWrite=null),this._origLog&&(console.log=this._origLog,this._origLog=null),this._origError&&(console.error=this._origError,this._origError=null),this._origWrite&&(process.stdout.write=this._origWrite),this._rl&&(this._origPrompt&&(this._rl.prompt=this._origPrompt,this._origPrompt=null),this._origSetPr&&(this._rl.setPrompt=this._origSetPr,this._origSetPr=null),this._origRefreshLine)){let e=Object.getOwnPropertySymbols(Object.getPrototypeOf(this._rl)).find(n=>n.toString()==="Symbol(_refreshLine)");e&&delete this._rl[e],delete this._rl._refreshLine,this._origRefreshLine=null}this._eraseStatus(),this._clearScrollRegion(),this._origWrite=null}}};Yh.exports={StickyFooter:Il}});var Vh=Q((MR,Jh)=>{var{C:We}=Fe(),{listProviders:ES,getActiveProviderName:TS,getActiveModelId:RS,setActiveModel:CS}=je();function Xh(t,e,n={}){let{title:o="Select",hint:s="\u2191\u2193 navigate \xB7 Enter select \xB7 Esc cancel"}=n;return new Promise(r=>{let i=e.map((w,v)=>w.isHeader?-1:v).filter(w=>w>=0);if(i.length===0){r(null);return}let c=e.findIndex(w=>w.isCurrent),l=c>=0?i.indexOf(c):0;l<0&&(l=0);let u=process.stdout.rows?Math.max(process.stdout.rows-6,5):20,d=0;function f(){let w=i[l];return w<d?d=w:w>=d+u&&(d=w-u+1),{start:d,end:Math.min(e.length,d+u)}}let p=0;function h(){if(p>0){process.stdout.write(`\x1B[${p}A`);for(let S=0;S<p;S++)process.stdout.write(`\x1B[2K
1241
1241
  `);process.stdout.write(`\x1B[${p}A`)}let w=[];w.push(` ${We.bold}${We.cyan}${o}${We.reset}`),w.push(` ${We.dim}${s}${We.reset}`),w.push("");let{start:v,end:M}=f();v>0&&w.push(` ${We.dim}\u2191 more${We.reset}`);for(let S=v;S<M;S++){let O=e[S];if(O.isHeader){w.push(` ${We.bold}${We.dim}${O.label}${We.reset}`);continue}let D=i[l]===S,K=D?`${We.cyan}> `:" ",V=O.isCurrent?` ${We.yellow}<current>${We.reset}`:"";D?w.push(`${K}${We.bold}${O.label}${We.reset}${V}`):w.push(`${K}${We.dim}${O.label}${We.reset}${V}`)}M<e.length&&w.push(` ${We.dim}\u2193 more${We.reset}`);let C=w.join(`
1242
1242
  `);process.stdout.write(C+`
1243
- `),p=w.length}t.pause();let m=process.stdin.isRaw;process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.resume();function g(){process.stdin.removeListener("keypress",y),process.stdin.isTTY&&m!==void 0&&process.stdin.setRawMode(m),t.resume()}function y(w,v){if(v){if(v.name==="up"||v.ctrl&&v.name==="p"){l>0&&(l--,h());return}if(v.name==="down"||v.ctrl&&v.name==="n"){l<i.length-1&&(l++,h());return}if(v.name==="return"){let M=e[i[l]];g(),r(M?M.value:null);return}if(v.name==="escape"||v.ctrl&&v.name==="c"){g(),r(null);return}}}process.stdin.on("keypress",y),h()})}async function AS(t){let e=ES(),n=TS(),o=RS(),s=[];for(let i of e)if(i.models.length!==0){s.push({label:i.provider,value:null,isHeader:!0});for(let c of i.models){let l=i.provider===n&&c.id===o;s.push({label:` ${c.name} (${i.provider}:${c.id})`,value:`${i.provider}:${c.id}`,isCurrent:l})}}let r=await Xh(t,s,{title:"Select Model"});return r?(CS(r),console.log(`${We.green}Switched to ${r}${We.reset}`),!0):(console.log(`${We.dim}Cancelled${We.reset}`),!1)}Jh.exports={pickFromList:Xh,showModelPicker:AS}});var Dl=Q((LR,rg)=>{var Zh=require("fs"),OS=require("path"),{atomicWrite:NS,withFileLockSync:MS}=An(),{callChat:Qh}=je(),{remember:PS,listMemories:PR,recall:LS}=cn(),jl=4,IS=`You are a memory optimization agent for an AI coding assistant called nex-code.
1243
+ `),p=w.length}t.pause();let m=process.stdin.isRaw;process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.resume();function g(){process.stdin.removeListener("keypress",y),process.stdin.isTTY&&m!==void 0&&process.stdin.setRawMode(m),t.resume()}function y(w,v){if(v){if(v.name==="up"||v.ctrl&&v.name==="p"){l>0&&(l--,h());return}if(v.name==="down"||v.ctrl&&v.name==="n"){l<i.length-1&&(l++,h());return}if(v.name==="return"){let M=e[i[l]];g(),r(M?M.value:null);return}if(v.name==="escape"||v.ctrl&&v.name==="c"){g(),r(null);return}}}process.stdin.on("keypress",y),h()})}async function AS(t){let e=ES(),n=TS(),o=RS(),s=[];for(let i of e)if(i.models.length!==0){s.push({label:i.provider,value:null,isHeader:!0});for(let c of i.models){let l=i.provider===n&&c.id===o;s.push({label:` ${c.name} (${i.provider}:${c.id})`,value:`${i.provider}:${c.id}`,isCurrent:l})}}let r=await Xh(t,s,{title:"Select Model"});return r?(CS(r),console.log(`${We.green}Switched to ${r}${We.reset}`),!0):(console.log(`${We.dim}Cancelled${We.reset}`),!1)}Jh.exports={pickFromList:Xh,showModelPicker:AS}});var Dl=Q((LR,rg)=>{var Zh=require("fs"),OS=require("path"),{atomicWrite:NS,withFileLockSync:MS}=An(),{callChat:Qh}=je(),{remember:PS,listMemories:PR,recall:LS}=ln(),jl=4,IS=`You are a memory optimization agent for an AI coding assistant called nex-code.
1244
1244
  Analyze this conversation history and extract actionable learnings the assistant should remember.
1245
1245
 
1246
1246
  Return ONLY valid JSON in this exact format:
@@ -1398,7 +1398,7 @@ Tools: ${d.toolsUsed.join(", ")}`}).join(`
1398
1398
  ${Pt.bold}${Pt.cyan}Orchestrator Model Benchmark${Pt.reset}
1399
1399
  `);let e=` ${"Model".padEnd(25)} ${"Decompose".padEnd(10)} ${"Synthesize".padEnd(11)} ${"Speed".padEnd(8)} ${"Score".padEnd(8)}`;console.log(`${Pt.dim}${e}${Pt.reset}`),console.log(` ${Pt.dim}${"\u2500".repeat(65)}${Pt.reset}`);for(let n of t){let o=t.indexOf(n)===0?"\u{1F947}":t.indexOf(n)===1?"\u{1F948}":t.indexOf(n)===2?"\u{1F949}":" ",s=`${(n.avgLatency/1e3).toFixed(1)}s`;console.log(`${o} ${n.model.padEnd(25)} ${(n.decompose+"/10").padEnd(10)} ${(n.synthesize+"/10").padEnd(11)} ${s.padEnd(8)} ${Pt.bold}${n.overall}/10${Pt.reset}`)}t.length>0&&(console.log(`
1400
1400
  ${Pt.green}Best orchestrator: ${t[0].model} (${t[0].overall}/10)${Pt.reset}`),console.log(` ${Pt.dim}Saved to ${ga}${Pt.reset}
1401
- `))}jg.exports={runOrchestratorBenchmark:jE,ORCHESTRATOR_SCENARIOS:Mg,scoreDecompose:Pg,scoreSynthesize:Lg,runScenario:Ig,printResults:DE,RESULTS_PATH:ga}});var Ug=Q((WR,Fg)=>{var qE=require("axios"),_r=require("fs"),qg=require("path"),FE="nex-code",Xl=qg.join(process.cwd(),".nex"),Jl=qg.join(Xl,"last-version-check");_r.existsSync(Xl)||_r.mkdirSync(Xl,{recursive:!0});async function UE(){try{let t=WE(),e=Date.now();if(t&&e-t<1440*60*1e3)return{hasNewVersion:!1};HE(e);let n=BE(),s=(await qE.get(`https://registry.npmjs.org/${FE}/latest`,{timeout:5e3})).data.version,r=KE(s,n);return{hasNewVersion:r,latestVersion:r?s:void 0,currentVersion:r?n:void 0}}catch{return{hasNewVersion:!1}}}function BE(){return As().version}function WE(){try{if(_r.existsSync(Jl)){let t=_r.readFileSync(Jl,"utf8");return parseInt(t,10)}}catch{}return null}function HE(t){try{_r.writeFileSync(Jl,t.toString())}catch{}}function KE(t,e){try{let n=t.split(".").map(Number),o=e.split(".").map(Number);return n[0]>o[0]?!0:n[0]<o[0]?!1:n[1]>o[1]?!0:n[1]<o[1]?!1:n[2]>o[2]}catch{return!1}}Fg.exports={checkForNewVersion:UE}});var ru=Q((KR,Zg)=>{var GE=require("readline"),at=require("fs"),et=require("path"),{C:a,banner:YE,cleanupTerminal:Bg}=Fe(),{isDark:zE}=Yn(),{listProviders:Ql,getActiveProviderName:ks,listAllModels:HR,setFallbackChain:XE,getFallbackChain:JE,getProvider:VE}=je(),{flushAutoSave:Wg}=Jt(),{getActiveModel:En,setActiveModel:eu}=Fs(),{printContext:Hg}=Ni(),{loadAllSkills:ZE,getSkillCommands:ya,handleSkillCommand:QE}=Mn(),{setReadlineInterface:eT,setAutoConfirm:tT,getAutoConfirm:Vl,setAllowAlwaysHandler:nT}=ft(),{StickyFooter:sT}=zh(),Ht=process.cwd(),Le=null,tn=null;function Kg(){return tn?.signal??null}var Sr=[{cmd:"/help",desc:"Show full help"},{cmd:"/model",desc:"Show/switch model"},{cmd:"/providers",desc:"List providers and models"},{cmd:"/fallback",desc:"Show/set fallback chain"},{cmd:"/tokens",desc:"Token usage and context budget"},{cmd:"/costs",desc:"Session token costs"},{cmd:"/budget",desc:"Show/set cost limits per provider"},{cmd:"/clear",desc:"Clear conversation"},{cmd:"/context",desc:"Show project context"},{cmd:"/tree [depth]",desc:"Show project file tree (default depth 3)"},{cmd:"/autoconfirm",desc:"Toggle auto-confirm"},{cmd:"/save",desc:"Save session"},{cmd:"/load",desc:"Load a saved session"},{cmd:"/sessions",desc:"List saved sessions"},{cmd:"/resume",desc:"Resume last session"},{cmd:"/branches",desc:"Show session tree (all branches)"},{cmd:"/timeline",desc:"Show message timeline of current branch"},{cmd:"/goto <index>",desc:"Jump to a message index (truncates after)"},{cmd:"/fork [index]",desc:"Create branch at index (default: current)"},{cmd:"/switch-branch <name>",desc:"Switch to a different conversation branch"},{cmd:"/delete-branch <name>",desc:"Delete a conversation branch"},{cmd:"/remember",desc:"Save a memory"},{cmd:"/forget",desc:"Delete a memory"},{cmd:"/memory",desc:"Show all memories"},{cmd:"/brain",desc:"Manage knowledge base"},{cmd:"/brain add",desc:"Add document: /brain add <name> [content]"},{cmd:"/brain list",desc:"List all brain documents"},{cmd:"/brain search",desc:"Search brain: /brain search <query>"},{cmd:"/brain show",desc:"Show document: /brain show <name>"},{cmd:"/brain remove",desc:"Remove document: /brain remove <name>"},{cmd:"/brain rebuild",desc:"Rebuild keyword index"},{cmd:"/brain embed",desc:"Build/rebuild embedding index"},{cmd:"/brain status",desc:"Show brain status (docs, index, embeddings)"},{cmd:"/brain review",desc:"Review pending brain changes (git diff)"},{cmd:"/brain undo",desc:"Undo last brain write"},{cmd:"/learn",desc:"Reflect on session and update memory"},{cmd:"/optimize",desc:"Show optimization opportunities"},{cmd:"/permissions",desc:"Show tool permissions"},{cmd:"/allow",desc:"Auto-allow a tool"},{cmd:"/deny",desc:"Block a tool"},{cmd:"/plan",desc:"Plan mode (analyze before executing)"},{cmd:"/plan edit",desc:"Open current plan in $EDITOR"},{cmd:"/plans",desc:"List saved plans"},{cmd:"/auto",desc:"Set autonomy level"},{cmd:"/commit",desc:"Smart commit (diff + message)"},{cmd:"/diff",desc:"Show current diff"},{cmd:"/review [--strict] [file]",desc:"Deep code review with score table and diff suggestions (--strict: force \u22653 critical findings)"},{cmd:"/branch",desc:"Create feature branch"},{cmd:"/mcp",desc:"MCP servers and tools"},{cmd:"/mcp list",desc:"List connected MCP servers and their tools"},{cmd:"/mcp status",desc:"Show which MCP servers are running"},{cmd:"/hooks",desc:"Show configured hooks"},{cmd:"/skills",desc:"List, enable, disable skills"},{cmd:"/install-skill <url>",desc:"Install a skill from git URL or user/repo"},{cmd:"/search-skill <query>",desc:"Search for skills on GitHub"},{cmd:"/remove-skill <name>",desc:"Remove an installed skill"},{cmd:"/tasks",desc:"Show task list"},{cmd:"/servers",desc:"List server profiles / ping"},{cmd:"/docker",desc:"List containers across all servers"},{cmd:"/deploy",desc:"List deploy configs / run named deploy"},{cmd:"/benchmark [--quick] [--models=a,b]",desc:"Rank Ollama Cloud models on nex-code tool-calling tasks (--history for nightly log)"},{cmd:"/bench [--dry-run] [--model=<spec>]",desc:"Run Jarvis scenario benchmark (5 agentic tasks)"},{cmd:"/trend [n]",desc:"Show score history trend (default: last 10 sessions)"},{cmd:"/init",desc:"Interactive setup wizard (.nex/)"},{cmd:"/setup",desc:"Configure provider and API keys"},{cmd:"/retry [--model <id>]",desc:"Retry last user turn (optionally with a different model)"},{cmd:"/undo",desc:"Undo last file change"},{cmd:"/redo",desc:"Redo last undone change"},{cmd:"/history",desc:"Show file change history"},{cmd:"/snapshot [name]",desc:"Create a named git snapshot of current changes"},{cmd:"/restore [name|last]",desc:"Restore a previously created snapshot"},{cmd:"/orchestrate <prompt>",desc:"Decompose prompt into parallel sub-tasks, run, synthesize"},{cmd:"/bench-orchestrator",desc:"Benchmark models for orchestrator role"},{cmd:"/audit",desc:"Show tool execution audit log"},{cmd:"/k8s",desc:"Kubernetes overview: namespaces and pods"},{cmd:"/exit",desc:"Quit"}];function Gg(){let t=ya(),e=[...Sr,...t],n=Math.max(...e.map(o=>o.cmd.length));console.log("");for(let{cmd:o,desc:s}of Sr)console.log(` ${a.cyan}${o.padEnd(n+2)}${a.reset}${a.dim}${s}${a.reset}`);for(let{cmd:o,desc:s}of t)console.log(` ${a.cyan}${o.padEnd(n+2)}${a.reset}${a.dim}${s} ${a.yellow}[skill]${a.reset}`);console.log(`
1401
+ `))}jg.exports={runOrchestratorBenchmark:jE,ORCHESTRATOR_SCENARIOS:Mg,scoreDecompose:Pg,scoreSynthesize:Lg,runScenario:Ig,printResults:DE,RESULTS_PATH:ga}});var Ug=Q((WR,Fg)=>{var qE=require("axios"),_r=require("fs"),qg=require("path"),FE="nex-code",Xl=qg.join(process.cwd(),".nex"),Jl=qg.join(Xl,"last-version-check");_r.existsSync(Xl)||_r.mkdirSync(Xl,{recursive:!0});async function UE(){try{let t=WE(),e=Date.now();if(t&&e-t<1440*60*1e3)return{hasNewVersion:!1};HE(e);let n=BE(),s=(await qE.get(`https://registry.npmjs.org/${FE}/latest`,{timeout:5e3})).data.version,r=KE(s,n);return{hasNewVersion:r,latestVersion:r?s:void 0,currentVersion:r?n:void 0}}catch{return{hasNewVersion:!1}}}function BE(){return As().version}function WE(){try{if(_r.existsSync(Jl)){let t=_r.readFileSync(Jl,"utf8");return parseInt(t,10)}}catch{}return null}function HE(t){try{_r.writeFileSync(Jl,t.toString())}catch{}}function KE(t,e){try{let n=t.split(".").map(Number),o=e.split(".").map(Number);return n[0]>o[0]?!0:n[0]<o[0]?!1:n[1]>o[1]?!0:n[1]<o[1]?!1:n[2]>o[2]}catch{return!1}}Fg.exports={checkForNewVersion:UE}});var ru=Q((KR,Zg)=>{var GE=require("readline"),at=require("fs"),et=require("path"),{C:a,banner:YE,cleanupTerminal:Bg}=Fe(),{isDark:zE}=Yn(),{listProviders:Ql,getActiveProviderName:ks,listAllModels:HR,setFallbackChain:XE,getFallbackChain:JE,getProvider:VE}=je(),{flushAutoSave:Wg}=Jt(),{getActiveModel:En,setActiveModel:eu}=Fs(),{printContext:Hg}=Ni(),{loadAllSkills:ZE,getSkillCommands:ya,handleSkillCommand:QE}=Mn(),{setReadlineInterface:eT,setAutoConfirm:tT,getAutoConfirm:Vl,setAllowAlwaysHandler:nT}=ft(),{StickyFooter:sT}=zh(),Ht=process.cwd(),Le=null,nn=null;function Kg(){return nn?.signal??null}var Sr=[{cmd:"/help",desc:"Show full help"},{cmd:"/model",desc:"Show/switch model"},{cmd:"/providers",desc:"List providers and models"},{cmd:"/fallback",desc:"Show/set fallback chain"},{cmd:"/tokens",desc:"Token usage and context budget"},{cmd:"/costs",desc:"Session token costs"},{cmd:"/budget",desc:"Show/set cost limits per provider"},{cmd:"/clear",desc:"Clear conversation"},{cmd:"/context",desc:"Show project context"},{cmd:"/tree [depth]",desc:"Show project file tree (default depth 3)"},{cmd:"/autoconfirm",desc:"Toggle auto-confirm"},{cmd:"/save",desc:"Save session"},{cmd:"/load",desc:"Load a saved session"},{cmd:"/sessions",desc:"List saved sessions"},{cmd:"/resume",desc:"Resume last session"},{cmd:"/branches",desc:"Show session tree (all branches)"},{cmd:"/timeline",desc:"Show message timeline of current branch"},{cmd:"/goto <index>",desc:"Jump to a message index (truncates after)"},{cmd:"/fork [index]",desc:"Create branch at index (default: current)"},{cmd:"/switch-branch <name>",desc:"Switch to a different conversation branch"},{cmd:"/delete-branch <name>",desc:"Delete a conversation branch"},{cmd:"/remember",desc:"Save a memory"},{cmd:"/forget",desc:"Delete a memory"},{cmd:"/memory",desc:"Show all memories"},{cmd:"/brain",desc:"Manage knowledge base"},{cmd:"/brain add",desc:"Add document: /brain add <name> [content]"},{cmd:"/brain list",desc:"List all brain documents"},{cmd:"/brain search",desc:"Search brain: /brain search <query>"},{cmd:"/brain show",desc:"Show document: /brain show <name>"},{cmd:"/brain remove",desc:"Remove document: /brain remove <name>"},{cmd:"/brain rebuild",desc:"Rebuild keyword index"},{cmd:"/brain embed",desc:"Build/rebuild embedding index"},{cmd:"/brain status",desc:"Show brain status (docs, index, embeddings)"},{cmd:"/brain review",desc:"Review pending brain changes (git diff)"},{cmd:"/brain undo",desc:"Undo last brain write"},{cmd:"/learn",desc:"Reflect on session and update memory"},{cmd:"/optimize",desc:"Show optimization opportunities"},{cmd:"/permissions",desc:"Show tool permissions"},{cmd:"/allow",desc:"Auto-allow a tool"},{cmd:"/deny",desc:"Block a tool"},{cmd:"/plan",desc:"Plan mode (analyze before executing)"},{cmd:"/plan edit",desc:"Open current plan in $EDITOR"},{cmd:"/plans",desc:"List saved plans"},{cmd:"/auto",desc:"Set autonomy level"},{cmd:"/commit",desc:"Smart commit (diff + message)"},{cmd:"/diff",desc:"Show current diff"},{cmd:"/review [--strict] [file]",desc:"Deep code review with score table and diff suggestions (--strict: force \u22653 critical findings)"},{cmd:"/branch",desc:"Create feature branch"},{cmd:"/mcp",desc:"MCP servers and tools"},{cmd:"/mcp list",desc:"List connected MCP servers and their tools"},{cmd:"/mcp status",desc:"Show which MCP servers are running"},{cmd:"/hooks",desc:"Show configured hooks"},{cmd:"/skills",desc:"List, enable, disable skills"},{cmd:"/install-skill <url>",desc:"Install a skill from git URL or user/repo"},{cmd:"/search-skill <query>",desc:"Search for skills on GitHub"},{cmd:"/remove-skill <name>",desc:"Remove an installed skill"},{cmd:"/tasks",desc:"Show task list"},{cmd:"/servers",desc:"List server profiles / ping"},{cmd:"/docker",desc:"List containers across all servers"},{cmd:"/deploy",desc:"List deploy configs / run named deploy"},{cmd:"/benchmark [--quick] [--models=a,b]",desc:"Rank Ollama Cloud models on nex-code tool-calling tasks (--history for nightly log)"},{cmd:"/bench [--dry-run] [--model=<spec>]",desc:"Run Jarvis scenario benchmark (5 agentic tasks)"},{cmd:"/trend [n]",desc:"Show score history trend (default: last 10 sessions)"},{cmd:"/init",desc:"Interactive setup wizard (.nex/)"},{cmd:"/setup",desc:"Configure provider and API keys"},{cmd:"/retry [--model <id>]",desc:"Retry last user turn (optionally with a different model)"},{cmd:"/undo",desc:"Undo last file change"},{cmd:"/redo",desc:"Redo last undone change"},{cmd:"/history",desc:"Show file change history"},{cmd:"/snapshot [name]",desc:"Create a named git snapshot of current changes"},{cmd:"/restore [name|last]",desc:"Restore a previously created snapshot"},{cmd:"/orchestrate <prompt>",desc:"Decompose prompt into parallel sub-tasks, run, synthesize"},{cmd:"/bench-orchestrator",desc:"Benchmark models for orchestrator role"},{cmd:"/audit",desc:"Show tool execution audit log"},{cmd:"/k8s",desc:"Kubernetes overview: namespaces and pods"},{cmd:"/exit",desc:"Quit"}];function Gg(){let t=ya(),e=[...Sr,...t],n=Math.max(...e.map(o=>o.cmd.length));console.log("");for(let{cmd:o,desc:s}of Sr)console.log(` ${a.cyan}${o.padEnd(n+2)}${a.reset}${a.dim}${s}${a.reset}`);for(let{cmd:o,desc:s}of t)console.log(` ${a.cyan}${o.padEnd(n+2)}${a.reset}${a.dim}${s} ${a.yellow}[skill]${a.reset}`);console.log(`
1402
1402
  ${a.dim}Type /help for detailed usage${a.reset}
1403
1403
  `)}function Yg(t){try{let e,n;t.endsWith("/")||t.endsWith(et.sep)?(e=t,n=""):(e=et.dirname(t),n=et.basename(t)),e.startsWith("~")&&(e=et.join(require("os").homedir(),e.slice(1)));let o=et.isAbsolute(e)?e:et.resolve(Ht,e);if(!at.existsSync(o)||!at.statSync(o).isDirectory())return[];let s=at.readdirSync(o,{withFileTypes:!0}),r=[];for(let i of s){if(i.name.startsWith(".")||i.name==="node_modules"||n&&!i.name.startsWith(n))continue;let c=t.endsWith("/")||t.endsWith(et.sep)?t:et.dirname(t)+"/",l=c==="./"&&!t.startsWith("./")?i.name:c+i.name;r.push(i.isDirectory()?l+"/":l)}return r}catch{return[]}}function zg(t){if(t.startsWith("/")){let o=[...Sr,...ya()],s=o.map(r=>r.cmd).filter(r=>r.startsWith(t));return[s.length?s:o.map(r=>r.cmd),t]}let e=t.split(/\s+/),n=e[e.length-1]||"";return n&&(n.includes("/")||n.startsWith("./")||n.startsWith("../")||n.startsWith("~"))?[Yg(n),n]:[[],t]}function Xg(){console.log(`
1404
1404
  ${a.bold}${a.cyan}Commands:${a.reset}
@@ -1474,20 +1474,20 @@ ${a.bold}${a.cyan}Undo / Redo:${a.reset}
1474
1474
 
1475
1475
  ${a.cyan}/exit${a.reset} ${a.dim}Quit${a.reset}
1476
1476
  `)}function Jg(t){let n=Math.round(t/100*30),o=30-n;return` ${t>80?a.red:t>50?a.yellow:a.green}${"\u2588".repeat(n)}${a.dim}${"\u2591".repeat(o)}${a.reset} ${t}%`}function Zl(){let t=Ql(),e=ks(),n=En();console.log(`
1477
- ${a.bold}${a.cyan}Providers:${a.reset}`);for(let o of t){let s=o.provider===e,r=o.configured?`${a.green}\u2713${a.reset}`:`${a.red}\u2717${a.reset}`,i=s?` ${a.cyan}(active)${a.reset}`:"";console.log(` ${r} ${a.bold}${o.provider}${a.reset}${i}`);for(let c of o.models){let l=c.id===n.id&&s?` ${a.yellow}\u25C4${a.reset}`:"";console.log(` ${a.dim}${c.id}${a.reset} \u2014 ${c.name}${l}`)}}console.log()}async function kr(t,e){let[n,...o]=t.split(/\s+/);switch(n){case"/help":return Xg(),!0;case"/model":{let s=o.join(" ").trim();if(!s){if(e){let{showModelPicker:r}=Vh();await r(e)}else{let r=En(),i=ks();console.log(`${a.bold}${a.cyan}Active model:${a.reset} ${a.dim}${i}:${r.id} (${r.name})${a.reset}`),console.log(`${a.gray}Use /model <provider:model> to switch. /providers to see all.${a.reset}`)}return!0}if(s==="list")return Zl(),!0;if(eu(s)){let r=En(),i=ks();console.log(`${a.green}Switched to ${i}:${r.id} (${r.name})${a.reset}`)}else console.log(`${a.red}Unknown model: ${s}${a.reset}`),console.log(`${a.gray}Use /providers to see available models${a.reset}`);return!0}case"/providers":return Zl(),!0;case"/fallback":{let s=o.join(" ").trim();if(!s){let i=JE();return i.length===0?(console.log(`${a.dim}No fallback chain configured${a.reset}`),console.log(`${a.dim}Use /fallback anthropic,openai,local to set${a.reset}`)):console.log(`${a.bold}${a.cyan}Fallback chain:${a.reset} ${i.join(" \u2192 ")}`),!0}let r=s.split(",").map(i=>i.trim()).filter(Boolean);return XE(r),console.log(`${a.green}Fallback chain: ${r.join(" \u2192 ")}${a.reset}`),!0}case"/tokens":{let{getConversationMessages:s}=Se(),{getUsage:r}=Rt(),{TOOL_DEFINITIONS:i}=Gt(),c=s(),l=r(c,i),u=En(),d=ks();console.log(`
1477
+ ${a.bold}${a.cyan}Providers:${a.reset}`);for(let o of t){let s=o.provider===e,r=o.configured?`${a.green}\u2713${a.reset}`:`${a.red}\u2717${a.reset}`,i=s?` ${a.cyan}(active)${a.reset}`:"";console.log(` ${r} ${a.bold}${o.provider}${a.reset}${i}`);for(let c of o.models){let l=c.id===n.id&&s?` ${a.yellow}\u25C4${a.reset}`:"";console.log(` ${a.dim}${c.id}${a.reset} \u2014 ${c.name}${l}`)}}console.log()}async function kr(t,e){let[n,...o]=t.split(/\s+/);switch(n){case"/help":return Xg(),!0;case"/model":{let s=o.join(" ").trim();if(!s){if(e){let{showModelPicker:r}=Vh();await r(e)}else{let r=En(),i=ks();console.log(`${a.bold}${a.cyan}Active model:${a.reset} ${a.dim}${i}:${r.id} (${r.name})${a.reset}`),console.log(`${a.gray}Use /model <provider:model> to switch. /providers to see all.${a.reset}`)}return!0}if(s==="list")return Zl(),!0;if(eu(s)){let r=En(),i=ks();console.log(`${a.green}Switched to ${i}:${r.id} (${r.name})${a.reset}`)}else console.log(`${a.red}Unknown model: ${s}${a.reset}`),console.log(`${a.gray}Use /providers to see available models${a.reset}`);return!0}case"/providers":return Zl(),!0;case"/fallback":{let s=o.join(" ").trim();if(!s){let i=JE();return i.length===0?(console.log(`${a.dim}No fallback chain configured${a.reset}`),console.log(`${a.dim}Use /fallback anthropic,openai,local to set${a.reset}`)):console.log(`${a.bold}${a.cyan}Fallback chain:${a.reset} ${i.join(" \u2192 ")}`),!0}let r=s.split(",").map(i=>i.trim()).filter(Boolean);return XE(r),console.log(`${a.green}Fallback chain: ${r.join(" \u2192 ")}${a.reset}`),!0}case"/tokens":{let{getConversationMessages:s}=ve(),{getUsage:r}=Rt(),{TOOL_DEFINITIONS:i}=Gt(),c=s(),l=r(c,i),u=En(),d=ks();console.log(`
1478
1478
  ${a.bold}${a.cyan}Token Usage:${a.reset}`),console.log(` ${a.dim}Model:${a.reset} ${d}:${u.id} (${(l.limit/1e3).toFixed(0)}k context)`),console.log(` ${a.dim}Used:${a.reset} ${l.used.toLocaleString()} / ${l.limit.toLocaleString()} (${l.percentage}%)`);let f=Jg(l.percentage);return console.log(` ${f}`),console.log(`
1479
1479
  ${a.dim}Breakdown:${a.reset}`),console.log(` System prompt: ${l.breakdown.system.toLocaleString()} tokens`),console.log(` Conversation: ${l.breakdown.conversation.toLocaleString()} tokens`),console.log(` Tool results: ${l.breakdown.toolResults.toLocaleString()} tokens`),console.log(` Tool definitions: ${l.breakdown.toolDefinitions.toLocaleString()} tokens`),console.log(` Messages: ${l.messageCount}`),console.log(),!0}case"/costs":{let{formatCosts:s,resetCosts:r}=qs();return o.join(" ").trim()==="reset"?(r(),console.log(`${a.green}Cost tracking reset${a.reset}`),!0):(console.log(`
1480
1480
  ${s()}
1481
1481
  `),!0)}case"/budget":{let{getCostLimits:s,getProviderSpend:r,checkBudget:i,removeCostLimit:c,saveCostLimits:l,setCostLimit:u}=qs(),d=o[0];if(!d){let h=s(),m=Ql();console.log(`
1482
- ${a.bold}${a.cyan}Cost Limits:${a.reset}`);let g=!1;for(let y of m){let w=r(y.provider),v=h[y.provider];if(v!==void 0){g=!0;let M=Math.min(100,Math.round(w/v*100)),C=10,S=Math.round(M/100*C),O=C-S,K=`${M>=100?a.red:M>=80?a.yellow:a.green}${"\u2588".repeat(S)}${a.dim}${"\u2591".repeat(O)}${a.reset}`;console.log(` ${a.bold}${y.provider}:${a.reset} $${w.toFixed(2)} / $${v.toFixed(2)} (${M}%) ${K}`)}else y.provider==="ollama"||y.provider==="local"?console.log(` ${a.bold}${y.provider}:${a.reset} ${a.dim}free (no limit)${a.reset}`):w>0&&console.log(` ${a.bold}${y.provider}:${a.reset} $${w.toFixed(2)} ${a.dim}(no limit)${a.reset}`)}return g||console.log(` ${a.dim}No limits set. Use /budget <provider> <amount> to set one.${a.reset}`),console.log(),!0}let f=o[1];if(!f){let h=i(d);return h.limit!==null?console.log(`${a.bold}${d}:${a.reset} $${h.spent.toFixed(2)} / $${h.limit.toFixed(2)} ($${h.remaining.toFixed(2)} remaining)`):console.log(`${a.bold}${d}:${a.reset} $${h.spent.toFixed(2)} ${a.dim}(no limit)${a.reset}`),!0}if(f==="off"||f==="remove"||f==="clear")return c(d),l(),console.log(`${a.green}Removed cost limit for ${d}${a.reset}`),!0;let p=parseFloat(f);return isNaN(p)||p<=0?(console.log(`${a.red}Invalid amount: ${f}. Use a positive number or 'off'.${a.reset}`),!0):(u(d,p),l(),console.log(`${a.green}Set ${d} budget limit: $${p.toFixed(2)}${a.reset}`),!0)}case"/clear":{let{clearConversation:s,getConversationMessages:r}=Se(),{clearHistory:i}=yn(),c=r();if(c.filter(d=>d.role==="user").length>=4){process.stdout.write(`${a.dim}Reflecting on session...${a.reset} `);let{learnFromSession:d}=Dl();d(c).then(f=>{if(!f.skipped&&!f.error&&(f.applied.length>0||f.nexAdded.length>0)){let p=f.applied.length+f.nexAdded.length;process.stdout.write(`${a.green}${p} learning(s) saved${a.reset}
1482
+ ${a.bold}${a.cyan}Cost Limits:${a.reset}`);let g=!1;for(let y of m){let w=r(y.provider),v=h[y.provider];if(v!==void 0){g=!0;let M=Math.min(100,Math.round(w/v*100)),C=10,S=Math.round(M/100*C),O=C-S,K=`${M>=100?a.red:M>=80?a.yellow:a.green}${"\u2588".repeat(S)}${a.dim}${"\u2591".repeat(O)}${a.reset}`;console.log(` ${a.bold}${y.provider}:${a.reset} $${w.toFixed(2)} / $${v.toFixed(2)} (${M}%) ${K}`)}else y.provider==="ollama"||y.provider==="local"?console.log(` ${a.bold}${y.provider}:${a.reset} ${a.dim}free (no limit)${a.reset}`):w>0&&console.log(` ${a.bold}${y.provider}:${a.reset} $${w.toFixed(2)} ${a.dim}(no limit)${a.reset}`)}return g||console.log(` ${a.dim}No limits set. Use /budget <provider> <amount> to set one.${a.reset}`),console.log(),!0}let f=o[1];if(!f){let h=i(d);return h.limit!==null?console.log(`${a.bold}${d}:${a.reset} $${h.spent.toFixed(2)} / $${h.limit.toFixed(2)} ($${h.remaining.toFixed(2)} remaining)`):console.log(`${a.bold}${d}:${a.reset} $${h.spent.toFixed(2)} ${a.dim}(no limit)${a.reset}`),!0}if(f==="off"||f==="remove"||f==="clear")return c(d),l(),console.log(`${a.green}Removed cost limit for ${d}${a.reset}`),!0;let p=parseFloat(f);return isNaN(p)||p<=0?(console.log(`${a.red}Invalid amount: ${f}. Use a positive number or 'off'.${a.reset}`),!0):(u(d,p),l(),console.log(`${a.green}Set ${d} budget limit: $${p.toFixed(2)}${a.reset}`),!0)}case"/clear":{let{clearConversation:s,getConversationMessages:r}=ve(),{clearHistory:i}=yn(),c=r();if(c.filter(d=>d.role==="user").length>=4){process.stdout.write(`${a.dim}Reflecting on session...${a.reset} `);let{learnFromSession:d}=Dl();d(c).then(f=>{if(!f.skipped&&!f.error&&(f.applied.length>0||f.nexAdded.length>0)){let p=f.applied.length+f.nexAdded.length;process.stdout.write(`${a.green}${p} learning(s) saved${a.reset}
1483
1483
  `)}else process.stdout.write(`${a.dim}nothing new${a.reset}
1484
1484
  `)}).catch(()=>process.stdout.write(`
1485
- `))}s(),i(),Le=null;let{deleteSession:u}=Jt();return u("_autosave"),console.log(`${a.green}Conversation cleared${a.reset}`),!0}case"/retry":{let{getConversationMessages:s,setConversationMessages:r,processInput:i}=Se(),c=s(),l=c.map(g=>g.role).lastIndexOf("user");if(l===-1)return console.log(`${a.yellow}Nothing to retry \u2014 no user message found.${a.reset}`),!0;let u=o.indexOf("--model"),d=u!==-1&&o[u+1]?o[u+1]:null;if(d){let{setActiveModel:g}=je();if(!g(d))return console.log(`${a.red}Unknown model: ${d}. Use /providers to see available models.${a.reset}`),!0;console.log(`${a.cyan}Switched to model: ${d}${a.reset}`)}let f=c[l],p;typeof f.content=="string"?p=f.content:Array.isArray(f.content)?p=f.content.filter(g=>g&&g.type==="text").map(g=>g.text).join(`
1486
- `):p=String(f.content),r(c.slice(0,l));let{resetSessionTracking:h}=Se();h();let m=d||"current model";return console.log(`${a.cyan}Retrying with ${m}...${a.reset}`),await i(p),!0}case"/context":return await Hg(Ht),!0;case"/tree":{let{generateFileTree:s}=Ni(),r=parseInt(o.join(" ").trim(),10),i=!isNaN(r)&&r>0?Math.min(r,8):3,c=s(Ht,{maxDepth:i,maxFiles:300});return console.log(`
1485
+ `))}s(),i(),Le=null;let{deleteSession:u}=Jt();return u("_autosave"),console.log(`${a.green}Conversation cleared${a.reset}`),!0}case"/retry":{let{getConversationMessages:s,setConversationMessages:r,processInput:i}=ve(),c=s(),l=c.map(g=>g.role).lastIndexOf("user");if(l===-1)return console.log(`${a.yellow}Nothing to retry \u2014 no user message found.${a.reset}`),!0;let u=o.indexOf("--model"),d=u!==-1&&o[u+1]?o[u+1]:null;if(d){let{setActiveModel:g}=je();if(!g(d))return console.log(`${a.red}Unknown model: ${d}. Use /providers to see available models.${a.reset}`),!0;console.log(`${a.cyan}Switched to model: ${d}${a.reset}`)}let f=c[l],p;typeof f.content=="string"?p=f.content:Array.isArray(f.content)?p=f.content.filter(g=>g&&g.type==="text").map(g=>g.text).join(`
1486
+ `):p=String(f.content),r(c.slice(0,l));let{resetSessionTracking:h}=ve();h();let m=d||"current model";return console.log(`${a.cyan}Retrying with ${m}...${a.reset}`),await i(p),!0}case"/context":return await Hg(Ht),!0;case"/tree":{let{generateFileTree:s}=Ni(),r=parseInt(o.join(" ").trim(),10),i=!isNaN(r)&&r>0?Math.min(r,8):3,c=s(Ht,{maxDepth:i,maxFiles:300});return console.log(`
1487
1487
  ${a.bold}${a.cyan}Project tree${a.reset}${a.dim} (depth ${i})${a.reset}
1488
1488
  `),console.log(`${a.dim}${c}${a.reset}
1489
- `),!0}case"/autoconfirm":{let s=!Vl();return tT(s),console.log(`${a.green}Auto-confirm: ${s?"ON":"OFF"}${a.reset}`),s&&console.log(`${a.yellow} \u26A0 File changes will be applied without confirmation${a.reset}`),xr(),!0}case"/save":{let{saveSession:s}=Jt(),{getConversationMessages:r}=Se(),i=o.join(" ").trim()||`session-${Date.now()}`,c=r();if(c.length===0)return console.log(`${a.yellow}No conversation to save${a.reset}`),!0;let l=En(),u=ks();return s(i,c,{model:l.id,provider:u}),console.log(`${a.green}Session saved: ${i} (${c.length} messages)${a.reset}`),!0}case"/load":{let{loadSession:s}=Jt(),{setConversationMessages:r}=Se(),i=o.join(" ").trim();if(!i)return console.log(`${a.red}Usage: /load <name>${a.reset}`),!0;let c=s(i);return c?(r(c.messages),console.log(`${a.green}Loaded session: ${c.name} (${c.messageCount} messages)${a.reset}`),!0):(console.log(`${a.red}Session not found: ${i}${a.reset}`),!0)}case"/sessions":{let{listSessions:s}=Jt(),r=s();if(r.length===0)return console.log(`${a.dim}No saved sessions${a.reset}`),!0;console.log(`
1490
- ${a.bold}${a.cyan}Sessions:${a.reset}`);for(let i of r){let c=i.updatedAt?new Date(i.updatedAt).toLocaleString():"?",l=i.name==="_autosave"?` ${a.dim}(auto)${a.reset}`:"",u=i.score!=null?` \xB7 score ${i.score}/10${i.scoreGrade?` (${i.scoreGrade})`:""}`:"";console.log(` ${a.cyan}${i.name}${a.reset}${l} \u2014 ${i.messageCount} msgs, ${c}${a.dim}${u}${a.reset}`)}return console.log(),!0}case"/resume":{let{getLastSession:s}=Jt(),{setConversationMessages:r}=Se(),i=s();return i?(r(i.messages),console.log(`${a.green}Resumed: ${i.name} (${i.messageCount} messages)${a.reset}`),!0):(console.log(`${a.yellow}No session to resume${a.reset}`),!0)}case"/branches":{let{initTree:s,renderTree:r}=Un(),{getConversationMessages:i}=Se(),c=i();return c.length===0?(console.log(`${a.yellow}No conversation yet${a.reset}`),!0):(Le||(Le=s({messages:c})),console.log(r(Le)),console.log(),!0)}case"/timeline":{let{initTree:s,renderTimeline:r}=Un(),{getConversationMessages:i}=Se(),c=i();if(c.length===0)return console.log(`${a.yellow}No conversation yet${a.reset}`),!0;Le||(Le=s({messages:c})),Un().setActiveMessages(Le,c);let u=parseInt(o[0],10)||20;return console.log(r(Le,u)),console.log(),!0}case"/goto":{let s=Un(),{getConversationMessages:r,setConversationMessages:i}=Se(),c=r();if(c.length===0)return console.log(`${a.yellow}No conversation yet${a.reset}`),!0;let l=parseInt(o[0],10);if(isNaN(l))return console.log(`${a.red}Usage: /goto <message-index>${a.reset}`),console.log(`${a.dim}Use /timeline to see message indices${a.reset}`),!0;Le||(Le=s.initTree({messages:c})),s.setActiveMessages(Le,c);try{let{truncated:u}=s.gotoMessage(Le,l),d=s.getActiveMessages(Le);i(d),console.log(`${a.green}Jumped to message ${l}. Removed ${u} later messages.${a.reset}`),console.log(`${a.dim}Conversation now has ${d.length} messages. Continue chatting from here.${a.reset}`)}catch(u){console.log(`${a.red}${u.message}${a.reset}`)}return!0}case"/fork":{let s=Un(),{getConversationMessages:r,setConversationMessages:i}=Se(),c=r();if(c.length===0)return console.log(`${a.yellow}No conversation yet${a.reset}`),!0;Le||(Le=s.initTree({messages:c})),s.setActiveMessages(Le,c);let l=o[0]?parseInt(o[0],10):c.length-1,u=o[1]||void 0;if(isNaN(l))return console.log(`${a.red}Usage: /fork [message-index] [branch-name]${a.reset}`),!0;try{let{branchName:d}=s.createBranch(Le,l,u),f=s.getActiveMessages(Le);i(f),console.log(`${a.green}Created branch "${d}" forking at message ${l}${a.reset}`),console.log(`${a.dim}Now on branch "${d}" with ${f.length} messages. Continue chatting.${a.reset}`)}catch(d){console.log(`${a.red}${d.message}${a.reset}`)}return!0}case"/switch-branch":{let s=Un(),{getConversationMessages:r,setConversationMessages:i}=Se();if(!Le){let l=r();Le=s.initTree({messages:l})}s.setActiveMessages(Le,r());let c=o.join(" ").trim();if(!c)return console.log(`${a.red}Usage: /switch-branch <name>${a.reset}`),console.log(`${a.dim}Available: ${Object.keys(Le.branches).join(", ")}${a.reset}`),!0;try{s.switchBranch(Le,c);let l=s.getActiveMessages(Le);i(l),console.log(`${a.green}Switched to branch "${c}" (${l.length} messages)${a.reset}`)}catch(l){console.log(`${a.red}${l.message}${a.reset}`)}return!0}case"/delete-branch":{let s=Un();if(!Le){let{getConversationMessages:i}=Se();Le=s.initTree({messages:i()})}let r=o.join(" ").trim();if(!r)return console.log(`${a.red}Usage: /delete-branch <name>${a.reset}`),!0;try{s.deleteBranch(Le,r),console.log(`${a.green}Deleted branch "${r}"${a.reset}`)}catch(i){console.log(`${a.red}${i.message}${a.reset}`)}return!0}case"/remember":{let{remember:s}=cn(),r=o.join(" ").trim();if(!r)return console.log(`${a.red}Usage: /remember <key>=<value> or /remember <text>${a.reset}`),!0;let i=r.indexOf("="),c,l;return i>0?(c=r.substring(0,i).trim(),l=r.substring(i+1).trim()):(c=r.substring(0,40).replace(/\s+/g,"-"),l=r),s(c,l),console.log(`${a.green}Remembered: ${c}${a.reset}`),!0}case"/forget":{let{forget:s}=cn(),r=o.join(" ").trim();return r?(s(r)?console.log(`${a.green}Forgotten: ${r}${a.reset}`):console.log(`${a.red}Memory not found: ${r}${a.reset}`),!0):(console.log(`${a.red}Usage: /forget <key>${a.reset}`),!0)}case"/memory":{let{listMemories:s}=cn(),r=s();if(r.length===0)return console.log(`${a.dim}No memories saved${a.reset}`),!0;console.log(`
1489
+ `),!0}case"/autoconfirm":{let s=!Vl();return tT(s),console.log(`${a.green}Auto-confirm: ${s?"ON":"OFF"}${a.reset}`),s&&console.log(`${a.yellow} \u26A0 File changes will be applied without confirmation${a.reset}`),xr(),!0}case"/save":{let{saveSession:s}=Jt(),{getConversationMessages:r}=ve(),i=o.join(" ").trim()||`session-${Date.now()}`,c=r();if(c.length===0)return console.log(`${a.yellow}No conversation to save${a.reset}`),!0;let l=En(),u=ks();return s(i,c,{model:l.id,provider:u}),console.log(`${a.green}Session saved: ${i} (${c.length} messages)${a.reset}`),!0}case"/load":{let{loadSession:s}=Jt(),{setConversationMessages:r}=ve(),i=o.join(" ").trim();if(!i)return console.log(`${a.red}Usage: /load <name>${a.reset}`),!0;let c=s(i);return c?(r(c.messages),console.log(`${a.green}Loaded session: ${c.name} (${c.messageCount} messages)${a.reset}`),!0):(console.log(`${a.red}Session not found: ${i}${a.reset}`),!0)}case"/sessions":{let{listSessions:s}=Jt(),r=s();if(r.length===0)return console.log(`${a.dim}No saved sessions${a.reset}`),!0;console.log(`
1490
+ ${a.bold}${a.cyan}Sessions:${a.reset}`);for(let i of r){let c=i.updatedAt?new Date(i.updatedAt).toLocaleString():"?",l=i.name==="_autosave"?` ${a.dim}(auto)${a.reset}`:"",u=i.score!=null?` \xB7 score ${i.score}/10${i.scoreGrade?` (${i.scoreGrade})`:""}`:"";console.log(` ${a.cyan}${i.name}${a.reset}${l} \u2014 ${i.messageCount} msgs, ${c}${a.dim}${u}${a.reset}`)}return console.log(),!0}case"/resume":{let{getLastSession:s}=Jt(),{setConversationMessages:r}=ve(),i=s();return i?(r(i.messages),console.log(`${a.green}Resumed: ${i.name} (${i.messageCount} messages)${a.reset}`),!0):(console.log(`${a.yellow}No session to resume${a.reset}`),!0)}case"/branches":{let{initTree:s,renderTree:r}=Un(),{getConversationMessages:i}=ve(),c=i();return c.length===0?(console.log(`${a.yellow}No conversation yet${a.reset}`),!0):(Le||(Le=s({messages:c})),console.log(r(Le)),console.log(),!0)}case"/timeline":{let{initTree:s,renderTimeline:r}=Un(),{getConversationMessages:i}=ve(),c=i();if(c.length===0)return console.log(`${a.yellow}No conversation yet${a.reset}`),!0;Le||(Le=s({messages:c})),Un().setActiveMessages(Le,c);let u=parseInt(o[0],10)||20;return console.log(r(Le,u)),console.log(),!0}case"/goto":{let s=Un(),{getConversationMessages:r,setConversationMessages:i}=ve(),c=r();if(c.length===0)return console.log(`${a.yellow}No conversation yet${a.reset}`),!0;let l=parseInt(o[0],10);if(isNaN(l))return console.log(`${a.red}Usage: /goto <message-index>${a.reset}`),console.log(`${a.dim}Use /timeline to see message indices${a.reset}`),!0;Le||(Le=s.initTree({messages:c})),s.setActiveMessages(Le,c);try{let{truncated:u}=s.gotoMessage(Le,l),d=s.getActiveMessages(Le);i(d),console.log(`${a.green}Jumped to message ${l}. Removed ${u} later messages.${a.reset}`),console.log(`${a.dim}Conversation now has ${d.length} messages. Continue chatting from here.${a.reset}`)}catch(u){console.log(`${a.red}${u.message}${a.reset}`)}return!0}case"/fork":{let s=Un(),{getConversationMessages:r,setConversationMessages:i}=ve(),c=r();if(c.length===0)return console.log(`${a.yellow}No conversation yet${a.reset}`),!0;Le||(Le=s.initTree({messages:c})),s.setActiveMessages(Le,c);let l=o[0]?parseInt(o[0],10):c.length-1,u=o[1]||void 0;if(isNaN(l))return console.log(`${a.red}Usage: /fork [message-index] [branch-name]${a.reset}`),!0;try{let{branchName:d}=s.createBranch(Le,l,u),f=s.getActiveMessages(Le);i(f),console.log(`${a.green}Created branch "${d}" forking at message ${l}${a.reset}`),console.log(`${a.dim}Now on branch "${d}" with ${f.length} messages. Continue chatting.${a.reset}`)}catch(d){console.log(`${a.red}${d.message}${a.reset}`)}return!0}case"/switch-branch":{let s=Un(),{getConversationMessages:r,setConversationMessages:i}=ve();if(!Le){let l=r();Le=s.initTree({messages:l})}s.setActiveMessages(Le,r());let c=o.join(" ").trim();if(!c)return console.log(`${a.red}Usage: /switch-branch <name>${a.reset}`),console.log(`${a.dim}Available: ${Object.keys(Le.branches).join(", ")}${a.reset}`),!0;try{s.switchBranch(Le,c);let l=s.getActiveMessages(Le);i(l),console.log(`${a.green}Switched to branch "${c}" (${l.length} messages)${a.reset}`)}catch(l){console.log(`${a.red}${l.message}${a.reset}`)}return!0}case"/delete-branch":{let s=Un();if(!Le){let{getConversationMessages:i}=ve();Le=s.initTree({messages:i()})}let r=o.join(" ").trim();if(!r)return console.log(`${a.red}Usage: /delete-branch <name>${a.reset}`),!0;try{s.deleteBranch(Le,r),console.log(`${a.green}Deleted branch "${r}"${a.reset}`)}catch(i){console.log(`${a.red}${i.message}${a.reset}`)}return!0}case"/remember":{let{remember:s}=ln(),r=o.join(" ").trim();if(!r)return console.log(`${a.red}Usage: /remember <key>=<value> or /remember <text>${a.reset}`),!0;let i=r.indexOf("="),c,l;return i>0?(c=r.substring(0,i).trim(),l=r.substring(i+1).trim()):(c=r.substring(0,40).replace(/\s+/g,"-"),l=r),s(c,l),console.log(`${a.green}Remembered: ${c}${a.reset}`),!0}case"/forget":{let{forget:s}=ln(),r=o.join(" ").trim();return r?(s(r)?console.log(`${a.green}Forgotten: ${r}${a.reset}`):console.log(`${a.red}Memory not found: ${r}${a.reset}`),!0):(console.log(`${a.red}Usage: /forget <key>${a.reset}`),!0)}case"/memory":{let{listMemories:s}=ln(),r=s();if(r.length===0)return console.log(`${a.dim}No memories saved${a.reset}`),!0;console.log(`
1491
1491
  ${a.bold}${a.cyan}Memory:${a.reset}`);for(let i of r)console.log(` ${a.cyan}${i.key}${a.reset} = ${i.value}`);return console.log(),!0}case"/brain":{let{listDocuments:s,readDocument:r,writeDocument:i,removeDocument:c,buildIndex:l,buildEmbeddingIndex:u,isEmbeddingAvailable:d,query:f}=Do(),p=o[0],h=o.slice(1).join(" ").trim();switch(p){case"add":{if(!h)return console.log(`${a.red}Usage: /brain add <name> [content]${a.reset}`),console.log(`${a.dim} /brain add api-notes \u2014 creates empty file${a.reset}`),console.log(`${a.dim} /brain add api-notes This is content \u2014 writes directly${a.reset}`),!0;let m=h.indexOf(" ");if(m<0){i(h,`# ${h}
1492
1492
 
1493
1493
  `);let g=require("path").join(process.cwd(),".nex","brain",`${h}.md`);console.log(`${a.green}Created .nex/brain/${h}.md${a.reset}`),console.log(`${a.dim}Edit it directly at: ${g}${a.reset}`)}else{let g=h.substring(0,m),y=h.substring(m+1);i(g,y),console.log(`${a.green}Added to brain: ${g}${a.reset}`)}return!0}case"list":{let m=s();if(m.length===0)return console.log(`${a.dim}No brain documents yet. Use /brain add <name> to create one.${a.reset}`),!0;console.log(`
@@ -1504,13 +1504,13 @@ ${a.dim}Commands: add \xB7 list \xB7 search \xB7 show \xB7 remove \xB7 rebuild \
1504
1504
  `);else{console.log(`
1505
1505
  ${a.bold}${a.cyan}Brain: ${m.length} document(s)${a.reset}`);for(let g of m){let{frontmatter:y}=r(g.name),w=Array.isArray(y.tags)?` [${y.tags.join(", ")}]`:"";console.log(` ${a.cyan}${g.name}${a.reset}${a.dim}${w}${a.reset}`)}console.log(`
1506
1506
  ${a.dim}Use /brain search <query> \xB7 /brain show <name> \xB7 /brain add <name>${a.reset}
1507
- `)}return!0}}}case"/learn":{let{learnFromSession:s,learnBrainFromSession:r}=Dl(),{getConversationMessages:i}=Se(),c=i(),l=c.filter(u=>u.role==="user").length;if(l<4)return console.log(`${a.yellow}Session too short to learn from (need 4+ user messages, have ${l})${a.reset}`),!0;console.log(`${a.dim}Analyzing session for learnings...${a.reset}`);try{let[u,d]=await Promise.all([s(c),r(c)]);if(u.skipped&&(!d.written||d.written.length===0))return console.log(`${a.dim}Session too short${a.reset}`),!0;u.error&&console.log(`${a.red}Reflection error: ${u.error}${a.reset}`),console.log(""),u.summary&&(console.log(`${a.bold}Session:${a.reset} ${a.dim}${u.summary}${a.reset}`),console.log(""));let f=u.applied&&u.applied.length>0,p=u.nexAdded&&u.nexAdded.length>0,h=d.written&&d.written.length>0;if(!f&&!p&&!h)console.log(`${a.dim}No new learnings extracted from this session${a.reset}`);else{if(f){console.log(`${a.bold}${a.cyan}Memory updates:${a.reset}`);for(let{key:m,value:g,action:y}of u.applied){let w=y==="updated"?`${a.yellow}~${a.reset}`:`${a.green}+${a.reset}`;console.log(` ${w} ${a.bold}${m}${a.reset} = ${g}`)}}if(p){console.log(`${a.bold}${a.cyan}Added to NEX.md:${a.reset}`);for(let m of u.nexAdded)console.log(` ${a.green}+${a.reset} ${m}`)}if(h){console.log(`${a.bold}${a.cyan}Brain documents:${a.reset}`);for(let{name:m,reason:g,action:y}of d.written){let w=y==="updated"?`${a.yellow}~${a.reset}`:`${a.green}+${a.reset}`;console.log(` ${w} ${a.bold}${m}.md${a.reset}${g?a.dim+" \u2014 "+g+a.reset:""}`)}}}console.log("")}catch(u){console.log(`${a.red}Learn failed: ${u.message}${a.reset}`)}return!0}case"/optimize":{let{getConversationMessages:s}=Se(),{getUsage:r}=Rt(),{TOOL_DEFINITIONS:i}=Gt(),{listMemories:c}=cn(),l=s(),u=r(l,i),d=En(),f=ks(),p=c();console.log(`
1507
+ `)}return!0}}}case"/learn":{let{learnFromSession:s,learnBrainFromSession:r}=Dl(),{getConversationMessages:i}=ve(),c=i(),l=c.filter(u=>u.role==="user").length;if(l<4)return console.log(`${a.yellow}Session too short to learn from (need 4+ user messages, have ${l})${a.reset}`),!0;console.log(`${a.dim}Analyzing session for learnings...${a.reset}`);try{let[u,d]=await Promise.all([s(c),r(c)]);if(u.skipped&&(!d.written||d.written.length===0))return console.log(`${a.dim}Session too short${a.reset}`),!0;u.error&&console.log(`${a.red}Reflection error: ${u.error}${a.reset}`),console.log(""),u.summary&&(console.log(`${a.bold}Session:${a.reset} ${a.dim}${u.summary}${a.reset}`),console.log(""));let f=u.applied&&u.applied.length>0,p=u.nexAdded&&u.nexAdded.length>0,h=d.written&&d.written.length>0;if(!f&&!p&&!h)console.log(`${a.dim}No new learnings extracted from this session${a.reset}`);else{if(f){console.log(`${a.bold}${a.cyan}Memory updates:${a.reset}`);for(let{key:m,value:g,action:y}of u.applied){let w=y==="updated"?`${a.yellow}~${a.reset}`:`${a.green}+${a.reset}`;console.log(` ${w} ${a.bold}${m}${a.reset} = ${g}`)}}if(p){console.log(`${a.bold}${a.cyan}Added to NEX.md:${a.reset}`);for(let m of u.nexAdded)console.log(` ${a.green}+${a.reset} ${m}`)}if(h){console.log(`${a.bold}${a.cyan}Brain documents:${a.reset}`);for(let{name:m,reason:g,action:y}of d.written){let w=y==="updated"?`${a.yellow}~${a.reset}`:`${a.green}+${a.reset}`;console.log(` ${w} ${a.bold}${m}.md${a.reset}${g?a.dim+" \u2014 "+g+a.reset:""}`)}}}console.log("")}catch(u){console.log(`${a.red}Learn failed: ${u.message}${a.reset}`)}return!0}case"/optimize":{let{getConversationMessages:s}=ve(),{getUsage:r}=Rt(),{TOOL_DEFINITIONS:i}=Gt(),{listMemories:c}=ln(),l=s(),u=r(l,i),d=En(),f=ks(),p=c();console.log(`
1508
1508
  ${a.bold}${a.cyan}Optimization Report${a.reset}
1509
1509
  `);let h=u.percentage>80?a.red:u.percentage>50?a.yellow:a.green;if(console.log(`${a.bold}Context Window:${a.reset} ${h}${u.percentage}%${a.reset} used (${u.used.toLocaleString()} / ${u.limit.toLocaleString()} tokens)`),u.percentage>75?console.log(` ${a.yellow}\u2192 Tip: Use /clear to free context (auto-learns first)${a.reset}`):u.percentage>50?console.log(` ${a.dim}\u2192 Context is filling up, consider /clear soon${a.reset}`):console.log(` ${a.green}\u2192 Context healthy${a.reset}`),console.log(`
1510
1510
  ${a.bold}Memory:${a.reset} ${p.length} entries`),p.length===0)console.log(` ${a.yellow}\u2192 No memories yet. Use /learn after sessions or /remember key=value${a.reset}`);else{let M=[...p].sort((O,D)=>new Date(D.updatedAt)-new Date(O.updatedAt))[0],C=M?Math.round((Date.now()-new Date(M.updatedAt))/6e4):null,S=C!==null?C<60?`${C}m ago`:`${Math.round(C/60)}h ago`:"?";console.log(` ${a.dim}Latest update: ${S}${a.reset}`),p.length>30&&console.log(` ${a.yellow}\u2192 Many memories (${p.length}) \u2014 consider pruning with /forget${a.reset}`)}console.log(`
1511
1511
  ${a.bold}Active Model:${a.reset} ${f}:${d.id}`);let m=d.contextWindow||d.maxTokens||0;m>0&&m<32e3&&l.length>10?console.log(` ${a.yellow}\u2192 Small context window (${(m/1e3).toFixed(0)}k). Consider /model for larger context${a.reset}`):m>=128e3&&console.log(` ${a.green}\u2192 Large context window (${(m/1e3).toFixed(0)}k) \u2014 good for long sessions${a.reset}`);let g=l.filter(v=>v.role==="user").length;console.log(`
1512
1512
  ${a.bold}Session:${a.reset} ${g} turns, ${l.length} messages total`),g>=4&&g%10===0&&console.log(` ${a.cyan}\u2192 Good time to /learn and capture session insights${a.reset}`);let y=[],w=require("path").join(process.cwd(),"NEX.md");if(require("fs").existsSync(w)||y.push("Create NEX.md in project root to give nex-code project-specific instructions"),y.length>0){console.log(`
1513
- ${a.bold}Quick Wins:${a.reset}`);for(let v of y)console.log(` ${a.cyan}\u2192${a.reset} ${v}`)}return console.log(""),!0}case"/plan":{let{getActivePlan:s,approvePlan:r,startExecution:i,setPlanMode:c,getPlanContent:l,getPlanContent:u,formatPlan:d,extractStepsFromText:f,createPlan:p}=ln(),{invalidateSystemPromptCache:h}=Se(),m=o.join(" ").trim();if(m==="status"){let g=s();return console.log(d(g)),!0}if(m==="edit"){let g=l();if(!g)return console.log(`${a.yellow}No plan to edit. Generate a plan first with /plan${a.reset}`),!0;let y=require("os"),w=require("path").join(y.tmpdir(),`nex-plan-${Date.now()}.md`);require("fs").writeFileSync(w,g,"utf-8");let v=process.env.EDITOR||process.env.VISUAL||"nano",{spawnSync:M}=require("child_process");if(console.log(`${a.dim}Opening plan in ${v}... (save and close to update)${a.reset}`),M(v,[w],{stdio:"inherit"}).status===0){let{setPlanContent:S}=ln(),O=require("fs").readFileSync(w,"utf-8");S(O);let D=f(O);if(D.length>0){let V=s()?.task||"Task";p(V,D),console.log(`${a.green}Plan updated \u2014 ${D.length} steps extracted.${a.reset}`)}else console.log(`${a.green}Plan updated.${a.reset}`)}else console.log(`${a.yellow}Editor exited with error \u2014 plan unchanged.${a.reset}`);try{require("fs").unlinkSync(w)}catch{}return!0}if(m==="approve"){let g=l();if(r()){i(),c(!1),xr(),h();let w=s()?.steps?.length||0,v=w>0?` (${w} steps)`:"";if(console.log(`${a.green}${a.bold}Plan approved!${a.reset}${v} Executing...`),console.log(`${a.dim}Plan mode disabled \u2014 all tools now available.${a.reset}`),g){let{processInput:M}=Se(),C=`[PLAN APPROVED \u2014 EXECUTE NOW]
1513
+ ${a.bold}Quick Wins:${a.reset}`);for(let v of y)console.log(` ${a.cyan}\u2192${a.reset} ${v}`)}return console.log(""),!0}case"/plan":{let{getActivePlan:s,approvePlan:r,startExecution:i,setPlanMode:c,getPlanContent:l,getPlanContent:u,formatPlan:d,extractStepsFromText:f,createPlan:p}=Vt(),{invalidateSystemPromptCache:h}=ve(),m=o.join(" ").trim();if(m==="status"){let g=s();return console.log(d(g)),!0}if(m==="edit"){let g=l();if(!g)return console.log(`${a.yellow}No plan to edit. Generate a plan first with /plan${a.reset}`),!0;let y=require("os"),w=require("path").join(y.tmpdir(),`nex-plan-${Date.now()}.md`);require("fs").writeFileSync(w,g,"utf-8");let v=process.env.EDITOR||process.env.VISUAL||"nano",{spawnSync:M}=require("child_process");if(console.log(`${a.dim}Opening plan in ${v}... (save and close to update)${a.reset}`),M(v,[w],{stdio:"inherit"}).status===0){let{setPlanContent:S}=Vt(),O=require("fs").readFileSync(w,"utf-8");S(O);let D=f(O);if(D.length>0){let V=s()?.task||"Task";p(V,D),console.log(`${a.green}Plan updated \u2014 ${D.length} steps extracted.${a.reset}`)}else console.log(`${a.green}Plan updated.${a.reset}`)}else console.log(`${a.yellow}Editor exited with error \u2014 plan unchanged.${a.reset}`);try{require("fs").unlinkSync(w)}catch{}return!0}if(m==="approve"){let g=l();if(r()){i(),c(!1),xr(),h();let w=s()?.steps?.length||0,v=w>0?` (${w} steps)`:"";if(console.log(`${a.green}${a.bold}Plan approved!${a.reset}${v} Executing...`),console.log(`${a.dim}Plan mode disabled \u2014 all tools now available.${a.reset}`),g){let{processInput:M}=ve(),C=`[PLAN APPROVED \u2014 EXECUTE NOW]
1514
1514
 
1515
1515
  Implement the following plan step by step. All tools are now available.
1516
1516
 
@@ -1519,14 +1519,14 @@ ${g}`;try{await M(C)}catch(S){console.log(`${a.red}Error: ${S.message?.split(`
1519
1519
  ${a.cyan}${a.bold}\u250C\u2500 PLAN MODE \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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510${a.reset}
1520
1520
  ${a.cyan}${a.bold}\u2502${a.reset} Analysis only \u2014 no file changes until approved ${a.cyan}${a.bold}\u2502${a.reset}
1521
1521
  ${a.cyan}${a.bold}\u2502${a.reset} ${a.dim}Read-only tools only \xB7 /plan approve to execute${a.reset} ${a.cyan}${a.bold}\u2502${a.reset}
1522
- ${a.cyan}${a.bold}\u2514\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\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\u2500\u2518${a.reset}`),m&&console.log(`${a.dim}Task: ${m}${a.reset}`),!0}case"/plans":{let{listPlans:s}=ln(),r=s();if(r.length===0)return console.log(`${a.dim}No saved plans${a.reset}`),!0;console.log(`
1523
- ${a.bold}${a.cyan}Plans:${a.reset}`);for(let i of r){let c=i.status==="completed"?`${a.green}\u2713`:i.status==="executing"?`${a.blue}\u2192`:`${a.dim}\u25CB`;console.log(` ${c} ${a.reset}${a.bold}${i.name}${a.reset} \u2014 ${i.task||"?"} (${i.steps} steps, ${i.status})`)}return console.log(),!0}case"/auto":{let{getAutonomyLevel:s,setAutonomyLevel:r,AUTONOMY_LEVELS:i}=ln(),c=o.join(" ").trim();return c?(r(c)?(console.log(`${a.green}Autonomy: ${c}${a.reset}`),xr()):console.log(`${a.red}Unknown level: ${c}. Use: ${i.join(", ")}${a.reset}`),!0):(console.log(`${a.bold}${a.cyan}Autonomy:${a.reset} ${s()}`),console.log(`${a.dim}Levels: ${i.join(", ")}${a.reset}`),!0)}case"/permissions":{let{listPermissions:s}=tr(),r=s();console.log(`
1522
+ ${a.cyan}${a.bold}\u2514\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\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\u2500\u2518${a.reset}`),m&&console.log(`${a.dim}Task: ${m}${a.reset}`),!0}case"/plans":{let{listPlans:s}=Vt(),r=s();if(r.length===0)return console.log(`${a.dim}No saved plans${a.reset}`),!0;console.log(`
1523
+ ${a.bold}${a.cyan}Plans:${a.reset}`);for(let i of r){let c=i.status==="completed"?`${a.green}\u2713`:i.status==="executing"?`${a.blue}\u2192`:`${a.dim}\u25CB`;console.log(` ${c} ${a.reset}${a.bold}${i.name}${a.reset} \u2014 ${i.task||"?"} (${i.steps} steps, ${i.status})`)}return console.log(),!0}case"/auto":{let{getAutonomyLevel:s,setAutonomyLevel:r,AUTONOMY_LEVELS:i}=Vt(),c=o.join(" ").trim();return c?(r(c)?(console.log(`${a.green}Autonomy: ${c}${a.reset}`),xr()):console.log(`${a.red}Unknown level: ${c}. Use: ${i.join(", ")}${a.reset}`),!0):(console.log(`${a.bold}${a.cyan}Autonomy:${a.reset} ${s()}`),console.log(`${a.dim}Levels: ${i.join(", ")}${a.reset}`),!0)}case"/permissions":{let{listPermissions:s}=tr(),r=s();console.log(`
1524
1524
  ${a.bold}${a.cyan}Tool Permissions:${a.reset}`);for(let i of r){let c=i.mode==="allow"?`${a.green}\u2713`:i.mode==="deny"?`${a.red}\u2717`:`${a.yellow}?`;console.log(` ${c} ${a.reset}${a.bold}${i.tool}${a.reset} ${a.dim}(${i.mode})${a.reset}`)}return console.log(`
1525
1525
  ${a.dim}Use /allow <tool> or /deny <tool> to change${a.reset}
1526
1526
  `),!0}case"/allow":{let{setPermission:s,savePermissions:r}=tr(),i=o.join(" ").trim();return i?(s(i,"allow"),r(),console.log(`${a.green}${i}: allow${a.reset}`),!0):(console.log(`${a.red}Usage: /allow <tool>${a.reset}`),!0)}case"/deny":{let{setPermission:s,savePermissions:r}=tr(),i=o.join(" ").trim();return i?(s(i,"deny"),r(),console.log(`${a.red}${i}: deny${a.reset}`),!0):(console.log(`${a.red}Usage: /deny <tool>${a.reset}`),!0)}case"/audit":{let{getAuditSummary:s,isAuditEnabled:r}=Lc();if(!r())return console.log(`${a.yellow}Audit logging is disabled (set NEX_AUDIT=true to enable)${a.reset}`),!0;let i=parseInt(o.join(" ").trim())||1,c=s(i);if(console.log(`
1527
1527
  ${a.bold}${a.cyan}Audit Summary (${i} day${i>1?"s":""})${a.reset}
1528
1528
  `),console.log(` Total tool calls: ${a.bold}${c.totalCalls}${a.reset}`),console.log(` Avg duration: ${a.dim}${c.avgDuration}ms${a.reset}`),console.log(` Success rate: ${c.successRate>=.95?a.green:a.yellow}${Math.round(c.successRate*100)}%${a.reset}`),Object.keys(c.byTool).length>0){console.log(`
1529
- ${a.dim}Tool${" ".repeat(25)}Count${a.reset}`),console.log(` ${a.dim}${"\u2500".repeat(35)}${a.reset}`);let l=Object.entries(c.byTool).sort((u,d)=>d[1]-u[1]);for(let[u,d]of l.slice(0,15))console.log(` ${u.padEnd(30)}${d}`)}return console.log(),!0}case"/commit":{let{isGitRepo:s,commit:r,analyzeDiff:i,formatDiffSummary:c}=Nn(),{confirm:l}=ft();if(!s())return console.log(`${a.red}Not a git repository${a.reset}`),!0;let u=o.join(" ").trim();if(u){let m=await r(u);return console.log(m?`${a.green}Committed: ${m} \u2014 ${u}${a.reset}`:`${a.red}Commit failed${a.reset}`),!0}if(!i())return console.log(`${a.yellow}No changes to commit${a.reset}`),!0;let f=await c();if(console.log(f),!await l(" Commit changes?"))return!0;let h=await r("nex-code update");return h&&console.log(`${a.green} \u2713 Committed: ${h}${a.reset}`),!0}case"/diff":{let{isGitRepo:s,formatDiffSummary:r}=Nn();return s()?(console.log(r()),!0):(console.log(`${a.red}Not a git repository${a.reset}`),!0)}case"/review":{let{isGitRepo:s,getDiff:r}=Nn(),{processInput:i}=Se(),c=o.join(" ").trim(),l=c.includes("--strict"),u=c.replace("--strict","").trim(),f=`## Review Protocol
1529
+ ${a.dim}Tool${" ".repeat(25)}Count${a.reset}`),console.log(` ${a.dim}${"\u2500".repeat(35)}${a.reset}`);let l=Object.entries(c.byTool).sort((u,d)=>d[1]-u[1]);for(let[u,d]of l.slice(0,15))console.log(` ${u.padEnd(30)}${d}`)}return console.log(),!0}case"/commit":{let{isGitRepo:s,commit:r,analyzeDiff:i,formatDiffSummary:c}=Nn(),{confirm:l}=ft();if(!s())return console.log(`${a.red}Not a git repository${a.reset}`),!0;let u=o.join(" ").trim();if(u){let m=await r(u);return console.log(m?`${a.green}Committed: ${m} \u2014 ${u}${a.reset}`:`${a.red}Commit failed${a.reset}`),!0}if(!i())return console.log(`${a.yellow}No changes to commit${a.reset}`),!0;let f=await c();if(console.log(f),!await l(" Commit changes?"))return!0;let h=await r("nex-code update");return h&&console.log(`${a.green} \u2713 Committed: ${h}${a.reset}`),!0}case"/diff":{let{isGitRepo:s,formatDiffSummary:r}=Nn();return s()?(console.log(r()),!0):(console.log(`${a.red}Not a git repository${a.reset}`),!0)}case"/review":{let{isGitRepo:s,getDiff:r}=Nn(),{processInput:i}=ve(),c=o.join(" ").trim(),l=c.includes("--strict"),u=c.replace("--strict","").trim(),f=`## Review Protocol
1530
1530
 
1531
1531
  **Phase 1 \u2014 Broad Scan:** Read the target code and identify all issues at a high level.
1532
1532
 
@@ -1618,16 +1618,16 @@ ${a.dim}/deploy <name> \u2014 run a named deploy${a.reset}`),console.lo
1618
1618
  ${a.bold}${a.cyan}OpenClaw Nightly Results (${v.length}-day trend)${a.reset}
1619
1619
  `),console.log(` ${a.dim}${"Date".padEnd(12)} ${"Model".padEnd(25)} ${"Score".padEnd(8)} ${"Pass".padEnd(8)}${a.reset}`),console.log(` ${a.dim}${"\u2500".repeat(58)}${a.reset}`);let M=[];for(let C of v)try{let S=JSON.parse(at.readFileSync(et.join(w,C),"utf-8")),O=C.replace(".json",""),D=S.tasks?.length||S.total||0,K=S.tasks?.filter(R=>R.passed||R.score>=.7)?.length||S.passed||0,V=S.score??S.overall_score??(D>0?Math.round(K/D*100):"N/A"),X=S.model||S.config?.model||"unknown";M.push({date:O,model:X,total:D,passed:K,score:V});let B=typeof V=="number"?V>=80?a.green:V>=60?a.yellow:a.red:a.dim;console.log(` ${O.padEnd(12)} ${X.substring(0,24).padEnd(25)} ${B}${String(V).padEnd(8)}${a.reset} ${K}/${D}`)}catch{}if(M.length>=2){let C=M[0].score,S=M[M.length-1].score;if(typeof C=="number"&&typeof S=="number"){let O=S-C,D=O>0?`${a.green}\u25B2 +${O}`:O<0?`${a.red}\u25BC ${O}`:`${a.dim}\u2192 stable`;console.log(`
1620
1620
  ${a.bold}Trend:${a.reset} ${D}${a.reset} over ${M.length} days`)}}console.log();break}if(o.includes("--all")){let{fetchCloudModels:y,markBenchmarked:w,updateReadme:v,updateModelsEnv:M,updateRoutingConfig:C}=po(),{runBenchmark:S,buildCategoryWinners:O}=Wn(),D=new Set(["nemotron-3-super:cloud"]),K=o.find(E=>E.startsWith("--parallel=")),V=K?Math.max(1,parseInt(K.replace("--parallel=",""),10)||3):3;console.log(`
1621
- ${a.bold}Fetching all available Ollama Cloud models...${a.reset}`);let X;try{X=await y()}catch(E){console.log(`${a.red}Failed to fetch model list: ${E.message}${a.reset}`);break}let B=X.filter(E=>!D.has(E)),R=X.filter(E=>D.has(E)),$e=56,be=Math.ceil($e*B.length*4/V/60);console.log(`${a.cyan}${B.length} models found${a.reset}`+(R.length>0?` ${a.dim}(${R.length} blacklisted: ${R.join(", ")})${a.reset}`:"")),console.log(`${a.dim}Models: ${B.join(", ")}${a.reset}`),console.log(`${a.dim}${$e} tasks \xB7 ${V} parallel \xB7 ~${be}min estimated${a.reset}
1622
- `);let fe=new Map,pe=await S({models:B,quick:!1,parallelModels:V,onProgress:({model:E,task:A,done:T,score:L,error:ae})=>{if(!T){fe.has(E)||(fe.set(E,""),process.stdout.write(`
1623
- ${a.cyan}${E.padEnd(30)}${a.reset} `));return}let se=ae?`${a.red}\u2717${a.reset}`:L>=80?`${a.green}\xB7${a.reset}`:L>=40?`${a.yellow}\xB7${a.reset}`:`${a.red}\xB7${a.reset}`;process.stdout.write(se)}});process.stdout.write(`
1621
+ ${a.bold}Fetching all available Ollama Cloud models...${a.reset}`);let X;try{X=await y()}catch(E){console.log(`${a.red}Failed to fetch model list: ${E.message}${a.reset}`);break}let B=X.filter(E=>!D.has(E)),R=X.filter(E=>D.has(E)),ye=56,be=Math.ceil(ye*B.length*4/V/60);console.log(`${a.cyan}${B.length} models found${a.reset}`+(R.length>0?` ${a.dim}(${R.length} blacklisted: ${R.join(", ")})${a.reset}`:"")),console.log(`${a.dim}Models: ${B.join(", ")}${a.reset}`),console.log(`${a.dim}${ye} tasks \xB7 ${V} parallel \xB7 ~${be}min estimated${a.reset}
1622
+ `);let fe=new Map,pe=await S({models:B,quick:!1,parallelModels:V,onProgress:({model:E,task:A,done:T,score:L,error:ie})=>{if(!T){fe.has(E)||(fe.set(E,""),process.stdout.write(`
1623
+ ${a.cyan}${E.padEnd(30)}${a.reset} `));return}let se=ie?`${a.red}\u2717${a.reset}`:L>=80?`${a.green}\xB7${a.reset}`:L>=40?`${a.yellow}\xB7${a.reset}`:`${a.red}\xB7${a.reset}`;process.stdout.write(se)}});process.stdout.write(`
1624
1624
  `);let xe=require("os"),me=require("path").join(xe.homedir(),".nex-code","benchmark-results.json");try{require("fs").writeFileSync(me,JSON.stringify(pe,null,2))}catch{}w(B);let he=O(pe),Re=C(he),k=require("path").join(process.cwd(),"README.md"),j=v(pe,k),x=M(pe);if(j&&console.log(`
1625
1625
  ${a.green}README.md benchmark table updated${a.reset}`),x.updated&&console.log(`${a.green}DEFAULT_MODEL: ${x.previousModel} \u2192 ${x.newModel}${a.reset}`),Re.changes.length>0){console.log(`${a.green}Routing updated:${a.reset}`);for(let E of Re.changes)console.log(` ${a.dim}${E}${a.reset}`)}return console.log(),!0}if(o.includes("--discover")){let{findNewModels:y,markBenchmarked:w,updateReadme:v,updateModelsEnv:M}=po(),{runDiscoverBenchmark:C,buildSummary:S}=Wn();console.log(`
1626
1626
  ${a.bold}Checking Ollama Cloud for new models...${a.reset}`);let O;try{O=await y()}catch(k){console.log(`${a.red}Discovery failed: ${k.message}${a.reset}`);break}let{newModels:D,allCloud:K}=O;if(console.log(`${a.dim}${K.length} models available on cloud${a.reset}`),D.length===0){console.log(`${a.green}No new models since last benchmark run.${a.reset}
1627
1627
  `);break}console.log(`${a.cyan}New models to benchmark (${D.length}):${a.reset} ${D.join(", ")}
1628
- `);let V=require("os"),X=et.join(V.homedir(),".nex-code","benchmark-results.json"),B=[];try{at.existsSync(X)&&(B=JSON.parse(at.readFileSync(X,"utf-8")))}catch{}let R="",$e=await C({newModels:D,existingRanking:B,onProgress:({model:k,task:j,done:x,score:E,error:A})=>{if(!x){k!==R&&(R&&process.stdout.write(`
1628
+ `);let V=require("os"),X=et.join(V.homedir(),".nex-code","benchmark-results.json"),B=[];try{at.existsSync(X)&&(B=JSON.parse(at.readFileSync(X,"utf-8")))}catch{}let R="",ye=await C({newModels:D,existingRanking:B,onProgress:({model:k,task:j,done:x,score:E,error:A})=>{if(!x){k!==R&&(R&&process.stdout.write(`
1629
1629
  `),R=k,process.stdout.write(`${a.cyan}${k}${a.reset} `));return}let T=A?`${a.red}\u2717${a.reset}`:E>=80?`${a.green}\xB7${a.reset}`:E>=40?`${a.yellow}\xB7${a.reset}`:`${a.red}\xB7${a.reset}`;process.stdout.write(T)}});R&&process.stdout.write(`
1630
- `);try{at.writeFileSync(X,JSON.stringify($e,null,2))}catch{}w(K);let be=et.join(process.cwd(),"README.md"),fe=v($e,be),pe=M($e),{buildCategoryWinners:xe}=Wn(),{updateRoutingConfig:me}=po(),he=xe($e),Re=me(he);if(fe&&console.log(`${a.green}README.md benchmark table updated${a.reset}`),pe.updated?console.log(`${a.green}DEFAULT_MODEL: ${pe.previousModel} \u2192 ${pe.newModel}${a.reset}`):pe.reason&&console.log(`${a.dim}models.env unchanged: ${pe.reason}${a.reset}`),Re.changes.length>0){console.log(`${a.green}Routing updated:${a.reset}`);for(let k of Re.changes)console.log(` ${a.dim}${k}${a.reset}`)}return console.log(),!0}let{runBenchmark:s,DEFAULT_MODELS:r,QUICK_MODELS:i}=Wn(),c=o.includes("--quick"),l=o.find(y=>y.startsWith("--models=")),u=l?l.replace("--models=","").split(",").map(y=>y.trim()).filter(Boolean):[],d=c?7:15,f=u.length>0?u:c?i:r;console.log(`
1630
+ `);try{at.writeFileSync(X,JSON.stringify(ye,null,2))}catch{}w(K);let be=et.join(process.cwd(),"README.md"),fe=v(ye,be),pe=M(ye),{buildCategoryWinners:xe}=Wn(),{updateRoutingConfig:me}=po(),he=xe(ye),Re=me(he);if(fe&&console.log(`${a.green}README.md benchmark table updated${a.reset}`),pe.updated?console.log(`${a.green}DEFAULT_MODEL: ${pe.previousModel} \u2192 ${pe.newModel}${a.reset}`):pe.reason&&console.log(`${a.dim}models.env unchanged: ${pe.reason}${a.reset}`),Re.changes.length>0){console.log(`${a.green}Routing updated:${a.reset}`);for(let k of Re.changes)console.log(` ${a.dim}${k}${a.reset}`)}return console.log(),!0}let{runBenchmark:s,DEFAULT_MODELS:r,QUICK_MODELS:i}=Wn(),c=o.includes("--quick"),l=o.find(y=>y.startsWith("--models=")),u=l?l.replace("--models=","").split(",").map(y=>y.trim()).filter(Boolean):[],d=c?7:15,f=u.length>0?u:c?i:r;console.log(`
1631
1631
  ${a.bold}Starting benchmark${a.reset} ${a.dim}${d} tasks \xB7 ${f.length} models \xB7 ollama cloud${a.reset}`),console.log(`${a.dim}Models: ${f.join(", ")}${a.reset}
1632
1632
  `);let p="",h=0,m=d*f.length,g=await s({models:f,quick:c,onProgress:({model:y,task:w,done:v,score:M,error:C})=>{if(!v){y!==p&&(p&&process.stdout.write(`
1633
1633
  `),p=y,process.stdout.write(`${a.cyan}${y}${a.reset} `));return}h++;let S=C?`${a.red}\u2717${a.reset}`:M>=80?`${a.green}\xB7${a.reset}`:M>=40?`${a.yellow}\xB7${a.reset}`:`${a.red}\xB7${a.reset}`;process.stdout.write(S)}});if(p&&process.stdout.write(`
@@ -1639,40 +1639,40 @@ ${a.bold}Jarvis Benchmark${a.reset} ${a.dim}5 agentic scenarios \xB7 each run a
1639
1639
  `):process.stdout.write(` ${a.green}${p}/10${a.reset}
1640
1640
  `):process.stdout.write(`${a.dim} \u2192 ${u}: ${d}...${a.reset}`)}});return r(l),!0}case"/exit":case"/quit":process.stdout.write("\x1B[r\x1B[H\x1B[2J\x1B[3J"),process.exit(0);default:{let s=QE(t);if(s)return s.agentPrompt&&(kr._pendingAgentPrompt=s.agentPrompt),!0;{let r=[...Sr,...ya()].map(u=>u.cmd.split(" ")[0]),i=(u,d)=>{let f=u.length,p=d.length,h=Array.from({length:f+1},(m,g)=>Array.from({length:p+1},(y,w)=>g===0?w:w===0?g:0));for(let m=1;m<=f;m++)for(let g=1;g<=p;g++)h[m][g]=u[m-1]===d[g-1]?h[m-1][g-1]:1+Math.min(h[m-1][g],h[m][g-1],h[m-1][g-1]);return h[f][p]},c=null,l=3;for(let u of r){let d=i(n,u);d<l&&(l=d,c=u)}console.log(c?`${a.red}Unknown command: ${n}.${a.reset} ${a.dim}Did you mean ${a.reset}${a.cyan}${c}${a.reset}${a.dim}? Type /help for all commands.${a.reset}`:`${a.red}Unknown command: ${n}. Type /help${a.reset}`)}return!0}}}var tu=1e3;function nu(){return et.join(process.cwd(),".nex","repl_history")}function Vg(){try{let t=nu();if(at.existsSync(t))return at.readFileSync(t,"utf-8").split(`
1641
1641
  `).filter(Boolean).slice(-tu)}catch{}return[]}function $a(t){try{let e=nu(),n=et.dirname(e);at.existsSync(n)||at.mkdirSync(n,{recursive:!0}),at.appendFileSync(e,t+`
1642
- `)}catch{}}function Lt(){return`${a.bold}${a.cyan}\u203A${a.reset} `}function xr(){if(!global._nexFooter)return;let{isPlanMode:t,getAutonomyLevel:e}=ln(),{getAutoConfirm:n}=ft(),o=[];t()&&o.push("plan");let s=e();s==="semi-auto"&&o.push("semi"),s==="autonomous"&&o.push("auto"),n()&&o.push("always"),global._nexFooter.setStatusInfo({mode:o.join(" \xB7 ")})}var su="\x1B[200~",ou="\x1B[201~";function oT(t){return typeof t=="string"&&t.includes(su)}function rT(t){return typeof t=="string"&&t.includes(ou)}function vr(t){return typeof t!="string"?t:t.split(su).join("").split(ou).join("")}async function iT(){if(!VE("local"))return!1;try{let{exec:e}=require("child_process"),{promisify:n}=require("util");return await n(e)("curl -s --max-time 1 http://localhost:11434/api/tags"),eu("local:llama3"),!0}catch{return!1}}async function aT(){let{setAbortSignalGetter:t,getConversationLength:e,processInput:n}=Se();t(Kg);let s=Ql().some(x=>x.configured),r=(async()=>{ZE();let x=En(),E=ks();return{model:x,providerName:E}})(),i=(async()=>s?!0:await iT()?(console.log(`${a.green}\u2713 Local Ollama detected \u2014 using local models${a.reset}`),console.log(`${a.dim}Tip: Set API keys for cloud providers for more model options (OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.)${a.reset}
1642
+ `)}catch{}}function Lt(){return`${a.bold}${a.cyan}\u203A${a.reset} `}function xr(){if(!global._nexFooter)return;let{isPlanMode:t,getAutonomyLevel:e}=Vt(),{getAutoConfirm:n}=ft(),o=[];t()&&o.push("plan");let s=e();s==="semi-auto"&&o.push("semi"),s==="autonomous"&&o.push("auto"),n()&&o.push("always"),global._nexFooter.setStatusInfo({mode:o.join(" \xB7 ")})}var su="\x1B[200~",ou="\x1B[201~";function oT(t){return typeof t=="string"&&t.includes(su)}function rT(t){return typeof t=="string"&&t.includes(ou)}function vr(t){return typeof t!="string"?t:t.split(su).join("").split(ou).join("")}async function iT(){if(!VE("local"))return!1;try{let{exec:e}=require("child_process"),{promisify:n}=require("util");return await n(e)("curl -s --max-time 1 http://localhost:11434/api/tags"),eu("local:llama3"),!0}catch{return!1}}async function aT(){let{setAbortSignalGetter:t,getConversationLength:e,processInput:n}=ve();t(Kg);let s=Ql().some(x=>x.configured),r=(async()=>{ZE();let x=En(),E=ks();return{model:x,providerName:E}})(),i=(async()=>s?!0:await iT()?(console.log(`${a.green}\u2713 Local Ollama detected \u2014 using local models${a.reset}`),console.log(`${a.dim}Tip: Set API keys for cloud providers for more model options (OPENAI_API_KEY, ANTHROPIC_API_KEY, etc.)${a.reset}
1643
1643
  `),!0):!1)(),c=(async()=>{if(process.env.NEX_DISABLE_UPDATE_CHECK==="1")return{hasNewVersion:!1};try{let{checkForNewVersion:x}=Ug();return await x()}catch{return{hasNewVersion:!1}}})(),[l,u,d]=await Promise.all([r,i,c]);!u&&!s&&(console.error(`
1644
1644
  ${a.red}\u2717 No provider configured and no local Ollama detected.${a.reset}
1645
- `),process.exit(1));let{loadPersistedHistory:f,pruneHistory:p}=yn();f().then(x=>{}),p().catch(()=>{});let h=Vg(),m=GE.createInterface({input:process.stdin,output:process.stdout,prompt:Lt(),completer:zg,history:h,historySize:tu});eT(m);let{setAskUserHandler:g}=Gt();g(async(x,E)=>{let A="\x1B[0m",T="\x1B[1m",L="\x1B[2m",ae="\x1B[36m";return process.stdout.write(`
1645
+ `),process.exit(1));let{loadPersistedHistory:f,pruneHistory:p}=yn();f().then(x=>{}),p().catch(()=>{});let h=Vg(),m=GE.createInterface({input:process.stdin,output:process.stdout,prompt:Lt(),completer:zg,history:h,historySize:tu});eT(m);let{setAskUserHandler:g}=Gt();g(async(x,E)=>{let A="\x1B[0m",T="\x1B[1m",L="\x1B[2m",ie="\x1B[36m";return process.stdout.write(`
1646
1646
  ${T}\x1B[33m\u2753${A} ${T}${x}${A}
1647
1647
 
1648
- `),E.forEach((we,Ce)=>{process.stdout.write(` ${ae}${Ce+1}${A} ${we}
1648
+ `),E.forEach((ge,Ce)=>{process.stdout.write(` ${ie}${Ce+1}${A} ${ge}
1649
1649
  `)}),process.stdout.write(` ${L}${E.length+1}${A} ${L}Eigene Antwort\u2026${A}
1650
1650
  `),process.stdout.write(`
1651
- ${ae}[1-${E.length+1}]${A} \u203A `),new Promise(we=>{m.resume(),m.once("line",Ce=>{let tt=Ce.trim(),nt=parseInt(tt);nt>=1&&nt<=E.length?(process.stdout.write(`
1652
- `),we(E[nt-1])):nt===E.length+1||tt===""?(process.stdout.write(` ${ae}\u203A${A} `),m.once("line",Tn=>{process.stdout.write(`
1653
- `),we(Tn.trim()||"")})):(process.stdout.write(`
1654
- `),we(tt))})})});let y=new sT;y.activate(m),global._nexFooter=y,global._nexRawWrite=x=>y.rawWrite(x),nT(()=>xr()),process.stdout.isTTY&&process.stdout.write("\x1B[H\x1B[2J\x1B[3J");let w=l.providerName==="ollama"?l.model.id:`${l.providerName}:${l.model.id}`;YE(w,Ht,{yolo:Vl()});{y.setStatusInfo({model:w,branch:"",project:et.basename(Ht)});let{execFile:x}=require("child_process");x("git",["rev-parse","--abbrev-ref","HEAD"],{encoding:"utf8"},(E,A)=>{!E&&A&&y.setStatusInfo({model:w,branch:A.trim(),project:et.basename(Ht)})})}d.hasNewVersion&&console.log(`${a.yellow}\u{1F4A1} New version available!${a.reset} Run ${a.cyan}npm update -g nex-code${a.reset} to upgrade from ${a.dim}${d.currentVersion}${a.reset} to ${a.green}${d.latestVersion}${a.reset}
1655
- `),await Hg(Ht);let v=!1,M=0,C=!1,S=null;function O(){Wg(),y.deactivate(),Bg(),process.stdin.isTTY&&process.stdout.write("\x1B[?2004l"),process.stdout.write("\x1B[r\x1B[H\x1B[2J\x1B[3J"),process.exit(0)}process.on("SIGTERM",O),process.on("exit",()=>{Wg()}),m.on("SIGINT",()=>{if(Bg(),M++,M>=2){O();return}if(v){tn&&tn.abort();let{cancelPendingAskUser:x}=Gt();x(),console.log(`
1651
+ ${ie}[1-${E.length+1}]${A} \u203A `),new Promise(ge=>{m.resume(),m.once("line",Ce=>{let tt=Ce.trim(),nt=parseInt(tt);nt>=1&&nt<=E.length?(process.stdout.write(`
1652
+ `),ge(E[nt-1])):nt===E.length+1||tt===""?(process.stdout.write(` ${ie}\u203A${A} `),m.once("line",Tn=>{process.stdout.write(`
1653
+ `),ge(Tn.trim()||"")})):(process.stdout.write(`
1654
+ `),ge(tt))})})});let y=new sT;y.activate(m),global._nexFooter=y,global._nexRawWrite=x=>y.rawWrite(x),nT(()=>xr()),process.stdout.isTTY&&process.stdout.write("\x1B[H\x1B[2J\x1B[3J");let w=l.providerName==="ollama"?l.model.id:`${l.providerName}:${l.model.id}`;YE(w,Ht,{yolo:Vl()});{y.setStatusInfo({model:w,branch:"",project:et.basename(Ht)});let{execFile:x}=require("child_process");x("git",["rev-parse","--abbrev-ref","HEAD"],{encoding:"utf8"},(E,A)=>{!E&&A&&y.setStatusInfo({model:w,branch:A.trim(),project:et.basename(Ht)})})}d.hasNewVersion&&console.log(`${a.yellow}\u{1F4A1} New version available!${a.reset} Run ${a.cyan}npm update -g nex-code${a.reset} to upgrade from ${a.dim}${d.currentVersion}${a.reset} to ${a.green}${d.latestVersion}${a.reset}
1655
+ `),await Hg(Ht);let v=!1,M=0,C=!1,S=null;function O(){Wg(),y.deactivate(),Bg(),process.stdin.isTTY&&process.stdout.write("\x1B[?2004l"),process.stdout.write("\x1B[r\x1B[H\x1B[2J\x1B[3J"),process.exit(0)}process.on("SIGTERM",O),process.on("exit",()=>{Wg()}),m.on("SIGINT",()=>{if(Bg(),M++,M>=2){O();return}if(v){nn&&nn.abort();let{cancelPendingAskUser:x}=Gt();x(),console.log(`
1656
1656
  ${a.yellow} Task cancelled. Press Ctrl+C again to exit.${a.reset}`),v=!1,m.setPrompt(Lt()),m.prompt()}else console.log(`${a.dim} (Press Ctrl+C again to exit)${a.reset}`),m.setPrompt(Lt()),m.prompt(),S&&clearTimeout(S),S=setTimeout(()=>{M=0,S=null},2e3)}),process.on("SIGINT",()=>{process.stdin.isTTY?(M++,M>=2&&O()):O()});let D=!1,K=[],V=0,X={},B=!1;function R(){let x=K.join(`
1657
1657
  `).replace(/\r/g,"").trim();if(K=[],D=!1,!x)return!0;V++,B=!0;let E=V;X[E]=x;let A=x.split(`
1658
- `).length,T=A>1?`[Pasted content #${E} \u2014 ${A} lines]`:`[Pasted content #${E}]`,L=m.line||"",ae=L&&!L.endsWith(" ")?" ":"",se=L+ae+T;return m.setPrompt(Lt()),m.prompt(),m.line=se,m.cursor=se.length,m._refreshLine(),!0}function $e(x){return x.replace(/\[Pasted content #(\d+)(?:[^\]]*)\]/g,(E,A)=>X[Number(A)]||"")}function be(){V=0,X={},B=!1}if(process.stdin.isTTY){process.stdout.write("\x1B[?2004h");let x=process.stdin.emit.bind(process.stdin);process.stdin.emit=function(E,...A){if(E!=="data")return x.call(process.stdin,E,...A);let T=A[0];if(Buffer.isBuffer(T)&&(T=T.toString("utf8")),typeof T!="string")return x.call(process.stdin,E,...A);let L=T.includes(su),ae=T.includes(ou);if(L&&ae){let se=vr(T);return se&&K.push(...se.split(`
1658
+ `).length,T=A>1?`[Pasted content #${E} \u2014 ${A} lines]`:`[Pasted content #${E}]`,L=m.line||"",ie=L&&!L.endsWith(" ")?" ":"",se=L+ie+T;return m.setPrompt(Lt()),m.prompt(),m.line=se,m.cursor=se.length,m._refreshLine(),!0}function ye(x){return x.replace(/\[Pasted content #(\d+)(?:[^\]]*)\]/g,(E,A)=>X[Number(A)]||"")}function be(){V=0,X={},B=!1}if(process.stdin.isTTY){process.stdout.write("\x1B[?2004h");let x=process.stdin.emit.bind(process.stdin);process.stdin.emit=function(E,...A){if(E!=="data")return x.call(process.stdin,E,...A);let T=A[0];if(Buffer.isBuffer(T)&&(T=T.toString("utf8")),typeof T!="string")return x.call(process.stdin,E,...A);let L=T.includes(su),ie=T.includes(ou);if(L&&ie){let se=vr(T);return se&&K.push(...se.split(`
1659
1659
  `)),R()}if(L){D=!0,K=[];let se=vr(T);return se&&K.push(...se.split(`
1660
- `)),!0}if(ae){let se=vr(T);return se&&K.push(...se.split(`
1660
+ `)),!0}if(ie){let se=vr(T);return se&&K.push(...se.split(`
1661
1661
  `)),R()}if(D){let se=vr(T);return se&&K.push(...se.split(`
1662
1662
  `)),!0}return T.includes(`
1663
1663
  `)&&T.length>40&&!D?(K.push(...T.replace(/\r/g,"").split(`
1664
- `)),R()):x.call(process.stdin,E,...A)}}let fe=0;function pe(){if(fe>0){let x=y._scrollEnd,E="\x1B7";for(let A=0;A<fe;A++)E+=`\x1B[${x-fe+1+A};1H\x1B[2K`;E+="\x1B8",y.rawWrite(E),fe=0}}function xe(x){let E=[...Sr,...ya()].filter(Ce=>Ce.cmd.startsWith(x));if(!E.length||E.length===1&&E[0].cmd===x)return;let A=y._scrollEnd,T=Math.min(10,A-2);if(T<1)return;let L=E.slice(0,T),ae=Math.max(...L.map(Ce=>Ce.cmd.length));fe=L.length,E.length>T&&fe++;let se=A-fe+1,we="\x1B7";for(let Ce=0;Ce<L.length;Ce++){let{cmd:tt,desc:nt}=L[Ce],Tn=tt.substring(0,x.length),wa=tt.substring(x.length),ba=" ".repeat(Math.max(0,ae-tt.length+2));we+=`\x1B[${se+Ce};1H\x1B[2K ${a.cyan}${Tn}${a.reset}${a.dim}${wa}${ba}${nt}${a.reset}`}E.length>T&&(we+=`\x1B[${se+L.length};1H\x1B[2K ${a.dim}\u2026 +${E.length-T} more${a.reset}`),we+="\x1B8",y.rawWrite(we)}process.stdin.isTTY&&process.stdin.on("keypress",(x,E)=>{pe(),!(E&&(E.name==="tab"||E.name==="return"))&&setImmediate(()=>{m.line&&m.line.startsWith("/")&&xe(m.line)})});let me=null,he=`${a.dim}...${a.reset} `;function Re(x){return(x.match(/[^\s\d](\d{1,2})\.\s+\S/g)||[]).length<2?x:x.replace(/([^\s\d])(\d{1,2})\.\s+/g,(A,T,L)=>`${T}
1665
- ${L}. `).trim()}let{loadSession:k}=Jt(),{setConversationMessages:j}=Se();if(e()===0){let x=k("_autosave");if(x&&x.messages&&x.messages.length>0&&Date.now()-new Date(x.updatedAt).getTime()<1440*60*1e3){let{confirm:A}=ft();if(await A("Previous session found. Resume?")){let ae=x.messages,se=ae.length>20?ae.slice(-20):ae;j(se);let{getUsage:we,forceCompress:Ce}=Rt();if(we(se,[]).percentage>=30){let{messages:nt}=Ce(se,[]);j(nt)}}}}m.setPrompt(Lt()),m.prompt(),m.on("line",async x=>{if(pe(),Object.keys(X).length>0&&(x=$e(x),be(),m.setPrompt(Lt())),v){let L=x.trim();if(L){let{injectMidRunNote:ae}=Se();ae(L),process.stdout.write(`${a.cyan} \u270E Queued \u2014 will be applied in the next step${a.reset}
1664
+ `)),R()):x.call(process.stdin,E,...A)}}let fe=0;function pe(){if(fe>0){let x=y._scrollEnd,E="\x1B7";for(let A=0;A<fe;A++)E+=`\x1B[${x-fe+1+A};1H\x1B[2K`;E+="\x1B8",y.rawWrite(E),fe=0}}function xe(x){let E=[...Sr,...ya()].filter(Ce=>Ce.cmd.startsWith(x));if(!E.length||E.length===1&&E[0].cmd===x)return;let A=y._scrollEnd,T=Math.min(10,A-2);if(T<1)return;let L=E.slice(0,T),ie=Math.max(...L.map(Ce=>Ce.cmd.length));fe=L.length,E.length>T&&fe++;let se=A-fe+1,ge="\x1B7";for(let Ce=0;Ce<L.length;Ce++){let{cmd:tt,desc:nt}=L[Ce],Tn=tt.substring(0,x.length),wa=tt.substring(x.length),ba=" ".repeat(Math.max(0,ie-tt.length+2));ge+=`\x1B[${se+Ce};1H\x1B[2K ${a.cyan}${Tn}${a.reset}${a.dim}${wa}${ba}${nt}${a.reset}`}E.length>T&&(ge+=`\x1B[${se+L.length};1H\x1B[2K ${a.dim}\u2026 +${E.length-T} more${a.reset}`),ge+="\x1B8",y.rawWrite(ge)}process.stdin.isTTY&&process.stdin.on("keypress",(x,E)=>{pe(),!(E&&(E.name==="tab"||E.name==="return"))&&setImmediate(()=>{m.line&&m.line.startsWith("/")&&xe(m.line)})});let me=null,he=`${a.dim}...${a.reset} `;function Re(x){return(x.match(/[^\s\d](\d{1,2})\.\s+\S/g)||[]).length<2?x:x.replace(/([^\s\d])(\d{1,2})\.\s+/g,(A,T,L)=>`${T}
1665
+ ${L}. `).trim()}let{loadSession:k}=Jt(),{setConversationMessages:j}=ve();if(e()===0){let x=k("_autosave");if(x&&x.messages&&x.messages.length>0&&Date.now()-new Date(x.updatedAt).getTime()<1440*60*1e3){let{confirm:A}=ft();if(await A("Previous session found. Resume?")){let ie=x.messages,se=ie.length>20?ie.slice(-20):ie;j(se);let{getUsage:ge,forceCompress:Ce}=Rt();if(ge(se,[]).percentage>=30){let{messages:nt}=Ce(se,[]);j(nt)}}}}m.setPrompt(Lt()),m.prompt(),m.on("line",async x=>{if(pe(),Object.keys(X).length>0&&(x=ye(x),be(),m.setPrompt(Lt())),v){let L=x.trim();if(L){let{injectMidRunNote:ie}=ve();ie(L),process.stdout.write(`${a.cyan} \u270E Queued \u2014 will be applied in the next step${a.reset}
1666
1666
  `),m.prompt()}return}if(me!==null){if(me._mode==="triple"){if(x.trim()==='"""'){let L=me.join(`
1667
- `).trim();if(me=null,L){$a(L.replace(/\n/g,"\\n")),v=!0,m.prompt(),M=0,C=!1,S&&(clearTimeout(S),S=null),tn=new AbortController;try{await n(L)}catch(se){if(!tn?.signal?.aborted){let we=se.message?.split(`
1668
- `)[0]||"An unexpected error occurred";console.log(`${a.red}Error: ${we}${a.reset}`)}}v=!1;let ae=A();ae>0&&process.stdout.write(`${a.gray}[${ae} messages] ${a.reset}`)}m.setPrompt(Lt()),m.prompt();return}me.push(x),m.setPrompt(he),m.prompt();return}if(x.endsWith("\\"))me.push(x.slice(0,-1));else{me.push(x);let L=me.join(`
1669
- `).trim();if(me=null,L){$a(L.replace(/\n/g,"\\n")),v=!0,m.prompt(),M=0,C=!1,S&&(clearTimeout(S),S=null),tn=new AbortController;try{await n(L)}catch(we){if(!tn?.signal?.aborted){let Ce=we.message?.split(`
1670
- `)[0]||"An unexpected error occurred";console.log(`${a.red}Error: ${Ce}${a.reset}`)}}let{getConversationLength:ae}=Se();v=!1;let se=ae();se>0&&process.stdout.write(`${a.gray}[${se} messages] ${a.reset}`)}m.setPrompt(Lt()),m.prompt();return}m.setPrompt(he),m.prompt();return}if(x.trim()==='"""'||x.trim().startsWith('"""')){let L=x.trim().substring(3);me=L?[L]:[],me._mode="triple",m.setPrompt(he),m.prompt();return}if(x.endsWith("\\")){me=[x.slice(0,-1)],me._mode="backslash",m.setPrompt(he),m.prompt();return}let E=Re(x.trim());if(!E){m.setPrompt(Lt()),m.prompt();return}if($a(E),E==="/"){Gg(),m.setPrompt(Lt()),m.prompt();return}if(E.startsWith("/")){await kr(E,m);let L=kr._pendingAgentPrompt;if(L){kr._pendingAgentPrompt=null,v=!0,m.prompt(),M=0,C=!1,S&&(clearTimeout(S),S=null),tn=new AbortController;try{await n(L)}catch(ae){if(!tn?.signal?.aborted){let se=ae.message?.split(`
1671
- `)[0]||"An unexpected error occurred";console.log(`${a.red}Error: ${se}${a.reset}`)}}v=!1}m.setPrompt(Lt()),m.prompt();return}{let L=zE?"\x1B[48;5;237m":"\x1B[48;2;220;225;235m",ae=process.stdout.columns||80,se=E.split(`
1672
- `);process.stdout.isTTY&&process.stdout.write(`\x1B[${se.length}A`),se.forEach((we,Ce)=>{let tt=Ce===0?"\x1B[1;36m\u203A\x1B[22;39m":" ",nt=2+we.length,Tn=" ".repeat(Math.max(0,ae-nt));console.log(`\x1B[2K${L}${tt} ${we}${Tn}\x1B[0m`)}),console.log()}if(process.env.NEX_AUTO_PLAN!=="0"&&!Vl()){let{isPlanMode:L,setPlanMode:ae}=ln(),{invalidateSystemPromptCache:se}=Se(),we=/\b(implement|refactor|migrate|redesign)\b/i,Ce=/\b(create|build|add|write|introduce|develop|set\s+up)\b/i,tt=/^(how|what|why|when|where|which|explain|show|list|tell|describe|can\s+you|could\s+you|do\s+you)\b/i,nt=/\b(spawn[_\s]?agents?|swarm)\b/i;!tt.test(E)&&!nt.test(E)&&(we.test(E)||Ce.test(E)&&E.split(/\s+/).length>=5)&&!L()&&(ae(!0),se(),console.log(`${a.cyan}${a.bold}\u2387 Auto Plan Mode${a.reset}${a.dim} \u2014 implementation task detected \xB7 read-only until /plan approve${a.reset}`))}{let{getConversationLength:L}=Se();if(L()===0)try{let{detectCategory:ae,getModelForCategory:se}=In(),we=ae(E);if(we&&we.id!=="coding"){let Ce=se(we.id),tt=En();if(Ce&&Ce!==tt?.id&&eu(Ce)){let nt=En();console.log(`${a.dim}\u21B3 ${we.icon} ${we.label} task \u2014 routing to ${nt?.name||Ce}${a.reset}`),global._nexFooter&&global._nexFooter.setStatusInfo({model:nt?.name||Ce})}}}catch{}}v=!0,m.prompt(),M=0,C=!1,S&&(clearTimeout(S),S=null),tn=new AbortController;try{await n(E)}catch(L){if(!tn?.signal?.aborted){let ae=L.message?.split(`
1673
- `)[0]||"An unexpected error occurred";console.log(`${a.red}Error: ${ae}${a.reset}`)}}v=!1;let{getConversationLength:A}=Se(),T=A();T>0&&process.stdout.write(`${a.gray}[${T} messages] ${a.reset}`),m.setPrompt(Lt()),m.prompt()}),m.on("close",()=>{process.stdin.isTTY&&process.stdout.write("\x1B[?2004l"),process.stdout.write("\x1B[r\x1B[H\x1B[2J\x1B[3J"),process.exit(0)})}Zg.exports={startREPL:aT,getPrompt:Lt,loadHistory:Vg,appendHistory:$a,getHistoryPath:nu,HISTORY_MAX:tu,showCommandList:Gg,completer:zg,completeFilePath:Yg,handleSlashCommand:kr,showProviders:Zl,showHelp:Xg,renderBar:Jg,hasPasteStart:oT,hasPasteEnd:rT,stripPasteSequences:vr,getAbortSignal:Kg}});var e$=Q((GR,Qg)=>{"use strict";var cT=require("readline");function Ss(t){process.stdout.write(JSON.stringify(t)+`
1667
+ `).trim();if(me=null,L){$a(L.replace(/\n/g,"\\n")),v=!0,m.prompt(),M=0,C=!1,S&&(clearTimeout(S),S=null),nn=new AbortController;try{await n(L)}catch(se){if(!nn?.signal?.aborted){let ge=se.message?.split(`
1668
+ `)[0]||"An unexpected error occurred";console.log(`${a.red}Error: ${ge}${a.reset}`)}}v=!1;let ie=A();ie>0&&process.stdout.write(`${a.gray}[${ie} messages] ${a.reset}`)}m.setPrompt(Lt()),m.prompt();return}me.push(x),m.setPrompt(he),m.prompt();return}if(x.endsWith("\\"))me.push(x.slice(0,-1));else{me.push(x);let L=me.join(`
1669
+ `).trim();if(me=null,L){$a(L.replace(/\n/g,"\\n")),v=!0,m.prompt(),M=0,C=!1,S&&(clearTimeout(S),S=null),nn=new AbortController;try{await n(L)}catch(ge){if(!nn?.signal?.aborted){let Ce=ge.message?.split(`
1670
+ `)[0]||"An unexpected error occurred";console.log(`${a.red}Error: ${Ce}${a.reset}`)}}let{getConversationLength:ie}=ve();v=!1;let se=ie();se>0&&process.stdout.write(`${a.gray}[${se} messages] ${a.reset}`)}m.setPrompt(Lt()),m.prompt();return}m.setPrompt(he),m.prompt();return}if(x.trim()==='"""'||x.trim().startsWith('"""')){let L=x.trim().substring(3);me=L?[L]:[],me._mode="triple",m.setPrompt(he),m.prompt();return}if(x.endsWith("\\")){me=[x.slice(0,-1)],me._mode="backslash",m.setPrompt(he),m.prompt();return}let E=Re(x.trim());if(!E){m.setPrompt(Lt()),m.prompt();return}if($a(E),E==="/"){Gg(),m.setPrompt(Lt()),m.prompt();return}if(E.startsWith("/")){await kr(E,m);let L=kr._pendingAgentPrompt;if(L){kr._pendingAgentPrompt=null;try{let{isPlanMode:ie,setPlanMode:se}=Vt(),{invalidateSystemPromptCache:ge}=ve();ie()&&(se(!1),ge())}catch{}v=!0,m.prompt(),M=0,C=!1,S&&(clearTimeout(S),S=null),nn=new AbortController;try{await n(L,null,{autoOrchestrate:!1,skipPhaseRouting:!0,maxIterations:200})}catch(ie){if(!nn?.signal?.aborted){let se=ie.message?.split(`
1671
+ `)[0]||"An unexpected error occurred";console.log(`${a.red}Error: ${se}${a.reset}`)}}v=!1}m.setPrompt(Lt()),m.prompt();return}{let L=zE?"\x1B[48;5;237m":"\x1B[48;2;220;225;235m",ie=process.stdout.columns||80,se=E.split(`
1672
+ `);process.stdout.isTTY&&process.stdout.write(`\x1B[${se.length}A`),se.forEach((ge,Ce)=>{let tt=Ce===0?"\x1B[1;36m\u203A\x1B[22;39m":" ",nt=2+ge.length,Tn=" ".repeat(Math.max(0,ie-nt));console.log(`\x1B[2K${L}${tt} ${ge}${Tn}\x1B[0m`)}),console.log()}if(process.env.NEX_AUTO_PLAN!=="0"&&!Vl()){let{isPlanMode:L,setPlanMode:ie}=Vt(),{invalidateSystemPromptCache:se}=ve(),ge=/\b(implement|refactor|migrate|redesign)\b/i,Ce=/\b(create|build|add|write|introduce|develop|set\s+up)\b/i,tt=/^(how|what|why|when|where|which|explain|show|list|tell|describe|can\s+you|could\s+you|do\s+you)\b/i,nt=/\b(spawn[_\s]?agents?|swarm)\b/i;!tt.test(E)&&!nt.test(E)&&(ge.test(E)||Ce.test(E)&&E.split(/\s+/).length>=5)&&!L()&&(ie(!0),se(),console.log(`${a.cyan}${a.bold}\u2387 Auto Plan Mode${a.reset}${a.dim} \u2014 implementation task detected \xB7 read-only until /plan approve${a.reset}`))}{let{getConversationLength:L}=ve();if(L()===0)try{let{detectCategory:ie,getModelForCategory:se}=In(),ge=ie(E);if(ge&&ge.id!=="coding"){let Ce=se(ge.id),tt=En();if(Ce&&Ce!==tt?.id&&eu(Ce)){let nt=En();console.log(`${a.dim}\u21B3 ${ge.icon} ${ge.label} task \u2014 routing to ${nt?.name||Ce}${a.reset}`),global._nexFooter&&global._nexFooter.setStatusInfo({model:nt?.name||Ce})}}}catch{}}v=!0,m.prompt(),M=0,C=!1,S&&(clearTimeout(S),S=null),nn=new AbortController;try{await n(E)}catch(L){if(!nn?.signal?.aborted){let ie=L.message?.split(`
1673
+ `)[0]||"An unexpected error occurred";console.log(`${a.red}Error: ${ie}${a.reset}`)}}v=!1;let{getConversationLength:A}=ve(),T=A();T>0&&process.stdout.write(`${a.gray}[${T} messages] ${a.reset}`),m.setPrompt(Lt()),m.prompt()}),m.on("close",()=>{process.stdin.isTTY&&process.stdout.write("\x1B[?2004l"),process.stdout.write("\x1B[r\x1B[H\x1B[2J\x1B[3J"),process.exit(0)})}Zg.exports={startREPL:aT,getPrompt:Lt,loadHistory:Vg,appendHistory:$a,getHistoryPath:nu,HISTORY_MAX:tu,showCommandList:Gg,completer:zg,completeFilePath:Yg,handleSlashCommand:kr,showProviders:Zl,showHelp:Xg,renderBar:Jg,hasPasteStart:oT,hasPasteEnd:rT,stripPasteSequences:vr,getAbortSignal:Kg}});var e$=Q((GR,Qg)=>{"use strict";var cT=require("readline");function Ss(t){process.stdout.write(JSON.stringify(t)+`
1674
1674
  `)}function lT(){process.env.NEX_SERVER="1";let t=(...c)=>process.stderr.write(c.map(String).join(" ")+`
1675
- `);console.log=t,console.warn=t,console.info=t;let{setConfirmHook:e}=ft(),n=new Map,o=0;e((c,l)=>{let u="cfm-"+ ++o,d=l?.toolName||"",f=!1;try{let{isCritical:p}=ft();f=p(c)}catch{}return Ss({type:"confirm_request",id:u,question:c,tool:d,critical:f}),new Promise(p=>{n.set(u,p)})});let s=null,r={onToken(c){s&&Ss({type:"token",id:s,text:c})},onThinkingToken(){},onToolStart(c,l){s&&Ss({type:"tool_start",id:s,tool:c,args:l||{}})},onToolEnd(c,l,u){s&&Ss({type:"tool_end",id:s,tool:c,summary:l||"",ok:!!u})}},i=cT.createInterface({input:process.stdin,output:null,terminal:!1});Ss({type:"ready"}),i.on("line",async c=>{let l=c.trim();if(!l)return;let u;try{u=JSON.parse(l)}catch{return}switch(u.type){case"chat":{let d=u.id||"msg-"+Date.now();s=d;let{processInput:f}=Se();try{await f(u.text,r),Ss({type:"done",id:d})}catch(p){Ss({type:"error",id:d,message:p?.message||String(p)})}finally{s=null}break}case"confirm":{let d=n.get(u.id);d&&(n.delete(u.id),d(!!u.answer));break}case"cancel":{for(let[d,f]of n)n.delete(d),f(!1);break}case"clear":{let{clearConversation:d}=Se();d();for(let[f,p]of n)n.delete(f),p(!1);break}default:break}}),i.on("close",()=>{process.exit(0)})}Qg.exports={startServerMode:lT}});var n$=Q((YR,t$)=>{t$.exports=ru()});var uu=require("path");require("dotenv").config({path:uu.join(__dirname,"..",".env")});require("dotenv").config();var ve=process.argv.slice(2);(ve.includes("--help")||ve.includes("-h"))&&(console.log(`Usage: nex-code [options]
1675
+ `);console.log=t,console.warn=t,console.info=t;let{setConfirmHook:e}=ft(),n=new Map,o=0;e((c,l)=>{let u="cfm-"+ ++o,d=l?.toolName||"",f=!1;try{let{isCritical:p}=ft();f=p(c)}catch{}return Ss({type:"confirm_request",id:u,question:c,tool:d,critical:f}),new Promise(p=>{n.set(u,p)})});let s=null,r={onToken(c){s&&Ss({type:"token",id:s,text:c})},onThinkingToken(){},onToolStart(c,l){s&&Ss({type:"tool_start",id:s,tool:c,args:l||{}})},onToolEnd(c,l,u){s&&Ss({type:"tool_end",id:s,tool:c,summary:l||"",ok:!!u})}},i=cT.createInterface({input:process.stdin,output:null,terminal:!1});Ss({type:"ready"}),i.on("line",async c=>{let l=c.trim();if(!l)return;let u;try{u=JSON.parse(l)}catch{return}switch(u.type){case"chat":{let d=u.id||"msg-"+Date.now();s=d;let{processInput:f}=ve();try{await f(u.text,r),Ss({type:"done",id:d})}catch(p){Ss({type:"error",id:d,message:p?.message||String(p)})}finally{s=null}break}case"confirm":{let d=n.get(u.id);d&&(n.delete(u.id),d(!!u.answer));break}case"cancel":{for(let[d,f]of n)n.delete(d),f(!1);break}case"clear":{let{clearConversation:d}=ve();d();for(let[f,p]of n)n.delete(f),p(!1);break}default:break}}),i.on("close",()=>{process.exit(0)})}Qg.exports={startServerMode:lT}});var n$=Q((YR,t$)=>{t$.exports=ru()});var uu=require("path");require("dotenv").config({path:uu.join(__dirname,"..",".env")});require("dotenv").config();var ke=process.argv.slice(2);(ke.includes("--help")||ke.includes("-h"))&&(console.log(`Usage: nex-code [options]
1676
1676
 
1677
1677
  Options:
1678
1678
  --task <prompt> Run a single task and exit (headless mode)
@@ -1692,6 +1692,6 @@ Options:
1692
1692
  --mcp-config <path> Path to MCP server config (default: .nex/mcp.json)
1693
1693
  -h, --help Show this help
1694
1694
  -v, --version Show version
1695
- `),process.exit(0));if(ve.includes("-v")||ve.includes("--version")){let t=As();console.log(t.version),process.exit(0)}var r$=ve.includes("--yolo")||ve.includes("-yolo");if(r$){let{setAutoConfirm:t}=ft();t(!0)}if(!r$)try{let t=require("fs"),e=uu.join(process.cwd(),".nex","config.json");if(t.existsSync(e)&&JSON.parse(t.readFileSync(e,"utf-8")).yolo===!0){let{setAutoConfirm:o}=ft();o(!0)}}catch{}var iu=ve.indexOf("--model");if(iu!==-1&&ve[iu+1]){let{setActiveModel:t}=je();t(ve[iu+1])}var au=ve.indexOf("--max-turns");if(au!==-1&&ve[au+1]){let t=parseInt(ve[au+1],10);if(t>0){let{setMaxIterations:e}=Se();e(t)}}else try{let t=require("fs"),e=uu.join(process.cwd(),".nex","config.json");if(t.existsSync(e)){let n=JSON.parse(t.readFileSync(e,"utf-8")),o=parseInt(n.maxIterations,10);if(o>0){let{setMaxIterations:s}=Se();s(o)}}}catch{}var cu=ve.indexOf("--mcp-config");cu!==-1&&ve[cu+1]&&(process.env.NEX_MCP_CONFIG=ve[cu+1]);function lu(){if(process.platform==="darwin")try{let{spawn:t}=require("child_process"),e=t("caffeinate",["-i","-m"],{stdio:"ignore",detached:!1});e.unref();let n=()=>{try{e.kill()}catch{}};process.on("exit",n),process.on("SIGINT",n),process.on("SIGTERM",n)}catch{}}async function uT(){let{runSetupWizard:t}=Ll();await t()}function s$(t){if(ve.includes("--auto")){let{setAutoConfirm:c}=ft();c(!0)}if(!ve.includes("--model")){let{setActiveModel:c}=je(),l=process.env.HEADLESS_MODEL||"devstral-small-2:24b";c(l)}let n=!ve.includes("--no-auto-orchestrate")&&process.env.NEX_AUTO_ORCHESTRATE!=="false",o=ve.indexOf("--orchestrator-model"),s=o!==-1?ve[o+1]:void 0;if(t.startsWith("/")){let{handleSlashCommand:c}=ru();c(t,null).then(()=>process.exit(0)).catch(l=>{console.error(l.message),process.exit(1)});return}let{processInput:r,getConversationMessages:i}=Se();r(t,null,{autoOrchestrate:n,orchestratorModel:s}).then(()=>{if(ve.includes("--json")){let l=i().filter(u=>u.role==="assistant").pop();console.log(JSON.stringify({success:!0,response:l?.content||""}))}process.exit(0)}).catch(c=>{ve.includes("--json")?console.log(JSON.stringify({success:!1,error:c.message})):console.error(c.message),process.exit(1)})}if(ve.includes("--server")){let{setAutoConfirm:t}=ft();t(!0),e$().startServerMode();return}var o$=ve.indexOf("--prompt-file");if(o$!==-1){let t=ve[o$+1];(!t||t.startsWith("--"))&&(console.error("--prompt-file requires a file path"),process.exit(1));let e=require("fs"),n;try{n=e.readFileSync(t,"utf-8").trim()}catch(o){console.error(`--prompt-file: cannot read file: ${o.message}`),process.exit(1)}if(n||(console.error("--prompt-file: file is empty"),process.exit(1)),ve.includes("--delete-prompt-file"))try{e.unlinkSync(t)}catch{}lu(),s$(n)}else{let t=ve.indexOf("--task")!==-1?ve.indexOf("--task"):ve.indexOf("--prompt");if(t!==-1){let e=ve[t+1];if((!e||e.startsWith("--"))&&(console.error("--task/--prompt requires a prompt"),process.exit(1)),lu(),ve.includes("--orchestrate")){let n=ve.indexOf("--orchestrator-model"),o=n!==-1?ve[n+1]:void 0,{runOrchestrated:s}=sr();s(e,{orchestratorModel:o}).then(()=>{process.exit(0)}).catch(r=>{console.error(`Orchestrator error: ${r.message}`),process.exit(1)})}else s$(e)}else uT().then(()=>{lu();let{startREPL:e}=n$();e(),setTimeout(async()=>{try{let{loadKnownModels:n,findNewModels:o}=po(),s=n(),r=s.lastChecked?new Date(s.lastChecked):null;if((r?(Date.now()-r.getTime())/864e5:999)<7||!process.env.OLLAMA_API_KEY)return;let{newModels:c}=await o();if(c.length>0){let{C:l}=Fe();process.stdout.write(`
1695
+ `),process.exit(0));if(ke.includes("-v")||ke.includes("--version")){let t=As();console.log(t.version),process.exit(0)}var r$=ke.includes("--yolo")||ke.includes("-yolo");if(r$){let{setAutoConfirm:t}=ft();t(!0)}if(!r$)try{let t=require("fs"),e=uu.join(process.cwd(),".nex","config.json");if(t.existsSync(e)&&JSON.parse(t.readFileSync(e,"utf-8")).yolo===!0){let{setAutoConfirm:o}=ft();o(!0)}}catch{}var iu=ke.indexOf("--model");if(iu!==-1&&ke[iu+1]){let{setActiveModel:t}=je();t(ke[iu+1])}var au=ke.indexOf("--max-turns");if(au!==-1&&ke[au+1]){let t=parseInt(ke[au+1],10);if(t>0){let{setMaxIterations:e}=ve();e(t)}}else try{let t=require("fs"),e=uu.join(process.cwd(),".nex","config.json");if(t.existsSync(e)){let n=JSON.parse(t.readFileSync(e,"utf-8")),o=parseInt(n.maxIterations,10);if(o>0){let{setMaxIterations:s}=ve();s(o)}}}catch{}var cu=ke.indexOf("--mcp-config");cu!==-1&&ke[cu+1]&&(process.env.NEX_MCP_CONFIG=ke[cu+1]);function lu(){if(process.platform==="darwin")try{let{spawn:t}=require("child_process"),e=t("caffeinate",["-i","-m"],{stdio:"ignore",detached:!1});e.unref();let n=()=>{try{e.kill()}catch{}};process.on("exit",n),process.on("SIGINT",n),process.on("SIGTERM",n)}catch{}}async function uT(){let{runSetupWizard:t}=Ll();await t()}function s$(t){if(ke.includes("--auto")){let{setAutoConfirm:c}=ft();c(!0)}if(!ke.includes("--model")){let{setActiveModel:c}=je(),l=process.env.HEADLESS_MODEL||"devstral-small-2:24b";c(l)}let n=!ke.includes("--no-auto-orchestrate")&&process.env.NEX_AUTO_ORCHESTRATE!=="false",o=ke.indexOf("--orchestrator-model"),s=o!==-1?ke[o+1]:void 0;if(t.startsWith("/")){let{handleSlashCommand:c}=ru();c(t,null).then(()=>process.exit(0)).catch(l=>{console.error(l.message),process.exit(1)});return}let{processInput:r,getConversationMessages:i}=ve();r(t,null,{autoOrchestrate:n,orchestratorModel:s}).then(()=>{if(ke.includes("--json")){let l=i().filter(u=>u.role==="assistant").pop();console.log(JSON.stringify({success:!0,response:l?.content||""}))}process.exit(0)}).catch(c=>{ke.includes("--json")?console.log(JSON.stringify({success:!1,error:c.message})):console.error(c.message),process.exit(1)})}if(ke.includes("--server")){let{setAutoConfirm:t}=ft();t(!0),e$().startServerMode();return}var o$=ke.indexOf("--prompt-file");if(o$!==-1){let t=ke[o$+1];(!t||t.startsWith("--"))&&(console.error("--prompt-file requires a file path"),process.exit(1));let e=require("fs"),n;try{n=e.readFileSync(t,"utf-8").trim()}catch(o){console.error(`--prompt-file: cannot read file: ${o.message}`),process.exit(1)}if(n||(console.error("--prompt-file: file is empty"),process.exit(1)),ke.includes("--delete-prompt-file"))try{e.unlinkSync(t)}catch{}lu(),s$(n)}else{let t=ke.indexOf("--task")!==-1?ke.indexOf("--task"):ke.indexOf("--prompt");if(t!==-1){let e=ke[t+1];if((!e||e.startsWith("--"))&&(console.error("--task/--prompt requires a prompt"),process.exit(1)),lu(),ke.includes("--orchestrate")){let n=ke.indexOf("--orchestrator-model"),o=n!==-1?ke[n+1]:void 0,{runOrchestrated:s}=sr();s(e,{orchestratorModel:o}).then(()=>{process.exit(0)}).catch(r=>{console.error(`Orchestrator error: ${r.message}`),process.exit(1)})}else s$(e)}else uT().then(()=>{lu();let{startREPL:e}=n$();e(),setTimeout(async()=>{try{let{loadKnownModels:n,findNewModels:o}=po(),s=n(),r=s.lastChecked?new Date(s.lastChecked):null;if((r?(Date.now()-r.getTime())/864e5:999)<7||!process.env.OLLAMA_API_KEY)return;let{newModels:c}=await o();if(c.length>0){let{C:l}=Fe();process.stdout.write(`
1696
1696
  ${l.dim}\u{1F4A1} ${c.length} new Ollama Cloud model(s) available \u2014 /benchmark --discover to test them${l.reset}
1697
1697
  `)}}catch{}},3e3)})}