@mk-co/neox-cli 2.0.51 → 2.0.52

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 CHANGED
@@ -2055,7 +2055,7 @@ ${i.output}`}let a=i.toolCalls.map(c=>` ${c.name} (${c.durationMs}ms)`).join(`
2055
2055
  ${a}
2056
2056
  ${i.output}`}}}var VS=R(()=>{KS();ld();});var gi,r1,s1,yh=R(()=>{Za();tl();sr();ne();mh();jS();zS();VS();gi=class{config;hostService;orchestrator;abortController=null;toolTreeEngine=null;constructor(e){this.config=e,this.hostService=new gr({platformServices:e.services}),this.orchestrator=new fr({hostService:this.hostService,resolveProvider:e.resolveProvider}),m.info("SINGLE_AGENT","SingleAgentRuntime initialized");}async chat(e,t){let{sessionId:n,prompt:r,metadata:o}=e,i=e.providerId||this.config.providerId,a=e.modelName||this.config.modelName;m.info("SINGLE_AGENT","Chat started",{sessionId:n,promptLength:r.length});try{this.abortController=new AbortController;let l=dh({orchestrator:this.orchestrator,providerId:i,modelName:a,permissionManager:this.config.permissionManager,allTools:this.config.tools,workDir:this.config.workDir,getParentMemory:()=>this.config.memory,abortSignal:this.abortController.signal,onSubAgentEvent:t?.onRuntimeEvent?(b,C,T)=>t.onRuntimeEvent({...C,subAgentId:b,sourceLabel:b},T):void 0}),c=[...this.config.tools,...l];if(this.config.enablePTC){let b=JS(this.config.tools);c.push(b),m.info("SINGLE_AGENT","PTC tool injected");}this.toolTreeEngine=new id(c);let u=this.toolTreeEngine.liveTools,p=[this.config.systemPrompt??"Single agent mode",ph,r1];if(this.config.enablePTC&&p.push(s1),this.config.actionLog)try{let b=await this.config.actionLog.getMemoryInjectionSummary({language:"zh",maxChars:4e3});b&&(p.push(b),m.info("SINGLE_AGENT","ActionLog memory injected",{chars:b.length}));}catch(b){m.warn("SINGLE_AGENT","ActionLog injection failed",{error:b.message});}try{let b=await WS(this.config.workDir);b&&p.push(b);}catch(b){m.warn("SINGLE_AGENT","Project memory load failed",{error:b.message});}let g=p.join(`
2057
2057
 
2058
- `),f=await this.orchestrator.runSession({sessionId:n,prompt:r,metadata:o,providerId:i,modelName:a,buildHostConfig:(b,C)=>({sessionId:n,configKey:"single_agent",provider:b,llmConfig:C,workspacePath:this.config.workDir,workDir:this.config.workDir,instructions:g,systemPrompt:g,agentName:"SingleAgent",agentDescription:"Single agent mode runtime",permissionManager:this.config.permissionManager,tools:u,memory:this.config.memory,sessionEnabled:!0,enableFGTS:this.config.enableFGTS,agentConfig:{temperature:.3,mode:this.config.agentMode??"agent"}}),onRuntimeEvent:(b,C)=>{t?.onRuntimeEvent?.(b,C),this.handleRuntimeEvent(b,t);}}),y=f.summary.output||"Task completed";return t?.onComplete?.(y),m.info("SINGLE_AGENT","Chat completed",{sessionId:n,contextUsed:f.contextUsed}),y}catch(l){let c=l instanceof Error?l:new Error(String(l));throw t?.onError?.(c),m.error("SINGLE_AGENT","Chat failed",{error:c.message}),c}}handleRuntimeEvent(e,t){switch(e.type){case "text":t?.onText?.(e.text);break;case "thinking":t?.onThinking?.(e.text);break;case "tool_call":t?.onToolCall?.(e.name,e.args);break;case "tool_result":t?.onToolResult?.(e.name,e.result);break}}abort(){this.abortController?.abort(),this.abortController=null,this.hostService.clearAll(),m.info("SINGLE_AGENT","Aborted");}getModeName(){return "single"}},r1=`
2058
+ `),f=await this.orchestrator.runSession({sessionId:n,prompt:r,metadata:o,providerId:i,modelName:a,buildHostConfig:(b,C)=>({sessionId:n,configKey:"single_agent",provider:b,llmConfig:C,workspacePath:this.config.workDir,workDir:this.config.workDir,instructions:g,systemPrompt:g,agentName:"SingleAgent",agentDescription:"Single agent mode runtime",permissionManager:this.config.permissionManager,tools:u,memory:this.config.memory,sessionEnabled:!0,enableFGTS:this.config.enableFGTS,agentConfig:{temperature:.3,mode:this.config.agentMode??"agent"}}),onRuntimeEvent:(b,C)=>{t?.onRuntimeEvent?.(b,C),this.handleRuntimeEvent(b,t);}}),y=f.summary.output||"Task completed";return t?.onComplete?.(y),m.info("SINGLE_AGENT","Chat completed",{sessionId:n,contextUsed:f.contextUsed}),y}catch(l){let c=l instanceof Error?l:new Error(String(l));throw t?.onError?.(c),m.error("SINGLE_AGENT","Chat failed",{error:c.message}),c}}handleRuntimeEvent(e,t){switch(e.type){case "text":t?.onText?.(e.text);break;case "thinking":t?.onThinking?.(e.text);break;case "tool_call":t?.onToolCall?.(e.name,e.args);break;case "tool_result":t?.onToolResult?.(e.name,e.result);break}}abort(){this.abortController?.abort(),this.abortController=null,this.hostService.clearAll(),m.info("SINGLE_AGENT","Aborted");}setAgentMode(e){this.config.agentMode=e;}getModeName(){return "single"}},r1=`
2059
2059
  ## \u5DE5\u5177\u6811
2060
2060
  \u4F60\u7684\u5DE5\u5177\u6309\u7C7B\u522B\u7EC4\u7EC7\u3002\u9ED8\u8BA4\u53EA\u6709\u5E38\u9A7B\u5DE5\u5177\u53EF\u7528\u3002
2061
2061
  \u9700\u8981\u5176\u4ED6\u5DE5\u5177\u65F6\uFF1A
@@ -3459,7 +3459,7 @@ Stats: +${t.created} ~${t.modified} -${t.deleted} d${t.directories}${n}`}parseCo
3459
3459
  .cdundo/
3460
3460
  `:`# Neox checkpoint directory
3461
3461
  .cdundo/
3462
- `;await Le.writeFile(e,n),m.debug("CHECKPOINT","Added .cdundo to .gitignore");}}catch(t){m.error("CHECKPOINT","Failed to update .gitignore",{error:t});}}async cleanupOldCheckpoints(){try{let e=await this.getCheckpoints(this.config.maxCheckpoints+10);e.length>this.config.maxCheckpoints&&(m.debug("CHECKPOINT",`Cleaning up old checkpoints (${e.length} > ${this.config.maxCheckpoints})`),await this.compressRepository());}catch(e){m.error("CHECKPOINT","Failed to cleanup checkpoints",{error:e});}}async compressRepository(){if(!this.initialized)return {success:false};try{let e=await this.getRepositorySize();m.debug("CHECKPOINT","Compressing repository..."),await this.git.raw(["reflog","expire","--expire=now","--all"]),await this.git.raw(["gc","--aggressive","--prune=now"]),await this.git.raw(["repack","-a","-d","--depth=250","--window=250"]);let t=await this.getRepositorySize(),n=e-t;return m.debug("CHECKPOINT",`Repository compressed: ${this.formatFileSize(e)} \u2192 ${this.formatFileSize(t)} (saved ${this.formatFileSize(n)})`),{success:!0,savedBytes:n}}catch(e){return m.error("CHECKPOINT","Failed to compress repository",{error:e}),{success:false}}}async getRepositorySize(){let e=0,t=async n=>{try{let r=await Le.readdir(n,{withFileTypes:!0});for(let o of r){let i=Ie.join(n,o.name);if(o.isDirectory())await t(i);else if(o.isFile()){let a=await Le.stat(i);e+=a.size;}}}catch{}};return await t(this.shadowGitDir),e}async getStorageStats(){let e=await this.getRepositorySize(),t=0,n=async o=>{try{let i=await Le.readdir(o,{withFileTypes:!0});for(let a of i){let l=Ie.join(o,a.name);if(a.isDirectory()&&a.name!==".git")await n(l);else if(a.isFile()){let c=await Le.stat(l);t+=c.size;}}}catch{}};await n(this.shadowDir);let r=await this.getCheckpoints(1e3);return {repositorySize:e,shadowDirSize:t,checkpointCount:r.length,oldestCheckpoint:r.length>0?{id:r[r.length-1].id,timestamp:r[r.length-1].timestamp}:void 0,newestCheckpoint:r.length>0?{id:r[0].id,timestamp:r[0].timestamp}:void 0}}async cleanStaleLocks(){let e=Ie.join(this.shadowGitDir,"index.lock");try{if(wt.existsSync(e)){let n=await Le.stat(e);Date.now()-n.mtimeMs>1e4&&(await Le.unlink(e),m.debug("CHECKPOINT","Cleaned stale lock file"));}}catch{}}async withGitLock(e){let t=this.gitOperationLock,n=()=>{};this.gitOperationLock=new Promise(r=>{n=r;});try{await t;let r;for(let o=1;o<=this.GIT_RETRY_ATTEMPTS;o++)try{return o>1&&(await this.cleanStaleLocks(),await new Promise(a=>setTimeout(a,this.GIT_RETRY_DELAY_MS))),await e()}catch(i){if(r=i,!(i.message&&(i.message.includes("index.lock")||i.message.includes("File exists")))||o===this.GIT_RETRY_ATTEMPTS)throw i;m.warn("CHECKPOINT",`Git operation failed (attempt ${o}/${this.GIT_RETRY_ATTEMPTS}), retrying...`);}throw r}finally{n();}}async destroy(){await this.stopWatching(),this.initialized=false,this.changeCallbacks.clear(),m.debug("CHECKPOINT","Instance destroyed");}};});var cl,L0=R(()=>{R0();cl=class s{static instance=null;instances=new Map;config;constructor(e={}){this.config=e;}static getInstance(e){return s.instance||(s.instance=new s(e)),s.instance}async getCheckpoint(e){let t=Ie.normalize(e);if(!this.instances.has(t)){let n=new jd(this.config);await n.init(t),this.instances.set(t,n);}return this.instances.get(t)}async startWatching(e,t,n=0){return (await this.getCheckpoint(e)).startWatching(t,n)}getBeforeCheckpointId(e){let t=Ie.normalize(e);return this.instances.get(t)?.getBeforeCheckpointId()??null}async stopWatching(e){let t=Ie.normalize(e),n=this.instances.get(t);n&&await n.stopWatching();}async createCheckpoint(e,t){return (await this.getCheckpoint(e)).createCheckpoint(t)}async rollbackTo(e,t){return (await this.getCheckpoint(e)).rollbackTo(t)}async rollbackSingleFile(e,t){return (await this.getCheckpoint(e)).rollbackSingleFile(t)}async reapplySingleFile(e,t){return (await this.getCheckpoint(e)).reapplySingleFile(t)}async getCheckpoints(e,t,n){return (await this.getCheckpoint(e)).getCheckpoints(t,n)}async getDiff(e,t,n){return (await this.getCheckpoint(e)).getDiff(t,n)}async getChangeBuffer(e){return (await this.getCheckpoint(e)).getChangeBuffer()}async getCurrentStats(e){return (await this.getCheckpoint(e)).getCurrentStats()}async onFileChange(e,t){return (await this.getCheckpoint(e)).onFileChange(t)}isWatching(e){let t=Ie.normalize(e);return this.instances.get(t)?.isActive()??false}async cleanup(e){let t=Ie.normalize(e),n=this.instances.get(t);n&&(await n.destroy(),this.instances.delete(t));let r=Ie.join(t,".cdundo");try{await Le.rm(r,{recursive:!0,force:!0}),console.log("[CheckpointManager] Cleaned up:",r);}catch(o){console.error("[CheckpointManager] Failed to cleanup:",o);}}async destroyAll(){for(let[e,t]of this.instances)await t.destroy();this.instances.clear(),console.log("[CheckpointManager] All instances destroyed");}getActiveWorkspaces(){return Array.from(this.instances.keys()).filter(e=>this.instances.get(e)?.isActive())}getStats(){return {totalInstances:this.instances.size,activeInstances:this.getActiveWorkspaces().length,workspaces:Array.from(this.instances.keys())}}},cl.getInstance();});var Gd,N0=R(()=>{L0();Gd=class{checkpointManager;workspacePath=null;enabled=true;sessionMessageCounts=new Map;constructor(e){this.checkpointManager=e??cl.getInstance();}setWorkspace(e){this.workspacePath=e;}setEnabled(e){this.enabled=e;}isEnabled(){return this.enabled}async startMessage(e){if(!this.enabled||!this.workspacePath)return null;let t=this.sessionMessageCounts.get(e)||0;return this.checkpointManager.startWatching(this.workspacePath,e,t)}async finishMessage(e,t){if(!this.enabled||!this.workspacePath)return null;let n=await this.createCheckpoint(e,t);return await this.checkpointManager.stopWatching(this.workspacePath),n}async stopWatching(){this.workspacePath&&await this.checkpointManager.stopWatching(this.workspacePath);}async createCheckpoint(e,t){if(!this.enabled||!this.workspacePath)return null;let n=this.sessionMessageCounts.get(e)||0,r=t||`Message #${n+1}`,o=await this.checkpointManager.createCheckpoint(this.workspacePath,r);return this.sessionMessageCounts.set(e,n+1),o}async rollbackToCheckpoint(e){return this.workspacePath?this.checkpointManager.rollbackTo(this.workspacePath,e):{success:false,restored:[],errors:["No workspace set"]}}async rollbackSingleFile(e){return this.workspacePath?this.checkpointManager.rollbackSingleFile(this.workspacePath,e):{success:false,error:"No workspace set"}}async reapplySingleFile(e){return this.workspacePath?this.checkpointManager.reapplySingleFile(this.workspacePath,e):{success:false,error:"No workspace set"}}async getCheckpoints(e,t){return this.workspacePath?this.checkpointManager.getCheckpoints(this.workspacePath,e,t):[]}async getCurrentStats(){return this.workspacePath?this.checkpointManager.getCurrentStats(this.workspacePath):null}async getChangeBuffer(){return this.workspacePath?this.checkpointManager.getChangeBuffer(this.workspacePath):[]}async cleanup(){this.workspacePath&&await this.checkpointManager.cleanup(this.workspacePath);}};});var Wd,zd,$0=R(()=>{ne();Wd=class{id="edge";tts;constructor(){this.tts=new EdgeTTS;}async init(){}async synthesize(e,t){let n=t?.voice||"zh-CN-XiaoxiaoNeural",r=t?.speed?`${Math.round((t.speed-1)*100)}%`:"+0%",o=t?.format||"mp3",i=o==="opus"?"webm-24khz-16bit-mono-opus":"audio-24khz-48kbitrate-mono-mp3";await this.tts.synthesize(e,n,{rate:r,outputFormat:i});let a=this.tts.toBuffer(),l=this.tts.getAudioInfo();return {audio:a,format:o,durationMs:Math.round(l.estimatedDuration*1e3)}}async synthesizeStream(e,t,n){let r=n?.voice||"zh-CN-XiaoxiaoNeural",o=n?.format||"mp3",i=0;for await(let a of this.tts.synthesizeStream(e,r))a&&a.length>0&&(t(Buffer.from(a),i),i++);return {format:o,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(){}},zd=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 Wd:this.provider=new Wd,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 n=await this.provider.synthesizeStream(e,(r,o)=>{t(r.toString("base64"),o);},{voice:this.config.voice,speed:this.config.speed,format:this.config.format||"mp3"});return {format:n.format,totalChunks:n.totalChunks,voiceText:e}}catch(n){return m.error("TTS",`TTS stream synthesis failed: ${n.message}`),null}}async getVoices(){return this.provider?this.provider.getVoices():[]}destroy(){this.provider?.destroy(),this.provider=null;}};});function HB(s){wt.existsSync(Oy)||wt.mkdirSync(Oy,{recursive:true}),wt.writeFileSync(ul,JSON.stringify(s,null,2));}function B0(){try{wt.existsSync(ul)&&wt.unlinkSync(ul);}catch{}}function Hd(){try{return wt.existsSync(ul)?JSON.parse(wt.readFileSync(ul,"utf-8")):null}catch{return null}}function qB(){let s=process.argv.slice(2),e=4399,t=process.cwd(),n=false;for(let r=0;r<s.length;r++)s[r]==="--port"&&s[r+1]?(e=parseInt(s[r+1],10),r++):s[r]==="--workdir"&&s[r+1]?(t=s[r+1],r++):s[r]==="--daemon"&&(n=true);return {port:e,workDir:t,daemon:n}}async function KB(s,e){let t=He(),n=ti(),r=new nt(t),o=t.agentApprovalMode||t.approvalMode||"auto",i=new ss({defaultPermission:"allow"}),a=(x,B)=>{let H=r.getProvider(x);if(!H)return {provider:null,llmConfig:null};let W=B||H.defaultModel||H.models?.[0]?.name;return {provider:H,llmConfig:{model:W,providerName:H.name||H.id,maxInputTokens:H.contextWindow||128e3}}},l=rd(500),c=new ro({workspacePath:s,source:"server",agentName:"Neox Server"}),u=new zd(t.tts??{enabled:false});t.tts?.enabled&&(u.setSummarizeFn(async(x,B,H)=>{let W=f;if(!W)return x.substring(0,B);let U=mr.createAdapter(W.protocol,W),z=H||"claude-haiku-4-5-20251001";return (await U.chat([{role:"system",content:`\u4F60\u662F\u4E00\u4E2A\u8BED\u97F3\u6458\u8981\u52A9\u624B\u3002\u628A\u4EE5\u4E0B\u5185\u5BB9\u538B\u7F29\u6210${B}\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:x}],{model:z,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||x.substring(0,B)}),await u.init());let d=await zn(s,n),p=Os({workDir:s}),g=typeof p=="string"?p:"",f=r.getDefaultProvider(),y=f?.id??"",b=f?.defaultModel??f?.models?.[0]?.name??"",C={services:n,permissionManager:i,tools:d,memory:l,workDir:s,providerId:y,modelName:b,resolveProvider:a,systemPrompt:g},T=new Gd;T.setWorkspace(s);let S=null,E=null,v=null,I=null,D=t.runMode||"single";try{S=new gi({...C,actionLog:c,agentMode:o==="dangerous"?"auto":"agent",enableFGTS:t.experimental?.enableFGTS,enablePTC:t.experimental?.enablePTC});}catch(x){m.error("SERVER","Failed to init SingleAgentRuntime",{error:x});}try{E=new bi({...C,actionLog:c});}catch(x){m.error("SERVER","Failed to init AssistantRuntime",{error:x});}try{let x=new Lt(void 0,"cooperate");v=new ps({...C,ccbReviewMode:x.getCCBReviewMode(),workerModels:x.getEnabledWorkerModels().map(B=>({providerId:B.providerId,model:B.model,traits:B.traits}))});}catch(x){m.error("SERVER","Failed to init CooperateRuntime",{error:x});}try{let x=async(H,W,U)=>{let z=f;if(!z)throw new Error("No provider configured for NetworkRuntime");let q=mr.createAdapter(z.protocol,z),P=[{role:"system",content:H},{role:"user",content:W}],$=U?.model||b;if(U?.onText&&q.chatStreamed){let V="",Z=q.chatStreamed(P,{model:$,maxTokens:U.maxTokens,temperature:U.temperature,signal:U.signal});for await(let ae of Z)ae.type==="text"&&ae.text?(V+=ae.text,U.onText(ae.text)):ae.type==="content_block_delta"&&ae.delta?.text&&(V+=ae.delta.text,U.onText(ae.delta.text));return V}return (await q.chat(P,{model:$,maxTokens:U?.maxTokens,temperature:U?.temperature,signal:U?.signal})).choices?.[0]?.message?.content||""},B=new Lt(void 0,"network");I=new wi({llmCall:x,executionCapability:{orchestrator:new fr({hostService:new gr({platformServices:n}),resolveProvider:a}),tools:d,permissionManager:i,memory:l,workDir:s,providerId:y,modelName:b,resolveProvider:a,maxIterations:30},autoCreateDefaultAgents:!0,customRoles:B.getNetworkRoles?.()});}catch(x){m.error("SERVER","Failed to init NetworkRuntime",{error:x});}let O=new Set,k=new Map,M=new Map,N={async chat(x,B){O.add(x);let H=new AbortController;k.set(x,H);let W=($,F)=>{if(m.info("SERVER",`\u{1F4E1} publishRawEvent: type=${$.type} sessionId=${x}`),e.publish({sessionId:x,type:$.type,data:$,tracker:F,timestamp:Date.now()}),$.type==="run_result"&&u.isEnabled()){let V=$.currentTurnText||$.output;V&&u.speak(V).then(Z=>{Z&&e.publish({sessionId:x,type:"tts_audio",data:{type:"tts_audio",audio:Z.audio,audioFormat:Z.format,voiceSummary:Z.voiceSummary,durationMs:Z.durationMs??0},timestamp:Date.now()});}).catch(Z=>{m.warn("SERVER",`TTS generation failed: ${Z.message}`);});}},z=$=>{e.publish({sessionId:x,type:"error",data:{type:"error",message:$.message},timestamp:Date.now()});},q={onRuntimeEvent:($,F)=>W($,F),onError:z},P={onRuntimeEvent:$=>W($),onError:z};try{let $=B.mode??D,F=B.attachments?{attachments:B.attachments}:void 0;if($==="single"&&S)await S.chat({sessionId:x,prompt:B.prompt,metadata:F,providerId:B.providerId,modelName:B.modelName},q);else if($==="assistant"&&E)E.removeAllListeners("worker_event"),E.removeAllListeners("worker_result"),E.on("worker_event",V=>{if(V?.event){let Z={...V.event,sourceLabel:V.agentId,workerRole:V.role,workerTask:V.taskSummary};W(Z,V.tracker);}}),E.on("worker_result",V=>{e.publish({sessionId:x,type:"worker_result",data:{type:"worker_result",agentId:V.agentId,success:V.success,output:V.output},timestamp:Date.now()});}),await E.chat({sessionId:x,prompt:B.prompt,metadata:F});else if($==="cooperate"&&v)await v.chat({sessionId:x,prompt:B.prompt,metadata:F},P);else if($==="network"&&I)await I.chat({prompt:B.prompt,history:[]});else if(S)await S.chat({sessionId:x,prompt:B.prompt,metadata:F,providerId:B.providerId,modelName:B.modelName},q);else throw new Error("No runtime available")}finally{O.delete(x),k.delete(x);}},abort(x){let B=k.get(x);B&&(B.abort(),k.delete(x)),S&&S.abort(),E&&E.abort(),v&&v.abort?.();},replyPermission(x,B,H){let W=M.get(x);W&&(W.resolve(B),M.delete(x));},getActiveSessions(){return [...O]},setRunMode(x){Jn.isValidMode(x)&&(D=x,m.info("SERVER",`Run mode changed to: ${D}`));},getRunMode(){return D},setSandboxMode(x,B){ni(B);},setApprovalMode(x,B){m.info("SERVER",`Approval mode set to: ${B}`);},async compactSession(x){m.info("SERVER",`Compact session: ${x}`);},clearSession(x){l.clear(),m.info("SERVER",`Cleared session: ${x}`);},getContextHealth(x){return l.checkContextHealth?.()??null},async getSessionInfo(x){return {messageCount:l.length,messages:l.getAll()}},setCompressionMode(x,B){m.info("SERVER",`Compression mode set to: ${B}`);},getMemoryStats(x){return {length:l.length,contextHealth:l.checkContextHealth?.()??null}},clearMemory(x){l.clear();},addMemoryMessage(x,B,H){l.add({role:B,content:H});},getToolList(){return {count:d.length,names:d.map(x=>x.name)}},async reloadTools(x){let B=await zn(x,n);d.length=0,d.push(...B),m.info("SERVER",`Reloaded ${d.length} tools for ${x}`);},async setWorkspace(x){let B=await zn(x,n);d.length=0,d.push(...B),T.setWorkspace(x),m.info("SERVER",`Workspace switched to: ${x}`);},async startCheckpointWatching(x){return T.startMessage(x)},async stopCheckpointWatching(){await T.stopWatching();},async createCheckpoint(x,B){return T.createCheckpoint(x,B)},async rollbackToCheckpoint(x){return T.rollbackToCheckpoint(x)},async rollbackSingleFile(x){return T.rollbackSingleFile(x)},async reapplySingleFile(x){return T.reapplySingleFile(x)},async getCheckpoints(x,B){return T.getCheckpoints(x,B)},async getCheckpointStats(){return T.getCurrentStats?.()??{created:0,modified:0,deleted:0,directories:0,total:0}},async getCheckpointChanges(){return T.getChangeBuffer?.()??[]},setCheckpointEnabled(x){T.setEnabled(x);},isCheckpointEnabled(){return T.isEnabled()},async cleanupCheckpoints(){await T.cleanup?.();},async getHostStatus(){return {isRunning:O.size>0,currentTask:null,mode:D,workingDirectory:s,uptime:Math.floor(process.uptime()),memoryUsage:{tokensUsed:l.length,contextWindow:128e3,pressure:l.length/128e3}}},async getHostAgents(){return [{id:"main",role:"main",status:O.size>0?"running":"idle"}]},async getHostActivity(x=10){return []},async getHostSession(){return {messageCount:l.length,tokensUsed:0}},async getHostSystem(){let x=null,B="unknown";try{let{execSync:H}=await import('child_process');try{x=H("git rev-parse --abbrev-ref HEAD",{cwd:s,encoding:"utf-8",timeout:5e3}).trim();}catch{}try{B=H("git status --porcelain",{cwd:s,encoding:"utf-8",timeout:5e3}).trim().length===0?"clean":"dirty";}catch{}}catch{}return {platform:process.platform,arch:process.arch,cwd:s,gitBranch:x,gitStatus:B,nodeVersion:process.version}},async hostInterrupt(x){for(let[H,W]of k)W.abort();S&&S.abort(),E&&E.abort(),v&&v.abort?.();let B=O.size>0;return O.clear(),k.clear(),{interrupted:B}},async hostSendCommand(x,B){let H=`cmd-${Date.now()}`,W={prompt:x};return N.chat(H,W).catch(U=>{m.error("SERVER",`hostSendCommand failed: ${U.message}`);}),{queued:true,sessionId:H}},setTTSEnabled(x){let B=u.isEnabled();u.updateConfig({enabled:x,provider:"edge"}),x&&!B&&(u.summarizeFn||u.setSummarizeFn(async(H,W,U)=>{let z=f;if(!z)return H.substring(0,W);let q=mr.createAdapter(z.protocol,z),P=U||"claude-haiku-4-5-20251001";return (await q.chat([{role:"system",content:`\u4F60\u662F\u4E00\u4E2A\u8BED\u97F3\u6458\u8981\u52A9\u624B\u3002\u628A\u4EE5\u4E0B\u5185\u5BB9\u538B\u7F29\u6210${W}\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:H}],{model:P,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||H.substring(0,W)}),u.init().catch(H=>{m.error("SERVER",`TTS init failed: ${H.message}`);})),m.info("SERVER",`TTS ${x?"enabled":"disabled"}`);},isTTSEnabled(){return u.isEnabled()},getTTSConfig(){return t.tts??{enabled:false}},updateTTSConfig(x){let B=u.isEnabled();u.updateConfig(x),x.enabled&&!B&&u.init().catch(H=>{m.error("SERVER",`TTS init failed: ${H.message}`);});}};return N}async function JB(){let{port:s,workDir:e,daemon:t}=qB(),n=He(),r=n.remote??{};m.info("SERVER",`Starting Neox Server on port ${s}, workDir: ${e}`);let o=new Ud,i=new Ti,a=await KB(e,o),l={workDir:e};r.enabled&&r.token&&(l.auth={token:r.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}=k0(l,a,o,i),d=n.channels;d&&(await u.initialize(d),u.setHandler(async f=>{let y=`ch-${f.channelId}-${f.chatId}`;return new Promise(b=>{let C="",T=o.subscribe(y);(async()=>{for await(let S of T){if(S.type==="run_result"){C=S.data?.output||"",T.close();break}if(S.type==="error"){C=`Error: ${S.data?.message||"unknown"}`,T.close();break}}b(C||"[no response]");})(),a.chat(y,{prompt:f.text}).catch(()=>{b("[error processing message]"),T.close();});})}),await u.startAll(),m.info("SERVER","Channel adapters initialized")),await et.initialize(e),et.watch(e),m.info("SERVER",`Skills hot-reload active (${et.size} skills loaded)`);let p=process.env.NEOX_HOST||(r.enabled?r.host||"0.0.0.0":"127.0.0.1");HB({pid:process.pid,port:s,workDir:e,startedAt:Date.now(),daemon:t});let g=()=>{m.info("SERVER","Shutting down..."),et.stopWatch(),u.stopAll().catch(()=>{}),B0(),i.dispose(),o.dispose(),process.exit(0);};process.on("SIGINT",g),process.on("SIGTERM",g),serve({fetch:c.fetch,port:s,hostname:p},f=>{m.info("SERVER",`Neox Server listening on http://${p}:${f.port}`),process.send&&process.send({type:"ready",port:f.port});});}var Oy,ul,F0=R(()=>{_0();I0();Ny();ne();ou();Za();tl();yh();Eh();Pd();Ey();Ay();Tt();cr();Vs();eh();sd();cu();N0();$c();un();sr();Ca();Dy();Jo();$0();Oy=Ie.join(fo.homedir(),".neox"),ul=Ie.join(Oy,"server.pid");JB().catch(s=>{m.error("SERVER","Failed to start server",{error:s}),B0(),process.exit(1);});});async function ZB(s){return new Promise(e=>{let t=iT.createServer();t.once("error",()=>e(false)),t.once("listening",()=>{t.close(()=>e(true));}),t.listen(s,"127.0.0.1");})}async function W0(s=XB){for(let e=s;e<s+100;e++)if(await ZB(e))return e;throw new Error("No free port found")}async function Uy(s){try{let e=new AbortController,t=setTimeout(()=>e.abort(),QB),n=await fetch(`http://127.0.0.1:${s}/health`,{signal:e.signal});return clearTimeout(t),n.ok}catch{return false}}async function z0(s){let e=Hd();if(e){if(process.stderr.write(`[BOOT] ensureServer: found pid file, checking health on port ${e.port}...
3462
+ `;await Le.writeFile(e,n),m.debug("CHECKPOINT","Added .cdundo to .gitignore");}}catch(t){m.error("CHECKPOINT","Failed to update .gitignore",{error:t});}}async cleanupOldCheckpoints(){try{let e=await this.getCheckpoints(this.config.maxCheckpoints+10);e.length>this.config.maxCheckpoints&&(m.debug("CHECKPOINT",`Cleaning up old checkpoints (${e.length} > ${this.config.maxCheckpoints})`),await this.compressRepository());}catch(e){m.error("CHECKPOINT","Failed to cleanup checkpoints",{error:e});}}async compressRepository(){if(!this.initialized)return {success:false};try{let e=await this.getRepositorySize();m.debug("CHECKPOINT","Compressing repository..."),await this.git.raw(["reflog","expire","--expire=now","--all"]),await this.git.raw(["gc","--aggressive","--prune=now"]),await this.git.raw(["repack","-a","-d","--depth=250","--window=250"]);let t=await this.getRepositorySize(),n=e-t;return m.debug("CHECKPOINT",`Repository compressed: ${this.formatFileSize(e)} \u2192 ${this.formatFileSize(t)} (saved ${this.formatFileSize(n)})`),{success:!0,savedBytes:n}}catch(e){return m.error("CHECKPOINT","Failed to compress repository",{error:e}),{success:false}}}async getRepositorySize(){let e=0,t=async n=>{try{let r=await Le.readdir(n,{withFileTypes:!0});for(let o of r){let i=Ie.join(n,o.name);if(o.isDirectory())await t(i);else if(o.isFile()){let a=await Le.stat(i);e+=a.size;}}}catch{}};return await t(this.shadowGitDir),e}async getStorageStats(){let e=await this.getRepositorySize(),t=0,n=async o=>{try{let i=await Le.readdir(o,{withFileTypes:!0});for(let a of i){let l=Ie.join(o,a.name);if(a.isDirectory()&&a.name!==".git")await n(l);else if(a.isFile()){let c=await Le.stat(l);t+=c.size;}}}catch{}};await n(this.shadowDir);let r=await this.getCheckpoints(1e3);return {repositorySize:e,shadowDirSize:t,checkpointCount:r.length,oldestCheckpoint:r.length>0?{id:r[r.length-1].id,timestamp:r[r.length-1].timestamp}:void 0,newestCheckpoint:r.length>0?{id:r[0].id,timestamp:r[0].timestamp}:void 0}}async cleanStaleLocks(){let e=Ie.join(this.shadowGitDir,"index.lock");try{if(wt.existsSync(e)){let n=await Le.stat(e);Date.now()-n.mtimeMs>1e4&&(await Le.unlink(e),m.debug("CHECKPOINT","Cleaned stale lock file"));}}catch{}}async withGitLock(e){let t=this.gitOperationLock,n=()=>{};this.gitOperationLock=new Promise(r=>{n=r;});try{await t;let r;for(let o=1;o<=this.GIT_RETRY_ATTEMPTS;o++)try{return o>1&&(await this.cleanStaleLocks(),await new Promise(a=>setTimeout(a,this.GIT_RETRY_DELAY_MS))),await e()}catch(i){if(r=i,!(i.message&&(i.message.includes("index.lock")||i.message.includes("File exists")))||o===this.GIT_RETRY_ATTEMPTS)throw i;m.warn("CHECKPOINT",`Git operation failed (attempt ${o}/${this.GIT_RETRY_ATTEMPTS}), retrying...`);}throw r}finally{n();}}async destroy(){await this.stopWatching(),this.initialized=false,this.changeCallbacks.clear(),m.debug("CHECKPOINT","Instance destroyed");}};});var cl,L0=R(()=>{R0();cl=class s{static instance=null;instances=new Map;config;constructor(e={}){this.config=e;}static getInstance(e){return s.instance||(s.instance=new s(e)),s.instance}async getCheckpoint(e){let t=Ie.normalize(e);if(!this.instances.has(t)){let n=new jd(this.config);await n.init(t),this.instances.set(t,n);}return this.instances.get(t)}async startWatching(e,t,n=0){return (await this.getCheckpoint(e)).startWatching(t,n)}getBeforeCheckpointId(e){let t=Ie.normalize(e);return this.instances.get(t)?.getBeforeCheckpointId()??null}async stopWatching(e){let t=Ie.normalize(e),n=this.instances.get(t);n&&await n.stopWatching();}async createCheckpoint(e,t){return (await this.getCheckpoint(e)).createCheckpoint(t)}async rollbackTo(e,t){return (await this.getCheckpoint(e)).rollbackTo(t)}async rollbackSingleFile(e,t){return (await this.getCheckpoint(e)).rollbackSingleFile(t)}async reapplySingleFile(e,t){return (await this.getCheckpoint(e)).reapplySingleFile(t)}async getCheckpoints(e,t,n){return (await this.getCheckpoint(e)).getCheckpoints(t,n)}async getDiff(e,t,n){return (await this.getCheckpoint(e)).getDiff(t,n)}async getChangeBuffer(e){return (await this.getCheckpoint(e)).getChangeBuffer()}async getCurrentStats(e){return (await this.getCheckpoint(e)).getCurrentStats()}async onFileChange(e,t){return (await this.getCheckpoint(e)).onFileChange(t)}isWatching(e){let t=Ie.normalize(e);return this.instances.get(t)?.isActive()??false}async cleanup(e){let t=Ie.normalize(e),n=this.instances.get(t);n&&(await n.destroy(),this.instances.delete(t));let r=Ie.join(t,".cdundo");try{await Le.rm(r,{recursive:!0,force:!0}),console.log("[CheckpointManager] Cleaned up:",r);}catch(o){console.error("[CheckpointManager] Failed to cleanup:",o);}}async destroyAll(){for(let[e,t]of this.instances)await t.destroy();this.instances.clear(),console.log("[CheckpointManager] All instances destroyed");}getActiveWorkspaces(){return Array.from(this.instances.keys()).filter(e=>this.instances.get(e)?.isActive())}getStats(){return {totalInstances:this.instances.size,activeInstances:this.getActiveWorkspaces().length,workspaces:Array.from(this.instances.keys())}}},cl.getInstance();});var Gd,N0=R(()=>{L0();Gd=class{checkpointManager;workspacePath=null;enabled=true;sessionMessageCounts=new Map;constructor(e){this.checkpointManager=e??cl.getInstance();}setWorkspace(e){this.workspacePath=e;}setEnabled(e){this.enabled=e;}isEnabled(){return this.enabled}async startMessage(e){if(!this.enabled||!this.workspacePath)return null;let t=this.sessionMessageCounts.get(e)||0;return this.checkpointManager.startWatching(this.workspacePath,e,t)}async finishMessage(e,t){if(!this.enabled||!this.workspacePath)return null;let n=await this.createCheckpoint(e,t);return await this.checkpointManager.stopWatching(this.workspacePath),n}async stopWatching(){this.workspacePath&&await this.checkpointManager.stopWatching(this.workspacePath);}async createCheckpoint(e,t){if(!this.enabled||!this.workspacePath)return null;let n=this.sessionMessageCounts.get(e)||0,r=t||`Message #${n+1}`,o=await this.checkpointManager.createCheckpoint(this.workspacePath,r);return this.sessionMessageCounts.set(e,n+1),o}async rollbackToCheckpoint(e){return this.workspacePath?this.checkpointManager.rollbackTo(this.workspacePath,e):{success:false,restored:[],errors:["No workspace set"]}}async rollbackSingleFile(e){return this.workspacePath?this.checkpointManager.rollbackSingleFile(this.workspacePath,e):{success:false,error:"No workspace set"}}async reapplySingleFile(e){return this.workspacePath?this.checkpointManager.reapplySingleFile(this.workspacePath,e):{success:false,error:"No workspace set"}}async getCheckpoints(e,t){return this.workspacePath?this.checkpointManager.getCheckpoints(this.workspacePath,e,t):[]}async getCurrentStats(){return this.workspacePath?this.checkpointManager.getCurrentStats(this.workspacePath):null}async getChangeBuffer(){return this.workspacePath?this.checkpointManager.getChangeBuffer(this.workspacePath):[]}async cleanup(){this.workspacePath&&await this.checkpointManager.cleanup(this.workspacePath);}};});var Wd,zd,$0=R(()=>{ne();Wd=class{id="edge";tts;constructor(){this.tts=new EdgeTTS;}async init(){}async synthesize(e,t){let n=t?.voice||"zh-CN-XiaoxiaoNeural",r=t?.speed?`${Math.round((t.speed-1)*100)}%`:"+0%",o=t?.format||"mp3",i=o==="opus"?"webm-24khz-16bit-mono-opus":"audio-24khz-48kbitrate-mono-mp3";await this.tts.synthesize(e,n,{rate:r,outputFormat:i});let a=this.tts.toBuffer(),l=this.tts.getAudioInfo();return {audio:a,format:o,durationMs:Math.round(l.estimatedDuration*1e3)}}async synthesizeStream(e,t,n){let r=n?.voice||"zh-CN-XiaoxiaoNeural",o=n?.format||"mp3",i=0;for await(let a of this.tts.synthesizeStream(e,r))a&&a.length>0&&(t(Buffer.from(a),i),i++);return {format:o,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(){}},zd=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 Wd:this.provider=new Wd,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 n=await this.provider.synthesizeStream(e,(r,o)=>{t(r.toString("base64"),o);},{voice:this.config.voice,speed:this.config.speed,format:this.config.format||"mp3"});return {format:n.format,totalChunks:n.totalChunks,voiceText:e}}catch(n){return m.error("TTS",`TTS stream synthesis failed: ${n.message}`),null}}async getVoices(){return this.provider?this.provider.getVoices():[]}destroy(){this.provider?.destroy(),this.provider=null;}};});function HB(s){wt.existsSync(Oy)||wt.mkdirSync(Oy,{recursive:true}),wt.writeFileSync(ul,JSON.stringify(s,null,2));}function B0(){try{wt.existsSync(ul)&&wt.unlinkSync(ul);}catch{}}function Hd(){try{return wt.existsSync(ul)?JSON.parse(wt.readFileSync(ul,"utf-8")):null}catch{return null}}function qB(){let s=process.argv.slice(2),e=4399,t=process.cwd(),n=false;for(let r=0;r<s.length;r++)s[r]==="--port"&&s[r+1]?(e=parseInt(s[r+1],10),r++):s[r]==="--workdir"&&s[r+1]?(t=s[r+1],r++):s[r]==="--daemon"&&(n=true);return {port:e,workDir:t,daemon:n}}async function KB(s,e){let t=He(),n=ti(),r=new nt(t),o=t.agentApprovalMode||t.approvalMode||"auto",i=new ss({defaultPermission:"allow"}),a=(x,B)=>{let H=r.getProvider(x);if(!H)return {provider:null,llmConfig:null};let W=B||H.defaultModel||H.models?.[0]?.name;return {provider:H,llmConfig:{model:W,providerName:H.name||H.id,maxInputTokens:H.contextWindow||128e3}}},l=rd(500),c=new ro({workspacePath:s,source:"server",agentName:"Neox Server"}),u=new zd(t.tts??{enabled:false});t.tts?.enabled&&(u.setSummarizeFn(async(x,B,H)=>{let W=f;if(!W)return x.substring(0,B);let U=mr.createAdapter(W.protocol,W),z=H||"claude-haiku-4-5-20251001";return (await U.chat([{role:"system",content:`\u4F60\u662F\u4E00\u4E2A\u8BED\u97F3\u6458\u8981\u52A9\u624B\u3002\u628A\u4EE5\u4E0B\u5185\u5BB9\u538B\u7F29\u6210${B}\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:x}],{model:z,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||x.substring(0,B)}),await u.init());let d=await zn(s,n),p=Os({workDir:s}),g=typeof p=="string"?p:"",f=r.getDefaultProvider(),y=f?.id??"",b=f?.defaultModel??f?.models?.[0]?.name??"",C={services:n,permissionManager:i,tools:d,memory:l,workDir:s,providerId:y,modelName:b,resolveProvider:a,systemPrompt:g},T=new Gd;T.setWorkspace(s);let S=null,E=null,v=null,I=null,D=t.runMode||"single";try{S=new gi({...C,actionLog:c,agentMode:o==="dangerous"?"auto":"agent",enableFGTS:t.experimental?.enableFGTS,enablePTC:t.experimental?.enablePTC});}catch(x){m.error("SERVER","Failed to init SingleAgentRuntime",{error:x});}try{E=new bi({...C,actionLog:c});}catch(x){m.error("SERVER","Failed to init AssistantRuntime",{error:x});}try{let x=new Lt(void 0,"cooperate");v=new ps({...C,ccbReviewMode:x.getCCBReviewMode(),workerModels:x.getEnabledWorkerModels().map(B=>({providerId:B.providerId,model:B.model,traits:B.traits}))});}catch(x){m.error("SERVER","Failed to init CooperateRuntime",{error:x});}try{let x=async(H,W,U)=>{let z=f;if(!z)throw new Error("No provider configured for NetworkRuntime");let q=mr.createAdapter(z.protocol,z),P=[{role:"system",content:H},{role:"user",content:W}],$=U?.model||b;if(U?.onText&&q.chatStreamed){let V="",Z=q.chatStreamed(P,{model:$,maxTokens:U.maxTokens,temperature:U.temperature,signal:U.signal});for await(let ae of Z)ae.type==="text"&&ae.text?(V+=ae.text,U.onText(ae.text)):ae.type==="content_block_delta"&&ae.delta?.text&&(V+=ae.delta.text,U.onText(ae.delta.text));return V}return (await q.chat(P,{model:$,maxTokens:U?.maxTokens,temperature:U?.temperature,signal:U?.signal})).choices?.[0]?.message?.content||""},B=new Lt(void 0,"network");I=new wi({llmCall:x,executionCapability:{orchestrator:new fr({hostService:new gr({platformServices:n}),resolveProvider:a}),tools:d,permissionManager:i,memory:l,workDir:s,providerId:y,modelName:b,resolveProvider:a,maxIterations:30},autoCreateDefaultAgents:!0,customRoles:B.getNetworkRoles?.()});}catch(x){m.error("SERVER","Failed to init NetworkRuntime",{error:x});}let O=new Set,k=new Map,M=new Map,N={async chat(x,B){O.add(x);let H=new AbortController;k.set(x,H);let W=($,F)=>{if(m.info("SERVER",`\u{1F4E1} publishRawEvent: type=${$.type} sessionId=${x}`),e.publish({sessionId:x,type:$.type,data:$,tracker:F,timestamp:Date.now()}),$.type==="run_result"&&u.isEnabled()){let V=$.currentTurnText||$.output;V&&u.speak(V).then(Z=>{Z&&e.publish({sessionId:x,type:"tts_audio",data:{type:"tts_audio",audio:Z.audio,audioFormat:Z.format,voiceSummary:Z.voiceSummary,durationMs:Z.durationMs??0},timestamp:Date.now()});}).catch(Z=>{m.warn("SERVER",`TTS generation failed: ${Z.message}`);});}},z=$=>{e.publish({sessionId:x,type:"error",data:{type:"error",message:$.message},timestamp:Date.now()});},q={onRuntimeEvent:($,F)=>W($,F),onError:z},P={onRuntimeEvent:$=>W($),onError:z};try{let $=B.mode??D,F=B.attachments?{attachments:B.attachments}:void 0;if($==="single"&&S)await S.chat({sessionId:x,prompt:B.prompt,metadata:F,providerId:B.providerId,modelName:B.modelName},q);else if($==="assistant"&&E)E.removeAllListeners("worker_event"),E.removeAllListeners("worker_result"),E.on("worker_event",V=>{if(V?.event){let Z={...V.event,sourceLabel:V.agentId,workerRole:V.role,workerTask:V.taskSummary};W(Z,V.tracker);}}),E.on("worker_result",V=>{e.publish({sessionId:x,type:"worker_result",data:{type:"worker_result",agentId:V.agentId,success:V.success,output:V.output},timestamp:Date.now()});}),await E.chat({sessionId:x,prompt:B.prompt,metadata:F});else if($==="cooperate"&&v)await v.chat({sessionId:x,prompt:B.prompt,metadata:F},P);else if($==="network"&&I)await I.chat({prompt:B.prompt,history:[]});else if(S)await S.chat({sessionId:x,prompt:B.prompt,metadata:F,providerId:B.providerId,modelName:B.modelName},q);else throw new Error("No runtime available")}finally{O.delete(x),k.delete(x);}},abort(x){let B=k.get(x);B&&(B.abort(),k.delete(x)),S&&S.abort(),E&&E.abort(),v&&v.abort?.();},replyPermission(x,B,H){let W=M.get(x);W&&(W.resolve(B),M.delete(x));},getActiveSessions(){return [...O]},setRunMode(x){Jn.isValidMode(x)&&(D=x,m.info("SERVER",`Run mode changed to: ${D}`));},getRunMode(){return D},setSandboxMode(x,B){ni(B);},setApprovalMode(x,B){let H=B==="auto"?"auto":"agent";S&&S.setAgentMode(H),m.info("SERVER",`Approval mode set to: ${B} \u2192 agentMode=${H==="auto"?"AUTO":"AGENT"}`);},async compactSession(x){m.info("SERVER",`Compact session: ${x}`);},clearSession(x){l.clear(),m.info("SERVER",`Cleared session: ${x}`);},getContextHealth(x){return l.checkContextHealth?.()??null},async getSessionInfo(x){return {messageCount:l.length,messages:l.getAll()}},setCompressionMode(x,B){m.info("SERVER",`Compression mode set to: ${B}`);},getMemoryStats(x){return {length:l.length,contextHealth:l.checkContextHealth?.()??null}},clearMemory(x){l.clear();},addMemoryMessage(x,B,H){l.add({role:B,content:H});},getToolList(){return {count:d.length,names:d.map(x=>x.name)}},async reloadTools(x){let B=await zn(x,n);d.length=0,d.push(...B),m.info("SERVER",`Reloaded ${d.length} tools for ${x}`);},async setWorkspace(x){let B=await zn(x,n);d.length=0,d.push(...B),T.setWorkspace(x),m.info("SERVER",`Workspace switched to: ${x}`);},async startCheckpointWatching(x){return T.startMessage(x)},async stopCheckpointWatching(){await T.stopWatching();},async createCheckpoint(x,B){return T.createCheckpoint(x,B)},async rollbackToCheckpoint(x){return T.rollbackToCheckpoint(x)},async rollbackSingleFile(x){return T.rollbackSingleFile(x)},async reapplySingleFile(x){return T.reapplySingleFile(x)},async getCheckpoints(x,B){return T.getCheckpoints(x,B)},async getCheckpointStats(){return T.getCurrentStats?.()??{created:0,modified:0,deleted:0,directories:0,total:0}},async getCheckpointChanges(){return T.getChangeBuffer?.()??[]},setCheckpointEnabled(x){T.setEnabled(x);},isCheckpointEnabled(){return T.isEnabled()},async cleanupCheckpoints(){await T.cleanup?.();},async getHostStatus(){return {isRunning:O.size>0,currentTask:null,mode:D,workingDirectory:s,uptime:Math.floor(process.uptime()),memoryUsage:{tokensUsed:l.length,contextWindow:128e3,pressure:l.length/128e3}}},async getHostAgents(){return [{id:"main",role:"main",status:O.size>0?"running":"idle"}]},async getHostActivity(x=10){return []},async getHostSession(){return {messageCount:l.length,tokensUsed:0}},async getHostSystem(){let x=null,B="unknown";try{let{execSync:H}=await import('child_process');try{x=H("git rev-parse --abbrev-ref HEAD",{cwd:s,encoding:"utf-8",timeout:5e3}).trim();}catch{}try{B=H("git status --porcelain",{cwd:s,encoding:"utf-8",timeout:5e3}).trim().length===0?"clean":"dirty";}catch{}}catch{}return {platform:process.platform,arch:process.arch,cwd:s,gitBranch:x,gitStatus:B,nodeVersion:process.version}},async hostInterrupt(x){for(let[H,W]of k)W.abort();S&&S.abort(),E&&E.abort(),v&&v.abort?.();let B=O.size>0;return O.clear(),k.clear(),{interrupted:B}},async hostSendCommand(x,B){let H=`cmd-${Date.now()}`,W={prompt:x};return N.chat(H,W).catch(U=>{m.error("SERVER",`hostSendCommand failed: ${U.message}`);}),{queued:true,sessionId:H}},setTTSEnabled(x){let B=u.isEnabled();u.updateConfig({enabled:x,provider:"edge"}),x&&!B&&(u.summarizeFn||u.setSummarizeFn(async(H,W,U)=>{let z=f;if(!z)return H.substring(0,W);let q=mr.createAdapter(z.protocol,z),P=U||"claude-haiku-4-5-20251001";return (await q.chat([{role:"system",content:`\u4F60\u662F\u4E00\u4E2A\u8BED\u97F3\u6458\u8981\u52A9\u624B\u3002\u628A\u4EE5\u4E0B\u5185\u5BB9\u538B\u7F29\u6210${W}\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:H}],{model:P,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||H.substring(0,W)}),u.init().catch(H=>{m.error("SERVER",`TTS init failed: ${H.message}`);})),m.info("SERVER",`TTS ${x?"enabled":"disabled"}`);},isTTSEnabled(){return u.isEnabled()},getTTSConfig(){return t.tts??{enabled:false}},updateTTSConfig(x){let B=u.isEnabled();u.updateConfig(x),x.enabled&&!B&&u.init().catch(H=>{m.error("SERVER",`TTS init failed: ${H.message}`);});}};return N}async function JB(){let{port:s,workDir:e,daemon:t}=qB(),n=He(),r=n.remote??{};m.info("SERVER",`Starting Neox Server on port ${s}, workDir: ${e}`);let o=new Ud,i=new Ti,a=await KB(e,o),l={workDir:e};r.enabled&&r.token&&(l.auth={token:r.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}=k0(l,a,o,i),d=n.channels;d&&(await u.initialize(d),u.setHandler(async f=>{let y=`ch-${f.channelId}-${f.chatId}`;return new Promise(b=>{let C="",T=o.subscribe(y);(async()=>{for await(let S of T){if(S.type==="run_result"){C=S.data?.output||"",T.close();break}if(S.type==="error"){C=`Error: ${S.data?.message||"unknown"}`,T.close();break}}b(C||"[no response]");})(),a.chat(y,{prompt:f.text}).catch(()=>{b("[error processing message]"),T.close();});})}),await u.startAll(),m.info("SERVER","Channel adapters initialized")),await et.initialize(e),et.watch(e),m.info("SERVER",`Skills hot-reload active (${et.size} skills loaded)`);let p=process.env.NEOX_HOST||(r.enabled?r.host||"0.0.0.0":"127.0.0.1");HB({pid:process.pid,port:s,workDir:e,startedAt:Date.now(),daemon:t});let g=()=>{m.info("SERVER","Shutting down..."),et.stopWatch(),u.stopAll().catch(()=>{}),B0(),i.dispose(),o.dispose(),process.exit(0);};process.on("SIGINT",g),process.on("SIGTERM",g),serve({fetch:c.fetch,port:s,hostname:p},f=>{m.info("SERVER",`Neox Server listening on http://${p}:${f.port}`),process.send&&process.send({type:"ready",port:f.port});});}var Oy,ul,F0=R(()=>{_0();I0();Ny();ne();ou();Za();tl();yh();Eh();Pd();Ey();Ay();Tt();cr();Vs();eh();sd();cu();N0();$c();un();sr();Ca();Dy();Jo();$0();Oy=Ie.join(fo.homedir(),".neox"),ul=Ie.join(Oy,"server.pid");JB().catch(s=>{m.error("SERVER","Failed to start server",{error:s}),B0(),process.exit(1);});});async function ZB(s){return new Promise(e=>{let t=iT.createServer();t.once("error",()=>e(false)),t.once("listening",()=>{t.close(()=>e(true));}),t.listen(s,"127.0.0.1");})}async function W0(s=XB){for(let e=s;e<s+100;e++)if(await ZB(e))return e;throw new Error("No free port found")}async function Uy(s){try{let e=new AbortController,t=setTimeout(()=>e.abort(),QB),n=await fetch(`http://127.0.0.1:${s}/health`,{signal:e.signal});return clearTimeout(t),n.ok}catch{return false}}async function z0(s){let e=Hd();if(e){if(process.stderr.write(`[BOOT] ensureServer: found pid file, checking health on port ${e.port}...
3463
3463
  `),await Uy(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};process.stderr.write(`[BOOT] ensureServer: stale pid file, starting new server
3464
3464
  `),m.info("PROCESS_MGR","Stale pid file found, starting new server");}let t=await W0();process.stderr.write(`[BOOT] ensureServer: starting server on port ${t}...
3465
3465
  `);let n=await eF(s,t);return {port:t,baseUrl:`http://127.0.0.1:${t}`,process:n,reused:false}}async function eF(s,e){let t=Ie.resolve(Ie.dirname(fileURLToPath(import.meta.url)),".."),n=Ie.join(t,"server","main.js");process.stderr.write(`[BOOT] startServer: entry=${n}