xuanzhu 0.4.2 → 0.4.3
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 +31 -18
- package/dist/cli.js +212 -208
- package/dist/skills/release/SKILL.md +51 -0
- package/dist/skills/release/references/checklist.md +107 -0
- package/dist/skills/release/references/pitfalls.md +66 -0
- package/docs/ARCHITECTURE.md +39 -13
- package/docs/README.en.md +22 -14
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var
|
|
2
|
+
"use strict";var Po=Object.create;var Gn=Object.defineProperty;var Ro=Object.getOwnPropertyDescriptor;var Mo=Object.getOwnPropertyNames;var Io=Object.getPrototypeOf,Do=Object.prototype.hasOwnProperty;var Oo=(n,e,r,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Mo(e))!Do.call(n,i)&&i!==r&&Gn(n,i,{get:()=>e[i],enumerable:!(s=Ro(e,i))||s.enumerable});return n};var v=(n,e,r)=>(r=n!=null?Po(Io(n)):{},Oo(e||!n||!n.__esModule?Gn(r,"default",{value:n,enumerable:!0}):r,n));var dt=v(require("fs")),br=v(require("path"));var ee=v(require("fs"));var J=v(require("fs")),pt=v(require("os")),le=v(require("path"));function T(){let n=process.env.XZH_HOME?.trim();return n?le.resolve(q(n)):le.join(pt.homedir(),".xzh")}function Lo(){return!!process.env.XZH_HOME?.trim()}function No(){return le.join(pt.homedir(),".xuanzhu")}function D(){return le.join(T(),"config.json")}function Xn(){return le.join(__dirname,"skills")}function Vn(){return le.join(T(),"skills")}function Yn(){if(Lo())return{migrated:!1};let n=No(),e=T();if(le.resolve(n)===le.resolve(e))return{migrated:!1};try{if(J.existsSync(e)||!J.existsSync(n))return{migrated:!1}}catch{return{migrated:!1}}try{return J.renameSync(n,e),{migrated:!0,from:n,to:e}}catch{}let r=`${e}.migrating-${process.pid}`;try{J.rmSync(r,{recursive:!0,force:!0}),J.cpSync(n,r,{recursive:!0}),J.renameSync(r,e)}catch{try{J.rmSync(r,{recursive:!0,force:!0})}catch{}return{migrated:!1}}try{J.rmSync(n,{recursive:!0,force:!0})}catch{}return{migrated:!0,from:n,to:e}}function Z(n){J.existsSync(n)||J.mkdirSync(n,{recursive:!0})}function q(n){return n&&(n==="~"?pt.homedir():n.startsWith("~/")||n.startsWith("~\\")?le.join(pt.homedir(),n.slice(2)):n)}var C=v(require("fs")),he=v(require("path")),jo=".xuanzhu",Bo="MEMORY.md",Uo=`# \u9879\u76EE\u89C4\u5219
|
|
3
3
|
|
|
4
4
|
> \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
|
|
5
5
|
> \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
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
- \u5B89\u88C5\u4F9D\u8D56\uFF1A
|
|
12
12
|
- \u8FD0\u884C\u6D4B\u8BD5\uFF1A
|
|
13
13
|
- \u4EE3\u7801\u98CE\u683C\uFF1A
|
|
14
|
-
`,
|
|
14
|
+
`,Fo="AGENTS.md";function es(n){try{return C.existsSync(n)&&C.readFileSync(n,"utf8").trim()||null}catch{return null}}var zo=`# \u9879\u76EE\u89C4\u5219
|
|
15
15
|
|
|
16
16
|
> \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\u3002
|
|
17
17
|
> \u7559\u7A7A\u6216\u5220\u9664\u672C\u6587\u4EF6\u5373\u8868\u793A\u4E0D\u4F7F\u7528\u9879\u76EE\u89C4\u5219\u3002
|
|
@@ -22,18 +22,18 @@
|
|
|
22
22
|
\u76EE\u5F55\u7ED3\u6784\u7B49\uFF09\u3002**\u4F60\u5FC5\u987B\u4E25\u683C\u6309\u7167 \`AGENTS.md\` \u6267\u884C\u3002**
|
|
23
23
|
|
|
24
24
|
\u5728\u5F00\u59CB\u4EFB\u4F55\u5DE5\u4F5C\u4E4B\u524D\uFF0C\u5148\u8BFB\u53D6\u9879\u76EE\u6839\u76EE\u5F55\u7684 \`AGENTS.md\`\u3002\u82E5\u5B83\u5728\u4F1A\u8BDD\u8FC7\u7A0B\u4E2D\u88AB\u4FEE\u6539\uFF0C
|
|
25
|
-
\u8BF7\u91CD\u65B0\u8BFB\u53D6\u4EE5\u83B7\u53D6\u6700\u65B0\u5185\u5BB9 \u2014\u2014 \u5B83\u59CB\u7EC8\u662F\u672C\u9879\u76EE\u7EA6\u5B9A\u7684\u552F\u4E00\u6765\u6E90\u3002`;function
|
|
26
|
-
`}function
|
|
25
|
+
\u8BF7\u91CD\u65B0\u8BFB\u53D6\u4EE5\u83B7\u53D6\u6700\u65B0\u5185\u5BB9 \u2014\u2014 \u5B83\u59CB\u7EC8\u662F\u672C\u9879\u76EE\u7EA6\u5B9A\u7684\u552F\u4E00\u6765\u6E90\u3002`;function Zn(n){return es(he.join(n,Fo))===null?Uo:`${zo}
|
|
26
|
+
`}function Jo(n){let e=he.join(n,jo),r=he.join(e,"memory");return{root:n,dir:e,memoryDir:r,longTermFile:he.join(r,Bo),rulesFile:he.join(e,"rules.md")}}function Q(n){return Jo(he.resolve(n))}function wr(n){let e=Q(n);if(C.existsSync(e.dir)){C.mkdirSync(e.memoryDir,{recursive:!0});try{C.existsSync(e.rulesFile)||C.writeFileSync(e.rulesFile,Zn(e.root),"utf8")}catch{}return{paths:e,created:!1}}try{return C.mkdirSync(e.memoryDir,{recursive:!0}),C.writeFileSync(e.rulesFile,Zn(e.root),"utf8"),{paths:e,created:!0}}catch{return{paths:e,created:!1}}}function ts(n){return es(Q(n).rulesFile)}function Ko(n,e=new Date){let r=`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`;return he.join(Q(n).memoryDir,`${r}.md`)}function Xe(n){let e=Q(n),r="",s="",i="";try{C.existsSync(e.longTermFile)&&(r=C.readFileSync(e.longTermFile,"utf8").trim())}catch{}try{if(C.existsSync(e.memoryDir)){let o=C.readdirSync(e.memoryDir).filter(a=>/^\d{4}-\d{2}-\d{2}\.md$/.test(a)).sort().reverse();o.length>0&&(i=o[0],s=C.readFileSync(he.join(e.memoryDir,o[0]),"utf8").trim())}}catch{}return{longTerm:r,recentDailyName:i,recentDaily:s}}function rs(n,e,r){let s=Q(n);C.mkdirSync(s.memoryDir,{recursive:!0});let i=new Date,o=p=>String(p).padStart(2,"0"),a=`${i.getFullYear()}-${o(i.getMonth()+1)}-${o(i.getDate())} ${o(i.getHours())}:${o(i.getMinutes())}`,l=r==="long"?s.longTermFile:Ko(n,i),c=`
|
|
27
27
|
|
|
28
28
|
## ${a}
|
|
29
29
|
|
|
30
30
|
${e.trim()}
|
|
31
31
|
`,u=C.existsSync(l)?"":r==="long"?`# \u9879\u76EE\u957F\u671F\u8BB0\u5FC6
|
|
32
32
|
`:`# \u6BCF\u65E5\u8BB0\u5F55
|
|
33
|
-
`;return C.appendFileSync(l,`${u}${c}`,"utf8"),l}var me=
|
|
33
|
+
`;return C.appendFileSync(l,`${u}${c}`,"utf8"),l}var me=12e3;function ns(n){return/^##\s+\d{4}-\d{2}-\d{2}(\s+\d{2}:\d{2})?\s*$/.test(n)}function Ho(n){for(let e=n.length-1;e>=0;e--)if(ns(n[e].title))return e;return-1}function qo(n){let e=n.split(`
|
|
34
34
|
`),r=-1;for(let c=0;c<e.length;c++)if(/^##\s/.test(e[c])){r=c;break}if(r<0)return{header:n.trim(),blocks:[]};let s=e.slice(0,r).join(`
|
|
35
35
|
`).trim(),i=[],o="",a=[],l=()=>{o&&i.push({title:o,body:a.join(`
|
|
36
|
-
`).trim()})};for(let c=r;c<e.length;c++){let u=e[c];/^##\s/.test(u)?(l(),o=u.trim(),a=[]):a.push(u)}return l(),{header:s,blocks:i}}function
|
|
36
|
+
`).trim()})};for(let c=r;c<e.length;c++){let u=e[c];/^##\s/.test(u)?(l(),o=u.trim(),a=[]):a.push(u)}return l(),{header:s,blocks:i}}function Qn(n,e){let r=n||"# \u9879\u76EE\u957F\u671F\u8BB0\u5FC6";if(e.length===0)return`${r}
|
|
37
37
|
`;let s=e.map(i=>`${i.title}
|
|
38
38
|
|
|
39
39
|
${i.body}`);return`${r}
|
|
@@ -41,10 +41,10 @@ ${i.body}`);return`${r}
|
|
|
41
41
|
${s.join(`
|
|
42
42
|
|
|
43
43
|
`)}
|
|
44
|
-
`}function
|
|
45
|
-
`:"",i=`${r.longTermFile}.${process.pid}.tmp`;return C.writeFileSync(i,s,"utf8"),C.renameSync(i,r.longTermFile),r.longTermFile}var
|
|
46
|
-
\u6D88\u606F\uFF1A${e}`}var
|
|
47
|
-
`,s=`${e}.${process.pid}.tmp`;ee.writeFileSync(s,r,{mode:384});try{ee.chmodSync(s,384)}catch{}ee.renameSync(s,e);try{ee.chmodSync(e,384)}catch{}}function ht(){return ee.existsSync(D())}function
|
|
44
|
+
`}function Wo(n){return n.replace(/\s+/g," ").trim()}function Go(n,e=me){let r=Q(n);if(!C.existsSync(r.longTermFile))return null;let s;try{s=C.readFileSync(r.longTermFile,"utf8")}catch{return null}let i=s.trim().length,{header:o,blocks:a}=qo(s);if(a.length===0)return{before:i,after:i,removedDuplicates:0,removedOldest:0};let l=new Set,c=[],u=0;for(let h of a){let m=Wo(h.body);if(m&&l.has(m)){u++;continue}m&&l.add(m),c.push(h)}let p=0;if(e>0){let h=Math.max(200,Math.floor(e)),m=Qn(o,c).trim().length;for(;m>h;){let f=Ho(c),y=c.findIndex((S,$)=>ns(S.title)&&$!==f);if(y<0)break;let g=c.splice(y,1)[0];m-=g.title.length+g.body.length+4,p++}}if(u===0&&p===0)return{before:i,after:i,removedDuplicates:0,removedOldest:0};let d=Qn(o,c);return Cr(n,d),{before:i,after:d.trim().length,removedDuplicates:u,removedOldest:p}}function Tt(n,e=me){let r=!(e>0),s=Q(n),i;try{if(!C.existsSync(s.longTermFile))return null;i=C.readFileSync(s.longTermFile,"utf8").trim().length}catch{return null}return!r&&i<=e?null:Go(n,e)}function Cr(n,e){let r=Q(n);C.mkdirSync(r.memoryDir,{recursive:!0});let s=e.trim()?`${e.trim()}
|
|
45
|
+
`:"",i=`${r.longTermFile}.${process.pid}.tmp`;return C.writeFileSync(i,s,"utf8"),C.renameSync(i,r.longTermFile),r.longTermFile}var Tr="{{'\u7528\u6237\u53D1\u9001\u8FC7\u6765\u7684\u6D88\u606F'}}",is=`\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 ${Tr}`;function os(n,e){if(n.includes(Tr))return n.replace(Tr,()=>e);let r=/\{\{\s*[^{}]*\s*\}\}/;return r.test(n)?n.replace(r,()=>e):`${n}
|
|
46
|
+
\u6D88\u606F\uFF1A${e}`}var Xo=1,B={version:Xo,provider:"deepseek",model:"deepseek-chat",models:[],intent:{enabled:!1},providers:{},maxToolRounds:200,autoApprove:!0,mouseCapture:!0,confirmSensitiveRead:!1,memoryMaxChars:me,maxParallelAgents:4,temperature:.2};function te(){let n=D();try{if(!ee.existsSync(n))return{...B,provider:"",model:"",models:[]};let e=ee.readFileSync(n,"utf8"),r=JSON.parse(e);return Yo(r)}catch(e){throw new Error(`\u8BFB\u53D6\u914D\u7F6E\u5931\u8D25\uFF08${n}\uFF09\uFF1A${e instanceof Error?e.message:String(e)}`)}}function Vo(n){let e={id:n.id||ve(n.provider,n.model),provider:n.provider,model:n.model};return n.apiKey&&(e.apiKey=n.apiKey),n.baseUrl&&(e.baseUrl=n.baseUrl),Ar(n.contextWindow)&&(e.contextWindow=Math.floor(n.contextWindow)),typeof n.vision=="boolean"&&(e.vision=n.vision),e}function Yo(n){let e=Array.isArray(n.models)?n.models.filter(r=>!!r&&typeof r.provider=="string"&&typeof r.model=="string").map(r=>Vo(r)):B.models;return{...B,...n,models:e,intent:{enabled:n.intent?.enabled===!0,...n.intent?.prompt?{prompt:n.intent.prompt}:{}},providers:{...B.providers,...n.providers??{}},maxToolRounds:n.maxToolRounds??B.maxToolRounds,autoApprove:n.autoApprove??B.autoApprove,mouseCapture:n.mouseCapture??B.mouseCapture,confirmSensitiveRead:n.confirmSensitiveRead??B.confirmSensitiveRead,memoryMaxChars:n.memoryMaxChars??B.memoryMaxChars,maxParallelAgents:n.maxParallelAgents??B.maxParallelAgents,temperature:n.temperature??B.temperature}}function W(n){Z(T());let e=D(),r=JSON.stringify(n,null,2)+`
|
|
47
|
+
`,s=`${e}.${process.pid}.tmp`;ee.writeFileSync(s,r,{mode:384});try{ee.chmodSync(s,384)}catch{}ee.renameSync(s,e);try{ee.chmodSync(e,384)}catch{}}function ht(){return ee.existsSync(D())}function ss(n){return n?n.length<=8?"****":`${n.slice(0,4)}...${n.slice(-4)}`:"(\u672A\u8BBE\u7F6E)"}function as(n){let e={};for(let[r,s]of Object.entries(n.providers))e[r]={...s,apiKey:ss(s.apiKey)};return{version:n.version,provider:n.provider,model:n.model,models:U(n).map(r=>({id:r.id,...r.contextWindow?{contextWindow:r.contextWindow}:{},...r.vision===void 0?{}:{vision:r.vision},...r.baseUrl?{baseUrl:r.baseUrl}:{},...r.apiKey?{apiKey:ss(r.apiKey)}:{}})),intent:{enabled:n.intent?.enabled===!0,...n.intent?.prompt?{prompt:n.intent.prompt}:{}},temperature:n.temperature,maxToolRounds:n.maxToolRounds,autoApprove:n.autoApprove,memoryMaxChars:n.memoryMaxChars??B.memoryMaxChars,maxParallelAgents:n.maxParallelAgents??B.maxParallelAgents,systemPromptExtra:n.systemPromptExtra??"",providers:e}}function ve(n,e){return`${n}/${e}`}function U(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:ve(e,r),provider:e,model:r}]:[]}function je(n){let e=U(n);if(e.length===0)return null;let r=n.provider&&n.model?ve(n.provider,n.model):"";return e.find(s=>s.id===r)??e[0]}function ls(n,e,r=[]){let s=U(n);if(s.length===0)return null;let i=new Set(r);i.add(e);let o=s.findIndex(a=>a.id===e);for(let a=1;a<=s.length;a++){let l=s[(o+a+s.length)%s.length];if(!i.has(l.id))return l}return null}function cs(n,e){n.provider=e.provider,n.model=e.model,n.providers={...n.providers,[e.provider]:{...n.providers[e.provider]??{},model:e.model}}}function Ve(n){return(!n.models||n.models.length===0)&&(n.models=U(n)),n.models}function Ar(n){return typeof n=="number"&&Number.isFinite(n)&&n>0}function us(n,e){let r=Ve(n),s=ve(e.provider,e.model),i=r.find(a=>a.id===s);if(i)return e.apiKey&&(i.apiKey=e.apiKey),e.baseUrl&&(i.baseUrl=e.baseUrl),Ar(e.contextWindow)&&(i.contextWindow=Math.floor(e.contextWindow)),typeof e.vision=="boolean"&&(i.vision=e.vision),i;let o={id:s,provider:e.provider,model:e.model,...e.apiKey?{apiKey:e.apiKey}:{},...e.baseUrl?{baseUrl:e.baseUrl}:{},...Ar(e.contextWindow)?{contextWindow:Math.floor(e.contextWindow)}:{},...typeof e.vision=="boolean"?{vision:e.vision}:{}};return r.push(o),o}function Zo(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 ds(n,e){let r=Ve(n),s=Zo(r,e);if(s<0)return null;let[i]=r.splice(s,1),o=n.provider&&n.model?ve(n.provider,n.model):"";if(i&&i.id===o){let a=r[0];n.provider=a?a.provider:"",n.model=a?a.model:""}return i??null}var vs=v(require("@anthropic-ai/sdk"));var hs=v(require("http")),ms=v(require("https"));function fs(n){let e=!/^http:\/\//i.test(n),r={keepAlive:!1};return e?new ms.Agent(r):new hs.Agent(r)}var ps=new Set(["ECONNRESET","ECONNREFUSED","ECONNABORTED","ETIMEDOUT","EPIPE","ENOTFOUND","EAI_AGAIN","UND_ERR_SOCKET","UND_ERR_CONNECT_TIMEOUT","ERR_STREAM_PREMATURE_CLOSE"]),Qo=["premature close","socket hang up","other side closed","fetch failed","network error","connection error","connection reset","terminated","timeout","timed out"];function ea(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 I(n){return typeof n=="string"?n:typeof n=="number"||typeof n=="boolean"?String(n):""}function Ye(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 ta(n){let e=n,r=I(e?.message);if(r)return r;let s=e?.error,i=I(s?.message);if(i)return i;let o=e?.cause,a=I(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 kr(n){let e=n,r=Ye(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=I(e?.code).toUpperCase();if(s&&ps.has(s))return!0;let i=e?.cause,o=I(i?.code).toUpperCase();if(o&&ps.has(o))return!0;let a=(I(e?.message)||I(i?.message)||String(n)).toLowerCase();return Qo.some(l=>a.includes(l))}function ce(n){return ea(ra(n))}function _r(n){let e=n,r=Ye(e?.status);if(r===401||r===403||r===404)return!0;let s=(I(e?.message)||I(e?.error?.message)||I(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 Er(n){return Ye(n?.status)===404}function At(n){let e=n,r=Ye(e?.status);if(r!==void 0&&(r<400||r>=500))return!1;let s=I(e?.code)||I(e?.error?.code);if(/context[_ ]?length|context[_ ]?size|max[_ ]?tokens?_exceeded|token[_ ]?limit/i.test(s))return!0;let i=(I(e?.message)||I(e?.error?.message)||I(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","context size","context_size","exceeds the available context","input length exceeds","exceeds the context","n_ctx","n_keep","too long"].some(o=>i.includes(o))}function kt(n){let e=n,r=Ye(e?.status);if(r!==void 0&&(r<400||r>=500))return!1;let s=(I(e?.message)||I(e?.error?.message)||I(e?.cause?.message)||String(n)).toLowerCase();if(["does not support image","doesn't support image","not support image","unsupported image","image input is not supported","images are not supported","vision is not supported","does not support vision","not a multimodal","not support multimodal","unsupported content type","invalid content type","image_url is only supported","only supported by certain models","\u4E0D\u652F\u6301\u56FE\u7247","\u4E0D\u652F\u6301\u56FE\u50CF","\u4E0D\u652F\u6301\u591A\u6A21\u6001","\u4E0D\u652F\u6301\u89C6\u89C9"].some(l=>s.includes(l)))return!0;let o=/image|vision|multimodal|图片|图像|视觉/.test(s),a=/not support|unsupported|only supported|不支持|无法处理/.test(s);return o&&a}function ra(n){let e=n,r=ta(n),s=r.toLowerCase(),i=I(e?.code).toUpperCase(),o=Ye(e?.status);if(At(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
|
|
48
48
|
\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}
|
|
49
49
|
\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
|
|
50
50
|
\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
|
|
@@ -53,36 +53,36 @@ ${s.join(`
|
|
|
53
53
|
\u4FEE\u597D\u670D\u52A1\u7AEF\u540E\u91CD\u8BD5\u5373\u53EF\uFF1B\u82E5\u672C\u8F6E\u5DF2\u6CBF\u6A21\u578B\u5217\u8868\u56DE\u9000\u5230\u522B\u7684\u6A21\u578B\uFF0C\u4E0B\u6B21\u542F\u52A8\u4F1A\u63A5\u7740\u7528\u5B83\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(kt(n))return`${r}
|
|
54
54
|
\u8BE5\u6A21\u578B\u4E0D\u652F\u6301\u56FE\u7247\u8F93\u5165\uFF08\u7384\u732A\u5DF2\u81EA\u52A8\u53BB\u6389\u56FE\u7247\u91CD\u8BD5\u4E00\u6B21\uFF0C\u672C\u8F6E\u6B63\u6587\u4E0D\u53D7\u5F71\u54CD\uFF09\u3002
|
|
55
55
|
\xB7 \u60F3\u5F7B\u5E95\u907F\u514D\u8FD9\u6B21\u767D\u8BD5\uFF1A\`xzh model vision <id> off\`
|
|
56
|
-
\xB7 \u6216\u6539\u7528 glm-4v / qwen-vl / gpt-4o / claude / gemini \u7B49\u652F\u6301\u89C6\u89C9\u7684\u6A21\u578B`;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 remove <id>` + `xzh model add <provider> <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
|
|
56
|
+
\xB7 \u6216\u6539\u7528 glm-4v / qwen-vl / gpt-4o / claude / gemini \u7B49\u652F\u6301\u89C6\u89C9\u7684\u6A21\u578B`;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 remove <id>` + `xzh model add <provider> <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 gs(n){return new Promise(e=>setTimeout(e,n))}var na=3,sa=n=>n*600,mt=class extends Error{constructor(){super("\u7EED\u4F20\u524D\u7F00\u4E0E\u5DF2\u8F93\u51FA\u5185\u5BB9\u4E0D\u4E00\u81F4"),this.name="ResumeMismatchError"}},Pr=class{text="";reasoning="";toolCalls=0;get hasDeliveredContent(){return this.text.length>0||this.reasoning.length>0}},Rr=class{constructor(e){this.previous=e;this.settled=e.length===0}collected="";settled;accept(e){if(this.settled)return e;if(this.collected+=e,this.collected.length<this.previous.length)return null;if(!this.collected.startsWith(this.previous))throw new mt;this.settled=!0;let r=this.collected.slice(this.previous.length);return this.collected="",r.length>0?r:null}finish(){if(!this.settled)throw new mt}},Mr=class{constructor(e){this.ledger=e;this.textPrefix=new Rr(e.text),this.suppressReasoning=e.reasoning.length>0,this.remainingToolCallSkips=e.toolCalls}textPrefix;suppressReasoning;remainingToolCallSkips;text(e){let r=this.textPrefix.accept(e);return r&&(this.ledger.text+=r),r}reasoning(e){return this.suppressReasoning?null:(this.ledger.reasoning+=e,e)}toolCall(){return this.remainingToolCallSkips>0?(this.remainingToolCallSkips--,!1):(this.ledger.toolCalls++,!0)}finish(){this.textPrefix.finish()}};async function*Ze(n,e,r={}){let s=r.maxAttempts??na,i=r.backoffMs??sa,o=new Pr,a;for(let l=1;l<=s;l++){let c=new Mr(o);try{yield*e(c),c.finish();return}catch(u){if(u instanceof mt)throw a??u;if(a=u,!(!n.signal?.aborted&&l<s&&o.toolCalls===0&&kr(u)))throw u;let d=o.hasDeliveredContent;n.onRetry?.(l,s,u instanceof Error?u:new Error(String(u)),{resumed:d}),await gs(i(l))}}throw a}var ia=[/^o1(-|$)/i,/^o3-mini/i,/deepseek-(chat|reasoner|coder)/i,/glm-4-(plus|air|flash|long)/i,/qwen-(max|plus|turbo)/i,/llama-?3/i,/mixtral|mistral-(small|medium|large|nemo)/i,/command-r(?!\+)/i],oa=[/gpt-4o|gpt-4\.1|gpt-4-turbo|gpt-4-vision|chatgpt-4o/i,/^o3(-|$)|^o4(-|$)/i,/claude/i,/gemini/i,/glm-4v|glm-4\.\dv/i,/qwen[^/]*vl/i,/llava|bakllava|minicpm-v|pixtral|internvl|moondream|gemma-?3/i,/grok-[^/]*vision/i];function Ir(n){let e=n.trim();if(!e)return!1;for(let r of ia)if(r.test(e))return!1;for(let r of oa)if(r.test(e))return!0;return!1}var aa="custom";function Be(n){return typeof n.vision=="boolean"?n.vision:n.provider===aa?!0:Ir(n.model)}var la=new Set(["image/png","image/jpeg","image/gif","image/webp"]);function $s(n){let e=n.trim().toLowerCase();return la.has(e)?e:"image/png"}var ke="\u8BF7\u770B\u8FD9\u5F20\u56FE\u7247\u3002";var _t=class{id;model;client;maxTokens;constructor(e){this.id=e.id,this.model=e.model,this.maxTokens=e.maxTokens??8192,this.client=new vs.default({apiKey:e.apiKey,baseURL:e.baseUrl,maxRetries:0})}async*chat(e){yield*Ze(e,r=>this.streamOnce(e,r))}async*streamOnce(e,r){let{system:s,messages:i}=ca(e.messages),o=e.tools.length>0?e.tools.map(d=>({name:d.name,description:d.description,input_schema:d.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,p=!1;for await(let d of a)switch(d.type){case"message_start":{let h=d.message?.usage?.input_tokens;typeof h=="number"&&(c={inputTokens:h});break}case"content_block_start":{let h=d.content_block;h.type==="tool_use"&&(p=!0,l.set(d.index,{id:h.id,name:h.name,json:""}));break}case"content_block_delta":{let h=d.delta;if(h.type==="text_delta"&&h.text){let m=r.text(h.text);m&&(yield{type:"text",text:m})}else if(h.type==="input_json_delta"){let m=l.get(d.index);m&&(m.json+=h.partial_json??"")}else if(h.type==="thinking_delta"){let m=h.thinking;if(m){let f=r.reasoning(m);f&&(yield{type:"reasoning",text:f})}}break}case"message_delta":{d.delta?.stop_reason&&(u=d.delta.stop_reason);let h=d.usage?.output_tokens;typeof h=="number"&&(c={...c??{},outputTokens:h});break}default:break}for(let d of l.values())d.name&&r.toolCall()&&(yield{type:"tool_call",toolCall:{id:d.id,name:d.name,arguments:d.json||"{}"}});yield{type:"done",finishReason:p?"tool_calls":u,usage:c}}};function ca(n){let e=[],r=[];for(let s of n){if(s.role==="system"){e.push(s.content);continue}if(s.role==="user"){if(s.images&&s.images.length>0){let i=[{type:"text",text:s.content||ke}];for(let o of s.images)i.push({type:"image",source:{type:"base64",media_type:$s(o.mimeType),data:o.data}});r.push({role:"user",content:i});continue}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:da(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(`
|
|
57
57
|
|
|
58
|
-
`),messages:
|
|
58
|
+
`),messages:ua(r)}}function ys(n){return typeof n=="string"?[{type:"text",text:n}]:n}function ua(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:[...ys(s.content),...ys(r.content)]}:e[e.length-1]=r;continue}e.push(r)}for(;e.length>0&&e[0].role!=="user";)e.shift();return e}function da(n){try{let e=JSON.parse(n||"{}");return typeof e=="object"&&e!==null?e:{}}catch{return{}}}var be=require("@google/generative-ai");var Et=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){yield*Ze(e,r=>this.streamOnce(e,r))}async*streamOnce(e,r){let s=new be.GoogleGenerativeAI(this.apiKey),{system:i,contents:o}=ma(e.messages),a=e.tools.length>0?[{functionDeclarations:e.tools.map(ga)}]: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,p=!1,d=0;for await(let h of c.stream){if(e.signal?.aborted)break;let m=pa(h);if(m){let g=r.text(m);g&&(yield{type:"text",text:g})}let f=ha(h);for(let g of f)p=!0,r.toolCall()&&(yield{type:"tool_call",toolCall:{id:`gemini_call_${Date.now()}_${d++}`,name:g.name,arguments:JSON.stringify(g.args??{})}});let y=h.usageMetadata;y&&(u={inputTokens:y.promptTokenCount,outputTokens:y.candidatesTokenCount})}yield{type:"done",finishReason:p?"tool_calls":"stop",usage:u}}};function pa(n){try{return n.text()??""}catch{return""}}function ha(n){try{return n.functionCalls?.()??[]}catch{return[]}}function ma(n){let e=[],r=[];for(let s of n){if(s.role==="system"){e.push(s.content);continue}if(s.role==="user"){if(s.images&&s.images.length>0){let i=[{text:s.content||ke}];for(let o of s.images)i.push({inlineData:{mimeType:o.mimeType,data:o.data}});r.push({role:"user",parts:i});continue}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:ya(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(`
|
|
59
59
|
|
|
60
|
-
`),contents:
|
|
60
|
+
`),contents:fa(r)}}function fa(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 ga(n){return{name:n.name,description:n.description,parameters:Dr(n.parameters)}}function Dr(n){let e={type:$a(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=Dr(n.items)),n.properties){let r={};for(let[s,i]of Object.entries(n.properties))r[s]=Dr(i);e.properties=r}return e}function $a(n){switch(n.toLowerCase()){case"string":return be.SchemaType.STRING;case"number":return be.SchemaType.NUMBER;case"integer":return be.SchemaType.INTEGER;case"boolean":return be.SchemaType.BOOLEAN;case"array":return be.SchemaType.ARRAY;default:return be.SchemaType.OBJECT}}function ya(n){try{let e=JSON.parse(n||"{}");return typeof e=="object"&&e!==null?e:{}}catch{return{}}}var bs=v(require("openai"));var Pt=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 bs.default({apiKey:e.apiKey||"not-needed",baseURL:e.baseUrl,httpAgent:fs(r),maxRetries:0})}async*chat(e){yield*Ze(e,r=>this.streamOnce(e,r))}async*streamOnce(e,r){let s=e.messages.map(va),i=e.tools.length>0?e.tools.map(ba):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 p of o){p.usage&&(c={inputTokens:p.usage.prompt_tokens,outputTokens:p.usage.completion_tokens});let d=p.choices?.[0];if(!d)continue;let h=d.delta;if(h){let m=h.content;if(typeof m=="string"&&m.length>0){let g=r.text(m);g&&(yield{type:"text",text:g})}let f=h.reasoning_content;if(typeof f=="string"&&f.length>0){let g=r.reasoning(f);g&&(yield{type:"reasoning",text:g})}let y=h.tool_calls;if(y){u=!0;for(let g of y){let S=g.index??0,$=a.get(S)??{id:"",name:"",args:""};g.id&&($.id=g.id),g.function?.name&&($.name+=g.function.name),g.function?.arguments&&($.args+=g.function.arguments),a.set(S,$)}}}d.finish_reason&&(l=d.finish_reason)}for(let[p,d]of a){if(!d.name)continue;let h={id:d.id||`call_${Date.now()}_${p}`,name:d.name,arguments:d.args||"{}"};r.toolCall()&&(yield{type:"tool_call",toolCall:h})}yield{type:"done",finishReason:u?"tool_calls":l,usage:c}}};function va(n){switch(n.role){case"system":return{role:"system",content:n.content};case"user":{if(n.images&&n.images.length>0){let e=[{type:"text",text:n.content||ke}];for(let r of n.images)e.push({type:"image_url",image_url:{url:`data:${r.mimeType};base64,${r.data}`}});return{role:"user",content:e}}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 ba(n){return{type:"function",function:{name:n.name,description:n.description,parameters:n.parameters}}}function _e(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}var xs=1600;function Qe(n){let e=4+_e(n.content??"");if(n.toolCalls)for(let r of n.toolCalls)e+=10+_e(r.name)+_e(r.arguments);return n.images&&n.images.length>0&&(e+=n.images.length*xs),e}function Lr(n,e=0){if(n.length===0)return n;let r=Math.max(0,Math.min(e,n.length)),s=-1;for(let i=n.length-1;i>=r;i--)if(n[i]?.images?.length){s=i;break}return n.map((i,o)=>{if(o===s)return i;let a=i.images;if(!a||a.length===0)return i;let c=`
|
|
61
61
|
|
|
62
|
-
[\u56FE\u7247\u5DF2\u7701\u7565\uFF1A${[...new Set(a.map(u=>u.mimeType))].join("\u3001")}${a.length>1?`\uFF0C\u5171 ${a.length} \u5F20`:""}]`;return{...i,content:`${i.content}${c}`,images:void 0}})}function
|
|
62
|
+
[\u56FE\u7247\u5DF2\u7701\u7565\uFF1A${[...new Set(a.map(u=>u.mimeType))].join("\u3001")}${a.length>1?`\uFF0C\u5171 ${a.length} \u5F20`:""}]`;return{...i,content:`${i.content}${c}`,images:void 0}})}function Nr(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 xa(n,e){let r=s=>{let i=s?30:50,o=s?n:{...n,images:void 0},a=Qe({...o,content:""});if(a+i>=e)return null;let l=n.content??"",c=e-a-i;if(_e(l)<=c)return s?n:{...o,content:`${l}
|
|
63
63
|
|
|
64
|
-
[\u56FE\u7247\u5DF2\u7701\u7565\uFF1A\u56E0\u8D85\u51FA\u4E0A\u4E0B\u6587\u9884\u7B97]`};let u=
|
|
64
|
+
[\u56FE\u7247\u5DF2\u7701\u7565\uFF1A\u56E0\u8D85\u51FA\u4E0A\u4E0B\u6587\u9884\u7B97]`};let u=Nr(l,c),p=l.length-u.length;return{...o,content:`${u}
|
|
65
65
|
|
|
66
|
-
\u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD ${
|
|
66
|
+
\u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD ${p} \u5B57\u7B26\u4EE5\u9002\u914D\u6A21\u578B\u4E0A\u4E0B\u6587\u7A97\u53E3\uFF09`}};return r(!0)??r(!1)}function Ss(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(_e(i)<=600)return r;let o=Math.floor(600*.6),a=600-o,l=Nr(i,o),c=Math.min(i.length-l.length,Math.max(0,a)*3),u=c>0?i.slice(-c):"",p=i.length-l.length-u.length,d=`${l}
|
|
67
67
|
|
|
68
|
-
\u2026\uFF08\u6B64\u5904\u7701\u7565 ${
|
|
68
|
+
\u2026\uFF08\u6B64\u5904\u7701\u7565 ${p} \u5B57\u7B26\u7684\u4E2D\u95F4\u5185\u5BB9\uFF09
|
|
69
69
|
|
|
70
|
-
${u}`;return
|
|
70
|
+
${u}`;return p<=0||d.length>=i.length?r:{...r,content:d}})}function jr(n){return n.map(e=>{let r=e.images;if(!r||r.length===0)return e;let s=[...new Set(r.map(i=>i.mimeType))].join("\u3001");return{...e,content:`${e.content}
|
|
71
71
|
|
|
72
|
-
[\u56FE\u7247\u5DF2\u7701\u7565\uFF1A${s}\uFF08\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u56FE\u7247\u8F93\u5165\uFF09]`,images:void 0}})}function Rt(n){let e=0;for(;e<n.length;){let r=n[e].role;if(r!=="assistant"&&r!=="tool")break;e++}return e===0?n:n.slice(e)}function Mt(n,e){let r=xs(n),s=r.length,i=0;for(let a=r.length-1;a>=0;a--){let l=Ze(r[a]);if(s<r.length&&i+l>e)break;i+=l,s=a}let o=Rt(r.slice(s));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&&Ze(o[0])>e){let l=va(o[0],e);if(l===null)return[];o[0]=l}return o}function Ur(n,e,r){let s=Ss(n,e),i=Ee(r)+4,o=s-i;return Math.max(1,Math.min(Math.max(o,1e3),s))}function Ss(n,e){let r=n&&n>0?n:Ue(e);return Math.floor(r*.8)}function Fr(n,e,r){let s=Ss(n,e);return Ee(r)+4>=s*.5}var Lr={"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},ba=[[/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 Ue(n){let e=n.trim();if(!e)return 32e3;let r=e.toLowerCase(),s=Lr[r];if(s)return s;let i=r.replace(/[-_]?(latest|preview|stable|beta|exp)$/,"").replace(/[-_]\d{6,8}$/,"").replace(/[:@].*$/,""),o=Lr[i]??Object.entries(Lr).find(([a])=>i.startsWith(a)||i===a)?.[1];if(o)return o;for(let[a,l]of ba)if(a.test(i))return l;return 32e3}function xe(n){return!Number.isFinite(n)||n<=0?"\u672A\u8BBE\u7F6E":String(Math.floor(n))}var It=class{ratio=1;samples=0;observe(e,r){if(!Number.isFinite(e)||!Number.isFinite(r)||e<=0||r<=0)return;let s=r/e;s<.1||s>8||(this.ratio=this.samples===0?s:this.ratio*(1-.3)+s*.3,this.samples++)}factor(){return this.samples<2?1:Math.min(Math.max(this.ratio,1),4)}get observationCount(){return this.samples}reset(){this.ratio=1,this.samples=0}};function zr(n,e){return e>1?Math.max(1,Math.floor(n/e)):n}var ws=new Map;function Jr(n){let e=n||"",r=ws.get(e);if(r)return r;let s=new It;return ws.set(e,s),s}var Se=[{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 we(n){return Se.find(e=>e.id===n)}function Dt(n,e){return e||(n.envKey?process.env[n.envKey]??"":"")}function Ts(n,e){return e||n.defaultBaseUrl}function Kr(n,e){let r=[],s=we(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&&!Dt(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&&!Ts(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 As(n){let e=U(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=>Kr(n,r))}function Ot(n,e){let r=e?.provider??n.provider,s=we(r);if(!s)throw new Error(`\u672A\u77E5\u7684 provider\uFF1A${r}`);let i=n.providers[r]??{},o=Dt(s,e?.apiKey??i.apiKey),a=Ts(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 Et({id:s.id,apiKey:o,baseUrl:a,model:l});case"gemini":return new _t({id:s.id,apiKey:o,baseUrl:a,model:l});case"openai":default:return new Pt({id:s.id,apiKey:o,baseUrl:a,model:l})}}var nt=v(require("fs")),Gs=v(require("os")),cn=v(require("path"));var K="0.4.2";var _e=9317,Hr=1e4,qr=process.env.XZH_DEVICE_PLUGIN_VERSION?.trim()||"1.110.0",ks=K;function Wr(){return`${Date.now()}_${Math.random()}`}function Es(n){let e=Wr();return n>=629?JSON.stringify({message_id:e,data:"ok",version:qr,debug:!1,type:"hello"}):JSON.stringify({message_id:e,data:"\u8FDE\u63A5\u6210\u529F",debug:!1,type:"hello"})}function _s(n){return JSON.stringify({type:"pong",data:n})}function Ps(n,e,r){return JSON.stringify({type:"command",message_id:Wr(),data:{command:n,id:e,name:e,script:r}})}function Gr(n,e={}){return JSON.stringify({type:"command",message_id:Wr(),data:{command:n,...e}})}function Rs(n){try{let e=JSON.parse(n);if(!e||typeof e!="object")return null;let r=typeof e.type=="string"?e.type:"";return r?{type:r,data:e.data}:null}catch{return null}}function Xr(n){let e=n??{},r=typeof e.device_name=="string"&&e.device_name.trim()?e.device_name.trim():"",s=typeof e.app_version_code=="number"&&Number.isFinite(e.app_version_code)?e.app_version_code:0;return{name:r,appVersionCode:s}}function Ms(n){if(typeof n=="string")return n;let e=n??{};return typeof e.log=="string"?e.log:""}var Re=v(require("fs")),Js=v(require("http")),et=v(require("os")),Ce=v(require("path")),$t=require("ws");var Bs=v(require("net"));var Yr=n=>n,Lt=n=>Yr(n);function Vr(n){return Buffer.from(Yr(n))}function Ds(n){return Buffer.concat(n.map(Yr))}var Qe=8,Os=1,xa=2,Is=64*1024*1024;var fe=6347,X=7347,ft=process.env.XZH_AUTOJS6_EXT_VERSION?.trim()||"1.0.13";function Sa(n,e){let r=Buffer.alloc(Qe);return r.writeInt32BE(n,0),r.writeInt32BE(e,4),r}function Nt(n){let e=Buffer.from(n,"utf8");return Ds([Sa(e.length,Os),e])}var Fe=class{buffer=Buffer.alloc(0);push(e){let r=Vr(e);this.buffer=this.buffer.length===0?r:Ds([this.buffer,r]);let s=[];for(;this.buffer.length>=Qe;){let i=this.buffer.readInt32BE(0),o=this.buffer.readInt32BE(4);if(i<0||i>Is)throw new Error(`AutoJs6 \u5E27\u957F\u5EA6\u975E\u6CD5\uFF1A${i}\uFF08\u4E0A\u9650 ${Is}\uFF09\uFF0C\u8FDE\u63A5\u53EF\u80FD\u4E0D\u662F AutoJs6 \u534F\u8BAE`);if(this.buffer.length<Qe+i)break;let a=Vr(this.buffer.subarray(Qe,Qe+i));this.buffer=Vr(this.buffer.subarray(Qe+i)),o===Os?s.push({kind:"json",payload:a.toString("utf8")}):o===xa&&s.push({kind:"bytes",payload:a})}return s}get pendingBytes(){return this.buffer.length}};function jt(n){try{let e=JSON.parse(n);if(!e||typeof e!="object"||typeof e.type!="string"||!e.type)return null;let r=e.data&&typeof e.data=="object"?e.data:{};return{type:e.type,data:r}}catch{return null}}function Ls(n=ft){return JSON.stringify({type:"hello",data:{extensionVersion:n}})}function Ns(n){let e=s=>typeof s=="string"?s:"",r=s=>typeof s=="number"&&Number.isFinite(s)?s:0;return{deviceName:e(n.device_name).trim(),appVersion:e(n.app_version).trim(),appVersionCode:r(n.app_version_code),deviceId:e(n.device_id).trim()}}function Pe(n,e={}){return JSON.stringify({type:"command",data:{command:n,...e}})}function Bt(n){if(n.type!=="log")return null;let e=n.data.log;return typeof e=="string"?e:null}function Ut(n){let e=n.data["\xA0cmd\xA0"];return typeof e=="string"?e:null}var wa=2e3,Zr=3,Ca=15e3,js=5e3,Ft=class{host;port;options;socket=null;decoder=new Fe;active=!1;connected=!1;connecting=!1;retryTimer=null;attempt=0;quickFailures=0;connectedAt=0;constructor(e){this.options=e,this.host=e.host.trim(),this.port=e.port??X}getAddress(){return`${this.host}:${this.port}`}isConnected(){return this.connected}isRetrying(){return this.active}start(){this.active||(this.active=!0,this.attempt=0,this.quickFailures=0,this.connectOnce())}close(){this.active=!1,this.retryTimer&&(clearTimeout(this.retryTimer),this.retryTimer=null);let e=this.socket,r=this.connected;if(this.socket=null,this.connected=!1,this.connecting=!1,e){e.removeAllListeners();try{e.destroy()}catch{}}r&&this.options.onDisconnect?.()}runScript(e,r,s){return this.sendJson(Pe("run",{id:r,name:s,script:e}))}saveScript(e,r){return this.sendJson(Pe("save",{name:r,script:e}))}stopScript(e){return this.sendJson(Pe("stop",{id:e}))}stopAllScripts(){return this.sendJson(Pe("stopAll"))}sendJson(e){let r=this.socket;if(!this.connected||!r)return!1;try{return r.write(Lt(Nt(e))),!0}catch{return!1}}connectOnce(){if(!this.active||this.socket||this.connecting)return;this.connecting=!0,this.decoder=new Fe;let e=new Bs.Socket;this.socket=e,e.setNoDelay(!0),e.setKeepAlive(!0,15e3);let r=setTimeout(()=>{this.connected||(this.options.onStatus?.(`\u8FDE\u63A5 ${this.getAddress()} \u8D85\u65F6\uFF08${js} ms\uFF09`),e.destroy())},js),s=()=>clearTimeout(r);e.once("close",s),e.connect(this.port,this.host),e.on("connect",()=>{s(),this.connecting=!1,this.connected=!0,this.connectedAt=Date.now(),this.attempt=0,this.sendHello(),this.options.onStatus?.(`\u5DF2\u8FDE\u63A5\u624B\u673A ${this.getAddress()}\uFF08AutoJs6 \u670D\u52A1\u5668\u6A21\u5F0F\uFF09`),this.options.onConnect?.()}),e.on("data",i=>this.handleData(i)),e.on("error",i=>{this.options.onStatus?.(i.code==="ECONNREFUSED"?`\u8FDE\u63A5\u88AB\u62D2\u7EDD\uFF08${this.getAddress()}\uFF09\uFF1A\u624B\u673A\u4E0A AutoJs6 \u7684\u300C\u670D\u52A1\u5668\u6A21\u5F0F\u300D\u6CA1\u5F00\uFF0C\u6216\u5730\u5740\u4E0D\u5BF9`:`\u8FDE\u63A5\u51FA\u9519\uFF1A${i.message}`)}),e.on("close",()=>this.handleDisconnect())}sendHello(){this.sendJson(JSON.stringify({type:"hello",data:{device_name:`xzh ${K}`,app_version:K,app_version_code:0,device_id:"",extensionVersion:ft}}))}handleData(e){let r;try{r=this.decoder.push(e)}catch(s){this.options.onStatus?.(`${this.getAddress()} \u8FD4\u56DE\u7684\u6570\u636E\u4E0D\u662F AutoJs6 \u534F\u8BAE\uFF1A${s instanceof Error?s.message:String(s)}`),this.active=!1,this.close();return}for(let s of r){if(s.kind!=="json")continue;let i=jt(String(s.payload));if(!i)continue;let o=Bt(i);if(o!==null){this.options.onLog?.(o);continue}let a=Ut(i);a!==null&&this.options.onPhoneCommand?.(a,i.data)}}handleDisconnect(){let e=this.connected,r=this.connectedAt>0?Date.now()-this.connectedAt:Number.MAX_SAFE_INTEGER;if(this.socket=null,this.connected=!1,this.connecting=!1,e&&this.options.onDisconnect?.(),!!this.active){if(e&&r<wa){if(this.quickFailures++,this.quickFailures>=Zr){this.active=!1,this.options.onStatus?.(`\u4E0E ${this.getAddress()} \u8FDE\u7EED ${this.quickFailures} \u6B21\u521A\u8FDE\u4E0A\u5C31\u65AD\u5F00\uFF0C\u5DF2\u505C\u6B62\u91CD\u8FDE\u3002\u8BF7\u786E\u8BA4\uFF1A\u2460 \u624B\u673A\u4E0A AutoJs6 \u6253\u5F00\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u670D\u52A1\u5668\u6A21\u5F0F\u300D\uFF1B\u2461 \u5730\u5740\u4E0E\u7AEF\u53E3\uFF08\u9ED8\u8BA4 7347\uFF09\u6B63\u786E\uFF1B\u2462 xzh \u4E0E\u624B\u673A\u5728\u540C\u4E00\u7F51\u7EDC\uFF08\u624B\u673A\u672C\u673A\u8FD0\u884C\u65F6\u7528 127.0.0.1\uFF09\u3002`);return}}else e&&(this.quickFailures=0);if(!e&&this.quickFailures<Zr&&(this.quickFailures++,this.quickFailures>=Zr)){this.active=!1,this.options.onStatus?.(`\u8FDE\u63A5 ${this.getAddress()} \u5931\u8D25 ${this.quickFailures} \u6B21\uFF0C\u5DF2\u505C\u6B62\u91CD\u8FDE\u3002\u8BF7\u786E\u8BA4\u624B\u673A\u4E0A AutoJs6 \u5DF2\u6253\u5F00\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u670D\u52A1\u5668\u6A21\u5F0F\u300D\uFF08\u9ED8\u8BA4\u7AEF\u53E3 ${X}\uFF09\u3002`);return}this.scheduleReconnect()}}scheduleReconnect(){let e=this.options.reconnectDelayMs??1500;if(e<=0||this.retryTimer)return;let r=Math.min(e*2**this.attempt,Ca);this.attempt++,this.retryTimer=setTimeout(()=>{this.retryTimer=null,this.options.onStatus?.(`\u6B63\u5728\u91CD\u8FDE ${this.getAddress()}\u2026\uFF08\u7B2C ${this.attempt} \u6B21\uFF09`),this.connectOnce()},r)}};var Fs=v(require("net"));var Us=1e4,gt=class{options;port;server=null;connections=new Map;constructor(e={}){this.options=e,this.port=e.port??fe}isRunning(){return this.server!==null}getPort(){return this.port}start(){if(this.server)return Promise.resolve();let e=Fs.createServer(r=>this.handleConnection(r));return new Promise((r,s)=>{let i=a=>{if(e.removeListener("listening",o),a.code==="EADDRINUSE"){s(new Error(`\u7AEF\u53E3 ${this.port} \u5DF2\u88AB\u5360\u7528 \u2014\u2014 \u8FD9\u662F AutoJs6\u300C\u5BA2\u6237\u7AEF\u6A21\u5F0F\u300D\u7684\u7AEF\u53E3\u3002\u4E24\u79CD\u53EF\u80FD\uFF1A\u2460 VSCode \u91CC\u7684 AutoJs6 \u6269\u5C55\uFF08003.autojs6-vscode-ext\uFF09\u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u5728 VSCode \u91CC\u7981\u7528\u5B83\uFF1B\u2461 \u5DF2\u7ECF\u6709\u53E6\u4E00\u4E2A xzh \u8BBE\u5907\u6865\u5728\u8DD1\u3002\u540C\u4E00\u4E2A\u7AEF\u53E3\u4E0A\u7684\u4E24\u4E2A\u670D\u52A1\u4F1A\u4E92\u76F8\u62A2\u624B\u673A\u8FDE\u63A5\u3002`));return}s(a)},o=()=>{e.removeListener("error",i),e.on("error",a=>this.options.onStatus?.(`AutoJs6 \u76D1\u542C\u51FA\u9519\uFF1A${a.message}`)),r()};e.once("error",i),e.once("listening",o),e.listen(this.port,"0.0.0.0")}).then(()=>{this.server=e,this.options.onStatus?.(`AutoJs6 \u76D1\u542C\u5DF2\u5C31\u7EEA\uFF08\u7AEF\u53E3 ${this.port}\uFF09\uFF1A\u624B\u673A\u4E0A\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u5BA2\u6237\u7AEF\u6A21\u5F0F\u300D\u586B\u672C\u673A IP \u5373\u53EF`)})}async stop(){for(let r of[...this.connections.values()])this.dispose(r);this.connections.clear();let e=this.server;this.server=null,e&&await new Promise(r=>e.close(()=>r()))}listDevices(){return[...this.connections.values()].map(e=>e.peer).filter(e=>e!==null)}sendTo(e,r){let s=this.connections.get(e);return!s||!s.peer?!1:this.write(s,r)}broadcast(e){let r=0;for(let s of this.connections.values())s.peer&&this.write(s,e)&&r++;return r}closeDevice(e){let r=this.connections.get(e);r&&this.dispose(r)}handleConnection(e){let r=e.remoteAddress??"unknown",i=`${r.startsWith("::ffff:")?r.slice(7):r}:${e.remotePort??0}`,o={socket:e,id:i,decoder:new Fe,peer:null,handshakeTimer:setTimeout(()=>{o.peer||(this.options.onStatus?.(`\u8FDE\u63A5 ${i} \u672A\u5728 ${Us/1e3} \u79D2\u5185\u63E1\u624B\uFF0C\u5DF2\u65AD\u5F00\u3002`),this.dispose(o))},Us)};this.connections.set(i,o),e.setNoDelay(!0),e.setKeepAlive(!0,15e3),e.on("data",a=>this.handleData(o,a)),e.on("error",a=>{this.options.onStatus?.(`\u4E0E ${i} \u7684\u8FDE\u63A5\u51FA\u9519\uFF1A${a.message}`),this.dispose(o)}),e.on("close",()=>this.dispose(o))}handleData(e,r){let s;try{s=e.decoder.push(r)}catch(i){this.options.onStatus?.(`${e.id} \u53D1\u6765\u7684\u6570\u636E\u4E0D\u662F AutoJs6 \u534F\u8BAE\uFF1A${i instanceof Error?i.message:String(i)}`),this.dispose(e);return}for(let i of s){if(i.kind!=="json")continue;let o=jt(String(i.payload));if(!o)continue;if(o.type==="hello"){this.handleHello(e,o.data,String(i.payload));continue}let a=Bt(o);if(a!==null&&e.peer){this.options.onLog?.(e.peer,a);continue}let l=Ut(o);l!==null&&e.peer&&this.options.onPhoneCommand?.(e.peer,l,o.data)}}handleHello(e,r,s){let i=Ns(r);e.peer={id:e.id,name:i.deviceName||e.id,appVersion:i.appVersion,appVersionCode:i.appVersionCode},clearTimeout(e.handshakeTimer);let o=Ls(),a=this.write(e,o);this.options.onStatus?.(`\u63E1\u624B\uFF1A${e.peer.name}\uFF08AutoJs6 ${i.appVersion||"?"} / versionCode ${i.appVersionCode}\uFF09${a?"":"\u2014\u2014\u26A0 \u5E94\u7B54\u53D1\u9001\u5931\u8D25"}\uFF5C\u56DE\u62A5\u534F\u8BAE\u7248\u672C ${ft}`),this.options.onStatus?.(` \u624B\u673A\u539F\u59CB hello\uFF1A${Ta(s,240)}`),this.options.onAttach?.(e.peer)}write(e,r){if(e.socket.destroyed)return!1;try{return e.socket.write(Lt(Nt(r))),!0}catch{return!1}}dispose(e){clearTimeout(e.handshakeTimer);let r=this.connections.delete(e.id),s=e.peer;e.peer=null;try{e.socket.destroy()}catch{}r&&s&&this.options.onDetach?.(s)}};function Ta(n,e){let r=n.replace(/\s+/g," ").trim();return r.length>e?`${r.slice(0,e)}\u2026`:r}function Qr(n){let e=n.scale??.3,r=n.quality??55,s=`http://${n.host}:${n.port}/shot`;return["// \u7531 xzh \u751F\u6210\uFF1A\u622A\u56FE\u5E76\u6309\u6388\u6743\u6846\u3001\u56DE\u4F20\u5230\u6865\uFF08\u52FF\u624B\u6539\uFF0C\u6A21\u677F\u89C1 src/device/screenshot.ts\uFF09","try {"," auto.waitFor(8000);"," var clicked = false;"," var auth = threads.start(function () {",' var btn = text("\u7ACB\u5373\u5F00\u59CB").findOne(3000);',' if (!btn) btn = text("\u5F00\u59CB\u73B0\u5728").findOne(300);',' if (!btn) btn = text("\u5141\u8BB8").findOne(300);'," if (!btn) btn = textMatches(/START NOW|Allow/i).findOne(300);"," if (btn) { clicked = true; btn.click(); }"," });",' console.log("\u3010\u622A\u56FE\u3011\u7B49\u5F85\u5C4F\u5E55\u6388\u6743\u2026");'," var img = captureScreen();"," auth.join(1500);",' if (!img) { console.log("\u3010\u622A\u56FE\u3011\u672A\u62FF\u5230\u56FE\u50CF\uFF08\u6388\u6743\u88AB\u62D2\u6216\u8D85\u65F6\uFF0C\u70B9\u5230\u6388\u6743\u6846=" + clicked + "\uFF09"); exit(); }',` var small = images.scale(img, ${e}, ${e});`,` var b64 = images.toBase64(small, "jpg", ${r});`,` var r = http.post("${s}", b64, { contentType: "text/plain" });`,' console.log("\u3010\u622A\u56FE\u3011" + img.width + "x" + img.height + " \u2192 " + small.width + "x" + small.height + "\uFF0C\u56DE\u4F20=" + r.statusCode);',"} catch (e) {",' console.log("\u3010\u622A\u56FE\u3011\u5931\u8D25\uFF1A" + e);',"}",""].join(`
|
|
73
|
-
`)}var
|
|
72
|
+
[\u56FE\u7247\u5DF2\u7701\u7565\uFF1A${s}\uFF08\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u56FE\u7247\u8F93\u5165\uFF09]`,images:void 0}})}function Rt(n){let e=0;for(;e<n.length;){let r=n[e].role;if(r!=="assistant"&&r!=="tool")break;e++}return e===0?n:n.slice(e)}function Mt(n,e){let r=Ss(n),s=r.length,i=0;for(let a=r.length-1;a>=0;a--){let l=Qe(r[a]);if(s<r.length&&i+l>e)break;i+=l,s=a}let o=Rt(r.slice(s));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&&Qe(o[0])>e){let l=xa(o[0],e);if(l===null)return[];o[0]=l}return o}function Br(n,e,r){let s=ws(n,e),i=_e(r)+4,o=s-i;return Math.max(1,Math.min(Math.max(o,1e3),s))}function ws(n,e){let r=n&&n>0?n:Ue(e);return Math.floor(r*.8)}function Ur(n,e,r){let s=ws(n,e);return _e(r)+4>=s*.5}var Or={"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},Sa=[[/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 Ue(n){let e=n.trim();if(!e)return 32e3;let r=e.toLowerCase(),s=Or[r];if(s)return s;let i=r.replace(/[-_]?(latest|preview|stable|beta|exp)$/,"").replace(/[-_]\d{6,8}$/,"").replace(/[:@].*$/,""),o=Or[i]??Object.entries(Or).find(([a])=>i.startsWith(a)||i===a)?.[1];if(o)return o;for(let[a,l]of Sa)if(a.test(i))return l;return 32e3}function xe(n){return!Number.isFinite(n)||n<=0?"\u672A\u8BBE\u7F6E":String(Math.floor(n))}var It=class{ratio=1;samples=0;observe(e,r){if(!Number.isFinite(e)||!Number.isFinite(r)||e<=0||r<=0)return;let s=r/e;s<.1||s>8||(this.ratio=this.samples===0?s:this.ratio*(1-.3)+s*.3,this.samples++)}factor(){return this.samples<2?1:Math.min(Math.max(this.ratio,1),4)}get observationCount(){return this.samples}reset(){this.ratio=1,this.samples=0}};function Fr(n,e){return e>1?Math.max(1,Math.floor(n/e)):n}var Cs=new Map;function zr(n){let e=n||"",r=Cs.get(e);if(r)return r;let s=new It;return Cs.set(e,s),s}var Se=[{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 we(n){return Se.find(e=>e.id===n)}function Dt(n,e){return e||(n.envKey?process.env[n.envKey]??"":"")}function As(n,e){return e||n.defaultBaseUrl}function Jr(n,e){let r=[],s=we(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&&!Dt(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&&!As(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 ks(n){let e=U(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=>Jr(n,r))}function Ot(n,e){let r=e?.provider??n.provider,s=we(r);if(!s)throw new Error(`\u672A\u77E5\u7684 provider\uFF1A${r}`);let i=n.providers[r]??{},o=Dt(s,e?.apiKey??i.apiKey),a=As(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 _t({id:s.id,apiKey:o,baseUrl:a,model:l});case"gemini":return new Et({id:s.id,apiKey:o,baseUrl:a,model:l});case"openai":default:return new Pt({id:s.id,apiKey:o,baseUrl:a,model:l})}}var st=v(require("fs")),Xs=v(require("os")),ln=v(require("path"));var K="0.4.3";var Ee=9317,Kr=1e4,Hr=process.env.XZH_DEVICE_PLUGIN_VERSION?.trim()||"1.110.0",_s=K;function qr(){return`${Date.now()}_${Math.random()}`}function Es(n){let e=qr();return n>=629?JSON.stringify({message_id:e,data:"ok",version:Hr,debug:!1,type:"hello"}):JSON.stringify({message_id:e,data:"\u8FDE\u63A5\u6210\u529F",debug:!1,type:"hello"})}function Ps(n){return JSON.stringify({type:"pong",data:n})}function Rs(n,e,r){return JSON.stringify({type:"command",message_id:qr(),data:{command:n,id:e,name:e,script:r}})}function Wr(n,e={}){return JSON.stringify({type:"command",message_id:qr(),data:{command:n,...e}})}function Ms(n){try{let e=JSON.parse(n);if(!e||typeof e!="object")return null;let r=typeof e.type=="string"?e.type:"";return r?{type:r,data:e.data}:null}catch{return null}}function Gr(n){let e=n??{},r=typeof e.device_name=="string"&&e.device_name.trim()?e.device_name.trim():"",s=typeof e.app_version_code=="number"&&Number.isFinite(e.app_version_code)?e.app_version_code:0;return{name:r,appVersionCode:s}}function Is(n){if(typeof n=="string")return n;let e=n??{};return typeof e.log=="string"?e.log:""}var Re=v(require("fs")),Ks=v(require("http")),tt=v(require("os")),Ce=v(require("path")),$t=require("ws");var Us=v(require("net"));var Vr=n=>n,Lt=n=>Vr(n);function Xr(n){return Buffer.from(Vr(n))}function Os(n){return Buffer.concat(n.map(Vr))}var et=8,Ls=1,wa=2,Ds=64*1024*1024;var fe=6347,X=7347,ft=process.env.XZH_AUTOJS6_EXT_VERSION?.trim()||"1.0.13";function Ca(n,e){let r=Buffer.alloc(et);return r.writeInt32BE(n,0),r.writeInt32BE(e,4),r}function Nt(n){let e=Buffer.from(n,"utf8");return Os([Ca(e.length,Ls),e])}var Fe=class{buffer=Buffer.alloc(0);push(e){let r=Xr(e);this.buffer=this.buffer.length===0?r:Os([this.buffer,r]);let s=[];for(;this.buffer.length>=et;){let i=this.buffer.readInt32BE(0),o=this.buffer.readInt32BE(4);if(i<0||i>Ds)throw new Error(`AutoJs6 \u5E27\u957F\u5EA6\u975E\u6CD5\uFF1A${i}\uFF08\u4E0A\u9650 ${Ds}\uFF09\uFF0C\u8FDE\u63A5\u53EF\u80FD\u4E0D\u662F AutoJs6 \u534F\u8BAE`);if(this.buffer.length<et+i)break;let a=Xr(this.buffer.subarray(et,et+i));this.buffer=Xr(this.buffer.subarray(et+i)),o===Ls?s.push({kind:"json",payload:a.toString("utf8")}):o===wa&&s.push({kind:"bytes",payload:a})}return s}get pendingBytes(){return this.buffer.length}};function jt(n){try{let e=JSON.parse(n);if(!e||typeof e!="object"||typeof e.type!="string"||!e.type)return null;let r=e.data&&typeof e.data=="object"?e.data:{};return{type:e.type,data:r}}catch{return null}}function Ns(n=ft){return JSON.stringify({type:"hello",data:{extensionVersion:n}})}function js(n){let e=s=>typeof s=="string"?s:"",r=s=>typeof s=="number"&&Number.isFinite(s)?s:0;return{deviceName:e(n.device_name).trim(),appVersion:e(n.app_version).trim(),appVersionCode:r(n.app_version_code),deviceId:e(n.device_id).trim()}}function Pe(n,e={}){return JSON.stringify({type:"command",data:{command:n,...e}})}function Bt(n){if(n.type!=="log")return null;let e=n.data.log;return typeof e=="string"?e:null}function Ut(n){let e=n.data["\xA0cmd\xA0"];return typeof e=="string"?e:null}var Ta=2e3,Yr=3,Aa=15e3,Bs=5e3,Ft=class{host;port;options;socket=null;decoder=new Fe;active=!1;connected=!1;connecting=!1;retryTimer=null;attempt=0;quickFailures=0;connectedAt=0;constructor(e){this.options=e,this.host=e.host.trim(),this.port=e.port??X}getAddress(){return`${this.host}:${this.port}`}isConnected(){return this.connected}isRetrying(){return this.active}start(){this.active||(this.active=!0,this.attempt=0,this.quickFailures=0,this.connectOnce())}close(){this.active=!1,this.retryTimer&&(clearTimeout(this.retryTimer),this.retryTimer=null);let e=this.socket,r=this.connected;if(this.socket=null,this.connected=!1,this.connecting=!1,e){e.removeAllListeners();try{e.destroy()}catch{}}r&&this.options.onDisconnect?.()}runScript(e,r,s){return this.sendJson(Pe("run",{id:r,name:s,script:e}))}saveScript(e,r){return this.sendJson(Pe("save",{name:r,script:e}))}stopScript(e){return this.sendJson(Pe("stop",{id:e}))}stopAllScripts(){return this.sendJson(Pe("stopAll"))}sendJson(e){let r=this.socket;if(!this.connected||!r)return!1;try{return r.write(Lt(Nt(e))),!0}catch{return!1}}connectOnce(){if(!this.active||this.socket||this.connecting)return;this.connecting=!0,this.decoder=new Fe;let e=new Us.Socket;this.socket=e,e.setNoDelay(!0),e.setKeepAlive(!0,15e3);let r=setTimeout(()=>{this.connected||(this.options.onStatus?.(`\u8FDE\u63A5 ${this.getAddress()} \u8D85\u65F6\uFF08${Bs} ms\uFF09`),e.destroy())},Bs),s=()=>clearTimeout(r);e.once("close",s),e.connect(this.port,this.host),e.on("connect",()=>{s(),this.connecting=!1,this.connected=!0,this.connectedAt=Date.now(),this.attempt=0,this.sendHello(),this.options.onStatus?.(`\u5DF2\u8FDE\u63A5\u624B\u673A ${this.getAddress()}\uFF08AutoJs6 \u670D\u52A1\u5668\u6A21\u5F0F\uFF09`),this.options.onConnect?.()}),e.on("data",i=>this.handleData(i)),e.on("error",i=>{this.options.onStatus?.(i.code==="ECONNREFUSED"?`\u8FDE\u63A5\u88AB\u62D2\u7EDD\uFF08${this.getAddress()}\uFF09\uFF1A\u624B\u673A\u4E0A AutoJs6 \u7684\u300C\u670D\u52A1\u5668\u6A21\u5F0F\u300D\u6CA1\u5F00\uFF0C\u6216\u5730\u5740\u4E0D\u5BF9`:`\u8FDE\u63A5\u51FA\u9519\uFF1A${i.message}`)}),e.on("close",()=>this.handleDisconnect())}sendHello(){this.sendJson(JSON.stringify({type:"hello",data:{device_name:`xzh ${K}`,app_version:K,app_version_code:0,device_id:"",extensionVersion:ft}}))}handleData(e){let r;try{r=this.decoder.push(e)}catch(s){this.options.onStatus?.(`${this.getAddress()} \u8FD4\u56DE\u7684\u6570\u636E\u4E0D\u662F AutoJs6 \u534F\u8BAE\uFF1A${s instanceof Error?s.message:String(s)}`),this.active=!1,this.close();return}for(let s of r){if(s.kind!=="json")continue;let i=jt(String(s.payload));if(!i)continue;let o=Bt(i);if(o!==null){this.options.onLog?.(o);continue}let a=Ut(i);a!==null&&this.options.onPhoneCommand?.(a,i.data)}}handleDisconnect(){let e=this.connected,r=this.connectedAt>0?Date.now()-this.connectedAt:Number.MAX_SAFE_INTEGER;if(this.socket=null,this.connected=!1,this.connecting=!1,e&&this.options.onDisconnect?.(),!!this.active){if(e&&r<Ta){if(this.quickFailures++,this.quickFailures>=Yr){this.active=!1,this.options.onStatus?.(`\u4E0E ${this.getAddress()} \u8FDE\u7EED ${this.quickFailures} \u6B21\u521A\u8FDE\u4E0A\u5C31\u65AD\u5F00\uFF0C\u5DF2\u505C\u6B62\u91CD\u8FDE\u3002\u8BF7\u786E\u8BA4\uFF1A\u2460 \u624B\u673A\u4E0A AutoJs6 \u6253\u5F00\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u670D\u52A1\u5668\u6A21\u5F0F\u300D\uFF1B\u2461 \u5730\u5740\u4E0E\u7AEF\u53E3\uFF08\u9ED8\u8BA4 7347\uFF09\u6B63\u786E\uFF1B\u2462 xzh \u4E0E\u624B\u673A\u5728\u540C\u4E00\u7F51\u7EDC\uFF08\u624B\u673A\u672C\u673A\u8FD0\u884C\u65F6\u7528 127.0.0.1\uFF09\u3002`);return}}else e&&(this.quickFailures=0);if(!e&&this.quickFailures<Yr&&(this.quickFailures++,this.quickFailures>=Yr)){this.active=!1,this.options.onStatus?.(`\u8FDE\u63A5 ${this.getAddress()} \u5931\u8D25 ${this.quickFailures} \u6B21\uFF0C\u5DF2\u505C\u6B62\u91CD\u8FDE\u3002\u8BF7\u786E\u8BA4\u624B\u673A\u4E0A AutoJs6 \u5DF2\u6253\u5F00\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u670D\u52A1\u5668\u6A21\u5F0F\u300D\uFF08\u9ED8\u8BA4\u7AEF\u53E3 ${X}\uFF09\u3002`);return}this.scheduleReconnect()}}scheduleReconnect(){let e=this.options.reconnectDelayMs??1500;if(e<=0||this.retryTimer)return;let r=Math.min(e*2**this.attempt,Aa);this.attempt++,this.retryTimer=setTimeout(()=>{this.retryTimer=null,this.options.onStatus?.(`\u6B63\u5728\u91CD\u8FDE ${this.getAddress()}\u2026\uFF08\u7B2C ${this.attempt} \u6B21\uFF09`),this.connectOnce()},r)}};var zs=v(require("net"));var Fs=1e4,gt=class{options;port;server=null;connections=new Map;constructor(e={}){this.options=e,this.port=e.port??fe}isRunning(){return this.server!==null}getPort(){return this.port}start(){if(this.server)return Promise.resolve();let e=zs.createServer(r=>this.handleConnection(r));return new Promise((r,s)=>{let i=a=>{if(e.removeListener("listening",o),a.code==="EADDRINUSE"){s(new Error(`\u7AEF\u53E3 ${this.port} \u5DF2\u88AB\u5360\u7528 \u2014\u2014 \u8FD9\u662F AutoJs6\u300C\u5BA2\u6237\u7AEF\u6A21\u5F0F\u300D\u7684\u7AEF\u53E3\u3002\u4E24\u79CD\u53EF\u80FD\uFF1A\u2460 VSCode \u91CC\u7684 AutoJs6 \u6269\u5C55\uFF08003.autojs6-vscode-ext\uFF09\u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u5728 VSCode \u91CC\u7981\u7528\u5B83\uFF1B\u2461 \u5DF2\u7ECF\u6709\u53E6\u4E00\u4E2A xzh \u8BBE\u5907\u6865\u5728\u8DD1\u3002\u540C\u4E00\u4E2A\u7AEF\u53E3\u4E0A\u7684\u4E24\u4E2A\u670D\u52A1\u4F1A\u4E92\u76F8\u62A2\u624B\u673A\u8FDE\u63A5\u3002`));return}s(a)},o=()=>{e.removeListener("error",i),e.on("error",a=>this.options.onStatus?.(`AutoJs6 \u76D1\u542C\u51FA\u9519\uFF1A${a.message}`)),r()};e.once("error",i),e.once("listening",o),e.listen(this.port,"0.0.0.0")}).then(()=>{this.server=e,this.options.onStatus?.(`AutoJs6 \u76D1\u542C\u5DF2\u5C31\u7EEA\uFF08\u7AEF\u53E3 ${this.port}\uFF09\uFF1A\u624B\u673A\u4E0A\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u5BA2\u6237\u7AEF\u6A21\u5F0F\u300D\u586B\u672C\u673A IP \u5373\u53EF`)})}async stop(){for(let r of[...this.connections.values()])this.dispose(r);this.connections.clear();let e=this.server;this.server=null,e&&await new Promise(r=>e.close(()=>r()))}listDevices(){return[...this.connections.values()].map(e=>e.peer).filter(e=>e!==null)}sendTo(e,r){let s=this.connections.get(e);return!s||!s.peer?!1:this.write(s,r)}broadcast(e){let r=0;for(let s of this.connections.values())s.peer&&this.write(s,e)&&r++;return r}closeDevice(e){let r=this.connections.get(e);r&&this.dispose(r)}handleConnection(e){let r=e.remoteAddress??"unknown",i=`${r.startsWith("::ffff:")?r.slice(7):r}:${e.remotePort??0}`,o={socket:e,id:i,decoder:new Fe,peer:null,handshakeTimer:setTimeout(()=>{o.peer||(this.options.onStatus?.(`\u8FDE\u63A5 ${i} \u672A\u5728 ${Fs/1e3} \u79D2\u5185\u63E1\u624B\uFF0C\u5DF2\u65AD\u5F00\u3002`),this.dispose(o))},Fs)};this.connections.set(i,o),e.setNoDelay(!0),e.setKeepAlive(!0,15e3),e.on("data",a=>this.handleData(o,a)),e.on("error",a=>{this.options.onStatus?.(`\u4E0E ${i} \u7684\u8FDE\u63A5\u51FA\u9519\uFF1A${a.message}`),this.dispose(o)}),e.on("close",()=>this.dispose(o))}handleData(e,r){let s;try{s=e.decoder.push(r)}catch(i){this.options.onStatus?.(`${e.id} \u53D1\u6765\u7684\u6570\u636E\u4E0D\u662F AutoJs6 \u534F\u8BAE\uFF1A${i instanceof Error?i.message:String(i)}`),this.dispose(e);return}for(let i of s){if(i.kind!=="json")continue;let o=jt(String(i.payload));if(!o)continue;if(o.type==="hello"){this.handleHello(e,o.data,String(i.payload));continue}let a=Bt(o);if(a!==null&&e.peer){this.options.onLog?.(e.peer,a);continue}let l=Ut(o);l!==null&&e.peer&&this.options.onPhoneCommand?.(e.peer,l,o.data)}}handleHello(e,r,s){let i=js(r);e.peer={id:e.id,name:i.deviceName||e.id,appVersion:i.appVersion,appVersionCode:i.appVersionCode},clearTimeout(e.handshakeTimer);let o=Ns(),a=this.write(e,o);this.options.onStatus?.(`\u63E1\u624B\uFF1A${e.peer.name}\uFF08AutoJs6 ${i.appVersion||"?"} / versionCode ${i.appVersionCode}\uFF09${a?"":"\u2014\u2014\u26A0 \u5E94\u7B54\u53D1\u9001\u5931\u8D25"}\uFF5C\u56DE\u62A5\u534F\u8BAE\u7248\u672C ${ft}`),this.options.onStatus?.(` \u624B\u673A\u539F\u59CB hello\uFF1A${ka(s,240)}`),this.options.onAttach?.(e.peer)}write(e,r){if(e.socket.destroyed)return!1;try{return e.socket.write(Lt(Nt(r))),!0}catch{return!1}}dispose(e){clearTimeout(e.handshakeTimer);let r=this.connections.delete(e.id),s=e.peer;e.peer=null;try{e.socket.destroy()}catch{}r&&s&&this.options.onDetach?.(s)}};function ka(n,e){let r=n.replace(/\s+/g," ").trim();return r.length>e?`${r.slice(0,e)}\u2026`:r}function Zr(n){let e=n.scale??.3,r=n.quality??55,s=`http://${n.host}:${n.port}/shot`;return["// \u7531 xzh \u751F\u6210\uFF1A\u622A\u56FE\u5E76\u6309\u6388\u6743\u6846\u3001\u56DE\u4F20\u5230\u6865\uFF08\u52FF\u624B\u6539\uFF0C\u6A21\u677F\u89C1 src/device/screenshot.ts\uFF09","try {"," auto.waitFor(8000);"," var clicked = false;"," var auth = threads.start(function () {",' var btn = text("\u7ACB\u5373\u5F00\u59CB").findOne(3000);',' if (!btn) btn = text("\u5F00\u59CB\u73B0\u5728").findOne(300);',' if (!btn) btn = text("\u5141\u8BB8").findOne(300);'," if (!btn) btn = textMatches(/START NOW|Allow/i).findOne(300);"," if (btn) { clicked = true; btn.click(); }"," });",' console.log("\u3010\u622A\u56FE\u3011\u7B49\u5F85\u5C4F\u5E55\u6388\u6743\u2026");'," var img = captureScreen();"," auth.join(1500);",' if (!img) { console.log("\u3010\u622A\u56FE\u3011\u672A\u62FF\u5230\u56FE\u50CF\uFF08\u6388\u6743\u88AB\u62D2\u6216\u8D85\u65F6\uFF0C\u70B9\u5230\u6388\u6743\u6846=" + clicked + "\uFF09"); exit(); }',` var small = images.scale(img, ${e}, ${e});`,` var b64 = images.toBase64(small, "jpg", ${r});`,` var r = http.post("${s}", b64, { contentType: "text/plain" });`,' console.log("\u3010\u622A\u56FE\u3011" + img.width + "x" + img.height + " \u2192 " + small.width + "x" + small.height + "\uFF0C\u56DE\u4F20=" + r.statusCode);',"} catch (e) {",' console.log("\u3010\u622A\u56FE\u3011\u5931\u8D25\uFF1A" + e);',"}",""].join(`
|
|
73
|
+
`)}var Js=2*1024*1024,ze=class{port;baseDir;logBufferSize;options;sessions=new Set;logs=[];httpServer=null;wss=null;autojs6=null;autojs6Server=null;latestShot=null;constructor(e={}){this.options=e,this.port=e.port??Ee,this.baseDir=e.baseDir??process.cwd(),this.logBufferSize=Math.max(50,e.logBufferSize??500)}async start(e={}){if(this.httpServer)return;let r=Ks.createServer((i,o)=>this.handleHttp(i,o)),s=new $t.WebSocketServer({server:r});s.on("error",()=>{}),s.on("connection",(i,o)=>this.handleConnection(i,o)),await new Promise((i,o)=>{let a=c=>{if(r.removeListener("listening",l),c.code==="EADDRINUSE"){o(new Error(`\u7AEF\u53E3 ${this.port} \u5DF2\u88AB\u5360\u7528\u3002\u53EF\u80FD\u662F\uFF1A
|
|
74
74
|
\xB7 \u7384\u732A\u81EA\u5DF1\u5DF2\u7ECF\u6709\u4E00\u4E2A\u8BBE\u5907\u6865\u5728\u8DD1\uFF08\u7528 \`xzh device status\` \u770B\u4E00\u773C\uFF0C\u540C\u4E00\u4E2A\u63A7\u5236\u7AEF\u53E3\u540C\u65F6\u53EA\u80FD\u6709\u4E00\u4E2A\u6865\uFF09\uFF1B
|
|
75
75
|
\xB7 VSCode \u7684 Auto.js / AutoX.js \u63D2\u4EF6\u6B63\u5728\u8FD0\u884C\uFF08\u5B83\u7528 9317\uFF0C\u4E24\u8005\u4E0D\u80FD\u540C\u65F6\u5F00\uFF09\u3002
|
|
76
|
-
\u6362\u7AEF\u53E3\u518D\u8BD5\uFF1A--port <\u7AEF\u53E3>\u3002`));return}o(c)},l=()=>{r.removeListener("error",a),i()};r.once("error",a),r.once("listening",l),r.listen(this.port,"0.0.0.0")}),this.httpServer=r,this.wss=s,this.options.onStatus?.(e.announceUrls===!1?`\u63A7\u5236\u901A\u9053\u5DF2\u5C31\u7EEA\uFF08\u7AEF\u53E3 ${this.port}\uFF09`:`\u8BBE\u5907\u6865\u5DF2\u542F\u52A8\uFF0C\u76D1\u542C ${this.port}\u3002\u624B\u673A\u4E0A\u7684 AutoX.js \u586B\uFF1A${this.urls().join(" \u6216 ")}`)}async stop(){this.disconnectAutoJs6(),await this.stopAutoJs6Listener();for(let s of this.sessions)try{s.close()}catch{}this.sessions.clear();let e=this.wss;this.wss=null,e&&await new Promise(s=>e.close(()=>s()));let r=this.httpServer;this.httpServer=null,r&&await new Promise(s=>r.close(()=>s())),this.options.onStatus?.("\u8BBE\u5907\u6865\u5DF2\u505C\u6B62\u3002")}isRunning(){return this.httpServer!==null||this.autojs6Server!==null}getPort(){return this.port}urls(){let e=tn();return(e.length>0?e:["127.0.0.1"]).map(r=>`ws://${r}:${this.port}`)}listDevices(){return[...this.sessions].map(e=>e.info).filter(e=>e!==null).sort((e,r)=>e.attachedAt-r.attachedAt)}status(){return{running:this.isRunning(),port:this.port,urls:this.isRunning()?this.urls():[],devices:this.listDevices(),autojs6:this.autojs6?{address:this.autojs6.address,connected:this.autojs6.client.isConnected(),retrying:this.autojs6.client.isRetrying()}:null,autojs6Listener:this.autojs6Server?{port:this.autojs6Server.getPort(),urls:this.listenerUrls()}:null}}async connectAutoJs6(e,r=X){await this.start({announceUrls:!1}),this.disconnectAutoJs6();let s=`${e.trim()}:${r}`,i=new Ft({host:e.trim(),port:r,onStatus:a=>this.options.onStatus?.(a),onLog:a=>this.appendLog(s,a),onPhoneCommand:(a,l)=>{let c=typeof l.id=="string"?l.id:"";a==="rerun"&&c&&(this.options.onStatus?.(`\u624B\u673A\u8BF7\u6C42\u91CD\u8DD1\uFF1A${c}`),this.runScript(c))},onConnect:()=>{o.info={kind:"autojs6",id:s,name:s,appVersionCode:0,attachedAt:Date.now()},this.options.onDeviceAttach?.(o.info)},onDisconnect:()=>{let a=o.info;o.info=null,a&&this.options.onDeviceDetach?.(a)}}),o={kind:"autojs6",origin:"dial",id:s,info:null,sendJson:a=>i.sendJson(a),isAlive:()=>i.isConnected(),close:()=>i.close()};this.autojs6={client:i,address:s},this.sessions.add(o),i.start()}disconnectAutoJs6(){this.autojs6=null;for(let e of[...this.sessions])e.kind!=="autojs6"||e.origin!=="dial"||(this.sessions.delete(e),e.close())}async startAutoJs6Listener(e=fe){if(this.autojs6Server)return;let r=new gt({port:e,onStatus:s=>this.options.onStatus?.(s),onLog:(s,i)=>this.appendLog(s.name,i),onPhoneCommand:(s,i,o)=>{let a=typeof o.id=="string"?o.id:"";i==="rerun"&&a&&(this.options.onStatus?.(`\u624B\u673A\u8BF7\u6C42\u91CD\u8DD1\uFF1A${a}`),this.runScript(a))},onAttach:s=>{let i={kind:"autojs6",origin:"listen",id:s.id,info:{kind:"autojs6",id:s.id,name:s.name,appVersionCode:s.appVersionCode,attachedAt:Date.now()},sendJson:o=>r.sendTo(s.id,o),isAlive:()=>r.listDevices().some(o=>o.id===s.id),close:()=>r.closeDevice(s.id)};this.sessions.add(i),this.options.onDeviceAttach?.(i.info)},onDetach:s=>{let i=[...this.sessions].find(a=>a.kind==="autojs6"&&a.origin==="listen"&&a.id===s.id);if(!i)return;this.sessions.delete(i);let o=i.info;i.info=null,o&&this.options.onDeviceDetach?.(o)}});this.autojs6Server=r;try{await r.start()}catch(s){throw this.autojs6Server=null,s}}async stopAutoJs6Listener(){let e=this.autojs6Server;if(this.autojs6Server=null,!!e){for(let r of[...this.sessions]){if(r.kind!=="autojs6"||r.origin!=="listen")continue;this.sessions.delete(r);let s=r.info;r.info=null,s&&this.options.onDeviceDetach?.(s)}await e.stop()}}listenerUrls(){if(!this.autojs6Server)return[];let e=this.autojs6Server.getPort(),r=tn();return(r.length>0?r:["127.0.0.1"]).map(s=>`${s}:${e}`)}async screenshot(e=2e4){let r=this.listDevices();if(r.length===0)return{ok:!1,message:this.noDeviceMessage()};if(!this.httpServer)return{ok:!1,message:"\u63A7\u5236\u901A\u9053\u6CA1\u6709\u8FD0\u884C\uFF0C\u65E0\u6CD5\u63A5\u6536\u624B\u673A\u56DE\u4F20\u7684\u622A\u56FE\u3002"};let s=r[0],i=Qr({host:this.preferredHostFor(s.id),port:this.port}),o=Ce.join(et.tmpdir(),`xzh-shot-${Date.now()}.js`),a;try{Re.writeFileSync(o,i,"utf8"),a=this.sendScript("run",o)}finally{Re.rmSync(o,{force:!0})}if(!a.ok)return{ok:!1,message:a.message};let l=Date.now(),c=l+e;for(;Date.now()<c;){let u=this.latestShot;if(u&&u.at>l)return{ok:!0,data:u.data};await new Promise(h=>setTimeout(h,250))}return{ok:!1,message:`\u7B49\u5F85\u624B\u673A\u622A\u56FE\u8D85\u65F6\uFF08${Math.round(e/1e3)} \u79D2\uFF09\u3002\u5E38\u89C1\u539F\u56E0\uFF1A\u2460 \u7CFB\u7EDF\u6388\u6743\u6846\u6CA1\u88AB\u70B9\u6389\uFF08\u811A\u672C\u4F1A\u81EA\u52A8\u70B9\u300C\u7ACB\u5373\u5F00\u59CB\u300D\uFF0C\u4ECD\u5931\u8D25\u53EF\u624B\u52A8\u70B9\u4E00\u6B21\uFF09\uFF1B\u2461 \u811A\u672C\u5361\u4F4F\uFF08\u7528 xzh device stop \u6536\u5C3E\uFF09\uFF1B\u2462 \u624B\u673A\u4E0E\u7535\u8111\u4E0D\u5728\u540C\u4E00\u7F51\u7EDC\u3002`}}preferredHostFor(e){let s=(e.split(":")[0]??"").split(".").slice(0,3).join("."),i=tn();return i.find(o=>o.startsWith(`${s}.`))??i[0]??"127.0.0.1"}pushScript(e,r){return this.sendScript("save",e,r)}runScript(e,r){return this.sendScript("run",e,r)}stopScript(e,r){let s=this.selectSessions(r);if(s.length===0)return{ok:!1,message:this.noDeviceMessage()};let i=e?this.resolvePath(e):"",o=0;for(let a of s)this.sendTo(a,a.kind==="autojs6"?Pe(e?"stop":"stopAll",e?{id:i}:{}):e?Gr("stop",{id:i}):Gr("stopAll"))&&o++;return{ok:!0,path:e?this.resolvePath(e):"",delivered:o,devices:s.map(a=>en(a.info))}}sendScript(e,r,s){if(!this.isRunning())return{ok:!1,message:"\u8BBE\u5907\u6865\u5C1A\u672A\u542F\u52A8\u3002\u8BF7\u5728 xzh \u91CC\u6267\u884C /device serve\uFF0C\u6216\u5728\u53E6\u4E00\u4E2A\u7EC8\u7AEF\u8FD0\u884C `xzh device serve`\u3002"};let i=this.resolvePath(r),o;try{let c=Re.statSync(i);if(!c.isFile())return{ok:!1,message:`\u4E0D\u662F\u6587\u4EF6\uFF1A${i}`};if(c.size>zs)return{ok:!1,message:`\u811A\u672C\u8FC7\u5927\uFF08${Math.round(c.size/1024)} KB\uFF09\uFF0C\u4E0A\u9650 ${Math.round(zs/1024)} KB\u3002\u9879\u76EE\u7EA7\u540C\u6B65\u8BF7\u6539\u7528 VSCode \u63D2\u4EF6\u3002`};o=Re.readFileSync(i,"utf8")}catch(c){return{ok:!1,message:`\u8BFB\u53D6\u811A\u672C\u5931\u8D25\uFF1A${c instanceof Error?c.message:String(c)}`}}let a=this.selectSessions(s);if(a.length===0)return{ok:!1,message:this.noDeviceMessage()};let l=0;for(let c of a){let u=c.kind==="autojs6"?Pe(e,{id:i,name:Ce.basename(i),script:o}):Ps(e,i,o);this.sendTo(c,u)&&l++}return l===0?{ok:!1,message:"\u6307\u4EE4\u672A\u80FD\u9001\u8FBE\u4EFB\u4F55\u8BBE\u5907\uFF08\u8FDE\u63A5\u53EF\u80FD\u521A\u521A\u65AD\u5F00\uFF09\u3002"}:{ok:!0,path:i,delivered:l,devices:a.map(c=>en(c.info))}}appendLog(e,r){let s={device:e,text:r,at:Date.now()};this.logs.push(s),this.logs.length>this.logBufferSize&&this.logs.splice(0,this.logs.length-this.logBufferSize),this.options.onLog?.(s)}recentLogs(e=50){let r=Math.max(1,e);return this.logs.slice(-r)}clearLogs(){this.logs.length=0}handleConnection(e,r){let i=`${r.socket.remoteAddress??"unknown"}:${r.socket.remotePort??0}`,o,a={kind:"autoxjs",origin:"listen",id:i,info:null,sendJson:l=>{if(e.readyState!==$t.WebSocket.OPEN)return!1;try{return e.send(l),!0}catch{return!1}},isAlive:()=>e.readyState===$t.WebSocket.OPEN,close:()=>{o&&clearTimeout(o);try{e.close()}catch{}}};o=setTimeout(()=>{a.info||(this.options.onStatus?.(`\u8FDE\u63A5 ${i} \u672A\u5728 ${Hr/1e3} \u79D2\u5185\u63E1\u624B\uFF0C\u5DF2\u65AD\u5F00\u3002`),a.close())},Hr),this.sessions.add(a),e.on("message",l=>{let c=l.toString(),u=Rs(c);if(!u){this.options.onStatus?.(`\u6536\u5230\u65E0\u6CD5\u89E3\u6790\u7684\u6D88\u606F\uFF08\u5DF2\u5FFD\u7565\uFF09\uFF1A${zt(c,200)}`);return}this.handleDeviceMessage(a,u.type,u.data,c)}),e.on("close",()=>this.detach(a)),e.on("error",()=>this.detach(a))}handleDeviceMessage(e,r,s,i){switch(r){case"hello":{let{name:o,appVersionCode:a}=Xr(s);e.info={kind:"autoxjs",id:e.id,name:o||e.id,appVersionCode:a,attachedAt:Date.now()};let l=Es(a),c=this.sendTo(e,l);this.options.onStatus?.(`\u63E1\u624B\uFF1A${o||e.id}\uFF08versionCode ${a}\uFF09${c?"":"\u2014\u2014\u26A0 \u5E94\u7B54\u53D1\u9001\u5931\u8D25"}\uFF5C\u534F\u8BAE\u7248\u672C ${qr}\uFF08\u5B9E\u73B0 v${ks}\uFF09`),this.options.onStatus?.(` \u624B\u673A\u539F\u59CB hello\uFF1A${zt(i,240)}`),this.options.onStatus?.(` \u5DF2\u56DE\u5E94\uFF1A${zt(l,240)}`),this.options.onDeviceAttach?.(e.info);return}case"ping":this.sendTo(e,_s(s));return;case"device_name":{let{name:o}=Xr(s);e.info&&o&&(e.info.name=o);return}case"log":{let o=Ms(s);if(!o)return;this.appendLog(en(e.info),o);return}default:this.options.onStatus?.(`\u6536\u5230\u672A\u77E5\u6D88\u606F\u7C7B\u578B\u300C${r}\u300D\uFF0C\u5DF2\u5FFD\u7565\uFF1A${zt(i,200)}`);return}}detach(e){this.sessions.delete(e)&&(e.info&&(this.options.onDeviceDetach?.(e.info),e.info=null),e.close())}sendTo(e,r){return e.isAlive()&&e.sendJson(r)}selectSessions(e){let r=[...this.sessions].filter(i=>i.info!==null);if(!e)return r;let s=e.trim().toLowerCase();return r.filter(i=>{let o=i.info;return i.id.toLowerCase()===s||o.name.toLowerCase().includes(s)})}noDeviceMessage(){return this.autojs6Server?`AutoJs6 \u5C1A\u672A\u8FDE\u63A5\uFF08\u672C\u673A\u6B63\u5728\u76D1\u542C ${this.listenerUrls().join(" \u6216 ")}\uFF09\u3002\u8BF7\u786E\u8BA4\uFF1A\u2460 \u624B\u673A\u4E0A AutoJs6 \u6253\u5F00\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u5BA2\u6237\u7AEF\u6A21\u5F0F\u300D\uFF0C\u586B\u5165\u4E0A\u9762\u7684\u5730\u5740\uFF1B\u2461 \u7AEF\u53E3\u7528\u9ED8\u8BA4\u7684 ${fe}\uFF1B\u2462 \u624B\u673A\u4E0E\u7535\u8111\u5728\u540C\u4E00\u7F51\u7EDC\u3002`:this.autojs6?`AutoJs6 \u5C1A\u672A\u8FDE\u63A5\uFF08${this.autojs6.address}\uFF09\u3002\u8BF7\u786E\u8BA4\uFF1A\u2460 \u624B\u673A\u4E0A AutoJs6 \u6253\u5F00\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u670D\u52A1\u5668\u6A21\u5F0F\u300D\uFF08\u9ED8\u8BA4\u7AEF\u53E3 7347\uFF09\uFF1B\u2461 \u5730\u5740\u586B\u7684\u662F\u624B\u673A IP\uFF0C\u624B\u673A\u672C\u673A\u8FD0\u884C xzh \u65F6\u7528 127.0.0.1\uFF1B\u2462 \u4E24\u8005\u5728\u540C\u4E00\u7F51\u7EDC\u3002`:`\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u8BBE\u5907\u3002\u8BF7\u786E\u8BA4\uFF1A\u2460 \u624B\u673A\u4E0E\u7535\u8111\u5728\u540C\u4E00\u7F51\u7EDC\uFF1B\u2461 \u624B\u673A AutoX.js \u91CC\u586B\u4E86 ${this.urls().join(" \u6216 ")||`ws://<\u7535\u8111IP>:${this.port}`} \u5E76\u70B9\u4E86\u8FDE\u63A5\u3002`}resolvePath(e){let r=e.startsWith("~")?Ce.join(et.homedir(),e.slice(1)):e;return Ce.isAbsolute(r)?r:Ce.resolve(this.baseDir,r)}handleHttp(e,r){let s=new URL(e.url??"/",`http://127.0.0.1:${this.port}`),i=(o,a=200)=>{r.writeHead(a,{"content-type":"application/json; charset=utf-8"}),r.end(JSON.stringify(o))};switch(s.pathname){case"/":r.writeHead(200,{"content-type":"text/plain; charset=utf-8"}),r.end(`xzh device bridge
|
|
76
|
+
\u6362\u7AEF\u53E3\u518D\u8BD5\uFF1A--port <\u7AEF\u53E3>\u3002`));return}o(c)},l=()=>{r.removeListener("error",a),i()};r.once("error",a),r.once("listening",l),r.listen(this.port,"0.0.0.0")}),this.httpServer=r,this.wss=s,this.options.onStatus?.(e.announceUrls===!1?`\u63A7\u5236\u901A\u9053\u5DF2\u5C31\u7EEA\uFF08\u7AEF\u53E3 ${this.port}\uFF09`:`\u8BBE\u5907\u6865\u5DF2\u542F\u52A8\uFF0C\u76D1\u542C ${this.port}\u3002\u624B\u673A\u4E0A\u7684 AutoX.js \u586B\uFF1A${this.urls().join(" \u6216 ")}`)}async stop(){this.disconnectAutoJs6(),await this.stopAutoJs6Listener();for(let s of this.sessions)try{s.close()}catch{}this.sessions.clear();let e=this.wss;this.wss=null,e&&await new Promise(s=>e.close(()=>s()));let r=this.httpServer;this.httpServer=null,r&&await new Promise(s=>r.close(()=>s())),this.options.onStatus?.("\u8BBE\u5907\u6865\u5DF2\u505C\u6B62\u3002")}isRunning(){return this.httpServer!==null||this.autojs6Server!==null}getPort(){return this.port}urls(){let e=en();return(e.length>0?e:["127.0.0.1"]).map(r=>`ws://${r}:${this.port}`)}listDevices(){return[...this.sessions].map(e=>e.info).filter(e=>e!==null).sort((e,r)=>e.attachedAt-r.attachedAt)}status(){return{running:this.isRunning(),port:this.port,urls:this.isRunning()?this.urls():[],devices:this.listDevices(),autojs6:this.autojs6?{address:this.autojs6.address,connected:this.autojs6.client.isConnected(),retrying:this.autojs6.client.isRetrying()}:null,autojs6Listener:this.autojs6Server?{port:this.autojs6Server.getPort(),urls:this.listenerUrls()}:null}}async connectAutoJs6(e,r=X){await this.start({announceUrls:!1}),this.disconnectAutoJs6();let s=`${e.trim()}:${r}`,i=new Ft({host:e.trim(),port:r,onStatus:a=>this.options.onStatus?.(a),onLog:a=>this.appendLog(s,a),onPhoneCommand:(a,l)=>{let c=typeof l.id=="string"?l.id:"";a==="rerun"&&c&&(this.options.onStatus?.(`\u624B\u673A\u8BF7\u6C42\u91CD\u8DD1\uFF1A${c}`),this.runScript(c))},onConnect:()=>{o.info={kind:"autojs6",id:s,name:s,appVersionCode:0,attachedAt:Date.now()},this.options.onDeviceAttach?.(o.info)},onDisconnect:()=>{let a=o.info;o.info=null,a&&this.options.onDeviceDetach?.(a)}}),o={kind:"autojs6",origin:"dial",id:s,info:null,sendJson:a=>i.sendJson(a),isAlive:()=>i.isConnected(),close:()=>i.close()};this.autojs6={client:i,address:s},this.sessions.add(o),i.start()}disconnectAutoJs6(){this.autojs6=null;for(let e of[...this.sessions])e.kind!=="autojs6"||e.origin!=="dial"||(this.sessions.delete(e),e.close())}async startAutoJs6Listener(e=fe){if(this.autojs6Server)return;let r=new gt({port:e,onStatus:s=>this.options.onStatus?.(s),onLog:(s,i)=>this.appendLog(s.name,i),onPhoneCommand:(s,i,o)=>{let a=typeof o.id=="string"?o.id:"";i==="rerun"&&a&&(this.options.onStatus?.(`\u624B\u673A\u8BF7\u6C42\u91CD\u8DD1\uFF1A${a}`),this.runScript(a))},onAttach:s=>{let i={kind:"autojs6",origin:"listen",id:s.id,info:{kind:"autojs6",id:s.id,name:s.name,appVersionCode:s.appVersionCode,attachedAt:Date.now()},sendJson:o=>r.sendTo(s.id,o),isAlive:()=>r.listDevices().some(o=>o.id===s.id),close:()=>r.closeDevice(s.id)};this.sessions.add(i),this.options.onDeviceAttach?.(i.info)},onDetach:s=>{let i=[...this.sessions].find(a=>a.kind==="autojs6"&&a.origin==="listen"&&a.id===s.id);if(!i)return;this.sessions.delete(i);let o=i.info;i.info=null,o&&this.options.onDeviceDetach?.(o)}});this.autojs6Server=r;try{await r.start()}catch(s){throw this.autojs6Server=null,s}}async stopAutoJs6Listener(){let e=this.autojs6Server;if(this.autojs6Server=null,!!e){for(let r of[...this.sessions]){if(r.kind!=="autojs6"||r.origin!=="listen")continue;this.sessions.delete(r);let s=r.info;r.info=null,s&&this.options.onDeviceDetach?.(s)}await e.stop()}}listenerUrls(){if(!this.autojs6Server)return[];let e=this.autojs6Server.getPort(),r=en();return(r.length>0?r:["127.0.0.1"]).map(s=>`${s}:${e}`)}async screenshot(e=2e4){let r=this.listDevices();if(r.length===0)return{ok:!1,message:this.noDeviceMessage()};if(!this.httpServer)return{ok:!1,message:"\u63A7\u5236\u901A\u9053\u6CA1\u6709\u8FD0\u884C\uFF0C\u65E0\u6CD5\u63A5\u6536\u624B\u673A\u56DE\u4F20\u7684\u622A\u56FE\u3002"};let s=r[0],i=Zr({host:this.preferredHostFor(s.id),port:this.port}),o=Ce.join(tt.tmpdir(),`xzh-shot-${Date.now()}.js`),a;try{Re.writeFileSync(o,i,"utf8"),a=this.sendScript("run",o)}finally{Re.rmSync(o,{force:!0})}if(!a.ok)return{ok:!1,message:a.message};let l=Date.now(),c=l+e;for(;Date.now()<c;){let u=this.latestShot;if(u&&u.at>l)return{ok:!0,data:u.data};await new Promise(p=>setTimeout(p,250))}return{ok:!1,message:`\u7B49\u5F85\u624B\u673A\u622A\u56FE\u8D85\u65F6\uFF08${Math.round(e/1e3)} \u79D2\uFF09\u3002\u5E38\u89C1\u539F\u56E0\uFF1A\u2460 \u7CFB\u7EDF\u6388\u6743\u6846\u6CA1\u88AB\u70B9\u6389\uFF08\u811A\u672C\u4F1A\u81EA\u52A8\u70B9\u300C\u7ACB\u5373\u5F00\u59CB\u300D\uFF0C\u4ECD\u5931\u8D25\u53EF\u624B\u52A8\u70B9\u4E00\u6B21\uFF09\uFF1B\u2461 \u811A\u672C\u5361\u4F4F\uFF08\u7528 xzh device stop \u6536\u5C3E\uFF09\uFF1B\u2462 \u624B\u673A\u4E0E\u7535\u8111\u4E0D\u5728\u540C\u4E00\u7F51\u7EDC\u3002`}}preferredHostFor(e){let s=(e.split(":")[0]??"").split(".").slice(0,3).join("."),i=en();return i.find(o=>o.startsWith(`${s}.`))??i[0]??"127.0.0.1"}pushScript(e,r){return this.sendScript("save",e,r)}runScript(e,r){return this.sendScript("run",e,r)}stopScript(e,r){let s=this.selectSessions(r);if(s.length===0)return{ok:!1,message:this.noDeviceMessage()};let i=e?this.resolvePath(e):"",o=0;for(let a of s)this.sendTo(a,a.kind==="autojs6"?Pe(e?"stop":"stopAll",e?{id:i}:{}):e?Wr("stop",{id:i}):Wr("stopAll"))&&o++;return{ok:!0,path:e?this.resolvePath(e):"",delivered:o,devices:s.map(a=>Qr(a.info))}}sendScript(e,r,s){if(!this.isRunning())return{ok:!1,message:"\u8BBE\u5907\u6865\u5C1A\u672A\u542F\u52A8\u3002\u8BF7\u5728 xzh \u91CC\u6267\u884C /device serve\uFF0C\u6216\u5728\u53E6\u4E00\u4E2A\u7EC8\u7AEF\u8FD0\u884C `xzh device serve`\u3002"};let i=this.resolvePath(r),o;try{let c=Re.statSync(i);if(!c.isFile())return{ok:!1,message:`\u4E0D\u662F\u6587\u4EF6\uFF1A${i}`};if(c.size>Js)return{ok:!1,message:`\u811A\u672C\u8FC7\u5927\uFF08${Math.round(c.size/1024)} KB\uFF09\uFF0C\u4E0A\u9650 ${Math.round(Js/1024)} KB\u3002\u9879\u76EE\u7EA7\u540C\u6B65\u8BF7\u6539\u7528 VSCode \u63D2\u4EF6\u3002`};o=Re.readFileSync(i,"utf8")}catch(c){return{ok:!1,message:`\u8BFB\u53D6\u811A\u672C\u5931\u8D25\uFF1A${c instanceof Error?c.message:String(c)}`}}let a=this.selectSessions(s);if(a.length===0)return{ok:!1,message:this.noDeviceMessage()};let l=0;for(let c of a){let u=c.kind==="autojs6"?Pe(e,{id:i,name:Ce.basename(i),script:o}):Rs(e,i,o);this.sendTo(c,u)&&l++}return l===0?{ok:!1,message:"\u6307\u4EE4\u672A\u80FD\u9001\u8FBE\u4EFB\u4F55\u8BBE\u5907\uFF08\u8FDE\u63A5\u53EF\u80FD\u521A\u521A\u65AD\u5F00\uFF09\u3002"}:{ok:!0,path:i,delivered:l,devices:a.map(c=>Qr(c.info))}}appendLog(e,r){let s={device:e,text:r,at:Date.now()};this.logs.push(s),this.logs.length>this.logBufferSize&&this.logs.splice(0,this.logs.length-this.logBufferSize),this.options.onLog?.(s)}recentLogs(e=50){let r=Math.max(1,e);return this.logs.slice(-r)}clearLogs(){this.logs.length=0}handleConnection(e,r){let i=`${r.socket.remoteAddress??"unknown"}:${r.socket.remotePort??0}`,o,a={kind:"autoxjs",origin:"listen",id:i,info:null,sendJson:l=>{if(e.readyState!==$t.WebSocket.OPEN)return!1;try{return e.send(l),!0}catch{return!1}},isAlive:()=>e.readyState===$t.WebSocket.OPEN,close:()=>{o&&clearTimeout(o);try{e.close()}catch{}}};o=setTimeout(()=>{a.info||(this.options.onStatus?.(`\u8FDE\u63A5 ${i} \u672A\u5728 ${Kr/1e3} \u79D2\u5185\u63E1\u624B\uFF0C\u5DF2\u65AD\u5F00\u3002`),a.close())},Kr),this.sessions.add(a),e.on("message",l=>{let c=l.toString(),u=Ms(c);if(!u){this.options.onStatus?.(`\u6536\u5230\u65E0\u6CD5\u89E3\u6790\u7684\u6D88\u606F\uFF08\u5DF2\u5FFD\u7565\uFF09\uFF1A${zt(c,200)}`);return}this.handleDeviceMessage(a,u.type,u.data,c)}),e.on("close",()=>this.detach(a)),e.on("error",()=>this.detach(a))}handleDeviceMessage(e,r,s,i){switch(r){case"hello":{let{name:o,appVersionCode:a}=Gr(s);e.info={kind:"autoxjs",id:e.id,name:o||e.id,appVersionCode:a,attachedAt:Date.now()};let l=Es(a),c=this.sendTo(e,l);this.options.onStatus?.(`\u63E1\u624B\uFF1A${o||e.id}\uFF08versionCode ${a}\uFF09${c?"":"\u2014\u2014\u26A0 \u5E94\u7B54\u53D1\u9001\u5931\u8D25"}\uFF5C\u534F\u8BAE\u7248\u672C ${Hr}\uFF08\u5B9E\u73B0 v${_s}\uFF09`),this.options.onStatus?.(` \u624B\u673A\u539F\u59CB hello\uFF1A${zt(i,240)}`),this.options.onStatus?.(` \u5DF2\u56DE\u5E94\uFF1A${zt(l,240)}`),this.options.onDeviceAttach?.(e.info);return}case"ping":this.sendTo(e,Ps(s));return;case"device_name":{let{name:o}=Gr(s);e.info&&o&&(e.info.name=o);return}case"log":{let o=Is(s);if(!o)return;this.appendLog(Qr(e.info),o);return}default:this.options.onStatus?.(`\u6536\u5230\u672A\u77E5\u6D88\u606F\u7C7B\u578B\u300C${r}\u300D\uFF0C\u5DF2\u5FFD\u7565\uFF1A${zt(i,200)}`);return}}detach(e){this.sessions.delete(e)&&(e.info&&(this.options.onDeviceDetach?.(e.info),e.info=null),e.close())}sendTo(e,r){return e.isAlive()&&e.sendJson(r)}selectSessions(e){let r=[...this.sessions].filter(i=>i.info!==null);if(!e)return r;let s=e.trim().toLowerCase();return r.filter(i=>{let o=i.info;return i.id.toLowerCase()===s||o.name.toLowerCase().includes(s)})}noDeviceMessage(){return this.autojs6Server?`AutoJs6 \u5C1A\u672A\u8FDE\u63A5\uFF08\u672C\u673A\u6B63\u5728\u76D1\u542C ${this.listenerUrls().join(" \u6216 ")}\uFF09\u3002\u8BF7\u786E\u8BA4\uFF1A\u2460 \u624B\u673A\u4E0A AutoJs6 \u6253\u5F00\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u5BA2\u6237\u7AEF\u6A21\u5F0F\u300D\uFF0C\u586B\u5165\u4E0A\u9762\u7684\u5730\u5740\uFF1B\u2461 \u7AEF\u53E3\u7528\u9ED8\u8BA4\u7684 ${fe}\uFF1B\u2462 \u624B\u673A\u4E0E\u7535\u8111\u5728\u540C\u4E00\u7F51\u7EDC\u3002`:this.autojs6?`AutoJs6 \u5C1A\u672A\u8FDE\u63A5\uFF08${this.autojs6.address}\uFF09\u3002\u8BF7\u786E\u8BA4\uFF1A\u2460 \u624B\u673A\u4E0A AutoJs6 \u6253\u5F00\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u670D\u52A1\u5668\u6A21\u5F0F\u300D\uFF08\u9ED8\u8BA4\u7AEF\u53E3 7347\uFF09\uFF1B\u2461 \u5730\u5740\u586B\u7684\u662F\u624B\u673A IP\uFF0C\u624B\u673A\u672C\u673A\u8FD0\u884C xzh \u65F6\u7528 127.0.0.1\uFF1B\u2462 \u4E24\u8005\u5728\u540C\u4E00\u7F51\u7EDC\u3002`:`\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u8BBE\u5907\u3002\u8BF7\u786E\u8BA4\uFF1A\u2460 \u624B\u673A\u4E0E\u7535\u8111\u5728\u540C\u4E00\u7F51\u7EDC\uFF1B\u2461 \u624B\u673A AutoX.js \u91CC\u586B\u4E86 ${this.urls().join(" \u6216 ")||`ws://<\u7535\u8111IP>:${this.port}`} \u5E76\u70B9\u4E86\u8FDE\u63A5\u3002`}resolvePath(e){let r=e.startsWith("~")?Ce.join(tt.homedir(),e.slice(1)):e;return Ce.isAbsolute(r)?r:Ce.resolve(this.baseDir,r)}handleHttp(e,r){let s=new URL(e.url??"/",`http://127.0.0.1:${this.port}`),i=(o,a=200)=>{r.writeHead(a,{"content-type":"application/json; charset=utf-8"}),r.end(JSON.stringify(o))};switch(s.pathname){case"/":r.writeHead(200,{"content-type":"text/plain; charset=utf-8"}),r.end(`xzh device bridge
|
|
77
77
|
devices: ${this.listDevices().length}
|
|
78
78
|
url: ${this.urls().join(" ")}
|
|
79
79
|
endpoints: /status /devices /logs /exec?cmd=save|run|rerun|stop|stopAll&path=<\u811A\u672C>
|
|
80
80
|
`);return;case"/status":i(this.status());return;case"/devices":i({devices:this.listDevices()});return;case"/logs":{let o=Number(s.searchParams.get("limit")??"50");i({logs:this.recentLogs(Number.isFinite(o)?o:50)});return}case"/exec":{let o=(s.searchParams.get("cmd")??"").trim(),a=(s.searchParams.get("path")??"").trim(),l=(s.searchParams.get("device")??"").trim()||void 0;switch(o){case"save":case"push":i(a?this.pushScript(a,l):{ok:!1,message:"\u7F3A\u5C11 path \u53C2\u6570"});return;case"run":i(a?this.runScript(a,l):{ok:!1,message:"\u7F3A\u5C11 path \u53C2\u6570"});return;case"rerun":{if(!a){i({ok:!1,message:"\u7F3A\u5C11 path \u53C2\u6570"});return}this.stopScript(void 0,l),setTimeout(()=>this.runScript(a,l),800),i({ok:!0,path:this.resolvePath(a),action:"rerun"});return}case"stop":i(this.stopScript(a||void 0,l));return;case"stopAll":i(this.stopScript(void 0,l));return;default:i({ok:!1,message:`\u672A\u77E5 cmd\uFF1A${o}`},400);return}}case"/shot":{if(e.method!=="POST"){i({ok:!1,message:"\u8BF7\u7528 POST \u4E0A\u4F20\u622A\u56FE"},405);return}let o=[];e.on("data",a=>o.push(a)),e.on("end",()=>{let a=Buffer.concat(o),l=Buffer.from(a.toString("utf8").trim(),"base64");if(l.length===0){i({ok:!1,message:"\u622A\u56FE\u5185\u5BB9\u4E3A\u7A7A"},400);return}this.latestShot={data:l,at:Date.now()},i({ok:!0,bytes:l.length})});return}case"/screenshot":{this.screenshot().then(o=>{if(!o.ok){i({ok:!1,message:o.message},504);return}r.writeHead(200,{"content-type":"image/jpeg","content-length":String(o.data.length)}),r.end(o.data)}).catch(o=>i({ok:!1,message:String(o)},500));return}default:{r.writeHead(404,{"content-type":"text/plain; charset=utf-8"}),r.end(`not found
|
|
81
|
-
`);return}}}};function zt(n,e){let r=n.replace(/\s+/g," ").trim();return r.length>e?`${r.slice(0,e)}\u2026`:r}function
|
|
82
|
-
`).slice(1).map(r=>r.trim()).filter(r=>r.endsWith(" device"));if(e.length>0){let r=(0,
|
|
83
|
-
`)}function
|
|
84
|
-
`)}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"},ne={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"},qt={enterAlt:"\x1B[?1049h",exitAlt:"\x1B[?1049l",save:"\x1B[s",restore:"\x1B[u"};function
|
|
85
|
-
`)){if(s===""){r.push("");continue}let i="",o=0,a=[],l=s.match(/\x1b\[[0-9;?]*[A-Za-z]|./gu)??[];for(let c of l){let u=N(c);o+u>e&&i!==""&&(r.push(a.length>0?`${i}${t.reset}`:i),i=a.join(""),o=0),
|
|
81
|
+
`);return}}}};function zt(n,e){let r=n.replace(/\s+/g," ").trim();return r.length>e?`${r.slice(0,e)}\u2026`:r}function Qr(n){return n?n.name||n.id:"\u672A\u63E1\u624B\u8FDE\u63A5"}function en(){let n=[],e=tt.networkInterfaces();for(let r of Object.keys(e))for(let s of e[r]??[])s.family==="IPv4"&&!s.internal&&n.push(s.address);return n}var tn=v(require("http"));var _a=5e3;function Me(n){if(typeof n=="number"&&n>0&&n<=65535)return n;let e=Number.parseInt(process.env.XZH_DEVICE_PORT??"",10);return Number.isFinite(e)&&e>0&&e<=65535?e:Ee}var re=class{port;constructor(e=Ee){this.port=e}getPort(){return this.port}screenshot(e=4e4){return new Promise(r=>{let s=tn.request({host:"127.0.0.1",port:this.port,path:"/screenshot",method:"POST",timeout:e},i=>{let o=[];i.on("data",a=>o.push(a)),i.on("end",()=>{let a=Buffer.concat(o);if(i.statusCode===200){r({ok:!0,data:a});return}let l=`\u622A\u56FE\u5931\u8D25\uFF08HTTP ${i.statusCode}\uFF09`;try{let c=JSON.parse(a.toString("utf8"));c.message&&(l=c.message)}catch{}r({ok:!1,message:l})})});s.on("error",i=>r({ok:!1,message:String(i)})),s.on("timeout",()=>{s.destroy(),r({ok:!1,message:`\u622A\u56FE\u8D85\u65F6\uFF08${e}ms\uFF09`})}),s.end()})}async status(){return this.request("/status")}async isRunning(){return await this.status()!==null}async devices(){let e=await this.request("/devices");return e?e.devices:null}async logs(e=50){let r=await this.request(`/logs?limit=${encodeURIComponent(String(e))}`);return r?r.logs:null}async exec(e,r,s){let i=new URLSearchParams({cmd:e});r&&i.set("path",r),s&&i.set("device",s);let o=await this.request(`/exec?${i.toString()}`);return o||{ok:!1,message:`\u8FDE\u4E0D\u4E0A\u8BBE\u5907\u6865\uFF08127.0.0.1:${this.port}\uFF09\u3002\u5148\u5728\u53E6\u4E00\u4E2A\u7EC8\u7AEF\u8FD0\u884C \`xzh device serve\`\uFF0C\u6216\u5728 xzh \u91CC\u6267\u884C /device serve\u3002`}}request(e){return new Promise(r=>{let s=tn.request({host:"127.0.0.1",port:this.port,path:e,method:"GET",timeout:_a},i=>{let o=[];i.on("data",a=>o.push(a)),i.on("end",()=>{try{r(JSON.parse(Buffer.concat(o).toString("utf8")))}catch{r(null)}})});s.on("timeout",()=>{s.destroy(),r(null)}),s.on("error",()=>r(null)),s.end()})}};var rn=require("child_process"),rt=v(require("fs")),nn=v(require("path"));var sn="https://github.com/SuperMonster003/AutoJs6/releases/";function Hs(){return nn.join(T(),"apks")}var Ea=["arm64-v8a","armeabi-v7a","x86_64","x86"];function Jt(){try{let e=(0,rn.execFileSync)("adb",["devices"],{timeout:5e3,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).split(`
|
|
82
|
+
`).slice(1).map(r=>r.trim()).filter(r=>r.endsWith(" device"));if(e.length>0){let r=(0,rn.execFileSync)("adb",["shell","getprop","ro.product.cpu.abi"],{timeout:5e3,encoding:"utf8",stdio:["ignore","pipe","ignore"]}).trim();if(Ea.includes(r))return{abi:r,source:"adb",detail:`\u7531 adb \u8BFB\u53D6\u8BBE\u5907\u4FE1\u606F\u5F97\u5230\uFF08${e.length} \u53F0\u8BBE\u5907\u5728\u7EBF\uFF09`}}}catch{}return{abi:"arm64-v8a",source:"default",detail:"\u672A\u68C0\u6D4B\u5230 adb \u8BBE\u5907\uFF0C\u6309\u4E3B\u6D41\u673A\u578B\u9ED8\u8BA4\u9009\u62E9\uFF08\u6A21\u62DF\u5668\u8BF7\u9009 x86_64\uFF09"}}function Kt(n,e=Hs()){let r;try{r=rt.readdirSync(e)}catch{return null}for(let s of r){if(!s.toLowerCase().endsWith(".apk")||!s.toLowerCase().includes(n.toLowerCase()))continue;let i=nn.join(e,s);try{let o=rt.statSync(i);if(o.isFile())return{path:i,sizeBytes:o.size}}catch{}}return null}function nt(){if(process.env.PREFIX?.includes("com.termux")||process.env.ANDROID_ROOT||process.env.ANDROID_DATA)return!0;try{return rt.existsSync("/system/build.prop")}catch{return!1}}function Pa(n){return n<1024*1024?`${Math.round(n/1024)} KB`:`${(n/(1024*1024)).toFixed(0)} MB`}function Ht(n){let{where:e,abi:r,address:s,localApk:i}=n,o=[];return o.push("\u9996\u6B21\u8FDE\u63A5\u624B\u673A\u9700\u8981\u88C5 AutoJs6\uFF08\u5B83\u63D0\u4F9B\u65E0\u969C\u788D\u80FD\u529B\uFF0Cxzh \u901A\u8FC7\u5B83\u64CD\u4F5C\u624B\u673A\uFF09\uFF1A"),o.push(""),o.push(` 1. \u624B\u673A\u5B89\u88C5 AutoJs6 \u2014\u2014 \u4E0B\u8F7D\u9875\uFF1A${sn}`),o.push(` \u9009 ${r} \u7248\u672C${r==="arm64-v8a"?"\uFF08\u7EDD\u5927\u591A\u6570\u624B\u673A\uFF09":"\uFF08\u6A21\u62DF\u5668/\u7279\u6B8A\u673A\u578B\uFF09"}`),i?o.push(` \u672C\u673A\u5DF2\u6709\u73B0\u6210\u5B89\u88C5\u5305\uFF1A${i.path}\uFF08${Pa(i.sizeBytes)}\uFF09`):o.push(` \u4E5F\u53EF\u4EE5\u628A\u5B89\u88C5\u5305\u653E\u5230 ${Hs()}/\uFF0C\u4E0B\u6B21\u4F1A\u76F4\u63A5\u63D0\u793A\u672C\u673A\u8DEF\u5F84`),o.push(" 2. \u624B\u673A\u6253\u5F00 AutoJs6 \u2192 \u4FA7\u8FB9\u680F\u300C\u8FDE\u63A5\u7535\u8111\u300D\u2192 \u6253\u5F00\u300C\u670D\u52A1\u5668\u6A21\u5F0F\u300D\uFF08\u7AEF\u53E3 7347\uFF09"),e==="pc"?(o.push(` 3. \u5728\u672C\u673A\u6267\u884C\uFF1Axzh device connect <\u624B\u673AIP>${s?` \uFF08\u4F60\u521A\u8BD5\u7684\u662F ${s}\uFF09`:""}`),o.push(" \u624B\u673A IP \u770B\u300C\u8BBE\u7F6E \u2192 \u5173\u4E8E\u624B\u673A \u2192 \u72B6\u6001\u4FE1\u606F\u300D\uFF0C\u6216\u624B\u673A AutoJs6 \u670D\u52A1\u5668\u6A21\u5F0F\u9875\u9762\u4E0A\u663E\u793A\u7684\u5730\u5740")):(o.push(` 3. \u5728\u672C\u673A\uFF08\u624B\u673A\uFF09\u6267\u884C\uFF1Axzh device connect 127.0.0.1${s?` \uFF08\u4F60\u521A\u8BD5\u7684\u662F ${s}\uFF09`:""}`),o.push(" \u5728\u624B\u673A\u672C\u673A\u8FD0\u884C\u4E0D\u9700\u8981\u586B IP\uFF0C\u4E5F\u4E0D\u9700\u8981\u8054\u7F51")),o.push(""),o.push("\u8FDE\u4E0D\u4E0A\u65F6\u6309\u987A\u5E8F\u6392\u67E5\uFF1A"),o.push(" \xB7 AutoJs6 \u7684\u300C\u670D\u52A1\u5668\u6A21\u5F0F\u300D\u662F\u5426\u5DF2\u6253\u5F00\uFF08\u4E0D\u662F\u300C\u5BA2\u6237\u7AEF\u6A21\u5F0F\u300D\uFF09"),e==="pc"&&(o.push(" \xB7 \u624B\u673A\u4E0E\u7535\u8111\u662F\u5426\u5728\u540C\u4E00\u5C40\u57DF\u7F51\uFF08\u4E0D\u540C\u7F51\u6BB5 / \u624B\u673A\u6D41\u91CF / VPN \u90FD\u4E0D\u901A\uFF09"),o.push(" \xB7 \u8DEF\u7531\u5668\u662F\u5426\u5F00\u4E86\u300CAP \u9694\u79BB\u300D\uFF08\u540C WiFi \u4E0B\u8BBE\u5907\u4E92\u76F8\u4E0D\u901A\uFF0C\u662F\u6700\u5E38\u89C1\u7684\u539F\u56E0\uFF09")),o.push(" \xB7 \u7AEF\u53E3\u662F\u5426\u88AB\u6539\u8FC7\uFF08xzh \u9ED8\u8BA4\u8FDE 7347\uFF0C\u4E0E AutoJs6 \u670D\u52A1\u5668\u6A21\u5F0F\u9ED8\u8BA4\u4E00\u81F4\uFF09"),o.push(" \xB7 \u624B\u673A\u7AEF AutoJs6 \u662F\u5426\u88AB\u7CFB\u7EDF\u540E\u53F0\u9650\u5236\uFF08OPPO/\u5C0F\u7C73\u7B49\u9700\u5141\u8BB8\u540E\u53F0\u8FD0\u884C\uFF09"),o.join(`
|
|
83
|
+
`)}function on(n=60,e=""){return["// \u7531 xzh \u751F\u6210\uFF1A\u8BFB\u53D6\u5F53\u524D\u754C\u9762\u5185\u5BB9\uFF08\u6A21\u677F\u89C1 src/device/ui-dump.ts\uFF09","try {",` console.log("\u3010\u5F00\u59CB\u3011${e}");`," auto.waitFor(8000);"," if (!auto.isRunning()) {",' console.log("\u3010\u754C\u9762\u3011\u65E0\u969C\u788D\u672A\u5C31\u7EEA\uFF0C\u65E0\u6CD5\u8BFB\u53D6\u754C\u9762");'," exit();"," }",' console.log("\u3010\u754C\u9762\u3011" + currentPackage() + " / " + currentActivity());'," var lines = [];"," classNameMatches(/.*/).find().forEach(function (el) {"," try {"," var t = el.text();"," var d = el.desc();"," var label = (t && t.trim()) || (d && d.trim());"," if (!label) return;",' if (label.indexOf("\u3010") === 0) return;'," var b = el.bounds();",' lines.push(el.className().replace(/^android\\.widget\\./, "") + " | " + label +',' " | click=" + (el.clickable() ? "Y" : "N") +',' " | [" + b.left + "," + b.top + "," + b.right + "," + b.bottom + "]");'," } catch (e) {}"," });",` console.log("\u3010\u63A7\u4EF6\u3011\u5171 " + lines.length + " \u4E2A" + (lines.length > ${n} ? "\uFF08\u53EA\u5217\u524D ${n} \u4E2A\uFF09" : ""));`,` lines.slice(0, ${n}).forEach(function (line) { console.log("\u3010\u63A7\u4EF6\u3011" + line); });`," if (lines.length < 3) {",' console.log("\u3010\u5224\u65AD\u3011\u53EF\u7528\u63A7\u4EF6\u6570=" + lines.length + " \u21D2 \u8BE5\u754C\u9762\u65E0\u6CD5\u901A\u8FC7\u65E0\u969C\u788D\u8BFB\u53D6");',' console.log("\u3010\u539F\u56E0\u3011\u5FAE\u4FE1\u3001\u5E94\u7528\u5206\u8EAB\u3001\u6E38\u620F\u7B49\u81EA\u7ED8/\u8DE8\u7528\u6237\u754C\u9762\u4E0D\u66B4\u9732\u65E0\u969C\u788D\u8282\u70B9\uFF08\u5E94\u7528\u5206\u8EAB\u8DD1\u5728\u72EC\u7ACB\u7528\u6237\u7A7A\u95F4\uFF09");',' console.log("\u3010\u63D0\u9192\u3011\u6B64\u65F6 currentPackage()/currentActivity() **\u4E5F\u4E0D\u53EF\u4FE1**\uFF08\u540C\u6837\u6765\u81EA\u65E0\u969C\u788D\u4E8B\u4EF6\uFF0C\u53EF\u80FD\u662F\u8FC7\u671F\u4FE1\u606F\uFF09");',' console.log("\u3010\u5EFA\u8BAE\u3011\u6539\u7528 device_screenshot \u622A\u56FE\uFF1A\u8BA9\u5177\u5907\u89C6\u89C9\u80FD\u529B\u7684\u6A21\u578B\u770B\u56FE\u5224\u65AD\uFF0C\u6216\u628A\u56FE\u7ED9\u7528\u6237\u770B\uFF1B\u518D\u6309\u5750\u6807 click(x,y) \u64CD\u4F5C");'," }",' console.log("\u3010\u5B8C\u6210\u3011\u754C\u9762\u5185\u5BB9\u5DF2\u8F93\u51FA");',"} catch (e) {",' console.log("\u3010\u754C\u9762\u3011\u8BFB\u53D6\u5931\u8D25\uFF1A" + e);',"}",""].join(`
|
|
84
|
+
`)}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"},ne={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"},qt={enterAlt:"\x1B[?1049h",exitAlt:"\x1B[?1049l",save:"\x1B[s",restore:"\x1B[u"};function Ra(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 N(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+=Ra(s)?2:1)}}return e}function Ma(n){return/^\x1b\[[0-9;]*m$/.test(n)}function yt(n,e){let r=[];for(let s of n.split(`
|
|
85
|
+
`)){if(s===""){r.push("");continue}let i="",o=0,a=[],l=s.match(/\x1b\[[0-9;?]*[A-Za-z]|./gu)??[];for(let c of l){let u=N(c);o+u>e&&i!==""&&(r.push(a.length>0?`${i}${t.reset}`:i),i=a.join(""),o=0),Ma(c)&&(c===t.reset||c==="\x1B[m"?a=[]:a.push(c)),i+=c,o+=u}r.push(a.length>0?`${i}${t.reset}`:i)}return r}function O(n,e){if(N(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=N(a);if(i+l>o)break;s+=a,i+=l}return`${s}${t.reset}\u2026`}function vt(n,e){let r=N(n);return n+" ".repeat(Math.max(0,e-r))}function ge(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,"")}async function Vs(n){let e=qa(n);if(e.error){j(e.error);return}switch(e.sub){case"serve":case"start":return Ia(e);case"connect":return Da(e);case"apk":return Oa(e);case"check":return Na(e);case"shot":case"screenshot":return La(e);case"status":return Ba(e);case"list":case"ls":case"devices":return Ua(e);case"push":case"save":return Ws(e,"save");case"run":return Ws(e,"run");case"stop":return Fa(e);case"logs":case"log":return za(e);case"help":case"-h":case"--help":case void 0:Ja();return;default:j(`\u672A\u77E5\u5B50\u547D\u4EE4\uFF1A${e.sub}`,"\u53EF\u7528\uFF1Aserve / status / list / push / run / stop / logs");return}}async function Ia(n){let e=n.port,r=new ze({port:e,baseDir:process.cwd(),onStatus:o=>process.stdout.write(`${t.gray}${o}${t.reset}
|
|
86
86
|
`),onDeviceAttach:o=>process.stdout.write(`
|
|
87
87
|
${t.green}\u25CF${t.reset} \u8BBE\u5907\u5DF2\u8FDE\u63A5\uFF1A${t.bold}${o.name}${t.reset}${t.gray}\uFF08${o.kind==="autojs6"?"AutoJs6":"AutoX.js"}${o.appVersionCode?` versionCode ${o.appVersionCode}`:""}\uFF09${t.reset}
|
|
88
88
|
`),onDeviceDetach:o=>process.stdout.write(`
|
|
@@ -103,7 +103,7 @@ ${t.gray}\uFF08AutoX.js \u90A3\u4FA7\u4E0D\u53D7\u5F71\u54CD\uFF0C\u4ECD\u53EF\u
|
|
|
103
103
|
`+r.listenerUrls().map(o=>` ${t.gray}\u624B\u673A AutoJs6 \u586B\uFF1A${t.reset}${t.brightGreen}${o}${t.reset}
|
|
104
104
|
`).join("")),!s&&!i){j("\u8BBE\u5907\u6865\u6CA1\u80FD\u542F\u52A8\uFF1A\u4E24\u4E2A\u76D1\u542C\u7AEF\u53E3\u90FD\u4E0D\u53EF\u7528\u3002","\u5206\u522B\u88AB VSCode \u7684 Auto.js \u63D2\u4EF6\uFF089317\uFF09\u4E0E AutoJs6 \u6269\u5C55\uFF086347\uFF09\u5360\u7528\u65F6\u4F1A\u8FD9\u6837 \u2014\u2014 \u7981\u7528\u5176\u4E00\u5373\u53EF\u3002"),await r.stop(),process.exitCode=1;return}process.stdout.write(` ${t.gray}\u624B\u673A\u8FDE\u4E0A\u540E\u5373\u53EF\u63A8\u9001\u811A\u672C\uFF1B\u65E5\u5FD7\u4F1A\u663E\u793A\u5728\u8FD9\u91CC\u3002\u4FDD\u6301\u672C\u7A97\u53E3\u5F00\u542F\uFF0C\u505C\u6B62\uFF1ACtrl+C${t.reset}
|
|
105
105
|
|
|
106
|
-
`),await
|
|
106
|
+
`),await Ys(()=>r.stop())}async function Da(n){let e=nt(),r=n.positional[0]?.trim()??"",s="",i=X;if(r){let a=/^(.*?)(?::(\d+))?$/.exec(r);s=(a?.[1]??r).trim();let l=a?.[2]?Number.parseInt(a[2],10):NaN;Number.isFinite(l)&&(i=l)}else e&&(s="127.0.0.1");if(!s){j("\u7F3A\u5C11\u624B\u673A\u5730\u5740",`\u7528\u6CD5\uFF1Axzh device connect <\u624B\u673AIP>[:\u7AEF\u53E3]\uFF08\u9ED8\u8BA4 ${X}\uFF09`),an({where:e?"phone":"pc"});return}let o=new ze({port:n.port,baseDir:process.cwd(),onStatus:a=>process.stdout.write(`${t.gray}${a}${t.reset}
|
|
107
107
|
`),onDeviceAttach:a=>process.stdout.write(`
|
|
108
108
|
${t.green}\u25CF${t.reset} \u624B\u673A\u5DF2\u5C31\u7EEA\uFF1A${a.name}
|
|
109
109
|
`),onDeviceDetach:()=>process.stdout.write(`
|
|
@@ -111,23 +111,23 @@ ${t.yellow}\u25CB${t.reset} \u624B\u673A\u5DF2\u65AD\u5F00
|
|
|
111
111
|
`),onLog:a=>process.stdout.write(`${t.gray}[${a.device}]${t.reset} ${a.text}
|
|
112
112
|
`)});try{await o.connectAutoJs6(s,i)}catch(a){j(a instanceof Error?a.message:String(a));return}if(process.stdout.write(`
|
|
113
113
|
${t.bold}\u6B63\u5728\u8FDE\u63A5\u624B\u673A${t.reset} ${t.brightGreen}${s}:${i}${t.reset}${t.gray}\uFF08AutoJs6 \u670D\u52A1\u5668\u6A21\u5F0F\uFF09${t.reset}
|
|
114
|
-
`),await
|
|
114
|
+
`),await ja(o,6e3))process.stdout.write(`${t.green}\u2713${t.reset} \u5DF2\u8FDE\u63A5\u3002\u53EF\u4EE5\u63A8\u9001\u811A\u672C\u4E86\uFF1A${t.gray}xzh device run <\u811A\u672C>${t.reset}
|
|
115
115
|
|
|
116
116
|
`);else{let a=o.status().autojs6?.retrying??!1;if(process.stdout.write(a?`${t.yellow}\u6682\u65F6\u6CA1\u8FDE\u4E0A${t.reset}${t.gray}\uFF0C\u4ECD\u5728\u540E\u53F0\u6309\u9000\u907F\u91CD\u8BD5\u3002${t.reset}
|
|
117
117
|
|
|
118
118
|
`:`${t.red}\u8FDE\u4E0D\u4E0A\u624B\u673A${t.reset}${t.gray}\uFF08\u5DF2\u505C\u6B62\u91CD\u8BD5\uFF09\u3002${t.reset}
|
|
119
119
|
|
|
120
|
-
`),
|
|
120
|
+
`),an({where:e?"phone":"pc",address:`${s}:${i}`}),!a){await o.stop(),process.exitCode=1;return}process.stdout.write(`
|
|
121
121
|
${t.gray}\uFF08Ctrl+C \u9000\u51FA\uFF09${t.reset}
|
|
122
122
|
|
|
123
|
-
`)}await
|
|
123
|
+
`)}await Ys(()=>o.stop())}async function Oa(n){an({where:nt()?"phone":"pc"})}async function La(n){let e=new re(n.port),r=await e.devices();if(!r){j(`\u8FDE\u4E0D\u4E0A\u8BBE\u5907\u6865\uFF08127.0.0.1:${n.port}\uFF09`,"\u5148\u542F\u52A8\uFF1Axzh device serve");return}if(r.length===0){j("\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u624B\u673A","\u5148\u8BA9\u624B\u673A\u8FDE\u4E0A\uFF1A\u624B\u673A AutoJs6\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u5BA2\u6237\u7AEF\u6A21\u5F0F\u300D");return}process.stdout.write(`
|
|
124
124
|
${t.gray}\u6B63\u5728\u8BA9\u624B\u673A\u622A\u56FE\u2026\uFF08\u4F1A\u5F39\u7CFB\u7EDF\u6388\u6743\u6846\uFF0C\u811A\u672C\u4F1A\u81EA\u52A8\u70B9\u300C\u7ACB\u5373\u5F00\u59CB\u300D\uFF09${t.reset}
|
|
125
|
-
`);let s=await e.screenshot();if(!s.ok){j(s.message);return}let i=n.positional.find(o=>!o.startsWith("-"))??
|
|
125
|
+
`);let s=await e.screenshot();if(!s.ok){j(s.message);return}let i=n.positional.find(o=>!o.startsWith("-"))??ln.join(process.cwd(),`xzh-shot-${new Date().toISOString().replace(/[:.]/g,"-")}.jpg`);try{st.writeFileSync(i,s.data)}catch(o){j(`\u4FDD\u5B58\u622A\u56FE\u5931\u8D25\uFF1A${o instanceof Error?o.message:String(o)}`);return}process.stdout.write(`${t.green}\u2713 \u5DF2\u4FDD\u5B58${t.reset} ${i} ${t.gray}\uFF08${Math.round(s.data.length/1024)} KB\uFF0CJPEG\uFF09${t.reset}
|
|
126
126
|
|
|
127
|
-
`)}async function
|
|
128
|
-
`),"utf8");let i=(await e.logs(1))?.length??0,o=await e.exec("run",s);if(!o.ok){
|
|
127
|
+
`)}async function Na(n){let e=new re(n.port),r=await e.devices();if(!r){j(`\u8FDE\u4E0D\u4E0A\u8BBE\u5907\u6865\uFF08127.0.0.1:${n.port}\uFF09`,"\u5148\u542F\u52A8\uFF1Axzh device serve");return}if(r.length===0){j("\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u624B\u673A","\u5148\u8BA9\u624B\u673A\u8FDE\u4E0A\uFF1A\u624B\u673A AutoJs6\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u5BA2\u6237\u7AEF\u6A21\u5F0F\u300D");return}let s=ln.join(Xs.tmpdir(),`xzh-device-check-${Date.now()}.js`);st.writeFileSync(s,["// \u7531 xzh device check \u751F\u6210\uFF1A\u63A2\u6D4B\u65E0\u969C\u788D\u670D\u52A1\u4E0E\u8BBE\u5907\u4FE1\u606F","try {"," auto.waitFor(8000);"," if (!auto.isRunning()) {",' toastLog("\u3010\u4F53\u68C0\u3011\u65E0\u969C\u788D=\u672A\u5C31\u7EEA\uFF08\u670D\u52A1\u6CA1\u771F\u6B63\u8FD0\u884C\uFF09");'," } else {",' toastLog("\u3010\u4F53\u68C0\u3011\u65E0\u969C\u788D=\u5DF2\u5C31\u7EEA");',' toastLog("\u3010\u4F53\u68C0\u3011\u8BBE\u5907=" + device.brand + " " + device.model + " " + device.width + "x" + device.height);',' toastLog("\u3010\u4F53\u68C0\u3011\u5F53\u524D\u754C\u9762=" + currentPackage() + " / " + currentActivity());',' toastLog("\u3010\u4F53\u68C0\u3011\u7ED3\u8BBA=\u53EF\u4EE5\u64CD\u4F5C\u624B\u673A");'," }","} catch (e) {",' toastLog("\u3010\u4F53\u68C0\u3011\u65E0\u969C\u788D=\u5F02\u5E38\uFF1A" + e);',"}",""].join(`
|
|
128
|
+
`),"utf8");let i=(await e.logs(1))?.length??0,o=await e.exec("run",s);if(!o.ok){st.rmSync(s,{force:!0}),j(o.message??"\u4F53\u68C0\u811A\u672C\u672A\u80FD\u9001\u8FBE");return}process.stdout.write(`
|
|
129
129
|
${t.gray}\u5DF2\u5728\u624B\u673A\u4E0A\u8FD0\u884C\u4F53\u68C0\u811A\u672C\uFF0C\u7B49\u5F85\u56DE\u62A5\u2026\uFF08\u6700\u591A 15 \u79D2\uFF09${t.reset}
|
|
130
|
-
`);let a=Date.now()+15e3,l=[];for(;Date.now()<a&&(l=(await e.logs(40)??[]).map(u=>u.text).filter(u=>u.includes("\u3010\u4F53\u68C0\u3011")),!l.some(u=>u.includes("\u7ED3\u8BBA=")||u.includes("\u5F02\u5E38")||u.includes("\u672A\u5C31\u7EEA")));)await new Promise(u=>setTimeout(u,800));if(
|
|
130
|
+
`);let a=Date.now()+15e3,l=[];for(;Date.now()<a&&(l=(await e.logs(40)??[]).map(u=>u.text).filter(u=>u.includes("\u3010\u4F53\u68C0\u3011")),!l.some(u=>u.includes("\u7ED3\u8BBA=")||u.includes("\u5F02\u5E38")||u.includes("\u672A\u5C31\u7EEA")));)await new Promise(u=>setTimeout(u,800));if(st.rmSync(s,{force:!0}),l.some(c=>c.includes("\u7ED3\u8BBA=\u53EF\u4EE5\u64CD\u4F5C\u624B\u673A"))){process.stdout.write(`${t.green}\u2713 \u53EF\u4EE5\u64CD\u4F5C\u624B\u673A${t.reset}
|
|
131
131
|
`);for(let c of l)process.stdout.write(`${t.gray} ${c.replace("\u3010\u4F53\u68C0\u3011","")}${t.reset}
|
|
132
132
|
`);process.stdout.write(`${t.gray} \u63A5\u4E0B\u6765\u53EF\u4EE5\u76F4\u63A5\u8BA9\u7384\u732A\u64CD\u4F5C\u624B\u673A\uFF08\u5B83\u4F1A\u5148\u52A0\u8F7D autojs6 \u6280\u80FD\uFF09\u3002${t.reset}
|
|
133
133
|
|
|
@@ -141,15 +141,15 @@ ${t.bold}\u5904\u7406\u529E\u6CD5${t.reset}
|
|
|
141
141
|
3. \u82E5\u811A\u672C\u8FD8\u6302\u7740\uFF0C\u5148\u6536\u6389\u5B83\uFF1A${t.reset}xzh device stop
|
|
142
142
|
${t.gray} \u8BF4\u660E\uFF1A\u6CA1\u6709\u65E0\u969C\u788D\u670D\u52A1\uFF0Cxzh \u53EA\u80FD\u63A8\u9001\u811A\u672C\uFF0C\u65E0\u6CD5\u70B9\u51FB/\u6ED1\u52A8/\u8BFB\u53D6\u754C\u9762\u3002${t.reset}
|
|
143
143
|
|
|
144
|
-
`),process.exitCode=1}function
|
|
144
|
+
`),process.exitCode=1}function an(n){let e=Jt(),r=Ht({where:n.where,abi:e.abi,address:n.address,localApk:Kt(e.abi)});process.stdout.write(`
|
|
145
145
|
${t.bold}${t.yellow}\u9700\u8981\u5148\u88C5 AutoJs6${t.reset}${t.gray}\uFF08${e.detail}\uFF09${t.reset}
|
|
146
146
|
|
|
147
147
|
`);for(let s of r.split(`
|
|
148
148
|
`))process.stdout.write(`${s?`${t.gray}${s}${t.reset}`:""}
|
|
149
149
|
`);process.stdout.write(`
|
|
150
|
-
`)}async function
|
|
150
|
+
`)}async function ja(n,e){let r=Date.now()+e;for(;Date.now()<r;){if(n.status().autojs6?.connected)return!0;await new Promise(s=>setTimeout(s,200))}return n.status().autojs6?.connected??!1}function Ys(n){return new Promise(e=>{let r=!1,s=()=>{r||(r=!0,process.stdout.write(`
|
|
151
151
|
${t.gray}\u6B63\u5728\u505C\u6B62\u8BBE\u5907\u6865\u2026${t.reset}
|
|
152
|
-
`),n().finally(()=>e()))};process.once("SIGINT",s),process.once("SIGTERM",s)})}async function
|
|
152
|
+
`),n().finally(()=>e()))};process.once("SIGINT",s),process.once("SIGTERM",s)})}async function Ba(n){let r=await new re(n.port).status();if(!r){process.stdout.write(`${t.yellow}\u8BBE\u5907\u6865\u672A\u8FD0\u884C${t.reset}${t.gray}\uFF08127.0.0.1:${n.port}\uFF09${t.reset}
|
|
153
153
|
${t.gray}\u542F\u52A8\uFF1Axzh device serve${t.reset}
|
|
154
154
|
`),process.exitCode=1;return}process.stdout.write(`
|
|
155
155
|
${t.green}\u25CF${t.reset} \u8BBE\u5907\u6865\u8FD0\u884C\u4E2D
|
|
@@ -163,7 +163,7 @@ ${t.green}\u25CF${t.reset} \u8BBE\u5907\u6865\u8FD0\u884C\u4E2D
|
|
|
163
163
|
`)),process.stdout.write(` ${t.gray}\u5DF2\u8FDE\u63A5\u8BBE\u5907\uFF1A${t.reset}${r.devices.length}
|
|
164
164
|
`);for(let s of r.devices){let i=s.kind==="autojs6"?"AutoJs6":"AutoX.js";process.stdout.write(` ${t.cyan}${s.name}${t.reset} ${t.gray}${s.id} \xB7 ${i}${s.appVersionCode?` versionCode ${s.appVersionCode}`:""}${t.reset}
|
|
165
165
|
`)}process.stdout.write(`
|
|
166
|
-
`)}async function
|
|
166
|
+
`)}async function Ua(n){let e=new re(n.port),r=await e.devices();if(!r){j(`\u8FDE\u4E0D\u4E0A\u8BBE\u5907\u6865\uFF08127.0.0.1:${n.port}\uFF09`,"\u5148\u542F\u52A8\uFF1Axzh device serve");return}if(r.length===0){let s=await e.status();process.stdout.write(`${t.yellow}\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u8BBE\u5907${t.reset}
|
|
167
167
|
`),s?.autojs6Listener&&process.stdout.write(`${t.gray}\u624B\u673A AutoJs6\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u5BA2\u6237\u7AEF\u6A21\u5F0F\u300D\u586B\uFF1A${t.reset}${s.autojs6Listener.urls.join(" \u6216 ")}
|
|
168
168
|
`),s?.urls.length&&process.stdout.write(`${t.gray}\u624B\u673A AutoX.js \u586B\uFF1A${t.reset}${s.urls.join(" \u6216 ")}
|
|
169
169
|
`),s?.autojs6&&process.stdout.write(`${t.gray}AutoJs6 \u51FA\u7AD9\u8FDE\u63A5\uFF1A${t.reset}${s.autojs6.address} `+(s.autojs6.retrying?"\uFF08\u8FDE\u63A5\u4E2D/\u7B49\u5F85\u91CD\u8BD5\uFF09":"\uFF08\u5DF2\u653E\u5F03\u91CD\u8BD5\uFF09")+`
|
|
@@ -171,16 +171,16 @@ ${t.green}\u25CF${t.reset} \u8BBE\u5907\u6865\u8FD0\u884C\u4E2D
|
|
|
171
171
|
${t.bold}\u5DF2\u8FDE\u63A5\u8BBE\u5907\uFF08${r.length}\uFF09${t.reset}
|
|
172
172
|
`);for(let s of r){let i=s.kind==="autojs6"?"AutoJs6":"AutoX.js";process.stdout.write(` ${t.cyan}${s.name}${t.reset} ${t.gray}${s.id} \xB7 ${i}${s.appVersionCode?` versionCode ${s.appVersionCode}`:""}${t.reset}
|
|
173
173
|
`)}process.stdout.write(`
|
|
174
|
-
`)}async function
|
|
174
|
+
`)}async function Ws(n,e){let r=n.positional[0];if(!r){j(`\u7528\u6CD5\uFF1Axzh device ${n.sub} <\u811A\u672C\u6587\u4EF6>`);return}let i=await new re(n.port).exec(e,r,n.device);if(!i.ok){j(i.message??"\u6307\u4EE4\u5931\u8D25");return}let o=e==="run"?"\u5DF2\u63A8\u9001\u5230\u8BBE\u5907\u5E76\u5F00\u59CB\u8FD0\u884C":"\u5DF2\u4FDD\u5B58\u5230\u8BBE\u5907";process.stdout.write(`${t.green}\u2713${t.reset} ${o}\uFF1A${i.path}
|
|
175
175
|
${t.gray} \u76EE\u6807\u8BBE\u5907\uFF08${i.delivered}\uFF09\uFF1A${(i.devices??[]).join("\u3001")}${t.reset}
|
|
176
176
|
`+(e==="run"?`${t.gray} \u67E5\u770B\u8F93\u51FA\uFF1Axzh device logs${t.reset}
|
|
177
|
-
`:""))}async function
|
|
178
|
-
`)}async function
|
|
177
|
+
`:""))}async function Fa(n){let e=new re(n.port),r=n.all?void 0:n.positional[0],s=await e.exec(r?"stop":"stopAll",r,n.device);if(!s.ok){j(s.message??"\u505C\u6B62\u5931\u8D25");return}process.stdout.write(`${t.green}\u2713${t.reset} ${r?`\u5DF2\u505C\u6B62 ${r}`:"\u5DF2\u505C\u6B62\u5168\u90E8\u811A\u672C"}
|
|
178
|
+
`)}async function za(n){let r=await new re(n.port).logs(n.limit);if(!r){j(`\u8FDE\u4E0D\u4E0A\u8BBE\u5907\u6865\uFF08127.0.0.1:${n.port}\uFF09`,"\u5148\u542F\u52A8\uFF1Axzh device serve");return}if(r.length===0){process.stdout.write(`${t.gray}\u6682\u65E0\u8BBE\u5907\u65E5\u5FD7\u3002${t.reset}
|
|
179
179
|
`);return}process.stdout.write(`
|
|
180
180
|
${t.bold}\u6700\u8FD1 ${r.length} \u6761\u8BBE\u5907\u65E5\u5FD7${t.reset}
|
|
181
181
|
`);for(let s of r){let i=new Date(s.at).toLocaleTimeString();process.stdout.write(`${t.gray}${i} [${s.device}]${t.reset} ${s.text}
|
|
182
182
|
`)}process.stdout.write(`
|
|
183
|
-
`)}function
|
|
183
|
+
`)}function Ja(){process.stdout.write(`
|
|
184
184
|
${t.bold}xzh device${t.reset} ${t.gray}\u2014\u2014 \u4E0E\u624B\u673A\u4E0A\u7684 AutoX.js / Auto.js \u901A\u4FE1\uFF08\u8BBE\u5907\u6865\uFF09${t.reset}
|
|
185
185
|
|
|
186
186
|
${t.bold}\u7528\u6CD5${t.reset}
|
|
@@ -203,7 +203,7 @@ ${t.bold}\u7528\u6CD5${t.reset}
|
|
|
203
203
|
\u67E5\u770B\u6700\u8FD1\u7684\u8BBE\u5907\u65E5\u5FD7
|
|
204
204
|
|
|
205
205
|
${t.bold}\u901A\u7528\u53C2\u6570${t.reset}
|
|
206
|
-
${t.gray}--port <\u7AEF\u53E3>${t.reset} \u9ED8\u8BA4 ${
|
|
206
|
+
${t.gray}--port <\u7AEF\u53E3>${t.reset} \u9ED8\u8BA4 ${Ee}\uFF08\u4E5F\u53EF\u7528\u73AF\u5883\u53D8\u91CF XZH_DEVICE_PORT\uFF09
|
|
207
207
|
${t.gray}--device <\u540D\u79F0>${t.reset} \u53EA\u5BF9\u67D0\u53F0\u8BBE\u5907\u4E0B\u53D1\u6307\u4EE4\uFF08\u9ED8\u8BA4\u5168\u90E8\uFF09
|
|
208
208
|
|
|
209
209
|
${t.bold}\u4E24\u79CD\u8FDE\u63A5\u65B9\u5F0F${t.reset}
|
|
@@ -212,19 +212,19 @@ ${t.bold}\u4E24\u79CD\u8FDE\u63A5\u65B9\u5F0F${t.reset}
|
|
|
212
212
|
\xB7 ${t.green}AutoX.js${t.reset}\uFF1Axzh device serve \u4E4B\u540E\uFF0C\u624B\u673A\u7AEF\u586B\u5B83\u6253\u5370\u7684 ws:// \u5730\u5740\u3002
|
|
213
213
|
|
|
214
214
|
${t.bold}\u6CE8\u610F${t.reset}
|
|
215
|
-
\xB7 serve \u4F1A\u5360\u7528 ${
|
|
215
|
+
\xB7 serve \u4F1A\u5360\u7528 ${Ee} \u7AEF\u53E3\uFF1A${t.yellow}VSCode \u7684 Auto.js \u63D2\u4EF6\u7528\u540C\u4E00\u4E2A\u7AEF\u53E3\uFF0C\u4E24\u8005\u4E0D\u80FD\u540C\u65F6\u5F00${t.reset}\u3002
|
|
216
216
|
\xB7 \u53EA\u505A\u5355\u6587\u4EF6\u63A8\u9001\uFF08\u8FD0\u884C / \u4FDD\u5B58 / \u505C\u6B62 / \u65E5\u5FD7\uFF09\uFF0C\u9879\u76EE\u7EA7\uFF08zip\uFF09\u540C\u6B65\u8BF7\u7528 VSCode \u63D2\u4EF6\u3002
|
|
217
|
-
\xB7 \u7384\u732A\u4E0D\u6253\u5305 AutoJs6 \u5B89\u88C5\u5305\uFF08\u6BCF\u4E2A ABI \u7EA6 130 MB\uFF09\uFF0C\u7531 ${t.reset}${
|
|
217
|
+
\xB7 \u7384\u732A\u4E0D\u6253\u5305 AutoJs6 \u5B89\u88C5\u5305\uFF08\u6BCF\u4E2A ABI \u7EA6 130 MB\uFF09\uFF0C\u7531 ${t.reset}${sn}${t.gray} \u81EA\u884C\u4E0B\u8F7D\u3002
|
|
218
218
|
\xB7 \u5728 xzh \u754C\u9762\u5185\u4E5F\u53EF\u4EE5\u64CD\u4F5C\uFF1A${t.green}/device${t.reset}\uFF08\u89C1 /help\uFF09\u3002
|
|
219
|
-
`)}var
|
|
219
|
+
`)}var Ka=new Set(["--port","--device","-n","--limit"]),Ha=new Set(["--all","-h","--help"]);function qa(n){let e={sub:void 0,positional:[],port:Me(),limit:50,all:!1},r=[...n];for(e.sub=r.shift();r.length>0;){let s=r.shift();if(Ha.has(s)){s==="--all"?e.all=!0:e.positional.push(s);continue}if(s==="--"){e.positional.push(...r);break}let i=/^(--[a-z-]+)=(.*)$/.exec(s);if(i){if(Gs(e,i[1],i[2]),e.error)return e;continue}if(Ka.has(s)){let o=r.shift();if(o===void 0)return{...e,error:`${s} \u7F3A\u5C11\u53D6\u503C`};if(Gs(e,s,o),e.error)return e;continue}if(s.startsWith("-")&&s!=="-")return{...e,error:`\u672A\u77E5\u53C2\u6570\uFF1A${s}`};e.positional.push(s)}return e}function Gs(n,e,r){switch(e){case"--port":{let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<1||s>65535){n.error=`\u7AEF\u53E3\u4E0D\u5408\u6CD5\uFF1A${r}`;return}n.port=s;return}case"--device":n.device=r;return;case"-n":case"--limit":{let s=Number.parseInt(r,10);if(!Number.isFinite(s)||s<1){n.error=`\u6761\u6570\u4E0D\u5408\u6CD5\uFF1A${r}`;return}n.limit=s;return}default:n.error=`\u672A\u77E5\u53C2\u6570\uFF1A${e}`}}function j(n,e){process.stdout.write(`${t.red}\u2717 ${n}${t.reset}
|
|
220
220
|
`),e&&process.stdout.write(`${t.gray} ${e}${t.reset}
|
|
221
|
-
`),process.exitCode=1}var pe=v(require("fs")),Oe=v(require("path"));var
|
|
222
|
-
`)}catch{}return i}function
|
|
221
|
+
`),process.exitCode=1}var pe=v(require("fs")),Oe=v(require("path"));var Zs=v(require("crypto")),V=v(require("fs")),ue=v(require("path"));function Wa(){return ue.join(T(),"sessions")}function Qs(n){let e=Zs.createHash("sha1").update(ue.resolve(n)).digest("hex").slice(0,10),r=ue.basename(n)||"project";return ue.join(Wa(),`${r}-${e}`)}function bt(n,e){let r=Qs(n);Z(r);let s=new Date().toISOString().replace(/[:.]/g,"-"),i=ue.join(r,`${s}.jsonl`);for(let o=2;V.existsSync(i);o++)i=ue.join(r,`${s}-${o}.jsonl`);try{V.writeFileSync(i,`${JSON.stringify({type:"meta",cwd:ue.resolve(n),version:e,startedAt:new Date().toISOString()})}
|
|
222
|
+
`)}catch{}return i}function cn(n,e){if(e.length!==0)try{let r=e.map(s=>{let i=s.images&&s.images.length>0?{...s,images:void 0,content:`${s.content??""}
|
|
223
223
|
|
|
224
224
|
[\u56FE\u7247\u5DF2\u7701\u7565\uFF1A\u4F1A\u8BDD\u6587\u4EF6\u4E0D\u4FDD\u5B58\u56FE\u7247]`}:s;return`${JSON.stringify({type:"message",message:i})}
|
|
225
|
-
`});V.appendFileSync(n,r.join(""))}catch{}}function
|
|
226
|
-
`)[0]??"";try{a=JSON.parse(l).startedAt??null}catch{}s.push({file:o,startedAt:a,bytes:V.statSync(o).size})}catch{}}return s}function
|
|
227
|
-
`))if(r.trim())try{let s=JSON.parse(r);s.type==="message"&&s.message?.role&&e.push(s.message)}catch{}}catch{}return e}var
|
|
225
|
+
`});V.appendFileSync(n,r.join(""))}catch{}}function un(n){let e=Qs(n),r;try{r=V.readdirSync(e).filter(i=>i.endsWith(".jsonl")).sort().reverse()}catch{return[]}let s=[];for(let i of r){let o=ue.join(e,i);try{let a=null,l=V.readFileSync(o,"utf8").split(`
|
|
226
|
+
`)[0]??"";try{a=JSON.parse(l).startedAt??null}catch{}s.push({file:o,startedAt:a,bytes:V.statSync(o).size})}catch{}}return s}function dn(n){let e=[];try{for(let r of V.readFileSync(n,"utf8").split(`
|
|
227
|
+
`))if(r.trim())try{let s=JSON.parse(r);s.type==="message"&&s.message?.role&&e.push(s.message)}catch{}}catch{}return e}var ei={name:"code-explorer",description:'Fast subagent specialized in codebase exploration. Use it whenever the task requires searching across multiple files, directories, or patterns, or when the scope of code exploration is too large for a single read_file or grep call. When calling it, state the desired thoroughness level in the prompt: "quick" for a basic lookup, "medium" for moderate exploration, or "very thorough" for comprehensive analysis across multiple locations and naming conventions. \u5B83\u662F**\u53EA\u8BFB**\u5B50\u4EE3\u7406\uFF1A\u53EA\u56DE\u62A5\u53D1\u73B0\u4E0E\u8BC1\u636E\uFF0C\u4E0D\u4F1A\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6\uFF1B\u9700\u8981\u5B9E\u9645\u6539\u4EE3\u7801\u65F6\u4E0D\u8981\u6D3E\u5B83\uFF0C\u81EA\u5DF1\u52A8\u624B\u3002',toolNames:["read_file","list_dir","glob","grep","list_skills","load_skill"],systemPrompt({cwd:n,description:e,prompt:r}){return`\u4F60\u662F\u300C\u7384\u732A\u300D\u6D3E\u51FA\u7684 **code-explorer\uFF08\u4EE3\u7801\u5E93\u63A2\u7D22\uFF09\u5B50\u4EE3\u7406**\uFF0C\u53EA\u505A\u8C03\u7814\u5E76\u56DE\u62A5\u53D1\u73B0\u3002
|
|
228
228
|
|
|
229
229
|
\u5DE5\u4F5C\u76EE\u5F55\uFF1A${n}
|
|
230
230
|
\u5B50\u4EFB\u52A1\uFF1A${e}
|
|
@@ -251,7 +251,7 @@ ${t.bold}\u6CE8\u610F${t.reset}
|
|
|
251
251
|
- **\u98CE\u9669\u6216\u5F85\u786E\u8BA4\u9879**\uFF1A\u5982\u6709\u3002
|
|
252
252
|
|
|
253
253
|
## \u4EFB\u52A1\u63CF\u8FF0
|
|
254
|
-
${r.trim()}`}};var
|
|
254
|
+
${r.trim()}`}};var ti={name:"test-runner",description:"Run the project's tests (full suite or specific files) and report a verified pass/fail summary: failing cases, causes with exact file:line references, and the exact commands to reproduce. Use it whenever test output would be long, when you need to know whether the suite passes after your changes, or when you want failures triaged (assertion vs environment vs code bug) without reading raw logs yourself. \u5B83\u662F**\u53EA\u8FD0\u884C\u3001\u4E0D\u4FEE\u6539**\u7684\u5B50\u4EE3\u7406\uFF1A\u4E0D\u6539\u4EE3\u7801\u3001\u4E0D\u88C5\u4F9D\u8D56\u3001\u4E0D\u505A git \u5199\u64CD\u4F5C\uFF1B\u9700\u8981\u6839\u636E\u5931\u8D25\u4FEE\u6539\u4EE3\u7801\u65F6\u4E0D\u8981\u6D3E\u5B83\uFF0C\u81EA\u5DF1\u52A8\u624B\u3002\u5728 prompt \u91CC\u5199\u6E05\u695A\u8981\u8DD1\u54EA\u4E9B\u6D4B\u8BD5\uFF08\u5168\u90E8\u8FD8\u662F\u6307\u5B9A\u6587\u4EF6\uFF09\u4E0E\u4F60\u5DF2\u77E5\u7684\u6D4B\u8BD5\u547D\u4EE4\uFF08\u5982\u679C\u6709\u7684\u8BDD\uFF09\u3002",toolNames:["bash","read_file","glob","grep","list_dir"],systemPrompt({cwd:n,description:e,prompt:r}){return`\u4F60\u662F\u300C\u7384\u732A\u300D\u6D3E\u51FA\u7684 **test-runner\uFF08\u6D4B\u8BD5\u8FD0\u884C\uFF09\u5B50\u4EE3\u7406**\uFF0C\u53EA\u8D1F\u8D23\u8FD0\u884C\u6D4B\u8BD5\u3001\u89E3\u8BFB\u7ED3\u679C\u5E76\u6C47\u62A5\u3002
|
|
255
255
|
|
|
256
256
|
\u5DE5\u4F5C\u76EE\u5F55\uFF1A${n}
|
|
257
257
|
\u5B50\u4EFB\u52A1\uFF1A${e}
|
|
@@ -280,8 +280,8 @@ ${r.trim()}`}};var ei={name:"test-runner",description:"Run the project's tests (
|
|
|
280
280
|
- **\u5EFA\u8BAE\u4E0B\u4E00\u6B65**\uFF1A\u7B80\u77ED\u6307\u65B9\u5411\uFF08\u8BE5\u770B\u54EA\u4E2A\u6587\u4EF6\uFF09\uFF0C**\u4E0D\u8981\u81EA\u5DF1\u52A8\u624B\u4FEE**\u3002
|
|
281
281
|
|
|
282
282
|
## \u4EFB\u52A1\u63CF\u8FF0
|
|
283
|
-
${r.trim()}`}};var
|
|
284
|
-
`),
|
|
283
|
+
${r.trim()}`}};var it=[ei,ti],pn=it[0].name;function xt(){return it.map(n=>n.name)}function Wt(n){let e=n?.trim();return e?it.find(r=>r.name===e):it.find(r=>r.name===pn)}var Ga=it.map(n=>`- ${n.name}: ${n.description}`).join(`
|
|
284
|
+
`),ri={name:"task",description:`\u6D3E\u751F\u4E00\u4E2A**\u5B50\u4EE3\u7406**\u53BB\u72EC\u7ACB\u5B8C\u6210\u4E00\u4EF6\u5B50\u4EFB\u52A1\uFF0C\u53EA\u628A\u6700\u7EC8\u7ED3\u8BBA\u8FD4\u56DE\u7ED9\u4F60\uFF08\u4E2D\u95F4\u8FC7\u7A0B\u4E0D\u8FDB\u4F60\u7684\u4E0A\u4E0B\u6587\uFF09\u3002
|
|
285
285
|
|
|
286
286
|
**\u4EC0\u4E48\u65F6\u5019\u8BE5\u7528\u5B83**\uFF08\u6EE1\u8DB3\u4EFB\u4E00\u6761\u5C31\u8BE5\u7528\uFF0C\u4E0D\u8981\u56E0\u4E3A\u300C\u81EA\u5DF1\u505A\u66F4\u7701\u4E8B\u300D\u800C\u7565\u8FC7\uFF09\uFF1A
|
|
287
287
|
\xB7 \u4E00\u4EF6\u5B50\u4EFB\u52A1\u9884\u8BA1\u8981\u8BFB **3 \u4E2A\u4EE5\u4E0A\u6587\u4EF6**\uFF1B
|
|
@@ -293,59 +293,59 @@ ${r.trim()}`}};var st=[Qs,ei],hn=st[0].name;function xt(){return st.map(n=>n.nam
|
|
|
293
293
|
**prompt \u5FC5\u987B\u81EA\u5305\u542B**\uFF08\u5B50\u4EE3\u7406\u770B\u4E0D\u5230\u6211\u4EEC\u7684\u5BF9\u8BDD\u5386\u53F2\uFF09\uFF1A\u80CC\u666F\u3001\u76EE\u6807\u3001\u5DF2\u77E5\u7EBF\u7D22\u3001\u671F\u671B\u7684\u8F93\u51FA\u683C\u5F0F\u4E0E\u8FB9\u754C\uFF08\u54EA\u4E9B\u4E8B\u4E0D\u8981\u505A\uFF09\u3002
|
|
294
294
|
|
|
295
295
|
\u53EF\u7528\u5B50\u4EE3\u7406\uFF1A
|
|
296
|
-
${
|
|
296
|
+
${Ga}
|
|
297
297
|
|
|
298
|
-
\u5B50\u4EE3\u7406\u4E0D\u4F1A\u5199\u5165\u9879\u76EE\u8BB0\u5FC6 \u2014\u2014 \u8BB0\u5FC6\u7531\u4F60\u6839\u636E\u5B83\u7684\u7ED3\u8BBA\u7EDF\u4E00\u8BB0\u5F55\u3002`,parallelSafe:!0,parameters:{type:"object",properties:{subagent_name:{type:"string",enum:xt(),description:`\u8981\u6D3E\u751F\u7684\u5B50\u4EE3\u7406\u540D\u79F0\uFF0C\u9ED8\u8BA4 ${
|
|
298
|
+
\u5B50\u4EE3\u7406\u4E0D\u4F1A\u5199\u5165\u9879\u76EE\u8BB0\u5FC6 \u2014\u2014 \u8BB0\u5FC6\u7531\u4F60\u6839\u636E\u5B83\u7684\u7ED3\u8BBA\u7EDF\u4E00\u8BB0\u5F55\u3002`,parallelSafe:!0,parameters:{type:"object",properties:{subagent_name:{type:"string",enum:xt(),description:`\u8981\u6D3E\u751F\u7684\u5B50\u4EE3\u7406\u540D\u79F0\uFF0C\u9ED8\u8BA4 ${pn}\u3002`},description:{type:"string",description:"\u5B50\u4EFB\u52A1\u7684\u4E00\u53E5\u8BDD\u8BF4\u660E\uFF083-5 \u4E2A\u8BCD\uFF09\uFF0C\u7528\u4E8E\u754C\u9762\u663E\u793A\u4E0E\u7ED3\u679C\u6458\u8981"},prompt:{type:"string",description:"\u4EA4\u7ED9\u5B50\u4EE3\u7406\u7684\u5B8C\u6574\u4EFB\u52A1\u63CF\u8FF0\u3002\u5B50\u4EE3\u7406\u770B\u4E0D\u5230\u5F53\u524D\u5BF9\u8BDD\uFF0C\u5FC5\u987B\u81EA\u5305\u542B\uFF1A\u80CC\u666F\u3001\u76EE\u6807\u3001\u5DF2\u77E5\u7EBF\u7D22\u3001\u8981\u4EA7\u51FA\u7684\u7ED3\u8BBA\u4E0E\u683C\u5F0F\u3001\u4E0D\u8981\u505A\u4EC0\u4E48\u3002"}},required:["description","prompt"]},async execute(n,e){if(!e.spawnAgent)return{ok:!1,content:"\u9519\u8BEF\uFF1A\u5F53\u524D\u73AF\u5883\u4E0D\u652F\u6301\u6D3E\u751F\u5B50\u4EE3\u7406\u3002"};let r=typeof n.description=="string"?n.description.trim():"",s=typeof n.prompt=="string"?n.prompt.trim():"";if(!r||!s)return{ok:!1,content:"\u9519\u8BEF\uFF1Adescription \u4E0E prompt \u5747\u4E0D\u80FD\u4E3A\u7A7A\u3002"};let i=typeof n.subagent_name=="string"?n.subagent_name.trim():"";if(i&&!Wt(i))return{ok:!1,content:`\u9519\u8BEF\uFF1A\u672A\u77E5\u5B50\u4EE3\u7406 "${i}"\u3002\u53EF\u7528\uFF1A${xt().join("\u3001")}`};try{return await e.spawnAgent({subagentName:i||void 0,description:r,prompt:s})}catch(o){return{ok:!1,content:`\u5B50\u4EE3\u7406\u6267\u884C\u5931\u8D25\uFF1A${o instanceof Error?o.message:String(o)}`}}}};var ni=require("child_process"),Gt=v(require("path"));var ot=3e4,Xa=12e4,Va=6e5,Ya=1500,Za=`[\u8F93\u51FA\u88AB\u622A\u65AD] \u5355\u6761\u547D\u4EE4\u7684\u6355\u83B7\u4E0A\u9650\u4E3A ${ot} \u5B57\u7B26\uFF0C**\u8D85\u51FA\u90E8\u5206\u5DF2\u4E22\u5F03** \u2014\u2014 \u4E0B\u9762\u7684\u5185\u5BB9\u5E76\u4E0D\u5B8C\u6574\uFF08\u7ED3\u5C3E\u7684\u62A5\u9519\u4E5F\u53EF\u80FD\u5728\u91CC\u9762\uFF09\u3002\u9700\u8981\u5B8C\u6574\u5185\u5BB9\u65F6\u8BF7\u628A\u547D\u4EE4\u62C6\u5C0F\uFF0C\u6216\u5148\u91CD\u5B9A\u5411\u5230\u6587\u4EF6\u518D\u7528 read_file / grep \u5B9A\u4F4D\u3002`;function Qa(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,truncated:!1});return}let o=process.platform==="win32",a=o?"cmd.exe":process.env.SHELL||"bash",c=(0,ni.spawn)(a,o?["/d","/s","/c",n]:["-lc",n],{cwd:e,env:process.env,windowsHide:!0,detached:!o}),u="",p="",d=!1,h=!1,m=!1,f=!1,y,g=x=>{let P=c.pid;if(P!==void 0)try{process.kill(-P,x)}catch{try{c.kill(x)}catch{}}},S=x=>{m||(m=!0,clearTimeout(H),y&&clearTimeout(y),s?.removeEventListener("abort",A),i({stdout:u,stderr:p,code:x,timedOut:d,aborted:h,truncated:f}))},$=()=>{y&&clearTimeout(y),y=setTimeout(()=>S(null),Ya)},A=()=>{h=!0,g("SIGKILL"),$()},H=setTimeout(()=>{d=!0,g("SIGKILL"),$()},r);s?.addEventListener("abort",A,{once:!0}),c.stdout?.on("data",x=>{if(u.length>=ot){f=!0;return}u+=x.toString(),u.length>=ot&&(f=!0)}),c.stderr?.on("data",x=>{if(p.length>=ot){f=!0;return}p+=x.toString(),p.length>=ot&&(f=!0)}),c.on("error",x=>{p+=String(x),S(-1)}),c.on("exit",x=>{y&&clearTimeout(y),y=setTimeout(()=>S(x),120)}),c.on("close",x=>S(x))})}var si={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=q(n.cwd);s=Gt.isAbsolute(u)?u:Gt.resolve(e.cwd,u)}let i=typeof n.timeout=="number"?n.timeout:Xa,o=Math.min(Math.max(1e3,i),Va),a=await Qa(r,s,o,e.signal),l=[];a.stdout.trim()&&l.push(a.stdout.trimEnd()),a.stderr.trim()&&l.push(`[stderr]
|
|
299
299
|
${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(`
|
|
300
300
|
|
|
301
|
-
`);return{ok:a.code===0&&!a.timedOut&&!a.aborted,content:(a.truncated?`${
|
|
301
|
+
`);return{ok:a.code===0&&!a.timedOut&&!a.aborted,content:(a.truncated?`${Za}
|
|
302
302
|
|
|
303
|
-
`:"")+c.slice(0,
|
|
304
|
-
`))if(s.trim())try{let i=JSON.parse(s);typeof i.file=="string"&&r.push({file:i.file,backup:typeof i.backup=="string"?i.backup:null,time:typeof i.time=="string"?i.time:""})}catch{}return r}catch{return[]}}function
|
|
303
|
+
`:"")+c.slice(0,ot),summary:a.aborted?"\u5DF2\u4E2D\u65AD":a.timedOut?"\u8D85\u65F6":a.code===0?"\u6267\u884C\u6210\u529F":`\u9000\u51FA\u7801 ${a.code}`}}};var E=v(require("fs")),M=v(require("path"));var ii=v(require("crypto")),F=v(require("fs")),de=v(require("path"));var el=50,tl=0;function at(n){let e=ii.createHash("sha1").update(de.resolve(n)).digest("hex").slice(0,10),r=de.basename(n)||"project";return de.join(T(),"backups",`${r}-${e}`)}function oi(n){return de.join(at(n),"manifest.jsonl")}function ai(n){try{let e=F.readFileSync(oi(n),"utf8"),r=[];for(let s of e.split(`
|
|
304
|
+
`))if(s.trim())try{let i=JSON.parse(s);typeof i.file=="string"&&r.push({file:i.file,backup:typeof i.backup=="string"?i.backup:null,time:typeof i.time=="string"?i.time:""})}catch{}return r}catch{return[]}}function li(n,e){for(Z(at(n));e.length>el;){let r=e.shift();if(r?.backup)try{F.rmSync(de.join(at(n),r.backup),{force:!0})}catch{}}F.writeFileSync(oi(n),e.map(r=>JSON.stringify(r)).join(`
|
|
305
305
|
`)+`
|
|
306
|
-
`)}function
|
|
307
|
-
`).map(r=>r.trim()).filter(r=>r&&!r.startsWith("#")&&!r.startsWith("!")):[]}catch{return[]}}function
|
|
308
|
-
`),a=Math.max(1,
|
|
309
|
-
`),
|
|
310
|
-
\u2026\uFF08\u6587\u4EF6\u5171 ${o.length} \u884C\uFF0C\u5DF2\u622A\u65AD\uFF09`:"";return{ok:!0,content:u+
|
|
306
|
+
`)}function hn(n,e){try{Z(at(e));let r=ai(e),s=null;if(F.existsSync(n)){let i=!1;try{i=F.statSync(n).isFile()}catch{i=!1}if(i){let o=new Date().toISOString().replace(/[:.]/g,"-");s=`${de.basename(n)}.${o}-${++tl}.bak`,F.copyFileSync(n,de.join(at(e),s))}}r.push({file:n,backup:s,time:new Date().toISOString()}),li(e,r)}catch{}}function ci(n){let e=ai(n),r=e[e.length-1];if(!r)return"\u6CA1\u6709\u53EF\u64A4\u9500\u7684\u4FEE\u6539\u3002";try{if(r.backup){let s=de.join(at(n),r.backup);if(!F.existsSync(s))return`\u64A4\u9500\u5931\u8D25\uFF1A\u5FEB\u7167\u6587\u4EF6\u5DF2\u4E0D\u5B58\u5728\uFF08${r.backup}\uFF09\u3002`;F.copyFileSync(s,r.file)}else F.existsSync(r.file)&&F.rmSync(r.file,{force:!0})}catch(s){return`\u64A4\u9500\u5931\u8D25\uFF1A${s instanceof Error?s.message:String(s)}`}return e.pop(),li(n,e),r.backup?`\u2713 \u5DF2\u64A4\u9500\u5BF9 ${r.file} \u7684\u4FEE\u6539\uFF08\u6062\u590D\u4E3A\u4FEE\u6539\u524D\u7684\u5185\u5BB9\uFF09\u3002`:`\u2713 \u5DF2\u64A4\u9500\uFF1A\u5220\u9664\u4E86\u7384\u732A\u65B0\u5EFA\u7684\u6587\u4EF6 ${r.file}\u3002`}var ui=2e3,fn=2*1024*1024,mn=200,Xt=200,rl=1024*1024,di=2e3;function nl(n){return/\((?:[^()\\]|\\.)*[+*](?:[^()\\]|\\.)*\)\s*[+*{]/.test(n)?!0:/\((?:[^()\\]|\\.)*\|(?:[^()\\]|\\.)*\)\s*[+*{]/.test(n)}function mi(n){let e;try{e=E.statSync(n)}catch{return null}return e.isDirectory()?{problem:`\u9519\u8BEF\uFF1A${n} \u662F\u4E00\u4E2A\u76EE\u5F55\uFF0C\u4E0D\u80FD\u4F5C\u4E3A\u6587\u4EF6\u5199\u5165`}:e.isFile()?e.size>fn?{problem:`\u9519\u8BEF\uFF1A\u6587\u4EF6\u8FC7\u5927\uFF08${(e.size/1024/1024).toFixed(1)}MB\uFF09\uFF0C\u8D85\u51FA ${fn/1024/1024}MB \u9650\u5236`}:null:{problem:`\u9519\u8BEF\uFF1A${n} \u4E0D\u662F\u666E\u901A\u6587\u4EF6\uFF08\u8BBE\u5907\u6587\u4EF6 / \u7BA1\u9053 / socket\uFF09\uFF0C\u62D2\u7EDD\u5199\u5165`}}var fi=new Set([".git","node_modules","dist","build","out",".next",".nuxt",".cache","coverage",".venv","venv","__pycache__",".idea",".vscode-test"]);function sl(n){try{let e=M.join(n,".gitignore");return E.existsSync(e)?E.readFileSync(e,"utf8").split(`
|
|
307
|
+
`).map(r=>r.trim()).filter(r=>r&&!r.startsWith("#")&&!r.startsWith("!")):[]}catch{return[]}}function il(n,e){let r=n.split(M.sep).join("/"),s=M.basename(r);for(let i of e){let o=i.replace(/^\//,"").replace(/\/$/,"");if(o){if(o.includes("*")){try{if(Vt(o).test(r)||Vt(o).test(s))return!0}catch{}continue}if(r===o||r.startsWith(`${o}/`)||s===o)return!0}}return!1}function lt(n,e){let r=q(n);return M.isAbsolute(r)?r:M.resolve(e,r)}function se(n,e=""){return typeof n=="string"?n:e}function pi(n,e){return typeof n=="number"&&Number.isFinite(n)?n:e}function gn(n){return n.subarray(0,8e3).includes(0)}var gi={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 ${ui}\uFF09`}},required:["path"]},async execute(n,e){let r=lt(se(n.path),e.cwd);if(!E.existsSync(r))return{ok:!1,content:`\u9519\u8BEF\uFF1A\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${r}`};let s=E.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>fn)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=E.readFileSync(r);if(gn(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(`
|
|
308
|
+
`),a=Math.max(1,pi(n.offset,1)),l=Math.max(1,pi(n.limit,ui)),c=o.slice(a-1,a-1+l),u=c.map((d,h)=>{let m=a+h;return`${String(m).padStart(6," ")}| ${d}`}).join(`
|
|
309
|
+
`),p=a-1+l<o.length?`
|
|
310
|
+
\u2026\uFF08\u6587\u4EF6\u5171 ${o.length} \u884C\uFF0C\u5DF2\u622A\u65AD\uFF09`:"";return{ok:!0,content:u+p,summary:`\u8BFB\u53D6 ${c.length} \u884C`}}},$i={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=lt(se(n.path),e.cwd),s=se(n.content),i=mi(r);if(i)return{ok:!1,content:i.problem};try{return hn(r,e.cwd),E.mkdirSync(M.dirname(r),{recursive:!0}),E.writeFileSync(r,s,"utf8"),{ok:!0,content:`\u5DF2\u5199\u5165 ${r}\uFF08${s.length} \u5B57\u7B26\uFF09`,summary:"\u5199\u5165\u6210\u529F"}}catch(o){return{ok:!1,content:`\u5199\u5165\u5931\u8D25\uFF1A${o instanceof Error?o.message:String(o)}`}}}},yi={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=lt(se(n.path),e.cwd);if(!E.existsSync(r))return{ok:!1,content:`\u9519\u8BEF\uFF1A\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A${r}`};let s=mi(r);if(s)return{ok:!1,content:s.problem};let i=se(n.search),o=se(n.replace),a=n.replace_all===!0;if(!i)return{ok:!1,content:"\u9519\u8BEF\uFF1Asearch \u4E0D\u80FD\u4E3A\u7A7A"};let l=E.readFileSync(r);if(gn(l))return{ok:!1,content:`\u9519\u8BEF\uFF1A${r} \u662F\u4E8C\u8FDB\u5236\u6587\u4EF6\uFF0Cedit_file \u53EA\u5904\u7406\u6587\u672C\uFF1B\u786E\u5B9E\u8981\u6574\u4F53\u66FF\u6362\u8BF7\u7528 write_file`};let c=l.toString("utf8");if(!c.includes(i)){let d=y=>y.replace(/\s+/g," ").trim(),h=/^\s*\d+\s*[:|]/m.test(i),m=!h&&d(c).includes(d(i)),f="";return h?f="\n\u6CE8\u610F\uFF1Asearch \u91CC\u4F3C\u4E4E\u5E26\u4E86\u884C\u53F7\uFF08\u5F62\u5982 `123:`\uFF09\u3002read_file \u8F93\u51FA\u7684\u884C\u53F7\u53EA\u662F\u663E\u793A\u7528\uFF0C\u6587\u4EF6\u91CC\u5E76\u4E0D\u5B58\u5728 \u2014\u2014 \u8BF7\u53BB\u6389\u884C\u53F7\u524D\u7F00\uFF0C\u53EA\u4FDD\u7559\u4EE3\u7801\u672C\u8EAB\u3002":m&&(f=`
|
|
311
311
|
\u6CE8\u610F\uFF1A\u5FFD\u7565\u7A7A\u767D\u540E\u80FD\u627E\u5230\u76F8\u4F3C\u5185\u5BB9 \u2014\u2014 \u5F88\u53EF\u80FD\u53EA\u662F\u7F29\u8FDB\uFF08\u7A7A\u683C/\u5236\u8868\u7B26\uFF09\u6216\u6362\u884C\u4E0D\u4E00\u81F4\u3002\u8BF7\u91CD\u65B0 read_file \u8BE5\u533A\u57DF\uFF0C\u7528\u6587\u4EF6\u91CC**\u539F\u6837**\u7684\u7A7A\u767D\u91CD\u5199 search\u3002`),{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`+f}}let u=c.split(i).length-1;if(u>1&&!a)return{ok:!1,content:`\u9519\u8BEF\uFF1Asearch \u5728 ${r} \u4E2D\u51FA\u73B0 ${u} \u5904\uFF0C\u4E3A\u907F\u514D\u8BEF\u6539\u672A\u6267\u884C\u3002
|
|
312
|
-
\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
|
|
312
|
+
\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 p=a?c.split(i).join(o):c.replace(i,()=>o);return hn(r,e.cwd),E.writeFileSync(r,p,"utf8"),{ok:!0,content:`\u5DF2\u66F4\u65B0 ${r}\uFF08\u66FF\u6362 ${a?u:1} \u5904\uFF09`,summary:`\u66FF\u6362 ${a?u:1} \u5904`}}},vi={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?lt(se(n.path),e.cwd):e.cwd;if(!E.existsSync(r))return{ok:!1,content:`\u9519\u8BEF\uFF1A\u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${r}`};if(!E.statSync(r).isDirectory())return{ok:!1,content:`\u9519\u8BEF\uFF1A${r} \u4E0D\u662F\u76EE\u5F55`};let s=E.readdirSync(r,{withFileTypes:!0}).filter(o=>!fi.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}
|
|
313
313
|
${i.join(`
|
|
314
|
-
`)||"(\u7A7A\u76EE\u5F55)"}`,summary:`${s.length} \u9879`}}},
|
|
315
|
-
\u2026\uFF08\u5DF2\u8FBE ${
|
|
316
|
-
`)+a,summary:`${o.length} \u4E2A\u6587\u4EF6`}}},
|
|
317
|
-
\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?
|
|
318
|
-
`);for(let f=0;f<m.length;f++){if(l.length>=Xt)return;let y=m[f],g=y.length>
|
|
314
|
+
`)||"(\u7A7A\u76EE\u5F55)"}`,summary:`${s.length} \u9879`}}},bi={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=se(n.pattern);if(!r)return{ok:!1,content:"\u9519\u8BEF\uFF1Apattern \u4E0D\u80FD\u4E3A\u7A7A"};let s=n.path?lt(se(n.path),e.cwd):e.cwd,i=Vt(r),o=[];if($n(s,l=>{if(o.length>=mn)return;let c=M.relative(s,l).split(M.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>=mn?`
|
|
315
|
+
\u2026\uFF08\u5DF2\u8FBE ${mn} \u6761\u4E0A\u9650\uFF09`:"";return{ok:!0,content:o.join(`
|
|
316
|
+
`)+a,summary:`${o.length} \u4E2A\u6587\u4EF6`}}},xi={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=se(n.pattern);if(!r)return{ok:!1,content:"\u9519\u8BEF\uFF1Apattern \u4E0D\u80FD\u4E3A\u7A7A"};if(nl(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
|
|
317
|
+
\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?lt(se(n.path),e.cwd):e.cwd,o=n.include?Vt(se(n.include)):null,a=sl(i),l=[];if($n(i,u=>{if(l.length>=Xt||a.length>0&&il(M.relative(i,u),a))return;let p=M.relative(i,u).split(M.sep).join("/");if(o&&!o.test(p)&&!o.test(M.basename(u)))return;let d;try{d=E.statSync(u)}catch{return}if(d.size>rl||d.size===0)return;let h;try{h=E.readFileSync(u)}catch{return}if(gn(h))return;let m=h.toString("utf8").split(`
|
|
318
|
+
`);for(let f=0;f<m.length;f++){if(l.length>=Xt)return;let y=m[f],g=y.length>di?y.slice(0,di):y;s.test(g)&&l.push(`${p}:${f+1}: ${y.trim().slice(0,300)}`)}}),l.length===0)return{ok:!0,content:"\u672A\u627E\u5230\u5339\u914D\u5185\u5BB9\u3002"};let c=l.length>=Xt?`
|
|
319
319
|
\u2026\uFF08\u5DF2\u8FBE ${Xt} \u6761\u4E0A\u9650\uFF09`:"";return{ok:!0,content:l.join(`
|
|
320
|
-
`)+c,summary:`${l.length} \u6761\u5339\u914D`}}};function
|
|
320
|
+
`)+c,summary:`${l.length} \u6761\u5339\u914D`}}};function $n(n,e){let r;try{r=E.readdirSync(n,{withFileTypes:!0})}catch{return}for(let s of r){if(fi.has(s.name))continue;let i=M.join(n,s.name);s.isDirectory()?$n(i,e):(s.isFile()||s.isSymbolicLink())&&e(i)}}function Vt(n){let e="",r=n.split(M.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(hi).join("|");e+=`(?:${a})`,s=o}else e+="\\{"}else e+=hi(i)}return new RegExp(`^${e}$`)}function hi(n){return n.replace(/[.+^${}()|[\]\\]/g,"\\$&")}var St=v(require("fs")),yn=v(require("os")),Ie=v(require("path"));function Je(n){let e=n.deviceBridge;if(e?.isRunning())return{source:`xzh \u5185\u7F6E\u8BBE\u5907\u6865\uFF08\u7AEF\u53E3 ${e.getPort()}\uFF09`,list:async()=>e.listDevices().map(i=>({name:i.name,id:i.id,appVersionCode:i.appVersionCode})),push:async(i,o)=>e.pushScript(i,o),run:async(i,o)=>e.runScript(i,o),stop:async(i,o)=>e.stopScript(i,o),logs:async i=>e.recentLogs(i).map(o=>({device:o.device,text:o.text})),screenshot:async()=>e.screenshot()};let r=Me(),s=new re(r);return{source:`\u8BBE\u5907\u6865\uFF08127.0.0.1:${r}\uFF09`,list:async()=>{let i=await s.devices();return i?i.map(o=>({name:o.name,id:o.id,appVersionCode:o.appVersionCode})):null},push:async(i,o)=>s.exec("save",i,o),run:async(i,o)=>s.exec("run",i,o),stop:async(i,o)=>s.exec(i?"stop":"stopAll",i,o),screenshot:async()=>s.screenshot(),logs:async i=>{let o=await s.logs(i);return o?o.map(a=>({device:a.device,text:a.text})):null}}}function Si(n){return{ok:!1,content:`\u8BBE\u5907\u6865\u4E0D\u53EF\u7528\uFF08${n.source}\uFF09\u3002
|
|
321
321
|
\u8BF7\u8BA9\u7528\u6237\u5148\u628A\u624B\u673A\u8FDE\u4E0A\uFF0C\u4EFB\u9009\u5176\u4E00\uFF1A
|
|
322
322
|
\xB7 AutoJs6\uFF08\u63A8\u8350\uFF09\uFF1A\u624B\u673A\u4E0A\u6253\u5F00\u300C\u8FDE\u63A5\u7535\u8111 \u2192 \u670D\u52A1\u5668\u6A21\u5F0F\u300D\uFF0C\u7136\u540E\u5728 xzh \u91CC\u6267\u884C \`/device connect <\u624B\u673AIP>\`\uFF08\u624B\u673A\u672C\u673A\u8FD0\u884C\u65F6\u4E0D\u7528\u586B IP\uFF09\uFF1B
|
|
323
323
|
\xB7 AutoX.js\uFF1A\`/device serve\`\uFF0C\u518D\u8BA9\u624B\u673A\u586B\u5B83\u6253\u5370\u51FA\u7684 ws:// \u5730\u5740\u3002
|
|
324
324
|
\u53E6\u5F00\u4E00\u4E2A\u7EC8\u7AEF\u8DD1 \`xzh device connect <\u624B\u673AIP>\` / \`xzh device serve\` \u4E5F\u53EF\u4EE5\u3002
|
|
325
|
-
\u82E5\u624B\u673A\u8FD8\u6CA1\u88C5 AutoJs6\uFF0C\u7528 \`xzh device apk\` \u67E5\u770B\u8BE5\u88C5\u54EA\u4E2A\u7248\u672C\uFF08\u7384\u732A\u4E0D\u6253\u5305\u5B89\u88C5\u5305\uFF09\u3002`}}function Yt(n,e){let r=e.startsWith("~")?Ie.join(process.env.HOME??process.env.USERPROFILE??"",e.slice(1)):e;return Ie.isAbsolute(r)?r:Ie.resolve(n.cwd,q(r))}function
|
|
326
|
-
`)}var
|
|
327
|
-
${
|
|
325
|
+
\u82E5\u624B\u673A\u8FD8\u6CA1\u88C5 AutoJs6\uFF0C\u7528 \`xzh device apk\` \u67E5\u770B\u8BE5\u88C5\u54EA\u4E2A\u7248\u672C\uFF08\u7384\u732A\u4E0D\u6253\u5305\u5B89\u88C5\u5305\uFF09\u3002`}}function Yt(n,e){let r=e.startsWith("~")?Ie.join(process.env.HOME??process.env.USERPROFILE??"",e.slice(1)):e;return Ie.isAbsolute(r)?r:Ie.resolve(n.cwd,q(r))}function ol(n){return n.map(e=>`- ${e.name}\uFF08${e.id}\uFF0CAutoX.js versionCode ${e.appVersionCode}\uFF09`).join(`
|
|
326
|
+
`)}var al={name:"device_list",description:"\u5217\u51FA\u5F53\u524D\u5DF2\u8FDE\u63A5\u7684\u624B\u673A\u8BBE\u5907\uFF08\u901A\u8FC7\u8BBE\u5907\u6865\u8FDE\u4E0A\u6765\u7684 AutoX.js / Auto.js\uFF09\u3002\u63A8\u811A\u672C\u6216\u8FD0\u884C\u811A\u672C\u4E4B\u524D\u5148\u770B\u4E00\u773C\uFF0C\u786E\u8BA4\u624B\u673A\u662F\u5426\u5DF2\u8FDE\u4E0A\u3002",parameters:{type:"object",properties:{}},async execute(n,e){let r=Je(e),s=await r.list();return s?s.length===0?{ok:!0,content:`\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u8BBE\u5907\uFF08${r.source}\uFF09\u3002\u8BF7\u786E\u8BA4\u624B\u673A\u4E0E\u7535\u8111\u5728\u540C\u4E00\u7F51\u7EDC\uFF0C\u4E14\u624B\u673A\u4E0A\u7684 AutoX.js \u5DF2\u8FDE\u63A5\u5230\u6865\u6253\u5370\u51FA\u7684 ws:// \u5730\u5740\u3002`,summary:"0 \u53F0\u8BBE\u5907"}:{ok:!0,content:`\u5DF2\u8FDE\u63A5 ${s.length} \u53F0\u8BBE\u5907\uFF1A
|
|
327
|
+
${ol(s)}`,summary:`${s.length} \u53F0\u8BBE\u5907`}:Si(r)}},ll={name:"device_push",description:"\u628A\u4E00\u4E2A\u811A\u672C\u6587\u4EF6**\u4FDD\u5B58**\u5230\u624B\u673A\uFF08\u4E0D\u8FD0\u884C\uFF09\u3002\u624B\u673A\u4E0A\u8DD1\u7684\u662F AutoX.js \u811A\u672C\u65F6\u7528\u8FD9\u4E2A\u628A\u672C\u5730\u6539\u597D\u7684\u4EE3\u7801\u540C\u6B65\u8FC7\u53BB\uFF1B\u53EA\u60F3\u770B\u6548\u679C\u5C31\u76F4\u63A5\u7528 device_run\u3002",parameters:{type:"object",properties:{path:{type:"string",description:"\u8981\u63A8\u9001\u7684\u811A\u672C\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u6216\u7EDD\u5BF9\u8DEF\u5F84\uFF09"},device:{type:"string",description:"\u53EA\u63A8\u9001\u5230\u6307\u5B9A\u8BBE\u5907\uFF08\u8BBE\u5907\u540D\u6216\u8FDE\u63A5 id\uFF09\uFF1B\u4E0D\u4F20\u8868\u793A\u6240\u6709\u5DF2\u8FDE\u63A5\u8BBE\u5907"}},required:["path"]},requiresConfirmation:!0,async execute(n,e){if(!n.path)return{ok:!1,content:"\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570\uFF1Apath"};let r=Yt(e,String(n.path).trim()),s=Je(e),i=await s.push(r,n.device?String(n.device):void 0);return vn(i,s,`\u5DF2\u4FDD\u5B58\u5230 ${i.delivered??0} \u53F0\u8BBE\u5907`)}},cl={name:"device_run",description:`\u628A\u811A\u672C\u6587\u4EF6\u63A8\u5230\u624B\u673A\u4E0A**\u5E76\u7ACB\u5373\u8FD0\u884C**\uFF0C\u7136\u540E\u53EF\u4EE5\u7528 device_logs \u67E5\u770B\u624B\u673A\u4E0A\u7684\u8F93\u51FA\u3002\u8FD9\u662F\u300C\u64CD\u4F5C\u624B\u673A\u300D\u7684\u4E3B\u901A\u9053\uFF08\u7B49\u4EF7\u4E8E VSCode \u63D2\u4EF6\u7684 F5\uFF09\u3002
|
|
328
328
|
**\u5199\u811A\u672C\u524D\u5148 load_skill autojs6** \u2014\u2014 \u91CC\u9762\u6709 AutoJs6 \u7684 API \u901F\u67E5\u4E0E\u5FC5\u987B\u9075\u5B88\u7684\u7EA6\u5B9A\u3002
|
|
329
|
-
\u4E09\u6761\u8981\u70B9\uFF1A\u2460 \u811A\u672C\u5728**\u624B\u673A\u4E0A**\u8DD1\uFF0C\u8FD4\u56DE\u503C\u4E0D\u4F1A\u56DE\u6765\uFF0C\u56E0\u6B64\u6BCF\u6B65\u90FD\u8981 toastLog \u56DE\u62A5\uFF0C\u518D\u7528 device_logs \u8BFB\uFF1B\u2461 \u672C\u5DE5\u5177**\u53D1\u51FA\u5373\u8FD4\u56DE**\uFF0C\u4E0D\u7B49\u4E8E\u811A\u672C\u8DD1\u5B8C \u2014\u2014 \u5148 sleep 1~3 \u79D2\u518D\u8BFB\u65E5\u5FD7\uFF1B\u2462 \u9700\u8981 UI \u64CD\u4F5C\u7684\u811A\u672C**\u5FC5\u987B**\u4EE5 auto.waitFor(8000) \u5F00\u5934\uFF08auto() \u5728\u670D\u52A1\u672A\u771F\u6B63\u8FD0\u884C\u65F6\u76F4\u63A5\u629B\u9519\uFF09\u3002`,parameters:{type:"object",properties:{path:{type:"string",description:"\u8981\u8FD0\u884C\u7684\u811A\u672C\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u6216\u7EDD\u5BF9\u8DEF\u5F84\uFF09"},device:{type:"string",description:"\u53EA\u5728\u6307\u5B9A\u8BBE\u5907\u4E0A\u8FD0\u884C\uFF08\u8BBE\u5907\u540D\u6216\u8FDE\u63A5 id\uFF09\uFF1B\u4E0D\u4F20\u8868\u793A\u6240\u6709\u5DF2\u8FDE\u63A5\u8BBE\u5907"}},required:["path"]},requiresConfirmation:!0,async execute(n,e){if(!n.path)return{ok:!1,content:"\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570\uFF1Apath"};let r=Yt(e,String(n.path).trim()),s=Je(e),i=await s.run(r,n.device?String(n.device):void 0);return
|
|
329
|
+
\u4E09\u6761\u8981\u70B9\uFF1A\u2460 \u811A\u672C\u5728**\u624B\u673A\u4E0A**\u8DD1\uFF0C\u8FD4\u56DE\u503C\u4E0D\u4F1A\u56DE\u6765\uFF0C\u56E0\u6B64\u6BCF\u6B65\u90FD\u8981 toastLog \u56DE\u62A5\uFF0C\u518D\u7528 device_logs \u8BFB\uFF1B\u2461 \u672C\u5DE5\u5177**\u53D1\u51FA\u5373\u8FD4\u56DE**\uFF0C\u4E0D\u7B49\u4E8E\u811A\u672C\u8DD1\u5B8C \u2014\u2014 \u5148 sleep 1~3 \u79D2\u518D\u8BFB\u65E5\u5FD7\uFF1B\u2462 \u9700\u8981 UI \u64CD\u4F5C\u7684\u811A\u672C**\u5FC5\u987B**\u4EE5 auto.waitFor(8000) \u5F00\u5934\uFF08auto() \u5728\u670D\u52A1\u672A\u771F\u6B63\u8FD0\u884C\u65F6\u76F4\u63A5\u629B\u9519\uFF09\u3002`,parameters:{type:"object",properties:{path:{type:"string",description:"\u8981\u8FD0\u884C\u7684\u811A\u672C\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u6216\u7EDD\u5BF9\u8DEF\u5F84\uFF09"},device:{type:"string",description:"\u53EA\u5728\u6307\u5B9A\u8BBE\u5907\u4E0A\u8FD0\u884C\uFF08\u8BBE\u5907\u540D\u6216\u8FDE\u63A5 id\uFF09\uFF1B\u4E0D\u4F20\u8868\u793A\u6240\u6709\u5DF2\u8FDE\u63A5\u8BBE\u5907"}},required:["path"]},requiresConfirmation:!0,async execute(n,e){if(!n.path)return{ok:!1,content:"\u7F3A\u5C11\u5FC5\u586B\u53C2\u6570\uFF1Apath"};let r=Yt(e,String(n.path).trim()),s=Je(e),i=await s.run(r,n.device?String(n.device):void 0);return vn(i,s,`\u5DF2\u5728 ${i.delivered??0} \u53F0\u8BBE\u5907\u4E0A\u542F\u52A8\uFF08\u7528 device_logs \u770B\u8F93\u51FA\uFF09`)}},ul={name:"device_stop",description:"\u505C\u6B62\u624B\u673A\u4E0A\u6B63\u5728\u8FD0\u884C\u7684\u811A\u672C\u3002\u4E0D\u4F20 path \u8868\u793A\u505C\u6B62\u5168\u90E8\uFF08AutoX.js \u7684\u300C\u505C\u6B62\u6240\u6709\u811A\u672C\u300D\uFF09\u2014\u2014\u811A\u672C\u662F\u6B7B\u5FAA\u73AF\u65F6\u8FD9\u662F\u552F\u4E00\u7684\u6536\u5C3E\u624B\u6BB5\u3002",parameters:{type:"object",properties:{path:{type:"string",description:"\u53EA\u505C\u6B62\u8FD9\u4E2A\u811A\u672C\uFF1B\u4E0D\u4F20\u8868\u793A\u505C\u6B62\u5168\u90E8\u811A\u672C"},device:{type:"string",description:"\u53EA\u5BF9\u6307\u5B9A\u8BBE\u5907\u751F\u6548\uFF08\u8BBE\u5907\u540D\u6216\u8FDE\u63A5 id\uFF09"}}},requiresConfirmation:!0,async execute(n,e){let r=Je(e),s=n.path?Yt(e,String(n.path).trim()):void 0,i=await r.stop(s,n.device?String(n.device):void 0);return vn(i,r,s?"\u5DF2\u8BF7\u6C42\u505C\u6B62\u8BE5\u811A\u672C":"\u5DF2\u8BF7\u6C42\u505C\u6B62\u5168\u90E8\u811A\u672C")}},dl={name:"device_logs",description:"\u8BFB\u53D6\u624B\u673A\u4E0A\u811A\u672C\u6700\u8FD1\u6253\u5370\u7684\u65E5\u5FD7\uFF08AutoX.js \u91CC console.log / toast \u4E4B\u7C7B\u7684\u5185\u5BB9\u4F1A\u56DE\u5230\u8FD9\u91CC\uFF09\u3002\u8FD0\u884C\u811A\u672C\u540E\u7528\u5B83\u786E\u8BA4\u6267\u884C\u7ED3\u679C\uFF0C\u6BD4\u8BA9\u7528\u6237\u8089\u773C\u76EF\u624B\u673A\u9760\u8C31\u3002",parameters:{type:"object",properties:{limit:{type:"integer",description:"\u6700\u591A\u8FD4\u56DE\u591A\u5C11\u884C\uFF0C\u9ED8\u8BA4 50"}}},async execute(n,e){let r=Number(n.limit??50),s=Number.isFinite(r)&&r>0?Math.min(Math.floor(r),500):50,i=Je(e),o=await i.logs(s);if(!o)return Si(i);if(o.length===0)return{ok:!0,content:`\u6682\u65F6\u6CA1\u6709\u8BBE\u5907\u65E5\u5FD7\uFF08${i.source}\uFF09\u3002\u811A\u672C\u53EF\u80FD\u8FD8\u6CA1\u8F93\u51FA\uFF0C\u6216\u6CA1\u5728\u8FD0\u884C\u3002`,summary:"0 \u884C\u65E5\u5FD7"};let a=o.map(l=>`[${l.device}] ${l.text}`).join(`
|
|
330
330
|
`);return{ok:!0,content:`\u6700\u8FD1 ${o.length} \u884C\u8BBE\u5907\u65E5\u5FD7\uFF1A
|
|
331
|
-
${a}`,summary:`${o.length} \u884C\u65E5\u5FD7`}}};function
|
|
331
|
+
${a}`,summary:`${o.length} \u884C\u65E5\u5FD7`}}};function vn(n,e,r){if(!n.ok)return{ok:!1,content:n.message??"\u64CD\u4F5C\u5931\u8D25"};let s=(n.devices??[]).join("\u3001");return{ok:!0,content:`${r}${s?`\uFF1A${s}`:""}
|
|
332
332
|
${n.path?`\u811A\u672C\uFF1A${n.path}
|
|
333
|
-
`:""}\u6765\u6E90\uFF1A${e.source}`,summary:r}}var
|
|
333
|
+
`:""}\u6765\u6E90\uFF1A${e.source}`,summary:r}}var pl={name:"device_screenshot",description:`\u622A\u53D6**\u624B\u673A\u5F53\u524D\u5C4F\u5E55**\u5E76\u4FDD\u5B58\u4E3A JPEG\uFF1B**\u56FE\u7247\u4F1A\u76F4\u63A5\u9644\u5728\u7ED3\u679C\u4E4B\u540E**\uFF0C\u4F60\u80FD\u770B\u5230\u753B\u9762\u5185\u5BB9\u3002
|
|
334
334
|
\u7528\u9014\uFF1A\u2460 \u65E0\u969C\u788D\u8BFB\u4E0D\u5230\u7684\u754C\u9762\uFF08\u5FAE\u4FE1\u3001\u5E94\u7528\u5206\u8EAB\u3001\u6E38\u620F\uFF09\u2014\u2014 \u5148 device_read_screen \u5224\u65AD\uFF0C
|
|
335
335
|
\u63A7\u4EF6\u6570\u4E3A 0 \u65F6\u6539\u7528\u5B83\u770B\u56FE\uFF1B\u2461 \u628A\u753B\u9762\u62FF\u7ED9\u7528\u6237\u786E\u8BA4\u3002
|
|
336
336
|
\u770B\u5B8C\u4E4B\u540E\u8981\u64CD\u4F5C\uFF0C\u5C31\u6309\u5750\u6807 click(x,y)\uFF08\u56FE\u91CC\u7684\u50CF\u7D20\u5750\u6807\u5373\u5C4F\u5E55\u5750\u6807\uFF09\u3002
|
|
337
337
|
\u9996\u6B21/\u6BCF\u6B21\u622A\u56FE\u624B\u673A\u90FD\u4F1A\u5F39\u7CFB\u7EDF\u6388\u6743\u6846\uFF0C\u6865\u5185\u7F6E\u7684\u811A\u672C\u4F1A\u81EA\u52A8\u70B9\u6389\uFF08\u65E0\u9700\u4EBA\u5DE5\uFF09\u3002`,parameters:{type:"object",properties:{path:{type:"string",description:"\u4FDD\u5B58\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55\u6216\u7EDD\u5BF9\u8DEF\u5F84\uFF09\uFF1B\u4E0D\u4F20\u5219\u5199\u5230\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55"}}},async execute(n,e){let r=Je(e),s=await r.screenshot();if(!s.ok)return{ok:!1,content:`${s.message}
|
|
338
|
-
\uFF08\u6765\u6E90\uFF1A${r.source}\uFF09`};let i=typeof n.path=="string"&&n.path.trim()?Yt(e,n.path.trim()):Ie.join(
|
|
338
|
+
\uFF08\u6765\u6E90\uFF1A${r.source}\uFF09`};let i=typeof n.path=="string"&&n.path.trim()?Yt(e,n.path.trim()):Ie.join(yn.tmpdir(),`xzh-device-shot-${Date.now()}.jpg`);try{St.writeFileSync(i,s.data)}catch(o){return{ok:!1,content:`\u622A\u56FE\u5DF2\u62FF\u5230\u4F46\u4FDD\u5B58\u5931\u8D25\uFF1A${o instanceof Error?o.message:String(o)}`}}return{ok:!0,content:`\u5DF2\u622A\u53D6\u624B\u673A\u5C4F\u5E55\uFF1A${i}\uFF08${Math.round(s.data.length/1024)} KB\uFF0CJPEG\uFF09
|
|
339
339
|
\u56FE\u7247**\u5DF2\u9644\u5728\u672C\u6761\u7ED3\u679C\u4E4B\u540E** \u2014\u2014 \u76F4\u63A5\u770B\u56FE\u5224\u65AD\u754C\u9762\u5185\u5BB9\u3001\u51B3\u5B9A\u70B9\u54EA\u91CC\uFF08\u6309\u5750\u6807 click(x,y)\uFF09\u3002
|
|
340
340
|
\u82E5\u4F60\u65E0\u6CD5\u770B\u5230\u56FE\u7247\uFF0C\u8BF4\u660E\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u89C6\u89C9\uFF1A\u6B64\u65F6\u8BF7\u8BA9\u7528\u6237\u770B\u8FD9\u5F20\u56FE\uFF0C\u6216\u6539\u7528 device_read_screen\u3002
|
|
341
|
-
\uFF08\u6765\u6E90\uFF1A${r.source}\uFF09`,images:[{mimeType:"image/jpeg",data:s.data.toString("base64")}]}}},
|
|
341
|
+
\uFF08\u6765\u6E90\uFF1A${r.source}\uFF09`,images:[{mimeType:"image/jpeg",data:s.data.toString("base64")}]}}},hl={name:"device_read_screen",description:`\u8BFB\u53D6\u624B\u673A**\u5F53\u524D\u754C\u9762**\u7684\u5185\u5BB9\u5E76**\u4EE5\u6587\u5B57\u8FD4\u56DE**\uFF1A\u5305\u540D / Activity\u3001\u53EF\u89C1\u63A7\u4EF6\u7684\u6587\u672C\u4E0E\u63CF\u8FF0\u3001\u662F\u5426\u53EF\u70B9\u51FB\u3001\u4EE5\u53CA\u5750\u6807 \u2014\u2014 \u8FD9\u662F\u4F60\u300C\u770B\u300D\u624B\u673A\u5C4F\u5E55\u7684\u6B63\u786E\u65B9\u5F0F\u3002
|
|
342
342
|
\u7528\u4E8E\uFF1A\u5224\u65AD\u5F53\u524D\u505C\u5728\u54EA\u4E2A\u754C\u9762\u3001\u627E\u8981\u70B9\u7684\u63A7\u4EF6\u3001\u786E\u8BA4\u64CD\u4F5C\u7ED3\u679C\u3002
|
|
343
|
-
\uFF08device_screenshot \u53EA\u4EA7\u51FA\u4F60\u770B\u4E0D\u5230\u7684\u56FE\u7247\u6587\u4EF6\uFF0C\u7ED9\u7528\u6237\u770B\u7528\uFF1B\u8981\u81EA\u5DF1\u5224\u65AD\u754C\u9762\u4E00\u5F8B\u7528\u672C\u5DE5\u5177\u3002\uFF09`,parameters:{type:"object",properties:{}},async execute(n,e){let r=Je(e),s=`r${Date.now()}`,i=`\u3010\u5F00\u59CB\u3011${s}`,o=Ie.join(
|
|
343
|
+
\uFF08device_screenshot \u53EA\u4EA7\u51FA\u4F60\u770B\u4E0D\u5230\u7684\u56FE\u7247\u6587\u4EF6\uFF0C\u7ED9\u7528\u6237\u770B\u7528\uFF1B\u8981\u81EA\u5DF1\u5224\u65AD\u754C\u9762\u4E00\u5F8B\u7528\u672C\u5DE5\u5177\u3002\uFF09`,parameters:{type:"object",properties:{}},async execute(n,e){let r=Je(e),s=`r${Date.now()}`,i=`\u3010\u5F00\u59CB\u3011${s}`,o=Ie.join(yn.tmpdir(),`xzh-ui-dump-${Date.now()}.js`);try{St.writeFileSync(o,on(60,s),"utf8");let c=await r.run(o);if(!c.ok)return{ok:!1,content:`${c.message??"\u8BFB\u53D6\u754C\u9762\u5931\u8D25"}
|
|
344
344
|
\uFF08\u6765\u6E90\uFF1A${r.source}\uFF09`}}finally{St.rmSync(o,{force:!0})}let a=Date.now()+45e3,l=[];for(;Date.now()<a;){let c=(await r.logs(200)??[]).map(d=>d.text),u=c.map(d=>d.includes(i)).lastIndexOf(!0);if(l=u<0?[]:c.slice(u).filter(d=>d.includes("\u3010")),l.some(d=>d.includes("\u3010\u5B8C\u6210\u3011")||d.includes("\u8BFB\u53D6\u5931\u8D25")||d.includes("\u65E0\u969C\u788D\u672A\u5C31\u7EEA")))break;await new Promise(d=>setTimeout(d,700))}return l.length===0?{ok:!1,content:`\u6CA1\u6709\u4ECE\u624B\u673A\u8BFB\u56DE\u754C\u9762\u5185\u5BB9\uFF08\u811A\u672C\u53EF\u80FD\u6CA1\u8DD1\u8D77\u6765\uFF0C\u6216\u5361\u5728\u7B49\u5F85\u65E0\u969C\u788D\u670D\u52A1\uFF09\u3002
|
|
345
345
|
\u53EF\u5148\u8DD1 xzh device check \u4F53\u68C0\uFF0C\u6216\u7528 device_stop \u6536\u6389\u6302\u4F4F\u7684\u811A\u672C\u3002
|
|
346
346
|
\uFF08\u6765\u6E90\uFF1A${r.source}\uFF09`}:{ok:!0,content:`${l.join(`
|
|
347
347
|
`)}
|
|
348
|
-
\uFF08\u6765\u6E90\uFF1A${r.source}\uFF09`}}},
|
|
348
|
+
\uFF08\u6765\u6E90\uFF1A${r.source}\uFF09`}}},bn=[al,ll,cl,ul,dl,hl,pl];var wi=12e3,Ci={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\uFF08\u6309\u4E3B\u9898\u6574\u7406\u7684\u7ED3\u8BBA\u5E93\uFF09\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\u5199\u957F\u671F\u8BB0\u5FC6\uFF08scope=long\uFF09\u4E4B\u524D\u4E5F\u5E94\u5F53\u5148\u8BFB\uFF0C\u786E\u8BA4\u65B0\u7ED3\u8BBA\u5C5E\u4E8E\u54EA\u4E2A\u4E3B\u9898\u5C0F\u8282\u3002\u5F53\u7CFB\u7EDF\u63D0\u793A\u8BCD\u63D0\u793A\u300C\u957F\u671F\u8BB0\u5FC6\u8FC7\u957F\u300D\u65F6\uFF0C\u4E5F\u5E94\u5148\u7528\u5B83\u8BFB\u53D6\u5168\u6587\uFF0C\u518D\u8C03\u7528 memory_compact \u7CBE\u7B80\u3002",parameters:{type:"object",properties:{},required:[]},async execute(n,e){let r=Xe(e.cwd),s=Q(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
|
|
349
349
|
|
|
350
350
|
${r.longTerm}`),r.recentDaily&&i.push(`## \u6700\u8FD1\u65E5\u5FD7\uFF08${r.recentDailyName}\uFF09
|
|
351
351
|
|
|
@@ -353,32 +353,34 @@ ${r.recentDaily}`);let o=i.join(`
|
|
|
353
353
|
|
|
354
354
|
---
|
|
355
355
|
|
|
356
|
-
`);return{ok:!0,content:o.length>
|
|
356
|
+
`);return{ok:!0,content:o.length>wi?`${o.slice(0,wi)}
|
|
357
357
|
|
|
358
|
-
\u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:o,summary:"\u5DF2\u8BFB\u53D6\u9879\u76EE\u8BB0\u5FC6"}}},
|
|
358
|
+
\u2026\uFF08\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`:o,summary:"\u5DF2\u8BFB\u53D6\u9879\u76EE\u8BB0\u5FC6"}}},Ti={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\u5F53\u5929\u7684\u8FDB\u5C55\u4E0E\u8FC7\u7A0B\u8BB0\u5F55\uFF09\uFF1Bscope=long \u5728\u957F\u671F\u8BB0\u5FC6 MEMORY.md \u672B\u5C3E\u8FFD\u52A0\u4E00\u5757 \u2014\u2014 **\u53EA\u9002\u5408\u5168\u65B0\u4E3B\u9898**\uFF1A\u82E5\u65B0\u7ED3\u8BBA\u5C5E\u4E8E\u5DF2\u6709\u7684\u4E3B\u9898\u5C0F\u8282\uFF0C\u5E94\u5148 memory_read \u518D\u7528 memory_compact \u5E76\u8FDB\u90A3\u4E2A\u5C0F\u8282\uFF0C\u5426\u5219\u957F\u671F\u8BB0\u5FC6\u4F1A\u9000\u5316\u6210\u6309\u65F6\u95F4\u5806\u53E0\u3001\u8D8A\u7528\u8D8A\u4E71\u7684\u6D41\u6C34\u8D26\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\u957F\u671F\u8BB0\u5FC6\u8D85\u51FA\u4E0A\u9650\u65F6\u4F1A\u81EA\u52A8\u53BB\u91CD\u4E0E\u7CBE\u7B80\uFF0C\u6458\u8981\u4E2D\u4F1A\u8BF4\u660E\u7CBE\u7B80\u7ED3\u679C\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\uFF08\u4EC5\u7528\u4E8E\u5168\u65B0\u4E3B\u9898\uFF1B\u5DF2\u6709\u4E3B\u9898\u8BF7\u7528 memory_compact \u5E76\u5165\uFF09"}},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=rs(e.cwd,r,s),o=s==="long"?"\u957F\u671F\u8BB0\u5FC6":"\u5F53\u65E5\u65E5\u5FD7",a="";if(s==="long"){let l=e.memoryMaxChars??me,c=Tt(e.cwd,l);if(c&&(c.removedDuplicates>0||c.removedOldest>0)){let p=[];c.removedDuplicates>0&&p.push(`\u53BB\u9664 ${c.removedDuplicates} \u6761\u91CD\u590D\u8BB0\u5F55`),c.removedOldest>0&&p.push(`\u4E22\u5F03 ${c.removedOldest} \u6761\u6700\u65E7\u7684\u8FFD\u52A0\u8BB0\u5F55`),a=`
|
|
359
359
|
|
|
360
|
-
\uFF08\u957F\u671F\u8BB0\u5FC6\u5DF2\u81EA\u52A8\u7CBE\u7B80\uFF1A${
|
|
360
|
+
\uFF08\u957F\u671F\u8BB0\u5FC6\u5DF2\u81EA\u52A8\u7CBE\u7B80\uFF1A${p.join("\u3001")}\uFF0C${c.before} \u2192 ${c.after} \u5B57\u7B26\uFF09`}let u=Xe(e.cwd).longTerm.length;l>0&&u>l&&(a+=`
|
|
361
|
+
|
|
362
|
+
\u26A0 \u957F\u671F\u8BB0\u5FC6\u4ECD\u6709 ${u} \u5B57\u7B26\uFF08\u4E0A\u9650 ${l}\uFF09\uFF0C\u81EA\u52A8\u7CBE\u7B80\u5DF2\u65E0\u6CD5\u7EE7\u7EED\uFF08\u5269\u4E0B\u7684\u90FD\u662F\u6309\u4E3B\u9898\u6574\u7406\u7684\u7A33\u5B9A\u5C0F\u8282\uFF09\u3002\u8BF7**\u7ACB\u5373**\u7528 memory_read \u8BFB\u53D6\u5168\u6587\uFF0C\u518D\u7528 memory_compact \u63D0\u4EA4\u5408\u5E76\u540C\u4E3B\u9898\u3001\u5220\u51CF\u8FC7\u65F6\u5185\u5BB9\u540E\u7684\u5B8C\u6574\u7248\u672C\u3002`)}return{ok:!0,content:`\u5DF2\u5199\u5165${o}\uFF1A${i}${a}
|
|
361
363
|
|
|
362
364
|
\uFF08\u8BB0\u5FC6\u76EE\u5F55\uFF1A${Q(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)}
|
|
363
|
-
\uFF08\u76EE\u6807\u76EE\u5F55\uFF1A${Q(e.cwd).memoryDir}\uFF09`}}}},
|
|
364
|
-
\uFF08${s} \u2192 ${r.length} \u5B57\u7B26\uFF09`,summary:`\u957F\u671F\u8BB0\u5FC6\u5DF2\u7CBE\u7B80\uFF08${s} \u2192 ${r.length} \u5B57\u7B26\uFF09`}}catch(s){return{ok:!1,content:`\u91CD\u5199\u957F\u671F\u8BB0\u5FC6\u5931\u8D25\uFF1A${s instanceof Error?s.message:String(s)}`}}}};var De=v(require("fs")),tr=v(require("path"));var Qt=v(require("fs")),
|
|
365
|
-
`)}function
|
|
366
|
-
|
|
367
|
-
\u2026\uFF08\u6280\u80FD\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function Te(){return process.platform==="darwin"?"darwin":process.platform==="win32"?"win32":"linux"}var
|
|
368
|
-
[\u6267\u884C\u8D85\u65F6 ${e}ms]`:c,timedOut:u})},
|
|
369
|
-
[\u5DF2\u53D6\u6D88]`,timedOut:!1})};if(r){if(r.aborted){S();return}r.addEventListener("abort",S,{once:!0})}l.stdout?.on("data",
|
|
370
|
-
[\u6267\u884C\u8D85\u65F6 ${e}ms]`:c,timedOut:u})},
|
|
371
|
-
[\u6267\u884C\u8D85\u65F6 ${e}ms]`:c,timedOut:u})})})}function
|
|
372
|
-
`)};let
|
|
365
|
+
\uFF08\u76EE\u6807\u76EE\u5F55\uFF1A${Q(e.cwd).memoryDir}\uFF09`}}}},Ai={name:"memory_compact",description:"\u7528\u4E00\u4EFD**\u7CBE\u7B80\u540E\u7684\u5B8C\u6574\u5185\u5BB9**\u8986\u76D6\u957F\u671F\u8BB0\u5FC6 MEMORY.md\uFF08\u8BED\u4E49\u538B\u7F29\uFF09\u3002\u4E24\u4E2A\u7528\u9014\uFF1A\u2460 \u628A\u65B0\u7ED3\u8BBA**\u5E76\u8FDB\u5DF2\u6709\u4E3B\u9898\u5C0F\u8282**\uFF08\u8FD9\u662F\u957F\u671F\u8BB0\u5FC6\u7684\u5E38\u89C4\u66F4\u65B0\u65B9\u5F0F\uFF0C\u56E0\u4E3A memory_write \u53EA\u4F1A\u5728\u6587\u672B\u8FFD\u52A0\uFF09\uFF1B\u2461 \u957F\u671F\u8BB0\u5FC6\u8FC7\u957F / \u91CD\u590D / \u6709\u8FC7\u65F6\u6761\u76EE\u65F6\u505A\u6574\u4F53\u6574\u7406\u3002\u505A\u6CD5\uFF1A\u5148 memory_read \u8BFB\u53D6\u5168\u6587\uFF0C\u518D\u6309\u4E3B\u9898\u5408\u5E76\u6761\u76EE\u3001\u5220\u9664\u5DF2\u8FC7\u65F6\u6216\u88AB\u540E\u7EED\u7ED3\u8BBA\u63A8\u7FFB\u7684\u5185\u5BB9\u3001\u628A\u5197\u957F\u7684\u8FC7\u7A0B\u6D53\u7F29\u4E3A\u7ED3\u8BBA\uFF08\u7EC6\u8282\u7559\u5728\u9879\u76EE\u6587\u6863\u91CC\u3001\u8FD9\u91CC\u53EA\u7559\u6307\u9488\uFF09\uFF0C\u6700\u540E\u628A\u91CD\u5199\u7ED3\u679C\u901A\u8FC7\u672C\u5DE5\u5177\u63D0\u4EA4\u3002\u6CE8\u610F\uFF1A\u63D0\u4EA4\u7684\u662F**\u5B8C\u6574\u7684\u65B0\u7248\u672C**\uFF08\u4F1A\u6574\u4F53\u8986\u76D6\uFF09\uFF0C\u4E0D\u8981\u53EA\u63D0\u4EA4\u589E\u91CF\uFF1B\u7ED3\u6784\u4E0A\u4FDD\u7559\u300C\u6587\u9996\u7EF4\u62A4\u8BF4\u660E + `## \u4E3B\u9898` \u5C0F\u8282\u300D\u7684\u7EC4\u7EC7\u65B9\u5F0F\uFF0C\u4E0D\u8981\u9000\u56DE\u6309\u65F6\u95F4\u5806\u53E0\u7684\u65E5\u671F\u5757\uFF1B\u5FC5\u987B\u4FDD\u7559\u4ECD\u7136\u6709\u6548\u7684\u5173\u952E\u7ED3\u8BBA\u3001\u9879\u76EE\u7EA6\u5B9A\u4E0E\u8E29\u5751\u7ECF\u9A8C\u3002",parameters:{type:"object",properties:{content:{type:"string",description:"\u7CBE\u7B80\u540E\u7684\u957F\u671F\u8BB0\u5FC6\u5168\u6587\uFF08Markdown\uFF1A\u6587\u9996\u4E00\u884C\u7EF4\u62A4\u8BF4\u660E\uFF0C\u6B63\u6587\u6309 `## \u4E3B\u9898` \u5206\u8282\uFF09"}},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\u82E5\u8981\u6E05\u7A7A\u957F\u671F\u8BB0\u5FC6\uFF0C\u8BF7\u63D0\u4EA4\u975E\u7A7A\u8BF4\u660E\u5185\u5BB9\u3002"};try{let s=Xe(e.cwd).longTerm.length;return{ok:!0,content:`\u5DF2\u91CD\u5199\u957F\u671F\u8BB0\u5FC6\uFF1A${Cr(e.cwd,r)}
|
|
366
|
+
\uFF08${s} \u2192 ${r.length} \u5B57\u7B26\uFF09`,summary:`\u957F\u671F\u8BB0\u5FC6\u5DF2\u7CBE\u7B80\uFF08${s} \u2192 ${r.length} \u5B57\u7B26\uFF09`}}catch(s){return{ok:!1,content:`\u91CD\u5199\u957F\u671F\u8BB0\u5FC6\u5931\u8D25\uFF1A${s instanceof Error?s.message:String(s)}`}}}};var De=v(require("fs")),tr=v(require("path"));var Qt=v(require("fs")),_i=v(require("path"));var Zt=1;function xn(){return _i.join(T(),"skills.json")}function Ei(){try{let n=Qt.readFileSync(xn(),"utf8"),e=JSON.parse(n),r=Array.isArray(e.disabled)?e.disabled.filter(s=>typeof s=="string"&&s.trim()!==""):[];return{version:Zt,disabled:r}}catch{return{version:Zt,disabled:[]}}}function ki(n){Z(T()),Qt.writeFileSync(xn(),`${JSON.stringify(n,null,2)}
|
|
367
|
+
`)}function Sn(){return Ei().disabled}function er(n,e){let r=Ei(),s=n.trim().toLowerCase(),i=r.disabled.filter(o=>o.toLowerCase()!==s);return e?i.length!==r.disabled.length?!1:(ki({version:Zt,disabled:[...i,n.trim()]}),!0):i.length===r.disabled.length?!1:(ki({version:Zt,disabled:i}),!0)}var Pi="SKILL.md",Ri=8e4;function Ii(n){return n.replace(/^["']|["']$/g,"").trim()}function ml(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?Ii(i):void 0,description:fl(r)},body:s}}function fl(n){let e=/^description:\s*(.*)$/m.exec(n)?.[1]?.trim();if(e&&e!==">"&&e!=="|"&&e!==">-"&&e!=="|-")return Ii(e);let r=/^description:\s*[>|]-?\s*\n((?:[ \t]+\S.*\n?)+)/m.exec(n)?.[1];return r?r.replace(/\s+/g," ").trim():""}function gl(n){let e=tr.join(n,Pi);if(De.existsSync(e))return e;try{let r=De.readdirSync(n).find(s=>s.toLowerCase()===Pi.toLowerCase());return r?tr.join(n,r):null}catch{return null}}function Mi(n,e,r){let s;try{s=De.readdirSync(n,{withFileTypes:!0})}catch{return}for(let i of s){if(!i.isDirectory())continue;let o=tr.join(n,i.name),a=gl(o);if(!a)continue;let l;try{l=De.readFileSync(a,"utf8")}catch{continue}let{meta:c}=ml(l),u=(c.name||i.name).trim();u&&r.set(u,{name:u,description:c.description??"",dir:o,file:a,source:e})}}function ie(n={}){let e=new Map;Mi(Xn(),"builtin",e),Mi(Vn(),"user",e);let r=[...e.values()].sort((i,o)=>i.name.localeCompare(o.name));if(n.includeDisabled)return r;let s=new Set(Sn().map(i=>i.toLowerCase()));return r.filter(i=>!s.has(i.name.toLowerCase()))}function Di(n,e={}){let r=n.trim().toLowerCase();if(r)return ie(e).find(s=>s.name.toLowerCase()===r)}function Oi(n){let e=De.readFileSync(n.file,"utf8");return e.length<=Ri?e:`${e.slice(0,Ri)}
|
|
368
|
+
|
|
369
|
+
\u2026\uFF08\u6280\u80FD\u5185\u5BB9\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD\uFF09`}function Te(){return process.platform==="darwin"?"darwin":process.platform==="win32"?"win32":"linux"}var wn="npm install -g @playwright/cli@latest",Cn="npx --yes playwright@latest install chromium",$l={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"'},Li={playwright:[{name:"Playwright CLI\uFF08playwright-cli\uFF09",check:"playwright-cli --version",install:{linux:wn,darwin:wn,win32:wn},postInstall:{linux:Cn,darwin:Cn,win32:Cn}}],officecli:[{name:"OfficeCLI\uFF08officecli\uFF09",check:"officecli --version",install:$l}]};function ct(n){return Li[n.trim().toLowerCase()]??[]}function Ni(){return Object.keys(Li)}function ji(n){return['SUDO="sudo -n"; [ -t 0 ] && SUDO="sudo"',`if command -v apt-get >/dev/null 2>&1; then $SUDO apt-get install -y ${n}`,`elif command -v dnf >/dev/null 2>&1; then $SUDO dnf install -y ${n}`,`elif command -v yum >/dev/null 2>&1; then $SUDO yum install -y ${n}`,`elif command -v pacman >/dev/null 2>&1; then $SUDO pacman -S --noconfirm ${n}`,`elif command -v zypper >/dev/null 2>&1; then $SUDO zypper --non-interactive install ${n}`,`elif command -v apk >/dev/null 2>&1; then $SUDO apk add ${n}`,'else echo "\u672A\u8BC6\u522B\u5230\u53D7\u652F\u6301\u7684\u5305\u7BA1\u7406\u5668\uFF08apt / dnf / yum / pacman / zypper / apk\uFF09" >&2; exit 1; fi'].join("; ")}var yl={name:"xclip\uFF08X11 \u526A\u8D34\u677F\u5DE5\u5177\uFF09",check:"command -v xclip",install:{linux:ji("xclip")}},vl={name:"wl-clipboard\uFF08Wayland \u526A\u8D34\u677F\u5DE5\u5177\uFF09",check:"command -v wl-paste",install:{linux:ji("wl-clipboard")}};function Tn(n=Te()){return n!=="linux"?[]:[!!(process.env.WAYLAND_DISPLAY||process.env.WAYLAND_SOCKET)?vl:yl]}function Bi(n=Te()){return Tn(n)}var An=require("child_process");var bl=15e3,rr=9e5,xl=2e4,Fi=120,zi=1500;function Ji(n,e,r){return new Promise(s=>{let i=process.platform==="win32",o=i?"cmd.exe":process.env.SHELL||"bash",l=(0,An.spawn)(o,i?["/d","/s","/c",n]:["-lc",n],{env:process.env,windowsHide:!0,detached:!i}),c="",u=!1,p=!1,d,h=$=>{c.length<xl&&(c+=$.toString())},m=$=>{p||(p=!0,clearTimeout(g),d&&clearTimeout(d),r?.removeEventListener("abort",S),s($))},f=()=>{if(!i&&l.pid)try{process.kill(-l.pid,"SIGKILL");return}catch{}try{l.kill("SIGKILL")}catch{}},y=()=>{d&&clearTimeout(d),d=setTimeout(()=>{m({ok:!1,output:u?`${c}
|
|
370
|
+
[\u6267\u884C\u8D85\u65F6 ${e}ms]`:c,timedOut:u})},zi)},g=setTimeout(()=>{u=!0,f(),y()},e),S=()=>{f(),m({ok:!1,output:c+`
|
|
371
|
+
[\u5DF2\u53D6\u6D88]`,timedOut:!1})};if(r){if(r.aborted){S();return}r.addEventListener("abort",S,{once:!0})}l.stdout?.on("data",h),l.stderr?.on("data",h),l.on("error",$=>{m({ok:!1,output:c+String($),timedOut:u})}),l.on("exit",$=>{d&&clearTimeout(d),d=setTimeout(()=>{m({ok:$===0&&!u,output:u?`${c}
|
|
372
|
+
[\u6267\u884C\u8D85\u65F6 ${e}ms]`:c,timedOut:u})},Fi)}),l.on("close",$=>{m({ok:$===0&&!u,output:u?`${c}
|
|
373
|
+
[\u6267\u884C\u8D85\u65F6 ${e}ms]`:c,timedOut:u})})})}function kn(n,e=rr,r){return new Promise(s=>{let i=process.platform==="win32",o=i?"cmd.exe":process.env.SHELL||"bash",l=(0,An.spawn)(o,i?["/d","/s","/c",n]:["-lc",n],{stdio:"inherit",env:process.env,windowsHide:!0}),c=!1,u=!1,p,d=g=>{u||(u=!0,clearTimeout(f),p&&clearTimeout(p),r?.removeEventListener("abort",y),s(g))},h=()=>{try{l.kill("SIGKILL")}catch{}},m=()=>{p&&clearTimeout(p),p=setTimeout(()=>d({ok:!1,output:"",timedOut:c}),zi)},f=setTimeout(()=>{c=!0,h(),m()},e),y=()=>{h(),m()};if(r){if(r.aborted){y();return}r.addEventListener("abort",y,{once:!0})}l.on("error",g=>{d({ok:!1,output:String(g),timedOut:!1})}),l.on("exit",g=>{p&&clearTimeout(p),p=setTimeout(()=>d({ok:g===0&&!c,output:"",timedOut:c}),Fi)}),l.on("close",g=>{d({ok:g===0&&!c,output:"",timedOut:c})})})}async function Ke(n,e){return(await Ji(n.check,bl,e)).ok}async function _n(n,e=Te(),r,s,i={}){let o=n.install[e];if(!o)return{ok:!1,log:`\u5F53\u524D\u5E73\u53F0\uFF08${e}\uFF09\u6CA1\u6709\u53EF\u7528\u7684\u81EA\u52A8\u5B89\u88C5\u547D\u4EE4\u3002`};let a=[],l=h=>{let m=h.trim();m&&(a.push(m),s?.(m))},c=async h=>{if(!i.interactive)return Ji(h,rr,r);let m=await kn(h,rr,r);return m.ok||l(m.timedOut?`[\u6267\u884C\u8D85\u65F6 ${rr}ms]\uFF1B\u4EA4\u4E92\u5F0F\u5B89\u88C5\u65E0\u6CD5\u6309\u8FDB\u7A0B\u7EC4\u7EC8\u6B62\uFF0C\u82E5\u5B89\u88C5\u7A0B\u5E8F\u4ECD\u5728\u540E\u53F0\u8DD1\uFF0C\u8BF7\u624B\u52A8\u68C0\u67E5`:"\uFF08\u5B89\u88C5\u8F93\u51FA\u5DF2\u76F4\u63A5\u6253\u5370\u5728\u7EC8\u7AEF\u4E0A\uFF09"),m};l(`$ ${o}`);let u=await c(o);for(let h of Ui(u.output,12))l(h);if(!u.ok)return{ok:!1,log:a.join(`
|
|
374
|
+
`)};let p=n.postInstall?.[e];if(p){l(`$ ${p}`);let h=await c(p);for(let m of Ui(h.output,12))l(m);if(!h.ok)return{ok:!1,log:a.join(`
|
|
373
375
|
`)}}return await Ke(n,r)?(l(`\u2713 ${n.name} \u5DF2\u5C31\u7EEA`),{ok:!0,log:a.join(`
|
|
374
376
|
`)}):(l(`\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:a.join(`
|
|
375
|
-
`)})}async function
|
|
376
|
-
`).slice(-2).join(" ");s.failed.push(`${i.name} \u2192 ${c}`)}}return s}function
|
|
377
|
-
`).map(s=>s.trimEnd()).filter(s=>s.trim().length>0).slice(-e)}var
|
|
377
|
+
`)})}async function Ki(n,e={}){return Sl(ct(n),e)}async function Sl(n,e={}){let r=e.platform??Te(),s={installed:[],skipped:[],failed:[]};for(let i of n){if(await Ke(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 _n(i,r,e.signal,e.onOutput);if(l.ok)s.installed.push(i.name);else{let c=l.log.split(`
|
|
378
|
+
`).slice(-2).join(" ");s.failed.push(`${i.name} \u2192 ${c}`)}}return s}function Ui(n,e){return n.split(`
|
|
379
|
+
`).map(s=>s.trimEnd()).filter(s=>s.trim().length>0).slice(-e)}var Hi={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=ie();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
|
|
378
380
|
${s.join(`
|
|
379
|
-
`)}`,summary:`${r.length} \u4E2A\u6280\u80FD`}}},
|
|
381
|
+
`)}`,summary:`${r.length} \u4E2A\u6280\u80FD`}}},qi={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=Di(r);if(!s){let c=ie().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(ct(s.name).length>0){let c=await Ki(s.name,{signal:e.signal,onOutput:u=>e.emit?.(u),confirm:async(u,p)=>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
|
|
380
382
|
|
|
381
|
-
${
|
|
383
|
+
${p}`,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=Oi(s),a=i.length>0?`> \u4F9D\u8D56\u5904\u7406\uFF1A
|
|
382
384
|
${i.map(c=>`> ${c}`).join(`
|
|
383
385
|
`)}
|
|
384
386
|
|
|
@@ -387,9 +389,9 @@ ${i.map(c=>`> ${c}`).join(`
|
|
|
387
389
|
> \u6280\u80FD\u76EE\u5F55\uFF1A${s.dir}
|
|
388
390
|
> \u4E3B\u6587\u4EF6\u91CC\u63D0\u5230\u7684\u4F34\u968F\u6587\u4EF6\uFF08\u5982 \`references/*.md\`\uFF09\u90FD\u5728\u6B64\u76EE\u5F55\u4E0B\uFF0C\u7528 read_file \u6309\u300C\u6280\u80FD\u76EE\u5F55 + \u76F8\u5BF9\u8DEF\u5F84\u300D\u8BFB\u53D6\u3002
|
|
389
391
|
|
|
390
|
-
${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
|
|
391
|
-
`)}function
|
|
392
|
-
${
|
|
392
|
+
${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 Wi=["pending","in_progress","completed","cancelled"],wl={pending:"[ ]",in_progress:"[~]",completed:"[x]",cancelled:"[-]"};function Cl(n){if(!Array.isArray(n))return"\u9519\u8BEF\uFF1Atodos \u5FC5\u987B\u662F\u6570\u7EC4\u3002";let e=[];for(let s=0;s<n.length;s++){let i=n[s];if(typeof i!="object"||i===null||Array.isArray(i))return`\u9519\u8BEF\uFF1Atodos[${s}] \u5FC5\u987B\u662F\u5BF9\u8C61\uFF08{content, status}\uFF09\u3002`;let{content:o,status:a}=i;if(typeof o!="string"||!o.trim())return`\u9519\u8BEF\uFF1Atodos[${s}].content \u4E0D\u80FD\u4E3A\u7A7A\u3002`;let l=Wi.includes(a)?a:"pending";e.push({content:o.trim(),status:l})}return e.filter(s=>s.status==="in_progress").length>1?"\u9519\u8BEF\uFF1A\u540C\u4E00\u65F6\u95F4\u53EA\u80FD\u6709\u4E00\u4E2A in_progress \u7684\u4EFB\u52A1\uFF0C\u8BF7\u628A\u5176\u4F59\u4EFB\u52A1\u6807\u4E3A pending\u3002":e}function Tl(n){return n.length===0?"\uFF08\u4EFB\u52A1\u5217\u8868\u4E3A\u7A7A\uFF09":n.map(e=>`${wl[e.status]} ${e.content}`).join(`
|
|
393
|
+
`)}function Al(n){let e=n.filter(i=>i.status==="completed").length,r=n.find(i=>i.status==="in_progress"),s=n.filter(i=>i.status!=="cancelled").length;return r?`\u4EFB\u52A1 ${e}/${s} \xB7 \u8FDB\u884C\u4E2D\uFF1A${r.content}`:`\u4EFB\u52A1 ${e}/${s}`}var Gi={name:"todo_write",description:"\u521B\u5EFA\u6216\u66F4\u65B0\u5F53\u524D\u4F1A\u8BDD\u7684\u4EFB\u52A1\u5217\u8868\uFF08todo list\uFF09\uFF0C\u7528\u4E8E\u628A\u590D\u6742\u4EFB\u52A1\u62C6\u6210\u53EF\u8DDF\u8E2A\u7684\u6B65\u9AA4\u3002**\u5F53\u4EFB\u52A1\u9700\u8981 3 \u6B65\u4EE5\u4E0A\u3001\u6216\u7528\u6237\u7ED9\u51FA\u591A\u9879\u8981\u6C42\u65F6\uFF0C\u5E94\u5148\u8C03\u7528\u5B83\u5217\u51FA\u8BA1\u5212**\uFF0C\u5E76\u5728\u6BCF\u5B8C\u6210\u4E00\u6B65\u540E\u66F4\u65B0\u5217\u8868\uFF08\u628A\u8BE5\u9879\u6807\u4E3A completed\u3001\u628A\u4E0B\u4E00\u9879\u6807\u4E3A in_progress\uFF09\u3002\u6BCF\u6B21\u63D0\u4EA4**\u5B8C\u6574\u5217\u8868**\uFF08\u8986\u76D6\u65E7\u5217\u8868\uFF09\uFF0C\u800C\u4E0D\u662F\u589E\u91CF\u3002\u540C\u4E00\u65F6\u95F4\u53EA\u80FD\u6709\u4E00\u9879 in_progress\u3002\u7B80\u5355\u7684\u4E00\u4E24\u6B65\u4EFB\u52A1\uFF08\u8BFB\u4E00\u4E2A\u6587\u4EF6\u3001\u6539\u4E00\u884C\uFF09\u4E0D\u5FC5\u4F7F\u7528\u3002",parameters:{type:"object",properties:{todos:{type:"array",description:"\u5B8C\u6574\u7684\u4EFB\u52A1\u5217\u8868\uFF08\u5168\u91CF\u8986\u76D6\uFF09\uFF0C\u6309\u6267\u884C\u987A\u5E8F\u6392\u5217",items:{type:"object",properties:{content:{type:"string",description:"\u4EFB\u52A1\u5185\u5BB9\uFF0C\u4E00\u53E5\u8BDD\uFF0C\u52A8\u8BCD\u5F00\u5934\uFF08\u5982\u300C\u4FEE\u6539 agent.ts \u7684 runTool\u300D\uFF09"},status:{type:"string",enum:Wi,description:"pending=\u5F85\u529E\uFF1Bin_progress=\u8FDB\u884C\u4E2D\uFF08\u540C\u65F6\u53EA\u80FD\u6709\u4E00\u4E2A\uFF09\uFF1Bcompleted=\u5DF2\u5B8C\u6210\uFF1Bcancelled=\u5DF2\u53D6\u6D88"}},required:["content","status"]}}},required:["todos"]},async execute(n,e){if(!e.todos)return{ok:!1,content:"\u9519\u8BEF\uFF1A\u5F53\u524D\u73AF\u5883\u4E0D\u652F\u6301\u4EFB\u52A1\u5217\u8868\u3002"};let r=Cl(n.todos);return typeof r=="string"?{ok:!1,content:r}:(e.todos.set(r),{ok:!0,content:`\u5DF2\u66F4\u65B0\u4EFB\u52A1\u5217\u8868\uFF1A
|
|
394
|
+
${Tl(r)}`,summary:Al(r)})}};var nr=[Hi,qi,Ci,Ti,Ai,Gi,ri,gi,vi,bi,xi,$i,yi,si,...bn],kl=new Set(["task","todo_write","memory_write","memory_compact",...bn.map(n=>n.name)]);function sr(n,e=nr){return e.find(r=>r.name===n)}function ir(n=nr){return n.map(e=>({name:e.name,description:e.description,parameters:e.parameters}))}function Xi(n){return nr.filter(e=>kl.has(e.name)?!1:n?n.includes(e.name):!0)}async function Vi(n,e,r,s=nr){let i=sr(n,s);if(!i)return{ok:!1,content:`\u9519\u8BEF\uFF1A\u672A\u77E5\u5DE5\u5177 "${n}"`};let o={};if(e&&e.trim())try{let d=JSON.parse(e);typeof d=="object"&&d!==null&&!Array.isArray(d)&&(o=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 a=i.parameters,l=a.properties??{},c=Array.isArray(a.required)?a.required:[],u=Object.keys(o).filter(d=>!(d in l));if(u.length>0){let d=Object.keys(l);return{ok:!1,content:`\u9519\u8BEF\uFF1A${n} \u6536\u5230\u672A\u77E5\u53C2\u6570 ${u.map(h=>`"${h}"`).join("\u3001")}\u3002\u53EF\u7528\u53C2\u6570\uFF1A${d.length>0?d.map(h=>`"${h}"`).join("\u3001"):"\uFF08\u65E0\uFF09"}`}}let p=c.filter(d=>o[d]===void 0||o[d]===null);if(p.length>0)return{ok:!1,content:`\u9519\u8BEF\uFF1A${n} \u7F3A\u5C11\u5FC5\u586B\u53C2\u6570 ${p.map(d=>`"${d}"`).join("\u3001")}\u3002`};try{return await i.execute(o,r)}catch(d){return{ok:!1,content:`\u5DE5\u5177\u6267\u884C\u5F02\u5E38\uFF1A${d instanceof Error?d.message:String(d)}`}}}async function Yi(n,e,r){let s=new Array(n.length);if(n.length===0)return s;let i=Number.isFinite(e)?Math.floor(e):1,o=Math.min(Math.max(1,i),n.length),a=0;return await Promise.all(Array.from({length:o},async()=>{for(;;){let l=a++;if(l>=n.length)return;s[l]=await r(n[l],l)}})),s}function Zi(n,e,r,s,i){let a=`\u4F60\u662F\u300C\u7384\u732A\u300D\uFF08XuanZhu\uFF09\uFF0C\u4E00\u6B3E\u8FD0\u884C\u5728\u7EC8\u7AEF\u4E2D\u7684 AI \u7F16\u7801 Agent\u3002
|
|
393
395
|
|
|
394
396
|
\u4F60\u7684\u5DE5\u4F5C\u76EE\u5F55\uFF1A${n}
|
|
395
397
|
|
|
@@ -402,8 +404,10 @@ ${wl(r)}`,summary:Cl(r)})}};var nr=[Ki,Hi,wi,Ci,Ti,Wi,ti,fi,yi,vi,bi,gi,$i,ni,..
|
|
|
402
404
|
6. \u6536\u5C3E\u65F6\u6C89\u6DC0\u8BB0\u5FC6\uFF1A**\u5728\u7ED9\u51FA\u672C\u8F6E\u6700\u7EC8\u7B54\u590D\u4E4B\u524D**\uFF0C\u5148\u5224\u65AD\u8FD9\u6B21\u662F\u5426\u4EA7\u51FA\u4E86\u8DE8\u4F1A\u8BDD\u4ECD\u6709\u4EF7\u503C\u7684\u5185\u5BB9
|
|
403
405
|
\uFF08\u786E\u5B9A\u7684\u6280\u672F\u65B9\u6848\u3001\u9879\u76EE\u7EA6\u5B9A\u3001\u8E29\u8FC7\u7684\u5751\u4E0E\u89E3\u6CD5\u3001\u91CD\u8981\u53D1\u73B0\u3001\u7528\u6237\u7684\u504F\u597D\u8981\u6C42\uFF09\u3002
|
|
404
406
|
\u53EA\u8981\u6709\uFF0C\u5C31**\u5FC5\u987B\u5148\u8C03\u7528 memory_write \u8BB0\u5F55\uFF0C\u518D\u7ED3\u675F\u672C\u8F6E**\u3002
|
|
407
|
+
\u5199\u957F\u671F\u8BB0\u5FC6\uFF08scope=long\uFF09\u524D\u5148 memory_read\uFF1A\u5C5E\u4E8E**\u5DF2\u6709\u4E3B\u9898**\u7684\u5185\u5BB9\u8981\u7528 memory_compact
|
|
408
|
+
\u5E76\u8FDB\u90A3\u4E2A\u5C0F\u8282\uFF0C\u53EA\u6709\u5168\u65B0\u4E3B\u9898\u624D\u8FFD\u52A0\u65B0\u5757 \u2014\u2014 \u957F\u671F\u8BB0\u5FC6\u662F\u6309\u4E3B\u9898\u6574\u7406\u7684\u7ED3\u8BBA\u5E93\uFF0C\u4E0D\u662F\u6D41\u6C34\u8D26\u3002
|
|
405
409
|
\u4E0D\u8981\u7559\u5230"\u4E0B\u6B21\u518D\u8BF4"\u2014\u2014\u672C\u8F6E\u7ED3\u675F\u540E\u4E0A\u4E0B\u6587\u5C31\u6CA1\u4E86\uFF0C\u8FD9\u4E9B\u7ED3\u8BBA\u4F1A\u6C38\u4E45\u4E22\u5931\u3002
|
|
406
|
-
\u7410\u788E\u7684\u8FC7\u7A0B\u7EC6\u8282\u3001\u4E34\u65F6\u8DEF\u5F84\u3001\u5DE5\u5177\u62A5\u9519\u4E0D\u5FC5\u8BB0\u5F55\u3002
|
|
410
|
+
\u7410\u788E\u7684\u8FC7\u7A0B\u7EC6\u8282\u3001\u4E34\u65F6\u8DEF\u5F84\u3001\u5DE5\u5177\u62A5\u9519\u4E0D\u5FC5\u8BB0\u5F55\uFF08\u5F53\u5929\u7684\u8FDB\u5C55\u8BB0 scope=daily\uFF09\u3002
|
|
407
411
|
7. \u4E0D\u8981\u91CD\u590D\u5DF2\u5B8C\u6210\u7684\u5DE5\u4F5C\uFF1A\u52A8\u624B\u524D\u5148\u770B\u5BF9\u8BDD\u91CC**\u5DF2\u7ECF\u505A\u8FC7\u4EC0\u4E48**\uFF0C\u4ECE\u4E0A\u6B21\u505C\u4E0B\u7684\u5730\u65B9\u7EE7\u7EED\uFF0C
|
|
408
412
|
\u4E0D\u8981\u6BCF\u6B21\u90FD\u4ECE\u5934\u91CD\u8FF0\u8BA1\u5212\u3001\u91CD\u8DD1\u540C\u6837\u7684\u8C03\u7528\u3002\u82E5\u5DE5\u5177\u8FD4\u56DE\u91CC\u51FA\u73B0
|
|
409
413
|
\u300C[\u7CFB\u7EDF\u63D0\u9192] \u8FD9\u4E00\u6B65\u5DF2\u7ECF\u5B8C\u6210\u300D\uFF0C\u8BF4\u660E\u4F60\u6B63\u5728\u91CD\u590D\uFF0C\u8BF7\u7ACB\u5373\u8F6C\u5411\u672A\u5B8C\u6210\u7684\u90E8\u5206 \u2014\u2014
|
|
@@ -429,7 +433,7 @@ ${wl(r)}`,summary:Cl(r)})}};var nr=[Ki,Hi,wi,Ci,Ti,Wi,ti,fi,yi,vi,bi,gi,$i,ni,..
|
|
|
429
433
|
- bash\uFF1A\u6267\u884C shell \u547D\u4EE4\uFF08\u5371\u9669\uFF0C\u9700\u786E\u8BA4\uFF09
|
|
430
434
|
- todo_write\uFF1A\u521B\u5EFA / \u66F4\u65B0\u4EFB\u52A1\u5217\u8868\uFF08\u6BCF\u6B21\u63D0\u4EA4\u5B8C\u6574\u5217\u8868\uFF09
|
|
431
435
|
- task\uFF1A\u6D3E\u751F\u5B50\u4EE3\u7406\uFF08\u9ED8\u8BA4 code-explorer\uFF09\u6267\u884C\u5B50\u4EFB\u52A1\uFF0C\u53EA\u8FD4\u56DE\u7ED3\u8BBA
|
|
432
|
-
- memory_compact\uFF1A\u7528\u7CBE\u7B80\u540E\u7684\u5B8C\u6574\u5185\u5BB9\u91CD\u5199\u957F\u671F\u8BB0\u5FC6\
|
|
436
|
+
- memory_compact\uFF1A\u7528\u7CBE\u7B80\u540E\u7684\u5B8C\u6574\u5185\u5BB9\u91CD\u5199\u957F\u671F\u8BB0\u5FC6 \u2014\u2014 \u628A\u65B0\u7ED3\u8BBA\u5E76\u8FDB\u5DF2\u6709\u4E3B\u9898\u5C0F\u8282\uFF0C\u6216\u6574\u4F53\u538B\u7F29
|
|
433
437
|
- device_list / device_push / device_run / device_stop / device_logs\uFF1A\u628A\u811A\u672C\u63A8\u5230**\u624B\u673A**
|
|
434
438
|
\uFF08AutoJs6 / AutoX.js\uFF09\u4E0A\u8FD0\u884C\uFF0C\u5E76\u56DE\u6536\u624B\u673A\u4E0A\u7684\u65E5\u5FD7\uFF08\u8FD9\u5C31\u662F"\u64CD\u4F5C\u624B\u673A"\u7684\u65B9\u5F0F\uFF09\u3002
|
|
435
439
|
\xB7 **\u8981\u64CD\u4F5C\u624B\u673A\u65F6\u5148 load_skill autojs6** \u2014\u2014 \u91CC\u9762\u6709 API \u901F\u67E5\u4E0E\u5FC5\u987B\u9075\u5B88\u7684\u7EA6\u5B9A\uFF1B
|
|
@@ -464,201 +468,201 @@ ${wl(r)}`,summary:Cl(r)})}};var nr=[Ki,Hi,wi,Ci,Ti,Wi,ti,fi,yi,vi,bi,gi,$i,ni,..
|
|
|
464
468
|
- \u82E5\u4EFB\u52A1\u65E0\u6CD5\u5B8C\u6210\uFF0C\u8BF4\u660E\u539F\u56E0\u548C\u6240\u9700\u4FE1\u606F\u3002`;return r&&r.trim()&&(a+=`
|
|
465
469
|
|
|
466
470
|
## \u9879\u76EE\u89C4\u5219\uFF08\u6765\u81EA\u9879\u76EE\u6839 .xuanzhu/rules.md\uFF0C\u8BF7\u4F18\u5148\u9075\u5B88\uFF09
|
|
467
|
-
${r.trim()}`),a+=
|
|
471
|
+
${r.trim()}`),a+=_l(s,i),e&&e.trim()&&(a+=`
|
|
468
472
|
|
|
469
473
|
## \u9644\u52A0\u6307\u4EE4
|
|
470
|
-
${e.trim()}`),a}var or=1500;function
|
|
474
|
+
${e.trim()}`),a}var or=1500;function _l(n,e){let r="\n\n## \u9879\u76EE\u8BB0\u5FC6\n\u672C\u9879\u76EE\u5728 `.xuanzhu/memory/` \u4E2D\u4FDD\u5B58\u8DE8\u4F1A\u8BDD\u8BB0\u5FC6\uFF0C\u5206\u4E24\u5C42\uFF1A\n- **\u957F\u671F\u8BB0\u5FC6 `MEMORY.md`**\uFF1A**\u6309\u4E3B\u9898\u6574\u7406\u7684\u7ED3\u8BBA\u5E93** \u2014\u2014 \u8DE8\u4F1A\u8BDD\u7A33\u5B9A\u7684\u4E8B\u5B9E\u3001\u53E3\u5F84\u4E0E\u8E29\u5751\u3002\n- **\u5F53\u65E5\u65E5\u5FD7 `YYYY-MM-DD.md`**\uFF1A\u5F53\u5929\u7684\u8FDB\u5C55\u4E0E\u8FC7\u7A0B\u8BB0\u5F55\u3002\n\u5DE5\u5177\uFF1A\n- **`memory_read`**\uFF1A\u8BFB\u53D6\u957F\u671F\u8BB0\u5FC6\u5168\u6587\u4E0E\u6700\u8FD1\u4E00\u4EFD\u65E5\u5FD7\u3002\u5F00\u59CB\u4E00\u9879\u9700\u8981\u9879\u76EE\u80CC\u666F\u7684\u4EFB\u52A1\u524D**\u5E94\u5F53\u5148\u8BFB**\uFF0C\u907F\u514D\u91CD\u590D\u6478\u7D22\u3001\u91CD\u590D\u8E29\u5751\u3002\n- **`memory_write`**\uFF1A\u5199\u5165\u503C\u5F97\u8DE8\u4F1A\u8BDD\u4FDD\u7559\u7684\u4FE1\u606F\uFF0C**\u6BCF\u5B8C\u6210\u4E00\u4EF6\u5B9E\u8D28\u5DE5\u4F5C\u90FD\u5FC5\u987B\u5199**\u3002`scope=daily`\uFF08\u9ED8\u8BA4\uFF09\u8FFD\u52A0\u5F53\u65E5\u8FDB\u5C55\uFF1B`scope=long` \u8FFD\u52A0\u4E00\u6761\u957F\u671F\u8BB0\u5FC6\u5757\u3002\n- **`memory_compact`**\uFF1A\u7528\u7CBE\u7B80\u540E\u7684**\u5B8C\u6574\u5185\u5BB9**\u91CD\u5199\u957F\u671F\u8BB0\u5FC6\u3002**\u8981\u628A\u65B0\u7ED3\u8BBA\u5E76\u8FDB\u5DF2\u6709\u5C0F\u8282\u65F6\u7528\u5B83\uFF0C\u800C\u4E0D\u662F\u518D\u8FFD\u52A0\u4E00\u5757\u3002**\n\n**\u957F\u671F\u8BB0\u5FC6\u600E\u4E48\u5199\uFF08\u51B3\u5B9A\u5B83\u5728\u540E\u7EED\u4F1A\u8BDD\u91CC\u662F\u5426\u771F\u7684\u6709\u7528\uFF09**\uFF1A\n1. **\u6309\u4E3B\u9898\u5206\u8282\uFF0C\u4E0D\u6309\u65F6\u95F4\u5806\u780C**\uFF1A\u5982 `## \u73AF\u5883\u4E0E\u90E8\u7F72`\u3001`## \u6743\u9650\u673A\u5236`\u3001`## \u5E38\u89C1\u5751`\uFF1B\u540C\u4E00\u4E3B\u9898\u7684\u65B0\u53D1\u73B0\u8981**\u5E76\u8FDB\u5DF2\u6709\u5C0F\u8282**\uFF08`memory_read` \u2192 `memory_compact` \u91CD\u5199\uFF09\uFF0C\u4E0D\u8981\u5728\u6587\u672B\u518D\u6302\u4E00\u6761\u65E5\u671F\u5757\u3002\u6587\u9996\u7559\u4E00\u884C\u7EF4\u62A4\u8BF4\u660E\uFF1A\u8FD9\u4EFD\u6587\u4EF6\u653E\u4EC0\u4E48 + \u6700\u8FD1\u4E00\u6B21\u6574\u7406\u65E5\u671F\u3002\u5C0F\u8282**\u6309\u91CD\u8981\u6027\u4ECE\u524D\u5F80\u540E\u6392**\uFF08\u6CE8\u5165\u63D0\u793A\u8BCD\u7684\u53EA\u662F\u5F00\u5934\u4E00\u8282\u9009\uFF09\u3002\n2. **\u53EA\u5199\u8DE8\u4F1A\u8BDD\u7A33\u5B9A\u3001\u53EF\u590D\u7528\u7684\u5185\u5BB9**\uFF1A\u7ED3\u8BBA\u4E0E\u53E3\u5F84\u3001\u9879\u76EE\u7EA6\u5B9A\u3001\u7528\u6237\u7684\u504F\u597D\u4E0E\u8981\u6C42\u3001\u8E29\u8FC7\u7684\u5751\u53CA\u5176**\u539F\u56E0\u4E0E\u89E3\u6CD5**\u3001\u5173\u952E\u8DEF\u5F84 / \u547D\u4EE4 / \u7AEF\u53E3\u4E4B\u7C7B\u7684\u73AF\u5883\u4E8B\u5B9E\u3002\n3. **\u6761\u76EE\u683C\u5F0F\uFF1A\u5148\u7ED3\u8BBA\uFF0C\u518D\u8BF4\u4F9D\u636E** \u2014\u2014 \u5177\u4F53\u5230 `file.ts::func()`\u3001\u8868\u540D\u6216\u53EF\u76F4\u63A5\u6267\u884C\u7684\u547D\u4EE4\uFF0C\u5FC5\u8981\u65F6\u5E26\u65E5\u671F / \u7248\u672C\u951A\u70B9\uFF1B**\u5371\u9669\u6216\u4E0D\u53EF\u9006\u7684\u64CD\u4F5C\u6807 `\u26A0`**\u3002\n4. **\u7EC6\u8282\u5916\u7F6E**\uFF1A\u7248\u672C\u53D9\u4E8B\u4E0E\u957F\u7BC7\u8BBA\u8BC1\u7559\u5728\u9879\u76EE\u6587\u6863\u548C\u4EE3\u7801\u91CC\uFF0C\u957F\u671F\u8BB0\u5FC6\u53EA\u7559\u7ED3\u8BBA + \u6307\u9488\uFF08\u5982 `\u8BE6\u89C1 docs/xxx.md`\uFF09\u2014\u2014 \u8BB0\u5FC6\u8981\u77ED\u5230\u80FD\u6574\u7BC7\u8BFB\u5B8C\uFF0C\u7EC6\u8282\u9760\u5DE5\u5177\u53BB\u53D6\u3002\n5. **\u5220\u9664\u548C\u5199\u5165\u4E00\u6837\u91CD\u8981**\uFF1A\u5DF2\u8FC7\u65F6\u3001\u5DF2\u88AB\u63A8\u7FFB\u3001\u5DF2\u5199\u8FDB\u9879\u76EE\u6587\u6863\u7684\u5185\u5BB9\u8981\u5220\u6389\uFF0C\u65B0\u65E7\u7ED3\u8BBA\u5E76\u5B58\u53EA\u4F1A\u8BA9\u8BB0\u5FC6\u628A\u4EBA\u5E26\u504F\u3002\n6. **\u4E0D\u8981\u8BB0\u5F55**\uFF1A\u4E34\u65F6\u8DEF\u5F84\u3001\u4E00\u6B21\u6027\u547D\u4EE4\u8F93\u51FA\u3001\u5DE5\u5177\u62A5\u9519\u3001\u7EAF\u63A2\u7D22\u8FC7\u7A0B\u3001\u5F53\u5929\u7684\u6D41\u6C34\u8FDB\u5C55\uFF08\u8FD9\u4E9B\u8FDB\u5F53\u65E5\u65E5\u5FD7\uFF09\u2014\u2014 \u5199\u8FDB\u53BB\u53EA\u4F1A\u6324\u5360\u540E\u7EED\u4F1A\u8BDD\u7684\u4E0A\u4E0B\u6587\u3002\n- \u957F\u671F\u8BB0\u5FC6\u8D85\u51FA\u4E0A\u9650\u65F6\u4F1A\u88AB**\u81EA\u52A8\u7CBE\u7B80**\uFF1A\u53BB\u9664\u5B8C\u5168\u91CD\u590D\u7684\u8BB0\u5F55 + \u88C1\u526A\u6700\u65E7\u7684\u8FFD\u52A0\u5757\uFF08`## \u65F6\u95F4\u6233`\uFF0C\u6700\u65B0\u7684\u4E00\u5757\u4FDD\u7559\uFF09\uFF1B**\u6309\u4E3B\u9898\u6574\u7406\u7684\u7A33\u5B9A\u5C0F\u8282\u4E0D\u4F1A\u88AB\u81EA\u52A8\u5220\u9664**\uFF0C\u4ECD\u8D85\u9650\u65F6\u4F1A\u63D0\u793A\u4F60\u7528 `memory_compact` \u505A\u8BED\u4E49\u538B\u7F29\u3002",s=n?.longTerm?.trim();if(s){let a=s.length>or?`${s.slice(0,or)}
|
|
471
475
|
\u2026\uFF08\u5DF2\u622A\u65AD\uFF0C\u53EF\u7528 memory_read \u67E5\u770B\u5B8C\u6574\u5185\u5BB9\uFF09`:s;r+=`
|
|
472
476
|
|
|
473
477
|
### \u73B0\u6709\u957F\u671F\u8BB0\u5FC6\uFF08\u8282\u9009\uFF09
|
|
474
478
|
${a}`}let i=e??me;s&&i>0&&s.length>i&&(r+=`
|
|
475
479
|
|
|
476
480
|
### \u26A0 \u957F\u671F\u8BB0\u5FC6\u4ECD\u7136\u8FC7\u957F
|
|
477
|
-
\u957F\u671F\u8BB0\u5FC6\u7EA6 ${s.length} \u5B57\u7B26\uFF0C\u5DF2\u8D85\u8FC7\u4E0A\u9650 ${i}\uFF0C\
|
|
481
|
+
\u957F\u671F\u8BB0\u5FC6\u7EA6 ${s.length} \u5B57\u7B26\uFF0C\u5DF2\u8D85\u8FC7\u4E0A\u9650 ${i}\uFF0C\u800C**\u81EA\u52A8\u7CBE\u7B80\u5DF2\u65E0\u6CD5\u7EE7\u7EED**\uFF08\u5269\u4E0B\u7684\u8981\u4E48\u662F\u6309\u4E3B\u9898\u6574\u7406\u7684\u7A33\u5B9A\u5C0F\u8282 \u2014\u2014 \u81EA\u52A8\u5220\u4F1A\u628A\u9879\u76EE\u4E8B\u5B9E\u6574\u6BB5\u62B9\u6389\uFF0C\u8981\u4E48\u662F\u5355\u6761\u8BB0\u5F55\u672C\u8EAB\u5C31\u8FC7\u957F\uFF09\u3002\u8BF7\uFF1A
|
|
478
482
|
1. \u7528 \`memory_read\` \u8BFB\u53D6\u957F\u671F\u8BB0\u5FC6\u5168\u6587\uFF1B
|
|
479
|
-
2. \u5408\u5E76\u540C\u4E00\u4E3B\u9898\u7684\u591A\u6761\u8BB0\u5F55\
|
|
483
|
+
2. \u5408\u5E76\u540C\u4E00\u4E3B\u9898\u7684\u591A\u6761\u8BB0\u5F55\u3001\u5220\u6389\u5DF2\u8FC7\u65F6\u6216\u88AB\u540E\u7EED\u7ED3\u8BBA\u63A8\u7FFB\u7684\u5185\u5BB9\u3001\u628A\u5197\u957F\u7684\u8FC7\u7A0B\u6D53\u7F29\u4E3A\u7ED3\u8BBA\uFF0C\u80FD\u632A\u8FDB\u9879\u76EE\u6587\u6863\u7684\u7EC6\u8282\u5C31\u632A\u8D70\u3001\u8FD9\u91CC\u53EA\u7559\u6307\u9488\uFF1B
|
|
480
484
|
3. \u7528 \`memory_compact\` \u63D0\u4EA4\u7CBE\u7B80\u540E\u7684**\u5B8C\u6574**\u7248\u672C \u2014\u2014 \u5FC5\u987B\u4FDD\u7559\u4ECD\u7136\u6709\u6548\u7684\u7ED3\u8BBA\u3001\u9879\u76EE\u7EA6\u5B9A\u4E0E\u8E29\u5751\u7ECF\u9A8C\u3002`);let o=n?.recentDaily?.trim();if(o){let a=o.length>or?`${o.slice(-or)}
|
|
481
485
|
\u2026\uFF08\u5DF2\u622A\u65AD\uFF0C\u53EF\u7528 memory_read \u67E5\u770B\u5B8C\u6574\u5185\u5BB9\uFF09`:o;r+=`
|
|
482
486
|
|
|
483
487
|
### \u4ECA\u65E5\u65E5\u5FD7\uFF08\u8282\u9009\uFF09
|
|
484
|
-
${a}`}return r}var
|
|
488
|
+
${a}`}return r}var eo=v(require("path")),El=new Set(["read_file","list_dir","glob","grep"]),Pl=/(^|\/)(\.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,ar=400,Rl=.5,En=1e6,Ml=4,Il=1,Dl=new Set(["read_file","list_dir","glob","grep"]),Ol=8,Ll=4e4,Pn=2e4,Nl=60,jl=16,Bl=4,Ul="[\u7CFB\u7EDF] \u672C\u6B21\u8C03\u7528\u5DF2\u8DF3\u8FC7",Fl=12,Qi=120,lr=class n{provider;config;cwd;events;systemPrompt;warnedTightContext=!1;history=[];activeModel;tools;systemPromptOverride;maxToolRoundsOverride;sessionFile;todos=[];deviceBridge;pendingMemoryNotices=[];constructor(e,r,s,i,o,a){this.provider=e,this.config=r,this.cwd=s,this.events=i,this.activeModel=o??je(r),this.tools=a?.tools,this.systemPromptOverride=a?.systemPrompt,this.maxToolRoundsOverride=a?.maxToolRounds,this.sessionFile=a?.sessionFile,this.systemPrompt=this.composeSystemPrompt()}getActiveModel(){return this.activeModel}composeSystemPrompt(){return this.systemPromptOverride?this.systemPromptOverride:(this.autoCompactMemory(),Zi(this.cwd,this.config.systemPromptExtra,ts(this.cwd),Xe(this.cwd),this.config.memoryMaxChars))}autoCompactMemory(){let e=this.config.memoryMaxChars??me,r=Tt(this.cwd,e);if(!r||r.removedDuplicates===0&&r.removedOldest===0)return;let s=[];r.removedDuplicates>0&&s.push(`\u53BB\u9664 ${r.removedDuplicates} \u6761\u91CD\u590D\u8BB0\u5F55`),r.removedOldest>0&&s.push(`\u88C1\u526A ${r.removedOldest} \u6761\u6700\u65E7\u7684\u8FFD\u52A0\u8BB0\u5F55`),this.pendingMemoryNotices.push(`\u957F\u671F\u8BB0\u5FC6\u5DF2\u81EA\u52A8\u7CBE\u7B80\uFF08${s.join("\u3001")}\uFF0C${r.before} \u2192 ${r.after} \u5B57\u7B26\uFF09\u3002\u6309\u4E3B\u9898\u6574\u7406\u7684\u7A33\u5B9A\u5C0F\u8282\u4E0D\u53D7\u81EA\u52A8\u88C1\u526A\u5F71\u54CD\uFF1B\u82E5\u9700\u8981\u66F4\u5F7B\u5E95\u7684\u538B\u7F29\uFF0C\u53EF\u8BA9\u7384\u732A\u7528 memory_compact \u91CD\u5199\u4E3A\u7CBE\u7B80\u7248\u672C\u3002`)}get messages(){return this.history}reset(){this.history=[],this.todos.length>0&&(this.todos=[],this.events.onTodos?.([]))}appendHistory(e){for(let r of e)this.history.push(r);this.sessionFile&&cn(this.sessionFile,e)}restoreSession(e,r){this.history=[...e],this.sessionFile=r,cn(r,e)}getTodos(){return this.todos}setDeviceBridge(e){this.deviceBridge=e}todoStore(){return{get:()=>this.todos,set:e=>{let r=!1;this.todos=e.map(s=>s.status!=="in_progress"?s:r?{...s,status:"pending"}:(r=!0,s)),this.events.onTodos?.(this.todos)}}}get messageCount(){return this.history.length}getCwd(){return this.cwd}setCwd(e){this.cwd=e,this.systemPrompt=this.composeSystemPrompt()}abortReason;async run(e,r,s){this.abortReason=void 0;let i=e;if(this.pendingMemoryNotices.length>0){for(let x of this.pendingMemoryNotices)this.events.onNotice?.(x);this.pendingMemoryNotices=[]}if(!this.warnedTightContext&&Ur(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 x=await this.analyzeIntent(e,r);if(r?.aborted){this.events.onStatus("\u5DF2\u4E2D\u65AD");return}x?(i=x,this.events.onIntent?.(x,e)):this.events.onNotice?.("\u610F\u56FE\u5206\u6790\u672A\u8FD4\u56DE\u5185\u5BB9\uFF0C\u5DF2\u6309\u539F\u59CB\u8F93\u5165\u7EE7\u7EED\u3002")}let o=!!(s&&s.length>0),a=[{role:"user",content:o&&!i.trim()?ke:i,images:o?s:void 0}],l=Math.max(1,Math.floor(this.maxToolRoundsOverride??this.config.maxToolRounds)||1),c=()=>{this.appendHistory(a),this.trimHistory()},u=x=>{let P=new Map;for(let w of a)for(let b of w.toolCalls??[])P.set(b.id,b.arguments);let z=[];for(let w of a){if(w.role!=="tool"||w.content.startsWith(Ul))continue;let b=P.get(w.toolCallId??"")??"",k=b.length>Qi?`${b.slice(0,Qi)}\u2026`:b;z.push(`${w.name??"\u5DE5\u5177"}(${k})`)}if(z.length===0)return null;let R=z.slice(0,Fl).map(w=>`\xB7 ${w}`);return z.length>R.length&&R.push(`\xB7 \u2026\u7B49\u5171 ${z.length} \u6B21\u8C03\u7528`),{role:"system",content:`[\u4E0A\u4E00\u8F6E\u5DF2\u4E2D\u6B62] \u4E0A\u4E00\u8F6E${x}\uFF0C\u6CA1\u6709\u7ED9\u51FA\u7ED3\u8BBA\uFF0C\u8BE5\u8F6E\u5BF9\u8BDD\u5DF2\u4F5C\u5E9F\u3002
|
|
485
489
|
\u4E2D\u6B62\u524D**\u5DF2\u7ECF\u771F\u5B9E\u6267\u884C**\u8FC7\u7684\u64CD\u4F5C\uFF08\u526F\u4F5C\u7528\u4ECD\u7136\u5B58\u5728\uFF0C\u4E0D\u8981\u91CD\u590D\u6267\u884C\uFF09\uFF1A
|
|
486
490
|
`+R.join(`
|
|
487
491
|
`)+`
|
|
488
|
-
\u8BF7\u76F4\u63A5\u56DE\u5E94\u7528\u6237\u6700\u65B0\u7684\u6D88\u606F\uFF0C\u4E0D\u8981\u63A5\u7740\u5B8C\u6210\u88AB\u4E2D\u6B62\u7684\u65E7\u4EFB\u52A1\u3002`}},
|
|
492
|
+
\u8BF7\u76F4\u63A5\u56DE\u5E94\u7528\u6237\u6700\u65B0\u7684\u6D88\u606F\uFF0C\u4E0D\u8981\u63A5\u7740\u5B8C\u6210\u88AB\u4E2D\u6B62\u7684\u65E7\u4EFB\u52A1\u3002`}},p=x=>{let P=u(x);a.length=0,P&&(this.appendHistory([P]),this.trimHistory())},d="",h=0,m=new Map,f=0,y=0,g=!1,S=!1,$=(x,P)=>g||S||!Dl.has(x)||(f++,y+=P.length,f<Ol&&y<Ll)?"":(g=!0,this.events.onStatus("\u5EFA\u8BAE\u6539\u7528\u5B50\u4EE3\u7406",`\u672C\u8F6E\u5DF2\u8C03\u7814 ${f} \u6B21`),`
|
|
489
493
|
|
|
490
494
|
[\u7CFB\u7EDF\u63D0\u9192] \u672C\u8F6E\u4F60\u5DF2\u7ECF\u505A\u4E86 ${f} \u6B21\u53EA\u8BFB\u8C03\u7814\uFF08\u7D2F\u8BA1\u7EA6 ${Math.round(y/1e3)}k \u5B57\u7B26\uFF09\uFF0C\u8FD9\u4E9B\u5185\u5BB9\u4F1A\u4E00\u76F4\u5360\u7528\u4F60\u7684\u4E0A\u4E0B\u6587\u7A97\u53E3\u3002
|
|
491
495
|
\xB7 \u82E5\u63A5\u4E0B\u6765\u8FD8\u6709**\u4E92\u4E0D\u4F9D\u8D56**\u7684\u8C03\u7814\u4EFB\u52A1\uFF0C\u8BF7\u6539\u7528 \`task\` \u6D3E\u751F \`code-explorer\` \u5B50\u4EE3\u7406\uFF08\u53EF\u4E00\u6B21\u5E76\u5217\u591A\u4E2A\u3001\u5E76\u884C\u6267\u884C\uFF09\uFF0C\u53EA\u628A\u7ED3\u8BBA\u5E26\u56DE\u6765\uFF1B
|
|
492
|
-
\xB7 \u82E5\u53EA\u5269\u6536\u5C3E\u5DE5\u4F5C\uFF0C\u5FFD\u7565\u672C\u6761\u5373\u53EF\u3002`),A=0,H=l;try{for(let R=0;;R++){if(R>=H){if(r?.aborted){
|
|
496
|
+
\xB7 \u82E5\u53EA\u5269\u6536\u5C3E\u5DE5\u4F5C\uFF0C\u5FFD\u7565\u672C\u6761\u5373\u53EF\u3002`),A=0,H=l;try{for(let R=0;;R++){if(R>=H){if(r?.aborted){p("\u88AB\u7528\u6237\u4E2D\u65AD"),this.events.onStatus("\u5DF2\u4E2D\u65AD");return}if(!(this.events.onRoundLimit?await this.events.onRoundLimit(R):!1))break;H+=l}if(r?.aborted){p("\u88AB\u7528\u6237\u4E2D\u65AD"),this.events.onStatus("\u5DF2\u4E2D\u65AD");return}this.trimHistory(),this.events.onStatus("\u601D\u8003\u4E2D",`\u7B2C ${R+1} \u8F6E`);let{text:w,toolCalls:b}=await this.streamAssistant(r,new Set,a);if(r?.aborted){p("\u88AB\u7528\u6237\u4E2D\u65AD"),this.events.onStatus("\u5DF2\u4E2D\u65AD");return}if(a.push({role:"assistant",content:w,toolCalls:b.length>0?b:void 0}),b.length===0){c(),this.events.onStatus("\u5C31\u7EEA");return}let k=0,G=[];for(;k<b.length;){let _=b[k],Ne=`${_.name}:${_.arguments}`;if(Ne===d?h++:(d=Ne,h=1),h>=Ml){if(A<Il){A++;let L=h;h=0,d="",this.skipToolCalls(a,b,k,ae=>ae===k?`[\u7CFB\u7EDF] \u672C\u6B21\u8C03\u7528\u5DF2\u8DF3\u8FC7\uFF1A\u5B83\u4E0E\u524D\u9762 ${L} \u6B21\u5B8C\u5168\u76F8\u540C\u3002`:"[\u7CFB\u7EDF] \u672C\u6B21\u8C03\u7528\u5DF2\u8DF3\u8FC7\uFF1A\u540C\u4E00\u8F6E\u5185\u7684\u91CD\u590D\u8C03\u7528\u89E6\u53D1\u4E86\u81EA\u6211\u4FEE\u6B63\u3002"),a.push({role:"user",content:`[\u7CFB\u7EDF\u68C0\u6D4B] \u4F60\u8FDE\u7EED ${L} \u6B21\u8C03\u7528\u4E86 \`${_.name}\`\uFF08\u53C2\u6570\u5B8C\u5168\u76F8\u540C\uFF09\uFF0C\u4F46\u4EFB\u52A1\u5E76\u6CA1\u6709\u56E0\u6B64\u63A8\u8FDB\u3002
|
|
493
497
|
|
|
494
498
|
\u8BF7\u5148\u505C\u4E0B\u6765\u5206\u6790\uFF0C\u4E0D\u8981\u7EE7\u7EED\u8C03\u7528\u5DE5\u5177\uFF1A
|
|
495
499
|
1. \u8FD9\u4E2A\u8C03\u7528\u4E3A\u4EC0\u4E48\u6CA1\u6709\u63A8\u8FDB\u4EFB\u52A1\uFF1F\u5B83\u7684\u8FD4\u56DE\u503C\u91CC\u662F\u4E0D\u662F**\u5DF2\u7ECF**\u6709\u4F60\u9700\u8981\u7684\u5168\u90E8\u4FE1\u606F\uFF1F
|
|
496
500
|
2. \u4EFB\u52A1\u76EE\u524D\u5B9E\u9645\u5B8C\u6210\u5230\u54EA\u4E00\u6B65\u4E86\uFF1F\u628A\u5DF2\u7ECF\u505A\u5B8C\u7684\u90E8\u5206\u5217\u51FA\u6765\u3002
|
|
497
501
|
3. \u63A5\u4E0B\u6765\u5E94\u8BE5\u505A\u4EC0\u4E48**\u4E0D\u540C**\u7684\u4E8B\uFF1F
|
|
498
502
|
|
|
499
|
-
\u5206\u6790\u5B8C\u5C31\u6309\u65B0\u65B9\u6848\u7EE7\u7EED\uFF0C\u4E0D\u8981\u518D\u505A\u540C\u4E00\u4E2A\u8C03\u7528\u3002`}),this.events.onStatus("\u81EA\u6211\u4FEE\u6B63",`\u5206\u6790 ${
|
|
503
|
+
\u5206\u6790\u5B8C\u5C31\u6309\u65B0\u65B9\u6848\u7EE7\u7EED\uFF0C\u4E0D\u8981\u518D\u505A\u540C\u4E00\u4E2A\u8C03\u7528\u3002`}),this.events.onStatus("\u81EA\u6211\u4FEE\u6B63",`\u5206\u6790 ${_.name} \u7684\u91CD\u590D`),this.events.onNotice?.(`\u68C0\u6D4B\u5230\u8FDE\u7EED ${L} \u6B21\u91CD\u590D\u8C03\u7528\uFF08${_.name}\uFF09\uFF0C\u5DF2\u8BF7\u6C42\u6A21\u578B\u81EA\u884C\u5206\u6790\u539F\u56E0\u5E76\u8C03\u6574\u65B9\u6848\u3002`);break}this.skipToolCalls(a,b,k,()=>"[\u7CFB\u7EDF] \u672C\u6B21\u8C03\u7528\u5DF2\u8DF3\u8FC7\uFF1A\u672C\u8F6E\u56E0\u91CD\u590D\u8C03\u7528\u800C\u4E2D\u6B62\u3002"),c(),this.events.onStatus("\u5DF2\u4E2D\u6B62","\u91CD\u590D\u8C03\u7528\u4E14\u81EA\u6211\u4FEE\u6B63\u65E0\u6548"),this.events.onNotice?.(`\u68C0\u6D4B\u5230\u518D\u6B21\u8FDE\u7EED ${h} \u6B21\u5B8C\u5168\u76F8\u540C\u7684\u5DE5\u5177\u8C03\u7528\uFF08${_.name}\uFF09\u3002\u6B64\u524D\u5DF2\u8BF7\u6C42\u8FC7\u81EA\u6211\u4FEE\u6B63\uFF0C\u4F46\u5B83\u6CA1\u6709\u8C03\u6574\u8FC7\u6765\uFF0C\u6545\u4E2D\u6B62\u672C\u8F6E\u3002
|
|
500
504
|
\xB7 \u8FD9\u901A\u5E38\u610F\u5473\u7740\u4E0A\u4E0B\u6587\u88AB\u88C1\u5F97\u592A\u591A\u3001\u5B83\u770B\u4E0D\u5230\u81EA\u5DF1\u521A\u505A\u8FC7\u4EC0\u4E48
|
|
501
505
|
\xB7 \u53EF\u8C03\u5927\u8BE5\u6A21\u578B\u7684\u4E0A\u4E0B\u6587\u7A97\u53E3\uFF1Axzh model context <id> <\u5927\u5C0F>
|
|
502
|
-
\xB7 \u4E5F\u53EF\u4EE5\u628A\u4EFB\u52A1\u62C6\u5C0F\uFF0C\u6216\u76F4\u63A5\u8BF4\u300C\u4E0D\u8981\u91CD\u590D\u8C03\u7528 ${
|
|
506
|
+
\xB7 \u4E5F\u53EF\u4EE5\u628A\u4EFB\u52A1\u62C6\u5C0F\uFF0C\u6216\u76F4\u63A5\u8BF4\u300C\u4E0D\u8981\u91CD\u590D\u8C03\u7528 ${_.name}\u300D`),this.abortReason="\u9677\u5165\u91CD\u590D\u8C03\u7528\uFF08\u81EA\u6211\u4FEE\u6B63\u65E0\u6548\uFF09";return}if(this.isParallelTool(_.name)){let L=[_],ae=k+1;for(;ae<b.length&&L.length<this.parallelLimit()&&this.isParallelTool(b[ae].name)&&!L.some(We=>We.name===b[ae].name&&We.arguments===b[ae].arguments);)L.push(b[ae]),ae++;if(L.length>1){for(let ye=1;ye<L.length;ye++)d=`${L[ye].name}:${L[ye].arguments}`,h=1;this.events.onStatus("\u5E76\u884C\u6267\u884C",`${L.length} \u4E2A\u5B50\u4EE3\u7406`);let We=await this.runToolBatch(L,r);for(let ye=0;ye<L.length;ye++){let Ge=L[ye],Sr=We[ye];if(Ge.name==="task"&&(S=!0),Sr.ok){let Wn=`${Ge.name}:${Ge.arguments}`;m.set(Wn,(m.get(Wn)??0)+1)}a.push({role:"tool",content:Sr.content,toolCallId:Ge.id,name:Ge.name}),this.events.onToolEnd(Ge,Sr)}if(r?.aborted){p("\u88AB\u7528\u6237\u4E2D\u65AD"),this.events.onStatus("\u5DF2\u4E2D\u65AD");return}k=ae;continue}}let $e=await this.runTool(_,r);$e.ok&&m.set(Ne,(m.get(Ne)??0)+1);let xr=$e.content;if(h>=2&&$e.ok){let L=[...m.entries()].map(([ae,We])=>`${ae.split(":")[0]}\xD7${We}`).join("\u3001");xr+=`
|
|
503
507
|
|
|
504
|
-
[\u7CFB\u7EDF\u63D0\u9192] \u8FD9\u662F\u8FDE\u7EED\u7B2C ${
|
|
508
|
+
[\u7CFB\u7EDF\u63D0\u9192] \u8FD9\u662F\u8FDE\u7EED\u7B2C ${h} \u6B21\u8C03\u7528 \`${_.name}\`\uFF0C\u53C2\u6570\u4E0E\u8FD4\u56DE\u7ED3\u679C\u90FD\u4E0E\u4E0A\u4E00\u6B21\u5B8C\u5168\u76F8\u540C \u2014\u2014 **\u8FD9\u4E00\u6B65\u5DF2\u7ECF\u5B8C\u6210\u4E86\uFF0C\u4E0D\u8981\u91CD\u590D**\u3002
|
|
505
509
|
\u672C\u8F6E\u5DF2\u6210\u529F\u6267\u884C\u7684\u8C03\u7528\uFF1A${L}
|
|
506
|
-
\u8BF7\u76F4\u63A5\u8FDB\u884C\u4E0B\u4E00\u4E2A\u672A\u5B8C\u6210\u7684\u90E8\u5206\uFF1B\u82E5\u4EFB\u52A1\u672C\u8EAB\u5DF2\u5B8C\u6210\uFF0C\u8BF7\u76F4\u63A5\u7ED9\u51FA\u603B\u7ED3\u3002`,this.events.onStatus("\u63D0\u9192\u91CD\u590D",`${
|
|
510
|
+
\u8BF7\u76F4\u63A5\u8FDB\u884C\u4E0B\u4E00\u4E2A\u672A\u5B8C\u6210\u7684\u90E8\u5206\uFF1B\u82E5\u4EFB\u52A1\u672C\u8EAB\u5DF2\u5B8C\u6210\uFF0C\u8BF7\u76F4\u63A5\u7ED9\u51FA\u603B\u7ED3\u3002`,this.events.onStatus("\u63D0\u9192\u91CD\u590D",`${_.name} \xD7${h}`)}if(_.name==="task"&&(S=!0),xr+=$(_.name,$e.content),a.push({role:"tool",content:xr,toolCallId:_.id,name:_.name}),$e.images&&$e.images.length>0&&G.push({role:"user",content:`\uFF08\u4E0A\u9762 ${_.name} \u7684\u8FD4\u56DE\u9644\u5E26\u4E86 ${$e.images.length} \u5F20\u56FE\u7247\uFF09`,images:$e.images}),this.events.onToolEnd(_,$e),r?.aborted){p("\u88AB\u7528\u6237\u4E2D\u65AD"),this.events.onStatus("\u5DF2\u4E2D\u65AD");return}k++}G.length>0&&a.push(...G)}c(),this.events.onStatus("\u5DF2\u8FBE\u5DE5\u5177\u8C03\u7528\u4E0A\u9650",`\u5171 ${H} \u8F6E`);let x=new Map;for(let R of a)for(let w of R.toolCalls??[])x.set(w.name,(x.get(w.name)??0)+1);let P=[...x.values()].reduce((R,w)=>R+w,0),z=[...x.entries()].sort((R,w)=>w[1]-R[1]).map(([R,w])=>`${R} \xD7${w}`).join("\u3001");this.events.onNotice?.(`\u5DF2\u8FBE\u5DE5\u5177\u8C03\u7528\u4E0A\u9650\uFF08\u5171 ${H} \u8F6E\uFF09\u800C\u4E2D\u6B62\u672C\u8F6E\u3002
|
|
507
511
|
`+(z?`\xB7 \u672C\u8F6E\u5171 ${P} \u6B21\u5DE5\u5177\u8C03\u7528\uFF1A${z}
|
|
508
512
|
`:"")+`\xB7 \u82E5\u6A21\u578B\u5728\u53CD\u590D\u505A\u540C\u4E00\u4EF6\u4E8B\uFF0C\u901A\u5E38\u65E9\u5DF2\u88AB\u91CD\u590D\u8C03\u7528\u68C0\u6D4B\u63D0\u524D\u4E2D\u6B62
|
|
509
513
|
`+(this.maxToolRoundsOverride?`\xB7 \u8BE5\u4E0A\u9650\u662F\u5B50\u4EE3\u7406\u7684\u9ED8\u8BA4\u503C\uFF08${l} \u8F6E\uFF09\uFF1A\u9700\u8981\u66F4\u957F\u8C03\u7814\u65F6\uFF0C\u8BF7\u5728\u4E3B\u5BF9\u8BDD\u91CC\u628A\u4EFB\u52A1\u62C6\u5C0F
|
|
510
514
|
`:`\xB7 \u60F3\u8C03\u5927\u4E0A\u9650\uFF1A\u7F16\u8F91 ${D()} \u91CC\u7684 maxToolRounds\uFF08\u5F53\u524D ${this.config.maxToolRounds}\uFF09
|
|
511
|
-
`)+"\xB7 \u6216\u628A\u4EFB\u52A1\u62C6\u6210\u66F4\u5C0F\u7684\u6B65\u9AA4\uFF0C\u6BCF\u6B65\u5355\u72EC\u63D0\u4E00\u6B21"),this.abortReason="\u8FBE\u5230\u5DE5\u5177\u8C03\u7528\u4E0A\u9650"}catch(x){if(
|
|
512
|
-
`)[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=new Set,s=[],i=1,o=!1){this.activeModel&&r.add(this.activeModel.id);let a=this.buildConversation(s,i);o&&(a=
|
|
513
|
-
`)[0])}});for await(let f of m){if(e?.aborted)break;switch(d=!0,f.type){case"text":if(u+=f.text,this.events.onText(f.text),u.length>
|
|
515
|
+
`)+"\xB7 \u6216\u628A\u4EFB\u52A1\u62C6\u6210\u66F4\u5C0F\u7684\u6B65\u9AA4\uFF0C\u6BCF\u6B65\u5355\u72EC\u63D0\u4E00\u6B21"),this.abortReason="\u8FBE\u5230\u5DE5\u5177\u8C03\u7528\u4E0A\u9650"}catch(x){if(p(r?.aborted?"\u88AB\u7528\u6237\u4E2D\u65AD":"\u56E0\u51FA\u9519\u4E2D\u6B62"),r?.aborted){this.events.onStatus("\u5DF2\u4E2D\u65AD"),this.abortReason="\u5DF2\u88AB\u7528\u6237\u4E2D\u65AD";return}throw x}}async analyzeIntent(e,r){let s=this.config.intent?.prompt?.trim()||is,i=os(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)if(c.type==="text"&&(o+=c.text,o.length>En))break}catch(l){return r?.aborted||this.events.onNotice?.(`\u610F\u56FE\u5206\u6790\u8BF7\u6C42\u5931\u8D25\uFF08${ce(l).split(`
|
|
516
|
+
`)[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=new Set,s=[],i=1,o=!1){this.activeModel&&r.add(this.activeModel.id);let a=this.buildConversation(s,i);o&&(a=jr(a));let l=[{role:"system",content:this.systemPrompt},...a],c=l.reduce((m,f)=>m+Qe(f),0),u="",p=[],d=!1,h=[...this.history,...s].some(m=>(m.images?.length??0)>0);try{let m=this.provider.chat({messages:l,tools:ir(this.tools),temperature:this.config.temperature,signal:e,onRetry:(f,y,g,S)=>{this.events.onStatus(S.resumed?`\u54CD\u5E94\u4E2D\u65AD\uFF0C\u6B63\u5728\u7EED\u4F20 (${f}/${y})`:`\u7F51\u7EDC\u4E2D\u65AD\uFF0C\u6B63\u5728\u91CD\u8BD5 (${f}/${y})`,ce(g).split(`
|
|
517
|
+
`)[0])}});for await(let f of m){if(e?.aborted)break;switch(d=!0,f.type){case"text":if(u+=f.text,this.events.onText(f.text),u.length>En)return this.events.onNotice?.(`\u6A21\u578B\u8F93\u51FA\u8D85\u8FC7 ${En} \u5B57\u7B26\uFF0C\u5DF2\u5F3A\u5236\u4E2D\u65AD \u2014\u2014 \u8FD9\u901A\u5E38\u610F\u5473\u7740\u6A21\u578B\u9677\u5165\u4E86\u91CD\u590D\u8F93\u51FA\uFF0C\u5EFA\u8BAE\u68C0\u67E5\u4E0A\u4E0B\u6587\u6216\u6362\u4E2A\u63D0\u793A\u3002`),{text:u,toolCalls:p};break;case"reasoning":this.events.onReasoning?.(f.text);break;case"tool_call":p.push(f.toolCall);break;case"done":f.usage?.inputTokens&&this.tokenCalibrator().observe(c,f.usage.inputTokens);break}}return{text:u,toolCalls:p}}catch(m){if(e?.aborted)throw m;if(!d&&!e?.aborted&&i>=1&&At(m))return this.events.onStatus("\u4E0A\u4E0B\u6587\u8D85\u9650","\u5DF2\u6536\u655B\u5386\u53F2\uFF0C\u6B63\u5728\u91CD\u8BD5"),this.streamAssistant(e,r,s,Rl,o);if(!d&&!e?.aborted&&!o&&h&&kt(m))return this.events.onStatus("\u6A21\u578B\u4E0D\u652F\u6301\u56FE\u7247","\u5DF2\u53BB\u6389\u56FE\u7247\u91CD\u8BD5"),this.events.onNotice?.(`\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u56FE\u7247\u8F93\u5165\uFF08${ce(m).split(`
|
|
514
518
|
`)[0]}\uFF09\uFF0C\u5DF2\u53BB\u6389\u56FE\u7247\u91CD\u8BD5\u4E00\u6B21\u3002
|
|
515
519
|
\xB7 \u60F3\u5F7B\u5E95\u907F\u514D\u8FD9\u6B21\u767D\u8BD5\uFF1Axzh model vision <id> off
|
|
516
520
|
\xB7 \u6216\u6539\u7528 glm-4v / qwen-vl / gpt-4o / claude / gemini \u7B49\u652F\u6301\u89C6\u89C9\u7684\u6A21\u578B`),this.streamAssistant(e,r,s,i,!0);if(this.handleModelFailure(m,r,!d))return this.streamAssistant(e,r,s,i);throw m}}handleModelFailure(e,r,s=!0){let i=this.activeModel;if(!i)return!1;r.add(i.id);let o=ce(e).split(`
|
|
517
|
-
`)[0];if(_r(e)&&!
|
|
521
|
+
`)[0];if(_r(e)&&!Er(e))return this.events.onNotice?.(`\u26A0 \u6A21\u578B ${i.id} \u7684\u914D\u7F6E\u53EF\u80FD\u6709\u8BEF\uFF08${o}\uFF09\u3002\u5DF2\u8DF3\u8FC7\u6A21\u578B\u56DE\u9000 \u2014\u2014 \u8BF7\u68C0\u67E5 provider\u3001API Key \u4E0E baseUrl\u3002`),!1;if(!s)return!1;let a=ls(this.config,i.id,r);if(!a)return this.events.onNotice?.(`\u26A0 ${i.id} \u8C03\u7528\u5931\u8D25\uFF08${o}\uFF09\uFF0C\u4E14\u5DF2\u914D\u7F6E\u7684\u6A21\u578B\u90FD\u8BD5\u8FC7\u4E86 \u2014\u2014 \u672C\u8F6E\u65E0\u6CD5\u5B8C\u6210\u3002`),!1;try{return this.provider=Ot(this.config,a),this.activeModel=a,cs(this.config,a),this.persistConfig(),this.events.onNotice?.(`\u21BB ${i.id} \u8C03\u7528\u5931\u8D25\uFF08${o}\uFF09\uFF0C\u5DF2\u5207\u6362\u5230 ${a.id} \u91CD\u8BD5\u3002`),this.events.onModelChange?.({provider:a.provider,model:a.model,reason:"\u8C03\u7528\u5931\u8D25\u56DE\u9000"}),!0}catch(l){return this.events.onNotice?.(`\u5207\u6362\u6A21\u578B\u5931\u8D25\uFF1A${ce(l)}`),!1}}persistConfig(){try{W(this.config)}catch{}}touchesSensitivePath(e,r){if(!El.has(e))return!1;let s="";try{let i=JSON.parse(r);typeof i.path=="string"&&(s=i.path)}catch{return!1}return s?Pl.test(eo.resolve(this.cwd,q(s))):!1}async runTool(e,r){let s=sr(e.name,this.tools);if(!s)return{ok:!1,content:`\u9519\u8BEF\uFF1A\u672A\u77E5\u5DE5\u5177 "${e.name}"`};if(this.config.confirmSensitiveRead===!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,todos:this.todoStore(),memoryMaxChars:this.config.memoryMaxChars,spawnAgent:a=>this.spawnSubAgent(a,r),deviceBridge:this.deviceBridge};return Vi(e.name,e.arguments,o,this.tools)}isParallelTool(e){return sr(e,this.tools)?.parallelSafe===!0}parallelLimit(){let e=Math.floor(this.config.maxParallelAgents??Bl);return!Number.isFinite(e)||e<1?1:Math.min(e,jl)}async runToolBatch(e,r){return Yi(e,this.parallelLimit(),async s=>{try{return await this.runTool(s,r)}catch(i){return{ok:!1,content:`\u5DE5\u5177\u6267\u884C\u5F02\u5E38\uFF1A${i instanceof Error?i.message:String(i)}`}}})}skipToolCalls(e,r,s,i){for(let o=s;o<r.length;o++)e.push({role:"tool",content:i(o),toolCallId:r[o].id,name:r[o].name})}async spawnSubAgent(e,r){let s=Wt(e.subagentName);if(!s)return{ok:!1,content:`\u9519\u8BEF\uFF1A\u672A\u77E5\u5B50\u4EE3\u7406 "${e.subagentName}"\u3002\u53EF\u7528\uFF1A${xt().join("\u3001")}`};let i="",o=e.description.length>24?`${e.description.slice(0,24)}\u2026`:e.description,a=`[${s.name}: ${o}]`,l={onText:h=>{i+=h},onToolStart:h=>{let m=h.arguments.length>120?`${h.arguments.slice(0,120)}\u2026`:h.arguments;this.events.onNotice?.(`${a} ${h.name} ${m}`)},onToolEnd:()=>{},onStatus:h=>this.events.onStatus(`\u5B50\u4EE3\u7406\uFF1A${h}`,o),onNotice:h=>this.events.onNotice?.(`${a} ${h}`),confirm:h=>this.events.confirm(h),onRoundLimit:async()=>!1};this.events.onStatus(`\u5B50\u4EE3\u7406\u6267\u884C\u4E2D\uFF08${s.name}\uFF09`,o);let c=new n(this.provider,this.config,this.cwd,l,this.activeModel,{tools:Xi(s.toolNames),systemPrompt:s.systemPrompt({cwd:this.cwd,description:e.description,prompt:e.prompt}),maxToolRounds:Nl});try{await c.run(e.prompt,r)}catch(h){let m=c.abortReason?`\uFF08${c.abortReason}\uFF09`:"";throw new Error(`${m}${h instanceof Error?h.message:String(h)}`)}let u=c.abortReason?`\u26A0 \u5B50\u4EE3\u7406${c.abortReason}\uFF0C\u4EE5\u4E0B\u5185\u5BB9\u53EF\u80FD\u4E0D\u5B8C\u6574 \u2014\u2014 \u5FC5\u8981\u65F6\u7528\u66F4\u805A\u7126\u7684 prompt \u91CD\u8BD5\uFF0C\u6216\u7531\u4F60\u81EA\u5DF1\u5B8C\u6210\u3002
|
|
518
522
|
|
|
519
|
-
`:"",
|
|
523
|
+
`:"",p=i.trim();if(!p)return{ok:!1,content:`${s.name} \u5B50\u4EE3\u7406\u672A\u8FD4\u56DE\u4EFB\u4F55\u7ED3\u8BBA${c.abortReason?`\uFF08${c.abortReason}\uFF09`:"\uFF08\u53EF\u80FD\u88AB\u4E2D\u65AD\u6216\u5728\u7ED9\u51FA\u7B54\u590D\u524D\u7528\u5C3D\u4E86\u8F6E\u6B21\uFF09"}\u3002\u53EF\u6539\u7528\u66F4\u805A\u7126\u7684 prompt \u91CD\u8BD5\uFF0C\u6216\u76F4\u63A5\u81EA\u5DF1\u5B8C\u6210\u3002`,summary:`\u5B50\u4EE3\u7406\u672A\u8FD4\u56DE\u7ED3\u8BBA\uFF1A${e.description}`};let d=p.length>Pn?`${p.slice(0,Pn)}
|
|
520
524
|
|
|
521
|
-
\u2026\uFF08\u5B50\u4EE3\u7406\u62A5\u544A\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD ${
|
|
525
|
+
\u2026\uFF08\u5B50\u4EE3\u7406\u62A5\u544A\u8FC7\u957F\uFF0C\u5DF2\u622A\u65AD ${p.length-Pn} \u5B57\u7B26\uFF09`:p;return{ok:!0,content:`${u}${s.name} \u5B50\u4EE3\u7406\u300C${e.description}\u300D\u7684\u7ED3\u8BBA\uFF1A
|
|
522
526
|
|
|
523
|
-
${d}`,summary:`${c.abortReason?`\u5B50\u4EE3\u7406\u4E2D\u6B62\uFF08${c.abortReason}\uFF09`:"\u5B50\u4EE3\u7406\u5B8C\u6210"}\uFF1A${e.description}`}}tokenCalibrator(){let e=this.activeModel?.id??this.provider.model;return
|
|
527
|
+
${d}`,summary:`${c.abortReason?`\u5B50\u4EE3\u7406\u4E2D\u6B62\uFF08${c.abortReason}\uFF09`:"\u5B50\u4EE3\u7406\u5B8C\u6210"}\uFF1A${e.description}`}}tokenCalibrator(){let e=this.activeModel?.id??this.provider.model;return zr(e)}conversationBudget(){let e=Br(this.activeModel?.contextWindow,this.activeModel?.model??"",this.systemPrompt);return Fr(e,this.tokenCalibrator().factor())}buildConversation(e,r=1){let s=Lr([...this.history,...e],this.history.length),i=s.length>ar?s.slice(-ar):s,o=Math.max(1,Math.floor(this.conversationBudget()*r));return Mt(i,o)}trimHistory(){let e=Mt(this.history,this.conversationBudget());if(e.length>ar&&(e=Rt(e.slice(e.length-ar))),e.length===this.history.length)return 0;let r=this.history.length-e.length;return this.history=e,r}};var so=require("child_process"),cr=5*1024*1024,to=1e4,zl=["$ErrorActionPreference='Stop'","Add-Type -AssemblyName System.Windows.Forms","$img=[System.Windows.Forms.Clipboard]::GetImage()","if($null -eq $img){exit 3}","$ms=New-Object System.IO.MemoryStream","$img.Save($ms,[System.Drawing.Imaging.ImageFormat]::Png)","[Console]::Out.Write([Convert]::ToBase64String($ms.ToArray()))"].join("; "),ro="[Console]::Out.Write((Get-Clipboard -Raw))",Jl=3;function Kl(){if(process.platform==="win32"){let n=e=>["-NoProfile","-NonInteractive",...e==="powershell.exe"?["-STA"]:[],"-Command",zl];return[{command:"powershell.exe",args:n("powershell.exe"),output:"base64",label:"PowerShell"},{command:"pwsh",args:n("pwsh"),output:"base64",label:"PowerShell 7"}]}return process.platform==="darwin"?[{command:"pngpaste",args:["-"],output:"binary",label:"pngpaste"},{command:"osascript",args:["-e","the clipboard as \xABclass PNGf\xBB"],output:"applescript-hex",label:"osascript"}]:[{command:"wl-paste",args:["--no-newline","--type","image/png"],output:"binary",label:"wl-paste\uFF08wl-clipboard\uFF09"},{command:"xclip",args:["-selection","clipboard","-t","image/png","-o"],output:"binary",label:"xclip"}]}function Hl(){return process.platform==="win32"?[{command:"powershell.exe",args:["-NoProfile","-NonInteractive","-Command",ro],output:"binary",label:"PowerShell"},{command:"pwsh",args:["-NoProfile","-NonInteractive","-Command",ro],output:"binary",label:"PowerShell 7"}]:process.platform==="darwin"?[{command:"pbpaste",args:[],output:"binary",label:"pbpaste"}]:[{command:"wl-paste",args:["--no-newline"],output:"binary",label:"wl-paste\uFF08wl-clipboard\uFF09"},{command:"xclip",args:["-selection","clipboard","-o"],output:"binary",label:"xclip"}]}function no(n){return n.length===0?Buffer.alloc(0):Buffer.concat(n)}function io(n){return new Promise(e=>{let r=!1,s=l=>{r||(r=!0,e(l))},i;try{i=(0,so.spawn)(n.command,n.args,{stdio:["ignore","pipe","ignore"],windowsHide:!0})}catch(l){s({missing:!0,code:null,stdout:Buffer.alloc(0),error:l instanceof Error?l.message:String(l)});return}let o=[],a=setTimeout(()=>{try{i.kill()}catch{}s({missing:!1,code:null,stdout:no(o),error:`\u8D85\u65F6\uFF08${to} ms\uFF09`})},to);i.stdout?.on("data",l=>o.push(l)),i.on("error",l=>{clearTimeout(a),s({missing:l.code==="ENOENT",code:null,stdout:Buffer.alloc(0),error:l.message})}),i.on("close",l=>{clearTimeout(a),s({missing:!1,code:l,stdout:no(o)})})})}function Rn(n){return n.length>=8&&n[0]===137&&n[1]===80&&n[2]===78&&n[3]===71?"image/png":n.length>=3&&n[0]===255&&n[1]===216&&n[2]===255?"image/jpeg":n.length>=6&&n.subarray(0,4).toString("latin1")==="GIF8"?"image/gif":n.length>=12&&n.subarray(0,4).toString("latin1")==="RIFF"&&n.subarray(8,12).toString("latin1")==="WEBP"?"image/webp":null}function ql(n){let e=/«data\s+\w{4}([0-9A-Fa-f]+)»/.exec(n);if(!e)return null;let r=e[1];return r.length===0||r.length%2!==0?null:Buffer.from(r,"hex")}function Wl(n,e){if(e.code!==0)return e.code===Jl?{empty:!0}:{error:`${n.label} \u9000\u51FA\u7801 ${e.code??"\u672A\u77E5"}${e.error?`\uFF08${e.error}\uFF09`:""}`};let r=null;if(n.output==="binary")r=e.stdout;else if(n.output==="base64"){let i=e.stdout.toString("utf8").replace(/\s+/g,"");r=i.length>0?Buffer.from(i,"base64"):null}else r=ql(e.stdout.toString("utf8"));if(!r||r.length===0)return{empty:!0};let s=Rn(r);return s?{image:{mimeType:s,base64:r.toString("base64"),bytes:r.length}}:{empty:!0}}async function Mn(){let n=[],e="";for(let r of Kl()){n.push(r.label);let s=await io(r);if(s.missing)continue;let i=Wl(r,s);if("image"in i)return{kind:"image",image:i.image};if("empty"in i)return{kind:"empty"};e=i.error}return{kind:"unavailable",detail:e||`\u672A\u627E\u5230\u53EF\u7528\u7684\u526A\u8D34\u677F\u5DE5\u5177\uFF08\u5DF2\u5C1D\u8BD5\uFF1A${n.join("\u3001")}\uFF09\u3002`+(process.platform==="linux"?" \u8BF7\u5B89\u88C5 wl-clipboard\uFF08Wayland\uFF09\u6216 xclip\uFF08X11\uFF09\u3002":"")}}async function oo(){for(let n of Hl()){let e=await io(n);if(e.missing||e.code!==0)continue;let r=e.stdout.toString("utf8");if(r.length>0)return r}return null}var ur=class{buffer="";inCodeBlock=!1;codeLang="";push(e){this.buffer+=e;let r=[],s=this.buffer.indexOf(`
|
|
524
528
|
`);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(`
|
|
525
|
-
`)}return r}peek(){if(!this.buffer)return"";let e=this.inCodeBlock,r=this.codeLang;try{return this.renderLine(this.buffer)}finally{this.inCodeBlock=e,this.codeLang=r}}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 ${this.renderInline(s.slice(2),t.gray)}${t.reset}`;let o=/^(\s*)([-*+]|\d+\.)\s+(.*)$/.exec(r);return o?`${o[1]}${t.blue}${o[2]}${t.reset} ${this.renderInline(o[3])}`:/^(-{3,}|\*{3,}|_{3,})$/.test(s)?`${t.gray}${"\u2500".repeat(20)}${t.reset}`:this.renderInline(r)}renderInline(e,r=""){let s=r?`${t.reset}${r}`:t.reset,i=e;return i=i.replace(/`([^`]+)`/g,(o,a)=>`${t.cyan}${a}${s}`),i=i.replace(/\*\*([^*]+)\*\*/g,(o,a)=>`${t.bold}${a}${s}`),i=i.replace(/(^|\s)\*([^*\s][^*]*)\*(?=\s|$)/g,"$1$2"),i}};var wt=require("child_process"),
|
|
529
|
+
`)}return r}peek(){if(!this.buffer)return"";let e=this.inCodeBlock,r=this.codeLang;try{return this.renderLine(this.buffer)}finally{this.inCodeBlock=e,this.codeLang=r}}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 ${this.renderInline(s.slice(2),t.gray)}${t.reset}`;let o=/^(\s*)([-*+]|\d+\.)\s+(.*)$/.exec(r);return o?`${o[1]}${t.blue}${o[2]}${t.reset} ${this.renderInline(o[3])}`:/^(-{3,}|\*{3,}|_{3,})$/.test(s)?`${t.gray}${"\u2500".repeat(20)}${t.reset}`:this.renderInline(r)}renderInline(e,r=""){let s=r?`${t.reset}${r}`:t.reset,i=e;return i=i.replace(/`([^`]+)`/g,(o,a)=>`${t.cyan}${a}${s}`),i=i.replace(/\*\*([^*]+)\*\*/g,(o,a)=>`${t.bold}${a}${s}`),i=i.replace(/(^|\s)\*([^*\s][^*]*)\*(?=\s|$)/g,"$1$2"),i}};var wt=require("child_process"),ut=v(require("fs")),pr=v(require("os")),oe=v(require("path"));var ao=2e3,Gl=8192,Xl=1200,He;function Vl(){if(He!==void 0)return He;He=null;try{(0,wt.spawnSync)("script",["--version"],{timeout:2e3,stdio:"ignore"}).status===0?He="linux":He=(0,wt.spawnSync)("script",["-h"],{timeout:2e3,stdio:"ignore"}).error?null:"bsd"}catch{He=null}return He}function Yl(n,e){let r=Vl();return r==="linux"?{file:"script",args:["-qec",e,"/dev/null"]}:r==="bsd"?{file:"script",args:["-q","/dev/null",n,"-c",e]}:{file:n,args:["-c",e]}}var hr=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=Yl(s,r),o;try{o=(0,wt.spawn)(i.file,i.args,{cwd:this.cwd,env:{...process.env,TERM:"xterm-256color",CLICOLOR_FORCE:"1",FORCE_COLOR:"1"},stdio:["pipe","pipe","pipe"],detached:!0})}catch(l){this.pushLine(`${t.red}\u2717 \u542F\u52A8\u5931\u8D25\uFF1A${l instanceof Error?l.message:String(l)}${t.reset}`),this.onChange();return}this.running=o;let a=l=>this.feed(l.toString("utf8"));o.stdout?.on("data",a),o.stderr?.on("data",a),o.on("error",l=>{this.flushPartial(),this.pushLine(`${t.red}\u2717 \u6267\u884C\u51FA\u9519\uFF1A${l.message}${t.reset}`),this.running=void 0,this.onChange()}),o.on("close",(l,c)=>{this.flushPartial(),c?this.pushLine(`${t.yellow}\u23F9 \u5DF2\u4E2D\u65AD\uFF08${c}\uFF09${t.reset}`):l===0?this.pushLine(`${t.gray}\u2713 \u5B8C\u6210${t.reset}`):this.pushLine(`${t.red}\u2717 \u9000\u51FA\u7801 ${l}${t.reset}`),this.running=void 0,this.onChange()}),this.onChange()}write(e){let r=this.running;if(!(!r?.stdin||r.stdin.destroyed))try{r.stdin.write(e)}catch{}}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")},Xl)}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=pr.homedir();else{let o=s.startsWith("~/")?oe.join(pr.homedir(),s.slice(2)):s;i=oe.isAbsolute(o)?o:oe.resolve(this.cwd,o)}try{if(!ut.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,`
|
|
526
530
|
`),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===`
|
|
527
|
-
`){this.pushLine(s),s="";continue}a==="\x07"||a==="\b"||(s+=a)}s.length>
|
|
531
|
+
`){this.pushLine(s),s="";continue}a==="\x07"||a==="\b"||(s+=a)}s.length>Gl&&(this.pushLine(s),s=""),this.parseState=i,this.parseSeq=o,this.partial=s,this.onChange()}pushLine(e){this.lines.push(e),this.lines.length>ao&&this.lines.splice(0,this.lines.length-ao)}flushPartial(){this.partial&&(this.pushLine(this.partial),this.partial="")}},Zl=["alias","cd","clear","cls","echo","exit","export","false","history","pwd","set","source","true","type","unalias","unset","which"],dr=null;function Ql(){if(dr)return dr;let n=new Set(Zl);for(let e of(process.env.PATH??"").split(oe.delimiter)){if(!e)continue;let r;try{r=ut.readdirSync(e)}catch{continue}for(let s of r)n.add(s)}return dr=[...n].sort(),dr}function ec(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 tc(n,e){return e?e==="~"||e.startsWith("~/")?oe.join(pr.homedir(),e.slice(1)):oe.isAbsolute(e)?e:oe.resolve(n,e):n}function lo(n,e){if(n.isDirectory())return!0;if(!n.isSymbolicLink())return!1;try{return ut.statSync(oe.join(e,n.name)).isDirectory()}catch{return!1}}function rc(n,e,r){let s=e.lastIndexOf("/"),i=s>=0?e.slice(0,s+1):"",o=e.slice(s+1),a=tc(n,i),l;try{l=ut.readdirSync(a,{withFileTypes:!0})}catch{return{dirPart:i,base:o,names:[]}}let c=l.filter(u=>r&&!lo(u,a)||u.name.startsWith(".")&&!o.startsWith(".")?!1:u.name.startsWith(o)).map(u=>u.name+(lo(u,a)?"/":"")).sort();return{dirPart:i,base:o,names:c}}function co(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 p="";(a.startsWith('"')||a.startsWith("'"))&&(p=a[0],a=a.slice(1));let d=a.startsWith("./")||a.startsWith("../")||a.startsWith("/")||a.startsWith("~"),h=l.trim().length===0&&!d&&c.length===0,m=$=>`${c}${p}${$}`,f="",y;if(h)y=Ql().filter($=>$.startsWith(a));else{let $=l.trim().split(/\s+/)[0]??"",A=rc(n,a,$==="cd");f=A.dirPart,y=A.names}if(y.length===0)return null;if(y.length===1){let $=f+y[0],A=$.endsWith("/"),H=p&&!A?p:"",x=A?"":" ",P=l+m($)+H+x;return{line:P+e.slice(r),cursor:P.length,candidates:[]}}let g=h?a:a.slice(f.length),S=ec(y);if(S.length>g.length){let $=l+m(f+S);return{line:$+e.slice(r),cursor:$.length,candidates:[]}}return{line:e,cursor:r,candidates:y.map($=>m(f+$))}}function fr(){try{process.stdout.write("\x1B[?2004l\x1B[>4m\x1B[?1000l\x1B[?1002l\x1B[?1006l\x1B[?7h"+t.reset+ne.show+qt.exitAlt)}catch{}try{process.stdin.isTTY&&process.stdin.isRaw&&process.stdin.setRawMode(!1)}catch{}}var mr=class n{options;agent;markdown=new ur;cwd;currentSessionFile;modelProviderLabel;modelLabel;lines=[];input="";inputCursor=0;scrollOffset=0;statusText="\u5C31\u7EEA";statusDetail="";todoItems=[];deviceBridge;pendingImages=new Map;imageSeq=0;suspended=!1;busy=!1;exited=!1;autoApprove;intentEnabled;history=[];historyIndex=-1;pendingConfirm;confirmChain=Promise.resolve();abortController;keyBuffer="";escTimer;projectDirCreated;needsRender=!1;mouseCapture;lastAnswerStart=0;streamingPreview="";termVisible=!0;termFocus=!1;termScroll=0;lastLeftWidth=0;lastPhysicalCount=0;lastPhysicalMap=[];screenToLogical=[];selectionAnchor;selectionHead;dragging=!1;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.mouseCapture=e.config.mouseCapture===!0,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.term=new hr(e.cwd,()=>this.scheduleRender());let r=wr(e.cwd);r.created&&(this.projectDirCreated=r.paths.dir);let s={onText:o=>this.handleTextDelta(o),onReasoning:()=>{},onToolStart:o=>this.handleToolStart(o),onToolEnd:(o,a)=>this.handleToolEnd(o,a),onStatus:(o,a)=>{this.statusText=o,this.statusDetail=a??"",this.scheduleRender()},onNotice:o=>this.handleNotice(o),onTodos:o=>{this.todoItems=o,this.scheduleRender()},onIntent:(o,a)=>this.handleIntent(o,a),onModelChange:o=>this.handleModelChange(o),confirm:o=>this.requestConfirm(o),onRoundLimit:o=>this.requestConfirm({tool:"round_limit",title:`\u5DF2\u8C03\u7528 ${o} \u8F6E\u5DE5\u5177\uFF0C\u662F\u5426\u7EE7\u7EED\uFF1F`,detail:`\u672C\u8F6E\u5BF9\u8BDD\u5DF2\u6267\u884C ${o} \u8F6E\u5DE5\u5177\u8C03\u7528\uFF08\u8FBE\u5230\u5F53\u524D\u4E0A\u9650\uFF09\uFF0C\u4EFB\u52A1\u53EF\u80FD\u5C1A\u672A\u5B8C\u6210\u3002
|
|
528
532
|
|
|
529
533
|
\xB7 \u6309 y \u7EE7\u7EED\uFF1A\u518D\u8FFD\u52A0 ${this.options.config.maxToolRounds} \u8F6E
|
|
530
534
|
\xB7 \u6309 n \u7ED3\u675F\uFF1A\u4FDD\u7559\u5DF2\u6709\u8FDB\u5C55\uFF0C\u672C\u8F6E\u5230\u6B64\u4E3A\u6B62
|
|
531
535
|
|
|
532
536
|
\u60F3\u6C38\u4E45\u8C03\u6574\u4E0A\u9650\uFF1A\u7F16\u8F91\u914D\u7F6E\u6587\u4EF6\u7684 maxToolRounds \u5B57\u6BB5\u3002`,danger:!1})},i=bt(e.cwd,K);this.currentSessionFile=i,this.agent=new lr(e.provider,e.config,e.cwd,s,e.activeModel,{sessionFile:i})}async start(){if(this.enterTerminal(),this.options.startupNotice){for(let e of this.options.startupNotice.split(`
|
|
533
|
-
`))this.lines.push(e);this.lines.push("")}this.mouseCapture&&this.lines.push(`${t.gray}\u9F20\u6807\u5DF2\u63A5\u7BA1\uFF1A\u6EDA\u8F6E\u6EDA\u52A8\u8F93\u51FA\u533A\uFF0C${t.reset}\u5728\u8F93\u51FA\u533A\u62D6\u62FD\u5373\u53EF\u9009\u4E2D\u5E76\u590D\u5236${t.gray}\uFF08\u677E\u5F00\u751F\u6548\uFF09\u3002${t.reset}`,`${t.gray}\u60F3\u7528\u7EC8\u7AEF\u539F\u751F\u7684\u6846\u9009\u4E0E\u53F3\u952E\u83DC\u5355\uFF1A\u6309\u4F4F ${t.reset}Shift${t.gray} \u62D6\u62FD\uFF0C\u6216\u8F93\u5165 ${t.reset}/mouse${t.gray}\u3002${t.reset}`,""),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(qt.enterAlt+ne.hide+"\x1B[?7l"+(this.mouseCapture?"\x1B[?1000h\x1B[?1002h\x1B[?1006h":"\x1B[?1000l\x1B[?1002l\x1B[?1006l")+"\x1B[?2004h"+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,r=this.lines.length-e;if(r<=0)return;this.lines.splice(0,r),this.lastAnswerStart>0&&(this.lastAnswerStart=Math.max(0,this.lastAnswerStart-r));let s=this.selectionAnchor,i=this.selectionHead;(s!==void 0||i!==void 0)&&(s!==void 0&&s<r||i!==void 0&&i<r?(this.selectionAnchor=void 0,this.selectionHead=void 0):(s!==void 0&&(this.selectionAnchor=s-r),i!==void 0&&(this.selectionHead=i-r)))}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[?2004l\x1B[>4m\x1B[?1000l\x1B[?1002l\x1B[?1006l\x1B[?7h"+t.reset+ne.show+qt.exitAlt)}extendedKeyRequest(){let e=process.env.TERM??"",r=process.env.TERM_PROGRAM??"";return process.env.XZH_KITTY_KEYS?"\x1B[>1u":process.env.KITTY_WINDOW_ID||/kitty|ghostty/i.test(e)||/kitty|ghostty/i.test(r)?"":"\x1B[>4;2m"}shutdown(){if(this.exited)return;this.exited=!0;let e=this.deviceBridge;this.deviceBridge=void 0,this.agent.setDeviceBridge(void 0),e?.stop(),this.term.dispose(),this.exitTerminal(),this.resolveExit?.()}handleTextDelta(e){let r=this.markdown.push(ge(e));r.length>0&&this.lines.push(...r),this.streamingPreview=this.markdown.peek(),this.scheduleRender()}handleToolStart(e){this.flushStreamingPreview();let r=
|
|
537
|
+
`))this.lines.push(e);this.lines.push("")}this.mouseCapture&&this.lines.push(`${t.gray}\u9F20\u6807\u5DF2\u63A5\u7BA1\uFF1A\u6EDA\u8F6E\u6EDA\u52A8\u8F93\u51FA\u533A\uFF0C${t.reset}\u5728\u8F93\u51FA\u533A\u62D6\u62FD\u5373\u53EF\u9009\u4E2D\u5E76\u590D\u5236${t.gray}\uFF08\u677E\u5F00\u751F\u6548\uFF09\u3002${t.reset}`,`${t.gray}\u60F3\u7528\u7EC8\u7AEF\u539F\u751F\u7684\u6846\u9009\u4E0E\u53F3\u952E\u83DC\u5355\uFF1A\u6309\u4F4F ${t.reset}Shift${t.gray} \u62D6\u62FD\uFF0C\u6216\u8F93\u5165 ${t.reset}/mouse${t.gray}\u3002${t.reset}`,""),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(qt.enterAlt+ne.hide+"\x1B[?7l"+(this.mouseCapture?"\x1B[?1000h\x1B[?1002h\x1B[?1006h":"\x1B[?1000l\x1B[?1002l\x1B[?1006l")+"\x1B[?2004h"+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,r=this.lines.length-e;if(r<=0)return;this.lines.splice(0,r),this.lastAnswerStart>0&&(this.lastAnswerStart=Math.max(0,this.lastAnswerStart-r));let s=this.selectionAnchor,i=this.selectionHead;(s!==void 0||i!==void 0)&&(s!==void 0&&s<r||i!==void 0&&i<r?(this.selectionAnchor=void 0,this.selectionHead=void 0):(s!==void 0&&(this.selectionAnchor=s-r),i!==void 0&&(this.selectionHead=i-r)))}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[?2004l\x1B[>4m\x1B[?1000l\x1B[?1002l\x1B[?1006l\x1B[?7h"+t.reset+ne.show+qt.exitAlt)}extendedKeyRequest(){let e=process.env.TERM??"",r=process.env.TERM_PROGRAM??"";return process.env.XZH_KITTY_KEYS?"\x1B[>1u":process.env.KITTY_WINDOW_ID||/kitty|ghostty/i.test(e)||/kitty|ghostty/i.test(r)?"":"\x1B[>4;2m"}shutdown(){if(this.exited)return;this.exited=!0;let e=this.deviceBridge;this.deviceBridge=void 0,this.agent.setDeviceBridge(void 0),e?.stop(),this.term.dispose(),this.exitTerminal(),this.resolveExit?.()}handleTextDelta(e){let r=this.markdown.push(ge(e));r.length>0&&this.lines.push(...r),this.streamingPreview=this.markdown.peek(),this.scheduleRender()}handleToolStart(e){this.flushStreamingPreview();let r=dc(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=ge(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}`;if(this.lines.push(` ${i}`),!r.ok&&!r.denied&&r.content?.trim()){let o=ge(r.content).trim().split(`
|
|
534
538
|
`),a=o.length<=6?o:[...o.slice(0,3),`\u2026\uFF08\u7701\u7565 ${o.length-6} \u884C\uFF09`,...o.slice(-3)];for(let l of a)this.lines.push(` ${t.gray}${l.slice(0,120)}${t.reset}`)}this.statusText="\u601D\u8003\u4E2D",this.scheduleRender()}handleNotice(e){this.flushStreamingPreview();let r=ge(e);for(let s of r.split(`
|
|
535
539
|
`))s.trim().length>0&&this.lines.push(`${t.gray} ${s}${t.reset}`);this.scheduleRender()}handleIntent(e,r){let o=ge(e).split(`
|
|
536
540
|
`).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${O(r.replace(/\s+/g," "),60)}${t.reset}`),this.scheduleRender()}handleModelChange(e){this.modelProviderLabel=we(e.provider)?.label??e.provider,this.modelLabel=e.model,this.lines.push(`${t.yellow}\u21C4 \u6A21\u578B\u5DF2\u5207\u6362\u4E3A ${e.provider}/${e.model}\uFF08${e.reason}\uFF09${t.reset}`),this.scheduleRender()}requestConfirm(e){let r=this.confirmChain.then(()=>new Promise(s=>{this.pendingConfirm={request:e,resolve:s,selected:!0},this.scheduleRender()}));return this.confirmChain=r.then(()=>{},()=>{}),r}handleData(e){process.env.XZH_DEBUG_KEYS&&this.logRawKeys(e),this.keyBuffer+=e,this.drainKeys()}logRawKeys(e){let r=[...e].map(i=>i.codePointAt(0).toString(16).padStart(2,"0")).join(" "),s=e.replace(/\x1b/g,"\\e").replace(/\r/g,"\\r").replace(/\n/g,"\\n");try{pe.appendFileSync(Oe.join(T(),"keys.log"),`${new Date().toISOString()} hex=[${r}] raw=${JSON.stringify(s)}
|
|
537
|
-
`)}catch{}}drainKeys(){for(;;){let e=this.readKey();if(e===null){this.armIncompleteTimer();return}if(this.escTimer&&(clearTimeout(this.escTimer),this.escTimer=void 0),this.handleKey(e),this.exited)return}}armIncompleteTimer(){this.escTimer&&clearTimeout(this.escTimer),this.escTimer=void 0;let e=this.keyBuffer;if(e.startsWith(qe)){this.escTimer=setTimeout(()=>{this.escTimer=void 0;let r=this.keyBuffer;r.startsWith(qe)&&(this.keyBuffer="",this.insertPastedText(r.slice(qe.length)))},
|
|
538
|
-
`)return;let r=
|
|
541
|
+
`)}catch{}}drainKeys(){for(;;){let e=this.readKey();if(e===null){this.armIncompleteTimer();return}if(this.escTimer&&(clearTimeout(this.escTimer),this.escTimer=void 0),this.handleKey(e),this.exited)return}}armIncompleteTimer(){this.escTimer&&clearTimeout(this.escTimer),this.escTimer=void 0;let e=this.keyBuffer;if(e.startsWith(qe)){this.escTimer=setTimeout(()=>{this.escTimer=void 0;let r=this.keyBuffer;r.startsWith(qe)&&(this.keyBuffer="",this.insertPastedText(r.slice(qe.length)))},sc);return}e.startsWith("\x1B")&&(this.escTimer=setTimeout(()=>{this.escTimer=void 0;let r=this.keyBuffer;this.keyBuffer="",r==="\x1B"&&this.handleKey("\x1B")},nc))}readKey(){let e=this.keyBuffer;if(e.length===0)return null;if(e.startsWith(qe)){let i=e.indexOf(Ct,qe.length);return i===-1?null:(this.keyBuffer=e.slice(i+Ct.length),e.slice(0,i+Ct.length))}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){if(e.startsWith(qe)&&e.endsWith(Ct)){this.insertPastedText(e.slice(qe.length,e.length-Ct.length));return}if(e===`
|
|
542
|
+
`)return;let r=lc(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"":this.pasteFromClipboard();return;case"\r":this.submit();return;case`
|
|
539
543
|
`:this.insertText(`
|
|
540
544
|
`);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=Number(e[3]),o=e[4]==="M",a=this.resolveTermWidth(process.stdout.columns||80),l=this.lastLeftWidth>0&&a>0&&s>this.lastLeftWidth+1;if(process.env.XZH_DEBUG_KEYS&&this.logRawKeys(`MOUSE btn=${r} col=${s} row=${i} ${o?"press":"release"} inTerm=${l} logical=${this.logicalAtScreenRow(i)} mapLen=${this.screenToLogical.length} anchor=${this.selectionAnchor} head=${this.selectionHead} drag=${this.dragging}`),o&&(r&64)===64){let u=(r&1)===0?3:-3;l?this.scrollTermBy(u):this.scrollBy(u);return}if(o&&(r&3)===0&&(r&32)===0){let c=this.logicalAtScreenRow(i);if(!l&&c!==void 0){this.selectionAnchor=c,this.selectionHead=c,this.dragging=!1,this.scheduleRender();return}l!==this.termFocus&&(this.termFocus=l,this.scheduleRender());return}if(o&&(r&32)===32&&this.selectionAnchor!==void 0){let c=this.logicalAtScreenRow(i);c!==void 0&&c!==this.selectionHead&&(this.selectionHead=c,this.dragging=!0,this.scheduleRender());return}!o&&this.selectionAnchor!==void 0&&(this.dragging?this.finishSelection():this.clearSelection())}logicalAtScreenRow(e){return this.screenToLogical[e-1]}clearSelection(){this.selectionAnchor!==void 0&&(this.selectionAnchor=void 0,this.selectionHead=void 0,this.dragging=!1,this.scheduleRender())}finishSelection(){let e=Math.min(this.selectionAnchor,this.selectionHead),r=Math.max(this.selectionAnchor,this.selectionHead),s=r-e+1,i=ge(this.lines.slice(e,r+1).join(`
|
|
541
|
-
`)).trim();if(this.dragging=!1,!i){this.scheduleRender();return}let o=Buffer.from(i,"utf8").toString("base64");process.stdout.write(`\x1B]52;c;${o}\x07`),this.lines.push(`${t.green}\u2713 \u5DF2\u590D\u5236 ${s} \u884C\u5230\u526A\u8D34\u677F${t.reset}${t.gray}\uFF08\u9009\u4E2D\u5904\u4ECD\u4FDD\u6301\u9AD8\u4EAE\uFF09\u3002\u82E5\u7C98\u8D34\u51FA\u6765\u662F\u7A7A\u7684\uFF0C\u8BF4\u660E\u672C\u7EC8\u7AEF\u7981\u7528\u4E86 OSC 52\uFF0C\u8BF7\u6539\u7528 ${t.reset}/copy${t.gray} \u6216 Shift+\u62D6\u62FD\u3002${t.reset}`),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){if(this.term.isRunning()){if(e===""||e===""){this.term.interrupt(),this.scheduleRender();return}this.term.write(e);return}switch(e){case"":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=
|
|
542
|
-
`).replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"");r&&this.insertText(r)}async pasteFromClipboard(){if(!(this.busy||this.termFocus)){this.statusText="\u8BFB\u53D6\u526A\u8D34\u677F",this.statusDetail="",this.scheduleRender();try{let e=await
|
|
543
|
-
\u63D0\u793A\uFF1A\u4E5F\u53EF\u4EE5\u76F4\u63A5\u628A\u56FE\u7247\u6587\u4EF6\u62D6\u8FDB\u7EC8\u7AEF\uFF0C\u628A\u8DEF\u5F84\u8D34\u5728\u8F93\u5165\u6846\u91CC\u3002`)}}finally{this.statusText="\u5C31\u7EEA",this.statusDetail="",this.scheduleRender()}}}async ensureClipboardTool(){let e=
|
|
545
|
+
`)).trim();if(this.dragging=!1,!i){this.scheduleRender();return}let o=Buffer.from(i,"utf8").toString("base64");process.stdout.write(`\x1B]52;c;${o}\x07`),this.lines.push(`${t.green}\u2713 \u5DF2\u590D\u5236 ${s} \u884C\u5230\u526A\u8D34\u677F${t.reset}${t.gray}\uFF08\u9009\u4E2D\u5904\u4ECD\u4FDD\u6301\u9AD8\u4EAE\uFF09\u3002\u82E5\u7C98\u8D34\u51FA\u6765\u662F\u7A7A\u7684\uFF0C\u8BF4\u660E\u672C\u7EC8\u7AEF\u7981\u7528\u4E86 OSC 52\uFF0C\u8BF7\u6539\u7528 ${t.reset}/copy${t.gray} \u6216 Shift+\u62D6\u62FD\u3002${t.reset}`),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){if(this.term.isRunning()){if(e===""||e===""){this.term.interrupt(),this.scheduleRender();return}this.term.write(e);return}switch(e){case"":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=co(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()}insertPastedText(e){let r=e.replace(/\r\n?/g,`
|
|
546
|
+
`).replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"");r&&this.insertText(r)}async pasteFromClipboard(){if(!(this.busy||this.termFocus)){this.statusText="\u8BFB\u53D6\u526A\u8D34\u677F",this.statusDetail="",this.scheduleRender();try{let e=await Mn();if(e.kind==="image"){this.attachClipboardImage(e.image);return}let r=await oo();if(r){this.insertText(r);return}if(e.kind==="unavailable"){if(await this.ensureClipboardTool()){let s=await Mn();if(s.kind==="image"){this.attachClipboardImage(s.image);return}}this.handleNotice(`\u672A\u80FD\u8BFB\u53D6\u526A\u8D34\u677F\uFF1A${e.detail}
|
|
547
|
+
\u63D0\u793A\uFF1A\u4E5F\u53EF\u4EE5\u76F4\u63A5\u628A\u56FE\u7247\u6587\u4EF6\u62D6\u8FDB\u7EC8\u7AEF\uFF0C\u628A\u8DEF\u5F84\u8D34\u5728\u8F93\u5165\u6846\u91CC\u3002`)}}finally{this.statusText="\u5C31\u7EEA",this.statusDetail="",this.scheduleRender()}}}async ensureClipboardTool(){let e=Tn();if(e.length===0)return!1;for(let r of e){if(await Ke(r))return!0;let s=r.install[Te()];if(!s)continue;if(!await this.requestConfirm({tool:"clipboard_install",title:`\u9700\u8981\u5B89\u88C5\u526A\u8D34\u677F\u5DE5\u5177\uFF1A${r.name}`,detail:`Ctrl+V \u7C98\u8D34\u56FE\u7247\u9700\u8981\u8BFB\u53D6\u7CFB\u7EDF\u526A\u8D34\u677F\uFF0C\u5F53\u524D\u7F3A\u5C11\u5B83\u3002
|
|
544
548
|
|
|
545
549
|
\u5B89\u88C5\u547D\u4EE4\uFF1A
|
|
546
550
|
${s}
|
|
547
551
|
|
|
548
552
|
\u6309 y \u7ACB\u5373\u5B89\u88C5\uFF08\u4F1A\u6682\u65F6\u79BB\u5F00\u754C\u9762\uFF0C\u4EE5\u4FBF\u8F93\u5165 sudo \u5BC6\u7801\uFF09\uFF1B\u6309 n \u8DF3\u8FC7\u3002`,danger:!1}))return this.handleNotice(`\u5DF2\u8DF3\u8FC7\u5B89\u88C5\u3002\u4E5F\u53EF\u4EE5\u624B\u52A8\u6267\u884C\uFF1A
|
|
549
|
-
${s}`),!1;this.handleNotice(`\u6B63\u5728\u5B89\u88C5 ${r.name} \u2026\uFF08\u53EF\u80FD\u9700\u8981\u8F93\u5165 sudo \u5BC6\u7801\uFF09`),this.suspendUi();let o;try{o=await
|
|
553
|
+
${s}`),!1;this.handleNotice(`\u6B63\u5728\u5B89\u88C5 ${r.name} \u2026\uFF08\u53EF\u80FD\u9700\u8981\u8F93\u5165 sudo \u5BC6\u7801\uFF09`),this.suspendUi();let o;try{o=await kn(s)}catch(a){o={ok:!1,output:String(a),timedOut:!1}}finally{this.resumeUi()}return o.ok?await Ke(r)?(this.handleNotice(`\u2713 ${r.name} \u5B89\u88C5\u5B8C\u6210`),!0):(this.handleNotice(`\u5B89\u88C5\u547D\u4EE4\u5DF2\u6267\u884C\uFF0C\u4F46\u68C0\u6D4B\u4ECD\u672A\u901A\u8FC7\uFF08\u53EF\u80FD\u9700\u8981\u91CD\u5F00\u7EC8\u7AEF\u5237\u65B0 PATH\uFF09\u3002
|
|
550
554
|
\u53EF\u624B\u52A8\u6267\u884C\uFF1A
|
|
551
555
|
${s}`),!1):(this.handleNotice(`\u5B89\u88C5\u5931\u8D25${o.timedOut?"\uFF08\u8D85\u65F6\uFF09":""}${o.output.trim()?`\uFF1A${o.output.trim()}`:""}
|
|
552
556
|
\u53EF\u624B\u52A8\u6267\u884C\uFF1A
|
|
553
557
|
${s}`),!1)}return!1}suspendUi(){this.suspended=!0,this.exitTerminal(),process.stdout.write(`${t.gray}[\u7384\u732A] \u6B63\u5728\u5B89\u88C5\u4F9D\u8D56\uFF0C\u5B89\u88C5\u5B8C\u6210\u540E\u4F1A\u81EA\u52A8\u56DE\u5230\u754C\u9762\u2026${t.reset}
|
|
554
558
|
|
|
555
|
-
`)}resumeUi(){this.enterTerminal(),this.suspended=!1,this.lastPhysicalCount=-1,this.lastTermPhysicalCount=-1,this.scheduleRender()}attachClipboardImage(e){if(e.bytes>cr){this.handleNotice(`\u56FE\u7247\u8FC7\u5927\uFF08${
|
|
559
|
+
`)}resumeUi(){this.enterTerminal(),this.suspended=!1,this.lastPhysicalCount=-1,this.lastTermPhysicalCount=-1,this.scheduleRender()}attachClipboardImage(e){if(e.bytes>cr){this.handleNotice(`\u56FE\u7247\u8FC7\u5927\uFF08${In(e.bytes)}\uFF09\uFF0C\u8D85\u51FA\u4E0A\u9650 ${In(cr)}\uFF0C\u5DF2\u5FFD\u7565\u3002`);return}if(!this.currentModelSupportsVision()){this.handleNotice(`\u5F53\u524D\u6A21\u578B ${this.modelLabel} \u672A\u6807\u6CE8\u652F\u6301\u56FE\u7247\u8F93\u5165\uFF0C\u672A\u9644\u52A0\u56FE\u7247\u3002
|
|
556
560
|
\xB7 \u82E5\u8BE5\u6A21\u578B\u786E\u5B9E\u652F\u6301\u89C6\u89C9\uFF1Axzh model vision <id> on
|
|
557
|
-
\xB7 \u6216\u8005\u5207\u6362\u5230 glm-4v / qwen-vl / gpt-4o / claude \u7B49\u652F\u6301\u89C6\u89C9\u7684\u6A21\u578B`);return}let r=++this.imageSeq;this.pendingImages.set(r,{mimeType:e.mimeType,data:e.base64}),this.insertText(`[\u56FE\u7247${r}]`),this.handleNotice(`\u5DF2\u9644\u52A0\u56FE\u7247${r}\uFF08${
|
|
558
|
-
`)){let o=
|
|
561
|
+
\xB7 \u6216\u8005\u5207\u6362\u5230 glm-4v / qwen-vl / gpt-4o / claude \u7B49\u652F\u6301\u89C6\u89C9\u7684\u6A21\u578B`);return}let r=++this.imageSeq;this.pendingImages.set(r,{mimeType:e.mimeType,data:e.base64}),this.insertText(`[\u56FE\u7247${r}]`),this.handleNotice(`\u5DF2\u9644\u52A0\u56FE\u7247${r}\uFF08${In(e.bytes)}\uFF0C${e.mimeType}\uFF09\uFF1B\u56DE\u8F66\u53D1\u9001\uFF0C\u9000\u683C\u5220\u6389\u5360\u4F4D\u5373\u53EF\u79FB\u9664\u3002`)}takePendingImages(e){let r=[],s=e.replace(/\[图片(\d+)\]/g,(i,o)=>{let a=this.pendingImages.get(Number(o));return a&&r.push(a),""}).replace(/[ \t]{2,}/g," ").trim();return this.pendingImages.clear(),{text:s,images:r}}absorbImagePaths(e){if(!/\.(png|jpe?g|gif|webp)\b/i.test(e))return{text:e,images:[]};let r=[],s=[];for(let i of e.split(`
|
|
562
|
+
`)){let o=cc(i),a=o?uc(o,this.cwd):null;a?r.push(a):s.push(i)}return{text:s.join(`
|
|
559
563
|
`).trim(),images:r}}currentModelSupportsVision(){let e=this.agent.getActiveModel();return e?Be(e):!1}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;if(r=Math.max(0,Math.min(this.input.length,r)),e>0&&r>0&&r<this.input.length){let s=this.input.charCodeAt(r-1);s>=55296&&s<=56319&&(r+=1)}else if(e<0&&r<this.input.length){let s=this.input.charCodeAt(r);s>=56320&&s<=57343&&(r-=1)}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.historyIndex=-1,e.startsWith("/")){this.history.push(e),this.pendingImages.clear(),this.handleCommand(e);return}let{text:r,images:s}=this.takePendingImages(e),i=this.absorbImagePaths(r);if(i.images.length>0&&(r=i.text,s=[...s,...i.images]),s.length>0&&!this.currentModelSupportsVision()&&(this.lines.push(`${t.yellow}\u26A0 \u5F53\u524D\u6A21\u578B ${this.modelLabel} \u672A\u6807\u6CE8\u652F\u6301\u56FE\u7247\u8F93\u5165\uFF0C\u5DF2\u5FFD\u7565 ${s.length} \u5F20\u56FE\u7247\u3002${t.reset}`),this.lines.push(`${t.gray} \xB7 \u82E5\u8BE5\u6A21\u578B\u786E\u5B9E\u652F\u6301\u89C6\u89C9\uFF1Axzh model vision <id> on${t.reset}`),this.lines.push(`${t.gray} \xB7 \u6216\u6539\u7528 glm-4v / qwen-vl / gpt-4o / claude \u7B49\u652F\u6301\u89C6\u89C9\u7684\u6A21\u578B${t.reset}`),s=[]),!r&&s.length===0){this.lines.push(`${t.gray}\uFF08\u6CA1\u6709\u53EF\u53D1\u9001\u7684\u5185\u5BB9\uFF09${t.reset}`),this.scheduleRender();return}this.history.push(r||`${s.length} \u5F20\u56FE\u7247`),this.lastAnswerStart=this.lines.length;let o=`${t.bgGreen}${t.black}${t.bold} \u276F ${t.reset}`,a=s.length>0?`${r}${r?`
|
|
560
564
|
`:""}[\u56FE\u7247 \xD7 ${s.length}]`:r,[l,...c]=a.split(`
|
|
561
|
-
`);this.lines.push(`${o} ${t.brightGreen}${t.bold}${l}${t.reset}`);for(let
|
|
562
|
-
`);this.lines.push(`${t.red}\u2717 ${d}${t.reset}`);for(let m of
|
|
563
|
-
`)).trim();if(!c){let d=r==="last"&&o===0&&s===this.lines?"\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 ${o} \u884C${d}\uFF09\u3002${t.reset}`);return}let u=Buffer.from(c,"utf8").toString("base64");process.stdout.write(`\x1B]52;c;${u}\x07`);let
|
|
564
|
-
`).length;this.lines.push(`${t.green}\u2713 \u5DF2\u590D\u5236${l}\uFF08${
|
|
565
|
-
`))i&&this.lines.push(`${t.gray} ${i}${t.reset}`)}async handleDeviceCommand(e){let[r,...s]=e.trim().split(/\s+/),i=s.join(" ").trim(),o=this.deviceBridge;switch(r){case"":case"status":{if(!o?.isRunning()&&!o?.status().autojs6){this.lines.push(`${t.yellow}\u8BBE\u5907\u6865\u672A\u542F\u52A8${t.reset}`),this.lines.push(`${t.gray} \xB7 \u8FDE\u63A5 AutoJs6\uFF08\u63A8\u8350\uFF09\uFF1A/device connect <\u624B\u673AIP>\uFF08\u624B\u673A\u672C\u673A\u8FD0\u884C\u65F6\u4E0D\u7528\u586B\uFF09${t.reset}`),this.lines.push(`${t.gray} \xB7 \u6216\u7B49 AutoX.js \u8FDE\u8FC7\u6765\uFF1A/device serve${t.reset}`);break}let a=o.status();this.lines.push(`${t.brightGreen}\u25CF${t.reset} \u8BBE\u5907\u6865\u8FD0\u884C\u4E2D ${t.gray}\u7AEF\u53E3 ${a.port}${t.reset}`),a.autojs6&&this.lines.push(`${t.gray} AutoJs6\uFF1A${t.reset}${a.autojs6.address} `+(a.autojs6.connected?`${t.brightGreen}\u5DF2\u8FDE\u63A5${t.reset}`:`${t.yellow}\u8FDE\u63A5\u4E2D/\u7B49\u5F85\u91CD\u8BD5${t.reset}`));for(let l of a.urls)this.lines.push(`${t.gray} \u624B\u673A\u7AEF AutoX.js \u586B\u5199\uFF1A${t.reset}${l}`);this.lines.push(`${t.gray} \u5DF2\u8FDE\u63A5\u8BBE\u5907\uFF1A${t.reset}${a.devices.length}`);for(let l of a.devices){let c=l.kind==="autojs6"?"AutoJs6":"AutoX.js";this.lines.push(` ${t.cyan}${l.name}${t.reset} ${t.gray}${l.id} \xB7 ${c}${t.reset}`)}break}case"connect":{if(o?.isRunning()||o?.status().autojs6){this.lines.push(`${t.yellow}\u8BBE\u5907\u6865\u5DF2\u5728\u8FD0\u884C${t.reset}${t.gray}\uFF08\u5148 /device stop \u518D\u8FDE\uFF09${t.reset}`);break}let a=
|
|
565
|
+
`);this.lines.push(`${o} ${t.brightGreen}${t.bold}${l}${t.reset}`);for(let p of c)this.lines.push(`${t.brightGreen}${t.bold}\u2502${t.reset} ${t.brightGreen}${p}${t.reset}`);this.lines.push(""),this.busy=!0,this.statusText="\u601D\u8003\u4E2D",this.statusDetail="",this.abortController=new AbortController,this.scheduleRender();let u={label:this.modelLabel};try{await this.agent.run(r,this.abortController.signal,s.length>0?s:void 0)}catch(p){let[d,...h]=ce(p).split(`
|
|
566
|
+
`);this.lines.push(`${t.red}\u2717 ${d}${t.reset}`);for(let m of h)this.lines.push(`${t.gray} ${m}${t.reset}`);this.lines.push(`${t.gray} \u672C\u6B21\u8BF7\u6C42\u4F7F\u7528\u7684\u6A21\u578B\uFF1A${this.modelProviderLabel} / ${u.label}${t.reset}`)}finally{let p=this.markdown.flush();p.length>0&&this.lines.push(...p),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"tools":this.printTools();break;case"device":this.handleDeviceCommand(i);break;case"copy":this.copyOutput(i);break;case"image":case"img":case"paste":this.pasteFromClipboard();break;case"mouse":this.toggleMouseCapture();break;case"reset":this.agent.reset(),this.currentSessionFile=bt(this.cwd,K),this.agent.restoreSession([],this.currentSessionFile),this.lines.push(`${t.gray}\u4F1A\u8BDD\u5DF2\u91CD\u7F6E\u3002${t.reset}`);break;case"undo":this.lines.push(ci(this.cwd));break;case"resume":this.handleResumeCommand(i);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{W(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{W(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":{this.lines.push(`${t.gray}\u5F53\u524D\u6A21\u578B\uFF1A${t.reset}${this.modelProviderLabel} / ${this.modelLabel}${t.reset}`);let o=U(this.options.config);o.length>0&&(this.lines.push(`${t.gray}\u5DF2\u914D\u7F6E\u6A21\u578B\uFF08\u6309\u56DE\u9000\u987A\u5E8F\uFF09\uFF1A${t.reset}`),o.forEach((a,l)=>{let c=a.model===this.modelLabel?" \u2190 \u5F53\u524D":"";this.lines.push(`${t.gray} ${l+1}. ${a.id}${c}${t.reset}`)})),this.lines.push(`${t.gray}\u7BA1\u7406\u6A21\u578B\uFF08\u65B0\u589E / \u5220\u9664\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()}handleResumeCommand(e){let r=un(this.cwd).filter(l=>l.file!==this.currentSessionFile);if(r.length===0){this.lines.push(`${t.gray}\u6CA1\u6709\u53EF\u6062\u590D\u7684\u5386\u53F2\u4F1A\u8BDD\u3002${t.reset}`);return}if(!e){this.lines.push(`${t.bold}\u5386\u53F2\u4F1A\u8BDD${t.reset} ${t.gray}(\u65B0\u7684\u5728\u524D\uFF0C\u8F93\u5165 /resume <\u7F16\u53F7> \u6062\u590D)${t.reset}`),r.slice(0,10).forEach((l,c)=>{let u=l.startedAt??"\u672A\u77E5\u65F6\u95F4";this.lines.push(` ${c+1}. ${t.cyan}${u}${t.reset} ${t.gray}\xB7 ${t.reset}${(l.bytes/1024).toFixed(1)} KB`)});return}let s=Number.parseInt(e,10)-1,i=Number.isInteger(s)?r[s]:void 0;if(!i){this.lines.push(`${t.yellow}\u65E0\u6548\u7F16\u53F7\uFF1A${e}\u3002\u5148\u8FD0\u884C /resume \u67E5\u770B\u5217\u8868\u3002${t.reset}`);return}let o=dn(i.file);if(o.length===0){this.lines.push(`${t.yellow}\u8BE5\u4F1A\u8BDD\u6587\u4EF6\u91CC\u6CA1\u6709\u53EF\u6062\u590D\u7684\u6D88\u606F\u3002${t.reset}`);return}let a=bt(this.cwd,K);this.currentSessionFile=a,this.agent.restoreSession(o,a),this.lines.push(`${t.green}\u2713 \u5DF2\u6062\u590D ${o.length} \u6761\u6D88\u606F\u7684\u5BF9\u8BDD\u5386\u53F2\u3002${t.reset}`,`${t.gray}\u7EE7\u7EED\u5BF9\u8BDD\u5373\u53EF\uFF1B\u6B64\u540E\u5185\u5BB9\u4F1A\u5199\u5165\u65B0\u7684\u4F1A\u8BDD\u6587\u4EF6\u3002${t.reset}`)}switchDirectory(e){let r=q(e.trim()),s=Oe.isAbsolute(r)?r:Oe.resolve(this.cwd,r);if(!pe.existsSync(s)){this.lines.push(`${t.red}\u2717 \u76EE\u5F55\u4E0D\u5B58\u5728\uFF1A${s}${t.reset}`),this.scheduleRender();return}if(!pe.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=pe.realpathSync(s)}catch{}this.cwd=i;let o=wr(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}`);let a=un(i).filter(u=>u.file!==this.currentSessionFile)[0],l=a?dn(a.file):[],c=bt(i,K);this.currentSessionFile=c,this.agent.restoreSession(l,c),l.length>0?this.lines.push(`${t.gray} \u5DF2\u8F7D\u5165\u8BE5\u9879\u76EE\u4E0A\u6B21\u4F1A\u8BDD\uFF08${l.length} \u6761\u6D88\u606F\uFF0C${a.startedAt??"\u672A\u77E5\u65F6\u95F4"}\uFF09\uFF0C\u63A5\u7740\u804A\u5373\u53EF\uFF1B\u539F\u5BF9\u8BDD\u5DF2\u5B58\u6863\uFF0C\u5207\u56DE\u540E /resume \u53EF\u627E\u56DE\u3002${t.reset}`):this.lines.push(`${t.gray} \u8BE5\u9879\u76EE\u8FD8\u6CA1\u6709\u5386\u53F2\u4F1A\u8BDD\uFF0C\u5168\u65B0\u5F00\u5C40\uFF1B\u540E\u7EED\u6587\u4EF6\u4E0E\u547D\u4EE4\u64CD\u4F5C\u5C06\u57FA\u4E8E\u8BE5\u76EE\u5F55\u3002${t.reset}`),this.scheduleRender()}toggleMouseCapture(){this.mouseCapture=!this.mouseCapture,this.options.config.mouseCapture=this.mouseCapture;try{W(this.options.config)}catch{}process.stdout.write(this.mouseCapture?"\x1B[?1000h\x1B[?1002h\x1B[?1006h":"\x1B[?1000l\x1B[?1002l\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\u4F46\u53F3\u952E\u83DC\u5355\u4E0E\u539F\u751F\u6846\u9009\u4F1A\u88AB\u63A5\u7BA1\uFF0C\u8981\u9009\u6587\u672C\u8BF7\u6309\u4F4F ${t.reset}Shift${t.gray} \u62D6\u62FD\u3002\u518D\u8F93\u5165 ${t.reset}/mouse${t.gray} \u5173\u95ED\u3002${t.reset}`:`${t.gray}\u9F20\u6807\u6355\u83B7\uFF1A${t.reset}${t.brightGreen}\u5173${t.reset}${t.gray} \u2014 \u9F20\u6807\u5168\u90E8\u529F\u80FD\u53EF\u7528\uFF08\u53F3\u952E\u83DC\u5355\u3001\u6846\u9009\u590D\u5236\u3001\u6EDA\u8F6E\u7531\u7EC8\u7AEF\u5904\u7406\uFF09\u3002\u6EDA\u52A8\u8F93\u51FA\u533A\u8BF7\u7528 ${t.reset}PgUp/PgDn${t.gray}\uFF0C\u6216\u7528 ${t.reset}/mouse${t.gray} \u6362\u56DE\u6EDA\u8F6E\u3002${t.reset}`)}copyOutput(e){let r=e.trim().toLowerCase(),s=this.lines,i="";(r==="term"||r.startsWith("term "))&&(s=this.term.visibleLines(),i="\u7EC8\u7AEF\u8F93\u51FA ",r=r.slice(4).trim());let o=s.length,a,l;if(r==="all")a=s.slice(),l="\u5168\u90E8";else if(r==="last")a=s===this.lines?this.lines.slice(Math.min(this.lastAnswerStart,o)):s.slice(-30),l=s===this.lines?"\u6700\u8FD1\u4E00\u6B21\u5BF9\u8BDD":"\u6700\u8FD1 30 \u884C";else if(/^\d+-\d+$/.test(r)){let[d,h]=r.split("-"),m=Math.max(1,Number(d)),f=Math.min(o,Number(h));if(m>f){this.lines.push(`${t.yellow}\u884C\u53F7\u8303\u56F4\u65E0\u6548\uFF1A${r}${t.reset}${t.gray}\uFF08${i||"\u8F93\u51FA\u533A"}\u5F53\u524D ${o} \u884C\uFF09${t.reset}`);return}a=s.slice(m-1,f),l=`\u7B2C ${m}-${f} \u884C`}else{let d=/^\d+$/.test(r)?Number(r):30;a=s.slice(-Math.max(1,d)),l=`\u6700\u8FD1 ${Math.min(Math.max(1,d),o)} \u884C`}l=i+l;let c=ge(a.join(`
|
|
567
|
+
`)).trim();if(!c){let d=r==="last"&&o===0&&s===this.lines?"\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 ${o} \u884C${d}\uFF09\u3002${t.reset}`);return}let u=Buffer.from(c,"utf8").toString("base64");process.stdout.write(`\x1B]52;c;${u}\x07`);let p=c.split(`
|
|
568
|
+
`).length;this.lines.push(`${t.green}\u2713 \u5DF2\u590D\u5236${l}\uFF08${p} \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}`)}createDeviceBridge(e){return new ze({port:e,baseDir:this.cwd,onStatus:r=>this.term.notice(`${t.gray}${r}${t.reset}`),onDeviceAttach:r=>{let s=r.kind==="autojs6"?"AutoJs6":"AutoX.js";this.handleNotice(`\u8BBE\u5907\u5DF2\u8FDE\u63A5\uFF1A${r.name}\uFF08${s}\uFF09`),this.term.notice(`${t.brightGreen}\u25CF${t.reset} \u8BBE\u5907\u5DF2\u8FDE\u63A5\uFF1A${t.bold}${r.name}${t.reset}${t.gray}\uFF08${s}\uFF09${t.reset}`)},onDeviceDetach:r=>{this.handleNotice(`\u8BBE\u5907\u5DF2\u65AD\u5F00\uFF1A${r.name}`),this.term.notice(`${t.yellow}\u25CB${t.reset} \u8BBE\u5907\u5DF2\u65AD\u5F00\uFF1A${r.name}`)},onLog:r=>this.term.notice(`${t.gray}[${r.device}]${t.reset} ${ge(r.text)}`)})}pushDeviceSetupGuide(e){let r=Jt(),s=Ht({where:nt()?"phone":"pc",abi:r.abi,address:e,localApk:Kt(r.abi)});this.lines.push(`${t.yellow}\u9700\u8981\u5148\u88C5 AutoJs6${t.reset}${t.gray}\uFF08${r.detail}\uFF09${t.reset}`);for(let i of s.split(`
|
|
569
|
+
`))i&&this.lines.push(`${t.gray} ${i}${t.reset}`)}async handleDeviceCommand(e){let[r,...s]=e.trim().split(/\s+/),i=s.join(" ").trim(),o=this.deviceBridge;switch(r){case"":case"status":{if(!o?.isRunning()&&!o?.status().autojs6){this.lines.push(`${t.yellow}\u8BBE\u5907\u6865\u672A\u542F\u52A8${t.reset}`),this.lines.push(`${t.gray} \xB7 \u8FDE\u63A5 AutoJs6\uFF08\u63A8\u8350\uFF09\uFF1A/device connect <\u624B\u673AIP>\uFF08\u624B\u673A\u672C\u673A\u8FD0\u884C\u65F6\u4E0D\u7528\u586B\uFF09${t.reset}`),this.lines.push(`${t.gray} \xB7 \u6216\u7B49 AutoX.js \u8FDE\u8FC7\u6765\uFF1A/device serve${t.reset}`);break}let a=o.status();this.lines.push(`${t.brightGreen}\u25CF${t.reset} \u8BBE\u5907\u6865\u8FD0\u884C\u4E2D ${t.gray}\u7AEF\u53E3 ${a.port}${t.reset}`),a.autojs6&&this.lines.push(`${t.gray} AutoJs6\uFF1A${t.reset}${a.autojs6.address} `+(a.autojs6.connected?`${t.brightGreen}\u5DF2\u8FDE\u63A5${t.reset}`:`${t.yellow}\u8FDE\u63A5\u4E2D/\u7B49\u5F85\u91CD\u8BD5${t.reset}`));for(let l of a.urls)this.lines.push(`${t.gray} \u624B\u673A\u7AEF AutoX.js \u586B\u5199\uFF1A${t.reset}${l}`);this.lines.push(`${t.gray} \u5DF2\u8FDE\u63A5\u8BBE\u5907\uFF1A${t.reset}${a.devices.length}`);for(let l of a.devices){let c=l.kind==="autojs6"?"AutoJs6":"AutoX.js";this.lines.push(` ${t.cyan}${l.name}${t.reset} ${t.gray}${l.id} \xB7 ${c}${t.reset}`)}break}case"connect":{if(o?.isRunning()||o?.status().autojs6){this.lines.push(`${t.yellow}\u8BBE\u5907\u6865\u5DF2\u5728\u8FD0\u884C${t.reset}${t.gray}\uFF08\u5148 /device stop \u518D\u8FDE\uFF09${t.reset}`);break}let a=nt(),l="",c=X;if(i){let d=/^(.*?)(?::(\d+))?$/.exec(i);l=(d?.[1]??i).trim();let h=d?.[2]?Number.parseInt(d[2],10):NaN;Number.isFinite(h)&&(c=h)}else a&&(l="127.0.0.1");if(!l){this.lines.push(`${t.gray}\u7528\u6CD5\uFF1A/device connect <\u624B\u673AIP>[:\u7AEF\u53E3]\uFF08\u9ED8\u8BA4 ${X}\uFF09${t.reset}`),this.pushDeviceSetupGuide();break}let u=this.createDeviceBridge(Me());try{await u.connectAutoJs6(l,c)}catch(d){this.lines.push(`${t.red}\u2717 \u8BBE\u5907\u6865\u542F\u52A8\u5931\u8D25\uFF1A${d instanceof Error?d.message:String(d)}${t.reset}`);break}this.deviceBridge=u,this.agent.setDeviceBridge(u),this.termVisible||(this.termVisible=!0),this.lines.push(`${t.brightGreen}\u25CF${t.reset} \u6B63\u5728\u8FDE\u63A5\u624B\u673A ${t.brightGreen}${l}:${c}${t.reset}${t.gray}\uFF08AutoJs6 \u670D\u52A1\u5668\u6A21\u5F0F\uFF09${t.reset}`);let p=!1;for(let d=0;d<20&&!p;d++)p=u.status().autojs6?.connected??!1,p||await new Promise(h=>setTimeout(h,150));if(p)this.lines.push(`${t.gray} \u5DF2\u8FDE\u63A5\u3002\u63A8\u9001\u811A\u672C\uFF1A/device run <\u6587\u4EF6>\uFF1B\u65E5\u5FD7\u663E\u793A\u5728\u53F3\u4FA7\u7EC8\u7AEF\u9762\u677F\u3002${t.reset}`);else{let d=u.status().autojs6?.retrying??!1;this.lines.push(d?`${t.yellow}\u6682\u65F6\u6CA1\u8FDE\u4E0A\uFF0C\u4ECD\u5728\u540E\u53F0\u6309\u9000\u907F\u91CD\u8BD5${t.reset}${t.gray}\uFF08/device stop \u53EF\u505C\u6B62\uFF09${t.reset}`:`${t.red}\u8FDE\u4E0D\u4E0A\u624B\u673A\uFF08\u5DF2\u505C\u6B62\u91CD\u8BD5\uFF09${t.reset}${t.gray} \u2014\u2014 \u6309\u4E0B\u9762\u6B65\u9AA4\u68C0\u67E5\u540E\uFF0C\u5148 /device stop \u518D\u91CD\u65B0 /device connect${t.reset}`),this.pushDeviceSetupGuide(`${l}:${c}`)}break}case"serve":case"start":{if(o?.isRunning()){this.lines.push(`${t.yellow}\u8BBE\u5907\u6865\u5DF2\u5728\u8FD0\u884C${t.reset}${t.gray}\uFF08\u7AEF\u53E3 ${o.getPort()}\uFF09${t.reset}`);break}let a=i?Number.parseInt(i,10):Me(),l=this.createDeviceBridge(Number.isFinite(a)&&a>0?a:Me());try{await l.start()}catch(c){this.lines.push(`${t.red}\u2717 \u8BBE\u5907\u6865\u542F\u52A8\u5931\u8D25\uFF1A${c instanceof Error?c.message:String(c)}${t.reset}`);break}this.deviceBridge=l,this.agent.setDeviceBridge(l),this.termVisible||(this.termVisible=!0),this.lines.push(`${t.brightGreen}\u25CF${t.reset} \u8BBE\u5907\u6865\u5DF2\u542F\u52A8 ${t.gray}\uFF08\u7AEF\u53E3 ${l.getPort()}\uFF09${t.reset}`);for(let c of l.urls())this.lines.push(`${t.gray} \u624B\u673A\u7AEF AutoX.js \u586B\u5199\uFF1A${t.reset}${t.brightGreen}${c}${t.reset}`);try{await l.startAutoJs6Listener(),this.lines.push(`${t.brightGreen}\u25CF${t.reset} AutoJs6 \u76D1\u542C\u5DF2\u5C31\u7EEA ${t.gray}\uFF08\u7AEF\u53E3 ${fe}\uFF09${t.reset}`);for(let c of l.listenerUrls())this.lines.push(`${t.gray} \u624B\u673A AutoJs6\u300C\u5BA2\u6237\u7AEF\u6A21\u5F0F\u300D\u586B\uFF1A${t.reset}${t.brightGreen}${c}${t.reset}`)}catch(c){this.lines.push(`${t.yellow}\u26A0 AutoJs6 \u76D1\u542C\u672A\u542F\u52A8${t.reset}${t.gray}\uFF1A${c instanceof Error?c.message:String(c)}${t.reset}`)}this.lines.push(`${t.gray} \u811A\u672C\u65E5\u5FD7\u663E\u793A\u5728\u53F3\u4FA7\u7EC8\u7AEF\u9762\u677F\uFF1B\u63A8\u9001\u811A\u672C\uFF1A/device run <\u6587\u4EF6>\uFF08\u6216 /device push\uFF09\u3002${t.reset}`),this.lines.push(`${t.gray} \u505C\u6B62\uFF1A/device stop${t.reset}`);break}case"stop":{if(!o?.isRunning()){this.lines.push(`${t.gray}\u8BBE\u5907\u6865\u672A\u5728\u8FD0\u884C\u3002${t.reset}`);break}await o.stop(),this.deviceBridge=void 0,this.agent.setDeviceBridge(void 0),this.lines.push(`${t.gray}\u8BBE\u5907\u6865\u5DF2\u505C\u6B62\u3002${t.reset}`);break}case"list":case"devices":{if(!o?.isRunning()){this.lines.push(`${t.yellow}\u8BBE\u5907\u6865\u672A\u542F\u52A8${t.reset}${t.gray}\uFF08/device serve\uFF09${t.reset}`);break}let a=o.listDevices();if(a.length===0){this.lines.push(`${t.gray}\u5F53\u524D\u6CA1\u6709\u5DF2\u8FDE\u63A5\u7684\u8BBE\u5907\u3002${t.reset}`);break}this.lines.push(`${t.gray}\u5DF2\u8FDE\u63A5\u8BBE\u5907\uFF08${a.length}\uFF09\uFF1A${t.reset}`);for(let l of a)this.lines.push(` ${t.cyan}${l.name}${t.reset} ${t.gray}${l.id} \xB7 versionCode ${l.appVersionCode}${t.reset}`);break}case"push":case"run":{if(!i){this.lines.push(`${t.gray}\u7528\u6CD5\uFF1A/device ${r} <\u811A\u672C\u6587\u4EF6>${t.reset}`);break}if(!o?.isRunning()){this.lines.push(`${t.yellow}\u8BBE\u5907\u6865\u672A\u542F\u52A8${t.reset}${t.gray}\uFF08/device serve\uFF09${t.reset}`);break}let a=r==="run"?o.runScript(i):o.pushScript(i);if(!a.ok){this.lines.push(`${t.red}\u2717 ${a.message}${t.reset}`);break}this.lines.push(`${t.green}\u2713${t.reset} ${r==="run"?"\u5DF2\u63A8\u9001\u5230\u8BBE\u5907\u5E76\u5F00\u59CB\u8FD0\u884C":"\u5DF2\u4FDD\u5B58\u5230\u8BBE\u5907"}\uFF1A${a.path}
|
|
566
570
|
${t.gray} \u76EE\u6807\u8BBE\u5907\uFF08${a.delivered}\uFF09\uFF1A${a.devices.join("\u3001")}${t.reset}`);break}case"logs":{if(!o?.isRunning()){this.lines.push(`${t.yellow}\u8BBE\u5907\u6865\u672A\u542F\u52A8${t.reset}${t.gray}\uFF08/device serve\uFF09${t.reset}`);break}let a=Number.parseInt(i,10),l=o.recentLogs(Number.isFinite(a)&&a>0?a:30);if(l.length===0){this.lines.push(`${t.gray}\u6682\u65E0\u8BBE\u5907\u65E5\u5FD7\u3002${t.reset}`);break}this.lines.push(`${t.gray}\u6700\u8FD1 ${l.length} \u6761\u8BBE\u5907\u65E5\u5FD7\uFF1A${t.reset}`);for(let c of l)this.lines.push(`${t.gray}[${c.device}]${t.reset} ${ge(c.text)}`);break}default:this.lines.push(`${t.gray}\u7528\u6CD5\uFF1A/device [connect <\u624B\u673AIP>|serve|stop|list|push <\u6587\u4EF6>|run <\u6587\u4EF6>|logs]${t.reset}`);break}this.scheduleRender()}printTools(){let e=ir();this.lines.push(`${t.bold}\u53D1\u7ED9\u6A21\u578B\u7684\u5DE5\u5177\uFF08\u5171 ${e.length} \u4E2A\uFF09${t.reset}${t.gray}\uFF08\u6BCF\u6B21\u8BF7\u6C42\u90FD\u4F1A\u5E26\u4E0A\uFF0C\u65E0\u5F00\u5173\uFF09${t.reset}`);for(let r of e){let s=r.description.split(`
|
|
567
|
-
`)[0].replace(/\*\*/g,"");this.lines.push(` ${t.cyan}${r.name.padEnd(16)}${t.reset} ${t.gray}${O(s,60)}${t.reset}`)}this.lines.push(`${t.gray} \u662F\u5426\u88AB\u8C03\u7528\u7531\u6A21\u578B\u51B3\u5B9A\uFF1B\u60F3\u5F3A\u8C03\u67D0\u4E2A\u5DE5\u5177\uFF0C\u53EF\u5199\u8FDB\u9879\u76EE\u89C4\u5219\uFF08.xuanzhu/rules.md\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"," /tools \u5217\u51FA\u672C\u8F6E\u53D1\u7ED9\u6A21\u578B\u7684\u5DE5\u5177\uFF08\u6392\u67E5\u300C\u67D0\u4E2A\u5DE5\u5177\u4F3C\u4E4E\u6CA1\u88AB\u8C03\u7528\u8FC7\u300D\uFF09"," /device \u624B\u673A\u8BBE\u5907\u6865\uFF08\u5148 /device serve \u6216 /device connect <\u624B\u673AIP>\uFF09"," \u5B50\u547D\u4EE4\uFF1Aconnect\uFF5Cserve\uFF5Cstop\uFF5Clist\uFF5Cpush <\u6587\u4EF6>\uFF5Crun <\u6587\u4EF6>\uFF5Clogs [N]"," \u4F53\u68C0\u4E0E\u622A\u56FE\u8BF7\u7528\u547D\u4EE4\u884C\uFF1Axzh device check / xzh device shot"," /copy [N|A-B|last|all] \u590D\u5236\u5DE6\u4FA7\u5BF9\u8BDD\u5230\u7CFB\u7EDF\u526A\u8D34\u677F\uFF08\u9ED8\u8BA4\u6700\u8FD1 30 \u884C\uFF09"," /copy term [N|A-B|all] \u590D\u5236\u53F3\u4FA7\u7EC8\u7AEF\u8F93\u51FA\uFF08\u6309\u680F\u53D6\u5185\u5BB9\uFF0C\u4E0D\u4F1A\u4E32\u680F\uFF09"," /image \u628A\u7CFB\u7EDF\u526A\u8D34\u677F\u91CC\u7684\u56FE\u7247\u52A0\u4E3A\u672C\u8F6E\u9644\u4EF6\uFF08\u540C Ctrl+V\uFF1B\u522B\u540D /paste\uFF09"," /mouse \u5207\u6362\u9F20\u6807\u6355\u83B7\uFF1A\u5F00\u542F\u540E\u53EF\u5728\u8F93\u51FA\u533A\u62D6\u62FD\u9009\u62E9\uFF08\u6309\u6574\u884C\uFF09"," /reset \u91CD\u7F6E\u5BF9\u8BDD\u4E0A\u4E0B\u6587"," /undo \u64A4\u9500\u7384\u732A\u5BF9\u6587\u4EF6\u7684\u6700\u8FD1\u4E00\u6B21\u4FEE\u6539\uFF08\u6539\u524D\u81EA\u52A8\u5907\u4EFD\uFF09"," /resume [\u7F16\u53F7] \u5217\u51FA / \u6062\u590D\u5386\u53F2\u4F1A\u8BDD\uFF08\u5BF9\u8BDD\u5386\u53F2\u4F1A\u81EA\u52A8\u4FDD\u5B58\uFF09"," /cwd \u663E\u793A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55"," /switch <\u76EE\u5F55> \u5207\u6362\u9879\u76EE\uFF08\u8F7D\u5165\u8BE5\u9879\u76EE\u4E0A\u6B21\u4F1A\u8BDD\u63A5\u7740\u804A\uFF09"," /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\u5DF2\u914D\u7F6E\u6A21\u578B\uFF08\u6309\u56DE\u9000\u987A\u5E8F\uFF09"," /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 ${t.bold}Alt+Enter${t.reset} \u6362\u884C\uFF08Ctrl/Shift+Enter \u89C6\u7EC8\u7AEF\u800C\u5B9A\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",` ${t.gray}\u9F20\u6807${t.reset}\uFF1A\u6EDA\u8F6E\u6EDA\u52A8\u8F93\u51FA\u533A\uFF1B${t.bold}\u5728\u8F93\u51FA\u533A\u62D6\u62FD\u5373\u53EF\u9009\u4E2D\u5E76\u590D\u5236${t.reset}${t.gray}\uFF08\u677E\u5F00\u5199\u5165\u526A\u8D34\u677F\uFF09\u3002${t.reset}`,` \u60F3\u7528\u7EC8\u7AEF\u539F\u751F\u6846\u9009/\u53F3\u952E\u83DC\u5355\uFF1A${t.reset}Shift+\u62D6\u62FD${t.gray} \u7ED5\u8FC7\uFF0C\u6216 ${t.reset}/mouse${t.gray} \u4EA4\u8FD8\u9F20\u6807\uFF08\u6EDA\u52A8\u6539\u7528 PgUp/PgDn\uFF09\u3002${t.reset}`,` \u26A0 \u62D6\u9009\u662F\u77E9\u5F62\u9009\u62E9\uFF0C\u8DE8\u8FC7\u4E2D\u7F1D\u4F1A\u628A\u53E6\u4E00\u680F\u4E00\u8D77\u5E26\u8D70 \u2014\u2014\u8DE8\u680F\u5185\u5BB9\u8BF7\u6539\u7528 ${t.reset}/copy${t.gray}\uFF08\u5DE6\u680F\uFF09\u6216 ${t.reset}/copy term${t.gray}\uFF08\u53F3\u680F\uFF09\u3002${t.reset}`,` ${t.gray}\u7C98\u8D34${t.reset}\uFF1A\u652F\u6301\u591A\u884C\u6574\u6BB5\u7C98\u8D34\uFF08\u4E0D\u4F1A\u9010\u884C\u63D0\u4EA4\uFF09\uFF1B\u4E5F\u53EF\u7528 ${t.reset}/copy${t.gray} \u590D\u5236\u8F93\u51FA\u533A\u3002${t.reset}`,` ${t.bold}Ctrl+V${t.reset} ${t.gray}\u7C98\u8D34\u56FE\u7247\uFF1A\u8BFB\u53D6\u7CFB\u7EDF\u526A\u8D34\u677F\u91CC\u7684\u56FE\u7247\u4F5C\u4E3A\u9644\u4EF6\uFF08\u8F93\u5165\u6846\u663E\u793A${t.reset}[\u56FE\u7247N]${t.gray}\uFF0C\u56DE\u8F66\u53D1\u9001\uFF09\u3002${t.reset}`,` ${t.gray}\u7EC8\u7AEF\u53EA\u4F1A\u4F20\u6587\u672C\uFF0C\u56FE\u7247\u62FF\u4E0D\u5230\uFF0C\u56E0\u6B64\u7531\u7384\u732A\u4E3B\u52A8\u8BFB\u526A\u8D34\u677F\uFF1A${t.reset}`,` ${t.gray}Linux \u7F3A ${t.reset}wl-clipboard${t.gray}/${t.reset}xclip${t.gray} \u65F6\u4F1A\u8BE2\u95EE\u540E\u81EA\u52A8\u5B89\u88C5\uFF1BWindows \u7528\u5185\u7F6E PowerShell\uFF1BmacOS \u7528 ${t.reset}pngpaste${t.gray} \u6216\u5185\u7F6E osascript\u3002${t.reset}`,` ${t.gray}\u82E5\u672C\u7EC8\u7AEF\u628A Ctrl+V \u5F53\u81EA\u5DF1\u7684\u7C98\u8D34\u952E\uFF08\u5982 Windows Terminal\uFF09\uFF0C\u6539\u7528 ${t.reset}/image${t.gray}\u3002${t.reset}`,` ${t.gray}\u9700\u8981\u6A21\u578B\u652F\u6301\u89C6\u89C9\uFF08glm-4v / qwen-vl / gpt-4o / claude \u7B49\uFF09\uFF1B\u53EF\u7528 ${t.reset}xzh model vision <id> on${t.gray} \u624B\u52A8\u6807\u6CE8\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${t.bold}Alt+Enter${t.reset} \u8D70\u7EC8\u7AEF\u539F\u751F\u7F16\u7801\uFF0C\u5404\u7EC8\u7AEF\u901A\u7528\uFF1B`," Ctrl/Shift+Enter \u9700\u8981\u7EC8\u7AEF\u652F\u6301\u6269\u5C55\u952E\u76D8\u534F\u8BAE\uFF0C\u90E8\u5206\u7EC8\u7AEF\uFF08\u5C24\u5176 IDE \u5185\u7F6E\uFF09\u4E0D\u652F\u6301\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=O(`${this.modelProviderLabel} / ${this.modelLabel}`,Math.max(10,e-8)),s=O(this.cwd,Math.max(10,e-8)),i=`${t.gray}${"\u2500".repeat(Math.max(0,e))}${t.reset}`;return{info:[`${t.brightMagenta}${t.bold} \u7384\u732A XuanZhu${t.reset} ${t.gray}v${K} \xB7 \u7EC8\u7AEF AI \u7F16\u7801 Agent${t.reset}`,`${t.gray} \u6A21\u578B\uFF1A${t.reset}${r}${t.reset}`,`${t.gray} \u76EE\u5F55\uFF1A${t.reset}${s}${t.reset}`,...this.todoHeaderLines(e),`${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:i}}todoHeaderLines(e){if(this.todoItems.length===0)return[];let r=this.todoItems.filter(u=>u.status==="completed").length,s=this.todoItems.filter(u=>u.status==="cancelled").length,i=this.todoItems.length-s,o=`\u4EFB\u52A1 ${r}/${i}`+(s>0?` \xB7 \u53D6\u6D88 ${s}`:""),a=[`${t.gray} ${t.reset}${t.bold}${o}${t.reset}`],l=this.todoItems.filter(u=>u.status==="in_progress"||u.status==="pending"),c=3;for(let u of l.slice(0,c)){let h=u.status==="in_progress",d=h?`${t.brightCyan}\u25B8${t.reset}`:`${t.gray}\xB7${t.reset}`,p=O(u.content,Math.max(8,e-8));a.push(` ${d} ${h?t.bold:t.gray}${p}${t.reset}`)}return l.length>c&&a.push(`${t.gray} \u2026\u8FD8\u6709 ${l.length-c} \u9879${t.reset}`),a}scheduleRender(){this.needsRender||this.exited||(this.needsRender=!0,setTimeout(()=>{this.needsRender=!1,this.render()},16))}render(){if(this.exited||this.suspended)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)),h=Math.min(c.info.length,Math.max(0,u-1)),d=[...c.info.slice(0,h),c.divider],p=d.length,m=Math.max(3,r-p-a-l),f=this.physicalLines(i),y=f.length;this.lastPhysicalCount>=0&&this.scrollOffset>0&&y>this.lastPhysicalCount&&(this.scrollOffset+=y-this.lastPhysicalCount),this.lastPhysicalCount=y;let g=Math.max(0,y-m);this.scrollOffset>g&&(this.scrollOffset=g);let S=y-this.scrollOffset,$=Math.max(0,S-m),A=f.slice($,S);for(;A.length<m;)A.unshift("");let H=r-1,x=Math.max(0,m-(S-$)),P=this.lastPhysicalMap;this.screenToLogical=[];for(let b=0;b<H;b++){let k=b-p;if(k<0||k>=m){this.screenToLogical.push(void 0);continue}let G=$+k-x,E=G>=0&&G<P.length?P[G]:-1;this.screenToLogical.push(E>=0?E:void 0)}if(this.selectionAnchor!==void 0&&this.selectionHead!==void 0){let b=Math.min(this.selectionAnchor,this.selectionHead),k=Math.max(this.selectionAnchor,this.selectionHead);for(let G=0;G<A.length;G++){let E=$+G-x;if(E<0||E>=P.length)continue;let Ne=P[E];Ne>=b&&Ne<=k&&(A[G]=`${t.inverse}${A[G]}${t.reset}`)}}let z=s>0?this.buildTermPanel(s,H):{rows:[],cursorRow:0,cursorCol:0},R=p+m,w=ne.hide;for(let b=0;b<H;b++){let k;b<p?k=d[b]:b<p+m?k=A[b-p]:b<R+a?k=o.lines[b-R]:k="",w+=ne.to(b+1,1)+"\x1B[2K",s>0?w+=vt(O(k,i),i)+`${t.gray}\u2502${t.reset}`+O(z.rows[b]??"",s):w+=vt(O(k,e),e)}if(w+=ne.to(r,1)+"\x1B[2K"+this.renderStatus(e),this.pendingConfirm)w+=ne.hide;else if(this.termFocus&&s>0&&z.cursorRow>0){let b=z.cursorRow,k=Math.min(e,i+1+z.cursorCol);w+=ne.to(b,k)+ne.show}else{let b=R+o.cursorRow+1,k=Math.min(i,o.cursorCol+1);w+=ne.to(b,k)+ne.show}process.stdout.write(w)}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=N(o)+N(a),c=Math.max(6,e-l);s.push(`${o}${t.gray}${O(this.term.getCwd(),c)}${t.reset}${a}`);let u=Math.max(1,r-3),h=[];for(let w of this.term.visibleLines())h.push(...yt(w,e));this.lastTermPhysicalCount>=0&&this.termScroll>0&&h.length>this.lastTermPhysicalCount&&(this.termScroll+=h.length-this.lastTermPhysicalCount),this.lastTermPhysicalCount=h.length;let d=Math.max(0,h.length-u);this.termScroll>d&&(this.termScroll=d);let p=h.length-this.termScroll,m=Math.max(0,p-u),f=h.slice(m,p);for(;f.length<u;)f.unshift("");s.push(...f),s.push(`${t.gray}${"\u2500".repeat(e)}${t.reset}`);let y=2,g=Math.max(1,e-y),S=Array.from(this.termInput),$=S.length;{let w=0;for(let b=0;b<S.length;b++){if(w>=this.termInputCursor){$=b;break}w+=S[b].length}}let A=0;for(;A<$&&N(S.slice(A,$).join(""))>g;)A++;let H=S.slice(A).join(""),x=N(S.slice(A,$).join("")),P=this.termFocus?`${t.brightCyan}\u276F${t.reset} `:`${t.gray}\u276F${t.reset} `;s.push(O(`${P}${H}`,e));let z=s.length,R=Math.min(e,y+x+1);for(;s.length<r;)s.push("");return{rows:s.slice(0,r),cursorRow:z,cursorCol:R}}physicalLines(e){let r=[],s=[];for(let i=0;i<this.lines.length;i++){let o=yt(this.lines[i],e);r.push(...o);for(let a=0;a<o.length;a++)s.push(i)}if(this.streamingPreview){let i=yt(this.streamingPreview,e);r.push(...i);for(let o=0;o<i.length;o++)s.push(-1)}return this.lastPhysicalMap=s,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.scrollOffset>0?`${t.brightYellow}\u2191${this.scrollOffset}${t.reset}${t.bgBlue} `:"",l=this.termScroll>0?`${t.brightYellow}\u21E1${this.termScroll}${t.reset}${t.bgBlue} `:"",c=this.selectionAnchor!==void 0&&this.selectionHead!==void 0?`${t.brightYellow}\u5DF2\u9009 ${Math.abs(this.selectionHead-this.selectionAnchor)+1} \u884C${this.dragging?"\uFF08\u677E\u5F00\u590D\u5236\uFF09":"\uFF08\u5DF2\u590D\u5236\uFF09"}${t.reset}${t.bgBlue} `:"",u=` ${s}${i}${o}${c}${a}${l}${this.modelLabel} \u2502 ${this.statusText}${this.statusDetail?" \xB7 "+this.statusDetail:""} `,h=` ${this.cwd} `,d=this.busy?`${t.brightYellow}\u25CF \u8FD0\u884C\u4E2D${t.reset}${t.bgBlue}`:"",p=N(r)+N(u)+N(d)+6,m=`${t.bgBlue}${t.brightWhite}${r}${t.reset}${t.bgBlue}${t.brightWhite}${d}${t.bgBlue}${t.gray}${O(h,Math.max(0,e-p))}${t.bgBlue}${t.brightWhite}${u}${t.reset}`,f=N(m);return f<e?m+=`${t.bgBlue}${" ".repeat(e-f)}${t.reset}`:f>e&&(m=`${O(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=N("\u276F "),h=0,d=u;for(let p=0;p<o.length;p++){let m=o[p];if(m===`
|
|
568
|
-
`){l.push(c),c=" ",u=N(" "),
|
|
569
|
-
`).slice(0,12);for(let u of a)for(let
|
|
570
|
-
`:"\r";case 9:return r&&(e&
|
|
571
|
+
`)[0].replace(/\*\*/g,"");this.lines.push(` ${t.cyan}${r.name.padEnd(16)}${t.reset} ${t.gray}${O(s,60)}${t.reset}`)}this.lines.push(`${t.gray} \u662F\u5426\u88AB\u8C03\u7528\u7531\u6A21\u578B\u51B3\u5B9A\uFF1B\u60F3\u5F3A\u8C03\u67D0\u4E2A\u5DE5\u5177\uFF0C\u53EF\u5199\u8FDB\u9879\u76EE\u89C4\u5219\uFF08.xuanzhu/rules.md\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"," /tools \u5217\u51FA\u672C\u8F6E\u53D1\u7ED9\u6A21\u578B\u7684\u5DE5\u5177\uFF08\u6392\u67E5\u300C\u67D0\u4E2A\u5DE5\u5177\u4F3C\u4E4E\u6CA1\u88AB\u8C03\u7528\u8FC7\u300D\uFF09"," /device \u624B\u673A\u8BBE\u5907\u6865\uFF08\u5148 /device serve \u6216 /device connect <\u624B\u673AIP>\uFF09"," \u5B50\u547D\u4EE4\uFF1Aconnect\uFF5Cserve\uFF5Cstop\uFF5Clist\uFF5Cpush <\u6587\u4EF6>\uFF5Crun <\u6587\u4EF6>\uFF5Clogs [N]"," \u4F53\u68C0\u4E0E\u622A\u56FE\u8BF7\u7528\u547D\u4EE4\u884C\uFF1Axzh device check / xzh device shot"," /copy [N|A-B|last|all] \u590D\u5236\u5DE6\u4FA7\u5BF9\u8BDD\u5230\u7CFB\u7EDF\u526A\u8D34\u677F\uFF08\u9ED8\u8BA4\u6700\u8FD1 30 \u884C\uFF09"," /copy term [N|A-B|all] \u590D\u5236\u53F3\u4FA7\u7EC8\u7AEF\u8F93\u51FA\uFF08\u6309\u680F\u53D6\u5185\u5BB9\uFF0C\u4E0D\u4F1A\u4E32\u680F\uFF09"," /image \u628A\u7CFB\u7EDF\u526A\u8D34\u677F\u91CC\u7684\u56FE\u7247\u52A0\u4E3A\u672C\u8F6E\u9644\u4EF6\uFF08\u540C Ctrl+V\uFF1B\u522B\u540D /paste\uFF09"," /mouse \u5207\u6362\u9F20\u6807\u6355\u83B7\uFF1A\u5F00\u542F\u540E\u53EF\u5728\u8F93\u51FA\u533A\u62D6\u62FD\u9009\u62E9\uFF08\u6309\u6574\u884C\uFF09"," /reset \u91CD\u7F6E\u5BF9\u8BDD\u4E0A\u4E0B\u6587"," /undo \u64A4\u9500\u7384\u732A\u5BF9\u6587\u4EF6\u7684\u6700\u8FD1\u4E00\u6B21\u4FEE\u6539\uFF08\u6539\u524D\u81EA\u52A8\u5907\u4EFD\uFF09"," /resume [\u7F16\u53F7] \u5217\u51FA / \u6062\u590D\u5386\u53F2\u4F1A\u8BDD\uFF08\u5BF9\u8BDD\u5386\u53F2\u4F1A\u81EA\u52A8\u4FDD\u5B58\uFF09"," /cwd \u663E\u793A\u5F53\u524D\u5DE5\u4F5C\u76EE\u5F55"," /switch <\u76EE\u5F55> \u5207\u6362\u9879\u76EE\uFF08\u8F7D\u5165\u8BE5\u9879\u76EE\u4E0A\u6B21\u4F1A\u8BDD\u63A5\u7740\u804A\uFF09"," /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\u5DF2\u914D\u7F6E\u6A21\u578B\uFF08\u6309\u56DE\u9000\u987A\u5E8F\uFF09"," /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 ${t.bold}Alt+Enter${t.reset} \u6362\u884C\uFF08Ctrl/Shift+Enter \u89C6\u7EC8\u7AEF\u800C\u5B9A\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",` ${t.gray}\u9F20\u6807${t.reset}\uFF1A\u6EDA\u8F6E\u6EDA\u52A8\u8F93\u51FA\u533A\uFF1B${t.bold}\u5728\u8F93\u51FA\u533A\u62D6\u62FD\u5373\u53EF\u9009\u4E2D\u5E76\u590D\u5236${t.reset}${t.gray}\uFF08\u677E\u5F00\u5199\u5165\u526A\u8D34\u677F\uFF09\u3002${t.reset}`,` \u60F3\u7528\u7EC8\u7AEF\u539F\u751F\u6846\u9009/\u53F3\u952E\u83DC\u5355\uFF1A${t.reset}Shift+\u62D6\u62FD${t.gray} \u7ED5\u8FC7\uFF0C\u6216 ${t.reset}/mouse${t.gray} \u4EA4\u8FD8\u9F20\u6807\uFF08\u6EDA\u52A8\u6539\u7528 PgUp/PgDn\uFF09\u3002${t.reset}`,` \u26A0 \u62D6\u9009\u662F\u77E9\u5F62\u9009\u62E9\uFF0C\u8DE8\u8FC7\u4E2D\u7F1D\u4F1A\u628A\u53E6\u4E00\u680F\u4E00\u8D77\u5E26\u8D70 \u2014\u2014\u8DE8\u680F\u5185\u5BB9\u8BF7\u6539\u7528 ${t.reset}/copy${t.gray}\uFF08\u5DE6\u680F\uFF09\u6216 ${t.reset}/copy term${t.gray}\uFF08\u53F3\u680F\uFF09\u3002${t.reset}`,` ${t.gray}\u7C98\u8D34${t.reset}\uFF1A\u652F\u6301\u591A\u884C\u6574\u6BB5\u7C98\u8D34\uFF08\u4E0D\u4F1A\u9010\u884C\u63D0\u4EA4\uFF09\uFF1B\u4E5F\u53EF\u7528 ${t.reset}/copy${t.gray} \u590D\u5236\u8F93\u51FA\u533A\u3002${t.reset}`,` ${t.bold}Ctrl+V${t.reset} ${t.gray}\u7C98\u8D34\u56FE\u7247\uFF1A\u8BFB\u53D6\u7CFB\u7EDF\u526A\u8D34\u677F\u91CC\u7684\u56FE\u7247\u4F5C\u4E3A\u9644\u4EF6\uFF08\u8F93\u5165\u6846\u663E\u793A${t.reset}[\u56FE\u7247N]${t.gray}\uFF0C\u56DE\u8F66\u53D1\u9001\uFF09\u3002${t.reset}`,` ${t.gray}\u7EC8\u7AEF\u53EA\u4F1A\u4F20\u6587\u672C\uFF0C\u56FE\u7247\u62FF\u4E0D\u5230\uFF0C\u56E0\u6B64\u7531\u7384\u732A\u4E3B\u52A8\u8BFB\u526A\u8D34\u677F\uFF1A${t.reset}`,` ${t.gray}Linux \u7F3A ${t.reset}wl-clipboard${t.gray}/${t.reset}xclip${t.gray} \u65F6\u4F1A\u8BE2\u95EE\u540E\u81EA\u52A8\u5B89\u88C5\uFF1BWindows \u7528\u5185\u7F6E PowerShell\uFF1BmacOS \u7528 ${t.reset}pngpaste${t.gray} \u6216\u5185\u7F6E osascript\u3002${t.reset}`,` ${t.gray}\u82E5\u672C\u7EC8\u7AEF\u628A Ctrl+V \u5F53\u81EA\u5DF1\u7684\u7C98\u8D34\u952E\uFF08\u5982 Windows Terminal\uFF09\uFF0C\u6539\u7528 ${t.reset}/image${t.gray}\u3002${t.reset}`,` ${t.gray}\u9700\u8981\u6A21\u578B\u652F\u6301\u89C6\u89C9\uFF08glm-4v / qwen-vl / gpt-4o / claude \u7B49\uFF09\uFF1B\u53EF\u7528 ${t.reset}xzh model vision <id> on${t.gray} \u624B\u52A8\u6807\u6CE8\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${t.bold}Alt+Enter${t.reset} \u8D70\u7EC8\u7AEF\u539F\u751F\u7F16\u7801\uFF0C\u5404\u7EC8\u7AEF\u901A\u7528\uFF1B`," Ctrl/Shift+Enter \u9700\u8981\u7EC8\u7AEF\u652F\u6301\u6269\u5C55\u952E\u76D8\u534F\u8BAE\uFF0C\u90E8\u5206\u7EC8\u7AEF\uFF08\u5C24\u5176 IDE \u5185\u7F6E\uFF09\u4E0D\u652F\u6301\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=O(`${this.modelProviderLabel} / ${this.modelLabel}`,Math.max(10,e-8)),s=O(this.cwd,Math.max(10,e-8)),i=`${t.gray}${"\u2500".repeat(Math.max(0,e))}${t.reset}`;return{info:[`${t.brightMagenta}${t.bold} \u7384\u732A XuanZhu${t.reset} ${t.gray}v${K} \xB7 \u7EC8\u7AEF AI \u7F16\u7801 Agent${t.reset}`,`${t.gray} \u6A21\u578B\uFF1A${t.reset}${r}${t.reset}`,`${t.gray} \u76EE\u5F55\uFF1A${t.reset}${s}${t.reset}`,...this.todoHeaderLines(e),`${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:i}}todoHeaderLines(e){if(this.todoItems.length===0)return[];let r=this.todoItems.filter(u=>u.status==="completed").length,s=this.todoItems.filter(u=>u.status==="cancelled").length,i=this.todoItems.length-s,o=`\u4EFB\u52A1 ${r}/${i}`+(s>0?` \xB7 \u53D6\u6D88 ${s}`:""),a=[`${t.gray} ${t.reset}${t.bold}${o}${t.reset}`],l=this.todoItems.filter(u=>u.status==="in_progress"||u.status==="pending"),c=3;for(let u of l.slice(0,c)){let p=u.status==="in_progress",d=p?`${t.brightCyan}\u25B8${t.reset}`:`${t.gray}\xB7${t.reset}`,h=O(u.content,Math.max(8,e-8));a.push(` ${d} ${p?t.bold:t.gray}${h}${t.reset}`)}return l.length>c&&a.push(`${t.gray} \u2026\u8FD8\u6709 ${l.length-c} \u9879${t.reset}`),a}scheduleRender(){this.needsRender||this.exited||(this.needsRender=!0,setTimeout(()=>{this.needsRender=!1,this.render()},16))}render(){if(this.exited||this.suspended)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)),p=Math.min(c.info.length,Math.max(0,u-1)),d=[...c.info.slice(0,p),c.divider],h=d.length,m=Math.max(3,r-h-a-l),f=this.physicalLines(i),y=f.length;this.lastPhysicalCount>=0&&this.scrollOffset>0&&y>this.lastPhysicalCount&&(this.scrollOffset+=y-this.lastPhysicalCount),this.lastPhysicalCount=y;let g=Math.max(0,y-m);this.scrollOffset>g&&(this.scrollOffset=g);let S=y-this.scrollOffset,$=Math.max(0,S-m),A=f.slice($,S);for(;A.length<m;)A.unshift("");let H=r-1,x=Math.max(0,m-(S-$)),P=this.lastPhysicalMap;this.screenToLogical=[];for(let b=0;b<H;b++){let k=b-h;if(k<0||k>=m){this.screenToLogical.push(void 0);continue}let G=$+k-x,_=G>=0&&G<P.length?P[G]:-1;this.screenToLogical.push(_>=0?_:void 0)}if(this.selectionAnchor!==void 0&&this.selectionHead!==void 0){let b=Math.min(this.selectionAnchor,this.selectionHead),k=Math.max(this.selectionAnchor,this.selectionHead);for(let G=0;G<A.length;G++){let _=$+G-x;if(_<0||_>=P.length)continue;let Ne=P[_];Ne>=b&&Ne<=k&&(A[G]=`${t.inverse}${A[G]}${t.reset}`)}}let z=s>0?this.buildTermPanel(s,H):{rows:[],cursorRow:0,cursorCol:0},R=h+m,w=ne.hide;for(let b=0;b<H;b++){let k;b<h?k=d[b]:b<h+m?k=A[b-h]:b<R+a?k=o.lines[b-R]:k="",w+=ne.to(b+1,1)+"\x1B[2K",s>0?w+=vt(O(k,i),i)+`${t.gray}\u2502${t.reset}`+O(z.rows[b]??"",s):w+=vt(O(k,e),e)}if(w+=ne.to(r,1)+"\x1B[2K"+this.renderStatus(e),this.pendingConfirm)w+=ne.hide;else if(this.termFocus&&s>0&&z.cursorRow>0){let b=z.cursorRow,k=Math.min(e,i+1+z.cursorCol);w+=ne.to(b,k)+ne.show}else{let b=R+o.cursorRow+1,k=Math.min(i,o.cursorCol+1);w+=ne.to(b,k)+ne.show}process.stdout.write(w)}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=N(o)+N(a),c=Math.max(6,e-l);s.push(`${o}${t.gray}${O(this.term.getCwd(),c)}${t.reset}${a}`);let u=Math.max(1,r-3),p=[];for(let w of this.term.visibleLines())p.push(...yt(w,e));this.lastTermPhysicalCount>=0&&this.termScroll>0&&p.length>this.lastTermPhysicalCount&&(this.termScroll+=p.length-this.lastTermPhysicalCount),this.lastTermPhysicalCount=p.length;let d=Math.max(0,p.length-u);this.termScroll>d&&(this.termScroll=d);let h=p.length-this.termScroll,m=Math.max(0,h-u),f=p.slice(m,h);for(;f.length<u;)f.unshift("");s.push(...f),s.push(`${t.gray}${"\u2500".repeat(e)}${t.reset}`);let y=2,g=Math.max(1,e-y),S=Array.from(this.termInput),$=S.length;{let w=0;for(let b=0;b<S.length;b++){if(w>=this.termInputCursor){$=b;break}w+=S[b].length}}let A=0;for(;A<$&&N(S.slice(A,$).join(""))>g;)A++;let H=S.slice(A).join(""),x=N(S.slice(A,$).join("")),P=this.termFocus?`${t.brightCyan}\u276F${t.reset} `:`${t.gray}\u276F${t.reset} `;s.push(O(`${P}${H}`,e));let z=s.length,R=Math.min(e,y+x+1);for(;s.length<r;)s.push("");return{rows:s.slice(0,r),cursorRow:z,cursorCol:R}}physicalLines(e){let r=[],s=[];for(let i=0;i<this.lines.length;i++){let o=yt(this.lines[i],e);r.push(...o);for(let a=0;a<o.length;a++)s.push(i)}if(this.streamingPreview){let i=yt(this.streamingPreview,e);r.push(...i);for(let o=0;o<i.length;o++)s.push(-1)}return this.lastPhysicalMap=s,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.scrollOffset>0?`${t.brightYellow}\u2191${this.scrollOffset}${t.reset}${t.bgBlue} `:"",l=this.termScroll>0?`${t.brightYellow}\u21E1${this.termScroll}${t.reset}${t.bgBlue} `:"",c=this.selectionAnchor!==void 0&&this.selectionHead!==void 0?`${t.brightYellow}\u5DF2\u9009 ${Math.abs(this.selectionHead-this.selectionAnchor)+1} \u884C${this.dragging?"\uFF08\u677E\u5F00\u590D\u5236\uFF09":"\uFF08\u5DF2\u590D\u5236\uFF09"}${t.reset}${t.bgBlue} `:"",u=` ${s}${i}${o}${c}${a}${l}${this.modelLabel} \u2502 ${this.statusText}${this.statusDetail?" \xB7 "+this.statusDetail:""} `,p=` ${this.cwd} `,d=this.busy?`${t.brightYellow}\u25CF \u8FD0\u884C\u4E2D${t.reset}${t.bgBlue}`:"",h=N(r)+N(u)+N(d)+6,m=`${t.bgBlue}${t.brightWhite}${r}${t.reset}${t.bgBlue}${t.brightWhite}${d}${t.bgBlue}${t.gray}${O(p,Math.max(0,e-h))}${t.bgBlue}${t.brightWhite}${u}${t.reset}`,f=N(m);return f<e?m+=`${t.bgBlue}${" ".repeat(e-f)}${t.reset}`:f>e&&(m=`${O(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 h=0;a=o.length;for(let m=0;m<o.length;m++){if(h>=this.inputCursor){a=m;break}h+=o[m].length}}let l=[],c="\u276F ",u=N("\u276F "),p=0,d=u;for(let h=0;h<o.length;h++){let m=o[h];if(m===`
|
|
572
|
+
`){l.push(c),c=" ",u=N(" "),h===a&&(p=l.length,d=u);continue}let f=N(m);u+f>e&&(l.push(c),c=" ",u=N(" ")),h===a&&(p=l.length,d=u),c+=m,u+=f}if(a>=o.length&&(p=l.length,d=u),l.push(c),l.length>i){let h=Math.max(0,p-i+1);return{lines:l.slice(h,h+i),cursorRow:p-h,cursorCol:d}}return{lines:l,cursorRow:p,cursorCol:d}}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(`
|
|
573
|
+
`).slice(0,12);for(let u of a)for(let p of yt(`${t.gray}${u}${t.reset}`,e-4))i.push(` ${p}`);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}}},qe="\x1B[200~",Ct="\x1B[201~",nc=40,sc=2e3,ic=1,oc=2,Dn=4;function ac(n,e){if((e&Dn)===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 uo(n,e){let r=(e&(ic|Dn|oc))!==0;switch(n){case 13:return r?`
|
|
574
|
+
`:"\r";case 9:return r&&(e&Dn)===0?"\x1B[Z":" ";case 8:case 127:return"\x7F";default:return ac(n,e)}}function lc(n){if(n==="\x1B\r"||n===`\x1B
|
|
571
575
|
`)return`
|
|
572
|
-
`;let e=/^\x1b\[(\d+)(?::\d+)?(?:;(\d+))?u$/.exec(n);if(e){let s=e[2]?Number(e[2])-1:0;return
|
|
576
|
+
`;let e=/^\x1b\[(\d+)(?::\d+)?(?:;(\d+))?u$/.exec(n);if(e){let s=e[2]?Number(e[2])-1:0;return uo(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 uo(i,s)??n}return n}function In(n){return n<1024?`${n} B`:n<1024*1024?`${(n/1024).toFixed(1)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}function cc(n){let e=n.trim();if(!e)return null;let r=/^(['"])(.*)\1$/.exec(e);return r&&(e=r[2]),e.startsWith("file://")&&(e=e.slice(7)),e=e.replace(/\\ /g," "),/\.(png|jpe?g|gif|webp)$/i.test(e)?e:null}function uc(n,e){try{let r=Oe.isAbsolute(n)?n:Oe.resolve(e,q(n)),s=pe.statSync(r);if(!s.isFile()||s.size>cr)return null;let i=pe.readFileSync(r),o=Rn(i);return o?{mimeType:o,data:i.toString("base64")}:null}catch{return null}}function dc(n){let e={};try{let i=JSON.parse(n.arguments||"{}");typeof i=="object"&&i!==null&&(e=i)}catch{return O(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 O(s.replace(/\s+/g," "),80)}var Y=v(require("fs")),On=v(require("path"));function Ln(){return On.join(T(),"session.lock")}function gr(){return On.join(T(),"crash.log")}function po(n){let e=pc();try{Y.mkdirSync(T(),{recursive:!0}),Y.writeFileSync(Ln(),JSON.stringify({pid:process.pid,startedAt:new Date().toISOString(),version:n}),{mode:384})}catch{}return e}function pc(){let n;try{n=Y.readFileSync(Ln(),"utf8")}catch{return null}let e={};try{let r=JSON.parse(n);e.startedAt=r.startedAt,e.version=r.version}catch{}try{let r=Y.readFileSync(gr(),"utf8");e.crashLog=r.slice(-4e3)}catch{}return e}function Nn(n,e){let r=e instanceof Error?e.stack??e.message:String(e),s=`
|
|
573
577
|
[${new Date().toISOString()}] ${n}
|
|
574
578
|
\u7248\u672C: ${process.version} \u5E73\u53F0: ${process.platform} PID: ${process.pid}
|
|
575
579
|
`+r.split(`
|
|
576
580
|
`).map(i=>` ${i}`).join(`
|
|
577
581
|
`)+`
|
|
578
|
-
`;try{Y.mkdirSync(T(),{recursive:!0}),Y.appendFileSync(gr(),s,"utf8")}catch{}}function
|
|
582
|
+
`;try{Y.mkdirSync(T(),{recursive:!0}),Y.appendFileSync(gr(),s,"utf8")}catch{}}function jn(){try{Y.rmSync(Ln(),{force:!0}),Y.rmSync(gr(),{force:!0})}catch{}}function $r(){return gr()}var ho=require("child_process"),mo=v(require("fs"));async function fo(n){let e=n[0];switch(e){case"edit":return mc();case"path":process.stdout.write(`${D()}
|
|
579
583
|
`);return;case"init":{if(Z(T()),ht()){process.stdout.write(`${t.yellow}\u914D\u7F6E\u6587\u4EF6\u5DF2\u5B58\u5728\uFF1A${D()}${t.reset}
|
|
580
584
|
`);return}W({...B}),process.stdout.write(`${t.green}\u2713 \u5DF2\u751F\u6210\u9ED8\u8BA4\u914D\u7F6E\uFF1A${D()}${t.reset}
|
|
581
|
-
`);return}case void 0:return
|
|
585
|
+
`);return}case void 0:return hc();default:process.stdout.write(`${t.red}\u672A\u77E5\u5B50\u547D\u4EE4\uFF1A${e}${t.reset}
|
|
582
586
|
${t.gray}\u7528\u6CD5\uFF1Axzh config [edit|path|init]${t.reset}
|
|
583
|
-
`),process.exitCode=1;return}}function
|
|
587
|
+
`),process.exitCode=1;return}}function hc(){if(!ht()){process.stdout.write(`${t.yellow}\u5C1A\u672A\u521B\u5EFA\u914D\u7F6E\u6587\u4EF6\u3002${t.reset}
|
|
584
588
|
${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}
|
|
585
|
-
`);return}let n=te(),e=
|
|
589
|
+
`);return}let n=te(),e=as(n);process.stdout.write(`${t.bold}\u7384\u732A\u914D\u7F6E${t.reset} ${t.gray}(${D()})${t.reset}
|
|
586
590
|
|
|
587
591
|
`),process.stdout.write(JSON.stringify(e,null,2)+`
|
|
588
592
|
`),process.stdout.write(`
|
|
589
593
|
${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}
|
|
590
|
-
`)}function
|
|
594
|
+
`)}function mc(){Z(T());let n=D();mo.existsSync(n)||W({...B});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,ho.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}
|
|
591
595
|
`),process.exitCode=1;return}typeof o.status=="number"&&o.status!==0&&(process.stdout.write(`${t.yellow}\u7F16\u8F91\u5668\u9000\u51FA\u7801 ${o.status}\uFF0C\u914D\u7F6E\u53EF\u80FD\u672A\u4FDD\u5B58\u3002${t.reset}
|
|
592
596
|
`),process.exitCode=1);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}
|
|
593
|
-
`),process.exitCode=1}var yr=v(require("readline/promises")),
|
|
594
|
-
`),a.trim()||e||""}finally{s.close()}}async function Ae(n,e,r=0){return process.stdin.isTTY?
|
|
595
|
-
`}async function
|
|
597
|
+
`),process.exitCode=1}var yr=v(require("readline/promises")),go=require("stream");var fc=new go.Writable({write(n,e,r){r()}});function gc(n){return n.length<=8?"*".repeat(n.length):`${n.slice(0,4)}\u2026${n.slice(-4)}`}async function Le(n,e,r={}){let s=yr.createInterface({input:process.stdin,output:r.mask?fc:process.stdout});try{let i=e&&r.mask?gc(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(`
|
|
598
|
+
`),a.trim()||e||""}finally{s.close()}}async function Ae(n,e,r=0){return process.stdin.isTTY?yc(n,e,r):vc(n,e,r)}function $c(n,e,r){let s=e===r?`${t.brightGreen}\u276F${t.reset}`:" ",i=n.hint?` ${t.gray}${n.hint}${t.reset}`:"",o=`${t.gray}${String(e+1).padStart(2)}.${t.reset}`;return`\x1B[2K ${s} ${o} ${n.label}${i}
|
|
599
|
+
`}async function yc(n,e,r){let i=Math.min(Math.max(r,0),e.length-1),o="",a=e.length,l=()=>o?`${t.gray}\u2191/\u2193 \u9009\u62E9 \xB7 ${t.reset}\u7F16\u53F7 ${t.brightCyan}${o}${t.reset}${t.gray} \xB7 Enter \u786E\u8BA4 \xB7 Esc \u53D6\u6D88${t.reset}`:`${t.gray}\u2191/\u2193 \u9009\u62E9 \xB7 \u6570\u5B57\u76F4\u8FBE \xB7 Enter \u786E\u8BA4 \xB7 Esc \u53D6\u6D88${t.reset}`,c=()=>{for(let h=0;h<e.length;h++)process.stdout.write($c(e[h],h,i))},u=()=>{process.stdout.write(`\x1B[${a}A\x1B[1G\x1B[J`),c(),process.stdout.write(l())};process.stdout.write(`
|
|
596
600
|
${t.bold}${n}${t.reset}
|
|
597
|
-
`),c(),process.stdout.write(l());let
|
|
598
|
-
`),
|
|
599
|
-
`){f();return}else if(g[$]===""){m(void 0);return}else if(g[$]==="\x1B"){m(void 0);return}else if(g[$]==="\x7F"||g[$]==="\b")o=o.slice(0,-1),S=!0,$+=1;else if(/\d/.test(g[$])){let A=o+g[$];o=A.length>2?g[$]:A,S=!0,$+=1}else $+=1;S&&u()};
|
|
601
|
+
`),c(),process.stdout.write(l());let p=process.stdin,d=!!p.isRaw;return new Promise(h=>{let m=g=>{p.off("data",y),d||p.setRawMode(!1),p.pause(),process.stdout.write(`
|
|
602
|
+
`),h(g)},f=()=>{let g=o?Number.parseInt(o,10)-1:i;g>=0&&g<e.length?m(e[g].value):o?(o="",u()):m(e[i].value)},y=g=>{let S=!1,$=0;for(;$<g.length;)if(g.startsWith("\x1B[A",$)||g[$]==="k")i=(i-1+e.length)%e.length,S=!0,$+=g.startsWith("\x1B[A",$)?3:1;else if(g.startsWith("\x1B[B",$)||g[$]==="j")i=(i+1)%e.length,S=!0,$+=g.startsWith("\x1B[B",$)?3:1;else if(g[$]==="\r"||g[$]===`
|
|
603
|
+
`){f();return}else if(g[$]===""){m(void 0);return}else if(g[$]==="\x1B"){m(void 0);return}else if(g[$]==="\x7F"||g[$]==="\b")o=o.slice(0,-1),S=!0,$+=1;else if(/\d/.test(g[$])){let A=o+g[$];o=A.length>2?g[$]:A,S=!0,$+=1}else $+=1;S&&u()};p.setRawMode(!0),p.resume(),p.setEncoding("utf8"),p.on("data",y)})}async function vc(n,e,r){process.stdout.write(`
|
|
600
604
|
${t.bold}${n}${t.reset}
|
|
601
605
|
`),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}
|
|
602
606
|
`)});let s=yr.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}
|
|
603
|
-
`),e[r].value):e[a].value}finally{s.close()}}async function vr(n,e=!1){let r=yr.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
|
|
607
|
+
`),e[r].value):e[a].value}finally{s.close()}}async function vr(n,e=!1){let r=yr.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 $o(n){switch(n[0]){case void 0:return wc();case"list":case"ls":return xc();case"all":case"available":case"providers":return Sc();case"add":return Bn(n.slice(1));case"remove":case"rm":case"delete":return yo(n.slice(1));case"context":case"ctx":return vo(n.slice(1));case"vision":case"image":return bc(n.slice(1));case"help":case"-h":case"--help":return Cc();default:return Bn(n)}}async function Bn(n){let e=te(),r=Ve(e),s=n[0]??await Tc();if(!s){process.stdout.write(`${t.gray}\u5DF2\u53D6\u6D88\u3002${t.reset}
|
|
604
608
|
`);return}let i=we(s);if(!i){process.stdout.write(`${t.red}\u672A\u77E5\u7684 provider\uFF1A${s}${t.reset}
|
|
605
|
-
${t.gray}\u53EF\u7528\uFF1A${Se.map(
|
|
606
|
-
`),process.exitCode=1;return}let o=n[1]??await
|
|
607
|
-
`);return}let a=await
|
|
608
|
-
${t.green}\u2713 ${
|
|
609
|
+
${t.gray}\u53EF\u7528\uFF1A${Se.map(h=>h.id).join(", ")}${t.reset}
|
|
610
|
+
`),process.exitCode=1;return}let o=n[1]??await Ac(i.id,i.models,e);if(!o){process.stdout.write(`${t.gray}\u5DF2\u53D6\u6D88\u3002${t.reset}
|
|
611
|
+
`);return}let a=await kc(i.id,i.requiresBaseUrl===!0,e),l=await Pc(i.id,i.envKey,e),c=await _c(o,n[2]),u=await Ec(i.id,o,n[3]);e.providers={...e.providers,[i.id]:{...e.providers[i.id]??{},model:o,...a?{baseUrl:a}:{},...l?{apiKey:l}:{}}},e.provider=i.id,e.model=o;let p=r.some(h=>h.id===ve(i.id,o)),d=us(e,{provider:i.id,model:o,contextWindow:c,vision:u,...a?{baseUrl:a}:{},...l?{apiKey:l}:{}});W(e),process.stdout.write(`
|
|
612
|
+
${t.green}\u2713 ${p?"\u5DF2\u66F4\u65B0":"\u5DF2\u65B0\u589E"}\u6A21\u578B${t.reset} ${t.bold}${d.id}${t.reset}
|
|
609
613
|
${t.gray}provider\uFF1A${t.reset}${i.label}
|
|
610
614
|
${t.gray}model \uFF1A${t.reset}${d.model}
|
|
611
615
|
${t.gray}\u4E0A\u4E0B\u6587 \uFF1A${t.reset}${xe(d.contextWindow??32e3)} token
|
|
612
616
|
${t.gray}\u56FE\u7247\u8F93\u5165\uFF1A${t.reset}${Be(d)?"\u652F\u6301\uFF08Ctrl+V \u7C98\u8D34\u56FE\u7247\uFF09":"\u4E0D\u652F\u6301"}
|
|
613
617
|
`+(a?` ${t.gray}baseUrl \uFF1A${t.reset}${a}
|
|
614
618
|
`:"")+` ${t.gray}\u914D\u7F6E\u6587\u4EF6\uFF1A${t.reset}${D()}
|
|
615
|
-
`),
|
|
616
|
-
`);return}let s=n[0]||await
|
|
617
|
-
`);return}let i=
|
|
619
|
+
`),bo(e)}async function yo(n){let e=te(),r=U(e);if(r.length===0){process.stdout.write(`${t.yellow}\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\u3002${t.reset}
|
|
620
|
+
`);return}let s=n[0]||await Kn(r,"\u9009\u62E9\u8981\u5220\u9664\u7684\u6A21\u578B\uFF1A");if(!s){process.stdout.write(`${t.gray}\u5DF2\u53D6\u6D88\u3002${t.reset}
|
|
621
|
+
`);return}let i=Jn(e,s),o=i?ds(e,i):null;if(!o){process.stdout.write(`${t.red}\u672A\u627E\u5230\u6A21\u578B\uFF1A${s}${t.reset}
|
|
618
622
|
${t.gray}\u63D0\u793A\uFF1A\u53EF\u4F7F\u7528 ${t.reset}xzh model list${t.gray} \u67E5\u770B id \u4E0E\u5E8F\u53F7\u3002${t.reset}
|
|
619
623
|
`),process.exitCode=1;return}W(e),process.stdout.write(`
|
|
620
624
|
${t.green}\u2713 \u5DF2\u5220\u9664\u6A21\u578B${t.reset} ${o.id}
|
|
621
|
-
`),
|
|
622
|
-
`);return}let s=n[0]||await
|
|
623
|
-
`);return}let i=
|
|
625
|
+
`),bo(e)}async function vo(n){let e=te(),r=U(e);if(r.length===0){process.stdout.write(`${t.yellow}\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\u3002${t.reset}
|
|
626
|
+
`);return}let s=n[0]||await Kn(r,"\u9009\u62E9\u8981\u8BBE\u7F6E\u4E0A\u4E0B\u6587\u7A97\u53E3\u7684\u6A21\u578B\uFF1A");if(!s){process.stdout.write(`${t.gray}\u5DF2\u53D6\u6D88\u3002${t.reset}
|
|
627
|
+
`);return}let i=Jn(e,s),o=i?r.find(p=>p.id===i):void 0;if(!o){process.stdout.write(`${t.red}\u672A\u627E\u5230\u6A21\u578B\uFF1A${s}${t.reset}
|
|
624
628
|
${t.gray}\u63D0\u793A\uFF1A\u53EF\u4F7F\u7528 ${t.reset}xzh model list${t.gray} \u67E5\u770B id \u4E0E\u5E8F\u53F7\u3002${t.reset}
|
|
625
|
-
`),process.exitCode=1;return}let a=o.contextWindow??Ue(o.model),l=n[1]??await Le(`\u8BF7\u8F93\u5165 ${o.id} \u7684\u4E0A\u4E0B\u6587\u7A97\u53E3\uFF08token\uFF0C\u5982 128000\uFF09`,String(a)),c=
|
|
626
|
-
`),process.exitCode=1;return}let u=
|
|
629
|
+
`),process.exitCode=1;return}let a=o.contextWindow??Ue(o.model),l=n[1]??await Le(`\u8BF7\u8F93\u5165 ${o.id} \u7684\u4E0A\u4E0B\u6587\u7A97\u53E3\uFF08token\uFF0C\u5982 128000\uFF09`,String(a)),c=Fn(l);if(c===void 0){process.stdout.write(`${t.red}\u65E0\u6CD5\u8BC6\u522B\u7684\u7A97\u53E3\u5927\u5C0F\uFF1A${l}${t.reset}
|
|
630
|
+
`),process.exitCode=1;return}let u=Ve(e).find(p=>p.id===o.id);u&&(u.contextWindow=c),W(e),process.stdout.write(`
|
|
627
631
|
${t.green}\u2713 \u5DF2\u66F4\u65B0\u4E0A\u4E0B\u6587\u7A97\u53E3${t.reset} ${o.id} \u2192 ${xe(c)} token
|
|
628
|
-
`)}async function
|
|
629
|
-
`);return}let s=n[0]||await
|
|
630
|
-
`);return}let i=
|
|
632
|
+
`)}async function bc(n){let e=te(),r=U(e);if(r.length===0){process.stdout.write(`${t.yellow}\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\u3002${t.reset}
|
|
633
|
+
`);return}let s=n[0]||await Kn(r,"\u9009\u62E9\u8981\u6807\u6CE8\u89C6\u89C9\u80FD\u529B\u7684\u6A21\u578B\uFF1A");if(!s){process.stdout.write(`${t.gray}\u5DF2\u53D6\u6D88\u3002${t.reset}
|
|
634
|
+
`);return}let i=Jn(e,s),o=i?r.find(p=>p.id===i):void 0;if(!o){process.stdout.write(`${t.red}\u672A\u627E\u5230\u6A21\u578B\uFF1A${s}${t.reset}
|
|
631
635
|
${t.gray}\u63D0\u793A\uFF1A\u53EF\u4F7F\u7528 ${t.reset}xzh model list${t.gray} \u67E5\u770B id \u4E0E\u5E8F\u53F7\u3002${t.reset}
|
|
632
|
-
`),process.exitCode=1;return}let a=
|
|
633
|
-
`),process.exitCode=1;return}let u=
|
|
636
|
+
`),process.exitCode=1;return}let a=Ir(o.model),l=(n[1]??await Le(`\u8BF7\u8F93\u5165 ${o.id} \u662F\u5426\u652F\u6301\u56FE\u7247\u8F93\u5165\uFF08on / off\uFF0C\u56DE\u8F66\u6309\u6A21\u578B\u540D\u63A8\u65AD\uFF09`,a?"on":"off")).trim().toLowerCase(),c=zn(l);if(c===void 0){process.stdout.write(`${t.red}\u65E0\u6CD5\u8BC6\u522B\u300C${l}\u300D\uFF0C\u8BF7\u4F7F\u7528 on \u6216 off\u3002${t.reset}
|
|
637
|
+
`),process.exitCode=1;return}let u=Ve(e).find(p=>p.id===o.id);if(!u){process.stdout.write(`${t.red}\u8BBE\u7F6E\u5931\u8D25\uFF1A${o.id}${t.reset}
|
|
634
638
|
`),process.exitCode=1;return}u.vision=c,W(e),process.stdout.write(`
|
|
635
639
|
${t.green}\u2713 \u5DF2\u66F4\u65B0\u89C6\u89C9\u80FD\u529B${t.reset} ${o.id} \u2192 ${c?"\u652F\u6301\u56FE\u7247\u8F93\u5165":"\u4E0D\u652F\u6301\u56FE\u7247\u8F93\u5165"}
|
|
636
640
|
${t.gray} \u751F\u6548\u7ED3\u679C\uFF1A${Be(u)?"\u53EF\u4EE5\u7C98\u8D34\u56FE\u7247":"\u7C98\u8D34\u56FE\u7247\u4F1A\u88AB\u62D2\u7EDD"}\uFF08Ctrl+V \u6216 /image\uFF09${t.reset}
|
|
637
|
-
`)}function
|
|
641
|
+
`)}function xc(){let n=te();Un(n)}function Sc(){let n=te(),e=new Set(U(n).map(o=>o.id)),r=Se.reduce((o,a)=>o+a.models.length,0);process.stdout.write(`
|
|
638
642
|
${t.bold}\u6240\u6709\u53EF\u7528\u6A21\u578B${t.reset}${t.gray}\uFF08${Se.length} \u4E2A\u670D\u52A1\u5546\uFF0C\u5171 ${r} \u4E2A\u5185\u7F6E\u6A21\u578B\uFF09${t.reset}
|
|
639
643
|
`);for(let o of Se){let a=n.providers[o.id]!==void 0?` ${t.gray}\xB7 \u5DF2\u586B\u5199 Key${t.reset}`:"";if(process.stdout.write(`
|
|
640
644
|
${t.bold}${o.label}${t.reset} ${t.gray}(${o.id})${t.reset}${a}
|
|
641
645
|
`),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}
|
|
642
|
-
`);continue}for(let l of o.models){let c=ve(o.id,l),u=e.has(c),
|
|
646
|
+
`);continue}for(let l of o.models){let c=ve(o.id,l),u=e.has(c),p=u?`${t.brightGreen}\u276F${t.reset}`:" ",d=[];l===o.defaultModel&&d.push("\u9ED8\u8BA4"),u&&d.push("\u5DF2\u914D\u7F6E");let h=d.length>0?` ${t.gray}\u2190 ${d.join(" \xB7 ")}${t.reset}`:"";process.stdout.write(` ${p} ${l}${h}
|
|
643
647
|
`)}}let s=new Set(Se.flatMap(o=>o.models.map(a=>ve(o.id,a)))),i=U(n).filter(o=>!s.has(o.id));if(i.length>0){process.stdout.write(`
|
|
644
648
|
${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}
|
|
645
649
|
`);for(let o of i)process.stdout.write(` ${t.brightGreen}\u276F${t.reset} ${o.id}
|
|
646
650
|
`)}process.stdout.write(`
|
|
647
651
|
${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}
|
|
648
652
|
${t.gray}\u67E5\u770B\u5DF2\u914D\u7F6E\u7684\u6A21\u578B\uFF1A${t.reset}xzh model list
|
|
649
|
-
`)}async function
|
|
653
|
+
`)}async function wc(){for(;;){let n=te();switch(Un(n),await Ae("\u8BF7\u9009\u62E9\u64CD\u4F5C\uFF1A",[{label:"\u65B0\u589E\u6A21\u578B",value:"add",hint:"add"},{label:"\u67E5\u770B\u5DF2\u914D\u7F6E\u7684\u6A21\u578B",value:"list",hint:"list"},{label:"\u5220\u9664\u6A21\u578B",value:"remove",hint:"remove"},{label:"\u8C03\u6574\u4E0A\u4E0B\u6587\u7A97\u53E3",value:"context",hint:"context"},{label:"\u9000\u51FA",value:"exit"}],0)){case"add":await Bn([]);break;case"list":Un(n);break;case"remove":await yo([]);break;case"context":await vo([]);break;default:process.stdout.write(`
|
|
650
654
|
${t.gray}\u5DF2\u9000\u51FA\u6A21\u578B\u7BA1\u7406\u3002${t.reset}
|
|
651
|
-
`);return}}}function
|
|
655
|
+
`);return}}}function Un(n){let e=U(n),r=je(n);if(process.stdout.write(`
|
|
652
656
|
${t.bold}\u7384\u732A\u6A21\u578B\u5217\u8868${t.reset} ${t.gray}(${D()})${t.reset}
|
|
653
657
|
`),e.length===0){process.stdout.write(` ${t.yellow}\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\u3002${t.reset}
|
|
654
658
|
${t.gray}\u8FD0\u884C ${t.reset}xzh model add <provider> <model>${t.gray} \u6DFB\u52A0\u3002${t.reset}
|
|
655
659
|
`);return}e.forEach((s,i)=>{let o=r!==null&&s.id===r.id,a=o?`${t.brightGreen}\u276F${t.reset}`:" ",l=o?` ${t.gray}\u2190 \u5F53\u524D\u4F7F\u7528${t.reset}`:"",c=xe(s.contextWindow??Ue(s.model)),u=Be(s)?` ${t.cyan}\u89C6\u89C9${t.reset}`:"";process.stdout.write(` ${a} ${i+1}. ${s.id.padEnd(34)} ${t.gray}ctx ${c.padStart(5)}${t.reset}${u}${l}
|
|
656
660
|
`)}),process.stdout.write(`${t.gray} \u987A\u5E8F\u5373\u56DE\u9000\u987A\u5E8F\uFF1A\u5148\u7528\u300C\u5F53\u524D\u4F7F\u7528\u300D\u90A3\u4E2A\uFF0C\u5B83\u8C03\u7528\u5931\u8D25\u65F6\u6309\u6B64\u987A\u5E8F\u5F80\u540E\u5207\u6362\uFF0C\u76F4\u5230\u5168\u90E8\u8BD5\u8FC7\u3002${t.reset}
|
|
657
|
-
`)}function
|
|
661
|
+
`)}function bo(n){let e=je(n);e?process.stdout.write(`${t.gray}\u4E0B\u6B21\u542F\u52A8\u5C06\u4F7F\u7528\u4E0A\u6B21\u7528\u8FC7\u7684\u6A21\u578B\uFF1A${t.reset}${t.bold}${e.id}${t.reset}
|
|
658
662
|
`):(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}
|
|
659
663
|
`),process.stdout.write(`
|
|
660
664
|
\u8FD0\u884C ${t.brightGreen}xzh${t.reset} \u5F00\u59CB\u4F7F\u7528\u3002
|
|
661
|
-
`)}function
|
|
665
|
+
`)}function Cc(){process.stdout.write(`
|
|
662
666
|
${t.bold}xzh model \u2014\u2014 \u591A\u6A21\u578B\u7BA1\u7406${t.reset}
|
|
663
667
|
${t.green}xzh model${t.reset} \u4EA4\u4E92\u5F0F\u83DC\u5355
|
|
664
668
|
${t.green}xzh model list${t.reset} \u5217\u51FA\u5DF2\u914D\u7F6E\u7684\u6A21\u578B\uFF08\u6309\u56DE\u9000\u987A\u5E8F\uFF09
|
|
@@ -675,23 +679,23 @@ ${t.bold}\u591A\u6A21\u578B\u4E0E\u56DE\u9000${t.reset}
|
|
|
675
679
|
\u4E0D\u60F3\u8BA9\u67D0\u4E2A\u6A21\u578B\u53C2\u4E0E\uFF0C\u76F4\u63A5 ${t.green}xzh model remove${t.reset} \u5220\u6389\u5373\u53EF\u3002
|
|
676
680
|
|
|
677
681
|
${t.gray}\u53EF\u7528 provider\uFF1A${Se.map(n=>n.id).join(", ")}${t.reset}
|
|
678
|
-
`)}async function
|
|
682
|
+
`)}async function Tc(){return Ae("\u9009\u62E9 AI \u670D\u52A1\u5546\uFF1A",[...Se.map(n=>({label:n.label,value:n.id,hint:n.id})),{label:"\u8FD4\u56DE",value:""}],0)}async function Ac(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__"},{label:"\u8FD4\u56DE",value:""}],a=s?Math.max(0,e.indexOf(s)):0,l=await Ae(`\u9009\u62E9\u6A21\u578B\uFF08${n}\uFF09\uFF1A`,o,a);if(l!=="__custom__")return l}return await Le("\u8BF7\u8F93\u5165\u6A21\u578B\u540D\u79F0",s)}async function kc(n,e,r){let s=r.providers[n]?.baseUrl;return e?await Le("\u8BF7\u8F93\u5165 API \u7AEF\u70B9 baseUrl",s):s??""}function Fn(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 _c(n,e){let r=Ue(n);if(e!==void 0&&e.trim()!==""){let o=Fn(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 ${xe(r)}\u3002${t.reset}
|
|
679
683
|
`),r):o}process.stdout.write(`${t.gray} \u4E0A\u4E0B\u6587\u7A97\u53E3\uFF1A\u6309\u6A21\u578B\u540D\u63A8\u65AD\u4E3A ${xe(r)} token\u3002${t.reset}
|
|
680
|
-
`);let s=await Le("\u8BF7\u8F93\u5165\u4E0A\u4E0B\u6587\u7A97\u53E3\u5927\u5C0F\uFF08token\uFF0C\u5982 128000\uFF1B\u56DE\u8F66\u4F7F\u7528\u63A8\u65AD\u503C\uFF09",String(r)),i=
|
|
681
|
-
`),r):i}function
|
|
684
|
+
`);let s=await Le("\u8BF7\u8F93\u5165\u4E0A\u4E0B\u6587\u7A97\u53E3\u5927\u5C0F\uFF08token\uFF0C\u5982 128000\uFF1B\u56DE\u8F66\u4F7F\u7528\u63A8\u65AD\u503C\uFF09",String(r)),i=Fn(s);return i===void 0?(process.stdout.write(`${t.yellow} \u65E0\u6CD5\u8BC6\u522B\u300C${s}\u300D\uFF0C\u5DF2\u4F7F\u7528\u63A8\u65AD\u503C ${xe(r)}\u3002${t.reset}
|
|
685
|
+
`),r):i}function zn(n){let e=n.trim().toLowerCase();if(["on","true","yes","y","1"].includes(e))return!0;if(["off","false","no","n","0"].includes(e))return!1}async function Ec(n,e,r){let s=Be({provider:n,model:e}),i=s?"\u652F\u6301":"\u4E0D\u652F\u6301";if(r!==void 0&&r.trim()!==""){let c=zn(r);return c!==void 0?c:(process.stdout.write(`${t.yellow}\u65E0\u6CD5\u8BC6\u522B\u56FE\u7247\u8F93\u5165\u8BBE\u7F6E\u300C${r}\u300D\uFF0C\u5DF2\u4F7F\u7528${i}\u3002${t.reset}
|
|
682
686
|
`),s)}let o=n==="custom"?"\uFF08\u81EA\u5B9A\u4E49\u7AEF\u70B9\u9ED8\u8BA4\u6309\u652F\u6301\u5904\u7406\uFF09":`\uFF08\u6309\u6A21\u578B\u540D\u63A8\u65AD\u4E3A${i}\uFF09`;process.stdout.write(`${t.gray} \u56FE\u7247\u8F93\u5165\uFF1A${o}\u3002${t.reset}
|
|
683
|
-
`);let a=await Le("\u8BE5\u6A21\u578B\u662F\u5426\u652F\u6301\u56FE\u7247\u8F93\u5165\uFF08Ctrl+V \u7C98\u8D34\u56FE\u7247\uFF09\uFF1F\u8F93\u5165 on / off",s?"on":"off"),l=
|
|
684
|
-
`),s)}async function
|
|
685
|
-
`),await Le("\u8BF7\u8F93\u5165 API Key",i??"",{mask:!0})):i??""}function
|
|
687
|
+
`);let a=await Le("\u8BE5\u6A21\u578B\u662F\u5426\u652F\u6301\u56FE\u7247\u8F93\u5165\uFF08Ctrl+V \u7C98\u8D34\u56FE\u7247\uFF09\uFF1F\u8F93\u5165 on / off",s?"on":"off"),l=zn(a);return l!==void 0?l:(process.stdout.write(`${t.yellow} \u65E0\u6CD5\u8BC6\u522B\u300C${a}\u300D\uFF0C\u5DF2\u4F7F\u7528${i}\u3002${t.reset}
|
|
688
|
+
`),s)}async function Pc(n,e,r){let s=we(n),i=r.providers[n]?.apiKey;return s?.requiresApiKey?(Dt(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}
|
|
689
|
+
`),await Le("\u8BF7\u8F93\u5165 API Key",i??"",{mask:!0})):i??""}function Jn(n,e){let r=U(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=Number.parseInt(e,10);if(o>=1&&o<=r.length)return r[o-1].id}return null}async function Kn(n,e){return await Ae(e,[...n.map(s=>({label:`${s.id} ctx ${xe(s.contextWindow??Ue(s.model))}`,value:s.id})),{label:"\u8FD4\u56DE",value:""}],0)}async function xo(){let n=Te();process.stdout.write(`
|
|
686
690
|
${t.bold}\u7384\u732A\u4F9D\u8D56\u68C0\u67E5${t.reset} ${t.gray}(\u5E73\u53F0\uFF1A${n})${t.reset}
|
|
687
691
|
|
|
688
|
-
`);let e=[...
|
|
692
|
+
`);let e=[...Bi(n).map(o=>({requirement:o,owner:"\u7384\u732A\uFF08Ctrl+V \u7C98\u8D34\u56FE\u7247\uFF09"})),...Ni().flatMap(o=>ct(o).map(a=>({requirement:a,owner:`\u6280\u80FD ${o}`})))],r=[],s=[],i=[];for(let{requirement:o,owner:a}of e){if(await Ke(o)){process.stdout.write(`${t.green}\u2713${t.reset} ${o.name} ${t.gray}\u5DF2\u5B89\u88C5${t.reset}
|
|
689
693
|
`);continue}let l=o.install[n];if(!l){process.stdout.write(`${t.yellow}\u26A0${t.reset} ${o.name} ${t.gray}\u5F53\u524D\u5E73\u53F0\u65E0\u81EA\u52A8\u5B89\u88C5\u547D\u4EE4${t.reset}
|
|
690
694
|
`),i.push(o.name);continue}if(process.stdout.write(`
|
|
691
695
|
${t.yellow}\u25CF${t.reset} ${t.bold}${o.name}${t.reset} ${t.gray}\u672A\u5B89\u88C5${t.reset}
|
|
692
696
|
${t.gray}\u6240\u5C5E\uFF1A${a}${t.reset}
|
|
693
697
|
${t.gray}\u5B89\u88C5\u547D\u4EE4\uFF1A${t.reset}${l}
|
|
694
|
-
`),!await vr(" \u662F\u5426\u73B0\u5728\u5B89\u88C5\uFF1F",!0)){i.push(o.name);continue}(await _n(o,n,void 0,
|
|
698
|
+
`),!await vr(" \u662F\u5426\u73B0\u5728\u5B89\u88C5\uFF1F",!0)){i.push(o.name);continue}(await _n(o,n,void 0,p=>process.stdout.write(`${t.gray} ${p}${t.reset}
|
|
695
699
|
`),{interactive:!0})).ok?(process.stdout.write(`${t.green} \u2713 ${o.name} \u5B89\u88C5\u5B8C\u6210${t.reset}
|
|
696
700
|
`),r.push(o.name)):(process.stdout.write(`${t.red} \u2717 ${o.name} \u5B89\u88C5\u5931\u8D25${t.reset}
|
|
697
701
|
`),s.push(o.name))}process.stdout.write(`
|
|
@@ -702,59 +706,59 @@ ${t.bold}\u7ED3\u679C${t.reset}
|
|
|
702
706
|
`)),e.length===0?process.stdout.write(` ${t.gray}\u5F53\u524D\u5E73\u53F0\u6CA1\u6709\u9700\u8981\u68C0\u67E5\u7684\u4F9D\u8D56\u3002${t.reset}
|
|
703
707
|
`):r.length===0&&i.length===0&&s.length===0&&process.stdout.write(` ${t.green}\u6240\u6709\u4F9D\u8D56\u5747\u5DF2\u5C31\u7EEA\u3002${t.reset}
|
|
704
708
|
`),process.stdout.write(`
|
|
705
|
-
`)}var
|
|
706
|
-
`),
|
|
709
|
+
`)}var Co=v(require("fs")),qn=v(require("path"));var Rc=52;async function To(n){switch(n[0]?.trim().toLowerCase()){case void 0:await Mc();return;case"list":case"ls":Ao(!0);return;case"enable":case"on":await Hn(n.slice(1),!0);return;case"disable":case"off":await Hn(n.slice(1),!1);return;case"delete":case"remove":case"rm":await ko(n.slice(1));return;case"help":case"-h":case"--help":wo();return;default:process.stdout.write(`${t.red}\u672A\u77E5\u5B50\u547D\u4EE4\uFF1A${n[0]}${t.reset}
|
|
710
|
+
`),wo(),process.exitCode=1}}function Ao(n){let e=ie({includeDisabled:!0}),r=ie(),s=e.filter(a=>a.source==="builtin").length,i=e.length-s,o=qn.join(T(),"skills.json");if(process.stdout.write(`
|
|
707
711
|
${t.bold}\u7384\u732A\u6280\u80FD\u5217\u8868${t.reset} ${t.gray}(\u5185\u7F6E ${s} \xB7 \u7528\u6237 ${i} \xB7 \u5DF2\u7981\u7528 ${e.length-r.length} \xB7 ${o})${t.reset}
|
|
708
712
|
`),e.length===0){process.stdout.write(` ${t.yellow}\u6CA1\u6709\u53D1\u73B0\u4EFB\u4F55\u6280\u80FD\u3002${t.reset}
|
|
709
713
|
${t.gray}\u628A\u542B SKILL.md \u7684\u76EE\u5F55\u653E\u8FDB ${t.reset}~/.xzh/skills/<name>${t.gray} \u5373\u53EF\u3002${t.reset}
|
|
710
|
-
`);return}for(let a of e){let l=!r.some(m=>m.name===a.name),c=l?`${t.yellow}\u2717${t.reset}`:`${t.green}\u2713${t.reset}`,u=a.source==="user"?`${t.cyan}\u7528\u6237${t.reset}`:"\u5185\u7F6E",
|
|
711
|
-
`)}}async function
|
|
714
|
+
`);return}for(let a of e){let l=!r.some(m=>m.name===a.name),c=l?`${t.yellow}\u2717${t.reset}`:`${t.green}\u2713${t.reset}`,u=a.source==="user"?`${t.cyan}\u7528\u6237${t.reset}`:"\u5185\u7F6E",p=l?`${t.gray}\uFF08\u5DF2\u7981\u7528\uFF09${t.reset} `:"",d=vt(a.name,22),h=l?`${t.gray}${d}${t.reset}`:`${t.bold}${d}${t.reset}`;process.stdout.write(` ${c} ${h} ${u} ${p}${t.gray}${O(a.description,Rc)}${t.reset}
|
|
715
|
+
`)}}async function Hn(n,e){let r=e?"\u542F\u7528":"\u7981\u7528",s=n.find(c=>!c.startsWith("-"));if(s){let c=ie({includeDisabled:!0}).find(u=>u.name.toLowerCase()===s.trim().toLowerCase());if(!c){process.stdout.write(`${t.red}\u672A\u627E\u5230\u6280\u80FD\uFF1A${s}${t.reset}
|
|
712
716
|
${t.gray}\u8FD0\u884C ${t.reset}xzh skill list${t.gray} \u67E5\u770B\u5168\u90E8\u6280\u80FD\u3002${t.reset}
|
|
713
|
-
`),process.exitCode=1;return}
|
|
717
|
+
`),process.exitCode=1;return}So(c,e);return}let i=new Set(ie().map(c=>c.name)),o=ie({includeDisabled:!0}).filter(c=>e?!i.has(c.name):i.has(c.name));if(o.length===0){process.stdout.write(`${t.yellow}\u6CA1\u6709\u53EF${r}\u7684\u6280\u80FD\u3002${t.reset}
|
|
714
718
|
${t.gray}\u8FD0\u884C ${t.reset}xzh skill list${t.gray} \u67E5\u770B\u5F53\u524D\u72B6\u6001\u3002${t.reset}
|
|
715
|
-
`);return}let a=await Ae(`\u9009\u62E9\u8981${r}\u7684\u6280\u80FD\uFF1A`,[...o.map(c=>({label:c.name,value:c.name,hint:`${c.source==="user"?"\u7528\u6237":"\u5185\u7F6E"} \xB7 ${O(c.description,36)}`})),{label:"\u53D6\u6D88",value:""}],0);if(!a)return;let l=o.find(c=>c.name===a);l&&
|
|
719
|
+
`);return}let a=await Ae(`\u9009\u62E9\u8981${r}\u7684\u6280\u80FD\uFF1A`,[...o.map(c=>({label:c.name,value:c.name,hint:`${c.source==="user"?"\u7528\u6237":"\u5185\u7F6E"} \xB7 ${O(c.description,36)}`})),{label:"\u53D6\u6D88",value:""}],0);if(!a)return;let l=o.find(c=>c.name===a);l&&So(l,e)}function So(n,e){if(!er(n.name,!e)){process.stdout.write(`${t.yellow}\u6280\u80FD\u300C${n.name}\u300D\u672C\u6765\u5C31\u5904\u4E8E${e?"\u542F\u7528":"\u7981\u7528"}\u72B6\u6001\u3002${t.reset}
|
|
716
720
|
`);return}let s=e?`${t.green}\u5DF2\u542F\u7528${t.reset}`:`${t.yellow}\u5DF2\u7981\u7528${t.reset}`;process.stdout.write(`${s}\u6280\u80FD\u300C${t.bold}${n.name}${t.reset}\u300D${t.gray}(\u6765\u6E90\uFF1A${n.source==="user"?"\u7528\u6237":"\u5185\u7F6E"})${t.reset}
|
|
717
721
|
${t.gray}${e?"list_skills / load_skill \u73B0\u5728\u53EF\u4EE5\u770B\u5230\u5B83\u4E86\u3002":"list_skills / load_skill \u4E0D\u518D\u770B\u5230\u5B83\uFF08\u968F\u65F6\u53EF\u518D\u542F\u7528\uFF09\u3002"}${t.reset}
|
|
718
|
-
`)}async function
|
|
722
|
+
`)}async function ko(n){let e=n.some(i=>i==="--yes"||i==="-y"),r=n.find(i=>!i.startsWith("-")),s;if(r){if(s=ie({includeDisabled:!0}).find(i=>i.name.toLowerCase()===r.trim().toLowerCase()),!s){process.stdout.write(`${t.red}\u672A\u627E\u5230\u6280\u80FD\uFF1A${r}${t.reset}
|
|
719
723
|
${t.gray}\u8FD0\u884C ${t.reset}xzh skill list${t.gray} \u67E5\u770B\u5168\u90E8\u6280\u80FD\u3002${t.reset}
|
|
720
724
|
`),process.exitCode=1;return}}else{let i=ie({includeDisabled:!0}).filter(a=>a.source==="user");if(i.length===0){process.stdout.write(`${t.yellow}\u6CA1\u6709\u53EF\u5220\u9664\u7684\u7528\u6237\u6280\u80FD${t.gray}\uFF08~/.xzh/skills/ \u4E0B\u6CA1\u6709\u81EA\u5EFA\u6280\u80FD\uFF09\u3002${t.reset}
|
|
721
725
|
${t.gray}\u5185\u7F6E\u6280\u80FD\u4E0D\u53EF\u5220\u9664\uFF0C\u5982\u9700\u9690\u85CF\u8BF7\u7528 ${t.reset}xzh skill disable <\u540D\u79F0>${t.gray}\u3002${t.reset}
|
|
722
726
|
`);return}let o=await Ae("\u9009\u62E9\u8981\u5220\u9664\u7684\u7528\u6237\u6280\u80FD\uFF1A",[...i.map(a=>({label:a.name,value:a.name,hint:a.dir})),{label:"\u53D6\u6D88",value:""}],0);if(!o)return;s=i.find(a=>a.name===o)}if(s){if(s.source!=="user"){process.stdout.write(`${t.yellow}\u300C${s.name}\u300D\u662F\u5185\u7F6E\u6280\u80FD\uFF0C\u4E0D\u80FD\u5220\u9664\u3002${t.reset}
|
|
723
727
|
${t.gray}\u5982\u9700\u9690\u85CF\uFF0C\u8FD0\u884C ${t.reset}xzh skill disable ${s.name}${t.gray}\u3002${t.reset}
|
|
724
728
|
`),process.exitCode=1;return}if(!e&&!await vr(`\u5220\u9664\u7528\u6237\u6280\u80FD\u300C${s.name}\u300D\uFF08\u6574\u4E2A\u76EE\u5F55 ${s.dir}\uFF0C\u4E0D\u53EF\u6062\u590D\uFF09\uFF1F`,!1)){process.stdout.write(`${t.gray}\u5DF2\u53D6\u6D88\u3002${t.reset}
|
|
725
|
-
`);return}try{
|
|
729
|
+
`);return}try{Co.rmSync(s.dir,{recursive:!0,force:!0})}catch(i){process.stdout.write(`${t.red}\u5220\u9664\u5931\u8D25\uFF1A${i instanceof Error?i.message:String(i)}${t.reset}
|
|
726
730
|
`),process.exitCode=1;return}er(s.name,!1),process.stdout.write(`${t.green}\u5DF2\u5220\u9664\u7528\u6237\u6280\u80FD\u300C${t.bold}${s.name}${t.reset}${t.green}\u300D\u3002${t.reset}
|
|
727
731
|
${t.gray}\u76EE\u5F55\uFF1A${s.dir}${t.reset}
|
|
728
732
|
${t.gray}\u82E5\u5B83\u66FE\u8986\u76D6\u540C\u540D\u5185\u7F6E\u6280\u80FD\uFF0C\u8BE5\u5185\u7F6E\u6280\u80FD\u73B0\u5DF2\u6062\u590D\u53EF\u89C1\u3002${t.reset}
|
|
729
|
-
`)}}async function
|
|
733
|
+
`)}}async function Mc(){if(!process.stdin.isTTY){process.stdout.write(`${t.yellow}\u4EA4\u4E92\u5F0F\u6280\u80FD\u7BA1\u7406\u9700\u8981 TTY\u3002${t.reset}
|
|
730
734
|
${t.gray}\u975E\u4EA4\u4E92\u573A\u666F\u8BF7\u7528\uFF1A${t.reset}xzh skill list${t.gray} / ${t.reset}xzh skill enable|disable <\u540D\u79F0>${t.gray} / ${t.reset}xzh skill delete <\u540D\u79F0> [--yes]${t.reset}
|
|
731
|
-
`),process.exitCode=1;return}for(;;)switch(
|
|
735
|
+
`),process.exitCode=1;return}for(;;)switch(Ao(!0),await Ae("\u8BF7\u9009\u62E9\u64CD\u4F5C\uFF1A",[{label:"\u542F\u7528 / \u7981\u7528\u6280\u80FD",value:"toggle",hint:"\u5207\u6362\u53EF\u89C1\u6027"},{label:"\u5220\u9664\u6280\u80FD\uFF08\u4EC5\u7528\u6237\u6280\u80FD\uFF09",value:"delete",hint:"\u4E0D\u53EF\u6062\u590D"},{label:"\u9000\u51FA",value:"exit"}],0)){case"toggle":await Hn([],!0);break;case"delete":await ko([]);break;default:process.stdout.write(`
|
|
732
736
|
${t.gray}\u5DF2\u9000\u51FA\u6280\u80FD\u7BA1\u7406\u3002${t.reset}
|
|
733
|
-
`);return}}function
|
|
734
|
-
`))}process.stdout.on("error",n=>{n.code==="EPIPE"&&process.exit(0)});process.stderr.on("error",()=>{});for(let n of["SIGTERM","SIGHUP"])process.on(n,()=>{
|
|
737
|
+
`);return}}function wo(){process.stdout.write(["",`${t.bold}\u7528\u6CD5${t.reset}`,` ${t.green}xzh skill${t.reset} \u4EA4\u4E92\u5F0F\u7BA1\u7406\u6280\u80FD\uFF08\u542F\u7528 / \u7981\u7528 / \u5220\u9664\uFF09`,` ${t.green}xzh skill list${t.reset} \u5217\u51FA\u5168\u90E8\u6280\u80FD\uFF08\u542B\u5DF2\u7981\u7528\u9879\u4E0E\u6765\u6E90\uFF09`,` ${t.green}xzh skill enable <\u540D\u79F0>${t.reset} \u542F\u7528\u6280\u80FD`,` ${t.green}xzh skill disable <\u540D\u79F0>${t.reset} \u7981\u7528\u6280\u80FD\uFF08list_skills / load_skill \u4E0D\u518D\u53EF\u89C1\uFF09`,` ${t.green}xzh skill delete <\u540D\u79F0> [--yes]${t.reset}`," \u5220\u9664\u6280\u80FD\uFF08\u4EC5\u9650\u7528\u6237\u6280\u80FD\uFF1B\u5185\u7F6E\u6280\u80FD\u8BF7\u6539\u7528 disable\uFF09","",`${t.bold}\u8BF4\u660E${t.reset}`,` \u72B6\u6001\u4FDD\u5B58\u5728 ${t.gray}${qn.join(T(),"skills.json")}${t.reset}\u3002`," \u7981\u7528 = list_skills / load_skill \u4E0D\u518D\u53EF\u89C1\uFF08\u53EF\u968F\u65F6\u6062\u590D\uFF09\uFF1B"," \u5220\u9664 = \u4ECE\u78C1\u76D8\u79FB\u9664\u6280\u80FD\u76EE\u5F55\uFF0C\u4EC5\u5BF9\u7528\u6237\u6280\u80FD\uFF08~/.xzh/skills/<name>\uFF09\u751F\u6548\u3002",""].join(`
|
|
738
|
+
`))}process.stdout.on("error",n=>{n.code==="EPIPE"&&process.exit(0)});process.stderr.on("error",()=>{});for(let n of["SIGTERM","SIGHUP"])process.on(n,()=>{jn(),fr(),process.exit(0)});process.on("uncaughtException",n=>{Nn("\u672A\u6355\u83B7\u5F02\u5E38",n),fr(),process.stderr.write(`
|
|
735
739
|
\u672A\u6355\u83B7\u5F02\u5E38\uFF1A${n?.stack??String(n)}
|
|
736
740
|
`),process.stderr.write(`\u8BE6\u60C5\u5DF2\u5199\u5165 ${$r()}
|
|
737
|
-
`),process.exit(1)});process.on("unhandledRejection",n=>{
|
|
741
|
+
`),process.exit(1)});process.on("unhandledRejection",n=>{Nn("\u672A\u5904\u7406\u7684 Promise \u62D2\u7EDD",n),fr(),process.stderr.write(`
|
|
738
742
|
\u672A\u5904\u7406\u7684 Promise \u62D2\u7EDD\uFF1A${String(n)}
|
|
739
743
|
`),process.stderr.write(`\u8BE6\u60C5\u5DF2\u5199\u5165 ${$r()}
|
|
740
|
-
`),process.exit(1)});async function
|
|
741
|
-
`);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
|
|
742
|
-
`);return;default:{if(i.startsWith("-")){Eo();return}let o=
|
|
744
|
+
`),process.exit(1)});async function Ic(){let n=Yn();n.migrated&&process.stdout.write(`${t.gray}\u5DF2\u5C06\u5168\u5C40\u76EE\u5F55\u8FC1\u79FB\u81F3 ${T()}${n.from?`\uFF08\u539F ${n.from}\uFF09`:""}${t.reset}
|
|
745
|
+
`);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 _o(void 0,r);return;case"model":await $o(s.slice(1));return;case"config":await fo(s.slice(1));return;case"setup":await xo();return;case"skill":await To(s.slice(1));return;case"device":await Vs(s.slice(1));return;case"help":case"-h":case"--help":Eo();return;case"version":case"-v":case"--version":process.stdout.write(`\u7384\u732A xzh v${K}
|
|
746
|
+
`);return;default:{if(i.startsWith("-")){Eo();return}let o=Oc(i);if(o){await _o(o,r);return}if(Dc(i)){process.stdout.write(`${t.red}\u76EE\u5F55\u4E0D\u5B58\u5728\u6216\u4E0D\u662F\u76EE\u5F55\uFF1A${i}${t.reset}
|
|
743
747
|
`),process.exitCode=1;return}process.stdout.write(`${t.red}\u672A\u77E5\u547D\u4EE4\uFF1A${i}${t.reset}
|
|
744
748
|
${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}
|
|
745
|
-
`),process.exitCode=1}}}function
|
|
749
|
+
`),process.exitCode=1}}}function Dc(n){return n.startsWith("/")||n.startsWith("~")||n.startsWith("./")||n.startsWith("../")||n==="."||n===".."}function Oc(n){let e=q(n),r=br.isAbsolute(e)?e:br.resolve(process.cwd(),e);try{if(dt.existsSync(r)&&dt.statSync(r).isDirectory())return dt.realpathSync(r)}catch{}return null}async function _o(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}
|
|
746
750
|
${t.gray}\u8BF7\u5728\u771F\u5B9E\u7EC8\u7AEF\u4E2D\u8FD0\u884C xzh\u3002${t.reset}
|
|
747
751
|
`),process.exitCode=1;return}let r=te(),s=je(r);if(!s){process.stdout.write(`${t.yellow}\u5C1A\u672A\u914D\u7F6E\u4EFB\u4F55\u6A21\u578B\u3002${t.reset}
|
|
748
752
|
${t.gray}\u8BF7\u5148\u8FD0\u884C ${t.reset}xzh model add <provider> <model>${t.gray} \u6DFB\u52A0\u6A21\u578B\u3002${t.reset}
|
|
749
|
-
`),process.exitCode=1;return}let i=
|
|
753
|
+
`),process.exitCode=1;return}let i=Jr(r,s);if(i.length>0){process.stdout.write(`${t.yellow}\u26A0 \u5F53\u524D\u6A21\u578B\u4E0D\u53EF\u7528\uFF1A${t.reset}
|
|
750
754
|
`);for(let u of i)process.stdout.write(` ${t.gray}\xB7${t.reset} ${u}
|
|
751
755
|
`);ht()?process.stdout.write(`
|
|
752
756
|
${t.gray}\u914D\u7F6E\u6587\u4EF6\uFF1A${D()}${t.reset}
|
|
753
757
|
`):process.stdout.write(`
|
|
754
758
|
${t.gray}\u63D0\u793A\uFF1A\u8FD0\u884C ${t.reset}xzh model${t.gray} \u5B8C\u6210\u521D\u59CB\u5316\u914D\u7F6E\u3002${t.reset}
|
|
755
|
-
`),process.exitCode=1;return}let o=
|
|
759
|
+
`),process.exitCode=1;return}let o=ks(r).filter(u=>!i.includes(u));if(o.length>0){process.stdout.write(`${t.yellow}\u26A0 ${o.length} \u4E2A\u5907\u7528\u6A21\u578B\u6682\u4E0D\u53EF\u7528\uFF08\u4E0D\u5F71\u54CD\u672C\u6B21\u542F\u52A8\uFF09\uFF1A${t.reset}
|
|
756
760
|
`);for(let u of o)process.stdout.write(` ${t.gray}\xB7${t.reset} ${u}
|
|
757
|
-
`)}let a=we(s.provider),l=Ot(r,s);await new mr({provider:l,config:r,cwd:n??process.cwd(),providerLabel:a?.label??s.provider,model:s.model,activeModel:s,intentEnabled:e!==void 0?e:r.intent?.enabled===!0,autoApprove:r.autoApprove,startupNotice:
|
|
761
|
+
`)}let a=we(s.provider),l=Ot(r,s);await new mr({provider:l,config:r,cwd:n??process.cwd(),providerLabel:a?.label??s.provider,model:s.model,activeModel:s,intentEnabled:e!==void 0?e:r.intent?.enabled===!0,autoApprove:r.autoApprove,startupNotice:Lc()}).start(),jn()}function Lc(){let n=po(K);if(!n)return;let e=n.startedAt?`\uFF08\u5F00\u59CB\u4E8E ${n.startedAt}\uFF09`:"",r=[`${t.yellow}\u26A0 \u4E0A\u6B21\u8FD0\u884C\u7591\u4F3C\u5F02\u5E38\u9000\u51FA${e}${t.reset}`];if(n.crashLog){r.push(`${t.gray} \u6700\u540E\u7684\u8BB0\u5F55\uFF1A${t.reset}`);for(let s of n.crashLog.trim().split(`
|
|
758
762
|
`).slice(-10))r.push(`${t.gray} ${s}${t.reset}`)}else r.push(`${t.gray} \u672A\u7559\u4E0B\u65E5\u5FD7 \u2014\u2014 \u591A\u4E3A\u8FDB\u7A0B\u88AB\u5F3A\u5236\u7EC8\u6B62\uFF08\u4F8B\u5982\u5185\u5B58\u4E0D\u8DB3\u88AB\u7CFB\u7EDF\u6740\u6389\uFF09${t.reset}`);return r.push(`${t.gray} \u5B8C\u6574\u65E5\u5FD7\uFF1A${$r()}${t.reset}`,""),r.join(`
|
|
759
763
|
`)}function Eo(){let n=`
|
|
760
764
|
${t.brightMagenta}${t.bold}\u7384\u732A XuanZhu${t.reset} ${t.gray}v${K} \u2014\u2014 \u4E13\u4E3A\u7EC8\u7AEF\u6253\u9020\u7684 AI \u7F16\u7801 Agent${t.reset}
|
|
@@ -807,6 +811,6 @@ ${t.bold}\u754C\u9762\u5185\u5FEB\u6377\u952E${t.reset}
|
|
|
807
811
|
Enter \u63D0\u4EA4 \xB7 Ctrl+J \u6362\u884C \xB7 \u2191/\u2193 \u5386\u53F2 \xB7 PgUp/PgDn \u6EDA\u52A8
|
|
808
812
|
Ctrl+C \u4E2D\u65AD\u4EFB\u52A1/\u9000\u51FA \xB7 Ctrl+L \u6E05\u5C4F \xB7 \u8F93\u5165 /help \u67E5\u770B\u5185\u7F6E\u547D\u4EE4
|
|
809
813
|
\u5207\u6362\u9879\u76EE\u76EE\u5F55\uFF1A\u5728\u754C\u9762\u4E2D\u8F93\u5165 ${t.green}/switch <\u76EE\u5F55>${t.reset}
|
|
810
|
-
`;process.stdout.write(n)}
|
|
814
|
+
`;process.stdout.write(n)}Ic().catch(n=>{process.stdout.write(`
|
|
811
815
|
${t.red}\u7384\u732A\u8FD0\u884C\u51FA\u9519\uFF1A${ce(n)}${t.reset}
|
|
812
816
|
`),process.exit(1)});
|