@mk-co/neox-cli 2.0.54 → 2.0.55
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 +5 -15
- package/dist/sdk/index.js +3 -13
- package/package.json +1 -1
package/dist/cli/main.js
CHANGED
|
@@ -3459,19 +3459,9 @@ 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){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
|
-
`),
|
|
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
|
-
`);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}
|
|
3466
|
-
`),m.info("PROCESS_MGR",`Starting server: ${n} --port ${e} --workdir ${s}`);let r=fork(n,["--port",String(e),"--workdir",s],{stdio:["pipe","pipe","pipe","ipc"],detached:false,env:{...process.env}}),o="";return r.stderr?.on("data",i=>{let a=i.toString();o+=a,m.debug("SERVER_CHILD",a.trim());}),await new Promise((i,a)=>{let l=setTimeout(()=>{process.stderr.write(`[BOOT] startServer: TIMEOUT (${dl}ms)
|
|
3467
|
-
`),o&&process.stderr.write(`[BOOT] server stderr:
|
|
3468
|
-
${o.slice(-500)}
|
|
3469
|
-
`),a(new Error(`Server startup timeout (${dl}ms)`));},dl);r.on("message",c=>{c?.type==="ready"&&(clearTimeout(l),process.stderr.write(`[BOOT] startServer: ready on port ${c.port}
|
|
3470
|
-
`),m.info("PROCESS_MGR",`Server ready on port ${c.port}`),i());}),r.on("error",c=>{clearTimeout(l),process.stderr.write(`[BOOT] startServer: error: ${c.message}
|
|
3471
|
-
`),a(c);}),r.on("exit",c=>{clearTimeout(l),c!==0&&(process.stderr.write(`[BOOT] startServer: exited with code ${c}
|
|
3472
|
-
`),o&&process.stderr.write(`[BOOT] server stderr:
|
|
3473
|
-
${o.slice(-500)}
|
|
3474
|
-
`),a(new Error(`Server exited with code ${c}`)));});}),r}function H0(s){s.process&&!s.process.killed&&(m.info("PROCESS_MGR","Stopping server process"),s.process.kill("SIGTERM"));}function tF(){wt.existsSync(Fy)||wt.mkdirSync(Fy,{recursive:true});}async function q0(s,e){let t=await jy();if(t.running)throw new Error(`Daemon already running (pid: ${t.pid}, port: ${t.port})`);tF();let n=e??await W0(),r=Ie.resolve(Ie.dirname(fileURLToPath(import.meta.url)),".."),o=Ie.join(r,"server","main.js"),i=wt.openSync(qd,"a"),a=spawn(process.execPath,[o,"--port",String(n),"--workdir",s,"--daemon"],{detached:true,stdio:["ignore",i,i],env:{...process.env,NEOX_DAEMON:"1"}});wt.closeSync(i),a.unref();let l=a.pid,c=Date.now();for(;Date.now()-c<dl;)if(await new Promise(u=>setTimeout(u,500)),await Uy(n))return {pid:l,port:n};try{process.kill(l,"SIGTERM");}catch{}throw new Error(`Daemon startup timeout (${dl}ms)`)}async function K0(){let s=Hd();if(!s)return false;try{process.kill(s.pid,"SIGTERM");let e=Date.now();for(;Date.now()-e<5e3;){await new Promise(t=>setTimeout(t,300));try{process.kill(s.pid,0);}catch{return !0}}try{process.kill(s.pid,"SIGKILL");}catch{}return !0}catch{return false}}async function jy(){let s=Hd();if(!s)return {running:false,logFile:qd};let e=false;try{process.kill(s.pid,0),e=!0;}catch{}let t=e&&await Uy(s.port);return {running:t,pid:s.pid,port:s.port,workDir:s.workDir,uptime:t?Math.floor((Date.now()-s.startedAt)/1e3):void 0,logFile:qd}}function so(){return qd}var XB,QB,dl,Fy,qd,Gy=R(()=>{F0();ne();XB=4399,QB=3e3,dl=15e3,Fy=Ie.join(fo.homedir(),".neox"),qd=Ie.join(Fy,"server.log");});var Kd,Jd,fs,In,Vd,rF,$r,w,Xt=R(()=>{vu();Kd=ai,Jd=["/help","/exit","/quit","/mode","/mode ask","/mode agent","/run","/run status","/run single","/run assistant","/run cooperate","/run network","/runconfig","/approval","/approval on","/approval off","/notify","/sandbox","/sandbox on","/sandbox off","/sandbox status","/provider","/provider list","/provider add","/provider edit","/provider remove","/provider default","/provider use","/model","/model list","/model add","/model use","/model remove","/model default","/model config","/attach","/attachments","/thinking","/thinking on","/thinking off","/thinking status","/websearch","/websearch status","/websearch on","/websearch off","/websearch set-url","/websearch set-key","/sessions","/session","/session-new","/session-info","/undo","/checkpoint","/checkpoints","/rollback","/session-clear","/session-export","/compact","/workspace","/workspace list","/workspace add","/workspace switch","/processes","/ps","/kill","/clear","/config-clear","/config-reset","/stats","/statistic","/context","/memory","/memory show","/memory paths","/remote","/index","/index-build","/index-status","/schema-example","/mcp","/mcp list","/mcp add","/mcp remove","/mcp connect","/mcp test"],fs={openai:"https://api.openai.com/v1","openai-responses":"https://api.openai.com/v1",anthropic:"https://api.anthropic.com","anthropic-openai":"https://api.anthropic.com/v1",doubao:"https://ark.cn-beijing.volces.com/api/v3",gemini:"https://generativelanguage.googleapis.com",kimi:"https://api.moonshot.cn/v1"},In={openai:"OpenAI (Chat)","openai-responses":"OpenAI (Responses)",anthropic:"Anthropic","anthropic-openai":"Anthropic (OpenAI Format)",doubao:"\u8C46\u5305 (Doubao)",gemini:"Google Gemini",kimi:"Kimi (Moonshot)"},Vd={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp"},rF=()=>{let s=process.env.COLORFGBG;if(s){let t=s.split(";");if(t.length>1){let n=parseInt(t[1]);return n<8||isNaN(n)}}process.env.TERM_PROGRAM;return true},$r=rF(),w={primary:s=>$r?Oe.cyan(s):Oe.blue(s),success:s=>$r?Oe.green(s):Oe.green(s),error:s=>$r?Oe.red(s):Oe.red(s),warning:s=>$r?Oe.yellow(s):Oe.yellow(s),info:s=>$r?Oe.blueBright(s):Oe.blue(s),dim:s=>$r?Oe.gray(s):Oe.gray(s),highlight:s=>$r?Oe.white.bold(s):Oe.black.bold(s),code:s=>$r?Oe.magenta(s):Oe.magenta(s),text:s=>$r?Oe.white(s):Oe.black(s)};});function Yd(s){let t=Date.now()-s.getTime(),n=Math.floor(t/6e4),r=Math.floor(t/36e5),o=Math.floor(t/864e5);return n<1?"just now":n<60?`${n}m ago`:r<24?`${r}h ago`:o===1?"yesterday":`${o} days ago`}function J0(s){return s<1e3?`${s}ms`:s<6e4?`${(s/1e3).toFixed(1)}s`:s<36e5?`${Math.floor(s/6e4)}m ${Math.floor(s%6e4/1e3)}s`:`${Math.floor(s/36e5)}h ${Math.floor(s%36e5/6e4)}m`}function gl(s){return !s||s.length===0?"":` [${s.join(", ")}]`}function V0(s){if(!s||Object.keys(s).length===0)return "";let e=Object.entries(s);if(e.length===0)return "";let t=e.slice(0,2).map(([r,o])=>{let i=String(o);return i.length>30&&(i=i.substring(0,27)+"..."),`${r}=${i}`}),n=e.length>2?`, +${e.length-2}`:"";return Oe.dim(` (${t.join(", ")}${n})`)}var Y0=R(()=>{});function X0(s,e){let t=e.trim();if(!t.startsWith("/"))return [];let n=/\s$/.test(e),r=t.split(/\s+/);if(r.length===0)return [];let o=r[0],i=r.slice(1),a=s.providerStore.getProviders().map(g=>g.id),l=s.providerSettings?.models.map(g=>g.name)||[],c=["list","add","edit","remove","default","use"],u=["list","add","use","remove","default"],d=(g,f)=>f.map(y=>`${g} ${y}`),p=()=>{if(n)return e;let g=e.lastIndexOf(" ");return g===-1?`${e} `:e.slice(0,g+1)};if(i.length===0&&!n){let g=Jd.filter(f=>f.startsWith(t));if(g.length>0)return g}switch(o){case "/provider":{if(i.length===0||i.length===1&&!n)return d("/provider",c);let g=i[0];if(!c.includes(g))return d("/provider",c);if(["use","edit","remove","default"].includes(g)){if(i.length===1&&!n)return a.map(y=>`/provider ${g} ${y}`);let f=p();return a.map(y=>`${f}${y}`)}return []}case "/model":{if(i.length===0||i.length===1&&!n)return d("/model",u);let g=i[0],f=i.slice(1);if(!u.includes(g))return d("/model",u);switch(g){case "list":{if(a.length===0)return [];let y=f.length===0?`${t} `:p();return a.map(b=>`${y}${b}`)}case "use":{if(f.length===0)return Array.from(new Set([...a.map(T=>`/model use ${T}`),...l.map(T=>`/model use ${T}`)]));let y=f[0],b=s.providerStore.getProvider(y);if(b){let T=p();return (b.models||[]).map(S=>`${T}${S.name}`)}if(l.length===0)return [];let C=f.length===1?`${t} `:p();return l.map(T=>`${C}${T}`)}case "remove":case "delete":case "default":{if(l.length===0)return [];let y=f.length===0?`${t} `:p();return l.map(b=>`${y}${b}`)}default:return []}}default:return []}}var Q0=R(()=>{Xt();});function oF(s){let e=s.trim();if(!e.startsWith("{")||!e.endsWith("}"))return null;try{let t=JSON.parse(e);return !t||typeof t!="object"||typeof t.type!="string"?null:t}catch{return null}}function Z0(s){if(!s)return "";let e=[],t=[],n=[];if((s.pattern||s.query)&&e.push(s.pattern||s.query),Array.isArray(s.keywords)&&e.push(...s.keywords),Array.isArray(s.queries))for(let o of s.queries){if(!o?.pattern)continue;let i=(o.op||"or").toLowerCase();i==="and"?t.push(o.pattern):i==="not"?n.push(o.pattern):e.push(o.pattern);}let r=[];return e.length>0&&r.push(e.join(" OR ")),t.length>0&&r.push(`AND ${t.join(" + ")}`),n.length>0&&r.push(`NOT ${n.join(" + ")}`),r.join(" ")}function e_(s,e,t,n){if(!s)return;let r=xu(e,t);if(s.updateStatus(r,"tool_call"),process.env.CLI_DEBUG==="1"){let a=Object.keys(t).join(",");console.error(`[DEBUG] handleToolCallStart: toolName="${e}", sourceLabel="${n}", argsKeys=${a}`);}let o=e.toLowerCase();if(o==="update_plan"||o==="verify_step"||o==="ask_user")return;if(o==="web_search"||o.includes("websearch")){s.addWebSearchResult({query:t.query||t.q||"",status:"searching",sourceLabel:n});return}if(o==="web_fetch"||o.includes("webfetch")){s.addWebFetchResult({url:t.url||"",status:"fetching",sourceLabel:n});return}if(o==="readfile"||o==="read"){s.addReadFileResult({filePath:t.path||t.file_path||"",startLine:t.start_line||t.offset,numLines:t.num_lines||t.limit,status:"reading",sourceLabel:n});return}if(o==="search"||o==="grep"){let a=Z0(t)||t.pattern||t.query||"",l=t.mode||"content",c=Array.isArray(t.keywords)?false:Array.isArray(t.queries)?t.queries.some(d=>d?.regex!==false):true,u=t.path||t.file_path||".";l==="files"?s.addSearchFilesResult({pattern:a,path:u,status:"searching",sourceLabel:n}):s.addSearchResult({pattern:a,filePath:u,contextLines:t.context_lines,mode:l,regex:c,caseInsensitive:t.case_insensitive,status:"searching",sourceLabel:n});return}if(o==="search_files"||o==="glob"){s.addSearchFilesResult({pattern:t.pattern||"",path:t.path,status:"searching",sourceLabel:n});return}if(o==="show_tree"||o==="list_directory"||o==="smart_tree"){s.addShowTreeResult({path:t.directory||t.path||".",maxDepth:t.max_depth,mode:t.mode,status:"loading",sourceLabel:n});return}if(o==="execute_bash"||o==="execute_shell"||o==="bash"){s.addCommandExecResult({command:t.command||t.code||"",cwd:t.cwd,timeout:t.timeout,background:t.run_in_background,status:"running",sourceLabel:n});return}if(o==="execute_python"||o==="execute_js"||o==="execute_javascript"){s.addCodeExecResult({toolName:e,code:t.code,cwd:t.cwd,status:"running",sourceLabel:n});return}if(o==="debug_in_browser"){s.addBrowserDebugResult({url:t.url||"auto",status:"detecting",sourceLabel:n});return}if(o==="ptc_execute"){let a=t.description||t.script?.substring(0,80)||"Executing script";s.addPTCResult({status:"running",description:a,sourceLabel:n});return}if(o.startsWith("git_")){s.addGitResult({subcommand:o.replace("git_",""),args:t,status:"running",sourceLabel:n});return}if(o==="task"){let a=t.role?`[${t.role}]`:"[scout]",l=t.model||"",c=t.description||"",u=c?c.substring(0,120):"Sub-agent task",d=[a];l&&d.push(l),s.addAssistantToolEntry("task",u,{result:"pending",sourceLabel:n,details:d.join(" \xB7 ")});return}if(["spawn_agent","delegate_task","query_agent","send_message","wait_result","wait_all","terminate_agent"].includes(o)){let a=t.agent_id||t.agentId||t.target||"",l=t.task||t.description||t.message||"",c="",u;if(o==="spawn_agent"){let d=t.role?`[${t.role}]`:"",p=t.model||t.modelName||"";c=l?l.substring(0,120):`Spawn ${d}`;let g=[];d&&g.push(d),p&&g.push(p),g.length&&(u=g.join(" \xB7 "));}else if(o==="wait_all"){let d=t.agent_ids||t.agentIds||[];c=d.length>0?`Waiting ${d.length} agents: ${d.join(", ")}`:"Waiting all agents";}else o==="wait_result"?c=a?`Waiting ${a}`:"Waiting result":o==="delegate_task"?(c=l?l.substring(0,120):`\u2192 ${a}`,t.model&&(u=t.model)):c=l||`\u2192 ${a||o}`;s.addAssistantToolEntry(o,c,{targetAgentId:a,taskId:t.task_id||t.taskId,result:"pending",sourceLabel:n,details:u});return}o==="write_file"||o==="write"||o==="edit_file"||o==="edit"||o==="explore"||o==="task"||s.addToolCall(e,t);}function Wy(s,e,t,n,r,o){if(!s)return;let i=e.toLowerCase();if(i==="update_plan"||i==="verify_step"||i==="ask_user"||i==="explore"||i==="task")return;if(i==="edit_file"||i==="edit"){try{let l=JSON.parse(t);l.status==="success"?s.addEditFileResult({filePath:l.file_path||r?.file_path||"",status:"completed",summary:l.summary||"Edit completed successfully",replacements:l.metadata?.replacements||1,sourceLabel:o}):l.status==="already_done"?s.addEditFileResult({filePath:l.file_path||r?.file_path||"",status:"completed",summary:l.summary||"Edit already applied",alreadyDone:!0,sourceLabel:o}):s.addEditFileResult({filePath:l.file_path||r?.file_path||"",status:"error",error:l.summary||l.error||"Edit failed",sourceLabel:o});}catch{n?s.addEditFileResult({filePath:r?.file_path||"",status:"completed",summary:"Edit completed",sourceLabel:o}):s.addEditFileResult({filePath:r?.file_path||"",status:"error",error:t,sourceLabel:o});}return}if(i==="write_file"||i==="write")return;if(i==="web_search"||i.includes("websearch")){if(n)try{let l=iF(t);s.addWebSearchResult({query:r?.query||r?.q||"",results:l,status:"completed",sourceLabel:o});}catch{s.addWebSearchResult({query:r?.query||r?.q||"",status:"completed",sourceLabel:o});}else s.addWebSearchResult({query:r?.query||"",status:"error",error:t,sourceLabel:o});return}if(i==="web_fetch"||i.includes("webfetch")){n?s.addWebFetchResult({url:r?.url||"",contentLength:t.length,contentPreview:t.slice(0,500),status:"completed",sourceLabel:o}):s.addWebFetchResult({url:r?.url||"",status:"error",error:t,sourceLabel:o});return}if(i==="readfile"||i==="read"){if(n){let l=t.split(`
|
|
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(m.debug("BOOT",`ensureServer: found pid file, checking health on port ${e.port}...`),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};m.debug("BOOT","ensureServer: stale pid file, starting new server");}let t=await W0();m.debug("BOOT",`ensureServer: starting server on port ${t}...`);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");m.debug("BOOT",`startServer: entry=${n}`),m.info("PROCESS_MGR",`Starting server: ${n} --port ${e} --workdir ${s}`);let r=fork(n,["--port",String(e),"--workdir",s],{stdio:["pipe","pipe","pipe","ipc"],detached:false,env:{...process.env}}),o="";return r.stderr?.on("data",i=>{let a=i.toString();o+=a,m.debug("SERVER_CHILD",a.trim());}),await new Promise((i,a)=>{let l=setTimeout(()=>{m.error("BOOT",`startServer: TIMEOUT (${dl}ms)`),o&&m.error("BOOT",`server stderr:
|
|
3463
|
+
${o.slice(-500)}`),a(new Error(`Server startup timeout (${dl}ms)`));},dl);r.on("message",c=>{c?.type==="ready"&&(clearTimeout(l),m.debug("BOOT",`startServer: ready on port ${c.port}`),m.info("PROCESS_MGR",`Server ready on port ${c.port}`),i());}),r.on("error",c=>{clearTimeout(l),m.error("BOOT",`startServer: error: ${c.message}`),a(c);}),r.on("exit",c=>{clearTimeout(l),c!==0&&(m.error("BOOT",`startServer: exited with code ${c}`),o&&m.error("BOOT",`server stderr:
|
|
3464
|
+
${o.slice(-500)}`),a(new Error(`Server exited with code ${c}`)));});}),r}function H0(s){s.process&&!s.process.killed&&(m.info("PROCESS_MGR","Stopping server process"),s.process.kill("SIGTERM"));}function tF(){wt.existsSync(Fy)||wt.mkdirSync(Fy,{recursive:true});}async function q0(s,e){let t=await jy();if(t.running)throw new Error(`Daemon already running (pid: ${t.pid}, port: ${t.port})`);tF();let n=e??await W0(),r=Ie.resolve(Ie.dirname(fileURLToPath(import.meta.url)),".."),o=Ie.join(r,"server","main.js"),i=wt.openSync(qd,"a"),a=spawn(process.execPath,[o,"--port",String(n),"--workdir",s,"--daemon"],{detached:true,stdio:["ignore",i,i],env:{...process.env,NEOX_DAEMON:"1"}});wt.closeSync(i),a.unref();let l=a.pid,c=Date.now();for(;Date.now()-c<dl;)if(await new Promise(u=>setTimeout(u,500)),await Uy(n))return {pid:l,port:n};try{process.kill(l,"SIGTERM");}catch{}throw new Error(`Daemon startup timeout (${dl}ms)`)}async function K0(){let s=Hd();if(!s)return false;try{process.kill(s.pid,"SIGTERM");let e=Date.now();for(;Date.now()-e<5e3;){await new Promise(t=>setTimeout(t,300));try{process.kill(s.pid,0);}catch{return !0}}try{process.kill(s.pid,"SIGKILL");}catch{}return !0}catch{return false}}async function jy(){let s=Hd();if(!s)return {running:false,logFile:qd};let e=false;try{process.kill(s.pid,0),e=!0;}catch{}let t=e&&await Uy(s.port);return {running:t,pid:s.pid,port:s.port,workDir:s.workDir,uptime:t?Math.floor((Date.now()-s.startedAt)/1e3):void 0,logFile:qd}}function so(){return qd}var XB,QB,dl,Fy,qd,Gy=R(()=>{F0();ne();XB=4399,QB=3e3,dl=15e3,Fy=Ie.join(fo.homedir(),".neox"),qd=Ie.join(Fy,"server.log");});var Kd,Jd,fs,In,Vd,rF,$r,w,Xt=R(()=>{vu();Kd=ai,Jd=["/help","/exit","/quit","/mode","/mode ask","/mode agent","/run","/run status","/run single","/run assistant","/run cooperate","/run network","/runconfig","/approval","/approval on","/approval off","/notify","/sandbox","/sandbox on","/sandbox off","/sandbox status","/provider","/provider list","/provider add","/provider edit","/provider remove","/provider default","/provider use","/model","/model list","/model add","/model use","/model remove","/model default","/model config","/attach","/attachments","/thinking","/thinking on","/thinking off","/thinking status","/websearch","/websearch status","/websearch on","/websearch off","/websearch set-url","/websearch set-key","/sessions","/session","/session-new","/session-info","/undo","/checkpoint","/checkpoints","/rollback","/session-clear","/session-export","/compact","/workspace","/workspace list","/workspace add","/workspace switch","/processes","/ps","/kill","/clear","/config-clear","/config-reset","/stats","/statistic","/context","/memory","/memory show","/memory paths","/remote","/index","/index-build","/index-status","/schema-example","/mcp","/mcp list","/mcp add","/mcp remove","/mcp connect","/mcp test"],fs={openai:"https://api.openai.com/v1","openai-responses":"https://api.openai.com/v1",anthropic:"https://api.anthropic.com","anthropic-openai":"https://api.anthropic.com/v1",doubao:"https://ark.cn-beijing.volces.com/api/v3",gemini:"https://generativelanguage.googleapis.com",kimi:"https://api.moonshot.cn/v1"},In={openai:"OpenAI (Chat)","openai-responses":"OpenAI (Responses)",anthropic:"Anthropic","anthropic-openai":"Anthropic (OpenAI Format)",doubao:"\u8C46\u5305 (Doubao)",gemini:"Google Gemini",kimi:"Kimi (Moonshot)"},Vd={".png":"image/png",".jpg":"image/jpeg",".jpeg":"image/jpeg",".gif":"image/gif",".webp":"image/webp"},rF=()=>{let s=process.env.COLORFGBG;if(s){let t=s.split(";");if(t.length>1){let n=parseInt(t[1]);return n<8||isNaN(n)}}process.env.TERM_PROGRAM;return true},$r=rF(),w={primary:s=>$r?Oe.cyan(s):Oe.blue(s),success:s=>$r?Oe.green(s):Oe.green(s),error:s=>$r?Oe.red(s):Oe.red(s),warning:s=>$r?Oe.yellow(s):Oe.yellow(s),info:s=>$r?Oe.blueBright(s):Oe.blue(s),dim:s=>$r?Oe.gray(s):Oe.gray(s),highlight:s=>$r?Oe.white.bold(s):Oe.black.bold(s),code:s=>$r?Oe.magenta(s):Oe.magenta(s),text:s=>$r?Oe.white(s):Oe.black(s)};});function Yd(s){let t=Date.now()-s.getTime(),n=Math.floor(t/6e4),r=Math.floor(t/36e5),o=Math.floor(t/864e5);return n<1?"just now":n<60?`${n}m ago`:r<24?`${r}h ago`:o===1?"yesterday":`${o} days ago`}function J0(s){return s<1e3?`${s}ms`:s<6e4?`${(s/1e3).toFixed(1)}s`:s<36e5?`${Math.floor(s/6e4)}m ${Math.floor(s%6e4/1e3)}s`:`${Math.floor(s/36e5)}h ${Math.floor(s%36e5/6e4)}m`}function gl(s){return !s||s.length===0?"":` [${s.join(", ")}]`}function V0(s){if(!s||Object.keys(s).length===0)return "";let e=Object.entries(s);if(e.length===0)return "";let t=e.slice(0,2).map(([r,o])=>{let i=String(o);return i.length>30&&(i=i.substring(0,27)+"..."),`${r}=${i}`}),n=e.length>2?`, +${e.length-2}`:"";return Oe.dim(` (${t.join(", ")}${n})`)}var Y0=R(()=>{});function X0(s,e){let t=e.trim();if(!t.startsWith("/"))return [];let n=/\s$/.test(e),r=t.split(/\s+/);if(r.length===0)return [];let o=r[0],i=r.slice(1),a=s.providerStore.getProviders().map(g=>g.id),l=s.providerSettings?.models.map(g=>g.name)||[],c=["list","add","edit","remove","default","use"],u=["list","add","use","remove","default"],d=(g,f)=>f.map(y=>`${g} ${y}`),p=()=>{if(n)return e;let g=e.lastIndexOf(" ");return g===-1?`${e} `:e.slice(0,g+1)};if(i.length===0&&!n){let g=Jd.filter(f=>f.startsWith(t));if(g.length>0)return g}switch(o){case "/provider":{if(i.length===0||i.length===1&&!n)return d("/provider",c);let g=i[0];if(!c.includes(g))return d("/provider",c);if(["use","edit","remove","default"].includes(g)){if(i.length===1&&!n)return a.map(y=>`/provider ${g} ${y}`);let f=p();return a.map(y=>`${f}${y}`)}return []}case "/model":{if(i.length===0||i.length===1&&!n)return d("/model",u);let g=i[0],f=i.slice(1);if(!u.includes(g))return d("/model",u);switch(g){case "list":{if(a.length===0)return [];let y=f.length===0?`${t} `:p();return a.map(b=>`${y}${b}`)}case "use":{if(f.length===0)return Array.from(new Set([...a.map(T=>`/model use ${T}`),...l.map(T=>`/model use ${T}`)]));let y=f[0],b=s.providerStore.getProvider(y);if(b){let T=p();return (b.models||[]).map(S=>`${T}${S.name}`)}if(l.length===0)return [];let C=f.length===1?`${t} `:p();return l.map(T=>`${C}${T}`)}case "remove":case "delete":case "default":{if(l.length===0)return [];let y=f.length===0?`${t} `:p();return l.map(b=>`${y}${b}`)}default:return []}}default:return []}}var Q0=R(()=>{Xt();});function oF(s){let e=s.trim();if(!e.startsWith("{")||!e.endsWith("}"))return null;try{let t=JSON.parse(e);return !t||typeof t!="object"||typeof t.type!="string"?null:t}catch{return null}}function Z0(s){if(!s)return "";let e=[],t=[],n=[];if((s.pattern||s.query)&&e.push(s.pattern||s.query),Array.isArray(s.keywords)&&e.push(...s.keywords),Array.isArray(s.queries))for(let o of s.queries){if(!o?.pattern)continue;let i=(o.op||"or").toLowerCase();i==="and"?t.push(o.pattern):i==="not"?n.push(o.pattern):e.push(o.pattern);}let r=[];return e.length>0&&r.push(e.join(" OR ")),t.length>0&&r.push(`AND ${t.join(" + ")}`),n.length>0&&r.push(`NOT ${n.join(" + ")}`),r.join(" ")}function e_(s,e,t,n){if(!s)return;let r=xu(e,t);if(s.updateStatus(r,"tool_call"),process.env.CLI_DEBUG==="1"){let a=Object.keys(t).join(",");console.error(`[DEBUG] handleToolCallStart: toolName="${e}", sourceLabel="${n}", argsKeys=${a}`);}let o=e.toLowerCase();if(o==="update_plan"||o==="verify_step"||o==="ask_user")return;if(o==="web_search"||o.includes("websearch")){s.addWebSearchResult({query:t.query||t.q||"",status:"searching",sourceLabel:n});return}if(o==="web_fetch"||o.includes("webfetch")){s.addWebFetchResult({url:t.url||"",status:"fetching",sourceLabel:n});return}if(o==="readfile"||o==="read"){s.addReadFileResult({filePath:t.path||t.file_path||"",startLine:t.start_line||t.offset,numLines:t.num_lines||t.limit,status:"reading",sourceLabel:n});return}if(o==="search"||o==="grep"){let a=Z0(t)||t.pattern||t.query||"",l=t.mode||"content",c=Array.isArray(t.keywords)?false:Array.isArray(t.queries)?t.queries.some(d=>d?.regex!==false):true,u=t.path||t.file_path||".";l==="files"?s.addSearchFilesResult({pattern:a,path:u,status:"searching",sourceLabel:n}):s.addSearchResult({pattern:a,filePath:u,contextLines:t.context_lines,mode:l,regex:c,caseInsensitive:t.case_insensitive,status:"searching",sourceLabel:n});return}if(o==="search_files"||o==="glob"){s.addSearchFilesResult({pattern:t.pattern||"",path:t.path,status:"searching",sourceLabel:n});return}if(o==="show_tree"||o==="list_directory"||o==="smart_tree"){s.addShowTreeResult({path:t.directory||t.path||".",maxDepth:t.max_depth,mode:t.mode,status:"loading",sourceLabel:n});return}if(o==="execute_bash"||o==="execute_shell"||o==="bash"){s.addCommandExecResult({command:t.command||t.code||"",cwd:t.cwd,timeout:t.timeout,background:t.run_in_background,status:"running",sourceLabel:n});return}if(o==="execute_python"||o==="execute_js"||o==="execute_javascript"){s.addCodeExecResult({toolName:e,code:t.code,cwd:t.cwd,status:"running",sourceLabel:n});return}if(o==="debug_in_browser"){s.addBrowserDebugResult({url:t.url||"auto",status:"detecting",sourceLabel:n});return}if(o==="ptc_execute"){let a=t.description||t.script?.substring(0,80)||"Executing script";s.addPTCResult({status:"running",description:a,sourceLabel:n});return}if(o.startsWith("git_")){s.addGitResult({subcommand:o.replace("git_",""),args:t,status:"running",sourceLabel:n});return}if(o==="task"){let a=t.role?`[${t.role}]`:"[scout]",l=t.model||"",c=t.description||"",u=c?c.substring(0,120):"Sub-agent task",d=[a];l&&d.push(l),s.addAssistantToolEntry("task",u,{result:"pending",sourceLabel:n,details:d.join(" \xB7 ")});return}if(["spawn_agent","delegate_task","query_agent","send_message","wait_result","wait_all","terminate_agent"].includes(o)){let a=t.agent_id||t.agentId||t.target||"",l=t.task||t.description||t.message||"",c="",u;if(o==="spawn_agent"){let d=t.role?`[${t.role}]`:"",p=t.model||t.modelName||"";c=l?l.substring(0,120):`Spawn ${d}`;let g=[];d&&g.push(d),p&&g.push(p),g.length&&(u=g.join(" \xB7 "));}else if(o==="wait_all"){let d=t.agent_ids||t.agentIds||[];c=d.length>0?`Waiting ${d.length} agents: ${d.join(", ")}`:"Waiting all agents";}else o==="wait_result"?c=a?`Waiting ${a}`:"Waiting result":o==="delegate_task"?(c=l?l.substring(0,120):`\u2192 ${a}`,t.model&&(u=t.model)):c=l||`\u2192 ${a||o}`;s.addAssistantToolEntry(o,c,{targetAgentId:a,taskId:t.task_id||t.taskId,result:"pending",sourceLabel:n,details:u});return}o==="write_file"||o==="write"||o==="edit_file"||o==="edit"||o==="explore"||o==="task"||s.addToolCall(e,t);}function Wy(s,e,t,n,r,o){if(!s)return;let i=e.toLowerCase();if(i==="update_plan"||i==="verify_step"||i==="ask_user"||i==="explore"||i==="task")return;if(i==="edit_file"||i==="edit"){try{let l=JSON.parse(t);l.status==="success"?s.addEditFileResult({filePath:l.file_path||r?.file_path||"",status:"completed",summary:l.summary||"Edit completed successfully",replacements:l.metadata?.replacements||1,sourceLabel:o}):l.status==="already_done"?s.addEditFileResult({filePath:l.file_path||r?.file_path||"",status:"completed",summary:l.summary||"Edit already applied",alreadyDone:!0,sourceLabel:o}):s.addEditFileResult({filePath:l.file_path||r?.file_path||"",status:"error",error:l.summary||l.error||"Edit failed",sourceLabel:o});}catch{n?s.addEditFileResult({filePath:r?.file_path||"",status:"completed",summary:"Edit completed",sourceLabel:o}):s.addEditFileResult({filePath:r?.file_path||"",status:"error",error:t,sourceLabel:o});}return}if(i==="write_file"||i==="write")return;if(i==="web_search"||i.includes("websearch")){if(n)try{let l=iF(t);s.addWebSearchResult({query:r?.query||r?.q||"",results:l,status:"completed",sourceLabel:o});}catch{s.addWebSearchResult({query:r?.query||r?.q||"",status:"completed",sourceLabel:o});}else s.addWebSearchResult({query:r?.query||"",status:"error",error:t,sourceLabel:o});return}if(i==="web_fetch"||i.includes("webfetch")){n?s.addWebFetchResult({url:r?.url||"",contentLength:t.length,contentPreview:t.slice(0,500),status:"completed",sourceLabel:o}):s.addWebFetchResult({url:r?.url||"",status:"error",error:t,sourceLabel:o});return}if(i==="readfile"||i==="read"){if(n){let l=t.split(`
|
|
3475
3465
|
`);s.addReadFileResult({filePath:r?.path||r?.file_path||"",totalLines:l.length,fileSize:t.length>=1024?`${(t.length/1024).toFixed(1)}KB`:`${t.length} chars`,preview:t.slice(0,1e3),status:"completed",sourceLabel:o});}else s.addReadFileResult({filePath:r?.path||r?.file_path||"",status:"error",error:t,sourceLabel:o});return}if(i==="search"){let l=oF(t),c=l?.content&&typeof l.content=="string"?l.content:t,u=l?.metadata,d=r?.mode==="files"||u?.mode==="files",p=Z0(r)||r?.pattern||r?.query||"",g=u?.mode||r?.mode||(d?"files":"content"),f=u?.regex??(Array.isArray(r?.keywords)?false:Array.isArray(r?.queries)?r.queries.some(T=>T?.regex!==false):true),y=r?.case_insensitive,b=r?.path||r?.file_path||u?.path||"",C=u?.command;if(n)if(d){let T=u?.files||c.split(`
|
|
3476
3466
|
`).filter(S=>S.trim().startsWith(" ")).map(S=>S.trim());s.addSearchFilesResult({pattern:p,path:b,fileCount:T.length,files:T.slice(0,30),status:"completed",mode:g,strategy:u?.strategy,regex:f,caseInsensitive:y,command:C,sourceLabel:o});}else {let T=aF(c),S=lF(c),E=S.entries.length>0?cF(S.entries):void 0;s.addSearchResult({pattern:p,filePath:b,matchCount:S.matchCount??T.length,details:E,status:"completed",mode:g,strategy:u?.strategy,regex:f,caseInsensitive:y,command:C,sourceLabel:o});}else d?s.addSearchFilesResult({pattern:p,path:b,status:"error",error:c,mode:g,strategy:u?.strategy,regex:f,caseInsensitive:y,command:C,sourceLabel:o}):s.addSearchResult({pattern:p,filePath:b,status:"error",error:c,mode:g,strategy:u?.strategy,regex:f,caseInsensitive:y,command:C,sourceLabel:o});return}if(i==="search_files"||i==="glob"){if(n){let l=t.split(`
|
|
3477
3467
|
`).filter(c=>c.trim());s.addSearchFilesResult({pattern:r?.pattern||"",path:r?.path,fileCount:l.length,files:l.slice(0,30),status:"completed",sourceLabel:o});}else s.addSearchFilesResult({pattern:r?.pattern||"",status:"error",error:t,sourceLabel:o});return}if(i==="show_tree"||i==="list_directory"||i==="smart_tree"){n?s.addShowTreeResult({path:r?.directory||r?.path||".",mode:r?.mode,maxDepth:r?.max_depth,content:t,totalChars:t.length,status:"completed",sourceLabel:o}):s.addShowTreeResult({path:r?.directory||r?.path||".",mode:r?.mode,maxDepth:r?.max_depth,status:"error",error:t,sourceLabel:o});return}if(i==="execute_bash"||i==="execute_shell"||i==="bash"){n?s.addCommandExecResult({command:r?.command||r?.code||"",cwd:r?.cwd,output:t,exitCode:0,status:"completed",sourceLabel:o}):s.addCommandExecResult({command:r?.command||r?.code||"",cwd:r?.cwd,output:t,status:"error",error:t,sourceLabel:o});return}if(i==="execute_python"||i==="execute_js"||i==="execute_javascript"){n?s.addCodeExecResult({toolName:e,code:r?.code,output:t,exitCode:0,status:"completed",sourceLabel:o}):s.addCodeExecResult({toolName:e,code:r?.code,status:"error",error:t,sourceLabel:o});return}if(i==="debug_in_browser"){if(n)try{let l=JSON.parse(t);s.addBrowserDebugResult({url:l.url||"unknown",status:l.success?"completed":"error",summary:l.summary,loadTime:l.load_time,consoleLogs:l.console_logs?.length||0,errors:l.errors?.map(c=>({type:c.type,message:c.message,file:c.file,line:c.line}))||[],networkRequests:l.network_requests?.length||0,performance:l.performance,error:l.error,sourceLabel:o});}catch{s.addToolResult(t,false);}else s.addBrowserDebugResult({url:"unknown",status:"error",error:t,sourceLabel:o});return}if(i==="ptc_execute"){n?s.addPTCResult({status:"completed",description:r?.description||"",output:t,sourceLabel:o}):s.addPTCResult({status:"error",description:r?.description||"",error:t,sourceLabel:o});return}if(i.startsWith("git_")){let l=i.replace("git_",""),c={};try{c=JSON.parse(t);}catch{}n?s.addGitResult({subcommand:l,args:r,status:"completed",output:c.data||c.output||t,summary:c.summary||c._summary,sourceLabel:o}):s.addGitResult({subcommand:l,args:r,status:"error",error:c.error||c._message||c.summary||t,sourceLabel:o});return}if(i==="task"){let l=t.startsWith("[ERROR]"),c=r?.role?`[${r.role}]`:"[scout]",u=t.substring(0,300).replace(/\n/g," "),d=l?u:u||"Task completed",p=t.length>300?t.substring(0,600):void 0;s.addAssistantToolEntry("task",d,{result:l?"error":"success",sourceLabel:o,details:p?`${c}
|
|
@@ -3687,8 +3677,8 @@ Read about how to prevent this error on https://github.com/vadimdemedes/ink/#isr
|
|
|
3687
3677
|
`)}findCursorHint(e,t){for(let n=e.length-1;n>=0;n--){let r=e[n]??"";s.INVERSE_SGR_REGEX.lastIndex=0;let o=-1,i;for(;(i=s.INVERSE_SGR_REGEX.exec(r))!==null;)o=i.index;if(o>=0){let a=r.slice(0,o),l=_l(ks(a)),c=Math.max(0,t-1),u=uv?Math.min(l,c):l;return {lineIndex:n,column:u}}}return null}buildCursorMoveSequence(e,t,n){if(n<=0)return "";let r=n-1,o=Math.max(0,r-e),i="";return o>0&&(i+=`\x1B[${o}A`),i+="\r",t>0&&(i+=`\x1B[${t}C`),i}alignCursorToBottom(e){if(e<=0)return "";let t=Math.max(0,Math.min(this._lastCursorLine,e-1)),r=e-1-t;return r>0?`\x1B[${r}B`:r<0?`\x1B[${-r}A`:""}eraseOutput(e){if(e<=0)return;let t="";for(let n=0;n<e;n++)t+="\x1B[2K",n<e-1&&(t+="\x1B[1A");t+="\r",this.terminal.write(t);}handleResize(e){let t=this._lastWidth,n=this._lastOutput,r=this.calculateVisualLines(n,e);return process.env.NEOX_INK_DEBUG==="1"&&process.stderr.write(`[InlineRenderer.handleResize] width: ${t}\u2192${e}, lastLines=${this._lastVisualLines}, newLines=${r}
|
|
3688
3678
|
`),this._resizeLock=true,this._resizeLockTimer&&clearTimeout(this._resizeLockTimer),this._resizeLockTimer=setTimeout(()=>{this._resizeLock=false,this._resizeLockTimer=null,this.emit("resizeUnlock");},100),this._lastVisualLines=r,this._lastWidth=e,this._resizePending=true,r}render(e){let t=this.terminal.size.columns;process.env.NEOX_INK_DEBUG==="1"&&process.stderr.write(`[InlineRenderer.render] width=${t}, lastWidth=${this._lastWidth}, lastLines=${this._lastVisualLines}, resizePending=${this._resizePending}, content=${e.length} chars
|
|
3689
3679
|
`);let n=this.toVisualLines(e,t),r=n.length,o=this.findCursorHint(n,t);if(process.env.NEOX_INK_DEBUG==="1"&&process.stderr.write(`[InlineRenderer.render] \u{1F4DD} Writing ${r} visual lines
|
|
3690
|
-
`),!this._incremental||this._lastVisualLines===0||this._resizePending||this._lastWidth!==t){if(this._lastVisualLines>0){let
|
|
3691
|
-
`)
|
|
3680
|
+
`),!this._incremental||this._lastVisualLines===0||this._resizePending||this._lastWidth!==t){if(this._lastVisualLines>0){let i=this.alignCursorToBottom(this._lastVisualLines);i&&this.terminal.write(i),this.eraseOutput(this._lastVisualLines);}this.terminal.write(n.join(`
|
|
3681
|
+
`)),o&&r>0&&this.terminal.write(this.buildCursorMoveSequence(o.lineIndex,o.column,r));}else {let i=this._lastVisualLineContent,a=i.length,l=Math.max(a,r),c="";if(a>0){let u=Math.max(0,Math.min(this._lastCursorLine,a-1));u>0&&(c+=`\x1B[${u}A`),c+="\r";}for(let u=0;u<l;u++){u>0&&(c+=`
|
|
3692
3682
|
`),c+="\r";let d=i[u]??"",p=n[u]??"";d!==p&&(c+="\x1B[2K",c+=p);}if(r>0)if(o)c+=this.buildCursorMoveSequence(o.lineIndex,o.column,l);else {let u=l-r;u>0&&(c+=`\x1B[${u}A`),c+="\r";let d=n[r-1]??"";if(uv){let p=ks(d).replace(/[\u0000-\u001F\u007F]/g,""),g=_l(p),f=Math.max(0,t-1),y=Math.min(g,f);y>0&&(c+=`\x1B[${y}C`);}else {let p=_l(ks(d));p>0&&(c+=`\x1B[${p}C`);}}this.terminal.beginSyncUpdate(),this.terminal.write(c),this.terminal.endSyncUpdate();}this._lastOutput=e,this._lastVisualLines=r,this._lastVisualLineContent=n,this._lastCursorLine=r>0?o?Math.max(0,Math.min(o.lineIndex,r-1)):r-1:0,this._lastWidth=t,this._resizePending=false;}clear(){let e=this.alignCursorToBottom(this._lastVisualLines);e&&this.terminal.write(e),this.eraseOutput(this._lastVisualLines),this._lastOutput="",this._lastVisualLines=0,this._lastVisualLineContent=[],this._lastCursorLine=0;}resetState(){this._lastOutput="",this._lastVisualLines=0,this._lastVisualLineContent=[],this._lastCursorLine=0,this._lastWidth=this.terminal.size.columns,this._resizePending=false;}done(){this.terminal.showCursor(),this._lastOutput="",this._lastVisualLines=0,this._lastVisualLineContent=[],this._lastCursorLine=0;}};function em(s={}){return new yo(s)}var gv=()=>{},Bi=class{options;isScreenReaderEnabled;renderer;useAltScreen;isUnmounted;lastOutput;lastOutputHeight;container;rootNode;exitPromise;restoreConsole;unsubscribeResize;terminalAdapter;unsubscribeTerminalResize;_accumulatedStatic="";_lastFullOutput="";scrollUp=(e=3)=>{!this.useAltScreen||!(this.renderer instanceof En)||this.renderer.scrollUp(e)&&this.onRender();};scrollDown=(e=3)=>{!this.useAltScreen||!(this.renderer instanceof En)||this.renderer.scrollDown(e)&&this.onRender();};pageUp=()=>{!this.useAltScreen||!(this.renderer instanceof En)||this.renderer.pageUp()&&this.onRender();};pageDown=()=>{!this.useAltScreen||!(this.renderer instanceof En)||this.renderer.pageDown()&&this.onRender();};scrollToTop=()=>{!this.useAltScreen||!(this.renderer instanceof En)||this.renderer.scrollToTop()&&this.onRender();};scrollToBottom=()=>{!this.useAltScreen||!(this.renderer instanceof En)||this.renderer.scrollToBottom()&&this.onRender();};canScroll=()=>!this.useAltScreen||!(this.renderer instanceof En)?{up:false,down:false}:this.renderer.canScroll();setupMouseWheelHandler(){try{Ts().setMouseWheelCallback(t=>{t==="up"?this.scrollUp(3):this.scrollDown(3);}),at.env.NEOX_INK_DEBUG==="1"&&at.stderr.write(`[INK] \u{1F5B1}\uFE0F Mouse wheel handler installed via InputManager
|
|
3693
3683
|
`);}catch(e){at.env.NEOX_INK_DEBUG==="1"&&at.stderr.write(`[INK] \u26A0\uFE0F InputManager not ready, will retry: ${e}
|
|
3694
3684
|
`),setTimeout(()=>this.setupMouseWheelHandler(),100);}}constructor(e){if(MA(this),this.options=e,this.rootNode=Al("ink-root"),this.rootNode.onComputeLayout=this.calculateLayout,this.isScreenReaderEnabled=e.isScreenReaderEnabled??at.env.INK_SCREEN_READER==="true",this.terminalAdapter=Wr({stdout:e.stdout,stdin:e.stdin,resizePollInterval:void 0}),at.env.NEOX_INK_DEBUG==="1"){let i=this.terminalAdapter.capabilities;at.stderr.write(`[INK] \u{1F5A5}\uFE0F Terminal: ${i.terminalType}, syncUpdate=${i.synchronizedUpdate}, altScreen=${i.alternateScreen}, trueColor=${i.trueColor}
|
package/dist/sdk/index.js
CHANGED
|
@@ -3409,16 +3409,6 @@ ${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>=TS)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}`,xS),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=te__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?te__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 Hc=te.join(Dn.homedir(),".neox"),Ur=te.join(Hc,"server.pid");function $S(a){Me.existsSync(Hc)||Me.mkdirSync(Hc,{recursive:true}),Me.writeFileSync(Ur,JSON.stringify(a,null,2));}function lg(){try{Me.existsSync(Ur)&&Me.unlinkSync(Ur);}catch{}}function cg(){try{return Me.existsSync(Ur)?JSON.parse(Me.readFileSync(Ur,"utf-8")):null}catch{return null}}function FS(){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 jS(a,e){let t=Le(),s=Ts(),n=new rt(t),r=t.agentApprovalMode||t.approvalMode||"auto",i=new ls({defaultPermission:"allow"}),o=(v,E)=>{let P=n.getProvider(v);if(!P)return {provider:null,llmConfig:null};let I=E||P.defaultModel||P.models?.[0]?.name;return {provider:P,llmConfig:{model:I,providerName:P.name||P.id,maxInputTokens:P.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,P)=>{let I=g;if(!I)return v.substring(0,E);let A=$t.createAdapter(I.protocol,I),L=P||"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:L,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||v.substring(0,E)}),await u.init());let d=await As(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,S=null,T=null,_=null,M=t.runMode||"single";try{C=new kn({...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{S=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(P,I,A)=>{let L=g;if(!L)throw new Error("No provider configured for NetworkRuntime");let $=$t.createAdapter(L.protocol,L),D=[{role:"system",content:P},{role:"user",content:I}],N=A?.model||b;if(A?.onText&&$.chatStreamed){let G="",z=$.chatStreamed(D,{model:N,maxTokens:A.maxTokens,temperature:A.temperature,signal:A.signal});for await(let oe of z)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(D,{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 P=new AbortController;x.set(v,P);let I=(N,O)=>{if(m.info("SERVER",`\u{1F4E1} publishRawEvent: type=${N.type} sessionId=${v}`),e.publish({sessionId:v,type:N.type,data:N,tracker:O,timestamp:Date.now()}),N.type==="run_result"&&u.isEnabled()){let G=N.currentTurnText||N.output;G&&u.speak(G).then(z=>{z&&e.publish({sessionId:v,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}`);});}},L=N=>{e.publish({sessionId:v,type:"error",data:{type:"error",message:N.message},timestamp:Date.now()});},$={onRuntimeEvent:(N,O)=>I(N,O),onError:L},D={onRuntimeEvent:N=>I(N),onError:L};try{let N=E.mode??M,O=E.attachments?{attachments:E.attachments}:void 0;if(N==="single"&&C)await C.chat({sessionId:v,prompt:E.prompt,metadata:O,providerId:E.providerId,modelName:E.modelName},$);else if(N==="assistant"&&S)S.removeAllListeners("worker_event"),S.removeAllListeners("worker_result"),S.on("worker_event",G=>{if(G?.event){let z={...G.event,sourceLabel:G.agentId,workerRole:G.role,workerTask:G.taskSummary};I(z,G.tracker);}}),S.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 S.chat({sessionId:v,prompt:E.prompt,metadata:O});else if(N==="cooperate"&&T)await T.chat({sessionId:v,prompt:E.prompt,metadata:O},D);else if(N==="network"&&_)await _.chat({prompt:E.prompt,history:[]});else if(C)await C.chat({sessionId:v,prompt:E.prompt,metadata:O,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(),S&&S.abort(),T&&T.abort?.();},replyPermission(v,E,P){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){fp(E);},setApprovalMode(v,E){let P=E==="auto"?"auto":"agent";C&&C.setAgentMode(P),m.info("SERVER",`Approval mode set to: ${E} \u2192 agentMode=${P==="auto"?"AUTO":"AGENT"}`);},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,P){l.add({role:E,content:P});},getToolList(){return {count:d.length,names:d.map(v=>v.name)}},async reloadTools(v){let E=await As(v,s);d.length=0,d.push(...E),m.info("SERVER",`Reloaded ${d.length} tools for ${v}`);},async setWorkspace(v){let E=await As(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:P}=await import('child_process');try{v=P("git rev-parse --abbrev-ref HEAD",{cwd:a,encoding:"utf-8",timeout:5e3}).trim();}catch{}try{E=P("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[P,I]of x)I.abort();C&&C.abort(),S&&S.abort(),T&&T.abort?.();let E=F.size>0;return F.clear(),x.clear(),{interrupted:E}},async hostSendCommand(v,E){let P=`cmd-${Date.now()}`,I={prompt:v};return j.chat(P,I).catch(A=>{m.error("SERVER",`hostSendCommand failed: ${A.message}`);}),{queued:true,sessionId:P}},setTTSEnabled(v){let E=u.isEnabled();u.updateConfig({enabled:v,provider:"edge"}),v&&!E&&(u.summarizeFn||u.setSummarizeFn(async(P,I,A)=>{let L=g;if(!L)return P.substring(0,I);let $=$t.createAdapter(L.protocol,L),D=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:P}],{model:D,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||P.substring(0,I)}),u.init().catch(P=>{m.error("SERVER",`TTS init failed: ${P.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(P=>{m.error("SERVER",`TTS init failed: ${P.message}`);});}};return j}async function BS(){let{port:a,workDir:e,daemon:t}=FS(),s=Le(),n=s.remote??{};m.info("SERVER",`Starting Neox Server on port ${a}, workDir: ${e}`);let r=new xo,i=new $s,o=await jS(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}=vm(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");$S({pid:process.pid,port:a,workDir:e,startedAt:Date.now(),daemon:t});let h=()=>{m.info("SERVER","Shutting down..."),ht.stopWatch(),u.stopAll().catch(()=>{}),lg(),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});});}BS().catch(a=>{m.error("SERVER","Failed to start server",{error:a}),lg(),process.exit(1);});W();var WS=4399,zS=3e3,Kc=15e3,qS=te.join(Dn.homedir(),".neox");te.join(qS,"server.log");async function HS(a){return new Promise(e=>{let t=Lu.createServer();t.once("error",()=>e(false)),t.once("listening",()=>{t.close(()=>e(true));}),t.listen(a,"127.0.0.1");})}async function JS(a=WS){for(let e=a;e<a+100;e++)if(await HS(e))return e;throw new Error("No free port found")}async function KS(a){try{let e=new AbortController,t=setTimeout(()=>e.abort(),zS),s=await fetch(`http://127.0.0.1:${a}/health`,{signal:e.signal});return clearTimeout(t),s.ok}catch{return false}}async function VS(a){let e=cg();if(e){if(process.stderr.write(`[BOOT] ensureServer: found pid file, checking health on port ${e.port}...
|
|
3413
|
-
`),
|
|
3414
|
-
`),m.info("PROCESS_MGR","
|
|
3415
|
-
`);let s=await YS(a,t);return {port:t,baseUrl:`http://127.0.0.1:${t}`,process:s,reused:false}}async function YS(a,e){let t=te.resolve(te.dirname(fileURLToPath(import.meta.url)),".."),s=te.join(t,"server","main.js");process.stderr.write(`[BOOT] startServer: entry=${s}
|
|
3416
|
-
`),m.info("PROCESS_MGR",`Starting server: ${s} --port ${e} --workdir ${a}`);let n=fork(s,["--port",String(e),"--workdir",a],{stdio:["pipe","pipe","pipe","ipc"],detached:false,env:{...process.env}}),r="";return n.stderr?.on("data",i=>{let o=i.toString();r+=o,m.debug("SERVER_CHILD",o.trim());}),await new Promise((i,o)=>{let l=setTimeout(()=>{process.stderr.write(`[BOOT] startServer: TIMEOUT (${Kc}ms)
|
|
3417
|
-
`),r&&process.stderr.write(`[BOOT] server stderr:
|
|
3418
|
-
${r.slice(-500)}
|
|
3419
|
-
`),o(new Error(`Server startup timeout (${Kc}ms)`));},Kc);n.on("message",c=>{c?.type==="ready"&&(clearTimeout(l),process.stderr.write(`[BOOT] startServer: ready on port ${c.port}
|
|
3420
|
-
`),m.info("PROCESS_MGR",`Server ready on port ${c.port}`),i());}),n.on("error",c=>{clearTimeout(l),process.stderr.write(`[BOOT] startServer: error: ${c.message}
|
|
3421
|
-
`),o(c);}),n.on("exit",c=>{clearTimeout(l),c!==0&&(process.stderr.write(`[BOOT] startServer: exited with code ${c}
|
|
3422
|
-
`),r&&process.stderr.write(`[BOOT] server stderr:
|
|
3423
|
-
${r.slice(-500)}
|
|
3424
|
-
`),o(new Error(`Server exited with code ${c}`)));});}),n}function XS(a){a.process&&!a.process.killed&&(m.info("PROCESS_MGR","Stopping server process"),a.process.kill("SIGTERM"));}export{Sn as ApiError,$s as DeviceManager,Dr as NeoxClient,zl as RemoteRuntimeAdapter,Pr as RuntimeCheckpointService,Rt as RuntimeHostService,Et as RuntimeOrchestrator,vo as RuntimeOrchestratorError,jw as applyThinkingMode,zw as authMiddleware,wr as buildInstructions,Ul as createAgentRuntimeHost,Bw as createElectronServices,Ts as createNodeServices,dl as electronToolCapabilities,VS as ensureServer,As as getTools,Li as nodeToolCapabilities,_b as preloadShellEnv,ql as rateLimitMiddleware,gp as setToolServices,XS as stopServer};
|
|
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>=TS)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}`,xS),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=te__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?te__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 Hc=te.join(Dn.homedir(),".neox"),Ur=te.join(Hc,"server.pid");function $S(a){Me.existsSync(Hc)||Me.mkdirSync(Hc,{recursive:true}),Me.writeFileSync(Ur,JSON.stringify(a,null,2));}function lg(){try{Me.existsSync(Ur)&&Me.unlinkSync(Ur);}catch{}}function cg(){try{return Me.existsSync(Ur)?JSON.parse(Me.readFileSync(Ur,"utf-8")):null}catch{return null}}function FS(){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 jS(a,e){let t=Le(),s=Ts(),n=new rt(t),r=t.agentApprovalMode||t.approvalMode||"auto",i=new ls({defaultPermission:"allow"}),o=(v,E)=>{let P=n.getProvider(v);if(!P)return {provider:null,llmConfig:null};let I=E||P.defaultModel||P.models?.[0]?.name;return {provider:P,llmConfig:{model:I,providerName:P.name||P.id,maxInputTokens:P.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,P)=>{let I=g;if(!I)return v.substring(0,E);let A=$t.createAdapter(I.protocol,I),L=P||"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:L,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||v.substring(0,E)}),await u.init());let d=await As(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,S=null,T=null,_=null,M=t.runMode||"single";try{C=new kn({...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{S=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(P,I,A)=>{let L=g;if(!L)throw new Error("No provider configured for NetworkRuntime");let $=$t.createAdapter(L.protocol,L),D=[{role:"system",content:P},{role:"user",content:I}],N=A?.model||b;if(A?.onText&&$.chatStreamed){let G="",z=$.chatStreamed(D,{model:N,maxTokens:A.maxTokens,temperature:A.temperature,signal:A.signal});for await(let oe of z)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(D,{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 P=new AbortController;x.set(v,P);let I=(N,O)=>{if(m.info("SERVER",`\u{1F4E1} publishRawEvent: type=${N.type} sessionId=${v}`),e.publish({sessionId:v,type:N.type,data:N,tracker:O,timestamp:Date.now()}),N.type==="run_result"&&u.isEnabled()){let G=N.currentTurnText||N.output;G&&u.speak(G).then(z=>{z&&e.publish({sessionId:v,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}`);});}},L=N=>{e.publish({sessionId:v,type:"error",data:{type:"error",message:N.message},timestamp:Date.now()});},$={onRuntimeEvent:(N,O)=>I(N,O),onError:L},D={onRuntimeEvent:N=>I(N),onError:L};try{let N=E.mode??M,O=E.attachments?{attachments:E.attachments}:void 0;if(N==="single"&&C)await C.chat({sessionId:v,prompt:E.prompt,metadata:O,providerId:E.providerId,modelName:E.modelName},$);else if(N==="assistant"&&S)S.removeAllListeners("worker_event"),S.removeAllListeners("worker_result"),S.on("worker_event",G=>{if(G?.event){let z={...G.event,sourceLabel:G.agentId,workerRole:G.role,workerTask:G.taskSummary};I(z,G.tracker);}}),S.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 S.chat({sessionId:v,prompt:E.prompt,metadata:O});else if(N==="cooperate"&&T)await T.chat({sessionId:v,prompt:E.prompt,metadata:O},D);else if(N==="network"&&_)await _.chat({prompt:E.prompt,history:[]});else if(C)await C.chat({sessionId:v,prompt:E.prompt,metadata:O,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(),S&&S.abort(),T&&T.abort?.();},replyPermission(v,E,P){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){fp(E);},setApprovalMode(v,E){let P=E==="auto"?"auto":"agent";C&&C.setAgentMode(P),m.info("SERVER",`Approval mode set to: ${E} \u2192 agentMode=${P==="auto"?"AUTO":"AGENT"}`);},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,P){l.add({role:E,content:P});},getToolList(){return {count:d.length,names:d.map(v=>v.name)}},async reloadTools(v){let E=await As(v,s);d.length=0,d.push(...E),m.info("SERVER",`Reloaded ${d.length} tools for ${v}`);},async setWorkspace(v){let E=await As(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:P}=await import('child_process');try{v=P("git rev-parse --abbrev-ref HEAD",{cwd:a,encoding:"utf-8",timeout:5e3}).trim();}catch{}try{E=P("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[P,I]of x)I.abort();C&&C.abort(),S&&S.abort(),T&&T.abort?.();let E=F.size>0;return F.clear(),x.clear(),{interrupted:E}},async hostSendCommand(v,E){let P=`cmd-${Date.now()}`,I={prompt:v};return j.chat(P,I).catch(A=>{m.error("SERVER",`hostSendCommand failed: ${A.message}`);}),{queued:true,sessionId:P}},setTTSEnabled(v){let E=u.isEnabled();u.updateConfig({enabled:v,provider:"edge"}),v&&!E&&(u.summarizeFn||u.setSummarizeFn(async(P,I,A)=>{let L=g;if(!L)return P.substring(0,I);let $=$t.createAdapter(L.protocol,L),D=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:P}],{model:D,maxTokens:300,temperature:.3})).choices?.[0]?.message?.content||P.substring(0,I)}),u.init().catch(P=>{m.error("SERVER",`TTS init failed: ${P.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(P=>{m.error("SERVER",`TTS init failed: ${P.message}`);});}};return j}async function BS(){let{port:a,workDir:e,daemon:t}=FS(),s=Le(),n=s.remote??{};m.info("SERVER",`Starting Neox Server on port ${a}, workDir: ${e}`);let r=new xo,i=new $s,o=await jS(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}=vm(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");$S({pid:process.pid,port:a,workDir:e,startedAt:Date.now(),daemon:t});let h=()=>{m.info("SERVER","Shutting down..."),ht.stopWatch(),u.stopAll().catch(()=>{}),lg(),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});});}BS().catch(a=>{m.error("SERVER","Failed to start server",{error:a}),lg(),process.exit(1);});W();var WS=4399,zS=3e3,Kc=15e3,qS=te.join(Dn.homedir(),".neox");te.join(qS,"server.log");async function HS(a){return new Promise(e=>{let t=Lu.createServer();t.once("error",()=>e(false)),t.once("listening",()=>{t.close(()=>e(true));}),t.listen(a,"127.0.0.1");})}async function JS(a=WS){for(let e=a;e<a+100;e++)if(await HS(e))return e;throw new Error("No free port found")}async function KS(a){try{let e=new AbortController,t=setTimeout(()=>e.abort(),zS),s=await fetch(`http://127.0.0.1:${a}/health`,{signal:e.signal});return clearTimeout(t),s.ok}catch{return false}}async function VS(a){let e=cg();if(e){if(m.debug("BOOT",`ensureServer: found pid file, checking health on port ${e.port}...`),await KS(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.debug("BOOT","ensureServer: stale pid file, starting new server");}let t=await JS();m.debug("BOOT",`ensureServer: starting server on port ${t}...`);let s=await YS(a,t);return {port:t,baseUrl:`http://127.0.0.1:${t}`,process:s,reused:false}}async function YS(a,e){let t=te.resolve(te.dirname(fileURLToPath(import.meta.url)),".."),s=te.join(t,"server","main.js");m.debug("BOOT",`startServer: entry=${s}`),m.info("PROCESS_MGR",`Starting server: ${s} --port ${e} --workdir ${a}`);let n=fork(s,["--port",String(e),"--workdir",a],{stdio:["pipe","pipe","pipe","ipc"],detached:false,env:{...process.env}}),r="";return n.stderr?.on("data",i=>{let o=i.toString();r+=o,m.debug("SERVER_CHILD",o.trim());}),await new Promise((i,o)=>{let l=setTimeout(()=>{m.error("BOOT",`startServer: TIMEOUT (${Kc}ms)`),r&&m.error("BOOT",`server stderr:
|
|
3413
|
+
${r.slice(-500)}`),o(new Error(`Server startup timeout (${Kc}ms)`));},Kc);n.on("message",c=>{c?.type==="ready"&&(clearTimeout(l),m.debug("BOOT",`startServer: ready on port ${c.port}`),m.info("PROCESS_MGR",`Server ready on port ${c.port}`),i());}),n.on("error",c=>{clearTimeout(l),m.error("BOOT",`startServer: error: ${c.message}`),o(c);}),n.on("exit",c=>{clearTimeout(l),c!==0&&(m.error("BOOT",`startServer: exited with code ${c}`),r&&m.error("BOOT",`server stderr:
|
|
3414
|
+
${r.slice(-500)}`),o(new Error(`Server exited with code ${c}`)));});}),n}function XS(a){a.process&&!a.process.killed&&(m.info("PROCESS_MGR","Stopping server process"),a.process.kill("SIGTERM"));}export{Sn as ApiError,$s as DeviceManager,Dr as NeoxClient,zl as RemoteRuntimeAdapter,Pr as RuntimeCheckpointService,Rt as RuntimeHostService,Et as RuntimeOrchestrator,vo as RuntimeOrchestratorError,jw as applyThinkingMode,zw as authMiddleware,wr as buildInstructions,Ul as createAgentRuntimeHost,Bw as createElectronServices,Ts as createNodeServices,dl as electronToolCapabilities,VS as ensureServer,As as getTools,Li as nodeToolCapabilities,_b as preloadShellEnv,ql as rateLimitMiddleware,gp as setToolServices,XS as stopServer};
|