@memo-code/memo 0.5.13 → 0.5.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +1 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -111,7 +111,7 @@ 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 $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(`
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 install -g @memo-code/memo@latest`)})(),()=>{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
115
  `);x("Shell Result",$||"(no output)")}catch(f){let S=f,O=[S.stdout?.trim(),S.stderr?.trim(),S.message].filter(Boolean).join(`
116
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memo-code/memo",
3
- "version": "0.5.13",
3
+ "version": "0.5.15",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "AI programming assistant with multi-turn conversations, tool calling, and concurrent execution",