@mk-co/neox-cli 2.0.56 → 2.0.57
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 +74 -67
- package/package.json +1 -1
package/dist/cli/main.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import*as wt from'fs';import wt__default,{readFileSync,realpathSync,existsSync,mkdirSync,writeFileSync,readlinkSync,readdirSync,readdir as readdir$1,lstatSync,createReadStream}from'fs';import*as Ie from'path';import Ie__default,{dirname,join,win32,posix}from'path';import*as ho from'os';import ho__default,{homedir,tmpdir,platform}from'os';import {execSync,fork,spawn,spawnSync}from'child_process';import {fileURLToPath}from'url';import mP from'ajv';import*as Le from'fs/promises';import Le__default,{readFile,realpath,readlink,readdir,lstat}from'fs/promises';import Nr,{createHash,randomBytes,randomUUID,createHmac}from'crypto';import {EventEmitter}from'events';import kC,{Stream}from'stream';import {StringDecoder}from'string_decoder';import {execa,execaSync}from'execa';import $R from'puppeteer-core';import*as iT from'net';import MT from'fast-glob';import*as zh from'readline';import zh__default from'readline';import pO from'axios';import HS from'vm';import {Hono}from'hono';import {cors}from'hono/cors';import {streamSSE}from'hono/streaming';import P0 from'simple-git';import*as M0 from'chokidar';import {EdgeTTS}from'@andresaya/edge-tts';import {serve}from'@hono/node-server';import Oe from'chalk';import {performance as performance$1}from'perf_hooks';import xl from'prompts';import A,{createContext,forwardRef,useContext,useState,useEffect,useMemo,useRef,useLayoutEffect,PureComponent}from'react';import
|
|
2
|
+
import*as wt from'fs';import wt__default,{readFileSync,realpathSync,existsSync,mkdirSync,writeFileSync,readlinkSync,readdirSync,readdir as readdir$1,lstatSync,createReadStream}from'fs';import*as Ie from'path';import Ie__default,{dirname,join,win32,posix}from'path';import*as ho from'os';import ho__default,{homedir,tmpdir,platform}from'os';import {execSync,fork,spawn,spawnSync}from'child_process';import {fileURLToPath}from'url';import mP from'ajv';import*as Le from'fs/promises';import Le__default,{readFile,realpath,readlink,readdir,lstat}from'fs/promises';import Nr,{createHash,randomBytes,randomUUID,createHmac}from'crypto';import {EventEmitter}from'events';import kC,{Stream}from'stream';import {StringDecoder}from'string_decoder';import {execa,execaSync}from'execa';import $R from'puppeteer-core';import*as iT from'net';import MT from'fast-glob';import*as zh from'readline';import zh__default from'readline';import pO from'axios';import HS from'vm';import {Hono}from'hono';import {cors}from'hono/cors';import {streamSSE}from'hono/streaming';import P0 from'simple-git';import*as M0 from'chokidar';import {EdgeTTS}from'@andresaya/edge-tts';import {serve}from'@hono/node-server';import Oe from'chalk';import {performance as performance$1}from'perf_hooks';import xl from'prompts';import A,{createContext,forwardRef,useContext,useState,useEffect,useMemo,useRef,useLayoutEffect,PureComponent}from'react';import Ye,{cwd}from'process';import bo from'is-in-ci';import MA from'auto-bind';import {onExit}from'signal-exit';import DA from'patch-console';import {NoEventPriority,DefaultEventPriority,LegacyRoot}from'react-reconciler/constants.js';import Re from'yoga-layout';import bE from'react-reconciler';import tE from'widest-line';import rE from'wrap-ansi';import Gr from'slice-ansi';import _l from'string-width';import {styledCharsFromTokens,tokenize,styledCharsToString}from'@alcalzone/ansi-tokenize';import cv from'cli-cursor';import Yb from'stack-utils';import {Buffer as Buffer$1}from'buffer';import S$ from'ansi-escapes';import {Marked}from'marked';import {markedTerminal}from'marked-terminal';import {Box,Text}from'ink';import si from'ink-spinner';import {Client}from'@modelcontextprotocol/sdk/client/index.js';import {StdioClientTransport}from'@modelcontextprotocol/sdk/client/stdio.js';import {SSEClientTransport}from'@modelcontextprotocol/sdk/client/sse.js';import'ws';var WI=Object.create;var vp=Object.defineProperty;var zI=Object.getOwnPropertyDescriptor;var HI=Object.getOwnPropertyNames;var qI=Object.getPrototypeOf,KI=Object.prototype.hasOwnProperty;var R=(s,e)=>()=>(s&&(e=s(s=0)),e);var kl=(s,e)=>()=>(e||s((e={exports:{}}).exports,e),e.exports),jr=(s,e)=>{for(var t in e)vp(s,t,{get:e[t],enumerable:true});},JI=(s,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of HI(e))!KI.call(s,r)&&r!==t&&vp(s,r,{get:()=>e[r],enumerable:!(n=zI(e,r))||n.enumerable});return s};var pb=(s,e,t)=>(t=s!=null?WI(qI(s)):{},JI(vp(t,"default",{value:s,enumerable:true}),s));var gb={};jr(gb,{cliHealthMonitor:()=>hn,cliLogger:()=>m,debugLog:()=>de,generateCurlCommand:()=>vr,installCrashHandler:()=>Sp,logCurlCommand:()=>xp});function XI(s,e){let t=new WeakSet;try{return JSON.stringify(s,(n,r)=>{if(e&&n){let o=n.toLowerCase();if(YI.has(o))return "[REDACTED]"}if(typeof r=="bigint")return r.toString();if(r instanceof Error)return {name:r.name,message:r.message,stack:r.stack};if(typeof r=="function")return "[Function]";if(typeof r=="object"&&r!==null){if(t.has(r))return "[Circular]";t.add(r);}return r})}catch{return JSON.stringify({error:"[Unserializable payload]"})}}function vr(s,e,t,n=true){let r=["curl -X POST \\"];r.push(` '${s}' \\`);for(let[i,a]of Object.entries(e)){let l=a;if(n){let c=i.toLowerCase();if(c==="authorization"||c==="x-api-key"||c==="anthropic-api-key")if(l.startsWith("Bearer ")){let u=l.slice(7);l=`Bearer ${u.slice(0,8)}...${u.slice(-4)}`;}else l.length>12&&(l=`${l.slice(0,8)}...${l.slice(-4)}`);}r.push(` -H '${i}: ${l}' \\`);}let o=XI(t,n);return r.push(` -d '${QI(o)}'`),r.join(`
|
|
3
3
|
`)}function QI(s){return s.replace(/'/g,"'\\''")}function xp(s,e,t){if(process.env.CLI_DEBUG!=="1")return;let n=vr(s,e,t);m.info("CURL","=== LLM Request CURL Command ==="),m.info("CURL",n),m.info("CURL","=== End CURL Command ==="),process.env.CLI_DEBUG_CONSOLE==="1"&&(console.log(`
|
|
4
4
|
[CURL] === LLM Request CURL Command ===`),console.log(n),console.log(`[CURL] === End CURL Command ===
|
|
5
5
|
`));}function de(s,e,t){if(process.env.CLI_DEBUG==="1"&&(m.debug(s,e,t),process.env.CLI_DEBUG_CONSOLE==="1")){let n=s?`[${s}]`:"";t!==void 0?console.log(n,e,t):console.log(n,e);}}function Sp(){process.on("uncaughtException",s=>{m.error("CRASH","Uncaught Exception",{name:s.name,message:s.message,stack:s.stack}),setTimeout(()=>process.exit(1),100);}),process.on("unhandledRejection",s=>{m.error("CRASH","Unhandled Rejection",{reason:s instanceof Error?{name:s.name,message:s.message,stack:s.stack}:s});});try{process.on("SIGTTIN","ignore"),process.on("SIGTTOU","ignore"),m.info("SIGNAL","TTY control signals (SIGTTIN/SIGTTOU) initialized in crashHandler");}catch{}process.on("exit",()=>{m.close();});}var wp,m,YI,Tp,hn,ne=R(()=>{wp=class{logDir;enabled=true;initialized=false;writeStream=null;currentLogFile=null;backpressured=false;constructor(){this.logDir=Ie__default.join(ho__default.homedir(),".neox","logs");}init(){if(!this.initialized)try{wt__default.existsSync(this.logDir)||wt__default.mkdirSync(this.logDir,{recursive:!0}),this.initialized=!0;}catch{this.enabled=false;}}getLogFilePath(){let e=new Date().toISOString().split("T")[0];return Ie__default.join(this.logDir,`cli-${e}.log`)}ensureStream(){if(!this.enabled||(this.init(),!this.initialized))return null;let e=this.getLogFilePath();return this.currentLogFile!==e&&(this.writeStream&&this.writeStream.end(),this.writeStream=wt__default.createWriteStream(e,{flags:"a"}),this.writeStream.on("error",()=>{this.enabled=false,this.currentLogFile=null;let t=this.writeStream;this.writeStream=null;try{t?.destroy();}catch{}}),this.currentLogFile=e),this.writeStream}formatLocalTime(){let e=new Date,t=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0"),o=String(e.getHours()).padStart(2,"0"),i=String(e.getMinutes()).padStart(2,"0"),a=String(e.getSeconds()).padStart(2,"0"),l=String(e.getMilliseconds()).padStart(3,"0");return `${t}-${n}-${r} ${o}:${i}:${a}.${l}`}formatMessage(e,t,n,r){let o=this.formatLocalTime(),i=e.toUpperCase().padEnd(5),a=t?`[${t}]`:"",l=`${o} ${i} ${a} ${n}`;if(r!==void 0)try{let c=this.safeStringify(r);l+=` ${c}`;}catch{l+=" [Serialization Error]";}return l+`
|
|
@@ -36,9 +36,9 @@ if ($img) {
|
|
|
36
36
|
$img.Save('${t.replace(/'/g,"''")}')
|
|
37
37
|
Write-Host 'OK'
|
|
38
38
|
}
|
|
39
|
-
`;if(execSync(`powershell.exe -NoProfile -Command "${n.replace(/"/g,'\\"')}"`,{encoding:"utf-8",timeout:5e3}).includes("OK")&&wt.existsSync(e)){let o=wt.statSync(e);if(o.size>0)return m.info("CLIPBOARD",`\u2713 WSL: Saved clipboard image (${Math.round(o.size/1024)}KB)`),e}}catch(n){m.debug("CLIPBOARD","WSL: Failed to save clipboard image",{error:n});}return null}async function av(){return ov()?iv():null}function wA(s){try{let e=wt.readFileSync(s),t=Ie.extname(s).toLowerCase(),n="image/png";t===".jpg"||t===".jpeg"?n="image/jpeg":t===".gif"?n="image/gif":t===".webp"?n="image/webp":t===".bmp"&&(n="image/bmp");let r=e.toString("base64");return `data:${n};base64,${r}`}catch(e){return m.error("CLIPBOARD","Failed to convert image to base64",{error:e,imagePath:s}),null}}function Vp(s){try{let e=wt.readFileSync(s),t=Ie.extname(s).toLowerCase(),n="image/png";t===".jpg"||t===".jpeg"?n="image/jpeg":t===".gif"?n="image/gif":t===".webp"?n="image/webp":t===".bmp"&&(n="image/bmp");let r=e.toString("base64");return {mediaType:n,data:r}}catch(e){return m.error("CLIPBOARD","Failed to convert image to base64",{error:e,imagePath:s}),null}}async function Yp(){let s=pA();if(s){m.info("CLIPBOARD",`\u{1F4CE} Using image file from clipboard: ${s}`);let r=Vp(s);if(r)return {...r,name:Ie.basename(s)}}let e=await av();if(!e)return null;let t=Vp(e);if(!t)return null;let n=Ie.basename(e);try{wt.unlinkSync(e);}catch{}return {...t,name:n}}var Kp,sv,Xp=R(()=>{ne();qr();Kp=null,sv=false;});function Yl(s){return {output_info:s,behavior:{type:"allow"}}}function vv(s,e){return {output_info:e,behavior:{type:"reject_content",message:s}}}var nm=R(()=>{});function Co(){let s=new Date,e=s.toISOString().slice(0,10).replace(/-/g,""),t=s.toISOString().slice(11,19).replace(/:/g,""),n=Math.random().toString(36).slice(2,6);return `session_${e}_${t}_${n}`}var _s=R(()=>{});function nP(s){let e=s.match(/Error\s+(?:code\s+)?(\d{3})/i);if(e)return e[1];let t=s.match(/(\d{3}):\s*([^<\n]+)/);return t?t[1]:null}function rP(s){let e=s.match(/<title>[^|]*\|\s*\d{3}:\s*([^<]+)<\/title>/i);if(e)return e[1].trim();let t=s.match(/<h1[^>]*>(?:<[^>]+>)*([^<]+?(?:\s+\d{3})?)<\/(?:[^>]+>)*<\/h1>/i);if(t)return t[1].replace(/Error code\s+\d{3}/i,"").trim();let n=s.match(/Error\s+code\s+(\d{3})/i);if(n){let o=n[1];return {502:"Bad gateway",503:"Service unavailable",504:"Gateway timeout",520:"Unknown error",521:"Web server is down",522:"Connection timed out",523:"Origin is unreachable",524:"A timeout occurred"}[o]||"Server error"}let r=s.match(/<span[^>]*class="inline-block"[^>]*>([^<]+)<\/span>/i);return r?r[1].trim():null}function sP(s){let e=s.match(/truncate[^>]*>([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})<\/span>/);if(e)return e[1];let t=s.match(/<title>([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/);return t?t[1]:null}function Ui(s){return s.trim().startsWith("<!DOCTYPE html")||s.trim().startsWith("<html")||/<html[^>]*>/i.test(s)}function oP(s){let e=s.match(/^data:\s*(\{.*\})/m);return e?e[1]:null}function Is(s,e){let t=oP(s);if(t)try{let i=JSON.parse(t);if(i.error){let a=i.error,l=a.type||a.code||(e?`HTTP_${e}`:"API_ERROR"),c=a.message||"API error",u;if(a.type==="usage_limit_reached"){let d=a.resets_at?new Date(a.resets_at*1e3).toLocaleString():void 0,p=a.resets_in_seconds;if(p){let g=Math.floor(p/3600),h=Math.floor(p%3600/60);u=`Usage limit reached (${a.plan_type||"unknown"} plan). Resets in ${g}h ${h}m.`;}else d&&(u=`Usage limit reached (${a.plan_type||"unknown"} plan). Resets at ${d}.`);}return {code:l,message:c,detail:u}}}catch{}if(s.trim().startsWith("{"))try{let i=JSON.parse(s);if(i.error){let a=i.error;return {code:a.type||a.code||(e?`HTTP_${e}`:"API_ERROR"),message:a.message||"API error"}}}catch{}if(Ui(s)){let i=nP(s)||String(e||"UNKNOWN"),a=rP(s)||"Server error",l=sP(s),c;return l&&(l.includes("cloudflare")?c=`The server (${l}) is protected by Cloudflare but is not responding.`:c=`The API server (${l}) is not responding. This may be a temporary issue with your API provider.`),{code:`HTTP_${i}`,message:a,detail:c}}let n=s.match(/OpenAI.*error:\s*(\d+)\s*-\s*(.*)/i);if(n){let i=n[1],a=n[2];if(Ui(a)){let l=Is(a,parseInt(i,10));return {code:l.code,message:l.message,detail:l.detail}}return a=a.trim(),a.length>200&&(a=a.slice(0,200)+"..."),{code:`HTTP_${i}`,message:a}}let r=s.match(/Anthropic.*error:\s*(\d+)\s*-\s*(.*)/i);if(r){let i=r[1],a=r[2].trim();return a.length>200&&(a=a.slice(0,200)+"..."),{code:`HTTP_${i}`,message:a}}if(s.includes("ECONNREFUSED"))return {code:"NETWORK_ERROR",message:"Connection refused",detail:"Unable to connect to the API server. Please check your network connection."};if(s.includes("ETIMEDOUT")||s.includes("timeout"))return {code:"TIMEOUT",message:"Connection timeout",detail:"The request took too long to complete. Please try again."};if(s.includes("ENOTFOUND"))return {code:"DNS_ERROR",message:"Server not found",detail:"Could not resolve the API server address. Please check your API base URL."};if(/context.*window.*exceeded/i.test(s)||/maximum.*context.*length/i.test(s))return {code:"CONTEXT_EXCEEDED",message:"Context window exceeded",detail:"The conversation is too long. Please start a new session or use /compact."};if(/rate.*limit/i.test(s)||s.includes("429"))return {code:"RATE_LIMIT",message:"Rate limit exceeded",detail:"Too many requests. Please wait a moment before trying again."};if(s.includes("401")||/unauthorized/i.test(s))return {code:"AUTH_ERROR",message:"Authentication failed",detail:"Please check your API key in settings."};if(s.includes("403")||/forbidden/i.test(s))return {code:"FORBIDDEN",message:"Access denied",detail:"Your API key does not have permission for this operation."};let o=s;return o=o.replace(/^Error:\s*/i,""),o=o.replace(/^Request failed with status code\s+\d+:\s*/i,""),o.length>300&&(o=o.slice(0,300)+"..."),{code:e?`HTTP_${e}`:"UNKNOWN",message:o}}var rm=R(()=>{});function wr(s){if(!s)return;if(typeof s!="string")return typeof s=="number"&&s>0?Math.ceil(s*1e3):void 0;let e=s.trim(),t=e.match(/^(\d+(?:\.\d+)?)\s*ms$/i);if(t){let o=parseFloat(t[1]);return o>0?Math.ceil(o):void 0}let n=parseFloat(e);if(!isNaN(n)&&n>0)return Math.ceil(n*1e3);let r=new Date(e);if(!isNaN(r.getTime())){let o=r.getTime()-Date.now();return o>0?Math.ceil(o):void 0}}function iP(s){switch(s){case 502:return 3e3;case 503:return 5e3;case 504:return 2e3;default:return 2e3}}function Xl(s){if(!s)return;let e=s["retry-after"]||s["Retry-After"];if(e){let o=wr(e);if(o)return o}let t=s["retry-after-ms"]||s["Retry-After-Ms"];if(t){let o=parseFloat(t);if(!isNaN(o)&&o>0)return Math.ceil(o)}let n=s["x-ratelimit-reset-requests"];if(n){let o=wr(n);if(o)return o}let r=s["anthropic-ratelimit-requests-reset"];if(r){let o=new Date(r);if(!isNaN(o.getTime())){let i=o.getTime()-Date.now();return i>0?Math.ceil(i):void 0}}}function sm(s){return typeof s=="object"&&s!==null&&"message"in s&&typeof s.message=="string"}function Cv(s){return [/context.*window.*exceeded/i,/context.*length.*exceeded/i,/maximum.*context.*length/i,/token.*limit.*exceeded/i,/input.*too.*long/i].some(t=>t.test(s))}function aP(s){return [/quota.*exceeded/i,/usage.*limit/i,/rate.*limit/i,/insufficient.*quota/i,/billing/i].some(t=>t.test(s))}function lP(s){if(s){if(typeof s=="string")return s;if(typeof s=="object"){if(typeof s.error=="string")return s.error;if(s.error?.message)return s.error.message;if(s.message)return s.message}}}function An(s){if(s instanceof
|
|
40
|
-
`+d.detail);}let u=a||iP(i);return new
|
|
41
|
-
`+u.detail);}return new Ye({category:"retryable_http",code:`HTTP_${i}`,message:c,retryable:true,retryAfter:a,context:{httpStatus:i,requestId:l,rawMessage:o},originalError:t})}if(i===401)return new Ye({category:"fatal_auth",code:"UNAUTHORIZED",message:o||"Authentication failed. Please check your API key.",retryable:false,context:{httpStatus:i,requestId:l},originalError:t});if(i===403)return new Ye({category:"fatal_auth",code:"FORBIDDEN",message:o||"Access denied. Please check your API permissions.",retryable:false,context:{httpStatus:i,requestId:l},originalError:t});if(i===400)return Cv(e)?new Ye({category:"fatal_context",code:"CONTEXT_WINDOW_EXCEEDED",message:"Context window exceeded. Please start a new conversation or clear history.",retryable:false,context:{httpStatus:i,requestId:l},originalError:t}):o.includes("Upstream request failed")||o.includes("upstream")||o.includes("gateway")?new Ye({category:"retryable_http",code:"PROXY_UPSTREAM_FAILED",message:o||"Proxy upstream request failed",retryable:true,context:{httpStatus:i,requestId:l},originalError:t}):new Ye({category:"fatal_invalid",code:"INVALID_REQUEST",message:o,retryable:false,context:{httpStatus:i,requestId:l},originalError:t});if(i>=400&&i<500)return new Ye({category:"fatal_invalid",code:`HTTP_${i}`,message:o,retryable:false,context:{httpStatus:i,requestId:l},originalError:t})}if(sm(s)){let i=s.code,a=s.name;if(i==="ERR_CANCELED"||a==="CanceledError"||a==="AbortError")return new Ye({category:"canceled",code:"CANCELED",message:"Request was canceled",retryable:false,originalError:t});if(i==="ECONNREFUSED"||i==="ENOTFOUND"||i==="ECONNRESET")return new Ye({category:"retryable_network",code:i,message:`Network error: ${e}`,retryable:true,originalError:t});if(i==="ETIMEDOUT"||i==="ESOCKETTIMEDOUT")return new Ye({category:"retryable_network",code:"TIMEOUT",message:`Connection timeout: ${e}`,retryable:true,originalError:t})}return s instanceof Error&&s.name==="AbortError"?new Ye({category:"canceled",code:"CANCELED",message:"Request was canceled",retryable:false,originalError:s}):sm(s)&&s.code==="STREAM_INCOMPLETE"?new Ye({category:"retryable_stream",code:"STREAM_INCOMPLETE",message:`\u7F51\u7EDC\u4E2D\u65AD: ${e}`,retryable:true,context:{toolName:s.toolName,rawMessage:e},originalError:t}):s?.code==="STREAM_TIMEOUT"?new Ye({category:"retryable_stream",code:"STREAM_TIMEOUT",message:`API \u4EE3\u7406\u54CD\u5E94\u8D85\u65F6: ${e}`,retryable:true,context:{rawMessage:e},originalError:t}):e.includes("stream")||e.includes("Stream")||e.includes("SSE")||e.includes("disconnected")||e.includes("incomplete")||e.includes("message_stop")?new Ye({category:"retryable_stream",code:"STREAM_ERROR",message:`\u7F51\u7EDC\u4E2D\u65AD: ${e}`,retryable:true,originalError:t}):Cv(e)?new Ye({category:"fatal_context",code:"CONTEXT_WINDOW_EXCEEDED",message:"Context window exceeded. Please start a new conversation or clear history.",retryable:false,originalError:t}):aP(e)?new Ye({category:"fatal_limit",code:"QUOTA_EXCEEDED",message:e,retryable:false,originalError:t}):new Ye({category:"internal",code:"UNKNOWN",message:e,retryable:false,originalError:t})}function wv(s,e,t){let n=e||"";return n.trim().endsWith("}")?(s==="write_file"||s==="edit_file")&&!n.includes('"content"')?new Ye({category:"tool_truncated",code:"TOOL_MISSING_CONTENT",message:"The content field is missing (likely truncated)",retryable:false,context:{toolName:s,receivedLength:n.length,rawMessage:t.message},originalError:t}):t.message.includes("JSON")||t.message.includes("Unexpected")||t.message.includes("parse")?new Ye({category:"tool_json_invalid",code:"JSON_PARSE_ERROR",message:`Invalid JSON in tool arguments: ${t.message}`,retryable:true,context:{toolName:s,receivedLength:n.length,rawMessage:t.message},originalError:t}):new Ye({category:"tool_json_invalid",code:"TOOL_ERROR",message:t.message,retryable:true,context:{toolName:s},originalError:t}):new Ye({category:"tool_truncated",code:"TOOL_ARGS_TRUNCATED",message:"Tool arguments were truncated during streaming",retryable:false,context:{toolName:s,receivedLength:n.length,rawMessage:t.message},originalError:t})}function Ql(s){switch(s.category){case "retryable_rate_limit":return `API \u4EE3\u7406\u901F\u7387\u9650\u5236\uFF0C${s.retryAfter?Math.ceil(s.retryAfter/1e3):3} \u79D2\u540E\u81EA\u52A8\u91CD\u8BD5...`;case "retryable_http":return "The request will be automatically retried.";case "retryable_stream":return "\u7F51\u7EDC\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u8FDE...";case "retryable_network":return "\u7F51\u7EDC\u8FDE\u63A5\u5F02\u5E38\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u8BD5...";case "fatal_auth":return "Please check your API key and ensure it has the necessary permissions.";case "fatal_limit":return "You have reached your usage limit. Please check your billing settings or wait for the limit to reset.";case "fatal_context":return "The conversation is too long. Please start a new conversation or use /compact to summarize history.";case "fatal_invalid":return "Please check your request parameters and try again.";case "tool_truncated":return "The tool call was truncated. Please use edit_file with smaller, targeted changes instead of rewriting entire files.";case "tool_json_invalid":return "The tool arguments were invalid. The LLM will retry with corrected parameters.";case "tool_timeout":return "The tool execution timed out. Please try again with a smaller operation.";case "tool_denied":return "The tool call was denied. You can manually approve or adjust permissions.";default:return "An unexpected error occurred. Please try again."}}var Ye,Qn=R(()=>{rm();Ye=class s extends Error{category;code;retryable;retryAfter;context;originalError;constructor(e){super(e.message),this.name="NeoxError",this.category=e.category,this.code=e.code,this.retryable=e.retryable,this.retryAfter=e.retryAfter,this.context=e.context,this.originalError=e.originalError,Error.captureStackTrace&&Error.captureStackTrace(this,s);}withContext(e){return new s({...this,context:{...this.context,...e}})}toJSON(){return {name:this.name,category:this.category,code:this.code,message:this.message,retryable:this.retryable,retryAfter:this.retryAfter,context:this.context,stack:this.stack}}};});function Yr(s,e){return {...Tr,...s,...e?.requestMaxRetries!==void 0&&{requestMaxRetries:e.requestMaxRetries},...e?.streamMaxRetries!==void 0&&{streamMaxRetries:e.streamMaxRetries},...e?.streamIdleTimeoutMs!==void 0&&{streamIdleTimeoutMs:e.streamIdleTimeoutMs}}}function wo(s,e){let t=s.toLowerCase();if(t.includes("yunwu"))return Vr.yunwu;if(t.includes("azure"))return Vr.azure;if(e){let n=e.toLowerCase();if(n.includes("yunwu"))return Vr.yunwu;if(n.includes("azure"))return Vr.azure;if(!(n.includes("api.anthropic.com")||n.includes("api.openai.com")))return Vr.proxy}return t.includes("anthropic")?Vr.anthropic:t.includes("gemini")?Vr.gemini:Vr.openai}var Tr,Vr,xr=R(()=>{Tr={requestMaxRetries:10,streamMaxRetries:5,toolMaxRetries:2,initialDelayMs:1e3,backoffFactor:2,maxDelayMs:3e4,jitterRange:.2,streamIdleTimeoutMs:3e5};Vr={openai:{requestMaxRetries:4,streamMaxRetries:5,streamIdleTimeoutMs:3e5},anthropic:{requestMaxRetries:4,streamMaxRetries:5,streamIdleTimeoutMs:3e5},yunwu:{requestMaxRetries:3,streamMaxRetries:10,streamIdleTimeoutMs:9e4},azure:{requestMaxRetries:4,streamMaxRetries:5,streamIdleTimeoutMs:6e5},proxy:{requestMaxRetries:10,streamMaxRetries:10,streamIdleTimeoutMs:18e4},gemini:{requestMaxRetries:4,streamMaxRetries:5,streamIdleTimeoutMs:3e5}};});var Tv=R(()=>{});var xv,Sv,kv,_v=R(()=>{nm();_s();Qn();xr();Tv();xv=100,Sv=200,kv=0;});var ji,To,xo,Pn,om=R(()=>{ji=class extends Error{constructor(e){super(e),this.name="GuardrailTripwireTriggered";}},To=class extends ji{guardrail_result;constructor(e){let t=`Input guardrail "${e.guardrail.name}" triggered: ${e.output.output_info?.reason||"Safety check failed"}`;super(t),this.name="InputGuardrailTripwireTriggered",this.guardrail_result=e;}getDetails(){return {guardrail_name:this.guardrail_result.guardrail.name,execution_time_ms:this.guardrail_result.execution_time_ms,output_info:this.guardrail_result.output.output_info}}},xo=class extends ji{guardrail_result;blocked_output;constructor(e){let t=`Output guardrail "${e.guardrail.name}" triggered: ${e.output.output_info?.reason||"Output safety check failed"}`;super(t),this.name="OutputGuardrailTripwireTriggered",this.guardrail_result=e,this.blocked_output=e.agent_output;}getDetails(){return {guardrail_name:this.guardrail_result.guardrail.name,execution_time_ms:this.guardrail_result.execution_time_ms,output_info:this.guardrail_result.output.output_info,blocked_output:this.blocked_output}}},Pn=class extends ji{guardrail_result;constructor(e){let t=`Tool guardrail "${e.guardrail.name}" triggered: ${e.output.output_info?.reason||"Tool safety check failed"}`;super(t),this.name="ToolGuardrailTripwireTriggered",this.guardrail_result=e;}getDetails(){return {guardrail_name:this.guardrail_result.guardrail.name,execution_time_ms:this.guardrail_result.execution_time_ms,output_info:this.guardrail_result.output.output_info,behavior:this.guardrail_result.output.behavior}}};});var Es,Iv=R(()=>{om();Es=class{static async runInputGuardrails(e,t,n,r){if(e.length===0)return [];let o=e.map(async i=>{let a=Date.now();try{let l=await i.guardrail_function(t,n,r),c={guardrail:i,output:l,execution_time_ms:Date.now()-a};if(l.tripwire_triggered)throw new To(c);return c}catch(l){if(l instanceof To)throw l;let c={guardrail:i,output:{tripwire_triggered:true,output_info:{error:l instanceof Error?l.message:String(l),reason:"Guardrail execution failed"}},execution_time_ms:Date.now()-a};throw new To(c)}});return await Promise.all(o)}static async runOutputGuardrails(e,t,n,r){if(e.length===0)return [];let o=e.map(async i=>{let a=Date.now();try{let l=await i.guardrail_function(t,n,r),c={guardrail:i,agent_output:r,output:l,execution_time_ms:Date.now()-a};if(l.tripwire_triggered)throw new xo(c);return c}catch(l){if(l instanceof xo)throw l;let c={guardrail:i,agent_output:r,output:{tripwire_triggered:true,output_info:{error:l instanceof Error?l.message:String(l),reason:"Guardrail execution failed"}},execution_time_ms:Date.now()-a};throw new xo(c)}});return await Promise.all(o)}static async runToolInputGuardrails(e,t){let n=[];for(let r of e){let o=Date.now();try{let i=await r.guardrail_function(t),a={guardrail:r,output:i,execution_time_ms:Date.now()-o};if(n.push(a),i.behavior.type==="raise_exception")throw new Pn(a);if(i.behavior.type==="reject_content")return {results:n,should_execute:!1,rejection_message:i.behavior.message}}catch(i){if(i instanceof Pn)throw i;let a={guardrail:r,output:{output_info:{error:i instanceof Error?i.message:String(i)},behavior:{type:"raise_exception"}},execution_time_ms:Date.now()-o};throw new Pn(a)}}return {results:n,should_execute:true}}static async runToolOutputGuardrails(e,t){let n=[];for(let r of e){let o=Date.now();try{let i=await r.guardrail_function(t),a={guardrail:r,output:i,execution_time_ms:Date.now()-o};if(n.push(a),i.behavior.type==="raise_exception")throw new Pn(a);if(i.behavior.type==="reject_content")return {results:n,should_use_output:!1,replacement_message:i.behavior.message}}catch(i){if(i instanceof Pn)throw i;let a={guardrail:r,output:{output_info:{error:i instanceof Error?i.message:String(i)},behavior:{type:"raise_exception"}},execution_time_ms:Date.now()-o};throw new Pn(a)}}return {results:n,should_use_output:true}}};});function Gi(){if(!Av&&(Av=true,typeof process<"u"&&process.env&&!process.env.NEOX_UI_MODE))try{Promise.resolve().then(()=>(ne(),gb)).then(s=>{Ev=s.cliLogger;}).catch(()=>{});}catch{}return Ev}function Mv(){return {writtenFiles:new Map,editedFiles:new Map,editDetails:new Map,fileReadCache:new Map,toolCallHistory:[],createdAt:Date.now()}}function Rv(s){if(s){let e=Pv.get(s);return e?process.env.CLI_DEBUG==="1"&&Gi()?.debug("SESSION",`Retrieved EXISTING SessionState for context: ${Object.keys(s).join(",")}, history: ${e.toolCallHistory.length}`):(e=Mv(),Pv.set(s,e),process.env.CLI_DEBUG==="1"&&Gi()?.debug("SESSION",`Created NEW SessionState for context: ${Object.keys(s).join(",")}`)),e}return im||(im=Mv()),im}function am(s,e,t,n){let r=Rv(s);if(process.env.CLI_DEBUG==="1"){let o=Gi();o?.debug("SESSION","recordToolCall called:"),o?.debug("SESSION",` - tool: ${e}`),o?.debug("SESSION",` - success: ${n}`),o?.debug("SESSION",` - context exists: ${!!s}`),o?.debug("SESSION",` - context identity: ${s?Object.keys(s).join(","):"none"}`),o?.debug("SESSION",` - history length before: ${r.toolCallHistory.length}`);}r.toolCallHistory.push({name:e,args:t,timestamp:Date.now(),success:n}),process.env.CLI_DEBUG==="1"&&Gi()?.debug("SESSION",` - history length after: ${r.toolCallHistory.length}`),r.toolCallHistory.length>100&&r.toolCallHistory.shift();}function Dv(s,e=10){let t=Rv(s);if(process.env.CLI_DEBUG==="1"){let n=Gi();n?.debug("SESSION","getRecentToolCalls called:"),n?.debug("SESSION",` - context exists: ${!!s}`),n?.debug("SESSION",` - context identity: ${s?Object.keys(s).join(","):"none"}`),n?.debug("SESSION",` - total history length: ${t.toolCallHistory.length}`),n?.debug("SESSION",` - limit: ${e}`),n?.debug("SESSION",` - returning ${Math.min(t.toolCallHistory.length,e)} calls`);}return t.toolCallHistory.slice(-e)}var Ev,Av,Pv,im,lm=R(()=>{Ev=null,Av=false;Pv=new WeakMap,im=null;});var pP,um,dm,je,Wi=R(()=>{pP=fileURLToPath(import.meta.url),um=dirname(pP),dm=class{logDir;enabled;consoleEnabled;constructor(){this.logDir=this.getLogDirectory(),this.enabled=process.env.MARKOR_TRACING==="1",this.consoleEnabled=process.env.CLI_DEBUG_CONSOLE==="1";try{this.initLogDir(),this.consoleEnabled&&console.log("[Logger] Initialized at:",this.logDir);}catch(e){console.error("[Logger] Failed to initialize:",e.message),this.enabled=false;}}setEnabled(e){this.enabled=e;}getLogDirectory(){if(um.includes(".asar")||um.includes("app.asar")){try{if(typeof process<"u"&&process.type==="browser"){let e=process.env.ELECTRON_USER_DATA;if(e)return Ie__default.join(e,"logs")}}catch{}return Ie__default.join(ho__default.tmpdir(),"neox-logs")}return Ie__default.join(um,"../../logs")}initLogDir(){try{wt__default.existsSync(this.logDir)||wt__default.mkdirSync(this.logDir,{recursive:!0});}catch(e){let t=e;t.code==="EACCES"||t.code==="EPERM"?this.enabled=false:(console.warn(`[Logger] Warning: Cannot create log directory: ${t.message}`),this.enabled=false);}}getLogFile(e){let t=new Date().toISOString().split("T")[0];return Ie__default.join(this.logDir,`${e}-${t}.log`)}write(e,t){if(!this.enabled)return;let n=new Date().toISOString(),r=typeof t=="string"?{message:t}:t||{},o=this.safeStringify({timestamp:n,...r})+`
|
|
39
|
+
`;if(execSync(`powershell.exe -NoProfile -Command "${n.replace(/"/g,'\\"')}"`,{encoding:"utf-8",timeout:5e3}).includes("OK")&&wt.existsSync(e)){let o=wt.statSync(e);if(o.size>0)return m.info("CLIPBOARD",`\u2713 WSL: Saved clipboard image (${Math.round(o.size/1024)}KB)`),e}}catch(n){m.debug("CLIPBOARD","WSL: Failed to save clipboard image",{error:n});}return null}async function av(){return ov()?iv():null}function wA(s){try{let e=wt.readFileSync(s),t=Ie.extname(s).toLowerCase(),n="image/png";t===".jpg"||t===".jpeg"?n="image/jpeg":t===".gif"?n="image/gif":t===".webp"?n="image/webp":t===".bmp"&&(n="image/bmp");let r=e.toString("base64");return `data:${n};base64,${r}`}catch(e){return m.error("CLIPBOARD","Failed to convert image to base64",{error:e,imagePath:s}),null}}function Vp(s){try{let e=wt.readFileSync(s),t=Ie.extname(s).toLowerCase(),n="image/png";t===".jpg"||t===".jpeg"?n="image/jpeg":t===".gif"?n="image/gif":t===".webp"?n="image/webp":t===".bmp"&&(n="image/bmp");let r=e.toString("base64");return {mediaType:n,data:r}}catch(e){return m.error("CLIPBOARD","Failed to convert image to base64",{error:e,imagePath:s}),null}}async function Yp(){let s=pA();if(s){m.info("CLIPBOARD",`\u{1F4CE} Using image file from clipboard: ${s}`);let r=Vp(s);if(r)return {...r,name:Ie.basename(s)}}let e=await av();if(!e)return null;let t=Vp(e);if(!t)return null;let n=Ie.basename(e);try{wt.unlinkSync(e);}catch{}return {...t,name:n}}var Kp,sv,Xp=R(()=>{ne();qr();Kp=null,sv=false;});function Yl(s){return {output_info:s,behavior:{type:"allow"}}}function vv(s,e){return {output_info:e,behavior:{type:"reject_content",message:s}}}var nm=R(()=>{});function Co(){let s=new Date,e=s.toISOString().slice(0,10).replace(/-/g,""),t=s.toISOString().slice(11,19).replace(/:/g,""),n=Math.random().toString(36).slice(2,6);return `session_${e}_${t}_${n}`}var _s=R(()=>{});function nP(s){let e=s.match(/Error\s+(?:code\s+)?(\d{3})/i);if(e)return e[1];let t=s.match(/(\d{3}):\s*([^<\n]+)/);return t?t[1]:null}function rP(s){let e=s.match(/<title>[^|]*\|\s*\d{3}:\s*([^<]+)<\/title>/i);if(e)return e[1].trim();let t=s.match(/<h1[^>]*>(?:<[^>]+>)*([^<]+?(?:\s+\d{3})?)<\/(?:[^>]+>)*<\/h1>/i);if(t)return t[1].replace(/Error code\s+\d{3}/i,"").trim();let n=s.match(/Error\s+code\s+(\d{3})/i);if(n){let o=n[1];return {502:"Bad gateway",503:"Service unavailable",504:"Gateway timeout",520:"Unknown error",521:"Web server is down",522:"Connection timed out",523:"Origin is unreachable",524:"A timeout occurred"}[o]||"Server error"}let r=s.match(/<span[^>]*class="inline-block"[^>]*>([^<]+)<\/span>/i);return r?r[1].trim():null}function sP(s){let e=s.match(/truncate[^>]*>([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})<\/span>/);if(e)return e[1];let t=s.match(/<title>([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/);return t?t[1]:null}function Ui(s){return s.trim().startsWith("<!DOCTYPE html")||s.trim().startsWith("<html")||/<html[^>]*>/i.test(s)}function oP(s){let e=s.match(/^data:\s*(\{.*\})/m);return e?e[1]:null}function Is(s,e){let t=oP(s);if(t)try{let i=JSON.parse(t);if(i.error){let a=i.error,l=a.type||a.code||(e?`HTTP_${e}`:"API_ERROR"),c=a.message||"API error",u;if(a.type==="usage_limit_reached"){let d=a.resets_at?new Date(a.resets_at*1e3).toLocaleString():void 0,p=a.resets_in_seconds;if(p){let g=Math.floor(p/3600),h=Math.floor(p%3600/60);u=`Usage limit reached (${a.plan_type||"unknown"} plan). Resets in ${g}h ${h}m.`;}else d&&(u=`Usage limit reached (${a.plan_type||"unknown"} plan). Resets at ${d}.`);}return {code:l,message:c,detail:u}}}catch{}if(s.trim().startsWith("{"))try{let i=JSON.parse(s);if(i.error){let a=i.error;return {code:a.type||a.code||(e?`HTTP_${e}`:"API_ERROR"),message:a.message||"API error"}}}catch{}if(Ui(s)){let i=nP(s)||String(e||"UNKNOWN"),a=rP(s)||"Server error",l=sP(s),c;return l&&(l.includes("cloudflare")?c=`The server (${l}) is protected by Cloudflare but is not responding.`:c=`The API server (${l}) is not responding. This may be a temporary issue with your API provider.`),{code:`HTTP_${i}`,message:a,detail:c}}let n=s.match(/OpenAI.*error:\s*(\d+)\s*-\s*(.*)/i);if(n){let i=n[1],a=n[2];if(Ui(a)){let l=Is(a,parseInt(i,10));return {code:l.code,message:l.message,detail:l.detail}}return a=a.trim(),a.length>200&&(a=a.slice(0,200)+"..."),{code:`HTTP_${i}`,message:a}}let r=s.match(/Anthropic.*error:\s*(\d+)\s*-\s*(.*)/i);if(r){let i=r[1],a=r[2].trim();return a.length>200&&(a=a.slice(0,200)+"..."),{code:`HTTP_${i}`,message:a}}if(s.includes("ECONNREFUSED"))return {code:"NETWORK_ERROR",message:"Connection refused",detail:"Unable to connect to the API server. Please check your network connection."};if(s.includes("ETIMEDOUT")||s.includes("timeout"))return {code:"TIMEOUT",message:"Connection timeout",detail:"The request took too long to complete. Please try again."};if(s.includes("ENOTFOUND"))return {code:"DNS_ERROR",message:"Server not found",detail:"Could not resolve the API server address. Please check your API base URL."};if(/context.*window.*exceeded/i.test(s)||/maximum.*context.*length/i.test(s))return {code:"CONTEXT_EXCEEDED",message:"Context window exceeded",detail:"The conversation is too long. Please start a new session or use /compact."};if(/rate.*limit/i.test(s)||s.includes("429"))return {code:"RATE_LIMIT",message:"Rate limit exceeded",detail:"Too many requests. Please wait a moment before trying again."};if(s.includes("401")||/unauthorized/i.test(s))return {code:"AUTH_ERROR",message:"Authentication failed",detail:"Please check your API key in settings."};if(s.includes("403")||/forbidden/i.test(s))return {code:"FORBIDDEN",message:"Access denied",detail:"Your API key does not have permission for this operation."};let o=s;return o=o.replace(/^Error:\s*/i,""),o=o.replace(/^Request failed with status code\s+\d+:\s*/i,""),o.length>300&&(o=o.slice(0,300)+"..."),{code:e?`HTTP_${e}`:"UNKNOWN",message:o}}var rm=R(()=>{});function wr(s){if(!s)return;if(typeof s!="string")return typeof s=="number"&&s>0?Math.ceil(s*1e3):void 0;let e=s.trim(),t=e.match(/^(\d+(?:\.\d+)?)\s*ms$/i);if(t){let o=parseFloat(t[1]);return o>0?Math.ceil(o):void 0}let n=parseFloat(e);if(!isNaN(n)&&n>0)return Math.ceil(n*1e3);let r=new Date(e);if(!isNaN(r.getTime())){let o=r.getTime()-Date.now();return o>0?Math.ceil(o):void 0}}function iP(s){switch(s){case 502:return 3e3;case 503:return 5e3;case 504:return 2e3;default:return 2e3}}function Xl(s){if(!s)return;let e=s["retry-after"]||s["Retry-After"];if(e){let o=wr(e);if(o)return o}let t=s["retry-after-ms"]||s["Retry-After-Ms"];if(t){let o=parseFloat(t);if(!isNaN(o)&&o>0)return Math.ceil(o)}let n=s["x-ratelimit-reset-requests"];if(n){let o=wr(n);if(o)return o}let r=s["anthropic-ratelimit-requests-reset"];if(r){let o=new Date(r);if(!isNaN(o.getTime())){let i=o.getTime()-Date.now();return i>0?Math.ceil(i):void 0}}}function sm(s){return typeof s=="object"&&s!==null&&"message"in s&&typeof s.message=="string"}function Cv(s){return [/context.*window.*exceeded/i,/context.*length.*exceeded/i,/maximum.*context.*length/i,/token.*limit.*exceeded/i,/input.*too.*long/i].some(t=>t.test(s))}function aP(s){return [/quota.*exceeded/i,/usage.*limit/i,/rate.*limit/i,/insufficient.*quota/i,/billing/i].some(t=>t.test(s))}function lP(s){if(s){if(typeof s=="string")return s;if(typeof s=="object"){if(typeof s.error=="string")return s.error;if(s.error?.message)return s.error.message;if(s.message)return s.message}}}function An(s){if(s instanceof Xe)return s;let e=s instanceof Error?s.message:String(s),t=s instanceof Error?s:void 0,n=sm(s)?s:void 0,o=(n?lP(n.response?.data):void 0)||e;if(n?.response?.status){let i=n.response.status,a=Xl(n.response.headers),l=n.response.headers?.["x-request-id"]||n.response.headers?.["cf-ray"];if(i===429){let c=n.response.data,u=c?.error?.type;return u==="usage_limit_reached"||u==="usage_not_included"?new Xe({category:"fatal_limit",code:"USAGE_LIMIT_REACHED",message:c?.error?.message||"Usage limit reached",retryable:false,context:{httpStatus:i,requestId:l},originalError:t}):new Xe({category:"retryable_http",code:`HTTP_${i}`,message:o,retryable:true,retryAfter:a,context:{httpStatus:i,requestId:l},originalError:t})}if(i===502||i===503||i===504){let c=o;if(Ui(o)){let d=Is(o,i);c=d.message,d.detail&&(c+=`
|
|
40
|
+
`+d.detail);}let u=a||iP(i);return new Xe({category:"retryable_rate_limit",code:`PROXY_${i}`,message:c||`API \u4EE3\u7406\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528 (${i})`,retryable:true,retryAfter:u,context:{httpStatus:i,requestId:l,rawMessage:o},originalError:t})}if(i>=500){let c=o;if(Ui(o)){let u=Is(o,i);c=u.message,u.detail&&(c+=`
|
|
41
|
+
`+u.detail);}return new Xe({category:"retryable_http",code:`HTTP_${i}`,message:c,retryable:true,retryAfter:a,context:{httpStatus:i,requestId:l,rawMessage:o},originalError:t})}if(i===401)return new Xe({category:"fatal_auth",code:"UNAUTHORIZED",message:o||"Authentication failed. Please check your API key.",retryable:false,context:{httpStatus:i,requestId:l},originalError:t});if(i===403)return new Xe({category:"fatal_auth",code:"FORBIDDEN",message:o||"Access denied. Please check your API permissions.",retryable:false,context:{httpStatus:i,requestId:l},originalError:t});if(i===400)return Cv(e)?new Xe({category:"fatal_context",code:"CONTEXT_WINDOW_EXCEEDED",message:"Context window exceeded. Please start a new conversation or clear history.",retryable:false,context:{httpStatus:i,requestId:l},originalError:t}):o.includes("Upstream request failed")||o.includes("upstream")||o.includes("gateway")?new Xe({category:"retryable_http",code:"PROXY_UPSTREAM_FAILED",message:o||"Proxy upstream request failed",retryable:true,context:{httpStatus:i,requestId:l},originalError:t}):new Xe({category:"fatal_invalid",code:"INVALID_REQUEST",message:o,retryable:false,context:{httpStatus:i,requestId:l},originalError:t});if(i>=400&&i<500)return new Xe({category:"fatal_invalid",code:`HTTP_${i}`,message:o,retryable:false,context:{httpStatus:i,requestId:l},originalError:t})}if(sm(s)){let i=s.code,a=s.name;if(i==="ERR_CANCELED"||a==="CanceledError"||a==="AbortError")return new Xe({category:"canceled",code:"CANCELED",message:"Request was canceled",retryable:false,originalError:t});if(i==="ECONNREFUSED"||i==="ENOTFOUND"||i==="ECONNRESET")return new Xe({category:"retryable_network",code:i,message:`Network error: ${e}`,retryable:true,originalError:t});if(i==="ETIMEDOUT"||i==="ESOCKETTIMEDOUT")return new Xe({category:"retryable_network",code:"TIMEOUT",message:`Connection timeout: ${e}`,retryable:true,originalError:t})}return s instanceof Error&&s.name==="AbortError"?new Xe({category:"canceled",code:"CANCELED",message:"Request was canceled",retryable:false,originalError:s}):sm(s)&&s.code==="STREAM_INCOMPLETE"?new Xe({category:"retryable_stream",code:"STREAM_INCOMPLETE",message:`\u7F51\u7EDC\u4E2D\u65AD: ${e}`,retryable:true,context:{toolName:s.toolName,rawMessage:e},originalError:t}):s?.code==="STREAM_TIMEOUT"?new Xe({category:"retryable_stream",code:"STREAM_TIMEOUT",message:`API \u4EE3\u7406\u54CD\u5E94\u8D85\u65F6: ${e}`,retryable:true,context:{rawMessage:e},originalError:t}):e.includes("stream")||e.includes("Stream")||e.includes("SSE")||e.includes("disconnected")||e.includes("incomplete")||e.includes("message_stop")?new Xe({category:"retryable_stream",code:"STREAM_ERROR",message:`\u7F51\u7EDC\u4E2D\u65AD: ${e}`,retryable:true,originalError:t}):Cv(e)?new Xe({category:"fatal_context",code:"CONTEXT_WINDOW_EXCEEDED",message:"Context window exceeded. Please start a new conversation or clear history.",retryable:false,originalError:t}):aP(e)?new Xe({category:"fatal_limit",code:"QUOTA_EXCEEDED",message:e,retryable:false,originalError:t}):new Xe({category:"internal",code:"UNKNOWN",message:e,retryable:false,originalError:t})}function wv(s,e,t){let n=e||"";return n.trim().endsWith("}")?(s==="write_file"||s==="edit_file")&&!n.includes('"content"')?new Xe({category:"tool_truncated",code:"TOOL_MISSING_CONTENT",message:"The content field is missing (likely truncated)",retryable:false,context:{toolName:s,receivedLength:n.length,rawMessage:t.message},originalError:t}):t.message.includes("JSON")||t.message.includes("Unexpected")||t.message.includes("parse")?new Xe({category:"tool_json_invalid",code:"JSON_PARSE_ERROR",message:`Invalid JSON in tool arguments: ${t.message}`,retryable:true,context:{toolName:s,receivedLength:n.length,rawMessage:t.message},originalError:t}):new Xe({category:"tool_json_invalid",code:"TOOL_ERROR",message:t.message,retryable:true,context:{toolName:s},originalError:t}):new Xe({category:"tool_truncated",code:"TOOL_ARGS_TRUNCATED",message:"Tool arguments were truncated during streaming",retryable:false,context:{toolName:s,receivedLength:n.length,rawMessage:t.message},originalError:t})}function Ql(s){switch(s.category){case "retryable_rate_limit":return `API \u4EE3\u7406\u901F\u7387\u9650\u5236\uFF0C${s.retryAfter?Math.ceil(s.retryAfter/1e3):3} \u79D2\u540E\u81EA\u52A8\u91CD\u8BD5...`;case "retryable_http":return "The request will be automatically retried.";case "retryable_stream":return "\u7F51\u7EDC\u8FDE\u63A5\u4E2D\u65AD\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u8FDE...";case "retryable_network":return "\u7F51\u7EDC\u8FDE\u63A5\u5F02\u5E38\uFF0C\u6B63\u5728\u81EA\u52A8\u91CD\u8BD5...";case "fatal_auth":return "Please check your API key and ensure it has the necessary permissions.";case "fatal_limit":return "You have reached your usage limit. Please check your billing settings or wait for the limit to reset.";case "fatal_context":return "The conversation is too long. Please start a new conversation or use /compact to summarize history.";case "fatal_invalid":return "Please check your request parameters and try again.";case "tool_truncated":return "The tool call was truncated. Please use edit_file with smaller, targeted changes instead of rewriting entire files.";case "tool_json_invalid":return "The tool arguments were invalid. The LLM will retry with corrected parameters.";case "tool_timeout":return "The tool execution timed out. Please try again with a smaller operation.";case "tool_denied":return "The tool call was denied. You can manually approve or adjust permissions.";default:return "An unexpected error occurred. Please try again."}}var Xe,Qn=R(()=>{rm();Xe=class s extends Error{category;code;retryable;retryAfter;context;originalError;constructor(e){super(e.message),this.name="NeoxError",this.category=e.category,this.code=e.code,this.retryable=e.retryable,this.retryAfter=e.retryAfter,this.context=e.context,this.originalError=e.originalError,Error.captureStackTrace&&Error.captureStackTrace(this,s);}withContext(e){return new s({...this,context:{...this.context,...e}})}toJSON(){return {name:this.name,category:this.category,code:this.code,message:this.message,retryable:this.retryable,retryAfter:this.retryAfter,context:this.context,stack:this.stack}}};});function Yr(s,e){return {...Tr,...s,...e?.requestMaxRetries!==void 0&&{requestMaxRetries:e.requestMaxRetries},...e?.streamMaxRetries!==void 0&&{streamMaxRetries:e.streamMaxRetries},...e?.streamIdleTimeoutMs!==void 0&&{streamIdleTimeoutMs:e.streamIdleTimeoutMs}}}function wo(s,e){let t=s.toLowerCase();if(t.includes("yunwu"))return Vr.yunwu;if(t.includes("azure"))return Vr.azure;if(e){let n=e.toLowerCase();if(n.includes("yunwu"))return Vr.yunwu;if(n.includes("azure"))return Vr.azure;if(!(n.includes("api.anthropic.com")||n.includes("api.openai.com")))return Vr.proxy}return t.includes("anthropic")?Vr.anthropic:t.includes("gemini")?Vr.gemini:Vr.openai}var Tr,Vr,xr=R(()=>{Tr={requestMaxRetries:10,streamMaxRetries:5,toolMaxRetries:2,initialDelayMs:1e3,backoffFactor:2,maxDelayMs:3e4,jitterRange:.2,streamIdleTimeoutMs:3e5};Vr={openai:{requestMaxRetries:4,streamMaxRetries:5,streamIdleTimeoutMs:3e5},anthropic:{requestMaxRetries:4,streamMaxRetries:5,streamIdleTimeoutMs:3e5},yunwu:{requestMaxRetries:3,streamMaxRetries:10,streamIdleTimeoutMs:9e4},azure:{requestMaxRetries:4,streamMaxRetries:5,streamIdleTimeoutMs:6e5},proxy:{requestMaxRetries:10,streamMaxRetries:10,streamIdleTimeoutMs:18e4},gemini:{requestMaxRetries:4,streamMaxRetries:5,streamIdleTimeoutMs:3e5}};});var Tv=R(()=>{});var xv,Sv,kv,_v=R(()=>{nm();_s();Qn();xr();Tv();xv=100,Sv=200,kv=0;});var ji,To,xo,Pn,om=R(()=>{ji=class extends Error{constructor(e){super(e),this.name="GuardrailTripwireTriggered";}},To=class extends ji{guardrail_result;constructor(e){let t=`Input guardrail "${e.guardrail.name}" triggered: ${e.output.output_info?.reason||"Safety check failed"}`;super(t),this.name="InputGuardrailTripwireTriggered",this.guardrail_result=e;}getDetails(){return {guardrail_name:this.guardrail_result.guardrail.name,execution_time_ms:this.guardrail_result.execution_time_ms,output_info:this.guardrail_result.output.output_info}}},xo=class extends ji{guardrail_result;blocked_output;constructor(e){let t=`Output guardrail "${e.guardrail.name}" triggered: ${e.output.output_info?.reason||"Output safety check failed"}`;super(t),this.name="OutputGuardrailTripwireTriggered",this.guardrail_result=e,this.blocked_output=e.agent_output;}getDetails(){return {guardrail_name:this.guardrail_result.guardrail.name,execution_time_ms:this.guardrail_result.execution_time_ms,output_info:this.guardrail_result.output.output_info,blocked_output:this.blocked_output}}},Pn=class extends ji{guardrail_result;constructor(e){let t=`Tool guardrail "${e.guardrail.name}" triggered: ${e.output.output_info?.reason||"Tool safety check failed"}`;super(t),this.name="ToolGuardrailTripwireTriggered",this.guardrail_result=e;}getDetails(){return {guardrail_name:this.guardrail_result.guardrail.name,execution_time_ms:this.guardrail_result.execution_time_ms,output_info:this.guardrail_result.output.output_info,behavior:this.guardrail_result.output.behavior}}};});var Es,Iv=R(()=>{om();Es=class{static async runInputGuardrails(e,t,n,r){if(e.length===0)return [];let o=e.map(async i=>{let a=Date.now();try{let l=await i.guardrail_function(t,n,r),c={guardrail:i,output:l,execution_time_ms:Date.now()-a};if(l.tripwire_triggered)throw new To(c);return c}catch(l){if(l instanceof To)throw l;let c={guardrail:i,output:{tripwire_triggered:true,output_info:{error:l instanceof Error?l.message:String(l),reason:"Guardrail execution failed"}},execution_time_ms:Date.now()-a};throw new To(c)}});return await Promise.all(o)}static async runOutputGuardrails(e,t,n,r){if(e.length===0)return [];let o=e.map(async i=>{let a=Date.now();try{let l=await i.guardrail_function(t,n,r),c={guardrail:i,agent_output:r,output:l,execution_time_ms:Date.now()-a};if(l.tripwire_triggered)throw new xo(c);return c}catch(l){if(l instanceof xo)throw l;let c={guardrail:i,agent_output:r,output:{tripwire_triggered:true,output_info:{error:l instanceof Error?l.message:String(l),reason:"Guardrail execution failed"}},execution_time_ms:Date.now()-a};throw new xo(c)}});return await Promise.all(o)}static async runToolInputGuardrails(e,t){let n=[];for(let r of e){let o=Date.now();try{let i=await r.guardrail_function(t),a={guardrail:r,output:i,execution_time_ms:Date.now()-o};if(n.push(a),i.behavior.type==="raise_exception")throw new Pn(a);if(i.behavior.type==="reject_content")return {results:n,should_execute:!1,rejection_message:i.behavior.message}}catch(i){if(i instanceof Pn)throw i;let a={guardrail:r,output:{output_info:{error:i instanceof Error?i.message:String(i)},behavior:{type:"raise_exception"}},execution_time_ms:Date.now()-o};throw new Pn(a)}}return {results:n,should_execute:true}}static async runToolOutputGuardrails(e,t){let n=[];for(let r of e){let o=Date.now();try{let i=await r.guardrail_function(t),a={guardrail:r,output:i,execution_time_ms:Date.now()-o};if(n.push(a),i.behavior.type==="raise_exception")throw new Pn(a);if(i.behavior.type==="reject_content")return {results:n,should_use_output:!1,replacement_message:i.behavior.message}}catch(i){if(i instanceof Pn)throw i;let a={guardrail:r,output:{output_info:{error:i instanceof Error?i.message:String(i)},behavior:{type:"raise_exception"}},execution_time_ms:Date.now()-o};throw new Pn(a)}}return {results:n,should_use_output:true}}};});function Gi(){if(!Av&&(Av=true,typeof process<"u"&&process.env&&!process.env.NEOX_UI_MODE))try{Promise.resolve().then(()=>(ne(),gb)).then(s=>{Ev=s.cliLogger;}).catch(()=>{});}catch{}return Ev}function Mv(){return {writtenFiles:new Map,editedFiles:new Map,editDetails:new Map,fileReadCache:new Map,toolCallHistory:[],createdAt:Date.now()}}function Rv(s){if(s){let e=Pv.get(s);return e?process.env.CLI_DEBUG==="1"&&Gi()?.debug("SESSION",`Retrieved EXISTING SessionState for context: ${Object.keys(s).join(",")}, history: ${e.toolCallHistory.length}`):(e=Mv(),Pv.set(s,e),process.env.CLI_DEBUG==="1"&&Gi()?.debug("SESSION",`Created NEW SessionState for context: ${Object.keys(s).join(",")}`)),e}return im||(im=Mv()),im}function am(s,e,t,n){let r=Rv(s);if(process.env.CLI_DEBUG==="1"){let o=Gi();o?.debug("SESSION","recordToolCall called:"),o?.debug("SESSION",` - tool: ${e}`),o?.debug("SESSION",` - success: ${n}`),o?.debug("SESSION",` - context exists: ${!!s}`),o?.debug("SESSION",` - context identity: ${s?Object.keys(s).join(","):"none"}`),o?.debug("SESSION",` - history length before: ${r.toolCallHistory.length}`);}r.toolCallHistory.push({name:e,args:t,timestamp:Date.now(),success:n}),process.env.CLI_DEBUG==="1"&&Gi()?.debug("SESSION",` - history length after: ${r.toolCallHistory.length}`),r.toolCallHistory.length>100&&r.toolCallHistory.shift();}function Dv(s,e=10){let t=Rv(s);if(process.env.CLI_DEBUG==="1"){let n=Gi();n?.debug("SESSION","getRecentToolCalls called:"),n?.debug("SESSION",` - context exists: ${!!s}`),n?.debug("SESSION",` - context identity: ${s?Object.keys(s).join(","):"none"}`),n?.debug("SESSION",` - total history length: ${t.toolCallHistory.length}`),n?.debug("SESSION",` - limit: ${e}`),n?.debug("SESSION",` - returning ${Math.min(t.toolCallHistory.length,e)} calls`);}return t.toolCallHistory.slice(-e)}var Ev,Av,Pv,im,lm=R(()=>{Ev=null,Av=false;Pv=new WeakMap,im=null;});var pP,um,dm,je,Wi=R(()=>{pP=fileURLToPath(import.meta.url),um=dirname(pP),dm=class{logDir;enabled;consoleEnabled;constructor(){this.logDir=this.getLogDirectory(),this.enabled=process.env.MARKOR_TRACING==="1",this.consoleEnabled=process.env.CLI_DEBUG_CONSOLE==="1";try{this.initLogDir(),this.consoleEnabled&&console.log("[Logger] Initialized at:",this.logDir);}catch(e){console.error("[Logger] Failed to initialize:",e.message),this.enabled=false;}}setEnabled(e){this.enabled=e;}getLogDirectory(){if(um.includes(".asar")||um.includes("app.asar")){try{if(typeof process<"u"&&process.type==="browser"){let e=process.env.ELECTRON_USER_DATA;if(e)return Ie__default.join(e,"logs")}}catch{}return Ie__default.join(ho__default.tmpdir(),"neox-logs")}return Ie__default.join(um,"../../logs")}initLogDir(){try{wt__default.existsSync(this.logDir)||wt__default.mkdirSync(this.logDir,{recursive:!0});}catch(e){let t=e;t.code==="EACCES"||t.code==="EPERM"?this.enabled=false:(console.warn(`[Logger] Warning: Cannot create log directory: ${t.message}`),this.enabled=false);}}getLogFile(e){let t=new Date().toISOString().split("T")[0];return Ie__default.join(this.logDir,`${e}-${t}.log`)}write(e,t){if(!this.enabled)return;let n=new Date().toISOString(),r=typeof t=="string"?{message:t}:t||{},o=this.safeStringify({timestamp:n,...r})+`
|
|
42
42
|
`;if(this.enabled)try{let i=this.getLogFile(e);wt__default.appendFileSync(i,o,"utf-8");}catch(i){(i.code==="EACCES"||i.code==="EPERM")&&(this.enabled=false);}}safeStringify(e){let t=new WeakSet;return JSON.stringify(e,(n,r)=>{if(typeof r=="object"&&r!==null){if(t.has(r))return "[Circular]";t.add(r);}return n==="parser"||n==="socket"||n==="_httpMessage"||n==="req"||n==="res"?"[Omitted]":r&&r.type==="Buffer"&&Array.isArray(r.data)?"[Buffer]":typeof r=="function"?"[Function]":r})}llmRequest(e,t,n,r,o){let i=n.tools?.map(a=>({name:a.name,description:a.description,parameters:a.parameters}));this.write("llm",{type:"REQUEST",provider:e,model:t,url:r,headers:o,messagesCount:n.messages?.length||0,messages:n.messages,toolsCount:n.tools?.length||0,tools:i,temperature:n.temperature});}llmResponse(e,t,n,r){this.write("llm",{type:"RESPONSE",provider:e,duration:`${t}ms`,usage:n,finishReason:r.finish_reason,content:r.content,contentLength:r.content?.length||0,toolCallsCount:r.tool_calls?.length||0,toolCalls:r.tool_calls});}llmError(e,t){let n={type:"ERROR",provider:e,error:t.message,status:t.response?.status};if(t.response?.data)try{let r=t.response.data;typeof r=="string"?n.data=r:typeof r=="object"&&(n.data={error:r.error,message:r.message,type:r.type,code:r.code});}catch{n.data="[Could not serialize response data]";}this.write("llm",n);}agentStart(e){this.write("agent",{type:"START",task:e});}agentIteration(e,t){this.write("agent",{type:"ITERATION",iteration:e,action:t});}agentComplete(e,t,n){this.write("agent",{type:"COMPLETE",iterations:e,toolCalls:t,usage:n});}agentError(e){this.write("agent",{type:"ERROR",error:e});}toolCall(e,t){this.write("tool",{type:"CALL",tool:e,args:t});}toolResult(e,t,n,r){this.write("tool",{type:"RESULT",tool:e,success:t,resultLength:n,duration:`${r}ms`});}toolError(e,t){this.write("tool",{type:"ERROR",tool:e,error:t});}},je=new dm;});function Lv(s,e){let t=s||"Unknown error",n=t.toLowerCase(),r=e?.providerName?.trim()||"LLM";if(n.includes("timeout")){let o=Math.round((e?.timeoutMs??12e4)/1e3);return [`\u23F1\uFE0F ${r} \u8BF7\u6C42\u8D85\u65F6 (${o}s)\u3002${r} \u63A5\u53E3\u5F53\u524D\u53EF\u80FD\u4E0D\u7A33\u5B9A\uFF0C\u53EF\u4EE5\u7A0D\u540E\u91CD\u8BD5\u6216\u5207\u6362\u5176\u4ED6\u6A21\u578B\u3002`,"\u5982\u679C\u591A\u6B21\u8D85\u65F6\u8BF7\u544A\u8BC9\u6211\u4EEC\uFF0C\u65B9\u4FBF\u6392\u67E5\u3002",`\u539F\u59CB\u9519\u8BEF\uFF1A${t}`].join(`
|
|
43
43
|
`)}return t}var Nv=R(()=>{});function hP(s){let e=(s||"").trim();if(e.startsWith("```")){let t=e.match(/```(?:json)?\s*([\s\S]*?)```/i);if(t&&t[1])return t[1].trim()}return e}function fP(s){return !s||s.length===0?[]:s.map(e=>{let t=e.instancePath||e.schemaPath||"";return e.keyword==="additionalProperties"&&typeof e.params?.additionalProperty=="string"?`${t} should not contain property "${e.params.additionalProperty}"`:`${t} ${e.message||""}`.trim()})}var gP,ec,$v=R(()=>{gP=new mP({allErrors:true,strict:false});ec=class{constructor(e){this.definition=e;this.validateFn=gP.compile(e.schema);}validateFn;get responseFormatPayload(){return {type:"json_schema",json_schema:{name:this.definition.name,schema:this.definition.schema,strict:this.definition.strict??true}}}buildSystemPrompt(){let e=JSON.stringify(this.definition.schema,null,2);return [`You must respond with valid JSON that exactly matches the schema "${this.definition.name}".`,"Do not include explanations, markdown code fences, or additional commentary.","Schema:",e].join(`
|
|
44
44
|
|
|
@@ -422,7 +422,7 @@ For complex multi-step tasks, use the update_plan tool to create an execution pl
|
|
|
422
422
|
- Update plan status as work progresses
|
|
423
423
|
|
|
424
424
|
Example scenarios: refactoring code, adding features, project migration, performance optimization, etc.`}};});function gR(s){let e=/^---\s*\n([\s\S]*?)\n---\s*\n([\s\S]*)$/,t=s.match(e);if(!t)return {metadata:{},body:s};let n=t[1],r=t[2],o={},i=n.split(`
|
|
425
|
-
`),a="",c=null;for(let u of i){if(!u.trim()||u.trim().startsWith("#"))continue;let d=u.search(/\S/),p=u.trim();if(p.startsWith("- ")){let h=p.slice(2).trim();a&&Array.isArray(o[a])?o[a].push(h):c&&a&&(Array.isArray(c[a])||(c[a]=[]),c[a].push(h));continue}let g=p.indexOf(":");if(g>0){let h=p.slice(0,g).trim(),y=p.slice(g+1).trim();if(d===0)if(a=h,c=null,y==="")o[h]={},c=o[h];else if(y.startsWith("[")&&y.endsWith("]")){let b=y.slice(1,-1);o[h]=b.split(",").map(C=>C.trim().replace(/^["']|["']$/g,"")).filter(Boolean);}else o[h]=sw(y);else if(c){if(y==="")c[h]={};else if(y.startsWith("[")&&y.endsWith("]")){let b=y.slice(1,-1);c[h]=b.split(",").map(C=>C.trim().replace(/^["']|["']$/g,"")).filter(Boolean);}else c[h]=sw(y);a=h;}}}return {metadata:o,body:r}}function sw(s){let e=s.replace(/^["']|["']$/g,"");if(e==="true")return true;if(e==="false")return false;let t=Number(e);return !isNaN(t)&&e!==""?t:e}function hR(s){let e=s.name||"",t=s.description||"";if(!e)throw new Error("Skill metadata must have a name");if(!t)throw new Error("Skill metadata must have a description");if(e.length>64)throw new Error("Skill name must be at most 64 characters");if(t.length>200)throw new Error("Skill description must be at most 200 characters");let n={name:e,description:t};return s.dependencies&&(n.dependencies=s.dependencies),s.context&&(n.context=s.context),s.agent&&(n.agent=s.agent),s["user-invocable"]!==void 0&&(n["user-invocable"]=s["user-invocable"]),s.hooks&&typeof s.hooks=="object"&&(n.hooks=s.hooks),s.neox&&typeof s.neox=="object"&&(n.neox=s.neox),n}var Ko,ig=R(()=>{Ko=class{async loadFromDirectory(e,t){let n=[];if(!wt.existsSync(e))return n;let r=wt.readdirSync(e,{withFileTypes:true});for(let o of r){if(!o.isDirectory())continue;let i=Ie.join(e,o.name),a=Ie.join(i,"SKILL.md");if(wt.existsSync(a))try{let l=await this.loadSkill(i,o.name,t);n.push(l);}catch(l){console.warn(`Failed to load skill from ${i}:`,l instanceof Error?l.message:l);}}return n}async loadSkill(e,t,n){let r=Ie.join(e,"SKILL.md"),o=wt.readFileSync(r,"utf-8"),{metadata:i,body:a}=this.parseSkillFile(o),l=hR(i),c=await this.loadSupportFiles(e);return {id:t,path:r,source:n,metadata:l,content:a.trim(),supportFiles:c.size>0?c:void 0}}parseSkillFile(e){return gR(e)}async loadSupportFiles(e){let t=new Map,n=wt.readdirSync(e,{withFileTypes:true});for(let r of n){if(!r.isFile()||r.name==="SKILL.md")continue;let o=Ie.join(e,r.name),i=Ie.extname(r.name).toLowerCase();if([".txt",".md",".json",".yaml",".yml",".sh",".js",".ts",".py"].includes(i))try{let l=wt.readFileSync(o,"utf-8");t.set(r.name,l);}catch{}}return t}},new Ko;});var Dc,
|
|
425
|
+
`),a="",c=null;for(let u of i){if(!u.trim()||u.trim().startsWith("#"))continue;let d=u.search(/\S/),p=u.trim();if(p.startsWith("- ")){let h=p.slice(2).trim();a&&Array.isArray(o[a])?o[a].push(h):c&&a&&(Array.isArray(c[a])||(c[a]=[]),c[a].push(h));continue}let g=p.indexOf(":");if(g>0){let h=p.slice(0,g).trim(),y=p.slice(g+1).trim();if(d===0)if(a=h,c=null,y==="")o[h]={},c=o[h];else if(y.startsWith("[")&&y.endsWith("]")){let b=y.slice(1,-1);o[h]=b.split(",").map(C=>C.trim().replace(/^["']|["']$/g,"")).filter(Boolean);}else o[h]=sw(y);else if(c){if(y==="")c[h]={};else if(y.startsWith("[")&&y.endsWith("]")){let b=y.slice(1,-1);c[h]=b.split(",").map(C=>C.trim().replace(/^["']|["']$/g,"")).filter(Boolean);}else c[h]=sw(y);a=h;}}}return {metadata:o,body:r}}function sw(s){let e=s.replace(/^["']|["']$/g,"");if(e==="true")return true;if(e==="false")return false;let t=Number(e);return !isNaN(t)&&e!==""?t:e}function hR(s){let e=s.name||"",t=s.description||"";if(!e)throw new Error("Skill metadata must have a name");if(!t)throw new Error("Skill metadata must have a description");if(e.length>64)throw new Error("Skill name must be at most 64 characters");if(t.length>200)throw new Error("Skill description must be at most 200 characters");let n={name:e,description:t};return s.dependencies&&(n.dependencies=s.dependencies),s.context&&(n.context=s.context),s.agent&&(n.agent=s.agent),s["user-invocable"]!==void 0&&(n["user-invocable"]=s["user-invocable"]),s.hooks&&typeof s.hooks=="object"&&(n.hooks=s.hooks),s.neox&&typeof s.neox=="object"&&(n.neox=s.neox),n}var Ko,ig=R(()=>{Ko=class{async loadFromDirectory(e,t){let n=[];if(!wt.existsSync(e))return n;let r=wt.readdirSync(e,{withFileTypes:true});for(let o of r){if(!o.isDirectory())continue;let i=Ie.join(e,o.name),a=Ie.join(i,"SKILL.md");if(wt.existsSync(a))try{let l=await this.loadSkill(i,o.name,t);n.push(l);}catch(l){console.warn(`Failed to load skill from ${i}:`,l instanceof Error?l.message:l);}}return n}async loadSkill(e,t,n){let r=Ie.join(e,"SKILL.md"),o=wt.readFileSync(r,"utf-8"),{metadata:i,body:a}=this.parseSkillFile(o),l=hR(i),c=await this.loadSupportFiles(e);return {id:t,path:r,source:n,metadata:l,content:a.trim(),supportFiles:c.size>0?c:void 0}}parseSkillFile(e){return gR(e)}async loadSupportFiles(e){let t=new Map,n=wt.readdirSync(e,{withFileTypes:true});for(let r of n){if(!r.isFile()||r.name==="SKILL.md")continue;let o=Ie.join(e,r.name),i=Ie.extname(r.name).toLowerCase();if([".txt",".md",".json",".yaml",".yml",".sh",".js",".ts",".py"].includes(i))try{let l=wt.readFileSync(o,"utf-8");t.set(r.name,l);}catch{}}return t}},new Ko;});var Dc,tt,Jo=R(()=>{ig();Dc=class{skills=new Map;aliasIndex=new Map;loader=new Ko;initialized=false;watchers=[];debounceTimer=null;watchWorkDir;register(e){if(this.skills.set(e.id,e),e.metadata.neox?.aliases)for(let t of e.metadata.neox.aliases)this.aliasIndex.set(t,e.id);}unregister(e){let t=this.skills.get(e);if(t){if(t.metadata.neox?.aliases)for(let n of t.metadata.neox.aliases)this.aliasIndex.delete(n);this.skills.delete(e);}}find(e){let t=this.skills.get(e);if(t)return t;let n=this.aliasIndex.get(e);if(n)return this.skills.get(n);let r=e.toLowerCase();for(let[o,i]of Array.from(this.skills.entries()))if(o.toLowerCase()===r||i.metadata.name.toLowerCase()===r)return i}has(e){return this.find(e)!==void 0}list(e){let t=Array.from(this.skills.values());return e?.category&&(t=t.filter(n=>n.metadata.neox?.category===e.category)),e?.source&&(t=t.filter(n=>n.source===e.source)),e?.userInvocable!==void 0&&(t=t.filter(n=>n.metadata["user-invocable"]===e.userInvocable)),t.sort((n,r)=>n.id.localeCompare(r.id))}get size(){return this.skills.size}async loadBuiltin(){let e=fileURLToPath(import.meta.url),t=Ie.dirname(e),n=Ie.join(t,"..","skills","builtin"),r=await this.loader.loadFromDirectory(n,"builtin");for(let o of r)this.register(o);}async loadUser(){let e=Ie.join(ho.homedir(),".neox","skills"),t=await this.loader.loadFromDirectory(e,"user");for(let n of t)this.register(n);}async loadWorkspace(e){let t=Ie.join(e,".neox","skills"),n=await this.loader.loadFromDirectory(t,"workspace");for(let r of n)this.register(r);}async initialize(e){this.initialized||(await this.loadBuiltin(),await this.loadUser(),e&&await this.loadWorkspace(e),this.initialized=true);}async refresh(e){this.skills.clear(),this.aliasIndex.clear(),this.initialized=false,await this.initialize(e);}watch(e){this.watchWorkDir=e;let t=[this.getUserSkillsDir(),...e?[this.getWorkspaceSkillsDir(e)]:[]];for(let n of t)if(wt.existsSync(n))try{let r=wt.watch(n,{recursive:!0},(o,i)=>{this.scheduleRefresh();});this.watchers.push(r);}catch{}}stopWatch(){for(let e of this.watchers)e.close();this.watchers=[],this.debounceTimer&&(clearTimeout(this.debounceTimer),this.debounceTimer=null);}scheduleRefresh(){this.debounceTimer&&clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(async()=>{try{await this.refresh(this.watchWorkDir);}catch{}},500);}getSkillsForPrompt(){let e=this.list({userInvocable:true});if(e.length===0)return "";let t=["## Available Skills",""];for(let n of e){let r=n.metadata.neox?.aliases,o=r?.length?` (aliases: ${r.join(", ")})`:"";t.push(`- /${n.id}: ${n.metadata.description}${o}`);}return t.join(`
|
|
426
426
|
`)}getUserSkillsDir(){return Ie.join(ho.homedir(),".neox","skills")}getWorkspaceSkillsDir(e){return Ie.join(e,".neox","skills")}async importFromUrl(e,t,n){try{let r=new URL(e),o=await fetch(e);if(!o.ok)return {success:!1,error:`HTTP ${o.status}: ${o.statusText}`};let i=await o.text(),{metadata:a}=this.loader.parseSkillFile(i);if(!a.name)return {success:!1,error:"Invalid SKILL.md: missing name field"};let l=this.generateSkillId(a.name),c=t==="user"?this.getUserSkillsDir():this.getWorkspaceSkillsDir(n),u=Ie.join(c,l);wt.mkdirSync(u,{recursive:!0}),wt.writeFileSync(Ie.join(u,"SKILL.md"),i,"utf-8");let d=await this.loader.loadSkill(u,l,t);return this.register(d),{success:!0,skillId:l}}catch(r){return {success:false,error:r instanceof Error?r.message:String(r)}}}async importFromPath(e,t,n){try{let r=Ie.resolve(e),o=wt.statSync(r),i,a;if(o.isDirectory()?(i=Ie.join(r,"SKILL.md"),a=r):(i=r,a=Ie.dirname(r)),!wt.existsSync(i))return {success:!1,error:`SKILL.md not found at ${i}`};let l=wt.readFileSync(i,"utf-8"),{metadata:c}=this.loader.parseSkillFile(l);if(!c.name)return {success:!1,error:"Invalid SKILL.md: missing name field"};let u=this.generateSkillId(c.name),d=t==="user"?this.getUserSkillsDir():this.getWorkspaceSkillsDir(n),p=Ie.join(d,u);wt.mkdirSync(p,{recursive:!0}),wt.copyFileSync(i,Ie.join(p,"SKILL.md"));let g=wt.readdirSync(a,{withFileTypes:!0});for(let y of g)y.isFile()&&y.name!=="SKILL.md"&&wt.copyFileSync(Ie.join(a,y.name),Ie.join(p,y.name));let h=await this.loader.loadSkill(p,u,t);return this.register(h),{success:!0,skillId:u}}catch(r){return {success:false,error:r instanceof Error?r.message:String(r)}}}async createSkill(e){try{let{id:t,name:n,description:r,category:o,target:i,workDir:a}=e;if(!/^[a-z][a-z0-9-]*$/.test(t))return {success:!1,error:"Skill ID must start with lowercase letter and contain only lowercase letters, numbers, and hyphens"};if(this.has(t))return {success:!1,error:`Skill '${t}' already exists`};let l=i==="user"?this.getUserSkillsDir():this.getWorkspaceSkillsDir(a),c=Ie.join(l,t);if(wt.existsSync(c))return {success:!1,error:`Directory already exists: ${c}`};let u=`---
|
|
427
427
|
name: "${n}"
|
|
428
428
|
description: "${r}"
|
|
@@ -446,9 +446,9 @@ ${r}
|
|
|
446
446
|
\u7528\u6237: /${t}
|
|
447
447
|
AI: [\u6280\u80FD\u6267\u884C\u7ED3\u679C]
|
|
448
448
|
\`\`\`
|
|
449
|
-
`;wt.mkdirSync(c,{recursive:!0}),wt.writeFileSync(Ie.join(c,"SKILL.md"),u,"utf-8");let d=await this.loader.loadSkill(c,t,i);return this.register(d),{success:!0,path:c}}catch(t){return {success:false,error:t instanceof Error?t.message:String(t)}}}async deleteSkill(e){try{let t=this.find(e);if(!t)return {success:!1,error:`Skill '${e}' not found`};if(t.source==="builtin")return {success:!1,error:"Cannot delete built-in skills"};let n=Ie.dirname(t.path);return wt.rmSync(n,{recursive:!0,force:!0}),this.unregister(e),{success:!0}}catch(t){return {success:false,error:t instanceof Error?t.message:String(t)}}}generateSkillId(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32)}},
|
|
449
|
+
`;wt.mkdirSync(c,{recursive:!0}),wt.writeFileSync(Ie.join(c,"SKILL.md"),u,"utf-8");let d=await this.loader.loadSkill(c,t,i);return this.register(d),{success:!0,path:c}}catch(t){return {success:false,error:t instanceof Error?t.message:String(t)}}}async deleteSkill(e){try{let t=this.find(e);if(!t)return {success:!1,error:`Skill '${e}' not found`};if(t.source==="builtin")return {success:!1,error:"Cannot delete built-in skills"};let n=Ie.dirname(t.path);return wt.rmSync(n,{recursive:!0,force:!0}),this.unregister(e),{success:!0}}catch(t){return {success:false,error:t instanceof Error?t.message:String(t)}}}generateSkillId(e){return e.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"").slice(0,32)}},tt=new Dc;});function Lc(s){let{workDir:e,language:t="zh"}=s,n=[],r=t==="zh"?`\u5DE5\u4F5C\u76EE\u5F55: ${e}
|
|
450
450
|
Shell \u6BCF\u6B21\u8C03\u7528\u72EC\u7ACB\uFF0Ccd \u4E0D\u8DE8\u8C03\u7528\u6301\u7EED`:`Working directory: ${e}
|
|
451
|
-
Shell calls are independent; cd does not persist across calls`;n.push(r),n.push(""),n.push(nw(t)),n.push(""),n.push(ew(e,t)),n.push("");let o=
|
|
451
|
+
Shell calls are independent; cd does not persist across calls`;n.push(r),n.push(""),n.push(nw(t)),n.push(""),n.push(ew(e,t)),n.push("");let o=tt.getSkillsForPrompt();if(o){let i=t==="zh"?`## \u53EF\u7528\u6280\u80FD (Skills)
|
|
452
452
|
|
|
453
453
|
\u4EE5\u4E0B\u662F\u5DF2\u6CE8\u518C\u7684\u6280\u80FD\u3002\u5F53\u7528\u6237\u7684\u610F\u56FE\u5339\u914D\u67D0\u4E2A\u6280\u80FD\u65F6\uFF0C\u4F7F\u7528 \`use_skill\` \u5DE5\u5177\u6765\u83B7\u53D6\u8BE5\u6280\u80FD\u7684\u8BE6\u7EC6\u6307\u4EE4\uFF0C\u7136\u540E\u9075\u5FAA\u6307\u4EE4\u5B8C\u6210\u4EFB\u52A1\u3002
|
|
454
454
|
|
|
@@ -627,7 +627,7 @@ Please:
|
|
|
627
627
|
- Check if the file/path exists
|
|
628
628
|
- Verify your approach
|
|
629
629
|
- Try a different method
|
|
630
|
-
`.trim()};default:return {level:0,shouldTerminate:false,message:""}}}getVerifyCommand(e,t){return e==="readfile"?t?"Use search to locate specific content, or list_directory to check if file exists":"":e==="write_file"||e==="Write"||e==="edit_file"||e==="Edit"?t?`Use readfile "${t}" to verify the changes`:"":e==="search"||e==="search_files"||e==="Glob"?"Try a different search pattern or read the file directly":e==="execute_shell"||e==="execute_bash"||e==="Bash"?"Check the command output from previous calls":""}getAlternativeAction(e,t){return e==="readfile"?"The file content should already be in your context from previous reads - use it directly":e==="write_file"||e==="Write"?"The file was already written - verify with readfile if needed":e==="edit_file"||e==="Edit"?"The edit may have already been applied - use readfile to check current content":e==="search"||e==="search_files"||e==="Glob"?"Search results should already be available - try a different pattern if not found":"Review the output from previous calls before retrying"}getCallCount(e,t){let n=this.hashArgs(e,t);return this.history.filter(r=>r.hash===n).length}reset(){this.history=[],this.interventionCount=0;}getHistory(){return [...this.history]}getRecentDuplicates(){let e=new Map;for(let t of this.history){let n=`${t.toolName}:${t.hash}`;e.set(n,(e.get(n)||0)+1);}return e}};});function Te(s,e,t,n){return {type:"ephemeral",status:e,tool:s,summary:t,final:e==="success"||e==="already_done",...n}}function
|
|
630
|
+
`.trim()};default:return {level:0,shouldTerminate:false,message:""}}}getVerifyCommand(e,t){return e==="readfile"?t?"Use search to locate specific content, or list_directory to check if file exists":"":e==="write_file"||e==="Write"||e==="edit_file"||e==="Edit"?t?`Use readfile "${t}" to verify the changes`:"":e==="search"||e==="search_files"||e==="Glob"?"Try a different search pattern or read the file directly":e==="execute_shell"||e==="execute_bash"||e==="Bash"?"Check the command output from previous calls":""}getAlternativeAction(e,t){return e==="readfile"?"The file content should already be in your context from previous reads - use it directly":e==="write_file"||e==="Write"?"The file was already written - verify with readfile if needed":e==="edit_file"||e==="Edit"?"The edit may have already been applied - use readfile to check current content":e==="search"||e==="search_files"||e==="Glob"?"Search results should already be available - try a different pattern if not found":"Review the output from previous calls before retrying"}getCallCount(e,t){let n=this.hashArgs(e,t);return this.history.filter(r=>r.hash===n).length}reset(){this.history=[],this.interventionCount=0;}getHistory(){return [...this.history]}getRecentDuplicates(){let e=new Map;for(let t of this.history){let n=`${t.toolName}:${t.hash}`;e.set(n,(e.get(n)||0)+1);}return e}};});function Te(s,e,t,n){return {type:"ephemeral",status:e,tool:s,summary:t,final:e==="success"||e==="already_done",...n}}function Qe(s,e,t,n,r){return {type:"contextual",status:e,tool:s,summary:t,content:n,...r}}function ss(s,e,t,n){return {type:"summarized",status:e,tool:s,summary:t,...n}}function lw(s){m.info("TOOL_RESULT",`\u{1F504} getResultForLLM input: ${s.tool}`,{type:s.type,status:s.status,tool:s.tool,hasContent:!!s.content,contentLength:s.content?.length||0,summary:s.summary?.substring(0,100)});let e;if(s.type==="ephemeral")if(s.status==="error")s.tool==="edit_file"?e=JSON.stringify({status:s.status,tool:s.tool,summary:s.summary,error:s.error,verify_hint:s.verify_hint,file_path:s.file_path,actual_content:s.actual_content,expected_start_line:s.expected_start_line,similar_matches:s.metadata?.similar_matches,suggestions:s.metadata?.suggestions}):e=JSON.stringify({status:s.status,tool:s.tool,summary:s.summary,error:s.error,verify_hint:s.verify_hint,file_path:s.file_path,similar_matches:s.metadata?.similar_matches,suggestions:s.metadata?.suggestions});else {let t=s.metadata?.edit_info;if(s.tool==="edit_file"&&t){let n=t.old_string?t.old_string.length>1e3?t.old_string.substring(0,1e3)+"...":t.old_string:void 0,r=t.new_string?t.new_string.length>1e3?t.new_string.substring(0,1e3)+"...":t.new_string:void 0;e=JSON.stringify({status:s.status,tool:s.tool,summary:s.summary,final:s.final,file_path:s.file_path,old_string_preview:n,new_string_preview:r,start_line:t.start_line});}else e=JSON.stringify({status:s.status,tool:s.tool,summary:s.summary,final:s.final,file_path:s.file_path});}else s.type==="summarized"?e=JSON.stringify({status:s.status,tool:s.tool,summary:s.summary,error:s.error}):e=JSON.stringify(s);return m.info("TOOL_RESULT",`\u2705 getResultForLLM output: ${s.tool}`,{type:s.type,tool:s.tool,llmResultLength:e.length,llmResultPreview:e.substring(0,500)}),e}var Nc=R(()=>{ne();});function dg(s){if(s.startsWith("mcp__"))return "summarized";if(s in ug)return ug[s];let e=s.toLowerCase();for(let[t,n]of Object.entries(ug))if(t.toLowerCase()===e)return n;return "contextual"}function cw(s){return dg(s)==="contextual"}var ug,pg=R(()=>{Nc();ug={write_file:"ephemeral",Write:"ephemeral",edit_file:"ephemeral",Edit:"ephemeral",create_directory:"ephemeral",mkdir:"ephemeral",delete_file:"ephemeral",rename_file:"ephemeral",apply_patch:"ephemeral",move_file:"ephemeral",copy_file:"ephemeral",git_commit:"ephemeral",git_add:"ephemeral",git_push:"ephemeral",git_checkout:"ephemeral",git_branch:"ephemeral",git_merge:"ephemeral",git_stash:"ephemeral",npm_install:"ephemeral",npm_uninstall:"ephemeral",pip_install:"ephemeral",readfile:"contextual",search:"contextual",grep:"contextual",Grep:"contextual",glob:"contextual",Glob:"contextual",search_files:"contextual",ripgrep:"contextual",ls:"contextual",list_directory:"contextual",show_tree:"contextual",git_diff:"contextual",git_status:"contextual",git_blame:"contextual",git_branch_list:"contextual",git_log:"contextual",git_show:"contextual",web_search:"contextual",WebSearch:"contextual",web_fetch:"contextual",WebFetch:"contextual",analyze_code:"contextual",search_symbol:"contextual",get_definitions:"contextual",get_references:"contextual",execute_shell:"summarized",Bash:"summarized",bash:"summarized",shell:"summarized",run_tests:"summarized",run_lint:"summarized",run_format:"summarized",test:"summarized",pytest:"summarized",jest:"summarized",build:"summarized",compile:"summarized",npm_build:"summarized",code_interpreter:"summarized",python_exec:"summarized",browser_debug:"summarized"};});var os,uw=R(()=>{un();os=class{config;toolPermissions=new Map;permissionMemory=new Map;constructor(e={}){this.config=e;}setToolPermission(e){this.toolPermissions.set(e.toolName,e);}setToolPermissions(e){e.forEach(t=>this.setToolPermission(t));}async checkPermission(e,t){let n=e.name,r=this.getToolCategory(e),o=this.getToolPermission(e);if(o==="deny")return {allowed:false,source:"config",reason:this.toolPermissions.get(n)?.reason||`Tool "${n}" is denied`};if(o==="allow")return {allowed:true,source:"config"};let i=this.checkMemory(n);if(i)return {allowed:i.decision,source:"remembered",reason:i.decision?void 0:"User previously denied this tool"};if(!this.config.approvalHandler)return {allowed:true,source:"config",reason:"No approval handler configured - auto-approved"};try{let a=this.toolPermissions.get(n),l=await this.config.approvalHandler({toolName:n,toolCategory:r,args:t,reason:a?.reason,allowRemember:a?.allowRemember??!0});return l.remember&&this.saveMemory(n,l.approved),{allowed:l.approved,source:"user",reason:l.approved?void 0:"User denied approval",remember:l.remember}}catch(a){return {allowed:false,source:"config",reason:`Approval handler failed: ${a instanceof Error?a.message:String(a)}`}}}getToolPermission(e){let t=this.toolPermissions.get(e.name);return t?t.permission:e.permission?.defaultPermission?e.permission.defaultPermission:this.config.defaultPermission??"ask"}getToolCategory(e){return e.permission?.category?e.permission.category:this.inferToolCategory(e.name)}inferToolCategory(e){let t=e.toLowerCase();return t.includes("read")||t.includes("grep")||t.includes("glob")||t.includes("search")||t.includes("list")||t.includes("show")?"read":t.includes("write")||t.includes("edit")||t.includes("create")||t.includes("delete")||t.includes("update")?"write":t.includes("bash")||t.includes("exec")||t.includes("run")||t.includes("command")?"execute":t.includes("fetch")||t.includes("request")||t.includes("api")||t.includes("http")||t.includes("download")?"network":"system"}checkMemory(e){let t=this.permissionMemory.get(e);return t?t.expiresAt&&Date.now()>t.expiresAt?(this.permissionMemory.delete(e),null):t:null}saveMemory(e,t){let n=this.config.memoryExpirationMs?Date.now()+this.config.memoryExpirationMs:void 0;this.permissionMemory.set(e,{toolName:e,decision:t,timestamp:Date.now(),expiresAt:n});}clearMemory(e){e?this.permissionMemory.delete(e):this.permissionMemory.clear();}setApprovalHandler(e){this.config.approvalHandler=e;}};});var dw=R(()=>{un();});var Oc=R(()=>{uw();dw();});var is,mg=R(()=>{is=class{static strategies=new Map;static register(e){this.strategies.set(e.mode,e);}static getStrategy(e){let t=this.strategies.get(e);if(!t)throw new Error(`No strategy registered for mode: ${e}`);return t}static getAllModes(){return Array.from(this.strategies.keys())}};});var wa,gg=R(()=>{un();wa=class{mode="ask";filterTools(e){return e.filter(t=>this.isReadOnlyTool(t))}getSystemPrompt(){return `You are in ASK mode (read-only). You can:
|
|
631
631
|
- Read files and search code
|
|
632
632
|
- Analyze and understand the codebase
|
|
633
633
|
- Answer questions about the project
|
|
@@ -665,7 +665,7 @@ Available operations: All tools (auto-approved).`}shouldAutoApprove(){return tr
|
|
|
665
665
|
|
|
666
666
|
\u2026[${n-l.length-c.length} chars truncated, total ${t} lines]\u2026
|
|
667
667
|
|
|
668
|
-
`;return l+d+c}var mw,wR,xR,SR,kR,Fc,sr=R(()=>{_v();Iv();om();lm();Wi();Nv();$v();Qn();xr();ko();Bv();Pc();Ps();ZC();Ca();ne();aw();pg();sg();Oc();pw();un();Oc();un();mw=2e4,wR=15e3;xR=yw("NEOX_STREAM_FIRST_CHUNK_TIMEOUT_MS",6e4),SR=yw("NEOX_STREAM_CHUNK_TIMEOUT_MS",18e4),kR=process.env.NEOX_STREAM_WATCHDOG_DISABLED==="1";Fc=class{llmProvider;providerName;model;tools;memory;config;agentName;agentDescription;instructions;contextInjection;userData;plannerMode;inputGuardrails=[];outputGuardrails=[];toolInputGuardrails=[];toolOutputGuardrails=[];structuredOutput;structuredValidator;maxInputTokensOverride;maxInputTokens;minHistoryMessages;parallelExecutor;unifiedCompressor;compressionMode;toolMetricsHistory=[];workspacePath;disableSystemPrompt;enableFGTS;runContext;permissionManager;modeStrategy;currentMode;loopDetector;enablePlanMode;constructor(e){if(this.llmProvider=e.llmProvider,this.providerName=e.providerName,this.model=e.model,this.tools=e.tools,this.memory=e.memory,this.config=e.config,this.agentName=e.agentName||"DefaultAgent",this.agentDescription=e.agentDescription||"",this.instructions=e.instructions,this.contextInjection=e.contextInjection,this.userData=e.userData,this.plannerMode=e.plannerMode??false,this.structuredOutput=e.structuredOutput,this.maxInputTokensOverride=e.maxInputTokensOverride,this.maxInputTokens=this.computeMaxInputTokens(e.contextWindow,e.tailTokenBudget,this.maxInputTokensOverride),this.minHistoryMessages=Math.max(1,e.minHistoryMessages??6),e.structuredOutput&&(this.structuredValidator=new ec(e.structuredOutput)),this.inputGuardrails=e.inputGuardrails||[],this.outputGuardrails=e.outputGuardrails||[],this.toolInputGuardrails=e.toolInputGuardrails||[],this.toolOutputGuardrails=e.toolOutputGuardrails||[],this.parallelExecutor=new Rc,this.compressionMode=e.compressionMode??"sync",this.workspacePath=e.workspacePath,this.unifiedCompressor=new sc({debug:process.env.CLI_DEBUG==="1",minRecentMessages:this.minHistoryMessages,enableLLMCompression:true}),this.disableSystemPrompt=e.disableSystemPrompt??false,this.enableFGTS=e.enableFGTS??false,this.unifiedCompressor.setLLMProvider(this.llmProvider,this.model),e.contextWindow&&this.unifiedCompressor.setContextWindow(e.contextWindow),this.currentMode=e.config.mode??"agent",this.modeStrategy=yg(this.currentMode),this.permissionManager=e.permissionManager??new os({defaultPermission:"ask"}),this.loopDetector=iw(),this.enablePlanMode=e.enablePlanMode??true,e.approvalHandler){let t=e.approvalHandler;this.permissionManager.setApprovalHandler(async n=>({approved:await t({id:"",name:n.toolName,args:n.args}),remember:false}));}}setApprovalHandler(e){if(!e){this.permissionManager.setApprovalHandler(void 0);return}this.permissionManager.setApprovalHandler(async t=>({approved:await e({id:"",name:t.toolName,args:t.args}),remember:false}));}setMode(e){this.currentMode=e,this.modeStrategy=yg(e),m.info("Runner",`Mode switched to: ${e}`);}getMode(){return this.currentMode}getPermissionManager(){return this.permissionManager}computeMaxInputTokens(e,t,n){if(n&&n>0)return n;let o=e&&e>0?e:19e4,i=.7,a=Math.floor(o*i),l=Math.min(t??mw,Math.floor(o*.1)),c=Math.max(2e3,a-l);if(process.env.CLI_DEBUG==="1"||process.env.CLI_DEBUG_CONSOLE==="1"){let u=`[Context] maxInputTokens=${c} (contextWindow=${o}, override=${n}, tailBudget=${t??mw}, safety=${i})`;console.log(u);}return c}async*withStreamWatchdog(e,t){if(kR){for await(let i of e)yield i;return}let n=e[Symbol.asyncIterator](),r=t?new Promise((i,a)=>{t.aborted?a(Bc()):t.addEventListener("abort",()=>a(Bc()),{once:true});}):null,o=false;for(;;){if(t?.aborted){if(n.return)try{await n.return();}catch{}throw Bc()}let i=o?SR:xR,a=null,l=new Promise((c,u)=>{a=setTimeout(()=>{u(TR(o?"idle":"first_chunk",i));},i);});try{let c=await Promise.race(r?[n.next(),l,r]:[n.next(),l]);if(a&&clearTimeout(a),c.done)return;o=!0,yield c.value;}catch(c){if(a&&clearTimeout(a),n.return)try{await n.return();}catch{}throw c?.code==="STREAM_TIMEOUT"&&m.warn("RUNNER",`[watchdog] ${c.message}`),c}}}async applyContextWindow(e=0){if(!this.maxInputTokens)return null;let t=this.memory.getMessagesForLLM(),n=await this.unifiedCompressor.compressHistory(t,this.maxInputTokens,{iteration:e,enableLLMCompression:true});if(n.stats.droppedMessages>0||n.stats.llmCompressedMessages>0){this.memory.setMessages(n.messages);let r=this.compressionMode==="async"?"Async":"Sync",o=(n.originalTokens/1e3).toFixed(1),i=(n.compressedTokens/1e3).toFixed(1),a=(n.savedTokens/1e3).toFixed(1),l=n.originalCount,c=n.compressedCount;m.info("Context",`[${r}] \u538B\u7F29\u5B8C\u6210: ${l}\u6761/${o}K \u2192 ${c}\u6761/${i}K (\u8282\u7701 ${a}K, \u4E22\u5F03${n.stats.droppedMessages}\u6761, LLM\u538B\u7F29${n.stats.llmCompressedMessages}\u6761)`),n.debugInfo&&n.debugInfo.forEach(u=>m.debug("Context",u));}return n}setCompressionMode(e){this.compressionMode=e,m.info("Context",`Compression mode set to: ${e}`);}getCompressionMode(){return this.compressionMode}async getInstructions(e){if(typeof this.instructions=="string")return this.instructions;let t={name:this.agentName,description:this.agentDescription};return await this.instructions(e,t)}async getContextInjection(e){if(!this.contextInjection)return null;let n=(typeof this.contextInjection=="string"?this.contextInjection:await this.contextInjection(e,{name:this.agentName,description:this.agentDescription}))?.trim();return n||null}shouldIncludeLastRun(e){let t=e.trim().toLowerCase();return t?/上次|之前|前面|上一步|上轮|继续|回顾|resume|continue|previous|last time/.test(t):false}createRunContext(e,t=0){return {task:e,timestamp:Date.now(),currentTime:new Date,iteration:t,userData:this.userData,systemStatus:void 0}}setUserData(e){this.userData={...this.userData,...e};}async*run(e,t,n){this.runContext={task:e,timestamp:Date.now(),currentTime:new Date,iteration:0,userData:this.userData},this.loopDetector.reset(),process.env.CLI_DEBUG==="1"&&(m.debug("MK",` hasSignal: ${!!n}`),m.debug("RUNNER","========================================"),m.debug("RUNNER","=== runner.run ENTRY ==="),m.debug("RUNNER",` task: "${e?.substring(0,50)}..."`),m.debug("RUNNER",` hasImages: ${!!t&&t.length>0}`),m.debug("RUNNER",` hasSignal: ${!!n}`)),je.agentStart(e),yield {type:"agent_updated_stream_event",new_agent:{name:this.agentName}};let r=this.createRunContext(e,0),o=this.memory.hasConversationMessages?.()??this.memory.getMessagesForLLM().some(W=>W.role==="user"||W.role==="assistant"),i=!o||this.shouldIncludeLastRun(e);r.userData={...r.userData??{},hasConversation:o,includeLastRun:i},this.inputGuardrails.length>0&&(yield {type:"raw_response_event",data:{type:"input_guardrails.check_start",count:this.inputGuardrails.length},event_type:"input_guardrails.check_start"},await Es.runInputGuardrails(this.inputGuardrails,r,this.agentName,e),yield {type:"raw_response_event",data:{type:"input_guardrails.check_passed"},event_type:"input_guardrails.check_passed"});let a=await this.getInstructions(r),l=await this.getContextInjection(r);process.env.CLI_DEBUG==="1"&&(console.log("[RUNNER] dynamicInstructions length:",a?.length||0),console.log("[RUNNER] dynamicInstructions START:",a?.substring(0,200)),console.log("[RUNNER] dynamicInstructions END:",a?.substring(a.length-500)),console.log("[RUNNER] contains \u534F\u4F5C\u6A21\u5F0F:",a?.includes("\u534F\u4F5C\u6A21\u5F0F")),console.log("[RUNNER] contains delegate_task:",a?.includes("delegate_task")));let c=this.memory.getMessagesForLLM(),u=c.some(W=>W.role==="system");if(process.env.CLI_DEBUG==="1"&&(console.log("[RUNNER] hasSystemPrompt:",u,"existingMessages count:",c.length),console.log("[RUNNER] disableSystemPrompt:",this.disableSystemPrompt)),this.disableSystemPrompt)u&&this.memory.clear(),a&&this.memory.add({role:"system",content:a});else if(!u){let W=this.modeStrategy.getSystemPrompt();this.memory.add({role:"system",content:W}),this.memory.add({role:"system",content:a}),this.structuredValidator&&this.memory.add({role:"system",content:this.structuredValidator.buildSystemPrompt()});try{let U=await tg(this.workspacePath);U&&this.memory.add({role:"system",content:U});}catch{}}if(l?this.memory.upsertSystemTagged?this.memory.upsertSystemTagged("context_injection",l):u||this.memory.add({role:"system",content:l}):this.memory.removeSystemTagged?.("context_injection"),t&&t.length>0){let W=[{type:"text",text:e},...t.map(U=>({type:"image_url",image_url:{url:U,detail:"auto"}}))];this.memory.add({role:"user",content:W});}else this.memory.add({role:"user",content:e});let d=Date.now(),p=0,g="",h=0,y={totalTokens:0,promptTokens:0,completionTokens:0},b=false,C=0,T=null,S=new Map,E=0,v=0,I=[],D=this.isExecutionOrientedTask(e),O=0,k=Tr.streamMaxRetries,M=false,N=Number.isFinite(this.config.maxIterations)?this.config.maxIterations:xv,x=N===0||N===1/0,B=gw(this.config.maxToolCalls,Sv),H=gw(this.config.maxRuntimeMs,kv);for(;x||p<N;){if(n?.aborted){T="interrupted",b=true,yield {type:"error",error:"Task interrupted by user."};break}if(H!==null&&Date.now()-d>=H){T="runtime_limit",b=true,yield {type:"error",error:`Reached max runtime (${ln(H)}). Please summarize progress and ask whether to continue.`};break}if(B!==null&&h>=B){T="tool_call_limit",b=true,yield {type:"error",error:`Reached max tool calls (${B}). Please summarize progress and ask whether to continue.`};break}p++;let W=null;if(this.maxInputTokens){let z=cn(this.memory.getMessagesForLLM()),q=this.maxInputTokens*.97;z>q&&(W=await this.applyContextWindow(p));}W&&(W.stats.droppedMessages>0||W.stats.llmCompressedMessages>0)&&(yield {type:"context_compaction",status:"completed",originalMessages:W.originalCount,keptMessages:W.messages.length,droppedMessages:W.stats.droppedMessages,compressedMessages:W.stats.llmCompressedMessages,originalTokens:W.originalTokens,finalTokens:W.compressedTokens,budgetTokens:this.maxInputTokens||0,useLLM:W.stats.llmCompressedMessages>0,timestamp:Date.now()});let U=this.memory.checkContextHealth();if((U.warnings.length>0||U.shouldCleanup)&&(yield {type:"raw_response_event",data:{type:"context_health",totalTokens:U.totalTokens,toolResultTokens:U.toolResultTokens,toolResultRatio:U.toolResultRatio,messageCount:U.messageCount,toolMessageCount:U.toolMessageCount,warnings:U.warnings,shouldCompress:U.shouldCompress,shouldCleanup:U.shouldCleanup,byType:U.byType},event_type:"context_health"},U.shouldCleanup&&U.byType.ephemeral.count>5)){let z=this.memory.cleanupEphemeral();z>0&&m.info("Runner",`Cleaned ${z} ephemeral messages`);}m.debug("Runner",this.memory.getTokenSummary()),je.agentIteration(p,"thinking"),yield {type:"iteration_start",iteration:p};try{yield {type:"raw_response_event",data:{type:"response.created",response:{id:`resp_${Date.now()}`,model:this.model}},event_type:"response.created"};let z=this.memory.getMessagesForLLM();if(m.info("LLM",`Request: model=${this.model}, messages=${z.length}, tools=${this.tools.length}`),m.debug("LLM","Request messages",{messageCount:z.length,lastMessage:z[z.length-1]?.content?.toString().substring(0,200)}),process.env.CLI_DEBUG==="1"){let oe=z.filter(X=>X.role==="system");console.log("[RUNNER] System messages count:",oe.length);for(let X=0;X<oe.length;X++){let te=oe[X].content,Y=typeof te=="string"?te:JSON.stringify(te);console.log(`[RUNNER] System[${X}] length:`,Y?.length||0),console.log(`[RUNNER] System[${X}] contains \u534F\u4F5C\u6A21\u5F0F:`,Y?.includes("\u534F\u4F5C\u6A21\u5F0F")||!1),console.log(`[RUNNER] System[${X}] contains delegate_task:`,Y?.includes("delegate_task")||!1),console.log(`[RUNNER] System[${X}] preview:`,Y?.substring(0,300)||"");}}let q=this.modeStrategy.filterTools(this.tools);process.env.CLI_DEBUG==="1"&&m.debug("RUNNER",`Mode: ${this.currentMode}, Available tools: ${q.length}/${this.tools.length}`);let P=this.llmProvider.chatStreamed(this.memory.getMessagesForLLM(),{model:this.model,tools:q,temperature:this.config.temperature,structuredOutput:this.structuredOutput,maxInputTokens:this.maxInputTokens,disableSystemPrompt:this.disableSystemPrompt,enableFGTS:this.enableFGTS,signal:n}),$="",F="",V=[],Z=[],ae="",be={prompt_tokens:0,completion_tokens:0,total_tokens:0};for await(let oe of this.withStreamWatchdog(P,n)){if(oe.type==="stream_retry"){M=!0,yield oe;continue}if(oe.type==="stream_recovered"){yield {type:"stream_recovered",attempt:oe.attempt,maxRetries:oe.maxRetries};continue}yield {type:"raw_response_event",data:oe,event_type:oe.choices?.[0]?.delta?"response.delta":"response.chunk"};let X=oe.choices?.[0]?.delta;if(oe.usage){be={prompt_tokens:oe.usage.prompt_tokens||be.prompt_tokens,completion_tokens:oe.usage.completion_tokens||be.completion_tokens,total_tokens:oe.usage.total_tokens||be.total_tokens,cached_tokens:oe.usage.cached_tokens,cache_read_input_tokens:oe.usage.cache_read_input_tokens,cache_creation_input_tokens:oe.usage.cache_creation_input_tokens,prompt_tokens_details:oe.usage.prompt_tokens_details},y={promptTokens:be.prompt_tokens,completionTokens:be.completion_tokens,totalTokens:be.total_tokens};let te=!!oe.choices?.[0]?.finish_reason;yield {type:"token_usage",usage:be,is_final:te};}if(X){if(X.reasoning_content&&(F+=X.reasoning_content,yield {type:"reasoning_delta",delta:X.reasoning_content}),X.reasoning_complete&&(yield {type:"reasoning_complete"}),X.content&&($+=X.content,g=$,yield {type:"text_delta",delta:X.content}),X.tool_calls)for(let te of X.tool_calls){let Y=te.index;Z[Y]||(Z[Y]={id:te.id||`call_${Math.floor(Date.now())}_${Y}`,type:"function",function:{name:"",arguments:""}}),te.id&&(Z[Y].id=te.id),te.function?.name&&(Z[Y].function.name=te.function.name),te.function?.arguments&&(Z[Y].function.arguments+=te.function.arguments,yield {type:"tool_call_delta",id:Z[Y].id,name:Z[Y].function.name,arguments_delta:te.function.arguments}),te.thoughtSignature&&(Z[Y].thoughtSignature=te.thoughtSignature);}oe.choices?.[0]?.finish_reason&&(ae=oe.choices[0].finish_reason),oe.thinking_blocks&&Array.isArray(oe.thinking_blocks)&&(V=oe.thinking_blocks.map(te=>({type:te.type,thinking:te.thinking,signature:te.signature,data:te.data})));}}$&&(yield {type:"text_done"}),process.env.CLI_DEBUG_CONSOLE==="1"&&process.env.NEOX_UI_MODE==="1"&&console.log("[Runner] \u{1F3AF} Emitting response.completed event (after LLM response)"),yield {type:"raw_response_event",data:{type:"response.completed"},event_type:"response.completed"};let Pe={role:"assistant",content:($||"").trimEnd()};if(F&&(Pe.reasoning_content=F),V.length>0&&(Pe.thinking_blocks=V),Z.length>0&&(Pe.tool_calls=Z.map(oe=>({...oe,function:{...oe.function,arguments:oe.function.arguments}}))),this.memory.add(Pe),process.env.CLI_DEBUG==="1"&&m.debug("RUNNER",`\u{1F525} Stream ended. toolCalls.length=${Z.length}, fullContent.length=${$.length}`),Z.length>0){let oe=/\[omitted\s+\w+:\s*\d+\s*lines?,\s*\d+\s*chars?\]/i;for(let L of Z){let ee=L.function.arguments||"";if(oe.test(ee)){console.error("[Runner] \u{1F6A8} Placeholder string detected in tool arguments!"),console.error(`[Runner] Tool: ${L.function.name}`),console.error(`[Runner] Arguments preview: ${ee.substring(0,500)}`),yield {type:"raw_response_event",data:{type:"error.placeholder_detected",message:"Model generated placeholder string instead of actual content. This usually happens when the model sees truncated data in conversation history.",tool:L.function.name},event_type:"error.placeholder_detected"},yield {type:"error",error:'Error: Model attempted to write placeholder text ("[omitted ...]") instead of actual content. This happens when conversation history contains truncated data. Please start a new conversation.'},b=!0;break}}if(b)break;if(B!==null&&h+Z.length>B){T="tool_call_limit",b=!0,yield {type:"error",error:`Tool call budget exceeded (max ${B}, requested ${Z.length}). Please summarize progress and ask whether to continue.`};break}if(Z.length>1){let L=Z.map(me=>me.function.name),ee=[...new Set(L)];ee.length===1&&L.length>1?m.info("RUNNER",`\u{1F504} Parallel calls: ${L.length}x ${ee[0]} (different parameters)`):m.info("RUNNER",`\u{1F504} Parallel calls: ${L.join(", ")}`);}let X=new Map;for(let L of Z)X.set(L.id,qo(L.function.arguments));for(let L of Z){h++,yield {type:"run_item_stream_event",name:"tool_called",item:{type:"tool_call_item",id:L.id,name:L.function.name,arguments:L.function.arguments,timestamp:Date.now()}},yield {type:"tool_call_start",id:L.id,name:L.function.name};let me=X.get(L.id),le=me?.ok??!1;le?me?.repaired&&m.warn("RUNNER","Tool arguments repaired from non-standard JSON",{tool:L.function.name,callId:L.id}):je.toolError(L.function.name,`Invalid JSON arguments (${me?.reason||"parse failed"}): ${L.function.arguments.substring(0,200)}...`),yield {type:"tool_call_done",id:L.id,name:L.function.name,arguments:L.function.arguments,success:le},yield {type:"raw_response_event",data:{type:"response.function_call_arguments.done",call_id:L.id,name:L.function.name,arguments:L.function.arguments},event_type:"response.function_call_arguments.done"};}let te=new Set,Y=null,Ae=Z.length>1;process.env.CLI_DEBUG==="1"&&m.debug("RUNNER",`Processing ${Z.length} tool call(s)`,{isParallel:Ae,tools:Z.map(L=>L.function.name)});for(let L of Z){let ee=X.get(L.id);if(!ee?.ok){let Ne=`Invalid JSON arguments for tool "${L.function.name}": ${ee?.reason||"parse failed"}. Return strict JSON object arguments.`;yield {type:"run_item_stream_event",name:"tool_output",item:{type:"tool_call_output_item",id:L.id,name:L.function.name,output:Ne,success:!1,timestamp:Date.now()}},yield {type:"tool_output",id:L.id,name:L.function.name,output:Ne,success:!1},this.memory.addToolResult(L.id,L.function.name,Ne),this.loopDetector.updateLastStatus("error"),te.add(L.id);continue}let me=ee.args,le=this.loopDetector.detect(L.function.name,me);if(this.loopDetector.record(L.function.name,me),le===0)continue;let we=this.loopDetector.generateIntervention(le,L.function.name,me);if(this.memory.add({role:"system",content:we.message}),le===2&&cw(L.function.name))continue;if(yield {type:"run_item_stream_event",name:"tool_output",item:{type:"tool_call_output_item",id:L.id,name:L.function.name,output:we.message,success:!1,timestamp:Date.now()}},yield {type:"tool_output",id:L.id,name:L.function.name,output:we.message,success:!1},this.memory.addToolResult(L.id,L.function.name,we.message),this.loopDetector.updateLastStatus("error"),te.add(L.id),we.shouldTerminate){Y=we;break}}if(Y&&(yield {type:"error",error:Y.message},b=!0),b)break;let ge=te.size>0?Z.filter(L=>!te.has(L.id)):Z,_e=new Set(this.modeStrategy.filterTools(this.tools).map(L=>L.name)),fe=L=>L.replace(/["\s/>]+$/g,"").trim(),Se=[];for(let L of ge){let ee=fe(L.function.name);if(_e.has(ee)||_e.has(L.function.name)){Se.push(L);continue}let me=`Tool "${L.function.name}" is not allowed in ${this.currentMode} mode`;je.toolError(L.function.name,me),yield {type:"run_item_stream_event",name:"tool_output",item:{type:"tool_call_output_item",id:L.id,name:L.function.name,output:me,success:!1,timestamp:Date.now()}},yield {type:"tool_output",id:L.id,name:L.function.name,output:me,success:!1},this.memory.addToolResult(L.id,L.function.name,me),m.info("PERMISSION",`Tool blocked by mode: ${L.function.name} - ${me}`);}if(Se.length===0)continue;let pe=Se.map(L=>({id:L.id,type:"function",function:{name:L.function.name,arguments:(()=>{let ee=X.get(L.id);return ee?.ok?JSON.stringify(ee.args):L.function.arguments})()}})),J=!1;if(process.env.CLI_DEBUG==="1"&&m.debug("RUNNER",`\u{1F525} Before permission check. shouldAutoApprove=${this.modeStrategy.shouldAutoApprove()}, parallelToolCalls=${pe.length}`),!this.modeStrategy.shouldAutoApprove()){let L=new Set;try{for(let ee of Se)try{let me=X.get(ee.id);if(!me?.ok)continue;let le=me.args,we=this.tools.find(ye=>ye.name===ee.function.name);if(!we){m.warn("RUNNER",`Tool not found: ${ee.function.name}`);continue}let We=await hw(n,async()=>this.permissionManager.checkPermission(we,le));if(!We.allowed){L.add(ee.id);let ye=We.reason||`Tool "${ee.function.name}" was denied`;je.toolError(ee.function.name,ye),yield {type:"run_item_stream_event",name:"tool_output",item:{type:"tool_call_output_item",id:ee.id,name:ee.function.name,output:ye,success:!1,timestamp:Date.now()}},yield {type:"tool_output",id:ee.id,name:ee.function.name,output:ye,success:!1};let ot=JSON.stringify({type:"ephemeral",status:"error",tool:ee.function.name,summary:"Tool execution denied by user",error:ye,final:!0});this.memory.addToolResult(ee.id,ee.function.name,ot),m.info("PERMISSION",`Tool denied: ${ee.function.name} - ${ye}`),J=!0;}}catch(me){if(me?.name==="AbortError"||me?.code==="ERR_CANCELED")throw me;je.toolError(ee.function.name,me?.message||"permission check failed");}}catch(ee){if(ee?.name==="AbortError"||ee?.code==="ERR_CANCELED"){m.info("RUNNER","Interrupt detected during permission check"),b=!0;break}throw ee}if(Se=Se.filter(ee=>!L.has(ee.id)),pe=pe.filter(ee=>!L.has(ee.id)),J){m.info("RUNNER","User denied tool - terminating current turn");break}if(pe.length===0)continue}if(process.env.CLI_DEBUG==="1"&&m.debug("RUNNER",`\u{1F525} After permission check. parallelToolCalls=${pe.length}, userDeniedTool=${J}`),this.toolInputGuardrails.length>0){let L=new Set;try{for(let ee of Se)try{let me=X.get(ee.id);if(!me?.ok)continue;let le=me.args,we={tool_name:ee.function.name,tool_input:le,tool_call_id:ee.id},We=this.tools.find(Ne=>Ne.name===ee.function.name);if(!We)continue;this.runContext.iteration=p;let ye=await hw(n,async()=>Es.runToolInputGuardrails(this.toolInputGuardrails,{context:this.runContext,tool_context:we,agent_name:this.agentName,tool:We}));if(!ye.should_execute){L.add(ee.id);let Ne=ye.rejection_message||`Tool ${ee.function.name} was blocked by guardrail`;je.toolError(ee.function.name,`Blocked by guardrail: ${Ne}`),yield {type:"run_item_stream_event",name:"tool_output",item:{type:"tool_call_output_item",id:ee.id,name:ee.function.name,output:Ne,success:!1,timestamp:Date.now()}},yield {type:"tool_output",id:ee.id,name:ee.function.name,output:Ne,success:!1},this.memory.addToolResult(ee.id,ee.function.name,Ne),am(this.runContext,ee.function.name,le,!1);}}catch(me){if(me?.name==="AbortError"||me?.code==="ERR_CANCELED")throw me;if(me instanceof Pn){je.toolError(ee.function.name,`Guardrail tripwire triggered: ${me.message}`),yield {type:"error",error:`Guardrail tripwire triggered for ${ee.function.name}: ${me.message}`},b=!0;break}je.toolError(ee.function.name,`Guardrail check failed: ${me?.message}`);}}catch(ee){if(ee?.name==="AbortError"||ee?.code==="ERR_CANCELED"){m.info("RUNNER","Interrupt detected during guardrails check"),b=!0;break}throw ee}if(b)break;if(Se=Se.filter(ee=>!L.has(ee.id)),pe=pe.filter(ee=>!L.has(ee.id)),pe.length===0)continue}process.env.CLI_DEBUG==="1"&&m.debug("RUNNER",`\u{1F525} Before tool execution. parallelToolCalls=${pe.length}`);let he=await this.parallelExecutor.execute(pe,this.tools,L=>{if(je.toolCall(L.name,{}),L.success){let me=typeof L.output=="string"?L.output.length:JSON.stringify(L.output).length;je.toolResult(L.name,!0,me,L.executionTime||0);}else je.toolError(L.name,L.output);let ee={type:"tool_call_output_item",id:L.id,name:L.name,output:L.output,success:L.success,timestamp:Date.now()};},n),K=0,re=0,se=0,ve=!1;for(let L of he.results){if(this.toolMetricsHistory.push({name:L.name,duration:L.executionTime||0,success:L.success}),this.toolMetricsHistory.length>50&&this.toolMetricsHistory.shift(),yield {type:"run_item_stream_event",name:"tool_output",item:{type:"tool_call_output_item",id:L.id,name:L.name,output:L.output,success:L.success,timestamp:Date.now()}},yield {type:"tool_output",id:L.id,name:L.name,output:L.output,success:L.success},(L.name==="update_plan"||L.name==="call_tool")&&L.success)try{m.info("PLAN_UPDATE","\u{1F525} Detected plan-related tool call",{resultId:L.id,toolName:L.name,toolCallsCount:Z.length});let ye=Z.find(Ne=>Ne.id===L.id);if(ye){m.info("PLAN_UPDATE","\u{1F525} Found original call",{callId:ye.id,argsLength:ye.function.arguments?.length});let Ne=qo(ye.function.arguments||"{}");if(!Ne.ok)throw new Error(Ne.reason||"Invalid update_plan arguments");let ot=Ne.args,Ht=null;if(L.name==="update_plan"?Ht=ot:L.name==="call_tool"&&ot?.name==="update_plan"&&(Ht=ot.args),!Ht||!Array.isArray(Ht.plan))m.debug("PLAN_UPDATE","Skip non-update_plan call_tool",{resultId:L.id,toolName:L.name,callToolName:ot?.name});else {let Fr=!0;if(typeof L.output=="string")try{let br=JSON.parse(L.output);br&&typeof br=="object"&&"success"in br&&(Fr=br.success!==!1);}catch{}Fr?(m.info("PLAN_UPDATE","\u{1F525} Parsed plan args",{hasExplanation:!!Ht.explanation,planSteps:Ht.plan?.length}),yield {type:"plan_update",explanation:Ht.explanation,plan:Ht.plan,timestamp:Date.now()},m.info("PLAN_UPDATE","\u2705 Emitted plan_update event")):m.warn("PLAN_UPDATE","Skip failed update_plan output",{resultId:L.id});}}else m.warn("PLAN_UPDATE","\u274C Could not find original tool call",{resultId:L.id,availableIds:Z.map(Ne=>Ne.id)});}catch(ye){m.error("PLAN_UPDATE","\u274C Failed to parse plan",{error:ye});}let me=typeof L.output=="string"?fw(L.output):fw(JSON.stringify(L.output));me=this.enrichToolResult(me,L.name,L.executionTime||0);let le=Z.find(ye=>ye.id===L.id),we={};if(le){let ye=qo(le.function.arguments||"{}");ye.ok&&(we=ye.args);}if(this.toolOutputGuardrails.length>0)try{let ye=this.tools.find(Ne=>Ne.name===L.name);if(ye){let Ne={tool_name:L.name,tool_input:we,tool_call_id:L.id},ot=await Es.runToolOutputGuardrails(this.toolOutputGuardrails,{context:this.runContext,tool_context:Ne,agent_name:this.agentName,tool:ye,output:L.output});ot.should_use_output||(me=ot.replacement_message||"[Output blocked by guardrail]",je.toolError(L.name,"Output blocked by guardrail"));}}catch(ye){ye instanceof Pn&&je.toolError(L.name,`Output guardrail tripwire triggered: ${ye.message}`);}if(!L.success&&typeof L.output=="string"){let ye=L.output.toLowerCase();if(ye.includes("operation cancelled")||ye.includes("command interrupted")||ye.includes("request aborted")){process.env.CLI_DEBUG_CONSOLE==="1"&&console.log("[Runner] Detected cancellation in tool output, breaking loop"),m.info("RUNNER","\u68C0\u6D4B\u5230\u5DE5\u5177\u4E2D\u65AD\u4FE1\u53F7\uFF0C\u7EC8\u6B62\u6267\u884C\u5FAA\u73AF"),b=!0;break}}am(this.runContext,L.name,we,L.success),m.info("TOOL_RESULT",`\u{1F4E6} Tool raw output: ${L.name}`,{toolName:L.name,success:L.success,rawLength:typeof L.output=="string"?L.output.length:JSON.stringify(L.output).length,truncatedLength:me.length,outputPreview:me.substring(0,500)}),this.memory.addToolResult(L.id,L.name,me);let We=L.success?"success":"error";try{let ye=typeof L.output=="string"?L.output:JSON.stringify(L.output),Ne=JSON.parse(ye);Ne.status==="already_done"?We="already_done":Ne.status==="success"?We="success":Ne.status==="error"&&(We="error");}catch{}if(this.loopDetector.updateLastStatus(We),I.push({iteration:p,name:L.name,status:We,executionTime:L.executionTime||0}),I.length>24&&I.shift(),We==="error"?re++:We==="already_done"?(se++,this.isVerificationTool(L.name)&&(ve=!0)):(K++,this.isVerificationTool(L.name)&&(ve=!0)),We==="error"){let ye=(S.get(L.name)||0)+1;if(S.set(L.name,ye),L.name==="edit_file"&&(ye===2||ye===3)){let Ne=typeof L.output=="string"?L.output:JSON.stringify(L.output),ot=L.name,Ht=ow(ot,Ne);this.memory.add({role:"system",content:Ht});}}else S.set(L.name,0);}if(p>0&&p%5===0){let L=this.buildPerformanceHint();L&&(this.memory.add({role:"system",content:L}),process.env.CLI_DEBUG_CONSOLE==="1"&&console.log("[Runner] Performance hint injected:",L));}let Be=K+se>0;if(E=re>0&&!Be?E+1:0,process.env.CLI_DEBUG==="1"&&m.debug("LOOP_GATE","Iteration quality",{iteration:p,executionTask:D,success:K,alreadyDone:se,error:re,lowProgressStreak:E,verificationSuccess:ve}),D&&E>=2&&(this.memory.add({role:"system",content:this.buildLowProgressReplanPrompt(E)}),v++,E=0,yield {type:"raw_response_event",data:{type:"loop.progress_gate",iteration:p,reason:"low_progress",nudgeCount:v},event_type:"loop.progress_gate"}),process.env.CLI_DEBUG_CONSOLE==="1"&&he.stats&&(yield {type:"raw_response_event",data:{type:"parallel_execution.stats",stats:he.stats},event_type:"parallel_execution.stats"}),n?.aborted){b=!0;break}continue}else {if(this.plannerMode&&C<2&&this.shouldAutoContinuePlan($)){C++;let X=this.buildPlanFollowupPrompt();yield {type:"raw_response_event",data:{type:"plan.auto_continue",plan_text:$,followup_prompt:X,count:C},event_type:"plan.auto_continue"},this.memory.add({role:"user",content:X});continue}if($&&(yield {type:"run_item_stream_event",name:"message_output_created",item:{type:"message_output_item",content:$,role:"assistant",timestamp:Date.now()}}),process.env.CLI_DEBUG==="1"&&(m.info("RUNNER","=== Loop Exit: No Tool Calls ==="),m.info("RUNNER",`Finish Reason: ${ae}`),m.info("RUNNER",`Content Length: ${$.length}`),m.info("RUNNER",`Content Preview: ${$.slice(0,300)}`),m.info("RUNNER",`Tool Calls Count: ${Z.length}`),m.info("RUNNER",`Iteration: ${p}`)),this.structuredValidator){let X=this.structuredValidator.validate($);if(X.ok)g=X.normalized||$,yield {type:"raw_response_event",data:{type:"structured_output.accepted",schema:this.structuredOutput?.name,normalized_text:g,parsed:X.parsed},event_type:"structured_output.accepted"};else {yield {type:"raw_response_event",data:{type:"structured_output.retry",schema:this.structuredOutput?.name,reason:X.reason,message:X.message,errors:X.errors},event_type:"structured_output.retry"},this.memory.add({role:"system",content:this.structuredValidator.buildRetryPrompt(X)}),g="";continue}}else g=$;this.outputGuardrails.length>0&&g&&(yield {type:"raw_response_event",data:{type:"output_guardrails.check_start",count:this.outputGuardrails.length},event_type:"output_guardrails.check_start"},await Es.runOutputGuardrails(this.outputGuardrails,r,this.agentName,g),yield {type:"raw_response_event",data:{type:"output_guardrails.check_passed"},event_type:"output_guardrails.check_passed"});let oe=this.evaluateCompletionEvidence(D,h,I);if(!oe.ok){v++,this.memory.add({role:"system",content:this.buildEvidenceRequiredPrompt(oe.reason)}),process.env.CLI_DEBUG==="1"&&m.debug("LOOP_GATE","Completion blocked: missing evidence",{iteration:p,reason:oe.reason,nudgeCount:v}),yield {type:"raw_response_event",data:{type:"loop.completion_gate",iteration:p,reason:oe.reason,nudgeCount:v},event_type:"loop.completion_gate"};continue}break}}catch(z){if(z?.type==="stream_retry"){M=true,yield z;continue}let q=z instanceof Ye?z:An(z);if(process.env.CLI_DEBUG_CONSOLE==="1"&&console.log("[Runner] Error classified:",{category:q.category,code:q.code,retryable:q.retryable,message:q.message}),q.category==="canceled"){T="interrupted",b=true,yield {type:"error",error:"Task interrupted by user."};break}if(q.retryable&&O<k&&!M){O++;let V=zi(q.category,O,q.retryAfter),Z=q.category==="retryable_rate_limit",ae=q.code==="STREAM_TIMEOUT",be=q.category==="retryable_network"||q.category==="retryable_stream";m.warn("RUNNER",`Retrying after ${ln(V)} (attempt ${O}/${k}): ${q.message}`),yield {type:"raw_response_event",data:{type:"runner.stream_retry",error:q.message,errorCode:q.code,attempt:O,maxRetries:k,delayMs:V,isRateLimit:Z,isStreamTimeout:ae,isNetworkError:be},event_type:"runner.stream_retry"},await So(V),p--;continue}let P=Ql(q),$=q.message;P&&!$.includes(P)&&($=`${$}
|
|
668
|
+
`;return l+d+c}var mw,wR,xR,SR,kR,Fc,sr=R(()=>{_v();Iv();om();lm();Wi();Nv();$v();Qn();xr();ko();Bv();Pc();Ps();ZC();Ca();ne();aw();pg();sg();Oc();pw();un();Oc();un();mw=2e4,wR=15e3;xR=yw("NEOX_STREAM_FIRST_CHUNK_TIMEOUT_MS",6e4),SR=yw("NEOX_STREAM_CHUNK_TIMEOUT_MS",18e4),kR=process.env.NEOX_STREAM_WATCHDOG_DISABLED==="1";Fc=class{llmProvider;providerName;model;tools;memory;config;agentName;agentDescription;instructions;contextInjection;userData;plannerMode;inputGuardrails=[];outputGuardrails=[];toolInputGuardrails=[];toolOutputGuardrails=[];structuredOutput;structuredValidator;maxInputTokensOverride;maxInputTokens;minHistoryMessages;parallelExecutor;unifiedCompressor;compressionMode;toolMetricsHistory=[];workspacePath;disableSystemPrompt;enableFGTS;runContext;permissionManager;modeStrategy;currentMode;loopDetector;enablePlanMode;constructor(e){if(this.llmProvider=e.llmProvider,this.providerName=e.providerName,this.model=e.model,this.tools=e.tools,this.memory=e.memory,this.config=e.config,this.agentName=e.agentName||"DefaultAgent",this.agentDescription=e.agentDescription||"",this.instructions=e.instructions,this.contextInjection=e.contextInjection,this.userData=e.userData,this.plannerMode=e.plannerMode??false,this.structuredOutput=e.structuredOutput,this.maxInputTokensOverride=e.maxInputTokensOverride,this.maxInputTokens=this.computeMaxInputTokens(e.contextWindow,e.tailTokenBudget,this.maxInputTokensOverride),this.minHistoryMessages=Math.max(1,e.minHistoryMessages??6),e.structuredOutput&&(this.structuredValidator=new ec(e.structuredOutput)),this.inputGuardrails=e.inputGuardrails||[],this.outputGuardrails=e.outputGuardrails||[],this.toolInputGuardrails=e.toolInputGuardrails||[],this.toolOutputGuardrails=e.toolOutputGuardrails||[],this.parallelExecutor=new Rc,this.compressionMode=e.compressionMode??"sync",this.workspacePath=e.workspacePath,this.unifiedCompressor=new sc({debug:process.env.CLI_DEBUG==="1",minRecentMessages:this.minHistoryMessages,enableLLMCompression:true}),this.disableSystemPrompt=e.disableSystemPrompt??false,this.enableFGTS=e.enableFGTS??false,this.unifiedCompressor.setLLMProvider(this.llmProvider,this.model),e.contextWindow&&this.unifiedCompressor.setContextWindow(e.contextWindow),this.currentMode=e.config.mode??"agent",this.modeStrategy=yg(this.currentMode),this.permissionManager=e.permissionManager??new os({defaultPermission:"ask"}),this.loopDetector=iw(),this.enablePlanMode=e.enablePlanMode??true,e.approvalHandler){let t=e.approvalHandler;this.permissionManager.setApprovalHandler(async n=>({approved:await t({id:"",name:n.toolName,args:n.args}),remember:false}));}}setApprovalHandler(e){if(!e){this.permissionManager.setApprovalHandler(void 0);return}this.permissionManager.setApprovalHandler(async t=>({approved:await e({id:"",name:t.toolName,args:t.args}),remember:false}));}setMode(e){this.currentMode=e,this.modeStrategy=yg(e),m.info("Runner",`Mode switched to: ${e}`);}getMode(){return this.currentMode}getPermissionManager(){return this.permissionManager}computeMaxInputTokens(e,t,n){if(n&&n>0)return n;let o=e&&e>0?e:19e4,i=.7,a=Math.floor(o*i),l=Math.min(t??mw,Math.floor(o*.1)),c=Math.max(2e3,a-l);if(process.env.CLI_DEBUG==="1"||process.env.CLI_DEBUG_CONSOLE==="1"){let u=`[Context] maxInputTokens=${c} (contextWindow=${o}, override=${n}, tailBudget=${t??mw}, safety=${i})`;console.log(u);}return c}async*withStreamWatchdog(e,t){if(kR){for await(let i of e)yield i;return}let n=e[Symbol.asyncIterator](),r=t?new Promise((i,a)=>{t.aborted?a(Bc()):t.addEventListener("abort",()=>a(Bc()),{once:true});}):null,o=false;for(;;){if(t?.aborted){if(n.return)try{await n.return();}catch{}throw Bc()}let i=o?SR:xR,a=null,l=new Promise((c,u)=>{a=setTimeout(()=>{u(TR(o?"idle":"first_chunk",i));},i);});try{let c=await Promise.race(r?[n.next(),l,r]:[n.next(),l]);if(a&&clearTimeout(a),c.done)return;o=!0,yield c.value;}catch(c){if(a&&clearTimeout(a),n.return)try{await n.return();}catch{}throw c?.code==="STREAM_TIMEOUT"&&m.warn("RUNNER",`[watchdog] ${c.message}`),c}}}async applyContextWindow(e=0){if(!this.maxInputTokens)return null;let t=this.memory.getMessagesForLLM(),n=await this.unifiedCompressor.compressHistory(t,this.maxInputTokens,{iteration:e,enableLLMCompression:true});if(n.stats.droppedMessages>0||n.stats.llmCompressedMessages>0){this.memory.setMessages(n.messages);let r=this.compressionMode==="async"?"Async":"Sync",o=(n.originalTokens/1e3).toFixed(1),i=(n.compressedTokens/1e3).toFixed(1),a=(n.savedTokens/1e3).toFixed(1),l=n.originalCount,c=n.compressedCount;m.info("Context",`[${r}] \u538B\u7F29\u5B8C\u6210: ${l}\u6761/${o}K \u2192 ${c}\u6761/${i}K (\u8282\u7701 ${a}K, \u4E22\u5F03${n.stats.droppedMessages}\u6761, LLM\u538B\u7F29${n.stats.llmCompressedMessages}\u6761)`),n.debugInfo&&n.debugInfo.forEach(u=>m.debug("Context",u));}return n}setCompressionMode(e){this.compressionMode=e,m.info("Context",`Compression mode set to: ${e}`);}getCompressionMode(){return this.compressionMode}async getInstructions(e){if(typeof this.instructions=="string")return this.instructions;let t={name:this.agentName,description:this.agentDescription};return await this.instructions(e,t)}async getContextInjection(e){if(!this.contextInjection)return null;let n=(typeof this.contextInjection=="string"?this.contextInjection:await this.contextInjection(e,{name:this.agentName,description:this.agentDescription}))?.trim();return n||null}shouldIncludeLastRun(e){let t=e.trim().toLowerCase();return t?/上次|之前|前面|上一步|上轮|继续|回顾|resume|continue|previous|last time/.test(t):false}createRunContext(e,t=0){return {task:e,timestamp:Date.now(),currentTime:new Date,iteration:t,userData:this.userData,systemStatus:void 0}}setUserData(e){this.userData={...this.userData,...e};}async*run(e,t,n){this.runContext={task:e,timestamp:Date.now(),currentTime:new Date,iteration:0,userData:this.userData},this.loopDetector.reset(),process.env.CLI_DEBUG==="1"&&(m.debug("MK",` hasSignal: ${!!n}`),m.debug("RUNNER","========================================"),m.debug("RUNNER","=== runner.run ENTRY ==="),m.debug("RUNNER",` task: "${e?.substring(0,50)}..."`),m.debug("RUNNER",` hasImages: ${!!t&&t.length>0}`),m.debug("RUNNER",` hasSignal: ${!!n}`)),je.agentStart(e),yield {type:"agent_updated_stream_event",new_agent:{name:this.agentName}};let r=this.createRunContext(e,0),o=this.memory.hasConversationMessages?.()??this.memory.getMessagesForLLM().some(W=>W.role==="user"||W.role==="assistant"),i=!o||this.shouldIncludeLastRun(e);r.userData={...r.userData??{},hasConversation:o,includeLastRun:i},this.inputGuardrails.length>0&&(yield {type:"raw_response_event",data:{type:"input_guardrails.check_start",count:this.inputGuardrails.length},event_type:"input_guardrails.check_start"},await Es.runInputGuardrails(this.inputGuardrails,r,this.agentName,e),yield {type:"raw_response_event",data:{type:"input_guardrails.check_passed"},event_type:"input_guardrails.check_passed"});let a=await this.getInstructions(r),l=await this.getContextInjection(r);process.env.CLI_DEBUG==="1"&&(console.log("[RUNNER] dynamicInstructions length:",a?.length||0),console.log("[RUNNER] dynamicInstructions START:",a?.substring(0,200)),console.log("[RUNNER] dynamicInstructions END:",a?.substring(a.length-500)),console.log("[RUNNER] contains \u534F\u4F5C\u6A21\u5F0F:",a?.includes("\u534F\u4F5C\u6A21\u5F0F")),console.log("[RUNNER] contains delegate_task:",a?.includes("delegate_task")));let c=this.memory.getMessagesForLLM(),u=c.some(W=>W.role==="system");if(process.env.CLI_DEBUG==="1"&&(console.log("[RUNNER] hasSystemPrompt:",u,"existingMessages count:",c.length),console.log("[RUNNER] disableSystemPrompt:",this.disableSystemPrompt)),this.disableSystemPrompt)u&&this.memory.clear(),a&&this.memory.add({role:"system",content:a});else if(!u){let W=this.modeStrategy.getSystemPrompt();this.memory.add({role:"system",content:W}),this.memory.add({role:"system",content:a}),this.structuredValidator&&this.memory.add({role:"system",content:this.structuredValidator.buildSystemPrompt()});try{let U=await tg(this.workspacePath);U&&this.memory.add({role:"system",content:U});}catch{}}if(l?this.memory.upsertSystemTagged?this.memory.upsertSystemTagged("context_injection",l):u||this.memory.add({role:"system",content:l}):this.memory.removeSystemTagged?.("context_injection"),t&&t.length>0){let W=[{type:"text",text:e},...t.map(U=>({type:"image_url",image_url:{url:U,detail:"auto"}}))];this.memory.add({role:"user",content:W});}else this.memory.add({role:"user",content:e});let d=Date.now(),p=0,g="",h=0,y={totalTokens:0,promptTokens:0,completionTokens:0},b=false,C=0,T=null,S=new Map,E=0,v=0,I=[],D=this.isExecutionOrientedTask(e),O=0,k=Tr.streamMaxRetries,M=false,N=Number.isFinite(this.config.maxIterations)?this.config.maxIterations:xv,x=N===0||N===1/0,B=gw(this.config.maxToolCalls,Sv),H=gw(this.config.maxRuntimeMs,kv);for(;x||p<N;){if(n?.aborted){T="interrupted",b=true,yield {type:"error",error:"Task interrupted by user."};break}if(H!==null&&Date.now()-d>=H){T="runtime_limit",b=true,yield {type:"error",error:`Reached max runtime (${ln(H)}). Please summarize progress and ask whether to continue.`};break}if(B!==null&&h>=B){T="tool_call_limit",b=true,yield {type:"error",error:`Reached max tool calls (${B}). Please summarize progress and ask whether to continue.`};break}p++;let W=null;if(this.maxInputTokens){let z=cn(this.memory.getMessagesForLLM()),q=this.maxInputTokens*.97;z>q&&(W=await this.applyContextWindow(p));}W&&(W.stats.droppedMessages>0||W.stats.llmCompressedMessages>0)&&(yield {type:"context_compaction",status:"completed",originalMessages:W.originalCount,keptMessages:W.messages.length,droppedMessages:W.stats.droppedMessages,compressedMessages:W.stats.llmCompressedMessages,originalTokens:W.originalTokens,finalTokens:W.compressedTokens,budgetTokens:this.maxInputTokens||0,useLLM:W.stats.llmCompressedMessages>0,timestamp:Date.now()});let U=this.memory.checkContextHealth();if((U.warnings.length>0||U.shouldCleanup)&&(yield {type:"raw_response_event",data:{type:"context_health",totalTokens:U.totalTokens,toolResultTokens:U.toolResultTokens,toolResultRatio:U.toolResultRatio,messageCount:U.messageCount,toolMessageCount:U.toolMessageCount,warnings:U.warnings,shouldCompress:U.shouldCompress,shouldCleanup:U.shouldCleanup,byType:U.byType},event_type:"context_health"},U.shouldCleanup&&U.byType.ephemeral.count>5)){let z=this.memory.cleanupEphemeral();z>0&&m.info("Runner",`Cleaned ${z} ephemeral messages`);}m.debug("Runner",this.memory.getTokenSummary()),je.agentIteration(p,"thinking"),yield {type:"iteration_start",iteration:p};try{yield {type:"raw_response_event",data:{type:"response.created",response:{id:`resp_${Date.now()}`,model:this.model}},event_type:"response.created"};let z=this.memory.getMessagesForLLM();if(m.info("LLM",`Request: model=${this.model}, messages=${z.length}, tools=${this.tools.length}`),m.debug("LLM","Request messages",{messageCount:z.length,lastMessage:z[z.length-1]?.content?.toString().substring(0,200)}),process.env.CLI_DEBUG==="1"){let oe=z.filter(X=>X.role==="system");console.log("[RUNNER] System messages count:",oe.length);for(let X=0;X<oe.length;X++){let te=oe[X].content,Y=typeof te=="string"?te:JSON.stringify(te);console.log(`[RUNNER] System[${X}] length:`,Y?.length||0),console.log(`[RUNNER] System[${X}] contains \u534F\u4F5C\u6A21\u5F0F:`,Y?.includes("\u534F\u4F5C\u6A21\u5F0F")||!1),console.log(`[RUNNER] System[${X}] contains delegate_task:`,Y?.includes("delegate_task")||!1),console.log(`[RUNNER] System[${X}] preview:`,Y?.substring(0,300)||"");}}let q=this.modeStrategy.filterTools(this.tools);process.env.CLI_DEBUG==="1"&&m.debug("RUNNER",`Mode: ${this.currentMode}, Available tools: ${q.length}/${this.tools.length}`);let P=this.llmProvider.chatStreamed(this.memory.getMessagesForLLM(),{model:this.model,tools:q,temperature:this.config.temperature,structuredOutput:this.structuredOutput,maxInputTokens:this.maxInputTokens,disableSystemPrompt:this.disableSystemPrompt,enableFGTS:this.enableFGTS,signal:n}),$="",F="",V=[],Z=[],ae="",be={prompt_tokens:0,completion_tokens:0,total_tokens:0};for await(let oe of this.withStreamWatchdog(P,n)){if(oe.type==="stream_retry"){M=!0,yield oe;continue}if(oe.type==="stream_recovered"){yield {type:"stream_recovered",attempt:oe.attempt,maxRetries:oe.maxRetries};continue}yield {type:"raw_response_event",data:oe,event_type:oe.choices?.[0]?.delta?"response.delta":"response.chunk"};let X=oe.choices?.[0]?.delta;if(oe.usage){be={prompt_tokens:oe.usage.prompt_tokens||be.prompt_tokens,completion_tokens:oe.usage.completion_tokens||be.completion_tokens,total_tokens:oe.usage.total_tokens||be.total_tokens,cached_tokens:oe.usage.cached_tokens,cache_read_input_tokens:oe.usage.cache_read_input_tokens,cache_creation_input_tokens:oe.usage.cache_creation_input_tokens,prompt_tokens_details:oe.usage.prompt_tokens_details},y={promptTokens:be.prompt_tokens,completionTokens:be.completion_tokens,totalTokens:be.total_tokens};let te=!!oe.choices?.[0]?.finish_reason;yield {type:"token_usage",usage:be,is_final:te};}if(X){if(X.reasoning_content&&(F+=X.reasoning_content,yield {type:"reasoning_delta",delta:X.reasoning_content}),X.reasoning_complete&&(yield {type:"reasoning_complete"}),X.content&&($+=X.content,g=$,yield {type:"text_delta",delta:X.content}),X.tool_calls)for(let te of X.tool_calls){let Y=te.index;Z[Y]||(Z[Y]={id:te.id||`call_${Math.floor(Date.now())}_${Y}`,type:"function",function:{name:"",arguments:""}}),te.id&&(Z[Y].id=te.id),te.function?.name&&(Z[Y].function.name=te.function.name),te.function?.arguments&&(Z[Y].function.arguments+=te.function.arguments,yield {type:"tool_call_delta",id:Z[Y].id,name:Z[Y].function.name,arguments_delta:te.function.arguments}),te.thoughtSignature&&(Z[Y].thoughtSignature=te.thoughtSignature);}oe.choices?.[0]?.finish_reason&&(ae=oe.choices[0].finish_reason),oe.thinking_blocks&&Array.isArray(oe.thinking_blocks)&&(V=oe.thinking_blocks.map(te=>({type:te.type,thinking:te.thinking,signature:te.signature,data:te.data})));}}$&&(yield {type:"text_done"}),process.env.CLI_DEBUG_CONSOLE==="1"&&process.env.NEOX_UI_MODE==="1"&&console.log("[Runner] \u{1F3AF} Emitting response.completed event (after LLM response)"),yield {type:"raw_response_event",data:{type:"response.completed"},event_type:"response.completed"};let Pe={role:"assistant",content:($||"").trimEnd()};if(F&&(Pe.reasoning_content=F),V.length>0&&(Pe.thinking_blocks=V),Z.length>0&&(Pe.tool_calls=Z.map(oe=>({...oe,function:{...oe.function,arguments:oe.function.arguments}}))),this.memory.add(Pe),process.env.CLI_DEBUG==="1"&&m.debug("RUNNER",`\u{1F525} Stream ended. toolCalls.length=${Z.length}, fullContent.length=${$.length}`),Z.length>0){let oe=/\[omitted\s+\w+:\s*\d+\s*lines?,\s*\d+\s*chars?\]/i;for(let L of Z){let ee=L.function.arguments||"";if(oe.test(ee)){console.error("[Runner] \u{1F6A8} Placeholder string detected in tool arguments!"),console.error(`[Runner] Tool: ${L.function.name}`),console.error(`[Runner] Arguments preview: ${ee.substring(0,500)}`),yield {type:"raw_response_event",data:{type:"error.placeholder_detected",message:"Model generated placeholder string instead of actual content. This usually happens when the model sees truncated data in conversation history.",tool:L.function.name},event_type:"error.placeholder_detected"},yield {type:"error",error:'Error: Model attempted to write placeholder text ("[omitted ...]") instead of actual content. This happens when conversation history contains truncated data. Please start a new conversation.'},b=!0;break}}if(b)break;if(B!==null&&h+Z.length>B){T="tool_call_limit",b=!0,yield {type:"error",error:`Tool call budget exceeded (max ${B}, requested ${Z.length}). Please summarize progress and ask whether to continue.`};break}if(Z.length>1){let L=Z.map(me=>me.function.name),ee=[...new Set(L)];ee.length===1&&L.length>1?m.info("RUNNER",`\u{1F504} Parallel calls: ${L.length}x ${ee[0]} (different parameters)`):m.info("RUNNER",`\u{1F504} Parallel calls: ${L.join(", ")}`);}let X=new Map;for(let L of Z)X.set(L.id,qo(L.function.arguments));for(let L of Z){h++,yield {type:"run_item_stream_event",name:"tool_called",item:{type:"tool_call_item",id:L.id,name:L.function.name,arguments:L.function.arguments,timestamp:Date.now()}},yield {type:"tool_call_start",id:L.id,name:L.function.name};let me=X.get(L.id),le=me?.ok??!1;le?me?.repaired&&m.warn("RUNNER","Tool arguments repaired from non-standard JSON",{tool:L.function.name,callId:L.id}):je.toolError(L.function.name,`Invalid JSON arguments (${me?.reason||"parse failed"}): ${L.function.arguments.substring(0,200)}...`),yield {type:"tool_call_done",id:L.id,name:L.function.name,arguments:L.function.arguments,success:le},yield {type:"raw_response_event",data:{type:"response.function_call_arguments.done",call_id:L.id,name:L.function.name,arguments:L.function.arguments},event_type:"response.function_call_arguments.done"};}let te=new Set,Y=null,Ae=Z.length>1;process.env.CLI_DEBUG==="1"&&m.debug("RUNNER",`Processing ${Z.length} tool call(s)`,{isParallel:Ae,tools:Z.map(L=>L.function.name)});for(let L of Z){let ee=X.get(L.id);if(!ee?.ok){let Ne=`Invalid JSON arguments for tool "${L.function.name}": ${ee?.reason||"parse failed"}. Return strict JSON object arguments.`;yield {type:"run_item_stream_event",name:"tool_output",item:{type:"tool_call_output_item",id:L.id,name:L.function.name,output:Ne,success:!1,timestamp:Date.now()}},yield {type:"tool_output",id:L.id,name:L.function.name,output:Ne,success:!1},this.memory.addToolResult(L.id,L.function.name,Ne),this.loopDetector.updateLastStatus("error"),te.add(L.id);continue}let me=ee.args,le=this.loopDetector.detect(L.function.name,me);if(this.loopDetector.record(L.function.name,me),le===0)continue;let we=this.loopDetector.generateIntervention(le,L.function.name,me);if(this.memory.add({role:"system",content:we.message}),le===2&&cw(L.function.name))continue;if(yield {type:"run_item_stream_event",name:"tool_output",item:{type:"tool_call_output_item",id:L.id,name:L.function.name,output:we.message,success:!1,timestamp:Date.now()}},yield {type:"tool_output",id:L.id,name:L.function.name,output:we.message,success:!1},this.memory.addToolResult(L.id,L.function.name,we.message),this.loopDetector.updateLastStatus("error"),te.add(L.id),we.shouldTerminate){Y=we;break}}if(Y&&(yield {type:"error",error:Y.message},b=!0),b)break;let ge=te.size>0?Z.filter(L=>!te.has(L.id)):Z,_e=new Set(this.modeStrategy.filterTools(this.tools).map(L=>L.name)),fe=L=>L.replace(/["\s/>]+$/g,"").trim(),Se=[];for(let L of ge){let ee=fe(L.function.name);if(_e.has(ee)||_e.has(L.function.name)){Se.push(L);continue}let me=`Tool "${L.function.name}" is not allowed in ${this.currentMode} mode`;je.toolError(L.function.name,me),yield {type:"run_item_stream_event",name:"tool_output",item:{type:"tool_call_output_item",id:L.id,name:L.function.name,output:me,success:!1,timestamp:Date.now()}},yield {type:"tool_output",id:L.id,name:L.function.name,output:me,success:!1},this.memory.addToolResult(L.id,L.function.name,me),m.info("PERMISSION",`Tool blocked by mode: ${L.function.name} - ${me}`);}if(Se.length===0)continue;let pe=Se.map(L=>({id:L.id,type:"function",function:{name:L.function.name,arguments:(()=>{let ee=X.get(L.id);return ee?.ok?JSON.stringify(ee.args):L.function.arguments})()}})),J=!1;if(process.env.CLI_DEBUG==="1"&&m.debug("RUNNER",`\u{1F525} Before permission check. shouldAutoApprove=${this.modeStrategy.shouldAutoApprove()}, parallelToolCalls=${pe.length}`),!this.modeStrategy.shouldAutoApprove()){let L=new Set;try{for(let ee of Se)try{let me=X.get(ee.id);if(!me?.ok)continue;let le=me.args,we=this.tools.find(ye=>ye.name===ee.function.name);if(!we){m.warn("RUNNER",`Tool not found: ${ee.function.name}`);continue}let We=await hw(n,async()=>this.permissionManager.checkPermission(we,le));if(!We.allowed){L.add(ee.id);let ye=We.reason||`Tool "${ee.function.name}" was denied`;je.toolError(ee.function.name,ye),yield {type:"run_item_stream_event",name:"tool_output",item:{type:"tool_call_output_item",id:ee.id,name:ee.function.name,output:ye,success:!1,timestamp:Date.now()}},yield {type:"tool_output",id:ee.id,name:ee.function.name,output:ye,success:!1};let it=JSON.stringify({type:"ephemeral",status:"error",tool:ee.function.name,summary:"Tool execution denied by user",error:ye,final:!0});this.memory.addToolResult(ee.id,ee.function.name,it),m.info("PERMISSION",`Tool denied: ${ee.function.name} - ${ye}`),J=!0;}}catch(me){if(me?.name==="AbortError"||me?.code==="ERR_CANCELED")throw me;je.toolError(ee.function.name,me?.message||"permission check failed");}}catch(ee){if(ee?.name==="AbortError"||ee?.code==="ERR_CANCELED"){m.info("RUNNER","Interrupt detected during permission check"),b=!0;break}throw ee}if(Se=Se.filter(ee=>!L.has(ee.id)),pe=pe.filter(ee=>!L.has(ee.id)),J){m.info("RUNNER","User denied tool - terminating current turn");break}if(pe.length===0)continue}if(process.env.CLI_DEBUG==="1"&&m.debug("RUNNER",`\u{1F525} After permission check. parallelToolCalls=${pe.length}, userDeniedTool=${J}`),this.toolInputGuardrails.length>0){let L=new Set;try{for(let ee of Se)try{let me=X.get(ee.id);if(!me?.ok)continue;let le=me.args,we={tool_name:ee.function.name,tool_input:le,tool_call_id:ee.id},We=this.tools.find(Ne=>Ne.name===ee.function.name);if(!We)continue;this.runContext.iteration=p;let ye=await hw(n,async()=>Es.runToolInputGuardrails(this.toolInputGuardrails,{context:this.runContext,tool_context:we,agent_name:this.agentName,tool:We}));if(!ye.should_execute){L.add(ee.id);let Ne=ye.rejection_message||`Tool ${ee.function.name} was blocked by guardrail`;je.toolError(ee.function.name,`Blocked by guardrail: ${Ne}`),yield {type:"run_item_stream_event",name:"tool_output",item:{type:"tool_call_output_item",id:ee.id,name:ee.function.name,output:Ne,success:!1,timestamp:Date.now()}},yield {type:"tool_output",id:ee.id,name:ee.function.name,output:Ne,success:!1},this.memory.addToolResult(ee.id,ee.function.name,Ne),am(this.runContext,ee.function.name,le,!1);}}catch(me){if(me?.name==="AbortError"||me?.code==="ERR_CANCELED")throw me;if(me instanceof Pn){je.toolError(ee.function.name,`Guardrail tripwire triggered: ${me.message}`),yield {type:"error",error:`Guardrail tripwire triggered for ${ee.function.name}: ${me.message}`},b=!0;break}je.toolError(ee.function.name,`Guardrail check failed: ${me?.message}`);}}catch(ee){if(ee?.name==="AbortError"||ee?.code==="ERR_CANCELED"){m.info("RUNNER","Interrupt detected during guardrails check"),b=!0;break}throw ee}if(b)break;if(Se=Se.filter(ee=>!L.has(ee.id)),pe=pe.filter(ee=>!L.has(ee.id)),pe.length===0)continue}process.env.CLI_DEBUG==="1"&&m.debug("RUNNER",`\u{1F525} Before tool execution. parallelToolCalls=${pe.length}`);let he=await this.parallelExecutor.execute(pe,this.tools,L=>{if(je.toolCall(L.name,{}),L.success){let me=typeof L.output=="string"?L.output.length:JSON.stringify(L.output).length;je.toolResult(L.name,!0,me,L.executionTime||0);}else je.toolError(L.name,L.output);let ee={type:"tool_call_output_item",id:L.id,name:L.name,output:L.output,success:L.success,timestamp:Date.now()};},n),K=0,re=0,se=0,ve=!1;for(let L of he.results){if(this.toolMetricsHistory.push({name:L.name,duration:L.executionTime||0,success:L.success}),this.toolMetricsHistory.length>50&&this.toolMetricsHistory.shift(),yield {type:"run_item_stream_event",name:"tool_output",item:{type:"tool_call_output_item",id:L.id,name:L.name,output:L.output,success:L.success,timestamp:Date.now()}},yield {type:"tool_output",id:L.id,name:L.name,output:L.output,success:L.success},(L.name==="update_plan"||L.name==="call_tool")&&L.success)try{m.info("PLAN_UPDATE","\u{1F525} Detected plan-related tool call",{resultId:L.id,toolName:L.name,toolCallsCount:Z.length});let ye=Z.find(Ne=>Ne.id===L.id);if(ye){m.info("PLAN_UPDATE","\u{1F525} Found original call",{callId:ye.id,argsLength:ye.function.arguments?.length});let Ne=qo(ye.function.arguments||"{}");if(!Ne.ok)throw new Error(Ne.reason||"Invalid update_plan arguments");let it=Ne.args,Ht=null;if(L.name==="update_plan"?Ht=it:L.name==="call_tool"&&it?.name==="update_plan"&&(Ht=it.args),!Ht||!Array.isArray(Ht.plan))m.debug("PLAN_UPDATE","Skip non-update_plan call_tool",{resultId:L.id,toolName:L.name,callToolName:it?.name});else {let Fr=!0;if(typeof L.output=="string")try{let br=JSON.parse(L.output);br&&typeof br=="object"&&"success"in br&&(Fr=br.success!==!1);}catch{}Fr?(m.info("PLAN_UPDATE","\u{1F525} Parsed plan args",{hasExplanation:!!Ht.explanation,planSteps:Ht.plan?.length}),yield {type:"plan_update",explanation:Ht.explanation,plan:Ht.plan,timestamp:Date.now()},m.info("PLAN_UPDATE","\u2705 Emitted plan_update event")):m.warn("PLAN_UPDATE","Skip failed update_plan output",{resultId:L.id});}}else m.warn("PLAN_UPDATE","\u274C Could not find original tool call",{resultId:L.id,availableIds:Z.map(Ne=>Ne.id)});}catch(ye){m.error("PLAN_UPDATE","\u274C Failed to parse plan",{error:ye});}let me=typeof L.output=="string"?fw(L.output):fw(JSON.stringify(L.output));me=this.enrichToolResult(me,L.name,L.executionTime||0);let le=Z.find(ye=>ye.id===L.id),we={};if(le){let ye=qo(le.function.arguments||"{}");ye.ok&&(we=ye.args);}if(this.toolOutputGuardrails.length>0)try{let ye=this.tools.find(Ne=>Ne.name===L.name);if(ye){let Ne={tool_name:L.name,tool_input:we,tool_call_id:L.id},it=await Es.runToolOutputGuardrails(this.toolOutputGuardrails,{context:this.runContext,tool_context:Ne,agent_name:this.agentName,tool:ye,output:L.output});it.should_use_output||(me=it.replacement_message||"[Output blocked by guardrail]",je.toolError(L.name,"Output blocked by guardrail"));}}catch(ye){ye instanceof Pn&&je.toolError(L.name,`Output guardrail tripwire triggered: ${ye.message}`);}if(!L.success&&typeof L.output=="string"){let ye=L.output.toLowerCase();if(ye.includes("operation cancelled")||ye.includes("command interrupted")||ye.includes("request aborted")){process.env.CLI_DEBUG_CONSOLE==="1"&&console.log("[Runner] Detected cancellation in tool output, breaking loop"),m.info("RUNNER","\u68C0\u6D4B\u5230\u5DE5\u5177\u4E2D\u65AD\u4FE1\u53F7\uFF0C\u7EC8\u6B62\u6267\u884C\u5FAA\u73AF"),b=!0;break}}am(this.runContext,L.name,we,L.success),m.info("TOOL_RESULT",`\u{1F4E6} Tool raw output: ${L.name}`,{toolName:L.name,success:L.success,rawLength:typeof L.output=="string"?L.output.length:JSON.stringify(L.output).length,truncatedLength:me.length,outputPreview:me.substring(0,500)}),this.memory.addToolResult(L.id,L.name,me);let We=L.success?"success":"error";try{let ye=typeof L.output=="string"?L.output:JSON.stringify(L.output),Ne=JSON.parse(ye);Ne.status==="already_done"?We="already_done":Ne.status==="success"?We="success":Ne.status==="error"&&(We="error");}catch{}if(this.loopDetector.updateLastStatus(We),I.push({iteration:p,name:L.name,status:We,executionTime:L.executionTime||0}),I.length>24&&I.shift(),We==="error"?re++:We==="already_done"?(se++,this.isVerificationTool(L.name)&&(ve=!0)):(K++,this.isVerificationTool(L.name)&&(ve=!0)),We==="error"){let ye=(S.get(L.name)||0)+1;if(S.set(L.name,ye),L.name==="edit_file"&&(ye===2||ye===3)){let Ne=typeof L.output=="string"?L.output:JSON.stringify(L.output),it=L.name,Ht=ow(it,Ne);this.memory.add({role:"system",content:Ht});}}else S.set(L.name,0);}if(p>0&&p%5===0){let L=this.buildPerformanceHint();L&&(this.memory.add({role:"system",content:L}),process.env.CLI_DEBUG_CONSOLE==="1"&&console.log("[Runner] Performance hint injected:",L));}let Be=K+se>0;if(E=re>0&&!Be?E+1:0,process.env.CLI_DEBUG==="1"&&m.debug("LOOP_GATE","Iteration quality",{iteration:p,executionTask:D,success:K,alreadyDone:se,error:re,lowProgressStreak:E,verificationSuccess:ve}),D&&E>=2&&(this.memory.add({role:"system",content:this.buildLowProgressReplanPrompt(E)}),v++,E=0,yield {type:"raw_response_event",data:{type:"loop.progress_gate",iteration:p,reason:"low_progress",nudgeCount:v},event_type:"loop.progress_gate"}),process.env.CLI_DEBUG_CONSOLE==="1"&&he.stats&&(yield {type:"raw_response_event",data:{type:"parallel_execution.stats",stats:he.stats},event_type:"parallel_execution.stats"}),n?.aborted){b=!0;break}continue}else {if(this.plannerMode&&C<2&&this.shouldAutoContinuePlan($)){C++;let X=this.buildPlanFollowupPrompt();yield {type:"raw_response_event",data:{type:"plan.auto_continue",plan_text:$,followup_prompt:X,count:C},event_type:"plan.auto_continue"},this.memory.add({role:"user",content:X});continue}if($&&(yield {type:"run_item_stream_event",name:"message_output_created",item:{type:"message_output_item",content:$,role:"assistant",timestamp:Date.now()}}),process.env.CLI_DEBUG==="1"&&(m.info("RUNNER","=== Loop Exit: No Tool Calls ==="),m.info("RUNNER",`Finish Reason: ${ae}`),m.info("RUNNER",`Content Length: ${$.length}`),m.info("RUNNER",`Content Preview: ${$.slice(0,300)}`),m.info("RUNNER",`Tool Calls Count: ${Z.length}`),m.info("RUNNER",`Iteration: ${p}`)),this.structuredValidator){let X=this.structuredValidator.validate($);if(X.ok)g=X.normalized||$,yield {type:"raw_response_event",data:{type:"structured_output.accepted",schema:this.structuredOutput?.name,normalized_text:g,parsed:X.parsed},event_type:"structured_output.accepted"};else {yield {type:"raw_response_event",data:{type:"structured_output.retry",schema:this.structuredOutput?.name,reason:X.reason,message:X.message,errors:X.errors},event_type:"structured_output.retry"},this.memory.add({role:"system",content:this.structuredValidator.buildRetryPrompt(X)}),g="";continue}}else g=$;this.outputGuardrails.length>0&&g&&(yield {type:"raw_response_event",data:{type:"output_guardrails.check_start",count:this.outputGuardrails.length},event_type:"output_guardrails.check_start"},await Es.runOutputGuardrails(this.outputGuardrails,r,this.agentName,g),yield {type:"raw_response_event",data:{type:"output_guardrails.check_passed"},event_type:"output_guardrails.check_passed"});let oe=this.evaluateCompletionEvidence(D,h,I);if(!oe.ok){v++,this.memory.add({role:"system",content:this.buildEvidenceRequiredPrompt(oe.reason)}),process.env.CLI_DEBUG==="1"&&m.debug("LOOP_GATE","Completion blocked: missing evidence",{iteration:p,reason:oe.reason,nudgeCount:v}),yield {type:"raw_response_event",data:{type:"loop.completion_gate",iteration:p,reason:oe.reason,nudgeCount:v},event_type:"loop.completion_gate"};continue}break}}catch(z){if(z?.type==="stream_retry"){M=true,yield z;continue}let q=z instanceof Xe?z:An(z);if(process.env.CLI_DEBUG_CONSOLE==="1"&&console.log("[Runner] Error classified:",{category:q.category,code:q.code,retryable:q.retryable,message:q.message}),q.category==="canceled"){T="interrupted",b=true,yield {type:"error",error:"Task interrupted by user."};break}if(q.retryable&&O<k&&!M){O++;let V=zi(q.category,O,q.retryAfter),Z=q.category==="retryable_rate_limit",ae=q.code==="STREAM_TIMEOUT",be=q.category==="retryable_network"||q.category==="retryable_stream";m.warn("RUNNER",`Retrying after ${ln(V)} (attempt ${O}/${k}): ${q.message}`),yield {type:"raw_response_event",data:{type:"runner.stream_retry",error:q.message,errorCode:q.code,attempt:O,maxRetries:k,delayMs:V,isRateLimit:Z,isStreamTimeout:ae,isNetworkError:be},event_type:"runner.stream_retry"},await So(V),p--;continue}let P=Ql(q),$=q.message;P&&!$.includes(P)&&($=`${$}
|
|
669
669
|
|
|
670
670
|
\u{1F4A1} Suggestion: ${P}`),b=true;let F=Lv($,{providerName:this.providerName});je.agentError(F),yield {type:"raw_response_event",data:{type:"error.classified",category:q.category,code:q.code,message:q.message,retryable:q.retryable,suggestion:P,context:q.context},event_type:"error.classified"},yield {type:"error",error:F};break}}!b&&!x&&p>=N&&!g&&(T=T||"iteration_limit",b=true,yield {type:"error",error:`Reached max iterations (${N}). Please summarize progress and ask whether to continue.`}),b||(je.agentComplete(p,h,y),m.info("LLM",`Complete: iterations=${p}, toolCalls=${h}, tokens=${y.totalTokens} (prompt=${y.promptTokens}, completion=${y.completionTokens})`)),process.env.CLI_DEBUG==="1"&&(m.debug("RUNNER","=== runner.run COMPLETING ==="),m.debug("RUNNER",` iterations: ${p}`),m.debug("RUNNER",` toolCalls: ${h}`),m.debug("RUNNER",` encounteredError: ${b}`),T&&m.debug("RUNNER",` stoppedBy: ${T}`)),yield {type:"run_done"},process.env.CLI_DEBUG==="1"&&m.debug("RUNNER","=== runner.run END (run_done yielded) ===");}shouldAutoContinuePlan(e){if(!this.plannerMode)return false;let t=(e||"").trim();if(t.length<40)return false;let n=t.toLowerCase();return ["planned steps","plan:","execution plan","\u884C\u52A8\u8BA1\u5212","\u8BA1\u5212\uFF1A","\u8BA1\u5212\u5982\u4E0B","\u65B9\u6848\uFF1A","\u6B65\u9AA4\u8BA1\u5212"].some(a=>n.includes(a))?(t.match(/(^|\n)\s*[-*•]\s+/g)||[]).length+(t.match(/(^|\n)\s*\d+\.\s+/g)||[]).length>=2:false}buildPlanFollowupPrompt(){return "Plan approved. Continue executing the plan step by step and start working immediately."}isExecutionOrientedTask(e){let t=(e||"").toLowerCase();return t.trim()?/(修复|修改|实现|编写|重构|新增|删除|运行|测试|构建|验证|fix|implement|write|edit|refactor|run|test|build|validate|debug)/i.test(t):false}isVerificationTool(e){let t=(e||"").toLowerCase();return t.includes("read")||t.includes("search")||t.includes("grep")||t.includes("test")||t.includes("lint")||t.includes("build")||t.includes("check")||t.includes("execute_shell")||t==="bash"}isMutationTool(e){let t=(e||"").toLowerCase();return t.includes("write")||t.includes("edit")||t.includes("create")||t.includes("delete")||t.includes("rename")}evaluateCompletionEvidence(e,t,n){if(this.currentMode==="auto")return {ok:true,reason:"assistant_mode"};if(!e)return {ok:true,reason:"non_execution_task"};if(t===0)return {ok:false,reason:"no_tool_execution"};let o=n.slice(-10).filter(l=>l.status==="success"||l.status==="already_done");return o.length===0?{ok:false,reason:"no_successful_tool_result"}:o.some(l=>this.isVerificationTool(l.name))?{ok:true,reason:"verified"}:o.some(l=>this.isMutationTool(l.name))?{ok:false,reason:"missing_validation_after_mutation"}:{ok:true,reason:"sufficient_success"}}buildLowProgressReplanPrompt(e){return ["[LOOP OPTIMIZER NOTICE]",`You had ${e} low-progress iterations (mostly failed tool calls).`,"Pause and re-plan before next tool call.","Required:","1) Briefly state root cause of previous failures.","2) Choose a different tool/argument strategy.","3) Run one verification step to confirm progress."].join(`
|
|
671
671
|
`)}buildEvidenceRequiredPrompt(e){return ["[COMPLETION GATE]",`Cannot conclude task yet: ${e}.`,"Before final answer, provide concrete execution evidence:","- If code/files changed, verify via read/test/build/lint/check command.","- If command already ran, quote key output signals.","Then continue and finish only after evidence is present."].join(`
|
|
@@ -1296,19 +1296,19 @@ A: ${r}`);}return t.join(`
|
|
|
1296
1296
|
\u53C2\u6570\uFF1A
|
|
1297
1297
|
- questions: \u95EE\u9898\u6570\u7EC4\uFF081-4 \u4E2A\uFF09\uFF0C\u6BCF\u4E2A\u5305\u542B question \u6587\u672C\u548C options \u9009\u9879\u5217\u8868
|
|
1298
1298
|
- \u7528\u6237\u53EF\u4EE5\u9009\u62E9\u9884\u8BBE\u9009\u9879\uFF0C\u4E5F\u53EF\u4EE5\u8F93\u5165\u81EA\u5B9A\u4E49\u56DE\u7B54`,parameters:{type:"object",properties:{questions:{type:"array",items:{type:"object",properties:{question:{type:"string",description:"\u95EE\u9898\u6587\u672C"},options:{type:"array",items:{type:"object",properties:{label:{type:"string",description:"\u9009\u9879\u6807\u7B7E"},description:{type:"string",description:"\u9009\u9879\u8BF4\u660E"}},required:["label"]},description:"\u53EF\u9009\u9879\u5217\u8868\uFF082-4 \u4E2A\uFF09"},multiSelect:{type:"boolean",description:"\u662F\u5426\u5141\u8BB8\u591A\u9009"}},required:["question","options"]},description:"\u95EE\u9898\u5217\u8868\uFF081-4 \u4E2A\uFF09"}},required:["questions"]},async function(s,e){let t=s.questions||[];if(t.length===0)return "[ERROR] \u9700\u8981\u81F3\u5C11\u4E00\u4E2A\u95EE\u9898";let n=`ask_user_${++wL}_${Date.now()}`;return new Promise(r=>{js.set(n,{resolve:r,questions:t}),as=n,oh&&oh(n,t),e?.signal&&e.signal.addEventListener("abort",()=>{js.has(n)&&(r("[\u7528\u6237\u4E2D\u65AD]"),js.delete(n),as===n&&(as=null));},{once:true}),setTimeout(()=>{js.has(n)&&(r("[\u8D85\u65F6] \u7528\u6237\u672A\u5728 5 \u5206\u949F\u5185\u56DE\u7B54"),js.delete(n),as===n&&(as=null));},300*1e3);})}};});function xL(s){let e={named:{},positional:[],raw:s};if(!s.trim())return e;let t=[],n="",r=false,o="";for(let i of s)(i==='"'||i==="'")&&!r?(r=true,o=i):i===o&&r?(r=false,o=""):i===" "&&!r?(n.trim()&&t.push(n.trim()),n=""):n+=i;n.trim()&&t.push(n.trim());for(let i=0;i<t.length;i++){let a=t[i];if(a.startsWith("--")){let l=a.indexOf("=");if(l>0){let c=a.slice(2,l),u=a.slice(l+1);e.named[c]=u;}else {let c=a.slice(2),u=t[i+1];u&&!u.startsWith("-")?(e.named[c]=u,i++):e.named[c]="true";}}else if(a.startsWith("-")&&a.length===2){let l=a.slice(1),c=t[i+1];c&&!c.startsWith("-")?(e.named[l]=c,i++):e.named[l]="true";}else e.positional.push(a);}return e}var Gs,lu=R(()=>{Gs=class{constructor(e){this.registry=e;}async execute(e,t,n){let r=this.registry.find(e);if(!r)return {success:false,error:`Skill not found: ${e}`};try{let o=xL(t);return {success:!0,output:this.buildPrompt(r,o,n)}}catch(o){return {success:false,error:o instanceof Error?o.message:String(o)}}}buildPrompt(e,t,n){let r=[];if(r.push(`# Skill: ${e.metadata.name}`),r.push(""),t.raw&&(r.push("## User Arguments"),r.push(`Raw: ${t.raw}`),Object.keys(t.named).length>0&&r.push(`Named: ${JSON.stringify(t.named)}`),t.positional.length>0&&r.push(`Positional: ${t.positional.join(", ")}`),r.push("")),r.push("## Context"),r.push(`Working Directory: ${n.workDir}`),r.push(""),r.push(e.content),e.supportFiles&&e.supportFiles.size>0){r.push(""),r.push("## Support Files");for(let[o,i]of Array.from(e.supportFiles.entries()))r.push(`### ${o}`),r.push("```"),r.push(i),r.push("```");}return r.join(`
|
|
1299
|
-
`)}getAllowedTools(e){return e.metadata.neox?.allowedTools}getRequiredTools(e){return e.metadata.neox?.requiredTools}getDangerLevel(e){return e.metadata.neox?.dangerLevel??"safe"}};});function PL(s){Ft=s,
|
|
1299
|
+
`)}getAllowedTools(e){return e.metadata.neox?.allowedTools}getRequiredTools(e){return e.metadata.neox?.requiredTools}getDangerLevel(e){return e.metadata.neox?.dangerLevel??"safe"}};});function PL(s){Ft=s,Ze=s.logger;}function LT(s){Ws=s;}function RL(s,e){return e?s.filter(t=>!t.capabilities||t.capabilities.length===0?true:t.capabilities.every(n=>e[n]===true)):s}async function NT(s){await(s??Ft).shellEnv.preloadShellEnv();}function DL(){let s=process.env.NEOX_WORKER_ENTRY;if(s&&wt__default.existsSync(s))return s;try{let n=fileURLToPath(import.meta.url),r=Ie__default.resolve(Ie__default.dirname(n),".."),o=Ie__default.join(r,"cli","main.js");if(wt__default.existsSync(o))return o}catch{}let e=process.argv[1];if(e&&e.endsWith(".js")&&wt__default.existsSync(e)&&e.includes("cli")&&e.includes("main"))return e;let t=Ie__default.resolve(process.cwd(),"dist","cli","main.js");return wt__default.existsSync(t)?t:null}async function LL(s,e,t,n){if(process.env.NEOX_SHELL_WORKER_DISABLED==="1")return null;let r=DL();return r?new Promise(o=>{let i=fork(r,[],{env:{...process.env,[EL]:"execute_shell"},stdio:["ignore","ignore","ignore","ipc"]}),a=false,l=Number(process.env.NEOX_SHELL_WORKER_WATCHDOG_MS)||6e4,c=setTimeout(()=>{Ze.warn("SHELL_WORKER",`execute_shell running > ${l}ms`,{command:s});},l),u=()=>{clearTimeout(c),n&&n.removeEventListener("abort",p),i.removeAllListeners();},d=g=>{a||(a=true,u(),o(g));},p=()=>{i.connected&&i.send({type:"abort"}),setTimeout(()=>{if(!a){try{i.kill("SIGTERM");}catch{}d({success:true,output:`\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1300
1300
|
\u25B8 \u5DE5\u4F5C\u76EE\u5F55: ${t}
|
|
1301
1301
|
\u25B8 \u6267\u884C\u547D\u4EE4: ${s}
|
|
1302
1302
|
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1303
1303
|
|
|
1304
1304
|
\u26A0 \u547D\u4EE4\u88AB\u7528\u6237\u4E2D\u65AD
|
|
1305
|
-
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501`,background:false});}},500),setTimeout(()=>{if(!a)try{i.kill("SIGKILL");}catch{}},2e3);};n&&(n.aborted?p():n.addEventListener("abort",p,{once:true})),i.on("message",g=>{if(!(!g||typeof g!="object")){if(g.type==="background_exit"){typeof g.pid=="number"&&(Ft.processManager.markCompleted(g.pid,g.exitCode??0),Ws?.onUpdateByPid?.(g.pid,{status:(g.exitCode??0)===0?"done":"error",exitCode:g.exitCode??0}));return}g.type==="result"&&d({success:!!g.success,output:String(g.output??""),background:!!g.background,pid:typeof g.pid=="number"?g.pid:void 0,exitCode:typeof g.exitCode=="number"?g.exitCode:void 0});}}),i.on("exit",g=>{a||(
|
|
1305
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501`,background:false});}},500),setTimeout(()=>{if(!a)try{i.kill("SIGKILL");}catch{}},2e3);};n&&(n.aborted?p():n.addEventListener("abort",p,{once:true})),i.on("message",g=>{if(!(!g||typeof g!="object")){if(g.type==="background_exit"){typeof g.pid=="number"&&(Ft.processManager.markCompleted(g.pid,g.exitCode??0),Ws?.onUpdateByPid?.(g.pid,{status:(g.exitCode??0)===0?"done":"error",exitCode:g.exitCode??0}));return}g.type==="result"&&d({success:!!g.success,output:String(g.output??""),background:!!g.background,pid:typeof g.pid=="number"?g.pid:void 0,exitCode:typeof g.exitCode=="number"?g.exitCode:void 0});}}),i.on("exit",g=>{a||(Ze.warn("SHELL_WORKER","Worker exited before result",{code:g,command:s}),d(null));}),i.send({type:"execute_shell",payload:{command:s,background:e,workspaceRoot:t}});}):(Ze.warn("SHELL_WORKER","Worker entry not found, fallback to inline execution"),null)}function $L(){return NL}function ST(s){return s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function dn(){let s=process.env[DT];return s&&s.trim()?Ie__default.resolve(s):process.cwd()}function Ut(s){let e=dn();if(!s||s.trim()===""||s.trim()===".")return e;let t=s.trim();if(t.startsWith("~/"))return Ie__default.resolve(Ie__default.join(ho__default.homedir(),t.slice(2)));let n=Ie__default.isAbsolute(t),r=process.platform!=="win32"&&t.startsWith(`Users${Ie__default.sep}`);if(n||r){let l=!n&&r?Ie__default.join(Ie__default.sep,t):t;return Ie__default.resolve(l)}t=t.replace(/^[.\\/]+/,"");let o=t.split(/[\\/]+/).filter(Boolean),i=Ie__default.basename(e);o.length>0&&o[0]===i&&o.shift();let a=Ie__default.join(e,...o);return Ie__default.resolve(a)}function It(s){let e=dn(),t=Ie__default.relative(e,s);return t&&!t.startsWith("..")&&!Ie__default.isAbsolute(t)?t:s}function Rr(s){let e=dn(),t=Ie__default.relative(e,s);return t===""?true:!t.startsWith("..")&&!Ie__default.isAbsolute(t)}function cu(s,e){return s.length<=e?{text:s,truncated:false}:{text:s.slice(0,e)+`
|
|
1306
1306
|
... (truncated)`,truncated:true}}async function jt(s,e,t,n){let r=Date.now();return new Promise((o,i)=>{let a=spawn(s,e,{cwd:t,env:{...Ft.shellEnv.getShellEnv(),TERM:"dumb"},stdio:["ignore","pipe","pipe"],detached:false}),l="",c="",u=false;a.stdout?.on("data",g=>{l+=g.toString();}),a.stderr?.on("data",g=>{c+=g.toString();});let d=null;n?.timeoutMs&&(d=setTimeout(()=>{u=true,a.kill("SIGTERM"),setTimeout(()=>{a.killed||a.kill("SIGKILL");},1e3);},n.timeoutMs));let p=()=>{u=true,a.kill("SIGTERM"),setTimeout(()=>{a.killed||a.kill("SIGKILL");},1e3);};n?.signal&&(n.signal.aborted?p():n.signal.addEventListener("abort",p,{once:true})),a.on("close",g=>{d&&clearTimeout(d),n?.signal&&n.signal.removeEventListener("abort",p),o({stdout:l,stderr:c,exitCode:u?-1:g??0,durationMs:Date.now()-r});}),a.on("error",g=>{d&&clearTimeout(d),n?.signal&&n.signal.removeEventListener("abort",p),o({stdout:l,stderr:c,exitCode:-1,durationMs:Date.now()-r});});})}async function zs(s,e){try{let t=await jt("git",["rev-parse","--show-toplevel"],s,{signal:e,timeoutMs:8e3});return t.exitCode!==0||!t.stdout.trim()?{error:"Not a git repository"}:{repoRoot:t.stdout.trim()}}catch(t){return {error:t?.message||"Not a git repository"}}}function OL(s){let e=s.trim().split(/\s+/).filter(Boolean);return {command:e[0]||"",args:e.slice(1)}}function FL(s){let e=s.includes(`\r
|
|
1307
1307
|
`)?`\r
|
|
1308
1308
|
`:`
|
|
1309
1309
|
`,t=s.endsWith(e),n=s.split(/\r?\n/);return t&&n[n.length-1]===""&&n.pop(),{lines:n,lineEnding:e,hasTrailingNewline:t}}function ET(s){let e=s.trim(),t="";for(let n of e)switch(n){case "\u2010":case "\u2011":case "\u2012":case "\u2013":case "\u2014":case "\u2015":case "\u2212":t+="-";break;case "\u2018":case "\u2019":case "\u201A":case "\u201B":t+="'";break;case "\u201C":case "\u201D":case "\u201E":case "\u201F":t+='"';break;case "\xA0":case "\u2002":case "\u2003":case "\u2004":case "\u2005":case "\u2006":case "\u2007":case "\u2008":case "\u2009":case "\u200A":case "\u202F":case "\u205F":case "\u3000":t+=" ";break;default:t+=n;break}return t}function lh(s,e,t){if(e.length===0)return t;if(e.length>s.length)return null;let n=s.length-e.length;for(let r=t;r<=n;r+=1){let o=true;for(let i=0;i<e.length;i+=1)if(s[r+i]!==e[i]){o=false;break}if(o)return r}for(let r=t;r<=n;r+=1){let o=true;for(let i=0;i<e.length;i+=1)if(s[r+i].trimEnd()!==e[i].trimEnd()){o=false;break}if(o)return r}for(let r=t;r<=n;r+=1){let o=true;for(let i=0;i<e.length;i+=1)if(s[r+i].trim()!==e[i].trim()){o=false;break}if(o)return r}for(let r=t;r<=n;r+=1){let o=true;for(let i=0;i<e.length;i+=1)if(ET(s[r+i])!==ET(e[i])){o=false;break}if(o)return r}return null}function jL(s,e){let t=s.length,n=e.length;if(t*n>UL)return [...s.map(c=>({type:"delete",line:c})),...e.map(c=>({type:"insert",line:c}))];let o=Array.from({length:t+1},()=>new Array(n+1).fill(0));for(let c=t-1;c>=0;c-=1)for(let u=n-1;u>=0;u-=1)o[c][u]=s[c]===e[u]?o[c+1][u+1]+1:Math.max(o[c+1][u],o[c][u+1]);let i=[],a=0,l=0;for(;a<t&&l<n;){if(s[a]===e[l]){i.push({type:"equal",line:s[a]}),a+=1,l+=1;continue}o[a+1][l]>=o[a][l+1]?(i.push({type:"delete",line:s[a]}),a+=1):(i.push({type:"insert",line:e[l]}),l+=1);}for(;a<t;)i.push({type:"delete",line:s[a]}),a+=1;for(;l<n;)i.push({type:"insert",line:e[l]}),l+=1;return i}function GL(s,e){if(s.length===0&&e.length===0)return [];let t=jL(s,e),n=[],r=0,o=0,i=0;for(;i<t.length;){if(t[i].type==="equal"){r+=1,o+=1,i+=1;continue}let a=r,l=[],c=[];for(;i<t.length&&t[i].type!=="equal";){let u=t[i];u.type==="delete"?(l.push(u.line),r+=1):(c.push(u.line),o+=1),i+=1;}n.push({oldStart:a,oldLines:l,newLines:c});}return n}function ni(s){dh=s;}function ph(){return dh}async function sN(s){let e=Le__default.stat(Ie__default.join(s,"package.json")).then(()=>true).catch(()=>false),t=Le__default.stat(Ie__default.join(s,"pnpm-lock.yaml")).then(()=>true).catch(()=>false),n=Le__default.stat(Ie__default.join(s,"yarn.lock")).then(()=>true).catch(()=>false),r=Le__default.stat(Ie__default.join(s,"bun.lockb")).then(()=>true).catch(()=>false),o=Le__default.stat(Ie__default.join(s,"pyproject.toml")).then(()=>true).catch(()=>false),i=Le__default.stat(Ie__default.join(s,"pytest.ini")).then(()=>true).catch(()=>false),a=Le__default.stat(Ie__default.join(s,"go.mod")).then(()=>true).catch(()=>false),l=Le__default.stat(Ie__default.join(s,"Cargo.toml")).then(()=>true).catch(()=>false),c=Le__default.stat(Ie__default.join(s,"Makefile")).then(()=>true).catch(()=>false);return Promise.all([e,t,n,r,o,i,a,l,c]).then(([u,d,p,g,h,y,b,C,T])=>u?d?"pnpm":p?"yarn":g?"bun":"npm":h||y?"pytest":b?"go":C?"cargo":T?"make":null)}function oN(s,e,t){switch(s){case "npm":case "pnpm":case "yarn":case "bun":return {command:s,args:["run",e==="test"?"test":e==="lint"?"lint":"format",...t]};case "pytest":return {command:"pytest",args:t};case "go":return e==="test"?{command:"go",args:["test","./...",...t]}:e==="lint"?{command:"golangci-lint",args:["run",...t]}:{command:"gofmt",args:["-w",...t]};case "cargo":return e==="test"?{command:"cargo",args:["test",...t]}:e==="lint"?{command:"cargo",args:["clippy","--",...t]}:{command:"cargo",args:["fmt",...t]};case "make":return {command:"make",args:[e,...t]};default:return {command:"npm",args:["run",e,...t]}}}async function mh(s,e,t){let n=Ut(t.cwd||".");if(!Rr(n))return JSON.stringify(ss(s,"error","Command rejected: path outside workspace",{error:"cwd is outside workspace"}));if(t.extra_args!==void 0&&!Array.isArray(t.extra_args))return JSON.stringify(ss(s,"error","Invalid extra_args: expected an array of strings",{error:"extra_args must be an array"}));let r=Array.isArray(t.extra_args)?t.extra_args.map(l=>String(l)):[],o=t.preset||await sN(n),i=t.command,a=[];if(i){let l=OL(i);if(!l.command)return JSON.stringify(ss(s,"error","Invalid command",{error:"Command is empty"}));let c=new Set(["npm","pnpm","yarn","bun","pytest","go","cargo","make"]);if(!c.has(l.command))return JSON.stringify(ss(s,"error","Command not allowed",{error:`Allowed commands: ${Array.from(c).join(", ")}`}));let u=l.args.concat(r),d=await jt(l.command,u,n,{timeoutMs:t.timeout_ms||3e5}),p=[d.stdout,d.stderr].filter(Boolean).join(`
|
|
1310
1310
|
`),g=cu(p,kT),h=d.exitCode===0?`${s} succeeded (${d.durationMs}ms)`:`${s} failed with exit code ${d.exitCode}`;return JSON.stringify(ss(s,d.exitCode===0?"success":"error",h,{error:d.exitCode===0?void 0:cu(p,_T).text,metadata:{command:[l.command,...u].join(" "),exit_code:d.exitCode,duration_ms:d.durationMs,output_truncated:g.truncated}}))}if(o){let l=oN(o,e,r);a=l.args;let c=await jt(l.command,a,n,{timeoutMs:t.timeout_ms||3e5}),u=[c.stdout,c.stderr].filter(Boolean).join(`
|
|
1311
|
-
`),d=cu(u,kT),p=c.exitCode===0?`${s} succeeded (${c.durationMs}ms)`:`${s} failed with exit code ${c.exitCode}`;return JSON.stringify(ss(s,c.exitCode===0?"success":"error",p,{error:c.exitCode===0?void 0:cu(u,_T).text,metadata:{command:[l.command,...a].join(" "),exit_code:c.exitCode,duration_ms:c.durationMs,output_truncated:d.truncated}}))}return JSON.stringify(ss(s,"error","Unable to detect project type for command",{error:"No preset detected. Provide preset."}))}async function AT(s,e){try{if(s!=="rg"){if(!s||!wt__default.existsSync(s))return !1;wt__default.accessSync(s,wt__default.constants.X_OK);}return (await jt(s,["--version"],e,{timeoutMs:2e3})).exitCode===0}catch{return false}}function uN(s,e){if(s===-1)return true;let t=(e||"").toLowerCase();return t.includes("ebadf")||t.includes("enoent")||t.includes("eacces")||t.includes("spawn")||t.includes("not found")||t.includes("permission denied")}async function uh(){if(ls!==null)return ls;let s=dn();try{let{rgPath:t}=await import('@vscode/ripgrep');if(await AT(t,s))return ls=t,
|
|
1311
|
+
`),d=cu(u,kT),p=c.exitCode===0?`${s} succeeded (${c.durationMs}ms)`:`${s} failed with exit code ${c.exitCode}`;return JSON.stringify(ss(s,c.exitCode===0?"success":"error",p,{error:c.exitCode===0?void 0:cu(u,_T).text,metadata:{command:[l.command,...a].join(" "),exit_code:c.exitCode,duration_ms:c.durationMs,output_truncated:d.truncated}}))}return JSON.stringify(ss(s,"error","Unable to detect project type for command",{error:"No preset detected. Provide preset."}))}async function AT(s,e){try{if(s!=="rg"){if(!s||!wt__default.existsSync(s))return !1;wt__default.accessSync(s,wt__default.constants.X_OK);}return (await jt(s,["--version"],e,{timeoutMs:2e3})).exitCode===0}catch{return false}}function uN(s,e){if(s===-1)return true;let t=(e||"").toLowerCase();return t.includes("ebadf")||t.includes("enoent")||t.includes("eacces")||t.includes("spawn")||t.includes("not found")||t.includes("permission denied")}async function uh(){if(ls!==null)return ls;let s=dn();try{let{rgPath:t}=await import('@vscode/ripgrep');if(await AT(t,s))return ls=t,Ze.info("SEARCH",`Using bundled ripgrep: ${t}`),ls;Ze.warn("SEARCH",`Bundled ripgrep path is invalid or not executable: ${t}`);}catch(t){Ze.warn("SEARCH",`Bundled ripgrep not available: ${t.message}`);}return await AT("rg",s)?(ls="rg",Ze.info("SEARCH","Using system ripgrep"),ls):(ls=null,null)}async function dN(){return Pa!==null||(Pa=await uh()!==null,Pa?Ze.info("SEARCH","ripgrep available"):Ze.warn("SEARCH","ripgrep not available, using fallback")),Pa}function pN(s){let e=s.case_insensitive??true,t=[],n=(r,o,i)=>{if(!r.pattern||!r.pattern.trim())return;let a=(r.op||o).toLowerCase(),l=r.regex??i,c=r.case_insensitive??e;t.push({id:`q${t.length+1}`,pattern:r.pattern,op:a==="and"||a==="or"||a==="not"?a:o,regex:l,caseInsensitive:c});};if((s.pattern||s.query)&&n({pattern:s.pattern||s.query||"",op:s.op},"or",true),Array.isArray(s.keywords))for(let r of s.keywords)n({pattern:r},"or",false);if(Array.isArray(s.queries))for(let r of s.queries)n(r,"or",r.regex??true);return t}async function zn(s,e){e&&PL(e);let t=e?.capabilities??Ft.capabilities,n=He(),r=[...$T];if(s&&r.push(rT(s)),n.webSearch?.enabled&&r.push(zg),n.javaDebug?.enabled)try{let c=await Xg(n.javaDebug?.jarPath);r.push(...c),Ze.info("TOOLS",`Java Debug \u5DE5\u5177\u5DF2\u542F\u7528 (${c.length} \u4E2A\u5DE5\u5177)`);}catch(c){Ze.error("TOOLS",`Java Debug \u5DE5\u5177\u52A0\u8F7D\u5931\u8D25: ${c.message}`),Ze.error("TOOLS","\u63D0\u793A: \u8FD0\u884C npm run setup-java-debug \u81EA\u52A8\u4E0B\u8F7D JAR \u6587\u4EF6");}if(n.smartRead?.enabled!==false)try{let c=ng(s);r.push(...c),Ze.info("TOOLS",`readfile \u5DE5\u5177\u5DF2\u542F\u7528 (${c.length} \u4E2A\u5DE5\u5177)`);}catch(c){Ze.error("TOOLS",`readfile \u5DE5\u5177\u52A0\u8F7D\u5931\u8D25: ${c.message}`);}let o=typeof process<"u"&&process.type==="renderer";t?.terminal&&o&&r.push(...Vc()),t?.editor&&o&&r.push(...Yc());let i=RL(r,t),a=n.enabledTools||{},l=i.filter(c=>a[c.name]!==false);return QC(l)}var RT,xT,DT,EL,AL,Ft,Ze,Ws,ah,ML,NL,kT,_T,IT,BL,UL,WL,zL,HL,qL,KL,JL,VL,dh,YL,XL,QL,ZL,eN,tN,nN,rN,iN,aN,lN,cN,ch,Pa,ls,mN,gN,hN,$T,uu=R(()=>{un();jw();Kw();nT();Tt();sT();Og();Ng();uT();Pc();iu();Nc();bT();ih();Jo();lu();og();RT=process.platform==="win32",xT=RT?"powershell.exe":true,DT="NEOX_WORKDIR",EL="NEOX_WORKER",AL=ti(),Ft=AL,Ze=Ft.logger;Ws=null;ah=new Map,ML=300*1e3;NL=null;kT=12e3,_T=4e3,IT=1e6;BL={name:"write_file",description:"Write content to a file (create or overwrite)",parameters:{type:"object",properties:{file_path:{type:"string",description:"Path to the file to write"},content:{type:"string",description:"Content to write to the file"},mode:{type:"string",description:"Write mode: overwrite or append",enum:["overwrite","append"]}},required:["file_path","content"]},async function({file_path:s,content:e,mode:t="overwrite"}){if(!s)return JSON.stringify(Te("write_file","error","Missing required parameter: file_path",{error:"file_path is required",verify_hint:"Please provide the file_path parameter."}));if(e==null)return JSON.stringify(Te("write_file","error","Missing required parameter: content",{error:"content is required",verify_hint:"Please provide the content parameter with the text to write."}));let n=typeof e=="string"?e:String(e);if(n.trim()==="")return JSON.stringify(Te("write_file","error","Content is empty - this is likely an error",{error:"Empty content provided",verify_hint:"Please provide non-empty content to write."}));let r=Ut(s),o=createHash("sha256").update(n).digest("hex").substring(0,16),i=ah.get(r),a=Date.now();if(i&&i.checksum===o&&i.success&&a-i.timestamp<ML){let l=n.split(`
|
|
1312
1312
|
`).length;return JSON.stringify(Te("write_file","already_done",`File already written with identical content (${l} lines, ${n.length} bytes)`,{file_path:r,checksum:o,verify_hint:`Use "readfile ${s}" to verify the content if needed.`,metadata:{lines:l,bytes:n.length}}))}try{let l=!1;try{await Le__default.access(r),l=!0;}catch{}await Le__default.mkdir(Ie__default.dirname(r),{recursive:!0}),t==="append"?await Le__default.appendFile(r,n,"utf-8"):await Le__default.writeFile(r,n,"utf-8"),ah.set(r,{checksum:o,timestamp:a,success:!0});let c=n.split(`
|
|
1313
1313
|
`).length,u=l?"updated":"created";return JSON.stringify(Te("write_file","success",`File ${u}: ${Ie__default.basename(r)} (${c} lines, ${n.length} bytes)`,{file_path:r,checksum:o,verify_hint:`Use "readfile ${s}" to verify the content.`,metadata:{action:u,lines:c,bytes:n.length}}))}catch(l){return ah.set(r,{checksum:o,timestamp:a,success:false}),JSON.stringify(Te("write_file","error",`Failed to write file: ${l.message}`,{file_path:r,error:l.message,verify_hint:"Check file permissions and path validity."}))}}};UL=2e5;WL={name:"edit_file",description:`Edit file by replacing a target block with a new block.
|
|
1314
1314
|
Edits apply line-level hunks (only changed lines are replaced).
|
|
@@ -1366,7 +1366,7 @@ For searching file CONTENTS, use search instead.`,parameters:{type:"object",prop
|
|
|
1366
1366
|
- Use /processes to list all running background processes
|
|
1367
1367
|
- Use /kill <pid> to stop a background process before retrying`,parameters:{type:"object",properties:{command:{type:"string",description:"Shell command to execute"},background:{type:"boolean",description:"Run in background. Use TRUE for: npm run dev, servers, watch modes, npm install (large projects), db migrations, docker builds. Use FALSE for: quick commands like ls, git status, cat. Default: false"}},required:["command"]},async function({command:s,background:e=false},t){if(dh){let u=["ls","pwd","echo","cat","grep","find","wc","head","tail"],d=s.trim().split(" ")[0];if(!u.includes(d))return `\u2717 \u6C99\u7BB1\u6A21\u5F0F\uFF1A\u4E0D\u5141\u8BB8\u6267\u884C\u547D\u4EE4: ${d}
|
|
1368
1368
|
\u5141\u8BB8\u7684\u547D\u4EE4: ${u.join(", ")}
|
|
1369
|
-
\u63D0\u793A: \u4F7F\u7528 /sandbox off \u5173\u95ED\u6C99\u7BB1\u6A21\u5F0F`}let r=dn(),o=t?.signal,i=s.trim().endsWith("&"),a=s.includes("|");e&&(i||a)&&(
|
|
1369
|
+
\u63D0\u793A: \u4F7F\u7528 /sandbox off \u5173\u95ED\u6C99\u7BB1\u6A21\u5F0F`}let r=dn(),o=t?.signal,i=s.trim().endsWith("&"),a=s.includes("|");e&&(i||a)&&(Ze.warn("SHELL","\u68C0\u6D4B\u5230\u540E\u53F0\u6A21\u5F0F\u4E0B\u4F7F\u7528\u4E86 '&' \u6216\u7BA1\u9053\u7B26\u53F7\uFF0C\u8FD9\u53EF\u80FD\u5BFC\u81F4\u975E\u9884\u671F\u884C\u4E3A"),i&&Ze.info("SHELL","\u63D0\u793A: background=true \u53C2\u6570\u5DF2\u7ECF\u5904\u7406\u540E\u53F0\u8FD0\u884C\uFF0C\u65E0\u9700\u5728\u547D\u4EE4\u672B\u5C3E\u6DFB\u52A0 '&'"),a&&Ze.warn("SHELL","\u8B66\u544A: \u540E\u53F0\u6A21\u5F0F\u4E0B\u4F7F\u7528\u7BA1\u9053\u53EF\u80FD\u5BFC\u81F4\u8F93\u51FA\u622A\u65AD\u6216\u8FDB\u7A0B\u610F\u5916\u9000\u51FA"));let l=$L();if(l)try{Ze.debug("SHELL","Using terminal executor (UI mode)");let u=await l({command:s,cwd:r,timeout:6e5}),d=u.output.length>1e4?u.output.slice(0,1e4)+`
|
|
1370
1370
|
|
|
1371
1371
|
... (\u8F93\u51FA\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD)`:u.output;return `\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1372
1372
|
\u25B8 \u5DE5\u4F5C\u76EE\u5F55: ${r}
|
|
@@ -1379,7 +1379,7 @@ ${d||"(\u65E0\u8F93\u51FA)"}
|
|
|
1379
1379
|
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1380
1380
|
\u9000\u51FA\u7801: ${u.exitCode}
|
|
1381
1381
|
${u.exitCode!==0?"\u26A0\uFE0F \u547D\u4EE4\u6267\u884C\u8FD4\u56DE\u975E\u96F6\u9000\u51FA\u7801\uFF0C\u8BF7\u68C0\u67E5\u8F93\u51FA":"\u2713 \u547D\u4EE4\u6267\u884C\u6210\u529F"}
|
|
1382
|
-
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501`}catch(u){
|
|
1382
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501`}catch(u){Ze.warn("SHELL","Terminal executor failed",{error:u.message});}let c=await LL(s,e,r,o);if(c){if(c.background&&c.pid){Ft.processManager.get(c.pid)||Ft.processManager.register({pid:c.pid,command:s,cwd:r,background:true}),Ws?.onAdd?.(s,c.pid);let u=Ft.processManager.getBackgroundRunning().length;return c.output.replace(/当前后台进程总数:\s*\d+/,`\u5F53\u524D\u540E\u53F0\u8FDB\u7A0B\u603B\u6570: ${u}`)}return c.output}if(e){let u=s.trim().replace(/\s+/g," ").replace(/\s*&\s*$/,""),d=Ft.processManager.getBackgroundRunning().find(p=>p.command.trim().replace(/\s+/g," ").replace(/\s*&\s*$/,"")===u);if(d){let p=Math.floor((Date.now()-d.startTime.getTime())/1e3),g=Ft.processManager.getBackgroundRunning().length;return `\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1383
1383
|
\u25B8 \u5DE5\u4F5C\u76EE\u5F55: ${r}
|
|
1384
1384
|
\u25B8 \u6267\u884C\u547D\u4EE4: ${s}
|
|
1385
1385
|
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
@@ -1398,9 +1398,9 @@ ${u.exitCode!==0?"\u26A0\uFE0F \u547D\u4EE4\u6267\u884C\u8FD4\u56DE\u975E\u96F6\
|
|
|
1398
1398
|
- /processes - \u67E5\u770B\u6240\u6709\u540E\u53F0\u8FDB\u7A0B\u72B6\u6001
|
|
1399
1399
|
- /kill ${d.pid} - \u7EC8\u6B62\u73B0\u6709\u8FDB\u7A0B\u540E\u91CD\u65B0\u542F\u52A8
|
|
1400
1400
|
- lsof -i :\u7AEF\u53E3\u53F7 - \u68C0\u67E5\u7AEF\u53E3\u5360\u7528\u60C5\u51B5
|
|
1401
|
-
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501`}try{let p=execa(s,{shell:xT,cwd:r,detached:!RT,stdio:["ignore","pipe","pipe"],env:Ft.shellEnv.getShellEnv()});p.unref();let g=p.pid,h;g&&(Ft.processManager.register({pid:g,command:s,cwd:r,background:!0,processRef:p}),h=Ws?.onAdd?.(s,g),p.on("exit",E=>{Ft.processManager.markCompleted(g,E??0),h&&Ws?.onUpdate?.(h,{status:(E??0)===0?"done":"error",exitCode:E??0});})),o&&g&&o.addEventListener("abort",()=>{
|
|
1402
|
-
`).filter(Boolean))Ws?.onUpdate?.(h,{outputLine:I});process.env.CLI_DEBUG==="1"&&
|
|
1403
|
-
`).filter(Boolean))Ws?.onUpdate?.(h,{outputLine:I});process.env.CLI_DEBUG==="1"&&
|
|
1401
|
+
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501`}try{let p=execa(s,{shell:xT,cwd:r,detached:!RT,stdio:["ignore","pipe","pipe"],env:Ft.shellEnv.getShellEnv()});p.unref();let g=p.pid,h;g&&(Ft.processManager.register({pid:g,command:s,cwd:r,background:!0,processRef:p}),h=Ws?.onAdd?.(s,g),p.on("exit",E=>{Ft.processManager.markCompleted(g,E??0),h&&Ws?.onUpdate?.(h,{status:(E??0)===0?"done":"error",exitCode:E??0});})),o&&g&&o.addEventListener("abort",()=>{Ze.info("SHELL",`\u6536\u5230\u4E2D\u65AD\u4FE1\u53F7\uFF0C\u7EC8\u6B62\u540E\u53F0\u8FDB\u7A0B PID: ${g}`),Ft.processManager.killProcessGroup(g);});let y=[],b=8e3;p.stdout?.on("data",E=>{let v=E.toString();if(y.push(v),h)for(let I of v.split(`
|
|
1402
|
+
`).filter(Boolean))Ws?.onUpdate?.(h,{outputLine:I});process.env.CLI_DEBUG==="1"&&Ze.debug("SHELL_STDOUT",v.trim());}),p.stderr?.on("data",E=>{let v=E.toString();if(y.push(v),h)for(let I of v.split(`
|
|
1403
|
+
`).filter(Boolean))Ws?.onUpdate?.(h,{outputLine:I});process.env.CLI_DEBUG==="1"&&Ze.debug("SHELL_STDERR",v.trim());}),Ze.info("SHELL",`\u6B63\u5728\u6536\u96C6\u8FDB\u7A0B\u8F93\u51FA (${b/1e3}\u79D2)...`),await new Promise((E,v)=>{let I=setTimeout(E,b);o&&o.addEventListener("abort",()=>{clearTimeout(I),v(new Error("Command interrupted by user"));});});let C=y.join(""),T=C.length>3e3?C.slice(0,3e3)+`
|
|
1404
1404
|
... (\u8F93\u51FA\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD)`:C,S=Ft.processManager.getBackgroundRunning().length;return `\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501
|
|
1405
1405
|
\u25B8 \u5DE5\u4F5C\u76EE\u5F55: ${r}
|
|
1406
1406
|
\u25B8 \u6267\u884C\u547D\u4EE4: ${s}
|
|
@@ -1481,12 +1481,12 @@ ${u.stderr}
|
|
|
1481
1481
|
`:""}
|
|
1482
1482
|
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501`}}},XL={name:"show_tree",description:"Display directory tree structure",parameters:{type:"object",properties:{directory:{type:"string",description:"Directory path (default: current directory)"},max_depth:{type:"number",description:"Maximum depth to traverse (default: 3)"}}},async function({directory:s=".",max_depth:e=3}){try{let t=Ut(s),n=[`${It(t)}/
|
|
1483
1483
|
`];async function r(o,i="",a=0){if(a>=e)return;let u=(await Le__default.readdir(o,{withFileTypes:!0})).filter(d=>!d.name.startsWith(".")).sort((d,p)=>d.isDirectory()&&!p.isDirectory()?-1:!d.isDirectory()&&p.isDirectory()?1:d.name.localeCompare(p.name));for(let d=0;d<u.length;d++){let p=u[d],g=d===u.length-1,h=g?"\u2514\u2500\u2500 ":"\u251C\u2500\u2500 ",y=g?" ":"\u2502 ";if(p.isDirectory())n.push(`${i}${h}${p.name}/`),await r(Ie__default.join(o,p.name),i+y,a+1);else {let b=await Le__default.stat(Ie__default.join(o,p.name)),C=b.size<1024?`${b.size}B`:b.size<1024*1024?`${(b.size/1024).toFixed(1)}KB`:`${(b.size/(1024*1024)).toFixed(1)}MB`;n.push(`${i}${h}${p.name} (${C})`);}}}return await r(t),n.join(`
|
|
1484
|
-
`)}catch(t){return `\u2717 \u663E\u793A\u76EE\u5F55\u6811\u5931\u8D25: ${t.message}`}}},QL={name:"git_status",description:"Show git status (short by default)",parameters:{type:"object",properties:{path:{type:"string",description:"Path inside the repo (default: workspace root)"},short:{type:"boolean",description:"Use short format (default: true)"}}},permission:{category:"read",allowInAskMode:true},async function({path:s=".",short:e=true}){let t=Ut(s);if(!Rr(t))return JSON.stringify(
|
|
1485
|
-
`).trim();return i.exitCode!==0?JSON.stringify(
|
|
1486
|
-
`).trim();return a.exitCode!==0?JSON.stringify(
|
|
1487
|
-
`).trim();return c.exitCode!==0?JSON.stringify(
|
|
1488
|
-
`).trim();if(i.exitCode!==0)return JSON.stringify(
|
|
1489
|
-
`).trim();u.exitCode===0&&d?(l=`* ${d} (current, no commits yet)`,c="git branches (no commits yet)"):(l="(no branches found)",c="git branches empty");}return JSON.stringify(
|
|
1484
|
+
`)}catch(t){return `\u2717 \u663E\u793A\u76EE\u5F55\u6811\u5931\u8D25: ${t.message}`}}},QL={name:"git_status",description:"Show git status (short by default)",parameters:{type:"object",properties:{path:{type:"string",description:"Path inside the repo (default: workspace root)"},short:{type:"boolean",description:"Use short format (default: true)"}}},permission:{category:"read",allowInAskMode:true},async function({path:s=".",short:e=true}){let t=Ut(s);if(!Rr(t))return JSON.stringify(Qe("git_status","error","git status failed: path outside workspace",void 0,{error:"path outside workspace"}));let{repoRoot:n,error:r}=await zs(t);if(!n)return JSON.stringify(Qe("git_status","error",`git status failed: ${r||"not a git repository"}`,void 0,{error:r||"not a git repository"}));let o=["status"];e&&o.push("-sb");let i=await jt("git",o,n),a=[i.stdout,i.stderr].filter(Boolean).join(`
|
|
1485
|
+
`).trim();return i.exitCode!==0?JSON.stringify(Qe("git_status","error","git status failed",a||void 0,{error:a||"git status failed"})):JSON.stringify(Qe("git_status","success",a?"git status ok":"git status clean",a||"\u2713 clean"))}},ZL={name:"git_diff",description:"Show git diff",parameters:{type:"object",properties:{path:{type:"string",description:"Path inside the repo (default: workspace root)"},staged:{type:"boolean",description:"Show staged diff (default: false)"},file_path:{type:"string",description:"Limit diff to a specific file"}}},permission:{category:"read",allowInAskMode:true},async function({path:s=".",staged:e=false,file_path:t}){let n=Ut(s);if(!Rr(n))return JSON.stringify(Qe("git_diff","error","git diff failed: path outside workspace",void 0,{error:"path outside workspace"}));let{repoRoot:r,error:o}=await zs(n);if(!r)return JSON.stringify(Qe("git_diff","error",`git diff failed: ${o||"not a git repository"}`,void 0,{error:o||"not a git repository"}));let i=["diff"];if(e&&i.push("--staged"),t){let c=Ut(t);if(!Rr(c))return JSON.stringify(Qe("git_diff","error","git diff failed: path outside workspace",void 0,{error:"path outside workspace"}));let u=Ie__default.relative(r,c);if(u.startsWith("..")||Ie__default.isAbsolute(u))return JSON.stringify(Qe("git_diff","error","git diff failed: file outside repo",void 0,{error:"file outside repo"}));i.push("--",u);}let a=await jt("git",i,r),l=[a.stdout,a.stderr].filter(Boolean).join(`
|
|
1486
|
+
`).trim();return a.exitCode!==0?JSON.stringify(Qe("git_diff","error","git diff failed",l||void 0,{error:l||"git diff failed"})):JSON.stringify(Qe("git_diff","success",l?"git diff ok":"no diff",l||""))}},eN={name:"git_blame",description:"Show git blame for a file",parameters:{type:"object",properties:{file_path:{type:"string",description:"File path to blame (required)"},start_line:{type:"number",description:"Start line (1-based)"},end_line:{type:"number",description:"End line (1-based)"}},required:["file_path"]},permission:{category:"read",allowInAskMode:true},async function({file_path:s,start_line:e,end_line:t}){if(!s)return JSON.stringify(Qe("git_blame","error","git blame failed: file_path is required",void 0,{error:"file_path is required"}));let n=Ut(s);if(!Rr(n))return JSON.stringify(Qe("git_blame","error","git blame failed: path outside workspace",void 0,{error:"path outside workspace"}));let{repoRoot:r,error:o}=await zs(Ie__default.dirname(n));if(!r)return JSON.stringify(Qe("git_blame","error",`git blame failed: ${o||"not a git repository"}`,void 0,{error:o||"not a git repository"}));let i=e&&t?`${e},${t}`:void 0,a=Ie__default.relative(r,n);if(a.startsWith("..")||Ie__default.isAbsolute(a))return JSON.stringify(Qe("git_blame","error","git blame failed: file outside repo",void 0,{error:"file outside repo"}));let l=["blame","--",a];i&&l.splice(1,0,"-L",i);let c=await jt("git",l,r),u=[c.stdout,c.stderr].filter(Boolean).join(`
|
|
1487
|
+
`).trim();return c.exitCode!==0?JSON.stringify(Qe("git_blame","error","git blame failed",u||void 0,{error:u||"git blame failed"})):JSON.stringify(Qe("git_blame","success","git blame ok",u||""))}},tN={name:"git_branch_list",description:"List git branches",parameters:{type:"object",properties:{path:{type:"string",description:"Path inside the repo (default: workspace root)"},all:{type:"boolean",description:"Include remote branches (default: false)"}}},permission:{category:"read",allowInAskMode:true},async function({path:s=".",all:e=false}){let t=Ut(s);if(!Rr(t))return JSON.stringify(Qe("git_branch_list","error","git branch failed: path outside workspace",void 0,{error:"path outside workspace"}));let{repoRoot:n,error:r}=await zs(t);if(!n)return JSON.stringify(Qe("git_branch_list","error",`git branch failed: ${r||"not a git repository"}`,void 0,{error:r||"not a git repository"}));let o=["branch","--list"];e&&o.push("--all");let i=await jt("git",o,n),a=[i.stdout,i.stderr].filter(Boolean).join(`
|
|
1488
|
+
`).trim();if(i.exitCode!==0)return JSON.stringify(Qe("git_branch_list","error","git branch failed",a||void 0,{error:a||"git branch failed"}));let l=a,c="git branches";if(!l){let u=await jt("git",["symbolic-ref","--short","HEAD"],n),d=[u.stdout,u.stderr].filter(Boolean).join(`
|
|
1489
|
+
`).trim();u.exitCode===0&&d?(l=`* ${d} (current, no commits yet)`,c="git branches (no commits yet)"):(l="(no branches found)",c="git branches empty");}return JSON.stringify(Qe("git_branch_list","success",c,l))}},nN={name:"git_branch",description:"Create a git branch",parameters:{type:"object",properties:{name:{type:"string",description:"Branch name to create"},checkout:{type:"boolean",description:"Checkout after creation (default: false)"}},required:["name"]},permission:{category:"write",allowInAskMode:false},async function({name:s,checkout:e=false}){let t=dn(),{repoRoot:n,error:r}=await zs(t);if(!n)return JSON.stringify(Te("git_branch","error",`Not a git repository: ${r||"unknown error"}`,{error:"Not a git repository"}));if(!s)return JSON.stringify(Te("git_branch","error","Branch name is required (use git_branch_list to list branches)",{error:"name is required"}));let o=typeof s=="string"?s.trim():"",i=/^[A-Za-z0-9._\\/-]+$/.test(o);if(!o||!i||o.includes("..")||o.startsWith("/")||o.endsWith("/"))return JSON.stringify(Te("git_branch","error","Invalid branch name",{error:"Invalid branch name"}));let l=await jt("git",["branch",o],n);if(l.exitCode!==0){let c=[l.stdout,l.stderr].filter(Boolean).join(`
|
|
1490
1490
|
`).trim();return JSON.stringify(Te("git_branch","error","Failed to create branch",{error:c||"Failed to create branch"}))}if(e){let c=await jt("git",["checkout",o],n);if(c.exitCode!==0){let u=[c.stdout,c.stderr].filter(Boolean).join(`
|
|
1491
1491
|
`).trim();return JSON.stringify(Te("git_branch","error","Branch created but checkout failed",{error:u||"Checkout failed"}))}}return JSON.stringify(Te("git_branch","success",e?`Branch created and checked out: ${o}`:`Branch created: ${o}`,{metadata:{branch:o,checkout:e}}))}},rN={name:"git_commit",description:"Create a git commit",parameters:{type:"object",properties:{message:{type:"string",description:"Commit message"},add_all:{type:"boolean",description:"Run git add -A before commit (default: false)"}},required:["message"]},permission:{category:"write",allowInAskMode:false},async function({message:s,add_all:e=false}){let t=dn(),{repoRoot:n,error:r}=await zs(t);if(!n)return JSON.stringify(Te("git_commit","error",`Not a git repository: ${r||"unknown error"}`,{error:"Not a git repository"}));let o=typeof s=="string"?s.trim():"";if(!o||o.length<3)return JSON.stringify(Te("git_commit","error","Commit message is too short",{error:"Commit message is too short"}));if(e){let a=await jt("git",["add","-A"],n);if(a.exitCode!==0){let l=[a.stdout,a.stderr].filter(Boolean).join(`
|
|
1492
1492
|
`).trim();return JSON.stringify(Te("git_commit","error","git add -A failed",{error:l||"git add failed"}))}}let i=await jt("git",["commit","-m",o],n);if(i.exitCode!==0){let a=[i.stdout,i.stderr].filter(Boolean).join(`
|
|
@@ -1512,17 +1512,17 @@ search(mode="files", pattern="*.ts") \u2192 \u6587\u4EF6\u540D\u641C\u7D22
|
|
|
1512
1512
|
\u8F93\u51FA\u7279\u70B9:
|
|
1513
1513
|
- \u6BCF\u6761\u7ED3\u679C\u5E26 [\u6A21\u5757] \u524D\u7F00
|
|
1514
1514
|
- \u663E\u793A\u6A21\u5757\u5206\u5E03\u7EDF\u8BA1
|
|
1515
|
-
- \u63D0\u4F9B readfile \u6279\u91CF\u8BFB\u53D6\u63D0\u793A`,parameters:{type:"object",properties:{pattern:{type:"string",description:'\u641C\u7D22\u6A21\u5F0F (\u9ED8\u8BA4\u6B63\u5219)\u3002\u793A\u4F8B: "error", "\u767B\u5F55", "function\\s+\\w+"'},query:{type:"string",description:"pattern \u7684\u522B\u540D"},keywords:{type:"array",items:{type:"string"},description:"\u591A\u5173\u952E\u8BCD OR \u641C\u7D22 (\u5B57\u9762\u91CF\u5339\u914D)"},queries:{type:"array",items:{type:"object",properties:{pattern:{type:"string"},op:{type:"string",enum:["and","or","not"]},regex:{type:"boolean"},case_insensitive:{type:"boolean"}},required:["pattern"]},description:"\u9AD8\u7EA7\u591A\u67E5\u8BE2 (\u652F\u6301 and/or/not)"},op:{type:"string",enum:["and","or","not"],description:"pattern \u7684\u903B\u8F91\u64CD\u4F5C (\u9ED8\u8BA4 or)"},mode:{type:"string",enum:["content","files"],description:"\u641C\u7D22\u6A21\u5F0F: \u5185\u5BB9\u641C\u7D22\u6216\u6587\u4EF6\u540D\u641C\u7D22 (\u9ED8\u8BA4: content)"},path:{type:"string",description:"\u641C\u7D22\u8DEF\u5F84 (\u53EF\u9009\uFF0C\u9ED8\u8BA4: \u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55)"},recursive:{type:"boolean",description:"\u9012\u5F52\u5B50\u76EE\u5F55 (\u53EF\u9009\uFF0C\u76EE\u5F55\u9ED8\u8BA4 true\uFF0C\u6587\u4EF6\u9ED8\u8BA4 false)"},file_pattern:{type:"string",description:'\u6587\u4EF6\u7C7B\u578B\u8FC7\u6EE4 (e.g., "*.ts", "*.{js,jsx,ts,tsx}")'},include_hidden:{type:"boolean",description:"\u5305\u542B\u9690\u85CF\u6587\u4EF6 (\u9ED8\u8BA4: false)"},case_insensitive:{type:"boolean",description:"\u5FFD\u7565\u5927\u5C0F\u5199 (\u9ED8\u8BA4: true)"},context_lines:{type:"number",description:"\u4E0A\u4E0B\u6587\u884C\u6570 (\u9ED8\u8BA4: 2)"},max_matches:{type:"number",description:"\u6700\u5927\u5339\u914D\u6570 (\u9ED8\u8BA4: 200)"},count_only:{type:"boolean",description:"\u4EC5\u8FD4\u56DE\u8BA1\u6570 (\u5FEB\u901F\u4E86\u89E3\u5339\u914D\u5206\u5E03)"}}},async function({pattern:s,query:e,keywords:t,queries:n,op:r,mode:o="content",path:i,recursive:a,file_pattern:l,include_hidden:c=false,case_insensitive:u=true,context_lines:d=2,max_matches:p=200,count_only:g=false},h){try{let y=Date.now();
|
|
1515
|
+
- \u63D0\u4F9B readfile \u6279\u91CF\u8BFB\u53D6\u63D0\u793A`,parameters:{type:"object",properties:{pattern:{type:"string",description:'\u641C\u7D22\u6A21\u5F0F (\u9ED8\u8BA4\u6B63\u5219)\u3002\u793A\u4F8B: "error", "\u767B\u5F55", "function\\s+\\w+"'},query:{type:"string",description:"pattern \u7684\u522B\u540D"},keywords:{type:"array",items:{type:"string"},description:"\u591A\u5173\u952E\u8BCD OR \u641C\u7D22 (\u5B57\u9762\u91CF\u5339\u914D)"},queries:{type:"array",items:{type:"object",properties:{pattern:{type:"string"},op:{type:"string",enum:["and","or","not"]},regex:{type:"boolean"},case_insensitive:{type:"boolean"}},required:["pattern"]},description:"\u9AD8\u7EA7\u591A\u67E5\u8BE2 (\u652F\u6301 and/or/not)"},op:{type:"string",enum:["and","or","not"],description:"pattern \u7684\u903B\u8F91\u64CD\u4F5C (\u9ED8\u8BA4 or)"},mode:{type:"string",enum:["content","files"],description:"\u641C\u7D22\u6A21\u5F0F: \u5185\u5BB9\u641C\u7D22\u6216\u6587\u4EF6\u540D\u641C\u7D22 (\u9ED8\u8BA4: content)"},path:{type:"string",description:"\u641C\u7D22\u8DEF\u5F84 (\u53EF\u9009\uFF0C\u9ED8\u8BA4: \u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55)"},recursive:{type:"boolean",description:"\u9012\u5F52\u5B50\u76EE\u5F55 (\u53EF\u9009\uFF0C\u76EE\u5F55\u9ED8\u8BA4 true\uFF0C\u6587\u4EF6\u9ED8\u8BA4 false)"},file_pattern:{type:"string",description:'\u6587\u4EF6\u7C7B\u578B\u8FC7\u6EE4 (e.g., "*.ts", "*.{js,jsx,ts,tsx}")'},include_hidden:{type:"boolean",description:"\u5305\u542B\u9690\u85CF\u6587\u4EF6 (\u9ED8\u8BA4: false)"},case_insensitive:{type:"boolean",description:"\u5FFD\u7565\u5927\u5C0F\u5199 (\u9ED8\u8BA4: true)"},context_lines:{type:"number",description:"\u4E0A\u4E0B\u6587\u884C\u6570 (\u9ED8\u8BA4: 2)"},max_matches:{type:"number",description:"\u6700\u5927\u5339\u914D\u6570 (\u9ED8\u8BA4: 200)"},count_only:{type:"boolean",description:"\u4EC5\u8FD4\u56DE\u8BA1\u6570 (\u5FEB\u901F\u4E86\u89E3\u5339\u914D\u5206\u5E03)"}}},async function({pattern:s,query:e,keywords:t,queries:n,op:r,mode:o="content",path:i,recursive:a,file_pattern:l,include_hidden:c=false,case_insensitive:u=true,context_lines:d=2,max_matches:p=200,count_only:g=false},h){try{let y=Date.now();Ze.debug("SEARCH",`>>> searchTool.execute START, pattern=${s||e||t?.join(",")}`);let b=h?.signal,C=()=>{if(b?.aborted){let K=new Error("Operation cancelled");throw K.name="AbortError",K}},T=200,S=async()=>{await new Promise(K=>setImmediate(K));},v=Ut(i||"."),I="workspace",D=dn();if(i&&Ie__default.isAbsolute(i))I="absolute";else if(i&&!wt__default.existsSync(v)){let K=D,re=null;for(;;){let se=Ie__default.resolve(K,i);if(wt__default.existsSync(se)){re=se;break}let ve=Ie__default.dirname(K);if(ve===K)break;K=ve;}re&&(v=re,I="ancestor");}let O=It(v);C();let k;try{k=await Le__default.stat(v);}catch(K){return JSON.stringify(Qe("search","error",`search failed: ${K.message}`,void 0,{error:K.message}))}let M=k.isDirectory(),N=a!==void 0?a:M,x=pN({pattern:s,query:e,keywords:t,queries:n,op:r,case_insensitive:u});if(C(),x.length===0)return JSON.stringify(Qe("search","error","search failed: no query provided",void 0,{error:"Provide pattern/keywords/queries"}));let B=x.filter(K=>K.op!=="not"),H=x.filter(K=>K.op==="and"),W=x.filter(K=>K.op==="or"),U=x.filter(K=>K.op==="not");if(B.length===0)return JSON.stringify(Qe("search","error","search failed: only NOT queries provided",void 0,{error:"At least one non-NOT query is required"}));let z=x.filter(K=>K.regex).map(K=>{try{return new RegExp(K.pattern),null}catch(re){return `${K.pattern}: ${re.message}`}}).filter(K=>!!K);if(z.length>0)return JSON.stringify(Qe("search","error",`search failed: invalid regex (${z[0]})`,void 0,{error:`Invalid regex: ${z.join("; ")}`}));let q=[];W.length>0&&q.push(W.map(K=>K.pattern).join(" OR ")),H.length>0&&q.push(`AND ${H.map(K=>K.pattern).join(" + ")}`),U.length>0&&q.push(`NOT ${U.map(K=>K.pattern).join(" + ")}`);let P=q.join(" ");Ze.debug("SEARCH",`>>> Before isRipgrepAvailable, elapsed=${Date.now()-y}ms`);let $=await dN();Ze.debug("SEARCH",`<<< After isRipgrepAvailable, elapsed=${Date.now()-y}ms`);let F=Math.min(200,Math.max(80,d*4+40));if(Ze.info("SEARCH",`Strategy: ${$?"ripgrep":"fallback"}`),!$)return JSON.stringify(Qe("search","error","search failed: ripgrep not available",`Ripgrep is required for search. This is unexpected since ripgrep should be bundled.
|
|
1516
1516
|
Please report this issue.`,{error:"ripgrep not available"}));if(C(),o==="files"){let K=await(async()=>{if(!M)return [It(v)];if($){let le=await uh();if(!le)throw new Error("ripgrep not available (this should not happen)");let we=["--files"];c&&we.push("--hidden"),!N&&M&&we.push("--max-depth","1"),l&&we.push("-g",l),ch.forEach(Ne=>we.push("-g",Ne)),we.push("--",v);let We=await jt(le,we,dn(),{signal:b});if(We.exitCode!==0&&We.exitCode!==1)throw new Error(We.stderr||"rg files search failed");return We.stdout.split(`
|
|
1517
|
-
`).filter(Boolean).map(Ne=>{let
|
|
1518
|
-
`),{metadata:{mode:"files",strategy:$?"rg":"glob",regex:x.some(L=>L.regex),case_insensitive:u,path:O,resolved_from:I,files:se,queries:x}}))}let V=new Map,Z=new Map,ae=0,be=U.map(K=>{let re=K.regex?K.pattern:ST(K.pattern),se=K.caseInsensitive?"i":"";return new RegExp(re,se)}),Pe=[];if($){let K=await uh();if(!K)throw new Error("ripgrep not available (this should not happen)");for(let re of B){C();let se=["--json","--with-filename","--line-number","--column","-a"];se.push("-C",String(d)),re.caseInsensitive&&se.push("-i"),re.regex||se.push("-F"),c&&se.push("--hidden"),!N&&M&&se.push("--max-depth","1"),l&&se.push("-g",l),ch.forEach(le=>se.push("-g",le)),se.push("--",re.pattern,v);let ve=K,Be="",ce=0,L="",ee=async le=>{let we=`${le} ${se.join(" ")}`;return Pe.push(we),jt(le,se,dn(),{signal:b})};try{let le=await ee(ve);Be=le.stdout,L=le.stderr||"",ce=le.exitCode;}catch(le){if(le?.name==="AbortError"||b?.aborted)throw le;L=le?.message||le?.stderr||String(le),ce=le?.exitCode||2;}if(ce!==0&&ce!==1&&ve!=="rg"&&uN(ce,L)){
|
|
1517
|
+
`).filter(Boolean).map(Ne=>{let it=Ie__default.isAbsolute(Ne)?Ie__default.resolve(Ne):Ie__default.resolve(dn(),Ne);return It(it)})}let L=l||"**/*",ee=N?L:L.replace("**/","");return (await MT(ee,{cwd:v,absolute:!0,dot:c,onlyFiles:!0,ignore:ch.map(le=>le.replace("!",""))})).map(le=>It(le))})();C();let re=x.map(L=>{let ee=L.regex?L.pattern:ST(L.pattern),me=L.caseInsensitive?"i":"";return {query:L,regex:new RegExp(ee,me)}}),se=[],ve=0;for(let L of K){C();let ee=L,me=re.map(ye=>({op:ye.query.op,hit:ye.regex.test(ee)})),le=me.some(ye=>ye.op==="or"&&ye.hit),we=me.filter(ye=>ye.op==="and").every(ye=>ye.hit);!me.some(ye=>ye.op==="not"&&ye.hit)&&(H.length===0||we)&&(W.length===0||le)&&se.push(L),ve++,ve%T===0&&await S();}let Be=[`\u2713 \u6587\u4EF6\u641C\u7D22: ${P}`,`\u25B8 \u8DEF\u5F84: ${O}${N?" (\u9012\u5F52)":""}${I==="ancestor"?" (auto-resolved)":""}`,l?`\u25B8 \u6587\u4EF6\u8FC7\u6EE4: ${l}`:"",c?"\u25B8 \u5305\u542B\u9690\u85CF\u6587\u4EF6":"","",`\u627E\u5230 ${se.length} \u4E2A\u6587\u4EF6`,""].filter(L=>L!==""),ce=50;return se.slice(0,ce).forEach(L=>Be.push(` ${L}`)),se.length>ce&&Be.push(` ... \u8FD8\u6709 ${se.length-ce} \u4E2A\u6587\u4EF6`),JSON.stringify(Qe("search","success",se.length>0?`search files "${P}" (${se.length} files)`:`search files "${P}" (no matches)`,Be.join(`
|
|
1518
|
+
`),{metadata:{mode:"files",strategy:$?"rg":"glob",regex:x.some(L=>L.regex),case_insensitive:u,path:O,resolved_from:I,files:se,queries:x}}))}let V=new Map,Z=new Map,ae=0,be=U.map(K=>{let re=K.regex?K.pattern:ST(K.pattern),se=K.caseInsensitive?"i":"";return new RegExp(re,se)}),Pe=[];if($){let K=await uh();if(!K)throw new Error("ripgrep not available (this should not happen)");for(let re of B){C();let se=["--json","--with-filename","--line-number","--column","-a"];se.push("-C",String(d)),re.caseInsensitive&&se.push("-i"),re.regex||se.push("-F"),c&&se.push("--hidden"),!N&&M&&se.push("--max-depth","1"),l&&se.push("-g",l),ch.forEach(le=>se.push("-g",le)),se.push("--",re.pattern,v);let ve=K,Be="",ce=0,L="",ee=async le=>{let we=`${le} ${se.join(" ")}`;return Pe.push(we),jt(le,se,dn(),{signal:b})};try{let le=await ee(ve);Be=le.stdout,L=le.stderr||"",ce=le.exitCode;}catch(le){if(le?.name==="AbortError"||b?.aborted)throw le;L=le?.message||le?.stderr||String(le),ce=le?.exitCode||2;}if(ce!==0&&ce!==1&&ve!=="rg"&&uN(ce,L)){Ze.warn("SEARCH","Bundled ripgrep failed, retrying with system rg",{exitCode:ce,error:L,bundledPath:ve});try{let le=await ee("rg");Be=le.stdout,L=le.stderr||"",ce=le.exitCode,ve="rg",(ce===0||ce===1)&&(ls="rg");}catch(le){if(le?.name==="AbortError"||b?.aborted)throw le;let we=le?.message||le?.stderr||String(le);L=`${L}
|
|
1519
1519
|
Fallback rg failed: ${we}`.trim(),ce=le?.exitCode||2;}}if(ce!==0&&ce!==1){let le=L?`
|
|
1520
1520
|
Error: ${L}`:"",we=`
|
|
1521
1521
|
Command: ${ve} ${se.join(" ")}`;throw new Error(`ripgrep failed (exit code ${ce})${le}${we}`)}let me=0;for(let le of Be.split(`
|
|
1522
|
-
`)){if(C(),me++,me%T===0&&await S(),!le.trim())continue;let we;try{we=JSON.parse(le);}catch{continue}if(we.type==="summary"){let Ur=we.data?.stats;Ur&&typeof Ur.searches=="number"&&(ae=Math.max(ae,Ur.searches));continue}let We=we.type==="match",ye=we.type==="context";if(!We&&!ye)continue;let Ne=we.data,
|
|
1522
|
+
`)){if(C(),me++,me%T===0&&await S(),!le.trim())continue;let we;try{we=JSON.parse(le);}catch{continue}if(we.type==="summary"){let Ur=we.data?.stats;Ur&&typeof Ur.searches=="number"&&(ae=Math.max(ae,Ur.searches));continue}let We=we.type==="match",ye=we.type==="context";if(!We&&!ye)continue;let Ne=we.data,it=Ne?.path?.text,Ht=Ne?.line_number,Fr=Ne?.lines?.text,br=Array.isArray(Ne?.submatches)?Ne.submatches[0]:void 0;if(!it||!Ht||typeof Fr!="string")continue;let Sl=Fr.replace(/\n$/,""),Ai=V.get(it)||new Map,ws=Ai.get(Ht)||{line:Sl,queryIds:new Set};if(ws.line=Sl,We){ws.queryIds.add(re.id),ws.column===void 0&&br?.start!==void 0&&(ws.column=br.start+1);let Ur=Z.get(it)||new Set;Ur.add(re.id),Z.set(it,Ur);}Ai.set(Ht,ws),V.set(it,Ai);}}}let oe=new Set(H.map(K=>K.id)),X=[],te=0,Y=0,Ae=0,ge=[],_e=[],fe=0;for(let[K,re]of V.entries()){if(C(),te>=p&&!g)break;fe++,fe%T===0&&await S();let se=Z.get(K)||new Set,ve=!0;if(oe.forEach(le=>{se.has(le)||(ve=!1);}),!ve)continue;let ce=Array.from(re.keys()).sort((le,we)=>le-we).filter(le=>{let we=re.get(le);return we?!be.some(We=>We.test(we.line)):!1});if(ce.length===0)continue;Y++,te+=ce.length;let L=It(K);if(ge.push({file:L,anchor_lines:ce.slice(0,20),num_lines:F}),g){X.push({file:K,matches:[],matchCount:ce.length});continue}C();let ee=[];Array.from(re.keys()).sort((le,we)=>le-we).forEach(le=>{let we=re.get(le);if(!we)return;let We=ce.includes(le);if(ee.push({lineNum:le,line:we.line,isMatch:We}),We&&_e.length<p){for(let ye of we.queryIds)if(_e.push({file:L,line:le,column:we.column,preview:we.line,queryId:ye}),_e.length>=p)break}}),X.push({file:K,matches:ee,matchCount:ce.length});}X.sort((K,re)=>It(K.file).localeCompare(It(re.file)));let Se=K=>{let se=It(K).split(Ie__default.sep),ve=se.findIndex(Be=>["src","lib","app","core","packages"].includes(Be));return ve>=0&&ve+1<se.length?se[ve+1]:se[0]||"root"},pe=[`\u2713 \u641C\u7D22: ${P}`,`\u25B8 \u8DEF\u5F84: ${O}${N?" (\u9012\u5F52)":""}${I==="ancestor"?" (auto-resolved)":""}`,l?`\u25B8 \u6587\u4EF6\u8FC7\u6EE4: ${l}`:"",u?"\u25B8 \u6A21\u5F0F: \u5FFD\u7565\u5927\u5C0F\u5199":"",$?"\u25B8 \u7B56\u7565: ripgrep":"\u25B8 \u7B56\u7565: fallback","","\u2501\u2501\u2501\u2501 \u7ED3\u679C\u6458\u8981 \u2501\u2501\u2501\u2501",ae>0?`\u6587\u4EF6: ${ae} \u5DF2\u641C\u7D22, ${Y} \u6709\u5339\u914D`:`\u6587\u4EF6: ${Y} \u6709\u5339\u914D`,`\u5339\u914D: ${te}${te>=p?" (\u5DF2\u8FBE\u4E0A\u9650)":""}`].filter(K=>K!==""),J=new Map,he=0;for(let K of X){he++,he%T===0&&await S();let re=Se(K.file);J.set(re,(J.get(re)||0)+K.matchCount);}if(J.size>1){pe.push(""),pe.push("\u{1F4E6} \u6A21\u5757\u5206\u5E03:");let K=Array.from(J.entries()).sort((re,se)=>se[1]-re[1]);for(let[re,se]of K.slice(0,5))pe.push(` ${re}: ${se}`);K.length>5&&pe.push(` ... \u8FD8\u6709 ${K.length-5} \u4E2A\u6A21\u5757`);}if(pe.push(""),g){pe.push("\u{1F4CB} \u6587\u4EF6\u5217\u8868:");let K=0;for(let re of X){K++,K%T===0&&await S();let se=It(re.file),ve=Se(re.file);pe.push(` [${ve}] ${se}: ${re.matchCount}`);}}else {let K=0,re=100;for(let se of X){if(C(),Ae>=p){pe.push(`
|
|
1523
1523
|
... \u8FD8\u6709\u66F4\u591A\u5339\u914D (\u5DF2\u8FBE ${p} \u4E0A\u9650)`);break}let ve=It(se.file),Be=Se(se.file);pe.push(`
|
|
1524
|
-
\u25B8 [${Be}] ${ve} (${se.matchCount} \u5904)`),pe.push("\u2500".repeat(50));let ce=-10;for(let L of se.matches){if(Ae>=p)break;K++,K%re===0&&await S(),L.lineNum>ce+1&&ce>0&&pe.push(" \u2504\u2504\u2504");let ee=L.isMatch?"\u25B6":" ";pe.push(`${ee}${String(L.lineNum).padStart(5)} \u2502 ${L.line}`),ce=L.lineNum,L.isMatch&&Ae++;}}}return X.length===0?(pe.push("\u672A\u627E\u5230\u5339\u914D\u5185\u5BB9"),pe.push(""),pe.push("\u{1F4A1} \u5EFA\u8BAE:"),pe.push(" - \u5C1D\u8BD5 case_insensitive: true"),pe.push(" - \u5C1D\u8BD5 recursive: true \u641C\u7D22\u5B50\u76EE\u5F55"),pe.push(" - \u4F7F\u7528 keywords \u6216 queries \u7EC4\u5408\u641C\u7D22"),pe.push(' - \u67E5\u6587\u4EF6\u540D\u8BF7\u7528 mode="files"')):ge.length>0&&(pe.push(""),pe.push("\u{1F4A1} \u6279\u91CF\u8BFB\u53D6:"),ge.slice(0,3).forEach(K=>{pe.push(` readfile(path="${K.file}", anchor_lines=[${K.anchor_lines.join(",")}], num_lines=${K.num_lines})`);})),JSON.stringify(
|
|
1525
|
-
`),{metadata:{mode:"content",strategy:$?"rg":"fallback",regex:x.some(K=>K.regex),case_insensitive:u,path:O,resolved_from:I,queries:x,matches:_e,read_hints:ge,files_with_matches:Y,command:Pe.length>0?Pe[0]:void 0}}))}catch(y){return JSON.stringify(
|
|
1524
|
+
\u25B8 [${Be}] ${ve} (${se.matchCount} \u5904)`),pe.push("\u2500".repeat(50));let ce=-10;for(let L of se.matches){if(Ae>=p)break;K++,K%re===0&&await S(),L.lineNum>ce+1&&ce>0&&pe.push(" \u2504\u2504\u2504");let ee=L.isMatch?"\u25B6":" ";pe.push(`${ee}${String(L.lineNum).padStart(5)} \u2502 ${L.line}`),ce=L.lineNum,L.isMatch&&Ae++;}}}return X.length===0?(pe.push("\u672A\u627E\u5230\u5339\u914D\u5185\u5BB9"),pe.push(""),pe.push("\u{1F4A1} \u5EFA\u8BAE:"),pe.push(" - \u5C1D\u8BD5 case_insensitive: true"),pe.push(" - \u5C1D\u8BD5 recursive: true \u641C\u7D22\u5B50\u76EE\u5F55"),pe.push(" - \u4F7F\u7528 keywords \u6216 queries \u7EC4\u5408\u641C\u7D22"),pe.push(' - \u67E5\u6587\u4EF6\u540D\u8BF7\u7528 mode="files"')):ge.length>0&&(pe.push(""),pe.push("\u{1F4A1} \u6279\u91CF\u8BFB\u53D6:"),ge.slice(0,3).forEach(K=>{pe.push(` readfile(path="${K.file}", anchor_lines=[${K.anchor_lines.join(",")}], num_lines=${K.num_lines})`);})),JSON.stringify(Qe("search","success",X.length>0?`search "${P}" (${te} matches)`:`search "${P}" (no matches)`,pe.join(`
|
|
1525
|
+
`),{metadata:{mode:"content",strategy:$?"rg":"fallback",regex:x.some(K=>K.regex),case_insensitive:u,path:O,resolved_from:I,queries:x,matches:_e,read_hints:ge,files_with_matches:Y,command:Pe.length>0?Pe[0]:void 0}}))}catch(y){return JSON.stringify(Qe("search","error",`search failed: ${y.message}`,void 0,{error:y.message}))}}},gN={name:au.name,description:au.description,parameters:au.parameters,permission:{category:"read",allowInAskMode:true},async function(s){return yT(s)}},hN={name:"use_skill",description:`Execute a registered skill to get specialized instructions for a task.
|
|
1526
1526
|
|
|
1527
1527
|
Skills are pre-defined instruction sets for common tasks like:
|
|
1528
1528
|
- commit: Git commit workflow with best practices
|
|
@@ -1530,11 +1530,11 @@ Skills are pre-defined instruction sets for common tasks like:
|
|
|
1530
1530
|
|
|
1531
1531
|
When you recognize a user's intent matches a skill, call this tool to get the detailed instructions, then follow them to complete the task.
|
|
1532
1532
|
|
|
1533
|
-
Example: User says "\u5E2E\u6211\u63D0\u4EA4\u4EE3\u7801" \u2192 call use_skill(skill="commit")`,parameters:{type:"object",properties:{skill:{type:"string",description:'Skill name or alias (e.g., "commit", "review")'},args:{type:"string",description:'Optional arguments to pass to the skill (e.g., "-m \\"commit message\\"")'}},required:["skill"]},permission:{category:"read",allowInAskMode:true},async function(s){let{skill:e,args:t=""}=s,n=process.env[DT]||process.cwd();await
|
|
1533
|
+
Example: User says "\u5E2E\u6211\u63D0\u4EA4\u4EE3\u7801" \u2192 call use_skill(skill="commit")`,parameters:{type:"object",properties:{skill:{type:"string",description:'Skill name or alias (e.g., "commit", "review")'},args:{type:"string",description:'Optional arguments to pass to the skill (e.g., "-m \\"commit message\\"")'}},required:["skill"]},permission:{category:"read",allowInAskMode:true},async function(s){let{skill:e,args:t=""}=s,n=process.env[DT]||process.cwd();await tt.initialize(n);let r=tt.find(e);if(!r){let l=tt.list({userInvocable:true}).map(c=>c.id).join(", ");return `\u274C Skill not found: "${e}"
|
|
1534
1534
|
|
|
1535
1535
|
Available skills: ${l||"(none)"}
|
|
1536
1536
|
|
|
1537
|
-
To list all skills, use the /skills command.`}let i=await new Gs(
|
|
1537
|
+
To list all skills, use the /skills command.`}let i=await new Gs(tt).execute(e,t,{workDir:n,args:t,rawInput:`/${e} ${t}`.trim()});return i.success?`\u2705 Skill "${r.metadata.name}" loaded successfully.
|
|
1538
1538
|
|
|
1539
1539
|
\u{1F4CB} **Follow these instructions carefully:**
|
|
1540
1540
|
|
|
@@ -1542,7 +1542,7 @@ ${i.output}
|
|
|
1542
1542
|
|
|
1543
1543
|
---
|
|
1544
1544
|
\u26A0\uFE0F IMPORTANT: Now execute the above instructions step by step. Do not ask for confirmation unless the instructions explicitly require it.`:`\u274C Skill execution failed: ${i.error}`}},$T=[BL,WL,KL,JL,VL,zL,HL,qL,QL,ZL,eN,tN,nN,rN,iN,aN,lN,YL,XL,zw,cN,mN,Cg,wg,Tg,tT,gN,wT,hN];[...$T,zg];});function Q(s){process.stdout.write(s+`
|
|
1545
|
-
`);}var Tn=R(()=>{});function y$(){if(ii)return ii;try{let s=[join(Rh,"../package.json"),join(Rh,"../../package.json"),join(Rh,"../../../package.json")];for(let e of s)try{let t=JSON.parse(readFileSync(e,"utf-8"));if(t.version)return ii=t.version,ii}catch{continue}throw new Error("package.json not found")}catch{ii="2.0.9";}return ii}var f$,Rh,ii,ai,Cu=R(()=>{f$=fileURLToPath(import.meta.url),Rh=dirname(f$),ii=null;ai=y$();});function li(s,e,t=true){xu[e]||(xu[e]=0);let n=xu[e]%s.length,r=s[n];return t&&(xu[e]=(n+1)%s.length),r}function Su(s,e){if(e){let n=JSON.stringify(e);for(let r of k$)if(r.pattern.test(n))return r.status}let t=Lh[s]||Lh.default;return li(t,s)}function Px(s){let e=s.toLowerCase();for(let t of _$)if(t.pattern.test(e))return t.status;return null}function ku(){let s=Lh.default;return li(s,"default")}function Mx(s,e){return s&&e!==void 0?`Streaming: ${s} (${e} chars)`:li(I$,"streaming")}function Nh(s="default"){let e=Ex[s]||Ex.default;return li(e,`retry_${s}`)}function Rx(){return li(E$,"complete")}function Dx(s,e,t){let n=Ax[s]||Ax.default,r=e?n.success:n.error,o=li(r,`result_${s}_${e}`);if(e&&t!==void 0&&t>0){let i=t>=1024?`${(t/1024).toFixed(1)}KB`:`${t}B`;return `${o} (${i})`}return o}var Lh,k$,_$,xu,I$,Ex,E$,Ax,ja=R(()=>{Lh={Grep:["Searching...","Scanning code...","Finding matches...","Hunting patterns..."],Glob:["Finding files...","Scanning directories...","Locating files..."],WebSearch:["Searching web...","Looking online...","Browsing..."],Read:["Reading files...","Loading content...","Reviewing code...","Examining..."],WebFetch:["Fetching page...","Loading URL...","Downloading..."],Edit:["Editing code...","Making changes...","Updating file...","Modifying..."],Write:["Writing file...","Creating file...","Generating..."],NotebookEdit:["Editing notebook...","Updating cells..."],Bash:["Running command...","Executing...","Processing...","Working..."],BashOutput:["Reading output...","Checking results..."],KillShell:["Stopping process...","Terminating..."],Task:["Spawning agent...","Delegating task...","Working in parallel..."],TodoWrite:["Updating tasks...","Planning...","Organizing..."],TodoRead:["Checking tasks...","Reviewing plan..."],AskUserQuestion:["Waiting for input...","Asking question..."],default:["Thinking...","Processing...","Analyzing...","Pondering...","Contemplating..."]},k$=[{pattern:/test|spec|__test__|\.test\.|\.spec\./i,status:"Reviewing tests..."},{pattern:/\.md$|readme|doc/i,status:"Reading docs..."},{pattern:/package\.json|tsconfig|config/i,status:"Checking config..."},{pattern:/\.css$|\.scss$|\.less$|style/i,status:"Reviewing styles..."},{pattern:/error|exception|bug|issue/i,status:"Hunting bugs..."},{pattern:/TODO|FIXME|HACK/i,status:"Finding TODOs..."},{pattern:/import|require|from\s+['"]/i,status:"Tracing imports..."},{pattern:/function|class|interface|type\s+\w+/i,status:"Analyzing code..."},{pattern:/npm install|yarn add|pnpm add/i,status:"Installing deps..."},{pattern:/npm run|yarn run|pnpm run/i,status:"Running script..."},{pattern:/npm test|jest|vitest|mocha/i,status:"Running tests..."},{pattern:/npm run build|yarn build|tsc/i,status:"Building..."},{pattern:/git\s+(status|log|diff)/i,status:"Checking git..."},{pattern:/git\s+(add|commit|push)/i,status:"Git operation..."},{pattern:/git\s+clone/i,status:"Cloning repo..."},{pattern:/docker/i,status:"Docker operation..."},{pattern:/curl|wget|fetch/i,status:"Fetching data..."}],_$=[{pattern:/fix|bug|error|issue|problem/i,status:"Debugging..."},{pattern:/refactor|clean|improve|optimize/i,status:"Refactoring..."},{pattern:/search|find|look for|where/i,status:"Searching..."},{pattern:/read|check|review|examine/i,status:"Reviewing..."},{pattern:/write|create|add|implement|build/i,status:"Implementing..."},{pattern:/test|verify|validate/i,status:"Testing..."},{pattern:/plan|design|architect/i,status:"Planning..."},{pattern:/understand|analyze|figure out/i,status:"Analyzing..."},{pattern:/delete|remove|clean up/i,status:"Cleaning up..."},{pattern:/rename|move|reorganize/i,status:"Reorganizing..."}],xu={};I$=["Streaming...","Receiving data...","Downloading...","Fetching..."],Ex={rateLimit:["Rate limited, waiting...","Cooling down...","Pausing..."],timeout:["Timed out, retrying...","Reconnecting...","Trying again..."],network:["Network issue, reconnecting...","Connection lost, retrying..."],default:["Retrying...","Trying again...","Recovering..."]},E$=["Complete!","Done!","Finished!","All done!"],Ax={Grep:{success:["Found matches!","Search complete","Results ready"],error:["No matches found","Search failed"]},Read:{success:["File loaded","Content ready","Read complete"],error:["Failed to read","File not found"]},Edit:{success:["Changes saved","File updated","Edit complete"],error:["Edit failed","Could not save"]},Write:{success:["File created","Write complete","Saved!"],error:["Write failed","Could not create"]},Bash:{success:["Command done","Executed!","Process complete"],error:["Command failed","Exit with error"]},Task:{success:["Agent complete","Task done","Subtask finished"],error:["Agent failed","Task error"]},default:{success:["Done","Complete","Finished"],error:["Failed","Error"]}};});var R$,D$,L$,N$,$$,O$,B$,$h,on,us=R(()=>{R$={"gpt-5.2":{id:"gpt-5.2",displayName:"GPT-5.2",provider:"openai",maxInputTokens:4e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:96,reasoning:98,vision:92,creativity:94,speed:75,cost:25},releaseDate:"2025-12-11",notes:'400K \u4E0A\u4E0B\u6587\u7A97\u53E3,128K \u8F93\u51FA\u9650\u5236,\u4EE3\u53F7"Garlic"'},"gpt-5.2-codex":{id:"gpt-5.2-codex",displayName:"GPT-5.2 Codex",provider:"openai",aliases:["gpt-5.2-codex"],maxInputTokens:4e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:98,reasoning:97,vision:90,creativity:92,speed:70,cost:20},releaseDate:"2025-12-10",notes:"GPT-5.2 \u7684 Codex \u9ED8\u8BA4\u7248\u672C,\u4E13\u4E3A\u7F16\u7A0B\u4EFB\u52A1\u4F18\u5316"},"gpt-5.2-codex-high":{id:"gpt-5.2-codex-high",displayName:"GPT-5.2 Codex High",provider:"openai",aliases:["gpt-5.2-codex-h"],maxInputTokens:4e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:99,reasoning:98,vision:90,creativity:93,speed:60,cost:15},releaseDate:"2025-12-10",notes:"GPT-5.2 Codex \u9AD8\u6027\u80FD\u6A21\u5F0F,\u6700\u5F3A\u7F16\u7A0B\u80FD\u529B,\u66F4\u6162\u66F4\u8D35"},"gpt-5.2-codex-medium":{id:"gpt-5.2-codex-medium",displayName:"GPT-5.2 Codex Medium",provider:"openai",aliases:["gpt-5.2-codex-m"],maxInputTokens:4e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:95,reasoning:94,vision:88,creativity:90,speed:80,cost:40},releaseDate:"2025-12-10",notes:"GPT-5.2 Codex \u5E73\u8861\u6A21\u5F0F,\u6027\u4EF7\u6BD4\u4F18\u9009"},"gpt-5.1":{id:"gpt-5.1",displayName:"GPT-5.1",provider:"openai",maxInputTokens:272e3,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:94,reasoning:96,vision:90,creativity:92,speed:80,cost:30},notes:"272K \u4E0A\u4E0B\u6587,128K \u8F93\u51FA,\u9002\u5408\u957F\u4E0A\u4E0B\u6587\u4EFB\u52A1"},"gpt-5.1-codex":{id:"gpt-5.1-codex",displayName:"GPT-5.1 Codex",provider:"openai",aliases:["gpt-5-codex","gpt-5.1-codex-max"],maxInputTokens:4e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:97,reasoning:95,vision:88,creativity:90,speed:75,cost:25},notes:"Codex \u4F18\u5316\u7248,400K \u4E0A\u4E0B\u6587,\u4E13\u4E3A agentic \u7F16\u7A0B\u5DE5\u4F5C\u6D41\u8BBE\u8BA1"},"gpt-5.1-codex-mini":{id:"gpt-5.1-codex-mini",displayName:"GPT-5.1 Codex Mini",provider:"openai",aliases:["gpt-5-codex-mini"],maxInputTokens:272e3,maxOutputTokens:128e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:88,vision:0,creativity:85,speed:92,cost:85},notes:"\u66F4\u5FEB\u66F4\u4FBF\u5B9C\u7684 Codex \u7248\u672C"},"gpt-5":{id:"gpt-5",displayName:"GPT-5",provider:"openai",maxInputTokens:4e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:92,reasoning:94,vision:90,creativity:94,speed:80,cost:35},deprecated:true,replacedBy:"gpt-5.1",notes:"\u5DF2\u88AB GPT-5.1 \u66FF\u4EE3"},"gpt-4.1":{id:"gpt-4.1",displayName:"GPT-4.1",provider:"openai",aliases:["gpt-4.1-2025-04-14"],maxInputTokens:1e6,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:92,vision:88,creativity:90,speed:65,cost:15},releaseDate:"2025-04-14",notes:"\u8D85\u5927 1M+ \u4E0A\u4E0B\u6587\u7A97\u53E3,\u9002\u5408\u5904\u7406\u5927\u578B\u4EE3\u7801\u5E93"},"gpt-4o":{id:"gpt-4o",displayName:"GPT-4o",provider:"openai",aliases:["gpt-4o-2024-11-20","gpt-4o-2024-08-06"],maxInputTokens:128e3,maxOutputTokens:16384,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:88,reasoning:85,vision:88,creativity:88,speed:75,cost:50}},"gpt-4o-mini":{id:"gpt-4o-mini",displayName:"GPT-4o Mini",provider:"openai",aliases:["gpt-4o-mini-2024-07-18"],maxInputTokens:128e3,maxOutputTokens:16384,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:75,reasoning:72,vision:80,creativity:75,speed:92,cost:90}},o3:{id:"o3",displayName:"o3",provider:"openai",maxInputTokens:2e5,maxOutputTokens:1e5,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:92,reasoning:99,vision:0,creativity:78,speed:40,cost:15},notes:"\u65B0\u4E00\u4EE3\u63A8\u7406\u6A21\u578B,\u63A8\u7406\u80FD\u529B\u6700\u5F3A"},"o3-mini":{id:"o3-mini",displayName:"o3 Mini",provider:"openai",aliases:["o3-mini-2025-01-31"],maxInputTokens:2e5,maxOutputTokens:1e5,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:88,reasoning:95,vision:0,creativity:75,speed:65,cost:60}},"o4-mini":{id:"o4-mini",displayName:"o4 Mini",provider:"openai",maxInputTokens:2e5,maxOutputTokens:1e5,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:90,reasoning:96,vision:0,creativity:76,speed:70,cost:55}},o1:{id:"o1",displayName:"o1",provider:"openai",aliases:["o1-2024-12-17"],maxInputTokens:2e5,maxOutputTokens:1e5,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:88,reasoning:95,vision:0,creativity:75,speed:45,cost:25}},"o1-mini":{id:"o1-mini",displayName:"o1 Mini",provider:"openai",aliases:["o1-mini-2024-09-12"],maxInputTokens:128e3,maxOutputTokens:65536,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:82,reasoning:88,vision:0,creativity:70,speed:70,cost:70}},"codex-mini-latest":{id:"codex-mini-latest",displayName:"Codex Mini (Latest)",provider:"openai",maxInputTokens:2e5,maxOutputTokens:1e5,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:85,reasoning:82,vision:0,creativity:75,speed:88,cost:80}},"gpt-4-turbo":{id:"gpt-4-turbo",displayName:"GPT-4 Turbo",provider:"openai",aliases:["gpt-4-turbo-2024-04-09"],maxInputTokens:128e3,maxOutputTokens:4096,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:87,vision:85,creativity:90,speed:70,cost:40}},"gpt-3.5-turbo":{id:"gpt-3.5-turbo",displayName:"GPT-3.5 Turbo",provider:"openai",maxInputTokens:16385,maxOutputTokens:4096,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:65,reasoning:60,vision:0,creativity:70,speed:95,cost:98}}},D$={"claude-opus-4-6":{id:"claude-opus-4-6",displayName:"Claude Opus 4.6",provider:"anthropic",aliases:["claude-opus-4.6"],maxInputTokens:2e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:99,reasoning:98,vision:91,creativity:96,speed:66,cost:18},notes:"Claude Opus 4.6 (latest alias)"},"claude-opus-4-5-20251101":{id:"claude-opus-4-5-20251101",displayName:"Claude Opus 4.5",provider:"anthropic",aliases:["claude-opus-4.5"],maxInputTokens:2e5,maxOutputTokens:32e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:98,reasoning:97,vision:90,creativity:95,speed:65,cost:20},releaseDate:"2025-11-24",notes:"\u6700\u5F3A Claude \u6A21\u578B,\u652F\u6301 Extended Thinking,\u4F01\u4E1A\u7248\u53EF\u6269\u5C55\u81F3 1M \u4E0A\u4E0B\u6587"},"claude-sonnet-4-5-20250929":{id:"claude-sonnet-4-5-20250929",displayName:"Claude Sonnet 4.5",provider:"anthropic",aliases:["claude-sonnet-4.5","claude-sonnet-4-5-20250929-thinking"],maxInputTokens:2e5,maxOutputTokens:16e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:92,reasoning:90,vision:88,creativity:90,speed:80,cost:50},releaseDate:"2025-09-29",notes:"\u5E73\u8861\u6027\u80FD\u4E0E\u6210\u672C,beta \u7248\u672C\u652F\u6301 1M \u4E0A\u4E0B\u6587"},"claude-sonnet-4-20250514":{id:"claude-sonnet-4-20250514",displayName:"Claude Sonnet 4",provider:"anthropic",aliases:["claude-sonnet-4"],maxInputTokens:2e5,maxOutputTokens:16e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:88,vision:85,creativity:88,speed:82,cost:55},notes:"2025-08-12 \u5347\u7EA7\u652F\u6301 1M beta \u4E0A\u4E0B\u6587"},"claude-opus-4-20250514":{id:"claude-opus-4-20250514",displayName:"Claude Opus 4",provider:"anthropic",aliases:["claude-opus-4"],maxInputTokens:2e5,maxOutputTokens:32e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:96,reasoning:95,vision:88,creativity:94,speed:70,cost:25}},"claude-haiku-4-5-20251001":{id:"claude-haiku-4-5-20251001",displayName:"Claude Haiku 4.5",provider:"anthropic",aliases:["claude-haiku-4.5"],maxInputTokens:2e5,maxOutputTokens:8e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:78,reasoning:75,vision:80,creativity:75,speed:95,cost:95},notes:"\u6700\u5FEB\u6700\u4FBF\u5B9C\u7684 Claude 4.5 \u6A21\u578B"},"claude-3-5-sonnet-20241022":{id:"claude-3-5-sonnet-20241022",displayName:"Claude 3.5 Sonnet (New)",provider:"anthropic",aliases:["claude-3.5-sonnet-new","claude-3-5-sonnet-latest"],maxInputTokens:2e5,maxOutputTokens:16e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:88,vision:85,creativity:87,speed:85,cost:55},releaseDate:"2024-10-22",notes:"Claude 3.5 Sonnet \u5347\u7EA7\u7248"},"claude-3-5-haiku-20241022":{id:"claude-3-5-haiku-20241022",displayName:"Claude 3.5 Haiku",provider:"anthropic",aliases:["claude-3.5-haiku"],maxInputTokens:2e5,maxOutputTokens:8e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:75,reasoning:72,vision:78,creativity:73,speed:98,cost:98},releaseDate:"2024-10-22",notes:"\u6700\u5FEB\u6700\u4FBF\u5B9C\u7684 Claude 3.5 \u6A21\u578B"}},L$={"gemini-3-pro-preview":{id:"gemini-3-pro-preview",displayName:"Gemini 3 Pro Preview",provider:"gemini",aliases:["gemini-3-pro","gemini-3.0-pro-preview"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:94,reasoning:95,vision:96,creativity:94,speed:72,cost:35},releaseDate:"2026-01",notes:"Gemini 3 \u9884\u89C8\u7248,UI/\u89C6\u89C9\u8BBE\u8BA1\u4E13\u957F,1M \u4E0A\u4E0B\u6587"},"gemini-3.0-pro":{id:"gemini-3.0-pro",displayName:"Gemini 3.0 Pro",provider:"gemini",aliases:["gemini-3.0-pro-latest"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:95,reasoning:96,vision:94,creativity:92,speed:70,cost:30},releaseDate:"2025-12",notes:"Flagship multimodal model with 1M context, high-precision reasoning"},"gemini-2.5-flash":{id:"gemini-2.5-flash",displayName:"Gemini 2.5 Flash",provider:"gemini",aliases:["gemini-2.5-flash-latest"],maxInputTokens:1048576,maxOutputTokens:65535,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:88,vision:90,creativity:87,speed:92,cost:85},releaseDate:"2025-03",notes:"Fast and cost-efficient, ~1500 pages or 30K lines of code"},"gemini-2.5-pro":{id:"gemini-2.5-pro",displayName:"Gemini 2.5 Pro",provider:"gemini",aliases:["gemini-2.5-pro-latest"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:93,reasoning:92,vision:92,creativity:90,speed:75,cost:40},releaseDate:"2025-03",notes:"Balanced performance with 1M context window"},"gemini-2.0-flash-thinking":{id:"gemini-2.0-flash-thinking",displayName:"Gemini 2.0 Flash Thinking",provider:"gemini",aliases:["gemini-2.0-flash-thinking-exp","gemini-2.0-flash-thinking-experimental"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:92,reasoning:94,vision:90,creativity:88,speed:85,cost:50},releaseDate:"2024-12-19",notes:"Shows model thought process, 1M context window"},"gemini-2.0-flash":{id:"gemini-2.0-flash",displayName:"Gemini 2.0 Flash",provider:"gemini",aliases:["gemini-2.0-flash-exp","gemini-2.0-flash-experimental"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:89,vision:90,creativity:87,speed:95,cost:75},releaseDate:"2024-12-11",notes:"Twice as fast as Gemini 1.5 Pro, multimodal with native image generation"},"gemini-1.5-pro":{id:"gemini-1.5-pro",displayName:"Gemini 1.5 Pro",provider:"gemini",aliases:["gemini-1.5-pro-latest","gemini-pro"],maxInputTokens:2e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:88,reasoning:87,vision:88,creativity:85,speed:70,cost:50},releaseDate:"2024-05",notes:"2M context window - largest available, supports context caching"},"gemini-1.5-flash":{id:"gemini-1.5-flash",displayName:"Gemini 1.5 Flash",provider:"gemini",aliases:["gemini-1.5-flash-latest","gemini-flash"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:85,reasoning:83,vision:85,creativity:82,speed:90,cost:85},releaseDate:"2024-05",notes:"Fast and efficient with 1M context, supports code execution"},"gemini-1.5-flash-8b":{id:"gemini-1.5-flash-8b",displayName:"Gemini 1.5 Flash-8B",provider:"gemini",aliases:["gemini-flash-8b"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:80,reasoning:78,vision:82,creativity:77,speed:98,cost:95},releaseDate:"2024-10",notes:"Smaller 8B model, extremely fast and cost-effective"},"gemini-1.0-pro":{id:"gemini-1.0-pro",displayName:"Gemini 1.0 Pro",provider:"gemini",aliases:["gemini-pro-1.0"],maxInputTokens:32768,maxOutputTokens:8192,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:75,reasoning:73,vision:0,creativity:75,speed:85,cost:90},releaseDate:"2023-12",notes:"Original Gemini Pro, text-only"},"gemini-1.0-pro-vision":{id:"gemini-1.0-pro-vision",displayName:"Gemini 1.0 Pro Vision",provider:"gemini",aliases:["gemini-pro-vision"],maxInputTokens:16384,maxOutputTokens:2048,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:70,reasoning:68,vision:80,creativity:72,speed:80,cost:88},releaseDate:"2023-12",notes:"Original multimodal Gemini with vision support"}},N$={"kimi-k2-0905-preview":{id:"kimi-k2-0905-preview",displayName:"Kimi K2 (0905 Preview)",provider:"kimi",aliases:["kimi-k2","kimi-k2-preview"],maxInputTokens:256e3,maxOutputTokens:8192,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:92,reasoning:90,vision:0,creativity:80,speed:85,cost:70},releaseDate:"2025-09",notes:"MoE \u67B6\u6784 K2 \u9884\u89C8\u7248\uFF0C256K \u4E0A\u4E0B\u6587"}},$$={"deepseek-v3.2":{id:"deepseek-v3.2",displayName:"DeepSeek V3.2",provider:"deepseek",aliases:["deepseek-v3.2-exp"],maxInputTokens:128e3,maxOutputTokens:32e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:92,reasoning:90,vision:0,creativity:80,speed:85,cost:95},releaseDate:"2025-09-29",notes:"\u5B9E\u9A8C\u7248\u672C,\u6027\u80FD\u663E\u8457\u63D0\u5347"},"deepseek-v3.1":{id:"deepseek-v3.1",displayName:"DeepSeek V3.1",provider:"deepseek",maxInputTokens:128e3,maxOutputTokens:32e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:88,vision:0,creativity:78,speed:88,cost:96},releaseDate:"2025-08",notes:"\u6DF7\u5408\u67B6\u6784\u6A21\u578B"},"deepseek-chat":{id:"deepseek-chat",displayName:"DeepSeek Chat",provider:"deepseek",maxInputTokens:64e3,maxOutputTokens:32e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:85,reasoning:82,vision:0,creativity:75,speed:85,cost:95},notes:"\u901A\u7528\u5BF9\u8BDD\u6A21\u578B,\u6210\u672C\u6781\u4F4E"},"deepseek-coder":{id:"deepseek-coder",displayName:"DeepSeek Coder",provider:"deepseek",maxInputTokens:64e3,maxOutputTokens:32e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:95,reasoning:85,vision:0,creativity:70,speed:88,cost:96},notes:"\u4E13\u4E3A\u7F16\u7A0B\u4F18\u5316,\u4EE3\u7801\u80FD\u529B\u7A81\u51FA"},"deepseek-reasoner":{id:"deepseek-reasoner",displayName:"DeepSeek Reasoner",provider:"deepseek",maxInputTokens:64e3,maxOutputTokens:64e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:88,reasoning:96,vision:0,creativity:75,speed:60,cost:90},notes:"\u63A8\u7406\u4E13\u7528\u6A21\u578B,\u652F\u6301\u957F\u8F93\u51FA"}},O$={"minimax-text-01":{id:"minimax-text-01",displayName:"MiniMax Text-01",provider:"minimax",maxInputTokens:4e6,maxOutputTokens:1e6,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:88,reasoning:90,vision:0,creativity:85,speed:55,cost:70},notes:"4M \u4E0A\u4E0B\u6587\u7A97\u53E3,Lightning Attention + MoE \u67B6\u6784,\u5F00\u6E90\u53EF\u7528"},"minimax-m1-80k":{id:"minimax-m1-80k",displayName:"MiniMax M1-80K",provider:"minimax",maxInputTokens:1e6,maxOutputTokens:8e4,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:90,reasoning:92,vision:0,creativity:82,speed:65,cost:75},notes:"1M \u4E0A\u4E0B\u6587 + 80K \u601D\u8003\u9884\u7B97"},"minimax-m2.1":{id:"minimax-m2.1",displayName:"MiniMax M2.1",provider:"minimax",maxInputTokens:2e5,maxOutputTokens:64e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:93,reasoning:88,vision:0,creativity:80,speed:82,cost:85},releaseDate:"2025-12",notes:"\u7F16\u7A0B\u548C Agentic \u5DE5\u4F5C\u6D41\u4F18\u5316,\u652F\u6301\u591A\u8BED\u8A00"},"minimax-vl-01":{id:"minimax-vl-01",displayName:"MiniMax VL-01",provider:"minimax",maxInputTokens:4e6,maxOutputTokens:1e6,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:85,reasoning:88,vision:92,creativity:88,speed:60,cost:65},notes:"\u591A\u6A21\u6001\u6A21\u578B,\u652F\u6301\u6587\u672C\u548C\u56FE\u50CF"}},B$={"glm-4.7":{id:"glm-4.7",displayName:"GLM-4.7",provider:"glm",maxInputTokens:2e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:88,vision:85,creativity:87,speed:80,cost:70},releaseDate:"2025-12-22",notes:"\u6700\u65B0\u7248\u672C,200K \u4E0A\u4E0B\u6587,128K \u8F93\u51FA"},"glm-4.6":{id:"glm-4.6",displayName:"GLM-4.6",provider:"glm",maxInputTokens:2e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:88,reasoning:86,vision:83,creativity:85,speed:82,cost:75},releaseDate:"2025-09-10",notes:"\u4ECE 128K \u6269\u5C55\u81F3 200K \u4E0A\u4E0B\u6587"},"glm-4.5":{id:"glm-4.5",displayName:"GLM-4.5",provider:"glm",maxInputTokens:128e3,maxOutputTokens:32e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:86,reasoning:84,vision:80,creativity:83,speed:85,cost:80},releaseDate:"2025-07"},"glm-4-flash":{id:"glm-4-flash",displayName:"GLM-4 Flash",provider:"glm",maxInputTokens:128e3,maxOutputTokens:32e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:82,reasoning:80,vision:78,creativity:80,speed:95,cost:92},notes:"\u5FEB\u901F\u6A21\u578B,\u76F8\u5F53\u4E8E 300 \u9875\u4E66\u7684\u4E0A\u4E0B\u6587"},"glm-4-plus":{id:"glm-4-plus",displayName:"GLM-4 Plus",provider:"glm",maxInputTokens:128e3,maxOutputTokens:32e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:88,reasoning:86,vision:82,creativity:85,speed:78,cost:65}},"glm-4-air":{id:"glm-4-air",displayName:"GLM-4 Air",provider:"glm",maxInputTokens:128e3,maxOutputTokens:32e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:80,reasoning:78,vision:0,creativity:78,speed:90,cost:88}},"glm-4-long":{id:"glm-4-long",displayName:"GLM-4 Long",provider:"glm",maxInputTokens:1e6,maxOutputTokens:128e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:85,reasoning:88,vision:0,creativity:80,speed:50,cost:60},notes:"\u8D85\u957F\u4E0A\u4E0B\u6587\u4E13\u7528,1M tokens"},"glm-4-airx":{id:"glm-4-airx",displayName:"GLM-4 AirX",provider:"glm",maxInputTokens:8e3,maxOutputTokens:4096,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:70,reasoning:68,vision:0,creativity:70,speed:98,cost:98},notes:"\u8D85\u8F7B\u91CF\u7EA7\u6A21\u578B,\u6781\u5FEB\u901F\u5EA6"}},$h=class{models=new Map;constructor(){this.registerModels(R$),this.registerModels(D$),this.registerModels(L$),this.registerModels(N$),this.registerModels($$),this.registerModels(O$),this.registerModels(B$);}registerModels(e){for(let[t,n]of Object.entries(e))if(this.models.set(t,n),n.aliases)for(let r of n.aliases)this.models.set(r,n);}getModel(e){return this.models.get(e)}getAllModels(){let e=new Map;for(let t of this.models.values())e.set(t.id,t);return Array.from(e.values())}getModelsByProvider(e){return this.getAllModels().filter(t=>t.provider===e)}hasModel(e){return this.models.has(e)}toModelCapability(e){let t=this.getModel(e);if(t)return {modelAlias:t.id,strengths:this.inferStrengths(t),scores:{coding:t.scores?.coding??50,reasoning:t.scores?.reasoning??50,vision:t.scores?.vision??0,creativity:t.scores?.creativity??50,speed:t.scores?.speed??50,cost:t.scores?.cost??50},features:{supportsVision:t.supportsVision??false,supportsTools:t.supportsTools??false,supportsFunctionCalling:t.supportsFunctionCalling??false,supportsStreaming:t.supportsStreaming??false,maxContextTokens:t.maxInputTokens,maxOutputTokens:t.maxOutputTokens}}}inferStrengths(e){let t=[],n=e.scores??{};return (n.coding??0)>=85&&t.push("coding"),(n.reasoning??0)>=85&&t.push("reasoning"),(n.vision??0)>=85&&t.push("image_analysis"),(n.creativity??0)>=85&&t.push("creative_writing"),t}},on=new $h;});function Fh(s,e){return `mcp__${s}__${e}`}function Uh(s){if(!s.startsWith("mcp__"))return null;let e=s.split("__");if(e.length<3)return null;let t=e[1],n=e.slice(2).join("__");return !t||!n?null:{serverId:t,toolName:n}}var Du=R(()=>{});var jh,nt,cr=R(()=>{Tt();jh={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"},nt=class{config;constructor(e){this.config=e??He(),this.config.providers||(this.config.providers={});}sanitizeId(e){return e.toLowerCase().trim().replace(/[^a-z0-9-]+/g,"-").replace(/^-+|-+$/g,"").substring(0,48)}ensureValidId(e){let t=this.sanitizeId(e);if(!t)throw new Error("Provider ID must contain letters or numbers (allowed: lowercase letters, numbers, hyphen).");if(!/^[a-z0-9][a-z0-9-]*$/.test(t))throw new Error("Provider ID can only include lowercase letters, numbers, and hyphen.");return t}slugifyName(e){return this.sanitizeId(e)||"provider"}ensureProviderId(e,t){let n=e||this.slugifyName(t||"provider");if(this.config.providers||(this.config.providers={}),!this.config.providers[n])return n;let r=2,o=`${n}-${r}`;for(;this.config.providers[o];)r+=1,o=`${n}-${r}`;return o}persist(){Me(this.config);}getProviderCount(){return Object.keys(this.config.providers||{}).length}getProviders(){return Object.values(this.config.providers||{}).sort((e,t)=>e.name.localeCompare(t.name))}getProvider(e){if(e)return this.config.providers?.[e]}getDefaultProvider(){if(this.config.defaultProviderId){let t=this.getProvider(this.config.defaultProviderId);if(t)return t}let[e]=this.getProviders();return e&&(this.config.defaultProviderId=e.id,this.persist()),e}setDefaultProvider(e){let t=this.getProvider(e);if(!t)throw new Error(`Provider "${e}" does not exist.`);return this.config.defaultProviderId=e,this.persist(),t}addProvider(e){if(!e.name.trim())throw new Error("Provider name is required.");if(!e.apiKey.trim())throw new Error("Provider API key/token is required.");let t=this.ensureProviderId(e.id,e.name),n=new Date().toISOString(),r=e.baseUrl?.trim()||jh[e.protocol],o=(e.models||[]).map(a=>typeof a=="string"?{name:a,createdAt:n}:{...a,createdAt:a.createdAt||n}),i={id:t,name:e.name.trim(),protocol:e.protocol,apiKey:e.apiKey.trim(),baseUrl:r,urlSuffix:e.urlSuffix,maxTokens:e.maxTokens,maxInputTokens:e.maxInputTokens,models:o,defaultModel:e.defaultModel||o[0]?.name,lastSelectedModel:e.defaultModel||o[0]?.name,createdAt:n,updatedAt:n};if(!i.defaultModel)throw new Error("At least one model is required when creating a provider.");return this.config.providers||(this.config.providers={}),this.config.providers[t]=i,(!this.config.defaultProviderId||e.setAsDefault)&&(this.config.defaultProviderId=t),this.persist(),i}updateProvider(e,t){let n=this.getProvider(e);if(!n)throw new Error(`Provider "${e}" does not exist.`);let r=new Date().toISOString(),o={...n,...t,baseUrl:t.baseUrl?.trim()||n.baseUrl||jh[n.protocol],urlSuffix:t.urlSuffix!==void 0?t.urlSuffix:n.urlSuffix,apiKey:t.apiKey?.trim()||n.apiKey,maxTokens:t.maxTokens!==void 0?t.maxTokens:n.maxTokens,maxInputTokens:t.maxInputTokens!==void 0?t.maxInputTokens:n.maxInputTokens,updatedAt:r};if(t.protocol&&t.protocol!==n.protocol&&(o.protocol=t.protocol,t.baseUrl||(o.baseUrl=jh[t.protocol])),t.defaultModel){if(!o.models.some(a=>a.name===t.defaultModel))throw new Error(`Model "${t.defaultModel}" does not exist for provider "${e}".`);o.defaultModel=t.defaultModel,o.lastSelectedModel=t.defaultModel;}return this.config.providers[e]=o,this.persist(),o}renameProvider(e,t){let n=this.getProvider(e);if(!n)throw new Error(`Provider "${e}" does not exist.`);let r=this.ensureValidId(t);if(r===e)return n;if(this.config.providers?.[r])throw new Error(`Provider ID "${r}" already exists.`);delete this.config.providers[e];let o=new Date().toISOString(),i={...n,id:r,updatedAt:o};return this.config.providers[r]=i,this.config.defaultProviderId===e&&(this.config.defaultProviderId=r),this.persist(),i}deleteProvider(e){if(!this.config.providers?.[e])throw new Error(`Provider "${e}" does not exist.`);delete this.config.providers[e],this.config.defaultProviderId===e&&(this.config.defaultProviderId=void 0),this.persist();}addModel(e,t,n=false,r){let o=this.getProvider(e);if(!o)throw new Error(`Provider "${e}" does not exist.`);let i=t.trim();if(!i)throw new Error("Model name cannot be empty.");if(o.models.some(l=>l.name===i))throw new Error(`Model "${i}" already exists for provider "${e}".`);let a={...o,models:[...o.models,{name:i,createdAt:new Date().toISOString(),...r}],updatedAt:new Date().toISOString()};return (!o.defaultModel||n)&&(a.defaultModel=i,a.lastSelectedModel=i),this.config.providers[e]=a,this.persist(),a}removeModel(e,t){let n=this.getProvider(e);if(!n)throw new Error(`Provider "${e}" does not exist.`);if(n.models.length<=1)throw new Error("A provider must have at least one model.");let r=n.models.filter(i=>i.name!==t);if(r.length===n.models.length)throw new Error(`Model "${t}" does not exist for provider "${e}".`);let o={...n,models:r,updatedAt:new Date().toISOString()};return n.defaultModel===t&&(o.defaultModel=r[0].name),n.lastSelectedModel===t&&(o.lastSelectedModel=o.defaultModel),this.config.providers[e]=o,this.persist(),o}updateModelConfig(e,t,n){let r=this.getProvider(e);if(!r)throw new Error(`Provider "${e}" does not exist.`);let o=r.models.findIndex(l=>l.name===t);if(o===-1)throw new Error(`Model "${t}" does not exist for provider "${e}".`);let i=[...r.models];i[o]={...i[o],...n};let a={...r,models:i,updatedAt:new Date().toISOString()};return this.config.providers[e]=a,this.persist(),a}setLastSelectedModel(e,t){let n=this.getProvider(e);if(!n)throw new Error(`Provider "${e}" does not exist.`);if(!n.models.some(o=>o.name===t))throw new Error(`Model "${t}" does not exist for provider "${e}".`);return n.lastSelectedModel=t,n.updatedAt=new Date().toISOString(),this.config.providers[e]=n,this.persist(),n}resolveModel(e,t){let n=this.getProvider(e);if(n)return t&&n.models.some(o=>o.name===t)?t:n.lastSelectedModel||n.defaultModel||n.models[0]?.name}};});var Gh,ui,Lt,Vs=R(()=>{Tt();cr();us();Gh={"claude-opus-4-5-20250514":["reasoning","creative","thorough","\u6DF1\u5EA6\u601D\u8003","\u590D\u6742\u63A8\u7406"],"claude-sonnet-4-5-20250514":["coding","fast","accurate","\u4EE3\u7801","\u5FEB\u901F"],"claude-haiku-4-5-20250514":["fast","cheap","simple","\u8F7B\u91CF","\u4F4E\u6210\u672C"],"claude-opus-4-20250514":["reasoning","creative","thorough","\u6DF1\u5EA6\u601D\u8003"],"claude-sonnet-4-20250514":["coding","fast","accurate","\u4EE3\u7801"],"gpt-5.2":["reasoning","coding","thorough","\u6DF1\u5EA6\u63A8\u7406","\u5168\u80FD"],"gpt-5.2-mini":["reasoning","fast","balanced","\u63A8\u7406","\u5FEB\u901F"],"gpt-5.2-codex":["coding","agent","autonomous","\u4EE3\u7801\u4E13\u5BB6","\u81EA\u4E3B\u7F16\u7A0B"],"gpt-5.2-codex-high":["coding","agent","thorough","\u4EE3\u7801","\u6DF1\u5EA6\u7F16\u7A0B","\u6700\u5F3A"],"gpt-5.2-codex-medium":["coding","agent","balanced","\u4EE3\u7801","\u6027\u4EF7\u6BD4"],"gpt-5.1":["reasoning","coding","balanced","\u903B\u8F91\u7F1C\u5BC6","\u901A\u7528"],"gpt-5.1-mini":["fast","cheap","coding","\u5FEB\u901F","\u4F4E\u6210\u672C"],"gpt-5.1-codex":["coding","agent","autonomous","\u4EE3\u7801","\u7F16\u7A0B"],"gpt-5.1-codex-max":["coding","agent","thorough","\u4EE3\u7801","\u6DF1\u5EA6\u7F16\u7A0B"],o3:["reasoning","math","science","\u6DF1\u5EA6\u63A8\u7406","\u6570\u5B66"],"o4-mini":["reasoning","fast","coding","\u63A8\u7406","\u5FEB\u901F"],"gemini-3-pro-preview":["ui","design","vision","creative","UI\u8BBE\u8BA1","\u754C\u9762","\u89C6\u89C9"],"gemini-3.0-pro":["ui","design","vision","creative","UI\u8BBE\u8BA1","\u754C\u9762"],"gemini-3.0-flash":["ui","fast","vision","UI","\u5FEB\u901F"],"gemini-2.5-pro":["reasoning","long-context","vision","\u63A8\u7406","\u957F\u4E0A\u4E0B\u6587"],"gemini-2.5-flash":["fast","vision","multimodal","\u5FEB\u901F","\u591A\u6A21\u6001"],"deepseek-v3":["coding","reasoning","cheap","\u4EE3\u7801","\u6027\u4EF7\u6BD4"],"deepseek-r1":["reasoning","math","thinking","\u6DF1\u5EA6\u63A8\u7406","\u6570\u5B66"],"qwen-max":["chinese","reasoning","coding","\u4E2D\u6587","\u63A8\u7406"],"qwen-turbo":["chinese","fast","cheap","\u4E2D\u6587","\u5FEB\u901F"]},ui=6,Lt=class{providerStore;scope;constructor(e,t="assistant"){this.providerStore=e??new nt,this.scope=t;}readLegacyScopedConfig(e){if(this.scope==="assistant"){let t=e.assistant;return {...t??{},workerPool:t?.workerPool??[]}}return {workerPool:[]}}readScopedRunModeConfig(e){return e.runConfig?.modes?.[this.scope]}getConfig(){let e=He(),t=this.readScopedRunModeConfig(e);return t?{mainAgent:t.mainAgent,workerPool:t.workerPool??[],maxConcurrent:t.maxConcurrent,ccbReviewMode:t.ccbReviewMode,createdAt:t.createdAt,updatedAt:t.updatedAt}:this.readLegacyScopedConfig(e)}saveConfig(e){let t=He(),n=new Date().toISOString(),r=t.runConfig?.modes?.[this.scope]??{},o={...r,mainAgent:e.mainAgent,workerPool:e.workerPool??[],maxConcurrent:e.maxConcurrent,ccbReviewMode:e.ccbReviewMode,updatedAt:n,createdAt:r.createdAt||n};t.runConfig={...t.runConfig??{},modes:{...t.runConfig?.modes??{},[this.scope]:o}},this.scope==="assistant"&&(t.assistant={...e,updatedAt:n,createdAt:t.assistant?.createdAt||n}),Me(t);}getNetworkRoles(){let e=He(),t=e.runConfig?.modes?.network?.networkRoles;if(Array.isArray(t))return t;let n=e.assistant?.networkRoles;return Array.isArray(n)?n:[]}setNetworkRoles(e){let t=He(),n=new Date().toISOString(),r=t.runConfig?.modes?.network??{};t.runConfig={...t.runConfig??{},modes:{...t.runConfig?.modes??{},network:{...r,networkRoles:e,updatedAt:n,createdAt:r.createdAt||n}}},Me(t);}getMainAgent(){let e=this.getConfig();if(e.mainAgent)return e.mainAgent;let t=this.providerStore.getDefaultProvider();if(t)return {providerId:t.id,model:t.lastSelectedModel||t.defaultModel||t.models[0]?.name}}setMainAgent(e){let t=this.getConfig();t.mainAgent=e,this.saveConfig(t);}getSupervisorAgent(){return this.getConfig().supervisorAgent}setSupervisorAgent(e){let t=this.getConfig();t.supervisorAgent=e,this.saveConfig(t);}getWorkerPool(){return this.getConfig().workerPool||[]}getMaxConcurrent(){let e=this.getConfig();return typeof e.maxConcurrent=="number"&&Number.isFinite(e.maxConcurrent)?e.maxConcurrent:void 0}setMaxConcurrent(e){let t=this.getConfig();typeof e=="number"&&Number.isFinite(e)&&e>0?t.maxConcurrent=Math.floor(e):delete t.maxConcurrent,this.saveConfig(t);}getCCBReviewMode(){let t=this.getConfig().ccbReviewMode;return t==="single"?"single-role":t==="multi"?"multi-model":t??"multi-role"}setCCBReviewMode(e){let t=this.getConfig();t.ccbReviewMode=e,this.saveConfig(t);}setWorkerPool(e){let t=this.getConfig();t.workerPool=e,this.saveConfig(t);}addWorkerModel(e,t,n=true){let r=this.getWorkerPool();if(r.some(a=>a.providerId===e&&a.model===t))return;let i=this.getModelTraits(t);r.push({providerId:e,model:t,enabled:n,traits:i}),this.setWorkerPool(r);}removeWorkerModel(e,t){let r=this.getWorkerPool().filter(o=>!(o.providerId===e&&o.model===t));this.setWorkerPool(r);}toggleWorkerModel(e,t){let n=this.getWorkerPool(),r=n.find(o=>o.providerId===e&&o.model===t);r&&(r.enabled=!r.enabled,this.setWorkerPool(n));}getEnabledWorkerModels(){return this.getWorkerPool().filter(e=>e.enabled)}getAvailableModels(){let e=this.providerStore.getProviders(),t=[];for(let n of e)for(let r of n.models){let o=this.getModelTraits(r.name);t.push({providerId:n.id,providerName:n.name,model:r.name,traits:o});}return t}selectWorkerByTraits(e){let t=this.getEnabledWorkerModels();if(t.length===0)return;let n=t.map(r=>{let o=r.traits||[],i=e.filter(a=>o.includes(a)).length;return {entry:r,score:i}});return n.sort((r,o)=>o.score-r.score),n[0]?.entry}getModelTraits(e){if(Gh[e])return [...Gh[e]];let t=e.toLowerCase();for(let[i,a]of Object.entries(Gh))if(t.includes(i.toLowerCase())||i.toLowerCase().includes(t))return [...a];let n=on.getModel(e);if(!n)return [];let r=[],o=n.scores||{};return (o.coding??0)>=85&&r.push("coding"),(o.reasoning??0)>=85&&r.push("reasoning"),(o.vision??0)>=80&&r.push("vision"),(o.creativity??0)>=85&&r.push("creative"),(o.speed??0)>=85&&r.push("fast"),(o.cost??0)>=85&&r.push("low-cost"),n.supportsThinking&&r.push("thinking"),n.supportsVision&&r.push("multimodal"),n.maxInputTokens>=5e5&&r.push("long-context"),r}updateWorkerTraits(e,t,n){let r=this.getWorkerPool(),o=r.find(i=>i.providerId===e&&i.model===t);o&&(o.traits=n,this.setWorkerPool(r));}addWorkerTraits(e,t,n){let r=this.getWorkerPool(),o=r.find(i=>i.providerId===e&&i.model===t);if(o){let i=o.traits||[],a=[...new Set([...i,...n])];o.traits=a,this.setWorkerPool(r);}}initializeDefaults(){if(this.getConfig().workerPool.length>0)return;let t=this.providerStore.getDefaultProvider();if(!t)return;let n=t.models.map((r,o)=>({providerId:t.id,model:r.name,enabled:o===0,traits:this.getModelTraits(r.name)}));this.setWorkerPool(n);}};});var Lu,Wx=R(()=>{ne();Lu=class{hosts=new Map;hostConfigs=new Map;workspacePath=null;setWorkspace(e){this.workspacePath=e;for(let t of this.hosts.values())try{t.setWorkDir(e);}catch{}}getWorkspace(){return this.workspacePath}getHost(e){return this.hosts.get(e)}hasHost(e){return this.hosts.has(e)}getHostConfig(e){return this.hostConfigs.get(e)}clearHost(e){this.hosts.delete(e),this.hostConfigs.delete(e);}clearAll(){for(let e of this.hosts.values())try{e.interrupt();}catch{}this.hosts.clear(),this.hostConfigs.clear();}forEachHost(e){for(let[t,n]of this.hosts.entries())e(n,t);}async getOrCreateHost(e){let{sessionId:t,configKey:n,createHost:r}=e,o=this.hosts.get(t);if(o){let a=this.hostConfigs.get(t);if(a===n)return m.info("HOST_CONTROLLER",`\u{1F504} Reusing existing host for session=${t}, configKey=${n}`),o;m.info("HOST_CONTROLLER",`\u{1F5D1}\uFE0F Clearing old host: session=${t}, oldKey=${a}, newKey=${n}`),this.clearHost(t);}m.info("HOST_CONTROLLER",`\u2728 Creating NEW host: session=${t}, configKey=${n}`);let i=await r();return this.hosts.set(t,i),this.hostConfigs.set(t,n),this.workspacePath&&i.setWorkDir(this.workspacePath),i}};});var Ys,Nu=R(()=>{_s();Ys=class s{sessionId;filePath;directory;options;sequenceNumber=0;initialized=false;constructor(e){typeof e=="string"&&(e={sessionId:e}),this.sessionId=e.sessionId,this.options=e,this.directory=e.directory||Ie__default.join(ho__default.homedir(),".neox","sessions"),this.filePath=Ie__default.join(this.directory,`${this.sessionId}.jsonl`);}async ensureDirectory(){await Le__default.mkdir(this.directory,{recursive:true});}async ensureInitialized(){if(!this.initialized){await this.ensureDirectory();try{await Le__default.access(this.filePath);let e=await this.readAllItems();e.length>0&&(this.sequenceNumber=Math.max(...e.map(t=>t.seq))+1);}catch{if(this.options.autoCreateMeta!==false){let e={sessionId:this.sessionId,createdAt:new Date().toISOString(),agentName:this.options.agentName,model:this.options.model};await this.appendItem({type:"meta",data:e});}}this.initialized=true;}}async readAllItems(){let e=[];try{let t=wt__default.createReadStream(this.filePath,{encoding:"utf-8"}),n=zh__default.createInterface({input:t,crlfDelay:1/0});for await(let r of n)if(r.trim())try{let o=JSON.parse(r);e.push(o);}catch{console.warn(`Invalid JSONL line: ${r.slice(0,50)}...`);}}catch(t){if(t.code!=="ENOENT")throw t}return e.sort((t,n)=>t.seq-n.seq),e}async appendItem(e){await this.ensureDirectory();let t={item:e,timestamp:Date.now(),seq:this.sequenceNumber++},n=JSON.stringify(t)+`
|
|
1545
|
+
`);}var Tn=R(()=>{});function y$(){if(ii)return ii;try{let s=[join(Rh,"../package.json"),join(Rh,"../../package.json"),join(Rh,"../../../package.json")];for(let e of s)try{let t=JSON.parse(readFileSync(e,"utf-8"));if(t.version)return ii=t.version,ii}catch{continue}throw new Error("package.json not found")}catch{ii="2.0.9";}return ii}var f$,Rh,ii,ai,Cu=R(()=>{f$=fileURLToPath(import.meta.url),Rh=dirname(f$),ii=null;ai=y$();});function li(s,e,t=true){xu[e]||(xu[e]=0);let n=xu[e]%s.length,r=s[n];return t&&(xu[e]=(n+1)%s.length),r}function Su(s,e){if(e){let n=JSON.stringify(e);for(let r of k$)if(r.pattern.test(n))return r.status}let t=Lh[s]||Lh.default;return li(t,s)}function Px(s){let e=s.toLowerCase();for(let t of _$)if(t.pattern.test(e))return t.status;return null}function ku(){let s=Lh.default;return li(s,"default")}function Mx(s,e){return s&&e!==void 0?`Streaming: ${s} (${e} chars)`:li(I$,"streaming")}function Nh(s="default"){let e=Ex[s]||Ex.default;return li(e,`retry_${s}`)}function Rx(){return li(E$,"complete")}function Dx(s,e,t){let n=Ax[s]||Ax.default,r=e?n.success:n.error,o=li(r,`result_${s}_${e}`);if(e&&t!==void 0&&t>0){let i=t>=1024?`${(t/1024).toFixed(1)}KB`:`${t}B`;return `${o} (${i})`}return o}var Lh,k$,_$,xu,I$,Ex,E$,Ax,ja=R(()=>{Lh={Grep:["Searching...","Scanning code...","Finding matches...","Hunting patterns..."],Glob:["Finding files...","Scanning directories...","Locating files..."],WebSearch:["Searching web...","Looking online...","Browsing..."],Read:["Reading files...","Loading content...","Reviewing code...","Examining..."],WebFetch:["Fetching page...","Loading URL...","Downloading..."],Edit:["Editing code...","Making changes...","Updating file...","Modifying..."],Write:["Writing file...","Creating file...","Generating..."],NotebookEdit:["Editing notebook...","Updating cells..."],Bash:["Running command...","Executing...","Processing...","Working..."],BashOutput:["Reading output...","Checking results..."],KillShell:["Stopping process...","Terminating..."],Task:["Spawning agent...","Delegating task...","Working in parallel..."],TodoWrite:["Updating tasks...","Planning...","Organizing..."],TodoRead:["Checking tasks...","Reviewing plan..."],AskUserQuestion:["Waiting for input...","Asking question..."],default:["Thinking...","Processing...","Analyzing...","Pondering...","Contemplating..."]},k$=[{pattern:/test|spec|__test__|\.test\.|\.spec\./i,status:"Reviewing tests..."},{pattern:/\.md$|readme|doc/i,status:"Reading docs..."},{pattern:/package\.json|tsconfig|config/i,status:"Checking config..."},{pattern:/\.css$|\.scss$|\.less$|style/i,status:"Reviewing styles..."},{pattern:/error|exception|bug|issue/i,status:"Hunting bugs..."},{pattern:/TODO|FIXME|HACK/i,status:"Finding TODOs..."},{pattern:/import|require|from\s+['"]/i,status:"Tracing imports..."},{pattern:/function|class|interface|type\s+\w+/i,status:"Analyzing code..."},{pattern:/npm install|yarn add|pnpm add/i,status:"Installing deps..."},{pattern:/npm run|yarn run|pnpm run/i,status:"Running script..."},{pattern:/npm test|jest|vitest|mocha/i,status:"Running tests..."},{pattern:/npm run build|yarn build|tsc/i,status:"Building..."},{pattern:/git\s+(status|log|diff)/i,status:"Checking git..."},{pattern:/git\s+(add|commit|push)/i,status:"Git operation..."},{pattern:/git\s+clone/i,status:"Cloning repo..."},{pattern:/docker/i,status:"Docker operation..."},{pattern:/curl|wget|fetch/i,status:"Fetching data..."}],_$=[{pattern:/fix|bug|error|issue|problem/i,status:"Debugging..."},{pattern:/refactor|clean|improve|optimize/i,status:"Refactoring..."},{pattern:/search|find|look for|where/i,status:"Searching..."},{pattern:/read|check|review|examine/i,status:"Reviewing..."},{pattern:/write|create|add|implement|build/i,status:"Implementing..."},{pattern:/test|verify|validate/i,status:"Testing..."},{pattern:/plan|design|architect/i,status:"Planning..."},{pattern:/understand|analyze|figure out/i,status:"Analyzing..."},{pattern:/delete|remove|clean up/i,status:"Cleaning up..."},{pattern:/rename|move|reorganize/i,status:"Reorganizing..."}],xu={};I$=["Streaming...","Receiving data...","Downloading...","Fetching..."],Ex={rateLimit:["Rate limited, waiting...","Cooling down...","Pausing..."],timeout:["Timed out, retrying...","Reconnecting...","Trying again..."],network:["Network issue, reconnecting...","Connection lost, retrying..."],default:["Retrying...","Trying again...","Recovering..."]},E$=["Complete!","Done!","Finished!","All done!"],Ax={Grep:{success:["Found matches!","Search complete","Results ready"],error:["No matches found","Search failed"]},Read:{success:["File loaded","Content ready","Read complete"],error:["Failed to read","File not found"]},Edit:{success:["Changes saved","File updated","Edit complete"],error:["Edit failed","Could not save"]},Write:{success:["File created","Write complete","Saved!"],error:["Write failed","Could not create"]},Bash:{success:["Command done","Executed!","Process complete"],error:["Command failed","Exit with error"]},Task:{success:["Agent complete","Task done","Subtask finished"],error:["Agent failed","Task error"]},default:{success:["Done","Complete","Finished"],error:["Failed","Error"]}};});var R$,D$,L$,N$,$$,O$,B$,$h,on,us=R(()=>{R$={"gpt-5.2":{id:"gpt-5.2",displayName:"GPT-5.2",provider:"openai",maxInputTokens:4e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:96,reasoning:98,vision:92,creativity:94,speed:75,cost:25},releaseDate:"2025-12-11",notes:'400K \u4E0A\u4E0B\u6587\u7A97\u53E3,128K \u8F93\u51FA\u9650\u5236,\u4EE3\u53F7"Garlic"'},"gpt-5.2-codex":{id:"gpt-5.2-codex",displayName:"GPT-5.2 Codex",provider:"openai",aliases:["gpt-5.2-codex"],maxInputTokens:4e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:98,reasoning:97,vision:90,creativity:92,speed:70,cost:20},releaseDate:"2025-12-10",notes:"GPT-5.2 \u7684 Codex \u9ED8\u8BA4\u7248\u672C,\u4E13\u4E3A\u7F16\u7A0B\u4EFB\u52A1\u4F18\u5316"},"gpt-5.2-codex-high":{id:"gpt-5.2-codex-high",displayName:"GPT-5.2 Codex High",provider:"openai",aliases:["gpt-5.2-codex-h"],maxInputTokens:4e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:99,reasoning:98,vision:90,creativity:93,speed:60,cost:15},releaseDate:"2025-12-10",notes:"GPT-5.2 Codex \u9AD8\u6027\u80FD\u6A21\u5F0F,\u6700\u5F3A\u7F16\u7A0B\u80FD\u529B,\u66F4\u6162\u66F4\u8D35"},"gpt-5.2-codex-medium":{id:"gpt-5.2-codex-medium",displayName:"GPT-5.2 Codex Medium",provider:"openai",aliases:["gpt-5.2-codex-m"],maxInputTokens:4e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:95,reasoning:94,vision:88,creativity:90,speed:80,cost:40},releaseDate:"2025-12-10",notes:"GPT-5.2 Codex \u5E73\u8861\u6A21\u5F0F,\u6027\u4EF7\u6BD4\u4F18\u9009"},"gpt-5.1":{id:"gpt-5.1",displayName:"GPT-5.1",provider:"openai",maxInputTokens:272e3,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:94,reasoning:96,vision:90,creativity:92,speed:80,cost:30},notes:"272K \u4E0A\u4E0B\u6587,128K \u8F93\u51FA,\u9002\u5408\u957F\u4E0A\u4E0B\u6587\u4EFB\u52A1"},"gpt-5.1-codex":{id:"gpt-5.1-codex",displayName:"GPT-5.1 Codex",provider:"openai",aliases:["gpt-5-codex","gpt-5.1-codex-max"],maxInputTokens:4e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:97,reasoning:95,vision:88,creativity:90,speed:75,cost:25},notes:"Codex \u4F18\u5316\u7248,400K \u4E0A\u4E0B\u6587,\u4E13\u4E3A agentic \u7F16\u7A0B\u5DE5\u4F5C\u6D41\u8BBE\u8BA1"},"gpt-5.1-codex-mini":{id:"gpt-5.1-codex-mini",displayName:"GPT-5.1 Codex Mini",provider:"openai",aliases:["gpt-5-codex-mini"],maxInputTokens:272e3,maxOutputTokens:128e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:88,vision:0,creativity:85,speed:92,cost:85},notes:"\u66F4\u5FEB\u66F4\u4FBF\u5B9C\u7684 Codex \u7248\u672C"},"gpt-5":{id:"gpt-5",displayName:"GPT-5",provider:"openai",maxInputTokens:4e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:92,reasoning:94,vision:90,creativity:94,speed:80,cost:35},deprecated:true,replacedBy:"gpt-5.1",notes:"\u5DF2\u88AB GPT-5.1 \u66FF\u4EE3"},"gpt-4.1":{id:"gpt-4.1",displayName:"GPT-4.1",provider:"openai",aliases:["gpt-4.1-2025-04-14"],maxInputTokens:1e6,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:92,vision:88,creativity:90,speed:65,cost:15},releaseDate:"2025-04-14",notes:"\u8D85\u5927 1M+ \u4E0A\u4E0B\u6587\u7A97\u53E3,\u9002\u5408\u5904\u7406\u5927\u578B\u4EE3\u7801\u5E93"},"gpt-4o":{id:"gpt-4o",displayName:"GPT-4o",provider:"openai",aliases:["gpt-4o-2024-11-20","gpt-4o-2024-08-06"],maxInputTokens:128e3,maxOutputTokens:16384,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:88,reasoning:85,vision:88,creativity:88,speed:75,cost:50}},"gpt-4o-mini":{id:"gpt-4o-mini",displayName:"GPT-4o Mini",provider:"openai",aliases:["gpt-4o-mini-2024-07-18"],maxInputTokens:128e3,maxOutputTokens:16384,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:75,reasoning:72,vision:80,creativity:75,speed:92,cost:90}},o3:{id:"o3",displayName:"o3",provider:"openai",maxInputTokens:2e5,maxOutputTokens:1e5,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:92,reasoning:99,vision:0,creativity:78,speed:40,cost:15},notes:"\u65B0\u4E00\u4EE3\u63A8\u7406\u6A21\u578B,\u63A8\u7406\u80FD\u529B\u6700\u5F3A"},"o3-mini":{id:"o3-mini",displayName:"o3 Mini",provider:"openai",aliases:["o3-mini-2025-01-31"],maxInputTokens:2e5,maxOutputTokens:1e5,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:88,reasoning:95,vision:0,creativity:75,speed:65,cost:60}},"o4-mini":{id:"o4-mini",displayName:"o4 Mini",provider:"openai",maxInputTokens:2e5,maxOutputTokens:1e5,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:90,reasoning:96,vision:0,creativity:76,speed:70,cost:55}},o1:{id:"o1",displayName:"o1",provider:"openai",aliases:["o1-2024-12-17"],maxInputTokens:2e5,maxOutputTokens:1e5,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:88,reasoning:95,vision:0,creativity:75,speed:45,cost:25}},"o1-mini":{id:"o1-mini",displayName:"o1 Mini",provider:"openai",aliases:["o1-mini-2024-09-12"],maxInputTokens:128e3,maxOutputTokens:65536,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:82,reasoning:88,vision:0,creativity:70,speed:70,cost:70}},"codex-mini-latest":{id:"codex-mini-latest",displayName:"Codex Mini (Latest)",provider:"openai",maxInputTokens:2e5,maxOutputTokens:1e5,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:85,reasoning:82,vision:0,creativity:75,speed:88,cost:80}},"gpt-4-turbo":{id:"gpt-4-turbo",displayName:"GPT-4 Turbo",provider:"openai",aliases:["gpt-4-turbo-2024-04-09"],maxInputTokens:128e3,maxOutputTokens:4096,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:87,vision:85,creativity:90,speed:70,cost:40}},"gpt-3.5-turbo":{id:"gpt-3.5-turbo",displayName:"GPT-3.5 Turbo",provider:"openai",maxInputTokens:16385,maxOutputTokens:4096,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:65,reasoning:60,vision:0,creativity:70,speed:95,cost:98}}},D$={"claude-opus-4-6":{id:"claude-opus-4-6",displayName:"Claude Opus 4.6",provider:"anthropic",aliases:["claude-opus-4.6"],maxInputTokens:2e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:99,reasoning:98,vision:91,creativity:96,speed:66,cost:18},notes:"Claude Opus 4.6 (latest alias)"},"claude-opus-4-5-20251101":{id:"claude-opus-4-5-20251101",displayName:"Claude Opus 4.5",provider:"anthropic",aliases:["claude-opus-4.5"],maxInputTokens:2e5,maxOutputTokens:32e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:98,reasoning:97,vision:90,creativity:95,speed:65,cost:20},releaseDate:"2025-11-24",notes:"\u6700\u5F3A Claude \u6A21\u578B,\u652F\u6301 Extended Thinking,\u4F01\u4E1A\u7248\u53EF\u6269\u5C55\u81F3 1M \u4E0A\u4E0B\u6587"},"claude-sonnet-4-5-20250929":{id:"claude-sonnet-4-5-20250929",displayName:"Claude Sonnet 4.5",provider:"anthropic",aliases:["claude-sonnet-4.5","claude-sonnet-4-5-20250929-thinking"],maxInputTokens:2e5,maxOutputTokens:16e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:92,reasoning:90,vision:88,creativity:90,speed:80,cost:50},releaseDate:"2025-09-29",notes:"\u5E73\u8861\u6027\u80FD\u4E0E\u6210\u672C,beta \u7248\u672C\u652F\u6301 1M \u4E0A\u4E0B\u6587"},"claude-sonnet-4-20250514":{id:"claude-sonnet-4-20250514",displayName:"Claude Sonnet 4",provider:"anthropic",aliases:["claude-sonnet-4"],maxInputTokens:2e5,maxOutputTokens:16e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:88,vision:85,creativity:88,speed:82,cost:55},notes:"2025-08-12 \u5347\u7EA7\u652F\u6301 1M beta \u4E0A\u4E0B\u6587"},"claude-opus-4-20250514":{id:"claude-opus-4-20250514",displayName:"Claude Opus 4",provider:"anthropic",aliases:["claude-opus-4"],maxInputTokens:2e5,maxOutputTokens:32e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:96,reasoning:95,vision:88,creativity:94,speed:70,cost:25}},"claude-haiku-4-5-20251001":{id:"claude-haiku-4-5-20251001",displayName:"Claude Haiku 4.5",provider:"anthropic",aliases:["claude-haiku-4.5"],maxInputTokens:2e5,maxOutputTokens:8e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:78,reasoning:75,vision:80,creativity:75,speed:95,cost:95},notes:"\u6700\u5FEB\u6700\u4FBF\u5B9C\u7684 Claude 4.5 \u6A21\u578B"},"claude-3-5-sonnet-20241022":{id:"claude-3-5-sonnet-20241022",displayName:"Claude 3.5 Sonnet (New)",provider:"anthropic",aliases:["claude-3.5-sonnet-new","claude-3-5-sonnet-latest"],maxInputTokens:2e5,maxOutputTokens:16e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:88,vision:85,creativity:87,speed:85,cost:55},releaseDate:"2024-10-22",notes:"Claude 3.5 Sonnet \u5347\u7EA7\u7248"},"claude-3-5-haiku-20241022":{id:"claude-3-5-haiku-20241022",displayName:"Claude 3.5 Haiku",provider:"anthropic",aliases:["claude-3.5-haiku"],maxInputTokens:2e5,maxOutputTokens:8e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:75,reasoning:72,vision:78,creativity:73,speed:98,cost:98},releaseDate:"2024-10-22",notes:"\u6700\u5FEB\u6700\u4FBF\u5B9C\u7684 Claude 3.5 \u6A21\u578B"}},L$={"gemini-3-pro-preview":{id:"gemini-3-pro-preview",displayName:"Gemini 3 Pro Preview",provider:"gemini",aliases:["gemini-3-pro","gemini-3.0-pro-preview"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:94,reasoning:95,vision:96,creativity:94,speed:72,cost:35},releaseDate:"2026-01",notes:"Gemini 3 \u9884\u89C8\u7248,UI/\u89C6\u89C9\u8BBE\u8BA1\u4E13\u957F,1M \u4E0A\u4E0B\u6587"},"gemini-3.0-pro":{id:"gemini-3.0-pro",displayName:"Gemini 3.0 Pro",provider:"gemini",aliases:["gemini-3.0-pro-latest"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:95,reasoning:96,vision:94,creativity:92,speed:70,cost:30},releaseDate:"2025-12",notes:"Flagship multimodal model with 1M context, high-precision reasoning"},"gemini-2.5-flash":{id:"gemini-2.5-flash",displayName:"Gemini 2.5 Flash",provider:"gemini",aliases:["gemini-2.5-flash-latest"],maxInputTokens:1048576,maxOutputTokens:65535,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:88,vision:90,creativity:87,speed:92,cost:85},releaseDate:"2025-03",notes:"Fast and cost-efficient, ~1500 pages or 30K lines of code"},"gemini-2.5-pro":{id:"gemini-2.5-pro",displayName:"Gemini 2.5 Pro",provider:"gemini",aliases:["gemini-2.5-pro-latest"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:93,reasoning:92,vision:92,creativity:90,speed:75,cost:40},releaseDate:"2025-03",notes:"Balanced performance with 1M context window"},"gemini-2.0-flash-thinking":{id:"gemini-2.0-flash-thinking",displayName:"Gemini 2.0 Flash Thinking",provider:"gemini",aliases:["gemini-2.0-flash-thinking-exp","gemini-2.0-flash-thinking-experimental"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:92,reasoning:94,vision:90,creativity:88,speed:85,cost:50},releaseDate:"2024-12-19",notes:"Shows model thought process, 1M context window"},"gemini-2.0-flash":{id:"gemini-2.0-flash",displayName:"Gemini 2.0 Flash",provider:"gemini",aliases:["gemini-2.0-flash-exp","gemini-2.0-flash-experimental"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:89,vision:90,creativity:87,speed:95,cost:75},releaseDate:"2024-12-11",notes:"Twice as fast as Gemini 1.5 Pro, multimodal with native image generation"},"gemini-1.5-pro":{id:"gemini-1.5-pro",displayName:"Gemini 1.5 Pro",provider:"gemini",aliases:["gemini-1.5-pro-latest","gemini-pro"],maxInputTokens:2e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:88,reasoning:87,vision:88,creativity:85,speed:70,cost:50},releaseDate:"2024-05",notes:"2M context window - largest available, supports context caching"},"gemini-1.5-flash":{id:"gemini-1.5-flash",displayName:"Gemini 1.5 Flash",provider:"gemini",aliases:["gemini-1.5-flash-latest","gemini-flash"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:85,reasoning:83,vision:85,creativity:82,speed:90,cost:85},releaseDate:"2024-05",notes:"Fast and efficient with 1M context, supports code execution"},"gemini-1.5-flash-8b":{id:"gemini-1.5-flash-8b",displayName:"Gemini 1.5 Flash-8B",provider:"gemini",aliases:["gemini-flash-8b"],maxInputTokens:1e6,maxOutputTokens:65536,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:80,reasoning:78,vision:82,creativity:77,speed:98,cost:95},releaseDate:"2024-10",notes:"Smaller 8B model, extremely fast and cost-effective"},"gemini-1.0-pro":{id:"gemini-1.0-pro",displayName:"Gemini 1.0 Pro",provider:"gemini",aliases:["gemini-pro-1.0"],maxInputTokens:32768,maxOutputTokens:8192,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:75,reasoning:73,vision:0,creativity:75,speed:85,cost:90},releaseDate:"2023-12",notes:"Original Gemini Pro, text-only"},"gemini-1.0-pro-vision":{id:"gemini-1.0-pro-vision",displayName:"Gemini 1.0 Pro Vision",provider:"gemini",aliases:["gemini-pro-vision"],maxInputTokens:16384,maxOutputTokens:2048,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:70,reasoning:68,vision:80,creativity:72,speed:80,cost:88},releaseDate:"2023-12",notes:"Original multimodal Gemini with vision support"}},N$={"kimi-k2-0905-preview":{id:"kimi-k2-0905-preview",displayName:"Kimi K2 (0905 Preview)",provider:"kimi",aliases:["kimi-k2","kimi-k2-preview"],maxInputTokens:256e3,maxOutputTokens:8192,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:92,reasoning:90,vision:0,creativity:80,speed:85,cost:70},releaseDate:"2025-09",notes:"MoE \u67B6\u6784 K2 \u9884\u89C8\u7248\uFF0C256K \u4E0A\u4E0B\u6587"}},$$={"deepseek-v3.2":{id:"deepseek-v3.2",displayName:"DeepSeek V3.2",provider:"deepseek",aliases:["deepseek-v3.2-exp"],maxInputTokens:128e3,maxOutputTokens:32e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:92,reasoning:90,vision:0,creativity:80,speed:85,cost:95},releaseDate:"2025-09-29",notes:"\u5B9E\u9A8C\u7248\u672C,\u6027\u80FD\u663E\u8457\u63D0\u5347"},"deepseek-v3.1":{id:"deepseek-v3.1",displayName:"DeepSeek V3.1",provider:"deepseek",maxInputTokens:128e3,maxOutputTokens:32e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:88,vision:0,creativity:78,speed:88,cost:96},releaseDate:"2025-08",notes:"\u6DF7\u5408\u67B6\u6784\u6A21\u578B"},"deepseek-chat":{id:"deepseek-chat",displayName:"DeepSeek Chat",provider:"deepseek",maxInputTokens:64e3,maxOutputTokens:32e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:85,reasoning:82,vision:0,creativity:75,speed:85,cost:95},notes:"\u901A\u7528\u5BF9\u8BDD\u6A21\u578B,\u6210\u672C\u6781\u4F4E"},"deepseek-coder":{id:"deepseek-coder",displayName:"DeepSeek Coder",provider:"deepseek",maxInputTokens:64e3,maxOutputTokens:32e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:95,reasoning:85,vision:0,creativity:70,speed:88,cost:96},notes:"\u4E13\u4E3A\u7F16\u7A0B\u4F18\u5316,\u4EE3\u7801\u80FD\u529B\u7A81\u51FA"},"deepseek-reasoner":{id:"deepseek-reasoner",displayName:"DeepSeek Reasoner",provider:"deepseek",maxInputTokens:64e3,maxOutputTokens:64e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:88,reasoning:96,vision:0,creativity:75,speed:60,cost:90},notes:"\u63A8\u7406\u4E13\u7528\u6A21\u578B,\u652F\u6301\u957F\u8F93\u51FA"}},O$={"minimax-text-01":{id:"minimax-text-01",displayName:"MiniMax Text-01",provider:"minimax",maxInputTokens:4e6,maxOutputTokens:1e6,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:88,reasoning:90,vision:0,creativity:85,speed:55,cost:70},notes:"4M \u4E0A\u4E0B\u6587\u7A97\u53E3,Lightning Attention + MoE \u67B6\u6784,\u5F00\u6E90\u53EF\u7528"},"minimax-m1-80k":{id:"minimax-m1-80k",displayName:"MiniMax M1-80K",provider:"minimax",maxInputTokens:1e6,maxOutputTokens:8e4,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,supportsThinking:true,scores:{coding:90,reasoning:92,vision:0,creativity:82,speed:65,cost:75},notes:"1M \u4E0A\u4E0B\u6587 + 80K \u601D\u8003\u9884\u7B97"},"minimax-m2.1":{id:"minimax-m2.1",displayName:"MiniMax M2.1",provider:"minimax",maxInputTokens:2e5,maxOutputTokens:64e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:93,reasoning:88,vision:0,creativity:80,speed:82,cost:85},releaseDate:"2025-12",notes:"\u7F16\u7A0B\u548C Agentic \u5DE5\u4F5C\u6D41\u4F18\u5316,\u652F\u6301\u591A\u8BED\u8A00"},"minimax-vl-01":{id:"minimax-vl-01",displayName:"MiniMax VL-01",provider:"minimax",maxInputTokens:4e6,maxOutputTokens:1e6,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:85,reasoning:88,vision:92,creativity:88,speed:60,cost:65},notes:"\u591A\u6A21\u6001\u6A21\u578B,\u652F\u6301\u6587\u672C\u548C\u56FE\u50CF"}},B$={"glm-4.7":{id:"glm-4.7",displayName:"GLM-4.7",provider:"glm",maxInputTokens:2e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:90,reasoning:88,vision:85,creativity:87,speed:80,cost:70},releaseDate:"2025-12-22",notes:"\u6700\u65B0\u7248\u672C,200K \u4E0A\u4E0B\u6587,128K \u8F93\u51FA"},"glm-4.6":{id:"glm-4.6",displayName:"GLM-4.6",provider:"glm",maxInputTokens:2e5,maxOutputTokens:128e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:88,reasoning:86,vision:83,creativity:85,speed:82,cost:75},releaseDate:"2025-09-10",notes:"\u4ECE 128K \u6269\u5C55\u81F3 200K \u4E0A\u4E0B\u6587"},"glm-4.5":{id:"glm-4.5",displayName:"GLM-4.5",provider:"glm",maxInputTokens:128e3,maxOutputTokens:32e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:86,reasoning:84,vision:80,creativity:83,speed:85,cost:80},releaseDate:"2025-07"},"glm-4-flash":{id:"glm-4-flash",displayName:"GLM-4 Flash",provider:"glm",maxInputTokens:128e3,maxOutputTokens:32e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:82,reasoning:80,vision:78,creativity:80,speed:95,cost:92},notes:"\u5FEB\u901F\u6A21\u578B,\u76F8\u5F53\u4E8E 300 \u9875\u4E66\u7684\u4E0A\u4E0B\u6587"},"glm-4-plus":{id:"glm-4-plus",displayName:"GLM-4 Plus",provider:"glm",maxInputTokens:128e3,maxOutputTokens:32e3,supportsVision:true,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:88,reasoning:86,vision:82,creativity:85,speed:78,cost:65}},"glm-4-air":{id:"glm-4-air",displayName:"GLM-4 Air",provider:"glm",maxInputTokens:128e3,maxOutputTokens:32e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:80,reasoning:78,vision:0,creativity:78,speed:90,cost:88}},"glm-4-long":{id:"glm-4-long",displayName:"GLM-4 Long",provider:"glm",maxInputTokens:1e6,maxOutputTokens:128e3,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:85,reasoning:88,vision:0,creativity:80,speed:50,cost:60},notes:"\u8D85\u957F\u4E0A\u4E0B\u6587\u4E13\u7528,1M tokens"},"glm-4-airx":{id:"glm-4-airx",displayName:"GLM-4 AirX",provider:"glm",maxInputTokens:8e3,maxOutputTokens:4096,supportsVision:false,supportsTools:true,supportsFunctionCalling:true,supportsStreaming:true,scores:{coding:70,reasoning:68,vision:0,creativity:70,speed:98,cost:98},notes:"\u8D85\u8F7B\u91CF\u7EA7\u6A21\u578B,\u6781\u5FEB\u901F\u5EA6"}},$h=class{models=new Map;constructor(){this.registerModels(R$),this.registerModels(D$),this.registerModels(L$),this.registerModels(N$),this.registerModels($$),this.registerModels(O$),this.registerModels(B$);}registerModels(e){for(let[t,n]of Object.entries(e))if(this.models.set(t,n),n.aliases)for(let r of n.aliases)this.models.set(r,n);}getModel(e){return this.models.get(e)}getAllModels(){let e=new Map;for(let t of this.models.values())e.set(t.id,t);return Array.from(e.values())}getModelsByProvider(e){return this.getAllModels().filter(t=>t.provider===e)}hasModel(e){return this.models.has(e)}toModelCapability(e){let t=this.getModel(e);if(t)return {modelAlias:t.id,strengths:this.inferStrengths(t),scores:{coding:t.scores?.coding??50,reasoning:t.scores?.reasoning??50,vision:t.scores?.vision??0,creativity:t.scores?.creativity??50,speed:t.scores?.speed??50,cost:t.scores?.cost??50},features:{supportsVision:t.supportsVision??false,supportsTools:t.supportsTools??false,supportsFunctionCalling:t.supportsFunctionCalling??false,supportsStreaming:t.supportsStreaming??false,maxContextTokens:t.maxInputTokens,maxOutputTokens:t.maxOutputTokens}}}inferStrengths(e){let t=[],n=e.scores??{};return (n.coding??0)>=85&&t.push("coding"),(n.reasoning??0)>=85&&t.push("reasoning"),(n.vision??0)>=85&&t.push("image_analysis"),(n.creativity??0)>=85&&t.push("creative_writing"),t}},on=new $h;});function Fh(s,e){return `mcp__${s}__${e}`}function Uh(s){if(!s.startsWith("mcp__"))return null;let e=s.split("__");if(e.length<3)return null;let t=e[1],n=e.slice(2).join("__");return !t||!n?null:{serverId:t,toolName:n}}var Du=R(()=>{});var jh,rt,cr=R(()=>{Tt();jh={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"},rt=class{config;constructor(e){this.config=e??He(),this.config.providers||(this.config.providers={});}sanitizeId(e){return e.toLowerCase().trim().replace(/[^a-z0-9-]+/g,"-").replace(/^-+|-+$/g,"").substring(0,48)}ensureValidId(e){let t=this.sanitizeId(e);if(!t)throw new Error("Provider ID must contain letters or numbers (allowed: lowercase letters, numbers, hyphen).");if(!/^[a-z0-9][a-z0-9-]*$/.test(t))throw new Error("Provider ID can only include lowercase letters, numbers, and hyphen.");return t}slugifyName(e){return this.sanitizeId(e)||"provider"}ensureProviderId(e,t){let n=e||this.slugifyName(t||"provider");if(this.config.providers||(this.config.providers={}),!this.config.providers[n])return n;let r=2,o=`${n}-${r}`;for(;this.config.providers[o];)r+=1,o=`${n}-${r}`;return o}persist(){Me(this.config);}getProviderCount(){return Object.keys(this.config.providers||{}).length}getProviders(){return Object.values(this.config.providers||{}).sort((e,t)=>e.name.localeCompare(t.name))}getProvider(e){if(e)return this.config.providers?.[e]}getDefaultProvider(){if(this.config.defaultProviderId){let t=this.getProvider(this.config.defaultProviderId);if(t)return t}let[e]=this.getProviders();return e&&(this.config.defaultProviderId=e.id,this.persist()),e}setDefaultProvider(e){let t=this.getProvider(e);if(!t)throw new Error(`Provider "${e}" does not exist.`);return this.config.defaultProviderId=e,this.persist(),t}addProvider(e){if(!e.name.trim())throw new Error("Provider name is required.");if(!e.apiKey.trim())throw new Error("Provider API key/token is required.");let t=this.ensureProviderId(e.id,e.name),n=new Date().toISOString(),r=e.baseUrl?.trim()||jh[e.protocol],o=(e.models||[]).map(a=>typeof a=="string"?{name:a,createdAt:n}:{...a,createdAt:a.createdAt||n}),i={id:t,name:e.name.trim(),protocol:e.protocol,apiKey:e.apiKey.trim(),baseUrl:r,urlSuffix:e.urlSuffix,maxTokens:e.maxTokens,maxInputTokens:e.maxInputTokens,models:o,defaultModel:e.defaultModel||o[0]?.name,lastSelectedModel:e.defaultModel||o[0]?.name,createdAt:n,updatedAt:n};if(!i.defaultModel)throw new Error("At least one model is required when creating a provider.");return this.config.providers||(this.config.providers={}),this.config.providers[t]=i,(!this.config.defaultProviderId||e.setAsDefault)&&(this.config.defaultProviderId=t),this.persist(),i}updateProvider(e,t){let n=this.getProvider(e);if(!n)throw new Error(`Provider "${e}" does not exist.`);let r=new Date().toISOString(),o={...n,...t,baseUrl:t.baseUrl?.trim()||n.baseUrl||jh[n.protocol],urlSuffix:t.urlSuffix!==void 0?t.urlSuffix:n.urlSuffix,apiKey:t.apiKey?.trim()||n.apiKey,maxTokens:t.maxTokens!==void 0?t.maxTokens:n.maxTokens,maxInputTokens:t.maxInputTokens!==void 0?t.maxInputTokens:n.maxInputTokens,updatedAt:r};if(t.protocol&&t.protocol!==n.protocol&&(o.protocol=t.protocol,t.baseUrl||(o.baseUrl=jh[t.protocol])),t.defaultModel){if(!o.models.some(a=>a.name===t.defaultModel))throw new Error(`Model "${t.defaultModel}" does not exist for provider "${e}".`);o.defaultModel=t.defaultModel,o.lastSelectedModel=t.defaultModel;}return this.config.providers[e]=o,this.persist(),o}renameProvider(e,t){let n=this.getProvider(e);if(!n)throw new Error(`Provider "${e}" does not exist.`);let r=this.ensureValidId(t);if(r===e)return n;if(this.config.providers?.[r])throw new Error(`Provider ID "${r}" already exists.`);delete this.config.providers[e];let o=new Date().toISOString(),i={...n,id:r,updatedAt:o};return this.config.providers[r]=i,this.config.defaultProviderId===e&&(this.config.defaultProviderId=r),this.persist(),i}deleteProvider(e){if(!this.config.providers?.[e])throw new Error(`Provider "${e}" does not exist.`);delete this.config.providers[e],this.config.defaultProviderId===e&&(this.config.defaultProviderId=void 0),this.persist();}addModel(e,t,n=false,r){let o=this.getProvider(e);if(!o)throw new Error(`Provider "${e}" does not exist.`);let i=t.trim();if(!i)throw new Error("Model name cannot be empty.");if(o.models.some(l=>l.name===i))throw new Error(`Model "${i}" already exists for provider "${e}".`);let a={...o,models:[...o.models,{name:i,createdAt:new Date().toISOString(),...r}],updatedAt:new Date().toISOString()};return (!o.defaultModel||n)&&(a.defaultModel=i,a.lastSelectedModel=i),this.config.providers[e]=a,this.persist(),a}removeModel(e,t){let n=this.getProvider(e);if(!n)throw new Error(`Provider "${e}" does not exist.`);if(n.models.length<=1)throw new Error("A provider must have at least one model.");let r=n.models.filter(i=>i.name!==t);if(r.length===n.models.length)throw new Error(`Model "${t}" does not exist for provider "${e}".`);let o={...n,models:r,updatedAt:new Date().toISOString()};return n.defaultModel===t&&(o.defaultModel=r[0].name),n.lastSelectedModel===t&&(o.lastSelectedModel=o.defaultModel),this.config.providers[e]=o,this.persist(),o}updateModelConfig(e,t,n){let r=this.getProvider(e);if(!r)throw new Error(`Provider "${e}" does not exist.`);let o=r.models.findIndex(l=>l.name===t);if(o===-1)throw new Error(`Model "${t}" does not exist for provider "${e}".`);let i=[...r.models];i[o]={...i[o],...n};let a={...r,models:i,updatedAt:new Date().toISOString()};return this.config.providers[e]=a,this.persist(),a}setLastSelectedModel(e,t){let n=this.getProvider(e);if(!n)throw new Error(`Provider "${e}" does not exist.`);if(!n.models.some(o=>o.name===t))throw new Error(`Model "${t}" does not exist for provider "${e}".`);return n.lastSelectedModel=t,n.updatedAt=new Date().toISOString(),this.config.providers[e]=n,this.persist(),n}resolveModel(e,t){let n=this.getProvider(e);if(n)return t&&n.models.some(o=>o.name===t)?t:n.lastSelectedModel||n.defaultModel||n.models[0]?.name}};});var Gh,ui,Lt,Vs=R(()=>{Tt();cr();us();Gh={"claude-opus-4-5-20250514":["reasoning","creative","thorough","\u6DF1\u5EA6\u601D\u8003","\u590D\u6742\u63A8\u7406"],"claude-sonnet-4-5-20250514":["coding","fast","accurate","\u4EE3\u7801","\u5FEB\u901F"],"claude-haiku-4-5-20250514":["fast","cheap","simple","\u8F7B\u91CF","\u4F4E\u6210\u672C"],"claude-opus-4-20250514":["reasoning","creative","thorough","\u6DF1\u5EA6\u601D\u8003"],"claude-sonnet-4-20250514":["coding","fast","accurate","\u4EE3\u7801"],"gpt-5.2":["reasoning","coding","thorough","\u6DF1\u5EA6\u63A8\u7406","\u5168\u80FD"],"gpt-5.2-mini":["reasoning","fast","balanced","\u63A8\u7406","\u5FEB\u901F"],"gpt-5.2-codex":["coding","agent","autonomous","\u4EE3\u7801\u4E13\u5BB6","\u81EA\u4E3B\u7F16\u7A0B"],"gpt-5.2-codex-high":["coding","agent","thorough","\u4EE3\u7801","\u6DF1\u5EA6\u7F16\u7A0B","\u6700\u5F3A"],"gpt-5.2-codex-medium":["coding","agent","balanced","\u4EE3\u7801","\u6027\u4EF7\u6BD4"],"gpt-5.1":["reasoning","coding","balanced","\u903B\u8F91\u7F1C\u5BC6","\u901A\u7528"],"gpt-5.1-mini":["fast","cheap","coding","\u5FEB\u901F","\u4F4E\u6210\u672C"],"gpt-5.1-codex":["coding","agent","autonomous","\u4EE3\u7801","\u7F16\u7A0B"],"gpt-5.1-codex-max":["coding","agent","thorough","\u4EE3\u7801","\u6DF1\u5EA6\u7F16\u7A0B"],o3:["reasoning","math","science","\u6DF1\u5EA6\u63A8\u7406","\u6570\u5B66"],"o4-mini":["reasoning","fast","coding","\u63A8\u7406","\u5FEB\u901F"],"gemini-3-pro-preview":["ui","design","vision","creative","UI\u8BBE\u8BA1","\u754C\u9762","\u89C6\u89C9"],"gemini-3.0-pro":["ui","design","vision","creative","UI\u8BBE\u8BA1","\u754C\u9762"],"gemini-3.0-flash":["ui","fast","vision","UI","\u5FEB\u901F"],"gemini-2.5-pro":["reasoning","long-context","vision","\u63A8\u7406","\u957F\u4E0A\u4E0B\u6587"],"gemini-2.5-flash":["fast","vision","multimodal","\u5FEB\u901F","\u591A\u6A21\u6001"],"deepseek-v3":["coding","reasoning","cheap","\u4EE3\u7801","\u6027\u4EF7\u6BD4"],"deepseek-r1":["reasoning","math","thinking","\u6DF1\u5EA6\u63A8\u7406","\u6570\u5B66"],"qwen-max":["chinese","reasoning","coding","\u4E2D\u6587","\u63A8\u7406"],"qwen-turbo":["chinese","fast","cheap","\u4E2D\u6587","\u5FEB\u901F"]},ui=6,Lt=class{providerStore;scope;constructor(e,t="assistant"){this.providerStore=e??new rt,this.scope=t;}readLegacyScopedConfig(e){if(this.scope==="assistant"){let t=e.assistant;return {...t??{},workerPool:t?.workerPool??[]}}return {workerPool:[]}}readScopedRunModeConfig(e){return e.runConfig?.modes?.[this.scope]}getConfig(){let e=He(),t=this.readScopedRunModeConfig(e);return t?{mainAgent:t.mainAgent,workerPool:t.workerPool??[],maxConcurrent:t.maxConcurrent,ccbReviewMode:t.ccbReviewMode,createdAt:t.createdAt,updatedAt:t.updatedAt}:this.readLegacyScopedConfig(e)}saveConfig(e){let t=He(),n=new Date().toISOString(),r=t.runConfig?.modes?.[this.scope]??{},o={...r,mainAgent:e.mainAgent,workerPool:e.workerPool??[],maxConcurrent:e.maxConcurrent,ccbReviewMode:e.ccbReviewMode,updatedAt:n,createdAt:r.createdAt||n};t.runConfig={...t.runConfig??{},modes:{...t.runConfig?.modes??{},[this.scope]:o}},this.scope==="assistant"&&(t.assistant={...e,updatedAt:n,createdAt:t.assistant?.createdAt||n}),Me(t);}getNetworkRoles(){let e=He(),t=e.runConfig?.modes?.network?.networkRoles;if(Array.isArray(t))return t;let n=e.assistant?.networkRoles;return Array.isArray(n)?n:[]}setNetworkRoles(e){let t=He(),n=new Date().toISOString(),r=t.runConfig?.modes?.network??{};t.runConfig={...t.runConfig??{},modes:{...t.runConfig?.modes??{},network:{...r,networkRoles:e,updatedAt:n,createdAt:r.createdAt||n}}},Me(t);}getMainAgent(){let e=this.getConfig();if(e.mainAgent)return e.mainAgent;let t=this.providerStore.getDefaultProvider();if(t)return {providerId:t.id,model:t.lastSelectedModel||t.defaultModel||t.models[0]?.name}}setMainAgent(e){let t=this.getConfig();t.mainAgent=e,this.saveConfig(t);}getSupervisorAgent(){return this.getConfig().supervisorAgent}setSupervisorAgent(e){let t=this.getConfig();t.supervisorAgent=e,this.saveConfig(t);}getWorkerPool(){return this.getConfig().workerPool||[]}getMaxConcurrent(){let e=this.getConfig();return typeof e.maxConcurrent=="number"&&Number.isFinite(e.maxConcurrent)?e.maxConcurrent:void 0}setMaxConcurrent(e){let t=this.getConfig();typeof e=="number"&&Number.isFinite(e)&&e>0?t.maxConcurrent=Math.floor(e):delete t.maxConcurrent,this.saveConfig(t);}getCCBReviewMode(){let t=this.getConfig().ccbReviewMode;return t==="single"?"single-role":t==="multi"?"multi-model":t??"multi-role"}setCCBReviewMode(e){let t=this.getConfig();t.ccbReviewMode=e,this.saveConfig(t);}setWorkerPool(e){let t=this.getConfig();t.workerPool=e,this.saveConfig(t);}addWorkerModel(e,t,n=true){let r=this.getWorkerPool();if(r.some(a=>a.providerId===e&&a.model===t))return;let i=this.getModelTraits(t);r.push({providerId:e,model:t,enabled:n,traits:i}),this.setWorkerPool(r);}removeWorkerModel(e,t){let r=this.getWorkerPool().filter(o=>!(o.providerId===e&&o.model===t));this.setWorkerPool(r);}toggleWorkerModel(e,t){let n=this.getWorkerPool(),r=n.find(o=>o.providerId===e&&o.model===t);r&&(r.enabled=!r.enabled,this.setWorkerPool(n));}getEnabledWorkerModels(){return this.getWorkerPool().filter(e=>e.enabled)}getAvailableModels(){let e=this.providerStore.getProviders(),t=[];for(let n of e)for(let r of n.models){let o=this.getModelTraits(r.name);t.push({providerId:n.id,providerName:n.name,model:r.name,traits:o});}return t}selectWorkerByTraits(e){let t=this.getEnabledWorkerModels();if(t.length===0)return;let n=t.map(r=>{let o=r.traits||[],i=e.filter(a=>o.includes(a)).length;return {entry:r,score:i}});return n.sort((r,o)=>o.score-r.score),n[0]?.entry}getModelTraits(e){if(Gh[e])return [...Gh[e]];let t=e.toLowerCase();for(let[i,a]of Object.entries(Gh))if(t.includes(i.toLowerCase())||i.toLowerCase().includes(t))return [...a];let n=on.getModel(e);if(!n)return [];let r=[],o=n.scores||{};return (o.coding??0)>=85&&r.push("coding"),(o.reasoning??0)>=85&&r.push("reasoning"),(o.vision??0)>=80&&r.push("vision"),(o.creativity??0)>=85&&r.push("creative"),(o.speed??0)>=85&&r.push("fast"),(o.cost??0)>=85&&r.push("low-cost"),n.supportsThinking&&r.push("thinking"),n.supportsVision&&r.push("multimodal"),n.maxInputTokens>=5e5&&r.push("long-context"),r}updateWorkerTraits(e,t,n){let r=this.getWorkerPool(),o=r.find(i=>i.providerId===e&&i.model===t);o&&(o.traits=n,this.setWorkerPool(r));}addWorkerTraits(e,t,n){let r=this.getWorkerPool(),o=r.find(i=>i.providerId===e&&i.model===t);if(o){let i=o.traits||[],a=[...new Set([...i,...n])];o.traits=a,this.setWorkerPool(r);}}initializeDefaults(){if(this.getConfig().workerPool.length>0)return;let t=this.providerStore.getDefaultProvider();if(!t)return;let n=t.models.map((r,o)=>({providerId:t.id,model:r.name,enabled:o===0,traits:this.getModelTraits(r.name)}));this.setWorkerPool(n);}};});var Lu,Wx=R(()=>{ne();Lu=class{hosts=new Map;hostConfigs=new Map;workspacePath=null;setWorkspace(e){this.workspacePath=e;for(let t of this.hosts.values())try{t.setWorkDir(e);}catch{}}getWorkspace(){return this.workspacePath}getHost(e){return this.hosts.get(e)}hasHost(e){return this.hosts.has(e)}getHostConfig(e){return this.hostConfigs.get(e)}clearHost(e){this.hosts.delete(e),this.hostConfigs.delete(e);}clearAll(){for(let e of this.hosts.values())try{e.interrupt();}catch{}this.hosts.clear(),this.hostConfigs.clear();}forEachHost(e){for(let[t,n]of this.hosts.entries())e(n,t);}async getOrCreateHost(e){let{sessionId:t,configKey:n,createHost:r}=e,o=this.hosts.get(t);if(o){let a=this.hostConfigs.get(t);if(a===n)return m.info("HOST_CONTROLLER",`\u{1F504} Reusing existing host for session=${t}, configKey=${n}`),o;m.info("HOST_CONTROLLER",`\u{1F5D1}\uFE0F Clearing old host: session=${t}, oldKey=${a}, newKey=${n}`),this.clearHost(t);}m.info("HOST_CONTROLLER",`\u2728 Creating NEW host: session=${t}, configKey=${n}`);let i=await r();return this.hosts.set(t,i),this.hostConfigs.set(t,n),this.workspacePath&&i.setWorkDir(this.workspacePath),i}};});var Ys,Nu=R(()=>{_s();Ys=class s{sessionId;filePath;directory;options;sequenceNumber=0;initialized=false;constructor(e){typeof e=="string"&&(e={sessionId:e}),this.sessionId=e.sessionId,this.options=e,this.directory=e.directory||Ie__default.join(ho__default.homedir(),".neox","sessions"),this.filePath=Ie__default.join(this.directory,`${this.sessionId}.jsonl`);}async ensureDirectory(){await Le__default.mkdir(this.directory,{recursive:true});}async ensureInitialized(){if(!this.initialized){await this.ensureDirectory();try{await Le__default.access(this.filePath);let e=await this.readAllItems();e.length>0&&(this.sequenceNumber=Math.max(...e.map(t=>t.seq))+1);}catch{if(this.options.autoCreateMeta!==false){let e={sessionId:this.sessionId,createdAt:new Date().toISOString(),agentName:this.options.agentName,model:this.options.model};await this.appendItem({type:"meta",data:e});}}this.initialized=true;}}async readAllItems(){let e=[];try{let t=wt__default.createReadStream(this.filePath,{encoding:"utf-8"}),n=zh__default.createInterface({input:t,crlfDelay:1/0});for await(let r of n)if(r.trim())try{let o=JSON.parse(r);e.push(o);}catch{console.warn(`Invalid JSONL line: ${r.slice(0,50)}...`);}}catch(t){if(t.code!=="ENOENT")throw t}return e.sort((t,n)=>t.seq-n.seq),e}async appendItem(e){await this.ensureDirectory();let t={item:e,timestamp:Date.now(),seq:this.sequenceNumber++},n=JSON.stringify(t)+`
|
|
1546
1546
|
`;await Le__default.appendFile(this.filePath,n,"utf-8");}async writeAllItems(e){await this.ensureDirectory();let t=e.map(n=>JSON.stringify(n)).join(`
|
|
1547
1547
|
`);await Le__default.writeFile(this.filePath,t?t+`
|
|
1548
1548
|
`:"","utf-8"),e.length>0?this.sequenceNumber=Math.max(...e.map(n=>n.seq))+1:this.sequenceNumber=0;}async getItems(e){await this.ensureInitialized();let n=(await this.readAllItems()).map(r=>r.item);return e===void 0?n:n.slice(-e)}async addItems(e){if(e.length!==0){await this.ensureInitialized();for(let t of e)await this.appendItem(t);}}async popItem(){await this.ensureInitialized();let e=await this.readAllItems();if(e.length===0)return null;let t=e.pop();return await this.writeAllItems(e),t.item}async popItems(e){if(e<=0)return [];await this.ensureInitialized();let t=await this.readAllItems();if(t.length===0)return [];let n=Math.min(e,t.length),r=t.splice(-n);return await this.writeAllItems(t),r.map(o=>o.item)}async createCheckpoint(e,t){await this.ensureInitialized();let n=`cp_${Date.now()}_${Math.random().toString(36).slice(2,6)}`,r={type:"checkpoint",data:{id:n,name:e,description:t}};return await this.appendItem(r),n}async rollbackToCheckpoint(e){await this.ensureInitialized();let t=await this.readAllItems(),n=t.findIndex(i=>i.item.type==="checkpoint"&&i.item.data.id===e);if(n===-1)throw new Error(`Checkpoint not found: ${e}`);let r=t.slice(0,n+1),o=t.length-r.length;return await this.writeAllItems(r),o}async getCheckpoints(){await this.ensureInitialized();let e=await this.readAllItems(),t=[];for(let n of e)if(n.item.type==="checkpoint"){let r=n.item;t.push({id:r.data.id,name:r.data.name,timestamp:n.timestamp});}return t}async clearSession(){try{await Le__default.unlink(this.filePath);}catch(e){if(e.code!=="ENOENT")throw e}this.sequenceNumber=0,this.initialized=false;}async getMeta(){await this.ensureInitialized();let e=await this.readAllItems();for(let t of e)if(t.item.type==="meta")return t.item.data;return null}async getMessages(){await this.ensureInitialized();let e=await this.readAllItems(),t=[];for(let n of e)n.item.type==="message"&&t.push(n.item.data);return t}async getItemCount(){return (await this.readAllItems()).length}async getTimeline(){return await this.ensureInitialized(),await this.readAllItems()}async replaceTimeline(e){await this.ensureDirectory();let t=e.map((n,r)=>({item:n.item,timestamp:n.timestamp??Date.now(),seq:r}));await this.writeAllItems(t),this.initialized=true;}static async listSessions(e){let t=e||Ie__default.join(ho__default.homedir(),".neox","sessions");try{return (await Le__default.readdir(t)).filter(r=>r.endsWith(".jsonl")).map(r=>r.replace(".jsonl",""))}catch{return []}}static async getMostRecentId(e){let t=e||Ie__default.join(ho__default.homedir(),".neox","sessions");try{let r=(await Le__default.readdir(t)).filter(i=>i.endsWith(".jsonl"));if(r.length===0)return null;let o=await Promise.all(r.map(async i=>({name:i.replace(".jsonl",""),mtime:(await Le__default.stat(Ie__default.join(t,i))).mtime})));return o.sort((i,a)=>a.mtime.getTime()-i.mtime.getTime()),o[0].name}catch{return null}}static async deleteSession(e,t){let n=t||Ie__default.join(ho__default.homedir(),".neox","sessions"),r=Ie__default.join(n,`${e}.jsonl`);try{return await Le__default.unlink(r),!0}catch{return false}}static async getSessionInfo(e,t){let n=t||Ie__default.join(ho__default.homedir(),".neox","sessions"),r=Ie__default.join(n,`${e}.jsonl`);try{let o=await Le__default.stat(r);return {sessionId:e,filePath:r,size:o.size,createdAt:o.birthtime,updatedAt:o.mtime}}catch{return null}}static create(e){return new s({sessionId:Co(),...e})}};});var Wh=R(()=>{_s();});function za(s){if(!s)return 0;let e=0;for(let t of s){let n=t.codePointAt(0)||0;n>=19968&&n<=40959||n>=12288&&n<=12351||n>=65280&&n<=65519||n>=44032&&n<=55215?e+=.67:e+=.25;}return Math.ceil(e)}var _n,Xs=R(()=>{Nc();pg();ne();_n=class{messages=[];maxMessages;constructor(e=500){this.maxMessages=e;}add(e){let t=typeof e.content=="string"?e.content:JSON.stringify(e.content),n=za(t),r={...e,_timestamp:Date.now(),_estimatedTokens:n};if(this.messages.push(r),e.role==="assistant"&&e.tool_calls&&e.tool_calls.length>0&&process.env.CLI_DEBUG==="1"&&m.debug("MEMORY","Assistant message with tool_calls added:",{toolCallCount:e.tool_calls.length,toolCallIds:e.tool_calls.map(o=>({id:o.id,name:o.function.name}))}),this.messages.length>this.maxMessages){let o=this.messages.filter(l=>l.role==="system"),a=this.messages.filter(l=>l.role!=="system").slice(-(this.maxMessages-o.length));this.messages=[...o,...a];}}addToolResult(e,t,n){let r=dg(t),o=null;try{let c=JSON.parse(n);c.type&&c.status&&c.summary&&(o=c);}catch{}let i,a=r;m.info("MEMORY","addToolResult: parsedResult\uFF1A"+o),m.info("MEMORY","addToolResult: effectiveResultType\uFF1A"+a),o?(a=o.type||r,i=lw(o),m.info("MEMORY","\u7CBE\u7B80\u7ED3\u679C: content \uFF1A"+i),m.info("MEMORY",`addToolResult: ${t} parsed as ToolResult`,{parsedResult:JSON.stringify(o).substring(0,500),contentAfter:i.substring(0,500),rawLength:n.length,contentLength:i.length})):(i=n,m.debug("MEMORY",`addToolResult: ${t} using raw output`,{rawOutput:n.substring(0,500),rawLength:n.length}));let l={role:"tool",tool_call_id:e,name:t,content:i,_resultType:a,_toolName:t,_timestamp:Date.now(),_estimatedTokens:za(i)};if(process.env.CLI_DEBUG==="1"&&m.debug("MEMORY","Tool result message added:",{toolName:t,toolCallId:e,contentLength:i.length,contentPreview:i.substring(0,200)}),this.messages.push(l),this.messages.length>this.maxMessages){let c=this.messages.filter(p=>p.role==="system"),d=this.messages.filter(p=>p.role!=="system").slice(-(this.maxMessages-c.length));this.messages=[...c,...d];}}stripMetadata(e){let{_resultType:t,_toolName:n,_timestamp:r,_estimatedTokens:o,_tag:i,...a}=e;return a}getAll(){return this.messages.map(e=>this.stripMetadata(e))}getRawMessages(){return this.messages}getMessagesForLLM(){let e=this.messages.map(t=>this.stripMetadata(t));if(process.env.CLI_DEBUG==="1"){let t=e.filter(o=>o.role==="assistant"),n=e.filter(o=>o.role==="tool");m.debug("MEMORY","Messages for LLM:",{totalMessages:e.length,assistantCount:t.length,toolCount:n.length,messageSequence:e.map(o=>o.role).join(" -> ")}),e.slice(-5).forEach((o,i)=>{o.role==="assistant"&&o.tool_calls?m.debug("MEMORY",`Message ${e.length-5+i} (assistant):`,{toolCalls:o.tool_calls.map(a=>({id:a.id,name:a.function.name}))}):o.role==="tool"&&m.debug("MEMORY",`Message ${e.length-5+i} (tool):`,{name:o.name,tool_call_id:o.tool_call_id,contentLength:typeof o.content=="string"?o.content.length:0});});}return e}hasConversationMessages(){return this.messages.some(e=>e.role==="user"||e.role==="assistant")}upsertSystemTagged(e,t){let n=t.trim();if(!n){this.removeSystemTagged(e);return}let r=this.messages.findIndex(a=>a.role==="system"&&a._tag===e);if(r>=0){let a=this.messages[r];if(a.content===n)return;this.messages[r]={...a,content:n,_timestamp:Date.now(),_estimatedTokens:za(n)};return}let o={role:"system",content:n,_tag:e,_timestamp:Date.now(),_estimatedTokens:za(n)},i=this.getSystemInsertIndex();this.messages=[...this.messages.slice(0,i),o,...this.messages.slice(i)];}removeSystemTagged(e){let t=this.messages.length;this.messages=this.messages.filter(n=>!(n.role==="system"&&n._tag===e)),t!==this.messages.length&&process.env.CLI_DEBUG==="1"&&m.debug("MEMORY",`Removed system tag: ${e}`);}getSystemInsertIndex(){let e=0;for(;e<this.messages.length&&this.messages[e].role==="system";)e+=1;return e}cleanupEphemeral(){let e=this.messages.length,t=new Set;for(let n of this.messages)if(n.role==="assistant"&&n.tool_calls)for(let r of n.tool_calls)r.id&&t.add(r.id);return this.messages=this.messages.filter(n=>n._resultType!=="ephemeral"||n.role!=="tool"||!n.tool_call_id?true:t.has(n.tool_call_id)),e-this.messages.length}getStats(){let e={total:this.messages.length,ephemeral:0,contextual:0,summarized:0,other:0};for(let t of this.messages)t._resultType==="ephemeral"?e.ephemeral++:t._resultType==="contextual"?e.contextual++:t._resultType==="summarized"?e.summarized++:e.other++;return e}checkContextHealth(){let e={ephemeral:{count:0,tokens:0},contextual:{count:0,tokens:0},summarized:{count:0,tokens:0},other:{count:0,tokens:0}},t=0,n=0,r=0;for(let a of this.messages){let l=a._estimatedTokens||za(typeof a.content=="string"?a.content:JSON.stringify(a.content));t+=l,a.role==="tool"?(r++,n+=l,a._resultType==="ephemeral"?(e.ephemeral.count++,e.ephemeral.tokens+=l):a._resultType==="contextual"?(e.contextual.count++,e.contextual.tokens+=l):a._resultType==="summarized"?(e.summarized.count++,e.summarized.tokens+=l):(e.other.count++,e.other.tokens+=l)):(e.other.count++,e.other.tokens+=l);}let o=t>0?n/t:0,i=[];return o>.5?i.push(`Tool results\u5360\u7528 ${(o*100).toFixed(1)}% \u7684\u4E0A\u4E0B\u6587\uFF08\u8D85\u8FC750%\u8B66\u6212\u7EBF\uFF09`):o>.4&&i.push(`Tool results\u5360\u7528 ${(o*100).toFixed(1)}% \u7684\u4E0A\u4E0B\u6587\uFF08\u63A5\u8FD1\u8B66\u6212\u7EBF\uFF09`),t>18e4?i.push(`\u4E0A\u4E0B\u6587\u5DF2\u8FBE ${t} tokens\uFF08\u8D85\u8FC7180k\uFF0C\u5EFA\u8BAE\u6E05\u7406\uFF09`):t>15e4&&i.push(`\u4E0A\u4E0B\u6587\u5DF2\u8FBE ${t} tokens\uFF08\u63A5\u8FD1180k\uFF09`),r>100?i.push(`\u5DE5\u5177\u8C03\u7528\u5386\u53F2\u8FC7\u957F\uFF08${r} \u6761\uFF09`):r>60&&i.push(`\u5DE5\u5177\u8C03\u7528\u5386\u53F2\u8F83\u957F\uFF08${r} \u6761\uFF09`),e.ephemeral.count>10&&i.push(`\u79EF\u7D2F\u4E86 ${e.ephemeral.count} \u6761 ephemeral \u6D88\u606F\uFF0C\u5EFA\u8BAE\u6E05\u7406`),{totalTokens:t,toolResultTokens:n,toolResultRatio:o,messageCount:this.messages.length,toolMessageCount:r,warnings:i,shouldCompress:o>.3||t>12e4,shouldCleanup:t>15e4||e.ephemeral.count>5,byType:e}}getTokenSummary(){let e=this.checkContextHealth(),t=[`Total: ${e.totalTokens} tokens`,`Tool: ${e.toolResultTokens} (${(e.toolResultRatio*100).toFixed(1)}%)`,`Messages: ${e.messageCount}`];return e.byType.ephemeral.count>0&&t.push(`Ephemeral: ${e.byType.ephemeral.count}`),t.join(" | ")}getMemoryFootprint(){let e=JSON.stringify(this.messages),t=new Blob([e]).size,n=Math.round(t/1024*10)/10,r=this.messages.length*150,o=t+r,i=Math.round(o/1024*10)/10;return {totalKB:i,messagesKB:n,messageCount:this.messages.length,averageKBPerMessage:this.messages.length>0?Math.round(i/this.messages.length*10)/10:0}}logMemoryStats(){let e=this.checkContextHealth(),t=this.getMemoryFootprint();m.info("MEMORY_STATS","ShortTermMemory snapshot",{memoryTotalKB:t.totalKB,memoryMessagesKB:t.messagesKB,avgKBPerMessage:t.averageKBPerMessage,totalTokens:e.totalTokens,toolResultTokens:e.toolResultTokens,toolResultRatio:`${(e.toolResultRatio*100).toFixed(1)}%`,messageCount:e.messageCount,toolMessageCount:e.toolMessageCount,maxMessages:this.maxMessages,byType:{ephemeral:`${e.byType.ephemeral.count} msgs, ${e.byType.ephemeral.tokens} tokens`,contextual:`${e.byType.contextual.count} msgs, ${e.byType.contextual.tokens} tokens`,summarized:`${e.byType.summarized.count} msgs, ${e.byType.summarized.tokens} tokens`,other:`${e.byType.other.count} msgs, ${e.byType.other.tokens} tokens`},warnings:e.warnings.length>0?e.warnings:["None"],shouldCompress:e.shouldCompress,shouldCleanup:e.shouldCleanup});}clear(){let e=this.messages.filter(t=>t.role==="system");this.messages=e;}setMessages(e){let t=Array.isArray(e)?e:[],n=t.filter(a=>a.role==="system"),r=t.filter(a=>a.role!=="system"),o=Math.max(0,this.maxMessages-n.length),i=o>0?r.slice(-o):[];this.messages=[...n,...i].map(a=>({...a,_timestamp:Date.now()}));}get length(){return this.messages.length}};});var dr,qh=R(()=>{Nu();_s();dr=class{directory;options;sessionCache=new Map;constructor(e){this.options=e||{},this.directory=e?.directory||Ie__default.join(ho__default.homedir(),".neox","sessions");}async getSession(e){if(this.sessionCache.has(e))return this.sessionCache.get(e);let t=new Ys({sessionId:e,directory:this.directory,agentName:this.options.defaultAgentName,model:this.options.defaultModel});return this.sessionCache.set(e,t),t}async listSessions(){let e=[];try{await Le__default.mkdir(this.directory,{recursive:!0});let t=await Le__default.readdir(this.directory);for(let n of t){if(!n.endsWith(".jsonl"))continue;let r=n.replace(".jsonl",""),o=Ie__default.join(this.directory,n);try{let i=await Le__default.stat(o),a=await this.readSessionMeta(o),l=await this.countItems(o);e.push({sessionId:r,createdAt:i.birthtime,updatedAt:i.mtime,itemCount:l,agentName:a?.agentName});}catch{}}}catch(t){if(t.code!=="ENOENT")throw t}return e.sort((t,n)=>n.updatedAt.getTime()-t.updatedAt.getTime()),e}async getMostRecent(){let e=await this.listSessions();return e.length===0?null:this.getSession(e[0].sessionId)}async deleteSession(e){this.sessionCache.delete(e);let t=Ie__default.join(this.directory,`${e}.jsonl`);try{return await Le__default.unlink(t),!0}catch{return false}}async searchSessions(e){let t=await this.listSessions(),n=e.toLowerCase(),r=[];for(let o of t){if(o.sessionId.toLowerCase().includes(n)){r.push(o);continue}if(o.agentName?.toLowerCase().includes(n)){r.push(o);continue}let i=Ie__default.join(this.directory,`${o.sessionId}.jsonl`);await this.searchInFile(i,n)&&r.push(o);}return r}async createSession(e){let t=e?.sessionId||Co(),n=new Ys({sessionId:t,directory:this.directory,agentName:e?.agentName||this.options.defaultAgentName,model:e?.model||this.options.defaultModel});return this.sessionCache.set(t,n),n}async getOrCreateSession(e){return e?this.getSession(e):this.createSession()}async continueOrCreate(){let e=await this.getMostRecent();return e||this.createSession()}async cleanupOldSessions(e=30){let t=await this.listSessions(),n=Date.now()-e*24*60*60*1e3,r=0;for(let o of t)o.updatedAt.getTime()<n&&await this.deleteSession(o.sessionId)&&r++;return r}getDirectory(){return this.directory}async getSessionCount(){return (await this.listSessions()).length}async exportSession(e){let t=await this.getSession(e),n=await t.getItems(),r=await t.getMeta();return JSON.stringify({sessionId:e,meta:r,items:n,exportedAt:new Date().toISOString()},null,2)}async readSessionMeta(e){try{let t=createReadStream(e,{encoding:"utf-8"}),n=zh__default.createInterface({input:t,crlfDelay:1/0});for await(let r of n)if(r.trim())try{let o=JSON.parse(r);if(o.item?.type==="meta")return n.close(),o.item.data}catch{}}catch{}return null}async countItems(e){let t=0;try{let n=createReadStream(e,{encoding:"utf-8"}),r=zh__default.createInterface({input:n,crlfDelay:1/0});for await(let o of r)o.trim()&&t++;}catch{}return t}async searchInFile(e,t){try{let n=createReadStream(e,{encoding:"utf-8"}),r=zh__default.createInterface({input:n,crlfDelay:1/0});for await(let o of r)if(o.toLowerCase().includes(t))return r.close(),!0}catch{}return false}};});var qx=R(()=>{Zn();_s();});var Bu=R(()=>{_s();Nu();Wh();Xs();qh();qx();Nu();Wh();qh();});var uO,Kx,Jx,Vx=R(()=>{nm();lm();ne();uO={name:"require_read_before_edit",guardrail_function:async s=>{let{tool_name:e,tool_input:t}=s.tool_context;if(e!=="edit_file")return Yl();let n=t.file_path;if(!n)return Yl();let r=l=>Ie__default.resolve(l).replace(/\\/g,"/"),o=r(n),i=Dv(s.context,20);return process.env.CLI_DEBUG==="1"&&(m.debug("GUARDRAIL",`Checking edit for: ${n}`),m.debug("GUARDRAIL",`Normalized path: ${o}`),m.debug("GUARDRAIL",`Recent tool calls (${i.length}):`),i.forEach((l,c)=>{if(l.name==="readfile"){let u=l.args.path,d=u?r(u):"undefined";m.debug("GUARDRAIL",` [${c}] readfile: ${u} (normalized: ${d}) success=${l.success}`);}})),i.some(l=>{if(l.name!=="readfile"||!l.success)return false;let c=l.args.path;if(!c)return false;let d=r(c)===o||c===n;return process.env.CLI_DEBUG==="1"&&d&&m.debug("GUARDRAIL",` \u2713 Found matching readfile: ${c}`),d})?Yl():(m.warn("GUARDRAIL",`Edit without recent readfile: ${n} (abs: ${o})`),process.env.CLI_DEBUG==="1"&&m.debug("GUARDRAIL",`Available readfile calls: ${i.filter(l=>l.name==="readfile").length}`),vv(`\u26A0\uFE0F \u7F16\u8F91\u524D\u8BF7\u5148\u8BFB\u53D6\u6587\u4EF6
|
|
@@ -2105,7 +2105,7 @@ ${this.task.description}
|
|
|
2105
2105
|
|
|
2106
2106
|
[\u4F9D\u8D56\u4EFB\u52A1\u7ED3\u679C]
|
|
2107
2107
|
${a}`};return this.spawnAndExecute(l,t)}catch(o){let i=o instanceof Error?o.message:String(o);return m.error("AGENT_POOL",`Task ${e.id} dependency wait failed`,{error:i}),{success:false,summary:"\u4F9D\u8D56\u7B49\u5F85\u5931\u8D25",error:i,duration:0}}}buildDependencyContext(e){let t=[];for(let[n,r]of e)r.success&&r.output&&t.push(`- ${n}: ${JSON.stringify(r.output).substring(0,200)}`);return t.join(`
|
|
2108
|
-
`)}createAgentMemory(){return new _n}clearAgentHost(e){let t=this.options.hostService;if(!t)return;t.getHost(e)?.dispose?.(),t.clearHost(e);}async spawn(e){let t=`agent-${++this.agentCounter}`,n=`${e.sessionId}_${t}`,r=e.taskId??`task-${Date.now()}-${this.agentCounter}`,o={id:r,description:e.prompt,priority:e.priority??1},i=Zc(this.options.tools,t),a=this.createAgentMemory(),l=e.providerId??this.options.providerId,c=e.model??this.options.modelName,u=new hi({id:t,index:this.agentCounter,task:o,sessionId:e.sessionId,workDir:this.options.workDir,eventBus:this.eventBus,orchestrator:this.options.orchestrator,resolveProvider:this.options.resolveProvider,providerId:l,modelName:c,permissionManager:this.options.permissionManager,tools:i,memory:a,onRuntimeEvent:this.options.onAgentRuntimeEvent?(y,b)=>this.options.onAgentRuntimeEvent(t,y,b):void 0});this.agents.set(t,u),m.info("AGENT_POOL",`Spawned agent ${t} (background)`,{prompt:e.prompt});let d=e.timeoutMs??5*6e4,p=null,g=false,h=()=>{p&&(clearTimeout(p),p=null),g||(g=true,this.agents.delete(t),this.clearAgentHost(n));};return p=setTimeout(()=>{g||(m.warn("AGENT_POOL",`Agent ${t} timed out after ${d/1e3}s, force aborting`),u.abort(),h(),this.sharedContext.storeTaskResult({taskId:o.id,agentId:t,success:false,error:`Worker timeout (${d/1e3}s)`,timestamp:Date.now()}),this.options.onAgentCompleted?.({agentId:t,success:false,error:`Worker timeout (${d/1e3}s)`}));},d),u.execute().then(y=>{g||(h(),this.sharedContext.storeTaskResult({taskId:o.id,agentId:t,success:y.success,output:y.output,error:y.error,timestamp:Date.now()}),m.info("AGENT_POOL",`Agent ${t} completed`,{success:y.success}),this.options.onAgentCompleted?.({agentId:t,success:y.success,output:y.output,error:y.error}));}).catch(y=>{g||(h(),this.sharedContext.storeTaskResult({taskId:o.id,agentId:t,success:false,error:y.message,timestamp:Date.now()}),m.error("AGENT_POOL",`Agent ${t} failed`,{error:y.message}),this.options.onAgentCompleted?.({agentId:t,success:false,error:y.message}));}),{agentId:t,taskId:r}}getActiveAgents(){return Array.from(this.agents.values()).map(e=>e.getInfo())}getActiveCount(){return this.agents.size}abortAll(){for(let e of this.agents.values())e.abort();this.agents.clear();}abort(e){let t=this.agents.get(e);return t?(t.abort(),this.agents.delete(e),true):false}reset(){this.abortAll(),this.agentCounter=0;}};});var QS=R(()=>{ne();});function mn(s){return (s||"").trim().toLowerCase()}function a1(s){let e=mn(s);return e?/(探索|调研|收集|搜集|scan|explore|research|investigate|find)/i.test(e)?"scout":/(总结|摘要|归纳|压缩|提炼|summarize|compress|distill)/i.test(e)?"compressor":/(校验|验证|检查|核对|verify|validate|check|assert)/i.test(e)?"verifier":/(规划|统筹|拆分|协调|plan|coordinate|orchestrate)/i.test(e)?"coordinator":"worker":"worker"}function l1(s){let e=mn(s),t=new Set;return /(ui|前端|界面|视觉|image|vision|design)/i.test(e)&&(t.add("vision"),t.add("creative")),/(代码|实现|修复|重构|coding|implement|fix|refactor)/i.test(e)&&t.add("coding"),/(复杂|架构|推理|analysis|reason|complex)/i.test(e)&&(t.add("reasoning"),t.add("thorough")),/(快速|尽快|cheap|低成本|fast|quick)/i.test(e)&&(t.add("fast"),t.add("cheap")),Array.from(t)}function c1(s){let e=mn(s);return e.includes("claude")?"claude":e.includes("gpt")||e==="o3"||e.includes("o4")||e.includes("o1")?"gpt":e.includes("gemini")?"gemini":e.includes("deepseek")?"deepseek":e.includes("qwen")?"qwen":"other"}function u1(s,e){let t=mn(e),n=c1(e);if(s==="scout"){if(t.includes("haiku")||t.includes("flash")||t.includes("mini"))return 2;if(n==="gemini")return 1.5;if(n==="claude"||n==="gpt")return 1}if(s==="worker"){if(t.includes("codex"))return 2;if(t.includes("sonnet")||t.includes("opus"))return 1.5;if(n==="deepseek")return 1}if(s==="compressor"){if(t.includes("mini")||t.includes("haiku")||t.includes("flash"))return 2;if(n==="gpt"||n==="claude")return 1}if(s==="verifier"){if(t.includes("opus")||t.includes("sonnet")||t.includes("gpt-5")||t.includes("gpt-4"))return 2;if(n==="claude"||n==="gpt")return 1}if(s==="coordinator"){if(t.includes("opus")||t.includes("gpt-5")||t.includes("sonnet"))return 2;if(n==="claude"||n==="gpt")return 1}return 0}function dd(s){let e=mn(s);if(e&&(e==="coordinator"||e==="scout"||e==="worker"||e==="compressor"||e==="verifier"))return e}var Cf,ud,pd=R(()=>{Cf={coordinator:["reasoning","thorough","long-context"],scout:["fast","cheap","low-cost","vision"],worker:["coding","agent","balanced","fast"],compressor:["fast","cheap","reasoning"],verifier:["reasoning","coding","thorough"]};ud=class{options;constructor(e){this.options=e;}selectModel(e){let t=e.role??a1(e.task),n=this.options.getEnabledWorkers();if(n.length===0)return {providerId:this.options.defaultProviderId,model:this.options.defaultModel,role:t,confidence:0,reason:"worker_pool_empty_fallback_default",requiredTraits:Cf[t]};if(e.explicitWorkerId){let u=this.findByWorkerIdOrModel(e.explicitWorkerId,n);if(u)return {providerId:u.providerId,model:u.model,role:t,confidence:1,reason:`explicit_worker_selected:${e.explicitWorkerId}`,requiredTraits:Cf[t]}}let r=new Set(Array.from(e.avoidModels||[]).map(mn)),o=n.filter(u=>!r.has(mn(u.model))),i=o.length>0?o:n,a=Array.from(new Set([...Cf[t],...l1(e.task)])),l=i[0],c=Number.NEGATIVE_INFINITY;for(let u of i){let d=new Set((u.traits||[]).map(mn)),p=a.reduce((y,b)=>d.has(mn(b))?y+2:y,0),g=u1(t,u.model),h=p+g;h>c&&(c=h,l=u);}return {providerId:l.providerId,model:l.model,role:t,confidence:Math.max(.1,Math.min(1,c/12)),reason:`policy_selected(role=${t},score=${c.toFixed(1)})`,requiredTraits:a}}findByWorkerIdOrModel(e,t){let n=mn(e),r=t.find(i=>mn(i.providerId)===n);if(r)return r;let o=t.find(i=>mn(i.model)===n);return o||t.find(i=>mn(i.providerId).includes(n)||mn(i.model).includes(n))}};});function Tf(s){md=s,m.debug("ASSISTANT_TOOLS","Context set",{sessionId:s.sessionId});}function gd(){md=null;}function xf(){if(!md)throw new Error("Assistant tools context not initialized");return md}function Sf(){return wf||(wf=new Lt(new
|
|
2108
|
+
`)}createAgentMemory(){return new _n}clearAgentHost(e){let t=this.options.hostService;if(!t)return;t.getHost(e)?.dispose?.(),t.clearHost(e);}async spawn(e){let t=`agent-${++this.agentCounter}`,n=`${e.sessionId}_${t}`,r=e.taskId??`task-${Date.now()}-${this.agentCounter}`,o={id:r,description:e.prompt,priority:e.priority??1},i=Zc(this.options.tools,t),a=this.createAgentMemory(),l=e.providerId??this.options.providerId,c=e.model??this.options.modelName,u=new hi({id:t,index:this.agentCounter,task:o,sessionId:e.sessionId,workDir:this.options.workDir,eventBus:this.eventBus,orchestrator:this.options.orchestrator,resolveProvider:this.options.resolveProvider,providerId:l,modelName:c,permissionManager:this.options.permissionManager,tools:i,memory:a,onRuntimeEvent:this.options.onAgentRuntimeEvent?(y,b)=>this.options.onAgentRuntimeEvent(t,y,b):void 0});this.agents.set(t,u),m.info("AGENT_POOL",`Spawned agent ${t} (background)`,{prompt:e.prompt});let d=e.timeoutMs??5*6e4,p=null,g=false,h=()=>{p&&(clearTimeout(p),p=null),g||(g=true,this.agents.delete(t),this.clearAgentHost(n));};return p=setTimeout(()=>{g||(m.warn("AGENT_POOL",`Agent ${t} timed out after ${d/1e3}s, force aborting`),u.abort(),h(),this.sharedContext.storeTaskResult({taskId:o.id,agentId:t,success:false,error:`Worker timeout (${d/1e3}s)`,timestamp:Date.now()}),this.options.onAgentCompleted?.({agentId:t,success:false,error:`Worker timeout (${d/1e3}s)`}));},d),u.execute().then(y=>{g||(h(),this.sharedContext.storeTaskResult({taskId:o.id,agentId:t,success:y.success,output:y.output,error:y.error,timestamp:Date.now()}),m.info("AGENT_POOL",`Agent ${t} completed`,{success:y.success}),this.options.onAgentCompleted?.({agentId:t,success:y.success,output:y.output,error:y.error}));}).catch(y=>{g||(h(),this.sharedContext.storeTaskResult({taskId:o.id,agentId:t,success:false,error:y.message,timestamp:Date.now()}),m.error("AGENT_POOL",`Agent ${t} failed`,{error:y.message}),this.options.onAgentCompleted?.({agentId:t,success:false,error:y.message}));}),{agentId:t,taskId:r}}getActiveAgents(){return Array.from(this.agents.values()).map(e=>e.getInfo())}getActiveCount(){return this.agents.size}abortAll(){for(let e of this.agents.values())e.abort();this.agents.clear();}abort(e){let t=this.agents.get(e);return t?(t.abort(),this.agents.delete(e),true):false}reset(){this.abortAll(),this.agentCounter=0;}};});var QS=R(()=>{ne();});function mn(s){return (s||"").trim().toLowerCase()}function a1(s){let e=mn(s);return e?/(探索|调研|收集|搜集|scan|explore|research|investigate|find)/i.test(e)?"scout":/(总结|摘要|归纳|压缩|提炼|summarize|compress|distill)/i.test(e)?"compressor":/(校验|验证|检查|核对|verify|validate|check|assert)/i.test(e)?"verifier":/(规划|统筹|拆分|协调|plan|coordinate|orchestrate)/i.test(e)?"coordinator":"worker":"worker"}function l1(s){let e=mn(s),t=new Set;return /(ui|前端|界面|视觉|image|vision|design)/i.test(e)&&(t.add("vision"),t.add("creative")),/(代码|实现|修复|重构|coding|implement|fix|refactor)/i.test(e)&&t.add("coding"),/(复杂|架构|推理|analysis|reason|complex)/i.test(e)&&(t.add("reasoning"),t.add("thorough")),/(快速|尽快|cheap|低成本|fast|quick)/i.test(e)&&(t.add("fast"),t.add("cheap")),Array.from(t)}function c1(s){let e=mn(s);return e.includes("claude")?"claude":e.includes("gpt")||e==="o3"||e.includes("o4")||e.includes("o1")?"gpt":e.includes("gemini")?"gemini":e.includes("deepseek")?"deepseek":e.includes("qwen")?"qwen":"other"}function u1(s,e){let t=mn(e),n=c1(e);if(s==="scout"){if(t.includes("haiku")||t.includes("flash")||t.includes("mini"))return 2;if(n==="gemini")return 1.5;if(n==="claude"||n==="gpt")return 1}if(s==="worker"){if(t.includes("codex"))return 2;if(t.includes("sonnet")||t.includes("opus"))return 1.5;if(n==="deepseek")return 1}if(s==="compressor"){if(t.includes("mini")||t.includes("haiku")||t.includes("flash"))return 2;if(n==="gpt"||n==="claude")return 1}if(s==="verifier"){if(t.includes("opus")||t.includes("sonnet")||t.includes("gpt-5")||t.includes("gpt-4"))return 2;if(n==="claude"||n==="gpt")return 1}if(s==="coordinator"){if(t.includes("opus")||t.includes("gpt-5")||t.includes("sonnet"))return 2;if(n==="claude"||n==="gpt")return 1}return 0}function dd(s){let e=mn(s);if(e&&(e==="coordinator"||e==="scout"||e==="worker"||e==="compressor"||e==="verifier"))return e}var Cf,ud,pd=R(()=>{Cf={coordinator:["reasoning","thorough","long-context"],scout:["fast","cheap","low-cost","vision"],worker:["coding","agent","balanced","fast"],compressor:["fast","cheap","reasoning"],verifier:["reasoning","coding","thorough"]};ud=class{options;constructor(e){this.options=e;}selectModel(e){let t=e.role??a1(e.task),n=this.options.getEnabledWorkers();if(n.length===0)return {providerId:this.options.defaultProviderId,model:this.options.defaultModel,role:t,confidence:0,reason:"worker_pool_empty_fallback_default",requiredTraits:Cf[t]};if(e.explicitWorkerId){let u=this.findByWorkerIdOrModel(e.explicitWorkerId,n);if(u)return {providerId:u.providerId,model:u.model,role:t,confidence:1,reason:`explicit_worker_selected:${e.explicitWorkerId}`,requiredTraits:Cf[t]}}let r=new Set(Array.from(e.avoidModels||[]).map(mn)),o=n.filter(u=>!r.has(mn(u.model))),i=o.length>0?o:n,a=Array.from(new Set([...Cf[t],...l1(e.task)])),l=i[0],c=Number.NEGATIVE_INFINITY;for(let u of i){let d=new Set((u.traits||[]).map(mn)),p=a.reduce((y,b)=>d.has(mn(b))?y+2:y,0),g=u1(t,u.model),h=p+g;h>c&&(c=h,l=u);}return {providerId:l.providerId,model:l.model,role:t,confidence:Math.max(.1,Math.min(1,c/12)),reason:`policy_selected(role=${t},score=${c.toFixed(1)})`,requiredTraits:a}}findByWorkerIdOrModel(e,t){let n=mn(e),r=t.find(i=>mn(i.providerId)===n);if(r)return r;let o=t.find(i=>mn(i.model)===n);return o||t.find(i=>mn(i.providerId).includes(n)||mn(i.model).includes(n))}};});function Tf(s){md=s,m.debug("ASSISTANT_TOOLS","Context set",{sessionId:s.sessionId});}function gd(){md=null;}function xf(){if(!md)throw new Error("Assistant tools context not initialized");return md}function Sf(){return wf||(wf=new Lt(new rt)),wf}function d1(){let e=Sf().getEnabledWorkerModels();return e.length===0?"\uFF08\u6682\u65E0\u53EF\u7528 Worker \u6A21\u578B\uFF09":`\u53EF\u7528 Worker \u6A21\u578B\uFF1A
|
|
2109
2109
|
${e.map((n,r)=>{let o=n.traits?.join(", ")||"\u901A\u7528";return ` ${r+1}. [${n.providerId}] ${n.model} - \u7279\u6027: ${o}`}).join(`
|
|
2110
2110
|
`)}`}function p1(s){let t=Sf().getEnabledWorkerModels(),n=t.find(o=>o.providerId===s);if(n||(n=t.find(o=>o.model===s),n))return n;let r=s.toLowerCase();return n=t.find(o=>o.model.toLowerCase().includes(r)||o.providerId.toLowerCase().includes(r)),n}function m1(s){let{task:e,workerId:t,role:n,context:r}=s,o=dd(n);if(r.selectWorkerModel){let a=r.selectWorkerModel({task:e,role:o,workerId:t});if(a.model)return {model:a.model,providerId:a.providerId,role:a.role??o,reason:a.reason}}if(t){let a=p1(t);if(a)return {model:a.model,providerId:a.providerId,role:o,reason:"manual_worker_id"}}let i=Sf().getEnabledWorkerModels();if(i.length>0){let a=i[0];return {model:a.model,providerId:a.providerId,role:o,reason:"fallback_first_enabled_worker"}}return {role:o,reason:"no_worker_available"}}async function g1(s,e,t){let n=Date.now(),r=500;for(;Date.now()-n<t;)if(await new Promise(i=>setTimeout(i,r)),(s.getActiveWorkerCount?.()??0)<e)return true;return false}function h1(){return {name:"spawn_agent",description:`\u521B\u5EFA\u5F02\u6B65\u540E\u53F0\u5B50 agent \u6267\u884C\u4EFB\u52A1\u3002\u5B50 agent \u72EC\u7ACB\u8FD0\u884C\uFF0C\u5B8C\u6210\u540E\u81EA\u52A8\u6C47\u62A5\u7ED3\u679C\u3002
|
|
2111
2111
|
\u9002\u7528\u4E8E\u8017\u65F6\u8F83\u957F\u3001\u4E0D\u9700\u8981\u7ACB\u5373\u83B7\u53D6\u7ED3\u679C\u7684\u4EFB\u52A1\u3002
|
|
@@ -2127,7 +2127,7 @@ ${d}`);}catch{}let a=r?`
|
|
|
2127
2127
|
|
|
2128
2128
|
---
|
|
2129
2129
|
|
|
2130
|
-
`)}async drainPendingAnnounces(){if(this.pendingAnnounces.length===0)return;let e=this.pendingAnnounces.splice(0);this.announceDebounceBuffer.push(...e),this.flushAnnounceBuffer();}setupContext(){Tf({agentPool:this.config.agentPool,sessionId:this.sessionId,agentId:this.mainAgentId,selectWorkerModel:this.config.selectWorkerModel,maxConcurrent:this.config.maxConcurrent,getActiveWorkerCount:()=>this.config.agentPool.getActiveCount(),getParentMemory:()=>this.memory,actionLog:this.config.actionLog});}setStatus(e){let t=this.status;this.status=e,t!==e&&this.emit("status_change",{from:t,to:e});}};});function T1(){let e=new Lt(new
|
|
2130
|
+
`)}async drainPendingAnnounces(){if(this.pendingAnnounces.length===0)return;let e=this.pendingAnnounces.splice(0);this.announceDebounceBuffer.push(...e),this.flushAnnounceBuffer();}setupContext(){Tf({agentPool:this.config.agentPool,sessionId:this.sessionId,agentId:this.mainAgentId,selectWorkerModel:this.config.selectWorkerModel,maxConcurrent:this.config.maxConcurrent,getActiveWorkerCount:()=>this.config.agentPool.getActiveCount(),getParentMemory:()=>this.memory,actionLog:this.config.actionLog});}setStatus(e){let t=this.status;this.status=e,t!==e&&this.emit("status_change",{from:t,to:e});}};});function T1(){let e=new Lt(new rt).getEnabledWorkerModels(),t="";return e.length>0?t=e.map(n=>{let r=n.traits?.length?n.traits.join(", "):"\u901A\u7528";return ` - ${n.model}: [${r}]`}).join(`
|
|
2131
2131
|
`):t=" (\u5C06\u4F7F\u7528\u9ED8\u8BA4\u6A21\u578B)",`
|
|
2132
2132
|
## \u4F60\u662F\u8C01
|
|
2133
2133
|
|
|
@@ -2160,7 +2160,7 @@ ${t}
|
|
|
2160
2160
|
2. \u9700\u8981\u52A8\u624B\u5C31 spawn\uFF0C\u4E0D\u8981\u81EA\u5DF1\u7528\u5DE5\u5177
|
|
2161
2161
|
3. \u72EC\u7ACB\u4EFB\u52A1\u540C\u65F6 spawn \u591A\u4E2A
|
|
2162
2162
|
4. \u7B80\u6D01\uFF0C\u7B80\u6D01\uFF0C\u7B80\u6D01
|
|
2163
|
-
`}function x1(){return {emit:()=>{},subscribe:()=>()=>{},on:()=>()=>{},getHistory:()=>[]}}var bi,Ef=R(()=>{If();Xo();ne();Za();tl();Vs();cr();pd();nk();bi=class extends EventEmitter{config;hostService;orchestrator;agentPool;runConfigStore;mainAgentId="main";workerCounter=0;activeDelegateWorkers=new Set;modelPolicyRouter;modelFailureStreak=new Map;lastScoutSuccessAt=0;abortController=null;assistantMainMemory=null;session=null;sessionStarted=false;constructor(e){super(),this.config=e,this.runConfigStore=new Lt(new
|
|
2163
|
+
`}function x1(){return {emit:()=>{},subscribe:()=>()=>{},on:()=>()=>{},getHistory:()=>[]}}var bi,Ef=R(()=>{If();Xo();ne();Za();tl();Vs();cr();pd();nk();bi=class extends EventEmitter{config;hostService;orchestrator;agentPool;runConfigStore;mainAgentId="main";workerCounter=0;activeDelegateWorkers=new Set;modelPolicyRouter;modelFailureStreak=new Map;lastScoutSuccessAt=0;abortController=null;assistantMainMemory=null;session=null;sessionStarted=false;constructor(e){super(),this.config=e,this.runConfigStore=new Lt(new rt),this.modelPolicyRouter=new ud({getEnabledWorkers:()=>this.runConfigStore.getEnabledWorkerModels(),defaultProviderId:this.config.providerId,defaultModel:this.config.modelName}),this.hostService=new gr({platformServices:e.services}),this.orchestrator=new hr({hostService:this.hostService,resolveProvider:e.resolveProvider});let t=x1();this.agentPool=new no({eventBus:t,orchestrator:this.orchestrator,resolveProvider:this.config.resolveProvider,providerId:this.config.providerId,modelName:this.config.modelName,permissionManager:this.config.permissionManager,tools:this.config.tools,memory:this.config.memory,workDir:this.config.workDir,sharedContext:void 0,hostService:this.hostService,onAgentRuntimeEvent:(n,r,o)=>{this.emit("worker_event",{agentId:n,event:r,tracker:o});},onAgentCompleted:n=>{this.handleSpawnAnnounce(n);}}),m.info("ASSISTANT_RUNTIME","AssistantRuntime initialized (Jarvis mode)");}ensureSession(e){return this.session?this.session:(this.session=new fd({sessionId:e,orchestrator:this.orchestrator,hostService:this.hostService,agentPool:this.agentPool,services:this.config.services,permissionManager:this.config.permissionManager,tools:this.config.tools,workDir:this.config.workDir,providerId:this.config.providerId,modelName:this.config.modelName,resolveProvider:this.config.resolveProvider,systemPrompt:this.config.systemPrompt||"",buildAssistantInstructions:()=>T1(),buildWorkerInstructions:(t,n,r)=>this.buildWorkerInstructions(t,n,r),selectWorkerModel:t=>this.selectWorkerModelByPolicy(t),maxConcurrent:this.getMaxConcurrentWorkers(),actionLog:this.config.actionLog}),this.session.on("runtime_event",t=>{this.emit("worker_event",t);}),this.session.on("worker_start",t=>this.emit("worker_start",t)),this.session.on("turn_start",t=>{this.emit("worker_start",{agentId:"Main",task:t.prompt,model:this.config.modelName});}),this.session.on("turn_complete",t=>{this.emit("worker_complete",{agentId:"Main",success:true,summary:t.output});}),this.session.on("status_change",t=>{this.emit("session_status",t);}),this.sessionStarted||(this.sessionStarted=true,this.session.start().catch(t=>{m.error("ASSISTANT_RUNTIME",`Session loop crashed: ${t.message}`);})),this.session)}async chat(e){let{sessionId:t,prompt:n}=e,r=this.ensureSession(t);this.emit("worker_start",{agentId:"Main",task:n.substring(0,100),model:this.config.modelName});try{return await r.injectMessage(n,{channel:"cli"})}catch(o){throw this.emit("worker_complete",{agentId:"Main",success:false,error:o.message}),o}}injectMessage(e,t,n){this.ensureSession(e).injectMessage(t,n).catch(o=>{m.error("ASSISTANT_RUNTIME",`Inject message failed: ${o.message}`);});}getSessionStatus(){return this.session?.getStatus()??"idle"}isBusy(){let e=this.getSessionStatus();return e==="thinking"||e==="tool_executing"}abort(){this.session&&(this.session.abort(),this.session=null,this.sessionStarted=false),this.agentPool.abortAll(),this.hostService.clearAll(),Gn(),m.info("ASSISTANT_RUNTIME","Aborted");}getModeName(){return "assistant"}handleSpawnAnnounce(e){if(!this.session)return;let t=e.output||e.error||"(no output)";if(t.length<=500){this.emit("worker_result",{agentId:e.agentId,success:e.success,output:t,direct:true}),m.info("ANNOUNCE",`Direct SSE push for ${e.agentId} (${t.length} chars)`);return}let r={agentId:e.agentId,status:e.success?"ok":"error",output:t,summaryLine:e.success?"Task completed":`Error: ${e.error}`};this.session.injectAnnounce(r),m.info("ANNOUNCE",`Routed announce from ${e.agentId} \u2192 session`,{status:r.status});}selectWorkerModelByPolicy(e){let t=dd(e.role)??"worker";if(e.explicitModel)return {providerId:e.explicitProviderId??this.resolveProviderForModel(e.explicitModel)??this.config.providerId,model:e.explicitModel,role:t,reason:"explicit_model_requested"};let n=new Set(Array.from(this.modelFailureStreak.entries()).filter(([,o])=>o>=2).map(([o])=>o.toLowerCase())),r=this.modelPolicyRouter.selectModel({task:e.task,role:t,explicitWorkerId:e.workerId,avoidModels:n});return {providerId:r.providerId??this.config.providerId,model:r.model??this.config.modelName,role:r.role,reason:r.reason}}buildWorkerInstructions(e,t,n){let r="";n&&(r=`
|
|
2164
2164
|
|
|
2165
2165
|
## \u5BF9\u8BDD\u80CC\u666F
|
|
2166
2166
|
${n}`);let o=`\u4F60\u662F\u4E00\u4E2A\u81EA\u4E3B\u6267\u884C\u4EFB\u52A1\u7684 Agent\u3002\u4F60\u7684\u5DE5\u4F5C\u76EE\u5F55\u662F: ${this.config.workDir}
|
|
@@ -3428,7 +3428,7 @@ ${h.join(`
|
|
|
3428
3428
|
`)+`
|
|
3429
3429
|
`;await Le__default.appendFile(this.graphPaths.nodes,c,"utf-8");}if(o.length>0){let c=o.map(u=>JSON.stringify(u)).join(`
|
|
3430
3430
|
`)+`
|
|
3431
|
-
`;await Le__default.appendFile(this.graphPaths.edges,c,"utf-8");}}}finally{this.isFlushing=false,this.flushPending&&(this.flushPending=false,await this.flush());}}}async shutdown(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.summarizerTimer&&(clearTimeout(this.summarizerTimer),this.summarizerTimer=null),await this.flush();}async initializeWorkspace(){!this.eventsDir||!this.workspaceId||!this.workspacePath||(await Le__default.mkdir(this.eventsDir,{recursive:true}),this.memoriesDir&&await Le__default.mkdir(this.memoriesDir,{recursive:true}),await this.loadMeta(),await this.loadSummarySnapshot(),this.ensureFlushTimer(),this.ready=true);}ensureFlushTimer(){this.flushTimer||(this.flushTimer=setInterval(()=>{this.flush();},this.options.flushIntervalMs));}async ensureReady(){this.ready||this.initPromise&&await this.initPromise;}async ensureLogFile(){if(!this.eventsDir)return;let e=MB(Date.now());this.currentDate===e&&this.currentFile||(this.currentDate=e,this.currentFile=Ie__default.join(this.eventsDir,`events-${e}.jsonl`),this.currentFileBytes=await this.getFileSize(this.currentFile));}async getFileSize(e){try{return (await Le__default.stat(e)).size}catch{return 0}}updateSummary(e){e.summary&&(this.summaryItems.push({id:e.id,ts:e.ts,type:e.type,summary:e.summary,files:e.files,sessionId:e.sessionId,runId:e.runId}),this.summaryItems.length>this.options.summaryWindow&&this.summaryItems.splice(0,this.summaryItems.length-this.options.summaryWindow),this.summaryDirty=true);}queueMemoryEntries(e,t){if(!e.length)return;let n=e.filter(r=>!this.isLowValueMemorySummary(r.summary));if(n.length!==0){this.memoryQueue.push(...n);for(let r of n)m.info("MEMORY_WRITE","Memory item recorded",{source:t,category:r.category,summary:gn(r.summary,160),runId:r.runId,sessionId:r.sessionId,files:r.files?.slice(0,3),confidence:r.confidence});}}queueGraphEntries(e){e.nodes.length>0&&this.graphNodeQueue.push(...e.nodes),e.edges.length>0&&this.graphEdgeQueue.push(...e.edges);}extractMemoryEntries(e){let t=[],n={ts:e.ts,sessionId:e.sessionId,runId:e.runId,files:e.files,evidence:{eventId:e.id}};if(e.type==="plan_update"&&e.summary&&t.push({schemaVersion:1,id:Nr.randomUUID(),category:"progress",summary:gn(e.summary,al),confidence:.6,...n}),e.type==="tool_call_end"&&e.data?.success===false){let r=e.data?.name??"tool",o=e.data?.outputPreview??e.summary??"Tool failed";this.isLowValueToolFailure(r,String(o))||t.push({schemaVersion:1,id:Nr.randomUUID(),category:"lesson",summary:gn(`Tool failed: ${r} - ${o}`,al),confidence:.45,...n});}if(e.type==="run_error"){let r=e.data?.message??e.summary??"Run error";t.push({schemaVersion:1,id:Nr.randomUUID(),category:"lesson",summary:gn(`Run error: ${r}`,al),confidence:.4,...n});}if(e.type==="status"&&e.summary){let r=this.extractRuleMemory(e.summary);r&&t.push({schemaVersion:1,id:Nr.randomUUID(),category:r.category,summary:gn(r.summary,al),confidence:r.confidence,...n});}return t}extractGraphEntries(e){let t=[],n=[];if(!this.graphPaths||!e.runId)return {nodes:t,edges:n};let r=this.buildGraphNode({id:`task:${e.runId}`,type:"task",label:gn(e.summary??e.data?.prompt??"Task",120),event:e});if(e.type==="run_start"&&t.push(r),e.type==="tool_call_start"){let o=e.data?.name;if(o){let i=this.buildGraphNode({id:`tool:${o}`,type:"tool",label:o,event:e});t.push(i),n.push(this.buildGraphEdge({type:"uses",from:r.id,to:i.id,event:e}));}}if(e.type==="file_change"&&e.files?.length)for(let o of e.files){let i=this.buildGraphNode({id:`file:${o}`,type:"file",label:o,event:e});t.push(i),n.push(this.buildGraphEdge({type:"touches",from:r.id,to:i.id,event:e}));}return {nodes:t,edges:n}}buildGraphNode(e){return {schemaVersion:1,id:e.id,type:e.type,label:e.label,ts:e.event.ts,sessionId:e.event.sessionId,runId:e.event.runId,evidence:{eventId:e.event.id}}}buildGraphEdge(e){return {schemaVersion:1,id:Nr.randomUUID(),type:e.type,from:e.from,to:e.to,ts:e.event.ts,sessionId:e.event.sessionId,runId:e.event.runId,evidence:{eventId:e.event.id}}}extractRuleMemory(e){let t=e.trim();if(!t)return null;let n=t.toLowerCase(),r=/^(pinned|must|requirement|constraint|must:|禁止|必须|约束|不可)/i,o=/^(rule|standard|guideline|should|prefer|规范|约定|标准|建议|应该)/i;return r.test(n)?{category:"pinned",summary:t,confidence:.8}:o.test(n)?{category:"standard",summary:t,confidence:.65}:null}getSummarizerConfig(){let e=He(),t=e.memory??{},n=e.orchestrator?.contextSharing?.summarizerModel,r,o="default";return this.summarizerOverrides?.model?(r=this.summarizerOverrides.model,o="override"):t.summarizerModel?(r=t.summarizerModel,o="memory"):n?(r=n,o="orchestrator"):(r=EB,o="default"),{enabled:(this.summarizerOverrides?.enabled??t.summarizerEnabled??true)&&!!r,model:r??null,providerId:this.summarizerOverrides?.providerId??t.summarizerProviderId,idleDelayMs:this.summarizerOverrides?.idleDelayMs??t.summarizerIdleMs??SB,minIntervalMs:this.summarizerOverrides?.minIntervalMs??t.summarizerMinIntervalMs??kB,batchSize:this.summarizerOverrides?.batchSize??t.summarizerBatchSize??_B,queueSize:this.summarizerOverrides?.queueSize??t.summarizerQueueSize??IB,modelSource:o}}enqueueSummarizer(e){let t=this.getSummarizerConfig();t.enabled&&(this.summarizerQueue.push(e),this.summarizerQueue.length>t.queueSize&&this.summarizerQueue.splice(0,this.summarizerQueue.length-t.queueSize),this.scheduleSummarizer(t));}scheduleSummarizer(e){this.summarizerTimer||(this.summarizerTimer=setTimeout(()=>{this.runSummarizer();},e.idleDelayMs));}async runSummarizer(){this.summarizerTimer&&(clearTimeout(this.summarizerTimer),this.summarizerTimer=null);let e=this.getSummarizerConfig();if(!e.enabled){this.summarizerQueue=[];return}if(this.summarizerRunning){this.scheduleSummarizer(e);return}let t=Date.now(),n=e.minIntervalMs-(t-this.summarizerLastRun);if(n>0){this.summarizerTimer=setTimeout(()=>{this.runSummarizer();},n);return}let r=this.summarizerQueue.splice(0,e.batchSize);if(r.length===0)return;let o=this.resolveSummarizerProvider(e);if(!o){this.summarizerQueue=[],this.summarizerLastRun=t;return}this.summarizerRunning=true;try{let i=await this.summarizeMemoryBatch(o.provider,o.model,r);i.length>0&&(this.queueMemoryEntries(i,"summarizer"),this.flush());}catch(i){console.warn("[ActionLog] Memory summarizer failed:",i);}finally{this.summarizerRunning=false,this.summarizerLastRun=Date.now(),this.summarizerQueue.length>0&&this.scheduleSummarizer(e);}}resolveSummarizerProvider(e){if(!e.model)return null;let t=new
|
|
3431
|
+
`;await Le__default.appendFile(this.graphPaths.edges,c,"utf-8");}}}finally{this.isFlushing=false,this.flushPending&&(this.flushPending=false,await this.flush());}}}async shutdown(){this.flushTimer&&(clearInterval(this.flushTimer),this.flushTimer=null),this.summarizerTimer&&(clearTimeout(this.summarizerTimer),this.summarizerTimer=null),await this.flush();}async initializeWorkspace(){!this.eventsDir||!this.workspaceId||!this.workspacePath||(await Le__default.mkdir(this.eventsDir,{recursive:true}),this.memoriesDir&&await Le__default.mkdir(this.memoriesDir,{recursive:true}),await this.loadMeta(),await this.loadSummarySnapshot(),this.ensureFlushTimer(),this.ready=true);}ensureFlushTimer(){this.flushTimer||(this.flushTimer=setInterval(()=>{this.flush();},this.options.flushIntervalMs));}async ensureReady(){this.ready||this.initPromise&&await this.initPromise;}async ensureLogFile(){if(!this.eventsDir)return;let e=MB(Date.now());this.currentDate===e&&this.currentFile||(this.currentDate=e,this.currentFile=Ie__default.join(this.eventsDir,`events-${e}.jsonl`),this.currentFileBytes=await this.getFileSize(this.currentFile));}async getFileSize(e){try{return (await Le__default.stat(e)).size}catch{return 0}}updateSummary(e){e.summary&&(this.summaryItems.push({id:e.id,ts:e.ts,type:e.type,summary:e.summary,files:e.files,sessionId:e.sessionId,runId:e.runId}),this.summaryItems.length>this.options.summaryWindow&&this.summaryItems.splice(0,this.summaryItems.length-this.options.summaryWindow),this.summaryDirty=true);}queueMemoryEntries(e,t){if(!e.length)return;let n=e.filter(r=>!this.isLowValueMemorySummary(r.summary));if(n.length!==0){this.memoryQueue.push(...n);for(let r of n)m.info("MEMORY_WRITE","Memory item recorded",{source:t,category:r.category,summary:gn(r.summary,160),runId:r.runId,sessionId:r.sessionId,files:r.files?.slice(0,3),confidence:r.confidence});}}queueGraphEntries(e){e.nodes.length>0&&this.graphNodeQueue.push(...e.nodes),e.edges.length>0&&this.graphEdgeQueue.push(...e.edges);}extractMemoryEntries(e){let t=[],n={ts:e.ts,sessionId:e.sessionId,runId:e.runId,files:e.files,evidence:{eventId:e.id}};if(e.type==="plan_update"&&e.summary&&t.push({schemaVersion:1,id:Nr.randomUUID(),category:"progress",summary:gn(e.summary,al),confidence:.6,...n}),e.type==="tool_call_end"&&e.data?.success===false){let r=e.data?.name??"tool",o=e.data?.outputPreview??e.summary??"Tool failed";this.isLowValueToolFailure(r,String(o))||t.push({schemaVersion:1,id:Nr.randomUUID(),category:"lesson",summary:gn(`Tool failed: ${r} - ${o}`,al),confidence:.45,...n});}if(e.type==="run_error"){let r=e.data?.message??e.summary??"Run error";t.push({schemaVersion:1,id:Nr.randomUUID(),category:"lesson",summary:gn(`Run error: ${r}`,al),confidence:.4,...n});}if(e.type==="status"&&e.summary){let r=this.extractRuleMemory(e.summary);r&&t.push({schemaVersion:1,id:Nr.randomUUID(),category:r.category,summary:gn(r.summary,al),confidence:r.confidence,...n});}return t}extractGraphEntries(e){let t=[],n=[];if(!this.graphPaths||!e.runId)return {nodes:t,edges:n};let r=this.buildGraphNode({id:`task:${e.runId}`,type:"task",label:gn(e.summary??e.data?.prompt??"Task",120),event:e});if(e.type==="run_start"&&t.push(r),e.type==="tool_call_start"){let o=e.data?.name;if(o){let i=this.buildGraphNode({id:`tool:${o}`,type:"tool",label:o,event:e});t.push(i),n.push(this.buildGraphEdge({type:"uses",from:r.id,to:i.id,event:e}));}}if(e.type==="file_change"&&e.files?.length)for(let o of e.files){let i=this.buildGraphNode({id:`file:${o}`,type:"file",label:o,event:e});t.push(i),n.push(this.buildGraphEdge({type:"touches",from:r.id,to:i.id,event:e}));}return {nodes:t,edges:n}}buildGraphNode(e){return {schemaVersion:1,id:e.id,type:e.type,label:e.label,ts:e.event.ts,sessionId:e.event.sessionId,runId:e.event.runId,evidence:{eventId:e.event.id}}}buildGraphEdge(e){return {schemaVersion:1,id:Nr.randomUUID(),type:e.type,from:e.from,to:e.to,ts:e.event.ts,sessionId:e.event.sessionId,runId:e.event.runId,evidence:{eventId:e.event.id}}}extractRuleMemory(e){let t=e.trim();if(!t)return null;let n=t.toLowerCase(),r=/^(pinned|must|requirement|constraint|must:|禁止|必须|约束|不可)/i,o=/^(rule|standard|guideline|should|prefer|规范|约定|标准|建议|应该)/i;return r.test(n)?{category:"pinned",summary:t,confidence:.8}:o.test(n)?{category:"standard",summary:t,confidence:.65}:null}getSummarizerConfig(){let e=He(),t=e.memory??{},n=e.orchestrator?.contextSharing?.summarizerModel,r,o="default";return this.summarizerOverrides?.model?(r=this.summarizerOverrides.model,o="override"):t.summarizerModel?(r=t.summarizerModel,o="memory"):n?(r=n,o="orchestrator"):(r=EB,o="default"),{enabled:(this.summarizerOverrides?.enabled??t.summarizerEnabled??true)&&!!r,model:r??null,providerId:this.summarizerOverrides?.providerId??t.summarizerProviderId,idleDelayMs:this.summarizerOverrides?.idleDelayMs??t.summarizerIdleMs??SB,minIntervalMs:this.summarizerOverrides?.minIntervalMs??t.summarizerMinIntervalMs??kB,batchSize:this.summarizerOverrides?.batchSize??t.summarizerBatchSize??_B,queueSize:this.summarizerOverrides?.queueSize??t.summarizerQueueSize??IB,modelSource:o}}enqueueSummarizer(e){let t=this.getSummarizerConfig();t.enabled&&(this.summarizerQueue.push(e),this.summarizerQueue.length>t.queueSize&&this.summarizerQueue.splice(0,this.summarizerQueue.length-t.queueSize),this.scheduleSummarizer(t));}scheduleSummarizer(e){this.summarizerTimer||(this.summarizerTimer=setTimeout(()=>{this.runSummarizer();},e.idleDelayMs));}async runSummarizer(){this.summarizerTimer&&(clearTimeout(this.summarizerTimer),this.summarizerTimer=null);let e=this.getSummarizerConfig();if(!e.enabled){this.summarizerQueue=[];return}if(this.summarizerRunning){this.scheduleSummarizer(e);return}let t=Date.now(),n=e.minIntervalMs-(t-this.summarizerLastRun);if(n>0){this.summarizerTimer=setTimeout(()=>{this.runSummarizer();},n);return}let r=this.summarizerQueue.splice(0,e.batchSize);if(r.length===0)return;let o=this.resolveSummarizerProvider(e);if(!o){this.summarizerQueue=[],this.summarizerLastRun=t;return}this.summarizerRunning=true;try{let i=await this.summarizeMemoryBatch(o.provider,o.model,r);i.length>0&&(this.queueMemoryEntries(i,"summarizer"),this.flush());}catch(i){console.warn("[ActionLog] Memory summarizer failed:",i);}finally{this.summarizerRunning=false,this.summarizerLastRun=Date.now(),this.summarizerQueue.length>0&&this.scheduleSummarizer(e);}}resolveSummarizerProvider(e){if(!e.model)return null;let t=new rt(He()),n=e.providerId?t.getProvider(e.providerId):void 0;if(n||(n=t.getProviders().find(a=>a.models?.some(l=>l.name===e.model))),n||(n=t.getDefaultProvider()),!n||!n.apiKey)return null;let r=n.models?.some(a=>a.name===e.model),o=e.model;if(!r){if(e.modelSource!=="default")return null;o=n.defaultModel||n.lastSelectedModel||n.models?.[0]?.name||e.model;}if(!o)return null;if(this.summarizerProvider&&this.summarizerProviderModel===o)return {provider:this.summarizerProvider,model:o};let{llmProvider:i}=rd({provider:n,model:o});return this.summarizerProvider=i,this.summarizerProviderModel=o,{provider:i,model:o}}async summarizeMemoryBatch(e,t,n){let r=this.buildMemorySummaryPrompt(n),o=[{role:"system",content:"You are a memory summarizer for an autonomous coding agent."},{role:"user",content:r}],a=(await e.chat(o,{model:t,temperature:.2})).choices[0]?.message?.content||"",l=this.parseSummaryItems(a);if(l.length===0)return [];let c=n[n.length-1],u=Date.now();return l.map(d=>({schemaVersion:1,id:Nr.randomUUID(),ts:u,category:d.category,summary:gn(d.summary,al),sessionId:c.sessionId,runId:c.runId,files:d.files&&d.files.length>0?d.files:c.files,confidence:d.confidence,evidence:c.evidence}))}buildMemorySummaryPrompt(e){return `\u8BF7\u4ECE\u4EE5\u4E0B session \u6458\u8981\u4E2D\u63D0\u53D6\u957F\u671F\u53EF\u590D\u7528\u7684\u8BB0\u5FC6\uFF0C\u8F93\u51FA JSON \u6570\u7EC4\uFF08\u53EA\u8F93\u51FA JSON\uFF0C\u4E0D\u8981\u591A\u4F59\u6587\u672C\uFF09\u3002
|
|
3432
3432
|
|
|
3433
3433
|
\u89C4\u5219\uFF1A
|
|
3434
3434
|
1. category \u53EA\u80FD\u662F progress | standard | lesson | pinned
|
|
@@ -3459,7 +3459,7 @@ Stats: +${t.created} ~${t.modified} -${t.deleted} d${t.directories}${n}`}parseCo
|
|
|
3459
3459
|
.cdundo/
|
|
3460
3460
|
`:`# Neox checkpoint directory
|
|
3461
3461
|
.cdundo/
|
|
3462
|
-
`;await Le.writeFile(e,n),m.debug("CHECKPOINT","Added .cdundo to .gitignore");}}catch(t){m.error("CHECKPOINT","Failed to update .gitignore",{error:t});}}async cleanupOldCheckpoints(){try{let e=await this.getCheckpoints(this.config.maxCheckpoints+10);e.length>this.config.maxCheckpoints&&(m.debug("CHECKPOINT",`Cleaning up old checkpoints (${e.length} > ${this.config.maxCheckpoints})`),await this.compressRepository());}catch(e){m.error("CHECKPOINT","Failed to cleanup checkpoints",{error:e});}}async compressRepository(){if(!this.initialized)return {success:false};try{let e=await this.getRepositorySize();m.debug("CHECKPOINT","Compressing repository..."),await this.git.raw(["reflog","expire","--expire=now","--all"]),await this.git.raw(["gc","--aggressive","--prune=now"]),await this.git.raw(["repack","-a","-d","--depth=250","--window=250"]);let t=await this.getRepositorySize(),n=e-t;return m.debug("CHECKPOINT",`Repository compressed: ${this.formatFileSize(e)} \u2192 ${this.formatFileSize(t)} (saved ${this.formatFileSize(n)})`),{success:!0,savedBytes:n}}catch(e){return m.error("CHECKPOINT","Failed to compress repository",{error:e}),{success:false}}}async getRepositorySize(){let e=0,t=async n=>{try{let r=await Le.readdir(n,{withFileTypes:!0});for(let o of r){let i=Ie.join(n,o.name);if(o.isDirectory())await t(i);else if(o.isFile()){let a=await Le.stat(i);e+=a.size;}}}catch{}};return await t(this.shadowGitDir),e}async getStorageStats(){let e=await this.getRepositorySize(),t=0,n=async o=>{try{let i=await Le.readdir(o,{withFileTypes:!0});for(let a of i){let l=Ie.join(o,a.name);if(a.isDirectory()&&a.name!==".git")await n(l);else if(a.isFile()){let c=await Le.stat(l);t+=c.size;}}}catch{}};await n(this.shadowDir);let r=await this.getCheckpoints(1e3);return {repositorySize:e,shadowDirSize:t,checkpointCount:r.length,oldestCheckpoint:r.length>0?{id:r[r.length-1].id,timestamp:r[r.length-1].timestamp}:void 0,newestCheckpoint:r.length>0?{id:r[0].id,timestamp:r[0].timestamp}:void 0}}async cleanStaleLocks(){let e=Ie.join(this.shadowGitDir,"index.lock");try{if(wt.existsSync(e)){let n=await Le.stat(e);Date.now()-n.mtimeMs>1e4&&(await Le.unlink(e),m.debug("CHECKPOINT","Cleaned stale lock file"));}}catch{}}async withGitLock(e){let t=this.gitOperationLock,n=()=>{};this.gitOperationLock=new Promise(r=>{n=r;});try{await t;let r;for(let o=1;o<=this.GIT_RETRY_ATTEMPTS;o++)try{return o>1&&(await this.cleanStaleLocks(),await new Promise(a=>setTimeout(a,this.GIT_RETRY_DELAY_MS))),await e()}catch(i){if(r=i,!(i.message&&(i.message.includes("index.lock")||i.message.includes("File exists")))||o===this.GIT_RETRY_ATTEMPTS)throw i;m.warn("CHECKPOINT",`Git operation failed (attempt ${o}/${this.GIT_RETRY_ATTEMPTS}), retrying...`);}throw r}finally{n();}}async destroy(){await this.stopWatching(),this.initialized=false,this.changeCallbacks.clear(),m.debug("CHECKPOINT","Instance destroyed");}};});var cl,L0=R(()=>{R0();cl=class s{static instance=null;instances=new Map;config;constructor(e={}){this.config=e;}static getInstance(e){return s.instance||(s.instance=new s(e)),s.instance}async getCheckpoint(e){let t=Ie.normalize(e);if(!this.instances.has(t)){let n=new Gd(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 Wd,N0=R(()=>{L0();Wd=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 zd,Hd,$0=R(()=>{ne();zd=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(){}},Hd=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 zd:this.provider=new zd,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 qd(){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 os({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=sd(500),c=new ro({workspacePath:s,source:"server",agentName:"Neox Server"}),u=new Hd(t.tts??{enabled:false});t.tts?.enabled&&(u.setSummarizeFn(async(x,B,H)=>{let W=h;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:"",h=r.getDefaultProvider(),y=h?.id??"",b=h?.defaultModel??h?.models?.[0]?.name??"",C={services:n,permissionManager:i,tools:d,memory:l,workDir:s,providerId:y,modelName:b,resolveProvider:a,systemPrompt:g},T=new Wd;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 ms({...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=h;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 hr({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=h;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 jd,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 h=>{let y=`ch-${h.channelId}-${h.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:h.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},h=>{m.info("SERVER",`Neox Server listening on http://${p}:${h.port}`),process.send&&process.send({type:"ready",port:h.port});});}var Oy,ul,F0=R(()=>{_0();I0();Ny();ne();iu();Za();tl();yf();Ef();Md();Ey();Ay();Tt();cr();Vs();Zh();od();uu();N0();Oc();un();sr();Ca();Dy();Jo();$0();Oy=Ie.join(ho.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=qd();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:
|
|
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 Gd(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 Wd,N0=R(()=>{L0();Wd=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 zd,Hd,$0=R(()=>{ne();zd=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(){}},Hd=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 zd:this.provider=new zd,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 qd(){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 rt(t),o=t.agentApprovalMode||t.approvalMode||"auto",i=new os({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=sd(500),c=new ro({workspacePath:s,source:"server",agentName:"Neox Server"}),u=new Hd(t.tts??{enabled:false});t.tts?.enabled&&(u.setSummarizeFn(async(x,B,H)=>{let W=h;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:"",h=r.getDefaultProvider(),y=h?.id??"",b=h?.defaultModel??h?.models?.[0]?.name??"",C={services:n,permissionManager:i,tools:d,memory:l,workDir:s,providerId:y,modelName:b,resolveProvider:a,systemPrompt:g},T=new Wd;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 ms({...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=h;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 hr({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=h;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 jd,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 h=>{let y=`ch-${h.channelId}-${h.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:h.text}).catch(()=>{b("[error processing message]"),T.close();});})}),await u.startAll(),m.info("SERVER","Channel adapters initialized")),await tt.initialize(e),tt.watch(e),m.info("SERVER",`Skills hot-reload active (${tt.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..."),tt.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},h=>{m.info("SERVER",`Neox Server listening on http://${p}:${h.port}`),process.send&&process.send({type:"ready",port:h.port});});}var Oy,ul,F0=R(()=>{_0();I0();Ny();ne();iu();Za();tl();yf();Ef();Md();Ey();Ay();Tt();cr();Vs();Zh();od();uu();N0();Oc();un();sr();Ca();Dy();Jo();$0();Oy=Ie.join(ho.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=qd();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
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
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(Kd,"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=qd();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=qd();if(!s)return {running:false,logFile:Kd};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:Kd}}function so(){return Kd}var XB,QB,dl,Fy,Kd,Gy=R(()=>{F0();ne();XB=4399,QB=3e3,dl=15e3,Fy=Ie.join(ho.homedir(),".neox"),Kd=Ie.join(Fy,"server.log");});var Jd,Vd,fs,In,Yd,rF,$r,w,Xt=R(()=>{Cu();Jd=ai,Vd=["/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)"},Yd={".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 Xd(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,h)=>h.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=Vd.filter(h=>h.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 h=p();return a.map(y=>`${h}${y}`)}return []}case "/model":{if(i.length===0||i.length===1&&!n)return d("/model",u);let g=i[0],h=i.slice(1);if(!u.includes(g))return d("/model",u);switch(g){case "list":{if(a.length===0)return [];let y=h.length===0?`${t} `:p();return a.map(b=>`${y}${b}`)}case "use":{if(h.length===0)return Array.from(new Set([...a.map(T=>`/model use ${T}`),...l.map(T=>`/model use ${T}`)]));let y=h[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=h.length===1?`${t} `:p();return l.map(T=>`${C}${T}`)}case "remove":case "delete":case "default":{if(l.length===0)return [];let y=h.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=Su(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(`
|
|
3465
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"),h=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(`
|
|
@@ -3641,7 +3641,7 @@ ${t.stderr}
|
|
|
3641
3641
|
|
|
3642
3642
|
`:""}
|
|
3643
3643
|
\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501`,background:false}}function io(s){if(s){if(ab){try{execSync(`taskkill /PID ${s} /T /F`,{stdio:"ignore"});}catch{}return}try{process.kill(-s,"SIGTERM");}catch{try{process.kill(s,"SIGTERM");}catch{}}}}async function pj(s){let{command:e,background:t,workspaceRoot:n}=s;if(Tl=false,t)try{let i=execa(e,{shell:kI,cwd:n,detached:!ab,stdio:["ignore","pipe","pipe"],env:Aa()});yr=i,i.unref();let a=i.pid,l=[],c=8e3;i.stdout?.on("data",g=>{l.push(g.toString());}),i.stderr?.on("data",g=>{l.push(g.toString());});let u=new Promise((g,h)=>{let y=setTimeout(()=>{clearInterval(b),g();},c),b=setInterval(()=>{Tl&&(clearTimeout(y),clearInterval(b),h(new Error("Command interrupted by user")));},50);b.unref?.();});try{await u;}catch{return io(a),ib(n,e)}let d=l.join(""),p=ij(n,e,a,d);return i.on("exit",g=>{yr=null,process.send&&a&&process.send({type:"background_exit",pid:a,exitCode:g??0}),process.exit(0);}),p}catch(i){return aj(n,e,i.message)}let r=1e4,o=12e4;try{let i=execa(e,{shell:kI,cwd:n,reject:!1,env:Aa()});yr=i;let a=i.pid,l=Date.now(),c=[],u=[];i.stdout?.on("data",T=>{c.push(T.toString());}),i.stderr?.on("data",T=>{u.push(T.toString());});let d=i.then(T=>({type:"completed",result:T})),p=new Promise(T=>{setTimeout(()=>{T({type:"early_return"});},r).unref?.();}),g=new Promise(T=>{setTimeout(()=>{T({type:"hard_timeout"});},o).unref?.();}),h=new Promise(T=>{let S=setInterval(()=>{Tl&&(clearInterval(S),T({type:"aborted"}));},100);S.unref?.();}),y=await Promise.race([d,p,h]);if(y.type==="aborted")return a&&io(a),yr=null,ib(n,e);if(y.type==="completed")return yr=null,lj(n,e,y.result.exitCode??0,c.join(""),u.join(""));let b=Math.floor((Date.now()-l)/1e3),C=c.join("")+u.join("");return setImmediate(async()=>{let T=await Promise.race([d,g,h]);if(T.type==="aborted"?a&&io(a):T.type==="hard_timeout"&&a&&io(a),yr=null,process.send&&a){let S=T.type==="completed"?T.result:null;process.send({type:"background_exit",pid:a,exitCode:S?.exitCode??(T.type==="hard_timeout"?-1:0)});}}),uj(n,e,a,b,C)}catch(i){return Tl?(i?.pid&&io(i.pid),ib(n,e)):i?.timedOut?cj(n,e):dj(n,e,i)}}async function mj(){process.env[oj]==="execute_shell"&&(process.on("message",async s=>{if(!(!s||typeof s!="object")){if(s.type==="abort"){Tl=true,yr?.pid&&io(yr.pid);return}if(s.type==="execute_shell")try{let e=await pj(s.payload);process.send&&process.send({type:"result",...e}),e.background||process.exit(0);}catch(e){let t={success:false,output:`execute_shell worker failed: ${e?.message||e}`,background:false};process.send&&process.send({type:"result",...t}),process.exit(1);}}}),process.on("disconnect",()=>{yr?.pid&&io(yr.pid),process.exit(1);}),process.send&&process.send({type:"ready",pid:process.pid}));}var ab,kI,oj,yr,Tl,II=R(()=>{Zg();ab=process.platform==="win32",kI=ab?"powershell.exe":true,oj="NEOX_WORKER",yr=null,Tl=false;});ne();ne();var Ip=class{lastCheck=performance$1.now();interval=null;config;stats={currentDelay:0,averageDelay:0,maxDelay:0,warnCount:0,criticalCount:0};delayHistory=[];maxHistorySize=60;recoveryCallbacks=[];lastRecoveryTime=0;recoveryCooldown=1e4;suspendThreshold=3e4;constructor(e){this.config={checkInterval:e?.checkInterval??1e3,warnThreshold:e?.warnThreshold??5e3,criticalThreshold:e?.criticalThreshold??1e4,autoRecover:e?.autoRecover??true};}start(){if(this.interval){m.warn("EVENT_LOOP","Monitor already started");return}this.lastCheck=performance$1.now(),this.interval=setInterval(()=>{this.check();},this.config.checkInterval),this.interval.unref(),m.info("EVENT_LOOP",`Monitor started (check interval: ${this.config.checkInterval}ms)`);}stop(){this.interval&&(clearInterval(this.interval),this.interval=null,m.info("EVENT_LOOP","Monitor stopped"));}check(){let e=performance$1.now(),t=this.config.checkInterval,r=e-this.lastCheck-t;if(r>this.suspendThreshold){m.info("EVENT_LOOP",`\u{1F6CC} System suspend/resume detected (${Math.round(r/1e3)}s gap), triggering recovery`,{suspendDuration:Math.round(r/1e3)}),this.lastCheck=e,this.delayHistory=[],this.triggerSuspendRecovery();return}this.stats.currentDelay=r,this.delayHistory.push(r),this.delayHistory.length>this.maxHistorySize&&this.delayHistory.shift(),this.stats.averageDelay=this.delayHistory.reduce((o,i)=>o+i,0)/this.delayHistory.length,r>this.stats.maxDelay&&(this.stats.maxDelay=r),r>this.config.criticalThreshold?this.handleCriticalDelay(r):r>this.config.warnThreshold&&this.handleWarning(r),this.lastCheck=e;}handleWarning(e){this.stats.warnCount++,m.warn("EVENT_LOOP",`Event loop delay detected: ${Math.round(e)}ms (expected ~${this.config.checkInterval}ms)`,{currentDelay:Math.round(e),averageDelay:Math.round(this.stats.averageDelay),maxDelay:Math.round(this.stats.maxDelay)});}handleCriticalDelay(e){this.stats.criticalCount++,m.error("EVENT_LOOP",`\u{1F6A8} CRITICAL: Severe event loop delay detected: ${Math.round(e)}ms`,{currentDelay:Math.round(e),averageDelay:Math.round(this.stats.averageDelay),maxDelay:Math.round(this.stats.maxDelay),criticalCount:this.stats.criticalCount}),this.config.autoRecover&&this.triggerRecovery();}triggerRecovery(){let e=Date.now();if(e-this.lastRecoveryTime<this.recoveryCooldown){m.debug("EVENT_LOOP",`Recovery skipped (cooldown: ${Math.round((this.recoveryCooldown-(e-this.lastRecoveryTime))/1e3)}s)`);return}this.lastRecoveryTime=e,m.warn("EVENT_LOOP","\u{1F504} Triggering emergency recovery callbacks");for(let t of this.recoveryCallbacks)try{t(this.getStats());}catch(n){m.error("EVENT_LOOP","Recovery callback failed",{error:n});}global.gc&&(m.debug("EVENT_LOOP","Running forced GC"),global.gc()),this.forceStdinRecovery();}triggerSuspendRecovery(){m.info("EVENT_LOOP","\u{1F504} Triggering suspend recovery");for(let e of this.recoveryCallbacks)try{e(this.getStats());}catch(t){m.error("EVENT_LOOP","Recovery callback failed",{error:t});}this.forceStdinRecovery(),this.lastRecoveryTime=Date.now();}forceStdinRecovery(){try{if(!process.stdin.isTTY){m.warn("EVENT_LOOP","stdin is not a TTY, cannot recover");return}let e=process.stdin.isPaused?.(),t=process.stdin.isRaw;m.info("EVENT_LOOP","Attempting stdin recovery",{wasPaused:e,wasRaw:t,destroyed:process.stdin.destroyed}),e&&(process.stdin.resume(),m.info("EVENT_LOOP","\u2713 stdin resumed")),!process.stdin.destroyed&&!t&&(process.stdin.setRawMode(!0),m.info("EVENT_LOOP","\u2713 raw mode restored")),m.info("EVENT_LOOP","\u2713 stdin recovery completed");}catch(e){m.error("EVENT_LOOP","stdin recovery failed",{error:e});}}onRecovery(e){this.recoveryCallbacks.push(e);}getStats(){return {...this.stats}}resetStats(){this.stats={currentDelay:0,averageDelay:0,maxDelay:0,warnCount:0,criticalCount:0},this.delayHistory=[],m.info("EVENT_LOOP","Statistics reset");}},_p=null;function ZI(s){return _p||(_p=new Ip(s)),_p}function hb(s){let e=ZI(s);return e.start(),e}ne();function eE(){let s={useInputWorker:process.env.NEOX_EXPERIMENTAL_INPUT_WORKER!=="0",useStreamProcessor:process.env.NEOX_EXPERIMENTAL_STREAM_PROCESSOR!=="0",eventLoopMonitoring:process.env.NEOX_EVENT_LOOP_MONITORING!=="0",debug:process.env.CLI_DEBUG==="1"};return s.debug&&m.info("EXPERIMENTAL","Loaded configuration",s),s}var Ep=null;function fb(){return Ep||(Ep=eE()),Ep}var yb=new Map,nE=s=>{if(s.length===0)return {width:0,height:0};let e=yb.get(s);if(e)return e;let t=tE(s),n=s.split(`
|
|
3644
|
-
`).length,r={width:t,height:n};return yb.set(s,r),r},Ap=nE;function Il(s,e,t){if(s.charAt(e)===" ")return e;let n=t?1:-1;for(let r=0;r<=3;r++){let o=e+r*n;if(s.charAt(o)===" ")return o}return e}function Pp(s,e,t={}){let{position:n="end",space:r=false,preferTruncationOnSpace:o=false}=t,{truncationCharacter:i="\u2026"}=t;if(typeof s!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof s}`);if(typeof e!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof e}`);if(e<1)return "";let a=_l(s);if(a<=e)return s;if(e===1)return i;let l={ESC:27,LEFT_BRACKET:91,LETTER_M:109},c=h=>h>=48&&h<=57||h===59;function u(h){let y=0;for(;y+2<h.length&&h.codePointAt(y)===l.ESC&&h.codePointAt(y+1)===l.LEFT_BRACKET;){let b=y+2;for(;b<h.length&&c(h.codePointAt(b));)b++;if(b<h.length&&h.codePointAt(b)===l.LETTER_M){y=b+1;continue}break}return y}function d(h){let y=h.length;for(;y>1&&h.codePointAt(y-1)===l.LETTER_M;){let b=y-2;for(;b>=0&&c(h.codePointAt(b));)b--;if(b>=1&&h.codePointAt(b-1)===l.ESC&&h.codePointAt(b)===l.LEFT_BRACKET){y=b-1;continue}break}return y}function p(h,y){let b=d(h);return b===h.length?h+y:h.slice(0,b)+y+h.slice(b)}function g(h,y){let b=u(y);return b===0?h+y:y.slice(0,b)+h+y.slice(b)}if(n==="start"){if(o){let y=Il(s,a-e+1,true),b=Gr(s,y,a).trim();return g(i,b)}r&&(i+=" ");let h=Gr(s,a-e+_l(i),a);return g(i,h)}if(n==="middle"){r&&(i=` ${i} `);let h=Math.floor(e/2);if(o){let y=Il(s,h),b=Il(s,a-(e-h)+1,true);return Gr(s,0,y)+i+Gr(s,b,a).trim()}return Gr(s,0,h)+i+Gr(s,a-(e-h)+_l(i),a)}if(n==="end"){if(o){let y=Il(s,e-1),b=Gr(s,0,y);return p(b,i)}r&&(i=` ${i}`);let h=Gr(s,0,e-_l(i));return p(h,i)}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${n}`)}var bb={},sE=(s,e,t)=>{let n=s+String(e)+String(t),r=bb[n];if(r)return r;let o=s;if(t==="wrap"&&(o=rE(s,e,{trim:false,hard:true})),t.startsWith("truncate")){let i="end";t==="truncate-middle"&&(i="middle"),t==="truncate-start"&&(i="start"),o=Pp(s,e,{position:i});}return bb[n]=o,o},El=sE;var vb=s=>{let e="";for(let t=0;t<s.childNodes.length;t++){let n=s.childNodes[t];if(n===void 0)continue;let r="";n.nodeName==="#text"?r=n.nodeValue:((n.nodeName==="ink-text"||n.nodeName==="ink-virtual-text")&&(r=vb(n)),r.length>0&&typeof n.internal_transform=="function"&&(r=n.internal_transform(r,t))),e+=r;}return e},Pi=vb;var Al=s=>{let e={nodeName:s,style:{},attributes:{},childNodes:[],parentNode:void 0,yogaNode:s==="ink-virtual-text"?void 0:Re.Node.create(),internal_accessibility:{}};return s==="ink-text"&&e.yogaNode?.setMeasureFunc(iE.bind(null,e)),e},Pl=(s,e)=>{e.parentNode&&Mi(e.parentNode,e),e.parentNode=s,s.childNodes.push(e),e.yogaNode&&s.yogaNode?.insertChild(e.yogaNode,s.yogaNode.getChildCount()),(s.nodeName==="ink-text"||s.nodeName==="ink-virtual-text")&&Ml(s);},Mp=(s,e,t)=>{e.parentNode&&Mi(e.parentNode,e),e.parentNode=s;let n=s.childNodes.indexOf(t);if(n>=0){s.childNodes.splice(n,0,e),e.yogaNode&&s.yogaNode?.insertChild(e.yogaNode,n);return}s.childNodes.push(e),e.yogaNode&&s.yogaNode?.insertChild(e.yogaNode,s.yogaNode.getChildCount()),(s.nodeName==="ink-text"||s.nodeName==="ink-virtual-text")&&Ml(s);},Mi=(s,e)=>{e.yogaNode&&e.parentNode?.yogaNode?.removeChild(e.yogaNode),e.parentNode=void 0;let t=s.childNodes.indexOf(e);t>=0&&s.childNodes.splice(t,1),(s.nodeName==="ink-text"||s.nodeName==="ink-virtual-text")&&Ml(s);},Rp=(s,e,t)=>{if(e==="internal_accessibility"){s.internal_accessibility=t;return}s.attributes[e]=t;},Dp=(s,e)=>{s.style=e;},Cb=s=>{let e={nodeName:"#text",nodeValue:s,yogaNode:void 0,parentNode:void 0,style:{}};return Ri(e,s),e},iE=function(s,e){let t=s.nodeName==="#text"?s.nodeValue:Pi(s),n=Ap(t);if(n.width<=e||n.width>=1&&e>0&&e<1)return n;let r=s.style?.textWrap??"wrap",o=El(t,e,r);return Ap(o)},wb=s=>{if(s?.parentNode)return s.yogaNode??wb(s.parentNode)},Ml=s=>{wb(s)?.markDirty();},Ri=(s,e)=>{typeof e!="string"&&(e=String(e)),s.nodeValue=e,Ml(s);};var lE=(s,e)=>{"position"in e&&s.setPositionType(e.position==="absolute"?Re.POSITION_TYPE_ABSOLUTE:Re.POSITION_TYPE_RELATIVE);},cE=(s,e)=>{"margin"in e&&s.setMargin(Re.EDGE_ALL,e.margin??0),"marginX"in e&&s.setMargin(Re.EDGE_HORIZONTAL,e.marginX??0),"marginY"in e&&s.setMargin(Re.EDGE_VERTICAL,e.marginY??0),"marginLeft"in e&&s.setMargin(Re.EDGE_START,e.marginLeft||0),"marginRight"in e&&s.setMargin(Re.EDGE_END,e.marginRight||0),"marginTop"in e&&s.setMargin(Re.EDGE_TOP,e.marginTop||0),"marginBottom"in e&&s.setMargin(Re.EDGE_BOTTOM,e.marginBottom||0);},uE=(s,e)=>{"padding"in e&&s.setPadding(Re.EDGE_ALL,e.padding??0),"paddingX"in e&&s.setPadding(Re.EDGE_HORIZONTAL,e.paddingX??0),"paddingY"in e&&s.setPadding(Re.EDGE_VERTICAL,e.paddingY??0),"paddingLeft"in e&&s.setPadding(Re.EDGE_LEFT,e.paddingLeft||0),"paddingRight"in e&&s.setPadding(Re.EDGE_RIGHT,e.paddingRight||0),"paddingTop"in e&&s.setPadding(Re.EDGE_TOP,e.paddingTop||0),"paddingBottom"in e&&s.setPadding(Re.EDGE_BOTTOM,e.paddingBottom||0);},dE=(s,e)=>{"flexGrow"in e&&s.setFlexGrow(e.flexGrow??0),"flexShrink"in e&&s.setFlexShrink(typeof e.flexShrink=="number"?e.flexShrink:1),"flexWrap"in e&&(e.flexWrap==="nowrap"&&s.setFlexWrap(Re.WRAP_NO_WRAP),e.flexWrap==="wrap"&&s.setFlexWrap(Re.WRAP_WRAP),e.flexWrap==="wrap-reverse"&&s.setFlexWrap(Re.WRAP_WRAP_REVERSE)),"flexDirection"in e&&(e.flexDirection==="row"&&s.setFlexDirection(Re.FLEX_DIRECTION_ROW),e.flexDirection==="row-reverse"&&s.setFlexDirection(Re.FLEX_DIRECTION_ROW_REVERSE),e.flexDirection==="column"&&s.setFlexDirection(Re.FLEX_DIRECTION_COLUMN),e.flexDirection==="column-reverse"&&s.setFlexDirection(Re.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in e&&(typeof e.flexBasis=="number"?s.setFlexBasis(e.flexBasis):typeof e.flexBasis=="string"?s.setFlexBasisPercent(Number.parseInt(e.flexBasis,10)):s.setFlexBasis(Number.NaN)),"alignItems"in e&&((e.alignItems==="stretch"||!e.alignItems)&&s.setAlignItems(Re.ALIGN_STRETCH),e.alignItems==="flex-start"&&s.setAlignItems(Re.ALIGN_FLEX_START),e.alignItems==="center"&&s.setAlignItems(Re.ALIGN_CENTER),e.alignItems==="flex-end"&&s.setAlignItems(Re.ALIGN_FLEX_END)),"alignSelf"in e&&((e.alignSelf==="auto"||!e.alignSelf)&&s.setAlignSelf(Re.ALIGN_AUTO),e.alignSelf==="flex-start"&&s.setAlignSelf(Re.ALIGN_FLEX_START),e.alignSelf==="center"&&s.setAlignSelf(Re.ALIGN_CENTER),e.alignSelf==="flex-end"&&s.setAlignSelf(Re.ALIGN_FLEX_END)),"justifyContent"in e&&((e.justifyContent==="flex-start"||!e.justifyContent)&&s.setJustifyContent(Re.JUSTIFY_FLEX_START),e.justifyContent==="center"&&s.setJustifyContent(Re.JUSTIFY_CENTER),e.justifyContent==="flex-end"&&s.setJustifyContent(Re.JUSTIFY_FLEX_END),e.justifyContent==="space-between"&&s.setJustifyContent(Re.JUSTIFY_SPACE_BETWEEN),e.justifyContent==="space-around"&&s.setJustifyContent(Re.JUSTIFY_SPACE_AROUND),e.justifyContent==="space-evenly"&&s.setJustifyContent(Re.JUSTIFY_SPACE_EVENLY));},pE=(s,e)=>{"width"in e&&(typeof e.width=="number"?s.setWidth(e.width):typeof e.width=="string"?s.setWidthPercent(Number.parseInt(e.width,10)):s.setWidthAuto()),"height"in e&&(typeof e.height=="number"?s.setHeight(e.height):typeof e.height=="string"?s.setHeightPercent(Number.parseInt(e.height,10)):s.setHeightAuto()),"minWidth"in e&&(typeof e.minWidth=="string"?s.setMinWidthPercent(Number.parseInt(e.minWidth,10)):s.setMinWidth(e.minWidth??0)),"minHeight"in e&&(typeof e.minHeight=="string"?s.setMinHeightPercent(Number.parseInt(e.minHeight,10)):s.setMinHeight(e.minHeight??0));},mE=(s,e)=>{"display"in e&&s.setDisplay(e.display==="flex"?Re.DISPLAY_FLEX:Re.DISPLAY_NONE);},gE=(s,e)=>{if("borderStyle"in e){let t=e.borderStyle?1:0;e.borderTop!==false&&s.setBorder(Re.EDGE_TOP,t),e.borderBottom!==false&&s.setBorder(Re.EDGE_BOTTOM,t),e.borderLeft!==false&&s.setBorder(Re.EDGE_LEFT,t),e.borderRight!==false&&s.setBorder(Re.EDGE_RIGHT,t);}},hE=(s,e)=>{"gap"in e&&s.setGap(Re.GUTTER_ALL,e.gap??0),"columnGap"in e&&s.setGap(Re.GUTTER_COLUMN,e.columnGap??0),"rowGap"in e&&s.setGap(Re.GUTTER_ROW,e.rowGap??0);},fE=(s,e={})=>{lE(s,e),cE(s,e),uE(s,e),dE(s,e),pE(s,e),mE(s,e),gE(s,e),hE(s,e);},Lp=fE;if(
|
|
3644
|
+
`).length,r={width:t,height:n};return yb.set(s,r),r},Ap=nE;function Il(s,e,t){if(s.charAt(e)===" ")return e;let n=t?1:-1;for(let r=0;r<=3;r++){let o=e+r*n;if(s.charAt(o)===" ")return o}return e}function Pp(s,e,t={}){let{position:n="end",space:r=false,preferTruncationOnSpace:o=false}=t,{truncationCharacter:i="\u2026"}=t;if(typeof s!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof s}`);if(typeof e!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof e}`);if(e<1)return "";let a=_l(s);if(a<=e)return s;if(e===1)return i;let l={ESC:27,LEFT_BRACKET:91,LETTER_M:109},c=h=>h>=48&&h<=57||h===59;function u(h){let y=0;for(;y+2<h.length&&h.codePointAt(y)===l.ESC&&h.codePointAt(y+1)===l.LEFT_BRACKET;){let b=y+2;for(;b<h.length&&c(h.codePointAt(b));)b++;if(b<h.length&&h.codePointAt(b)===l.LETTER_M){y=b+1;continue}break}return y}function d(h){let y=h.length;for(;y>1&&h.codePointAt(y-1)===l.LETTER_M;){let b=y-2;for(;b>=0&&c(h.codePointAt(b));)b--;if(b>=1&&h.codePointAt(b-1)===l.ESC&&h.codePointAt(b)===l.LEFT_BRACKET){y=b-1;continue}break}return y}function p(h,y){let b=d(h);return b===h.length?h+y:h.slice(0,b)+y+h.slice(b)}function g(h,y){let b=u(y);return b===0?h+y:y.slice(0,b)+h+y.slice(b)}if(n==="start"){if(o){let y=Il(s,a-e+1,true),b=Gr(s,y,a).trim();return g(i,b)}r&&(i+=" ");let h=Gr(s,a-e+_l(i),a);return g(i,h)}if(n==="middle"){r&&(i=` ${i} `);let h=Math.floor(e/2);if(o){let y=Il(s,h),b=Il(s,a-(e-h)+1,true);return Gr(s,0,y)+i+Gr(s,b,a).trim()}return Gr(s,0,h)+i+Gr(s,a-(e-h)+_l(i),a)}if(n==="end"){if(o){let y=Il(s,e-1),b=Gr(s,0,y);return p(b,i)}r&&(i=` ${i}`);let h=Gr(s,0,e-_l(i));return p(h,i)}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${n}`)}var bb={},sE=(s,e,t)=>{let n=s+String(e)+String(t),r=bb[n];if(r)return r;let o=s;if(t==="wrap"&&(o=rE(s,e,{trim:false,hard:true})),t.startsWith("truncate")){let i="end";t==="truncate-middle"&&(i="middle"),t==="truncate-start"&&(i="start"),o=Pp(s,e,{position:i});}return bb[n]=o,o},El=sE;var vb=s=>{let e="";for(let t=0;t<s.childNodes.length;t++){let n=s.childNodes[t];if(n===void 0)continue;let r="";n.nodeName==="#text"?r=n.nodeValue:((n.nodeName==="ink-text"||n.nodeName==="ink-virtual-text")&&(r=vb(n)),r.length>0&&typeof n.internal_transform=="function"&&(r=n.internal_transform(r,t))),e+=r;}return e},Pi=vb;var Al=s=>{let e={nodeName:s,style:{},attributes:{},childNodes:[],parentNode:void 0,yogaNode:s==="ink-virtual-text"?void 0:Re.Node.create(),internal_accessibility:{}};return s==="ink-text"&&e.yogaNode?.setMeasureFunc(iE.bind(null,e)),e},Pl=(s,e)=>{e.parentNode&&Mi(e.parentNode,e),e.parentNode=s,s.childNodes.push(e),e.yogaNode&&s.yogaNode?.insertChild(e.yogaNode,s.yogaNode.getChildCount()),(s.nodeName==="ink-text"||s.nodeName==="ink-virtual-text")&&Ml(s);},Mp=(s,e,t)=>{e.parentNode&&Mi(e.parentNode,e),e.parentNode=s;let n=s.childNodes.indexOf(t);if(n>=0){s.childNodes.splice(n,0,e),e.yogaNode&&s.yogaNode?.insertChild(e.yogaNode,n);return}s.childNodes.push(e),e.yogaNode&&s.yogaNode?.insertChild(e.yogaNode,s.yogaNode.getChildCount()),(s.nodeName==="ink-text"||s.nodeName==="ink-virtual-text")&&Ml(s);},Mi=(s,e)=>{e.yogaNode&&e.parentNode?.yogaNode?.removeChild(e.yogaNode),e.parentNode=void 0;let t=s.childNodes.indexOf(e);t>=0&&s.childNodes.splice(t,1),(s.nodeName==="ink-text"||s.nodeName==="ink-virtual-text")&&Ml(s);},Rp=(s,e,t)=>{if(e==="internal_accessibility"){s.internal_accessibility=t;return}s.attributes[e]=t;},Dp=(s,e)=>{s.style=e;},Cb=s=>{let e={nodeName:"#text",nodeValue:s,yogaNode:void 0,parentNode:void 0,style:{}};return Ri(e,s),e},iE=function(s,e){let t=s.nodeName==="#text"?s.nodeValue:Pi(s),n=Ap(t);if(n.width<=e||n.width>=1&&e>0&&e<1)return n;let r=s.style?.textWrap??"wrap",o=El(t,e,r);return Ap(o)},wb=s=>{if(s?.parentNode)return s.yogaNode??wb(s.parentNode)},Ml=s=>{wb(s)?.markDirty();},Ri=(s,e)=>{typeof e!="string"&&(e=String(e)),s.nodeValue=e,Ml(s);};var lE=(s,e)=>{"position"in e&&s.setPositionType(e.position==="absolute"?Re.POSITION_TYPE_ABSOLUTE:Re.POSITION_TYPE_RELATIVE);},cE=(s,e)=>{"margin"in e&&s.setMargin(Re.EDGE_ALL,e.margin??0),"marginX"in e&&s.setMargin(Re.EDGE_HORIZONTAL,e.marginX??0),"marginY"in e&&s.setMargin(Re.EDGE_VERTICAL,e.marginY??0),"marginLeft"in e&&s.setMargin(Re.EDGE_START,e.marginLeft||0),"marginRight"in e&&s.setMargin(Re.EDGE_END,e.marginRight||0),"marginTop"in e&&s.setMargin(Re.EDGE_TOP,e.marginTop||0),"marginBottom"in e&&s.setMargin(Re.EDGE_BOTTOM,e.marginBottom||0);},uE=(s,e)=>{"padding"in e&&s.setPadding(Re.EDGE_ALL,e.padding??0),"paddingX"in e&&s.setPadding(Re.EDGE_HORIZONTAL,e.paddingX??0),"paddingY"in e&&s.setPadding(Re.EDGE_VERTICAL,e.paddingY??0),"paddingLeft"in e&&s.setPadding(Re.EDGE_LEFT,e.paddingLeft||0),"paddingRight"in e&&s.setPadding(Re.EDGE_RIGHT,e.paddingRight||0),"paddingTop"in e&&s.setPadding(Re.EDGE_TOP,e.paddingTop||0),"paddingBottom"in e&&s.setPadding(Re.EDGE_BOTTOM,e.paddingBottom||0);},dE=(s,e)=>{"flexGrow"in e&&s.setFlexGrow(e.flexGrow??0),"flexShrink"in e&&s.setFlexShrink(typeof e.flexShrink=="number"?e.flexShrink:1),"flexWrap"in e&&(e.flexWrap==="nowrap"&&s.setFlexWrap(Re.WRAP_NO_WRAP),e.flexWrap==="wrap"&&s.setFlexWrap(Re.WRAP_WRAP),e.flexWrap==="wrap-reverse"&&s.setFlexWrap(Re.WRAP_WRAP_REVERSE)),"flexDirection"in e&&(e.flexDirection==="row"&&s.setFlexDirection(Re.FLEX_DIRECTION_ROW),e.flexDirection==="row-reverse"&&s.setFlexDirection(Re.FLEX_DIRECTION_ROW_REVERSE),e.flexDirection==="column"&&s.setFlexDirection(Re.FLEX_DIRECTION_COLUMN),e.flexDirection==="column-reverse"&&s.setFlexDirection(Re.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in e&&(typeof e.flexBasis=="number"?s.setFlexBasis(e.flexBasis):typeof e.flexBasis=="string"?s.setFlexBasisPercent(Number.parseInt(e.flexBasis,10)):s.setFlexBasis(Number.NaN)),"alignItems"in e&&((e.alignItems==="stretch"||!e.alignItems)&&s.setAlignItems(Re.ALIGN_STRETCH),e.alignItems==="flex-start"&&s.setAlignItems(Re.ALIGN_FLEX_START),e.alignItems==="center"&&s.setAlignItems(Re.ALIGN_CENTER),e.alignItems==="flex-end"&&s.setAlignItems(Re.ALIGN_FLEX_END)),"alignSelf"in e&&((e.alignSelf==="auto"||!e.alignSelf)&&s.setAlignSelf(Re.ALIGN_AUTO),e.alignSelf==="flex-start"&&s.setAlignSelf(Re.ALIGN_FLEX_START),e.alignSelf==="center"&&s.setAlignSelf(Re.ALIGN_CENTER),e.alignSelf==="flex-end"&&s.setAlignSelf(Re.ALIGN_FLEX_END)),"justifyContent"in e&&((e.justifyContent==="flex-start"||!e.justifyContent)&&s.setJustifyContent(Re.JUSTIFY_FLEX_START),e.justifyContent==="center"&&s.setJustifyContent(Re.JUSTIFY_CENTER),e.justifyContent==="flex-end"&&s.setJustifyContent(Re.JUSTIFY_FLEX_END),e.justifyContent==="space-between"&&s.setJustifyContent(Re.JUSTIFY_SPACE_BETWEEN),e.justifyContent==="space-around"&&s.setJustifyContent(Re.JUSTIFY_SPACE_AROUND),e.justifyContent==="space-evenly"&&s.setJustifyContent(Re.JUSTIFY_SPACE_EVENLY));},pE=(s,e)=>{"width"in e&&(typeof e.width=="number"?s.setWidth(e.width):typeof e.width=="string"?s.setWidthPercent(Number.parseInt(e.width,10)):s.setWidthAuto()),"height"in e&&(typeof e.height=="number"?s.setHeight(e.height):typeof e.height=="string"?s.setHeightPercent(Number.parseInt(e.height,10)):s.setHeightAuto()),"minWidth"in e&&(typeof e.minWidth=="string"?s.setMinWidthPercent(Number.parseInt(e.minWidth,10)):s.setMinWidth(e.minWidth??0)),"minHeight"in e&&(typeof e.minHeight=="string"?s.setMinHeightPercent(Number.parseInt(e.minHeight,10)):s.setMinHeight(e.minHeight??0));},mE=(s,e)=>{"display"in e&&s.setDisplay(e.display==="flex"?Re.DISPLAY_FLEX:Re.DISPLAY_NONE);},gE=(s,e)=>{if("borderStyle"in e){let t=e.borderStyle?1:0;e.borderTop!==false&&s.setBorder(Re.EDGE_TOP,t),e.borderBottom!==false&&s.setBorder(Re.EDGE_BOTTOM,t),e.borderLeft!==false&&s.setBorder(Re.EDGE_LEFT,t),e.borderRight!==false&&s.setBorder(Re.EDGE_RIGHT,t);}},hE=(s,e)=>{"gap"in e&&s.setGap(Re.GUTTER_ALL,e.gap??0),"columnGap"in e&&s.setGap(Re.GUTTER_COLUMN,e.columnGap??0),"rowGap"in e&&s.setGap(Re.GUTTER_ROW,e.rowGap??0);},fE=(s,e={})=>{lE(s,e),cE(s,e),uE(s,e),dE(s,e),pE(s,e),mE(s,e),gE(s,e),hE(s,e);},Lp=fE;if(Ye.env.DEV==="true")try{await Promise.resolve().then(()=>(xb(),Tb));}catch(s){if(s.code==="ERR_MODULE_NOT_FOUND")console.warn(`
|
|
3645
3645
|
The environment variable DEV is set to true, so Ink tried to import \`react-devtools-core\`,
|
|
3646
3646
|
but this failed as it was not installed. Debugging with React Devtools requires it.
|
|
3647
3647
|
|
|
@@ -3649,9 +3649,9 @@ To install use this command:
|
|
|
3649
3649
|
|
|
3650
3650
|
$ npm install --save-dev react-devtools-core
|
|
3651
3651
|
`.trim()+`
|
|
3652
|
-
`);else throw s}var kb=(s,e)=>{if(s===e)return;if(!s)return e;let t={},n=false;for(let r of Object.keys(s))(!e||!Object.hasOwn(e,r))&&(t[r]=void 0,n=true);if(e)for(let r of Object.keys(e))e[r]!==s[r]&&(t[r]=e[r],n=true);return n?t:void 0},_b=s=>{s?.unsetMeasureFunc(),s?.freeRecursive();},Rl=NoEventPriority,Np,Yn=bE({getRootHostContext:()=>({isInsideText:false}),prepareForCommit:()=>null,preparePortalMount:()=>null,clearContainer:()=>false,resetAfterCommit(s){if(
|
|
3653
|
-
`),typeof s.onComputeLayout=="function"&&s.onComputeLayout(),s.isStaticDirty){s.isStaticDirty=false,typeof s.onImmediateRender=="function"&&(
|
|
3654
|
-
`),s.onImmediateRender());return}typeof s.onRender=="function"&&(
|
|
3652
|
+
`);else throw s}var kb=(s,e)=>{if(s===e)return;if(!s)return e;let t={},n=false;for(let r of Object.keys(s))(!e||!Object.hasOwn(e,r))&&(t[r]=void 0,n=true);if(e)for(let r of Object.keys(e))e[r]!==s[r]&&(t[r]=e[r],n=true);return n?t:void 0},_b=s=>{s?.unsetMeasureFunc(),s?.freeRecursive();},Rl=NoEventPriority,Np,Yn=bE({getRootHostContext:()=>({isInsideText:false}),prepareForCommit:()=>null,preparePortalMount:()=>null,clearContainer:()=>false,resetAfterCommit(s){if(Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[RECONCILER] \u{1F504} Commit completed, triggering render
|
|
3653
|
+
`),typeof s.onComputeLayout=="function"&&s.onComputeLayout(),s.isStaticDirty){s.isStaticDirty=false,typeof s.onImmediateRender=="function"&&(Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[RECONCILER] \u{1F3C3} Static dirty, calling onImmediateRender
|
|
3654
|
+
`),s.onImmediateRender());return}typeof s.onRender=="function"&&(Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[RECONCILER] \u{1F3A8} Calling onRender
|
|
3655
3655
|
`),s.onRender());},getChildHostContext(s,e){let t=s.isInsideText,n=e==="ink-text"||e==="ink-virtual-text";return t===n?s:{isInsideText:n}},shouldSetTextContent:()=>false,createInstance(s,e,t,n){if(n.isInsideText&&s==="ink-box")throw new Error("<Box> can\u2019t be nested inside <Text> component");let r=s==="ink-text"&&n.isInsideText?"ink-virtual-text":s,o=Al(r);for(let[i,a]of Object.entries(e))if(i!=="children"){if(i==="style"){Dp(o,a),o.yogaNode&&Lp(o.yogaNode,a);continue}if(i==="internal_transform"){o.internal_transform=a;continue}if(i==="internal_static"){Np=t,o.internal_static=true,t.isStaticDirty=true,t.staticNode=o;continue}Rp(o,i,a);}return o},createTextInstance(s,e,t){if(!t.isInsideText)throw new Error(`Text string "${s}" must be rendered inside <Text> component`);return Cb(s)},resetTextContent(){},hideTextInstance(s){Ri(s,"");},unhideTextInstance(s,e){Ri(s,e);},getPublicInstance:s=>s,hideInstance(s){s.yogaNode?.setDisplay(Re.DISPLAY_NONE);},unhideInstance(s){s.yogaNode?.setDisplay(Re.DISPLAY_FLEX);},appendInitialChild:Pl,appendChild:Pl,insertBefore:Mp,finalizeInitialChildren(){return false},isPrimaryRenderer:true,supportsMutation:true,supportsPersistence:false,supportsHydration:false,scheduleTimeout:setTimeout,cancelTimeout:clearTimeout,noTimeout:-1,beforeActiveInstanceBlur(){},afterActiveInstanceBlur(){},detachDeletedInstance(){},getInstanceFromNode:()=>null,prepareScopeUpdate(){},getInstanceFromScope:()=>null,appendChildToContainer:Pl,insertInContainerBefore:Mp,removeChildFromContainer(s,e){Mi(s,e),_b(e.yogaNode);},commitUpdate(s,e,t,n){Np&&s.internal_static&&(Np.isStaticDirty=true);let r=kb(t,n),o=kb(t.style,n.style);if(!(!r&&!o)){if(r)for(let[i,a]of Object.entries(r)){if(i==="style"){Dp(s,a);continue}if(i==="internal_transform"){s.internal_transform=a;continue}if(i==="internal_static"){s.internal_static=true;continue}Rp(s,i,a);}o&&s.yogaNode&&Lp(s.yogaNode,o);}},commitTextUpdate(s,e,t){Ri(s,t);},removeChild(s,e){Mi(s,e),_b(e.yogaNode);},setCurrentUpdatePriority(s){Rl=s;},getCurrentUpdatePriority:()=>Rl,resolveUpdatePriority(){return Rl!==NoEventPriority?Rl:DefaultEventPriority},maySuspendCommit(){return false},NotPendingTransition:void 0,HostTransitionContext:createContext(null),resetFormInstance(){},requestPostPaintCallback(){},shouldAttemptEagerTransition(){return false},trackSchedulerEvent(){},resolveEventType(){return null},resolveEventTimeStamp(){return -1.1},preloadInstance(){return true},startSuspendingCommit(){},suspendInstance(){},waitForCommitToBeReady(){return null}});function $p(s,e=1,t={}){let{indent:n=" ",includeEmptyLines:r=false}=t;if(typeof s!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof s}\``);if(typeof e!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof e}\``);if(e<0)throw new RangeError(`Expected \`count\` to be at least 0, got \`${e}\``);if(typeof n!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof n}\``);if(e===0)return s;let o=r?/^/gm:/^(?!\s*$)/gm;return s.replace(o,n.repeat(e))}var wE=s=>s.getComputedWidth()-s.getComputedPadding(Re.EDGE_LEFT)-s.getComputedPadding(Re.EDGE_RIGHT)-s.getComputedBorder(Re.EDGE_LEFT)-s.getComputedBorder(Re.EDGE_RIGHT),Eb=wE;var Rb=pb(Mb());var xE=/^rgb\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,SE=/^ansi256\(\s?(\d+)\s?\)$/,kE=s=>s in Oe,_E=(s,e,t)=>{if(!e)return s;if(kE(e)){if(t==="foreground")return Oe[e](s);let n=`bg${e[0].toUpperCase()+e.slice(1)}`;return Oe[n](s)}if(e.startsWith("#"))return t==="foreground"?Oe.hex(e)(s):Oe.bgHex(e)(s);if(e.startsWith("ansi256")){let n=SE.exec(e);if(!n)return s;let r=Number(n[1]);return t==="foreground"?Oe.ansi256(r)(s):Oe.bgAnsi256(r)(s)}if(e.startsWith("rgb")){let n=xE.exec(e);if(!n)return s;let r=Number(n[1]),o=Number(n[2]),i=Number(n[3]);return t==="foreground"?Oe.rgb(r,o,i)(s):Oe.bgRgb(r,o,i)(s)}return s},Xn=_E;var IE=(s,e,t,n)=>{if(t.style.borderStyle){let r=t.yogaNode.getComputedWidth(),o=t.yogaNode.getComputedHeight(),i=typeof t.style.borderStyle=="string"?Rb.default[t.style.borderStyle]:t.style.borderStyle,a=t.style.borderTopColor??t.style.borderColor,l=t.style.borderBottomColor??t.style.borderColor,c=t.style.borderLeftColor??t.style.borderColor,u=t.style.borderRightColor??t.style.borderColor,d=t.style.borderTopDimColor??t.style.borderDimColor,p=t.style.borderBottomDimColor??t.style.borderDimColor,g=t.style.borderLeftDimColor??t.style.borderDimColor,h=t.style.borderRightDimColor??t.style.borderDimColor,y=t.style.borderTop!==false,b=t.style.borderBottom!==false,C=t.style.borderLeft!==false,T=t.style.borderRight!==false,S=r-(C?1:0)-(T?1:0),E=y?Xn((C?i.topLeft:"")+i.top.repeat(S)+(T?i.topRight:""),a,"foreground"):void 0;y&&d&&(E=Oe.dim(E));let v=o;y&&(v-=1),b&&(v-=1);let I=(Xn(i.left,c,"foreground")+`
|
|
3656
3656
|
`).repeat(v);g&&(I=Oe.dim(I));let D=(Xn(i.right,u,"foreground")+`
|
|
3657
3657
|
`).repeat(v);h&&(D=Oe.dim(D));let O=b?Xn((C?i.bottomLeft:"")+i.bottom.repeat(S)+(T?i.bottomRight:""),l,"foreground"):void 0;b&&p&&(O=Oe.dim(O));let k=y?1:0;E&&n.write(s,e,E,{transformers:[]}),C&&n.write(s,e+k,I,{transformers:[]}),T&&n.write(s+r-1,e+k,D,{transformers:[]}),O&&n.write(s,e+o-1,O,{transformers:[]});}},Db=IE;var EE=(s,e,t,n)=>{if(!t.style.backgroundColor)return;let r=t.yogaNode.getComputedWidth(),o=t.yogaNode.getComputedHeight(),i=t.style.borderStyle&&t.style.borderLeft!==false?1:0,a=t.style.borderStyle&&t.style.borderRight!==false?1:0,l=t.style.borderStyle&&t.style.borderTop!==false?1:0,c=t.style.borderStyle&&t.style.borderBottom!==false?1:0,u=r-i-a,d=o-l-c;if(!(u>0&&d>0))return;let p=Xn(" ".repeat(u),t.style.backgroundColor,"background");for(let g=0;g<d;g++)n.write(s+i,e+l+g,p,{transformers:[]});},Lb=EE;var PE=(s,e)=>{let t=s.childNodes[0]?.yogaNode;if(t){let n=t.getComputedLeft(),r=t.getComputedTop();e=`
|
|
@@ -3661,14 +3661,14 @@ $ npm install --save-dev react-devtools-core
|
|
|
3661
3661
|
`),height:e.length}}};var $E=(s,e)=>{if(s.yogaNode){if(e){let i=Nl(s,{skipStaticElements:true}),a=i===""?0:i.split(`
|
|
3662
3662
|
`).length,l="";return s.staticNode&&(l=Nl(s.staticNode,{skipStaticElements:false})),{output:i,outputHeight:a,staticOutput:l?`${l}
|
|
3663
3663
|
`:""}}let t=new co({width:s.yogaNode.getComputedWidth(),height:s.yogaNode.getComputedHeight()});Bp(s,t,{skipStaticElements:true});let n;if(s.staticNode?.yogaNode&&s.staticNode.childNodes&&s.staticNode.childNodes.length>0){let a=s.staticNode.yogaNode.getComputedWidth(),l=s.staticNode.yogaNode.getComputedHeight();n=new co({width:a,height:l}),Bp(s.staticNode,n,{skipStaticElements:false});}let{output:r,height:o}=t.get();return {output:r,outputHeight:o,staticOutput:n?`${n.get().output}
|
|
3664
|
-
`:""}}return {output:"",outputHeight:0,staticOutput:""}},Ob=$E;var OE=new WeakMap,uo=OE;var Bb=createContext({exit(){}});Bb.displayName="InternalAppContext";var $l=Bb;var Fb=createContext({stdin:
|
|
3665
|
-
`);}clearScreen(){this.write(
|
|
3664
|
+
`:""}}return {output:"",outputHeight:0,staticOutput:""}},Ob=$E;var OE=new WeakMap,uo=OE;var Bb=createContext({exit(){}});Bb.displayName="InternalAppContext";var $l=Bb;var Fb=createContext({stdin:Ye.stdin,internal_eventEmitter:new EventEmitter,setRawMode(){},isRawModeSupported:false,internal_exitOnCtrlC:true});Fb.displayName="InternalStdinContext";var po=Fb;var Ub=createContext({stdout:Ye.stdout,write(){},columns:Ye.stdout.columns||80,rows:Ye.stdout.rows||24});Ub.displayName="InternalStdoutContext";var Di=Ub;var jb=createContext({stderr:Ye.stderr,write(){}});jb.displayName="InternalStderrContext";var Up=jb;var Gb=createContext({activeId:void 0,add(){},remove(){},activate(){},deactivate(){},enableFocus(){},disableFocus(){},focusNext(){},focusPrevious(){},focus(){}});Gb.displayName="InternalFocusContext";var Ol=Gb;ne();var nt={CURSOR_HIDE:"\x1B[?25l",CURSOR_SHOW:"\x1B[?25h",CURSOR_SAVE:"\x1B[s",CURSOR_RESTORE:"\x1B[u",CURSOR_HOME:"\x1B[H",cursorTo:(s,e)=>e!==void 0?`\x1B[${e+1};${s+1}H`:`\x1B[${s+1}G`,cursorMove:(s,e)=>{let t="";return e<0&&(t+=`\x1B[${-e}A`),e>0&&(t+=`\x1B[${e}B`),s>0&&(t+=`\x1B[${s}C`),s<0&&(t+=`\x1B[${-s}D`),t},cursorUp:(s=1)=>`\x1B[${s}A`,cursorDown:(s=1)=>`\x1B[${s}B`,cursorForward:(s=1)=>`\x1B[${s}C`,cursorBack:(s=1)=>`\x1B[${s}D`,ERASE_LINE:"\x1B[2K",ERASE_LINE_END:"\x1B[K",ERASE_LINE_START:"\x1B[1K",ERASE_SCREEN:"\x1B[2J",ERASE_SCREEN_DOWN:"\x1B[J",ERASE_SCREEN_UP:"\x1B[1J",eraseLines:s=>{if(s<=0)return "";let e="";return s>1&&(e+=`\x1B[${s-1}A`),e+="\r",e+="\x1B[J",e},scrollUp:(s=1)=>`\x1B[${s}S`,scrollDown:(s=1)=>`\x1B[${s}T`,ALT_SCREEN_ENTER:"\x1B[?1049h",ALT_SCREEN_LEAVE:"\x1B[?1049l",ALT_SCROLL_ENABLE:"\x1B[?1007h",ALT_SCROLL_DISABLE:"\x1B[?1007l",SYNC_START:"\x1B[?2026h",SYNC_END:"\x1B[?2026l",BRACKETED_PASTE_ENABLE:"\x1B[?2004h",BRACKETED_PASTE_DISABLE:"\x1B[?2004l",MOUSE_ENABLE:"\x1B[?1000h\x1B[?1002h\x1B[?1015h\x1B[?1006h",MOUSE_DISABLE:"\x1B[?1006l\x1B[?1015l\x1B[?1002l\x1B[?1000l",QUERY_SIZE:"\x1B[18t",QUERY_CURSOR_POS:"\x1B[6n",RESET:"\x1Bc",SOFT_RESET:"\x1B[!p"};function Wb(){return process.platform==="win32"?"win32":process.platform==="darwin"?"darwin":process.platform==="linux"&&!!(process.env.WSL_DISTRO_NAME||process.env.WSLENV||process.env.WSL_INTEROP)?"wsl":"linux"}function zb(s){let e=s.TERM||"",t=s.TERM_PROGRAM||"",n=s.WT_SESSION,r=s.ConEmuANSI;return n?"windows-terminal":t==="vscode"||s.VSCODE_INJECTION?"vscode":t==="iTerm.app"||s.ITERM_SESSION_ID?"iterm":t==="Hyper"?"hyper":t==="Apple_Terminal"?"terminal-app":s.ALACRITTY_WINDOW_ID||e==="alacritty"?"alacritty":s.KITTY_WINDOW_ID||e==="xterm-kitty"?"kitty":s.WEZTERM_PANE?"wezterm":s.KONSOLE_VERSION?"konsole":s.GNOME_TERMINAL_SCREEN||s.VTE_VERSION?"gnome-terminal":s.MSYSTEM||e==="cygwin"?"mintty":r==="ON"||process.platform==="win32"?"conpty":Wb()==="wsl"?"wsl":e.includes("xterm")||e.includes("256color")?"xterm":"unknown"}function KE(){return zb(process.env)}function mo(s=process.env){let e=zb(s);return !!(s.SSH_CONNECTION||s.SSH_CLIENT||s.SSH_TTY)&&e!=="terminal-app"}function JE(s,e,t){let n=process.env,r=s.isTTY??false,o=!!(n.CI||n.CONTINUOUS_INTEGRATION||n.GITHUB_ACTIONS),i=n.COLORTERM||"",a=n.TERM||"",l=!!(i==="truecolor"||i==="24bit"||a.includes("truecolor")||a.includes("24bit")||["iterm","vscode","windows-terminal","alacritty","kitty","wezterm","hyper"].includes(e)),c=l||!!(a.includes("256color")||i||["xterm","gnome-terminal","konsole","mintty","conpty"].includes(e)),u=r&&!o&&!["terminal-app","mintty"].includes(e),d=r&&!o,p=r&&!o&&e!=="unknown",g=!!(n.LANG?.includes("UTF-8")||n.LC_ALL?.includes("UTF-8")||t==="darwin"||["iterm","vscode","windows-terminal","alacritty","kitty","wezterm"].includes(e));return {color256:c,trueColor:l,synchronizedUpdate:u,alternateScreen:d,bracketedPaste:p,mouse:r&&!o,unicode:g,terminalType:e,isCI:o,isTTY:r}}var Bl=class extends EventEmitter{stdout;stdin;options;platform;terminalType;capabilities;_size;_inAltScreen=false;_inSyncUpdate=false;_resizePollTimer=null;_destroyed=false;constructor(e){super(),this.stdout=e.stdout,this.stdin=e.stdin,this.options=e,this.platform=Wb(),this.terminalType=KE(),this.capabilities=JE(this.stdout,this.terminalType,this.platform),e.forceDisable?.synchronizedUpdate&&(this.capabilities.synchronizedUpdate=false),e.forceDisable?.alternateScreen&&(this.capabilities.alternateScreen=false),e.forceDisable?.color&&(this.capabilities.color256=false,this.capabilities.trueColor=false),this._size=this.querySize(),this.setupResizeListener();}get size(){return {...this._size}}get columns(){return this._size.columns}get rows(){return this._size.rows}querySize(){return {columns:this.stdout.columns||80,rows:this.stdout.rows||24}}setupResizeListener(){let e=()=>{let n=this.querySize();if(n.columns!==this._size.columns||n.rows!==this._size.rows){let r=this._size;this._size=n,this.emit("resize",n,r);}};this.stdout.on("resize",e),process.platform!=="win32"&&process.on("SIGWINCH",e);let t=this.options.resizePollInterval??(this.platform==="win32"||this.platform==="wsl"?500:0);t>0&&(this._resizePollTimer=setInterval(e,t));}write(e){this._destroyed||this.stdout.write(e);}writeLine(e){this.write(e+`
|
|
3665
|
+
`);}clearScreen(){this.write(nt.ERASE_SCREEN+nt.CURSOR_HOME);}clearScreenDown(){this.write(nt.ERASE_SCREEN_DOWN);}clearLine(){this.write(nt.ERASE_LINE+"\r");}clearLines(e){e<=0||this.write(nt.eraseLines(e));}moveCursor(e,t){this.write(nt.cursorTo(e,t));}moveCursorBy(e,t){this.write(nt.cursorMove(e,t));}hideCursor(){this.write(nt.CURSOR_HIDE);}showCursor(){this.write(nt.CURSOR_SHOW);}saveCursor(){this.write(nt.CURSOR_SAVE);}restoreCursor(){this.write(nt.CURSOR_RESTORE);}beginSyncUpdate(){this.capabilities.synchronizedUpdate&&!this._inSyncUpdate&&(this.write(nt.SYNC_START),this._inSyncUpdate=true);}endSyncUpdate(){this._inSyncUpdate&&(this.write(nt.SYNC_END),this._inSyncUpdate=false);}syncUpdate(e){this.beginSyncUpdate();try{e();}finally{this.endSyncUpdate();}}async syncUpdateAsync(e){this.beginSyncUpdate();try{await e();}finally{this.endSyncUpdate();}}get inAltScreen(){return this._inAltScreen}enterAltScreen(){this.capabilities.alternateScreen&&!this._inAltScreen&&(this.write(nt.ALT_SCREEN_ENTER),this.write(nt.ALT_SCROLL_ENABLE),this._inAltScreen=true,this.emit("altscreen",true));}leaveAltScreen(){this._inAltScreen&&(this.write(nt.ALT_SCROLL_DISABLE),this.write(nt.ALT_SCREEN_LEAVE),this._inAltScreen=false,this.emit("altscreen",false));}withAltScreen(e){let t=this._inAltScreen;t||this.enterAltScreen();try{return e()}finally{t||this.leaveAltScreen();}}async withAltScreenAsync(e){let t=this._inAltScreen;t||this.enterAltScreen();try{return await e()}finally{t||this.leaveAltScreen();}}enableBracketedPaste(){this.capabilities.bracketedPaste&&this.write(nt.BRACKETED_PASTE_ENABLE);}disableBracketedPaste(){this.capabilities.bracketedPaste&&this.write(nt.BRACKETED_PASTE_DISABLE);}enableMouse(){this.capabilities.mouse&&this.write(nt.MOUSE_ENABLE);}disableMouse(){this.capabilities.mouse&&this.write(nt.MOUSE_DISABLE);}reset(){this._inSyncUpdate&&this.endSyncUpdate(),this._inAltScreen&&this.leaveAltScreen(),this.showCursor(),this.disableBracketedPaste(),this.disableMouse();}destroy(){this._destroyed||(this._destroyed=true,this._resizePollTimer&&(clearInterval(this._resizePollTimer),this._resizePollTimer=null),this.reset(),this.removeAllListeners());}},jp=null;function Wr(s){return jp||(jp=new Bl({stdout:process.stdout,stdin:process.stdin,...s})),jp}var Ul=class{stdin;stdinListener=null;healthCheckInterval=null;rawModeForcedAt=0;aggressiveCompat=mo();mouseWheelCallback=null;constructor(e){this.stdin=e;}setMouseWheelCallback(e){this.mouseWheelCallback=e,de("INPUT_MANAGER",`\u{1F5B1}\uFE0F Mouse wheel callback ${e?"set":"cleared"}`);}enablePermanent(e){this.stdinListener=e;try{this.stdin.setRawMode(!0),this.stdin.setEncoding("utf8");}catch(t){throw de("INPUT_MANAGER",`\u274C setRawMode failed: ${t}`),t}this.stdin.on("data",this.handleStdinData),this.stdin.isPaused?.()&&(this.stdin.resume(),de("INPUT_MANAGER","\u{1F504} Stdin was paused, resumed")),this.healthCheckInterval=setInterval(()=>{this.stdin.isPaused?.()&&(de("INPUT_MANAGER","\u26A0\uFE0F Stdin was paused, resuming..."),this.stdin.resume());let t=this.stdin.isRaw;if(this.aggressiveCompat&&t===false)try{this.stdin.setRawMode(!0),this.stdin.setEncoding("utf8"),this.stdin.resume();let n=Date.now();n-this.rawModeForcedAt>1e3&&(de("INPUT_MANAGER","\u26A0\uFE0F Raw mode lost, force-restored"),this.rawModeForcedAt=n);}catch(n){de("INPUT_MANAGER",`\u274C force setRawMode(true) failed: ${n}`);}},100),de("INPUT_MANAGER","\u2705 Enabled permanently");}disable(){this.healthCheckInterval&&(clearInterval(this.healthCheckInterval),this.healthCheckInterval=null),this.stdin.off("data",this.handleStdinData);try{this.stdin.setRawMode(!1);}catch(e){de("INPUT_MANAGER",`\u274C setRawMode(false) failed: ${e}`);}this.stdinListener=null,de("INPUT_MANAGER","\u{1F53B} Disabled");}handleStdinData=e=>{let t=e.toString();if(t.includes("\x1B[<")){let n=/\x1b\[<(\d+);(\d+);(\d+)([Mm])/g,r,o=t;for(;(r=n.exec(t))!==null;){let i=parseInt(r[1],10);r[4]==="M"&&this.mouseWheelCallback&&(i===64?this.mouseWheelCallback("up"):i===65&&this.mouseWheelCallback("down")),o=o.replace(r[0],"");}if(o.trim()==="")return;if(o.length>0){this.stdinListener?.(o);return}}this.stdinListener?.(t);}},Fl=null;function xs(s){if(!Fl&&s&&(Fl=new Ul(s)),!Fl)throw new Error("InputManager not initialized");return Fl}var jl=class{pendingRequests=new Map;frameScheduled=false;lastFrameTime=0;targetFPS=60;frameInterval=1e3/this.targetFPS;stats={totalFrames:0,droppedRequests:0,averageFrameTime:0};scheduleFrame(e,t,n=2){let r=Date.now();if(n===0){process.env.FRAME_SCHEDULER_DEBUG==="1"&&process.stderr.write(`[FRAME_SCHEDULER] \u26A1 IMMEDIATE render, executing now
|
|
3666
3666
|
`),this.flushFrame([{id:e,priority:n,callback:t,timestamp:r}]);return}let o=this.pendingRequests.get(e);if(o){n<o.priority?this.pendingRequests.set(e,{id:e,priority:n,callback:t,timestamp:r}):this.stats.droppedRequests++;return}this.pendingRequests.set(e,{id:e,priority:n,callback:t,timestamp:r}),this.frameScheduled||this.scheduleNextFrame();}scheduleNextFrame(){this.frameScheduled=true;let t=Date.now()-this.lastFrameTime,n=Math.max(0,this.frameInterval-t);setTimeout(()=>{this.executeFrame();},n);}executeFrame(){let e=Date.now(),t=Array.from(this.pendingRequests.values());this.pendingRequests.clear(),this.frameScheduled=false,t.sort((r,o)=>r.priority-o.priority),this.flushFrame(t),this.lastFrameTime=e,this.stats.totalFrames++;let n=Date.now()-e;this.stats.averageFrameTime=(this.stats.averageFrameTime*(this.stats.totalFrames-1)+n)/this.stats.totalFrames,process.env.FRAME_SCHEDULER_DEBUG==="1"&&process.stderr.write(`[FRAME_SCHEDULER] Frame #${this.stats.totalFrames}: ${t.length} requests, ${n.toFixed(2)}ms
|
|
3667
3667
|
`);}flushFrame(e){e.length!==0&&(process.env.FRAME_SCHEDULER_DEBUG==="1"&&process.stderr.write(`[FRAME_SCHEDULER] \u{1F3A8} Flushing ${e.length} render callback(s)
|
|
3668
3668
|
`),e.forEach(t=>{try{t.callback();}catch(n){process.stderr.write(`[FRAME_SCHEDULER] Render callback error: ${n}
|
|
3669
3669
|
`);}}));}getStats(){return {...this.stats}}resetStats(){this.stats={totalFrames:0,droppedRequests:0,averageFrameTime:0};}},Gp=null;function Li(){return Gp||(Gp=new jl),Gp}ne();var Wp="\x1B[200~",Hb="\x1B[201~",VE=50,Gl=class{buffer="";inPaste=false;escapeTimeout=null;parse(e,t){for(de("PASTE_PARSER",`Received ${e.length} bytes: ${JSON.stringify(e)}`),this.buffer+=e;this.buffer.length>0;){if(this.inPaste){let l=this.buffer.indexOf(Hb);if(l>=0){let c=this.buffer.slice(0,l);this.buffer=this.buffer.slice(l+Hb.length),de("PASTE_PARSER",`\u{1F4CB} Paste detected: ${c.length} chars`),t(c,true),this.inPaste=false;continue}else break}if(this.buffer.indexOf(Wp)===0){this.escapeTimeout&&clearTimeout(this.escapeTimeout),de("PASTE_PARSER","\u{1F4E5} Paste start detected"),this.inPaste=true,this.buffer=this.buffer.slice(Wp.length);continue}if(this.buffer.startsWith("\x1B")){if(this.escapeTimeout&&clearTimeout(this.escapeTimeout),this.buffer.length===1){this.escapeTimeout=setTimeout(()=>{this.buffer==="\x1B"&&(de("PASTE_PARSER","\u2328\uFE0F ESC key detected"),t("\x1B",false),this.buffer="");},VE);break}if(this.isCompleteEscapeSequence(this.buffer)){de("PASTE_PARSER",`\u2328\uFE0F ESC sequence: ${JSON.stringify(this.buffer)}`),t(this.buffer,false),this.buffer="";continue}if(this.buffer.length>20){de("PASTE_PARSER",`\u26A0\uFE0F Invalid ESC sequence (too long): ${JSON.stringify(this.buffer)}`),t(this.buffer,false),this.buffer="";continue}break}let r=this.buffer.length,o=this.buffer.indexOf("\x1B"),i=this.buffer.indexOf(Wp);o>0&&(r=Math.min(r,o)),i>0&&(r=Math.min(r,i));let a=this.buffer.slice(0,r);if(this.buffer=this.buffer.slice(r),a.length>0&&(de("PASTE_PARSER",`\u2328\uFE0F Text: ${JSON.stringify(a)} (${a.length} chars)`),t(a,false)),a.length===0&&this.buffer.length>0)break}}isCompleteEscapeSequence(e){return e.startsWith("\x1B[")?/[A-Za-z~^$u]$/.test(e):e.startsWith("\x1BO")?/[A-Za-z]$/.test(e):e.startsWith("\x1B]")?e.endsWith("\x07")||e.endsWith("\x1B\\"):e.length===2}dispose(){this.escapeTimeout&&(clearTimeout(this.escapeTimeout),this.escapeTimeout=null),this.buffer="",this.inPaste=false,de("PASTE_PARSER","\u{1F5D1}\uFE0F Disposed");}};ne();var YE=(s,e=2)=>s.replace(/^\t+/gm,t=>" ".repeat(t.length*e)),qb=YE;var XE=(s,e)=>{let t=[],n=s-e,r=s+e;for(let o=n;o<=r;o++)t.push(o);return t},QE=(s,e,t={})=>{var n;if(typeof s!="string")throw new TypeError("Source code is missing.");if(!e||e<1)throw new TypeError("Line number must start from `1`.");let r=qb(s).split(/\r?\n/);if(!(e>r.length))return XE(e,(n=t.around)!==null&&n!==void 0?n:3).filter(o=>r[o-1]!==void 0).map(o=>({line:o,value:r[o-1]}))},Kb=QE;var zr=createContext({isScreenReaderEnabled:false});var Wl=createContext(void 0);var Jb=forwardRef(({children:s,backgroundColor:e,"aria-label":t,"aria-hidden":n,"aria-role":r,"aria-state":o,...i},a)=>{let{isScreenReaderEnabled:l}=useContext(zr),c=t?A.createElement("ink-text",null,t):void 0;if(l&&n)return null;let u=A.createElement("ink-box",{ref:a,style:{flexWrap:"nowrap",flexDirection:"row",flexGrow:0,flexShrink:1,...i,backgroundColor:e,overflowX:i.overflowX??i.overflow??"visible",overflowY:i.overflowY??i.overflow??"visible"},internal_accessibility:{role:r,state:o}},l&&c?c:s);return e?A.createElement(Wl.Provider,{value:e},u):u});Jb.displayName="Box";var _=Jb;function f({color:s,backgroundColor:e,dimColor:t=false,bold:n=false,italic:r=false,underline:o=false,strikethrough:i=false,inverse:a=false,wrap:l="wrap",children:c,"aria-label":u,"aria-hidden":d=false}){let{isScreenReaderEnabled:p}=useContext(zr),g=useContext(Wl),h=p&&u?u:c;if(h==null)return null;let y=b=>{t&&(b=Oe.dim(b)),s&&(b=Xn(b,s,"foreground"));let C=e??g;return C&&(b=Xn(b,C,"background")),n&&(b=Oe.bold(b)),r&&(b=Oe.italic(b)),o&&(b=Oe.underline(b)),i&&(b=Oe.strikethrough(b)),a&&(b=Oe.inverse(b)),b};return p&&d?null:A.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:l},internal_transform:y},p&&u?u:c)}var Hp=s=>s?.replace(`file://${cwd()}/`,""),Xb=new Yb({cwd:cwd(),internals:Yb.nodeInternals()});function qp({error:s}){let e=s.stack?s.stack.split(`
|
|
3670
3670
|
`).slice(1):void 0,t=e?Xb.parseLine(e[0]):void 0,n=Hp(t?.file),r,o=0;if(n&&t?.line&&wt.existsSync(n)){let i=wt.readFileSync(n,"utf8");if(r=Kb(i,t.line),r)for(let{line:a}of r)o=Math.max(o,String(a).length);}return A.createElement(_,{flexDirection:"column",padding:1},A.createElement(_,null,A.createElement(f,{backgroundColor:"red",color:"white"}," ","ERROR"," "),A.createElement(f,null," ",s.message)),t&&n&&A.createElement(_,{marginTop:1},A.createElement(f,{dimColor:true},n,":",t.line,":",t.column)),t&&r&&A.createElement(_,{marginTop:1,flexDirection:"column"},r.map(({line:i,value:a})=>A.createElement(_,{key:i},A.createElement(_,{width:o+1},A.createElement(f,{dimColor:i!==t.line,backgroundColor:i===t.line?"red":void 0,color:i===t.line?"white":void 0,"aria-label":i===t.line?`Line ${i}, error`:`Line ${i}`},String(i).padStart(o," "),":")),A.createElement(f,{key:i,backgroundColor:i===t.line?"red":void 0,color:i===t.line?"white":void 0}," "+a)))),s.stack&&A.createElement(_,{marginTop:1,flexDirection:"column"},s.stack.split(`
|
|
3671
|
-
`).slice(1).map(i=>{let a=Xb.parseLine(i);return a?A.createElement(_,{key:i},A.createElement(f,{dimColor:true},"- "),A.createElement(f,{dimColor:true,bold:true},a.function),A.createElement(f,{dimColor:true,color:"gray","aria-label":`at ${Hp(a.file)??""} line ${a.line} column ${a.column}`}," ","(",Hp(a.file)??"",":",a.line,":",a.column,")")):A.createElement(_,{key:i},A.createElement(f,{dimColor:true},"- "),A.createElement(f,{dimColor:true,bold:true},i,"\\t"," "))})))}var SA=" ",kA="\x1B[Z",_A="\x1B",Oi=class extends PureComponent{static displayName="InternalApp";static getDerivedStateFromError(e){return {error:e}}state={isFocusEnabled:true,activeFocusId:void 0,focusables:[],error:void 0,terminalColumns:
|
|
3671
|
+
`).slice(1).map(i=>{let a=Xb.parseLine(i);return a?A.createElement(_,{key:i},A.createElement(f,{dimColor:true},"- "),A.createElement(f,{dimColor:true,bold:true},a.function),A.createElement(f,{dimColor:true,color:"gray","aria-label":`at ${Hp(a.file)??""} line ${a.line} column ${a.column}`}," ","(",Hp(a.file)??"",":",a.line,":",a.column,")")):A.createElement(_,{key:i},A.createElement(f,{dimColor:true},"- "),A.createElement(f,{dimColor:true,bold:true},i,"\\t"," "))})))}var SA=" ",kA="\x1B[Z",_A="\x1B",Oi=class extends PureComponent{static displayName="InternalApp";static getDerivedStateFromError(e){return {error:e}}state={isFocusEnabled:true,activeFocusId:void 0,focusables:[],error:void 0,terminalColumns:Ye.stdout.columns||80,terminalRows:Ye.stdout.rows||24};internal_eventEmitter=new EventEmitter;pasteParser=null;isRawModeSupported(){return this.props.stdin.isTTY}render(){return A.createElement($l.Provider,{value:{exit:this.handleExit}},A.createElement(po.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC,internal_eventEmitter:this.internal_eventEmitter}},A.createElement(Di.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout,columns:this.state.terminalColumns,rows:this.state.terminalRows}},A.createElement(Up.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},A.createElement(Ol.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious,focus:this.focus}},this.state.error?A.createElement(qp,{error:this.state.error}):this.props.children)))))}componentDidMount(){cv.hide(this.props.stdout),this.props.stdin.isTTY&&(this.props.stdout.write("\x1B[?2004h"),de("INK_APP","\u2705 Bracketed Paste Mode enabled"),this.pasteParser=new Gl,xs(this.props.stdin).enablePermanent(t=>{this.pasteParser.parse(t,(n,r)=>{r?this.handlePaste(n):this.handleInput(n),this.internal_eventEmitter.emit("input",n);});}),de("INK_APP","\u2705 InputManager and PasteParser initialized"),Ye.env.FRAME_SCHEDULER_DEBUG==="1"&&setInterval(()=>{let t=Li().getStats();de("FRAME_SCHEDULER","Stats",t);},5e3)),this.props.stdout.on("resize",this.handleResize);}handleResize=()=>{let e=this.props.stdout.columns||80,t=this.props.stdout.rows||24;Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[APP_RESIZE] \u{1F4D0} Resize detected: ${this.state.terminalColumns}x${this.state.terminalRows} \u2192 ${e}x${t}
|
|
3672
3672
|
`),this.setState({terminalColumns:e,terminalRows:t});};componentWillUnmount(){if(cv.show(this.props.stdout),this.props.stdout.off("resize",this.handleResize),this.isRawModeSupported()){this.props.stdout.write("\x1B[?2004l"),this.pasteParser?.dispose(),this.pasteParser=null;try{xs().disable();}catch{}de("INK_APP","\u{1F53B} Bracketed Paste Mode disabled and resources cleaned up");}}componentDidCatch(e){this.handleExit(e);}handleSetRawMode=e=>{if(!this.isRawModeSupported())throw new Error(`Raw mode is not supported on the current stdin.
|
|
3673
3673
|
Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`)};handleInput=e=>{e===""&&this.props.exitOnCtrlC&&this.handleExit(),e===_A&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(e===SA&&this.focusNext(),e===kA&&this.focusPrevious());};handlePaste=async e=>{if(de("INPUT_PASTE",`\u{1F4CB} Pasted ${e.length} characters`),e.length===0){de("INPUT_PASTE","\u{1F5BC}\uFE0F Empty paste detected - checking clipboard for image...");try{let{pasteImageAsBase64:t}=await Promise.resolve().then(()=>(Xp(),lv)),n=await t();if(n){de("INPUT_PASTE",`\u{1F4CE} Image detected in clipboard: ${n.name} (${Math.round(n.data.length/1024)}KB)`),this.internal_eventEmitter.emit("image-paste",n);return}}catch(t){de("INPUT_PASTE","\u274C Failed to check clipboard for image",{error:t});}}this.internal_eventEmitter.emit("paste",e),this.handleInput(e);};handleExit=e=>{this.isRawModeSupported()&&this.handleSetRawMode(false),this.props.onExit(e);};enableFocus=()=>{this.setState({isFocusEnabled:true});};disableFocus=()=>{this.setState({isFocusEnabled:false});};focus=e=>{this.setState(t=>t.focusables.some(r=>r?.id===e)?{activeFocusId:e}:t);};focusNext=()=>{this.setState(e=>{let t=e.focusables.find(r=>r.isActive)?.id;return {activeFocusId:this.findNextFocusable(e)??t}});};focusPrevious=()=>{this.setState(e=>{let t=e.focusables.findLast(r=>r.isActive)?.id;return {activeFocusId:this.findPreviousFocusable(e)??t}});};addFocusable=(e,{autoFocus:t})=>{this.setState(n=>{let r=n.activeFocusId;return !r&&t&&(r=e),{activeFocusId:r,focusables:[...n.focusables,{id:e,isActive:true}]}});};removeFocusable=e=>{this.setState(t=>({activeFocusId:t.activeFocusId===e?void 0:t.activeFocusId,focusables:t.focusables.filter(n=>n.id!==e)}));};activateFocusable=e=>{this.setState(t=>({focusables:t.focusables.map(n=>n.id!==e?n:{id:e,isActive:true})}));};deactivateFocusable=e=>{this.setState(t=>({activeFocusId:t.activeFocusId===e?void 0:t.activeFocusId,focusables:t.focusables.map(n=>n.id!==e?n:{id:e,isActive:false})}));};findNextFocusable=e=>{let t=e.focusables.findIndex(n=>n.id===e.activeFocusId);for(let n=t+1;n<e.focusables.length;n++){let r=e.focusables[n];if(r?.isActive)return r.id}};findPreviousFocusable=e=>{let t=e.focusables.findIndex(n=>n.id===e.activeFocusId);for(let n=t-1;n>=0;n--){let r=e.focusables[n];if(r?.isActive)return r.id}}};function Qp({onlyFirst:s=false}={}){let r="(?:\\u001B\\][\\s\\S]*?(?:\\u0007|\\u001B\\u005C|\\u009C))|[\\u001B\\u009B][[\\]()#;?]*(?:\\d{1,4}(?:[;:]\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~]";return new RegExp(r,s?void 0:"g")}var IA=Qp();function Jr(s){if(typeof s!="string")throw new TypeError(`Expected a \`string\`, got \`${typeof s}\``);return s.replace(IA,"")}var uv=mo();var En=class extends EventEmitter{terminal;_lastVisibleLines=[];_allLines=[];_isActive=false;_forceFullRedraw=false;_scrollOffset=0;_autoScroll=true;_contentHeight=0;constructor(){super(),this.terminal=Wr();}get isActive(){return this._isActive}get size(){return this.terminal.size}get scrollOffset(){return this._scrollOffset}get contentHeight(){return this._contentHeight}get isAutoScroll(){return this._autoScroll}get isResizeLocked(){return false}get lastVisualLines(){return this._lastVisibleLines.length}start(){this._isActive||(this._isActive=true,this.terminal.enterAltScreen(),this.terminal.hideCursor(),this.terminal.clearScreen(),this.terminal.moveCursor(0,0),this.terminal.write("\x1B[?1000h"),this.terminal.write("\x1B[?1002h"),this.terminal.write("\x1B[?1006h"),this.terminal.on("resize",this.handleResize.bind(this)),this._forceFullRedraw=true,this.emit("start"));}stop(){this._isActive&&(this._isActive=false,this.terminal.write("\x1B[?1006l"),this.terminal.write("\x1B[?1002l"),this.terminal.write("\x1B[?1000l"),this.terminal.showCursor(),this.terminal.leaveAltScreen(),this.terminal.off("resize",this.handleResize.bind(this)),this.emit("stop"));}handleResize(e){if(process.env.NEOX_INK_DEBUG==="1"&&process.stderr.write(`[AltScreenRenderer.handleResize] ${e.columns}x${e.rows}
|
|
3674
3674
|
`),this._forceFullRedraw=true,this._lastVisibleLines=[],this._autoScroll)this._scrollOffset=Math.max(0,this._contentHeight-e.rows);else {let t=Math.max(0,this._contentHeight-e.rows);this._scrollOffset=Math.min(this._scrollOffset,t);}this.emit("resize",e),this.emit("resizeUnlock");}scrollUp(e=3){return this._scrollOffset<=0?false:(this._scrollOffset=Math.max(0,this._scrollOffset-e),this._autoScroll=false,this._forceFullRedraw=true,this.emit("scroll",this._scrollOffset),true)}scrollDown(e=3){let{rows:t}=this.terminal.size,n=Math.max(0,this._contentHeight-t);return this._scrollOffset>=n?false:(this._scrollOffset=Math.min(n,this._scrollOffset+e),this._scrollOffset>=n&&(this._autoScroll=true),this._forceFullRedraw=true,this.emit("scroll",this._scrollOffset),true)}pageUp(){let{rows:e}=this.terminal.size;return this.scrollUp(e-2)}pageDown(){let{rows:e}=this.terminal.size;return this.scrollDown(e-2)}scrollToTop(){return this._scrollOffset===0?false:(this._scrollOffset=0,this._autoScroll=false,this._forceFullRedraw=true,this.emit("scroll",this._scrollOffset),true)}scrollToBottom(){let{rows:e}=this.terminal.size,t=Math.max(0,this._contentHeight-e);return this._scrollOffset===t&&this._autoScroll?false:(this._scrollOffset=t,this._autoScroll=true,this._forceFullRedraw=true,this.emit("scroll",this._scrollOffset),true)}canScroll(){let{rows:e}=this.terminal.size,t=Math.max(0,this._contentHeight-e);return {up:this._scrollOffset>0,down:this._scrollOffset<t}}render(e){if(!this._isActive)return;let t=e.split(`
|
|
@@ -3684,24 +3684,31 @@ Read about how to prevent this error on https://github.com/vadimdemedes/ink/#isr
|
|
|
3684
3684
|
`);}r>5&&process.stderr.write(`[InlineRenderer.FULL_REDRAW] ... and ${r-5} more lines
|
|
3685
3685
|
`);}if(this._lastVisualLines>0){let i=this.alignCursorToBottom(this._lastVisualLines);i&&this.terminal.write(i),this.eraseOutput(this._lastVisualLines);}this.terminal.write(n.join(`
|
|
3686
3686
|
`)),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+=`
|
|
3687
|
-
`),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=Jr(d).replace(/[\u0000-\u001F\u007F]/g,""),g=_l(p),h=Math.max(0,t-1),y=Math.min(g,h);y>0&&(c+=`\x1B[${y}C`);}else {let p=_l(Jr(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{xs().setMouseWheelCallback(t=>{t==="up"?this.scrollUp(3):this.scrollDown(3);}),
|
|
3688
|
-
`);}catch(e){
|
|
3689
|
-
`),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??
|
|
3690
|
-
`);}let t=e.debug||this.isScreenReaderEnabled;e.maxFps??30;this.useAltScreen=e.useAltScreen??false;let o=Li();this.rootNode.onRender=()=>{let i=t?0:2;if(o.scheduleFrame("ink-root-render",this.onRender,i),
|
|
3691
|
-
`);}},this.rootNode.onImmediateRender=()=>{o.scheduleFrame("ink-root-immediate",this.onRender,0),
|
|
3692
|
-
`);},this.useAltScreen?(this.renderer=Zp(),this.renderer.start(),this.setupMouseWheelHandler()):this.renderer=em({incremental:e.incrementalRendering!==false}),this.isUnmounted=false,this.lastOutput="",this.lastOutputHeight=0,this.container=Yn.createContainer(this.rootNode,LegacyRoot,null,false,null,"id",()=>{},()=>{},()=>{},()=>{},null),this.unsubscribeExit=onExit(this.unmount,{alwaysLast:false}),
|
|
3693
|
-
`),!this.useAltScreen&&this.renderer instanceof yo&&this.renderer.handleResize(e.columns),this.handleResizeFromApp();};getTerminalWidth=()=>this.options.stdout.columns||80;resized=()=>{this.options.debug||this.renderer.clear(),this.calculateLayout();};handleResizeFromApp=()=>{
|
|
3694
|
-
`),this.calculateLayout(),this.onRender();};resolveExitPromise=()=>{};rejectExitPromise=()=>{};unsubscribeExit=()=>{};calculateLayout=()=>{let e=this.getTerminalWidth();this.rootNode.yogaNode.setWidth(e),this.rootNode.yogaNode.calculateLayout(void 0,void 0,Re.DIRECTION_LTR);};onRender=()=>{if(this.isUnmounted)return;
|
|
3695
|
-
`);let e=performance.now(),{output:t,outputHeight:n,staticOutput:r}=Ob(this.rootNode,this.isScreenReaderEnabled),o=performance.now()-e;
|
|
3696
|
-
`),
|
|
3687
|
+
`),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=Jr(d).replace(/[\u0000-\u001F\u007F]/g,""),g=_l(p),h=Math.max(0,t-1),y=Math.min(g,h);y>0&&(c+=`\x1B[${y}C`);}else {let p=_l(Jr(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{xs().setMouseWheelCallback(t=>{t==="up"?this.scrollUp(3):this.scrollDown(3);}),Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[INK] \u{1F5B1}\uFE0F Mouse wheel handler installed via InputManager
|
|
3688
|
+
`);}catch(e){Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[INK] \u26A0\uFE0F InputManager not ready, will retry: ${e}
|
|
3689
|
+
`),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??Ye.env.INK_SCREEN_READER==="true",this.terminalAdapter=Wr({stdout:e.stdout,stdin:e.stdin,resizePollInterval:void 0}),Ye.env.NEOX_INK_DEBUG==="1"){let i=this.terminalAdapter.capabilities;Ye.stderr.write(`[INK] \u{1F5A5}\uFE0F Terminal: ${i.terminalType}, syncUpdate=${i.synchronizedUpdate}, altScreen=${i.alternateScreen}, trueColor=${i.trueColor}
|
|
3690
|
+
`);}let t=e.debug||this.isScreenReaderEnabled;e.maxFps??30;this.useAltScreen=e.useAltScreen??false;let o=Li();this.rootNode.onRender=()=>{let i=t?0:2;if(o.scheduleFrame("ink-root-render",this.onRender,i),Ye.env.NEOX_INK_DEBUG==="1"){let a=t?"IMMEDIATE":"NORMAL";Ye.stderr.write(`[INK] \u{1F4C5} Render scheduled with ${a} priority
|
|
3691
|
+
`);}},this.rootNode.onImmediateRender=()=>{o.scheduleFrame("ink-root-immediate",this.onRender,0),Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[INK] \u{1F680} Render scheduled with IMMEDIATE priority
|
|
3692
|
+
`);},this.useAltScreen?(this.renderer=Zp(),this.renderer.start(),this.setupMouseWheelHandler()):this.renderer=em({incremental:e.incrementalRendering!==false}),this.isUnmounted=false,this.lastOutput="",this.lastOutputHeight=0,this.container=Yn.createContainer(this.rootNode,LegacyRoot,null,false,null,"id",()=>{},()=>{},()=>{},()=>{},null),this.unsubscribeExit=onExit(this.unmount,{alwaysLast:false}),Ye.env.DEV==="true"&&Yn.injectIntoDevTools({bundleType:0,version:"16.13.1",rendererPackageName:"ink"}),e.patchConsole&&this.patchConsole(),bo||(this.terminalAdapter.on("resize",this.handleTerminalResize),this.unsubscribeTerminalResize=()=>{this.terminalAdapter.off("resize",this.handleTerminalResize);});}handleTerminalResize=(e,t)=>{Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[INK] \u{1F4D0} Resize: ${t.columns}x${t.rows} \u2192 ${e.columns}x${e.rows}
|
|
3693
|
+
`),!this.useAltScreen&&this.renderer instanceof yo&&this.renderer.handleResize(e.columns),this.handleResizeFromApp();};getTerminalWidth=()=>this.options.stdout.columns||80;resized=()=>{this.options.debug||this.renderer.clear(),this.calculateLayout();};handleResizeFromApp=()=>{Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[INK_RESIZE] \u{1F4D0} handleResizeFromApp called, lastOutput=${this.lastOutput.length} chars, lastOutputHeight=${this.lastOutputHeight}
|
|
3694
|
+
`),this.calculateLayout(),this.onRender();};resolveExitPromise=()=>{};rejectExitPromise=()=>{};unsubscribeExit=()=>{};calculateLayout=()=>{let e=this.getTerminalWidth();this.rootNode.yogaNode.setWidth(e),this.rootNode.yogaNode.calculateLayout(void 0,void 0,Re.DIRECTION_LTR);};onRender=()=>{if(this.isUnmounted)return;Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[INK_RENDER] \u{1F3AC} onRender called, starting actual render
|
|
3695
|
+
`);let e=performance.now(),{output:t,outputHeight:n,staticOutput:r}=Ob(this.rootNode,this.isScreenReaderEnabled),o=performance.now()-e;Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[INK_RENDER] \u{1F4CA} output=${t.length} chars, outputHeight=${n}, staticOutput=${r?.length||0} chars, lastOutput=${this.lastOutput.length} chars
|
|
3696
|
+
`),Ye.env.CLI_DEBUG==="1"&&o>100&&Ye.stderr.write(`[INK_RENDER] \u26A0\uFE0F Slow render: ${o.toFixed(1)}ms, outputHeight=${n}
|
|
3697
3697
|
`),this.options.onRender?.({renderTime:o});let i=r&&r!==`
|
|
3698
|
-
`;if(this.options.debug){i&&this.options.stdout.write(r),t!==this.lastOutput&&(this.options.stdout.write(t),this.lastOutput=t,this.lastOutputHeight=n);return}if(bo){i&&this.options.stdout.write(r),this.lastOutput=t,this.lastOutputHeight=n;return}if(this.isScreenReaderEnabled){if(i){let c=this.lastOutputHeight>0?
|
|
3699
|
-
`).length;return}if(this.useAltScreen){let a=this.terminalAdapter.capabilities.synchronizedUpdate;i&&(this._accumulatedStatic+=r);let l=this._accumulatedStatic+t;l!==this._lastFullOutput&&(a&&this.terminalAdapter.beginSyncUpdate(),this.renderer.render(l),a&&this.terminalAdapter.endSyncUpdate(),this._lastFullOutput=l);}else if(i){
|
|
3698
|
+
`;if(this.options.debug){i&&this.options.stdout.write(r),t!==this.lastOutput&&(this.options.stdout.write(t),this.lastOutput=t,this.lastOutputHeight=n);return}if(bo){i&&this.options.stdout.write(r),this.lastOutput=t,this.lastOutputHeight=n;return}if(this.isScreenReaderEnabled){if(i){let c=this.lastOutputHeight>0?nt.eraseLines(this.lastOutputHeight):"";this.options.stdout.write(c+r),this.lastOutputHeight=0;}if(t===this.lastOutput&&!i)return;let a=this.options.stdout.columns||80,l=this.wrapText(t,a);if(i)this.options.stdout.write(l);else {let c=this.lastOutputHeight>0?nt.eraseLines(this.lastOutputHeight):"";this.options.stdout.write(c+l);}this.lastOutput=t,this.lastOutputHeight=l===""?0:l.split(`
|
|
3699
|
+
`).length;return}if(this.useAltScreen){let a=this.terminalAdapter.capabilities.synchronizedUpdate;i&&(this._accumulatedStatic+=r);let l=this._accumulatedStatic+t;l!==this._lastFullOutput&&(a&&this.terminalAdapter.beginSyncUpdate(),this.renderer.render(l),a&&this.terminalAdapter.endSyncUpdate(),this._lastFullOutput=l);}else if(i){if(Ye.env.NEOX_INK_DEBUG==="1"){let l=r.split(`
|
|
3700
|
+
`);Ye.stderr.write(`[INK_RENDER] \u{1F4E4} STATIC output: ${l.length} lines, ${r.length} chars, endsWithNewline=${r.endsWith(`
|
|
3701
|
+
`)}, first40="${r.replace(/\x1b\[[^m]*m/g,"").slice(0,40).replace(/\n/g,"\\n")}"
|
|
3702
|
+
`);}let a=this.terminalAdapter.capabilities.synchronizedUpdate;a&&this.terminalAdapter.beginSyncUpdate(),this.renderer.clear(),this.options.stdout.write(r),this.renderer.render(t),a&&this.terminalAdapter.endSyncUpdate();}else t!==this.lastOutput?(Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[INK_RENDER] \u{1F504} DYNAMIC only: output changed, ${t.length} chars, outputLines=${t.split(`
|
|
3703
|
+
`).length}, endsWithNewline=${t.endsWith(`
|
|
3704
|
+
`)}
|
|
3705
|
+
`),this.renderer.render(t)):Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[INK_RENDER] \u23ED\uFE0F SKIP: output unchanged
|
|
3706
|
+
`);this.lastOutput=t,this.lastOutputHeight=n,Ye.env.NEOX_INK_DEBUG==="1"&&Ye.stderr.write(`[INK_RENDER] \u2705 onRender completed
|
|
3700
3707
|
`);};render(e){let t=A.createElement(zr.Provider,{value:{isScreenReaderEnabled:this.isScreenReaderEnabled}},A.createElement(Oi,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount,onResize:this.handleResizeFromApp},e));Yn.updateContainerSync(t,this.container,null,gv),Yn.flushSyncWork();}writeToStdout(e){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(e+this.lastOutput);return}if(bo){this.options.stdout.write(e);return}this.renderer.clear(),this.options.stdout.write(e),this.renderer.render(this.lastOutput);}}writeToStderr(e){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(e),this.options.stdout.write(this.lastOutput);return}if(bo){this.options.stderr.write(e);return}this.renderer.clear(),this.options.stderr.write(e),this.renderer.render(this.lastOutput);}}unmount(e){if(!this.isUnmounted){this.calculateLayout(),this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole=="function"&&this.restoreConsole(),typeof this.unsubscribeResize=="function"&&this.unsubscribeResize();try{xs().setMouseWheelCallback(null);}catch{}typeof this.unsubscribeTerminalResize=="function"&&this.unsubscribeTerminalResize(),this.terminalAdapter.reset(),bo?this.options.stdout.write(this.lastOutput+`
|
|
3701
3708
|
`):!this.options.debug&&!this.useAltScreen&&this.renderer.done(),this.useAltScreen&&this.options.stdout.write(`
|
|
3702
3709
|
`),this.isUnmounted=true,Yn.updateContainerSync(null,this.container,null,gv),Yn.flushSyncWork(),uo.delete(this.options.stdout),e instanceof Error?this.rejectExitPromise(e):this.resolveExitPromise();}}async waitUntilExit(){return this.exitPromise||=new Promise((e,t)=>{this.resolveExitPromise=e,this.rejectExitPromise=t;}),this.exitPromise}clear(){!bo&&!this.options.debug&&this.renderer.clear();}wrapText(e,t){if(t<=0)return e;let n=e.split(`
|
|
3703
3710
|
`),r=[];for(let o of n){let i=this.wrapLine(o,t);r.push(...i);}return r.join(`
|
|
3704
|
-
`)}wrapLine(e,t){if(_l(Jr(e))<=t)return [e];let r=[],o="",i=0,a=false,l="";for(let c=0;c<e.length;c++){let u=e[c];if(u==="\x1B"){a=true,l=u;continue}if(a){l+=u,u==="m"&&(a=false,o+=l,l="");continue}let d=_l(u);i+d>t?(r.push(o),o=u,i=d):(o+=u,i+=d);}return o&&r.push(o),r}patchConsole(){this.options.debug||(this.restoreConsole=DA((e,t)=>{e==="stdout"&&this.writeToStdout(t),e==="stderr"&&(t.startsWith("The above error occurred")||this.writeToStderr(t));}));}};var OA=(s,e)=>{let t={stdout:
|
|
3711
|
+
`)}wrapLine(e,t){if(_l(Jr(e))<=t)return [e];let r=[],o="",i=0,a=false,l="";for(let c=0;c<e.length;c++){let u=e[c];if(u==="\x1B"){a=true,l=u;continue}if(a){l+=u,u==="m"&&(a=false,o+=l,l="");continue}let d=_l(u);i+d>t?(r.push(o),o=u,i=d):(o+=u,i+=d);}return o&&r.push(o),r}patchConsole(){this.options.debug||(this.restoreConsole=DA((e,t)=>{e==="stdout"&&this.writeToStdout(t),e==="stderr"&&(t.startsWith("The above error occurred")||this.writeToStderr(t));}));}};var OA=(s,e)=>{let t={stdout:Ye.stdout,stdin:Ye.stdin,stderr:Ye.stderr,debug:false,exitOnCtrlC:true,patchConsole:true,maxFps:30,incrementalRendering:true,useAltScreen:false,...BA(e)},n=FA(t.stdout,()=>new Bi(t));return n.render(s),{rerender:n.render,unmount(){n.unmount();},waitUntilExit:n.waitUntilExit,cleanup:()=>uo.delete(t.stdout),clear:n.clear}},vo=OA,BA=(s={})=>s instanceof Stream?{stdout:s,stdin:Ye.stdin}:s,FA=(s,e)=>{let t=uo.get(s);return t||(t=e(),uo.set(s,t)),t};function Jl(s){let{items:e,children:t,style:n}=s,[r,o]=useState(0),i=e.length<r?e.length:r,a=useMemo(()=>e.slice(i),[i,e]);useLayoutEffect(()=>{(e.length<r||e.length>r)&&o(e.length);},[e.length,r]);let l=useMemo(()=>a.map((u,d)=>t(u,i+d)),[a,t,i]),c=useMemo(()=>({position:"absolute",flexDirection:"column",...n}),[n]);return A.createElement("ink-box",{internal_static:true,style:c},l)}var zA=/^(?:\x1b)([a-zA-Z0-9])$/,HA=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,hv={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"},fv=[...Object.values(hv),"backspace"],qA=s=>["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(s),KA=s=>["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(s),JA=(s="")=>{let e;Buffer$1.isBuffer(s)?s[0]>127&&s[1]===void 0?(s[0]-=128,s="\x1B"+String(s)):s=String(s):s!==void 0&&typeof s!="string"?s=String(s):s||(s="");let t={name:"",ctrl:false,meta:false,shift:false,option:false,sequence:s,raw:s};if(t.sequence=t.sequence||s||t.name,s==="\r")t.raw=void 0,t.name="return";else if(s===`
|
|
3705
3712
|
`)t.name="enter";else if(s===" ")t.name="tab";else if(s==="\b"||s==="\x1B\b")t.name="backspace",t.meta=s.charAt(0)==="\x1B";else if(s==="\x7F"||s==="\x1B\x7F")t.name="delete",t.meta=s.charAt(0)==="\x1B";else if(s==="\x1B"||s==="\x1B\x1B")t.name="escape",t.meta=s.length===2;else if(s===" "||s==="\x1B ")t.name="space",t.meta=s.length===2;else if(s.length===1&&s<="")t.name=String.fromCharCode(s.charCodeAt(0)+97-1),t.ctrl=true;else if(s.length===1&&s>="0"&&s<="9")t.name="number";else if(s.length===1&&s>="a"&&s<="z")t.name=s;else if(s.length===1&&s>="A"&&s<="Z")t.name=s.toLowerCase(),t.shift=true;else if(e=zA.exec(s))t.meta=true,t.shift=/^[A-Z]$/.test(e[1]);else if(e=HA.exec(s)){let n=[...s];n[0]==="\x1B"&&n[1]==="\x1B"&&(t.option=true);let r=[e[1],e[2],e[4],e[6]].filter(Boolean).join(""),o=(e[3]||e[5]||1)-1;t.ctrl=!!(o&4),t.meta=!!(o&10),t.shift=!!(o&1),t.code=r,t.name=hv[r],t.shift=qA(r)||t.shift,t.ctrl=KA(r)||t.ctrl;}return t},yv=JA;var YA=()=>useContext(po),Vl=YA;ne();var XA=(s,e={})=>{let{stdin:t,setRawMode:n,internal_exitOnCtrlC:r,internal_eventEmitter:o}=Vl();useEffect(()=>{if(e.isActive!==false)return ()=>{}},[e.isActive,n]),useEffect(()=>{if(e.isActive===false)return;let i=a=>{let l=Date.now();de("INPUT",`>>> handleData START, data.length=${a.length}`);let c=a==="\r"||a===`
|
|
3706
3713
|
`||a===`\r
|
|
3707
3714
|
`;if(a.length>1&&(a.includes(`
|
|
@@ -3758,7 +3765,7 @@ Or: .neox/skills/<name>/SKILL.md`,selectToExecute:"Select skill to execute",buil
|
|
|
3758
3765
|
`+s.slice(N);u(Y);return}if(te.return){if(T&&r.length>0){let Y=r[E];C(0),S(false),d(Y);return}process.env.CLI_DEBUG==="1"&&m.debug("INPUT_LINE","Enter pressed - submitting",{valueLength:s.length,value:s.substring(0,50),disabled:t}),d(),C(0),S(false);return}if(T&&r.length>0){if(te.upArrow){v(Y=>Y>0?Y-1:r.length-1);return}if(te.downArrow){v(Y=>Y<r.length-1?Y+1:0);return}}if(te.upArrow){if($===0)p(),C(0);else {let Y=s.lastIndexOf(`
|
|
3759
3766
|
`,N-F-2)+1,Ae=z[$-1].length,ge=Math.min(F,Ae),_e=Y+ge;C(s.length-_e);}return}if(te.downArrow){if($===z.length-1)g(),C(0);else {s.lastIndexOf(`
|
|
3760
3767
|
`,N-1)+1;let Ae=s.indexOf(`
|
|
3761
|
-
`,N)+1,ge=z[$+1].length,_e=Math.min(F,ge),fe=Ae+_e;C(s.length-fe);}return}if(te.leftArrow){C(Math.min(b+1,s.length));return}if(te.rightArrow){C(Math.max(b-1,0));return}if(te.home||te.ctrl&&X==="a"){C(s.length);return}if(te.end||te.ctrl&&X==="e"){C(0);return}if(te.backspace||te.delete){if(b===s.length){s.length===0&&a>0&&c&&c();return}let Y=N-1,Ae=s.slice(0,Y)+s.slice(Y+1);u(Ae);return}if(!te.ctrl&&!te.meta&&X){let Y=e$(X);if(!Y){process.env.CLI_DEBUG==="1"&&m.debug("INPUT_LINE","Dropped control/escape-only input chunk");return}let Ae=s.slice(0,N)+Y+s.slice(N);u(Ae);return}}}},{isActive:V});let Pe=!s,oe=()=>Pe?A.createElement(_,null,A.createElement(f,{color:"#9B8FD9",bold:true},"> "),A.createElement(f,{inverse:true}," "),A.createElement(f,{dimColor:true},e)):z.map((X,te)=>{let Y=te===$,Ae=z.slice(0,te).reduce((pe,J)=>pe+J.length+1,0);Ae+X.length;let _e=-1;Y&&(_e=N-Ae);let fe=te===0?"> ":"\u2502 ",Se="#9B8FD9";if(t)return A.createElement(_,{key:te},A.createElement(f,{color:Se,bold:true},fe),A.createElement(f,{dimColor:true},X));if(Y&&_e>=0){let pe=X.slice(0,_e),J=X[_e]||" ",he=X.slice(_e+1);return A.createElement(_,{key:te},A.createElement(f,{color:Se,bold:true},fe),A.createElement(f,null,pe,A.createElement(f,{inverse:true},J),he))}return A.createElement(_,{key:te},A.createElement(f,{color:Se,bold:true},fe),A.createElement(f,null,X))});return A.createElement(_,{flexDirection:"column"},q&&!t&&A.createElement(_,{marginBottom:0},A.createElement(f,{dimColor:true}," \u21B5 ",G().ui.shiftEnterNewline," \u2502 Enter ",G().ui.enterToSend," \u2502 ",ct(G().ui.lineCount,{count:z.length}))),A.createElement(_,{flexDirection:"column"},oe()))};var t$=({isRunning:s,statusText:e="",tokenStats:t,streamingTokens:n=0,streamingStartTime:r=null,provider:o,model:i,onContextMenuToggle:a,agentContextStats:l=[],runMode:c="single",networkStats:u,cooperateStats:d})=>{let{columns:p=80}=Qt(),g=l.filter(J=>J.agentId!=="Main"),h=g.some(J=>J.status==="running"||J.status==="waiting"),y=s||c==="single"&&h,[b,C]=useState(null),[T,S]=useState(0),[E,v]=useState(0),[I,D]=useState(0),[O,k]=useState(0);useEffect(()=>{y?(C(r||Date.now()),S(0)):!y&&(t?.output||0)===0&&(C(null),S(0));},[y,r,t?.output]),useEffect(()=>{if(!y||b===null)return;let J=setInterval(()=>{S(Math.floor((Date.now()-b)/1e3));},500);return ()=>clearInterval(J)},[y,b]),useEffect(()=>{if(!y||n===0){v(0);return}let J=Math.floor(n);if(E===J)return;let he=J-E,K=Math.min(Math.abs(he),20),re=he/K,ve=setInterval(()=>{v(Be=>{let ce=Be+re;return Math.abs(ce-J)<1?J:ce});},50);return ()=>clearInterval(ve)},[n,y,E]),useEffect(()=>{let J=t?.output||0;if(I===J)return;let he=J-I;if(Math.abs(he)>100){D(J);return}let K=Math.max(Math.ceil(Math.abs(he)/10),3),re=he/K,ve=setInterval(()=>{D(Be=>{let ce=Be+re;return Math.abs(ce-J)<1?J:ce});},10);return ()=>clearInterval(ve)},[t?.output,I]),useEffect(()=>{if(!y){k(0);return}let he=(e||"Thinking...").length,K=setInterval(()=>{k(re=>(re+1)%(he+3));},80);return ()=>clearInterval(K)},[y,e]);let M=()=>{if(T<60)return `${T}s`;let J=Math.floor(T/60),he=T%60;return `${J}m ${he}s`},N=J=>J>=1e6?(J/1e6).toFixed(1)+"M":J>=1e3?(J/1e3).toFixed(1)+"K":J.toString(),x=t?.contextWindow||0,B=t?.tokensUsedForContext||t?.total||0,H=t?.pressure||0,W=Math.round(H*100),U=()=>H>.8?"red":H>.5?"yellow":"#B19CD9",z=J=>J.split("").map((K,re)=>{let se=re-O;return se>=0&&se<2?A.createElement(f,{key:re,color:"white",bold:true},K):se>=-1&&se<0?A.createElement(f,{key:re,color:"cyanBright"},K):A.createElement(f,{key:re,color:"cyan"},K)}),q=(J,he)=>{if(!J||_l(J)<=he)return J;let re=0,se=J.length,ve=J;for(;re<se;){let Be=Math.floor((re+se+1)/2),ce=J.slice(0,Be)+"...";_l(ce)<=he?(ve=ce,re=Be):se=Be-1;}return ve},P=(J,he)=>{if(!he||_l(J)<=he)return z(J);let K=q(J,he);return A.createElement(f,{color:"cyan"},K)},F=(()=>{switch(c){case "single":return {icon:"\u25C6",label:"Single",color:"cyan"};case "assistant":return {icon:"\u25C8",label:"Assistant",color:"magenta"};case "cooperate":return {icon:"\u25C7",label:"Cooperate",color:"yellow"};case "network":return {icon:"\u25C9",label:"Network",color:"blue"};default:return {icon:"\u25C6",label:"Single",color:"cyan"}}})(),V=e&&(e.includes("Streaming:")||e.toLowerCase().includes("stream")),Z=e?.match(/Streaming:\s*(\w+)/),ae=Z?Z[1]:null,be=l.length>0,Pe=l.find(J=>J.agentId==="Main"),oe=g.find(J=>J.status==="running")||g.find(J=>J.status==="waiting"),X=g.filter(J=>J.status==="running");X.length>1?`${X.length} agents running: ${X.map(J=>`${J.agentLabel}\u2192${J.currentTask||"..."}`).join(", ")}`:oe?`${oe.agentLabel}: ${oe.currentTask||(oe.status==="waiting"?"Waiting...":"Running...")}`:null;let Y=()=>g.length===0?null:A.createElement(_,null,A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(f,{color:"magenta"},g.length),A.createElement(f,{dimColor:true}," workers")),Ae=(J,he)=>{let K=J.status||"idle",re=K==="running",ve=(ye=>{switch(ye?.toLowerCase()){case "scout":return "cyan";case "explore":return "cyan";case "worker":return "green";case "task":return "green";case "verifier":return "yellow";case "compressor":return "blue";case "coordinator":return "magenta";default:return "magenta"}})(J.workerRole),Be=J.workerRole?J.workerRole.charAt(0).toUpperCase()+J.workerRole.slice(1):J.agentLabel.replace(/-\d+$/,""),ce=p>140?48:p>110?32:20,L=J.workerTask||J.currentTask||"",ee=L.length>ce?L.slice(0,ce-3)+"...":L,me=J.toolUseCount||0,le=J.input+J.output,we=J.elapsedMs?Math.round(J.elapsedMs/1e3):0,We=re?A.createElement(si,{type:"dots"}):K==="waiting"?A.createElement(f,{color:"yellow"},"\u25D0"):K==="completed"?A.createElement(f,{color:"blue"},"\u2713"):K==="error"?A.createElement(f,{color:"red"},"\u2717"):A.createElement(f,{color:"gray"},"\u25CB");return A.createElement(_,{key:J.agentId,justifyContent:"space-between"},A.createElement(_,null,A.createElement(f,{dimColor:true}," ",he?"\u2514\u2500 ":"\u251C\u2500 "),We,A.createElement(f,null," "),A.createElement(f,{color:ve,bold:true},Be),ee&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,null,ee),A.createElement(f,{dimColor:true},")"))),A.createElement(_,null,me>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true},"\xB7 "),A.createElement(f,{color:"cyan"},me),A.createElement(f,{dimColor:true}," tools")),le>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," \xB7 "),A.createElement(f,{color:"#B19CD9"},N(le)),A.createElement(f,{dimColor:true}," tok")),we>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," \xB7 "),A.createElement(f,{color:"yellow"},we,"s"))))};if(c==="network"){let J=u?.teamSize||0,he=u?.activeAgents||0,K=u?.currentPhase||"executing",re=u?.currentAgent,se=u?.totalInputTokens||t?.input||0,ve=u?.totalOutputTokens||t?.output||0,Be=u?.completedTasks,ce=u?.totalTasks,ee=(()=>{switch(K){case "analyzing":return {text:"Analyzing",color:"cyan"};case "bidding":return {text:"Bidding",color:"yellow"};case "negotiating":return {text:"Negotiating",color:"magenta"};case "executing":return {text:"Executing",color:"green"};case "reviewing":return {text:"Reviewing",color:"blue"};case "complete":return {text:"Complete",color:"green"};default:return {text:"Running",color:"cyan"}}})();return A.createElement(_,{justifyContent:"space-between"},A.createElement(_,null,A.createElement(f,{color:"blue"},"[N]"),A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(f,{color:"blue"},J),A.createElement(f,{dimColor:true}," agents"),he>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"green"},he),A.createElement(f,{dimColor:true}," active)")),A.createElement(f,{dimColor:true}," \u2502 "),s?A.createElement(_,null,A.createElement(si,{type:"dots"}),A.createElement(f,null," "),re?A.createElement(A.Fragment,null,z(re),A.createElement(f,{dimColor:true},": "),A.createElement(f,{color:ee.color},ee.text)):A.createElement(f,{color:ee.color},ee.text),T>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")"))):A.createElement(_,null,ve>0?A.createElement(A.Fragment,null,A.createElement(f,{color:"green",bold:true},"\u25A0"),A.createElement(f,null," "),A.createElement(f,{color:"green"},"Complete!"),T>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")"))):A.createElement(A.Fragment,null,A.createElement(f,{color:"#9B8FD9",bold:true},"\u25CF"),A.createElement(f,null," "),A.createElement(f,{color:"#9B8FD9"},"Ready")))),A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(_,null,Be!==void 0&&ce!==void 0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true},"tasks "),A.createElement(f,{color:"#B19CD9"},Be),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"#B19CD9"},ce),A.createElement(f,{dimColor:true}," \u2502 ")),s&&E>0&&A.createElement(A.Fragment,null,A.createElement(f,{color:"green"},"\u2193 ",Math.floor(E)),A.createElement(f,{dimColor:true}," \u2502 ")),A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"#9B8FD9"},N(se)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"#6FCF97"},N(ve))))}if(c==="cooperate"&&d){let{models:J,phase:he,totalInputTokens:K,totalOutputTokens:re,ccbResult:se,dagProgress:ve}=d,ce=(()=>{switch(he){case "analyzing":return {text:"Analyzing",color:"cyan"};case "ccb_review":return {text:"CCB Review",color:"yellow"};case "dag_planning":return {text:"Planning",color:"magenta"};case "executing":return {text:"Executing",color:"green"};case "complete":return {text:"Complete",color:"green"};default:return {text:"Running",color:"cyan"}}})(),L=()=>J.length===0?null:J.map((me,le)=>{let we=me.status==="running"?"green":me.status==="completed"?"blue":"gray";return A.createElement(A.Fragment,{key:le},le>0&&A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:we},me.shortName))}),ee=J.filter(me=>me.status==="completed").length;return A.createElement(_,{justifyContent:"space-between"},A.createElement(_,null,A.createElement(f,{color:"yellow"},"[C]"),A.createElement(f,{dimColor:true}," \u2502 "),s?A.createElement(_,null,A.createElement(si,{type:"dots"}),A.createElement(f,null," "),e?z(e):A.createElement(f,{color:ce.color},ce.text),T>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")")),E>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ~"),A.createElement(f,{color:"magenta"},Math.floor(E)),A.createElement(f,{dimColor:true}," tok"))):A.createElement(_,null,re>0?A.createElement(A.Fragment,null,A.createElement(f,{color:"green",bold:true},"\u25A0"),A.createElement(f,null," "),A.createElement(f,{color:"green"},"Complete!"),T>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")"))):A.createElement(A.Fragment,null,A.createElement(f,{color:"#9B8FD9",bold:true},"\u25CF"),A.createElement(f,null," "),A.createElement(f,{color:"#9B8FD9"},"Ready")))),A.createElement(_,null,J.length>0&&A.createElement(A.Fragment,null,L(),A.createElement(f,{dimColor:true}," "),A.createElement(f,{color:"#B19CD9"},ee),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"#B19CD9"},J.length),A.createElement(f,{dimColor:true}," \u2502 ")),se&&A.createElement(A.Fragment,null,A.createElement(f,{color:se.approved?"green":"red"},se.approved?"\u2713":"\u2717"),A.createElement(f,{dimColor:true}," CCB "),A.createElement(f,{color:"#B19CD9"},se.approveCount),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"#B19CD9"},se.totalCount),A.createElement(f,{dimColor:true}," \u2502 ")),ve&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true},"DAG "),A.createElement(f,{color:"#B19CD9"},ve.completedNodes),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"#B19CD9"},ve.totalNodes),A.createElement(f,{dimColor:true}," \u2502 ")),A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"cyan"},N(K||t?.input||0)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"green"},N(re||t?.output||0))))}if((c==="assistant"||c==="cooperate")&&be){let J=Pe?.pressure||0,he=Math.round(J*100),K=()=>J>.8?"red":J>.5?"yellow":"green",re=g.length>0,se=Pe?.agentLabel||"Main";return A.createElement(_,{flexDirection:"column"},A.createElement(_,{justifyContent:"space-between"},A.createElement(_,null,A.createElement(f,{color:F.color},F.icon),A.createElement(f,{dimColor:true}," \u2502 "),s?A.createElement(_,null,A.createElement(si,{type:"dots"}),A.createElement(f,null," "),A.createElement(f,{bold:true,color:"#9B8FD9"},"\u25CF"),A.createElement(f,null," "),V&&ae?A.createElement(A.Fragment,null,z(`Streaming: ${ae}`)):z(e||"Thinking..."),T>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")"))):A.createElement(_,null,(Pe?.output||t?.output||0)>0?A.createElement(A.Fragment,null,A.createElement(f,{color:"green",bold:true},"\u25A0"),A.createElement(f,null," "),A.createElement(f,{color:"green"},"Complete!"),T>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")"))):A.createElement(A.Fragment,null,A.createElement(f,{color:"cyan",bold:true},"\u25CF"),A.createElement(f,null," "),A.createElement(f,{color:"cyan"},"Ready")))),A.createElement(_,null,Pe?A.createElement(_,null,A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(f,{dimColor:true},se,": "),A.createElement(f,{color:"cyan"},N(Pe.input)),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"green"},N(Pe.output)),(Pe.cacheCreationTokens||Pe.cacheReadTokens)&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," cache-w "),A.createElement(f,{color:"magenta"},N(Pe.cacheCreationTokens||0)),A.createElement(f,{dimColor:true}," cache-r "),A.createElement(f,{color:"blue"},N(Pe.cacheReadTokens||0))),A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(f,{color:"#B19CD9"},N(Pe.tokensUsedForContext)),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"#B19CD9"},N(Pe.contextWindow)),A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:K()},he,"%"),A.createElement(f,{dimColor:true},")"),Y()):A.createElement(_,null,A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"cyan"},N(t?.input||0)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"green"},N(t?.output||0)),Y()))),re&&g.map((ve,Be)=>Ae(ve,Be===g.length-1)))}let ge=c==="single"&&g.length>0,_e=p<100,fe=p<80,pe=(()=>{if(fe)return Math.max(10,p-40);let J=11;if(s&&T>0&&!fe){let re=` (${M()})`;J+=_l(re);}let he=_e?35:80,K=p-J-he;return Math.max(15,K)})();return fe?A.createElement(_,{flexDirection:"column"},A.createElement(_,null,s?A.createElement(A.Fragment,null,A.createElement(si,{type:"dots"}),A.createElement(f,null," "),A.createElement(f,{color:"cyan"},q(e||"Thinking...",p-5))):A.createElement(A.Fragment,null,A.createElement(f,{color:"green"},"\u2713"),A.createElement(f,null," "),A.createElement(f,{color:"green"},"Done"))),x>0&&A.createElement(_,null,A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"cyan"},N(t?.input||0)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"green"},N(t?.output||0)),A.createElement(f,{dimColor:true}," ctx "),A.createElement(f,{color:U()},W,"%"))):A.createElement(_,{flexDirection:"column",width:"100%"},A.createElement(_,{justifyContent:"space-between",width:"100%"},A.createElement(_,null,!_e&&A.createElement(A.Fragment,null,A.createElement(f,{color:F.color},F.icon),A.createElement(f,{dimColor:true}," \u2502 ")),y?A.createElement(_,null,A.createElement(si,{type:"dots"}),A.createElement(f,null," "),A.createElement(f,{bold:true,color:"#9B8FD9"},"\u25CF"),A.createElement(f,null," "),V&&ae?A.createElement(A.Fragment,null,P(`Streaming: ${ae}`,pe)):P(!s&&h?`Sub-agents running... (${g.length})`:e||"Thinking...",pe),T>0&&!_e&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"yellow"},M()),p>=100&&A.createElement(f,{dimColor:true}," \u2022 esc"),E>0&&p>=120&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," \u2022 "),A.createElement(f,{color:"green"},"\u2193 ",Math.floor(E)," token")),A.createElement(f,{dimColor:true},")"))):A.createElement(_,null,(t?.output||0)>0?A.createElement(A.Fragment,null,A.createElement(f,{color:"#6FCF97",bold:true},"\u25A0"),A.createElement(f,null," "),A.createElement(f,{color:"#6FCF97"},"Complete!"),T>0&&!_e&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")"))):A.createElement(A.Fragment,null,A.createElement(f,{color:"#9B8FD9",bold:true},"\u25CF"),A.createElement(f,null," "),A.createElement(f,{color:"#9B8FD9"},"Ready")))),A.createElement(_,null,x>0?A.createElement(_,null,A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"#9B8FD9"},N(t?.input||0)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"#6FCF97"},N(t?.output||0)),(t?.cacheCreationTokens||t?.cacheReadTokens)&&p>=120&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," c-w "),A.createElement(f,{color:"magenta"},N(t.cacheCreationTokens||0)),A.createElement(f,{dimColor:true}," c-r "),A.createElement(f,{color:"blue"},N(t.cacheReadTokens||0))),!_e&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," \u2502 ctx "),A.createElement(f,{color:"#B19CD9"},N(B)),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"#B19CD9"},N(x))),A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:U()},W,"%"),A.createElement(f,{dimColor:true},")")):A.createElement(f,{dimColor:true},"ctx: --"))),ge&&g.map((J,he)=>Ae(J,he===g.length-1)))},n$=(s,e)=>!s&&!e?true:!s||!e||s.length!==e.length?false:s.every((t,n)=>{let r=e[n];return t.agentId===r.agentId&&t.input===r.input&&t.output===r.output&&t.pressure===r.pressure&&t.tokensUsedForContext===r.tokensUsedForContext&&t.status===r.status&&t.currentTask===r.currentTask&&t.contextWindow===r.contextWindow&&t.cacheCreationTokens===r.cacheCreationTokens&&t.cacheReadTokens===r.cacheReadTokens}),lx=A.memo(t$,(s,e)=>s.isRunning===e.isRunning&&s.statusText===e.statusText&&s.streamingTokens===e.streamingTokens&&s.streamingStartTime===e.streamingStartTime&&s.tokenStats?.input===e.tokenStats?.input&&s.tokenStats?.output===e.tokenStats?.output&&s.tokenStats?.total===e.tokenStats?.total&&s.tokenStats?.pressure===e.tokenStats?.pressure&&s.tokenStats?.cacheCreationTokens===e.tokenStats?.cacheCreationTokens&&s.tokenStats?.cacheReadTokens===e.tokenStats?.cacheReadTokens&&s.runMode===e.runMode&&s.networkStats?.teamSize===e.networkStats?.teamSize&&s.networkStats?.activeAgents===e.networkStats?.activeAgents&&s.networkStats?.currentPhase===e.networkStats?.currentPhase&&s.networkStats?.currentAgent===e.networkStats?.currentAgent&&s.networkStats?.totalInputTokens===e.networkStats?.totalInputTokens&&s.networkStats?.totalOutputTokens===e.networkStats?.totalOutputTokens&&s.networkStats?.completedTasks===e.networkStats?.completedTasks&&s.networkStats?.totalTasks===e.networkStats?.totalTasks&&s.cooperateStats?.phase===e.cooperateStats?.phase&&s.cooperateStats?.totalInputTokens===e.cooperateStats?.totalInputTokens&&s.cooperateStats?.totalOutputTokens===e.cooperateStats?.totalOutputTokens&&s.cooperateStats?.ccbResult?.approved===e.cooperateStats?.ccbResult?.approved&&s.cooperateStats?.ccbResult?.approveCount===e.cooperateStats?.ccbResult?.approveCount&&s.cooperateStats?.dagProgress?.completedNodes===e.cooperateStats?.dagProgress?.completedNodes&&s.cooperateStats?.models?.length===e.cooperateStats?.models?.length&&n$(s.agentContextStats,e.agentContextStats));var cx=({isRunning:s,hasInput:e,customHints:t,menuActive:n=false,thinkingEnabled:r=true,accumulatedRunTime:o=0,provider:i,model:a,runMode:l="single",hasBgTasks:c=false})=>{let{columns:u=80}=Qt(),[d,p]=useState(o);useEffect(()=>{if(!s){p(o);return}p(o);let S=setInterval(()=>{p(E=>E+1);},1e3);return ()=>clearInterval(S)},[s,o]);let g=()=>{if(d<60)return `${d}s`;let S=Math.floor(d/60),E=d%60;if(S<60)return `${S}m ${E}s`;let v=Math.floor(S/60),I=S%60;return `${v}h ${I}m`},h=()=>{if(!i||!a)return "";let S=i,E=i.indexOf(" (");E>0&&(S=i.substring(0,E));let v=a.length>35?a.substring(0,32)+"...":a;return `${S}/${v}`},b=(()=>{switch(l){case "single":return {label:"SINGLE"};case "assistant":return {label:"ASSISTANT"};case "cooperate":return {label:"COOPERATE"};case "network":return {label:"NETWORK"};default:return {label:"SINGLE"}}})(),C=u<100,T=u<80;return t?A.createElement(_,{justifyContent:"space-between"},A.createElement(f,{color:ue.functional.warning},t)):n?null:T?A.createElement(_,{justifyContent:"space-between"},A.createElement(f,{color:ue.text.secondary},"? shortcuts"),A.createElement(_,null,d>0&&A.createElement(A.Fragment,null,A.createElement(f,{color:ue.brand.cyan},g()),A.createElement(f,{color:ue.text.dim}," \u2022 ")),A.createElement(f,{color:ue.brand.purple},b.label))):A.createElement(_,{justifyContent:"space-between"},A.createElement(_,null,c?A.createElement(f,{color:ue.brand.cyan},"tab \u21B9 tasks"):A.createElement(f,{color:ue.text.secondary},"? for shortcuts"),d>0&&A.createElement(A.Fragment,null,A.createElement(f,{color:ue.text.dim}," \u2022 "),A.createElement(f,{color:ue.brand.cyan},g()),!C&&A.createElement(f,{color:ue.text.dim}," session"))),A.createElement(_,null,!C&&A.createElement(A.Fragment,null,A.createElement(f,{color:ue.brand.purple,bold:true},"["),A.createElement(f,{color:ue.brand.purple},b.label),A.createElement(f,{color:ue.brand.purple,bold:true},"]"),A.createElement(f,{color:ue.text.dim}," \u2022 ")),h()&&!C&&A.createElement(A.Fragment,null,A.createElement(f,{color:ue.brand.magenta,bold:true},"["),A.createElement(f,{color:ue.brand.magenta},h()),A.createElement(f,{color:ue.brand.magenta,bold:true},"]"),A.createElement(f,{color:ue.text.dim}," \u2022 ")),r?A.createElement(f,{color:ue.brand.cyan},"Thinking on"):A.createElement(f,{color:ue.text.dim},"Thinking off")))};var ux=({attachments:s,onRemove:e})=>s.length===0?null:A.createElement(_,{flexDirection:"column",paddingLeft:2,marginBottom:1},A.createElement(f,{color:"magenta",dimColor:true},"Attachments:"),s.map((t,n)=>{let r=t.name||t.path?.split("/").pop()||"unknown",o=t.type?.startsWith("image/")||t.mediaType?.startsWith("image/")||r.match(/\.(png|jpg|jpeg|gif|webp)$/i);return A.createElement(_,{key:n},A.createElement(f,{color:"magenta"},o?"\u{1F4CE} \u{1F5BC}\uFE0F ":"\u{1F4CE} ",r),e&&A.createElement(f,{color:"gray",dimColor:true}," (press \u232B Backspace to remove)"))}));var dx=({planSteps:s,isRunning:e=false})=>{let t=s.find(r=>r.status==="pending");if(!t||!e)return null;let n=t.step.length>50?t.step.substring(0,47)+"...":t.step;return A.createElement(_,{paddingLeft:3},A.createElement(f,{dimColor:true},"\u2514\u2500 "),A.createElement(f,{color:"gray"},"\u25CB"),A.createElement(f,{dimColor:true}," Next: "),A.createElement(f,{color:"cyan"},n))};var px=({contextWindow:s,tokensUsed:e,systemTokens:t=0,userTokens:n=0,assistantTokens:r=0,toolCallTokens:o=0,toolResultTokens:i=0,compactionThreshold:a=.8,compressionMode:l="sync",agentContextStats:c=[],runMode:u="single",networkStats:d,onClose:p})=>{let g=D=>D>=1e6?`${(D/1e6).toFixed(1)}M`:D>=1e3?`${(D/1e3).toFixed(1)}k`:D.toString(),h=D=>D>.8?"red":D>.5?"yellow":"green",y=({color:D,label:O,tokens:k,total:M,indent:N=2})=>{let x=M>0?(k/M*100).toFixed(2):"0.00";return A.createElement(_,{marginLeft:N},A.createElement(f,{color:D},"\u25A0"),A.createElement(f,null," ",O,": "),A.createElement(f,{color:"yellow"},g(k)),A.createElement(f,{dimColor:true}," tokens (",x,"%)"))},b=({stat:D,indent:O=2})=>{let k=D.cacheCreationTokens||0,M=D.cacheReadTokens||0,N=D.contextWindow||2e5,x=D.tokensUsedForContext||0,B=N>0?x/N:0,H=Math.round(B*100);return A.createElement(_,{marginLeft:O,justifyContent:"space-between"},A.createElement(_,null,A.createElement(f,{color:"magenta"},D.agentLabel||D.agentId),D.status&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," "),A.createElement(f,{color:D.status==="running"?"green":D.status==="error"?"red":"gray"},D.status==="running"?"\u25CF":D.status==="completed"?"\u2713":D.status==="error"?"\u2717":"\u25CB"))),A.createElement(_,null,A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"cyan"},g(D.input)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"green"},g(D.output)),(k>0||M>0)&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," \u2502 cw "),A.createElement(f,{color:"blue"},g(k)),A.createElement(f,{dimColor:true}," cr "),A.createElement(f,{color:"blue"},g(M))),A.createElement(f,{dimColor:true}," \u2502 ctx "),A.createElement(f,{color:"yellow"},g(x)),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"yellow"},g(N)),A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:h(B)},H,"%"),A.createElement(f,{dimColor:true},")")))},C=({stat:D,indent:O=2})=>{let k=D.contextWindow>0?D.tokensUsedForContext/D.contextWindow:0,M=Math.round(k*100);return A.createElement(_,{marginLeft:O,justifyContent:"space-between"},A.createElement(_,null,A.createElement(f,{color:"magenta"},D.agentLabel||D.agentId),D.status&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," "),A.createElement(f,{color:D.status==="running"?"green":D.status==="error"?"red":"gray"},D.status==="running"?"\u25CF":D.status==="completed"?"\u2713":D.status==="error"?"\u2717":"\u25CB"))),A.createElement(_,null,A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"cyan"},g(D.input)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"green"},g(D.output)),A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(f,{color:"yellow"},g(D.tokensUsedForContext)),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"yellow"},g(D.contextWindow)),A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:h(k)},M,"%"),A.createElement(f,{dimColor:true},")")))};if(u==="network"){let D=d?.teamSize||c.length||0,O=d?.activeAgents||0,k=d?.totalInputTokens||0,M=d?.totalOutputTokens||0,N=k+M,B=(H=>{switch(H){case "analyzing":return {text:"Analyzing",color:"cyan"};case "bidding":return {text:"Bidding",color:"yellow"};case "negotiating":return {text:"Negotiating",color:"magenta"};case "executing":return {text:"Executing",color:"green"};case "reviewing":return {text:"Reviewing",color:"blue"};case "complete":return {text:"Complete",color:"green"};default:return {text:"Idle",color:"gray"}}})(d?.currentPhase);return A.createElement(_,{flexDirection:"column",borderStyle:"round",borderColor:"blue",paddingX:2,paddingY:1},A.createElement(_,{justifyContent:"space-between",marginBottom:1},A.createElement(_,null,A.createElement(f,{color:"blue"},"[N]"),A.createElement(f,{bold:true,color:"blue"}," Network Context Overview")),A.createElement(f,{dimColor:true},"(press ESC to close)")),A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(_,null,A.createElement(f,{dimColor:true},"Team Size: "),A.createElement(f,{color:"blue",bold:true},D),A.createElement(f,{dimColor:true}," agents"),O>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"green"},O),A.createElement(f,{dimColor:true}," active)"))),A.createElement(_,null,A.createElement(f,{dimColor:true},"Current Phase: "),A.createElement(f,{color:B.color,bold:true},B.text),d?.currentAgent&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," - "),A.createElement(f,{color:"cyan"},d.currentAgent))),d?.completedTasks!==void 0&&d?.totalTasks!==void 0&&A.createElement(_,null,A.createElement(f,{dimColor:true},"Tasks: "),A.createElement(f,{color:"yellow"},d.completedTasks),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"yellow"},d.totalTasks),A.createElement(f,{dimColor:true}," completed"))),A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(f,{bold:true,dimColor:true},"Total Token Usage:"),A.createElement(_,{marginLeft:2},A.createElement(f,{dimColor:true},"Input: "),A.createElement(f,{color:"cyan"},g(k)),A.createElement(f,{dimColor:true}," \u2502 Output: "),A.createElement(f,{color:"green"},g(M)),A.createElement(f,{dimColor:true}," \u2502 Total: "),A.createElement(f,{color:"yellow"},g(N)))),c.length>0&&A.createElement(_,{flexDirection:"column"},A.createElement(f,{bold:true,dimColor:true},"Agent Context Details:"),c.map(H=>A.createElement(b,{key:H.agentId,stat:H})),A.createElement(_,{marginTop:1,marginLeft:2},A.createElement(f,{dimColor:true},"Total Tokens: "),A.createElement(f,{color:"yellow"},g(c.reduce((H,W)=>H+W.input+W.output,0))),A.createElement(f,{dimColor:true}," across "),A.createElement(f,{color:"cyan"},c.length),A.createElement(f,{dimColor:true}," agents"))),c.length===0&&A.createElement(_,{marginTop:1},A.createElement(f,{dimColor:true,italic:true},"Agent context details not available yet.")))}if((u==="assistant"||u==="cooperate")&&c.length>0){let D=c.find(W=>W.agentId==="Main"),O=c.filter(W=>W.agentId!=="Main"&&W.agentId!=="supervisor"),k=c.reduce((W,U)=>W+U.tokensUsedForContext,0),M=c.reduce((W,U)=>W+U.input,0),N=c.reduce((W,U)=>W+U.output,0),x=u==="assistant"?"[A]":"[C]",B=u==="assistant"?"Assistant":"Cooperate",H=u==="assistant"?"magenta":"yellow";return A.createElement(_,{flexDirection:"column",borderStyle:"round",borderColor:H,paddingX:2,paddingY:1},A.createElement(_,{justifyContent:"space-between",marginBottom:1},A.createElement(_,null,A.createElement(f,{color:H},x),A.createElement(f,{bold:true,color:H}," ",B," Context Overview")),A.createElement(f,{dimColor:true},"(press ESC to close)")),A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(_,null,A.createElement(f,{dimColor:true},"Total Agents: "),A.createElement(f,{color:H,bold:true},c.length),O.length>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," (1 Main + "),A.createElement(f,{color:"cyan"},O.length),A.createElement(f,{dimColor:true}," Workers)"))),A.createElement(_,null,A.createElement(f,{dimColor:true},"Total Tokens: "),A.createElement(f,{color:"cyan"},g(M)),A.createElement(f,{dimColor:true}," in / "),A.createElement(f,{color:"green"},g(N)),A.createElement(f,{dimColor:true}," out"))),D&&A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(f,{bold:true,dimColor:true},"Main Agent:"),A.createElement(C,{stat:D})),O.length>0&&A.createElement(_,{flexDirection:"column"},A.createElement(f,{bold:true,dimColor:true},"Worker Agents (",O.length,"):"),O.map(W=>A.createElement(C,{key:W.agentId,stat:W}))),A.createElement(_,{marginTop:1},A.createElement(f,{dimColor:true},"Combined Context: "),A.createElement(f,{color:"yellow"},g(k)),A.createElement(f,{dimColor:true}," tokens")))}let T=s-e,S=s>0?e/s:0,E=Math.floor(s*a),v=Math.max(0,E-e),I=Math.round(S*100);return A.createElement(_,{flexDirection:"column",borderStyle:"round",borderColor:"cyan",paddingX:2,paddingY:1},A.createElement(_,{justifyContent:"space-between",marginBottom:1},A.createElement(f,{bold:true,color:"cyan"},"Context Window Details"),A.createElement(f,{dimColor:true},"(press ESC to close)")),A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(_,null,A.createElement(f,{dimColor:true},"Total: "),A.createElement(f,{color:"yellow"},g(e)),A.createElement(f,{dimColor:true}," / "),A.createElement(f,{color:"yellow"},g(s)),A.createElement(f,{dimColor:true}," tokens ("),A.createElement(f,{color:h(S),bold:true},I,"%"),A.createElement(f,{dimColor:true},")")),A.createElement(_,null,A.createElement(f,{dimColor:true},"Remaining: "),A.createElement(f,{color:"green"},g(T)),A.createElement(f,{dimColor:true}," tokens"))),A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(_,null,A.createElement(f,{dimColor:true},"Compression: "),A.createElement(f,{color:l==="sync"?"green":"yellow"},l==="sync"?"Sync LLM":"Async LLM"),A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"cyan"},Math.round(a*100),"%"),A.createElement(f,{dimColor:true}," threshold)"))),v>0?A.createElement(_,{marginBottom:1},A.createElement(f,{dimColor:true},"Compaction in: "),A.createElement(f,{color:"cyan"},g(v)),A.createElement(f,{dimColor:true}," tokens")):A.createElement(_,{marginBottom:1},A.createElement(f,{color:"red",bold:true},"\u26A0\uFE0F Compaction threshold reached!")),A.createElement(_,{flexDirection:"column"},A.createElement(f,{bold:true,dimColor:true},"Context Breakdown:"),A.createElement(y,{color:"magenta",label:"System",tokens:t,total:e}),A.createElement(y,{color:"cyan",label:"User",tokens:n,total:e}),A.createElement(y,{color:"green",label:"Assistant",tokens:r,total:e}),A.createElement(y,{color:"blue",label:"Tool Calls",tokens:o,total:e}),A.createElement(y,{color:"yellow",label:"Tool Results",tokens:i,total:e}),A.createElement(_,{marginTop:1,marginLeft:2},A.createElement(f,{dimColor:true},"Usage: "),A.createElement(f,{color:h(S)},"\u2588".repeat(Math.floor(S*20))),A.createElement(f,{dimColor:true},"\u2591".repeat(20-Math.floor(S*20))))))};function hx(){let s=G(),e=s.slashMenu.categories,t=s.slashMenu.commands;return [{name:"/help",description:t.help,category:e.basic},{name:"/clear",description:t.clear,category:e.basic},{name:"/exit",description:t.exit,category:e.basic},{name:"/mode",description:t.mode,category:e.mode,hasSubMenu:true},{name:"/run",description:t.run,category:e.mode,hasSubMenu:true},{name:"/runconfig",description:t.runconfig,category:e.mode,hasSubMenu:true},{name:"/thinking",description:t.thinking,category:e.mode,hasSubMenu:true},{name:"/approval",description:t.approval,category:e.mode,hasSubMenu:true},{name:"/sandbox",description:t.sandbox,category:e.mode,hasSubMenu:true},{name:"/provider",description:t.provider,category:e.ai,hasSubMenu:true},{name:"/model",description:t.model,category:e.ai,hasSubMenu:true},{name:"/sessions",description:t.sessions,category:e.session},{name:"/session",description:t.session,category:e.session,hasSubMenu:true},{name:"/session-new",description:t.sessionNew,category:e.session},{name:"/session-info",description:t.sessionInfo,category:e.session},{name:"/checkpoint",description:t.checkpoint,category:e.session},{name:"/checkpoints",description:t.checkpoints,category:e.session},{name:"/rollback",description:t.rollback,category:e.session,hasSubMenu:true},{name:"/undo",description:t.undo,category:e.session},{name:"/compact",description:t.compact,category:e.session},{name:"/ps",description:t.ps,category:e.process},{name:"/kill",description:t.kill,category:e.process,hasSubMenu:true},{name:"/skills",description:t.skills,category:e.skills},{name:"/workspace",description:t.workspace,category:e.tools,hasSubMenu:true},{name:"/websearch",description:t.websearch,category:e.tools,hasSubMenu:true},{name:"/mcp",description:t.mcp,category:e.tools,hasSubMenu:true},{name:"/context",description:t.context,category:e.tools,hasSubMenu:true},{name:"/memory",description:t.memory,category:e.tools,hasSubMenu:true},{name:"/remote",description:t.remote,category:e.tools,hasSubMenu:true},{name:"/index",description:t.index,category:e.tools,hasSubMenu:true},{name:"/stats",description:t.tokenStats,category:e.stats},{name:"/cost",description:t.costStats,category:e.stats},{name:"/language",description:t.language,category:e.config,hasSubMenu:true},{name:"/config-clear",description:t.configClear,category:e.config},{name:"/config-reset",description:t.configReset,category:e.config},{name:"/notify",description:t.notify,category:e.config,hasSubMenu:true},{name:"/tts",description:t.tts,category:e.config,hasSubMenu:true},{name:"/experimental",description:t.experimental,category:e.config,hasSubMenu:true},{name:"/update",description:t.update,category:e.config}]}hx();var o$=({isVisible:s,filter:e="",onSelect:t,onCancel:n})=>{let[r,o]=useState(0),[i,a]=useState(0),l=10,c=hx(),u=G(),d=e&&e!=="/"?c.filter(h=>h.name.toLowerCase().includes(e.toLowerCase())||h.description.toLowerCase().includes(e.toLowerCase())):c;useEffect(()=>{o(0),a(0);},[e]),useEffect(()=>{r<i?a(r):r>=i+l&&a(r-l+1);},[r]),ht((h,y)=>{if(s){if(y.escape){n();return}if(y.upArrow){o(b=>b>0?b-1:d.length-1);return}if(y.downArrow){o(b=>b<d.length-1?b+1:0);return}if(y.pageUp||y.ctrl&&h==="u"){o(b=>Math.max(0,b-l));return}if(y.pageDown||y.ctrl&&h==="d"){o(b=>Math.min(d.length-1,b+l));return}if(y.return){d.length>0&&t(d[r].name);return}if(y.tab){d.length>0&&t(d[r].name+" ");return}}},{isActive:s});let p=d.slice(i,i+l),g=A.useMemo(()=>p.map((h,y)=>{let C=i+y===r;return A.createElement(_,{key:h.name},A.createElement(f,{color:C?ue.brand.purple:ue.text.dim},C?"\u276F ":" "),A.createElement(f,{color:C?ue.brand.purple:void 0,bold:C},"\u25CF ",h.name),A.createElement(f,{color:C?ue.brand.magenta:ue.text.secondary}," ","- ",h.description))}),[p,i,r]);return !s||d.length===0?null:A.createElement(_,{flexDirection:"column",paddingLeft:0},A.createElement(f,{color:ue.brand.purple,bold:true},u.slashMenu.title),A.createElement(f,{color:ue.text.secondary},u.common.selectHint),i>0&&A.createElement(f,{color:ue.text.dim}," \u2191 ..."),g,i+l<d.length&&A.createElement(f,{color:ue.text.dim}," \u2193 ..."),A.createElement(f,{color:ue.border.primary},"\u2500".repeat(40)),A.createElement(f,{color:ue.text.secondary},ct(u.slashMenu.commandCount,{count:d.length})," \xB7 ",Math.floor(i/l)+1,"/",Math.ceil(d.length/l)))},fx=A.memo(o$);var c$=({tasks:s,selectedIndex:e,onKill:t,onToggleExpand:n})=>{let{columns:r=80}=Qt(),[o,i]=useState(Date.now()),a=s.some(p=>p.status==="running");if(useEffect(()=>{if(!a)return;let p=setInterval(()=>i(Date.now()),1e3);return ()=>clearInterval(p)},[a]),s.length===0)return null;let l=p=>{let g=Math.floor((o-p)/1e3);if(g<60)return `${g}s`;let h=Math.floor(g/60),y=g%60;return `${h}m${y}s`},c=(p,g)=>p.length<=g?p:p.slice(0,g-3)+"...",u=Math.max(20,r-45),d=(p,g)=>{let h=g===e,y=g===s.length-1,b=p.status==="running"?A.createElement(si,{type:"dots"}):p.status==="done"?A.createElement(f,{color:"green"},"\u2713"):p.status==="error"?A.createElement(f,{color:"red"},"\u2717"):A.createElement(f,{color:"yellow"},"\u2298"),C=p.status==="running"?"cyan":p.status==="done"?"green":p.status==="error"?"red":"yellow",T=p.status==="done"?`exit ${p.exitCode??0}`:p.status;return A.createElement(_,{key:p.id,flexDirection:"column"},A.createElement(_,null,A.createElement(f,{dimColor:true},y?"\u2514 ":"\u251C "),A.createElement(f,{color:h?"white":void 0,bold:h},h?"\u25B8 ":" "),b,A.createElement(f,{dimColor:true}," #",p.id," "),A.createElement(f,{color:h?"white":"cyan",bold:h},c(p.command,u)),A.createElement(f,{dimColor:true}," "),A.createElement(f,{color:C},T),A.createElement(f,{dimColor:true}," "),A.createElement(f,{color:"yellow"},l(p.startTime))),p.expanded&&p.output.length>0&&A.createElement(_,{flexDirection:"column",marginLeft:6},p.output.slice(-5).map((S,E)=>A.createElement(f,{key:E,dimColor:true},S))))};return A.createElement(_,{flexDirection:"column",marginTop:0},A.createElement(_,null,A.createElement(f,{color:ue.brand.purple},"\u250C "),A.createElement(f,{color:ue.brand.purple,bold:true},"Background Tasks"),A.createElement(f,{dimColor:true}," (",s.length,")"),A.createElement(f,{dimColor:true},"\u2500".repeat(Math.max(0,r-25-String(s.length).length)))),s.map((p,g)=>d(p,g)))},yx=A.memo(c$);ne();var u$=({inputValue:s,isRunning:e,statusText:t="",tokenStats:n,streamingTokens:r=0,streamingStartTime:o=null,accumulatedRunTime:i=0,provider:a,model:l,customHints:c,attachments:u=[],multiline:d=false,completions:p=[],menuActive:g=false,promptActive:h=false,promptMessage:y,promptHint:b,promptOnCancel:C,thinkingEnabled:T=true,contextMenuActive:S=false,compressionMode:E="sync",compactionThreshold:v=.85,agentContextStats:I=[],runMode:D="single",networkStats:O,cooperateStats:k,currentPlanSteps:M=[],onInputChange:N,onSubmit:x,onInterrupt:B,onExit:H,onHistoryUp:W,onHistoryDown:U,onTabComplete:z,onRemoveAttachment:q,onContextMenuToggle:P,onAgentContextScreenToggle:$,onPasteImage:F,onShowInterruptInput:V,backgroundTasks:Z=[],bgSelectedIndex:ae=-1,onBgKill:be,onBgRemove:Pe,onBgNavigate:oe,onBgToggleExpand:X})=>{let{columns:te}=Qt(),[Y,Ae]=A.useState(false);A.useEffect(()=>{Z.length===0&&Y&&Ae(false);},[Z.length,Y]),A.useEffect(()=>{s&&Y&&Ae(false);},[s,Y]);let ge=s==="/"||s.startsWith("/")&&!s.includes(" "),_e=A.useCallback(J=>{J.endsWith(" ")?N(J.trim()):(N(""),setTimeout(()=>{x(J);},0));},[N,x]),fe=A.useCallback(()=>{N("");},[N]),Se=A.useRef(0),pe=1200;return ht((J,he)=>{if(process.env.CLI_DEBUG==="1"&&m.debug("INK_INPUT","BottomBar useInput",{key:he,input:J,menuActive:g,promptActive:h,isRunning:e,inputValue:s.substring(0,20)}),!g){if(e&&J==="i"&&!he.ctrl&&!he.meta&&V){m.debug("INK_INPUT",'Interrupt input triggered with "i" key'),V();return}if(he.ctrl&&J==="g"&&$){$();return}if(he.ctrl&&J==="z"){process.env.CLI_DEBUG==="1"&&m.debug("INK_INPUT","Ctrl+Z blocked (prevents suspension)");return}if(he.tab&&Z.length>0&&!e&&!ge){Ae(K=>!K);return}if(Y&&Z.length>0){if(he.upArrow){oe?.("up");return}if(he.downArrow){oe?.("down");return}if(he.return&&ae>=0){X?.();return}}if(he.escape){let K=!J||J==="\x1B"||J==="";if(m.info("INK_INPUT",`ESC detected: isRealEscape=${K}, input=${JSON.stringify(J)}, isRunning=${e}`),!K){m.debug("INK_INPUT","Ignoring escape sequence (not real ESC key)");return}if(S&&P){P();return}if(h&&C){C(),N("");return}if(Y&&Z.length>0&&ae>=0&&ae<Z.length){let re=Z[ae];re.status==="running"?be?.(re.id):Pe?.(re.id);return}if(Y){Ae(false);return}e?(m.info("INK_INPUT","\u{1F6D1} User pressed ESC to interrupt task"),B()):s&&N("");return}if(he.ctrl&&J==="c"){let K=Date.now(),re=K-Se.current<=pe;if(Se.current=K,process.env.CLI_DEBUG==="1"&&m.debug("INK_INPUT","Ctrl+C pressed",{isRunning:e,isSecondPress:re}),re){m.info("INK_INPUT","\u26A0\uFE0F Ctrl+C double-press - force exiting"),H();return}if(e){B();return}m.info("INK_INPUT","\u26A0\uFE0F Ctrl+C pressed - exiting"),H();}}},{isActive:true}),A.createElement(_,{flexDirection:"column"},h&&y&&A.createElement(_,{paddingX:2,paddingY:1},A.createElement(f,{color:"cyan",bold:true},y)),h&&b&&A.createElement(_,{paddingX:2,paddingBottom:1},A.createElement(f,{dimColor:true},b)),!h&&!g&&A.createElement(_,{marginTop:1,width:"100%"},A.createElement(lx,{isRunning:e,statusText:t,tokenStats:n,streamingTokens:r,streamingStartTime:o,provider:a,model:l,onContextMenuToggle:P,agentContextStats:I,runMode:D,networkStats:O,cooperateStats:k})),!h&&!g&&A.createElement(dx,{planSteps:M,isRunning:e}),u.length>0&&A.createElement(ux,{attachments:u,onRemove:q}),!g&&A.createElement(_,{flexDirection:"column"},A.createElement(f,{color:"#9370db"},"\u2500".repeat(te)),A.createElement(ax,{value:s,placeholder:h?b||"Type your answer...":e?"Enter to interrupt and send...":"Type a message...",disabled:g,multiline:d,completions:[],menuActive:g,slashMenuActive:ge,imageCount:u.length,onChange:N,onSubmit:J=>x(J??s),onHistoryUp:W,onHistoryDown:U,onTabComplete:z,onPasteImage:F,onRemoveLastAttachment:q?()=>q(u.length-1):void 0}),A.createElement(f,{color:"#9370db"},"\u2500".repeat(te))),ge&&!g&&!e&&A.createElement(fx,{isVisible:true,filter:s,onSelect:_e,onCancel:fe}),!h&&A.createElement(cx,{isRunning:e,hasInput:s.length>0,customHints:c,menuActive:g,thinkingEnabled:T,accumulatedRunTime:i,provider:a,model:l,runMode:D,hasBgTasks:Z.length>0}),Z.length>0&&A.createElement(yx,{tasks:Z,selectedIndex:Y?ae:-1,onKill:be,onToggleExpand:X}),S&&n?.contextWindow&&P&&A.createElement(px,{contextWindow:n.contextWindow,tokensUsed:n.tokensUsedForContext||n.total,systemTokens:n.systemTokens,userTokens:n.userTokens,assistantTokens:n.assistantTokens,toolCallTokens:n.toolCallTokens,toolResultTokens:n.toolResultTokens,compressionMode:E,compactionThreshold:v,agentContextStats:I,runMode:D,networkStats:O,onClose:P}))},bx=A.memo(u$);var vu="__type_something__",Ah="__chat_about__",vx="__separator__",Ph=({message:s,choices:e,initialIndex:t=0,hint:n,header:r,maxVisible:o=12,allowTextInput:i=false,onSelect:a,onCancel:l,onExit:c})=>{let{columns:u=80,rows:d=24}=Qt(),[p,g]=useState(false),[h,y]=useState(""),b=useMemo(()=>i?[...e,{label:"",value:vx,isSeparator:true},{label:"Type something.",value:vu},{label:"Chat about this",value:Ah}]:e,[e,i]),C=P=>P?P.isSeparator||P.value===""||P.value===vx:false,T=P=>C(b[P]),S=useMemo(()=>{let P=b.findIndex($=>C($));return b[0]?.value==="__back__"&&P>0&&P<=4?P+1:0},[b]),E=useMemo(()=>{let P=Math.max(5,Math.min(10,d-14));return Math.max(5,Math.min(o,P))},[o,d]),v=b.slice(S),I=Math.min(v.length,E),D=(P,$)=>{let F=P;for(let V=0;V<b.length;V++)if(F+=$,F<0&&(F=b.length-1),F>=b.length&&(F=0),!T(F))return F;return P},O=()=>{for(let P=0;P<b.length;P++)if(!T(P))return P;return 0},[k,M]=useState(()=>T(t)?O():t),[N,x]=useState(0),[B,H]=useState(false);useEffect(()=>{T(t)?M(O()):M(t);},[t,b]),useEffect(()=>{let P=setTimeout(()=>H(true),200);return ()=>clearTimeout(P)},[]),useEffect(()=>{if(I<=0){N!==0&&x(0);return}let P=Math.max(0,v.length-I);if(N>P){x(P);return}if(k<S)return;let $=k-S;$<N?x($):$>=N+I&&x($-I+1);},[k,S,v.length,I,N]),ht((P,$)=>{if(p){if($.escape){g(false),y("");return}if($.return&&h.trim()){process.nextTick(()=>a(h.trim()));return}if($.backspace||$.delete){y(F=>F.slice(0,-1));return}P&&!$.ctrl&&!$.meta&&y(F=>F+P);}},{isActive:p}),ht((P,$)=>{if(!p){if($.ctrl&&P==="c"&&c){process.nextTick(()=>c());return}if($.escape&&l){process.nextTick(()=>l());return}if($.upArrow){M(F=>D(F,-1));return}if($.downArrow){M(F=>D(F,1));return}if($.return){if(T(k)||!B)return;let F=b[k].value;if(F===vu){g(true);return}process.nextTick(()=>a(F));}}},{isActive:!p});let W=N>0,U=N+I<v.length,z=P=>{let $=0;for(let F=0;F<=P;F++)!T(F)&&b[F].value!==vu&&b[F].value!==Ah&&$++;return $},q=(P,$)=>{let F=$===k;if(C(P))return A.createElement(_,{key:`sep-${$}`,marginTop:1},A.createElement(f,{dimColor:true},"\u2500".repeat(Math.min(u,120))));let V=F?"\u276F":" ",ae=P.value===vu||P.value===Ah?null:z($),be=ae!==null?" ":" ";return A.createElement(_,{key:`${P.value}-${$}`,flexDirection:"column"},A.createElement(_,null,A.createElement(f,{color:F?"cyan":void 0},V," "),ae!==null&&A.createElement(f,{color:F?"cyan":"white",bold:F},ae,". "),A.createElement(f,{color:F?"cyan":"white",bold:F},P.label)),P.description&&A.createElement(_,null,A.createElement(f,{dimColor:true},be,P.description)))};return p?A.createElement(_,{flexDirection:"column"},r&&A.createElement(_,null,A.createElement(f,{color:"green",bold:true},"\u2610 ",r)),A.createElement(f,null," "),s&&A.createElement(_,null,A.createElement(f,{bold:true},s)),A.createElement(f,null," "),A.createElement(_,null,A.createElement(f,{color:"cyan",bold:true},"\u276F "),A.createElement(f,null,h),A.createElement(f,{color:"cyan"},"\u2588")),A.createElement(f,null," "),A.createElement(_,null,A.createElement(f,{dimColor:true},"Enter to submit \xB7 Esc to go back"))):A.createElement(_,{flexDirection:"column"},r&&A.createElement(_,null,A.createElement(f,{color:"green",bold:true},"\u2610 ",r)),r&&A.createElement(f,null," "),s&&A.createElement(_,null,A.createElement(f,{bold:true},s)),A.createElement(f,null," "),b.slice(0,S).map((P,$)=>q(P,$)),W&&A.createElement(_,null,A.createElement(f,{dimColor:true}," \u2191 ...")),v.slice(N,N+I).map((P,$)=>{let F=S+N+$;return q(P,F)}),U&&A.createElement(_,null,A.createElement(f,{dimColor:true}," \u2193 ...")),A.createElement(f,null," "),A.createElement(_,null,A.createElement(f,{dimColor:true},n||"Enter to select \xB7 \u2191/\u2193 to navigate \xB7 Esc to cancel")))};var wx=({onSubmit:s,onCancel:e})=>{let[t,n]=useState(""),[r,o]=useState(0),i=t.length-r;ht((u,d)=>{if(d.escape){e();return}if(d.return){let p=t.trim();p&&s(p);return}if(d.backspace||d.delete){if(r===t.length)return;let p=i-1,g=t.slice(0,p)+t.slice(p+1);n(g);return}if(d.leftArrow){o(Math.min(r+1,t.length));return}if(d.rightArrow){o(Math.max(r-1,0));return}if(d.home||d.ctrl&&u==="a"){o(t.length);return}if(d.end||d.ctrl&&u==="e"){o(0);return}if(!d.ctrl&&!d.meta&&u){let p=t.slice(0,i)+u+t.slice(i);n(p);return}},{isActive:true});let a=t.slice(0,i),l=t[i]||" ",c=t.slice(i+1);return A.createElement(_,{flexDirection:"column",borderStyle:"double",borderColor:"yellow",paddingX:2,paddingY:1,width:"80%"},A.createElement(_,{marginBottom:1,justifyContent:"center"},A.createElement(f,{bold:true,color:"yellow"},"\u2728 ",G().ui.interruptMessage," - ",G().ui.willSendNextRequest)),A.createElement(_,{flexDirection:"column"},A.createElement(f,{dimColor:true},G().ui.enterYourMessage,":"),A.createElement(_,{marginTop:1},A.createElement(f,{color:"green",bold:true},"\u276F "),t?A.createElement(f,null,a,A.createElement(f,{inverse:true},l),c):A.createElement(_,null,A.createElement(f,{inverse:true}," "),A.createElement(f,{dimColor:true},G().ui.typeMessage)))),A.createElement(_,{marginTop:1,justifyContent:"space-between"},A.createElement(f,{dimColor:true},"Enter: ",G().ui.enterToConfirm),A.createElement(f,{dimColor:true},"ESC: ",G().common.cancel)))};var oi=s=>s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:String(s),d$=s=>{switch(s){case "running":return {icon:"\u25CF",color:"green"};case "waiting":return {icon:"\u25D0",color:"yellow"};case "completed":return {icon:"\u2713",color:"blue"};case "error":return {icon:"\u2717",color:"red"};default:return {icon:"\u25CB",color:"gray"}}},Tx=({agentContextStats:s,onClose:e})=>{let{columns:t}=Qt();ht((r,o)=>{(o.escape||r==="q")&&e();},{isActive:true});let n=[...s].sort((r,o)=>r.agentId==="Main"?-1:o.agentId==="Main"?1:r.agentLabel.localeCompare(o.agentLabel));return A.createElement(_,{flexDirection:"column",width:"100%"},A.createElement(_,{justifyContent:"space-between"},A.createElement(f,{bold:true,color:"cyan"},"Agent Context Overview"),A.createElement(f,{dimColor:true},"ESC to close")),A.createElement(f,{color:"gray"},"\u2500".repeat(Math.max(t,10))),n.length===0?A.createElement(f,{dimColor:true},"No agent context stats available."):n.map(r=>{let o=r.contextWindow||0,i=r.tokensUsedForContext||0,a=o>0?i/o:0,l=Math.round(a*100),{icon:c,color:u}=d$(r.status),d=r.currentTask?r.currentTask.length>40?`${r.currentTask.slice(0,37)}...`:r.currentTask:"";return A.createElement(_,{key:r.agentId,justifyContent:"space-between",marginTop:1},A.createElement(_,null,A.createElement(f,{color:"magenta"},r.agentLabel),A.createElement(f,{dimColor:true}," "),A.createElement(f,{color:u},c),d&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," "),A.createElement(f,{dimColor:true},d))),A.createElement(_,null,A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"cyan"},oi(r.input)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"green"},oi(r.output)),(r.cacheCreationTokens||r.cacheReadTokens)&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," cache-w "),A.createElement(f,{color:"magenta"},oi(r.cacheCreationTokens||0)),A.createElement(f,{dimColor:true}," cache-r "),A.createElement(f,{color:"blue"},oi(r.cacheReadTokens||0))),A.createElement(f,{dimColor:true}," \u2502 context "),A.createElement(f,{color:"yellow"},oi(i)),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"yellow"},oi(o)),A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:a>.8?"red":a>.5?"yellow":"green"},l,"%"),A.createElement(f,{dimColor:true},")")))}),A.createElement(f,{color:"gray"},"\u2500".repeat(Math.max(t,10))),A.createElement(f,{dimColor:true},"Tip: Press Q or ESC to return"))};var xx=({messages:s})=>s.length===0?null:A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(_,null,A.createElement(f,{color:"magenta",bold:true},"\u250C\u2500 "),A.createElement(f,{color:"magenta",bold:true},"Queued (",s.length,")"),A.createElement(f,{color:"magenta",bold:true}," \u2500")),s.map((e,t)=>A.createElement(_,{key:e.id,paddingLeft:1},A.createElement(f,{color:"gray"},"\u2502 "),A.createElement(f,{color:"cyan",bold:true},"> "),A.createElement(f,{color:"white"},e.text.length>70?e.text.substring(0,67)+"...":e.text))),A.createElement(_,null,A.createElement(f,{color:"magenta",bold:true},"\u2514\u2500"),A.createElement(f,{dimColor:true}," Press "),A.createElement(f,{color:"yellow"},"\u2191"),A.createElement(f,{dimColor:true}," to edit queued messages")));var Sx=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],p$=A.memo(({agent:s})=>{let[e,t]=A.useState(0);A.useEffect(()=>{if(s.status!=="running")return;let a=setInterval(()=>t(l=>(l+1)%Sx.length),200);return ()=>clearInterval(a)},[s.status]);let n=s.status==="completed"?"\u2713":s.status==="error"?"\u2717":Sx[e],r=s.status==="completed"?"green":s.status==="error"?"red":"yellow",o=s.status==="completed"?"done":s.status==="error"?"err":s.elapsed>0?`${s.elapsed}s`:"..",i=s.toolCount>0?` ${s.toolCount}t`:"";return A.createElement(f,null,A.createElement(f,{color:r},n),A.createElement(f,{bold:true}," ",s.role),A.createElement(f,{dimColor:true},"(",o,i,")"))}),kx=A.memo(({agents:s})=>s.length===0?null:A.createElement(_,{flexDirection:"row",flexWrap:"wrap"},A.createElement(f,{dimColor:true}," "),s.map((e,t)=>A.createElement(_,{key:e.id,flexDirection:"row"},t>0&&A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(p$,{agent:e})))));Cu();ne();var v$=[".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg"],C$=s=>{let e=new WeakSet;try{return JSON.stringify(s,(t,n)=>{if(typeof n=="bigint")return n.toString();if(n instanceof Error)return {name:n.name,message:n.message,stack:n.stack};if(typeof n=="function")return "[Function]";if(typeof n=="object"&&n!==null){if(e.has(n))return "[Circular]";e.add(n);}return n})}catch{try{return String(s)}catch{return "[Unserializable]"}}};function w$(s){if(!s)return false;let e=s.trim(),t=e.toLowerCase(),n=v$.some(o=>t.endsWith(o)),r=e.startsWith("/")||e.startsWith("./")||e.startsWith("~/")||e.includes("/")&&n;return n&&r}var _x=({staticEntries:s=[],pendingEntries:e=[],isRunning:t,statusText:n="",tokenStats:r,streamingTokens:o=0,streamingStartTime:i=null,accumulatedRunTime:a=0,version:l=ai,provider:c="OpenAI",model:u="gpt-4",workDir:d=process.cwd(),showHeader:p=true,thinkingEnabled:g=true,selectMenuOptions:h=null,textPromptOptions:y=null,contextMenuActive:b=false,agentContextScreenActive:C=false,compressionMode:T="sync",compactionThreshold:S=.85,agentContextStats:E=[],runMode:v="single",networkStats:I,cooperateStats:D,commandOutput:O=[],attachedImages:k=[],interruptInputActive:M=false,queuedMessages:N=[],currentPlanSteps:x=[],sidebarAgents:B=[],backgroundTasks:H=[],bgSelectedIndex:W=-1,onBgKill:U,onBgRemove:z,onBgNavigate:q,onBgToggleExpand:P,getCompletions:$,onStaticRendered:F,onSubmit:V,onInterrupt:Z,onExit:ae,onContextMenuToggle:be,onAgentContextScreenToggle:Pe,onClearCommandOutput:oe,onAttachImage:X,onClearImages:te,onInterruptInputSubmit:Y,onInterruptInputCancel:Ae,onShowInterruptInput:ge,onScrollUp:_e,onScrollDown:fe,onPageUp:Se,onPageDown:pe,onScrollToTop:J,onScrollToBottom:he})=>{let[K,re]=useState(""),[se,ve]=useState([]),[Be,ce]=useState(-1),[L,ee]=useState(null),[me,le]=useState(true),we=useMemo(()=>!$||!K.startsWith("/")?[]:$(K),[K,$]),We=useContext(po);useEffect(()=>{if(!We?.internal_eventEmitter||!X)return;let ie=$e=>{de("CLI_APP",`\u{1F4CE} Received image-paste event from vendor Ink: ${$e.name}`),X($e);};return We.internal_eventEmitter.on("image-paste",ie),()=>{We.internal_eventEmitter.off("image-paste",ie);}},[We,X]),useEffect(()=>{y?.defaultValue&&re(y.defaultValue);},[y?.defaultValue]),ht((ie,$e)=>{if($e.escape){if(C)return;L?ee(null):O.length>0&&oe&&oe();}$e.pageUp&&Se&&Se(),$e.pageDown&&pe&&pe(),$e.upArrow&&$e.ctrl&&_e&&_e(),$e.downArrow&&$e.ctrl&&fe&&fe(),$e.ctrl&&ie==="a"&&$e.shift&&J&&J(),$e.ctrl&&ie==="z"&&$e.shift&&he&&he(),$e.ctrl&&ie==="o"&&le(it=>!it);},{isActive:!h&&!L});let ye=e.filter(ie=>ie.type!=="thinking"&&ie.type!=="reasoning"),Ne=ie=>{if(!ie)return false;let{content:$e}=ie;return typeof $e=="string"?$e.trim().length>0:Array.isArray($e)?$e.some(it=>{if(!it||typeof it!="object"||!("type"in it))return false;switch(it.type){case "text":return typeof it.text=="string"&&it.text.trim().length>0;case "image_url":return true;case "tool_use":return true;case "tool_result":return it.content!==null&&it.content!==void 0&&String(it.content).trim().length>0;case "thinking":return typeof it.thinking=="string"&&it.thinking.trim().length>0;case "redacted_thinking":return typeof it.data=="string"&&it.data.trim().length>0;default:return true}}):false},ot=ie=>{if(ie.message){let db=Ne(ie.message);if(ie.type==="user"&&!db&&process.env.CLI_DEBUG==="1"){let GI=C$(ie.message.content).slice(0,100);de("APP",`User message filtered out! entry.id=${ie.id}, message.role=${ie.message.role}, content=${GI}`);}return db}let $e=typeof ie.text=="string"&&ie.text.trim().length>0,it=ie.type==="plan"&&!!ie.planSteps&&ie.planSteps.length>0,ao=(ie.type==="pipeline_node_start"||ie.type==="pipeline_node_complete"||ie.type==="pipeline_node_fail"||ie.type==="pipeline_node_retry")&&(ie.pipelineNode||ie.pipelineNodeRetry),FI=(ie.type==="network_node_start"||ie.type==="network_node_complete"||ie.type==="network_node_fail")&&ie.networkNode,UI=(ie.type==="ccb_review"||ie.type==="ccb_agent_review"||ie.type==="ccb_retry"||ie.type==="ccb_failed")&&!!(ie.ccbReview||ie.ccbAgentReview||ie.ccbRetry||ie.ccbFailed),jI=ie.type==="pipeline_dag"&&!!ie.pipelineDAG;return !!($e||it||ao||FI||UI||jI)},Ht=useMemo(()=>ye.filter(ot),[ye]),Fr=useMemo(()=>{let ie=s.filter(ot);return process.env.CLI_DEBUG==="1"&&de("APP",`visibleStaticEntries: staticEntries=${s.length}, visible=${ie.length}, types=${ie.map($e=>$e.type).join(",")}`),ie},[s]),br=A.useCallback((ie,$e)=>ie,[]),Sl=useMemo(()=>{let ie=[];return p&&ie.push(A.createElement(OT,{key:"static-header",version:l,provider:c,model:u,workDir:d})),Fr.forEach(($e,it)=>{ie.push(A.createElement(_,{key:`static-entry-${$e.id}`,flexDirection:"column",marginTop:it>0?1:0},A.createElement(_h,{entry:$e,thinkingCollapsed:me})));}),ie},[p,l,c,u,d,Fr]);if(useEffect(()=>{!p&&s.length===0||F?.();},[p,s.length,F]),C)return A.createElement(Tx,{agentContextStats:E,onClose:()=>Pe?.()});let Ai=ie=>{if(y){if(!ie.trim()&&!y.allowEmpty)return;y.onSubmit(ie),re("");return}let $e=k.length>0,it=ie.trim().length>0;(it||$e)&&(it&&ve([...se,ie]),ce(-1),re(""),V(ie,$e?k:void 0));},ws=()=>{if(se.length===0)return;let ie=Be+1;ie<se.length&&(ce(ie),re(se[se.length-1-ie]));},Ur=()=>{if(Be<=0){ce(-1),re("");return}let ie=Be-1;ce(ie),re(se[se.length-1-ie]);},OI=ie=>{if(!$)return null;let $e=$(ie);if($e.length===0)return null;if($e.length===1)return $e[0];let it=$e.map(ao=>({label:ao,value:ao,description:void 0}));return ee({message:"Select completion:",choices:it,initialIndex:0,onSelect:ao=>{re(ao),ee(null);},onCancel:()=>{ee(null);}}),null},BI=v==="assistant";return A.createElement(_,{flexDirection:"column",width:"100%"},A.createElement(Jl,{items:Sl},br),A.createElement(_,{flexDirection:"column",width:"100%"},Ht.map((ie,$e)=>A.createElement(_,{key:`pending-wrapper-${ie.id}`,flexDirection:"column",marginTop:1},A.createElement(_h,{entry:ie,thinkingCollapsed:me}))),!me&&(()=>{let ie=[...e].reverse().find($e=>($e.type==="thinking"||$e.type==="reasoning")&&$e.text);return ie?A.createElement(_,{flexDirection:"column",marginTop:1},A.createElement(f,{color:"cyan",bold:true},"\u25CF Thinking (latest, ctrl+o to collapse)"),A.createElement(_,{key:`thinking-expanded-${ie.id}`,flexDirection:"column",marginTop:1},A.createElement(hu,{content:ie.text,collapsed:false,type:ie.type,timestamp:ie.timestamp,sourceLabel:ie.sourceLabel}))):null})()),A.createElement(f,null,`
|
|
3768
|
+
`,N)+1,ge=z[$+1].length,_e=Math.min(F,ge),fe=Ae+_e;C(s.length-fe);}return}if(te.leftArrow){C(Math.min(b+1,s.length));return}if(te.rightArrow){C(Math.max(b-1,0));return}if(te.home||te.ctrl&&X==="a"){C(s.length);return}if(te.end||te.ctrl&&X==="e"){C(0);return}if(te.backspace||te.delete){if(b===s.length){s.length===0&&a>0&&c&&c();return}let Y=N-1,Ae=s.slice(0,Y)+s.slice(Y+1);u(Ae);return}if(!te.ctrl&&!te.meta&&X){let Y=e$(X);if(!Y){process.env.CLI_DEBUG==="1"&&m.debug("INPUT_LINE","Dropped control/escape-only input chunk");return}let Ae=s.slice(0,N)+Y+s.slice(N);u(Ae);return}}}},{isActive:V});let Pe=!s,oe=()=>Pe?A.createElement(_,null,A.createElement(f,{color:"#9B8FD9",bold:true},"> "),A.createElement(f,{inverse:true}," "),A.createElement(f,{dimColor:true},e)):z.map((X,te)=>{let Y=te===$,Ae=z.slice(0,te).reduce((pe,J)=>pe+J.length+1,0);Ae+X.length;let _e=-1;Y&&(_e=N-Ae);let fe=te===0?"> ":"\u2502 ",Se="#9B8FD9";if(t)return A.createElement(_,{key:te},A.createElement(f,{color:Se,bold:true},fe),A.createElement(f,{dimColor:true},X));if(Y&&_e>=0){let pe=X.slice(0,_e),J=X[_e]||" ",he=X.slice(_e+1);return A.createElement(_,{key:te},A.createElement(f,{color:Se,bold:true},fe),A.createElement(f,null,pe,A.createElement(f,{inverse:true},J),he))}return A.createElement(_,{key:te},A.createElement(f,{color:Se,bold:true},fe),A.createElement(f,null,X))});return A.createElement(_,{flexDirection:"column"},q&&!t&&A.createElement(_,{marginBottom:0},A.createElement(f,{dimColor:true}," \u21B5 ",G().ui.shiftEnterNewline," \u2502 Enter ",G().ui.enterToSend," \u2502 ",ct(G().ui.lineCount,{count:z.length}))),A.createElement(_,{flexDirection:"column"},oe()))};var t$=({isRunning:s,statusText:e="",tokenStats:t,streamingTokens:n=0,streamingStartTime:r=null,provider:o,model:i,onContextMenuToggle:a,agentContextStats:l=[],runMode:c="single",networkStats:u,cooperateStats:d})=>{let{columns:p=80}=Qt(),g=l.filter(J=>J.agentId!=="Main"),h=g.some(J=>J.status==="running"||J.status==="waiting"),y=s||c==="single"&&h,[b,C]=useState(null),[T,S]=useState(0),[E,v]=useState(0),[I,D]=useState(0),[O,k]=useState(0);useEffect(()=>{y?(C(r||Date.now()),S(0)):!y&&(t?.output||0)===0&&(C(null),S(0));},[y,r,t?.output]),useEffect(()=>{if(!y||b===null)return;let J=setInterval(()=>{S(Math.floor((Date.now()-b)/1e3));},500);return ()=>clearInterval(J)},[y,b]),useEffect(()=>{if(!y||n===0){v(0);return}let J=Math.floor(n);if(E===J)return;let he=J-E,K=Math.min(Math.abs(he),20),re=he/K,ve=setInterval(()=>{v(Be=>{let ce=Be+re;return Math.abs(ce-J)<1?J:ce});},50);return ()=>clearInterval(ve)},[n,y,E]),useEffect(()=>{let J=t?.output||0;if(I===J)return;let he=J-I;if(Math.abs(he)>100){D(J);return}let K=Math.max(Math.ceil(Math.abs(he)/10),3),re=he/K,ve=setInterval(()=>{D(Be=>{let ce=Be+re;return Math.abs(ce-J)<1?J:ce});},10);return ()=>clearInterval(ve)},[t?.output,I]),useEffect(()=>{if(!y){k(0);return}let he=(e||"Thinking...").length,K=setInterval(()=>{k(re=>(re+1)%(he+3));},80);return ()=>clearInterval(K)},[y,e]);let M=()=>{if(T<60)return `${T}s`;let J=Math.floor(T/60),he=T%60;return `${J}m ${he}s`},N=J=>J>=1e6?(J/1e6).toFixed(1)+"M":J>=1e3?(J/1e3).toFixed(1)+"K":J.toString(),x=t?.contextWindow||0,B=t?.tokensUsedForContext||t?.total||0,H=t?.pressure||0,W=Math.round(H*100),U=()=>H>.8?"red":H>.5?"yellow":"#B19CD9",z=J=>J.split("").map((K,re)=>{let se=re-O;return se>=0&&se<2?A.createElement(f,{key:re,color:"white",bold:true},K):se>=-1&&se<0?A.createElement(f,{key:re,color:"cyanBright"},K):A.createElement(f,{key:re,color:"cyan"},K)}),q=(J,he)=>{if(!J||_l(J)<=he)return J;let re=0,se=J.length,ve=J;for(;re<se;){let Be=Math.floor((re+se+1)/2),ce=J.slice(0,Be)+"...";_l(ce)<=he?(ve=ce,re=Be):se=Be-1;}return ve},P=(J,he)=>{if(!he||_l(J)<=he)return z(J);let K=q(J,he);return A.createElement(f,{color:"cyan"},K)},F=(()=>{switch(c){case "single":return {icon:"\u25C6",label:"Single",color:"cyan"};case "assistant":return {icon:"\u25C8",label:"Assistant",color:"magenta"};case "cooperate":return {icon:"\u25C7",label:"Cooperate",color:"yellow"};case "network":return {icon:"\u25C9",label:"Network",color:"blue"};default:return {icon:"\u25C6",label:"Single",color:"cyan"}}})(),V=e&&(e.includes("Streaming:")||e.toLowerCase().includes("stream")),Z=e?.match(/Streaming:\s*(\w+)/),ae=Z?Z[1]:null,be=l.length>0,Pe=l.find(J=>J.agentId==="Main"),oe=g.find(J=>J.status==="running")||g.find(J=>J.status==="waiting"),X=g.filter(J=>J.status==="running");X.length>1?`${X.length} agents running: ${X.map(J=>`${J.agentLabel}\u2192${J.currentTask||"..."}`).join(", ")}`:oe?`${oe.agentLabel}: ${oe.currentTask||(oe.status==="waiting"?"Waiting...":"Running...")}`:null;let Y=()=>g.length===0?null:A.createElement(_,null,A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(f,{color:"magenta"},g.length),A.createElement(f,{dimColor:true}," workers")),Ae=(J,he)=>{let K=J.status||"idle",re=K==="running",ve=(ye=>{switch(ye?.toLowerCase()){case "scout":return "cyan";case "explore":return "cyan";case "worker":return "green";case "task":return "green";case "verifier":return "yellow";case "compressor":return "blue";case "coordinator":return "magenta";default:return "magenta"}})(J.workerRole),Be=J.workerRole?J.workerRole.charAt(0).toUpperCase()+J.workerRole.slice(1):J.agentLabel.replace(/-\d+$/,""),ce=p>140?48:p>110?32:20,L=J.workerTask||J.currentTask||"",ee=L.length>ce?L.slice(0,ce-3)+"...":L,me=J.toolUseCount||0,le=J.input+J.output,we=J.elapsedMs?Math.round(J.elapsedMs/1e3):0,We=re?A.createElement(si,{type:"dots"}):K==="waiting"?A.createElement(f,{color:"yellow"},"\u25D0"):K==="completed"?A.createElement(f,{color:"blue"},"\u2713"):K==="error"?A.createElement(f,{color:"red"},"\u2717"):A.createElement(f,{color:"gray"},"\u25CB");return A.createElement(_,{key:J.agentId,justifyContent:"space-between"},A.createElement(_,null,A.createElement(f,{dimColor:true}," ",he?"\u2514\u2500 ":"\u251C\u2500 "),We,A.createElement(f,null," "),A.createElement(f,{color:ve,bold:true},Be),ee&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,null,ee),A.createElement(f,{dimColor:true},")"))),A.createElement(_,null,me>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true},"\xB7 "),A.createElement(f,{color:"cyan"},me),A.createElement(f,{dimColor:true}," tools")),le>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," \xB7 "),A.createElement(f,{color:"#B19CD9"},N(le)),A.createElement(f,{dimColor:true}," tok")),we>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," \xB7 "),A.createElement(f,{color:"yellow"},we,"s"))))};if(c==="network"){let J=u?.teamSize||0,he=u?.activeAgents||0,K=u?.currentPhase||"executing",re=u?.currentAgent,se=u?.totalInputTokens||t?.input||0,ve=u?.totalOutputTokens||t?.output||0,Be=u?.completedTasks,ce=u?.totalTasks,ee=(()=>{switch(K){case "analyzing":return {text:"Analyzing",color:"cyan"};case "bidding":return {text:"Bidding",color:"yellow"};case "negotiating":return {text:"Negotiating",color:"magenta"};case "executing":return {text:"Executing",color:"green"};case "reviewing":return {text:"Reviewing",color:"blue"};case "complete":return {text:"Complete",color:"green"};default:return {text:"Running",color:"cyan"}}})();return A.createElement(_,{justifyContent:"space-between"},A.createElement(_,null,A.createElement(f,{color:"blue"},"[N]"),A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(f,{color:"blue"},J),A.createElement(f,{dimColor:true}," agents"),he>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"green"},he),A.createElement(f,{dimColor:true}," active)")),A.createElement(f,{dimColor:true}," \u2502 "),s?A.createElement(_,null,A.createElement(si,{type:"dots"}),A.createElement(f,null," "),re?A.createElement(A.Fragment,null,z(re),A.createElement(f,{dimColor:true},": "),A.createElement(f,{color:ee.color},ee.text)):A.createElement(f,{color:ee.color},ee.text),T>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")"))):A.createElement(_,null,ve>0?A.createElement(A.Fragment,null,A.createElement(f,{color:"green",bold:true},"\u25A0"),A.createElement(f,null," "),A.createElement(f,{color:"green"},"Complete!"),T>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")"))):A.createElement(A.Fragment,null,A.createElement(f,{color:"#9B8FD9",bold:true},"\u25CF"),A.createElement(f,null," "),A.createElement(f,{color:"#9B8FD9"},"Ready")))),A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(_,null,Be!==void 0&&ce!==void 0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true},"tasks "),A.createElement(f,{color:"#B19CD9"},Be),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"#B19CD9"},ce),A.createElement(f,{dimColor:true}," \u2502 ")),s&&E>0&&A.createElement(A.Fragment,null,A.createElement(f,{color:"green"},"\u2193 ",Math.floor(E)),A.createElement(f,{dimColor:true}," \u2502 ")),A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"#9B8FD9"},N(se)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"#6FCF97"},N(ve))))}if(c==="cooperate"&&d){let{models:J,phase:he,totalInputTokens:K,totalOutputTokens:re,ccbResult:se,dagProgress:ve}=d,ce=(()=>{switch(he){case "analyzing":return {text:"Analyzing",color:"cyan"};case "ccb_review":return {text:"CCB Review",color:"yellow"};case "dag_planning":return {text:"Planning",color:"magenta"};case "executing":return {text:"Executing",color:"green"};case "complete":return {text:"Complete",color:"green"};default:return {text:"Running",color:"cyan"}}})(),L=()=>J.length===0?null:J.map((me,le)=>{let we=me.status==="running"?"green":me.status==="completed"?"blue":"gray";return A.createElement(A.Fragment,{key:le},le>0&&A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:we},me.shortName))}),ee=J.filter(me=>me.status==="completed").length;return A.createElement(_,{justifyContent:"space-between"},A.createElement(_,null,A.createElement(f,{color:"yellow"},"[C]"),A.createElement(f,{dimColor:true}," \u2502 "),s?A.createElement(_,null,A.createElement(si,{type:"dots"}),A.createElement(f,null," "),e?z(e):A.createElement(f,{color:ce.color},ce.text),T>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")")),E>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ~"),A.createElement(f,{color:"magenta"},Math.floor(E)),A.createElement(f,{dimColor:true}," tok"))):A.createElement(_,null,re>0?A.createElement(A.Fragment,null,A.createElement(f,{color:"green",bold:true},"\u25A0"),A.createElement(f,null," "),A.createElement(f,{color:"green"},"Complete!"),T>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")"))):A.createElement(A.Fragment,null,A.createElement(f,{color:"#9B8FD9",bold:true},"\u25CF"),A.createElement(f,null," "),A.createElement(f,{color:"#9B8FD9"},"Ready")))),A.createElement(_,null,J.length>0&&A.createElement(A.Fragment,null,L(),A.createElement(f,{dimColor:true}," "),A.createElement(f,{color:"#B19CD9"},ee),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"#B19CD9"},J.length),A.createElement(f,{dimColor:true}," \u2502 ")),se&&A.createElement(A.Fragment,null,A.createElement(f,{color:se.approved?"green":"red"},se.approved?"\u2713":"\u2717"),A.createElement(f,{dimColor:true}," CCB "),A.createElement(f,{color:"#B19CD9"},se.approveCount),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"#B19CD9"},se.totalCount),A.createElement(f,{dimColor:true}," \u2502 ")),ve&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true},"DAG "),A.createElement(f,{color:"#B19CD9"},ve.completedNodes),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"#B19CD9"},ve.totalNodes),A.createElement(f,{dimColor:true}," \u2502 ")),A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"cyan"},N(K||t?.input||0)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"green"},N(re||t?.output||0))))}if((c==="assistant"||c==="cooperate")&&be){let J=Pe?.pressure||0,he=Math.round(J*100),K=()=>J>.8?"red":J>.5?"yellow":"green",re=g.length>0,se=Pe?.agentLabel||"Main";return A.createElement(_,{flexDirection:"column"},A.createElement(_,{justifyContent:"space-between"},A.createElement(_,null,A.createElement(f,{color:F.color},F.icon),A.createElement(f,{dimColor:true}," \u2502 "),s?A.createElement(_,null,A.createElement(si,{type:"dots"}),A.createElement(f,null," "),A.createElement(f,{bold:true,color:"#9B8FD9"},"\u25CF"),A.createElement(f,null," "),V&&ae?A.createElement(A.Fragment,null,z(`Streaming: ${ae}`)):z(e||"Thinking..."),T>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")"))):A.createElement(_,null,(Pe?.output||t?.output||0)>0?A.createElement(A.Fragment,null,A.createElement(f,{color:"green",bold:true},"\u25A0"),A.createElement(f,null," "),A.createElement(f,{color:"green"},"Complete!"),T>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")"))):A.createElement(A.Fragment,null,A.createElement(f,{color:"cyan",bold:true},"\u25CF"),A.createElement(f,null," "),A.createElement(f,{color:"cyan"},"Ready")))),A.createElement(_,null,Pe?A.createElement(_,null,A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(f,{dimColor:true},se,": "),A.createElement(f,{color:"cyan"},N(Pe.input)),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"green"},N(Pe.output)),(Pe.cacheCreationTokens||Pe.cacheReadTokens)&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," cache-w "),A.createElement(f,{color:"magenta"},N(Pe.cacheCreationTokens||0)),A.createElement(f,{dimColor:true}," cache-r "),A.createElement(f,{color:"blue"},N(Pe.cacheReadTokens||0))),A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(f,{color:"#B19CD9"},N(Pe.tokensUsedForContext)),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"#B19CD9"},N(Pe.contextWindow)),A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:K()},he,"%"),A.createElement(f,{dimColor:true},")"),Y()):A.createElement(_,null,A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"cyan"},N(t?.input||0)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"green"},N(t?.output||0)),Y()))),re&&g.map((ve,Be)=>Ae(ve,Be===g.length-1)))}let ge=c==="single"&&g.length>0,_e=p<100,fe=p<80,pe=(()=>{if(fe)return Math.max(10,p-40);let J=11;if(s&&T>0&&!fe){let re=` (${M()})`;J+=_l(re);}let he=_e?35:80,K=p-J-he;return Math.max(15,K)})();return fe?A.createElement(_,{flexDirection:"column"},A.createElement(_,null,s?A.createElement(A.Fragment,null,A.createElement(si,{type:"dots"}),A.createElement(f,null," "),A.createElement(f,{color:"cyan"},q(e||"Thinking...",p-5))):A.createElement(A.Fragment,null,A.createElement(f,{color:"green"},"\u2713"),A.createElement(f,null," "),A.createElement(f,{color:"green"},"Done"))),x>0&&A.createElement(_,null,A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"cyan"},N(t?.input||0)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"green"},N(t?.output||0)),A.createElement(f,{dimColor:true}," ctx "),A.createElement(f,{color:U()},W,"%"))):A.createElement(_,{flexDirection:"column",width:"100%"},A.createElement(_,{justifyContent:"space-between",width:"100%"},A.createElement(_,null,!_e&&A.createElement(A.Fragment,null,A.createElement(f,{color:F.color},F.icon),A.createElement(f,{dimColor:true}," \u2502 ")),y?A.createElement(_,null,A.createElement(si,{type:"dots"}),A.createElement(f,null," "),A.createElement(f,{bold:true,color:"#9B8FD9"},"\u25CF"),A.createElement(f,null," "),V&&ae?A.createElement(A.Fragment,null,P(`Streaming: ${ae}`,pe)):P(!s&&h?`Sub-agents running... (${g.length})`:e||"Thinking...",pe),T>0&&!_e&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"yellow"},M()),p>=100&&A.createElement(f,{dimColor:true}," \u2022 esc"),E>0&&p>=120&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," \u2022 "),A.createElement(f,{color:"green"},"\u2193 ",Math.floor(E)," token")),A.createElement(f,{dimColor:true},")"))):A.createElement(_,null,(t?.output||0)>0?A.createElement(A.Fragment,null,A.createElement(f,{color:"#6FCF97",bold:true},"\u25A0"),A.createElement(f,null," "),A.createElement(f,{color:"#6FCF97"},"Complete!"),T>0&&!_e&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"#B19CD9"},M()),A.createElement(f,{dimColor:true},")"))):A.createElement(A.Fragment,null,A.createElement(f,{color:"#9B8FD9",bold:true},"\u25CF"),A.createElement(f,null," "),A.createElement(f,{color:"#9B8FD9"},"Ready")))),A.createElement(_,null,x>0?A.createElement(_,null,A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"#9B8FD9"},N(t?.input||0)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"#6FCF97"},N(t?.output||0)),(t?.cacheCreationTokens||t?.cacheReadTokens)&&p>=120&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," c-w "),A.createElement(f,{color:"magenta"},N(t.cacheCreationTokens||0)),A.createElement(f,{dimColor:true}," c-r "),A.createElement(f,{color:"blue"},N(t.cacheReadTokens||0))),!_e&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," \u2502 ctx "),A.createElement(f,{color:"#B19CD9"},N(B)),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"#B19CD9"},N(x))),A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:U()},W,"%"),A.createElement(f,{dimColor:true},")")):A.createElement(f,{dimColor:true},"ctx: --"))),ge&&g.map((J,he)=>Ae(J,he===g.length-1)))},n$=(s,e)=>!s&&!e?true:!s||!e||s.length!==e.length?false:s.every((t,n)=>{let r=e[n];return t.agentId===r.agentId&&t.input===r.input&&t.output===r.output&&t.pressure===r.pressure&&t.tokensUsedForContext===r.tokensUsedForContext&&t.status===r.status&&t.currentTask===r.currentTask&&t.contextWindow===r.contextWindow&&t.cacheCreationTokens===r.cacheCreationTokens&&t.cacheReadTokens===r.cacheReadTokens}),lx=A.memo(t$,(s,e)=>s.isRunning===e.isRunning&&s.statusText===e.statusText&&s.streamingTokens===e.streamingTokens&&s.streamingStartTime===e.streamingStartTime&&s.tokenStats?.input===e.tokenStats?.input&&s.tokenStats?.output===e.tokenStats?.output&&s.tokenStats?.total===e.tokenStats?.total&&s.tokenStats?.pressure===e.tokenStats?.pressure&&s.tokenStats?.cacheCreationTokens===e.tokenStats?.cacheCreationTokens&&s.tokenStats?.cacheReadTokens===e.tokenStats?.cacheReadTokens&&s.runMode===e.runMode&&s.networkStats?.teamSize===e.networkStats?.teamSize&&s.networkStats?.activeAgents===e.networkStats?.activeAgents&&s.networkStats?.currentPhase===e.networkStats?.currentPhase&&s.networkStats?.currentAgent===e.networkStats?.currentAgent&&s.networkStats?.totalInputTokens===e.networkStats?.totalInputTokens&&s.networkStats?.totalOutputTokens===e.networkStats?.totalOutputTokens&&s.networkStats?.completedTasks===e.networkStats?.completedTasks&&s.networkStats?.totalTasks===e.networkStats?.totalTasks&&s.cooperateStats?.phase===e.cooperateStats?.phase&&s.cooperateStats?.totalInputTokens===e.cooperateStats?.totalInputTokens&&s.cooperateStats?.totalOutputTokens===e.cooperateStats?.totalOutputTokens&&s.cooperateStats?.ccbResult?.approved===e.cooperateStats?.ccbResult?.approved&&s.cooperateStats?.ccbResult?.approveCount===e.cooperateStats?.ccbResult?.approveCount&&s.cooperateStats?.dagProgress?.completedNodes===e.cooperateStats?.dagProgress?.completedNodes&&s.cooperateStats?.models?.length===e.cooperateStats?.models?.length&&n$(s.agentContextStats,e.agentContextStats));var cx=({isRunning:s,hasInput:e,customHints:t,menuActive:n=false,thinkingEnabled:r=true,accumulatedRunTime:o=0,provider:i,model:a,runMode:l="single",hasBgTasks:c=false})=>{let{columns:u=80}=Qt(),[d,p]=useState(o);useEffect(()=>{if(!s){p(o);return}p(o);let S=setInterval(()=>{p(E=>E+1);},1e3);return ()=>clearInterval(S)},[s,o]);let g=()=>{if(d<60)return `${d}s`;let S=Math.floor(d/60),E=d%60;if(S<60)return `${S}m ${E}s`;let v=Math.floor(S/60),I=S%60;return `${v}h ${I}m`},h=()=>{if(!i||!a)return "";let S=i,E=i.indexOf(" (");E>0&&(S=i.substring(0,E));let v=a.length>35?a.substring(0,32)+"...":a;return `${S}/${v}`},b=(()=>{switch(l){case "single":return {label:"SINGLE"};case "assistant":return {label:"ASSISTANT"};case "cooperate":return {label:"COOPERATE"};case "network":return {label:"NETWORK"};default:return {label:"SINGLE"}}})(),C=u<100,T=u<80;return t?A.createElement(_,{justifyContent:"space-between"},A.createElement(f,{color:ue.functional.warning},t)):n?null:T?A.createElement(_,{justifyContent:"space-between"},A.createElement(f,{color:ue.text.secondary},"? shortcuts"),A.createElement(_,null,d>0&&A.createElement(A.Fragment,null,A.createElement(f,{color:ue.brand.cyan},g()),A.createElement(f,{color:ue.text.dim}," \u2022 ")),A.createElement(f,{color:ue.brand.purple},b.label))):A.createElement(_,{justifyContent:"space-between"},A.createElement(_,null,c?A.createElement(f,{color:ue.brand.cyan},"tab \u21B9 tasks"):A.createElement(f,{color:ue.text.secondary},"? for shortcuts"),d>0&&A.createElement(A.Fragment,null,A.createElement(f,{color:ue.text.dim}," \u2022 "),A.createElement(f,{color:ue.brand.cyan},g()),!C&&A.createElement(f,{color:ue.text.dim}," session"))),A.createElement(_,null,!C&&A.createElement(A.Fragment,null,A.createElement(f,{color:ue.brand.purple,bold:true},"["),A.createElement(f,{color:ue.brand.purple},b.label),A.createElement(f,{color:ue.brand.purple,bold:true},"]"),A.createElement(f,{color:ue.text.dim}," \u2022 ")),h()&&!C&&A.createElement(A.Fragment,null,A.createElement(f,{color:ue.brand.magenta,bold:true},"["),A.createElement(f,{color:ue.brand.magenta},h()),A.createElement(f,{color:ue.brand.magenta,bold:true},"]"),A.createElement(f,{color:ue.text.dim}," \u2022 ")),r?A.createElement(f,{color:ue.brand.cyan},"Thinking on"):A.createElement(f,{color:ue.text.dim},"Thinking off")))};var ux=({attachments:s,onRemove:e})=>s.length===0?null:A.createElement(_,{flexDirection:"column",paddingLeft:2,marginBottom:1},A.createElement(f,{color:"magenta",dimColor:true},"Attachments:"),s.map((t,n)=>{let r=t.name||t.path?.split("/").pop()||"unknown",o=t.type?.startsWith("image/")||t.mediaType?.startsWith("image/")||r.match(/\.(png|jpg|jpeg|gif|webp)$/i);return A.createElement(_,{key:n},A.createElement(f,{color:"magenta"},o?"\u{1F4CE} \u{1F5BC}\uFE0F ":"\u{1F4CE} ",r),e&&A.createElement(f,{color:"gray",dimColor:true}," (press \u232B Backspace to remove)"))}));var dx=({planSteps:s,isRunning:e=false})=>{let t=s.find(r=>r.status==="pending");if(!t||!e)return null;let n=t.step.length>50?t.step.substring(0,47)+"...":t.step;return A.createElement(_,{paddingLeft:3},A.createElement(f,{dimColor:true},"\u2514\u2500 "),A.createElement(f,{color:"gray"},"\u25CB"),A.createElement(f,{dimColor:true}," Next: "),A.createElement(f,{color:"cyan"},n))};var px=({contextWindow:s,tokensUsed:e,systemTokens:t=0,userTokens:n=0,assistantTokens:r=0,toolCallTokens:o=0,toolResultTokens:i=0,compactionThreshold:a=.8,compressionMode:l="sync",agentContextStats:c=[],runMode:u="single",networkStats:d,onClose:p})=>{let g=D=>D>=1e6?`${(D/1e6).toFixed(1)}M`:D>=1e3?`${(D/1e3).toFixed(1)}k`:D.toString(),h=D=>D>.8?"red":D>.5?"yellow":"green",y=({color:D,label:O,tokens:k,total:M,indent:N=2})=>{let x=M>0?(k/M*100).toFixed(2):"0.00";return A.createElement(_,{marginLeft:N},A.createElement(f,{color:D},"\u25A0"),A.createElement(f,null," ",O,": "),A.createElement(f,{color:"yellow"},g(k)),A.createElement(f,{dimColor:true}," tokens (",x,"%)"))},b=({stat:D,indent:O=2})=>{let k=D.cacheCreationTokens||0,M=D.cacheReadTokens||0,N=D.contextWindow||2e5,x=D.tokensUsedForContext||0,B=N>0?x/N:0,H=Math.round(B*100);return A.createElement(_,{marginLeft:O,justifyContent:"space-between"},A.createElement(_,null,A.createElement(f,{color:"magenta"},D.agentLabel||D.agentId),D.status&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," "),A.createElement(f,{color:D.status==="running"?"green":D.status==="error"?"red":"gray"},D.status==="running"?"\u25CF":D.status==="completed"?"\u2713":D.status==="error"?"\u2717":"\u25CB"))),A.createElement(_,null,A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"cyan"},g(D.input)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"green"},g(D.output)),(k>0||M>0)&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," \u2502 cw "),A.createElement(f,{color:"blue"},g(k)),A.createElement(f,{dimColor:true}," cr "),A.createElement(f,{color:"blue"},g(M))),A.createElement(f,{dimColor:true}," \u2502 ctx "),A.createElement(f,{color:"yellow"},g(x)),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"yellow"},g(N)),A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:h(B)},H,"%"),A.createElement(f,{dimColor:true},")")))},C=({stat:D,indent:O=2})=>{let k=D.contextWindow>0?D.tokensUsedForContext/D.contextWindow:0,M=Math.round(k*100);return A.createElement(_,{marginLeft:O,justifyContent:"space-between"},A.createElement(_,null,A.createElement(f,{color:"magenta"},D.agentLabel||D.agentId),D.status&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," "),A.createElement(f,{color:D.status==="running"?"green":D.status==="error"?"red":"gray"},D.status==="running"?"\u25CF":D.status==="completed"?"\u2713":D.status==="error"?"\u2717":"\u25CB"))),A.createElement(_,null,A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"cyan"},g(D.input)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"green"},g(D.output)),A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(f,{color:"yellow"},g(D.tokensUsedForContext)),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"yellow"},g(D.contextWindow)),A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:h(k)},M,"%"),A.createElement(f,{dimColor:true},")")))};if(u==="network"){let D=d?.teamSize||c.length||0,O=d?.activeAgents||0,k=d?.totalInputTokens||0,M=d?.totalOutputTokens||0,N=k+M,B=(H=>{switch(H){case "analyzing":return {text:"Analyzing",color:"cyan"};case "bidding":return {text:"Bidding",color:"yellow"};case "negotiating":return {text:"Negotiating",color:"magenta"};case "executing":return {text:"Executing",color:"green"};case "reviewing":return {text:"Reviewing",color:"blue"};case "complete":return {text:"Complete",color:"green"};default:return {text:"Idle",color:"gray"}}})(d?.currentPhase);return A.createElement(_,{flexDirection:"column",borderStyle:"round",borderColor:"blue",paddingX:2,paddingY:1},A.createElement(_,{justifyContent:"space-between",marginBottom:1},A.createElement(_,null,A.createElement(f,{color:"blue"},"[N]"),A.createElement(f,{bold:true,color:"blue"}," Network Context Overview")),A.createElement(f,{dimColor:true},"(press ESC to close)")),A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(_,null,A.createElement(f,{dimColor:true},"Team Size: "),A.createElement(f,{color:"blue",bold:true},D),A.createElement(f,{dimColor:true}," agents"),O>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"green"},O),A.createElement(f,{dimColor:true}," active)"))),A.createElement(_,null,A.createElement(f,{dimColor:true},"Current Phase: "),A.createElement(f,{color:B.color,bold:true},B.text),d?.currentAgent&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," - "),A.createElement(f,{color:"cyan"},d.currentAgent))),d?.completedTasks!==void 0&&d?.totalTasks!==void 0&&A.createElement(_,null,A.createElement(f,{dimColor:true},"Tasks: "),A.createElement(f,{color:"yellow"},d.completedTasks),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"yellow"},d.totalTasks),A.createElement(f,{dimColor:true}," completed"))),A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(f,{bold:true,dimColor:true},"Total Token Usage:"),A.createElement(_,{marginLeft:2},A.createElement(f,{dimColor:true},"Input: "),A.createElement(f,{color:"cyan"},g(k)),A.createElement(f,{dimColor:true}," \u2502 Output: "),A.createElement(f,{color:"green"},g(M)),A.createElement(f,{dimColor:true}," \u2502 Total: "),A.createElement(f,{color:"yellow"},g(N)))),c.length>0&&A.createElement(_,{flexDirection:"column"},A.createElement(f,{bold:true,dimColor:true},"Agent Context Details:"),c.map(H=>A.createElement(b,{key:H.agentId,stat:H})),A.createElement(_,{marginTop:1,marginLeft:2},A.createElement(f,{dimColor:true},"Total Tokens: "),A.createElement(f,{color:"yellow"},g(c.reduce((H,W)=>H+W.input+W.output,0))),A.createElement(f,{dimColor:true}," across "),A.createElement(f,{color:"cyan"},c.length),A.createElement(f,{dimColor:true}," agents"))),c.length===0&&A.createElement(_,{marginTop:1},A.createElement(f,{dimColor:true,italic:true},"Agent context details not available yet.")))}if((u==="assistant"||u==="cooperate")&&c.length>0){let D=c.find(W=>W.agentId==="Main"),O=c.filter(W=>W.agentId!=="Main"&&W.agentId!=="supervisor"),k=c.reduce((W,U)=>W+U.tokensUsedForContext,0),M=c.reduce((W,U)=>W+U.input,0),N=c.reduce((W,U)=>W+U.output,0),x=u==="assistant"?"[A]":"[C]",B=u==="assistant"?"Assistant":"Cooperate",H=u==="assistant"?"magenta":"yellow";return A.createElement(_,{flexDirection:"column",borderStyle:"round",borderColor:H,paddingX:2,paddingY:1},A.createElement(_,{justifyContent:"space-between",marginBottom:1},A.createElement(_,null,A.createElement(f,{color:H},x),A.createElement(f,{bold:true,color:H}," ",B," Context Overview")),A.createElement(f,{dimColor:true},"(press ESC to close)")),A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(_,null,A.createElement(f,{dimColor:true},"Total Agents: "),A.createElement(f,{color:H,bold:true},c.length),O.length>0&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," (1 Main + "),A.createElement(f,{color:"cyan"},O.length),A.createElement(f,{dimColor:true}," Workers)"))),A.createElement(_,null,A.createElement(f,{dimColor:true},"Total Tokens: "),A.createElement(f,{color:"cyan"},g(M)),A.createElement(f,{dimColor:true}," in / "),A.createElement(f,{color:"green"},g(N)),A.createElement(f,{dimColor:true}," out"))),D&&A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(f,{bold:true,dimColor:true},"Main Agent:"),A.createElement(C,{stat:D})),O.length>0&&A.createElement(_,{flexDirection:"column"},A.createElement(f,{bold:true,dimColor:true},"Worker Agents (",O.length,"):"),O.map(W=>A.createElement(C,{key:W.agentId,stat:W}))),A.createElement(_,{marginTop:1},A.createElement(f,{dimColor:true},"Combined Context: "),A.createElement(f,{color:"yellow"},g(k)),A.createElement(f,{dimColor:true}," tokens")))}let T=s-e,S=s>0?e/s:0,E=Math.floor(s*a),v=Math.max(0,E-e),I=Math.round(S*100);return A.createElement(_,{flexDirection:"column",borderStyle:"round",borderColor:"cyan",paddingX:2,paddingY:1},A.createElement(_,{justifyContent:"space-between",marginBottom:1},A.createElement(f,{bold:true,color:"cyan"},"Context Window Details"),A.createElement(f,{dimColor:true},"(press ESC to close)")),A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(_,null,A.createElement(f,{dimColor:true},"Total: "),A.createElement(f,{color:"yellow"},g(e)),A.createElement(f,{dimColor:true}," / "),A.createElement(f,{color:"yellow"},g(s)),A.createElement(f,{dimColor:true}," tokens ("),A.createElement(f,{color:h(S),bold:true},I,"%"),A.createElement(f,{dimColor:true},")")),A.createElement(_,null,A.createElement(f,{dimColor:true},"Remaining: "),A.createElement(f,{color:"green"},g(T)),A.createElement(f,{dimColor:true}," tokens"))),A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(_,null,A.createElement(f,{dimColor:true},"Compression: "),A.createElement(f,{color:l==="sync"?"green":"yellow"},l==="sync"?"Sync LLM":"Async LLM"),A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:"cyan"},Math.round(a*100),"%"),A.createElement(f,{dimColor:true}," threshold)"))),v>0?A.createElement(_,{marginBottom:1},A.createElement(f,{dimColor:true},"Compaction in: "),A.createElement(f,{color:"cyan"},g(v)),A.createElement(f,{dimColor:true}," tokens")):A.createElement(_,{marginBottom:1},A.createElement(f,{color:"red",bold:true},"\u26A0\uFE0F Compaction threshold reached!")),A.createElement(_,{flexDirection:"column"},A.createElement(f,{bold:true,dimColor:true},"Context Breakdown:"),A.createElement(y,{color:"magenta",label:"System",tokens:t,total:e}),A.createElement(y,{color:"cyan",label:"User",tokens:n,total:e}),A.createElement(y,{color:"green",label:"Assistant",tokens:r,total:e}),A.createElement(y,{color:"blue",label:"Tool Calls",tokens:o,total:e}),A.createElement(y,{color:"yellow",label:"Tool Results",tokens:i,total:e}),A.createElement(_,{marginTop:1,marginLeft:2},A.createElement(f,{dimColor:true},"Usage: "),A.createElement(f,{color:h(S)},"\u2588".repeat(Math.floor(S*20))),A.createElement(f,{dimColor:true},"\u2591".repeat(20-Math.floor(S*20))))))};function hx(){let s=G(),e=s.slashMenu.categories,t=s.slashMenu.commands;return [{name:"/help",description:t.help,category:e.basic},{name:"/clear",description:t.clear,category:e.basic},{name:"/exit",description:t.exit,category:e.basic},{name:"/mode",description:t.mode,category:e.mode,hasSubMenu:true},{name:"/run",description:t.run,category:e.mode,hasSubMenu:true},{name:"/runconfig",description:t.runconfig,category:e.mode,hasSubMenu:true},{name:"/thinking",description:t.thinking,category:e.mode,hasSubMenu:true},{name:"/approval",description:t.approval,category:e.mode,hasSubMenu:true},{name:"/sandbox",description:t.sandbox,category:e.mode,hasSubMenu:true},{name:"/provider",description:t.provider,category:e.ai,hasSubMenu:true},{name:"/model",description:t.model,category:e.ai,hasSubMenu:true},{name:"/sessions",description:t.sessions,category:e.session},{name:"/session",description:t.session,category:e.session,hasSubMenu:true},{name:"/session-new",description:t.sessionNew,category:e.session},{name:"/session-info",description:t.sessionInfo,category:e.session},{name:"/checkpoint",description:t.checkpoint,category:e.session},{name:"/checkpoints",description:t.checkpoints,category:e.session},{name:"/rollback",description:t.rollback,category:e.session,hasSubMenu:true},{name:"/undo",description:t.undo,category:e.session},{name:"/compact",description:t.compact,category:e.session},{name:"/ps",description:t.ps,category:e.process},{name:"/kill",description:t.kill,category:e.process,hasSubMenu:true},{name:"/skills",description:t.skills,category:e.skills},{name:"/workspace",description:t.workspace,category:e.tools,hasSubMenu:true},{name:"/websearch",description:t.websearch,category:e.tools,hasSubMenu:true},{name:"/mcp",description:t.mcp,category:e.tools,hasSubMenu:true},{name:"/context",description:t.context,category:e.tools,hasSubMenu:true},{name:"/memory",description:t.memory,category:e.tools,hasSubMenu:true},{name:"/remote",description:t.remote,category:e.tools,hasSubMenu:true},{name:"/index",description:t.index,category:e.tools,hasSubMenu:true},{name:"/stats",description:t.tokenStats,category:e.stats},{name:"/cost",description:t.costStats,category:e.stats},{name:"/language",description:t.language,category:e.config,hasSubMenu:true},{name:"/config-clear",description:t.configClear,category:e.config},{name:"/config-reset",description:t.configReset,category:e.config},{name:"/notify",description:t.notify,category:e.config,hasSubMenu:true},{name:"/tts",description:t.tts,category:e.config,hasSubMenu:true},{name:"/experimental",description:t.experimental,category:e.config,hasSubMenu:true},{name:"/update",description:t.update,category:e.config}]}hx();var o$=({isVisible:s,filter:e="",onSelect:t,onCancel:n})=>{let[r,o]=useState(0),[i,a]=useState(0),l=10,c=hx(),u=G(),d=e&&e!=="/"?c.filter(h=>h.name.toLowerCase().includes(e.toLowerCase())||h.description.toLowerCase().includes(e.toLowerCase())):c;useEffect(()=>{o(0),a(0);},[e]),useEffect(()=>{r<i?a(r):r>=i+l&&a(r-l+1);},[r]),ht((h,y)=>{if(s){if(y.escape){n();return}if(y.upArrow){o(b=>b>0?b-1:d.length-1);return}if(y.downArrow){o(b=>b<d.length-1?b+1:0);return}if(y.pageUp||y.ctrl&&h==="u"){o(b=>Math.max(0,b-l));return}if(y.pageDown||y.ctrl&&h==="d"){o(b=>Math.min(d.length-1,b+l));return}if(y.return){d.length>0&&t(d[r].name);return}if(y.tab){d.length>0&&t(d[r].name+" ");return}}},{isActive:s});let p=d.slice(i,i+l),g=A.useMemo(()=>p.map((h,y)=>{let C=i+y===r;return A.createElement(_,{key:h.name},A.createElement(f,{color:C?ue.brand.purple:ue.text.dim},C?"\u276F ":" "),A.createElement(f,{color:C?ue.brand.purple:void 0,bold:C},"\u25CF ",h.name),A.createElement(f,{color:C?ue.brand.magenta:ue.text.secondary}," ","- ",h.description))}),[p,i,r]);return !s||d.length===0?null:A.createElement(_,{flexDirection:"column",paddingLeft:0},A.createElement(f,{color:ue.brand.purple,bold:true},u.slashMenu.title),A.createElement(f,{color:ue.text.secondary},u.common.selectHint),i>0&&A.createElement(f,{color:ue.text.dim}," \u2191 ..."),g,i+l<d.length&&A.createElement(f,{color:ue.text.dim}," \u2193 ..."),A.createElement(f,{color:ue.border.primary},"\u2500".repeat(40)),A.createElement(f,{color:ue.text.secondary},ct(u.slashMenu.commandCount,{count:d.length})," \xB7 ",Math.floor(i/l)+1,"/",Math.ceil(d.length/l)))},fx=A.memo(o$);var c$=({tasks:s,selectedIndex:e,onKill:t,onToggleExpand:n})=>{let{columns:r=80}=Qt(),[o,i]=useState(Date.now()),a=s.some(p=>p.status==="running");if(useEffect(()=>{if(!a)return;let p=setInterval(()=>i(Date.now()),1e3);return ()=>clearInterval(p)},[a]),s.length===0)return null;let l=p=>{let g=Math.floor((o-p)/1e3);if(g<60)return `${g}s`;let h=Math.floor(g/60),y=g%60;return `${h}m${y}s`},c=(p,g)=>p.length<=g?p:p.slice(0,g-3)+"...",u=Math.max(20,r-45),d=(p,g)=>{let h=g===e,y=g===s.length-1,b=p.status==="running"?A.createElement(si,{type:"dots"}):p.status==="done"?A.createElement(f,{color:"green"},"\u2713"):p.status==="error"?A.createElement(f,{color:"red"},"\u2717"):A.createElement(f,{color:"yellow"},"\u2298"),C=p.status==="running"?"cyan":p.status==="done"?"green":p.status==="error"?"red":"yellow",T=p.status==="done"?`exit ${p.exitCode??0}`:p.status;return A.createElement(_,{key:p.id,flexDirection:"column"},A.createElement(_,null,A.createElement(f,{dimColor:true},y?"\u2514 ":"\u251C "),A.createElement(f,{color:h?"white":void 0,bold:h},h?"\u25B8 ":" "),b,A.createElement(f,{dimColor:true}," #",p.id," "),A.createElement(f,{color:h?"white":"cyan",bold:h},c(p.command,u)),A.createElement(f,{dimColor:true}," "),A.createElement(f,{color:C},T),A.createElement(f,{dimColor:true}," "),A.createElement(f,{color:"yellow"},l(p.startTime))),p.expanded&&p.output.length>0&&A.createElement(_,{flexDirection:"column",marginLeft:6},p.output.slice(-5).map((S,E)=>A.createElement(f,{key:E,dimColor:true},S))))};return A.createElement(_,{flexDirection:"column",marginTop:0},A.createElement(_,null,A.createElement(f,{color:ue.brand.purple},"\u250C "),A.createElement(f,{color:ue.brand.purple,bold:true},"Background Tasks"),A.createElement(f,{dimColor:true}," (",s.length,")"),A.createElement(f,{dimColor:true},"\u2500".repeat(Math.max(0,r-25-String(s.length).length)))),s.map((p,g)=>d(p,g)))},yx=A.memo(c$);ne();var u$=({inputValue:s,isRunning:e,statusText:t="",tokenStats:n,streamingTokens:r=0,streamingStartTime:o=null,accumulatedRunTime:i=0,provider:a,model:l,customHints:c,attachments:u=[],multiline:d=false,completions:p=[],menuActive:g=false,promptActive:h=false,promptMessage:y,promptHint:b,promptOnCancel:C,thinkingEnabled:T=true,contextMenuActive:S=false,compressionMode:E="sync",compactionThreshold:v=.85,agentContextStats:I=[],runMode:D="single",networkStats:O,cooperateStats:k,currentPlanSteps:M=[],onInputChange:N,onSubmit:x,onInterrupt:B,onExit:H,onHistoryUp:W,onHistoryDown:U,onTabComplete:z,onRemoveAttachment:q,onContextMenuToggle:P,onAgentContextScreenToggle:$,onPasteImage:F,onShowInterruptInput:V,backgroundTasks:Z=[],bgSelectedIndex:ae=-1,onBgKill:be,onBgRemove:Pe,onBgNavigate:oe,onBgToggleExpand:X})=>{let{columns:te}=Qt(),[Y,Ae]=A.useState(false);A.useEffect(()=>{Z.length===0&&Y&&Ae(false);},[Z.length,Y]),A.useEffect(()=>{s&&Y&&Ae(false);},[s,Y]);let ge=s==="/"||s.startsWith("/")&&!s.includes(" "),_e=A.useCallback(J=>{J.endsWith(" ")?N(J.trim()):(N(""),setTimeout(()=>{x(J);},0));},[N,x]),fe=A.useCallback(()=>{N("");},[N]),Se=A.useRef(0),pe=1200;return ht((J,he)=>{if(process.env.CLI_DEBUG==="1"&&m.debug("INK_INPUT","BottomBar useInput",{key:he,input:J,menuActive:g,promptActive:h,isRunning:e,inputValue:s.substring(0,20)}),!g){if(e&&J==="i"&&!he.ctrl&&!he.meta&&V){m.debug("INK_INPUT",'Interrupt input triggered with "i" key'),V();return}if(he.ctrl&&J==="g"&&$){$();return}if(he.ctrl&&J==="z"){process.env.CLI_DEBUG==="1"&&m.debug("INK_INPUT","Ctrl+Z blocked (prevents suspension)");return}if(he.tab&&Z.length>0&&!e&&!ge){Ae(K=>!K);return}if(Y&&Z.length>0){if(he.upArrow){oe?.("up");return}if(he.downArrow){oe?.("down");return}if(he.return&&ae>=0){X?.();return}}if(he.escape){let K=!J||J==="\x1B"||J==="";if(m.info("INK_INPUT",`ESC detected: isRealEscape=${K}, input=${JSON.stringify(J)}, isRunning=${e}`),!K){m.debug("INK_INPUT","Ignoring escape sequence (not real ESC key)");return}if(S&&P){P();return}if(h&&C){C(),N("");return}if(Y&&Z.length>0&&ae>=0&&ae<Z.length){let re=Z[ae];re.status==="running"?be?.(re.id):Pe?.(re.id);return}if(Y){Ae(false);return}e?(m.info("INK_INPUT","\u{1F6D1} User pressed ESC to interrupt task"),B()):s&&N("");return}if(he.ctrl&&J==="c"){let K=Date.now(),re=K-Se.current<=pe;if(Se.current=K,process.env.CLI_DEBUG==="1"&&m.debug("INK_INPUT","Ctrl+C pressed",{isRunning:e,isSecondPress:re}),re){m.info("INK_INPUT","\u26A0\uFE0F Ctrl+C double-press - force exiting"),H();return}if(e){B();return}m.info("INK_INPUT","\u26A0\uFE0F Ctrl+C pressed - exiting"),H();}}},{isActive:true}),A.createElement(_,{flexDirection:"column"},h&&y&&A.createElement(_,{paddingX:2,paddingY:1},A.createElement(f,{color:"cyan",bold:true},y)),h&&b&&A.createElement(_,{paddingX:2,paddingBottom:1},A.createElement(f,{dimColor:true},b)),!h&&!g&&A.createElement(_,{marginTop:1,width:"100%"},A.createElement(lx,{isRunning:e,statusText:t,tokenStats:n,streamingTokens:r,streamingStartTime:o,provider:a,model:l,onContextMenuToggle:P,agentContextStats:I,runMode:D,networkStats:O,cooperateStats:k})),!h&&!g&&A.createElement(dx,{planSteps:M,isRunning:e}),u.length>0&&A.createElement(ux,{attachments:u,onRemove:q}),!g&&A.createElement(_,{flexDirection:"column"},A.createElement(f,{color:"#9370db"},"\u2500".repeat(te)),A.createElement(ax,{value:s,placeholder:h?b||"Type your answer...":e?"Enter to interrupt and send...":"Type a message...",disabled:g,multiline:d,completions:[],menuActive:g,slashMenuActive:ge,imageCount:u.length,onChange:N,onSubmit:J=>x(J??s),onHistoryUp:W,onHistoryDown:U,onTabComplete:z,onPasteImage:F,onRemoveLastAttachment:q?()=>q(u.length-1):void 0}),A.createElement(f,{color:"#9370db"},"\u2500".repeat(te))),ge&&!g&&!e&&A.createElement(fx,{isVisible:true,filter:s,onSelect:_e,onCancel:fe}),!h&&A.createElement(cx,{isRunning:e,hasInput:s.length>0,customHints:c,menuActive:g,thinkingEnabled:T,accumulatedRunTime:i,provider:a,model:l,runMode:D,hasBgTasks:Z.length>0}),Z.length>0&&A.createElement(yx,{tasks:Z,selectedIndex:Y?ae:-1,onKill:be,onToggleExpand:X}),S&&n?.contextWindow&&P&&A.createElement(px,{contextWindow:n.contextWindow,tokensUsed:n.tokensUsedForContext||n.total,systemTokens:n.systemTokens,userTokens:n.userTokens,assistantTokens:n.assistantTokens,toolCallTokens:n.toolCallTokens,toolResultTokens:n.toolResultTokens,compressionMode:E,compactionThreshold:v,agentContextStats:I,runMode:D,networkStats:O,onClose:P}))},bx=A.memo(u$);var vu="__type_something__",Ah="__chat_about__",vx="__separator__",Ph=({message:s,choices:e,initialIndex:t=0,hint:n,header:r,maxVisible:o=12,allowTextInput:i=false,onSelect:a,onCancel:l,onExit:c})=>{let{columns:u=80,rows:d=24}=Qt(),[p,g]=useState(false),[h,y]=useState(""),b=useMemo(()=>i?[...e,{label:"",value:vx,isSeparator:true},{label:"Type something.",value:vu},{label:"Chat about this",value:Ah}]:e,[e,i]),C=P=>P?P.isSeparator||P.value===""||P.value===vx:false,T=P=>C(b[P]),S=useMemo(()=>{let P=b.findIndex($=>C($));return b[0]?.value==="__back__"&&P>0&&P<=4?P+1:0},[b]),E=useMemo(()=>{let P=Math.max(5,Math.min(10,d-14));return Math.max(5,Math.min(o,P))},[o,d]),v=b.slice(S),I=Math.min(v.length,E),D=(P,$)=>{let F=P;for(let V=0;V<b.length;V++)if(F+=$,F<0&&(F=b.length-1),F>=b.length&&(F=0),!T(F))return F;return P},O=()=>{for(let P=0;P<b.length;P++)if(!T(P))return P;return 0},[k,M]=useState(()=>T(t)?O():t),[N,x]=useState(0),[B,H]=useState(false);useEffect(()=>{T(t)?M(O()):M(t);},[t,b]),useEffect(()=>{let P=setTimeout(()=>H(true),200);return ()=>clearTimeout(P)},[]),useEffect(()=>{if(I<=0){N!==0&&x(0);return}let P=Math.max(0,v.length-I);if(N>P){x(P);return}if(k<S)return;let $=k-S;$<N?x($):$>=N+I&&x($-I+1);},[k,S,v.length,I,N]),ht((P,$)=>{if(p){if($.escape){g(false),y("");return}if($.return&&h.trim()){process.nextTick(()=>a(h.trim()));return}if($.backspace||$.delete){y(F=>F.slice(0,-1));return}P&&!$.ctrl&&!$.meta&&y(F=>F+P);}},{isActive:p}),ht((P,$)=>{if(!p){if($.ctrl&&P==="c"&&c){process.nextTick(()=>c());return}if($.escape&&l){process.nextTick(()=>l());return}if($.upArrow){M(F=>D(F,-1));return}if($.downArrow){M(F=>D(F,1));return}if($.return){if(T(k)||!B)return;let F=b[k].value;if(F===vu){g(true);return}process.nextTick(()=>a(F));}}},{isActive:!p});let W=N>0,U=N+I<v.length,z=P=>{let $=0;for(let F=0;F<=P;F++)!T(F)&&b[F].value!==vu&&b[F].value!==Ah&&$++;return $},q=(P,$)=>{let F=$===k;if(C(P))return A.createElement(_,{key:`sep-${$}`,marginTop:1},A.createElement(f,{dimColor:true},"\u2500".repeat(Math.min(u,120))));let V=F?"\u276F":" ",ae=P.value===vu||P.value===Ah?null:z($),be=ae!==null?" ":" ";return A.createElement(_,{key:`${P.value}-${$}`,flexDirection:"column"},A.createElement(_,null,A.createElement(f,{color:F?"cyan":void 0},V," "),ae!==null&&A.createElement(f,{color:F?"cyan":"white",bold:F},ae,". "),A.createElement(f,{color:F?"cyan":"white",bold:F},P.label)),P.description&&A.createElement(_,null,A.createElement(f,{dimColor:true},be,P.description)))};return p?A.createElement(_,{flexDirection:"column"},r&&A.createElement(_,null,A.createElement(f,{color:"green",bold:true},"\u2610 ",r)),A.createElement(f,null," "),s&&A.createElement(_,null,A.createElement(f,{bold:true},s)),A.createElement(f,null," "),A.createElement(_,null,A.createElement(f,{color:"cyan",bold:true},"\u276F "),A.createElement(f,null,h),A.createElement(f,{color:"cyan"},"\u2588")),A.createElement(f,null," "),A.createElement(_,null,A.createElement(f,{dimColor:true},"Enter to submit \xB7 Esc to go back"))):A.createElement(_,{flexDirection:"column"},r&&A.createElement(_,null,A.createElement(f,{color:"green",bold:true},"\u2610 ",r)),r&&A.createElement(f,null," "),s&&A.createElement(_,null,A.createElement(f,{bold:true},s)),A.createElement(f,null," "),b.slice(0,S).map((P,$)=>q(P,$)),W&&A.createElement(_,null,A.createElement(f,{dimColor:true}," \u2191 ...")),v.slice(N,N+I).map((P,$)=>{let F=S+N+$;return q(P,F)}),U&&A.createElement(_,null,A.createElement(f,{dimColor:true}," \u2193 ...")),A.createElement(f,null," "),A.createElement(_,null,A.createElement(f,{dimColor:true},n||"Enter to select \xB7 \u2191/\u2193 to navigate \xB7 Esc to cancel")))};var wx=({onSubmit:s,onCancel:e})=>{let[t,n]=useState(""),[r,o]=useState(0),i=t.length-r;ht((u,d)=>{if(d.escape){e();return}if(d.return){let p=t.trim();p&&s(p);return}if(d.backspace||d.delete){if(r===t.length)return;let p=i-1,g=t.slice(0,p)+t.slice(p+1);n(g);return}if(d.leftArrow){o(Math.min(r+1,t.length));return}if(d.rightArrow){o(Math.max(r-1,0));return}if(d.home||d.ctrl&&u==="a"){o(t.length);return}if(d.end||d.ctrl&&u==="e"){o(0);return}if(!d.ctrl&&!d.meta&&u){let p=t.slice(0,i)+u+t.slice(i);n(p);return}},{isActive:true});let a=t.slice(0,i),l=t[i]||" ",c=t.slice(i+1);return A.createElement(_,{flexDirection:"column",borderStyle:"double",borderColor:"yellow",paddingX:2,paddingY:1,width:"80%"},A.createElement(_,{marginBottom:1,justifyContent:"center"},A.createElement(f,{bold:true,color:"yellow"},"\u2728 ",G().ui.interruptMessage," - ",G().ui.willSendNextRequest)),A.createElement(_,{flexDirection:"column"},A.createElement(f,{dimColor:true},G().ui.enterYourMessage,":"),A.createElement(_,{marginTop:1},A.createElement(f,{color:"green",bold:true},"\u276F "),t?A.createElement(f,null,a,A.createElement(f,{inverse:true},l),c):A.createElement(_,null,A.createElement(f,{inverse:true}," "),A.createElement(f,{dimColor:true},G().ui.typeMessage)))),A.createElement(_,{marginTop:1,justifyContent:"space-between"},A.createElement(f,{dimColor:true},"Enter: ",G().ui.enterToConfirm),A.createElement(f,{dimColor:true},"ESC: ",G().common.cancel)))};var oi=s=>s>=1e6?`${(s/1e6).toFixed(1)}M`:s>=1e3?`${(s/1e3).toFixed(1)}K`:String(s),d$=s=>{switch(s){case "running":return {icon:"\u25CF",color:"green"};case "waiting":return {icon:"\u25D0",color:"yellow"};case "completed":return {icon:"\u2713",color:"blue"};case "error":return {icon:"\u2717",color:"red"};default:return {icon:"\u25CB",color:"gray"}}},Tx=({agentContextStats:s,onClose:e})=>{let{columns:t}=Qt();ht((r,o)=>{(o.escape||r==="q")&&e();},{isActive:true});let n=[...s].sort((r,o)=>r.agentId==="Main"?-1:o.agentId==="Main"?1:r.agentLabel.localeCompare(o.agentLabel));return A.createElement(_,{flexDirection:"column",width:"100%"},A.createElement(_,{justifyContent:"space-between"},A.createElement(f,{bold:true,color:"cyan"},"Agent Context Overview"),A.createElement(f,{dimColor:true},"ESC to close")),A.createElement(f,{color:"gray"},"\u2500".repeat(Math.max(t,10))),n.length===0?A.createElement(f,{dimColor:true},"No agent context stats available."):n.map(r=>{let o=r.contextWindow||0,i=r.tokensUsedForContext||0,a=o>0?i/o:0,l=Math.round(a*100),{icon:c,color:u}=d$(r.status),d=r.currentTask?r.currentTask.length>40?`${r.currentTask.slice(0,37)}...`:r.currentTask:"";return A.createElement(_,{key:r.agentId,justifyContent:"space-between",marginTop:1},A.createElement(_,null,A.createElement(f,{color:"magenta"},r.agentLabel),A.createElement(f,{dimColor:true}," "),A.createElement(f,{color:u},c),d&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," "),A.createElement(f,{dimColor:true},d))),A.createElement(_,null,A.createElement(f,{dimColor:true},"in "),A.createElement(f,{color:"cyan"},oi(r.input)),A.createElement(f,{dimColor:true}," out "),A.createElement(f,{color:"green"},oi(r.output)),(r.cacheCreationTokens||r.cacheReadTokens)&&A.createElement(A.Fragment,null,A.createElement(f,{dimColor:true}," cache-w "),A.createElement(f,{color:"magenta"},oi(r.cacheCreationTokens||0)),A.createElement(f,{dimColor:true}," cache-r "),A.createElement(f,{color:"blue"},oi(r.cacheReadTokens||0))),A.createElement(f,{dimColor:true}," \u2502 context "),A.createElement(f,{color:"yellow"},oi(i)),A.createElement(f,{dimColor:true},"/"),A.createElement(f,{color:"yellow"},oi(o)),A.createElement(f,{dimColor:true}," ("),A.createElement(f,{color:a>.8?"red":a>.5?"yellow":"green"},l,"%"),A.createElement(f,{dimColor:true},")")))}),A.createElement(f,{color:"gray"},"\u2500".repeat(Math.max(t,10))),A.createElement(f,{dimColor:true},"Tip: Press Q or ESC to return"))};var xx=({messages:s})=>s.length===0?null:A.createElement(_,{flexDirection:"column",marginBottom:1},A.createElement(_,null,A.createElement(f,{color:"magenta",bold:true},"\u250C\u2500 "),A.createElement(f,{color:"magenta",bold:true},"Queued (",s.length,")"),A.createElement(f,{color:"magenta",bold:true}," \u2500")),s.map((e,t)=>A.createElement(_,{key:e.id,paddingLeft:1},A.createElement(f,{color:"gray"},"\u2502 "),A.createElement(f,{color:"cyan",bold:true},"> "),A.createElement(f,{color:"white"},e.text.length>70?e.text.substring(0,67)+"...":e.text))),A.createElement(_,null,A.createElement(f,{color:"magenta",bold:true},"\u2514\u2500"),A.createElement(f,{dimColor:true}," Press "),A.createElement(f,{color:"yellow"},"\u2191"),A.createElement(f,{dimColor:true}," to edit queued messages")));var Sx=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],p$=A.memo(({agent:s})=>{let[e,t]=A.useState(0);A.useEffect(()=>{if(s.status!=="running")return;let a=setInterval(()=>t(l=>(l+1)%Sx.length),200);return ()=>clearInterval(a)},[s.status]);let n=s.status==="completed"?"\u2713":s.status==="error"?"\u2717":Sx[e],r=s.status==="completed"?"green":s.status==="error"?"red":"yellow",o=s.status==="completed"?"done":s.status==="error"?"err":s.elapsed>0?`${s.elapsed}s`:"..",i=s.toolCount>0?` ${s.toolCount}t`:"";return A.createElement(f,null,A.createElement(f,{color:r},n),A.createElement(f,{bold:true}," ",s.role),A.createElement(f,{dimColor:true},"(",o,i,")"))}),kx=A.memo(({agents:s})=>s.length===0?null:A.createElement(_,{flexDirection:"row",flexWrap:"wrap"},A.createElement(f,{dimColor:true}," "),s.map((e,t)=>A.createElement(_,{key:e.id,flexDirection:"row"},t>0&&A.createElement(f,{dimColor:true}," \u2502 "),A.createElement(p$,{agent:e})))));Cu();ne();var v$=[".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg"],C$=s=>{let e=new WeakSet;try{return JSON.stringify(s,(t,n)=>{if(typeof n=="bigint")return n.toString();if(n instanceof Error)return {name:n.name,message:n.message,stack:n.stack};if(typeof n=="function")return "[Function]";if(typeof n=="object"&&n!==null){if(e.has(n))return "[Circular]";e.add(n);}return n})}catch{try{return String(s)}catch{return "[Unserializable]"}}};function w$(s){if(!s)return false;let e=s.trim(),t=e.toLowerCase(),n=v$.some(o=>t.endsWith(o)),r=e.startsWith("/")||e.startsWith("./")||e.startsWith("~/")||e.includes("/")&&n;return n&&r}var _x=({staticEntries:s=[],pendingEntries:e=[],isRunning:t,statusText:n="",tokenStats:r,streamingTokens:o=0,streamingStartTime:i=null,accumulatedRunTime:a=0,version:l=ai,provider:c="OpenAI",model:u="gpt-4",workDir:d=process.cwd(),showHeader:p=true,thinkingEnabled:g=true,selectMenuOptions:h=null,textPromptOptions:y=null,contextMenuActive:b=false,agentContextScreenActive:C=false,compressionMode:T="sync",compactionThreshold:S=.85,agentContextStats:E=[],runMode:v="single",networkStats:I,cooperateStats:D,commandOutput:O=[],attachedImages:k=[],interruptInputActive:M=false,queuedMessages:N=[],currentPlanSteps:x=[],sidebarAgents:B=[],backgroundTasks:H=[],bgSelectedIndex:W=-1,onBgKill:U,onBgRemove:z,onBgNavigate:q,onBgToggleExpand:P,getCompletions:$,onStaticRendered:F,onSubmit:V,onInterrupt:Z,onExit:ae,onContextMenuToggle:be,onAgentContextScreenToggle:Pe,onClearCommandOutput:oe,onAttachImage:X,onClearImages:te,onInterruptInputSubmit:Y,onInterruptInputCancel:Ae,onShowInterruptInput:ge,onScrollUp:_e,onScrollDown:fe,onPageUp:Se,onPageDown:pe,onScrollToTop:J,onScrollToBottom:he})=>{let[K,re]=useState(""),[se,ve]=useState([]),[Be,ce]=useState(-1),[L,ee]=useState(null),[me,le]=useState(true),we=useMemo(()=>!$||!K.startsWith("/")?[]:$(K),[K,$]),We=useContext(po);useEffect(()=>{if(!We?.internal_eventEmitter||!X)return;let ie=$e=>{de("CLI_APP",`\u{1F4CE} Received image-paste event from vendor Ink: ${$e.name}`),X($e);};return We.internal_eventEmitter.on("image-paste",ie),()=>{We.internal_eventEmitter.off("image-paste",ie);}},[We,X]),useEffect(()=>{y?.defaultValue&&re(y.defaultValue);},[y?.defaultValue]),ht((ie,$e)=>{if($e.escape){if(C)return;L?ee(null):O.length>0&&oe&&oe();}$e.pageUp&&Se&&Se(),$e.pageDown&&pe&&pe(),$e.upArrow&&$e.ctrl&&_e&&_e(),$e.downArrow&&$e.ctrl&&fe&&fe(),$e.ctrl&&ie==="a"&&$e.shift&&J&&J(),$e.ctrl&&ie==="z"&&$e.shift&&he&&he(),$e.ctrl&&ie==="o"&&le(at=>!at);},{isActive:!h&&!L});let ye=e.filter(ie=>ie.type!=="thinking"&&ie.type!=="reasoning"),Ne=ie=>{if(!ie)return false;let{content:$e}=ie;return typeof $e=="string"?$e.trim().length>0:Array.isArray($e)?$e.some(at=>{if(!at||typeof at!="object"||!("type"in at))return false;switch(at.type){case "text":return typeof at.text=="string"&&at.text.trim().length>0;case "image_url":return true;case "tool_use":return true;case "tool_result":return at.content!==null&&at.content!==void 0&&String(at.content).trim().length>0;case "thinking":return typeof at.thinking=="string"&&at.thinking.trim().length>0;case "redacted_thinking":return typeof at.data=="string"&&at.data.trim().length>0;default:return true}}):false},it=ie=>{if(ie.message){let db=Ne(ie.message);if(ie.type==="user"&&!db&&process.env.CLI_DEBUG==="1"){let GI=C$(ie.message.content).slice(0,100);de("APP",`User message filtered out! entry.id=${ie.id}, message.role=${ie.message.role}, content=${GI}`);}return db}let $e=typeof ie.text=="string"&&ie.text.trim().length>0,at=ie.type==="plan"&&!!ie.planSteps&&ie.planSteps.length>0,ao=(ie.type==="pipeline_node_start"||ie.type==="pipeline_node_complete"||ie.type==="pipeline_node_fail"||ie.type==="pipeline_node_retry")&&(ie.pipelineNode||ie.pipelineNodeRetry),FI=(ie.type==="network_node_start"||ie.type==="network_node_complete"||ie.type==="network_node_fail")&&ie.networkNode,UI=(ie.type==="ccb_review"||ie.type==="ccb_agent_review"||ie.type==="ccb_retry"||ie.type==="ccb_failed")&&!!(ie.ccbReview||ie.ccbAgentReview||ie.ccbRetry||ie.ccbFailed),jI=ie.type==="pipeline_dag"&&!!ie.pipelineDAG;return !!($e||at||ao||FI||UI||jI)},Ht=useMemo(()=>ye.filter(it),[ye]),Fr=useMemo(()=>{let ie=s.filter(it);return process.env.CLI_DEBUG==="1"&&de("APP",`visibleStaticEntries: staticEntries=${s.length}, visible=${ie.length}, types=${ie.map($e=>$e.type).join(",")}`),ie},[s]),br=A.useCallback((ie,$e)=>ie,[]),Sl=useMemo(()=>{let ie=[];return p&&ie.push(A.createElement(OT,{key:"static-header",version:l,provider:c,model:u,workDir:d})),Fr.forEach(($e,at)=>{ie.push(A.createElement(_,{key:`static-entry-${$e.id}`,flexDirection:"column",marginTop:at>0?1:0},A.createElement(_h,{entry:$e,thinkingCollapsed:me})));}),ie},[p,l,c,u,d,Fr]);if(useEffect(()=>{!p&&s.length===0||F?.();},[p,s.length,F]),C)return A.createElement(Tx,{agentContextStats:E,onClose:()=>Pe?.()});let Ai=ie=>{if(y){if(!ie.trim()&&!y.allowEmpty)return;y.onSubmit(ie),re("");return}let $e=k.length>0,at=ie.trim().length>0;(at||$e)&&(at&&ve([...se,ie]),ce(-1),re(""),V(ie,$e?k:void 0));},ws=()=>{if(se.length===0)return;let ie=Be+1;ie<se.length&&(ce(ie),re(se[se.length-1-ie]));},Ur=()=>{if(Be<=0){ce(-1),re("");return}let ie=Be-1;ce(ie),re(se[se.length-1-ie]);},OI=ie=>{if(!$)return null;let $e=$(ie);if($e.length===0)return null;if($e.length===1)return $e[0];let at=$e.map(ao=>({label:ao,value:ao,description:void 0}));return ee({message:"Select completion:",choices:at,initialIndex:0,onSelect:ao=>{re(ao),ee(null);},onCancel:()=>{ee(null);}}),null},BI=v==="assistant";return A.createElement(_,{flexDirection:"column",width:"100%"},A.createElement(Jl,{items:Sl},br),A.createElement(_,{flexDirection:"column",width:"100%"},Ht.map((ie,$e)=>A.createElement(_,{key:`pending-wrapper-${ie.id}`,flexDirection:"column",marginTop:1},A.createElement(_h,{entry:ie,thinkingCollapsed:me}))),!me&&(()=>{let ie=[...e].reverse().find($e=>($e.type==="thinking"||$e.type==="reasoning")&&$e.text);return ie?A.createElement(_,{flexDirection:"column",marginTop:1},A.createElement(f,{color:"cyan",bold:true},"\u25CF Thinking (latest, ctrl+o to collapse)"),A.createElement(_,{key:`thinking-expanded-${ie.id}`,flexDirection:"column",marginTop:1},A.createElement(hu,{content:ie.text,collapsed:false,type:ie.type,timestamp:ie.timestamp,sourceLabel:ie.sourceLabel}))):null})()),A.createElement(f,null,`
|
|
3762
3769
|
`),BI&&A.createElement(kx,{agents:B}),M&&Y&&Ae?A.createElement(_,{flexShrink:0,flexDirection:"column"},A.createElement(wx,{onSubmit:Y,onCancel:Ae})):A.createElement(_,{flexShrink:0,flexDirection:"column"},N.length>0&&A.createElement(xx,{messages:N}),A.createElement(bx,{inputValue:K,isRunning:t,statusText:n,tokenStats:r,streamingTokens:o,streamingStartTime:i,accumulatedRunTime:a,provider:c,model:u,menuActive:!!h||!!L,promptActive:!!y,promptMessage:y?.message,promptHint:y?.hint,promptOnCancel:y?.onCancel,thinkingEnabled:g,contextMenuActive:b,compressionMode:T,compactionThreshold:S,agentContextStats:E,runMode:v,networkStats:I,cooperateStats:D,currentPlanSteps:x,attachments:k,completions:we,onInputChange:ie=>{if(X&&w$(ie)){X(ie.trim());return}re(ie);},onSubmit:Ai,onInterrupt:Z,onExit:ae,onHistoryUp:ws,onHistoryDown:Ur,onTabComplete:OI,onContextMenuToggle:be,onAgentContextScreenToggle:Pe,onRemoveAttachment:te?ie=>{te();}:void 0,onPasteImage:X,onShowInterruptInput:ge,backgroundTasks:H,bgSelectedIndex:W,onBgKill:U,onBgRemove:z,onBgNavigate:q,onBgToggleExpand:P}),h&&A.createElement(Ph,{message:h.message,choices:h.choices,initialIndex:h.initialIndex,hint:h.hint,header:h.header,allowTextInput:h.allowTextInput,onSelect:h.onSelect,onCancel:h.onCancel,onExit:ae}),L&&A.createElement(Ph,{message:L.message,choices:L.choices,initialIndex:L.initialIndex,hint:L.hint,onSelect:L.onSelect,onCancel:L.onCancel,onExit:ae}),O.length>0&&A.createElement(_,{flexDirection:"column",paddingX:2,paddingY:1,borderStyle:"round",borderColor:"gray"},O.map((ie,$e)=>A.createElement(f,{key:$e},ie)))))};ne();qr();var Tu=class s{appInstance=null;messages=[];staticEntries=[];nextEntryId=1;isRunning=false;statusText="";tokenStats={input:0,output:0,total:0,contextWindow:void 0,tokensUsedForContext:0,pressure:0};version="";provider="";model="";workDir="";showHeader=true;thinkingEnabled=true;callbacks;forceUpdate=null;selectMenuOptions=null;textPromptOptions=null;contextMenuActive=false;agentContextScreenActive=false;commandOutput=[];getCompletions;memoryLogTimer=null;ttyWriteGuardActive=false;allowTTYWriteDepth=0;originalStdoutWrite=null;originalStderrWrite=null;inkStdout=null;altScreenEnabled=false;attachedImages=[];pendingEntries=[];getPendingMessages=null;interruptInputActive=false;runMode="single";streamingTokens=0;streamingStartTime=null;accumulatedRunTime=0;runningStartTime=null;compressionMode="sync";compactionThreshold=.85;agentContextStats=new Map;networkStats=null;cooperateStats=null;currentPlanSteps=[];backgroundTasks=[];bgNextId=1;bgSelectedIndex=-1;sidebarAgents=[];static MAX_QUEUED_STATIC=50;constructor(e){this.callbacks=e;}addBackgroundTask(e,t){let n=this.bgNextId++;return this.backgroundTasks=[...this.backgroundTasks,{id:n,command:e,pid:t,status:"running",startTime:Date.now(),output:[]}],this.bgSelectedIndex<0&&(this.bgSelectedIndex=0),this.forceUpdate?.(),m.info("BG_TASK",`Added background task #${n}: ${e} (pid=${t})`),n}updateBackgroundTask(e,t){this.backgroundTasks=this.backgroundTasks.map(n=>{if(n.id!==e)return n;let r={...n};return t.status&&(r.status=t.status),t.exitCode!==void 0&&(r.exitCode=t.exitCode),t.outputLine&&(r.output=[...n.output.slice(-19),t.outputLine]),r}),this.forceUpdate?.();}removeBackgroundTask(e){this.backgroundTasks.findIndex(n=>n.id===e)<0||(this.backgroundTasks=this.backgroundTasks.filter(n=>n.id!==e),this.backgroundTasks.length===0?this.bgSelectedIndex=-1:this.bgSelectedIndex>=this.backgroundTasks.length&&(this.bgSelectedIndex=this.backgroundTasks.length-1),this.forceUpdate?.());}killBackgroundTask(e){let t=this.backgroundTasks.find(n=>n.id===e);if(!(!t||t.status!=="running")){try{process.kill(t.pid,"SIGTERM"),m.info("BG_TASK",`Killed background task #${e} (pid=${t.pid})`);}catch(n){m.warn("BG_TASK",`Failed to kill pid ${t.pid}: ${n}`);}this.updateBackgroundTask(e,{status:"killed"});}}bgMoveSelection(e){this.backgroundTasks.length!==0&&(e==="up"?this.bgSelectedIndex=Math.max(0,this.bgSelectedIndex-1):this.bgSelectedIndex=Math.min(this.backgroundTasks.length-1,this.bgSelectedIndex+1),this.forceUpdate?.());}bgToggleExpand(){if(this.bgSelectedIndex<0||this.bgSelectedIndex>=this.backgroundTasks.length)return;let e=this.backgroundTasks[this.bgSelectedIndex];this.backgroundTasks=this.backgroundTasks.map(t=>t.id===e.id?{...t,expanded:!t.expanded}:t),this.forceUpdate?.();}getBackgroundTasks(){return this.backgroundTasks}getBgSelectedIndex(){return this.bgSelectedIndex}hasActiveBackgroundTasks(){return this.backgroundTasks.length>0}updateBackgroundTaskByPid(e,t){let n=this.backgroundTasks.find(r=>r.pid===e);n&&this.updateBackgroundTask(n.id,t);}setCompletionFunction(e){this.getCompletions=e;}start(){m.info("INK","Starting Ink runtime"),this.startMemorySampler();let e=()=>{let[,a]=useState(0);return useLayoutEffect(()=>(this.forceUpdate=()=>{let l=Date.now();m.debug("RUNTIME",`>>> forceUpdate called, staticEntries=${this.staticEntries.length}, pendingEntries=${this.pendingEntries.length}`),a(u=>u+1);let c=Date.now()-l;c>50&&m.warn("RUNTIME",`\u26A0\uFE0F forceUpdate slow: setCounter took ${c}ms`);},()=>{this.forceUpdate=null;}),[]),A.createElement(_x,{staticEntries:this.staticEntries,pendingEntries:this.pendingEntries,isRunning:this.isRunning,statusText:this.statusText,tokenStats:this.tokenStats,streamingTokens:this.streamingTokens,streamingStartTime:this.streamingStartTime,accumulatedRunTime:this.accumulatedRunTime,compressionMode:this.compressionMode,compactionThreshold:this.compactionThreshold,agentContextStats:this.getAgentContextStats(),runMode:this.runMode,networkStats:this.networkStats||void 0,cooperateStats:this.cooperateStats||void 0,currentPlanSteps:this.currentPlanSteps,sidebarAgents:this.getSidebarAgents(),version:this.version,provider:this.provider,model:this.model,workDir:this.workDir,showHeader:this.showHeader,thinkingEnabled:this.thinkingEnabled,selectMenuOptions:this.selectMenuOptions,textPromptOptions:this.textPromptOptions,contextMenuActive:this.contextMenuActive,agentContextScreenActive:this.agentContextScreenActive,commandOutput:this.commandOutput,attachedImages:this.attachedImages,interruptInputActive:this.interruptInputActive,queuedMessages:this.getQueuedMessagesForDisplay(),backgroundTasks:this.backgroundTasks,bgSelectedIndex:this.bgSelectedIndex,onBgKill:l=>this.killBackgroundTask(l),onBgRemove:l=>this.removeBackgroundTask(l),onBgNavigate:l=>this.bgMoveSelection(l),onBgToggleExpand:()=>this.bgToggleExpand(),getCompletions:this.getCompletions,onStaticRendered:void 0,onSubmit:(l,c)=>{let u=c||this.attachedImages;this.attachedImages=[],this.callbacks.onSubmit(l,u);},onInterrupt:this.callbacks.onInterrupt,onExit:this.callbacks.onExit,onContextMenuToggle:()=>{this.contextMenuActive=!this.contextMenuActive,this.forceUpdate?.();},onAgentContextScreenToggle:()=>{this.agentContextScreenActive=!this.agentContextScreenActive,this.forceUpdate?.();},onClearCommandOutput:()=>{this.clearCommandOutput();},onAttachImage:l=>{this.attachImage(l);},onClearImages:()=>{this.clearAttachedImages();},onInterruptInputSubmit:l=>{this.handleInterruptInputSubmit(l);},onInterruptInputCancel:()=>{this.hideInterruptInput();},onShowInterruptInput:()=>{this.showInterruptInput();},onScrollUp:()=>this.appInstance?.scrollUp?.(),onScrollDown:()=>this.appInstance?.scrollDown?.(),onPageUp:()=>this.appInstance?.pageUp?.(),onPageDown:()=>this.appInstance?.pageDown?.(),onScrollToTop:()=>this.appInstance?.scrollToTop?.(),onScrollToBottom:()=>this.appInstance?.scrollToBottom?.()})},t=ft(),n=Hl(),r=t||n;t&&m.info("INK","WSL detected, disabling incremental rendering for compatibility"),n&&m.info("INK","Windows detected, disabling incremental rendering for compatibility");let o=process.env.NEOX_ALT_SCREEN;this.altScreenEnabled=o==="1"||o==="true";let i=this.installTTYWriteGuard();this.appInstance=vo(A.createElement(e,null),{stdout:i,stdin:process.stdin,exitOnCtrlC:false,patchConsole:false,incrementalRendering:!r,useAltScreen:this.altScreenEnabled}),m.info("INK",`Renderer mode: ${this.altScreenEnabled?"alt-screen":"inline"}`),t&&setTimeout(()=>{this.forceUpdate&&(m.debug("INK","WSL startup render nudge"),this.forceUpdate());},0);try{process.stdout.isTTY&&!process.stdout.destroyed&&(this.writeDirectStdout("\x1B[?2004h"),m.info("INK","Bracketed paste mode enabled for image paste detection"));}catch(a){m.warn("INK","Failed to enable bracketed paste mode",{error:a});}if(this.altScreenEnabled)try{process.stdout.isTTY&&!process.stdout.destroyed&&(this.writeDirectStdout("\x1B[?1000h"),this.writeDirectStdout("\x1B[?1002h"),this.writeDirectStdout("\x1B[?1006h"),m.info("INK","Mouse SGR mode enabled for wheel scrolling"));}catch(a){m.warn("INK","Failed to enable mouse mode",{error:a});}try{m.debug("TTY_STATE","\u{1F6E1}\uFE0F [INK] Re-registering SIGTSTP ignore handler after Ink starts"),process.removeAllListeners("SIGTSTP"),process.on("SIGTSTP","ignore"),m.debug("TTY_STATE","\u2705 [INK] SIGTSTP handler re-registered (Ctrl+Z ignored)"),process.env.CLI_DEBUG==="1"&&m.debug("INK","SIGTSTP handler registered (Ctrl+Z ignored)");}catch{m.debug("TTY_STATE","\u26A0\uFE0F [INK] SIGTSTP not supported on this platform"),process.env.CLI_DEBUG==="1"&&m.debug("INK","SIGTSTP not supported on this platform");}m.info("INK","Ink runtime started");}stop(){try{process.stdout.isTTY&&!process.stdout.destroyed&&(this.writeDirectStdout("\x1B[?2004l"),m.debug("INK","Bracketed paste mode disabled"));}catch(e){m.debug("INK","Failed to disable bracketed paste mode (ignored)",{error:e});}if(this.altScreenEnabled)try{process.stdout.isTTY&&!process.stdout.destroyed&&(this.writeDirectStdout("\x1B[?1006l"),this.writeDirectStdout("\x1B[?1002l"),this.writeDirectStdout("\x1B[?1000l"),m.debug("INK","Mouse mode disabled"));}catch(e){m.debug("INK","Failed to disable mouse mode (ignored)",{error:e});}this.appInstance&&(this.appInstance.unmount(),this.appInstance=null,m.info("INK","Ink runtime stopped")),this.restoreTTYWriteGuard(),this.stopMemorySampler(),this.altScreenEnabled=false;}installTTYWriteGuard(){if(this.ttyWriteGuardActive)return this.inkStdout??process.stdout;this.originalStdoutWrite=process.stdout.write.bind(process.stdout),this.originalStderrWrite=process.stderr.write.bind(process.stderr);let e=t=>(n,r,o)=>{if(typeof r=="function"&&(o=r,r=void 0),this.allowTTYWriteDepth>0){let i=t==="stdout"?this.originalStdoutWrite:this.originalStderrWrite;if(i)return i(n,r,o)}return this.handleSuppressedWrite(t,n),typeof o=="function"&&o(),true};return process.stdout.write=e("stdout"),process.stderr.write=e("stderr"),this.inkStdout=this.createInkStdoutProxy(),this.ttyWriteGuardActive=true,m.info("INK","TTY output guard enabled"),this.inkStdout}restoreTTYWriteGuard(){this.ttyWriteGuardActive&&(this.originalStdoutWrite&&(process.stdout.write=this.originalStdoutWrite),this.originalStderrWrite&&(process.stderr.write=this.originalStderrWrite),this.ttyWriteGuardActive=false,this.inkStdout=null,m.info("INK","TTY output guard disabled"));}createInkStdoutProxy(){let e=process.stdout,t=this.originalStdoutWrite||e.write.bind(e);return new Proxy(e,{get:(n,r,o)=>{if(r==="write")return (a,l,c)=>this.withDirectTTYWrite(()=>t(a,l,c));let i=Reflect.get(n,r,o);return typeof i=="function"?i.bind(n):i}})}withDirectTTYWrite(e){this.allowTTYWriteDepth+=1;try{return e()}finally{this.allowTTYWriteDepth=Math.max(0,this.allowTTYWriteDepth-1);}}writeDirectStdout(e){let t=this.originalStdoutWrite||process.stdout.write.bind(process.stdout);this.withDirectTTYWrite(()=>{t(e);});}handleSuppressedWrite(e,t){if(t==null)return;let n="";if(typeof t=="string")n=t;else if(Buffer.isBuffer(t))n=t.toString("utf8");else try{n=String(t);}catch{return}if(!n||n.trim().length===0)return;let r=n.length>2e3?`${n.slice(0,2e3)}...`:n;m.warn("TTY_SUPPRESS",`[${e}] ${r}`);}addMessage(e){this.messages=[...this.messages.slice(-4),e],this.forceUpdate?.();}addEntry(e){let t={...e,id:this.nextEntryId++,timestamp:new Date};if(e.type==="user"){let n=!!e.message,r=e.message?.content;m.debug("INK_RUNTIME",`[addEntry] user entry id=${t.id}, hasMessage=${n}, contentType=${typeof r}, isArray=${Array.isArray(r)}`);}return this.staticEntries.length>=s.MAX_QUEUED_STATIC&&(m.warn("INK_RUNTIME",`Static queue reached limit (${this.staticEntries.length}). Forcing immediate render to prevent OOM.`),this.forceUpdate?.(),setImmediate(()=>{this.clearStaticEntries();})),this.staticEntries=[...this.staticEntries,t],m.debug("INK_RUNTIME",`Queued static entry ${t.id}. Pending static: ${this.staticEntries.length}, type: ${e.type}, forceUpdate: ${!!this.forceUpdate}`),this.forceUpdate?this.forceUpdate():setImmediate(()=>{this.forceUpdate?.();}),t.id}updateEntry(e,t){let n=this.staticEntries.findIndex(o=>o.id===e);if(n>=0){this.staticEntries=this.staticEntries.map((o,i)=>i===n?{...o,...t}:o),this.forceUpdate?.();return}let r=this.pendingEntries.findIndex(o=>o.id===e);r>=0&&(this.pendingEntries=this.pendingEntries.map((o,i)=>i===r?{...o,...t}:o),this.forceUpdate?.());}getEntry(e){return this.staticEntries.find(t=>t.id===e)||this.pendingEntries.find(t=>t.id===e)}addPendingEntry(e){let t={...e,id:this.nextEntryId++,timestamp:new Date};if(this.pendingEntries.length>=10){m.warn("INK_RUNTIME",`Too many pending entries (${this.pendingEntries.length}). Auto-committing oldest.`);let r=this.pendingEntries[0];this.staticEntries=[...this.staticEntries,r],this.pendingEntries=this.pendingEntries.slice(1);}return this.pendingEntries=[...this.pendingEntries,t],m.debug("INK_RUNTIME",`Added pending entry ${t.id}. Pending: ${this.pendingEntries.length}`),this.forceUpdate?.(),t.id}updatePendingEntry(e,t){let n=this.pendingEntries.findIndex(r=>r.id===e);n>=0&&(this.pendingEntries=this.pendingEntries.map((r,o)=>o===n?{...r,...t}:r),this.forceUpdate?.());}updatePendingEntryByKey(e,t){let n=this.pendingEntries.findIndex(r=>r.entryKey===e);if(n>=0)this.pendingEntries=this.pendingEntries.map((r,o)=>o===n?{...r,...t,entryKey:e,timestamp:new Date}:r);else {let r={...t,entryKey:e,id:this.nextEntryId++,timestamp:new Date};this.pendingEntries=[...this.pendingEntries,r];}this.forceUpdate?.();}commitPendingEntryByKey(e){let t=this.pendingEntries.findIndex(n=>n.entryKey===e);if(t>=0){let n=this.pendingEntries[t];return this.pendingEntries=this.pendingEntries.filter((r,o)=>o!==t),this.staticEntries=[...this.staticEntries,{...n,isStreaming:false,isComplete:true}],m.debug("INK_RUNTIME",`Committed entry by key ${e}. Static: ${this.staticEntries.length}, Pending: ${this.pendingEntries.length}`),this.forceUpdate?.(),true}return false}commitPendingEntry(e){let t=this.pendingEntries.findIndex(n=>n.id===e);if(t>=0){let n=this.pendingEntries[t];this.pendingEntries=this.pendingEntries.filter((r,o)=>o!==t),this.staticEntries=[...this.staticEntries,n],m.debug("INK_RUNTIME",`Committed entry ${e}. Static: ${this.staticEntries.length}, Pending: ${this.pendingEntries.length}`),this.forceUpdate?.();}else m.warn("INK_RUNTIME",`Cannot commit entry ${e} - not found in pending entries`);}clearPendingEntries(){this.pendingEntries.length>0&&(this.pendingEntries=[],this.forceUpdate?.());}commitAllPendingEntries(){if(this.pendingEntries.length>0){let e=this.pendingEntries.map(t=>({...t,isStreaming:false,isComplete:true}));this.staticEntries=[...this.staticEntries,...e],this.pendingEntries=[],m.debug("INK_RUNTIME",`Committed ${e.length} pending entries on run complete`),this.forceUpdate?.();}}updateStreamingStats(e){this.streamingTokens=e,this.streamingStartTime||(this.streamingStartTime=Date.now()),this.forceUpdate?.();}resetStreamingStats(){this.streamingTokens=0,this.streamingStartTime=null;}getAccumulatedRunTime(){if(this.isRunning&&this.runningStartTime!==null){let e=Math.floor((Date.now()-this.runningStartTime)/1e3);return this.accumulatedRunTime+e}return this.accumulatedRunTime}resetAccumulatedRunTime(){this.accumulatedRunTime=0,this.runningStartTime=null,this.forceUpdate?.();}setCompressionMode(e){this.compressionMode!==e&&(this.compressionMode=e,this.forceUpdate?.());}setCompactionThreshold(e){this.compactionThreshold!==e&&(this.compactionThreshold=e,this.forceUpdate?.());}updateAgentContext(e,t){this.agentContextStats.set(e,t),this.forceUpdate?.();}clearAgentContext(e){this.agentContextStats.has(e)&&(this.agentContextStats.delete(e),this.forceUpdate?.());}clearAllAgentContexts(){this.agentContextStats.size>0&&(this.agentContextStats.clear(),this.forceUpdate?.());}getAgentContextStats(){return Array.from(this.agentContextStats.values()).sort((t,n)=>t.agentId==="supervisor"?-1:n.agentId==="supervisor"?1:t.agentId.localeCompare(n.agentId))}updateLastMessage(e){if(this.messages.length===0)return;let t=this.messages[this.messages.length-1];if(typeof t.content=="string")t.content=e;else if(Array.isArray(t.content)){let n=t.content.find(r=>r.type==="text");n&&"text"in n&&(n.text=e);}this.forceUpdate?.();}getLastMessageText(){if(this.messages.length===0)return "";let e=this.messages[this.messages.length-1];if(typeof e.content=="string")return e.content;if(Array.isArray(e.content)){let t=e.content.find(n=>n.type==="text");if(t&&"text"in t)return t.text||""}return ""}setRunning(e){if(this.isRunning!==e){if(e)this.runningStartTime=Date.now();else if(this.runningStartTime!==null){let t=Math.floor((Date.now()-this.runningStartTime)/1e3);this.accumulatedRunTime+=t,this.runningStartTime=null;}this.isRunning=e,this.forceUpdate?.();}}triggerForceUpdate(){this.forceUpdate?.();}setStatusText(e){this.statusText!==e&&(this.statusText=e,this.forceUpdate?.());}setTokenStats(e){m.info("DEBUG_CTX",`InkRuntime.setTokenStats: received contextWindow=${e.contextWindow}, current=${this.tokenStats.contextWindow}`);let t=e.contextWindow!==void 0?e.contextWindow:this.tokenStats.contextWindow;(this.tokenStats.input!==e.input||this.tokenStats.output!==e.output||this.tokenStats.total!==e.total||this.tokenStats.contextWindow!==t||this.tokenStats.tokensUsedForContext!==e.tokensUsedForContext||this.tokenStats.pressure!==e.pressure||this.tokenStats.toolTokens!==e.toolTokens||this.tokenStats.messageTokens!==e.messageTokens||this.tokenStats.systemTokens!==e.systemTokens||this.tokenStats.userTokens!==e.userTokens||this.tokenStats.assistantTokens!==e.assistantTokens||this.tokenStats.toolCallTokens!==e.toolCallTokens||this.tokenStats.toolResultTokens!==e.toolResultTokens||this.tokenStats.cacheCreationTokens!==e.cacheCreationTokens||this.tokenStats.cacheReadTokens!==e.cacheReadTokens)&&(this.tokenStats={...e,contextWindow:t,tokensUsedForContext:e.tokensUsedForContext??this.tokenStats.tokensUsedForContext,pressure:e.pressure??this.tokenStats.pressure},m.info("DEBUG_CTX",`InkRuntime.setTokenStats: after update contextWindow=${this.tokenStats.contextWindow}`),this.forceUpdate?.());}clearMessages(){m.warn("INK_RUNTIME",`clearMessages called! This will clear pending/static queues. Messages: ${this.messages.length}`),this.messages=[],this.staticEntries=[],this.pendingEntries=[],this.forceUpdate?.();}setCommandOutput(e){m.debug("INK_RUNTIME","Set command output",{lineCount:e.length}),this.commandOutput=e,this.forceUpdate?.();}clearCommandOutput(){m.debug("INK_RUNTIME","Clear command output"),this.commandOutput=[],this.forceUpdate?.();}attachImage(e){let t;if(typeof e=="string")if(e.startsWith("data:")){let r=e.match(/^data:([^;]+);base64,(.+)$/);if(r){let o=`image_${Date.now()}.png`;t={mediaType:r[1],data:r[2],name:o};}else {m.error("INK_RUNTIME","Invalid data URL format",{imageData:e});return}}else {let r=e.split("/").pop()||e;t={path:e,name:r};}else t=e;if(this.attachedImages.some(r=>r.path&&t.path&&r.path===t.path||r.data&&t.data&&r.data===t.data)){m.debug("INK_RUNTIME","Image already attached");return}this.attachedImages.push(t),m.info("INK_RUNTIME",`\u{1F4CE} Attached image #${this.attachedImages.length}: ${t.name||"unnamed"}`),this.forceUpdate?.();}clearAttachedImages(){this.attachedImages.length>0&&(m.debug("INK_RUNTIME",`Cleared ${this.attachedImages.length} attached images`),this.attachedImages=[],this.forceUpdate?.());}getAttachedImages(){return [...this.attachedImages]}showInterruptInput(){m.debug("INK_RUNTIME","Show interrupt input"),this.interruptInputActive=true,this.forceUpdate?.();}hideInterruptInput(){m.debug("INK_RUNTIME","Hide interrupt input"),this.interruptInputActive=false,this.forceUpdate?.();}handleInterruptInputSubmit(e){m.debug("INK_RUNTIME","Handle interrupt input submit",{text:e.substring(0,50)}),this.hideInterruptInput(),this.callbacks.onSubmit(e);}setGetPendingMessages(e){this.getPendingMessages=e;}getQueuedMessagesForDisplay(){return this.getPendingMessages?this.getPendingMessages().map((e,t)=>({id:t+1,text:e.text,timestamp:e.timestamp})):[]}hasQueuedMessages(){return this.getPendingMessages?this.getPendingMessages().length>0:false}addAgentSpawnEntry(e,t,n,r){return this.addEntry({type:"agent_spawn",agentId:e,agentIndex:t,agentStatus:"running",agentTask:n,agentModel:r,text:n})}addAgentProgressEntry(e,t,n,r){return this.addEntry({type:"agent_progress",agentId:e,agentIndex:t,agentStatus:"running",agentProgress:n,text:r})}addAgentCompleteEntry(e,t,n){return this.addEntry({type:"agent_complete",agentId:e,agentIndex:t,agentStatus:"completed",text:n})}addAgentErrorEntry(e,t,n){return this.addEntry({type:"agent_error",agentId:e,agentIndex:t,agentStatus:"error",agentError:n,text:n})}setVersion(e){this.version=e,this.forceUpdate?.();}setProvider(e){this.provider=e,this.forceUpdate?.();}setModel(e){this.model=e,this.forceUpdate?.();}setRunMode(e){this.runMode=e,e!=="network"&&(this.networkStats=null),this.forceUpdate?.();}upsertSidebarAgent(e){let t=this.sidebarAgents.find(n=>n.id===e.id);t?(t.role=e.role,t.task=e.task,t.status=e.status,e.toolCount!==void 0&&(t.toolCount=e.toolCount),e.tokens!==void 0&&(t.tokens=e.tokens),t.elapsed=Math.round((Date.now()-t.startTime)/1e3)):this.sidebarAgents.push({id:e.id,role:e.role,task:e.task,status:e.status,toolCount:e.toolCount??0,tokens:e.tokens??0,elapsed:0,startTime:Date.now()}),this.forceUpdate?.();}removeSidebarAgent(e){this.sidebarAgents=this.sidebarAgents.filter(t=>t.id!==e),this.forceUpdate?.();}clearSidebarAgents(){this.sidebarAgents=[],this.forceUpdate?.();}getSidebarAgents(){let e=Date.now();for(let t of this.sidebarAgents)t.status==="running"&&(t.elapsed=Math.round((e-t.startTime)/1e3));return this.sidebarAgents}updateNetworkStats(e){this.networkStats||(this.networkStats={teamSize:0,activeAgents:0,totalInputTokens:0,totalOutputTokens:0}),Object.assign(this.networkStats,e),this.forceUpdate?.();}clearNetworkStats(){this.networkStats=null,this.forceUpdate?.();}getNetworkStats(){return this.networkStats}updateCooperateStats(e){this.cooperateStats||(this.cooperateStats={models:[],totalInputTokens:0,totalOutputTokens:0}),Object.assign(this.cooperateStats,e),this.forceUpdate?.();}clearCooperateStats(){this.cooperateStats=null,this.forceUpdate?.();}getCooperateStats(){return this.cooperateStats}setPlanSteps(e){this.currentPlanSteps=e,this.forceUpdate?.();}getPlanSteps(){return this.currentPlanSteps}clearPlanSteps(){this.currentPlanSteps=[],this.forceUpdate?.();}setWorkDir(e){this.workDir=e,this.forceUpdate?.();}setShowHeader(e){this.showHeader=e,this.forceUpdate?.();}setThinkingEnabled(e){this.thinkingEnabled!==e&&(this.thinkingEnabled=e,this.forceUpdate?.());}showSelectMenu(e){if(m.debug("INK_RUNTIME","Show select menu",{options:e}),process.stdin.isTTY&&!process.stdin.destroyed){let t=process.stdin.isPaused?.()||false;process.stdin.isRaw||false;if(t){process.env.CLI_DEBUG==="1"&&m.debug("INK_RUNTIME",`showSelectMenu: Resuming stdin (wasPaused=${t})`);try{process.stdin.resume(),m.info("INK_RUNTIME","\u2713 Stdin resumed for SelectMenu");}catch(r){m.error("INK_RUNTIME","Failed to resume stdin for SelectMenu",{error:r});}}}this.selectMenuOptions=e,this.forceUpdate?.();}hideSelectMenu(){if(m.debug("INK_RUNTIME","Hide select menu"),this.selectMenuOptions){let e=this.selectMenuOptions.choices.length+5;process.stdout.write(S$.eraseLines(e));}this.selectMenuOptions=null,this.forceUpdate?.(),process.nextTick(()=>{this.forceUpdate?.();});}isSelectMenuActive(){return this.selectMenuOptions!==null}updateSelectMenuIndex(e){if(!this.selectMenuOptions)return;let t=Math.max(0,this.selectMenuOptions.choices.length-1),n=Math.max(0,Math.min(e,t));this.selectMenuOptions={...this.selectMenuOptions,initialIndex:n},this.forceUpdate?.();}showTextPrompt(e){if(m.debug("INK_RUNTIME","Show text prompt",{options:e}),process.stdin.isTTY&&!process.stdin.destroyed){let t=process.stdin.isPaused?.()||false;if(t){process.env.CLI_DEBUG==="1"&&m.debug("INK_RUNTIME",`showTextPrompt: Resuming stdin (wasPaused=${t})`);try{process.stdin.resume(),m.info("INK_RUNTIME","\u2713 Stdin resumed for TextPrompt");}catch(n){m.error("INK_RUNTIME","Failed to resume stdin for TextPrompt",{error:n});}}}this.textPromptOptions=e,this.forceUpdate?.();}hideTextPrompt(){m.debug("INK_RUNTIME","Hide text prompt"),this.textPromptOptions=null,this.forceUpdate?.();}showContextMenu(){m.debug("INK_RUNTIME","Show context menu"),this.contextMenuActive=true,this.forceUpdate?.();}hideContextMenu(){m.debug("INK_RUNTIME","Hide context menu"),this.contextMenuActive=false,this.forceUpdate?.();}getContextMenuActive(){return this.contextMenuActive}clearStaticEntries(){if(this.staticEntries.length===0)return;let e=this.staticEntries.length;m.debug("INK_RUNTIME",`Clearing ${e} static entries from memory`),this.staticEntries=[],global.gc&&e>10&&(m.debug("INK_RUNTIME","Triggering manual GC after clearing entries"),setImmediate(()=>{global.gc&&global.gc();}));}startMemorySampler(){this.memoryLogTimer||process.env.INK_MEM!=="1"||(this.memoryLogTimer=setInterval(()=>{let e=process.memoryUsage(),t=n=>Math.round(n/1024/1024*10)/10;m.info("INK_MEM","usage",{rssMB:t(e.rss),heapUsedMB:t(e.heapUsed),heapTotalMB:t(e.heapTotal),externalMB:t(e.external),arrayBuffersMB:t(e.arrayBuffers??0),pendingEntries:this.pendingEntries.length,queuedStatic:this.staticEntries.length,isRunning:this.isRunning});},1e4));}stopMemorySampler(){this.memoryLogTimer&&(clearInterval(this.memoryLogTimer),this.memoryLogTimer=null);}};ne();ja();var A$=s=>{let e=new WeakSet;try{return JSON.stringify(s,(t,n)=>{if(typeof n=="bigint")return n.toString();if(n instanceof Error)return {name:n.name,message:n.message,stack:n.stack};if(typeof n=="function")return "[Function]";if(typeof n=="object"&&n!==null){if(e.has(n))return "[Circular]";e.add(n);}return n})}catch{try{return String(s)}catch{return "[Unserializable]"}}},_u=class{runtime;config;callbacks;currentThinkingText="";lastMessageRole=null;lastEntryId=null;tokenStats={inputTokens:0,outputTokens:0,totalTokens:0};memory;streamingTextPendingId=null;streamingReasoningPendingId=null;streamingTextBuffer="";streamingReasoningBuffer="";streamingReasoningType="thinking";streamingReasoningSourceLabel=void 0;streamingToolChars=0;hasInferredThinkingStatus=false;toolLogIdByToolId=new Map;toolLogDetailsByToolId=new Map;toolLogNameByToolId=new Map;toolLogOutputByToolId=new Map;toolLogSourceLabelByToolId=new Map;streamingSourceLabel=null;streamingSourceType=null;agentBuffers=new Map;activeAgentId=null;constructor(e){this.config=e,this.memory=e.memory,this.runtime=new Tu({onSubmit:(t,n)=>{this.callbacks?.onSubmit&&this.callbacks.onSubmit(t,n);},onInterrupt:()=>{this.callbacks?.onInterrupt&&this.callbacks.onInterrupt();},onExit:()=>{this.callbacks?.onExit&&this.callbacks.onExit();}}),e.getPendingMessages&&this.runtime.setGetPendingMessages(e.getPendingMessages);}start(e){this.callbacks=e,this.runtime.setVersion(this.config.version),this.runtime.setProvider(this.config.provider),this.runtime.setModel(this.config.model),this.runtime.setWorkDir(this.config.workDir),this.config.getCompletions&&this.runtime.setCompletionFunction(this.config.getCompletions),this.runtime.start(),m.info("INK_ADAPTER","Ink UI started");}stop(){this.runtime.stop(),this.callbacks=void 0,m.info("INK_ADAPTER","Ink UI stopped");}addUserMessage(e,t,n){let r=[{type:"text",text:e}];if(t&&t.length>0)for(let i of t)r.push({type:"image_url",image_url:{url:`file://${i.path}`}});let o={role:"user",content:r};this.lastEntryId=this.runtime.addEntry({type:"user",message:o,sourceLabel:n==="remote"?"Android":void 0}),this.lastMessageRole="user";}addAssistantMessage(e=""){if(e===""){this.lastMessageRole="assistant";return}let t={role:"assistant",content:[{type:"text",text:e}]};this.lastEntryId=this.runtime.addEntry({type:"assistant",message:t,isStreaming:false}),this.lastMessageRole="assistant";}addSupervisorMessage(e){let t={role:"user",content:[{type:"text",text:e}]};this.lastEntryId=this.runtime.addEntry({type:"supervisor",message:t}),this.lastMessageRole="user";}startSupervisorStreaming(){this.startAgentStreaming("Supervisor"),this.streamingSourceLabel="Supervisor",this.streamingSourceType="supervisor";}startExecutorStreaming(e){let t=e||"Executor";this.startAgentStreaming(t);}getStreamingSourceType(){return this.streamingSourceType}startAgentStreaming(e){this.agentBuffers.has(e)||this.agentBuffers.set(e,""),this.activeAgentId=e,this.lastMessageRole="assistant",m.debug("INK_ADAPTER",`Started agent streaming for ${e}`);}startWorkerStreaming(e){this.startAgentStreaming(e);}addWorkerTextDelta(e,t){this.streamText(t,e);}completeWorkerStreaming(e){this.completeTextStreaming(e);}addWorkerInfo(e,t,n,r="info"){let i=`${`[${e}]`} ${t}`,a=r==="error"?"warning":r;this.addInfo(i,n,a);}streamText(e,t){let n=Date.now(),r=t||this.activeAgentId||"default";m.debug("INK_ADAPTER",`streamText: ${e.length} chars to ${r}`,{snippet:e.substring(0,30),bufferExists:this.agentBuffers.has(r)});let o=Date.now()-n;o>10&&m.warn("INK_ADAPTER",`\u26A0\uFE0F streamText slow: ${o}ms for ${e.length} chars`);let i=this.agentBuffers.get(r)||"";this.agentBuffers.set(r,i+e);}addTextDelta(e,t){m.debug("INK_ADAPTER",`addTextDelta called: ${e.length} chars, agentId=${t||"default"}`,{delta:e.substring(0,50)}),this.streamText(e,t);}addAgentTextDelta(e,t,n){m.debug("INK_ADAPTER",`addAgentTextDelta: ${e.length} chars, agentId=${t}`,{delta:e.substring(0,50)}),this.agentBuffers.has(t)||this.agentBuffers.set(t,"");let r=this.agentBuffers.get(t)||"";this.agentBuffers.set(t,r+e);let i={role:"assistant",content:[{type:"text",text:this.agentBuffers.get(t)||""}]};this.runtime.updatePendingEntryByKey(t,{type:"assistant",message:i,isStreaming:true,isComplete:false,sourceLabel:n||t});}bufferAgentTextOnly(e,t){this.agentBuffers.has(t)||this.agentBuffers.set(t,"");let n=this.agentBuffers.get(t)||"";this.agentBuffers.set(t,n+e);}flushAgentBuffer(e){let t=this.agentBuffers.get(e)||"";return this.agentBuffers.delete(e),t}commitPendingEntryByKey(e){return this.agentBuffers.has(e)&&this.agentBuffers.delete(e),this.runtime.commitPendingEntryByKey(e)}addToolCall(e,t){let n={role:"assistant",content:[{type:"tool_use",id:`tool_${Math.floor(Date.now())}`,name:e,input:t}]};this.runtime.addMessage(n),this.lastMessageRole="tool_call";}addToolCallEntry(e,t,n){m.debug("INK_ADAPTER","Add tool call entry",{toolName:e,sourceLabel:n?.sourceLabel});let r=`entry_${Date.now()}_${Math.random().toString(36).slice(2,6)}`;this.startToolCallWithId(r,e,t,n);}addToolResult(e,t=false){let n={role:"user",content:[{type:"tool_result",tool_use_id:`tool_${Math.floor(Date.now())}`,content:e,is_error:t}]};this.runtime.addMessage(n),this.lastMessageRole="tool_result";}addEntry(e){return m.debug("INK_ADAPTER",`AddEntry: ${e.type}`,{text:e.text}),this.runtime.addEntry(e)}addInfo(e,t,n="info",r){m.info("INK_ADAPTER",`Info: ${e}`,t?{details:t}:void 0);let o=n==="warning"||e.includes("\u26A0")||e.includes("\u23F3")||e.includes("\u23F1\uFE0F")||e.includes("\u{1F504}");this.runtime.addEntry({type:o?"warning":"info",text:e,details:t,sourceLabel:r});}addError(e,t){let n=typeof t=="string"?t:t?.details,r=typeof t=="object"?t?.sourceLabel:void 0;m.error("INK_ADAPTER",e,n?{details:n}:void 0),this.runtime.addEntry({type:"error",text:e,details:n,sourceLabel:r});}addWarning(e,t,n){m.warn("INK_ADAPTER",e,t?{details:t}:void 0),this.runtime.addEntry({type:"warning",text:e,details:t,sourceLabel:n?.sourceLabel});}addCompacting(e,t){m.info("INK_ADAPTER",`Compacting: ${e}`,t?{details:t}:void 0),this.runtime.addEntry({type:"compacting",text:e,details:t});}updateStatus(e,t){if(t==="tool_call"&&e.includes("Streaming:")){let n=e.match(/\((\d+) chars\)/);if(n){let r=parseInt(n[1],10);this.streamingToolChars=r,this.runtime.updateStreamingStats(r);}}else t!=="tool_call"&&(this.streamingToolChars=0);t==="compacting"||t==="thinking"||t==="tool_call"?this.runtime.setRunning(true):(t==="complete"||t==="error")&&this.runtime.setRunning(false),this.runtime.setStatusText(e);}setRunning(e){this.runtime.setRunning(e);}startSessionTimer(){}getAccumulatedRunTime(){return this.runtime.getAccumulatedRunTime()}resetAccumulatedRunTime(){this.runtime.resetAccumulatedRunTime();}setCompressionMode(e){this.runtime.setCompressionMode(e);}setCompactionThreshold(e){this.runtime.setCompactionThreshold(e/100);}updateTokenStats(e,t){this.tokenStats.inputTokens=e,this.tokenStats.outputTokens=t,this.tokenStats.totalTokens=e+t,this.runtime.setTokenStats({input:e,output:t,total:e+t});}updateAgentContext(e,t){this.runtime.updateAgentContext(e,t);}clearAgentContext(e){this.runtime.clearAgentContext(e);}clearAllAgentContexts(){this.runtime.clearAllAgentContexts();}getTokenStats(){return {...this.tokenStats}}setTokenStats(e,t,n){m.info("DEBUG_CTX",`InkUIAdapter.setTokenStats: input=${e}, output=${t}, extras.contextWindow=${n?.contextWindow}`),this.tokenStats={inputTokens:e,outputTokens:t,totalTokens:e+t,...n};let r=n?.anthropicCacheCreationTokens||n?.openaiCachedTokens||n?.cacheCreationTokens,o=n?.anthropicCacheReadTokens||n?.cacheReadTokens,i=n?.contextWindow||0,a=n?.tokensUsedForContext||e+t+(o||0),l=i>0?a/i:0;m.info("DEBUG_CTX",`InkUIAdapter.setTokenStats: passing to runtime contextWindow=${n?.contextWindow}, calculated contextWindow=${i}`),this.runtime.setTokenStats({input:e,output:t,total:e+t,contextWindow:n?.contextWindow,tokensUsedForContext:n?.tokensUsedForContext,pressure:l,systemTokens:n?.systemTokens,userTokens:n?.userTokens,assistantTokens:n?.assistantTokens,toolCallTokens:n?.toolCallTokens,toolResultTokens:n?.toolResultTokens,toolTokens:n?.toolTokens,messageTokens:n?.messageTokens,cacheCreationTokens:r,cacheReadTokens:o});}startThinking(){this.streamingReasoningBuffer="",this.streamingReasoningType="thinking",this.hasInferredThinkingStatus=false,this.updateStatus(ku(),"thinking");}streamThinking(e,t="thinking",n){if(this.streamingReasoningBuffer+=e,n&&(this.streamingReasoningSourceLabel=n),!this.hasInferredThinkingStatus&&this.streamingReasoningBuffer.length>30){let r=Px(this.streamingReasoningBuffer);r&&(this.updateStatus(r,"thinking"),this.hasInferredThinkingStatus=true);}this.streamingReasoningPendingId?this.runtime.updatePendingEntry(this.streamingReasoningPendingId,{text:this.streamingReasoningBuffer}):(this.streamingReasoningType=t,this.streamingReasoningPendingId=this.runtime.addPendingEntry({type:t,text:this.streamingReasoningBuffer,isStreaming:true}));}endThinking(){if(!this.streamingReasoningPendingId){this.updateStatus("","info");return}try{this.streamingReasoningBuffer&&this.streamingReasoningBuffer.trim().length>0?(this.runtime.updatePendingEntry(this.streamingReasoningPendingId,{isStreaming:!1,isComplete:!0,sourceLabel:this.streamingReasoningSourceLabel}),this.runtime.commitPendingEntry(this.streamingReasoningPendingId),m.debug("INK_ADAPTER",`Committed reasoning entry (${this.streamingReasoningBuffer.length} chars)`)):m.debug("INK_ADAPTER","Discarding empty reasoning entry (no content)");}catch(e){m.warn("INK_ADAPTER","Failed to commit reasoning entry",{error:e});}finally{this.streamingReasoningPendingId=null,this.streamingReasoningBuffer="",this.streamingReasoningSourceLabel=void 0,this.runtime.resetStreamingStats(),this.updateStatus("","info");}}startTaskTimer(){this.runtime.setRunning(true);}stopTaskTimer(){this.runtime.setRunning(false);}setStreamingTokens(e){this.runtime.updateStreamingStats(e);}clear(){this.runtime.clearMessages(),this.lastMessageRole=null;}resetStreamingState(){this.agentBuffers.clear(),this.activeAgentId=null,this.streamingTextBuffer="",this.streamingTextPendingId=null,this.streamingReasoningBuffer="",this.streamingReasoningPendingId=null,this.currentThinkingText="",this.streamingToolChars=0,this.runtime.clearPendingEntries(),this.runtime.resetStreamingStats(),this.runtime.setStatusText(""),m.debug("INK_ADAPTER","Reset streaming state (cleared all pending entries and buffers)");}finalizeStreamingState(){let e=Array.from(this.agentBuffers.keys());if(e.length>0)for(let t of e)this.completeTextStreaming(t);else this.completeTextStreaming();this.completeReasoningStreaming();}startReasoningStreaming(){this.startThinking();}streamReasoningText(e){this.streamThinking(e);}addReasoningDelta(e,t){this.streamThinking(e,"reasoning",t);}completeReasoningStreaming(e){e&&(this.streamingReasoningSourceLabel=e),this.endThinking();}addThinking(e){}completeTextStreaming(e){let t=e||this.activeAgentId||"default",n=this.agentBuffers.get(t)||"";if(!(n&&n.trim().length>0)){m.debug("INK_ADAPTER",`Complete text streaming (${t}) - no text to commit`),this.agentBuffers.delete(t),this.runtime.commitPendingEntryByKey(t),(t==="default"||t===this.activeAgentId)&&(this.streamingTextPendingId=null,this.streamingSourceLabel=null,this.streamingSourceType=null,this.runtime.resetStreamingStats());return}try{if(this.runtime.commitPendingEntryByKey(t))m.debug("INK_ADAPTER",`Complete text streaming (${t}) - committed pending entry ${n.length} chars`);else {let i={role:"assistant",content:[{type:"text",text:n}]};this.runtime.addEntry({type:"assistant",message:i,isStreaming:!1,isComplete:!0,sourceLabel:t==="default"?void 0:t}),m.debug("INK_ADAPTER",`Complete text streaming (${t}) - created static entry from buffer ${n.length} chars`);}}catch(o){m.warn("INK_ADAPTER","Failed to commit text entry",{error:o});}finally{this.agentBuffers.delete(t),(t==="default"||t===this.activeAgentId)&&(this.streamingTextPendingId=null,this.streamingSourceLabel=null,this.streamingSourceType=null,this.lastMessageRole="assistant",this.runtime.resetStreamingStats()),this.activeAgentId===t&&(this.activeAgentId=null);}}printCommandOutput(e){m.debug("INK_ADAPTER",`Command output: ${e}`);}setCommandOutputLines(e){m.debug("INK_ADAPTER",`Set command output lines: ${e.length}`),this.runtime.setCommandOutput(e);}clearCommandOutputLines(){m.debug("INK_ADAPTER","Clear command output lines"),this.runtime.clearCommandOutput();}startToolCallWithId(e,t,n,r){m.debug("INK_ADAPTER",`Start tool call: ${t}`,{toolId:e,args:n});let o=r?.sourceLabel,i=t,a=n;t==="call_tool"&&n?.name&&(i=n.name,a=n.args||{});let l=this.buildToolCallDetails(a,r),d={readfile:"readfile",Read:"readfile",read_file:"readfile",smart_read:"readfile",read:"readfile",search:"search",Grep:"search",grep:"search",search_files:"search_files",Glob:"search_files",glob:"search_files",find_files:"search_files",show_tree:"show_tree",smart_tree:"show_tree",list_directory:"show_tree",ls:"show_tree",file_update:"file_update",Edit:"file_update",edit_file:"file_update",Write:"file_update",write_file:"file_update",delete_file:"file_update",rename_file:"file_update",apply_patch:"file_update",create_directory:"file_update",command_exec:"command_exec",Bash:"command_exec",bash:"command_exec",shell:"command_exec",execute_command:"command_exec",execute_shell:"command_exec",code_exec:"code_exec",execute_python:"code_exec",execute_javascript:"code_exec",web_search:"web_search",WebSearch:"web_search",web_fetch:"web_fetch",WebFetch:"web_fetch",browser_debug:"browser_debug",debug_in_browser:"browser_debug",git_status:"git_status",git_diff:"git_diff",git_log:"git_log",git_commit:"git_commit",git_blame:"git_diff",git_branch:"git_running",git_branch_list:"git_running",TodoWrite:"todo",TodoRead:"todo",Task:"task",NotebookEdit:"notebook",NotebookRead:"notebook",AskUserQuestion:"ask_user",ask_user:"ask_user",run_tests:"command_exec",run_lint:"command_exec",run_format:"command_exec",build_index:"search",search_symbol:"search",get_definitions:"search",get_references:"search",index_stats:"search",analyze_code:"search"}[i]||"tool_call",p=this.buildToolSummaryText(d,i,a),g=this.runtime.addPendingEntry({type:d,text:p,details:l,entryKey:e,isStreaming:true,sourceLabel:o});this.toolLogIdByToolId.set(e,g),this.toolLogDetailsByToolId.set(e,l||""),this.toolLogNameByToolId.set(e,i),o&&this.toolLogSourceLabelByToolId.set(e,o);let h=Su(i,a);this.updateStatus(h,"tool_call");}updateToolCallOutput(e,t,n){m.debug("INK_ADAPTER",`Update tool output: ${e}`,{output:t});let r=this.toolLogIdByToolId.get(e);if(!r)return;let o=this.toolLogDetailsByToolId.get(e)||"",i=this.formatToolOutput(t,n?.truncated);i&&this.toolLogOutputByToolId.set(e,i);let a=this.mergeToolDetails(o,i);this.runtime.updateEntry(r,{details:a,isStreaming:true});}completeToolCall(e,t){m.debug("INK_ADAPTER",`Complete tool call: ${e}`);let n=this.toolLogIdByToolId.get(e);if(!n){t?.result&&this.addToolResult(t.result,t.isError||false);return}let r=this.toolLogSourceLabelByToolId.get(e),o=this.toolLogNameByToolId.get(e)||"",i=this.isGitResultTool(o),a=t?.summary||t?.error||"",l=this.toolLogOutputByToolId.get(e)||"",c=(a||l||"").replace(/\r\n?/g,`
|
|
3763
3770
|
`).trim(),u=c.split(`
|
|
3764
3771
|
`).find(h=>h.trim())||"",d=u.length>200?u.slice(0,197)+"\u2026":u,p={isStreaming:false,isComplete:true,sourceLabel:r};d&&(p.text=d);let g=this.formatToolCompletionDetails(c,o);if(g&&(p.details=g),i){let h=this.formatGitToolDetails(a,l);h&&(p.details=h);}t?.success||(p.type="tool_error"),this.runtime.updateEntry(n,p),this.runtime.commitPendingEntry(n),this.toolLogIdByToolId.delete(e),this.toolLogDetailsByToolId.delete(e),this.toolLogNameByToolId.delete(e),this.toolLogOutputByToolId.delete(e),this.toolLogSourceLabelByToolId.delete(e);}updateTaskTokens(e,t=false){m.debug("INK_ADAPTER",`Update task tokens: ${e}`,{isActual:t}),!t&&this.runtime.updateStreamingStats(e);}addToolError(e,t){m.error("INK_ADAPTER",`Tool error: ${e}`,{error:t}),this.addToolResult(t,true);}printCommandOutputLines(e){e.forEach(t=>this.printCommandOutput(t));}resetTokenStats(){this.tokenStats={inputTokens:0,outputTokens:0,totalTokens:0},this.runtime.setTokenStats({input:0,output:0,total:0});}pause(){m.debug("INK_ADAPTER","Pause UI");}resume(){m.debug("INK_ADAPTER","Resume UI");}refreshUI(){m.debug("INK_ADAPTER","Refresh UI");}forceUpdate(){m.debug("INK_ADAPTER","Force UI update"),this.runtime.triggerForceUpdate();}setPlanSteps(e){m.debug("INK_ADAPTER",`Set plan steps: ${e.length} items`),this.runtime.setPlanSteps(e);}getPlanSteps(){return this.runtime.getPlanSteps()}clearPlanSteps(){m.debug("INK_ADAPTER","Clear plan steps"),this.runtime.clearPlanSteps();}commitAllPendingEntries(){m.debug("INK_ADAPTER","Commit all pending entries"),this.runtime.commitAllPendingEntries();}updateProvider(e,t){this.config.provider=e,this.config.model=t,this.runtime.setProvider(e),this.runtime.setModel(t);}updateWorkDir(e){this.config.workDir=e,this.runtime.setWorkDir(e);}setThinkingEnabled(e){this.runtime.setThinkingEnabled(e);}setRunMode(e){this.runtime.setRunMode(e);}updateNetworkStats(e){this.runtime.updateNetworkStats(e);}clearNetworkStats(){this.runtime.clearNetworkStats();}updateCooperateStats(e){this.runtime.updateCooperateStats(e);}clearCooperateStats(){this.runtime.clearCooperateStats();}addBackgroundTask(e,t){return this.runtime.addBackgroundTask(e,t)}updateBackgroundTask(e,t){this.runtime.updateBackgroundTask(e,t);}removeBackgroundTask(e){this.runtime.removeBackgroundTask(e);}updateBackgroundTaskByPid(e,t){this.runtime.updateBackgroundTaskByPid(e,t);}showContextMenu(){return new Promise(e=>{this.runtime.showContextMenu();let t=setInterval(()=>{this.runtime.getContextMenuActive()||(clearInterval(t),e());},100);})}async promptText(e){return new Promise(t=>{this.runtime.showTextPrompt({message:e.message,defaultValue:e.defaultValue??e.initial,hint:e.hint,allowEmpty:e.allowEmpty??false,onSubmit:n=>{this.runtime.hideTextPrompt(),t(n);},onCancel:()=>{this.runtime.hideTextPrompt(),t(null);}});})}async promptSelect(e){return new Promise(t=>{this.runtime.hideSelectMenu();let n=e.choices.map(o=>({label:o.title,value:o.value,description:o.description})),r=e.initial||0;if(e.initialValue){let o=e.choices.findIndex(i=>i.value===e.initialValue);o>=0&&(r=o);}setTimeout(()=>{this.runtime.showSelectMenu({message:e.message,choices:n,initialIndex:r,hint:e.hint,header:e.header,allowTextInput:e.allowTextInput,onSelect:o=>{this.runtime.hideSelectMenu(),setTimeout(()=>t(o),100);},onCancel:()=>{this.runtime.hideSelectMenu(),setTimeout(()=>t(null),100);}});},100);})}handleSelectBack(){return m.debug("INK_ADAPTER","Handle select back"),this.runtime.isSelectMenuActive()?(this.runtime.hideSelectMenu(),true):false}addWebSearchResult(e){if(e.status==="searching"){m.debug("INK_ADAPTER","Skip web search start (waiting for completion)");return}m.debug("INK_ADAPTER","Add web search result",{options:e});let t=e.query||"query",n=e.results?`Found ${e.results.length} results`:void 0;this.runtime.addEntry({type:"web_search",text:t,details:n,sourceLabel:e.sourceLabel});}addWebFetchResult(e){if(e.status==="fetching"){m.debug("INK_ADAPTER","Skip web fetch start (waiting for completion)");return}m.debug("INK_ADAPTER","Add web fetch result",{options:e});let t=e.url||"URL",n=e.contentLength?`${(e.contentLength/1024).toFixed(1)}KB`:e.contentPreview?`${e.contentPreview.length} chars`:void 0;this.runtime.addEntry({type:"web_fetch",text:t,details:n,sourceLabel:e.sourceLabel});}addReadFileResult(e){if(e.status==="reading"){m.debug("INK_ADAPTER","Skip read file start (waiting for completion)");return}m.debug("INK_ADAPTER","Add read file result",{options:e});let t=e.filePath||"file",n=e.totalLines?`${t} \u2014 ${e.totalLines} lines read`:t,r=[];e.totalLines&&r.push(`${e.totalLines} lines`),e.fileSize&&r.push(e.fileSize);let o=r.length>0?r.join(", "):void 0;this.runtime.addEntry({type:"readfile",text:n,details:o,sourceLabel:e.sourceLabel});}addSearchResult(e){if(e.status==="searching"){m.debug("INK_ADAPTER","Skip search start (waiting for completion)");return}m.debug("INK_ADAPTER","Add search result",{options:e});let t=[];if(e.pattern&&t.push(`pattern="${e.pattern}"`),e.filePath){let i=e.filePath==="."?".":e.filePath;t.push(`path="${i}"`);}e.mode&&t.push(`mode="${e.mode}"`),e.strategy&&t.push(`engine="${e.strategy}"`),e.status==="completed"?e.matchCount!==void 0&&t.push(`matches=${e.matchCount}`):e.status==="error"&&t.push("\u274C ERROR");let n=t.join(", "),r=[];if(e.command){let i=this.simplifyRipgrepCommand(e.command);r.push(`$ ${i}`),r.push("");}e.status==="error"&&e.error?r.push(this.parseErrorMessage(e.error)):e.details&&r.push(e.details);let o=r.length>0?r.join(`
|
|
@@ -3892,7 +3899,7 @@ Neox CLI - AI \u4EE3\u7801\u52A9\u624B (AI Code Assistant) v${s}
|
|
|
3892
3899
|
\u66F4\u591A\u4FE1\u606F (More Info):
|
|
3893
3900
|
\u6587\u6863 (Docs): https://github.com/your-repo/Neox
|
|
3894
3901
|
\u95EE\u9898 (Issues): https://github.com/your-repo/Neox/issues
|
|
3895
|
-
`);}function h0(s){console.log(`Neox CLI v${s}`);}Ca();iu();Dy();ne();function Nd(){return Nr.randomBytes(16).toString("hex")}ig();Jo();lu();Jo();lu();var $d=class{constructor(e=
|
|
3902
|
+
`);}function h0(s){console.log(`Neox CLI v${s}`);}Ca();iu();Dy();ne();function Nd(){return Nr.randomBytes(16).toString("hex")}ig();Jo();lu();Jo();lu();var $d=class{constructor(e=tt){this.registry=e;this.executor=new Gs(e);}executor;parse(e){let t=e.trim();if(!t.startsWith("/"))return {matched:false};let n=t.slice(1),r=n.indexOf(" "),o,i;r===-1?(o=n,i=""):(o=n.slice(0,r),i=n.slice(r+1).trim());let a=this.registry.find(o);return a?{matched:true,skill:a,args:i}:{matched:false,error:`Unknown skill: ${o}`}}async route(e,t){let n=this.parse(e);return n.matched?this.executor.execute(n.skill.id,n.args||"",t):n.error?{success:false,error:n.error}:null}isSkillCommand(e){let t=e.trim();if(!t.startsWith("/"))return false;let n=t.slice(1).split(" ")[0];return this.registry.has(n)}getSuggestions(e){if(!e.startsWith("/"))return [];let t=e.slice(1).toLowerCase(),n=this.registry.list({userInvocable:true});return t?n.filter(r=>r.id.toLowerCase().startsWith(t)||r.metadata.name.toLowerCase().startsWith(t)||r.metadata.neox?.aliases?.some(o=>o.toLowerCase().startsWith(t))):n}getExecutor(){return this.executor}},Ly=new $d;Gy();var pl=class extends Error{status;body;constructor(e,t){super(`HTTP ${e}: ${t}`),this.name="ApiError",this.status=e,this.body=t;}};async function nF(s,e,t,n){let r=new AbortController;return t&&t.addEventListener("abort",()=>r.abort()),(async()=>{for(;!r.signal.aborted;)try{let i=await fetch(s,{headers:{Accept:"text/event-stream",...n},signal:r.signal});if(!i.ok||!i.body)throw new Error(`SSE connect failed: ${i.status}`);let a=i.body.getReader(),l=new TextDecoder,c="";for(;;){let{done:u,value:d}=await a.read();if(u)break;c+=l.decode(d,{stream:!0});let p=c.split(`
|
|
3896
3903
|
`);c=p.pop()??"";let g="",h="";for(let y of p)if(y.startsWith("event:"))g=y.slice(6).trim();else if(y.startsWith("data:"))h+=y.slice(5).trim();else if(y===""){if(g&&h&&g!=="heartbeat"&&g!=="connected")try{let b=JSON.parse(h);e(b);}catch{}g="",h="";}}}catch{if(r.signal.aborted)return;await new Promise(a=>setTimeout(a,2e3));}})(),{close:()=>r.abort()}}var oo=class{baseUrl;token;constructor(e){typeof e=="string"?this.baseUrl=e:(this.baseUrl=e?.baseUrl??"http://127.0.0.1:4399",this.token=e?.token);}get authHeaders(){return this.token?{Authorization:`Bearer ${this.token}`}:{}}async subscribe(e,t,n){let r=t?`${this.baseUrl}/events?sessionId=${encodeURIComponent(t)}`:`${this.baseUrl}/events`;return nF(r,e,n,this.authHeaders)}async chat(e,t,n){await this.post(`/session/${e}/chat`,{prompt:t,...n});}async abort(e){await this.post(`/session/${e}/abort`);}async replyPermission(e,t,n){await this.post(`/permission/${e}/reply`,{approved:t,message:n});}async getRunMode(){return (await this.get("/mode")).mode}async setRunMode(e){await this.post("/mode",{mode:e});}async injectMessage(e,t){await this.post(`/session/${e}/inject`,{message:t});}async getStatus(){return this.get("/status")}async isHealthy(){try{return (await fetch(`${this.baseUrl}/health`,{signal:AbortSignal.timeout(3e3)})).ok}catch{return false}}async setSandboxMode(e,t){await this.post(`/session/${e}/sandbox`,{enabled:t});}async setApprovalMode(e,t){await this.post(`/session/${e}/approval`,{mode:t});}async compactSession(e){await this.post(`/session/${e}/compact`);}async clearSession(e){await this.post(`/session/${e}/clear`);}async getContextHealth(e){return this.get(`/session/${e}/context-health`)}async getSessionInfo(e){return this.get(`/session/${e}/info`)}async setCompressionMode(e,t){await this.post(`/session/${e}/compression`,{mode:t});}async getMemoryStats(e){return this.get(`/session/${e}/memory`)}async clearMemory(e){await this.post(`/session/${e}/memory/clear`);}async addMemoryMessage(e,t,n){await this.post(`/session/${e}/memory/add`,{role:t,content:n});}async getToolList(){return this.get("/tools")}async reloadTools(e){await this.post("/tools/reload",{workDir:e});}async setWorkspace(e){await this.post("/workspace",{workDir:e});}async startCheckpointWatching(e){return (await this.post("/checkpoint/start-watching",{sessionId:e}))?.checkpointId??null}async stopCheckpointWatching(){await this.post("/checkpoint/stop-watching");}async createCheckpoint(e,t){return this.post("/checkpoint/create",{sessionId:e,label:t})}async rollbackToCheckpoint(e){return this.post("/checkpoint/rollback",{checkpointId:e})}async rollbackSingleFile(e){return this.post("/checkpoint/rollback-file",{filePath:e})}async reapplySingleFile(e){return this.post("/checkpoint/reapply-file",{filePath:e})}async getCheckpoints(e,t){let n=new URLSearchParams;e!=null&&n.set("limit",String(e)),t&&n.set("sessionId",t);let r=n.toString();return this.get(`/checkpoints${r?`?${r}`:""}`)}async getCheckpointStats(){return this.get("/checkpoint/stats")}async getCheckpointChanges(){return this.get("/checkpoint/changes")}async setCheckpointEnabled(e){await this.post("/checkpoint/enabled",{enabled:e});}async isCheckpointEnabled(){return (await this.get("/checkpoint/enabled")).enabled}async cleanupCheckpoints(){await this.post("/checkpoint/cleanup");}async setTTSEnabled(e){return this.post("/tts",{enabled:e})}async getTTSStatus(){return this.get("/tts")}async get(e){let t=await fetch(`${this.baseUrl}${e}`,{headers:{...this.authHeaders}});if(!t.ok)throw new pl(t.status,await t.text());return t.json()}async post(e,t){let n=await fetch(`${this.baseUrl}${e}`,{method:"POST",headers:{...this.authHeaders,...t?{"Content-Type":"application/json"}:{}},body:t?JSON.stringify(t):void 0});if(!n.ok)throw new pl(n.status,await n.text());let r=await n.text();return r?JSON.parse(r):void 0}async del(e){let t=await fetch(`${this.baseUrl}${e}`,{method:"DELETE",headers:{...this.authHeaders}});if(!t.ok)throw new pl(t.status,await t.text());let n=await t.text();return n?JSON.parse(n):void 0}async registerDevice(e,t){return this.post("/device/register",{device:e,capabilities:t})}async getDevice(e){return this.get(`/device/${e}`)}async getDevices(){return this.get("/devices")}async removeDevice(e){await this.del(`/device/${e}`);}async getHostStatus(){return this.get("/host/status")}async getHostAgents(){return this.get("/host/agents")}async getHostActivity(e){let t=e!=null?`?limit=${e}`:"";return this.get(`/host/activity${t}`)}async getHostSession(){return this.get("/host/session")}async getHostSystem(){return this.get("/host/system")}async hostInterrupt(e){return this.post("/host/interrupt",{reason:e})}async hostSendCommand(e,t){return this.post("/host/command",{text:e,priority:t})}async setAuth(e){return this.post("/admin/auth",e)}async getAuth(){return this.get("/admin/auth")}};ne();var ml=class{client;listeners=new Set;subscription=null;currentMode="single";running=new Set;constructor(e,t){this.client=new oo({baseUrl:e,token:t});}async connect(e){this.subscription=await this.client.subscribe(t=>{for(let n of this.listeners)try{n(t.data,t.tracker??{contextUsed:0,startTime:Date.now(),provider:"",model:""});}catch(r){m.error("REMOTE_ADAPTER","Event callback error",{error:r});}(t.type==="run_result"||t.type==="error")&&this.running.delete(t.sessionId);},e),m.info("REMOTE_ADAPTER","SSE connected");}async chat(e){this.running.add(e.sessionId);let t=new Promise((n,r)=>{let o=(i,a)=>{i.type==="run_result"?(this.listeners.delete(o),n()):i.type==="error"&&(this.listeners.delete(o),r(new Error(i.message||"Runtime error")));};this.listeners.add(o);});await this.client.chat(e.sessionId,e.prompt,{mode:e.mode,attachments:e.attachments,providerId:e.providerId,modelName:e.modelName}),await t;}abort(e){this.client.abort(e).catch(t=>{m.error("REMOTE_ADAPTER","Abort failed",{error:t});}),this.running.delete(e);}injectMessage(e,t){this.client.injectMessage(e,t).catch(n=>{m.error("REMOTE_ADAPTER","Inject failed",{error:n});});}onEvent(e){this.listeners.add(e);}offEvent(e){this.listeners.delete(e);}setRunMode(e){this.currentMode=e,this.client.setRunMode(e).catch(t=>{m.error("REMOTE_ADAPTER","setRunMode failed",{error:t});});}getRunMode(){return this.currentMode}getStatus(){return {isRunning:this.running.size>0,mode:this.currentMode,activeSessions:[...this.running]}}dispose(){this.subscription?.close(),this.subscription=null,this.listeners.clear(),this.running.clear();}};Xt();xi();ne();qr();Tt();var p_=new Set([".wav",".mp3",".m4a",".aiff",".aif",".ogg"]),Hy="complete.wav",Zd="/System/Library/Sounds",wF="Glass.aiff";function hl(s){return {soundEnabled:s.completionAlerts?.soundEnabled??false,soundFile:s.completionAlerts?.soundFile??"",notifyEnabled:s.completionAlerts?.notifyEnabled??false}}function qy(){try{return wt__default.existsSync(Pr)?wt__default.readdirSync(Pr).filter(s=>p_.has(Ie__default.extname(s).toLowerCase())).sort((s,e)=>s.localeCompare(e)):[]}catch{return []}}function m_(){if(process.platform!=="darwin")return [];try{return wt__default.existsSync(Zd)?wt__default.readdirSync(Zd).filter(s=>p_.has(Ie__default.extname(s).toLowerCase())).sort((s,e)=>s.localeCompare(e)):[]}catch{return []}}function g_(){return Zd}function TF(s){if(s){let n=Ie__default.isAbsolute(s)?s:Ie__default.join(Pr,s);if(wt__default.existsSync(n))return n}let e=Ie__default.join(Pr,Hy);if(wt__default.existsSync(e))return e;let t=qy();if(t.length>0)return Ie__default.join(Pr,t[0]);if(process.platform==="darwin"){let n=Ie__default.join(Zd,wF);if(wt__default.existsSync(n))return n}return null}function h_(s,e){let t="Neox CLI",n=G().notify.taskComplete,r=e?.summary?.durationMs,o=r?`${n} - ${(r/1e3).toFixed(1)}s`:n;if(s.notifyEnabled&&SF(t,o),s.soundEnabled){let i=TF(s.soundFile);xF(i);}}function bs(s,e,t){try{let n=spawn(s,e,{stdio:"ignore"});n.on("error",r=>{process.env.CLI_DEBUG&&m.debug("ALERT",`Failed to spawn ${s}`,{error:r}),t&&t();}),n.unref();}catch(n){process.env.CLI_DEBUG&&m.debug("ALERT",`Failed to execute ${s}`,{error:n}),t&&t();}}function ys(){try{process.stdout.write("\x07");}catch{}}function d_(s){return s.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function ep(s){return s.replace(/'/g,"''")}function xF(s){if(!s||!wt__default.existsSync(s)){ys();return}if(process.platform==="darwin"){bs("afplay",[s],ys);return}if(ft()){let e=Ie__default.extname(s).toLowerCase();if(e!==".wav"&&e!==".wave"){ys();return}let t=ks(s),r=`(New-Object Media.SoundPlayer '${ep(t)}').PlaySync()`;bs("powershell.exe",["-NoProfile","-Command",r],ys);return}if(process.platform==="linux"){bs("paplay",[s],()=>{bs("aplay",[s],ys);});return}if(process.platform==="win32"){let e=Ie__default.extname(s).toLowerCase();if(e!==".wav"&&e!==".wave"){ys();return}let n=`(New-Object Media.SoundPlayer '${ep(s)}').PlaySync()`;bs("powershell",["-NoProfile","-Command",n],ys);return}ys();}function SF(s,e){if(process.platform==="darwin"){let t=`display notification "${d_(e)}" with title "${d_(s)}"`;bs("osascript",["-e",t]);return}if(ft()){let t=ep(s),n=ep(e),r=`
|
|
3897
3904
|
[Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
|
|
3898
3905
|
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
|
|
@@ -3912,7 +3919,7 @@ Model: ${r}`);}else await Qy(s,r);P_(s,n);}async function up(s,e,t){let n=t||s.p
|
|
|
3912
3919
|
`));let l={...s.userConfig,smartRead:{...s.userConfig.smartRead,enabled:true}};s.updateConfig(l),Me(l);}async function zF(s,e){if(!(await e.getStats()).hasIndex){s.logInfo("\u7D22\u5F15\u4E0D\u5B58\u5728","\u65E0\u9700\u6E05\u9664");return}try{if(await s.promptSelect("\u26A0\uFE0F \u786E\u5B9A\u8981\u6E05\u9664\u6240\u6709\u7D22\u5F15\u6587\u4EF6\u5417?",[{label:"\u53D6\u6D88",value:"no",description:"\u4FDD\u7559\u7D22\u5F15\u6587\u4EF6"},{label:"\u786E\u5B9A\u6E05\u9664",value:"yes",description:"\u5220\u9664\u6240\u6709\u7D22\u5F15\u6587\u4EF6"}],"no","\u6309 \u2191\u2193 \u9009\u62E9")!=="yes"){s.logInfo("\u64CD\u4F5C\u5DF2\u53D6\u6D88");return}await e.clear(),s.logInfo(w.success("\u2713 \u7D22\u5F15\u5DF2\u6E05\u9664"));}catch(n){n?.message!=="cancelled"&&s.logInfo("\u6E05\u9664\u5931\u8D25",n?.message);}}async function HF(s){let e=s.userConfig.smartRead||{enabled:true},t=[{label:"Web \u5F00\u53D1 (TS + JS)",value:"web",languages:["typescript","javascript"]},{label:"Full Stack (TS + JS + Python)",value:"fullstack",languages:["typescript","javascript","python"]},{label:"\u5168\u90E8\u8BED\u8A00",value:"all",languages:["typescript","javascript","python","java","go","rust"]},{label:"\u4EC5 TypeScript",value:"ts",languages:["typescript"]},{label:"\u4EC5 Python",value:"python",languages:["python"]},{label:"\u4EC5 Go",value:"go",languages:["go"]}];try{let n=await s.promptSelect("\u9009\u62E9\u8981\u7D22\u5F15\u7684\u8BED\u8A00",t.map(i=>({label:i.label,value:i.value,description:i.languages.join(", ")})),"fullstack","\u6309 \u2191\u2193 \u9009\u62E9\uFF0CEnter \u786E\u8BA4"),r=t.find(i=>i.value===n);if(!r){s.logInfo("\u914D\u7F6E\u5DF2\u53D6\u6D88");return}let o={...s.userConfig,smartRead:{...e,enabled:!0,languages:r.languages}};s.updateConfig(o),Me(o),s.logInfo(w.success("\u2713 \u914D\u7F6E\u5DF2\u4FDD\u5B58"),`\u8BED\u8A00: ${r.languages.join(", ")}
|
|
3913
3920
|
\u8FD0\u884C /index rebuild \u4EE5\u5E94\u7528\u65B0\u914D\u7F6E`);}catch(n){n?.message!=="cancelled"&&s.logInfo("\u914D\u7F6E\u5931\u8D25",n?.message);}}Tt();function qF(s){if(s===0)return {systemTokens:0,toolTokens:0,messageTokens:0};let e=Math.floor(s*.125),t=Math.floor(s*.25),n=s-e-t;return {systemTokens:e,toolTokens:t,messageTokens:Math.max(0,n)}}function KF(s){return {compressionMode:s.context?.compressionMode??"sync",thresholdPercent:s.context?.thresholdPercent??85}}async function fr(s,e){let t=KF(s.userConfig);if(!e)try{e=await s.promptSelect("\u4E0A\u4E0B\u6587\u7BA1\u7406",[{label:"\u25CF \u67E5\u770B\u8BE6\u7EC6\u72B6\u6001",value:"show",description:"\u663E\u793A context \u4F7F\u7528\u60C5\u51B5\u548C\u5206\u7C7B\u5360\u6BD4"},{label:"\u25CF \u8BBE\u7F6E\u538B\u7F29\u9608\u503C",value:"threshold",description:`\u5F53\u524D: ${t.thresholdPercent}% - \u89E6\u53D1\u538B\u7F29\u7684 token \u4F7F\u7528\u7387`},{label:"\u25CF \u5207\u6362\u538B\u7F29\u6A21\u5F0F",value:"mode",description:t.compressionMode==="sync"?"\u5F53\u524D: \u540C\u6B65LLM\u538B\u7F29":"\u5F53\u524D: \u5F02\u6B65LLM\u538B\u7F29"}],"show","\u6309 \u2191\u2193 \u9009\u62E9\uFF0CEnter \u786E\u8BA4\uFF0CESC \u53D6\u6D88");}catch(n){n?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",n?.message);return}switch(e){case "show":await JF(s,t);break;case "threshold":await YF(s,t);break;case "mode":await VF(s,t);break;default:s.logInfo("\u65E0\u6548\u7684\u64CD\u4F5C","\u4F7F\u7528 /context \u67E5\u770B\u53EF\u7528\u64CD\u4F5C");}}async function JF(s,e){if(s.uiController&&"showContextMenu"in s.uiController){await s.uiController.showContextMenu(),await fr(s);return}let t=i=>i>=1e3?`${(i/1e3).toFixed(1)}k`:i.toString(),n=[];n.push("\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E"),n.push("\u2502 Context Window Details \u2502"),n.push("\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F"),n.push("");let r=false;if(s.memoryPressure){let i=s.memoryPressure.getSnapshot();if(i&&i.profile&&i.pressure!==void 0){r=true;let{profile:a,tokensUsed:l,pressure:c}=i,u=Math.round(c*100),d=a.contextWindow||0,p=d-l,g=Math.floor(d*(e.thresholdPercent/100)),h=Math.max(0,g-l);n.push(`Total: ${t(l)} / ${t(d)} tokens (${u}%)`),n.push(`Remaining: ${t(p)} tokens`),n.push("");let y=e.compressionMode==="sync"?"Sync LLM":"Async LLM";n.push(`Compression: ${y} (${e.thresholdPercent}% threshold)`),n.push(""),h>0?n.push(`Compaction in: ${t(h)} tokens`):n.push("\u26A0\uFE0F Compaction threshold reached!"),n.push("");let b=qF(l);if(b.systemTokens>0||b.toolTokens>0||b.messageTokens>0){n.push("Context Breakdown:"),n.push("");let C=l>0?Math.round(b.systemTokens/l*100):0,T=l>0?Math.round(b.toolTokens/l*100):0,S=l>0?Math.round(b.messageTokens/l*100):0;n.push(` \u25A0 System: ${t(b.systemTokens)} (${C}%)`),n.push(` \u25A0 Tools: ${t(b.toolTokens)} (${T}%)`),n.push(` \u25A0 Messages: ${t(b.messageTokens)} (${S}%)`),n.push("");}}}if(!r){n.push("Total: 0 / -- tokens (0%)"),n.push("Remaining: -- tokens"),n.push("");let i=e.compressionMode==="sync"?"Sync LLM":"Async LLM";n.push(`Compression: ${i} (${e.thresholdPercent}% threshold)`),n.push(""),n.push("\u{1F4A1} Send a message to see context usage details"),n.push("");}let o=n.join(`
|
|
3914
3921
|
`);s.logInfo("Context Details",o);try{await s.promptSelect("",[{label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u8FD4\u56DE\u4E0A\u4E0B\u6587\u7BA1\u7406\u83DC\u5355"}],"back","\u6309 Enter \u8FD4\u56DE")==="back"&&await fr(s);}catch{}}async function VF(s,e){try{let t=await s.promptSelect("\u9009\u62E9\u538B\u7F29\u6A21\u5F0F",[{label:"\u25B8 \u540C\u6B65LLM\u538B\u7F29 (\u63A8\u8350)",value:"sync",description:"\u963B\u585E\u5F0FLLM\u538B\u7F29\uFF0C\u538B\u7F29\u65F6\u6682\u505C\u5BF9\u8BDD"},{label:"\u25B8 \u5F02\u6B65LLM\u538B\u7F29",value:"async",description:"\u540E\u53F0LLM\u538B\u7F29\uFF0C\u538B\u7F29\u65F6\u53EF\u7EE7\u7EED\u5BF9\u8BDD"},{label:"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",value:"separator",description:""},{label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u8FD4\u56DE\u4E0A\u4E0B\u6587\u7BA1\u7406\u83DC\u5355"}],e.compressionMode,"\u6309 \u2191\u2193 \u9009\u62E9\uFF0CESC \u53D6\u6D88");if(t==="back"){await fr(s);return}if(t==="separator"){await fr(s);return}if(t===e.compressionMode)s.logInfo("\u538B\u7F29\u6A21\u5F0F\u672A\u6539\u53D8");else {let n={...s.userConfig,context:{...e,compressionMode:t}};s.updateConfig(n),Me(n),s.runner&&s.runner.setCompressionMode(t),s.uiController&&"setCompressionMode"in s.uiController&&s.uiController.setCompressionMode(t),s.updateCompressionMode&&s.updateCompressionMode(t),s.logInfo(`\u2713 \u538B\u7F29\u6A21\u5F0F\u5DF2\u5207\u6362\u4E3A: ${t==="sync"?"\u540C\u6B65LLM\u538B\u7F29":"\u5F02\u6B65LLM\u538B\u7F29"}`);}await fr(s);}catch(t){t?.message!=="cancelled"&&s.logInfo("\u5207\u6362\u5931\u8D25",t?.message);}}async function YF(s,e){try{let t=await s.promptSelect("\u9009\u62E9\u89E6\u53D1\u538B\u7F29\u7684\u9608\u503C",[{label:"20% (\u6D4B\u8BD5)",value:"20",description:"\u6D4B\u8BD5\u81EA\u52A8\u538B\u7F29\u529F\u80FD"},{label:"70%",value:"70",description:"\u8F83\u65E9\u89E6\u53D1\uFF0C\u66F4\u79EF\u6781\u7684\u538B\u7F29"},{label:"80%",value:"80",description:"\u5E73\u8861\u9009\u62E9"},{label:"85% (\u9ED8\u8BA4)",value:"85",description:"\u63A8\u8350\u8BBE\u7F6E"},{label:"90%",value:"90",description:"\u5EF6\u8FDF\u89E6\u53D1\uFF0C\u4FDD\u7559\u66F4\u591A\u4E0A\u4E0B\u6587"},{label:"\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500",value:"separator",description:""},{label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u8FD4\u56DE\u4E0A\u4E0B\u6587\u7BA1\u7406\u83DC\u5355"}],String(e.thresholdPercent),"\u6309 \u2191\u2193 \u9009\u62E9\uFF0CESC \u53D6\u6D88");if(t==="back"){await fr(s);return}if(t==="separator"){await fr(s);return}let n=parseInt(t,10);if(n===e.thresholdPercent)s.logInfo("\u9608\u503C\u672A\u6539\u53D8");else {let r={...s.userConfig,context:{...e,thresholdPercent:n}};s.updateConfig(r),Me(r),s.uiController&&"setCompactionThreshold"in s.uiController&&s.uiController.setCompactionThreshold(n),s.updateCompactionThreshold&&s.updateCompactionThreshold(n),s.logInfo(`\u2713 \u538B\u7F29\u9608\u503C\u5DF2\u8BBE\u7F6E\u4E3A: ${n}%`);}await fr(s);}catch(t){t?.message!=="cancelled"&&s.logInfo("\u8BBE\u7F6E\u5931\u8D25",t?.message);}}Xt();Tn();ou();Tt();function pp(s){return s.modelPricing||[]}function K_(s){let e=s.cachedInputPrice!==void 0?` / cached: $${s.cachedInputPrice}`:"";return `${s.pattern}: in $${s.inputPrice} / out $${s.outputPrice}${e}`}async function W_(s){let e=pp(s.userConfig);if(e.length===0){s.logInfo(G().pricing.noPricing,G().pricing.noPricingHint);return}let t=["",`\u{1F4CA} ${G().pricing.title}`,""];for(let n of e)t.push(` \u2022 ${n.pattern}`),t.push(` Input: $${n.inputPrice} ${G().pricing.perMillionTokens}`),t.push(` Output: $${n.outputPrice} ${G().pricing.perMillionTokens}`),n.cachedInputPrice!==void 0&&t.push(` Cached: $${n.cachedInputPrice} ${G().pricing.perMillionTokens}`),t.push("");s.logInfo(t.join(`
|
|
3915
|
-
`));}async function z_(s){try{let e=await s.promptInput(`${G().pricing.modelPattern} (${G().pricing.modelPatternHint})`,"");if(!e.trim())return;let t=await s.promptInput(G().pricing.inputPrice,""),n=parseFloat(t);if(isNaN(n)||n<0){s.logInfo(G().pricing.invalidNumber);return}let r=await s.promptInput(G().pricing.outputPrice,""),o=parseFloat(r);if(isNaN(o)||o<0){s.logInfo(G().pricing.invalidNumber);return}let i=await s.promptInput(G().pricing.cachedPrice+" "+G().pricing.cachedPriceHint,""),a;if(i.trim()&&(a=parseFloat(i),isNaN(a)||a<0)){s.logInfo(G().pricing.invalidNumber);return}let l=pp(s.userConfig),c={pattern:e.trim(),inputPrice:n,outputPrice:o,cachedInputPrice:a,currency:"USD"},u=l.findIndex(p=>p.pattern===e.trim());u>=0?l[u]=c:l.push(c);let d={...s.userConfig,modelPricing:l};s.updateConfig(d),Me(d),s.logInfo(G().pricing.pricingAdded,K_(c));}catch(e){e?.message!=="cancelled"&&s.logInfo("Error",e?.message);}}async function H_(s){let e=pp(s.userConfig);if(e.length===0){s.logInfo(G().pricing.noPricing,G().pricing.noPricingHint);return}try{let t=e.map(p=>({label:p.pattern,value:p.pattern,description:`in: $${p.inputPrice} / out: $${p.outputPrice}`}));t.push({label:G().pricing.back,value:"__back__"});let n=await s.promptSelect(G().pricing.selectToEdit,t);if(n==="__back__")return;let r=e.find(p=>p.pattern===n);if(!r)return;let o=await s.promptInput(G().pricing.inputPrice,r.inputPrice.toString()),i=parseFloat(o);if(isNaN(i)||i<0){s.logInfo(G().pricing.invalidNumber);return}let a=await s.promptInput(G().pricing.outputPrice,r.outputPrice.toString()),l=parseFloat(a);if(isNaN(l)||l<0){s.logInfo(G().pricing.invalidNumber);return}let c=await s.promptInput(G().pricing.cachedPrice,r.cachedInputPrice?.toString()||""),u;if(c.trim()&&(u=parseFloat(c),isNaN(u)||u<0)){s.logInfo(G().pricing.invalidNumber);return}r.inputPrice=i,r.outputPrice=l,r.cachedInputPrice=u;let d={...s.userConfig,modelPricing:e};s.updateConfig(d),Me(d),s.logInfo(G().pricing.pricingUpdated,K_(r));}catch(t){t?.message!=="cancelled"&&s.logInfo("Error",t?.message);}}async function q_(s){let e=pp(s.userConfig);if(e.length===0){s.logInfo(G().pricing.noPricing);return}try{let t=e.map(a=>({label:a.pattern,value:a.pattern,description:`in: $${a.inputPrice} / out: $${a.outputPrice}`}));t.push({label:G().pricing.back,value:"__back__"});let n=await s.promptSelect(G().pricing.selectToDelete,t);if(n==="__back__"||await s.promptSelect(G().pricing.confirmDelete,[{label:G().common.yes,value:"yes"},{label:G().common.no,value:"no"}],"no")!=="yes")return;let o=e.filter(a=>a.pattern!==n),i={...s.userConfig,modelPricing:o};s.updateConfig(i),Me(i),s.logInfo(G().pricing.pricingDeleted,n);}catch(t){t?.message!=="cancelled"&&s.logInfo("Error",t?.message);}}async function J_(s,e){if(e)switch(e.toLowerCase()){case "view":case "list":await W_(s);return;case "add":await z_(s);return;case "edit":await H_(s);return;case "delete":case "remove":await q_(s);return}try{let t=await s.promptSelect(G().pricing.title,[{label:G().pricing.viewPricing,value:"view",description:G().pricing.viewPricingDesc},{label:G().pricing.addPricing,value:"add",description:G().pricing.addPricingDesc},{label:G().pricing.editPricing,value:"edit",description:G().pricing.editPricingDesc},{label:G().pricing.deletePricing,value:"delete",description:G().pricing.deletePricingDesc},{label:G().pricing.back,value:"back"}],"view",G().pricing.hint);if(t==="back")return;switch(t){case "view":await W_(s);break;case "add":await z_(s);break;case "edit":await H_(s);break;case "delete":await q_(s);break}}catch(t){t?.message!=="cancelled"&&s.logInfo("Selection cancelled",t?.message);}}function V_(s,e){let t=s.modelPricing||[],n=t.find(r=>r.pattern===e);if(n)return n;for(let r of t)if(r.pattern.includes("*")&&new RegExp("^"+r.pattern.replace(/\*/g,".*")+"$").test(e))return r;return null}function Y_(s,e,t,n){let r=e/1e6*s.inputPrice,o=t/1e6*s.outputPrice,i=0;return n&&s.cachedInputPrice!==void 0&&(i=n/1e6*s.cachedInputPrice),r+o+i}function Et(s){return s>=1e6?(s/1e6).toFixed(1)+"M":s>=1e3?(s/1e3).toFixed(1)+"K":s.toString()}function Cs(s,e){s.outputLines?s.outputLines(e):e.forEach(t=>Q(t));}function Z_(s){let e=new Date(s),n=new Date().getTime()-s;return n<6e4?xn()?"\u521A\u521A":"just now":n<36e5?xn()?`${Math.floor(n/6e4)} \u5206\u949F\u524D`:`${Math.floor(n/6e4)}m ago`:n<864e5?xn()?`${Math.floor(n/36e5)} \u5C0F\u65F6\u524D`:`${Math.floor(n/36e5)}h ago`:n<6048e5?xn()?`${Math.floor(n/864e5)} \u5929\u524D`:`${Math.floor(n/864e5)}d ago`:e.toLocaleString(xn()?"zh-CN":"en-US",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}async function XF(s){let e={totalCost:0,modelCount:0,unmatchedModels:[]};try{let t=await rn.getProviderStats(),n=new Set,r=new Set;for(let o of t){let i=await rn.getProviderRecords(o.provider),a=new Map;for(let l of i){let c=a.get(l.model)||{input:0,output:0,cached:0};c.input+=l.inputTokens,c.output+=l.outputTokens,c.cached+=l.cachedTokens||0,a.set(l.model,c);}for(let[l,c]of a){let u=V_(s,l);if(u){let d=Y_(u,c.input,c.output,c.cached);e.totalCost+=d,n.has(l)||(n.add(l),e.modelCount++);}else n.has(l)||(n.add(l),r.add(l));}}e.unmatchedModels=Array.from(r);}catch{}return e}async function X_(s){try{s.clearOutputLines&&s.clearOutputLines();let e=await rn.getSummary();if(e.totalRequests===0){s.logInfo("\u6682\u65E0\u4F7F\u7528\u8BB0\u5F55");return}let t=[];if(t.push(""),t.push(w.highlight("\u{1F4CA} Token \u4F7F\u7528\u7EDF\u8BA1\u603B\u89C8")),t.push(""),t.push(w.primary(" \u603B\u8BF7\u6C42\u6570: ")+w.success(Et(e.totalRequests)+" \u6B21")),t.push(w.primary(" \u603B Tokens: ")+w.success(Et(e.totalTokens))),t.push(w.primary(" Input: ")+w.dim(Et(e.totalInputTokens))),t.push(w.primary(" Output: ")+w.dim(Et(e.totalOutputTokens))),e.totalCachedTokens>0){t.push(""),t.push(w.highlight(" \u7F13\u5B58\u7EDF\u8BA1:"));let r=(e.cacheHitRate*100).toFixed(1);t.push(w.primary(" \u603B\u7F13\u5B58\u547D\u4E2D: ")+w.success(Et(e.totalCachedTokens))+w.dim(` (${r}% \u547D\u4E2D\u7387)`)),e.totalOpenaiCachedTokens>0&&t.push(w.primary(" OpenAI \u7F13\u5B58: ")+w.dim(Et(e.totalOpenaiCachedTokens))+w.success(" (50% \u8282\u7701)")),e.totalAnthropicCacheReadTokens>0&&t.push(w.primary(" Claude Read: ")+w.dim(Et(e.totalAnthropicCacheReadTokens))+w.success(" (90% \u8282\u7701)")),e.totalAnthropicCacheCreationTokens>0&&t.push(w.primary(" Claude Write: ")+w.dim(Et(e.totalAnthropicCacheCreationTokens))+w.warning(" (+25% \u6210\u672C)"));}if(t.push(""),t.push(w.primary(" Provider \u6570: ")+w.dim(e.providerCount.toString())),t.push(w.primary(" \u6700\u540E\u8BF7\u6C42: ")+w.dim(Z_(e.lastRequestTime))),s.userConfig?.modelPricing&&s.userConfig.modelPricing.length>0){let r=await XF(s.userConfig);r.totalCost>0&&(t.push(""),t.push(w.highlight(xn()?" \u{1F4B0} \u8D39\u7528\u7EDF\u8BA1:":" \u{1F4B0} Cost Summary:")),t.push(w.primary(xn()?" \u9884\u4F30\u603B\u8D39\u7528: ":" Estimated: ")+w.success(`$${r.totalCost.toFixed(4)}`)),r.modelCount>0&&t.push(w.dim(xn()?` (${r.modelCount} \u4E2A\u6A21\u578B\u6709\u5B9A\u4EF7\u914D\u7F6E)`:` (${r.modelCount} models with pricing)`)),r.unmatchedModels.length>0&&r.unmatchedModels.length<=3?t.push(w.dim(xn()?` \u672A\u914D\u7F6E\u5B9A\u4EF7: ${r.unmatchedModels.join(", ")}`:` No pricing: ${r.unmatchedModels.join(", ")}`)):r.unmatchedModels.length>3&&t.push(w.dim(xn()?` \u672A\u914D\u7F6E\u5B9A\u4EF7: ${r.unmatchedModels.length} \u4E2A\u6A21\u578B`:` No pricing: ${r.unmatchedModels.length} models`)));}t.push(""),Cs(s,t);let n=await s.promptSelect("\u7EE7\u7EED\u67E5\u770B",[{label:"\u25CF Provider \u7EDF\u8BA1",value:"providers",description:"\u67E5\u770B\u5404\u4E2A Provider \u7684\u8BE6\u7EC6\u7EDF\u8BA1"},{label:"\u25CF \u8BE6\u7EC6\u8BB0\u5F55",value:"records",description:"\u67E5\u770B\u6307\u5B9A Provider \u7684\u8BF7\u6C42\u8BB0\u5F55"},{label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u8FD4\u56DE\u4E3B\u83DC\u5355"}],"back","\u4E0A\u4E0B\u952E\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF0CESC \u8FD4\u56DE");if(n==="back"){s.clearOutputLines&&s.clearOutputLines(),await Si(s);return}n==="providers"?await mp(s):n==="records"&&await Cl(s);}catch(e){s.clearOutputLines&&s.clearOutputLines(),e.message!=="cancelled"&&e.message!=="User cancelled"&&Cs(s,[w.error("\u52A0\u8F7D\u7EDF\u8BA1\u5931\u8D25: "+e.message)]);}}function QF(s){let e=[];e.push(w.success("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),e.push(w.primary(`${s.provider}`)+w.dim(` (${s.totalRequests} \u6B21\u8BF7\u6C42)`)),e.push(""),e.push(w.dim("Input: ")+w.primary(Et(s.totalInputTokens).padEnd(8))+w.dim("Output: ")+w.success(Et(s.totalOutputTokens).padEnd(8))+w.dim("Total: ")+w.warning(Et(s.totalTokens))),s.totalCachedTokens>0&&(e.push(""),s.totalOpenaiCachedTokens>0&&e.push(w.dim("OpenAI \u7F13\u5B58: ")+w.code(Et(s.totalOpenaiCachedTokens))+w.success(" (50% \u8282\u7701)")),s.totalAnthropicCacheReadTokens>0&&e.push(w.dim("Claude Read: ")+w.info(Et(s.totalAnthropicCacheReadTokens))+w.success(" (90% \u8282\u7701)")),s.totalAnthropicCacheCreationTokens>0&&e.push(w.dim("Claude Write: ")+w.code(Et(s.totalAnthropicCacheCreationTokens))+w.warning(" (+25% \u6210\u672C)")));let t=s.totalRequests>0?(s.successRequests/s.totalRequests*100).toFixed(1):"0";e.push(""),e.push(w.dim("\u6210\u529F\u7387: ")+w.success(t+"%")+w.dim(" \u5E73\u5747\u8017\u65F6: ")+w.warning(s.avgDuration+"ms"));let n=Object.entries(s.models);if(n.length>0){e.push(""),e.push(w.dim("\u6A21\u578B\u5206\u5E03:"));for(let[r,o]of n.slice(0,3)){let i=r.length>30?r.slice(0,27)+"...":r;e.push(w.dim(` ${i.padEnd(30)} `)+w.primary(Et(o.totalTokens).padEnd(8))+w.dim(` (${o.requests} \u6B21)`));}n.length>3&&e.push(w.dim(` ... \u8FD8\u6709 ${n.length-3} \u4E2A\u6A21\u578B`));}return e.push(""),e}async function mp(s){try{let e=await rn.getProviderStats();if(e.length===0){s.logInfo("\u6682\u65E0 Provider \u7EDF\u8BA1");return}let t=2,n=Math.ceil(e.length/t),r=0;for(;;){s.clearOutputLines&&s.clearOutputLines();let o=r*t,i=Math.min(o+t,e.length),a=e.slice(o,i),l=[];l.push(""),l.push(w.highlight("\u{1F4C8} Provider \u7EDF\u8BA1")+w.dim(` (\u7B2C ${r+1}/${n} \u9875)`)),l.push("");for(let d of a)l.push(...QF(d));l.push(w.success("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),l.push(""),Cs(s,l);let c=[];r>0&&c.push({label:"\u2190 \u4E0A\u4E00\u9875",value:"prev",description:`\u67E5\u770B\u7B2C ${r} \u9875`}),r<n-1&&c.push({label:"\u2192 \u4E0B\u4E00\u9875",value:"next",description:`\u67E5\u770B\u7B2C ${r+2} \u9875`}),c.push({label:"\u25CF \u8BE6\u7EC6\u8BB0\u5F55",value:"records",description:"\u67E5\u770B\u6307\u5B9A Provider \u7684\u8BF7\u6C42\u8BB0\u5F55"}),c.push({label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u8FD4\u56DE\u4E3B\u83DC\u5355"});let u=await s.promptSelect("\u7EE7\u7EED\u67E5\u770B",c,"back","\u4E0A\u4E0B\u952E\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF0CESC \u8FD4\u56DE");if(u==="prev"){r--;continue}else if(u==="next"){r++;continue}if(u==="back"){s.clearOutputLines&&s.clearOutputLines(),await Si(s);return}if(u==="records"){await Cl(s);return}}}catch(e){s.clearOutputLines&&s.clearOutputLines(),e.message!=="cancelled"&&e.message!=="User cancelled"&&Cs(s,[w.error("\u52A0\u8F7D Provider \u7EDF\u8BA1\u5931\u8D25: "+e.message)]);}}async function Cl(s){try{s.clearOutputLines&&s.clearOutputLines();let e=await rn.getProviderStats();if(e.length===0){s.logInfo("\u6682\u65E0 Provider \u7EDF\u8BA1");return}let t=e.map(i=>({label:i.provider,value:i.provider,description:`${i.totalRequests} \u6B21\u8BF7\u6C42, ${Et(i.totalTokens)} tokens`}));t.push({label:"\u2190 \u8FD4\u56DE",value:"__back__",description:"\u8FD4\u56DE\u4E3B\u83DC\u5355"});let n=await s.promptSelect("\u9009\u62E9 Provider \u67E5\u770B\u8BE6\u7EC6\u8BB0\u5F55",t,e[0].provider,"\u4E0A\u4E0B\u952E\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF0CESC \u8FD4\u56DE");if(n==="__back__"){s.clearOutputLines&&s.clearOutputLines(),await Si(s);return}s.clearOutputLines&&s.clearOutputLines();let r=await rn.getProviderRecords(n,50);if(r.length===0){s.logInfo("\u8BE5 Provider \u6682\u65E0\u8BB0\u5F55");return}let o=[];o.push(""),o.push(w.highlight(`\u{1F4DD} ${n} - \u6700\u8FD1 ${r.length} \u6761\u8BB0\u5F55`)),o.push(""),o.push(w.dim(" \u7C7B\u578B ")+w.dim("\u6A21\u578B ")+w.dim("Input ")+w.dim("Output ")+w.dim("Cache ")+w.dim("\u8017\u65F6 ")+w.dim("\u72B6\u6001 ")+w.dim("\u65F6\u95F4")),o.push(w.dim(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));for(let i of r){let a=i.requestType==="health-check"?"\u6D4B\u8BD5":"\u5BF9\u8BDD",l=i.model.length>14?i.model.slice(0,11)+"...":i.model,c=Et(i.inputTokens).padEnd(7),u=Et(i.outputTokens).padEnd(7),d=i.cachedTokens?Et(i.cachedTokens).padEnd(7):"-".padEnd(7),p=(i.duration+"ms").padEnd(7),g=i.success?w.success("\u2713"):w.error("\u2717"),h=Z_(i.timestamp);o.push(w.dim(" "+a.padEnd(8))+w.primary(l.padEnd(16))+w.dim(c)+w.success(u)+w.code(d)+w.warning(p)+g+" "+w.dim(h));}o.push(""),Cs(s,o);try{let i=await s.promptSelect("\u7EE7\u7EED\u67E5\u770B",[{label:"\u2190 \u8FD4\u56DE\u4E3B\u83DC\u5355",value:"back",description:"\u8FD4\u56DE\u7EDF\u8BA1\u4E3B\u83DC\u5355"},{label:"\u25CF Provider \u7EDF\u8BA1",value:"providers",description:"\u8FD4\u56DE Provider \u7EDF\u8BA1\u5217\u8868"},{label:"\u25CF \u67E5\u770B\u5176\u4ED6 Provider",value:"other",description:"\u67E5\u770B\u5176\u4ED6 Provider \u7684\u8BE6\u7EC6\u8BB0\u5F55"}],"back","\u4E0A\u4E0B\u952E\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF0CESC \u8FD4\u56DE");s.clearOutputLines&&s.clearOutputLines(),i==="other"?await Cl(s):i==="providers"?await mp(s):i==="back"&&await Si(s);}catch{s.clearOutputLines&&s.clearOutputLines();}}catch(e){e.message==="cancelled"||e.message==="User cancelled"?s.clearOutputLines&&s.clearOutputLines():s.logInfo("\u52A0\u8F7D\u8BE6\u7EC6\u8BB0\u5F55\u5931\u8D25",e.message);}}async function Q_(s){try{let e=await rn.getProviderStats(),t=[{label:"\u6E05\u9664\u6240\u6709\u7EDF\u8BA1",value:"all",description:"\u26A0\uFE0F \u6E05\u9664\u6240\u6709 Provider \u7684\u7EDF\u8BA1\u6570\u636E"}];if(e.length>0)for(let r of e)t.push({label:`\u6E05\u9664 ${r.provider}`,value:r.provider,description:`\u6E05\u9664\u8BE5 Provider \u7684 ${r.totalRequests} \u6761\u8BB0\u5F55`});t.push({label:"\u53D6\u6D88",value:"cancel",description:"\u8FD4\u56DE\u4E0A\u4E00\u7EA7"});let n=await s.promptSelect("\u6E05\u9664\u7EDF\u8BA1\u6570\u636E",t,"cancel","\u26A0\uFE0F \u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D");if(n==="cancel")return;n==="all"?(await rn.clearAll(),s.logInfo("\u5DF2\u6E05\u9664\u6240\u6709\u7EDF\u8BA1\u6570\u636E")):(await rn.clearProvider(n),s.logInfo(`\u5DF2\u6E05\u9664 ${n} \u7684\u7EDF\u8BA1\u6570\u636E`));}catch(e){Cs(s,[w.error("\u6E05\u9664\u7EDF\u8BA1\u5931\u8D25: "+e.message)]);}}async function Si(s,e){if(e)switch(e){case "summary":await X_(s);return;case "providers":await mp(s);return;case "records":await Cl(s);return;case "clear":await Q_(s);return;default:Cs(s,[w.error(`\u672A\u77E5\u64CD\u4F5C: ${e}`),w.dim("\u53EF\u7528\u64CD\u4F5C: summary, providers, records, clear")]);return}try{let t=await s.promptSelect("Token \u4F7F\u7528\u7EDF\u8BA1",[{label:"\u25CF \u67E5\u770B\u603B\u89C8",value:"summary",description:"\u663E\u793A\u6574\u4F53 Token \u4F7F\u7528\u7EDF\u8BA1"},{label:"\u25CF Provider \u7EDF\u8BA1",value:"providers",description:"\u67E5\u770B\u5404\u4E2A Provider \u7684\u8BE6\u7EC6\u7EDF\u8BA1"},{label:"\u25CF \u8BE6\u7EC6\u8BB0\u5F55",value:"records",description:"\u67E5\u770B\u6307\u5B9A Provider \u7684\u8BF7\u6C42\u8BB0\u5F55"},{label:"\u25CF \u6E05\u9664\u7EDF\u8BA1",value:"clear",description:"\u6E05\u9664\u7EDF\u8BA1\u6570\u636E"},{label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u8FD4\u56DE\u4E0A\u4E00\u7EA7"}],"summary","\u4E0A\u4E0B\u952E\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF0CESC \u9000\u51FA");if(t==="back")return;switch(t){case "summary":await X_(s);break;case "providers":await mp(s);break;case "records":await Cl(s);break;case "clear":await Q_(s);break}}catch(t){t.message!=="User cancelled"&&t.message!=="cancelled"&&Cs(s,[w.error("\u7EDF\u8BA1\u547D\u4EE4\u5931\u8D25: "+t.message)]);}}Xt();Tn();Tt();cr();async function eI(s,e){let t=e?.toLowerCase();if(!t)try{t=await s.promptSelect("\u8BB0\u5FC6\u7CFB\u7EDF",[{label:"\u25CF \u67E5\u770B\u8BB0\u5FC6\u7EDF\u8BA1",value:"show",description:"\u77ED\u671F/\u4E2D\u671F/\u957F\u671F/\u6C38\u4E45 \u6761\u6570\u4E0E\u5927\u5C0F"},{label:"\u25CF \u67E5\u770B\u8DEF\u5F84",value:"paths",description:"\u663E\u793A\u8BB0\u5FC6\u6587\u4EF6\u8DEF\u5F84"},{label:"\u25CF \u914D\u7F6E\u6458\u8981\u6A21\u578B",value:"config",description:"\u5F00\u5173\u8BB0\u5FC6\u6458\u8981\u4E0E\u9009\u62E9\u6A21\u578B"},{label:"\u25CF \u8C03\u8BD5\u6CE8\u5165\u5185\u5BB9",value:"debug",description:"\u663E\u793A\u5F53\u524D\u4F1A\u6CE8\u5165\u7684\u8BB0\u5FC6\u6458\u8981"}],"show","\u6309 \u2191\u2193 \u9009\u62E9\uFF0CEnter \u786E\u8BA4\uFF0CESC \u53D6\u6D88");}catch(n){n?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",n?.message);return}switch(t){case "show":case "stats":await nU(s);break;case "paths":await rU(s);break;case "config":case "configure":await ZF(s);break;case "debug":await sU(s);break;default:s.logInfo("\u65E0\u6548\u7684\u64CD\u4F5C","\u4F7F\u7528 /memory \u67E5\u770B\u53EF\u7528\u64CD\u4F5C");}}async function ZF(s){let e=s.userConfig.memory??{},t=e.summarizerEnabled??true,n=e.summarizerModel??"",r=e.summarizerProviderId??"",o;try{o=await s.promptSelect("\u8BB0\u5FC6\u6458\u8981\u8BBE\u7F6E",[{label:`\u25CF \u6458\u8981\u5F00\u5173: ${t?"\u5F00\u542F":"\u5173\u95ED"}`,value:"toggle",description:"\u63A7\u5236\u81EA\u52A8\u8BB0\u5FC6\u6458\u8981"},{label:`\u25CF \u6458\u8981\u6A21\u578B: ${n||"\u9ED8\u8BA4"}`,value:"model",description:"\u9009\u62E9\u6458\u8981\u6A21\u578B\uFF08\u5982 haiku/gpt\uFF09"},{label:`\u25CF \u6458\u8981 Provider: ${r||"\u81EA\u52A8"}`,value:"provider",description:"\u6307\u5B9A\u6458\u8981\u4F7F\u7528\u7684 Provider\uFF08\u53EF\u9009\uFF09"},{label:"\u25CF \u8FD4\u56DE",value:"back"}],"toggle","Enter \u9009\u62E9\uFF0CESC \u53D6\u6D88");}catch(i){i?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",i?.message);return}if(o!=="back"){if(o==="toggle"){let i=await s.promptSelect("\u662F\u5426\u542F\u7528\u8BB0\u5FC6\u6458\u8981",[{label:"\u5F00\u542F",value:"on"},{label:"\u5173\u95ED",value:"off"}],t?"on":"off");wl(s,{summarizerEnabled:i==="on"}),s.logInfo("\u8BB0\u5FC6\u6458\u8981\u5DF2\u66F4\u65B0",i==="on"?"\u5DF2\u5F00\u542F":"\u5DF2\u5173\u95ED");return}if(o==="model"){let i;try{i=await eU(s,n);}catch(c){c?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",c?.message);return}let{model:a,existsInConfig:l}=i;if(a==="__cancel__")return;if(a==="__default__"){wl(s,{summarizerModel:void 0}),s.logInfo("\u6458\u8981\u6A21\u578B\u5DF2\u66F4\u65B0","\u4F7F\u7528\u9ED8\u8BA4\u6A21\u578B");return}if(wl(s,{summarizerModel:a}),!l){s.logInfo("\u6458\u8981\u6A21\u578B\u5DF2\u8BBE\u7F6E",`\u6A21\u578B "${a}" \u672A\u5728 provider \u914D\u7F6E\u4E2D\u627E\u5230\uFF0C\u53EF\u80FD\u65E0\u6CD5\u751F\u6548`);return}s.logInfo("\u6458\u8981\u6A21\u578B\u5DF2\u8BBE\u7F6E",a);return}if(o==="provider"){let i;try{i=await tU(s,r);}catch(a){a?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",a?.message);return}if(!i)return;if(i==="__auto__"){wl(s,{summarizerProviderId:void 0}),s.logInfo("\u6458\u8981 Provider \u5DF2\u66F4\u65B0","\u81EA\u52A8\u9009\u62E9");return}wl(s,{summarizerProviderId:i}),s.logInfo("\u6458\u8981 Provider \u5DF2\u8BBE\u7F6E",i);}}}async function eU(s,e){let t=new nt(s.userConfig),n=new Set;for(let l of t.getProviders())for(let c of l.models??[])c?.name&&n.add(c.name);let r=["claude-haiku-4-5-20251001","claude-haiku","gpt-4o-mini","gpt-4.1-mini","gpt-4o","gemini-1.5-flash","gemini-2.0-flash"],o=Array.from(new Set([...r,...n])),i=[{label:"\u9ED8\u8BA4\uFF08\u81EA\u52A8\u9009\u62E9\uFF09",value:"__default__",description:"\u4F7F\u7528\u9ED8\u8BA4\u6458\u8981\u6A21\u578B"},...o.map(l=>({label:l,value:l,description:n.has(l)?void 0:"\u672A\u5728 provider \u914D\u7F6E\u4E2D\u627E\u5230"})),{label:"\u81EA\u5B9A\u4E49\u6A21\u578B",value:"__custom__",description:"\u8F93\u5165\u81EA\u5B9A\u4E49\u6A21\u578B\u540D\u79F0"}],a=await s.promptSelect("\u9009\u62E9\u6458\u8981\u6A21\u578B",i,e||"__default__");if(a==="__custom__"){let c=(await s.promptText("\u8F93\u5165\u6A21\u578B\u540D\u79F0",{allowEmpty:false})).trim();return {model:c||"__cancel__",existsInConfig:n.has(c)}}return {model:a||"__cancel__",existsInConfig:n.has(a)}}async function tU(s,e){let n=new nt(s.userConfig).getProviders();if(n.length===0)return s.logInfo("\u672A\u914D\u7F6E Provider","\u8BF7\u5148\u901A\u8FC7 /provider \u6DFB\u52A0"),null;let r=[{label:"\u81EA\u52A8\u9009\u62E9",value:"__auto__",description:"\u6839\u636E\u6A21\u578B\u81EA\u52A8\u5339\u914D"},...n.map(i=>({label:i.id,value:i.id,description:i.name}))];return await s.promptSelect("\u9009\u62E9\u6458\u8981 Provider",r,e||"__auto__")}function wl(s,e){let t={...s.userConfig.memory??{}};"summarizerEnabled"in e&&(t.summarizerEnabled=e.summarizerEnabled),"summarizerModel"in e&&(e.summarizerModel?t.summarizerModel=e.summarizerModel:delete t.summarizerModel),"summarizerProviderId"in e&&(e.summarizerProviderId?t.summarizerProviderId=e.summarizerProviderId:delete t.summarizerProviderId);let n={...s.userConfig,memory:t};s.updateConfig(n),Me(n);}async function nU(s){let e=await s.actionLog.getMemoryStats(),t=oU(e);tb(s,t);}async function rU(s){let e=await s.actionLog.getMemoryStats(),t=iU(e);tb(s,t);}async function sU(s){let e=await s.actionLog.getMemoryInjectionSummary({language:s.userConfig.language??"zh",includePersistent:true,includeLastRun:true}),t=[];t.push(""),t.push(w.highlight(" \u8BB0\u5FC6\u6CE8\u5165\u9884\u89C8")),t.push(""),e?e.split(`
|
|
3922
|
+
`));}async function z_(s){try{let e=await s.promptInput(`${G().pricing.modelPattern} (${G().pricing.modelPatternHint})`,"");if(!e.trim())return;let t=await s.promptInput(G().pricing.inputPrice,""),n=parseFloat(t);if(isNaN(n)||n<0){s.logInfo(G().pricing.invalidNumber);return}let r=await s.promptInput(G().pricing.outputPrice,""),o=parseFloat(r);if(isNaN(o)||o<0){s.logInfo(G().pricing.invalidNumber);return}let i=await s.promptInput(G().pricing.cachedPrice+" "+G().pricing.cachedPriceHint,""),a;if(i.trim()&&(a=parseFloat(i),isNaN(a)||a<0)){s.logInfo(G().pricing.invalidNumber);return}let l=pp(s.userConfig),c={pattern:e.trim(),inputPrice:n,outputPrice:o,cachedInputPrice:a,currency:"USD"},u=l.findIndex(p=>p.pattern===e.trim());u>=0?l[u]=c:l.push(c);let d={...s.userConfig,modelPricing:l};s.updateConfig(d),Me(d),s.logInfo(G().pricing.pricingAdded,K_(c));}catch(e){e?.message!=="cancelled"&&s.logInfo("Error",e?.message);}}async function H_(s){let e=pp(s.userConfig);if(e.length===0){s.logInfo(G().pricing.noPricing,G().pricing.noPricingHint);return}try{let t=e.map(p=>({label:p.pattern,value:p.pattern,description:`in: $${p.inputPrice} / out: $${p.outputPrice}`}));t.push({label:G().pricing.back,value:"__back__"});let n=await s.promptSelect(G().pricing.selectToEdit,t);if(n==="__back__")return;let r=e.find(p=>p.pattern===n);if(!r)return;let o=await s.promptInput(G().pricing.inputPrice,r.inputPrice.toString()),i=parseFloat(o);if(isNaN(i)||i<0){s.logInfo(G().pricing.invalidNumber);return}let a=await s.promptInput(G().pricing.outputPrice,r.outputPrice.toString()),l=parseFloat(a);if(isNaN(l)||l<0){s.logInfo(G().pricing.invalidNumber);return}let c=await s.promptInput(G().pricing.cachedPrice,r.cachedInputPrice?.toString()||""),u;if(c.trim()&&(u=parseFloat(c),isNaN(u)||u<0)){s.logInfo(G().pricing.invalidNumber);return}r.inputPrice=i,r.outputPrice=l,r.cachedInputPrice=u;let d={...s.userConfig,modelPricing:e};s.updateConfig(d),Me(d),s.logInfo(G().pricing.pricingUpdated,K_(r));}catch(t){t?.message!=="cancelled"&&s.logInfo("Error",t?.message);}}async function q_(s){let e=pp(s.userConfig);if(e.length===0){s.logInfo(G().pricing.noPricing);return}try{let t=e.map(a=>({label:a.pattern,value:a.pattern,description:`in: $${a.inputPrice} / out: $${a.outputPrice}`}));t.push({label:G().pricing.back,value:"__back__"});let n=await s.promptSelect(G().pricing.selectToDelete,t);if(n==="__back__"||await s.promptSelect(G().pricing.confirmDelete,[{label:G().common.yes,value:"yes"},{label:G().common.no,value:"no"}],"no")!=="yes")return;let o=e.filter(a=>a.pattern!==n),i={...s.userConfig,modelPricing:o};s.updateConfig(i),Me(i),s.logInfo(G().pricing.pricingDeleted,n);}catch(t){t?.message!=="cancelled"&&s.logInfo("Error",t?.message);}}async function J_(s,e){if(e)switch(e.toLowerCase()){case "view":case "list":await W_(s);return;case "add":await z_(s);return;case "edit":await H_(s);return;case "delete":case "remove":await q_(s);return}try{let t=await s.promptSelect(G().pricing.title,[{label:G().pricing.viewPricing,value:"view",description:G().pricing.viewPricingDesc},{label:G().pricing.addPricing,value:"add",description:G().pricing.addPricingDesc},{label:G().pricing.editPricing,value:"edit",description:G().pricing.editPricingDesc},{label:G().pricing.deletePricing,value:"delete",description:G().pricing.deletePricingDesc},{label:G().pricing.back,value:"back"}],"view",G().pricing.hint);if(t==="back")return;switch(t){case "view":await W_(s);break;case "add":await z_(s);break;case "edit":await H_(s);break;case "delete":await q_(s);break}}catch(t){t?.message!=="cancelled"&&s.logInfo("Selection cancelled",t?.message);}}function V_(s,e){let t=s.modelPricing||[],n=t.find(r=>r.pattern===e);if(n)return n;for(let r of t)if(r.pattern.includes("*")&&new RegExp("^"+r.pattern.replace(/\*/g,".*")+"$").test(e))return r;return null}function Y_(s,e,t,n){let r=e/1e6*s.inputPrice,o=t/1e6*s.outputPrice,i=0;return n&&s.cachedInputPrice!==void 0&&(i=n/1e6*s.cachedInputPrice),r+o+i}function Et(s){return s>=1e6?(s/1e6).toFixed(1)+"M":s>=1e3?(s/1e3).toFixed(1)+"K":s.toString()}function Cs(s,e){s.outputLines?s.outputLines(e):e.forEach(t=>Q(t));}function Z_(s){let e=new Date(s),n=new Date().getTime()-s;return n<6e4?xn()?"\u521A\u521A":"just now":n<36e5?xn()?`${Math.floor(n/6e4)} \u5206\u949F\u524D`:`${Math.floor(n/6e4)}m ago`:n<864e5?xn()?`${Math.floor(n/36e5)} \u5C0F\u65F6\u524D`:`${Math.floor(n/36e5)}h ago`:n<6048e5?xn()?`${Math.floor(n/864e5)} \u5929\u524D`:`${Math.floor(n/864e5)}d ago`:e.toLocaleString(xn()?"zh-CN":"en-US",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"})}async function XF(s){let e={totalCost:0,modelCount:0,unmatchedModels:[]};try{let t=await rn.getProviderStats(),n=new Set,r=new Set;for(let o of t){let i=await rn.getProviderRecords(o.provider),a=new Map;for(let l of i){let c=a.get(l.model)||{input:0,output:0,cached:0};c.input+=l.inputTokens,c.output+=l.outputTokens,c.cached+=l.cachedTokens||0,a.set(l.model,c);}for(let[l,c]of a){let u=V_(s,l);if(u){let d=Y_(u,c.input,c.output,c.cached);e.totalCost+=d,n.has(l)||(n.add(l),e.modelCount++);}else n.has(l)||(n.add(l),r.add(l));}}e.unmatchedModels=Array.from(r);}catch{}return e}async function X_(s){try{s.clearOutputLines&&s.clearOutputLines();let e=await rn.getSummary();if(e.totalRequests===0){s.logInfo("\u6682\u65E0\u4F7F\u7528\u8BB0\u5F55");return}let t=[];if(t.push(""),t.push(w.highlight("\u{1F4CA} Token \u4F7F\u7528\u7EDF\u8BA1\u603B\u89C8")),t.push(""),t.push(w.primary(" \u603B\u8BF7\u6C42\u6570: ")+w.success(Et(e.totalRequests)+" \u6B21")),t.push(w.primary(" \u603B Tokens: ")+w.success(Et(e.totalTokens))),t.push(w.primary(" Input: ")+w.dim(Et(e.totalInputTokens))),t.push(w.primary(" Output: ")+w.dim(Et(e.totalOutputTokens))),e.totalCachedTokens>0){t.push(""),t.push(w.highlight(" \u7F13\u5B58\u7EDF\u8BA1:"));let r=(e.cacheHitRate*100).toFixed(1);t.push(w.primary(" \u603B\u7F13\u5B58\u547D\u4E2D: ")+w.success(Et(e.totalCachedTokens))+w.dim(` (${r}% \u547D\u4E2D\u7387)`)),e.totalOpenaiCachedTokens>0&&t.push(w.primary(" OpenAI \u7F13\u5B58: ")+w.dim(Et(e.totalOpenaiCachedTokens))+w.success(" (50% \u8282\u7701)")),e.totalAnthropicCacheReadTokens>0&&t.push(w.primary(" Claude Read: ")+w.dim(Et(e.totalAnthropicCacheReadTokens))+w.success(" (90% \u8282\u7701)")),e.totalAnthropicCacheCreationTokens>0&&t.push(w.primary(" Claude Write: ")+w.dim(Et(e.totalAnthropicCacheCreationTokens))+w.warning(" (+25% \u6210\u672C)"));}if(t.push(""),t.push(w.primary(" Provider \u6570: ")+w.dim(e.providerCount.toString())),t.push(w.primary(" \u6700\u540E\u8BF7\u6C42: ")+w.dim(Z_(e.lastRequestTime))),s.userConfig?.modelPricing&&s.userConfig.modelPricing.length>0){let r=await XF(s.userConfig);r.totalCost>0&&(t.push(""),t.push(w.highlight(xn()?" \u{1F4B0} \u8D39\u7528\u7EDF\u8BA1:":" \u{1F4B0} Cost Summary:")),t.push(w.primary(xn()?" \u9884\u4F30\u603B\u8D39\u7528: ":" Estimated: ")+w.success(`$${r.totalCost.toFixed(4)}`)),r.modelCount>0&&t.push(w.dim(xn()?` (${r.modelCount} \u4E2A\u6A21\u578B\u6709\u5B9A\u4EF7\u914D\u7F6E)`:` (${r.modelCount} models with pricing)`)),r.unmatchedModels.length>0&&r.unmatchedModels.length<=3?t.push(w.dim(xn()?` \u672A\u914D\u7F6E\u5B9A\u4EF7: ${r.unmatchedModels.join(", ")}`:` No pricing: ${r.unmatchedModels.join(", ")}`)):r.unmatchedModels.length>3&&t.push(w.dim(xn()?` \u672A\u914D\u7F6E\u5B9A\u4EF7: ${r.unmatchedModels.length} \u4E2A\u6A21\u578B`:` No pricing: ${r.unmatchedModels.length} models`)));}t.push(""),Cs(s,t);let n=await s.promptSelect("\u7EE7\u7EED\u67E5\u770B",[{label:"\u25CF Provider \u7EDF\u8BA1",value:"providers",description:"\u67E5\u770B\u5404\u4E2A Provider \u7684\u8BE6\u7EC6\u7EDF\u8BA1"},{label:"\u25CF \u8BE6\u7EC6\u8BB0\u5F55",value:"records",description:"\u67E5\u770B\u6307\u5B9A Provider \u7684\u8BF7\u6C42\u8BB0\u5F55"},{label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u8FD4\u56DE\u4E3B\u83DC\u5355"}],"back","\u4E0A\u4E0B\u952E\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF0CESC \u8FD4\u56DE");if(n==="back"){s.clearOutputLines&&s.clearOutputLines(),await Si(s);return}n==="providers"?await mp(s):n==="records"&&await Cl(s);}catch(e){s.clearOutputLines&&s.clearOutputLines(),e.message!=="cancelled"&&e.message!=="User cancelled"&&Cs(s,[w.error("\u52A0\u8F7D\u7EDF\u8BA1\u5931\u8D25: "+e.message)]);}}function QF(s){let e=[];e.push(w.success("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),e.push(w.primary(`${s.provider}`)+w.dim(` (${s.totalRequests} \u6B21\u8BF7\u6C42)`)),e.push(""),e.push(w.dim("Input: ")+w.primary(Et(s.totalInputTokens).padEnd(8))+w.dim("Output: ")+w.success(Et(s.totalOutputTokens).padEnd(8))+w.dim("Total: ")+w.warning(Et(s.totalTokens))),s.totalCachedTokens>0&&(e.push(""),s.totalOpenaiCachedTokens>0&&e.push(w.dim("OpenAI \u7F13\u5B58: ")+w.code(Et(s.totalOpenaiCachedTokens))+w.success(" (50% \u8282\u7701)")),s.totalAnthropicCacheReadTokens>0&&e.push(w.dim("Claude Read: ")+w.info(Et(s.totalAnthropicCacheReadTokens))+w.success(" (90% \u8282\u7701)")),s.totalAnthropicCacheCreationTokens>0&&e.push(w.dim("Claude Write: ")+w.code(Et(s.totalAnthropicCacheCreationTokens))+w.warning(" (+25% \u6210\u672C)")));let t=s.totalRequests>0?(s.successRequests/s.totalRequests*100).toFixed(1):"0";e.push(""),e.push(w.dim("\u6210\u529F\u7387: ")+w.success(t+"%")+w.dim(" \u5E73\u5747\u8017\u65F6: ")+w.warning(s.avgDuration+"ms"));let n=Object.entries(s.models);if(n.length>0){e.push(""),e.push(w.dim("\u6A21\u578B\u5206\u5E03:"));for(let[r,o]of n.slice(0,3)){let i=r.length>30?r.slice(0,27)+"...":r;e.push(w.dim(` ${i.padEnd(30)} `)+w.primary(Et(o.totalTokens).padEnd(8))+w.dim(` (${o.requests} \u6B21)`));}n.length>3&&e.push(w.dim(` ... \u8FD8\u6709 ${n.length-3} \u4E2A\u6A21\u578B`));}return e.push(""),e}async function mp(s){try{let e=await rn.getProviderStats();if(e.length===0){s.logInfo("\u6682\u65E0 Provider \u7EDF\u8BA1");return}let t=2,n=Math.ceil(e.length/t),r=0;for(;;){s.clearOutputLines&&s.clearOutputLines();let o=r*t,i=Math.min(o+t,e.length),a=e.slice(o,i),l=[];l.push(""),l.push(w.highlight("\u{1F4C8} Provider \u7EDF\u8BA1")+w.dim(` (\u7B2C ${r+1}/${n} \u9875)`)),l.push("");for(let d of a)l.push(...QF(d));l.push(w.success("\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501")),l.push(""),Cs(s,l);let c=[];r>0&&c.push({label:"\u2190 \u4E0A\u4E00\u9875",value:"prev",description:`\u67E5\u770B\u7B2C ${r} \u9875`}),r<n-1&&c.push({label:"\u2192 \u4E0B\u4E00\u9875",value:"next",description:`\u67E5\u770B\u7B2C ${r+2} \u9875`}),c.push({label:"\u25CF \u8BE6\u7EC6\u8BB0\u5F55",value:"records",description:"\u67E5\u770B\u6307\u5B9A Provider \u7684\u8BF7\u6C42\u8BB0\u5F55"}),c.push({label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u8FD4\u56DE\u4E3B\u83DC\u5355"});let u=await s.promptSelect("\u7EE7\u7EED\u67E5\u770B",c,"back","\u4E0A\u4E0B\u952E\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF0CESC \u8FD4\u56DE");if(u==="prev"){r--;continue}else if(u==="next"){r++;continue}if(u==="back"){s.clearOutputLines&&s.clearOutputLines(),await Si(s);return}if(u==="records"){await Cl(s);return}}}catch(e){s.clearOutputLines&&s.clearOutputLines(),e.message!=="cancelled"&&e.message!=="User cancelled"&&Cs(s,[w.error("\u52A0\u8F7D Provider \u7EDF\u8BA1\u5931\u8D25: "+e.message)]);}}async function Cl(s){try{s.clearOutputLines&&s.clearOutputLines();let e=await rn.getProviderStats();if(e.length===0){s.logInfo("\u6682\u65E0 Provider \u7EDF\u8BA1");return}let t=e.map(i=>({label:i.provider,value:i.provider,description:`${i.totalRequests} \u6B21\u8BF7\u6C42, ${Et(i.totalTokens)} tokens`}));t.push({label:"\u2190 \u8FD4\u56DE",value:"__back__",description:"\u8FD4\u56DE\u4E3B\u83DC\u5355"});let n=await s.promptSelect("\u9009\u62E9 Provider \u67E5\u770B\u8BE6\u7EC6\u8BB0\u5F55",t,e[0].provider,"\u4E0A\u4E0B\u952E\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF0CESC \u8FD4\u56DE");if(n==="__back__"){s.clearOutputLines&&s.clearOutputLines(),await Si(s);return}s.clearOutputLines&&s.clearOutputLines();let r=await rn.getProviderRecords(n,50);if(r.length===0){s.logInfo("\u8BE5 Provider \u6682\u65E0\u8BB0\u5F55");return}let o=[];o.push(""),o.push(w.highlight(`\u{1F4DD} ${n} - \u6700\u8FD1 ${r.length} \u6761\u8BB0\u5F55`)),o.push(""),o.push(w.dim(" \u7C7B\u578B ")+w.dim("\u6A21\u578B ")+w.dim("Input ")+w.dim("Output ")+w.dim("Cache ")+w.dim("\u8017\u65F6 ")+w.dim("\u72B6\u6001 ")+w.dim("\u65F6\u95F4")),o.push(w.dim(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));for(let i of r){let a=i.requestType==="health-check"?"\u6D4B\u8BD5":"\u5BF9\u8BDD",l=i.model.length>14?i.model.slice(0,11)+"...":i.model,c=Et(i.inputTokens).padEnd(7),u=Et(i.outputTokens).padEnd(7),d=i.cachedTokens?Et(i.cachedTokens).padEnd(7):"-".padEnd(7),p=(i.duration+"ms").padEnd(7),g=i.success?w.success("\u2713"):w.error("\u2717"),h=Z_(i.timestamp);o.push(w.dim(" "+a.padEnd(8))+w.primary(l.padEnd(16))+w.dim(c)+w.success(u)+w.code(d)+w.warning(p)+g+" "+w.dim(h));}o.push(""),Cs(s,o);try{let i=await s.promptSelect("\u7EE7\u7EED\u67E5\u770B",[{label:"\u2190 \u8FD4\u56DE\u4E3B\u83DC\u5355",value:"back",description:"\u8FD4\u56DE\u7EDF\u8BA1\u4E3B\u83DC\u5355"},{label:"\u25CF Provider \u7EDF\u8BA1",value:"providers",description:"\u8FD4\u56DE Provider \u7EDF\u8BA1\u5217\u8868"},{label:"\u25CF \u67E5\u770B\u5176\u4ED6 Provider",value:"other",description:"\u67E5\u770B\u5176\u4ED6 Provider \u7684\u8BE6\u7EC6\u8BB0\u5F55"}],"back","\u4E0A\u4E0B\u952E\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF0CESC \u8FD4\u56DE");s.clearOutputLines&&s.clearOutputLines(),i==="other"?await Cl(s):i==="providers"?await mp(s):i==="back"&&await Si(s);}catch{s.clearOutputLines&&s.clearOutputLines();}}catch(e){e.message==="cancelled"||e.message==="User cancelled"?s.clearOutputLines&&s.clearOutputLines():s.logInfo("\u52A0\u8F7D\u8BE6\u7EC6\u8BB0\u5F55\u5931\u8D25",e.message);}}async function Q_(s){try{let e=await rn.getProviderStats(),t=[{label:"\u6E05\u9664\u6240\u6709\u7EDF\u8BA1",value:"all",description:"\u26A0\uFE0F \u6E05\u9664\u6240\u6709 Provider \u7684\u7EDF\u8BA1\u6570\u636E"}];if(e.length>0)for(let r of e)t.push({label:`\u6E05\u9664 ${r.provider}`,value:r.provider,description:`\u6E05\u9664\u8BE5 Provider \u7684 ${r.totalRequests} \u6761\u8BB0\u5F55`});t.push({label:"\u53D6\u6D88",value:"cancel",description:"\u8FD4\u56DE\u4E0A\u4E00\u7EA7"});let n=await s.promptSelect("\u6E05\u9664\u7EDF\u8BA1\u6570\u636E",t,"cancel","\u26A0\uFE0F \u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D");if(n==="cancel")return;n==="all"?(await rn.clearAll(),s.logInfo("\u5DF2\u6E05\u9664\u6240\u6709\u7EDF\u8BA1\u6570\u636E")):(await rn.clearProvider(n),s.logInfo(`\u5DF2\u6E05\u9664 ${n} \u7684\u7EDF\u8BA1\u6570\u636E`));}catch(e){Cs(s,[w.error("\u6E05\u9664\u7EDF\u8BA1\u5931\u8D25: "+e.message)]);}}async function Si(s,e){if(e)switch(e){case "summary":await X_(s);return;case "providers":await mp(s);return;case "records":await Cl(s);return;case "clear":await Q_(s);return;default:Cs(s,[w.error(`\u672A\u77E5\u64CD\u4F5C: ${e}`),w.dim("\u53EF\u7528\u64CD\u4F5C: summary, providers, records, clear")]);return}try{let t=await s.promptSelect("Token \u4F7F\u7528\u7EDF\u8BA1",[{label:"\u25CF \u67E5\u770B\u603B\u89C8",value:"summary",description:"\u663E\u793A\u6574\u4F53 Token \u4F7F\u7528\u7EDF\u8BA1"},{label:"\u25CF Provider \u7EDF\u8BA1",value:"providers",description:"\u67E5\u770B\u5404\u4E2A Provider \u7684\u8BE6\u7EC6\u7EDF\u8BA1"},{label:"\u25CF \u8BE6\u7EC6\u8BB0\u5F55",value:"records",description:"\u67E5\u770B\u6307\u5B9A Provider \u7684\u8BF7\u6C42\u8BB0\u5F55"},{label:"\u25CF \u6E05\u9664\u7EDF\u8BA1",value:"clear",description:"\u6E05\u9664\u7EDF\u8BA1\u6570\u636E"},{label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u8FD4\u56DE\u4E0A\u4E00\u7EA7"}],"summary","\u4E0A\u4E0B\u952E\u9009\u62E9\uFF0C\u56DE\u8F66\u786E\u8BA4\uFF0CESC \u9000\u51FA");if(t==="back")return;switch(t){case "summary":await X_(s);break;case "providers":await mp(s);break;case "records":await Cl(s);break;case "clear":await Q_(s);break}}catch(t){t.message!=="User cancelled"&&t.message!=="cancelled"&&Cs(s,[w.error("\u7EDF\u8BA1\u547D\u4EE4\u5931\u8D25: "+t.message)]);}}Xt();Tn();Tt();cr();async function eI(s,e){let t=e?.toLowerCase();if(!t)try{t=await s.promptSelect("\u8BB0\u5FC6\u7CFB\u7EDF",[{label:"\u25CF \u67E5\u770B\u8BB0\u5FC6\u7EDF\u8BA1",value:"show",description:"\u77ED\u671F/\u4E2D\u671F/\u957F\u671F/\u6C38\u4E45 \u6761\u6570\u4E0E\u5927\u5C0F"},{label:"\u25CF \u67E5\u770B\u8DEF\u5F84",value:"paths",description:"\u663E\u793A\u8BB0\u5FC6\u6587\u4EF6\u8DEF\u5F84"},{label:"\u25CF \u914D\u7F6E\u6458\u8981\u6A21\u578B",value:"config",description:"\u5F00\u5173\u8BB0\u5FC6\u6458\u8981\u4E0E\u9009\u62E9\u6A21\u578B"},{label:"\u25CF \u8C03\u8BD5\u6CE8\u5165\u5185\u5BB9",value:"debug",description:"\u663E\u793A\u5F53\u524D\u4F1A\u6CE8\u5165\u7684\u8BB0\u5FC6\u6458\u8981"}],"show","\u6309 \u2191\u2193 \u9009\u62E9\uFF0CEnter \u786E\u8BA4\uFF0CESC \u53D6\u6D88");}catch(n){n?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",n?.message);return}switch(t){case "show":case "stats":await nU(s);break;case "paths":await rU(s);break;case "config":case "configure":await ZF(s);break;case "debug":await sU(s);break;default:s.logInfo("\u65E0\u6548\u7684\u64CD\u4F5C","\u4F7F\u7528 /memory \u67E5\u770B\u53EF\u7528\u64CD\u4F5C");}}async function ZF(s){let e=s.userConfig.memory??{},t=e.summarizerEnabled??true,n=e.summarizerModel??"",r=e.summarizerProviderId??"",o;try{o=await s.promptSelect("\u8BB0\u5FC6\u6458\u8981\u8BBE\u7F6E",[{label:`\u25CF \u6458\u8981\u5F00\u5173: ${t?"\u5F00\u542F":"\u5173\u95ED"}`,value:"toggle",description:"\u63A7\u5236\u81EA\u52A8\u8BB0\u5FC6\u6458\u8981"},{label:`\u25CF \u6458\u8981\u6A21\u578B: ${n||"\u9ED8\u8BA4"}`,value:"model",description:"\u9009\u62E9\u6458\u8981\u6A21\u578B\uFF08\u5982 haiku/gpt\uFF09"},{label:`\u25CF \u6458\u8981 Provider: ${r||"\u81EA\u52A8"}`,value:"provider",description:"\u6307\u5B9A\u6458\u8981\u4F7F\u7528\u7684 Provider\uFF08\u53EF\u9009\uFF09"},{label:"\u25CF \u8FD4\u56DE",value:"back"}],"toggle","Enter \u9009\u62E9\uFF0CESC \u53D6\u6D88");}catch(i){i?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",i?.message);return}if(o!=="back"){if(o==="toggle"){let i=await s.promptSelect("\u662F\u5426\u542F\u7528\u8BB0\u5FC6\u6458\u8981",[{label:"\u5F00\u542F",value:"on"},{label:"\u5173\u95ED",value:"off"}],t?"on":"off");wl(s,{summarizerEnabled:i==="on"}),s.logInfo("\u8BB0\u5FC6\u6458\u8981\u5DF2\u66F4\u65B0",i==="on"?"\u5DF2\u5F00\u542F":"\u5DF2\u5173\u95ED");return}if(o==="model"){let i;try{i=await eU(s,n);}catch(c){c?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",c?.message);return}let{model:a,existsInConfig:l}=i;if(a==="__cancel__")return;if(a==="__default__"){wl(s,{summarizerModel:void 0}),s.logInfo("\u6458\u8981\u6A21\u578B\u5DF2\u66F4\u65B0","\u4F7F\u7528\u9ED8\u8BA4\u6A21\u578B");return}if(wl(s,{summarizerModel:a}),!l){s.logInfo("\u6458\u8981\u6A21\u578B\u5DF2\u8BBE\u7F6E",`\u6A21\u578B "${a}" \u672A\u5728 provider \u914D\u7F6E\u4E2D\u627E\u5230\uFF0C\u53EF\u80FD\u65E0\u6CD5\u751F\u6548`);return}s.logInfo("\u6458\u8981\u6A21\u578B\u5DF2\u8BBE\u7F6E",a);return}if(o==="provider"){let i;try{i=await tU(s,r);}catch(a){a?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",a?.message);return}if(!i)return;if(i==="__auto__"){wl(s,{summarizerProviderId:void 0}),s.logInfo("\u6458\u8981 Provider \u5DF2\u66F4\u65B0","\u81EA\u52A8\u9009\u62E9");return}wl(s,{summarizerProviderId:i}),s.logInfo("\u6458\u8981 Provider \u5DF2\u8BBE\u7F6E",i);}}}async function eU(s,e){let t=new rt(s.userConfig),n=new Set;for(let l of t.getProviders())for(let c of l.models??[])c?.name&&n.add(c.name);let r=["claude-haiku-4-5-20251001","claude-haiku","gpt-4o-mini","gpt-4.1-mini","gpt-4o","gemini-1.5-flash","gemini-2.0-flash"],o=Array.from(new Set([...r,...n])),i=[{label:"\u9ED8\u8BA4\uFF08\u81EA\u52A8\u9009\u62E9\uFF09",value:"__default__",description:"\u4F7F\u7528\u9ED8\u8BA4\u6458\u8981\u6A21\u578B"},...o.map(l=>({label:l,value:l,description:n.has(l)?void 0:"\u672A\u5728 provider \u914D\u7F6E\u4E2D\u627E\u5230"})),{label:"\u81EA\u5B9A\u4E49\u6A21\u578B",value:"__custom__",description:"\u8F93\u5165\u81EA\u5B9A\u4E49\u6A21\u578B\u540D\u79F0"}],a=await s.promptSelect("\u9009\u62E9\u6458\u8981\u6A21\u578B",i,e||"__default__");if(a==="__custom__"){let c=(await s.promptText("\u8F93\u5165\u6A21\u578B\u540D\u79F0",{allowEmpty:false})).trim();return {model:c||"__cancel__",existsInConfig:n.has(c)}}return {model:a||"__cancel__",existsInConfig:n.has(a)}}async function tU(s,e){let n=new rt(s.userConfig).getProviders();if(n.length===0)return s.logInfo("\u672A\u914D\u7F6E Provider","\u8BF7\u5148\u901A\u8FC7 /provider \u6DFB\u52A0"),null;let r=[{label:"\u81EA\u52A8\u9009\u62E9",value:"__auto__",description:"\u6839\u636E\u6A21\u578B\u81EA\u52A8\u5339\u914D"},...n.map(i=>({label:i.id,value:i.id,description:i.name}))];return await s.promptSelect("\u9009\u62E9\u6458\u8981 Provider",r,e||"__auto__")}function wl(s,e){let t={...s.userConfig.memory??{}};"summarizerEnabled"in e&&(t.summarizerEnabled=e.summarizerEnabled),"summarizerModel"in e&&(e.summarizerModel?t.summarizerModel=e.summarizerModel:delete t.summarizerModel),"summarizerProviderId"in e&&(e.summarizerProviderId?t.summarizerProviderId=e.summarizerProviderId:delete t.summarizerProviderId);let n={...s.userConfig,memory:t};s.updateConfig(n),Me(n);}async function nU(s){let e=await s.actionLog.getMemoryStats(),t=oU(e);tb(s,t);}async function rU(s){let e=await s.actionLog.getMemoryStats(),t=iU(e);tb(s,t);}async function sU(s){let e=await s.actionLog.getMemoryInjectionSummary({language:s.userConfig.language??"zh",includePersistent:true,includeLastRun:true}),t=[];t.push(""),t.push(w.highlight(" \u8BB0\u5FC6\u6CE8\u5165\u9884\u89C8")),t.push(""),e?e.split(`
|
|
3916
3923
|
`).forEach(n=>{t.push(w.info(` ${n}`));}):t.push(w.dim(" (\u65E0\u53EF\u7528\u8BB0\u5FC6)")),t.push(""),tb(s,t);}function oU(s){let e=o=>o.toLocaleString("en-US"),t=o=>{if(o<1024)return `${o} B`;let i=o/1024;if(i<1024)return `${i.toFixed(1)} KB`;let a=i/1024;return a<1024?`${a.toFixed(2)} MB`:`${(a/1024).toFixed(2)} GB`},n=s.longTerm.total,r=[];return r.push(""),r.push(w.highlight(" \u8BB0\u5FC6\u7EDF\u8BA1")),r.push(""),r.push(w.dim(" \u77ED\u671F (recent): ")+w.info(`${e(s.shortTerm.count)} \u6761, ${t(s.shortTerm.sizeBytes)}`)),r.push(w.dim(" \u4E2D\u671F (session): ")+w.info(`${e(s.session.count)} \u6761, ${t(s.session.sizeBytes)}`)),r.push(w.dim(" \u957F\u671F (progress/standard/lesson): ")+w.info(`${e(n.count)} \u6761, ${t(n.sizeBytes)}`)),r.push(w.dim(" - progress: ")+w.info(`${e(s.longTerm.progress.count)} \u6761, ${t(s.longTerm.progress.sizeBytes)}`)),r.push(w.dim(" - standard: ")+w.info(`${e(s.longTerm.standard.count)} \u6761, ${t(s.longTerm.standard.sizeBytes)}`)),r.push(w.dim(" - lesson: ")+w.info(`${e(s.longTerm.lesson.count)} \u6761, ${t(s.longTerm.lesson.sizeBytes)}`)),r.push(w.dim(" \u6C38\u4E45 (pinned): ")+w.info(`${e(s.pinned.count)} \u6761, ${t(s.pinned.sizeBytes)}`)),r.push(""),r.push(w.dim(" \u603B\u8BA1: ")+w.info(`${e(s.totals.count)} \u6761, ${t(s.totals.sizeBytes)}`)),r.push(""),r}function iU(s){let e=[];return e.push(""),e.push(w.highlight(" \u8BB0\u5FC6\u8DEF\u5F84")),e.push(""),s.shortTerm.path&&e.push(w.dim(" \u77ED\u671F: ")+w.info(s.shortTerm.path)),s.session.path&&e.push(w.dim(" \u4E2D\u671F: ")+w.info(s.session.path)),s.longTerm.progress.path&&e.push(w.dim(" \u8FDB\u5EA6: ")+w.info(s.longTerm.progress.path)),s.longTerm.standard.path&&e.push(w.dim(" \u89C4\u8303: ")+w.info(s.longTerm.standard.path)),s.longTerm.lesson.path&&e.push(w.dim(" \u6559\u8BAD: ")+w.info(s.longTerm.lesson.path)),s.pinned.path&&e.push(w.dim(" \u6C38\u4E45: ")+w.info(s.pinned.path)),e.push(""),e}function tb(s,e){if(s.uiController){let t=s.uiController;if(typeof t.setCommandOutputLines=="function"){t.setCommandOutputLines(e);return}if(typeof t.printCommandOutput=="function"){for(let n of e)t.printCommandOutput(n);return}}for(let t of e)Q(t);}Tt();qr();var tI="0.0.0.0",nI=4399;async function cU(s){try{let{renderUnicodeCompact:e}=await import('uqr');return {qr:e(s,{ecc:"M",border:1})}}catch(e){return {qr:null,error:e instanceof Error?e.message:String(e)}}}async function uU(s){try{let e=await import('qrcode'),t=e.default??e;if(!t||typeof t.toFile!="function")return {filePath:null,error:"QRCode module missing or invalid."};let n=Date.now(),r=join(tmpdir(),`neox-qr-${n}.png`);await t.toFile(r,s,{type:"png",errorCorrectionLevel:"H",margin:4,scale:10,color:{dark:"#000000",light:"#FFFFFF"}});let{exec:o}=await import('child_process'),{promisify:i}=await import('util'),a=i(o),l=process.platform,c;return l==="darwin"?c=`open "${r}"`:l==="win32"?c=`start "" "${r}"`:ft()?c=`explorer.exe "${ks(r)}"`:c=`xdg-open "${r}"`,await a(c),{filePath:r}}catch(e){return {filePath:null,error:e instanceof Error?e.message:String(e)}}}function dU(s){let e=s.urls[0],t=e?new URL(e).hostname:s.host&&s.host!==tI?s.host:"127.0.0.1";return {payload:`neox://pair?${new URLSearchParams({mode:s.networkMode,host:t,port:String(s.port),token:s.token||""}).toString()}`,lanUrl:`http://${t}:${s.port}`}}function pU(s){return s.remote??{}}function rI(s){return s==="vps"?"vps":"lan"}async function sI(s,e){let t=s.getStatus(),n=s.userConfig.remoteServer,r=!!n?.url,o=e?.toLowerCase();if(!o)try{o=await s.promptSelect("\u8FDC\u7A0B\u8BBF\u95EE (Remote Access)",[{label:r?`\u25CF \u8FDC\u7A0B\u670D\u52A1\u5668: ${n.url}`:"\u25CF \u8FDE\u63A5\u8FDC\u7A0B\u670D\u52A1\u5668",value:"connect",description:r?"\u5DF2\u8FDE\u63A5\u8FDC\u7A0B Server\uFF0C\u70B9\u51FB\u7BA1\u7406":"\u8FDE\u63A5 Docker \u90E8\u7F72\u7684 Neox Server"},{label:`\u25CF \u5F00\u5173: ${t.enabled?"\u5F00\u542F":"\u5173\u95ED"}`,value:"toggle",description:"\u542F\u7528\u6216\u5173\u95ED\u8FDC\u7A0B\u8BBF\u95EE\uFF08\u672C\u673A\u4F5C\u4E3A Server\uFF09"},{label:`\u25CF \u7F51\u7EDC\u6A21\u5F0F: ${t.networkMode.toUpperCase()}`,value:"network",description:"LAN \u6216 VPS \u4E2D\u8F6C"},{label:`\u25CF \u7AEF\u53E3: ${t.port}`,value:"port",description:"\u672C\u5730\u670D\u52A1\u76D1\u542C\u7AEF\u53E3"},{label:"\u25CF \u663E\u793A\u4E8C\u7EF4\u7801",value:"qr",description:"\u624B\u673A\u626B\u7801\u5FEB\u901F\u914D\u5BF9"},{label:"\u25CF \u663E\u793A\u914D\u5BF9\u4FE1\u606F",value:"pair",description:"\u67E5\u770B\u8FDE\u63A5\u5730\u5740\u4E0E Token"},{label:"\u25CF \u91CD\u65B0\u751F\u6210 Token",value:"token",description:"\u66F4\u65B0\u914D\u5BF9 Token"},{label:"\u25CF \u8FD4\u56DE",value:"back"}],r?"connect":"toggle","\u6309 \u2191\u2193 \u9009\u62E9\uFF0CEnter \u786E\u8BA4\uFF0CESC \u53D6\u6D88");}catch(i){i?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",i?.message);return}if(o!=="back"){if(o==="connect"){await mU(s);return}if(o==="on"||o==="off"||o==="toggle"){let i=o==="on"?true:o==="off"?false:!t.enabled;if(nb(s,{enabled:i}),i){await s.startRemote();let a=s.getStatus(),l=[`\u6A21\u5F0F: ${a.networkMode.toUpperCase()}`,`\u5730\u5740: ${a.host}:${a.port}`,`Token: ${a.token||"(\u672A\u751F\u6210)"}`];if(a.urls.length>0){l.push("LAN \u5730\u5740:");for(let c of a.urls)l.push(`- ${c}`);}s.logInfo("\u8FDC\u7A0B\u8BBF\u95EE\u5DF2\u5F00\u542F",l.join(`
|
|
3917
3924
|
`));}else await s.stopRemote(),s.logInfo("\u8FDC\u7A0B\u8BBF\u95EE\u5DF2\u5173\u95ED","\u5DF2\u65AD\u5F00\u8FDC\u7A0B\u8FDE\u63A5");return}if(o==="network"){let i;try{i=await s.promptSelect("\u9009\u62E9\u7F51\u7EDC\u6A21\u5F0F",[{label:"LAN (\u5C40\u57DF\u7F51)",value:"lan",description:"\u540C\u4E00\u5185\u7F51\u8FDE\u63A5"},{label:"VPS (\u516C\u7F51\u4E2D\u8F6C)",value:"vps",description:"\u9700\u8981 VPS \u4E2D\u8F6C"}],t.networkMode);}catch(l){l?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",l?.message);return}let a=rI(i);nb(s,{networkMode:a}),a==="vps"?s.logInfo("\u5DF2\u5207\u6362\u5230 VPS \u6A21\u5F0F","\u76F4\u63A5\u90E8\u7F72 Neox Server \u5230 VPS\uFF0C\u624B\u673A\u901A\u8FC7\u516C\u7F51 IP \u8FDE\u63A5"):s.logInfo("\u5DF2\u5207\u6362\u5230 LAN \u6A21\u5F0F","\u540C\u4E00\u5C40\u57DF\u7F51\u5185\u8FDE\u63A5"),await s.startRemote();return}if(o==="port"){let i="";try{i=await s.promptText("\u8F93\u5165\u76D1\u542C\u7AEF\u53E3",{defaultValue:String(t.port||nI),allowEmpty:!1});}catch(l){l?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",l?.message);return}let a=parseInt(i,10);if(!Number.isFinite(a)||a<1||a>65535){s.logInfo("\u65E0\u6548\u7AEF\u53E3","\u8BF7\u8F93\u5165 1-65535 \u4E4B\u95F4\u7684\u7AEF\u53E3");return}nb(s,{port:a}),await s.startRemote(),s.logInfo("\u7AEF\u53E3\u5DF2\u66F4\u65B0",`\u5F53\u524D\u7AEF\u53E3: ${a}`);return}if(o==="token"){let i=s.regenerateToken();s.logInfo("Token \u5DF2\u66F4\u65B0",`\u65B0\u7684 Token: ${i}`),await s.startRemote();return}if(o==="pair"||o==="status"){let i=s.getStatus();i.token||(s.regenerateToken(),i=s.getStatus());let a=[`\u72B6\u6001: ${i.enabled?"\u5F00\u542F":"\u5173\u95ED"} / ${i.running?"\u8FD0\u884C\u4E2D":"\u672A\u8FD0\u884C"}`,`\u6A21\u5F0F: ${i.networkMode.toUpperCase()}`,`\u5730\u5740: ${i.host}:${i.port}`,`Token: ${i.token||"(\u672A\u751F\u6210)"}`];if(i.urls.length>0){a.push("LAN \u5730\u5740:");for(let l of i.urls)a.push(`- ${l}`);}s.logInfo("\u8FDC\u7A0B\u914D\u5BF9\u4FE1\u606F",a.join(`
|
|
3918
3925
|
`));return}if(o==="qr"){let i=s.getStatus();i.token||(s.regenerateToken(),i=s.getStatus());let a=dU(i);s.clearOutputLines&&s.clearOutputLines();let l=await uU(a.payload),c=await cU(a.payload),u=[`LAN \u5730\u5740: ${a.lanUrl}`,`Token: ${i.token||"(\u672A\u751F\u6210)"}`,`\u534F\u8BAE: ${a.payload}`];l.filePath?(u.push(`\u4E8C\u7EF4\u7801\u56FE\u7247: ${l.filePath}`),u.push("(\u5DF2\u5728\u65B0\u7A97\u53E3\u6253\u5F00\uFF0C\u8BF7\u4F7F\u7528\u624B\u673A\u626B\u63CF)")):l.error&&u.push(`\u56FE\u7247\u751F\u6210\u5931\u8D25: ${l.error}`);let d=c.qr?u:[...u,c.error?`\u7EC8\u7AEF\u4E8C\u7EF4\u7801\u751F\u6210\u5931\u8D25: ${c.error}`:"\u7EC8\u7AEF\u4E8C\u7EF4\u7801\u751F\u6210\u5931\u8D25: \u672A\u77E5\u9519\u8BEF"];if(c.qr){let p=c.qr.split(`
|
|
@@ -3921,7 +3928,7 @@ Model: ${r}`);}else await Qy(s,r);P_(s,n);}async function up(s,e,t){let n=t||s.p
|
|
|
3921
3928
|
`)):s.logInfo("\u8FDC\u7A0B\u914D\u5BF9\u4E8C\u7EF4\u7801",`${c.qr}
|
|
3922
3929
|
${u.join(`
|
|
3923
3930
|
`)}`);}else s.logInfo("\u8FDC\u7A0B\u914D\u5BF9\u4FE1\u606F",d.join(`
|
|
3924
|
-
`));return}s.logInfo("\u65E0\u6548\u7684\u64CD\u4F5C","\u4F7F\u7528 /remote \u67E5\u770B\u53EF\u7528\u64CD\u4F5C");}}function nb(s,e){let t=pU(s.userConfig),n={enabled:t.enabled??false,networkMode:rI(t.networkMode),host:t.host||tI,port:t.port||nI,token:t.token,allowVoice:t.allowVoice??true,autoApprove:t.autoApprove??true,...e},r={...s.userConfig,remote:n};s.updateConfig(r),Me(r);}async function mU(s){let e=s.userConfig.remoteServer,t=!!e?.url,n;try{t?n=await s.promptSelect(`\u8FDC\u7A0B\u670D\u52A1\u5668: ${e.url}`,[{label:"\u25CF \u4FEE\u6539\u5730\u5740",value:"edit-url",description:"\u66F4\u6539\u670D\u52A1\u5668 URL"},{label:"\u25CF \u4FEE\u6539 Token",value:"edit-token",description:"\u66F4\u6539\u8BA4\u8BC1 Token"},{label:"\u25CF \u6D4B\u8BD5\u8FDE\u63A5",value:"test",description:"\u68C0\u67E5\u670D\u52A1\u5668\u662F\u5426\u53EF\u8FBE"},{label:"\u25CF \u65AD\u5F00\u8FDE\u63A5",value:"disconnect",description:"\u6E05\u9664\u8FDC\u7A0B\u914D\u7F6E\uFF0C\u6062\u590D\u672C\u5730\u6A21\u5F0F"},{label:"\u25CF \u8FD4\u56DE",value:"back"}],"test"):n=await s.promptSelect("\u8FDE\u63A5\u8FDC\u7A0B Neox Server",[{label:"\u25CF \u8F93\u5165\u670D\u52A1\u5668\u5730\u5740",value:"setup",description:"\u914D\u7F6E\u8FDC\u7A0B Server URL \u548C Token"},{label:"\u25CF \u8FD4\u56DE",value:"back"}],"setup");}catch{return}if(n==="back")return;if(n==="disconnect"){let l={...s.userConfig};delete l.remoteServer,s.updateConfig(l),Me(l),s.logInfo("\u5DF2\u65AD\u5F00\u8FDC\u7A0B\u670D\u52A1\u5668","\u4E0B\u6B21\u542F\u52A8\u5C06\u4F7F\u7528\u672C\u5730 Server\uFF0C\u8BF7\u91CD\u542F CLI \u751F\u6548");return}if(n==="test"){if(!e?.url){s.logInfo("\u672A\u914D\u7F6E","\u8BF7\u5148\u914D\u7F6E\u8FDC\u7A0B\u670D\u52A1\u5668\u5730\u5740");return}try{let l=`${e.url.replace(/\/+$/,"")}/health`,c=await fetch(l,{signal:AbortSignal.timeout(5e3),headers:e.token?{Authorization:`Bearer ${e.token}`}:{}});c.ok?s.logInfo("\u8FDE\u63A5\u6210\u529F",`${e.url} \u670D\u52A1\u6B63\u5E38`):s.logInfo("\u8FDE\u63A5\u5931\u8D25",`HTTP ${c.status}: ${c.statusText}`);}catch(l){s.logInfo("\u8FDE\u63A5\u5931\u8D25",l?.message||"\u65E0\u6CD5\u8FDE\u63A5\u5230\u670D\u52A1\u5668");}return}let r=e?.url||"",o=e?.token||"";if(n==="setup"||n==="edit-url"){try{r=await s.promptText("\u670D\u52A1\u5668\u5730\u5740 (\u5982 http://192.168.1.100:4399)",{defaultValue:r,allowEmpty:!1});}catch{return}try{let l=new URL(r);if(l.protocol!=="http:"&&l.protocol!=="https:"){s.logInfo("URL \u65E0\u6548","\u534F\u8BAE\u5FC5\u987B\u662F http \u6216 https");return}r=`${l.protocol}//${l.host}`;}catch{s.logInfo("URL \u65E0\u6548","\u8BF7\u8F93\u5165\u6709\u6548\u7684 URL");return}}if(n==="setup"||n==="edit-token")try{o=await s.promptText("Bearer Token (\u670D\u52A1\u7AEF /remote \u751F\u6210\uFF0C\u53EF\u7559\u7A7A)",{defaultValue:o,allowEmpty:!0});}catch{return}let i={url:r};o&&(i.token=o);let a={...s.userConfig,remoteServer:i};s.updateConfig(a),Me(a);try{let l=`${r}/health`,c=await fetch(l,{signal:AbortSignal.timeout(5e3),headers:o?{Authorization:`Bearer ${o}`}:{}});c.ok?s.logInfo("\u914D\u7F6E\u5DF2\u4FDD\u5B58",`${r} \u8FDE\u63A5\u6B63\u5E38\uFF0C\u91CD\u542F CLI \u540E\u751F\u6548`):s.logInfo("\u914D\u7F6E\u5DF2\u4FDD\u5B58",`${r} \u8FD4\u56DE HTTP ${c.status}\uFF0C\u8BF7\u68C0\u67E5\u5730\u5740\u548C Token`);}catch(l){s.logInfo("\u914D\u7F6E\u5DF2\u4FDD\u5B58",`${r} \u6682\u65F6\u65E0\u6CD5\u8FDE\u63A5 (${l?.message||"\u8D85\u65F6"})\uFF0C\u8BF7\u786E\u8BA4\u670D\u52A1\u5668\u5DF2\u542F\u52A8`);}}Tt();async function oI(s,e){if(s.userConfig.supervisor||s.userConfig.assistant?.supervisorAgent){let t={...s.userConfig};if(t.supervisor&&delete t.supervisor,t.assistant?.supervisorAgent){let n={...t.assistant};delete n.supervisorAgent,Object.keys(n).length===0?delete t.assistant:t.assistant=n;}s.updateConfig(t),Me(t);}s.logInfo("\u76D1\u7763 Agent \u5DF2\u79FB\u9664","\u8BE5\u914D\u7F6E\u5DF2\u5E9F\u5F03\u5E76\u4F1A\u81EA\u52A8\u6E05\u7406\u3002");}Xt();Tn();Vs();cr();function aI(s,e){if(!s)return "\u672A\u914D\u7F6E";let n=e.find(r=>r.id===s.providerId)?.name||s.providerId;return `${s.model} (${n})`}function ki(s){return !s||s.length===0?"":s.map(e=>`[${e}]`).join(" ")}function lI(s){return typeof s=="number"&&Number.isFinite(s)&&s>0?String(Math.floor(s)):`\u9ED8\u8BA4(${ui})`}function iI(s){let e=(s||"").trim().toLowerCase();if(e&&(e==="single"||e==="assistant"||e==="cooperate"||e==="network"||e==="show"))return e}async function cI(s,e){let t=new
|
|
3931
|
+
`));return}s.logInfo("\u65E0\u6548\u7684\u64CD\u4F5C","\u4F7F\u7528 /remote \u67E5\u770B\u53EF\u7528\u64CD\u4F5C");}}function nb(s,e){let t=pU(s.userConfig),n={enabled:t.enabled??false,networkMode:rI(t.networkMode),host:t.host||tI,port:t.port||nI,token:t.token,allowVoice:t.allowVoice??true,autoApprove:t.autoApprove??true,...e},r={...s.userConfig,remote:n};s.updateConfig(r),Me(r);}async function mU(s){let e=s.userConfig.remoteServer,t=!!e?.url,n;try{t?n=await s.promptSelect(`\u8FDC\u7A0B\u670D\u52A1\u5668: ${e.url}`,[{label:"\u25CF \u4FEE\u6539\u5730\u5740",value:"edit-url",description:"\u66F4\u6539\u670D\u52A1\u5668 URL"},{label:"\u25CF \u4FEE\u6539 Token",value:"edit-token",description:"\u66F4\u6539\u8BA4\u8BC1 Token"},{label:"\u25CF \u6D4B\u8BD5\u8FDE\u63A5",value:"test",description:"\u68C0\u67E5\u670D\u52A1\u5668\u662F\u5426\u53EF\u8FBE"},{label:"\u25CF \u65AD\u5F00\u8FDE\u63A5",value:"disconnect",description:"\u6E05\u9664\u8FDC\u7A0B\u914D\u7F6E\uFF0C\u6062\u590D\u672C\u5730\u6A21\u5F0F"},{label:"\u25CF \u8FD4\u56DE",value:"back"}],"test"):n=await s.promptSelect("\u8FDE\u63A5\u8FDC\u7A0B Neox Server",[{label:"\u25CF \u8F93\u5165\u670D\u52A1\u5668\u5730\u5740",value:"setup",description:"\u914D\u7F6E\u8FDC\u7A0B Server URL \u548C Token"},{label:"\u25CF \u8FD4\u56DE",value:"back"}],"setup");}catch{return}if(n==="back")return;if(n==="disconnect"){let l={...s.userConfig};delete l.remoteServer,s.updateConfig(l),Me(l),s.logInfo("\u5DF2\u65AD\u5F00\u8FDC\u7A0B\u670D\u52A1\u5668","\u4E0B\u6B21\u542F\u52A8\u5C06\u4F7F\u7528\u672C\u5730 Server\uFF0C\u8BF7\u91CD\u542F CLI \u751F\u6548");return}if(n==="test"){if(!e?.url){s.logInfo("\u672A\u914D\u7F6E","\u8BF7\u5148\u914D\u7F6E\u8FDC\u7A0B\u670D\u52A1\u5668\u5730\u5740");return}try{let l=`${e.url.replace(/\/+$/,"")}/health`,c=await fetch(l,{signal:AbortSignal.timeout(5e3),headers:e.token?{Authorization:`Bearer ${e.token}`}:{}});c.ok?s.logInfo("\u8FDE\u63A5\u6210\u529F",`${e.url} \u670D\u52A1\u6B63\u5E38`):s.logInfo("\u8FDE\u63A5\u5931\u8D25",`HTTP ${c.status}: ${c.statusText}`);}catch(l){s.logInfo("\u8FDE\u63A5\u5931\u8D25",l?.message||"\u65E0\u6CD5\u8FDE\u63A5\u5230\u670D\u52A1\u5668");}return}let r=e?.url||"",o=e?.token||"";if(n==="setup"||n==="edit-url"){try{r=await s.promptText("\u670D\u52A1\u5668\u5730\u5740 (\u5982 http://192.168.1.100:4399)",{defaultValue:r,allowEmpty:!1});}catch{return}try{let l=new URL(r);if(l.protocol!=="http:"&&l.protocol!=="https:"){s.logInfo("URL \u65E0\u6548","\u534F\u8BAE\u5FC5\u987B\u662F http \u6216 https");return}r=`${l.protocol}//${l.host}`;}catch{s.logInfo("URL \u65E0\u6548","\u8BF7\u8F93\u5165\u6709\u6548\u7684 URL");return}}if(n==="setup"||n==="edit-token")try{o=await s.promptText("Bearer Token (\u670D\u52A1\u7AEF /remote \u751F\u6210\uFF0C\u53EF\u7559\u7A7A)",{defaultValue:o,allowEmpty:!0});}catch{return}let i={url:r};o&&(i.token=o);let a={...s.userConfig,remoteServer:i};s.updateConfig(a),Me(a);try{let l=`${r}/health`,c=await fetch(l,{signal:AbortSignal.timeout(5e3),headers:o?{Authorization:`Bearer ${o}`}:{}});c.ok?s.logInfo("\u914D\u7F6E\u5DF2\u4FDD\u5B58",`${r} \u8FDE\u63A5\u6B63\u5E38\uFF0C\u91CD\u542F CLI \u540E\u751F\u6548`):s.logInfo("\u914D\u7F6E\u5DF2\u4FDD\u5B58",`${r} \u8FD4\u56DE HTTP ${c.status}\uFF0C\u8BF7\u68C0\u67E5\u5730\u5740\u548C Token`);}catch(l){s.logInfo("\u914D\u7F6E\u5DF2\u4FDD\u5B58",`${r} \u6682\u65F6\u65E0\u6CD5\u8FDE\u63A5 (${l?.message||"\u8D85\u65F6"})\uFF0C\u8BF7\u786E\u8BA4\u670D\u52A1\u5668\u5DF2\u542F\u52A8`);}}Tt();async function oI(s,e){if(s.userConfig.supervisor||s.userConfig.assistant?.supervisorAgent){let t={...s.userConfig};if(t.supervisor&&delete t.supervisor,t.assistant?.supervisorAgent){let n={...t.assistant};delete n.supervisorAgent,Object.keys(n).length===0?delete t.assistant:t.assistant=n;}s.updateConfig(t),Me(t);}s.logInfo("\u76D1\u7763 Agent \u5DF2\u79FB\u9664","\u8BE5\u914D\u7F6E\u5DF2\u5E9F\u5F03\u5E76\u4F1A\u81EA\u52A8\u6E05\u7406\u3002");}Xt();Tn();Vs();cr();function aI(s,e){if(!s)return "\u672A\u914D\u7F6E";let n=e.find(r=>r.id===s.providerId)?.name||s.providerId;return `${s.model} (${n})`}function ki(s){return !s||s.length===0?"":s.map(e=>`[${e}]`).join(" ")}function lI(s){return typeof s=="number"&&Number.isFinite(s)&&s>0?String(Math.floor(s)):`\u9ED8\u8BA4(${ui})`}function iI(s){let e=(s||"").trim().toLowerCase();if(e&&(e==="single"||e==="assistant"||e==="cooperate"||e==="network"||e==="show"))return e}async function cI(s,e){let t=new rt,n=new Lt(t,"assistant"),r=new Lt(t,"cooperate"),o=new Lt(t,"network"),i=s.getProviders(),a=iI(e);if(!a)try{let l=n.getWorkerPool(),c=r.getWorkerPool(),u=o.getNetworkRoles(),d=await s.promptSelect("\u8FD0\u884C\u914D\u7F6E\u4E2D\u5FC3 (runconfig)",[{label:"[S] single",value:"single",description:"\u5355\u673A\u6A21\u5F0F\u914D\u7F6E\uFF08\u9884\u7559\uFF09"},{label:`[A] assistant (${l.filter(p=>p.enabled).length}/${l.length} models)`,value:"assistant",description:"\u4E3B Agent / Worker \u6C60 / \u5E76\u53D1\u4E0A\u9650"},{label:`[C] cooperate (${c.filter(p=>p.enabled).length}/${c.length} models)`,value:"cooperate",description:`CCB \u6A21\u5F0F: ${gp(r.getCCBReviewMode())}`},{label:`[N] network (${u.length} roles)`,value:"network",description:"\u7F51\u7EDC\u89D2\u8272\u4E0E\u4F18\u5316\u914D\u7F6E"},{label:"\u{1F4C4} show",value:"show",description:"\u67E5\u770B\u5168\u90E8\u6A21\u5F0F\u914D\u7F6E\u6458\u8981"},{label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u9000\u51FA runconfig"}],"assistant","\u6309 \u2191\u2193 \u9009\u62E9\uFF0CEnter \u786E\u8BA4\uFF0CESC \u53D6\u6D88");if(d==="back")return;a=iI(d);}catch(l){l?.message!=="cancelled"&&s.logInfo("\u64CD\u4F5C\u53D6\u6D88",l?.message);return}if(a){if(a==="show"){gU(s,n,r,o,i);return}if(a==="single"){s.logInfo("single \u914D\u7F6E","\u5F53\u524D\u7248\u672C\u6682\u65E0 single \u4E13\u5C5E\u914D\u7F6E\u9879");return}if(a==="assistant"){await hU(s,n,i);return}if(a==="cooperate"){await fU(s,r,i);return}await yU(s,o);}}function gU(s,e,t,n,r){let o=e.getMainAgent(),i=e.getWorkerPool(),a=t.getWorkerPool(),l=n.getNetworkRoles(),c=[];c.push("single: (\u6682\u65E0\u4E13\u5C5E\u914D\u7F6E\u9879)"),c.push(`assistant: main=${aI(o,r)}, workers=${i.filter(u=>u.enabled).length}/${i.length}, maxConcurrent=${lI(e.getMaxConcurrent())}`),c.push(`cooperate: ccb=${gp(t.getCCBReviewMode())}, workers=${a.filter(u=>u.enabled).length}/${a.length}`),c.push(`network: roles=${l.length}`),s.logInfo("runconfig \u6982\u89C8",c.join(`
|
|
3925
3932
|
`));}async function hU(s,e,t){let n=await s.promptSelect("runconfig / assistant",[{label:"Main Agent",value:"main",description:"\u8BBE\u7F6E\u4E3B\u534F\u8C03\u6A21\u578B"},{label:"Worker Pool",value:"worker",description:"\u914D\u7F6E Worker \u6A21\u578B\u6C60"},{label:"Max Concurrent",value:"max_concurrent",description:"\u5E76\u53D1\u4E0A\u9650"},{label:"Show",value:"show",description:"\u67E5\u770B assistant \u914D\u7F6E"},{label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u8FD4\u56DE\u4E0A\u7EA7\u83DC\u5355"}],"worker");if(n==="main"){await TU(s,e,t);return}if(n==="worker"){await uI(s,e,t);return}if(n==="max_concurrent"){await wU(s,e);return}n==="show"&&CU(s,e,t);}async function fU(s,e,t){let n=await s.promptSelect("runconfig / cooperate",[{label:"Worker Pool",value:"worker",description:"\u914D\u7F6E cooperate \u6A21\u5F0F\u6A21\u578B\u6C60"},{label:"CCB Review Mode",value:"ccb_mode",description:"single-role / multi-role / multi-model"},{label:"Show",value:"show",description:"\u67E5\u770B cooperate \u914D\u7F6E"},{label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u8FD4\u56DE\u4E0A\u7EA7\u83DC\u5355"}],"ccb_mode");if(n==="worker"){await uI(s,e,t);return}if(n==="ccb_mode"){await PU(s,e);return}n==="show"&&bU(s,e,t);}async function yU(s,e){let t=await s.promptSelect("runconfig / network",[{label:"Auto Optimize Roles",value:"optimize_network",description:"\u5206\u6790\u9879\u76EE\u5E76\u751F\u6210 network \u89D2\u8272"},{label:"Show",value:"show",description:"\u67E5\u770B network \u914D\u7F6E"},{label:"\u2190 \u8FD4\u56DE",value:"back",description:"\u8FD4\u56DE\u4E0A\u7EA7\u83DC\u5355"}],"optimize_network");if(t==="optimize_network"){await MU(s,e);return}t==="show"&&vU(s,e);}function bU(s,e,t){let n=e.getWorkerPool(),r=n.filter(a=>a.enabled).length,o=e.getCCBReviewMode(),i=[];i.push("\u250C\u2500 CCB \u8BC4\u5BA1\u6A21\u5F0F"),i.push(`\u2502 \u5F53\u524D: ${gp(o)}`),i.push("\u2502"),i.push(`\u2514\u2500 Worker \u6A21\u578B\u6C60 (${r}/${n.length} \u542F\u7528)`),n.length===0?i.push(" (\u7A7A)"):n.forEach((a,l)=>{let u=t.find(h=>h.id===a.providerId)?.name||a.providerId,d=a.enabled?"\u2713":"\u25CB",p=ki(a.traits),g=l===n.length-1?"\u2514\u2500":"\u251C\u2500";i.push(` ${g} [${d}] ${a.model} (${u}) ${p}`);}),s.logInfo("cooperate \u6A21\u5F0F\u914D\u7F6E",i.join(`
|
|
3926
3933
|
`));}function vU(s,e){let t=e.getNetworkRoles();if(!t.length){s.logInfo("network \u6A21\u5F0F\u914D\u7F6E","(\u672A\u914D\u7F6E\u89D2\u8272\uFF0C\u5148\u6267\u884C Auto Optimize Roles)");return}let n=t.map((r,o)=>{let i=Array.isArray(r?.capabilities)?r.capabilities.join(", "):"",a=i?` | \u80FD\u529B: ${i}`:"",l=r?.name||r?.id||`role-${o+1}`,c=r?.description||"\u65E0\u63CF\u8FF0";return `${o+1}. ${l} - ${c}${a}`});s.logInfo(`network \u6A21\u5F0F\u914D\u7F6E (${t.length} roles)`,n.join(`
|
|
3927
3934
|
`));}function CU(s,e,t){let n=e.getMainAgent(),r=e.getWorkerPool(),o=e.getMaxConcurrent(),i=[];i.push("\u250C\u2500 \u4E3B Agent (Main)"),i.push(`\u2502 \u6A21\u578B: ${aI(n,t)}`),i.push(`\u2502 \u6700\u5927\u5E76\u53D1: ${lI(o)}`),i.push("\u2502"),i.push("\u2514\u2500 Worker \u6A21\u578B\u6C60 (\u53EF\u9009\uFF0C\u4E0D\u914D\u7F6E\u5219\u4F7F\u7528\u9ED8\u8BA4\u6A21\u578B)"),r.length===0?i.push(" (\u7A7A)"):r.forEach((a,l)=>{let u=t.find(h=>h.id===a.providerId)?.name||a.providerId,d=a.enabled?"\u2713":"\u25CB",p=ki(a.traits),g=l===r.length-1?"\u2514\u2500":"\u251C\u2500";i.push(` ${g} [${d}] ${a.model} (${u}) ${p}`);}),s.logInfo("\u534F\u4F5C\u6A21\u5F0F\u914D\u7F6E",i.join(`
|
|
@@ -3956,16 +3963,16 @@ ${t.join(`
|
|
|
3956
3963
|
[
|
|
3957
3964
|
{"id": "programmer", "name": "\u7A0B\u5E8F\u5458", "description": "\u7F16\u5199\u6838\u5FC3\u4EE3\u7801", "capabilities": ["coding", "debugging"], "priority": 1},
|
|
3958
3965
|
{"id": "ui-designer", "name": "UI\u8BBE\u8BA1\u5E08", "description": "\u4F18\u5316\u754C\u9762\u548C\u4EA4\u4E92", "capabilities": ["ui", "css", "design"], "priority": 2}
|
|
3959
|
-
]`;try{let o=(await s.llmCall("\u4F60\u662F\u4E00\u4E2A AI \u4EE3\u7406\u56E2\u961F\u914D\u7F6E\u4E13\u5BB6\uFF0C\u64C5\u957F\u5206\u6790\u9879\u76EE\u5E76\u751F\u6210\u6700\u4F18\u7684\u89D2\u8272\u5206\u5DE5\u3002",n)).match(/\[[\s\S]*\]/);return o?JSON.parse(o[0]).filter(a=>a.id&&a.name&&a.description&&Array.isArray(a.capabilities)&&typeof a.priority=="number").slice(0,6):[]}catch{return []}}function LU(s,e,t){e.setNetworkRoles(t);let n=new Date().toISOString(),r=s.userConfig,o=r.runConfig?.modes?.network??{},i={...r,runConfig:{...r.runConfig??{},modes:{...r.runConfig?.modes??{},network:{...o,networkRoles:t,updatedAt:n,createdAt:o.createdAt||n}}}};s.updateConfig(i);}Xt();Tn();Du();function hp(s,e){s.outputLines?s.outputLines(e):e.forEach(t=>Q(t));}async function hI(s,e){let t=(e||"").trim().toLowerCase();if(!t)try{let n=s.mcpManager.isEnabled();t=await s.promptSelect("MCP commands",[{label:"Manage servers",value:"list"},{label:n?"Disable MCP":"Enable MCP",value:"toggle-global"}],"list","Use \u2191\u2193 then Enter");}catch(n){n?.message!=="cancelled"&&s.logInfo("MCP menu closed",n?.message);return}switch(t){case "list":await jU(s);break;case "toggle-global":await zU(s);break;case "add":await NU(s);break;default:s.logInfo("Unknown MCP command",`Command: ${t}`);}}async function fI(s,e){let[t,...n]=s,r=(t||"").trim().toLowerCase();try{switch(r){case "add":{let o=OU(n),i=FU(o);return Mu(e.workDir,o.scope,i),Q(w.success(`\u2713 MCP server "${i.id}" added (${o.scope})`)),Q(w.dim(` Transport: ${i.transport}`)),i.transport==="stdio"?Q(w.dim(` Command: ${i.command} ${(i.args||[]).join(" ")}`)):Q(w.dim(` URL: ${i.url}`)),0}case "list":{let o=Js(e.workDir);return $U({outputLines:i=>i.forEach(Q)},o),0}case "remove":{let{serverId:o,scope:i}=pI(n);return Ru(e.workDir,i,o)?(Q(w.success(`\u2713 MCP server "${o}" removed (${i})`)),0):(Q(w.warning(`MCP server "${o}" not found in ${i} scope`)),1)}case "enable":case "disable":{let o=r==="enable",{serverId:i,scope:a}=pI(n);return ar(e.workDir,a,i,{enabled:o})?(Q(w.success(`\u2713 MCP server "${i}" ${o?"enabled":"disabled"} (${a})`)),0):(Q(w.warning(`MCP server "${i}" not found in ${a} scope`)),1)}case "connect":case "test":{let o=n[0];if(!o)return Q(w.warning("Usage: neox mcp connect <serverId>")),1;let i=BU(n.slice(1)),a=new lr({workDir:e.workDir});if(r==="connect"){await a.connect(o);let d=await a.getToolDefinitions(o),p=mI(e.workDir,o,i);return p&&ar(e.workDir,p,o,{toolCache:d,toolCacheUpdatedAt:new Date().toISOString()}),Q(w.success(`\u2713 MCP server "${o}" connected`)),0}let l=await a.getToolDefinitions(o),c={toolCount:l.length,tools:l.map(d=>d.name)},u=mI(e.workDir,o,i);return u&&ar(e.workDir,u,o,{toolCache:l,toolCacheUpdatedAt:new Date().toISOString()}),Q(w.success(`\u2713 MCP server "${o}" ok (${c.toolCount} tools)`)),c.toolCount>0&&c.tools.forEach(d=>Q(w.dim(` - ${d}`))),0}default:return Q("Usage: neox mcp <list|add|remove|enable|disable|connect|test> ..."),1}}catch(o){return Q(w.error(`\u2717 MCP command failed: ${o?.message||o}`)),1}}async function NU(s){let e=await s.promptText("MCP server id",{allowEmpty:false});if(!e)return;let t=await s.promptSelect("Scope",[{label:"user",value:"user"},{label:"workspace",value:"workspace"}],"user"),n=await s.promptSelect("Transport",[{label:"stdio",value:"stdio"},{label:"sse",value:"sse"}],"stdio"),r={id:e,name:e,transport:n,enabled:true,autoConnect:false};if(r.transport==="stdio"){let o=await s.promptText("Command (e.g. npx chrome-devtools-mcp@latest)",{allowEmpty:false});if(!o)return;let i=UU(o);r.command=i[0],r.args=i.slice(1);}else {let o=await s.promptText("SSE URL",{allowEmpty:false});if(!o)return;r.url=o;}try{Mu(s.workDir,t,r),await s.refreshMcpTools?.(),s.logInfo("MCP server added",`${r.id} (${t})`);}catch(o){s.logInfo("Failed to add MCP server",o?.message||String(o));}}function $U(s,e){if(e.length===0){hp(s,["",w.info("No MCP servers configured."),""]);return}let t=[""];t.push(w.highlight(" MCP Servers")),t.push(w.dim(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));for(let n of e){let r=n.enabled===false?w.warning("disabled"):w.success("enabled"),o=w.dim(`[${n.scope}]`),i=w.dim(n.transport),a=n.toolCache?n.toolCache.length:0,l=w.dim(`tools:${a}`),c=n.transport==="stdio"?`${n.command||""} ${(n.args||[]).join(" ")}`.trim():n.url||"";t.push(` ${w.primary(n.id)} ${o} ${r} ${i} ${l}`),c&&t.push(w.dim(` ${c}`));}t.push(""),hp(s,t);}function OU(s){let[e,...t]=s;if(!e)throw new Error("Usage: neox mcp add <id> [--scope user|workspace] <command...>");let n={id:e,scope:"user",transport:"stdio",enabled:true,autoConnect:false,env:{}},r=[];for(let o=0;o<t.length;o+=1){let i=t[o];if(i==="--"){r.push(...t.slice(o+1));break}if(!i.startsWith("-")){r.push(...t.slice(o));break}switch(i){case "--scope":n.scope=t[++o]||"user";break;case "--name":n.name=t[++o];break;case "--transport":n.transport=t[++o]||"stdio";break;case "--url":n.url=t[++o];break;case "--env":{let a=t[++o];if(!a||!a.includes("="))throw new Error("Invalid --env format, expected KEY=VALUE");let[l,...c]=a.split("=");n.env[l]=c.join("=");break}case "--auto-connect":n.autoConnect=true;break;case "--no-auto-connect":n.autoConnect=false;break;case "--allow":n.allowlist=gI(t[++o]);break;case "--deny":n.denylist=gI(t[++o]);break;default:throw new Error(`Unknown option: ${i}`)}}if(n.transport==="sse"){if(!n.url)throw new Error("SSE transport requires --url");if(n.scope!=="user"&&n.scope!=="workspace")throw new Error("Invalid scope, expected user or workspace");return n}if(r.length===0)throw new Error("stdio transport requires a command, e.g. npx chrome-devtools-mcp@latest");if(n.command=r[0],n.args=r.slice(1),n.scope!=="user"&&n.scope!=="workspace")throw new Error("Invalid scope, expected user or workspace");return n}function pI(s){let[e,...t]=s;if(!e)throw new Error("Usage: neox mcp remove <id> [--scope user|workspace]");let n="user";for(let r=0;r<t.length;r+=1)if(t[r]==="--scope"){n=t[r+1]||"user";break}if(n!=="user"&&n!=="workspace")throw new Error("Invalid scope, expected user or workspace");return {serverId:e,scope:n}}function BU(s){for(let e=0;e<s.length;e+=1)if(s[e]==="--scope"){let t=s[e+1]||"user";if(t==="user"||t==="workspace")return t;throw new Error("Invalid scope, expected user or workspace")}return null}function mI(s,e,t){return t||(Js(s).find(o=>o.id===e)?.scope??null)}function FU(s){return {id:s.id,name:s.name??s.id,transport:s.transport,command:s.command,args:s.args,env:Object.keys(s.env).length>0?s.env:void 0,url:s.url,enabled:s.enabled,autoConnect:s.autoConnect,allowlist:s.allowlist,denylist:s.denylist}}function UU(s){return s.split(/\s+/).filter(Boolean)}function gI(s){if(!s)return;let e=s.split(",").map(t=>t.trim()).filter(Boolean);return e.length>0?e:void 0}async function jU(s){let e=Js(s.workDir);if(e.length===0){s.logInfo("No MCP servers configured");return}for(;;)try{let t=e.map(o=>{let i=o.enabled===!1?"\u{1F534}":"\u{1F7E2}",a=o.toolCache?o.toolCache.length:0,l=o.transport==="stdio"?`${o.command||""} ${(o.args||[]).join(" ")}`.trim():o.url||"";return {label:`${i} ${o.id} [${o.scope}] (${a} tools)`,value:o.id,description:l}});t.push({label:"\u2190 Back",value:"__back__"});let n=await s.promptSelect("MCP Servers (select to manage)",t,void 0,"Use \u2191\u2193 then Enter");if(n==="__back__")return;let r=e.find(o=>o.id===n);if(!r)continue;await GU(s,r);}catch(t){if(t?.message==="cancelled")return;s.logInfo("Error",t?.message||String(t));return}}async function GU(s,e){let t=e.toolCache?e.toolCache.length:0,n=e.enabled===false?"Disabled":"Enabled";switch(await s.promptSelect(`Manage: ${e.id} (${n}, ${t} tools)`,[{label:"View details",value:"view"},{label:"Edit",value:"edit"},{label:"Test connection",value:"test"},{label:e.enabled===false?"Enable":"Disable",value:"toggle"},{label:"Delete",value:"delete"},{label:"\u2190 Back",value:"back"}],"view","Use \u2191\u2193 then Enter")){case "view":await WU(s,e);break;case "edit":await HU(s,e);break;case "test":await qU(s,e);break;case "toggle":await KU(s,e);break;case "delete":await JU(s,e);break;case "back":return}}async function WU(s,e){let t=[""];t.push(w.highlight(` Server: ${e.id}`)),t.push(w.dim(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),t.push(` ${w.dim("Name:")} ${e.name||e.id}`),t.push(` ${w.dim("Scope:")} ${e.scope}`),t.push(` ${w.dim("Transport:")} ${e.transport}`),t.push(` ${w.dim("Status:")} ${e.enabled===false?w.warning("disabled"):w.success("enabled")}`),e.transport==="stdio"?(t.push(` ${w.dim("Command:")} ${e.command||""}`),e.args&&e.args.length>0&&t.push(` ${w.dim("Args:")} ${e.args.join(" ")}`)):t.push(` ${w.dim("URL:")} ${e.url||""}`);let n=e.toolCache?e.toolCache.length:0;t.push(` ${w.dim("Tools:")} ${n}`),e.toolCacheUpdatedAt&&t.push(` ${w.dim("Cache updated:")} ${new Date(e.toolCacheUpdatedAt).toLocaleString()}`),t.push(""),hp(s,t);}async function zU(s){let t=!s.mcpManager.isEnabled();s.mcpManager.setEnabled(t),await s.refreshMcpTools?.(),s.logInfo("MCP",t?"Enabled":"Disabled");}async function HU(s,e){let t=await s.promptSelect(`Edit ${e.id}`,[{label:"Command/URL",value:"command"},{label:"Name",value:"name"},{label:"\u2190 Back",value:"back"}],"command");if(t!=="back"){if(t==="name"){let n=await s.promptText("New name",{defaultValue:e.name||e.id});n&&(ar(s.workDir,e.scope,e.id,{name:n}),await s.refreshMcpTools?.(),s.logInfo("Server updated",`${e.id}: name = ${n}`));return}if(t==="command")if(e.transport==="stdio"){let n=`${e.command||""} ${(e.args||[]).join(" ")}`.trim(),r=await s.promptText("Command",{defaultValue:n});if(r){let o=r.split(/\s+/).filter(Boolean);ar(s.workDir,e.scope,e.id,{command:o[0],args:o.slice(1)}),await s.refreshMcpTools?.(),s.logInfo("Server updated",`${e.id}: command = ${r}`);}}else {let n=await s.promptText("URL",{defaultValue:e.url||""});n&&(ar(s.workDir,e.scope,e.id,{url:n}),await s.refreshMcpTools?.(),s.logInfo("Server updated",`${e.id}: url = ${n}`));}}}async function qU(s,e){try{s.logInfo("Testing",e.id);let t=await s.mcpManager.getToolDefinitions(e.id);if(ar(s.workDir,e.scope,e.id,{toolCache:t,toolCacheUpdatedAt:new Date().toISOString()}),s.logInfo("Test OK",`${e.id} (${t.length} tools)`),t.length>0){let n=t.slice(0,10).map(r=>w.dim(` - ${r.name}`));t.length>10&&n.push(w.dim(` ... and ${t.length-10} more`)),hp(s,[""].concat(n));}}catch(t){s.logInfo("Test failed",t?.message||String(t));}}async function KU(s,e){let t=e.enabled===false;ar(s.workDir,e.scope,e.id,{enabled:t}),await s.refreshMcpTools?.(),s.logInfo("Server updated",`${e.id}: ${t?"enabled":"disabled"}`);}async function JU(s,e){if(await s.promptSelect(`Delete ${e.id}?`,[{label:"Cancel",value:"no"},{label:"Delete",value:"yes"}],"no")!=="yes")return;Ru(s.workDir,e.scope,e.id)?(await s.refreshMcpTools?.(),s.logInfo("Server deleted",e.id)):s.logInfo("Delete failed","Server not found");}fp();function gj(s=process.argv){let e=s.slice(2),t=e.includes("--debug")||e.includes("--debug-console"),n=e.includes("--debug")||e.includes("--debug-console");t&&(process.env.CLI_DEBUG="1"),n&&(process.env.CLI_DEBUG_CONSOLE="1");}gj();Sp();m.info("CLI","Starting Neox CLI");process.env.CLI_DEBUG==="1"&&(hn.start(5e3),m.info("CLI","Health monitor started for debugging"));var lb={log:console.log.bind(console),error:console.error.bind(console),warn:console.warn.bind(console)},bp=false,yp=false,cb=s=>{if(process.env.CLI_DEBUG!=="1"){if(s){if(yp)return;console.log=(...e)=>{let t=Ei(e);m.info("CONSOLE",t);},console.error=(...e)=>{let t=Ei(e);m.error("CONSOLE",t);},console.warn=(...e)=>{let t=Ei(e);m.warn("CONSOLE",t);},yp=true;return}yp&&(console.log=lb.log,console.error=lb.error,console.warn=lb.warn,yp=false);}},Ei=s=>s.map(e=>{if(typeof e=="string")return e;if(e===null||typeof e!="object")return typeof e=="bigint"?e.toString():String(e);let t=new WeakSet;try{return JSON.stringify(e,(n,r)=>{if(typeof r=="bigint")return r.toString();if(r instanceof Error)return {name:r.name,message:r.message,stack:r.stack};if(typeof r=="function")return "[Function]";if(typeof r=="object"&&r!==null){if(t.has(r))return "[Circular]";t.add(r);}return r})}catch{try{return String(e)}catch{return "[Unserializable]"}}}).join(" ");process.env.CLI_DEBUG==="1"&&(console.log=(...s)=>{let e=Ei(s);m.debug("CONSOLE",e);},console.error=(...s)=>{let e=Ei(s);m.error("CONSOLE",e);},console.warn=(...s)=>{let e=Ei(s);m.warn("CONSOLE",e);});setInterval(()=>{performance$1.clearMarks(),performance$1.clearMeasures();},6e4);var yj=fileURLToPath(import.meta.url);dirname(yj);var AI=false,ub=class{memory=null;providerControls=null;workDir;model;provider;providerId;providerSettings;providerStore;sessionRequests=0;uiController=null;userConfig={};platformServices=ti();actionLog;promptLock=null;promptLockResolver=null;approvalMode="auto";structuredOutput;compatProfile=null;memoryPressure;lastMemoryPressureState="unknown";autoCompactionInProgress=false;interactionMode="agent";pendingAttachments=[];tools=[];baseTools=[];mcpTools=[];mcpManager=null;lastToolCallArgs=new Map;toolIdToName=new Map;toolIdToArgs=new Map;sessionManager;sessionEnabled=true;cliArgs;isTaskRunning=false;exiting=false;runtimeInputTokens=0;runtimeOutputTokens=0;streamingTokenCount=0;currentSession;thinkingMode;remoteEnabled=false;remoteInputQueue=[];remoteQueueActive=false;helpMenuLastSelection="model";currentRunMode="single";serverConnection=null;remoteAdapter=null;sdkClient=null;initRunModeFromConfig(){let e=this.userConfig.runMode;e&&Jn.isValidMode(e)?this.currentRunMode=e:this.currentRunMode="single",m.info("MODE",`Run mode initialized: ${this.currentRunMode}`);}getSingleTools(){return this.mcpTools.length===0?this.baseTools:[...this.baseTools,...this.mcpTools]}async loadMcpTools(e){this.mcpManager?this.mcpManager.setWorkDir(this.workDir):this.mcpManager=new lr({workDir:this.workDir});try{this.mcpTools=await this.mcpManager.getTools({refresh:e?.refresh});}catch(t){m.warn("MCP",`Failed to load MCP tools: ${t?.message||t}`),this.mcpTools=[];}this.tools=this.getSingleTools();}setRunMode(e){if(this.currentRunMode!==e){if(this.abortCurrentRunMode(),this.currentRunMode=e,this.saveRunModeToConfig(e),this.uiController){if(e==="cooperate"){let n=new Lt(void 0,"cooperate").getEnabledWorkerModels().map(r=>this.getModelShortName(r.model));this.uiController.updateCooperateStats({models:n.map(r=>({shortName:r,status:"idle"})),totalInputTokens:0,totalOutputTokens:0});}else this.uiController.clearCooperateStats();this.uiController.setRunMode(e);}m.info("MODE",`Switched to ${e} mode`);}}abortCurrentRunMode(){this.remoteAdapter&&this.remoteAdapter.abort("cli");}saveRunModeToConfig(e){m.info("MODE",`Saving run mode to config: ${e}`),this.userConfig={...this.userConfig,runMode:e},Me(this.userConfig),m.info("MODE",`Run mode saved: ${e}`);}getCurrentRunMode(){return this.currentRunMode}getCompactionThreshold(){return (this.userConfig.context||{}).thresholdPercent||85}getCompressionMode(){return (this.userConfig.context||{}).compressionMode||"sync"}getRemoteConfig(){return this.userConfig.remote??{}}getNormalizedRemoteConfig(e=false){let t=this.getRemoteConfig();return {enabled:t.enabled??false,networkMode:t.networkMode==="vps"?"vps":"lan",host:t.host||"0.0.0.0",port:t.port||4399,token:t.token||(e?Nd():""),allowVoice:t.allowVoice??true,autoApprove:t.autoApprove??true,corsOrigins:t.corsOrigins??[]}}updateRemoteConfig(e){let n={...this.getNormalizedRemoteConfig(),...e},r={...this.userConfig,remote:n};this.userConfig=r,Me(r);}getRemoteStatus(){let e=this.getNormalizedRemoteConfig(),t=this.serverConnection?.port??e.port;return {enabled:e.enabled,running:this.remoteEnabled,networkMode:e.networkMode,host:e.host,port:t,token:e.token,clients:0,urls:this.getLanUrls(t)}}getLanUrls(e){let t=[],n=ho.networkInterfaces();for(let r of Object.keys(n)){let o=n[r]||[];for(let i of o)i.family==="IPv4"&&!i.internal&&t.push(`http://${i.address}:${e}`);}return t}regenerateRemoteToken(){let e=Nd();return this.updateRemoteConfig({token:e}),this.sdkClient?.setAuth({enabled:true,token:e}).catch(()=>{}),e}async startRemoteServer(){let e=this.getNormalizedRemoteConfig(true);if(!e.enabled)return;let t=this.getRemoteConfig();if((!t.token||!t.host||!t.port||!t.networkMode)&&this.updateRemoteConfig(e),this.sdkClient)try{await this.sdkClient.setAuth({enabled:!0,token:e.token}),this.remoteEnabled=!0,m.info("REMOTE",`Remote auth enabled (${e.networkMode.toUpperCase()}), token: ${e.token.slice(0,8)}...`);}catch(n){m.error("REMOTE",`Failed to enable auth on Main Server: ${n.message}`);}}async stopRemoteServer(){if(this.remoteEnabled){if(this.sdkClient)try{await this.sdkClient.setAuth({enabled:!1});}catch(e){m.error("REMOTE",`Failed to disable auth: ${e.message}`);}this.remoteEnabled=false;}}handleRemoteRun(e){return this.enqueueExecutorRun(e.text,"remote",e.voice)}enqueueExecutorRun(e,t,n){let r=e.trim();if(!r)return {ok:false,error:"Empty input"};this.remoteInputQueue.push({text:r,voice:n,source:t});let o=this.remoteInputQueue.length;return this.drainRemoteQueue(),{ok:true,queued:o>1,position:o}}async drainRemoteQueue(){if(this.remoteQueueActive){m.debug("REMOTE","drainRemoteQueue: already active, skipping");return}this.remoteQueueActive=true,m.debug("REMOTE",`drainRemoteQueue: started, queue length=${this.remoteInputQueue.length}, isTaskRunning=${this.isTaskRunning}`);try{for(;this.remoteInputQueue.length>0;){if(this.isTaskRunning){m.debug("REMOTE","drainRemoteQueue: task running, waiting..."),await new Promise(t=>setTimeout(t,200));continue}let e=this.remoteInputQueue.shift();e&&(m.debug("REMOTE",`drainRemoteQueue: processing "${e.text.slice(0,50)}"`),await this.handleUserInput(e.text,void 0,e.source),m.debug("REMOTE","drainRemoteQueue: handleUserInput completed"));}}finally{this.remoteQueueActive=false,m.debug("REMOTE","drainRemoteQueue: finished");}}currentMode="agent";constructor(e,t,n,r){this.cliArgs=r||Py(),this.userConfig=He(),this.approvalMode=this.userConfig.approvalMode||"auto",this.providerStore=new nt(this.userConfig),this.workDir=Ie.resolve(t||this.cliArgs.workDir||process.cwd()),this.actionLog=new ro({workspacePath:this.workDir,source:"cli",agentName:"Neox CLI"}),this.structuredOutput=l_(this.cliArgs.outputSchema),this.sessionManager=new dr,this.sessionEnabled=!this.cliArgs.noSession;let o=this.resolveProvider(n);this.providerSettings=o,this.providerId=o.id,this.provider=o.protocol;let i=e||this.providerStore.resolveModel(o.id);if(!i)throw new Error(`Provider "${o.name}" does not have any models configured. Use /model add to configure one.`);this.model=i,this.providerStore.setLastSelectedModel(o.id,this.model),this.refreshProviderSettings(),process.chdir(this.workDir),process.env.NEOX_WORKDIR=this.workDir,this.saveWorkspaceHistory(this.getWorkspaceHistory()),this.initRunModeFromConfig();}async init(){let e=Date.now(),t=o=>m.debug("BOOT",`init: ${o} (+${Date.now()-e}ms)`);qT(),t("preloadShellEnv..."),await NT(this.platformServices),t("preloadShellEnv done"),await this.actionLog.setWorkspace(this.workDir);let n=3;for(let o=1;o<=n;o++)try{let i=this.userConfig.remoteServer;if(i?.url){m.debug("BOOT",`init: connecting remote server ${i.url}`);let l=i.url.replace(/\/+$/,"");this.remoteAdapter=new ml(l,i.token),await this.remoteAdapter.connect("cli"),this.sdkClient=new oo({baseUrl:l,token:i.token}),m.info("CLI",`Connected to remote server at ${l}`),this.logInfo("\u8FDC\u7A0B\u8FDE\u63A5",`\u5DF2\u8FDE\u63A5\u5230 ${l}`);}else m.debug("BOOT",`init: ensureServer... (attempt ${o}/${n})`),this.serverConnection=await z0(this.workDir),m.debug("BOOT",`init: ensureServer done, port=${this.serverConnection.port}`),this.remoteAdapter=new ml(this.serverConnection.baseUrl),m.debug("BOOT","init: remoteAdapter.connect..."),await this.remoteAdapter.connect("cli"),m.debug("BOOT","init: remoteAdapter connected"),this.sdkClient=new oo(this.serverConnection.baseUrl),m.info("CLI",`Connected to server at ${this.serverConnection.baseUrl}`);let a=s_(this.getRuntimeEventContext());this.remoteAdapter.onEvent((l,c)=>{this.uiController&&a(l);}),m.debug("BOOT","init: server setup complete");break}catch(i){m.warn("BOOT",`server connect failed (attempt ${o}/${n}): ${i.message}`),m.error("CLI",`Failed to start/connect server (attempt ${o})`,{error:i.message}),this.remoteAdapter=null,this.sdkClient=null,this.serverConnection=void 0,o<n?await new Promise(a=>setTimeout(a,1e3*o)):m.error("BOOT",`server connect failed after ${n} attempts`);}this.approvalMode==="dangerous"?this.currentMode="auto":this.currentMode="agent",t("getTools..."),this.baseTools=await zn(this.workDir,this.platformServices),t("getTools done"),t("loadMcpTools..."),this.mcpManager=new lr({workDir:this.workDir}),await this.loadMcpTools(),t("loadMcpTools done"),t("skillRegistry.initialize..."),await et.initialize(this.workDir),t("skills done"),m.info("CLI",`Skills loaded: ${et.size} skills`),this.tools=this.getSingleTools();}applyProviderDefaults(){this.providerSettings&&(this.providerSettings.protocol==="anthropic"&&(this.model.includes("opus-4-6")||this.model.includes("opus-4.6")||this.model.includes("opus-4-5")||this.model.includes("opus-4.5")||this.model.endsWith("-thinking"))&&(this.thinkingMode="enabled",process.env.CLI_DEBUG==="1"&&m.debug("PROVIDER",`Claude thinking auto-enabled for model: ${this.model}`)),this.providerSettings.protocol==="gemini"&&(this.model.includes("gemini-3")||this.model.includes("preview"))&&(this.thinkingMode="enabled",process.env.CLI_DEBUG==="1"&&m.debug("PROVIDER",`Gemini thinking auto-enabled for model: ${this.model}`)));}resolveProvider(e){if(e){let n=this.providerStore.getProvider(e);if(n)return n;let r=e,o=this.providerStore.getProviders().find(i=>i.protocol===r);if(o)return o}let t=this.providerStore.getDefaultProvider();if(!t)throw new Error("No LLM providers configured. Run /provider add to set up a provider.");return t}getProviderByIdentifier(e){if(e){let t=this.providerStore.getProvider(e);if(t)return t;let n=this.providerStore.getProviders().find(r=>r.protocol===e);return n||null}return this.providerSettings||null}getProviderDisplayName(){if(!this.providerSettings)return "Not configured";let e=In[this.providerSettings.protocol]||"OpenAI";return `${this.providerSettings.name} (${e})`}getModelShortName(e){let t=e.toLowerCase();return t.includes("claude-3-opus")||t.includes("opus")?"opus":t.includes("claude-3-sonnet")||t.includes("sonnet")?"sonnet":t.includes("claude-3-haiku")||t.includes("haiku")?"haiku":t.includes("claude")?"claude":t.includes("gpt-4o")?"gpt-4o":t.includes("gpt-4")?"gpt-4":t.includes("gpt-3.5")?"gpt-3.5":t.includes("gpt")?"gpt":t.includes("gemini-pro")?"gemini-pro":t.includes("gemini")?"gemini":t.includes("deepseek")?"deepseek":t.includes("qwen")?"qwen":e.length>10?e.substring(0,10):e}isPlannerModeEnabled(){return this.provider==="openai-responses"}async promptText(e,t={}){await this.acquirePromptLock();try{if(this.uiController){let n=await this.uiController.promptText({message:e,defaultValue:t.defaultValue,allowEmpty:t.allowEmpty,hint:t.hint});if(n==null)throw new Error("cancelled");return n}return await this.promptTextLegacy(e,t)}finally{this.releasePromptLock();}}async promptSelect(e,t,n,r){if(await this.acquirePromptLock(),t.length===0)throw this.releasePromptLock(),new Error("No available options");let o=r??G().common.selectHint;if(this.uiController){let i=t.map(a=>({title:a.label,value:a.value,description:a.description}));try{let a=await this.uiController.promptSelect({message:e,choices:i,initialValue:n,hint:o});if(this.releasePromptLock(),a==null)throw new Error("cancelled");return a}catch(a){throw this.releasePromptLock(),a}}try{return await this.promptSelectLegacy(e,t,n)}finally{this.releasePromptLock();}}async promptYesNo(e,t=false){return await this.promptSelect(e,[{label:"Yes",value:"yes"},{label:"No",value:"no"}],t?"yes":"no")==="yes"}async promptConfirmKeyword(e,t){return (await this.promptText(e,{allowEmpty:false})).trim().toLowerCase()===t.toLowerCase()}async handleToolApprovalRequest(e){let t=V0(e.args||{}),n=`\u5141\u8BB8\u6267\u884C ${e.name}${t}?`,r="";try{r=JSON.stringify(e.args,null,2),r.length>600&&(r=`${r.slice(0,600)} ...`);}catch{r="";}this.uiController?(this.uiController.updateStatus(`\u9700\u8981\u5BA1\u6279: ${e.name}`,"thinking"),this.uiController.addInfo(`\u5BA1\u6279\u8BF7\u6C42 \xB7 ${e.name}`,r||void 0)):(Q(""),Q(w.warning(`\u26A0\uFE0F \u9700\u8981\u5BA1\u6279: ${e.name}${t}`)),r&&Q(w.dim(r)),Q(""));try{let o=await this.promptYesNo(n,!1);return this.uiController?this.uiController.addInfo(o?`[v] \u5DF2\u6279\u51C6 ${e.name}`:`\u26D4 \u5DF2\u62D2\u7EDD ${e.name}`):Q(w.info(o?`\u5DF2\u6279\u51C6 ${e.name}`:`\u5DF2\u62D2\u7EDD ${e.name}`)),o}catch(o){return o?.message!=="cancelled"&&this.logInfo("\u5BA1\u6279\u63D0\u793A\u5931\u8D25",o?.message),this.uiController?this.uiController.addInfo(`\u26D4 \u5DF2\u62D2\u7EDD ${e.name}`,"\u5BA1\u6279\u88AB\u53D6\u6D88"):Q(w.warning(`\u5BA1\u6279\u5DF2\u53D6\u6D88: ${e.name}`)),false}}async promptTextLegacy(e,t){let r=(await xl({type:"text",name:"value",message:e,initial:t.defaultValue},{onCancel:()=>{throw new Error("cancelled")}})).value??"";if(!r&&!t.allowEmpty)if(t.defaultValue)r=t.defaultValue;else throw new Error("cancelled");return r}async promptSelectLegacy(e,t,n){let r=n?Math.max(0,t.findIndex(i=>i.value===n)):0,o=await xl({type:"select",name:"value",message:e,choices:t.map(i=>({title:i.label,description:i.description,value:i.value})),initial:r},{onCancel:()=>{throw new Error("cancelled")}});if(o.value===void 0)throw new Error("cancelled");return o.value}async promptInput(e,t){await this.acquirePromptLock();try{if(this.uiController&&typeof this.uiController.promptInput=="function"){let r=await this.uiController.promptInput({message:e,initialValue:t||""});if(this.releasePromptLock(),r==null)throw new Error("cancelled");return r}let n=await xl({type:"text",name:"value",message:e,initial:t||""},{onCancel:()=>{throw new Error("cancelled")}});if(this.releasePromptLock(),n.value===void 0)throw new Error("cancelled");return n.value}catch(n){throw this.releasePromptLock(),n}}refreshProviderSettings(){if(!this.providerId)return;let e=this.providerStore.getProvider(this.providerId);e&&(this.providerSettings=e,this.rebuildCompatProfile());}getActiveModelConfig(){return this.providerSettings?.models?.find(e=>e.name===this.model)}rebuildCompatProfile(){if(m.info("DEBUG_CTX",`rebuildCompatProfile called, model=${this.model}`),!this.model||!this.providerSettings){this.compatProfile=null,this.memoryPressure=void 0,this.lastMemoryPressureState="unknown",this.updateContextWindowDisplay();return}let e=this.getActiveModelConfig();m.info("DEBUG_CTX",`rebuildCompatProfile for model="${this.model}", modelConfig=${!!e}, modelConfig.compat=${JSON.stringify(e?.compat)}`),this.compatProfile=Ox(this.model,e?.compat),m.info("DEBUG_CTX",`rebuildCompatProfile result: contextWindow=${this.compatProfile?.contextWindow}, source=${this.compatProfile?.source}`);let t=this.getCompactionThreshold();this.compatProfile&&(this.compatProfile.warnThresholds.warn=t/100,m.debug("CLI",`Applied user threshold to compatProfile: ${t}% (warn=${this.compatProfile.warnThresholds.warn})`)),this.resetMemoryPressureMonitor(),this.updateContextWindowDisplay();}resetMemoryPressureMonitor(){this.compatProfile?this.memoryPressure=new _o(this.compatProfile):this.memoryPressure=void 0,this.lastMemoryPressureState="unknown";}buildDefaultContextExtras(e){return this.compatProfile?{contextWindow:this.compatProfile.contextWindow,autoCompactLimit:this.compatProfile.autoCompactLimit,tokensUsedForContext:e?.tokensUsedForContext??0,pressure:e?.pressure??0,warningLevel:e?.warningLevel??"normal"}:{contextWindow:2e5,tokensUsedForContext:e?.tokensUsedForContext??0,pressure:e?.pressure??0,warningLevel:e?.warningLevel??"normal",...e}}updateContextWindowDisplay(){if(m.info("DEBUG_CTX",`updateContextWindowDisplay called, uiController=${!!this.uiController}, compatProfile=${!!this.compatProfile}, compatProfile.contextWindow=${this.compatProfile?.contextWindow}`),!this.uiController){m.info("DEBUG_CTX","updateContextWindowDisplay: uiController is null, returning");return}let e=this.buildDefaultContextExtras();if(m.info("DEBUG_CTX",`updateContextWindowDisplay: extras.contextWindow=${e?.contextWindow}`),!e)return;this.uiController.getTokenStats();m.info("DEBUG_CTX",`updateContextWindowDisplay: calling setTokenStats with contextWindow=${e.contextWindow}`),this.uiController.setTokenStats(0,0,e);}updateCompactionThreshold(e){if(!this.compatProfile){m.warn("CLI","Cannot update threshold: compatProfile not initialized");return}this.compatProfile.warnThresholds.warn=e/100,m.info("CLI",`Updated compaction threshold to ${e}% (warn=${this.compatProfile.warnThresholds.warn})`),this.uiController&&"setCompactionThreshold"in this.uiController&&this.uiController.setCompactionThreshold(e),this.resetMemoryPressureMonitor();}pushTokenStats(e,t,n,r){if(this.uiController){let o=this.uiController.getTokenStats(),i=this.calculateContextBreakdown(n),a=n?.promptTokens||0;process.env.CLI_DEBUG&&(m.debug("MAIN","pushTokenStats received:"),m.debug("MAIN",` snapshot.promptTokens=${n?.promptTokens}, snapshot.tokensUsed=${n?.tokensUsed}`),m.debug("MAIN",` actualPromptTokens=${a}`),m.debug("MAIN",` contextBreakdown.totalTokens=${i.totalTokens}`));let l=i;if(a>0&&(i.totalTokens??0)>0){let d=a/(i.totalTokens??1);l={systemTokens:Math.round((i.systemTokens??0)*d),userTokens:Math.round((i.userTokens??0)*d),assistantTokens:Math.round((i.assistantTokens??0)*d),toolCallTokens:Math.round((i.toolCallTokens??0)*d),toolResultTokens:Math.round((i.toolResultTokens??0)*d),toolTokens:Math.round(((i.toolCallTokens??0)+(i.toolResultTokens??0))*d),messageTokens:Math.round(((i.userTokens??0)+(i.assistantTokens??0))*d),totalTokens:a},process.env.CLI_DEBUG&&(m.debug("BREAKDOWN",`Scaled breakdown by ${d.toFixed(3)}x to match actual promptTokens`),m.debug("BREAKDOWN",` Estimated total: ${i.totalTokens}, Actual: ${a}`));}let c=n?{contextWindow:n.profile?.contextWindow||this.compatProfile?.contextWindow||2e5,autoCompactLimit:n.profile?.autoCompactLimit,pressure:n.pressure,warningLevel:n.state,tokensUsedForContext:a,messageCount:n.messageCount,...l}:{...this.buildDefaultContextExtras({tokensUsedForContext:o.tokensUsedForContext??0,pressure:o.pressure??0,warningLevel:o.warningLevel??"normal",messageCount:o.messageCount}),...i},u={...c,...r&&{cachedTokens:r.cachedTokens,openaiCachedTokens:r.openaiCachedTokens,anthropicCacheReadTokens:r.anthropicCacheReadTokens,anthropicCacheCreationTokens:r.anthropicCacheCreationTokens}};process.env.CLI_DEBUG&&(m.debug("MAIN","pushTokenStats calling setTokenStats:"),m.debug("MAIN",` inputTokens=${e}, outputTokens=${t}`),m.debug("MAIN",` snapshot.profile?.contextWindow=${n?.profile?.contextWindow}`),m.debug("MAIN",` this.compatProfile?.contextWindow=${this.compatProfile?.contextWindow}`),m.debug("MAIN",` final extras.contextWindow=${u.contextWindow}`),m.debug("MAIN",` extras.tokensUsedForContext=${c?.tokensUsedForContext}`),m.debug("MAIN",` hasSnapshot=${!!n}, hasCacheStats=${!!r}`)),this.uiController.setTokenStats(e,t,u);}}async calculateContextBreakdownAsync(e){let t=[];if(this.memory){t=this.memory.getAll(),m.debug("BREAKDOWN",`calculateContextBreakdown: Memory.getAll() returned ${t.length} messages`);let n=t.reduce((r,o)=>(r[o.role]=(r[o.role]||0)+1,r),{});m.debug("BREAKDOWN"," Role distribution:",n);}if(t.length>0){let n=Sr(t);if(m.debug("BREAKDOWN",`Calculated breakdown (total=${n.totalTokens}):`,{systemTokens:n.systemTokens,userTokens:n.userTokens,assistantTokens:n.assistantTokens,toolCallTokens:n.toolCallTokens,toolResultTokens:n.toolResultTokens}),e){let r=Math.abs(n.totalTokens-e.promptTokens),o=e.promptTokens>0?(r/e.promptTokens*100).toFixed(1):"0";m.debug("BREAKDOWN",`Comparison: estimated=${n.totalTokens}, actual=${e.promptTokens}, diff=${r} (${o}%)`);}return {systemTokens:n.systemTokens,userTokens:n.userTokens,assistantTokens:n.assistantTokens,toolCallTokens:n.toolCallTokens,toolResultTokens:n.toolResultTokens,toolTokens:n.toolCallTokens+n.toolResultTokens,messageTokens:n.userTokens+n.assistantTokens}}else return m.debug("BREAKDOWN","No messages found in Memory"),{}}calculateContextBreakdown(e){let t=[];if(this.memory&&(t=this.memory.getAll(),m.debug("BREAKDOWN",`calculateContextBreakdown: Memory has ${t.length} messages`),m.debug("BREAKDOWN",` Message roles: ${t.map(r=>r.role).join(" -> ")}`)),t.filter(r=>r.role!=="system").length===0)return m.debug("BREAKDOWN","Only system message(s) found, returning zeros (initial state)"),{systemTokens:0,userTokens:0,assistantTokens:0,toolCallTokens:0,toolResultTokens:0,toolTokens:0,messageTokens:0,totalTokens:0};if(t.length>0){let r=Sr(t),o=0;return e&&e.promptTokens>0&&(o=Math.max(0,e.promptTokens-r.totalTokens),m.debug("BREAKDOWN",`Tools definitions tokens: ${o} (= ${e.promptTokens} - ${r.totalTokens})`)),m.debug("BREAKDOWN",`Calculated breakdown (total=${r.totalTokens}):`,{systemTokens:r.systemTokens,userTokens:r.userTokens,assistantTokens:r.assistantTokens,toolCallTokens:r.toolCallTokens,toolResultTokens:r.toolResultTokens,toolsDefinitionsTokens:o}),{systemTokens:r.systemTokens+o,userTokens:r.userTokens,assistantTokens:r.assistantTokens,toolCallTokens:r.toolCallTokens,toolResultTokens:r.toolResultTokens,toolTokens:r.toolCallTokens+r.toolResultTokens,messageTokens:r.userTokens+r.assistantTokens,totalTokens:r.totalTokens+o}}return process.env.CLI_DEBUG&&m.debug("BREAKDOWN","No messages found in Memory, returning empty breakdown (no fallback)"),{}}async acquirePromptLock(){for(;this.promptLock;)await this.promptLock;this.promptLock=new Promise(e=>{this.promptLockResolver=e;});}releasePromptLock(){this.promptLockResolver&&this.promptLockResolver(),this.promptLock=null,this.promptLockResolver=null;}async selectProviderFromList(e){let t=this.providerStore.getProviders();if(t.length===0)return this.logInfo("No providers configured","Use /provider add to create one."),null;let n=[{label:"\u2B05\uFE0F Back",value:"__back__",description:"Return to previous menu"},{label:"\u2795 Add new provider",value:"__add__",description:"Create a new provider configuration"},{label:"\u2500".repeat(40),value:"__separator__",description:""},...t.map(o=>({label:`${o.name} (${In[o.protocol]||"OpenAI"})`,value:o.id,description:o.models.length>0?o.models.map(i=>i.name).join(", "):"No models configured"}))],r=await this.promptSelect(e,n,this.providerId);return r==="__back__"?null:r==="__add__"?{id:"__add__"}:r==="__separator__"?this.selectProviderFromList(e):this.providerStore.getProvider(r)||null}async selectModelFromProvider(e,t){if(!e||e.models.length===0)return this.logInfo("No models configured",`Use /model add to register a model for ${e?.name||"provider"}.`),null;let n=(e.id===this.providerId?this.model:null)||e.lastSelectedModel||e.defaultModel||e.models[0].name,r=[{label:"\u2B05\uFE0F Back",value:"__back__",description:"Return to previous menu"},{label:"\u2795 Add new model",value:"__add__",description:"Add a new model to this provider"},{label:"\u{1F5D1}\uFE0F Delete a model",value:"__delete__",description:"Remove a model from this provider"},{label:"\u2500".repeat(40),value:"__separator__",description:""},...e.models.map(i=>({label:e.id===this.providerId&&i.name===this.model?`${i.name} (current)`:i.name,value:i.name}))],o=await this.promptSelect(t,r,n);return o==="__back__"?null:o==="__add__"?"__add__":o==="__delete__"?"__delete__":o==="__separator__"?this.selectModelFromProvider(e,t):o}async selectModelFromCurrentProvider(e){return this.providerSettings?this.selectModelFromProvider(this.providerSettings,e):(this.logInfo("No provider configured","Add a provider before managing models."),null)}getCompletionContext(){return {providerStore:this.providerStore,providerSettings:this.providerSettings}}getCompletionSuggestions(e){return X0(this.getCompletionContext(),e)}async initializeSession(){if(this.sessionEnabled)try{let e;if(this.cliArgs.continue){let n=await this.sessionManager.getMostRecent();n?(e=n,Q(w.dim(` \u21AA Continuing session: ${e.sessionId}`))):(e=await this.sessionManager.createSession({model:this.model}),Q(w.dim(` \u2726 New session: ${e.sessionId}`)));}else if(this.cliArgs.resume)if(typeof this.cliArgs.resume=="string"){let n=await this.sessionManager.getSession(this.cliArgs.resume);n?(e=n,Q(w.dim(` \u21AA Resuming session: ${e.sessionId}`))):(Q(w.error(` [x] Session not found: ${this.cliArgs.resume}`)),e=await this.sessionManager.createSession({model:this.model}));}else {let n=await this.showSessionSelector();n?e=n:(e=await this.sessionManager.createSession({model:this.model}),Q(w.dim(` \u2726 New session: ${e.sessionId}`)));}else e=await this.sessionManager.createSession({model:this.model});let t=await this.activateSession(e,{loadHistory:!!(this.cliArgs.continue||this.cliArgs.resume)});t>0?Q(w.dim(` \u21B3 Loaded ${t} messages from history`)):this.sdkClient&&this.sdkClient.createCheckpoint(e?.sessionId??"cli","session_start").then(n=>{let r=typeof n=="string"?n:n?.id??"ok";m.info("CLI",`Checkpoint created: ${r}`);}).catch(n=>{m.warn("CLI",`Checkpoint creation failed: ${n.message}`);});}catch(e){m.warn("BOOT",`initializeSession failed: ${e.message}`,{stack:e.stack}),Q(w.warning(` \u26A0 Session initialization failed: ${e.message}`)),this.sessionEnabled=false;}}async showSessionSelector(){let e=await this.sessionManager.listSessions();if(e.length===0)return Q(w.dim(" No sessions found")),null;Q(""),Q(w.highlight(" Select Session:")),Q("");let t=e.slice(0,10).map((o,i)=>({title:`${o.sessionId} (${o.itemCount} items, ${Xd(o.updatedAt)})`,value:o.sessionId}));t.push({title:"Create new session",value:"new"});let n=await xl({type:"select",name:"session",message:"Session",choices:t});if(!n.session||n.session==="new")return null;let r=await this.sessionManager.getSession(n.session);return r&&Q(w.dim(` \u21AA Selected: ${r.sessionId}`)),r}async activateSession(e,t){if(this.currentSession=e,this.sdkClient&&t?.loadHistory!==false)try{return (await this.sdkClient.getSessionInfo(e.sessionId))?.messageCount??0}catch{return 0}return 0}setupKeyboardHandling(){process.stdin.isTTY&&(zh.emitKeypressEvents(process.stdin),process.stdin.setRawMode(true),process.stdin.on("keypress",(e,t)=>{t.name==="escape"&&AI,t.ctrl&&t.name==="c"&&(console.log(w.info(`
|
|
3966
|
+
]`;try{let o=(await s.llmCall("\u4F60\u662F\u4E00\u4E2A AI \u4EE3\u7406\u56E2\u961F\u914D\u7F6E\u4E13\u5BB6\uFF0C\u64C5\u957F\u5206\u6790\u9879\u76EE\u5E76\u751F\u6210\u6700\u4F18\u7684\u89D2\u8272\u5206\u5DE5\u3002",n)).match(/\[[\s\S]*\]/);return o?JSON.parse(o[0]).filter(a=>a.id&&a.name&&a.description&&Array.isArray(a.capabilities)&&typeof a.priority=="number").slice(0,6):[]}catch{return []}}function LU(s,e,t){e.setNetworkRoles(t);let n=new Date().toISOString(),r=s.userConfig,o=r.runConfig?.modes?.network??{},i={...r,runConfig:{...r.runConfig??{},modes:{...r.runConfig?.modes??{},network:{...o,networkRoles:t,updatedAt:n,createdAt:o.createdAt||n}}}};s.updateConfig(i);}Xt();Tn();Du();function hp(s,e){s.outputLines?s.outputLines(e):e.forEach(t=>Q(t));}async function hI(s,e){let t=(e||"").trim().toLowerCase();if(!t)try{let n=s.mcpManager.isEnabled();t=await s.promptSelect("MCP commands",[{label:"Manage servers",value:"list"},{label:n?"Disable MCP":"Enable MCP",value:"toggle-global"}],"list","Use \u2191\u2193 then Enter");}catch(n){n?.message!=="cancelled"&&s.logInfo("MCP menu closed",n?.message);return}switch(t){case "list":await jU(s);break;case "toggle-global":await zU(s);break;case "add":await NU(s);break;default:s.logInfo("Unknown MCP command",`Command: ${t}`);}}async function fI(s,e){let[t,...n]=s,r=(t||"").trim().toLowerCase();try{switch(r){case "add":{let o=OU(n),i=FU(o);return Mu(e.workDir,o.scope,i),Q(w.success(`\u2713 MCP server "${i.id}" added (${o.scope})`)),Q(w.dim(` Transport: ${i.transport}`)),i.transport==="stdio"?Q(w.dim(` Command: ${i.command} ${(i.args||[]).join(" ")}`)):Q(w.dim(` URL: ${i.url}`)),0}case "list":{let o=Js(e.workDir);return $U({outputLines:i=>i.forEach(Q)},o),0}case "remove":{let{serverId:o,scope:i}=pI(n);return Ru(e.workDir,i,o)?(Q(w.success(`\u2713 MCP server "${o}" removed (${i})`)),0):(Q(w.warning(`MCP server "${o}" not found in ${i} scope`)),1)}case "enable":case "disable":{let o=r==="enable",{serverId:i,scope:a}=pI(n);return ar(e.workDir,a,i,{enabled:o})?(Q(w.success(`\u2713 MCP server "${i}" ${o?"enabled":"disabled"} (${a})`)),0):(Q(w.warning(`MCP server "${i}" not found in ${a} scope`)),1)}case "connect":case "test":{let o=n[0];if(!o)return Q(w.warning("Usage: neox mcp connect <serverId>")),1;let i=BU(n.slice(1)),a=new lr({workDir:e.workDir});if(r==="connect"){await a.connect(o);let d=await a.getToolDefinitions(o),p=mI(e.workDir,o,i);return p&&ar(e.workDir,p,o,{toolCache:d,toolCacheUpdatedAt:new Date().toISOString()}),Q(w.success(`\u2713 MCP server "${o}" connected`)),0}let l=await a.getToolDefinitions(o),c={toolCount:l.length,tools:l.map(d=>d.name)},u=mI(e.workDir,o,i);return u&&ar(e.workDir,u,o,{toolCache:l,toolCacheUpdatedAt:new Date().toISOString()}),Q(w.success(`\u2713 MCP server "${o}" ok (${c.toolCount} tools)`)),c.toolCount>0&&c.tools.forEach(d=>Q(w.dim(` - ${d}`))),0}default:return Q("Usage: neox mcp <list|add|remove|enable|disable|connect|test> ..."),1}}catch(o){return Q(w.error(`\u2717 MCP command failed: ${o?.message||o}`)),1}}async function NU(s){let e=await s.promptText("MCP server id",{allowEmpty:false});if(!e)return;let t=await s.promptSelect("Scope",[{label:"user",value:"user"},{label:"workspace",value:"workspace"}],"user"),n=await s.promptSelect("Transport",[{label:"stdio",value:"stdio"},{label:"sse",value:"sse"}],"stdio"),r={id:e,name:e,transport:n,enabled:true,autoConnect:false};if(r.transport==="stdio"){let o=await s.promptText("Command (e.g. npx chrome-devtools-mcp@latest)",{allowEmpty:false});if(!o)return;let i=UU(o);r.command=i[0],r.args=i.slice(1);}else {let o=await s.promptText("SSE URL",{allowEmpty:false});if(!o)return;r.url=o;}try{Mu(s.workDir,t,r),await s.refreshMcpTools?.(),s.logInfo("MCP server added",`${r.id} (${t})`);}catch(o){s.logInfo("Failed to add MCP server",o?.message||String(o));}}function $U(s,e){if(e.length===0){hp(s,["",w.info("No MCP servers configured."),""]);return}let t=[""];t.push(w.highlight(" MCP Servers")),t.push(w.dim(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));for(let n of e){let r=n.enabled===false?w.warning("disabled"):w.success("enabled"),o=w.dim(`[${n.scope}]`),i=w.dim(n.transport),a=n.toolCache?n.toolCache.length:0,l=w.dim(`tools:${a}`),c=n.transport==="stdio"?`${n.command||""} ${(n.args||[]).join(" ")}`.trim():n.url||"";t.push(` ${w.primary(n.id)} ${o} ${r} ${i} ${l}`),c&&t.push(w.dim(` ${c}`));}t.push(""),hp(s,t);}function OU(s){let[e,...t]=s;if(!e)throw new Error("Usage: neox mcp add <id> [--scope user|workspace] <command...>");let n={id:e,scope:"user",transport:"stdio",enabled:true,autoConnect:false,env:{}},r=[];for(let o=0;o<t.length;o+=1){let i=t[o];if(i==="--"){r.push(...t.slice(o+1));break}if(!i.startsWith("-")){r.push(...t.slice(o));break}switch(i){case "--scope":n.scope=t[++o]||"user";break;case "--name":n.name=t[++o];break;case "--transport":n.transport=t[++o]||"stdio";break;case "--url":n.url=t[++o];break;case "--env":{let a=t[++o];if(!a||!a.includes("="))throw new Error("Invalid --env format, expected KEY=VALUE");let[l,...c]=a.split("=");n.env[l]=c.join("=");break}case "--auto-connect":n.autoConnect=true;break;case "--no-auto-connect":n.autoConnect=false;break;case "--allow":n.allowlist=gI(t[++o]);break;case "--deny":n.denylist=gI(t[++o]);break;default:throw new Error(`Unknown option: ${i}`)}}if(n.transport==="sse"){if(!n.url)throw new Error("SSE transport requires --url");if(n.scope!=="user"&&n.scope!=="workspace")throw new Error("Invalid scope, expected user or workspace");return n}if(r.length===0)throw new Error("stdio transport requires a command, e.g. npx chrome-devtools-mcp@latest");if(n.command=r[0],n.args=r.slice(1),n.scope!=="user"&&n.scope!=="workspace")throw new Error("Invalid scope, expected user or workspace");return n}function pI(s){let[e,...t]=s;if(!e)throw new Error("Usage: neox mcp remove <id> [--scope user|workspace]");let n="user";for(let r=0;r<t.length;r+=1)if(t[r]==="--scope"){n=t[r+1]||"user";break}if(n!=="user"&&n!=="workspace")throw new Error("Invalid scope, expected user or workspace");return {serverId:e,scope:n}}function BU(s){for(let e=0;e<s.length;e+=1)if(s[e]==="--scope"){let t=s[e+1]||"user";if(t==="user"||t==="workspace")return t;throw new Error("Invalid scope, expected user or workspace")}return null}function mI(s,e,t){return t||(Js(s).find(o=>o.id===e)?.scope??null)}function FU(s){return {id:s.id,name:s.name??s.id,transport:s.transport,command:s.command,args:s.args,env:Object.keys(s.env).length>0?s.env:void 0,url:s.url,enabled:s.enabled,autoConnect:s.autoConnect,allowlist:s.allowlist,denylist:s.denylist}}function UU(s){return s.split(/\s+/).filter(Boolean)}function gI(s){if(!s)return;let e=s.split(",").map(t=>t.trim()).filter(Boolean);return e.length>0?e:void 0}async function jU(s){let e=Js(s.workDir);if(e.length===0){s.logInfo("No MCP servers configured");return}for(;;)try{let t=e.map(o=>{let i=o.enabled===!1?"\u{1F534}":"\u{1F7E2}",a=o.toolCache?o.toolCache.length:0,l=o.transport==="stdio"?`${o.command||""} ${(o.args||[]).join(" ")}`.trim():o.url||"";return {label:`${i} ${o.id} [${o.scope}] (${a} tools)`,value:o.id,description:l}});t.push({label:"\u2190 Back",value:"__back__"});let n=await s.promptSelect("MCP Servers (select to manage)",t,void 0,"Use \u2191\u2193 then Enter");if(n==="__back__")return;let r=e.find(o=>o.id===n);if(!r)continue;await GU(s,r);}catch(t){if(t?.message==="cancelled")return;s.logInfo("Error",t?.message||String(t));return}}async function GU(s,e){let t=e.toolCache?e.toolCache.length:0,n=e.enabled===false?"Disabled":"Enabled";switch(await s.promptSelect(`Manage: ${e.id} (${n}, ${t} tools)`,[{label:"View details",value:"view"},{label:"Edit",value:"edit"},{label:"Test connection",value:"test"},{label:e.enabled===false?"Enable":"Disable",value:"toggle"},{label:"Delete",value:"delete"},{label:"\u2190 Back",value:"back"}],"view","Use \u2191\u2193 then Enter")){case "view":await WU(s,e);break;case "edit":await HU(s,e);break;case "test":await qU(s,e);break;case "toggle":await KU(s,e);break;case "delete":await JU(s,e);break;case "back":return}}async function WU(s,e){let t=[""];t.push(w.highlight(` Server: ${e.id}`)),t.push(w.dim(" \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500")),t.push(` ${w.dim("Name:")} ${e.name||e.id}`),t.push(` ${w.dim("Scope:")} ${e.scope}`),t.push(` ${w.dim("Transport:")} ${e.transport}`),t.push(` ${w.dim("Status:")} ${e.enabled===false?w.warning("disabled"):w.success("enabled")}`),e.transport==="stdio"?(t.push(` ${w.dim("Command:")} ${e.command||""}`),e.args&&e.args.length>0&&t.push(` ${w.dim("Args:")} ${e.args.join(" ")}`)):t.push(` ${w.dim("URL:")} ${e.url||""}`);let n=e.toolCache?e.toolCache.length:0;t.push(` ${w.dim("Tools:")} ${n}`),e.toolCacheUpdatedAt&&t.push(` ${w.dim("Cache updated:")} ${new Date(e.toolCacheUpdatedAt).toLocaleString()}`),t.push(""),hp(s,t);}async function zU(s){let t=!s.mcpManager.isEnabled();s.mcpManager.setEnabled(t),await s.refreshMcpTools?.(),s.logInfo("MCP",t?"Enabled":"Disabled");}async function HU(s,e){let t=await s.promptSelect(`Edit ${e.id}`,[{label:"Command/URL",value:"command"},{label:"Name",value:"name"},{label:"\u2190 Back",value:"back"}],"command");if(t!=="back"){if(t==="name"){let n=await s.promptText("New name",{defaultValue:e.name||e.id});n&&(ar(s.workDir,e.scope,e.id,{name:n}),await s.refreshMcpTools?.(),s.logInfo("Server updated",`${e.id}: name = ${n}`));return}if(t==="command")if(e.transport==="stdio"){let n=`${e.command||""} ${(e.args||[]).join(" ")}`.trim(),r=await s.promptText("Command",{defaultValue:n});if(r){let o=r.split(/\s+/).filter(Boolean);ar(s.workDir,e.scope,e.id,{command:o[0],args:o.slice(1)}),await s.refreshMcpTools?.(),s.logInfo("Server updated",`${e.id}: command = ${r}`);}}else {let n=await s.promptText("URL",{defaultValue:e.url||""});n&&(ar(s.workDir,e.scope,e.id,{url:n}),await s.refreshMcpTools?.(),s.logInfo("Server updated",`${e.id}: url = ${n}`));}}}async function qU(s,e){try{s.logInfo("Testing",e.id);let t=await s.mcpManager.getToolDefinitions(e.id);if(ar(s.workDir,e.scope,e.id,{toolCache:t,toolCacheUpdatedAt:new Date().toISOString()}),s.logInfo("Test OK",`${e.id} (${t.length} tools)`),t.length>0){let n=t.slice(0,10).map(r=>w.dim(` - ${r.name}`));t.length>10&&n.push(w.dim(` ... and ${t.length-10} more`)),hp(s,[""].concat(n));}}catch(t){s.logInfo("Test failed",t?.message||String(t));}}async function KU(s,e){let t=e.enabled===false;ar(s.workDir,e.scope,e.id,{enabled:t}),await s.refreshMcpTools?.(),s.logInfo("Server updated",`${e.id}: ${t?"enabled":"disabled"}`);}async function JU(s,e){if(await s.promptSelect(`Delete ${e.id}?`,[{label:"Cancel",value:"no"},{label:"Delete",value:"yes"}],"no")!=="yes")return;Ru(s.workDir,e.scope,e.id)?(await s.refreshMcpTools?.(),s.logInfo("Server deleted",e.id)):s.logInfo("Delete failed","Server not found");}fp();function gj(s=process.argv){let e=s.slice(2),t=e.includes("--debug")||e.includes("--debug-console"),n=e.includes("--debug")||e.includes("--debug-console");t&&(process.env.CLI_DEBUG="1"),n&&(process.env.CLI_DEBUG_CONSOLE="1");}gj();Sp();m.info("CLI","Starting Neox CLI");process.env.CLI_DEBUG==="1"&&(hn.start(5e3),m.info("CLI","Health monitor started for debugging"));var lb={log:console.log.bind(console),error:console.error.bind(console),warn:console.warn.bind(console)},bp=false,yp=false,cb=s=>{if(process.env.CLI_DEBUG!=="1"){if(s){if(yp)return;console.log=(...e)=>{let t=Ei(e);m.info("CONSOLE",t);},console.error=(...e)=>{let t=Ei(e);m.error("CONSOLE",t);},console.warn=(...e)=>{let t=Ei(e);m.warn("CONSOLE",t);},yp=true;return}yp&&(console.log=lb.log,console.error=lb.error,console.warn=lb.warn,yp=false);}},Ei=s=>s.map(e=>{if(typeof e=="string")return e;if(e===null||typeof e!="object")return typeof e=="bigint"?e.toString():String(e);let t=new WeakSet;try{return JSON.stringify(e,(n,r)=>{if(typeof r=="bigint")return r.toString();if(r instanceof Error)return {name:r.name,message:r.message,stack:r.stack};if(typeof r=="function")return "[Function]";if(typeof r=="object"&&r!==null){if(t.has(r))return "[Circular]";t.add(r);}return r})}catch{try{return String(e)}catch{return "[Unserializable]"}}}).join(" ");process.env.CLI_DEBUG==="1"&&(console.log=(...s)=>{let e=Ei(s);m.debug("CONSOLE",e);},console.error=(...s)=>{let e=Ei(s);m.error("CONSOLE",e);},console.warn=(...s)=>{let e=Ei(s);m.warn("CONSOLE",e);});setInterval(()=>{performance$1.clearMarks(),performance$1.clearMeasures();},6e4);var yj=fileURLToPath(import.meta.url);dirname(yj);var AI=false,ub=class{memory=null;providerControls=null;workDir;model;provider;providerId;providerSettings;providerStore;sessionRequests=0;uiController=null;userConfig={};platformServices=ti();actionLog;promptLock=null;promptLockResolver=null;approvalMode="auto";structuredOutput;compatProfile=null;memoryPressure;lastMemoryPressureState="unknown";autoCompactionInProgress=false;interactionMode="agent";pendingAttachments=[];tools=[];baseTools=[];mcpTools=[];mcpManager=null;lastToolCallArgs=new Map;toolIdToName=new Map;toolIdToArgs=new Map;sessionManager;sessionEnabled=true;cliArgs;isTaskRunning=false;exiting=false;runtimeInputTokens=0;runtimeOutputTokens=0;streamingTokenCount=0;currentSession;thinkingMode;remoteEnabled=false;remoteInputQueue=[];remoteQueueActive=false;helpMenuLastSelection="model";currentRunMode="single";serverConnection=null;remoteAdapter=null;sdkClient=null;initRunModeFromConfig(){let e=this.userConfig.runMode;e&&Jn.isValidMode(e)?this.currentRunMode=e:this.currentRunMode="single",m.info("MODE",`Run mode initialized: ${this.currentRunMode}`);}getSingleTools(){return this.mcpTools.length===0?this.baseTools:[...this.baseTools,...this.mcpTools]}async loadMcpTools(e){this.mcpManager?this.mcpManager.setWorkDir(this.workDir):this.mcpManager=new lr({workDir:this.workDir});try{this.mcpTools=await this.mcpManager.getTools({refresh:e?.refresh});}catch(t){m.warn("MCP",`Failed to load MCP tools: ${t?.message||t}`),this.mcpTools=[];}this.tools=this.getSingleTools();}setRunMode(e){if(this.currentRunMode!==e){if(this.abortCurrentRunMode(),this.currentRunMode=e,this.saveRunModeToConfig(e),this.uiController){if(e==="cooperate"){let n=new Lt(void 0,"cooperate").getEnabledWorkerModels().map(r=>this.getModelShortName(r.model));this.uiController.updateCooperateStats({models:n.map(r=>({shortName:r,status:"idle"})),totalInputTokens:0,totalOutputTokens:0});}else this.uiController.clearCooperateStats();this.uiController.setRunMode(e);}m.info("MODE",`Switched to ${e} mode`);}}abortCurrentRunMode(){this.remoteAdapter&&this.remoteAdapter.abort("cli");}saveRunModeToConfig(e){m.info("MODE",`Saving run mode to config: ${e}`),this.userConfig={...this.userConfig,runMode:e},Me(this.userConfig),m.info("MODE",`Run mode saved: ${e}`);}getCurrentRunMode(){return this.currentRunMode}getCompactionThreshold(){return (this.userConfig.context||{}).thresholdPercent||85}getCompressionMode(){return (this.userConfig.context||{}).compressionMode||"sync"}getRemoteConfig(){return this.userConfig.remote??{}}getNormalizedRemoteConfig(e=false){let t=this.getRemoteConfig();return {enabled:t.enabled??false,networkMode:t.networkMode==="vps"?"vps":"lan",host:t.host||"0.0.0.0",port:t.port||4399,token:t.token||(e?Nd():""),allowVoice:t.allowVoice??true,autoApprove:t.autoApprove??true,corsOrigins:t.corsOrigins??[]}}updateRemoteConfig(e){let n={...this.getNormalizedRemoteConfig(),...e},r={...this.userConfig,remote:n};this.userConfig=r,Me(r);}getRemoteStatus(){let e=this.getNormalizedRemoteConfig(),t=this.serverConnection?.port??e.port;return {enabled:e.enabled,running:this.remoteEnabled,networkMode:e.networkMode,host:e.host,port:t,token:e.token,clients:0,urls:this.getLanUrls(t)}}getLanUrls(e){let t=[],n=ho.networkInterfaces();for(let r of Object.keys(n)){let o=n[r]||[];for(let i of o)i.family==="IPv4"&&!i.internal&&t.push(`http://${i.address}:${e}`);}return t}regenerateRemoteToken(){let e=Nd();return this.updateRemoteConfig({token:e}),this.sdkClient?.setAuth({enabled:true,token:e}).catch(()=>{}),e}async startRemoteServer(){let e=this.getNormalizedRemoteConfig(true);if(!e.enabled)return;let t=this.getRemoteConfig();if((!t.token||!t.host||!t.port||!t.networkMode)&&this.updateRemoteConfig(e),this.sdkClient)try{await this.sdkClient.setAuth({enabled:!0,token:e.token}),this.remoteEnabled=!0,m.info("REMOTE",`Remote auth enabled (${e.networkMode.toUpperCase()}), token: ${e.token.slice(0,8)}...`);}catch(n){m.error("REMOTE",`Failed to enable auth on Main Server: ${n.message}`);}}async stopRemoteServer(){if(this.remoteEnabled){if(this.sdkClient)try{await this.sdkClient.setAuth({enabled:!1});}catch(e){m.error("REMOTE",`Failed to disable auth: ${e.message}`);}this.remoteEnabled=false;}}handleRemoteRun(e){return this.enqueueExecutorRun(e.text,"remote",e.voice)}enqueueExecutorRun(e,t,n){let r=e.trim();if(!r)return {ok:false,error:"Empty input"};this.remoteInputQueue.push({text:r,voice:n,source:t});let o=this.remoteInputQueue.length;return this.drainRemoteQueue(),{ok:true,queued:o>1,position:o}}async drainRemoteQueue(){if(this.remoteQueueActive){m.debug("REMOTE","drainRemoteQueue: already active, skipping");return}this.remoteQueueActive=true,m.debug("REMOTE",`drainRemoteQueue: started, queue length=${this.remoteInputQueue.length}, isTaskRunning=${this.isTaskRunning}`);try{for(;this.remoteInputQueue.length>0;){if(this.isTaskRunning){m.debug("REMOTE","drainRemoteQueue: task running, waiting..."),await new Promise(t=>setTimeout(t,200));continue}let e=this.remoteInputQueue.shift();e&&(m.debug("REMOTE",`drainRemoteQueue: processing "${e.text.slice(0,50)}"`),await this.handleUserInput(e.text,void 0,e.source),m.debug("REMOTE","drainRemoteQueue: handleUserInput completed"));}}finally{this.remoteQueueActive=false,m.debug("REMOTE","drainRemoteQueue: finished");}}currentMode="agent";constructor(e,t,n,r){this.cliArgs=r||Py(),this.userConfig=He(),this.approvalMode=this.userConfig.approvalMode||"auto",this.providerStore=new rt(this.userConfig),this.workDir=Ie.resolve(t||this.cliArgs.workDir||process.cwd()),this.actionLog=new ro({workspacePath:this.workDir,source:"cli",agentName:"Neox CLI"}),this.structuredOutput=l_(this.cliArgs.outputSchema),this.sessionManager=new dr,this.sessionEnabled=!this.cliArgs.noSession;let o=this.resolveProvider(n);this.providerSettings=o,this.providerId=o.id,this.provider=o.protocol;let i=e||this.providerStore.resolveModel(o.id);if(!i)throw new Error(`Provider "${o.name}" does not have any models configured. Use /model add to configure one.`);this.model=i,this.providerStore.setLastSelectedModel(o.id,this.model),this.refreshProviderSettings(),process.chdir(this.workDir),process.env.NEOX_WORKDIR=this.workDir,this.saveWorkspaceHistory(this.getWorkspaceHistory()),this.initRunModeFromConfig();}async init(){let e=Date.now(),t=o=>m.debug("BOOT",`init: ${o} (+${Date.now()-e}ms)`);qT(),t("preloadShellEnv..."),await NT(this.platformServices),t("preloadShellEnv done"),await this.actionLog.setWorkspace(this.workDir);let n=3;for(let o=1;o<=n;o++)try{let i=this.userConfig.remoteServer;if(i?.url){m.debug("BOOT",`init: connecting remote server ${i.url}`);let l=i.url.replace(/\/+$/,"");this.remoteAdapter=new ml(l,i.token),await this.remoteAdapter.connect("cli"),this.sdkClient=new oo({baseUrl:l,token:i.token}),m.info("CLI",`Connected to remote server at ${l}`),this.logInfo("\u8FDC\u7A0B\u8FDE\u63A5",`\u5DF2\u8FDE\u63A5\u5230 ${l}`);}else m.debug("BOOT",`init: ensureServer... (attempt ${o}/${n})`),this.serverConnection=await z0(this.workDir),m.debug("BOOT",`init: ensureServer done, port=${this.serverConnection.port}`),this.remoteAdapter=new ml(this.serverConnection.baseUrl),m.debug("BOOT","init: remoteAdapter.connect..."),await this.remoteAdapter.connect("cli"),m.debug("BOOT","init: remoteAdapter connected"),this.sdkClient=new oo(this.serverConnection.baseUrl),m.info("CLI",`Connected to server at ${this.serverConnection.baseUrl}`);let a=s_(this.getRuntimeEventContext());this.remoteAdapter.onEvent((l,c)=>{this.uiController&&a(l);}),m.debug("BOOT","init: server setup complete");break}catch(i){m.warn("BOOT",`server connect failed (attempt ${o}/${n}): ${i.message}`),m.error("CLI",`Failed to start/connect server (attempt ${o})`,{error:i.message}),this.remoteAdapter=null,this.sdkClient=null,this.serverConnection=void 0,o<n?await new Promise(a=>setTimeout(a,1e3*o)):m.error("BOOT",`server connect failed after ${n} attempts`);}this.approvalMode==="dangerous"?this.currentMode="auto":this.currentMode="agent",t("getTools..."),this.baseTools=await zn(this.workDir,this.platformServices),t("getTools done"),t("loadMcpTools..."),this.mcpManager=new lr({workDir:this.workDir}),await this.loadMcpTools(),t("loadMcpTools done"),t("skillRegistry.initialize..."),await tt.initialize(this.workDir),t("skills done"),m.info("CLI",`Skills loaded: ${tt.size} skills`),this.tools=this.getSingleTools();}applyProviderDefaults(){this.providerSettings&&(this.providerSettings.protocol==="anthropic"&&(this.model.includes("opus-4-6")||this.model.includes("opus-4.6")||this.model.includes("opus-4-5")||this.model.includes("opus-4.5")||this.model.endsWith("-thinking"))&&(this.thinkingMode="enabled",process.env.CLI_DEBUG==="1"&&m.debug("PROVIDER",`Claude thinking auto-enabled for model: ${this.model}`)),this.providerSettings.protocol==="gemini"&&(this.model.includes("gemini-3")||this.model.includes("preview"))&&(this.thinkingMode="enabled",process.env.CLI_DEBUG==="1"&&m.debug("PROVIDER",`Gemini thinking auto-enabled for model: ${this.model}`)));}resolveProvider(e){if(e){let n=this.providerStore.getProvider(e);if(n)return n;let r=e,o=this.providerStore.getProviders().find(i=>i.protocol===r);if(o)return o}let t=this.providerStore.getDefaultProvider();if(!t)throw new Error("No LLM providers configured. Run /provider add to set up a provider.");return t}getProviderByIdentifier(e){if(e){let t=this.providerStore.getProvider(e);if(t)return t;let n=this.providerStore.getProviders().find(r=>r.protocol===e);return n||null}return this.providerSettings||null}getProviderDisplayName(){if(!this.providerSettings)return "Not configured";let e=In[this.providerSettings.protocol]||"OpenAI";return `${this.providerSettings.name} (${e})`}getModelShortName(e){let t=e.toLowerCase();return t.includes("claude-3-opus")||t.includes("opus")?"opus":t.includes("claude-3-sonnet")||t.includes("sonnet")?"sonnet":t.includes("claude-3-haiku")||t.includes("haiku")?"haiku":t.includes("claude")?"claude":t.includes("gpt-4o")?"gpt-4o":t.includes("gpt-4")?"gpt-4":t.includes("gpt-3.5")?"gpt-3.5":t.includes("gpt")?"gpt":t.includes("gemini-pro")?"gemini-pro":t.includes("gemini")?"gemini":t.includes("deepseek")?"deepseek":t.includes("qwen")?"qwen":e.length>10?e.substring(0,10):e}isPlannerModeEnabled(){return this.provider==="openai-responses"}async promptText(e,t={}){await this.acquirePromptLock();try{if(this.uiController){let n=await this.uiController.promptText({message:e,defaultValue:t.defaultValue,allowEmpty:t.allowEmpty,hint:t.hint});if(n==null)throw new Error("cancelled");return n}return await this.promptTextLegacy(e,t)}finally{this.releasePromptLock();}}async promptSelect(e,t,n,r){if(await this.acquirePromptLock(),t.length===0)throw this.releasePromptLock(),new Error("No available options");let o=r??G().common.selectHint;if(this.uiController){let i=t.map(a=>({title:a.label,value:a.value,description:a.description}));try{let a=await this.uiController.promptSelect({message:e,choices:i,initialValue:n,hint:o});if(this.releasePromptLock(),a==null)throw new Error("cancelled");return a}catch(a){throw this.releasePromptLock(),a}}try{return await this.promptSelectLegacy(e,t,n)}finally{this.releasePromptLock();}}async promptYesNo(e,t=false){return await this.promptSelect(e,[{label:"Yes",value:"yes"},{label:"No",value:"no"}],t?"yes":"no")==="yes"}async promptConfirmKeyword(e,t){return (await this.promptText(e,{allowEmpty:false})).trim().toLowerCase()===t.toLowerCase()}async handleToolApprovalRequest(e){let t=V0(e.args||{}),n=`\u5141\u8BB8\u6267\u884C ${e.name}${t}?`,r="";try{r=JSON.stringify(e.args,null,2),r.length>600&&(r=`${r.slice(0,600)} ...`);}catch{r="";}this.uiController?(this.uiController.updateStatus(`\u9700\u8981\u5BA1\u6279: ${e.name}`,"thinking"),this.uiController.addInfo(`\u5BA1\u6279\u8BF7\u6C42 \xB7 ${e.name}`,r||void 0)):(Q(""),Q(w.warning(`\u26A0\uFE0F \u9700\u8981\u5BA1\u6279: ${e.name}${t}`)),r&&Q(w.dim(r)),Q(""));try{let o=await this.promptYesNo(n,!1);return this.uiController?this.uiController.addInfo(o?`[v] \u5DF2\u6279\u51C6 ${e.name}`:`\u26D4 \u5DF2\u62D2\u7EDD ${e.name}`):Q(w.info(o?`\u5DF2\u6279\u51C6 ${e.name}`:`\u5DF2\u62D2\u7EDD ${e.name}`)),o}catch(o){return o?.message!=="cancelled"&&this.logInfo("\u5BA1\u6279\u63D0\u793A\u5931\u8D25",o?.message),this.uiController?this.uiController.addInfo(`\u26D4 \u5DF2\u62D2\u7EDD ${e.name}`,"\u5BA1\u6279\u88AB\u53D6\u6D88"):Q(w.warning(`\u5BA1\u6279\u5DF2\u53D6\u6D88: ${e.name}`)),false}}async promptTextLegacy(e,t){let r=(await xl({type:"text",name:"value",message:e,initial:t.defaultValue},{onCancel:()=>{throw new Error("cancelled")}})).value??"";if(!r&&!t.allowEmpty)if(t.defaultValue)r=t.defaultValue;else throw new Error("cancelled");return r}async promptSelectLegacy(e,t,n){let r=n?Math.max(0,t.findIndex(i=>i.value===n)):0,o=await xl({type:"select",name:"value",message:e,choices:t.map(i=>({title:i.label,description:i.description,value:i.value})),initial:r},{onCancel:()=>{throw new Error("cancelled")}});if(o.value===void 0)throw new Error("cancelled");return o.value}async promptInput(e,t){await this.acquirePromptLock();try{if(this.uiController&&typeof this.uiController.promptInput=="function"){let r=await this.uiController.promptInput({message:e,initialValue:t||""});if(this.releasePromptLock(),r==null)throw new Error("cancelled");return r}let n=await xl({type:"text",name:"value",message:e,initial:t||""},{onCancel:()=>{throw new Error("cancelled")}});if(this.releasePromptLock(),n.value===void 0)throw new Error("cancelled");return n.value}catch(n){throw this.releasePromptLock(),n}}refreshProviderSettings(){if(!this.providerId)return;let e=this.providerStore.getProvider(this.providerId);e&&(this.providerSettings=e,this.rebuildCompatProfile());}getActiveModelConfig(){return this.providerSettings?.models?.find(e=>e.name===this.model)}rebuildCompatProfile(){if(m.info("DEBUG_CTX",`rebuildCompatProfile called, model=${this.model}`),!this.model||!this.providerSettings){this.compatProfile=null,this.memoryPressure=void 0,this.lastMemoryPressureState="unknown",this.updateContextWindowDisplay();return}let e=this.getActiveModelConfig();m.info("DEBUG_CTX",`rebuildCompatProfile for model="${this.model}", modelConfig=${!!e}, modelConfig.compat=${JSON.stringify(e?.compat)}`),this.compatProfile=Ox(this.model,e?.compat),m.info("DEBUG_CTX",`rebuildCompatProfile result: contextWindow=${this.compatProfile?.contextWindow}, source=${this.compatProfile?.source}`);let t=this.getCompactionThreshold();this.compatProfile&&(this.compatProfile.warnThresholds.warn=t/100,m.debug("CLI",`Applied user threshold to compatProfile: ${t}% (warn=${this.compatProfile.warnThresholds.warn})`)),this.resetMemoryPressureMonitor(),this.updateContextWindowDisplay();}resetMemoryPressureMonitor(){this.compatProfile?this.memoryPressure=new _o(this.compatProfile):this.memoryPressure=void 0,this.lastMemoryPressureState="unknown";}buildDefaultContextExtras(e){return this.compatProfile?{contextWindow:this.compatProfile.contextWindow,autoCompactLimit:this.compatProfile.autoCompactLimit,tokensUsedForContext:e?.tokensUsedForContext??0,pressure:e?.pressure??0,warningLevel:e?.warningLevel??"normal"}:{contextWindow:2e5,tokensUsedForContext:e?.tokensUsedForContext??0,pressure:e?.pressure??0,warningLevel:e?.warningLevel??"normal",...e}}updateContextWindowDisplay(){if(m.info("DEBUG_CTX",`updateContextWindowDisplay called, uiController=${!!this.uiController}, compatProfile=${!!this.compatProfile}, compatProfile.contextWindow=${this.compatProfile?.contextWindow}`),!this.uiController){m.info("DEBUG_CTX","updateContextWindowDisplay: uiController is null, returning");return}let e=this.buildDefaultContextExtras();if(m.info("DEBUG_CTX",`updateContextWindowDisplay: extras.contextWindow=${e?.contextWindow}`),!e)return;this.uiController.getTokenStats();m.info("DEBUG_CTX",`updateContextWindowDisplay: calling setTokenStats with contextWindow=${e.contextWindow}`),this.uiController.setTokenStats(0,0,e);}updateCompactionThreshold(e){if(!this.compatProfile){m.warn("CLI","Cannot update threshold: compatProfile not initialized");return}this.compatProfile.warnThresholds.warn=e/100,m.info("CLI",`Updated compaction threshold to ${e}% (warn=${this.compatProfile.warnThresholds.warn})`),this.uiController&&"setCompactionThreshold"in this.uiController&&this.uiController.setCompactionThreshold(e),this.resetMemoryPressureMonitor();}pushTokenStats(e,t,n,r){if(this.uiController){let o=this.uiController.getTokenStats(),i=this.calculateContextBreakdown(n),a=n?.promptTokens||0;process.env.CLI_DEBUG&&(m.debug("MAIN","pushTokenStats received:"),m.debug("MAIN",` snapshot.promptTokens=${n?.promptTokens}, snapshot.tokensUsed=${n?.tokensUsed}`),m.debug("MAIN",` actualPromptTokens=${a}`),m.debug("MAIN",` contextBreakdown.totalTokens=${i.totalTokens}`));let l=i;if(a>0&&(i.totalTokens??0)>0){let d=a/(i.totalTokens??1);l={systemTokens:Math.round((i.systemTokens??0)*d),userTokens:Math.round((i.userTokens??0)*d),assistantTokens:Math.round((i.assistantTokens??0)*d),toolCallTokens:Math.round((i.toolCallTokens??0)*d),toolResultTokens:Math.round((i.toolResultTokens??0)*d),toolTokens:Math.round(((i.toolCallTokens??0)+(i.toolResultTokens??0))*d),messageTokens:Math.round(((i.userTokens??0)+(i.assistantTokens??0))*d),totalTokens:a},process.env.CLI_DEBUG&&(m.debug("BREAKDOWN",`Scaled breakdown by ${d.toFixed(3)}x to match actual promptTokens`),m.debug("BREAKDOWN",` Estimated total: ${i.totalTokens}, Actual: ${a}`));}let c=n?{contextWindow:n.profile?.contextWindow||this.compatProfile?.contextWindow||2e5,autoCompactLimit:n.profile?.autoCompactLimit,pressure:n.pressure,warningLevel:n.state,tokensUsedForContext:a,messageCount:n.messageCount,...l}:{...this.buildDefaultContextExtras({tokensUsedForContext:o.tokensUsedForContext??0,pressure:o.pressure??0,warningLevel:o.warningLevel??"normal",messageCount:o.messageCount}),...i},u={...c,...r&&{cachedTokens:r.cachedTokens,openaiCachedTokens:r.openaiCachedTokens,anthropicCacheReadTokens:r.anthropicCacheReadTokens,anthropicCacheCreationTokens:r.anthropicCacheCreationTokens}};process.env.CLI_DEBUG&&(m.debug("MAIN","pushTokenStats calling setTokenStats:"),m.debug("MAIN",` inputTokens=${e}, outputTokens=${t}`),m.debug("MAIN",` snapshot.profile?.contextWindow=${n?.profile?.contextWindow}`),m.debug("MAIN",` this.compatProfile?.contextWindow=${this.compatProfile?.contextWindow}`),m.debug("MAIN",` final extras.contextWindow=${u.contextWindow}`),m.debug("MAIN",` extras.tokensUsedForContext=${c?.tokensUsedForContext}`),m.debug("MAIN",` hasSnapshot=${!!n}, hasCacheStats=${!!r}`)),this.uiController.setTokenStats(e,t,u);}}async calculateContextBreakdownAsync(e){let t=[];if(this.memory){t=this.memory.getAll(),m.debug("BREAKDOWN",`calculateContextBreakdown: Memory.getAll() returned ${t.length} messages`);let n=t.reduce((r,o)=>(r[o.role]=(r[o.role]||0)+1,r),{});m.debug("BREAKDOWN"," Role distribution:",n);}if(t.length>0){let n=Sr(t);if(m.debug("BREAKDOWN",`Calculated breakdown (total=${n.totalTokens}):`,{systemTokens:n.systemTokens,userTokens:n.userTokens,assistantTokens:n.assistantTokens,toolCallTokens:n.toolCallTokens,toolResultTokens:n.toolResultTokens}),e){let r=Math.abs(n.totalTokens-e.promptTokens),o=e.promptTokens>0?(r/e.promptTokens*100).toFixed(1):"0";m.debug("BREAKDOWN",`Comparison: estimated=${n.totalTokens}, actual=${e.promptTokens}, diff=${r} (${o}%)`);}return {systemTokens:n.systemTokens,userTokens:n.userTokens,assistantTokens:n.assistantTokens,toolCallTokens:n.toolCallTokens,toolResultTokens:n.toolResultTokens,toolTokens:n.toolCallTokens+n.toolResultTokens,messageTokens:n.userTokens+n.assistantTokens}}else return m.debug("BREAKDOWN","No messages found in Memory"),{}}calculateContextBreakdown(e){let t=[];if(this.memory&&(t=this.memory.getAll(),m.debug("BREAKDOWN",`calculateContextBreakdown: Memory has ${t.length} messages`),m.debug("BREAKDOWN",` Message roles: ${t.map(r=>r.role).join(" -> ")}`)),t.filter(r=>r.role!=="system").length===0)return m.debug("BREAKDOWN","Only system message(s) found, returning zeros (initial state)"),{systemTokens:0,userTokens:0,assistantTokens:0,toolCallTokens:0,toolResultTokens:0,toolTokens:0,messageTokens:0,totalTokens:0};if(t.length>0){let r=Sr(t),o=0;return e&&e.promptTokens>0&&(o=Math.max(0,e.promptTokens-r.totalTokens),m.debug("BREAKDOWN",`Tools definitions tokens: ${o} (= ${e.promptTokens} - ${r.totalTokens})`)),m.debug("BREAKDOWN",`Calculated breakdown (total=${r.totalTokens}):`,{systemTokens:r.systemTokens,userTokens:r.userTokens,assistantTokens:r.assistantTokens,toolCallTokens:r.toolCallTokens,toolResultTokens:r.toolResultTokens,toolsDefinitionsTokens:o}),{systemTokens:r.systemTokens+o,userTokens:r.userTokens,assistantTokens:r.assistantTokens,toolCallTokens:r.toolCallTokens,toolResultTokens:r.toolResultTokens,toolTokens:r.toolCallTokens+r.toolResultTokens,messageTokens:r.userTokens+r.assistantTokens,totalTokens:r.totalTokens+o}}return process.env.CLI_DEBUG&&m.debug("BREAKDOWN","No messages found in Memory, returning empty breakdown (no fallback)"),{}}async acquirePromptLock(){for(;this.promptLock;)await this.promptLock;this.promptLock=new Promise(e=>{this.promptLockResolver=e;});}releasePromptLock(){this.promptLockResolver&&this.promptLockResolver(),this.promptLock=null,this.promptLockResolver=null;}async selectProviderFromList(e){let t=this.providerStore.getProviders();if(t.length===0)return this.logInfo("No providers configured","Use /provider add to create one."),null;let n=[{label:"\u2B05\uFE0F Back",value:"__back__",description:"Return to previous menu"},{label:"\u2795 Add new provider",value:"__add__",description:"Create a new provider configuration"},{label:"\u2500".repeat(40),value:"__separator__",description:""},...t.map(o=>({label:`${o.name} (${In[o.protocol]||"OpenAI"})`,value:o.id,description:o.models.length>0?o.models.map(i=>i.name).join(", "):"No models configured"}))],r=await this.promptSelect(e,n,this.providerId);return r==="__back__"?null:r==="__add__"?{id:"__add__"}:r==="__separator__"?this.selectProviderFromList(e):this.providerStore.getProvider(r)||null}async selectModelFromProvider(e,t){if(!e||e.models.length===0)return this.logInfo("No models configured",`Use /model add to register a model for ${e?.name||"provider"}.`),null;let n=(e.id===this.providerId?this.model:null)||e.lastSelectedModel||e.defaultModel||e.models[0].name,r=[{label:"\u2B05\uFE0F Back",value:"__back__",description:"Return to previous menu"},{label:"\u2795 Add new model",value:"__add__",description:"Add a new model to this provider"},{label:"\u{1F5D1}\uFE0F Delete a model",value:"__delete__",description:"Remove a model from this provider"},{label:"\u2500".repeat(40),value:"__separator__",description:""},...e.models.map(i=>({label:e.id===this.providerId&&i.name===this.model?`${i.name} (current)`:i.name,value:i.name}))],o=await this.promptSelect(t,r,n);return o==="__back__"?null:o==="__add__"?"__add__":o==="__delete__"?"__delete__":o==="__separator__"?this.selectModelFromProvider(e,t):o}async selectModelFromCurrentProvider(e){return this.providerSettings?this.selectModelFromProvider(this.providerSettings,e):(this.logInfo("No provider configured","Add a provider before managing models."),null)}getCompletionContext(){return {providerStore:this.providerStore,providerSettings:this.providerSettings}}getCompletionSuggestions(e){return X0(this.getCompletionContext(),e)}async initializeSession(){if(this.sessionEnabled)try{let e;if(this.cliArgs.continue){let n=await this.sessionManager.getMostRecent();n?(e=n,Q(w.dim(` \u21AA Continuing session: ${e.sessionId}`))):(e=await this.sessionManager.createSession({model:this.model}),Q(w.dim(` \u2726 New session: ${e.sessionId}`)));}else if(this.cliArgs.resume)if(typeof this.cliArgs.resume=="string"){let n=await this.sessionManager.getSession(this.cliArgs.resume);n?(e=n,Q(w.dim(` \u21AA Resuming session: ${e.sessionId}`))):(Q(w.error(` [x] Session not found: ${this.cliArgs.resume}`)),e=await this.sessionManager.createSession({model:this.model}));}else {let n=await this.showSessionSelector();n?e=n:(e=await this.sessionManager.createSession({model:this.model}),Q(w.dim(` \u2726 New session: ${e.sessionId}`)));}else e=await this.sessionManager.createSession({model:this.model});let t=await this.activateSession(e,{loadHistory:!!(this.cliArgs.continue||this.cliArgs.resume)});t>0?Q(w.dim(` \u21B3 Loaded ${t} messages from history`)):this.sdkClient&&this.sdkClient.createCheckpoint(e?.sessionId??"cli","session_start").then(n=>{let r=typeof n=="string"?n:n?.id??"ok";m.info("CLI",`Checkpoint created: ${r}`);}).catch(n=>{m.warn("CLI",`Checkpoint creation failed: ${n.message}`);});}catch(e){m.warn("BOOT",`initializeSession failed: ${e.message}`,{stack:e.stack}),Q(w.warning(` \u26A0 Session initialization failed: ${e.message}`)),this.sessionEnabled=false;}}async showSessionSelector(){let e=await this.sessionManager.listSessions();if(e.length===0)return Q(w.dim(" No sessions found")),null;Q(""),Q(w.highlight(" Select Session:")),Q("");let t=e.slice(0,10).map((o,i)=>({title:`${o.sessionId} (${o.itemCount} items, ${Xd(o.updatedAt)})`,value:o.sessionId}));t.push({title:"Create new session",value:"new"});let n=await xl({type:"select",name:"session",message:"Session",choices:t});if(!n.session||n.session==="new")return null;let r=await this.sessionManager.getSession(n.session);return r&&Q(w.dim(` \u21AA Selected: ${r.sessionId}`)),r}async activateSession(e,t){if(this.currentSession=e,this.sdkClient&&t?.loadHistory!==false)try{return (await this.sdkClient.getSessionInfo(e.sessionId))?.messageCount??0}catch{return 0}return 0}setupKeyboardHandling(){process.stdin.isTTY&&(zh.emitKeypressEvents(process.stdin),process.stdin.setRawMode(true),process.stdin.on("keypress",(e,t)=>{t.name==="escape"&&AI,t.ctrl&&t.name==="c"&&(console.log(w.info(`
|
|
3960
3967
|
|
|
3961
|
-
\u{1F44B} Goodbye!`)),this.exitWithCleanup({skipProcessCheck:true,exitCode:0,reason:"keypress"}));}));}async cleanup(e=false){if(m.debug("DEBUG",`NeoxCLI.cleanup() called, skipProcessCheck=${e}`),m.debug("DEBUG","Stopping health monitor"),hn.stop(),this.uiController&&(m.debug("DEBUG","Calling uiController.stop()"),this.uiController.stop(),cb(false),bp=false,m.debug("DEBUG","uiController.stop() returned")),await this.stopRemoteServer(),this.remoteAdapter&&(this.remoteAdapter.dispose(),this.remoteAdapter=null),this.serverConnection&&(H0(this.serverConnection),this.serverConnection=null),await this.actionLog.shutdown(),!e){let t=Bt.getBackgroundRunning();if(t.length>0){console.log(),console.log(w.warning(` \u26A0\uFE0F \u6709 ${t.length} \u4E2A\u540E\u53F0\u8FDB\u7A0B\u6B63\u5728\u8FD0\u884C:`)),console.log(),t.forEach(r=>{console.log(w.dim(` PID ${r.pid}: ${r.command.substring(0,50)}${r.command.length>50?"...":""}`));}),console.log();let{action:n}=await xl({type:"select",name:"action",message:"\u5982\u4F55\u5904\u7406\u8FD9\u4E9B\u540E\u53F0\u8FDB\u7A0B?",choices:[{title:"\u7EC8\u6B62\u6240\u6709\u540E\u53F0\u8FDB\u7A0B\u5E76\u9000\u51FA",value:"kill"},{title:"\u4FDD\u6301\u8FD0\u884C\u5E76\u9000\u51FA (\u8FDB\u7A0B\u5C06\u7EE7\u7EED\u5728\u540E\u53F0\u8FD0\u884C)",value:"keep"},{title:"\u53D6\u6D88\u9000\u51FA",value:"cancel"}]});if(n==="cancel")throw new Error("exit_cancelled");if(n==="kill"){console.log(),console.log(w.info(" \u6B63\u5728\u7EC8\u6B62\u540E\u53F0\u8FDB\u7A0B..."));let r=Bt.killAll(true);console.log(w.success(` \u2713 \u5DF2\u7EC8\u6B62 ${r.killed} \u4E2A\u8FDB\u7A0B`)),r.failed>0&&console.log(w.warning(` \u26A0 ${r.failed} \u4E2A\u8FDB\u7A0B\u7EC8\u6B62\u5931\u8D25`));}}}}async exitWithCleanup(e){if(this.exiting)return;this.exiting=true;let t=2e3,n=null,r=new Promise(o=>{n=setTimeout(o,t);});try{await Promise.race([this.cleanup(e.skipProcessCheck),r]);}catch(o){m.debug("DEBUG",`exitWithCleanup failed (${e.reason}): ${o?.message}`);}finally{n&&clearTimeout(n),process.exit(e.exitCode);}}buildInstructions(){let e=this.providerSettings.protocol||"openai",t=e==="openai-responses";return process.env.CLI_DEBUG==="1"&&m.debug("PROMPT",`Protocol: ${e}, useCodexStyle: ${t}`),(n,r)=>{let o=Os({workDir:this.workDir,language:"zh",useCodexStyle:t}),i=
|
|
3968
|
+
\u{1F44B} Goodbye!`)),this.exitWithCleanup({skipProcessCheck:true,exitCode:0,reason:"keypress"}));}));}async cleanup(e=false){if(m.debug("DEBUG",`NeoxCLI.cleanup() called, skipProcessCheck=${e}`),m.debug("DEBUG","Stopping health monitor"),hn.stop(),this.uiController&&(m.debug("DEBUG","Calling uiController.stop()"),this.uiController.stop(),cb(false),bp=false,m.debug("DEBUG","uiController.stop() returned")),await this.stopRemoteServer(),this.remoteAdapter&&(this.remoteAdapter.dispose(),this.remoteAdapter=null),this.serverConnection&&(H0(this.serverConnection),this.serverConnection=null),await this.actionLog.shutdown(),!e){let t=Bt.getBackgroundRunning();if(t.length>0){console.log(),console.log(w.warning(` \u26A0\uFE0F \u6709 ${t.length} \u4E2A\u540E\u53F0\u8FDB\u7A0B\u6B63\u5728\u8FD0\u884C:`)),console.log(),t.forEach(r=>{console.log(w.dim(` PID ${r.pid}: ${r.command.substring(0,50)}${r.command.length>50?"...":""}`));}),console.log();let{action:n}=await xl({type:"select",name:"action",message:"\u5982\u4F55\u5904\u7406\u8FD9\u4E9B\u540E\u53F0\u8FDB\u7A0B?",choices:[{title:"\u7EC8\u6B62\u6240\u6709\u540E\u53F0\u8FDB\u7A0B\u5E76\u9000\u51FA",value:"kill"},{title:"\u4FDD\u6301\u8FD0\u884C\u5E76\u9000\u51FA (\u8FDB\u7A0B\u5C06\u7EE7\u7EED\u5728\u540E\u53F0\u8FD0\u884C)",value:"keep"},{title:"\u53D6\u6D88\u9000\u51FA",value:"cancel"}]});if(n==="cancel")throw new Error("exit_cancelled");if(n==="kill"){console.log(),console.log(w.info(" \u6B63\u5728\u7EC8\u6B62\u540E\u53F0\u8FDB\u7A0B..."));let r=Bt.killAll(true);console.log(w.success(` \u2713 \u5DF2\u7EC8\u6B62 ${r.killed} \u4E2A\u8FDB\u7A0B`)),r.failed>0&&console.log(w.warning(` \u26A0 ${r.failed} \u4E2A\u8FDB\u7A0B\u7EC8\u6B62\u5931\u8D25`));}}}}async exitWithCleanup(e){if(this.exiting)return;this.exiting=true;let t=2e3,n=null,r=new Promise(o=>{n=setTimeout(o,t);});try{await Promise.race([this.cleanup(e.skipProcessCheck),r]);}catch(o){m.debug("DEBUG",`exitWithCleanup failed (${e.reason}): ${o?.message}`);}finally{n&&clearTimeout(n),process.exit(e.exitCode);}}buildInstructions(){let e=this.providerSettings.protocol||"openai",t=e==="openai-responses";return process.env.CLI_DEBUG==="1"&&m.debug("PROMPT",`Protocol: ${e}, useCodexStyle: ${t}`),(n,r)=>{let o=Os({workDir:this.workDir,language:"zh",useCodexStyle:t}),i=tt.getSkillsForPrompt();return i?`${o}
|
|
3962
3969
|
|
|
3963
3970
|
${i}
|
|
3964
3971
|
|
|
3965
3972
|
When users ask you to perform tasks, check if any skills can help. Use /skill-name to invoke a skill.`:o}}buildStaticInstructions(){let t=(this.providerSettings.protocol||"openai")==="openai-responses";return Os({workDir:this.workDir,language:"zh",useCodexStyle:t})}displayHeader(){console.clear(),console.log();let t=Gx(process.stdout.columns).split(`
|
|
3966
|
-
`);t.forEach((r,o)=>{if(!r.trim()){console.log();return}let i=o/Math.max(t.length-1,1),a;i<.33?a=Oe.cyan(r):i<.66?a=Oe.magenta(r):a=Oe.hex("#FF69B4")(r),console.log(a);}),console.log(),console.log(w.dim(" "+"\u2500".repeat(50))),console.log();let n=this.workDir.replace(process.env.HOME||"","~");console.log(w.dim(" Provider: ")+w.info(this.getProviderDisplayName())),console.log(w.dim(" Model: ")+w.info(this.model)),console.log(w.dim(" Dir: ")+w.info(n)),console.log(w.dim(" Tools: ")+w.info(this.tools.length.toString())),console.log(),console.log(w.dim(" Type ")+w.highlight("/help")+w.dim(" for commands \u2502 ")+w.highlight("ESC")+w.dim(" to interrupt \u2502 ")+w.error("Ctrl+C")+w.dim(" to exit")),console.log(),console.log(w.dim("\u2500".repeat(50)));}showProviderConfigurationGuide(){console.clear(),console.log(),console.log(Oe.yellow("\u2501".repeat(60))),console.log(),console.log(Oe.bold.yellow(" \u26A0\uFE0F \u6B22\u8FCE\u4F7F\u7528 Neox CLI")),console.log(),console.log(Oe.cyan(" \u{1F3AF} \u68C0\u6D4B\u5230\u60A8\u8FD8\u6CA1\u6709\u914D\u7F6E AI Provider")),console.log(Oe.dim(" \u4E3A\u4E86\u4F7F\u7528 Neox CLI\uFF0C\u60A8\u9700\u8981\u5148\u914D\u7F6E\u4E00\u4E2A AI Provider\uFF08\u5982 OpenAI\u3001Claude \u7B49\uFF09")),console.log(),console.log(Oe.bold.green(" \u{1F4A1} \u5FEB\u901F\u5F00\u59CB\uFF1A")),console.log(Oe.dim(" \u2022 \u60A8\u53EF\u4EE5\u4F7F\u7528 OpenAI\u3001Anthropic Claude\u3001Gemini \u7B49\u670D\u52A1")),console.log(Oe.dim(" \u2022 \u9700\u8981\u51C6\u5907 API Key\uFF08\u4ECE\u5BF9\u5E94\u670D\u52A1\u5546\u83B7\u53D6\uFF09")),console.log(Oe.dim(" \u2022 \u53EF\u4EE5\u4F7F\u7528\u4EE3\u7406\u5730\u5740\uFF08\u5982\u679C\u60A8\u4F7F\u7528\u7B2C\u4E09\u65B9\u4EE3\u7406\uFF09")),console.log(),console.log(Oe.bold.magenta(" \u{1F4CB} \u652F\u6301\u7684 Provider\uFF1A")),console.log(Oe.green(" OpenAI")+Oe.dim(" - GPT-4o, GPT-4, o3-mini \u7B49")),console.log(Oe.cyan(" Anthropic")+Oe.dim(" - Claude Sonnet 4.5, Claude Opus \u7B49")),console.log(Oe.yellow(" Gemini")+Oe.dim(" - Gemini 2.5 \u7CFB\u5217")),console.log(Oe.blue(" \u8C46\u5305 (Doubao)")+Oe.dim(" - \u706B\u5C71\u65B9\u821F\u6DF1\u5EA6\u601D\u8003\u6A21\u578B")),console.log(),console.log(Oe.yellow("\u2501".repeat(60))),console.log();}async runModernUI(){let e=Date.now(),t=i=>m.debug("BOOT",`runModernUI: ${i} (+${Date.now()-e}ms)`);if(t("enter"),process.env.CLI_DEBUG&&(m.info("CLI","=== runModernUI() starting ==="),hn.logStdinState("runModernUI.start")),NI()){this.showProviderConfigurationGuide(),await $I(),this.userConfig=He(),this.providerStore=new nt(this.userConfig);let i=this.resolveProvider(void 0);this.providerSettings=i,this.providerId=i.id,this.provider=i.protocol;let a=this.providerStore.resolveModel(i.id);if(!a)throw new Error(`Provider "${i.name}" does not have any models configured. Use /model add to configure one.`);this.model=a,this.providerStore.setLastSelectedModel(i.id,this.model),this.refreshProviderSettings();}let n=this.workDir.replace(process.env.HOME||"","~");t("initializeSession..."),await this.initializeSession(),t("initializeSession done"),t("creating InkUIAdapter..."),m.info("CLI","Using Ink UI"),this.uiController=new _u({version:Jd,provider:this.getProviderDisplayName(),model:this.model,workDir:n,commandHints:Vd,getCompletions:i=>this.getCompletionSuggestions(i),memory:void 0,getPendingMessages:()=>[]});let r=this.getCompressionMode(),o=this.getCompactionThreshold();if(this.uiController.setCompressionMode(r),this.uiController.setCompactionThreshold(o),t_(this.uiController),LT({onAdd:(i,a)=>this.uiController.addBackgroundTask(i,a),onUpdate:(i,a)=>this.uiController.updateBackgroundTask(i,a),onUpdateByPid:(i,a)=>this.uiController.updateBackgroundTaskByPid(i,a)}),this.currentRunMode==="cooperate"){let a=new Lt(void 0,"cooperate").getEnabledWorkerModels().map(l=>this.getModelShortName(l.model));this.uiController.updateCooperateStats({models:a.map(l=>({shortName:l,status:"idle"})),totalInputTokens:0,totalOutputTokens:0});}this.uiController.setRunMode(this.currentRunMode),this.sdkClient?.setCompressionMode("cli",r).catch(()=>{}),this.updateContextWindowDisplay(),m.debug("CLI","Initialized context settings from userConfig",{compressionMode:r,thresholdPercent:o}),process.env.CLI_DEBUG&&(m.debug("CLI","Ink UI adapter created, starting UI..."),hn.logStdinState("runModernUI.beforeStart")),t("uiController.start()..."),cb(true);try{bp=!0,this.uiController.start({onSubmit:async(i,a)=>{let l=a?.map(c=>({mediaType:c.mediaType,data:c.data,name:c.name||"image"}));await this.handleUserInput(i,l,"local");},onExit:()=>{m.debug("DEBUG","onExit callback invoked"),this.exitWithCleanup({skipProcessCheck:!0,exitCode:0,reason:"ui-exit"});},onInterrupt:()=>{this.isTaskRunning=!1,this.abortCurrentRunMode(),this.uiController&&(this.uiController.stopTaskTimer(),this.uiController.finalizeStreamingState?.(),this.uiController.resetStreamingState(),this.uiController.setRunning(!1),this.uiController.updateStatus("Ready","complete"),this.uiController.flushRenderScheduler(),this.uiController.addInfo(Oe.red("\u26A0\uFE0F Task interrupted by user"))),process.env.CLI_DEBUG==="1"&&m.debug("INTERRUPT","Task interrupted, isTaskRunning set to false"),hn.stop();},isTaskRunning:()=>this.isTaskRunning,onToggleThinking:i=>{this.thinkingMode=i?"enabled":"disabled",process.env.CLI_DEBUG==="1"&&console.log(`[THINKING] Toggled to: ${this.thinkingMode}`);}});}catch(i){throw cb(false),bp=false,i}return t("UI started"),process.env.CLI_DEBUG&&(m.info("CLI","=== runModernUI() UI started, entering event loop ==="),hn.logStdinState("runModernUI.afterStart")),t("startRemoteServer..."),await this.startRemoteServer(),t("ready \u2713"),new Promise(()=>{})}getRuntimeEventContext(){return {uiController:this.uiController,getUiController:()=>this.uiController,lastToolCallArgs:this.lastToolCallArgs,toolIdToName:this.toolIdToName,toolIdToArgs:this.toolIdToArgs,pushTokenStats:(e,t,n,r)=>this.pushTokenStats(e,t,n,r),getRuntimeTokens:()=>({input:this.runtimeInputTokens,output:this.runtimeOutputTokens}),setRuntimeTokens:(e,t)=>{this.runtimeInputTokens=e,this.runtimeOutputTokens=t;},getStreamingTokenCount:()=>this.streamingTokenCount,setStreamingTokenCount:e=>{this.streamingTokenCount=e;},provider:this.getProviderDisplayName(),model:this.model,sessionId:this.currentSession?.sessionId,tokenUsage:this.platformServices.tokenUsage}}async handleUserInput(e,t,n="local"){if(process.env.CLI_DEBUG==="1"&&(m.debug("INPUT","========================================"),m.debug("INPUT","=== handleUserInput ENTRY ==="),m.debug("INPUT",` rawInput: "${e?.substring(0,50)}..."`),m.debug("INPUT",` uiController exists: ${!!this.uiController}`),m.debug("INPUT",` isTaskRunning: ${this.isTaskRunning}`),m.debug("INPUT",` stdin.isPaused: ${process.stdin.isPaused?.()}`),m.debug("INPUT",` stdin.destroyed: ${process.stdin.destroyed}`),m.debug("INPUT",` stdin.readable: ${process.stdin.readable}`),hn.logStdinState("handleUserInput.entry")),this.isTaskRunning){if(n==="remote"){m.debug("INPUT",`\u{1F525} Remote message while task running, enqueueing: "${e?.substring(0,50)}"`),this.enqueueExecutorRun(e,n);return}let l=e?e.trim():"";if(l){process.env.CLI_DEBUG&&m.debug("INPUT","Task running: injecting user message",{message:l.substring(0,50)}),this.sdkClient?.injectMessage("cli",l).catch(()=>{});let c=0;this.uiController?.addUserMessage(l,void 0,n),process.env.CLI_DEBUG&&c>0;return}}let r=e?e.trim():"";if(r=r.replace(/\[image:[^\]]+\]/g,"").trim(),!r&&t&&t.length>0&&(r="\u8BF7\u5206\u6790\u8FD9\u5F20\u56FE\u7247"),!r&&(!t||t.length===0)){process.env.CLI_DEBUG==="1"&&m.debug("INPUT","Empty input received, ignoring");return}if(r.startsWith("/")){await this.handleCommand(r);return}if(!this.uiController)return;this.sessionRequests++,this.uiController.resetStreamingState(),this.runtimeInputTokens=0,this.runtimeOutputTokens=0,this.streamingTokenCount=0,this.uiController.startTaskTimer();let o=this.pendingAttachments.length?[...this.pendingAttachments]:[];if(o.length>0&&(this.pendingAttachments=[]),t&&t.length>0){for(let l of t)try{let c;if(l.mediaType&&l.data){let u=l.mediaType,d=l.data;c=`data:${u};base64,${d}`;}else if(l.path){let u=wt.readFileSync(l.path),d=Ie.extname(l.path).toLowerCase();c=`data:${Yd[d]||"image/png"};base64,${u.toString("base64")}`;}else throw new Error("Invalid image format: missing path or data");o.push({type:"image",data:c,path:l.path,name:l.name});}catch(c){this.uiController.addInfo(`[x] Failed to read image: ${l.name}`,c?.message);}o.some(l=>l.type==="image")&&this.uiController.addInfo(`[i] ${t.length} image(s) attached`);}let i=o.length>0||this.interactionMode!=="agent"?{mode:this.interactionMode,attachments:o.length>0?o:void 0}:void 0;process.env.CLI_DEBUG==="1"&&(m.debug("INPUT","=== handleUserInput calling runTask ==="),hn.logStdinState("handleUserInput.beforeRunTask"));let a=t?.map(l=>({data:"",mediaType:"image/png",path:l.path,name:l.name}));process.env.CLI_DEBUG==="1"&&m.debug("MAIN","Calling addUserMessage",{userInput:r,source:n}),this.uiController.addUserMessage(r,a,n),m.debug("MAIN",`\u{1F525} addUserMessage called for source=${n}, text="${r?.substring(0,50)}"`),this.uiController.startSessionTimer(),this.isTaskRunning=true;try{if(!this.remoteAdapter)throw new Error("Server not connected. Cannot process request.");await this.remoteAdapter.chat({sessionId:"cli",prompt:r,mode:this.currentRunMode,attachments:i?.attachments,providerId:this.providerId,modelName:this.model}),process.env.CLI_DEBUG==="1"&&(m.debug("INPUT","=== handleUserInput runTask completed successfully ==="),hn.logStdinState("handleUserInput.afterRunTask.success"));}catch(l){if(l?.code==="missing_provider"){let u="No provider configured. Use /provider add to configure one.";this.uiController?(this.uiController.updateStatus(u,"error"),this.uiController.addInfo(u)):Q(w.warning(` \u26A0 ${u}`));return}let c=l?.message||String(l)||"Unknown error";m.error("Agent","Task execution failed",{error:c,stack:l?.stack,userInput:r.substring(0,200)}),process.env.CLI_DEBUG==="1"&&hn.logStdinState("handleUserInput.afterRunTask.error"),this.uiController.updateStatus(`Error: ${c}`,"error"),this.uiController.addInfo(`Error: ${c}`);}finally{this.isTaskRunning=false,process.env.CLI_DEBUG==="1"&&(m.debug("INPUT","=== handleUserInput finally block ==="),m.debug("INPUT",` stdin.isPaused: ${process.stdin.isPaused?.()}`),m.debug("INPUT",` stdin.destroyed: ${process.stdin.destroyed}`),hn.logStdinState("handleUserInput.finally")),this.uiController.stopTaskTimer(),process.env.CLI_DEBUG==="1"&&m.debug("INPUT","=== handleUserInput END - input should be available now ===");let l=[];if(l.length>0){let c=l.map(u=>u.text).join(`
|
|
3973
|
+
`);t.forEach((r,o)=>{if(!r.trim()){console.log();return}let i=o/Math.max(t.length-1,1),a;i<.33?a=Oe.cyan(r):i<.66?a=Oe.magenta(r):a=Oe.hex("#FF69B4")(r),console.log(a);}),console.log(),console.log(w.dim(" "+"\u2500".repeat(50))),console.log();let n=this.workDir.replace(process.env.HOME||"","~");console.log(w.dim(" Provider: ")+w.info(this.getProviderDisplayName())),console.log(w.dim(" Model: ")+w.info(this.model)),console.log(w.dim(" Dir: ")+w.info(n)),console.log(w.dim(" Tools: ")+w.info(this.tools.length.toString())),console.log(),console.log(w.dim(" Type ")+w.highlight("/help")+w.dim(" for commands \u2502 ")+w.highlight("ESC")+w.dim(" to interrupt \u2502 ")+w.error("Ctrl+C")+w.dim(" to exit")),console.log(),console.log(w.dim("\u2500".repeat(50)));}showProviderConfigurationGuide(){console.clear(),console.log(),console.log(Oe.yellow("\u2501".repeat(60))),console.log(),console.log(Oe.bold.yellow(" \u26A0\uFE0F \u6B22\u8FCE\u4F7F\u7528 Neox CLI")),console.log(),console.log(Oe.cyan(" \u{1F3AF} \u68C0\u6D4B\u5230\u60A8\u8FD8\u6CA1\u6709\u914D\u7F6E AI Provider")),console.log(Oe.dim(" \u4E3A\u4E86\u4F7F\u7528 Neox CLI\uFF0C\u60A8\u9700\u8981\u5148\u914D\u7F6E\u4E00\u4E2A AI Provider\uFF08\u5982 OpenAI\u3001Claude \u7B49\uFF09")),console.log(),console.log(Oe.bold.green(" \u{1F4A1} \u5FEB\u901F\u5F00\u59CB\uFF1A")),console.log(Oe.dim(" \u2022 \u60A8\u53EF\u4EE5\u4F7F\u7528 OpenAI\u3001Anthropic Claude\u3001Gemini \u7B49\u670D\u52A1")),console.log(Oe.dim(" \u2022 \u9700\u8981\u51C6\u5907 API Key\uFF08\u4ECE\u5BF9\u5E94\u670D\u52A1\u5546\u83B7\u53D6\uFF09")),console.log(Oe.dim(" \u2022 \u53EF\u4EE5\u4F7F\u7528\u4EE3\u7406\u5730\u5740\uFF08\u5982\u679C\u60A8\u4F7F\u7528\u7B2C\u4E09\u65B9\u4EE3\u7406\uFF09")),console.log(),console.log(Oe.bold.magenta(" \u{1F4CB} \u652F\u6301\u7684 Provider\uFF1A")),console.log(Oe.green(" OpenAI")+Oe.dim(" - GPT-4o, GPT-4, o3-mini \u7B49")),console.log(Oe.cyan(" Anthropic")+Oe.dim(" - Claude Sonnet 4.5, Claude Opus \u7B49")),console.log(Oe.yellow(" Gemini")+Oe.dim(" - Gemini 2.5 \u7CFB\u5217")),console.log(Oe.blue(" \u8C46\u5305 (Doubao)")+Oe.dim(" - \u706B\u5C71\u65B9\u821F\u6DF1\u5EA6\u601D\u8003\u6A21\u578B")),console.log(),console.log(Oe.yellow("\u2501".repeat(60))),console.log();}async runModernUI(){let e=Date.now(),t=i=>m.debug("BOOT",`runModernUI: ${i} (+${Date.now()-e}ms)`);if(t("enter"),process.env.CLI_DEBUG&&(m.info("CLI","=== runModernUI() starting ==="),hn.logStdinState("runModernUI.start")),NI()){this.showProviderConfigurationGuide(),await $I(),this.userConfig=He(),this.providerStore=new rt(this.userConfig);let i=this.resolveProvider(void 0);this.providerSettings=i,this.providerId=i.id,this.provider=i.protocol;let a=this.providerStore.resolveModel(i.id);if(!a)throw new Error(`Provider "${i.name}" does not have any models configured. Use /model add to configure one.`);this.model=a,this.providerStore.setLastSelectedModel(i.id,this.model),this.refreshProviderSettings();}let n=this.workDir.replace(process.env.HOME||"","~");t("initializeSession..."),await this.initializeSession(),t("initializeSession done"),t("creating InkUIAdapter..."),m.info("CLI","Using Ink UI"),this.uiController=new _u({version:Jd,provider:this.getProviderDisplayName(),model:this.model,workDir:n,commandHints:Vd,getCompletions:i=>this.getCompletionSuggestions(i),memory:void 0,getPendingMessages:()=>[]});let r=this.getCompressionMode(),o=this.getCompactionThreshold();if(this.uiController.setCompressionMode(r),this.uiController.setCompactionThreshold(o),t_(this.uiController),LT({onAdd:(i,a)=>this.uiController.addBackgroundTask(i,a),onUpdate:(i,a)=>this.uiController.updateBackgroundTask(i,a),onUpdateByPid:(i,a)=>this.uiController.updateBackgroundTaskByPid(i,a)}),this.currentRunMode==="cooperate"){let a=new Lt(void 0,"cooperate").getEnabledWorkerModels().map(l=>this.getModelShortName(l.model));this.uiController.updateCooperateStats({models:a.map(l=>({shortName:l,status:"idle"})),totalInputTokens:0,totalOutputTokens:0});}this.uiController.setRunMode(this.currentRunMode),this.sdkClient?.setCompressionMode("cli",r).catch(()=>{}),this.updateContextWindowDisplay(),m.debug("CLI","Initialized context settings from userConfig",{compressionMode:r,thresholdPercent:o}),process.env.CLI_DEBUG&&(m.debug("CLI","Ink UI adapter created, starting UI..."),hn.logStdinState("runModernUI.beforeStart")),t("uiController.start()..."),cb(true);try{bp=!0,this.uiController.start({onSubmit:async(i,a)=>{let l=a?.map(c=>({mediaType:c.mediaType,data:c.data,name:c.name||"image"}));await this.handleUserInput(i,l,"local");},onExit:()=>{m.debug("DEBUG","onExit callback invoked"),this.exitWithCleanup({skipProcessCheck:!0,exitCode:0,reason:"ui-exit"});},onInterrupt:()=>{this.isTaskRunning=!1,this.abortCurrentRunMode(),this.uiController&&(this.uiController.stopTaskTimer(),this.uiController.finalizeStreamingState?.(),this.uiController.resetStreamingState(),this.uiController.setRunning(!1),this.uiController.updateStatus("Ready","complete"),this.uiController.flushRenderScheduler(),this.uiController.addInfo(Oe.red("\u26A0\uFE0F Task interrupted by user"))),process.env.CLI_DEBUG==="1"&&m.debug("INTERRUPT","Task interrupted, isTaskRunning set to false"),hn.stop();},isTaskRunning:()=>this.isTaskRunning,onToggleThinking:i=>{this.thinkingMode=i?"enabled":"disabled",process.env.CLI_DEBUG==="1"&&console.log(`[THINKING] Toggled to: ${this.thinkingMode}`);}});}catch(i){throw cb(false),bp=false,i}return t("UI started"),process.env.CLI_DEBUG&&(m.info("CLI","=== runModernUI() UI started, entering event loop ==="),hn.logStdinState("runModernUI.afterStart")),t("startRemoteServer..."),await this.startRemoteServer(),t("ready \u2713"),new Promise(()=>{})}getRuntimeEventContext(){return {uiController:this.uiController,getUiController:()=>this.uiController,lastToolCallArgs:this.lastToolCallArgs,toolIdToName:this.toolIdToName,toolIdToArgs:this.toolIdToArgs,pushTokenStats:(e,t,n,r)=>this.pushTokenStats(e,t,n,r),getRuntimeTokens:()=>({input:this.runtimeInputTokens,output:this.runtimeOutputTokens}),setRuntimeTokens:(e,t)=>{this.runtimeInputTokens=e,this.runtimeOutputTokens=t;},getStreamingTokenCount:()=>this.streamingTokenCount,setStreamingTokenCount:e=>{this.streamingTokenCount=e;},provider:this.getProviderDisplayName(),model:this.model,sessionId:this.currentSession?.sessionId,tokenUsage:this.platformServices.tokenUsage}}async handleUserInput(e,t,n="local"){if(process.env.CLI_DEBUG==="1"&&(m.debug("INPUT","========================================"),m.debug("INPUT","=== handleUserInput ENTRY ==="),m.debug("INPUT",` rawInput: "${e?.substring(0,50)}..."`),m.debug("INPUT",` uiController exists: ${!!this.uiController}`),m.debug("INPUT",` isTaskRunning: ${this.isTaskRunning}`),m.debug("INPUT",` stdin.isPaused: ${process.stdin.isPaused?.()}`),m.debug("INPUT",` stdin.destroyed: ${process.stdin.destroyed}`),m.debug("INPUT",` stdin.readable: ${process.stdin.readable}`),hn.logStdinState("handleUserInput.entry")),this.isTaskRunning){if(n==="remote"){m.debug("INPUT",`\u{1F525} Remote message while task running, enqueueing: "${e?.substring(0,50)}"`),this.enqueueExecutorRun(e,n);return}let l=e?e.trim():"";if(l){process.env.CLI_DEBUG&&m.debug("INPUT","Task running: injecting user message",{message:l.substring(0,50)}),this.sdkClient?.injectMessage("cli",l).catch(()=>{});let c=0;this.uiController?.addUserMessage(l,void 0,n),process.env.CLI_DEBUG&&c>0;return}}let r=e?e.trim():"";if(r=r.replace(/\[image:[^\]]+\]/g,"").trim(),!r&&t&&t.length>0&&(r="\u8BF7\u5206\u6790\u8FD9\u5F20\u56FE\u7247"),!r&&(!t||t.length===0)){process.env.CLI_DEBUG==="1"&&m.debug("INPUT","Empty input received, ignoring");return}if(r.startsWith("/")){await this.handleCommand(r);return}if(!this.uiController)return;this.sessionRequests++,this.uiController.resetStreamingState(),this.runtimeInputTokens=0,this.runtimeOutputTokens=0,this.streamingTokenCount=0,this.uiController.startTaskTimer();let o=this.pendingAttachments.length?[...this.pendingAttachments]:[];if(o.length>0&&(this.pendingAttachments=[]),t&&t.length>0){for(let l of t)try{let c;if(l.mediaType&&l.data){let u=l.mediaType,d=l.data;c=`data:${u};base64,${d}`;}else if(l.path){let u=wt.readFileSync(l.path),d=Ie.extname(l.path).toLowerCase();c=`data:${Yd[d]||"image/png"};base64,${u.toString("base64")}`;}else throw new Error("Invalid image format: missing path or data");o.push({type:"image",data:c,path:l.path,name:l.name});}catch(c){this.uiController.addInfo(`[x] Failed to read image: ${l.name}`,c?.message);}o.some(l=>l.type==="image")&&this.uiController.addInfo(`[i] ${t.length} image(s) attached`);}let i=o.length>0||this.interactionMode!=="agent"?{mode:this.interactionMode,attachments:o.length>0?o:void 0}:void 0;process.env.CLI_DEBUG==="1"&&(m.debug("INPUT","=== handleUserInput calling runTask ==="),hn.logStdinState("handleUserInput.beforeRunTask"));let a=t?.map(l=>({data:"",mediaType:"image/png",path:l.path,name:l.name}));process.env.CLI_DEBUG==="1"&&m.debug("MAIN","Calling addUserMessage",{userInput:r,source:n}),this.uiController.addUserMessage(r,a,n),m.debug("MAIN",`\u{1F525} addUserMessage called for source=${n}, text="${r?.substring(0,50)}"`),this.uiController.startSessionTimer(),this.isTaskRunning=true;try{if(!this.remoteAdapter)throw new Error("Server not connected. Cannot process request.");await this.remoteAdapter.chat({sessionId:"cli",prompt:r,mode:this.currentRunMode,attachments:i?.attachments,providerId:this.providerId,modelName:this.model}),process.env.CLI_DEBUG==="1"&&(m.debug("INPUT","=== handleUserInput runTask completed successfully ==="),hn.logStdinState("handleUserInput.afterRunTask.success"));}catch(l){if(l?.code==="missing_provider"){let u="No provider configured. Use /provider add to configure one.";this.uiController?(this.uiController.updateStatus(u,"error"),this.uiController.addInfo(u)):Q(w.warning(` \u26A0 ${u}`));return}let c=l?.message||String(l)||"Unknown error";m.error("Agent","Task execution failed",{error:c,stack:l?.stack,userInput:r.substring(0,200)}),process.env.CLI_DEBUG==="1"&&hn.logStdinState("handleUserInput.afterRunTask.error"),this.uiController.updateStatus(`Error: ${c}`,"error"),this.uiController.addInfo(`Error: ${c}`);}finally{this.isTaskRunning=false,process.env.CLI_DEBUG==="1"&&(m.debug("INPUT","=== handleUserInput finally block ==="),m.debug("INPUT",` stdin.isPaused: ${process.stdin.isPaused?.()}`),m.debug("INPUT",` stdin.destroyed: ${process.stdin.destroyed}`),hn.logStdinState("handleUserInput.finally")),this.uiController.stopTaskTimer(),process.env.CLI_DEBUG==="1"&&m.debug("INPUT","=== handleUserInput END - input should be available now ===");let l=[];if(l.length>0){let c=l.map(u=>u.text).join(`
|
|
3967
3974
|
|
|
3968
|
-
`);process.env.CLI_DEBUG&&m.debug("INPUT",`Processing ${l.length} queued messages: "${c.substring(0,50)}..."`),setImmediate(()=>{this.handleUserInput(c);});}}}maybeTriggerCompletionAlerts(e){if(e.interrupted)return;let t=hl(this.userConfig);!t.soundEnabled&&!t.notifyEnabled||h_(t,{language:this.userConfig.language,summary:e});}async runInteractive(){await this.showOnboardingIfNeeded();let e=fb();return e.debug&&m.info("CLI","Experimental features",e),e.eventLoopMonitoring&&(hb({checkInterval:1e3,warnThreshold:5e3,criticalThreshold:1e4,autoRecover:true}).onRecovery(n=>{m.error("CLI","\u{1F6A8} Event loop critical delay detected, attempting recovery",{stats:n});}),m.info("CLI","\u2713 Event Loop monitoring enabled")),e.useInputWorker&&m.debug("CLI","InputWorker skipped in Ink UI mode (Ink has own stdin handling)"),this.runModernUI()}async handleCommand(e){let t=e.trim();if(!t)return;let n=t.toLowerCase();if(t.startsWith("/")){let a=t.indexOf(" "),l=a===-1?t.slice(1):t.slice(1,a),c=
|
|
3975
|
+
`);process.env.CLI_DEBUG&&m.debug("INPUT",`Processing ${l.length} queued messages: "${c.substring(0,50)}..."`),setImmediate(()=>{this.handleUserInput(c);});}}}maybeTriggerCompletionAlerts(e){if(e.interrupted)return;let t=hl(this.userConfig);!t.soundEnabled&&!t.notifyEnabled||h_(t,{language:this.userConfig.language,summary:e});}async runInteractive(){await this.showOnboardingIfNeeded();let e=fb();return e.debug&&m.info("CLI","Experimental features",e),e.eventLoopMonitoring&&(hb({checkInterval:1e3,warnThreshold:5e3,criticalThreshold:1e4,autoRecover:true}).onRecovery(n=>{m.error("CLI","\u{1F6A8} Event loop critical delay detected, attempting recovery",{stats:n});}),m.info("CLI","\u2713 Event Loop monitoring enabled")),e.useInputWorker&&m.debug("CLI","InputWorker skipped in Ink UI mode (Ink has own stdin handling)"),this.runModernUI()}async handleCommand(e){let t=e.trim();if(!t)return;let n=t.toLowerCase();if(t.startsWith("/")){let a=t.indexOf(" "),l=a===-1?t.slice(1):t.slice(1,a),c=tt.find(l);if(c){let u=a===-1?"":t.slice(a+1).trim();m.info("CLI",`Executing skill: ${c.id}`,{args:u});let d=await Ly.route(t,{workDir:this.workDir,args:u,rawInput:t});d&&d.success&&d.output?await this.handleUserInput(d.output,void 0,"local"):d&&!d.success&&this.uiController&&this.uiController.addError(`Skill error: ${d.error}`);return}}if(n.startsWith("/thinking")){await $_(this.getThinkingCommandContext(),t);return}let[r,...o]=t.split(/\s+/);switch(r.toLowerCase()){case "/exit":case "/quit":case "exit":case "quit":console.log(w.info(`
|
|
3969
3976
|
\u{1F44B} Goodbye!`)),this.exitWithCleanup({skipProcessCheck:false,exitCode:0,reason:"command"});break;case "/help":if(this.uiController)e:for(;;)try{let l=await this.uiController.promptSelect({message:"Select action",choices:y_(),initialValue:this.helpMenuLastSelection});if(l===null||l==="exit")break e;switch(l&&(this.helpMenuLastSelection=l),await new Promise(c=>setTimeout(c,50)),l){case "provider":await this.handleCommand("/provider");break;case "model":await this.handleCommand("/model");break;case "session":await this.handleCommand("/sessions");break;case "workspace":await this.handleCommand("/workspace");break;case "mode":await this.handleCommand("/mode");break;case "run":await this.handleCommand("/run");break;case "runconfig":await this.handleCommand("/runconfig");break;case "sandbox":await this.handleCommand("/sandbox");break;case "thinking":await this.handleCommand("/thinking");break;case "approval":await this.handleCommand("/approval");break;case "notify":await this.handleCommand("/notify");break;case "index":await this.handleCommand("/index");break;case "context":await this.handleCommand("/context");break;case "memory":await this.handleCommand("/memory");break;case "remote":await this.handleCommand("/remote");break;case "statistic":await this.handleCommand("/statistic");break;case "help-text":let c=[];tp(u=>{c.push(u);}),this.logInfo("Neox CLI Help",c.join(`
|
|
3970
3977
|
`));break}break e}catch(l){if(l.message!=="cancelled"&&l.message!=="User cancelled"){let c=[];tp(u=>c.push(u)),this.logInfo("Neox CLI Help",c.join(`
|
|
3971
3978
|
`));}break e}else tp();break;case "/schema-example":await c_(this.workDir,o[0]);break;case "/mode":{let l=(o[0]||"").toLowerCase();if(l&&l!=="status"){if(l!=="agent"&&l!=="ask"){this.logInfo("\u65E0\u6548\u7684\u6A21\u5F0F","\u53EF\u7528\u6A21\u5F0F: agent, ask");break}if(this.interactionMode===l){this.logInfo("\u6A21\u5F0F\u672A\u53D8\u5316",`\u4ECD\u4E3A ${l}`);break}this.interactionMode=l,this.logInfo("\u4EA4\u4E92\u6A21\u5F0F\u5DF2\u66F4\u65B0",l==="ask"?"\u5C06\u4EE5\u66F4\u5BF9\u8BDD\u7684\u65B9\u5F0F\u56DE\u7B54\uFF0C\u5E76\u51CF\u5C11\u5DE5\u5177\u8C03\u7528\u3002":"\u6062\u590D\u9ED8\u8BA4\u7684 Agent \u6A21\u5F0F\uFF0C\u53EF\u81EA\u52A8\u8C03\u7528\u5DE5\u5177\u3002");break}try{let c=await this.promptSelect("Select mode",[{label:"Agent",value:"agent",description:"\u667A\u80FD\u4F53\u81EA\u52A8\u4F7F\u7528\u5DE5\u5177\uFF0C\u9002\u5408\u4EE3\u7801\u4EFB\u52A1"},{label:"Ask",value:"ask",description:"\u4EC5\u56DE\u7B54\u95EE\u9898\uFF0C\u5C3D\u91CF\u907F\u514D\u5DE5\u5177\u8C03\u7528"}],this.interactionMode);this.interactionMode!==c?(this.interactionMode=c,this.logInfo("\u4EA4\u4E92\u6A21\u5F0F\u5DF2\u66F4\u65B0",c==="ask"?"\u5C06\u4EE5\u66F4\u5BF9\u8BDD\u7684\u65B9\u5F0F\u56DE\u7B54\uFF0C\u5E76\u51CF\u5C11\u5DE5\u5177\u8C03\u7528\u3002":"\u6062\u590D\u9ED8\u8BA4\u7684 Agent \u6A21\u5F0F\uFF0C\u53EF\u81EA\u52A8\u8C03\u7528\u5DE5\u5177\u3002")):this.logInfo("\u6A21\u5F0F",`\u5F53\u524D\u6A21\u5F0F: ${c}`);}catch(c){c.message!=="cancelled"&&this.logInfo("Mode selection failed",c.message);}break}case "/run":{let c=(o[0]||"").toLowerCase();if(c==="status"){let u=this.getCurrentRunMode(),d={single:"[S]",assistant:"[A]",cooperate:"[C]",network:"[N]"},p=Jn.getModeDescription(u);this.logInfo(`\u5F53\u524D\u8FD0\u884C\u6A21\u5F0F: ${d[u]} ${u}`,p);break}if(c){if(!Jn.isValidMode(c)){this.logInfo("\u65E0\u6548\u7684\u8FD0\u884C\u6A21\u5F0F","\u53EF\u7528\u6A21\u5F0F: single, assistant, cooperate, network");break}this.setRunMode(c);let u=Jn.getModeDescription(c),d={single:"[S]",assistant:"[A]",cooperate:"[C]",network:"[N]"};this.logInfo(`${d[c]} \u5DF2\u5207\u6362\u5230 ${c} \u6A21\u5F0F`,u);break}try{let u=await this.promptSelect("\u9009\u62E9\u8FD0\u884C\u6A21\u5F0F",[{label:"[S] \u5355\u673A\u6A21\u5F0F",value:"single",description:"\u65E5\u5E38\u5F00\u53D1\uFF0C\u5FEB\u901F\u8FED\u4EE3"},{label:"[A] \u52A9\u7406\u6A21\u5F0F",value:"assistant",description:"AI \u52A9\u7406\uFF0C\u8F7B\u91CF supervisor + spawn"},{label:"[C] \u534F\u540C\u6A21\u5F0F",value:"cooperate",description:"\u9759\u6001 DAG + CCB \u8BC4\u5BA1\u6D41\u7A0B"},{label:"[N] \u81EA\u7EC4\u7F51\u6A21\u5F0F",value:"network",description:"Agent \u81EA\u4E3B\u7EC4\u7F51\uFF0C\u52A8\u6001\u534F\u5546 (\u5F00\u53D1\u4E2D)"}],this.getCurrentRunMode());if(Jn.isValidMode(u)){this.setRunMode(u);let d={single:"[S]",assistant:"[A]",cooperate:"[C]",network:"[N]"},p=Jn.getModeDescription(u);this.logInfo(`${d[u]} \u5DF2\u5207\u6362\u5230 ${u} \u6A21\u5F0F`,p);}}catch(u){u.message!=="cancelled"&&this.logInfo("\u6A21\u5F0F\u9009\u62E9\u5931\u8D25",u.message);}break}case "/runconfig":{let l=(o[0]||"").toLowerCase();await cI(this.getRunConfigCommandContext(),l||void 0);break}case "/attach":{if(!o.length){this.logInfo("\u7528\u6CD5","/attach <\u56FE\u7247\u8DEF\u5F84\u6216 URL>");break}if(o[0].toLowerCase()==="clear"){this.clearPendingAttachments();break}await this.addPendingAttachment(o.join(" "));break}case "/attachments":{if(!o.length||o[0].toLowerCase()==="list"){this.listPendingAttachments();break}if(o[0].toLowerCase()==="clear"){this.clearPendingAttachments();break}if(o[0].toLowerCase()==="remove"){let l=parseInt(o[1],10);if(isNaN(l)||l<1){this.logInfo("\u7528\u6CD5","/attachments remove <\u7F16\u53F7>");break}this.removePendingAttachment(l-1);break}this.logInfo("\u7528\u6CD5","/attachments [list|clear|remove <\u7F16\u53F7>]");break}case "/approval":await B_(this.getConfigCommandContext(),o[0]);break;case "/websearch":await this.handleWebSearchCommand(o);break;case "/notify":await U_(this.getNotifyCommandContext(),o[0]);break;case "/mcp":await hI(this.getMcpCommandContext(),o[0]);break;case "/skills":await this.showSkillsScreen();break;case "/language":case "/lang":await this.showLanguageMenu();break;case "/update":let{handleUpdateCommand:a}=await Promise.resolve().then(()=>(fp(),sb));await a();break;case "/remote":await sI(this.getRemoteCommandContext(),o[0]);break;case "/supervisor":await oI(this.getSupervisorCommandContext(),o[0]);break;case "/provider":{let l=(o[0]||"").toLowerCase(),c=this.getProviderCommandContext();switch(l){case "":await Xy(c);break;case "list":yl(c);break;case "add":await ip(c);break;case "edit":case "update":await ap(c,o[1]);break;case "remove":case "delete":await Vy(c,o[1]);break;case "use":await op(c,o[1]);break;case "default":await Yy(c,o[1]);break;default:await op(c,l);break}break}case "/sandbox":{let l=(o[0]||"").toLowerCase(),c=ph();if(l==="on"||l==="enable"){ni(true),this.sdkClient?.setSandboxMode("cli",true).catch(()=>{}),this.logInfo("Sandbox enabled","\u6C99\u7BB1\u6A21\u5F0F\u5DF2\u542F\u7528\uFF0C\u4EC5\u5141\u8BB8\u5B89\u5168\u547D\u4EE4");break}if(l==="off"||l==="disable"){ni(false),this.sdkClient?.setSandboxMode("cli",false).catch(()=>{}),this.logInfo("Sandbox disabled","\u5168\u529F\u80FD\u6A21\u5F0F\uFF0C\u6240\u6709\u547D\u4EE4\u53EF\u6267\u884C");break}try{let d=await this.promptSelect("Sandbox mode",[{label:"Off (Full mode)",value:"off",description:"\u6240\u6709 shell \u547D\u4EE4\u90FD\u53EF\u4EE5\u6267\u884C"},{label:"On (Restricted)",value:"on",description:"\u4EC5\u5141\u8BB8 ls, pwd, cat, grep \u7B49\u5B89\u5168\u547D\u4EE4"}],c?"on":"off")==="on";d!==c?(ni(d),this.sdkClient?.setSandboxMode("cli",d).catch(()=>{}),this.logInfo(d?"Sandbox enabled":"Sandbox disabled",d?"\u6C99\u7BB1\u6A21\u5F0F\u5DF2\u542F\u7528\uFF0C\u4EC5\u5141\u8BB8\u5B89\u5168\u547D\u4EE4":"\u5168\u529F\u80FD\u6A21\u5F0F\uFF0C\u6240\u6709\u547D\u4EE4\u53EF\u6267\u884C")):this.logInfo("Sandbox",`\u5F53\u524D\u72B6\u6001: ${d?"\u5DF2\u542F\u7528":"\u5DF2\u7981\u7528"}`);}catch(u){u.message!=="cancelled"&&this.logInfo("Sandbox selection failed",u.message);}break}case "/tts":{let l=(o[0]||"").toLowerCase(),c=He(),u=c.tts?.enabled??false;if(l==="on"||l==="enable"){let d={...c,tts:{...c.tts,enabled:true,provider:c.tts?.provider||"edge"}};Me(d),this.sdkClient?.setTTSEnabled?.(true),this.logInfo("TTS enabled","TTS \u8BED\u97F3\u8F93\u51FA\u5DF2\u542F\u7528 (Edge TTS)");break}if(l==="off"||l==="disable"){let d={...c,tts:{...c.tts,enabled:false}};Me(d),this.sdkClient?.setTTSEnabled?.(false),this.logInfo("TTS disabled","TTS \u8BED\u97F3\u8F93\u51FA\u5DF2\u7981\u7528");break}try{let d=await this.promptSelect("TTS Voice Output",[{label:"Off",value:"off",description:"\u7981\u7528\u8BED\u97F3\u8F93\u51FA"},{label:"Edge TTS (Free)",value:"edge",description:"\u5FAE\u8F6F Edge \u514D\u8D39 TTS\uFF0C\u4E2D\u6587\u97F3\u8D28\u597D"},{label:"OpenAI TTS",value:"openai",description:"OpenAI TTS API\uFF08\u9700\u8981 API Key\uFF09"}],u?c.tts?.provider||"edge":"off");if(d==="off"){let p={...c,tts:{...c.tts,enabled:!1}};Me(p),this.sdkClient?.setTTSEnabled?.(!1),this.logInfo("TTS disabled","TTS \u8BED\u97F3\u8F93\u51FA\u5DF2\u7981\u7528");}else {let p={...c,tts:{...c.tts,enabled:!0,provider:d}};Me(p),this.sdkClient?.setTTSEnabled?.(!0),this.logInfo("TTS enabled",`TTS \u8BED\u97F3\u8F93\u51FA\u5DF2\u542F\u7528 (${d})`);}}catch(d){d.message!=="cancelled"&&this.logInfo("TTS selection failed",d.message);}break}case "/experimental":{let l=(o[0]||"").toLowerCase(),c=He(),u=c.experimental?.enableFGTS??false,d=c.experimental?.enablePTC??false;if(l==="fgts"){let p=!u,g={...c,experimental:{...c.experimental,enableFGTS:p}};Me(g),this.logInfo("FGTS "+(p?"enabled":"disabled"),p?"\u5DF2\u542F\u7528 Fine-Grained Tool Streaming":"\u5DF2\u7981\u7528 Fine-Grained Tool Streaming");break}if(l==="ptc"){let p=!d,g={...c,experimental:{...c.experimental,enablePTC:p}};Me(g),this.logInfo("PTC "+(p?"enabled":"disabled"),p?"\u5DF2\u542F\u7528 Programmatic Tool Calling\uFF08\u91CD\u542F\u751F\u6548\uFF09":"\u5DF2\u7981\u7528 Programmatic Tool Calling\uFF08\u91CD\u542F\u751F\u6548\uFF09");break}try{let p=await this.promptSelect("\u5B9E\u9A8C\u7279\u6027 (Experimental Features)",[{label:`FGTS ${u?"\u2713 ON":"\u25CB OFF"}`,value:"fgts",description:"Fine-Grained Tool Streaming \u2014 \u5DE5\u5177\u53C2\u6570\u6D41\u5F0F\u8F93\u51FA\uFF0C\u964D\u4F4E\u5EF6\u8FDF\uFF08\u4EC5 Anthropic API\uFF09"},{label:`PTC ${d?"\u2713 ON":"\u25CB OFF"}`,value:"ptc",description:"Programmatic Tool Calling \u2014 LLM \u5199 JS \u811A\u672C\u6279\u91CF\u7F16\u6392\u5DE5\u5177\u8C03\u7528\uFF08single \u6A21\u5F0F\uFF09"}],"");if(p==="fgts"){let g=!u,h={...c,experimental:{...c.experimental,enableFGTS:g}};Me(h),this.logInfo("FGTS "+(g?"enabled":"disabled"),g?"\u5DF2\u542F\u7528 Fine-Grained Tool Streaming\uFF08\u91CD\u542F\u751F\u6548\uFF09":"\u5DF2\u7981\u7528 Fine-Grained Tool Streaming\uFF08\u91CD\u542F\u751F\u6548\uFF09");}else if(p==="ptc"){let g=!d,h={...c,experimental:{...c.experimental,enablePTC:g}};Me(h),this.logInfo("PTC "+(g?"enabled":"disabled"),g?"\u5DF2\u542F\u7528 Programmatic Tool Calling\uFF08\u91CD\u542F\u751F\u6548\uFF09":"\u5DF2\u7981\u7528 Programmatic Tool Calling\uFF08\u91CD\u542F\u751F\u6548\uFF09");}}catch(p){p.message!=="cancelled"&&this.logInfo("Experimental selection failed",p.message);}break}case "/model":{let l=(o[0]||"").toLowerCase(),c=o.slice(1),u=this.getProviderCommandContext();switch(l){case "":await L_(u);break;case "list":await M_(u,c[0]);break;case "add":await cp(u,c[0]);break;case "remove":case "delete":await up(u,c[0]);break;case "default":await D_(u,c[0]);break;case "use":await Zy(u,c[0],c[1]);break;case "config":case "configure":await N_(u,c[0]);break;default:await Zy(u,void 0,l);break}break}case "/clear":this.sdkClient?.clearMemory("cli").catch(()=>{}),this.logInfo("Conversation history cleared","\u5BF9\u8BDD\u5386\u53F2\u5DF2\u6E05\u7A7A");break;case "/config-clear":case "/config-reset":await O_(this.getConfigCommandContext());break;case "/index":case "/index-build":case "/index-status":await G_(this.getIndexCommandContext(),o[0]);break;case "/context":await fr(this.getContextCommandContext(),o[0]);break;case "/memory":await eI(this.getMemoryCommandContext(),o[0]);break;case "/workspace":case "/workdir":await this.handleWorkspaceCommand(o);break;case "/statistic":case "/statistics":await Si(this.getStatisticCommandContext(),o[0]);break;case "/cost":case "/pricing":await this.handlePricingCommand(o[0]);break;case "/stats":{let l=this.workDir.replace(process.env.HOME||"","~"),c=this.sdkClient?await this.sdkClient.getSessionInfo("cli").catch(()=>null):null,u=p=>!p||p.length<8?"***":`${p.slice(0,4)}...${p.slice(-4)}`,d=["",w.highlight(" \u{1F4CA} \u4F1A\u8BDD\u7EDF\u8BA1\u4FE1\u606F"),"",w.dim(" \u57FA\u672C\u4FE1\u606F:"),w.dim(" Directory: ")+w.info(l),w.dim(" Provider: ")+w.info(this.getProviderDisplayName()),w.dim(" Model: ")+w.info(this.model)];if(this.providerSettings&&(d.push(""),d.push(w.dim(" Provider \u914D\u7F6E:")),this.providerSettings.baseUrl&&d.push(w.dim(" API URL: ")+w.info(this.providerSettings.baseUrl)),this.providerSettings.apiKey&&d.push(w.dim(" API Key: ")+w.dim(u(this.providerSettings.apiKey))),this.providerSettings.maxTokens&&d.push(w.dim(" Max Out: ")+w.info(this.providerSettings.maxTokens.toString()+" tokens"))),d.push(""),d.push(w.dim(" \u4F1A\u8BDD\u72B6\u6001:")),d.push(w.dim(" Messages: ")+w.info((this.memory?.length??0).toString())),d.push(w.dim(" Tools: ")+w.info(this.tools.length.toString())),d.push(w.dim(" Requests: ")+w.info(this.sessionRequests.toString())),c&&(d.push(w.dim(" Session: ")+w.info(c.sessionId)),d.push(w.dim(" Turns: ")+w.info(c.turnCount.toString()))),d.push(""),d.push(w.dim(" \u8FD0\u884C\u6A21\u5F0F:")),d.push(w.dim(" Mode: ")+w.info(this.interactionMode==="agent"?"Agent (\u5DE5\u5177\u8C03\u7528)":"Ask (\u7EAF\u5BF9\u8BDD)")),d.push(w.dim(" Sandbox: ")+w.info(ph()?"On (\u5B89\u5168\u6A21\u5F0F)":"Off")),d.push(w.dim(" Approval: ")+w.info(this.userConfig.agentApprovalMode||this.userConfig.approvalMode||"auto")),this.thinkingMode!=="disabled"&&d.push(w.dim(" Thinking: ")+w.success("On (\u6DF1\u5EA6\u601D\u8003)")),d.push(""),this.uiController)if(typeof this.uiController.setCommandOutputLines=="function")this.uiController.setCommandOutputLines(d);else for(let p of d)this.uiController.printCommandOutput(p);else for(let p of d)Q(p);break}case "/sessions":await np(this.getCommandContext());break;case "/session":o[0]?await v_(this.getCommandContext(),o[0]):await np(this.getCommandContext());break;case "/session-new":await C_(this.getCommandContext(),this.model);break;case "/session-info":await w_(this.getCommandContext());break;case "/undo":await T_(this.getCommandContext(),o[0]);break;case "/checkpoint":await x_(this.getCommandContext(),o.join(" "));break;case "/checkpoints":await S_(this.getCommandContext());break;case "/rollback":await rp(this.getCommandContext(),o[0]);break;case "/session-clear":await k_(this.getCommandContext());break;case "/session-export":await __(this.getCommandContext(),o[0]);break;case "/compact":this.autoCompactionInProgress=await I_(this.getCommandContext());break;case "/processes":case "/ps":await E_(this.getProcessCommandContext(),o[0]);break;case "/kill":await A_(this.getProcessCommandContext(),o[0]);break;default:this.logInfo("Unknown command",`Command: ${r}
|
|
@@ -3973,9 +3980,9 @@ When users ask you to perform tasks, check if any skills can help. Use /skill-na
|
|
|
3973
3980
|
Type /help for available commands`);}}async handleWebSearchCommand(e){let t=(e[0]||"").toLowerCase(),n=e.slice(1).join(" ").trim();if(!t)try{t=await this.promptSelect("WebSearch",[{label:"Status",value:"status",description:"\u67E5\u770B\u5F53\u524D WebSearch \u914D\u7F6E"},{label:"Enable",value:"on",description:"\u5F00\u542F web_search \u5DE5\u5177"},{label:"Disable",value:"off",description:"\u5173\u95ED web_search \u5DE5\u5177"},{label:"Set URL",value:"set-url",description:"\u8BBE\u7F6E\u81EA\u5B9A\u4E49 WebSearch URL"},{label:"Set API Key",value:"set-key",description:"\u8BBE\u7F6E API Key\uFF08\u7559\u7A7A\u6E05\u9664\uFF09"}],"status","\u9009\u62E9\u64CD\u4F5C"),t==="set-url"?n=await this.promptText("\u8F93\u5165 WebSearch URL\uFF08\u7559\u7A7A\u6E05\u9664\uFF09",{allowEmpty:!0,defaultValue:this.userConfig.webSearch?.url||""}):t==="set-key"&&(n=await this.promptText("\u8F93\u5165 API Key\uFF08\u7559\u7A7A\u6E05\u9664\uFF09",{allowEmpty:!0,defaultValue:this.userConfig.webSearch?.apiKey||""}));}catch(a){a?.message!=="cancelled"&&this.logInfo("WebSearch \u64CD\u4F5C\u5931\u8D25",a?.message||String(a));return}let r={enabled:this.userConfig.webSearch?.enabled===true,url:this.userConfig.webSearch?.url,apiKey:this.userConfig.webSearch?.apiKey},o={...this.userConfig,webSearch:{...r}},i=async(a,l)=>{this.userConfig=o,Me(o);try{this.baseTools=await zn(this.workDir,this.platformServices),this.tools=this.getSingleTools();}catch{}this.logInfo(a,l);};switch(t){case "status":{let a=r.enabled?"ON":"OFF",l=r.url?.trim()||"(\u9ED8\u8BA4: \u5F53\u524D Provider /v1/messages)",c=r.apiKey?"\u5DF2\u914D\u7F6E":"\u672A\u914D\u7F6E";this.logInfo("WebSearch \u914D\u7F6E",`\u72B6\u6001: ${a}
|
|
3974
3981
|
URL: ${l}
|
|
3975
3982
|
API Key: ${c}`);return}case "on":case "enable":{o.webSearch={...o.webSearch||{},enabled:true},await i("WebSearch \u5DF2\u5F00\u542F","\u73B0\u5728\u53EF\u4F7F\u7528 web_search \u5DE5\u5177");return}case "off":case "disable":{o.webSearch={...o.webSearch||{},enabled:false},await i("WebSearch \u5DF2\u5173\u95ED","web_search \u5DE5\u5177\u5C06\u4E0D\u4F1A\u66B4\u9732\u7ED9\u6A21\u578B");return}case "set-url":{let a={...o.webSearch||{enabled:false}};if(!n){delete a.url,o.webSearch=a,await i("WebSearch URL \u5DF2\u6E05\u7A7A","\u5C06\u56DE\u9000\u5230\u9ED8\u8BA4 Provider API URL");return}try{let l=new URL(n);if(l.protocol!=="http:"&&l.protocol!=="https:")throw new Error("URL \u534F\u8BAE\u5FC5\u987B\u662F http \u6216 https")}catch(l){this.logInfo("URL \u65E0\u6548",l?.message||`\u65E0\u6548 URL: ${n}`);return}a.url=n,o.webSearch=a,await i("WebSearch URL \u5DF2\u66F4\u65B0",n);return}case "set-key":{let a={...o.webSearch||{enabled:false}};if(!n){delete a.apiKey,o.webSearch=a,await i("WebSearch API Key \u5DF2\u6E05\u7A7A","\u5C06\u4E0D\u518D\u4F7F\u7528 Serper \u56DE\u9000");return}a.apiKey=n,o.webSearch=a,await i("WebSearch API Key \u5DF2\u66F4\u65B0",`${n.slice(0,4)}****`);return}default:this.logInfo("\u7528\u6CD5",["/websearch status","/websearch on|off","/websearch set-url <url>","/websearch set-key <api-key>","\u63D0\u793A: set-url / set-key \u4E0D\u5E26\u53C2\u6570\u53EF\u6E05\u7A7A\u8BE5\u914D\u7F6E"].join(`
|
|
3976
|
-
`));}}async rebuildAgentAndRunner(){if(!this.providerSettings)throw new Error("No provider configured.");this.sdkClient?.clearMemory("cli").catch(()=>{}),this.baseTools=await zn(this.workDir,this.platformServices),await this.loadMcpTools({refresh:true}),this.resetMemoryPressureMonitor(),this.sessionEnabled&&this.currentSession&&m.info("MODEL","Model switched, server will reload session"),m.info("MODEL","Agent rebuilt for new model");}logInfo(e,t){this.uiController?this.uiController.addInfo(e,t):(Q(""),Q(w.highlight(` ${e}`)),t&&Q(w.dim(t)),Q(""));}normalizeWorkspacePath(e){let t=e.trim();if(!t)throw new Error("Empty workspace path");if(t==="~")return process.env.HOME||t;if(t.startsWith("~/")){let n=process.env.HOME||"";return Ie.join(n,t.slice(2))}return Ie.resolve(t)}formatWorkspaceLabel(e){let t=process.env.HOME||"";return t&&e.startsWith(t)?`~${e.slice(t.length)}`:e}getWorkspaceHistory(){let e=Array.isArray(this.userConfig.recentWorkspaces)?this.userConfig.recentWorkspaces:[],t=[],n=new Set,r=o=>{try{let i=this.normalizeWorkspacePath(o);n.has(i)||(n.add(i),t.push(i));}catch{}};r(this.workDir);for(let o of e)r(o);return t}saveWorkspaceHistory(e){let t=Array.from(new Set(e)),n=this.userConfig.recentWorkspaces||[];n.length===t.length&&n.every((o,i)=>o===t[i])||(this.userConfig={...this.userConfig,recentWorkspaces:t},Me(this.userConfig));}showWorkspaceList(e){let t=[];if(t.push(""),t.push(w.highlight(" Workspaces")),t.push(""),e.length===0?t.push(w.dim(" (none)")):e.forEach((n,r)=>{let o=Ie.resolve(n)===this.workDir,i=this.formatWorkspaceLabel(n),a=o?w.success("*"):w.dim(" ");t.push(`${w.dim(` ${r+1}.`)} ${a} ${w.info(i)}`);}),t.push(""),this.uiController&&typeof this.uiController.setCommandOutputLines=="function"){this.uiController.setCommandOutputLines(t);return}for(let n of t)Q(n);}async promptWorkspaceSelection(){let e=this.getWorkspaceHistory(),t=this.workDir,n=e.map(o=>({label:this.formatWorkspaceLabel(o),value:o,description:o===t?"current":void 0}));n.push({label:"+ Add workspace",value:"__add__"}),n.push({label:"Show list",value:"__list__"});let r=await this.promptSelect("Workspace",n,t);if(r==="__list__"){this.showWorkspaceList(e);return}if(r==="__add__"){let o=await this.promptText("Workspace path",{allowEmpty:false});await this.switchWorkspace(o);return}await this.switchWorkspace(r);}async switchWorkspace(e){if(this.isTaskRunning){this.logInfo("\u5F53\u524D\u4EFB\u52A1\u8FD0\u884C\u4E2D\uFF0C\u65E0\u6CD5\u5207\u6362\u5DE5\u4F5C\u533A");return}let t;try{t=this.normalizeWorkspacePath(e);}catch(r){this.logInfo("\u5DE5\u4F5C\u533A\u8DEF\u5F84\u65E0\u6548",r?.message||String(r));return}if(!wt.existsSync(t)){this.logInfo("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728",t);return}if(!wt.statSync(t).isDirectory()){this.logInfo("\u76EE\u6807\u4E0D\u662F\u76EE\u5F55",t);return}if(Ie.resolve(t)===this.workDir){this.logInfo("\u5DF2\u5728\u5F53\u524D\u5DE5\u4F5C\u533A",this.formatWorkspaceLabel(t));return}let n=[t,...this.getWorkspaceHistory()];if(this.saveWorkspaceHistory(n),this.workDir=t,process.chdir(this.workDir),process.env.NEOX_WORKDIR=this.workDir,await this.actionLog.setWorkspace(this.workDir),this.sdkClient?.setWorkspace(this.workDir).catch(()=>{}),this.baseTools=await zn(this.workDir,this.platformServices),this.mcpManager?this.mcpManager.setWorkDir(this.workDir):this.mcpManager=new lr({workDir:this.workDir}),await this.loadMcpTools({refresh:true}),this.sdkClient?.clearMemory("cli").catch(()=>{}),this.sessionEnabled){let r=await this.sessionManager.createSession({model:this.model});await this.activateSession(r,{loadHistory:false});}this.uiController&&(this.uiController.updateWorkDir(this.formatWorkspaceLabel(this.workDir)),this.uiController.updateStatus("Workspace switched","complete")),this.logInfo("\u5DF2\u5207\u6362\u5DE5\u4F5C\u533A",this.formatWorkspaceLabel(this.workDir));}async handleWorkspaceCommand(e){let t=e[0]?.toLowerCase();if(!t){await this.promptWorkspaceSelection();return}if(t==="list"){this.showWorkspaceList(this.getWorkspaceHistory());return}if(t==="current"){this.logInfo("\u5F53\u524D\u5DE5\u4F5C\u533A",this.formatWorkspaceLabel(this.workDir));return}if(t==="add"){let n=e.slice(1).join(" ")||await this.promptText("Workspace path",{allowEmpty:false});try{let r=this.normalizeWorkspacePath(n),o=[r,...this.getWorkspaceHistory()];this.saveWorkspaceHistory(o),this.logInfo("\u5DF2\u6DFB\u52A0\u5DE5\u4F5C\u533A",this.formatWorkspaceLabel(r));}catch(r){this.logInfo("\u5DE5\u4F5C\u533A\u8DEF\u5F84\u65E0\u6548",r?.message||String(r));}return}if(t==="switch"){let n=e.slice(1).join(" ");if(!n){await this.promptWorkspaceSelection();return}await this.switchWorkspace(n);return}await this.switchWorkspace(e.join(" "));}getRuntimeHostConfigKey(e,t){return JSON.stringify({providerId:e.id,protocol:e.protocol,baseUrl:e.baseUrl,model:t.model,useResponsesAPI:e.useResponsesAPI??false,maxInputTokens:t.maxInputTokens??e.maxInputTokens??null})}getCommandContext(){return {runtimeHost:null,uiController:this.uiController,colors:w,sessionEnabled:this.sessionEnabled,sessionManager:this.sessionManager,sessionSync:null,currentSession:this.currentSession,compatProfile:this.compatProfile,autoCompactionInProgress:this.autoCompactionInProgress,isRunning:this.isTaskRunning,logInfo:(e,t)=>this.logInfo(e,t),activateSession:(e,t)=>this.activateSession(e,t),normalizeCheckpoints:f_,withRuntimeEvents:e=>this.withRuntimeEvents(e),promptSelect:(e,t,n)=>this.promptSelect(e,t,n),promptText:(e,t)=>this.promptText(e,t),outputLines:this.uiController&&typeof this.uiController.setCommandOutputLines=="function"?e=>{this.uiController.setCommandOutputLines(e);}:void 0,clearOutputLines:this.uiController&&typeof this.uiController.clearCommandOutputLines=="function"?()=>{this.uiController.clearCommandOutputLines();}:void 0}}async withRuntimeEvents(e){return await e()}getProviderCommandContext(){return {providerId:this.providerId,provider:this.provider,model:this.model,providerSettings:this.providerSettings,getProviders:()=>this.providerStore.getProviders(),getProvider:e=>this.providerStore.getProvider(e),getDefaultProvider:()=>this.providerStore.getDefaultProvider(),getProviderCount:()=>this.providerStore.getProviderCount(),resolveModel:e=>this.providerStore.resolveModel(e),addProvider:e=>this.providerStore.addProvider(e),updateProvider:(e,t)=>this.providerStore.updateProvider(e,t),deleteProvider:e=>this.providerStore.deleteProvider(e),renameProvider:(e,t)=>this.providerStore.renameProvider(e,t),setDefaultProvider:e=>this.providerStore.setDefaultProvider(e),setLastSelectedModel:(e,t)=>this.providerStore.setLastSelectedModel(e,t),addModel:(e,t,n,r)=>this.providerStore.addModel(e,t,n,r),removeModel:(e,t)=>this.providerStore.removeModel(e,t),updateModelConfig:(e,t,n)=>this.providerStore.updateModelConfig(e,t,n),promptText:(e,t)=>this.promptText(e,t),promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),promptYesNo:(e,t)=>this.promptYesNo(e,t),promptConfirmKeyword:(e,t)=>this.promptConfirmKeyword(e,t),selectProviderFromList:e=>this.selectProviderFromList(e),selectModelFromProvider:(e,t)=>this.selectModelFromProvider(e,t),selectModelFromCurrentProvider:e=>this.selectModelFromCurrentProvider(e),getProviderByIdentifier:e=>this.getProviderByIdentifier(e),applyProviderState:async e=>{this.providerId=e.providerId,this.provider=e.provider,this.model=e.model,this.providerSettings=e.providerSettings,this.refreshProviderSettings(),this.rebuildCompatProfile(),await this.rebuildAgentAndRunner(),this.updateContextWindowDisplay();},refreshProviderSettings:()=>this.refreshProviderSettings(),getProviderDisplayName:()=>this.getProviderDisplayName(),logInfo:(e,t)=>this.logInfo(e,t),updateProviderDisplay:(e,t)=>{this.uiController&&this.uiController.updateProvider(e,t);},outputFn:this.uiController?e=>this.uiController.printCommandOutput(e):void 0}}getThinkingCommandContext(){return {model:this.model,providerSettings:this.providerSettings,thinkingMode:this.thinkingMode,llmProvider:this.providerControls?.anthropic||null,setThinkingMode:e=>{this.thinkingMode=e;},promptSelect:(e,t,n)=>this.promptSelect(e,t,n),logInfo:(e,t)=>this.logInfo(e,t)}}getConfigCommandContext(){return {approvalMode:this.approvalMode,userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),logInfo:(e,t)=>this.logInfo(e,t),cleanup:()=>this.cleanup(),setApprovalMode:e=>{this.approvalMode=e,e==="dangerous"?(this.currentMode="auto",this.sdkClient?.setApprovalMode("cli","auto").catch(()=>{})):(this.currentMode="agent",this.sdkClient?.setApprovalMode("cli","manual").catch(()=>{}));},updateConfig:e=>{this.userConfig=e;}}}getNotifyCommandContext(){return {userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;}}}getMcpCommandContext(){return this.mcpManager?this.mcpManager.setWorkDir(this.workDir):this.mcpManager=new lr({workDir:this.workDir}),{workDir:this.workDir,mcpManager:this.mcpManager,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),promptText:(e,t)=>this.promptText(e,t),logInfo:(e,t)=>this.logInfo(e,t),refreshMcpTools:async()=>{await this.rebuildAgentAndRunner();},outputLines:e=>this.uiController?.setCommandOutputLines(e)}}getIndexCommandContext(){return {userConfig:this.userConfig,workspacePath:this.workDir,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;}}}getContextCommandContext(){return {userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;},runner:null,uiController:this.uiController,memoryPressure:this.memoryPressure,updateCompactionThreshold:e=>this.updateCompactionThreshold(e),updateCompressionMode:e=>{this.sdkClient?.setCompressionMode("cli",e).catch(()=>{});}}}getMemoryCommandContext(){return {actionLog:this.actionLog,userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),promptText:(e,t)=>this.promptText(e,t),logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;},uiController:this.uiController}}async showOnboardingIfNeeded(){if(this.userConfig.hasSeenOnboarding||!this.uiController)return;let e=G();console.log(),console.log(Oe.cyan.bold(` \u25CF ${e.onboarding.welcome}`)),console.log(Oe.dim(` ${e.onboarding.welcomeDesc}`)),console.log(),console.log(Oe.yellow(` \u25CB ${e.onboarding.selectLanguage}`)),console.log(Oe.dim(` ${e.onboarding.selectLanguageDesc}`)),console.log();let t=[{label:"\u25CB \u4E2D\u6587",value:"zh",description:"\u4F7F\u7528\u4E2D\u6587\u754C\u9762"},{label:"\u25CB English",value:"en",description:"Use English interface"}],n=await this.promptSelect(e.onboarding.selectLanguage,t,void 0,e.onboarding.selectLanguageDesc);n&&Ch(n),this.userConfig.hasSeenOnboarding=true,Me(this.userConfig);let r=G();console.log(),console.log(Oe.green.bold(` \u2713 ${r.onboarding.setupComplete}`)),console.log(Oe.dim(` ${r.onboarding.setupCompleteDesc}`)),console.log();}async showLanguageMenu(){if(!this.uiController){console.log(Oe.yellow("Language settings is only available in interactive mode"));return}let e=G(),t=HT(),n=[{label:e.languageMenu.chinese,value:"zh",description:t==="zh"?`\u2713 ${e.languageMenu.current}`:e.languageMenu.chineseDesc},{label:e.languageMenu.english,value:"en",description:t==="en"?`\u2713 ${e.languageMenu.current}`:e.languageMenu.englishDesc}],r=await this.promptSelect(e.languageMenu.title,n,void 0,e.languageMenu.hint);if(r&&r!==t){Ch(r);let o=G(),i=r==="zh"?"\u4E2D\u6587":"English";this.logInfo(ct(o.languageMenu.changed,{lang:i}));}}async showSkillsScreen(){if(!this.uiController){console.log(Oe.yellow("Skills list is only available in interactive mode"));return}for(;;){let e=G(),t=et.list(),n=[{label:e.skillsMenu.viewAll,value:"list",description:ct(e.skillsMenu.viewAllDesc,{count:t.length})},{label:e.skillsMenu.import,value:"import",description:e.skillsMenu.importDesc},{label:e.skillsMenu.create,value:"create",description:e.skillsMenu.createDesc},{label:e.skillsMenu.refresh,value:"refresh",description:e.skillsMenu.refreshDesc}],r=await this.promptSelect(e.skillsMenu.title,n,void 0,e.skillsMenu.hint);if(!r)break;switch(r){case "list":await this.showSkillsList();break;case "import":await this.showImportSkillMenu();break;case "create":await this.showCreateSkillMenu();break;case "refresh":await et.refresh(this.workDir),this.logInfo(ct(e.skillsMenu.refreshSuccess,{count:et.size}));break}}}async showSkillsList(){let e=G(),t=et.list();if(t.length===0){this.logInfo(e.skillsMenu.noSkills);return}let n=t.filter(l=>l.source==="builtin"),r=t.filter(l=>l.source==="user"),o=t.filter(l=>l.source==="workspace"),i=[];if(n.length>0){i.push({label:e.skillsMenu.builtIn,value:"",description:""});for(let l of n){let c=l.metadata.neox?.aliases?.length?` (${l.metadata.neox.aliases.join(", ")})`:"";i.push({label:`/${l.id}${c}`,value:l.id,description:l.metadata.description});}}if(r.length>0){i.push({label:e.skillsMenu.user,value:"",description:""});for(let l of r){let c=l.metadata.neox?.aliases?.length?` (${l.metadata.neox.aliases.join(", ")})`:"";i.push({label:`/${l.id}${c}`,value:l.id,description:l.metadata.description});}}if(o.length>0){i.push({label:e.skillsMenu.workspace,value:"",description:""});for(let l of o){let c=l.metadata.neox?.aliases?.length?` (${l.metadata.neox.aliases.join(", ")})`:"";i.push({label:`/${l.id}${c}`,value:l.id,description:l.metadata.description});}}let a=await this.promptSelect(e.skillsMenu.title,i,void 0,e.skillsMenu.selectToExecute);a&&a!==""&&await this.handleUserInput(`/${a}`,void 0,"local");}async showImportSkillMenu(){let e=G(),t=await this.promptSelect(e.skillsMenu.importMethod,[{label:e.skillsMenu.fromUrl,value:"url",description:e.skillsMenu.fromUrlDesc},{label:e.skillsMenu.fromPath,value:"path",description:e.skillsMenu.fromPathDesc}],void 0,e.skillsMenu.importMethod);if(!t)return;let n=await this.promptSelect(e.skillsMenu.saveLocation,[{label:e.skillsMenu.userGlobal,value:"user",description:"~/.neox/skills/"},{label:e.skillsMenu.workspaceLocal,value:"workspace",description:".neox/skills/"}],void 0,e.skillsMenu.saveLocation);if(!n)return;let r=await this.promptText(t==="url"?e.skillsMenu.enterUrl:e.skillsMenu.enterPath,{hint:t==="url"?"https://...":"./path/to/skill \u6216 ./SKILL.md"});if(!r)return;this.logInfo(e.skillsMenu.importing);let o=t==="url"?await et.importFromUrl(r,n,this.workDir):await et.importFromPath(r,n,this.workDir);o.success?this.logInfo(ct(e.skillsMenu.importSuccess,{id:o.skillId||""})):this.logInfo(ct(e.skillsMenu.importFailed,{error:o.error||""}));}async showCreateSkillMenu(){let e=G(),t=await this.promptText(e.skillsMenu.enterId,{hint:"e.g., my-tool, code-review"});if(!t)return;if(!/^[a-z][a-z0-9-]*$/.test(t)){this.logInfo(e.skillsMenu.idFormatError);return}if(et.has(t)){this.logInfo(ct(e.skillsMenu.skillExists,{id:t}));return}let n=await this.promptText(e.skillsMenu.enterName,{hint:"e.g., My Custom Tool"});if(!n)return;let r=await this.promptText(e.skillsMenu.enterDescription,{hint:"e.g., Perform code review and provide suggestions"});if(!r)return;let o=await this.promptSelect(e.skillsMenu.selectCategory,[{label:"git",value:"git",description:e.skillsMenu.categoryGit},{label:"code",value:"code",description:e.skillsMenu.categoryCode},{label:"docs",value:"docs",description:e.skillsMenu.categoryDocs},{label:"test",value:"test",description:e.skillsMenu.categoryTest},{label:"custom",value:"custom",description:e.skillsMenu.categoryCustom}],"custom",e.skillsMenu.selectCategory),i=await this.promptSelect(e.skillsMenu.saveLocation,[{label:e.skillsMenu.userGlobal,value:"user",description:"~/.neox/skills/"},{label:e.skillsMenu.workspaceLocal,value:"workspace",description:".neox/skills/"}],void 0,e.skillsMenu.saveLocation);if(!i)return;let a=await et.createSkill({id:t,name:n,description:r,category:o||"custom",target:i,workDir:this.workDir});a.success?this.logInfo(ct(e.skillsMenu.createSuccess,{path:a.path||""})):this.logInfo(ct(e.skillsMenu.createFailed,{error:a.error||""}));}getRemoteCommandContext(){return {userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),promptText:(e,t)=>this.promptText(e,t),logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;},startRemote:()=>this.startRemoteServer(),stopRemote:()=>this.stopRemoteServer(),regenerateToken:()=>this.regenerateRemoteToken(),getStatus:()=>this.getRemoteStatus(),outputLines:this.uiController&&typeof this.uiController.setCommandOutputLines=="function"?e=>{this.uiController.setCommandOutputLines(e);}:void 0,clearOutputLines:this.uiController&&typeof this.uiController.clearCommandOutputLines=="function"?()=>{this.uiController.clearCommandOutputLines();}:void 0}}getSupervisorCommandContext(){return {userConfig:this.userConfig,logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;}}}getRunConfigCommandContext(){return {userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),promptText:(e,t)=>this.promptText(e,t),getProviders:()=>this.providerStore.getProviders(),activeProviderId:this.providerId,logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;},workDir:this.workDir,llmCall:async(e,t)=>{if(!this.providerStore.getProviders().find(r=>r.id===this.providerId)?.models?.[0])throw new Error("\u672A\u914D\u7F6E\u53EF\u7528\u7684 LLM \u6A21\u578B");if(!this.remoteAdapter)throw new Error("Server not connected");return await this.remoteAdapter.chat({sessionId:`llm-call-${Date.now()}`,prompt:`${e}
|
|
3983
|
+
`));}}async rebuildAgentAndRunner(){if(!this.providerSettings)throw new Error("No provider configured.");this.sdkClient?.clearMemory("cli").catch(()=>{}),this.baseTools=await zn(this.workDir,this.platformServices),await this.loadMcpTools({refresh:true}),this.resetMemoryPressureMonitor(),this.sessionEnabled&&this.currentSession&&m.info("MODEL","Model switched, server will reload session"),m.info("MODEL","Agent rebuilt for new model");}logInfo(e,t){this.uiController?this.uiController.addInfo(e,t):(Q(""),Q(w.highlight(` ${e}`)),t&&Q(w.dim(t)),Q(""));}normalizeWorkspacePath(e){let t=e.trim();if(!t)throw new Error("Empty workspace path");if(t==="~")return process.env.HOME||t;if(t.startsWith("~/")){let n=process.env.HOME||"";return Ie.join(n,t.slice(2))}return Ie.resolve(t)}formatWorkspaceLabel(e){let t=process.env.HOME||"";return t&&e.startsWith(t)?`~${e.slice(t.length)}`:e}getWorkspaceHistory(){let e=Array.isArray(this.userConfig.recentWorkspaces)?this.userConfig.recentWorkspaces:[],t=[],n=new Set,r=o=>{try{let i=this.normalizeWorkspacePath(o);n.has(i)||(n.add(i),t.push(i));}catch{}};r(this.workDir);for(let o of e)r(o);return t}saveWorkspaceHistory(e){let t=Array.from(new Set(e)),n=this.userConfig.recentWorkspaces||[];n.length===t.length&&n.every((o,i)=>o===t[i])||(this.userConfig={...this.userConfig,recentWorkspaces:t},Me(this.userConfig));}showWorkspaceList(e){let t=[];if(t.push(""),t.push(w.highlight(" Workspaces")),t.push(""),e.length===0?t.push(w.dim(" (none)")):e.forEach((n,r)=>{let o=Ie.resolve(n)===this.workDir,i=this.formatWorkspaceLabel(n),a=o?w.success("*"):w.dim(" ");t.push(`${w.dim(` ${r+1}.`)} ${a} ${w.info(i)}`);}),t.push(""),this.uiController&&typeof this.uiController.setCommandOutputLines=="function"){this.uiController.setCommandOutputLines(t);return}for(let n of t)Q(n);}async promptWorkspaceSelection(){let e=this.getWorkspaceHistory(),t=this.workDir,n=e.map(o=>({label:this.formatWorkspaceLabel(o),value:o,description:o===t?"current":void 0}));n.push({label:"+ Add workspace",value:"__add__"}),n.push({label:"Show list",value:"__list__"});let r=await this.promptSelect("Workspace",n,t);if(r==="__list__"){this.showWorkspaceList(e);return}if(r==="__add__"){let o=await this.promptText("Workspace path",{allowEmpty:false});await this.switchWorkspace(o);return}await this.switchWorkspace(r);}async switchWorkspace(e){if(this.isTaskRunning){this.logInfo("\u5F53\u524D\u4EFB\u52A1\u8FD0\u884C\u4E2D\uFF0C\u65E0\u6CD5\u5207\u6362\u5DE5\u4F5C\u533A");return}let t;try{t=this.normalizeWorkspacePath(e);}catch(r){this.logInfo("\u5DE5\u4F5C\u533A\u8DEF\u5F84\u65E0\u6548",r?.message||String(r));return}if(!wt.existsSync(t)){this.logInfo("\u5DE5\u4F5C\u533A\u4E0D\u5B58\u5728",t);return}if(!wt.statSync(t).isDirectory()){this.logInfo("\u76EE\u6807\u4E0D\u662F\u76EE\u5F55",t);return}if(Ie.resolve(t)===this.workDir){this.logInfo("\u5DF2\u5728\u5F53\u524D\u5DE5\u4F5C\u533A",this.formatWorkspaceLabel(t));return}let n=[t,...this.getWorkspaceHistory()];if(this.saveWorkspaceHistory(n),this.workDir=t,process.chdir(this.workDir),process.env.NEOX_WORKDIR=this.workDir,await this.actionLog.setWorkspace(this.workDir),this.sdkClient?.setWorkspace(this.workDir).catch(()=>{}),this.baseTools=await zn(this.workDir,this.platformServices),this.mcpManager?this.mcpManager.setWorkDir(this.workDir):this.mcpManager=new lr({workDir:this.workDir}),await this.loadMcpTools({refresh:true}),this.sdkClient?.clearMemory("cli").catch(()=>{}),this.sessionEnabled){let r=await this.sessionManager.createSession({model:this.model});await this.activateSession(r,{loadHistory:false});}this.uiController&&(this.uiController.updateWorkDir(this.formatWorkspaceLabel(this.workDir)),this.uiController.updateStatus("Workspace switched","complete")),this.logInfo("\u5DF2\u5207\u6362\u5DE5\u4F5C\u533A",this.formatWorkspaceLabel(this.workDir));}async handleWorkspaceCommand(e){let t=e[0]?.toLowerCase();if(!t){await this.promptWorkspaceSelection();return}if(t==="list"){this.showWorkspaceList(this.getWorkspaceHistory());return}if(t==="current"){this.logInfo("\u5F53\u524D\u5DE5\u4F5C\u533A",this.formatWorkspaceLabel(this.workDir));return}if(t==="add"){let n=e.slice(1).join(" ")||await this.promptText("Workspace path",{allowEmpty:false});try{let r=this.normalizeWorkspacePath(n),o=[r,...this.getWorkspaceHistory()];this.saveWorkspaceHistory(o),this.logInfo("\u5DF2\u6DFB\u52A0\u5DE5\u4F5C\u533A",this.formatWorkspaceLabel(r));}catch(r){this.logInfo("\u5DE5\u4F5C\u533A\u8DEF\u5F84\u65E0\u6548",r?.message||String(r));}return}if(t==="switch"){let n=e.slice(1).join(" ");if(!n){await this.promptWorkspaceSelection();return}await this.switchWorkspace(n);return}await this.switchWorkspace(e.join(" "));}getRuntimeHostConfigKey(e,t){return JSON.stringify({providerId:e.id,protocol:e.protocol,baseUrl:e.baseUrl,model:t.model,useResponsesAPI:e.useResponsesAPI??false,maxInputTokens:t.maxInputTokens??e.maxInputTokens??null})}getCommandContext(){return {runtimeHost:null,uiController:this.uiController,colors:w,sessionEnabled:this.sessionEnabled,sessionManager:this.sessionManager,sessionSync:null,currentSession:this.currentSession,compatProfile:this.compatProfile,autoCompactionInProgress:this.autoCompactionInProgress,isRunning:this.isTaskRunning,logInfo:(e,t)=>this.logInfo(e,t),activateSession:(e,t)=>this.activateSession(e,t),normalizeCheckpoints:f_,withRuntimeEvents:e=>this.withRuntimeEvents(e),promptSelect:(e,t,n)=>this.promptSelect(e,t,n),promptText:(e,t)=>this.promptText(e,t),outputLines:this.uiController&&typeof this.uiController.setCommandOutputLines=="function"?e=>{this.uiController.setCommandOutputLines(e);}:void 0,clearOutputLines:this.uiController&&typeof this.uiController.clearCommandOutputLines=="function"?()=>{this.uiController.clearCommandOutputLines();}:void 0}}async withRuntimeEvents(e){return await e()}getProviderCommandContext(){return {providerId:this.providerId,provider:this.provider,model:this.model,providerSettings:this.providerSettings,getProviders:()=>this.providerStore.getProviders(),getProvider:e=>this.providerStore.getProvider(e),getDefaultProvider:()=>this.providerStore.getDefaultProvider(),getProviderCount:()=>this.providerStore.getProviderCount(),resolveModel:e=>this.providerStore.resolveModel(e),addProvider:e=>this.providerStore.addProvider(e),updateProvider:(e,t)=>this.providerStore.updateProvider(e,t),deleteProvider:e=>this.providerStore.deleteProvider(e),renameProvider:(e,t)=>this.providerStore.renameProvider(e,t),setDefaultProvider:e=>this.providerStore.setDefaultProvider(e),setLastSelectedModel:(e,t)=>this.providerStore.setLastSelectedModel(e,t),addModel:(e,t,n,r)=>this.providerStore.addModel(e,t,n,r),removeModel:(e,t)=>this.providerStore.removeModel(e,t),updateModelConfig:(e,t,n)=>this.providerStore.updateModelConfig(e,t,n),promptText:(e,t)=>this.promptText(e,t),promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),promptYesNo:(e,t)=>this.promptYesNo(e,t),promptConfirmKeyword:(e,t)=>this.promptConfirmKeyword(e,t),selectProviderFromList:e=>this.selectProviderFromList(e),selectModelFromProvider:(e,t)=>this.selectModelFromProvider(e,t),selectModelFromCurrentProvider:e=>this.selectModelFromCurrentProvider(e),getProviderByIdentifier:e=>this.getProviderByIdentifier(e),applyProviderState:async e=>{this.providerId=e.providerId,this.provider=e.provider,this.model=e.model,this.providerSettings=e.providerSettings,this.refreshProviderSettings(),this.rebuildCompatProfile(),await this.rebuildAgentAndRunner(),this.updateContextWindowDisplay();},refreshProviderSettings:()=>this.refreshProviderSettings(),getProviderDisplayName:()=>this.getProviderDisplayName(),logInfo:(e,t)=>this.logInfo(e,t),updateProviderDisplay:(e,t)=>{this.uiController&&this.uiController.updateProvider(e,t);},outputFn:this.uiController?e=>this.uiController.printCommandOutput(e):void 0}}getThinkingCommandContext(){return {model:this.model,providerSettings:this.providerSettings,thinkingMode:this.thinkingMode,llmProvider:this.providerControls?.anthropic||null,setThinkingMode:e=>{this.thinkingMode=e;},promptSelect:(e,t,n)=>this.promptSelect(e,t,n),logInfo:(e,t)=>this.logInfo(e,t)}}getConfigCommandContext(){return {approvalMode:this.approvalMode,userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),logInfo:(e,t)=>this.logInfo(e,t),cleanup:()=>this.cleanup(),setApprovalMode:e=>{this.approvalMode=e,e==="dangerous"?(this.currentMode="auto",this.sdkClient?.setApprovalMode("cli","auto").catch(()=>{})):(this.currentMode="agent",this.sdkClient?.setApprovalMode("cli","manual").catch(()=>{}));},updateConfig:e=>{this.userConfig=e;}}}getNotifyCommandContext(){return {userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;}}}getMcpCommandContext(){return this.mcpManager?this.mcpManager.setWorkDir(this.workDir):this.mcpManager=new lr({workDir:this.workDir}),{workDir:this.workDir,mcpManager:this.mcpManager,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),promptText:(e,t)=>this.promptText(e,t),logInfo:(e,t)=>this.logInfo(e,t),refreshMcpTools:async()=>{await this.rebuildAgentAndRunner();},outputLines:e=>this.uiController?.setCommandOutputLines(e)}}getIndexCommandContext(){return {userConfig:this.userConfig,workspacePath:this.workDir,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;}}}getContextCommandContext(){return {userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;},runner:null,uiController:this.uiController,memoryPressure:this.memoryPressure,updateCompactionThreshold:e=>this.updateCompactionThreshold(e),updateCompressionMode:e=>{this.sdkClient?.setCompressionMode("cli",e).catch(()=>{});}}}getMemoryCommandContext(){return {actionLog:this.actionLog,userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),promptText:(e,t)=>this.promptText(e,t),logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;},uiController:this.uiController}}async showOnboardingIfNeeded(){if(this.userConfig.hasSeenOnboarding||!this.uiController)return;let e=G();console.log(),console.log(Oe.cyan.bold(` \u25CF ${e.onboarding.welcome}`)),console.log(Oe.dim(` ${e.onboarding.welcomeDesc}`)),console.log(),console.log(Oe.yellow(` \u25CB ${e.onboarding.selectLanguage}`)),console.log(Oe.dim(` ${e.onboarding.selectLanguageDesc}`)),console.log();let t=[{label:"\u25CB \u4E2D\u6587",value:"zh",description:"\u4F7F\u7528\u4E2D\u6587\u754C\u9762"},{label:"\u25CB English",value:"en",description:"Use English interface"}],n=await this.promptSelect(e.onboarding.selectLanguage,t,void 0,e.onboarding.selectLanguageDesc);n&&Ch(n),this.userConfig.hasSeenOnboarding=true,Me(this.userConfig);let r=G();console.log(),console.log(Oe.green.bold(` \u2713 ${r.onboarding.setupComplete}`)),console.log(Oe.dim(` ${r.onboarding.setupCompleteDesc}`)),console.log();}async showLanguageMenu(){if(!this.uiController){console.log(Oe.yellow("Language settings is only available in interactive mode"));return}let e=G(),t=HT(),n=[{label:e.languageMenu.chinese,value:"zh",description:t==="zh"?`\u2713 ${e.languageMenu.current}`:e.languageMenu.chineseDesc},{label:e.languageMenu.english,value:"en",description:t==="en"?`\u2713 ${e.languageMenu.current}`:e.languageMenu.englishDesc}],r=await this.promptSelect(e.languageMenu.title,n,void 0,e.languageMenu.hint);if(r&&r!==t){Ch(r);let o=G(),i=r==="zh"?"\u4E2D\u6587":"English";this.logInfo(ct(o.languageMenu.changed,{lang:i}));}}async showSkillsScreen(){if(!this.uiController){console.log(Oe.yellow("Skills list is only available in interactive mode"));return}for(;;){let e=G(),t=tt.list(),n=[{label:e.skillsMenu.viewAll,value:"list",description:ct(e.skillsMenu.viewAllDesc,{count:t.length})},{label:e.skillsMenu.import,value:"import",description:e.skillsMenu.importDesc},{label:e.skillsMenu.create,value:"create",description:e.skillsMenu.createDesc},{label:e.skillsMenu.refresh,value:"refresh",description:e.skillsMenu.refreshDesc}],r=await this.promptSelect(e.skillsMenu.title,n,void 0,e.skillsMenu.hint);if(!r)break;switch(r){case "list":await this.showSkillsList();break;case "import":await this.showImportSkillMenu();break;case "create":await this.showCreateSkillMenu();break;case "refresh":await tt.refresh(this.workDir),this.logInfo(ct(e.skillsMenu.refreshSuccess,{count:tt.size}));break}}}async showSkillsList(){let e=G(),t=tt.list();if(t.length===0){this.logInfo(e.skillsMenu.noSkills);return}let n=t.filter(l=>l.source==="builtin"),r=t.filter(l=>l.source==="user"),o=t.filter(l=>l.source==="workspace"),i=[];if(n.length>0){i.push({label:e.skillsMenu.builtIn,value:"",description:""});for(let l of n){let c=l.metadata.neox?.aliases?.length?` (${l.metadata.neox.aliases.join(", ")})`:"";i.push({label:`/${l.id}${c}`,value:l.id,description:l.metadata.description});}}if(r.length>0){i.push({label:e.skillsMenu.user,value:"",description:""});for(let l of r){let c=l.metadata.neox?.aliases?.length?` (${l.metadata.neox.aliases.join(", ")})`:"";i.push({label:`/${l.id}${c}`,value:l.id,description:l.metadata.description});}}if(o.length>0){i.push({label:e.skillsMenu.workspace,value:"",description:""});for(let l of o){let c=l.metadata.neox?.aliases?.length?` (${l.metadata.neox.aliases.join(", ")})`:"";i.push({label:`/${l.id}${c}`,value:l.id,description:l.metadata.description});}}let a=await this.promptSelect(e.skillsMenu.title,i,void 0,e.skillsMenu.selectToExecute);a&&a!==""&&await this.handleUserInput(`/${a}`,void 0,"local");}async showImportSkillMenu(){let e=G(),t=await this.promptSelect(e.skillsMenu.importMethod,[{label:e.skillsMenu.fromUrl,value:"url",description:e.skillsMenu.fromUrlDesc},{label:e.skillsMenu.fromPath,value:"path",description:e.skillsMenu.fromPathDesc}],void 0,e.skillsMenu.importMethod);if(!t)return;let n=await this.promptSelect(e.skillsMenu.saveLocation,[{label:e.skillsMenu.userGlobal,value:"user",description:"~/.neox/skills/"},{label:e.skillsMenu.workspaceLocal,value:"workspace",description:".neox/skills/"}],void 0,e.skillsMenu.saveLocation);if(!n)return;let r=await this.promptText(t==="url"?e.skillsMenu.enterUrl:e.skillsMenu.enterPath,{hint:t==="url"?"https://...":"./path/to/skill \u6216 ./SKILL.md"});if(!r)return;this.logInfo(e.skillsMenu.importing);let o=t==="url"?await tt.importFromUrl(r,n,this.workDir):await tt.importFromPath(r,n,this.workDir);o.success?this.logInfo(ct(e.skillsMenu.importSuccess,{id:o.skillId||""})):this.logInfo(ct(e.skillsMenu.importFailed,{error:o.error||""}));}async showCreateSkillMenu(){let e=G(),t=await this.promptText(e.skillsMenu.enterId,{hint:"e.g., my-tool, code-review"});if(!t)return;if(!/^[a-z][a-z0-9-]*$/.test(t)){this.logInfo(e.skillsMenu.idFormatError);return}if(tt.has(t)){this.logInfo(ct(e.skillsMenu.skillExists,{id:t}));return}let n=await this.promptText(e.skillsMenu.enterName,{hint:"e.g., My Custom Tool"});if(!n)return;let r=await this.promptText(e.skillsMenu.enterDescription,{hint:"e.g., Perform code review and provide suggestions"});if(!r)return;let o=await this.promptSelect(e.skillsMenu.selectCategory,[{label:"git",value:"git",description:e.skillsMenu.categoryGit},{label:"code",value:"code",description:e.skillsMenu.categoryCode},{label:"docs",value:"docs",description:e.skillsMenu.categoryDocs},{label:"test",value:"test",description:e.skillsMenu.categoryTest},{label:"custom",value:"custom",description:e.skillsMenu.categoryCustom}],"custom",e.skillsMenu.selectCategory),i=await this.promptSelect(e.skillsMenu.saveLocation,[{label:e.skillsMenu.userGlobal,value:"user",description:"~/.neox/skills/"},{label:e.skillsMenu.workspaceLocal,value:"workspace",description:".neox/skills/"}],void 0,e.skillsMenu.saveLocation);if(!i)return;let a=await tt.createSkill({id:t,name:n,description:r,category:o||"custom",target:i,workDir:this.workDir});a.success?this.logInfo(ct(e.skillsMenu.createSuccess,{path:a.path||""})):this.logInfo(ct(e.skillsMenu.createFailed,{error:a.error||""}));}getRemoteCommandContext(){return {userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),promptText:(e,t)=>this.promptText(e,t),logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;},startRemote:()=>this.startRemoteServer(),stopRemote:()=>this.stopRemoteServer(),regenerateToken:()=>this.regenerateRemoteToken(),getStatus:()=>this.getRemoteStatus(),outputLines:this.uiController&&typeof this.uiController.setCommandOutputLines=="function"?e=>{this.uiController.setCommandOutputLines(e);}:void 0,clearOutputLines:this.uiController&&typeof this.uiController.clearCommandOutputLines=="function"?()=>{this.uiController.clearCommandOutputLines();}:void 0}}getSupervisorCommandContext(){return {userConfig:this.userConfig,logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;}}}getRunConfigCommandContext(){return {userConfig:this.userConfig,promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),promptText:(e,t)=>this.promptText(e,t),getProviders:()=>this.providerStore.getProviders(),activeProviderId:this.providerId,logInfo:(e,t)=>this.logInfo(e,t),updateConfig:e=>{this.userConfig=e;},workDir:this.workDir,llmCall:async(e,t)=>{if(!this.providerStore.getProviders().find(r=>r.id===this.providerId)?.models?.[0])throw new Error("\u672A\u914D\u7F6E\u53EF\u7528\u7684 LLM \u6A21\u578B");if(!this.remoteAdapter)throw new Error("Server not connected");return await this.remoteAdapter.chat({sessionId:`llm-call-${Date.now()}`,prompt:`${e}
|
|
3977
3984
|
|
|
3978
3985
|
${t}`,mode:"single",providerId:this.providerId,modelName:this.model}),""},readFile:async e=>{try{return await(await import('fs/promises')).readFile(e,"utf-8")}catch{return null}},listDir:async e=>{try{return await(await import('fs/promises')).readdir(e)}catch{return []}}}}getStatisticCommandContext(){return {promptSelect:(e,t,n,r)=>this.promptSelect(e,t,n,r),logInfo:(e,t)=>this.logInfo(e,t),outputLines:this.uiController&&typeof this.uiController.setCommandOutputLines=="function"?e=>{this.uiController.setCommandOutputLines(e);}:void 0,clearOutputLines:this.uiController&&typeof this.uiController.clearCommandOutputLines=="function"?()=>{this.uiController.clearCommandOutputLines();}:void 0,userConfig:this.userConfig}}async handlePricingCommand(e){let t={userConfig:this.userConfig,promptSelect:(n,r,o,i)=>this.promptSelect(n,r,o,i),promptInput:(n,r)=>this.promptInput(n,r),logInfo:(n,r)=>this.logInfo(n,r),updateConfig:n=>{this.userConfig=n;}};await J_(t,e);}getProcessCommandContext(){return {outputLines:this.uiController&&typeof this.uiController.setCommandOutputLines=="function"?e=>{this.uiController.setCommandOutputLines(e);}:void 0,clearOutputLines:this.uiController&&typeof this.uiController.clearCommandOutputLines=="function"?()=>{this.uiController.clearCommandOutputLines();}:void 0}}async addPendingAttachment(e){let t=e.trim();if(!t){this.logInfo("\u9644\u4EF6\u65E0\u6548","\u8BF7\u8F93\u5165\u672C\u5730\u56FE\u7247\u8DEF\u5F84\u6216 https \u94FE\u63A5");return}if(/^https?:\/\//i.test(t)){try{let i=new URL(t);this.pendingAttachments.push({type:"url",data:t,name:i.hostname}),this.logInfo("\u5DF2\u6DFB\u52A0\u94FE\u63A5\u9644\u4EF6",t);}catch{this.logInfo("\u65E0\u6548\u7684 URL",t);}return}let n=Ie.isAbsolute(t)?t:Ie.resolve(process.cwd(),t);if(!wt.existsSync(n)){this.logInfo("\u6587\u4EF6\u4E0D\u5B58\u5728",n);return}let r=Ie.extname(n).toLowerCase(),o=Yd[r];if(!o){this.logInfo("\u4EC5\u652F\u6301\u56FE\u7247\u9644\u4EF6",`\u5141\u8BB8\u7684\u7C7B\u578B: ${Object.keys(Yd).join(", ")}`);return}try{let i=await wt.promises.readFile(n),a=`data:${o};base64,${i.toString("base64")}`;this.pendingAttachments.push({type:"image",data:a,name:Ie.basename(n)}),this.logInfo("\u5DF2\u6DFB\u52A0\u56FE\u7247\u9644\u4EF6",Ie.basename(n));}catch(i){this.logInfo("\u8BFB\u53D6\u9644\u4EF6\u5931\u8D25",i?.message||"\u65E0\u6CD5\u8BFB\u53D6\u6587\u4EF6");}}listPendingAttachments(){if(this.pendingAttachments.length===0){this.logInfo("\u9644\u4EF6\u5217\u8868","\u6CA1\u6709\u5F85\u53D1\u9001\u7684\u9644\u4EF6\u3002");return}Q(""),Q(w.highlight(" Pending attachments:")),this.pendingAttachments.forEach((e,t)=>{let n=e.type==="url"?e.data:e.name||`Image ${t+1}`;Q(w.dim(` ${t+1}. `)+w.info(n));}),Q("");}clearPendingAttachments(){if(this.pendingAttachments.length===0){this.logInfo("\u9644\u4EF6\u5217\u8868","\u6CA1\u6709\u53EF\u6E05\u9664\u7684\u9644\u4EF6\u3002");return}this.pendingAttachments=[],this.logInfo("\u9644\u4EF6\u5DF2\u6E05\u9664","\u6240\u6709\u5F85\u53D1\u9001\u9644\u4EF6\u5DF2\u79FB\u9664\u3002");}removePendingAttachment(e){if(e<0||e>=this.pendingAttachments.length){this.logInfo("\u9644\u4EF6\u7D22\u5F15\u65E0\u6548",`\u5F53\u524D\u5171\u6709 ${this.pendingAttachments.length} \u4E2A\u9644\u4EF6\u3002`);return}let[t]=this.pendingAttachments.splice(e,1),n=t.type==="url"?t.data:t.name||`Attachment #${e+1}`;this.logInfo("\u5DF2\u79FB\u9664\u9644\u4EF6",n);}};function vj(){if(process.platform==="win32"){let e=process.env.USERPROFILE,t=process.env.APPDATA;if(e){let n=Ie.join(e,".codex","config.toml");if(wt.existsSync(n))return n}if(t){let n=Ie.join(t,"codex","config.toml");if(wt.existsSync(n))return n}return null}else {let e=process.env.HOME;if(!e)return null;let t=Ie.join(e,".codex","config.toml");return wt.existsSync(t)?t:null}}function Cj(s){let e={providers:{}},t=s.split(`
|
|
3979
|
-
`),n="",r="";for(let o of t){let i=o.trim();if(!i||i.startsWith("#"))continue;let a=i.match(/^\[model_providers\.([^\]]+)\]$/);if(a){n="model_providers",r=a[1],e.providers[r]={name:r};continue}if(i.startsWith("[")&&i.endsWith("]")){n="",r="";continue}let l=i.match(/^(\w+)\s*=\s*"?([^"]*)"?$/);if(l&&!n){let[,c,u]=l;c==="model_provider"?e.defaultProvider=u:c==="model"&&(e.defaultModel=u);continue}if(n==="model_providers"&&r){let c=i.match(/^(\w+)\s*=\s*(.+)$/);if(c){let[,u,d]=c,p=d.trim();p.startsWith('"')&&p.endsWith('"')?p=p.slice(1,-1):p==="true"?p=true:p==="false"&&(p=false);let g=e.providers[r];switch(u){case "name":g.name=p;break;case "base_url":g.base_url=p;break;case "wire_api":g.wire_api=p;break;case "env_key":g.env_key=p;break;case "temp_env_key":g.temp_env_key=p;break;case "requires_openai_auth":g.requires_openai_auth=p;break;case "model":g.model=p;break}}}}return e}function wj(){let s=[],e=vj();if(!e)return s;try{let t=wt.readFileSync(e,"utf-8"),n=Cj(t),r=Ie.join(Ie.dirname(e),"auth.json"),o={};if(wt.existsSync(r))try{o=JSON.parse(wt.readFileSync(r,"utf-8"));}catch{}let i=n.defaultProvider;for(let[a,l]of Object.entries(n.providers)){let c;if(l.env_key&&process.env[l.env_key]&&(c=process.env[l.env_key]),!c&&l.temp_env_key&&process.env[l.temp_env_key]&&(c=process.env[l.temp_env_key]),!c&&l.temp_env_key&&o[l.temp_env_key]&&(c=o[l.temp_env_key]),!c&&l.env_key&&o[l.env_key]&&(c=o[l.env_key]),!c&&l.requires_openai_auth&&(c=o.OPENAI_API_KEY||process.env.OPENAI_API_KEY),c||(c=process.env.CODEX_API_KEY||process.env[`${a.toUpperCase()}_API_KEY`]),!c||!c.trim())continue;let u="openai";l.wire_api==="responses"&&(u="openai-responses");let d=[];l.model?d.push(l.model):n.defaultModel?d.push(n.defaultModel):d.push("gpt-5.2-codex","gpt-5.1-codex"),s.push({name:`Codex (${l.name||a})`,protocol:u,apiKey:c.trim(),baseUrl:l.base_url,models:d});}}catch(t){process.env.CLI_DEBUG==="1"&&console.error(`Failed to read Codex config: ${t}`);}return s}function LI(){let s=[],e=process.env.ANTHROPIC_API_KEY||process.env.ANTHROPIC_AUTH_TOKEN;e&&e.trim()&&s.push({name:"Anthropic",protocol:"anthropic",apiKey:e.trim(),baseUrl:process.env.ANTHROPIC_BASE_URL?.trim(),models:["claude-opus-4-6","claude-sonnet-4-5-20250929","claude-3-5-sonnet-20241022"]});let t=process.env.OPENAI_API_KEY,n=process.env.OPENAI_BASE_URL?.trim();if(t&&t.trim()){let l=process.env.OPENAI_PROTOCOL==="responses"||process.env.OPENAI_PROTOCOL==="openai-responses"?"openai-responses":process.env.OPENAI_PROTOCOL==="anthropic"||process.env.OPENAI_PROTOCOL==="anthropic-openai"?"anthropic-openai":"openai",c=l==="openai-responses"?["gpt-5.1","o3-mini"]:["gpt-4o","gpt-4-turbo","gpt-3.5-turbo"];s.push({name:n?"OpenAI Proxy":"OpenAI",protocol:l,apiKey:t.trim(),baseUrl:n,models:c});}let r=process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY;r&&r.trim()&&s.push({name:"Gemini",protocol:"gemini",apiKey:r.trim(),baseUrl:process.env.GEMINI_BASE_URL?.trim(),models:["gemini-2.0-flash-exp","gemini-1.5-pro"]});let o=process.env.MOONSHOT_API_KEY||process.env.KIMI_API_KEY;o&&o.trim()&&s.push({name:"Kimi (Moonshot)",protocol:"kimi",apiKey:o.trim(),baseUrl:process.env.MOONSHOT_BASE_URL?.trim()||process.env.KIMI_BASE_URL?.trim(),models:["kimi-k2-0905-preview"]});let i=process.env.DOUBAO_API_KEY||process.env.VOLCENGINE_API_KEY;i&&i.trim()&&s.push({name:"Doubao",protocol:"doubao",apiKey:i.trim(),baseUrl:process.env.DOUBAO_BASE_URL?.trim(),models:["doubao-pro-256k"]});let a=wj();for(let l of a)s.push(l);if(a.length===0){let l=process.env.CODEX_API_KEY,c=process.env.CODEX_BASE_URL?.trim();l&&l.trim()&&s.push({name:"Codex",protocol:"openai-responses",apiKey:l.trim(),baseUrl:c,models:["gpt-5.2-codex","gpt-5.1-codex"]});}return s}function NI(){let s=He(),t=new
|
|
3986
|
+
`),n="",r="";for(let o of t){let i=o.trim();if(!i||i.startsWith("#"))continue;let a=i.match(/^\[model_providers\.([^\]]+)\]$/);if(a){n="model_providers",r=a[1],e.providers[r]={name:r};continue}if(i.startsWith("[")&&i.endsWith("]")){n="",r="";continue}let l=i.match(/^(\w+)\s*=\s*"?([^"]*)"?$/);if(l&&!n){let[,c,u]=l;c==="model_provider"?e.defaultProvider=u:c==="model"&&(e.defaultModel=u);continue}if(n==="model_providers"&&r){let c=i.match(/^(\w+)\s*=\s*(.+)$/);if(c){let[,u,d]=c,p=d.trim();p.startsWith('"')&&p.endsWith('"')?p=p.slice(1,-1):p==="true"?p=true:p==="false"&&(p=false);let g=e.providers[r];switch(u){case "name":g.name=p;break;case "base_url":g.base_url=p;break;case "wire_api":g.wire_api=p;break;case "env_key":g.env_key=p;break;case "temp_env_key":g.temp_env_key=p;break;case "requires_openai_auth":g.requires_openai_auth=p;break;case "model":g.model=p;break}}}}return e}function wj(){let s=[],e=vj();if(!e)return s;try{let t=wt.readFileSync(e,"utf-8"),n=Cj(t),r=Ie.join(Ie.dirname(e),"auth.json"),o={};if(wt.existsSync(r))try{o=JSON.parse(wt.readFileSync(r,"utf-8"));}catch{}let i=n.defaultProvider;for(let[a,l]of Object.entries(n.providers)){let c;if(l.env_key&&process.env[l.env_key]&&(c=process.env[l.env_key]),!c&&l.temp_env_key&&process.env[l.temp_env_key]&&(c=process.env[l.temp_env_key]),!c&&l.temp_env_key&&o[l.temp_env_key]&&(c=o[l.temp_env_key]),!c&&l.env_key&&o[l.env_key]&&(c=o[l.env_key]),!c&&l.requires_openai_auth&&(c=o.OPENAI_API_KEY||process.env.OPENAI_API_KEY),c||(c=process.env.CODEX_API_KEY||process.env[`${a.toUpperCase()}_API_KEY`]),!c||!c.trim())continue;let u="openai";l.wire_api==="responses"&&(u="openai-responses");let d=[];l.model?d.push(l.model):n.defaultModel?d.push(n.defaultModel):d.push("gpt-5.2-codex","gpt-5.1-codex"),s.push({name:`Codex (${l.name||a})`,protocol:u,apiKey:c.trim(),baseUrl:l.base_url,models:d});}}catch(t){process.env.CLI_DEBUG==="1"&&console.error(`Failed to read Codex config: ${t}`);}return s}function LI(){let s=[],e=process.env.ANTHROPIC_API_KEY||process.env.ANTHROPIC_AUTH_TOKEN;e&&e.trim()&&s.push({name:"Anthropic",protocol:"anthropic",apiKey:e.trim(),baseUrl:process.env.ANTHROPIC_BASE_URL?.trim(),models:["claude-opus-4-6","claude-sonnet-4-5-20250929","claude-3-5-sonnet-20241022"]});let t=process.env.OPENAI_API_KEY,n=process.env.OPENAI_BASE_URL?.trim();if(t&&t.trim()){let l=process.env.OPENAI_PROTOCOL==="responses"||process.env.OPENAI_PROTOCOL==="openai-responses"?"openai-responses":process.env.OPENAI_PROTOCOL==="anthropic"||process.env.OPENAI_PROTOCOL==="anthropic-openai"?"anthropic-openai":"openai",c=l==="openai-responses"?["gpt-5.1","o3-mini"]:["gpt-4o","gpt-4-turbo","gpt-3.5-turbo"];s.push({name:n?"OpenAI Proxy":"OpenAI",protocol:l,apiKey:t.trim(),baseUrl:n,models:c});}let r=process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY;r&&r.trim()&&s.push({name:"Gemini",protocol:"gemini",apiKey:r.trim(),baseUrl:process.env.GEMINI_BASE_URL?.trim(),models:["gemini-2.0-flash-exp","gemini-1.5-pro"]});let o=process.env.MOONSHOT_API_KEY||process.env.KIMI_API_KEY;o&&o.trim()&&s.push({name:"Kimi (Moonshot)",protocol:"kimi",apiKey:o.trim(),baseUrl:process.env.MOONSHOT_BASE_URL?.trim()||process.env.KIMI_BASE_URL?.trim(),models:["kimi-k2-0905-preview"]});let i=process.env.DOUBAO_API_KEY||process.env.VOLCENGINE_API_KEY;i&&i.trim()&&s.push({name:"Doubao",protocol:"doubao",apiKey:i.trim(),baseUrl:process.env.DOUBAO_BASE_URL?.trim(),models:["doubao-pro-256k"]});let a=wj();for(let l of a)s.push(l);if(a.length===0){let l=process.env.CODEX_API_KEY,c=process.env.CODEX_BASE_URL?.trim();l&&l.trim()&&s.push({name:"Codex",protocol:"openai-responses",apiKey:l.trim(),baseUrl:c,models:["gpt-5.2-codex","gpt-5.1-codex"]});}return s}function NI(){let s=He(),t=new rt(s).getDefaultProvider();return !(t&&t.apiKey&&t.apiKey.trim().length>0)}async function Tj(){let s=LI();return new Promise(e=>{let t=false,n=vo(A.createElement(Nx,{detectedProviders:s,onComplete:()=>{t||(t=true,n.unmount(),e("exit"));},onStartSetup:()=>{t||(t=true,n.unmount(),e("setup"));},onManualEdit:()=>{t||(t=true,n.unmount(),e("manual"));},onAutoCreate:()=>{t||(t=true,n.unmount(),e("auto"));}}),{stdout:process.stdout,stdin:process.stdin,exitOnCtrlC:false,patchConsole:false});})}function xj(){let s=LI();if(s.length===0)return false;let e=He(),t=new rt(e);for(let n of s)t.addProvider({name:n.name,protocol:n.protocol,apiKey:n.apiKey,baseUrl:n.baseUrl,models:n.models,defaultModel:n.models[0],setAsDefault:s.length===1});return console.log(),console.log(Oe.green(`\u2713 \u5DF2\u4ECE\u73AF\u5883\u53D8\u91CF\u521B\u5EFA ${s.length} \u4E2A Provider\uFF01`)),console.log(Oe.dim(` \u914D\u7F6E\u5DF2\u4FDD\u5B58\u5230: ${Ln}`)),console.log(),true}async function $I(){let s=He(),t=new rt(s).getDefaultProvider();if(t&&t.apiKey&&t.apiKey.trim().length>0)return;let n=await Sj();n||(console.log(),console.log(Oe.red("\u914D\u7F6E\u5DF2\u53D6\u6D88")),process.exit(1));let r=n.protocol,o=n.baseUrl?.trim()||fs[r],i=[n.model],a={providers:{}};new rt(a).addProvider({name:n.name.trim(),protocol:r,apiKey:n.apiKey.trim(),baseUrl:o,defaultModel:n.model,models:i,setAsDefault:true}),console.log(),console.log(Oe.green(`\u2713 Provider "${n.name.trim()}" \u914D\u7F6E\u6210\u529F!`)),console.log(Oe.dim(` \u914D\u7F6E\u5DF2\u4FDD\u5B58\u5230: ${Ln}`)),console.log();}async function Sj(){return new Promise(s=>{let e=false,t=vo(A.createElement($x,{onComplete:n=>{e||(e=true,t.unmount(),s(n));},onCancel:()=>{e||(e=true,t.unmount(),s(null));}}),{stdout:process.stdout,stdin:process.stdin,exitOnCtrlC:false,patchConsole:false});})}async function kj(){let s=process.argv.slice(2);if(s[0]==="mcp"){let t=Ie.resolve(process.cwd()),n=await fI(s.slice(1),{workDir:t});process.exit(n);}if(s[0]==="daemon"){let{handleDaemonCommand:t}=await Promise.resolve().then(()=>(xI(),TI));await t(s.slice(1)),process.exit(0);}let e=Py();if(e.debug&&(process.env.CLI_DEBUG="1"),(e.debug||e.debugConsole)&&(process.env.CLI_DEBUG_CONSOLE="1"),m.info("CLI","Arguments parsed",{model:e.model,provider:e.provider,workDir:e.workDir,debug:process.env.CLI_DEBUG==="1",debugConsole:process.env.CLI_DEBUG_CONSOLE==="1"}),e.unknownArgs&&e.unknownArgs.length>0&&(console.error(Oe.red(`\u9519\u8BEF: \u4E0D\u652F\u6301\u7684\u53C2\u6570: ${e.unknownArgs.join(", ")}`)),console.error(Oe.yellow("\u4F7F\u7528 'neox --help' \u67E5\u770B\u652F\u6301\u7684\u53C2\u6570\u5217\u8868")),process.exit(1)),e.help&&(g0(Jd),process.exit(0)),e.version&&(h0(Jd),process.exit(0)),e._[0]==="update"){let{handleUpdateCommand:t}=await Promise.resolve().then(()=>(fp(),sb));await t(),process.exit(0);}try{if(m.debug("BOOT","main() try block entered"),NI()){m.debug("BOOT","needsProviderConfiguration=true, showing wizard");let n=await Tj();if(m.debug("BOOT",`wizard action=${n}`),n==="exit"&&process.exit(0),n==="auto"&&xj(),n==="manual"){console.log(),console.log(Oe.yellow("\u8BF7\u7F16\u8F91\u914D\u7F6E\u6587\u4EF6\u5E76\u586B\u5165\u60A8\u7684 API Key:")),console.log(Oe.cyan(` ${Ln}`)),console.log();let{spawn:r}=await import('child_process'),{isWSL:o}=await Promise.resolve().then(()=>(qr(),rv)),i;process.env.EDITOR||process.env.VISUAL?i=process.env.EDITOR||process.env.VISUAL:process.platform==="darwin"?i="open":o()?i="wslview":i="xdg-open",console.log(Oe.dim(` \u4F7F\u7528 ${i} \u6253\u5F00\u914D\u7F6E\u6587\u4EF6...`)),r(i,[Ln],{detached:!0,stdio:"ignore"}).unref(),console.log(),console.log(Oe.dim("\u7F16\u8F91\u5B8C\u6210\u540E\uFF0C\u8BF7\u91CD\u65B0\u8FD0\u884C CLI\u3002")),console.log(),process.exit(0);}}m.debug("BOOT","ensureProviderConfigured..."),await $I(),m.debug("BOOT","creating NeoxCLI...");let t=new ub(e.model,e.workDir,e.provider,e);m.debug("BOOT","cli.init()..."),await t.init(),m.debug("BOOT","cli.init() done, runInteractive()..."),m.info("CLI","CLI initialized successfully"),await t.runInteractive();}catch(t){throw m.error("BOOT",`FATAL: ${t.message}`,{stack:t.stack}),m.error("CLI","Fatal error in main",{error:t.message,stack:t.stack}),t}}process.on("SIGINT",()=>{Bt.getBackgroundRunning().length>0&&Bt.killAll(true),bp||process.exit(0);});var PI=Date.now(),_j=1e3,Ij=5e3,Ej=6e4,Aj=setInterval(()=>{let s=Date.now(),e=s-PI;PI=s,e>Ij&&e<Ej&&m.warn("EVENT_LOOP",`\u26A0\uFE0F Event loop blocked for ${Math.round(e/1e3)}s`,{elapsedMs:e,elapsedSec:Math.round(e/1e3)});},_j);Aj.unref();process.on("SIGTERM",()=>{m.debug("TTY_STATE","\u{1F534} [CRITICAL] SIGTERM received"),Bt.killAll(true),process.stdin.isTTY&&(m.debug("TTY_STATE","\u{1F534} [CRITICAL] About to call setRawMode(false) in SIGTERM handler"),m.debug("TTY_STATE",` Stack: ${new Error().stack?.split(`
|
|
3980
3987
|
`).slice(1,4).join(" -> ")}`),process.stdin.setRawMode(false),m.debug("TTY_STATE","\u2705 setRawMode(false) completed in SIGTERM")),process.exit(0);});try{m.debug("TTY_STATE","\u{1F6E1}\uFE0F Registering SIGTSTP ignore handler"),process.on("SIGTSTP",()=>{m.error("TTY_STATE","\u{1F6A8}\u{1F6A8}\u{1F6A8} SIGTSTP (Ctrl+Z) RECEIVED! This should have been ignored!"),m.error("TTY_STATE",` Stack: ${new Error().stack}`);}),m.debug("TTY_STATE","\u2705 SIGTSTP monitoring handler registered");}catch{m.debug("TTY_STATE","\u26A0\uFE0F SIGTSTP not supported on this platform");}try{m.debug("TTY_STATE","\u{1F6E1}\uFE0F [CRITICAL] Registering SIGTTIN ignore handler"),process.on("SIGTTIN",()=>{m.error("TTY_STATE","\u{1F6A8}\u{1F6A8}\u{1F6A8} SIGTTIN RECEIVED! This should have been ignored!"),m.error("TTY_STATE",` stdin.isTTY: ${process.stdin.isTTY}`),m.error("TTY_STATE",` stdin.isRaw: ${process.stdin.isRaw}`),m.error("TTY_STATE",` stdin.destroyed: ${process.stdin.destroyed}`),m.error("TTY_STATE",` Stack: ${new Error().stack}`);}),m.debug("TTY_STATE","\u2705 SIGTTIN monitoring handler registered");}catch{m.debug("TTY_STATE","\u26A0\uFE0F SIGTTIN not supported on this platform");}try{m.debug("TTY_STATE","\u{1F6E1}\uFE0F [CRITICAL] Registering SIGTTOU ignore handler"),process.on("SIGTTOU",()=>{m.error("TTY_STATE","\u{1F6A8}\u{1F6A8}\u{1F6A8} SIGTTOU RECEIVED! This should have been ignored!"),m.error("TTY_STATE",` stdout.isTTY: ${process.stdout.isTTY}`),m.error("TTY_STATE",` Stack: ${new Error().stack}`);}),m.debug("TTY_STATE","\u2705 SIGTTOU monitoring handler registered");}catch{m.debug("TTY_STATE","\u26A0\uFE0F SIGTTOU not supported on this platform");}process.on("SIGCONT",()=>{if(m.debug("TTY_STATE","\u{1F504} [CRITICAL] SIGCONT received (process resumed)"),process.stdin.isTTY&&!process.stdin.destroyed)try{let s=process.stdin.isRaw;m.debug("TTY_STATE",` wasRaw: ${s}`),s!==!1&&(m.debug("TTY_STATE","\u{1F534} About to call setRawMode(true) in SIGCONT"),process.stdin.setRawMode(!0),m.debug("TTY_STATE","\u2705 setRawMode(true) completed in SIGCONT")),process.stdin.resume(),m.debug("SIGNAL","SIGCONT: stdin recovered after resume");}catch(s){m.warn("SIGNAL","SIGCONT: failed to recover stdin",{error:s});}});process.on("exit",s=>{m.debug("BOOT",`process.exit event, code=${s}`),m.debug("TTY_STATE","\u{1F534} [CRITICAL] exit event triggered"),process.stdin.isTTY&&(m.debug("TTY_STATE","\u{1F534} [CRITICAL] About to call setRawMode(false) in exit handler"),process.stdin.setRawMode(false),m.debug("TTY_STATE","\u2705 setRawMode(false) completed in exit"));});if(process.env.NEOX_WORKER==="execute_shell"){let{runExecuteShellWorker:s}=await Promise.resolve().then(()=>(II(),_I));await s(),process.exit(0);}kj().catch(s=>{m.error("BOOT",`main() top-level catch: ${s.message}`,{stack:s.stack}),m.debug("TTY_STATE","\u{1F534} [CRITICAL] Unhandled error in main()"),process.stdin.isTTY&&(m.debug("TTY_STATE","\u{1F534} [CRITICAL] About to call setRawMode(false) in main() catch"),m.debug("TTY_STATE",` Error: ${s.message}`),process.stdin.setRawMode(false),m.debug("TTY_STATE","\u2705 setRawMode(false) completed in main() catch")),console.error(Oe.red(`
|
|
3981
3988
|
[x] Unexpected error:`),s.message),process.exit(1);});export{lb as originalConsole};
|