@memo-code/memo 0.5.13 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,119 +1,94 @@
1
1
  #!/usr/bin/env node
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
-
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(`
2
+ var gs=Object.create;var Bn=Object.defineProperty;var hs=Object.getOwnPropertyDescriptor;var ys=Object.getOwnPropertyNames;var xs=Object.getPrototypeOf,vs=Object.prototype.hasOwnProperty;var Fn=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Ts=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ys(t))!vs.call(e,r)&&r!==n&&Bn(e,r,{get:()=>t[r],enumerable:!(o=hs(t,r))||o.enumerable});return e};var Vn=(e,t,n)=>(n=e!=null?gs(xs(e)):{},Ts(t||!e||!e.__esModule?Bn(n,"default",{value:e,enumerable:!0}):n,e));var eo=Fn((Hu,Qn)=>{"use strict";function Wn(e){return Array.isArray(e)?e:[e]}var Jt="",Kn=" ",Wt="\\",$s=/^\s+$/,Is=/(?:[^\\]|^)\\$/,Ls=/^\\!/,Os=/^\\#/,Ns=/\r?\n/g,Ds=/^\.*\/|^\.+$/,Kt="/",Xn="node-ignore";typeof Symbol<"u"&&(Xn=Symbol.for("node-ignore"));var Jn=Xn,Us=(e,t,n)=>Object.defineProperty(e,t,{value:n}),Hs=/([0-z])-([0-z])/g,Yn=()=>!1,js=e=>e.replace(Hs,(t,n,o)=>n.charCodeAt(0)<=o.charCodeAt(0)?t:Jt),Bs=e=>{let{length:t}=e;return e.slice(0,t-t%2)},Fs=[[/^\uFEFF/,()=>Jt],[/((?:\\\\)*?)(\\?\s+)$/,(e,t,n)=>t+(n.indexOf("\\")===0?Kn:Jt)],[/(\\+?)\s/g,(e,t)=>{let{length:n}=t;return t.slice(0,n-n%2)+Kn}],[/[\\$.|*+(){^]/g,e=>`\\${e}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(e,t,n)=>t+6<n.length?"(?:\\/[^\\/]+)*":"\\/.+"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(e,t,n)=>{let o=n.replace(/\\\*/g,"[^\\/]*");return t+o}],[/\\\\\\(?=[$.|*+(){^])/g,()=>Wt],[/\\\\/g,()=>Wt],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(e,t,n,o,r)=>t===Wt?`\\[${n}${Bs(o)}${r}`:r==="]"&&o.length%2===0?`[${js(n)}${o}]`:"[]"],[/(?:[^*])$/,e=>/\/$/.test(e)?`${e}$`:`${e}(?=$|\\/$)`],[/(\^|\\\/)?\\\*$/,(e,t)=>`${t?`${t}[^/]+`:"[^/]*"}(?=$|\\/$)`]],qn=Object.create(null),Vs=(e,t)=>{let n=qn[e];return n||(n=Fs.reduce((o,[r,s])=>o.replace(r,s.bind(e)),e),qn[e]=n),t?new RegExp(n,"i"):new RegExp(n)},Yt=e=>typeof e=="string",Gs=e=>e&&Yt(e)&&!$s.test(e)&&!Is.test(e)&&e.indexOf("#")!==0,zs=e=>e.split(Ns),qt=class{constructor(t,n,o,r){this.origin=t,this.pattern=n,this.negative=o,this.regex=r}},Ws=(e,t)=>{let n=e,o=!1;e.indexOf("!")===0&&(o=!0,e=e.substr(1)),e=e.replace(Ls,"!").replace(Os,"#");let r=Vs(e,t);return new qt(n,e,o,r)},Ks=(e,t)=>{throw new t(e)},Te=(e,t,n)=>Yt(e)?e?Te.isNotRelative(e)?n(`path should be a \`path.relative()\`d string, but got "${t}"`,RangeError):!0:n("path must not be empty",TypeError):n(`path must be a string, but got \`${t}\``,TypeError),Zn=e=>Ds.test(e);Te.isNotRelative=Zn;Te.convert=e=>e;var Xt=class{constructor({ignorecase:t=!0,ignoreCase:n=t,allowRelativePaths:o=!1}={}){Us(this,Jn,!0),this._rules=[],this._ignoreCase=n,this._allowRelativePaths=o,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(t){if(t&&t[Jn]){this._rules=this._rules.concat(t._rules),this._added=!0;return}if(Gs(t)){let n=Ws(t,this._ignoreCase);this._added=!0,this._rules.push(n)}}add(t){return this._added=!1,Wn(Yt(t)?zs(t):t).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(t){return this.add(t)}_testOne(t,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(t)&&(o=!i,r=i)}),{ignored:o,unignored:r}}_test(t,n,o,r){let s=t&&Te.convert(t);return Te(s,t,this._allowRelativePaths?Yn:Ks),this._t(s,n,o,r)}_t(t,n,o,r){if(t in n)return n[t];if(r||(r=t.split(Kt)),r.pop(),!r.length)return n[t]=this._testOne(t,o);let s=this._t(r.join(Kt)+Kt,n,o,r);return n[t]=s.ignored?s:this._testOne(t,o)}ignores(t){return this._test(t,this._ignoreCache,!1).ignored}createFilter(){return t=>!this.ignores(t)}filter(t){return Wn(t).filter(this.createFilter())}test(t){return this._test(t,this._testCache,!0)}},mt=e=>new Xt(e),Js=e=>Te(e&&Te.convert(e),e,Yn);mt.isPathValid=Js;mt.default=mt;Qn.exports=mt;if(typeof process<"u"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let e=n=>/^\\\\\?\\/.test(n)||/["<>|\u0000-\u001F]+/u.test(n)?n:n.replace(/\\/g,"/");Te.convert=e;let t=/^[a-z]:\//i;Te.isNotRelative=n=>t.test(n)||Zn(n)}});var Sr=Fn((Jd,It)=>{"use strict";function gr(e){return Array.isArray(e)?e:[e]}var $c=void 0,Sn="",dr=" ",Tn="\\",Ic=/^\s+$/,Lc=/(?:[^\\]|^)\\$/,Oc=/^\\!/,Nc=/^\\#/,Dc=/\r?\n/g,Uc=/^\.{0,2}\/|^\.{1,2}$/,Hc=/\/$/,ze="/",hr="node-ignore";typeof Symbol<"u"&&(hr=Symbol.for("node-ignore"));var yr=hr,We=(e,t,n)=>(Object.defineProperty(e,t,{value:n}),n),jc=/([0-z])-([0-z])/g,xr=()=>!1,Bc=e=>e.replace(jc,(t,n,o)=>n.charCodeAt(0)<=o.charCodeAt(0)?t:Sn),Fc=e=>{let{length:t}=e;return e.slice(0,t-t%2)},Vc=[[/^\uFEFF/,()=>Sn],[/((?:\\\\)*?)(\\?\s+)$/,(e,t,n)=>t+(n.indexOf("\\")===0?dr:Sn)],[/(\\+?)\s/g,(e,t)=>{let{length:n}=t;return t.slice(0,n-n%2)+dr}],[/[\\$.|*+(){^]/g,e=>`\\${e}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(e,t,n)=>t+6<n.length?"(?:\\/[^\\/]+)*":"\\/.+"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(e,t,n)=>{let o=n.replace(/\\\*/g,"[^\\/]*");return t+o}],[/\\\\\\(?=[$.|*+(){^])/g,()=>Tn],[/\\\\/g,()=>Tn],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(e,t,n,o,r)=>t===Tn?`\\[${n}${Fc(o)}${r}`:r==="]"&&o.length%2===0?`[${Bc(n)}${o}]`:"[]"],[/(?:[^*])$/,e=>/\/$/.test(e)?`${e}$`:`${e}(?=$|\\/$)`]],Gc=/(^|\\\/)?\\\*$/,et="regex",Rt="checkRegex",fr="_",zc={[et](e,t){return`${t?`${t}[^/]+`:"[^/]*"}(?=$|\\/$)`},[Rt](e,t){return`${t?`${t}[^/]*`:"[^/]*"}(?=$|\\/$)`}},Wc=e=>Vc.reduce((t,[n,o])=>t.replace(n,o.bind(e)),e),$t=e=>typeof e=="string",Kc=e=>e&&$t(e)&&!Ic.test(e)&&!Lc.test(e)&&e.indexOf("#")!==0,Jc=e=>e.split(Dc).filter(Boolean),_n=class{constructor(t,n,o,r,s,i){this.pattern=t,this.mark=n,this.negative=s,We(this,"body",o),We(this,"ignoreCase",r),We(this,"regexPrefix",i)}get regex(){let t=fr+et;return this[t]?this[t]:this._make(et,t)}get checkRegex(){let t=fr+Rt;return this[t]?this[t]:this._make(Rt,t)}_make(t,n){let o=this.regexPrefix.replace(Gc,zc[t]),r=this.ignoreCase?new RegExp(o,"i"):new RegExp(o);return We(this,n,r)}},qc=({pattern:e,mark:t},n)=>{let o=!1,r=e;r.indexOf("!")===0&&(o=!0,r=r.substr(1)),r=r.replace(Oc,"!").replace(Nc,"#");let s=Wc(r);return new _n(e,t,r,n,o,s)},kn=class{constructor(t){this._ignoreCase=t,this._rules=[]}_add(t){if(t&&t[yr]){this._rules=this._rules.concat(t._rules._rules),this._added=!0;return}if($t(t)&&(t={pattern:t}),Kc(t.pattern)){let n=qc(t,this._ignoreCase);this._added=!0,this._rules.push(n)}}add(t){return this._added=!1,gr($t(t)?Jc(t):t).forEach(this._add,this),this._added}test(t,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(t)||(r=!l,s=l,i=l?$c:c)});let a={ignored:r,unignored:s};return i&&(a.rule=i),a}},Xc=(e,t)=>{throw new t(e)},be=(e,t,n)=>$t(e)?e?be.isNotRelative(e)?n(`path should be a \`path.relative()\`d string, but got "${t}"`,RangeError):!0:n("path must not be empty",TypeError):n(`path must be a string, but got \`${t}\``,TypeError),vr=e=>Uc.test(e);be.isNotRelative=vr;be.convert=e=>e;var bn=class{constructor({ignorecase:t=!0,ignoreCase:n=t,allowRelativePaths:o=!1}={}){We(this,yr,!0),this._rules=new kn(n),this._strictPathCheck=!o,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(t){return this._rules.add(t)&&this._initCache(),this}addPattern(t){return this.add(t)}_test(t,n,o,r){let s=t&&be.convert(t);return be(s,t,this._strictPathCheck?Xc:xr),this._t(s,n,o,r)}checkIgnore(t){if(!Hc.test(t))return this.test(t);let n=t.split(ze).filter(Boolean);if(n.pop(),n.length){let o=this._t(n.join(ze)+ze,this._testCache,!0,n);if(o.ignored)return o}return this._rules.test(t,!1,Rt)}_t(t,n,o,r){if(t in n)return n[t];if(r||(r=t.split(ze).filter(Boolean)),r.pop(),!r.length)return n[t]=this._rules.test(t,o,et);let s=this._t(r.join(ze)+ze,n,o,r);return n[t]=s.ignored?s:this._rules.test(t,o,et)}ignores(t){return this._test(t,this._ignoreCache,!1).ignored}createFilter(){return t=>!this.ignores(t)}filter(t){return gr(t).filter(this.createFilter())}test(t){return this._test(t,this._testCache,!0)}},wn=e=>new bn(e),Yc=e=>be(e&&be.convert(e),e,xr),Tr=()=>{let e=n=>/^\\\\\?\\/.test(n)||/["<>|\u0000-\u001F]+/u.test(n)?n:n.replace(/\\/g,"/");be.convert=e;let t=/^[a-z]:\//i;be.isNotRelative=n=>t.test(n)||vr(n)};typeof process<"u"&&process.platform==="win32"&&Tr();It.exports=wn;wn.default=wn;It.exports.isPathValid=Yc;We(It.exports,Symbol.for("setupWindows"),Tr)});import{randomUUID as os}from"crypto";import{createInterface as xu}from"readline/promises";import{stdin as vu,stdout as Tu}from"process";import{render as Su}from"ink";import Ss from"os";import{readFile as _s}from"fs/promises";import{join as ks,dirname as bs}from"path";import{fileURLToPath as ws}from"url";var Cs=/{{\s*([\w.-]+)\s*}}/g;function Es(e,t){return e.replace(Cs,(n,o)=>t[o]??"")}function As(){try{return Ss.userInfo().username}catch{return process.env.USER??process.env.USERNAME??"unknown"}}async function Gn(){let e=bs(ws(import.meta.url)),t=ks(e,"prompt.md"),n=await _s(t,"utf-8"),o={date:new Date().toISOString(),user:As(),pwd:process.cwd()};return Es(n,o)}import{appendFile as Ms,mkdir as Ps}from"fs/promises";import{dirname as Rs}from"path";var pt=class{constructor(t){this.filePath=t}ready=!1;async append(t){this.ready||(await Ps(Rs(this.filePath),{recursive:!0}),this.ready=!0),await Ms(this.filePath,`${JSON.stringify(t)}
3
+ `,"utf8")}async flush(){return Promise.resolve()}};function zn(e){return{ts:new Date().toISOString(),sessionId:e.sessionId,turn:e.turn,step:e.step,type:e.type,content:e.content,role:e.role,meta:e.meta}}import{spawn as ci}from"child_process";import{z as tn}from"zod";function S(e,t=!1){return{content:[{type:"text",text:e}],isError:t}}var io=Vn(eo(),1);import{normalize as qs,resolve as ro,dirname as to,join as dt,relative as so,isAbsolute as Xs}from"path";import{homedir as Ys}from"os";import{existsSync as Qt,statSync as Zs}from"fs";import{readFile as Qs}from"fs/promises";function Y(e){return qs(ro(e))}function ei(e,t){let n=so(t,e);return n===""||!n.startsWith("..")&&!Xs(n)}function ti(){let e=process.env.MEMO_SANDBOX_WRITABLE_ROOTS?.trim();return e?e.split(",").map(t=>t.trim()).filter(Boolean).map(t=>Y(t)):[]}function ao(){let e=new Set;e.add(Y(process.cwd()));let t=process.env.MEMO_HOME?.trim()||dt(Ys(),".memo");e.add(Y(t));for(let n of ti())e.add(n);return Array.from(e)}function en(e){return ao().some(n=>ei(e,n))}function ft(e){if(en(e))return null;let t=ao();return`sandbox \u62D2\u7EDD\u5199\u5165: ${e} \u4E0D\u5728\u5141\u8BB8\u76EE\u5F55\u5185 (${t.join(", ")})`}var ni=["node_modules/",".git/","dist/","out/","build/","coverage/",".cache/",".idea/",".DS_Store",".next/",".turbo/",".pnpm/",".pnpm-store/","*.log","logs/","tmp/","temp/","vendor/"],no=100,Zt=1e4,oi="<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>",oo=new Map;function ri(e){return e.replace(/\\/g,"/")}function si(e){let t=ro(e);try{Zs(t).isFile()&&(t=to(t))}catch{t=process.cwd()}let n=t;for(;;){if(Qt(dt(t,".gitignore"))||Qt(dt(t,".git")))return t;let o=to(t);if(o===t)return n;t=o}}async function ii(e){let t=dt(e,".gitignore");return Qt(t)?(await Qs(t,"utf8")).split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")):[]}async function ai(e){let t=(0,io.default)();t.add(ni);let n=await ii(e);return n.length>0&&t.add(n),{root:e,ignores:o=>{let r=so(e,o);return!r||r.startsWith("..")?!1:t.ignores(ri(r))}}}async function gt(e){let t=si(e),n=oo.get(t);if(n)return n;let o=ai(t);return oo.set(t,o),o}function ht(e,t){let n=e.split(/\r?\n/),o=Math.max(t,n.length),r=n.slice(0,no).join(`
4
+ `);return r.length>Zt&&(r=r.slice(0,Zt)),o>no||e.length>Zt?`${r}
5
+
6
+ ${oi}`:r}var li=tn.object({command:tn.string().min(1,"command \u4E0D\u80FD\u4E3A\u7A7A"),timeout:tn.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(),co=4e3,lo=4e3;function uo(e,t){return e.length<=t?{value:e,truncated:!1}:{value:e.slice(0,t),truncated:!0}}function ui(e){return e.trim().replace(/^['"]|['"]$/g,"")}function pi(e){let t=e.split(/\s+/).map(ui).filter(Boolean),n=[];for(let o of t){if(!o.startsWith("/"))continue;let r=Y(o);en(r)||n.push(r)}return Array.from(new Set(n))}var po={name:"bash",description:"\u5728 shell \u4E2D\u6267\u884C\u547D\u4EE4\uFF0C\u8FD4\u56DE exit/stdout/stderr",inputSchema:li,execute:async({command:e,timeout:t})=>{let n=e.trim();if(!n)return S("bash \u9700\u8981\u8981\u6267\u884C\u7684\u547D\u4EE4",!0);let o=pi(n);if(o.length>0)return S(`sandbox \u62D2\u7EDD\u6267\u884C: \u547D\u4EE4\u5305\u542B\u8D8A\u754C\u7EDD\u5BF9\u8DEF\u5F84 (${o.join(", ")})`,!0);try{let r=ci("bash",["-lc",n],{env:process.env,stdio:["ignore","pipe","pipe"]}),s=_=>new Promise(k=>{if(!_)return k("");let d=[];_.setEncoding("utf8"),_.on("data",v=>d.push(v)),_.on("error",()=>k("")),_.on("end",()=>k(d.join("")))}),i=s(r.stdout),a=s(r.stderr),c,l=new Promise((_,k)=>{r.on("error",d=>k(d)),r.on("close",d=>_(typeof d=="number"?d:-1))}),u=t&&t>0?new Promise((_,k)=>{c=setTimeout(()=>{r.kill(),k(new Error(`bash \u8D85\u65F6 ${t}ms\uFF0C\u5DF2\u7EC8\u6B62\u8FDB\u7A0B`))},t)}):null,p=u?await Promise.race([l,u]):await l;c&&clearTimeout(c);let[h,y]=await Promise.all([i,a]),b=uo(h,co),x=uo(y,lo),w=b.truncated||x.truncated?`
7
+ <system_hint>bash \u8F93\u51FA\u5DF2\u622A\u65AD\uFF08stdout_max=${co} chars, stderr_max=${lo} chars\uFF09\u3002\u8BF7\u7F29\u5C0F\u547D\u4EE4\u8F93\u51FA\u8303\u56F4\u3002</system_hint>`:"";return S(`exit=${p} stdout="${b.value}" stderr="${x.value}"${w}`)}catch(r){return S(`bash \u6267\u884C\u5931\u8D25: ${r.message}`,!0)}}};import{access as mi,readFile as di,writeFile as fi}from"fs/promises";import{z as ne}from"zod";var gi=ne.object({old_string:ne.string().min(1,"old_string \u4E0D\u80FD\u4E3A\u7A7A"),new_string:ne.string(),replace_all:ne.boolean().optional()}).strict(),hi=ne.object({file_path:ne.string().min(1),old_string:ne.string().optional(),new_string:ne.string().optional(),replace_all:ne.boolean().optional(),edits:ne.array(gi).min(1).optional()}).superRefine((e,t)=>{let n=!!(e.edits&&e.edits.length>0),o=typeof e.old_string=="string"||typeof e.new_string=="string";if(n&&o){t.addIssue({code:ne.ZodIssueCode.custom,message:"edits \u4E0E old_string/new_string \u4E0D\u80FD\u540C\u65F6\u4F7F\u7528"});return}if(n)for(let r=0;r<(e.edits?.length??0);r++){let s=e.edits?.[r];s&&(s.old_string.trim()||t.addIssue({code:ne.ZodIssueCode.custom,message:"old_string \u4E0D\u80FD\u4E3A\u7A7A",path:["edits",r,"old_string"]}))}else{if(typeof e.old_string!="string"||typeof e.new_string!="string"){t.addIssue({code:ne.ZodIssueCode.custom,message:"\u5FC5\u987B\u63D0\u4F9B old_string/new_string\uFF0C\u6216\u4F7F\u7528 edits"});return}e.old_string.trim()||t.addIssue({code:ne.ZodIssueCode.custom,message:"old_string \u4E0D\u80FD\u4E3A\u7A7A",path:["old_string"]})}}).strict(),mo={name:"edit",description:"\u5728\u6587\u4EF6\u4E2D\u66FF\u6362\u6587\u672C\uFF0C\u652F\u6301 replace_all \u548C\u6279\u91CF edits",inputSchema:hi,execute:async e=>{let t=Y(e.file_path),n=ft(t);if(n)return S(n,!0);try{await mi(t);let o=await di(t,"utf8"),r=e.edits&&e.edits.length>0?e.edits:[{old_string:e.old_string??"",new_string:e.new_string??"",replace_all:e.replace_all}],s=o,i=0;for(let a=0;a<r.length;a++){let c=r[a];if(!c)continue;let l=c.old_string,u=c.replace_all??!1;if(!s.includes(l))return r.length===1?S("\u672A\u627E\u5230\u5F85\u66FF\u6362\u6587\u672C",!0):S(`\u7B2C ${a+1} \u5904\u66FF\u6362\u672A\u627E\u5230\u5F85\u66FF\u6362\u6587\u672C`,!0);if(u){let p=s.split(l),h=p.length-1;s=p.join(c.new_string),i+=h}else s=s.replace(l,c.new_string),i+=1}return s===o?S("\u672A\u68C0\u6D4B\u5230\u5185\u5BB9\u53D8\u5316"):(await fi(t,s,"utf8"),S(`\u66FF\u6362\u5B8C\u6210: file=${t} edits=${r.length} count=${i}`))}catch(o){return o.code==="ENOENT"?S(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`,!0):S(`edit \u5931\u8D25: ${o.message}`,!0)}}};import{z as fo}from"zod";var yi=fo.object({url:fo.string().min(1)}).strict(),go=1e4,Xe=512e3,nn=4e3,xi=new Set(["http:","https:","data:"]),vi=/<\/\s*(p|div|section|article|header|footer|aside|main|h[1-6]|li|tr|table|blockquote)\s*>/gi,Ti=/<\s*(br|hr)\s*\/?>/gi,Si=/<\s*li[^>]*>/gi,_i=/<[^>]+>/g,ki=/<(script|style)[^>]*>[\s\S]*?<\/\s*\1>/gi,bi=e=>e.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""}}),wi=e=>{let o=e.replace(ki," ").replace(Si,"- ").replace(Ti,`
8
+ `).replace(vi,`
9
+ `).replace(_i," "),s=bi(o).replace(/\r/g,"").split(`
8
10
  `).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()},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}
11
+ `).trim()},Ci=e=>e.replace(/\s+/g," ").trim(),ho={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:yi,execute:async e=>{let t;try{t=new URL(e.url)}catch{return S(`\u65E0\u6548 URL: ${e.url}`,!0)}if(!xi.has(t.protocol))return S(`\u4E0D\u652F\u6301\u7684\u534F\u8BAE: ${t.protocol}`,!0);let n=new AbortController,o=setTimeout(()=>n.abort(),go);try{let r=await globalThis.fetch(t,{signal:n.signal}),s=r.headers.get("content-length"),i=s?Number(s):void 0;if(i&&i>Xe)return S(`\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 w=r.body.getReader(),_=[];for(;;){let{done:v,value:E}=await w.read();if(v)break;if(E){if(a+=E.byteLength,a>Xe)return n.abort(),S(`\u8BF7\u6C42\u88AB\u4E2D\u6B62: \u54CD\u5E94\u4F53\u8D85\u8FC7 ${Xe} bytes`,!0);_.push(E)}}let k=new Uint8Array(a),d=0;for(let v of _)k.set(v,d),d+=v.byteLength;c=new TextDecoder().decode(k)}else if(c=await r.text(),a=new TextEncoder().encode(c).byteLength,a>Xe)return S(`\u8BF7\u6C42\u88AB\u62D2\u7EDD: \u54CD\u5E94\u4F53\u8D85\u8FC7 ${Xe} 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?wi(c):c.trim(),h=Ci(p),y=h.length>nn?`${h.slice(0,nn)}...`:h,b=h.length>nn?" text_truncated=true":"",x=u?" source=html_stripped":"";return S(`status=${r.status} bytes=${a} text_chars=${h.length} text="${y}"${b}${x}`)}catch(r){return r.name==="AbortError"?S(`\u8BF7\u6C42\u8D85\u65F6\u6216\u88AB\u4E2D\u6B62\uFF08${go}ms\uFF09`,!0):S(`\u8BF7\u6C42\u5931\u8D25: ${r.message}`,!0)}finally{clearTimeout(o)}}};import{z as on}from"zod";import Ei from"fast-glob";var Ai=on.object({pattern:on.string().min(1),path:on.string().optional()}).strict(),Mi={name:"glob",description:"\u6309 glob \u6A21\u5F0F\u5339\u914D\u6587\u4EF6\uFF0C\u8FD4\u56DE\u7EDD\u5BF9\u8DEF\u5F84\u5217\u8868",inputSchema:Ai,execute:async e=>{let t=e.path?Y(e.path):process.cwd();try{let n=await gt(t),r=(await Ei(e.pattern,{cwd:t,absolute:!0,onlyFiles:!0})).filter(i=>!n.ignores(i));if(r.length===0)return S("\u672A\u627E\u5230\u5339\u914D\u6587\u4EF6");let s=r.join(`
12
+ `);return S(ht(s,r.length))}catch(n){return S(`glob \u5931\u8D25: ${n.message}`,!0)}}},yo=Mi;import{spawn as Pi,spawnSync as Ri}from"child_process";import{z as Se}from"zod";import{isAbsolute as xo,resolve as vo}from"path";var $i=Se.object({pattern:Se.string().min(1),path:Se.string().optional(),output_mode:Se.enum(["content","files_with_matches","count"]).optional(),glob:Se.string().optional(),"-i":Se.boolean().optional(),"-A":Se.number().int().nonnegative().optional(),"-B":Se.number().int().nonnegative().optional(),"-C":Se.number().int().nonnegative().optional()}).strict(),To={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:$i,execute:async e=>{let t=Ri("rg",["--version"],{stdio:"ignore"});if(t.error||t.status!==0)return S("rg \u672A\u5B89\u88C5\u6216\u4E0D\u5728 PATH",!0);let n=e.path?Y(e.path):process.cwd(),o=["--color","never"],r=e.output_mode??"content";r==="files_with_matches"?o.push("-l"):r==="count"?o.push("-c"):o.push("--line-number","--no-heading"),e["-i"]&&o.push("-i"),e.glob&&o.push("--glob",e.glob),e["-A"]!==void 0&&o.push("-A",String(e["-A"])),e["-B"]!==void 0&&o.push("-B",String(e["-B"])),e["-C"]!==void 0&&o.push("-C",String(e["-C"])),o.push(e.pattern,n);try{let s=await gt(n),i=Pi("rg",o,{stdio:["ignore","pipe","pipe"]}),a=x=>new Promise(w=>{if(!x)return w("");let _=[];x.setEncoding("utf8"),x.on("data",k=>_.push(k)),x.on("error",()=>w("")),x.on("end",()=>w(_.join("")))}),[c,l]=await Promise.all([a(i.stdout),a(i.stderr)]);if(await new Promise((x,w)=>{i.on("error",_=>w(_)),i.on("close",_=>x(typeof _=="number"?_:-1))})===2)return S(`grep \u5931\u8D25(exit=2): ${l||c}`,!0);let y=(c||l||"").split(/\r?\n/).map(x=>x.trimEnd()).filter(x=>x.length>0).filter(x=>{if(r==="files_with_matches"){let d=x.trim(),v=xo(d)?d:vo(n,d);return!s.ignores(v)}let w=x.indexOf(":");if(w===-1)return!0;let _=x.slice(0,w),k=xo(_)?_:vo(n,_);return!s.ignores(k)});if(y.length===0)return S("\u672A\u627E\u5230\u5339\u914D");let b=y.join(`
13
+ `);return S(ht(b,y.length))}catch(s){return S(`grep \u6267\u884C\u5931\u8D25: ${s.message}`,!0)}}};import{mkdir as Ii,readFile as Li,writeFile as Oi,access as Ni}from"fs/promises";import{dirname as Di,join as So}from"path";import{homedir as Ui}from"os";import{z as _o}from"zod";var Hi=_o.object({fact:_o.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 ji(){let e=process.env.MEMO_HOME?.trim()||So(Ui(),".memo");return So(e,"Agents.md")}function Bi(e){return e.replace(/\r?\n/g," ").replace(/\s+/g," ").trim()}function Fi(e,t){let o=t.map(r=>r.trim()).filter(Boolean).map(r=>`- ${r}`);return`${e}
12
14
 
13
15
  ${o.join(`
14
16
  `)}
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(`
17
+ `}var ko={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:Hi,execute:async e=>{let t=Bi(e.fact);if(!t)return S("fact cannot be empty",!0);let n=ji(),o=Di(n);try{await Ii(o,{recursive:!0});let r="## Memo Added Memories";try{let s=await(async()=>{try{return await Ni(n),await Li(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(t);let c=a.slice(Math.max(0,a.length-50)),l=Fi(r,c);await Oi(n,l,"utf-8")}catch(s){console.warn(`Memory maintenance failed: ${s.message}`)}return S(`Memory saved to: ${n}`)}catch(r){return S(`Failed to write memory: ${r.message}`,!0)}}};import{z as _e}from"zod";var yt=10,pe=[],Vi=_e.object({type:_e.enum(["add","replace","update","remove"]),todos:_e.array(_e.object({content:_e.string().trim().min(1,"content \u4E0D\u80FD\u4E3A\u7A7A").max(200,"content \u6700\u957F 200 \u5B57\u7B26"),status:_e.enum(["pending","in_progress","completed"]).optional().default("pending"),id:_e.string().min(1,"id \u4E0D\u80FD\u4E3A\u7A7A").optional()})).optional(),ids:_e.array(_e.string().min(1,"id \u4E0D\u80FD\u4E3A\u7A7A")).optional()}).strict().refine(e=>{if(["add","replace","update"].includes(e.type)){if(!e.todos||e.todos.length===0)return!1;if(e.type==="update")return e.todos.every(t=>t.id)}return!(e.type==="remove"&&(!e.ids||e.ids.length===0))},{message:"add/replace/update \u9700\u8981 todos\uFF0Cremove \u9700\u8981 ids\uFF0Cupdate \u9700\u8981 id"});function xt(){return pe.map(e=>({...e}))}function Gi(e){switch(e.type){case"add":{let t=e.todos,n=yt-pe.length;if(t.length>n)return{error:`\u4EFB\u52A1\u4E0A\u9650 ${yt}\uFF0C\u5F53\u524D\u5269\u4F59 ${n} \u6761\u7A7A\u4F4D`};let o=t.map(r=>({id:crypto.randomUUID(),content:r.content,status:r.status}));return pe.push(...o),{added:o,tasks:xt()}}case"replace":{let t=e.todos;if(t.length>yt)return{error:`\u4EFB\u52A1\u4E0A\u9650 ${yt}`};pe.splice(0,pe.length);let n=t.map(o=>({id:crypto.randomUUID(),content:o.content,status:o.status}));return pe.push(...n),{replaced:!0,tasks:xt()}}case"update":{let t=e.todos,n=t.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(pe.map(s=>[s.id,s]));for(let s of t){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:xt()}}case"remove":{let t=e.ids,n=pe.length,o=new Set(t),r=pe.filter(s=>!o.has(s.id));return r.length===n?{error:"\u672A\u627E\u5230\u4EFB\u4F55\u53EF\u5220\u9664\u7684\u4EFB\u52A1 id"}:(pe.splice(0,pe.length,...r),{removed:t,tasks:xt()})}}}var bo={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:Vi,execute:async e=>{let t=Gi(e);if(t.error)return S(t.error,!0);let n={op:e.type,count:pe.length,tasks:t.tasks,added:t.added,updated:t.updated,removed:t.removed,replaced:!!t.replaced};return S(JSON.stringify(n))}};import{z as vt}from"zod";import{extname as zi}from"path";import{gzipSync as Wi}from"zlib";import{access as Ki,readFile as Ji}from"fs/promises";var wo=512e3,Co=2e6,qi=200,Eo=1e3,Xi=1024,rn=4e3,Yi=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg"]);function Zi(e){let t=zi(e).toLowerCase();return Yi.has(t)}function Qi(e){return Buffer.from(e).toString("base64")}function ea(e){try{let t=Wi(e,{level:6});if(t.byteLength<e.byteLength)return{data:new Uint8Array(t),encoding:"gzip+base64"}}catch{}return{data:e,encoding:"base64"}}function ta(e){let t=e.truncated?" truncated=true":"";return`image_base64 (encoding=${e.encoding} original_bytes=${e.originalBytes} payload_bytes=${e.payloadBytes} base64_length=${e.base64.length}${t}): ${e.base64}`}var na=vt.object({file_path:vt.string().min(1),offset:vt.number().int().positive().optional(),limit:vt.number().int().positive().optional()}).strict(),Ao={name:"read",description:"\u8BFB\u53D6\u6307\u5B9A\u6587\u4EF6\u5185\u5BB9\uFF0C\u53EF\u6309 offset/limit \u622A\u53D6\u5E76\u9644\u5E26\u884C\u53F7",inputSchema:na,execute:async e=>{let t=Y(e.file_path),n=e.offset??1,o=e.limit??qi,r=Math.min(o,Eo);try{await Ki(t);let s=await Ji(t),i=s.byteLength;if(Zi(t)){if(i>Co)return S(`\u56FE\u7247\u8FC7\u5927\uFF08${i} bytes\uFF09\uFF0C\u8D85\u8FC7\u9608\u503C ${Co} bytes\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6`,!0);let v=new Uint8Array(s),{data:E,encoding:B}=ea(v),I=Qi(E),ue=I.length>rn?`${I.slice(0,rn)}...`:I,M=I.length>rn;return S(ta({encoding:B,base64:ue,originalBytes:v.byteLength,payloadBytes:E.byteLength,truncated:M}))}if(i>wo)return S(`\u6587\u4EF6\u8FC7\u5927\uFF08${i} bytes\uFF09\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6\uFF0C\u9608\u503C ${wo} bytes`,!0);let c=new Uint8Array(s),l=Math.min(c.length,Xi);for(let v=0;v<l;v++)if(c[v]===0)return S("\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/),h=Math.max(0,n-1),y=Math.min(p.length,h+r),x=p.slice(h,y).map((v,E)=>`${h+E+1}: ${v}`).join(`
18
+ `),w=y<p.length,d=o!==r||w&&e.limit===void 0?`
19
+ ... (truncated, showing ${r} lines; max=${Eo})`:"";return S(x+d)}catch(s){return S(`\u8BFB\u53D6\u5931\u8D25: ${s.message}`,!0)}}};import{z as sn}from"zod";import{dirname as oa}from"path";import{mkdir as ra,writeFile as sa}from"fs/promises";var ia=sn.object({file_path:sn.string().min(1),content:sn.any().optional()}).strict();function aa(e){if(e instanceof Uint8Array)return{data:e,info:`bytes=${e.byteLength}`};if(e instanceof ArrayBuffer){let n=new Uint8Array(e);return{data:n,info:`bytes=${n.byteLength}`}}if(typeof e=="string")return{data:e,info:`text_length=${e.length}`};let t=JSON.stringify(e??"",null,2);return{data:t,info:`json_length=${t.length}`}}var Mo={name:"write",description:"\u521B\u5EFA\u6216\u8986\u76D6\u6587\u4EF6\uFF0C\u4F20\u5165 file_path \u4E0E content",inputSchema:ia,execute:async e=>{let t=Y(e.file_path),n=ft(t);if(n)return S(n,!0);let{data:o,info:r}=aa(e.content);try{return await ra(oa(t),{recursive:!0}),await sa(t,o instanceof Uint8Array?o:String(o)),S(`\u5DF2\u5199\u5165 ${t} (overwrite, ${r})`)}catch(s){return S(`\u5199\u5165\u5931\u8D25: ${s.message}`,!0)}}};function ca(e){let t=e.toJSONSchema(),{$schema:n,...o}=t;return o}function la(e){return{name:e.name,description:e.description,source:"native",inputSchema:ca(e.inputSchema),validateInput:t=>{let n=e.inputSchema.safeParse(t);if(!n.success){let o=n.error.issues[0]?.message??"invalid input";return{ok:!1,error:`${e.name} invalid input: ${o}`}}return{ok:!0,data:n.data}},execute:e.execute}}function Po(e){return e.map(la)}var ua={bash:po,read:Ao,write:Mo,edit:mo,glob:yo,grep:To,webfetch:ho,save_memory:ko,todo:bo},pa=Object.values(ua),Ro=Po(pa);import Na from"openai";import{encoding_for_model as ma,get_encoding as da}from"@dqbd/tiktoken";var $o="cl100k_base";function fa(e){let t=e?.trim()||$o;try{let n=()=>ma(t);return n().free(),{model:t,factory:n}}catch{let n=$o,o=()=>da(n);return o().free(),{model:n,factory:o}}}function Io(e){let{model:t,factory:n}=fa(e),o=n(),r=4,s=2,i=1,a=l=>l?o.encode(l).length:0;return{model:t,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 ga,writeFile as ha,readFile as ya,access as xa}from"fs/promises";import{homedir as Lo}from"os";import{dirname as va,join as Ie}from"path";import{randomUUID as tm}from"crypto";import{parse as Ta}from"toml";var Sa=Ie(Lo(),".memo"),_a="sessions",ka="Agents.md",je={current_provider:"deepseek",stream_output:!1,max_prompt_tokens:12e4,providers:[{name:"deepseek",env_api_key:"DEEPSEEK_API_KEY",model:"deepseek-chat",base_url:"https://api.deepseek.com"}],mcp_servers:{}};function ba(e){return/^[A-Za-z0-9_-]+$/.test(e)?e:JSON.stringify(e)}function wa(e){if(!e||typeof e!="object"||Array.isArray(e))return[];let t=[];for(let[n,o]of Object.entries(e)){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),t.push(i)}}return t}function Oo(e){return e.startsWith("~")?Ie(Lo(),e.slice(1)):e}function Ca(e){let t=e.providers.map(s=>{let i=typeof s?.name=="string"?s.name:"";if(!i)return"";let c=[`[[providers.${ba(i)}]]`,`name = ${JSON.stringify(i)}`,`env_api_key = ${JSON.stringify(String(s.env_api_key??""))}`,`model = ${JSON.stringify(String(s.model??""))}`];return s.base_url&&c.push(`base_url = ${JSON.stringify(String(s.base_url))}`),c.join(`
18
20
  `)}).filter(Boolean).join(`
19
21
 
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
- `)}let i=s.args?`args = ${JSON.stringify(s.args)}`:"",a=s.type?`type = "${s.type}"
22
- `:"",c=s.stderr?`stderr = "${s.stderr}"
23
- `:"",l=`[mcp_servers.${r}]
24
- ${a}command = "${s.command}"
25
- ${c}${i}`.trimEnd(),u=s.env?Object.entries(s.env):[];if(u.length===0)return l;let p=u.map(([v,m])=>`${JSON.stringify(v)} = ${JSON.stringify(m)}`).join(`
26
- `);return`${l}
22
+ `),n="";e.mcp_servers&&Object.keys(e.mcp_servers).length>0&&(n=Object.entries(e.mcp_servers).map(([s,i])=>{if("url"in i){let y=[`[mcp_servers.${s}]`];y.push(`type = "${i.type??"streamable_http"}"`),y.push(`url = "${i.url}"`),"fallback_to_sse"in i&&i.fallback_to_sse!==void 0&&y.push(`fallback_to_sse = ${i.fallback_to_sse}`),i.bearer_token_env_var&&y.push(`bearer_token_env_var = ${JSON.stringify(i.bearer_token_env_var)}`);let b=i.http_headers??i.headers;if(b&&Object.keys(b).length>0){let x=Object.entries(b).map(([_,k])=>`${JSON.stringify(_)} = ${JSON.stringify(k)}`).join(", "),w=i.http_headers?"http_headers":"headers";y.push(`${w} = { ${x} }`)}return y.join(`
23
+ `)}let a=i.args?`args = ${JSON.stringify(i.args)}`:"",c=i.type?`type = "${i.type}"
24
+ `:"",l=i.stderr?`stderr = "${i.stderr}"
25
+ `:"",u=`[mcp_servers.${s}]
26
+ ${c}command = "${i.command}"
27
+ ${l}${a}`.trimEnd(),p=i.env?Object.entries(i.env):[];if(p.length===0)return u;let h=p.map(([y,b])=>`${JSON.stringify(y)} = ${JSON.stringify(b)}`).join(`
28
+ `);return`${u}
27
29
 
28
- [mcp_servers.${r}.env]
29
- ${p}`}).join(`
30
+ [mcp_servers.${s}.env]
31
+ ${h}`}).join(`
30
32
 
31
- `)),[`
32
- current_provider = "${t.current_provider}"
33
- stream_output = ${t.stream_output??!1}
34
- `.trim(),e,n].filter(Boolean).join(`
33
+ `));let o=[`current_provider = "${e.current_provider}"`,`stream_output = ${e.stream_output??!1}`];return typeof e.max_prompt_tokens=="number"&&Number.isFinite(e.max_prompt_tokens)&&o.push(`max_prompt_tokens = ${Math.floor(e.max_prompt_tokens)}`),[o.join(`
34
+ `),t,n].filter(Boolean).join(`
35
35
 
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
- `)}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 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+=`
36
+ `)}async function ge(e,t){await ga(va(e),{recursive:!0}),await ha(e,Ca(t),"utf-8")}async function oe(){let e=process.env.MEMO_HOME?Oo(process.env.MEMO_HOME):Sa,t=Ie(e,"config.toml");try{await xa(t);let n=await ya(t,"utf-8"),o=Ta(n),r=wa(o.providers),s=typeof o.max_prompt_tokens=="number"&&Number.isFinite(o.max_prompt_tokens)&&o.max_prompt_tokens>0?Math.floor(o.max_prompt_tokens):void 0,i={current_provider:o.current_provider??je.current_provider,stream_output:o.stream_output??je.stream_output,max_prompt_tokens:s??je.max_prompt_tokens,providers:r,mcp_servers:o.mcp_servers??{}},a=!i.providers.length;return{config:a?je:i,home:e,configPath:t,needsSetup:a}}catch{return{config:je,home:e,configPath:t,needsSetup:!0}}}function Le(e,t){let n=t||e.current_provider,o=e.providers.find(r=>r.name===n);return o||(e.providers?.[0]??je.providers[0])}function Tt(e,t){let n=t.historyDir??Ie(e.home,_a);return Oo(n)}function No(e){return Ie(e.home,ka)}function Ea(e,t=100){return e.replace(/[\\/:\s]+/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,t)||"root"}function Aa(e,t=180){let n=[],o=0;for(let r of e){let s=r.slice(0,Math.max(1,t-o-(n.length>0?1:0)));if(n.push(s),o+=s.length+(n.length>1?1:0),o>=t)break}return n}function Do(e,t){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=Uo(process.cwd()),u=`${o}-${r}-${s}_${i}${a}${c}_${t}.jsonl`;return Ie(e,l,u)}function Uo(e){let t=e.split(/[/\\]+/).map(o=>Ea(o));return Aa(t,180).join("-")||"root"}function Ho(e,t){return Ie(e,Uo(t))}var St=class{tools=new Map;register(t){this.tools.set(t.name,t)}registerMany(t){for(let n of t)this.register(n)}get(t){return this.tools.get(t)}getAll(){return Array.from(this.tools.values())}toRegistry(){let t={};for(let[n,o]of this.tools)t[n]=o;return t}has(t){return this.tools.has(t)}get size(){return this.tools.size}};import{Client as Ma}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as jo}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as Pa}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{StdioClientTransport as Ra}from"@modelcontextprotocol/sdk/client/stdio.js";function _t(){return new Ma({name:"memo-code-cli-client",version:"1.0.0"},{capabilities:{}})}function $a(e){if(!(!e||Object.keys(e).length===0))return{headers:e}}function Ia(e){let t={...e.http_headers??e.headers??{}};if(e.bearer_token_env_var){let n=process.env[e.bearer_token_env_var];n&&!t.Authorization&&(t.Authorization=`Bearer ${n}`)}return t}async function La(e){let t=new URL(e.url),n=$a(Ia(e));if(e.type==="sse"){let r=_t(),s=new jo(t,{requestInit:n});return await r.connect(s),{client:r,transport:s}}let o=e.fallback_to_sse??!0;try{let r=_t(),s=new Pa(t,{requestInit:n});return await r.connect(s),{client:r,transport:s}}catch(r){if(!o)throw r;try{let s=_t(),i=new jo(t,{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 Oa(e){if("url"in e)return La(e);let t={command:e.command,args:e.args,env:e.env?{...process.env,...e.env}:void 0,stderr:e.stderr??(process.stdout.isTTY&&process.stdin.isTTY?"ignore":void 0)},n=new Ra(t),o=_t();return await o.connect(n),{client:o,transport:n}}var kt=class{connections=new Map;async connect(t,n){let o=this.connections.get(t);if(o)return o;let{client:r,transport:s}=await Oa(n),i=await r.listTools(),a={name:t,client:r,transport:s,tools:(i.tools||[]).map(c=>({name:`${t}_${c.name}`,description:c.description||`Tool from ${t}: ${c.name}`,source:"mcp",serverName:t,originalName:c.name,inputSchema:c.inputSchema,execute:async()=>({content:[]})}))};return this.connections.set(t,a),a}get(t){return this.connections.get(t)}getAll(){return Array.from(this.connections.values())}getAllTools(){let t=[];for(let n of this.connections.values())for(let o of n.tools)t.push({name:o.name,description:o.description,serverName:o.serverName,originalName:o.originalName,inputSchema:o.inputSchema,client:n.client});return t}async closeAll(){let t=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(t),this.connections.clear()}get size(){return this.connections.size}};var bt=class{pool;tools=new Map;shouldLog;constructor(){this.pool=new kt,this.shouldLog=process.env.MEMO_MCP_LOG==="1"||!(process.stdout.isTTY&&process.stdin.isTTY)}async loadServers(t){if(!t||Object.keys(t).length===0)return 0;let n=0;return await Promise.all(Object.entries(t).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(t){return this.tools.get(t)}getAll(){return Array.from(this.tools.values())}toRegistry(){let t={};for(let[n,o]of this.tools)t[n]=o;return t}has(t){return this.tools.has(t)}get size(){return this.tools.size}async dispose(){await this.pool.closeAll(),this.tools.clear()}getPool(){return this.pool}};var wt=class{nativeRegistry;mcpRegistry;constructor(){this.nativeRegistry=new St,this.mcpRegistry=new bt}registerNativeTool(t){this.nativeRegistry.register(t)}registerNativeTools(t){for(let n of t)this.registerNativeTool(n)}async loadMcpServers(t){return this.mcpRegistry.loadServers(t)}getTool(t){return this.nativeRegistry.get(t)??this.mcpRegistry.get(t)}getAllTools(){return[...this.nativeRegistry.getAll(),...this.mcpRegistry.getAll()]}toRegistry(){return{...this.nativeRegistry.toRegistry(),...this.mcpRegistry.toRegistry()}}hasTool(t){return this.nativeRegistry.has(t)||this.mcpRegistry.has(t)}getToolCount(){let t=this.nativeRegistry.size,n=this.mcpRegistry.size;return{native:t,mcp:n,total:t+n}}async execute(t,n){let o=this.getTool(t);if(!o)throw new Error(`Tool '${t}' not found`);return o.execute(n)}generateToolDefinitions(){return this.getAllTools().map(t=>({name:t.name,description:t.description,input_schema:t.inputSchema||{type:"object",properties:{}}}))}generateToolDescriptions(){let t=this.getAllTools();if(t.length===0)return"";let n=[];n.push("## Available Tools"),n.push("");let o=t.filter(s=>s.source==="native"),r=t.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
+ `)}formatToolDescription(t){let n=[];return n.push(`#### ${t.name}`),n.push(`- **Description**: ${t.description}`),t.inputSchema&&Object.keys(t.inputSchema).length>0&&n.push(`- **Input Schema**: ${JSON.stringify(t.inputSchema)}`),n.join(`
38
+ `)}groupByServer(t){let n={};for(let o of t)if(o.source==="mcp"){let r=o.serverName;n[r]||(n[r]=[]),n[r].push(o)}return n}getToolDescriptions(){return this.getAllTools().map(t=>({name:t.name,description:t.description,source:t.source,serverName:t.source==="mcp"?t.serverName:void 0,inputSchema:t.inputSchema}))}async dispose(){await this.mcpRegistry.dispose()}};import{readFile as Da,access as Ua}from"fs/promises";function Ha(e){try{return{ok:!0,data:JSON.parse(e)}}catch(t){return{ok:!1,raw:e,error:t.message}}}async function Bo(e,t,n){let o=await oe(),r=o.config,s=new wt;if(s.registerNativeTools(Ro),await s.loadMcpServers(r.mcp_servers),e.tools)for(let[y,b]of Object.entries(e.tools))s.registerNativeTool({name:y,description:b.description,source:"native",inputSchema:{type:"object"},execute:b.execute});let i=s.toRegistry(),a=async()=>{let y=await(e.loadPrompt??Gn)(),b=s.generateToolDescriptions();b&&(y+=`
39
39
 
40
- ${b}`);let h=So(o);try{await ya(h);let C=(await ha(h,"utf-8")).trim();C&&(m+=`
40
+ ${b}`);let x=No(o);try{await Ua(x);let w=(await Da(x,"utf-8")).trim();w&&(y+=`
41
41
 
42
42
  # Long-Term Memory
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(`
43
+ ${w}`)}catch{}return y},c=s.generateToolDefinitions(),l=t.stream??r.stream_output??!1,u=Tt(o,t),p=Do(u,n),h=new pt(p);return{tools:i,dispose:async()=>{e.dispose&&await e.dispose(),await s.dispose()},callLLM:e.callLLM??(async(y,b,x)=>{let w=Le(r,t.providerName),_=process.env[w.env_api_key]??process.env.OPENAI_API_KEY??process.env.DEEPSEEK_API_KEY;if(!_)throw new Error(`Missing env var ${w.env_api_key} (or OPENAI_API_KEY/DEEPSEEK_API_KEY)`);let k=new Na({apiKey:_,baseURL:w.base_url}),d=c.length>0?c.map(v=>({type:"function",function:{name:v.name,description:v.description,parameters:v.input_schema}})):void 0;if(l){let v=await k.chat.completions.create({model:w.model,messages:y,stream:!0},{signal:x?.signal}),E="";for await(let B of v){let I=B.choices?.[0]?.delta?.content;I&&(E+=I,b?.(I))}return{content:E,streamed:!0}}else{let v=await k.chat.completions.create({model:w.model,messages:y,tools:d,tool_choice:d?"auto":void 0},{signal:x?.signal}),E=v.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 M of E.tool_calls)if(M.type==="function"){let C=Ha(M.function.arguments);C.ok?I.push({type:"tool_use",id:M.id,name:M.function.name,input:C.data}):I.push({type:"text",text:`[tool_use parse error] ${C.error}; raw: ${C.raw}`})}let ue=I.some(M=>M.type==="tool_use");return{content:I,stop_reason:ue?"tool_use":"end_turn",usage:{prompt:v.usage?.prompt_tokens??void 0,completion:v.usage?.completion_tokens??void 0,total:v.usage?.total_tokens??void 0}}}let B=E?.content;if(typeof B!="string")throw new Error("OpenAI-compatible API returned empty content");return{content:[{type:"text",text:B}],stop_reason:"end_turn",usage:{prompt:v.usage?.prompt_tokens??void 0,completion:v.usage?.completion_tokens??void 0,total:v.usage?.total_tokens??void 0}}}}),loadPrompt:a,historySinks:e.historySinks??[h],tokenCounter:e.tokenCounter??Io(t.tokenizerModel),historyFilePath:p}}import{jsonrepair as ja}from"jsonrepair";function an(e){try{return JSON.parse(e)}catch{try{let t=ja(e);return JSON.parse(t)}catch{return null}}}function Ba(e){let t=[],n=new Set,o=/```(?:json)?\s*([\s\S]*?)\s*```/g,r;for(;(r=o.exec(e))!==null;){let i=r[1]||"";if(!i)continue;let a=Fa(i);if(!(!a||n.has(a)))try{let c=an(a);if(c===null)continue;t.push({json:a,start:r.index,end:r.index+r[0].length,obj:c}),n.add(a)}catch{}}let s=Go(e);for(let{json:i,start:a,end:c}of s)if(!n.has(i)&&!(!i.includes('"tool"')&&!i.includes('"final"')))try{let l=an(i);if(l===null)continue;t.push({json:i,start:a,end:c,obj:l}),n.add(i)}catch{}return t}function Fa(e){return Go(e)[0]?.json??null}function Go(e){let t=[],n=0,o=-1,r=!1,s=!1;for(let i=0;i<e.length;i++){let a=e[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=e.slice(o,i+1);t.push({json:c,start:o,end:i+1}),o=-1}}}return t}function Va(e){let t=[],n=/<\s*(think|thinking)\s*>([\s\S]*?)<\/\s*\1\s*>/gi,o=e.replace(n,(r,s,i)=>{let a=(i??"").trim();return a&&t.push(a),a});return{thinkingParts:t,cleaned:o.trim()}}function cn(e){if(e.length===0)return;let t=e.join(`
44
+ `),{thinkingParts:n,cleaned:o}=Va(t);return n.length>0?n.join(`
45
45
 
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(`
46
+ `):o||void 0}function Fo(e){return e!==null&&typeof e=="object"&&"tool"in e&&typeof e.tool=="string"}function Vo(e){return e!==null&&typeof e=="object"&&"final"in e&&typeof e.final=="string"}function zo(e){let t={},n=Ba(e);for(let{json:r,start:s,end:i,obj:a}of n){if(Fo(a)){t.action={tool:a.tool.trim(),input:a.input};let c=e.slice(0,s).trim(),l=e.slice(i).trim(),u=[];c&&u.push(c),l&&u.push(l);let p=cn(u);return p&&(t.thinking=p),t}if(Vo(a))return t.final=a.final,t}let o=e.trim();if(o.startsWith("{")&&o.endsWith("}")){let r=an(o);if(r&&Fo(r))return t.action={tool:r.tool,input:r.input},t;if(r&&Vo(r))return t.final=r.final,t}return e.trim()&&(t.final=e),t}import{randomUUID as Xo}from"crypto";function Ga(){return{onTurnStart:[],onAction:[],onObservation:[],onFinal:[],onApprovalRequest:[],onApprovalResponse:[]}}function Wo(e,t){t&&(t.onTurnStart&&e.onTurnStart.push(t.onTurnStart),t.onAction&&e.onAction.push(t.onAction),t.onObservation&&e.onObservation.push(t.onObservation),t.onFinal&&e.onFinal.push(t.onFinal),t.onApprovalRequest&&e.onApprovalRequest.push(t.onApprovalRequest),t.onApprovalResponse&&e.onApprovalResponse.push(t.onApprovalResponse))}function Ko(e){let t=Ga();if(Wo(t,e.hooks),Array.isArray(e.middlewares))for(let n of e.middlewares)Wo(t,n);return t}async function Z(e,t,n){let o=e[t];if(o.length)for(let r of o)try{await r(n)}catch(s){console.warn(`Hook ${t} failed: ${s.message}`)}}function Be(e){return e.map(t=>({...t}))}var ln={read:"read",glob:"read",grep:"read",webfetch:"read",todo:"read",save_memory:"write",write:"write",edit:"write",bash:"execute"};var Ct={read:0,write:1,execute:2},un={read:e=>`${e} \u5C06\u8BFB\u53D6\u6587\u4EF6\u6216\u6570\u636E`,write:e=>`${e} \u5C06\u4FEE\u6539\u6216\u521B\u5EFA\u6587\u4EF6`,execute:e=>`${e} \u5C06\u6267\u884C\u7CFB\u7EDF\u547D\u4EE4`};function pn(e){let t={...ln,...e?.customLevels};return{getRiskLevel(n){if(n in t)return t[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 Ct[n]-Ct[o]},needsApproval(n,o){return o==="strict"?!0:n==="write"||n==="execute"}}}import{createHash as za}from"crypto";function Et(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?"["+e.map(n=>Et(n)).join(",")+"]":`{${Object.entries(e).sort(([n],[o])=>n.localeCompare(o)).map(([n,o])=>`${JSON.stringify(n)}:${Et(o)}`).join(",")}}`}function mn(e,t){let n=Et(t),o=`${e}:${n}`;return za("sha256").update(o).digest("hex").slice(0,16)}function dn(e){let{mode:t="auto",dangerous:n=!1,toolRiskLevels:o}=e||{};if(n)return{isDangerousMode:!0,getRiskLevel:()=>"read",check:()=>({needApproval:!1,decision:"auto-execute"}),recordDecision:()=>{},isGranted:()=>!0,clearOnceApprovals:()=>{},dispose:()=>{}};let r=pn({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,t))return{needApproval:!1,decision:"auto-execute"};let l=mn(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:un[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 Yo="interactive",Wa=12e4;function Jo(){return{prompt:0,completion:0,total:0}}function qo(e,t){if(!t)return;let n=t.prompt??0,o=t.completion??0,r=t.total??n+o;e.prompt+=n,e.completion+=o,e.total+=r}function Ka(e){if(typeof e=="string")return{textContent:e,toolUseBlocks:[]};if("content"in e&&typeof e.content=="string")return{textContent:e.content,toolUseBlocks:[],usage:"usage"in e?e.usage:void 0,streamed:"streamed"in e?e.streamed:void 0};if("content"in e&&Array.isArray(e.content)){let t=e.content.filter(o=>o.type==="text"),n=e.content.filter(o=>o.type==="tool_use");return{textContent:t.map(o=>o.text).join(`
47
+ `),toolUseBlocks:n.map(o=>({id:o.id,name:o.name,input:o.input})),stopReason:"stop_reason"in e?e.stop_reason:void 0,usage:"usage"in e?e.usage:void 0}}return{textContent:"",toolUseBlocks:[]}}async function Ja(e,t){for(let n of t)try{await n.append(e)}catch(o){console.error(`Failed to write history event: ${o.message}`)}}function qa(e){return(e.content?.flatMap(n=>n.type==="text"?[n.text]:[])??[]).join(`
48
+ `)}function Xa(e,t){let n=t;if(typeof t=="string"){let o=t.trim();if(o)try{n=JSON.parse(o)}catch{n=o}else n={}}return typeof n!="object"||n===null?{ok:!1,error:`${e.name} invalid input: expected object`}:typeof e.validateInput=="function"?e.validateInput(n):{ok:!0,data:n}}function Ya(e){return e instanceof Error&&e.name==="AbortError"}function At(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(n=>At(n)).join(",")}]`:`{${Object.entries(e).sort(([n],[o])=>n.localeCompare(o)).map(([n,o])=>`${JSON.stringify(n)}:${At(o)}`).join(",")}}`}var fn=class{constructor(t,n,o,r,s){this.deps=t;this.options=n;this.id=n.sessionId||Xo(),this.mode=n.mode||Yo,this.history=[{role:"system",content:o}],this.tokenCounter=r,this.sinks=t.historySinks??[],this.hooks=Ko(t),this.historyFilePath=s,this.approvalManager=dn({dangerous:n.dangerous??!1,mode:"auto"})}id;mode;history;historyFilePath;turnIndex=0;tokenCounter;sinks;sessionUsage=Jo();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(t,n){let o=`${t}:${At(n)}`;if(this.lastActionSignature===o?this.repeatedActionCount+=1:(this.lastActionSignature=o,this.repeatedActionCount=1),this.repeatedActionCount===3){let r=At(n).slice(0,200),s=`\u7CFB\u7EDF\u63D0\u9192\uFF1A\u4F60\u5DF2\u8FDE\u7EED3\u6B21\u8C03\u7528\u540C\u4E00\u5DE5\u5177\u300C${t}\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(t,n,o,r){let s=this.approvalManager.check(t,n);if(!s.needApproval)return this.doExecuteTool(t,n);let i={toolName:s.toolName,params:s.params,fingerprint:s.fingerprint,riskLevel:s.riskLevel,reason:s.reason};await Z(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 Z(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: ${t}`,rejected:!0}:this.doExecuteTool(t,n)}async doExecuteTool(t,n){let o=this.deps.tools[t];if(!o)return{success:!1,observation:`Unknown tool: ${t}`};try{let r=Xa(o,n);if(!r.ok)return{success:!1,observation:r.error};let s=await o.execute(r.data);return{success:!0,observation:qa(s)||"(no tool output)"}}catch(r){return{success:!1,observation:`Tool execution failed: ${r.message}`}}}async runTurn(t){let n=new AbortController;this.currentAbortController=n,this.cancelling=!1,this.turnIndex+=1;let o=this.turnIndex,r=[],s=Jo(),i=Date.now(),a=this.options.maxPromptTokens??Wa;this.sessionStartEmitted||(await this.emitEvent("session_start",{meta:{mode:this.mode,tokenizer:this.tokenCounter.model,warnPromptTokens:this.options.warnPromptTokens,maxPromptTokens:a}}),this.sessionStartEmitted=!0),this.history.push({role:"user",content:t});try{let c=this.tokenCounter.countMessages(this.history);await this.emitEvent("turn_start",{turn:o,content:t,meta:{tokens:{prompt:c}}}),await Z(this.hooks,"onTurnStart",{sessionId:this.id,turn:o,input:t,promptTokens:c,history:Be(this.history)});let l="",u="ok",p;for(let h=0;;h++){let y=this.tokenCounter.countMessages(this.history);if(y>a){let C=`Context tokens (${y}) exceed the limit. Please shorten the input or restart the session.`,P=JSON.stringify({final:C});this.history.push({role:"assistant",content:P}),u="prompt_limit",l=C,p=C,await this.emitEvent("final",{turn:o,step:h,content:C,role:"assistant",meta:{tokens:{prompt:y}}}),await Z(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:h,finalText:C,status:u,errorMessage:p,turnUsage:{...s},steps:r});break}this.options.warnPromptTokens&&y>this.options.warnPromptTokens&&console.warn(`Prompt tokens are near the limit: ${y}`);let b="",x=[],w,_=!1,k;try{let C=await this.deps.callLLM(this.history,V=>this.deps.onAssistantStep?.(V,h),{signal:n.signal}),P=Ka(C);b=P.textContent,x=P.toolUseBlocks,k=P.stopReason,w=P.usage,_=!!P.streamed}catch(C){if(this.cancelling&&Ya(C)){u="cancelled",l="",p="Turn cancelled",await this.emitEvent("final",{turn:o,step:h,content:"",role:"assistant",meta:{cancelled:!0}}),await Z(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:h,finalText:l,status:u,errorMessage:p,turnUsage:{...s},steps:r});break}let P=`LLM call failed: ${C.message}`,V=JSON.stringify({final:P});this.history.push({role:"assistant",content:V}),u="error",l=P,p=P,await this.emitEvent("final",{turn:o,content:P,role:"assistant"}),await Z(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:h,finalText:l,status:u,errorMessage:p,turnUsage:{...s},steps:r});break}_||this.deps.onAssistantStep?.(b,h);let d;if(x.length>0){let C=x[0];if(C){let P=b?cn([b]):void 0;d={action:{tool:C.name,input:C.input},thinking:P}}else d={}}else b?d=zo(b):d={};let v=d.action?JSON.stringify({tool:d.action.tool,input:d.action.input}):d.final?JSON.stringify({final:d.final}):b;this.history.push({role:"assistant",content:v});let E=this.tokenCounter.countText(b),B=w?.prompt??y,I=w?.completion??E,ue=w?.total??B+I,M={prompt:B,completion:I,total:ue};if(qo(s,M),qo(this.sessionUsage,M),r.push({index:h,assistantText:b,parsed:d,tokenUsage:M}),await this.emitEvent("assistant",{turn:o,step:h,content:b,role:"assistant",meta:{tokens:M}}),x.length>1){for(let D of x)this.maybeWarnRepeatedAction(D.name,D.input);await this.emitEvent("action",{turn:o,step:h,meta:{tools:x.map(D=>D.name),parallel:!0,thinking:d.thinking,toolBlocks:x.map(D=>({name:D.name,input:D.input}))}});let C=x[0];C&&await Z(this.hooks,"onAction",{sessionId:this.id,turn:o,step:h,action:{tool:C.name,input:C.input},parallelActions:x.map(D=>({tool:D.name,input:D.input})),thinking:d.thinking,history:Be(this.history)});let P=[],V=!1;for(let[D,re]of x.entries()){let se=await this.executeToolWithApproval(re.name,re.input,o,h);if(se.rejected){V=!0,P.push(`[${re.name}]: ${se.observation}`),await this.emitEvent("observation",{turn:o,step:h,content:se.observation,meta:{tool:re.name,index:D}});break}P.push(`[${re.name}]: ${se.observation}`),await this.emitEvent("observation",{turn:o,step:h,content:se.observation,meta:{tool:re.name,index:D}})}let ee=P.join(`
49
49
 
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
- `).map(e=>e.length>0?` ${e}`:"").join(`
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,`
50
+ `);this.history.push({role:"user",content:JSON.stringify({observation:ee})});let ye=r[r.length-1];if(ye&&(ye.observation=ee),await Z(this.hooks,"onObservation",{sessionId:this.id,turn:o,step:h,tool:x.map(D=>D.name).join(", "),observation:ee,history:Be(this.history)}),V){u="cancelled",l="\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:h,content:l,role:"assistant",meta:{rejected:!0}}),await Z(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:h,finalText:l,status:u,tokenUsage:M,turnUsage:{...s},steps:r});break}continue}else if(d.action){this.maybeWarnRepeatedAction(d.action.tool,d.action.input),await this.emitEvent("action",{turn:o,step:h,meta:{tool:d.action.tool,input:d.action.input,thinking:d.thinking}}),await Z(this.hooks,"onAction",{sessionId:this.id,turn:o,step:h,action:d.action,thinking:d.thinking,history:Be(this.history)});let C=await this.executeToolWithApproval(d.action.tool,d.action.input,o,h);if(C.rejected){u="cancelled",l="\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:h,content:l,role:"assistant",meta:{rejected:!0}}),await Z(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:h,finalText:l,status:u,tokenUsage:M,turnUsage:{...s},steps:r});break}let P=C.observation;this.history.push({role:"user",content:JSON.stringify({observation:P,tool:d.action.tool})});let V=r[r.length-1];V&&(V.observation=P),await this.emitEvent("observation",{turn:o,step:h,content:P,meta:{tool:d.action.tool}}),await Z(this.hooks,"onObservation",{sessionId:this.id,turn:o,step:h,tool:d.action.tool,observation:P,history:Be(this.history)});continue}if(k==="end_turn"||d.final){this.resetActionRepetition(),l=d.final||b,d.final&&(d.final=l),await this.emitEvent("final",{turn:o,step:h,content:l,role:"assistant",meta:{tokens:M}}),await Z(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:h,finalText:l,status:u,tokenUsage:M,turnUsage:{...s},steps:r});break}this.resetActionRepetition();break}if(!l&&u!=="cancelled"){u==="ok"&&(u="error"),l="Unable to produce a final answer. Please retry or adjust the request.",p=l;let h=JSON.stringify({final:l});this.history.push({role:"assistant",content:h}),await this.emitEvent("final",{turn:o,content:l,role:"assistant"}),await Z(this.hooks,"onFinal",{sessionId:this.id,turn:o,finalText:l,status:u,errorMessage:p,turnUsage:{...s},steps:r})}return await this.emitEvent("turn_end",{turn:o,meta:{status:u,stepCount:r.length,durationMs:Date.now()-i,tokens:s}}),{finalText:l,steps:r,status:u,errorMessage:p,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(t,n){if(!this.sinks.length)return;let o=zn({sessionId:this.id,type:t,turn:n.turn,step:n.step,content:n.content,role:n.role,meta:n.meta});await Ja(o,this.sinks)}};async function Ye(e,t={}){let n=t.sessionId||Xo(),o=await Bo(e,{...t,sessionId:n},n),r=await o.loadPrompt(),s=new fn({...e,...o},{...t,sessionId:n,mode:t.mode??Yo},r,o.tokenCounter,o.historyFilePath);return await s.init(),s}import{useCallback as W,useEffect as jt,useMemo as In,useRef as it,useState as K}from"react";import{readFile as su}from"fs/promises";import"path";import{randomUUID as at}from"crypto";import{exec as iu}from"child_process";import{promisify as au}from"util";import{Box as Qr,useApp as cu,Text as lu}from"ink";import{Box as Zo,Text as Za}from"ink";import{memo as Qa}from"react";import{jsx as Qo,jsxs as ec}from"react/jsx-runtime";var er=Qa(function({contextPercent:t=0}){let n=t>0?` ${t.toFixed(1)}%`:" 0.0%";return Qo(Zo,{justifyContent:"flex-end",children:Qo(Zo,{marginTop:8,children:ec(Za,{color:"gray",children:["context:",n]})})})});import{Box as xe,Static as Cc,Text as le}from"ink";import{memo as Ec}from"react";import Ac from"os";import{Box as tc,Text as tr}from"ink";import{memo as nc}from"react";import{jsx as oc,jsxs as nr}from"react/jsx-runtime";var or=nc(function({message:t}){return nr(tc,{flexDirection:"column",gap:0,children:[nr(tr,{color:"cyan",children:["\u25CF ",t.title]}),oc(tr,{color:"gray",children:t.content})]})});import{Box as _c,Text as kc}from"ink";import{memo as bc}from"react";import{Box as Ze,Text as ce}from"ink";import{memo as fc}from"react";import{Box as gn,Text as G}from"ink";import{marked as rc}from"marked";import{useMemo as rr,memo as sc}from"react";import{jsx as Q,jsxs as Fe}from"react/jsx-runtime";var ic="#2b2b2b";function Mt(e){return e?[{type:"text",raw:e,text:e}]:[]}function ac(e,t,n){switch(e.type){case"text":return e.tokens&&e.tokens.length>0?ke(e.tokens,t,`${n}-text`):e.text;case"escape":return e.text;case"strong":return Q(G,{bold:!0,children:ke(e.tokens,t,`${n}-strong`)},n);case"em":return Q(G,{italic:!0,children:ke(e.tokens,t,`${n}-em`)},n);case"codespan":return Q(G,{color:t.codeColor,backgroundColor:ic,children:e.text},n);case"del":return Q(G,{strikethrough:!0,children:ke(e.tokens,t,`${n}-del`)},n);case"link":{let o=e.tokens&&e.tokens.length>0?ke(e.tokens,t,`${n}-link`):e.text,r=e.href&&e.text&&e.text!==e.href?` (${e.href})`:"";return Fe(G,{underline:!0,color:t.linkColor,children:[o,r]},n)}case"image":{let o=e.text||"image";return Fe(G,{color:t.linkColor,children:["[",o,"](",e.href,")"]},n)}case"br":return`
51
+ `;case"checkbox":return e.checked?"[x]":"[ ]";case"html":return e.text;default:return"text"in e?e.text:e.raw}}function ke(e,t,n){return!e||e.length===0?[]:e.flatMap((o,r)=>{let s=`${n}-${r}`,i=ac(o,t,s);return Array.isArray(i)?i:[i]})}function cc(e){let t=e.tokens[0];return t?.type==="paragraph"||t?.type==="text"?t.tokens??Mt(t.text):e.tokens.length>0?e.tokens:Mt(e.text)}function lc(e){return e.split(`
52
+ `).map(t=>t.length>0?` ${t}`:"").join(`
53
+ `).trimEnd()}function uc(e){let t=e.header.map(r=>r.text).join(" | "),n=e.header.map(()=>"---").join(" | "),o=e.rows.map(r=>r.map(s=>s.text).join(" | "));return[t,n,...o].join(`
54
+ `)}function pc(e){return e.type==="table"&&"header"in e&&"rows"in e&&"align"in e}function mc(e,t,n){switch(e.type){case"space":case"def":return null;case"heading":return Q(G,{bold:!0,color:t.textColor,children:ke(e.tokens,t,`${n}-heading`)},n);case"paragraph":{let o=e.tokens??Mt(e.text);return Q(G,{color:t.textColor,children:ke(o,t,`${n}-para`)},n)}case"text":{let o=e.tokens??Mt(e.text);return Q(G,{color:t.textColor,children:ke(o,t,`${n}-text`)},n)}case"code":{let o=lc(e.text);return Q(G,{color:t.codeColor,children:o},n)}case"list":{let o=typeof e.start=="number"?e.start:1;return Q(gn,{flexDirection:"column",children:e.items.map((r,s)=>{let i=e.ordered?`${o+s}.`:"-",a=r.task?r.checked?"[x] ":"[ ] ":"",c=cc(r);return Fe(gn,{children:[Fe(G,{color:t.textColor,children:[i," "]}),Fe(G,{color:t.textColor,children:[a,ke(c,t,`${n}-item-${s}`)]})]},`${n}-item-${s}`)})},n)}case"blockquote":return Fe(G,{color:"gray",dimColor:!0,children:["> ",e.text.trim()]},n);case"hr":return Q(G,{color:"gray",children:"---"},n);case"table":return pc(e)?Q(G,{color:t.textColor,children:uc(e)},n):Q(G,{color:t.textColor,children:"text"in e?e.text:e.raw},n);case"html":return Q(G,{color:t.textColor,children:e.text},n);default:return Q(G,{color:t.textColor,children:"text"in e?e.text:e.raw},n)}}function dc(e,t,n){return e.flatMap((o,r)=>{let s=mc(o,t,`${n}-${r}`);return s?[s]:[]})}var Ve=sc(function({text:t,tone:n="normal"}){let o=rr(()=>({textColor:n==="muted"?"gray":void 0,codeColor:n==="muted"?"gray":"cyan",linkColor:n==="muted"?"gray":"blue",muted:n==="muted"}),[n]),r=rr(()=>{let s=rc.lexer(t,{gfm:!0,breaks:!0});return dc(s,o,"markdown")},[t,o]);return Q(gn,{flexDirection:"column",gap:1,children:r})});import{Fragment as hn,jsx as J,jsxs as Ge}from"react/jsx-runtime";function sr(e){if(!e)return;if(typeof e=="string")return e.length>50?e.slice(0,47)+"...":e;if(typeof e!="object"||Array.isArray(e))return;let t=e,n=["file_path","path","file","filename","url","command","pattern","glob","query","content","cwd","dir"];for(let o of n)if(t[o]){let r=String(t[o]);return r.length>50?r.slice(0,47)+"...":r}for(let[o,r]of Object.entries(t))if(typeof r=="string"&&o!=="description")return r.length>50?r.slice(0,47)+"...":r}function gc(e,t){let n=e.step,o=t.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 ir=fc(function({step:t}){let n=t.action?.tool,o=t.action?.input,r=sr(o),s=t.parallelActions??[],i=s.length>1;return Ge(Ze,{flexDirection:"column",gap:0,children:[t.thinking&&Ge(Ze,{children:[J(ce,{color:"gray",children:"\u25CF "}),J(Ze,{flexDirection:"column",flexGrow:1,children:J(Ve,{text:t.thinking,tone:"muted"})})]}),i&&J(hn,{children:s.map((a,c)=>{let l=sr(a.input);return Ge(Ze,{children:[J(ce,{color:"green",children:"\u25CF "}),J(ce,{color:"gray",children:"Used "}),J(ce,{color:"cyan",children:a.tool}),l&&Ge(hn,{children:[J(ce,{color:"gray",children:" ("}),J(ce,{color:"cyan",children:l}),J(ce,{color:"gray",children:")"})]})]},c)})}),!i&&n&&Ge(Ze,{children:[J(ce,{color:"green",children:"\u25CF "}),J(ce,{color:"gray",children:"Used "}),J(ce,{color:"cyan",children:n}),r&&Ge(hn,{children:[J(ce,{color:"gray",children:" ("}),J(ce,{color:"cyan",children:r}),J(ce,{color:"gray",children:")"})]})]})]})},gc);import{Box as hc,Text as ar}from"ink";import{memo as yc}from"react";import{jsx as cr,jsxs as xc}from"react/jsx-runtime";var lr=yc(function({text:t}){return xc(hc,{paddingY:1,children:[cr(ar,{color:"gray",children:"\u203A "}),cr(ar,{color:"white",children:t})]})});import{Box as Qe,Text as Oe}from"ink";import{memo as yn,useMemo as vc}from"react";import{Fragment as Sc,jsx as me,jsxs as Pt}from"react/jsx-runtime";function Tc(e){let t=/<\s*(think|thinking)\s*>([\s\S]*?)<\/\s*\1\s*>/gi,n=[],o,r=0,s=[];for(;(o=t.exec(e))!==null;){s.push({start:o.index,end:t.lastIndex});let a=o[2]?.trim();a&&n.push(a)}if(s.length===0)return{content:e,thinking:null};let i="";r=0;for(let{start:a,end:c}of s)i+=e.slice(r,a),r=c;return i+=e.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 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:
58
+ `):null}}var ur=yn(function({text:t,isThinking:n=!1}){let{content:o,thinking:r}=vc(()=>Tc(t),[t]);return n?me(Qe,{flexDirection:"column",flexGrow:1,children:me(Ve,{text:t,tone:"muted"})}):Pt(Qe,{flexDirection:"column",flexGrow:1,gap:1,children:[r&&me(Qe,{flexDirection:"column",paddingLeft:2,children:me(Ve,{text:r,tone:"muted"})}),me(Ve,{text:o,tone:"normal"})]})}),Pd=yn(function({text:t}){return me(Qe,{children:Pt(Oe,{color:"gray",children:["\u2022 ",t]})})}),Rd=yn(function({toolName:t,fileName:n}){return Pt(Qe,{children:[me(Oe,{color:"green",children:"\u25CF "}),me(Oe,{color:"gray",children:"Used "}),me(Oe,{color:"cyan",children:t}),n&&Pt(Sc,{children:[me(Oe,{color:"gray",children:" ("}),me(Oe,{color:"cyan",children:n}),me(Oe,{color:"gray",children:")"})]})]})});import{jsx as xn,jsxs as pr}from"react/jsx-runtime";function wc(e,t){let n=e.turn,o=t.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 vn=bc(function({turn:t}){let n=t.finalText?.trim()??"",o=n.length>0;return pr(_c,{flexDirection:"column",children:[xn(lr,{text:t.userInput}),t.steps.map(r=>xn(ir,{step:r},`step-${t.index}-${r.index}`)),o?xn(ur,{text:n,isThinking:!1}):null,t.status&&t.status!=="ok"?pr(kc,{color:"red",children:["Status: ",t.status]}):null]})},wc);import{jsx as q,jsxs as he}from"react/jsx-runtime";function Mc(e){let t=Ac.homedir();return t&&e.startsWith(t)?`~${e.slice(t.length)}`:e}function Pc(e){return e.length>16?`${e.slice(0,8)}...${e.slice(-4)}`:e}function Rc(e,t){if(e.headerInfo?.sessionId!==t.headerInfo?.sessionId||e.headerInfo?.model!==t.headerInfo?.model||e.headerInfo?.providerName!==t.headerInfo?.providerName||e.headerInfo?.cwd!==t.headerInfo?.cwd||e.headerInfo?.version!==t.headerInfo?.version||e.headerInfo?.mcpNames?.length!==t.headerInfo?.mcpNames?.length)return!1;if(e.headerInfo?.mcpNames&&t.headerInfo?.mcpNames){let n=e.headerInfo.mcpNames,o=t.headerInfo.mcpNames;for(let r=0;r<n.length;r++)if(n[r]!==o[r])return!1}if(e.systemMessages.length!==t.systemMessages.length)return!1;for(let n=0;n<e.systemMessages.length;n++)if(e.systemMessages[n]?.id!==t.systemMessages[n]?.id)return!1;if(e.turns.length!==t.turns.length)return!1;for(let n=0;n<e.turns.length;n++)if(e.turns[n]!==t.turns[n])return!1;return!0}var mr=Ec(function({systemMessages:t,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 t)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 he(xe,{flexDirection:"column",gap:0,children:[q(Cc,{items:c,children:u=>{if(u.type==="header"&&u.data){let p=u.data;return he(xe,{borderStyle:"round",borderColor:"blueBright",paddingX:2,paddingY:1,flexDirection:"column",gap:1,children:[q(xe,{gap:1,alignItems:"center",children:he(xe,{flexDirection:"column",children:[q(le,{bold:!0,children:"Welcome to Memo Code CLI!"}),q(le,{color:"gray",children:"Send /help for help information."})]})}),he(xe,{flexDirection:"column",gap:0,children:[he(xe,{children:[q(le,{color:"gray",children:"Directory: "}),q(le,{color:"cyan",children:Mc(p.cwd)})]}),he(xe,{children:[q(le,{color:"gray",children:"Session: "}),q(le,{color:"cyan",children:Pc(p.sessionId)})]}),he(xe,{children:[q(le,{color:"gray",children:"Model: "}),q(le,{color:"cyan",children:p.model}),he(le,{color:"gray",children:[" ","(powered by ",p.providerName,")"]})]}),he(xe,{children:[q(le,{color:"gray",children:"Version: "}),he(le,{color:"cyan",children:["v",p.version]})]}),he(xe,{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(or,{message:u.data},u.data.id):u.type==="turn"?q(vn,{turn:u.data},`turn-${u.data.index}`):null}}),a&&q(vn,{turn:a},`turn-live-${a.index}`)]})},Rc);import{useCallback as Ur,useEffect as An,useMemo as Tl,useRef as Mn,useState as Ae}from"react";import{readFile as Sl,readdir as _l,stat as kl}from"fs/promises";import{basename as bl,join as wl,resolve as Hr}from"path";import{Box as Dt,Text as Ne,useInput as Cl}from"ink";var kr=Vn(Sr(),1);import{readFile as Zc,readdir as Qc}from"fs/promises";import{join as _r,relative as el,sep as tl}from"path";var nl=6,ol=2500,br=25,rl=[".git",".svn",".hg","node_modules","dist","build",".next",".turbo",".cache",".output","coverage","tmp","temp","logs","*.log"],Lt=new Map;function sl(e){return e.split(tl).join("/")}function il(e,t){return JSON.stringify({maxDepth:e.maxDepth,maxEntries:e.maxEntries,respectGitIgnore:e.respectGitIgnore,ignoreGlobs:e.ignoreGlobs,gitignore:t})}function al(e){return{maxDepth:typeof e.maxDepth=="number"?Math.max(1,e.maxDepth):nl,maxEntries:typeof e.maxEntries=="number"?Math.max(100,e.maxEntries):ol,limit:typeof e.limit=="number"?Math.max(1,e.limit):br,respectGitIgnore:e.respectGitIgnore!==!1,ignoreGlobs:e.ignoreGlobs?.length?e.ignoreGlobs:[]}}async function cl(e,t){if(!t)return"";try{return await Zc(_r(e,".gitignore"),"utf8")}catch{}return""}async function ll(e,t){let n=await cl(t,e.respectGitIgnore),o=(0,kr.default)();o.add(rl),e.ignoreGlobs.length&&o.add(e.ignoreGlobs),n.trim()&&o.add(n);let r=il(e,n);return Object.assign(o,{__memoSignature:r})}async function ul(e,t,n){let o=[],r=t.maxEntries,s=async(i,a)=>{if(o.length>=r)return;let c;try{c=await Qc(i,{withFileTypes:!0})}catch{return}for(let l of c){if(o.length>=r)break;if(l.isSymbolicLink())continue;let u=_r(i,l.name),p=el(e,u);if(!p)continue;let h=sl(p);if(n.ignores(h))continue;let y=h.split("/").filter(Boolean),b=y.map(w=>w.toLowerCase()),x=l.isDirectory();if(o.push({path:h,pathLower:h.toLowerCase(),segments:y,segmentsLower:b,depth:a,isDir:x}),o.length>=r)break;x&&a<t.maxDepth&&await s(u,a+1)}};return await s(e,0),o.sort((i,a)=>i.path.localeCompare(a.path)),{entries:o,signature:n.__memoSignature}}async function pl(e,t){let n=al(t),o=await ll(n,e),r=o.__memoSignature,s=Lt.get(e);if(s&&s.signature===r)return s.pending?s.pending:s.entries;let i=ul(e,n,o).then(a=>(Lt.set(e,{entries:a.entries,signature:a.signature}),a.entries)).catch(a=>{throw Lt.delete(e),a});return Lt.set(e,{entries:[],signature:r,pending:i}),i}function ml(e){return e.depth+(e.isDir?-.2:.2)}function dl(e,t){if(!t.length)return ml(e);let n=e.depth,o=0;for(let r of t){let s=-1;for(let i=o;i<e.segmentsLower.length;i++){let a=e.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 e.isDir&&(n-=.5),n}function fl(e,t,n){let s=t.trim().replace(/\\/g,"/").split("/").filter(Boolean).map(a=>a.toLowerCase()),i=[];for(let a of e){let c=dl(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 wr(e){let t=await pl(e.cwd,e),n=typeof e.limit=="number"?Math.max(1,e.limit):br;return fl(t,e.query,n)}import{mkdir as Qd,readFile as ef,writeFile as tf}from"fs/promises";import{dirname as of}from"path";import{randomUUID as sf}from"crypto";import{Box as tt,Text as Ke}from"ink";import{jsx as we,jsxs as Er}from"react/jsx-runtime";var gl="#3a3a3a",Ot="#2b2b2b",Cr="#888888",hl="#666666";function Ar({items:e,activeIndex:t,loading:n}){return n?we(tt,{flexDirection:"column",paddingX:1,backgroundColor:Ot,children:we(Ke,{color:"gray",children:"Loading..."})}):e.length?we(tt,{flexDirection:"column",backgroundColor:Ot,children:e.map((o,r)=>{let s=r===t,i=s?gl:Ot;return o.kind==="slash"?Er(tt,{flexDirection:"row",gap:2,paddingX:1,backgroundColor:i,children:[we(Ke,{color:s?"cyan":"white",bold:s,children:o.title}),o.subtitle?we(Ke,{color:Cr,children:o.subtitle}):null]},o.id):Er(tt,{flexDirection:"row",gap:1,paddingX:1,backgroundColor:i,children:[we(Ke,{color:s?"cyan":"white",bold:s,children:o.title}),o.subtitle?we(Ke,{color:Cr,children:o.subtitle}):null]},o.id)})}):we(tt,{flexDirection:"column",paddingX:1,backgroundColor:Ot,children:we(Ke,{color:hl,children:"No matches"})})}var Cn=[{name:"help",description:"Show help and shortcuts"},{name:"exit",description:"Exit the session"},{name:"new",description:"Start a new session"},{name:"resume",description:"Resume session history"},{name:"models",description:"Select a model (from configured providers)"},{name:"context",description:"Set context length limit (80k/120k/150k/200k) (starts new session)"},{name:"mcp",description:"Show configured MCP servers"},{name:"init",description:"Generate AGENTS.md for current project"}],yl=Object.fromEntries(Cn.map(e=>[e.name,e.description]));function X(e){return yl[e]}function Mr(){let e=Cn.reduce((t,n)=>Math.max(t,n.name.length),0);return Cn.map(t=>` /${t.name.padEnd(e)} ${t.description}`)}var Pr={name:"new",description:X("new"),run:({closeSuggestions:e,setInputValue:t,clearScreen:n,showSystemMessage:o,newSession:r})=>{e(),t(""),n(),o("New Session","Starting a new session..."),r?.()}};var Rr={name:"exit",description:X("exit"),run:({closeSuggestions:e,exitApp:t})=>{e(),t()}};var $r={name:"resume",description:X("resume"),run:({closeSuggestions:e,setInputValue:t,showSystemMessage:n})=>{e(!1),t("resume "),n("Resume",'Type "resume" followed by keywords to filter and select from session history.')}};var Ir={name:"models",description:X("models"),run:({closeSuggestions:e,setInputValue:t,showSystemMessage:n,data:o})=>{e(!1);let{providers:r,providerName:s,model:i}=o;if(!r.length){n("Models",`No providers configured. Check ${o.configPath}`),t("");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}`});t("/models "),n("Models",`Available models:
59
59
  ${a.join(`
60
- `)}`)}};var qc=`Available commands:
61
- /help Show help and shortcuts
62
- /exit Exit the session
63
- exit Exit the session (no slash)
64
- /new Start a new session
65
- /models Pick a model from config
66
- /resume Resume session history
67
- /context Show or set context length (e.g. /context 120k)
68
- /mcp Show configured MCP servers
69
- /init Generate AGENTS.md for current project
70
-
71
- Shortcuts:
72
- Enter Send message
73
- Shift+Enter New line in input
74
- Up/Down Browse input history
75
- Tab Accept suggestion
76
- Ctrl+L Start a new session
77
- Ctrl+C Exit
78
- exit Type in input to exit
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
-
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(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
- /help Show help and shortcuts
89
- /exit Exit the session
60
+ `)}`)}};var xl=Mr().join(`
61
+ `),Nt=`Available commands:
62
+ ${xl}
90
63
  exit Exit the session (no slash)
91
- /new Start a new session
92
- /models Pick a model from config
93
- /resume Resume session history
94
- /context Show or set context length (e.g. /context 120k)
95
- /mcp Show configured MCP servers
96
- /init Generate AGENTS.md for current project
97
64
  $ Execute shell command (e.g. $ git status)
98
65
 
99
66
  Shortcuts:
100
67
  Enter Send message
101
68
  Shift+Enter New line in input
102
69
  Up/Down Browse input history
70
+ Tab Accept suggestion
103
71
  Ctrl+L Start a new session
104
72
  Ctrl+C Exit
105
73
  exit Type in input to exit
106
- Ctrl+X Toggle mode
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
- Current provider: ${e.providerName}
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
- Usage: /context <length>
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:
74
+ Esc Esc Cancel / Clear input`;var Lr={name:"help",description:X("help"),run:({closeSuggestions:e,setInputValue:t,showSystemMessage:n})=>{e(),t(""),n("Help",Nt)}};var Or={name:"context",description:X("context"),run:({closeSuggestions:e,setInputValue:t})=>{e(!1),t("/context ")}};function vl(e,t){let n=[];if(n.push(`- **${e}**`),"url"in t){n.push(` - Type: ${t.type??"streamable_http"}`),n.push(` - URL: ${t.url}`),t.bearer_token_env_var&&n.push(` - Bearer token env: ${t.bearer_token_env_var}`),t.type!=="sse"&&t.fallback_to_sse!==void 0&&n.push(` - Fallback to SSE: ${t.fallback_to_sse}`);let o=t.http_headers??t.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: ${t.type??"stdio"}`),n.push(` - Command: ${t.command}`),t.args&&t.args.length>0&&n.push(` - Args: ${t.args.join(" ")}`),t.env&&Object.keys(t.env).length>0){let o=Object.entries(t.env).map(([r,s])=>`${r}=${s}`).join(", ");n.push(` - Env: ${o}`)}return n.join(`
75
+ `)}var Nr={name:"mcp",description:X("mcp"),run:({closeSuggestions:e,setInputValue:t,showSystemMessage:n,data:o})=>{e();let{mcpServers:r,configPath:s}=o,i=Object.keys(r);if(i.length===0){n("MCP Servers",`No MCP servers configured.
76
+
77
+ Add servers to ${s}`),t("");return}let a=[];a.push(`Total: ${i.length} server(s)
78
+ `);for(let[c,l]of Object.entries(r))a.push(vl(c,l)),a.push("");t(""),n("MCP Servers",a.join(`
79
+ `))}};var Dr={name:"init",description:X("init"),run:({closeSuggestions:e,setInputValue:t})=>{e(!1),t("/init")}};var En=[Lr,Rr,Pr,$r,Ir,Or,Nr,Dr];import{Fragment as jl,jsx as Me,jsxs as nt}from"react/jsx-runtime";var El=400;function jr({disabled:e,onSubmit:t,onExit:n,onClear:o,onNewSession:r,onCancelRun:s,onModelSelect:i,onSystemMessage:a,onSetContextLimit:c,history:l,cwd:u,sessionsDir:p,currentSessionFile:h,onHistorySelect:y,providers:b,configPath:x,providerName:w,model:_,contextLimit:k,mcpServers:d}){let[v,E]=Ae(""),[B,I]=Ae(null),[ue,M]=Ae(""),[C,P]=Ae("none"),[V,ee]=Ae([]),[ye,D]=Ae(0),[re,se]=Ae(!1),[Re,He]=Ae(!1),de=Mn(0),ie=Mn(0),H=Mn(""),Bt="\u203A ";An(()=>{H.current=v,He(!1)},[v]);let j=Tl(()=>Re||e?null:$l(v),[e,Re,v]),z=Ur((L=!0)=>{L&&He(!0),P("none"),ee([]),D(0),se(!1)},[]);An(()=>{e&&z(!1)},[e,z]),An(()=>{if(!j){P("none"),ee([]),D(0),se(!1);return}let L=!1,U=++de.current;return se(!0),(async()=>{try{if(j.type==="file"){let R=await wr({cwd:u,query:j.query,limit:8});if(L||U!==de.current)return;let N=R.map(g=>{let A=g.isDir?`${g.path}/`:g.path;return{id:g.id,title:A,kind:"file",value:A,meta:{isDir:g.isDir}}});P("file"),ee(N),D(g=>N.length?Math.min(g,N.length-1):0);return}if(j.type==="history"){let R=await Al({sessionsDir:p,cwd:u,keyword:j.keyword,activeSessionFile:h});if(L||U!==de.current)return;let N=R.map(Ul);P("history"),ee(N),D(g=>N.length?Math.min(g,N.length-1):0);return}if(j.type==="models"){let R=j.keyword.toLowerCase(),g=(b??[]).filter(A=>{let te=A.name?.toLowerCase()??"",fe=A.model?.toLowerCase()??"";return R?te.includes(R)||fe.includes(R):!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}}));P("model"),ee(g),D(A=>g.length?Math.min(A,g.length-1):0);return}if(j.type==="context"){let N=[8e4,12e4,15e4,2e5].map(g=>({id:`${g}`,title:`${(g/1e3).toFixed(0)}k tokens`,subtitle:g===k?"Current":void 0,kind:"context",value:`/context ${(g/1e3).toFixed(0)}k`,meta:{contextValue:g}}));P("context"),ee(N),D(g=>N.length?Math.min(g,N.length-1):0);return}if(j.type==="slash"){let R=j.keyword.toLowerCase(),g=(R?En.filter(A=>A.matches?A.matches(R):A.name.startsWith(R)):En).map(A=>({id:A.name,title:`/${A.name}`,subtitle:A.description,kind:"slash",value:`/${A.name} `,meta:{slashCommand:A}}));P("slash"),ee(g),D(A=>g.length?Math.min(A,g.length-1):0);return}}catch{!L&&U===de.current&&ee([])}finally{!L&&U===de.current&&se(!1)}})(),()=>{L=!0}},[j,u,p,h,b,k]);let ct=Ur(L=>{if(L){if(C==="file"&&j?.type==="file"){let U=v.slice(0,j.tokenStart),R=v.slice(j.tokenStart+j.query.length),N=`${U}${L.value}${R}`;H.current=N,E(N),I(null),M(""),L.meta?.isDir||z();return}if(C==="history"){L.meta?.historyEntry&&y?.(L.meta.historyEntry),H.current=L.value,E(L.value),I(null),M(""),z();return}if(C==="model"&&L.meta?.provider){i?.(L.meta.provider),H.current="",E(""),I(null),M(""),z();return}if(C==="slash"&&L.meta?.slashCommand){L.meta.slashCommand.run({setInputValue:R=>{H.current=R,E(R),I(null),M("")},closeSuggestions:z,clearScreen:()=>{o()},newSession:()=>{r?.()},exitApp:()=>{n()},showSystemMessage:(R,N)=>{a?.(R,N)},switchModel:R=>{i?.(R)},setContextLimit:R=>{c?.(R)},loadHistory:R=>{y?.(R)},data:{configPath:x,providerName:w,model:_,contextLimit:k,providers:b,mcpServers:d}});return}if(C==="context"&&L.meta?.contextValue){let U=L.meta.contextValue;c?.(U),a?.("Context",`Context limit set to ${(U/1e3).toFixed(0)}k tokens`),H.current="",E(""),I(null),M(""),z();return}}},[z,o,n,i,a,c,y,C,j,v,x,w,_,k,b,d]);Cl((L,U)=>{if(U.ctrl&&L==="l"){H.current="",E(""),I(null),M(""),z(),o(),r?.();return}let R=C!=="none",N=R&&V.length>0;if(U.escape){let g=Date.now();if(g-ie.current<=El){ie.current=0,e?s():(H.current="",E(""),I(null),M(""),z());return}ie.current=g,R&&z();return}if(!e){if(U.upArrow){if(N){D(te=>te<=0?V.length-1:te-1);return}if(!l.length)return;if(B===null){M(H.current);let te=l.length-1;I(te);let fe=l[te]??"";H.current=fe,E(fe);return}let g=Math.max(0,B-1);I(g);let A=l[g]??"";H.current=A,E(A);return}if(U.downArrow){if(N){D(te=>(te+1)%V.length);return}if(B===null)return;let g=B+1;if(g>=l.length){I(null),H.current=ue,E(ue),M("");return}I(g);let A=l[g]??"";H.current=A,E(A);return}if(U.tab&&N){ct(V[ye]);return}if(U.return){if(N){ct(V[ye]);return}if(U.shift){let A=H.current+`
80
+ `;H.current=A,E(A);return}let g=H.current.trim();g&&(t(g),H.current="",E(""),I(null),M(""),z(!1));return}if(U.backspace||U.delete){let g=H.current.slice(0,Math.max(0,H.current.length-1));H.current=g,E(g);return}if(L){let g=H.current+L;H.current=g,E(g)}}});let qe=v,lt=e?" ":"\u258A",$e=qe.split(`
81
+ `),Ee=2,Ft=V.map(({value:L,meta:U,...R})=>R);return nt(Dt,{flexDirection:"column",gap:1,children:[nt(Dt,{flexDirection:"column",paddingY:1,children:[nt(Dt,{children:[Me(Ne,{color:"gray",children:Bt}),e?Me(Ne,{color:"gray",children:$e[0]}):nt(jl,{children:[Me(Ne,{color:"white",children:$e[0]}),$e.length===1&&Me(Ne,{color:"cyan",children:lt})]})]}),$e.slice(1).map((L,U)=>nt(Dt,{children:[Me(Ne,{color:"gray",children:" ".repeat(Ee)}),Me(Ne,{color:"white",children:L}),U===$e.length-2&&Me(Ne,{color:"cyan",children:lt})]},`line-${U}`))]}),C!=="none"?Me(Ar,{items:Ft,activeIndex:ye,loading:re}):null]})}async function Al(e){let t=Ho(e.sessionsDir,e.cwd),n;try{n=await _l(t,{withFileTypes:!0})}catch(l){return l?.code==="ENOENT"?[]:[]}let o=e.activeSessionFile?Hr(e.activeSessionFile):null,s=(await Promise.all(n.filter(l=>l.isFile()&&l.name.endsWith(".jsonl")).map(async l=>{let u=wl(t,l.name);if(o&&Hr(u)===o)return null;try{let p=await kl(u);return{path:u,mtimeMs:p.mtimeMs}}catch{return null}}))).filter(l=>!!l).sort((l,u)=>u.mtimeMs-l.mtimeMs),i=e.limit??10,a=e.keyword?.trim().toLowerCase(),c=[];for(let l of s){if(c.length>=i)break;let u=await Ml(l.path,e.cwd,l.mtimeMs);if(u&&!(a&&!u.input.toLowerCase().includes(a))&&(c.push(u),c.length>=i))break}return c}async function Ml(e,t,n){try{let o=await Sl(e,"utf8"),s=Pl(o)?.trim()||Rl(e);return{id:e,cwd:t,input:s,ts:n,sessionFile:e}}catch{return null}}function Pl(e){for(let t of e.split(`
82
+ `)){let n=t.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 Rl(e){return bl(e).replace(/\.jsonl$/i,"")}function $l(e){let t=Nl(e);if(t)return t;let n=Ol(e);if(n)return n;let o=Dl(e);if(o)return o;let r=Il(e);return r||Ll(e)}function Il(e){let t=e.lastIndexOf("@");if(t===-1)return null;if(t>0){let o=e[t-1];if(o&&!/\s/.test(o))return null}let n=e.slice(t+1);return/\s/.test(n)?null:{type:"file",query:n,tokenStart:t+1}}function Ll(e){let t=e.trimStart(),n=e.length-t.length;if(t.length===0)return null;let o=t;if(o.startsWith("/")&&(o=o.slice(1)),!o.toLowerCase().startsWith("resume")||e.slice(0,n).trim().length>0)return null;let s=o.slice(6);return s&&!s.startsWith(" ")?null:{type:"history",keyword:s.trim()}}function Ol(e){let t=e.trimStart();if(!t.startsWith("/models"))return null;let n=t.slice(7);return n&&!n.startsWith(" ")?null:{type:"models",keyword:n.trim()}}function Nl(e){let t=e.trimStart();if(!t.startsWith("/context"))return null;let n=t.slice(8);return n&&!n.startsWith(" ")?null:{type:"context"}}function Dl(e){let t=e.trimStart();if(!t.startsWith("/"))return null;let n=t.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(e){return{id:e.id,title:e.input,subtitle:Hl(e.ts),kind:"history",badge:"HIS",value:e.input,meta:{historyEntry:e}}}function Hl(e){if(!e)return"";let t=new Date(e);if(Number.isNaN(t.getTime()))return"";let n=String(t.getFullYear()),o=String(t.getMonth()+1).padStart(2,"0"),r=String(t.getDate()).padStart(2,"0"),s=String(t.getHours()).padStart(2,"0"),i=String(t.getMinutes()).padStart(2,"0");return`${n}-${o}-${r} ${s}:${i}`}import{Box as ot,Text as Pn,useInput as Bl}from"ink";import{useState as Fl,useCallback as Vl}from"react";import{jsx as rt,jsxs as Rn}from"react/jsx-runtime";function Gl(e){if(typeof e!="object"||e===null)return String(e);let t=Object.entries(e);if(t.length===0)return"";let[n,o]=t[0],r=typeof o=="string"?o:JSON.stringify(o);return`${r.slice(0,40)}${r.length>40?"...":""}`}function Br({request:e,onDecision:t}){let n=[{label:"Allow once",decision:"once"},{label:"Allow all session",decision:"session"},{label:"Reject this time",decision:"deny"}],[o,r]=Fl(0);Bl(Vl((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&&t(n[o].decision)},[o,t,n]));let s=Gl(e.params);return Rn(ot,{borderStyle:"single",borderColor:"gray",paddingX:2,flexDirection:"column",children:[rt(ot,{children:rt(Pn,{bold:!0,children:"Tool Approval:"})}),rt(ot,{marginTop:1,children:Rn(Pn,{color:"cyan",children:[e.toolName,s?` (${s})`:""]})}),rt(ot,{flexDirection:"column",marginTop:1,children:n.map((i,a)=>rt(ot,{children:Rn(Pn,{color:o===a?"green":"gray",children:[o===a?"> ":" ",i.label]})},i.decision))})]})}import sg from"string-width";function Vr(e){if(!e)return"success";let t=e.toLowerCase();return t.includes("error")||t.includes("unknown")||t.includes("failed")?"error":"success"}var Fr={"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 zl(e){let t=e.toLowerCase(),n=Object.entries(Fr).filter(([o])=>o!=="default");for(let[o,r]of n.sort((s,i)=>i[0].length-s[0].length))if(t.includes(o))return r;return Fr.default}function Gr(e,t){if(e==null)return 0;let n=typeof e=="number"?e:e.prompt??e.total??0;if(n<=0)return 0;let o=t&&t>0?t:zl("");return Math.min(100,n/o*100)}function zr(e){return e?`${e.total} tokens`:""}function Wr(e,t){let[n,...o]=e.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:Nt};case"config":return{kind:"message",title:"Config",content:`Config file: ${t.configPath}
83
+ Current provider: ${t.providerName}
84
+ Current model: ${t.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]),h=s.map(y=>`${y/1e3}k`).join(", ");return p===null?{kind:"message",title:"Context",content:`Current: ${(t.contextLimit/1e3).toFixed(0)}k
85
+ Usage: /context <length> (starts new session)
86
+ Choices: ${h}`}:s.includes(p)?{kind:"set_context_limit",limit:p}:{kind:"message",title:"Context",content:`Unsupported length: ${p}. Pick one of: ${h}`}}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(!t.providers.length)return{kind:"message",title:"Models",content:`No providers configured. Check ${t.configPath}`};let a=o.join(" ").trim(),c=t.providers.find(p=>p.name===a)??t.providers.find(p=>p.model===a);if(c)return{kind:"switch_model",provider:c};let l=t.providers.map(p=>{let h=p.base_url?` @ ${p.base_url}`:"";return`- ${p.name}: ${p.model}${h}`});return{kind:"message",title:"Models",content:`${a?`Not found: ${a}, `:""}Available models:
112
87
  ${l.join(`
113
- `)}`};default:return{kind:"message",title:"Unknown",content:`Unknown command: ${t}
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.
88
+ `)}`};default:return{kind:"message",title:"Unknown",content:`Unknown command: ${e}
89
+ Type /help for available commands.`}}}import{dirname as Ut,join as Jr,resolve as Wl}from"path";import{statSync as Kl,existsSync as qr,readFileSync as Jl}from"fs";import{readFile as ql}from"fs/promises";import{get as Xl}from"https";import{fileURLToPath as Yl}from"url";function Kr(e){let t=e.trim().replace(/^v/i,""),[n="",o]=t.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 Zl(e,t){let n=Kr(e),o=Kr(t);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 Xr(){try{let t=Yl(import.meta.url);return Ut(t)}catch{}let e=Wl(process.argv[1]??process.cwd());try{return Kl(e).isFile()?Ut(e):e}catch{return process.cwd()}}async function Ql(e){let t=Jr(e,"package.json");if(!qr(t))return null;let n=await ql(t,"utf8"),o=JSON.parse(n);return!o.name||!o.version?null:{name:o.name,version:o.version}}function eu(e){let t=Jr(e,"package.json");if(!qr(t))return null;try{let n=Jl(t,"utf8"),o=JSON.parse(n);return!o.name||!o.version?null:{name:o.name,version:o.version}}catch{return null}}async function tu(){let e=Xr();for(;;){let t=await Ql(e);if(t&&t.name==="@memo-code/memo")return t;let n=Ut(e);if(n===e)break;e=n}return null}function Ht(){let e=Xr();for(;;){let t=eu(e);if(t&&t.name==="@memo-code/memo")return t;let n=Ut(e);if(n===e)break;e=n}return null}async function nu(e,t=1500){let o=`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`;return new Promise(r=>{let s=Xl(o,{timeout:t},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 Yr(){let e=await tu();if(!e)return null;let t=await nu(e.name);return!t||!Zl(t,e.version)?null:{current:e.version,latest:t}}import{Box as Je,Text as ve,useInput as ou}from"ink";import{useCallback as $n,useMemo as ru,useState as st}from"react";import{jsx as Ce,jsxs as De}from"react/jsx-runtime";var Pe=[{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 Zr({configPath:e,onComplete:t,onExit:n}){let[o,r]=st(0),[s,i]=st(""),[a,c]=st({}),[l,u]=st(!1),[p,h]=st(null),y=Pe[o]??Pe[0],b=s||a[y.key]||"",x=$n(async k=>{u(!0),h(null);try{let d=k.name||Pe[0].defaultValue,v=k.envKey||Pe[1].defaultValue,E=k.model||Pe[2].defaultValue,B=k.baseUrl||Pe[3].defaultValue;await ge(e,{current_provider:d,providers:[{name:d,env_api_key:v,model:E,base_url:B||void 0}]}),t()}catch(d){h(d.message),u(!1)}},[e,t]),w=$n(async()=>{let d=s.trim()||y.defaultValue,v={...a,[y.key]:d};if(c(v),i(""),o<Pe.length-1){r(o+1);return}await x(v)},[y.defaultValue,y.key,o,s,a,x]);ou($n((k,d)=>{if(!l){if(d.ctrl&&k==="c"){n();return}if(d.return){w();return}if(d.backspace||d.delete){i(v=>v.slice(0,-1));return}k&&i(v=>v+k)}},[w,n,l]));let _=ru(()=>`Step ${o+1}/${Pe.length}`,[o]);return De(Je,{flexDirection:"column",children:[De(Je,{flexDirection:"column",marginBottom:1,children:[Ce(ve,{bold:!0,children:"Memo setup"}),Ce(ve,{color:"gray",children:"No provider config found. Create one to continue."}),De(ve,{color:"gray",children:["Config path: ",e]})]}),De(Je,{flexDirection:"column",marginBottom:1,children:[Ce(ve,{color:"cyan",children:_}),De(ve,{children:[y.label," (default: ",y.defaultValue,")"]}),y.hint?Ce(ve,{color:"gray",children:y.hint}):null]}),De(Je,{children:[Ce(ve,{children:"> "}),Ce(ve,{children:b})]}),Ce(Je,{marginTop:1,children:Ce(ve,{color:"gray",children:"Press Enter to continue. Ctrl+C to exit."})}),p?Ce(Je,{marginTop:1,children:De(ve,{color:"red",children:["Failed to write config: ",p]})}):null]})}import{jsx as Ue,jsxs as du}from"react/jsx-runtime";var uu=au(iu);function pu(e){return{index:e,userInput:"",steps:[]}}function es({sessionOptions:e,providerName:t,model:n,configPath:o,mcpServers:r,cwd:s,sessionsDir:i,providers:a,dangerous:c=!1,needsSetup:l=!1}){let{exit:u}=cu(),[p,h]=K(t),[y,b]=K(n),[x,w]=K(a),[_,k]=K({...e,providerName:t}),[d,v]=K(null),[E,B]=K([]),[I,ue]=K([]),[M,C]=K(!1),P=it(null),V=it(null),[ee,ye]=K([]),[D,re]=K(null),[se,Re]=K([]),[He,de]=K(null),ie=it(null),[H,Bt]=K(null),j=it(0),[z,ct]=K(e.maxPromptTokens??12e4),[qe,lt]=K(l),[$e,Ee]=K(0),Ft=In(()=>Ht(),[]),[L,U]=K(null),R=it(null),N=W(()=>(j.current+=1,j.current),[]),g=W((m,f)=>{let T=`${Date.now()}-${Math.random().toString(16).slice(2)}`,$=N();ue(O=>[...O,{id:T,title:m,content:f,sequence:$}])},[N]),A=W((m,f)=>{B(T=>{let $=[...T],O=$.findIndex(ae=>ae.index===m);O===-1&&($.push(pu(m)),O=$.length-1);let F=$[O];return F&&($[O]=f(F)),$})},[]),te=In(()=>({onAssistantStep:(m,f)=>{let T=P.current;T&&A(T,$=>{let O=$.steps.slice();for(;O.length<=f;)O.push({index:O.length,assistantText:""});let F=O[f];if(!F)return $;let ae={...F,assistantText:F.assistantText+m};return O[f]=ae,{...$,steps:O}})},requestApproval:c?void 0:m=>new Promise(f=>{U(m),R.current=f}),hooks:{onTurnStart:({turn:m,input:f,promptTokens:T})=>{P.current=m;let $=V.current;$&&(V.current=null);let O=$??f;T&&T>0&&Ee(T),A(m,F=>({...F,index:m,userInput:O,steps:[],startedAt:Date.now(),contextPromptTokens:T??F.contextPromptTokens}))},onAction:({turn:m,step:f,action:T,thinking:$,parallelActions:O})=>{A(m,F=>{let ae=F.steps.slice();for(;ae.length<=f;)ae.push({index:ae.length,assistantText:""});let ut=ae[f];return ut?(ae[f]={...ut,action:T,thinking:$,toolStatus:"executing",parallelActions:O&&O.length>1?O:void 0},{...F,steps:ae}):F})},onObservation:({turn:m,step:f,observation:T})=>{A(m,$=>{let O=$.steps.slice();for(;O.length<=f;)O.push({index:O.length,assistantText:""});let F=O[f];return F?(O[f]={...F,observation:T,toolStatus:Vr(T)},{...$,steps:O}):$})},onFinal:({turn:m,finalText:f,status:T,turnUsage:$,tokenUsage:O})=>{A(m,F=>{let ae=F.startedAt??Date.now(),ut=Math.max(0,Date.now()-ae),ds=O?.prompt??F.contextPromptTokens,fs=F.sequence??N();return{...F,finalText:f,status:T,tokenUsage:$,contextPromptTokens:ds,startedAt:ae,durationMs:ut,sequence:fs}}),C(!1)}}}),[A,c,N]);jt(()=>{let m=!1;return(async()=>{if(qe)return;let f=ie.current;f&&await f.close();let T=await Ye(te,_);if(m){await T.close();return}ie.current=T,v(T),re(T.historyFilePath??null)})(),()=>{m=!0}},[te,_,qe]),jt(()=>{let m=!1;return(async()=>{let f=await Yr();m||!f||g("Update",`Update available: v${f.latest}. Run: npm install -g @memo-code/memo@latest`)})(),()=>{m=!0}},[g]),jt(()=>()=>{ie.current&&ie.current.close()},[]);let fe=W(async()=>{ie.current&&await ie.current.close(),Bt("Bye!"),setTimeout(()=>{u()},300)},[u]),Nn=W(()=>{B([]),ue([]),Re([]),de(null),Ee(0),j.current=0},[]),Dn=W(async()=>{B([]),ue([]),Re([]),de(null),Ee(0),j.current=0;let m=at(),f={..._,sessionId:m};ie.current&&await ie.current.close();let T=await Ye(te,f);ie.current=T,v(T),re(T.historyFilePath??null),k(f),g("New Session","Started a new session with fresh context.")},[te,_,g]),Un=W(async m=>{try{let f=await oe(),T={...f.config,max_prompt_tokens:m};await ge(f.configPath,T)}catch(f){g("Failed to save config",`Failed to save context limit: ${f.message}`)}},[g]),Vt=W(m=>{ct(m),Ee(0),k(f=>({...f,maxPromptTokens:m,sessionId:at()})),g("Context length",`Context limit set to ${(m/1e3).toFixed(0)}k tokens (new session started)`),Un(m)},[g,Un]),ss=W(async m=>{if(!m.sessionFile){g("History","This entry has no context file to load.");return}try{let f=await su(m.sessionFile,"utf8"),T=mu(f);Re(T.turns),de(T.messages),C(!1),B([]),v(null),re(null),Ee(0),P.current=null,j.current=Math.max(j.current,T.maxSequence),k($=>({...$,sessionId:at()})),g("History loaded",T.summary||m.input)}catch(f){g("Failed to load history",`Unable to read ${m.sessionFile}: ${f.message}`)}},[g]),Hn=W(async m=>{try{let f=await oe(),T={...f.config,current_provider:m};await ge(f.configPath,T)}catch(f){g("Failed to save config",`Failed to save model selection: ${f.message}`)}},[g]),is=W(()=>{M&&d?.cancelCurrentTurn?.()},[M,d]),Gt=W(async m=>{if(m.name===p&&m.model===y){g("Model switch",`Already using ${m.name} (${m.model})`);return}if(M){g("Model switch","Currently running. Press Esc Esc to cancel before switching models.");return}B([]),Re([]),de(null),Ee(0),P.current=null,v(null),re(null),h(m.name),b(m.model),k(f=>({...f,sessionId:at(),providerName:m.name})),await Hn(m.name),g("Model switch",`Switched to ${m.name} (${m.model})`)},[g,M,y,p,Hn]),zt=W(async m=>{if(!m.trim()){g("Shell Command","Usage: $ <command> (e.g. $ git status)");return}C(!0);try{let{stdout:f,stderr:T}=await uu(m,{cwd:s,maxBuffer:5242880}),$=[f?.trim(),T?.trim()].filter(Boolean).join(`
90
+ `);g("Shell Result",$||"(no output)")}catch(f){let T=f,O=[T.stdout?.trim(),T.stderr?.trim(),T.message].filter(Boolean).join(`
91
+ `);g("Shell Error",O||"Command failed")}finally{C(!1)}},[g,s]),jn=W(async m=>{let f=Wr(m,{configPath:o,providerName:p,model:y,mcpServers:r,providers:x,contextLimit:z});if(f.kind==="exit"){await fe();return}if(f.kind==="new"){await Dn();return}if(f.kind==="switch_model"){await Gt(f.provider);return}if(f.kind==="set_context_limit"){Vt(f.limit);return}if(f.kind==="init_agents_md"){g("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.
117
92
 
118
93
  The AGENTS.md should include:
119
94
  1. Project name and brief description
@@ -129,10 +104,10 @@ Steps:
129
104
  3. Understand the tech stack and conventions
130
105
  4. Create the AGENTS.md file using the write tool
131
106
 
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=`
107
+ Make the AGENTS.md concise but informative, following best practices for AI agent guidelines.`;if(ye($=>[...$,"/init"]),!d){g("Error","Session not initialized");return}C(!0);try{V.current="/init (generate AGENTS.md)",await d.runTurn(T)}catch{C(!1)}return}if(f.kind==="shell_command"){await zt(f.command);return}g(f.title,f.content)},[g,Vt,o,Nn,fe,Gt,r,y,p,z,x,zt]),as=W(async()=>{try{let m=await oe(),f=Le(m.config);w(m.config.providers),h(f.name),b(f.model),k(T=>({...T,sessionId:at(),providerName:f.name})),lt(!1),g("Setup",`Config saved to ${m.configPath}`)}catch(m){g("Setup",`Failed to reload config: ${m.message}`)}},[g]);jt(()=>{if(!d||!He?.length)return;let m=d.history[0];m&&(d.history.splice(0,d.history.length,m,...He),de(null))},[He,d]);let cs=W(async m=>{if(m.trim().toLowerCase()==="exit"){await fe();return}if(!d||M)return;let f=m.trim();if(f.startsWith("$")){let T=f.slice(1).trim();ye($=>[...$,m]),await zt(T);return}if(m.startsWith("/")){await jn(m);return}ye(T=>[...T,m]),C(!0);try{await d.runTurn(m)}catch{C(!1)}},[M,jn,fe,d]),ls=E[E.length-1],Au=zr(ls?.tokenUsage),us=Gr($e,z),ps=In(()=>[...se,...E],[se,E]),ms=W(m=>{let f=R.current;f&&(f(m),R.current=null),U(null)},[]);if(H){let m=H.split(`
108
+ `);return Ue(Qr,{flexDirection:"column",children:m.map((f,T)=>Ue(lu,{color:"green",children:f},T))})}return qe?Ue(Zr,{configPath:o,onComplete:as,onExit:fe}):du(Qr,{flexDirection:"column",children:[Ue(mr,{systemMessages:I,turns:ps,headerInfo:{providerName:p,model:y,cwd:s,sessionId:_.sessionId??"unknown",mcpNames:Object.keys(r??{}).sort(),version:Ft?.version??"unknown"}}),Ue(jr,{disabled:!d||M||!!L,onSubmit:cs,onExit:fe,onClear:Nn,onNewSession:Dn,onCancelRun:is,onHistorySelect:ss,onModelSelect:Gt,onSystemMessage:g,onSetContextLimit:m=>{Vt(m)},history:ee,cwd:s,sessionsDir:i,currentSessionFile:D??void 0,providers:x,configPath:o,providerName:p,model:y,contextLimit:z,mcpServers:r}),L&&Ue(Br,{request:L,onDecision:ms}),Ue(er,{contextPercent:us})]})}function mu(e){let t=[],n=[],o=[],r=e.split(`
109
+ `).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&&(t.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&&(t.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:"",h=u.input,y=typeof u.thinking=="string"?u.thinking:"",x=(Array.isArray(u.toolBlocks)?u.toolBlocks:[]).map(_=>{let k=typeof _?.name=="string"?_.name:"";return k?{tool:k,input:_?.input}:null}).filter(Boolean),w=s.steps[s.steps.length-1];w&&(x.length>1?(w.action=x[0],w.parallelActions=x):p&&(w.action={tool:p,input:h}),y&&(w.thinking=y))}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(`
110
+ `),messages:t,turns:n,maxSequence:a}}var fu=`
136
111
  Usage:
137
112
  memo mcp list [--json]
138
113
  memo mcp get <name> [--json]
@@ -141,14 +116,14 @@ Usage:
141
116
  memo mcp remove <name>
142
117
  memo mcp login <name> [--scopes scope1,scope2]
143
118
  memo mcp logout <name>
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(`
119
+ `;function Ln(){console.log(fu.trim())}function gu(e){let t=e.indexOf("=");if(t<=0)return null;let n=e.slice(0,t).trim(),o=e.slice(t+1);return n?{key:n,value:o}:null}function ts(e,t){let n=[];if(n.push(`${e}`),"url"in t){n.push(` type: ${t.type??"streamable_http"}`),n.push(` url: ${t.url}`),t.bearer_token_env_var&&n.push(` bearer_token_env_var: ${t.bearer_token_env_var}`);let o=t.http_headers??t.headers;o&&Object.keys(o).length>0&&n.push(` headers: ${Object.entries(o).map(([r,s])=>`${r}=${s}`).join(", ")}`)}else n.push(` type: ${t.type??"stdio"}`),n.push(` command: ${t.command}`),t.args&&t.args.length>0&&n.push(` args: ${t.args.join(" ")}`),t.env&&Object.keys(t.env).length>0&&n.push(` env: ${Object.entries(t.env).map(([o,r])=>`${o}=${r}`).join(", ")}`);return n.join(`
120
+ `)}function hu(e){let t=e.shift();if(!t)return{error:"Missing server name."};let n,o,r={},s=[];for(let i=0;i<e.length;i+=1){let a=e[i];if(a){if(a==="--"){s=e.slice(i+1);break}if(a==="--url"){let c=e[i+1];if(!c)return{error:"Missing value for --url."};n=c,i+=1;continue}if(a==="--bearer-token-env-var"){let c=e[i+1];if(!c)return{error:"Missing value for --bearer-token-env-var."};o=c,i+=1;continue}if(a==="--env"){let c=e[i+1];if(!c)return{error:"Missing value for --env (KEY=VALUE)."};let l=gu(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:t,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:t,command:s[0],args:s.slice(1),env:Object.keys(r).length>0?r:void 0}}}function yu(e){let[t,...n]=e;return!t||t==="--help"||t==="-h"||t==="help"?{command:"help",rest:[]}:{command:t,rest:n}}function On(e,t=[]){let n=new Set(t);for(let o=0;o<e.length;o+=1){let r=e[o];if(r){if(r.startsWith("--")){n.has(r)&&(o+=1);continue}return r}}return null}async function ns(e){let{command:t,rest:n}=yu(e);if(t==="help"){Ln();return}if(t==="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(ts(a,c))}return}if(t==="get"){let o=n.includes("--json"),r=On(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(ts(r,i));return}if(t==="add"){let o=hu(n);if(o.error!==void 0){o.error&&(console.error(o.error),process.exitCode=1),Ln();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 ge(s.configPath,{...s.config,mcp_servers:i}),console.log(`Added MCP server "${r.name}".`);return}if(t==="remove"){let o=On(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 ge(r.configPath,{...r.config,mcp_servers:s}),console.log(`Removed MCP server "${o}".`);return}if(t==="login"||t==="logout"){let o=On(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: ${t}`),Ln(),process.exitCode=1}import{jsx as Eu}from"react/jsx-runtime";function _u(e){let t={once:!1,dangerous:!1,showVersion:!1},n=[];for(let o=0;o<e.length;o++){let r=e[o];if(r!==void 0){if(r==="--version"||r==="-v"){t.showVersion=!0;continue}if(r==="--once"){t.once=!0;continue}if(r==="--dangerous"||r==="-d"){t.dangerous=!0;continue}n.push(r)}}return{question:n.join(" "),options:t}}async function rs(e){let t=await oe();if(!t.needsSetup)return t;let n=t.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 ge(t.configPath,t.config),console.log(`Detected API key in env. Wrote default provider (${n.name}) to ${t.configPath}`),{...t,needsSetup:!1};if(e==="tui")return t;let s=xu({input:vu,output:Tu}),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 ge(t.configPath,p),console.log(`Config written to ${t.configPath}
121
+ `),{...t,config:p,needsSetup:!1}}finally{s.close()}}async function ku(e){let t=await rs("plain"),n=Le(t.config),r={sessionId:os(),mode:"once",stream:t.config.stream_output??!1,maxPromptTokens:t.config.max_prompt_tokens,dangerous:e.options.dangerous};e.options.dangerous&&console.log("\u26A0\uFE0F DANGEROUS MODE: All tool approvals are bypassed!");let s={onAssistantStep:c=>{process.stdout.write(c)},requestApproval:e.options.dangerous?void 0:c=>(console.log(`
147
122
  [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 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
- `);let c=await i.runTurn(a);e.config.stream_output||console.log(`
123
+ [tool] ${c.tool}`),c.input!==void 0&&console.log(`[input] ${JSON.stringify(c.input)}`)},onObservation:()=>{}}},i=await Ye(s,r),a=e.question;if(!a&&!process.stdin.isTTY&&(a=await Cu()),!a&&e.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}
124
+ `);let c=await i.runTurn(a);t.config.stream_output||console.log(`
150
125
  ${c.finalText}`),console.log(`
151
126
  [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 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()})}
127
+ provider=${n.name} model=${n.model}`)}catch(c){console.error(`Run failed: ${c.message}`)}finally{await i.close()}}async function bu(e){let t=await rs("tui"),n=Le(t.config),r={sessionId:os(),mode:"interactive",stream:t.config.stream_output??!1,maxPromptTokens:t.config.max_prompt_tokens,dangerous:e.options.dangerous},s=Tt(t,r);e.options.dangerous&&(console.log("\u26A0\uFE0F DANGEROUS MODE: All tool approvals are bypassed!"),console.log(` Use with caution.
128
+ `)),await Su(Eu(es,{sessionOptions:r,providerName:n.name,model:n.model,configPath:t.configPath,mcpServers:t.config.mcp_servers??{},cwd:process.cwd(),sessionsDir:s,providers:t.config.providers,dangerous:e.options.dangerous,needsSetup:t.needsSetup}),{exitOnCtrlC:!1,patchConsole:!1}).waitUntilExit()}async function wu(){let e=process.argv.slice(2);if(e[0]==="mcp"||e[0]==="--"&&e[1]==="mcp"){let o=e[0]==="--"?2:1;await ns(e.slice(o));return}let t=_u(e);if(t.options.showVersion){let r=Ht()?.version??"unknown";console.log(r);return}if(!(process.stdin.isTTY&&process.stdout.isTTY)||t.options.once){await ku(t);return}await bu(t)}wu();async function Cu(){return new Promise(e=>{let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{t+=n}),process.stdin.on("end",()=>{e(t.trim())}),process.stdin.resume()})}
154
129
  //# sourceMappingURL=index.js.map