@mk-co/neox-cli 2.0.43 → 2.0.44
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/cli/main.js +320 -320
- package/dist/sdk/index.js +3 -3
- package/dist/server/main.js +1 -1
- package/package.json +1 -1
package/dist/sdk/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import*as Me from'fs';import Me__default,{realpathSync,readlinkSync,readdirSync,
|
|
|
2
2
|
`)}function _g(a){return a.replace(/'/g,"'\\''")}function ia(a,e,t){if(process.env.CLI_DEBUG!=="1")return;let s=Ft(a,e,t);m.info("CURL","=== LLM Request CURL Command ==="),m.info("CURL",s),m.info("CURL","=== End CURL Command ==="),process.env.CLI_DEBUG_CONSOLE==="1"&&(console.log(`
|
|
3
3
|
[CURL] === LLM Request CURL Command ===`),console.log(s),console.log(`[CURL] === End CURL Command ===
|
|
4
4
|
`));}function ye(a,e,t){if(process.env.CLI_DEBUG==="1"&&(m.debug(a,e,t),process.env.CLI_DEBUG_CONSOLE==="1")){let s=a?`[${a}]`:"";t!==void 0?console.log(s,e,t):console.log(s,e);}}function Ag(){process.on("uncaughtException",a=>{m.error("CRASH","Uncaught Exception",{name:a.name,message:a.message,stack:a.stack}),setTimeout(()=>process.exit(1),100);}),process.on("unhandledRejection",a=>{m.error("CRASH","Unhandled Rejection",{reason:a instanceof Error?{name:a.name,message:a.message,stack:a.stack}:a});});try{process.on("SIGTTIN","ignore"),process.on("SIGTTOU","ignore"),m.info("SIGNAL","TTY control signals (SIGTTIN/SIGTTOU) initialized in crashHandler");}catch{}process.on("exit",()=>{m.close();});}var na,m,xg,ra,Rg,W=vg(()=>{na=class{logDir;enabled=true;initialized=false;writeStream=null;currentLogFile=null;backpressured=false;constructor(){this.logDir=se__default.join(Dn__default.homedir(),".neox","logs");}init(){if(!this.initialized)try{Me__default.existsSync(this.logDir)||Me__default.mkdirSync(this.logDir,{recursive:!0}),this.initialized=!0;}catch{this.enabled=false;}}getLogFilePath(){let e=new Date().toISOString().split("T")[0];return se__default.join(this.logDir,`cli-${e}.log`)}ensureStream(){if(!this.enabled||(this.init(),!this.initialized))return null;let e=this.getLogFilePath();return this.currentLogFile!==e&&(this.writeStream&&this.writeStream.end(),this.writeStream=Me__default.createWriteStream(e,{flags:"a"}),this.writeStream.on("error",()=>{this.enabled=false,this.currentLogFile=null;let t=this.writeStream;this.writeStream=null;try{t?.destroy();}catch{}}),this.currentLogFile=e),this.writeStream}formatLocalTime(){let e=new Date,t=e.getFullYear(),s=String(e.getMonth()+1).padStart(2,"0"),n=String(e.getDate()).padStart(2,"0"),r=String(e.getHours()).padStart(2,"0"),i=String(e.getMinutes()).padStart(2,"0"),o=String(e.getSeconds()).padStart(2,"0"),l=String(e.getMilliseconds()).padStart(3,"0");return `${t}-${s}-${n} ${r}:${i}:${o}.${l}`}formatMessage(e,t,s,n){let r=this.formatLocalTime(),i=e.toUpperCase().padEnd(5),o=t?`[${t}]`:"",l=`${r} ${i} ${o} ${s}`;if(n!==void 0)try{let c=this.safeStringify(n);l+=` ${c}`;}catch{l+=" [Serialization Error]";}return l+`
|
|
5
|
-
`}safeStringify(e){let t=new WeakSet;return JSON.stringify(e,(s,n)=>{if(typeof n=="object"&&n!==null){if(t.has(n))return "[Circular]";t.add(n);}return s==="parser"||s==="socket"||s==="_httpMessage"||s==="req"||s==="res"?"[Omitted]":n&&n.type==="Buffer"&&Array.isArray(n.data)?"[Buffer]":typeof n=="function"?"[Function]":n instanceof Error?{name:n.name,message:n.message,stack:n.stack}:n})}write(e,t,s,n){if(!this.enabled||this.backpressured&&e==="debug")return;let r=this.formatMessage(e,t,s,n);if(process.env.CLI_DEBUG_CONSOLE==="1")try{process.stderr.write(r);}catch{}let i=this.ensureStream();if(!i)return;!i.write(r)&&!this.backpressured&&(this.backpressured=true,i.once("drain",()=>{this.backpressured=false;}));}debug(e,t,s){this.write("debug",e,t,s);}info(e,t,s){this.write("info",e,t,s);}warn(e,t,s){this.write("warn",e,t,s);}error(e,t,s){this.write("error",e,t,s);}log(e,...t){let s=t.map(n=>{if(typeof n=="string")return n;try{return this.safeStringify(n)}catch{return String(n)}}).join(" ");this.write("info",e,s);}setEnabled(e){this.enabled=e;}getLogDir(){return this.logDir}getCurrentLogFile(){return this.currentLogFile}close(){this.writeStream&&(this.writeStream.end(),this.writeStream=null,this.currentLogFile=null);}},m=new na,xg=new Set(["api_key","apikey","authorization","token","access_token","refresh_token","password","secret"]);ra=class{intervalId=null;lastHeartbeat=Date.now();heartbeatCount=0;stdinPausedCount=0;enabled=false;pid=process.pid;start(e=5e3){if(!(this.intervalId||process.env.CLI_DEBUG!=="1")){if(!process.stdin.isTTY){m.debug("HEALTH",`Skipping health monitor in non-TTY process (pid=${this.pid})`);return}this.enabled=true,this.lastHeartbeat=Date.now(),this.heartbeatCount=0,this.stdinPausedCount=0,m.info("HEALTH",`Health monitor started (interval: ${e}ms, pid=${this.pid})`),this.intervalId=setInterval(()=>{this.checkHealth();},e),this.intervalId.unref();}}stop(){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null,this.enabled=false,m.info("HEALTH","Health monitor stopped"));}stdinDestroyedCount=0;checkHealth(){let e=Date.now(),t=e-this.lastHeartbeat;this.lastHeartbeat=e,this.heartbeatCount++;let s=this.getStdinState();if(s.isPaused?this.stdinPausedCount++:this.stdinPausedCount=0,s.destroyed){if(this.stdinDestroyedCount++,this.stdinDestroyedCount>=3){m.warn("HEALTH",`[pid=${this.pid}] stdin destroyed for ${this.stdinDestroyedCount} checks, exiting to avoid zombie process`),this.stop(),setTimeout(()=>{process.exit(0);},100);return}}else this.stdinDestroyedCount=0;m.debug("HEALTH",`[pid=${this.pid}] Heartbeat #${this.heartbeatCount}`,{elapsed:`${t}ms`,stdin:s,stdinPausedCount:this.stdinPausedCount}),this.stdinPausedCount>=3&&m.warn("HEALTH",`[pid=${this.pid}] \u26A0\uFE0F stdin has been paused for ${this.stdinPausedCount} consecutive checks!`,{stdin:s}),t>1e4&&m.warn("HEALTH",`[pid=${this.pid}] \u26A0\uFE0F Event loop delay detected: ${t}ms (expected ~5000ms)`);}getStdinState(){let e=process.stdin;return {isPaused:typeof e.isPaused=="function"?e.isPaused():false,isTTY:!!e.isTTY,isRaw:!!e.isRaw,readable:e.readable,destroyed:e.destroyed}}logStdinState(e){if(process.env.CLI_DEBUG!=="1")return;let t=this.getStdinState();m.debug("STDIN",`[${e}] stdin state`,t);}logInkState(e,t){process.env.CLI_DEBUG==="1"&&m.debug("INK",`[${e}]`,t);}},Rg=new ra;});var Hu=Yc((a0,zu)=>{zu.exports=Wu;function Wu(a,e,t){a instanceof RegExp&&(a=Uu(a,t)),e instanceof RegExp&&(e=Uu(e,t));var s=qu(a,e,t);return s&&{start:s[0],end:s[1],pre:t.slice(0,s[0]),body:t.slice(s[0]+a.length,s[1]),post:t.slice(s[1]+e.length)}}function Uu(a,e){var t=e.match(a);return t?t[0]:null}Wu.range=qu;function qu(a,e,t){var s,n,r,i,o,l=t.indexOf(a),c=t.indexOf(e,l+1),u=l;if(l>=0&&c>0){if(a===e)return [l,c];for(s=[],r=t.length;u>=0&&!o;)u==l?(s.push(u),l=t.indexOf(a,u+1)):s.length==1?o=[s.pop(),c]:(n=s.pop(),n<r&&(r=n,i=c),c=t.indexOf(e,u+1)),u=l<c&&l>=0?l:c;s.length&&(o=[r,i]);}return o}});var ed=Yc((l0,Zu)=>{var Ju=Hu();Zu.exports=Mf;var Ku="\0SLASH"+Math.random()+"\0",Vu="\0OPEN"+Math.random()+"\0",Ba="\0CLOSE"+Math.random()+"\0",Yu="\0COMMA"+Math.random()+"\0",Xu="\0PERIOD"+Math.random()+"\0";function ja(a){return parseInt(a,10)==a?parseInt(a,10):a.charCodeAt(0)}function Ef(a){return a.split("\\\\").join(Ku).split("\\{").join(Vu).split("\\}").join(Ba).split("\\,").join(Yu).split("\\.").join(Xu)}function If(a){return a.split(Ku).join("\\").split(Vu).join("{").split(Ba).join("}").split(Yu).join(",").split(Xu).join(".")}function Qu(a){if(!a)return [""];var e=[],t=Ju("{","}",a);if(!t)return a.split(",");var s=t.pre,n=t.body,r=t.post,i=s.split(",");i[i.length-1]+="{"+n+"}";var o=Qu(r);return r.length&&(i[i.length-1]+=o.shift(),i.push.apply(i,o)),e.push.apply(e,i),e}function Mf(a){return a?(a.substr(0,2)==="{}"&&(a="\\{\\}"+a.substr(2)),Wn(Ef(a),true).map(If)):[]}function Pf(a){return "{"+a+"}"}function Df(a){return /^-?0\d/.test(a)}function Lf(a,e){return a<=e}function Of(a,e){return a>=e}function Wn(a,e){var t=[],s=Ju("{","}",a);if(!s)return [a];var n=s.pre,r=s.post.length?Wn(s.post,false):[""];if(/\$$/.test(s.pre))for(var i=0;i<r.length;i++){var o=n+"{"+s.body+"}"+r[i];t.push(o);}else {var l=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(s.body),c=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(s.body),u=l||c,d=s.body.indexOf(",")>=0;if(!u&&!d)return s.post.match(/,(?!,).*\}/)?(a=s.pre+"{"+s.body+Ba+s.post,Wn(a)):[a];var p;if(u)p=s.body.split(/\.\./);else if(p=Qu(s.body),p.length===1&&(p=Wn(p[0],false).map(Pf),p.length===1))return r.map(function(R){return s.pre+p[0]+R});var h;if(u){var g=ja(p[0]),f=ja(p[1]),b=Math.max(p[0].length,p[1].length),y=p.length==3?Math.abs(ja(p[2])):1,w=Lf,C=f<g;C&&(y*=-1,w=Of);var k=p.some(Df);h=[];for(var T=g;w(T,f);T+=y){var _;if(c)_=String.fromCharCode(T),_==="\\"&&(_="");else if(_=String(T),k){var M=b-_.length;if(M>0){var F=new Array(M+1).join("0");T<0?_="-"+F+_.slice(1):_=F+_;}}h.push(_);}}else {h=[];for(var x=0;x<p.length;x++)h.push.apply(h,Wn(p[x],false));}for(var x=0;x<h.length;x++)for(var i=0;i<r.length;i++){var o=n+h[x]+r[i];(!e||u||o)&&t.push(o);}}return t}});W();var Wr=class{hosts=new Map;hostConfigs=new Map;workspacePath=null;setWorkspace(e){this.workspacePath=e;for(let t of this.hosts.values())try{t.setWorkDir(e);}catch{}}getWorkspace(){return this.workspacePath}getHost(e){return this.hosts.get(e)}hasHost(e){return this.hosts.has(e)}getHostConfig(e){return this.hostConfigs.get(e)}clearHost(e){this.hosts.delete(e),this.hostConfigs.delete(e);}clearAll(){for(let e of this.hosts.values())try{e.interrupt();}catch{}this.hosts.clear(),this.hostConfigs.clear();}forEachHost(e){for(let[t,s]of this.hosts.entries())e(s,t);}async getOrCreateHost(e){let{sessionId:t,configKey:s,createHost:n}=e,r=this.hosts.get(t);if(r){let o=this.hostConfigs.get(t);if(o===s)return m.info("HOST_CONTROLLER",`\u{1F504} Reusing existing host for session=${t}, configKey=${s}`),r;m.info("HOST_CONTROLLER",`\u{1F5D1}\uFE0F Clearing old host: session=${t}, oldKey=${o}, newKey=${s}`),this.clearHost(t);}m.info("HOST_CONTROLLER",`\u2728 Creating NEW host: session=${t}, configKey=${s}`);let i=await n();return this.hosts.set(t,i),this.hostConfigs.set(t,s),this.workspacePath&&i.setWorkDir(this.workspacePath),i}};function me(a){return a===null?"":typeof a=="string"?a:a.filter(e=>e.type==="text").map(e=>e.text).join("")}var Eg={unknown:0,normal:1,warn:2,soft_limit:3,limit:4};function qr(a){if(!a)return 0;let e=a.trim();return e.length?Math.ceil(e.length/4):0}function Mt(a){let e=me(a.content),t=qr(e),s=a.tool_calls?.length?qr(JSON.stringify(a.tool_calls)):0;return t+s}function tt(a){return a.reduce((e,t)=>e+Mt(t),0)}function Bs(a){let e={systemTokens:0,userTokens:0,assistantTokens:0,toolCallTokens:0,toolResultTokens:0,totalTokens:0};for(let t of a){let s=me(t.content),n=qr(s),r=t.tool_calls?.length?qr(JSON.stringify(t.tool_calls)):0;switch(t.role){case "system":e.systemTokens+=n;break;case "user":e.userTokens+=n;break;case "assistant":e.assistantTokens+=n,e.toolCallTokens+=r;break;case "tool":e.toolResultTokens+=n;break;default:e.userTokens+=n+r;}}return e.totalTokens=e.systemTokens+e.userTokens+e.assistantTokens+e.toolCallTokens+e.toolResultTokens,e}function Ig(a,e,t){return !a.contextWindow&&!a.autoCompactLimit?"unknown":a.autoCompactLimit&&e>=a.autoCompactLimit?"limit":t===void 0||a.contextWindow===void 0?"unknown":t>=a.warnThresholds.hard?"limit":t>=a.warnThresholds.soft?"soft_limit":t>=a.warnThresholds.warn?"warn":"normal"}var zr=class{profile;promptTokensActual=0;completionTokensActual=0;promptTokensEstimate=0;completionTokensEstimate=0;constructor(e){this.profile=e;}updateProfile(e){this.profile=e,this.reset();}reset(){this.promptTokensActual=0,this.completionTokensActual=0,this.promptTokensEstimate=0,this.completionTokensEstimate=0;}setPromptEstimateFromMessages(e){return this.promptTokensActual>0?(this.completionTokensEstimate=0,this.getSnapshot()):(this.promptTokensEstimate=tt(e),this.promptTokensActual=0,this.completionTokensActual=0,this.completionTokensEstimate=0,this.getSnapshot())}addEstimatedOutputTokens(e){return this.completionTokensEstimate=Math.max(0,this.completionTokensEstimate+e),this.getSnapshot()}recordActualUsage(e,t,s){return this.promptTokensActual=e,this.completionTokensActual=t,this.promptTokensEstimate=0,this.completionTokensEstimate=0,this.getSnapshot(s)}getSnapshot(e){let t=this.promptTokensActual||this.promptTokensEstimate,s=this.completionTokensActual+this.completionTokensEstimate,n=t+s,r=this.profile.contextWindow?n/this.profile.contextWindow:void 0,i=Ig(this.profile,n,r);return {profile:this.profile,tokensUsed:n,promptTokens:t,completionTokens:s,messageCount:e,pressure:r,state:i,timestamp:Date.now()}}getStateRank(e){return Eg[e]}estimateMessagesForDisplay(e){return tt(e)}recordCalibration(e,t,s){if(process.env.CLI_DEBUG){let n=t+s,r=e>0?n/e:0;console.log(`[MemoryPressure] \u6821\u51C6: \u4F30\u7B97=${e}, \u5B9E\u9645=${n}, \u6BD4\u7387=${r.toFixed(3)}`);}}};function Gs(){let a=new Date,e=a.toISOString().slice(0,10).replace(/-/g,""),t=a.toISOString().slice(11,19).replace(/:/g,""),s=Math.random().toString(36).slice(2,6);return `session_${e}_${t}_${s}`}var hs=class a{sessionId;filePath;directory;options;sequenceNumber=0;initialized=false;constructor(e){typeof e=="string"&&(e={sessionId:e}),this.sessionId=e.sessionId,this.options=e,this.directory=e.directory||se__default.join(Dn__default.homedir(),".neox","sessions"),this.filePath=se__default.join(this.directory,`${this.sessionId}.jsonl`);}async ensureDirectory(){await ce__default.mkdir(this.directory,{recursive:true});}async ensureInitialized(){if(!this.initialized){await this.ensureDirectory();try{await ce__default.access(this.filePath);let e=await this.readAllItems();e.length>0&&(this.sequenceNumber=Math.max(...e.map(t=>t.seq))+1);}catch{if(this.options.autoCreateMeta!==false){let e={sessionId:this.sessionId,createdAt:new Date().toISOString(),agentName:this.options.agentName,model:this.options.model};await this.appendItem({type:"meta",data:e});}}this.initialized=true;}}async readAllItems(){let e=[];try{let t=Me__default.createReadStream(this.filePath,{encoding:"utf-8"}),s=la.createInterface({input:t,crlfDelay:1/0});for await(let n of s)if(n.trim())try{let r=JSON.parse(n);e.push(r);}catch{console.warn(`Invalid JSONL line: ${n.slice(0,50)}...`);}}catch(t){if(t.code!=="ENOENT")throw t}return e.sort((t,s)=>t.seq-s.seq),e}async appendItem(e){await this.ensureDirectory();let t={item:e,timestamp:Date.now(),seq:this.sequenceNumber++},s=JSON.stringify(t)+`
|
|
5
|
+
`}safeStringify(e){let t=new WeakSet;return JSON.stringify(e,(s,n)=>{if(typeof n=="object"&&n!==null){if(t.has(n))return "[Circular]";t.add(n);}return s==="parser"||s==="socket"||s==="_httpMessage"||s==="req"||s==="res"?"[Omitted]":n&&n.type==="Buffer"&&Array.isArray(n.data)?"[Buffer]":typeof n=="function"?"[Function]":n instanceof Error?{name:n.name,message:n.message,stack:n.stack}:n})}write(e,t,s,n){if(!this.enabled||this.backpressured&&e==="debug")return;let r=this.formatMessage(e,t,s,n);if(process.env.CLI_DEBUG_CONSOLE==="1")try{process.stderr.write(r);}catch{}let i=this.ensureStream();if(!i)return;!i.write(r)&&!this.backpressured&&(this.backpressured=true,i.once("drain",()=>{this.backpressured=false;}));}debug(e,t,s){this.write("debug",e,t,s);}info(e,t,s){this.write("info",e,t,s);}warn(e,t,s){this.write("warn",e,t,s);}error(e,t,s){this.write("error",e,t,s);}log(e,...t){let s=t.map(n=>{if(typeof n=="string")return n;try{return this.safeStringify(n)}catch{return String(n)}}).join(" ");this.write("info",e,s);}setEnabled(e){this.enabled=e;}getLogDir(){return this.logDir}getCurrentLogFile(){return this.currentLogFile}close(){this.writeStream&&(this.writeStream.end(),this.writeStream=null,this.currentLogFile=null);}},m=new na,xg=new Set(["api_key","apikey","authorization","token","access_token","refresh_token","password","secret"]);ra=class{intervalId=null;lastHeartbeat=Date.now();heartbeatCount=0;stdinPausedCount=0;enabled=false;pid=process.pid;start(e=5e3){if(!(this.intervalId||process.env.CLI_DEBUG!=="1")){if(!process.stdin.isTTY){m.debug("HEALTH",`Skipping health monitor in non-TTY process (pid=${this.pid})`);return}this.enabled=true,this.lastHeartbeat=Date.now(),this.heartbeatCount=0,this.stdinPausedCount=0,m.info("HEALTH",`Health monitor started (interval: ${e}ms, pid=${this.pid})`),this.intervalId=setInterval(()=>{this.checkHealth();},e),this.intervalId.unref();}}stop(){this.intervalId&&(clearInterval(this.intervalId),this.intervalId=null,this.enabled=false,m.info("HEALTH","Health monitor stopped"));}stdinDestroyedCount=0;checkHealth(){let e=Date.now(),t=e-this.lastHeartbeat;this.lastHeartbeat=e,this.heartbeatCount++;let s=this.getStdinState();if(s.isPaused?this.stdinPausedCount++:this.stdinPausedCount=0,s.destroyed){if(this.stdinDestroyedCount++,this.stdinDestroyedCount>=3){m.warn("HEALTH",`[pid=${this.pid}] stdin destroyed for ${this.stdinDestroyedCount} checks, exiting to avoid zombie process`),this.stop(),setTimeout(()=>{process.exit(0);},100);return}}else this.stdinDestroyedCount=0;m.debug("HEALTH",`[pid=${this.pid}] Heartbeat #${this.heartbeatCount}`,{elapsed:`${t}ms`,stdin:s,stdinPausedCount:this.stdinPausedCount}),this.stdinPausedCount>=3&&m.warn("HEALTH",`[pid=${this.pid}] \u26A0\uFE0F stdin has been paused for ${this.stdinPausedCount} consecutive checks!`,{stdin:s}),t>1e4&&m.warn("HEALTH",`[pid=${this.pid}] \u26A0\uFE0F Event loop delay detected: ${t}ms (expected ~5000ms)`);}getStdinState(){let e=process.stdin;return {isPaused:typeof e.isPaused=="function"?e.isPaused():false,isTTY:!!e.isTTY,isRaw:!!e.isRaw,readable:e.readable,destroyed:e.destroyed}}logStdinState(e){if(process.env.CLI_DEBUG!=="1")return;let t=this.getStdinState();m.debug("STDIN",`[${e}] stdin state`,t);}logInkState(e,t){process.env.CLI_DEBUG==="1"&&m.debug("INK",`[${e}]`,t);}},Rg=new ra;});var Hu=Yc((l0,zu)=>{zu.exports=Wu;function Wu(a,e,t){a instanceof RegExp&&(a=Uu(a,t)),e instanceof RegExp&&(e=Uu(e,t));var s=qu(a,e,t);return s&&{start:s[0],end:s[1],pre:t.slice(0,s[0]),body:t.slice(s[0]+a.length,s[1]),post:t.slice(s[1]+e.length)}}function Uu(a,e){var t=e.match(a);return t?t[0]:null}Wu.range=qu;function qu(a,e,t){var s,n,r,i,o,l=t.indexOf(a),c=t.indexOf(e,l+1),u=l;if(l>=0&&c>0){if(a===e)return [l,c];for(s=[],r=t.length;u>=0&&!o;)u==l?(s.push(u),l=t.indexOf(a,u+1)):s.length==1?o=[s.pop(),c]:(n=s.pop(),n<r&&(r=n,i=c),c=t.indexOf(e,u+1)),u=l<c&&l>=0?l:c;s.length&&(o=[r,i]);}return o}});var ed=Yc((c0,Zu)=>{var Ju=Hu();Zu.exports=Mf;var Ku="\0SLASH"+Math.random()+"\0",Vu="\0OPEN"+Math.random()+"\0",Ba="\0CLOSE"+Math.random()+"\0",Yu="\0COMMA"+Math.random()+"\0",Xu="\0PERIOD"+Math.random()+"\0";function ja(a){return parseInt(a,10)==a?parseInt(a,10):a.charCodeAt(0)}function Ef(a){return a.split("\\\\").join(Ku).split("\\{").join(Vu).split("\\}").join(Ba).split("\\,").join(Yu).split("\\.").join(Xu)}function If(a){return a.split(Ku).join("\\").split(Vu).join("{").split(Ba).join("}").split(Yu).join(",").split(Xu).join(".")}function Qu(a){if(!a)return [""];var e=[],t=Ju("{","}",a);if(!t)return a.split(",");var s=t.pre,n=t.body,r=t.post,i=s.split(",");i[i.length-1]+="{"+n+"}";var o=Qu(r);return r.length&&(i[i.length-1]+=o.shift(),i.push.apply(i,o)),e.push.apply(e,i),e}function Mf(a){return a?(a.substr(0,2)==="{}"&&(a="\\{\\}"+a.substr(2)),Wn(Ef(a),true).map(If)):[]}function Pf(a){return "{"+a+"}"}function Df(a){return /^-?0\d/.test(a)}function Lf(a,e){return a<=e}function Of(a,e){return a>=e}function Wn(a,e){var t=[],s=Ju("{","}",a);if(!s)return [a];var n=s.pre,r=s.post.length?Wn(s.post,false):[""];if(/\$$/.test(s.pre))for(var i=0;i<r.length;i++){var o=n+"{"+s.body+"}"+r[i];t.push(o);}else {var l=/^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(s.body),c=/^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(s.body),u=l||c,d=s.body.indexOf(",")>=0;if(!u&&!d)return s.post.match(/,(?!,).*\}/)?(a=s.pre+"{"+s.body+Ba+s.post,Wn(a)):[a];var p;if(u)p=s.body.split(/\.\./);else if(p=Qu(s.body),p.length===1&&(p=Wn(p[0],false).map(Pf),p.length===1))return r.map(function(R){return s.pre+p[0]+R});var h;if(u){var g=ja(p[0]),f=ja(p[1]),b=Math.max(p[0].length,p[1].length),y=p.length==3?Math.abs(ja(p[2])):1,w=Lf,C=f<g;C&&(y*=-1,w=Of);var k=p.some(Df);h=[];for(var T=g;w(T,f);T+=y){var _;if(c)_=String.fromCharCode(T),_==="\\"&&(_="");else if(_=String(T),k){var M=b-_.length;if(M>0){var F=new Array(M+1).join("0");T<0?_="-"+F+_.slice(1):_=F+_;}}h.push(_);}}else {h=[];for(var x=0;x<p.length;x++)h.push.apply(h,Wn(p[x],false));}for(var x=0;x<h.length;x++)for(var i=0;i<r.length;i++){var o=n+h[x]+r[i];(!e||u||o)&&t.push(o);}}return t}});W();var Wr=class{hosts=new Map;hostConfigs=new Map;workspacePath=null;setWorkspace(e){this.workspacePath=e;for(let t of this.hosts.values())try{t.setWorkDir(e);}catch{}}getWorkspace(){return this.workspacePath}getHost(e){return this.hosts.get(e)}hasHost(e){return this.hosts.has(e)}getHostConfig(e){return this.hostConfigs.get(e)}clearHost(e){this.hosts.delete(e),this.hostConfigs.delete(e);}clearAll(){for(let e of this.hosts.values())try{e.interrupt();}catch{}this.hosts.clear(),this.hostConfigs.clear();}forEachHost(e){for(let[t,s]of this.hosts.entries())e(s,t);}async getOrCreateHost(e){let{sessionId:t,configKey:s,createHost:n}=e,r=this.hosts.get(t);if(r){let o=this.hostConfigs.get(t);if(o===s)return m.info("HOST_CONTROLLER",`\u{1F504} Reusing existing host for session=${t}, configKey=${s}`),r;m.info("HOST_CONTROLLER",`\u{1F5D1}\uFE0F Clearing old host: session=${t}, oldKey=${o}, newKey=${s}`),this.clearHost(t);}m.info("HOST_CONTROLLER",`\u2728 Creating NEW host: session=${t}, configKey=${s}`);let i=await n();return this.hosts.set(t,i),this.hostConfigs.set(t,s),this.workspacePath&&i.setWorkDir(this.workspacePath),i}};function me(a){return a===null?"":typeof a=="string"?a:a.filter(e=>e.type==="text").map(e=>e.text).join("")}var Eg={unknown:0,normal:1,warn:2,soft_limit:3,limit:4};function qr(a){if(!a)return 0;let e=a.trim();return e.length?Math.ceil(e.length/4):0}function Mt(a){let e=me(a.content),t=qr(e),s=a.tool_calls?.length?qr(JSON.stringify(a.tool_calls)):0;return t+s}function tt(a){return a.reduce((e,t)=>e+Mt(t),0)}function Bs(a){let e={systemTokens:0,userTokens:0,assistantTokens:0,toolCallTokens:0,toolResultTokens:0,totalTokens:0};for(let t of a){let s=me(t.content),n=qr(s),r=t.tool_calls?.length?qr(JSON.stringify(t.tool_calls)):0;switch(t.role){case "system":e.systemTokens+=n;break;case "user":e.userTokens+=n;break;case "assistant":e.assistantTokens+=n,e.toolCallTokens+=r;break;case "tool":e.toolResultTokens+=n;break;default:e.userTokens+=n+r;}}return e.totalTokens=e.systemTokens+e.userTokens+e.assistantTokens+e.toolCallTokens+e.toolResultTokens,e}function Ig(a,e,t){return !a.contextWindow&&!a.autoCompactLimit?"unknown":a.autoCompactLimit&&e>=a.autoCompactLimit?"limit":t===void 0||a.contextWindow===void 0?"unknown":t>=a.warnThresholds.hard?"limit":t>=a.warnThresholds.soft?"soft_limit":t>=a.warnThresholds.warn?"warn":"normal"}var zr=class{profile;promptTokensActual=0;completionTokensActual=0;promptTokensEstimate=0;completionTokensEstimate=0;constructor(e){this.profile=e;}updateProfile(e){this.profile=e,this.reset();}reset(){this.promptTokensActual=0,this.completionTokensActual=0,this.promptTokensEstimate=0,this.completionTokensEstimate=0;}setPromptEstimateFromMessages(e){return this.promptTokensActual>0?(this.completionTokensEstimate=0,this.getSnapshot()):(this.promptTokensEstimate=tt(e),this.promptTokensActual=0,this.completionTokensActual=0,this.completionTokensEstimate=0,this.getSnapshot())}addEstimatedOutputTokens(e){return this.completionTokensEstimate=Math.max(0,this.completionTokensEstimate+e),this.getSnapshot()}recordActualUsage(e,t,s){return this.promptTokensActual=e,this.completionTokensActual=t,this.promptTokensEstimate=0,this.completionTokensEstimate=0,this.getSnapshot(s)}getSnapshot(e){let t=this.promptTokensActual||this.promptTokensEstimate,s=this.completionTokensActual+this.completionTokensEstimate,n=t+s,r=this.profile.contextWindow?n/this.profile.contextWindow:void 0,i=Ig(this.profile,n,r);return {profile:this.profile,tokensUsed:n,promptTokens:t,completionTokens:s,messageCount:e,pressure:r,state:i,timestamp:Date.now()}}getStateRank(e){return Eg[e]}estimateMessagesForDisplay(e){return tt(e)}recordCalibration(e,t,s){if(process.env.CLI_DEBUG){let n=t+s,r=e>0?n/e:0;console.log(`[MemoryPressure] \u6821\u51C6: \u4F30\u7B97=${e}, \u5B9E\u9645=${n}, \u6BD4\u7387=${r.toFixed(3)}`);}}};function Gs(){let a=new Date,e=a.toISOString().slice(0,10).replace(/-/g,""),t=a.toISOString().slice(11,19).replace(/:/g,""),s=Math.random().toString(36).slice(2,6);return `session_${e}_${t}_${s}`}var hs=class a{sessionId;filePath;directory;options;sequenceNumber=0;initialized=false;constructor(e){typeof e=="string"&&(e={sessionId:e}),this.sessionId=e.sessionId,this.options=e,this.directory=e.directory||se__default.join(Dn__default.homedir(),".neox","sessions"),this.filePath=se__default.join(this.directory,`${this.sessionId}.jsonl`);}async ensureDirectory(){await ce__default.mkdir(this.directory,{recursive:true});}async ensureInitialized(){if(!this.initialized){await this.ensureDirectory();try{await ce__default.access(this.filePath);let e=await this.readAllItems();e.length>0&&(this.sequenceNumber=Math.max(...e.map(t=>t.seq))+1);}catch{if(this.options.autoCreateMeta!==false){let e={sessionId:this.sessionId,createdAt:new Date().toISOString(),agentName:this.options.agentName,model:this.options.model};await this.appendItem({type:"meta",data:e});}}this.initialized=true;}}async readAllItems(){let e=[];try{let t=Me__default.createReadStream(this.filePath,{encoding:"utf-8"}),s=la.createInterface({input:t,crlfDelay:1/0});for await(let n of s)if(n.trim())try{let r=JSON.parse(n);e.push(r);}catch{console.warn(`Invalid JSONL line: ${n.slice(0,50)}...`);}}catch(t){if(t.code!=="ENOENT")throw t}return e.sort((t,s)=>t.seq-s.seq),e}async appendItem(e){await this.ensureDirectory();let t={item:e,timestamp:Date.now(),seq:this.sequenceNumber++},s=JSON.stringify(t)+`
|
|
6
6
|
`;await ce__default.appendFile(this.filePath,s,"utf-8");}async writeAllItems(e){await this.ensureDirectory();let t=e.map(s=>JSON.stringify(s)).join(`
|
|
7
7
|
`);await ce__default.writeFile(this.filePath,t?t+`
|
|
8
8
|
`:"","utf-8"),e.length>0?this.sequenceNumber=Math.max(...e.map(s=>s.seq))+1:this.sequenceNumber=0;}async getItems(e){await this.ensureInitialized();let s=(await this.readAllItems()).map(n=>n.item);return e===void 0?s:s.slice(-e)}async addItems(e){if(e.length!==0){await this.ensureInitialized();for(let t of e)await this.appendItem(t);}}async popItem(){await this.ensureInitialized();let e=await this.readAllItems();if(e.length===0)return null;let t=e.pop();return await this.writeAllItems(e),t.item}async popItems(e){if(e<=0)return [];await this.ensureInitialized();let t=await this.readAllItems();if(t.length===0)return [];let s=Math.min(e,t.length),n=t.splice(-s);return await this.writeAllItems(t),n.map(r=>r.item)}async createCheckpoint(e,t){await this.ensureInitialized();let s=`cp_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,n={type:"checkpoint",data:{id:s,name:e,description:t}};return await this.appendItem(n),s}async rollbackToCheckpoint(e){await this.ensureInitialized();let t=await this.readAllItems(),s=t.findIndex(i=>i.item.type==="checkpoint"&&i.item.data.id===e);if(s===-1)throw new Error(`Checkpoint not found: ${e}`);let n=t.slice(0,s+1),r=t.length-n.length;return await this.writeAllItems(n),r}async getCheckpoints(){await this.ensureInitialized();let e=await this.readAllItems(),t=[];for(let s of e)if(s.item.type==="checkpoint"){let n=s.item;t.push({id:n.data.id,name:n.data.name,timestamp:s.timestamp});}return t}async clearSession(){try{await ce__default.unlink(this.filePath);}catch(e){if(e.code!=="ENOENT")throw e}this.sequenceNumber=0,this.initialized=false;}async getMeta(){await this.ensureInitialized();let e=await this.readAllItems();for(let t of e)if(t.item.type==="meta")return t.item.data;return null}async getMessages(){await this.ensureInitialized();let e=await this.readAllItems(),t=[];for(let s of e)s.item.type==="message"&&t.push(s.item.data);return t}async getItemCount(){return (await this.readAllItems()).length}async getTimeline(){return await this.ensureInitialized(),await this.readAllItems()}async replaceTimeline(e){await this.ensureDirectory();let t=e.map((s,n)=>({item:s.item,timestamp:s.timestamp??Date.now(),seq:n}));await this.writeAllItems(t),this.initialized=true;}static async listSessions(e){let t=e||se__default.join(Dn__default.homedir(),".neox","sessions");try{return (await ce__default.readdir(t)).filter(n=>n.endsWith(".jsonl")).map(n=>n.replace(".jsonl",""))}catch{return []}}static async getMostRecentId(e){let t=e||se__default.join(Dn__default.homedir(),".neox","sessions");try{let n=(await ce__default.readdir(t)).filter(i=>i.endsWith(".jsonl"));if(n.length===0)return null;let r=await Promise.all(n.map(async i=>({name:i.replace(".jsonl",""),mtime:(await ce__default.stat(se__default.join(t,i))).mtime})));return r.sort((i,o)=>o.mtime.getTime()-i.mtime.getTime()),r[0].name}catch{return null}}static async deleteSession(e,t){let s=t||se__default.join(Dn__default.homedir(),".neox","sessions"),n=se__default.join(s,`${e}.jsonl`);try{return await ce__default.unlink(n),!0}catch{return false}}static async getSessionInfo(e,t){let s=t||se__default.join(Dn__default.homedir(),".neox","sessions"),n=se__default.join(s,`${e}.jsonl`);try{let r=await ce__default.stat(n);return {sessionId:e,filePath:n,size:r.size,createdAt:r.birthtime,updatedAt:r.mtime}}catch{return null}}static create(e){return new a({sessionId:Gs(),...e})}};W();function X(a,e,t,s){return {type:"ephemeral",status:e,tool:a,summary:t,final:e==="success"||e==="already_done",...s}}function ve(a,e,t,s,n){return {type:"contextual",status:e,tool:a,summary:t,content:s,...n}}function Yt(a,e,t,s){return {type:"summarized",status:e,tool:a,summary:t,...s}}function Zc(a){m.info("TOOL_RESULT",`\u{1F504} getResultForLLM input: ${a.tool}`,{type:a.type,status:a.status,tool:a.tool,hasContent:!!a.content,contentLength:a.content?.length||0,summary:a.summary?.substring(0,100)});let e;if(a.type==="ephemeral")if(a.status==="error")a.tool==="edit_file"?e=JSON.stringify({status:a.status,tool:a.tool,summary:a.summary,error:a.error,verify_hint:a.verify_hint,file_path:a.file_path,actual_content:a.actual_content,expected_start_line:a.expected_start_line,similar_matches:a.metadata?.similar_matches,suggestions:a.metadata?.suggestions}):e=JSON.stringify({status:a.status,tool:a.tool,summary:a.summary,error:a.error,verify_hint:a.verify_hint,file_path:a.file_path,similar_matches:a.metadata?.similar_matches,suggestions:a.metadata?.suggestions});else {let t=a.metadata?.edit_info;if(a.tool==="edit_file"&&t){let s=t.old_string?t.old_string.length>1e3?t.old_string.substring(0,1e3)+"...":t.old_string:void 0,n=t.new_string?t.new_string.length>1e3?t.new_string.substring(0,1e3)+"...":t.new_string:void 0;e=JSON.stringify({status:a.status,tool:a.tool,summary:a.summary,final:a.final,file_path:a.file_path,old_string_preview:s,new_string_preview:n,start_line:t.start_line});}else e=JSON.stringify({status:a.status,tool:a.tool,summary:a.summary,final:a.final,file_path:a.file_path});}else a.type==="summarized"?e=JSON.stringify({status:a.status,tool:a.tool,summary:a.summary,error:a.error}):e=JSON.stringify(a);return m.info("TOOL_RESULT",`\u2705 getResultForLLM output: ${a.tool}`,{type:a.type,tool:a.tool,llmResultLength:e.length,llmResultPreview:e.substring(0,500)}),e}var oa={write_file:"ephemeral",Write:"ephemeral",edit_file:"ephemeral",Edit:"ephemeral",create_directory:"ephemeral",mkdir:"ephemeral",delete_file:"ephemeral",rename_file:"ephemeral",apply_patch:"ephemeral",move_file:"ephemeral",copy_file:"ephemeral",git_commit:"ephemeral",git_add:"ephemeral",git_push:"ephemeral",git_checkout:"ephemeral",git_branch:"ephemeral",git_merge:"ephemeral",git_stash:"ephemeral",npm_install:"ephemeral",npm_uninstall:"ephemeral",pip_install:"ephemeral",readfile:"contextual",search:"contextual",grep:"contextual",Grep:"contextual",glob:"contextual",Glob:"contextual",search_files:"contextual",ripgrep:"contextual",ls:"contextual",list_directory:"contextual",show_tree:"contextual",git_diff:"contextual",git_status:"contextual",git_blame:"contextual",git_branch_list:"contextual",git_log:"contextual",git_show:"contextual",web_search:"contextual",WebSearch:"contextual",web_fetch:"contextual",WebFetch:"contextual",analyze_code:"contextual",search_symbol:"contextual",get_definitions:"contextual",get_references:"contextual",execute_shell:"summarized",Bash:"summarized",bash:"summarized",shell:"summarized",run_tests:"summarized",run_lint:"summarized",run_format:"summarized",test:"summarized",pytest:"summarized",jest:"summarized",build:"summarized",compile:"summarized",npm_build:"summarized",code_interpreter:"summarized",python_exec:"summarized",browser_debug:"summarized"};function aa(a){if(a.startsWith("mcp__"))return "summarized";if(a in oa)return oa[a];let e=a.toLowerCase();for(let[t,s]of Object.entries(oa))if(t.toLowerCase()===e)return s;return "contextual"}function eu(a){return aa(a)==="contextual"}W();function Ln(a){if(!a)return 0;let e=0;for(let t of a){let s=t.codePointAt(0)||0;s>=19968&&s<=40959||s>=12288&&s<=12351||s>=65280&&s<=65519||s>=44032&&s<=55215?e+=.67:e+=.25;}return Math.ceil(e)}var at=class{messages=[];maxMessages;constructor(e=500){this.maxMessages=e;}add(e){let t=typeof e.content=="string"?e.content:JSON.stringify(e.content),s=Ln(t),n={...e,_timestamp:Date.now(),_estimatedTokens:s};if(this.messages.push(n),e.role==="assistant"&&e.tool_calls&&e.tool_calls.length>0&&process.env.CLI_DEBUG==="1"&&m.debug("MEMORY","Assistant message with tool_calls added:",{toolCallCount:e.tool_calls.length,toolCallIds:e.tool_calls.map(r=>({id:r.id,name:r.function.name}))}),this.messages.length>this.maxMessages){let r=this.messages.filter(l=>l.role==="system"),o=this.messages.filter(l=>l.role!=="system").slice(-(this.maxMessages-r.length));this.messages=[...r,...o];}}addToolResult(e,t,s){let n=aa(t),r=null;try{let c=JSON.parse(s);c.type&&c.status&&c.summary&&(r=c);}catch{}let i,o=n;m.info("MEMORY","addToolResult: parsedResult\uFF1A"+r),m.info("MEMORY","addToolResult: effectiveResultType\uFF1A"+o),r?(o=r.type||n,i=Zc(r),m.info("MEMORY","\u7CBE\u7B80\u7ED3\u679C: content \uFF1A"+i),m.info("MEMORY",`addToolResult: ${t} parsed as ToolResult`,{parsedResult:JSON.stringify(r).substring(0,500),contentAfter:i.substring(0,500),rawLength:s.length,contentLength:i.length})):(i=s,m.debug("MEMORY",`addToolResult: ${t} using raw output`,{rawOutput:s.substring(0,500),rawLength:s.length}));let l={role:"tool",tool_call_id:e,name:t,content:i,_resultType:o,_toolName:t,_timestamp:Date.now(),_estimatedTokens:Ln(i)};if(process.env.CLI_DEBUG==="1"&&m.debug("MEMORY","Tool result message added:",{toolName:t,toolCallId:e,contentLength:i.length,contentPreview:i.substring(0,200)}),this.messages.push(l),this.messages.length>this.maxMessages){let c=this.messages.filter(p=>p.role==="system"),d=this.messages.filter(p=>p.role!=="system").slice(-(this.maxMessages-c.length));this.messages=[...c,...d];}}stripMetadata(e){let{_resultType:t,_toolName:s,_timestamp:n,_estimatedTokens:r,_tag:i,...o}=e;return o}getAll(){return this.messages.map(e=>this.stripMetadata(e))}getRawMessages(){return this.messages}getMessagesForLLM(){let e=this.messages.map(t=>this.stripMetadata(t));if(process.env.CLI_DEBUG==="1"){let t=e.filter(r=>r.role==="assistant"),s=e.filter(r=>r.role==="tool");m.debug("MEMORY","Messages for LLM:",{totalMessages:e.length,assistantCount:t.length,toolCount:s.length,messageSequence:e.map(r=>r.role).join(" -> ")}),e.slice(-5).forEach((r,i)=>{r.role==="assistant"&&r.tool_calls?m.debug("MEMORY",`Message ${e.length-5+i} (assistant):`,{toolCalls:r.tool_calls.map(o=>({id:o.id,name:o.function.name}))}):r.role==="tool"&&m.debug("MEMORY",`Message ${e.length-5+i} (tool):`,{name:r.name,tool_call_id:r.tool_call_id,contentLength:typeof r.content=="string"?r.content.length:0});});}return e}hasConversationMessages(){return this.messages.some(e=>e.role==="user"||e.role==="assistant")}upsertSystemTagged(e,t){let s=t.trim();if(!s){this.removeSystemTagged(e);return}let n=this.messages.findIndex(o=>o.role==="system"&&o._tag===e);if(n>=0){let o=this.messages[n];if(o.content===s)return;this.messages[n]={...o,content:s,_timestamp:Date.now(),_estimatedTokens:Ln(s)};return}let r={role:"system",content:s,_tag:e,_timestamp:Date.now(),_estimatedTokens:Ln(s)},i=this.getSystemInsertIndex();this.messages=[...this.messages.slice(0,i),r,...this.messages.slice(i)];}removeSystemTagged(e){let t=this.messages.length;this.messages=this.messages.filter(s=>!(s.role==="system"&&s._tag===e)),t!==this.messages.length&&process.env.CLI_DEBUG==="1"&&m.debug("MEMORY",`Removed system tag: ${e}`);}getSystemInsertIndex(){let e=0;for(;e<this.messages.length&&this.messages[e].role==="system";)e+=1;return e}cleanupEphemeral(){let e=this.messages.length,t=new Set;for(let s of this.messages)if(s.role==="assistant"&&s.tool_calls)for(let n of s.tool_calls)n.id&&t.add(n.id);return this.messages=this.messages.filter(s=>s._resultType!=="ephemeral"||s.role!=="tool"||!s.tool_call_id?true:t.has(s.tool_call_id)),e-this.messages.length}getStats(){let e={total:this.messages.length,ephemeral:0,contextual:0,summarized:0,other:0};for(let t of this.messages)t._resultType==="ephemeral"?e.ephemeral++:t._resultType==="contextual"?e.contextual++:t._resultType==="summarized"?e.summarized++:e.other++;return e}checkContextHealth(){let e={ephemeral:{count:0,tokens:0},contextual:{count:0,tokens:0},summarized:{count:0,tokens:0},other:{count:0,tokens:0}},t=0,s=0,n=0;for(let o of this.messages){let l=o._estimatedTokens||Ln(typeof o.content=="string"?o.content:JSON.stringify(o.content));t+=l,o.role==="tool"?(n++,s+=l,o._resultType==="ephemeral"?(e.ephemeral.count++,e.ephemeral.tokens+=l):o._resultType==="contextual"?(e.contextual.count++,e.contextual.tokens+=l):o._resultType==="summarized"?(e.summarized.count++,e.summarized.tokens+=l):(e.other.count++,e.other.tokens+=l)):(e.other.count++,e.other.tokens+=l);}let r=t>0?s/t:0,i=[];return r>.5?i.push(`Tool results\u5360\u7528 ${(r*100).toFixed(1)}% \u7684\u4E0A\u4E0B\u6587\uFF08\u8D85\u8FC750%\u8B66\u6212\u7EBF\uFF09`):r>.4&&i.push(`Tool results\u5360\u7528 ${(r*100).toFixed(1)}% \u7684\u4E0A\u4E0B\u6587\uFF08\u63A5\u8FD1\u8B66\u6212\u7EBF\uFF09`),t>18e4?i.push(`\u4E0A\u4E0B\u6587\u5DF2\u8FBE ${t} tokens\uFF08\u8D85\u8FC7180k\uFF0C\u5EFA\u8BAE\u6E05\u7406\uFF09`):t>15e4&&i.push(`\u4E0A\u4E0B\u6587\u5DF2\u8FBE ${t} tokens\uFF08\u63A5\u8FD1180k\uFF09`),n>100?i.push(`\u5DE5\u5177\u8C03\u7528\u5386\u53F2\u8FC7\u957F\uFF08${n} \u6761\uFF09`):n>60&&i.push(`\u5DE5\u5177\u8C03\u7528\u5386\u53F2\u8F83\u957F\uFF08${n} \u6761\uFF09`),e.ephemeral.count>10&&i.push(`\u79EF\u7D2F\u4E86 ${e.ephemeral.count} \u6761 ephemeral \u6D88\u606F\uFF0C\u5EFA\u8BAE\u6E05\u7406`),{totalTokens:t,toolResultTokens:s,toolResultRatio:r,messageCount:this.messages.length,toolMessageCount:n,warnings:i,shouldCompress:r>.3||t>12e4,shouldCleanup:t>15e4||e.ephemeral.count>5,byType:e}}getTokenSummary(){let e=this.checkContextHealth(),t=[`Total: ${e.totalTokens} tokens`,`Tool: ${e.toolResultTokens} (${(e.toolResultRatio*100).toFixed(1)}%)`,`Messages: ${e.messageCount}`];return e.byType.ephemeral.count>0&&t.push(`Ephemeral: ${e.byType.ephemeral.count}`),t.join(" | ")}getMemoryFootprint(){let e=JSON.stringify(this.messages),t=new Blob([e]).size,s=Math.round(t/1024*10)/10,n=this.messages.length*150,r=t+n,i=Math.round(r/1024*10)/10;return {totalKB:i,messagesKB:s,messageCount:this.messages.length,averageKBPerMessage:this.messages.length>0?Math.round(i/this.messages.length*10)/10:0}}logMemoryStats(){let e=this.checkContextHealth(),t=this.getMemoryFootprint();m.info("MEMORY_STATS","ShortTermMemory snapshot",{memoryTotalKB:t.totalKB,memoryMessagesKB:t.messagesKB,avgKBPerMessage:t.averageKBPerMessage,totalTokens:e.totalTokens,toolResultTokens:e.toolResultTokens,toolResultRatio:`${(e.toolResultRatio*100).toFixed(1)}%`,messageCount:e.messageCount,toolMessageCount:e.toolMessageCount,maxMessages:this.maxMessages,byType:{ephemeral:`${e.byType.ephemeral.count} msgs, ${e.byType.ephemeral.tokens} tokens`,contextual:`${e.byType.contextual.count} msgs, ${e.byType.contextual.tokens} tokens`,summarized:`${e.byType.summarized.count} msgs, ${e.byType.summarized.tokens} tokens`,other:`${e.byType.other.count} msgs, ${e.byType.other.tokens} tokens`},warnings:e.warnings.length>0?e.warnings:["None"],shouldCompress:e.shouldCompress,shouldCleanup:e.shouldCleanup});}clear(){let e=this.messages.filter(t=>t.role==="system");this.messages=e;}setMessages(e){let t=Array.isArray(e)?e:[],s=t.filter(o=>o.role==="system"),n=t.filter(o=>o.role!=="system"),r=Math.max(0,this.maxMessages-s.length),i=r>0?n.slice(-r):[];this.messages=[...s,...i].map(o=>({...o,_timestamp:Date.now()}));}get length(){return this.messages.length}};var Xt=class{directory;options;sessionCache=new Map;constructor(e){this.options=e||{},this.directory=e?.directory||se__default.join(Dn__default.homedir(),".neox","sessions");}async getSession(e){if(this.sessionCache.has(e))return this.sessionCache.get(e);let t=new hs({sessionId:e,directory:this.directory,agentName:this.options.defaultAgentName,model:this.options.defaultModel});return this.sessionCache.set(e,t),t}async listSessions(){let e=[];try{await ce__default.mkdir(this.directory,{recursive:!0});let t=await ce__default.readdir(this.directory);for(let s of t){if(!s.endsWith(".jsonl"))continue;let n=s.replace(".jsonl",""),r=se__default.join(this.directory,s);try{let i=await ce__default.stat(r),o=await this.readSessionMeta(r),l=await this.countItems(r);e.push({sessionId:n,createdAt:i.birthtime,updatedAt:i.mtime,itemCount:l,agentName:o?.agentName});}catch{}}}catch(t){if(t.code!=="ENOENT")throw t}return e.sort((t,s)=>s.updatedAt.getTime()-t.updatedAt.getTime()),e}async getMostRecent(){let e=await this.listSessions();return e.length===0?null:this.getSession(e[0].sessionId)}async deleteSession(e){this.sessionCache.delete(e);let t=se__default.join(this.directory,`${e}.jsonl`);try{return await ce__default.unlink(t),!0}catch{return false}}async searchSessions(e){let t=await this.listSessions(),s=e.toLowerCase(),n=[];for(let r of t){if(r.sessionId.toLowerCase().includes(s)){n.push(r);continue}if(r.agentName?.toLowerCase().includes(s)){n.push(r);continue}let i=se__default.join(this.directory,`${r.sessionId}.jsonl`);await this.searchInFile(i,s)&&n.push(r);}return n}async createSession(e){let t=e?.sessionId||Gs(),s=new hs({sessionId:t,directory:this.directory,agentName:e?.agentName||this.options.defaultAgentName,model:e?.model||this.options.defaultModel});return this.sessionCache.set(t,s),s}async getOrCreateSession(e){return e?this.getSession(e):this.createSession()}async continueOrCreate(){let e=await this.getMostRecent();return e||this.createSession()}async cleanupOldSessions(e=30){let t=await this.listSessions(),s=Date.now()-e*24*60*60*1e3,n=0;for(let r of t)r.updatedAt.getTime()<s&&await this.deleteSession(r.sessionId)&&n++;return n}getDirectory(){return this.directory}async getSessionCount(){return (await this.listSessions()).length}async exportSession(e){let t=await this.getSession(e),s=await t.getItems(),n=await t.getMeta();return JSON.stringify({sessionId:e,meta:n,items:s,exportedAt:new Date().toISOString()},null,2)}async readSessionMeta(e){try{let t=createReadStream(e,{encoding:"utf-8"}),s=la.createInterface({input:t,crlfDelay:1/0});for await(let n of s)if(n.trim())try{let r=JSON.parse(n);if(r.item?.type==="meta")return s.close(),r.item.data}catch{}}catch{}return null}async countItems(e){let t=0;try{let s=createReadStream(e,{encoding:"utf-8"}),n=la.createInterface({input:s,crlfDelay:1/0});for await(let r of n)r.trim()&&t++;}catch{}return t}async searchInFile(e,t){try{let s=createReadStream(e,{encoding:"utf-8"}),n=la.createInterface({input:s,crlfDelay:1/0});for await(let r of n)if(r.toLowerCase().includes(t))return n.close(),!0}catch{}return false}};var Fg={python:{command:"python3",args:["{file}"],extension:".py",useTempFile:true},javascript:{command:"node",args:["{file}"],extension:".js",useTempFile:true},typescript:{command:"npx",args:["tsx","{file}"],extension:".ts",useTempFile:true},bash:{command:"bash",args:["{file}"],extension:".sh",useTempFile:true},shell:{command:"sh",args:["{file}"],extension:".sh",useTempFile:true}},jg={timeout:3e4,maxMemoryMB:512,maxCPUPercent:50,allowNetwork:true,allowFileSystem:true,workingDirectory:process.cwd(),env:{},captureImages:false,maxOutputSize:1e4},wt=class{config;constructor(e={}){this.config={...jg,...e};}async execute(e,t){let s=Date.now(),n=Fg[t];if(!n)return {success:false,stdout:"",stderr:"",exitCode:1,executionTime:0,error:`Unsupported language: ${t}`};if(!await this.checkRuntimeAvailable(n.command))return {success:false,stdout:"",stderr:"",exitCode:1,executionTime:0,error:`Runtime not found: ${n.command}. Please install it first.`};let i=null;try{n.useTempFile&&(i=await this.createTempFile(e,n.extension));let o=n.args.map(g=>g.replace("{file}",i||"")),l=i?se__default.dirname(i):this.config.workingDirectory,c=[n.command,...o].join(" "),u={...Object.fromEntries(Object.entries(process.env).filter(([g,f])=>f!==void 0)),...this.config.env};t==="python"&&this.config.captureImages&&(u.MPLBACKEND="Agg");let d=await this.executeCommand(n.command,o,u,l),p=[];this.config.captureImages&&i&&(p=await this.captureGeneratedImages(se__default.dirname(i)));let h=Date.now()-s;return {...d,executionTime:h,command:c,workingDirectory:l,images:p&&p.length>0?p:void 0}}catch(o){let l=Date.now()-s;return {success:false,stdout:o.stdout||"",stderr:o.stderr||"",exitCode:o.exitCode||1,executionTime:l,error:o.message,timedOut:o.timedOut||false}}finally{i&&await this.cleanupTempFile(i);}}async checkRuntimeAvailable(e){try{return await execa(e,["--version"],{timeout:5e3}),!0}catch{return false}}async createTempFile(e,t){let s=await ce__default.mkdtemp(se__default.join(Dn__default.tmpdir(),"neox-code-")),n=se__default.join(s,`script${t}`);return await ce__default.writeFile(n,e,"utf-8"),n}async executeCommand(e,t,s,n){try{let{stdout:r,stderr:i,exitCode:o}=await execa(e,t,{timeout:this.config.timeout,cwd:n,env:s,all:!0,reject:!1}),l=this.truncateOutput(r),c=this.truncateOutput(i);return {success:o===0,stdout:l,stderr:c,exitCode:o||0}}catch(r){throw r.timedOut?{stdout:r.stdout||"",stderr:r.stderr||"",exitCode:-1,message:`Execution timed out after ${this.config.timeout}ms`,timedOut:true}:{stdout:r.stdout||"",stderr:r.stderr||"",exitCode:r.exitCode||1,message:r.message}}}truncateOutput(e){if(e.length<=this.config.maxOutputSize)return e;let t=Math.floor(this.config.maxOutputSize/2);return e.slice(0,t)+`
|
|
@@ -3409,5 +3409,5 @@ ${e.map(s=>{let n=Br(s.ts),r=s.files&&s.files.length>0?` files=${s.files.join(",
|
|
|
3409
3409
|
[
|
|
3410
3410
|
{"category":"progress","summary":"\u5B8C\u6210\u4E86 X\uFF0C\u4E0B\u4E00\u6B65 Y","files":["src/app.ts"],"confidence":0.7},
|
|
3411
3411
|
{"category":"lesson","summary":"\u907F\u514D\u91CD\u590D\u6267\u884C Z\uFF0C\u5BB9\u6613\u8D85\u65F6","confidence":0.5}
|
|
3412
|
-
]`}parseSummaryItems(e){if(!e)return [];let t=e.match(/```(?:json)?\s*([\s\S]*?)\s*```/),s=t?t[1]:e,n=s.indexOf("["),r=s.lastIndexOf("]");if(n===-1||r===-1||r<=n)return [];try{let i=JSON.parse(s.slice(n,r+1));if(!Array.isArray(i))return [];let o=["progress","standard","lesson","pinned"];return i.map(l=>({category:l.category,summary:l.summary,files:Array.isArray(l.files)?l.files.filter(Boolean):void 0,confidence:typeof l.confidence=="number"?Math.min(1,Math.max(0,l.confidence)):void 0})).filter(l=>o.includes(l.category)&&typeof l.summary=="string"&&l.summary.trim())}catch{return []}}updateRunAggregate(e){if(!e.runId)return;let t=this.runAggregates.get(e.runId);switch(t||(t={sessionId:e.sessionId,startTs:e.ts,toolCalls:0,fileChanges:0,planUpdates:0,retries:0,errors:0,files:new Set},this.runAggregates.set(e.runId,t)),e.type){case "run_start":t.startTs=e.ts,t.sessionId=e.sessionId,t.promptSummary=e.summary??e.data?.prompt;break;case "run_attempt":t.provider=e.data?.providerName??e.data?.providerId,t.model=e.data?.model;break;case "tool_call_start":t.toolCalls+=1;break;case "file_change":if(t.fileChanges+=1,e.files?.length)for(let s of e.files){if(t.files.size>=Rk)break;t.files.add(s);}break;case "plan_update":t.planUpdates+=1;break;case "stream_retry":t.retries+=1;break;case "run_error":t.errors+=1,t.errorMessage=e.data?.message??e.summary;break;case "run_result":t.tokens=e.data?.totalTokens,t.durationMs=e.data?.durationMs,t.outputPreview=e.data?.outputPreview;break;}}maybeQueueSessionSummary(e){if(!e.runId||e.type!=="run_result"&&e.type!=="run_error")return;let t=this.runAggregates.get(e.runId);if(!t)return;this.runAggregates.delete(e.runId);let s=t.durationMs??Math.max(0,e.ts-t.startTs),n=t.tokens,r=e.type==="run_result"?`Completed in ${s}ms, tokens ${n??"n/a"}`:`Failed: ${ot(t.errorMessage??e.summary??"Error",120)}`,i=[];t.toolCalls>0&&i.push(`tools ${t.toolCalls}`),t.fileChanges>0&&i.push(`files ${t.fileChanges}`),t.retries>0&&i.push(`retries ${t.retries}`);let o=i.length?` (${i.join(", ")})`:"",l=t.promptSummary??"User request";if(this.isLowValuePrompt(l))return;let c=t.outputPreview?ot(t.outputPreview.replace(/\s+/g," ").trim(),120):"",u=c?` | Result: ${c}`:"",d=ot(`${l} -> ${r}${o}${u}`,_k),p=Array.from(t.files),h={schemaVersion:1,id:e.id,ts:e.ts,sessionId:t.sessionId,runId:e.runId,summary:d,files:p.length?p:void 0,evidence:{eventId:e.id},model:t.model,provider:t.provider,toolCalls:t.toolCalls||void 0,errors:t.errors||(e.type==="run_error"?1:void 0),durationMs:s,tokens:n};this.sessionSummaryQueue.push(h),m.info("SESSION_SUMMARY_QUEUED","Session summary queued",{runId:h.runId,sessionId:h.sessionId,summary:ot(h.summary,160),files:h.files,toolCalls:h.toolCalls,retries:t.retries,errors:h.errors,durationMs:h.durationMs,tokens:h.tokens}),this.enqueueSummarizer(h);}async loadSummarySnapshot(){if(this.summaryPath)try{let e=await ce__default.readFile(this.summaryPath,"utf-8"),t=JSON.parse(e);t?.items?.length&&(this.summaryItems=t.items.slice(-this.options.summaryWindow));}catch{}}async persistSummarySnapshot(){if(!this.summaryPath||!this.workspaceId||!this.summaryDirty)return;let e={schemaVersion:1,workspaceId:this.workspaceId,updatedAt:Date.now(),windowSize:this.options.summaryWindow,items:this.summaryItems},t=`${this.summaryPath}.${Date.now()}.tmp`;await ce__default.writeFile(t,JSON.stringify(e,null,2),"utf-8"),await ce__default.rename(t,this.summaryPath),this.summaryDirty=false;}async loadMeta(){if(this.metaPath)try{let e=await ce__default.readFile(this.metaPath,"utf-8"),t=JSON.parse(e);if(t?.lastSeq&&(this.seq=t.lastSeq),t?.createdAt&&(this.createdAt=t.createdAt),t?.currentFile&&this.eventsDir){let s=se__default.join(this.eventsDir,t.currentFile);this.currentFile=s,this.currentDate=t.currentFile.slice(7,17),this.currentFileBytes=await this.getFileSize(s);}}catch{}}async persistMeta(){if(!this.metaPath||!this.workspaceId||!this.workspacePath||!this.workspaceName)return;let e={schemaVersion:1,workspaceId:this.workspaceId,workspacePath:this.workspacePath,workspaceName:this.workspaceName,createdAt:this.createdAt,updatedAt:Date.now(),lastSeq:this.seq,currentFile:this.currentFile?se__default.basename(this.currentFile):void 0,currentFileBytes:this.currentFileBytes,source:this.options.source,agentName:this.options.agentName},t=`${this.metaPath}.${Date.now()}.tmp`;await ce__default.writeFile(t,JSON.stringify(e,null,2),"utf-8"),await ce__default.rename(t,this.metaPath);}};W();var Xo=class{id="edge";tts;constructor(){this.tts=new EdgeTTS;}async init(){}async synthesize(e,t){let s=t?.voice||"zh-CN-XiaoxiaoNeural",n=t?.speed?`${Math.round((t.speed-1)*100)}%`:"+0%",r=t?.format||"mp3",i=r==="opus"?"webm-24khz-16bit-mono-opus":"audio-24khz-48kbitrate-mono-mp3";await this.tts.synthesize(e,s,{rate:n,outputFormat:i});let o=this.tts.toBuffer(),l=this.tts.getAudioInfo();return {audio:o,format:r,durationMs:Math.round(l.estimatedDuration*1e3)}}async synthesizeStream(e,t,s){let n=s?.voice||"zh-CN-XiaoxiaoNeural",r=s?.format||"mp3",i=0;for await(let o of this.tts.synthesizeStream(e,n))o&&o.length>0&&(t(Buffer.from(o),i),i++);return {format:r,totalChunks:i}}async getVoices(){return (await this.tts.getVoicesByLanguage("zh-CN")).map(t=>({id:t.ShortName,name:t.LocalName||t.FriendlyName,locale:t.Locale,gender:t.Gender}))}destroy(){}},Qo=class{provider=null;config;summarizeFn=null;constructor(e){this.config=e;}setSummarizeFn(e){this.summarizeFn=e;}updateConfig(e){this.config={...this.config,...e};}isEnabled(){return this.config.enabled===true}async init(){if(!this.config.enabled)return;(this.config.provider||"edge")==="edge"?this.provider=new Xo:this.provider=new Xo,await this.provider.init(),m.info("TTS",`TTS service initialized with provider: ${this.provider.id}`);}async speak(e){if(!this.config.enabled||!this.provider||!e||e.trim().length===0)return null;try{let t=await this.provider.synthesize(e,{voice:this.config.voice,speed:this.config.speed,format:this.config.format||"mp3"});return {audio:t.audio.toString("base64"),format:t.format,voiceSummary:e,durationMs:t.durationMs}}catch(t){return m.error("TTS",`TTS synthesis failed: ${t.message}`),null}}async speakStream(e,t){if(!this.config.enabled||!this.provider||!e||e.trim().length===0)return null;try{let s=await this.provider.synthesizeStream(e,(n,r)=>{t(n.toString("base64"),r);},{voice:this.config.voice,speed:this.config.speed,format:this.config.format||"mp3"});return {format:s.format,totalChunks:s.totalChunks,voiceText:e}}catch(s){return m.error("TTS",`TTS stream synthesis failed: ${s.message}`),null}}async getVoices(){return this.provider?this.provider.getVoices():[]}destroy(){this.provider?.destroy(),this.provider=null;}};var Jc=se.join(Dn.homedir(),".neox"),Ur=se.join(Jc,"server.pid");function jk(a){Me.existsSync(Jc)||Me.mkdirSync(Jc,{recursive:true}),Me.writeFileSync(Ur,JSON.stringify(a,null,2));}function cg(){try{Me.existsSync(Ur)&&Me.unlinkSync(Ur);}catch{}}function ug(){try{return Me.existsSync(Ur)?JSON.parse(Me.readFileSync(Ur,"utf-8")):null}catch{return null}}function Bk(){let a=process.argv.slice(2),e=4399,t=process.cwd(),s=false;for(let n=0;n<a.length;n++)a[n]==="--port"&&a[n+1]?(e=parseInt(a[n+1],10),n++):a[n]==="--workdir"&&a[n+1]?(t=a[n+1],n++):a[n]==="--daemon"&&(s=true);return {port:e,workDir:t,daemon:s}}async function Gk(a,e){let t=Oe(),s=xs(),n=new rt(t),r=t.agentApprovalMode||t.approvalMode||"auto",i=og(r),o=(v,E)=>{let L=n.getProvider(v);if(!L)return {provider:null,llmConfig:null};let I=E||L.defaultModel||L.models?.[0]?.name;return {provider:L,llmConfig:{model:I,providerName:L.name||L.id,maxInputTokens:L.contextWindow||128e3}}},l=yo(500),c=new Gr({workspacePath:a,source:"server",agentName:"Neox Server"}),u=new Qo(t.tts??{enabled:false});t.tts?.enabled&&(u.setSummarizeFn(async(v,E,L)=>{let I=g;if(!I)return v.substring(0,E);let A=$t.createAdapter(I.protocol,I),O=L||"claude-haiku-4-5-20251001";return (await A.chat([{role:"system",content:`\u4F60\u662F\u4E00\u4E2A\u8BED\u97F3\u6458\u8981\u52A9\u624B\u3002\u628A\u4EE5\u4E0B\u5185\u5BB9\u538B\u7F29\u6210${E}\u5B57\u4EE5\u5185\u7684\u53E3\u8BED\u5316\u6458\u8981\uFF0C\u9002\u5408\u8BED\u97F3\u6717\u8BFB\u3002\u4E0D\u8981\u7528\u4EE3\u7801\u3001markdown\u683C\u5F0F\u3001\u5217\u8868\u3002\u76F4\u63A5\u8BF4\u91CD\u70B9\u3002`},{role:"user",content:v}],{model:O,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||v.substring(0,E)}),await u.init());let d=await Rs(a,s),p=wr({workDir:a}),h=typeof p=="string"?p:"",g=n.getDefaultProvider(),f=g?.id??"",b=g?.defaultModel??g?.models?.[0]?.name??"",y={services:s,permissionManager:i,tools:d,memory:l,workDir:a,providerId:f,modelName:b,resolveProvider:o,systemPrompt:h},w=new Pr;w.setWorkspace(a);let C=null,k=null,T=null,_=null,M=t.runMode||"single";try{C=new Sn({...y,actionLog:c,agentMode:r==="dangerous"?"auto":"agent",enableFGTS:t.experimental?.enableFGTS,enablePTC:t.experimental?.enablePTC});}catch(v){m.error("SERVER","Failed to init SingleAgentRuntime",{error:v});}try{k=new Rn({...y,actionLog:c});}catch(v){m.error("SERVER","Failed to init AssistantRuntime",{error:v});}try{let v=new It(void 0,"cooperate");T=new ms({...y,ccbReviewMode:v.getCCBReviewMode(),workerModels:v.getEnabledWorkerModels().map(E=>({providerId:E.providerId,model:E.model,traits:E.traits}))});}catch(v){m.error("SERVER","Failed to init CooperateRuntime",{error:v});}try{let v=async(L,I,A)=>{let O=g;if(!O)throw new Error("No provider configured for NetworkRuntime");let $=$t.createAdapter(O.protocol,O),P=[{role:"system",content:L},{role:"user",content:I}],N=A?.model||b;if(A?.onText&&$.chatStreamed){let G="",q=$.chatStreamed(P,{model:N,maxTokens:A.maxTokens,temperature:A.temperature,signal:A.signal});for await(let oe of q)oe.type==="text"&&oe.text?(G+=oe.text,A.onText(oe.text)):oe.type==="content_block_delta"&&oe.delta?.text&&(G+=oe.delta.text,A.onText(oe.delta.text));return G}return (await $.chat(P,{model:N,maxTokens:A?.maxTokens,temperature:A?.temperature,signal:A?.signal})).choices?.[0]?.message?.content||""},E=new It(void 0,"network");_=new In({llmCall:v,executionCapability:{orchestrator:new Et({hostService:new Rt({platformServices:s}),resolveProvider:o}),tools:d,permissionManager:i,memory:l,workDir:a,providerId:f,modelName:b,resolveProvider:o,maxIterations:30},autoCreateDefaultAgents:!0,customRoles:E.getNetworkRoles?.()});}catch(v){m.error("SERVER","Failed to init NetworkRuntime",{error:v});}let F=new Set,x=new Map,R=new Map,j={async chat(v,E){F.add(v);let L=new AbortController;x.set(v,L);let I=(N,D)=>{if(m.info("SERVER",`\u{1F4E1} publishRawEvent: type=${N.type} sessionId=${v}`),e.publish({sessionId:v,type:N.type,data:N,tracker:D,timestamp:Date.now()}),N.type==="run_result"&&u.isEnabled()){let G=N.currentTurnText||N.output;G&&u.speak(G).then(q=>{q&&e.publish({sessionId:v,type:"tts_audio",data:{type:"tts_audio",audio:q.audio,audioFormat:q.format,voiceSummary:q.voiceSummary,durationMs:q.durationMs??0},timestamp:Date.now()});}).catch(q=>{m.warn("SERVER",`TTS generation failed: ${q.message}`);});}},O=N=>{e.publish({sessionId:v,type:"error",data:{type:"error",message:N.message},timestamp:Date.now()});},$={onRuntimeEvent:(N,D)=>I(N,D),onError:O},P={onRuntimeEvent:N=>I(N),onError:O};try{let N=E.mode??M,D=E.attachments?{attachments:E.attachments}:void 0;if(N==="single"&&C)await C.chat({sessionId:v,prompt:E.prompt,metadata:D,providerId:E.providerId,modelName:E.modelName},$);else if(N==="assistant"&&k)k.removeAllListeners("worker_event"),k.removeAllListeners("worker_result"),k.on("worker_event",G=>{if(G?.event){let q={...G.event,sourceLabel:G.agentId,workerRole:G.role,workerTask:G.taskSummary};I(q,G.tracker);}}),k.on("worker_result",G=>{e.publish({sessionId:v,type:"worker_result",data:{type:"worker_result",agentId:G.agentId,success:G.success,output:G.output},timestamp:Date.now()});}),await k.chat({sessionId:v,prompt:E.prompt,metadata:D});else if(N==="cooperate"&&T)await T.chat({sessionId:v,prompt:E.prompt,metadata:D},P);else if(N==="network"&&_)await _.chat({prompt:E.prompt,history:[]});else if(C)await C.chat({sessionId:v,prompt:E.prompt,metadata:D,providerId:E.providerId,modelName:E.modelName},$);else throw new Error("No runtime available")}finally{F.delete(v),x.delete(v);}},abort(v){let E=x.get(v);E&&(E.abort(),x.delete(v)),C&&C.abort(),k&&k.abort(),T&&T.abort?.();},replyPermission(v,E,L){let I=R.get(v);I&&(I.resolve(E),R.delete(v));},getActiveSessions(){return [...F]},setRunMode(v){Yo.isValidMode(v)&&(M=v,m.info("SERVER",`Run mode changed to: ${M}`));},getRunMode(){return M},setSandboxMode(v,E){gp(E);},setApprovalMode(v,E){m.info("SERVER",`Approval mode set to: ${E}`);},async compactSession(v){m.info("SERVER",`Compact session: ${v}`);},clearSession(v){l.clear(),m.info("SERVER",`Cleared session: ${v}`);},getContextHealth(v){return l.checkContextHealth?.()??null},async getSessionInfo(v){return {messageCount:l.length,messages:l.getAll()}},setCompressionMode(v,E){m.info("SERVER",`Compression mode set to: ${E}`);},getMemoryStats(v){return {length:l.length,contextHealth:l.checkContextHealth?.()??null}},clearMemory(v){l.clear();},addMemoryMessage(v,E,L){l.add({role:E,content:L});},getToolList(){return {count:d.length,names:d.map(v=>v.name)}},async reloadTools(v){let E=await Rs(v,s);d.length=0,d.push(...E),m.info("SERVER",`Reloaded ${d.length} tools for ${v}`);},async setWorkspace(v){let E=await Rs(v,s);d.length=0,d.push(...E),w.setWorkspace(v),m.info("SERVER",`Workspace switched to: ${v}`);},async startCheckpointWatching(v){return w.startMessage(v)},async stopCheckpointWatching(){await w.stopWatching();},async createCheckpoint(v,E){return w.createCheckpoint(v,E)},async rollbackToCheckpoint(v){return w.rollbackToCheckpoint(v)},async rollbackSingleFile(v){return w.rollbackSingleFile(v)},async reapplySingleFile(v){return w.reapplySingleFile(v)},async getCheckpoints(v,E){return w.getCheckpoints(v,E)},async getCheckpointStats(){return w.getCurrentStats?.()??{created:0,modified:0,deleted:0,directories:0,total:0}},async getCheckpointChanges(){return w.getChangeBuffer?.()??[]},setCheckpointEnabled(v){w.setEnabled(v);},isCheckpointEnabled(){return w.isEnabled()},async cleanupCheckpoints(){await w.cleanup?.();},async getHostStatus(){return {isRunning:F.size>0,currentTask:null,mode:M,workingDirectory:a,uptime:Math.floor(process.uptime()),memoryUsage:{tokensUsed:l.length,contextWindow:128e3,pressure:l.length/128e3}}},async getHostAgents(){return [{id:"main",role:"main",status:F.size>0?"running":"idle"}]},async getHostActivity(v=10){return []},async getHostSession(){return {messageCount:l.length,tokensUsed:0}},async getHostSystem(){let v=null,E="unknown";try{let{execSync:L}=await import('child_process');try{v=L("git rev-parse --abbrev-ref HEAD",{cwd:a,encoding:"utf-8",timeout:5e3}).trim();}catch{}try{E=L("git status --porcelain",{cwd:a,encoding:"utf-8",timeout:5e3}).trim().length===0?"clean":"dirty";}catch{}}catch{}return {platform:process.platform,arch:process.arch,cwd:a,gitBranch:v,gitStatus:E,nodeVersion:process.version}},async hostInterrupt(v){for(let[L,I]of x)I.abort();C&&C.abort(),k&&k.abort(),T&&T.abort?.();let E=F.size>0;return F.clear(),x.clear(),{interrupted:E}},async hostSendCommand(v,E){let L=`cmd-${Date.now()}`,I={prompt:v};return j.chat(L,I).catch(A=>{m.error("SERVER",`hostSendCommand failed: ${A.message}`);}),{queued:true,sessionId:L}},setTTSEnabled(v){let E=u.isEnabled();u.updateConfig({enabled:v,provider:"edge"}),v&&!E&&(u.summarizeFn||u.setSummarizeFn(async(L,I,A)=>{let O=g;if(!O)return L.substring(0,I);let $=$t.createAdapter(O.protocol,O),P=A||"claude-haiku-4-5-20251001";return (await $.chat([{role:"system",content:`\u4F60\u662F\u4E00\u4E2A\u8BED\u97F3\u6458\u8981\u52A9\u624B\u3002\u628A\u4EE5\u4E0B\u5185\u5BB9\u538B\u7F29\u6210${I}\u5B57\u4EE5\u5185\u7684\u53E3\u8BED\u5316\u6458\u8981\uFF0C\u9002\u5408\u8BED\u97F3\u6717\u8BFB\u3002\u4E0D\u8981\u7528\u4EE3\u7801\u3001markdown\u683C\u5F0F\u3001\u5217\u8868\u3002\u76F4\u63A5\u8BF4\u91CD\u70B9\u3002`},{role:"user",content:L}],{model:P,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||L.substring(0,I)}),u.init().catch(L=>{m.error("SERVER",`TTS init failed: ${L.message}`);})),m.info("SERVER",`TTS ${v?"enabled":"disabled"}`);},isTTSEnabled(){return u.isEnabled()},getTTSConfig(){return t.tts??{enabled:false}},updateTTSConfig(v){let E=u.isEnabled();u.updateConfig(v),v.enabled&&!E&&u.init().catch(L=>{m.error("SERVER",`TTS init failed: ${L.message}`);});}};return j}async function Uk(){let{port:a,workDir:e,daemon:t}=Bk(),s=Oe(),n=s.remote??{};m.info("SERVER",`Starting Neox Server on port ${a}, workDir: ${e}`);let r=new xo,i=new Ns,o=await Gk(e,r),l={workDir:e};n.enabled&&n.token&&(l.auth={token:n.token,allowLocalWithoutAuth:true},l.rateLimit={maxRequests:120,windowMs:6e4},l.corsOrigins=["*"],m.info("SERVER","Remote mode enabled \u2014 auth + rateLimit active"));let{app:c,channelRegistry:u}=ym(l,o,r,i),d=s.channels;d&&(await u.initialize(d),u.setHandler(async g=>{let f=`ch-${g.channelId}-${g.chatId}`;return new Promise(b=>{let y="",w=r.subscribe(f);(async()=>{for await(let C of w){if(C.type==="run_result"){y=C.data?.output||"",w.close();break}if(C.type==="error"){y=`Error: ${C.data?.message||"unknown"}`,w.close();break}}b(y||"[no response]");})(),o.chat(f,{prompt:g.text}).catch(()=>{b("[error processing message]"),w.close();});})}),await u.startAll(),m.info("SERVER","Channel adapters initialized")),await ht.initialize(e),ht.watch(e),m.info("SERVER",`Skills hot-reload active (${ht.size} skills loaded)`);let p=n.enabled?n.host||"0.0.0.0":"127.0.0.1";jk({pid:process.pid,port:a,workDir:e,startedAt:Date.now(),daemon:t});let h=()=>{m.info("SERVER","Shutting down..."),ht.stopWatch(),u.stopAll().catch(()=>{}),cg(),i.dispose(),r.dispose(),process.exit(0);};process.on("SIGINT",h),process.on("SIGTERM",h),serve({fetch:c.fetch,port:a,hostname:p},g=>{m.info("SERVER",`Neox Server listening on http://${p}:${g.port}`),process.send&&process.send({type:"ready",port:g.port});});}Uk().catch(a=>{m.error("SERVER","Failed to start server",{error:a}),cg(),process.exit(1);});W();var qk=4399,zk=3e3,dg=15e3,Hk=se.join(Dn.homedir(),".neox");se.join(Hk,"server.log");async function Jk(a){return new Promise(e=>{let t=Ou.createServer();t.once("error",()=>e(false)),t.once("listening",()=>{t.close(()=>e(true));}),t.listen(a,"127.0.0.1");})}async function Kk(a=qk){for(let e=a;e<a+100;e++)if(await Jk(e))return e;throw new Error("No free port found")}async function Vk(a){try{let e=new AbortController,t=setTimeout(()=>e.abort(),zk),s=await fetch(`http://127.0.0.1:${a}/health`,{signal:e.signal});return clearTimeout(t),s.ok}catch{return false}}async function Yk(a){let e=ug();if(e){if(await Vk(e.port))return m.info("PROCESS_MGR",`Reusing existing server on port ${e.port}${e.daemon?" (daemon)":""}`),{port:e.port,baseUrl:`http://127.0.0.1:${e.port}`,reused:true};m.info("PROCESS_MGR","Stale pid file found, starting new server");}let t=await Kk(),s=await Xk(a,t);return {port:t,baseUrl:`http://127.0.0.1:${t}`,process:s,reused:false}}async function Xk(a,e){let t=se.resolve(se.dirname(new URL(import.meta.url).pathname),"./main.js");m.info("PROCESS_MGR",`Starting server: ${t} --port ${e} --workdir ${a}`);let s=fork(t,["--port",String(e),"--workdir",a],{stdio:["pipe","pipe","pipe","ipc"],detached:false,env:{...process.env}});return await new Promise((n,r)=>{let i=setTimeout(()=>{r(new Error(`Server startup timeout (${dg}ms)`));},dg);s.on("message",o=>{o?.type==="ready"&&(clearTimeout(i),m.info("PROCESS_MGR",`Server ready on port ${o.port}`),n());}),s.on("error",o=>{clearTimeout(i),r(o);}),s.on("exit",o=>{clearTimeout(i),o!==0&&r(new Error(`Server exited with code ${o}`));});}),s}function Qk(a){a.process&&!a.process.killed&&(m.info("PROCESS_MGR","Stopping server process"),a.process.kill("SIGTERM"));}
|
|
3413
|
-
export{kn as ApiError,Ns as DeviceManager,Dr as NeoxClient,zl as RemoteRuntimeAdapter,Pr as RuntimeCheckpointService,Rt as RuntimeHostService,Et as RuntimeOrchestrator,vo as RuntimeOrchestratorError,Bw as applyThinkingMode,zw as authMiddleware,wr as buildInstructions,Wl as createAgentRuntimeHost,Gw as createElectronServices,xs as createNodeServices,dl as electronToolCapabilities,
|
|
3412
|
+
]`}parseSummaryItems(e){if(!e)return [];let t=e.match(/```(?:json)?\s*([\s\S]*?)\s*```/),s=t?t[1]:e,n=s.indexOf("["),r=s.lastIndexOf("]");if(n===-1||r===-1||r<=n)return [];try{let i=JSON.parse(s.slice(n,r+1));if(!Array.isArray(i))return [];let o=["progress","standard","lesson","pinned"];return i.map(l=>({category:l.category,summary:l.summary,files:Array.isArray(l.files)?l.files.filter(Boolean):void 0,confidence:typeof l.confidence=="number"?Math.min(1,Math.max(0,l.confidence)):void 0})).filter(l=>o.includes(l.category)&&typeof l.summary=="string"&&l.summary.trim())}catch{return []}}updateRunAggregate(e){if(!e.runId)return;let t=this.runAggregates.get(e.runId);switch(t||(t={sessionId:e.sessionId,startTs:e.ts,toolCalls:0,fileChanges:0,planUpdates:0,retries:0,errors:0,files:new Set},this.runAggregates.set(e.runId,t)),e.type){case "run_start":t.startTs=e.ts,t.sessionId=e.sessionId,t.promptSummary=e.summary??e.data?.prompt;break;case "run_attempt":t.provider=e.data?.providerName??e.data?.providerId,t.model=e.data?.model;break;case "tool_call_start":t.toolCalls+=1;break;case "file_change":if(t.fileChanges+=1,e.files?.length)for(let s of e.files){if(t.files.size>=Rk)break;t.files.add(s);}break;case "plan_update":t.planUpdates+=1;break;case "stream_retry":t.retries+=1;break;case "run_error":t.errors+=1,t.errorMessage=e.data?.message??e.summary;break;case "run_result":t.tokens=e.data?.totalTokens,t.durationMs=e.data?.durationMs,t.outputPreview=e.data?.outputPreview;break;}}maybeQueueSessionSummary(e){if(!e.runId||e.type!=="run_result"&&e.type!=="run_error")return;let t=this.runAggregates.get(e.runId);if(!t)return;this.runAggregates.delete(e.runId);let s=t.durationMs??Math.max(0,e.ts-t.startTs),n=t.tokens,r=e.type==="run_result"?`Completed in ${s}ms, tokens ${n??"n/a"}`:`Failed: ${ot(t.errorMessage??e.summary??"Error",120)}`,i=[];t.toolCalls>0&&i.push(`tools ${t.toolCalls}`),t.fileChanges>0&&i.push(`files ${t.fileChanges}`),t.retries>0&&i.push(`retries ${t.retries}`);let o=i.length?` (${i.join(", ")})`:"",l=t.promptSummary??"User request";if(this.isLowValuePrompt(l))return;let c=t.outputPreview?ot(t.outputPreview.replace(/\s+/g," ").trim(),120):"",u=c?` | Result: ${c}`:"",d=ot(`${l} -> ${r}${o}${u}`,_k),p=Array.from(t.files),h={schemaVersion:1,id:e.id,ts:e.ts,sessionId:t.sessionId,runId:e.runId,summary:d,files:p.length?p:void 0,evidence:{eventId:e.id},model:t.model,provider:t.provider,toolCalls:t.toolCalls||void 0,errors:t.errors||(e.type==="run_error"?1:void 0),durationMs:s,tokens:n};this.sessionSummaryQueue.push(h),m.info("SESSION_SUMMARY_QUEUED","Session summary queued",{runId:h.runId,sessionId:h.sessionId,summary:ot(h.summary,160),files:h.files,toolCalls:h.toolCalls,retries:t.retries,errors:h.errors,durationMs:h.durationMs,tokens:h.tokens}),this.enqueueSummarizer(h);}async loadSummarySnapshot(){if(this.summaryPath)try{let e=await ce__default.readFile(this.summaryPath,"utf-8"),t=JSON.parse(e);t?.items?.length&&(this.summaryItems=t.items.slice(-this.options.summaryWindow));}catch{}}async persistSummarySnapshot(){if(!this.summaryPath||!this.workspaceId||!this.summaryDirty)return;let e={schemaVersion:1,workspaceId:this.workspaceId,updatedAt:Date.now(),windowSize:this.options.summaryWindow,items:this.summaryItems},t=`${this.summaryPath}.${Date.now()}.tmp`;await ce__default.writeFile(t,JSON.stringify(e,null,2),"utf-8"),await ce__default.rename(t,this.summaryPath),this.summaryDirty=false;}async loadMeta(){if(this.metaPath)try{let e=await ce__default.readFile(this.metaPath,"utf-8"),t=JSON.parse(e);if(t?.lastSeq&&(this.seq=t.lastSeq),t?.createdAt&&(this.createdAt=t.createdAt),t?.currentFile&&this.eventsDir){let s=se__default.join(this.eventsDir,t.currentFile);this.currentFile=s,this.currentDate=t.currentFile.slice(7,17),this.currentFileBytes=await this.getFileSize(s);}}catch{}}async persistMeta(){if(!this.metaPath||!this.workspaceId||!this.workspacePath||!this.workspaceName)return;let e={schemaVersion:1,workspaceId:this.workspaceId,workspacePath:this.workspacePath,workspaceName:this.workspaceName,createdAt:this.createdAt,updatedAt:Date.now(),lastSeq:this.seq,currentFile:this.currentFile?se__default.basename(this.currentFile):void 0,currentFileBytes:this.currentFileBytes,source:this.options.source,agentName:this.options.agentName},t=`${this.metaPath}.${Date.now()}.tmp`;await ce__default.writeFile(t,JSON.stringify(e,null,2),"utf-8"),await ce__default.rename(t,this.metaPath);}};W();var Xo=class{id="edge";tts;constructor(){this.tts=new EdgeTTS;}async init(){}async synthesize(e,t){let s=t?.voice||"zh-CN-XiaoxiaoNeural",n=t?.speed?`${Math.round((t.speed-1)*100)}%`:"+0%",r=t?.format||"mp3",i=r==="opus"?"webm-24khz-16bit-mono-opus":"audio-24khz-48kbitrate-mono-mp3";await this.tts.synthesize(e,s,{rate:n,outputFormat:i});let o=this.tts.toBuffer(),l=this.tts.getAudioInfo();return {audio:o,format:r,durationMs:Math.round(l.estimatedDuration*1e3)}}async synthesizeStream(e,t,s){let n=s?.voice||"zh-CN-XiaoxiaoNeural",r=s?.format||"mp3",i=0;for await(let o of this.tts.synthesizeStream(e,n))o&&o.length>0&&(t(Buffer.from(o),i),i++);return {format:r,totalChunks:i}}async getVoices(){return (await this.tts.getVoicesByLanguage("zh-CN")).map(t=>({id:t.ShortName,name:t.LocalName||t.FriendlyName,locale:t.Locale,gender:t.Gender}))}destroy(){}},Qo=class{provider=null;config;summarizeFn=null;constructor(e){this.config=e;}setSummarizeFn(e){this.summarizeFn=e;}updateConfig(e){this.config={...this.config,...e};}isEnabled(){return this.config.enabled===true}async init(){if(!this.config.enabled)return;(this.config.provider||"edge")==="edge"?this.provider=new Xo:this.provider=new Xo,await this.provider.init(),m.info("TTS",`TTS service initialized with provider: ${this.provider.id}`);}async speak(e){if(!this.config.enabled||!this.provider||!e||e.trim().length===0)return null;try{let t=await this.provider.synthesize(e,{voice:this.config.voice,speed:this.config.speed,format:this.config.format||"mp3"});return {audio:t.audio.toString("base64"),format:t.format,voiceSummary:e,durationMs:t.durationMs}}catch(t){return m.error("TTS",`TTS synthesis failed: ${t.message}`),null}}async speakStream(e,t){if(!this.config.enabled||!this.provider||!e||e.trim().length===0)return null;try{let s=await this.provider.synthesizeStream(e,(n,r)=>{t(n.toString("base64"),r);},{voice:this.config.voice,speed:this.config.speed,format:this.config.format||"mp3"});return {format:s.format,totalChunks:s.totalChunks,voiceText:e}}catch(s){return m.error("TTS",`TTS stream synthesis failed: ${s.message}`),null}}async getVoices(){return this.provider?this.provider.getVoices():[]}destroy(){this.provider?.destroy(),this.provider=null;}};var Jc=se.join(Dn.homedir(),".neox"),Ur=se.join(Jc,"server.pid");function jk(a){Me.existsSync(Jc)||Me.mkdirSync(Jc,{recursive:true}),Me.writeFileSync(Ur,JSON.stringify(a,null,2));}function cg(){try{Me.existsSync(Ur)&&Me.unlinkSync(Ur);}catch{}}function ug(){try{return Me.existsSync(Ur)?JSON.parse(Me.readFileSync(Ur,"utf-8")):null}catch{return null}}function Bk(){let a=process.argv.slice(2),e=4399,t=process.cwd(),s=false;for(let n=0;n<a.length;n++)a[n]==="--port"&&a[n+1]?(e=parseInt(a[n+1],10),n++):a[n]==="--workdir"&&a[n+1]?(t=a[n+1],n++):a[n]==="--daemon"&&(s=true);return {port:e,workDir:t,daemon:s}}async function Gk(a,e){let t=Oe(),s=xs(),n=new rt(t),r=t.agentApprovalMode||t.approvalMode||"auto",i=og(r),o=(v,E)=>{let L=n.getProvider(v);if(!L)return {provider:null,llmConfig:null};let I=E||L.defaultModel||L.models?.[0]?.name;return {provider:L,llmConfig:{model:I,providerName:L.name||L.id,maxInputTokens:L.contextWindow||128e3}}},l=yo(500),c=new Gr({workspacePath:a,source:"server",agentName:"Neox Server"}),u=new Qo(t.tts??{enabled:false});t.tts?.enabled&&(u.setSummarizeFn(async(v,E,L)=>{let I=g;if(!I)return v.substring(0,E);let A=$t.createAdapter(I.protocol,I),O=L||"claude-haiku-4-5-20251001";return (await A.chat([{role:"system",content:`\u4F60\u662F\u4E00\u4E2A\u8BED\u97F3\u6458\u8981\u52A9\u624B\u3002\u628A\u4EE5\u4E0B\u5185\u5BB9\u538B\u7F29\u6210${E}\u5B57\u4EE5\u5185\u7684\u53E3\u8BED\u5316\u6458\u8981\uFF0C\u9002\u5408\u8BED\u97F3\u6717\u8BFB\u3002\u4E0D\u8981\u7528\u4EE3\u7801\u3001markdown\u683C\u5F0F\u3001\u5217\u8868\u3002\u76F4\u63A5\u8BF4\u91CD\u70B9\u3002`},{role:"user",content:v}],{model:O,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||v.substring(0,E)}),await u.init());let d=await Rs(a,s),p=wr({workDir:a}),h=typeof p=="string"?p:"",g=n.getDefaultProvider(),f=g?.id??"",b=g?.defaultModel??g?.models?.[0]?.name??"",y={services:s,permissionManager:i,tools:d,memory:l,workDir:a,providerId:f,modelName:b,resolveProvider:o,systemPrompt:h},w=new Pr;w.setWorkspace(a);let C=null,k=null,T=null,_=null,M=t.runMode||"single";try{C=new Sn({...y,actionLog:c,agentMode:r==="dangerous"?"auto":"agent",enableFGTS:t.experimental?.enableFGTS,enablePTC:t.experimental?.enablePTC});}catch(v){m.error("SERVER","Failed to init SingleAgentRuntime",{error:v});}try{k=new Rn({...y,actionLog:c});}catch(v){m.error("SERVER","Failed to init AssistantRuntime",{error:v});}try{let v=new It(void 0,"cooperate");T=new ms({...y,ccbReviewMode:v.getCCBReviewMode(),workerModels:v.getEnabledWorkerModels().map(E=>({providerId:E.providerId,model:E.model,traits:E.traits}))});}catch(v){m.error("SERVER","Failed to init CooperateRuntime",{error:v});}try{let v=async(L,I,A)=>{let O=g;if(!O)throw new Error("No provider configured for NetworkRuntime");let $=$t.createAdapter(O.protocol,O),P=[{role:"system",content:L},{role:"user",content:I}],N=A?.model||b;if(A?.onText&&$.chatStreamed){let G="",q=$.chatStreamed(P,{model:N,maxTokens:A.maxTokens,temperature:A.temperature,signal:A.signal});for await(let oe of q)oe.type==="text"&&oe.text?(G+=oe.text,A.onText(oe.text)):oe.type==="content_block_delta"&&oe.delta?.text&&(G+=oe.delta.text,A.onText(oe.delta.text));return G}return (await $.chat(P,{model:N,maxTokens:A?.maxTokens,temperature:A?.temperature,signal:A?.signal})).choices?.[0]?.message?.content||""},E=new It(void 0,"network");_=new In({llmCall:v,executionCapability:{orchestrator:new Et({hostService:new Rt({platformServices:s}),resolveProvider:o}),tools:d,permissionManager:i,memory:l,workDir:a,providerId:f,modelName:b,resolveProvider:o,maxIterations:30},autoCreateDefaultAgents:!0,customRoles:E.getNetworkRoles?.()});}catch(v){m.error("SERVER","Failed to init NetworkRuntime",{error:v});}let F=new Set,x=new Map,R=new Map,j={async chat(v,E){F.add(v);let L=new AbortController;x.set(v,L);let I=(N,D)=>{if(m.info("SERVER",`\u{1F4E1} publishRawEvent: type=${N.type} sessionId=${v}`),e.publish({sessionId:v,type:N.type,data:N,tracker:D,timestamp:Date.now()}),N.type==="run_result"&&u.isEnabled()){let G=N.currentTurnText||N.output;G&&u.speak(G).then(q=>{q&&e.publish({sessionId:v,type:"tts_audio",data:{type:"tts_audio",audio:q.audio,audioFormat:q.format,voiceSummary:q.voiceSummary,durationMs:q.durationMs??0},timestamp:Date.now()});}).catch(q=>{m.warn("SERVER",`TTS generation failed: ${q.message}`);});}},O=N=>{e.publish({sessionId:v,type:"error",data:{type:"error",message:N.message},timestamp:Date.now()});},$={onRuntimeEvent:(N,D)=>I(N,D),onError:O},P={onRuntimeEvent:N=>I(N),onError:O};try{let N=E.mode??M,D=E.attachments?{attachments:E.attachments}:void 0;if(N==="single"&&C)await C.chat({sessionId:v,prompt:E.prompt,metadata:D,providerId:E.providerId,modelName:E.modelName},$);else if(N==="assistant"&&k)k.removeAllListeners("worker_event"),k.removeAllListeners("worker_result"),k.on("worker_event",G=>{if(G?.event){let q={...G.event,sourceLabel:G.agentId,workerRole:G.role,workerTask:G.taskSummary};I(q,G.tracker);}}),k.on("worker_result",G=>{e.publish({sessionId:v,type:"worker_result",data:{type:"worker_result",agentId:G.agentId,success:G.success,output:G.output},timestamp:Date.now()});}),await k.chat({sessionId:v,prompt:E.prompt,metadata:D});else if(N==="cooperate"&&T)await T.chat({sessionId:v,prompt:E.prompt,metadata:D},P);else if(N==="network"&&_)await _.chat({prompt:E.prompt,history:[]});else if(C)await C.chat({sessionId:v,prompt:E.prompt,metadata:D,providerId:E.providerId,modelName:E.modelName},$);else throw new Error("No runtime available")}finally{F.delete(v),x.delete(v);}},abort(v){let E=x.get(v);E&&(E.abort(),x.delete(v)),C&&C.abort(),k&&k.abort(),T&&T.abort?.();},replyPermission(v,E,L){let I=R.get(v);I&&(I.resolve(E),R.delete(v));},getActiveSessions(){return [...F]},setRunMode(v){Yo.isValidMode(v)&&(M=v,m.info("SERVER",`Run mode changed to: ${M}`));},getRunMode(){return M},setSandboxMode(v,E){gp(E);},setApprovalMode(v,E){m.info("SERVER",`Approval mode set to: ${E}`);},async compactSession(v){m.info("SERVER",`Compact session: ${v}`);},clearSession(v){l.clear(),m.info("SERVER",`Cleared session: ${v}`);},getContextHealth(v){return l.checkContextHealth?.()??null},async getSessionInfo(v){return {messageCount:l.length,messages:l.getAll()}},setCompressionMode(v,E){m.info("SERVER",`Compression mode set to: ${E}`);},getMemoryStats(v){return {length:l.length,contextHealth:l.checkContextHealth?.()??null}},clearMemory(v){l.clear();},addMemoryMessage(v,E,L){l.add({role:E,content:L});},getToolList(){return {count:d.length,names:d.map(v=>v.name)}},async reloadTools(v){let E=await Rs(v,s);d.length=0,d.push(...E),m.info("SERVER",`Reloaded ${d.length} tools for ${v}`);},async setWorkspace(v){let E=await Rs(v,s);d.length=0,d.push(...E),w.setWorkspace(v),m.info("SERVER",`Workspace switched to: ${v}`);},async startCheckpointWatching(v){return w.startMessage(v)},async stopCheckpointWatching(){await w.stopWatching();},async createCheckpoint(v,E){return w.createCheckpoint(v,E)},async rollbackToCheckpoint(v){return w.rollbackToCheckpoint(v)},async rollbackSingleFile(v){return w.rollbackSingleFile(v)},async reapplySingleFile(v){return w.reapplySingleFile(v)},async getCheckpoints(v,E){return w.getCheckpoints(v,E)},async getCheckpointStats(){return w.getCurrentStats?.()??{created:0,modified:0,deleted:0,directories:0,total:0}},async getCheckpointChanges(){return w.getChangeBuffer?.()??[]},setCheckpointEnabled(v){w.setEnabled(v);},isCheckpointEnabled(){return w.isEnabled()},async cleanupCheckpoints(){await w.cleanup?.();},async getHostStatus(){return {isRunning:F.size>0,currentTask:null,mode:M,workingDirectory:a,uptime:Math.floor(process.uptime()),memoryUsage:{tokensUsed:l.length,contextWindow:128e3,pressure:l.length/128e3}}},async getHostAgents(){return [{id:"main",role:"main",status:F.size>0?"running":"idle"}]},async getHostActivity(v=10){return []},async getHostSession(){return {messageCount:l.length,tokensUsed:0}},async getHostSystem(){let v=null,E="unknown";try{let{execSync:L}=await import('child_process');try{v=L("git rev-parse --abbrev-ref HEAD",{cwd:a,encoding:"utf-8",timeout:5e3}).trim();}catch{}try{E=L("git status --porcelain",{cwd:a,encoding:"utf-8",timeout:5e3}).trim().length===0?"clean":"dirty";}catch{}}catch{}return {platform:process.platform,arch:process.arch,cwd:a,gitBranch:v,gitStatus:E,nodeVersion:process.version}},async hostInterrupt(v){for(let[L,I]of x)I.abort();C&&C.abort(),k&&k.abort(),T&&T.abort?.();let E=F.size>0;return F.clear(),x.clear(),{interrupted:E}},async hostSendCommand(v,E){let L=`cmd-${Date.now()}`,I={prompt:v};return j.chat(L,I).catch(A=>{m.error("SERVER",`hostSendCommand failed: ${A.message}`);}),{queued:true,sessionId:L}},setTTSEnabled(v){let E=u.isEnabled();u.updateConfig({enabled:v,provider:"edge"}),v&&!E&&(u.summarizeFn||u.setSummarizeFn(async(L,I,A)=>{let O=g;if(!O)return L.substring(0,I);let $=$t.createAdapter(O.protocol,O),P=A||"claude-haiku-4-5-20251001";return (await $.chat([{role:"system",content:`\u4F60\u662F\u4E00\u4E2A\u8BED\u97F3\u6458\u8981\u52A9\u624B\u3002\u628A\u4EE5\u4E0B\u5185\u5BB9\u538B\u7F29\u6210${I}\u5B57\u4EE5\u5185\u7684\u53E3\u8BED\u5316\u6458\u8981\uFF0C\u9002\u5408\u8BED\u97F3\u6717\u8BFB\u3002\u4E0D\u8981\u7528\u4EE3\u7801\u3001markdown\u683C\u5F0F\u3001\u5217\u8868\u3002\u76F4\u63A5\u8BF4\u91CD\u70B9\u3002`},{role:"user",content:L}],{model:P,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||L.substring(0,I)}),u.init().catch(L=>{m.error("SERVER",`TTS init failed: ${L.message}`);})),m.info("SERVER",`TTS ${v?"enabled":"disabled"}`);},isTTSEnabled(){return u.isEnabled()},getTTSConfig(){return t.tts??{enabled:false}},updateTTSConfig(v){let E=u.isEnabled();u.updateConfig(v),v.enabled&&!E&&u.init().catch(L=>{m.error("SERVER",`TTS init failed: ${L.message}`);});}};return j}async function Uk(){let{port:a,workDir:e,daemon:t}=Bk(),s=Oe(),n=s.remote??{};m.info("SERVER",`Starting Neox Server on port ${a}, workDir: ${e}`);let r=new xo,i=new Ns,o=await Gk(e,r),l={workDir:e};n.enabled&&n.token&&(l.auth={token:n.token,allowLocalWithoutAuth:true},l.rateLimit={maxRequests:120,windowMs:6e4},l.corsOrigins=["*"],m.info("SERVER","Remote mode enabled \u2014 auth + rateLimit active"));let{app:c,channelRegistry:u}=ym(l,o,r,i),d=s.channels;d&&(await u.initialize(d),u.setHandler(async g=>{let f=`ch-${g.channelId}-${g.chatId}`;return new Promise(b=>{let y="",w=r.subscribe(f);(async()=>{for await(let C of w){if(C.type==="run_result"){y=C.data?.output||"",w.close();break}if(C.type==="error"){y=`Error: ${C.data?.message||"unknown"}`,w.close();break}}b(y||"[no response]");})(),o.chat(f,{prompt:g.text}).catch(()=>{b("[error processing message]"),w.close();});})}),await u.startAll(),m.info("SERVER","Channel adapters initialized")),await ht.initialize(e),ht.watch(e),m.info("SERVER",`Skills hot-reload active (${ht.size} skills loaded)`);let p=process.env.NEOX_HOST||(n.enabled?n.host||"0.0.0.0":"127.0.0.1");jk({pid:process.pid,port:a,workDir:e,startedAt:Date.now(),daemon:t});let h=()=>{m.info("SERVER","Shutting down..."),ht.stopWatch(),u.stopAll().catch(()=>{}),cg(),i.dispose(),r.dispose(),process.exit(0);};process.on("SIGINT",h),process.on("SIGTERM",h),serve({fetch:c.fetch,port:a,hostname:p},g=>{m.info("SERVER",`Neox Server listening on http://${p}:${g.port}`),process.send&&process.send({type:"ready",port:g.port});});}Uk().catch(a=>{m.error("SERVER","Failed to start server",{error:a}),cg(),process.exit(1);});W();var zk=4399,Hk=3e3,dg=15e3,Jk=se.join(Dn.homedir(),".neox");se.join(Jk,"server.log");async function Kk(a){return new Promise(e=>{let t=Ou.createServer();t.once("error",()=>e(false)),t.once("listening",()=>{t.close(()=>e(true));}),t.listen(a,"127.0.0.1");})}async function Vk(a=zk){for(let e=a;e<a+100;e++)if(await Kk(e))return e;throw new Error("No free port found")}async function Yk(a){try{let e=new AbortController,t=setTimeout(()=>e.abort(),Hk),s=await fetch(`http://127.0.0.1:${a}/health`,{signal:e.signal});return clearTimeout(t),s.ok}catch{return false}}async function Xk(a){let e=ug();if(e){if(await Yk(e.port))return m.info("PROCESS_MGR",`Reusing existing server on port ${e.port}${e.daemon?" (daemon)":""}`),{port:e.port,baseUrl:`http://127.0.0.1:${e.port}`,reused:true};m.info("PROCESS_MGR","Stale pid file found, starting new server");}let t=await Vk(),s=await Qk(a,t);return {port:t,baseUrl:`http://127.0.0.1:${t}`,process:s,reused:false}}async function Qk(a,e){let t=se.resolve(se.dirname(fileURLToPath(import.meta.url)),"./main.js");m.info("PROCESS_MGR",`Starting server: ${t} --port ${e} --workdir ${a}`);let s=fork(t,["--port",String(e),"--workdir",a],{stdio:["pipe","pipe","pipe","ipc"],detached:false,env:{...process.env}});return await new Promise((n,r)=>{let i=setTimeout(()=>{r(new Error(`Server startup timeout (${dg}ms)`));},dg);s.on("message",o=>{o?.type==="ready"&&(clearTimeout(i),m.info("PROCESS_MGR",`Server ready on port ${o.port}`),n());}),s.on("error",o=>{clearTimeout(i),r(o);}),s.on("exit",o=>{clearTimeout(i),o!==0&&r(new Error(`Server exited with code ${o}`));});}),s}function Zk(a){a.process&&!a.process.killed&&(m.info("PROCESS_MGR","Stopping server process"),a.process.kill("SIGTERM"));}
|
|
3413
|
+
export{kn as ApiError,Ns as DeviceManager,Dr as NeoxClient,zl as RemoteRuntimeAdapter,Pr as RuntimeCheckpointService,Rt as RuntimeHostService,Et as RuntimeOrchestrator,vo as RuntimeOrchestratorError,Bw as applyThinkingMode,zw as authMiddleware,wr as buildInstructions,Wl as createAgentRuntimeHost,Gw as createElectronServices,xs as createNodeServices,dl as electronToolCapabilities,Xk as ensureServer,Rs as getTools,Oi as nodeToolCapabilities,_b as preloadShellEnv,Hl as rateLimitMiddleware,pp as setToolServices,Zk as stopServer};
|
package/dist/server/main.js
CHANGED
|
@@ -3408,5 +3408,5 @@ ${e.map(s=>{let n=Dr(s.ts),r=s.files&&s.files.length>0?` files=${s.files.join(",
|
|
|
3408
3408
|
[
|
|
3409
3409
|
{"category":"progress","summary":"\u5B8C\u6210\u4E86 X\uFF0C\u4E0B\u4E00\u6B65 Y","files":["src/app.ts"],"confidence":0.7},
|
|
3410
3410
|
{"category":"lesson","summary":"\u907F\u514D\u91CD\u590D\u6267\u884C Z\uFF0C\u5BB9\u6613\u8D85\u65F6","confidence":0.5}
|
|
3411
|
-
]`}parseSummaryItems(e){if(!e)return [];let t=e.match(/```(?:json)?\s*([\s\S]*?)\s*```/),s=t?t[1]:e,n=s.indexOf("["),r=s.lastIndexOf("]");if(n===-1||r===-1||r<=n)return [];try{let i=JSON.parse(s.slice(n,r+1));if(!Array.isArray(i))return [];let o=["progress","standard","lesson","pinned"];return i.map(l=>({category:l.category,summary:l.summary,files:Array.isArray(l.files)?l.files.filter(Boolean):void 0,confidence:typeof l.confidence=="number"?Math.min(1,Math.max(0,l.confidence)):void 0})).filter(l=>o.includes(l.category)&&typeof l.summary=="string"&&l.summary.trim())}catch{return []}}updateRunAggregate(e){if(!e.runId)return;let t=this.runAggregates.get(e.runId);switch(t||(t={sessionId:e.sessionId,startTs:e.ts,toolCalls:0,fileChanges:0,planUpdates:0,retries:0,errors:0,files:new Set},this.runAggregates.set(e.runId,t)),e.type){case "run_start":t.startTs=e.ts,t.sessionId=e.sessionId,t.promptSummary=e.summary??e.data?.prompt;break;case "run_attempt":t.provider=e.data?.providerName??e.data?.providerId,t.model=e.data?.model;break;case "tool_call_start":t.toolCalls+=1;break;case "file_change":if(t.fileChanges+=1,e.files?.length)for(let s of e.files){if(t.files.size>=pk)break;t.files.add(s);}break;case "plan_update":t.planUpdates+=1;break;case "stream_retry":t.retries+=1;break;case "run_error":t.errors+=1,t.errorMessage=e.data?.message??e.summary;break;case "run_result":t.tokens=e.data?.totalTokens,t.durationMs=e.data?.durationMs,t.outputPreview=e.data?.outputPreview;break;}}maybeQueueSessionSummary(e){if(!e.runId||e.type!=="run_result"&&e.type!=="run_error")return;let t=this.runAggregates.get(e.runId);if(!t)return;this.runAggregates.delete(e.runId);let s=t.durationMs??Math.max(0,e.ts-t.startTs),n=t.tokens,r=e.type==="run_result"?`Completed in ${s}ms, tokens ${n??"n/a"}`:`Failed: ${ot(t.errorMessage??e.summary??"Error",120)}`,i=[];t.toolCalls>0&&i.push(`tools ${t.toolCalls}`),t.fileChanges>0&&i.push(`files ${t.fileChanges}`),t.retries>0&&i.push(`retries ${t.retries}`);let o=i.length?` (${i.join(", ")})`:"",l=t.promptSummary??"User request";if(this.isLowValuePrompt(l))return;let c=t.outputPreview?ot(t.outputPreview.replace(/\s+/g," ").trim(),120):"",u=c?` | Result: ${c}`:"",d=ot(`${l} -> ${r}${o}${u}`,dk),p=Array.from(t.files),h={schemaVersion:1,id:e.id,ts:e.ts,sessionId:t.sessionId,runId:e.runId,summary:d,files:p.length?p:void 0,evidence:{eventId:e.id},model:t.model,provider:t.provider,toolCalls:t.toolCalls||void 0,errors:t.errors||(e.type==="run_error"?1:void 0),durationMs:s,tokens:n};this.sessionSummaryQueue.push(h),m.info("SESSION_SUMMARY_QUEUED","Session summary queued",{runId:h.runId,sessionId:h.sessionId,summary:ot(h.summary,160),files:h.files,toolCalls:h.toolCalls,retries:t.retries,errors:h.errors,durationMs:h.durationMs,tokens:h.tokens}),this.enqueueSummarizer(h);}async loadSummarySnapshot(){if(this.summaryPath)try{let e=await ce__default.readFile(this.summaryPath,"utf-8"),t=JSON.parse(e);t?.items?.length&&(this.summaryItems=t.items.slice(-this.options.summaryWindow));}catch{}}async persistSummarySnapshot(){if(!this.summaryPath||!this.workspaceId||!this.summaryDirty)return;let e={schemaVersion:1,workspaceId:this.workspaceId,updatedAt:Date.now(),windowSize:this.options.summaryWindow,items:this.summaryItems},t=`${this.summaryPath}.${Date.now()}.tmp`;await ce__default.writeFile(t,JSON.stringify(e,null,2),"utf-8"),await ce__default.rename(t,this.summaryPath),this.summaryDirty=false;}async loadMeta(){if(this.metaPath)try{let e=await ce__default.readFile(this.metaPath,"utf-8"),t=JSON.parse(e);if(t?.lastSeq&&(this.seq=t.lastSeq),t?.createdAt&&(this.createdAt=t.createdAt),t?.currentFile&&this.eventsDir){let s=se__default.join(this.eventsDir,t.currentFile);this.currentFile=s,this.currentDate=t.currentFile.slice(7,17),this.currentFileBytes=await this.getFileSize(s);}}catch{}}async persistMeta(){if(!this.metaPath||!this.workspaceId||!this.workspacePath||!this.workspaceName)return;let e={schemaVersion:1,workspaceId:this.workspaceId,workspacePath:this.workspacePath,workspaceName:this.workspaceName,createdAt:this.createdAt,updatedAt:Date.now(),lastSeq:this.seq,currentFile:this.currentFile?se__default.basename(this.currentFile):void 0,currentFileBytes:this.currentFileBytes,source:this.options.source,agentName:this.options.agentName},t=`${this.metaPath}.${Date.now()}.tmp`;await ce__default.writeFile(t,JSON.stringify(e,null,2),"utf-8"),await ce__default.rename(t,this.metaPath);}};W();var Ho=class{id="edge";tts;constructor(){this.tts=new EdgeTTS;}async init(){}async synthesize(e,t){let s=t?.voice||"zh-CN-XiaoxiaoNeural",n=t?.speed?`${Math.round((t.speed-1)*100)}%`:"+0%",r=t?.format||"mp3",i=r==="opus"?"webm-24khz-16bit-mono-opus":"audio-24khz-48kbitrate-mono-mp3";await this.tts.synthesize(e,s,{rate:n,outputFormat:i});let o=this.tts.toBuffer(),l=this.tts.getAudioInfo();return {audio:o,format:r,durationMs:Math.round(l.estimatedDuration*1e3)}}async synthesizeStream(e,t,s){let n=s?.voice||"zh-CN-XiaoxiaoNeural",r=s?.format||"mp3",i=0;for await(let o of this.tts.synthesizeStream(e,n))o&&o.length>0&&(t(Buffer.from(o),i),i++);return {format:r,totalChunks:i}}async getVoices(){return (await this.tts.getVoicesByLanguage("zh-CN")).map(t=>({id:t.ShortName,name:t.LocalName||t.FriendlyName,locale:t.Locale,gender:t.Gender}))}destroy(){}},Jo=class{provider=null;config;summarizeFn=null;constructor(e){this.config=e;}setSummarizeFn(e){this.summarizeFn=e;}updateConfig(e){this.config={...this.config,...e};}isEnabled(){return this.config.enabled===true}async init(){if(!this.config.enabled)return;(this.config.provider||"edge")==="edge"?this.provider=new Ho:this.provider=new Ho,await this.provider.init(),m.info("TTS",`TTS service initialized with provider: ${this.provider.id}`);}async speak(e){if(!this.config.enabled||!this.provider||!e||e.trim().length===0)return null;try{let t=await this.provider.synthesize(e,{voice:this.config.voice,speed:this.config.speed,format:this.config.format||"mp3"});return {audio:t.audio.toString("base64"),format:t.format,voiceSummary:e,durationMs:t.durationMs}}catch(t){return m.error("TTS",`TTS synthesis failed: ${t.message}`),null}}async speakStream(e,t){if(!this.config.enabled||!this.provider||!e||e.trim().length===0)return null;try{let s=await this.provider.synthesizeStream(e,(n,r)=>{t(n.toString("base64"),r);},{voice:this.config.voice,speed:this.config.speed,format:this.config.format||"mp3"});return {format:s.format,totalChunks:s.totalChunks,voiceText:e}}catch(s){return m.error("TTS",`TTS stream synthesis failed: ${s.message}`),null}}async getVoices(){return this.provider?this.provider.getVoices():[]}destroy(){this.provider?.destroy(),this.provider=null;}};var jc=se.join(In.homedir(),".neox"),Or=se.join(jc,"server.pid");function xk(a){Me.existsSync(jc)||Me.mkdirSync(jc,{recursive:true}),Me.writeFileSync(Or,JSON.stringify(a,null,2));}function sg(){try{Me.existsSync(Or)&&Me.unlinkSync(Or);}catch{}}function yB(){try{return Me.existsSync(Or)?JSON.parse(Me.readFileSync(Or,"utf-8")):null}catch{return null}}function Tk(){let a=process.argv.slice(2),e=4399,t=process.cwd(),s=false;for(let n=0;n<a.length;n++)a[n]==="--port"&&a[n+1]?(e=parseInt(a[n+1],10),n++):a[n]==="--workdir"&&a[n+1]?(t=a[n+1],n++):a[n]==="--daemon"&&(s=true);return {port:e,workDir:t,daemon:s}}async function _k(a,e){let t=Oe(),s=Wr(),n=new rt(t),r=t.agentApprovalMode||t.approvalMode||"auto",i=Zm(r),o=(v,E)=>{let L=n.getProvider(v);if(!L)return {provider:null,llmConfig:null};let I=E||L.defaultModel||L.models?.[0]?.name;return {provider:L,llmConfig:{model:I,providerName:L.name||L.id,maxInputTokens:L.contextWindow||128e3}}},l=fo(500),c=new Lr({workspacePath:a,source:"server",agentName:"Neox Server"}),u=new Jo(t.tts??{enabled:false});t.tts?.enabled&&(u.setSummarizeFn(async(v,E,L)=>{let I=g;if(!I)return v.substring(0,E);let A=Ot.createAdapter(I.protocol,I),O=L||"claude-haiku-4-5-20251001";return (await A.chat([{role:"system",content:`\u4F60\u662F\u4E00\u4E2A\u8BED\u97F3\u6458\u8981\u52A9\u624B\u3002\u628A\u4EE5\u4E0B\u5185\u5BB9\u538B\u7F29\u6210${E}\u5B57\u4EE5\u5185\u7684\u53E3\u8BED\u5316\u6458\u8981\uFF0C\u9002\u5408\u8BED\u97F3\u6717\u8BFB\u3002\u4E0D\u8981\u7528\u4EE3\u7801\u3001markdown\u683C\u5F0F\u3001\u5217\u8868\u3002\u76F4\u63A5\u8BF4\u91CD\u70B9\u3002`},{role:"user",content:v}],{model:O,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||v.substring(0,E)}),await u.init());let d=await un(a,s),p=Ji({workDir:a}),h=typeof p=="string"?p:"",g=n.getDefaultProvider(),f=g?.id??"",b=g?.defaultModel??g?.models?.[0]?.name??"",y={services:s,permissionManager:i,tools:d,memory:l,workDir:a,providerId:f,modelName:b,resolveProvider:o,systemPrompt:h},w=new zo;w.setWorkspace(a);let C=null,k=null,T=null,_=null,M=t.runMode||"single";try{C=new wn({...y,actionLog:c,agentMode:r==="dangerous"?"auto":"agent",enableFGTS:t.experimental?.enableFGTS,enablePTC:t.experimental?.enablePTC});}catch(v){m.error("SERVER","Failed to init SingleAgentRuntime",{error:v});}try{k=new xn({...y,actionLog:c});}catch(v){m.error("SERVER","Failed to init AssistantRuntime",{error:v});}try{let v=new At(void 0,"cooperate");T=new ps({...y,ccbReviewMode:v.getCCBReviewMode(),workerModels:v.getEnabledWorkerModels().map(E=>({providerId:E.providerId,model:E.model,traits:E.traits}))});}catch(v){m.error("SERVER","Failed to init CooperateRuntime",{error:v});}try{let v=async(L,I,A)=>{let O=g;if(!O)throw new Error("No provider configured for NetworkRuntime");let $=Ot.createAdapter(O.protocol,O),P=[{role:"system",content:L},{role:"user",content:I}],N=A?.model||b;if(A?.onText&&$.chatStreamed){let G="",q=$.chatStreamed(P,{model:N,maxTokens:A.maxTokens,temperature:A.temperature,signal:A.signal});for await(let oe of q)oe.type==="text"&&oe.text?(G+=oe.text,A.onText(oe.text)):oe.type==="content_block_delta"&&oe.delta?.text&&(G+=oe.delta.text,A.onText(oe.delta.text));return G}return (await $.chat(P,{model:N,maxTokens:A?.maxTokens,temperature:A?.temperature,signal:A?.signal})).choices?.[0]?.message?.content||""},E=new At(void 0,"network");_=new Rn({llmCall:v,executionCapability:{orchestrator:new $t({hostService:new Nt({platformServices:s}),resolveProvider:o}),tools:d,permissionManager:i,memory:l,workDir:a,providerId:f,modelName:b,resolveProvider:o,maxIterations:30},autoCreateDefaultAgents:!0,customRoles:E.getNetworkRoles?.()});}catch(v){m.error("SERVER","Failed to init NetworkRuntime",{error:v});}let F=new Set,x=new Map,R=new Map,j={async chat(v,E){F.add(v);let L=new AbortController;x.set(v,L);let I=(N,D)=>{if(m.info("SERVER",`\u{1F4E1} publishRawEvent: type=${N.type} sessionId=${v}`),e.publish({sessionId:v,type:N.type,data:N,tracker:D,timestamp:Date.now()}),N.type==="run_result"&&u.isEnabled()){let G=N.currentTurnText||N.output;G&&u.speak(G).then(q=>{q&&e.publish({sessionId:v,type:"tts_audio",data:{type:"tts_audio",audio:q.audio,audioFormat:q.format,voiceSummary:q.voiceSummary,durationMs:q.durationMs??0},timestamp:Date.now()});}).catch(q=>{m.warn("SERVER",`TTS generation failed: ${q.message}`);});}},O=N=>{e.publish({sessionId:v,type:"error",data:{type:"error",message:N.message},timestamp:Date.now()});},$={onRuntimeEvent:(N,D)=>I(N,D),onError:O},P={onRuntimeEvent:N=>I(N),onError:O};try{let N=E.mode??M,D=E.attachments?{attachments:E.attachments}:void 0;if(N==="single"&&C)await C.chat({sessionId:v,prompt:E.prompt,metadata:D,providerId:E.providerId,modelName:E.modelName},$);else if(N==="assistant"&&k)k.removeAllListeners("worker_event"),k.removeAllListeners("worker_result"),k.on("worker_event",G=>{if(G?.event){let q={...G.event,sourceLabel:G.agentId,workerRole:G.role,workerTask:G.taskSummary};I(q,G.tracker);}}),k.on("worker_result",G=>{e.publish({sessionId:v,type:"worker_result",data:{type:"worker_result",agentId:G.agentId,success:G.success,output:G.output},timestamp:Date.now()});}),await k.chat({sessionId:v,prompt:E.prompt,metadata:D});else if(N==="cooperate"&&T)await T.chat({sessionId:v,prompt:E.prompt,metadata:D},P);else if(N==="network"&&_)await _.chat({prompt:E.prompt,history:[]});else if(C)await C.chat({sessionId:v,prompt:E.prompt,metadata:D,providerId:E.providerId,modelName:E.modelName},$);else throw new Error("No runtime available")}finally{F.delete(v),x.delete(v);}},abort(v){let E=x.get(v);E&&(E.abort(),x.delete(v)),C&&C.abort(),k&&k.abort(),T&&T.abort?.();},replyPermission(v,E,L){let I=R.get(v);I&&(I.resolve(E),R.delete(v));},getActiveSessions(){return [...F]},setRunMode(v){Wo.isValidMode(v)&&(M=v,m.info("SERVER",`Run mode changed to: ${M}`));},getRunMode(){return M},setSandboxMode(v,E){lp(E);},setApprovalMode(v,E){m.info("SERVER",`Approval mode set to: ${E}`);},async compactSession(v){m.info("SERVER",`Compact session: ${v}`);},clearSession(v){l.clear(),m.info("SERVER",`Cleared session: ${v}`);},getContextHealth(v){return l.checkContextHealth?.()??null},async getSessionInfo(v){return {messageCount:l.length,messages:l.getAll()}},setCompressionMode(v,E){m.info("SERVER",`Compression mode set to: ${E}`);},getMemoryStats(v){return {length:l.length,contextHealth:l.checkContextHealth?.()??null}},clearMemory(v){l.clear();},addMemoryMessage(v,E,L){l.add({role:E,content:L});},getToolList(){return {count:d.length,names:d.map(v=>v.name)}},async reloadTools(v){let E=await un(v,s);d.length=0,d.push(...E),m.info("SERVER",`Reloaded ${d.length} tools for ${v}`);},async setWorkspace(v){let E=await un(v,s);d.length=0,d.push(...E),w.setWorkspace(v),m.info("SERVER",`Workspace switched to: ${v}`);},async startCheckpointWatching(v){return w.startMessage(v)},async stopCheckpointWatching(){await w.stopWatching();},async createCheckpoint(v,E){return w.createCheckpoint(v,E)},async rollbackToCheckpoint(v){return w.rollbackToCheckpoint(v)},async rollbackSingleFile(v){return w.rollbackSingleFile(v)},async reapplySingleFile(v){return w.reapplySingleFile(v)},async getCheckpoints(v,E){return w.getCheckpoints(v,E)},async getCheckpointStats(){return w.getCurrentStats?.()??{created:0,modified:0,deleted:0,directories:0,total:0}},async getCheckpointChanges(){return w.getChangeBuffer?.()??[]},setCheckpointEnabled(v){w.setEnabled(v);},isCheckpointEnabled(){return w.isEnabled()},async cleanupCheckpoints(){await w.cleanup?.();},async getHostStatus(){return {isRunning:F.size>0,currentTask:null,mode:M,workingDirectory:a,uptime:Math.floor(process.uptime()),memoryUsage:{tokensUsed:l.length,contextWindow:128e3,pressure:l.length/128e3}}},async getHostAgents(){return [{id:"main",role:"main",status:F.size>0?"running":"idle"}]},async getHostActivity(v=10){return []},async getHostSession(){return {messageCount:l.length,tokensUsed:0}},async getHostSystem(){let v=null,E="unknown";try{let{execSync:L}=await import('child_process');try{v=L("git rev-parse --abbrev-ref HEAD",{cwd:a,encoding:"utf-8",timeout:5e3}).trim();}catch{}try{E=L("git status --porcelain",{cwd:a,encoding:"utf-8",timeout:5e3}).trim().length===0?"clean":"dirty";}catch{}}catch{}return {platform:process.platform,arch:process.arch,cwd:a,gitBranch:v,gitStatus:E,nodeVersion:process.version}},async hostInterrupt(v){for(let[L,I]of x)I.abort();C&&C.abort(),k&&k.abort(),T&&T.abort?.();let E=F.size>0;return F.clear(),x.clear(),{interrupted:E}},async hostSendCommand(v,E){let L=`cmd-${Date.now()}`,I={prompt:v};return j.chat(L,I).catch(A=>{m.error("SERVER",`hostSendCommand failed: ${A.message}`);}),{queued:true,sessionId:L}},setTTSEnabled(v){let E=u.isEnabled();u.updateConfig({enabled:v,provider:"edge"}),v&&!E&&(u.summarizeFn||u.setSummarizeFn(async(L,I,A)=>{let O=g;if(!O)return L.substring(0,I);let $=Ot.createAdapter(O.protocol,O),P=A||"claude-haiku-4-5-20251001";return (await $.chat([{role:"system",content:`\u4F60\u662F\u4E00\u4E2A\u8BED\u97F3\u6458\u8981\u52A9\u624B\u3002\u628A\u4EE5\u4E0B\u5185\u5BB9\u538B\u7F29\u6210${I}\u5B57\u4EE5\u5185\u7684\u53E3\u8BED\u5316\u6458\u8981\uFF0C\u9002\u5408\u8BED\u97F3\u6717\u8BFB\u3002\u4E0D\u8981\u7528\u4EE3\u7801\u3001markdown\u683C\u5F0F\u3001\u5217\u8868\u3002\u76F4\u63A5\u8BF4\u91CD\u70B9\u3002`},{role:"user",content:L}],{model:P,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||L.substring(0,I)}),u.init().catch(L=>{m.error("SERVER",`TTS init failed: ${L.message}`);})),m.info("SERVER",`TTS ${v?"enabled":"disabled"}`);},isTTSEnabled(){return u.isEnabled()},getTTSConfig(){return t.tts??{enabled:false}},updateTTSConfig(v){let E=u.isEnabled();u.updateConfig(v),v.enabled&&!E&&u.init().catch(L=>{m.error("SERVER",`TTS init failed: ${L.message}`);});}};return j}async function Rk(){let{port:a,workDir:e,daemon:t}=Tk(),s=Oe(),n=s.remote??{};m.info("SERVER",`Starting Neox Server on port ${a}, workDir: ${e}`);let r=new Br,i=new Ns,o=await _k(e,r),l={workDir:e};n.enabled&&n.token&&(l.auth={token:n.token,allowLocalWithoutAuth:true},l.rateLimit={maxRequests:120,windowMs:6e4},l.corsOrigins=["*"],m.info("SERVER","Remote mode enabled \u2014 auth + rateLimit active"));let{app:c,channelRegistry:u}=Jc(l,o,r,i),d=s.channels;d&&(await u.initialize(d),u.setHandler(async g=>{let f=`ch-${g.channelId}-${g.chatId}`;return new Promise(b=>{let y="",w=r.subscribe(f);(async()=>{for await(let C of w){if(C.type==="run_result"){y=C.data?.output||"",w.close();break}if(C.type==="error"){y=`Error: ${C.data?.message||"unknown"}`,w.close();break}}b(y||"[no response]");})(),o.chat(f,{prompt:g.text}).catch(()=>{b("[error processing message]"),w.close();});})}),await u.startAll(),m.info("SERVER","Channel adapters initialized")),await ht.initialize(e),ht.watch(e),m.info("SERVER",`Skills hot-reload active (${ht.size} skills loaded)`);let p=n.enabled?n.host||"0.0.0.0":"127.0.0.1";xk({pid:process.pid,port:a,workDir:e,startedAt:Date.now(),daemon:t});let h=()=>{m.info("SERVER","Shutting down..."),ht.stopWatch(),u.stopAll().catch(()=>{}),sg(),i.dispose(),r.dispose(),process.exit(0);};process.on("SIGINT",h),process.on("SIGTERM",h),serve({fetch:c.fetch,port:a,hostname:p},g=>{m.info("SERVER",`Neox Server listening on http://${p}:${g.port}`),process.send&&process.send({type:"ready",port:g.port});});}Rk().catch(a=>{m.error("SERVER","Failed to start server",{error:a}),sg(),process.exit(1);});
|
|
3411
|
+
]`}parseSummaryItems(e){if(!e)return [];let t=e.match(/```(?:json)?\s*([\s\S]*?)\s*```/),s=t?t[1]:e,n=s.indexOf("["),r=s.lastIndexOf("]");if(n===-1||r===-1||r<=n)return [];try{let i=JSON.parse(s.slice(n,r+1));if(!Array.isArray(i))return [];let o=["progress","standard","lesson","pinned"];return i.map(l=>({category:l.category,summary:l.summary,files:Array.isArray(l.files)?l.files.filter(Boolean):void 0,confidence:typeof l.confidence=="number"?Math.min(1,Math.max(0,l.confidence)):void 0})).filter(l=>o.includes(l.category)&&typeof l.summary=="string"&&l.summary.trim())}catch{return []}}updateRunAggregate(e){if(!e.runId)return;let t=this.runAggregates.get(e.runId);switch(t||(t={sessionId:e.sessionId,startTs:e.ts,toolCalls:0,fileChanges:0,planUpdates:0,retries:0,errors:0,files:new Set},this.runAggregates.set(e.runId,t)),e.type){case "run_start":t.startTs=e.ts,t.sessionId=e.sessionId,t.promptSummary=e.summary??e.data?.prompt;break;case "run_attempt":t.provider=e.data?.providerName??e.data?.providerId,t.model=e.data?.model;break;case "tool_call_start":t.toolCalls+=1;break;case "file_change":if(t.fileChanges+=1,e.files?.length)for(let s of e.files){if(t.files.size>=pk)break;t.files.add(s);}break;case "plan_update":t.planUpdates+=1;break;case "stream_retry":t.retries+=1;break;case "run_error":t.errors+=1,t.errorMessage=e.data?.message??e.summary;break;case "run_result":t.tokens=e.data?.totalTokens,t.durationMs=e.data?.durationMs,t.outputPreview=e.data?.outputPreview;break;}}maybeQueueSessionSummary(e){if(!e.runId||e.type!=="run_result"&&e.type!=="run_error")return;let t=this.runAggregates.get(e.runId);if(!t)return;this.runAggregates.delete(e.runId);let s=t.durationMs??Math.max(0,e.ts-t.startTs),n=t.tokens,r=e.type==="run_result"?`Completed in ${s}ms, tokens ${n??"n/a"}`:`Failed: ${ot(t.errorMessage??e.summary??"Error",120)}`,i=[];t.toolCalls>0&&i.push(`tools ${t.toolCalls}`),t.fileChanges>0&&i.push(`files ${t.fileChanges}`),t.retries>0&&i.push(`retries ${t.retries}`);let o=i.length?` (${i.join(", ")})`:"",l=t.promptSummary??"User request";if(this.isLowValuePrompt(l))return;let c=t.outputPreview?ot(t.outputPreview.replace(/\s+/g," ").trim(),120):"",u=c?` | Result: ${c}`:"",d=ot(`${l} -> ${r}${o}${u}`,dk),p=Array.from(t.files),h={schemaVersion:1,id:e.id,ts:e.ts,sessionId:t.sessionId,runId:e.runId,summary:d,files:p.length?p:void 0,evidence:{eventId:e.id},model:t.model,provider:t.provider,toolCalls:t.toolCalls||void 0,errors:t.errors||(e.type==="run_error"?1:void 0),durationMs:s,tokens:n};this.sessionSummaryQueue.push(h),m.info("SESSION_SUMMARY_QUEUED","Session summary queued",{runId:h.runId,sessionId:h.sessionId,summary:ot(h.summary,160),files:h.files,toolCalls:h.toolCalls,retries:t.retries,errors:h.errors,durationMs:h.durationMs,tokens:h.tokens}),this.enqueueSummarizer(h);}async loadSummarySnapshot(){if(this.summaryPath)try{let e=await ce__default.readFile(this.summaryPath,"utf-8"),t=JSON.parse(e);t?.items?.length&&(this.summaryItems=t.items.slice(-this.options.summaryWindow));}catch{}}async persistSummarySnapshot(){if(!this.summaryPath||!this.workspaceId||!this.summaryDirty)return;let e={schemaVersion:1,workspaceId:this.workspaceId,updatedAt:Date.now(),windowSize:this.options.summaryWindow,items:this.summaryItems},t=`${this.summaryPath}.${Date.now()}.tmp`;await ce__default.writeFile(t,JSON.stringify(e,null,2),"utf-8"),await ce__default.rename(t,this.summaryPath),this.summaryDirty=false;}async loadMeta(){if(this.metaPath)try{let e=await ce__default.readFile(this.metaPath,"utf-8"),t=JSON.parse(e);if(t?.lastSeq&&(this.seq=t.lastSeq),t?.createdAt&&(this.createdAt=t.createdAt),t?.currentFile&&this.eventsDir){let s=se__default.join(this.eventsDir,t.currentFile);this.currentFile=s,this.currentDate=t.currentFile.slice(7,17),this.currentFileBytes=await this.getFileSize(s);}}catch{}}async persistMeta(){if(!this.metaPath||!this.workspaceId||!this.workspacePath||!this.workspaceName)return;let e={schemaVersion:1,workspaceId:this.workspaceId,workspacePath:this.workspacePath,workspaceName:this.workspaceName,createdAt:this.createdAt,updatedAt:Date.now(),lastSeq:this.seq,currentFile:this.currentFile?se__default.basename(this.currentFile):void 0,currentFileBytes:this.currentFileBytes,source:this.options.source,agentName:this.options.agentName},t=`${this.metaPath}.${Date.now()}.tmp`;await ce__default.writeFile(t,JSON.stringify(e,null,2),"utf-8"),await ce__default.rename(t,this.metaPath);}};W();var Ho=class{id="edge";tts;constructor(){this.tts=new EdgeTTS;}async init(){}async synthesize(e,t){let s=t?.voice||"zh-CN-XiaoxiaoNeural",n=t?.speed?`${Math.round((t.speed-1)*100)}%`:"+0%",r=t?.format||"mp3",i=r==="opus"?"webm-24khz-16bit-mono-opus":"audio-24khz-48kbitrate-mono-mp3";await this.tts.synthesize(e,s,{rate:n,outputFormat:i});let o=this.tts.toBuffer(),l=this.tts.getAudioInfo();return {audio:o,format:r,durationMs:Math.round(l.estimatedDuration*1e3)}}async synthesizeStream(e,t,s){let n=s?.voice||"zh-CN-XiaoxiaoNeural",r=s?.format||"mp3",i=0;for await(let o of this.tts.synthesizeStream(e,n))o&&o.length>0&&(t(Buffer.from(o),i),i++);return {format:r,totalChunks:i}}async getVoices(){return (await this.tts.getVoicesByLanguage("zh-CN")).map(t=>({id:t.ShortName,name:t.LocalName||t.FriendlyName,locale:t.Locale,gender:t.Gender}))}destroy(){}},Jo=class{provider=null;config;summarizeFn=null;constructor(e){this.config=e;}setSummarizeFn(e){this.summarizeFn=e;}updateConfig(e){this.config={...this.config,...e};}isEnabled(){return this.config.enabled===true}async init(){if(!this.config.enabled)return;(this.config.provider||"edge")==="edge"?this.provider=new Ho:this.provider=new Ho,await this.provider.init(),m.info("TTS",`TTS service initialized with provider: ${this.provider.id}`);}async speak(e){if(!this.config.enabled||!this.provider||!e||e.trim().length===0)return null;try{let t=await this.provider.synthesize(e,{voice:this.config.voice,speed:this.config.speed,format:this.config.format||"mp3"});return {audio:t.audio.toString("base64"),format:t.format,voiceSummary:e,durationMs:t.durationMs}}catch(t){return m.error("TTS",`TTS synthesis failed: ${t.message}`),null}}async speakStream(e,t){if(!this.config.enabled||!this.provider||!e||e.trim().length===0)return null;try{let s=await this.provider.synthesizeStream(e,(n,r)=>{t(n.toString("base64"),r);},{voice:this.config.voice,speed:this.config.speed,format:this.config.format||"mp3"});return {format:s.format,totalChunks:s.totalChunks,voiceText:e}}catch(s){return m.error("TTS",`TTS stream synthesis failed: ${s.message}`),null}}async getVoices(){return this.provider?this.provider.getVoices():[]}destroy(){this.provider?.destroy(),this.provider=null;}};var jc=se.join(In.homedir(),".neox"),Or=se.join(jc,"server.pid");function xk(a){Me.existsSync(jc)||Me.mkdirSync(jc,{recursive:true}),Me.writeFileSync(Or,JSON.stringify(a,null,2));}function sg(){try{Me.existsSync(Or)&&Me.unlinkSync(Or);}catch{}}function yB(){try{return Me.existsSync(Or)?JSON.parse(Me.readFileSync(Or,"utf-8")):null}catch{return null}}function Tk(){let a=process.argv.slice(2),e=4399,t=process.cwd(),s=false;for(let n=0;n<a.length;n++)a[n]==="--port"&&a[n+1]?(e=parseInt(a[n+1],10),n++):a[n]==="--workdir"&&a[n+1]?(t=a[n+1],n++):a[n]==="--daemon"&&(s=true);return {port:e,workDir:t,daemon:s}}async function _k(a,e){let t=Oe(),s=Wr(),n=new rt(t),r=t.agentApprovalMode||t.approvalMode||"auto",i=Zm(r),o=(v,E)=>{let L=n.getProvider(v);if(!L)return {provider:null,llmConfig:null};let I=E||L.defaultModel||L.models?.[0]?.name;return {provider:L,llmConfig:{model:I,providerName:L.name||L.id,maxInputTokens:L.contextWindow||128e3}}},l=fo(500),c=new Lr({workspacePath:a,source:"server",agentName:"Neox Server"}),u=new Jo(t.tts??{enabled:false});t.tts?.enabled&&(u.setSummarizeFn(async(v,E,L)=>{let I=g;if(!I)return v.substring(0,E);let A=Ot.createAdapter(I.protocol,I),O=L||"claude-haiku-4-5-20251001";return (await A.chat([{role:"system",content:`\u4F60\u662F\u4E00\u4E2A\u8BED\u97F3\u6458\u8981\u52A9\u624B\u3002\u628A\u4EE5\u4E0B\u5185\u5BB9\u538B\u7F29\u6210${E}\u5B57\u4EE5\u5185\u7684\u53E3\u8BED\u5316\u6458\u8981\uFF0C\u9002\u5408\u8BED\u97F3\u6717\u8BFB\u3002\u4E0D\u8981\u7528\u4EE3\u7801\u3001markdown\u683C\u5F0F\u3001\u5217\u8868\u3002\u76F4\u63A5\u8BF4\u91CD\u70B9\u3002`},{role:"user",content:v}],{model:O,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||v.substring(0,E)}),await u.init());let d=await un(a,s),p=Ji({workDir:a}),h=typeof p=="string"?p:"",g=n.getDefaultProvider(),f=g?.id??"",b=g?.defaultModel??g?.models?.[0]?.name??"",y={services:s,permissionManager:i,tools:d,memory:l,workDir:a,providerId:f,modelName:b,resolveProvider:o,systemPrompt:h},w=new zo;w.setWorkspace(a);let C=null,k=null,T=null,_=null,M=t.runMode||"single";try{C=new wn({...y,actionLog:c,agentMode:r==="dangerous"?"auto":"agent",enableFGTS:t.experimental?.enableFGTS,enablePTC:t.experimental?.enablePTC});}catch(v){m.error("SERVER","Failed to init SingleAgentRuntime",{error:v});}try{k=new xn({...y,actionLog:c});}catch(v){m.error("SERVER","Failed to init AssistantRuntime",{error:v});}try{let v=new At(void 0,"cooperate");T=new ps({...y,ccbReviewMode:v.getCCBReviewMode(),workerModels:v.getEnabledWorkerModels().map(E=>({providerId:E.providerId,model:E.model,traits:E.traits}))});}catch(v){m.error("SERVER","Failed to init CooperateRuntime",{error:v});}try{let v=async(L,I,A)=>{let O=g;if(!O)throw new Error("No provider configured for NetworkRuntime");let $=Ot.createAdapter(O.protocol,O),P=[{role:"system",content:L},{role:"user",content:I}],N=A?.model||b;if(A?.onText&&$.chatStreamed){let G="",q=$.chatStreamed(P,{model:N,maxTokens:A.maxTokens,temperature:A.temperature,signal:A.signal});for await(let oe of q)oe.type==="text"&&oe.text?(G+=oe.text,A.onText(oe.text)):oe.type==="content_block_delta"&&oe.delta?.text&&(G+=oe.delta.text,A.onText(oe.delta.text));return G}return (await $.chat(P,{model:N,maxTokens:A?.maxTokens,temperature:A?.temperature,signal:A?.signal})).choices?.[0]?.message?.content||""},E=new At(void 0,"network");_=new Rn({llmCall:v,executionCapability:{orchestrator:new $t({hostService:new Nt({platformServices:s}),resolveProvider:o}),tools:d,permissionManager:i,memory:l,workDir:a,providerId:f,modelName:b,resolveProvider:o,maxIterations:30},autoCreateDefaultAgents:!0,customRoles:E.getNetworkRoles?.()});}catch(v){m.error("SERVER","Failed to init NetworkRuntime",{error:v});}let F=new Set,x=new Map,R=new Map,j={async chat(v,E){F.add(v);let L=new AbortController;x.set(v,L);let I=(N,D)=>{if(m.info("SERVER",`\u{1F4E1} publishRawEvent: type=${N.type} sessionId=${v}`),e.publish({sessionId:v,type:N.type,data:N,tracker:D,timestamp:Date.now()}),N.type==="run_result"&&u.isEnabled()){let G=N.currentTurnText||N.output;G&&u.speak(G).then(q=>{q&&e.publish({sessionId:v,type:"tts_audio",data:{type:"tts_audio",audio:q.audio,audioFormat:q.format,voiceSummary:q.voiceSummary,durationMs:q.durationMs??0},timestamp:Date.now()});}).catch(q=>{m.warn("SERVER",`TTS generation failed: ${q.message}`);});}},O=N=>{e.publish({sessionId:v,type:"error",data:{type:"error",message:N.message},timestamp:Date.now()});},$={onRuntimeEvent:(N,D)=>I(N,D),onError:O},P={onRuntimeEvent:N=>I(N),onError:O};try{let N=E.mode??M,D=E.attachments?{attachments:E.attachments}:void 0;if(N==="single"&&C)await C.chat({sessionId:v,prompt:E.prompt,metadata:D,providerId:E.providerId,modelName:E.modelName},$);else if(N==="assistant"&&k)k.removeAllListeners("worker_event"),k.removeAllListeners("worker_result"),k.on("worker_event",G=>{if(G?.event){let q={...G.event,sourceLabel:G.agentId,workerRole:G.role,workerTask:G.taskSummary};I(q,G.tracker);}}),k.on("worker_result",G=>{e.publish({sessionId:v,type:"worker_result",data:{type:"worker_result",agentId:G.agentId,success:G.success,output:G.output},timestamp:Date.now()});}),await k.chat({sessionId:v,prompt:E.prompt,metadata:D});else if(N==="cooperate"&&T)await T.chat({sessionId:v,prompt:E.prompt,metadata:D},P);else if(N==="network"&&_)await _.chat({prompt:E.prompt,history:[]});else if(C)await C.chat({sessionId:v,prompt:E.prompt,metadata:D,providerId:E.providerId,modelName:E.modelName},$);else throw new Error("No runtime available")}finally{F.delete(v),x.delete(v);}},abort(v){let E=x.get(v);E&&(E.abort(),x.delete(v)),C&&C.abort(),k&&k.abort(),T&&T.abort?.();},replyPermission(v,E,L){let I=R.get(v);I&&(I.resolve(E),R.delete(v));},getActiveSessions(){return [...F]},setRunMode(v){Wo.isValidMode(v)&&(M=v,m.info("SERVER",`Run mode changed to: ${M}`));},getRunMode(){return M},setSandboxMode(v,E){lp(E);},setApprovalMode(v,E){m.info("SERVER",`Approval mode set to: ${E}`);},async compactSession(v){m.info("SERVER",`Compact session: ${v}`);},clearSession(v){l.clear(),m.info("SERVER",`Cleared session: ${v}`);},getContextHealth(v){return l.checkContextHealth?.()??null},async getSessionInfo(v){return {messageCount:l.length,messages:l.getAll()}},setCompressionMode(v,E){m.info("SERVER",`Compression mode set to: ${E}`);},getMemoryStats(v){return {length:l.length,contextHealth:l.checkContextHealth?.()??null}},clearMemory(v){l.clear();},addMemoryMessage(v,E,L){l.add({role:E,content:L});},getToolList(){return {count:d.length,names:d.map(v=>v.name)}},async reloadTools(v){let E=await un(v,s);d.length=0,d.push(...E),m.info("SERVER",`Reloaded ${d.length} tools for ${v}`);},async setWorkspace(v){let E=await un(v,s);d.length=0,d.push(...E),w.setWorkspace(v),m.info("SERVER",`Workspace switched to: ${v}`);},async startCheckpointWatching(v){return w.startMessage(v)},async stopCheckpointWatching(){await w.stopWatching();},async createCheckpoint(v,E){return w.createCheckpoint(v,E)},async rollbackToCheckpoint(v){return w.rollbackToCheckpoint(v)},async rollbackSingleFile(v){return w.rollbackSingleFile(v)},async reapplySingleFile(v){return w.reapplySingleFile(v)},async getCheckpoints(v,E){return w.getCheckpoints(v,E)},async getCheckpointStats(){return w.getCurrentStats?.()??{created:0,modified:0,deleted:0,directories:0,total:0}},async getCheckpointChanges(){return w.getChangeBuffer?.()??[]},setCheckpointEnabled(v){w.setEnabled(v);},isCheckpointEnabled(){return w.isEnabled()},async cleanupCheckpoints(){await w.cleanup?.();},async getHostStatus(){return {isRunning:F.size>0,currentTask:null,mode:M,workingDirectory:a,uptime:Math.floor(process.uptime()),memoryUsage:{tokensUsed:l.length,contextWindow:128e3,pressure:l.length/128e3}}},async getHostAgents(){return [{id:"main",role:"main",status:F.size>0?"running":"idle"}]},async getHostActivity(v=10){return []},async getHostSession(){return {messageCount:l.length,tokensUsed:0}},async getHostSystem(){let v=null,E="unknown";try{let{execSync:L}=await import('child_process');try{v=L("git rev-parse --abbrev-ref HEAD",{cwd:a,encoding:"utf-8",timeout:5e3}).trim();}catch{}try{E=L("git status --porcelain",{cwd:a,encoding:"utf-8",timeout:5e3}).trim().length===0?"clean":"dirty";}catch{}}catch{}return {platform:process.platform,arch:process.arch,cwd:a,gitBranch:v,gitStatus:E,nodeVersion:process.version}},async hostInterrupt(v){for(let[L,I]of x)I.abort();C&&C.abort(),k&&k.abort(),T&&T.abort?.();let E=F.size>0;return F.clear(),x.clear(),{interrupted:E}},async hostSendCommand(v,E){let L=`cmd-${Date.now()}`,I={prompt:v};return j.chat(L,I).catch(A=>{m.error("SERVER",`hostSendCommand failed: ${A.message}`);}),{queued:true,sessionId:L}},setTTSEnabled(v){let E=u.isEnabled();u.updateConfig({enabled:v,provider:"edge"}),v&&!E&&(u.summarizeFn||u.setSummarizeFn(async(L,I,A)=>{let O=g;if(!O)return L.substring(0,I);let $=Ot.createAdapter(O.protocol,O),P=A||"claude-haiku-4-5-20251001";return (await $.chat([{role:"system",content:`\u4F60\u662F\u4E00\u4E2A\u8BED\u97F3\u6458\u8981\u52A9\u624B\u3002\u628A\u4EE5\u4E0B\u5185\u5BB9\u538B\u7F29\u6210${I}\u5B57\u4EE5\u5185\u7684\u53E3\u8BED\u5316\u6458\u8981\uFF0C\u9002\u5408\u8BED\u97F3\u6717\u8BFB\u3002\u4E0D\u8981\u7528\u4EE3\u7801\u3001markdown\u683C\u5F0F\u3001\u5217\u8868\u3002\u76F4\u63A5\u8BF4\u91CD\u70B9\u3002`},{role:"user",content:L}],{model:P,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||L.substring(0,I)}),u.init().catch(L=>{m.error("SERVER",`TTS init failed: ${L.message}`);})),m.info("SERVER",`TTS ${v?"enabled":"disabled"}`);},isTTSEnabled(){return u.isEnabled()},getTTSConfig(){return t.tts??{enabled:false}},updateTTSConfig(v){let E=u.isEnabled();u.updateConfig(v),v.enabled&&!E&&u.init().catch(L=>{m.error("SERVER",`TTS init failed: ${L.message}`);});}};return j}async function Rk(){let{port:a,workDir:e,daemon:t}=Tk(),s=Oe(),n=s.remote??{};m.info("SERVER",`Starting Neox Server on port ${a}, workDir: ${e}`);let r=new Br,i=new Ns,o=await _k(e,r),l={workDir:e};n.enabled&&n.token&&(l.auth={token:n.token,allowLocalWithoutAuth:true},l.rateLimit={maxRequests:120,windowMs:6e4},l.corsOrigins=["*"],m.info("SERVER","Remote mode enabled \u2014 auth + rateLimit active"));let{app:c,channelRegistry:u}=Jc(l,o,r,i),d=s.channels;d&&(await u.initialize(d),u.setHandler(async g=>{let f=`ch-${g.channelId}-${g.chatId}`;return new Promise(b=>{let y="",w=r.subscribe(f);(async()=>{for await(let C of w){if(C.type==="run_result"){y=C.data?.output||"",w.close();break}if(C.type==="error"){y=`Error: ${C.data?.message||"unknown"}`,w.close();break}}b(y||"[no response]");})(),o.chat(f,{prompt:g.text}).catch(()=>{b("[error processing message]"),w.close();});})}),await u.startAll(),m.info("SERVER","Channel adapters initialized")),await ht.initialize(e),ht.watch(e),m.info("SERVER",`Skills hot-reload active (${ht.size} skills loaded)`);let p=process.env.NEOX_HOST||(n.enabled?n.host||"0.0.0.0":"127.0.0.1");xk({pid:process.pid,port:a,workDir:e,startedAt:Date.now(),daemon:t});let h=()=>{m.info("SERVER","Shutting down..."),ht.stopWatch(),u.stopAll().catch(()=>{}),sg(),i.dispose(),r.dispose(),process.exit(0);};process.on("SIGINT",h),process.on("SIGTERM",h),serve({fetch:c.fetch,port:a,hostname:p},g=>{m.info("SERVER",`Neox Server listening on http://${p}:${g.port}`),process.send&&process.send({type:"ready",port:g.port});});}Rk().catch(a=>{m.error("SERVER","Failed to start server",{error:a}),sg(),process.exit(1);});
|
|
3412
3412
|
export{yB as readPidFile};
|