@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/README.md +97 -91
- package/README.zh.md +223 -0
- package/dist/index.js +72 -97
- package/package.json +5 -2
package/dist/index.js
CHANGED
|
@@ -1,119 +1,94 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`,"utf8")}async flush(){return Promise.resolve()}};function
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
`).
|
|
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(/ /gi," ").replace(/</gi,"<").replace(/>/gi,">").replace(/&/gi,"&").replace(/"/gi,'"').replace(/'/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()},
|
|
10
|
-
`);return
|
|
11
|
-
`);return
|
|
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
|
|
16
|
-
`),
|
|
17
|
-
... (truncated, showing ${r} lines; max=${
|
|
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="";
|
|
21
|
-
`)}let i
|
|
22
|
-
`:"",
|
|
23
|
-
`:"",
|
|
24
|
-
${
|
|
25
|
-
${
|
|
26
|
-
`);return`${
|
|
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.${
|
|
29
|
-
${
|
|
30
|
+
[mcp_servers.${s}.env]
|
|
31
|
+
${h}`}).join(`
|
|
30
32
|
|
|
31
|
-
`)),[`
|
|
32
|
-
|
|
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
|
|
37
|
-
`)}formatToolDescription(
|
|
38
|
-
`)}groupByServer(
|
|
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
|
|
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
|
-
${
|
|
44
|
-
`),{thinkingParts:n,cleaned:o}=
|
|
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
|
|
47
|
-
`),toolUseBlocks:n.map(o=>({id:o.id,name:o.name,input:o.input})),stopReason:"stop_reason"in
|
|
48
|
-
`)}function
|
|
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:
|
|
51
|
-
`;case"checkbox":return
|
|
52
|
-
`).map(
|
|
53
|
-
`).trimEnd()}function
|
|
54
|
-
`)}function
|
|
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
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
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: ${
|
|
114
|
-
Type /help for available commands.`}}}import{dirname as
|
|
115
|
-
`);
|
|
116
|
-
`);
|
|
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(
|
|
133
|
-
`);return
|
|
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&&(
|
|
135
|
-
`),messages:
|
|
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
|
|
145
|
-
`)}function
|
|
146
|
-
`),{...
|
|
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=
|
|
149
|
-
`);let c=await i.runTurn(a);
|
|
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
|
|
153
|
-
`)),await
|
|
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
|