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