@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 +33 -3
- package/dist/index.js +59 -58
- package/dist/prompt.md +2 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,20 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
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
|
|
3
|
-
`,"utf8")}async flush(){return Promise.resolve()}};function
|
|
4
|
-
|
|
5
|
-
|
|
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(/ /gi," ").replace(/</gi,"<").replace(/>/gi,">").replace(/&/gi,"&").replace(/"/gi,'"').replace(/'/g,"'").replace(/&#(x?[0-9a-fA-F]+);/g,(o,r)=>{try{let s=r.startsWith("x")||r.startsWith("X")?parseInt(r.slice(1),16):parseInt(r,10);return Number.isFinite(s)?String.fromCharCode(s):""}catch{return""}}),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()},
|
|
8
|
-
`)
|
|
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
|
|
13
|
-
`),
|
|
14
|
-
... (truncated, showing ${r} lines; max=${
|
|
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
|
|
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 = "${
|
|
25
|
-
stream_output = ${
|
|
26
|
-
`.trim(),
|
|
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
|
|
29
|
-
`)}formatToolDescription(
|
|
30
|
-
`)}groupByServer(
|
|
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
|
-
${
|
|
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
|
-
${
|
|
36
|
-
`),{thinkingParts:n,cleaned:o}=
|
|
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
|
|
39
|
-
`),toolUseBlocks:n.map(o=>({id:o.id,name:o.name,input:o.input})),stopReason:"stop_reason"in
|
|
40
|
-
`)}function
|
|
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:
|
|
43
|
-
`;case"checkbox":return
|
|
44
|
-
`).map(
|
|
45
|
-
`).trimEnd()}function
|
|
46
|
-
`)}function
|
|
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
|
|
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
|
|
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`,
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
`)
|
|
80
|
-
|
|
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&<(yt,{color:"cyan",children:Zt})]})]}),xt.slice(1).map((M,I)=>Xt(ye,{children:[lt(yt,{color:"white",children:M}),I===xt.length-2&<(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
|
|
103
|
-
Current provider: ${
|
|
104
|
-
Current model: ${
|
|
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: ${
|
|
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: ${
|
|
109
|
-
Type /help for available commands.`}}}import{jsx as
|
|
110
|
-
|
|
111
|
-
`)
|
|
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(
|
|
129
|
-
`);return
|
|
130
|
-
`).map(
|
|
131
|
-
`),messages:
|
|
132
|
-
`),{...
|
|
133
|
-
[
|
|
134
|
-
`)
|
|
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
|
|
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
|
|
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
|
|
314
|
+
🤖 Generated with Memo Code
|
|
317
315
|
EOF
|
|
318
316
|
)"
|
|
319
317
|
```
|