@memo-code/memo 0.2.1 → 0.4.2

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 CHANGED
@@ -1,6 +1,20 @@
1
- # Memo Code
1
+ <div align="center">
2
+ <img src="public/logo.svg" width="80" height="80" alt="Memo Logo">
3
+ <h1>Memo Code</h1>
4
+ <p>本地运行的 AI 编程助手,支持多轮对话、工具调用、并发</p>
5
+ </div>
2
6
 
3
- 本地运行的 AI 编程助手,支持多轮对话、工具调用、并发。基于 Node.js + TypeScript,默认对接 DeepSeek,兼容 OpenAI API。
7
+ <p align="center">
8
+ <a href="public/memo-code-cli-show-01.mp4">
9
+ <img src="https://img.shields.io/badge/📹-观看演示视频-1a1a1a?style=for-the-badge" alt="Demo Video">
10
+ </a>
11
+ </p>
12
+
13
+ ---
14
+
15
+ <video src="public/memo-code-cli-show-01.mp4" width="100%"></video>
16
+
17
+ 基于 Node.js + TypeScript,默认对接 DeepSeek,兼容 OpenAI API。
4
18
 
5
19
  ## 快速开始
6
20
 
@@ -12,6 +26,8 @@ npm install -g @memo-code/memo
12
26
  pnpm add -g @memo-code/memo
13
27
  # 或
14
28
  yarn global add @memo-code/memo
29
+ # 或
30
+ bun add -g @memo-code/memo
15
31
  ```
16
32
 
17
33
  ### 2. 配置 API Key
@@ -31,6 +47,7 @@ memo
31
47
 
32
48
  - 交互式:`memo`(默认 TUI,支持多轮、流式、工具可视化、快捷键)。
33
49
  - 单轮:`memo "你的问题" --once`(纯文本输出,适合脚本)。
50
+ - 危险模式:`memo --dangerous` 或 `memo -d`(跳过工具审批,谨慎使用)。
34
51
 
35
52
  ## 配置文件
36
53
 
@@ -82,6 +99,18 @@ url = "https://your-mcp-server.com/mcp"
82
99
 
83
100
  通过 MCP 协议可扩展更多工具。
84
101
 
102
+ ## 工具审批系统
103
+
104
+ 新增工具审批机制,保护用户免受危险操作影响:
105
+
106
+ - **自动审批**:安全工具(read、glob、grep等)自动通过
107
+ - **手动审批**:危险工具(bash、write、edit等)需要用户确认
108
+ - **审批选项**:
109
+ - `once`:仅批准当前操作
110
+ - `session`:批准本次会话中的所有同类操作
111
+ - `deny`:拒绝操作
112
+ - **危险模式**:`--dangerous` 参数跳过所有审批(仅限信任场景)
113
+
85
114
  ## 会话历史
86
115
 
87
116
  所有会话自动保存到 `~/.memo/sessions/`,按工作目录和日期组织:
@@ -146,9 +175,10 @@ memo-cli/
146
175
  - `/help`:显示帮助与快捷键说明。
147
176
  - `/models`:列出现有 Provider/Model,回车切换;支持直接 `/models deepseek` 精确选择。
148
177
  - `/context`:弹出 80k/120k/150k/200k 选项并立即设置上限。
149
- - `$ <cmd>`:在当前工作目录本地执行 shell 命令,直接显示输出(`Shell Result`),不再经模型代理。
178
+ - `$ <cmd>`:在当前工作目录本地执行 shell 命令,直接显示输出(`Shell Result`)。
150
179
  - `resume` 历史:输入 `resume` 查看并加载本目录的历史会话。
151
180
  - 退出与清屏:`exit` / `/exit`,`Ctrl+L` 新会话,`Esc Esc` 取消运行或清空输入。
181
+ - **工具审批**:危险操作会弹出审批对话框,可选择 `once`/`session`/`deny`。
152
182
 
153
183
  > 仅当会话包含用户消息时才写入 `sessions/` JSONL 日志,避免空会话文件。
154
184
 
package/dist/index.js CHANGED
@@ -1,56 +1,58 @@
1
1
  #!/usr/bin/env node
2
- var $o=Object.create;var Ge=Object.defineProperty;var Io=Object.getOwnPropertyDescriptor;var Ro=Object.getOwnPropertyNames;var No=Object.getPrototypeOf,Lo=Object.prototype.hasOwnProperty;var Oo=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var Do=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ro(e))!Lo.call(t,r)&&r!==n&&Ge(t,r,{get:()=>e[r],enumerable:!(o=Io(e,r))||o.enumerable});return t};var Ho=(t,e,n)=>(n=t!=null?$o(No(t)):{},Do(e||!t||!t.__esModule?Ge(n,"default",{value:t,enumerable:!0}):n,t));var to=Oo((zu,ge)=>{"use strict";function Kn(t){return Array.isArray(t)?t:[t]}var fi=void 0,Re="",Wn=" ",Ie="\\",hi=/^\s+$/,yi=/(?:[^\\]|^)\\$/,Ti=/^\\!/,xi=/^\\#/,Si=/\r?\n/g,ki=/^\.{0,2}\/|^\.{1,2}$/,wi=/\/$/,Nt="/",Xn="node-ignore";typeof Symbol<"u"&&(Xn=Symbol.for("node-ignore"));var Yn=Xn,Lt=(t,e,n)=>(Object.defineProperty(t,e,{value:n}),n),Ci=/([0-z])-([0-z])/g,qn=()=>!1,bi=t=>t.replace(Ci,(e,n,o)=>n.charCodeAt(0)<=o.charCodeAt(0)?e:Re),_i=t=>{let{length:e}=t;return t.slice(0,e-e%2)},vi=[[/^\uFEFF/,()=>Re],[/((?:\\\\)*?)(\\?\s+)$/,(t,e,n)=>e+(n.indexOf("\\")===0?Wn:Re)],[/(\\+?)\s/g,(t,e)=>{let{length:n}=e;return e.slice(0,n-n%2)+Wn}],[/[\\$.|*+(){^]/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,()=>Ie],[/\\\\/g,()=>Ie],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(t,e,n,o,r)=>e===Ie?`\\[${n}${_i(o)}${r}`:r==="]"&&o.length%2===0?`[${bi(n)}${o}]`:"[]"],[/(?:[^*])$/,t=>/\/$/.test(t)?`${t}$`:`${t}(?=$|\\/$)`]],Ei=/(^|\\\/)?\\\*$/,Jt="regex",pe="checkRegex",Jn="_",Mi={[Jt](t,e){return`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`},[pe](t,e){return`${e?`${e}[^/]*`:"[^/]*"}(?=$|\\/$)`}},Pi=t=>vi.reduce((e,[n,o])=>e.replace(n,o.bind(t)),t),de=t=>typeof t=="string",Ai=t=>t&&de(t)&&!hi.test(t)&&!yi.test(t)&&t.indexOf("#")!==0,$i=t=>t.split(Si).filter(Boolean),Ne=class{constructor(e,n,o,r,s,i){this.pattern=e,this.mark=n,this.negative=s,Lt(this,"body",o),Lt(this,"ignoreCase",r),Lt(this,"regexPrefix",i)}get regex(){let e=Jn+Jt;return this[e]?this[e]:this._make(Jt,e)}get checkRegex(){let e=Jn+pe;return this[e]?this[e]:this._make(pe,e)}_make(e,n){let o=this.regexPrefix.replace(Ei,Mi[e]),r=this.ignoreCase?new RegExp(o,"i"):new RegExp(o);return Lt(this,n,r)}},Ii=({pattern:t,mark:e},n)=>{let o=!1,r=t;r.indexOf("!")===0&&(o=!0,r=r.substr(1)),r=r.replace(Ti,"!").replace(xi,"#");let s=Pi(r);return new Ne(t,e,r,n,o,s)},Le=class{constructor(e){this._ignoreCase=e,this._rules=[]}_add(e){if(e&&e[Yn]){this._rules=this._rules.concat(e._rules._rules),this._added=!0;return}if(de(e)&&(e={pattern:e}),Ai(e.pattern)){let n=Ii(e,this._ignoreCase);this._added=!0,this._rules.push(n)}}add(e){return this._added=!1,Kn(de(e)?$i(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?fi:c)});let a={ignored:r,unignored:s};return i&&(a.rule=i),a}},Ri=(t,e)=>{throw new e(t)},ft=(t,e,n)=>de(t)?t?ft.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),Zn=t=>ki.test(t);ft.isNotRelative=Zn;ft.convert=t=>t;var Oe=class{constructor({ignorecase:e=!0,ignoreCase:n=e,allowRelativePaths:o=!1}={}){Lt(this,Yn,!0),this._rules=new Le(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&&ft.convert(e);return ft(s,e,this._strictPathCheck?Ri:qn),this._t(s,n,o,r)}checkIgnore(e){if(!wi.test(e))return this.test(e);let n=e.split(Nt).filter(Boolean);if(n.pop(),n.length){let o=this._t(n.join(Nt)+Nt,this._testCache,!0,n);if(o.ignored)return o}return this._rules.test(e,!1,pe)}_t(e,n,o,r){if(e in n)return n[e];if(r||(r=e.split(Nt).filter(Boolean)),r.pop(),!r.length)return n[e]=this._rules.test(e,o,Jt);let s=this._t(r.join(Nt)+Nt,n,o,r);return n[e]=s.ignored?s:this._rules.test(e,o,Jt)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return Kn(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},De=t=>new Oe(t),Ni=t=>ft(t&&ft.convert(t),t,qn),Qn=()=>{let t=n=>/^\\\\\?\\/.test(n)||/["<>|\u0000-\u001F]+/u.test(n)?n:n.replace(/\\/g,"/");ft.convert=t;let e=/^[a-z]:\//i;ft.isNotRelative=n=>e.test(n)||Zn(n)};typeof process<"u"&&process.platform==="win32"&&Qn();ge.exports=De;De.default=De;ge.exports.isPathValid=Ni;Lt(ge.exports,Symbol.for("setupWindows"),Qn)});import{randomUUID as Eo}from"crypto";import{createInterface as Da}from"readline/promises";import{stdin as Ha,stdout as Ua}from"process";import{render as Ba}from"ink";import Uo from"os";import{readFile as Bo}from"fs/promises";import{join as Fo,dirname as jo}from"path";import{fileURLToPath as zo}from"url";var Go=/{{\s*([\w.-]+)\s*}}/g;function Vo(t,e){return t.replace(Go,(n,o)=>e[o]??"")}function Wo(){try{return Uo.userInfo().username}catch{return process.env.USER??process.env.USERNAME??"unknown"}}async function Ve(){let t=jo(zo(import.meta.url)),e=Fo(t,"prompt.md"),n=await Bo(e,"utf-8"),o={date:new Date().toISOString(),user:Wo(),pwd:process.cwd()};return Vo(n,o)}import{appendFile as Jo,mkdir as Ko}from"fs/promises";import{dirname as Xo}from"path";var Qt=class{constructor(e){this.filePath=e}ready=!1;async append(e){this.ready||(await Ko(Xo(this.filePath),{recursive:!0}),this.ready=!0),await Jo(this.filePath,`${JSON.stringify(e)}
3
- `,"utf8")}async flush(){return Promise.resolve()}};function We(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 Yo}from"child_process";import{z as xe}from"zod";function S(t,e=!1){return{content:[{type:"text",text:t}],isError:e}}var qo=xe.object({command:xe.string().min(1,"command \u4E0D\u80FD\u4E3A\u7A7A"),timeout:xe.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(),Je={name:"bash",description:"\u5728 shell \u4E2D\u6267\u884C\u547D\u4EE4\uFF0C\u8FD4\u56DE exit/stdout/stderr",inputSchema:qo,execute:async({command:t,timeout:e})=>{let n=t.trim();if(!n)return S("bash \u9700\u8981\u8981\u6267\u884C\u7684\u547D\u4EE4",!0);try{let o=Yo("bash",["-lc",n],{env:process.env,stdio:["ignore","pipe","pipe"]}),r=g=>new Promise(_=>{if(!g)return _("");let C=[];g.setEncoding("utf8"),g.on("data",N=>C.push(N)),g.on("error",()=>_("")),g.on("end",()=>_(C.join("")))}),s=r(o.stdout),i=r(o.stderr),a,c=new Promise((g,_)=>{o.on("error",C=>_(C)),o.on("close",C=>g(typeof C=="number"?C:-1))}),l=e&&e>0?new Promise((g,_)=>{a=setTimeout(()=>{o.kill(),_(new Error(`bash \u8D85\u65F6 ${e}ms\uFF0C\u5DF2\u7EC8\u6B62\u8FDB\u7A0B`))},e)}):null,u=l?await Promise.race([c,l]):await c;a&&clearTimeout(a);let[m,y]=await Promise.all([s,i]);return S(`exit=${u} stdout="${m}" stderr="${y}"`)}catch(o){return S(`bash \u6267\u884C\u5931\u8D25: ${o.message}`,!0)}}};import{access as tr,readFile as er,writeFile as nr}from"fs/promises";import{normalize as Zo,resolve as Qo}from"path";function ct(t){return Zo(Qo(t))}import{z as Ut}from"zod";var or=Ut.object({file_path:Ut.string().min(1),old_string:Ut.string().min(1,"old_string \u4E0D\u80FD\u4E3A\u7A7A"),new_string:Ut.string(),replace_all:Ut.boolean().optional()}).strict(),Ke={name:"edit",description:"\u5728\u6587\u4EF6\u4E2D\u66FF\u6362\u6587\u672C\uFF0C\u652F\u6301 replace_all",inputSchema:or,execute:async t=>{let e=ct(t.file_path),n=t.replace_all??!1;if(!t.old_string.trim())return S("old_string \u4E0D\u80FD\u4E3A\u7A7A",!0);try{await tr(e);let o=await er(e,"utf8");if(!o.includes(t.old_string))return S("\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?S("\u672A\u68C0\u6D4B\u5230\u5185\u5BB9\u53D8\u5316"):(await nr(e,r,"utf8"),S(`\u66FF\u6362\u5B8C\u6210: file=${e} count=${s}`))}catch(o){return o.code==="ENOENT"?S(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${e}`,!0):S(`edit \u5931\u8D25: ${o.message}`,!0)}}};import{z as Xe}from"zod";var rr=Xe.object({url:Xe.string().min(1)}).strict(),Ye=1e4,Bt=512e3,Se=4e3,sr=new Set(["http:","https:","data:"]),ir=/<\/\s*(p|div|section|article|header|footer|aside|main|h[1-6]|li|tr|table|blockquote)\s*>/gi,ar=/<\s*(br|hr)\s*\/?>/gi,cr=/<\s*li[^>]*>/gi,lr=/<[^>]+>/g,ur=/<(script|style)[^>]*>[\s\S]*?<\/\s*\1>/gi,mr=t=>t.replace(/&nbsp;/gi," ").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&amp;/gi,"&").replace(/&quot;/gi,'"').replace(/&#39;/g,"'").replace(/&#(x?[0-9a-fA-F]+);/g,(o,r)=>{try{let s=r.startsWith("x")||r.startsWith("X")?parseInt(r.slice(1),16):parseInt(r,10);return Number.isFinite(s)?String.fromCharCode(s):""}catch{return""}}),pr=t=>{let o=t.replace(ur," ").replace(cr,"- ").replace(ar,`
4
- `).replace(ir,`
5
- `).replace(lr," "),s=mr(o).replace(/\r/g,"").split(`
2
+ var Mr=Object.create;var hn=Object.defineProperty;var Pr=Object.getOwnPropertyDescriptor;var Rr=Object.getOwnPropertyNames;var Ir=Object.getPrototypeOf,$r=Object.prototype.hasOwnProperty;var yn=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Lr=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Rr(t))!$r.call(e,r)&&r!==n&&hn(e,r,{get:()=>t[r],enumerable:!(o=Pr(t,r))||o.enumerable});return e};var xn=(e,t,n)=>(n=e!=null?Mr(Ir(e)):{},Lr(t||!e||!e.__esModule?hn(n,"default",{value:e,enumerable:!0}):n,e));var Pn=yn((Vl,Mn)=>{"use strict";function kn(e){return Array.isArray(e)?e:[e]}var $t="",wn=" ",Rt="\\",Kr=/^\s+$/,qr=/(?:[^\\]|^)\\$/,Xr=/^\\!/,Yr=/^\\#/,Zr=/\r?\n/g,Qr=/^\.*\/|^\.+$/,It="/",Cn="node-ignore";typeof Symbol<"u"&&(Cn=Symbol.for("node-ignore"));var bn=Cn,es=(e,t,n)=>Object.defineProperty(e,t,{value:n}),ts=/([0-z])-([0-z])/g,En=()=>!1,ns=e=>e.replace(ts,(t,n,o)=>n.charCodeAt(0)<=o.charCodeAt(0)?t:$t),os=e=>{let{length:t}=e;return e.slice(0,t-t%2)},rs=[[/^\uFEFF/,()=>$t],[/((?:\\\\)*?)(\\?\s+)$/,(e,t,n)=>t+(n.indexOf("\\")===0?wn:$t)],[/(\\+?)\s/g,(e,t)=>{let{length:n}=t;return t.slice(0,n-n%2)+wn}],[/[\\$.|*+(){^]/g,e=>`\\${e}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(e,t,n)=>t+6<n.length?"(?:\\/[^\\/]+)*":"\\/.+"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(e,t,n)=>{let o=n.replace(/\\\*/g,"[^\\/]*");return t+o}],[/\\\\\\(?=[$.|*+(){^])/g,()=>Rt],[/\\\\/g,()=>Rt],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(e,t,n,o,r)=>t===Rt?`\\[${n}${os(o)}${r}`:r==="]"&&o.length%2===0?`[${ns(n)}${o}]`:"[]"],[/(?:[^*])$/,e=>/\/$/.test(e)?`${e}$`:`${e}(?=$|\\/$)`],[/(\^|\\\/)?\\\*$/,(e,t)=>`${t?`${t}[^/]+`:"[^/]*"}(?=$|\\/$)`]],_n=Object.create(null),ss=(e,t)=>{let n=_n[e];return n||(n=rs.reduce((o,[r,s])=>o.replace(r,s.bind(e)),e),_n[e]=n),t?new RegExp(n,"i"):new RegExp(n)},Ot=e=>typeof e=="string",is=e=>e&&Ot(e)&&!Kr.test(e)&&!qr.test(e)&&e.indexOf("#")!==0,as=e=>e.split(Zr),Lt=class{constructor(t,n,o,r){this.origin=t,this.pattern=n,this.negative=o,this.regex=r}},cs=(e,t)=>{let n=e,o=!1;e.indexOf("!")===0&&(o=!0,e=e.substr(1)),e=e.replace(Xr,"!").replace(Yr,"#");let r=ss(e,t);return new Lt(n,e,o,r)},ls=(e,t)=>{throw new t(e)},pe=(e,t,n)=>Ot(e)?e?pe.isNotRelative(e)?n(`path should be a \`path.relative()\`d string, but got "${t}"`,RangeError):!0:n("path must not be empty",TypeError):n(`path must be a string, but got \`${t}\``,TypeError),An=e=>Qr.test(e);pe.isNotRelative=An;pe.convert=e=>e;var Nt=class{constructor({ignorecase:t=!0,ignoreCase:n=t,allowRelativePaths:o=!1}={}){es(this,bn,!0),this._rules=[],this._ignoreCase=n,this._allowRelativePaths=o,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(t){if(t&&t[bn]){this._rules=this._rules.concat(t._rules),this._added=!0;return}if(is(t)){let n=cs(t,this._ignoreCase);this._added=!0,this._rules.push(n)}}add(t){return this._added=!1,kn(Ot(t)?as(t):t).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(t){return this.add(t)}_testOne(t,n){let o=!1,r=!1;return this._rules.forEach(s=>{let{negative:i}=s;if(r===i&&o!==r||i&&!o&&!r&&!n)return;s.regex.test(t)&&(o=!i,r=i)}),{ignored:o,unignored:r}}_test(t,n,o,r){let s=t&&pe.convert(t);return pe(s,t,this._allowRelativePaths?En:ls),this._t(s,n,o,r)}_t(t,n,o,r){if(t in n)return n[t];if(r||(r=t.split(It)),r.pop(),!r.length)return n[t]=this._testOne(t,o);let s=this._t(r.join(It)+It,n,o,r);return n[t]=s.ignored?s:this._testOne(t,o)}ignores(t){return this._test(t,this._ignoreCache,!1).ignored}createFilter(){return t=>!this.ignores(t)}filter(t){return kn(t).filter(this.createFilter())}test(t){return this._test(t,this._testCache,!0)}},rt=e=>new Nt(e),us=e=>pe(e&&pe.convert(e),e,En);rt.isPathValid=us;rt.default=rt;Mn.exports=rt;if(typeof process<"u"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let e=n=>/^\\\\\?\\/.test(n)||/["<>|\u0000-\u001F]+/u.test(n)?n:n.replace(/\\/g,"/");pe.convert=e;let t=/^[a-z]:\//i;pe.isNotRelative=n=>t.test(n)||An(n)}});var Vo=yn((Jm,wt)=>{"use strict";function Ho(e){return Array.isArray(e)?e:[e]}var Ba=void 0,on="",Oo=" ",nn="\\",ja=/^\s+$/,Fa=/(?:[^\\]|^)\\$/,Ga=/^\\!/,Va=/^\\#/,za=/\r?\n/g,Wa=/^\.{0,2}\/|^\.{1,2}$/,Ja=/\/$/,Ne="/",Uo="node-ignore";typeof Symbol<"u"&&(Uo=Symbol.for("node-ignore"));var Bo=Uo,Oe=(e,t,n)=>(Object.defineProperty(e,t,{value:n}),n),Ka=/([0-z])-([0-z])/g,jo=()=>!1,qa=e=>e.replace(Ka,(t,n,o)=>n.charCodeAt(0)<=o.charCodeAt(0)?t:on),Xa=e=>{let{length:t}=e;return e.slice(0,t-t%2)},Ya=[[/^\uFEFF/,()=>on],[/((?:\\\\)*?)(\\?\s+)$/,(e,t,n)=>t+(n.indexOf("\\")===0?Oo:on)],[/(\\+?)\s/g,(e,t)=>{let{length:n}=t;return t.slice(0,n-n%2)+Oo}],[/[\\$.|*+(){^]/g,e=>`\\${e}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(e,t,n)=>t+6<n.length?"(?:\\/[^\\/]+)*":"\\/.+"],[/(^|[^\\]+)(\\\*)+(?=.+)/g,(e,t,n)=>{let o=n.replace(/\\\*/g,"[^\\/]*");return t+o}],[/\\\\\\(?=[$.|*+(){^])/g,()=>nn],[/\\\\/g,()=>nn],[/(\\)?\[([^\]/]*?)(\\*)($|\])/g,(e,t,n,o,r)=>t===nn?`\\[${n}${Xa(o)}${r}`:r==="]"&&o.length%2===0?`[${qa(n)}${o}]`:"[]"],[/(?:[^*])$/,e=>/\/$/.test(e)?`${e}$`:`${e}(?=$|\\/$)`]],Za=/(^|\\\/)?\\\*$/,Xe="regex",vt="checkRegex",Do="_",Qa={[Xe](e,t){return`${t?`${t}[^/]+`:"[^/]*"}(?=$|\\/$)`},[vt](e,t){return`${t?`${t}[^/]*`:"[^/]*"}(?=$|\\/$)`}},ec=e=>Ya.reduce((t,[n,o])=>t.replace(n,o.bind(e)),e),kt=e=>typeof e=="string",tc=e=>e&&kt(e)&&!ja.test(e)&&!Fa.test(e)&&e.indexOf("#")!==0,nc=e=>e.split(za).filter(Boolean),rn=class{constructor(t,n,o,r,s,i){this.pattern=t,this.mark=n,this.negative=s,Oe(this,"body",o),Oe(this,"ignoreCase",r),Oe(this,"regexPrefix",i)}get regex(){let t=Do+Xe;return this[t]?this[t]:this._make(Xe,t)}get checkRegex(){let t=Do+vt;return this[t]?this[t]:this._make(vt,t)}_make(t,n){let o=this.regexPrefix.replace(Za,Qa[t]),r=this.ignoreCase?new RegExp(o,"i"):new RegExp(o);return Oe(this,n,r)}},oc=({pattern:e,mark:t},n)=>{let o=!1,r=e;r.indexOf("!")===0&&(o=!0,r=r.substr(1)),r=r.replace(Ga,"!").replace(Va,"#");let s=ec(r);return new rn(e,t,r,n,o,s)},sn=class{constructor(t){this._ignoreCase=t,this._rules=[]}_add(t){if(t&&t[Bo]){this._rules=this._rules.concat(t._rules._rules),this._added=!0;return}if(kt(t)&&(t={pattern:t}),tc(t.pattern)){let n=oc(t,this._ignoreCase);this._added=!0,this._rules.push(n)}}add(t){return this._added=!1,Ho(kt(t)?nc(t):t).forEach(this._add,this),this._added}test(t,n,o){let r=!1,s=!1,i;this._rules.forEach(c=>{let{negative:l}=c;s===l&&r!==s||l&&!r&&!s&&!n||!c[o].test(t)||(r=!l,s=l,i=l?Ba:c)});let a={ignored:r,unignored:s};return i&&(a.rule=i),a}},rc=(e,t)=>{throw new t(e)},he=(e,t,n)=>kt(e)?e?he.isNotRelative(e)?n(`path should be a \`path.relative()\`d string, but got "${t}"`,RangeError):!0:n("path must not be empty",TypeError):n(`path must be a string, but got \`${t}\``,TypeError),Fo=e=>Wa.test(e);he.isNotRelative=Fo;he.convert=e=>e;var an=class{constructor({ignorecase:t=!0,ignoreCase:n=t,allowRelativePaths:o=!1}={}){Oe(this,Bo,!0),this._rules=new sn(n),this._strictPathCheck=!o,this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}add(t){return this._rules.add(t)&&this._initCache(),this}addPattern(t){return this.add(t)}_test(t,n,o,r){let s=t&&he.convert(t);return he(s,t,this._strictPathCheck?rc:jo),this._t(s,n,o,r)}checkIgnore(t){if(!Ja.test(t))return this.test(t);let n=t.split(Ne).filter(Boolean);if(n.pop(),n.length){let o=this._t(n.join(Ne)+Ne,this._testCache,!0,n);if(o.ignored)return o}return this._rules.test(t,!1,vt)}_t(t,n,o,r){if(t in n)return n[t];if(r||(r=t.split(Ne).filter(Boolean)),r.pop(),!r.length)return n[t]=this._rules.test(t,o,Xe);let s=this._t(r.join(Ne)+Ne,n,o,r);return n[t]=s.ignored?s:this._rules.test(t,o,Xe)}ignores(t){return this._test(t,this._ignoreCache,!1).ignored}createFilter(){return t=>!this.ignores(t)}filter(t){return Ho(t).filter(this.createFilter())}test(t){return this._test(t,this._testCache,!0)}},cn=e=>new an(e),sc=e=>he(e&&he.convert(e),e,jo),Go=()=>{let e=n=>/^\\\\\?\\/.test(n)||/["<>|\u0000-\u001F]+/u.test(n)?n:n.replace(/\\/g,"/");he.convert=e;let t=/^[a-z]:\//i;he.isNotRelative=n=>t.test(n)||Fo(n)};typeof process<"u"&&process.platform==="win32"&&Go();wt.exports=cn;cn.default=cn;wt.exports.isPathValid=sc;Oe(wt.exports,Symbol.for("setupWindows"),Go)});import{randomUUID as Sr}from"crypto";import{createInterface as Tl}from"readline/promises";import{stdin as Sl,stdout as vl}from"process";import{render as kl}from"ink";import Nr from"os";import{readFile as Or}from"fs/promises";import{join as Dr,dirname as Hr}from"path";import{fileURLToPath as Ur}from"url";var Br=/{{\s*([\w.-]+)\s*}}/g;function jr(e,t){return e.replace(Br,(n,o)=>t[o]??"")}function Fr(){try{return Nr.userInfo().username}catch{return process.env.USER??process.env.USERNAME??"unknown"}}async function Tn(){let e=Hr(Ur(import.meta.url)),t=Dr(e,"prompt.md"),n=await Or(t,"utf-8"),o={date:new Date().toISOString(),user:Fr(),pwd:process.cwd()};return jr(n,o)}import{appendFile as Gr,mkdir as Vr}from"fs/promises";import{dirname as zr}from"path";var ot=class{constructor(t){this.filePath=t}ready=!1;async append(t){this.ready||(await Vr(zr(this.filePath),{recursive:!0}),this.ready=!0),await Gr(this.filePath,`${JSON.stringify(t)}
3
+ `,"utf8")}async flush(){return Promise.resolve()}};function Sn(e){return{ts:new Date().toISOString(),sessionId:e.sessionId,turn:e.turn,step:e.step,type:e.type,content:e.content,role:e.role,meta:e.meta}}import{spawn as Wr}from"child_process";import{z as Pt}from"zod";function S(e,t=!1){return{content:[{type:"text",text:e}],isError:t}}var Jr=Pt.object({command:Pt.string().min(1,"command \u4E0D\u80FD\u4E3A\u7A7A"),timeout:Pt.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(),vn={name:"bash",description:"\u5728 shell \u4E2D\u6267\u884C\u547D\u4EE4\uFF0C\u8FD4\u56DE exit/stdout/stderr",inputSchema:Jr,execute:async({command:e,timeout:t})=>{let n=e.trim();if(!n)return S("bash \u9700\u8981\u8981\u6267\u884C\u7684\u547D\u4EE4",!0);try{let o=Wr("bash",["-lc",n],{env:process.env,stdio:["ignore","pipe","pipe"]}),r=g=>new Promise(v=>{if(!g)return v("");let h=[];g.setEncoding("utf8"),g.on("data",y=>h.push(y)),g.on("error",()=>v("")),g.on("end",()=>v(h.join("")))}),s=r(o.stdout),i=r(o.stderr),a,c=new Promise((g,v)=>{o.on("error",h=>v(h)),o.on("close",h=>g(typeof h=="number"?h:-1))}),l=t&&t>0?new Promise((g,v)=>{a=setTimeout(()=>{o.kill(),v(new Error(`bash \u8D85\u65F6 ${t}ms\uFF0C\u5DF2\u7EC8\u6B62\u8FDB\u7A0B`))},t)}):null,u=l?await Promise.race([c,l]):await c;a&&clearTimeout(a);let[p,k]=await Promise.all([s,i]);return S(`exit=${u} stdout="${p}" stderr="${k}"`)}catch(o){return S(`bash \u6267\u884C\u5931\u8D25: ${o.message}`,!0)}}};import{access as ws,readFile as bs,writeFile as _s}from"fs/promises";var Ln=xn(Pn(),1);import{normalize as ps,resolve as $n,dirname as Rn,join as Dt,relative as ms}from"path";import{existsSync as Ht,statSync as ds}from"fs";import{readFile as fs}from"fs/promises";function ue(e){return ps($n(e))}var gs=["node_modules/",".git/","dist/","out/","build/","coverage/",".cache/",".idea/",".DS_Store",".next/",".turbo/",".pnpm/",".pnpm-store/","*.log","logs/","tmp/","temp/","vendor/"],hs=100,ys=1e4,xs="<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>",In=new Map;function Ts(e){return e.replace(/\\/g,"/")}function Ss(e){let t=$n(e);try{ds(t).isFile()&&(t=Rn(t))}catch{t=process.cwd()}let n=t;for(;;){if(Ht(Dt(t,".gitignore"))||Ht(Dt(t,".git")))return t;let o=Rn(t);if(o===t)return n;t=o}}async function vs(e){let t=Dt(e,".gitignore");return Ht(t)?(await fs(t,"utf8")).split(/\r?\n/).map(o=>o.trim()).filter(o=>o.length>0&&!o.startsWith("#")):[]}async function ks(e){let t=(0,Ln.default)();t.add(gs);let n=await vs(e);return n.length>0&&t.add(n),{root:e,ignores:o=>{let r=ms(e,o);return!r||r.startsWith("..")?!1:t.ignores(Ts(r))}}}async function st(e){let t=Ss(e),n=In.get(t);if(n)return n;let o=ks(t);return In.set(t,o),o}function it(e,t){return t>hs||e.length>ys?`${e}
4
+
5
+ ${xs}`:e}import{z as Fe}from"zod";var Cs=Fe.object({file_path:Fe.string().min(1),old_string:Fe.string().min(1,"old_string \u4E0D\u80FD\u4E3A\u7A7A"),new_string:Fe.string(),replace_all:Fe.boolean().optional()}).strict(),Nn={name:"edit",description:"\u5728\u6587\u4EF6\u4E2D\u66FF\u6362\u6587\u672C\uFF0C\u652F\u6301 replace_all",inputSchema:Cs,execute:async e=>{let t=ue(e.file_path),n=e.replace_all??!1;if(!e.old_string.trim())return S("old_string \u4E0D\u80FD\u4E3A\u7A7A",!0);try{await ws(t);let o=await bs(t,"utf8");if(!o.includes(e.old_string))return S("\u672A\u627E\u5230\u5F85\u66FF\u6362\u6587\u672C",!0);let r,s=0;if(n){let i=o.split(e.old_string);s=i.length-1,r=i.join(e.new_string)}else r=o.replace(e.old_string,e.new_string),s=1;return r===o?S("\u672A\u68C0\u6D4B\u5230\u5185\u5BB9\u53D8\u5316"):(await _s(t,r,"utf8"),S(`\u66FF\u6362\u5B8C\u6210: file=${t} count=${s}`))}catch(o){return o.code==="ENOENT"?S(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`,!0):S(`edit \u5931\u8D25: ${o.message}`,!0)}}};import{z as On}from"zod";var Es=On.object({url:On.string().min(1)}).strict(),Dn=1e4,Ge=512e3,Ut=4e3,As=new Set(["http:","https:","data:"]),Ms=/<\/\s*(p|div|section|article|header|footer|aside|main|h[1-6]|li|tr|table|blockquote)\s*>/gi,Ps=/<\s*(br|hr)\s*\/?>/gi,Rs=/<\s*li[^>]*>/gi,Is=/<[^>]+>/g,$s=/<(script|style)[^>]*>[\s\S]*?<\/\s*\1>/gi,Ls=e=>e.replace(/&nbsp;/gi," ").replace(/&lt;/gi,"<").replace(/&gt;/gi,">").replace(/&amp;/gi,"&").replace(/&quot;/gi,'"').replace(/&#39;/g,"'").replace(/&#(x?[0-9a-fA-F]+);/g,(o,r)=>{try{let s=r.startsWith("x")||r.startsWith("X")?parseInt(r.slice(1),16):parseInt(r,10);return Number.isFinite(s)?String.fromCharCode(s):""}catch{return""}}),Ns=e=>{let o=e.replace($s," ").replace(Rs,"- ").replace(Ps,`
6
+ `).replace(Ms,`
7
+ `).replace(Is," "),s=Ls(o).replace(/\r/g,"").split(`
6
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(`
7
- `).trim()},dr=t=>t.replace(/\s+/g," ").trim(),qe={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:rr,execute:async t=>{let e;try{e=new URL(t.url)}catch{return S(`\u65E0\u6548 URL: ${t.url}`,!0)}if(!sr.has(e.protocol))return S(`\u4E0D\u652F\u6301\u7684\u534F\u8BAE: ${e.protocol}`,!0);let n=new AbortController,o=setTimeout(()=>n.abort(),Ye);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>Bt)return S(`\u8BF7\u6C42\u88AB\u62D2\u7EDD: \u54CD\u5E94\u4F53\u8FC7\u5927\uFF08${i} bytes\uFF09`,!0);let a=0,c="";if(r.body&&r.body.getReader){let N=r.body.getReader(),J=[];for(;;){let{done:b,value:k}=await N.read();if(b)break;if(k){if(a+=k.byteLength,a>Bt)return n.abort(),S(`\u8BF7\u6C42\u88AB\u4E2D\u6B62: \u54CD\u5E94\u4F53\u8D85\u8FC7 ${Bt} bytes`,!0);J.push(k)}}let f=new Uint8Array(a),Z=0;for(let b of J)f.set(b,Z),Z+=b.byteLength;c=new TextDecoder().decode(f)}else if(c=await r.text(),a=new TextEncoder().encode(c).byteLength,a>Bt)return S(`\u8BF7\u6C42\u88AB\u62D2\u7EDD: \u54CD\u5E94\u4F53\u8D85\u8FC7 ${Bt} 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),m=u?pr(c):c.trim(),y=dr(m),g=y.length>Se?`${y.slice(0,Se)}...`:y,_=y.length>Se?" text_truncated=true":"",C=u?" source=html_stripped":"";return S(`status=${r.status} bytes=${a} text_chars=${y.length} text="${g}"${_}${C}`)}catch(r){return r.name==="AbortError"?S(`\u8BF7\u6C42\u8D85\u65F6\u6216\u88AB\u4E2D\u6B62\uFF08${Ye}ms\uFF09`,!0):S(`\u8BF7\u6C42\u5931\u8D25: ${r.message}`,!0)}finally{clearTimeout(o)}}};import{z as ke}from"zod";import gr from"fast-glob";var fr=ke.object({pattern:ke.string().min(1),path:ke.string().optional()}).strict(),hr={name:"glob",description:"\u6309 glob \u6A21\u5F0F\u5339\u914D\u6587\u4EF6\uFF0C\u8FD4\u56DE\u7EDD\u5BF9\u8DEF\u5F84\u5217\u8868",inputSchema:fr,execute:async t=>{let e=t.path?ct(t.path):process.cwd();try{let n=await gr(t.pattern,{cwd:e,absolute:!0,onlyFiles:!0});return S(n.join(`
8
- `)||"\u672A\u627E\u5230\u5339\u914D\u6587\u4EF6")}catch(n){return S(`glob \u5931\u8D25: ${n.message}`,!0)}}},Ze=hr;import{spawn as yr,spawnSync as Tr}from"child_process";import{z as mt}from"zod";var xr=mt.object({pattern:mt.string().min(1),path:mt.string().optional(),output_mode:mt.enum(["content","files_with_matches","count"]).optional(),glob:mt.string().optional(),"-i":mt.boolean().optional(),"-A":mt.number().int().nonnegative().optional(),"-B":mt.number().int().nonnegative().optional(),"-C":mt.number().int().nonnegative().optional()}).strict(),Qe={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:xr,execute:async t=>{let e=Tr("rg",["--version"],{stdio:"ignore"});if(e.error||e.status!==0)return S("rg \u672A\u5B89\u88C5\u6216\u4E0D\u5728 PATH",!0);let n=t.path?ct(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=yr("rg",o,{stdio:["ignore","pipe","pipe"]}),i=u=>new Promise(m=>{if(!u)return m("");let y=[];u.setEncoding("utf8"),u.on("data",g=>y.push(g)),u.on("error",()=>m("")),u.on("end",()=>m(y.join("")))}),[a,c]=await Promise.all([i(s.stdout),i(s.stderr)]),l=await new Promise((u,m)=>{s.on("error",y=>m(y)),s.on("close",y=>u(typeof y=="number"?y:-1))});return l===2?S(`grep \u5931\u8D25(exit=2): ${c||a}`,!0):l===1&&!a.trim()?S("\u672A\u627E\u5230\u5339\u914D"):S(a||c||`\u547D\u4EE4\u5B8C\u6210 exit=${l}`)}catch(s){return S(`grep \u6267\u884C\u5931\u8D25: ${s.message}`,!0)}}};import{mkdir as Sr,readFile as kr,writeFile as wr,access as Cr}from"fs/promises";import{dirname as br,join as tn}from"path";import{homedir as _r}from"os";import{z as en}from"zod";var vr=en.object({fact:en.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 Er(){let t=process.env.MEMO_HOME?.trim()||tn(_r(),".memo");return tn(t,"Agents.md")}function Mr(t){return t.replace(/\r?\n/g," ").replace(/\s+/g," ").trim()}function Pr(t,e){let o=e.map(r=>r.trim()).filter(Boolean).map(r=>`- ${r}`);return`${t}
9
+ `).trim()},Os=e=>e.replace(/\s+/g," ").trim(),Hn={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:Es,execute:async e=>{let t;try{t=new URL(e.url)}catch{return S(`\u65E0\u6548 URL: ${e.url}`,!0)}if(!As.has(t.protocol))return S(`\u4E0D\u652F\u6301\u7684\u534F\u8BAE: ${t.protocol}`,!0);let n=new AbortController,o=setTimeout(()=>n.abort(),Dn);try{let r=await globalThis.fetch(t,{signal:n.signal}),s=r.headers.get("content-length"),i=s?Number(s):void 0;if(i&&i>Ge)return S(`\u8BF7\u6C42\u88AB\u62D2\u7EDD: \u54CD\u5E94\u4F53\u8FC7\u5927\uFF08${i} bytes\uFF09`,!0);let a=0,c="";if(r.body&&r.body.getReader){let y=r.body.getReader(),R=[];for(;;){let{done:b,value:_}=await y.read();if(b)break;if(_){if(a+=_.byteLength,a>Ge)return n.abort(),S(`\u8BF7\u6C42\u88AB\u4E2D\u6B62: \u54CD\u5E94\u4F53\u8D85\u8FC7 ${Ge} bytes`,!0);R.push(_)}}let f=new Uint8Array(a),U=0;for(let b of R)f.set(b,U),U+=b.byteLength;c=new TextDecoder().decode(f)}else if(c=await r.text(),a=new TextEncoder().encode(c).byteLength,a>Ge)return S(`\u8BF7\u6C42\u88AB\u62D2\u7EDD: \u54CD\u5E94\u4F53\u8D85\u8FC7 ${Ge} 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?Ns(c):c.trim(),k=Os(p),g=k.length>Ut?`${k.slice(0,Ut)}...`:k,v=k.length>Ut?" text_truncated=true":"",h=u?" source=html_stripped":"";return S(`status=${r.status} bytes=${a} text_chars=${k.length} text="${g}"${v}${h}`)}catch(r){return r.name==="AbortError"?S(`\u8BF7\u6C42\u8D85\u65F6\u6216\u88AB\u4E2D\u6B62\uFF08${Dn}ms\uFF09`,!0):S(`\u8BF7\u6C42\u5931\u8D25: ${r.message}`,!0)}finally{clearTimeout(o)}}};import{z as Bt}from"zod";import Ds from"fast-glob";var Hs=Bt.object({pattern:Bt.string().min(1),path:Bt.string().optional()}).strict(),Us={name:"glob",description:"\u6309 glob \u6A21\u5F0F\u5339\u914D\u6587\u4EF6\uFF0C\u8FD4\u56DE\u7EDD\u5BF9\u8DEF\u5F84\u5217\u8868",inputSchema:Hs,execute:async e=>{let t=e.path?ue(e.path):process.cwd();try{let n=await st(t),r=(await Ds(e.pattern,{cwd:t,absolute:!0,onlyFiles:!0})).filter(i=>!n.ignores(i));if(r.length===0)return S("\u672A\u627E\u5230\u5339\u914D\u6587\u4EF6");let s=r.join(`
10
+ `);return S(it(s,r.length))}catch(n){return S(`glob \u5931\u8D25: ${n.message}`,!0)}}},Un=Us;import{spawn as Bs,spawnSync as js}from"child_process";import{z as me}from"zod";import{isAbsolute as Bn,resolve as jn}from"path";var Fs=me.object({pattern:me.string().min(1),path:me.string().optional(),output_mode:me.enum(["content","files_with_matches","count"]).optional(),glob:me.string().optional(),"-i":me.boolean().optional(),"-A":me.number().int().nonnegative().optional(),"-B":me.number().int().nonnegative().optional(),"-C":me.number().int().nonnegative().optional()}).strict(),Fn={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:Fs,execute:async e=>{let t=js("rg",["--version"],{stdio:"ignore"});if(t.error||t.status!==0)return S("rg \u672A\u5B89\u88C5\u6216\u4E0D\u5728 PATH",!0);let n=e.path?ue(e.path):process.cwd(),o=["--color","never"],r=e.output_mode??"content";r==="files_with_matches"?o.push("-l"):r==="count"?o.push("-c"):o.push("--line-number","--no-heading"),e["-i"]&&o.push("-i"),e.glob&&o.push("--glob",e.glob),e["-A"]!==void 0&&o.push("-A",String(e["-A"])),e["-B"]!==void 0&&o.push("-B",String(e["-B"])),e["-C"]!==void 0&&o.push("-C",String(e["-C"])),o.push(e.pattern,n);try{let s=await st(n),i=Bs("rg",o,{stdio:["ignore","pipe","pipe"]}),a=h=>new Promise(y=>{if(!h)return y("");let R=[];h.setEncoding("utf8"),h.on("data",f=>R.push(f)),h.on("error",()=>y("")),h.on("end",()=>y(R.join("")))}),[c,l]=await Promise.all([a(i.stdout),a(i.stderr)]);if(await new Promise((h,y)=>{i.on("error",R=>y(R)),i.on("close",R=>h(typeof R=="number"?R:-1))})===2)return S(`grep \u5931\u8D25(exit=2): ${l||c}`,!0);let g=(c||l||"").split(/\r?\n/).map(h=>h.trimEnd()).filter(h=>h.length>0).filter(h=>{if(r==="files_with_matches"){let U=h.trim(),b=Bn(U)?U:jn(n,U);return!s.ignores(b)}let y=h.indexOf(":");if(y===-1)return!0;let R=h.slice(0,y),f=Bn(R)?R:jn(n,R);return!s.ignores(f)});if(g.length===0)return S("\u672A\u627E\u5230\u5339\u914D");let v=g.join(`
11
+ `);return S(it(v,g.length))}catch(s){return S(`grep \u6267\u884C\u5931\u8D25: ${s.message}`,!0)}}};import{mkdir as Gs,readFile as Vs,writeFile as zs,access as Ws}from"fs/promises";import{dirname as Js,join as Gn}from"path";import{homedir as Ks}from"os";import{z as Vn}from"zod";var qs=Vn.object({fact:Vn.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 Xs(){let e=process.env.MEMO_HOME?.trim()||Gn(Ks(),".memo");return Gn(e,"Agents.md")}function Ys(e){return e.replace(/\r?\n/g," ").replace(/\s+/g," ").trim()}function Zs(e,t){let o=t.map(r=>r.trim()).filter(Boolean).map(r=>`- ${r}`);return`${e}
9
12
 
10
13
  ${o.join(`
11
14
  `)}
12
- `}var nn={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:vr,execute:async t=>{let e=Mr(t.fact);if(!e)return S("fact cannot be empty",!0);let n=Er(),o=br(n);try{await Sr(o,{recursive:!0});let r="## Memo Added Memories";try{let s=await(async()=>{try{return await Cr(n),await kr(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=Pr(r,c);await wr(n,l,"utf-8")}catch(s){console.warn(`Memory maintenance failed: ${s.message}`)}return S(`Memory saved to: ${n}`)}catch(r){return S(`Failed to write memory: ${r.message}`,!0)}}};import{z as pt}from"zod";var te=10,ot=[],Ar=pt.object({type:pt.enum(["add","replace","update","remove"]),todos:pt.array(pt.object({content:pt.string().trim().min(1,"content \u4E0D\u80FD\u4E3A\u7A7A").max(200,"content \u6700\u957F 200 \u5B57\u7B26"),status:pt.enum(["pending","in_progress","completed"]).optional().default("pending"),id:pt.string().min(1,"id \u4E0D\u80FD\u4E3A\u7A7A").optional()})).optional(),ids:pt.array(pt.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 ee(){return ot.map(t=>({...t}))}function $r(t){switch(t.type){case"add":{let e=t.todos,n=te-ot.length;if(e.length>n)return{error:`\u4EFB\u52A1\u4E0A\u9650 ${te}\uFF0C\u5F53\u524D\u5269\u4F59 ${n} \u6761\u7A7A\u4F4D`};let o=e.map(r=>({id:crypto.randomUUID(),content:r.content,status:r.status}));return ot.push(...o),{added:o,tasks:ee()}}case"replace":{let e=t.todos;if(e.length>te)return{error:`\u4EFB\u52A1\u4E0A\u9650 ${te}`};ot.splice(0,ot.length);let n=e.map(o=>({id:crypto.randomUUID(),content:o.content,status:o.status}));return ot.push(...n),{replaced:!0,tasks:ee()}}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(ot.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:ee()}}case"remove":{let e=t.ids,n=ot.length,o=new Set(e),r=ot.filter(s=>!o.has(s.id));return r.length===n?{error:"\u672A\u627E\u5230\u4EFB\u4F55\u53EF\u5220\u9664\u7684\u4EFB\u52A1 id"}:(ot.splice(0,ot.length,...r),{removed:e,tasks:ee()})}}}var on={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:Ar,execute:async t=>{let e=$r(t);if(e.error)return S(e.error,!0);let n={op:t.type,count:ot.length,tasks:e.tasks,added:e.added,updated:e.updated,removed:e.removed,replaced:!!e.replaced};return S(JSON.stringify(n))}};import{z as ne}from"zod";import{extname as Ir}from"path";import{gzipSync as Rr}from"zlib";import{access as Nr,readFile as Lr}from"fs/promises";var rn=512e3,sn=2e6,Or=200,an=1e3,Dr=1024,we=4e3,Hr=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg"]);function Ur(t){let e=Ir(t).toLowerCase();return Hr.has(e)}function Br(t){return Buffer.from(t).toString("base64")}function Fr(t){try{let e=Rr(t,{level:6});if(e.byteLength<t.byteLength)return{data:new Uint8Array(e),encoding:"gzip+base64"}}catch{}return{data:t,encoding:"base64"}}function jr(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 zr=ne.object({file_path:ne.string().min(1),offset:ne.number().int().positive().optional(),limit:ne.number().int().positive().optional()}).strict(),cn={name:"read",description:"\u8BFB\u53D6\u6307\u5B9A\u6587\u4EF6\u5185\u5BB9\uFF0C\u53EF\u6309 offset/limit \u622A\u53D6\u5E76\u9644\u5E26\u884C\u53F7",inputSchema:zr,execute:async t=>{let e=ct(t.file_path),n=t.offset??1,o=t.limit??Or,r=Math.min(o,an);try{await Nr(e);let s=await Lr(e),i=s.byteLength;if(Ur(e)){if(i>sn)return S(`\u56FE\u7247\u8FC7\u5927\uFF08${i} bytes\uFF09\uFF0C\u8D85\u8FC7\u9608\u503C ${sn} bytes\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6`,!0);let b=new Uint8Array(s),{data:k,encoding:D}=Fr(b),E=Br(k),Y=E.length>we?`${E.slice(0,we)}...`:E,w=E.length>we;return S(jr({encoding:D,base64:Y,originalBytes:b.byteLength,payloadBytes:k.byteLength,truncated:w}))}if(i>rn)return S(`\u6587\u4EF6\u8FC7\u5927\uFF08${i} bytes\uFF09\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6\uFF0C\u9608\u503C ${rn} bytes`,!0);let c=new Uint8Array(s),l=Math.min(c.length,Dr);for(let b=0;b<l;b++)if(c[b]===0)return S("\u68C0\u6D4B\u5230\u4E8C\u8FDB\u5236\u5185\u5BB9\uFF0C\u5DF2\u62D2\u7EDD\u76F4\u63A5\u8BFB\u53D6",!0);let m=new TextDecoder().decode(c).split(/\r?\n/),y=Math.max(0,n-1),g=Math.min(m.length,y+r),C=m.slice(y,g).map((b,k)=>`${y+k+1}: ${b}`).join(`
13
- `),N=g<m.length,Z=o!==r||N&&t.limit===void 0?`
14
- ... (truncated, showing ${r} lines; max=${an})`:"";return S(C+Z)}catch(s){return S(`\u8BFB\u53D6\u5931\u8D25: ${s.message}`,!0)}}};import{z as Ce}from"zod";import{dirname as Gr}from"path";import{mkdir as Vr,writeFile as Wr}from"fs/promises";var Jr=Ce.object({file_path:Ce.string().min(1),content:Ce.any().optional()}).strict();function Kr(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 ln={name:"write",description:"\u521B\u5EFA\u6216\u8986\u76D6\u6587\u4EF6\uFF0C\u4F20\u5165 file_path \u4E0E content",inputSchema:Jr,execute:async t=>{let e=ct(t.file_path),{data:n,info:o}=Kr(t.content);try{return await Vr(Gr(e),{recursive:!0}),await Wr(e,n instanceof Uint8Array?n:String(n)),S(`\u5DF2\u5199\u5165 ${e} (overwrite, ${o})`)}catch(r){return S(`\u5199\u5165\u5931\u8D25: ${r.message}`,!0)}}};function Xr(t){let e=t.toJSONSchema(),{$schema:n,...o}=e;return o}function Yr(t){return{name:t.name,description:t.description,source:"native",inputSchema:Xr(t.inputSchema),execute:t.execute}}function un(t){return t.map(Yr)}var qr={bash:Je,read:cn,write:ln,edit:Ke,glob:Ze,grep:Qe,webfetch:qe,save_memory:nn,todo:on},Zr=Object.values(qr),mn=un(Zr);import ws from"openai";import{encoding_for_model as Qr,get_encoding as ts}from"@dqbd/tiktoken";var pn="cl100k_base";function es(t){let e=t?.trim()||pn;try{let n=()=>Qr(e);return n().free(),{model:e,factory:n}}catch{let n=pn,o=()=>ts(n);return o().free(),{model:n,factory:o}}}function dn(t){let{model:e,factory:n}=es(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 m of l)u+=r,u+=a(m.content),m.name&&(u+=i);return u+=s,u},dispose:()=>o.free()}}import{mkdir as ns,writeFile as os,readFile as rs,access as ss}from"fs/promises";import{homedir as gn}from"os";import{dirname as is,join as _t}from"path";import{randomUUID as dl}from"crypto";import{parse as as}from"toml";var cs=_t(gn(),".memo"),ls="sessions",us="Agents.md",Ft={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 ms(t){return/^[A-Za-z0-9_-]+$/.test(t)?t:JSON.stringify(t)}function ps(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 fn(t){return t.startsWith("~")?_t(gn(),t.slice(1)):t}function ds(t){let e=t.providers.map(r=>{let s=typeof r?.name=="string"?r.name:"";if(!s)return"";let a=[`[[providers.${ms(s)}]]`,`name = ${JSON.stringify(s)}`,`env_api_key = ${JSON.stringify(String(r.env_api_key??""))}`,`model = ${JSON.stringify(String(r.model??""))}`];return r.base_url&&a.push(`base_url = ${JSON.stringify(String(r.base_url))}`),a.join(`
15
+ `}var zn={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:qs,execute:async e=>{let t=Ys(e.fact);if(!t)return S("fact cannot be empty",!0);let n=Xs(),o=Js(n);try{await Gs(o,{recursive:!0});let r="## Memo Added Memories";try{let s=await(async()=>{try{return await Ws(n),await Vs(n,"utf-8")}catch{return""}})(),[,i=""]=s.split(r),a=i.split(/\r?\n/).filter(u=>u.trim().startsWith("- ")).map(u=>u.replace(/^-+\s*/,"").trim());a.push(t);let c=a.slice(Math.max(0,a.length-50)),l=Zs(r,c);await zs(n,l,"utf-8")}catch(s){console.warn(`Memory maintenance failed: ${s.message}`)}return S(`Memory saved to: ${n}`)}catch(r){return S(`Failed to write memory: ${r.message}`,!0)}}};import{z as de}from"zod";var at=10,ce=[],Qs=de.object({type:de.enum(["add","replace","update","remove"]),todos:de.array(de.object({content:de.string().trim().min(1,"content \u4E0D\u80FD\u4E3A\u7A7A").max(200,"content \u6700\u957F 200 \u5B57\u7B26"),status:de.enum(["pending","in_progress","completed"]).optional().default("pending"),id:de.string().min(1,"id \u4E0D\u80FD\u4E3A\u7A7A").optional()})).optional(),ids:de.array(de.string().min(1,"id \u4E0D\u80FD\u4E3A\u7A7A")).optional()}).strict().refine(e=>{if(["add","replace","update"].includes(e.type)){if(!e.todos||e.todos.length===0)return!1;if(e.type==="update")return e.todos.every(t=>t.id)}return!(e.type==="remove"&&(!e.ids||e.ids.length===0))},{message:"add/replace/update \u9700\u8981 todos\uFF0Cremove \u9700\u8981 ids\uFF0Cupdate \u9700\u8981 id"});function ct(){return ce.map(e=>({...e}))}function ei(e){switch(e.type){case"add":{let t=e.todos,n=at-ce.length;if(t.length>n)return{error:`\u4EFB\u52A1\u4E0A\u9650 ${at}\uFF0C\u5F53\u524D\u5269\u4F59 ${n} \u6761\u7A7A\u4F4D`};let o=t.map(r=>({id:crypto.randomUUID(),content:r.content,status:r.status}));return ce.push(...o),{added:o,tasks:ct()}}case"replace":{let t=e.todos;if(t.length>at)return{error:`\u4EFB\u52A1\u4E0A\u9650 ${at}`};ce.splice(0,ce.length);let n=t.map(o=>({id:crypto.randomUUID(),content:o.content,status:o.status}));return ce.push(...n),{replaced:!0,tasks:ct()}}case"update":{let t=e.todos,n=t.map(s=>s.id);if(new Set(n).size!==n.length)return{error:"\u66F4\u65B0\u5217\u8868\u5B58\u5728\u91CD\u590D id"};let r=new Map(ce.map(s=>[s.id,s]));for(let s of t){let i=r.get(s.id);if(!i)return{error:`\u672A\u627E\u5230\u4EFB\u52A1 id=${s.id}`};i.content=s.content,s.status&&(i.status=s.status)}return{updated:n,tasks:ct()}}case"remove":{let t=e.ids,n=ce.length,o=new Set(t),r=ce.filter(s=>!o.has(s.id));return r.length===n?{error:"\u672A\u627E\u5230\u4EFB\u4F55\u53EF\u5220\u9664\u7684\u4EFB\u52A1 id"}:(ce.splice(0,ce.length,...r),{removed:t,tasks:ct()})}}}var Wn={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:Qs,execute:async e=>{let t=ei(e);if(t.error)return S(t.error,!0);let n={op:e.type,count:ce.length,tasks:t.tasks,added:t.added,updated:t.updated,removed:t.removed,replaced:!!t.replaced};return S(JSON.stringify(n))}};import{z as lt}from"zod";import{extname as ti}from"path";import{gzipSync as ni}from"zlib";import{access as oi,readFile as ri}from"fs/promises";var Jn=512e3,Kn=2e6,si=200,qn=1e3,ii=1024,jt=4e3,ai=new Set([".png",".jpg",".jpeg",".gif",".webp",".bmp",".svg"]);function ci(e){let t=ti(e).toLowerCase();return ai.has(t)}function li(e){return Buffer.from(e).toString("base64")}function ui(e){try{let t=ni(e,{level:6});if(t.byteLength<e.byteLength)return{data:new Uint8Array(t),encoding:"gzip+base64"}}catch{}return{data:e,encoding:"base64"}}function pi(e){let t=e.truncated?" truncated=true":"";return`image_base64 (encoding=${e.encoding} original_bytes=${e.originalBytes} payload_bytes=${e.payloadBytes} base64_length=${e.base64.length}${t}): ${e.base64}`}var mi=lt.object({file_path:lt.string().min(1),offset:lt.number().int().positive().optional(),limit:lt.number().int().positive().optional()}).strict(),Xn={name:"read",description:"\u8BFB\u53D6\u6307\u5B9A\u6587\u4EF6\u5185\u5BB9\uFF0C\u53EF\u6309 offset/limit \u622A\u53D6\u5E76\u9644\u5E26\u884C\u53F7",inputSchema:mi,execute:async e=>{let t=ue(e.file_path),n=e.offset??1,o=e.limit??si,r=Math.min(o,qn);try{await oi(t);let s=await ri(t),i=s.byteLength;if(ci(t)){if(i>Kn)return S(`\u56FE\u7247\u8FC7\u5927\uFF08${i} bytes\uFF09\uFF0C\u8D85\u8FC7\u9608\u503C ${Kn} bytes\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6`,!0);let b=new Uint8Array(s),{data:_,encoding:B}=ui(b),E=li(_),F=E.length>jt?`${E.slice(0,jt)}...`:E,w=E.length>jt;return S(pi({encoding:B,base64:F,originalBytes:b.byteLength,payloadBytes:_.byteLength,truncated:w}))}if(i>Jn)return S(`\u6587\u4EF6\u8FC7\u5927\uFF08${i} bytes\uFF09\uFF0C\u5DF2\u62D2\u7EDD\u8BFB\u53D6\uFF0C\u9608\u503C ${Jn} bytes`,!0);let c=new Uint8Array(s),l=Math.min(c.length,ii);for(let b=0;b<l;b++)if(c[b]===0)return S("\u68C0\u6D4B\u5230\u4E8C\u8FDB\u5236\u5185\u5BB9\uFF0C\u5DF2\u62D2\u7EDD\u76F4\u63A5\u8BFB\u53D6",!0);let p=new TextDecoder().decode(c).split(/\r?\n/),k=Math.max(0,n-1),g=Math.min(p.length,k+r),h=p.slice(k,g).map((b,_)=>`${k+_+1}: ${b}`).join(`
16
+ `),y=g<p.length,U=o!==r||y&&e.limit===void 0?`
17
+ ... (truncated, showing ${r} lines; max=${qn})`:"";return S(h+U)}catch(s){return S(`\u8BFB\u53D6\u5931\u8D25: ${s.message}`,!0)}}};import{z as Ft}from"zod";import{dirname as di}from"path";import{mkdir as fi,writeFile as gi}from"fs/promises";var hi=Ft.object({file_path:Ft.string().min(1),content:Ft.any().optional()}).strict();function yi(e){if(e instanceof Uint8Array)return{data:e,info:`bytes=${e.byteLength}`};if(e instanceof ArrayBuffer){let n=new Uint8Array(e);return{data:n,info:`bytes=${n.byteLength}`}}if(typeof e=="string")return{data:e,info:`text_length=${e.length}`};let t=JSON.stringify(e??"",null,2);return{data:t,info:`json_length=${t.length}`}}var Yn={name:"write",description:"\u521B\u5EFA\u6216\u8986\u76D6\u6587\u4EF6\uFF0C\u4F20\u5165 file_path \u4E0E content",inputSchema:hi,execute:async e=>{let t=ue(e.file_path),{data:n,info:o}=yi(e.content);try{return await fi(di(t),{recursive:!0}),await gi(t,n instanceof Uint8Array?n:String(n)),S(`\u5DF2\u5199\u5165 ${t} (overwrite, ${o})`)}catch(r){return S(`\u5199\u5165\u5931\u8D25: ${r.message}`,!0)}}};function xi(e){let t=e.toJSONSchema(),{$schema:n,...o}=t;return o}function Ti(e){return{name:e.name,description:e.description,source:"native",inputSchema:xi(e.inputSchema),execute:e.execute}}function Zn(e){return e.map(Ti)}var Si={bash:vn,read:Xn,write:Yn,edit:Nn,glob:Un,grep:Fn,webfetch:Hn,save_memory:zn,todo:Wn},vi=Object.values(Si),Qn=Zn(vi);import zi from"openai";import{encoding_for_model as ki,get_encoding as wi}from"@dqbd/tiktoken";var eo="cl100k_base";function bi(e){let t=e?.trim()||eo;try{let n=()=>ki(t);return n().free(),{model:t,factory:n}}catch{let n=eo,o=()=>wi(n);return o().free(),{model:n,factory:o}}}function to(e){let{model:t,factory:n}=bi(e),o=n(),r=4,s=2,i=1,a=l=>l?o.encode(l).length:0;return{model:t,countText:a,countMessages:l=>{if(!l.length)return 0;let u=0;for(let p of l)u+=r,u+=a(p.content),p.name&&(u+=i);return u+=s,u},dispose:()=>o.free()}}import{mkdir as _i,writeFile as Ci,readFile as Ei,access as Ai}from"fs/promises";import{homedir as no}from"os";import{dirname as Mi,join as Ce}from"path";import{randomUUID as ep}from"crypto";import{parse as Pi}from"toml";var Ri=Ce(no(),".memo"),Ii="sessions",$i="Agents.md",Ve={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 Li(e){return/^[A-Za-z0-9_-]+$/.test(e)?e:JSON.stringify(e)}function Ni(e){if(!e||typeof e!="object"||Array.isArray(e))return[];let t=[];for(let[n,o]of Object.entries(e)){if(!o)continue;let r=Array.isArray(o)?o:[o];for(let s of r){if(!s||typeof s!="object")continue;let i={...s};(typeof i.name!="string"||i.name.length===0)&&n&&(i.name=n),t.push(i)}}return t}function oo(e){return e.startsWith("~")?Ce(no(),e.slice(1)):e}function Oi(e){let t=e.providers.map(r=>{let s=typeof r?.name=="string"?r.name:"";if(!s)return"";let a=[`[[providers.${Li(s)}]]`,`name = ${JSON.stringify(s)}`,`env_api_key = ${JSON.stringify(String(r.env_api_key??""))}`,`model = ${JSON.stringify(String(r.model??""))}`];return r.base_url&&a.push(`base_url = ${JSON.stringify(String(r.base_url))}`),a.join(`
15
18
  `)}).filter(Boolean).join(`
16
19
 
17
- `),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 c=[`[mcp_servers.${r}]`];if(c.push(`type = "${s.type??"streamable_http"}"`),c.push(`url = "${s.url}"`),"fallback_to_sse"in s&&s.fallback_to_sse!==void 0&&c.push(`fallback_to_sse = ${s.fallback_to_sse}`),s.headers&&Object.keys(s.headers).length>0){let l=Object.entries(s.headers).map(([u,m])=>`${JSON.stringify(u)} = ${JSON.stringify(m)}`).join(", ");c.push(`headers = { ${l} }`)}return c.join(`
20
+ `),n="";return e.mcp_servers&&Object.keys(e.mcp_servers).length>0&&(n=Object.entries(e.mcp_servers).map(([r,s])=>{if("url"in s){let c=[`[mcp_servers.${r}]`];if(c.push(`type = "${s.type??"streamable_http"}"`),c.push(`url = "${s.url}"`),"fallback_to_sse"in s&&s.fallback_to_sse!==void 0&&c.push(`fallback_to_sse = ${s.fallback_to_sse}`),s.headers&&Object.keys(s.headers).length>0){let l=Object.entries(s.headers).map(([u,p])=>`${JSON.stringify(u)} = ${JSON.stringify(p)}`).join(", ");c.push(`headers = { ${l} }`)}return c.join(`
18
21
  `)}let i=s.args?`args = ${JSON.stringify(s.args)}`:"",a=s.type?`type = "${s.type}"
19
22
  `:"";return`[mcp_servers.${r}]
20
23
  ${a}command = "${s.command}"
21
24
  ${i}`}).join(`
22
25
 
23
26
  `)),[`
24
- current_provider = "${t.current_provider}"
25
- stream_output = ${t.stream_output??!1}
26
- `.trim(),e,n].filter(Boolean).join(`
27
+ current_provider = "${e.current_provider}"
28
+ stream_output = ${e.stream_output??!1}
29
+ `.trim(),t,n].filter(Boolean).join(`
27
30
 
28
- `)}async function jt(t,e){await ns(is(t),{recursive:!0}),await os(t,ds(e),"utf-8")}async function Pt(){let t=process.env.MEMO_HOME?fn(process.env.MEMO_HOME):cs,e=_t(t,"config.toml");try{await ss(e);let n=await rs(e,"utf-8"),o=as(n),r=ps(o.providers),s={current_provider:o.current_provider??Ft.current_provider,stream_output:o.stream_output??Ft.stream_output,providers:r,mcp_servers:o.mcp_servers??{}},i=!s.providers.length;return{config:i?Ft:s,home:t,configPath:e,needsSetup:i}}catch{return{config:Ft,home:t,configPath:e,needsSetup:!0}}}function zt(t,e){let n=e||t.current_provider,o=t.providers.find(r=>r.name===n);return o||(t.providers?.[0]??Ft.providers[0])}function oe(t,e){let n=e.historyDir??_t(t.home,ls);return fn(n)}function hn(t){return _t(t.home,us)}function gs(t,e=100){return t.replace(/[\\/:\s]+/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,e)||"root"}function fs(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 yn(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=Tn(process.cwd()),u=`${o}-${r}-${s}_${i}${a}${c}_${e}.jsonl`;return _t(t,l,u)}function Tn(t){let e=t.split(/[/\\]+/).map(o=>gs(o));return fs(e,180).join("-")||"root"}function xn(t,e){return _t(t,Tn(e))}var re=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 hs}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as Sn}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as ys}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{StdioClientTransport as Ts}from"@modelcontextprotocol/sdk/client/stdio.js";function se(){return new hs({name:"memo-code-cli-client",version:"1.0.0"},{capabilities:{}})}function xs(t){if(!(!t||Object.keys(t).length===0))return{headers:t}}async function Ss(t){let e=new URL(t.url),n=xs(t.headers);if(t.type==="sse"){let r=se(),s=new Sn(e,{requestInit:n});return await r.connect(s),{client:r,transport:s}}let o=t.fallback_to_sse??!0;try{let r=se(),s=new ys(e,{requestInit:n});return await r.connect(s),{client:r,transport:s}}catch(r){if(!o)throw r;try{let s=se(),i=new Sn(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 ks(t){if("url"in t)return Ss(t);let e=new Ts({command:t.command,args:t.args}),n=se();return await n.connect(e),{client:n,transport:e}}var ie=class{connections=new Map;async connect(e,n){let o=this.connections.get(e);if(o)return o;let{client:r,transport:s}=await ks(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 ae=class{pool;tools=new Map;constructor(){this.pool=new ie}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,console.log(`[MCP] Connected to '${o}' with ${s.tools.length} tools`)}catch(s){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 ce=class{nativeRegistry;mcpRegistry;constructor(){this.nativeRegistry=new re,this.mcpRegistry=new ae}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(`
29
- `)}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(`
30
- `)}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 Cs,access as bs}from"fs/promises";function _s(t){try{return{ok:!0,data:JSON.parse(t)}}catch(e){return{ok:!1,raw:t,error:e.message}}}async function kn(t,e,n){let o=await Pt(),r=o.config,s=new ce;if(s.registerNativeTools(mn),await s.loadMcpServers(r.mcp_servers),t.tools)for(let[g,_]of Object.entries(t.tools))s.registerNativeTool({name:g,description:_.description,source:"native",inputSchema:{type:"object"},execute:_.execute});let i=s.toRegistry(),a=async()=>{let g=await(t.loadPrompt??Ve)(),_=s.generateToolDescriptions();_&&(g+=`
31
+ `)}async function ze(e,t){await _i(Mi(e),{recursive:!0}),await Ci(e,Oi(t),"utf-8")}async function Pe(){let e=process.env.MEMO_HOME?oo(process.env.MEMO_HOME):Ri,t=Ce(e,"config.toml");try{await Ai(t);let n=await Ei(t,"utf-8"),o=Pi(n),r=Ni(o.providers),s={current_provider:o.current_provider??Ve.current_provider,stream_output:o.stream_output??Ve.stream_output,providers:r,mcp_servers:o.mcp_servers??{}},i=!s.providers.length;return{config:i?Ve:s,home:e,configPath:t,needsSetup:i}}catch{return{config:Ve,home:e,configPath:t,needsSetup:!0}}}function We(e,t){let n=t||e.current_provider,o=e.providers.find(r=>r.name===n);return o||(e.providers?.[0]??Ve.providers[0])}function ut(e,t){let n=t.historyDir??Ce(e.home,Ii);return oo(n)}function ro(e){return Ce(e.home,$i)}function Di(e,t=100){return e.replace(/[\\/:\s]+/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"").slice(0,t)||"root"}function Hi(e,t=180){let n=[],o=0;for(let r of e){let s=r.slice(0,Math.max(1,t-o-(n.length>0?1:0)));if(n.push(s),o+=s.length+(n.length>1?1:0),o>=t)break}return n}function so(e,t){let n=new Date,o=String(n.getFullYear()),r=String(n.getMonth()+1).padStart(2,"0"),s=String(n.getDate()).padStart(2,"0"),i=String(n.getHours()).padStart(2,"0"),a=String(n.getMinutes()).padStart(2,"0"),c=String(n.getSeconds()).padStart(2,"0"),l=io(process.cwd()),u=`${o}-${r}-${s}_${i}${a}${c}_${t}.jsonl`;return Ce(e,l,u)}function io(e){let t=e.split(/[/\\]+/).map(o=>Di(o));return Hi(t,180).join("-")||"root"}function ao(e,t){return Ce(e,io(t))}var pt=class{tools=new Map;register(t){this.tools.set(t.name,t)}registerMany(t){for(let n of t)this.register(n)}get(t){return this.tools.get(t)}getAll(){return Array.from(this.tools.values())}toRegistry(){let t={};for(let[n,o]of this.tools)t[n]=o;return t}has(t){return this.tools.has(t)}get size(){return this.tools.size}};import{Client as Ui}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport as co}from"@modelcontextprotocol/sdk/client/sse.js";import{StreamableHTTPClientTransport as Bi}from"@modelcontextprotocol/sdk/client/streamableHttp.js";import{StdioClientTransport as ji}from"@modelcontextprotocol/sdk/client/stdio.js";function mt(){return new Ui({name:"memo-code-cli-client",version:"1.0.0"},{capabilities:{}})}function Fi(e){if(!(!e||Object.keys(e).length===0))return{headers:e}}async function Gi(e){let t=new URL(e.url),n=Fi(e.headers);if(e.type==="sse"){let r=mt(),s=new co(t,{requestInit:n});return await r.connect(s),{client:r,transport:s}}let o=e.fallback_to_sse??!0;try{let r=mt(),s=new Bi(t,{requestInit:n});return await r.connect(s),{client:r,transport:s}}catch(r){if(!o)throw r;try{let s=mt(),i=new co(t,{requestInit:n});return await s.connect(i),{client:s,transport:i}}catch(s){let i=`Failed to connect via streamable_http (${r.message}); SSE fallback failed (${s.message})`,a=new Error(i);throw a.cause={streamErr:r,sseErr:s},a}}}async function Vi(e){if("url"in e)return Gi(e);let t=new ji({command:e.command,args:e.args}),n=mt();return await n.connect(t),{client:n,transport:t}}var dt=class{connections=new Map;async connect(t,n){let o=this.connections.get(t);if(o)return o;let{client:r,transport:s}=await Vi(n),i=await r.listTools(),a={name:t,client:r,transport:s,tools:(i.tools||[]).map(c=>({name:`${t}_${c.name}`,description:c.description||`Tool from ${t}: ${c.name}`,source:"mcp",serverName:t,originalName:c.name,inputSchema:c.inputSchema,execute:async()=>({content:[]})}))};return this.connections.set(t,a),a}get(t){return this.connections.get(t)}getAll(){return Array.from(this.connections.values())}getAllTools(){let t=[];for(let n of this.connections.values())for(let o of n.tools)t.push({name:o.name,description:o.description,serverName:o.serverName,originalName:o.originalName,inputSchema:o.inputSchema,client:n.client});return t}async closeAll(){let t=Array.from(this.connections.values()).map(async n=>{try{await n.client.close()}catch(o){console.error(`[MCP] Error closing client ${n.name}:`,o)}});await Promise.all(t),this.connections.clear()}get size(){return this.connections.size}};var ft=class{pool;tools=new Map;constructor(){this.pool=new dt}async loadServers(t){if(!t||Object.keys(t).length===0)return 0;let n=0;return await Promise.all(Object.entries(t).map(async([o,r])=>{try{let s=await this.pool.connect(o,r);for(let i of s.tools){let a={...i,execute:async c=>{let l=this.pool.get(i.serverName)?.client;if(!l)throw new Error(`MCP client for server '${i.serverName}' not found`);return l.callTool({name:i.originalName,arguments:c})}};this.tools.set(a.name,a)}n+=s.tools.length,console.log(`[MCP] Connected to '${o}' with ${s.tools.length} tools`)}catch(s){console.error(`[MCP] Failed to connect to server '${o}':`,s)}})),n}get(t){return this.tools.get(t)}getAll(){return Array.from(this.tools.values())}toRegistry(){let t={};for(let[n,o]of this.tools)t[n]=o;return t}has(t){return this.tools.has(t)}get size(){return this.tools.size}async dispose(){await this.pool.closeAll(),this.tools.clear()}getPool(){return this.pool}};var gt=class{nativeRegistry;mcpRegistry;constructor(){this.nativeRegistry=new pt,this.mcpRegistry=new ft}registerNativeTool(t){this.nativeRegistry.register(t)}registerNativeTools(t){for(let n of t)this.registerNativeTool(n)}async loadMcpServers(t){return this.mcpRegistry.loadServers(t)}getTool(t){return this.nativeRegistry.get(t)??this.mcpRegistry.get(t)}getAllTools(){return[...this.nativeRegistry.getAll(),...this.mcpRegistry.getAll()]}toRegistry(){return{...this.nativeRegistry.toRegistry(),...this.mcpRegistry.toRegistry()}}hasTool(t){return this.nativeRegistry.has(t)||this.mcpRegistry.has(t)}getToolCount(){let t=this.nativeRegistry.size,n=this.mcpRegistry.size;return{native:t,mcp:n,total:t+n}}async execute(t,n){let o=this.getTool(t);if(!o)throw new Error(`Tool '${t}' not found`);return o.execute(n)}generateToolDefinitions(){return this.getAllTools().map(t=>({name:t.name,description:t.description,input_schema:t.inputSchema||{type:"object",properties:{}}}))}generateToolDescriptions(){let t=this.getAllTools();if(t.length===0)return"";let n=[];n.push("## Available Tools"),n.push("");let o=t.filter(s=>s.source==="native"),r=t.filter(s=>s.source==="mcp");if(o.length>0){n.push("### Built-in Tools"),n.push("");for(let s of o)n.push(this.formatToolDescription(s));n.push("")}if(r.length>0){n.push("### External MCP Tools"),n.push("");let s=this.groupByServer(r);for(let[i,a]of Object.entries(s)){n.push(`**Server: ${i}**`),n.push("");for(let c of a)n.push(this.formatToolDescription(c));n.push("")}}return n.join(`
32
+ `)}formatToolDescription(t){let n=[];return n.push(`#### ${t.name}`),n.push(`- **Description**: ${t.description}`),t.inputSchema&&Object.keys(t.inputSchema).length>0&&n.push(`- **Input Schema**: ${JSON.stringify(t.inputSchema)}`),n.join(`
33
+ `)}groupByServer(t){let n={};for(let o of t)if(o.source==="mcp"){let r=o.serverName;n[r]||(n[r]=[]),n[r].push(o)}return n}getToolDescriptions(){return this.getAllTools().map(t=>({name:t.name,description:t.description,source:t.source,serverName:t.source==="mcp"?t.serverName:void 0,inputSchema:t.inputSchema}))}async dispose(){await this.mcpRegistry.dispose()}};import{readFile as Wi,access as Ji}from"fs/promises";function Ki(e){try{return{ok:!0,data:JSON.parse(e)}}catch(t){return{ok:!1,raw:e,error:t.message}}}async function lo(e,t,n){let o=await Pe(),r=o.config,s=new gt;if(s.registerNativeTools(Qn),await s.loadMcpServers(r.mcp_servers),e.tools)for(let[g,v]of Object.entries(e.tools))s.registerNativeTool({name:g,description:v.description,source:"native",inputSchema:{type:"object"},execute:v.execute});let i=s.toRegistry(),a=async()=>{let g=await(e.loadPrompt??Tn)(),v=s.generateToolDescriptions();v&&(g+=`
31
34
 
32
- ${_}`);let C=hn(o);try{await bs(C);let N=(await Cs(C,"utf-8")).trim();N&&(g+=`
35
+ ${v}`);let h=ro(o);try{await Ji(h);let y=(await Wi(h,"utf-8")).trim();y&&(g+=`
33
36
 
34
37
  # Long-Term Memory
35
- ${N}`)}catch{}return g},c=s.generateToolDefinitions(),l=e.stream??r.stream_output??!1,u=oe(o,e),m=yn(u,n),y=new Qt(m);return{tools:i,dispose:async()=>{t.dispose&&await t.dispose(),await s.dispose()},callLLM:t.callLLM??(async(g,_,C)=>{let N=zt(r,e.providerName),J=process.env[N.env_api_key]??process.env.OPENAI_API_KEY??process.env.DEEPSEEK_API_KEY;if(!J)throw new Error(`Missing env var ${N.env_api_key} (or OPENAI_API_KEY/DEEPSEEK_API_KEY)`);let f=new ws({apiKey:J,baseURL:N.base_url}),Z=c.length>0?c.map(b=>({type:"function",function:{name:b.name,description:b.description,parameters:b.input_schema}})):void 0;if(l){let b=await f.chat.completions.create({model:N.model,messages:g,stream:!0},{signal:C?.signal}),k="";for await(let D of b){let E=D.choices?.[0]?.delta?.content;E&&(k+=E,_?.(E))}return{content:k,streamed:!0}}else{let b=await f.chat.completions.create({model:N.model,messages:g,tools:Z,tool_choice:Z?"auto":void 0},{signal:C?.signal}),k=b.choices?.[0]?.message;if(k?.tool_calls&&k.tool_calls.length>0){let E=[];k.content&&E.push({type:"text",text:k.content});for(let w of k.tool_calls)if(w.type==="function"){let h=_s(w.function.arguments);h.ok?E.push({type:"tool_use",id:w.id,name:w.function.name,input:h.data}):E.push({type:"text",text:`[tool_use parse error] ${h.error}; raw: ${h.raw}`})}let Y=E.some(w=>w.type==="tool_use");return{content:E,stop_reason:Y?"tool_use":"end_turn",usage:{prompt:b.usage?.prompt_tokens??void 0,completion:b.usage?.completion_tokens??void 0,total:b.usage?.total_tokens??void 0}}}let D=k?.content;if(typeof D!="string")throw new Error("OpenAI-compatible API returned empty content");return{content:[{type:"text",text:D}],stop_reason:"end_turn",usage:{prompt:b.usage?.prompt_tokens??void 0,completion:b.usage?.completion_tokens??void 0,total:b.usage?.total_tokens??void 0}}}}),loadPrompt:a,historySinks:t.historySinks??[y],tokenCounter:t.tokenCounter??dn(e.tokenizerModel),historyFilePath:m}}import{jsonrepair as vs}from"jsonrepair";function be(t){try{return JSON.parse(t)}catch{try{let e=vs(t);return JSON.parse(e)}catch{return null}}}function Es(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||n.has(i)))try{let a=be(i);if(a===null)continue;e.push({json:i,start:r.index,end:r.index+r[0].length,obj:a}),n.add(i)}catch{}}let s=/\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}/g;for(;(r=s.exec(t))!==null;){let i=r[0];if(!(!i||n.has(i))&&!(!i.includes('"tool"')&&!i.includes('"final"')))try{let a=be(i);if(a===null)continue;e.push({json:i,start:r.index,end:r.index+i.length,obj:a}),n.add(i)}catch{}}return e}function Ms(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 _e(t){if(t.length===0)return;let e=t.join(`
36
- `),{thinkingParts:n,cleaned:o}=Ms(e);return n.length>0?n.join(`
38
+ ${y}`)}catch{}return g},c=s.generateToolDefinitions(),l=t.stream??r.stream_output??!1,u=ut(o,t),p=so(u,n),k=new ot(p);return{tools:i,dispose:async()=>{e.dispose&&await e.dispose(),await s.dispose()},callLLM:e.callLLM??(async(g,v,h)=>{let y=We(r,t.providerName),R=process.env[y.env_api_key]??process.env.OPENAI_API_KEY??process.env.DEEPSEEK_API_KEY;if(!R)throw new Error(`Missing env var ${y.env_api_key} (or OPENAI_API_KEY/DEEPSEEK_API_KEY)`);let f=new zi({apiKey:R,baseURL:y.base_url}),U=c.length>0?c.map(b=>({type:"function",function:{name:b.name,description:b.description,parameters:b.input_schema}})):void 0;if(l){let b=await f.chat.completions.create({model:y.model,messages:g,stream:!0},{signal:h?.signal}),_="";for await(let B of b){let E=B.choices?.[0]?.delta?.content;E&&(_+=E,v?.(E))}return{content:_,streamed:!0}}else{let b=await f.chat.completions.create({model:y.model,messages:g,tools:U,tool_choice:U?"auto":void 0},{signal:h?.signal}),_=b.choices?.[0]?.message;if(_?.tool_calls&&_.tool_calls.length>0){let E=[];_.content&&E.push({type:"text",text:_.content});for(let w of _.tool_calls)if(w.type==="function"){let C=Ki(w.function.arguments);C.ok?E.push({type:"tool_use",id:w.id,name:w.function.name,input:C.data}):E.push({type:"text",text:`[tool_use parse error] ${C.error}; raw: ${C.raw}`})}let F=E.some(w=>w.type==="tool_use");return{content:E,stop_reason:F?"tool_use":"end_turn",usage:{prompt:b.usage?.prompt_tokens??void 0,completion:b.usage?.completion_tokens??void 0,total:b.usage?.total_tokens??void 0}}}let B=_?.content;if(typeof B!="string")throw new Error("OpenAI-compatible API returned empty content");return{content:[{type:"text",text:B}],stop_reason:"end_turn",usage:{prompt:b.usage?.prompt_tokens??void 0,completion:b.usage?.completion_tokens??void 0,total:b.usage?.total_tokens??void 0}}}}),loadPrompt:a,historySinks:e.historySinks??[k],tokenCounter:e.tokenCounter??to(t.tokenizerModel),historyFilePath:p}}import{jsonrepair as qi}from"jsonrepair";function Gt(e){try{return JSON.parse(e)}catch{try{let t=qi(e);return JSON.parse(t)}catch{return null}}}function Xi(e){let t=[],n=new Set,o=/```(?:json)?\s*([\s\S]*?)\s*```/g,r;for(;(r=o.exec(e))!==null;){let i=r[1]||"";if(!i)continue;let a=Yi(i);if(!(!a||n.has(a)))try{let c=Gt(a);if(c===null)continue;t.push({json:a,start:r.index,end:r.index+r[0].length,obj:c}),n.add(a)}catch{}}let s=mo(e);for(let{json:i,start:a,end:c}of s)if(!n.has(i)&&!(!i.includes('"tool"')&&!i.includes('"final"')))try{let l=Gt(i);if(l===null)continue;t.push({json:i,start:a,end:c,obj:l}),n.add(i)}catch{}return t}function Yi(e){return mo(e)[0]?.json??null}function mo(e){let t=[],n=0,o=-1,r=!1,s=!1;for(let i=0;i<e.length;i++){let a=e[i];if(s){s=!1;continue}if(a==="\\"&&r){s=!0;continue}if(a==='"'&&!r?r=!0:a==='"'&&r&&(r=!1),!r){if(a==="{")n===0&&(o=i),n++;else if(a==="}"&&(n--,n===0&&o!==-1)){let c=e.slice(o,i+1);t.push({json:c,start:o,end:i+1}),o=-1}}}return t}function Zi(e){let t=[],n=/<\s*(think|thinking)\s*>([\s\S]*?)<\/\s*\1\s*>/gi,o=e.replace(n,(r,s,i)=>{let a=(i??"").trim();return a&&t.push(a),a});return{thinkingParts:t,cleaned:o.trim()}}function Vt(e){if(e.length===0)return;let t=e.join(`
39
+ `),{thinkingParts:n,cleaned:o}=Zi(t);return n.length>0?n.join(`
37
40
 
38
- `):o||void 0}function wn(t){return t!==null&&typeof t=="object"&&"tool"in t&&typeof t.tool=="string"}function Cn(t){return t!==null&&typeof t=="object"&&"final"in t&&typeof t.final=="string"}function bn(t){let e={},n=Es(t);for(let{json:r,start:s,end:i,obj:a}of n){if(wn(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 m=_e(u);return m&&(e.thinking=m),e}if(Cn(a))return e.final=a.final,e}let o=t.trim();if(o.startsWith("{")&&o.endsWith("}")){let r=be(o);if(r&&wn(r))return e.action={tool:r.tool,input:r.input},e;if(r&&Cn(r))return e.final=r.final,e}return t.trim()&&(e.final=t),e}import{randomUUID as $n}from"crypto";function Ps(){return{onTurnStart:[],onAction:[],onObservation:[],onFinal:[]}}function _n(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))}function vn(t){let e=Ps();if(_n(e,t.hooks),Array.isArray(t.middlewares))for(let n of t.middlewares)_n(e,n);return e}async function at(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 At(t){return t.map(e=>({...e}))}var In="interactive";function En(){return{prompt:0,completion:0,total:0}}function Mn(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 As(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(`
39
- `),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 $s(t,e){for(let n of e)try{await n.append(t)}catch(o){console.error(`Failed to write history event: ${o.message}`)}}function Pn(t){return(t.content?.flatMap(n=>n.type==="text"?[n.text]:[])??[]).join(`
40
- `)}function An(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 Is(t){return t instanceof Error&&t.name==="AbortError"}function le(t){return t===null||typeof t!="object"?JSON.stringify(t):Array.isArray(t)?`[${t.map(n=>le(n)).join(",")}]`:`{${Object.entries(t).sort(([n],[o])=>n.localeCompare(o)).map(([n,o])=>`${JSON.stringify(n)}:${le(o)}`).join(",")}}`}var ve=class{constructor(e,n,o,r,s){this.deps=e;this.options=n;this.id=n.sessionId||$n(),this.mode=n.mode||In,this.history=[{role:"system",content:o}],this.tokenCounter=r,this.sinks=e.historySinks??[],this.hooks=vn(e),this.historyFilePath=s}id;mode;history;historyFilePath;turnIndex=0;tokenCounter;sinks;sessionUsage=En();startedAt=Date.now();hooks;closed=!1;sessionStartEmitted=!1;currentAbortController=null;cancelling=!1;lastActionSignature=null;repeatedActionCount=0;async init(){}resetActionRepetition(){this.lastActionSignature=null,this.repeatedActionCount=0}maybeWarnRepeatedAction(e,n){let o=`${e}:${le(n)}`;if(this.lastActionSignature===o?this.repeatedActionCount+=1:(this.lastActionSignature=o,this.repeatedActionCount=1),this.repeatedActionCount===3){let r=le(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 runTurn(e){let n=new AbortController;this.currentAbortController=n,this.cancelling=!1,this.turnIndex+=1;let o=this.turnIndex,r=[],s=En(),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 at(this.hooks,"onTurnStart",{sessionId:this.id,turn:o,input:e,promptTokens:a,history:At(this.history)});let c="",l="ok",u;for(let m=0;;m++){let y=this.tokenCounter.countMessages(this.history);if(this.options.maxPromptTokens&&y>this.options.maxPromptTokens){let w=`Context tokens (${y}) exceed the limit. Please shorten the input or restart the session.`,h=JSON.stringify({final:w});this.history.push({role:"assistant",content:h}),l="prompt_limit",c=w,u=w,await this.emitEvent("final",{turn:o,step:m,content:w,role:"assistant",meta:{tokens:{prompt:y}}}),await at(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:m,finalText:w,status:l,errorMessage:u,turnUsage:{...s},steps:r});break}this.options.warnPromptTokens&&y>this.options.warnPromptTokens&&console.warn(`Prompt tokens are near the limit: ${y}`);let g="",_=[],C,N=!1,J;try{let w=await this.deps.callLLM(this.history,H=>this.deps.onAssistantStep?.(H,m),{signal:n.signal}),h=As(w);g=h.textContent,_=h.toolUseBlocks,J=h.stopReason,C=h.usage,N=!!h.streamed}catch(w){if(this.cancelling&&Is(w)){l="cancelled",c="",u="Turn cancelled",await this.emitEvent("final",{turn:o,step:m,content:"",role:"assistant",meta:{cancelled:!0}}),await at(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:m,finalText:c,status:l,errorMessage:u,turnUsage:{...s},steps:r});break}let h=`LLM call failed: ${w.message}`,H=JSON.stringify({final:h});this.history.push({role:"assistant",content:H}),l="error",c=h,u=h,await this.emitEvent("final",{turn:o,content:h,role:"assistant"}),await at(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:m,finalText:c,status:l,errorMessage:u,turnUsage:{...s},steps:r});break}N||this.deps.onAssistantStep?.(g,m);let f;if(_.length>0){let w=_[0];if(w){let h=g?_e([g]):void 0;f={action:{tool:w.name,input:w.input},thinking:h}}else f={}}else g?f=bn(g):f={};let Z=f.action?JSON.stringify({tool:f.action.tool,input:f.action.input}):f.final?JSON.stringify({final:f.final}):g;this.history.push({role:"assistant",content:Z});let b=this.tokenCounter.countText(g),k=C?.prompt??y,D=C?.completion??b,E=C?.total??k+D,Y={prompt:k,completion:D,total:E};if(Mn(s,Y),Mn(this.sessionUsage,Y),r.push({index:m,assistantText:g,parsed:f,tokenUsage:Y}),await this.emitEvent("assistant",{turn:o,step:m,content:g,role:"assistant",meta:{tokens:Y}}),_.length>1){for(let A of _)this.maybeWarnRepeatedAction(A.name,A.input);let w=await Promise.allSettled(_.map(async A=>{let U=this.deps.tools[A.name];if(!U)return{id:A.id,tool:A.name,observation:`Unknown tool: ${A.name}`};try{let F=An(U,A.input);if(!F.ok)return{id:A.id,tool:A.name,observation:F.error};let nt=await U.execute(F.data),Et=Pn(nt)||"(no tool output)";return{id:A.id,tool:A.name,observation:Et}}catch(F){return{id:A.id,tool:A.name,observation:`Tool execution failed: ${F.message}`}}}));await this.emitEvent("action",{turn:o,step:m,meta:{tools:_.map(A=>A.name),parallel:!0,thinking:f.thinking,toolBlocks:_.map(A=>({name:A.name,input:A.input}))}});let h=_[0];h&&await at(this.hooks,"onAction",{sessionId:this.id,turn:o,step:m,action:{tool:h.name,input:h.input},thinking:f.thinking,history:At(this.history)});let H=[];for(let[A,U]of w.entries())if(U.status==="fulfilled"){let{tool:F,observation:nt}=U.value;H.push(`[${F}]: ${nt}`),await this.emitEvent("observation",{turn:o,step:m,content:nt,meta:{tool:F,index:A}})}else H.push(`[error]: ${U.reason}`);let j=H.join(`
41
+ `):o||void 0}function uo(e){return e!==null&&typeof e=="object"&&"tool"in e&&typeof e.tool=="string"}function po(e){return e!==null&&typeof e=="object"&&"final"in e&&typeof e.final=="string"}function fo(e){let t={},n=Xi(e);for(let{json:r,start:s,end:i,obj:a}of n){if(uo(a)){t.action={tool:a.tool.trim(),input:a.input};let c=e.slice(0,s).trim(),l=e.slice(i).trim(),u=[];c&&u.push(c),l&&u.push(l);let p=Vt(u);return p&&(t.thinking=p),t}if(po(a))return t.final=a.final,t}let o=e.trim();if(o.startsWith("{")&&o.endsWith("}")){let r=Gt(o);if(r&&uo(r))return t.action={tool:r.tool,input:r.input},t;if(r&&po(r))return t.final=r.final,t}return e.trim()&&(t.final=e),t}import{randomUUID as To}from"crypto";function Qi(){return{onTurnStart:[],onAction:[],onObservation:[],onFinal:[],onApprovalRequest:[],onApprovalResponse:[]}}function go(e,t){t&&(t.onTurnStart&&e.onTurnStart.push(t.onTurnStart),t.onAction&&e.onAction.push(t.onAction),t.onObservation&&e.onObservation.push(t.onObservation),t.onFinal&&e.onFinal.push(t.onFinal),t.onApprovalRequest&&e.onApprovalRequest.push(t.onApprovalRequest),t.onApprovalResponse&&e.onApprovalResponse.push(t.onApprovalResponse))}function ho(e){let t=Qi();if(go(t,e.hooks),Array.isArray(e.middlewares))for(let n of e.middlewares)go(t,n);return t}async function X(e,t,n){let o=e[t];if(o.length)for(let r of o)try{await r(n)}catch(s){console.warn(`Hook ${t} failed: ${s.message}`)}}function Re(e){return e.map(t=>({...t}))}var zt={read:"read",glob:"read",grep:"read",webfetch:"read",todo:"read",write:"write",edit:"write",save_memory:"write",bash:"execute"};var ht={read:0,write:1,execute:2},Wt={read:e=>`${e} \u5C06\u8BFB\u53D6\u6587\u4EF6\u6216\u6570\u636E`,write:e=>`${e} \u5C06\u4FEE\u6539\u6216\u521B\u5EFA\u6587\u4EF6`,execute:e=>`${e} \u5C06\u6267\u884C\u7CFB\u7EDF\u547D\u4EE4`};function Jt(e){let t={...zt,...e?.customLevels};return{getRiskLevel(n){if(n in t)return t[n];let o=n.toLowerCase();return o.includes("exec")||o.includes("run")||o.includes("shell")||o.includes("bash")||o.includes("command")?"execute":o.includes("write")||o.includes("edit")||o.includes("create")||o.includes("delete")||o.includes("modify")||o.includes("update")?"write":o.includes("read")||o.includes("get")||o.includes("fetch")||o.includes("search")||o.includes("list")||o.includes("find")?"read":"write"},compareRisk(n,o){return ht[n]-ht[o]},needsApproval(n,o){return o==="strict"?!0:n==="write"||n==="execute"}}}import{createHash as ea}from"crypto";function yt(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?"["+e.map(n=>yt(n)).join(",")+"]":`{${Object.entries(e).sort(([n],[o])=>n.localeCompare(o)).map(([n,o])=>`${JSON.stringify(n)}:${yt(o)}`).join(",")}}`}function Kt(e,t){let n=yt(t),o=`${e}:${n}`;return ea("sha256").update(o).digest("hex").slice(0,16)}function qt(e){let{mode:t="auto",dangerous:n=!1,toolRiskLevels:o}=e||{};if(n)return{isDangerousMode:!0,getRiskLevel:()=>"read",check:()=>({needApproval:!1,decision:"auto-execute"}),recordDecision:()=>{},isGranted:()=>!0,clearOnceApprovals:()=>{},dispose:()=>{}};let r=Jt({customLevels:o}),s={session:new Set,once:new Set,denied:new Set};return{get isDangerousMode(){return!1},getRiskLevel(i){return r.getRiskLevel(i)},check(i,a){let c=r.getRiskLevel(i);if(!r.needsApproval(c,t))return{needApproval:!1,decision:"auto-execute"};let l=Kt(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:Wt[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 So="interactive";function yo(){return{prompt:0,completion:0,total:0}}function xo(e,t){if(!t)return;let n=t.prompt??0,o=t.completion??0,r=t.total??n+o;e.prompt+=n,e.completion+=o,e.total+=r}function ta(e){if(typeof e=="string")return{textContent:e,toolUseBlocks:[]};if("content"in e&&typeof e.content=="string")return{textContent:e.content,toolUseBlocks:[],usage:"usage"in e?e.usage:void 0,streamed:"streamed"in e?e.streamed:void 0};if("content"in e&&Array.isArray(e.content)){let t=e.content.filter(o=>o.type==="text"),n=e.content.filter(o=>o.type==="tool_use");return{textContent:t.map(o=>o.text).join(`
42
+ `),toolUseBlocks:n.map(o=>({id:o.id,name:o.name,input:o.input})),stopReason:"stop_reason"in e?e.stop_reason:void 0,usage:"usage"in e?e.usage:void 0}}return{textContent:"",toolUseBlocks:[]}}async function na(e,t){for(let n of t)try{await n.append(e)}catch(o){console.error(`Failed to write history event: ${o.message}`)}}function oa(e){return(e.content?.flatMap(n=>n.type==="text"?[n.text]:[])??[]).join(`
43
+ `)}function ra(e,t){let n=t;if(typeof t=="string"){let o=t.trim();if(o)try{n=JSON.parse(o)}catch{n=o}else n={}}return typeof n!="object"||n===null?{ok:!1,error:`${e.name} invalid input: expected object`}:{ok:!0,data:n}}function sa(e){return e instanceof Error&&e.name==="AbortError"}function xt(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(n=>xt(n)).join(",")}]`:`{${Object.entries(e).sort(([n],[o])=>n.localeCompare(o)).map(([n,o])=>`${JSON.stringify(n)}:${xt(o)}`).join(",")}}`}var Xt=class{constructor(t,n,o,r,s){this.deps=t;this.options=n;this.id=n.sessionId||To(),this.mode=n.mode||So,this.history=[{role:"system",content:o}],this.tokenCounter=r,this.sinks=t.historySinks??[],this.hooks=ho(t),this.historyFilePath=s,this.approvalManager=qt({dangerous:!1,mode:"auto"})}id;mode;history;historyFilePath;turnIndex=0;tokenCounter;sinks;sessionUsage=yo();startedAt=Date.now();hooks;closed=!1;sessionStartEmitted=!1;currentAbortController=null;cancelling=!1;lastActionSignature=null;repeatedActionCount=0;approvalManager;async init(){}resetActionRepetition(){this.lastActionSignature=null,this.repeatedActionCount=0}maybeWarnRepeatedAction(t,n){let o=`${t}:${xt(n)}`;if(this.lastActionSignature===o?this.repeatedActionCount+=1:(this.lastActionSignature=o,this.repeatedActionCount=1),this.repeatedActionCount===3){let r=xt(n).slice(0,200),s=`\u7CFB\u7EDF\u63D0\u9192\uFF1A\u4F60\u5DF2\u8FDE\u7EED3\u6B21\u8C03\u7528\u540C\u4E00\u5DE5\u5177\u300C${t}\u300D\u4E14\u53C2\u6570\u76F8\u540C\uFF08${r}${r.length>=200?"\u2026":""}\uFF09\u3002\u8BF7\u786E\u8BA4\u662F\u5426\u9677\u5165\u5FAA\u73AF\uFF0C\u5FC5\u8981\u65F6\u76F4\u63A5\u7ED9\u51FA\u6700\u7EC8\u56DE\u7B54\u6216\u8C03\u6574\u53C2\u6570\u3002`;this.history.push({role:"system",content:s})}}async executeToolWithApproval(t,n,o,r){let s=this.approvalManager.check(t,n);if(!s.needApproval)return this.doExecuteTool(t,n);let i={toolName:s.toolName,params:s.params,fingerprint:s.fingerprint,riskLevel:s.riskLevel,reason:s.reason};await X(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 X(this.hooks,"onApprovalResponse",{sessionId:this.id,turn:o,step:r,fingerprint:s.fingerprint,decision:a}),a==="deny"?{success:!1,observation:`\u7528\u6237\u62D2\u7EDD\u4E86\u5DE5\u5177\u6267\u884C: ${t}`,rejected:!0}:this.doExecuteTool(t,n)}async doExecuteTool(t,n){let o=this.deps.tools[t];if(!o)return{success:!1,observation:`Unknown tool: ${t}`};try{let r=ra(o,n);if(!r.ok)return{success:!1,observation:r.error};let s=await o.execute(r.data);return{success:!0,observation:oa(s)||"(no tool output)"}}catch(r){return{success:!1,observation:`Tool execution failed: ${r.message}`}}}async runTurn(t){let n=new AbortController;this.currentAbortController=n,this.cancelling=!1,this.turnIndex+=1;let o=this.turnIndex,r=[],s=yo(),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:t});try{let a=this.tokenCounter.countMessages(this.history);await this.emitEvent("turn_start",{turn:o,content:t,meta:{tokens:{prompt:a}}}),await X(this.hooks,"onTurnStart",{sessionId:this.id,turn:o,input:t,promptTokens:a,history:Re(this.history)});let c="",l="ok",u;for(let p=0;;p++){let k=this.tokenCounter.countMessages(this.history);if(this.options.maxPromptTokens&&k>this.options.maxPromptTokens){let w=`Context tokens (${k}) exceed the limit. Please shorten the input or restart the session.`,C=JSON.stringify({final:w});this.history.push({role:"assistant",content:C}),l="prompt_limit",c=w,u=w,await this.emitEvent("final",{turn:o,step:p,content:w,role:"assistant",meta:{tokens:{prompt:k}}}),await X(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:w,status:l,errorMessage:u,turnUsage:{...s},steps:r});break}this.options.warnPromptTokens&&k>this.options.warnPromptTokens&&console.warn(`Prompt tokens are near the limit: ${k}`);let g="",v=[],h,y=!1,R;try{let w=await this.deps.callLLM(this.history,V=>this.deps.onAssistantStep?.(V,p),{signal:n.signal}),C=ta(w);g=C.textContent,v=C.toolUseBlocks,R=C.stopReason,h=C.usage,y=!!C.streamed}catch(w){if(this.cancelling&&sa(w)){l="cancelled",c="",u="Turn cancelled",await this.emitEvent("final",{turn:o,step:p,content:"",role:"assistant",meta:{cancelled:!0}}),await X(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,errorMessage:u,turnUsage:{...s},steps:r});break}let C=`LLM call failed: ${w.message}`,V=JSON.stringify({final:C});this.history.push({role:"assistant",content:V}),l="error",c=C,u=C,await this.emitEvent("final",{turn:o,content:C,role:"assistant"}),await X(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,errorMessage:u,turnUsage:{...s},steps:r});break}y||this.deps.onAssistantStep?.(g,p);let f;if(v.length>0){let w=v[0];if(w){let C=g?Vt([g]):void 0;f={action:{tool:w.name,input:w.input},thinking:C}}else f={}}else g?f=fo(g):f={};let U=f.action?JSON.stringify({tool:f.action.tool,input:f.action.input}):f.final?JSON.stringify({final:f.final}):g;this.history.push({role:"assistant",content:U});let b=this.tokenCounter.countText(g),_=h?.prompt??k,B=h?.completion??b,E=h?.total??_+B,F={prompt:_,completion:B,total:E};if(xo(s,F),xo(this.sessionUsage,F),r.push({index:p,assistantText:g,parsed:f,tokenUsage:F}),await this.emitEvent("assistant",{turn:o,step:p,content:g,role:"assistant",meta:{tokens:F}}),v.length>1){for(let H of v)this.maybeWarnRepeatedAction(H.name,H.input);await this.emitEvent("action",{turn:o,step:p,meta:{tools:v.map(H=>H.name),parallel:!0,thinking:f.thinking,toolBlocks:v.map(H=>({name:H.name,input:H.input}))}});let w=v[0];w&&await X(this.hooks,"onAction",{sessionId:this.id,turn:o,step:p,action:{tool:w.name,input:w.input},parallelActions:v.map(H=>({tool:H.name,input:H.input})),thinking:f.thinking,history:Re(this.history)});let C=[],V=!1;for(let[H,G]of v.entries()){let ne=await this.executeToolWithApproval(G.name,G.input,o,p);if(ne.rejected){V=!0,C.push(`[${G.name}]: ${ne.observation}`),await this.emitEvent("observation",{turn:o,step:p,content:ne.observation,meta:{tool:G.name,index:H}});break}C.push(`[${G.name}]: ${ne.observation}`),await this.emitEvent("observation",{turn:o,step:p,content:ne.observation,meta:{tool:G.name,index:H}})}let q=C.join(`
41
44
 
42
- `);this.history.push({role:"user",content:JSON.stringify({observation:j})});let G=r[r.length-1];G&&(G.observation=j),await at(this.hooks,"onObservation",{sessionId:this.id,turn:o,step:m,tool:_.map(A=>A.name).join(", "),observation:j,history:At(this.history)});continue}if(f.action){this.maybeWarnRepeatedAction(f.action.tool,f.action.input),await this.emitEvent("action",{turn:o,step:m,meta:{tool:f.action.tool,input:f.action.input,thinking:f.thinking}}),await at(this.hooks,"onAction",{sessionId:this.id,turn:o,step:m,action:f.action,thinking:f.thinking,history:At(this.history)});let w=this.deps.tools[f.action.tool],h;try{if(w){let j=An(w,f.action.input);if(!j.ok)h=j.error;else{let G=await w.execute(j.data);h=Pn(G)||"(no tool output)"}}else h=`Unknown tool: ${f.action.tool}`}catch(j){h=`Tool execution failed: ${j.message}`}this.history.push({role:"user",content:JSON.stringify({observation:h,tool:f.action.tool})});let H=r[r.length-1];H&&(H.observation=h),await this.emitEvent("observation",{turn:o,step:m,content:h,meta:{tool:f.action.tool}}),await at(this.hooks,"onObservation",{sessionId:this.id,turn:o,step:m,tool:f.action.tool,observation:h,history:At(this.history)});continue}if(J==="end_turn"||f.final){this.resetActionRepetition(),c=f.final||g,f.final&&(f.final=c),await this.emitEvent("final",{turn:o,step:m,content:c,role:"assistant",meta:{tokens:Y}}),await at(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:m,finalText:c,status:l,tokenUsage:Y,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 m=JSON.stringify({final:c});this.history.push({role:"assistant",content:m}),await this.emitEvent("final",{turn:o,content:c,role:"assistant"}),await at(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}}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.deps.dispose&&await this.deps.dispose()}async emitEvent(e,n){if(!this.sinks.length)return;let o=We({sessionId:this.id,type:e,turn:n.turn,step:n.step,content:n.content,role:n.role,meta:n.meta});await $s(o,this.sinks)}};async function Gt(t,e={}){let n=e.sessionId||$n(),o=await kn(t,{...e,sessionId:n},n),r=await o.loadPrompt(),s=new ve({...t,...o},{...e,sessionId:n,mode:e.mode??In},r,o.tokenCounter,o.historyFilePath);return await s.init(),s}import{useCallback as st,useEffect as je,useMemo as Co,useRef as bo,useState as Q}from"react";import{readFile as va,stat as Ea}from"fs/promises";import{basename as Ma}from"path";import{randomUUID as ze}from"crypto";import{exec as Pa}from"child_process";import{promisify as Aa}from"util";import{Box as _o,useApp as $a,Text as Ia}from"ink";import{Box as Rn,Text as Rs}from"ink";import{memo as Ns}from"react";import{jsx as Nn,jsxs as Ls}from"react/jsx-runtime";var Ln=Ns(function({contextPercent:e=0}){let n=e>0?` ${e.toFixed(1)}%`:" 0.0%";return Nn(Rn,{justifyContent:"flex-end",children:Nn(Rn,{marginTop:8,children:Ls(Rs,{color:"gray",children:["context:",n]})})})});import{Box as St,Static as li,Text as gt}from"ink";import{memo as ui}from"react";import mi from"os";import{Box as Os,Text as On}from"ink";import{memo as Ds}from"react";import{jsx as Hs,jsxs as Dn}from"react/jsx-runtime";var Hn=Ds(function({message:e}){return Dn(Os,{flexDirection:"column",gap:0,children:[Dn(On,{color:"cyan",children:["\u25CF ",e.title]}),Hs(On,{color:"gray",children:e.content})]})});import{Box as si,Text as ii}from"ink";import{memo as ai}from"react";import{Box as Vt,Text as tt}from"ink";import{memo as Xs}from"react";import{Box as Ee,Text as W}from"ink";import{marked as Us}from"marked";import{useMemo as Un,memo as Bs}from"react";import{jsx as q,jsxs as $t}from"react/jsx-runtime";var Fs="#2b2b2b";function ue(t){return t?[{type:"text",raw:t,text:t}]:[]}function js(t,e,n){switch(t.type){case"text":return t.tokens&&t.tokens.length>0?dt(t.tokens,e,`${n}-text`):t.text;case"escape":return t.text;case"strong":return q(W,{bold:!0,children:dt(t.tokens,e,`${n}-strong`)},n);case"em":return q(W,{italic:!0,children:dt(t.tokens,e,`${n}-em`)},n);case"codespan":return q(W,{color:e.codeColor,backgroundColor:Fs,children:t.text},n);case"del":return q(W,{strikethrough:!0,children:dt(t.tokens,e,`${n}-del`)},n);case"link":{let o=t.tokens&&t.tokens.length>0?dt(t.tokens,e,`${n}-link`):t.text,r=t.href&&t.text&&t.text!==t.href?` (${t.href})`:"";return $t(W,{underline:!0,color:e.linkColor,children:[o,r]},n)}case"image":{let o=t.text||"image";return $t(W,{color:e.linkColor,children:["[",o,"](",t.href,")"]},n)}case"br":return`
43
- `;case"checkbox":return t.checked?"[x]":"[ ]";case"html":return t.text;default:return"text"in t?t.text:t.raw}}function dt(t,e,n){return!t||t.length===0?[]:t.flatMap((o,r)=>{let s=`${n}-${r}`,i=js(o,e,s);return Array.isArray(i)?i:[i]})}function zs(t){let e=t.tokens[0];return e?.type==="paragraph"||e?.type==="text"?e.tokens??ue(e.text):t.tokens.length>0?t.tokens:ue(t.text)}function Gs(t){return t.split(`
44
- `).map(e=>e.length>0?` ${e}`:"").join(`
45
- `).trimEnd()}function Vs(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(`
46
- `)}function Ws(t){return t.type==="table"&&"header"in t&&"rows"in t&&"align"in t}function Js(t,e,n){switch(t.type){case"space":case"def":return null;case"heading":return q(W,{bold:!0,color:e.textColor,children:dt(t.tokens,e,`${n}-heading`)},n);case"paragraph":{let o=t.tokens??ue(t.text);return q(W,{color:e.textColor,children:dt(o,e,`${n}-para`)},n)}case"text":{let o=t.tokens??ue(t.text);return q(W,{color:e.textColor,children:dt(o,e,`${n}-text`)},n)}case"code":{let o=Gs(t.text);return q(W,{color:e.codeColor,children:o},n)}case"list":{let o=typeof t.start=="number"?t.start:1;return q(Ee,{flexDirection:"column",children:t.items.map((r,s)=>{let i=t.ordered?`${o+s}.`:"-",a=r.task?r.checked?"[x] ":"[ ] ":"",c=zs(r);return $t(Ee,{children:[$t(W,{color:e.textColor,children:[i," "]}),$t(W,{color:e.textColor,children:[a,dt(c,e,`${n}-item-${s}`)]})]},`${n}-item-${s}`)})},n)}case"blockquote":return $t(W,{color:"gray",dimColor:!0,children:["> ",t.text.trim()]},n);case"hr":return q(W,{color:"gray",children:"---"},n);case"table":return Ws(t)?q(W,{color:e.textColor,children:Vs(t)},n):q(W,{color:e.textColor,children:"text"in t?t.text:t.raw},n);case"html":return q(W,{color:e.textColor,children:t.text},n);default:return q(W,{color:e.textColor,children:"text"in t?t.text:t.raw},n)}}function Ks(t,e,n){return t.flatMap((o,r)=>{let s=Js(o,e,`${n}-${r}`);return s?[s]:[]})}var It=Bs(function({text:e,tone:n="normal"}){let o=Un(()=>({textColor:n==="muted"?"gray":void 0,codeColor:n==="muted"?"gray":"cyan",linkColor:n==="muted"?"gray":"blue",muted:n==="muted"}),[n]),r=Un(()=>{let s=Us.lexer(e,{gfm:!0,breaks:!0});return Ks(s,o,"markdown")},[e,o]);return q(Ee,{flexDirection:"column",gap:1,children:r})});import{Fragment as Me,jsx as X,jsxs as Rt}from"react/jsx-runtime";function Ys(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=["path","file","filename","url","command","pattern","query","content"];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 qs(t){if(!t)return[];let e=[],n=/\[(\w+)\]: ([\s\S]*?)(?=\n\n\[|$)/g,o;for(;(o=n.exec(t))!==null;){let r=o[2]?.trim()??"",s=o[1]??"unknown",a=r.split(`
47
- `).filter(c=>c.trim())[0]??r;e.push({tool:s,output:a.slice(0,60)+(a.length>60?"...":"")})}return e}function Zs(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||n.observation!==o.observation||n.toolStatus!==o.toolStatus)}var Bn=Xs(function({step:e,hideAssistantText:n=!1}){let o=e.action?.tool,r=e.action?.input,s=Ys(r),i=qs(e.observation),a=i.length>1;return Rt(Vt,{flexDirection:"column",gap:0,children:[e.thinking&&Rt(Vt,{children:[X(tt,{color:"gray",children:"\u25CF "}),X(Vt,{flexDirection:"column",flexGrow:1,children:X(It,{text:e.thinking,tone:"muted"})})]}),a&&X(Me,{children:i.map((c,l)=>Rt(Vt,{children:[X(tt,{color:"green",children:"\u25CF "}),X(tt,{color:"gray",children:"Used "}),X(tt,{color:"cyan",children:c.tool}),c.output&&Rt(Me,{children:[X(tt,{color:"gray",children:" ("}),X(tt,{color:"cyan",children:c.output}),X(tt,{color:"gray",children:")"})]})]},l))}),!a&&o&&Rt(Vt,{children:[X(tt,{color:"green",children:"\u25CF "}),X(tt,{color:"gray",children:"Used "}),X(tt,{color:"cyan",children:o}),s&&Rt(Me,{children:[X(tt,{color:"gray",children:" ("}),X(tt,{color:"cyan",children:s}),X(tt,{color:"gray",children:")"})]})]})]})},Zs);import{Box as Qs,Text as ti}from"ink";import{memo as ei}from"react";import{jsx as Fn}from"react/jsx-runtime";var jn=ei(function({text:e}){return Fn(Qs,{borderStyle:"round",paddingX:1,paddingY:0,children:Fn(ti,{color:"white",children:e})})});import{Box as Wt,Text as vt}from"ink";import{memo as Pe,useMemo as ni}from"react";import{Fragment as ri,jsx as rt,jsxs as me}from"react/jsx-runtime";function oi(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,`
45
+ `);this.history.push({role:"user",content:JSON.stringify({observation:q})});let Q=r[r.length-1];if(Q&&(Q.observation=q),await X(this.hooks,"onObservation",{sessionId:this.id,turn:o,step:p,tool:v.map(H=>H.name).join(", "),observation:q,history:Re(this.history)}),V){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 X(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,tokenUsage:F,turnUsage:{...s},steps:r});break}continue}else if(f.action){this.maybeWarnRepeatedAction(f.action.tool,f.action.input),await this.emitEvent("action",{turn:o,step:p,meta:{tool:f.action.tool,input:f.action.input,thinking:f.thinking}}),await X(this.hooks,"onAction",{sessionId:this.id,turn:o,step:p,action:f.action,thinking:f.thinking,history:Re(this.history)});let w=await this.executeToolWithApproval(f.action.tool,f.action.input,o,p);if(w.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 X(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,tokenUsage:F,turnUsage:{...s},steps:r});break}let C=w.observation;this.history.push({role:"user",content:JSON.stringify({observation:C,tool:f.action.tool})});let V=r[r.length-1];V&&(V.observation=C),await this.emitEvent("observation",{turn:o,step:p,content:C,meta:{tool:f.action.tool}}),await X(this.hooks,"onObservation",{sessionId:this.id,turn:o,step:p,tool:f.action.tool,observation:C,history:Re(this.history)});continue}if(R==="end_turn"||f.final){this.resetActionRepetition(),c=f.final||g,f.final&&(f.final=c),await this.emitEvent("final",{turn:o,step:p,content:c,role:"assistant",meta:{tokens:F}}),await X(this.hooks,"onFinal",{sessionId:this.id,turn:o,step:p,finalText:c,status:l,tokenUsage:F,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 X(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(t,n){if(!this.sinks.length)return;let o=Sn({sessionId:this.id,type:t,turn:n.turn,step:n.step,content:n.content,role:n.role,meta:n.meta});await na(o,this.sinks)}};async function Je(e,t={}){let n=t.sessionId||To(),o=await lo(e,{...t,sessionId:n},n),r=await o.loadPrompt(),s=new Xt({...e,...o},{...t,sessionId:n,mode:t.mode??So},r,o.tokenCounter,o.historyFilePath);return await s.init(),s}import{useCallback as te,useEffect as Et,useMemo as yr,useRef as At,useState as Z}from"react";import{readFile as ul}from"fs/promises";import"path";import{randomUUID as fn}from"crypto";import{exec as pl}from"child_process";import{promisify as ml}from"util";import{Box as xr,useApp as dl,Text as fl}from"ink";import{Box as vo,Text as ia}from"ink";import{memo as aa}from"react";import{jsx as ko,jsxs as ca}from"react/jsx-runtime";var wo=aa(function({contextPercent:t=0}){let n=t>0?` ${t.toFixed(1)}%`:" 0.0%";return ko(vo,{justifyContent:"flex-end",children:ko(vo,{marginTop:8,children:ca(ia,{color:"gray",children:["context:",n]})})})});import{Box as ve,Static as La,Text as ge}from"ink";import{memo as Na}from"react";import Oa from"os";import{Box as la,Text as bo}from"ink";import{memo as ua}from"react";import{jsx as pa,jsxs as _o}from"react/jsx-runtime";var Co=ua(function({message:t}){return _o(la,{flexDirection:"column",gap:0,children:[_o(bo,{color:"cyan",children:["\u25CF ",t.title]}),pa(bo,{color:"gray",children:t.content})]})});import{Box as Pa,Text as Ra}from"ink";import{memo as Ia}from"react";import{Box as Ke,Text as se}from"ink";import{memo as ka}from"react";import{Box as Yt,Text as W}from"ink";import{marked as ma}from"marked";import{useMemo as Eo,memo as da}from"react";import{jsx as Y,jsxs as Ie}from"react/jsx-runtime";var fa="#2b2b2b";function Tt(e){return e?[{type:"text",raw:e,text:e}]:[]}function ga(e,t,n){switch(e.type){case"text":return e.tokens&&e.tokens.length>0?fe(e.tokens,t,`${n}-text`):e.text;case"escape":return e.text;case"strong":return Y(W,{bold:!0,children:fe(e.tokens,t,`${n}-strong`)},n);case"em":return Y(W,{italic:!0,children:fe(e.tokens,t,`${n}-em`)},n);case"codespan":return Y(W,{color:t.codeColor,backgroundColor:fa,children:e.text},n);case"del":return Y(W,{strikethrough:!0,children:fe(e.tokens,t,`${n}-del`)},n);case"link":{let o=e.tokens&&e.tokens.length>0?fe(e.tokens,t,`${n}-link`):e.text,r=e.href&&e.text&&e.text!==e.href?` (${e.href})`:"";return Ie(W,{underline:!0,color:t.linkColor,children:[o,r]},n)}case"image":{let o=e.text||"image";return Ie(W,{color:t.linkColor,children:["[",o,"](",e.href,")"]},n)}case"br":return`
46
+ `;case"checkbox":return e.checked?"[x]":"[ ]";case"html":return e.text;default:return"text"in e?e.text:e.raw}}function fe(e,t,n){return!e||e.length===0?[]:e.flatMap((o,r)=>{let s=`${n}-${r}`,i=ga(o,t,s);return Array.isArray(i)?i:[i]})}function ha(e){let t=e.tokens[0];return t?.type==="paragraph"||t?.type==="text"?t.tokens??Tt(t.text):e.tokens.length>0?e.tokens:Tt(e.text)}function ya(e){return e.split(`
47
+ `).map(t=>t.length>0?` ${t}`:"").join(`
48
+ `).trimEnd()}function xa(e){let t=e.header.map(r=>r.text).join(" | "),n=e.header.map(()=>"---").join(" | "),o=e.rows.map(r=>r.map(s=>s.text).join(" | "));return[t,n,...o].join(`
49
+ `)}function Ta(e){return e.type==="table"&&"header"in e&&"rows"in e&&"align"in e}function Sa(e,t,n){switch(e.type){case"space":case"def":return null;case"heading":return Y(W,{bold:!0,color:t.textColor,children:fe(e.tokens,t,`${n}-heading`)},n);case"paragraph":{let o=e.tokens??Tt(e.text);return Y(W,{color:t.textColor,children:fe(o,t,`${n}-para`)},n)}case"text":{let o=e.tokens??Tt(e.text);return Y(W,{color:t.textColor,children:fe(o,t,`${n}-text`)},n)}case"code":{let o=ya(e.text);return Y(W,{color:t.codeColor,children:o},n)}case"list":{let o=typeof e.start=="number"?e.start:1;return Y(Yt,{flexDirection:"column",children:e.items.map((r,s)=>{let i=e.ordered?`${o+s}.`:"-",a=r.task?r.checked?"[x] ":"[ ] ":"",c=ha(r);return Ie(Yt,{children:[Ie(W,{color:t.textColor,children:[i," "]}),Ie(W,{color:t.textColor,children:[a,fe(c,t,`${n}-item-${s}`)]})]},`${n}-item-${s}`)})},n)}case"blockquote":return Ie(W,{color:"gray",dimColor:!0,children:["> ",e.text.trim()]},n);case"hr":return Y(W,{color:"gray",children:"---"},n);case"table":return Ta(e)?Y(W,{color:t.textColor,children:xa(e)},n):Y(W,{color:t.textColor,children:"text"in e?e.text:e.raw},n);case"html":return Y(W,{color:t.textColor,children:e.text},n);default:return Y(W,{color:t.textColor,children:"text"in e?e.text:e.raw},n)}}function va(e,t,n){return e.flatMap((o,r)=>{let s=Sa(o,t,`${n}-${r}`);return s?[s]:[]})}var $e=da(function({text:t,tone:n="normal"}){let o=Eo(()=>({textColor:n==="muted"?"gray":void 0,codeColor:n==="muted"?"gray":"cyan",linkColor:n==="muted"?"gray":"blue",muted:n==="muted"}),[n]),r=Eo(()=>{let s=ma.lexer(t,{gfm:!0,breaks:!0});return va(s,o,"markdown")},[t,o]);return Y(Yt,{flexDirection:"column",gap:1,children:r})});import{Fragment as Zt,jsx as K,jsxs as Le}from"react/jsx-runtime";function Ao(e){if(!e)return;if(typeof e=="string")return e.length>50?e.slice(0,47)+"...":e;if(typeof e!="object"||Array.isArray(e))return;let t=e,n=["file_path","path","file","filename","url","command","pattern","glob","query","content","cwd","dir"];for(let o of n)if(t[o]){let r=String(t[o]);return r.length>50?r.slice(0,47)+"...":r}for(let[o,r]of Object.entries(t))if(typeof r=="string"&&o!=="description")return r.length>50?r.slice(0,47)+"...":r}function wa(e,t){let n=e.step,o=t.step;return!(n.index!==o.index||n.assistantText!==o.assistantText||n.thinking!==o.thinking||n.action?.tool!==o.action?.tool||JSON.stringify(n.action?.input)!==JSON.stringify(o.action?.input)||JSON.stringify(n.parallelActions)!==JSON.stringify(o.parallelActions)||n.toolStatus!==o.toolStatus)}var Mo=ka(function({step:t}){let n=t.action?.tool,o=t.action?.input,r=Ao(o),s=t.parallelActions??[],i=s.length>1;return Le(Ke,{flexDirection:"column",gap:0,children:[t.thinking&&Le(Ke,{children:[K(se,{color:"gray",children:"\u25CF "}),K(Ke,{flexDirection:"column",flexGrow:1,children:K($e,{text:t.thinking,tone:"muted"})})]}),i&&K(Zt,{children:s.map((a,c)=>{let l=Ao(a.input);return Le(Ke,{children:[K(se,{color:"green",children:"\u25CF "}),K(se,{color:"gray",children:"Used "}),K(se,{color:"cyan",children:a.tool}),l&&Le(Zt,{children:[K(se,{color:"gray",children:" ("}),K(se,{color:"cyan",children:l}),K(se,{color:"gray",children:")"})]})]},c)})}),!i&&n&&Le(Ke,{children:[K(se,{color:"green",children:"\u25CF "}),K(se,{color:"gray",children:"Used "}),K(se,{color:"cyan",children:n}),r&&Le(Zt,{children:[K(se,{color:"gray",children:" ("}),K(se,{color:"cyan",children:r}),K(se,{color:"gray",children:")"})]})]})]})},wa);import{Box as ba,Text as Po}from"ink";import{memo as _a}from"react";import{jsx as Ro,jsxs as Ca}from"react/jsx-runtime";var Io=_a(function({text:t}){return Ca(ba,{paddingY:1,children:[Ro(Po,{color:"gray",children:"\u203A "}),Ro(Po,{color:"white",children:t})]})});import{Box as qe,Text as Ee}from"ink";import{memo as Qt,useMemo as Ea}from"react";import{Fragment as Ma,jsx as le,jsxs as St}from"react/jsx-runtime";function Aa(e){let t=/<\s*(think|thinking)\s*>([\s\S]*?)<\/\s*\1\s*>/gi,n=[],o,r=0,s=[];for(;(o=t.exec(e))!==null;){s.push({start:o.index,end:t.lastIndex});let a=o[2]?.trim();a&&n.push(a)}if(s.length===0)return{content:e,thinking:null};let i="";r=0;for(let{start:a,end:c}of s)i+=e.slice(r,a),r=c;return i+=e.slice(r),i=i.replace(/\n{3,}/g,`
48
50
 
49
51
  `).trim(),{content:i,thinking:n.length>0?n.join(`
50
52
 
51
- `):null}}var zn=Pe(function({text:e,isThinking:n=!1}){let{content:o,thinking:r}=ni(()=>oi(e),[e]);return n?rt(Wt,{flexDirection:"column",flexGrow:1,children:rt(It,{text:e,tone:"muted"})}):me(Wt,{flexDirection:"column",flexGrow:1,gap:1,children:[r&&rt(Wt,{flexDirection:"column",paddingLeft:2,children:rt(It,{text:r,tone:"muted"})}),rt(It,{text:o,tone:"normal"})]})}),_u=Pe(function({text:e}){return rt(Wt,{children:me(vt,{color:"gray",children:["\u2022 ",e]})})}),vu=Pe(function({toolName:e,fileName:n}){return me(Wt,{children:[rt(vt,{color:"green",children:"\u25CF "}),rt(vt,{color:"gray",children:"Used "}),rt(vt,{color:"cyan",children:e}),n&&me(ri,{children:[rt(vt,{color:"gray",children:" ("}),rt(vt,{color:"cyan",children:n}),rt(vt,{color:"gray",children:")"})]})]})});import{jsx as Ae,jsxs as Gn}from"react/jsx-runtime";function ci(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 $e=ai(function({turn:e}){let n=e.finalText?.trim()??"",o=n.length>0;return Gn(si,{flexDirection:"column",children:[Ae(jn,{text:e.userInput}),e.steps.map(r=>Ae(Bn,{step:r},`step-${e.index}-${r.index}`)),o?Ae(zn,{text:n,isThinking:!1}):null,e.status&&e.status!=="ok"?Gn(ii,{color:"red",children:["Status: ",e.status]}):null]})},ci);import{jsx as et,jsxs as kt}from"react/jsx-runtime";function pi(t){let e=mi.homedir();return e&&t.startsWith(e)?`~${t.slice(e.length)}`:t}function di(t){return t.length>16?`${t.slice(0,8)}...${t.slice(-4)}`:t}function gi(t,e){if(t.headerInfo?.sessionId!==e.headerInfo?.sessionId||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 Vn=ui(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});for(let l of e)c.push({type:"system",data:l});for(let l of i)c.push({type:"turn",data:l});return kt(St,{flexDirection:"column",gap:0,children:[et(li,{items:c,children:l=>{if(l.type==="header"&&l.data){let u=l.data;return kt(St,{borderStyle:"round",borderColor:"blueBright",paddingX:2,paddingY:1,flexDirection:"column",gap:1,children:[et(St,{gap:1,alignItems:"center",children:kt(St,{flexDirection:"column",children:[et(gt,{bold:!0,children:"Welcome to Memo Code CLI!"}),et(gt,{color:"gray",children:"Send /help for help information."})]})}),kt(St,{flexDirection:"column",gap:0,children:[kt(St,{children:[et(gt,{color:"gray",children:"Directory: "}),et(gt,{color:"cyan",children:pi(u.cwd)})]}),kt(St,{children:[et(gt,{color:"gray",children:"Session: "}),et(gt,{color:"cyan",children:di(u.sessionId)})]}),kt(St,{children:[et(gt,{color:"gray",children:"Model: "}),et(gt,{color:"cyan",children:u.model}),kt(gt,{color:"gray",children:[" ","(powered by ",u.providerName,")"]})]})]})]},"header")}return l.type==="system"?et(Hn,{message:l.data},l.data.id):l.type==="turn"?et($e,{turn:l.data},`turn-${l.data.index}`):null}}),a&&et($e,{turn:a},`turn-live-${a.index}`)]})},gi);import{useCallback as ho,useEffect as Ue,useMemo as Be,useRef as Fe,useState as wt}from"react";import{readFile as na,readdir as oa,stat as ra}from"fs/promises";import{basename as sa,join as ia,resolve as yo}from"path";import{Box as ye,Text as yt,useInput as aa}from"ink";import ca from"os";var no=Ho(to(),1);import{readFile as Li,readdir as Oi}from"fs/promises";import{join as eo,relative as Di,sep as Hi}from"path";var Ui=6,Bi=2500,oo=25,Fi=[".git",".svn",".hg","node_modules","dist","build",".next",".turbo",".cache",".output","coverage","tmp","temp","logs","*.log"],fe=new Map;function ji(t){return t.split(Hi).join("/")}function zi(t,e){return JSON.stringify({maxDepth:t.maxDepth,maxEntries:t.maxEntries,respectGitIgnore:t.respectGitIgnore,ignoreGlobs:t.ignoreGlobs,gitignore:e})}function Gi(t){return{maxDepth:typeof t.maxDepth=="number"?Math.max(1,t.maxDepth):Ui,maxEntries:typeof t.maxEntries=="number"?Math.max(100,t.maxEntries):Bi,limit:typeof t.limit=="number"?Math.max(1,t.limit):oo,respectGitIgnore:t.respectGitIgnore!==!1,ignoreGlobs:t.ignoreGlobs?.length?t.ignoreGlobs:[]}}async function Vi(t,e){if(!e)return"";try{return await Li(eo(t,".gitignore"),"utf8")}catch{}return""}async function Wi(t,e){let n=await Vi(e,t.respectGitIgnore),o=(0,no.default)();o.add(Fi),t.ignoreGlobs.length&&o.add(t.ignoreGlobs),n.trim()&&o.add(n);let r=zi(t,n);return Object.assign(o,{__memoSignature:r})}async function Ji(t,e,n){let o=[],r=e.maxEntries,s=async(i,a)=>{if(o.length>=r)return;let c;try{c=await Oi(i,{withFileTypes:!0})}catch{return}for(let l of c){if(o.length>=r)break;if(l.isSymbolicLink())continue;let u=eo(i,l.name),m=Di(t,u);if(!m)continue;let y=ji(m);if(n.ignores(y))continue;let g=y.split("/").filter(Boolean),_=g.map(N=>N.toLowerCase()),C=l.isDirectory();if(o.push({path:y,pathLower:y.toLowerCase(),segments:g,segmentsLower:_,depth:a,isDir:C}),o.length>=r)break;C&&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 Ki(t,e){let n=Gi(e),o=await Wi(n,t),r=o.__memoSignature,s=fe.get(t);if(s&&s.signature===r)return s.pending?s.pending:s.entries;let i=Ji(t,n,o).then(a=>(fe.set(t,{entries:a.entries,signature:a.signature}),a.entries)).catch(a=>{throw fe.delete(t),a});return fe.set(t,{entries:[],signature:r,pending:i}),i}function Xi(t){return t.depth+(t.isDir?-.2:.2)}function Yi(t,e){if(!e.length)return Xi(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 qi(t,e,n){let s=e.trim().replace(/\\/g,"/").split("/").filter(Boolean).map(a=>a.toLowerCase()),i=[];for(let a of t){let c=Yi(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 ro(t){let e=await Ki(t.cwd,t),n=typeof t.limit=="number"?Math.max(1,t.limit):oo;return qi(e,t.query,n)}import{mkdir as Ku,readFile as Xu,writeFile as Yu}from"fs/promises";import{dirname as Zu}from"path";import{randomUUID as tm}from"crypto";import{Box as Kt,Text as Ot}from"ink";import{jsx as ht,jsxs as io}from"react/jsx-runtime";var Zi="#3a3a3a",he="#2b2b2b",so="#888888",Qi="#666666";function ao({items:t,activeIndex:e,loading:n}){return n?ht(Kt,{flexDirection:"column",paddingX:1,backgroundColor:he,children:ht(Ot,{color:"gray",children:"Loading..."})}):t.length?ht(Kt,{flexDirection:"column",backgroundColor:he,children:t.map((o,r)=>{let s=r===e,i=s?Zi:he;return o.kind==="slash"?io(Kt,{flexDirection:"row",gap:2,paddingX:1,backgroundColor:i,children:[ht(Ot,{color:s?"cyan":"white",bold:s,children:o.title}),o.subtitle?ht(Ot,{color:so,children:o.subtitle}):null]},o.id):io(Kt,{flexDirection:"row",gap:1,paddingX:1,backgroundColor:i,children:[ht(Ot,{color:s?"cyan":"white",bold:s,children:o.title}),o.subtitle?ht(Ot,{color:so,children:o.subtitle}):null]},o.id)})}):ht(Kt,{flexDirection:"column",paddingX:1,backgroundColor:he,children:ht(Ot,{color:Qi,children:"No matches"})})}var co={name:"new",description:"\u5F00\u542F\u4E00\u4E2A\u65B0\u5BF9\u8BDD",run:({closeSuggestions:t,setInputValue:e,clearScreen:n,showSystemMessage:o,newSession:r})=>{t(),e(""),n(),o("New Session","Starting a new session..."),r?.()}};var lo={name:"exit",description:"\u9000\u51FA\u5F53\u524D\u4F1A\u8BDD",run:({closeSuggestions:t,exitApp:e})=>{t(),e()}};var uo={name:"resume",description:"\u6062\u590D\u5386\u53F2\u8F93\u5165",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 mo={name:"models",description:"\u9009\u62E9\u6A21\u578B\uFF08\u5C55\u793A\u914D\u7F6E\u91CC\u7684 providers\uFF09",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:
53
+ `):null}}var $o=Qt(function({text:t,isThinking:n=!1}){let{content:o,thinking:r}=Ea(()=>Aa(t),[t]);return n?le(qe,{flexDirection:"column",flexGrow:1,children:le($e,{text:t,tone:"muted"})}):St(qe,{flexDirection:"column",flexGrow:1,gap:1,children:[r&&le(qe,{flexDirection:"column",paddingLeft:2,children:le($e,{text:r,tone:"muted"})}),le($e,{text:o,tone:"normal"})]})}),Mm=Qt(function({text:t}){return le(qe,{children:St(Ee,{color:"gray",children:["\u2022 ",t]})})}),Pm=Qt(function({toolName:t,fileName:n}){return St(qe,{children:[le(Ee,{color:"green",children:"\u25CF "}),le(Ee,{color:"gray",children:"Used "}),le(Ee,{color:"cyan",children:t}),n&&St(Ma,{children:[le(Ee,{color:"gray",children:" ("}),le(Ee,{color:"cyan",children:n}),le(Ee,{color:"gray",children:")"})]})]})});import{jsx as en,jsxs as Lo}from"react/jsx-runtime";function $a(e,t){let n=e.turn,o=t.turn;if(n.index!==o.index||n.userInput!==o.userInput||n.finalText!==o.finalText||n.status!==o.status||n.steps.length!==o.steps.length||n.tokenUsage?.total!==o.tokenUsage?.total)return!1;for(let r=0;r<n.steps.length;r++){let s=n.steps[r],i=o.steps[r];if(!s||!i||s.assistantText!==i.assistantText||s.thinking!==i.thinking||s.action?.tool!==i.action?.tool)return!1}return!0}var tn=Ia(function({turn:t}){let n=t.finalText?.trim()??"",o=n.length>0;return Lo(Pa,{flexDirection:"column",children:[en(Io,{text:t.userInput}),t.steps.map(r=>en(Mo,{step:r},`step-${t.index}-${r.index}`)),o?en($o,{text:n,isThinking:!1}):null,t.status&&t.status!=="ok"?Lo(Ra,{color:"red",children:["Status: ",t.status]}):null]})},$a);import{jsx as ie,jsxs as ke}from"react/jsx-runtime";function Da(e){let t=Oa.homedir();return t&&e.startsWith(t)?`~${e.slice(t.length)}`:e}function Ha(e){return e.length>16?`${e.slice(0,8)}...${e.slice(-4)}`:e}function Ua(e,t){if(e.headerInfo?.sessionId!==t.headerInfo?.sessionId||e.headerInfo?.model!==t.headerInfo?.model||e.headerInfo?.providerName!==t.headerInfo?.providerName||e.headerInfo?.cwd!==t.headerInfo?.cwd||e.systemMessages.length!==t.systemMessages.length)return!1;for(let n=0;n<e.systemMessages.length;n++)if(e.systemMessages[n]?.id!==t.systemMessages[n]?.id)return!1;if(e.turns.length!==t.turns.length)return!1;for(let n=0;n<e.turns.length;n++)if(e.turns[n]!==t.turns[n])return!1;return!0}var No=Na(function({systemMessages:t,turns:n,headerInfo:o}){let r=n.length>0?n[n.length-1]:void 0,s=r&&(r.finalText||r.status&&r.status!=="ok"),i=s?n:n.slice(0,-1),a=s?void 0:r,c=[];o&&c.push({type:"header",data:o});let l=[];for(let u of t)l.push({sequence:u.sequence,item:{type:"system",data:u}});for(let u of i){let p=u.sequence??0;l.push({sequence:p,item:{type:"turn",data:u}})}l.sort((u,p)=>u.sequence-p.sequence);for(let u of l)c.push(u.item);return ke(ve,{flexDirection:"column",gap:0,children:[ie(La,{items:c,children:u=>{if(u.type==="header"&&u.data){let p=u.data;return ke(ve,{borderStyle:"round",borderColor:"blueBright",paddingX:2,paddingY:1,flexDirection:"column",gap:1,children:[ie(ve,{gap:1,alignItems:"center",children:ke(ve,{flexDirection:"column",children:[ie(ge,{bold:!0,children:"Welcome to Memo Code CLI!"}),ie(ge,{color:"gray",children:"Send /help for help information."})]})}),ke(ve,{flexDirection:"column",gap:0,children:[ke(ve,{children:[ie(ge,{color:"gray",children:"Directory: "}),ie(ge,{color:"cyan",children:Da(p.cwd)})]}),ke(ve,{children:[ie(ge,{color:"gray",children:"Session: "}),ie(ge,{color:"cyan",children:Ha(p.sessionId)})]}),ke(ve,{children:[ie(ge,{color:"gray",children:"Model: "}),ie(ge,{color:"cyan",children:p.model}),ke(ge,{color:"gray",children:[" ","(powered by ",p.providerName,")"]})]})]})]},"header")}return u.type==="system"?ie(Co,{message:u.data},u.data.id):u.type==="turn"?ie(tn,{turn:u.data},`turn-${u.data.index}`):null}}),a&&ie(tn,{turn:a},`turn-live-${a.index}`)]})},Ua);import{useCallback as sr,useEffect as un,useMemo as Ec,useRef as pn,useState as we}from"react";import{readFile as Ac,readdir as Mc,stat as Pc}from"fs/promises";import{basename as Rc,join as Ic,resolve as ir}from"path";import{Box as Ct,Text as Ae,useInput as $c}from"ink";var Wo=xn(Vo(),1);import{readFile as ic,readdir as ac}from"fs/promises";import{join as zo,relative as cc,sep as lc}from"path";var uc=6,pc=2500,Jo=25,mc=[".git",".svn",".hg","node_modules","dist","build",".next",".turbo",".cache",".output","coverage","tmp","temp","logs","*.log"],bt=new Map;function dc(e){return e.split(lc).join("/")}function fc(e,t){return JSON.stringify({maxDepth:e.maxDepth,maxEntries:e.maxEntries,respectGitIgnore:e.respectGitIgnore,ignoreGlobs:e.ignoreGlobs,gitignore:t})}function gc(e){return{maxDepth:typeof e.maxDepth=="number"?Math.max(1,e.maxDepth):uc,maxEntries:typeof e.maxEntries=="number"?Math.max(100,e.maxEntries):pc,limit:typeof e.limit=="number"?Math.max(1,e.limit):Jo,respectGitIgnore:e.respectGitIgnore!==!1,ignoreGlobs:e.ignoreGlobs?.length?e.ignoreGlobs:[]}}async function hc(e,t){if(!t)return"";try{return await ic(zo(e,".gitignore"),"utf8")}catch{}return""}async function yc(e,t){let n=await hc(t,e.respectGitIgnore),o=(0,Wo.default)();o.add(mc),e.ignoreGlobs.length&&o.add(e.ignoreGlobs),n.trim()&&o.add(n);let r=fc(e,n);return Object.assign(o,{__memoSignature:r})}async function xc(e,t,n){let o=[],r=t.maxEntries,s=async(i,a)=>{if(o.length>=r)return;let c;try{c=await ac(i,{withFileTypes:!0})}catch{return}for(let l of c){if(o.length>=r)break;if(l.isSymbolicLink())continue;let u=zo(i,l.name),p=cc(e,u);if(!p)continue;let k=dc(p);if(n.ignores(k))continue;let g=k.split("/").filter(Boolean),v=g.map(y=>y.toLowerCase()),h=l.isDirectory();if(o.push({path:k,pathLower:k.toLowerCase(),segments:g,segmentsLower:v,depth:a,isDir:h}),o.length>=r)break;h&&a<t.maxDepth&&await s(u,a+1)}};return await s(e,0),o.sort((i,a)=>i.path.localeCompare(a.path)),{entries:o,signature:n.__memoSignature}}async function Tc(e,t){let n=gc(t),o=await yc(n,e),r=o.__memoSignature,s=bt.get(e);if(s&&s.signature===r)return s.pending?s.pending:s.entries;let i=xc(e,n,o).then(a=>(bt.set(e,{entries:a.entries,signature:a.signature}),a.entries)).catch(a=>{throw bt.delete(e),a});return bt.set(e,{entries:[],signature:r,pending:i}),i}function Sc(e){return e.depth+(e.isDir?-.2:.2)}function vc(e,t){if(!t.length)return Sc(e);let n=e.depth,o=0;for(let r of t){let s=-1;for(let i=o;i<e.segmentsLower.length;i++){let a=e.segmentsLower[i];if(a.startsWith(r)){s=i,n+=(i-o)*1.5,n+=a.length-r.length;break}let c=a.indexOf(r);if(c!==-1){s=i,n+=(i-o)*2+c+2;break}}if(s===-1)return null;o=s+1}return e.isDir&&(n-=.5),n}function kc(e,t,n){let s=t.trim().replace(/\\/g,"/").split("/").filter(Boolean).map(a=>a.toLowerCase()),i=[];for(let a of e){let c=vc(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 Ko(e){let t=await Tc(e.cwd,e),n=typeof e.limit=="number"?Math.max(1,e.limit):Jo;return kc(t,e.query,n)}import{mkdir as Zm,readFile as Qm,writeFile as ed}from"fs/promises";import{dirname as nd}from"path";import{randomUUID as rd}from"crypto";import{Box as Ye,Text as De}from"ink";import{jsx as ye,jsxs as Xo}from"react/jsx-runtime";var wc="#3a3a3a",_t="#2b2b2b",qo="#888888",bc="#666666";function Yo({items:e,activeIndex:t,loading:n}){return n?ye(Ye,{flexDirection:"column",paddingX:1,backgroundColor:_t,children:ye(De,{color:"gray",children:"Loading..."})}):e.length?ye(Ye,{flexDirection:"column",backgroundColor:_t,children:e.map((o,r)=>{let s=r===t,i=s?wc:_t;return o.kind==="slash"?Xo(Ye,{flexDirection:"row",gap:2,paddingX:1,backgroundColor:i,children:[ye(De,{color:s?"cyan":"white",bold:s,children:o.title}),o.subtitle?ye(De,{color:qo,children:o.subtitle}):null]},o.id):Xo(Ye,{flexDirection:"row",gap:1,paddingX:1,backgroundColor:i,children:[ye(De,{color:s?"cyan":"white",bold:s,children:o.title}),o.subtitle?ye(De,{color:qo,children:o.subtitle}):null]},o.id)})}):ye(Ye,{flexDirection:"column",paddingX:1,backgroundColor:_t,children:ye(De,{color:bc,children:"No matches"})})}var Zo={name:"new",description:"Start a new session",run:({closeSuggestions:e,setInputValue:t,clearScreen:n,showSystemMessage:o,newSession:r})=>{e(),t(""),n(),o("New Session","Starting a new session..."),r?.()}};var Qo={name:"exit",description:"Exit the session",run:({closeSuggestions:e,exitApp:t})=>{e(),t()}};var er={name:"resume",description:"Resume history",run:({closeSuggestions:e,setInputValue:t,showSystemMessage:n})=>{e(!1),t("resume "),n("Resume",'Type "resume" followed by keywords to filter and select from session history.')}};var tr={name:"models",description:"Select a model (from configured providers)",run:({closeSuggestions:e,setInputValue:t,showSystemMessage:n,data:o})=>{e(!1);let{providers:r,providerName:s,model:i}=o;if(!r.length){n("Models",`No providers configured. Check ${o.configPath}`),t("");return}let a=r.map(c=>{let l=c.name===s&&c.model===i?" (current)":"",u=c.base_url?` @ ${c.base_url}`:"";return`- ${c.name}: ${c.model}${u}${l}`});t("/models "),n("Models",`Available models:
52
54
  ${a.join(`
53
- `)}`)}};var ta=`Available commands:
55
+ `)}`)}};var _c=`Available commands:
54
56
  /help Show help and shortcuts
55
57
  /exit Exit the session
56
58
  exit Exit the session (no slash)
@@ -69,17 +71,15 @@ Shortcuts:
69
71
  Ctrl+L Start a new session
70
72
  Ctrl+C Exit
71
73
  exit Type in input to exit
72
- Esc Esc Cancel / Clear input`,po={name:"help",description:"\u663E\u793A\u5E2E\u52A9\u4FE1\u606F",run:({closeSuggestions:t,setInputValue:e,showSystemMessage:n})=>{t(),e(""),n("Help",ta)}};var go={name:"context",description:"\u8BBE\u7F6E\u4E0A\u4E0B\u6587\u957F\u5EA6\u9650\u5236 (80k/120k/150k/200k)",run:({closeSuggestions:t,setInputValue:e,showSystemMessage:n,data:o})=>{t();let r="80k, 120k, 150k, 200k",s=`Current: ${(o.contextLimit/1e3).toFixed(0)}k`;e("/context "),n("Context",`${s}
73
- Usage: /context <length>
74
- Choices: ${r}`)}};function ea(t,e){let n=[];if(n.push(`- **${t}**`),"url"in e){if(n.push(` - Type: ${e.type??"streamable_http"}`),n.push(` - URL: ${e.url}`),e.type!=="sse"&&e.fallback_to_sse!==void 0&&n.push(` - Fallback to SSE: ${e.fallback_to_sse}`),e.headers&&Object.keys(e.headers).length>0){let o=Object.entries(e.headers).map(([r,s])=>`${r}=${s}`).join(", ");n.push(` - Headers: ${o}`)}}else n.push(` - Type: ${e.type??"stdio"}`),n.push(` - Command: ${e.command}`),e.args&&e.args.length>0&&n.push(` - Args: ${e.args.join(" ")}`);return n.join(`
75
- `)}var fo={name:"mcp",description:"\u67E5\u770B\u5F53\u524D\u914D\u7F6E\u7684 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.
76
-
77
- Add servers to ${s}`),e("");return}let a=[];a.push(`Total: ${i.length} server(s)
78
- `);for(let[c,l]of Object.entries(r))a.push(ea(c,l)),a.push("");e(""),n("MCP Servers",a.join(`
79
- `))}};var He=[po,lo,co,uo,mo,go,fo];import{Fragment as Ca,jsx as lt,jsxs as Xt}from"react/jsx-runtime";var la=400;function ua(){try{return ca.userInfo().username||"user"}catch{return"user"}}function To({disabled:t,onSubmit:e,onExit:n,onClear:o,onNewSession:r,onCancelRun:s,onModelSelect:i,onSystemMessage:a,onSetContextLimit:c,history:l,cwd:u,sessionsDir:m,currentSessionFile:y,onHistorySelect:g,providers:_,configPath:C,providerName:N,model:J,contextLimit:f,mcpServers:Z}){let[b,k]=wt(""),[D,E]=wt(null),[Y,w]=wt(""),[h,H]=wt("none"),[j,G]=wt([]),[A,U]=wt(0),[F,nt]=wt(!1),[Et,Ct]=wt(!1),Tt=Fe(0),Dt=Fe(0),R=Fe(""),L=Be(()=>ua(),[]),bt=Be(()=>u.split("/").pop()||u,[u]);Ue(()=>{R.current=b,Ct(!1)},[b]);let B=Be(()=>Et||t?null:fa(b),[t,Et,b]),V=ho((M=!0)=>{M&&Ct(!0),H("none"),G([]),U(0),nt(!1)},[]);Ue(()=>{t&&V(!1)},[t,V]),Ue(()=>{if(!B){H("none"),G([]),U(0),nt(!1);return}let M=!1,I=++Tt.current;return nt(!0),(async()=>{try{if(B.type==="file"){let P=await ro({cwd:u,query:B.query,limit:8});if(M||I!==Tt.current)return;let O=P.map(T=>{let v=T.isDir?`${T.path}/`:T.path;return{id:T.id,title:v,kind:"file",value:v,meta:{isDir:T.isDir}}});H("file"),G(O),U(T=>O.length?Math.min(T,O.length-1):0);return}if(B.type==="history"){let P=await ma({sessionsDir:m,cwd:u,keyword:B.keyword,activeSessionFile:y});if(M||I!==Tt.current)return;let O=P.map(ka);H("history"),G(O),U(T=>O.length?Math.min(T,O.length-1):0);return}if(B.type==="models"){let P=B.keyword.toLowerCase(),T=(_??[]).filter(v=>{let it=v.name?.toLowerCase()??"",Mt=v.model?.toLowerCase()??"";return P?it.includes(P)||Mt.includes(P):!0}).map(v=>({id:v.name,title:`${v.name}: ${v.model}`,subtitle:v.base_url??v.env_api_key??"",kind:"model",value:`/models ${v.name}`,meta:{provider:v}}));H("model"),G(T),U(v=>T.length?Math.min(v,T.length-1):0);return}if(B.type==="context"){let O=[8e4,12e4,15e4,2e5].map(T=>({id:`${T}`,title:`${(T/1e3).toFixed(0)}k tokens`,subtitle:T===f?"Current":void 0,kind:"context",value:`/context ${(T/1e3).toFixed(0)}k`,meta:{contextValue:T}}));H("context"),G(O),U(T=>O.length?Math.min(T,O.length-1):0);return}if(B.type==="slash"){let P=B.keyword.toLowerCase(),T=(P?He.filter(v=>v.matches?v.matches(P):v.name.startsWith(P)):He).map(v=>({id:v.name,title:`/${v.name}`,subtitle:v.description,kind:"slash",value:`/${v.name} `,meta:{slashCommand:v}}));H("slash"),G(T),U(v=>T.length?Math.min(v,T.length-1):0);return}}catch{!M&&I===Tt.current&&G([])}finally{!M&&I===Tt.current&&nt(!1)}})(),()=>{M=!0}},[B,u,m,y,_,f]);let Ht=ho(M=>{if(M){if(h==="file"&&B?.type==="file"){let I=b.slice(0,B.tokenStart),P=b.slice(B.tokenStart+B.query.length),O=`${I}${M.value}${P}`;R.current=O,k(O),E(null),w(""),M.meta?.isDir||V();return}if(h==="history"){M.meta?.historyEntry&&g?.(M.meta.historyEntry),R.current=M.value,k(M.value),E(null),w(""),V();return}if(h==="model"&&M.meta?.provider){i?.(M.meta.provider),R.current="",k(""),E(null),w(""),V();return}if(h==="slash"&&M.meta?.slashCommand){M.meta.slashCommand.run({setInputValue:P=>{R.current=P,k(P),E(null),w("")},closeSuggestions:V,clearScreen:()=>{o()},newSession:()=>{r?.()},exitApp:()=>{n()},showSystemMessage:(P,O)=>{a?.(P,O)},switchModel:P=>{i?.(P)},setContextLimit:P=>{c?.(P)},loadHistory:P=>{g?.(P)},data:{configPath:C,providerName:N,model:J,contextLimit:f,providers:_,mcpServers:Z}});return}if(h==="context"&&M.meta?.contextValue){let I=M.meta.contextValue;c?.(I),a?.("Context",`\u5DF2\u8BBE\u7F6E\u4E0A\u4E0B\u6587\u4E0A\u9650\u4E3A ${(I/1e3).toFixed(0)}k tokens`),R.current="",k(""),E(null),w(""),V();return}}},[V,o,n,i,a,c,g,h,B,b,C,N,J,f,_,Z]);aa((M,I)=>{if(I.ctrl&&M==="c"){n();return}if(I.ctrl&&M==="l"){R.current="",k(""),E(null),w(""),V(),o(),r?.();return}let P=h!=="none",O=P&&j.length>0;if(I.escape){let T=Date.now();if(T-Dt.current<=la){Dt.current=0,t?s():(R.current="",k(""),E(null),w(""),V());return}Dt.current=T,P&&V();return}if(!t){if(I.upArrow){if(O){U(it=>it<=0?j.length-1:it-1);return}if(!l.length)return;if(D===null){w(R.current);let it=l.length-1;E(it);let Mt=l[it]??"";R.current=Mt,k(Mt);return}let T=Math.max(0,D-1);E(T);let v=l[T]??"";R.current=v,k(v);return}if(I.downArrow){if(O){U(it=>(it+1)%j.length);return}if(D===null)return;let T=D+1;if(T>=l.length){E(null),R.current=Y,k(Y),w("");return}E(T);let v=l[T]??"";R.current=v,k(v);return}if(I.tab&&O){Ht(j[A]);return}if(I.return){if(O){Ht(j[A]);return}if(I.shift){let v=R.current+`
80
- `;R.current=v,k(v);return}let T=R.current.trim();T&&(e(T),R.current="",k(""),E(null),w(""),V(!1));return}if(I.backspace||I.delete){let T=R.current.slice(0,Math.max(0,R.current.length-1));R.current=T,k(T);return}if(M){let T=R.current+M;R.current=T,k(T)}}});let qt=b,Zt=t?" ":"\u258A",xt=qt.split(`
81
- `),Te=j.map(({value:M,meta:I,...P})=>P);return Xt(ye,{flexDirection:"column",gap:1,children:[Xt(ye,{flexDirection:"column",children:[Xt(ye,{children:[lt(yt,{color:"cyan",children:L}),lt(yt,{color:"gray",children:"@"}),lt(yt,{color:"cyan",children:bt}),lt(yt,{color:"yellow",children:" "}),t?lt(yt,{color:"gray",children:xt[0]}):Xt(Ca,{children:[lt(yt,{color:"white",children:xt[0]}),xt.length===1&&lt(yt,{color:"cyan",children:Zt})]})]}),xt.slice(1).map((M,I)=>Xt(ye,{children:[lt(yt,{color:"white",children:M}),I===xt.length-2&&lt(yt,{color:"cyan",children:Zt})]},`line-${I}`))]}),h!=="none"?lt(ao,{items:Te,activeIndex:A,loading:F}):null]})}async function ma(t){let e=xn(t.sessionsDir,t.cwd),n;try{n=await oa(e,{withFileTypes:!0})}catch(l){return l?.code==="ENOENT"?[]:[]}let o=t.activeSessionFile?yo(t.activeSessionFile):null,s=(await Promise.all(n.filter(l=>l.isFile()&&l.name.endsWith(".jsonl")).map(async l=>{let u=ia(e,l.name);if(o&&yo(u)===o)return null;try{let m=await ra(u);return{path:u,mtimeMs:m.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 pa(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 pa(t,e,n){try{let o=await na(t,"utf8"),s=da(o)?.trim()||ga(t);return{id:t,cwd:e,input:s,ts:n,sessionFile:t}}catch{return null}}function da(t){for(let e of t.split(`
82
- `)){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 ga(t){return sa(t).replace(/\.jsonl$/i,"")}function fa(t){let e=xa(t);if(e)return e;let n=Ta(t);if(n)return n;let o=Sa(t);if(o)return o;let r=ha(t);return r||ya(t)}function ha(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 ya(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 Ta(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 xa(t){let e=t.trimStart();if(!e.startsWith("/context"))return null;let n=e.slice(8);return n&&!n.startsWith(" ")?null:{type:"context"}}function Sa(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 ka(t){return{id:t.id,title:t.input,subtitle:wa(t.ts),kind:"history",badge:"HIS",value:t.input,meta:{historyEntry:t}}}function wa(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 Om from"string-width";var xo={"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 ba(t){let e=t.toLowerCase(),n=Object.entries(xo).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 xo.default}function So(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:ba("");return Math.min(100,n/o*100)}function ko(t){return t?`${t.total} tokens`:""}var _a=`Available commands:
74
+ Esc Esc Cancel / Clear input`,nr={name:"help",description:"Show help",run:({closeSuggestions:e,setInputValue:t,showSystemMessage:n})=>{e(),t(""),n("Help",_c)}};var or={name:"context",description:"Set context length limit (80k/120k/150k/200k)",run:({closeSuggestions:e,setInputValue:t})=>{e(!1),t("/context ")}};function Cc(e,t){let n=[];if(n.push(`- **${e}**`),"url"in t){if(n.push(` - Type: ${t.type??"streamable_http"}`),n.push(` - URL: ${t.url}`),t.type!=="sse"&&t.fallback_to_sse!==void 0&&n.push(` - Fallback to SSE: ${t.fallback_to_sse}`),t.headers&&Object.keys(t.headers).length>0){let o=Object.entries(t.headers).map(([r,s])=>`${r}=${s}`).join(", ");n.push(` - Headers: ${o}`)}}else n.push(` - Type: ${t.type??"stdio"}`),n.push(` - Command: ${t.command}`),t.args&&t.args.length>0&&n.push(` - Args: ${t.args.join(" ")}`);return n.join(`
75
+ `)}var rr={name:"mcp",description:"Show configured MCP servers",run:({closeSuggestions:e,setInputValue:t,showSystemMessage:n,data:o})=>{e();let{mcpServers:r,configPath:s}=o,i=Object.keys(r);if(i.length===0){n("MCP Servers",`No MCP servers configured.
76
+
77
+ Add servers to ${s}`),t("");return}let a=[];a.push(`Total: ${i.length} server(s)
78
+ `);for(let[c,l]of Object.entries(r))a.push(Cc(c,l)),a.push("");t(""),n("MCP Servers",a.join(`
79
+ `))}};var ln=[nr,Qo,Zo,er,tr,or,rr];import{Fragment as Jc,jsx as be,jsxs as Ze}from"react/jsx-runtime";var Lc=400;function ar({disabled:e,onSubmit:t,onExit:n,onClear:o,onNewSession:r,onCancelRun:s,onModelSelect:i,onSystemMessage:a,onSetContextLimit:c,history:l,cwd:u,sessionsDir:p,currentSessionFile:k,onHistorySelect:g,providers:v,configPath:h,providerName:y,model:R,contextLimit:f,mcpServers:U}){let[b,_]=we(""),[B,E]=we(null),[F,w]=we(""),[C,V]=we("none"),[q,Q]=we([]),[H,G]=we(0),[ne,ee]=we(!1),[Ue,tt]=we(!1),ae=pn(0),xe=pn(0),O=pn(""),Mt="\u203A ";un(()=>{O.current=b,tt(!1)},[b]);let j=Ec(()=>Ue||e?null:Uc(b),[e,Ue,b]),J=sr((M=!0)=>{M&&tt(!0),V("none"),Q([]),G(0),ee(!1)},[]);un(()=>{e&&J(!1)},[e,J]),un(()=>{if(!j){V("none"),Q([]),G(0),ee(!1);return}let M=!1,N=++ae.current;return ee(!0),(async()=>{try{if(j.type==="file"){let I=await Ko({cwd:u,query:j.query,limit:8});if(M||N!==ae.current)return;let D=I.map(T=>{let A=T.isDir?`${T.path}/`:T.path;return{id:T.id,title:A,kind:"file",value:A,meta:{isDir:T.isDir}}});V("file"),Q(D),G(T=>D.length?Math.min(T,D.length-1):0);return}if(j.type==="history"){let I=await Nc({sessionsDir:p,cwd:u,keyword:j.keyword,activeSessionFile:k});if(M||N!==ae.current)return;let D=I.map(zc);V("history"),Q(D),G(T=>D.length?Math.min(T,D.length-1):0);return}if(j.type==="models"){let I=j.keyword.toLowerCase(),T=(v??[]).filter(A=>{let oe=A.name?.toLowerCase()??"",Se=A.model?.toLowerCase()??"";return I?oe.includes(I)||Se.includes(I):!0}).map(A=>({id:A.name,title:`${A.name}: ${A.model}`,subtitle:A.base_url??A.env_api_key??"",kind:"model",value:`/models ${A.name}`,meta:{provider:A}}));V("model"),Q(T),G(A=>T.length?Math.min(A,T.length-1):0);return}if(j.type==="context"){let D=[8e4,12e4,15e4,2e5].map(T=>({id:`${T}`,title:`${(T/1e3).toFixed(0)}k tokens`,subtitle:T===f?"Current":void 0,kind:"context",value:`/context ${(T/1e3).toFixed(0)}k`,meta:{contextValue:T}}));V("context"),Q(D),G(T=>D.length?Math.min(T,D.length-1):0);return}if(j.type==="slash"){let I=j.keyword.toLowerCase(),T=(I?ln.filter(A=>A.matches?A.matches(I):A.name.startsWith(I)):ln).map(A=>({id:A.name,title:`/${A.name}`,subtitle:A.description,kind:"slash",value:`/${A.name} `,meta:{slashCommand:A}}));V("slash"),Q(T),G(A=>T.length?Math.min(A,T.length-1):0);return}}catch{!M&&N===ae.current&&Q([])}finally{!M&&N===ae.current&&ee(!1)}})(),()=>{M=!0}},[j,u,p,k,v,f]);let Be=sr(M=>{if(M){if(C==="file"&&j?.type==="file"){let N=b.slice(0,j.tokenStart),I=b.slice(j.tokenStart+j.query.length),D=`${N}${M.value}${I}`;O.current=D,_(D),E(null),w(""),M.meta?.isDir||J();return}if(C==="history"){M.meta?.historyEntry&&g?.(M.meta.historyEntry),O.current=M.value,_(M.value),E(null),w(""),J();return}if(C==="model"&&M.meta?.provider){i?.(M.meta.provider),O.current="",_(""),E(null),w(""),J();return}if(C==="slash"&&M.meta?.slashCommand){M.meta.slashCommand.run({setInputValue:I=>{O.current=I,_(I),E(null),w("")},closeSuggestions:J,clearScreen:()=>{o()},newSession:()=>{r?.()},exitApp:()=>{n()},showSystemMessage:(I,D)=>{a?.(I,D)},switchModel:I=>{i?.(I)},setContextLimit:I=>{c?.(I)},loadHistory:I=>{g?.(I)},data:{configPath:h,providerName:y,model:R,contextLimit:f,providers:v,mcpServers:U}});return}if(C==="context"&&M.meta?.contextValue){let N=M.meta.contextValue;c?.(N),a?.("Context",`Context limit set to ${(N/1e3).toFixed(0)}k tokens`),O.current="",_(""),E(null),w(""),J();return}}},[J,o,n,i,a,c,g,C,j,b,h,y,R,f,v,U]);$c((M,N)=>{if(N.ctrl&&M==="l"){O.current="",_(""),E(null),w(""),J(),o(),r?.();return}let I=C!=="none",D=I&&q.length>0;if(N.escape){let T=Date.now();if(T-xe.current<=Lc){xe.current=0,e?s():(O.current="",_(""),E(null),w(""),J());return}xe.current=T,I&&J();return}if(!e){if(N.upArrow){if(D){G(oe=>oe<=0?q.length-1:oe-1);return}if(!l.length)return;if(B===null){w(O.current);let oe=l.length-1;E(oe);let Se=l[oe]??"";O.current=Se,_(Se);return}let T=Math.max(0,B-1);E(T);let A=l[T]??"";O.current=A,_(A);return}if(N.downArrow){if(D){G(oe=>(oe+1)%q.length);return}if(B===null)return;let T=B+1;if(T>=l.length){E(null),O.current=F,_(F),w("");return}E(T);let A=l[T]??"";O.current=A,_(A);return}if(N.tab&&D){Be(q[H]);return}if(N.return){if(D){Be(q[H]);return}if(N.shift){let A=O.current+`
80
+ `;O.current=A,_(A);return}let T=O.current.trim();T&&(t(T),O.current="",_(""),E(null),w(""),J(!1));return}if(N.backspace||N.delete){let T=O.current.slice(0,Math.max(0,O.current.length-1));O.current=T,_(T);return}if(M){let T=O.current+M;O.current=T,_(T)}}});let je=b,_e=e?" ":"\u258A",$=je.split(`
81
+ `),Te=2,Me=q.map(({value:M,meta:N,...I})=>I);return Ze(Ct,{flexDirection:"column",gap:1,children:[Ze(Ct,{flexDirection:"column",paddingY:1,children:[Ze(Ct,{children:[be(Ae,{color:"gray",children:Mt}),e?be(Ae,{color:"gray",children:$[0]}):Ze(Jc,{children:[be(Ae,{color:"white",children:$[0]}),$.length===1&&be(Ae,{color:"cyan",children:_e})]})]}),$.slice(1).map((M,N)=>Ze(Ct,{children:[be(Ae,{color:"gray",children:" ".repeat(Te)}),be(Ae,{color:"white",children:M}),N===$.length-2&&be(Ae,{color:"cyan",children:_e})]},`line-${N}`))]}),C!=="none"?be(Yo,{items:Me,activeIndex:H,loading:ne}):null]})}async function Nc(e){let t=ao(e.sessionsDir,e.cwd),n;try{n=await Mc(t,{withFileTypes:!0})}catch(l){return l?.code==="ENOENT"?[]:[]}let o=e.activeSessionFile?ir(e.activeSessionFile):null,s=(await Promise.all(n.filter(l=>l.isFile()&&l.name.endsWith(".jsonl")).map(async l=>{let u=Ic(t,l.name);if(o&&ir(u)===o)return null;try{let p=await Pc(u);return{path:u,mtimeMs:p.mtimeMs}}catch{return null}}))).filter(l=>!!l).sort((l,u)=>u.mtimeMs-l.mtimeMs),i=e.limit??10,a=e.keyword?.trim().toLowerCase(),c=[];for(let l of s){if(c.length>=i)break;let u=await Oc(l.path,e.cwd,l.mtimeMs);if(u&&!(a&&!u.input.toLowerCase().includes(a))&&(c.push(u),c.length>=i))break}return c}async function Oc(e,t,n){try{let o=await Ac(e,"utf8"),s=Dc(o)?.trim()||Hc(e);return{id:e,cwd:t,input:s,ts:n,sessionFile:e}}catch{return null}}function Dc(e){for(let t of e.split(`
82
+ `)){let n=t.trim();if(!n)continue;let o;try{o=JSON.parse(n)}catch{continue}if(o&&typeof o=="object"&&o.type==="turn_start"){let r=typeof o.content=="string"?o.content.trim():"";if(r)return r}}return null}function Hc(e){return Rc(e).replace(/\.jsonl$/i,"")}function Uc(e){let t=Gc(e);if(t)return t;let n=Fc(e);if(n)return n;let o=Vc(e);if(o)return o;let r=Bc(e);return r||jc(e)}function Bc(e){let t=e.lastIndexOf("@");if(t===-1)return null;if(t>0){let o=e[t-1];if(o&&!/\s/.test(o))return null}let n=e.slice(t+1);return/\s/.test(n)?null:{type:"file",query:n,tokenStart:t+1}}function jc(e){let t=e.trimStart(),n=e.length-t.length;if(t.length===0)return null;let o=t;if(o.startsWith("/")&&(o=o.slice(1)),!o.toLowerCase().startsWith("resume")||e.slice(0,n).trim().length>0)return null;let s=o.slice(6);return s&&!s.startsWith(" ")?null:{type:"history",keyword:s.trim()}}function Fc(e){let t=e.trimStart();if(!t.startsWith("/models"))return null;let n=t.slice(7);return n&&!n.startsWith(" ")?null:{type:"models",keyword:n.trim()}}function Gc(e){let t=e.trimStart();if(!t.startsWith("/context"))return null;let n=t.slice(8);return n&&!n.startsWith(" ")?null:{type:"context"}}function Vc(e){let t=e.trimStart();if(!t.startsWith("/"))return null;let n=t.slice(1);return n.includes(" ")?null:/^[a-zA-Z]*$/.test(n)?{type:"slash",keyword:n.toLowerCase()}:n.length===0?{type:"slash",keyword:""}:null}function zc(e){return{id:e.id,title:e.input,subtitle:Wc(e.ts),kind:"history",badge:"HIS",value:e.input,meta:{historyEntry:e}}}function Wc(e){if(!e)return"";let t=new Date(e);if(Number.isNaN(t.getTime()))return"";let n=String(t.getFullYear()),o=String(t.getMonth()+1).padStart(2,"0"),r=String(t.getDate()).padStart(2,"0"),s=String(t.getHours()).padStart(2,"0"),i=String(t.getMinutes()).padStart(2,"0");return`${n}-${o}-${r} ${s}:${i}`}import{Box as Qe,Text as mn,useInput as Kc}from"ink";import{useState as qc,useCallback as Xc}from"react";import{jsx as et,jsxs as dn}from"react/jsx-runtime";function Yc(e){if(typeof e!="object"||e===null)return String(e);let t=Object.entries(e);if(t.length===0)return"";let[n,o]=t[0],r=typeof o=="string"?o:JSON.stringify(o);return`${r.slice(0,40)}${r.length>40?"...":""}`}function cr({request:e,onDecision:t}){let n=[{label:"Allow once",decision:"once"},{label:"Allow all session",decision:"session"},{label:"Reject this time",decision:"deny"}],[o,r]=qc(0);Kc(Xc((i,a)=>{a.upArrow?r(c=>c>0?c-1:n.length-1):a.downArrow?r(c=>c<n.length-1?c+1:0):a.return&&t(n[o].decision)},[o,t,n]));let s=Yc(e.params);return dn(Qe,{borderStyle:"single",borderColor:"gray",paddingX:2,flexDirection:"column",children:[et(Qe,{children:et(mn,{bold:!0,children:"Tool Approval:"})}),et(Qe,{marginTop:1,children:dn(mn,{color:"cyan",children:[e.toolName,s?` (${s})`:""]})}),et(Qe,{flexDirection:"column",marginTop:1,children:n.map((i,a)=>et(Qe,{children:dn(mn,{color:o===a?"green":"gray",children:[o===a?"> ":" ",i.label]})},i.decision))})]})}import Gd from"string-width";function ur(e){if(!e)return"success";let t=e.toLowerCase();return t.includes("error")||t.includes("unknown")||t.includes("failed")?"error":"success"}var lr={"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 Zc(e){let t=e.toLowerCase(),n=Object.entries(lr).filter(([o])=>o!=="default");for(let[o,r]of n.sort((s,i)=>i[0].length-s[0].length))if(t.includes(o))return r;return lr.default}function pr(e,t){if(e==null)return 0;let n=typeof e=="number"?e:e.prompt??e.total??0;if(n<=0)return 0;let o=t&&t>0?t:Zc("");return Math.min(100,n/o*100)}function mr(e){return e?`${e.total} tokens`:""}var Qc=`Available commands:
83
83
  /help Show help and shortcuts
84
84
  /exit Exit the session
85
85
  exit Exit the session (no slash)
@@ -99,17 +99,16 @@ Shortcuts:
99
99
  Ctrl+C Exit
100
100
  exit Type in input to exit
101
101
  Ctrl+X Toggle mode
102
- Ctrl+/ Show help`;function wo(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:_a};case"config":return{kind:"message",title:"Config",content:`Config file: ${e.configPath}
103
- Current provider: ${e.providerName}
104
- Current model: ${e.model}`};case"resume":return{kind:"message",title:"Resume",content:'Type "resume" to filter and select from session history.'};case"context":{let m=i(o[0]),y=s.map(g=>`${g/1e3}k`).join(", ");return m===null?{kind:"message",title:"Context",content:`Current: ${(e.contextLimit/1e3).toFixed(0)}k
102
+ Ctrl+/ Show help`;function dr(e,t){let[n,...o]=e.trim().slice(1).split(/\s+/),r=(n??"").toLowerCase(),s=[8e4,12e4,15e4,2e5],i=a=>{if(!a)return null;let l=a.toLowerCase().replace(/,/g,"").match(/^(\d+)(k)?$/);if(!l)return null;let u=Number(l[1])*(l[2]?1e3:1);return Number.isFinite(u)?u:null};switch(r){case"exit":return{kind:"exit"};case"new":return{kind:"new"};case"help":return{kind:"message",title:"Help",content:Qc};case"config":return{kind:"message",title:"Config",content:`Config file: ${t.configPath}
103
+ Current provider: ${t.providerName}
104
+ Current model: ${t.model}`};case"resume":return{kind:"message",title:"Resume",content:'Type "resume" to filter and select from session history.'};case"context":{let p=i(o[0]),k=s.map(g=>`${g/1e3}k`).join(", ");return p===null?{kind:"message",title:"Context",content:`Current: ${(t.contextLimit/1e3).toFixed(0)}k
105
105
  Usage: /context <length>
106
- Choices: ${y}`}:s.includes(m)?{kind:"set_context_limit",limit:m}:{kind:"message",title:"Context",content:`Unsupported length: ${m}. Pick one of: ${y}`}}case"init":return{kind:"init_agents_md"};case"$":{let m=o.join(" ").trim();return m?{kind:"shell_command",command:m}:{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(m=>m.name===a)??e.providers.find(m=>m.model===a);if(c)return{kind:"switch_model",provider:c};let l=e.providers.map(m=>{let y=m.base_url?` @ ${m.base_url}`:"";return`- ${m.name}: ${m.model}${y}`});return{kind:"message",title:"Models",content:`${a?`Not found: ${a}, `:""}Available models:
106
+ Choices: ${k}`}:s.includes(p)?{kind:"set_context_limit",limit:p}:{kind:"message",title:"Context",content:`Unsupported length: ${p}. Pick one of: ${k}`}}case"init":return{kind:"init_agents_md"};case"$":{let p=o.join(" ").trim();return p?{kind:"shell_command",command:p}:{kind:"message",title:"Shell Command",content:"Usage: $ <command> (e.g. $ git status)"}}case"models":if(!t.providers.length)return{kind:"message",title:"Models",content:`No providers configured. Check ${t.configPath}`};let a=o.join(" ").trim(),c=t.providers.find(p=>p.name===a)??t.providers.find(p=>p.model===a);if(c)return{kind:"switch_model",provider:c};let l=t.providers.map(p=>{let k=p.base_url?` @ ${p.base_url}`:"";return`- ${p.name}: ${p.model}${k}`});return{kind:"message",title:"Models",content:`${a?`Not found: ${a}, `:""}Available models:
107
107
  ${l.join(`
108
- `)}`};default:return{kind:"message",title:"Unknown",content:`Unknown command: ${t}
109
- Type /help for available commands.`}}}import{jsx as Yt,jsxs as Oa}from"react/jsx-runtime";var Ra=Aa(Pa);function Na(t){return{index:t,userInput:"",steps:[]}}function vo({sessionOptions:t,providerName:e,model:n,configPath:o,mcpServers:r,cwd:s,sessionsDir:i,providers:a}){let{exit:c}=$a(),[l,u]=Q(e),[m,y]=Q(n),[g,_]=Q({...t,providerName:e}),[C,N]=Q(null),[J,f]=Q([]),[Z,b]=Q([]),[k,D]=Q(!1),E=bo(null),[Y,w]=Q([]),[h,H]=Q(null),[j,G]=Q([]),[A,U]=Q(null),F=bo(null),[nt,Et]=Q(null),[Ct,Tt]=Q(t.maxPromptTokens??12e4),[Dt,R]=Q(0),L=st((p,d)=>{let x=`${Date.now()}-${Math.random().toString(16).slice(2)}`;b($=>[...$,{id:x,title:p,content:d}])},[]),bt=st((p,d)=>{f(x=>{let $=[...x],z=$.findIndex(ut=>ut.index===p);z===-1&&($.push(Na(p)),z=$.length-1);let K=$[z];return K&&($[z]=d(K)),$})},[]),B=Co(()=>({onAssistantStep:(p,d)=>{let x=E.current;x&&bt(x,$=>{let z=$.steps.slice();for(;z.length<=d;)z.push({index:z.length,assistantText:""});let K=z[d];if(!K)return $;let ut={...K,assistantText:K.assistantText+p};return z[d]=ut,{...$,steps:z}})},hooks:{onTurnStart:({turn:p,input:d,promptTokens:x})=>{E.current=p,x&&x>0&&R(x),bt(p,$=>({...$,index:p,userInput:d,steps:[],startedAt:Date.now(),contextPromptTokens:x??$.contextPromptTokens}))},onAction:({turn:p,step:d,action:x,thinking:$})=>{bt(p,z=>{let K=z.steps.slice();for(;K.length<=d;)K.push({index:K.length,assistantText:""});let ut=K[d];return ut?(K[d]={...ut,action:x,thinking:$,toolStatus:"executing"},{...z,steps:K}):z})},onObservation:({turn:p,step:d,observation:x})=>{},onFinal:({turn:p,finalText:d,status:x,turnUsage:$,tokenUsage:z})=>{bt(p,K=>{let ut=K.startedAt??Date.now(),Po=Math.max(0,Date.now()-ut),Ao=z?.prompt??K.contextPromptTokens;return{...K,finalText:d,status:x,tokenUsage:$,contextPromptTokens:Ao,startedAt:ut,durationMs:Po}}),D(!1)}}}),[bt]);je(()=>{let p=!1;return(async()=>{let d=F.current;d&&await d.close();let x=await Gt(B,g);if(p){await x.close();return}F.current=x,N(x),H(x.historyFilePath??null)})(),()=>{p=!0}},[B,g]),je(()=>()=>{F.current&&F.current.close()},[]);let V=st(async()=>{F.current&&await F.current.close();let p="";if(h)try{(await Ea(h)).size>0&&(p=`
110
- Session saved: ${Ma(h)}`)}catch{}Et(`Bye!${p}`),setTimeout(()=>{c()},600)},[c,h]),Ht=st(()=>{f([]),b([]),G([]),U(null),R(0)},[]),qt=st(async()=>{f([]),b([]),G([]),U(null),R(0);let p=ze(),d={...g,sessionId:p};F.current&&await F.current.close();let x=await Gt(B,d);F.current=x,N(x),H(x.historyFilePath??null),_(d),L("New Session","Started a new session with fresh context.")},[B,g,L]),Zt=st(async p=>{if(!p.sessionFile){L("\u5386\u53F2\u8BB0\u5F55","\u8BE5\u8BB0\u5F55\u6CA1\u6709\u53EF\u52A0\u8F7D\u7684\u4E0A\u4E0B\u6587\u6587\u4EF6\u3002");return}try{let d=await va(p.sessionFile,"utf8"),x=La(d);G(x.turns),U(x.messages),D(!1),f([]),N(null),H(null),R(0),E.current=null,_($=>({...$,sessionId:ze()})),L("\u5386\u53F2\u8BB0\u5F55\u5DF2\u52A0\u8F7D",x.summary||p.input)}catch(d){L("\u5386\u53F2\u8BB0\u5F55\u52A0\u8F7D\u5931\u8D25",`\u65E0\u6CD5\u8BFB\u53D6 ${p.sessionFile}: ${d.message}`)}},[L]),xt=st(async p=>{try{let d=await Pt(),x={...d.config,current_provider:p};await jt(d.configPath,x)}catch(d){L("\u914D\u7F6E\u4FDD\u5B58\u5931\u8D25",`\u672A\u80FD\u4FDD\u5B58\u6A21\u578B\u9009\u62E9: ${d.message}`)}},[L]),Te=st(()=>{k&&C?.cancelCurrentTurn?.()},[k,C]),M=st(async p=>{if(p.name===l&&p.model===m){L("\u6A21\u578B\u5207\u6362",`\u5DF2\u5728\u4F7F\u7528 ${p.name} (${p.model})`);return}if(k){L("\u6A21\u578B\u5207\u6362","\u5F53\u524D\u6B63\u5728\u8FD0\u884C\uFF0C\u6309 Esc Esc \u53D6\u6D88\u540E\u518D\u5207\u6362\u6A21\u578B\u3002");return}f([]),G([]),U(null),R(0),E.current=null,N(null),H(null),u(p.name),y(p.model),_(d=>({...d,sessionId:ze(),providerName:p.name})),await xt(p.name),L("\u6A21\u578B\u5207\u6362",`\u5DF2\u5207\u6362\u5230 ${p.name} (${p.model})`)},[L,k,m,l,xt]),I=st(async p=>{if(!p.trim()){L("Shell Command","Usage: $ <command> (e.g. $ git status)");return}D(!0);try{let{stdout:d,stderr:x}=await Ra(p,{cwd:s,maxBuffer:5242880}),$=[d?.trim(),x?.trim()].filter(Boolean).join(`
111
- `);L("Shell Result",$||"(no output)")}catch(d){let x=d,z=[x.stdout?.trim(),x.stderr?.trim(),x.message].filter(Boolean).join(`
112
- `);L("Shell Error",z||"Command failed")}finally{D(!1)}},[L,s]),P=st(async p=>{let d=wo(p,{configPath:o,providerName:l,model:m,mcpServers:r,providers:a,contextLimit:Ct});if(d.kind==="exit"){await V();return}if(d.kind==="new"){await qt();return}if(d.kind==="switch_model"){await M(d.provider);return}if(d.kind==="set_context_limit"){Tt(d.limit),L("Context length",`\u5DF2\u8BBE\u7F6E\u4E0A\u4E0B\u6587\u4E0A\u9650\u4E3A ${(d.limit/1e3).toFixed(0)}k tokens`);return}if(d.kind==="init_agents_md"){L("Init","Analyzing project structure and generating AGENTS.md...");let x=`Please analyze the current project and create an AGENTS.md file at the project root.
108
+ `)}`};default:return{kind:"message",title:"Unknown",content:`Unknown command: ${e}
109
+ Type /help for available commands.`}}}import{dirname as fr,join as el,resolve as tl}from"path";import{statSync as nl,existsSync as ol}from"fs";import{readFile as rl}from"fs/promises";import{get as sl}from"https";function gr(e){let t=e.trim().replace(/^v/i,""),[n="",o]=t.split("-",2),r=n.split(".").map(s=>Number(s));return r.length<3||r.some(s=>!Number.isFinite(s))?null:{major:r[0]??0,minor:r[1]??0,patch:r[2]??0,prerelease:o??null}}function il(e,t){let n=gr(e),o=gr(t);return!n||!o?!1:n.major!==o.major?n.major>o.major:n.minor!==o.minor?n.minor>o.minor:n.patch!==o.patch?n.patch>o.patch:n.prerelease&&!o.prerelease?!1:!n.prerelease&&o.prerelease?!0:n.prerelease&&o.prerelease?n.prerelease>o.prerelease:!1}async function al(e){let t=el(e,"package.json");if(!ol(t))return null;let n=await rl(t,"utf8"),o=JSON.parse(n);return!o.name||!o.version?null:{name:o.name,version:o.version}}async function cl(){let t=tl(process.argv[1]??process.cwd());try{nl(t).isFile()&&(t=fr(t))}catch{t=process.cwd()}for(;;){let n=await al(t);if(n&&n.name==="@memo-code/memo")return n;let o=fr(t);if(o===t)break;t=o}return null}async function ll(e,t=1500){let o=`https://registry.npmjs.org/${encodeURIComponent(e)}/latest`;return new Promise(r=>{let s=sl(o,{timeout:t},i=>{if(i.statusCode&&i.statusCode>=400){i.resume(),r(null);return}let a=[];i.on("data",c=>a.push(c)),i.on("end",()=>{try{let c=JSON.parse(Buffer.concat(a).toString("utf8"));r(c.version??null)}catch{r(null)}})});s.on("timeout",()=>{s.destroy(),r(null)}),s.on("error",()=>r(null))})}async function hr(){let e=await cl();if(!e)return null;let t=await ll(e.name);return!t||!il(t,e.version)?null:{current:e.version,latest:t}}import{jsx as He,jsxs as xl}from"react/jsx-runtime";var gl=ml(pl);function hl(e){return{index:e,userInput:"",steps:[]}}function Tr({sessionOptions:e,providerName:t,model:n,configPath:o,mcpServers:r,cwd:s,sessionsDir:i,providers:a,dangerous:c=!1}){let{exit:l}=dl(),[u,p]=Z(t),[k,g]=Z(n),[v,h]=Z({...e,providerName:t}),[y,R]=Z(null),[f,U]=Z([]),[b,_]=Z([]),[B,E]=Z(!1),F=At(null),[w,C]=Z([]),[V,q]=Z(null),[Q,H]=Z([]),[G,ne]=Z(null),ee=At(null),[Ue,tt]=Z(null),ae=At(0),[xe,O]=Z(e.maxPromptTokens??12e4),[Mt,j]=Z(0),[J,Be]=Z(null),je=At(null),_e=te(()=>(ae.current+=1,ae.current),[]),$=te((m,d)=>{let x=`${Date.now()}-${Math.random().toString(16).slice(2)}`,P=_e();_(L=>[...L,{id:x,title:m,content:d,sequence:P}])},[_e]),Te=te((m,d)=>{U(x=>{let P=[...x],L=P.findIndex(re=>re.index===m);L===-1&&(P.push(hl(m)),L=P.length-1);let z=P[L];return z&&(P[L]=d(z)),P})},[]),Me=yr(()=>({onAssistantStep:(m,d)=>{let x=F.current;x&&Te(x,P=>{let L=P.steps.slice();for(;L.length<=d;)L.push({index:L.length,assistantText:""});let z=L[d];if(!z)return P;let re={...z,assistantText:z.assistantText+m};return L[d]=re,{...P,steps:L}})},requestApproval:c?void 0:m=>new Promise(d=>{Be(m),je.current=d}),hooks:{onTurnStart:({turn:m,input:d,promptTokens:x})=>{F.current=m,x&&x>0&&j(x),Te(m,P=>({...P,index:m,userInput:d,steps:[],startedAt:Date.now(),contextPromptTokens:x??P.contextPromptTokens}))},onAction:({turn:m,step:d,action:x,thinking:P,parallelActions:L})=>{Te(m,z=>{let re=z.steps.slice();for(;re.length<=d;)re.push({index:re.length,assistantText:""});let nt=re[d];return nt?(re[d]={...nt,action:x,thinking:P,toolStatus:"executing",parallelActions:L&&L.length>1?L:void 0},{...z,steps:re}):z})},onObservation:({turn:m,step:d,observation:x})=>{Te(m,P=>{let L=P.steps.slice();for(;L.length<=d;)L.push({index:L.length,assistantText:""});let z=L[d];return z?(L[d]={...z,observation:x,toolStatus:ur(x)},{...P,steps:L}):P})},onFinal:({turn:m,finalText:d,status:x,turnUsage:P,tokenUsage:L})=>{Te(m,z=>{let re=z.startedAt??Date.now(),nt=Math.max(0,Date.now()-re),Er=L?.prompt??z.contextPromptTokens,Ar=z.sequence??_e();return{...z,finalText:d,status:x,tokenUsage:P,contextPromptTokens:Er,startedAt:re,durationMs:nt,sequence:Ar}}),E(!1)}}}),[Te,c,_e]);Et(()=>{let m=!1;return(async()=>{let d=ee.current;d&&await d.close();let x=await Je(Me,v);if(m){await x.close();return}ee.current=x,R(x),q(x.historyFilePath??null)})(),()=>{m=!0}},[Me,v]),Et(()=>{let m=!1;return(async()=>{let d=await hr();m||!d||$("Update",`Update available: v${d.latest}. Run npm/pnpm/yarn/bun to update @memo-code/memo.`)})(),()=>{m=!0}},[$]),Et(()=>()=>{ee.current&&ee.current.close()},[]);let M=te(async()=>{ee.current&&await ee.current.close(),tt("Bye!"),setTimeout(()=>{l()},300)},[l]),N=te(()=>{U([]),_([]),H([]),ne(null),j(0),ae.current=0},[]),I=te(async()=>{U([]),_([]),H([]),ne(null),j(0),ae.current=0;let m=fn(),d={...v,sessionId:m};ee.current&&await ee.current.close();let x=await Je(Me,d);ee.current=x,R(x),q(x.historyFilePath??null),h(d),$("New Session","Started a new session with fresh context.")},[Me,v,$]),D=te(async m=>{if(!m.sessionFile){$("History","This entry has no context file to load.");return}try{let d=await ul(m.sessionFile,"utf8"),x=yl(d);H(x.turns),ne(x.messages),E(!1),U([]),R(null),q(null),j(0),F.current=null,ae.current=Math.max(ae.current,x.maxSequence),h(P=>({...P,sessionId:fn()})),$("History loaded",x.summary||m.input)}catch(d){$("Failed to load history",`Unable to read ${m.sessionFile}: ${d.message}`)}},[$]),T=te(async m=>{try{let d=await Pe(),x={...d.config,current_provider:m};await ze(d.configPath,x)}catch(d){$("Failed to save config",`Failed to save model selection: ${d.message}`)}},[$]),A=te(()=>{B&&y?.cancelCurrentTurn?.()},[B,y]),oe=te(async m=>{if(m.name===u&&m.model===k){$("Model switch",`Already using ${m.name} (${m.model})`);return}if(B){$("Model switch","Currently running. Press Esc Esc to cancel before switching models.");return}U([]),H([]),ne(null),j(0),F.current=null,R(null),q(null),p(m.name),g(m.model),h(d=>({...d,sessionId:fn(),providerName:m.name})),await T(m.name),$("Model switch",`Switched to ${m.name} (${m.model})`)},[$,B,k,u,T]),Se=te(async m=>{if(!m.trim()){$("Shell Command","Usage: $ <command> (e.g. $ git status)");return}E(!0);try{let{stdout:d,stderr:x}=await gl(m,{cwd:s,maxBuffer:5242880}),P=[d?.trim(),x?.trim()].filter(Boolean).join(`
110
+ `);$("Shell Result",P||"(no output)")}catch(d){let x=d,L=[x.stdout?.trim(),x.stderr?.trim(),x.message].filter(Boolean).join(`
111
+ `);$("Shell Error",L||"Command failed")}finally{E(!1)}},[$,s]),gn=te(async m=>{let d=dr(m,{configPath:o,providerName:u,model:k,mcpServers:r,providers:a,contextLimit:xe});if(d.kind==="exit"){await M();return}if(d.kind==="new"){await I();return}if(d.kind==="switch_model"){await oe(d.provider);return}if(d.kind==="set_context_limit"){O(d.limit),$("Context length",`Context limit set to ${(d.limit/1e3).toFixed(0)}k tokens`);return}if(d.kind==="init_agents_md"){$("Init","Analyzing project structure and generating AGENTS.md...");let x=`Please analyze the current project and create an AGENTS.md file at the project root.
113
112
 
114
113
  The AGENTS.md should include:
115
114
  1. Project name and brief description
@@ -125,14 +124,16 @@ Steps:
125
124
  3. Understand the tech stack and conventions
126
125
  4. Create the AGENTS.md file using the write tool
127
126
 
128
- Make the AGENTS.md concise but informative, following best practices for AI agent guidelines.`;if(w($=>[...$,"/init"]),!C){L("Error","Session not initialized");return}D(!0);try{await C.runTurn(x)}catch{D(!1)}return}if(d.kind==="shell_command"){await I(d.command);return}L(d.title,d.content)},[L,o,Ht,V,M,r,m,l,Ct,a,I]);je(()=>{if(!C||!A?.length)return;let p=C.history[0];p&&(C.history.splice(0,C.history.length,p,...A),U(null))},[A,C]);let O=st(async p=>{if(p.trim().toLowerCase()==="exit"){await V();return}if(!C||k)return;let d=p.trim();if(d.startsWith("$")){let x=d.slice(1).trim();w($=>[...$,p]),await I(x);return}if(p.startsWith("/")){await P(p);return}w(x=>[...x,p]),D(!0);try{await C.runTurn(p)}catch{D(!1)}},[k,P,V,C]),T=J[J.length-1],v=ko(T?.tokenUsage),it=So(Dt,Ct),Mt=Co(()=>[...j,...J],[j,J]);if(nt){let p=nt.split(`
129
- `);return Yt(_o,{flexDirection:"column",children:p.map((d,x)=>Yt(Ia,{color:"green",children:d},x))})}return Oa(_o,{flexDirection:"column",children:[Yt(Vn,{systemMessages:Z,turns:Mt,headerInfo:{providerName:l,model:m,cwd:s,sessionId:g.sessionId??"unknown"}}),Yt(To,{disabled:!C||k,onSubmit:O,onExit:V,onClear:Ht,onNewSession:qt,onCancelRun:Te,onHistorySelect:Zt,onModelSelect:M,onSystemMessage:L,onSetContextLimit:p=>{Tt(p),L("Context length",`\u5DF2\u8BBE\u7F6E\u4E0A\u4E0B\u6587\u4E0A\u9650\u4E3A ${(p/1e3).toFixed(0)}k tokens`)},history:Y,cwd:s,sessionsDir:i,currentSessionFile:h??void 0,providers:a,configPath:o,providerName:l,model:m,contextLimit:Ct,mcpServers:r}),Yt(Ln,{contextPercent:it})]})}function La(t){let e=[],n=[],o=[],r=t.split(`
130
- `).map(a=>a.trim()).filter(Boolean),s=null,i=0;for(let a of r){let c;try{c=JSON.parse(a)}catch{continue}if(!(!c||typeof c!="object")){if(c.type==="turn_start"){let l=typeof c.content=="string"?c.content:"";s={index:-(i+1),userInput:l,steps:[],status:"ok"},n.push(s),l&&(e.push({role:"user",content:l}),o.push(`User: ${l}`)),i+=1;continue}if(c.type==="assistant"){let l=typeof c.content=="string"?c.content:"";if(l&&(e.push({role:"assistant",content:l}),o.push(`Assistant: ${l}`),s)){let u={index:s.steps.length,assistantText:l};s.steps=[...s.steps,u],s.finalText=l}continue}if(c.type==="action"&&s){let l=c.meta;if(l&&typeof l=="object"){let u=typeof l.tool=="string"?l.tool:"",m=l.input,y=typeof l.thinking=="string"?l.thinking:"",g=s.steps[s.steps.length-1];g&&(g.action={tool:u,input:m},y&&(g.thinking=y))}continue}if(c.type==="observation"&&s){let l=typeof c.content=="string"?c.content:"",u=s.steps[s.steps.length-1];u&&(u.observation=l);continue}}}return{summary:o.join(`
131
- `),messages:e,turns:n}}import{jsx as Wa}from"react/jsx-runtime";function Fa(t){let e={once:!1},n=[];for(let o=0;o<t.length;o++){let r=t[o];if(r!==void 0){if(r==="--once"){e.once=!0;continue}n.push(r)}}return{question:n.join(" "),options:e}}async function Mo(){let t=await Pt();if(!t.needsSetup)return t;let e=t.config.providers[0],o=[e?.env_api_key,"OPENAI_API_KEY","DEEPSEEK_API_KEY"].filter(Boolean).some(i=>!!process.env[i]);if(e&&o)return await jt(t.configPath,t.config),console.log(`Detected API key in env. Wrote default provider (${e.name}) to ${t.configPath}`),{...t,needsSetup:!1};let r=Da({input:Ha,output:Ua}),s=async(i,a)=>(await r.question(i)).trim()||a;try{console.log("No provider config found. Please answer the prompts:");let i=await s("Provider name [deepseek]: ","deepseek"),a=await s("API key env var [DEEPSEEK_API_KEY]: ","DEEPSEEK_API_KEY"),c=await s("Model name [deepseek-chat]: ","deepseek-chat"),l=await s("Base URL [https://api.deepseek.com]: ","https://api.deepseek.com"),u={current_provider:i,providers:[{name:i,env_api_key:a,model:c,base_url:l||void 0}]};return await jt(t.configPath,u),console.log(`Config written to ${t.configPath}
132
- `),{...t,config:u,needsSetup:!1}}finally{r.close()}}async function ja(t){let e=await Mo(),n=zt(e.config),r={sessionId:Eo(),mode:"once",stream:e.config.stream_output??!1},i=await Gt({onAssistantStep:c=>{process.stdout.write(c)},hooks:{onAction:({action:c})=>{console.log(`
133
- [tool] ${c.tool}`),c.input!==void 0&&console.log(`[input] ${JSON.stringify(c.input)}`)},onObservation:()=>{}}},r),a=t.question;if(!a&&!process.stdin.isTTY&&(a=await Va()),!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}
134
- `);let c=await i.runTurn(a);e.config.stream_output||console.log(`
127
+ Make the AGENTS.md concise but informative, following best practices for AI agent guidelines.`;if(C(P=>[...P,"/init"]),!y){$("Error","Session not initialized");return}E(!0);try{await y.runTurn(x)}catch{E(!1)}return}if(d.kind==="shell_command"){await Se(d.command);return}$(d.title,d.content)},[$,o,N,M,oe,r,k,u,xe,a,Se]);Et(()=>{if(!y||!G?.length)return;let m=y.history[0];m&&(y.history.splice(0,y.history.length,m,...G),ne(null))},[G,y]);let kr=te(async m=>{if(m.trim().toLowerCase()==="exit"){await M();return}if(!y||B)return;let d=m.trim();if(d.startsWith("$")){let x=d.slice(1).trim();C(P=>[...P,m]),await Se(x);return}if(m.startsWith("/")){await gn(m);return}C(x=>[...x,m]),E(!0);try{await y.runTurn(m)}catch{E(!1)}},[B,gn,M,y]),wr=f[f.length-1],Ml=mr(wr?.tokenUsage),br=pr(Mt,xe),_r=yr(()=>[...Q,...f],[Q,f]),Cr=te(m=>{let d=je.current;d&&(d(m),je.current=null),Be(null)},[]);if(Ue){let m=Ue.split(`
128
+ `);return He(xr,{flexDirection:"column",children:m.map((d,x)=>He(fl,{color:"green",children:d},x))})}return xl(xr,{flexDirection:"column",children:[He(No,{systemMessages:b,turns:_r,headerInfo:{providerName:u,model:k,cwd:s,sessionId:v.sessionId??"unknown"}}),He(ar,{disabled:!y||B||!!J,onSubmit:kr,onExit:M,onClear:N,onNewSession:I,onCancelRun:A,onHistorySelect:D,onModelSelect:oe,onSystemMessage:$,onSetContextLimit:m=>{O(m),$("Context length",`Context limit set to ${(m/1e3).toFixed(0)}k tokens`)},history:w,cwd:s,sessionsDir:i,currentSessionFile:V??void 0,providers:a,configPath:o,providerName:u,model:k,contextLimit:xe,mcpServers:r}),J&&He(cr,{request:J,onDecision:Cr}),He(wo,{contextPercent:br})]})}function yl(e){let t=[],n=[],o=[],r=e.split(`
129
+ `).map(c=>c.trim()).filter(Boolean),s=null,i=0,a=0;for(let c of r){let l;try{l=JSON.parse(c)}catch{continue}if(!(!l||typeof l!="object")){if(l.type==="turn_start"){let u=typeof l.content=="string"?l.content:"";s={index:-(i+1),userInput:u,steps:[],status:"ok",sequence:a+=1},n.push(s),u&&(t.push({role:"user",content:u}),o.push(`User: ${u}`)),i+=1;continue}if(l.type==="assistant"){let u=typeof l.content=="string"?l.content:"";if(u&&(t.push({role:"assistant",content:u}),o.push(`Assistant: ${u}`),s)){let p={index:s.steps.length,assistantText:u};s.steps=[...s.steps,p],s.finalText=u}continue}if(l.type==="action"&&s){let u=l.meta;if(u&&typeof u=="object"){let p=typeof u.tool=="string"?u.tool:"",k=u.input,g=typeof u.thinking=="string"?u.thinking:"",h=(Array.isArray(u.toolBlocks)?u.toolBlocks:[]).map(R=>{let f=typeof R?.name=="string"?R.name:"";return f?{tool:f,input:R?.input}:null}).filter(Boolean),y=s.steps[s.steps.length-1];y&&(h.length>1?(y.action=h[0],y.parallelActions=h):p&&(y.action={tool:p,input:k}),g&&(y.thinking=g))}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(`
130
+ `),messages:t,turns:n,maxSequence:a}}import{jsx as Al}from"react/jsx-runtime";function wl(e){let t={once:!1,dangerous:!1},n=[];for(let o=0;o<e.length;o++){let r=e[o];if(r!==void 0){if(r==="--once"){t.once=!0;continue}if(r==="--dangerous"||r==="-d"){t.dangerous=!0;continue}n.push(r)}}return{question:n.join(" "),options:t}}async function vr(){let e=await Pe();if(!e.needsSetup)return e;let t=e.config.providers[0],o=[t?.env_api_key,"OPENAI_API_KEY","DEEPSEEK_API_KEY"].filter(Boolean).some(i=>!!process.env[i]);if(t&&o)return await ze(e.configPath,e.config),console.log(`Detected API key in env. Wrote default provider (${t.name}) to ${e.configPath}`),{...e,needsSetup:!1};let r=Tl({input:Sl,output:vl}),s=async(i,a)=>(await r.question(i)).trim()||a;try{console.log("No provider config found. Please answer the prompts:");let i=await s("Provider name [deepseek]: ","deepseek"),a=await s("API key env var [DEEPSEEK_API_KEY]: ","DEEPSEEK_API_KEY"),c=await s("Model name [deepseek-chat]: ","deepseek-chat"),l=await s("Base URL [https://api.deepseek.com]: ","https://api.deepseek.com"),u={current_provider:i,providers:[{name:i,env_api_key:a,model:c,base_url:l||void 0}]};return await ze(e.configPath,u),console.log(`Config written to ${e.configPath}
131
+ `),{...e,config:u,needsSetup:!1}}finally{r.close()}}async function bl(e){let t=await vr(),n=We(t.config),r={sessionId:Sr(),mode:"once",stream:t.config.stream_output??!1};e.options.dangerous&&console.log("\u26A0\uFE0F DANGEROUS MODE: All tool approvals are bypassed!");let s={onAssistantStep:c=>{process.stdout.write(c)},requestApproval:e.options.dangerous?void 0:c=>(console.log(`
132
+ [approval required] ${c.toolName}: ${c.reason}`),console.log("[approval] Run with --dangerous to bypass approval"),Promise.resolve("deny")),hooks:{onAction:({action:c})=>{console.log(`
133
+ [tool] ${c.tool}`),c.input!==void 0&&console.log(`[input] ${JSON.stringify(c.input)}`)},onObservation:()=>{}}},i=await Je(s,r),a=e.question;if(!a&&!process.stdin.isTTY&&(a=await El()),!a&&e.options.once&&(a="Give me a quick self-introduction."),!a){console.error("No input provided. Pass a question or use stdin."),await i.close();return}try{console.log(`User: ${a}
134
+ `);let c=await i.runTurn(a);t.config.stream_output||console.log(`
135
135
  ${c.finalText}`),console.log(`
136
136
  [tokens] prompt=${c.tokenUsage.prompt} completion=${c.tokenUsage.completion} total=${c.tokenUsage.total}`),console.log(`
137
- provider=${n.name} model=${n.model}`)}catch(c){console.error(`Run failed: ${c.message}`)}finally{await i.close()}}async function za(t){let e=await Mo(),n=zt(e.config),r={sessionId:Eo(),mode:"interactive",stream:e.config.stream_output??!1},s=oe(e,r);await Ba(Wa(vo,{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}),{exitOnCtrlC:!1,patchConsole:!1}).waitUntilExit()}async function Ga(){let t=Fa(process.argv.slice(2));if(!(process.stdin.isTTY&&process.stdout.isTTY)||t.options.once){await ja(t);return}await za(t)}Ga();async function Va(){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()})}
137
+ provider=${n.name} model=${n.model}`)}catch(c){console.error(`Run failed: ${c.message}`)}finally{await i.close()}}async function _l(e){let t=await vr(),n=We(t.config),r={sessionId:Sr(),mode:"interactive",stream:t.config.stream_output??!1},s=ut(t,r);e.options.dangerous&&(console.log("\u26A0\uFE0F DANGEROUS MODE: All tool approvals are bypassed!"),console.log(` Use with caution.
138
+ `)),await kl(Al(Tr,{sessionOptions:r,providerName:n.name,model:n.model,configPath:t.configPath,mcpServers:t.config.mcp_servers??{},cwd:process.cwd(),sessionsDir:s,providers:t.config.providers,dangerous:e.options.dangerous}),{exitOnCtrlC:!1,patchConsole:!1}).waitUntilExit()}async function Cl(){let e=wl(process.argv.slice(2));if(!(process.stdin.isTTY&&process.stdout.isTTY)||e.options.once){await bl(e);return}await _l(e)}Cl();async function El(){return new Promise(e=>{let t="";process.stdin.setEncoding("utf8"),process.stdin.on("data",n=>{t+=n}),process.stdin.on("end",()=>{e(t.trim())}),process.stdin.resume()})}
138
139
  //# sourceMappingURL=index.js.map
package/dist/prompt.md CHANGED
@@ -261,7 +261,7 @@ When user asks to create a commit:
261
261
 
262
262
  3. **Execute commit** (run commands in parallel where independent):
263
263
  - Add relevant untracked files
264
- - Create commit with message ending: `Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>`
264
+ - Create commit with message
265
265
  - Run git status to verify
266
266
 
267
267
  **Git Safety**:
@@ -278,8 +278,6 @@ When user asks to create a commit:
278
278
  ```bash
279
279
  git commit -m "$(cat <<'EOF'
280
280
  Commit message here.
281
-
282
- Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
283
281
  EOF
284
282
  )"
285
283
  ```
@@ -313,7 +311,7 @@ gh pr create --title "title" --body "$(cat <<'EOF'
313
311
  ## Test plan
314
312
  [Checklist for testing]
315
313
 
316
- 🤖 Generated with [Memo Code](https://github.com/yourusername/memo-cli)
314
+ 🤖 Generated with Memo Code
317
315
  EOF
318
316
  )"
319
317
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memo-code/memo",
3
- "version": "0.2.1",
3
+ "version": "0.4.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "AI programming assistant with multi-turn conversations, tool calling, and concurrent execution",