@memo-code/memo 0.5.1 → 0.5.13

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.
Files changed (3) hide show
  1. package/README.md +1 -0
  2. package/dist/index.js +47 -47
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -48,6 +48,7 @@ memo
48
48
  - 交互式:`memo`(默认 TUI,支持多轮、流式、工具可视化、快捷键)。
49
49
  - 单轮:`memo "你的问题" --once`(纯文本输出,适合脚本)。
50
50
  - 危险模式:`memo --dangerous` 或 `memo -d`(跳过工具审批,谨慎使用)。
51
+ - 查看版本:`memo --version` 或 `memo -v`。
51
52
 
52
53
  ## 配置文件
53
54
 
package/dist/index.js CHANGED
@@ -1,23 +1,23 @@
1
1
  #!/usr/bin/env node
2
- var Kr=Object.create;var An=Object.defineProperty;var Jr=Object.getOwnPropertyDescriptor;var qr=Object.getOwnPropertyNames;var Xr=Object.getPrototypeOf,Yr=Object.prototype.hasOwnProperty;var Mn=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Zr=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of qr(e))!Yr.call(t,r)&&r!==n&&An(t,r,{get:()=>e[r],enumerable:!(o=Jr(e,r))||o.enumerable});return t};var Pn=(t,e,n)=>(n=t!=null?Kr(Xr(t)):{},Zr(e||!t||!t.__esModule?An(n,"default",{value:t,enumerable:!0}):n,t));var Fn=Mn((gu,Bn)=>{"use strict";function Ln(t){return Array.isArray(t)?t:[t]}var Ft="",Nn=" ",Ht="\\",ms=/^\s+$/,ds=/(?:[^\\]|^)\\$/,fs=/^\\!/,gs=/^\\#/,hs=/\r?\n/g,ys=/^\.*\/|^\.+$/,Bt="/",Un="node-ignore";typeof Symbol<"u"&&(Un=Symbol.for("node-ignore"));var On=Un,xs=(t,e,n)=>Object.defineProperty(t,e,{value:n}),vs=/([0-z])-([0-z])/g,jn=()=>!1,Ts=t=>t.replace(vs,(e,n,o)=>n.charCodeAt(0)<=o.charCodeAt(0)?e:Ft),Ss=t=>{let{length:e}=t;return t.slice(0,e-e%2)},ks=[[/^\uFEFF/,()=>Ft],[/((?:\\\\)*?)(\\?\s+)$/,(t,e,n)=>e+(n.indexOf("\\")===0?Nn:Ft)],[/(\\+?)\s/g,(t,e)=>{let{length:n}=e;return e.slice(0,n-n%2)+Nn}],[/[\\$.|*+(){^]/g,t=>`\\${t}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(t,e,n)=>e+6<n.length?"(?:\\/[^\\/]+)*":"\\/.+"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(t,e,n)=>{let o=n.replace(/\\\*/g,"[^\\/]*");return e+o}],[/\\\\\\(?=[$.|*+(){^])/g,()=>Ht],[/\\\\/g,()=>Ht],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(t,e,n,o,r)=>e===Ht?`\\[${n}${Ss(o)}${r}`:r==="]"&&o.length%2===0?`[${Ts(n)}${o}]`:"[]"],[/(?:[^*])$/,t=>/\/$/.test(t)?`${t}$`:`${t}(?=$|\\/$)`],[/(\^|\\\/)?\\\*$/,(t,e)=>`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`]],Dn=Object.create(null),_s=(t,e)=>{let n=Dn[t];return n||(n=ks.reduce((o,[r,s])=>o.replace(r,s.bind(t)),t),Dn[t]=n),e?new RegExp(n,"i"):new RegExp(n)},zt=t=>typeof t=="string",bs=t=>t&&zt(t)&&!ms.test(t)&&!ds.test(t)&&t.indexOf("#")!==0,ws=t=>t.split(hs),Vt=class{constructor(e,n,o,r){this.origin=e,this.pattern=n,this.negative=o,this.regex=r}},Cs=(t,e)=>{let n=t,o=!1;t.indexOf("!")===0&&(o=!0,t=t.substr(1)),t=t.replace(fs,"!").replace(gs,"#");let r=_s(t,e);return new Vt(n,t,o,r)},Es=(t,e)=>{throw new e(t)},ge=(t,e,n)=>zt(t)?t?ge.isNotRelative(t)?n(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:n("path must not be empty",TypeError):n(`path must be a string, but got \`${e}\``,TypeError),Hn=t=>ys.test(t);ge.isNotRelative=Hn;ge.convert=t=>t;var Gt=class{constructor({ignorecase:e=!0,ignoreCase:n=e,allowRelativePaths:o=!1}={}){xs(this,On,!0),this._rules=[],this._ignoreCase=n,this._allowRelativePaths=o,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[On]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(bs(e)){let n=Cs(e,this._ignoreCase);this._added=!0,this._rules.push(n)}}add(e){return this._added=!1,Ln(zt(e)?ws(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,n){let o=!1,r=!1;return this._rules.forEach(s=>{let{negative:i}=s;if(r===i&&o!==r||i&&!o&&!r&&!n)return;s.regex.test(e)&&(o=!i,r=i)}),{ignored:o,unignored:r}}_test(e,n,o,r){let s=e&&ge.convert(e);return ge(s,e,this._allowRelativePaths?jn:Es),this._t(s,n,o,r)}_t(e,n,o,r){if(e in n)return n[e];if(r||(r=e.split(Bt)),r.pop(),!r.length)return n[e]=this._testOne(e,o);let s=this._t(r.join(Bt)+Bt,n,o,r);return n[e]=s.ignored?s:this._testOne(e,o)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return Ln(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},ut=t=>new Gt(t),As=t=>ge(t&&ge.convert(t),t,jn);ut.isPathValid=As;ut.default=ut;Bn.exports=ut;if(typeof process<"u"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let t=n=>/^\\\\\?\\/.test(n)||/["<>|\u0000-\u001F]+/u.test(n)?n:n.replace(/\\/g,"/");ge.convert=t;let e=/^[a-z]:\//i;ge.isNotRelative=n=>e.test(n)||Hn(n)}});var nr=Mn((xd,Mt)=>{"use strict";function Xo(t){return Array.isArray(t)?t:[t]}var sc=void 0,dn="",Jo=" ",mn="\\",ic=/^\s+$/,ac=/(?:[^\\]|^)\\$/,cc=/^\\!/,lc=/^\\#/,uc=/\r?\n/g,pc=/^\.{0,2}\/|^\.{1,2}$/,mc=/\/$/,Ve="/",Yo="node-ignore";typeof Symbol<"u"&&(Yo=Symbol.for("node-ignore"));var Zo=Yo,Ge=(t,e,n)=>(Object.defineProperty(t,e,{value:n}),n),dc=/([0-z])-([0-z])/g,Qo=()=>!1,fc=t=>t.replace(dc,(e,n,o)=>n.charCodeAt(0)<=o.charCodeAt(0)?e:dn),gc=t=>{let{length:e}=t;return t.slice(0,e-e%2)},hc=[[/^\uFEFF/,()=>dn],[/((?:\\\\)*?)(\\?\s+)$/,(t,e,n)=>e+(n.indexOf("\\")===0?Jo:dn)],[/(\\+?)\s/g,(t,e)=>{let{length:n}=e;return e.slice(0,n-n%2)+Jo}],[/[\\$.|*+(){^]/g,t=>`\\${t}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(t,e,n)=>e+6<n.length?"(?:\\/[^\\/]+)*":"\\/.+"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(t,e,n)=>{let o=n.replace(/\\\*/g,"[^\\/]*");return e+o}],[/\\\\\\(?=[$.|*+(){^])/g,()=>mn],[/\\\\/g,()=>mn],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(t,e,n,o,r)=>e===mn?`\\[${n}${gc(o)}${r}`:r==="]"&&o.length%2===0?`[${fc(n)}${o}]`:"[]"],[/(?:[^*])$/,t=>/\/$/.test(t)?`${t}$`:`${t}(?=$|\\/$)`]],yc=/(^|\\\/)?\\\*$/,et="regex",Et="checkRegex",qo="_",xc={[et](t,e){return`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`},[Et](t,e){return`${e?`${e}[^/]*`:"[^/]*"}(?=$|\\/$)`}},vc=t=>hc.reduce((e,[n,o])=>e.replace(n,o.bind(t)),t),At=t=>typeof t=="string",Tc=t=>t&&At(t)&&!ic.test(t)&&!ac.test(t)&&t.indexOf("#")!==0,Sc=t=>t.split(uc).filter(Boolean),fn=class{constructor(e,n,o,r,s,i){this.pattern=e,this.mark=n,this.negative=s,Ge(this,"body",o),Ge(this,"ignoreCase",r),Ge(this,"regexPrefix",i)}get regex(){let e=qo+et;return this[e]?this[e]:this._make(et,e)}get checkRegex(){let e=qo+Et;return this[e]?this[e]:this._make(Et,e)}_make(e,n){let o=this.regexPrefix.replace(yc,xc[e]),r=this.ignoreCase?new RegExp(o,"i"):new RegExp(o);return Ge(this,n,r)}},kc=({pattern:t,mark:e},n)=>{let o=!1,r=t;r.indexOf("!")===0&&(o=!0,r=r.substr(1)),r=r.replace(cc,"!").replace(lc,"#");let s=vc(r);return new fn(t,e,r,n,o,s)},gn=class{constructor(e){this._ignoreCase=e,this._rules=[]}_add(e){if(e&&e[Zo]){this._rules=this._rules.concat(e._rules._rules),this._added=!0;return}if(At(e)&&(e={pattern:e}),Tc(e.pattern)){let n=kc(e,this._ignoreCase);this._added=!0,this._rules.push(n)}}add(e){return this._added=!1,Xo(At(e)?Sc(e):e).forEach(this._add,this),this._added}test(e,n,o){let r=!1,s=!1,i;this._rules.forEach(c=>{let{negative:l}=c;s===l&&r!==s||l&&!r&&!s&&!n||!c[o].test(e)||(r=!l,s=l,i=l?sc:c)});let a={ignored:r,unignored:s};return i&&(a.rule=i),a}},_c=(t,e)=>{throw new e(t)},Se=(t,e,n)=>At(t)?t?Se.isNotRelative(t)?n(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:n("path must not be empty",TypeError):n(`path must be a string, but got \`${e}\``,TypeError),er=t=>pc.test(t);Se.isNotRelative=er;Se.convert=t=>t;var hn=class{constructor({ignorecase:e=!0,ignoreCase:n=e,allowRelativePaths:o=!1}={}){Ge(this,Zo,!0),this._rules=new gn(n),this._strictPathCheck=!o,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(e){return this._rules.add(e)&&this._initCache(),this}addPattern(e){return this.add(e)}_test(e,n,o,r){let s=e&&Se.convert(e);return Se(s,e,this._strictPathCheck?_c:Qo),this._t(s,n,o,r)}checkIgnore(e){if(!mc.test(e))return this.test(e);let n=e.split(Ve).filter(Boolean);if(n.pop(),n.length){let o=this._t(n.join(Ve)+Ve,this._testCache,!0,n);if(o.ignored)return o}return this._rules.test(e,!1,Et)}_t(e,n,o,r){if(e in n)return n[e];if(r||(r=e.split(Ve).filter(Boolean)),r.pop(),!r.length)return n[e]=this._rules.test(e,o,et);let s=this._t(r.join(Ve)+Ve,n,o,r);return n[e]=s.ignored?s:this._rules.test(e,o,et)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return Xo(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},yn=t=>new hn(t),bc=t=>Se(t&&Se.convert(t),t,Qo),tr=()=>{let t=n=>/^\\\\\?\\/.test(n)||/["<>|\u0000-\u001F]+/u.test(n)?n:n.replace(/\\/g,"/");Se.convert=t;let e=/^[a-z]:\//i;Se.isNotRelative=n=>e.test(n)||er(n)};typeof process<"u"&&process.platform==="win32"&&tr();Mt.exports=yn;yn.default=yn;Mt.exports.isPathValid=bc;Ge(Mt.exports,Symbol.for("setupWindows"),tr)});import{randomUUID as Nr}from"crypto";import{createInterface as Gl}from"readline/promises";import{stdin as zl,stdout as Wl}from"process";import{render as Kl}from"ink";import Qr from"os";import{readFile as es}from"fs/promises";import{join as ts,dirname as ns}from"path";import{fileURLToPath as os}from"url";var rs=/{{\s*([\w.-]+)\s*}}/g;function ss(t,e){return t.replace(rs,(n,o)=>e[o]??"")}function is(){try{return Qr.userInfo().username}catch{return process.env.USER??process.env.USERNAME??"unknown"}}async function Rn(){let t=ns(os(import.meta.url)),e=ts(t,"prompt.md"),n=await es(e,"utf-8"),o={date:new Date().toISOString(),user:is(),pwd:process.cwd()};return ss(n,o)}import{appendFile as as,mkdir as cs}from"fs/promises";import{dirname as ls}from"path";var lt=class{constructor(e){this.filePath=e}ready=!1;async append(e){this.ready||(await cs(ls(this.filePath),{recursive:!0}),this.ready=!0),await as(this.filePath,`${JSON.stringify(e)}
3
- `,"utf8")}async flush(){return Promise.resolve()}};function $n(t){return{ts:new Date().toISOString(),sessionId:t.sessionId,turn:t.turn,step:t.step,type:t.type,content:t.content,role:t.role,meta:t.meta}}import{spawn as us}from"child_process";import{z as jt}from"zod";function b(t,e=!1){return{content:[{type:"text",text:t}],isError:e}}var ps=jt.object({command:jt.string().min(1,"command \u4E0D\u80FD\u4E3A\u7A7A"),timeout:jt.number().int("timeout \u5FC5\u987B\u662F\u6574\u6570\u6BEB\u79D2").positive("timeout \u5FC5\u987B\u5927\u4E8E 0").max(3600*1e3,"timeout \u4E0D\u80FD\u8D85\u8FC7 1 \u5C0F\u65F6").optional()}).strict(),In={name:"bash",description:"\u5728 shell \u4E2D\u6267\u884C\u547D\u4EE4\uFF0C\u8FD4\u56DE exit/stdout/stderr",inputSchema:ps,execute:async({command:t,timeout:e})=>{let n=t.trim();if(!n)return b("bash \u9700\u8981\u8981\u6267\u884C\u7684\u547D\u4EE4",!0);try{let o=us("bash",["-lc",n],{env:process.env,stdio:["ignore","pipe","pipe"]}),r=m=>new Promise(_=>{if(!m)return _("");let y=[];m.setEncoding("utf8"),m.on("data",C=>y.push(C)),m.on("error",()=>_("")),m.on("end",()=>_(y.join("")))}),s=r(o.stdout),i=r(o.stderr),a,c=new Promise((m,_)=>{o.on("error",y=>_(y)),o.on("close",y=>m(typeof y=="number"?y:-1))}),l=e&&e>0?new Promise((m,_)=>{a=setTimeout(()=>{o.kill(),_(new Error(`bash \u8D85\u65F6 ${e}ms\uFF0C\u5DF2\u7EC8\u6B62\u8FDB\u7A0B`))},e)}):null,u=l?await Promise.race([c,l]):await c;a&&clearTimeout(a);let[p,v]=await Promise.all([s,i]);return b(`exit=${u} stdout="${p}" stderr="${v}"`)}catch(o){return b(`bash \u6267\u884C\u5931\u8D25: ${o.message}`,!0)}}};import{access as Bs,readFile as Fs,writeFile as Vs}from"fs/promises";var Wn=Pn(Fn(),1);import{normalize as Ms,resolve as zn,dirname as Vn,join as Wt,relative as Ps}from"path";import{existsSync as Kt,statSync as Rs}from"fs";import{readFile as $s}from"fs/promises";function pe(t){return Ms(zn(t))}var Is=["node_modules/",".git/","dist/","out/","build/","coverage/",".cache/",".idea/",".DS_Store",".next/",".turbo/",".pnpm/",".pnpm-store/","*.log","logs/","tmp/","temp/","vendor/"],Ls=100,Ns=1e4,Os="<system_hint>\u5F53\u524D\u67E5\u627E\u7ED3\u679C\u8FC7\u591A\uFF0C\u8BF7\u7EC6\u5316\u67E5\u627E\u8303\u56F4\uFF08\u7F29\u5C0F\u76EE\u5F55\u3001\u589E\u52A0\u66F4\u5177\u4F53\u7684 pattern/glob \u6216\u5173\u952E\u8BCD\uFF09\u3002</system_hint>",Gn=new Map;function Ds(t){return t.replace(/\\/g,"/")}function Us(t){let e=zn(t);try{Rs(e).isFile()&&(e=Vn(e))}catch{e=process.cwd()}let n=e;for(;;){if(Kt(Wt(e,".gitignore"))||Kt(Wt(e,".git")))return e;let o=Vn(e);if(o===e)return n;e=o}}async function js(t){let e=Wt(t,".gitignore");return Kt(e)?(await $s(e,"utf8")).split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")):[]}async function Hs(t){let e=(0,Wn.default)();e.add(Is);let n=await js(t);return n.length>0&&e.add(n),{root:t,ignores:o=>{let r=Ps(t,o);return!r||r.startsWith("..")?!1:e.ignores(Ds(r))}}}async function pt(t){let e=Us(t),n=Gn.get(e);if(n)return n;let o=Hs(e);return Gn.set(e,o),o}function mt(t,e){return e>Ls||t.length>Ns?`${t}
2
+ var Zr=Object.create;var $n=Object.defineProperty;var Qr=Object.getOwnPropertyDescriptor;var es=Object.getOwnPropertyNames;var ts=Object.getPrototypeOf,ns=Object.prototype.hasOwnProperty;var In=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var os=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of es(e))!ns.call(t,r)&&r!==n&&$n(t,r,{get:()=>e[r],enumerable:!(o=Qr(e,r))||o.enumerable});return t};var Ln=(t,e,n)=>(n=t!=null?Zr(ts(t)):{},os(e||!t||!t.__esModule?$n(n,"default",{value:t,enumerable:!0}):n,t));var Wn=In((Su,zn)=>{"use strict";function Un(t){return Array.isArray(t)?t:[t]}var Gt="",jn=" ",Ft="\\",ys=/^\s+$/,xs=/(?:[^\\]|^)\\$/,vs=/^\\!/,Ts=/^\\#/,Ss=/\r?\n/g,ks=/^\.*\/|^\.+$/,Vt="/",Fn="node-ignore";typeof Symbol<"u"&&(Fn=Symbol.for("node-ignore"));var Hn=Fn,bs=(t,e,n)=>Object.defineProperty(t,e,{value:n}),ws=/([0-z])-([0-z])/g,Vn=()=>!1,_s=t=>t.replace(ws,(e,n,o)=>n.charCodeAt(0)<=o.charCodeAt(0)?e:Gt),Cs=t=>{let{length:e}=t;return t.slice(0,e-e%2)},Es=[[/^\uFEFF/,()=>Gt],[/((?:\\\\)*?)(\\?\s+)$/,(t,e,n)=>e+(n.indexOf("\\")===0?jn:Gt)],[/(\\+?)\s/g,(t,e)=>{let{length:n}=e;return e.slice(0,n-n%2)+jn}],[/[\\$.|*+(){^]/g,t=>`\\${t}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(t,e,n)=>e+6<n.length?"(?:\\/[^\\/]+)*":"\\/.+"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(t,e,n)=>{let o=n.replace(/\\\*/g,"[^\\/]*");return e+o}],[/\\\\\\(?=[$.|*+(){^])/g,()=>Ft],[/\\\\/g,()=>Ft],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(t,e,n,o,r)=>e===Ft?`\\[${n}${Cs(o)}${r}`:r==="]"&&o.length%2===0?`[${_s(n)}${o}]`:"[]"],[/(?:[^*])$/,t=>/\/$/.test(t)?`${t}$`:`${t}(?=$|\\/$)`],[/(\^|\\\/)?\\\*$/,(t,e)=>`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`]],Bn=Object.create(null),As=(t,e)=>{let n=Bn[t];return n||(n=Es.reduce((o,[r,s])=>o.replace(r,s.bind(t)),t),Bn[t]=n),e?new RegExp(n,"i"):new RegExp(n)},Kt=t=>typeof t=="string",Ms=t=>t&&Kt(t)&&!ys.test(t)&&!xs.test(t)&&t.indexOf("#")!==0,Ps=t=>t.split(Ss),zt=class{constructor(e,n,o,r){this.origin=e,this.pattern=n,this.negative=o,this.regex=r}},Rs=(t,e)=>{let n=t,o=!1;t.indexOf("!")===0&&(o=!0,t=t.substr(1)),t=t.replace(vs,"!").replace(Ts,"#");let r=As(t,e);return new zt(n,t,o,r)},$s=(t,e)=>{throw new e(t)},ye=(t,e,n)=>Kt(t)?t?ye.isNotRelative(t)?n(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:n("path must not be empty",TypeError):n(`path must be a string, but got \`${e}\``,TypeError),Gn=t=>ks.test(t);ye.isNotRelative=Gn;ye.convert=t=>t;var Wt=class{constructor({ignorecase:e=!0,ignoreCase:n=e,allowRelativePaths:o=!1}={}){bs(this,Hn,!0),this._rules=[],this._ignoreCase=n,this._allowRelativePaths=o,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[Hn]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(Ms(e)){let n=Rs(e,this._ignoreCase);this._added=!0,this._rules.push(n)}}add(e){return this._added=!1,Un(Kt(e)?Ps(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,n){let o=!1,r=!1;return this._rules.forEach(s=>{let{negative:i}=s;if(r===i&&o!==r||i&&!o&&!r&&!n)return;s.regex.test(e)&&(o=!i,r=i)}),{ignored:o,unignored:r}}_test(e,n,o,r){let s=e&&ye.convert(e);return ye(s,e,this._allowRelativePaths?Vn:$s),this._t(s,n,o,r)}_t(e,n,o,r){if(e in n)return n[e];if(r||(r=e.split(Vt)),r.pop(),!r.length)return n[e]=this._testOne(e,o);let s=this._t(r.join(Vt)+Vt,n,o,r);return n[e]=s.ignored?s:this._testOne(e,o)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return Un(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},lt=t=>new Wt(t),Is=t=>ye(t&&ye.convert(t),t,Vn);lt.isPathValid=Is;lt.default=lt;zn.exports=lt;if(typeof process<"u"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let t=n=>/^\\\\\?\\/.test(n)||/["<>|\u0000-\u001F]+/u.test(n)?n:n.replace(/\\/g,"/");ye.convert=t;let e=/^[a-z]:\//i;ye.isNotRelative=n=>e.test(n)||Gn(n)}});var ir=In((wd,At)=>{"use strict";function er(t){return Array.isArray(t)?t:[t]}var uc=void 0,gn="",Zo=" ",fn="\\",pc=/^\s+$/,mc=/(?:[^\\]|^)\\$/,dc=/^\\!/,fc=/^\\#/,gc=/\r?\n/g,hc=/^\.{0,2}\/|^\.{1,2}$/,yc=/\/$/,Ve="/",tr="node-ignore";typeof Symbol<"u"&&(tr=Symbol.for("node-ignore"));var nr=tr,Ge=(t,e,n)=>(Object.defineProperty(t,e,{value:n}),n),xc=/([0-z])-([0-z])/g,or=()=>!1,vc=t=>t.replace(xc,(e,n,o)=>n.charCodeAt(0)<=o.charCodeAt(0)?e:gn),Tc=t=>{let{length:e}=t;return t.slice(0,e-e%2)},Sc=[[/^\uFEFF/,()=>gn],[/((?:\\\\)*?)(\\?\s+)$/,(t,e,n)=>e+(n.indexOf("\\")===0?Zo:gn)],[/(\\+?)\s/g,(t,e)=>{let{length:n}=e;return e.slice(0,n-n%2)+Zo}],[/[\\$.|*+(){^]/g,t=>`\\${t}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(t,e,n)=>e+6<n.length?"(?:\\/[^\\/]+)*":"\\/.+"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(t,e,n)=>{let o=n.replace(/\\\*/g,"[^\\/]*");return e+o}],[/\\\\\\(?=[$.|*+(){^])/g,()=>fn],[/\\\\/g,()=>fn],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(t,e,n,o,r)=>e===fn?`\\[${n}${Tc(o)}${r}`:r==="]"&&o.length%2===0?`[${vc(n)}${o}]`:"[]"],[/(?:[^*])$/,t=>/\/$/.test(t)?`${t}$`:`${t}(?=$|\\/$)`]],kc=/(^|\\\/)?\\\*$/,et="regex",Ct="checkRegex",Qo="_",bc={[et](t,e){return`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`},[Ct](t,e){return`${e?`${e}[^/]*`:"[^/]*"}(?=$|\\/$)`}},wc=t=>Sc.reduce((e,[n,o])=>e.replace(n,o.bind(t)),t),Et=t=>typeof t=="string",_c=t=>t&&Et(t)&&!pc.test(t)&&!mc.test(t)&&t.indexOf("#")!==0,Cc=t=>t.split(gc).filter(Boolean),hn=class{constructor(e,n,o,r,s,i){this.pattern=e,this.mark=n,this.negative=s,Ge(this,"body",o),Ge(this,"ignoreCase",r),Ge(this,"regexPrefix",i)}get regex(){let e=Qo+et;return this[e]?this[e]:this._make(et,e)}get checkRegex(){let e=Qo+Ct;return this[e]?this[e]:this._make(Ct,e)}_make(e,n){let o=this.regexPrefix.replace(kc,bc[e]),r=this.ignoreCase?new RegExp(o,"i"):new RegExp(o);return Ge(this,n,r)}},Ec=({pattern:t,mark:e},n)=>{let o=!1,r=t;r.indexOf("!")===0&&(o=!0,r=r.substr(1)),r=r.replace(dc,"!").replace(fc,"#");let s=wc(r);return new hn(t,e,r,n,o,s)},yn=class{constructor(e){this._ignoreCase=e,this._rules=[]}_add(e){if(e&&e[nr]){this._rules=this._rules.concat(e._rules._rules),this._added=!0;return}if(Et(e)&&(e={pattern:e}),_c(e.pattern)){let n=Ec(e,this._ignoreCase);this._added=!0,this._rules.push(n)}}add(e){return this._added=!1,er(Et(e)?Cc(e):e).forEach(this._add,this),this._added}test(e,n,o){let r=!1,s=!1,i;this._rules.forEach(c=>{let{negative:l}=c;s===l&&r!==s||l&&!r&&!s&&!n||!c[o].test(e)||(r=!l,s=l,i=l?uc:c)});let a={ignored:r,unignored:s};return i&&(a.rule=i),a}},Ac=(t,e)=>{throw new e(t)},Se=(t,e,n)=>Et(t)?t?Se.isNotRelative(t)?n(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:n("path must not be empty",TypeError):n(`path must be a string, but got \`${e}\``,TypeError),rr=t=>hc.test(t);Se.isNotRelative=rr;Se.convert=t=>t;var xn=class{constructor({ignorecase:e=!0,ignoreCase:n=e,allowRelativePaths:o=!1}={}){Ge(this,nr,!0),this._rules=new yn(n),this._strictPathCheck=!o,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(e){return this._rules.add(e)&&this._initCache(),this}addPattern(e){return this.add(e)}_test(e,n,o,r){let s=e&&Se.convert(e);return Se(s,e,this._strictPathCheck?Ac:or),this._t(s,n,o,r)}checkIgnore(e){if(!yc.test(e))return this.test(e);let n=e.split(Ve).filter(Boolean);if(n.pop(),n.length){let o=this._t(n.join(Ve)+Ve,this._testCache,!0,n);if(o.ignored)return o}return this._rules.test(e,!1,Ct)}_t(e,n,o,r){if(e in n)return n[e];if(r||(r=e.split(Ve).filter(Boolean)),r.pop(),!r.length)return n[e]=this._rules.test(e,o,et);let s=this._t(r.join(Ve)+Ve,n,o,r);return n[e]=s.ignored?s:this._rules.test(e,o,et)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return er(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},vn=t=>new xn(t),Mc=t=>Se(t&&Se.convert(t),t,or),sr=()=>{let t=n=>/^\\\\\?\\/.test(n)||/["<>|\u0000-\u001F]+/u.test(n)?n:n.replace(/\\/g,"/");Se.convert=t;let e=/^[a-z]:\//i;Se.isNotRelative=n=>e.test(n)||rr(n)};typeof process<"u"&&process.platform==="win32"&&sr();At.exports=vn;vn.default=vn;At.exports.isPathValid=Mc;Ge(At.exports,Symbol.for("setupWindows"),sr)});import{randomUUID as Hr}from"crypto";import{createInterface as Xl}from"readline/promises";import{stdin as Yl,stdout as Zl}from"process";import{render as Ql}from"ink";import rs from"os";import{readFile as ss}from"fs/promises";import{join as is,dirname as as}from"path";import{fileURLToPath as cs}from"url";var ls=/{{\s*([\w.-]+)\s*}}/g;function us(t,e){return t.replace(ls,(n,o)=>e[o]??"")}function ps(){try{return rs.userInfo().username}catch{return process.env.USER??process.env.USERNAME??"unknown"}}async function Nn(){let t=as(cs(import.meta.url)),e=is(t,"prompt.md"),n=await ss(e,"utf-8"),o={date:new Date().toISOString(),user:ps(),pwd:process.cwd()};return us(n,o)}import{appendFile as ms,mkdir as ds}from"fs/promises";import{dirname as fs}from"path";var ct=class{constructor(e){this.filePath=e}ready=!1;async append(e){this.ready||(await ds(fs(this.filePath),{recursive:!0}),this.ready=!0),await ms(this.filePath,`${JSON.stringify(e)}
3
+ `,"utf8")}async flush(){return Promise.resolve()}};function On(t){return{ts:new Date().toISOString(),sessionId:t.sessionId,turn:t.turn,step:t.step,type:t.type,content:t.content,role:t.role,meta:t.meta}}import{spawn as gs}from"child_process";import{z as Bt}from"zod";function w(t,e=!1){return{content:[{type:"text",text:t}],isError:e}}var hs=Bt.object({command:Bt.string().min(1,"command \u4E0D\u80FD\u4E3A\u7A7A"),timeout:Bt.number().int("timeout \u5FC5\u987B\u662F\u6574\u6570\u6BEB\u79D2").positive("timeout \u5FC5\u987B\u5927\u4E8E 0").max(3600*1e3,"timeout \u4E0D\u80FD\u8D85\u8FC7 1 \u5C0F\u65F6").optional()}).strict(),Dn={name:"bash",description:"\u5728 shell \u4E2D\u6267\u884C\u547D\u4EE4\uFF0C\u8FD4\u56DE exit/stdout/stderr",inputSchema:hs,execute:async({command:t,timeout:e})=>{let n=t.trim();if(!n)return w("bash \u9700\u8981\u8981\u6267\u884C\u7684\u547D\u4EE4",!0);try{let o=gs("bash",["-lc",n],{env:process.env,stdio:["ignore","pipe","pipe"]}),r=m=>new Promise(b=>{if(!m)return b("");let h=[];m.setEncoding("utf8"),m.on("data",C=>h.push(C)),m.on("error",()=>b("")),m.on("end",()=>b(h.join("")))}),s=r(o.stdout),i=r(o.stderr),a,c=new Promise((m,b)=>{o.on("error",h=>b(h)),o.on("close",h=>m(typeof h=="number"?h:-1))}),l=e&&e>0?new Promise((m,b)=>{a=setTimeout(()=>{o.kill(),b(new Error(`bash \u8D85\u65F6 ${e}ms\uFF0C\u5DF2\u7EC8\u6B62\u8FDB\u7A0B`))},e)}):null,u=l?await Promise.race([c,l]):await c;a&&clearTimeout(a);let[p,v]=await Promise.all([s,i]);return w(`exit=${u} stdout="${p}" stderr="${v}"`)}catch(o){return w(`bash \u6267\u884C\u5931\u8D25: ${o.message}`,!0)}}};import{access as Ws,readFile as Ks,writeFile as Js}from"fs/promises";var Xn=Ln(Wn(),1);import{normalize as Ls,resolve as qn,dirname as Kn,join as Jt,relative as Ns}from"path";import{existsSync as qt,statSync as Os}from"fs";import{readFile as Ds}from"fs/promises";function me(t){return Ls(qn(t))}var Us=["node_modules/",".git/","dist/","out/","build/","coverage/",".cache/",".idea/",".DS_Store",".next/",".turbo/",".pnpm/",".pnpm-store/","*.log","logs/","tmp/","temp/","vendor/"],js=100,Hs=1e4,Bs="<system_hint>\u5F53\u524D\u67E5\u627E\u7ED3\u679C\u8FC7\u591A\uFF0C\u8BF7\u7EC6\u5316\u67E5\u627E\u8303\u56F4\uFF08\u7F29\u5C0F\u76EE\u5F55\u3001\u589E\u52A0\u66F4\u5177\u4F53\u7684 pattern/glob \u6216\u5173\u952E\u8BCD\uFF09\u3002</system_hint>",Jn=new Map;function Fs(t){return t.replace(/\\/g,"/")}function Vs(t){let e=qn(t);try{Os(e).isFile()&&(e=Kn(e))}catch{e=process.cwd()}let n=e;for(;;){if(qt(Jt(e,".gitignore"))||qt(Jt(e,".git")))return e;let o=Kn(e);if(o===e)return n;e=o}}async function Gs(t){let e=Jt(t,".gitignore");return qt(e)?(await Ds(e,"utf8")).split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")):[]}async function zs(t){let e=(0,Xn.default)();e.add(Us);let n=await Gs(t);return n.length>0&&e.add(n),{root:t,ignores:o=>{let r=Ns(t,o);return!r||r.startsWith("..")?!1:e.ignores(Fs(r))}}}async function ut(t){let e=Vs(t),n=Jn.get(e);if(n)return n;let o=zs(e);return Jn.set(e,o),o}function pt(t,e){return e>js||t.length>Hs?`${t}
4
4
 
5
- ${Os}`:t}import{z as Je}from"zod";var Gs=Je.object({file_path:Je.string().min(1),old_string:Je.string().min(1,"old_string \u4E0D\u80FD\u4E3A\u7A7A"),new_string:Je.string(),replace_all:Je.boolean().optional()}).strict(),Kn={name:"edit",description:"\u5728\u6587\u4EF6\u4E2D\u66FF\u6362\u6587\u672C\uFF0C\u652F\u6301 replace_all",inputSchema:Gs,execute:async t=>{let e=pe(t.file_path),n=t.replace_all??!1;if(!t.old_string.trim())return b("old_string \u4E0D\u80FD\u4E3A\u7A7A",!0);try{await Bs(e);let o=await Fs(e,"utf8");if(!o.includes(t.old_string))return b("\u672A\u627E\u5230\u5F85\u66FF\u6362\u6587\u672C",!0);let r,s=0;if(n){let i=o.split(t.old_string);s=i.length-1,r=i.join(t.new_string)}else r=o.replace(t.old_string,t.new_string),s=1;return r===o?b("\u672A\u68C0\u6D4B\u5230\u5185\u5BB9\u53D8\u5316"):(await Vs(e,r,"utf8"),b(`\u66FF\u6362\u5B8C\u6210: file=${e} count=${s}`))}catch(o){return o.code==="ENOENT"?b(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`,!0):b(`edit \u5931\u8D25: ${o.message}`,!0)}}};import{z as Jn}from"zod";var zs=Jn.object({url:Jn.string().min(1)}).strict(),qn=1e4,qe=512e3,Jt=4e3,Ws=new Set(["http:","https:","data:"]),Ks=/<\/\s*(p|div|section|article|header|footer|aside|main|h[1-6]|li|tr|table|blockquote)\s*>/gi,Js=/<\s*(br|hr)\s*\/?>/gi,qs=/<\s*li[^>]*>/gi,Xs=/<[^>]+>/g,Ys=/<(script|style)[^>]*>[\s\S]*?<\/\s*\1>/gi,Zs=t=>t.replace(/&nbsp;/gi," ").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&amp;/gi,"&").replace(/&quot;/gi,'"').replace(/&#39;/g,"'").replace(/&#(x?[0-9a-fA-F]+);/g,(o,r)=>{try{let s=r.startsWith("x")||r.startsWith("X")?parseInt(r.slice(1),16):parseInt(r,10);return Number.isFinite(s)?String.fromCharCode(s):""}catch{return""}}),Qs=t=>{let o=t.replace(Ys," ").replace(qs,"- ").replace(Js,`
6
- `).replace(Ks,`
7
- `).replace(Xs," "),s=Zs(o).replace(/\r/g,"").split(`
5
+ ${Bs}`:t}import{z as Je}from"zod";var qs=Je.object({file_path:Je.string().min(1),old_string:Je.string().min(1,"old_string \u4E0D\u80FD\u4E3A\u7A7A"),new_string:Je.string(),replace_all:Je.boolean().optional()}).strict(),Yn={name:"edit",description:"\u5728\u6587\u4EF6\u4E2D\u66FF\u6362\u6587\u672C\uFF0C\u652F\u6301 replace_all",inputSchema:qs,execute:async t=>{let e=me(t.file_path),n=t.replace_all??!1;if(!t.old_string.trim())return w("old_string \u4E0D\u80FD\u4E3A\u7A7A",!0);try{await Ws(e);let o=await Ks(e,"utf8");if(!o.includes(t.old_string))return w("\u672A\u627E\u5230\u5F85\u66FF\u6362\u6587\u672C",!0);let r,s=0;if(n){let i=o.split(t.old_string);s=i.length-1,r=i.join(t.new_string)}else r=o.replace(t.old_string,t.new_string),s=1;return r===o?w("\u672A\u68C0\u6D4B\u5230\u5185\u5BB9\u53D8\u5316"):(await Js(e,r,"utf8"),w(`\u66FF\u6362\u5B8C\u6210: file=${e} count=${s}`))}catch(o){return o.code==="ENOENT"?w(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`,!0):w(`edit \u5931\u8D25: ${o.message}`,!0)}}};import{z as Zn}from"zod";var Xs=Zn.object({url:Zn.string().min(1)}).strict(),Qn=1e4,qe=512e3,Xt=4e3,Ys=new Set(["http:","https:","data:"]),Zs=/<\/\s*(p|div|section|article|header|footer|aside|main|h[1-6]|li|tr|table|blockquote)\s*>/gi,Qs=/<\s*(br|hr)\s*\/?>/gi,ei=/<\s*li[^>]*>/gi,ti=/<[^>]+>/g,ni=/<(script|style)[^>]*>[\s\S]*?<\/\s*\1>/gi,oi=t=>t.replace(/&nbsp;/gi," ").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&amp;/gi,"&").replace(/&quot;/gi,'"').replace(/&#39;/g,"'").replace(/&#(x?[0-9a-fA-F]+);/g,(o,r)=>{try{let s=r.startsWith("x")||r.startsWith("X")?parseInt(r.slice(1),16):parseInt(r,10);return Number.isFinite(s)?String.fromCharCode(s):""}catch{return""}}),ri=t=>{let o=t.replace(ni," ").replace(ei,"- ").replace(Qs,`
6
+ `).replace(Zs,`
7
+ `).replace(ti," "),s=oi(o).replace(/\r/g,"").split(`
8
8
  `).map(a=>a.trim().replace(/[ \t]{2,}/g," "));return s.filter((a,c)=>a.length>0||c>0&&(s[c-1]?.length??0)>0).join(`
9
- `).trim()},ei=t=>t.replace(/\s+/g," ").trim(),Xn={name:"webfetch",description:"HTTP GET \u8BF7\u6C42\uFF0C\u8FD4\u56DE\u5904\u7406\u540E\u7684\u7EAF\u6587\u672C\u6B63\u6587\uFF08\u81EA\u52A8\u5265\u79BB HTML \u6807\u7B7E\uFF09",inputSchema:zs,execute:async t=>{let e;try{e=new URL(t.url)}catch{return b(`\u65E0\u6548 URL: ${t.url}`,!0)}if(!Ws.has(e.protocol))return b(`\u4E0D\u652F\u6301\u7684\u534F\u8BAE: ${e.protocol}`,!0);let n=new AbortController,o=setTimeout(()=>n.abort(),qn);try{let r=await globalThis.fetch(e,{signal:n.signal}),s=r.headers.get("content-length"),i=s?Number(s):void 0;if(i&&i>qe)return b(`\u8BF7\u6C42\u88AB\u62D2\u7EDD: \u54CD\u5E94\u4F53\u8FC7\u5927\uFF08${i} bytes\uFF09`,!0);let a=0,c="";if(r.body&&r.body.getReader){let C=r.body.getReader(),P=[];for(;;){let{done:x,value:E}=await C.read();if(x)break;if(E){if(a+=E.byteLength,a>qe)return n.abort(),b(`\u8BF7\u6C42\u88AB\u4E2D\u6B62: \u54CD\u5E94\u4F53\u8D85\u8FC7 ${qe} bytes`,!0);P.push(E)}}let g=new Uint8Array(a),M=0;for(let x of P)g.set(x,M),M+=x.byteLength;c=new TextDecoder().decode(g)}else if(c=await r.text(),a=new TextEncoder().encode(c).byteLength,a>qe)return b(`\u8BF7\u6C42\u88AB\u62D2\u7EDD: \u54CD\u5E94\u4F53\u8D85\u8FC7 ${qe} bytes`,!0);let l=r.headers.get("content-type")||"",u=/text\/html/i.test(l)||/^\s*<!doctype html/i.test(c)||/^\s*<html[\s>]/i.test(c),p=u?Qs(c):c.trim(),v=ei(p),m=v.length>Jt?`${v.slice(0,Jt)}...`:v,_=v.length>Jt?" text_truncated=true":"",y=u?" source=html_stripped":"";return b(`status=${r.status} bytes=${a} text_chars=${v.length} text="${m}"${_}${y}`)}catch(r){return r.name==="AbortError"?b(`\u8BF7\u6C42\u8D85\u65F6\u6216\u88AB\u4E2D\u6B62\uFF08${qn}ms\uFF09`,!0):b(`\u8BF7\u6C42\u5931\u8D25: ${r.message}`,!0)}finally{clearTimeout(o)}}};import{z as qt}from"zod";import ti from"fast-glob";var ni=qt.object({pattern:qt.string().min(1),path:qt.string().optional()}).strict(),oi={name:"glob",description:"\u6309 glob \u6A21\u5F0F\u5339\u914D\u6587\u4EF6\uFF0C\u8FD4\u56DE\u7EDD\u5BF9\u8DEF\u5F84\u5217\u8868",inputSchema:ni,execute:async t=>{let e=t.path?pe(t.path):process.cwd();try{let n=await pt(e),r=(await ti(t.pattern,{cwd:e,absolute:!0,onlyFiles:!0})).filter(i=>!n.ignores(i));if(r.length===0)return b("\u672A\u627E\u5230\u5339\u914D\u6587\u4EF6");let s=r.join(`
10
- `);return b(mt(s,r.length))}catch(n){return b(`glob \u5931\u8D25: ${n.message}`,!0)}}},Yn=oi;import{spawn as ri,spawnSync as si}from"child_process";import{z as he}from"zod";import{isAbsolute as Zn,resolve as Qn}from"path";var ii=he.object({pattern:he.string().min(1),path:he.string().optional(),output_mode:he.enum(["content","files_with_matches","count"]).optional(),glob:he.string().optional(),"-i":he.boolean().optional(),"-A":he.number().int().nonnegative().optional(),"-B":he.number().int().nonnegative().optional(),"-C":he.number().int().nonnegative().optional()}).strict(),eo={name:"grep",description:"\u57FA\u4E8E ripgrep \u67E5\u627E\u6587\u672C\uFF0C\u652F\u6301\u8F93\u51FA\u5339\u914D\u5185\u5BB9\u3001\u6587\u4EF6\u5217\u8868\u6216\u8BA1\u6570",inputSchema:ii,execute:async t=>{let e=si("rg",["--version"],{stdio:"ignore"});if(e.error||e.status!==0)return b("rg \u672A\u5B89\u88C5\u6216\u4E0D\u5728 PATH",!0);let n=t.path?pe(t.path):process.cwd(),o=["--color","never"],r=t.output_mode??"content";r==="files_with_matches"?o.push("-l"):r==="count"?o.push("-c"):o.push("--line-number","--no-heading"),t["-i"]&&o.push("-i"),t.glob&&o.push("--glob",t.glob),t["-A"]!==void 0&&o.push("-A",String(t["-A"])),t["-B"]!==void 0&&o.push("-B",String(t["-B"])),t["-C"]!==void 0&&o.push("-C",String(t["-C"])),o.push(t.pattern,n);try{let s=await pt(n),i=ri("rg",o,{stdio:["ignore","pipe","pipe"]}),a=y=>new Promise(C=>{if(!y)return C("");let P=[];y.setEncoding("utf8"),y.on("data",g=>P.push(g)),y.on("error",()=>C("")),y.on("end",()=>C(P.join("")))}),[c,l]=await Promise.all([a(i.stdout),a(i.stderr)]);if(await new Promise((y,C)=>{i.on("error",P=>C(P)),i.on("close",P=>y(typeof P=="number"?P:-1))})===2)return b(`grep \u5931\u8D25(exit=2): ${l||c}`,!0);let m=(c||l||"").split(/\r?\n/).map(y=>y.trimEnd()).filter(y=>y.length>0).filter(y=>{if(r==="files_with_matches"){let M=y.trim(),x=Zn(M)?M:Qn(n,M);return!s.ignores(x)}let C=y.indexOf(":");if(C===-1)return!0;let P=y.slice(0,C),g=Zn(P)?P:Qn(n,P);return!s.ignores(g)});if(m.length===0)return b("\u672A\u627E\u5230\u5339\u914D");let _=m.join(`
11
- `);return b(mt(_,m.length))}catch(s){return b(`grep \u6267\u884C\u5931\u8D25: ${s.message}`,!0)}}};import{mkdir as ai,readFile as ci,writeFile as li,access as ui}from"fs/promises";import{dirname as pi,join as to}from"path";import{homedir as mi}from"os";import{z as no}from"zod";var di=no.object({fact:no.string().min(1,"fact cannot be empty").max(120,"Please keep facts concise (\u2264120 characters)").describe('User-related identity traits or preferences, e.g., "User prefers Chinese responses", "User is a frontend engineer". Do not store project-specific technical details.')}).strict();function fi(){let t=process.env.MEMO_HOME?.trim()||to(mi(),".memo");return to(t,"Agents.md")}function gi(t){return t.replace(/\r?\n/g," ").replace(/\s+/g," ").trim()}function hi(t,e){let o=e.map(r=>r.trim()).filter(Boolean).map(r=>`- ${r}`);return`${t}
9
+ `).trim()},si=t=>t.replace(/\s+/g," ").trim(),eo={name:"webfetch",description:"HTTP GET \u8BF7\u6C42\uFF0C\u8FD4\u56DE\u5904\u7406\u540E\u7684\u7EAF\u6587\u672C\u6B63\u6587\uFF08\u81EA\u52A8\u5265\u79BB HTML \u6807\u7B7E\uFF09",inputSchema:Xs,execute:async t=>{let e;try{e=new URL(t.url)}catch{return w(`\u65E0\u6548 URL: ${t.url}`,!0)}if(!Ys.has(e.protocol))return w(`\u4E0D\u652F\u6301\u7684\u534F\u8BAE: ${e.protocol}`,!0);let n=new AbortController,o=setTimeout(()=>n.abort(),Qn);try{let r=await globalThis.fetch(e,{signal:n.signal}),s=r.headers.get("content-length"),i=s?Number(s):void 0;if(i&&i>qe)return w(`\u8BF7\u6C42\u88AB\u62D2\u7EDD: \u54CD\u5E94\u4F53\u8FC7\u5927\uFF08${i} bytes\uFF09`,!0);let a=0,c="";if(r.body&&r.body.getReader){let C=r.body.getReader(),P=[];for(;;){let{done:y,value:E}=await C.read();if(y)break;if(E){if(a+=E.byteLength,a>qe)return n.abort(),w(`\u8BF7\u6C42\u88AB\u4E2D\u6B62: \u54CD\u5E94\u4F53\u8D85\u8FC7 ${qe} bytes`,!0);P.push(E)}}let g=new Uint8Array(a),A=0;for(let y of P)g.set(y,A),A+=y.byteLength;c=new TextDecoder().decode(g)}else if(c=await r.text(),a=new TextEncoder().encode(c).byteLength,a>qe)return w(`\u8BF7\u6C42\u88AB\u62D2\u7EDD: \u54CD\u5E94\u4F53\u8D85\u8FC7 ${qe} bytes`,!0);let l=r.headers.get("content-type")||"",u=/text\/html/i.test(l)||/^\s*<!doctype html/i.test(c)||/^\s*<html[\s>]/i.test(c),p=u?ri(c):c.trim(),v=si(p),m=v.length>Xt?`${v.slice(0,Xt)}...`:v,b=v.length>Xt?" text_truncated=true":"",h=u?" source=html_stripped":"";return w(`status=${r.status} bytes=${a} text_chars=${v.length} text="${m}"${b}${h}`)}catch(r){return r.name==="AbortError"?w(`\u8BF7\u6C42\u8D85\u65F6\u6216\u88AB\u4E2D\u6B62\uFF08${Qn}ms\uFF09`,!0):w(`\u8BF7\u6C42\u5931\u8D25: ${r.message}`,!0)}finally{clearTimeout(o)}}};import{z as Yt}from"zod";import ii from"fast-glob";var ai=Yt.object({pattern:Yt.string().min(1),path:Yt.string().optional()}).strict(),ci={name:"glob",description:"\u6309 glob \u6A21\u5F0F\u5339\u914D\u6587\u4EF6\uFF0C\u8FD4\u56DE\u7EDD\u5BF9\u8DEF\u5F84\u5217\u8868",inputSchema:ai,execute:async t=>{let e=t.path?me(t.path):process.cwd();try{let n=await ut(e),r=(await ii(t.pattern,{cwd:e,absolute:!0,onlyFiles:!0})).filter(i=>!n.ignores(i));if(r.length===0)return w("\u672A\u627E\u5230\u5339\u914D\u6587\u4EF6");let s=r.join(`
10
+ `);return w(pt(s,r.length))}catch(n){return w(`glob \u5931\u8D25: ${n.message}`,!0)}}},to=ci;import{spawn as li,spawnSync as ui}from"child_process";import{z as xe}from"zod";import{isAbsolute as no,resolve as oo}from"path";var pi=xe.object({pattern:xe.string().min(1),path:xe.string().optional(),output_mode:xe.enum(["content","files_with_matches","count"]).optional(),glob:xe.string().optional(),"-i":xe.boolean().optional(),"-A":xe.number().int().nonnegative().optional(),"-B":xe.number().int().nonnegative().optional(),"-C":xe.number().int().nonnegative().optional()}).strict(),ro={name:"grep",description:"\u57FA\u4E8E ripgrep \u67E5\u627E\u6587\u672C\uFF0C\u652F\u6301\u8F93\u51FA\u5339\u914D\u5185\u5BB9\u3001\u6587\u4EF6\u5217\u8868\u6216\u8BA1\u6570",inputSchema:pi,execute:async t=>{let e=ui("rg",["--version"],{stdio:"ignore"});if(e.error||e.status!==0)return w("rg \u672A\u5B89\u88C5\u6216\u4E0D\u5728 PATH",!0);let n=t.path?me(t.path):process.cwd(),o=["--color","never"],r=t.output_mode??"content";r==="files_with_matches"?o.push("-l"):r==="count"?o.push("-c"):o.push("--line-number","--no-heading"),t["-i"]&&o.push("-i"),t.glob&&o.push("--glob",t.glob),t["-A"]!==void 0&&o.push("-A",String(t["-A"])),t["-B"]!==void 0&&o.push("-B",String(t["-B"])),t["-C"]!==void 0&&o.push("-C",String(t["-C"])),o.push(t.pattern,n);try{let s=await ut(n),i=li("rg",o,{stdio:["ignore","pipe","pipe"]}),a=h=>new Promise(C=>{if(!h)return C("");let P=[];h.setEncoding("utf8"),h.on("data",g=>P.push(g)),h.on("error",()=>C("")),h.on("end",()=>C(P.join("")))}),[c,l]=await Promise.all([a(i.stdout),a(i.stderr)]);if(await new Promise((h,C)=>{i.on("error",P=>C(P)),i.on("close",P=>h(typeof P=="number"?P:-1))})===2)return w(`grep \u5931\u8D25(exit=2): ${l||c}`,!0);let m=(c||l||"").split(/\r?\n/).map(h=>h.trimEnd()).filter(h=>h.length>0).filter(h=>{if(r==="files_with_matches"){let A=h.trim(),y=no(A)?A:oo(n,A);return!s.ignores(y)}let C=h.indexOf(":");if(C===-1)return!0;let P=h.slice(0,C),g=no(P)?P:oo(n,P);return!s.ignores(g)});if(m.length===0)return w("\u672A\u627E\u5230\u5339\u914D");let b=m.join(`
11
+ `);return w(pt(b,m.length))}catch(s){return w(`grep \u6267\u884C\u5931\u8D25: ${s.message}`,!0)}}};import{mkdir as mi,readFile as di,writeFile as fi,access as gi}from"fs/promises";import{dirname as hi,join as so}from"path";import{homedir as yi}from"os";import{z as io}from"zod";var xi=io.object({fact:io.string().min(1,"fact cannot be empty").max(120,"Please keep facts concise (\u2264120 characters)").describe('User-related identity traits or preferences, e.g., "User prefers Chinese responses", "User is a frontend engineer". Do not store project-specific technical details.')}).strict();function vi(){let t=process.env.MEMO_HOME?.trim()||so(yi(),".memo");return so(t,"Agents.md")}function Ti(t){return t.replace(/\r?\n/g," ").replace(/\s+/g," ").trim()}function Si(t,e){let o=e.map(r=>r.trim()).filter(Boolean).map(r=>`- ${r}`);return`${t}
12
12
 
13
13
  ${o.join(`
14
14
  `)}
15
- `}var oo={name:"save_memory",description:"Save user-related identity traits or preferences (e.g., language habits, tech preferences) for cross-session reuse. Do not save project-specific technical details or file structures.",inputSchema:di,execute:async t=>{let e=gi(t.fact);if(!e)return b("fact cannot be empty",!0);let n=fi(),o=pi(n);try{await ai(o,{recursive:!0});let r="## Memo Added Memories";try{let s=await(async()=>{try{return await ui(n),await ci(n,"utf-8")}catch{return""}})(),[,i=""]=s.split(r),a=i.split(/\r?\n/).filter(u=>u.trim().startsWith("- ")).map(u=>u.replace(/^-+\s*/,"").trim());a.push(e);let c=a.slice(Math.max(0,a.length-50)),l=hi(r,c);await li(n,l,"utf-8")}catch(s){console.warn(`Memory maintenance failed: ${s.message}`)}return b(`Memory saved to: ${n}`)}catch(r){return b(`Failed to write memory: ${r.message}`,!0)}}};import{z as ye}from"zod";var dt=10,ie=[],yi=ye.object({type:ye.enum(["add","replace","update","remove"]),todos:ye.array(ye.object({content:ye.string().trim().min(1,"content \u4E0D\u80FD\u4E3A\u7A7A").max(200,"content \u6700\u957F 200 \u5B57\u7B26"),status:ye.enum(["pending","in_progress","completed"]).optional().default("pending"),id:ye.string().min(1,"id \u4E0D\u80FD\u4E3A\u7A7A").optional()})).optional(),ids:ye.array(ye.string().min(1,"id \u4E0D\u80FD\u4E3A\u7A7A")).optional()}).strict().refine(t=>{if(["add","replace","update"].includes(t.type)){if(!t.todos||t.todos.length===0)return!1;if(t.type==="update")return t.todos.every(e=>e.id)}return!(t.type==="remove"&&(!t.ids||t.ids.length===0))},{message:"add/replace/update \u9700\u8981 todos\uFF0Cremove \u9700\u8981 ids\uFF0Cupdate \u9700\u8981 id"});function ft(){return ie.map(t=>({...t}))}function xi(t){switch(t.type){case"add":{let e=t.todos,n=dt-ie.length;if(e.length>n)return{error:`\u4EFB\u52A1\u4E0A\u9650 ${dt}\uFF0C\u5F53\u524D\u5269\u4F59 ${n} \u6761\u7A7A\u4F4D`};let o=e.map(r=>({id:crypto.randomUUID(),content:r.content,status:r.status}));return ie.push(...o),{added:o,tasks:ft()}}case"replace":{let e=t.todos;if(e.length>dt)return{error:`\u4EFB\u52A1\u4E0A\u9650 ${dt}`};ie.splice(0,ie.length);let n=e.map(o=>({id:crypto.randomUUID(),content:o.content,status:o.status}));return ie.push(...n),{replaced:!0,tasks:ft()}}case"update":{let e=t.todos,n=e.map(s=>s.id);if(new Set(n).size!==n.length)return{error:"\u66F4\u65B0\u5217\u8868\u5B58\u5728\u91CD\u590D id"};let r=new Map(ie.map(s=>[s.id,s]));for(let s of e){let i=r.get(s.id);if(!i)return{error:`\u672A\u627E\u5230\u4EFB\u52A1 id=${s.id}`};i.content=s.content,s.status&&(i.status=s.status)}return{updated:n,tasks:ft()}}case"remove":{let e=t.ids,n=ie.length,o=new Set(e),r=ie.filter(s=>!o.has(s.id));return r.length===n?{error:"\u672A\u627E\u5230\u4EFB\u4F55\u53EF\u5220\u9664\u7684\u4EFB\u52A1 id"}:(ie.splice(0,ie.length,...r),{removed:e,tasks:ft()})}}}var ro={name:"todo",description:"\u7BA1\u7406\u5F85\u529E\u5217\u8868\uFF08add/update/remove/replace\uFF09\uFF0C\u6700\u591A 10 \u6761\uFF0C\u4E0D\u6301\u4E45\u5316",inputSchema:yi,execute:async t=>{let e=xi(t);if(e.error)return b(e.error,!0);let n={op:t.type,count:ie.length,tasks:e.tasks,added:e.added,updated:e.updated,removed:e.removed,replaced:!!e.replaced};return b(JSON.stringify(n))}};import{z as gt}from"zod";import{extname as vi}from"path";import{gzipSync as Ti}from"zlib";import{access as Si,readFile as ki}from"fs/promises";var so=512e3,io=2e6,_i=200,ao=1e3,bi=1024,Xt=4e3,wi=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg"]);function Ci(t){let e=vi(t).toLowerCase();return wi.has(e)}function Ei(t){return Buffer.from(t).toString("base64")}function Ai(t){try{let e=Ti(t,{level:6});if(e.byteLength<t.byteLength)return{data:new Uint8Array(e),encoding:"gzip+base64"}}catch{}return{data:t,encoding:"base64"}}function Mi(t){let e=t.truncated?" truncated=true":"";return`image_base64 (encoding=${t.encoding} original_bytes=${t.originalBytes} payload_bytes=${t.payloadBytes} base64_length=${t.base64.length}${e}): ${t.base64}`}var Pi=gt.object({file_path:gt.string().min(1),offset:gt.number().int().positive().optional(),limit:gt.number().int().positive().optional()}).strict(),co={name:"read",description:"\u8BFB\u53D6\u6307\u5B9A\u6587\u4EF6\u5185\u5BB9\uFF0C\u53EF\u6309 offset/limit \u622A\u53D6\u5E76\u9644\u5E26\u884C\u53F7",inputSchema:Pi,execute:async t=>{let e=pe(t.file_path),n=t.offset??1,o=t.limit??_i,r=Math.min(o,ao);try{await Si(e);let s=await ki(e),i=s.byteLength;if(Ci(e)){if(i>io)return b(`\u56FE\u7247\u8FC7\u5927\uFF08${i} bytes\uFF09\uFF0C\u8D85\u8FC7\u9608\u503C ${io} bytes\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6`,!0);let x=new Uint8Array(s),{data:E,encoding:U}=Ai(x),$=Ei(E),V=$.length>Xt?`${$.slice(0,Xt)}...`:$,S=$.length>Xt;return b(Mi({encoding:U,base64:V,originalBytes:x.byteLength,payloadBytes:E.byteLength,truncated:S}))}if(i>so)return b(`\u6587\u4EF6\u8FC7\u5927\uFF08${i} bytes\uFF09\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6\uFF0C\u9608\u503C ${so} bytes`,!0);let c=new Uint8Array(s),l=Math.min(c.length,bi);for(let x=0;x<l;x++)if(c[x]===0)return b("\u68C0\u6D4B\u5230\u4E8C\u8FDB\u5236\u5185\u5BB9\uFF0C\u5DF2\u62D2\u7EDD\u76F4\u63A5\u8BFB\u53D6",!0);let p=new TextDecoder().decode(c).split(/\r?\n/),v=Math.max(0,n-1),m=Math.min(p.length,v+r),y=p.slice(v,m).map((x,E)=>`${v+E+1}: ${x}`).join(`
16
- `),C=m<p.length,M=o!==r||C&&t.limit===void 0?`
17
- ... (truncated, showing ${r} lines; max=${ao})`:"";return b(y+M)}catch(s){return b(`\u8BFB\u53D6\u5931\u8D25: ${s.message}`,!0)}}};import{z as Yt}from"zod";import{dirname as Ri}from"path";import{mkdir as $i,writeFile as Ii}from"fs/promises";var Li=Yt.object({file_path:Yt.string().min(1),content:Yt.any().optional()}).strict();function Ni(t){if(t instanceof Uint8Array)return{data:t,info:`bytes=${t.byteLength}`};if(t instanceof ArrayBuffer){let n=new Uint8Array(t);return{data:n,info:`bytes=${n.byteLength}`}}if(typeof t=="string")return{data:t,info:`text_length=${t.length}`};let e=JSON.stringify(t??"",null,2);return{data:e,info:`json_length=${e.length}`}}var lo={name:"write",description:"\u521B\u5EFA\u6216\u8986\u76D6\u6587\u4EF6\uFF0C\u4F20\u5165 file_path \u4E0E content",inputSchema:Li,execute:async t=>{let e=pe(t.file_path),{data:n,info:o}=Ni(t.content);try{return await $i(Ri(e),{recursive:!0}),await Ii(e,n instanceof Uint8Array?n:String(n)),b(`\u5DF2\u5199\u5165 ${e} (overwrite, ${o})`)}catch(r){return b(`\u5199\u5165\u5931\u8D25: ${r.message}`,!0)}}};function Oi(t){let e=t.toJSONSchema(),{$schema:n,...o}=e;return o}function Di(t){return{name:t.name,description:t.description,source:"native",inputSchema:Oi(t.inputSchema),execute:t.execute}}function uo(t){return t.map(Di)}var Ui={bash:In,read:co,write:lo,edit:Kn,glob:Yn,grep:eo,webfetch:Xn,save_memory:oo,todo:ro},ji=Object.values(Ui),po=uo(ji);import ua from"openai";import{encoding_for_model as Hi,get_encoding as Bi}from"@dqbd/tiktoken";var mo="cl100k_base";function Fi(t){let e=t?.trim()||mo;try{let n=()=>Hi(e);return n().free(),{model:e,factory:n}}catch{let n=mo,o=()=>Bi(n);return o().free(),{model:n,factory:o}}}function fo(t){let{model:e,factory:n}=Fi(t),o=n(),r=4,s=2,i=1,a=l=>l?o.encode(l).length:0;return{model:e,countText:a,countMessages:l=>{if(!l.length)return 0;let u=0;for(let p of l)u+=r,u+=a(p.content),p.name&&(u+=i);return u+=s,u},dispose:()=>o.free()}}import{mkdir as Vi,writeFile as Gi,readFile as zi,access as Wi}from"fs/promises";import{homedir as go}from"os";import{dirname as Ki,join as Pe}from"path";import{randomUUID as wp}from"crypto";import{parse as Ji}from"toml";var qi=Pe(go(),".memo"),Xi="sessions",Yi="Agents.md",Xe={current_provider:"deepseek",stream_output:!1,providers:[{name:"deepseek",env_api_key:"DEEPSEEK_API_KEY",model:"deepseek-chat",base_url:"https://api.deepseek.com"}],mcp_servers:{}};function Zi(t){return/^[A-Za-z0-9_-]+$/.test(t)?t:JSON.stringify(t)}function Qi(t){if(!t||typeof t!="object"||Array.isArray(t))return[];let e=[];for(let[n,o]of Object.entries(t)){if(!o)continue;let r=Array.isArray(o)?o:[o];for(let s of r){if(!s||typeof s!="object")continue;let i={...s};(typeof i.name!="string"||i.name.length===0)&&n&&(i.name=n),e.push(i)}}return e}function ho(t){return t.startsWith("~")?Pe(go(),t.slice(1)):t}function ea(t){let e=t.providers.map(r=>{let s=typeof r?.name=="string"?r.name:"";if(!s)return"";let a=[`[[providers.${Zi(s)}]]`,`name = ${JSON.stringify(s)}`,`env_api_key = ${JSON.stringify(String(r.env_api_key??""))}`,`model = ${JSON.stringify(String(r.model??""))}`];return r.base_url&&a.push(`base_url = ${JSON.stringify(String(r.base_url))}`),a.join(`
15
+ `}var ao={name:"save_memory",description:"Save user-related identity traits or preferences (e.g., language habits, tech preferences) for cross-session reuse. Do not save project-specific technical details or file structures.",inputSchema:xi,execute:async t=>{let e=Ti(t.fact);if(!e)return w("fact cannot be empty",!0);let n=vi(),o=hi(n);try{await mi(o,{recursive:!0});let r="## Memo Added Memories";try{let s=await(async()=>{try{return await gi(n),await di(n,"utf-8")}catch{return""}})(),[,i=""]=s.split(r),a=i.split(/\r?\n/).filter(u=>u.trim().startsWith("- ")).map(u=>u.replace(/^-+\s*/,"").trim());a.push(e);let c=a.slice(Math.max(0,a.length-50)),l=Si(r,c);await fi(n,l,"utf-8")}catch(s){console.warn(`Memory maintenance failed: ${s.message}`)}return w(`Memory saved to: ${n}`)}catch(r){return w(`Failed to write memory: ${r.message}`,!0)}}};import{z as ve}from"zod";var mt=10,ae=[],ki=ve.object({type:ve.enum(["add","replace","update","remove"]),todos:ve.array(ve.object({content:ve.string().trim().min(1,"content \u4E0D\u80FD\u4E3A\u7A7A").max(200,"content \u6700\u957F 200 \u5B57\u7B26"),status:ve.enum(["pending","in_progress","completed"]).optional().default("pending"),id:ve.string().min(1,"id \u4E0D\u80FD\u4E3A\u7A7A").optional()})).optional(),ids:ve.array(ve.string().min(1,"id \u4E0D\u80FD\u4E3A\u7A7A")).optional()}).strict().refine(t=>{if(["add","replace","update"].includes(t.type)){if(!t.todos||t.todos.length===0)return!1;if(t.type==="update")return t.todos.every(e=>e.id)}return!(t.type==="remove"&&(!t.ids||t.ids.length===0))},{message:"add/replace/update \u9700\u8981 todos\uFF0Cremove \u9700\u8981 ids\uFF0Cupdate \u9700\u8981 id"});function dt(){return ae.map(t=>({...t}))}function bi(t){switch(t.type){case"add":{let e=t.todos,n=mt-ae.length;if(e.length>n)return{error:`\u4EFB\u52A1\u4E0A\u9650 ${mt}\uFF0C\u5F53\u524D\u5269\u4F59 ${n} \u6761\u7A7A\u4F4D`};let o=e.map(r=>({id:crypto.randomUUID(),content:r.content,status:r.status}));return ae.push(...o),{added:o,tasks:dt()}}case"replace":{let e=t.todos;if(e.length>mt)return{error:`\u4EFB\u52A1\u4E0A\u9650 ${mt}`};ae.splice(0,ae.length);let n=e.map(o=>({id:crypto.randomUUID(),content:o.content,status:o.status}));return ae.push(...n),{replaced:!0,tasks:dt()}}case"update":{let e=t.todos,n=e.map(s=>s.id);if(new Set(n).size!==n.length)return{error:"\u66F4\u65B0\u5217\u8868\u5B58\u5728\u91CD\u590D id"};let r=new Map(ae.map(s=>[s.id,s]));for(let s of e){let i=r.get(s.id);if(!i)return{error:`\u672A\u627E\u5230\u4EFB\u52A1 id=${s.id}`};i.content=s.content,s.status&&(i.status=s.status)}return{updated:n,tasks:dt()}}case"remove":{let e=t.ids,n=ae.length,o=new Set(e),r=ae.filter(s=>!o.has(s.id));return r.length===n?{error:"\u672A\u627E\u5230\u4EFB\u4F55\u53EF\u5220\u9664\u7684\u4EFB\u52A1 id"}:(ae.splice(0,ae.length,...r),{removed:e,tasks:dt()})}}}var co={name:"todo",description:"\u7BA1\u7406\u5F85\u529E\u5217\u8868\uFF08add/update/remove/replace\uFF09\uFF0C\u6700\u591A 10 \u6761\uFF0C\u4E0D\u6301\u4E45\u5316",inputSchema:ki,execute:async t=>{let e=bi(t);if(e.error)return w(e.error,!0);let n={op:t.type,count:ae.length,tasks:e.tasks,added:e.added,updated:e.updated,removed:e.removed,replaced:!!e.replaced};return w(JSON.stringify(n))}};import{z as ft}from"zod";import{extname as wi}from"path";import{gzipSync as _i}from"zlib";import{access as Ci,readFile as Ei}from"fs/promises";var lo=512e3,uo=2e6,Ai=200,po=1e3,Mi=1024,Zt=4e3,Pi=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg"]);function Ri(t){let e=wi(t).toLowerCase();return Pi.has(e)}function $i(t){return Buffer.from(t).toString("base64")}function Ii(t){try{let e=_i(t,{level:6});if(e.byteLength<t.byteLength)return{data:new Uint8Array(e),encoding:"gzip+base64"}}catch{}return{data:t,encoding:"base64"}}function Li(t){let e=t.truncated?" truncated=true":"";return`image_base64 (encoding=${t.encoding} original_bytes=${t.originalBytes} payload_bytes=${t.payloadBytes} base64_length=${t.base64.length}${e}): ${t.base64}`}var Ni=ft.object({file_path:ft.string().min(1),offset:ft.number().int().positive().optional(),limit:ft.number().int().positive().optional()}).strict(),mo={name:"read",description:"\u8BFB\u53D6\u6307\u5B9A\u6587\u4EF6\u5185\u5BB9\uFF0C\u53EF\u6309 offset/limit \u622A\u53D6\u5E76\u9644\u5E26\u884C\u53F7",inputSchema:Ni,execute:async t=>{let e=me(t.file_path),n=t.offset??1,o=t.limit??Ai,r=Math.min(o,po);try{await Ci(e);let s=await Ei(e),i=s.byteLength;if(Ri(e)){if(i>uo)return w(`\u56FE\u7247\u8FC7\u5927\uFF08${i} bytes\uFF09\uFF0C\u8D85\u8FC7\u9608\u503C ${uo} bytes\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6`,!0);let y=new Uint8Array(s),{data:E,encoding:U}=Ii(y),I=$i(E),V=I.length>Zt?`${I.slice(0,Zt)}...`:I,k=I.length>Zt;return w(Li({encoding:U,base64:V,originalBytes:y.byteLength,payloadBytes:E.byteLength,truncated:k}))}if(i>lo)return w(`\u6587\u4EF6\u8FC7\u5927\uFF08${i} bytes\uFF09\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6\uFF0C\u9608\u503C ${lo} bytes`,!0);let c=new Uint8Array(s),l=Math.min(c.length,Mi);for(let y=0;y<l;y++)if(c[y]===0)return w("\u68C0\u6D4B\u5230\u4E8C\u8FDB\u5236\u5185\u5BB9\uFF0C\u5DF2\u62D2\u7EDD\u76F4\u63A5\u8BFB\u53D6",!0);let p=new TextDecoder().decode(c).split(/\r?\n/),v=Math.max(0,n-1),m=Math.min(p.length,v+r),h=p.slice(v,m).map((y,E)=>`${v+E+1}: ${y}`).join(`
16
+ `),C=m<p.length,A=o!==r||C&&t.limit===void 0?`
17
+ ... (truncated, showing ${r} lines; max=${po})`:"";return w(h+A)}catch(s){return w(`\u8BFB\u53D6\u5931\u8D25: ${s.message}`,!0)}}};import{z as Qt}from"zod";import{dirname as Oi}from"path";import{mkdir as Di,writeFile as Ui}from"fs/promises";var ji=Qt.object({file_path:Qt.string().min(1),content:Qt.any().optional()}).strict();function Hi(t){if(t instanceof Uint8Array)return{data:t,info:`bytes=${t.byteLength}`};if(t instanceof ArrayBuffer){let n=new Uint8Array(t);return{data:n,info:`bytes=${n.byteLength}`}}if(typeof t=="string")return{data:t,info:`text_length=${t.length}`};let e=JSON.stringify(t??"",null,2);return{data:e,info:`json_length=${e.length}`}}var fo={name:"write",description:"\u521B\u5EFA\u6216\u8986\u76D6\u6587\u4EF6\uFF0C\u4F20\u5165 file_path \u4E0E content",inputSchema:ji,execute:async t=>{let e=me(t.file_path),{data:n,info:o}=Hi(t.content);try{return await Di(Oi(e),{recursive:!0}),await Ui(e,n instanceof Uint8Array?n:String(n)),w(`\u5DF2\u5199\u5165 ${e} (overwrite, ${o})`)}catch(r){return w(`\u5199\u5165\u5931\u8D25: ${r.message}`,!0)}}};function Bi(t){let e=t.toJSONSchema(),{$schema:n,...o}=e;return o}function Fi(t){return{name:t.name,description:t.description,source:"native",inputSchema:Bi(t.inputSchema),execute:t.execute}}function go(t){return t.map(Fi)}var Vi={bash:Dn,read:mo,write:fo,edit:Yn,glob:to,grep:ro,webfetch:eo,save_memory:ao,todo:co},Gi=Object.values(Vi),ho=go(Gi);import ga from"openai";import{encoding_for_model as zi,get_encoding as Wi}from"@dqbd/tiktoken";var yo="cl100k_base";function Ki(t){let e=t?.trim()||yo;try{let n=()=>zi(e);return n().free(),{model:e,factory:n}}catch{let n=yo,o=()=>Wi(n);return o().free(),{model:n,factory:o}}}function xo(t){let{model:e,factory:n}=Ki(t),o=n(),r=4,s=2,i=1,a=l=>l?o.encode(l).length:0;return{model:e,countText:a,countMessages:l=>{if(!l.length)return 0;let u=0;for(let p of l)u+=r,u+=a(p.content),p.name&&(u+=i);return u+=s,u},dispose:()=>o.free()}}import{mkdir as Ji,writeFile as qi,readFile as Xi,access as Yi}from"fs/promises";import{homedir as vo}from"os";import{dirname as Zi,join as Pe}from"path";import{randomUUID as Rp}from"crypto";import{parse as Qi}from"toml";var ea=Pe(vo(),".memo"),ta="sessions",na="Agents.md",Xe={current_provider:"deepseek",stream_output:!1,providers:[{name:"deepseek",env_api_key:"DEEPSEEK_API_KEY",model:"deepseek-chat",base_url:"https://api.deepseek.com"}],mcp_servers:{}};function oa(t){return/^[A-Za-z0-9_-]+$/.test(t)?t:JSON.stringify(t)}function ra(t){if(!t||typeof t!="object"||Array.isArray(t))return[];let e=[];for(let[n,o]of Object.entries(t)){if(!o)continue;let r=Array.isArray(o)?o:[o];for(let s of r){if(!s||typeof s!="object")continue;let i={...s};(typeof i.name!="string"||i.name.length===0)&&n&&(i.name=n),e.push(i)}}return e}function To(t){return t.startsWith("~")?Pe(vo(),t.slice(1)):t}function sa(t){let e=t.providers.map(r=>{let s=typeof r?.name=="string"?r.name:"";if(!s)return"";let a=[`[[providers.${oa(s)}]]`,`name = ${JSON.stringify(s)}`,`env_api_key = ${JSON.stringify(String(r.env_api_key??""))}`,`model = ${JSON.stringify(String(r.model??""))}`];return r.base_url&&a.push(`base_url = ${JSON.stringify(String(r.base_url))}`),a.join(`
18
18
  `)}).filter(Boolean).join(`
19
19
 
20
- `),n="";return t.mcp_servers&&Object.keys(t.mcp_servers).length>0&&(n=Object.entries(t.mcp_servers).map(([r,s])=>{if("url"in s){let v=[`[mcp_servers.${r}]`];v.push(`type = "${s.type??"streamable_http"}"`),v.push(`url = "${s.url}"`),"fallback_to_sse"in s&&s.fallback_to_sse!==void 0&&v.push(`fallback_to_sse = ${s.fallback_to_sse}`),s.bearer_token_env_var&&v.push(`bearer_token_env_var = ${JSON.stringify(s.bearer_token_env_var)}`);let m=s.http_headers??s.headers;if(m&&Object.keys(m).length>0){let _=Object.entries(m).map(([C,P])=>`${JSON.stringify(C)} = ${JSON.stringify(P)}`).join(", "),y=s.http_headers?"http_headers":"headers";v.push(`${y} = { ${_} }`)}return v.join(`
20
+ `),n="";return t.mcp_servers&&Object.keys(t.mcp_servers).length>0&&(n=Object.entries(t.mcp_servers).map(([r,s])=>{if("url"in s){let v=[`[mcp_servers.${r}]`];v.push(`type = "${s.type??"streamable_http"}"`),v.push(`url = "${s.url}"`),"fallback_to_sse"in s&&s.fallback_to_sse!==void 0&&v.push(`fallback_to_sse = ${s.fallback_to_sse}`),s.bearer_token_env_var&&v.push(`bearer_token_env_var = ${JSON.stringify(s.bearer_token_env_var)}`);let m=s.http_headers??s.headers;if(m&&Object.keys(m).length>0){let b=Object.entries(m).map(([C,P])=>`${JSON.stringify(C)} = ${JSON.stringify(P)}`).join(", "),h=s.http_headers?"http_headers":"headers";v.push(`${h} = { ${b} }`)}return v.join(`
21
21
  `)}let i=s.args?`args = ${JSON.stringify(s.args)}`:"",a=s.type?`type = "${s.type}"
22
22
  `:"",c=s.stderr?`stderr = "${s.stderr}"
23
23
  `:"",l=`[mcp_servers.${r}]
@@ -33,31 +33,31 @@ current_provider = "${t.current_provider}"
33
33
  stream_output = ${t.stream_output??!1}
34
34
  `.trim(),e,n].filter(Boolean).join(`
35
35
 
36
- `)}async function me(t,e){await Vi(Ki(t),{recursive:!0}),await Gi(t,ea(e),"utf-8")}async function ne(){let t=process.env.MEMO_HOME?ho(process.env.MEMO_HOME):qi,e=Pe(t,"config.toml");try{await Wi(e);let n=await zi(e,"utf-8"),o=Ji(n),r=Qi(o.providers),s={current_provider:o.current_provider??Xe.current_provider,stream_output:o.stream_output??Xe.stream_output,providers:r,mcp_servers:o.mcp_servers??{}},i=!s.providers.length;return{config:i?Xe:s,home:t,configPath:e,needsSetup:i}}catch{return{config:Xe,home:t,configPath:e,needsSetup:!0}}}function Re(t,e){let n=e||t.current_provider,o=t.providers.find(r=>r.name===n);return o||(t.providers?.[0]??Xe.providers[0])}function ht(t,e){let n=e.historyDir??Pe(t.home,Xi);return ho(n)}function yo(t){return Pe(t.home,Yi)}function ta(t,e=100){return t.replace(/[\\/:\s]+/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,e)||"root"}function na(t,e=180){let n=[],o=0;for(let r of t){let s=r.slice(0,Math.max(1,e-o-(n.length>0?1:0)));if(n.push(s),o+=s.length+(n.length>1?1:0),o>=e)break}return n}function xo(t,e){let n=new Date,o=String(n.getFullYear()),r=String(n.getMonth()+1).padStart(2,"0"),s=String(n.getDate()).padStart(2,"0"),i=String(n.getHours()).padStart(2,"0"),a=String(n.getMinutes()).padStart(2,"0"),c=String(n.getSeconds()).padStart(2,"0"),l=vo(process.cwd()),u=`${o}-${r}-${s}_${i}${a}${c}_${e}.jsonl`;return Pe(t,l,u)}function vo(t){let e=t.split(/[/\\]+/).map(o=>ta(o));return na(e,180).join("-")||"root"}function To(t,e){return Pe(t,vo(e))}var yt=class{tools=new Map;register(e){this.tools.set(e.name,e)}registerMany(e){for(let n of e)this.register(n)}get(e){return this.tools.get(e)}getAll(){return Array.from(this.tools.values())}toRegistry(){let e={};for(let[n,o]of this.tools)e[n]=o;return e}has(e){return this.tools.has(e)}get size(){return this.tools.size}};import{Client as oa}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as So}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as ra}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{StdioClientTransport as sa}from"@modelcontextprotocol/sdk/client/stdio.js";function xt(){return new oa({name:"memo-code-cli-client",version:"1.0.0"},{capabilities:{}})}function ia(t){if(!(!t||Object.keys(t).length===0))return{headers:t}}function aa(t){let e={...t.http_headers??t.headers??{}};if(t.bearer_token_env_var){let n=process.env[t.bearer_token_env_var];n&&!e.Authorization&&(e.Authorization=`Bearer ${n}`)}return e}async function ca(t){let e=new URL(t.url),n=ia(aa(t));if(t.type==="sse"){let r=xt(),s=new So(e,{requestInit:n});return await r.connect(s),{client:r,transport:s}}let o=t.fallback_to_sse??!0;try{let r=xt(),s=new ra(e,{requestInit:n});return await r.connect(s),{client:r,transport:s}}catch(r){if(!o)throw r;try{let s=xt(),i=new So(e,{requestInit:n});return await s.connect(i),{client:s,transport:i}}catch(s){let i=`Failed to connect via streamable_http (${r.message}); SSE fallback failed (${s.message})`,a=new Error(i);throw a.cause={streamErr:r,sseErr:s},a}}}async function la(t){if("url"in t)return ca(t);let e={command:t.command,args:t.args,env:t.env?{...process.env,...t.env}:void 0,stderr:t.stderr??(process.stdout.isTTY&&process.stdin.isTTY?"ignore":void 0)},n=new sa(e),o=xt();return await o.connect(n),{client:o,transport:n}}var vt=class{connections=new Map;async connect(e,n){let o=this.connections.get(e);if(o)return o;let{client:r,transport:s}=await la(n),i=await r.listTools(),a={name:e,client:r,transport:s,tools:(i.tools||[]).map(c=>({name:`${e}_${c.name}`,description:c.description||`Tool from ${e}: ${c.name}`,source:"mcp",serverName:e,originalName:c.name,inputSchema:c.inputSchema,execute:async()=>({content:[]})}))};return this.connections.set(e,a),a}get(e){return this.connections.get(e)}getAll(){return Array.from(this.connections.values())}getAllTools(){let e=[];for(let n of this.connections.values())for(let o of n.tools)e.push({name:o.name,description:o.description,serverName:o.serverName,originalName:o.originalName,inputSchema:o.inputSchema,client:n.client});return e}async closeAll(){let e=Array.from(this.connections.values()).map(async n=>{try{await n.client.close()}catch(o){console.error(`[MCP] Error closing client ${n.name}:`,o)}});await Promise.all(e),this.connections.clear()}get size(){return this.connections.size}};var Tt=class{pool;tools=new Map;shouldLog;constructor(){this.pool=new vt,this.shouldLog=process.env.MEMO_MCP_LOG==="1"||!(process.stdout.isTTY&&process.stdin.isTTY)}async loadServers(e){if(!e||Object.keys(e).length===0)return 0;let n=0;return await Promise.all(Object.entries(e).map(async([o,r])=>{try{let s=await this.pool.connect(o,r);for(let i of s.tools){let a={...i,execute:async c=>{let l=this.pool.get(i.serverName)?.client;if(!l)throw new Error(`MCP client for server '${i.serverName}' not found`);return l.callTool({name:i.originalName,arguments:c})}};this.tools.set(a.name,a)}n+=s.tools.length,this.shouldLog&&console.log(`[MCP] Connected to '${o}' with ${s.tools.length} tools`)}catch(s){this.shouldLog&&console.error(`[MCP] Failed to connect to server '${o}':`,s)}})),n}get(e){return this.tools.get(e)}getAll(){return Array.from(this.tools.values())}toRegistry(){let e={};for(let[n,o]of this.tools)e[n]=o;return e}has(e){return this.tools.has(e)}get size(){return this.tools.size}async dispose(){await this.pool.closeAll(),this.tools.clear()}getPool(){return this.pool}};var St=class{nativeRegistry;mcpRegistry;constructor(){this.nativeRegistry=new yt,this.mcpRegistry=new Tt}registerNativeTool(e){this.nativeRegistry.register(e)}registerNativeTools(e){for(let n of e)this.registerNativeTool(n)}async loadMcpServers(e){return this.mcpRegistry.loadServers(e)}getTool(e){return this.nativeRegistry.get(e)??this.mcpRegistry.get(e)}getAllTools(){return[...this.nativeRegistry.getAll(),...this.mcpRegistry.getAll()]}toRegistry(){return{...this.nativeRegistry.toRegistry(),...this.mcpRegistry.toRegistry()}}hasTool(e){return this.nativeRegistry.has(e)||this.mcpRegistry.has(e)}getToolCount(){let e=this.nativeRegistry.size,n=this.mcpRegistry.size;return{native:e,mcp:n,total:e+n}}async execute(e,n){let o=this.getTool(e);if(!o)throw new Error(`Tool '${e}' not found`);return o.execute(n)}generateToolDefinitions(){return this.getAllTools().map(e=>({name:e.name,description:e.description,input_schema:e.inputSchema||{type:"object",properties:{}}}))}generateToolDescriptions(){let e=this.getAllTools();if(e.length===0)return"";let n=[];n.push("## Available Tools"),n.push("");let o=e.filter(s=>s.source==="native"),r=e.filter(s=>s.source==="mcp");if(o.length>0){n.push("### Built-in Tools"),n.push("");for(let s of o)n.push(this.formatToolDescription(s));n.push("")}if(r.length>0){n.push("### External MCP Tools"),n.push("");let s=this.groupByServer(r);for(let[i,a]of Object.entries(s)){n.push(`**Server: ${i}**`),n.push("");for(let c of a)n.push(this.formatToolDescription(c));n.push("")}}return n.join(`
36
+ `)}async function de(t,e){await Ji(Zi(t),{recursive:!0}),await qi(t,sa(e),"utf-8")}async function oe(){let t=process.env.MEMO_HOME?To(process.env.MEMO_HOME):ea,e=Pe(t,"config.toml");try{await Yi(e);let n=await Xi(e,"utf-8"),o=Qi(n),r=ra(o.providers),s={current_provider:o.current_provider??Xe.current_provider,stream_output:o.stream_output??Xe.stream_output,providers:r,mcp_servers:o.mcp_servers??{}},i=!s.providers.length;return{config:i?Xe:s,home:t,configPath:e,needsSetup:i}}catch{return{config:Xe,home:t,configPath:e,needsSetup:!0}}}function Re(t,e){let n=e||t.current_provider,o=t.providers.find(r=>r.name===n);return o||(t.providers?.[0]??Xe.providers[0])}function gt(t,e){let n=e.historyDir??Pe(t.home,ta);return To(n)}function So(t){return Pe(t.home,na)}function ia(t,e=100){return t.replace(/[\\/:\s]+/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,e)||"root"}function aa(t,e=180){let n=[],o=0;for(let r of t){let s=r.slice(0,Math.max(1,e-o-(n.length>0?1:0)));if(n.push(s),o+=s.length+(n.length>1?1:0),o>=e)break}return n}function ko(t,e){let n=new Date,o=String(n.getFullYear()),r=String(n.getMonth()+1).padStart(2,"0"),s=String(n.getDate()).padStart(2,"0"),i=String(n.getHours()).padStart(2,"0"),a=String(n.getMinutes()).padStart(2,"0"),c=String(n.getSeconds()).padStart(2,"0"),l=bo(process.cwd()),u=`${o}-${r}-${s}_${i}${a}${c}_${e}.jsonl`;return Pe(t,l,u)}function bo(t){let e=t.split(/[/\\]+/).map(o=>ia(o));return aa(e,180).join("-")||"root"}function wo(t,e){return Pe(t,bo(e))}var ht=class{tools=new Map;register(e){this.tools.set(e.name,e)}registerMany(e){for(let n of e)this.register(n)}get(e){return this.tools.get(e)}getAll(){return Array.from(this.tools.values())}toRegistry(){let e={};for(let[n,o]of this.tools)e[n]=o;return e}has(e){return this.tools.has(e)}get size(){return this.tools.size}};import{Client as ca}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as _o}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as la}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{StdioClientTransport as ua}from"@modelcontextprotocol/sdk/client/stdio.js";function yt(){return new ca({name:"memo-code-cli-client",version:"1.0.0"},{capabilities:{}})}function pa(t){if(!(!t||Object.keys(t).length===0))return{headers:t}}function ma(t){let e={...t.http_headers??t.headers??{}};if(t.bearer_token_env_var){let n=process.env[t.bearer_token_env_var];n&&!e.Authorization&&(e.Authorization=`Bearer ${n}`)}return e}async function da(t){let e=new URL(t.url),n=pa(ma(t));if(t.type==="sse"){let r=yt(),s=new _o(e,{requestInit:n});return await r.connect(s),{client:r,transport:s}}let o=t.fallback_to_sse??!0;try{let r=yt(),s=new la(e,{requestInit:n});return await r.connect(s),{client:r,transport:s}}catch(r){if(!o)throw r;try{let s=yt(),i=new _o(e,{requestInit:n});return await s.connect(i),{client:s,transport:i}}catch(s){let i=`Failed to connect via streamable_http (${r.message}); SSE fallback failed (${s.message})`,a=new Error(i);throw a.cause={streamErr:r,sseErr:s},a}}}async function fa(t){if("url"in t)return da(t);let e={command:t.command,args:t.args,env:t.env?{...process.env,...t.env}:void 0,stderr:t.stderr??(process.stdout.isTTY&&process.stdin.isTTY?"ignore":void 0)},n=new ua(e),o=yt();return await o.connect(n),{client:o,transport:n}}var xt=class{connections=new Map;async connect(e,n){let o=this.connections.get(e);if(o)return o;let{client:r,transport:s}=await fa(n),i=await r.listTools(),a={name:e,client:r,transport:s,tools:(i.tools||[]).map(c=>({name:`${e}_${c.name}`,description:c.description||`Tool from ${e}: ${c.name}`,source:"mcp",serverName:e,originalName:c.name,inputSchema:c.inputSchema,execute:async()=>({content:[]})}))};return this.connections.set(e,a),a}get(e){return this.connections.get(e)}getAll(){return Array.from(this.connections.values())}getAllTools(){let e=[];for(let n of this.connections.values())for(let o of n.tools)e.push({name:o.name,description:o.description,serverName:o.serverName,originalName:o.originalName,inputSchema:o.inputSchema,client:n.client});return e}async closeAll(){let e=Array.from(this.connections.values()).map(async n=>{try{await n.client.close()}catch(o){console.error(`[MCP] Error closing client ${n.name}:`,o)}});await Promise.all(e),this.connections.clear()}get size(){return this.connections.size}};var vt=class{pool;tools=new Map;shouldLog;constructor(){this.pool=new xt,this.shouldLog=process.env.MEMO_MCP_LOG==="1"||!(process.stdout.isTTY&&process.stdin.isTTY)}async loadServers(e){if(!e||Object.keys(e).length===0)return 0;let n=0;return await Promise.all(Object.entries(e).map(async([o,r])=>{try{let s=await this.pool.connect(o,r);for(let i of s.tools){let a={...i,execute:async c=>{let l=this.pool.get(i.serverName)?.client;if(!l)throw new Error(`MCP client for server '${i.serverName}' not found`);return l.callTool({name:i.originalName,arguments:c})}};this.tools.set(a.name,a)}n+=s.tools.length,this.shouldLog&&console.log(`[MCP] Connected to '${o}' with ${s.tools.length} tools`)}catch(s){this.shouldLog&&console.error(`[MCP] Failed to connect to server '${o}':`,s)}})),n}get(e){return this.tools.get(e)}getAll(){return Array.from(this.tools.values())}toRegistry(){let e={};for(let[n,o]of this.tools)e[n]=o;return e}has(e){return this.tools.has(e)}get size(){return this.tools.size}async dispose(){await this.pool.closeAll(),this.tools.clear()}getPool(){return this.pool}};var Tt=class{nativeRegistry;mcpRegistry;constructor(){this.nativeRegistry=new ht,this.mcpRegistry=new vt}registerNativeTool(e){this.nativeRegistry.register(e)}registerNativeTools(e){for(let n of e)this.registerNativeTool(n)}async loadMcpServers(e){return this.mcpRegistry.loadServers(e)}getTool(e){return this.nativeRegistry.get(e)??this.mcpRegistry.get(e)}getAllTools(){return[...this.nativeRegistry.getAll(),...this.mcpRegistry.getAll()]}toRegistry(){return{...this.nativeRegistry.toRegistry(),...this.mcpRegistry.toRegistry()}}hasTool(e){return this.nativeRegistry.has(e)||this.mcpRegistry.has(e)}getToolCount(){let e=this.nativeRegistry.size,n=this.mcpRegistry.size;return{native:e,mcp:n,total:e+n}}async execute(e,n){let o=this.getTool(e);if(!o)throw new Error(`Tool '${e}' not found`);return o.execute(n)}generateToolDefinitions(){return this.getAllTools().map(e=>({name:e.name,description:e.description,input_schema:e.inputSchema||{type:"object",properties:{}}}))}generateToolDescriptions(){let e=this.getAllTools();if(e.length===0)return"";let n=[];n.push("## Available Tools"),n.push("");let o=e.filter(s=>s.source==="native"),r=e.filter(s=>s.source==="mcp");if(o.length>0){n.push("### Built-in Tools"),n.push("");for(let s of o)n.push(this.formatToolDescription(s));n.push("")}if(r.length>0){n.push("### External MCP Tools"),n.push("");let s=this.groupByServer(r);for(let[i,a]of Object.entries(s)){n.push(`**Server: ${i}**`),n.push("");for(let c of a)n.push(this.formatToolDescription(c));n.push("")}}return n.join(`
37
37
  `)}formatToolDescription(e){let n=[];return n.push(`#### ${e.name}`),n.push(`- **Description**: ${e.description}`),e.inputSchema&&Object.keys(e.inputSchema).length>0&&n.push(`- **Input Schema**: ${JSON.stringify(e.inputSchema)}`),n.join(`
38
- `)}groupByServer(e){let n={};for(let o of e)if(o.source==="mcp"){let r=o.serverName;n[r]||(n[r]=[]),n[r].push(o)}return n}getToolDescriptions(){return this.getAllTools().map(e=>({name:e.name,description:e.description,source:e.source,serverName:e.source==="mcp"?e.serverName:void 0,inputSchema:e.inputSchema}))}async dispose(){await this.mcpRegistry.dispose()}};import{readFile as pa,access as ma}from"fs/promises";function da(t){try{return{ok:!0,data:JSON.parse(t)}}catch(e){return{ok:!1,raw:t,error:e.message}}}async function ko(t,e,n){let o=await ne(),r=o.config,s=new St;if(s.registerNativeTools(po),await s.loadMcpServers(r.mcp_servers),t.tools)for(let[m,_]of Object.entries(t.tools))s.registerNativeTool({name:m,description:_.description,source:"native",inputSchema:{type:"object"},execute:_.execute});let i=s.toRegistry(),a=async()=>{let m=await(t.loadPrompt??Rn)(),_=s.generateToolDescriptions();_&&(m+=`
38
+ `)}groupByServer(e){let n={};for(let o of e)if(o.source==="mcp"){let r=o.serverName;n[r]||(n[r]=[]),n[r].push(o)}return n}getToolDescriptions(){return this.getAllTools().map(e=>({name:e.name,description:e.description,source:e.source,serverName:e.source==="mcp"?e.serverName:void 0,inputSchema:e.inputSchema}))}async dispose(){await this.mcpRegistry.dispose()}};import{readFile as ha,access as ya}from"fs/promises";function xa(t){try{return{ok:!0,data:JSON.parse(t)}}catch(e){return{ok:!1,raw:t,error:e.message}}}async function Co(t,e,n){let o=await oe(),r=o.config,s=new Tt;if(s.registerNativeTools(ho),await s.loadMcpServers(r.mcp_servers),t.tools)for(let[m,b]of Object.entries(t.tools))s.registerNativeTool({name:m,description:b.description,source:"native",inputSchema:{type:"object"},execute:b.execute});let i=s.toRegistry(),a=async()=>{let m=await(t.loadPrompt??Nn)(),b=s.generateToolDescriptions();b&&(m+=`
39
39
 
40
- ${_}`);let y=yo(o);try{await ma(y);let C=(await pa(y,"utf-8")).trim();C&&(m+=`
40
+ ${b}`);let h=So(o);try{await ya(h);let C=(await ha(h,"utf-8")).trim();C&&(m+=`
41
41
 
42
42
  # Long-Term Memory
43
- ${C}`)}catch{}return m},c=s.generateToolDefinitions(),l=e.stream??r.stream_output??!1,u=ht(o,e),p=xo(u,n),v=new lt(p);return{tools:i,dispose:async()=>{t.dispose&&await t.dispose(),await s.dispose()},callLLM:t.callLLM??(async(m,_,y)=>{let C=Re(r,e.providerName),P=process.env[C.env_api_key]??process.env.OPENAI_API_KEY??process.env.DEEPSEEK_API_KEY;if(!P)throw new Error(`Missing env var ${C.env_api_key} (or OPENAI_API_KEY/DEEPSEEK_API_KEY)`);let g=new ua({apiKey:P,baseURL:C.base_url}),M=c.length>0?c.map(x=>({type:"function",function:{name:x.name,description:x.description,parameters:x.input_schema}})):void 0;if(l){let x=await g.chat.completions.create({model:C.model,messages:m,stream:!0},{signal:y?.signal}),E="";for await(let U of x){let $=U.choices?.[0]?.delta?.content;$&&(E+=$,_?.($))}return{content:E,streamed:!0}}else{let x=await g.chat.completions.create({model:C.model,messages:m,tools:M,tool_choice:M?"auto":void 0},{signal:y?.signal}),E=x.choices?.[0]?.message;if(E?.tool_calls&&E.tool_calls.length>0){let $=[];E.content&&$.push({type:"text",text:E.content});for(let S of E.tool_calls)if(S.type==="function"){let w=da(S.function.arguments);w.ok?$.push({type:"tool_use",id:S.id,name:S.function.name,input:w.data}):$.push({type:"text",text:`[tool_use parse error] ${w.error}; raw: ${w.raw}`})}let V=$.some(S=>S.type==="tool_use");return{content:$,stop_reason:V?"tool_use":"end_turn",usage:{prompt:x.usage?.prompt_tokens??void 0,completion:x.usage?.completion_tokens??void 0,total:x.usage?.total_tokens??void 0}}}let U=E?.content;if(typeof U!="string")throw new Error("OpenAI-compatible API returned empty content");return{content:[{type:"text",text:U}],stop_reason:"end_turn",usage:{prompt:x.usage?.prompt_tokens??void 0,completion:x.usage?.completion_tokens??void 0,total:x.usage?.total_tokens??void 0}}}}),loadPrompt:a,historySinks:t.historySinks??[v],tokenCounter:t.tokenCounter??fo(e.tokenizerModel),historyFilePath:p}}import{jsonrepair as fa}from"jsonrepair";function Zt(t){try{return JSON.parse(t)}catch{try{let e=fa(t);return JSON.parse(e)}catch{return null}}}function ga(t){let e=[],n=new Set,o=/```(?:json)?\s*([\s\S]*?)\s*```/g,r;for(;(r=o.exec(t))!==null;){let i=r[1]||"";if(!i)continue;let a=ha(i);if(!(!a||n.has(a)))try{let c=Zt(a);if(c===null)continue;e.push({json:a,start:r.index,end:r.index+r[0].length,obj:c}),n.add(a)}catch{}}let s=wo(t);for(let{json:i,start:a,end:c}of s)if(!n.has(i)&&!(!i.includes('"tool"')&&!i.includes('"final"')))try{let l=Zt(i);if(l===null)continue;e.push({json:i,start:a,end:c,obj:l}),n.add(i)}catch{}return e}function ha(t){return wo(t)[0]?.json??null}function wo(t){let e=[],n=0,o=-1,r=!1,s=!1;for(let i=0;i<t.length;i++){let a=t[i];if(s){s=!1;continue}if(a==="\\"&&r){s=!0;continue}if(a==='"'&&!r?r=!0:a==='"'&&r&&(r=!1),!r){if(a==="{")n===0&&(o=i),n++;else if(a==="}"&&(n--,n===0&&o!==-1)){let c=t.slice(o,i+1);e.push({json:c,start:o,end:i+1}),o=-1}}}return e}function ya(t){let e=[],n=/<\s*(think|thinking)\s*>([\s\S]*?)<\/\s*\1\s*>/gi,o=t.replace(n,(r,s,i)=>{let a=(i??"").trim();return a&&e.push(a),a});return{thinkingParts:e,cleaned:o.trim()}}function Qt(t){if(t.length===0)return;let e=t.join(`
44
- `),{thinkingParts:n,cleaned:o}=ya(e);return n.length>0?n.join(`
43
+ ${C}`)}catch{}return m},c=s.generateToolDefinitions(),l=e.stream??r.stream_output??!1,u=gt(o,e),p=ko(u,n),v=new ct(p);return{tools:i,dispose:async()=>{t.dispose&&await t.dispose(),await s.dispose()},callLLM:t.callLLM??(async(m,b,h)=>{let C=Re(r,e.providerName),P=process.env[C.env_api_key]??process.env.OPENAI_API_KEY??process.env.DEEPSEEK_API_KEY;if(!P)throw new Error(`Missing env var ${C.env_api_key} (or OPENAI_API_KEY/DEEPSEEK_API_KEY)`);let g=new ga({apiKey:P,baseURL:C.base_url}),A=c.length>0?c.map(y=>({type:"function",function:{name:y.name,description:y.description,parameters:y.input_schema}})):void 0;if(l){let y=await g.chat.completions.create({model:C.model,messages:m,stream:!0},{signal:h?.signal}),E="";for await(let U of y){let I=U.choices?.[0]?.delta?.content;I&&(E+=I,b?.(I))}return{content:E,streamed:!0}}else{let y=await g.chat.completions.create({model:C.model,messages:m,tools:A,tool_choice:A?"auto":void 0},{signal:h?.signal}),E=y.choices?.[0]?.message;if(E?.tool_calls&&E.tool_calls.length>0){let I=[];E.content&&I.push({type:"text",text:E.content});for(let k of E.tool_calls)if(k.type==="function"){let _=xa(k.function.arguments);_.ok?I.push({type:"tool_use",id:k.id,name:k.function.name,input:_.data}):I.push({type:"text",text:`[tool_use parse error] ${_.error}; raw: ${_.raw}`})}let V=I.some(k=>k.type==="tool_use");return{content:I,stop_reason:V?"tool_use":"end_turn",usage:{prompt:y.usage?.prompt_tokens??void 0,completion:y.usage?.completion_tokens??void 0,total:y.usage?.total_tokens??void 0}}}let U=E?.content;if(typeof U!="string")throw new Error("OpenAI-compatible API returned empty content");return{content:[{type:"text",text:U}],stop_reason:"end_turn",usage:{prompt:y.usage?.prompt_tokens??void 0,completion:y.usage?.completion_tokens??void 0,total:y.usage?.total_tokens??void 0}}}}),loadPrompt:a,historySinks:t.historySinks??[v],tokenCounter:t.tokenCounter??xo(e.tokenizerModel),historyFilePath:p}}import{jsonrepair as va}from"jsonrepair";function en(t){try{return JSON.parse(t)}catch{try{let e=va(t);return JSON.parse(e)}catch{return null}}}function Ta(t){let e=[],n=new Set,o=/```(?:json)?\s*([\s\S]*?)\s*```/g,r;for(;(r=o.exec(t))!==null;){let i=r[1]||"";if(!i)continue;let a=Sa(i);if(!(!a||n.has(a)))try{let c=en(a);if(c===null)continue;e.push({json:a,start:r.index,end:r.index+r[0].length,obj:c}),n.add(a)}catch{}}let s=Mo(t);for(let{json:i,start:a,end:c}of s)if(!n.has(i)&&!(!i.includes('"tool"')&&!i.includes('"final"')))try{let l=en(i);if(l===null)continue;e.push({json:i,start:a,end:c,obj:l}),n.add(i)}catch{}return e}function Sa(t){return Mo(t)[0]?.json??null}function Mo(t){let e=[],n=0,o=-1,r=!1,s=!1;for(let i=0;i<t.length;i++){let a=t[i];if(s){s=!1;continue}if(a==="\\"&&r){s=!0;continue}if(a==='"'&&!r?r=!0:a==='"'&&r&&(r=!1),!r){if(a==="{")n===0&&(o=i),n++;else if(a==="}"&&(n--,n===0&&o!==-1)){let c=t.slice(o,i+1);e.push({json:c,start:o,end:i+1}),o=-1}}}return e}function ka(t){let e=[],n=/<\s*(think|thinking)\s*>([\s\S]*?)<\/\s*\1\s*>/gi,o=t.replace(n,(r,s,i)=>{let a=(i??"").trim();return a&&e.push(a),a});return{thinkingParts:e,cleaned:o.trim()}}function tn(t){if(t.length===0)return;let e=t.join(`
44
+ `),{thinkingParts:n,cleaned:o}=ka(e);return n.length>0?n.join(`
45
45
 
46
- `):o||void 0}function _o(t){return t!==null&&typeof t=="object"&&"tool"in t&&typeof t.tool=="string"}function bo(t){return t!==null&&typeof t=="object"&&"final"in t&&typeof t.final=="string"}function Co(t){let e={},n=ga(t);for(let{json:r,start:s,end:i,obj:a}of n){if(_o(a)){e.action={tool:a.tool.trim(),input:a.input};let c=t.slice(0,s).trim(),l=t.slice(i).trim(),u=[];c&&u.push(c),l&&u.push(l);let p=Qt(u);return p&&(e.thinking=p),e}if(bo(a))return e.final=a.final,e}let o=t.trim();if(o.startsWith("{")&&o.endsWith("}")){let r=Zt(o);if(r&&_o(r))return e.action={tool:r.tool,input:r.input},e;if(r&&bo(r))return e.final=r.final,e}return t.trim()&&(e.final=t),e}import{randomUUID as Ro}from"crypto";function xa(){return{onTurnStart:[],onAction:[],onObservation:[],onFinal:[],onApprovalRequest:[],onApprovalResponse:[]}}function Eo(t,e){e&&(e.onTurnStart&&t.onTurnStart.push(e.onTurnStart),e.onAction&&t.onAction.push(e.onAction),e.onObservation&&t.onObservation.push(e.onObservation),e.onFinal&&t.onFinal.push(e.onFinal),e.onApprovalRequest&&t.onApprovalRequest.push(e.onApprovalRequest),e.onApprovalResponse&&t.onApprovalResponse.push(e.onApprovalResponse))}function Ao(t){let e=xa();if(Eo(e,t.hooks),Array.isArray(t.middlewares))for(let n of t.middlewares)Eo(e,n);return e}async function Y(t,e,n){let o=t[e];if(o.length)for(let r of o)try{await r(n)}catch(s){console.warn(`Hook ${e} failed: ${s.message}`)}}function je(t){return t.map(e=>({...e}))}var en={read:"read",glob:"read",grep:"read",webfetch:"read",todo:"read",write:"write",edit:"write",save_memory:"write",bash:"execute"};var kt={read:0,write:1,execute:2},tn={read:t=>`${t} \u5C06\u8BFB\u53D6\u6587\u4EF6\u6216\u6570\u636E`,write:t=>`${t} \u5C06\u4FEE\u6539\u6216\u521B\u5EFA\u6587\u4EF6`,execute:t=>`${t} \u5C06\u6267\u884C\u7CFB\u7EDF\u547D\u4EE4`};function nn(t){let e={...en,...t?.customLevels};return{getRiskLevel(n){if(n in e)return e[n];let o=n.toLowerCase();return o.includes("exec")||o.includes("run")||o.includes("shell")||o.includes("bash")||o.includes("command")?"execute":o.includes("write")||o.includes("edit")||o.includes("create")||o.includes("delete")||o.includes("modify")||o.includes("update")?"write":o.includes("read")||o.includes("get")||o.includes("fetch")||o.includes("search")||o.includes("list")||o.includes("find")?"read":"write"},compareRisk(n,o){return kt[n]-kt[o]},needsApproval(n,o){return o==="strict"?!0:n==="write"||n==="execute"}}}import{createHash as va}from"crypto";function _t(t){return t===null||typeof t!="object"?JSON.stringify(t):Array.isArray(t)?"["+t.map(n=>_t(n)).join(",")+"]":`{${Object.entries(t).sort(([n],[o])=>n.localeCompare(o)).map(([n,o])=>`${JSON.stringify(n)}:${_t(o)}`).join(",")}}`}function on(t,e){let n=_t(e),o=`${t}:${n}`;return va("sha256").update(o).digest("hex").slice(0,16)}function rn(t){let{mode:e="auto",dangerous:n=!1,toolRiskLevels:o}=t||{};if(n)return{isDangerousMode:!0,getRiskLevel:()=>"read",check:()=>({needApproval:!1,decision:"auto-execute"}),recordDecision:()=>{},isGranted:()=>!0,clearOnceApprovals:()=>{},dispose:()=>{}};let r=nn({customLevels:o}),s={session:new Set,once:new Set,denied:new Set};return{get isDangerousMode(){return!1},getRiskLevel(i){return r.getRiskLevel(i)},check(i,a){let c=r.getRiskLevel(i);if(!r.needsApproval(c,e))return{needApproval:!1,decision:"auto-execute"};let l=on(i,a);return s.session.has(l)||s.once.has(l)?{needApproval:!1,decision:"auto-execute"}:s.denied.has(l)?{needApproval:!0,fingerprint:l,riskLevel:c,reason:"\u8BE5\u8BF7\u6C42\u5DF2\u88AB\u62D2\u7EDD",toolName:i,params:a}:{needApproval:!0,fingerprint:l,riskLevel:c,reason:tn[c](i),toolName:i,params:a}},recordDecision(i,a){switch(s.session.delete(i),s.once.delete(i),s.denied.delete(i),a){case"session":s.session.add(i);break;case"once":s.once.add(i);break;case"deny":s.denied.add(i);break}},isGranted(i){return s.session.has(i)||s.once.has(i)},clearOnceApprovals(){s.once.clear()},dispose(){s.session.clear(),s.once.clear(),s.denied.clear()}}}var $o="interactive";function Mo(){return{prompt:0,completion:0,total:0}}function Po(t,e){if(!e)return;let n=e.prompt??0,o=e.completion??0,r=e.total??n+o;t.prompt+=n,t.completion+=o,t.total+=r}function Ta(t){if(typeof t=="string")return{textContent:t,toolUseBlocks:[]};if("content"in t&&typeof t.content=="string")return{textContent:t.content,toolUseBlocks:[],usage:"usage"in t?t.usage:void 0,streamed:"streamed"in t?t.streamed:void 0};if("content"in t&&Array.isArray(t.content)){let e=t.content.filter(o=>o.type==="text"),n=t.content.filter(o=>o.type==="tool_use");return{textContent:e.map(o=>o.text).join(`
47
- `),toolUseBlocks:n.map(o=>({id:o.id,name:o.name,input:o.input})),stopReason:"stop_reason"in t?t.stop_reason:void 0,usage:"usage"in t?t.usage:void 0}}return{textContent:"",toolUseBlocks:[]}}async function Sa(t,e){for(let n of e)try{await n.append(t)}catch(o){console.error(`Failed to write history event: ${o.message}`)}}function ka(t){return(t.content?.flatMap(n=>n.type==="text"?[n.text]:[])??[]).join(`
48
- `)}function _a(t,e){let n=e;if(typeof e=="string"){let o=e.trim();if(o)try{n=JSON.parse(o)}catch{n=o}else n={}}return typeof n!="object"||n===null?{ok:!1,error:`${t.name} invalid input: expected object`}:{ok:!0,data:n}}function ba(t){return t instanceof Error&&t.name==="AbortError"}function bt(t){return t===null||typeof t!="object"?JSON.stringify(t):Array.isArray(t)?`[${t.map(n=>bt(n)).join(",")}]`:`{${Object.entries(t).sort(([n],[o])=>n.localeCompare(o)).map(([n,o])=>`${JSON.stringify(n)}:${bt(o)}`).join(",")}}`}var sn=class{constructor(e,n,o,r,s){this.deps=e;this.options=n;this.id=n.sessionId||Ro(),this.mode=n.mode||$o,this.history=[{role:"system",content:o}],this.tokenCounter=r,this.sinks=e.historySinks??[],this.hooks=Ao(e),this.historyFilePath=s,this.approvalManager=rn({dangerous:!1,mode:"auto"})}id;mode;history;historyFilePath;turnIndex=0;tokenCounter;sinks;sessionUsage=Mo();startedAt=Date.now();hooks;closed=!1;sessionStartEmitted=!1;currentAbortController=null;cancelling=!1;lastActionSignature=null;repeatedActionCount=0;approvalManager;async init(){}resetActionRepetition(){this.lastActionSignature=null,this.repeatedActionCount=0}maybeWarnRepeatedAction(e,n){let o=`${e}:${bt(n)}`;if(this.lastActionSignature===o?this.repeatedActionCount+=1:(this.lastActionSignature=o,this.repeatedActionCount=1),this.repeatedActionCount===3){let r=bt(n).slice(0,200),s=`\u7CFB\u7EDF\u63D0\u9192\uFF1A\u4F60\u5DF2\u8FDE\u7EED3\u6B21\u8C03\u7528\u540C\u4E00\u5DE5\u5177\u300C${e}\u300D\u4E14\u53C2\u6570\u76F8\u540C\uFF08${r}${r.length>=200?"\u2026":""}\uFF09\u3002\u8BF7\u786E\u8BA4\u662F\u5426\u9677\u5165\u5FAA\u73AF\uFF0C\u5FC5\u8981\u65F6\u76F4\u63A5\u7ED9\u51FA\u6700\u7EC8\u56DE\u7B54\u6216\u8C03\u6574\u53C2\u6570\u3002`;this.history.push({role:"system",content:s})}}async executeToolWithApproval(e,n,o,r){let s=this.approvalManager.check(e,n);if(!s.needApproval)return this.doExecuteTool(e,n);let i={toolName:s.toolName,params:s.params,fingerprint:s.fingerprint,riskLevel:s.riskLevel,reason:s.reason};await Y(this.hooks,"onApprovalRequest",{sessionId:this.id,turn:o,step:r,request:i});let a="deny";return this.deps.requestApproval?a=await this.deps.requestApproval(i):a="deny",this.approvalManager.recordDecision(s.fingerprint,a),await Y(this.hooks,"onApprovalResponse",{sessionId:this.id,turn:o,step:r,fingerprint:s.fingerprint,decision:a}),a==="deny"?{success:!1,observation:`\u7528\u6237\u62D2\u7EDD\u4E86\u5DE5\u5177\u6267\u884C: ${e}`,rejected:!0}:this.doExecuteTool(e,n)}async doExecuteTool(e,n){let o=this.deps.tools[e];if(!o)return{success:!1,observation:`Unknown tool: ${e}`};try{let r=_a(o,n);if(!r.ok)return{success:!1,observation:r.error};let s=await o.execute(r.data);return{success:!0,observation:ka(s)||"(no tool output)"}}catch(r){return{success:!1,observation:`Tool execution failed: ${r.message}`}}}async runTurn(e){let n=new AbortController;this.currentAbortController=n,this.cancelling=!1,this.turnIndex+=1;let o=this.turnIndex,r=[],s=Mo(),i=Date.now();this.sessionStartEmitted||(await this.emitEvent("session_start",{meta:{mode:this.mode,tokenizer:this.tokenCounter.model,warnPromptTokens:this.options.warnPromptTokens,maxPromptTokens:this.options.maxPromptTokens}}),this.sessionStartEmitted=!0),this.history.push({role:"user",content:e});try{let a=this.tokenCounter.countMessages(this.history);await this.emitEvent("turn_start",{turn:o,content:e,meta:{tokens:{prompt:a}}}),await Y(this.hooks,"onTurnStart",{sessionId:this.id,turn:o,input:e,promptTokens:a,history:je(this.history)});let c="",l="ok",u;for(let p=0;;p++){let v=this.tokenCounter.countMessages(this.history);if(this.options.maxPromptTokens&&v>this.options.maxPromptTokens){let S=`Context tokens (${v}) exceed the limit. Please shorten the input or restart the session.`,w=JSON.stringify({final:S});this.history.push({role:"assistant",content:w}),l="prompt_limit",c=S,u=S,await this.emitEvent("final",{turn:o,step:p,content:S,role:"assistant",meta:{tokens:{prompt:v}}}),await Y(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:S,status:l,errorMessage:u,turnUsage:{...s},steps:r});break}this.options.warnPromptTokens&&v>this.options.warnPromptTokens&&console.warn(`Prompt tokens are near the limit: ${v}`);let m="",_=[],y,C=!1,P;try{let S=await this.deps.callLLM(this.history,j=>this.deps.onAssistantStep?.(j,p),{signal:n.signal}),w=Ta(S);m=w.textContent,_=w.toolUseBlocks,P=w.stopReason,y=w.usage,C=!!w.streamed}catch(S){if(this.cancelling&&ba(S)){l="cancelled",c="",u="Turn cancelled",await this.emitEvent("final",{turn:o,step:p,content:"",role:"assistant",meta:{cancelled:!0}}),await Y(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,errorMessage:u,turnUsage:{...s},steps:r});break}let w=`LLM call failed: ${S.message}`,j=JSON.stringify({final:w});this.history.push({role:"assistant",content:j}),l="error",c=w,u=w,await this.emitEvent("final",{turn:o,content:w,role:"assistant"}),await Y(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,errorMessage:u,turnUsage:{...s},steps:r});break}C||this.deps.onAssistantStep?.(m,p);let g;if(_.length>0){let S=_[0];if(S){let w=m?Qt([m]):void 0;g={action:{tool:S.name,input:S.input},thinking:w}}else g={}}else m?g=Co(m):g={};let M=g.action?JSON.stringify({tool:g.action.tool,input:g.action.input}):g.final?JSON.stringify({final:g.final}):m;this.history.push({role:"assistant",content:M});let x=this.tokenCounter.countText(m),E=y?.prompt??v,U=y?.completion??x,$=y?.total??E+U,V={prompt:E,completion:U,total:$};if(Po(s,V),Po(this.sessionUsage,V),r.push({index:p,assistantText:m,parsed:g,tokenUsage:V}),await this.emitEvent("assistant",{turn:o,step:p,content:m,role:"assistant",meta:{tokens:V}}),_.length>1){for(let H of _)this.maybeWarnRepeatedAction(H.name,H.input);await this.emitEvent("action",{turn:o,step:p,meta:{tools:_.map(H=>H.name),parallel:!0,thinking:g.thinking,toolBlocks:_.map(H=>({name:H.name,input:H.input}))}});let S=_[0];S&&await Y(this.hooks,"onAction",{sessionId:this.id,turn:o,step:p,action:{tool:S.name,input:S.input},parallelActions:_.map(H=>({tool:H.name,input:H.input})),thinking:g.thinking,history:je(this.history)});let w=[],j=!1;for(let[H,B]of _.entries()){let ue=await this.executeToolWithApproval(B.name,B.input,o,p);if(ue.rejected){j=!0,w.push(`[${B.name}]: ${ue.observation}`),await this.emitEvent("observation",{turn:o,step:p,content:ue.observation,meta:{tool:B.name,index:H}});break}w.push(`[${B.name}]: ${ue.observation}`),await this.emitEvent("observation",{turn:o,step:p,content:ue.observation,meta:{tool:B.name,index:H}})}let re=w.join(`
46
+ `):o||void 0}function Eo(t){return t!==null&&typeof t=="object"&&"tool"in t&&typeof t.tool=="string"}function Ao(t){return t!==null&&typeof t=="object"&&"final"in t&&typeof t.final=="string"}function Po(t){let e={},n=Ta(t);for(let{json:r,start:s,end:i,obj:a}of n){if(Eo(a)){e.action={tool:a.tool.trim(),input:a.input};let c=t.slice(0,s).trim(),l=t.slice(i).trim(),u=[];c&&u.push(c),l&&u.push(l);let p=tn(u);return p&&(e.thinking=p),e}if(Ao(a))return e.final=a.final,e}let o=t.trim();if(o.startsWith("{")&&o.endsWith("}")){let r=en(o);if(r&&Eo(r))return e.action={tool:r.tool,input:r.input},e;if(r&&Ao(r))return e.final=r.final,e}return t.trim()&&(e.final=t),e}import{randomUUID as No}from"crypto";function ba(){return{onTurnStart:[],onAction:[],onObservation:[],onFinal:[],onApprovalRequest:[],onApprovalResponse:[]}}function Ro(t,e){e&&(e.onTurnStart&&t.onTurnStart.push(e.onTurnStart),e.onAction&&t.onAction.push(e.onAction),e.onObservation&&t.onObservation.push(e.onObservation),e.onFinal&&t.onFinal.push(e.onFinal),e.onApprovalRequest&&t.onApprovalRequest.push(e.onApprovalRequest),e.onApprovalResponse&&t.onApprovalResponse.push(e.onApprovalResponse))}function $o(t){let e=ba();if(Ro(e,t.hooks),Array.isArray(t.middlewares))for(let n of t.middlewares)Ro(e,n);return e}async function Q(t,e,n){let o=t[e];if(o.length)for(let r of o)try{await r(n)}catch(s){console.warn(`Hook ${e} failed: ${s.message}`)}}function je(t){return t.map(e=>({...e}))}var nn={read:"read",glob:"read",grep:"read",webfetch:"read",todo:"read",write:"write",edit:"write",save_memory:"write",bash:"execute"};var St={read:0,write:1,execute:2},on={read:t=>`${t} \u5C06\u8BFB\u53D6\u6587\u4EF6\u6216\u6570\u636E`,write:t=>`${t} \u5C06\u4FEE\u6539\u6216\u521B\u5EFA\u6587\u4EF6`,execute:t=>`${t} \u5C06\u6267\u884C\u7CFB\u7EDF\u547D\u4EE4`};function rn(t){let e={...nn,...t?.customLevels};return{getRiskLevel(n){if(n in e)return e[n];let o=n.toLowerCase();return o.includes("exec")||o.includes("run")||o.includes("shell")||o.includes("bash")||o.includes("command")?"execute":o.includes("write")||o.includes("edit")||o.includes("create")||o.includes("delete")||o.includes("modify")||o.includes("update")?"write":o.includes("read")||o.includes("get")||o.includes("fetch")||o.includes("search")||o.includes("list")||o.includes("find")?"read":"write"},compareRisk(n,o){return St[n]-St[o]},needsApproval(n,o){return o==="strict"?!0:n==="write"||n==="execute"}}}import{createHash as wa}from"crypto";function kt(t){return t===null||typeof t!="object"?JSON.stringify(t):Array.isArray(t)?"["+t.map(n=>kt(n)).join(",")+"]":`{${Object.entries(t).sort(([n],[o])=>n.localeCompare(o)).map(([n,o])=>`${JSON.stringify(n)}:${kt(o)}`).join(",")}}`}function sn(t,e){let n=kt(e),o=`${t}:${n}`;return wa("sha256").update(o).digest("hex").slice(0,16)}function an(t){let{mode:e="auto",dangerous:n=!1,toolRiskLevels:o}=t||{};if(n)return{isDangerousMode:!0,getRiskLevel:()=>"read",check:()=>({needApproval:!1,decision:"auto-execute"}),recordDecision:()=>{},isGranted:()=>!0,clearOnceApprovals:()=>{},dispose:()=>{}};let r=rn({customLevels:o}),s={session:new Set,once:new Set,denied:new Set};return{get isDangerousMode(){return!1},getRiskLevel(i){return r.getRiskLevel(i)},check(i,a){let c=r.getRiskLevel(i);if(!r.needsApproval(c,e))return{needApproval:!1,decision:"auto-execute"};let l=sn(i,a);return s.session.has(l)||s.once.has(l)?{needApproval:!1,decision:"auto-execute"}:s.denied.has(l)?{needApproval:!0,fingerprint:l,riskLevel:c,reason:"\u8BE5\u8BF7\u6C42\u5DF2\u88AB\u62D2\u7EDD",toolName:i,params:a}:{needApproval:!0,fingerprint:l,riskLevel:c,reason:on[c](i),toolName:i,params:a}},recordDecision(i,a){switch(s.session.delete(i),s.once.delete(i),s.denied.delete(i),a){case"session":s.session.add(i);break;case"once":s.once.add(i);break;case"deny":s.denied.add(i);break}},isGranted(i){return s.session.has(i)||s.once.has(i)},clearOnceApprovals(){s.once.clear()},dispose(){s.session.clear(),s.once.clear(),s.denied.clear()}}}var Oo="interactive";function Io(){return{prompt:0,completion:0,total:0}}function Lo(t,e){if(!e)return;let n=e.prompt??0,o=e.completion??0,r=e.total??n+o;t.prompt+=n,t.completion+=o,t.total+=r}function _a(t){if(typeof t=="string")return{textContent:t,toolUseBlocks:[]};if("content"in t&&typeof t.content=="string")return{textContent:t.content,toolUseBlocks:[],usage:"usage"in t?t.usage:void 0,streamed:"streamed"in t?t.streamed:void 0};if("content"in t&&Array.isArray(t.content)){let e=t.content.filter(o=>o.type==="text"),n=t.content.filter(o=>o.type==="tool_use");return{textContent:e.map(o=>o.text).join(`
47
+ `),toolUseBlocks:n.map(o=>({id:o.id,name:o.name,input:o.input})),stopReason:"stop_reason"in t?t.stop_reason:void 0,usage:"usage"in t?t.usage:void 0}}return{textContent:"",toolUseBlocks:[]}}async function Ca(t,e){for(let n of e)try{await n.append(t)}catch(o){console.error(`Failed to write history event: ${o.message}`)}}function Ea(t){return(t.content?.flatMap(n=>n.type==="text"?[n.text]:[])??[]).join(`
48
+ `)}function Aa(t,e){let n=e;if(typeof e=="string"){let o=e.trim();if(o)try{n=JSON.parse(o)}catch{n=o}else n={}}return typeof n!="object"||n===null?{ok:!1,error:`${t.name} invalid input: expected object`}:{ok:!0,data:n}}function Ma(t){return t instanceof Error&&t.name==="AbortError"}function bt(t){return t===null||typeof t!="object"?JSON.stringify(t):Array.isArray(t)?`[${t.map(n=>bt(n)).join(",")}]`:`{${Object.entries(t).sort(([n],[o])=>n.localeCompare(o)).map(([n,o])=>`${JSON.stringify(n)}:${bt(o)}`).join(",")}}`}var cn=class{constructor(e,n,o,r,s){this.deps=e;this.options=n;this.id=n.sessionId||No(),this.mode=n.mode||Oo,this.history=[{role:"system",content:o}],this.tokenCounter=r,this.sinks=e.historySinks??[],this.hooks=$o(e),this.historyFilePath=s,this.approvalManager=an({dangerous:!1,mode:"auto"})}id;mode;history;historyFilePath;turnIndex=0;tokenCounter;sinks;sessionUsage=Io();startedAt=Date.now();hooks;closed=!1;sessionStartEmitted=!1;currentAbortController=null;cancelling=!1;lastActionSignature=null;repeatedActionCount=0;approvalManager;async init(){}resetActionRepetition(){this.lastActionSignature=null,this.repeatedActionCount=0}maybeWarnRepeatedAction(e,n){let o=`${e}:${bt(n)}`;if(this.lastActionSignature===o?this.repeatedActionCount+=1:(this.lastActionSignature=o,this.repeatedActionCount=1),this.repeatedActionCount===3){let r=bt(n).slice(0,200),s=`\u7CFB\u7EDF\u63D0\u9192\uFF1A\u4F60\u5DF2\u8FDE\u7EED3\u6B21\u8C03\u7528\u540C\u4E00\u5DE5\u5177\u300C${e}\u300D\u4E14\u53C2\u6570\u76F8\u540C\uFF08${r}${r.length>=200?"\u2026":""}\uFF09\u3002\u8BF7\u786E\u8BA4\u662F\u5426\u9677\u5165\u5FAA\u73AF\uFF0C\u5FC5\u8981\u65F6\u76F4\u63A5\u7ED9\u51FA\u6700\u7EC8\u56DE\u7B54\u6216\u8C03\u6574\u53C2\u6570\u3002`;this.history.push({role:"system",content:s})}}async executeToolWithApproval(e,n,o,r){let s=this.approvalManager.check(e,n);if(!s.needApproval)return this.doExecuteTool(e,n);let i={toolName:s.toolName,params:s.params,fingerprint:s.fingerprint,riskLevel:s.riskLevel,reason:s.reason};await Q(this.hooks,"onApprovalRequest",{sessionId:this.id,turn:o,step:r,request:i});let a="deny";return this.deps.requestApproval?a=await this.deps.requestApproval(i):a="deny",this.approvalManager.recordDecision(s.fingerprint,a),await Q(this.hooks,"onApprovalResponse",{sessionId:this.id,turn:o,step:r,fingerprint:s.fingerprint,decision:a}),a==="deny"?{success:!1,observation:`\u7528\u6237\u62D2\u7EDD\u4E86\u5DE5\u5177\u6267\u884C: ${e}`,rejected:!0}:this.doExecuteTool(e,n)}async doExecuteTool(e,n){let o=this.deps.tools[e];if(!o)return{success:!1,observation:`Unknown tool: ${e}`};try{let r=Aa(o,n);if(!r.ok)return{success:!1,observation:r.error};let s=await o.execute(r.data);return{success:!0,observation:Ea(s)||"(no tool output)"}}catch(r){return{success:!1,observation:`Tool execution failed: ${r.message}`}}}async runTurn(e){let n=new AbortController;this.currentAbortController=n,this.cancelling=!1,this.turnIndex+=1;let o=this.turnIndex,r=[],s=Io(),i=Date.now();this.sessionStartEmitted||(await this.emitEvent("session_start",{meta:{mode:this.mode,tokenizer:this.tokenCounter.model,warnPromptTokens:this.options.warnPromptTokens,maxPromptTokens:this.options.maxPromptTokens}}),this.sessionStartEmitted=!0),this.history.push({role:"user",content:e});try{let a=this.tokenCounter.countMessages(this.history);await this.emitEvent("turn_start",{turn:o,content:e,meta:{tokens:{prompt:a}}}),await Q(this.hooks,"onTurnStart",{sessionId:this.id,turn:o,input:e,promptTokens:a,history:je(this.history)});let c="",l="ok",u;for(let p=0;;p++){let v=this.tokenCounter.countMessages(this.history);if(this.options.maxPromptTokens&&v>this.options.maxPromptTokens){let k=`Context tokens (${v}) exceed the limit. Please shorten the input or restart the session.`,_=JSON.stringify({final:k});this.history.push({role:"assistant",content:_}),l="prompt_limit",c=k,u=k,await this.emitEvent("final",{turn:o,step:p,content:k,role:"assistant",meta:{tokens:{prompt:v}}}),await Q(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:k,status:l,errorMessage:u,turnUsage:{...s},steps:r});break}this.options.warnPromptTokens&&v>this.options.warnPromptTokens&&console.warn(`Prompt tokens are near the limit: ${v}`);let m="",b=[],h,C=!1,P;try{let k=await this.deps.callLLM(this.history,j=>this.deps.onAssistantStep?.(j,p),{signal:n.signal}),_=_a(k);m=_.textContent,b=_.toolUseBlocks,P=_.stopReason,h=_.usage,C=!!_.streamed}catch(k){if(this.cancelling&&Ma(k)){l="cancelled",c="",u="Turn cancelled",await this.emitEvent("final",{turn:o,step:p,content:"",role:"assistant",meta:{cancelled:!0}}),await Q(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,errorMessage:u,turnUsage:{...s},steps:r});break}let _=`LLM call failed: ${k.message}`,j=JSON.stringify({final:_});this.history.push({role:"assistant",content:j}),l="error",c=_,u=_,await this.emitEvent("final",{turn:o,content:_,role:"assistant"}),await Q(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,errorMessage:u,turnUsage:{...s},steps:r});break}C||this.deps.onAssistantStep?.(m,p);let g;if(b.length>0){let k=b[0];if(k){let _=m?tn([m]):void 0;g={action:{tool:k.name,input:k.input},thinking:_}}else g={}}else m?g=Po(m):g={};let A=g.action?JSON.stringify({tool:g.action.tool,input:g.action.input}):g.final?JSON.stringify({final:g.final}):m;this.history.push({role:"assistant",content:A});let y=this.tokenCounter.countText(m),E=h?.prompt??v,U=h?.completion??y,I=h?.total??E+U,V={prompt:E,completion:U,total:I};if(Lo(s,V),Lo(this.sessionUsage,V),r.push({index:p,assistantText:m,parsed:g,tokenUsage:V}),await this.emitEvent("assistant",{turn:o,step:p,content:m,role:"assistant",meta:{tokens:V}}),b.length>1){for(let H of b)this.maybeWarnRepeatedAction(H.name,H.input);await this.emitEvent("action",{turn:o,step:p,meta:{tools:b.map(H=>H.name),parallel:!0,thinking:g.thinking,toolBlocks:b.map(H=>({name:H.name,input:H.input}))}});let k=b[0];k&&await Q(this.hooks,"onAction",{sessionId:this.id,turn:o,step:p,action:{tool:k.name,input:k.input},parallelActions:b.map(H=>({tool:H.name,input:H.input})),thinking:g.thinking,history:je(this.history)});let _=[],j=!1;for(let[H,B]of b.entries()){let pe=await this.executeToolWithApproval(B.name,B.input,o,p);if(pe.rejected){j=!0,_.push(`[${B.name}]: ${pe.observation}`),await this.emitEvent("observation",{turn:o,step:p,content:pe.observation,meta:{tool:B.name,index:H}});break}_.push(`[${B.name}]: ${pe.observation}`),await this.emitEvent("observation",{turn:o,step:p,content:pe.observation,meta:{tool:B.name,index:H}})}let ie=_.join(`
49
49
 
50
- `);this.history.push({role:"user",content:JSON.stringify({observation:re})});let J=r[r.length-1];if(J&&(J.observation=re),await Y(this.hooks,"onObservation",{sessionId:this.id,turn:o,step:p,tool:_.map(H=>H.name).join(", "),observation:re,history:je(this.history)}),j){l="cancelled",c="\u7528\u6237\u62D2\u7EDD\u4E86\u5DE5\u5177\u6267\u884C\uFF0C\u5DF2\u505C\u6B62\u5F53\u524D\u64CD\u4F5C\u3002",await this.emitEvent("final",{turn:o,step:p,content:c,role:"assistant",meta:{rejected:!0}}),await Y(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,tokenUsage:V,turnUsage:{...s},steps:r});break}continue}else if(g.action){this.maybeWarnRepeatedAction(g.action.tool,g.action.input),await this.emitEvent("action",{turn:o,step:p,meta:{tool:g.action.tool,input:g.action.input,thinking:g.thinking}}),await Y(this.hooks,"onAction",{sessionId:this.id,turn:o,step:p,action:g.action,thinking:g.thinking,history:je(this.history)});let S=await this.executeToolWithApproval(g.action.tool,g.action.input,o,p);if(S.rejected){l="cancelled",c="\u7528\u6237\u62D2\u7EDD\u4E86\u5DE5\u5177\u6267\u884C\uFF0C\u5DF2\u505C\u6B62\u5F53\u524D\u64CD\u4F5C\u3002",await this.emitEvent("final",{turn:o,step:p,content:c,role:"assistant",meta:{rejected:!0}}),await Y(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,tokenUsage:V,turnUsage:{...s},steps:r});break}let w=S.observation;this.history.push({role:"user",content:JSON.stringify({observation:w,tool:g.action.tool})});let j=r[r.length-1];j&&(j.observation=w),await this.emitEvent("observation",{turn:o,step:p,content:w,meta:{tool:g.action.tool}}),await Y(this.hooks,"onObservation",{sessionId:this.id,turn:o,step:p,tool:g.action.tool,observation:w,history:je(this.history)});continue}if(P==="end_turn"||g.final){this.resetActionRepetition(),c=g.final||m,g.final&&(g.final=c),await this.emitEvent("final",{turn:o,step:p,content:c,role:"assistant",meta:{tokens:V}}),await Y(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,tokenUsage:V,turnUsage:{...s},steps:r});break}this.resetActionRepetition();break}if(!c&&l!=="cancelled"){l==="ok"&&(l="error"),c="Unable to produce a final answer. Please retry or adjust the request.",u=c;let p=JSON.stringify({final:c});this.history.push({role:"assistant",content:p}),await this.emitEvent("final",{turn:o,content:c,role:"assistant"}),await Y(this.hooks,"onFinal",{sessionId:this.id,turn:o,finalText:c,status:l,errorMessage:u,turnUsage:{...s},steps:r})}return await this.emitEvent("turn_end",{turn:o,meta:{status:l,stepCount:r.length,durationMs:Date.now()-i,tokens:s}}),{finalText:c,steps:r,status:l,errorMessage:u,tokenUsage:s}}finally{this.currentAbortController=null,this.cancelling=!1,this.approvalManager.clearOnceApprovals()}}cancelCurrentTurn(){this.currentAbortController&&(this.cancelling=!0,this.currentAbortController.abort())}async close(){if(this.closed)return;if(this.closed=!0,this.sessionStartEmitted||this.turnIndex>=0){await this.emitEvent("session_end",{meta:{durationMs:Date.now()-this.startedAt,tokens:this.sessionUsage}});for(let n of this.sinks)if(n.flush)try{await n.flush()}catch(o){console.error(`History flush failed: ${o.message}`)}}this.tokenCounter.dispose(),this.approvalManager.dispose(),this.deps.dispose&&await this.deps.dispose()}async emitEvent(e,n){if(!this.sinks.length)return;let o=$n({sessionId:this.id,type:e,turn:n.turn,step:n.step,content:n.content,role:n.role,meta:n.meta});await Sa(o,this.sinks)}};async function Ye(t,e={}){let n=e.sessionId||Ro(),o=await ko(t,{...e,sessionId:n},n),r=await o.loadPrompt(),s=new sn({...t,...o},{...e,sessionId:n,mode:e.mode??$o},r,o.tokenCounter,o.historyFilePath);return await s.init(),s}import{useCallback as ee,useEffect as It,useMemo as Pr,useRef as Lt,useState as W}from"react";import{readFile as Rl}from"fs/promises";import"path";import{randomUUID as Nt}from"crypto";import{exec as $l}from"child_process";import{promisify as Il}from"util";import{Box as Rr,useApp as Ll,Text as Nl}from"ink";import{Box as Io,Text as wa}from"ink";import{memo as Ca}from"react";import{jsx as Lo,jsxs as Ea}from"react/jsx-runtime";var No=Ca(function({contextPercent:e=0}){let n=e>0?` ${e.toFixed(1)}%`:" 0.0%";return Lo(Io,{justifyContent:"flex-end",children:Lo(Io,{marginTop:8,children:Ea(wa,{color:"gray",children:["context:",n]})})})});import{Box as ve,Static as Qa,Text as le}from"ink";import{memo as ec}from"react";import tc from"os";import{Box as Aa,Text as Oo}from"ink";import{memo as Ma}from"react";import{jsx as Pa,jsxs as Do}from"react/jsx-runtime";var Uo=Ma(function({message:e}){return Do(Aa,{flexDirection:"column",gap:0,children:[Do(Oo,{color:"cyan",children:["\u25CF ",e.title]}),Pa(Oo,{color:"gray",children:e.content})]})});import{Box as qa,Text as Xa}from"ink";import{memo as Ya}from"react";import{Box as Ze,Text as oe}from"ink";import{memo as Ba}from"react";import{Box as an,Text as z}from"ink";import{marked as Ra}from"marked";import{useMemo as jo,memo as $a}from"react";import{jsx as Z,jsxs as He}from"react/jsx-runtime";var Ia="#2b2b2b";function wt(t){return t?[{type:"text",raw:t,text:t}]:[]}function La(t,e,n){switch(t.type){case"text":return t.tokens&&t.tokens.length>0?xe(t.tokens,e,`${n}-text`):t.text;case"escape":return t.text;case"strong":return Z(z,{bold:!0,children:xe(t.tokens,e,`${n}-strong`)},n);case"em":return Z(z,{italic:!0,children:xe(t.tokens,e,`${n}-em`)},n);case"codespan":return Z(z,{color:e.codeColor,backgroundColor:Ia,children:t.text},n);case"del":return Z(z,{strikethrough:!0,children:xe(t.tokens,e,`${n}-del`)},n);case"link":{let o=t.tokens&&t.tokens.length>0?xe(t.tokens,e,`${n}-link`):t.text,r=t.href&&t.text&&t.text!==t.href?` (${t.href})`:"";return He(z,{underline:!0,color:e.linkColor,children:[o,r]},n)}case"image":{let o=t.text||"image";return He(z,{color:e.linkColor,children:["[",o,"](",t.href,")"]},n)}case"br":return`
51
- `;case"checkbox":return t.checked?"[x]":"[ ]";case"html":return t.text;default:return"text"in t?t.text:t.raw}}function xe(t,e,n){return!t||t.length===0?[]:t.flatMap((o,r)=>{let s=`${n}-${r}`,i=La(o,e,s);return Array.isArray(i)?i:[i]})}function Na(t){let e=t.tokens[0];return e?.type==="paragraph"||e?.type==="text"?e.tokens??wt(e.text):t.tokens.length>0?t.tokens:wt(t.text)}function Oa(t){return t.split(`
50
+ `);this.history.push({role:"user",content:JSON.stringify({observation:ie})});let X=r[r.length-1];if(X&&(X.observation=ie),await Q(this.hooks,"onObservation",{sessionId:this.id,turn:o,step:p,tool:b.map(H=>H.name).join(", "),observation:ie,history:je(this.history)}),j){l="cancelled",c="\u7528\u6237\u62D2\u7EDD\u4E86\u5DE5\u5177\u6267\u884C\uFF0C\u5DF2\u505C\u6B62\u5F53\u524D\u64CD\u4F5C\u3002",await this.emitEvent("final",{turn:o,step:p,content:c,role:"assistant",meta:{rejected:!0}}),await Q(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,tokenUsage:V,turnUsage:{...s},steps:r});break}continue}else if(g.action){this.maybeWarnRepeatedAction(g.action.tool,g.action.input),await this.emitEvent("action",{turn:o,step:p,meta:{tool:g.action.tool,input:g.action.input,thinking:g.thinking}}),await Q(this.hooks,"onAction",{sessionId:this.id,turn:o,step:p,action:g.action,thinking:g.thinking,history:je(this.history)});let k=await this.executeToolWithApproval(g.action.tool,g.action.input,o,p);if(k.rejected){l="cancelled",c="\u7528\u6237\u62D2\u7EDD\u4E86\u5DE5\u5177\u6267\u884C\uFF0C\u5DF2\u505C\u6B62\u5F53\u524D\u64CD\u4F5C\u3002",await this.emitEvent("final",{turn:o,step:p,content:c,role:"assistant",meta:{rejected:!0}}),await Q(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,tokenUsage:V,turnUsage:{...s},steps:r});break}let _=k.observation;this.history.push({role:"user",content:JSON.stringify({observation:_,tool:g.action.tool})});let j=r[r.length-1];j&&(j.observation=_),await this.emitEvent("observation",{turn:o,step:p,content:_,meta:{tool:g.action.tool}}),await Q(this.hooks,"onObservation",{sessionId:this.id,turn:o,step:p,tool:g.action.tool,observation:_,history:je(this.history)});continue}if(P==="end_turn"||g.final){this.resetActionRepetition(),c=g.final||m,g.final&&(g.final=c),await this.emitEvent("final",{turn:o,step:p,content:c,role:"assistant",meta:{tokens:V}}),await Q(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,tokenUsage:V,turnUsage:{...s},steps:r});break}this.resetActionRepetition();break}if(!c&&l!=="cancelled"){l==="ok"&&(l="error"),c="Unable to produce a final answer. Please retry or adjust the request.",u=c;let p=JSON.stringify({final:c});this.history.push({role:"assistant",content:p}),await this.emitEvent("final",{turn:o,content:c,role:"assistant"}),await Q(this.hooks,"onFinal",{sessionId:this.id,turn:o,finalText:c,status:l,errorMessage:u,turnUsage:{...s},steps:r})}return await this.emitEvent("turn_end",{turn:o,meta:{status:l,stepCount:r.length,durationMs:Date.now()-i,tokens:s}}),{finalText:c,steps:r,status:l,errorMessage:u,tokenUsage:s}}finally{this.currentAbortController=null,this.cancelling=!1,this.approvalManager.clearOnceApprovals()}}cancelCurrentTurn(){this.currentAbortController&&(this.cancelling=!0,this.currentAbortController.abort())}async close(){if(this.closed)return;if(this.closed=!0,this.sessionStartEmitted||this.turnIndex>=0){await this.emitEvent("session_end",{meta:{durationMs:Date.now()-this.startedAt,tokens:this.sessionUsage}});for(let n of this.sinks)if(n.flush)try{await n.flush()}catch(o){console.error(`History flush failed: ${o.message}`)}}this.tokenCounter.dispose(),this.approvalManager.dispose(),this.deps.dispose&&await this.deps.dispose()}async emitEvent(e,n){if(!this.sinks.length)return;let o=On({sessionId:this.id,type:e,turn:n.turn,step:n.step,content:n.content,role:n.role,meta:n.meta});await Ca(o,this.sinks)}};async function Ye(t,e={}){let n=e.sessionId||No(),o=await Co(t,{...e,sessionId:n},n),r=await o.loadPrompt(),s=new cn({...t,...o},{...e,sessionId:n,mode:e.mode??Oo},r,o.tokenCounter,o.historyFilePath);return await s.init(),s}import{useCallback as te,useEffect as Lt,useMemo as Cn,useRef as Nt,useState as W}from"react";import{readFile as Dl}from"fs/promises";import"path";import{randomUUID as Ot}from"crypto";import{exec as Ul}from"child_process";import{promisify as jl}from"util";import{Box as Or,useApp as Hl,Text as Bl}from"ink";import{Box as Do,Text as Pa}from"ink";import{memo as Ra}from"react";import{jsx as Uo,jsxs as $a}from"react/jsx-runtime";var jo=Ra(function({contextPercent:e=0}){let n=e>0?` ${e.toFixed(1)}%`:" 0.0%";return Uo(Do,{justifyContent:"flex-end",children:Uo(Do,{marginTop:8,children:$a(Pa,{color:"gray",children:["context:",n]})})})});import{Box as fe,Static as rc,Text as se}from"ink";import{memo as sc}from"react";import ic from"os";import{Box as Ia,Text as Ho}from"ink";import{memo as La}from"react";import{jsx as Na,jsxs as Bo}from"react/jsx-runtime";var Fo=La(function({message:e}){return Bo(Ia,{flexDirection:"column",gap:0,children:[Bo(Ho,{color:"cyan",children:["\u25CF ",e.title]}),Na(Ho,{color:"gray",children:e.content})]})});import{Box as ec,Text as tc}from"ink";import{memo as nc}from"react";import{Box as Ze,Text as re}from"ink";import{memo as Wa}from"react";import{Box as ln,Text as z}from"ink";import{marked as Oa}from"marked";import{useMemo as Vo,memo as Da}from"react";import{jsx as ee,jsxs as He}from"react/jsx-runtime";var Ua="#2b2b2b";function wt(t){return t?[{type:"text",raw:t,text:t}]:[]}function ja(t,e,n){switch(t.type){case"text":return t.tokens&&t.tokens.length>0?Te(t.tokens,e,`${n}-text`):t.text;case"escape":return t.text;case"strong":return ee(z,{bold:!0,children:Te(t.tokens,e,`${n}-strong`)},n);case"em":return ee(z,{italic:!0,children:Te(t.tokens,e,`${n}-em`)},n);case"codespan":return ee(z,{color:e.codeColor,backgroundColor:Ua,children:t.text},n);case"del":return ee(z,{strikethrough:!0,children:Te(t.tokens,e,`${n}-del`)},n);case"link":{let o=t.tokens&&t.tokens.length>0?Te(t.tokens,e,`${n}-link`):t.text,r=t.href&&t.text&&t.text!==t.href?` (${t.href})`:"";return He(z,{underline:!0,color:e.linkColor,children:[o,r]},n)}case"image":{let o=t.text||"image";return He(z,{color:e.linkColor,children:["[",o,"](",t.href,")"]},n)}case"br":return`
51
+ `;case"checkbox":return t.checked?"[x]":"[ ]";case"html":return t.text;default:return"text"in t?t.text:t.raw}}function Te(t,e,n){return!t||t.length===0?[]:t.flatMap((o,r)=>{let s=`${n}-${r}`,i=ja(o,e,s);return Array.isArray(i)?i:[i]})}function Ha(t){let e=t.tokens[0];return e?.type==="paragraph"||e?.type==="text"?e.tokens??wt(e.text):t.tokens.length>0?t.tokens:wt(t.text)}function Ba(t){return t.split(`
52
52
  `).map(e=>e.length>0?` ${e}`:"").join(`
53
- `).trimEnd()}function Da(t){let e=t.header.map(r=>r.text).join(" | "),n=t.header.map(()=>"---").join(" | "),o=t.rows.map(r=>r.map(s=>s.text).join(" | "));return[e,n,...o].join(`
54
- `)}function Ua(t){return t.type==="table"&&"header"in t&&"rows"in t&&"align"in t}function ja(t,e,n){switch(t.type){case"space":case"def":return null;case"heading":return Z(z,{bold:!0,color:e.textColor,children:xe(t.tokens,e,`${n}-heading`)},n);case"paragraph":{let o=t.tokens??wt(t.text);return Z(z,{color:e.textColor,children:xe(o,e,`${n}-para`)},n)}case"text":{let o=t.tokens??wt(t.text);return Z(z,{color:e.textColor,children:xe(o,e,`${n}-text`)},n)}case"code":{let o=Oa(t.text);return Z(z,{color:e.codeColor,children:o},n)}case"list":{let o=typeof t.start=="number"?t.start:1;return Z(an,{flexDirection:"column",children:t.items.map((r,s)=>{let i=t.ordered?`${o+s}.`:"-",a=r.task?r.checked?"[x] ":"[ ] ":"",c=Na(r);return He(an,{children:[He(z,{color:e.textColor,children:[i," "]}),He(z,{color:e.textColor,children:[a,xe(c,e,`${n}-item-${s}`)]})]},`${n}-item-${s}`)})},n)}case"blockquote":return He(z,{color:"gray",dimColor:!0,children:["> ",t.text.trim()]},n);case"hr":return Z(z,{color:"gray",children:"---"},n);case"table":return Ua(t)?Z(z,{color:e.textColor,children:Da(t)},n):Z(z,{color:e.textColor,children:"text"in t?t.text:t.raw},n);case"html":return Z(z,{color:e.textColor,children:t.text},n);default:return Z(z,{color:e.textColor,children:"text"in t?t.text:t.raw},n)}}function Ha(t,e,n){return t.flatMap((o,r)=>{let s=ja(o,e,`${n}-${r}`);return s?[s]:[]})}var Be=$a(function({text:e,tone:n="normal"}){let o=jo(()=>({textColor:n==="muted"?"gray":void 0,codeColor:n==="muted"?"gray":"cyan",linkColor:n==="muted"?"gray":"blue",muted:n==="muted"}),[n]),r=jo(()=>{let s=Ra.lexer(e,{gfm:!0,breaks:!0});return Ha(s,o,"markdown")},[e,o]);return Z(an,{flexDirection:"column",gap:1,children:r})});import{Fragment as cn,jsx as K,jsxs as Fe}from"react/jsx-runtime";function Ho(t){if(!t)return;if(typeof t=="string")return t.length>50?t.slice(0,47)+"...":t;if(typeof t!="object"||Array.isArray(t))return;let e=t,n=["file_path","path","file","filename","url","command","pattern","glob","query","content","cwd","dir"];for(let o of n)if(e[o]){let r=String(e[o]);return r.length>50?r.slice(0,47)+"...":r}for(let[o,r]of Object.entries(e))if(typeof r=="string"&&o!=="description")return r.length>50?r.slice(0,47)+"...":r}function Fa(t,e){let n=t.step,o=e.step;return!(n.index!==o.index||n.assistantText!==o.assistantText||n.thinking!==o.thinking||n.action?.tool!==o.action?.tool||JSON.stringify(n.action?.input)!==JSON.stringify(o.action?.input)||JSON.stringify(n.parallelActions)!==JSON.stringify(o.parallelActions)||n.toolStatus!==o.toolStatus)}var Bo=Ba(function({step:e}){let n=e.action?.tool,o=e.action?.input,r=Ho(o),s=e.parallelActions??[],i=s.length>1;return Fe(Ze,{flexDirection:"column",gap:0,children:[e.thinking&&Fe(Ze,{children:[K(oe,{color:"gray",children:"\u25CF "}),K(Ze,{flexDirection:"column",flexGrow:1,children:K(Be,{text:e.thinking,tone:"muted"})})]}),i&&K(cn,{children:s.map((a,c)=>{let l=Ho(a.input);return Fe(Ze,{children:[K(oe,{color:"green",children:"\u25CF "}),K(oe,{color:"gray",children:"Used "}),K(oe,{color:"cyan",children:a.tool}),l&&Fe(cn,{children:[K(oe,{color:"gray",children:" ("}),K(oe,{color:"cyan",children:l}),K(oe,{color:"gray",children:")"})]})]},c)})}),!i&&n&&Fe(Ze,{children:[K(oe,{color:"green",children:"\u25CF "}),K(oe,{color:"gray",children:"Used "}),K(oe,{color:"cyan",children:n}),r&&Fe(cn,{children:[K(oe,{color:"gray",children:" ("}),K(oe,{color:"cyan",children:r}),K(oe,{color:"gray",children:")"})]})]})]})},Fa);import{Box as Va,Text as Fo}from"ink";import{memo as Ga}from"react";import{jsx as Vo,jsxs as za}from"react/jsx-runtime";var Go=Ga(function({text:e}){return za(Va,{paddingY:1,children:[Vo(Fo,{color:"gray",children:"\u203A "}),Vo(Fo,{color:"white",children:e})]})});import{Box as Qe,Text as $e}from"ink";import{memo as ln,useMemo as Wa}from"react";import{Fragment as Ja,jsx as ae,jsxs as Ct}from"react/jsx-runtime";function Ka(t){let e=/<\s*(think|thinking)\s*>([\s\S]*?)<\/\s*\1\s*>/gi,n=[],o,r=0,s=[];for(;(o=e.exec(t))!==null;){s.push({start:o.index,end:e.lastIndex});let a=o[2]?.trim();a&&n.push(a)}if(s.length===0)return{content:t,thinking:null};let i="";r=0;for(let{start:a,end:c}of s)i+=t.slice(r,a),r=c;return i+=t.slice(r),i=i.replace(/\n{3,}/g,`
53
+ `).trimEnd()}function Fa(t){let e=t.header.map(r=>r.text).join(" | "),n=t.header.map(()=>"---").join(" | "),o=t.rows.map(r=>r.map(s=>s.text).join(" | "));return[e,n,...o].join(`
54
+ `)}function Va(t){return t.type==="table"&&"header"in t&&"rows"in t&&"align"in t}function Ga(t,e,n){switch(t.type){case"space":case"def":return null;case"heading":return ee(z,{bold:!0,color:e.textColor,children:Te(t.tokens,e,`${n}-heading`)},n);case"paragraph":{let o=t.tokens??wt(t.text);return ee(z,{color:e.textColor,children:Te(o,e,`${n}-para`)},n)}case"text":{let o=t.tokens??wt(t.text);return ee(z,{color:e.textColor,children:Te(o,e,`${n}-text`)},n)}case"code":{let o=Ba(t.text);return ee(z,{color:e.codeColor,children:o},n)}case"list":{let o=typeof t.start=="number"?t.start:1;return ee(ln,{flexDirection:"column",children:t.items.map((r,s)=>{let i=t.ordered?`${o+s}.`:"-",a=r.task?r.checked?"[x] ":"[ ] ":"",c=Ha(r);return He(ln,{children:[He(z,{color:e.textColor,children:[i," "]}),He(z,{color:e.textColor,children:[a,Te(c,e,`${n}-item-${s}`)]})]},`${n}-item-${s}`)})},n)}case"blockquote":return He(z,{color:"gray",dimColor:!0,children:["> ",t.text.trim()]},n);case"hr":return ee(z,{color:"gray",children:"---"},n);case"table":return Va(t)?ee(z,{color:e.textColor,children:Fa(t)},n):ee(z,{color:e.textColor,children:"text"in t?t.text:t.raw},n);case"html":return ee(z,{color:e.textColor,children:t.text},n);default:return ee(z,{color:e.textColor,children:"text"in t?t.text:t.raw},n)}}function za(t,e,n){return t.flatMap((o,r)=>{let s=Ga(o,e,`${n}-${r}`);return s?[s]:[]})}var Be=Da(function({text:e,tone:n="normal"}){let o=Vo(()=>({textColor:n==="muted"?"gray":void 0,codeColor:n==="muted"?"gray":"cyan",linkColor:n==="muted"?"gray":"blue",muted:n==="muted"}),[n]),r=Vo(()=>{let s=Oa.lexer(e,{gfm:!0,breaks:!0});return za(s,o,"markdown")},[e,o]);return ee(ln,{flexDirection:"column",gap:1,children:r})});import{Fragment as un,jsx as J,jsxs as Fe}from"react/jsx-runtime";function Go(t){if(!t)return;if(typeof t=="string")return t.length>50?t.slice(0,47)+"...":t;if(typeof t!="object"||Array.isArray(t))return;let e=t,n=["file_path","path","file","filename","url","command","pattern","glob","query","content","cwd","dir"];for(let o of n)if(e[o]){let r=String(e[o]);return r.length>50?r.slice(0,47)+"...":r}for(let[o,r]of Object.entries(e))if(typeof r=="string"&&o!=="description")return r.length>50?r.slice(0,47)+"...":r}function Ka(t,e){let n=t.step,o=e.step;return!(n.index!==o.index||n.assistantText!==o.assistantText||n.thinking!==o.thinking||n.action?.tool!==o.action?.tool||JSON.stringify(n.action?.input)!==JSON.stringify(o.action?.input)||JSON.stringify(n.parallelActions)!==JSON.stringify(o.parallelActions)||n.toolStatus!==o.toolStatus)}var zo=Wa(function({step:e}){let n=e.action?.tool,o=e.action?.input,r=Go(o),s=e.parallelActions??[],i=s.length>1;return Fe(Ze,{flexDirection:"column",gap:0,children:[e.thinking&&Fe(Ze,{children:[J(re,{color:"gray",children:"\u25CF "}),J(Ze,{flexDirection:"column",flexGrow:1,children:J(Be,{text:e.thinking,tone:"muted"})})]}),i&&J(un,{children:s.map((a,c)=>{let l=Go(a.input);return Fe(Ze,{children:[J(re,{color:"green",children:"\u25CF "}),J(re,{color:"gray",children:"Used "}),J(re,{color:"cyan",children:a.tool}),l&&Fe(un,{children:[J(re,{color:"gray",children:" ("}),J(re,{color:"cyan",children:l}),J(re,{color:"gray",children:")"})]})]},c)})}),!i&&n&&Fe(Ze,{children:[J(re,{color:"green",children:"\u25CF "}),J(re,{color:"gray",children:"Used "}),J(re,{color:"cyan",children:n}),r&&Fe(un,{children:[J(re,{color:"gray",children:" ("}),J(re,{color:"cyan",children:r}),J(re,{color:"gray",children:")"})]})]})]})},Ka);import{Box as Ja,Text as Wo}from"ink";import{memo as qa}from"react";import{jsx as Ko,jsxs as Xa}from"react/jsx-runtime";var Jo=qa(function({text:e}){return Xa(Ja,{paddingY:1,children:[Ko(Wo,{color:"gray",children:"\u203A "}),Ko(Wo,{color:"white",children:e})]})});import{Box as Qe,Text as $e}from"ink";import{memo as pn,useMemo as Ya}from"react";import{Fragment as Qa,jsx as ce,jsxs as _t}from"react/jsx-runtime";function Za(t){let e=/<\s*(think|thinking)\s*>([\s\S]*?)<\/\s*\1\s*>/gi,n=[],o,r=0,s=[];for(;(o=e.exec(t))!==null;){s.push({start:o.index,end:e.lastIndex});let a=o[2]?.trim();a&&n.push(a)}if(s.length===0)return{content:t,thinking:null};let i="";r=0;for(let{start:a,end:c}of s)i+=t.slice(r,a),r=c;return i+=t.slice(r),i=i.replace(/\n{3,}/g,`
55
55
 
56
56
  `).trim(),{content:i,thinking:n.length>0?n.join(`
57
57
 
58
- `):null}}var zo=ln(function({text:e,isThinking:n=!1}){let{content:o,thinking:r}=Wa(()=>Ka(e),[e]);return n?ae(Qe,{flexDirection:"column",flexGrow:1,children:ae(Be,{text:e,tone:"muted"})}):Ct(Qe,{flexDirection:"column",flexGrow:1,gap:1,children:[r&&ae(Qe,{flexDirection:"column",paddingLeft:2,children:ae(Be,{text:r,tone:"muted"})}),ae(Be,{text:o,tone:"normal"})]})}),ed=ln(function({text:e}){return ae(Qe,{children:Ct($e,{color:"gray",children:["\u2022 ",e]})})}),td=ln(function({toolName:e,fileName:n}){return Ct(Qe,{children:[ae($e,{color:"green",children:"\u25CF "}),ae($e,{color:"gray",children:"Used "}),ae($e,{color:"cyan",children:e}),n&&Ct(Ja,{children:[ae($e,{color:"gray",children:" ("}),ae($e,{color:"cyan",children:n}),ae($e,{color:"gray",children:")"})]})]})});import{jsx as un,jsxs as Wo}from"react/jsx-runtime";function Za(t,e){let n=t.turn,o=e.turn;if(n.index!==o.index||n.userInput!==o.userInput||n.finalText!==o.finalText||n.status!==o.status||n.steps.length!==o.steps.length||n.tokenUsage?.total!==o.tokenUsage?.total)return!1;for(let r=0;r<n.steps.length;r++){let s=n.steps[r],i=o.steps[r];if(!s||!i||s.assistantText!==i.assistantText||s.thinking!==i.thinking||s.action?.tool!==i.action?.tool)return!1}return!0}var pn=Ya(function({turn:e}){let n=e.finalText?.trim()??"",o=n.length>0;return Wo(qa,{flexDirection:"column",children:[un(Go,{text:e.userInput}),e.steps.map(r=>un(Bo,{step:r},`step-${e.index}-${r.index}`)),o?un(zo,{text:n,isThinking:!1}):null,e.status&&e.status!=="ok"?Wo(Xa,{color:"red",children:["Status: ",e.status]}):null]})},Za);import{jsx as Q,jsxs as Te}from"react/jsx-runtime";function nc(t){let e=tc.homedir();return e&&t.startsWith(e)?`~${t.slice(e.length)}`:t}function oc(t){return t.length>16?`${t.slice(0,8)}...${t.slice(-4)}`:t}function rc(t,e){if(t.headerInfo?.sessionId!==e.headerInfo?.sessionId||t.headerInfo?.model!==e.headerInfo?.model||t.headerInfo?.providerName!==e.headerInfo?.providerName||t.headerInfo?.cwd!==e.headerInfo?.cwd||t.headerInfo?.mcpNames?.length!==e.headerInfo?.mcpNames?.length)return!1;if(t.headerInfo?.mcpNames&&e.headerInfo?.mcpNames){let n=t.headerInfo.mcpNames,o=e.headerInfo.mcpNames;for(let r=0;r<n.length;r++)if(n[r]!==o[r])return!1}if(t.systemMessages.length!==e.systemMessages.length)return!1;for(let n=0;n<t.systemMessages.length;n++)if(t.systemMessages[n]?.id!==e.systemMessages[n]?.id)return!1;if(t.turns.length!==e.turns.length)return!1;for(let n=0;n<t.turns.length;n++)if(t.turns[n]!==e.turns[n])return!1;return!0}var Ko=ec(function({systemMessages:e,turns:n,headerInfo:o}){let r=n.length>0?n[n.length-1]:void 0,s=r&&(r.finalText||r.status&&r.status!=="ok"),i=s?n:n.slice(0,-1),a=s?void 0:r,c=[];o&&c.push({type:"header",data:o});let l=[];for(let u of e)l.push({sequence:u.sequence,item:{type:"system",data:u}});for(let u of i){let p=u.sequence??0;l.push({sequence:p,item:{type:"turn",data:u}})}l.sort((u,p)=>u.sequence-p.sequence);for(let u of l)c.push(u.item);return Te(ve,{flexDirection:"column",gap:0,children:[Q(Qa,{items:c,children:u=>{if(u.type==="header"&&u.data){let p=u.data;return Te(ve,{borderStyle:"round",borderColor:"blueBright",paddingX:2,paddingY:1,flexDirection:"column",gap:1,children:[Q(ve,{gap:1,alignItems:"center",children:Te(ve,{flexDirection:"column",children:[Q(le,{bold:!0,children:"Welcome to Memo Code CLI!"}),Q(le,{color:"gray",children:"Send /help for help information."})]})}),Te(ve,{flexDirection:"column",gap:0,children:[Te(ve,{children:[Q(le,{color:"gray",children:"Directory: "}),Q(le,{color:"cyan",children:nc(p.cwd)})]}),Te(ve,{children:[Q(le,{color:"gray",children:"Session: "}),Q(le,{color:"cyan",children:oc(p.sessionId)})]}),Te(ve,{children:[Q(le,{color:"gray",children:"Model: "}),Q(le,{color:"cyan",children:p.model}),Te(le,{color:"gray",children:[" ","(powered by ",p.providerName,")"]})]}),Te(ve,{children:[Q(le,{color:"gray",children:"MCP: "}),Q(le,{color:"cyan",children:p.mcpNames.length>0?p.mcpNames.join(", "):"none"})]})]})]},"header")}return u.type==="system"?Q(Uo,{message:u.data},u.data.id):u.type==="turn"?Q(pn,{turn:u.data},`turn-${u.data.index}`):null}}),a&&Q(pn,{turn:a},`turn-live-${a.index}`)]})},rc);import{useCallback as yr,useEffect as vn,useMemo as Wc,useRef as Tn,useState as Ce}from"react";import{readFile as Kc,readdir as Jc,stat as qc}from"fs/promises";import{basename as Xc,join as Yc,resolve as xr}from"path";import{Box as $t,Text as Ie,useInput as Zc}from"ink";var rr=Pn(nr(),1);import{readFile as wc,readdir as Cc}from"fs/promises";import{join as or,relative as Ec,sep as Ac}from"path";var Mc=6,Pc=2500,sr=25,Rc=[".git",".svn",".hg","node_modules","dist","build",".next",".turbo",".cache",".output","coverage","tmp","temp","logs","*.log"],Pt=new Map;function $c(t){return t.split(Ac).join("/")}function Ic(t,e){return JSON.stringify({maxDepth:t.maxDepth,maxEntries:t.maxEntries,respectGitIgnore:t.respectGitIgnore,ignoreGlobs:t.ignoreGlobs,gitignore:e})}function Lc(t){return{maxDepth:typeof t.maxDepth=="number"?Math.max(1,t.maxDepth):Mc,maxEntries:typeof t.maxEntries=="number"?Math.max(100,t.maxEntries):Pc,limit:typeof t.limit=="number"?Math.max(1,t.limit):sr,respectGitIgnore:t.respectGitIgnore!==!1,ignoreGlobs:t.ignoreGlobs?.length?t.ignoreGlobs:[]}}async function Nc(t,e){if(!e)return"";try{return await wc(or(t,".gitignore"),"utf8")}catch{}return""}async function Oc(t,e){let n=await Nc(e,t.respectGitIgnore),o=(0,rr.default)();o.add(Rc),t.ignoreGlobs.length&&o.add(t.ignoreGlobs),n.trim()&&o.add(n);let r=Ic(t,n);return Object.assign(o,{__memoSignature:r})}async function Dc(t,e,n){let o=[],r=e.maxEntries,s=async(i,a)=>{if(o.length>=r)return;let c;try{c=await Cc(i,{withFileTypes:!0})}catch{return}for(let l of c){if(o.length>=r)break;if(l.isSymbolicLink())continue;let u=or(i,l.name),p=Ec(t,u);if(!p)continue;let v=$c(p);if(n.ignores(v))continue;let m=v.split("/").filter(Boolean),_=m.map(C=>C.toLowerCase()),y=l.isDirectory();if(o.push({path:v,pathLower:v.toLowerCase(),segments:m,segmentsLower:_,depth:a,isDir:y}),o.length>=r)break;y&&a<e.maxDepth&&await s(u,a+1)}};return await s(t,0),o.sort((i,a)=>i.path.localeCompare(a.path)),{entries:o,signature:n.__memoSignature}}async function Uc(t,e){let n=Lc(e),o=await Oc(n,t),r=o.__memoSignature,s=Pt.get(t);if(s&&s.signature===r)return s.pending?s.pending:s.entries;let i=Dc(t,n,o).then(a=>(Pt.set(t,{entries:a.entries,signature:a.signature}),a.entries)).catch(a=>{throw Pt.delete(t),a});return Pt.set(t,{entries:[],signature:r,pending:i}),i}function jc(t){return t.depth+(t.isDir?-.2:.2)}function Hc(t,e){if(!e.length)return jc(t);let n=t.depth,o=0;for(let r of e){let s=-1;for(let i=o;i<t.segmentsLower.length;i++){let a=t.segmentsLower[i];if(a.startsWith(r)){s=i,n+=(i-o)*1.5,n+=a.length-r.length;break}let c=a.indexOf(r);if(c!==-1){s=i,n+=(i-o)*2+c+2;break}}if(s===-1)return null;o=s+1}return t.isDir&&(n-=.5),n}function Bc(t,e,n){let s=e.trim().replace(/\\/g,"/").split("/").filter(Boolean).map(a=>a.toLowerCase()),i=[];for(let a of t){let c=Hc(a,s);c!==null&&i.push({entry:a,score:c})}return i.sort((a,c)=>{let l=a.score-c.score;return l!==0?l:a.entry.path.localeCompare(c.entry.path)}),i.slice(0,n).map(({entry:a})=>({id:a.path,path:a.path,name:a.segments[a.segments.length-1]??a.path,parent:a.segments.length>1?a.segments.slice(0,-1).join("/"):void 0,isDir:a.isDir}))}async function ir(t){let e=await Uc(t.cwd,t),n=typeof t.limit=="number"?Math.max(1,t.limit):sr;return Bc(e,t.query,n)}import{mkdir as _d,readFile as bd,writeFile as wd}from"fs/promises";import{dirname as Ed}from"path";import{randomUUID as Md}from"crypto";import{Box as tt,Text as ze}from"ink";import{jsx as ke,jsxs as cr}from"react/jsx-runtime";var Fc="#3a3a3a",Rt="#2b2b2b",ar="#888888",Vc="#666666";function lr({items:t,activeIndex:e,loading:n}){return n?ke(tt,{flexDirection:"column",paddingX:1,backgroundColor:Rt,children:ke(ze,{color:"gray",children:"Loading..."})}):t.length?ke(tt,{flexDirection:"column",backgroundColor:Rt,children:t.map((o,r)=>{let s=r===e,i=s?Fc:Rt;return o.kind==="slash"?cr(tt,{flexDirection:"row",gap:2,paddingX:1,backgroundColor:i,children:[ke(ze,{color:s?"cyan":"white",bold:s,children:o.title}),o.subtitle?ke(ze,{color:ar,children:o.subtitle}):null]},o.id):cr(tt,{flexDirection:"row",gap:1,paddingX:1,backgroundColor:i,children:[ke(ze,{color:s?"cyan":"white",bold:s,children:o.title}),o.subtitle?ke(ze,{color:ar,children:o.subtitle}):null]},o.id)})}):ke(tt,{flexDirection:"column",paddingX:1,backgroundColor:Rt,children:ke(ze,{color:Vc,children:"No matches"})})}var ur={name:"new",description:"Start a new session",run:({closeSuggestions:t,setInputValue:e,clearScreen:n,showSystemMessage:o,newSession:r})=>{t(),e(""),n(),o("New Session","Starting a new session..."),r?.()}};var pr={name:"exit",description:"Exit the session",run:({closeSuggestions:t,exitApp:e})=>{t(),e()}};var mr={name:"resume",description:"Resume history",run:({closeSuggestions:t,setInputValue:e,showSystemMessage:n})=>{t(!1),e("resume "),n("Resume",'Type "resume" followed by keywords to filter and select from session history.')}};var dr={name:"models",description:"Select a model (from configured providers)",run:({closeSuggestions:t,setInputValue:e,showSystemMessage:n,data:o})=>{t(!1);let{providers:r,providerName:s,model:i}=o;if(!r.length){n("Models",`No providers configured. Check ${o.configPath}`),e("");return}let a=r.map(c=>{let l=c.name===s&&c.model===i?" (current)":"",u=c.base_url?` @ ${c.base_url}`:"";return`- ${c.name}: ${c.model}${u}${l}`});e("/models "),n("Models",`Available models:
58
+ `):null}}var qo=pn(function({text:e,isThinking:n=!1}){let{content:o,thinking:r}=Ya(()=>Za(e),[e]);return n?ce(Qe,{flexDirection:"column",flexGrow:1,children:ce(Be,{text:e,tone:"muted"})}):_t(Qe,{flexDirection:"column",flexGrow:1,gap:1,children:[r&&ce(Qe,{flexDirection:"column",paddingLeft:2,children:ce(Be,{text:r,tone:"muted"})}),ce(Be,{text:o,tone:"normal"})]})}),id=pn(function({text:e}){return ce(Qe,{children:_t($e,{color:"gray",children:["\u2022 ",e]})})}),ad=pn(function({toolName:e,fileName:n}){return _t(Qe,{children:[ce($e,{color:"green",children:"\u25CF "}),ce($e,{color:"gray",children:"Used "}),ce($e,{color:"cyan",children:e}),n&&_t(Qa,{children:[ce($e,{color:"gray",children:" ("}),ce($e,{color:"cyan",children:n}),ce($e,{color:"gray",children:")"})]})]})});import{jsx as mn,jsxs as Xo}from"react/jsx-runtime";function oc(t,e){let n=t.turn,o=e.turn;if(n.index!==o.index||n.userInput!==o.userInput||n.finalText!==o.finalText||n.status!==o.status||n.steps.length!==o.steps.length||n.tokenUsage?.total!==o.tokenUsage?.total)return!1;for(let r=0;r<n.steps.length;r++){let s=n.steps[r],i=o.steps[r];if(!s||!i||s.assistantText!==i.assistantText||s.thinking!==i.thinking||s.action?.tool!==i.action?.tool)return!1}return!0}var dn=nc(function({turn:e}){let n=e.finalText?.trim()??"",o=n.length>0;return Xo(ec,{flexDirection:"column",children:[mn(Jo,{text:e.userInput}),e.steps.map(r=>mn(zo,{step:r},`step-${e.index}-${r.index}`)),o?mn(qo,{text:n,isThinking:!1}):null,e.status&&e.status!=="ok"?Xo(tc,{color:"red",children:["Status: ",e.status]}):null]})},oc);import{jsx as q,jsxs as ue}from"react/jsx-runtime";function ac(t){let e=ic.homedir();return e&&t.startsWith(e)?`~${t.slice(e.length)}`:t}function cc(t){return t.length>16?`${t.slice(0,8)}...${t.slice(-4)}`:t}function lc(t,e){if(t.headerInfo?.sessionId!==e.headerInfo?.sessionId||t.headerInfo?.model!==e.headerInfo?.model||t.headerInfo?.providerName!==e.headerInfo?.providerName||t.headerInfo?.cwd!==e.headerInfo?.cwd||t.headerInfo?.version!==e.headerInfo?.version||t.headerInfo?.mcpNames?.length!==e.headerInfo?.mcpNames?.length)return!1;if(t.headerInfo?.mcpNames&&e.headerInfo?.mcpNames){let n=t.headerInfo.mcpNames,o=e.headerInfo.mcpNames;for(let r=0;r<n.length;r++)if(n[r]!==o[r])return!1}if(t.systemMessages.length!==e.systemMessages.length)return!1;for(let n=0;n<t.systemMessages.length;n++)if(t.systemMessages[n]?.id!==e.systemMessages[n]?.id)return!1;if(t.turns.length!==e.turns.length)return!1;for(let n=0;n<t.turns.length;n++)if(t.turns[n]!==e.turns[n])return!1;return!0}var Yo=sc(function({systemMessages:e,turns:n,headerInfo:o}){let r=n.length>0?n[n.length-1]:void 0,s=r&&(r.finalText||r.status&&r.status!=="ok"),i=s?n:n.slice(0,-1),a=s?void 0:r,c=[];o&&c.push({type:"header",data:o});let l=[];for(let u of e)l.push({sequence:u.sequence,item:{type:"system",data:u}});for(let u of i){let p=u.sequence??0;l.push({sequence:p,item:{type:"turn",data:u}})}l.sort((u,p)=>u.sequence-p.sequence);for(let u of l)c.push(u.item);return ue(fe,{flexDirection:"column",gap:0,children:[q(rc,{items:c,children:u=>{if(u.type==="header"&&u.data){let p=u.data;return ue(fe,{borderStyle:"round",borderColor:"blueBright",paddingX:2,paddingY:1,flexDirection:"column",gap:1,children:[q(fe,{gap:1,alignItems:"center",children:ue(fe,{flexDirection:"column",children:[q(se,{bold:!0,children:"Welcome to Memo Code CLI!"}),q(se,{color:"gray",children:"Send /help for help information."})]})}),ue(fe,{flexDirection:"column",gap:0,children:[ue(fe,{children:[q(se,{color:"gray",children:"Directory: "}),q(se,{color:"cyan",children:ac(p.cwd)})]}),ue(fe,{children:[q(se,{color:"gray",children:"Session: "}),q(se,{color:"cyan",children:cc(p.sessionId)})]}),ue(fe,{children:[q(se,{color:"gray",children:"Model: "}),q(se,{color:"cyan",children:p.model}),ue(se,{color:"gray",children:[" ","(powered by ",p.providerName,")"]})]}),ue(fe,{children:[q(se,{color:"gray",children:"Version: "}),ue(se,{color:"cyan",children:["v",p.version]})]}),ue(fe,{children:[q(se,{color:"gray",children:"MCP: "}),q(se,{color:"cyan",children:p.mcpNames.length>0?p.mcpNames.join(", "):"none"})]})]})]},"header")}return u.type==="system"?q(Fo,{message:u.data},u.data.id):u.type==="turn"?q(dn,{turn:u.data},`turn-${u.data.index}`):null}}),a&&q(dn,{turn:a},`turn-live-${a.index}`)]})},lc);import{useCallback as Sr,useEffect as Sn,useMemo as Yc,useRef as kn,useState as Ce}from"react";import{readFile as Zc,readdir as Qc,stat as el}from"fs/promises";import{basename as tl,join as nl,resolve as kr}from"path";import{Box as Rt,Text as Ie,useInput as ol}from"ink";var cr=Ln(ir(),1);import{readFile as Pc,readdir as Rc}from"fs/promises";import{join as ar,relative as $c,sep as Ic}from"path";var Lc=6,Nc=2500,lr=25,Oc=[".git",".svn",".hg","node_modules","dist","build",".next",".turbo",".cache",".output","coverage","tmp","temp","logs","*.log"],Mt=new Map;function Dc(t){return t.split(Ic).join("/")}function Uc(t,e){return JSON.stringify({maxDepth:t.maxDepth,maxEntries:t.maxEntries,respectGitIgnore:t.respectGitIgnore,ignoreGlobs:t.ignoreGlobs,gitignore:e})}function jc(t){return{maxDepth:typeof t.maxDepth=="number"?Math.max(1,t.maxDepth):Lc,maxEntries:typeof t.maxEntries=="number"?Math.max(100,t.maxEntries):Nc,limit:typeof t.limit=="number"?Math.max(1,t.limit):lr,respectGitIgnore:t.respectGitIgnore!==!1,ignoreGlobs:t.ignoreGlobs?.length?t.ignoreGlobs:[]}}async function Hc(t,e){if(!e)return"";try{return await Pc(ar(t,".gitignore"),"utf8")}catch{}return""}async function Bc(t,e){let n=await Hc(e,t.respectGitIgnore),o=(0,cr.default)();o.add(Oc),t.ignoreGlobs.length&&o.add(t.ignoreGlobs),n.trim()&&o.add(n);let r=Uc(t,n);return Object.assign(o,{__memoSignature:r})}async function Fc(t,e,n){let o=[],r=e.maxEntries,s=async(i,a)=>{if(o.length>=r)return;let c;try{c=await Rc(i,{withFileTypes:!0})}catch{return}for(let l of c){if(o.length>=r)break;if(l.isSymbolicLink())continue;let u=ar(i,l.name),p=$c(t,u);if(!p)continue;let v=Dc(p);if(n.ignores(v))continue;let m=v.split("/").filter(Boolean),b=m.map(C=>C.toLowerCase()),h=l.isDirectory();if(o.push({path:v,pathLower:v.toLowerCase(),segments:m,segmentsLower:b,depth:a,isDir:h}),o.length>=r)break;h&&a<e.maxDepth&&await s(u,a+1)}};return await s(t,0),o.sort((i,a)=>i.path.localeCompare(a.path)),{entries:o,signature:n.__memoSignature}}async function Vc(t,e){let n=jc(e),o=await Bc(n,t),r=o.__memoSignature,s=Mt.get(t);if(s&&s.signature===r)return s.pending?s.pending:s.entries;let i=Fc(t,n,o).then(a=>(Mt.set(t,{entries:a.entries,signature:a.signature}),a.entries)).catch(a=>{throw Mt.delete(t),a});return Mt.set(t,{entries:[],signature:r,pending:i}),i}function Gc(t){return t.depth+(t.isDir?-.2:.2)}function zc(t,e){if(!e.length)return Gc(t);let n=t.depth,o=0;for(let r of e){let s=-1;for(let i=o;i<t.segmentsLower.length;i++){let a=t.segmentsLower[i];if(a.startsWith(r)){s=i,n+=(i-o)*1.5,n+=a.length-r.length;break}let c=a.indexOf(r);if(c!==-1){s=i,n+=(i-o)*2+c+2;break}}if(s===-1)return null;o=s+1}return t.isDir&&(n-=.5),n}function Wc(t,e,n){let s=e.trim().replace(/\\/g,"/").split("/").filter(Boolean).map(a=>a.toLowerCase()),i=[];for(let a of t){let c=zc(a,s);c!==null&&i.push({entry:a,score:c})}return i.sort((a,c)=>{let l=a.score-c.score;return l!==0?l:a.entry.path.localeCompare(c.entry.path)}),i.slice(0,n).map(({entry:a})=>({id:a.path,path:a.path,name:a.segments[a.segments.length-1]??a.path,parent:a.segments.length>1?a.segments.slice(0,-1).join("/"):void 0,isDir:a.isDir}))}async function ur(t){let e=await Vc(t.cwd,t),n=typeof t.limit=="number"?Math.max(1,t.limit):lr;return Wc(e,t.query,n)}import{mkdir as Md,readFile as Pd,writeFile as Rd}from"fs/promises";import{dirname as Id}from"path";import{randomUUID as Nd}from"crypto";import{Box as tt,Text as ze}from"ink";import{jsx as ke,jsxs as mr}from"react/jsx-runtime";var Kc="#3a3a3a",Pt="#2b2b2b",pr="#888888",Jc="#666666";function dr({items:t,activeIndex:e,loading:n}){return n?ke(tt,{flexDirection:"column",paddingX:1,backgroundColor:Pt,children:ke(ze,{color:"gray",children:"Loading..."})}):t.length?ke(tt,{flexDirection:"column",backgroundColor:Pt,children:t.map((o,r)=>{let s=r===e,i=s?Kc:Pt;return o.kind==="slash"?mr(tt,{flexDirection:"row",gap:2,paddingX:1,backgroundColor:i,children:[ke(ze,{color:s?"cyan":"white",bold:s,children:o.title}),o.subtitle?ke(ze,{color:pr,children:o.subtitle}):null]},o.id):mr(tt,{flexDirection:"row",gap:1,paddingX:1,backgroundColor:i,children:[ke(ze,{color:s?"cyan":"white",bold:s,children:o.title}),o.subtitle?ke(ze,{color:pr,children:o.subtitle}):null]},o.id)})}):ke(tt,{flexDirection:"column",paddingX:1,backgroundColor:Pt,children:ke(ze,{color:Jc,children:"No matches"})})}var fr={name:"new",description:"Start a new session",run:({closeSuggestions:t,setInputValue:e,clearScreen:n,showSystemMessage:o,newSession:r})=>{t(),e(""),n(),o("New Session","Starting a new session..."),r?.()}};var gr={name:"exit",description:"Exit the session",run:({closeSuggestions:t,exitApp:e})=>{t(),e()}};var hr={name:"resume",description:"Resume history",run:({closeSuggestions:t,setInputValue:e,showSystemMessage:n})=>{t(!1),e("resume "),n("Resume",'Type "resume" followed by keywords to filter and select from session history.')}};var yr={name:"models",description:"Select a model (from configured providers)",run:({closeSuggestions:t,setInputValue:e,showSystemMessage:n,data:o})=>{t(!1);let{providers:r,providerName:s,model:i}=o;if(!r.length){n("Models",`No providers configured. Check ${o.configPath}`),e("");return}let a=r.map(c=>{let l=c.name===s&&c.model===i?" (current)":"",u=c.base_url?` @ ${c.base_url}`:"";return`- ${c.name}: ${c.model}${u}${l}`});e("/models "),n("Models",`Available models:
59
59
  ${a.join(`
60
- `)}`)}};var Gc=`Available commands:
60
+ `)}`)}};var qc=`Available commands:
61
61
  /help Show help and shortcuts
62
62
  /exit Exit the session
63
63
  exit Exit the session (no slash)
@@ -76,15 +76,15 @@ Shortcuts:
76
76
  Ctrl+L Start a new session
77
77
  Ctrl+C Exit
78
78
  exit Type in input to exit
79
- Esc Esc Cancel / Clear input`,fr={name:"help",description:"Show help",run:({closeSuggestions:t,setInputValue:e,showSystemMessage:n})=>{t(),e(""),n("Help",Gc)}};var gr={name:"context",description:"Set context length limit (80k/120k/150k/200k)",run:({closeSuggestions:t,setInputValue:e})=>{t(!1),e("/context ")}};function zc(t,e){let n=[];if(n.push(`- **${t}**`),"url"in e){n.push(` - Type: ${e.type??"streamable_http"}`),n.push(` - URL: ${e.url}`),e.bearer_token_env_var&&n.push(` - Bearer token env: ${e.bearer_token_env_var}`),e.type!=="sse"&&e.fallback_to_sse!==void 0&&n.push(` - Fallback to SSE: ${e.fallback_to_sse}`);let o=e.http_headers??e.headers;if(o&&Object.keys(o).length>0){let r=Object.entries(o).map(([s,i])=>`${s}=${i}`).join(", ");n.push(` - Headers: ${r}`)}}else if(n.push(` - Type: ${e.type??"stdio"}`),n.push(` - Command: ${e.command}`),e.args&&e.args.length>0&&n.push(` - Args: ${e.args.join(" ")}`),e.env&&Object.keys(e.env).length>0){let o=Object.entries(e.env).map(([r,s])=>`${r}=${s}`).join(", ");n.push(` - Env: ${o}`)}return n.join(`
80
- `)}var hr={name:"mcp",description:"Show configured MCP servers",run:({closeSuggestions:t,setInputValue:e,showSystemMessage:n,data:o})=>{t();let{mcpServers:r,configPath:s}=o,i=Object.keys(r);if(i.length===0){n("MCP Servers",`No MCP servers configured.
79
+ Esc Esc Cancel / Clear input`,xr={name:"help",description:"Show help",run:({closeSuggestions:t,setInputValue:e,showSystemMessage:n})=>{t(),e(""),n("Help",qc)}};var vr={name:"context",description:"Set context length limit (80k/120k/150k/200k)",run:({closeSuggestions:t,setInputValue:e})=>{t(!1),e("/context ")}};function Xc(t,e){let n=[];if(n.push(`- **${t}**`),"url"in e){n.push(` - Type: ${e.type??"streamable_http"}`),n.push(` - URL: ${e.url}`),e.bearer_token_env_var&&n.push(` - Bearer token env: ${e.bearer_token_env_var}`),e.type!=="sse"&&e.fallback_to_sse!==void 0&&n.push(` - Fallback to SSE: ${e.fallback_to_sse}`);let o=e.http_headers??e.headers;if(o&&Object.keys(o).length>0){let r=Object.entries(o).map(([s,i])=>`${s}=${i}`).join(", ");n.push(` - Headers: ${r}`)}}else if(n.push(` - Type: ${e.type??"stdio"}`),n.push(` - Command: ${e.command}`),e.args&&e.args.length>0&&n.push(` - Args: ${e.args.join(" ")}`),e.env&&Object.keys(e.env).length>0){let o=Object.entries(e.env).map(([r,s])=>`${r}=${s}`).join(", ");n.push(` - Env: ${o}`)}return n.join(`
80
+ `)}var Tr={name:"mcp",description:"Show configured MCP servers",run:({closeSuggestions:t,setInputValue:e,showSystemMessage:n,data:o})=>{t();let{mcpServers:r,configPath:s}=o,i=Object.keys(r);if(i.length===0){n("MCP Servers",`No MCP servers configured.
81
81
 
82
82
  Add servers to ${s}`),e("");return}let a=[];a.push(`Total: ${i.length} server(s)
83
- `);for(let[c,l]of Object.entries(r))a.push(zc(c,l)),a.push("");e(""),n("MCP Servers",a.join(`
84
- `))}};var xn=[fr,pr,ur,mr,dr,gr,hr];import{Fragment as ml,jsx as Ee,jsxs as nt}from"react/jsx-runtime";var Qc=400;function vr({disabled:t,onSubmit:e,onExit:n,onClear:o,onNewSession:r,onCancelRun:s,onModelSelect:i,onSystemMessage:a,onSetContextLimit:c,history:l,cwd:u,sessionsDir:p,currentSessionFile:v,onHistorySelect:m,providers:_,configPath:y,providerName:C,model:P,contextLimit:g,mcpServers:M}){let[x,E]=Ce(""),[U,$]=Ce(null),[V,S]=Ce(""),[w,j]=Ce("none"),[re,J]=Ce([]),[H,B]=Ce(0),[ue,fe]=Ce(!1),[Oe,be]=Ce(!1),q=Tn(0),De=Tn(0),D=Tn(""),we="\u203A ";vn(()=>{D.current=x,be(!1)},[x]);let F=Wc(()=>Oe||t?null:rl(x),[t,Oe,x]),X=yr((I=!0)=>{I&&be(!0),j("none"),J([]),B(0),fe(!1)},[]);vn(()=>{t&&X(!1)},[t,X]),vn(()=>{if(!F){j("none"),J([]),B(0),fe(!1);return}let I=!1,N=++q.current;return fe(!0),(async()=>{try{if(F.type==="file"){let h=await ir({cwd:u,query:F.query,limit:8});if(I||N!==q.current)return;let L=h.map(k=>{let A=k.isDir?`${k.path}/`:k.path;return{id:k.id,title:A,kind:"file",value:A,meta:{isDir:k.isDir}}});j("file"),J(L),B(k=>L.length?Math.min(k,L.length-1):0);return}if(F.type==="history"){let h=await el({sessionsDir:p,cwd:u,keyword:F.keyword,activeSessionFile:v});if(I||N!==q.current)return;let L=h.map(ul);j("history"),J(L),B(k=>L.length?Math.min(k,L.length-1):0);return}if(F.type==="models"){let h=F.keyword.toLowerCase(),k=(_??[]).filter(A=>{let se=A.name?.toLowerCase()??"",Me=A.model?.toLowerCase()??"";return h?se.includes(h)||Me.includes(h):!0}).map(A=>({id:A.name,title:`${A.name}: ${A.model}`,subtitle:A.base_url??A.env_api_key??"",kind:"model",value:`/models ${A.name}`,meta:{provider:A}}));j("model"),J(k),B(A=>k.length?Math.min(A,k.length-1):0);return}if(F.type==="context"){let L=[8e4,12e4,15e4,2e5].map(k=>({id:`${k}`,title:`${(k/1e3).toFixed(0)}k tokens`,subtitle:k===g?"Current":void 0,kind:"context",value:`/context ${(k/1e3).toFixed(0)}k`,meta:{contextValue:k}}));j("context"),J(L),B(k=>L.length?Math.min(k,L.length-1):0);return}if(F.type==="slash"){let h=F.keyword.toLowerCase(),k=(h?xn.filter(A=>A.matches?A.matches(h):A.name.startsWith(h)):xn).map(A=>({id:A.name,title:`/${A.name}`,subtitle:A.description,kind:"slash",value:`/${A.name} `,meta:{slashCommand:A}}));j("slash"),J(k),B(A=>k.length?Math.min(A,k.length-1):0);return}}catch{!I&&N===q.current&&J([])}finally{!I&&N===q.current&&fe(!1)}})(),()=>{I=!0}},[F,u,p,v,_,g]);let Ue=yr(I=>{if(I){if(w==="file"&&F?.type==="file"){let N=x.slice(0,F.tokenStart),h=x.slice(F.tokenStart+F.query.length),L=`${N}${I.value}${h}`;D.current=L,E(L),$(null),S(""),I.meta?.isDir||X();return}if(w==="history"){I.meta?.historyEntry&&m?.(I.meta.historyEntry),D.current=I.value,E(I.value),$(null),S(""),X();return}if(w==="model"&&I.meta?.provider){i?.(I.meta.provider),D.current="",E(""),$(null),S(""),X();return}if(w==="slash"&&I.meta?.slashCommand){I.meta.slashCommand.run({setInputValue:h=>{D.current=h,E(h),$(null),S("")},closeSuggestions:X,clearScreen:()=>{o()},newSession:()=>{r?.()},exitApp:()=>{n()},showSystemMessage:(h,L)=>{a?.(h,L)},switchModel:h=>{i?.(h)},setContextLimit:h=>{c?.(h)},loadHistory:h=>{m?.(h)},data:{configPath:y,providerName:C,model:P,contextLimit:g,providers:_,mcpServers:M}});return}if(w==="context"&&I.meta?.contextValue){let N=I.meta.contextValue;c?.(N),a?.("Context",`Context limit set to ${(N/1e3).toFixed(0)}k tokens`),D.current="",E(""),$(null),S(""),X();return}}},[X,o,n,i,a,c,m,w,F,x,y,C,P,g,_,M]);Zc((I,N)=>{if(N.ctrl&&I==="l"){D.current="",E(""),$(null),S(""),X(),o(),r?.();return}let h=w!=="none",L=h&&re.length>0;if(N.escape){let k=Date.now();if(k-De.current<=Qc){De.current=0,t?s():(D.current="",E(""),$(null),S(""),X());return}De.current=k,h&&X();return}if(!t){if(N.upArrow){if(L){B(se=>se<=0?re.length-1:se-1);return}if(!l.length)return;if(U===null){S(D.current);let se=l.length-1;$(se);let Me=l[se]??"";D.current=Me,E(Me);return}let k=Math.max(0,U-1);$(k);let A=l[k]??"";D.current=A,E(A);return}if(N.downArrow){if(L){B(se=>(se+1)%re.length);return}if(U===null)return;let k=U+1;if(k>=l.length){$(null),D.current=V,E(V),S("");return}$(k);let A=l[k]??"";D.current=A,E(A);return}if(N.tab&&L){Ue(re[H]);return}if(N.return){if(L){Ue(re[H]);return}if(N.shift){let A=D.current+`
85
- `;D.current=A,E(A);return}let k=D.current.trim();k&&(e(k),D.current="",E(""),$(null),S(""),X(!1));return}if(N.backspace||N.delete){let k=D.current.slice(0,Math.max(0,D.current.length-1));D.current=k,E(k);return}if(I){let k=D.current+I;D.current=k,E(k)}}});let Ot=x,it=t?" ":"\u258A",ce=Ot.split(`
86
- `),Ke=2,at=re.map(({value:I,meta:N,...h})=>h);return nt($t,{flexDirection:"column",gap:1,children:[nt($t,{flexDirection:"column",paddingY:1,children:[nt($t,{children:[Ee(Ie,{color:"gray",children:we}),t?Ee(Ie,{color:"gray",children:ce[0]}):nt(ml,{children:[Ee(Ie,{color:"white",children:ce[0]}),ce.length===1&&Ee(Ie,{color:"cyan",children:it})]})]}),ce.slice(1).map((I,N)=>nt($t,{children:[Ee(Ie,{color:"gray",children:" ".repeat(Ke)}),Ee(Ie,{color:"white",children:I}),N===ce.length-2&&Ee(Ie,{color:"cyan",children:it})]},`line-${N}`))]}),w!=="none"?Ee(lr,{items:at,activeIndex:H,loading:ue}):null]})}async function el(t){let e=To(t.sessionsDir,t.cwd),n;try{n=await Jc(e,{withFileTypes:!0})}catch(l){return l?.code==="ENOENT"?[]:[]}let o=t.activeSessionFile?xr(t.activeSessionFile):null,s=(await Promise.all(n.filter(l=>l.isFile()&&l.name.endsWith(".jsonl")).map(async l=>{let u=Yc(e,l.name);if(o&&xr(u)===o)return null;try{let p=await qc(u);return{path:u,mtimeMs:p.mtimeMs}}catch{return null}}))).filter(l=>!!l).sort((l,u)=>u.mtimeMs-l.mtimeMs),i=t.limit??10,a=t.keyword?.trim().toLowerCase(),c=[];for(let l of s){if(c.length>=i)break;let u=await tl(l.path,t.cwd,l.mtimeMs);if(u&&!(a&&!u.input.toLowerCase().includes(a))&&(c.push(u),c.length>=i))break}return c}async function tl(t,e,n){try{let o=await Kc(t,"utf8"),s=nl(o)?.trim()||ol(t);return{id:t,cwd:e,input:s,ts:n,sessionFile:t}}catch{return null}}function nl(t){for(let e of t.split(`
87
- `)){let n=e.trim();if(!n)continue;let o;try{o=JSON.parse(n)}catch{continue}if(o&&typeof o=="object"&&o.type==="turn_start"){let r=typeof o.content=="string"?o.content.trim():"";if(r)return r}}return null}function ol(t){return Xc(t).replace(/\.jsonl$/i,"")}function rl(t){let e=cl(t);if(e)return e;let n=al(t);if(n)return n;let o=ll(t);if(o)return o;let r=sl(t);return r||il(t)}function sl(t){let e=t.lastIndexOf("@");if(e===-1)return null;if(e>0){let o=t[e-1];if(o&&!/\s/.test(o))return null}let n=t.slice(e+1);return/\s/.test(n)?null:{type:"file",query:n,tokenStart:e+1}}function il(t){let e=t.trimStart(),n=t.length-e.length;if(e.length===0)return null;let o=e;if(o.startsWith("/")&&(o=o.slice(1)),!o.toLowerCase().startsWith("resume")||t.slice(0,n).trim().length>0)return null;let s=o.slice(6);return s&&!s.startsWith(" ")?null:{type:"history",keyword:s.trim()}}function al(t){let e=t.trimStart();if(!e.startsWith("/models"))return null;let n=e.slice(7);return n&&!n.startsWith(" ")?null:{type:"models",keyword:n.trim()}}function cl(t){let e=t.trimStart();if(!e.startsWith("/context"))return null;let n=e.slice(8);return n&&!n.startsWith(" ")?null:{type:"context"}}function ll(t){let e=t.trimStart();if(!e.startsWith("/"))return null;let n=e.slice(1);return n.includes(" ")?null:/^[a-zA-Z]*$/.test(n)?{type:"slash",keyword:n.toLowerCase()}:n.length===0?{type:"slash",keyword:""}:null}function ul(t){return{id:t.id,title:t.input,subtitle:pl(t.ts),kind:"history",badge:"HIS",value:t.input,meta:{historyEntry:t}}}function pl(t){if(!t)return"";let e=new Date(t);if(Number.isNaN(e.getTime()))return"";let n=String(e.getFullYear()),o=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0"),s=String(e.getHours()).padStart(2,"0"),i=String(e.getMinutes()).padStart(2,"0");return`${n}-${o}-${r} ${s}:${i}`}import{Box as ot,Text as Sn,useInput as dl}from"ink";import{useState as fl,useCallback as gl}from"react";import{jsx as rt,jsxs as kn}from"react/jsx-runtime";function hl(t){if(typeof t!="object"||t===null)return String(t);let e=Object.entries(t);if(e.length===0)return"";let[n,o]=e[0],r=typeof o=="string"?o:JSON.stringify(o);return`${r.slice(0,40)}${r.length>40?"...":""}`}function Tr({request:t,onDecision:e}){let n=[{label:"Allow once",decision:"once"},{label:"Allow all session",decision:"session"},{label:"Reject this time",decision:"deny"}],[o,r]=fl(0);dl(gl((i,a)=>{a.upArrow?r(c=>c>0?c-1:n.length-1):a.downArrow?r(c=>c<n.length-1?c+1:0):a.return&&e(n[o].decision)},[o,e,n]));let s=hl(t.params);return kn(ot,{borderStyle:"single",borderColor:"gray",paddingX:2,flexDirection:"column",children:[rt(ot,{children:rt(Sn,{bold:!0,children:"Tool Approval:"})}),rt(ot,{marginTop:1,children:kn(Sn,{color:"cyan",children:[t.toolName,s?` (${s})`:""]})}),rt(ot,{flexDirection:"column",marginTop:1,children:n.map((i,a)=>rt(ot,{children:kn(Sn,{color:o===a?"green":"gray",children:[o===a?"> ":" ",i.label]})},i.decision))})]})}import gf from"string-width";function kr(t){if(!t)return"success";let e=t.toLowerCase();return e.includes("error")||e.includes("unknown")||e.includes("failed")?"error":"success"}var Sr={"gpt-4o-mini":128e3,"gpt-4o":128e3,"gpt-4":8192,"gpt-3.5":16384,"claude-3":2e5,claude:2e5,"deepseek-coder":64e3,"deepseek-chat":64e3,deepseek:64e3,"kimi-k2":2e5,kimi:2e5,default:12e4};function yl(t){let e=t.toLowerCase(),n=Object.entries(Sr).filter(([o])=>o!=="default");for(let[o,r]of n.sort((s,i)=>i[0].length-s[0].length))if(e.includes(o))return r;return Sr.default}function _r(t,e){if(t==null)return 0;let n=typeof t=="number"?t:t.prompt??t.total??0;if(n<=0)return 0;let o=e&&e>0?e:yl("");return Math.min(100,n/o*100)}function br(t){return t?`${t.total} tokens`:""}var xl=`Available commands:
83
+ `);for(let[c,l]of Object.entries(r))a.push(Xc(c,l)),a.push("");e(""),n("MCP Servers",a.join(`
84
+ `))}};var Tn=[xr,gr,fr,hr,yr,vr,Tr];import{Fragment as yl,jsx as Ee,jsxs as nt}from"react/jsx-runtime";var rl=400;function br({disabled:t,onSubmit:e,onExit:n,onClear:o,onNewSession:r,onCancelRun:s,onModelSelect:i,onSystemMessage:a,onSetContextLimit:c,history:l,cwd:u,sessionsDir:p,currentSessionFile:v,onHistorySelect:m,providers:b,configPath:h,providerName:C,model:P,contextLimit:g,mcpServers:A}){let[y,E]=Ce(""),[U,I]=Ce(null),[V,k]=Ce(""),[_,j]=Ce("none"),[ie,X]=Ce([]),[H,B]=Ce(0),[pe,he]=Ce(!1),[Oe,we]=Ce(!1),Y=kn(0),De=kn(0),D=kn(""),_e="\u203A ";Sn(()=>{D.current=y,we(!1)},[y]);let F=Yc(()=>Oe||t?null:ll(y),[t,Oe,y]),Z=Sr((L=!0)=>{L&&we(!0),j("none"),X([]),B(0),he(!1)},[]);Sn(()=>{t&&Z(!1)},[t,Z]),Sn(()=>{if(!F){j("none"),X([]),B(0),he(!1);return}let L=!1,N=++Y.current;return he(!0),(async()=>{try{if(F.type==="file"){let R=await ur({cwd:u,query:F.query,limit:8});if(L||N!==Y.current)return;let x=R.map(T=>{let M=T.isDir?`${T.path}/`:T.path;return{id:T.id,title:M,kind:"file",value:M,meta:{isDir:T.isDir}}});j("file"),X(x),B(T=>x.length?Math.min(T,x.length-1):0);return}if(F.type==="history"){let R=await sl({sessionsDir:p,cwd:u,keyword:F.keyword,activeSessionFile:v});if(L||N!==Y.current)return;let x=R.map(gl);j("history"),X(x),B(T=>x.length?Math.min(T,x.length-1):0);return}if(F.type==="models"){let R=F.keyword.toLowerCase(),T=(b??[]).filter(M=>{let K=M.name?.toLowerCase()??"",Me=M.model?.toLowerCase()??"";return R?K.includes(R)||Me.includes(R):!0}).map(M=>({id:M.name,title:`${M.name}: ${M.model}`,subtitle:M.base_url??M.env_api_key??"",kind:"model",value:`/models ${M.name}`,meta:{provider:M}}));j("model"),X(T),B(M=>T.length?Math.min(M,T.length-1):0);return}if(F.type==="context"){let x=[8e4,12e4,15e4,2e5].map(T=>({id:`${T}`,title:`${(T/1e3).toFixed(0)}k tokens`,subtitle:T===g?"Current":void 0,kind:"context",value:`/context ${(T/1e3).toFixed(0)}k`,meta:{contextValue:T}}));j("context"),X(x),B(T=>x.length?Math.min(T,x.length-1):0);return}if(F.type==="slash"){let R=F.keyword.toLowerCase(),T=(R?Tn.filter(M=>M.matches?M.matches(R):M.name.startsWith(R)):Tn).map(M=>({id:M.name,title:`/${M.name}`,subtitle:M.description,kind:"slash",value:`/${M.name} `,meta:{slashCommand:M}}));j("slash"),X(T),B(M=>T.length?Math.min(M,T.length-1):0);return}}catch{!L&&N===Y.current&&X([])}finally{!L&&N===Y.current&&he(!1)}})(),()=>{L=!0}},[F,u,p,v,b,g]);let Ue=Sr(L=>{if(L){if(_==="file"&&F?.type==="file"){let N=y.slice(0,F.tokenStart),R=y.slice(F.tokenStart+F.query.length),x=`${N}${L.value}${R}`;D.current=x,E(x),I(null),k(""),L.meta?.isDir||Z();return}if(_==="history"){L.meta?.historyEntry&&m?.(L.meta.historyEntry),D.current=L.value,E(L.value),I(null),k(""),Z();return}if(_==="model"&&L.meta?.provider){i?.(L.meta.provider),D.current="",E(""),I(null),k(""),Z();return}if(_==="slash"&&L.meta?.slashCommand){L.meta.slashCommand.run({setInputValue:R=>{D.current=R,E(R),I(null),k("")},closeSuggestions:Z,clearScreen:()=>{o()},newSession:()=>{r?.()},exitApp:()=>{n()},showSystemMessage:(R,x)=>{a?.(R,x)},switchModel:R=>{i?.(R)},setContextLimit:R=>{c?.(R)},loadHistory:R=>{m?.(R)},data:{configPath:h,providerName:C,model:P,contextLimit:g,providers:b,mcpServers:A}});return}if(_==="context"&&L.meta?.contextValue){let N=L.meta.contextValue;c?.(N),a?.("Context",`Context limit set to ${(N/1e3).toFixed(0)}k tokens`),D.current="",E(""),I(null),k(""),Z();return}}},[Z,o,n,i,a,c,m,_,F,y,h,C,P,g,b,A]);ol((L,N)=>{if(N.ctrl&&L==="l"){D.current="",E(""),I(null),k(""),Z(),o(),r?.();return}let R=_!=="none",x=R&&ie.length>0;if(N.escape){let T=Date.now();if(T-De.current<=rl){De.current=0,t?s():(D.current="",E(""),I(null),k(""),Z());return}De.current=T,R&&Z();return}if(!t){if(N.upArrow){if(x){B(K=>K<=0?ie.length-1:K-1);return}if(!l.length)return;if(U===null){k(D.current);let K=l.length-1;I(K);let Me=l[K]??"";D.current=Me,E(Me);return}let T=Math.max(0,U-1);I(T);let M=l[T]??"";D.current=M,E(M);return}if(N.downArrow){if(x){B(K=>(K+1)%ie.length);return}if(U===null)return;let T=U+1;if(T>=l.length){I(null),D.current=V,E(V),k("");return}I(T);let M=l[T]??"";D.current=M,E(M);return}if(N.tab&&x){Ue(ie[H]);return}if(N.return){if(x){Ue(ie[H]);return}if(N.shift){let M=D.current+`
85
+ `;D.current=M,E(M);return}let T=D.current.trim();T&&(e(T),D.current="",E(""),I(null),k(""),Z(!1));return}if(N.backspace||N.delete){let T=D.current.slice(0,Math.max(0,D.current.length-1));D.current=T,E(T);return}if(L){let T=D.current+L;D.current=T,E(T)}}});let Dt=y,it=t?" ":"\u258A",le=Dt.split(`
86
+ `),Ut=2,Ke=ie.map(({value:L,meta:N,...R})=>R);return nt(Rt,{flexDirection:"column",gap:1,children:[nt(Rt,{flexDirection:"column",paddingY:1,children:[nt(Rt,{children:[Ee(Ie,{color:"gray",children:_e}),t?Ee(Ie,{color:"gray",children:le[0]}):nt(yl,{children:[Ee(Ie,{color:"white",children:le[0]}),le.length===1&&Ee(Ie,{color:"cyan",children:it})]})]}),le.slice(1).map((L,N)=>nt(Rt,{children:[Ee(Ie,{color:"gray",children:" ".repeat(Ut)}),Ee(Ie,{color:"white",children:L}),N===le.length-2&&Ee(Ie,{color:"cyan",children:it})]},`line-${N}`))]}),_!=="none"?Ee(dr,{items:Ke,activeIndex:H,loading:pe}):null]})}async function sl(t){let e=wo(t.sessionsDir,t.cwd),n;try{n=await Qc(e,{withFileTypes:!0})}catch(l){return l?.code==="ENOENT"?[]:[]}let o=t.activeSessionFile?kr(t.activeSessionFile):null,s=(await Promise.all(n.filter(l=>l.isFile()&&l.name.endsWith(".jsonl")).map(async l=>{let u=nl(e,l.name);if(o&&kr(u)===o)return null;try{let p=await el(u);return{path:u,mtimeMs:p.mtimeMs}}catch{return null}}))).filter(l=>!!l).sort((l,u)=>u.mtimeMs-l.mtimeMs),i=t.limit??10,a=t.keyword?.trim().toLowerCase(),c=[];for(let l of s){if(c.length>=i)break;let u=await il(l.path,t.cwd,l.mtimeMs);if(u&&!(a&&!u.input.toLowerCase().includes(a))&&(c.push(u),c.length>=i))break}return c}async function il(t,e,n){try{let o=await Zc(t,"utf8"),s=al(o)?.trim()||cl(t);return{id:t,cwd:e,input:s,ts:n,sessionFile:t}}catch{return null}}function al(t){for(let e of t.split(`
87
+ `)){let n=e.trim();if(!n)continue;let o;try{o=JSON.parse(n)}catch{continue}if(o&&typeof o=="object"&&o.type==="turn_start"){let r=typeof o.content=="string"?o.content.trim():"";if(r)return r}}return null}function cl(t){return tl(t).replace(/\.jsonl$/i,"")}function ll(t){let e=dl(t);if(e)return e;let n=ml(t);if(n)return n;let o=fl(t);if(o)return o;let r=ul(t);return r||pl(t)}function ul(t){let e=t.lastIndexOf("@");if(e===-1)return null;if(e>0){let o=t[e-1];if(o&&!/\s/.test(o))return null}let n=t.slice(e+1);return/\s/.test(n)?null:{type:"file",query:n,tokenStart:e+1}}function pl(t){let e=t.trimStart(),n=t.length-e.length;if(e.length===0)return null;let o=e;if(o.startsWith("/")&&(o=o.slice(1)),!o.toLowerCase().startsWith("resume")||t.slice(0,n).trim().length>0)return null;let s=o.slice(6);return s&&!s.startsWith(" ")?null:{type:"history",keyword:s.trim()}}function ml(t){let e=t.trimStart();if(!e.startsWith("/models"))return null;let n=e.slice(7);return n&&!n.startsWith(" ")?null:{type:"models",keyword:n.trim()}}function dl(t){let e=t.trimStart();if(!e.startsWith("/context"))return null;let n=e.slice(8);return n&&!n.startsWith(" ")?null:{type:"context"}}function fl(t){let e=t.trimStart();if(!e.startsWith("/"))return null;let n=e.slice(1);return n.includes(" ")?null:/^[a-zA-Z]*$/.test(n)?{type:"slash",keyword:n.toLowerCase()}:n.length===0?{type:"slash",keyword:""}:null}function gl(t){return{id:t.id,title:t.input,subtitle:hl(t.ts),kind:"history",badge:"HIS",value:t.input,meta:{historyEntry:t}}}function hl(t){if(!t)return"";let e=new Date(t);if(Number.isNaN(e.getTime()))return"";let n=String(e.getFullYear()),o=String(e.getMonth()+1).padStart(2,"0"),r=String(e.getDate()).padStart(2,"0"),s=String(e.getHours()).padStart(2,"0"),i=String(e.getMinutes()).padStart(2,"0");return`${n}-${o}-${r} ${s}:${i}`}import{Box as ot,Text as bn,useInput as xl}from"ink";import{useState as vl,useCallback as Tl}from"react";import{jsx as rt,jsxs as wn}from"react/jsx-runtime";function Sl(t){if(typeof t!="object"||t===null)return String(t);let e=Object.entries(t);if(e.length===0)return"";let[n,o]=e[0],r=typeof o=="string"?o:JSON.stringify(o);return`${r.slice(0,40)}${r.length>40?"...":""}`}function wr({request:t,onDecision:e}){let n=[{label:"Allow once",decision:"once"},{label:"Allow all session",decision:"session"},{label:"Reject this time",decision:"deny"}],[o,r]=vl(0);xl(Tl((i,a)=>{a.upArrow?r(c=>c>0?c-1:n.length-1):a.downArrow?r(c=>c<n.length-1?c+1:0):a.return&&e(n[o].decision)},[o,e,n]));let s=Sl(t.params);return wn(ot,{borderStyle:"single",borderColor:"gray",paddingX:2,flexDirection:"column",children:[rt(ot,{children:rt(bn,{bold:!0,children:"Tool Approval:"})}),rt(ot,{marginTop:1,children:wn(bn,{color:"cyan",children:[t.toolName,s?` (${s})`:""]})}),rt(ot,{flexDirection:"column",marginTop:1,children:n.map((i,a)=>rt(ot,{children:wn(bn,{color:o===a?"green":"gray",children:[o===a?"> ":" ",i.label]})},i.decision))})]})}import Sf from"string-width";function Cr(t){if(!t)return"success";let e=t.toLowerCase();return e.includes("error")||e.includes("unknown")||e.includes("failed")?"error":"success"}var _r={"gpt-4o-mini":128e3,"gpt-4o":128e3,"gpt-4":8192,"gpt-3.5":16384,"claude-3":2e5,claude:2e5,"deepseek-coder":64e3,"deepseek-chat":64e3,deepseek:64e3,"kimi-k2":2e5,kimi:2e5,default:12e4};function kl(t){let e=t.toLowerCase(),n=Object.entries(_r).filter(([o])=>o!=="default");for(let[o,r]of n.sort((s,i)=>i[0].length-s[0].length))if(e.includes(o))return r;return _r.default}function Er(t,e){if(t==null)return 0;let n=typeof t=="number"?t:t.prompt??t.total??0;if(n<=0)return 0;let o=e&&e>0?e:kl("");return Math.min(100,n/o*100)}function Ar(t){return t?`${t.total} tokens`:""}var bl=`Available commands:
88
88
  /help Show help and shortcuts
89
89
  /exit Exit the session
90
90
  exit Exit the session (no slash)
@@ -104,16 +104,16 @@ Shortcuts:
104
104
  Ctrl+C Exit
105
105
  exit Type in input to exit
106
106
  Ctrl+X Toggle mode
107
- Ctrl+/ Show help`;function wr(t,e){let[n,...o]=t.trim().slice(1).split(/\s+/),r=(n??"").toLowerCase(),s=[8e4,12e4,15e4,2e5],i=a=>{if(!a)return null;let l=a.toLowerCase().replace(/,/g,"").match(/^(\d+)(k)?$/);if(!l)return null;let u=Number(l[1])*(l[2]?1e3:1);return Number.isFinite(u)?u:null};switch(r){case"exit":return{kind:"exit"};case"new":return{kind:"new"};case"help":return{kind:"message",title:"Help",content:xl};case"config":return{kind:"message",title:"Config",content:`Config file: ${e.configPath}
107
+ Ctrl+/ Show help`;function Mr(t,e){let[n,...o]=t.trim().slice(1).split(/\s+/),r=(n??"").toLowerCase(),s=[8e4,12e4,15e4,2e5],i=a=>{if(!a)return null;let l=a.toLowerCase().replace(/,/g,"").match(/^(\d+)(k)?$/);if(!l)return null;let u=Number(l[1])*(l[2]?1e3:1);return Number.isFinite(u)?u:null};switch(r){case"exit":return{kind:"exit"};case"new":return{kind:"new"};case"help":return{kind:"message",title:"Help",content:bl};case"config":return{kind:"message",title:"Config",content:`Config file: ${e.configPath}
108
108
  Current provider: ${e.providerName}
109
109
  Current model: ${e.model}`};case"resume":return{kind:"message",title:"Resume",content:'Type "resume" to filter and select from session history.'};case"context":{let p=i(o[0]),v=s.map(m=>`${m/1e3}k`).join(", ");return p===null?{kind:"message",title:"Context",content:`Current: ${(e.contextLimit/1e3).toFixed(0)}k
110
110
  Usage: /context <length>
111
111
  Choices: ${v}`}:s.includes(p)?{kind:"set_context_limit",limit:p}:{kind:"message",title:"Context",content:`Unsupported length: ${p}. Pick one of: ${v}`}}case"init":return{kind:"init_agents_md"};case"$":{let p=o.join(" ").trim();return p?{kind:"shell_command",command:p}:{kind:"message",title:"Shell Command",content:"Usage: $ <command> (e.g. $ git status)"}}case"models":if(!e.providers.length)return{kind:"message",title:"Models",content:`No providers configured. Check ${e.configPath}`};let a=o.join(" ").trim(),c=e.providers.find(p=>p.name===a)??e.providers.find(p=>p.model===a);if(c)return{kind:"switch_model",provider:c};let l=e.providers.map(p=>{let v=p.base_url?` @ ${p.base_url}`:"";return`- ${p.name}: ${p.model}${v}`});return{kind:"message",title:"Models",content:`${a?`Not found: ${a}, `:""}Available models:
112
112
  ${l.join(`
113
113
  `)}`};default:return{kind:"message",title:"Unknown",content:`Unknown command: ${t}
114
- Type /help for available commands.`}}}import{dirname as Cr,join as vl,resolve as Tl}from"path";import{statSync as Sl,existsSync as kl}from"fs";import{readFile as _l}from"fs/promises";import{get as bl}from"https";function Er(t){let e=t.trim().replace(/^v/i,""),[n="",o]=e.split("-",2),r=n.split(".").map(s=>Number(s));return r.length<3||r.some(s=>!Number.isFinite(s))?null:{major:r[0]??0,minor:r[1]??0,patch:r[2]??0,prerelease:o??null}}function wl(t,e){let n=Er(t),o=Er(e);return!n||!o?!1:n.major!==o.major?n.major>o.major:n.minor!==o.minor?n.minor>o.minor:n.patch!==o.patch?n.patch>o.patch:n.prerelease&&!o.prerelease?!1:!n.prerelease&&o.prerelease?!0:n.prerelease&&o.prerelease?n.prerelease>o.prerelease:!1}async function Cl(t){let e=vl(t,"package.json");if(!kl(e))return null;let n=await _l(e,"utf8"),o=JSON.parse(n);return!o.name||!o.version?null:{name:o.name,version:o.version}}async function El(){let e=Tl(process.argv[1]??process.cwd());try{Sl(e).isFile()&&(e=Cr(e))}catch{e=process.cwd()}for(;;){let n=await Cl(e);if(n&&n.name==="@memo-code/memo")return n;let o=Cr(e);if(o===e)break;e=o}return null}async function Al(t,e=1500){let o=`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`;return new Promise(r=>{let s=bl(o,{timeout:e},i=>{if(i.statusCode&&i.statusCode>=400){i.resume(),r(null);return}let a=[];i.on("data",c=>a.push(c)),i.on("end",()=>{try{let c=JSON.parse(Buffer.concat(a).toString("utf8"));r(c.version??null)}catch{r(null)}})});s.on("timeout",()=>{s.destroy(),r(null)}),s.on("error",()=>r(null))})}async function Ar(){let t=await El();if(!t)return null;let e=await Al(t.name);return!e||!wl(e,t.version)?null:{current:t.version,latest:e}}import{Box as We,Text as de,useInput as Ml}from"ink";import{useCallback as _n,useMemo as Pl,useState as st}from"react";import{jsx as _e,jsxs as Le}from"react/jsx-runtime";var Ae=[{key:"name",label:"Provider name",hint:"Used in /model and config",defaultValue:"deepseek"},{key:"envKey",label:"API key env var",hint:"Memo reads this env var at runtime",defaultValue:"DEEPSEEK_API_KEY"},{key:"model",label:"Model name",hint:"Provider model ID",defaultValue:"deepseek-chat"},{key:"baseUrl",label:"Base URL",hint:"Leave default unless you have a custom endpoint",defaultValue:"https://api.deepseek.com"}];function Mr({configPath:t,onComplete:e,onExit:n}){let[o,r]=st(0),[s,i]=st(""),[a,c]=st({}),[l,u]=st(!1),[p,v]=st(null),m=Ae[o]??Ae[0],_=s||a[m.key]||"",y=_n(async g=>{u(!0),v(null);try{let M=g.name||Ae[0].defaultValue,x=g.envKey||Ae[1].defaultValue,E=g.model||Ae[2].defaultValue,U=g.baseUrl||Ae[3].defaultValue;await me(t,{current_provider:M,providers:[{name:M,env_api_key:x,model:E,base_url:U||void 0}]}),e()}catch(M){v(M.message),u(!1)}},[t,e]),C=_n(async()=>{let M=s.trim()||m.defaultValue,x={...a,[m.key]:M};if(c(x),i(""),o<Ae.length-1){r(o+1);return}await y(x)},[m.defaultValue,m.key,o,s,a,y]);Ml(_n((g,M)=>{if(!l){if(M.ctrl&&g==="c"){n();return}if(M.return){C();return}if(M.backspace||M.delete){i(x=>x.slice(0,-1));return}g&&i(x=>x+g)}},[C,n,l]));let P=Pl(()=>`Step ${o+1}/${Ae.length}`,[o]);return Le(We,{flexDirection:"column",children:[Le(We,{flexDirection:"column",marginBottom:1,children:[_e(de,{bold:!0,children:"Memo setup"}),_e(de,{color:"gray",children:"No provider config found. Create one to continue."}),Le(de,{color:"gray",children:["Config path: ",t]})]}),Le(We,{flexDirection:"column",marginBottom:1,children:[_e(de,{color:"cyan",children:P}),Le(de,{children:[m.label," (default: ",m.defaultValue,")"]}),m.hint?_e(de,{color:"gray",children:m.hint}):null]}),Le(We,{children:[_e(de,{children:"> "}),_e(de,{children:_})]}),_e(We,{marginTop:1,children:_e(de,{color:"gray",children:"Press Enter to continue. Ctrl+C to exit."})}),p?_e(We,{marginTop:1,children:Le(de,{color:"red",children:["Failed to write config: ",p]})}):null]})}import{jsx as Ne,jsxs as jl}from"react/jsx-runtime";var Ol=Il($l);function Dl(t){return{index:t,userInput:"",steps:[]}}function $r({sessionOptions:t,providerName:e,model:n,configPath:o,mcpServers:r,cwd:s,sessionsDir:i,providers:a,dangerous:c=!1,needsSetup:l=!1}){let{exit:u}=Ll(),[p,v]=W(e),[m,_]=W(n),[y,C]=W(a),[P,g]=W({...t,providerName:e}),[M,x]=W(null),[E,U]=W([]),[$,V]=W([]),[S,w]=W(!1),j=Lt(null),[re,J]=W([]),[H,B]=W(null),[ue,fe]=W([]),[Oe,be]=W(null),q=Lt(null),[De,D]=W(null),we=Lt(0),[F,X]=W(t.maxPromptTokens??12e4),[Ue,Ot]=W(l),[it,ce]=W(0),[Ke,at]=W(null),I=Lt(null),N=ee(()=>(we.current+=1,we.current),[]),h=ee((d,f)=>{let T=`${Date.now()}-${Math.random().toString(16).slice(2)}`,R=N();V(O=>[...O,{id:T,title:d,content:f,sequence:R}])},[N]),L=ee((d,f)=>{U(T=>{let R=[...T],O=R.findIndex(te=>te.index===d);O===-1&&(R.push(Dl(d)),O=R.length-1);let G=R[O];return G&&(R[O]=f(G)),R})},[]),k=Pr(()=>({onAssistantStep:(d,f)=>{let T=j.current;T&&L(T,R=>{let O=R.steps.slice();for(;O.length<=f;)O.push({index:O.length,assistantText:""});let G=O[f];if(!G)return R;let te={...G,assistantText:G.assistantText+d};return O[f]=te,{...R,steps:O}})},requestApproval:c?void 0:d=>new Promise(f=>{at(d),I.current=f}),hooks:{onTurnStart:({turn:d,input:f,promptTokens:T})=>{j.current=d,T&&T>0&&ce(T),L(d,R=>({...R,index:d,userInput:f,steps:[],startedAt:Date.now(),contextPromptTokens:T??R.contextPromptTokens}))},onAction:({turn:d,step:f,action:T,thinking:R,parallelActions:O})=>{L(d,G=>{let te=G.steps.slice();for(;te.length<=f;)te.push({index:te.length,assistantText:""});let ct=te[f];return ct?(te[f]={...ct,action:T,thinking:R,toolStatus:"executing",parallelActions:O&&O.length>1?O:void 0},{...G,steps:te}):G})},onObservation:({turn:d,step:f,observation:T})=>{L(d,R=>{let O=R.steps.slice();for(;O.length<=f;)O.push({index:O.length,assistantText:""});let G=O[f];return G?(O[f]={...G,observation:T,toolStatus:kr(T)},{...R,steps:O}):R})},onFinal:({turn:d,finalText:f,status:T,turnUsage:R,tokenUsage:O})=>{L(d,G=>{let te=G.startedAt??Date.now(),ct=Math.max(0,Date.now()-te),zr=O?.prompt??G.contextPromptTokens,Wr=G.sequence??N();return{...G,finalText:f,status:T,tokenUsage:R,contextPromptTokens:zr,startedAt:te,durationMs:ct,sequence:Wr}}),w(!1)}}}),[L,c,N]);It(()=>{let d=!1;return(async()=>{if(Ue)return;let f=q.current;f&&await f.close();let T=await Ye(k,P);if(d){await T.close();return}q.current=T,x(T),B(T.historyFilePath??null)})(),()=>{d=!0}},[k,P,Ue]),It(()=>{let d=!1;return(async()=>{let f=await Ar();d||!f||h("Update",`Update available: v${f.latest}. Run npm/pnpm/yarn/bun to update @memo-code/memo.`)})(),()=>{d=!0}},[h]),It(()=>()=>{q.current&&q.current.close()},[]);let A=ee(async()=>{q.current&&await q.current.close(),D("Bye!"),setTimeout(()=>{u()},300)},[u]),se=ee(()=>{U([]),V([]),fe([]),be(null),ce(0),we.current=0},[]),Me=ee(async()=>{U([]),V([]),fe([]),be(null),ce(0),we.current=0;let d=Nt(),f={...P,sessionId:d};q.current&&await q.current.close();let T=await Ye(k,f);q.current=T,x(T),B(T.historyFilePath??null),g(f),h("New Session","Started a new session with fresh context.")},[k,P,h]),Dr=ee(async d=>{if(!d.sessionFile){h("History","This entry has no context file to load.");return}try{let f=await Rl(d.sessionFile,"utf8"),T=Ul(f);fe(T.turns),be(T.messages),w(!1),U([]),x(null),B(null),ce(0),j.current=null,we.current=Math.max(we.current,T.maxSequence),g(R=>({...R,sessionId:Nt()})),h("History loaded",T.summary||d.input)}catch(f){h("Failed to load history",`Unable to read ${d.sessionFile}: ${f.message}`)}},[h]),Cn=ee(async d=>{try{let f=await ne(),T={...f.config,current_provider:d};await me(f.configPath,T)}catch(f){h("Failed to save config",`Failed to save model selection: ${f.message}`)}},[h]),Ur=ee(()=>{S&&M?.cancelCurrentTurn?.()},[S,M]),Dt=ee(async d=>{if(d.name===p&&d.model===m){h("Model switch",`Already using ${d.name} (${d.model})`);return}if(S){h("Model switch","Currently running. Press Esc Esc to cancel before switching models.");return}U([]),fe([]),be(null),ce(0),j.current=null,x(null),B(null),v(d.name),_(d.model),g(f=>({...f,sessionId:Nt(),providerName:d.name})),await Cn(d.name),h("Model switch",`Switched to ${d.name} (${d.model})`)},[h,S,m,p,Cn]),Ut=ee(async d=>{if(!d.trim()){h("Shell Command","Usage: $ <command> (e.g. $ git status)");return}w(!0);try{let{stdout:f,stderr:T}=await Ol(d,{cwd:s,maxBuffer:5242880}),R=[f?.trim(),T?.trim()].filter(Boolean).join(`
115
- `);h("Shell Result",R||"(no output)")}catch(f){let T=f,O=[T.stdout?.trim(),T.stderr?.trim(),T.message].filter(Boolean).join(`
116
- `);h("Shell Error",O||"Command failed")}finally{w(!1)}},[h,s]),En=ee(async d=>{let f=wr(d,{configPath:o,providerName:p,model:m,mcpServers:r,providers:y,contextLimit:F});if(f.kind==="exit"){await A();return}if(f.kind==="new"){await Me();return}if(f.kind==="switch_model"){await Dt(f.provider);return}if(f.kind==="set_context_limit"){X(f.limit),h("Context length",`Context limit set to ${(f.limit/1e3).toFixed(0)}k tokens`);return}if(f.kind==="init_agents_md"){h("Init","Analyzing project structure and generating AGENTS.md...");let T=`Please analyze the current project and create an AGENTS.md file at the project root.
114
+ Type /help for available commands.`}}}import{dirname as $t,join as Rr,resolve as wl}from"path";import{statSync as _l,existsSync as $r,readFileSync as Cl}from"fs";import{readFile as El}from"fs/promises";import{get as Al}from"https";import{fileURLToPath as Ml}from"url";function Pr(t){let e=t.trim().replace(/^v/i,""),[n="",o]=e.split("-",2),r=n.split(".").map(s=>Number(s));return r.length<3||r.some(s=>!Number.isFinite(s))?null:{major:r[0]??0,minor:r[1]??0,patch:r[2]??0,prerelease:o??null}}function Pl(t,e){let n=Pr(t),o=Pr(e);return!n||!o?!1:n.major!==o.major?n.major>o.major:n.minor!==o.minor?n.minor>o.minor:n.patch!==o.patch?n.patch>o.patch:n.prerelease&&!o.prerelease?!1:!n.prerelease&&o.prerelease?!0:n.prerelease&&o.prerelease?n.prerelease>o.prerelease:!1}function Ir(){try{let e=Ml(import.meta.url);return $t(e)}catch{}let t=wl(process.argv[1]??process.cwd());try{return _l(t).isFile()?$t(t):t}catch{return process.cwd()}}async function Rl(t){let e=Rr(t,"package.json");if(!$r(e))return null;let n=await El(e,"utf8"),o=JSON.parse(n);return!o.name||!o.version?null:{name:o.name,version:o.version}}function $l(t){let e=Rr(t,"package.json");if(!$r(e))return null;try{let n=Cl(e,"utf8"),o=JSON.parse(n);return!o.name||!o.version?null:{name:o.name,version:o.version}}catch{return null}}async function Il(){let t=Ir();for(;;){let e=await Rl(t);if(e&&e.name==="@memo-code/memo")return e;let n=$t(t);if(n===t)break;t=n}return null}function It(){let t=Ir();for(;;){let e=$l(t);if(e&&e.name==="@memo-code/memo")return e;let n=$t(t);if(n===t)break;t=n}return null}async function Ll(t,e=1500){let o=`https://registry.npmjs.org/${encodeURIComponent(t)}/latest`;return new Promise(r=>{let s=Al(o,{timeout:e},i=>{if(i.statusCode&&i.statusCode>=400){i.resume(),r(null);return}let a=[];i.on("data",c=>a.push(c)),i.on("end",()=>{try{let c=JSON.parse(Buffer.concat(a).toString("utf8"));r(c.version??null)}catch{r(null)}})});s.on("timeout",()=>{s.destroy(),r(null)}),s.on("error",()=>r(null))})}async function Lr(){let t=await Il();if(!t)return null;let e=await Ll(t.name);return!e||!Pl(e,t.version)?null:{current:t.version,latest:e}}import{Box as We,Text as ge,useInput as Nl}from"ink";import{useCallback as _n,useMemo as Ol,useState as st}from"react";import{jsx as be,jsxs as Le}from"react/jsx-runtime";var Ae=[{key:"name",label:"Provider name",hint:"Used in /model and config",defaultValue:"deepseek"},{key:"envKey",label:"API key env var",hint:"Memo reads this env var at runtime",defaultValue:"DEEPSEEK_API_KEY"},{key:"model",label:"Model name",hint:"Provider model ID",defaultValue:"deepseek-chat"},{key:"baseUrl",label:"Base URL",hint:"Leave default unless you have a custom endpoint",defaultValue:"https://api.deepseek.com"}];function Nr({configPath:t,onComplete:e,onExit:n}){let[o,r]=st(0),[s,i]=st(""),[a,c]=st({}),[l,u]=st(!1),[p,v]=st(null),m=Ae[o]??Ae[0],b=s||a[m.key]||"",h=_n(async g=>{u(!0),v(null);try{let A=g.name||Ae[0].defaultValue,y=g.envKey||Ae[1].defaultValue,E=g.model||Ae[2].defaultValue,U=g.baseUrl||Ae[3].defaultValue;await de(t,{current_provider:A,providers:[{name:A,env_api_key:y,model:E,base_url:U||void 0}]}),e()}catch(A){v(A.message),u(!1)}},[t,e]),C=_n(async()=>{let A=s.trim()||m.defaultValue,y={...a,[m.key]:A};if(c(y),i(""),o<Ae.length-1){r(o+1);return}await h(y)},[m.defaultValue,m.key,o,s,a,h]);Nl(_n((g,A)=>{if(!l){if(A.ctrl&&g==="c"){n();return}if(A.return){C();return}if(A.backspace||A.delete){i(y=>y.slice(0,-1));return}g&&i(y=>y+g)}},[C,n,l]));let P=Ol(()=>`Step ${o+1}/${Ae.length}`,[o]);return Le(We,{flexDirection:"column",children:[Le(We,{flexDirection:"column",marginBottom:1,children:[be(ge,{bold:!0,children:"Memo setup"}),be(ge,{color:"gray",children:"No provider config found. Create one to continue."}),Le(ge,{color:"gray",children:["Config path: ",t]})]}),Le(We,{flexDirection:"column",marginBottom:1,children:[be(ge,{color:"cyan",children:P}),Le(ge,{children:[m.label," (default: ",m.defaultValue,")"]}),m.hint?be(ge,{color:"gray",children:m.hint}):null]}),Le(We,{children:[be(ge,{children:"> "}),be(ge,{children:b})]}),be(We,{marginTop:1,children:be(ge,{color:"gray",children:"Press Enter to continue. Ctrl+C to exit."})}),p?be(We,{marginTop:1,children:Le(ge,{color:"red",children:["Failed to write config: ",p]})}):null]})}import{jsx as Ne,jsxs as zl}from"react/jsx-runtime";var Fl=jl(Ul);function Vl(t){return{index:t,userInput:"",steps:[]}}function Dr({sessionOptions:t,providerName:e,model:n,configPath:o,mcpServers:r,cwd:s,sessionsDir:i,providers:a,dangerous:c=!1,needsSetup:l=!1}){let{exit:u}=Hl(),[p,v]=W(e),[m,b]=W(n),[h,C]=W(a),[P,g]=W({...t,providerName:e}),[A,y]=W(null),[E,U]=W([]),[I,V]=W([]),[k,_]=W(!1),j=Nt(null),[ie,X]=W([]),[H,B]=W(null),[pe,he]=W([]),[Oe,we]=W(null),Y=Nt(null),[De,D]=W(null),_e=Nt(0),[F,Z]=W(t.maxPromptTokens??12e4),[Ue,Dt]=W(l),[it,le]=W(0),Ut=Cn(()=>It(),[]),[Ke,L]=W(null),N=Nt(null),R=te(()=>(_e.current+=1,_e.current),[]),x=te((d,f)=>{let S=`${Date.now()}-${Math.random().toString(16).slice(2)}`,$=R();V(O=>[...O,{id:S,title:d,content:f,sequence:$}])},[R]),T=te((d,f)=>{U(S=>{let $=[...S],O=$.findIndex(ne=>ne.index===d);O===-1&&($.push(Vl(d)),O=$.length-1);let G=$[O];return G&&($[O]=f(G)),$})},[]),M=Cn(()=>({onAssistantStep:(d,f)=>{let S=j.current;S&&T(S,$=>{let O=$.steps.slice();for(;O.length<=f;)O.push({index:O.length,assistantText:""});let G=O[f];if(!G)return $;let ne={...G,assistantText:G.assistantText+d};return O[f]=ne,{...$,steps:O}})},requestApproval:c?void 0:d=>new Promise(f=>{L(d),N.current=f}),hooks:{onTurnStart:({turn:d,input:f,promptTokens:S})=>{j.current=d,S&&S>0&&le(S),T(d,$=>({...$,index:d,userInput:f,steps:[],startedAt:Date.now(),contextPromptTokens:S??$.contextPromptTokens}))},onAction:({turn:d,step:f,action:S,thinking:$,parallelActions:O})=>{T(d,G=>{let ne=G.steps.slice();for(;ne.length<=f;)ne.push({index:ne.length,assistantText:""});let at=ne[f];return at?(ne[f]={...at,action:S,thinking:$,toolStatus:"executing",parallelActions:O&&O.length>1?O:void 0},{...G,steps:ne}):G})},onObservation:({turn:d,step:f,observation:S})=>{T(d,$=>{let O=$.steps.slice();for(;O.length<=f;)O.push({index:O.length,assistantText:""});let G=O[f];return G?(O[f]={...G,observation:S,toolStatus:Cr(S)},{...$,steps:O}):$})},onFinal:({turn:d,finalText:f,status:S,turnUsage:$,tokenUsage:O})=>{T(d,G=>{let ne=G.startedAt??Date.now(),at=Math.max(0,Date.now()-ne),Xr=O?.prompt??G.contextPromptTokens,Yr=G.sequence??R();return{...G,finalText:f,status:S,tokenUsage:$,contextPromptTokens:Xr,startedAt:ne,durationMs:at,sequence:Yr}}),_(!1)}}}),[T,c,R]);Lt(()=>{let d=!1;return(async()=>{if(Ue)return;let f=Y.current;f&&await f.close();let S=await Ye(M,P);if(d){await S.close();return}Y.current=S,y(S),B(S.historyFilePath??null)})(),()=>{d=!0}},[M,P,Ue]),Lt(()=>{let d=!1;return(async()=>{let f=await Lr();d||!f||x("Update",`Update available: v${f.latest}. Run npm/pnpm/yarn/bun to update @memo-code/memo.`)})(),()=>{d=!0}},[x]),Lt(()=>()=>{Y.current&&Y.current.close()},[]);let K=te(async()=>{Y.current&&await Y.current.close(),D("Bye!"),setTimeout(()=>{u()},300)},[u]),Me=te(()=>{U([]),V([]),he([]),we(null),le(0),_e.current=0},[]),Mn=te(async()=>{U([]),V([]),he([]),we(null),le(0),_e.current=0;let d=Ot(),f={...P,sessionId:d};Y.current&&await Y.current.close();let S=await Ye(M,f);Y.current=S,y(S),B(S.historyFilePath??null),g(f),x("New Session","Started a new session with fresh context.")},[M,P,x]),Fr=te(async d=>{if(!d.sessionFile){x("History","This entry has no context file to load.");return}try{let f=await Dl(d.sessionFile,"utf8"),S=Gl(f);he(S.turns),we(S.messages),_(!1),U([]),y(null),B(null),le(0),j.current=null,_e.current=Math.max(_e.current,S.maxSequence),g($=>({...$,sessionId:Ot()})),x("History loaded",S.summary||d.input)}catch(f){x("Failed to load history",`Unable to read ${d.sessionFile}: ${f.message}`)}},[x]),Pn=te(async d=>{try{let f=await oe(),S={...f.config,current_provider:d};await de(f.configPath,S)}catch(f){x("Failed to save config",`Failed to save model selection: ${f.message}`)}},[x]),Vr=te(()=>{k&&A?.cancelCurrentTurn?.()},[k,A]),jt=te(async d=>{if(d.name===p&&d.model===m){x("Model switch",`Already using ${d.name} (${d.model})`);return}if(k){x("Model switch","Currently running. Press Esc Esc to cancel before switching models.");return}U([]),he([]),we(null),le(0),j.current=null,y(null),B(null),v(d.name),b(d.model),g(f=>({...f,sessionId:Ot(),providerName:d.name})),await Pn(d.name),x("Model switch",`Switched to ${d.name} (${d.model})`)},[x,k,m,p,Pn]),Ht=te(async d=>{if(!d.trim()){x("Shell Command","Usage: $ <command> (e.g. $ git status)");return}_(!0);try{let{stdout:f,stderr:S}=await Fl(d,{cwd:s,maxBuffer:5242880}),$=[f?.trim(),S?.trim()].filter(Boolean).join(`
115
+ `);x("Shell Result",$||"(no output)")}catch(f){let S=f,O=[S.stdout?.trim(),S.stderr?.trim(),S.message].filter(Boolean).join(`
116
+ `);x("Shell Error",O||"Command failed")}finally{_(!1)}},[x,s]),Rn=te(async d=>{let f=Mr(d,{configPath:o,providerName:p,model:m,mcpServers:r,providers:h,contextLimit:F});if(f.kind==="exit"){await K();return}if(f.kind==="new"){await Mn();return}if(f.kind==="switch_model"){await jt(f.provider);return}if(f.kind==="set_context_limit"){Z(f.limit),x("Context length",`Context limit set to ${(f.limit/1e3).toFixed(0)}k tokens`);return}if(f.kind==="init_agents_md"){x("Init","Analyzing project structure and generating AGENTS.md...");let S=`Please analyze the current project and create an AGENTS.md file at the project root.
117
117
 
118
118
  The AGENTS.md should include:
119
119
  1. Project name and brief description
@@ -129,10 +129,10 @@ Steps:
129
129
  3. Understand the tech stack and conventions
130
130
  4. Create the AGENTS.md file using the write tool
131
131
 
132
- Make the AGENTS.md concise but informative, following best practices for AI agent guidelines.`;if(J(R=>[...R,"/init"]),!M){h("Error","Session not initialized");return}w(!0);try{await M.runTurn(T)}catch{w(!1)}return}if(f.kind==="shell_command"){await Ut(f.command);return}h(f.title,f.content)},[h,o,se,A,Dt,r,m,p,F,y,Ut]),jr=ee(async()=>{try{let d=await ne(),f=Re(d.config);C(d.config.providers),v(f.name),_(f.model),g(T=>({...T,sessionId:Nt(),providerName:f.name})),Ot(!1),h("Setup",`Config saved to ${d.configPath}`)}catch(d){h("Setup",`Failed to reload config: ${d.message}`)}},[h]);It(()=>{if(!M||!Oe?.length)return;let d=M.history[0];d&&(M.history.splice(0,M.history.length,d,...Oe),be(null))},[Oe,M]);let Hr=ee(async d=>{if(d.trim().toLowerCase()==="exit"){await A();return}if(!M||S)return;let f=d.trim();if(f.startsWith("$")){let T=f.slice(1).trim();J(R=>[...R,d]),await Ut(T);return}if(d.startsWith("/")){await En(d);return}J(T=>[...T,d]),w(!0);try{await M.runTurn(d)}catch{w(!1)}},[S,En,A,M]),Br=E[E.length-1],eu=br(Br?.tokenUsage),Fr=_r(it,F),Vr=Pr(()=>[...ue,...E],[ue,E]),Gr=ee(d=>{let f=I.current;f&&(f(d),I.current=null),at(null)},[]);if(De){let d=De.split(`
133
- `);return Ne(Rr,{flexDirection:"column",children:d.map((f,T)=>Ne(Nl,{color:"green",children:f},T))})}return Ue?Ne(Mr,{configPath:o,onComplete:jr,onExit:A}):jl(Rr,{flexDirection:"column",children:[Ne(Ko,{systemMessages:$,turns:Vr,headerInfo:{providerName:p,model:m,cwd:s,sessionId:P.sessionId??"unknown",mcpNames:Object.keys(r??{}).sort()}}),Ne(vr,{disabled:!M||S||!!Ke,onSubmit:Hr,onExit:A,onClear:se,onNewSession:Me,onCancelRun:Ur,onHistorySelect:Dr,onModelSelect:Dt,onSystemMessage:h,onSetContextLimit:d=>{X(d),h("Context length",`Context limit set to ${(d/1e3).toFixed(0)}k tokens`)},history:re,cwd:s,sessionsDir:i,currentSessionFile:H??void 0,providers:y,configPath:o,providerName:p,model:m,contextLimit:F,mcpServers:r}),Ke&&Ne(Tr,{request:Ke,onDecision:Gr}),Ne(No,{contextPercent:Fr})]})}function Ul(t){let e=[],n=[],o=[],r=t.split(`
134
- `).map(c=>c.trim()).filter(Boolean),s=null,i=0,a=0;for(let c of r){let l;try{l=JSON.parse(c)}catch{continue}if(!(!l||typeof l!="object")){if(l.type==="turn_start"){let u=typeof l.content=="string"?l.content:"";s={index:-(i+1),userInput:u,steps:[],status:"ok",sequence:a+=1},n.push(s),u&&(e.push({role:"user",content:u}),o.push(`User: ${u}`)),i+=1;continue}if(l.type==="assistant"){let u=typeof l.content=="string"?l.content:"";if(u&&(e.push({role:"assistant",content:u}),o.push(`Assistant: ${u}`),s)){let p={index:s.steps.length,assistantText:u};s.steps=[...s.steps,p],s.finalText=u}continue}if(l.type==="action"&&s){let u=l.meta;if(u&&typeof u=="object"){let p=typeof u.tool=="string"?u.tool:"",v=u.input,m=typeof u.thinking=="string"?u.thinking:"",y=(Array.isArray(u.toolBlocks)?u.toolBlocks:[]).map(P=>{let g=typeof P?.name=="string"?P.name:"";return g?{tool:g,input:P?.input}:null}).filter(Boolean),C=s.steps[s.steps.length-1];C&&(y.length>1?(C.action=y[0],C.parallelActions=y):p&&(C.action={tool:p,input:v}),m&&(C.thinking=m))}continue}if(l.type==="observation"&&s){let u=typeof l.content=="string"?l.content:"",p=s.steps[s.steps.length-1];p&&(p.observation=u);continue}}}return{summary:o.join(`
135
- `),messages:e,turns:n,maxSequence:a}}var Hl=`
132
+ Make the AGENTS.md concise but informative, following best practices for AI agent guidelines.`;if(X($=>[...$,"/init"]),!A){x("Error","Session not initialized");return}_(!0);try{await A.runTurn(S)}catch{_(!1)}return}if(f.kind==="shell_command"){await Ht(f.command);return}x(f.title,f.content)},[x,o,Me,K,jt,r,m,p,F,h,Ht]),Gr=te(async()=>{try{let d=await oe(),f=Re(d.config);C(d.config.providers),v(f.name),b(f.model),g(S=>({...S,sessionId:Ot(),providerName:f.name})),Dt(!1),x("Setup",`Config saved to ${d.configPath}`)}catch(d){x("Setup",`Failed to reload config: ${d.message}`)}},[x]);Lt(()=>{if(!A||!Oe?.length)return;let d=A.history[0];d&&(A.history.splice(0,A.history.length,d,...Oe),we(null))},[Oe,A]);let zr=te(async d=>{if(d.trim().toLowerCase()==="exit"){await K();return}if(!A||k)return;let f=d.trim();if(f.startsWith("$")){let S=f.slice(1).trim();X($=>[...$,d]),await Ht(S);return}if(d.startsWith("/")){await Rn(d);return}X(S=>[...S,d]),_(!0);try{await A.runTurn(d)}catch{_(!1)}},[k,Rn,K,A]),Wr=E[E.length-1],iu=Ar(Wr?.tokenUsage),Kr=Er(it,F),Jr=Cn(()=>[...pe,...E],[pe,E]),qr=te(d=>{let f=N.current;f&&(f(d),N.current=null),L(null)},[]);if(De){let d=De.split(`
133
+ `);return Ne(Or,{flexDirection:"column",children:d.map((f,S)=>Ne(Bl,{color:"green",children:f},S))})}return Ue?Ne(Nr,{configPath:o,onComplete:Gr,onExit:K}):zl(Or,{flexDirection:"column",children:[Ne(Yo,{systemMessages:I,turns:Jr,headerInfo:{providerName:p,model:m,cwd:s,sessionId:P.sessionId??"unknown",mcpNames:Object.keys(r??{}).sort(),version:Ut?.version??"unknown"}}),Ne(br,{disabled:!A||k||!!Ke,onSubmit:zr,onExit:K,onClear:Me,onNewSession:Mn,onCancelRun:Vr,onHistorySelect:Fr,onModelSelect:jt,onSystemMessage:x,onSetContextLimit:d=>{Z(d),x("Context length",`Context limit set to ${(d/1e3).toFixed(0)}k tokens`)},history:ie,cwd:s,sessionsDir:i,currentSessionFile:H??void 0,providers:h,configPath:o,providerName:p,model:m,contextLimit:F,mcpServers:r}),Ke&&Ne(wr,{request:Ke,onDecision:qr}),Ne(jo,{contextPercent:Kr})]})}function Gl(t){let e=[],n=[],o=[],r=t.split(`
134
+ `).map(c=>c.trim()).filter(Boolean),s=null,i=0,a=0;for(let c of r){let l;try{l=JSON.parse(c)}catch{continue}if(!(!l||typeof l!="object")){if(l.type==="turn_start"){let u=typeof l.content=="string"?l.content:"";s={index:-(i+1),userInput:u,steps:[],status:"ok",sequence:a+=1},n.push(s),u&&(e.push({role:"user",content:u}),o.push(`User: ${u}`)),i+=1;continue}if(l.type==="assistant"){let u=typeof l.content=="string"?l.content:"";if(u&&(e.push({role:"assistant",content:u}),o.push(`Assistant: ${u}`),s)){let p={index:s.steps.length,assistantText:u};s.steps=[...s.steps,p],s.finalText=u}continue}if(l.type==="action"&&s){let u=l.meta;if(u&&typeof u=="object"){let p=typeof u.tool=="string"?u.tool:"",v=u.input,m=typeof u.thinking=="string"?u.thinking:"",h=(Array.isArray(u.toolBlocks)?u.toolBlocks:[]).map(P=>{let g=typeof P?.name=="string"?P.name:"";return g?{tool:g,input:P?.input}:null}).filter(Boolean),C=s.steps[s.steps.length-1];C&&(h.length>1?(C.action=h[0],C.parallelActions=h):p&&(C.action={tool:p,input:v}),m&&(C.thinking=m))}continue}if(l.type==="observation"&&s){let u=typeof l.content=="string"?l.content:"",p=s.steps[s.steps.length-1];p&&(p.observation=u);continue}}}return{summary:o.join(`
135
+ `),messages:e,turns:n,maxSequence:a}}var Wl=`
136
136
  Usage:
137
137
  memo mcp list [--json]
138
138
  memo mcp get <name> [--json]
@@ -141,14 +141,14 @@ Usage:
141
141
  memo mcp remove <name>
142
142
  memo mcp login <name> [--scopes scope1,scope2]
143
143
  memo mcp logout <name>
144
- `;function bn(){console.log(Hl.trim())}function Bl(t){let e=t.indexOf("=");if(e<=0)return null;let n=t.slice(0,e).trim(),o=t.slice(e+1);return n?{key:n,value:o}:null}function Ir(t,e){let n=[];if(n.push(`${t}`),"url"in e){n.push(` type: ${e.type??"streamable_http"}`),n.push(` url: ${e.url}`),e.bearer_token_env_var&&n.push(` bearer_token_env_var: ${e.bearer_token_env_var}`);let o=e.http_headers??e.headers;o&&Object.keys(o).length>0&&n.push(` headers: ${Object.entries(o).map(([r,s])=>`${r}=${s}`).join(", ")}`)}else n.push(` type: ${e.type??"stdio"}`),n.push(` command: ${e.command}`),e.args&&e.args.length>0&&n.push(` args: ${e.args.join(" ")}`),e.env&&Object.keys(e.env).length>0&&n.push(` env: ${Object.entries(e.env).map(([o,r])=>`${o}=${r}`).join(", ")}`);return n.join(`
145
- `)}function Fl(t){let e=t.shift();if(!e)return{error:"Missing server name."};let n,o,r={},s=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a){if(a==="--"){s=t.slice(i+1);break}if(a==="--url"){let c=t[i+1];if(!c)return{error:"Missing value for --url."};n=c,i+=1;continue}if(a==="--bearer-token-env-var"){let c=t[i+1];if(!c)return{error:"Missing value for --bearer-token-env-var."};o=c,i+=1;continue}if(a==="--env"){let c=t[i+1];if(!c)return{error:"Missing value for --env (KEY=VALUE)."};let l=Bl(c);if(!l)return{error:"Invalid --env format. Use KEY=VALUE."};r[l.key]=l.value,i+=1;continue}return a==="--help"||a==="-h"?{error:""}:{error:`Unknown option: ${a}`}}}return n?s.length>0?{error:"Use either --url or a stdio command, not both."}:Object.keys(r).length>0?{error:"--env is only supported with stdio servers."}:{options:{name:e,url:n,bearerTokenEnvVar:o}}:o?{error:"--bearer-token-env-var is only supported with HTTP servers."}:s.length===0?{error:"Missing stdio command. Use `-- <command...>`."}:{options:{name:e,command:s[0],args:s.slice(1),env:Object.keys(r).length>0?r:void 0}}}function Vl(t){let[e,...n]=t;return!e||e==="--help"||e==="-h"||e==="help"?{command:"help",rest:[]}:{command:e,rest:n}}function wn(t,e=[]){let n=new Set(e);for(let o=0;o<t.length;o+=1){let r=t[o];if(r){if(r.startsWith("--")){n.has(r)&&(o+=1);continue}return r}}return null}async function Lr(t){let{command:e,rest:n}=Vl(t);if(e==="help"){bn();return}if(e==="list"){let o=n.includes("--json"),s=(await ne()).config.mcp_servers??{};if(o){console.log(JSON.stringify(s,null,2));return}let i=Object.keys(s);if(i.length===0){console.log('No MCP servers configured. Add one with "memo mcp add".');return}console.log(`MCP servers (${i.length}):`);for(let a of i){let c=s[a];c&&console.log(Ir(a,c))}return}if(e==="get"){let o=n.includes("--json"),r=wn(n);if(!r){console.error("Missing server name."),process.exitCode=1;return}let i=(await ne()).config.mcp_servers?.[r];if(!i){console.error(`Unknown MCP server "${r}".`),process.exitCode=1;return}if(o){console.log(JSON.stringify(i,null,2));return}console.log(Ir(r,i));return}if(e==="add"){let o=Fl(n);if(o.error!==void 0){o.error&&(console.error(o.error),process.exitCode=1),bn();return}let r=o.options;if(!r)return;if(r.url)try{new URL(r.url)}catch{console.error("Invalid URL."),process.exitCode=1;return}let s=await ne(),i={...s.config.mcp_servers??{}};if(i[r.name]){console.error(`MCP server "${r.name}" already exists.`),process.exitCode=1;return}let a;r.url?a={type:"streamable_http",url:r.url,...r.bearerTokenEnvVar?{bearer_token_env_var:r.bearerTokenEnvVar}:{}}:a={command:r.command,args:r.args&&r.args.length>0?r.args:void 0,env:r.env},i[r.name]=a,await me(s.configPath,{...s.config,mcp_servers:i}),console.log(`Added MCP server "${r.name}".`);return}if(e==="remove"){let o=wn(n);if(!o){console.error("Missing server name."),process.exitCode=1;return}let r=await ne(),s={...r.config.mcp_servers??{}};if(!s[o]){console.error(`Unknown MCP server "${o}".`),process.exitCode=1;return}delete s[o],await me(r.configPath,{...r.config,mcp_servers:s}),console.log(`Removed MCP server "${o}".`);return}if(e==="login"||e==="logout"){let o=wn(n,["--scopes"]);if(!o){console.error("Missing server name."),process.exitCode=1;return}let s=(await ne()).config.mcp_servers?.[o];if(!s){console.error(`Unknown MCP server "${o}".`),process.exitCode=1;return}if(!("url"in s)){console.error("OAuth login/logout only applies to streamable HTTP servers."),process.exitCode=1;return}console.error("OAuth login/logout is not supported in memo yet. Configure a bearer token env var instead."),process.exitCode=1;return}console.error(`Unknown subcommand: ${e}`),bn(),process.exitCode=1}import{jsx as Ql}from"react/jsx-runtime";function Jl(t){let e={once:!1,dangerous:!1},n=[];for(let o=0;o<t.length;o++){let r=t[o];if(r!==void 0){if(r==="--once"){e.once=!0;continue}if(r==="--dangerous"||r==="-d"){e.dangerous=!0;continue}n.push(r)}}return{question:n.join(" "),options:e}}async function Or(t){let e=await ne();if(!e.needsSetup)return e;let n=e.config.providers[0],r=[n?.env_api_key,"OPENAI_API_KEY","DEEPSEEK_API_KEY"].filter(Boolean).some(a=>!!process.env[a]);if(n&&r)return await me(e.configPath,e.config),console.log(`Detected API key in env. Wrote default provider (${n.name}) to ${e.configPath}`),{...e,needsSetup:!1};if(t==="tui")return e;let s=Gl({input:zl,output:Wl}),i=async(a,c)=>(await s.question(a)).trim()||c;try{console.log("No provider config found. Please answer the prompts:");let a=await i("Provider name [deepseek]: ","deepseek"),c=await i("API key env var [DEEPSEEK_API_KEY]: ","DEEPSEEK_API_KEY"),l=await i("Model name [deepseek-chat]: ","deepseek-chat"),u=await i("Base URL [https://api.deepseek.com]: ","https://api.deepseek.com"),p={current_provider:a,providers:[{name:a,env_api_key:c,model:l,base_url:u||void 0}]};return await me(e.configPath,p),console.log(`Config written to ${e.configPath}
146
- `),{...e,config:p,needsSetup:!1}}finally{s.close()}}async function ql(t){let e=await Or("plain"),n=Re(e.config),r={sessionId:Nr(),mode:"once",stream:e.config.stream_output??!1};t.options.dangerous&&console.log("\u26A0\uFE0F DANGEROUS MODE: All tool approvals are bypassed!");let s={onAssistantStep:c=>{process.stdout.write(c)},requestApproval:t.options.dangerous?void 0:c=>(console.log(`
144
+ `;function En(){console.log(Wl.trim())}function Kl(t){let e=t.indexOf("=");if(e<=0)return null;let n=t.slice(0,e).trim(),o=t.slice(e+1);return n?{key:n,value:o}:null}function Ur(t,e){let n=[];if(n.push(`${t}`),"url"in e){n.push(` type: ${e.type??"streamable_http"}`),n.push(` url: ${e.url}`),e.bearer_token_env_var&&n.push(` bearer_token_env_var: ${e.bearer_token_env_var}`);let o=e.http_headers??e.headers;o&&Object.keys(o).length>0&&n.push(` headers: ${Object.entries(o).map(([r,s])=>`${r}=${s}`).join(", ")}`)}else n.push(` type: ${e.type??"stdio"}`),n.push(` command: ${e.command}`),e.args&&e.args.length>0&&n.push(` args: ${e.args.join(" ")}`),e.env&&Object.keys(e.env).length>0&&n.push(` env: ${Object.entries(e.env).map(([o,r])=>`${o}=${r}`).join(", ")}`);return n.join(`
145
+ `)}function Jl(t){let e=t.shift();if(!e)return{error:"Missing server name."};let n,o,r={},s=[];for(let i=0;i<t.length;i+=1){let a=t[i];if(a){if(a==="--"){s=t.slice(i+1);break}if(a==="--url"){let c=t[i+1];if(!c)return{error:"Missing value for --url."};n=c,i+=1;continue}if(a==="--bearer-token-env-var"){let c=t[i+1];if(!c)return{error:"Missing value for --bearer-token-env-var."};o=c,i+=1;continue}if(a==="--env"){let c=t[i+1];if(!c)return{error:"Missing value for --env (KEY=VALUE)."};let l=Kl(c);if(!l)return{error:"Invalid --env format. Use KEY=VALUE."};r[l.key]=l.value,i+=1;continue}return a==="--help"||a==="-h"?{error:""}:{error:`Unknown option: ${a}`}}}return n?s.length>0?{error:"Use either --url or a stdio command, not both."}:Object.keys(r).length>0?{error:"--env is only supported with stdio servers."}:{options:{name:e,url:n,bearerTokenEnvVar:o}}:o?{error:"--bearer-token-env-var is only supported with HTTP servers."}:s.length===0?{error:"Missing stdio command. Use `-- <command...>`."}:{options:{name:e,command:s[0],args:s.slice(1),env:Object.keys(r).length>0?r:void 0}}}function ql(t){let[e,...n]=t;return!e||e==="--help"||e==="-h"||e==="help"?{command:"help",rest:[]}:{command:e,rest:n}}function An(t,e=[]){let n=new Set(e);for(let o=0;o<t.length;o+=1){let r=t[o];if(r){if(r.startsWith("--")){n.has(r)&&(o+=1);continue}return r}}return null}async function jr(t){let{command:e,rest:n}=ql(t);if(e==="help"){En();return}if(e==="list"){let o=n.includes("--json"),s=(await oe()).config.mcp_servers??{};if(o){console.log(JSON.stringify(s,null,2));return}let i=Object.keys(s);if(i.length===0){console.log('No MCP servers configured. Add one with "memo mcp add".');return}console.log(`MCP servers (${i.length}):`);for(let a of i){let c=s[a];c&&console.log(Ur(a,c))}return}if(e==="get"){let o=n.includes("--json"),r=An(n);if(!r){console.error("Missing server name."),process.exitCode=1;return}let i=(await oe()).config.mcp_servers?.[r];if(!i){console.error(`Unknown MCP server "${r}".`),process.exitCode=1;return}if(o){console.log(JSON.stringify(i,null,2));return}console.log(Ur(r,i));return}if(e==="add"){let o=Jl(n);if(o.error!==void 0){o.error&&(console.error(o.error),process.exitCode=1),En();return}let r=o.options;if(!r)return;if(r.url)try{new URL(r.url)}catch{console.error("Invalid URL."),process.exitCode=1;return}let s=await oe(),i={...s.config.mcp_servers??{}};if(i[r.name]){console.error(`MCP server "${r.name}" already exists.`),process.exitCode=1;return}let a;r.url?a={type:"streamable_http",url:r.url,...r.bearerTokenEnvVar?{bearer_token_env_var:r.bearerTokenEnvVar}:{}}:a={command:r.command,args:r.args&&r.args.length>0?r.args:void 0,env:r.env},i[r.name]=a,await de(s.configPath,{...s.config,mcp_servers:i}),console.log(`Added MCP server "${r.name}".`);return}if(e==="remove"){let o=An(n);if(!o){console.error("Missing server name."),process.exitCode=1;return}let r=await oe(),s={...r.config.mcp_servers??{}};if(!s[o]){console.error(`Unknown MCP server "${o}".`),process.exitCode=1;return}delete s[o],await de(r.configPath,{...r.config,mcp_servers:s}),console.log(`Removed MCP server "${o}".`);return}if(e==="login"||e==="logout"){let o=An(n,["--scopes"]);if(!o){console.error("Missing server name."),process.exitCode=1;return}let s=(await oe()).config.mcp_servers?.[o];if(!s){console.error(`Unknown MCP server "${o}".`),process.exitCode=1;return}if(!("url"in s)){console.error("OAuth login/logout only applies to streamable HTTP servers."),process.exitCode=1;return}console.error("OAuth login/logout is not supported in memo yet. Configure a bearer token env var instead."),process.exitCode=1;return}console.error(`Unknown subcommand: ${e}`),En(),process.exitCode=1}import{jsx as su}from"react/jsx-runtime";function eu(t){let e={once:!1,dangerous:!1,showVersion:!1},n=[];for(let o=0;o<t.length;o++){let r=t[o];if(r!==void 0){if(r==="--version"||r==="-v"){e.showVersion=!0;continue}if(r==="--once"){e.once=!0;continue}if(r==="--dangerous"||r==="-d"){e.dangerous=!0;continue}n.push(r)}}return{question:n.join(" "),options:e}}async function Br(t){let e=await oe();if(!e.needsSetup)return e;let n=e.config.providers[0],r=[n?.env_api_key,"OPENAI_API_KEY","DEEPSEEK_API_KEY"].filter(Boolean).some(a=>!!process.env[a]);if(n&&r)return await de(e.configPath,e.config),console.log(`Detected API key in env. Wrote default provider (${n.name}) to ${e.configPath}`),{...e,needsSetup:!1};if(t==="tui")return e;let s=Xl({input:Yl,output:Zl}),i=async(a,c)=>(await s.question(a)).trim()||c;try{console.log("No provider config found. Please answer the prompts:");let a=await i("Provider name [deepseek]: ","deepseek"),c=await i("API key env var [DEEPSEEK_API_KEY]: ","DEEPSEEK_API_KEY"),l=await i("Model name [deepseek-chat]: ","deepseek-chat"),u=await i("Base URL [https://api.deepseek.com]: ","https://api.deepseek.com"),p={current_provider:a,providers:[{name:a,env_api_key:c,model:l,base_url:u||void 0}]};return await de(e.configPath,p),console.log(`Config written to ${e.configPath}
146
+ `),{...e,config:p,needsSetup:!1}}finally{s.close()}}async function tu(t){let e=await Br("plain"),n=Re(e.config),r={sessionId:Hr(),mode:"once",stream:e.config.stream_output??!1};t.options.dangerous&&console.log("\u26A0\uFE0F DANGEROUS MODE: All tool approvals are bypassed!");let s={onAssistantStep:c=>{process.stdout.write(c)},requestApproval:t.options.dangerous?void 0:c=>(console.log(`
147
147
  [approval required] ${c.toolName}: ${c.reason}`),console.log("[approval] Run with --dangerous to bypass approval"),Promise.resolve("deny")),hooks:{onAction:({action:c})=>{console.log(`
148
- [tool] ${c.tool}`),c.input!==void 0&&console.log(`[input] ${JSON.stringify(c.input)}`)},onObservation:()=>{}}},i=await Ye(s,r),a=t.question;if(!a&&!process.stdin.isTTY&&(a=await Zl()),!a&&t.options.once&&(a="Give me a quick self-introduction."),!a){console.error("No input provided. Pass a question or use stdin."),await i.close();return}try{console.log(`User: ${a}
148
+ [tool] ${c.tool}`),c.input!==void 0&&console.log(`[input] ${JSON.stringify(c.input)}`)},onObservation:()=>{}}},i=await Ye(s,r),a=t.question;if(!a&&!process.stdin.isTTY&&(a=await ru()),!a&&t.options.once&&(a="Give me a quick self-introduction."),!a){console.error("No input provided. Pass a question or use stdin."),await i.close();return}try{console.log(`User: ${a}
149
149
  `);let c=await i.runTurn(a);e.config.stream_output||console.log(`
150
150
  ${c.finalText}`),console.log(`
151
151
  [tokens] prompt=${c.tokenUsage.prompt} completion=${c.tokenUsage.completion} total=${c.tokenUsage.total}`),console.log(`
152
- provider=${n.name} model=${n.model}`)}catch(c){console.error(`Run failed: ${c.message}`)}finally{await i.close()}}async function Xl(t){let e=await Or("tui"),n=Re(e.config),r={sessionId:Nr(),mode:"interactive",stream:e.config.stream_output??!1},s=ht(e,r);t.options.dangerous&&(console.log("\u26A0\uFE0F DANGEROUS MODE: All tool approvals are bypassed!"),console.log(` Use with caution.
153
- `)),await Kl(Ql($r,{sessionOptions:r,providerName:n.name,model:n.model,configPath:e.configPath,mcpServers:e.config.mcp_servers??{},cwd:process.cwd(),sessionsDir:s,providers:e.config.providers,dangerous:t.options.dangerous,needsSetup:e.needsSetup}),{exitOnCtrlC:!1,patchConsole:!1}).waitUntilExit()}async function Yl(){let t=process.argv.slice(2);if(t[0]==="mcp"||t[0]==="--"&&t[1]==="mcp"){let o=t[0]==="--"?2:1;await Lr(t.slice(o));return}let e=Jl(t);if(!(process.stdin.isTTY&&process.stdout.isTTY)||e.options.once){await ql(e);return}await Xl(e)}Yl();async function Zl(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{e+=n}),process.stdin.on("end",()=>{t(e.trim())}),process.stdin.resume()})}
152
+ provider=${n.name} model=${n.model}`)}catch(c){console.error(`Run failed: ${c.message}`)}finally{await i.close()}}async function nu(t){let e=await Br("tui"),n=Re(e.config),r={sessionId:Hr(),mode:"interactive",stream:e.config.stream_output??!1},s=gt(e,r);t.options.dangerous&&(console.log("\u26A0\uFE0F DANGEROUS MODE: All tool approvals are bypassed!"),console.log(` Use with caution.
153
+ `)),await Ql(su(Dr,{sessionOptions:r,providerName:n.name,model:n.model,configPath:e.configPath,mcpServers:e.config.mcp_servers??{},cwd:process.cwd(),sessionsDir:s,providers:e.config.providers,dangerous:t.options.dangerous,needsSetup:e.needsSetup}),{exitOnCtrlC:!1,patchConsole:!1}).waitUntilExit()}async function ou(){let t=process.argv.slice(2);if(t[0]==="mcp"||t[0]==="--"&&t[1]==="mcp"){let o=t[0]==="--"?2:1;await jr(t.slice(o));return}let e=eu(t);if(e.options.showVersion){let r=It()?.version??"unknown";console.log(r);return}if(!(process.stdin.isTTY&&process.stdout.isTTY)||e.options.once){await tu(e);return}await nu(e)}ou();async function ru(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{e+=n}),process.stdin.on("end",()=>{t(e.trim())}),process.stdin.resume()})}
154
154
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memo-code/memo",
3
- "version": "0.5.1",
3
+ "version": "0.5.13",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "AI programming assistant with multi-turn conversations, tool calling, and concurrent execution",