xuanzhu 0.1.1 → 0.1.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 +50 -2
- package/dist/cli.js +140 -121
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -118,6 +118,7 @@ xzh
|
|
|
118
118
|
| `xzh model add <provider> <model> [权重]` | 新增模型(默认权重 `10`) |
|
|
119
119
|
| `xzh model remove <id\|序号>` | 删除模型 |
|
|
120
120
|
| `xzh model weight <id\|序号> <权重>` | 调整模型的调用权重 |
|
|
121
|
+
| `xzh model context <id\|序号> <大小>` | 调整上下文窗口(token,支持 `128k` / `1M`) |
|
|
121
122
|
| `xzh model reset` | 把全部模型权重恢复为默认值 |
|
|
122
123
|
| `xzh config` | 查看当前配置(API Key 脱敏) |
|
|
123
124
|
| `xzh config edit` | 使用 `nano` 编辑配置文件 |
|
|
@@ -129,7 +130,15 @@ xzh
|
|
|
129
130
|
|
|
130
131
|
## 配置
|
|
131
132
|
|
|
132
|
-
配置文件位于 `~/.xzh/config.json`(权限 `600
|
|
133
|
+
配置文件位于 `~/.xzh/config.json`(权限 `600`)。可用环境变量 `XZH_HOME` 整体重定向 ——
|
|
134
|
+
它指向**全局目录本身**(不是家目录):
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
XZH_HOME=/path/to/dir xzh # 改用 /path/to/dir/config.json
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
适用于多环境并行(本机 / 远程 / 容器各持一份配置互不干扰)。设置后**不会**执行
|
|
141
|
+
`~/.xuanzhu` 的旧目录迁移 —— 那是为你显式指定的新位置,不该把家目录里的旧数据搬进去。
|
|
133
142
|
|
|
134
143
|
```json
|
|
135
144
|
{
|
|
@@ -166,6 +175,8 @@ xzh
|
|
|
166
175
|
| 自动降级 | 若还有**尚未尝试过**的可用模型,切换到权重最高的那个并重试(单次请求内每个模型最多尝试一次,最多切换 3 次) |
|
|
167
176
|
| 不做空转 | 只有一个模型(或权重耗尽重置回它自己)时**不重试**,直接报错并附上当前模型信息 |
|
|
168
177
|
| 权重耗尽 | 当**所有模型权重都为 0** 时,在终端警告并把全部权重重置回 `10` |
|
|
178
|
+
| 配置错误不降权 | 密钥无效 / 无权限 / 模型名或端点不存在时**不扣权重、不写盘**,只提示检查配置 —— 配置不改就永远失败,扣权重只会把其他可用模型一起拖下水 |
|
|
179
|
+
| 上下文超限不降权 | 超出模型窗口时**收敛历史后自动重试**,也不扣权重(见上一节) |
|
|
169
180
|
|
|
170
181
|
```bash
|
|
171
182
|
xzh model # 交互式菜单
|
|
@@ -173,12 +184,36 @@ xzh model list # 查看已配置的模型与权重
|
|
|
173
184
|
xzh model all # 查看所有内置可用模型
|
|
174
185
|
xzh model add openai gpt-4o 20 # 新增(权重 20)
|
|
175
186
|
xzh model weight openai/gpt-4o 5 # 调整权重
|
|
187
|
+
xzh model context openai/gpt-4o 128k # 调整上下文窗口(留空则自动推断)
|
|
176
188
|
xzh model remove openai/gpt-4o # 删除(id / 模型名 / 序号均可)
|
|
177
189
|
xzh model reset # 全部恢复默认权重
|
|
178
190
|
```
|
|
179
191
|
|
|
180
192
|
当前使用的模型与权重会显示在界面顶部与状态栏(如 `gpt-4o w6`),降级切换时输出区会给出提示。
|
|
181
193
|
|
|
194
|
+
### 上下文窗口的作用
|
|
195
|
+
|
|
196
|
+
`contextWindow` 不只是记录信息 —— 它决定**每次请求能带多长的历史**:
|
|
197
|
+
|
|
198
|
+
- 玄猪按 `contextWindow × 80%` 得出输入预算(余量留给本次回复与估算误差),
|
|
199
|
+
再减去系统提示词的占用,剩下的额度给对话历史。
|
|
200
|
+
- 超出额度时采取**分层处理**:先压缩**老旧的大块工具输出**(保留头尾、砍掉中段),
|
|
201
|
+
压缩后仍放不下才从最老的消息整条丢弃。这样不会为了腾空间而丢掉「用户最初提的要求」,
|
|
202
|
+
却留着一条已经过期的 `ls` 结果。最近的对话始终优先保留;
|
|
203
|
+
若某条消息自身就超预算,则截断它的正文,而不是整条丢弃。
|
|
204
|
+
- 未配置该值时会按模型名自动推断(`xzh model all` 与 `xzh model list` 会显示推断结果)。
|
|
205
|
+
推断表只覆盖常见模型,小众或私有部署的模型名会退回保守的 32k ——
|
|
206
|
+
若你的模型窗口更大,请用 `xzh model context <id> <大小>` 显式指定,
|
|
207
|
+
否则历史会被裁得比必要得更短。
|
|
208
|
+
|
|
209
|
+
> 裁剪依据是**估算**的 token 数(中文约 1 字符/token,英文与代码约 3.5 字符/token),
|
|
210
|
+
> 不依赖 tokenizer,属保守近似。项目规则(`.xuanzhu/rules.md`)与 `systemPromptExtra`
|
|
211
|
+
> 会全文进入系统提示词,写得过长会挤占历史额度 —— 占去窗口一半以上时界面会给出提示。
|
|
212
|
+
|
|
213
|
+
若估算偏差导致仍然超限(服务端返回 `context_length_exceeded` 一类错误),玄猪会
|
|
214
|
+
**把预算收敛到一半再自动重试一次**,而不会把它当成模型故障去降权或切换模型 ——
|
|
215
|
+
换模型拿同样长的消息重发只会同样失败,还会白白扣掉权重。
|
|
216
|
+
|
|
182
217
|
### 意图分析(可选,默认关闭)
|
|
183
218
|
|
|
184
219
|
启用后,**每条消息都会先用模板包裹、向模型发起一次独立请求**,返回的分析结果再作为本次输入交给主流程。适合需求含糊时先让模型"猜准意图"。
|
|
@@ -386,7 +421,20 @@ description: 一句话说明该技能的用途与适用场景
|
|
|
386
421
|
kitty / Ghostty 会把该 xterm 兼容序列映射成「所有按键都用转义码上报」而破坏普通输入,
|
|
387
422
|
故玄猪对这两类终端不发送请求,请改用 `Ctrl+J` 或在终端侧自行配置。
|
|
388
423
|
|
|
389
|
-
界面内命令:`/help`、`/clear`、`/reset`、`/cwd`、`/switch <目录>`、`/term`、`/model`、`/auto [on|off]`、`/intent [on|off]`、`/exit`。
|
|
424
|
+
界面内命令:`/help`、`/clear`、`/copy [N|all]`、`/mouse`、`/reset`、`/cwd`、`/switch <目录>`、`/term`、`/model`、`/auto [on|off]`、`/intent [on|off]`、`/exit`。
|
|
425
|
+
|
|
426
|
+
### 选中与复制(重要)
|
|
427
|
+
|
|
428
|
+
玄猪为了支持滚轮滚动**捕获了鼠标**,这会禁用终端的原生拖拽选择,因此在界面里直接框选通常选不中。三种办法:
|
|
429
|
+
|
|
430
|
+
| 方式 | 说明 |
|
|
431
|
+
| --- | --- |
|
|
432
|
+
| **按住 Shift 拖拽** | 多数终端(VS Code、Windows Terminal、iTerm2、GNOME Terminal…)会用 Shift 绕过应用级鼠标捕获,**最省事** |
|
|
433
|
+
| `/mouse` | 关闭鼠标捕获,之后可用鼠标直接框选复制;代价是滚轮不再滚动。再执行一次恢复 |
|
|
434
|
+
| `/copy` | 让玄猪主动把输出区写入系统剪贴板(OSC 52,无需手动选择)。支持 `/copy 100`(最近 100 行)、`/copy 100-200`(按行号范围)、`/copy last`(最近一次对话,含提问)、`/copy all`(全部) |
|
|
435
|
+
|
|
436
|
+
> `/copy` 依赖终端支持 OSC 52。少数终端(如默认配置的 GNOME Terminal)出于安全会忽略该序列,
|
|
437
|
+
> 此时粘贴出来是空的,请改用 Shift 拖拽。
|
|
390
438
|
|
|
391
439
|
默认开启自动批准(`autoApprove: true`),所有工具——包括写文件与执行命令——都会直接执行、不再询问;
|
|
392
440
|
执行 `/auto off` 可切换为逐项确认,设置会持久保存到配置文件。
|
package/dist/cli.js
CHANGED
|
@@ -1,33 +1,39 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var
|
|
3
|
-
\u6D88\u606F\uFF1A${e}`}var
|
|
4
|
-
`,s=`${e}.${process.pid}.tmp`;
|
|
2
|
+
"use strict";var nn=Object.create;var St=Object.defineProperty;var sn=Object.getOwnPropertyDescriptor;var on=Object.getOwnPropertyNames;var an=Object.getPrototypeOf,ln=Object.prototype.hasOwnProperty;var cn=(n,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of on(e))!ln.call(n,i)&&i!==r&&St(n,i,{get:()=>e[i],enumerable:!(s=sn(e,i))||s.enumerable});return n};var x=(n,e,r)=>(r=n!=null?nn(an(n)):{},cn(e||!n||!n.__esModule?St(r,"default",{value:n,enumerable:!0}):r,n));var ge=x(require("fs")),Je=x(require("path"));var O=x(require("fs"));var R=x(require("fs")),$e=x(require("os")),W=x(require("path"));function j(){let n=process.env.XZH_HOME?.trim();return n?W.resolve(F(n)):W.join($e.homedir(),".xzh")}function un(){return!!process.env.XZH_HOME?.trim()}function dn(){return W.join($e.homedir(),".xuanzhu")}function E(){return W.join(j(),"config.json")}function Et(){return W.join(__dirname,"skills")}function kt(){return W.join(j(),"skills")}function _t(){if(un())return{migrated:!1};let n=dn(),e=j();if(W.resolve(n)===W.resolve(e))return{migrated:!1};try{if(R.existsSync(e)||!R.existsSync(n))return{migrated:!1}}catch{return{migrated:!1}}try{return R.renameSync(n,e),{migrated:!0,from:n,to:e}}catch{}let r=`${e}.migrating-${process.pid}`;try{R.rmSync(r,{recursive:!0,force:!0}),R.cpSync(n,r,{recursive:!0}),R.renameSync(r,e)}catch{try{R.rmSync(r,{recursive:!0,force:!0})}catch{}return{migrated:!1}}try{R.rmSync(n,{recursive:!0,force:!0})}catch{}return{migrated:!0,from:n,to:e}}function ye(n){R.existsSync(n)||R.mkdirSync(n,{recursive:!0})}function F(n){return n&&(n==="~"?$e.homedir():n.startsWith("~/")||n.startsWith("~\\")?W.join($e.homedir(),n.slice(2)):n)}var T=10,Ve="{{'\u7528\u6237\u53D1\u9001\u8FC7\u6765\u7684\u6D88\u606F'}}",Pt=`\u8BF7\u5206\u6790\u4E0B\u9762\u6D88\u606F\u7684\u610F\u56FE\uFF0C\u4EE5\u7B2C\u4E00\u4EBA\u79F0\u8F93\u51FA\u4E09\u6BB5\uFF1A\u3010\u6838\u5FC3\u610F\u56FE\u3011\u4E00\u53E5\u8BDD\u603B\u7ED3\uFF1B\u3010\u9700\u6C42\u62C6\u89E3\u3011\u9010\u6761\u5217\u51FA\u660E\u786E\u9700\u6C42\uFF1B\u3010\u9690\u6027\u610F\u56FE\u3011\u6F5C\u5728\u8BC9\u6C42\u3002\u4E0D\u8981\u589E\u52A0\u539F\u6587\u4E0D\u5B58\u5728\u4FE1\u606F\u3002 \u6D88\u606F\uFF1A ${Ve}`;function At(n,e){if(n.includes(Ve))return n.replace(Ve,()=>e);let r=/\{\{\s*[^{}]*\s*\}\}/;return r.test(n)?n.replace(r,()=>e):`${n}
|
|
3
|
+
\u6D88\u606F\uFF1A${e}`}var hn=1,q={version:hn,provider:"deepseek",model:"deepseek-chat",models:[],intent:{enabled:!1},providers:{},maxToolRounds:40,autoApprove:!0,temperature:.2};function L(){let n=E();try{if(!O.existsSync(n))return{...q,provider:"",model:"",models:[]};let e=O.readFileSync(n,"utf8"),r=JSON.parse(e);return mn(r)}catch(e){throw new Error(`\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25\uFF08${n}\uFF09\uFF1A${e instanceof Error?e.message:String(e)}`)}}function mn(n){let e=Array.isArray(n.models)?n.models.filter(r=>!!r&&typeof r.provider=="string"&&typeof r.model=="string").map(r=>({...r,id:r.id||se(r.provider,r.model),weight:typeof r.weight=="number"&&Number.isFinite(r.weight)?r.weight:T})):q.models;return{...q,...n,models:e,intent:{enabled:n.intent?.enabled===!0,...n.intent?.prompt?{prompt:n.intent.prompt}:{}},providers:{...q.providers,...n.providers??{}},maxToolRounds:n.maxToolRounds??q.maxToolRounds,autoApprove:n.autoApprove??q.autoApprove,temperature:n.temperature??q.temperature}}function k(n){ye(j());let e=E(),r=JSON.stringify(n,null,2)+`
|
|
4
|
+
`,s=`${e}.${process.pid}.tmp`;O.writeFileSync(s,r,{mode:384});try{O.chmodSync(s,384)}catch{}O.renameSync(s,e);try{O.chmodSync(e,384)}catch{}}function xe(){return O.existsSync(E())}function Mt(n){return n?n.length<=8?"****":`${n.slice(0,4)}...${n.slice(-4)}`:"(\u672A\u8BBE\u7F6E)"}function It(n){let e={};for(let[r,s]of Object.entries(n.providers))e[r]={...s,apiKey:Mt(s.apiKey)};return{version:n.version,provider:n.provider,model:n.model,models:S(n).map(r=>({id:r.id,weight:r.weight,...r.baseUrl?{baseUrl:r.baseUrl}:{},...r.apiKey?{apiKey:Mt(r.apiKey)}:{}})),intent:{enabled:n.intent?.enabled===!0,...n.intent?.prompt?{prompt:n.intent.prompt}:{}},temperature:n.temperature,maxToolRounds:n.maxToolRounds,autoApprove:n.autoApprove,systemPromptExtra:n.systemPromptExtra??"",providers:e}}function se(n,e){return`${n}/${e}`}function S(n){if(n.models&&n.models.length>0)return n.models.map(s=>({...s}));let e=n.provider,r=n.providers[e]?.model||n.model;return e&&r?[{id:se(e,r),provider:e,model:r,weight:T}]:[]}function pn(n){return S(n).filter(e=>e.weight>0).sort((e,r)=>r.weight-e.weight)}function Q(n,e){let r=new Set(e??[]);return pn(n).find(s=>!r.has(s.id))??null}function ee(n){return(!n.models||n.models.length===0)&&(n.models=S(n)),n.models}function Lt(n,e){let r=ee(n),s=r.find(a=>a.id===e);if(!s)return null;s.weight=Math.max(0,s.weight-1),s.decayed=!0;let i=s.weight,o=r.filter(a=>a.decayed===!0);if(o.length>0&&o.every(a=>a.weight<=0)){for(let a of o)a.weight=T,a.decayed=!1;return{id:e,weight:0,reset:!0}}return{id:e,weight:i,reset:!1}}function Te(n){for(let e of ee(n))e.weight=T,e.decayed=!1}function Rt(n){return typeof n=="number"&&Number.isFinite(n)&&n>0}function Ot(n,e){let r=ee(n),s=se(e.provider,e.model),i=typeof e.weight=="number"&&Number.isFinite(e.weight),o=r.find(l=>l.id===s);if(o)return i&&(o.weight=Math.max(0,Math.floor(e.weight)),o.decayed=!1),e.apiKey&&(o.apiKey=e.apiKey),e.baseUrl&&(o.baseUrl=e.baseUrl),Rt(e.contextWindow)&&(o.contextWindow=Math.floor(e.contextWindow)),o;let a={id:s,provider:e.provider,model:e.model,weight:i?Math.max(0,Math.floor(e.weight)):T,...e.apiKey?{apiKey:e.apiKey}:{},...e.baseUrl?{baseUrl:e.baseUrl}:{},...Rt(e.contextWindow)?{contextWindow:Math.floor(e.contextWindow)}:{}};return r.push(a),a}function Dt(n,e){let r=n.findIndex(o=>o.id===e);if(r>=0)return r;let s=n.findIndex(o=>o.model===e);if(s>=0)return s;let i=Number.parseInt(e,10);return!Number.isNaN(i)&&i>=1&&i<=n.length?i-1:-1}function Nt(n,e){let r=ee(n),s=Dt(r,e);if(s<0)return null;let[i]=r.splice(s,1);return i??null}function Kt(n,e,r){let s=ee(n),i=Dt(s,e);return i<0?null:(s[i].weight=Math.max(0,Math.floor(r)),s[i].decayed=!1,s[i])}var jt=x(require("@anthropic-ai/sdk"));var Bt=x(require("http")),Wt=x(require("https"));function Ft(n){let e=!/^http:\/\//i.test(n),r={keepAlive:!1};return e?new Wt.Agent(r):new Bt.Agent(r)}var Ut=new Set(["ECONNRESET","ECONNREFUSED","ECONNABORTED","ETIMEDOUT","EPIPE","ENOTFOUND","EAI_AGAIN","UND_ERR_SOCKET","UND_ERR_CONNECT_TIMEOUT","ERR_STREAM_PREMATURE_CLOSE"]),fn=["premature close","socket hang up","other side closed","fetch failed","network error","connection error","connection reset","terminated","timeout","timed out"];function gn(n){return n&&n.replace(/\b(Bearer|Basic|Token)\s+[A-Za-z0-9._~+/=-]{6,}/gi,"$1 ***").replace(/\b(sk|pk|rk|api|key|token)[-_][A-Za-z0-9._-]{6,}/gi,"$1-***").replace(/([?&](?:api[-_]?key|key|token|access_token|authorization)=)[^&\s"']+/gi,"$1***").replace(/("(?:api[-_]?key|apikey|token|secret|password|authorization)"\s*:\s*")[^"]*/gi,"$1***")}function _(n){return typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):""}function Se(n){if(typeof n=="number"&&Number.isFinite(n))return n;if(typeof n=="string"){let e=Number.parseInt(n,10);if(!Number.isNaN(e))return e}}function $n(n){let e=n,r=_(e?.message);if(r)return r;let s=e?.error,i=_(s?.message);if(i)return i;let o=e?.cause,a=_(o?.message);if(a)return a;if(n instanceof Error&&n.message)return n.message;try{let c=JSON.stringify(n);if(c&&c!=="{}")return c}catch{}let l=String(n);return l==="[object Object]"?"\u672A\u77E5\u9519\u8BEF\uFF08\u65E0\u6CD5\u89E3\u6790\u9519\u8BEF\u8BE6\u60C5\uFF09":l}function ie(n){let e=n,r=Se(e?.status);if(r!==void 0){if(r===408||r===409||r===429||r>=500&&r<=599)return!0;if(r>=400&&r<500)return!1}let s=_(e?.code).toUpperCase();if(s&&Ut.has(s))return!0;let i=e?.cause,o=_(i?.code).toUpperCase();if(o&&Ut.has(o))return!0;let a=(_(e?.message)||_(i?.message)||String(n)).toLowerCase();return fn.some(l=>a.includes(l))}function H(n){return gn(yn(n))}function Qe(n){let e=n,r=Se(e?.status);if(r===401||r===403||r===404)return!0;let s=(_(e?.message)||_(e?.error?.message)||_(e?.cause?.message)||String(n)).toLowerCase();return["invalid api key","incorrect api key","api key not valid","authentication","unauthorized","\u672A\u77E5 provider","unknown provider","model not found","unknown model","no such model","invalid base url","\u7F3A\u5C11 api key"].some(i=>s.includes(i))}function Ee(n){let e=n,r=Se(e?.status);if(r!==void 0&&(r<400||r>=500))return!1;let s=_(e?.code)||_(e?.error?.code);if(/context[_ ]?length|max[_ ]?tokens?_exceeded|token[_ ]?limit/i.test(s))return!0;let i=(_(e?.message)||_(e?.error?.message)||_(e?.cause?.message)||String(n)).toLowerCase();return["context length","context_length","maximum context","context window","prompt is too long","exceed context limit","exceeds the maximum number of tokens","reduce the length","too many tokens","too long"].some(o=>i.includes(o))}function yn(n){let e=n,r=$n(n),s=r.toLowerCase(),i=_(e?.code).toUpperCase(),o=Se(e?.status);if(Ee(n))return"\u4E0A\u4E0B\u6587\u8D85\u51FA\u6A21\u578B\u7A97\u53E3\uFF1A\u672C\u6B21\u8BF7\u6C42\u7684\u5185\u5BB9\u6BD4\u6A21\u578B\u80FD\u63A5\u53D7\u7684\u957F\u5EA6\u66F4\u957F\u3002\n\u7384\u732A\u5DF2\u81EA\u52A8\u6536\u655B\u5386\u53F2\u540E\u91CD\u8BD5\uFF1B\u82E5\u4ECD\u5931\u8D25\uFF0C\u53EF\u51CF\u5C11\u4E00\u6B21\u6027\u8BFB\u53D6\u7684\u5185\u5BB9\u91CF\uFF0C\u6216\u7528 `xzh model context <id> <\u5927\u5C0F>` \u8C03\u5927\u8BE5\u6A21\u578B\u7684\u4E0A\u4E0B\u6587\u7A97\u53E3\u3002";if(s.includes("premature close"))return`\u8FDE\u63A5\u88AB\u63D0\u524D\u5173\u95ED\uFF08Premature close\uFF09\uFF1A\u7F51\u7EDC\u6216\u4EE3\u7406\u4E2D\u65AD\u4E86\u54CD\u5E94\u6D41\u3002
|
|
5
5
|
\u7384\u732A\u5DF2\u81EA\u52A8\u91CD\u8BD5\uFF1B\u82E5\u4ECD\u9891\u7E41\u51FA\u73B0\uFF0C\u901A\u5E38\u662F\u4EE3\u7406/\u7F51\u7EDC\u4E0D\u7A33\u5B9A\u5BFC\u81F4\uFF0C\u53EF\u68C0\u67E5\u4EE3\u7406\u6216\u7A0D\u540E\u518D\u8BD5\u3002`;if(i==="ECONNRESET"||s.includes("socket hang up"))return"\u8FDE\u63A5\u88AB\u5BF9\u7AEF\u91CD\u7F6E\uFF08ECONNRESET\uFF09\uFF1A\u7F51\u7EDC\u6216\u4EE3\u7406\u4E2D\u65AD\u4E86\u8FDE\u63A5\uFF0C\u8BF7\u91CD\u8BD5\u3002";if(i==="ETIMEDOUT"||s.includes("timed out"))return"\u8BF7\u6C42\u8D85\u65F6\uFF1A\u7F51\u7EDC\u8F83\u6162\u6216\u6A21\u578B\u670D\u52A1\u672A\u54CD\u5E94\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002";if(i==="ENOTFOUND"||i==="EAI_AGAIN")return"\u65E0\u6CD5\u89E3\u6790\u670D\u52A1\u5730\u5740\uFF1A\u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\u4E0E\u4EE3\u7406\u8BBE\u7F6E\uFF08DNS \u53EF\u80FD\u88AB\u62E6\u622A\uFF09\u3002";if(i==="ECONNREFUSED")return"\u8FDE\u63A5\u88AB\u62D2\u7EDD\uFF1A\u76EE\u6807\u5730\u5740\u6216\u7AEF\u53E3\u4E0D\u53EF\u8FBE\uFF0C\u8BF7\u68C0\u67E5 baseUrl \u4E0E\u4EE3\u7406\u8BBE\u7F6E\u3002";if(o===401||s.includes("unauthorized")||s.includes("invalid api key")||s.includes("authentication"))return"\u8BA4\u8BC1\u5931\u8D25\uFF1AAPI Key \u65E0\u6548\u6216\u5DF2\u8FC7\u671F\uFF0C\u8BF7\u8FD0\u884C `xzh model` \u91CD\u65B0\u914D\u7F6E\u3002";if(o===403)return"\u8BBF\u95EE\u88AB\u62D2\u7EDD\uFF08403\uFF09\uFF1A\u8BF7\u68C0\u67E5 API Key \u6743\u9650\u6216\u670D\u52A1\u5546\u533A\u57DF\u9650\u5236\u3002";if(o===402||s.includes("insufficient")||s.includes("balance"))return"\u8D26\u6237\u989D\u5EA6\u4E0D\u8DB3\uFF1A\u8BF7\u68C0\u67E5\u670D\u52A1\u5546\u4F59\u989D\u6216\u914D\u989D\u3002";if(o===429||s.includes("rate limit"))return"\u8BF7\u6C42\u8FC7\u4E8E\u9891\u7E41\uFF08\u9650\u6D41\uFF09\uFF1A\u8BF7\u7A0D\u540E\u518D\u8BD5\u3002";if(/out\s*of\s*(device\s*)?memory|outofdevicememory|outofmemory|vk::|cuda.*error|hip.*error|cannot allocate|insufficient memory/i.test(r))return`${r}
|
|
6
6
|
\u4EE5\u4E0A\u662F\u6A21\u578B\u670D\u52A1\u7AEF\uFF08llama.cpp / LM Studio \u7B49\uFF09\u62A5\u51FA\u7684\u8D44\u6E90\u9519\u8BEF\uFF1A\u663E\u5B58\u6216\u5185\u5B58\u4E0D\u8DB3\uFF0C\u4E0E\u7384\u732A\u65E0\u5173\u3002
|
|
7
7
|
\u53EF\u5C1D\u8BD5\uFF1A\u51CF\u5C0F\u4E0A\u4E0B\u6587\u957F\u5EA6\uFF08llama.cpp \u7684 -c\uFF0C\u4F8B\u5982 -c 8192\uFF09\u3001\u964D\u4F4E KV cache \u7CBE\u5EA6
|
|
8
8
|
\uFF08--cache-type-k q8_0 --cache-type-v q8_0\uFF09\u3001\u51CF\u5C11 GPU \u5378\u8F7D\u5C42\u6570\uFF08-ngl\uFF09\u3001
|
|
9
9
|
\u6362\u66F4\u5C0F\u7684\u6A21\u578B / \u91CF\u5316\uFF0C\u6216\u5148\u91CA\u653E\u88AB\u5176\u4ED6\u8FDB\u7A0B\u5360\u7528\u7684\u663E\u5B58\u3002
|
|
10
|
-
\u4FEE\u597D\u670D\u52A1\u7AEF\u540E\u53EF\u7528 \`xzh model reset\` \u628A\u88AB\u964D\u6389\u7684\u6743\u91CD\u6062\u590D\u4E3A\u9ED8\u8BA4\u503C\u3002`;if(typeof o=="number"&&o>=500)return`\u6A21\u578B\u670D\u52A1\u7AEF\u9519\u8BEF\uFF08HTTP ${o}\uFF09\uFF1A\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002`;if(o===400){let a=r.replace(/^4\d\d\s*/,""),l=/model/i.test(a)?"\n\u63D0\u793A\uFF1A\u591A\u534A\u662F\u6A21\u578B\u540D\u4E0D\u88AB\u8BE5\u7AEF\u70B9\u652F\u6301\u3002\u53EF\u7528 `curl <baseUrl>/models` \u67E5\u770B\u7AEF\u70B9\u652F\u6301\u7684\u6A21\u578B id\uFF0C\u518D\u7528 `xzh model weight <id> 10` \u540E\u7684 `xzh model` \u66F4\u6B63\u6A21\u578B\u540D\u3002":"";return`\u8BF7\u6C42\u88AB\u62D2\u7EDD\uFF08HTTP 400\uFF09\uFF1A${a}${l}`}return s.includes("fetch failed")||s.includes("network")?`\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25\uFF1A${r}`:r}function
|
|
10
|
+
\u4FEE\u597D\u670D\u52A1\u7AEF\u540E\u53EF\u7528 \`xzh model reset\` \u628A\u88AB\u964D\u6389\u7684\u6743\u91CD\u6062\u590D\u4E3A\u9ED8\u8BA4\u503C\u3002`;if(typeof o=="number"&&o>=500)return`\u6A21\u578B\u670D\u52A1\u7AEF\u9519\u8BEF\uFF08HTTP ${o}\uFF09\uFF1A\u670D\u52A1\u6682\u65F6\u4E0D\u53EF\u7528\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5\u3002`;if(o===400){let a=r.replace(/^4\d\d\s*/,""),l=/model/i.test(a)?"\n\u63D0\u793A\uFF1A\u591A\u534A\u662F\u6A21\u578B\u540D\u4E0D\u88AB\u8BE5\u7AEF\u70B9\u652F\u6301\u3002\u53EF\u7528 `curl <baseUrl>/models` \u67E5\u770B\u7AEF\u70B9\u652F\u6301\u7684\u6A21\u578B id\uFF0C\u518D\u7528 `xzh model weight <id> 10` \u540E\u7684 `xzh model` \u66F4\u6B63\u6A21\u578B\u540D\u3002":"";return`\u8BF7\u6C42\u88AB\u62D2\u7EDD\uFF08HTTP 400\uFF09\uFF1A${a}${l}`}return s.includes("fetch failed")||s.includes("network")?`\u7F51\u7EDC\u8BF7\u6C42\u5931\u8D25\uFF1A${r}`:r}function le(n){return new Promise(e=>setTimeout(e,n))}var et=3,ke=class{id;model;client;maxTokens;constructor(e){this.id=e.id,this.model=e.model,this.maxTokens=e.maxTokens??8192,this.client=new jt.default({apiKey:e.apiKey,baseURL:e.baseUrl,maxRetries:0})}async*chat(e){let r;for(let s=1;s<=et;s++){let i=!1;try{yield*this.streamOnce(e,()=>{i=!0});return}catch(o){if(r=o,i||e.signal?.aborted||s>=et||!ie(o))throw o;e.onRetry?.(s,et,o instanceof Error?o:new Error(String(o))),await le(s*600)}}throw r}async*streamOnce(e,r){let{system:s,messages:i}=xn(e.messages),o=e.tools.length>0?e.tools.map(h=>({name:h.name,description:h.description,input_schema:h.parameters})):void 0,a=await this.client.messages.create({model:this.model,max_tokens:this.maxTokens,system:s||void 0,messages:i,tools:o,temperature:e.temperature,stream:!0},{signal:e.signal}),l=new Map,c,u,d=!1;for await(let h of a)switch(h.type){case"message_start":{let m=h.message?.usage?.input_tokens;typeof m=="number"&&(c={inputTokens:m});break}case"content_block_start":{let m=h.content_block;m.type==="tool_use"&&(d=!0,l.set(h.index,{id:m.id,name:m.name,json:""}));break}case"content_block_delta":{let m=h.delta;if(m.type==="text_delta"&&m.text)r(),yield{type:"text",text:m.text};else if(m.type==="input_json_delta"){let p=l.get(h.index);p&&(p.json+=m.partial_json??"")}else if(m.type==="thinking_delta"){let p=m.thinking;p&&(r(),yield{type:"reasoning",text:p})}break}case"message_delta":{h.delta?.stop_reason&&(u=h.delta.stop_reason);let m=h.usage?.output_tokens;typeof m=="number"&&(c={...c??{},outputTokens:m});break}default:break}for(let h of l.values())h.name&&(r(),yield{type:"tool_call",toolCall:{id:h.id,name:h.name,arguments:h.json||"{}"}});d&&r(),yield{type:"done",finishReason:d?"tool_calls":u,usage:c}}};function xn(n){let e=[],r=[];for(let s of n){if(s.role==="system"){e.push(s.content);continue}if(s.role==="user"){r.push({role:"user",content:s.content});continue}if(s.role==="assistant"){if(s.toolCalls&&s.toolCalls.length>0){let i=[];s.content&&i.push({type:"text",text:s.content});for(let o of s.toolCalls)i.push({type:"tool_use",id:o.id,name:o.name,input:wn(o.arguments)});r.push({role:"assistant",content:i})}else r.push({role:"assistant",content:s.content});continue}if(s.role==="tool"){let i={type:"tool_result",tool_use_id:s.toolCallId??"",content:s.content},o=r[r.length-1];o&&o.role==="user"&&Array.isArray(o.content)&&o.content.every(a=>a.type==="tool_result")?o.content.push(i):r.push({role:"user",content:[i]})}}return{system:e.join(`
|
|
11
11
|
|
|
12
|
-
`),messages:
|
|
12
|
+
`),messages:bn(r)}}function zt(n){return typeof n=="string"?[{type:"text",text:n}]:n}function bn(n){let e=[];for(let r of n){let s=e[e.length-1];if(s&&s.role===r.role){r.role==="user"?e[e.length-1]={role:"user",content:[...zt(s.content),...zt(r.content)]}:e[e.length-1]=r;continue}e.push(r)}for(;e.length>0&&e[0].role!=="user";)e.shift();return e}function wn(n){try{let e=JSON.parse(n||"{}");return typeof e=="object"&&e!==null?e:{}}catch{return{}}}var G=require("@google/generative-ai");var tt=3,_e=class{id;model;apiKey;baseUrl;constructor(e){this.id=e.id,this.model=e.model,this.apiKey=e.apiKey,this.baseUrl=e.baseUrl}async*chat(e){let r;for(let s=1;s<=tt;s++){let i=!1;try{yield*this.streamOnce(e,()=>{i=!0});return}catch(o){if(r=o,i||e.signal?.aborted||s>=tt||!ie(o))throw o;e.onRetry?.(s,tt,o instanceof Error?o:new Error(String(o))),await le(s*600)}}throw r}async*streamOnce(e,r){let s=new G.GoogleGenerativeAI(this.apiKey),{system:i,contents:o}=Tn(e.messages),a=e.tools.length>0?[{functionDeclarations:e.tools.map(En)}]:void 0,c=await s.getGenerativeModel({model:this.model,systemInstruction:i||void 0,tools:a,generationConfig:{temperature:e.temperature}},{...this.baseUrl?{baseUrl:this.baseUrl}:{},...e.signal?{signal:e.signal}:{}}).generateContentStream({contents:o}),u,d=!1,h=0;for await(let m of c.stream){if(e.signal?.aborted)break;let p=vn(m);p&&(r(),yield{type:"text",text:p});let f=Cn(m);for(let g of f)d=!0,r(),yield{type:"tool_call",toolCall:{id:`gemini_call_${Date.now()}_${h++}`,name:g.name,arguments:JSON.stringify(g.args??{})}};let $=m.usageMetadata;$&&(u={inputTokens:$.promptTokenCount,outputTokens:$.candidatesTokenCount})}d&&r(),yield{type:"done",finishReason:d?"tool_calls":"stop",usage:u}}};function vn(n){try{return n.text()??""}catch{return""}}function Cn(n){try{return n.functionCalls?.()??[]}catch{return[]}}function Tn(n){let e=[],r=[];for(let s of n){if(s.role==="system"){e.push(s.content);continue}if(s.role==="user"){r.push({role:"user",parts:[{text:s.content}]});continue}if(s.role==="assistant"){let i=[];s.content&&i.push({text:s.content});for(let o of s.toolCalls??[])i.push({functionCall:{name:o.name,args:_n(o.arguments)}});i.length>0&&r.push({role:"model",parts:i});continue}if(s.role==="tool"){let i={functionResponse:{name:s.name??"unknown",response:{result:s.content}}},o=r[r.length-1];o&&o.role==="user"&&o.parts?.some(a=>"functionResponse"in a)?o.parts.push(i):r.push({role:"user",parts:[i]})}}return{system:e.join(`
|
|
13
13
|
|
|
14
|
-
`),contents:
|
|
14
|
+
`),contents:Sn(r)}}function Sn(n){let e=[];for(let r of n){let s=e[e.length-1];if(s&&s.role===r.role){s.parts=[...s.parts??[],...r.parts??[]];continue}e.push({role:r.role,parts:[...r.parts??[]]})}for(;e.length>0&&e[0].role!=="user";)e.shift();return e}function En(n){return{name:n.name,description:n.description,parameters:rt(n.parameters)}}function rt(n){let e={type:kn(n.type)};if(n.description&&(e.description=n.description),n.enum&&(e.enum=n.enum),n.required&&(e.required=n.required),n.items&&(e.items=rt(n.items)),n.properties){let r={};for(let[s,i]of Object.entries(n.properties))r[s]=rt(i);e.properties=r}return e}function kn(n){switch(n.toLowerCase()){case"string":return G.SchemaType.STRING;case"number":return G.SchemaType.NUMBER;case"integer":return G.SchemaType.INTEGER;case"boolean":return G.SchemaType.BOOLEAN;case"array":return G.SchemaType.ARRAY;default:return G.SchemaType.OBJECT}}function _n(n){try{let e=JSON.parse(n||"{}");return typeof e=="object"&&e!==null?e:{}}catch{return{}}}var qt=x(require("openai"));var nt=3,Me=class{id;model;client;constructor(e){this.id=e.id,this.model=e.model;let r=e.baseUrl||"https://api.openai.com/v1";this.client=new qt.default({apiKey:e.apiKey||"not-needed",baseURL:e.baseUrl,httpAgent:Ft(r),maxRetries:0})}async*chat(e){let r;for(let s=1;s<=nt;s++){let i=!1;try{yield*this.streamOnce(e,()=>{i=!0});return}catch(o){if(r=o,i||e.signal?.aborted||s>=nt||!ie(o))throw o;e.onRetry?.(s,nt,o instanceof Error?o:new Error(String(o))),await le(s*600)}}throw r}async*streamOnce(e,r){let s=e.messages.map(Mn),i=e.tools.length>0?e.tools.map(Rn):void 0,o=await this.client.chat.completions.create({model:this.model,messages:s,tools:i,temperature:e.temperature,stream:!0},{signal:e.signal}),a=new Map,l,c,u=!1;for await(let d of o){d.usage&&(c={inputTokens:d.usage.prompt_tokens,outputTokens:d.usage.completion_tokens});let h=d.choices?.[0];if(!h)continue;let m=h.delta;if(m){let p=m.content;typeof p=="string"&&p.length>0&&(r(),yield{type:"text",text:p});let f=m.reasoning_content;typeof f=="string"&&f.length>0&&(r(),yield{type:"reasoning",text:f});let $=m.tool_calls;if($){u=!0;for(let g of $){let M=g.index??0,y=a.get(M)??{id:"",name:"",args:""};g.id&&(y.id=g.id),g.function?.name&&(y.name+=g.function.name),g.function?.arguments&&(y.args+=g.function.arguments),a.set(M,y)}}}h.finish_reason&&(l=h.finish_reason)}for(let[d,h]of a){if(!h.name)continue;let m={id:h.id||`call_${Date.now()}_${d}`,name:h.name,arguments:h.args||"{}"};r(),yield{type:"tool_call",toolCall:m}}u&&r(),yield{type:"done",finishReason:u?"tool_calls":l,usage:c}}};function Mn(n){switch(n.role){case"system":return{role:"system",content:n.content};case"user":return{role:"user",content:n.content};case"assistant":return n.toolCalls&&n.toolCalls.length>0?{role:"assistant",content:n.content||null,tool_calls:n.toolCalls.map(e=>({id:e.id,type:"function",function:{name:e.name,arguments:e.arguments}}))}:{role:"assistant",content:n.content};case"tool":return{role:"tool",content:n.content,tool_call_id:n.toolCallId??""};default:return{role:"user",content:n.content}}}function Rn(n){return{type:"function",function:{name:n.name,description:n.description,parameters:n.parameters}}}function te(n){if(!n)return 0;let e=0,r=0;for(let s of n)s.codePointAt(0)<128?e++:r++;return Math.ceil(e/3.5)+r}function Re(n){let e=4+te(n.content??"");if(n.toolCalls)for(let r of n.toolCalls)e+=10+te(r.name)+te(r.arguments);return e}function it(n,e){if(e<=0)return"";let r=0,s=0,i=0;for(let o of n){let a=o.codePointAt(0)<128,l=r+(a?1:0),c=s+(a?0:1);if(Math.ceil(l/3.5)+c>e)break;r=l,s=c,i+=o.length}return n.slice(0,i)}function Pn(n,e){let r=Re({...n,content:""}),s=30;if(r+s>=e)return null;let i=n.content??"",o=e-r-s;if(te(i)<=o)return n;let a=it(i,o),l=i.length-a.length;return{...n,content:`${a}
|
|
15
|
+
|
|
16
|
+
\u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD ${l} \u5B57\u7B26\u4EE5\u9002\u914D\u6A21\u578B\u4E0A\u4E0B\u6587\u7A97\u53E3\uFF09`}}function Ht(n){if(n.length<=6)return n;let e=n.length-6;return n.map((r,s)=>{if(s>=e||r.role!=="tool")return r;let i=r.content??"";if(te(i)<=600)return r;let o=Math.floor(600*.6),a=600-o,l=it(i,o),c=Math.min(i.length-l.length,Math.max(0,a)*3),u=c>0?i.slice(-c):"",d=i.length-l.length-u.length;return{...r,content:`${l}
|
|
17
|
+
|
|
18
|
+
\u2026\uFF08\u6B64\u5904\u7701\u7565 ${d} \u5B57\u7B26\u7684\u4E2D\u95F4\u5185\u5BB9\uFF09
|
|
19
|
+
|
|
20
|
+
${u}`}})}function Pe(n,e){let r=Ht(n),s=r.length,i=0;for(let a=r.length-1;a>=0;a--){let l=Re(r[a]);if(s<r.length&&i+l>e)break;i+=l,s=a}let o=r.slice(s);for(;o.length>0&&o[0].role==="tool";)o.shift();if(o.length===0){for(let a=n.length-1;a>=0;a--)if(n[a].role==="user"){o=[n[a]];break}}if(o.length===1&&Re(o[0])>e){let l=Pn(o[0],e);if(l===null)return[];o[0]=l}return o}function ot(n,e,r){let s=Gt(n,e),i=te(r)+4,o=s-i;return Math.max(1,Math.min(Math.max(o,1e3),s))}function Gt(n,e){let r=n&&n>0?n:ce(e);return Math.floor(r*.8)}function at(n,e,r){let s=Gt(n,e);return te(r)+4>=s*.5}var st={"gpt-4o":128e3,"gpt-4o-mini":128e3,"gpt-4-turbo":128e3,"gpt-4.1":1e6,"gpt-4":8192,"gpt-3.5-turbo":16385,o1:2e5,"o1-mini":128e3,"o3-mini":2e5,"claude-sonnet-4-5":2e5,"claude-opus-4-1":2e5,"claude-3-5-haiku-latest":2e5,"claude-3-5-sonnet-latest":2e5,"deepseek-chat":64e3,"deepseek-reasoner":64e3,"gemini-2.0-flash":1e6,"gemini-2.5-pro":1e6,"gemini-2.5-flash":1e6,"glm-4-plus":128e3,"glm-4-air":128e3,"glm-4-flash":128e3,"qwen-max":32e3,"qwen-plus":128e3,"qwen2.5-coder-32b-instruct":32e3,"llama-3.3-70b-versatile":128e3,"qwen2.5-coder":32e3,"llama3.1":128e3,"deepseek-coder-v2":128e3},An=[[/claude/i,2e5],[/gemini/i,1e6],[/deepseek/i,64e3],[/gpt-4\.1|gpt-4o|gpt-4-turbo/i,128e3],[/\bo[13]\b/i,128e3],[/gpt-4\b/i,8192],[/gpt-3\.5/i,16385],[/qwen|glm|yi-|moonshot|kimi/i,128e3],[/llama|mistral|mixtral|gemma|phi-|command-r/i,128e3]];function ce(n){let e=n.trim();if(!e)return 32e3;let r=e.toLowerCase(),s=st[r];if(s)return s;let i=r.replace(/[-_]?(latest|preview|stable|beta|exp)$/,"").replace(/[-_]\d{6,8}$/,"").replace(/[:@].*$/,""),o=st[i]??Object.entries(st).find(([a])=>i.startsWith(a)||i===a)?.[1];if(o)return o;for(let[a,l]of An)if(a.test(i))return l;return 32e3}function re(n){if(!Number.isFinite(n)||n<=0)return"\u672A\u8BBE\u7F6E";if(n>=1e6){let e=n/1e6;return`${Number.isInteger(e)?e:e.toFixed(1)}M`}if(n>=1e3){let e=n/1e3;return`${Number.isInteger(e)?e:e.toFixed(1)}k`}return String(n)}var X=[{id:"deepseek",label:"DeepSeek \u6DF1\u5EA6\u6C42\u7D22",kind:"openai",defaultBaseUrl:"https://api.deepseek.com/v1",defaultModel:"deepseek-chat",models:["deepseek-chat","deepseek-reasoner"],requiresApiKey:!0,envKey:"DEEPSEEK_API_KEY",apiKeyHint:"sk-..."},{id:"anthropic",label:"Anthropic Claude",kind:"anthropic",defaultModel:"claude-sonnet-4-5",models:["claude-sonnet-4-5","claude-opus-4-1","claude-3-5-haiku-latest"],requiresApiKey:!0,envKey:"ANTHROPIC_API_KEY",apiKeyHint:"sk-ant-..."},{id:"openai",label:"OpenAI",kind:"openai",defaultBaseUrl:"https://api.openai.com/v1",defaultModel:"gpt-4o",models:["gpt-4o","gpt-4o-mini","o4-mini"],requiresApiKey:!0,envKey:"OPENAI_API_KEY",apiKeyHint:"sk-..."},{id:"gemini",label:"Google Gemini",kind:"gemini",defaultModel:"gemini-2.0-flash",models:["gemini-2.0-flash","gemini-2.5-pro","gemini-2.5-flash"],requiresApiKey:!0,envKey:"GEMINI_API_KEY",apiKeyHint:"AIza..."},{id:"glm",label:"\u667A\u8C31 GLM",kind:"openai",defaultBaseUrl:"https://open.bigmodel.cn/api/paas/v4",defaultModel:"glm-4-plus",models:["glm-4-plus","glm-4-air","glm-4-flash"],requiresApiKey:!0,envKey:"GLM_API_KEY"},{id:"qwen",label:"\u901A\u4E49\u5343\u95EE Qwen",kind:"openai",defaultBaseUrl:"https://dashscope.aliyuncs.com/compatible-mode/v1",defaultModel:"qwen-max",models:["qwen-max","qwen-plus","qwen2.5-coder-32b-instruct"],requiresApiKey:!0,envKey:"DASHSCOPE_API_KEY"},{id:"groq",label:"Groq",kind:"openai",defaultBaseUrl:"https://api.groq.com/openai/v1",defaultModel:"llama-3.3-70b-versatile",models:["llama-3.3-70b-versatile","qwen-2.5-coder-32b"],requiresApiKey:!0,envKey:"GROQ_API_KEY",apiKeyHint:"gsk_..."},{id:"ollama",label:"Ollama\uFF08\u672C\u5730\uFF09",kind:"openai",defaultBaseUrl:"http://localhost:11434/v1",defaultModel:"qwen2.5-coder",models:["qwen2.5-coder","llama3.1","deepseek-coder-v2"],requiresApiKey:!1,envKey:"OLLAMA_API_KEY"},{id:"custom",label:"\u81EA\u5B9A\u4E49\uFF08OpenAI \u517C\u5BB9\u7AEF\u70B9\uFF09",kind:"openai",defaultModel:"",models:[],requiresApiKey:!1,requiresBaseUrl:!0,envKey:"XUANZHU_API_KEY"}];function Z(n){return X.find(e=>e.id===n)}function Ae(n,e){return e||(n.envKey?process.env[n.envKey]??"":"")}function Zt(n,e){return e||n.defaultBaseUrl}function lt(n,e){let r=[],s=Z(e.provider);if(!s)return[`\u6A21\u578B ${e.id} \u4F7F\u7528\u4E86\u672A\u77E5 provider\uFF1A${e.provider}`];let i=n.providers[e.provider]??{};return s.requiresApiKey&&!Ae(s,e.apiKey??i.apiKey)&&r.push(`\u6A21\u578B ${e.id} \u7F3A\u5C11 API Key\uFF0C\u8BF7\u8FD0\u884C \`xzh model\` \u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF ${s.envKey}`),s.requiresBaseUrl&&!Zt(s,e.baseUrl??i.baseUrl)&&r.push(`\u6A21\u578B ${e.id} \u9700\u8981\u914D\u7F6E baseUrl`),e.model||r.push(`\u6A21\u578B ${e.id} \u672A\u6307\u5B9A\u6A21\u578B\u540D`),r}function Yt(n){let e=S(n);return e.length===0?["\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\uFF0C\u8BF7\u8FD0\u884C `xzh model add` \u6DFB\u52A0"]:e.flatMap(r=>lt(n,r))}function Ie(n,e){let r=e?.provider??n.provider,s=Z(r);if(!s)throw new Error(`\u672A\u77E5\u7684 provider\uFF1A${r}`);let i=n.providers[r]??{},o=Ae(s,e?.apiKey??i.apiKey),a=Zt(s,e?.baseUrl??i.baseUrl),l=e?.model||i.model||n.model||s.defaultModel;if(s.requiresBaseUrl&&!a)throw new Error(`provider "${s.label}" \u9700\u8981\u914D\u7F6E API \u7AEF\u70B9 baseUrl\u3002\u8FD0\u884C \`xzh model\` \u8865\u9F50\u540E\u518D\u8BD5\u3002`);if(s.requiresApiKey&&!o)throw new Error(`provider "${s.label}" \u7F3A\u5C11 API Key\u3002\u8FD0\u884C \`xzh model\` \u8FDB\u884C\u914D\u7F6E\uFF0C\u6216\u8BBE\u7F6E\u73AF\u5883\u53D8\u91CF ${s.envKey}\u3002`);if(!l)throw new Error(`provider "${s.label}" \u672A\u6307\u5B9A\u6A21\u578B\u3002\u8FD0\u884C \`xzh model\` \u9009\u62E9\u6A21\u578B\u3002`);switch(s.kind){case"anthropic":return new ke({id:s.id,apiKey:o,baseUrl:a,model:l});case"gemini":return new _e({id:s.id,apiKey:o,baseUrl:a,model:l});case"openai":default:return new Me({id:s.id,apiKey:o,baseUrl:a,model:l})}}var fe=x(require("fs")),Xe=x(require("path"));var Jt=require("child_process"),Le=x(require("path"));var ct=3e4,In=12e4,Ln=6e5,On=1500;function Dn(n,e,r,s){return new Promise(i=>{if(s?.aborted){i({stdout:"",stderr:"\u547D\u4EE4\u5DF2\u88AB\u4E2D\u65AD\uFF08\u5728\u6267\u884C\u524D\uFF09\u3002",code:null,timedOut:!1,aborted:!0});return}let o=process.platform==="win32",a=o?"cmd.exe":process.env.SHELL||"bash",c=(0,Jt.spawn)(a,o?["/d","/s","/c",n]:["-lc",n],{cwd:e,env:process.env,windowsHide:!0,detached:!o}),u="",d="",h=!1,m=!1,p=!1,f,$=v=>{let B=c.pid;if(B!==void 0)try{process.kill(-B,v)}catch{try{c.kill(v)}catch{}}},g=v=>{p||(p=!0,clearTimeout(I),f&&clearTimeout(f),s?.removeEventListener("abort",y),i({stdout:u,stderr:d,code:v,timedOut:h,aborted:m}))},M=()=>{f&&clearTimeout(f),f=setTimeout(()=>g(null),On)},y=()=>{m=!0,$("SIGKILL"),M()},I=setTimeout(()=>{h=!0,$("SIGKILL"),M()},r);s?.addEventListener("abort",y,{once:!0}),c.stdout?.on("data",v=>{u.length<ct&&(u+=v.toString())}),c.stderr?.on("data",v=>{d.length<ct&&(d+=v.toString())}),c.on("error",v=>{d+=String(v),g(-1)}),c.on("exit",v=>{f&&clearTimeout(f),f=setTimeout(()=>g(v),120)}),c.on("close",v=>g(v))})}var Vt={name:"bash",description:"\u5728\u7EC8\u7AEF\u4E2D\u6267\u884C shell \u547D\u4EE4\u5E76\u8FD4\u56DE\u8F93\u51FA\u3002\u9002\u7528\u4E8E\u8FD0\u884C\u6D4B\u8BD5\u3001\u6784\u5EFA\u3001\u5B89\u88C5\u4F9D\u8D56\u3001git \u64CD\u4F5C\u7B49\u3002\u547D\u4EE4\u5728\u975E\u4EA4\u4E92\u5F0F shell \u4E2D\u6267\u884C\uFF0C\u957F\u65F6\u95F4\u8FD0\u884C\u7684\u547D\u4EE4\u8BF7\u8BBE\u7F6E timeout\u3002",requiresConfirmation:!0,danger:!0,parameters:{type:"object",properties:{command:{type:"string",description:"\u8981\u6267\u884C\u7684 shell \u547D\u4EE4"},timeout:{type:"integer",description:"\u8D85\u65F6\u65F6\u95F4\uFF08\u6BEB\u79D2\uFF0C\u9ED8\u8BA4 120000\uFF0C\u6700\u5927 600000\uFF09"},cwd:{type:"string",description:"\u547D\u4EE4\u6267\u884C\u76EE\u5F55\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\uFF09"}},required:["command"]},async execute(n,e){let r=typeof n.command=="string"?n.command:"";if(!r.trim())return{ok:!1,content:"\u9519\u8BEF\uFF1Acommand \u4E0D\u80FD\u4E3A\u7A7A"};let s=e.cwd;if(typeof n.cwd=="string"&&n.cwd){let u=F(n.cwd);s=Le.isAbsolute(u)?u:Le.resolve(e.cwd,u)}let i=typeof n.timeout=="number"?n.timeout:In,o=Math.min(Math.max(1e3,i),Ln),a=await Dn(r,s,o,e.signal),l=[];a.stdout.trim()&&l.push(a.stdout.trimEnd()),a.stderr.trim()&&l.push(`[stderr]
|
|
15
21
|
${a.stderr.trimEnd()}`),a.aborted&&l.push("[\u4E2D\u65AD] \u547D\u4EE4\u5DF2\u88AB\u7528\u6237\u4E2D\u65AD\uFF0C\u5176\u8FDB\u7A0B\u7EC4\u5DF2\u7EC8\u6B62\u3002"),a.timedOut&&l.push(`[\u8B66\u544A] \u547D\u4EE4\u5728 ${o}ms \u540E\u8D85\u65F6\u5E76\u88AB\u7EC8\u6B62\u3002`),l.push(`[\u9000\u51FA\u7801] ${a.code??"\u672A\u77E5"}`);let c=l.join(`
|
|
16
22
|
|
|
17
|
-
`);return{ok:a.code===0&&!a.timedOut&&!a.aborted,content:c.slice(0,
|
|
18
|
-
`).map(r=>r.trim()).filter(r=>r&&!r.startsWith("#")&&!r.startsWith("!")):[]}catch{return[]}}function
|
|
19
|
-
`),a=Math.max(1,
|
|
23
|
+
`);return{ok:a.code===0&&!a.timedOut&&!a.aborted,content:c.slice(0,ct),summary:a.aborted?"\u5DF2\u4E2D\u65AD":a.timedOut?"\u8D85\u65F6":a.code===0?"\u6267\u884C\u6210\u529F":`\u9000\u51FA\u7801 ${a.code}`}}};var b=x(require("fs")),C=x(require("path"));var Qt=2e3,Nn=2*1024*1024,ut=200,Oe=200,Kn=1024*1024,er=2e3;function Un(n){return/\((?:[^()\\]|\\.)*[+*](?:[^()\\]|\\.)*\)\s*[+*{]/.test(n)}var nr=new Set([".git","node_modules","dist","build","out",".next",".nuxt",".cache","coverage",".venv","venv","__pycache__",".idea",".vscode-test"]);function Bn(n){try{let e=C.join(n,".gitignore");return b.existsSync(e)?b.readFileSync(e,"utf8").split(`
|
|
24
|
+
`).map(r=>r.trim()).filter(r=>r&&!r.startsWith("#")&&!r.startsWith("!")):[]}catch{return[]}}function Wn(n,e){let r=n.split(C.sep).join("/"),s=C.basename(r);for(let i of e){let o=i.replace(/^\//,"").replace(/\/$/,"");if(o){if(o.includes("*")){try{if(De(o).test(r)||De(o).test(s))return!0}catch{}continue}if(r===o||r.startsWith(`${o}/`)||s===o)return!0}}return!1}function ue(n,e){let r=F(n);return C.isAbsolute(r)?r:C.resolve(e,r)}function D(n,e=""){return typeof n=="string"?n:e}function tr(n,e){return typeof n=="number"&&Number.isFinite(n)?n:e}function sr(n){return n.subarray(0,8e3).includes(0)}var ir={name:"read_file",description:"\u8BFB\u53D6\u6587\u672C\u6587\u4EF6\u5185\u5BB9\uFF0C\u8FD4\u56DE\u5E26\u884C\u53F7\u7684\u6587\u672C\u3002\u652F\u6301\u901A\u8FC7 offset/limit \u8BFB\u53D6\u6307\u5B9A\u884C\u8303\u56F4\u3002\u5728\u4FEE\u6539\u6587\u4EF6\u524D\u5E94\u5148\u8BFB\u53D6\u786E\u8BA4\u5185\u5BB9\u3002",parameters:{type:"object",properties:{path:{type:"string",description:"\u6587\u4EF6\u8DEF\u5F84\uFF08\u7EDD\u5BF9\u6216\u76F8\u5BF9\u5F53\u524D\u76EE\u5F55\uFF09"},offset:{type:"integer",description:"\u8D77\u59CB\u884C\u53F7\uFF08\u4ECE 1 \u5F00\u59CB\uFF0C\u53EF\u9009\uFF09"},limit:{type:"integer",description:`\u6700\u591A\u8BFB\u53D6\u7684\u884C\u6570\uFF08\u9ED8\u8BA4 ${Qt}\uFF09`}},required:["path"]},async execute(n,e){let r=ue(D(n.path),e.cwd);if(!b.existsSync(r))return{ok:!1,content:`\u9519\u8BEF\uFF1A\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${r}`};let s=b.statSync(r);if(s.isDirectory())return{ok:!1,content:`\u9519\u8BEF\uFF1A${r} \u662F\u4E00\u4E2A\u76EE\u5F55\uFF0C\u8BF7\u4F7F\u7528 list_dir`};if(!s.isFile())return{ok:!1,content:`\u9519\u8BEF\uFF1A${r} \u4E0D\u662F\u666E\u901A\u6587\u4EF6\uFF08\u8BBE\u5907\u6587\u4EF6 / \u7BA1\u9053 / socket\uFF09\uFF0C\u62D2\u7EDD\u8BFB\u53D6`};if(s.size>Nn)return{ok:!1,content:`\u9519\u8BEF\uFF1A\u6587\u4EF6\u8FC7\u5927\uFF08${(s.size/1024/1024).toFixed(1)}MB\uFF09\uFF0C\u8D85\u51FA 2MB \u9650\u5236`};let i=b.readFileSync(r);if(sr(i))return{ok:!1,content:`\u9519\u8BEF\uFF1A${r} \u662F\u4E8C\u8FDB\u5236\u6587\u4EF6\uFF0C\u65E0\u6CD5\u4F5C\u4E3A\u6587\u672C\u8BFB\u53D6`};let o=i.toString("utf8").split(`
|
|
25
|
+
`),a=Math.max(1,tr(n.offset,1)),l=Math.max(1,tr(n.limit,Qt)),c=o.slice(a-1,a-1+l),u=c.map((h,m)=>{let p=a+m;return`${String(p).padStart(6," ")}| ${h}`}).join(`
|
|
20
26
|
`),d=a-1+l<o.length?`
|
|
21
|
-
\u2026\uFF08\u6587\u4EF6\u5171 ${o.length} \u884C\uFF0C\u5DF2\u622A\u65AD\uFF09`:"";return{ok:!0,content:u+d,summary:`\u8BFB\u53D6 ${c.length} \u884C`}}},
|
|
22
|
-
\u8BF7\u63D0\u4F9B\u66F4\u7CBE\u786E\u7684 search\uFF08\u5E26\u4E0A\u524D\u540E\u6587\uFF09\uFF0C\u6216\u663E\u5F0F\u8BBE\u7F6E replace_all: true \u4EE5\u66FF\u6362\u5168\u90E8\u5339\u914D\u3002`};let c=o?a.split(s).join(i):a.replace(s,()=>i);return
|
|
27
|
+
\u2026\uFF08\u6587\u4EF6\u5171 ${o.length} \u884C\uFF0C\u5DF2\u622A\u65AD\uFF09`:"";return{ok:!0,content:u+d,summary:`\u8BFB\u53D6 ${c.length} \u884C`}}},or={name:"write_file",description:"\u5199\u5165\uFF08\u8986\u76D6\uFF09\u6587\u4EF6\u3002\u4F1A\u521B\u5EFA\u7F3A\u5931\u7684\u7236\u76EE\u5F55\u3002\u8BF7\u8C28\u614E\u4F7F\u7528\uFF0C\u4F18\u5148\u4F7F\u7528 edit_file \u505A\u5C40\u90E8\u4FEE\u6539\u3002",requiresConfirmation:!0,parameters:{type:"object",properties:{path:{type:"string",description:"\u6587\u4EF6\u8DEF\u5F84"},content:{type:"string",description:"\u8981\u5199\u5165\u7684\u5B8C\u6574\u6587\u4EF6\u5185\u5BB9"}},required:["path","content"]},async execute(n,e){let r=ue(D(n.path),e.cwd),s=D(n.content);try{return b.mkdirSync(C.dirname(r),{recursive:!0}),b.writeFileSync(r,s,"utf8"),{ok:!0,content:`\u5DF2\u5199\u5165 ${r}\uFF08${s.length} \u5B57\u7B26\uFF09`,summary:"\u5199\u5165\u6210\u529F"}}catch(i){return{ok:!1,content:`\u5199\u5165\u5931\u8D25\uFF1A${i instanceof Error?i.message:String(i)}`}}}},ar={name:"edit_file",description:"\u7CBE\u786E\u66FF\u6362\u6587\u4EF6\u4E2D\u7684\u6587\u672C\u3002\u5C06 search \u6307\u5B9A\u7684\u6587\u672C\u66FF\u6362\u4E3A replace\u3002search \u5FC5\u987B\u4E0E\u6587\u4EF6\u5185\u5BB9\u5B8C\u5168\u4E00\u81F4\uFF08\u542B\u7F29\u8FDB\uFF09\uFF1B\u82E5 search \u5339\u914D\u5230\u591A\u5904\u5219\u9ED8\u8BA4\u62D2\u7EDD\u6267\u884C\uFF0C\u9700\u63D0\u4F9B\u66F4\u7CBE\u786E\u7684 search \u6216\u8BBE\u7F6E replace_all \u4E3A true\u3002",requiresConfirmation:!0,parameters:{type:"object",properties:{path:{type:"string",description:"\u6587\u4EF6\u8DEF\u5F84"},search:{type:"string",description:"\u8981\u88AB\u66FF\u6362\u7684\u539F\u6587\uFF08\u9700\u7CBE\u786E\u5339\u914D\uFF09"},replace:{type:"string",description:"\u66FF\u6362\u540E\u7684\u65B0\u6587\u672C"},replace_all:{type:"boolean",description:"\u662F\u5426\u66FF\u6362\u6240\u6709\u5339\u914D\u9879\uFF08\u9ED8\u8BA4 false\uFF09"}},required:["path","search","replace"]},async execute(n,e){let r=ue(D(n.path),e.cwd);if(!b.existsSync(r))return{ok:!1,content:`\u9519\u8BEF\uFF1A\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${r}`};let s=D(n.search),i=D(n.replace),o=n.replace_all===!0;if(!s)return{ok:!1,content:"\u9519\u8BEF\uFF1Asearch \u4E0D\u80FD\u4E3A\u7A7A"};let a=b.readFileSync(r,"utf8");if(!a.includes(s))return{ok:!1,content:`\u9519\u8BEF\uFF1A\u5728 ${r} \u4E2D\u672A\u627E\u5230\u5339\u914D\u6587\u672C\u3002\u8BF7\u5148\u7528 read_file \u786E\u8BA4\u5185\u5BB9\uFF08\u6CE8\u610F\u7F29\u8FDB\u4E0E\u6362\u884C\u9700\u5B8C\u5168\u4E00\u81F4\uFF09\u3002`};let l=a.split(s).length-1;if(l>1&&!o)return{ok:!1,content:`\u9519\u8BEF\uFF1Asearch \u5728 ${r} \u4E2D\u51FA\u73B0 ${l} \u5904\uFF0C\u4E3A\u907F\u514D\u8BEF\u6539\u672A\u6267\u884C\u3002
|
|
28
|
+
\u8BF7\u63D0\u4F9B\u66F4\u7CBE\u786E\u7684 search\uFF08\u5E26\u4E0A\u524D\u540E\u6587\uFF09\uFF0C\u6216\u663E\u5F0F\u8BBE\u7F6E replace_all: true \u4EE5\u66FF\u6362\u5168\u90E8\u5339\u914D\u3002`};let c=o?a.split(s).join(i):a.replace(s,()=>i);return b.writeFileSync(r,c,"utf8"),{ok:!0,content:`\u5DF2\u66F4\u65B0 ${r}\uFF08\u66FF\u6362 ${o?l:1} \u5904\uFF09`,summary:`\u66FF\u6362 ${o?l:1} \u5904`}}},lr={name:"list_dir",description:"\u5217\u51FA\u76EE\u5F55\u4E2D\u7684\u6587\u4EF6\u4E0E\u5B50\u76EE\u5F55\u3002\u7701\u7565 path \u65F6\u5217\u51FA\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u3002",parameters:{type:"object",properties:{path:{type:"string",description:"\u76EE\u5F55\u8DEF\u5F84\uFF08\u53EF\u9009\uFF09"}},required:[]},async execute(n,e){let r=n.path?ue(D(n.path),e.cwd):e.cwd;if(!b.existsSync(r))return{ok:!1,content:`\u9519\u8BEF\uFF1A\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${r}`};if(!b.statSync(r).isDirectory())return{ok:!1,content:`\u9519\u8BEF\uFF1A${r} \u4E0D\u662F\u76EE\u5F55`};let s=b.readdirSync(r,{withFileTypes:!0}).filter(o=>!nr.has(o.name)).sort((o,a)=>o.isDirectory()!==a.isDirectory()?o.isDirectory()?-1:1:o.name.localeCompare(a.name)),i=s.map(o=>{let a=o.isDirectory()?"/":"";return`${o.isDirectory()?"DIR ":"FILE"} ${o.name}${a}`});return{ok:!0,content:`${r}
|
|
23
29
|
${i.join(`
|
|
24
|
-
`)||"(\u7A7A\u76EE\u5F55)"}`,summary:`${s.length} \u9879`}}},
|
|
25
|
-
\u2026\uFF08\u5DF2\u8FBE ${
|
|
26
|
-
`)+a,summary:`${o.length} \u4E2A\u6587\u4EF6`}}},
|
|
27
|
-
\u8BF7\u6539\u5199\u4E3A\u7B49\u4EF7\u4F46\u66F4\u5B89\u5168\u7684\u6A21\u5F0F\uFF0C\u4F8B\u5982\u7528 [^x]* \u4EE3\u66FF (.*)+\u3002`};let s;try{s=new RegExp(r)}catch(u){return{ok:!1,content:`\u9519\u8BEF\uFF1A\u65E0\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\uFF1A${u instanceof Error?u.message:String(u)}`}}let i=n.path?
|
|
28
|
-
`);for(let f=0;f<
|
|
29
|
-
\u2026\uFF08\u5DF2\u8FBE ${
|
|
30
|
-
`)+c,summary:`${l.length} \u6761\u5339\u914D`}}};function
|
|
30
|
+
`)||"(\u7A7A\u76EE\u5F55)"}`,summary:`${s.length} \u9879`}}},cr={name:"glob",description:"\u6309\u901A\u914D\u7B26\u67E5\u627E\u6587\u4EF6\uFF0C\u652F\u6301 **\u3001*\u3001? \u8BED\u6CD5\u3002\u4F8B\u5982 'src/**/*.ts'\u3002\u8FD4\u56DE\u5339\u914D\u7684\u6587\u4EF6\u8DEF\u5F84\u3002",parameters:{type:"object",properties:{pattern:{type:"string",description:"glob \u6A21\u5F0F\uFF0C\u5982 '**/*.ts'"},path:{type:"string",description:"\u641C\u7D22\u8D77\u59CB\u76EE\u5F55\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09"}},required:["pattern"]},async execute(n,e){let r=D(n.pattern);if(!r)return{ok:!1,content:"\u9519\u8BEF\uFF1Apattern \u4E0D\u80FD\u4E3A\u7A7A"};let s=n.path?ue(D(n.path),e.cwd):e.cwd,i=De(r),o=[];if(dt(s,l=>{if(o.length>=ut)return;let c=C.relative(s,l).split(C.sep).join("/");i.test(c)&&o.push(c)}),o.length===0)return{ok:!0,content:"\u672A\u627E\u5230\u5339\u914D\u7684\u6587\u4EF6\u3002"};let a=o.length>=ut?`
|
|
31
|
+
\u2026\uFF08\u5DF2\u8FBE ${ut} \u6761\u4E0A\u9650\uFF09`:"";return{ok:!0,content:o.join(`
|
|
32
|
+
`)+a,summary:`${o.length} \u4E2A\u6587\u4EF6`}}},ur={name:"grep",description:"\u5728\u6587\u4EF6\u4E2D\u6309\u6B63\u5219\u8868\u8FBE\u5F0F\u641C\u7D22\u6587\u672C\u5185\u5BB9\u3002\u8FD4\u56DE \u6587\u4EF6:\u884C\u53F7:\u5185\u5BB9\u3002\u53EF\u901A\u8FC7 include \u9650\u5B9A\u6587\u4EF6\u7C7B\u578B\uFF08\u5982 '*.ts'\uFF09\u3002",parameters:{type:"object",properties:{pattern:{type:"string",description:"\u6B63\u5219\u8868\u8FBE\u5F0F"},path:{type:"string",description:"\u641C\u7D22\u76EE\u5F55\uFF08\u53EF\u9009\uFF0C\u9ED8\u8BA4\u5F53\u524D\u76EE\u5F55\uFF09"},include:{type:"string",description:"\u6587\u4EF6\u540D\u901A\u914D\u7B26\u8FC7\u6EE4\uFF0C\u5982 '*.ts'\uFF08\u53EF\u9009\uFF09"}},required:["pattern"]},async execute(n,e){let r=D(n.pattern);if(!r)return{ok:!1,content:"\u9519\u8BEF\uFF1Apattern \u4E0D\u80FD\u4E3A\u7A7A"};if(Un(r))return{ok:!1,content:`\u9519\u8BEF\uFF1A\u6B63\u5219\u53EF\u80FD\u5B58\u5728\u707E\u96BE\u6027\u56DE\u6EAF\uFF08\u5D4C\u5957\u91CF\u8BCD\uFF0C\u5982 (a+)+\uFF09\uFF0C\u5DF2\u62D2\u7EDD\u6267\u884C\u4EE5\u514D\u5361\u6B7B\u8FDB\u7A0B\u3002
|
|
33
|
+
\u8BF7\u6539\u5199\u4E3A\u7B49\u4EF7\u4F46\u66F4\u5B89\u5168\u7684\u6A21\u5F0F\uFF0C\u4F8B\u5982\u7528 [^x]* \u4EE3\u66FF (.*)+\u3002`};let s;try{s=new RegExp(r)}catch(u){return{ok:!1,content:`\u9519\u8BEF\uFF1A\u65E0\u6548\u7684\u6B63\u5219\u8868\u8FBE\u5F0F\uFF1A${u instanceof Error?u.message:String(u)}`}}let i=n.path?ue(D(n.path),e.cwd):e.cwd,o=n.include?De(D(n.include)):null,a=Bn(i),l=[];if(dt(i,u=>{if(l.length>=Oe||a.length>0&&Wn(C.relative(i,u),a))return;let d=C.relative(i,u).split(C.sep).join("/");if(o&&!o.test(d)&&!o.test(C.basename(u)))return;let h;try{h=b.statSync(u)}catch{return}if(h.size>Kn||h.size===0)return;let m;try{m=b.readFileSync(u)}catch{return}if(sr(m))return;let p=m.toString("utf8").split(`
|
|
34
|
+
`);for(let f=0;f<p.length;f++){if(l.length>=Oe)return;let $=p[f],g=$.length>er?$.slice(0,er):$;s.test(g)&&l.push(`${d}:${f+1}: ${$.trim().slice(0,300)}`)}}),l.length===0)return{ok:!0,content:"\u672A\u627E\u5230\u5339\u914D\u5185\u5BB9\u3002"};let c=l.length>=Oe?`
|
|
35
|
+
\u2026\uFF08\u5DF2\u8FBE ${Oe} \u6761\u4E0A\u9650\uFF09`:"";return{ok:!0,content:l.join(`
|
|
36
|
+
`)+c,summary:`${l.length} \u6761\u5339\u914D`}}};function dt(n,e){let r;try{r=b.readdirSync(n,{withFileTypes:!0})}catch{return}for(let s of r){if(nr.has(s.name))continue;let i=C.join(n,s.name);s.isDirectory()?dt(i,e):(s.isFile()||s.isSymbolicLink())&&e(i)}}function De(n){let e="",r=n.split(C.sep).join("/");for(let s=0;s<r.length;s++){let i=r[s];if(i==="*")r[s+1]==="*"?(s++,r[s+1]==="/"?(s++,e+="(?:.*/)?"):e+=".*"):e+="[^/]*";else if(i==="?")e+="[^/]";else if(i==="{"){let o=r.indexOf("}",s);if(o!==-1){let a=r.slice(s+1,o).split(",").map(rr).join("|");e+=`(?:${a})`,s=o}else e+="\\{"}else e+=rr(i)}return new RegExp(`^${e}$`)}function rr(n){return n.replace(/[.+^${}()|[\]\\]/g,"\\$&")}var w=x(require("fs")),Y=x(require("path")),Fn=".xuanzhu",zn="MEMORY.md",dr=`# \u9879\u76EE\u89C4\u5219
|
|
31
37
|
|
|
32
38
|
> \u672C\u6587\u4EF6\u5185\u5BB9\u4F1A\u4F5C\u4E3A\u300C\u9879\u76EE\u7EA7\u6307\u4EE4\u300D\u8FFD\u52A0\u5230\u7384\u732A\u7684\u7CFB\u7EDF\u63D0\u793A\u8BCD\u4E2D\uFF0C\u7528\u4E8E\u7EA6\u5B9A\u672C\u9879\u76EE\u7684
|
|
33
39
|
> \u7F16\u7801\u89C4\u8303\u3001\u76EE\u5F55\u7ED3\u6784\u3001\u6784\u5EFA\u4E0E\u6D4B\u8BD5\u547D\u4EE4\u7B49\u3002\u7559\u7A7A\u6216\u5220\u9664\u672C\u6587\u4EF6\u5373\u8868\u793A\u4E0D\u4F7F\u7528\u9879\u76EE\u89C4\u5219\u3002
|
|
@@ -39,14 +45,14 @@ ${i.join(`
|
|
|
39
45
|
- \u5B89\u88C5\u4F9D\u8D56\uFF1A
|
|
40
46
|
- \u8FD0\u884C\u6D4B\u8BD5\uFF1A
|
|
41
47
|
- \u4EE3\u7801\u98CE\u683C\uFF1A
|
|
42
|
-
`;function
|
|
48
|
+
`;function jn(n){let e=Y.join(n,Fn),r=Y.join(e,"memory");return{root:n,dir:e,memoryDir:r,longTermFile:Y.join(r,zn),rulesFile:Y.join(e,"rules.md")}}function J(n){return jn(Y.resolve(n))}function ht(n){let e=J(n);if(w.existsSync(e.dir)){w.mkdirSync(e.memoryDir,{recursive:!0});try{w.existsSync(e.rulesFile)||w.writeFileSync(e.rulesFile,dr,"utf8")}catch{}return{paths:e,created:!1}}try{return w.mkdirSync(e.memoryDir,{recursive:!0}),w.writeFileSync(e.rulesFile,dr,"utf8"),{paths:e,created:!0}}catch{return{paths:e,created:!1}}}function hr(n){let{rulesFile:e}=J(n);try{return w.existsSync(e)&&w.readFileSync(e,"utf8").trim()||null}catch{return null}}function qn(n,e=new Date){let r=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`;return Y.join(J(n).memoryDir,`${r}.md`)}function Ne(n){let e=J(n),r="",s="",i="";try{w.existsSync(e.longTermFile)&&(r=w.readFileSync(e.longTermFile,"utf8").trim())}catch{}try{if(w.existsSync(e.memoryDir)){let o=w.readdirSync(e.memoryDir).filter(a=>/^\d{4}-\d{2}-\d{2}\.md$/.test(a)).sort().reverse();o.length>0&&(i=o[0],s=w.readFileSync(Y.join(e.memoryDir,o[0]),"utf8").trim())}}catch{}return{longTerm:r,recentDailyName:i,recentDaily:s}}function mr(n,e,r){let s=J(n);w.mkdirSync(s.memoryDir,{recursive:!0});let i=new Date,o=d=>String(d).padStart(2,"0"),a=`${i.getFullYear()}-${o(i.getMonth()+1)}-${o(i.getDate())} ${o(i.getHours())}:${o(i.getMinutes())}`,l=r==="long"?s.longTermFile:qn(n,i),c=`
|
|
43
49
|
|
|
44
50
|
## ${a}
|
|
45
51
|
|
|
46
52
|
${e.trim()}
|
|
47
|
-
`,u=
|
|
53
|
+
`,u=w.existsSync(l)?"":r==="long"?`# \u9879\u76EE\u957F\u671F\u8BB0\u5FC6
|
|
48
54
|
`:`# \u6BCF\u65E5\u8BB0\u5F55
|
|
49
|
-
`;return
|
|
55
|
+
`;return w.appendFileSync(l,`${u}${c}`,"utf8"),l}var pr=12e3,fr={name:"memory_read",description:"\u8BFB\u53D6\u5F53\u524D\u9879\u76EE\u7684\u8BB0\u5FC6\uFF08\u5B58\u653E\u5728 <\u9879\u76EE>/.xuanzhu/memory/\uFF09\uFF1A\u5305\u542B\u957F\u671F\u8BB0\u5FC6 MEMORY.md \u4E0E\u6700\u8FD1\u4E00\u4EFD\u6BCF\u65E5\u65E5\u5FD7\u3002\u5728\u5F00\u59CB\u5904\u7406\u9700\u8981\u9879\u76EE\u80CC\u666F\u7684\u4EFB\u52A1\u524D\u8C03\u7528\u5B83\uFF0C\u53EF\u4EE5\u4E86\u89E3\u6B64\u524D\u79EF\u7D2F\u7684\u7EA6\u5B9A\u4E0E\u7ED3\u8BBA\u3002",parameters:{type:"object",properties:{},required:[]},async execute(n,e){let r=Ne(e.cwd),s=J(e.cwd);if(!r.longTerm&&!r.recentDaily)return{ok:!0,content:`\u9879\u76EE\u8BB0\u5FC6\u4E3A\u7A7A\uFF08\u76EE\u5F55\uFF1A${s.memoryDir}\uFF09\u3002`,summary:"\u6682\u65E0\u8BB0\u5FC6"};let i=[];r.longTerm&&i.push(`## \u957F\u671F\u8BB0\u5FC6\uFF08MEMORY.md\uFF09
|
|
50
56
|
|
|
51
57
|
${r.longTerm}`),r.recentDaily&&i.push(`## \u6700\u8FD1\u65E5\u5FD7\uFF08${r.recentDailyName}\uFF09
|
|
52
58
|
|
|
@@ -54,32 +60,32 @@ ${r.recentDaily}`);let o=i.join(`
|
|
|
54
60
|
|
|
55
61
|
---
|
|
56
62
|
|
|
57
|
-
`);return{ok:!0,content:o.length>
|
|
63
|
+
`);return{ok:!0,content:o.length>pr?`${o.slice(0,pr)}
|
|
58
64
|
|
|
59
|
-
\u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:o,summary:"\u5DF2\u8BFB\u53D6\u9879\u76EE\u8BB0\u5FC6"}}},
|
|
65
|
+
\u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:o,summary:"\u5DF2\u8BFB\u53D6\u9879\u76EE\u8BB0\u5FC6"}}},gr={name:"memory_write",description:"\u628A\u503C\u5F97\u8DE8\u4F1A\u8BDD\u4FDD\u7559\u7684\u4FE1\u606F\u5199\u5165\u9879\u76EE\u8BB0\u5FC6\uFF08<\u9879\u76EE>/.xuanzhu/memory/\uFF09\u3002\u5728\u5B8C\u6210\u5B9E\u8D28\u5DE5\u4F5C\uFF08\u5B9E\u73B0\u529F\u80FD\u3001\u4FEE\u590D\u7F3A\u9677\u3001\u786E\u5B9A\u6280\u672F\u65B9\u6848\u3001\u7EA6\u5B9A\u9879\u76EE\u89C4\u8303\uFF09\u540E\u8C03\u7528\uFF0C\u4EE5\u4FBF\u540E\u7EED\u4F1A\u8BDD\u590D\u7528\u3002scope=daily \u8FFD\u52A0\u5230\u5F53\u65E5\u65E5\u5FD7\uFF08\u9ED8\u8BA4\uFF0C\u9002\u5408\u8FC7\u7A0B\u8BB0\u5F55\uFF09\uFF1Bscope=long \u8FFD\u52A0\u5230\u957F\u671F\u8BB0\u5FC6 MEMORY.md\uFF08\u9002\u5408\u7A33\u5B9A\u7684\u7ED3\u8BBA\u4E0E\u7EA6\u5B9A\uFF09\u3002\u8BF7\u5199\u7B80\u6D01\u7684\u4E8B\u5B9E\u6027\u5185\u5BB9\uFF0C\u4E0D\u8981\u8BB0\u5F55\u77AC\u65F6\u4FE1\u606F\uFF08\u4E34\u65F6\u8DEF\u5F84\u3001\u5DE5\u5177\u62A5\u9519\u7B49\uFF09\u3002",parameters:{type:"object",properties:{content:{type:"string",description:"\u8981\u8BB0\u5F55\u7684\u5185\u5BB9\uFF08Markdown\uFF0C\u5EFA\u8BAE\u7B80\u6D01\u3001\u5206\u70B9\uFF09"},scope:{type:"string",enum:["daily","long"],description:"daily=\u5F53\u65E5\u65E5\u5FD7\uFF08\u9ED8\u8BA4\uFF09\uFF1Blong=\u957F\u671F\u8BB0\u5FC6 MEMORY.md"}},required:["content"]},async execute(n,e){let r=typeof n.content=="string"?n.content.trim():"";if(!r)return{ok:!1,content:"\u9519\u8BEF\uFF1Acontent \u4E0D\u80FD\u4E3A\u7A7A\u3002"};let s=n.scope==="long"?"long":"daily";try{let i=mr(e.cwd,r,s),o=s==="long"?"\u957F\u671F\u8BB0\u5FC6":"\u5F53\u65E5\u65E5\u5FD7";return{ok:!0,content:`\u5DF2\u5199\u5165${o}\uFF1A${i}
|
|
60
66
|
|
|
61
|
-
\uFF08\u8BB0\u5FC6\u76EE\u5F55\uFF1A${
|
|
62
|
-
\uFF08\u76EE\u6807\u76EE\u5F55\uFF1A${
|
|
67
|
+
\uFF08\u8BB0\u5FC6\u76EE\u5F55\uFF1A${J(e.cwd).memoryDir}\uFF09`,summary:`\u5DF2\u5199\u5165${o}`}}catch(i){return{ok:!1,content:`\u5199\u5165\u8BB0\u5FC6\u5931\u8D25\uFF1A${i instanceof Error?i.message:String(i)}
|
|
68
|
+
\uFF08\u76EE\u6807\u76EE\u5F55\uFF1A${J(e.cwd).memoryDir}\uFF09`}}}};var ne=x(require("fs")),Ke=x(require("path"));var $r="SKILL.md",yr=8e4;function br(n){return n.replace(/^["']|["']$/g,"").trim()}function Hn(n){let e=/^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(n);if(!e)return{meta:{},body:n};let r=e[1],s=n.slice(e[0].length),i=/^name:\s*(.+)$/m.exec(r)?.[1];return{meta:{name:i?br(i):void 0,description:Gn(r)},body:s}}function Gn(n){let e=/^description:\s*(.*)$/m.exec(n)?.[1]?.trim();if(e&&e!==">"&&e!=="|"&&e!==">-"&&e!=="|-")return br(e);let r=/^description:\s*[>|]-?\s*\n((?:[ \t]+\S.*\n?)+)/m.exec(n)?.[1];return r?r.replace(/\s+/g," ").trim():""}function Xn(n){let e=Ke.join(n,$r);if(ne.existsSync(e))return e;try{let r=ne.readdirSync(n).find(s=>s.toLowerCase()===$r.toLowerCase());return r?Ke.join(n,r):null}catch{return null}}function xr(n,e,r){let s;try{s=ne.readdirSync(n,{withFileTypes:!0})}catch{return}for(let i of s){if(!i.isDirectory())continue;let o=Ke.join(n,i.name),a=Xn(o);if(!a)continue;let l;try{l=ne.readFileSync(a,"utf8")}catch{continue}let{meta:c}=Hn(l),u=(c.name||i.name).trim();u&&r.set(u,{name:u,description:c.description??"",dir:o,file:a,source:e})}}function Ue(){let n=new Map;return xr(Et(),"builtin",n),xr(kt(),"user",n),[...n.values()].sort((e,r)=>e.name.localeCompare(r.name))}function wr(n){let e=n.trim().toLowerCase();if(e)return Ue().find(r=>r.name.toLowerCase()===e)}function vr(n){let e=ne.readFileSync(n.file,"utf8");return e.length<=yr?e:`${e.slice(0,yr)}
|
|
63
69
|
|
|
64
|
-
\u2026\uFF08\u6280\u80FD\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function
|
|
65
|
-
[\u5DF2\u53D6\u6D88]`,timedOut:!1})};if(r){if(r.aborted){$();return}r.addEventListener("abort",$,{once:!0})}l.stdout?.on("data",h),l.stderr?.on("data",h),l.on("error",g=>{
|
|
66
|
-
[\u6267\u884C\u8D85\u65F6 ${e}ms]`:c,timedOut:u})})})}async function
|
|
67
|
-
`)};let c=n.postInstall?.[e];if(c){a(`$ ${c}`);let d=await
|
|
68
|
-
`)}}return await
|
|
70
|
+
\u2026\uFF08\u6280\u80FD\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function be(){return process.platform==="darwin"?"darwin":process.platform==="win32"?"win32":"linux"}var mt="npm install -g @playwright/cli@latest",pt="npx --yes playwright@latest install chromium",Zn={linux:"curl -fsSL https://d.officecli.ai/install.sh | bash",darwin:"curl -fsSL https://d.officecli.ai/install.sh | bash",win32:'powershell -NoProfile -Command "irm https://d.officecli.ai/install.ps1 | iex"'},Cr={playwright:[{name:"Playwright CLI\uFF08playwright-cli\uFF09",check:"playwright-cli --version",install:{linux:mt,darwin:mt,win32:mt},postInstall:{linux:pt,darwin:pt,win32:pt}}],officecli:[{name:"OfficeCLI\uFF08officecli\uFF09",check:"officecli --version",install:Zn}]};function de(n){return Cr[n.trim().toLowerCase()]??[]}function Tr(){return Object.keys(Cr)}var kr=require("child_process");var Yn=15e3,Sr=9e5,Jn=2e4;function ft(n,e,r){return new Promise(s=>{let i=process.platform==="win32",o=i?"cmd.exe":process.env.SHELL||"bash",l=(0,kr.spawn)(o,i?["/d","/s","/c",n]:["-lc",n],{env:process.env,windowsHide:!0,detached:!i}),c="",u=!1,d=!1,h=g=>{c.length<Jn&&(c+=g.toString())},m=g=>{d||(d=!0,clearTimeout(f),r?.removeEventListener("abort",$),s(g))},p=()=>{if(!i&&l.pid)try{process.kill(-l.pid,"SIGKILL");return}catch{}try{l.kill("SIGKILL")}catch{}},f=setTimeout(()=>{u=!0,p()},e),$=()=>{p(),m({ok:!1,output:c+`
|
|
71
|
+
[\u5DF2\u53D6\u6D88]`,timedOut:!1})};if(r){if(r.aborted){$();return}r.addEventListener("abort",$,{once:!0})}l.stdout?.on("data",h),l.stderr?.on("data",h),l.on("error",g=>{m({ok:!1,output:c+String(g),timedOut:u})}),l.on("close",g=>{m({ok:g===0&&!u,output:u?`${c}
|
|
72
|
+
[\u6267\u884C\u8D85\u65F6 ${e}ms]`:c,timedOut:u})})})}async function Be(n,e){return(await ft(n.check,Yn,e)).ok}async function gt(n,e=be(),r,s){let i=n.install[e];if(!i)return{ok:!1,log:`\u5F53\u524D\u5E73\u53F0\uFF08${e}\uFF09\u6CA1\u6709\u53EF\u7528\u7684\u81EA\u52A8\u5B89\u88C5\u547D\u4EE4\u3002`};let o=[],a=d=>{let h=d.trim();h&&(o.push(h),s?.(h))};a(`$ ${i}`);let l=await ft(i,Sr,r);for(let d of Er(l.output,12))a(d);if(!l.ok)return{ok:!1,log:o.join(`
|
|
73
|
+
`)};let c=n.postInstall?.[e];if(c){a(`$ ${c}`);let d=await ft(c,Sr,r);for(let h of Er(d.output,12))a(h);if(!d.ok)return{ok:!1,log:o.join(`
|
|
74
|
+
`)}}return await Be(n,r)?(a(`\u2713 ${n.name} \u5DF2\u5C31\u7EEA`),{ok:!0,log:o.join(`
|
|
69
75
|
`)}):(a(`\u26A0 \u5B89\u88C5\u547D\u4EE4\u5DF2\u6267\u884C\uFF0C\u4F46 \u201C${n.check}\u201D \u4ECD\u672A\u901A\u8FC7\uFF1B\u53EF\u80FD\u662F PATH \u5C1A\u672A\u5237\u65B0\uFF0C\u8BF7\u91CD\u65B0\u6253\u5F00\u7EC8\u7AEF\u540E\u518D\u8BD5\u3002`),{ok:!1,log:o.join(`
|
|
70
|
-
`)})}async function
|
|
71
|
-
`).slice(-2).join(" ");s.failed.push(`${i.name} \u2192 ${c}`)}}return s}function
|
|
72
|
-
`).map(s=>s.trimEnd()).filter(s=>s.trim().length>0).slice(-e)}var
|
|
76
|
+
`)})}async function _r(n,e={}){let r=e.platform??be(),s={installed:[],skipped:[],failed:[]};for(let i of de(n)){if(await Be(i,e.signal))continue;let o=i.install[r];if(!o){s.skipped.push(`${i.name}\uFF08\u5F53\u524D\u5E73\u53F0\u65E0\u81EA\u52A8\u5B89\u88C5\u547D\u4EE4\uFF09`);continue}if(!(e.confirm?await e.confirm(i,o):!1)){s.skipped.push(`${i.name}`);continue}e.onOutput?.(`\u6B63\u5728\u5B89\u88C5 ${i.name} \u2026\uFF08\u53EF\u80FD\u9700\u8981\u6570\u5206\u949F\uFF09`);let l=await gt(i,r,e.signal,e.onOutput);if(l.ok)s.installed.push(i.name);else{let c=l.log.split(`
|
|
77
|
+
`).slice(-2).join(" ");s.failed.push(`${i.name} \u2192 ${c}`)}}return s}function Er(n,e){return n.split(`
|
|
78
|
+
`).map(s=>s.trimEnd()).filter(s=>s.trim().length>0).slice(-e)}var Mr={name:"list_skills",description:"\u5217\u51FA\u7384\u732A\u5F53\u524D\u53EF\u7528\u7684\u5168\u90E8\u6280\u80FD\uFF08\u540D\u79F0\u4E0E\u7528\u9014\uFF09\u3002\u6280\u80FD\u662F\u4E00\u4EFD\u6307\u5BFC\u4F60\u4F7F\u7528\u7279\u5B9A\u5916\u90E8 CLI \u5DE5\u5177\u7684\u6307\u5357\u3002\u5F53\u4EFB\u52A1\u53EF\u80FD\u6D89\u53CA\u67D0\u4E2A\u9886\u57DF\uFF08\u6D4F\u89C8\u5668\u81EA\u52A8\u5316\u3001Office \u6587\u6863\u3001GitHub\u3001\u6570\u636E\u5E93\u7B49\uFF09\u65F6\uFF0C\u5148\u8C03\u7528\u672C\u5DE5\u5177\u67E5\u770B\u662F\u5426\u6709\u5BF9\u5E94\u6280\u80FD\u3002",parameters:{type:"object",properties:{},required:[]},async execute(n,e){let r=Ue();if(r.length===0)return{ok:!0,content:"\u5F53\u524D\u6CA1\u6709\u53EF\u7528\u6280\u80FD\u3002"};let s=r.map(i=>{let o=i.source==="user"?"\uFF08\u7528\u6237\uFF09":"";return`- ${i.name}${o}\uFF1A${i.description||"\uFF08\u65E0\u63CF\u8FF0\uFF09"}`});return{ok:!0,content:`\u53EF\u7528\u6280\u80FD\uFF08${r.length} \u4E2A\uFF09\uFF1A
|
|
73
79
|
${s.join(`
|
|
74
|
-
`)}`,summary:`${r.length} \u4E2A\u6280\u80FD`}}},
|
|
80
|
+
`)}`,summary:`${r.length} \u4E2A\u6280\u80FD`}}},Rr={name:"load_skill",description:"\u52A0\u8F7D\u6307\u5B9A\u6280\u80FD\u7684\u5B8C\u6574\u6307\u5357\uFF08SKILL.md \u5168\u6587\uFF09\uFF0C\u968F\u540E\u8BF7\u4E25\u683C\u6309\u6307\u5357\u4E2D\u7684\u6B65\u9AA4\u4E0E\u547D\u4EE4\u64CD\u4F5C\u3002\u82E5\u8BE5\u6280\u80FD\u4F9D\u8D56\u7684\u5916\u90E8\u547D\u4EE4\u5C1A\u672A\u5B89\u88C5\uFF0C\u7384\u732A\u4F1A\u81EA\u52A8\u5B89\u88C5\uFF08\u53EF\u80FD\u9700\u8981\u7528\u6237\u786E\u8BA4\u4E00\u6B21\uFF09\u3002\u6307\u5357\u5728\u672C\u6B21\u5BF9\u8BDD\u4E2D\u6301\u7EED\u6709\u6548\uFF0C\u540C\u4E00\u4E2A\u6280\u80FD\u65E0\u9700\u91CD\u590D\u52A0\u8F7D\u3002",parameters:{type:"object",properties:{name:{type:"string",description:"\u6280\u80FD\u540D\u79F0\uFF0C\u4F8B\u5982 playwright\u3001officecli"}},required:["name"]},async execute(n,e){let r=typeof n.name=="string"?n.name:"";if(!r.trim())return{ok:!1,content:"\u9519\u8BEF\uFF1A\u7F3A\u5C11\u6280\u80FD\u540D\u79F0\u53C2\u6570 name\u3002"};let s=wr(r);if(!s){let c=Ue().map(u=>u.name).join(", ");return{ok:!1,content:`\u672A\u627E\u5230\u6280\u80FD "${r}"\u3002\u53EF\u7528\u6280\u80FD\uFF1A${c||"\uFF08\u65E0\uFF09"}\u3002\u53EF\u5148\u8C03\u7528 list_skills \u67E5\u770B\u3002`}}let i=[];if(de(s.name).length>0){let c=await _r(s.name,{signal:e.signal,onOutput:u=>e.emit?.(u),confirm:async(u,d)=>e.autoApprove?!0:e.confirm?e.confirm({tool:"load_skill",title:`\u5B89\u88C5\u6280\u80FD\u4F9D\u8D56\uFF1A${u.name}`,detail:`\u6280\u80FD\u300C${s.name}\u300D\u9700\u8981\u8BE5\u547D\u4EE4\uFF0C\u662F\u5426\u73B0\u5728\u81EA\u52A8\u5B89\u88C5\uFF1F
|
|
75
81
|
|
|
76
|
-
${d}`,danger:!0}):!1});for(let u of c.installed)i.push(`\u2713 \u5DF2\u5B89\u88C5\u5E76\u9A8C\u8BC1\uFF1A${u}`);for(let u of c.skipped)i.push(`\u26A0 \u672A\u5B89\u88C5\uFF08\u5DF2\u8DF3\u8FC7\uFF09\uFF1A${u}`);for(let u of c.failed)i.push(`\u2717 \u5B89\u88C5\u5931\u8D25\uFF1A${u}`)}let o=
|
|
82
|
+
${d}`,danger:!0}):!1});for(let u of c.installed)i.push(`\u2713 \u5DF2\u5B89\u88C5\u5E76\u9A8C\u8BC1\uFF1A${u}`);for(let u of c.skipped)i.push(`\u26A0 \u672A\u5B89\u88C5\uFF08\u5DF2\u8DF3\u8FC7\uFF09\uFF1A${u}`);for(let u of c.failed)i.push(`\u2717 \u5B89\u88C5\u5931\u8D25\uFF1A${u}`)}let o=vr(s),a=i.length>0?`> \u4F9D\u8D56\u5904\u7406\uFF1A
|
|
77
83
|
${i.map(c=>`> ${c}`).join(`
|
|
78
84
|
`)}
|
|
79
85
|
|
|
80
86
|
`:"",l=i.filter(c=>c.startsWith("\u2713")).length;return{ok:!0,content:`# \u6280\u80FD\uFF1A${s.name}
|
|
81
87
|
|
|
82
|
-
${a}${o}`,summary:l>0?`\u5DF2\u52A0\u8F7D ${s.name}\uFF08\u5B89\u88C5 ${l} \u9879\u4F9D\u8D56\uFF09`:`\u5DF2\u52A0\u8F7D\u6280\u80FD ${s.name}`}}};var
|
|
88
|
+
${a}${o}`,summary:l>0?`\u5DF2\u52A0\u8F7D ${s.name}\uFF08\u5B89\u88C5 ${l} \u9879\u4F9D\u8D56\uFF09`:`\u5DF2\u52A0\u8F7D\u6280\u80FD ${s.name}`}}};var Pr=[Mr,Rr,fr,gr,ir,lr,cr,ur,or,ar,Vt];function $t(n){return Pr.find(e=>e.name===n)}function Ar(){return Pr.map(n=>({name:n.name,description:n.description,parameters:n.parameters}))}async function Ir(n,e,r){let s=$t(n);if(!s)return{ok:!1,content:`\u9519\u8BEF\uFF1A\u672A\u77E5\u5DE5\u5177 "${n}"`};let i={};if(e&&e.trim())try{let d=JSON.parse(e);typeof d=="object"&&d!==null&&!Array.isArray(d)&&(i=d)}catch(d){return{ok:!1,content:`\u9519\u8BEF\uFF1A\u5DE5\u5177\u53C2\u6570\u4E0D\u662F\u5408\u6CD5 JSON\uFF1A${d instanceof Error?d.message:String(d)}`}}let o=s.parameters,a=o.properties??{},l=Array.isArray(o.required)?o.required:[],c=Object.keys(i).filter(d=>!(d in a));if(c.length>0){let d=Object.keys(a);return{ok:!1,content:`\u9519\u8BEF\uFF1A${n} \u6536\u5230\u672A\u77E5\u53C2\u6570 ${c.map(h=>`"${h}"`).join("\u3001")}\u3002\u53EF\u7528\u53C2\u6570\uFF1A${d.length>0?d.map(h=>`"${h}"`).join("\u3001"):"\uFF08\u65E0\uFF09"}`}}let u=l.filter(d=>i[d]===void 0||i[d]===null);if(u.length>0)return{ok:!1,content:`\u9519\u8BEF\uFF1A${n} \u7F3A\u5C11\u5FC5\u586B\u53C2\u6570 ${u.map(d=>`"${d}"`).join("\u3001")}\u3002`};try{return await s.execute(i,r)}catch(d){return{ok:!1,content:`\u5DE5\u5177\u6267\u884C\u5F02\u5E38\uFF1A${d instanceof Error?d.message:String(d)}`}}}function Or(n,e,r,s){let o=`\u4F60\u662F\u300C\u7384\u732A\u300D\uFF08XuanZhu\uFF09\uFF0C\u4E00\u6B3E\u8FD0\u884C\u5728\u7EC8\u7AEF\u4E2D\u7684 AI \u7F16\u7801 Agent\u3002
|
|
83
89
|
|
|
84
90
|
\u4F60\u7684\u5DE5\u4F5C\u76EE\u5F55\uFF1A${n}
|
|
85
91
|
|
|
@@ -112,126 +118,139 @@ ${a}${o}`,summary:l>0?`\u5DF2\u52A0\u8F7D ${s.name}\uFF08\u5B89\u88C5 ${l} \u987
|
|
|
112
118
|
- \u82E5\u4EFB\u52A1\u65E0\u6CD5\u5B8C\u6210\uFF0C\u8BF4\u660E\u539F\u56E0\u548C\u6240\u9700\u4FE1\u606F\u3002`;return r&&r.trim()&&(o+=`
|
|
113
119
|
|
|
114
120
|
## \u9879\u76EE\u89C4\u5219\uFF08\u6765\u81EA\u9879\u76EE\u6839 .xuanzhu/rules.md\uFF0C\u8BF7\u4F18\u5148\u9075\u5B88\uFF09
|
|
115
|
-
${r.trim()}`),o+=
|
|
121
|
+
${r.trim()}`),o+=Vn(s),e&&e.trim()&&(o+=`
|
|
116
122
|
|
|
117
123
|
## \u9644\u52A0\u6307\u4EE4
|
|
118
|
-
${e.trim()}`),o}var
|
|
124
|
+
${e.trim()}`),o}var Lr=1500;function Vn(n){let e="\n\n## \u9879\u76EE\u8BB0\u5FC6\n\u672C\u9879\u76EE\u5728 `.xuanzhu/memory/` \u4E2D\u4FDD\u5B58\u8DE8\u4F1A\u8BDD\u8BB0\u5FC6\uFF08\u957F\u671F\u8BB0\u5FC6 MEMORY.md + \u6BCF\u65E5\u65E5\u5FD7\uFF09\u3002\n- \u5904\u7406\u9700\u8981\u9879\u76EE\u80CC\u666F\u7684\u4EFB\u52A1\u524D\uFF0C\u53EF\u8C03\u7528 `memory_read` \u4E86\u89E3\u6B64\u524D\u79EF\u7D2F\u7684\u7ED3\u8BBA\u4E0E\u7EA6\u5B9A\u3002\n- \u5B8C\u6210\u5B9E\u8D28\u5DE5\u4F5C\u540E\uFF0C\u8C03\u7528 `memory_write` \u8BB0\u5F55\u503C\u5F97\u8DE8\u4F1A\u8BDD\u4FDD\u7559\u7684\u4FE1\u606F\u3002",r=n?.longTerm?.trim();if(r){let s=r.length>Lr?`${r.slice(0,Lr)}
|
|
119
125
|
\u2026\uFF08\u5DF2\u622A\u65AD\uFF0C\u53EF\u7528 memory_read \u67E5\u770B\u5B8C\u6574\u5185\u5BB9\uFF09`:r;e+=`
|
|
120
126
|
|
|
121
127
|
### \u73B0\u6709\u957F\u671F\u8BB0\u5FC6\uFF08\u8282\u9009\uFF09
|
|
122
|
-
${s}`}return e}var
|
|
123
|
-
`)[0]}\uFF09\uFF0C\u5DF2\u6309\u539F\u59CB\u8F93\u5165\u7EE7\u7EED\u3002`),null}let a=o.trim();return a.length>0?a:null}async streamAssistant(e,r=0,s=new Set,i=[]){this.activeModel&&s.add(this.activeModel.id);let
|
|
124
|
-
`)[0])}});for await(let
|
|
125
|
-
`)[0]
|
|
126
|
-
`)){if(s===""){r.push("");continue}let i="",o=0,a=s.match(/\x1b\[[0-9;?]*[A-Za-z]|./gu)??[];for(let l of a){let c=P(l);o+c>e&&i!==""&&(r.push(i),i="",o=0),i+=l,o+=c}r.push(i)}return r}function
|
|
128
|
+
${s}`}return e}var he=x(require("path")),Qn=new Set(["read_file","list_dir","glob","grep"]),es=/(^|\/)(\.env(\..+)?|\.npmrc|\.netrc|\.git-credentials|\.ssh|\.aws|\.gnupg|\.kube|\.docker|\.xzh|\.xuanzhu|credentials|secrets?)(\/|$)|\.(pem|key|p12|pfx|jks)$|(^|\/)id_(rsa|dsa|ecdsa|ed25519)(\.|$)/i,Dr=400,ts=.5,rs=3,We=class{provider;config;cwd;events;systemPrompt;warnedTightContext=!1;history=[];activeModel;constructor(e,r,s,i,o){this.provider=e,this.config=r,this.cwd=s,this.events=i,this.activeModel=o??Q(r),this.systemPrompt=this.composeSystemPrompt()}getActiveModel(){return this.activeModel}composeSystemPrompt(){return Or(this.cwd,this.config.systemPromptExtra,hr(this.cwd),Ne(this.cwd))}get messages(){return this.history}reset(){this.history=[]}get messageCount(){return this.history.length}getCwd(){return this.cwd}setCwd(e){this.cwd=e,this.systemPrompt=this.composeSystemPrompt()}async run(e,r){let s=e;if(!this.warnedTightContext&&at(this.activeModel?.contextWindow,this.activeModel?.model??"",this.systemPrompt)&&(this.warnedTightContext=!0,this.events.onNotice?.("\u5F53\u524D\u6A21\u578B\u53EF\u7528\u4E0A\u4E0B\u6587\u8FC7\u5C0F\uFF1A\u7CFB\u7EDF\u63D0\u793A\u8BCD\u5DF2\u5360\u53BB\u7EDD\u5927\u90E8\u5206\u7A97\u53E3\uFF0C\u5386\u53F2\u4E0E\u5DE5\u5177\u8F93\u51FA\u5C06\u65E0\u6CD5\u53D1\u9001\u3002\u53EF\u7CBE\u7B80\u9879\u76EE\u89C4\u5219\uFF08.xuanzhu/rules.md\uFF09\u6216 systemPromptExtra\uFF0C\u6216\u6539\u7528\u7A97\u53E3\u66F4\u5927\u7684\u6A21\u578B\uFF08xzh model context <id> <\u5927\u5C0F>\uFF09\u3002")),this.config.intent?.enabled){this.events.onStatus("\u5206\u6790\u610F\u56FE\u4E2D");let c=await this.analyzeIntent(e,r);if(r?.aborted){this.events.onStatus("\u5DF2\u4E2D\u65AD");return}c?(s=c,this.events.onIntent?.(c,e)):this.events.onNotice?.("\u610F\u56FE\u5206\u6790\u672A\u8FD4\u56DE\u5185\u5BB9\uFF0C\u5DF2\u6309\u539F\u59CB\u8F93\u5165\u7EE7\u7EED\u3002")}let i=[{role:"user",content:s}],o=Math.max(1,Math.floor(this.config.maxToolRounds)||1),a=()=>{for(let c of i)this.history.push(c);this.trimHistory()},l=()=>{let c=[];for(let u=0;u<i.length;u++){let d=i[u];if(c.push(d),d.role!=="assistant"||!d.toolCalls?.length)continue;let h=d.toolCalls.length,m=0;for(let p=u+1;p<i.length&&m<h;p++)i[p].role==="tool"&&m++;if(m<h){c.pop();break}}if(c.length>1){for(let u of c)this.history.push(u);this.trimHistory()}};try{for(let c=0;c<o;c++){if(r?.aborted){l(),this.events.onStatus("\u5DF2\u4E2D\u65AD");return}this.trimHistory(),this.events.onStatus("\u601D\u8003\u4E2D",`\u7B2C ${c+1} \u8F6E`);let{text:u,toolCalls:d}=await this.streamAssistant(r,0,new Set,i);if(r?.aborted){l(),this.events.onStatus("\u5DF2\u4E2D\u65AD");return}if(i.push({role:"assistant",content:u,toolCalls:d.length>0?d:void 0}),d.length===0){a(),this.events.onStatus("\u5C31\u7EEA");return}for(let h of d){let m=await this.runTool(h,r);if(i.push({role:"tool",content:m.content,toolCallId:h.id,name:h.name}),this.events.onToolEnd(h,m),r?.aborted){l(),this.events.onStatus("\u5DF2\u4E2D\u65AD");return}}}a(),this.events.onStatus("\u5DF2\u8FBE\u5DE5\u5177\u8C03\u7528\u4E0A\u9650",`\u6700\u591A ${o} \u8F6E`)}catch(c){if(l(),r?.aborted){this.events.onStatus("\u5DF2\u4E2D\u65AD");return}throw c}}async analyzeIntent(e,r){let s=this.config.intent?.prompt?.trim()||Pt,i=At(s,e),o="";try{let l=this.provider.chat({messages:[{role:"user",content:i}],tools:[],temperature:this.config.temperature,signal:r});for await(let c of l)c.type==="text"&&(o+=c.text)}catch(l){return r?.aborted||this.events.onNotice?.(`\u610F\u56FE\u5206\u6790\u8BF7\u6C42\u5931\u8D25\uFF08${H(l).split(`
|
|
129
|
+
`)[0]}\uFF09\uFF0C\u5DF2\u6309\u539F\u59CB\u8F93\u5165\u7EE7\u7EED\u3002`),null}let a=o.trim();return a.length>0?a:null}async streamAssistant(e,r=0,s=new Set,i=[],o=1){this.activeModel&&s.add(this.activeModel.id);let a=[{role:"system",content:this.systemPrompt},...this.buildConversation(i,o)],l="",c=[],u=!1;try{let d=this.provider.chat({messages:a,tools:Ar(),temperature:this.config.temperature,signal:e,onRetry:(h,m,p)=>{this.events.onStatus(`\u7F51\u7EDC\u4E2D\u65AD\uFF0C\u6B63\u5728\u91CD\u8BD5 (${h}/${m})`,H(p).split(`
|
|
130
|
+
`)[0])}});for await(let h of d){if(e?.aborted)break;switch(u=!0,h.type){case"text":l+=h.text,this.events.onText(h.text);break;case"reasoning":this.events.onReasoning?.(h.text);break;case"tool_call":c.push(h.toolCall);break;case"done":break}}return{text:l,toolCalls:c}}catch(d){if(e?.aborted)throw d;if(!u&&!e?.aborted&&o>=1&&Ee(d))return this.events.onStatus("\u4E0A\u4E0B\u6587\u8D85\u9650","\u5DF2\u6536\u655B\u5386\u53F2\uFF0C\u6B63\u5728\u91CD\u8BD5"),this.streamAssistant(e,r,s,i,ts);if(this.handleModelFailure(d,s,!u)&&r<rs)return this.streamAssistant(e,r+1,s,i,o);throw d}}handleModelFailure(e,r,s=!0){let i=this.activeModel;if(!i)return!1;let o=H(e).split(`
|
|
131
|
+
`)[0];if(Qe(e))return this.events.onNotice?.(`\u26A0 \u6A21\u578B ${i.id} \u7684\u914D\u7F6E\u53EF\u80FD\u6709\u8BEF\uFF08${o}\uFF09\u3002\u5DF2\u8DF3\u8FC7\u6743\u91CD\u8870\u51CF \u2014\u2014 \u8BF7\u68C0\u67E5 provider\u3001API Key \u4E0E baseUrl\u3002`),!1;let a=Lt(this.config,i.id);if(!a||(this.persistConfig(),a.reset?(this.events.onNotice?.(`\u26A0 \u6A21\u578B ${i.id} \u8C03\u7528\u5931\u8D25\uFF08${o}\uFF09\uFF1B\u6240\u6709\u6A21\u578B\u6743\u91CD\u5747\u5DF2\u8017\u5C3D\uFF0C\u5DF2\u628A\u5168\u90E8\u6743\u91CD\u91CD\u7F6E\u4E3A ${T}\u3002`),this.events.onStatus("\u6743\u91CD\u5DF2\u91CD\u7F6E")):this.events.onNotice?.(`\u26A0 \u6A21\u578B ${i.id} \u8C03\u7528\u5931\u8D25\uFF08${o}\uFF09\uFF0C\u6743\u91CD\u964D\u4E3A ${a.weight}\u3002`),this.events.onModelChange?.({provider:i.provider,model:i.model,weight:a.reset?T:a.weight,reason:"\u8C03\u7528\u5931\u8D25\u964D\u6743"}),!s))return!1;let l=Q(this.config,r);if(!l||l.id===i.id)return l&&(this.activeModel=l),!1;try{return this.provider=Ie(this.config,l),this.activeModel=l,this.events.onNotice?.(`\u21BB \u5DF2\u5207\u6362\u5230\u6A21\u578B ${l.id}\uFF08\u6743\u91CD ${l.weight}\uFF09\u91CD\u8BD5\u3002`),this.events.onModelChange?.({provider:l.provider,model:l.model,weight:l.weight,reason:"\u8C03\u7528\u5931\u8D25\u964D\u7EA7"}),!0}catch(c){return this.events.onNotice?.(`\u5207\u6362\u6A21\u578B\u5931\u8D25\uFF1A${H(c)}`),!1}}persistConfig(){try{k(this.config)}catch{}}touchesSensitivePath(e,r){if(!Qn.has(e))return!1;let s="";try{let a=JSON.parse(r);typeof a.path=="string"&&(s=a.path)}catch{return!1}if(!s)return!1;let i=he.resolve(this.cwd,F(s)),o=he.relative(this.cwd,i);return o&&(o.startsWith("..")||he.isAbsolute(o))?!0:es.test(i)}async runTool(e,r){let s=$t(e.name);if(!s)return{ok:!1,content:`\u9519\u8BEF\uFF1A\u672A\u77E5\u5DE5\u5177 "${e.name}"`};if(s.danger===!0||this.touchesSensitivePath(s.name,e.arguments)||!!s.requiresConfirmation&&!this.config.autoApprove){let a=e.arguments;try{a=JSON.stringify(JSON.parse(e.arguments),null,2)}catch{}if(!await this.events.confirm({tool:e.name,title:`\u6267\u884C\u5DE5\u5177\uFF1A${e.name}`,detail:a,danger:!!s.danger}))return{ok:!1,denied:!0,content:"\u7528\u6237\u62D2\u7EDD\u4E86\u6B64\u64CD\u4F5C\u3002"}}if(r?.aborted)return{ok:!1,content:"\u64CD\u4F5C\u5DF2\u88AB\u4E2D\u65AD\u3002"};this.events.onToolStart(e);let o={cwd:this.cwd,autoApprove:this.config.autoApprove,emit:a=>this.events.onNotice?.(a),confirm:a=>this.events.confirm(a),signal:r};return Ir(e.name,e.arguments,o)}conversationBudget(){return ot(this.activeModel?.contextWindow,this.activeModel?.model??"",this.systemPrompt)}buildConversation(e,r=1){let s=[...this.history,...e],i=s.length>Dr?s.slice(-Dr):s,o=Math.max(1,Math.floor(this.conversationBudget()*r));return Pe(i,o)}trimHistory(){let e=Pe(this.history,this.conversationBudget());if(e.length===this.history.length)return 0;let r=this.history.length-e.length;return this.history=e,r}};var we="0.1.2";var t={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",italic:"\x1B[3m",underline:"\x1B[4m",inverse:"\x1B[7m",black:"\x1B[30m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",white:"\x1B[37m",gray:"\x1B[90m",brightRed:"\x1B[91m",brightGreen:"\x1B[92m",brightYellow:"\x1B[93m",brightBlue:"\x1B[94m",brightMagenta:"\x1B[95m",brightCyan:"\x1B[96m",brightWhite:"\x1B[97m",bgRed:"\x1B[41m",bgGreen:"\x1B[42m",bgYellow:"\x1B[43m",bgBlue:"\x1B[44m",bgMagenta:"\x1B[45m",bgCyan:"\x1B[46m",bgGray:"\x1B[100m"},N={hide:"\x1B[?25l",show:"\x1B[?25h",up:(n=1)=>`\x1B[${n}A`,down:(n=1)=>`\x1B[${n}B`,right:(n=1)=>`\x1B[${n}C`,left:(n=1)=>`\x1B[${n}D`,to:(n,e)=>`\x1B[${n};${e}H`,col:n=>`\x1B[${n}G`,clearLine:"\x1B[2K",clearToEnd:"\x1B[0K",clearScreen:"\x1B[2J"},Fe={enterAlt:"\x1B[?1049h",exitAlt:"\x1B[?1049l",save:"\x1B[s",restore:"\x1B[u"};function ns(n){return n>=4352&&n<=4447||n>=11904&&n<=12350||n>=12353&&n<=13311||n>=13312&&n<=19903||n>=19968&&n<=40959||n>=40960&&n<=42191||n>=44032&&n<=55203||n>=63744&&n<=64255||n>=65072&&n<=65103||n>=65280&&n<=65376||n>=65504&&n<=65510||n>=127744&&n<=129791||n>=131072&&n<=262141}function P(n){let e=0;for(let r=0;r<n.length;r++){let s=n.codePointAt(r);if(s!==void 0){if(s===27){let i=/^\x1b\[[0-9;?]*[ -/]*[@-~]/.exec(n.slice(r));if(i){r+=i[0].length-1;continue}let o=/^\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)?/.exec(n.slice(r));if(o){r+=o[0].length-1;continue}}if(s>65535&&r++,s===9){e+=8-e%8;continue}s<32||s>=768&&s<=879||s>=8400&&s<=8447||s>=65024&&s<=65039||(e+=ns(s)?2:1)}}return e}function ve(n,e){let r=[];for(let s of n.split(`
|
|
132
|
+
`)){if(s===""){r.push("");continue}let i="",o=0,a=s.match(/\x1b\[[0-9;?]*[A-Za-z]|./gu)??[];for(let l of a){let c=P(l);o+c>e&&i!==""&&(r.push(i),i="",o=0),i+=l,o+=c}r.push(i)}return r}function K(n,e){if(P(n)<=e)return n;let r=n.match(/\x1b\[[0-9;?]*[A-Za-z]|[\s\S]/gu)??[],s="",i=0,o=Math.max(0,e-1);for(let a of r){let l=P(a);if(i+l>o)break;s+=a,i+=l}return`${s}${t.reset}\u2026`}function Nr(n,e){let r=P(n);return n+" ".repeat(Math.max(0,e-r))}function me(n){return n&&n.replace(/\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)?/g,"").replace(/\x1b\[[0-9;?]*[ -/]*[@-~]/g,"").replace(/\x1b[@-Z\\-_]/g,"").replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"")}var ze=class{buffer="";inCodeBlock=!1;codeLang="";push(e){this.buffer+=e;let r=[],s=this.buffer.indexOf(`
|
|
127
133
|
`);for(;s!==-1;){let i=this.buffer.slice(0,s);this.buffer=this.buffer.slice(s+1),r.push(this.renderLine(i)),s=this.buffer.indexOf(`
|
|
128
|
-
`)}return r}peek(){return this.buffer?this.inCodeBlock?`${t.cyan}${this.buffer}${t.reset}`:this.buffer:""}flush(){if(this.buffer.length===0)return this.inCodeBlock=!1,this.codeLang="",[];let e=this.buffer;this.buffer="";let r=this.renderLine(e);return this.inCodeBlock=!1,this.codeLang="",[r]}renderLine(e){let r=e.replace(/\r$/,""),s=r.trimStart();if(s.startsWith("```")){if(!this.inCodeBlock){this.inCodeBlock=!0,this.codeLang=s.slice(3).trim();let a=this.codeLang?` ${this.codeLang} `:"";return`${t.gray}\u250C\u2500${a}${"\u2500".repeat(Math.max(0,6-a.length))}${t.reset}`}return this.inCodeBlock=!1,this.codeLang="",`${t.gray}\u2514\u2500\u2500${t.reset}`}if(this.inCodeBlock)return`${t.cyan}${r}${t.reset}`;let i=/^(#{1,6})\s+(.*)$/.exec(s);if(i){let a=i[2];return i[1].length<=2?`${t.bold}${t.brightWhite}${a}${t.reset}`:`${t.bold}${a}${t.reset}`}if(s.startsWith("> "))return`${t.gray}\u2502 ${s.slice(2)}${t.reset}`;let o=/^(\s*)([-*+]|\d+\.)\s+(.*)$/.exec(r);return o?`${o[1]}${t.blue}${o[2]}${t.reset} ${o[3]}`:/^(-{3,}|\*{3,}|_{3,})$/.test(s)?`${t.gray}${"\u2500".repeat(20)}${t.reset}`:this.renderInline(r)}renderInline(e){let r=e;return r=r.replace(/`([^`]+)`/g,(s,i)=>`${t.cyan}${i}${t.reset}`),r=r.replace(/\*\*([^*]+)\*\*/g,(s,i)=>`${t.bold}${i}${t.reset}`),r=r.replace(/(^|\s)\*([^*\s][^*]*)\*(?=\s|$)/g,"$1$2"),r}};var
|
|
134
|
+
`)}return r}peek(){return this.buffer?this.inCodeBlock?`${t.cyan}${this.buffer}${t.reset}`:this.buffer:""}flush(){if(this.buffer.length===0)return this.inCodeBlock=!1,this.codeLang="",[];let e=this.buffer;this.buffer="";let r=this.renderLine(e);return this.inCodeBlock=!1,this.codeLang="",[r]}renderLine(e){let r=e.replace(/\r$/,""),s=r.trimStart();if(s.startsWith("```")){if(!this.inCodeBlock){this.inCodeBlock=!0,this.codeLang=s.slice(3).trim();let a=this.codeLang?` ${this.codeLang} `:"";return`${t.gray}\u250C\u2500${a}${"\u2500".repeat(Math.max(0,6-a.length))}${t.reset}`}return this.inCodeBlock=!1,this.codeLang="",`${t.gray}\u2514\u2500\u2500${t.reset}`}if(this.inCodeBlock)return`${t.cyan}${r}${t.reset}`;let i=/^(#{1,6})\s+(.*)$/.exec(s);if(i){let a=i[2];return i[1].length<=2?`${t.bold}${t.brightWhite}${a}${t.reset}`:`${t.bold}${a}${t.reset}`}if(s.startsWith("> "))return`${t.gray}\u2502 ${s.slice(2)}${t.reset}`;let o=/^(\s*)([-*+]|\d+\.)\s+(.*)$/.exec(r);return o?`${o[1]}${t.blue}${o[2]}${t.reset} ${o[3]}`:/^(-{3,}|\*{3,}|_{3,})$/.test(s)?`${t.gray}${"\u2500".repeat(20)}${t.reset}`:this.renderInline(r)}renderInline(e){let r=e;return r=r.replace(/`([^`]+)`/g,(s,i)=>`${t.cyan}${i}${t.reset}`),r=r.replace(/\*\*([^*]+)\*\*/g,(s,i)=>`${t.bold}${i}${t.reset}`),r=r.replace(/(^|\s)\*([^*\s][^*]*)\*(?=\s|$)/g,"$1$2"),r}};var Br=require("child_process"),pe=x(require("fs")),qe=x(require("os")),U=x(require("path"));var Kr=2e3,ss=8192,is=1200,He=class{lines=[];partial="";running;killTimer;cwd;onChange;parseState="text";parseSeq="";constructor(e,r){this.cwd=e,this.onChange=r,this.pushLine(`${t.gray}\u7EC8\u7AEF\u5C31\u7EEA \xB7 \u547D\u4EE4\u5728\u5F53\u524D\u9879\u76EE\u76EE\u5F55\u4E0B\u6267\u884C${t.reset}`)}getCwd(){return this.cwd}isRunning(){return this.running!==void 0}setCwd(e){this.cwd=e,this.pushLine(`${t.gray}\u2500\u2500 \u5DE5\u4F5C\u76EE\u5F55\u5DF2\u5207\u6362\uFF1A${e}${t.reset}`),this.onChange()}clear(){this.lines=[],this.partial="",this.onChange()}notice(e){this.pushLine(e),this.onChange()}visibleLines(){return this.partial?[...this.lines,this.partial]:this.lines}run(e){let r=e.trim();if(!r)return;if(this.running){this.pushLine(`${t.yellow}\u26A0 \u4E0A\u4E00\u6761\u547D\u4EE4\u4ECD\u5728\u8FD0\u884C\uFF0C\u8BF7\u5148 Ctrl+C \u4E2D\u65AD${t.reset}`),this.onChange();return}if(r==="clear"||r==="cls"){this.clear();return}if(this.handleCd(r))return;this.flushPartial(),this.pushLine(`${t.brightGreen}\u276F${t.reset} ${t.bold}${r}${t.reset}`);let s=process.env.SHELL||"/bin/bash",i;try{i=(0,Br.spawn)(s,["-c",r],{cwd:this.cwd,env:{...process.env,TERM:"xterm-256color",CLICOLOR_FORCE:"1",FORCE_COLOR:"1"},stdio:["ignore","pipe","pipe"],detached:!0})}catch(a){this.pushLine(`${t.red}\u2717 \u542F\u52A8\u5931\u8D25\uFF1A${a instanceof Error?a.message:String(a)}${t.reset}`),this.onChange();return}this.running=i;let o=a=>this.feed(a.toString("utf8"));i.stdout?.on("data",o),i.stderr?.on("data",o),i.on("error",a=>{this.flushPartial(),this.pushLine(`${t.red}\u2717 \u6267\u884C\u51FA\u9519\uFF1A${a.message}${t.reset}`),this.running=void 0,this.onChange()}),i.on("close",(a,l)=>{this.flushPartial(),l?this.pushLine(`${t.yellow}\u23F9 \u5DF2\u4E2D\u65AD\uFF08${l}\uFF09${t.reset}`):a===0?this.pushLine(`${t.gray}\u2713 \u5B8C\u6210${t.reset}`):this.pushLine(`${t.red}\u2717 \u9000\u51FA\u7801 ${a}${t.reset}`),this.running=void 0,this.onChange()}),this.onChange()}interrupt(){let e=this.running;if(!e||e.pid===void 0)return;let r=e.pid,s=i=>{try{process.kill(-r,i)}catch{try{e.kill(i)}catch{}}};s("SIGINT"),this.killTimer&&clearTimeout(this.killTimer),this.killTimer=setTimeout(()=>{this.killTimer=void 0,this.running===e&&s("SIGKILL")},is)}dispose(){this.killTimer&&(clearTimeout(this.killTimer),this.killTimer=void 0);let e=this.running;if(this.running=void 0,!(!e||e.pid===void 0))try{process.kill(-e.pid,"SIGKILL")}catch{try{e.kill("SIGKILL")}catch{}}}handleCd(e){let r=/^cd(?:\s+([\s\S]*))?$/.exec(e);if(!r)return!1;let s=(r[1]??"").trim().replace(/^['"]|['"]$/g,""),i;if(!s||s==="~")i=qe.homedir();else{let o=s.startsWith("~/")?U.join(qe.homedir(),s.slice(2)):s;i=U.isAbsolute(o)?o:U.resolve(this.cwd,o)}try{if(!pe.statSync(i).isDirectory())return this.pushLine(`${t.red}cd: \u4E0D\u662F\u76EE\u5F55\uFF1A${i}${t.reset}`),this.onChange(),!0}catch{return this.pushLine(`${t.red}cd: \u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${i}${t.reset}`),this.onChange(),!0}return this.cwd=i,this.flushPartial(),this.pushLine(`${t.gray}cd ${this.cwd}${t.reset}`),this.onChange(),!0}feed(e){let r=e.replace(/\r\n/g,`
|
|
129
135
|
`),s=this.partial,i=this.parseState,o=this.parseSeq;for(let a of r){if(i==="osc"){(a==="\x07"||a==="\\"&&o.endsWith("\x1B"))&&(i="text"),o+=a;continue}if(i==="esc"){if(a==="["){i="csi",o="\x1B[";continue}if(a==="]"){i="osc",o="\x1B]";continue}i="text";continue}if(i==="csi"){o+=a,a>="@"&&a<="~"&&(a==="m"&&(s+=o),i="text");continue}if(a==="\x1B"){i="esc",o="\x1B";continue}if(a==="\r"){s="";continue}if(a===`
|
|
130
|
-
`){this.pushLine(s),s="";continue}a==="\x07"||a==="\b"||(s+=a)}s.length>
|
|
131
|
-
`))s.trim().length>0&&this.lines.push(`${t.gray} ${s}${t.reset}`);this.scheduleRender()}handleIntent(e,r){let o
|
|
132
|
-
`).map(a=>a.trim()).filter(a=>a.length>0);this.lines.push(`${t.gray}\u2301 \u610F\u56FE\u5206\u6790\u7ED3\u679C\uFF08\u5C06\u4F5C\u4E3A\u672C\u6B21\u8F93\u5165\uFF09${t.reset}`);for(let a of o.slice(0,14))this.lines.push(`${t.gray} ${a}${t.reset}`);o.length>14&&this.lines.push(`${t.gray} \u2026\uFF08\u5171 ${o.length} \u884C\uFF0C\u5B8C\u6574\u5185\u5BB9\u5DF2\u4F5C\u4E3A\u8F93\u5165\u53D1\u9001\uFF09${t.reset}`),this.lines.push(`${t.gray} \u539F\u59CB\u6D88\u606F\uFF1A${
|
|
136
|
+
`){this.pushLine(s),s="";continue}a==="\x07"||a==="\b"||(s+=a)}s.length>ss&&(this.pushLine(s),s=""),this.parseState=i,this.parseSeq=o,this.partial=s,this.onChange()}pushLine(e){this.lines.push(e),this.lines.length>Kr&&this.lines.splice(0,this.lines.length-Kr)}flushPartial(){this.partial&&(this.pushLine(this.partial),this.partial="")}},os=["alias","cd","clear","cls","echo","exit","export","false","history","pwd","set","source","true","type","unalias","unset","which"],je=null;function as(){if(je)return je;let n=new Set(os);for(let e of(process.env.PATH??"").split(U.delimiter)){if(!e)continue;let r;try{r=pe.readdirSync(e)}catch{continue}for(let s of r)n.add(s)}return je=[...n].sort(),je}function ls(n){if(n.length===0)return"";let e=n[0];for(let r of n.slice(1)){let s=0;for(;s<e.length&&s<r.length&&e[s]===r[s];)s++;if(e=e.slice(0,s),!e)break}return e}function cs(n,e){return e?e==="~"||e.startsWith("~/")?U.join(qe.homedir(),e.slice(1)):U.isAbsolute(e)?e:U.resolve(n,e):n}function Ur(n,e){if(n.isDirectory())return!0;if(!n.isSymbolicLink())return!1;try{return pe.statSync(U.join(e,n.name)).isDirectory()}catch{return!1}}function us(n,e,r){let s=e.lastIndexOf("/"),i=s>=0?e.slice(0,s+1):"",o=e.slice(s+1),a=cs(n,i),l;try{l=pe.readdirSync(a,{withFileTypes:!0})}catch{return{dirPart:i,base:o,names:[]}}let c=l.filter(u=>r&&!Ur(u,a)||u.name.startsWith(".")&&!o.startsWith(".")?!1:u.name.startsWith(o)).map(u=>u.name+(Ur(u,a)?"/":"")).sort();return{dirPart:i,base:o,names:c}}function Wr(n,e,r){let i=e.slice(0,r).replace(/\s+$/,""),o=i.lastIndexOf(" ")+1,a=i.slice(o),l=i.slice(0,o),c="",u=a.lastIndexOf("=");u>=0&&/^[A-Za-z_][A-Za-z0-9_]*$/.test(a.slice(0,u))&&(c=a.slice(0,u+1),a=a.slice(u+1));let d="";(a.startsWith('"')||a.startsWith("'"))&&(d=a[0],a=a.slice(1));let h=a.startsWith("./")||a.startsWith("../")||a.startsWith("/")||a.startsWith("~"),m=l.trim().length===0&&!h&&c.length===0,p=y=>`${c}${d}${y}`,f="",$;if(m)$=as().filter(y=>y.startsWith(a));else{let y=l.trim().split(/\s+/)[0]??"",I=us(n,a,y==="cd");f=I.dirPart,$=I.names}if($.length===0)return null;if($.length===1){let y=f+$[0],I=y.endsWith("/"),v=d&&!I?d:"",B=I?"":" ",ae=l+p(y)+v+B;return{line:ae+e.slice(r),cursor:ae.length,candidates:[]}}let g=m?a:a.slice(f.length),M=ls($);if(M.length>g.length){let y=l+p(f+M);return{line:y+e.slice(r),cursor:y.length,candidates:[]}}return{line:e,cursor:r,candidates:$.map(y=>p(f+y))}}function Ze(){try{process.stdout.write("\x1B[>4m\x1B[?1000l\x1B[?1006l\x1B[?7h"+t.reset+N.show+Fe.exitAlt)}catch{}try{process.stdin.isTTY&&process.stdin.isRaw&&process.stdin.setRawMode(!1)}catch{}}var Ge=class n{options;agent;markdown=new ze;cwd;modelProviderLabel;modelLabel;modelWeight;lines=[];input="";inputCursor=0;scrollOffset=0;statusText="\u5C31\u7EEA";statusDetail="";busy=!1;exited=!1;autoApprove;intentEnabled;history=[];historyIndex=-1;pendingConfirm;abortController;keyBuffer="";escTimer;projectDirCreated;needsRender=!1;mouseCapture=!0;lastAnswerStart=0;streamingPreview="";termVisible=!0;termFocus=!1;termScroll=0;lastLeftWidth=0;lastPhysicalCount=0;lastTermPhysicalCount=0;termInput="";termInputCursor=0;termHistory=[];termHistoryIndex=-1;term;onData=e=>this.handleData(e);onResize=()=>{this.lastPhysicalCount=-1,this.lastTermPhysicalCount=-1,this.scheduleRender()};constructor(e){this.options=e,this.cwd=e.cwd,this.autoApprove=e.autoApprove,this.intentEnabled=e.intentEnabled??e.config.intent?.enabled===!0,e.config.intent={...e.config.intent??{enabled:!1},enabled:this.intentEnabled},this.modelProviderLabel=e.providerLabel,this.modelLabel=e.model,this.modelWeight=e.modelWeight,this.term=new He(e.cwd,()=>this.scheduleRender());let r=ht(e.cwd);r.created&&(this.projectDirCreated=r.paths.dir);let s={onText:i=>this.handleTextDelta(i),onReasoning:()=>{},onToolStart:i=>this.handleToolStart(i),onToolEnd:(i,o)=>this.handleToolEnd(i,o),onStatus:(i,o)=>{this.statusText=i,this.statusDetail=o??"",this.scheduleRender()},onNotice:i=>this.handleNotice(i),onIntent:(i,o)=>this.handleIntent(i,o),onModelChange:i=>this.handleModelChange(i),confirm:i=>this.requestConfirm(i)};this.agent=new We(e.provider,e.config,e.cwd,s,e.activeModel)}async start(){this.enterTerminal(),this.projectDirCreated&&(this.lines.push(`${t.green}\u2713 \u5DF2\u521D\u59CB\u5316\u9879\u76EE\u76EE\u5F55 ${this.projectDirCreated}${t.reset}`),this.lines.push(`${t.gray} \xB7 memory/ \u9879\u76EE\u8BB0\u5FC6\uFF08\u7384\u732A\u5199\u5165\uFF0C\u8DE8\u4F1A\u8BDD\u590D\u7528\uFF09${t.reset}`),this.lines.push(`${t.gray} \xB7 rules.md \u9879\u76EE\u89C4\u5219\uFF08\u5185\u5BB9\u6CE8\u5165\u7CFB\u7EDF\u63D0\u793A\u8BCD\uFF09${t.reset}`),this.lines.push("")),this.scheduleRender(),await new Promise(e=>{this.resolveExit=e})}resolveExit;enterTerminal(){process.stdout.write(Fe.enterAlt+N.hide+"\x1B[?7l"+(this.mouseCapture?"\x1B[?1000h\x1B[?1006h":"\x1B[?1000l\x1B[?1006l")+this.extendedKeyRequest()),process.stdin.isTTY&&process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8"),process.stdin.on("data",this.onData),process.stdout.on("resize",this.onResize)}flushStreamingPreview(){this.streamingPreview&&(this.lines.push(this.streamingPreview),this.streamingPreview="")}static MAX_OUTPUT_LINES=4e3;trimOutputLines(){let e=n.MAX_OUTPUT_LINES;this.lines.length>e&&this.lines.splice(0,this.lines.length-e)}exitTerminal(){this.escTimer&&(clearTimeout(this.escTimer),this.escTimer=void 0),process.stdin.off("data",this.onData),process.stdout.off("resize",this.onResize),process.stdin.isTTY&&process.stdin.setRawMode(!1),process.stdin.pause(),process.stdout.write("\x1B[>4m\x1B[?1000l\x1B[?1006l\x1B[?7h"+t.reset+N.show+Fe.exitAlt)}extendedKeyRequest(){let e=process.env.TERM??"",r=process.env.TERM_PROGRAM??"";return process.env.KITTY_WINDOW_ID||/kitty|ghostty/i.test(e)||/kitty|ghostty/i.test(r)?"":"\x1B[>4;2m"}shutdown(){this.exited||(this.exited=!0,this.term.dispose(),this.exitTerminal(),this.resolveExit?.())}handleTextDelta(e){let r=this.markdown.push(me(e));r.length>0&&this.lines.push(...r),this.streamingPreview=this.markdown.peek(),this.scheduleRender()}handleToolStart(e){this.flushStreamingPreview();let r=fs(e);this.lines.push(`${t.magenta}\u23FA${t.reset} ${t.bold}${e.name}${t.reset} ${t.gray}${r}${t.reset}`),this.statusText=`\u6267\u884C ${e.name}`,this.scheduleRender()}handleToolEnd(e,r){this.flushStreamingPreview();let s=me(r.summary??(r.ok?"\u5B8C\u6210":"\u5931\u8D25")).slice(0,60),i=r.denied?`${t.yellow}\u23BF \u5DF2\u62D2\u7EDD${t.reset}`:r.ok?`${t.green}\u23BF ${s}${t.reset}`:`${t.red}\u23BF ${s}${t.reset}`;this.lines.push(` ${i}`),this.statusText="\u601D\u8003\u4E2D",this.scheduleRender()}handleNotice(e){this.flushStreamingPreview();let r=me(e);for(let s of r.split(`
|
|
137
|
+
`))s.trim().length>0&&this.lines.push(`${t.gray} ${s}${t.reset}`);this.scheduleRender()}handleIntent(e,r){let o=me(e).split(`
|
|
138
|
+
`).map(a=>a.trim()).filter(a=>a.length>0);this.lines.push(`${t.gray}\u2301 \u610F\u56FE\u5206\u6790\u7ED3\u679C\uFF08\u5C06\u4F5C\u4E3A\u672C\u6B21\u8F93\u5165\uFF09${t.reset}`);for(let a of o.slice(0,14))this.lines.push(`${t.gray} ${a}${t.reset}`);o.length>14&&this.lines.push(`${t.gray} \u2026\uFF08\u5171 ${o.length} \u884C\uFF0C\u5B8C\u6574\u5185\u5BB9\u5DF2\u4F5C\u4E3A\u8F93\u5165\u53D1\u9001\uFF09${t.reset}`),this.lines.push(`${t.gray} \u539F\u59CB\u6D88\u606F\uFF1A${K(r.replace(/\s+/g," "),60)}${t.reset}`),this.scheduleRender()}handleModelChange(e){this.modelProviderLabel=Z(e.provider)?.label??e.provider,this.modelLabel=e.model,this.modelWeight=e.weight,e.reason!=="\u8C03\u7528\u5931\u8D25\u964D\u6743"&&this.lines.push(`${t.yellow}\u21C4 \u6A21\u578B\u5DF2\u5207\u6362\u4E3A ${e.provider}/${e.model}\uFF08\u6743\u91CD ${e.weight}\uFF09${t.reset}`),this.scheduleRender()}requestConfirm(e){return new Promise(r=>{this.pendingConfirm={request:e,resolve:r,selected:!0},this.scheduleRender()})}handleData(e){this.keyBuffer+=e,this.drainKeys()}drainKeys(){for(;;){let e=this.readKey();if(e===null){this.keyBuffer.startsWith("\x1B")&&(this.escTimer&&clearTimeout(this.escTimer),this.escTimer=setTimeout(()=>{this.escTimer=void 0;let r=this.keyBuffer;this.keyBuffer="",r==="\x1B"&&this.handleKey("\x1B")},40));return}if(this.escTimer&&(clearTimeout(this.escTimer),this.escTimer=void 0),this.handleKey(e),this.exited)return}}readKey(){let e=this.keyBuffer;if(e.length===0)return null;if(e[0]==="\x1B"){let i=/^\x1b\[[0-9:;<=>?]*[@-~]/.exec(e);if(i)return this.keyBuffer=e.slice(i[0].length),i[0];let o=/^\x1bO[A-Za-z]/.exec(e);return o?(this.keyBuffer=e.slice(o[0].length),o[0]):/^\x1b\[?[0-9:;<=>?]*$/.test(e)?null:e.length>=2?(this.keyBuffer=e.slice(2),e.slice(0,2)):null}let r=e.codePointAt(0);if(r===void 0)return null;let s=String.fromCodePoint(r);return this.keyBuffer=e.slice(s.length),s}handleKey(e){let r=ps(e);if(this.pendingConfirm){this.handleConfirmKey(r);return}let s=/^\x1b\[<(\d+);(\d+);(\d+)([Mm])$/.exec(r);if(s){this.handleMouse(s);return}if(r==="\x1B[Z"){this.toggleFocus();return}if(this.termFocus){this.handleTermKey(r);return}switch(r){case"":this.busy?(this.abortController?.abort(),this.statusText="\u4E2D\u65AD\u4E2D\u2026",this.scheduleRender()):this.input.length>0?(this.input="",this.inputCursor=0,this.scheduleRender()):this.shutdown();return;case"":this.busy&&(this.abortController?.abort(),this.statusText="\u4E2D\u65AD\u4E2D\u2026",this.scheduleRender());return;case"\r":this.submit();return;case`
|
|
133
139
|
`:this.insertText(`
|
|
134
|
-
`);return;case"\x7F":case"\b":this.backspace();return;case"":this.inputCursor=0,this.scheduleRender();return;case"":this.inputCursor=this.input.length,this.scheduleRender();return;case"\f":this.lines=[],this.scrollOffset=0,this.scheduleRender();return;case"\x1B[A":this.navigateHistory(-1);return;case"\x1B[B":this.navigateHistory(1);return;case"\x1B[C":this.moveCursor(1);return;case"\x1B[D":this.moveCursor(-1);return;case"\x1B[5~":this.scrollBy(5);return;case"\x1B[6~":this.scrollBy(-5);return;case"\x1B[1;2A":this.scrollBy(1);return;case"\x1B[1;2B":this.scrollBy(-1);return;case"\x1B[H":case"\x1B[1~":case"\x1B[7~":this.scrollToTop();return;case"\x1B[F":case"\x1B[4~":case"\x1B[8~":this.scrollToBottom();return;default:r.charCodeAt(0)>=32&&this.insertText(r)}}handleMouse(e){let r=Number(e[1]),s=Number(e[2]),i=e[4]==="M",o=this.resolveTermWidth(process.stdout.columns||80),a=this.lastLeftWidth>0&&o>0&&s>this.lastLeftWidth+1;if(i&&(r&64)===64){let c=(r&1)===0?3:-3;a?this.scrollTermBy(c):this.scrollBy(c);return}i&&(r&3)===0&&(r&32)===0&&a!==this.termFocus&&(this.termFocus=a,this.scheduleRender())}toggleFocus(){if(!this.termVisible){this.lines.push(`${t.gray}\u7EC8\u7AEF\u9762\u677F\u5DF2\u9690\u85CF\uFF0C\u8F93\u5165 /term \u53EF\u91CD\u65B0\u663E\u793A\u3002${t.reset}`),this.scheduleRender();return}this.termFocus=!this.termFocus,this.scheduleRender()}handleTermKey(e){switch(e){case"":this.term.isRunning()&&(this.term.interrupt(),this.scheduleRender());return;case"":this.term.isRunning()?this.term.interrupt():this.termInput.length>0?(this.termInput="",this.termInputCursor=0):this.termFocus=!1,this.scheduleRender();return;case"\r":this.submitTermCommand();return;case" ":this.applyTermCompletion();return;case"\x7F":case"\b":this.termBackspace();return;case"":this.termInputCursor=0,this.scheduleRender();return;case"":this.termInputCursor=this.termInput.length,this.scheduleRender();return;case"\f":this.term.clear(),this.scrollTermToBottom();return;case"\x1B[A":this.navigateTermHistory(-1);return;case"\x1B[B":this.navigateTermHistory(1);return;case"\x1B[C":this.termInputCursor=Math.min(this.termInput.length,this.termInputCursor+1),this.scheduleRender();return;case"\x1B[D":this.termInputCursor=Math.max(0,this.termInputCursor-1),this.scheduleRender();return;case"\x1B[5~":this.scrollTermBy(5);return;case"\x1B[6~":this.scrollTermBy(-5);return;case"\x1B[1;2A":this.scrollTermBy(1);return;case"\x1B[1;2B":this.scrollTermBy(-1);return;case"\x1B[H":case"\x1B[1~":case"\x1B[7~":this.scrollTermToTop();return;case"\x1B[F":case"\x1B[4~":case"\x1B[8~":this.scrollTermToBottom();return;default:e.charCodeAt(0)>=32&&(this.termInput=this.termInput.slice(0,this.termInputCursor)+e+this.termInput.slice(this.termInputCursor),this.termInputCursor+=e.length,this.termScroll=0,this.scheduleRender())}}termBackspace(){if(this.termInputCursor<=0)return;let e=this.termInputCursor-1,r=this.termInput.charCodeAt(e);r>=56320&&r<=57343&&e>0&&(e-=1),this.termInput=this.termInput.slice(0,e)+this.termInput.slice(this.termInputCursor),this.termInputCursor=e,this.scheduleRender()}navigateTermHistory(e){this.termHistory.length!==0&&(this.termHistoryIndex===-1&&(this.termHistoryIndex=this.termHistory.length),this.termHistoryIndex+=e,this.termHistoryIndex<0&&(this.termHistoryIndex=0),this.termHistoryIndex>=this.termHistory.length?(this.termHistoryIndex=-1,this.termInput="",this.termInputCursor=0):(this.termInput=this.termHistory[this.termHistoryIndex],this.termInputCursor=this.termInput.length),this.scheduleRender())}submitTermCommand(){let e=this.termInput.trim();e&&(this.termInput="",this.termInputCursor=0,this.termScroll=0,this.termHistory.push(e),this.termHistoryIndex=-1,this.term.run(e),this.scheduleRender())}applyTermCompletion(){let e=
|
|
135
|
-
`);this.lines.push(`${r} ${t.brightGreen}${t.bold}${s}${t.reset}`);for(let a of i)this.lines.push(`${t.brightGreen}${t.bold}\u2502${t.reset} ${t.brightGreen}${a}${t.reset}`);this.lines.push(""),this.busy=!0,this.statusText="\u601D\u8003\u4E2D",this.statusDetail="",this.abortController=new AbortController,this.scheduleRender();let o={label:this.modelLabel,weight:this.modelWeight};try{await this.agent.run(e,this.abortController.signal)}catch(a){let[l,...c]=
|
|
136
|
-
`);this.lines.push(`${t.red}\u2717 ${l}${t.reset}`);for(let d of c)this.lines.push(`${t.gray} ${d}${t.reset}`);let u=o.weight!==void 0?`\uFF08\u6743\u91CD ${o.weight}\uFF09`:"";this.lines.push(`${t.gray} \u672C\u6B21\u8BF7\u6C42\u4F7F\u7528\u7684\u6A21\u578B\uFF1A${this.modelProviderLabel} / ${o.label}${u}${t.reset}`)}finally{let a=this.markdown.flush();a.length>0&&this.lines.push(...a),this.streamingPreview="",this.lines.push(""),this.busy=!1,this.abortController=void 0,this.statusText="\u5C31\u7EEA",this.scheduleRender()}}handleCommand(e){let[r,...s]=e.slice(1).split(/\s+/),i=s.join(" ");switch(r){case"help":case"h":this.printHelp();break;case"clear":this.lines=[];break;case"reset":this.agent.reset(),this.lines.push(`${t.gray}\u4F1A\u8BDD\u5DF2\u91CD\u7F6E\u3002${t.reset}`);break;case"exit":case"quit":case"q":this.shutdown();return;case"cwd":this.lines.push(`${t.gray}${this.cwd}${t.reset}`);break;case"switch":{i?this.switchDirectory(i):(this.lines.push(`${t.gray}\u5F53\u524D\u76EE\u5F55\uFF1A${this.cwd}${t.reset}`),this.lines.push(`${t.gray}\u7528\u6CD5\uFF1A/switch <\u76EE\u5F55\u8DEF\u5F84>${t.reset}`));break}case"term":{i==="clear"?this.term.clear():i==="focus"?(this.termVisible=!0,this.termFocus=!0):(this.termVisible=!this.termVisible,this.termVisible||(this.termFocus=!1),this.lines.push(`${t.gray}\u7EC8\u7AEF\u9762\u677F\uFF1A${this.termVisible?"\u663E\u793A":"\u9690\u85CF"}\uFF08Shift+Tab \u6216\u9F20\u6807\u70B9\u51FB\u5207\u6362\u7126\u70B9\uFF09${t.reset}`));break}case"auto":{let o=i==="on"?!0:i==="off"?!1:!this.autoApprove;this.autoApprove=o,this.options.config.autoApprove=o;try{R(this.options.config)}catch(a){this.lines.push(`${t.yellow}\u26A0 \u914D\u7F6E\u4FDD\u5B58\u5931\u8D25\uFF1A${a instanceof Error?a.message:String(a)}${t.reset}`)}this.lines.push(o?`${t.gray}\u81EA\u52A8\u6279\u51C6\uFF1A${t.brightYellow}\u5F00${t.reset}${t.gray} \u2014\u2014 \u6240\u6709\u5DE5\u5177\uFF08\u542B\u5199\u6587\u4EF6\u3001\u6267\u884C\u547D\u4EE4\uFF09\u5C06\u76F4\u63A5\u6267\u884C\uFF0C\u4E0D\u518D\u8BE2\u95EE\uFF1B\u5DF2\u5199\u5165\u914D\u7F6E\u3002${t.reset}`:`${t.gray}\u81EA\u52A8\u6279\u51C6\uFF1A\u5173 \u2014\u2014 \u5199\u6587\u4EF6 / \u7F16\u8F91\u6587\u4EF6 / \u6267\u884C\u547D\u4EE4\u524D\u4F1A\u8BF7\u6C42\u786E\u8BA4\uFF1B\u5DF2\u5199\u5165\u914D\u7F6E\u3002${t.reset}`);break}case"intent":{let o=i==="on"?!0:i==="off"?!1:!this.intentEnabled;this.intentEnabled=o,this.options.config.intent={...this.options.config.intent??{enabled:!1},enabled:o};try{R(this.options.config)}catch(a){this.lines.push(`${t.yellow}\u26A0 \u914D\u7F6E\u4FDD\u5B58\u5931\u8D25\uFF1A${a instanceof Error?a.message:String(a)}${t.reset}`)}this.lines.push(o?`${t.gray}\u610F\u56FE\u5206\u6790\uFF1A${t.brightGreen}\u5F00${t.reset}${t.gray} \u2014\u2014 \u6BCF\u6761\u6D88\u606F\u4F1A\u5148\u7528\u6A21\u677F\u5305\u88F9\u5E76\u8BF7\u6C42\u6A21\u578B\uFF0C\u8FD4\u56DE\u7684\u5206\u6790\u7ED3\u679C\u4F5C\u4E3A\u672C\u6B21\u8F93\u5165\uFF1B\u5DF2\u5199\u5165\u914D\u7F6E\u3002${t.reset}`:`${t.gray}\u610F\u56FE\u5206\u6790\uFF1A\u5173 \u2014\u2014 \u76F4\u63A5\u4F7F\u7528\u4F60\u8F93\u5165\u7684\u5185\u5BB9\uFF1B\u5DF2\u5199\u5165\u914D\u7F6E\u3002${t.reset}`);break}case"model":{let o=T(this.options.config).sort((l,c)=>c.weight-l.weight),a=this.modelWeight!==void 0?`\uFF08\u6743\u91CD ${this.modelWeight}\uFF09`:"";if(this.lines.push(`${t.gray}\u5F53\u524D\u6A21\u578B\uFF1A${t.reset}${this.modelProviderLabel} / ${this.modelLabel}${t.gray}${a}${t.reset}`),o.length>0){this.lines.push(`${t.gray}\u5DF2\u914D\u7F6E\u6A21\u578B\uFF08\u6309\u6743\u91CD\u964D\u5E8F\uFF09\uFF1A${t.reset}`);for(let l of o){let c=l.model===this.modelLabel?" \u2190 \u5F53\u524D":"";this.lines.push(`${t.gray} \xB7 ${l.id}\u3000\u6743\u91CD ${l.weight}${c}${t.reset}`)}}this.lines.push(`${t.gray}\u7BA1\u7406\u6A21\u578B\uFF08\u65B0\u589E / \u5220\u9664 / \u8C03\u6574\u6743\u91CD\uFF09\uFF1A${t.reset}xzh model${t.reset}`);break}default:this.lines.push(`${t.yellow}\u672A\u77E5\u547D\u4EE4\uFF1A/${r}\uFF0C\u8F93\u5165 /help \u67E5\u770B\u5E2E\u52A9\u3002${t.reset}`)}this.scheduleRender()}switchDirectory(e){let r=z(e.trim()),s=Be.isAbsolute(r)?r:Be.resolve(this.cwd,r);if(!ue.existsSync(s)){this.lines.push(`${t.red}\u2717 \u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${s}${t.reset}`),this.scheduleRender();return}if(!ue.statSync(s).isDirectory()){this.lines.push(`${t.red}\u2717 \u4E0D\u662F\u76EE\u5F55\uFF1A${s}${t.reset}`),this.scheduleRender();return}let i=s;try{i=ue.realpathSync(s)}catch{}this.cwd=i;let o=et(i);this.agent.setCwd(i),this.term.setCwd(i),this.termScroll=0,this.lines.push(`${t.green}\u2713 \u5DF2\u5207\u6362\u9879\u76EE\u76EE\u5F55\uFF1A${i}${t.reset}`),o.created&&this.lines.push(`${t.gray} \u5DF2\u521D\u59CB\u5316\u9879\u76EE\u76EE\u5F55 ${o.paths.dir}\uFF08memory/ \u8BB0\u5FC6 \xB7 rules.md \u89C4\u5219\uFF09${t.reset}`),this.lines.push(`${t.gray} \u540E\u7EED\u6587\u4EF6\u4E0E\u547D\u4EE4\u64CD\u4F5C\u5C06\u57FA\u4E8E\u8BE5\u76EE\u5F55\uFF1B\u5BF9\u8BDD\u4E0A\u4E0B\u6587\u5DF2\u4FDD\u7559\uFF08\u53EF\u7528 /reset \u6E05\u7A7A\uFF09\u3002${t.reset}`),this.scheduleRender()}printHelp(){let e=[`${t.bold}\u7384\u732A \u5185\u7F6E\u547D\u4EE4${t.reset}`," /help \u663E\u793A\u672C\u5E2E\u52A9"," /clear \u6E05\u7A7A\u5C4F\u5E55"," /reset \u91CD\u7F6E\u5BF9\u8BDD\u4E0A\u4E0B\u6587"," /cwd \u663E\u793A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55"," /switch <\u76EE\u5F55> \u5207\u6362\u5F53\u524D\u5BF9\u8BDD\u7684\u9879\u76EE\u76EE\u5F55"," /term \u663E\u793A/\u9690\u85CF\u53F3\u4FA7\u7EC8\u7AEF\u9762\u677F\uFF08/term clear \u6E05\u7A7A\u8F93\u51FA\uFF09"," /model \u663E\u793A\u5F53\u524D\u6A21\u578B\u4E0E\u6743\u91CD\u3001\u5DF2\u914D\u7F6E\u6A21\u578B\u5217\u8868"," /auto [on|off] \u5207\u6362\u81EA\u52A8\u6279\u51C6\uFF08on\uFF1A\u6240\u6709\u5DE5\u5177\u76F4\u63A5\u6267\u884C\uFF0C\u5199\u5165\u914D\u7F6E\uFF09"," /intent [on|off] \u5207\u6362\u610F\u56FE\u5206\u6790\uFF08on\uFF1A\u6BCF\u6761\u6D88\u606F\u5148\u505A\u610F\u56FE\u5206\u6790\u518D\u5904\u7406\uFF0C\u5199\u5165\u914D\u7F6E\uFF09"," /exit \u9000\u51FA\u7384\u732A",`${t.bold}\u5FEB\u6377\u952E${t.reset}`," Enter \u63D0\u4EA4 \xB7 Ctrl+Enter / Shift+Enter \u6362\u884C\uFF08Ctrl+J \u4EA6\u53EF\uFF09"," \u2191/\u2193 \u5386\u53F2 \xB7 Ctrl+A/Ctrl+E \u884C\u9996/\u884C\u5C3E \xB7 PgUp/PgDn \u7FFB\u9875 \xB7 Shift+\u2191/\u2193 \u9010\u884C"," Home/End \u8DF3\u5230\u6700\u65E9/\u6700\u65B0"," \u9F20\u6807\u6EDA\u8F6E\u6309\u6307\u9488\u6240\u5728\u680F\u6EDA\u52A8\uFF08\u5DE6\u680F\u5BF9\u8BDD / \u53F3\u680F\u7EC8\u7AEF\uFF09\uFF0C\u6EDA\u52A8\u65F6\u72B6\u6001\u680F\u663E\u793A \u2191N"," Shift+Tab \u5207\u6362\u7126\u70B9\uFF08\u5BF9\u8BDD \u21C4 \u53F3\u4FA7\u7EC8\u7AEF\uFF09\xB7 \u9F20\u6807\u70B9\u51FB\u4EA6\u53EF"," Ctrl+C \u4E2D\u65AD\u4EFB\u52A1 / \u6E05\u7A7A\u8F93\u5165 / \u9000\u51FA\uFF08\u7A7A\u95F2\u4E14\u8F93\u5165\u4E3A\u7A7A\u65F6\u9000\u51FA\uFF09"," Ctrl+D \u7ED3\u675F\u672C\u8F6E\u6B63\u5728\u8FDB\u884C\u7684\u5BF9\u8BDD \xB7 \u4EFB\u4F55\u60C5\u51B5\u4E0B\u90FD\u4E0D\u4F1A\u9000\u51FA\u7384\u732A"," Ctrl+L \u6E05\u5C4F"," \u6CE8\uFF1A\u591A\u6570 IDE \u5185\u7F6E\u7EC8\u7AEF\uFF08\u542B VS Code / CodeBuddy\uFF09\u9ED8\u8BA4\u628A Ctrl/Shift+Enter \u7F16\u6210\u4E0E Enter"," \u76F8\u540C\u7684\u5B57\u8282\uFF0C\u9700\u5728 IDE \u91CC\u628A\u8FD9\u4E24\u4E2A\u952E\u7ED1\u5B9A\u4E3A\u53D1\u9001 ESC[13;5u / ESC[13;2u\uFF08\u89C1 README\uFF09\u3002",`${t.bold}\u53F3\u4FA7\u7EC8\u7AEF${t.reset}`," Enter \u6267\u884C\u547D\u4EE4 \xB7 \u2191/\u2193 \u547D\u4EE4\u5386\u53F2 \xB7 Ctrl+C / Ctrl+D \u4E2D\u65AD\u8FD0\u884C\u4E2D\u7684\u547D\u4EE4 \xB7 Ctrl+L \u6E05\u7A7A"," PgUp/PgDn / Shift+\u2191\u2193 / Home/End \u56DE\u770B\u5386\u53F2\u8F93\u51FA\uFF08\u6EDA\u52A8\u4E0D\u5F71\u54CD\u6B63\u5728\u8FD0\u884C\u7684\u547D\u4EE4\uFF09"," \u547D\u4EE4\u5728\u5F53\u524D\u9879\u76EE\u76EE\u5F55\u4E0B\u6267\u884C\uFF1Bcd \u751F\u6548\uFF08\u9762\u677F\u81EA\u884C\u7EF4\u62A4\u5DE5\u4F5C\u76EE\u5F55\uFF09"];this.lines.push(...e.map(r=>`${t.gray}${r}${t.reset}`)),this.lines.push("")}buildHeaderLines(e){let r=this.modelWeight!==void 0?` \xB7 \u6743\u91CD ${this.modelWeight}`:"",s=N(`${this.modelProviderLabel} / ${this.modelLabel}${r}`,Math.max(10,e-8)),i=N(this.cwd,Math.max(10,e-8)),o=`${t.gray}${"\u2500".repeat(Math.max(0,e))}${t.reset}`;return{info:[`${t.brightMagenta}${t.bold} \u7384\u732A XuanZhu${t.reset} ${t.gray}v0.1.0 \xB7 \u7EC8\u7AEF AI \u7F16\u7801 Agent${t.reset}`,`${t.gray} \u6A21\u578B\uFF1A${t.reset}${s}${t.reset}`,`${t.gray} \u76EE\u5F55\uFF1A${t.reset}${i}${t.reset}`,`${t.gray} \u8F93\u5165 ${t.reset}${t.brightGreen}/help${t.reset}${t.gray} \u67E5\u770B\u547D\u4EE4\u4E0E\u5FEB\u6377\u952E${t.reset}`,`${t.gray} ${t.reset}Ctrl+D${t.gray} \u7ED3\u675F\u672C\u8F6E\u5BF9\u8BDD\uFF08\u4E0D\u9000\u51FA\uFF09\xB7 ${t.reset}Ctrl+C${t.gray} \u4E2D\u65AD/\u6E05\u7A7A/\u9000\u51FA${t.reset}`,`${t.gray} ${t.reset}Shift+Tab${t.gray} \u5207\u7EC8\u7AEF \xB7 ${t.reset}PgUp${t.gray}/\u6EDA\u8F6E\u56DE\u770B\u5386\u53F2${t.reset}`],divider:o}}scheduleRender(){this.needsRender||this.exited||(this.needsRender=!0,setTimeout(()=>{this.needsRender=!1,this.render()},16))}render(){if(this.exited)return;this.trimOutputLines();let e=Math.max(40,process.stdout.columns||80),r=Math.max(8,process.stdout.rows||24),s=this.resolveTermWidth(e),i=s>0?Math.max(20,e-s-1):e;this.lastLeftWidth=i;let o=this.pendingConfirm?this.layoutConfirm(i):this.layoutInput(i),a=o.lines.length,l=1,c=this.buildHeaderLines(i),u=Math.max(1,Math.floor(r/3)),d=Math.min(c.info.length,Math.max(0,u-1)),h=[...c.info.slice(0,d),c.divider],p=h.length,m=Math.max(3,r-p-a-l),f=this.physicalLines(i),$=f.length;this.lastPhysicalCount>=0&&this.scrollOffset>0&&$>this.lastPhysicalCount&&(this.scrollOffset+=$-this.lastPhysicalCount),this.lastPhysicalCount=$;let g=Math.max(0,$-m);this.scrollOffset>g&&(this.scrollOffset=g);let E=$-this.scrollOffset,y=Math.max(0,E-m),A=f.slice(y,E);for(;A.length<m;)A.unshift("");let w=r-1,U=s>0?this.buildTermPanel(s,w):{rows:[],cursorRow:0,cursorCol:0},se=p+m,J=D.hide;for(let I=0;I<w;I++){let F;I<p?F=h[I]:I<p+m?F=A[I-p]:I<se+a?F=o.lines[I-se]:F="",J+=D.to(I+1,1)+"\x1B[2K",s>0?J+=yr(N(F,i),i)+`${t.gray}\u2502${t.reset}`+N(U.rows[I]??"",s):J+=F}if(J+=D.to(r,1)+"\x1B[2K"+this.renderStatus(e),this.pendingConfirm)J+=D.hide;else if(this.termFocus&&s>0&&U.cursorRow>0){let I=U.cursorRow,F=Math.min(e,i+1+U.cursorCol);J+=D.to(I,F)+D.show}else{let I=se+o.cursorRow+1,F=Math.min(i,o.cursorCol+1);J+=D.to(I,F)+D.show}process.stdout.write(J)}resolveTermWidth(e){return!this.termVisible||e<80?0:Math.min(64,Math.max(32,Math.floor(e*.4)))}buildTermPanel(e,r){if(e<=0||r<=0)return{rows:[],cursorRow:0,cursorCol:0};let s=[],i=this.term.isRunning(),o=this.termFocus?`${t.bgBlue}${t.brightWhite} \u7EC8\u7AEF ${t.reset}`:`${t.gray} \u7EC8\u7AEF ${t.reset}`,a=i?`${t.brightYellow} \u25CF \u8FD0\u884C\u4E2D${t.reset}`:"",l=Math.max(6,e-9-(i?5:0));s.push(`${o}${t.gray}${N(this.term.getCwd(),l)}${t.reset}${a}`);let c=Math.max(1,r-3),u=[];for(let U of this.term.visibleLines())u.push(...ge(U,e));this.lastTermPhysicalCount>=0&&this.termScroll>0&&u.length>this.lastTermPhysicalCount&&(this.termScroll+=u.length-this.lastTermPhysicalCount),this.lastTermPhysicalCount=u.length;let d=Math.max(0,u.length-c);this.termScroll>d&&(this.termScroll=d);let h=u.length-this.termScroll,p=Math.max(0,h-c),m=u.slice(p,h);for(;m.length<c;)m.unshift("");s.push(...m),s.push(`${t.gray}${"\u2500".repeat(e)}${t.reset}`);let f=2,$=Math.max(1,e-f),g=this.termInput,E=P(g.slice(0,this.termInputCursor));for(;E>$&&g.length>0;)g=g.slice(1),E=P(g.slice(0,this.termInputCursor));let y=this.termFocus?`${t.brightCyan}\u276F${t.reset} `:`${t.gray}\u276F${t.reset} `;s.push(N(`${y}${g}`,e));let A=s.length,w=Math.min(e,f+E+1);for(;s.length<r;)s.push("");return{rows:s.slice(0,r),cursorRow:A,cursorCol:w}}physicalLines(e){let r=[];for(let s of this.lines)r.push(...ge(s,e));return this.streamingPreview&&r.push(...ge(this.streamingPreview,e)),r}renderStatus(e){let r=" \u7384\u732A ",s=this.autoApprove?"\u26A1auto \xB7 ":"",i=this.intentEnabled?"\u2301intent \xB7 ":"",o=this.termVisible?this.termFocus?"\u7EC8\u7AEF\u25B8 ":"\u5BF9\u8BDD\u25B8 ":"",a=this.modelWeight!==void 0?` w${this.modelWeight}`:"",l=this.scrollOffset>0?`${t.brightYellow}\u2191${this.scrollOffset}${t.reset}${t.bgBlue} `:"",c=this.termScroll>0?`${t.brightYellow}\u21E1${this.termScroll}${t.reset}${t.bgBlue} `:"",u=` ${s}${i}${o}${l}${c}${this.modelLabel}${a} \u2502 ${this.statusText}${this.statusDetail?" \xB7 "+this.statusDetail:""} `,d=` ${this.cwd} `,h=this.busy?`${t.brightYellow}\u25CF \u8FD0\u884C\u4E2D${t.reset}${t.bgBlue}`:"",p=P(r)+P(u)+P(h)+6,m=`${t.bgBlue}${t.brightWhite}${r}${t.reset}${t.bgBlue}${t.brightWhite}${h}${t.bgBlue}${t.gray}${N(d,Math.max(0,e-p))}${t.bgBlue}${t.brightWhite}${u}${t.reset}`,f=P(m);return f<e?m+=`${t.bgBlue}${" ".repeat(e-f)}${t.reset}`:f>e&&(m=`${N(m,e)}${t.reset}`),m}layoutInput(e){let i=Math.max(1,Math.floor((process.stdout.rows||24)/2)-1),o=Array.from(this.input),a=0;{let p=0;a=o.length;for(let m=0;m<o.length;m++){if(p>=this.inputCursor){a=m;break}p+=o[m].length}}let l=[],c="\u276F ",u=P("\u276F "),d=0,h=u;for(let p=0;p<o.length;p++){let m=o[p];if(m===`
|
|
137
|
-
`)
|
|
138
|
-
`).
|
|
139
|
-
|
|
140
|
+
`);return;case"\x7F":case"\b":this.backspace();return;case"":this.inputCursor=0,this.scheduleRender();return;case"":this.inputCursor=this.input.length,this.scheduleRender();return;case"\f":this.lines=[],this.scrollOffset=0,this.scheduleRender();return;case"\x1B[A":this.navigateHistory(-1);return;case"\x1B[B":this.navigateHistory(1);return;case"\x1B[C":this.moveCursor(1);return;case"\x1B[D":this.moveCursor(-1);return;case"\x1B[5~":this.scrollBy(5);return;case"\x1B[6~":this.scrollBy(-5);return;case"\x1B[1;2A":this.scrollBy(1);return;case"\x1B[1;2B":this.scrollBy(-1);return;case"\x1B[H":case"\x1B[1~":case"\x1B[7~":this.scrollToTop();return;case"\x1B[F":case"\x1B[4~":case"\x1B[8~":this.scrollToBottom();return;default:r.charCodeAt(0)>=32&&this.insertText(r)}}handleMouse(e){let r=Number(e[1]),s=Number(e[2]),i=e[4]==="M",o=this.resolveTermWidth(process.stdout.columns||80),a=this.lastLeftWidth>0&&o>0&&s>this.lastLeftWidth+1;if(i&&(r&64)===64){let c=(r&1)===0?3:-3;a?this.scrollTermBy(c):this.scrollBy(c);return}i&&(r&3)===0&&(r&32)===0&&a!==this.termFocus&&(this.termFocus=a,this.scheduleRender())}toggleFocus(){if(!this.termVisible){this.lines.push(`${t.gray}\u7EC8\u7AEF\u9762\u677F\u5DF2\u9690\u85CF\uFF0C\u8F93\u5165 /term \u53EF\u91CD\u65B0\u663E\u793A\u3002${t.reset}`),this.scheduleRender();return}this.termFocus=!this.termFocus,this.scheduleRender()}handleTermKey(e){switch(e){case"":this.term.isRunning()&&(this.term.interrupt(),this.scheduleRender());return;case"":this.term.isRunning()?this.term.interrupt():this.termInput.length>0?(this.termInput="",this.termInputCursor=0):this.termFocus=!1,this.scheduleRender();return;case"\r":this.submitTermCommand();return;case" ":this.applyTermCompletion();return;case"\x7F":case"\b":this.termBackspace();return;case"":this.termInputCursor=0,this.scheduleRender();return;case"":this.termInputCursor=this.termInput.length,this.scheduleRender();return;case"\f":this.term.clear(),this.scrollTermToBottom();return;case"\x1B[A":this.navigateTermHistory(-1);return;case"\x1B[B":this.navigateTermHistory(1);return;case"\x1B[C":this.termInputCursor=Math.min(this.termInput.length,this.termInputCursor+1),this.scheduleRender();return;case"\x1B[D":this.termInputCursor=Math.max(0,this.termInputCursor-1),this.scheduleRender();return;case"\x1B[5~":this.scrollTermBy(5);return;case"\x1B[6~":this.scrollTermBy(-5);return;case"\x1B[1;2A":this.scrollTermBy(1);return;case"\x1B[1;2B":this.scrollTermBy(-1);return;case"\x1B[H":case"\x1B[1~":case"\x1B[7~":this.scrollTermToTop();return;case"\x1B[F":case"\x1B[4~":case"\x1B[8~":this.scrollTermToBottom();return;default:e.charCodeAt(0)>=32&&(this.termInput=this.termInput.slice(0,this.termInputCursor)+e+this.termInput.slice(this.termInputCursor),this.termInputCursor+=e.length,this.termScroll=0,this.scheduleRender())}}termBackspace(){if(this.termInputCursor<=0)return;let e=this.termInputCursor-1,r=this.termInput.charCodeAt(e);r>=56320&&r<=57343&&e>0&&(e-=1),this.termInput=this.termInput.slice(0,e)+this.termInput.slice(this.termInputCursor),this.termInputCursor=e,this.scheduleRender()}navigateTermHistory(e){this.termHistory.length!==0&&(this.termHistoryIndex===-1&&(this.termHistoryIndex=this.termHistory.length),this.termHistoryIndex+=e,this.termHistoryIndex<0&&(this.termHistoryIndex=0),this.termHistoryIndex>=this.termHistory.length?(this.termHistoryIndex=-1,this.termInput="",this.termInputCursor=0):(this.termInput=this.termHistory[this.termHistoryIndex],this.termInputCursor=this.termInput.length),this.scheduleRender())}submitTermCommand(){let e=this.termInput.trim();e&&(this.termInput="",this.termInputCursor=0,this.termScroll=0,this.termHistory.push(e),this.termHistoryIndex=-1,this.term.run(e),this.scheduleRender())}applyTermCompletion(){let e=Wr(this.term.getCwd(),this.termInput,this.termInputCursor);if(e){if(e.candidates.length>0){let s=e.candidates.slice(0,24),i=e.candidates.length>s.length?` \u2026\uFF08\u5171 ${e.candidates.length} \u9879\uFF09`:"";this.term.notice(`${t.gray}${s.join(" ")}${i}${t.reset}`)}else this.termInput=e.line,this.termInputCursor=e.cursor,this.termScroll=0;this.scheduleRender()}}handleConfirmKey(e){let r=this.pendingConfirm;if(r)switch(e){case"y":case"Y":case"\r":this.resolveConfirm(!0);return;case"":this.abortController?.abort(),this.resolveConfirm(!1);return;case"n":case"N":case"\x1B":case"":this.resolveConfirm(!1);return;case"\x1B[C":case"\x1B[D":case" ":r.selected=!r.selected,this.scheduleRender();return;default:return}}resolveConfirm(e){let r=this.pendingConfirm;if(!r)return;this.pendingConfirm=void 0;let s=e?"\u5DF2\u5141\u8BB8":"\u5DF2\u62D2\u7EDD";this.lines.push(` ${e?t.green:t.yellow}${s}${t.reset}`),r.resolve(e),this.scheduleRender()}insertText(e){this.input=this.input.slice(0,this.inputCursor)+e+this.input.slice(this.inputCursor),this.inputCursor+=e.length,this.scrollOffset=0,this.scheduleRender()}backspace(){if(this.inputCursor<=0)return;let e=this.inputCursor-1,r=this.input.charCodeAt(e);r>=56320&&r<=57343&&e>0&&(e-=1),this.input=this.input.slice(0,e)+this.input.slice(this.inputCursor),this.inputCursor=e,this.scheduleRender()}moveCursor(e){let r=this.inputCursor+e;this.inputCursor=Math.max(0,Math.min(this.input.length,r)),this.scheduleRender()}navigateHistory(e){this.history.length!==0&&(this.historyIndex===-1&&(this.historyIndex=this.history.length),this.historyIndex+=e,this.historyIndex<0&&(this.historyIndex=0),this.historyIndex>=this.history.length?(this.historyIndex=-1,this.input="",this.inputCursor=0):(this.input=this.history[this.historyIndex],this.inputCursor=this.input.length),this.scheduleRender())}scrollBy(e){this.setScrollOffset(this.scrollOffset+e)}setScrollOffset(e){this.scrollOffset=Math.max(0,Math.round(e)),this.scheduleRender()}scrollToTop(){this.setScrollOffset(Number.MAX_SAFE_INTEGER)}scrollToBottom(){this.setScrollOffset(0)}scrollTermBy(e){this.termScroll=Math.max(0,Math.round(this.termScroll+e)),this.scheduleRender()}scrollTermToTop(){this.termScroll=Number.MAX_SAFE_INTEGER,this.scheduleRender()}scrollTermToBottom(){this.termScroll=0,this.scheduleRender()}async submit(){if(this.busy)return;let e=this.input.trim();if(!e)return;if(this.input="",this.inputCursor=0,this.scrollOffset=0,this.history.push(e),this.historyIndex=-1,e.startsWith("/")){this.handleCommand(e);return}this.lastAnswerStart=this.lines.length;let r=`${t.bgGreen}${t.black}${t.bold} \u276F ${t.reset}`,[s,...i]=e.split(`
|
|
141
|
+
`);this.lines.push(`${r} ${t.brightGreen}${t.bold}${s}${t.reset}`);for(let a of i)this.lines.push(`${t.brightGreen}${t.bold}\u2502${t.reset} ${t.brightGreen}${a}${t.reset}`);this.lines.push(""),this.busy=!0,this.statusText="\u601D\u8003\u4E2D",this.statusDetail="",this.abortController=new AbortController,this.scheduleRender();let o={label:this.modelLabel,weight:this.modelWeight};try{await this.agent.run(e,this.abortController.signal)}catch(a){let[l,...c]=H(a).split(`
|
|
142
|
+
`);this.lines.push(`${t.red}\u2717 ${l}${t.reset}`);for(let d of c)this.lines.push(`${t.gray} ${d}${t.reset}`);let u=o.weight!==void 0?`\uFF08\u6743\u91CD ${o.weight}\uFF09`:"";this.lines.push(`${t.gray} \u672C\u6B21\u8BF7\u6C42\u4F7F\u7528\u7684\u6A21\u578B\uFF1A${this.modelProviderLabel} / ${o.label}${u}${t.reset}`)}finally{let a=this.markdown.flush();a.length>0&&this.lines.push(...a),this.streamingPreview="",this.lines.push(""),this.busy=!1,this.abortController=void 0,this.statusText="\u5C31\u7EEA",this.scheduleRender()}}handleCommand(e){let[r,...s]=e.slice(1).split(/\s+/),i=s.join(" ");switch(r){case"help":case"h":this.printHelp();break;case"clear":this.lines=[];break;case"copy":this.copyOutput(i);break;case"mouse":this.toggleMouseCapture();break;case"reset":this.agent.reset(),this.lines.push(`${t.gray}\u4F1A\u8BDD\u5DF2\u91CD\u7F6E\u3002${t.reset}`);break;case"exit":case"quit":case"q":this.shutdown();return;case"cwd":this.lines.push(`${t.gray}${this.cwd}${t.reset}`);break;case"switch":{i?this.switchDirectory(i):(this.lines.push(`${t.gray}\u5F53\u524D\u76EE\u5F55\uFF1A${this.cwd}${t.reset}`),this.lines.push(`${t.gray}\u7528\u6CD5\uFF1A/switch <\u76EE\u5F55\u8DEF\u5F84>${t.reset}`));break}case"term":{i==="clear"?this.term.clear():i==="focus"?(this.termVisible=!0,this.termFocus=!0):(this.termVisible=!this.termVisible,this.termVisible||(this.termFocus=!1),this.lines.push(`${t.gray}\u7EC8\u7AEF\u9762\u677F\uFF1A${this.termVisible?"\u663E\u793A":"\u9690\u85CF"}\uFF08Shift+Tab \u6216\u9F20\u6807\u70B9\u51FB\u5207\u6362\u7126\u70B9\uFF09${t.reset}`));break}case"auto":{let o=i==="on"?!0:i==="off"?!1:!this.autoApprove;this.autoApprove=o,this.options.config.autoApprove=o;try{k(this.options.config)}catch(a){this.lines.push(`${t.yellow}\u26A0 \u914D\u7F6E\u4FDD\u5B58\u5931\u8D25\uFF1A${a instanceof Error?a.message:String(a)}${t.reset}`)}this.lines.push(o?`${t.gray}\u81EA\u52A8\u6279\u51C6\uFF1A${t.brightYellow}\u5F00${t.reset}${t.gray} \u2014\u2014 \u6240\u6709\u5DE5\u5177\uFF08\u542B\u5199\u6587\u4EF6\u3001\u6267\u884C\u547D\u4EE4\uFF09\u5C06\u76F4\u63A5\u6267\u884C\uFF0C\u4E0D\u518D\u8BE2\u95EE\uFF1B\u5DF2\u5199\u5165\u914D\u7F6E\u3002${t.reset}`:`${t.gray}\u81EA\u52A8\u6279\u51C6\uFF1A\u5173 \u2014\u2014 \u5199\u6587\u4EF6 / \u7F16\u8F91\u6587\u4EF6 / \u6267\u884C\u547D\u4EE4\u524D\u4F1A\u8BF7\u6C42\u786E\u8BA4\uFF1B\u5DF2\u5199\u5165\u914D\u7F6E\u3002${t.reset}`);break}case"intent":{let o=i==="on"?!0:i==="off"?!1:!this.intentEnabled;this.intentEnabled=o,this.options.config.intent={...this.options.config.intent??{enabled:!1},enabled:o};try{k(this.options.config)}catch(a){this.lines.push(`${t.yellow}\u26A0 \u914D\u7F6E\u4FDD\u5B58\u5931\u8D25\uFF1A${a instanceof Error?a.message:String(a)}${t.reset}`)}this.lines.push(o?`${t.gray}\u610F\u56FE\u5206\u6790\uFF1A${t.brightGreen}\u5F00${t.reset}${t.gray} \u2014\u2014 \u6BCF\u6761\u6D88\u606F\u4F1A\u5148\u7528\u6A21\u677F\u5305\u88F9\u5E76\u8BF7\u6C42\u6A21\u578B\uFF0C\u8FD4\u56DE\u7684\u5206\u6790\u7ED3\u679C\u4F5C\u4E3A\u672C\u6B21\u8F93\u5165\uFF1B\u5DF2\u5199\u5165\u914D\u7F6E\u3002${t.reset}`:`${t.gray}\u610F\u56FE\u5206\u6790\uFF1A\u5173 \u2014\u2014 \u76F4\u63A5\u4F7F\u7528\u4F60\u8F93\u5165\u7684\u5185\u5BB9\uFF1B\u5DF2\u5199\u5165\u914D\u7F6E\u3002${t.reset}`);break}case"model":{let o=S(this.options.config).sort((l,c)=>c.weight-l.weight),a=this.modelWeight!==void 0?`\uFF08\u6743\u91CD ${this.modelWeight}\uFF09`:"";if(this.lines.push(`${t.gray}\u5F53\u524D\u6A21\u578B\uFF1A${t.reset}${this.modelProviderLabel} / ${this.modelLabel}${t.gray}${a}${t.reset}`),o.length>0){this.lines.push(`${t.gray}\u5DF2\u914D\u7F6E\u6A21\u578B\uFF08\u6309\u6743\u91CD\u964D\u5E8F\uFF09\uFF1A${t.reset}`);for(let l of o){let c=l.model===this.modelLabel?" \u2190 \u5F53\u524D":"";this.lines.push(`${t.gray} \xB7 ${l.id}\u3000\u6743\u91CD ${l.weight}${c}${t.reset}`)}}this.lines.push(`${t.gray}\u7BA1\u7406\u6A21\u578B\uFF08\u65B0\u589E / \u5220\u9664 / \u8C03\u6574\u6743\u91CD\uFF09\uFF1A${t.reset}xzh model${t.reset}`);break}default:this.lines.push(`${t.yellow}\u672A\u77E5\u547D\u4EE4\uFF1A/${r}\uFF0C\u8F93\u5165 /help \u67E5\u770B\u5E2E\u52A9\u3002${t.reset}`)}this.scheduleRender()}switchDirectory(e){let r=F(e.trim()),s=Xe.isAbsolute(r)?r:Xe.resolve(this.cwd,r);if(!fe.existsSync(s)){this.lines.push(`${t.red}\u2717 \u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${s}${t.reset}`),this.scheduleRender();return}if(!fe.statSync(s).isDirectory()){this.lines.push(`${t.red}\u2717 \u4E0D\u662F\u76EE\u5F55\uFF1A${s}${t.reset}`),this.scheduleRender();return}let i=s;try{i=fe.realpathSync(s)}catch{}this.cwd=i;let o=ht(i);this.agent.setCwd(i),this.term.setCwd(i),this.termScroll=0,this.lines.push(`${t.green}\u2713 \u5DF2\u5207\u6362\u9879\u76EE\u76EE\u5F55\uFF1A${i}${t.reset}`),o.created&&this.lines.push(`${t.gray} \u5DF2\u521D\u59CB\u5316\u9879\u76EE\u76EE\u5F55 ${o.paths.dir}\uFF08memory/ \u8BB0\u5FC6 \xB7 rules.md \u89C4\u5219\uFF09${t.reset}`),this.lines.push(`${t.gray} \u540E\u7EED\u6587\u4EF6\u4E0E\u547D\u4EE4\u64CD\u4F5C\u5C06\u57FA\u4E8E\u8BE5\u76EE\u5F55\uFF1B\u5BF9\u8BDD\u4E0A\u4E0B\u6587\u5DF2\u4FDD\u7559\uFF08\u53EF\u7528 /reset \u6E05\u7A7A\uFF09\u3002${t.reset}`),this.scheduleRender()}toggleMouseCapture(){this.mouseCapture=!this.mouseCapture,process.stdout.write(this.mouseCapture?"\x1B[?1000h\x1B[?1006h":"\x1B[?1000l\x1B[?1006l"),this.lines.push(this.mouseCapture?`${t.gray}\u9F20\u6807\u6355\u83B7\uFF1A${t.reset}\u5F00 ${t.gray}\u2014 \u6EDA\u8F6E\u53EF\u6EDA\u52A8\u8F93\u51FA\u533A\u3002\u8981\u9009\u4E2D\u6587\u672C\u8BF7\u6309\u4F4F ${t.reset}Shift${t.gray} \u62D6\u62FD\uFF0C\u6216\u8F93\u5165 ${t.reset}/mouse${t.gray} \u4E34\u65F6\u5173\u95ED\u3002${t.reset}`:`${t.gray}\u9F20\u6807\u6355\u83B7\uFF1A${t.reset}${t.brightGreen}\u5173${t.reset}${t.gray} \u2014 \u73B0\u5728\u53EF\u4EE5\u76F4\u63A5\u7528\u9F20\u6807\u6846\u9009\u590D\u5236\uFF1B\u6EDA\u8F6E\u4E0D\u518D\u6EDA\u52A8\u3002\u518D\u8F93\u5165 ${t.reset}/mouse${t.gray} \u6062\u590D\u3002${t.reset}`)}copyOutput(e){let r=e.trim().toLowerCase(),s=this.lines.length,i,o;if(r==="all")i=this.lines.slice(),o="\u5168\u90E8";else if(r==="last")i=this.lines.slice(Math.min(this.lastAnswerStart,s)),o="\u6700\u8FD1\u4E00\u6B21\u5BF9\u8BDD";else if(/^\d+-\d+$/.test(r)){let[u,d]=r.split("-"),h=Math.max(1,Number(u)),m=Math.min(s,Number(d));if(h>m){this.lines.push(`${t.yellow}\u884C\u53F7\u8303\u56F4\u65E0\u6548\uFF1A${r}${t.reset}${t.gray}\uFF08\u8F93\u51FA\u533A\u5F53\u524D ${s} \u884C\uFF09${t.reset}`);return}i=this.lines.slice(h-1,m),o=`\u7B2C ${h}-${m} \u884C`}else{let u=/^\d+$/.test(r)?Number(r):30;i=this.lines.slice(-Math.max(1,u)),o=`\u6700\u8FD1 ${Math.min(Math.max(1,u),s)} \u884C`}let a=me(i.join(`
|
|
143
|
+
`)).trim();if(!a){let u=r==="last"&&s===0?"\uFF0C\u5C1A\u672A\u8FDB\u884C\u8FC7\u5BF9\u8BDD":"";this.lines.push(`${t.yellow}\u6CA1\u6709\u53EF\u590D\u5236\u7684\u5185\u5BB9${t.reset}${t.gray}\uFF08\u8F93\u51FA\u533A\u5F53\u524D ${s} \u884C${u}\uFF09\u3002${t.reset}`);return}let l=Buffer.from(a,"utf8").toString("base64");process.stdout.write(`\x1B]52;c;${l}\x07`);let c=a.split(`
|
|
144
|
+
`).length;this.lines.push(`${t.green}\u2713 \u5DF2\u590D\u5236${o}\uFF08${c} \u884C\uFF09\u5230\u526A\u8D34\u677F${t.reset}${t.gray}\uFF08OSC 52\uFF09\u3002\u82E5\u7C98\u8D34\u51FA\u6765\u662F\u7A7A\u7684\uFF0C\u8BF4\u660E\u672C\u7EC8\u7AEF\u7981\u7528\u4E86\u8BE5\u5E8F\u5217\uFF0C\u8BF7\u6539\u7528 ${t.reset}Shift${t.gray}+\u9F20\u6807\u62D6\u62FD\u9009\u62E9\u3002${t.reset}`)}printHelp(){let e=[`${t.bold}\u7384\u732A \u5185\u7F6E\u547D\u4EE4${t.reset}`," /help \u663E\u793A\u672C\u5E2E\u52A9"," /clear \u6E05\u7A7A\u5C4F\u5E55"," /copy [N|A-B|last|all] \u590D\u5236\u8F93\u51FA\u533A\u5230\u7CFB\u7EDF\u526A\u8D34\u677F\uFF08\u9ED8\u8BA4\u6700\u8FD1 30 \u884C\uFF09"," /mouse \u5207\u6362\u9F20\u6807\u6355\u83B7\uFF1A\u5173\u95ED\u540E\u53EF\u7528\u9F20\u6807\u76F4\u63A5\u6846\u9009\u590D\u5236"," /reset \u91CD\u7F6E\u5BF9\u8BDD\u4E0A\u4E0B\u6587"," /cwd \u663E\u793A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55"," /switch <\u76EE\u5F55> \u5207\u6362\u5F53\u524D\u5BF9\u8BDD\u7684\u9879\u76EE\u76EE\u5F55"," /term \u663E\u793A/\u9690\u85CF\u53F3\u4FA7\u7EC8\u7AEF\u9762\u677F\uFF08/term clear \u6E05\u7A7A\u8F93\u51FA\uFF09"," /model \u663E\u793A\u5F53\u524D\u6A21\u578B\u4E0E\u6743\u91CD\u3001\u5DF2\u914D\u7F6E\u6A21\u578B\u5217\u8868"," /auto [on|off] \u5207\u6362\u81EA\u52A8\u6279\u51C6\uFF08on\uFF1A\u6240\u6709\u5DE5\u5177\u76F4\u63A5\u6267\u884C\uFF0C\u5199\u5165\u914D\u7F6E\uFF09"," /intent [on|off] \u5207\u6362\u610F\u56FE\u5206\u6790\uFF08on\uFF1A\u6BCF\u6761\u6D88\u606F\u5148\u505A\u610F\u56FE\u5206\u6790\u518D\u5904\u7406\uFF0C\u5199\u5165\u914D\u7F6E\uFF09"," /exit \u9000\u51FA\u7384\u732A",`${t.bold}\u5FEB\u6377\u952E${t.reset}`," Enter \u63D0\u4EA4 \xB7 Ctrl+Enter / Shift+Enter \u6362\u884C\uFF08Ctrl+J \u4EA6\u53EF\uFF09"," \u2191/\u2193 \u5386\u53F2 \xB7 Ctrl+A/Ctrl+E \u884C\u9996/\u884C\u5C3E \xB7 PgUp/PgDn \u7FFB\u9875 \xB7 Shift+\u2191/\u2193 \u9010\u884C"," Home/End \u8DF3\u5230\u6700\u65E9/\u6700\u65B0"," \u9F20\u6807\u6EDA\u8F6E\u6309\u6307\u9488\u6240\u5728\u680F\u6EDA\u52A8\uFF08\u5DE6\u680F\u5BF9\u8BDD / \u53F3\u680F\u7EC8\u7AEF\uFF09\uFF0C\u6EDA\u52A8\u65F6\u72B6\u6001\u680F\u663E\u793A \u2191N",` ${t.yellow}\u9009\u4E2D\u590D\u5236${t.reset}\uFF1A\u5E94\u7528\u6355\u83B7\u9F20\u6807\u540E\u539F\u751F\u62D6\u62FD\u4F1A\u88AB\u7981\u7528\u3002\u8BF7${t.bold}\u6309\u4F4F Shift \u62D6\u62FD${t.reset}\u4E34\u65F6\u7ED5\u8FC7\uFF0C`,` \u6216\u7528 ${t.reset}/mouse${t.gray} \u5173\u95ED\u6355\u83B7\u540E\u7528\u9F20\u6807\u76F4\u63A5\u6846\u9009\uFF1B\u4E5F\u53EF\u7528 ${t.reset}/copy${t.gray} \u590D\u5236\u8F93\u51FA\u533A\u3002${t.reset}`," Shift+Tab \u5207\u6362\u7126\u70B9\uFF08\u5BF9\u8BDD \u21C4 \u53F3\u4FA7\u7EC8\u7AEF\uFF09\xB7 \u9F20\u6807\u70B9\u51FB\u4EA6\u53EF"," Ctrl+C \u4E2D\u65AD\u4EFB\u52A1 / \u6E05\u7A7A\u8F93\u5165 / \u9000\u51FA\uFF08\u7A7A\u95F2\u4E14\u8F93\u5165\u4E3A\u7A7A\u65F6\u9000\u51FA\uFF09"," Ctrl+D \u7ED3\u675F\u672C\u8F6E\u6B63\u5728\u8FDB\u884C\u7684\u5BF9\u8BDD \xB7 \u4EFB\u4F55\u60C5\u51B5\u4E0B\u90FD\u4E0D\u4F1A\u9000\u51FA\u7384\u732A"," Ctrl+L \u6E05\u5C4F"," \u6CE8\uFF1A\u591A\u6570 IDE \u5185\u7F6E\u7EC8\u7AEF\uFF08\u542B VS Code / CodeBuddy\uFF09\u9ED8\u8BA4\u628A Ctrl/Shift+Enter \u7F16\u6210\u4E0E Enter"," \u76F8\u540C\u7684\u5B57\u8282\uFF0C\u9700\u5728 IDE \u91CC\u628A\u8FD9\u4E24\u4E2A\u952E\u7ED1\u5B9A\u4E3A\u53D1\u9001 ESC[13;5u / ESC[13;2u\uFF08\u89C1 README\uFF09\u3002",`${t.bold}\u53F3\u4FA7\u7EC8\u7AEF${t.reset}`," Enter \u6267\u884C\u547D\u4EE4 \xB7 \u2191/\u2193 \u547D\u4EE4\u5386\u53F2 \xB7 Ctrl+C / Ctrl+D \u4E2D\u65AD\u8FD0\u884C\u4E2D\u7684\u547D\u4EE4 \xB7 Ctrl+L \u6E05\u7A7A"," PgUp/PgDn / Shift+\u2191\u2193 / Home/End \u56DE\u770B\u5386\u53F2\u8F93\u51FA\uFF08\u6EDA\u52A8\u4E0D\u5F71\u54CD\u6B63\u5728\u8FD0\u884C\u7684\u547D\u4EE4\uFF09"," \u547D\u4EE4\u5728\u5F53\u524D\u9879\u76EE\u76EE\u5F55\u4E0B\u6267\u884C\uFF1Bcd \u751F\u6548\uFF08\u9762\u677F\u81EA\u884C\u7EF4\u62A4\u5DE5\u4F5C\u76EE\u5F55\uFF09"];this.lines.push(...e.map(r=>`${t.gray}${r}${t.reset}`)),this.lines.push("")}buildHeaderLines(e){let r=this.modelWeight!==void 0?` \xB7 \u6743\u91CD ${this.modelWeight}`:"",s=K(`${this.modelProviderLabel} / ${this.modelLabel}${r}`,Math.max(10,e-8)),i=K(this.cwd,Math.max(10,e-8)),o=`${t.gray}${"\u2500".repeat(Math.max(0,e))}${t.reset}`;return{info:[`${t.brightMagenta}${t.bold} \u7384\u732A XuanZhu${t.reset} ${t.gray}v${we} \xB7 \u7EC8\u7AEF AI \u7F16\u7801 Agent${t.reset}`,`${t.gray} \u6A21\u578B\uFF1A${t.reset}${s}${t.reset}`,`${t.gray} \u76EE\u5F55\uFF1A${t.reset}${i}${t.reset}`,`${t.gray} \u8F93\u5165 ${t.reset}${t.brightGreen}/help${t.reset}${t.gray} \u67E5\u770B\u547D\u4EE4\u4E0E\u5FEB\u6377\u952E${t.reset}`,`${t.gray} ${t.reset}Ctrl+D${t.gray} \u7ED3\u675F\u672C\u8F6E\u5BF9\u8BDD\uFF08\u4E0D\u9000\u51FA\uFF09\xB7 ${t.reset}Ctrl+C${t.gray} \u4E2D\u65AD/\u6E05\u7A7A/\u9000\u51FA${t.reset}`,`${t.gray} ${t.reset}Shift+Tab${t.gray} \u5207\u7EC8\u7AEF \xB7 ${t.reset}PgUp${t.gray}/\u6EDA\u8F6E\u56DE\u770B\u5386\u53F2${t.reset}`],divider:o}}scheduleRender(){this.needsRender||this.exited||(this.needsRender=!0,setTimeout(()=>{this.needsRender=!1,this.render()},16))}render(){if(this.exited)return;this.trimOutputLines();let e=Math.max(40,process.stdout.columns||80),r=Math.max(8,process.stdout.rows||24),s=this.resolveTermWidth(e),i=s>0?Math.max(20,e-s-1):e;this.lastLeftWidth=i;let o=this.pendingConfirm?this.layoutConfirm(i):this.layoutInput(i),a=o.lines.length,l=1,c=this.buildHeaderLines(i),u=Math.max(1,Math.floor(r/3)),d=Math.min(c.info.length,Math.max(0,u-1)),h=[...c.info.slice(0,d),c.divider],m=h.length,p=Math.max(3,r-m-a-l),f=this.physicalLines(i),$=f.length;this.lastPhysicalCount>=0&&this.scrollOffset>0&&$>this.lastPhysicalCount&&(this.scrollOffset+=$-this.lastPhysicalCount),this.lastPhysicalCount=$;let g=Math.max(0,$-p);this.scrollOffset>g&&(this.scrollOffset=g);let M=$-this.scrollOffset,y=Math.max(0,M-p),I=f.slice(y,M);for(;I.length<p;)I.unshift("");let v=r-1,B=s>0?this.buildTermPanel(s,v):{rows:[],cursorRow:0,cursorCol:0},ae=m+p,V=N.hide;for(let A=0;A<v;A++){let z;A<m?z=h[A]:A<m+p?z=I[A-m]:A<ae+a?z=o.lines[A-ae]:z="",V+=N.to(A+1,1)+"\x1B[2K",s>0?V+=Nr(K(z,i),i)+`${t.gray}\u2502${t.reset}`+K(B.rows[A]??"",s):V+=z}if(V+=N.to(r,1)+"\x1B[2K"+this.renderStatus(e),this.pendingConfirm)V+=N.hide;else if(this.termFocus&&s>0&&B.cursorRow>0){let A=B.cursorRow,z=Math.min(e,i+1+B.cursorCol);V+=N.to(A,z)+N.show}else{let A=ae+o.cursorRow+1,z=Math.min(i,o.cursorCol+1);V+=N.to(A,z)+N.show}process.stdout.write(V)}resolveTermWidth(e){return!this.termVisible||e<80?0:Math.min(64,Math.max(32,Math.floor(e*.4)))}buildTermPanel(e,r){if(e<=0||r<=0)return{rows:[],cursorRow:0,cursorCol:0};let s=[],i=this.term.isRunning(),o=this.termFocus?`${t.bgBlue}${t.brightWhite} \u7EC8\u7AEF ${t.reset}`:`${t.gray} \u7EC8\u7AEF ${t.reset}`,a=i?`${t.brightYellow} \u25CF \u8FD0\u884C\u4E2D${t.reset}`:"",l=Math.max(6,e-9-(i?5:0));s.push(`${o}${t.gray}${K(this.term.getCwd(),l)}${t.reset}${a}`);let c=Math.max(1,r-3),u=[];for(let B of this.term.visibleLines())u.push(...ve(B,e));this.lastTermPhysicalCount>=0&&this.termScroll>0&&u.length>this.lastTermPhysicalCount&&(this.termScroll+=u.length-this.lastTermPhysicalCount),this.lastTermPhysicalCount=u.length;let d=Math.max(0,u.length-c);this.termScroll>d&&(this.termScroll=d);let h=u.length-this.termScroll,m=Math.max(0,h-c),p=u.slice(m,h);for(;p.length<c;)p.unshift("");s.push(...p),s.push(`${t.gray}${"\u2500".repeat(e)}${t.reset}`);let f=2,$=Math.max(1,e-f),g=this.termInput,M=P(g.slice(0,this.termInputCursor));for(;M>$&&g.length>0;)g=g.slice(1),M=P(g.slice(0,this.termInputCursor));let y=this.termFocus?`${t.brightCyan}\u276F${t.reset} `:`${t.gray}\u276F${t.reset} `;s.push(K(`${y}${g}`,e));let I=s.length,v=Math.min(e,f+M+1);for(;s.length<r;)s.push("");return{rows:s.slice(0,r),cursorRow:I,cursorCol:v}}physicalLines(e){let r=[];for(let s of this.lines)r.push(...ve(s,e));return this.streamingPreview&&r.push(...ve(this.streamingPreview,e)),r}renderStatus(e){let r=" \u7384\u732A ",s=this.autoApprove?"\u26A1auto \xB7 ":"",i=this.intentEnabled?"\u2301intent \xB7 ":"",o=this.termVisible?this.termFocus?"\u7EC8\u7AEF\u25B8 ":"\u5BF9\u8BDD\u25B8 ":"",a=this.modelWeight!==void 0?` w${this.modelWeight}`:"",l=this.scrollOffset>0?`${t.brightYellow}\u2191${this.scrollOffset}${t.reset}${t.bgBlue} `:"",c=this.termScroll>0?`${t.brightYellow}\u21E1${this.termScroll}${t.reset}${t.bgBlue} `:"",u=` ${s}${i}${o}${l}${c}${this.modelLabel}${a} \u2502 ${this.statusText}${this.statusDetail?" \xB7 "+this.statusDetail:""} `,d=` ${this.cwd} `,h=this.busy?`${t.brightYellow}\u25CF \u8FD0\u884C\u4E2D${t.reset}${t.bgBlue}`:"",m=P(r)+P(u)+P(h)+6,p=`${t.bgBlue}${t.brightWhite}${r}${t.reset}${t.bgBlue}${t.brightWhite}${h}${t.bgBlue}${t.gray}${K(d,Math.max(0,e-m))}${t.bgBlue}${t.brightWhite}${u}${t.reset}`,f=P(p);return f<e?p+=`${t.bgBlue}${" ".repeat(e-f)}${t.reset}`:f>e&&(p=`${K(p,e)}${t.reset}`),p}layoutInput(e){let i=Math.max(1,Math.floor((process.stdout.rows||24)/2)-1),o=Array.from(this.input),a=0;{let m=0;a=o.length;for(let p=0;p<o.length;p++){if(m>=this.inputCursor){a=p;break}m+=o[p].length}}let l=[],c="\u276F ",u=P("\u276F "),d=0,h=u;for(let m=0;m<o.length;m++){let p=o[m];if(p===`
|
|
145
|
+
`){l.push(c),c=" ",u=P(" "),m===a&&(d=l.length,h=u);continue}let f=P(p);u+f>e&&(l.push(c),c=" ",u=P(" ")),m===a&&(d=l.length,h=u),c+=p,u+=f}if(a>=o.length&&(d=l.length,h=u),l.push(c),l.length>i){let m=Math.max(0,d-i+1);return{lines:l.slice(m,m+i),cursorRow:d-m,cursorCol:h}}return{lines:l,cursorRow:d,cursorCol:h}}layoutConfirm(e){let r=this.pendingConfirm,{request:s}=r,i=[],o=s.danger;i.push(`${o?t.brightRed:t.brightYellow}\u26A0 ${s.title}${t.reset}`);let a=s.detail.split(`
|
|
146
|
+
`).slice(0,12);for(let u of a)for(let d of ve(`${t.gray}${u}${t.reset}`,e-4))i.push(` ${d}`);let l=r.selected?`${t.inverse}${t.green} \u5141\u8BB8 ${t.reset}`:`${t.gray} \u5141\u8BB8 ${t.reset}`,c=r.selected?`${t.gray} \u62D2\u7EDD ${t.reset}`:`${t.inverse}${t.yellow} \u62D2\u7EDD ${t.reset}`;return i.push(` ${l} ${c} ${t.gray}\u2190 \u2192 \u5207\u6362 \xB7 Enter \u786E\u8BA4 \xB7 y/n \u5FEB\u6377${t.reset}`),{lines:i,cursorRow:0,cursorCol:0}}},ds=1,hs=2,yt=4;function ms(n,e){if((e&yt)===0)return null;let r=n>=65&&n<=90?n+32:n;if(r>=97&&r<=122)return String.fromCharCode(r-96);switch(n){case 32:case 64:return"\0";case 91:return"\x1B";case 92:return"";case 93:return"";case 94:return"";case 95:case 47:return"";default:return null}}function Fr(n,e){let r=(e&(ds|yt|hs))!==0;switch(n){case 13:return r?`
|
|
147
|
+
`:"\r";case 9:return r&&(e&yt)===0?"\x1B[Z":" ";case 8:case 127:return"\x7F";default:return ms(n,e)}}function ps(n){if(n==="\x1B\r"||n===`\x1B
|
|
140
148
|
`)return`
|
|
141
|
-
`;let e=/^\x1b\[(\d+)(?::\d+)?(?:;(\d+))?u$/.exec(n);if(e){let s=e[2]?Number(e[2])-1:0;return
|
|
142
|
-
`);return;case"init":{if(
|
|
143
|
-
`);return}
|
|
144
|
-
`);return}case void 0:return
|
|
149
|
+
`;let e=/^\x1b\[(\d+)(?::\d+)?(?:;(\d+))?u$/.exec(n);if(e){let s=e[2]?Number(e[2])-1:0;return Fr(Number(e[1]),s)??n}let r=/^\x1b\[27;(\d+)(?:;(\d+))?~$/.exec(n);if(r){let s=Number(r[1])-1,i=r[2]?Number(r[2]):27;return Fr(i,s)??n}return n}function fs(n){let e={};try{let i=JSON.parse(n.arguments||"{}");typeof i=="object"&&i!==null&&(e=i)}catch{return K(n.arguments,60)}let r=i=>{let o=e[i];return typeof o=="string"?o:void 0},s=r("path")??r("pattern")??r("command")??r("dirPath")??"";return K(s.replace(/\s+/g," "),80)}var zr=require("child_process"),jr=x(require("fs"));async function qr(n){let e=n[0];switch(e){case"edit":return $s();case"path":process.stdout.write(`${E()}
|
|
150
|
+
`);return;case"init":{if(ye(j()),xe()){process.stdout.write(`${t.yellow}\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728\uFF1A${E()}${t.reset}
|
|
151
|
+
`);return}k({...q}),process.stdout.write(`${t.green}\u2713 \u5DF2\u751F\u6210\u9ED8\u8BA4\u914D\u7F6E\uFF1A${E()}${t.reset}
|
|
152
|
+
`);return}case void 0:return gs();default:process.stdout.write(`${t.red}\u672A\u77E5\u5B50\u547D\u4EE4\uFF1A${e}${t.reset}
|
|
145
153
|
${t.gray}\u7528\u6CD5\uFF1Axzh config [edit|path|init]${t.reset}
|
|
146
|
-
`),process.exitCode=1;return}}function
|
|
154
|
+
`),process.exitCode=1;return}}function gs(){if(!xe()){process.stdout.write(`${t.yellow}\u5C1A\u672A\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6\u3002${t.reset}
|
|
147
155
|
${t.gray}\u8FD0\u884C ${t.reset}xzh model${t.gray} \u8FDB\u884C\u914D\u7F6E\uFF0C\u6216\u8FD0\u884C ${t.reset}xzh config init${t.gray} \u751F\u6210\u9ED8\u8BA4\u914D\u7F6E\u3002${t.reset}
|
|
148
|
-
`);return}let n=L(),e
|
|
156
|
+
`);return}let n=L(),e=It(n);process.stdout.write(`${t.bold}\u7384\u732A\u914D\u7F6E${t.reset} ${t.gray}(${E()})${t.reset}
|
|
149
157
|
|
|
150
158
|
`),process.stdout.write(JSON.stringify(e,null,2)+`
|
|
151
159
|
`),process.stdout.write(`
|
|
152
160
|
${t.gray}\u63D0\u793A\uFF1AAPI Key \u5DF2\u8131\u654F\u663E\u793A\uFF1B\u4F7F\u7528 ${t.reset}xzh config edit${t.gray} \u7F16\u8F91\u5B8C\u6574\u914D\u7F6E\u3002${t.reset}
|
|
153
|
-
`)}function
|
|
161
|
+
`)}function $s(){ye(j());let n=E();jr.existsSync(n)||k({...q});let e=[process.env.XUANZHU_EDITOR,"nano",process.env.EDITOR,"vi","vim","code --wait"].filter(r=>!!r);for(let r of e){let[s,...i]=r.split(" "),o=(0,zr.spawnSync)(s,[...i,n],{stdio:"inherit"});if(o.error){if(o.error.code==="ENOENT")continue;process.stdout.write(`${t.red}\u7F16\u8F91\u5668\u542F\u52A8\u5931\u8D25\uFF1A${o.error.message}${t.reset}
|
|
154
162
|
`);return}return}process.stdout.write(`${t.yellow}\u672A\u627E\u5230\u53EF\u7528\u7684\u6587\u672C\u7F16\u8F91\u5668\uFF0C\u8BF7\u624B\u52A8\u7F16\u8F91\uFF1A${n}${t.reset}
|
|
155
|
-
`)}var
|
|
156
|
-
`),a.trim()||e||""}finally{s.close()}}async function
|
|
163
|
+
`)}var Ye=x(require("readline/promises")),Hr=require("stream");var ys=new Hr.Writable({write(n,e,r){r()}});function xs(n){return n.length<=8?"*".repeat(n.length):`${n.slice(0,4)}\u2026${n.slice(-4)}`}async function oe(n,e,r={}){let s=Ye.createInterface({input:process.stdin,output:r.mask?ys:process.stdout});try{let i=e&&r.mask?xs(e):e,o=i?` ${t.gray}(${i})${t.reset}`:"",a=await Promise.race([s.question(`${n}${o}: `),new Promise(c=>s.once("close",()=>c("")))]);return r.mask&&process.stdout.write(`
|
|
164
|
+
`),a.trim()||e||""}finally{s.close()}}async function Ce(n,e,r=0){process.stdout.write(`
|
|
157
165
|
${t.bold}${n}${t.reset}
|
|
158
166
|
`),e.forEach((i,o)=>{let a=o===r?`${t.brightGreen}\u276F${t.reset}`:" ",l=i.hint?` ${t.gray}${i.hint}${t.reset}`:"";process.stdout.write(` ${a} ${o+1}. ${i.label}${l}
|
|
159
|
-
`)});let s=
|
|
160
|
-
`),e[r].value):e[a].value}finally{s.close()}}async function
|
|
161
|
-
${t.gray}\u53EF\u7528\uFF1A${
|
|
162
|
-
`),process.exitCode=1;return}let o=n[1]??await
|
|
163
|
-
`),process.exitCode=1;return}l=p}let c=await
|
|
164
|
-
${t.green}\u2713 ${
|
|
167
|
+
`)});let s=Ye.createInterface({input:process.stdin,output:process.stdout});try{let o=(await Promise.race([s.question(`${t.gray}\u8BF7\u8F93\u5165\u7F16\u53F7 [${r+1}]: ${t.reset}`),new Promise(l=>s.once("close",()=>l("")))])).trim();if(!o)return e[r].value;let a=Number.parseInt(o,10)-1;return Number.isNaN(a)||a<0||a>=e.length?(process.stdout.write(`${t.yellow}\u65E0\u6548\u7F16\u53F7\uFF0C\u4F7F\u7528\u9ED8\u8BA4\u9009\u9879\u3002${t.reset}
|
|
168
|
+
`),e[r].value):e[a].value}finally{s.close()}}async function Gr(n,e=!1){let r=Ye.createInterface({input:process.stdin,output:process.stdout});try{let s=e?"[Y/n]":"[y/N]",o=(await Promise.race([r.question(`${n} ${s} `),new Promise(a=>r.once("close",()=>a("")))])).trim().toLowerCase();return o?o==="y"||o==="yes":e}finally{r.close()}}async function Xr(n){switch(n[0]){case void 0:return vs();case"list":case"ls":return ws();case"all":case"available":case"providers":return Vr();case"add":return xt(n.slice(1));case"remove":case"rm":case"delete":return Zr(n.slice(1));case"weight":case"w":return Yr(n.slice(1));case"context":case"ctx":return bs(n.slice(1));case"reset":return Jr();case"help":case"-h":case"--help":return Cs();default:return xt(n)}}async function xt(n){let e=L(),r=ee(e),s=n[0]??await Ts(),i=Z(s);if(!i){process.stdout.write(`${t.red}\u672A\u77E5\u7684 provider\uFF1A${s}${t.reset}
|
|
169
|
+
${t.gray}\u53EF\u7528\uFF1A${X.map(p=>p.id).join(", ")}${t.reset}
|
|
170
|
+
`),process.exitCode=1;return}let o=n[1]??await Ss(i.id,i.models,e),a=n[2],l;if(a!==void 0){let p=/^\d+$/.test(a.trim())?Number.parseInt(a.trim(),10):Number.NaN;if(Number.isNaN(p)||p<0){process.stdout.write(`${t.red}\u6743\u91CD\u5FC5\u987B\u662F \u2265 0 \u7684\u6574\u6570\uFF1A${a}${t.reset}
|
|
171
|
+
`),process.exitCode=1;return}l=p}let c=await Es(i.id,i.requiresBaseUrl===!0,e),u=await _s(i.id,i.envKey,e),d=await ks(o,n[3]);e.providers={...e.providers,[i.id]:{...e.providers[i.id]??{},model:o,...c?{baseUrl:c}:{},...u?{apiKey:u}:{}}},e.provider=i.id,e.model=o;let h=r.some(p=>p.id===se(i.id,o)),m=Ot(e,{provider:i.id,model:o,weight:l,contextWindow:d,...c?{baseUrl:c}:{},...u?{apiKey:u}:{}});k(e),process.stdout.write(`
|
|
172
|
+
${t.green}\u2713 ${h?"\u5DF2\u66F4\u65B0":"\u5DF2\u65B0\u589E"}\u6A21\u578B${t.reset} ${t.bold}${m.id}${t.reset}
|
|
165
173
|
${t.gray}provider\uFF1A${t.reset}${i.label}
|
|
166
|
-
${t.gray}model \uFF1A${t.reset}${
|
|
167
|
-
${t.gray}\u6743\u91CD \uFF1A${t.reset}${
|
|
174
|
+
${t.gray}model \uFF1A${t.reset}${m.model}
|
|
175
|
+
${t.gray}\u6743\u91CD \uFF1A${t.reset}${m.weight}
|
|
176
|
+
${t.gray}\u4E0A\u4E0B\u6587 \uFF1A${t.reset}${re(m.contextWindow??32e3)} token
|
|
168
177
|
`+(c?` ${t.gray}baseUrl \uFF1A${t.reset}${c}
|
|
169
|
-
`:"")+` ${t.gray}\u914D\u7F6E\u6587\u4EF6\uFF1A${t.reset}${
|
|
170
|
-
`),
|
|
171
|
-
`);return}let s=n[0]??await
|
|
178
|
+
`:"")+` ${t.gray}\u914D\u7F6E\u6587\u4EF6\uFF1A${t.reset}${E()}
|
|
179
|
+
`),wt(e)}async function Zr(n){let e=L(),r=S(e);if(r.length===0){process.stdout.write(`${t.yellow}\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\u3002${t.reset}
|
|
180
|
+
`);return}let s=n[0]??await Tt(r,"\u9009\u62E9\u8981\u5220\u9664\u7684\u6A21\u578B\uFF1A"),i=Ct(e,s),o=i?Nt(e,i):null;if(!o){process.stdout.write(`${t.red}\u672A\u627E\u5230\u6A21\u578B\uFF1A${s}${t.reset}
|
|
172
181
|
${t.gray}\u63D0\u793A\uFF1A\u53EF\u4F7F\u7528 ${t.reset}xzh model list${t.gray} \u67E5\u770B id \u4E0E\u5E8F\u53F7\u3002${t.reset}
|
|
173
|
-
`),process.exitCode=1;return}
|
|
182
|
+
`),process.exitCode=1;return}vt(e),k(e),process.stdout.write(`
|
|
174
183
|
${t.green}\u2713 \u5DF2\u5220\u9664\u6A21\u578B${t.reset} ${o.id}
|
|
175
|
-
`),
|
|
176
|
-
`);return}let s=n[0]??await
|
|
184
|
+
`),wt(e)}async function Yr(n){let e=L(),r=S(e);if(r.length===0){process.stdout.write(`${t.yellow}\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\u3002${t.reset}
|
|
185
|
+
`);return}let s=n[0]??await Tt(r,"\u9009\u62E9\u8981\u8C03\u6574\u6743\u91CD\u7684\u6A21\u578B\uFF1A"),i=Ct(e,s),o=i?r.find(d=>d.id===i):void 0;if(!o){process.stdout.write(`${t.red}\u672A\u627E\u5230\u6A21\u578B\uFF1A${s}${t.reset}
|
|
177
186
|
${t.gray}\u63D0\u793A\uFF1A\u53EF\u4F7F\u7528 ${t.reset}xzh model list${t.gray} \u67E5\u770B id \u4E0E\u5E8F\u53F7\u3002${t.reset}
|
|
178
|
-
`),process.exitCode=1;return}let a=n[1]??await
|
|
179
|
-
`),process.exitCode=1;return}let u=
|
|
180
|
-
`),process.exitCode=1;return}
|
|
187
|
+
`),process.exitCode=1;return}let a=n[1]??await oe(`\u8BF7\u8F93\u5165 ${o.id} \u7684\u65B0\u6743\u91CD\uFF080 \u8868\u793A\u6682\u4E0D\u4F7F\u7528\uFF09`,String(o.weight)),l=a.trim(),c=/^\d+$/.test(l)?Number(l):Number.NaN;if(Number.isNaN(c)){process.stdout.write(`${t.red}\u6743\u91CD\u5FC5\u987B\u662F \u2265 0 \u7684\u6574\u6570\uFF1A${a}${t.reset}
|
|
188
|
+
`),process.exitCode=1;return}let u=Kt(e,o.id,c);if(!u){process.stdout.write(`${t.red}\u8BBE\u7F6E\u5931\u8D25\uFF1A${o.id}${t.reset}
|
|
189
|
+
`),process.exitCode=1;return}vt(e),k(e),process.stdout.write(`
|
|
181
190
|
${t.green}\u2713 \u5DF2\u66F4\u65B0\u6743\u91CD${t.reset} ${u.id} \u2192 ${u.weight}
|
|
182
|
-
`),
|
|
183
|
-
`);return}
|
|
184
|
-
|
|
185
|
-
${
|
|
186
|
-
`);
|
|
191
|
+
`),wt(e)}async function bs(n){let e=L(),r=S(e);if(r.length===0){process.stdout.write(`${t.yellow}\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\u3002${t.reset}
|
|
192
|
+
`);return}let s=n[0]??await Tt(r,"\u9009\u62E9\u8981\u8BBE\u7F6E\u4E0A\u4E0B\u6587\u7A97\u53E3\u7684\u6A21\u578B\uFF1A"),i=Ct(e,s),o=i?r.find(d=>d.id===i):void 0;if(!o){process.stdout.write(`${t.red}\u672A\u627E\u5230\u6A21\u578B\uFF1A${s}${t.reset}
|
|
193
|
+
${t.gray}\u63D0\u793A\uFF1A\u53EF\u4F7F\u7528 ${t.reset}xzh model list${t.gray} \u67E5\u770B id \u4E0E\u5E8F\u53F7\u3002${t.reset}
|
|
194
|
+
`),process.exitCode=1;return}let a=o.contextWindow??ce(o.model),l=n[1]??await oe(`\u8BF7\u8F93\u5165 ${o.id} \u7684\u4E0A\u4E0B\u6587\u7A97\u53E3\uFF08token\uFF0C\u652F\u6301 128k/1M\uFF09`,String(a)),c=bt(l);if(c===void 0){process.stdout.write(`${t.red}\u65E0\u6CD5\u8BC6\u522B\u7684\u7A97\u53E3\u5927\u5C0F\uFF1A${l}${t.reset}
|
|
195
|
+
`),process.exitCode=1;return}let u=ee(e).find(d=>d.id===o.id);u&&(u.contextWindow=c),k(e),process.stdout.write(`
|
|
196
|
+
${t.green}\u2713 \u5DF2\u66F4\u65B0\u4E0A\u4E0B\u6587\u7A97\u53E3${t.reset} ${o.id} \u2192 ${re(c)} token ${t.gray}(${c})${t.reset}
|
|
197
|
+
`)}function Jr(){let n=L(),e=S(n);if(e.length===0){process.stdout.write(`${t.yellow}\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\u3002${t.reset}
|
|
198
|
+
`);return}Te(n),vt(n),k(n),process.stdout.write(`${t.green}\u2713 \u5DF2\u628A ${e.length} \u4E2A\u6A21\u578B\u7684\u6743\u91CD\u91CD\u7F6E\u4E3A ${T}\u3002${t.reset}
|
|
199
|
+
`)}function ws(){let n=L();Qr(n)}function Vr(){let n=L(),e=new Set(S(n).map(o=>o.id)),r=X.reduce((o,a)=>o+a.models.length,0);process.stdout.write(`
|
|
200
|
+
${t.bold}\u6240\u6709\u53EF\u7528\u6A21\u578B${t.reset}${t.gray}\uFF08${X.length} \u4E2A\u670D\u52A1\u5546\uFF0C\u5171 ${r} \u4E2A\u5185\u7F6E\u6A21\u578B\uFF09${t.reset}
|
|
201
|
+
`);for(let o of X){let a=n.providers[o.id]!==void 0?` ${t.gray}\xB7 \u5DF2\u586B\u5199 Key${t.reset}`:"";if(process.stdout.write(`
|
|
187
202
|
${t.bold}${o.label}${t.reset} ${t.gray}(${o.id})${t.reset}${a}
|
|
188
203
|
`),o.models.length===0){process.stdout.write(` ${t.gray}\u65E0\u5185\u7F6E\u5217\u8868\uFF0C\u9700\u624B\u52A8\u8F93\u5165\u6A21\u578B\u540D${o.requiresBaseUrl?"\uFF08\u81EA\u5B9A\u4E49\u7AEF\u70B9\uFF09":""}${t.reset}
|
|
189
|
-
`);continue}for(let l of o.models){let c=
|
|
190
|
-
`)}}let s=new Set(
|
|
204
|
+
`);continue}for(let l of o.models){let c=se(o.id,l),u=e.has(c),d=u?`${t.brightGreen}\u276F${t.reset}`:" ",h=[];l===o.defaultModel&&h.push("\u9ED8\u8BA4"),u&&h.push("\u5DF2\u914D\u7F6E");let m=h.length>0?` ${t.gray}\u2190 ${h.join(" \xB7 ")}${t.reset}`:"";process.stdout.write(` ${d} ${l}${m}
|
|
205
|
+
`)}}let s=new Set(X.flatMap(o=>o.models.map(a=>se(o.id,a)))),i=S(n).filter(o=>!s.has(o.id));if(i.length>0){process.stdout.write(`
|
|
191
206
|
${t.bold}\u5DF2\u914D\u7F6E\u7684\u81EA\u5B9A\u4E49\u6A21\u578B${t.reset}${t.gray}\uFF08\u4E0D\u5728\u4E0A\u9762\u7684\u5185\u7F6E\u5217\u8868\u4E2D\uFF09${t.reset}
|
|
192
207
|
`);for(let o of i)process.stdout.write(` ${t.brightGreen}\u276F${t.reset} ${o.id} ${t.gray}\u2190 \u6743\u91CD ${o.weight}${t.reset}
|
|
193
208
|
`)}process.stdout.write(`
|
|
194
209
|
${t.gray}\u276F \u8868\u793A\u5DF2\u52A0\u5165\u914D\u7F6E\u3002\u6DFB\u52A0\u6A21\u578B\uFF1A${t.reset}${t.brightGreen}xzh model add <provider> <model>${t.reset}
|
|
195
210
|
${t.gray}\u67E5\u770B\u5DF2\u914D\u7F6E\u7684\u6A21\u578B\u4E0E\u6743\u91CD\uFF1A${t.reset}xzh model list
|
|
196
|
-
`)}async function
|
|
211
|
+
`)}async function vs(){for(;;){let n=L();switch(Qr(n),await Ce("\u8BF7\u9009\u62E9\u64CD\u4F5C\uFF1A",[{label:"\u65B0\u589E\u6A21\u578B",value:"add",hint:"add"},{label:"\u67E5\u770B\u6240\u6709\u53EF\u7528\u6A21\u578B",value:"all",hint:"all"},{label:"\u5220\u9664\u6A21\u578B",value:"remove",hint:"remove"},{label:"\u8C03\u6574\u8C03\u7528\u6743\u91CD",value:"weight",hint:"weight"},{label:`\u6062\u590D\u5168\u90E8\u6743\u91CD\u4E3A ${T}`,value:"reset",hint:"reset"},{label:"\u9000\u51FA",value:"exit"}],0)){case"add":await xt([]);break;case"all":Vr();break;case"remove":await Zr([]);break;case"weight":await Yr([]);break;case"reset":Jr();break;default:process.stdout.write(`
|
|
197
212
|
${t.gray}\u5DF2\u9000\u51FA\u6A21\u578B\u7BA1\u7406\u3002${t.reset}
|
|
198
|
-
`);return}}}function
|
|
199
|
-
${t.bold}\u7384\u732A\u6A21\u578B\u5217\u8868${t.reset} ${t.gray}(${
|
|
213
|
+
`);return}}}function Qr(n){let e=S(n),r=Q(n);if(process.stdout.write(`
|
|
214
|
+
${t.bold}\u7384\u732A\u6A21\u578B\u5217\u8868${t.reset} ${t.gray}(${E()})${t.reset}
|
|
200
215
|
`),e.length===0){process.stdout.write(` ${t.yellow}\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\u3002${t.reset}
|
|
201
216
|
${t.gray}\u8FD0\u884C ${t.reset}xzh model add <provider> <model>${t.gray} \u6DFB\u52A0\u3002${t.reset}
|
|
202
|
-
`);return}e.slice().sort((i,o)=>o.weight-i.weight).forEach((i,o)=>{let a=r!==null&&i.id===r.id,l=a?`${t.brightGreen}\u276F${t.reset}`:" ",c=i.weight<=0?t.red:i.weight<
|
|
203
|
-
`)}),process.stdout.write(`${t.gray} \u6743\u91CD\u8D8A\u9AD8\u8D8A\u4F18\u5148\uFF1B\u8C03\u7528\u5931\u8D25 -1\uFF0C\u5168\u90E8\u4E3A 0 \u65F6\u81EA\u52A8\u91CD\u7F6E\u4E3A ${
|
|
204
|
-
`)}function
|
|
217
|
+
`);return}e.slice().sort((i,o)=>o.weight-i.weight).forEach((i,o)=>{let a=r!==null&&i.id===r.id,l=a?`${t.brightGreen}\u276F${t.reset}`:" ",c=i.weight<=0?t.red:i.weight<T?t.yellow:t.green,u=a?` ${t.gray}\u2190 \u5F53\u524D\u4F7F\u7528${t.reset}`:"",d=re(i.contextWindow??ce(i.model));process.stdout.write(` ${l} ${o+1}. ${i.id.padEnd(34)} ${t.gray}\u6743\u91CD${t.reset} ${c}${String(i.weight).padStart(3)}${t.reset} ${t.gray}ctx ${d.padStart(5)}${t.reset}${u}
|
|
218
|
+
`)}),process.stdout.write(`${t.gray} \u6743\u91CD\u8D8A\u9AD8\u8D8A\u4F18\u5148\uFF1B\u8C03\u7528\u5931\u8D25 -1\uFF0C\u5168\u90E8\u4E3A 0 \u65F6\u81EA\u52A8\u91CD\u7F6E\u4E3A ${T}\u3002${t.reset}
|
|
219
|
+
`)}function wt(n){let e=Q(n);e?process.stdout.write(`${t.gray}\u4E0B\u6B21\u542F\u52A8\u5C06\u4F7F\u7528\u6743\u91CD\u6700\u9AD8\u7684\u6A21\u578B\uFF1A${t.reset}${t.bold}${e.id}${t.reset} ${t.gray}(\u6743\u91CD ${e.weight})${t.reset}
|
|
205
220
|
`):(n.models??[]).length===0?process.stdout.write(`${t.yellow}\u26A0 \u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\uFF0C\u8FD0\u884C ${t.reset}xzh model add <provider> <model>${t.yellow} \u6DFB\u52A0\u3002${t.reset}
|
|
206
221
|
`):process.stdout.write(`${t.yellow}\u26A0 \u6240\u6709\u6A21\u578B\u6743\u91CD\u5747\u4E3A 0\uFF08\u5DF2\u505C\u7528\uFF09\uFF0C\u8FD0\u884C ${t.reset}xzh model weight <id> <\u6743\u91CD>${t.yellow} \u542F\u7528\u5176\u4E2D\u4E00\u4E2A\u3002${t.reset}
|
|
207
222
|
`),process.stdout.write(`
|
|
208
223
|
\u8FD0\u884C ${t.brightGreen}xzh${t.reset} \u5F00\u59CB\u4F7F\u7528\u3002
|
|
209
|
-
`)}function
|
|
224
|
+
`)}function Cs(){process.stdout.write(`
|
|
210
225
|
${t.bold}xzh model \u2014\u2014 \u591A\u6A21\u578B\u7BA1\u7406${t.reset}
|
|
211
226
|
${t.green}xzh model${t.reset} \u4EA4\u4E92\u5F0F\u83DC\u5355
|
|
212
227
|
${t.green}xzh model list${t.reset} \u5217\u51FA\u5DF2\u914D\u7F6E\u7684\u6A21\u578B\u4E0E\u6743\u91CD
|
|
213
228
|
${t.green}xzh model all${t.reset} \u5217\u51FA\u6240\u6709\u5185\u7F6E\u53EF\u7528\u6A21\u578B
|
|
214
|
-
${t.green}xzh model add <provider> <model> [\u6743\u91CD]${t.reset} \u65B0\u589E\u6A21\u578B\uFF08\u9ED8\u8BA4\u6743\u91CD ${
|
|
229
|
+
${t.green}xzh model add <provider> <model> [\u6743\u91CD]${t.reset} \u65B0\u589E\u6A21\u578B\uFF08\u9ED8\u8BA4\u6743\u91CD ${T}\uFF09
|
|
215
230
|
${t.green}xzh model remove <id|\u5E8F\u53F7>${t.reset} \u5220\u9664\u6A21\u578B
|
|
216
231
|
${t.green}xzh model weight <id|\u5E8F\u53F7> <\u6743\u91CD>${t.reset} \u8C03\u6574\u6743\u91CD
|
|
217
|
-
${t.green}xzh model
|
|
232
|
+
${t.green}xzh model context <id|\u5E8F\u53F7> <\u5927\u5C0F>${t.reset} \u8C03\u6574\u4E0A\u4E0B\u6587\u7A97\u53E3\uFF08\u652F\u6301 128k/1M\uFF09
|
|
233
|
+
${t.green}xzh model reset${t.reset} \u6062\u590D\u5168\u90E8\u6743\u91CD\u4E3A ${T}
|
|
218
234
|
|
|
219
235
|
${t.bold}\u6743\u91CD\u673A\u5236${t.reset}
|
|
220
236
|
\u542F\u52A8\u65F6\u4F18\u5148\u52A0\u8F7D\u6743\u91CD\u6700\u9AD8\u7684\u6A21\u578B\uFF1B\u8C03\u7528\u5931\u8D25\u65F6\u8BE5\u6A21\u578B\u6743\u91CD -1\uFF0C\u5E76\u81EA\u52A8\u5207\u6362\u5230\u4E0B\u4E00\u4E2A\u53EF\u7528\u6A21\u578B\uFF1B
|
|
221
|
-
\u5F53\u6240\u6709\u6A21\u578B\u6743\u91CD\u90FD\u4E3A 0 \u65F6\uFF0C\u4F1A\u5728\u7EC8\u7AEF\u8B66\u544A\u5E76\u628A\u5168\u90E8\u6743\u91CD\u91CD\u7F6E\u4E3A ${
|
|
222
|
-
|
|
223
|
-
${t.gray}\u53EF\u7528 provider\uFF1A${
|
|
224
|
-
`)}function
|
|
225
|
-
`),
|
|
237
|
+
\u5F53\u6240\u6709\u6A21\u578B\u6743\u91CD\u90FD\u4E3A 0 \u65F6\uFF0C\u4F1A\u5728\u7EC8\u7AEF\u8B66\u544A\u5E76\u628A\u5168\u90E8\u6743\u91CD\u91CD\u7F6E\u4E3A ${T}\u3002
|
|
238
|
+
|
|
239
|
+
${t.gray}\u53EF\u7528 provider\uFF1A${X.map(n=>n.id).join(", ")}${t.reset}
|
|
240
|
+
`)}function vt(n){let e=n.models??[],r=e.length>0?e.slice().sort((s,i)=>i.weight-s.weight||s.id.localeCompare(i.id))[0]:null;n.provider=r?r.provider:"",n.model=r?r.model:""}async function Ts(){return Ce("\u9009\u62E9 AI \u670D\u52A1\u5546\uFF1A",X.map(n=>({label:n.label,value:n.id,hint:n.id})),0)}async function Ss(n,e,r){let s=r.providers[n]?.model;if(e.length>0){let o=[...e.map(c=>({label:c,value:c})),{label:"\u624B\u52A8\u8F93\u5165\u6A21\u578B\u540D",value:"__custom__"}],a=s?Math.max(0,e.indexOf(s)):0,l=await Ce(`\u9009\u62E9\u6A21\u578B\uFF08${n}\uFF09\uFF1A`,o,a);if(l!=="__custom__")return l}return await oe("\u8BF7\u8F93\u5165\u6A21\u578B\u540D\u79F0",s)}async function Es(n,e,r){let s=r.providers[n]?.baseUrl;return e?await oe("\u8BF7\u8F93\u5165 API \u7AEF\u70B9 baseUrl",s):s??""}function bt(n){let e=n.trim().toLowerCase().replace(/[_,\s]/g,"");if(!e)return;let r=/^(\d+(?:\.\d+)?)(k|m|万)?$/.exec(e);if(!r)return;let s=Number(r[1]);if(!Number.isFinite(s)||s<=0)return;let i=r[2],a=Math.floor(s*(i==="k"?1e3:i==="m"?1e6:i==="\u4E07"?1e4:1));return a>0?a:void 0}async function ks(n,e){let r=ce(n);if(e!==void 0&&e.trim()!==""){let o=bt(e);return o===void 0?(process.stdout.write(`${t.yellow}\u65E0\u6CD5\u8BC6\u522B\u4E0A\u4E0B\u6587\u7A97\u53E3\u300C${e}\u300D\uFF0C\u5DF2\u4F7F\u7528\u63A8\u65AD\u503C ${re(r)}\u3002${t.reset}
|
|
241
|
+
`),r):o}process.stdout.write(`${t.gray} \u4E0A\u4E0B\u6587\u7A97\u53E3\uFF1A\u6309\u6A21\u578B\u540D\u63A8\u65AD\u4E3A ${re(r)} token\u3002${t.reset}
|
|
242
|
+
`);let s=await oe("\u8BF7\u8F93\u5165\u4E0A\u4E0B\u6587\u7A97\u53E3\u5927\u5C0F\uFF08token\uFF0C\u652F\u6301 128k/1M\uFF1B\u56DE\u8F66\u4F7F\u7528\u63A8\u65AD\u503C\uFF09",String(r)),i=bt(s);return i===void 0?(process.stdout.write(`${t.yellow} \u65E0\u6CD5\u8BC6\u522B\u300C${s}\u300D\uFF0C\u5DF2\u4F7F\u7528\u63A8\u65AD\u503C ${re(r)}\u3002${t.reset}
|
|
243
|
+
`),r):i}async function _s(n,e,r){let s=Z(n),i=r.providers[n]?.apiKey;return s?.requiresApiKey?(Ae(s,i)&&process.stdout.write(`${t.gray}\u5DF2\u68C0\u6D4B\u5230 API Key\uFF08${e} \u6216\u914D\u7F6E\u4E2D\uFF09\uFF0C\u76F4\u63A5\u56DE\u8F66\u4FDD\u7559\u3002${t.reset}
|
|
244
|
+
`),await oe("\u8BF7\u8F93\u5165 API Key",i??"",{mask:!0})):i??""}function Ct(n,e){let r=S(n),s=r.find(o=>o.id===e);if(s)return s.id;let i=r.find(o=>o.model===e);if(i)return i.id;if(/^\d+$/.test(e.trim())){let o=r.slice().sort((l,c)=>c.weight-l.weight),a=Number.parseInt(e,10);if(a>=1&&a<=o.length)return o[a-1].id}return null}async function Tt(n,e){let r=n.slice().sort((s,i)=>i.weight-s.weight);return Ce(e,r.map(s=>({label:`${s.id} \u6743\u91CD ${s.weight}`,value:s.id})),0)}async function en(){let n=be();process.stdout.write(`
|
|
226
245
|
${t.bold}\u7384\u732A\u6280\u80FD\u4F9D\u8D56\u68C0\u67E5${t.reset} ${t.gray}(\u5E73\u53F0\uFF1A${n})${t.reset}
|
|
227
246
|
|
|
228
|
-
`);let e=[],r=[],s=[],i=0;for(let o of
|
|
247
|
+
`);let e=[],r=[],s=[],i=0;for(let o of Tr())for(let a of de(o)){if(i++,await Be(a)){process.stdout.write(`${t.green}\u2713${t.reset} ${a.name} ${t.gray}\u5DF2\u5B89\u88C5${t.reset}
|
|
229
248
|
`);continue}let l=a.install[n];if(!l){process.stdout.write(`${t.yellow}\u26A0${t.reset} ${a.name} ${t.gray}\u5F53\u524D\u5E73\u53F0\u65E0\u81EA\u52A8\u5B89\u88C5\u547D\u4EE4${t.reset}
|
|
230
249
|
`),s.push(a.name);continue}if(process.stdout.write(`
|
|
231
250
|
${t.yellow}\u25CF${t.reset} ${t.bold}${a.name}${t.reset} ${t.gray}\u672A\u5B89\u88C5${t.reset}
|
|
232
251
|
${t.gray}\u6240\u5C5E\u6280\u80FD\uFF1A${o}${t.reset}
|
|
233
252
|
${t.gray}\u5B89\u88C5\u547D\u4EE4\uFF1A${t.reset}${l}
|
|
234
|
-
`),!await
|
|
253
|
+
`),!await Gr(" \u662F\u5426\u73B0\u5728\u5B89\u88C5\uFF1F",!0)){s.push(a.name);continue}(await gt(a,n,void 0,d=>process.stdout.write(`${t.gray} ${d}${t.reset}
|
|
235
254
|
`))).ok?(process.stdout.write(`${t.green} \u2713 ${a.name} \u5B89\u88C5\u5B8C\u6210${t.reset}
|
|
236
255
|
`),e.push(a.name)):(process.stdout.write(`${t.red} \u2717 ${a.name} \u5B89\u88C5\u5931\u8D25${t.reset}
|
|
237
256
|
`),r.push(a.name))}process.stdout.write(`
|
|
@@ -242,32 +261,32 @@ ${t.bold}\u7ED3\u679C${t.reset}
|
|
|
242
261
|
`)),i===0?process.stdout.write(` ${t.gray}\u6CA1\u6709\u58F0\u660E\u5916\u90E8\u4F9D\u8D56\u7684\u5185\u7F6E\u6280\u80FD\u3002${t.reset}
|
|
243
262
|
`):e.length===0&&s.length===0&&r.length===0&&process.stdout.write(` ${t.green}\u6240\u6709\u6280\u80FD\u4F9D\u8D56\u5747\u5DF2\u5C31\u7EEA\u3002${t.reset}
|
|
244
263
|
`),process.stdout.write(`
|
|
245
|
-
`)}
|
|
264
|
+
`)}process.stdout.on("error",n=>{n.code==="EPIPE"&&process.exit(0)});process.stderr.on("error",()=>{});for(let n of["SIGTERM","SIGHUP"])process.on(n,()=>{Ze(),process.exit(0)});process.on("uncaughtException",n=>{Ze(),process.stderr.write(`
|
|
246
265
|
\u672A\u6355\u83B7\u5F02\u5E38\uFF1A${n?.stack??String(n)}
|
|
247
|
-
`),process.exit(1)});process.on("unhandledRejection",n=>{
|
|
266
|
+
`),process.exit(1)});process.on("unhandledRejection",n=>{Ze(),process.stderr.write(`
|
|
248
267
|
\u672A\u5904\u7406\u7684 Promise \u62D2\u7EDD\uFF1A${String(n)}
|
|
249
|
-
`),process.exit(1)});async function
|
|
250
|
-
`);let e=process.argv.slice(2),r;e.includes("--intent")?r=!0:e.includes("--no-intent")&&(r=!1);let s=e.filter(o=>o!=="--intent"&&o!=="--no-intent"),i=s[0];switch(i){case void 0:await
|
|
251
|
-
`);return;default:{if(i.startsWith("-")){
|
|
268
|
+
`),process.exit(1)});async function Ms(){let n=_t();n.migrated&&process.stdout.write(`${t.gray}\u5DF2\u5C06\u5168\u5C40\u76EE\u5F55\u8FC1\u79FB\u81F3 ${j()}${n.from?`\uFF08\u539F ${n.from}\uFF09`:""}${t.reset}
|
|
269
|
+
`);let e=process.argv.slice(2),r;e.includes("--intent")?r=!0:e.includes("--no-intent")&&(r=!1);let s=e.filter(o=>o!=="--intent"&&o!=="--no-intent"),i=s[0];switch(i){case void 0:await tn(void 0,r);return;case"model":await Xr(s.slice(1));return;case"config":await qr(s.slice(1));return;case"setup":await en();return;case"help":case"-h":case"--help":rn();return;case"version":case"-v":case"--version":process.stdout.write(`\u7384\u732A xzh v${we}
|
|
270
|
+
`);return;default:{if(i.startsWith("-")){rn();return}let o=Ps(i);if(o){await tn(o,r);return}if(Rs(i)){process.stdout.write(`${t.red}\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55\uFF1A${i}${t.reset}
|
|
252
271
|
`),process.exitCode=1;return}process.stdout.write(`${t.red}\u672A\u77E5\u547D\u4EE4\uFF1A${i}${t.reset}
|
|
253
272
|
${t.gray}\u8FD0\u884C ${t.reset}xzh --help${t.gray} \u67E5\u770B\u7528\u6CD5\uFF0C\u6216\u8FD0\u884C ${t.reset}xzh <\u76EE\u5F55>${t.gray} \u6307\u5B9A\u9879\u76EE\u76EE\u5F55\u3002${t.reset}
|
|
254
|
-
`),process.exitCode=1}}}function
|
|
273
|
+
`),process.exitCode=1}}}function Rs(n){return n.startsWith("/")||n.startsWith("~")||n.startsWith("./")||n.startsWith("../")||n==="."||n===".."}function Ps(n){let e=F(n),r=Je.isAbsolute(e)?e:Je.resolve(process.cwd(),e);try{if(ge.existsSync(r)&&ge.statSync(r).isDirectory())return ge.realpathSync(r)}catch{}return null}async function tn(n,e){if(!process.stdin.isTTY||!process.stdout.isTTY){process.stdout.write(`${t.red}\u7384\u732A\u9700\u8981\u4EA4\u4E92\u5F0F\u7EC8\u7AEF\uFF08TTY\uFF09\u3002${t.reset}
|
|
255
274
|
${t.gray}\u8BF7\u5728\u771F\u5B9E\u7EC8\u7AEF\u4E2D\u8FD0\u884C xzh\u3002${t.reset}
|
|
256
|
-
`),process.exitCode=1;return}let r=L(),s=
|
|
257
|
-
`));let i=
|
|
275
|
+
`),process.exitCode=1;return}let r=L(),s=S(r);s.length>0&&s.every(d=>d.weight<=0&&d.decayed===!0)&&(Te(r),k(r),process.stdout.write(`${t.yellow}\u26A0 \u6240\u6709\u6A21\u578B\u6743\u91CD\u5747\u4E3A 0\uFF0C\u5DF2\u91CD\u7F6E\u4E3A ${T}\u3002${t.reset}
|
|
276
|
+
`));let i=Q(r);if(!i){process.stdout.write(s.length===0?`${t.yellow}\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\u3002${t.reset}
|
|
258
277
|
${t.gray}\u8BF7\u5148\u8FD0\u884C ${t.reset}xzh model add <provider> <model>${t.gray} \u6DFB\u52A0\u6A21\u578B\u3002${t.reset}
|
|
259
278
|
`:`${t.red}\u6CA1\u6709\u53EF\u7528\u7684\u6A21\u578B\uFF08\u5168\u90E8\u6743\u91CD\u4E3A 0\uFF09\u3002${t.reset}
|
|
260
279
|
${t.gray}\u8FD0\u884C ${t.reset}xzh model${t.gray} \u67E5\u770B\u4E0E\u7BA1\u7406\u6A21\u578B\u3002${t.reset}
|
|
261
|
-
`),process.exitCode=1;return}let o=
|
|
280
|
+
`),process.exitCode=1;return}let o=lt(r,i);if(o.length>0){process.stdout.write(`${t.yellow}\u26A0 \u5F53\u524D\u6A21\u578B\u4E0D\u53EF\u7528\uFF1A${t.reset}
|
|
262
281
|
`);for(let d of o)process.stdout.write(` ${t.gray}\xB7${t.reset} ${d}
|
|
263
|
-
`);
|
|
264
|
-
${t.gray}\u914D\u7F6E\u6587\u4EF6\uFF1A${
|
|
282
|
+
`);xe()?process.stdout.write(`
|
|
283
|
+
${t.gray}\u914D\u7F6E\u6587\u4EF6\uFF1A${E()}${t.reset}
|
|
265
284
|
`):process.stdout.write(`
|
|
266
285
|
${t.gray}\u63D0\u793A\uFF1A\u8FD0\u884C ${t.reset}xzh model${t.gray} \u5B8C\u6210\u521D\u59CB\u5316\u914D\u7F6E\u3002${t.reset}
|
|
267
|
-
`),process.exitCode=1;return}let a=
|
|
286
|
+
`),process.exitCode=1;return}let a=Yt(r).filter(d=>!o.includes(d));if(a.length>0){process.stdout.write(`${t.yellow}\u26A0 ${a.length} \u4E2A\u5907\u7528\u6A21\u578B\u6682\u4E0D\u53EF\u7528\uFF08\u4E0D\u5F71\u54CD\u672C\u6B21\u542F\u52A8\uFF09\uFF1A${t.reset}
|
|
268
287
|
`);for(let d of a)process.stdout.write(` ${t.gray}\xB7${t.reset} ${d}
|
|
269
|
-
`)}let l=
|
|
270
|
-
${t.brightMagenta}${t.bold}\u7384\u732A XuanZhu${t.reset} ${t.gray}v${
|
|
288
|
+
`)}let l=Z(i.provider),c=Ie(r,i);await new Ge({provider:c,config:r,cwd:n??process.cwd(),providerLabel:l?.label??i.provider,model:i.model,modelWeight:i.weight,activeModel:i,intentEnabled:e!==void 0?e:r.intent?.enabled===!0,autoApprove:r.autoApprove}).start()}function rn(){let n=`
|
|
289
|
+
${t.brightMagenta}${t.bold}\u7384\u732A XuanZhu${t.reset} ${t.gray}v${we} \u2014\u2014 \u4E13\u4E3A\u7EC8\u7AEF\u6253\u9020\u7684 AI \u7F16\u7801 Agent${t.reset}
|
|
271
290
|
|
|
272
291
|
${t.bold}\u7528\u6CD5${t.reset}
|
|
273
292
|
${t.green}xzh${t.reset} \u5728\u5F53\u524D\u76EE\u5F55\u542F\u52A8\u4EA4\u4E92\u5F0F\u7EC8\u7AEF\u754C\u9762
|
|
@@ -278,7 +297,7 @@ ${t.bold}\u7528\u6CD5${t.reset}
|
|
|
278
297
|
${t.green}xzh model list${t.reset} \u5217\u51FA\u5DF2\u914D\u7F6E\u7684\u6A21\u578B\u4E0E\u6743\u91CD
|
|
279
298
|
${t.green}xzh model all${t.reset} \u5217\u51FA\u6240\u6709\u5185\u7F6E\u53EF\u7528\u7684\u6A21\u578B
|
|
280
299
|
${t.green}xzh model add <provider> <model> [\u6743\u91CD]${t.reset}
|
|
281
|
-
\u65B0\u589E\u6A21\u578B\uFF08\u9ED8\u8BA4\u6743\u91CD ${
|
|
300
|
+
\u65B0\u589E\u6A21\u578B\uFF08\u9ED8\u8BA4\u6743\u91CD ${T}\uFF09
|
|
282
301
|
${t.green}xzh model remove <id|\u5E8F\u53F7>${t.reset} \u5220\u9664\u6A21\u578B
|
|
283
302
|
${t.green}xzh model weight <id|\u5E8F\u53F7> <\u6743\u91CD>${t.reset}
|
|
284
303
|
\u8C03\u6574\u6A21\u578B\u7684\u8C03\u7528\u6743\u91CD
|
|
@@ -294,7 +313,7 @@ ${t.bold}\u652F\u6301\u7684 Provider${t.reset}
|
|
|
294
313
|
deepseek \xB7 anthropic \xB7 openai \xB7 gemini \xB7 glm \xB7 qwen \xB7 groq \xB7 ollama \xB7 custom
|
|
295
314
|
|
|
296
315
|
${t.bold}\u914D\u7F6E${t.reset}
|
|
297
|
-
\u914D\u7F6E\u6587\u4EF6\uFF1A${t.gray}${
|
|
316
|
+
\u914D\u7F6E\u6587\u4EF6\uFF1A${t.gray}${E()}${t.reset}
|
|
298
317
|
API Key \u4E5F\u53EF\u901A\u8FC7\u73AF\u5883\u53D8\u91CF\u63D0\u4F9B\uFF08\u5982 DEEPSEEK_API_KEY / ANTHROPIC_API_KEY\uFF09\u3002
|
|
299
318
|
|
|
300
319
|
${t.bold}\u610F\u56FE\u5206\u6790${t.reset}
|
|
@@ -304,12 +323,12 @@ ${t.bold}\u610F\u56FE\u5206\u6790${t.reset}
|
|
|
304
323
|
|
|
305
324
|
${t.bold}\u591A\u6A21\u578B\u4E0E\u6743\u91CD${t.reset}
|
|
306
325
|
\u542F\u52A8\u65F6\u4F18\u5148\u4F7F\u7528\u6743\u91CD\u6700\u9AD8\u7684\u6A21\u578B\uFF1B\u8C03\u7528\u5931\u8D25\u65F6\u8BE5\u6A21\u578B\u6743\u91CD -1\uFF0C\u5E76\u81EA\u52A8\u5207\u6362\u5230\u4E0B\u4E00\u4E2A\u53EF\u7528\u6A21\u578B\uFF1B
|
|
307
|
-
\u5F53\u6240\u6709\u6A21\u578B\u6743\u91CD\u8017\u5C3D\u65F6\u4F1A\u5728\u7EC8\u7AEF\u8B66\u544A\uFF0C\u5E76\u628A\u5168\u90E8\u6743\u91CD\u91CD\u7F6E\u4E3A ${
|
|
326
|
+
\u5F53\u6240\u6709\u6A21\u578B\u6743\u91CD\u8017\u5C3D\u65F6\u4F1A\u5728\u7EC8\u7AEF\u8B66\u544A\uFF0C\u5E76\u628A\u5168\u90E8\u6743\u91CD\u91CD\u7F6E\u4E3A ${T}\u3002
|
|
308
327
|
|
|
309
328
|
${t.bold}\u754C\u9762\u5185\u5FEB\u6377\u952E${t.reset}
|
|
310
329
|
Enter \u63D0\u4EA4 \xB7 Ctrl+J \u6362\u884C \xB7 \u2191/\u2193 \u5386\u53F2 \xB7 PgUp/PgDn \u6EDA\u52A8
|
|
311
330
|
Ctrl+C \u4E2D\u65AD\u4EFB\u52A1/\u9000\u51FA \xB7 Ctrl+L \u6E05\u5C4F \xB7 \u8F93\u5165 /help \u67E5\u770B\u5185\u7F6E\u547D\u4EE4
|
|
312
331
|
\u5207\u6362\u9879\u76EE\u76EE\u5F55\uFF1A\u5728\u754C\u9762\u4E2D\u8F93\u5165 ${t.green}/switch <\u76EE\u5F55>${t.reset}
|
|
313
|
-
`;process.stdout.write(n)}
|
|
314
|
-
${t.red}\u7384\u732A\u8FD0\u884C\u51FA\u9519\uFF1A${
|
|
332
|
+
`;process.stdout.write(n)}Ms().catch(n=>{process.stdout.write(`
|
|
333
|
+
${t.red}\u7384\u732A\u8FD0\u884C\u51FA\u9519\uFF1A${H(n)}${t.reset}
|
|
315
334
|
`),process.exit(1)});
|