@luban-code/luban-code 0.0.0-stage → 1.66.1
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/LICENSE +204 -0
- package/README.md +112 -2
- package/README.zh.md +164 -0
- package/dist/cli.js +1014 -0
- package/dist/extension.js +899 -0
- package/package.json +551 -6
|
@@ -0,0 +1,899 @@
|
|
|
1
|
+
/*! Luban | Copyright 2026 eppen (liuhualiang) | SPDX-License-Identifier: Apache-2.0 */
|
|
2
|
+
var Q=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var tc=Q((cS,ec)=>{function Ds(t){let e=String(t??"");return e===""?[]:e.split(`
|
|
3
|
+
`)}function bi(t){return(t||[]).join(`
|
|
4
|
+
`)}function cm(t,e){let n=t.length,s=e.length,o=s+1,r=new Int32Array((n+1)*o);for(let c=n-1;c>=0;c--){let u=c*o,d=(c+1)*o;for(let f=s-1;f>=0;f--)r[u+f]=t[c]===e[f]?r[d+f+1]+1:Math.max(r[d+f],r[u+f+1])}let i=[],a=0,l=0;for(;a<n&&l<s;)t[a]===e[l]?(i.push({t:" ",s:t[a]}),a++,l++):r[(a+1)*o+l]>=r[a*o+l+1]?(i.push({t:"-",s:t[a]}),a++):(i.push({t:"+",s:e[l]}),l++);for(;a<n;)i.push({t:"-",s:t[a++]});for(;l<s;)i.push({t:"+",s:e[l++]});return i}function um(t,e,n){let s=0,o=0;for(let u=0;u<e;u++)t[u].t!=="+"&&s++,t[u].t!=="-"&&o++;let r=t.slice(e,n).map(function(u){return{t:u.t,s:u.s}}),i=0,a=0,l=0,c=0;for(let u of r)u.t!=="+"&&i++,u.t!=="-"&&a++,u.t==="+"&&l++,u.t==="-"&&c++;return{oldStart:s,oldLines:i,newStart:o,newLines:a,add:l,del:c,header:"@@ -"+(s+1)+","+i+" +"+(o+1)+","+a+" @@",lines:r}}function dm(t){let e=[];for(let o=0;o<t.length;o++)t[o].t!==" "&&e.push(o);let n=[],s=0;for(;s<e.length;){let o=e[s],r=o,i=s+1;for(;i<e.length&&e[i]-r-1<=2*3;)r=e[i],i++;s=i;let a=Math.max(0,o-3),l=Math.min(t.length,r+3+1);n.push(um(t,a,l))}return n.forEach(function(o,r){o.id="h"+(r+1)}),n}function fm(t,e){let n=Ds(t),s=Ds(e),o=n.length,r=s.length,i=0;for(;i<o&&i<r&&n[i]===s[i];)i++;let a=0;for(;a<o-i&&a<r-i&&n[o-1-a]===s[r-1-a];)a++;let l=n.slice(i,o-a),c=s.slice(i,r-a);if(!l.length&&!c.length)return[];let u;l.length*c.length>1e6?u=l.map(function(f){return{t:"-",s:f}}).concat(c.map(function(f){return{t:"+",s:f}})):u=cm(l,c);let d=[];for(let f=0;f<i;f++)d.push({t:" ",s:n[f]});for(let f of u)d.push(f);for(let f=o-a;f<o;f++)d.push({t:" ",s:n[f]});return dm(d)}function pm(t){let e=0,n=0;for(let s of t||[])e+=s.add,n+=s.del;return{add:e,del:n,hunks:(t||[]).length}}function hm(t,e){let n=Ds(t),s=[];for(let o of e.lines)o.t!=="-"&&s.push(o.s);return bi(n.slice(0,e.oldStart).concat(s,n.slice(e.oldStart+e.oldLines)))}function mm(t,e){let n=Ds(t),s=[];for(let o of e.lines)o.t!=="+"&&s.push(o.s);return bi(n.slice(0,e.newStart).concat(s,n.slice(e.newStart+e.newLines)))}function gm(t,e){let n=[];for(let s of e.lines)s.t!=="+"&&n.push(s.s);return{start:e.newStart,end:e.newStart+e.newLines,lines:n}}function ym(t){let e=[],n=[],s=t.newStart,o=-1,r=null;for(let i of t.lines)i.t==="+"?(o<0&&(o=s),s++):i.t==="-"?(o>=0&&(e.push({start:o,count:s-o}),o=-1),r||(r={at:s,lines:[]},n.push(r)),r.lines.push(i.s)):(o>=0&&(e.push({start:o,count:s-o}),o=-1),r=null,s++);return o>=0&&e.push({start:o,count:s-o}),{add:e,del:n}}ec.exports={CONTEXT:3,splitLines:Ds,joinLines:bi,computeHunks:fm,stats:pm,applyHunkToBaseline:hm,revertHunkText:mm,revertHunkEdit:gm,hunkRanges:ym}});var uc=Q((uS,cc)=>{var mt=require("fs"),ns=require("fs").promises,oc=require("path"),rc=500,wi=2e4,nc=2e4,bm=8e4,wm=4e3,km=20,xm=40,ic=50,Sm=4,_m=5*1024*1024,vm={"image/png":"png","image/jpeg":"jpg","image/webp":"webp","image/gif":"gif"},Tm=/^[A-Za-z0-9_-]+\.[a-z]{3,4}$/;function $t(t){return(t<10?"0":"")+t}function ki(t){let e=t||new Date;return e.getFullYear()+$t(e.getMonth()+1)+$t(e.getDate())+"-"+$t(e.getHours())+$t(e.getMinutes())+$t(e.getSeconds())+"-"+Math.random().toString(36).slice(2,6)}function oe(t,e){let n=String(t??"");return n.length>e?n.slice(0,e)+"\u2026":n}function Mm(t){if(!Array.isArray(t)||!t.length)return;let e=[];for(let n of t.slice(0,Sm)){if(!n||typeof n!="object")continue;let s=oe(n.file,120),o=String(n.mime==null?"":n.mime),r=vm[o];if(!r||!Tm.test(s)||s.slice(s.lastIndexOf(".")+1)!==r)continue;let i=Math.min(_m,Math.floor(Number(n.bytes)||0));i<=0||e.push({file:s,mime:o,bytes:i})}return e.length?e:void 0}function Cm(t){let e=t?new Date(t):new Date;return isNaN(e.getTime())?"":$t(e.getMonth()+1)+"-"+$t(e.getDate())+" "+$t(e.getHours())+":"+$t(e.getMinutes())}var ac="\u65B0\u4F1A\u8BDD";function Am(t){typeof t=="string"&&t&&(ac=t)}function Ns(t,e,n){for(let s of t||[])if(s&&s.t==="user"&&s.text){let o=String(s.text).replace(/\s+/g," ").trim();if(o)return o.length>40?o.slice(0,40)+"\u2026":o}return(n||ac)+" \xB7 "+Cm(e)}var Em=40,Om={pending:1,in_progress:1,completed:1,cancelled:1},Pm=4,jm=6;function sc(t){if(!Array.isArray(t)||!t.length)return[];let e=[];for(let n of t.slice(0,Em)){if(!n||typeof n!="object")continue;let s=oe(n.id,64).trim(),o=oe(n.content,200).trim();if(!s||!o)continue;let r=String(n.status==null?"pending":n.status).trim().toLowerCase();e.push({id:s,content:o,status:Om[r]?r:"pending"})}return e}function Lm(t){if(!Array.isArray(t)||!t.length)return[];let e=[];for(let n of t.slice(0,jm)){if(!n||typeof n!="object")continue;let s=oe(n.id,64).trim(),o=oe(n.label,120).trim();if(!s||!o)continue;let r={id:s,label:o};n.recommended&&(r.recommended=!0),e.push(r)}return e}function Im(t){if(!Array.isArray(t)||!t.length)return[];let e=[];for(let n of t.slice(0,Pm)){if(!n||typeof n!="object")continue;let s=oe(n.id,64).trim(),o=oe(n.prompt,240).trim(),r=Lm(n.options);if(!s||!o||r.length<2)continue;let i={id:s,prompt:o,options:r};n.allow_multiple&&(i.allow_multiple=!0),e.push(i)}return e}function Dm(t,e){let n=t&&typeof t=="object"?t:{},s=Array.isArray(e)?e:[],o={};for(let r=0;r<s.length;r++){let i=s[r],a=Object.create(null);for(let c=0;c<i.options.length;c++)a[i.options[c].id]=1;let l=n[i.id];if(i.allow_multiple){let c=Array.isArray(l)?l:l==null||l===""?[]:[l],u=[],d=Object.create(null);for(let f=0;f<c.length;f++){let p=oe(c[f],64).trim();!p||!a[p]||d[p]||(d[p]=1,u.push(p))}u.length&&(o[i.id]=u)}else{let c=oe(Array.isArray(l)?l[0]:l,64).trim();c&&a[c]&&(o[i.id]=c)}}return o}function lc(t){let e=Object.assign({},t);if(e.t==="tool")return e.name=oe(e.name,60),e.path=oe(e.path,300),e.result=oe(e.result,wm),e.ok=e.ok!==!1,e;if(e.t==="sources")return e.items=(e.items||[]).slice(0,km).map(function(n){return{title:oe(n&&n.title,200),url:oe(n&&n.url,500),siteName:oe(n&&n.siteName,80),date:oe(n&&n.date,40)}}),e.query=oe(e.query,200),e;if(e.t==="refs")return e.refs=(e.refs||[]).slice(0,xm).map(function(n){return{kind:n&&n.kind==="selection"?"selection":"file",path:oe(n&&n.path,400),startLine:n&&n.startLine||0,endLine:n&&n.endLine||0,lines:n&&n.lines||0,truncated:!!(n&&n.truncated),omitted:!!(n&&n.omitted),label:oe(n&&n.label,400)}}),e;if(e.t==="usage"){let n=function(o){return Math.max(0,Math.floor(Number(o)||0))},s=function(o){let r=Number(o);return isFinite(r)&&r>0?Math.min(1,Number(r.toFixed(3))):0};return e.requests=n(e.requests),e.promptTokens=n(e.promptTokens),e.completionTokens=n(e.completionTokens),e.totalTokens=n(e.totalTokens),e.cachedTokens=n(e.cachedTokens),e.contextTokens=n(e.contextTokens),e.window=n(e.window),e.hit=s(e.hit),e.percent=s(e.percent),e.estimated=!!e.estimated,e.model=oe(e.model,120),delete e.prefixHint,e}if(e.t==="user"){e.text=oe(e.text,wi),e.web=!!e.web,e.ctx!=null&&(e.ctx=oe(e.ctx,bm)),e.exec&&(e.exec=!0);let n=Mm(e.images);return n?e.images=n:delete e.images,e}if(e.t==="error")return e.message=oe(e.message,2e3),e;if(e.t==="todos")return e.items=sc(e.items),e;if(e.t==="ask_question")return e.id=oe(e.id,80),e.title=oe(e.title,80),e.questions=Im(e.questions),e.answers=Dm(e.answers,e.questions),e;if(e.t==="plan"){e.planFile=oe(e.planFile,1e3),typeof e.text=="string"&&(e.text=oe(e.text,wi)),typeof e.think=="string"&&(e.think=oe(e.think,nc));let n=sc(e.todos);return n.length?e.todos=n:delete e.todos,e}return typeof e.text=="string"&&(e.text=oe(e.text,wi)),typeof e.think=="string"&&(e.think=oe(e.think,nc)),e}function xi(t){return{id:t.id,title:t.title||Ns(t.items,t.createdAt),createdAt:t.createdAt||"",updatedAt:t.updatedAt||"",root:t.root||"",modelKey:t.modelKey||"",mode:t.mode||"",items:(t.items||[]).length,bytes:t.bytes||0}}function ge(t,e){this.dir=t,this.max=e&&e.max||ic,this._listCache=null,this._listJson="",this._listMtime=0,this._wq=null,this._removed=new Set,this._syncGen=0,this._tmpSeq=0}ge.prototype.setMax=function(t){let e=Number(t);return isFinite(e)&&e>=1&&(this.max=Math.floor(e)),this.max};ge.prototype.fileOf=function(t){return oc.join(this.dir,String(t)+".json")};ge.prototype.indexPath=function(){return oc.join(this.dir,"index.json")};ge.prototype._ensureDir=function(){mt.mkdirSync(this.dir,{recursive:!0,mode:448})};ge.prototype._write=function(t,e){this._ensureDir();let n=t+".tmp-"+process.pid+"-"+ ++this._tmpSeq;if(mt.writeFileSync(n,e,{mode:384}),mt.existsSync(t))try{mt.copyFileSync(t,t+".bak")}catch{}mt.renameSync(n,t)};ge.prototype._writeAsync=async function(t,e,n){await ns.mkdir(this.dir,{recursive:!0,mode:448});let s=t+".tmp-"+process.pid+"-"+ ++this._tmpSeq;if(await ns.writeFile(s,e,{mode:384}),typeof n=="function"&&!n()){try{await ns.unlink(s)}catch{}return!1}try{await ns.access(t);try{await ns.copyFile(t,t+".bak")}catch{}}catch{}return await ns.rename(s,t),!0};ge.prototype._mtimeOf=function(t){try{return mt.statSync(t).mtimeMs}catch{return 0}};ge.prototype._ids=function(){let t=[];try{t=mt.readdirSync(this.dir)}catch{return[]}let e=[];for(let n of t)!/\.json$/.test(n)||n==="index.json"||e.push(n.slice(0,-5));return e};ge.prototype.rebuildIndex=function(){let t=[];for(let n of this._ids()){let s=this.load(n);s&&t.push(xi(s))}t.sort(function(n,s){return String(s.updatedAt).localeCompare(String(n.updatedAt))});let e=JSON.stringify({v:1,sessions:t})+`
|
|
5
|
+
`;try{this._write(this.indexPath(),e),this._listJson=e,this._listMtime=this._mtimeOf(this.indexPath())}catch{}return this._listCache=t,t};ge.prototype.readIndex=function(){if(this._listCache&&this._mtimeOf(this.indexPath())===this._listMtime)return this._listCache;let t=null;try{let e=mt.readFileSync(this.indexPath(),"utf8"),n=JSON.parse(e);Array.isArray(n)?t=n:n&&Array.isArray(n.sessions)&&(t=n.sessions),t&&(this._listJson=e,this._listMtime=this._mtimeOf(this.indexPath()))}catch{t=null}return t?(t=t.filter(function(e){return e&&e.id}),!t.length&&this._ids().length?this.rebuildIndex():(this._listCache=t,t)):this.rebuildIndex()};ge.prototype.writeIndex=function(t){let e=(t||[]).slice().sort(function(s,o){return String(o.updatedAt||"").localeCompare(String(s.updatedAt||""))}),n=JSON.stringify({v:1,sessions:e})+`
|
|
6
|
+
`;if(this._listCache=e,n===this._listJson)return e;try{this._write(this.indexPath(),n),this._listJson=n,this._listMtime=this._mtimeOf(this.indexPath())}catch{}return e};ge.prototype.list=function(t,e){let n=this.readIndex();return(!t||t==="all"?n:n.filter(function(o){return String(o.root||"")===String(e||"")})).slice().sort(function(o,r){return String(r.updatedAt||"").localeCompare(String(o.updatedAt||""))})};ge.prototype.create=function(t){let e=new Date;return{v:1,id:ki(e),title:"",createdAt:e.toISOString(),updatedAt:e.toISOString(),root:String(t??""),modelKey:"",mode:"",items:[]}};ge.prototype.load=function(t){if(!/^[A-Za-z0-9_-]+$/.test(String(t||"")))return null;let e=null;try{e=JSON.parse(mt.readFileSync(this.fileOf(t),"utf8"))}catch{e=null}if(!e)try{e=JSON.parse(mt.readFileSync(this.fileOf(t)+".bak","utf8"))}catch{e=null}return!e||!e.id?null:(Array.isArray(e.items)||(e.items=[]),e.title||(e.title=Ns(e.items,e.createdAt)),e)};ge.prototype._dropFiles=function(t){let e=this.fileOf(t);for(let n of[e,e+".bak",e+".tmp"])try{mt.existsSync(n)&&mt.unlinkSync(n)}catch{}};ge.prototype._prune=function(t){let e=(t||[]).slice().sort(function(o,r){return String(r.updatedAt||"").localeCompare(String(o.updatedAt||""))}),n=Math.max(1,this.max);if(e.length<=n)return e;let s=e.slice(0,n);for(let o of e.slice(n))this._dropFiles(o.id);return s};ge.prototype._prepare=function(t){if(!t||!t.id)throw new Error("session.id \u4E0D\u80FD\u4E3A\u7A7A");Array.isArray(t.items)||(t.items=[]),t.title||(t.title=Ns(t.items,t.createdAt)),t.updatedAt=new Date().toISOString()};ge.prototype._updateList=function(t){let e=xi(t),n=this.readIndex().filter(function(s){return s.id!==t.id});return n.push(e),this._listCache=this._prune(n),e};ge.prototype.save=function(t){this._prepare(t);let e=JSON.stringify(t)+`
|
|
7
|
+
`;return t.bytes=e.length,this._syncGen++,this._write(this.fileOf(t.id),e),this._updateList(t),this.writeIndex(this._listCache),t};ge.prototype.saveAsync=function(t){this._prepare(t),this._updateList(t);let e=this;return this._wq=(this._wq||Promise.resolve()).then(async function(){if(e._removed.has(t.id))return;let n=e._syncGen,s=JSON.stringify(t)+`
|
|
8
|
+
`;t.bytes=s.length,await e._writeAsync(e.fileOf(t.id),s,function(){return e._syncGen===n}),e._updateList(t),e.writeIndex(e._listCache)}).catch(function(){}),this._wq};ge.prototype.flush=function(){return this._wq||Promise.resolve()};ge.prototype.remove=function(t){if(!/^[A-Za-z0-9_-]+$/.test(String(t||"")))return!1;this._removed.add(String(t)),this._dropFiles(t);let e=this.readIndex().filter(function(n){return n.id!==t});return this.writeIndex(e),!0};ge.prototype.append=function(t,e){if(!t)return null;if(Array.isArray(t.items)||(t.items=[]),!e||!e.t)return t;let n=lc(e),s=t.items[t.items.length-1];for(n.t==="summary"&&s&&s.t==="summary"?t.items[t.items.length-1]=n:t.items.push(n);t.items.length>rc;)t.items.shift();return t.title||(t.title=Ns(t.items,t.createdAt)),t.updatedAt=new Date().toISOString(),t};function Si(t,e){let n=Array.isArray(t)?t:[],s=Math.floor(Number(e));if(!isFinite(s)||s<0||s>=n.length)return n.length;for(let o=s+1;o<n.length;o++)if(n[o]&&n[o].t==="user")return o;return n.length}function Nm(t){let e=Array.isArray(t)?t:[],n=[];for(let s=0;s<e.length;s++){let o=e[s];if(!o||o.t!=="user"||o.exec)continue;let r=String(o.text==null?"":o.text).replace(/\s+/g," ").trim();if(!r)continue;let i=Si(e,s);n.push({index:s,text:r,cut:i,rest:e.length-i})}return n}function Fm(t,e){let n=e||{},s=t||{},o=new Date,r=Array.isArray(s.items)?s.items:[],i=Number(n.at),a=n.at!=null&&isFinite(i)?Si(r,i):r.length,l=JSON.parse(JSON.stringify(r.slice(0,a))),c=String(n.suffix==null?"":n.suffix),u=String(n.title==null?"":n.title)||String(s.title||"");return c&&u&&u.slice(-c.length)!==c&&(u+=c),{v:1,id:ki(o),title:u,createdAt:o.toISOString(),updatedAt:o.toISOString(),root:String(s.root==null?"":s.root),modelKey:String(s.modelKey==null?"":s.modelKey),mode:String(s.mode==null?"":s.mode),items:l}}function Rm(t,e){return new ge(t,e)}cc.exports={DEFAULT_MAX_SESSIONS:ic,MAX_ITEMS:rc,Store:ge,newStore:Rm,titleOf:Ns,setUntitled:Am,stampId:ki,metaOf:xi,clampItem:lc,branchCut:Si,forkPoints:Nm,forkSession:Fm}});var fc=Q((dS,vi)=>{"use strict";var Rs={maxSessions:30,maxItems:5,snippet:100,maxTerms:6,maxText:2e4,budgetMs:1200};function qm(t,e){let n=String(t??"");return n.length>e?n.slice(0,e):n}function Fs(t,e){let n=e||Rs.maxTerms,s=[],o=Object.create(null);for(let r of String(t??"").split(/\s+/)){let i=r.toLowerCase();if(!(!i||o[i])&&(o[i]=1,s.push(i),s.length>=n))break}return s}function dc(t){let e=[];if(!t||typeof t!="object")return e;let n=function(s,o){typeof o=="string"&&o&&e.push({kind:s,text:o})};switch(t.t){case"user":n("user",t.text),n("user",t.ctx);break;case"tool":n("tool",t.name),n("tool",t.path),n("tool",t.result);break;case"sources":n("sources",t.query);for(let s of t.items||[])n("sources",s&&s.title),n("sources",s&&s.url);break;case"refs":for(let s of t.refs||[])n("refs",s&&s.label),n("refs",s&&s.path);break;case"todos":for(let s of t.items||[])n("todo",s&&s.content);break;case"ask_question":n("ask",t.title);for(let s of t.questions||[]){n("ask",s&&s.prompt);for(let o of s.options||[])n("ask",o&&o.label)}break;case"error":n("error",t.message);break;case"plan":n("plan",t.text);for(let s of t.todos||[])n("todo",s&&s.content);break;case"usage":break;default:n(t.t==="summary"?"summary":"text",t.text);break}return e}function Qo(t,e,n){let s=String(t??""),o=Math.max(20,n||Rs.snippet),r=s.toLowerCase(),i=e?r.indexOf(e):-1;i<0&&(i=0);let a=Math.floor(o/2),l=Math.max(0,i-a),c=Math.min(s.length,l+o);c-l<o&&(l=Math.max(0,c-o));let u=s.slice(l,c).replace(/\s+/g," ").trim();return u?(l>0&&(u="\u2026"+u),c<s.length&&(u+="\u2026"),u):""}function _i(t,e,n){let s=n||Rs,o=t&&Array.isArray(t.items)?t.items:[],r=[];for(let l=0;l<e.length;l++)r.push(!1);let i=[];for(let l of o){let c=dc(l);if(!c.length)continue;let u="";for(let m of c)u+=qm(m.text,s.maxText)+`
|
|
9
|
+
`;let d=u.toLowerCase(),f=0,p="";for(let m=0;m<e.length;m++)d.indexOf(e[m])<0||(r[m]=!0,f++,p||(p=e[m]));if(!f)continue;let h="";for(let m of c)if(String(m.text).toLowerCase().indexOf(p)>=0){h=Qo(m.text,p,s.snippet);break}i.push({kind:c[0].kind,score:f,snippet:h})}for(let l=0;l<r.length;l++)if(!r[l])return{count:0,hits:[],snippet:""};i.sort(function(l,c){return c.score-l.score});let a=i.slice(0,s.maxItems).map(function(l){return{kind:l.kind,snippet:l.snippet}});return{count:i.length,hits:a,snippet:a.length?a[0].snippet:""}}function tt(t,e,n){let s=Object.assign({},Rs,n||{}),o=Fs(e,s.maxTerms),r={q:String(e??""),terms:o,scanned:0,matched:0,truncated:!1,ms:0,results:[]};if(!o.length)return r;let i=Date.now(),a=Array.isArray(t)?t:[];for(let l of a){if(!l||!l.id||!(Number(l.items)>0))continue;if(s.maxSessions&&r.results.length>=s.maxSessions){r.truncated=!0;break}if(Date.now()-i>s.budgetMs){r.truncated=!0;break}r.scanned++;let c=null;try{c=s.load?s.load(l.id):null}catch{c=null}if(!c)continue;let u=_i(c,o,s);u.count&&(r.matched++,r.results.push({id:l.id,title:l.title||"",root:l.root||"",updatedAt:l.updatedAt||"",count:u.count,snippet:u.snippet,hits:u.hits}))}return r.results.sort(function(l,c){return c.count-l.count}),r.ms=Date.now()-i,r}vi.exports={DEFAULTS:Rs,termsOf:Fs,fieldsOf:dc,snippetOf:Qo,searchSession:_i,search:tt};if(require.main===vi){let t=0,e=[],n=function(S,T,g){if(T){t++;return}e.push(S+(g?" \u2192 "+g:""))},s={a:{id:"a",title:"\u80FD\u8017\u62A5\u544A\u5206\u6790",items:[{t:"user",text:"\u770B\u770B\u8FD9\u4EFD\u80FD\u8017\u6A21\u578B",ctx:`\u770B\u770B\u8FD9\u4EFD\u80FD\u8017\u6A21\u578B
|
|
10
|
+
#selection mes-energy/doc/\u80FD\u8017\u6A21\u578B.md:1-20`},{t:"text",text:"\u7ED3\u8BBA\uFF1A\u51B7\u5374\u5854\u529F\u8017\u504F\u9AD8\uFF0C\u5EFA\u8BAE\u6362\u53D8\u9891\u6CF5\u3002"},{t:"tool",name:"read_file",path:"mes-energy/doc/\u80FD\u8017\u6A21\u578B.md",result:"120 \u884C"}]},b:{id:"b",title:"AI \u53D1\u5C55\u5386\u7A0B",items:[{t:"user",text:"\u63CF\u8FF0AI\u7684\u53D1\u5C55\u5386\u7A0B"},{t:"text",text:"\u4ECE\u7B26\u53F7\u4E3B\u4E49\u5230\u6DF1\u5EA6\u5B66\u4E60\u2026"},{t:"error",message:"\u8BF7\u6C42\u8D85\u65F6\uFF08ETIMEDOUT\uFF09"}]},c:{id:"c",title:"\u7A7A\u4F1A\u8BDD",items:[]}},o=[{id:"a",title:"\u80FD\u8017\u62A5\u544A\u5206\u6790",updatedAt:"2026-11-01T00:00:00Z",items:3},{id:"b",title:"AI \u53D1\u5C55\u5386\u7A0B",updatedAt:"2026-10-31T00:00:00Z",items:3},{id:"c",title:"\u7A7A\u4F1A\u8BDD",updatedAt:"2026-10-30T00:00:00Z",items:0}],r=function(S){return s[S]||null};n("terms.split",JSON.stringify(Fs(" Foo bar foo "))===JSON.stringify(["foo","bar"])),n("terms.empty",Fs(" ").length===0),n("terms.cap",Fs("a b c d e f g h",3).length===3);let i=tt(o,"\u80FD\u8017\u6A21\u578B",{load:r});n("body.matched",i.results.length===1&&i.results[0].id==="a",JSON.stringify(i.results.map(function(S){return S.id}))),n("body.count",i.results[0]&&i.results[0].count===2,JSON.stringify(i.results[0])),n("body.snippetHasTerm",!!(i.results[0]&&i.results[0].snippet.indexOf("\u80FD\u8017\u6A21\u578B")>=0),i.results[0]&&i.results[0].snippet),n("scan.skipsEmpty",i.scanned===2,"scanned="+i.scanned),n("titleOnly.noBodyHit",tt(o,"\u80FD\u8017\u62A5\u544A\u5206\u6790",{load:r}).results.length===0);let a=tt(o,"etimedout",{load:r});n("body.errorItem",a.results.length===1&&a.results[0].id==="b"),n("body.snippet",a.results[0]&&a.results[0].snippet.indexOf("ETIMEDOUT")>=0,a.results[0]&&a.results[0].snippet);let l=tt(o,"read_file",{load:r});n("body.toolName",l.results.length===1&&l.results[0].id==="a"&&l.results[0].count===1);let c=tt(o,"#selection",{load:r});n("body.ctx",c.results.length===1&&c.results[0].id==="a");let u=tt(o,"\u53D8\u9891\u6CF5 ETIMEDOUT",{load:r});n("and.crossSessionMiss",u.results.length===0,JSON.stringify(u.results));let d=tt(o,"\u80FD\u8017 \u53D8\u9891\u6CF5",{load:r});n("and.crossItemHit",d.results.length===1&&d.results[0].id==="a",JSON.stringify(d.results.map(function(S){return S.id}))),n("and.countAnyTerm",d.results[0]&&d.results[0].count===3,JSON.stringify(d.results[0])),n("miss",tt(o,"\u4E0D\u5B58\u5728\u7684\u8BCD",{load:r}).results.length===0),n("emptyQuery",tt(o," ",{load:r}).results.length===0);let f=[];for(let S=0;S<5;S++)f.push({id:"m"+S,title:"T"+S,updatedAt:"2026-11-01T00:00:00Z",items:1}),s["m"+S]={id:"m"+S,title:"T"+S,items:[{t:"text",text:"\u5171\u540C\u5173\u952E\u8BCD "+S}]};let p=tt(f,"\u5171\u540C\u5173\u952E\u8BCD",{load:r,maxSessions:3});n("cap.results",p.results.length===3,"n="+p.results.length),n("cap.truncated",p.truncated===!0);let h=[{id:"x",title:"X",updatedAt:"2026-11-02T00:00:00Z",items:2},{id:"y",title:"Y",updatedAt:"2026-11-01T00:00:00Z",items:2}];s.x={id:"x",title:"X",items:[{t:"text",text:"k"},{t:"text",text:"k"}]},s.y={id:"y",title:"Y",items:[{t:"text",text:"k"},{t:"text",text:"k"},{t:"text",text:"k"}]};let m=tt(h,"k",{load:r});n("rank.countDesc",m.results[0].id==="y"&&m.results[1].id==="x",JSON.stringify(m.results.map(function(S){return S.id})));let x=tt(o,"\u80FD\u8017",{load:function(S){if(S==="a")throw new Error("boom");return r(S)}});n("load.throwing",x.results.length===0&&x.ms>=0);let b=Qo("x".repeat(300)+`
|
|
11
|
+
\u5173\u952E\u8BCD
|
|
12
|
+
`+"y".repeat(300),"\u5173\u952E\u8BCD",60);n("snippet.ellipsis",b.indexOf("\u2026")===0&&b.slice(-1)==="\u2026",b),n("snippet.flat",b.indexOf(`
|
|
13
|
+
`)<0),n("snippet.hasTerm",b.indexOf("\u5173\u952E\u8BCD")>=0),n("snippet.shortText",Qo("\u77ED\u6587\u672C","\u77ED",60)==="\u77ED\u6587\u672C");let k=_i({items:[{t:"text",text:"k"},{t:"text",text:"k"},{t:"text",text:"k"}]},["k"],{maxItems:2,maxText:2e4,snippet:60});if(n("hits.capped",k.count===3&&k.hits.length===2,JSON.stringify(k)),e.length){console.error("session-search.js \u81EA\u6D4B\u5931\u8D25 "+e.length+" \u9879\uFF08\u901A\u8FC7 "+t+"\uFF09\uFF1A");for(let S of e)console.error(" - "+S);process.exit(1)}console.log("session-search.js \u81EA\u6D4B\u901A\u8FC7 "+t+" \u9879")}});var kc=Q((fS,wc)=>{var er={enabled:!0,maxTurns:8,maxChars:12e3,maxItemChars:6e3},Ti="\u2026[\u5DF2\u622A\u65AD]",pc=2e4,hc=2e3,Bm=/^[A-Za-z0-9_-]+\.[a-z]{3,4}$/,Um={"image/png":1,"image/jpeg":1,"image/webp":1,"image/gif":1};function Wm(t){if(!t||typeof t!="object")return null;let e=String(t.file==null?"":t.file),n=String(t.mime==null?"":t.mime);if(!Bm.test(e)||e.length>120||!Um[n])return null;let s=Math.floor(Number(t.bytes));return!isFinite(s)||s<=0?null:{file:e,mime:n,bytes:s}}function Km(t,e){let n=[];for(let s of Array.isArray(t)?t:[]){let o=Wm(s);if(!o)continue;let r="";try{r=String(e(o)||"")}catch{r=""}r.indexOf("data:image/")===0&&n.push({type:"image_url",image_url:{url:r}})}return n}function Ci(t){if(Array.isArray(t)){let e=0;for(let n of t)!n||typeof n!="object"||(n.type==="text"?e+=String(n.text==null?"":n.text).length:n.type==="image_url"&&(e+=hc));return e}return String(t??"").length}function pn(t,e){let n=String(t??"");return e>0?n.length<=e?n:e<=Ti.length?n.slice(0,e):n.slice(0,e-Ti.length)+Ti:""}function Mi(t,e){let n=Number(t);return isFinite(n)&&n>=1?Math.floor(n):e}function Hm(t){let e=t||{};return{enabled:e.enabled!==!1,maxTurns:Mi(e.maxTurns,er.maxTurns),maxChars:Mi(e.maxChars,er.maxChars),maxItemChars:Mi(e.maxItemChars,er.maxItemChars),dropTailAssistant:!!e.dropTailAssistant,resolveImage:typeof e.resolveImage=="function"?e.resolveImage:function(){return""},spill:e.spill&&typeof e.spill=="object"?e.spill:null}}function mc(t){return!t||!t.t?"":t.t==="user"?"user":t.t==="text"||t.t==="plan"?"assistant":""}function gc(t){let e=0;for(let n of t||[])e+=Ci(n&&n.content);return e}function zm(t){return t?t.ctx!=null&&t.ctx!==""?t.ctx:t.text:""}function yc(t,e,n){let s=typeof n=="function"?n:function(){return""},o=[];for(let r of t||[]){let i=mc(r);if(!i)continue;let a=r.ctx!=null&&r.ctx!=="",l=a?Math.max(e,pc):e,c=pn(a?r.ctx:r.text,l).trim(),u=i==="user"?Km(r.images,s):[],d=i==="user"?Math.max(e,pc):e;if(u.length){let p=o[o.length-1];p&&p.role===i&&typeof p.content=="string"?p.content=[{type:"text",text:pn(p.content+`
|
|
14
|
+
|
|
15
|
+
`+c,d)}].concat(u):o.push({role:i,content:c?[{type:"text",text:c}].concat(u):u});continue}if(!c)continue;let f=o[o.length-1];if(f&&f.role===i)if(Array.isArray(f.content)){let p=null;for(let h of f.content)if(h&&typeof h=="object"&&h.type==="text"){p=h;break}p?p.text=pn(p.text+`
|
|
16
|
+
|
|
17
|
+
`+c,d):f.content.unshift({type:"text",text:pn(c,d)})}else f.content=pn(f.content+`
|
|
18
|
+
|
|
19
|
+
`+c,d);else o.push({role:i,content:c})}return o}function bc(t){let e=[],n=null;for(let s of t||[])s.role==="user"?(n=[s],e.push(n)):n&&s.role==="assistant"&&n.push(s);return e}function Gm(t,e,n){let s=gc(e);if(s<=n){for(let a of e)t.push({role:a.role,content:a.content});return{chars:s,dropped:0}}let o=n>0?n/s:0,r=0,i=0;for(let a of e){let l=Math.floor(Ci(a.content)*o);if(l<=0){i++;continue}if(Array.isArray(a.content)){let u="",d=0;for(let h of a.content)!h||typeof h!="object"||(h.type==="text"?u+=String(h.text==null?"":h.text):h.type==="image_url"&&(d+=hc));if(l<=d){i++;continue}let f=[],p=pn(u,l-d);p&&f.push({type:"text",text:p});for(let h of a.content)h&&typeof h=="object"&&h.type==="image_url"&&f.push(h);t.push({role:a.role,content:f}),r+=Ci(f);continue}let c=pn(a.content,l);t.push({role:a.role,content:c}),r+=c.length}return{chars:r,dropped:i}}function Jm(t){let e=[];for(let n of t||[]){if(!n||!n.role)continue;let s="";if(Array.isArray(n.content))for(let o of n.content)o&&typeof o=="object"&&o.type==="text"&&(s+=String(o.text==null?"":o.text));else s=String(n.content==null?"":n.content);s=s.replace(/\s+/g," ").trim(),s&&e.push({role:n.role,summary:s})}return e}function $m(t,e){let n=Hm(e),s={messages:[],turns:0,chars:0,dropped:0,enabled:n.enabled,spilledTurns:0,spillDigest:"",spillIds:[]};if(!n.enabled)return s;let o=yc(t,n.maxItemChars,n.resolveImage);if(n.dropTailAssistant)for(;o.length&&o[o.length-1].role==="assistant";)o.pop();let r=bc(o);if(!r.length)return s;let i=[],a=0,l=0,c=0;for(let m=r.length-1;m>=0;m--){if(i.length>=n.maxTurns){c=m+1;break}let x=r[m],b=gc(x);if(!(i.length===0)&&a+b>n.maxChars){c=m+1;break}let S=[],T=Gm(S,x,n.maxChars-a);a+=T.chars,l+=T.dropped,i.push(S),c=m}let u=[];for(let m=i.length-1;m>=0;m--)for(let x of i[m])u.push(x);let d=[],f=[],p=n.spill&&typeof n.spill=="object"?n.spill:null;for(let m=0;m<c;m++){let x=Jm(r[m]);for(let b of x)d.push(b);if(p&&typeof p.put=="function"&&r[m]&&r[m].length)try{let b=typeof p.newId=="function"?p.newId():"sp_mem_"+m,k=r[m].map(function(S){let T=S.role||"",g=Array.isArray(S.content)?S.content.filter(function(_){return _&&_.type==="text"}).map(function(_){return _.text}).join(""):String(S.content==null?"":S.content);return T+": "+g}).join(`
|
|
20
|
+
|
|
21
|
+
`);p.put(b,k,{kind:"memory_turn",turnIndex:m}),f.push(b)}catch{}}let h="";if(d.length)if(p&&typeof p.memoryDigestBlock=="function")h=p.memoryDigestBlock(d);else{let m=["[\u66F4\u65E9\u8F6E\u6B21\u6458\u8981\uFF08\u5B8C\u6574\u5BF9\u8BDD\u5DF2\u88C1\u51FA\u4E0A\u4E0B\u6587\uFF09]"];for(let x of d){let b=x.role==="assistant"?"\u52A9\u624B":x.role==="user"?"\u7528\u6237":x.role,k=String(x.summary||"").slice(0,160);k&&m.push("- "+b+"\uFF1A"+k)}h=m.join(`
|
|
22
|
+
`).slice(0,1200)}return{messages:u,turns:i.length,chars:a,dropped:l,enabled:!0,spilledTurns:c,spillDigest:h,spillIds:f}}function Xm(t,e){let n=String(e??""),s=t||[];if(!n)return s;let o=s[s.length-1];return o&&o.role==="user"&&!Array.isArray(o.content)?o.content=String(o.content||"")+`
|
|
23
|
+
|
|
24
|
+
`+n:s.push({role:"user",content:n}),s}wc.exports={DEFAULTS:er,build:$m,pushUser:Xm,_clipText:pn,_roleOf:mc,_textOf:zm,_flatten:yc,_groupTurns:bc}});var _c=Q((pS,Sc)=>{var Ei=["<think>","<thinking>","[think]"],tr=["</think>","</thinking>","[/think]"],xc=Math.max.apply(null,Ei.concat(tr).map(function(t){return t.length}))-1;function Ai(t,e){let n=null;for(let s of e){let o=t.indexOf(s);o>=0&&(!n||o<n.at)&&(n={at:o,tag:s})}return n}function Vm(t){let e=t||{},n="",s="",o="",r="answer",i=!0;function a(p){if(p&&(n+=p,e.onContent))try{e.onContent(p)}catch{}}function l(p){if(p&&(s+=p,e.onReasoning))try{e.onReasoning(p)}catch{}}function c(){if(!o)return;let p=o;o="",r==="think"?l(p):a(p)}function u(p){if(!(p==null||p===""))for(o+=String(p);o;){if(r==="think"){let b=Ai(o,tr);if(!b){let k=o.length-xc;if(k<=0)return;l(o.slice(0,k)),o=o.slice(k);continue}l(o.slice(0,b.at)),o=o.slice(b.at+b.tag.length),r="answer",i=!1;continue}if(!i){a(o),o="";return}let h=Ai(o,Ei),m=Ai(o,tr);if(!h&&!m){let b=o.length-xc;if(b<=0)return;a(o.slice(0,b)),o=o.slice(b);continue}if(h&&(!m||h.at<=m.at)){let b=o.slice(0,h.at);b.trim()&&a(b),o=o.slice(h.at+h.tag.length),r="think";continue}let x=n+o.slice(0,m.at);if(n="",s+=x,e.onSplit)try{e.onSplit(x)}catch{}o=o.slice(m.at+m.tag.length),i=!1}}function d(p){p==null||p===""||l(String(p))}function f(){c()}return{pushContent:u,pushReasoning:d,end:f,get content(){return n},get reasoning(){return s}}}Sc.exports={newParser:Vm,OPEN_TAGS:Ei,CLOSE_TAGS:tr}});var Li=Q((hS,Pc)=>{var hn={ratio:.35,minRatio:.2,maxRatio:1,keepTail:8,labelMax:60,omittedArgs:'{"_omitted":true}'},Oi="\u2026[\u5DF2\u622A\u65AD]",Ym=2e3;function Mc(t){if(Array.isArray(t)){let e=0;for(let n of t)!n||typeof n!="object"||(n.type==="text"?e+=String(n.text==null?"":n.text).length:n.type==="image_url"&&(e+=Ym));return e}return String(t??"").length}function Zm(t,e){let n=String(t??"");return e>0?n.length<=e?n:e<=Oi.length?n.slice(0,e):n.slice(0,e-Oi.length)+Oi:""}function vc(t,e){let n=Number(t);return isFinite(n)&&n>=0?Math.floor(n):e}function Cc(t){let e=Number(t);return!isFinite(e)||e<=0?hn.ratio:Math.min(hn.maxRatio,Math.max(hn.minRatio,e))}function Pi(t){if(!t||typeof t!="object")return 0;let e=Mc(t.content);e+=String(t.tool_call_id==null?"":t.tool_call_id).length;let n=Array.isArray(t.tool_calls)?t.tool_calls:[];for(let s of n){let o=s&&s.function||{};e+=String(s&&s.id==null?"":s.id).length,e+=String(o.name==null?"":o.name).length,e+=String(o.arguments==null?"":o.arguments).length}return e}function ji(t){let e=0;for(let n of t||[])e+=Pi(n);return e}function Qm(t){let e=Array.isArray(t)?t:[];if(!e.length)return 0;try{return String(JSON.stringify(e)).length}catch{return 0}}function eg(t,e){let n=Number(t);return!isFinite(n)||n<=0?0:Math.ceil(n*Cc(e))}function Ac(t){let e=t&&typeof t=="object"?t:{},n=["path","dir","command","query","url","name"];for(let s of n){let o=e[s];if(typeof o=="string"&&o.trim())return o.trim().slice(0,hn.labelMax)}for(let s of Object.keys(e))if(typeof e[s]=="string"&&e[s].trim())return e[s].trim().slice(0,hn.labelMax);return""}function nr(t){if(Array.isArray(t))return t.map(nr);if(t&&typeof t=="object"){let e={};for(let n of Object.keys(t).sort())e[n]=nr(t[n]);return e}return t}function tg(t,e){let n=e;if(typeof n=="string")try{n=JSON.parse(n)}catch{n=n}try{return String(t??"")+"|"+JSON.stringify(nr(n??{}))}catch{return String(t??"")+"|"+String(n)}}function Ec(t){let e=String(t??"");if(!e)return!0;try{let n=JSON.parse(e);return!!(n&&n._omitted===!0)}catch{return!1}}function Oc(t){let e=new Map;for(let n of t||[]){let s=n&&Array.isArray(n.tool_calls)?n.tool_calls:[];for(let o of s){if(!o)continue;let r={};try{r=JSON.parse(o.function&&o.function.arguments||"{}")}catch{r={}}e.set(String(o.id||""),{name:String(o.function&&o.function.name||""),label:Ac(r)})}}return e}function ng(t,e){let n=t&&t.name||"\u5DE5\u5177",s=t&&t.label||"";return"[\u5DF2\u7701\u7565\uFF1A"+n+(s?" "+s:"")+"\uFF0C\u539F "+e+" \u5B57\u7B26]"}function sg(t){let e=t&&t.spill;return!e||typeof e!="object"||typeof e.put!="function"?null:e}function Tc(t,e){let n=e||{},s=Array.isArray(t)?t:[],o=vc(n.keepTail,hn.keepTail),r=ji(s),i=Math.max(0,s.length-o),a=Oc(s),l=sg(n),c=0,u=0,d=0,f=[];for(let h=0;h<s.length;h++){let m=s[h];if(!m||typeof m!="object"){f.push(m);continue}if(h>=i){f.push(m);continue}let x=Object.assign({},m);if(m.role==="tool"){let b=String(m.content==null?"":m.content);if(b&&b.indexOf("[\u5DF2\u7701\u7565\uFF1A")!==0){let k=a.get(String(m.tool_call_id||"")),S=ng(k,b.length);if(l){let T=vc(n.summaryMax,240),g=typeof l.summarize=="function"?l.summarize(b,T):b.replace(/\s+/g," ").trim().slice(0,T),_=typeof l.newId=="function"?l.newId():"sp_"+h;try{l.put(_,b,{kind:"tool",name:k&&k.name||"",label:k&&k.label||"",tool_call_id:String(m.tool_call_id||"")}),d++}catch{}S=typeof l.toolPlaceholder=="function"?l.toolPlaceholder(k,b.length,g,_):S.slice(0,-1)+"\uFF1B\u6458\u8981\uFF1A"+g+"\uFF1B\u5B8C\u6574\u7ED3\u679C id="+_+"\uFF0C\u9700\u8981\u65F6\u7528 read_spill]"}x.content=S,c++}}if(Array.isArray(m.tool_calls)&&m.tool_calls.length){let b=!1;x.tool_calls=m.tool_calls.map(function(k){if(!k||!k.function)return k;let S=String(k.function.arguments==null?"":k.function.arguments);if(Ec(S))return k;b=!0;let T=Object.assign({},k.function,{arguments:hn.omittedArgs});return Object.assign({},k,{function:T})}),b&&u++}f.push(x)}let p=ji(f);return{messages:f,beforeChars:r,afterChars:p,savedChars:r-p,omittedTools:c,omittedArgs:u,spilled:d,keptTail:Math.min(o,s.length)}}Pc.exports={DEFAULTS:hn,clipText:Zm,contentChars:Mc,charsOfMessage:Pi,charsOf:ji,charsOfTools:Qm,estimateTokens:eg,ratioOf:Cc,labelOf:Ac,canonical:nr,fingerprint:tg,compact:Tc,_charsOfMessage:Pi,_compact:Tc,_callMap:Oc,_isOmittedArgs:Ec}});var Rc=Q((mS,qi)=>{var nt=Li(),ss=32768,Ni=16384,Fi=8192,Ii="\u2026",jc={small:{desc:96,param:32},tiny:{desc:76,param:20}},og={small:["run_command_start","run_command_poll","run_command_stop"],tiny:["run_command_start","run_command_poll","run_command_stop"]},Bs={window:65536,tierFull:ss,tierMid:Ni,tierSmall:Fi,summaryReserve:240,summaryMax:220,keepRecent:2};function Di(t,e){let n=Number(t);return isFinite(n)&&n>=0?Math.floor(n):e}function or(t,e){let n=String(t??""),s=Number(e);return!isFinite(s)||s<=0?"":n.length<=s?n:s<=Ii.length?n.slice(0,s):n.slice(0,s-Ii.length)+Ii}function Ri(t,e){let n=String(t??"").trim();if(!n)return"";let s=n.length;for(let l of["\u3002","\uFF1B",`
|
|
25
|
+
`]){let c=n.indexOf(l);c>0&&c<s&&(s=c+(l===`
|
|
26
|
+
`?0:1))}let o=/[.;]\s/.exec(n);o&&o.index>0&&o.index<s&&(s=o.index+1);let r=n.slice(0,s).trim(),a=r.replace(/[;,,、::]+$/,"")||r;return a.length>e?or(a,e):a}var rg={startLine:1,maxLines:1,contextLines:1,maxHits:1,maxFiles:1,maxResults:1,replace_all:1,merge:1,patterns:1,questions:1,options:1,pattern:1,patch:1,timeout_ms:1,need_content:1,wait_ms:1,tail_chars:1,maxDiags:1,todos:1,glob:0};function Lc(t,e){if(!t||typeof t!="object")return t;let n=Object.assign({},t),s=t.properties;if(s&&typeof s=="object"){let o={};for(let r of Object.keys(s)){let i=s[r];if(!i||typeof i!="object"){o[r]=i;continue}let a=Object.assign({},i);rg[r]?a.description=Ri(i.description,e):delete a.description,o[r]=a}n.properties=o}return n}function sr(t,e){let n=Array.isArray(t)?t:[],s=jc[e];if(!s)return n;let o=og[e]||[];return n.filter(function(r){return!(r&&r.function&&o.indexOf(r.function.name)>=0)}).map(function(r){if(!r||!r.function)return r;let i=r.function;return Object.assign({},r,{function:Object.assign({},i,{description:Ri(i.description,s.desc),parameters:Lc(i.parameters,s.param)})})})}function Ic(t,e){let n=isFinite(t)&&t>0?Math.floor(t):Bs.window,s=n>=ss?"full":n>=Ni?"mid":n>=Fi?"small":"tiny";return e==="off"?{window:n,tier:"full"}:(e==="on"&&(s==="full"||s==="mid")&&(s="small"),{window:n,tier:s})}function mn(t,e){let s=Ic(t,(e||{}).mode),o=s.window,r=s.tier;if(r==="full"||r==="mid"){let c=o>=ss?8e4:Math.max(2e3,Math.floor(o*.3)),u=o>=ss?4e4:Math.max(1500,Math.floor(c/2)),d=o>=ss?4e4:Math.max(2e3,Math.floor(o*.2));return{window:o,tier:r,compact:!1,dropAsyncCmd:!1,descCap:0,readMax:d,runMaxChars:8e3,searchFiles:20,searchCtxLines:1,grepHits:200,globFiles:200,listEntries:0,autoCtxChars:8e3,autoCtxLines:200,memoryTurns:8,memoryChars:12e3,keepTailSteps:[8,4,2,0],fpTotalLimit:4,summaryMaxTokens:2048,spillReadMax:8e3,refTotal:c,refPerFile:u}}let a=r==="tiny",l=a?Math.max(1200,Math.floor(o*.2)):Math.max(2e3,Math.floor(o*.25));return{window:o,tier:r,compact:!0,dropAsyncCmd:!0,descCap:jc[r].desc,readMax:a?Math.max(1e3,Math.floor(o*.12)):Math.max(1500,Math.floor(o*.15)),runMaxChars:a?Math.min(4e3,Math.max(2e3,Math.floor(o*.4))):Math.min(8e3,Math.max(3e3,Math.floor(o*.5))),searchFiles:a?6:12,searchCtxLines:a?0:1,grepHits:a?30:60,globFiles:a?40:80,listEntries:a?60:120,autoCtxChars:a?Math.max(1200,Math.floor(o*.22)):Math.floor(o*.28),autoCtxLines:a?40:80,memoryTurns:a?3:4,memoryChars:Math.max(1e3,Math.floor(o*.25)),keepTailSteps:a?[2,0]:[4,2,0],fpTotalLimit:6,summaryMaxTokens:a?768:1024,spillReadMax:Math.min(8e3,Math.max(2e3,Math.floor(o*.5))),refTotal:l,refPerFile:Math.max(800,Math.floor(l/2))}}function Dc(t,e){return String(t??"").length+nt.charsOfTools(e)}function ig(t){let e=t&&t.function||{},n={};try{n=JSON.parse(e.arguments||"{}")}catch{n={}}let s=nt.labelOf(n);return String(e.name||"\u5DE5\u5177")+(s?" "+s:"")}function Nc(t,e){let n=[],s=0;for(let i of t)for(let a of i){if(!a||a.role!=="assistant")continue;let l=Array.isArray(a.tool_calls)?a.tool_calls:[];for(let c of l)s++,n.push(ig(c));if(!l.length&&a.content){let c=String(a.content).replace(/\s+/g," ").trim();c&&n.push("\u8BF4\u660E\uFF1A"+or(c,40))}}if(!n.length)return"";let o=[];for(let i of n)o.indexOf(i)<0&&o.push(i);let r="[\u5DF2\u538B\u7F29\u66F4\u65E9 "+s+" \u6B65\u5DE5\u5177\u8C03\u7528\uFF0C\u6B63\u6587\u5DF2\u88C1\u51FA\u4E0A\u4E0B\u6587\uFF1B\u9700\u8981\u65F6\u91CD\u65B0\u8BFB\u53D6\u6587\u4EF6\u6216\u91CD\u8DD1\u547D\u4EE4]";return or(r+" \u5DF2\u6267\u884C\uFF1A"+o.slice(0,6).join("\u3001"),e)}function Fc(t){let e=[],n=null;for(let s of t||[]){if(!s||typeof s!="object"){n=null;continue}if(s.role==="assistant"){n=[s],e.push(n);continue}if(s.role==="tool"&&n){n.push(s);continue}n=[s],e.push(n)}return e}function qs(t,e,n){let s=n||{},o=Array.isArray(t)?t:[],r=Number(e),i=nt.charsOf(o),a={ok:!0,messages:o.slice(),dropped:0,savedChars:0,summary:"",chars:i,beforeChars:i,minChars:0};if(!isFinite(r)||r<=0||i<=r)return a;let l=function(I){return{ok:!1,messages:o.slice(),dropped:0,savedChars:0,summary:"",chars:i,beforeChars:i,minChars:I}},c=0;for(;c<o.length&&o[c]&&o[c].role==="system";)c++;let u=o.slice(0,c),d=Fc(o.slice(c));if(!d.length)return l(nt.charsOf(u));let f=-1;for(let I=o.length-1;I>=c;I--)if(o[I]&&o[I].role==="user"){f=I;break}let p=-1;if(f>=0){let I=c;for(let U=0;U<d.length;U++){let H=I+d[U].length;if(f>=I&&f<H){p=U;break}I=H}}let h=Di(s.summaryReserve,Bs.summaryReserve),m=Di(s.keepRecent,Bs.keepRecent),x=nt.charsOf(u),b=p>=0?nt.charsOf(d[p]):0,k=x+b,S=function(I){let U=d.length,H=0;for(let me=d.length-1;me>=0;me--){if(d[me].some(function(De){return De&&De.role==="assistant"&&Array.isArray(De.tool_calls)&&De.tool_calls.length>0})){if(H>=I)break;H++}U=me}for(;U>0&&U<d.length&&d[U][0]&&d[U][0].role==="tool";)U--;let te={};for(let me=U;me<d.length;me++)te[me]=!0;p>=0&&(te[p]=!0);let Ht=[];for(let me=0;me<d.length;me++)te[me]||Ht.push({index:me,chars:nt.charsOf(d[me])});let dn=x+b;for(let me=U;me<d.length;me++)me!==p&&(dn+=nt.charsOf(d[me]));return{keepFrom:U,droppable:Ht,fixed:dn}},T=null;for(let I=m;I>=0;I--){let U=S(I);if(U.fixed+(U.droppable.length?h:0)<=r){T=U;break}}if(!T)return l(k);let g=T.droppable,_=T.fixed;if(!g.length)return l(_);let v=0;for(let I of g)v+=I.chars;let A=0;for(;A<g.length&&_+v+h>r;)v-=g[A].chars,A++;if(_+v+h>r)return l(_+v);let C={};for(let I=0;I<A;I++)C[g[I].index]=!0;let L=[],B=[];for(let I=0;I<d.length;I++)C[I]?L.push(d[I]):B.push(d[I]);let W=Nc(L,Di(s.summaryMax,Bs.summaryMax)),N=u.slice();W&&N.push({role:"assistant",content:W});for(let I of B)for(let U of I)N.push(U);let Y=nt.charsOf(N);return{ok:Y<=r,messages:N,dropped:A,savedChars:i-Y,summary:W,chars:Y,beforeChars:i,minChars:_}}qi.exports={DEFAULTS:Bs,TIERS:{full:ss,mid:Ni,small:Fi},profile:mn,tierOf:Ic,compactTools:sr,fixedChars:Dc,squeeze:qs,_firstSentence:Ri,_compactParams:Lc,_groupForSqueeze:Fc,_summaryOf:Nc,_clip:or};if(require.main===qi){let t=0,e=[],n=function(g,_,v){if(_){t++;return}e.push(g+(v?" \u2192 "+v:""))};n("tier.4096",mn(4096).tier==="tiny"),n("tier.8192",mn(8192).tier==="small"),n("tier.16384",mn(16384).tier==="mid"),n("tier.32768",mn(32768).tier==="full"),n("tier.on",mn(65536,{mode:"on"}).tier==="small"),n("tier.off",mn(4096,{mode:"off"}).tier==="full");let s=[4096,8192,12288,16384,32768,65536],o=s.map(function(g){return mn(g)}),r=!0;for(let g=1;g<o.length;g++)for(let _ of["readMax","runMaxChars","searchFiles","grepHits","globFiles","autoCtxChars","memoryChars"])o[g][_]<o[g-1][_]&&(r=!1,e.push("mono."+_+"@"+s[g]));n("profile.monotonic",r);let i=[];for(let g=0;g<4;g++)i.push({type:"function",function:{name:"tool"+g,description:"\u7B2C\u4E00\u53E5\u8BF4\u660E\u3002".repeat(1)+"\u540E\u9762\u8FD8\u6709\u5F88\u957F\u7684\u8865\u5145\u8BF4\u660E\uFF0C".repeat(10),parameters:{type:"object",properties:{path:{type:"string",description:"\u76F8\u5BF9\u5DE5\u4F5C\u76EE\u5F55\u7684\u8DEF\u5F84\uFF0C\u4E5F\u53EF\u4EE5\u662F\u7EDD\u5BF9\u8DEF\u5F84"},startLine:{type:"number",description:"\u8D77\u59CB\u884C\u53F7\uFF08\u4ECE 1 \u5F00\u59CB\uFF09\uFF0C\u9ED8\u8BA4 1"}},required:["path"]}}});let a=nt.charsOfTools(i),l=nt.charsOfTools(sr(i,"small")),c=nt.charsOfTools(sr(i,"tiny"));n("compact.smallShrinks",l<a*.8,l+" / "+a),n("compact.tinyShrinks",c<=l);let u=sr(i,"small")[0].function;n("compact.firstSentence",u.description.length<=96&&u.description.indexOf("\u540E\u9762\u8FD8\u6709")<0,u.description),n("compact.keepsPath",u.parameters.properties.path.type==="string"),n("compact.dropsEasyParamDesc",!u.parameters.properties.path.description),n("compact.keepsHardParamDesc",!!u.parameters.properties.startLine.description),n("compact.originalUntouched",i[0].function.parameters.properties.path.description.length>0);let d=[{role:"system",content:"S".repeat(500)},{role:"user",content:"\u539F\u59CB\u95EE\u9898"}];for(let g=0;g<20;g++){let _="call_"+g;d.push({role:"assistant",content:"",tool_calls:[{id:_,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"f"+g+".js"})}}]}),d.push({role:"tool",tool_call_id:_,content:"r".repeat(1e3)})}let f={role:"user",content:"\u6700\u540E\u7684\u95EE\u9898"};d.push(f);let p=nt.charsOf(d),h=qs(d,4e3),m=[];for(let g of h.messages)for(let _ of g.tool_calls||[])m.push(String(_.id));let x=h.messages.filter(function(g){return g.role==="tool"}).map(function(g){return String(g.tool_call_id)});n("squeeze.ok",h.ok,JSON.stringify({chars:h.chars,min:h.minChars})),n("squeeze.withinCap",h.chars<=4e3,String(h.chars)),n("squeeze.paired",m.length===x.length&&m.every(function(g){return x.indexOf(g)>=0})),n("squeeze.keepsSystem",h.messages[0]===d[0]),n("squeeze.keepsLastUser",h.messages[h.messages.length-1]===f),n("squeeze.hasSummary",h.messages.some(function(g){return g.role==="assistant"&&!g.tool_calls&&g.content})),n("squeeze.dropped",h.dropped>0&&h.savedChars>0),n("squeeze.noopWhenFits",qs(d,p+10).dropped===0),n("squeeze.tinyCapFails",qs(d,100).ok===!1);let b=[{role:"system",content:"S".repeat(500)},{role:"user",content:"\u8BFB\u8FD9\u4E9B\u6587\u4EF6\u5E76\u603B\u7ED3"}];for(let g=0;g<20;g++){let _="solo_"+g;b.push({role:"assistant",content:"",tool_calls:[{id:_,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"s"+g+".js"})}}]}),b.push({role:"tool",tool_call_id:_,content:"r".repeat(1e3)})}let k=qs(b,4e3,{keepRecent:2}),S=[];for(let g of k.messages)for(let _ of g.tool_calls||[])S.push(String(_.id));let T=k.messages.filter(function(g){return g.role==="tool"}).map(function(g){return String(g.tool_call_id)});if(n("squeeze.soloOk",k.ok&&k.chars<=4e3,JSON.stringify({ok:k.ok,chars:k.chars,min:k.minChars})),n("squeeze.soloPaired",S.length===T.length&&S.every(function(g){return T.indexOf(g)>=0})),n("squeeze.soloKeepsUser",k.messages.some(function(g){return g===b[1]})),n("squeeze.soloKeepsRecent",S.indexOf("solo_19")>=0&&S.indexOf("solo_0")<0),n("squeeze.soloSummary",k.messages.some(function(g){return g.role==="assistant"&&!g.tool_calls&&g.content})),n("fixedChars",Dc("abc",i)===3+a),e.length){console.error("window.js \u81EA\u6D4B\u5931\u8D25 "+e.length+" \u9879\uFF08\u901A\u8FC7 "+t+"\uFF09\uFF1A");for(let g of e)console.error(" - "+g);process.exit(1)}console.log("window.js \u81EA\u6D4B\u901A\u8FC7 "+t+" \u9879")}});var Wc=Q((gS,Uc)=>{var gn={summaryMax:240,digestItemMax:160,digestMax:1200,maxEntries:64,maxTotalChars:4e5,readMax:8e3,idPrefix:"sp_"},Bi="\u2026[\u5DF2\u622A\u65AD]";function Us(t,e){let n=Number(t);return isFinite(n)&&n>=1?Math.floor(n):e}function rr(t,e){let n=String(t??"");return e>0?n.length<=e?n:e<=Bi.length?n.slice(0,e):n.slice(0,e-Bi.length)+Bi:""}function qc(t,e){let n=Us(e,gn.summaryMax),s=String(t??"").replace(/\s+/g," ").trim();return rr(s,n)}function Bc(){return gn.idPrefix+Date.now().toString(36)+"_"+Math.random().toString(36).slice(2,8)}function ag(t,e,n,s){let o=t&&t.name||"\u5DE5\u5177",r=t&&t.label||"",i="[\u5DF2\u7701\u7565\uFF1A"+o+(r?" "+r:"")+"\uFF0C\u539F "+e+" \u5B57\u7B26",a=String(n??"").trim();a&&(i+="\uFF1B\u6458\u8981\uFF1A"+a);let l=String(s??"").trim();return l&&(i+="\uFF1B\u5B8C\u6574\u7ED3\u679C id="+l+"\uFF0C\u9700\u8981\u65F6\u7528 read_spill"),i+"]"}function lg(t,e){let n=Array.isArray(t)?t:[];if(!n.length)return"";let s=Us(e,gn.digestMax),o=["[\u66F4\u65E9\u8F6E\u6B21\u6458\u8981\uFF08\u5B8C\u6574\u5BF9\u8BDD\u5DF2\u88C1\u51FA\u4E0A\u4E0B\u6587\uFF1B\u9700\u8981\u7EC6\u8282\u65F6\u7ED3\u5408\u6458\u8981\u63D0\u95EE\u6216\u91CD\u8BFB\u6587\u4EF6\uFF09]"];for(let r of n){if(!r)continue;let i=r.role==="assistant"?"\u52A9\u624B":r.role==="user"?"\u7528\u6237":String(r.role||""),a=qc(r.summary||r.text||"",gn.digestItemMax);a&&o.push("- "+i+"\uFF1A"+a)}return o.length<=1?"":rr(o.join(`
|
|
27
|
+
`),s)}function cg(t){let e=t||{},n=Us(e.maxEntries,gn.maxEntries),s=Us(e.maxTotalChars,gn.maxTotalChars),o=new Map,r=0;function i(){let p=o.keys().next();if(p.done)return;let h=p.value,m=o.get(h);o.delete(h),m&&(r=Math.max(0,r-(m.chars||0)))}function a(p,h,m){let x=String(p??"").trim()||Bc(),b=String(h??""),k=b.length;if(o.has(x)){let T=o.get(x);r=Math.max(0,r-(T&&T.chars||0)),o.delete(x)}for(;o.size>=n||r+k>s&&o.size>0;)i();for(;k>s&&o.size>0;)i();let S={id:x,content:b,chars:k,at:Date.now(),meta:m&&typeof m=="object"?m:{}};return o.set(x,S),r+=k,S}function l(p){let h=String(p??"").trim();return!h||!o.has(h)?null:o.get(h)}function c(p,h){let m=l(p);if(!m)return{ok:!1,error:"\u627E\u4E0D\u5230 spill id="+String(p||"")+"\uFF08\u53EF\u80FD\u5DF2\u6DD8\u6C70\u6216\u4ECE\u672A\u5199\u5165\uFF09"};let x=Us(h,gn.readMax),b=rr(m.content,x),k=m.content.length>b.length;return{ok:!0,id:m.id,chars:m.chars,truncated:k,meta:m.meta,content:b}}function u(){o.clear(),r=0}function d(){return o.size}function f(){return{entries:o.size,totalChars:r,maxEntries:n,maxTotalChars:s}}return{put:a,get:l,read:c,clear:u,size:d,stats:f,_map:o}}Uc.exports={DEFAULTS:gn,summarize:qc,newId:Bc,toolPlaceholder:ag,memoryDigestBlock:lg,createStore:cg,clipText:rr}});var Gc=Q((yS,zc)=>{var{spawn:Ui,execFile:ug}=require("child_process"),Oe={maxRunning:2,timeoutMsDefault:3e5,timeoutMsMax:6e5,timeoutMsMin:1e3,waitMsMax:15e3,tailCharsDefault:4e3,tailCharsMax:8e3,ringMaxBytes:256*1024,keepDoneMs:10*60*1e3,keepDoneMax:16,idPrefix:"job_"};function dg(t,e){let n=Number(t);return isFinite(n)&&n>=0?Math.floor(n):e}function Wi(t,e,n){let s=Number(t);return isFinite(s)?Math.min(n,Math.max(e,Math.floor(s))):e}function Hc(){return Oe.idPrefix+Date.now().toString(36)+"_"+Math.random().toString(36).slice(2,8)}function yn(t){return String(t??"").trim()||"_anon"}function ir(t,e){let n=Buffer.isBuffer(e)?e:Buffer.from(String(e??""),"utf8");if(n.length){for(t.chunks.push(n),t.ringBytes+=n.length;t.ringBytes>Oe.ringMaxBytes&&t.chunks.length>1;){let s=t.chunks.shift();t.ringBytes-=s.length}if(t.ringBytes>Oe.ringMaxBytes&&t.chunks.length===1){let s=t.chunks[0];t.chunks[0]=s.slice(s.length-Oe.ringMaxBytes),t.ringBytes=t.chunks[0].length}}}function fg(t,e){let n=Wi(e,1,Oe.tailCharsMax),s=Buffer.concat(t.chunks||[]).toString("utf8");if(s.length<=n)return s||"(\u65E0\u8F93\u51FA)";let o=s.slice(s.length-n),r=o.charCodeAt(0);return r>=56320&&r<=57343&&(o=o.slice(1)),o}function Kc(t,e){if(!t||t.killed)return;let n=t.pid;if(!n){try{t.kill("SIGTERM")}catch{}return}if(process.platform==="win32"){try{ug("taskkill",["/PID",String(n),"/T","/F"],{windowsHide:!0},function(){})}catch{try{t.kill()}catch{}}return}try{process.kill(-n,"SIGTERM")}catch{try{t.kill("SIGTERM")}catch{}}setTimeout(function(){try{process.kill(-n,"SIGKILL")}catch{try{t.killed||t.kill("SIGKILL")}catch{}}},1500)}function pg(t){let e=t||{},n=dg(e.maxRunning,Oe.maxRunning)||Oe.maxRunning,s=e.shell||(process.platform==="win32"?process.env.ComSpec||"cmd.exe":"/bin/bash"),o=typeof e.isDangerous=="function"?e.isDangerous:function(){return!1},r=new Map;function i(g){let _=yn(g),v=r.get(_);return v||(v=new Map,r.set(_,v)),v}function a(g){let _=r.get(yn(g));if(!_)return 0;let v=0;return _.forEach(function(A){A&&A.status==="running"&&v++}),v}function l(g,_){let v=String(_??"").trim();if(!v)return null;let A=r.get(yn(g));return A&&A.get(v)||null}function c(g){let _=i(g),v=Date.now(),A=[];if(_.forEach(function(C,L){!C||C.status==="running"||(v-(C.endedAt||C.startedAt||0)>Oe.keepDoneMs?_.delete(L):A.push(C))}),A.length>Oe.keepDoneMax){A.sort(function(C,L){return(C.endedAt||0)-(L.endedAt||0)});for(let C=0;C<A.length-Oe.keepDoneMax;C++)_.delete(A[C].id)}_.size===0&&r.delete(yn(g))}function u(g,_,v){if(!g||g.status!=="running")return;g.status=_,g.code=typeof v=="number"?v:_==="exited"?0:-1,g.endedAt=Date.now(),g.timer&&(clearTimeout(g.timer),g.timer=null);let A=g.waiters||[];g.waiters=[];for(let C=0;C<A.length;C++)try{A[C]()}catch{}c(g.sessionId)}function d(g,_){if(!g)return{status:"missing",out_tail:"",elapsed_ms:0};let v=Date.now(),A=Math.max(0,v-(g.startedAt||v)),C=g.status==="running"&&g.deadline?Math.max(0,g.deadline-v):void 0,L={status:g.status,job_id:g.id,code:g.status==="running"?void 0:g.code,out_tail:fg(g,_??Oe.tailCharsDefault),elapsed_ms:A,command:g.command};return C!=null&&(L.remaining_ms=C),L}function f(g,_,v){let A=String(_??""),C=v||{};if(!A.trim())return{ok:!1,error:"command \u4E3A\u7A7A"};if(o(A))return{ok:!1,error:"\u62D2\u7EDD\u6267\u884C\uFF1A\u547D\u4E2D\u5371\u9669\u547D\u4EE4\u9ED1\u540D\u5355 \u2192 "+A};if(a(g)>=n)return{ok:!1,error:"\u672C\u4F1A\u8BDD\u5DF2\u6709 "+n+" \u4E2A\u5F02\u6B65\u547D\u4EE4\u5728\u8DD1\uFF0C\u8BF7\u5148 run_command_poll / run_command_stop \u5176\u4E2D\u4E00\u4E2A\uFF0C\u518D start\uFF08\u4E0A\u9650 "+n+"\uFF09"};let L=Wi(C.timeout_ms==null?Oe.timeoutMsDefault:C.timeout_ms,Oe.timeoutMsMin,Oe.timeoutMsMax),B=String(C.cwd||C.root||process.cwd()),W=Hc(),N=Date.now(),Y=N+L,I={id:W,sessionId:yn(g),command:A,status:"running",code:void 0,startedAt:N,endedAt:0,deadline:Y,chunks:[],ringBytes:0,waiters:[],proc:null,timer:null,pid:0},U;try{let te=/bash(\.exe)?$/i.test(String(s));process.platform==="win32"&&!te?U=Ui(s,["/d","/s","/c",A],{cwd:B,env:Object.assign({},process.env,{NO_COLOR:"1",CI:"1"}),windowsHide:!0,stdio:["ignore","pipe","pipe"]}):process.platform==="win32"&&te?U=Ui(s,["-lc",A],{cwd:B,env:Object.assign({},process.env,{NO_COLOR:"1",CI:"1"}),windowsHide:!0,stdio:["ignore","pipe","pipe"]}):U=Ui(s,["-lc",A],{cwd:B,env:Object.assign({},process.env,{NO_COLOR:"1",CI:"1"}),detached:!0,stdio:["ignore","pipe","pipe"]})}catch(te){return{ok:!1,error:"spawn \u5931\u8D25\uFF1A"+(te&&te.message?te.message:String(te))}}I.proc=U,I.pid=U.pid||0,i(g).set(W,I);let H=function(te){ir(I,te)};return U.stdout&&U.stdout.on("data",H),U.stderr&&U.stderr.on("data",function(te){ir(I,`
|
|
28
|
+
[stderr]
|
|
29
|
+
`),ir(I,te)}),U.on("error",function(te){ir(I,String(te&&te.message?te.message:te)),u(I,"exited",1)}),U.on("close",function(te,Ht){if(I.status!=="running")return;u(I,"exited",typeof te=="number"?te:Ht?1:0)}),I.timer=setTimeout(function(){I.status==="running"&&(Kc(I.proc,s),u(I,"timeout",-1))},L),I.timer&&typeof I.timer.unref=="function"&&I.timer.unref(),{ok:!0,job_id:W,pid:I.pid||void 0,started_at:N,timeout_ms:L}}function p(g,_,v){let A=v||{},C=l(g,_);if(!C)return Promise.resolve({ok:!0,status:"missing",job_id:String(_||""),out_tail:"",elapsed_ms:0});let L=Wi(A.wait_ms==null?0:A.wait_ms,0,Oe.waitMsMax),B=A.tail_chars==null?Oe.tailCharsDefault:A.tail_chars;return C.status!=="running"||L<=0?Promise.resolve(Object.assign({ok:!0},d(C,B))):new Promise(function(W){let N=!1,Y=function(){if(N)return;N=!0,clearTimeout(I);let U=C.waiters.indexOf(Y);U>=0&&C.waiters.splice(U,1),W(Object.assign({ok:!0},d(C,B)))};C.waiters.push(Y);let I=setTimeout(Y,L);typeof I.unref=="function"&&I.unref()})}function h(g,_){let v=l(g,_);return v?v.status!=="running"?{ok:!0,status:"already_done",job_id:v.id,final_status:v.status,code:v.code}:(Kc(v.proc,s),u(v,"stopped",-1),{ok:!0,status:"stopped",job_id:v.id}):{ok:!1,status:"missing",job_id:String(_||"")}}function m(g){let _=r.get(yn(g));if(!_)return{stopped:0};let v=0,A=[];_.forEach(function(C,L){C&&C.status==="running"&&A.push(L)});for(let C=0;C<A.length;C++){let L=h(g,A[C]);L&&L.status==="stopped"&&v++}return{stopped:v}}function x(){let g=0,_=[];r.forEach(function(v,A){_.push(A)});for(let v=0;v<_.length;v++)g+=m(_[v]).stopped;return{stopped:g}}function b(g){let _=m(g);return r.delete(yn(g)),_}function k(g){return!g||!g.ok?"ERROR: "+(g&&g.error||"start \u5931\u8D25"):`ok=true
|
|
30
|
+
job_id=`+g.job_id+(g.pid?`
|
|
31
|
+
pid=`+g.pid:"")+`
|
|
32
|
+
started_at=`+g.started_at+`
|
|
33
|
+
timeout_ms=`+g.timeout_ms+`
|
|
34
|
+
\u7528 run_command_poll \u67E5\u770B\u8FDB\u5EA6\uFF1B\u9700\u8981\u53D6\u6D88\u65F6 run_command_stop\u3002`}function S(g){if(!g)return"ERROR: poll \u65E0\u7ED3\u679C";let _=["status="+g.status,"job_id="+(g.job_id||"")];return g.code!=null&&_.push("code="+g.code),g.elapsed_ms!=null&&_.push("elapsed_ms="+g.elapsed_ms),g.remaining_ms!=null&&_.push("remaining_ms="+g.remaining_ms),g.command&&_.push("command="+String(g.command).slice(0,200)),_.push(`out_tail:
|
|
35
|
+
`+(g.out_tail||"(\u65E0\u8F93\u51FA)")),_.join(`
|
|
36
|
+
`)}function T(g){return g?g.status==="missing"?`ok=false
|
|
37
|
+
status=missing
|
|
38
|
+
job_id=`+(g.job_id||""):`ok=true
|
|
39
|
+
status=`+g.status+`
|
|
40
|
+
job_id=`+(g.job_id||"")+(g.final_status?`
|
|
41
|
+
final_status=`+g.final_status:"")+(g.code!=null?`
|
|
42
|
+
code=`+g.code:""):"ERROR: stop \u65E0\u7ED3\u679C"}return{DEFAULTS:Oe,maxRunning:n,start:f,poll:p,stop:h,stopAll:m,stopEverything:x,clearSession:b,runningCount:a,getJob:l,formatStartResult:k,formatPollResult:S,formatStopResult:T,_bySession:r,_snapshot:d}}zc.exports={DEFAULTS:Oe,createRegistry:pg,newId:Hc,sessKey:yn}});var ou=Q((bS,su)=>{var hg=require("fs"),mg=require("os"),Ws=require("path"),gg=require("crypto"),{spawn:yg}=require("child_process"),Jc="2025-06-18",Ki=2e4,bg=6e4,wg=18e4,$c=8e3,kg=500,ar=64,xg=4096,Sg=8*1024*1024,_g=20,R={root:"",version:"0",rec:function(){},servers:new Map,exposed:new Map,configPaths:[],configErrors:[],loaded:!1,starting:null};function vg(t){let e=t||{};e.root&&(R.root=String(e.root)),typeof e.rec=="function"&&(R.rec=e.rec),e.version&&(R.version=String(e.version))}function Ve(t,e){try{R.rec(t,e)}catch{}}function Hi(t){return String(t??"").replace(/[^A-Za-z0-9_-]+/g,"_").replace(/^_+|_+$/g,"")||"x"}function Tg(t){return gg.createHash("sha1").update(String(t)).digest("hex").slice(0,6)}function Xc(t,e){let n=String(t??"");return n.length>e?n.slice(0,e)+"\u2026":n}function Vc(t,e){let n="mcp__"+Hi(t)+"__"+Hi(e);if(n.length>ar){let s="_"+Tg(t+"/"+e);n=n.slice(0,ar-s.length)+s}return n}function zi(){R.exposed.clear();for(let t of R.servers.values())if(t.state==="ready")for(let e of t.tools){let n=Vc(t.name,e.name);if(R.exposed.has(n)){let s=2;for(;R.exposed.has(n+"_"+s);)s++;let o="_"+s;n=n.length+o.length>ar?n.slice(0,ar-o.length)+o:n+o}R.exposed.set(n,{server:t.name,tool:e.name,def:e})}}function Mg(){let t=process.env.LUBAN_MCP_CONFIG;if(t)return String(t).split(Ws.delimiter).map(function(n){return n.trim()}).filter(Boolean);let e=[Ws.join(mg.homedir(),".luban","mcp.json")];return R.root&&e.push(Ws.join(R.root,".luban","mcp.json")),e}function Yc(){R.servers=new Map,R.exposed.clear(),R.configErrors=[];let t=Mg();R.configPaths=t;let e=new Map;for(let n of t){let s;try{s=JSON.parse(hg.readFileSync(n,"utf8"))}catch(r){if(r.code==="ENOENT")continue;R.configErrors.push(n+"\uFF1A"+r.message),Ve("mcp_config_bad",{path:n,message:r.message});continue}let o=s&&(s.mcpServers||s.servers);if(!o||typeof o!="object"){R.configErrors.push(n+"\uFF1A\u7F3A\u5C11 mcpServers"),Ve("mcp_config_bad",{path:n,message:"\u7F3A\u5C11 mcpServers"});continue}for(let r of Object.keys(o)){let i=o[r]||{};if(i.disabled===!0){e.delete(r);continue}e.set(r,{conf:i,source:n})}}for(let n of e){let s=n[0],o=n[1].conf;if(!o.command||typeof o.command!="string"){R.configErrors.push(s+"\uFF1A\u7F3A\u5C11 command"),Ve("mcp_config_bad",{server:s,message:"\u7F3A\u5C11 command"});continue}if(o.args!==void 0&&!Array.isArray(o.args)){R.configErrors.push(s+"\uFF1Aargs \u5FC5\u987B\u662F\u6570\u7EC4"),Ve("mcp_config_bad",{server:s,message:"args \u5FC5\u987B\u662F\u6570\u7EC4"});continue}if(o.planAllow!==void 0){let r=o.planAllow;(!Array.isArray(r)||r.some(function(i){return typeof i!="string"}))&&(R.configErrors.push(s+"\uFF1AplanAllow \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4"),Ve("mcp_config_bad",{server:s,message:"planAllow \u5FC5\u987B\u662F\u5B57\u7B26\u4E32\u6570\u7EC4"}),o.planAllow=[])}R.servers.set(s,new Gi(s,o,n[1].source))}R.loaded=!0,Ve("mcp_config_loaded",{paths:t,servers:Array.from(R.servers.keys()),errors:R.configErrors})}var Gi=class{constructor(e,n,s){this.name=e,this.conf=n,this.source=s,this.child=null,this.buf="",this.stderr="",this.nextId=1,this.pending=new Map,this.state="idle",this.error="",this.tools=[],this.protocolVersion="",this.gen=0,this.connecting=null,this.relisted=null}spawnChild(){let e=this.conf,n=e.cwd?Ws.resolve(R.root||process.cwd(),String(e.cwd)):R.root||process.cwd(),s=Object.assign({},process.env,e.env&&typeof e.env=="object"?e.env:{});return yg(String(e.command),Array.isArray(e.args)?e.args.map(String):[],{cwd:n,env:s,stdio:["pipe","pipe","pipe"],shell:!1})}write(e){let n=this.child;if(!n||!n.stdin||n.stdin.destroyed||n.exitCode!==null)throw new Error("MCP server\u300C"+this.name+"\u300D\u672A\u8FDE\u63A5");n.stdin.write(JSON.stringify(e)+`
|
|
43
|
+
`)}onStderr(e){this.stderr=(this.stderr+String(e)).slice(-xg)}onExit(e,n){if(e!==this.gen)return;let s=this.state==="ready";this.state="failed",this.error=n+(this.stderr?`
|
|
44
|
+
[stderr] `+this.stderr.trim():""),this.dropPending(n),this.child=null,s&&Ve("mcp_server_exit",{server:this.name,reason:n,stderr:this.stderr.slice(-600)})}onData(e){if(this.buf+=String(e),this.buf.length>Sg){Ve("mcp_line_overflow",{server:this.name,bytes:this.buf.length}),this.buf="";return}let n;for(;(n=this.buf.indexOf(`
|
|
45
|
+
`))>=0;){let s=this.buf.slice(0,n).replace(/\r$/,"").trim();if(this.buf=this.buf.slice(n+1),!s)continue;let o;try{o=JSON.parse(s)}catch{Ve("mcp_bad_line",{server:this.name,head:s.slice(0,200)});continue}this.onMessage(o)}}respond(e,n,s){try{s?this.write({jsonrpc:"2.0",id:e,error:s}):this.write({jsonrpc:"2.0",id:e,result:n})}catch{}}onMessage(e){if(!e||typeof e!="object")return;if(e.method){if(e.id!==void 0&&e.id!==null){if(e.method==="ping"){this.respond(e.id,{});return}if(e.method==="roots/list"){let s=[];R.root&&s.push({uri:"file://"+encodeURI(R.root),name:Ws.basename(R.root)||"workspace"}),this.respond(e.id,{roots:s});return}this.respond(e.id,null,{code:-32601,message:"Luban \u4E0D\u652F\u6301 "+e.method});return}if(e.method==="notifications/tools/list_changed"){let s=this;this.relisted||(this.relisted=this.loadTools().then(function(){Ve("mcp_tools_changed",{server:s.name,tools:s.tools.length})}).catch(function(o){Ve("mcp_tools_changed_failed",{server:s.name,message:o.message})}).then(function(){s.relisted=null}))}return}let n=this.pending.get(e.id);if(n)if(this.pending.delete(e.id),clearTimeout(n.timer),e.error){let s=e.error.code===void 0?"":" "+e.error.code;n.reject(new Error("MCP \u9519\u8BEF"+s+"\uFF1A"+(e.error.message||JSON.stringify(e.error))))}else n.resolve(e.result===void 0?{}:e.result)}request(e,n,s){let o=this;return new Promise(function(r,i){if(!o.child||o.child.exitCode!==null){i(new Error("MCP server\u300C"+o.name+"\u300D\u672A\u8FDE\u63A5"));return}let a=o.nextId++,l=s||Ki,c=setTimeout(function(){o.pending.has(a)&&(o.pending.delete(a),i(new Error("MCP \u8BF7\u6C42\u8D85\u65F6\uFF08"+l+"ms\uFF09\uFF1A"+e+" @ "+o.name)))},l);o.pending.set(a,{resolve:r,reject:i,timer:c});try{o.write({jsonrpc:"2.0",id:a,method:e,params:n||{}})}catch(u){clearTimeout(c),o.pending.delete(a),i(u)}})}async loadTools(){let e="",n=[];for(let s=0;s<_g;s++){let o=await this.request("tools/list",e?{cursor:e}:{},Ki),r=o&&o.tools||[];for(let i of r)i&&i.name&&n.push(i);if(e=o&&o.nextCursor,!e)break}return this.tools=n,zi(),n}async connect(){if(this.connecting)return this.connecting;let e=this;this.connecting=async function(){e.dropPending("\u91CD\u65B0\u8FDE\u63A5"),e.gen++;let n=e.gen;e.stopChild(),e.state="connecting",e.error="",e.stderr="",e.tools=[],zi();let s;try{s=e.spawnChild()}catch(o){throw e.state="failed",e.error="\u542F\u52A8\u5931\u8D25\uFF1A"+o.message,new Error("MCP server\u300C"+e.name+"\u300D\u542F\u52A8\u5931\u8D25\uFF1A"+o.message)}e.child=s,s.stdout&&s.stdout.setEncoding("utf8"),s.stderr&&s.stderr.setEncoding("utf8"),s.stdout.on("data",function(o){n===e.gen&&e.onData(o)}),s.stderr.on("data",function(o){n===e.gen&&e.onStderr(o)}),s.on("error",function(o){e.onExit(n,"\u8FDB\u7A0B\u9519\u8BEF\uFF1A"+o.message)}),s.on("exit",function(o,r){e.onExit(n,"\u8FDB\u7A0B\u9000\u51FA code="+o+(r?" signal="+r:""))});try{let o=await e.request("initialize",{protocolVersion:Jc,capabilities:{tools:{}},clientInfo:{name:"luban",version:R.version}},Ki);e.protocolVersion=o&&o.protocolVersion||Jc,e.write({jsonrpc:"2.0",method:"notifications/initialized",params:{}}),await e.loadTools(),e.state="ready",Ve("mcp_ready",{server:e.name,tools:e.tools.length,protocol:e.protocolVersion,source:e.source})}catch(o){throw e.state="failed",e.error=String(o&&o.message||o),Ve("mcp_failed",{server:e.name,error:e.error,stderr:e.stderr.slice(-600)}),e.stopChild(),new Error("MCP server\u300C"+e.name+"\u300D\u521D\u59CB\u5316\u5931\u8D25\uFF1A"+e.error)}return e}();try{return await this.connecting}finally{this.connecting=null}}async ensure(){return this.state==="ready"&&this.child&&this.child.exitCode===null?this:this.connect()}async call(e,n){let s=Number(this.conf.timeoutMs),o=Math.min(Math.max(isFinite(s)&&s>0?s:bg,1e3),wg),r=await this.request("tools/call",{name:e,arguments:n&&typeof n=="object"?n:{}},o);return Zc(r)}stopChild(){let e=this.child;if(!e)return;this.child=null;try{e.stdin&&!e.stdin.destroyed&&e.stdin.end()}catch{}try{e.kill("SIGTERM")}catch{}let n=setTimeout(function(){try{e.exitCode===null&&e.kill("SIGKILL")}catch{}},2e3);n.unref&&n.unref()}dropPending(e){for(let n of this.pending.values())clearTimeout(n.timer),n.reject(new Error("MCP server\u300C"+this.name+"\u300D"+e));this.pending.clear()}async stop(){this.gen++,this.state="stopped",this.dropPending("\u5DF2\u505C\u6B62"),this.stopChild(),this.tools=[]}};function Zc(t){let e=[],n=t&&Array.isArray(t.content)?t.content:[];for(let o of n)if(o)if(o.type==="text")e.push(String(o.text==null?"":o.text));else if(o.type==="resource"){let r=o.resource||{};r.text!=null?e.push("[resource "+(r.uri||"")+`]
|
|
46
|
+
`+r.text):e.push("[resource "+(r.uri||"")+" \xB7 "+(r.mimeType||"binary")+" \u5DF2\u7701\u7565]")}else o.type==="resource_link"?e.push("[resource_link "+(o.uri||"")+"] "+(o.name||"")):o.type==="image"?e.push("[image "+(o.mimeType||"")+" \u5DF2\u7701\u7565]"):o.type==="audio"?e.push("[audio "+(o.mimeType||"")+" \u5DF2\u7701\u7565]"):e.push("["+(o.type||"unknown")+" \u5185\u5BB9\u5DF2\u7701\u7565]");!e.length&&t&&t.structuredContent!=null&&e.push(JSON.stringify(t.structuredContent));let s=e.join(`
|
|
47
|
+
`).trim();return t&&t.isError&&(s="MCP \u5DE5\u5177\u8FD4\u56DE\u9519\u8BEF\uFF1A"+(s||"(\u65E0\u8F93\u51FA)")),s||(s="(\u65E0\u8F93\u51FA)"),s.length>$c?s.slice(0,$c)+`
|
|
48
|
+
\u2026[\u8F93\u51FA\u5DF2\u622A\u65AD]`:s}async function Ji(){if(R.starting)return R.starting;R.starting=async function(){Yc();let t=[];for(let e of R.servers.values())t.push(e.connect().catch(function(){}));return await Promise.all(t),zi(),nu()}();try{return await R.starting}finally{R.starting=null}}async function Cg(){if(R.starting){try{await R.starting}catch{}return}R.loaded||await Ji()}async function Ag(){return await Qc(),Ji()}async function Qc(){let t=Array.from(R.servers.values());R.servers=new Map,R.exposed.clear(),R.loaded=!1,await Promise.all(t.map(function(e){return e.stop()})),Ve("mcp_stopped",{servers:t.length})}function Eg(t){return R.exposed.has(String(t))}function $i(t){return R.exposed.get(String(t))||null}function Og(t){let e=t&&t.planAllow;return Array.isArray(e)?e:[]}function eu(t,e){let n=e||{};return n.annotations&&n.annotations.readOnlyHint===!0?!0:Og(t).indexOf(n.name)>=0}function tu(t){let e=$i(t);if(!e)return!1;let n=R.servers.get(e.server);if(!n)return!1;let s=n.tools.find(function(o){return o&&o.name===e.tool})||e.def;return eu(n.conf,s)}function Pg(t){let e=!!(t&&t.planOnly),n=[];for(let s of R.exposed){let o=s[0],r=s[1],i=r.def||{};if(e){let c=R.servers.get(r.server);if(!eu(c&&c.conf,i))continue}let a=i.inputSchema&&typeof i.inputSchema=="object"?i.inputSchema:{type:"object",properties:{}},l=Xc(i.description||i.title||"MCP \u5DE5\u5177 "+r.server+"/"+r.tool,kg);n.push({type:"function",function:{name:o,description:l+"\uFF08\u6765\u81EA MCP server\u300C"+r.server+"\u300D\uFF09",parameters:a}})}return n.sort(function(s,o){return s.function.name<o.function.name?-1:s.function.name>o.function.name?1:0}),n}function jg(){let t=[],e=[];for(let s of R.servers.values())s.state==="ready"&&s.tools.length?t.push("- "+s.name+"\uFF08"+s.tools.length+" \u4E2A\u5DE5\u5177\uFF09"):s.state==="failed"&&e.push("- "+s.name+"\uFF1A"+Xc(s.error,200));let n=[];return t.length&&n.push(["\u5DF2\u8FDE\u63A5\u7684 MCP server\uFF1A",t.join(`
|
|
49
|
+
`),"MCP \u5DE5\u5177\u540D\u683C\u5F0F\u4E3A mcp__<server>__<tool>\uFF0C\u53C2\u6570\u6309\u5404\u81EA\u7684 schema \u4F20\uFF1B\u5DE5\u4F5C\u533A\u6587\u4EF6\u8BFB\u5199\u4ECD\u4F18\u5148\u7528\u5185\u7F6E\u6587\u4EF6\u5DE5\u5177\u3002"].join(`
|
|
50
|
+
`)),e.length&&n.push(`\u672A\u80FD\u8FDE\u63A5\u7684 MCP server\uFF08\u4E0D\u8981\u8C03\u7528\u5B83\u4EEC\u7684\u5DE5\u5177\uFF0C\u5931\u8D25\u539F\u56E0\u5982\u4E0B\uFF09\uFF1A
|
|
51
|
+
`+e.join(`
|
|
52
|
+
`)),n.join(`
|
|
53
|
+
|
|
54
|
+
`)}function Lg(t,e){let n=$i(t);if(!n)return Promise.reject(new Error("\u672A\u77E5 MCP \u5DE5\u5177: "+t));let s=R.servers.get(n.server);return s?s.ensure().then(function(){if(!s.tools.some(function(o){return o&&o.name===n.tool}))throw new Error("MCP server\u300C"+n.server+"\u300D\u5DF2\u6CA1\u6709\u5DE5\u5177 "+n.tool);return s.call(n.tool,e)}):Promise.reject(new Error("MCP server \u5DF2\u5378\u8F7D: "+n.server))}function nu(){return{root:R.root,configPaths:R.configPaths,configErrors:R.configErrors.slice(),servers:Array.from(R.servers.values()).map(function(t){return{name:t.name,state:t.state,source:t.source,tools:t.tools.length,protocol:t.protocolVersion,error:t.error,stderrTail:t.stderr.slice(-600)}}),tools:Array.from(R.exposed.entries()).map(function(t){return{name:t[0],server:t[1].server,tool:t[1].tool,readOnly:!!(t[1].def&&t[1].def.annotations&&t[1].def.annotations.readOnlyHint===!0),planAllowed:tu(t[0])}})}}su.exports={configure:vg,start:Ji,ready:Cg,reload:Ag,stop:Qc,status:nu,hasTool:Eg,findTool:$i,toolDefs:Pg,planAllowed:tu,promptBlock:jg,callTool:Lg,_cleanName:Hi,_exposedBase:Vc,_flatten:Zc,_loadServers:Yc}});var os=Q((wS,ru)=>{var Ig=["node_modules",".git","dist","build","out","coverage",".next",".venv","venv","target","vendor","__pycache__",".cache","npm-cache","_npx","_cacache",".m2"];ru.exports={SKIP_DIRS:Ig}});var Su=Q((kS,xu)=>{var rs=require("fs"),cu=require("os"),de=require("path"),Xi=300,iu=60,Dg=520,Ng=80,Fg=6e3,Rg=1200,qg=40,Bg=30,au=4e4,Ug=8,Wg=2e4,lu=6,uu=2e3,du=Object.create(null);for(let t of os().SKIP_DIRS)du[t]=1;var ee={root:"",rec:function(){},skills:[],dirs:[],scannedAt:"",scannedMs:0};function Kg(t){let e=t||{};e.root&&String(e.root)!==ee.root&&(ee.scannedMs=0),e.root&&(ee.root=String(e.root)),typeof e.rec=="function"&&(ee.rec=e.rec)}function Vi(t,e){try{ee.rec(t,e)}catch{}}function Yi(t){return(t||[]).map(function(e){return e.name+""+e.description+""+e.parent+""+e.childCount+""+e.rel}).join("")}function Qi(){if(!ee.root||ee.scannedMs&&Date.now()-ee.scannedMs<uu)return;let t=Yi(ee.skills),e;try{e=gu(ee.root,{quiet:!0})}catch(n){ee.scannedMs=Date.now(),Vi("skills_rescan_failed",{message:n.message});return}Yi(e)!==t&&Vi("skills_changed",{count:e.length,top:e.filter(function(n){return!n.parent}).length})}function Ks(t){let e=String(t??"").replace(/\s+/g," ").trim();return(e.startsWith('"')&&e.endsWith('"')||e.startsWith("'")&&e.endsWith("'"))&&(e=e.slice(1,-1).trim()),e}function Hg(t,e){let n=String(t??"");return n.length>e?n.slice(0,e)+"\u2026":n}function fu(t){let e=t||ee.root||process.cwd(),n=cu.homedir();return[de.join(e,".luban","skills"),de.join(e,".claude","skills"),de.join(e,".cursor","skills"),de.join(n,".luban","skills"),de.join(n,".claude","skills"),de.join(n,".cursor","skills"),de.join(n,".cursor","skills-cursor")]}function pu(t,e,n,s){if(e>Ug||n.length>Xi*4)return;let o;try{o=rs.readdirSync(t,{withFileTypes:!0})}catch{return}let r=de.join(t,"SKILL.md");try{rs.statSync(r).isFile()&&n.push({file:r,base:s||t})}catch{}for(let i of o)i.isDirectory()&&(du[i.name]||i.name.startsWith(".")||pu(de.join(t,i.name),e+1,n,s||t))}function hu(t){let e=/^---\r?\n([\s\S]*?)\r?\n---/.exec(String(t));if(!e)return{};let n=e[1].split(/\r?\n/),s={};for(let o=0;o<n.length;o++){let r=n[o];if(/^\s/.test(r))continue;let i=r.indexOf(":");if(i<=0)continue;let a=r.slice(0,i).trim().toLowerCase();if(!a)continue;let l=r.slice(i+1).trim(),c=/^([|>])([-+]?)$/.exec(l);if(c){let u=[];for(let d=o+1;d<n.length;d++){let f=n[d];if(!f.trim()){u.push(""),o=d;continue}if(!/^\s/.test(f))break;u.push(f.trim()),o=d}s[a]=(c[1]==="|"?u.join(`
|
|
55
|
+
`):u.join(" ").replace(/\s+/g," ")).trim();continue}s[a]=l}return s}function zg(t){let e=String(t).replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/,""),n=!1;for(let s of e.split(/\r?\n/)){let o=s.trim();if(o.startsWith("```")){n=!n;continue}if(!n&&o&&!o.startsWith("#")&&!(o.startsWith("|")||o.startsWith(">")))return o.replace(/^[-*+]\s+/,"")}return""}function Zi(t){let e=ee.root;if(e){let s=de.relative(e,t);if(!s)return".";if(!s.startsWith("..")&&!de.isAbsolute(s))return s.split(de.sep).join("/")}let n=cu.homedir();return t.startsWith(n)?"~"+t.slice(n.length).split(de.sep).join("/"):t.split(de.sep).join("/")}var Gg=/capability\s*[::]\s*([A-Za-z0-9_./-]+)/g,Jg=/(?:<skills_base>|\$\{SKILLS_BASE\})\s*\/\s*([A-Za-z0-9_./-]+)/g;function $g(t){let e=[],n=Object.create(null);for(let s of[[Gg,"capability"],[Jg,"sibling"]]){let o=s[0];o.lastIndex=0;let r;for(;r=o.exec(String(t||""));){let i=r[1].replace(/\/+$/,"").replace(/\/SKILL\.md$/i,"");!i||n[s[1]+":"+i]||(n[s[1]+":"+i]=!0,e.push({ref:i,kind:s[1]}))}}return e}function Xg(t,e){let n;try{n=rs.readFileSync(t,"utf8").slice(0,Wg)}catch{return null}let s=de.dirname(t),o=hu(n),r=Ks(o.name)||de.basename(s);if(!r)return null;let i=Hg(Ks(o.description||o.trigger||o.when_to_use||"")||zg(n),Rg),a=0;try{a=rs.statSync(t).size}catch{a=n.length}return{name:r,description:i,dir:s,file:t,base:e||s,refs:$g(n),parent:"",childCount:0,rel:Zi(s),fileRel:Zi(t),bytes:a}}function Vg(t,e){let n=de.relative(e,t);return!n||n.startsWith("..")||de.isAbsolute(n)?!1:n.split(de.sep).some(function(s){return s.toLowerCase()==="capability"})}function Yg(t,e,n){let s=String(n||"").replace(/\/+$/,"").replace(/\/SKILL\.md$/i,"");if(!s)return null;let o=[de.resolve(e.dir,s),de.resolve(e.dir,"capability",s),de.resolve(e.base||e.dir,s)];for(let a of o){let l=t.find(function(c){return c.dir===a});if(l&&l!==e)return l}let r=s.split("/").pop().toLowerCase(),i=t.filter(function(a){return a===e?!1:a.name.toLowerCase()===r||de.basename(a.dir).toLowerCase()===r});return i.length===1?i[0]:null}function mu(t){let e=Object.create(null);for(let s of t)s.parent="",s.childCount=0,e[s.name.toLowerCase()]=s;for(let s of t){let o=null;for(let r of t)r===s||!Vg(s.dir,r.dir)||(!o||r.dir.length>o.dir.length)&&(o=r);o&&(s.parent=o.name)}let n=Object.create(null);for(let s of t){let o=[];for(let r of s.refs){if(r.kind!=="capability")continue;let i=Yg(t,s,r.ref);i&&o.indexOf(i.name)<0&&o.push(i.name)}n[s.name]=o}for(let s of t)if(!s.parent)for(let o of n[s.name]){let r=e[o.toLowerCase()];!r||r===s||r.parent||(n[r.name]||[]).indexOf(s.name)>=0||(r.parent=s.name)}for(let s of t){let o=s.parent?e[s.parent.toLowerCase()]:null;o&&o.childCount++}}function Zg(t){let e=[],n=Object.create(null),s=[t.name];for(;s.length;){let o=s.shift();for(let r of ee.skills)r.parent!==o||n[r.name.toLowerCase()]||(n[r.name.toLowerCase()]=!0,e.push(r.name),s.push(r.name))}return e}function gu(t,e){let n=e||{};t&&(ee.root=String(t));let s=fu(ee.root);ee.dirs=s;let o=[],r=Object.create(null);for(let i of s){let a=[];pu(i,0,a,i);for(let l of a){let c=Xg(l.file,l.base);if(!c)continue;let u=c.name.toLowerCase();if(!r[u]&&(r[u]=!0,o.push(c),o.length>=Xi))break}if(o.length>=Xi)break}return o.sort(function(i,a){return i.name.toLowerCase()<a.name.toLowerCase()?-1:i.name.toLowerCase()>a.name.toLowerCase()?1:0}),mu(o),ee.skills=o,ee.scannedAt=new Date().toISOString(),ee.scannedMs=Date.now(),n.quiet||Vi("skills_scanned",{count:o.length,root:ee.root,top:o.filter(function(i){return!i.parent}).length,names:o.slice(0,30).map(function(i){return i.name})}),o}function yu(t,e){let n=String(t??"");if(!(e>0))return"";if(n.length<=e)return n;let s=n.slice(0,e),o=-1,r=/[。..;;!!??]/g,i;for(;i=r.exec(s);)i.index>=e*.5&&(o=i.index);let a=o>0?s.slice(0,o+1):s,l=/触发词\s*[::]\s*([^;;。\n]{0,160})/.exec(n);if(l&&l[1].trim()&&a.indexOf(l[1].trim())<0){let c=l[1].trim();a.length+c.length+4<=e?a+=" \u89E6\u53D1\u8BCD\uFF1A"+c:e-a.length>12&&(a+=" \u89E6\u53D1\u8BCD\uFF1A"+c.slice(0,e-a.length-5)+"\u2026")}return a.length>=n.length?n:a.length<e?a+"\u2026":a}function Qg(){if(Qi(),!ee.skills.length)return"";let t=ee.skills.filter(function(r){return!r.parent}),e=t.slice(0,iu),n=["\u53EF\u7528\u6280\u80FD\uFF08\u8FD9\u91CC\u53EA\u662F\u76EE\u5F55\uFF1B\u771F\u6B63\u8981\u7528\u65F6\u5148\u8C03\u7528 read_skill \u8BFB SKILL.md \u5168\u6587\uFF0C\u4E0D\u8981\u51ED\u540D\u5B57\u731C\u6B65\u9AA4\uFF09\uFF1A"],s=Math.max(Ng,Math.min(Dg,Math.floor(Fg/(e.length||1))-qg)),o=e.length<=Bg;for(let r=0;r<e.length;r++){let i=e[r],a="- "+i.name+": "+(yu(i.description,s)||"(\u65E0\u63CF\u8FF0)");if(i.childCount>0){let l=Zg(i);a+="\uFF08"+(o?"\u76EE\u5F55 "+i.rel+"\uFF1B":"")+"\u53E6\u6709 "+l.length+" \u4E2A capability \u5B50\u6280\u80FD\uFF1A"+l.slice(0,lu).join(" / ")+(l.length>lu?" \u7B49":"")+"\uFF0C\u7236\u6280\u80FD\u6B63\u6587\u91CC\u7684 `\u2192 capability:` \u6307\u9488\u6307\u5411\u5B83\u4EEC\uFF0C\u8BFB\u5B8C\u7236\u6280\u80FD\u518D\u6309\u9700 read_skill\uFF09"}else o&&(a+="\uFF08\u76EE\u5F55 "+i.rel+"\uFF09");n.push(a)}return t.length>e.length&&n.push("- \u53E6\u6709 "+(t.length-e.length)+" \u4E2A\u9876\u5C42\u6280\u80FD\u672A\u5217\u51FA\uFF08\u8D85\u8FC7 "+iu+" \u4E2A\u4E0A\u9650\uFF0C\u7528 op skills \u770B\u5168\u91CF\uFF09"),n.push("\u6280\u80FD\u6B63\u6587\u91CC\u7684\u8DEF\u5F84\u5360\u4F4D\u7B26\uFF08SKILL_DIR / SKILLS_BASE\uFF09\u5DF2\u66FF\u6362\u6210\u672C\u673A\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u53EF\u76F4\u63A5\u7528\u4E8E read_file / run_command\u3002"),n.join(`
|
|
56
|
+
`)}function bu(t){let e=Ks(t).toLowerCase();if(!e)return null;Qi();let n=ee.skills.find(function(s){return s.name.toLowerCase()===e});return n||(n=ee.skills.find(function(s){return de.basename(s.dir).toLowerCase()===e}),n||null)}function wu(t,e){let n=e.dir,s=e.base||e.dir;return String(t??"").split("${SKILL_DIR}").join(n).split("${SKILLS_BASE}").join(s).split("<skills_base>").join(s).split("<skill_dir>").join(n)}function e0(t,e){let n=bu(t);if(!n){let l=ee.skills.map(function(c){return c.name}).join(", ")||"(\u65E0)";throw new Error("\u6CA1\u6709\u8FD9\u4E2A\u6280\u80FD: "+Ks(t)+"\uFF08\u53EF\u7528: "+l+"\uFF09")}let s=n.file,o=Ks(e||"");if(o&&o!=="SKILL.md"){s=de.resolve(n.dir,o);let l=de.relative(n.dir,s);if(!l||l.startsWith("..")||de.isAbsolute(l))throw new Error("file \u53EA\u80FD\u5F15\u7528\u8BE5\u6280\u80FD\u76EE\u5F55\u5185\u7684\u6587\u4EF6: "+o);let c;try{c=rs.statSync(s)}catch{throw new Error("\u6280\u80FD\u76EE\u5F55\u91CC\u6CA1\u6709\u8FD9\u4E2A\u6587\u4EF6: "+o)}if(!c.isFile())throw new Error("\u4E0D\u662F\u6587\u4EF6: "+o)}let r;try{r=rs.readFileSync(s,"utf8")}catch(l){throw new Error("\u8BFB\u53D6\u6280\u80FD\u6587\u4EF6\u5931\u8D25: "+l.message)}r=wu(r,n);let a=r.length>au?r.slice(0,au)+`
|
|
57
|
+
\u2026[\u622A\u65AD]`:r;return"\u6280\u80FD "+n.name+" \xB7 "+Zi(s)+`
|
|
58
|
+
\u6280\u80FD\u76EE\u5F55\uFF1A`+n.dir+`\uFF08\u6B63\u6587\u91CC\u7684\u8DEF\u5F84\u5360\u4F4D\u7B26\u5DF2\u66FF\u6362\u6210\u7EDD\u5BF9\u8DEF\u5F84\uFF09
|
|
59
|
+
|
|
60
|
+
`+a}function ku(){return ee.skills.map(function(t){return{name:t.name,description:t.description,parent:t.parent,childCount:t.childCount,dir:t.rel,base:t.base,file:t.fileRel,bytes:t.bytes}})}function t0(){return{count:ee.skills.length,root:ee.root,scannedAt:ee.scannedAt,dirs:ee.dirs.slice(),skills:ku()}}xu.exports={configure:Kg,refresh:gu,ensure:Qi,block:Qg,read:e0,list:ku,status:t0,find:bu,_frontmatter:hu,_scanDirs:fu,_clipDesc:yu,_markChildren:mu,_substPaths:wu,_signature:Yi,_state:ee,_ttl:uu}});var Mu=Q((xS,Tu)=>{var n0=require("crypto");function s0(t){let e=t||{},n=[];return e.envBlock&&n.push(String(e.envBlock)),e.spillBlock&&n.push(String(e.spillBlock)),e.rule&&n.push(String(e.rule)),e.webBlock&&n.push(String(e.webBlock)),e.autoBlock&&n.push(String(e.autoBlock)),e.worksetBlock&&n.push(String(e.worksetBlock)),e.refText&&n.push(String(e.refText)),n.join(`
|
|
61
|
+
|
|
62
|
+
`)}function o0(t,e){let n=JSON.stringify({s:String(t??""),t:Array.isArray(e)?e:[]});return n0.createHash("sha256").update(n).digest("hex").slice(0,16)}function _u(t){if(!t||typeof t!="object")return 0;let e=Number(t.prompt_cache_hit_tokens);if(isFinite(e)&&e>0)return e;let n=t.prompt_tokens_details;if(n&&typeof n=="object"){let o=Number(n.cached_tokens);if(isFinite(o)&&o>0)return o}let s=Number(t.cache_read_input_tokens);return isFinite(s)&&s>0?s:0}var r0=2e3;function i0(t){if(Array.isArray(t)){let e=0;for(let n of t)!n||typeof n!="object"||(n.type==="text"?e+=String(n.text==null?"":n.text).length:n.type==="image_url"&&(e+=r0));return e}return String(t??"").length}function vu(t){let e=t||[],n=e.length;for(let r=e.length-1;r>=0;r--)if(e[r]&&e[r].role==="user"){n=r;break}let s=0,o=0;for(let r=0;r<e.length;r++){let i=i0(e[r]&&e[r].content);s+=i,r<n&&(o+=i)}return{total:s,prefix:o}}function a0(t,e,n){let s=Number(t&&t.prompt_tokens)||0,o=_u(t),r=vu(e),i=s>0&&r.total>0?Math.round(s*(r.prefix/r.total)):0,a=isFinite(Number(n))&&Number(n)>0,l=a?Math.min(Math.floor(Number(n)),s||Number(n)):i;return{promptTokens:s,completionTokens:Number(t&&t.completion_tokens)||0,cachedTokens:o,prefixChars:r.prefix,totalChars:r.total,prefixTokens:l,prefixEst:i,prefixSource:a?"prev":"chars",hit:s>0?Number(Math.min(1,o/s).toFixed(3)):0,coverage:l>0?Number(Math.min(1,o/l).toFixed(3)):0}}Tu.exports={buildUserTurn:s0,hash:o0,stats:a0,_cachedTokensOf:_u,_splitChars:vu}});var Lu=Q((SS,ju)=>{var l0=require("path"),Cu=8e3,Au=200,c0=.4,ea="\u2026[\u5DF2\u622A\u65AD]",u0={js:"js",mjs:"js",cjs:"js",jsx:"jsx",ts:"ts",tsx:"tsx",json:"json",md:"md",markdown:"md",css:"css",html:"html",htm:"html",py:"python",rb:"ruby",go:"go",rs:"rust",java:"java",kt:"kotlin",c:"c",h:"c",cpp:"cpp",cc:"cpp",hpp:"cpp",cs:"csharp",sh:"bash",bash:"bash",zsh:"bash",yml:"yaml",yaml:"yaml",toml:"toml",xml:"xml",sql:"sql",php:"php",swift:"swift"};function Eu(t){let e=l0.extname(String(t??"")).replace(".","").toLowerCase();return u0[e]||e||""}function Ou(t,e){let n=String(t??""),s=Number(e);return!isFinite(s)||s<=0?{text:"",truncated:n.length>0}:n.length<=s?{text:n,truncated:!1}:s<=ea.length?{text:n.slice(0,s),truncated:!0}:{text:n.slice(0,s-ea.length)+ea,truncated:!0}}function Pu(t){let e=Math.max(1,Math.floor(Number(t.startLine)||1)),n=t.text?String(t.text).split(`
|
|
63
|
+
`).length:0,s=Math.floor(Number(t.endLine)||0),o=s>=e?s:n||e;return{start:e,end:o,lines:Math.max(o-e+1,1)}}function d0(t){let e=t||{},n=Math.max(1,Math.floor(Number(e.lineCount)||1)),s=Math.min(Math.max(1,Math.floor(Number(e.cursorLine)||1)),n),o=Math.max(20,Math.floor(Number(e.windowLines)||Au));if(n<=o)return{start:1,end:n,whole:!0};let r=Math.min(s-1,Math.floor(o*c0)),i=Math.max(1,Math.min(s-r,n-o+1));return{start:i,end:i+o-1,whole:!1}}function f0(t){let e=t||{},n=String(e.path==null?"":e.path).trim(),s=String(e.text==null?"":e.text);if(!n||!s)return{block:"",chars:0,truncated:!1,mode:"none",lines:0};let o=Pu({text:s,startLine:e.startLine,endLine:e.endLine}),r=!!e.hasSelection,i=!r&&!!e.windowed,a=Math.max(0,Math.floor(Number(e.totalLines)||0)),l=Math.max(1,Math.floor(Number(e.cursorLine)||1)),c="[\u5F53\u524D\u6587\u4EF6] "+n+(r?"\uFF08\u9009\u533A \u7B2C "+o.start+"-"+o.end+" \u884C\uFF0C\u5171 "+o.lines+" \u884C\uFF09":i?"\uFF08\u7B2C "+o.start+"-"+o.end+" \u884C\uFF0C\u5171 "+(a||o.end)+" \u884C\uFF0C\u5149\u6807\u5728\u7B2C "+l+" \u884C\uFF09":"\uFF08\u5168\u6587 "+o.lines+" \u884C\uFF09"),u=Ou(s,e.maxChars>0?e.maxChars:Cu),d=String(e.lang||"")||Eu(n),f=c+"\n```"+d+`
|
|
64
|
+
`+u.text+"\n```"+(u.truncated?`
|
|
65
|
+
\uFF08\u8FD9\u6BB5\u662F\u622A\u65AD\u540E\u7684\u5F00\u5934\u90E8\u5206\uFF1B\u9700\u8981\u540E\u9762\u7684\u5185\u5BB9\u8BF7\u7528 read_file\uFF09`:"");return{block:f,chars:f.length,truncated:u.truncated,mode:r?"selection":i?"window":"file",lines:o.lines}}function p0(t,e,n){if(n||!t)return!0;let s=String(e??"");return s?typeof t.has=="function"?t.has(s):Array.isArray(t)&&t.indexOf(s)>=0:!1}function h0(t){let e=t||{};return e.scheme&&e.scheme!=="file"?"scheme":String(e.head==null?"":e.head).indexOf("\0")>=0?"binary":""}ju.exports={DEFAULT_MAX_CHARS:Cu,DEFAULT_WINDOW_LINES:Au,build:f0,shouldSkip:h0,sessionOwns:p0,fenceLang:Eu,windowRange:d0,_clip:Ou,_lineRange:Pu}});var Nu=Q((_S,na)=>{var Iu="\u2026[\u5DF2\u622A\u65AD]";function ta(t){return(String(t&&t.relPath==null?"":t.relPath).trim()||String(t&&t.abs==null?"":t.abs)).replace(/\\/g,"/")}function Du(t){let e=ta(t),n=t&&t.stats||{},s=Math.max(0,Math.floor(Number(n.add)||0)),o=Math.max(0,Math.floor(Number(n.del)||0)),r=Math.max(0,Math.floor(Number(n.hunks)||0)),i=t&&t.isNew?"\uFF08\u65B0\u5EFA\uFF09":"";return"- "+e+i+" \xB7 +"+s+" -"+o+" \xB7 "+r+" \u5757"}function Bn(t,e){let n=e||{},o=(Array.isArray(t)?t:[]).filter(function(m){return m&&(String(m.relPath==null?"":m.relPath).trim()||String(m.abs==null?"":m.abs).trim())});if(!o.length)return{block:"",chars:0,files:0,omitted:0,truncated:!1};let r=o.slice().sort(function(m,x){let b=ta(m),k=ta(x);return b<k?-1:b>k?1:0}),i=Number(n.maxChars)>0?Math.floor(Number(n.maxChars)):3e3,a="[\u672C\u4F1A\u8BDD\u6539\u52A8] "+r.length+" \u4E2A\u6587\u4EF6\u5F85\u5BA1\u9605",l=r.map(Du),c=[],u=a.length,d=0;for(;d<l.length;d++){let m=u+1+l[d].length;if(m>i&&c.length>0)break;c.push(l[d]),u=m}let f=r.length-c.length,p=a+`
|
|
66
|
+
`+c.join(`
|
|
67
|
+
`),h=!1;if(f>0){let m="\uFF08\u5176\u4F59 "+f+" \u4E2A\u6587\u4EF6\u7701\u7565\uFF09";p.length+1+m.length<=i?p+=`
|
|
68
|
+
`+m:p=p.slice(0,Math.max(0,i-Iu.length))+Iu,h=!0}return{block:p,chars:p.length,files:r.length,omitted:f,truncated:h}}na.exports={DEFAULT_MAX_CHARS:3e3,block:Bn,_lineOf:Du};if(require.main===na){let n=function(f,p){p?(t++,console.log(" \u2713 "+f)):(e++,console.log(" \u2717 "+f))};m0=n;let t=0,e=0,s=Bn([]);n("\u7A7A\u8BB0\u5F55\u8FD4\u56DE\u7A7A\u5757",s.block===""&&s.files===0&&!s.truncated);let o=Bn([{relPath:"src/a.js",isNew:!1,stats:{add:3,del:1,hunks:2}}]);n("\u5355\u6587\u4EF6\u6807\u9898",o.block.indexOf("[\u672C\u4F1A\u8BDD\u6539\u52A8] 1 \u4E2A\u6587\u4EF6\u5F85\u5BA1\u9605")===0),n("\u5355\u6587\u4EF6\u884C",o.block.indexOf("- src/a.js \xB7 +3 -1 \xB7 2 \u5757")>=0);let r=Bn([{relPath:"z.js",isNew:!1,stats:{add:1,del:0,hunks:1}},{relPath:"a.js",isNew:!1,stats:{add:2,del:2,hunks:1}},{relPath:"m.js",isNew:!1,stats:{add:0,del:5,hunks:3}}]),i=r.block.indexOf("a.js"),a=r.block.indexOf("m.js"),l=r.block.indexOf("z.js");n("\u591A\u6587\u4EF6\u6309\u8DEF\u5F84\u6392\u5E8F",i>=0&&i<a&&a<l),n("\u591A\u6587\u4EF6\u6807\u9898\u8BA1\u6570",r.block.indexOf("[\u672C\u4F1A\u8BDD\u6539\u52A8] 3 \u4E2A\u6587\u4EF6\u5F85\u5BA1\u9605")===0);let c=Bn([{relPath:"new.js",isNew:!0,stats:{add:40,del:0,hunks:1}}]);n("\u65B0\u5EFA\u6587\u4EF6\u5E26\u6807\u8BB0",c.block.indexOf("- new.js\uFF08\u65B0\u5EFA\uFF09 \xB7 +40 -0 \xB7 1 \u5757")>=0);let u=Bn([{relPath:"a.js",isNew:!1,stats:{add:1,del:0,hunks:1}},{relPath:"b.js",isNew:!1,stats:{add:1,del:0,hunks:1}},{relPath:"c.js",isNew:!1,stats:{add:1,del:0,hunks:1}}],{maxChars:60});n("\u622A\u65AD\u6807\u8BB0",u.truncated===!0&&u.omitted>0),n("\u622A\u65AD\u540E\u957F\u5EA6\u4E0D\u8D85\u9884\u7B97",u.chars<=60),n("\u622A\u65AD\u540E\u4ECD\u542B\u6807\u9898",u.block.indexOf("[\u672C\u4F1A\u8BDD\u6539\u52A8] 3 \u4E2A\u6587\u4EF6\u5F85\u5BA1\u9605")===0);let d=Bn([{relPath:"src\\a.js",isNew:!1,stats:{add:1,del:0,hunks:1}}]);n("\u53CD\u659C\u6760\u5F52\u4E00\u4E3A\u6B63\u659C\u6760",d.block.indexOf("- src/a.js \xB7 +1 -0 \xB7 1 \u5757")>=0),console.log(`
|
|
69
|
+
workset.js: `+t+" \u901A\u8FC7, "+e+" \u5931\u8D25"),process.exit(e?1:0)}var m0});var Ju=Q((vS,Gu)=>{var Un=require("fs"),g0=require("path"),y0=os().SKIP_DIRS,bn={maxFiles:5e3,maxFileBytes:512*1024,maxTokensPerFile:800,maxGlobalTokens:2e5,maxResults:20,maxLinesPerFile:5,contextLines:1,maxLineLen:400,k1:1.2,b:.75,maxDepth:12,skipDirs:y0},Fu=new Set("the and for that with this from function return const let var true false null undefined import export class new typeof async await if else while switch case break continue try catch throw public private protected static void string number boolean object array any interface type enum require module exports default extends super this self none nil not but you are was were has have \u4E00\u4E2A \u6211\u4EEC \u53EF\u4EE5 \u8FD9\u4E2A \u90A3\u4E2A \u5C31\u662F \u4E0D\u662F \u6CA1\u6709 \u6216\u8005 \u6240\u4EE5 \u56E0\u4E3A \u4F46\u662F \u5982\u679C \u5DF2\u7ECF \u9700\u8981 \u4F7F\u7528 \u8FDB\u884C".split(/\s+/)),Ru=/[A-Za-z_$][A-Za-z0-9_$]*/g,qu=/[\u4e00-\u9fff]+/g;function Bu(t){return String(t).replace(/([a-z0-9])([A-Z])/g,"$1 $2").replace(/([A-Z]+)([A-Z][a-z])/g,"$1 $2").split(/[_\s$]+/)}function sa(t){let e=String(t??""),n=[],s;for(Ru.lastIndex=0;s=Ru.exec(e);){let o=s[0],r=o.toLowerCase();r.length>=2&&!Fu.has(r)&&n.push(r);for(let i of Bu(o)){let a=i.toLowerCase();a.length>=2&&a!==r&&!Fu.has(a)&&n.push(a)}}for(qu.lastIndex=0;s=qu.exec(e);){let o=s[0];if(o.length===1){n.push(o);continue}for(let r=0;r+2<=o.length;r++)n.push(o.slice(r,r+2))}return n}function Uu(t){let e=null;try{e=Un.openSync(t,"r");let n=Buffer.alloc(4096),s=Un.readSync(e,n,0,4096,0);return n.slice(0,s).indexOf(0)>=0}catch{return!0}finally{if(e!==null)try{Un.closeSync(e)}catch{}}}function Wu(t,e){let n=Object.assign({},bn,e||{}),s=new Set(n.skipDirs||bn.skipDirs),o=[],r=!1;return function i(a,l,c){if(o.length>=n.maxFiles||c>n.maxDepth){o.length>=n.maxFiles&&(r=!0);return}let u=[];try{u=Un.readdirSync(a,{withFileTypes:!0})}catch{return}u.sort(function(d,f){return d.name<f.name?-1:d.name>f.name?1:0});for(let d of u){if(o.length>=n.maxFiles){r=!0;return}if(!d.name||d.name.charAt(0)==="."||s.has(d.name))continue;let f=g0.join(a,d.name),p=l?l+"/"+d.name:d.name,h;try{h=Un.statSync(f)}catch{continue}if(h.isDirectory()){i(f,p,c+1);continue}h.isFile()&&(h.size>n.maxFileBytes||h.size===0||o.push({rel:p,abs:f,mtimeMs:h.mtimeMs,size:h.size}))}}(t,"",0),{files:o,truncated:r}}function Ku(t,e){let n=sa(t),s=new Map;for(let o of n)s.set(o,(s.get(o)||0)+1);if(s.size>e){let o=Array.from(s.entries()).sort(function(r,i){return i[1]-r[1]}).slice(0,e);return{tf:new Map(o),docLen:n.length}}return{tf:s,docLen:n.length}}var is=new Map;function b0(){return{docs:new Map,inverted:new Map,df:new Map,avgLen:0,dirty:!1,builtAt:0}}function w0(t){let e=0;for(let n of t.values())e+=n.size;return e}function k0(t,e){let n=new Map,s=new Map,o=0;for(let i of t.docs){let a=i[0],l=i[1];for(let c of l.tf){let u=c[0],d=n.get(u);d||(d=new Map,n.set(u,d)),d.set(a,c[1]),o++}}for(let i of n)s.set(i[0],i[1].size);if(o>e){let i=Array.from(n.keys()).sort(function(a,l){return s.get(a)-s.get(l)});for(let a of i){if(o<=e)break;let l=n.get(a);o-=l.size,n.delete(a),s.delete(a)}}let r=0;for(let i of t.docs.values())r+=i.docLen;t.inverted=n,t.df=s,t.avgLen=t.docs.size?r/t.docs.size:0,t.dirty=!1,t.builtAt=Date.now(),t.truncatedPostings=o}function x0(t,e){let n=Object.assign({},bn,e||{}),s=Wu(t,n),o=is.get(t);o||(o=b0(),is.set(t,o));let r=new Set,i=0;for(let a of s.files){r.add(a.rel);let l=o.docs.get(a.rel);if(l&&l.mtimeMs===a.mtimeMs&&l.size===a.size||Uu(a.abs))continue;let c;try{c=Un.readFileSync(a.abs,"utf8")}catch{continue}let u=Ku(c,n.maxTokensPerFile);o.docs.set(a.rel,{rel:a.rel,abs:a.abs,mtimeMs:a.mtimeMs,size:a.size,tf:u.tf,docLen:u.docLen}),i++}for(let a of Array.from(o.docs.keys()))r.has(a)||(o.docs.delete(a),i++);return(i||!o.builtAt)&&k0(o,n.maxGlobalTokens),{index:o,files:s.files.length,truncated:s.truncated,changed:i}}function S0(t,e){return Math.log(1+(e-t+.5)/(t+.5))}function Hu(t,e,n){let s=Object.assign({},bn,n||{}),o=t.docs.size,r=t.avgLen||1,i=new Map;for(let a of e){let l=t.inverted.get(a);if(!l)continue;let c=S0(t.df.get(a)||0,o);for(let u of l){let d=u[0],f=u[1],p=t.docs.get(d);if(!p)continue;let h=1-s.b+s.b*(p.docLen/r),m=c*(f*(s.k1+1))/(f+s.k1*h);i.set(d,(i.get(d)||0)+m)}}return Array.from(i.entries()).sort(function(a,l){return l[1]-a[1]})}function _0(t,e){let n=String(t??"").replace(/\r$/,"");return n.length>e?n.slice(0,e)+"\u2026":n}function zu(t,e,n){let s=Object.assign({},bn,n||{}),o;try{o=Un.readFileSync(t,"utf8")}catch{return[]}let r=o.split(`
|
|
70
|
+
`),i=[];for(let d=0;d<r.length;d++){let f=r[d].toLowerCase(),p=0;for(let h of e)f.indexOf(h)>=0&&p++;p&&i.push({i:d,hit:p})}if(!i.length)return[];i.sort(function(d,f){return f.hit-d.hit||d.i-f.i});let a=i.slice(0,s.maxLinesPerFile).sort(function(d,f){return d.i-f.i}),l=Math.max(0,Math.floor(s.contextLines)||0),c=new Set,u=[];for(let d of a){let f=Math.max(0,d.i-l),p=Math.min(r.length-1,d.i+l);for(let h=f;h<=p;h++)c.has(h)||(c.add(h),u.push({no:h+1,text:_0(r[h],s.maxLineLen),match:h===d.i}))}return u}function v0(t,e,n){let s=Date.now(),o=Object.assign({},bn,n||{}),r=String(e??"").trim();if(!r)throw new Error("\u641C\u7D22\u8BCD\u4E3A\u7A7A");let i=Array.from(new Set(sa(r))).filter(function(p){return p.length>0});if(!i.length)throw new Error("\u641C\u7D22\u8BCD\u592A\u77ED\uFF08\u81F3\u5C11 2 \u4E2A\u5B57\u7B26\uFF0C\u4E14\u4E0D\u80FD\u662F\u5E38\u89C1\u505C\u7528\u8BCD\uFF09");let a=x0(t,o),l=Hu(a.index,i,o),c=String(o.prefix==null?"":o.prefix).replace(/^\/+/,"").replace(/\/+$/,""),u=c?l.filter(function(p){return p[0]===c||p[0].indexOf(c+"/")===0}):l,d=u.slice(0,Math.min(Math.max(1,Math.floor(o.maxResults)||20),100)),f=[];for(let p of d){let h=p[0],m=a.index.docs.get(h);if(!m)continue;let x=zu(m.abs,i,o);x.length&&f.push({path:h,score:Number(p[1].toFixed(3)),lines:x})}return{query:r,tokens:i,files:a.files,changed:a.changed,indexed:a.index.docs.size,truncated:a.truncated,matched:u.length,hits:f,tookMs:Date.now()-s}}function T0(t,e){let n=Object.assign({},bn,e||{}),s=t||{},o="\u626B\u63CF "+(s.files||0)+" \u4E2A\u6587\u4EF6\uFF08\u7D22\u5F15 "+(s.indexed||0)+`\uFF09
|
|
71
|
+
\u547D\u4E2D `+(s.hits?s.hits.length:0)+" \u4E2A\u6587\u4EF6"+(s.truncated?"\uFF08\u5DF2\u8FBE\u6587\u4EF6\u6570\u4E0A\u9650\uFF09":"")+" \xB7 \u7528\u65F6 "+(s.tookMs||0)+"ms";if(!s.hits||!s.hits.length)return o+`
|
|
72
|
+
\u6CA1\u6709\u547D\u4E2D\uFF1A\u6362\u4E2A\u66F4\u5177\u4F53\u7684\u6807\u8BC6\u7B26 / \u51FD\u6570\u540D / \u62A5\u9519\u539F\u6587\u518D\u8BD5`;let r=[o];for(let i of s.hits){r.push(""),r.push("--- "+i.path+"\uFF08score "+i.score+"\uFF09---");for(let a of i.lines)r.push((a.match?">":" ")+a.no+": "+a.text)}return r.join(`
|
|
73
|
+
`)}function M0(t){let e=is.get(t);return e?{docs:e.docs.size,tokens:e.inverted.size,postings:w0(e.inverted),avgLen:Number(e.avgLen.toFixed(1)),builtAt:e.builtAt}:{docs:0,tokens:0,postings:0,avgLen:0,builtAt:0}}Gu.exports={DEFAULTS:bn,tokenize:sa,scanFiles:Wu,termFreq:Ku,search:v0,format:T0,stats:M0,reset:function(t){t?is.delete(t):is.clear()},_CACHE:is,_splitIdentifier:Bu,_looksBinary:Uu,_scoreFiles:Hu,_findLines:zu}});var Zu=Q((TS,Yu)=>{var C0=require("path"),wn={prefixLines:120,suffixLines:40,maxChars:6e3,maxCompletionChars:4e3,minOverlap:4},A0={js:"// ",mjs:"// ",cjs:"// ",jsx:"// ",ts:"// ",tsx:"// ",go:"// ",java:"// ",kt:"// ",c:"// ",h:"// ",cpp:"// ",hpp:"// ",cs:"// ",rs:"// ",swift:"// ",php:"// ",py:"# ",rb:"# ",sh:"# ",bash:"# ",zsh:"# ",yml:"# ",yaml:"# ",toml:"# ",sql:"-- "};function $u(t){let e=C0.extname(String(t??"")).replace(".","").toLowerCase();return A0[e]||""}function Xu(t,e){let n=String(t).split(`
|
|
74
|
+
`);return n.length<=e?String(t):n.slice(n.length-e).join(`
|
|
75
|
+
`)}function Vu(t,e){let n=String(t).split(`
|
|
76
|
+
`);return n.length<=e?String(t):n.slice(0,e).join(`
|
|
77
|
+
`)}function E0(t){let e=Object.assign({},wn,t||{}),n=Number(e.maxChars)>0?Math.floor(Number(e.maxChars)):wn.maxChars,s=Number(e.prefixLines)>0?Math.floor(Number(e.prefixLines)):wn.prefixLines,o=Number(e.suffixLines)>=0?Math.floor(Number(e.suffixLines)):wn.suffixLines,r=String(e.text==null?"":e.text),i=r.length,a=Math.floor(Number(e.offset)||0);a=Math.min(Math.max(a,0),i);let l=r.slice(0,a),c=r.slice(a);if(l=Xu(l,s),c=Vu(c,o),l.length>n&&(l=l.slice(l.length-n)),!l.trim()){let u=$u(e.path);u&&(l=u+String(e.path||"")+`
|
|
78
|
+
`)}return{prompt:l,suffix:c,offset:a,chars:l.length}}function O0(t,e,n){let s=Object.assign({},wn,n||{}),o=String(t??"");if(!o)return"";let r=o.search(/\n[ \t]*\n/);r>=0&&(o=o.slice(0,r));let i=String(e??"");if(i){let l=Math.min(i.length,o.length,400);for(let c=l;c>=Math.max(1,Math.floor(s.minOverlap)||wn.minOverlap);c--)if(o.endsWith(i.slice(0,c))){o=o.slice(0,o.length-c);break}}let a=Number(s.maxCompletionChars)>0?Number(s.maxCompletionChars):wn.maxCompletionChars;return o.length>a&&(o=o.slice(0,a)),o}Yu.exports={DEFAULTS:wn,buildPrompt:E0,trimCompletion:O0,commentFor:$u,_lastLines:Xu,_firstLines:Vu}});var dd=Q((CS,ud)=>{var MS=require("path"),od=new Set(["env","nohup","time","nice","ionice","command","xargs","watch","timeout","stdbuf","caffeinate"]),Qu=new Map([["rm","rm \u4F1A\u5220\u9664\u6587\u4EF6"],["rmdir","rmdir \u4F1A\u5220\u9664\u76EE\u5F55"],["unlink","unlink \u4F1A\u5220\u9664\u6587\u4EF6"],["mv","mv \u4F1A\u79FB\u52A8\u6216\u8986\u76D6\u6587\u4EF6"],["cp","cp \u4F1A\u5199\u6587\u4EF6"],["ln","ln \u4F1A\u521B\u5EFA\u94FE\u63A5"],["touch","touch \u4F1A\u521B\u5EFA\u6587\u4EF6\u6216\u6539\u65F6\u95F4\u6233"],["mkdir","mkdir \u4F1A\u521B\u5EFA\u76EE\u5F55"],["mkfifo","mkfifo \u4F1A\u521B\u5EFA\u6587\u4EF6"],["chmod","chmod \u4F1A\u6539\u6743\u9650"],["chown","chown \u4F1A\u6539\u5C5E\u4E3B"],["chgrp","chgrp \u4F1A\u6539\u5C5E\u7EC4"],["chflags","chflags \u4F1A\u6539\u6587\u4EF6\u5C5E\u6027"],["setfacl","setfacl \u4F1A\u6539\u6743\u9650"],["dd","dd \u4F1A\u5199\u8BBE\u5907\u6216\u6587\u4EF6"],["tee","tee \u4F1A\u5199\u6587\u4EF6"],["truncate","truncate \u4F1A\u622A\u65AD\u6587\u4EF6"],["shred","shred \u4F1A\u9500\u6BC1\u6587\u4EF6"],["install","install \u4F1A\u590D\u5236\u6587\u4EF6"],["patch","patch \u4F1A\u6539\u6587\u4EF6"],["zip","zip \u4F1A\u5199\u538B\u7F29\u5305"],["unzip","unzip \u4F1A\u89E3\u538B\u5199\u6587\u4EF6"],["wget","wget \u9ED8\u8BA4\u4F1A\u628A\u54CD\u5E94\u5199\u5230\u6587\u4EF6"],["rsync","rsync \u4F1A\u5199\u6587\u4EF6"],["scp","scp \u4F1A\u5199\u6587\u4EF6"],["sftp","sftp \u4F1A\u5199\u6587\u4EF6"],["ssh","ssh \u4F1A\u5728\u8FDC\u7AEF\u6267\u884C\u4EFB\u610F\u547D\u4EE4"],["kill","kill \u4F1A\u7EC8\u6B62\u8FDB\u7A0B"],["pkill","pkill \u4F1A\u7EC8\u6B62\u8FDB\u7A0B"],["killall","killall \u4F1A\u7EC8\u6B62\u8FDB\u7A0B"],["sudo","sudo \u4F1A\u63D0\u6743"],["su","su \u4F1A\u5207\u6362\u7528\u6237"],["shutdown","shutdown \u4F1A\u5173\u673A"],["reboot","reboot \u4F1A\u91CD\u542F"],["halt","halt \u4F1A\u5173\u673A"],["poweroff","poweroff \u4F1A\u5173\u673A"],["mkfs","mkfs \u4F1A\u683C\u5F0F\u5316"],["diskutil","diskutil \u4F1A\u6539\u78C1\u76D8"],["launchctl","launchctl \u4F1A\u6539\u7CFB\u7EDF\u670D\u52A1"],["defaults","defaults \u4F1A\u6539\u7CFB\u7EDF\u504F\u597D"],["eval","eval \u4F1A\u6267\u884C\u62FC\u63A5\u51FA\u6765\u7684\u547D\u4EE4"],["source","source \u4F1A\u6267\u884C\u811A\u672C"],[".","source \u4F1A\u6267\u884C\u811A\u672C"],["exec","exec \u4F1A\u66FF\u6362\u5F53\u524D\u8FDB\u7A0B"],["npx","npx \u53EF\u80FD\u4E0B\u8F7D\u5E76\u6267\u884C\u4EFB\u610F\u5305"]]),P0=new Set(["sh","bash","zsh","dash","fish","csh","tcsh","ksh","ash","mksh"]),j0=new Set(["node","nodejs","python","python2","python3","ruby","perl","php","osascript","deno","bun","tsx","ts-node"]),L0=new Set(["-v","-V","--version","-h","--help","-?"]),ed=new Set(["status","log","show","diff","blame","grep","ls-files","ls-tree","rev-parse","describe","shortlog","cat-file","reflog","version","help","whatchanged"]),I0=new Set(["branch","tag","remote","stash","config"]),td=/^(--set-upstream|--unset-upstream|--delete|--move|--copy|--edit-description|--set-url|--add|--remove|--prune|--update|--rename|--progress|--track|--no-track)/,D0=new Set(["npm","yarn","pnpm"]),nd=new Set(["ls","list","ll","la","view","info","outdated","why","ping","search","help"]);function Hs(t){let e=String(t??"");if(!e||e===".")return e;let n=e.split("/");return n[n.length-1]||e}function ra(t){let e=String(t??""),n=[],s="",o="",r=!1;for(let i=0;i<e.length;i++){let a=e[i];if(r){s+=a,r=!1;continue}if(a==="\\"&&o!=="'"){s+=a,r=!0;continue}if(o){s+=a,a===o&&(o="");continue}if(a==='"'||a==="'"){o=a,s+=a;continue}if(a==="&"&&e[i+1]==="&"){n.push(s),s="",i++;continue}if(a==="|"&&e[i+1]==="|"){n.push(s),s="",i++;continue}if(a==="|"||a===";"||a===`
|
|
79
|
+
`){n.push(s),s="";continue}if(a==="&"){let l=s.charAt(s.length-1),c=e[i+1];if(l===">"||c===">"){s+=a;continue}n.push(s),s="";continue}s+=a}return n.push(s),n.filter(function(i){return i.trim()!==""})}function rd(t){let e=String(t??""),n="",s="",o=!1;for(let r=0;r<e.length;r++){let i=e[r];if(o){o=!1,n+="Q";continue}if(i==="\\"&&s!=="'"){o=!0;continue}if(s){i===s&&(s="");continue}if(i==='"'||i==="'"){s=i,n+="Q";continue}n+=i}return n}function id(t){let e=String(t??"");for(let n=0;n<e.length;n++){if(e[n]!==">")continue;let s=n+1;e[s]===">"&&s++;let o=s;for(;e[o]===" "||e[o]===" ";)o++;if(e[o]==="&"&&/[0-9]/.test(e.charAt(o+1))){n=o;continue}let r=/^\/dev\/(null|stdout|stderr|tty)/.exec(e.slice(o));if(r){n=o+r[0].length-1;continue}return e.slice(o).split(/[\s;|&]+/)[0]||"\uFF08\u672A\u6307\u5B9A\uFF09"}return""}function N0(t,e){if((t==="node"||t==="nodejs")&&e.length===2&&e[0]==="--check")return null;if(!e.length)return{reason:t+" \u4E0D\u5E26\u53C2\u6570\u4F1A\u8FDB\u5165\u4EA4\u4E92\u5F0F\u89E3\u91CA\u5668"};for(let n of e)if(!L0.has(n))return{reason:t+" \u5728 Plan \u6A21\u5F0F\u53EA\u5141\u8BB8\u67E5\u7248\u672C\uFF08"+n+" \u53EF\u80FD\u6267\u884C\u4EE3\u7801\u6216\u5199\u6587\u4EF6\uFF09"};return null}function F0(t){let e=0;for(;e<t.length;){let i=t[e];if(i==="-C"||i==="-c"||i==="--git-dir"||i==="--work-tree"||i==="--namespace"){e+=2;continue}if(/^--(git-dir|work-tree|namespace)=/.test(i)){e++;continue}if(/^--no-pager$/.test(i)||/^--paginate$/.test(i)){e++;continue}break}let n=t[e],s=t.slice(e+1);if(!n||/^-/.test(n))return t.some(function(a){return a==="--version"||a==="-v"||a==="--help"||a==="-h"})?null:{reason:"git \u7F3A\u5C11\u5B50\u547D\u4EE4"};if(ed.has(n))return null;if(!I0.has(n))return{reason:"git "+n+" \u4E0D\u5C5E\u4E8E\u53EA\u8BFB\u5B50\u547D\u4EE4\uFF08\u53EF\u7528\uFF1A"+Array.from(ed).slice(0,6).join(" / ")+" \u7B49\uFF09"};if(n==="stash")return s.length?s[0]==="list"||s[0]==="show"?null:{reason:"git stash "+s[0]+" \u4F1A\u6539\u52A8\u6682\u5B58\u533A"}:{reason:"git stash \u4E0D\u5E26\u53C2\u6570\u4F1A\u6682\u5B58\u6539\u52A8"};if(n==="remote")return!s.length||s[0]==="-v"||s[0]==="--verbose"||s[0]==="show"||s[0]==="get-url"?null:{reason:"git remote "+s[0]+" \u4F1A\u6539\u8FDC\u7AEF\u914D\u7F6E"};if(n==="config")return s.some(function(a){return a==="--get"||a==="--get-all"||a==="--get-regexp"||a==="--list"||a==="-l"})?null:{reason:"git config \u53EA\u5141\u8BB8\u8BFB\u53D6\uFF08\u52A0 --get / --list\uFF09"};if(n==="tag")return!s.length||s.some(function(l){return l==="-l"||l==="--list"})||s.every(function(l){return/^-/.test(l)})?null:{reason:"git tag <\u540D\u5B57> \u4F1A\u521B\u5EFA\u6807\u7B7E"};if(s.some(function(i){return td.test(i)||/^-[dDmMcC]$/.test(i)}))return{reason:"git branch "+(s.find(function(i){return td.test(i)||/^-[dDmMcC]$/.test(i)})||"")+" \u4F1A\u6539\u52A8\u5206\u652F"};let r=s.some(function(i){return/^-(a|r|v|vv|l|list)$/.test(i)||/^--(list|show-current|contains|merged|no-merged|sort|format|points-at)/.test(i)});return!s.length||r?null:{reason:"git branch <\u540D\u5B57> \u4F1A\u521B\u5EFA\u5206\u652F"}}function R0(t,e){let n=e.find(function(s){return!/^-/.test(s)});return n?nd.has(n)?null:{reason:t+" "+n+" \u4F1A\u5199\u6587\u4EF6\u6216\u6539\u4F9D\u8D56\uFF08Plan \u6A21\u5F0F\u53EA\u5141\u8BB8 "+Array.from(nd).slice(0,4).join(" / ")+" \u7B49\u67E5\u8BE2\u547D\u4EE4\uFF09"}:e.some(function(o){return o==="--version"||o==="-v"||o==="--help"||o==="-h"})||!e.length?null:{reason:t+" \u7684\u8FD9\u7EC4\u53C2\u6570\u65E0\u6CD5\u5224\u65AD\u662F\u5426\u53EA\u8BFB"}}function ad(t){let e=rd(t).trim();if(!e)return null;let n=id(e);if(n)return{reason:"\u91CD\u5B9A\u5411\u4F1A\u5199\u6587\u4EF6\uFF08\u76EE\u6807\uFF1A"+n+"\uFF09",segment:t.trim()};let s=e.split(/\s+/).filter(Boolean),o=0;for(;s.length&&o++<6;){let l=Hs(s[0]);if(!od.has(l))break;s.shift();let c=0;for(;s.length&&c++<8;){let u=s[0];if(/^-/.test(u)){s.shift();continue}if(/^[A-Za-z_][A-Za-z0-9_]*=/.test(u)){s.shift();continue}if(l==="timeout"&&/^\d+(\.\d+)?[smhd]?$/.test(u)){s.shift();continue}break}}if(!s.length)return null;let r=Hs(s[0]),i=s.slice(1),a=t.trim();if(P0.has(r))return{reason:r+" -c \u53EF\u4EE5\u6267\u884C\u4EFB\u610F\u547D\u4EE4\uFF0C\u65E0\u6CD5\u9010\u6761\u6821\u9A8C"};if(Qu.has(r))return{reason:Qu.get(r)};if(j0.has(r)){let l=N0(r,i);return l?{reason:l.reason}:null}if(r==="tar"&&!i.some(function(c){return c==="-t"||c==="--list"||/^-[a-zA-Z]*t[a-zA-Z]*$/.test(c)}))return{reason:"tar \u53EA\u6709 -t\uFF08\u5217\u8868\uFF09\u662F\u53EA\u8BFB\u7684\uFF0C\u89E3\u538B\u6216\u6253\u5305\u90FD\u4F1A\u5199\u6587\u4EF6"};if(r==="find"){let l=i.find(function(c){return/^-(delete|exec|execdir|ok|okdir|fprint|fprintf|fls)$/.test(c)});if(l)return{reason:"find "+l+" \u4F1A\u6267\u884C\u547D\u4EE4\u6216\u5199\u6587\u4EF6"}}if(r==="sed"){let l=i.find(function(c){return c==="--in-place"||/^--in-place=/.test(c)?!0:/^-[A-Za-z]+$/.test(c)&&/i/.test(c)});if(l)return{reason:"sed "+l+" \u4F1A\u76F4\u63A5\u6539\u6587\u4EF6"}}if(r==="sort"){let l=i.find(function(c){return c==="--output"||/^--output=/.test(c)||/^-o/.test(c)});if(l)return{reason:"sort "+l+" \u4F1A\u628A\u7ED3\u679C\u5199\u5230\u6587\u4EF6"}}if(r==="awk"||r==="gawk"||r==="mawk"){if(/\bsystem\s*\(/.test(a))return{reason:"awk system() \u4F1A\u6267\u884C\u5916\u90E8\u547D\u4EE4"};if(/\bprintf?\b[^;{}]*>/.test(a)||/\|\s*getline/.test(a))return{reason:"awk \u5728\u5F80\u6587\u4EF6\u5199\u6216\u6267\u884C\u7BA1\u9053\u547D\u4EE4"}}if(r==="curl"){let l=i.slice();for(let u=0;u<l.length;u++)/^(-o|--output)$/.test(l[u])&&/^\/dev\/(null|stdout|stderr)$/.test(l[u+1]||"")&&(l.splice(u,2),u--);let c=l.find(function(u){return!!(/^(-o|-O|-T|-d|-F|-c|--output|--remote-name|--upload-file|--data|--data-raw|--data-binary|--form|--cookie-jar)$/.test(u)||/^--(output|upload-file|data|data-raw|data-binary|form|cookie-jar)=/.test(u)||/^(-X|--request)$/.test(u))});if(c)return{reason:"curl "+c+" \u4F1A\u5199\u6587\u4EF6\u6216\u53D1\u5199\u8BF7\u6C42"}}if(r==="git"){let l=F0(i);if(l)return{reason:l.reason}}if(D0.has(r)){let l=R0(r,i);if(l)return{reason:l.reason}}return null}function q0(t){let e=String(t??"");if(!e.trim())return{ok:!1,reason:"\u547D\u4EE4\u4E3A\u7A7A"};if(/\$\(|`|<\(|>\(/.test(e))return{ok:!1,reason:"\u547D\u4EE4\u66FF\u6362\uFF08$() \u53CD\u5F15\u53F7 <() >()\uFF09\u65E0\u6CD5\u9759\u6001\u6821\u9A8C"};let n=ra(e);if(!n.length)return{ok:!1,reason:"\u547D\u4EE4\u4E3A\u7A7A"};for(let s of n){let o=ad(s);if(o)return{ok:!1,reason:o.reason,segment:o.segment||s.trim()}}return{ok:!0}}var B0=function(){try{return os().SKIP_DIRS}catch{return[]}}(),ld=Object.create(null);for(let t of B0)ld[String(t).toLowerCase()]=1;var cd=new Set(["cat","bat","less","more","head","tail","nl","strings","od","xxd","hexdump","grep","rg","ag","ack","find","findstr","where","which","ls","dir","tree","du","wc","stat","file","diff","comm","type","get-content","gc","cat","get-childitem","gci","select-string","sls"]),U0=new Set(["powershell","pwsh","cmd","command","bash","sh","zsh","dash","fish"]),W0=/^--?(exclude|exclude-dir|ignore|ignore-file|ignore-dir|glob|g)$/i,K0=/^--?(exclude|exclude-dir|ignore|ignore-file|ignore-dir|glob)=/i,H0=/^--?(path|ipath|wholename|iwholename|name|iname|regex|iregex|not)$/i,z0=/^--?(path|ipath|wholename|iwholename|name|iname|regex|iregex)=/i,G0=new RegExp("(?:^|[^A-Za-z0-9_-])("+Array.from(cd).join("|")+")(?![A-Za-z0-9_-])","i");function oa(t){return String(t??"").replace(/^["']+/,"").replace(/["']+$/,"")}function J0(t){let e=oa(t);if(!/[/\\]/.test(e))return"";let n=e.replace(/\\/g,"/").split("/");for(let s of n){let o=s.replace(/["']+$/,"").toLowerCase();if(o&&ld[o])return o}return""}function sd(t,e){let n=!1;for(let s of t){if(n){n=!1;continue}if(K0.test(s))continue;if(W0.test(s)){n=!0;continue}if(e){if(z0.test(s))continue;if(H0.test(s)){n=!0;continue}}let o=J0(s);if(o)return o}return""}function $0(t){let e=String(t??"").trim();if(!e)return null;let n=e.split(/\s+/).filter(Boolean),s=0;for(;s<n.length;){let a=oa(n[s]);if(/^-/.test(a)||/^[A-Za-z_][A-Za-z0-9_]*=/.test(a)||/^\d+(\.\d+)?[smhd]?$/.test(a)){s++;continue}if(od.has(Hs(a))){s++;continue}break}if(s>=n.length)return null;let o=Hs(oa(n[s])).toLowerCase(),r=o==="find"||/(?:^|[^A-Za-z0-9_-])find(?![A-Za-z0-9_-])/i.test(e);if(U0.has(o)){if(!G0.test(e))return null;let a=sd(n.slice(s+1),r);return a?{seg:a,command:o}:null}if(!cd.has(o))return null;let i=sd(n.slice(s+1),r);return i?{seg:i,command:o}:null}function X0(t){let e=String(t??"");if(!e.trim())return null;for(let n of ra(e)){let s=$0(n);if(s)return{seg:s.seg,command:s.command,segment:n.trim()}}return null}ud.exports={check:q0,pathGuard:X0,_splitSegments:ra,_stripQuotes:rd,_redirectTarget:id,_checkSegment:ad,_baseOf:Hs}});var kd=Q((AS,la)=>{var cr=require("fs"),kn=require("path"),md=new Set(os().SKIP_DIRS),V0=512*1024,Y0=8e3,fd=400,Z0=200,Q0=2e3,ey=200,gd=2e3,pd=20;function as(t){let e=String(t??"").trim();if(!e)return null;let n=e.charAt(0)==="!"?e.slice(1):e,o=yd(n).map(function(r){let i="";for(let a=0;a<r.length;a++){let l=r.charAt(a);if(l==="*"){if(r.charAt(a+1)==="*"){let c=a;for(;r.charAt(c)==="*";)c++;r.charAt(c)==="/"?(i+="(?:.*/)?",a=c):(i+=".*",a=c-1);continue}i+="[^/]*";continue}if(l==="?"){i+="[^/]";continue}if(l==="["){let c=a+1;for((r.charAt(c)==="^"||r.charAt(c)==="!")&&c++,r.charAt(c)==="]"&&c++;c<r.length&&r.charAt(c)!=="]";)c++;if(c>=r.length){i+="\\[";continue}let u=r.slice(a+1,c);i+="["+u.replace(/\\/g,"\\\\")+"]",a=c;continue}i+=ty(l)}return new RegExp("^"+i+"$")}).filter(Boolean);return o.length?{res:o}:null}function yd(t){let e=t.indexOf("{");if(e<0)return[t];let n=0,s=-1;for(let c=e;c<t.length;c++){let u=t.charAt(c);if(u==="{")n++;else if(u==="}"&&(n--,n===0)){s=c;break}}if(s<0)return[t];let o=t.slice(0,e),r=t.slice(s+1),a=t.slice(e+1,s).split(","),l=[];for(let c of a)l.push.apply(l,yd(o+c+r));return l}function ty(t){return/[.*+?^${}()|[\]\\]/.test(t)?"\\"+t:t}function Vt(t,e){if(!t)return!1;for(let n of t.res)if(n.test(e))return!0;return!1}function ls(t,e){if(!t)return e;let n=String(t).replace(/\/+$/,"");return n?n+"/"+e:e}function bd(t){let e=String(t??"");return e.length>fd?e.slice(0,fd)+"\u2026":e}function hd(t,e,n){let s=Math.max(0,e),o=Math.min(t.length,n),r=[];for(let i=s;i<o;i++)r.push({line:i+1,text:bd(t[i])});return r}function aa(t,e){let n=e||{},s=isFinite(n.maxDepth)?Math.min(Math.max(n.maxDepth,1),pd):pd,o=isFinite(n.cap)&&n.cap>0?n.cap:2e4,r=[],i=0,a=!1;return function l(c,u){if(u>s)return;let d=[];try{d=cr.readdirSync(kn.join(t,c),{withFileTypes:!0})}catch{return}d.sort(function(f,p){return f.name<p.name?-1:f.name>p.name?1:0});for(let f of d){if(!f.name)continue;let p=c?c+"/"+f.name:f.name;if(f.isDirectory()){if(f.name.charAt(0)==="."||md.has(f.name))continue;if(l(p,u+1),r.length>=o){a=!0;return}continue}f.isFile()&&(i++,r.length<o?r.push(p):a=!0)}}("",0),{files:r,scanned:i,truncated:a}}function Xt(t,e,n){let s=n||{},o=Array.isArray(e)?e:[e],r=[],i=[];for(let d of o){let f=String(d??"").trim();if(!f)continue;let p=as(f);p&&(f.charAt(0)==="!"?i:r).push(p)}if(!r.length)return{matches:[],scanned:0,truncated:!1,error:'glob \u9700\u8981 patterns\uFF08\u5982 "**/*.js"\uFF09'};let a=lr(s.maxFiles,1,gd,ey),l=s.prefix?String(s.prefix):"",c=aa(t,{maxDepth:s.maxDepth,cap:2e4}),u=[];for(let d of c.files){let f=!1;for(let b of r)if(Vt(b,d)){f=!0;break}if(!f)continue;let p=!1;for(let b of i)if(Vt(b,d)){p=!0;break}if(p)continue;let h=kn.join(t,d),m=0,x=0;try{let b=cr.statSync(h);m=b.size,x=b.mtimeMs}catch{}if(u.push({rel:ls(l,d),abs:h,size:m,mtimeMs:x}),u.length>=a)break}return u.sort(function(d,f){return f.mtimeMs-d.mtimeMs}),{matches:u,scanned:c.scanned,truncated:c.truncated||u.length>=a,pattern:o.join(" ")}}function wd(t,e){if(t.error)return"glob \u53C2\u6570\u6709\u8BEF\uFF1A"+t.error;if(!t.matches.length)return'glob "'+t.pattern+'" \u6CA1\u6709\u5339\u914D\u6587\u4EF6\uFF08\u626B\u63CF '+t.scanned+" \u4E2A\u6587\u4EF6\uFF09";let n=t.matches.map(function(o){return o.rel+" ("+o.size+"B)"}),s='glob "'+t.pattern+'" \u547D\u4E2D '+t.matches.length+` \u4E2A\u6587\u4EF6\uFF08\u6309\u6700\u8FD1\u6539\u52A8\u6392\u5E8F\uFF09
|
|
80
|
+
`+n.join(`
|
|
81
|
+
`);return t.truncated&&(s+=`
|
|
82
|
+
...[\u7ED3\u679C\u5DF2\u622A\u65AD\uFF0C\u53EF\u52A0 patterns \u6536\u7A84\u6216\u63D0\u9AD8 maxFiles]`),s}function Ye(t,e,n){let s=n||{},o=String(e??"");if(!o)return{hits:[],filesSearched:0,truncated:!1,error:"grep \u9700\u8981 pattern\uFF08\u6B63\u5219\uFF09"};let r;try{r=new RegExp(o,s.ignoreCase?"gi":"g")}catch(k){return{hits:[],filesSearched:0,truncated:!1,error:"\u6B63\u5219\u4E0D\u5408\u6CD5\uFF1A"+k.message}}let i=lr(s.maxHits,1,Q0,Z0),a=lr(s.maxFiles,1,gd,5e3),l=lr(s.contextLines,0,5,0),c=s.prefix?String(s.prefix):"",u=isFinite(s.budgetMs)&&s.budgetMs>0?Math.floor(s.budgetMs):Y0,d=Date.now()+u,f=s.glob?as(s.glob):null,p=aa(t,{maxDepth:s.maxDepth,cap:2e4}),h=[],m=0,x=!1,b=!1;for(let k of p.files){if(h.length>=i){x=!0;break}if(Date.now()>d){x=!0,b=!0;break}if(f&&!Vt(f,k))continue;if(m>=a){x=!0;break}let S=kn.join(t,k),T;try{T=cr.statSync(S)}catch{continue}if(!T.isFile()||T.size>V0)continue;let g;try{g=cr.readFileSync(S,"utf8")}catch{continue}if(ny(g))continue;m++;let _=g.split(`
|
|
83
|
+
`);for(let v=0;v<_.length;v++){r.lastIndex=0;let A=r.exec(_[v]);if(A&&(h.push({rel:ls(c,k),line:v+1,text:bd(_[v]),col:A.index+1,match:A[0],groups:A.slice(1),before:l>0?hd(_,v-l,v):[],after:l>0?hd(_,v+1,v+1+l):[]}),h.length>=i)){x=!0;break}}}return{hits:h,filesSearched:m,truncated:x,timedOut:b,contextLines:l,pattern:o}}function ny(t){let e=t.slice(0,8192);if(e.indexOf("\0")>=0)return!0;let n=0,s=Math.min(e.length,2048);for(let o=0;o<s;o++){let r=e.charCodeAt(o);(r<9||r>13&&r<32)&&n++}return s>0&&n/s>.3}function ia(t){if(t.error)return"grep \u53C2\u6570\u6709\u8BEF\uFF1A"+t.error;if(!t.hits.length)return'grep "'+t.pattern+'" \u6CA1\u6709\u547D\u4E2D\uFF08\u68C0\u7D22 '+t.filesSearched+" \u4E2A\u6587\u4EF6\uFF09";let e=[],n="",s=null;for(let r of t.hits){r.rel!==n&&(e.push(r.rel+":"),n=r.rel,s=new Set);let i=function(a,l,c){s.has(a)||(s.add(a),e.push((c?"":" ")+a+": "+l))};for(let a of r.before||[])i(a.line,a.text,!1);i(r.line,r.text,!0);for(let a of r.after||[])i(a.line,a.text,!1)}let o='grep "'+t.pattern+'" \u547D\u4E2D '+t.hits.length+" \u884C / "+t.filesSearched+" \u4E2A\u6587\u4EF6"+(t.contextLines?"\uFF08\u4E0A\u4E0B\u6587\u5404 "+t.contextLines+" \u884C\uFF0C\u65E0\u7F29\u8FDB\u524D\u7F00\u7684\u662F\u547D\u4E2D\u884C\uFF09":"")+`
|
|
84
|
+
`+e.join(`
|
|
85
|
+
`);return t.truncated&&(o+=`
|
|
86
|
+
...[`+(t.timedOut?"\u68C0\u7D22\u5DF2\u8FBE\u65F6\u95F4\u9884\u7B97":"\u547D\u4E2D\u5DF2\u8FBE\u4E0A\u9650 "+t.hits.length+" \u884C")+"\uFF0C\u5DF2\u622A\u65AD\uFF1B\u53EF\u6536\u7A84 pattern / dir / glob\uFF0C\u6216\u63D0\u9AD8 maxHits]"),o}function lr(t,e,n,s){let o=Math.floor(Number(t));return isFinite(o)?Math.min(Math.max(o,e),n):s}la.exports={globToRegExp:as,globMatch:Vt,walkFiles:aa,glob:Xt,formatGlob:wd,grep:Ye,formatGrep:ia,outRel:ls,SKIP_DIRS:md};require.main===la&&sy();function sy(){let t=require("os"),e=require("fs"),n=e.mkdtempSync(kn.join(t.tmpdir(),"luban-fs-")),s=function(b,k){let S=kn.join(n,b);e.mkdirSync(kn.dirname(S),{recursive:!0}),e.writeFileSync(S,k)};s("a.js",`const foo1 = 1;
|
|
87
|
+
const foo2 = 2;
|
|
88
|
+
`),s("src/b.ts",`export function bar(x) { return foo1 + x; }
|
|
89
|
+
`),s("src/gen.js",`const generated = true;
|
|
90
|
+
`),s("src/deep/c.md",`# \u6807\u9898
|
|
91
|
+
foo(123) \u5728\u8FD9\u91CC
|
|
92
|
+
`),s("node_modules/dep/index.js",`const foo9 = 9;
|
|
93
|
+
`),s(".hidden/d.js",`const fooHidden = 1;
|
|
94
|
+
`),s("plain.txt",`foo(456)
|
|
95
|
+
`);let o=0,r=0,i=function(b,k,S){k?(o++,console.log(" ok "+b)):(r++,console.log(" FAIL "+b+(S?" :: "+S:"")))},a=Xt(n,"**/*.js");i("glob **/*.js \u547D\u4E2D a.js",a.matches.some(b=>b.rel==="a.js")),i("glob \u8DF3\u8FC7 node_modules",!a.matches.some(b=>b.rel.indexOf("node_modules")===0)),i("glob \u8DF3\u8FC7\u9690\u85CF\u76EE\u5F55",!a.matches.some(b=>b.rel.indexOf(".hidden")===0)),a=Xt(n,"src/**/*.ts"),i("glob src/**/*.ts \u53EA\u4E2D b.ts",a.matches.length===1&&a.matches[0].rel==="src/b.ts"),a=Xt(n,"**/*.{md,txt}"),i("glob \u82B1\u62EC\u53F7 md+txt",a.matches.length===2),a=Xt(n,["**/*.js","!src/**"]),i("glob \u53D6\u53CD\u6392\u9664 src/",a.matches.length===1&&a.matches[0].rel==="a.js",JSON.stringify(a.matches.map(b=>b.rel))),a=Xt(n,["**/*.js","!**/gen.js"]),i("glob \u53D6\u53CD\u6392\u9664 gen.js",a.matches.length===1&&a.matches[0].rel==="a.js",JSON.stringify(a.matches.map(b=>b.rel))),a=Xt(n,"**/b.?s"),i("glob ? \u5355\u5B57\u7B26",a.matches.length===1&&a.matches[0].rel==="src/b.ts");let l=Ye(n,"foo\\(\\d+\\)");i("grep \u6B63\u5219\u547D\u4E2D\u4E24\u5904",l.hits.length===2,JSON.stringify(l.hits.map(b=>b.rel+":"+b.line))),i("grep \u547D\u4E2D c.md \u4E0E plain.txt",l.hits.some(b=>b.rel==="src/deep/c.md")&&l.hits.some(b=>b.rel==="plain.txt")),l=Ye(n,"foo\\((\\d+)\\)"),i("grep \u6355\u83B7\u7EC4",l.hits.every(b=>/^\d+$/.test(b.groups[0])),JSON.stringify(l.hits.map(b=>b.groups[0]))),l=Ye(n,"FOO1",{ignoreCase:!0}),i("grep ignoreCase",l.hits.length===2&&l.hits.some(b=>b.rel==="a.js")),l=Ye(n,"foo1",{glob:"**/*.ts"}),i("grep glob \u8FC7\u6EE4\u53EA\u770B ts",l.hits.length===1&&l.hits[0].rel==="src/b.ts"),l=Ye(n,"foo9"),i("grep \u8DF3\u8FC7 node_modules",l.hits.length===0),l=Ye(n,"foo",{maxHits:3}),i("grep maxHits \u622A\u65AD",l.hits.length===3&&l.truncated===!0),l=Ye(n,"foo",{contextLines:1}),i("grep contextLines \u8BB0\u5F55",l.contextLines===1),i("grep \u4E0A\u4E0B\u6587\u884C\u5DF2\u53D6\u597D",l.hits[0].before.length+l.hits[0].after.length>0);let c=Ye(n,"bar",{contextLines:1}),u=ia(c);i("grep \u547D\u4E2D\u884C\u4E0D\u5E26\u7F29\u8FDB\u524D\u7F00",/^\d+: /m.test(u),u),i("grep \u4E0A\u4E0B\u6587\u884C\u5E26\u4E24\u7A7A\u683C\u524D\u7F00",/^ \d+: /m.test(u),u);let d=Ye(kn.join(n,"src"),"bar",{prefix:"src"});i("grep prefix \u8865\u56DE\u76EE\u5F55",d.hits[0]&&d.hits[0].rel==="src/b.ts",JSON.stringify(d.hits.map(b=>b.rel)));let f=Xt(kn.join(n,"src"),"**/*.ts",{prefix:"src"});i("glob prefix \u8865\u56DE\u76EE\u5F55",f.matches[0]&&f.matches[0].rel==="src/b.ts",JSON.stringify(f.matches.map(b=>b.rel))),i("outRel \u7A7A\u524D\u7F00\u539F\u6837",ls("","a.js")==="a.js"),i("outRel \u53BB\u5C3E\u90E8\u659C\u6760",ls("src/","a.js")==="src/a.js"),i("outRel \u7EDD\u5BF9\u524D\u7F00",ls("/tmp/x","a.js")==="/tmp/x/a.js");let p=Ye(n,"foo",{budgetMs:1});i("grep \u65F6\u95F4\u9884\u7B97\u6536\u624B",p.timedOut===!0||p.hits.length>0),l=Ye(n,"("),i("grep \u975E\u6CD5\u6B63\u5219\u62A5\u9519",!!l.error),l=Ye(n,""),i("grep \u7A7A pattern \u62A5\u9519",!!l.error);let h=as("**/*.spec.ts");i("globToRegExp \u5339\u914D a/b/c.spec.ts",Vt(h,"a/b/c.spec.ts")),i("globToRegExp \u4E0D\u5339\u914D a/b/c.ts",!Vt(h,"a/b/c.ts"));let m=as("src/**");i("globToRegExp src/** \u5339\u914D src/x",Vt(m,"src/x")),i("globToRegExp src/** \u4E0D\u5339\u914D srcx",!Vt(m,"srcx"));let x=as("!src/**");i("globToRegExp \u5265\u6389\u524D\u5BFC ! \u540E\u5339\u914D src/x",Vt(x,"src/x")),i("formatGlob \u7A7A\u7ED3\u679C",/没有匹配/.test(wd(Xt(n,"**/*.zzz")))),i("formatGrep \u6709\u547D\u4E2D",/命中 \d+ 行/.test(ia(Ye(n,"foo1")))),e.rmSync(n,{recursive:!0,force:!0}),console.log(`
|
|
96
|
+
filesearch selftest: `+o+" passed, "+r+" failed"),process.exit(r?1:0)}});var Cd=Q((ES,da)=>{var Nt=require("fs"),xn=require("path"),xd="*** Begin Patch",Sd="*** End Patch",_d="*** Add File:",vd="*** Update File:",Td="*** Delete File:",oy="@@";function st(t){let n=String(t??"").split(`
|
|
97
|
+
`),s=-1,o=-1;for(let c=0;c<n.length;c++){let u=n[c].trim();if(s<0&&u===xd){s=c;continue}if(u===Sd){o=c;break}}if(s<0)return{ops:[],error:"\u7F3A\u5C11 "+xd+" \u8D77\u59CB\u6807\u8BB0"};if(o<0)return{ops:[],error:"\u7F3A\u5C11 "+Sd+" \u7ED3\u675F\u6807\u8BB0"};let r=[],i=null,a=null,l=[];for(let c=s+1;c<o;c++){let u=n[c],d=u.trim();if(d.indexOf(_d)===0){let f=d.slice(_d.length).trim();if(!f){l.push("\u7B2C "+(c+1)+" \u884C\uFF1AAdd File \u7F3A\u5C11\u8DEF\u5F84");continue}i={type:"add",path:f,lines:[]},r.push(i),a="add";continue}if(d.indexOf(vd)===0){let f=d.slice(vd.length).trim();if(!f){l.push("\u7B2C "+(c+1)+" \u884C\uFF1AUpdate File \u7F3A\u5C11\u8DEF\u5F84");continue}i={type:"update",path:f,chunks:[]},r.push(i),a="update";continue}if(d.indexOf(Td)===0){let f=d.slice(Td.length).trim();if(!f){l.push("\u7B2C "+(c+1)+" \u884C\uFF1ADelete File \u7F3A\u5C11\u8DEF\u5F84");continue}i={type:"delete",path:f},r.push(i),a=null;continue}if(!i){d&&l.push("\u7B2C "+(c+1)+' \u884C\uFF1A\u51FA\u73B0\u65E0\u6CD5\u8BC6\u522B\u7684\u6307\u4EE4 "'+d+'"');continue}if(a==="add"){u.charAt(0)==="+"?i.lines.push(u.slice(1)):d===""?i.lines.push(""):l.push("\u7B2C "+(c+1)+' \u884C\uFF1AAdd File \u5185\u5BB9\u884C\u5E94\u4EE5 + \u5F00\u5934\uFF0C\u5F97\u5230 "'+u+'"');continue}if(a==="update"){if(d.indexOf(oy)===0){i.chunks.push({seq:[],del:[],add:[]});continue}let f=i.chunks.length?i.chunks[i.chunks.length-1]:null;if(!f){u.charAt(0)===" "?cs(i).seq.push({k:"ctx",v:u.slice(1)}):u.charAt(0)==="-"?(cs(i).seq.push({k:"del",v:u.slice(1)}),cs(i).del.push(u.slice(1))):u.charAt(0)==="+"?(cs(i).seq.push({k:"add",v:u.slice(1)}),cs(i).add.push(u.slice(1))):d===""?cs(i).seq.push({k:"ctx",v:""}):l.push("\u7B2C "+(c+1)+' \u884C\uFF1AUpdate File \u884C\u5E94\u4EE5\u7A7A\u683C / - / + \u5F00\u5934\uFF0C\u5F97\u5230 "'+u+'"');continue}u.charAt(0)===" "?f.seq.push({k:"ctx",v:u.slice(1)}):u.charAt(0)==="-"?(f.seq.push({k:"del",v:u.slice(1)}),f.del.push(u.slice(1))):u.charAt(0)==="+"?(f.seq.push({k:"add",v:u.slice(1)}),f.add.push(u.slice(1))):d===""?f.seq.push({k:"ctx",v:""}):l.push("\u7B2C "+(c+1)+' \u884C\uFF1AUpdate File \u884C\u5E94\u4EE5\u7A7A\u683C / - / + \u5F00\u5934\uFF0C\u5F97\u5230 "'+u+'"');continue}}return l.length?{ops:r,error:l.join("\uFF1B")}:r.length?{ops:r}:{ops:[],error:"Patch \u91CC\u6CA1\u6709\u4EFB\u4F55\u6587\u4EF6\u64CD\u4F5C"}}function cs(t){return t.chunks.length||t.chunks.push({context:[],del:[],add:[]}),t.chunks[t.chunks.length-1]}function Dt(t,e,n){if(e.error)return{ok:!1,error:e.error};let s=n||{},o=typeof s.resolve=="function"?s.resolve:function(l){return xn.resolve(t,l)},r=e.ops,i=Object.create(null),a=[];for(let l of r){let c=l.path,u;try{u=o(c)}catch(d){return{ok:!1,error:d.message}}if(i[c])return{ok:!1,error:"\u8DEF\u5F84\u91CD\u590D\u51FA\u73B0\uFF1A"+c};if(i[c]=l.type,l.type==="add"){if(Nt.existsSync(u))return{ok:!1,error:"Add File \u4F46\u6587\u4EF6\u5DF2\u5B58\u5728\uFF1A"+c};a.push({type:"add",rel:c,abs:u,content:l.lines.join(`
|
|
98
|
+
`)+(l.lines.length?`
|
|
99
|
+
`:"")});continue}if(l.type==="delete"){if(!Nt.existsSync(u))return{ok:!1,error:"Delete File \u4F46\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A"+c};if(!Nt.statSync(u).isFile())return{ok:!1,error:"Delete File \u76EE\u6807\u4E0D\u662F\u6587\u4EF6\uFF1A"+c};let d="";try{d=Nt.readFileSync(u,"utf8")}catch{d=""}a.push({type:"delete",rel:c,abs:u,before:d});continue}if(l.type==="update"){if(!Nt.existsSync(u))return{ok:!1,error:"Update File \u4F46\u6587\u4EF6\u4E0D\u5B58\u5728\uFF1A"+c};let d;try{d=Nt.readFileSync(u,"utf8")}catch(p){return{ok:!1,error:"\u8BFB\u53D6\u5931\u8D25 "+c+"\uFF1A"+p.message}}let f=Md(d,l.chunks);if(f.error)return{ok:!1,error:c+"\uFF1A"+f.error};a.push({type:"update",rel:c,abs:u,before:d,content:f.content,changed:f.changed});continue}}return{ok:!0,plan:a}}function Md(t,e){if(!e.length)return{error:"Update File \u6CA1\u6709\u4EFB\u4F55 @@ \u5757"};let n=t.split(`
|
|
100
|
+
`),s=0,o=0;for(let r=0;r<e.length;r++){let i=e[r];if(!i.seq.length)return{error:"\u7B2C "+(r+1)+" \u4E2A @@ \u5757\u4E3A\u7A7A"};let a=[];for(let f of i.seq)(f.k==="ctx"||f.k==="del")&&a.push(f.v);let l=ry(n,a,o);if(l<0)return{error:"\u7B2C "+(r+1)+" \u4E2A @@ \u5757\u7684\u4E0A\u4E0B\u6587\u5728\u6587\u4EF6\u91CC\u627E\u4E0D\u5230\uFF08anchor="+JSON.stringify(a.slice(0,3))+"\uFF09"};let c=[];for(let f of i.seq)(f.k==="ctx"||f.k==="add")&&c.push(f.v);let u=n.slice(0,l),d=n.slice(l+a.length);n=u.concat(c,d),o=l+c.length,(i.del.length||i.add.length)&&s++}return{content:n.join(`
|
|
101
|
+
`),changed:s}}function ry(t,e,n){if(!e.length)return n;let s=Math.max(0,n||0);e:for(let o=s;o<=t.length-e.length;o++){for(let r=0;r<e.length;r++)if(t[o+r]!==e[r])continue e;return o}return-1}function ca(t,e,n){let s=Dt(t,e);if(!s.ok)return{ok:!1,error:s.error};let o=[];for(let r of s.plan)r.type==="add"?(Nt.mkdirSync(xn.dirname(r.abs),{recursive:!0}),Nt.writeFileSync(r.abs,r.content),o.push({rel:r.rel,action:"add"})):r.type==="update"?(Nt.writeFileSync(r.abs,r.content),o.push({rel:r.rel,action:"update"})):r.type==="delete"&&(Nt.rmSync(r.abs,{force:!0}),o.push({rel:r.rel,action:"delete"}));return{ok:!0,results:o}}function ua(t){if(!t.ok)return"apply_patch \u5931\u8D25\uFF1A"+t.error;let e={add:0,update:0,delete:0},n=t.results.map(function(s){return e[s.action]++," "+s.action+" "+s.rel});return"apply_patch \u6210\u529F\uFF1A\u65B0\u589E "+e.add+" / \u4FEE\u6539 "+e.update+" / \u5220\u9664 "+e.delete+"\uFF0C\u5171 "+t.results.length+` \u4E2A\u6587\u4EF6
|
|
102
|
+
`+n.join(`
|
|
103
|
+
`)}da.exports={parsePatch:st,validatePatch:Dt,applyChunks:Md,applyPatch:ca,formatPatchResult:ua};require.main===da&&iy();function iy(){let t=require("os"),e=require("fs"),n=e.mkdtempSync(xn.join(t.tmpdir(),"luban-patch-")),s=function(B,W){let N=xn.join(n,B);e.mkdirSync(xn.dirname(N),{recursive:!0}),e.writeFileSync(N,W)},o=function(B){return e.readFileSync(xn.join(n,B),"utf8")};s("a.js",`const a = 1;
|
|
104
|
+
const b = 2;
|
|
105
|
+
const c = 3;
|
|
106
|
+
`),s("old.js",`legacy
|
|
107
|
+
`);let r=0,i=0,a=function(B,W,N){W?(r++,console.log(" ok "+B)):(i++,console.log(" FAIL "+B+(N?" :: "+N:"")))},l=["*** Begin Patch","*** Add File: new.js","+const fresh = true;","+","+const two = 2;","*** Update File: a.js","@@"," const a = 1;","-const b = 2;","+const b = 20;"," const c = 3;","*** Delete File: old.js","*** End Patch"].join(`
|
|
108
|
+
`),c=st(l);a("parse \u65E0\u9519\u8BEF",!c.error,c.error),a("parse \u4E09\u4E2A op",c.ops.length===3),a("add \u5185\u5BB9\u53BB\u524D\u7F00",c.ops[0].lines.join("|")==="const fresh = true;||const two = 2;");let u=Dt(n,c);a("validate \u901A\u8FC7",u.ok,u.error),a("update \u5185\u5BB9\u6B63\u786E",u.plan[1].content===`const a = 1;
|
|
109
|
+
const b = 20;
|
|
110
|
+
const c = 3;
|
|
111
|
+
`,JSON.stringify(u.plan[1]&&u.plan[1].content));let d=ca(n,c);a("apply \u6210\u529F",d.ok,d.error),a("add \u843D\u76D8",o("new.js")===`const fresh = true;
|
|
112
|
+
|
|
113
|
+
const two = 2;
|
|
114
|
+
`),a("update \u843D\u76D8",o("a.js")===`const a = 1;
|
|
115
|
+
const b = 20;
|
|
116
|
+
const c = 3;
|
|
117
|
+
`),a("delete \u843D\u76D8",!e.existsSync(xn.join(n,"old.js"))),s("multi.js",`l1
|
|
118
|
+
l2
|
|
119
|
+
l3
|
|
120
|
+
l4
|
|
121
|
+
l5
|
|
122
|
+
`);let f=["*** Begin Patch","*** Update File: multi.js","@@ first"," l1","-l2","+L2","@@ second"," l4","-l5","+L5","*** End Patch"].join(`
|
|
123
|
+
`),p=ca(n,st(f));a("\u591A @@ \u5757 apply",p.ok,p.error),a("\u591A @@ \u5757\u5185\u5BB9",o("multi.js")===`l1
|
|
124
|
+
L2
|
|
125
|
+
l3
|
|
126
|
+
l4
|
|
127
|
+
L5
|
|
128
|
+
`,JSON.stringify(o("multi.js"))),s("ctx.js",`alpha
|
|
129
|
+
beta
|
|
130
|
+
`);let h=["*** Begin Patch","*** Update File: ctx.js","@@"," alpha","-gamma","+delta","*** End Patch"].join(`
|
|
131
|
+
`),m=Dt(n,st(h));a("\u4E0A\u4E0B\u6587\u627E\u4E0D\u5230\u62A5\u9519",!m.ok&&/找不到/.test(m.error),m.error),a("\u5931\u8D25\u4E0D\u843D\u76D8",o("ctx.js")===`alpha
|
|
132
|
+
beta
|
|
133
|
+
`);let b=Dt(n,st(`*** Begin Patch
|
|
134
|
+
*** Add File: a.js
|
|
135
|
+
+x
|
|
136
|
+
*** End Patch`));a("Add \u5DF2\u5B58\u5728\u62A5\u9519",!b.ok&&/已存在/.test(b.error),b.error);let S=Dt(n,st(`*** Begin Patch
|
|
137
|
+
*** Delete File: nope.js
|
|
138
|
+
*** End Patch`));a("Delete \u4E0D\u5B58\u5728\u62A5\u9519",!S.ok&&/不存在/.test(S.error),S.error),a("\u7F3A Begin \u62A5\u9519",!!st(`*** Add File: x
|
|
139
|
+
+y`).error),a("\u7F3A End \u62A5\u9519",!!st(`*** Begin Patch
|
|
140
|
+
*** Add File: x
|
|
141
|
+
+y`).error),a("\u7A7A patch \u62A5\u9519",!!st(`*** Begin Patch
|
|
142
|
+
*** End Patch`).error);let g=Dt(n,st("```patch\n*** Begin Patch\n*** Add File: fenced.js\n+ok\n*** End Patch\n```"));a("\u5BB9\u9519\u4EE3\u7801\u56F4\u680F",g.ok,g.error);let v=Dt(n,st(`*** Begin Patch
|
|
143
|
+
*** Add File: dup.js
|
|
144
|
+
+a
|
|
145
|
+
*** Add File: dup.js
|
|
146
|
+
+b
|
|
147
|
+
*** End Patch`));a("\u8DEF\u5F84\u91CD\u590D\u62A5\u9519",!v.ok&&/重复/.test(v.error),v.error),s("guard.js",`safe
|
|
148
|
+
`);let C=Dt(n,st(`*** Begin Patch
|
|
149
|
+
*** Update File: guard.js
|
|
150
|
+
@@
|
|
151
|
+
safe
|
|
152
|
+
*** Delete File: old2.js
|
|
153
|
+
*** End Patch`),{resolve:function(B){if(B==="old2.js")throw new Error("\u8DEF\u5F84\u8D8A\u754C\uFF1A"+B);return xn.join(n,B)}});a("\u81EA\u5B9A\u4E49 resolve \u629B\u9519\u8F6C\u6210\u6821\u9A8C\u5931\u8D25",!C.ok&&/越界/.test(C.error),C.error),s("del.js",`keep me
|
|
154
|
+
`);let L=Dt(n,st(`*** Begin Patch
|
|
155
|
+
*** Delete File: del.js
|
|
156
|
+
*** End Patch`));a("delete \u5E26 before \u5907\u4EFD",L.ok&&L.plan[0].before===`keep me
|
|
157
|
+
`,JSON.stringify(L.plan[0]&&L.plan[0].before)),a("format \u6210\u529F",/成功/.test(ua(d))),a("format \u5931\u8D25",/失败/.test(ua({ok:!1,error:"x"}))),e.rmSync(n,{recursive:!0,force:!0}),console.log(`
|
|
158
|
+
patch selftest: `+r+" passed, "+i+" failed"),process.exit(i?1:0)}});var Od=Q((OS,pa)=>{var Ed={0:"error",1:"warning",2:"info",3:"hint"},Ad={error:0,warning:1,info:2,hint:3};function us(t){if(!t||typeof t!="object")return null;let e=typeof t.severity=="number"?t.severity:0,n=t.range||{},s=n.start||{},o=n.end||s;return{severity:Ed[e]||"error",line:typeof s.line=="number"?s.line+1:0,col:typeof s.character=="number"?s.character+1:0,endLine:typeof o.line=="number"?o.line+1:0,endCol:typeof o.character=="number"?o.character+1:0,message:String(t.message==null?"":t.message),source:t.source?String(t.source):"",code:t.code!=null?String(t.code):""}}function zs(t){let e={total:0,error:0,warning:0,info:0,hint:0,files:0,byFile:[]},n=Object.keys(t||{});for(let s of n){let o=(t[s]||[]).map(us).filter(Boolean);if(!o.length)continue;e.files++;let r={file:s,error:0,warning:0,info:0,hint:0};for(let i of o)e.total++,e[i.severity]++,r[i.severity]++;e.byFile.push(r)}return e.byFile.sort(function(s,o){return o.error-s.error||o.warning-s.warning||(s.file<o.file?-1:1)}),e}function ur(t,e){let s=Math.min(Math.max(Math.floor(Number((e||{}).maxDiags))||100,1),1e3),o=zs(t);if(!o.total)return"read_lints\uFF1A\u6CA1\u6709\u8BCA\u65AD\uFF080 error / 0 warning\uFF09";let r=[];for(let a of o.byFile){let l=(t[a.file]||[]).map(us).filter(Boolean);l.sort(function(c,u){return Ad[c.severity]-Ad[u.severity]||c.line-u.line||c.col-u.col});for(let c of l){if(r.length>=s)break;let u=c.line?c.line+":"+c.col:"?",d=c.source?" ["+c.source+(c.code?" "+c.code:"")+"]":"";r.push(c.severity.toUpperCase()+" "+a.file+":"+u+d+" "+c.message)}if(r.length>=s)break}let i="read_lints\uFF1A\u5171 "+o.total+" \u6761\uFF08error "+o.error+" / warning "+o.warning+" / info "+o.info+" / hint "+o.hint+"\uFF09\uFF0C\u6D89\u53CA "+o.files+` \u4E2A\u6587\u4EF6
|
|
159
|
+
`+r.join(`
|
|
160
|
+
`);return o.total>r.length&&(i+=`
|
|
161
|
+
...[\u8BCA\u65AD\u5DF2\u8FBE\u4E0A\u9650 `+r.length+" \u6761\uFF0C\u5DF2\u622A\u65AD\uFF1B\u5148\u4FEE error \u518D\u91CD\u8BFB]"),i}function fa(t){return zs(t).error>0}pa.exports={normalizeDiag:us,summarize:zs,formatLints:ur,hasErrors:fa,SEVERITY:Ed};require.main===pa&&ay();function ay(){let t=0,e=0,n=function(u,d,f){d?(t++,console.log(" ok "+u)):(e++,console.log(" FAIL "+u+(f?" :: "+f:"")))},s=function(u,d,f,p,h,m){return{severity:u,range:{start:{line:d,character:f},end:{line:d,character:f+3}},message:p,source:h,code:m}},o={"/a.js":[s(0,9,0,"Unexpected token '}'","eslint","E999"),s(1,2,4,"unused var","eslint")],"/b.ts":[s(0,0,0,"Type error","tsc","TS2345")],"/c.js":[s(2,4,1,"info thing"),s(3,5,1,"hint thing")]},r=zs(o);n("total 5",r.total===5,JSON.stringify(r)),n("error 2",r.error===2),n("warning 1",r.warning===1),n("files 3",r.files===3),n("error \u591A\u7684\u6587\u4EF6\u6392\u524D",r.byFile[0].file==="/a.js",JSON.stringify(r.byFile.map(u=>u.file)));let i=us(s(0,9,0,"x"));n("\u884C\u53F7\u8F6C 1 \u57FA",i.line===10&&i.col===1,JSON.stringify(i));let a=ur(o);n("format \u542B error \u8BA1\u6570",/error 2/.test(a)),n("format \u542B\u6587\u4EF6:\u884C:\u5217",/\/a\.js:10:1/.test(a),a),n("format \u542B source",/\[eslint E999\]/.test(a)),n("error \u6392\u5728 warning \u524D",a.indexOf("ERROR")<a.indexOf("WARNING")),n("\u7A7A\u8BCA\u65AD\u63D0\u793A",/没有诊断/.test(ur({}))),n("\u7A7A\u8BCA\u65AD hasErrors false",fa({})===!1),n("\u6709 error \u65F6 hasErrors true",fa(o)===!0);let l={"/x.js":[]};for(let u=0;u<150;u++)l["/x.js"].push(s(1,u,0,"w"+u));let c=ur(l,{maxDiags:20});n("\u622A\u65AD\u5230 20 \u6761",(c.match(/^WARNING/gm)||[]).length===20,String((c.match(/^WARNING/gm)||[]).length)),n("\u622A\u65AD\u6709\u63D0\u793A",/已截断/.test(c)),n("normalize null \u5B89\u5168",us(null)===null),n("normalize \u7F3A range \u5B89\u5168",us({message:"x"}).severity==="error"),n("summarize undefined \u5B89\u5168",zs(void 0).total===0),console.log(`
|
|
162
|
+
lints selftest: `+t+" passed, "+e+" failed"),process.exit(e?1:0)}});var Dd=Q((PS,Id)=>{var Xs=require("fs"),ly=require("path"),Pd=24,jd=120,Js=[{key:"today",label:"\u4ECA\u5929",days:1},{key:"7d",label:"\u8FD1 7 \u5929",days:7},{key:"30d",label:"\u8FD1 30 \u5929",days:30},{key:"all",label:"\u5168\u90E8",days:0}];function ha(t){return(t<10?"0":"")+t}function Vs(t){let e=t instanceof Date?t:new Date(Number(t));return isNaN(e.getTime())?new Date:e}function hr(t){let e=Vs(t);return e.getFullYear()+"-"+ha(e.getMonth()+1)+"-"+ha(e.getDate())}function $s(t){let e=Vs(t);return e.getFullYear()+"-"+ha(e.getMonth()+1)}function ds(t){let e=Vs(t);return new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,0,0,0).getTime()}function cy(t,e){let n=e==null?Date.now():Number(e),s=Js.find(function(i){return i.key===String(t||"")})||Js[1];if(!s.days)return{key:s.key,label:s.label,from:0,to:n,days:0};let o=Vs(n),r=new Date(o.getFullYear(),o.getMonth(),o.getDate()-(s.days-1),0,0,0,0).getTime();return{key:s.key,label:s.label,from:r,to:n,days:s.days}}function gt(t){let e=Number(t);return isFinite(e)&&e>0?Math.floor(e):0}function Yt(t,e){let n=String(t??"");return n.length>e?n.slice(0,e):n}function dr(t){let e=Number(t);return!isFinite(e)||e<=0?0:Number(Math.min(1,e).toFixed(3))}function uy(t,e,n){let s=t||{},o=e||{},r=function(){let f=Number(s.ts);if(isFinite(f)&&f>0)return Math.floor(f);let p=n==null?Date.now():Number(n);return isFinite(p)&&p>0?Math.floor(p):Date.now()}(),i=gt(o.promptTokens),a=gt(o.completionTokens),l=gt(o.totalTokens)||i+a,c=Math.min(gt(o.cachedTokens),i),u=gt(o.contextTokens),d=gt(o.window);return{v:1,at:new Date(r).toISOString(),ts:r,day:hr(r),provider:Yt(s.provider,60),model:Yt(s.model||o.model,120),modelKey:Yt(s.modelKey,160),mode:Yt(s.mode,20)||"agent",source:Yt(s.source,20),session:Yt(s.session,80),requests:gt(o.requests),promptTokens:i,completionTokens:a,totalTokens:l,cachedTokens:c,contextTokens:u,window:d,hit:o.hit!=null?dr(o.hit):i>0?dr(c/i):0,percent:o.percent!=null?dr(o.percent):d>0?dr(u/d):0,estimated:!!o.estimated,partial:!!o.partial}}function ma(t,e){return ly.join(t,e+".jsonl")}function dy(t){Xs.mkdirSync(t,{recursive:!0,mode:448})}function ga(t){let e=[];try{e=Xs.readdirSync(t)}catch{return[]}let n=[];for(let s of e)/^\d{4}-\d{2}\.jsonl$/.test(s)&&n.push(s.slice(0,-6));return n.sort(),n}function Ld(t,e){let n=function(){let o=Vs(e??Date.now());return new Date(o.getFullYear(),o.getMonth()-(Pd-1),1,0,0,0,0).getTime()}(),s=[];for(let o of ga(t)){let r=new Date(Number(o.slice(0,4)),Number(o.slice(5,7))-1,1,0,0,0,0).getTime();if(!(!isFinite(r)||r>=n))try{Xs.unlinkSync(ma(t,o)),s.push(o)}catch{}}return s}function fy(t,e){if(!t)return{ok:!1,error:"dir \u4E0D\u80FD\u4E3A\u7A7A"};if(!e||!e.ts)return{ok:!1,error:"record \u7F3A\u5C11 ts"};try{dy(t);let n=ma(t,$s(e.ts));return Xs.appendFileSync(n,JSON.stringify(e)+`
|
|
163
|
+
`,{mode:384}),Ld(t,Math.max(Number(e.ts)||0,Date.now())),{ok:!0,file:n,month:$s(e.ts)}}catch(n){return{ok:!1,error:String(n&&n.message||n)}}}function py(t,e,n){let s=Number(e)>0?Number(e):0,o=Number(n)>0?Number(n):Date.now(),r=s>0?$s(s):"",i=$s(o),a=ga(t).filter(function(u){return r&&u<r?!1:u<=i}),l=[],c=0;for(let u of a){let d="";try{d=Xs.readFileSync(ma(t,u),"utf8")}catch{continue}for(let f of d.split(`
|
|
164
|
+
`)){let p=f.trim();if(!p)continue;let h=null;try{h=JSON.parse(p)}catch{c++;continue}if(!h||!h.ts){c++;continue}let m=Number(h.ts);!isFinite(m)||m<s||m>o||l.push(h)}}return l.sort(function(u,d){return Number(u.ts)-Number(d.ts)}),{rows:l,files:a.map(function(u){return u+".jsonl"}),bad:c}}function Gs(){return{turns:0,requests:0,promptTokens:0,completionTokens:0,totalTokens:0,cachedTokens:0,estimatedTurns:0,partialTurns:0}}function fr(t,e){t.turns++,t.requests+=gt(e.requests),t.promptTokens+=gt(e.promptTokens),t.completionTokens+=gt(e.completionTokens),t.totalTokens+=gt(e.totalTokens),t.cachedTokens+=gt(e.cachedTokens),e.estimated&&t.estimatedTurns++,e.partial&&t.partialTurns++}function pr(t){return t.hit=t.promptTokens>0?Number(Math.min(1,t.cachedTokens/t.promptTokens).toFixed(3)):0,t}function hy(t,e,n,s){let o=Object.keys(t).sort();if(!o.length)return[];let r=e>0?ds(e):ds(t[o[0]].ts),i=n>0?ds(n):ds(t[o[o.length-1]].ts),a=Math.round((i-r)/864e5)+1,l=s>0?Math.min(a,s):a;if(l>jd)return o.map(function(u){return t[u]});let c=[];for(let u=0;u<l;u++){let d=new Date(r);d.setDate(d.getDate()+u);let f=hr(d.getTime());c.push(t[f]||Object.assign({day:f,ts:d.getTime()},Gs(),{hit:0,empty:!0}))}return c}function my(t,e){let n=e||{},s=Array.isArray(t)?t:[],o=Gs(),r=Object.create(null),i=Object.create(null),a=Object.create(null);for(let d of s){fr(o,d);let f=String(d.modelKey||"")||String(d.provider||"")+"::"+String(d.model||"")||"\u672A\u77E5\u6A21\u578B";r[f]||(r[f]=Object.assign({key:f,provider:Yt(d.provider,60),model:Yt(d.model,120)||"\u672A\u77E5\u6A21\u578B"},Gs())),fr(r[f],d);let p=Yt(d.mode,20)||"agent";i[p]||(i[p]=Object.assign({mode:p},Gs())),fr(i[p],d);let h=String(d.day||hr(d.ts));a[h]||(a[h]=Object.assign({day:h,ts:ds(d.ts)},Gs())),fr(a[h],d)}let l=Object.keys(r).map(function(d){let f=pr(r[d]);return f.share=o.totalTokens>0?Number((f.totalTokens/o.totalTokens).toFixed(3)):0,f}).sort(function(d,f){return f.totalTokens!==d.totalTokens?f.totalTokens-d.totalTokens:String(d.key).localeCompare(String(f.key))}),c=Object.keys(i).map(function(d){return pr(i[d])}).sort(function(d,f){return f.totalTokens!==d.totalTokens?f.totalTokens-d.totalTokens:String(d.mode).localeCompare(String(f.mode))}),u=hy(a,Number(n.from)||0,Number(n.to)||0,Number(n.days)||0).map(function(d){return d.empty?d:pr(d)});return s.length?Object.assign(pr(o),{byModel:l,byMode:c,byDay:u}):{turns:0,requests:0,promptTokens:0,completionTokens:0,totalTokens:0,cachedTokens:0,estimatedTurns:0,partialTurns:0,hit:0,byModel:[],byMode:[],byDay:[]}}function gy(t){let e=Js.find(function(n){return n.key===String(t||"")});return e?e.label:Js[1].label}Id.exports={MONTHS_KEEP:Pd,MAX_FILL_DAYS:jd,RANGES:Js,dayOf:hr,monthOf:$s,startOfDay:ds,rangeOf:cy,rangeLabel:gy,row:uy,append:fy,read:py,monthFiles:ga,prune:Ld,aggregate:my}});var Bd=Q((jS,qd)=>{var He=require("fs"),yy=require("os"),Sn=require("path"),mr=Sn.join(yy.homedir(),".luban","attachments"),by=4,ps=5*1024*1024,wy=Math.ceil(ps*4/3)+64,ky=2e3,ya={"image/png":"png","image/jpeg":"jpg","image/webp":"webp","image/gif":"gif"},Nd={png:"image/png",jpg:"image/jpeg",webp:"image/webp",gif:"image/gif"},xy=/^[A-Za-z0-9_-]+$/,ba=/^[A-Za-z0-9_-]+\.[a-z]{3,4}$/,Sy=/^data:(image\/(?:png|jpeg|webp|gif));base64,([A-Za-z0-9+/=\s]+)$/;function Ys(t){return(t<10?"0":"")+t}function _y(t){let e=t||new Date;return e.getFullYear()+Ys(e.getMonth()+1)+Ys(e.getDate())+"-"+Ys(e.getHours())+Ys(e.getMinutes())+Ys(e.getSeconds())+"-"+Math.random().toString(36).slice(2,6)}function Fd(t){let e=Sy.exec(String(t??""));return e?{mime:e[1],b64:e[2].replace(/\s+/g,"")}:null}function Rd(t){if(!t||typeof t!="object")return null;let e=String(t.file==null?"":t.file);if(!ba.test(e)||e.length>120)return null;let n=String(t.mime==null?"":t.mime);if(!ya[n]||e.slice(e.lastIndexOf(".")+1)!==ya[n])return null;let s=Math.floor(Number(t.bytes));return!isFinite(s)||s<=0||s>ps?null:{file:e,mime:n,bytes:s}}function fs(t){let e=String(t??"");return xy.test(e)?Sn.join(mr,e):""}function vy(t,e){let n=fs(t);if(!n)return null;let s=String(e??"");if(s.length>wy)return null;let o=Fd(s);if(!o)return null;let r=Buffer.from(o.b64,"base64");if(!r.length||r.length>ps)return null;let i=_y()+"."+ya[o.mime];try{He.mkdirSync(n,{recursive:!0,mode:448});let a=Sn.join(n,i),l=a+".tmp-"+Math.random().toString(36).slice(2,6);return He.writeFileSync(l,r,{mode:384}),He.renameSync(l,a),{file:i,mime:o.mime,bytes:r.length}}catch{return null}}function Ty(t,e){let n=fs(t),s=Rd(e);if(!n||!s)return"";try{let o=Sn.join(n,s.file),r=He.statSync(o);return!r.isFile()||r.size<=0||r.size>ps?"":"data:"+s.mime+";base64,"+He.readFileSync(o).toString("base64")}catch{return""}}function My(t,e){let n=fs(t),s=String(e??"");if(!n)return{ok:!1,error:"bad_session"};if(!ba.test(s)||s.length>120)return{ok:!1,error:"bad_file"};let o=Nd[s.slice(s.lastIndexOf(".")+1)]||"";if(!o)return{ok:!1,error:"bad_file"};try{let r=Sn.join(n,s),i=He.statSync(r);return!i.isFile()||i.size<=0?{ok:!1,error:"missing"}:i.size>ps?{ok:!1,error:"too_large"}:{ok:!0,mime:o,dataUrl:"data:"+o+";base64,"+He.readFileSync(r).toString("base64")}}catch{return{ok:!1,error:"missing"}}}function Cy(t){let e=fs(t);if(!e)return{removed:0};let n=0;try{n=He.readdirSync(e).length}catch{n=0}try{He.rmSync(e,{recursive:!0,force:!0})}catch{}return{removed:n}}function Ay(t,e){let n=fs(t),s=fs(e);if(!n||!s||n===s)return{copied:0,failed:0};let o=[];try{o=He.readdirSync(n)}catch{return{copied:0,failed:0}}let r=0,i=0;try{He.mkdirSync(s,{recursive:!0,mode:448})}catch{return{copied:0,failed:0}}for(let a of o){let l=a.slice(a.lastIndexOf(".")+1);if(!ba.test(a)||a.length>120||!Nd[l])continue;let c=Sn.join(n,a),u=Sn.join(s,a);try{He.copyFileSync(c,u);try{He.chmodSync(u,384)}catch{}r++}catch{i++}}return{copied:r,failed:i}}function Ey(t){let e=t instanceof Set?t:new Set(t||[]),n=[];try{n=He.readdirSync(mr,{withFileTypes:!0})}catch{return{removed:0,kept:0}}let s=0,o=0;for(let r of n)if(r.isDirectory()){if(e.has(r.name)){o++;continue}try{He.rmSync(Sn.join(mr,r.name),{recursive:!0,force:!0}),s++}catch{o++}}return{removed:s,kept:o}}function Oy(t,e){let n=(e||[]).filter(function(o){return typeof o=="string"&&o.indexOf("data:image/")===0});if(!n.length)return t;let s=[];t!=null&&t!==""&&s.push({type:"text",text:String(t)});for(let o of n)s.push({type:"image_url",image_url:{url:o}});return s}qd.exports={ATTACH_DIR:mr,MAX_IMAGES:by,MAX_BYTES:ps,IMG_CHARS:ky,parseDataUrl:Fd,validateEntry:Rd,saveImage:vy,readDataUrl:Ty,readPreview:My,removeSession:Cy,copySession:Ay,sweepOrphans:Ey,toContent:Oy}});var Qd=Q((LS,Zd)=>{var eo=require("fs"),Py=require("net"),jy=require("os"),Wn=require("path"),Ly=require("http"),Wd=require("crypto"),{spawn:Iy,execSync:Dy}=require("child_process"),Kd=64*1024*1024,Hd=25e3,to=15e3,wa=200;function zd(){let t=process.env||{},e=[],n=function(s){s&&e.push(String(s))};if(process.platform==="win32"){let s=[t.PROGRAMFILES,t["PROGRAMFILES(X86)"],t.LOCALAPPDATA,t.ProgramW6432];for(let o of s)n(o&&Wn.join(o,"Google","Chrome","Application","chrome.exe")),n(o&&Wn.join(o,"Microsoft","Edge","Application","msedge.exe")),n(o&&Wn.join(o,"Chromium","Application","chrome.exe"))}else if(process.platform==="darwin")n("/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),n("/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge"),n("/Applications/Chromium.app/Contents/MacOS/Chromium"),n("/Applications/Brave Browser.app/Contents/MacOS/Brave Browser");else{let s=["google-chrome","google-chrome-stable","chromium","chromium-browser","microsoft-edge","brave-browser"],o=String(t.PATH||"").split(Wn.delimiter).filter(Boolean);for(let r of o)for(let i of s)n(Wn.join(r,i))}return e}function Gd(t){let e=String(t??(process.env&&process.env.LUBAN_CHROME_PATH||"")).trim();if(e){try{if(eo.existsSync(e))return{path:e,tried:[e]}}catch{}return{path:"",tried:[e]}}let n=zd();for(let s of n)try{if(eo.existsSync(s))return{path:s,tried:n}}catch{}return{path:"",tried:n}}function Jd(t,e){let n=Buffer.isBuffer(e)?e:Buffer.from(String(e??""),"utf8"),s=n.length,o;s<126?(o=Buffer.alloc(2),o[1]=128|s):s<65536?(o=Buffer.alloc(4),o[1]=254,o.writeUInt16BE(s,2)):(o=Buffer.alloc(10),o[1]=255,o.writeUInt32BE(Math.floor(s/4294967296),2),o.writeUInt32BE(s%4294967296,6)),o[0]=128|t&15;let r=Wd.randomBytes(4),i=Buffer.allocUnsafe(s);for(let a=0;a<s;a++)i[a]=n[a]^r[a%4];return Buffer.concat([o,r,i])}function $d(t){let e=Buffer.isBuffer(t)?t:Buffer.alloc(0);if(e.length<2)return null;let n=(e[0]&128)!==0,s=e[0]&15,o=(e[1]&128)!==0,r=e[1]&127,i=2;if(r===126){if(e.length<4)return null;r=e.readUInt16BE(2),i=4}else if(r===127){if(e.length<10)return null;let u=e.readUInt32BE(2),d=e.readUInt32BE(6);r=u*4294967296+d,i=10}if(r>Kd)throw new Error("WebSocket \u5E27\u8FC7\u5927\uFF08"+r+" \u5B57\u8282\uFF09");let a=o?4:0,l=i+a+r;if(e.length<l)return null;let c=e.subarray(i+a,l);if(o){let u=e.subarray(i,i+4),d=Buffer.allocUnsafe(r);for(let f=0;f<r;f++)d[f]=c[f]^u[f%4];c=d}return{fin:n,opcode:s,payload:c,rest:e.subarray(l)}}var ka=class{constructor(e){this.socket=e,this.buf=Buffer.alloc(0),this.frag=[],this.fragOpcode=0,this.closed=!1,this.onmessage=null,this.onclose=null,e.on("data",n=>this._feed(n)),e.on("error",()=>this._closed()),e.on("close",()=>this._closed())}_closed(){if(!this.closed&&(this.closed=!0,typeof this.onclose=="function"))try{this.onclose()}catch{}}_feed(e){for(this.buf=this.buf.length?Buffer.concat([this.buf,e]):e;;){let n;try{n=$d(this.buf)}catch{this.destroy();return}if(!n||(this.buf=n.rest,this._frame(n.fin,n.opcode,n.payload),this.closed))return}}_frame(e,n,s){if(n===9){this._write(10,s);return}if(n!==10){if(n===8){this.destroy();return}if(n===0){if(this.frag.push(s),!e)return;let o=Buffer.concat(this.frag),r=this.fragOpcode;if(this.frag=[],this.fragOpcode=0,r===1&&typeof this.onmessage=="function")try{this.onmessage(o.toString("utf8"))}catch{}return}if(!e){this.fragOpcode=n,this.frag=[s];return}if(n===1&&typeof this.onmessage=="function")try{this.onmessage(s.toString("utf8"))}catch{}}}_write(e,n){if(!(this.closed||!this.socket.writable))try{this.socket.write(Jd(e,n))}catch{this.destroy()}}send(e){this._write(1,Buffer.from(String(e??""),"utf8"))}destroy(){if(!this.closed){try{this.socket.destroy()}catch{}if(this.closed=!0,typeof this.onclose=="function")try{this.onclose()}catch{}}}};function Ny(t,e){return new Promise(function(n,s){let o;try{o=new URL(String(t))}catch{s(new Error("WebSocket \u5730\u5740\u4E0D\u5408\u6CD5\uFF1A"+t));return}let r=Number(o.port)||(o.protocol==="wss:"?443:80),i=Wd.randomBytes(16).toString("base64"),a=Py.connect({host:o.hostname,port:r}),l=!1,c=setTimeout(function(){if(!l){l=!0;try{a.destroy()}catch{}s(new Error("\u8FDE\u63A5 CDP WebSocket \u8D85\u65F6\uFF08"+(e||to)+"ms\uFF09"))}},e||to),u=Buffer.alloc(0);a.on("connect",function(){let f=["GET "+(o.pathname+(o.search||""))+" HTTP/1.1","Host: "+o.hostname+":"+r,"Upgrade: websocket","Connection: Upgrade","Sec-WebSocket-Key: "+i,"Sec-WebSocket-Version: 13"];a.write(f.join(`\r
|
|
165
|
+
`)+`\r
|
|
166
|
+
\r
|
|
167
|
+
`)});let d=function(f){u=Buffer.concat([u,f]);let p=u.indexOf(`\r
|
|
168
|
+
\r
|
|
169
|
+
`);if(p<0){u.length>65536&&(l=!0,clearTimeout(c),a.destroy(),s(new Error("CDP \u63E1\u624B\u54CD\u5E94\u5F02\u5E38\uFF08\u5934\u90E8\u8FC7\u957F\uFF09")));return}a.removeListener("data",d);let h=u.slice(0,p).toString("utf8");if(h.indexOf(" 101 ")<0){l=!0,clearTimeout(c),a.destroy(),s(new Error("CDP WebSocket \u63E1\u624B\u88AB\u62D2\u7EDD\uFF1A"+h.split(`\r
|
|
170
|
+
`)[0]));return}l=!0,clearTimeout(c);let m=new ka(a),x=u.slice(p+4);x.length&&m._feed(x),n(m)};a.on("data",d),a.on("error",function(f){l||(l=!0,clearTimeout(c),s(new Error("\u8FDE\u63A5 CDP \u5931\u8D25\uFF1A"+(f&&f.message?f.message:f))))})})}var xa=class{constructor(e){this.ws=e,this.seq=0,this.pending=new Map,this.listeners=[];let n=this;e.onmessage=function(s){n._onText(s)},e.onclose=function(){n._failAll("CDP \u8FDE\u63A5\u5DF2\u65AD\u5F00")}}_onText(e){let n;try{n=JSON.parse(e)}catch{return}if(!(!n||typeof n!="object")){if(n.id!=null){let s=this.pending.get(n.id);if(!s)return;this.pending.delete(n.id),clearTimeout(s.timer),n.error?s.reject(new Error((n.error.message||"CDP \u8C03\u7528\u5931\u8D25")+" ("+n.method+")")):s.resolve(n.result||{});return}if(n.method)for(let s of this.listeners)try{s(n.method,n.params||{})}catch{}}}_failAll(e){for(let n of this.pending.values()){clearTimeout(n.timer);try{n.reject(new Error(e))}catch{}}this.pending.clear()}on(e){let n=this;return this.listeners.push(e),function(){let s=n.listeners.indexOf(e);s>=0&&n.listeners.splice(s,1)}}send(e,n,s){let o=++this.seq,r=this;return new Promise(function(i,a){if(r.ws.closed){a(new Error("CDP \u8FDE\u63A5\u5DF2\u65AD\u5F00"));return}let l=setTimeout(function(){r.pending.delete(o),a(new Error("CDP \u8C03\u7528\u8D85\u65F6\uFF1A"+e))},s||to);r.pending.set(o,{resolve:i,reject:a,timer:l,method:e});try{r.ws.send(JSON.stringify({id:o,method:e,params:n||{}}))}catch(c){clearTimeout(l),r.pending.delete(o),a(c)}})}close(){try{this.ws.destroy()}catch{}}};function Fy(t){let e=Wn.join(t,"DevToolsActivePort"),n="";try{n=eo.readFileSync(e,"utf8")}catch{return null}let s=String(n).split(/\r?\n/),o=Number(s[0]);return!isFinite(o)||o<=0?null:{port:o,browserPath:s[1]||""}}function Qs(t){return new Promise(function(e){setTimeout(e,t)})}function Ry(t,e,n){return new Promise(function(s,o){let r=Ly.request({host:"127.0.0.1",port:t,path:e,method:n||"GET",headers:{Host:"127.0.0.1:"+t,Accept:"application/json"},timeout:5e3},function(i){let a="";i.setEncoding("utf8"),i.on("data",function(l){a+=l}),i.on("end",function(){if(i.statusCode<200||i.statusCode>=300){o(new Error("CDP HTTP "+e+" \u8FD4\u56DE "+i.statusCode));return}try{s(JSON.parse(a||"{}"))}catch{o(new Error("CDP HTTP "+e+" \u8FD4\u56DE\u7684\u4E0D\u662F JSON"))}})});r.on("timeout",function(){r.destroy(new Error("CDP HTTP \u8D85\u65F6\uFF1A"+e))}),r.on("error",o),r.end()})}function Zs(t){if(!t||t.killed)return;let e=t.pid;try{if(process.platform==="win32")Dy("taskkill /PID "+e+" /T /F",{stdio:"ignore",timeout:5e3});else try{process.kill(-e,"SIGKILL")}catch{try{t.kill("SIGKILL")}catch{}}}catch{}}function gr(t){try{eo.rmSync(t,{recursive:!0,force:!0})}catch{}}var qy={StaticText:1,InlineTextBox:1,generic:1,none:1,RootWebArea:1},By={ignored:1,presentation:1,LineBreak:1},Sa=class{constructor(e){this.proc=e.proc,this.dir=e.dir,this.exe=e.exe,this.port=e.port,this.cdp=e.cdp,this.width=e.width||1280,this.height=e.height||800,this.events=[],this.reqUrls=new Map,this.url="",this.title="",this.closed=!1,this._bindEvents()}_record(e){this.events.push(e),this.events.length>wa&&this.events.splice(0,this.events.length-wa)}resetEvents(){this.events.length=0,this.reqUrls.clear()}_bindEvents(){let e=this;this.cdp.on(function(n,s){if(n==="Runtime.consoleAPICalled"){let r=(Array.isArray(s.args)?s.args:[]).map(function(i){return!i||typeof i!="object"?"":i.value!==void 0?String(i.value):i.unserializableValue!=null?String(i.unserializableValue):String(i.description==null?i.type||"":i.description)}).join(" ");e._record({kind:"console",level:String(s.type||"log"),text:r.slice(0,2e3),at:Date.now()})}else if(n==="Runtime.exceptionThrown"){let o=s.exceptionDetails||{},r=o.exception||{},i=String(r.description||o.text||"\u672A\u6355\u83B7\u5F02\u5E38");e._record({kind:"console",level:"error",text:("\u672A\u6355\u83B7\u5F02\u5E38\uFF1A"+i).slice(0,2e3),at:Date.now()})}else if(n==="Log.entryAdded"){let o=s.entry||{};e._record({kind:"console",level:String(o.level||"info"),text:String(o.text||"").slice(0,2e3),url:String(o.url||""),at:Date.now()})}else if(n==="Network.requestWillBeSent"){let o=s.request||{};if(e.reqUrls.set(String(s.requestId||""),String(o.url||"")),e.reqUrls.size>500){let r=e.reqUrls.keys().next().value;e.reqUrls.delete(r)}}else if(n==="Network.responseReceived"){let o=s.response||{},r=Number(o.status);isFinite(r)&&r>=400&&e._record({kind:"network",level:"http",status:r,text:r+" "+String(o.url||""),at:Date.now()})}else if(n==="Network.loadingFailed"){if(s.canceled)return;let o=e.reqUrls.get(String(s.requestId||""))||"";e._record({kind:"network",level:"fail",text:String(s.errorText||"\u52A0\u8F7D\u5931\u8D25")+" "+o,at:Date.now()})}else n==="Page.frameNavigated"&&s.frame&&!s.frame.parentId&&(e.url=String(s.frame.url||e.url))})}async init(){await this.cdp.send("Page.enable"),await this.cdp.send("Runtime.enable"),await this.cdp.send("Network.enable"),await this.cdp.send("Log.enable").catch(function(){}),await this.cdp.send("Accessibility.enable").catch(function(){}),await this.setViewport(this.width,this.height)}async setViewport(e,n){let s=Math.max(320,Math.min(4096,Math.floor(Number(e)||this.width))),o=Math.max(240,Math.min(4096,Math.floor(Number(n)||this.height)));this.width=s,this.height=o,await this.cdp.send("Emulation.setDeviceMetricsOverride",{width:s,height:o,deviceScaleFactor:1,mobile:!1})}expectEvent(e,n){let s=this.cdp,o=!1,r=null,i=null;return{promise:new Promise(function(l){i=setTimeout(function(){o||(o=!0,r&&r(),l(!1))},n||to),r=s.on(function(c){o||c!==e||(o=!0,clearTimeout(i),r&&r(),l(!0))})}),cancel:function(){o||(o=!0,i&&clearTimeout(i),r&&r())}}}waitEvent(e,n){return this.expectEvent(e,n).promise}async navigate(e){let n=Yd(e);this.resetEvents();let s=this.expectEvent("Page.loadEventFired",2e4),o;try{o=await this.cdp.send("Page.navigate",{url:n},2e4)}catch(l){throw s.cancel(),l}if(o&&o.errorText)throw s.cancel(),new Error("\u5BFC\u822A\u5931\u8D25\uFF1A"+o.errorText);let r=await s.promise,i=await this.pageInfo();this.url=i.url||n,this.title=i.title||"";let a=["\u5DF2\u6253\u5F00\uFF1A"+this.shortUrl()];return this.title&&a.push("\u6807\u9898\uFF1A"+this.title),r||a.push("\uFF08\u7B49\u5F85 load \u4E8B\u4EF6\u8D85\u65F6\uFF0C\u9875\u9762\u53EF\u80FD\u8FD8\u5728\u52A0\u8F7D\uFF1B\u53EF\u7528 snapshot \u518D\u770B\u4E00\u6B21\uFF09"),a.join(`
|
|
171
|
+
`)}shortUrl(){let e=String(this.url||"");return e.length>200?e.slice(0,200)+"\u2026":e}async pageInfo(){try{let e=await this.cdp.send("Runtime.evaluate",{expression:"({url: location.href, title: document.title})",returnByValue:!0},8e3),n=e&&e.result&&e.result.value||{};return{url:String(n.url||""),title:String(n.title||"")}}catch{return{url:this.url,title:this.title}}}async snapshot(e){let n=isFinite(Number(e))&&Number(e)>200?Math.min(2e4,Math.floor(Number(e))):6e3,s=await this.pageInfo();this.url=s.url||this.url,this.title=s.title||this.title;let o="",r=function(a){return String(a||"").split(`
|
|
172
|
+
`).filter(function(l){return l.trim()}).length};for(let a=0;a<2;a++){try{let l=await this.cdp.send("Accessibility.getFullAXTree",{},15e3);o=Vd(l&&l.nodes,n-600)}catch{o=""}if(r(o)>=3)break;a===0&&await Qs(250)}if(r(o)<3){let a=await this.visibleText(n-600);a.trim()&&(o=(o.trim()?o.trim()+`
|
|
173
|
+
|
|
174
|
+
`:"")+a)}let i=["\u9875\u9762\uFF1A"+(this.shortUrl()||"(\u672A\u77E5)")+(this.title?" | \u6807\u9898\uFF1A"+this.title:"")];return o.trim()||(o="(\u6CA1\u6709\u53EF\u8BFB\u5185\u5BB9\uFF1A\u9875\u9762\u53EF\u80FD\u662F\u7A7A\u767D\uFF0C\u6216\u5185\u5BB9\u7531 canvas / \u56FE\u7247\u6784\u6210)"),i.join(`
|
|
175
|
+
`)+`
|
|
176
|
+
`+o}async visibleText(e){try{let n=await this.cdp.send("Runtime.evaluate",{expression:'(document.body && document.body.innerText || "").slice(0, 20000)',returnByValue:!0},1e4),s=String(n&&n.result&&n.result.value||"").replace(/\n{3,}/g,`
|
|
177
|
+
|
|
178
|
+
`).trim();return Xd(`\u53EF\u89C1\u6587\u672C\uFF1A
|
|
179
|
+
`+s,e)}catch{return""}}async screenshot(e){let n=e||{},s={format:"jpeg",quality:60};if(n.fullPage){let i=await this.cdp.send("Page.getLayoutMetrics",{},1e4).catch(function(){return null}),a=i&&(i.cssContentSize||i.contentSize);a&&a.width>0&&a.height>0&&(s.captureBeyondViewport=!0,s.clip={x:0,y:0,width:Math.min(4096,Math.ceil(a.width)),height:Math.min(8e3,Math.ceil(a.height)),scale:1})}let o=await this.cdp.send("Page.captureScreenshot",s,25e3),r=String(o&&o.data||"");if(r.length>4e5&&!n.fullPage&&(s.quality=40,o=await this.cdp.send("Page.captureScreenshot",s,25e3),r=String(o&&o.data||"")),!r)throw new Error("\u622A\u56FE\u5931\u8D25\uFF1ACDP \u6CA1\u6709\u8FD4\u56DE\u56FE\u50CF\u6570\u636E");return"data:image/jpeg;base64,"+r}consoleEntries(e){let n=Ud(e,20);return this.events.filter(function(s){return s.kind==="console"}).slice(-n)}networkEntries(e){let n=Ud(e,20);return this.events.filter(function(s){return s.kind==="network"}).slice(-n)}async close(){if(!this.closed){this.closed=!0;try{await this.cdp.send("Browser.close",{},3e3)}catch{}this.cdp.close(),await Qs(300),Zs(this.proc),gr(this.dir)}}};function Ud(t,e){let n=Math.floor(Number(t));return!isFinite(n)||n<=0?e:Math.min(200,n)}function Xd(t,e){let n=String(t??""),s=isFinite(Number(e))&&Number(e)>100?Math.floor(Number(e)):6e3;return n.length<=s?n:n.slice(0,s)+`
|
|
180
|
+
\u2026[\u5DF2\u622A\u65AD\uFF0C\u5171 `+n.length+" \u5B57\u7B26\uFF1B\u53EF\u7528 maxChars \u653E\u5BBD\uFF0C\u6216\u622A\u56FE\u770B\u5168\u8C8C]"}function Vd(t,e){let n=Array.isArray(t)?t:[];if(!n.length)return"";let s=new Map;for(let c of n)c&&c.nodeId&&s.set(c.nodeId,c);let o=null;for(let c of n)if(!(!c||c.ignored)&&!c.parentId){o=c;break}o||(o=n.find(function(c){return!c.ignored})||n[0]);let r=[],i=0,a=isFinite(Number(e))&&Number(e)>200?Number(e):5400,l=function(c,u,d){if(!c||u>40||i>=a)return;let f=String(c.role&&c.role.value||""),p=c.ignored===!0||By[f]===1,h=String(c.name&&c.name.value||"").replace(/\s+/g," ").trim(),m=d;if(!p){let b=String(c.value&&c.value.value||"").replace(/\s+/g," ").trim(),k="";if(f==="StaticText"||f==="InlineTextBox")h&&h!==d&&(k=h);else if(qy[f]===1)h&&(k=h);else{let S=[];f&&S.push(f),h&&S.push(JSON.stringify(h)),b&&b!==h&&S.push("value="+JSON.stringify(b)),k=S.join(" ")}if(k){let S=new Array(u+1).join(" ")+k;if(i+S.length>a){r.push("\u2026[\u5927\u7EB2\u5DF2\u622A\u65AD\uFF0C\u5171 "+r.length+" \u884C\uFF1B\u53EF\u7528 maxChars \u653E\u5BBD]"),i=a;return}r.push(S),i+=S.length+1}m=h||d}let x=Array.isArray(c.childIds)?c.childIds:[];for(let b of x){if(i>=a)return;l(s.get(b),u+1,m)}};return l(o,0,""),r.join(`
|
|
181
|
+
`)}function Yd(t){let e=String(t??"").trim();if(!e)throw new Error("\u7F3A\u5C11 url \u53C2\u6570");if(/^(localhost|127\.0\.0\.1|\[::1\])(:\d+)?(\/|$)/i.test(e))return"http://"+e;if(/^[\w.-]+\.[a-z]{2,}(:\d+)?(\/|$)/i.test(e))return"https://"+e;if(!/^[a-z][a-z0-9+.-]*:/i.test(e))throw new Error("url \u5FC5\u987B\u662F\u5B8C\u6574\u5730\u5740\uFF08http:// / https:// / file:// / data:\uFF09\uFF1A"+e);let n=e.slice(0,e.indexOf(":")).toLowerCase();if((n==="javascript"||n==="chrome"||n==="chrome-extension"||n==="devtools"||n==="about")&&n!=="about")throw new Error("\u4E0D\u5141\u8BB8\u6253\u5F00 "+n+": \u9875\u9762");if(["http","https","file","data","about","blob"].indexOf(n)<0)throw new Error("\u4E0D\u652F\u6301\u7684\u534F\u8BAE\uFF1A"+n+"\uFF08\u53EA\u5141\u8BB8 http / https / file / data / about\uFF09");return e}async function Uy(t){let e=t||{},n=Gd(e.exe);if(!n.path){let b=n.tried.slice(0,6).map(function(k){return" - "+k}).join(`
|
|
182
|
+
`);throw new Error(`\u6CA1\u627E\u5230 Chrome / Edge\u3002\u88C5\u4E0A Chrome\uFF0C\u6216\u5728\u8BBE\u7F6E\u91CC\u6307\u5B9A luban.browser.chromePath\u3002
|
|
183
|
+
\u5DF2\u5C1D\u8BD5\uFF1A
|
|
184
|
+
`+b)}let s=eo.mkdtempSync(Wn.join(jy.tmpdir(),"luban-chrome-")),o=Math.max(320,Math.min(4096,Math.floor(Number(e.width)||1280))),r=Math.max(240,Math.min(4096,Math.floor(Number(e.height)||800))),i=e.headless===!1?"":"--headless=new",a=["--remote-debugging-port=0","--user-data-dir="+s,"--remote-allow-origins=*","--no-first-run","--no-default-browser-check","--disable-background-networking","--disable-component-update","--disable-sync","--disable-extensions","--disable-default-apps","--disable-dev-shm-usage","--disable-gpu","--window-size="+o+","+r];i&&a.push(i);let l=null,c=0,u=async function(b){l=Iy(n.path,b.concat(["about:blank"]),{stdio:["ignore","ignore","pipe"],windowsHide:!0,detached:process.platform!=="win32"});let k="";l.stderr&&(l.stderr.setEncoding("utf8"),l.stderr.on("data",function(g){k.length<4e3&&(k+=g)}));let S=!1;l.on("exit",function(){S=!0});let T=Date.now()+(e.timeoutMs||Hd);for(;Date.now()<T&&!S;){let g=Fy(s);if(g)return{port:g.port,stderr:k};await Qs(200)}return{port:0,stderr:k,exited:S}},d=await u(a);if(!d.port&&i==="--headless=new"){Zs(l),await Qs(300);let b=a.filter(function(k){return k!=="--headless=new"}).concat(["--headless"]);d=await u(b)}if(!d.port){Zs(l),gr(s);let b=d.stderr?`
|
|
185
|
+
\u6D4F\u89C8\u5668\u8F93\u51FA\uFF1A`+d.stderr.trim().slice(0,800):"";throw new Error("\u6D4F\u89C8\u5668\u542F\u52A8\u5931\u8D25\uFF08\u6CA1\u7B49\u5230\u8C03\u8BD5\u7AEF\u53E3\uFF09\u3002"+b)}c=d.port;let f=null,p=Date.now()+1e4;for(;Date.now()<p;){let b=[];try{b=await Ry(c,"/json/list")}catch{b=[]}if(Array.isArray(b)&&(f=b.find(function(k){return k&&k.type==="page"&&k.webSocketDebuggerUrl}),f))break;await Qs(200)}if(!f)throw Zs(l),gr(s),new Error("\u6D4F\u89C8\u5668\u8D77\u6765\u4E86\uFF0C\u4F46\u6CA1\u627E\u5230\u53EF\u7528\u7684\u9875\u9762\uFF08/json/list \u4E3A\u7A7A\uFF09");let h;try{h=await Ny(f.webSocketDebuggerUrl,15e3)}catch(b){throw Zs(l),gr(s),b}let m=new xa(h),x=new Sa({proc:l,dir:s,exe:n.path,port:c,cdp:m,width:o,height:r});try{await x.init()}catch(b){throw await x.close(),new Error("\u6D4F\u89C8\u5668\u5DF2\u542F\u52A8\uFF0C\u4F46\u521D\u59CB\u5316 CDP \u57DF\u5931\u8D25\uFF1A"+(b&&b.message?b.message:b))}return x}Zd.exports={findChrome:Gd,chromeCandidates:zd,normalizeUrl:Yd,formatAxTree:Vd,clipText:Xd,encodeFrame:Jd,decodeFrame:$d,launch:Uy,MAX_FRAME:Kd,EVENTS_MAX:wa,DEFAULT_TIMEOUT_MS:to,LAUNCH_TIMEOUT_MS:Hd}});var Ta=Q((IS,rf)=>{var Hn=require("fs"),Wy=require("os"),va=require("path"),Ky=2048,no=va.join(Wy.tmpdir(),"luban-computer"),Hy=30*60*1e3,zy=40;function Kn(t,e){let n=Number(t);return isFinite(n)?Math.round(n):e}function Gy(t,e,n){let s=Number(t);return isFinite(s)?Math.max(e,Math.min(n,Math.round(s))):e}function Jy(t){if(t==null||t==="")return null;let e=t;if(typeof t=="string"){let o=t.split(/[,\s]+/).map(function(r){return Number(r)});if(o.length!==4||o.some(function(r){return!isFinite(r)}))throw new Error('region \u683C\u5F0F\u5E94\u4E3A "x,y,\u5BBD,\u9AD8"\uFF08\u5C4F\u5E55\u5750\u6807\uFF09\u6216 { x, y, width, height }');e={x:o[0],y:o[1],width:o[2],height:o[3]}}let n=Kn(e.width!=null?e.width:e.w,0),s=Kn(e.height!=null?e.height:e.h,0);if(n<=0||s<=0)throw new Error("region \u7684\u5BBD / \u9AD8\u5FC5\u987B\u5927\u4E8E 0");return{x:Kn(e.x,0),y:Kn(e.y,0),width:n,height:s}}function $y(t,e){if(!e)return null;let n=0,s=1/0,o=1/0,r=-1/0,i=-1/0;if((t||[]).forEach(function(c){let u=Math.max(e.x,c.x),d=Math.max(e.y,c.y),f=Math.min(e.x+e.width,c.x+c.width),p=Math.min(e.y+e.height,c.y+c.height);f<=u||p<=d||(n++,u<s&&(s=u),d<o&&(o=d),f>r&&(r=f),p>i&&(i=p))}),!n)return null;let a={x:s,y:o,width:r-s,height:i-o},l=a.x!==e.x||a.y!==e.y||a.width!==e.width||a.height!==e.height;return{region:a,requested:e,clipped:l}}var _n=null;function Xy(){return _n?Object.assign({},_n):null}function Vy(t){_n=t}function Yy(t,e,n){return t.some(function(s){return e>=s.x&&e<=s.x+s.width&&n>=s.y&&n<=s.y+s.height})}function Zy(t,e,n){let s=n||{},o=Kn(t,NaN),r=Kn(e,NaN);if(!isFinite(o)||!isFinite(r))throw new Error("\u9700\u8981\u6570\u503C\u5750\u6807 x / y\uFF08\u5C4F\u5E55\u5750\u6807\uFF09");if(!s.imageCoords)return{x:o,y:r};if(!_n)throw new Error("imageCoords=true \u9700\u8981\u5148\u622A\u4E00\u5F20\u56FE\uFF08\u8FD8\u4E0D\u77E5\u9053\u6362\u7B97\u500D\u7387\uFF09");return{x:Math.round(_n.originX+o*_n.ratio),y:Math.round(_n.originY+r*_n.ratio)}}function Qy(t){return new Promise(function(e,n){let s=null;try{s=Hn.openSync(t,"r");let o=Buffer.alloc(262144),r=Hn.readSync(s,o,0,o.length,0),i=o.subarray(0,r);if(i.length>24&&i[0]===137&&i[1]===80){e({width:i.readUInt32BE(16),height:i.readUInt32BE(20)});return}let a=2;for(;a+9<i.length;){if(i[a]!==255){a++;continue}let l=i[a+1];if(l===216||l===1||l>=208&&l<=215){a+=2;continue}let c=i.readUInt16BE(a+2);if(l>=192&&l<=207&&l!==196&&l!==200&&l!==204){e({height:i.readUInt16BE(a+5),width:i.readUInt16BE(a+7)});return}a+=2+c}n(new Error("\u8BFB\u4E0D\u51FA\u56FE\u7247\u5C3A\u5BF8\uFF08\u4E0D\u662F JPEG / PNG \u5934\uFF09"))}catch(o){n(new Error("\u8BFB\u4E0D\u51FA\u56FE\u7247\u5C3A\u5BF8\uFF1A"+o.message))}finally{if(s!=null)try{Hn.closeSync(s)}catch{}}})}function ef(){try{Hn.mkdirSync(no,{recursive:!0})}catch{}}function tf(){try{let t=Hn.readdirSync(no),e=[];for(let s of t){if(!/\.(jpg|png)$/.test(s))continue;let o=va.join(no,s);try{e.push({p:o,t:Hn.statSync(o).mtimeMs})}catch{}}let n=Date.now();e.sort(function(s,o){return o.t-s.t}),e.forEach(function(s,o){if(o>=zy||n-s.t>Hy)try{Hn.unlinkSync(s.p)}catch{}})}catch{}}function eb(t){ef(),tf();let e="cu-"+Date.now()+"-"+Math.random().toString(36).slice(2,8)+"."+(t||"jpg");return va.join(no,e)}function nf(t){return Math.round(t.width)+"\xD7"+Math.round(t.height)}function tb(t){return(t||[]).map(function(e){return"["+Math.round(e.x)+","+Math.round(e.y)+" "+Math.round(e.width)+"\xD7"+Math.round(e.height)+"]"}).join(" ")||"(\u65E0)"}function _a(t){let e=Math.round(Number(t)||0);return(e<0?"-":"+")+Math.abs(e)}var sf={short:"\u70B9",long:"\u5C4F\u5E55\u903B\u8F91\u70B9",mid:"\u5C4F\u5E55\u70B9"};function nb(t,e){let n=e||sf,s=[],o=t.region?"\u533A\u57DF "+t.region.x+","+t.region.y+" "+Math.round(t.region.width)+"\xD7"+Math.round(t.region.height):"\u5C4F\u5E55 "+(t.screen.index+1)+"\uFF08"+nf(t.screen)+" "+n.short+"\uFF09";if(s.push("\u684C\u9762\u622A\u56FE\uFF1A"+o+"\uFF1B\u56FE\u7247 "+t.width+"\xD7"+t.height+" \u50CF\u7D20\u3002"),t.clipped&&t.requestedRegion){let r=t.requestedRegion;s.push("\u6CE8\u610F\uFF1A\u8BF7\u6C42\u7684\u533A\u57DF "+r.x+","+r.y+" "+Math.round(r.width)+"\xD7"+Math.round(r.height)+" \u8D85\u51FA\u5C4F\u5E55\uFF0C\u53EA\u622A\u5230\u4E86\u4E0A\u9762\u8FD9\u5757\uFF08\u8D8A\u754C\u90E8\u5206\u88AB\u7CFB\u7EDF\u88C1\u6389\uFF0C\u539F\u70B9\u4E0E\u500D\u7387\u5DF2\u6309\u5B9E\u9645\u533A\u57DF\u6821\u6B63\uFF09\u3002")}return t.displayIgnored&&s.push("\u6CE8\u610F\uFF1A\u540C\u65F6\u7ED9\u4E86 display \u4E0E region \u2014\u2014 \u622A\u533A\u57DF\u8D70\u7684\u662F region \u7684\u5168\u5C40\u5750\u6807\uFF0Cdisplay "+t.displayIgnored+" \u5DF2\u5FFD\u7565\uFF08\u533A\u57DF\u843D\u5728\u54EA\u5757\u5C4F\u5C31\u662F\u54EA\u5757\uFF09\u3002\u53EA\u6309\u5C4F\u5E55\u622A\u5C31\u53BB\u6389 region\u3002"),Math.abs(t.ratio-1)<.01?s.push("\u5750\u6807\uFF1A\u56FE\u7247\u50CF\u7D20 = "+n.long+"\uFF081:1\uFF09\uFF0C\u76F4\u63A5\u7528\u56FE\u4E0A\u8BFB\u5230\u7684 (x, y) \u8C03 click / move\u3002"):s.push("\u5750\u6807\uFF1A\u56FE\u7247\u88AB\u538B\u8FC7\uFF0C"+n.mid+" = \u56FE\u4E0A\u50CF\u7D20 \xD7 "+t.ratio.toFixed(2)+"\uFF08\u539F\u70B9\u504F\u79FB x"+_a(t.originX)+" y"+_a(t.originY)+"\uFF09\uFF1B\u4E5F\u53EF\u4EE5\u76F4\u63A5\u4F20 imageCoords=true \u8BA9\u5DE5\u5177\u6362\u7B97\u3002"),(t.region||t.originX||t.originY)&&s.push("\u539F\u70B9\uFF1A\u8FD9\u5F20\u56FE\u7684\u5DE6\u4E0A\u89D2\u662F\u5C4F\u5E55\u5750\u6807 ("+Math.round(t.originX)+", "+Math.round(t.originY)+")\u3002"),s.join(`
|
|
186
|
+
`)}function sb(t,e,n,s,o){let r=s||sf,i=(t||[]).filter(function(u){return u&&String(u.t||"").trim()});i.sort(function(u,d){return Math.abs(u.y-d.y)>8?u.y-d.y:u.x-d.x});let a=[],l=new Set;for(let u of i){let d=String(u.t).replace(/\s+/g," ").trim();if(!d)continue;let f=Math.round(e.originX+u.x*e.ratio),p=Math.round(e.originY+u.y*e.ratio),h=f+","+p+","+d;l.has(h)||(l.add(h),a.push("["+f+","+p+"] "+d))}let c="\u5C4F\u5E55\u6587\u5B57\uFF08"+a.length+" \u884C\uFF1B\u4E2D\u62EC\u53F7\u91CC\u662F"+r.long+"\u5750\u6807\uFF0C\u70B9\u6587\u5B57\u7528 x+\u5BBD/2 \u4F30\u7B97\u5373\u53EF\uFF09\uFF1A";return a.length?of(c+`
|
|
187
|
+
`+a.join(`
|
|
188
|
+
`),n):c+`
|
|
189
|
+
\uFF08\u6CA1\u6709\u8BC6\u522B\u5230\u6587\u5B57\uFF1A`+(o||"\u53EF\u80FD\u662F\u7EAF\u56FE\u5F62\u754C\u9762\uFF0C\u6216\u6CA1\u6388\u6743\u300C\u5C4F\u5E55\u5F55\u5236\u300D\u5BFC\u81F4\u622A\u56FE\u5168\u9ED1\uFF09")}function of(t,e){let n=String(t??""),s=isFinite(Number(e))&&Number(e)>100?Math.floor(Number(e)):6e3;return n.length<=s?n:n.slice(0,s)+`
|
|
190
|
+
\u2026[\u5DF2\u622A\u65AD\uFF0C\u5171 `+n.length+" \u5B57\u7B26\uFF1B\u53EF\u8C03\u5927 maxChars \u6216\u4F20 region \u53EA\u770B\u4E00\u5757]"}rf.exports={num:Kn,clamp:Gy,parseRegion:Jy,clampRegion:$y,imageSize:Qy,lastShotInfo:Xy,setLastShot:Vy,pointOnScreen:Yy,toScreenPoint:Zy,fmtSize:nf,screenListDesc:tb,signed:_a,describeShot:nb,formatOcr:sb,clipText:of,ensureTmpDir:ef,pruneTmp:tf,tmpFile:eb,DEFAULT_MAX_WIDTH:Ky,TMP_DIR:no}});var vf=Q((DS,_f)=>{var ob=require("crypto"),ot=require("fs"),lf=require("os"),so=require("path"),{execFile:rb,spawn:ib}=require("child_process"),ab=Ta(),{num:yr,clamp:ms,parseRegion:cf,clampRegion:uf,imageSize:df,lastShotInfo:lb,setLastShot:cb,pointOnScreen:ff,toScreenPoint:gs,fmtSize:ub,screenListDesc:Aa,signed:db,describeShot:fb,formatOcr:pf,clipText:pb,ensureTmpDir:hb,pruneTmp:mb,tmpFile:hf,DEFAULT_MAX_WIDTH:mf,TMP_DIR:gb}=ab,yb=process.platform==="win32",bb=6e4,af=2e4,wb=3e4,Ea={short:"\u50CF\u7D20",long:"\u5C4F\u5E55\u7269\u7406\u50CF\u7D20",mid:"\u5C4F\u5E55\u50CF\u7D20"},Oa=`using System;
|
|
191
|
+
using System.Collections.Generic;
|
|
192
|
+
using System.Drawing;
|
|
193
|
+
using System.Drawing.Drawing2D;
|
|
194
|
+
using System.Drawing.Imaging;
|
|
195
|
+
using System.Runtime.InteropServices;
|
|
196
|
+
using System.Text;
|
|
197
|
+
using System.Threading;
|
|
198
|
+
using System.Web.Script.Serialization;
|
|
199
|
+
|
|
200
|
+
static class P {
|
|
201
|
+
[DllImport("user32.dll")] public static extern bool SetProcessDPIAware();
|
|
202
|
+
[DllImport("user32.dll")] public static extern int GetSystemMetrics(int i);
|
|
203
|
+
[DllImport("user32.dll")] public static extern bool GetCursorPos(out POINT p);
|
|
204
|
+
[StructLayout(LayoutKind.Sequential)] public struct POINT { public int x, y; }
|
|
205
|
+
[StructLayout(LayoutKind.Sequential)] public struct RECT { public int left, top, right, bottom; }
|
|
206
|
+
public delegate bool MonProc(IntPtr h, IntPtr m, ref RECT r, IntPtr d);
|
|
207
|
+
[DllImport("user32.dll")] public static extern bool EnumDisplayMonitors(IntPtr a, IntPtr b, MonProc f, IntPtr d);
|
|
208
|
+
[StructLayout(LayoutKind.Sequential)] public struct MONITORINFO { public int cbSize; public RECT rcMonitor; public RECT rcWork; public uint dwFlags; }
|
|
209
|
+
[DllImport("user32.dll")] public static extern bool GetMonitorInfo(IntPtr h, ref MONITORINFO mi);
|
|
210
|
+
public delegate bool WinProc(IntPtr h, IntPtr d);
|
|
211
|
+
[DllImport("user32.dll")] public static extern bool EnumWindows(WinProc f, IntPtr d);
|
|
212
|
+
[DllImport("user32.dll")] public static extern bool IsWindowVisible(IntPtr h);
|
|
213
|
+
[DllImport("user32.dll")] public static extern bool IsIconic(IntPtr h);
|
|
214
|
+
[DllImport("user32.dll")] public static extern bool GetWindowRect(IntPtr h, out RECT r);
|
|
215
|
+
[DllImport("user32.dll", CharSet = CharSet.Unicode)] public static extern int GetWindowText(IntPtr h, StringBuilder s, int n);
|
|
216
|
+
[DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr h, out uint pid);
|
|
217
|
+
[DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();
|
|
218
|
+
[DllImport("user32.dll", SetLastError = true)] public static extern uint SendInput(int n, IntPtr a, int size);
|
|
219
|
+
[DllImport("user32.dll")] public static extern bool OpenClipboard(IntPtr h);
|
|
220
|
+
[DllImport("user32.dll")] public static extern bool EmptyClipboard();
|
|
221
|
+
[DllImport("user32.dll")] public static extern bool CloseClipboard();
|
|
222
|
+
[DllImport("user32.dll")] public static extern IntPtr SetClipboardData(uint f, IntPtr h);
|
|
223
|
+
[DllImport("user32.dll")] public static extern IntPtr GetClipboardData(uint f);
|
|
224
|
+
[DllImport("kernel32.dll")] public static extern IntPtr GlobalAlloc(uint f, UIntPtr s);
|
|
225
|
+
[DllImport("kernel32.dll")] public static extern IntPtr GlobalLock(IntPtr h);
|
|
226
|
+
[DllImport("kernel32.dll")] public static extern bool GlobalUnlock(IntPtr h);
|
|
227
|
+
[DllImport("kernel32.dll")] public static extern IntPtr CreateToolhelp32Snapshot(uint f, uint pid);
|
|
228
|
+
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool Process32First(IntPtr s, ref PE32 e);
|
|
229
|
+
[DllImport("kernel32.dll", CharSet = CharSet.Unicode)] public static extern bool Process32Next(IntPtr s, ref PE32 e);
|
|
230
|
+
[DllImport("kernel32.dll")] public static extern bool CloseHandle(IntPtr h);
|
|
231
|
+
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct PE32 {
|
|
232
|
+
public uint dwSize, cntUsage, th32ProcessID;
|
|
233
|
+
public IntPtr th32DefaultHeapID;
|
|
234
|
+
public uint th32ModuleID, cntThreads, th32ParentProcessID;
|
|
235
|
+
public int pcPriClassBase;
|
|
236
|
+
public uint dwFlags;
|
|
237
|
+
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szExeFile;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
class WinInfo { public long id; public string app; public string title; public uint pid; public int x, y, w, h; public bool min; }
|
|
242
|
+
|
|
243
|
+
class Program {
|
|
244
|
+
static int Main() {
|
|
245
|
+
// \u63A7\u5236\u53F0\u9ED8\u8BA4\u7F16\u7801\u5728\u4E2D\u6587 Windows \u4E0A\u662F GBK\uFF0C\u548C Node \u4FA7\u7684 utf8 \u5BF9\u4E0D\u4E0A\uFF0C\u8FD9\u91CC\u5F3A\u5236\u8D70 UTF-8
|
|
246
|
+
try { Console.OutputEncoding = new UTF8Encoding(false); } catch (Exception) { }
|
|
247
|
+
P.SetProcessDPIAware();
|
|
248
|
+
string line = "";
|
|
249
|
+
using (var reader = new System.IO.StreamReader(Console.OpenStandardInput(), new UTF8Encoding(false)))
|
|
250
|
+
line = reader.ReadToEnd().Trim();
|
|
251
|
+
string result;
|
|
252
|
+
try {
|
|
253
|
+
var ser = new JavaScriptSerializer();
|
|
254
|
+
var req = ser.Deserialize<Dictionary<string, object>>(line);
|
|
255
|
+
string action = req != null && req.ContainsKey("action") ? (string)req["action"] : "";
|
|
256
|
+
result = Dispatch(req, action);
|
|
257
|
+
} catch (Exception ex) {
|
|
258
|
+
result = "{\\"ok\\":false,\\"error\\":\\"" + Esc(ex.Message) + "\\"}";
|
|
259
|
+
}
|
|
260
|
+
using (var writer = new System.IO.StreamWriter(Console.OpenStandardOutput(), new UTF8Encoding(false)))
|
|
261
|
+
writer.WriteLine(result);
|
|
262
|
+
return 0;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
static string Dispatch(Dictionary<string, object> req, string action) {
|
|
266
|
+
switch (action) {
|
|
267
|
+
case "screens": return Screens();
|
|
268
|
+
case "capture": return Capture(req);
|
|
269
|
+
case "windows": return Windows(req);
|
|
270
|
+
case "frontmost": return Frontmost();
|
|
271
|
+
case "cursor": return Cursor();
|
|
272
|
+
case "click": return Click(req);
|
|
273
|
+
case "move": return Move(req);
|
|
274
|
+
case "drag": return Drag(req);
|
|
275
|
+
case "scroll": return Scroll(req);
|
|
276
|
+
case "key": return Key(req);
|
|
277
|
+
case "type": return Type(req);
|
|
278
|
+
case "clipboardGet": return ClipboardGet();
|
|
279
|
+
case "clipboardSet": return ClipboardSet(req);
|
|
280
|
+
default: return Fail("unknown action: " + action);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
static double Num(Dictionary<string, object> req, string k, double def) {
|
|
285
|
+
if (req == null || !req.ContainsKey(k)) return def;
|
|
286
|
+
object v = req[k];
|
|
287
|
+
if (v is int) return (int)v;
|
|
288
|
+
if (v is long) return (long)v;
|
|
289
|
+
if (v is double) return (double)v;
|
|
290
|
+
if (v is float) return (float)v;
|
|
291
|
+
if (v is string) { double d; return double.TryParse((string)v, out d) ? d : def; }
|
|
292
|
+
return def;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
static bool Bool(Dictionary<string, object> req, string k) {
|
|
296
|
+
if (req == null || !req.ContainsKey(k)) return false;
|
|
297
|
+
object v = req[k];
|
|
298
|
+
if (v is bool) return (bool)v;
|
|
299
|
+
if (v is string) { string s = ((string)v).ToLower(); return s == "1" || s == "true"; }
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
static string JObj(params string[] kvs) {
|
|
304
|
+
var sb = new StringBuilder("{");
|
|
305
|
+
for (int i = 0; i < kvs.Length; i++) {
|
|
306
|
+
if (i > 0) sb.Append(',');
|
|
307
|
+
string kv = kvs[i];
|
|
308
|
+
int c = kv.IndexOf(':');
|
|
309
|
+
if (c > 0) sb.Append(JStr(kv.Substring(0, c))).Append(':').Append(kv.Substring(c + 1));
|
|
310
|
+
else sb.Append(JStr(kv));
|
|
311
|
+
}
|
|
312
|
+
sb.Append('}');
|
|
313
|
+
return sb.ToString();
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
static string JStr(string s) { return "\\"" + Esc(s) + "\\""; }
|
|
317
|
+
|
|
318
|
+
// C# \u7684 bool.ToString() \u662F True/False\uFF0C\u4E0D\u662F\u5408\u6CD5 JSON\uFF0C\u5FC5\u987B\u8F6C\u6210\u5C0F\u5199
|
|
319
|
+
static string JB(bool b) { return b ? "true" : "false"; }
|
|
320
|
+
|
|
321
|
+
static string Esc(string s) {
|
|
322
|
+
if (s == null) return "";
|
|
323
|
+
var sb = new StringBuilder();
|
|
324
|
+
foreach (char c in s) {
|
|
325
|
+
switch (c) {
|
|
326
|
+
case '"': sb.Append("\\\\\\""); break;
|
|
327
|
+
case '\\\\': sb.Append("\\\\\\\\"); break;
|
|
328
|
+
case '\\n': sb.Append("\\\\n"); break;
|
|
329
|
+
case '\\r': sb.Append("\\\\r"); break;
|
|
330
|
+
case '\\t': sb.Append("\\\\t"); break;
|
|
331
|
+
default:
|
|
332
|
+
if (c < 0x20) sb.Append("\\\\u" + ((int)c).ToString("x4"));
|
|
333
|
+
else sb.Append(c);
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return sb.ToString();
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
static string Fail(string msg) { return "{\\"ok\\":false,\\"error\\":\\"" + Esc(msg) + "\\"}"; }
|
|
341
|
+
|
|
342
|
+
static string Screens() {
|
|
343
|
+
var mons = new List<int[]>();
|
|
344
|
+
P.EnumDisplayMonitors(IntPtr.Zero, IntPtr.Zero, (IntPtr h, IntPtr m, ref P.RECT r, IntPtr d) => {
|
|
345
|
+
var mi = new P.MONITORINFO();
|
|
346
|
+
mi.cbSize = Marshal.SizeOf(mi);
|
|
347
|
+
if (P.GetMonitorInfo(h, ref mi)) {
|
|
348
|
+
mons.Add(new int[] { mi.rcMonitor.left, mi.rcMonitor.top,
|
|
349
|
+
mi.rcMonitor.right - mi.rcMonitor.left, mi.rcMonitor.bottom - mi.rcMonitor.top,
|
|
350
|
+
(mi.dwFlags & 1) != 0 ? 1 : 0 });
|
|
351
|
+
}
|
|
352
|
+
return true;
|
|
353
|
+
}, IntPtr.Zero);
|
|
354
|
+
mons.Sort((a, b) => {
|
|
355
|
+
if (a[4] != b[4]) return b[4] - a[4];
|
|
356
|
+
if (a[0] != b[0]) return a[0] - b[0];
|
|
357
|
+
return a[1] - b[1];
|
|
358
|
+
});
|
|
359
|
+
var sb = new StringBuilder("[");
|
|
360
|
+
for (int i = 0; i < mons.Count; i++) {
|
|
361
|
+
if (i > 0) sb.Append(',');
|
|
362
|
+
sb.Append(JObj("index:" + i, "x:" + mons[i][0], "y:" + mons[i][1],
|
|
363
|
+
"width:" + mons[i][2], "height:" + mons[i][3], "primary:" + JB(mons[i][4] == 1)));
|
|
364
|
+
}
|
|
365
|
+
sb.Append(']');
|
|
366
|
+
return JObj("ok:true", "screens:" + sb.ToString());
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
static string Capture(Dictionary<string, object> req) {
|
|
370
|
+
string file = req.ContainsKey("file") ? (string)req["file"] : "";
|
|
371
|
+
if (string.IsNullOrEmpty(file)) return Fail("capture \u9700\u8981 file");
|
|
372
|
+
int vx = P.GetSystemMetrics(76), vy = P.GetSystemMetrics(77);
|
|
373
|
+
int vw = P.GetSystemMetrics(78), vh = P.GetSystemMetrics(79);
|
|
374
|
+
int x = (int)Num(req, "x", vx), y = (int)Num(req, "y", vy);
|
|
375
|
+
int w = (int)Num(req, "w", vw), h = (int)Num(req, "h", vh);
|
|
376
|
+
int cx = Math.Max(x, vx), cy = Math.Max(y, vy);
|
|
377
|
+
int cx2 = Math.Min(x + w, vx + vw), cy2 = Math.Min(y + h, vy + vh);
|
|
378
|
+
w = cx2 - cx; h = cy2 - cy;
|
|
379
|
+
if (w <= 0 || h <= 0) return Fail("capture \u533A\u57DF\u5728\u865A\u62DF\u5C4F\u5E55\u5916");
|
|
380
|
+
int maxWidth = (int)Num(req, "maxWidth", 2048);
|
|
381
|
+
var bmp = new Bitmap(w, h, PixelFormat.Format32bppArgb);
|
|
382
|
+
using (var g = Graphics.FromImage(bmp))
|
|
383
|
+
g.CopyFromScreen(cx, cy, 0, 0, new Size(w, h), CopyPixelOperation.SourceCopy);
|
|
384
|
+
int outW = w, outH = h;
|
|
385
|
+
Bitmap save = bmp;
|
|
386
|
+
if (w > maxWidth) {
|
|
387
|
+
outW = maxWidth;
|
|
388
|
+
outH = Math.Max(1, (int)Math.Round((double)h * maxWidth / w));
|
|
389
|
+
var small = new Bitmap(outW, outH, PixelFormat.Format32bppArgb);
|
|
390
|
+
using (var g = Graphics.FromImage(small)) {
|
|
391
|
+
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
|
|
392
|
+
g.DrawImage(bmp, 0, 0, outW, outH);
|
|
393
|
+
}
|
|
394
|
+
bmp.Dispose();
|
|
395
|
+
save = small;
|
|
396
|
+
}
|
|
397
|
+
ImageCodecInfo jpeg = null;
|
|
398
|
+
foreach (var e in ImageCodecInfo.GetImageEncoders())
|
|
399
|
+
if (e.MimeType == "image/jpeg") { jpeg = e; break; }
|
|
400
|
+
var ep = new EncoderParameters(1);
|
|
401
|
+
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 65L);
|
|
402
|
+
save.Save(file, jpeg, ep);
|
|
403
|
+
save.Dispose();
|
|
404
|
+
return JObj("ok:true", "file:" + JStr(file), "width:" + outW, "height:" + outH);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
static string Windows(Dictionary<string, object> req) {
|
|
408
|
+
int limit = (int)Num(req, "limit", 30);
|
|
409
|
+
var all = new List<WinInfo>();
|
|
410
|
+
P.EnumWindows((h, d) => {
|
|
411
|
+
if (!P.IsWindowVisible(h)) return true;
|
|
412
|
+
P.RECT r;
|
|
413
|
+
if (!P.GetWindowRect(h, out r)) return true;
|
|
414
|
+
int ww = r.right - r.left, hh = r.bottom - r.top;
|
|
415
|
+
if (ww <= 20 || hh <= 20) return true;
|
|
416
|
+
var sb = new StringBuilder(512);
|
|
417
|
+
P.GetWindowText(h, sb, 512);
|
|
418
|
+
uint pid;
|
|
419
|
+
P.GetWindowThreadProcessId(h, out pid);
|
|
420
|
+
// min\uFF1A\u6700\u5C0F\u5316\u7684\u7A97\u53E3\u4F1A\u5728\u865A\u62DF\u684C\u9762\u5916\u62A5 -32000,-32000\uFF0C\u6A21\u578B\u62FF\u5230\u8FD9\u79CD\u5750\u6807\u53BB\u70B9\u5FC5\u7136\u662F\u9519\u7684\uFF0C\u6807\u51FA\u6765\u8BA9\u5B83\u5148\u8FD8\u539F
|
|
421
|
+
all.Add(new WinInfo { id = (long)h, app = ProcessName((int)pid), title = sb.ToString(), pid = pid, x = r.left, y = r.top, w = ww, h = hh, min = P.IsIconic(h) });
|
|
422
|
+
return true;
|
|
423
|
+
}, IntPtr.Zero);
|
|
424
|
+
var named = new List<WinInfo>();
|
|
425
|
+
foreach (var wi in all) if (!string.IsNullOrEmpty(wi.title)) named.Add(wi);
|
|
426
|
+
var src = named.Count > 0 ? named : all;
|
|
427
|
+
var picked = src.GetRange(0, Math.Min(limit, src.Count));
|
|
428
|
+
var sb2 = new StringBuilder("[");
|
|
429
|
+
for (int i = 0; i < picked.Count; i++) {
|
|
430
|
+
if (i > 0) sb2.Append(',');
|
|
431
|
+
var wi = picked[i];
|
|
432
|
+
sb2.Append(JObj("id:" + wi.id, "app:" + JStr(wi.app), "title:" + JStr(wi.title), "pid:" + wi.pid,
|
|
433
|
+
"x:" + wi.x, "y:" + wi.y, "width:" + wi.w, "height:" + wi.h, "minimized:" + JB(wi.min)));
|
|
434
|
+
}
|
|
435
|
+
sb2.Append(']');
|
|
436
|
+
return JObj("ok:true", "windows:" + sb2.ToString(), "total:" + all.Count, "unnamed:" + (all.Count - named.Count));
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
static string ProcessName(int pid) {
|
|
440
|
+
try {
|
|
441
|
+
IntPtr snap = P.CreateToolhelp32Snapshot(2, 0);
|
|
442
|
+
if (snap == IntPtr.Zero || snap == new IntPtr(-1)) return "";
|
|
443
|
+
var e = new P.PE32();
|
|
444
|
+
e.dwSize = (uint)Marshal.SizeOf(e);
|
|
445
|
+
string name = "";
|
|
446
|
+
if (P.Process32First(snap, ref e)) {
|
|
447
|
+
do {
|
|
448
|
+
if ((int)e.th32ProcessID == pid) { name = e.szExeFile; break; }
|
|
449
|
+
} while (P.Process32Next(snap, ref e));
|
|
450
|
+
}
|
|
451
|
+
P.CloseHandle(snap);
|
|
452
|
+
return name;
|
|
453
|
+
} catch { return ""; }
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
static string Frontmost() {
|
|
457
|
+
IntPtr h = P.GetForegroundWindow();
|
|
458
|
+
uint pid = 0;
|
|
459
|
+
if (h != IntPtr.Zero) P.GetWindowThreadProcessId(h, out pid);
|
|
460
|
+
return JObj("ok:true", "name:" + JStr(ProcessName((int)pid)), "pid:" + pid);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
static string Cursor() {
|
|
464
|
+
P.POINT p;
|
|
465
|
+
P.GetCursorPos(out p);
|
|
466
|
+
return JObj("ok:true", "x:" + p.x, "y:" + p.y);
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// SendInput \u7684 INPUT \u662F\u300Ctype + \u8054\u5408\u4F53\u300D\uFF0C\u8054\u5408\u4F53\u8D77\u59CB\u504F\u79FB\u5728 x64 \u4E0A\u662F 8\u3001x86 \u4E0A\u662F 4
|
|
470
|
+
// \uFF08MOUSEINPUT \u91CC\u6709 ULONG_PTR\uFF0C\u6309\u81EA\u7136\u5BF9\u9F50\u6392\uFF09\u3002\u7528 Explicit \u5E03\u5C40\u628A\u504F\u79FB\u5199\u6B7B\u6210 4 \u7684\u8BDD\uFF0C
|
|
471
|
+
// x64 \u4E0A dx/dy \u4F1A\u6574\u4F53\u9519\u4F4D\uFF1ASendInput \u8FD4\u56DE 1\uFF08\u770B\u8D77\u6765\u6210\u529F\uFF09\uFF0C\u5149\u6807\u5374\u7EB9\u4E1D\u4E0D\u52A8\u3002
|
|
472
|
+
// \u6240\u4EE5\u4E0B\u9762\u624B\u5DE5\u62FC\u5B57\u8282\uFF0C\u504F\u79FB\u6309 IntPtr.Size \u7B97\uFF0C\u4E24\u79CD\u4F4D\u6570\u90FD\u5BF9\u3002
|
|
473
|
+
static int InputSize() { return IntPtr.Size == 8 ? 40 : 28; }
|
|
474
|
+
static int UnionOffset() { return IntPtr.Size == 8 ? 8 : 4; }
|
|
475
|
+
|
|
476
|
+
static uint SendInputBytes(byte[] buf) {
|
|
477
|
+
GCHandle h = GCHandle.Alloc(buf, GCHandleType.Pinned);
|
|
478
|
+
try { return P.SendInput(1, h.AddrOfPinnedObject(), buf.Length); }
|
|
479
|
+
finally { h.Free(); }
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
static void SendRaw(ushort vk, uint flags, bool up) {
|
|
483
|
+
int u = UnionOffset();
|
|
484
|
+
byte[] b = new byte[InputSize()];
|
|
485
|
+
BitConverter.GetBytes(1u).CopyTo(b, 0); // type = INPUT_KEYBOARD
|
|
486
|
+
BitConverter.GetBytes(vk).CopyTo(b, u); // wVk
|
|
487
|
+
BitConverter.GetBytes((ushort)0).CopyTo(b, u + 2); // wScan
|
|
488
|
+
BitConverter.GetBytes(flags | (up ? 2u : 0u)).CopyTo(b, u + 4); // dwFlags\uFF082 = KEYEVENTF_KEYUP\uFF09
|
|
489
|
+
SendInputBytes(b);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
static void SendMouse(uint flags, int dx, int dy, uint data) {
|
|
493
|
+
int u = UnionOffset();
|
|
494
|
+
byte[] b = new byte[InputSize()];
|
|
495
|
+
BitConverter.GetBytes(0u).CopyTo(b, 0); // type = INPUT_MOUSE
|
|
496
|
+
BitConverter.GetBytes(dx).CopyTo(b, u); // dx
|
|
497
|
+
BitConverter.GetBytes(dy).CopyTo(b, u + 4); // dy
|
|
498
|
+
BitConverter.GetBytes(data).CopyTo(b, u + 8); // mouseData
|
|
499
|
+
BitConverter.GetBytes(flags).CopyTo(b, u + 12); // dwFlags
|
|
500
|
+
SendInputBytes(b);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
// \u7EDD\u5BF9\u5750\u6807\uFF1A0~65535 \u6620\u5C04\u5230\u6574\u4E2A\u865A\u62DF\u684C\u9762\uFF08VIRTUALDESK\uFF09\uFF0C\u591A\u5C4F / \u8D1F\u5750\u6807\u90FD\u5BF9
|
|
504
|
+
static void MouseMove(int x, int y) {
|
|
505
|
+
int vx = P.GetSystemMetrics(76), vy = P.GetSystemMetrics(77);
|
|
506
|
+
int vw = P.GetSystemMetrics(78), vh = P.GetSystemMetrics(79);
|
|
507
|
+
int ax = (int)((long)(x - vx) * 65535L / vw);
|
|
508
|
+
int ay = (int)((long)(y - vy) * 65535L / vh);
|
|
509
|
+
SendMouse(0x8001u | 0x4000u, ax, ay, 0);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
static string Click(Dictionary<string, object> req) {
|
|
513
|
+
int x = (int)Num(req, "x", 0), y = (int)Num(req, "y", 0);
|
|
514
|
+
string button = req.ContainsKey("button") ? (string)req["button"] : "left";
|
|
515
|
+
int count = (int)Num(req, "count", 1);
|
|
516
|
+
bool dry = Bool(req, "dry");
|
|
517
|
+
if (!dry) {
|
|
518
|
+
MouseMove(x, y); Thread.Sleep(20);
|
|
519
|
+
uint down = button == "right" ? 8u : 2u;
|
|
520
|
+
uint up = button == "right" ? 10u : 4u;
|
|
521
|
+
for (int i = 1; i <= count; i++) {
|
|
522
|
+
SendMouse(down, 0, 0, 0); Thread.Sleep(20);
|
|
523
|
+
SendMouse(up, 0, 0, 0); Thread.Sleep(60);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
return JObj("ok:true", "x:" + x, "y:" + y, "count:" + count, "dry:" + JB(dry));
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
static string Move(Dictionary<string, object> req) {
|
|
530
|
+
int x = (int)Num(req, "x", 0), y = (int)Num(req, "y", 0);
|
|
531
|
+
bool dry = Bool(req, "dry");
|
|
532
|
+
if (!dry) MouseMove(x, y);
|
|
533
|
+
return JObj("ok:true", "x:" + x, "y:" + y, "dry:" + JB(dry));
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
static string Drag(Dictionary<string, object> req) {
|
|
537
|
+
int x1 = (int)Num(req, "x", 0), y1 = (int)Num(req, "y", 0);
|
|
538
|
+
int x2 = (int)Num(req, "toX", 0), y2 = (int)Num(req, "toY", 0);
|
|
539
|
+
bool dry = Bool(req, "dry");
|
|
540
|
+
if (!dry) {
|
|
541
|
+
MouseMove(x1, y1); Thread.Sleep(30);
|
|
542
|
+
SendMouse(2u, 0, 0, 0); Thread.Sleep(30);
|
|
543
|
+
for (int i = 1; i <= 12; i++) {
|
|
544
|
+
MouseMove(x1 + (x2 - x1) * i / 12, y1 + (y2 - y1) * i / 12);
|
|
545
|
+
Thread.Sleep(12);
|
|
546
|
+
}
|
|
547
|
+
Thread.Sleep(30);
|
|
548
|
+
SendMouse(4u, 0, 0, 0);
|
|
549
|
+
}
|
|
550
|
+
return JObj("ok:true", "from:[" + x1 + "," + y1 + "]", "to:[" + x2 + "," + y2 + "]", "dry:" + JB(dry));
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
static string Scroll(Dictionary<string, object> req) {
|
|
554
|
+
int x = (int)Num(req, "x", 0), y = (int)Num(req, "y", 0);
|
|
555
|
+
int dy = (int)Num(req, "dy", 0), dx = (int)Num(req, "dx", 0);
|
|
556
|
+
bool dry = Bool(req, "dry");
|
|
557
|
+
if (!dry) {
|
|
558
|
+
MouseMove(x, y); Thread.Sleep(40);
|
|
559
|
+
// WHEEL \u6B63\u503C = \u5411\u4E0A\u6EDA\uFF0C\u6240\u4EE5\u5411\u4E0B\u6EDA\uFF08dy>0\uFF09\u53D1\u8D1F\u503C\uFF1BHWHEEL \u6B63\u503C = \u5411\u53F3
|
|
560
|
+
if (dy != 0) SendMouse(0x800u, 0, 0, (uint)(-dy));
|
|
561
|
+
if (dx != 0) SendMouse(0x1000u, 0, 0, (uint)dx);
|
|
562
|
+
}
|
|
563
|
+
return JObj("ok:true", "x:" + x, "y:" + y, "dy:" + dy, "dx:" + dx, "dry:" + JB(dry));
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// flags \u4F4D\uFF08Node \u4FA7\u53E3\u5F84\uFF09\uFF1A1=shift 2=ctrl 4=alt 8=win\uFF1Bext = \u6269\u5C55\u952E\uFF08\u65B9\u5411\u952E / \u7FFB\u9875 / F11~F12\uFF09
|
|
567
|
+
// \u6309\u4E00\u6B21\u952E\uFF08\u542B\u4FEE\u9970\u952E\uFF09\uFF1AKEYBDINPUT.dwFlags \u91CC\u6CA1\u6709\u300C\u5E26 ctrl / shift\u300D\u8FD9\u79CD\u6807\u5FD7\u4F4D\uFF0C
|
|
568
|
+
// \u4FEE\u9970\u952E\u5FC5\u987B\u5404\u81EA\u4F5C\u4E3A\u72EC\u7ACB\u4E8B\u4EF6\u5148\u6309\u4E0B\u3001\u518D\u5728\u6700\u540E\u53CD\u5411\u677E\u5F00\uFF0C\u5426\u5219 ctrl+c \u4F1A\u88AB\u5F53\u6210\u5355\u72EC\u7684 c\u3002
|
|
569
|
+
static void SendKey(ushort vk, uint flags, bool ext, bool dry) {
|
|
570
|
+
if (dry) return;
|
|
571
|
+
var mods = new List<ushort>();
|
|
572
|
+
if ((flags & 2) != 0) mods.Add(0x11); // VK_CONTROL
|
|
573
|
+
if ((flags & 1) != 0) mods.Add(0x10); // VK_SHIFT
|
|
574
|
+
if ((flags & 4) != 0) mods.Add(0x12); // VK_MENU (Alt)
|
|
575
|
+
if ((flags & 8) != 0) mods.Add(0x5B); // VK_LWIN\uFF08cmd \u5728 Windows \u4E0A\u6620\u5C04\u5230 Win \u952E\uFF09
|
|
576
|
+
foreach (var m in mods) SendRaw(m, 0, false);
|
|
577
|
+
SendRaw(vk, ext ? 1u : 0u, false);
|
|
578
|
+
Thread.Sleep(6);
|
|
579
|
+
SendRaw(vk, ext ? 1u : 0u, true);
|
|
580
|
+
for (int i = mods.Count - 1; i >= 0; i--) SendRaw(mods[i], 0, true);
|
|
581
|
+
Thread.Sleep(6);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
static string Key(Dictionary<string, object> req) {
|
|
585
|
+
ushort vk = (ushort)(int)Num(req, "code", 0);
|
|
586
|
+
uint flags = (uint)(int)Num(req, "flags", 0);
|
|
587
|
+
bool ext = Bool(req, "ext");
|
|
588
|
+
bool dry = Bool(req, "dry");
|
|
589
|
+
SendKey(vk, flags, ext, dry);
|
|
590
|
+
return JObj("ok:true", "code:" + vk, "dry:" + JB(dry));
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
static string Type(Dictionary<string, object> req) {
|
|
594
|
+
bool dry = Bool(req, "dry");
|
|
595
|
+
var raw = req != null && req.ContainsKey("codes") ? req["codes"] : null;
|
|
596
|
+
// JavaScriptSerializer \u628A JSON \u6570\u7EC4\u53CD\u5E8F\u5217\u5316\u6210 object[] \u6216 ArrayList\uFF0C
|
|
597
|
+
// \u7EDF\u4E00\u6309 IList \u5904\u7406\uFF0C\u522B\u53BB\u731C\u5177\u4F53\u7C7B\u578B
|
|
598
|
+
var codes = raw as System.Collections.IList;
|
|
599
|
+
if (codes == null) return Fail("type \u9700\u8981 codes");
|
|
600
|
+
int n = 0;
|
|
601
|
+
foreach (var o in codes) {
|
|
602
|
+
var c = o as Dictionary<string, object>;
|
|
603
|
+
if (c == null) continue;
|
|
604
|
+
ushort vk = (ushort)(int)Num(c, "code", 0);
|
|
605
|
+
uint flags = (uint)(int)Num(c, "flags", 0);
|
|
606
|
+
bool ext = Bool(c, "ext");
|
|
607
|
+
SendKey(vk, flags, ext, dry);
|
|
608
|
+
n++;
|
|
609
|
+
}
|
|
610
|
+
return JObj("ok:true", "count:" + n, "dry:" + JB(dry));
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
static string ClipboardGet() {
|
|
614
|
+
if (!P.OpenClipboard(IntPtr.Zero)) return Fail("OpenClipboard \u5931\u8D25");
|
|
615
|
+
try {
|
|
616
|
+
IntPtr h = P.GetClipboardData(13);
|
|
617
|
+
if (h == IntPtr.Zero) return JObj("ok:true", "text:" + JStr(""));
|
|
618
|
+
IntPtr p = P.GlobalLock(h);
|
|
619
|
+
if (p == IntPtr.Zero) return JObj("ok:true", "text:" + JStr(""));
|
|
620
|
+
string s = Marshal.PtrToStringUni(p);
|
|
621
|
+
P.GlobalUnlock(h);
|
|
622
|
+
return JObj("ok:true", "text:" + JStr(s == null ? "" : s));
|
|
623
|
+
} finally { P.CloseClipboard(); }
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
static string ClipboardSet(Dictionary<string, object> req) {
|
|
627
|
+
string text = req.ContainsKey("text") ? (string)req["text"] : "";
|
|
628
|
+
if (!P.OpenClipboard(IntPtr.Zero)) return Fail("OpenClipboard \u5931\u8D25");
|
|
629
|
+
try {
|
|
630
|
+
P.EmptyClipboard();
|
|
631
|
+
byte[] data = Encoding.Unicode.GetBytes(text + '\\0');
|
|
632
|
+
IntPtr h = P.GlobalAlloc(2, (UIntPtr)(uint)data.Length);
|
|
633
|
+
IntPtr p = P.GlobalLock(h);
|
|
634
|
+
Marshal.Copy(data, 0, p, data.Length);
|
|
635
|
+
P.GlobalUnlock(h);
|
|
636
|
+
P.SetClipboardData(13, h);
|
|
637
|
+
return JObj("ok:true");
|
|
638
|
+
} finally { P.CloseClipboard(); }
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
`;function kb(){let t=process.env.WINDIR||"C:\\Windows";return[so.join(t,"Microsoft.NET","Framework64","v4.0.30319","csc.exe"),so.join(t,"Microsoft.NET","Framework","v4.0.30319","csc.exe")]}function Pa(){return so.join(lf.homedir(),".luban","bin")}function ja(){let t=ob.createHash("sha1").update(Oa,"utf8").digest("hex").slice(0,8);return so.join(Pa(),"luban-cu-"+t+".exe")}function gf(){try{return ot.existsSync(ja())}catch{return!1}}var hs=null;function yf(){let t=ja();if(gf())return Promise.resolve(t);if(hs)return hs;let e=wr();return e.ok?(hs=new Promise(function(n,s){let o=kb().filter(function(l){try{return ot.existsSync(l)}catch{return!1}})[0];if(!o){s(new Error("\u627E\u4E0D\u5230 csc.exe\uFF08.NET Framework 4.0 \u7F16\u8BD1\u5668\uFF09\uFF1AWindows \u684C\u9762\u64CD\u4F5C\u9700\u8981\u7CFB\u7EDF\u81EA\u5E26\u7684 .NET Framework"));return}let r=so.join(lf.tmpdir(),"luban-cu-"+process.pid+"-"+Date.now()+".cs"),i=t+".tmp-"+process.pid;try{ot.mkdirSync(Pa(),{recursive:!0}),ot.writeFileSync(r,"\uFEFF"+Oa,"utf8")}catch(l){s(new Error("\u5199\u4E0D\u4E86\u4E34\u65F6\u6587\u4EF6\uFF1A"+(l&&l.message||l)));return}function a(){try{ot.rmSync(r,{force:!0})}catch{}try{ot.rmSync(i,{force:!0})}catch{}}rb(o,["/nologo","/target:exe","/reference:System.Drawing.dll","/reference:System.Web.Extensions.dll","/out:"+i,r],{timeout:bb,maxBuffer:8*1024*1024,encoding:"utf8"},function(l,c,u){let d=String(u||c||l&&l.message||"").trim();if(l){a(),s(new Error("\u7F16\u8BD1\u684C\u9762\u64CD\u4F5C helper \u5931\u8D25\uFF1A"+(d.slice(0,300)||"csc \u5931\u8D25")));return}try{ot.renameSync(i,t)}catch(f){a(),s(new Error("\u5B89\u88C5\u684C\u9762\u64CD\u4F5C helper \u5931\u8D25\uFF1A"+(f&&f.message||f)));return}a(),n(t)})}),hs.then(function(){},function(){hs=null}),hs):Promise.reject(new Error(e.reason))}function Ze(t,e){return yf().then(function(n){return new Promise(function(s,o){let r;try{r=ib(n,[],{stdio:["pipe","pipe","pipe"]})}catch(c){o(new Error("helper \u542F\u52A8\u5931\u8D25\uFF1A"+(c&&c.message||c)));return}let i="",a="",l=setTimeout(function(){try{r.kill()}catch{}o(new Error("helper \u8D85\u65F6\uFF08"+(e||af)+"ms\uFF09"))},e||af);r.stdout.setEncoding("utf8"),r.stdout.on("data",function(c){i.length<8*1024*1024&&(i+=c)}),r.stderr.setEncoding("utf8"),r.stderr.on("data",function(c){a.length<4e3&&(a+=c)}),r.on("error",function(c){clearTimeout(l),o(new Error("helper \u542F\u52A8\u5931\u8D25\uFF1A"+(c&&c.message||c)))}),r.on("close",function(c){clearTimeout(l);let u=i.trim().split(`
|
|
642
|
+
`).pop()||"",d=null;try{d=JSON.parse(u)}catch{}if(d&&d.ok){s(d);return}let f=d&&d.error||a.trim()||"helper \u9000\u51FA code="+c;o(new Error(String(f).slice(0,800)))}),r.stdin.on("error",function(){}),r.stdin.end(JSON.stringify(t),"utf8")})})}function wr(){return yb?{ok:!0,platform:"win32",reason:""}:{ok:!1,platform:process.platform,reason:"\u684C\u9762\u64CD\u4F5C\u76EE\u524D\u652F\u6301 macOS / Windows\uFF08Linux \u5C1A\u672A\u5B9E\u73B0\uFF09"}}function bt(){let t=wr();if(!t.ok)throw new Error(t.reason)}async function kr(){bt();let t=await Ze({action:"screens"});return(Array.isArray(t.screens)?t.screens:[]).map(function(n,s){return{index:s,x:n.x,y:n.y,width:n.width,height:n.height,scale:1,primary:!!n.primary}})}async function oo(t,e){let n=await kr();if(!ff(n,t,e))throw new Error("\u5750\u6807 ("+t+", "+e+") \u4E0D\u5728\u4EFB\u4F55\u5C4F\u5E55\u8303\u56F4\u5185\uFF1B\u5F53\u524D\u5C4F\u5E55\uFF08\u7269\u7406\u50CF\u7D20\uFF09\uFF1A"+Aa(n))}async function La(t){bt();let e=t||{},n=await kr(),s=yr(e.display,1),o=n[s-1]||n[0];if(!o)throw new Error("\u8BFB\u4E0D\u5230\u5C4F\u5E55\u4FE1\u606F\uFF08EnumDisplayMonitors \u8FD4\u56DE\u7A7A\uFF09");let r=cf(e.region),i=r&&e.display!=null?s:null,a=r,l=null;if(r){let k=uf(n,r);if(!k)throw new Error("region "+r.x+","+r.y+" "+r.width+"\xD7"+r.height+" \u5B8C\u5168\u5728\u5C4F\u5E55\u5916\uFF1B\u5F53\u524D\u5C4F\u5E55\uFF08\u7269\u7406\u50CF\u7D20\uFF09\uFF1A"+Aa(n));a=k.region,l=k.clipped?k:null}let c=hf("jpg"),u={action:"capture",file:c,maxWidth:ms(e.maxWidth||mf,320,4096)};a?(u.x=a.x,u.y=a.y,u.w=a.width,u.h=a.height):s>1&&(u.x=o.x,u.y=o.y,u.w=o.width,u.h=o.height);try{await Ze(u,wb)}catch(k){try{ot.unlinkSync(c)}catch{}throw new Error("\u622A\u5C4F\u5931\u8D25\uFF1A"+k.message)}let d=null;try{d=ot.statSync(c)}catch{d=null}if(!d||d.size<128){try{ot.unlinkSync(c)}catch{}throw new Error("\u622A\u5C4F\u7ED3\u679C\u4E3A\u7A7A\uFF08\u5C4F\u5E55\u53EF\u80FD\u5904\u4E8E\u9501\u5C4F\u72B6\u6001\uFF09")}let f={width:0,height:0};try{f=await df(c)}catch{f={width:0,height:0}}if(!(f.width>0&&f.height>0)){try{ot.unlinkSync(c)}catch{}throw new Error("\u622A\u5C4F\u7ED3\u679C\u65E0\u6CD5\u89E3\u6790\uFF1A"+c+" \u4E0D\u662F\u6709\u6548 JPEG\uFF08\u53EF\u80FD\u622A\u5C4F\u88AB\u7CFB\u7EDF\u62E6\u4E0B\uFF09")}let p=a?a.width:o.width,h=a?a.height:o.height,m=f.width>0?p/f.width:1,x=a?a.x:o.x,b=a?a.y:o.y;return cb({file:c,width:f.width,height:f.height,pointWidth:p,pointHeight:h,ratio:m,originX:x,originY:b,clipped:!!(l&&l.clipped),requestedRegion:l?l.requested:null,displayIgnored:i,at:Date.now()}),{file:c,dataUrl:"data:image/jpeg;base64,"+ot.readFileSync(c).toString("base64"),width:f.width,height:f.height,pointWidth:p,pointHeight:h,ratio:m,originX:x,originY:b,screen:o,region:a,clipped:!!(l&&l.clipped),requestedRegion:l?l.requested:null,displayIgnored:i}}async function xb(t){bt();let n=ms((t||{}).limit||30,1,100),s=await Ze({action:"windows",limit:n}),o=Array.isArray(s.windows)?s.windows:[];return{windows:o,total:s.total||o.length,unnamed:s.unnamed||0}}async function bf(){bt();let t=await Ze({action:"frontmost"});return{name:t.name||"",pid:t.pid||0}}async function Sb(){bt();let t=await Ze({action:"cursor"});return{x:t.x||0,y:t.y||0}}var yt={a:65,b:66,c:67,d:68,e:69,f:70,g:71,h:72,i:73,j:74,k:75,l:76,m:77,n:78,o:79,p:80,q:81,r:82,s:83,t:84,u:85,v:86,w:87,x:88,y:89,z:90,1:49,2:50,3:51,4:52,5:53,6:54,7:55,8:56,9:57,0:48,return:13,enter:13,tab:9,space:32,delete:8,backspace:8,escape:27,esc:27,left:37,right:39,down:40,up:38,home:36,end:35,pageup:33,pagedown:34,forwarddelete:46,insert:45,f1:112,f2:113,f3:114,f4:115,f5:116,f6:117,f7:118,f8:119,f9:120,f10:121,f11:123,f12:124,"=":187,"-":189,"[":219,"]":221,";":186,"'":222,"\\":220,",":188,"/":191,".":190,"`":192},Ma={"!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=","{":"[","}":"]","|":"\\",":":";",'"':"'","<":",",">":".","?":"/","~":"`"},ro={win:8,cmd:8,command:8,meta:8,super:8,shift:1,ctrl:2,control:2,alt:4,option:4,opt:4},wf=[33,34,35,36,37,38,39,40,45,46,123,124];function kf(t){return wf.indexOf(t)>=0}function br(t){if(t===" ")return{code:32,shift:!1};if(t===`
|
|
643
|
+
`||t==="\r")return{code:13,shift:!1};if(t===" ")return{code:9,shift:!1};let e=String(t).toLowerCase();if(Ma[t]){let n=Ma[t];return yt[n]==null?null:{code:yt[n],shift:!0}}return/[A-Z]/.test(t)&&yt[e]!=null?{code:yt[e],shift:!0}:yt[t]!=null?{code:yt[t],shift:!1}:null}function xf(t){let e=String(t??"").split("+").map(function(a){return a.trim()}).filter(Boolean);if(!e.length)throw new Error("keys \u4E3A\u7A7A\uFF0C\u793A\u4F8B\uFF1Actrl+shift+p");let n=e.pop(),s=0;for(let a of e){let l=ro[String(a).toLowerCase()];if(l==null)throw new Error("\u4E0D\u8BA4\u8BC6\u7684\u4FEE\u9970\u952E\u300C"+a+"\u300D\uFF1B\u53EF\u7528\uFF1Awin\uFF08cmd\uFF09/ shift / ctrl / alt");s|=l}let o=String(n).toLowerCase(),i=(n.length===1&&!/^[a-z]$/.test(n)?br(n):null)||(yt[o]!=null?{code:yt[o],shift:!1}:br(n));if(!i)throw new Error("\u4E0D\u8BA4\u8BC6\u7684\u952E\u300C"+n+"\u300D\uFF1B\u53EF\u7528\u5B57\u6BCD / \u6570\u5B57 / return / tab / space / escape / \u65B9\u5411\u952E / f1~f12");return{code:i.code,flags:s|(i.shift?ro.shift:0)}}function Sf(){return Ze({action:"clipboardGet"}).then(function(t){return t.text!=null?t.text:null}).catch(function(){return null})}function Ca(t){return Ze({action:"clipboardSet",text:String(t)}).then(function(){})}async function _b(t){bt();let e=t||{},n=e.shot||await La({region:e.region,display:e.display,maxWidth:e.maxWidth}),s=ms(e.maxChars||6e3,500,2e4);return{text:pf([],n,s,Ea,"Windows \u540E\u7AEF\u6682\u672A\u5B9E\u73B0 OCR\uFF08\u65E0\u96F6\u4F9D\u8D56\u7684\u7CFB\u7EDF\u7EA7\u6587\u5B57\u8BC6\u522B API\uFF09\uFF0C\u8BF7\u6539\u7528 screenshot \u76F4\u63A5\u770B\u56FE"),items:0,shot:n}}async function vb(t){bt();let e=t||{},n=gs(e.x,e.y,e);return await oo(n.x,n.y),await Ze({action:"click",x:n.x,y:n.y,button:e.button==="right"?"right":"left",count:e.count===2?2:1,dry:!!e.dry}),(e.button==="right"?"\u53F3\u952E":e.count===2?"\u53CC\u51FB":"\u5355\u51FB")+" ("+n.x+", "+n.y+")\u3002"}async function Tb(t){bt();let e=t||{},n=gs(e.x,e.y,e);return await oo(n.x,n.y),await Ze({action:"move",x:n.x,y:n.y,dry:!!e.dry}),"\u5149\u6807\u5DF2\u79FB\u5230 ("+n.x+", "+n.y+")\u3002"}async function Mb(t){bt();let e=t||{},n=gs(e.x,e.y,e),s=gs(e.toX,e.toY,e);return await oo(n.x,n.y),await oo(s.x,s.y),await Ze({action:"drag",x:n.x,y:n.y,toX:s.x,toY:s.y,dry:!!e.dry}),"\u5DF2\u4ECE ("+n.x+", "+n.y+") \u62D6\u5230 ("+s.x+", "+s.y+")\u3002"}async function Cb(t){bt();let e=t||{},n=gs(e.x,e.y,e);await oo(n.x,n.y);let s=yr(e.dy,0),o=yr(e.dx,0);if(!s&&!o)throw new Error("scroll \u9700\u8981 dy\uFF08\u6216 dx\uFF09\uFF0C\u6B63\u6570 = \u5411\u4E0B / \u5411\u53F3");return await Ze({action:"scroll",x:n.x,y:n.y,dy:ms(s,-5e3,5e3),dx:ms(o,-5e3,5e3),dry:!!e.dry}),"\u5728 ("+n.x+", "+n.y+") \u6EDA\u52A8 dy="+s+(o?" dx="+o:"")+"\u3002"}async function Ab(t){bt();let e=t||{},n=xf(e.keys);return await Ze({action:"key",code:n.code,flags:n.flags,ext:kf(n.code),dry:!!e.dry}),"\u5DF2\u6309\u952E\uFF1A"+String(e.keys)}async function Eb(t){bt();let e=t||{},n=String(e.text==null?"":e.text);if(!n&&!e.submit)throw new Error("type \u9700\u8981 text\uFF08\u8981\u56DE\u8F66\u5C31\u52A0 submit: true\uFF09");let s=Array.from(n),o=s.map(br),r=o.every(Boolean),i="";if(r){let l=o.map(function(c){return{code:c.code,flags:c.shift?ro.shift:0,ext:kf(c.code)}});e.submit&&l.push({code:yt.return,flags:0,ext:!1}),l.length&&await Ze({action:"type",codes:l,dry:!!e.dry}),i="\u6309\u952E\u7801\u8F93\u5165 "+s.length+" \u4E2A\u5B57\u7B26"}else{let l=e.dry?null:await Sf();e.dry||await Ca(n);let c=[{code:yt.v,flags:ro.ctrl,ext:!1}];e.submit&&c.push({code:yt.return,flags:0,ext:!1}),await Ze({action:"type",codes:c,dry:!!e.dry}),!e.dry&&l!=null&&setTimeout(function(){Ca(l).catch(function(){})},400),i="\u7ECF\u526A\u8D34\u677F\u7C98\u8D34 "+s.length+" \u4E2A\u5B57\u7B26\uFF08\u542B\u975E ASCII\uFF09"}let a=await bf().catch(function(){return null});return"\u5DF2\u8F93\u5165\uFF08"+i+(e.submit?" + \u56DE\u8F66":"")+"\uFF09"+(a&&a.name?"\uFF0C\u76EE\u6807\u5E94\u7528\uFF1A"+a.name:"")+"\u3002"+(n?`
|
|
644
|
+
\u6587\u672C\u9884\u89C8\uFF1A`+JSON.stringify(n.slice(0,80)):"")}async function Ob(){let t=wr(),e={ok:!1,platform:process.platform,screens:[],screenRecording:!1,accessibility:!1,notes:[]};if(!t.ok)return e.notes.push(t.reason),e;try{e.screens=await kr()}catch(n){e.notes.push("\u8BFB\u5C4F\u5E55\u4FE1\u606F\u5931\u8D25\uFF1A"+n.message)}try{let n=await La({region:"0,0,60,60",maxWidth:320});e.screenRecording=!!n&&n.width>0;try{ot.unlinkSync(n.file)}catch{}}catch(n){e.notes.push("\u622A\u5C4F\u4E0D\u53EF\u7528\uFF1A"+n.message)}return e.accessibility=!0,e.screenRecording||e.notes.push("\u622A\u5C4F\u4E0D\u53EF\u7528\uFF1A\u8BF7\u786E\u8BA4\u5C4F\u5E55\u672A\u9501\u5C4F\u3001helper \u80FD\u6B63\u5E38\u622A\u5C4F\uFF08"+(e.notes[0]||"\u539F\u56E0\u672A\u77E5")+"\uFF09"),e.notes.push("\u6CE8\u610F\uFF1A\u4EE5\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C\u7684\u7A97\u53E3\u6536\u4E0D\u5230\u666E\u901A\u8FDB\u7A0B\u7684\u70B9\u51FB / \u6309\u952E\uFF08UIPI \u89C4\u5219\uFF09\uFF0C\u9700\u8981\u65F6\u8BF7\u8BA9\u5BBF\u4E3B App \u4E5F\u4EE5\u7BA1\u7406\u5458\u8FD0\u884C"),e.ok=e.screenRecording&&e.accessibility,e}function Pb(t){return fb(t,Ea)}_f.exports={available:wr,check:Ob,screens:kr,capture:La,describeShot:Pb,windows:xb,frontmost:bf,cursor:Sb,ocr:_b,click:vb,move:Tb,drag:Mb,scroll:Cb,type:Eb,key:Ab,parseKeys:xf,charToKey:br,formatOcr:pf,clipText:pb,readClipboard:Sf,writeClipboard:Ca,parseRegion:cf,clampRegion:uf,imageSize:df,lastShotInfo:lb,num:yr,clamp:ms,toScreenPoint:gs,pointOnScreen:ff,screenListDesc:Aa,fmtSize:ub,signed:db,ensureTmpDir:hb,pruneTmp:mb,tmpFile:hf,KEY_CODES:yt,FLAGS:ro,SHIFT_CHARS:Ma,EXT_KEYS:wf,WIN_UNIT:Ea,CSHARP_SRC:Oa,binDir:Pa,binaryPath:ja,hasBinary:gf,ensureBinary:yf,TMP_DIR:gb,DEFAULT_MAX_WIDTH:mf}});var Nf=Q((NS,Df)=>{var ys=require("fs"),{execFile:Ra}=require("child_process"),jb=Ta(),{num:xr,clamp:bs,parseRegion:Af,clampRegion:Ef,imageSize:qa,lastShotInfo:Lb,setLastShot:Ib,pointOnScreen:Of,toScreenPoint:ws,fmtSize:Db,screenListDesc:Ba,signed:Nb,describeShot:Fb,formatOcr:Pf,clipText:Rb,ensureTmpDir:qb,pruneTmp:Bb,tmpFile:Ia,DEFAULT_MAX_WIDTH:jf,TMP_DIR:Ub}=jb,Wb=process.platform==="darwin",Tf=2e4,Ft=2e4,Kb=6e4;function Da(t,e,n){let s=n||{};return new Promise(function(o,r){Ra(t,e,{timeout:s.timeoutMs||Ft,maxBuffer:8*1024*1024,encoding:"utf8",env:s.env||process.env},function(i,a,l){if(i){let c=new Error(String(l||""||i&&i.message||"\u547D\u4EE4\u5931\u8D25").trim().slice(0,800));c.code=i&&i.code,c.stdout=String(a||""),c.stderr=String(l||""),r(c);return}o({stdout:String(a||""),stderr:String(l||"")})})})}function rt(t,e){let n=e||{};return new Promise(function(s,o){let r=Ra("osascript",["-l","JavaScript"],{timeout:n.timeoutMs||Ft,maxBuffer:8388608,encoding:"utf8",env:n.env||process.env},function(i,a,l){if(i){let c=new Error(String(l||""||i&&i.message||"osascript \u5931\u8D25").trim().slice(0,800));c.code=i&&i.code,c.stdout=String(a||""),o(c);return}s(String(a||"").replace(/\s+$/,""))});r.stdin.on("error",function(){}),r.stdin.end(String(t),"utf8")})}function Ua(){return Wb?{ok:!0,platform:"darwin",reason:""}:{ok:!1,platform:process.platform,reason:"\u684C\u9762\u64CD\u4F5C\u76EE\u524D\u53EA\u652F\u6301 macOS\uFF08Windows / Linux \u7684\u8F93\u5165\u6CE8\u5165\u4E0E\u622A\u5C4F\u662F\u53E6\u4E00\u5957 API\uFF0C\u5C1A\u672A\u5B9E\u73B0\uFF09"}}function kt(){let t=Ua();if(!t.ok)throw new Error(t.reason)}async function _r(){kt();let t=['ObjC.import("AppKit");',"var list = $.NSScreen.screens;","var mainH = 0;","for (var i = 0; i < list.count; i++) {"," var f0 = list.objectAtIndex(i).frame;"," if (f0.origin.x === 0 && f0.origin.y === 0) { mainH = f0.size.height; }","}","var out = [];","for (var i = 0; i < list.count; i++) {"," var s = list.objectAtIndex(i);"," var f = s.frame;"," out.push({"," index: i,"," x: f.origin.x,"," y: mainH - (f.origin.y + f.size.height),"," width: f.size.width,"," height: f.size.height,"," scale: s.backingScaleFactor"," });","}","JSON.stringify(out);"].join(`
|
|
645
|
+
`),e=await rt(t,{timeoutMs:15e3}),n=[];try{n=JSON.parse(e)}catch{n=[]}return Array.isArray(n)?n:[]}async function io(t,e){let n=await _r();if(!Of(n,t,e))throw new Error("\u5750\u6807 ("+t+", "+e+") \u4E0D\u5728\u4EFB\u4F55\u5C4F\u5E55\u8303\u56F4\u5185\uFF1B\u5F53\u524D\u5C4F\u5E55\uFF08\u903B\u8F91\u70B9\uFF09\uFF1A"+Ba(n))}var lo=['ObjC.import("CoreGraphics");','ObjC.import("Foundation");',"var DRY = 0;","function postEvent(ev) { if (!DRY) { $.CGEventPost($.kCGHIDEventTap, ev); } }","function pt(x, y) { return { x: x, y: y }; }","function nap(us) { $.NSThread.sleepForTimeInterval(us / 1000000); }"].join(`
|
|
646
|
+
`);function co(t){return t?1:0}function Hb(t){let e=t.button==="right",n=e?"$.kCGMouseButtonRight":"$.kCGMouseButtonLeft",s=e?"$.kCGEventRightMouseDown":"$.kCGEventLeftMouseDown",o=e?"$.kCGEventRightMouseUp":"$.kCGEventLeftMouseUp",r=t.count===2?2:1;return[lo,"var DRY = "+co(t.dry)+";","var x = "+t.x+", y = "+t.y+";","var target = pt(x, y);","postEvent($.CGEventCreateMouseEvent($(), $.kCGEventMouseMoved, target, $.kCGMouseButtonLeft));","nap(20000);","for (var i = 1; i <= "+r+"; i++) {"," var down = $.CGEventCreateMouseEvent($(), "+s+", target, "+n+");"," $.CGEventSetIntegerValueField(down, 1, i);"," postEvent(down);"," nap(20000);"," var up = $.CGEventCreateMouseEvent($(), "+o+", target, "+n+");"," $.CGEventSetIntegerValueField(up, 1, i);"," postEvent(up);"," nap(60000);","}","JSON.stringify({ ok: true, x: x, y: y, count: "+r+", dry: !!DRY });"].join(`
|
|
647
|
+
`)}function zb(t){return[lo,"var DRY = "+co(t.dry)+";","var x = "+t.x+", y = "+t.y+";","postEvent($.CGEventCreateMouseEvent($(), $.kCGEventMouseMoved, pt(x, y), $.kCGMouseButtonLeft));","JSON.stringify({ ok: true, x: x, y: y, dry: !!DRY });"].join(`
|
|
648
|
+
`)}function Gb(t){return[lo,"var DRY = "+co(t.dry)+";","var x1 = "+t.x+", y1 = "+t.y+", x2 = "+t.toX+", y2 = "+t.toY+";","postEvent($.CGEventCreateMouseEvent($(), $.kCGEventMouseMoved, pt(x1, y1), $.kCGMouseButtonLeft));","nap(30000);","postEvent($.CGEventCreateMouseEvent($(), $.kCGEventLeftMouseDown, pt(x1, y1), $.kCGMouseButtonLeft));","nap(30000);","for (var i = 1; i <= 12; i++) {"," var mx = x1 + (x2 - x1) * i / 12;"," var my = y1 + (y2 - y1) * i / 12;"," postEvent($.CGEventCreateMouseEvent($(), $.kCGEventLeftMouseDragged, pt(mx, my), $.kCGMouseButtonLeft));"," nap(12000);","}","nap(30000);","postEvent($.CGEventCreateMouseEvent($(), $.kCGEventLeftMouseUp, pt(x2, y2), $.kCGMouseButtonLeft));","JSON.stringify({ ok: true, from: [x1, y1], to: [x2, y2], dry: !!DRY });"].join(`
|
|
649
|
+
`)}function Jb(t){return[lo,'ObjC.bindFunction("CGEventCreateScrollWheelEvent", ["id", ["id", "uint32", "uint32", "int32", "int32"]]);',"var DRY = "+co(t.dry)+";","var x = "+t.x+", y = "+t.y+", dy = "+t.dy+", dx = "+t.dx+";","postEvent($.CGEventCreateMouseEvent($(), $.kCGEventMouseMoved, pt(x, y), $.kCGMouseButtonLeft));","nap(40000);","var ev = $.CGEventCreateScrollWheelEvent($(), $.kCGScrollEventUnitPixel, 2, dy, dx);","postEvent(ev);","JSON.stringify({ ok: true, x: x, y: y, dy: dy, dx: dx, dry: !!DRY });"].join(`
|
|
650
|
+
`)}var wt={a:0,s:1,d:2,f:3,h:4,g:5,z:6,x:7,c:8,v:9,b:11,q:12,w:13,e:14,r:15,y:16,t:17,1:18,2:19,3:20,4:21,6:22,5:23,"=":24,9:25,7:26,"-":27,8:28,0:29,"]":30,o:31,u:32,"[":33,i:34,p:35,l:37,j:38,"'":39,k:40,";":41,"\\":42,",":43,"/":44,n:45,m:46,".":47,"`":50,return:36,enter:36,tab:48,space:49,delete:51,backspace:51,escape:53,esc:53,left:123,right:124,down:125,up:126,home:115,end:119,pageup:116,pagedown:121,forwarddelete:117,f1:122,f2:120,f3:99,f4:118,f5:96,f6:97,f7:98,f8:100,f9:101,f10:109,f11:103,f12:111},Na={"!":"1","@":"2","#":"3",$:"4","%":"5","^":"6","&":"7","*":"8","(":"9",")":"0",_:"-","+":"=","{":"[","}":"]","|":"\\",":":";",'"':"'","<":",",">":".","?":"/","~":"`"},ao={cmd:1048576,command:1048576,meta:1048576,super:1048576,shift:131072,ctrl:262144,control:262144,alt:524288,option:524288,opt:524288,fn:8388608};function Sr(t){if(t===" ")return{code:49,shift:!1};if(t===`
|
|
651
|
+
`||t==="\r")return{code:36,shift:!1};if(t===" ")return{code:48,shift:!1};let e=String(t).toLowerCase();if(Na[t]){let n=Na[t];return wt[n]==null?null:{code:wt[n],shift:!0}}return/[A-Z]/.test(t)&&wt[e]!=null?{code:wt[e],shift:!0}:wt[t]!=null?{code:wt[t],shift:!1}:null}function Lf(t){let e=String(t??"").split("+").map(function(a){return a.trim()}).filter(Boolean);if(!e.length)throw new Error("keys \u4E3A\u7A7A\uFF0C\u793A\u4F8B\uFF1Acmd+shift+p");let n=e.pop(),s=0;for(let a of e){let l=ao[String(a).toLowerCase()];if(l==null)throw new Error("\u4E0D\u8BA4\u8BC6\u7684\u4FEE\u9970\u952E\u300C"+a+"\u300D\uFF1B\u53EF\u7528\uFF1Acmd / shift / ctrl / alt\uFF08option\uFF09/ fn");s|=l}let o=String(n).toLowerCase(),i=(n.length===1&&!/^[a-z]$/.test(n)?Sr(n):null)||(wt[o]!=null?{code:wt[o],shift:!1}:Sr(n));if(!i)throw new Error("\u4E0D\u8BA4\u8BC6\u7684\u952E\u300C"+n+"\u300D\uFF1B\u53EF\u7528\u5B57\u6BCD / \u6570\u5B57 / return / tab / space / escape / \u65B9\u5411\u952E / f1~f12");return{code:i.code,flags:s|(i.shift?ao.shift:0)}}function Fa(t,e){let n=t.map(function(s){return"{ code: "+s.code+", flags: "+s.flags+" }"}).join(`,
|
|
652
|
+
`);return[lo,"var DRY = "+co(e)+";",`var keys = [
|
|
653
|
+
`+n+`
|
|
654
|
+
];`,"var src = $.CGEventSourceCreate($.kCGEventSourceStateHIDSystemState);","for (var i = 0; i < keys.length; i++) {"," var d = $.CGEventCreateKeyboardEvent(src, keys[i].code, true);"," if (keys[i].flags) { $.CGEventSetFlags(d, keys[i].flags); }"," postEvent(d);"," nap(6000);"," var u = $.CGEventCreateKeyboardEvent(src, keys[i].code, false);"," if (keys[i].flags) { $.CGEventSetFlags(u, keys[i].flags); }"," postEvent(u);"," nap(6000);","}","JSON.stringify({ ok: true, count: keys.length, dry: !!DRY });"].join(`
|
|
655
|
+
`)}function $b(){return Da("pbpaste",[],{timeoutMs:5e3}).then(function(t){return t.stdout}).catch(function(){return null})}function Mf(t){return new Promise(function(e,n){let s=Ra("pbcopy",[],{timeout:5e3,env:Object.assign({},process.env,{LANG:"en_US.UTF-8"})},function(o){if(o){n(new Error("\u5199\u526A\u8D34\u677F\u5931\u8D25\uFF1A"+o.message));return}e()});s.stdin.on("error",function(){}),s.stdin.end(String(t),"utf8")})}async function Wa(t){kt();let e=t||{},n=await _r(),s=xr(e.display,1),o=n[s-1]||n[0];if(!o)throw new Error("\u8BFB\u4E0D\u5230\u5C4F\u5E55\u4FE1\u606F\uFF08NSScreen \u8FD4\u56DE\u7A7A\uFF09");let r=Af(e.region),i=r&&e.display!=null?s:null,a=r,l=null;if(r){let b=Ef(n,r);if(!b)throw new Error("region "+r.x+","+r.y+" "+r.width+"\xD7"+r.height+" \u5B8C\u5168\u5728\u5C4F\u5E55\u5916\uFF1B\u5F53\u524D\u5C4F\u5E55\uFF08\u903B\u8F91\u70B9\uFF09\uFF1A"+Ba(n));a=b.region,l=b.clipped?b:null}let c=Ia("jpg"),u=["-x","-o","-t","jpg"];a?u.push("-R",[a.x,a.y,a.width,a.height].join(",")):s>1&&u.push("-D",String(s)),u.push(c);try{await Da("/usr/sbin/screencapture",u,{timeoutMs:Tf})}catch(b){let k=/permission|not permitted|could not create image|cannot/i.test(b.message)?"\uFF08\u5927\u6982\u7387\u662F\u6CA1\u7ED9\u5BBF\u4E3B App\u300C\u5C4F\u5E55\u5F55\u5236\u300D\u6743\u9650\uFF1A\u7CFB\u7EDF\u8BBE\u7F6E \u2192 \u9690\u79C1\u4E0E\u5B89\u5168\u6027 \u2192 \u5C4F\u5E55\u5F55\u5236\uFF09":"";throw new Error("\u622A\u5C4F\u5931\u8D25\uFF1A"+b.message+k)}let d=null;try{d=ys.statSync(c)}catch{d=null}if(!d||d.size<1024){try{ys.unlinkSync(c)}catch{}throw new Error("\u622A\u5C4F\u7ED3\u679C\u4E3A\u7A7A\uFF08\u53EF\u80FD\u662F\u6CA1\u6388\u6743\u300C\u5C4F\u5E55\u5F55\u5236\u300D\uFF0C\u6216\u5C4F\u5E55\u5904\u4E8E\u9501\u5C4F\u72B6\u6001\uFF09")}let f=await qa(c),p=a?a.width:o.width,h=a?a.height:o.height,m=bs(e.maxWidth||jf,320,4096),x=Math.min(p,m);if(f.width>x){let b=Ia("jpg");try{await Da("/usr/bin/sips",["-s","format","jpeg","-s","formatOptions","65","--resampleWidth",String(x),c,"--out",b],{timeoutMs:Tf});try{ys.unlinkSync(c)}catch{}return await Cf(b,o,a,p,h,l,i)}catch{try{ys.unlinkSync(b)}catch{}}}return await Cf(c,o,a,p,h,l,i)}async function Cf(t,e,n,s,o,r,i){let a=await qa(t),l=ys.readFileSync(t),c=a.width>0?s/a.width:1,u=n?n.x:e.x,d=n?n.y:e.y;return Ib({file:t,width:a.width,height:a.height,pointWidth:s,pointHeight:o,ratio:c,originX:u,originY:d,clipped:!!(r&&r.clipped),requestedRegion:r?r.requested:null,displayIgnored:i,at:Date.now()}),{file:t,dataUrl:"data:image/jpeg;base64,"+l.toString("base64"),width:a.width,height:a.height,pointWidth:s,pointHeight:o,ratio:c,originX:u,originY:d,screen:e,region:n,clipped:!!(r&&r.clipped),requestedRegion:r?r.requested:null,displayIgnored:i}}async function Xb(t){kt();let e=t||{},n=['ObjC.import("CoreGraphics");','ObjC.bindFunction("CGWindowListCopyWindowInfo", ["id", ["uint32", "uint32"]]);',"var raw = $.CGWindowListCopyWindowInfo(1 | 16, 0);","var list = ObjC.deepUnwrap(raw) || [];","var out = [];","for (var i = 0; i < list.length; i++) {"," var w = list[i];"," var b = w.kCGWindowBounds || {};"," var layer = w.kCGWindowLayer;"," if (layer !== 0 || !w.kCGWindowIsOnscreen) { continue; }"," if (!b || !(b.Width > 20) || !(b.Height > 20)) { continue; }"," out.push({"," id: w.kCGWindowNumber,",' app: String(w.kCGWindowOwnerName || ""),',' title: String(w.kCGWindowName || ""),'," pid: w.kCGWindowOwnerPID,"," x: b.X, y: b.Y, width: b.Width, height: b.Height"," });","}","JSON.stringify(out);"].join(`
|
|
656
|
+
`),s=await rt(n,{timeoutMs:Ft}),o=[];try{o=JSON.parse(s)}catch{o=[]}Array.isArray(o)||(o=[]);let r=bs(e.limit||30,1,100),i=o.filter(function(l){return l.title});return{windows:(i.length?i:o).slice(0,r),total:o.length,unnamed:o.length-i.length}}async function If(){kt();let t=['ObjC.import("AppKit");',"var app = $.NSWorkspace.sharedWorkspace.frontmostApplication;","JSON.stringify({"," name: String(app.localizedName.js),"," bundleId: String(app.bundleIdentifier.js),"," pid: app.processIdentifier","});"].join(`
|
|
657
|
+
`),e=await rt(t,{timeoutMs:15e3});try{return JSON.parse(e)}catch{return{name:"",bundleId:"",pid:0}}}async function Vb(){kt();let t=['ObjC.import("CoreGraphics");',"var p = $.CGEventGetLocation($.CGEventCreate($()));","JSON.stringify({ x: p.x, y: p.y });"].join(`
|
|
658
|
+
`),e=await rt(t,{timeoutMs:15e3});try{return JSON.parse(e)}catch{return{x:0,y:0}}}async function Yb(t){kt();let e=t||{},n=e.shot||await Wa({region:e.region,display:e.display,maxWidth:e.maxWidth}),s=bs(e.maxChars||6e3,500,2e4),o=['ObjC.import("Vision");','ObjC.import("Foundation");',"var url = $.NSURL.fileURLWithPath("+JSON.stringify(n.file)+");","var handler = $.VNImageRequestHandler.alloc.initWithURLOptions(url, $());","var req = $.VNRecognizeTextRequest.alloc.init;","req.recognitionLevel = 0;","req.usesLanguageCorrection = false;",'req.recognitionLanguages = ["zh-Hans", "en-US"];',"handler.performRequestsError($([req]), $());","var res = req.results || [];","var out = [];","for (var i = 0; i < res.count; i++) {"," var ob = res.objectAtIndex(i);"," var cand = ob.topCandidates(1);"," if (!cand || cand.count < 1) { continue; }"," var bb = ob.boundingBox;"," out.push({"," t: String(cand.objectAtIndex(0).string.js),"," x: bb.origin.x * "+n.width+","," y: (1 - bb.origin.y - bb.size.height) * "+n.height+","," w: bb.size.width * "+n.width+","," h: bb.size.height * "+n.height," });","}","JSON.stringify(out);"].join(`
|
|
659
|
+
`),r=await rt(o,{timeoutMs:Kb}),i=[];try{let a=JSON.parse(r);if(a&&a.error)throw new Error(a.error);i=Array.isArray(a)?a:[]}catch{i=[]}return{text:Pf(i,n,s),items:i.length,shot:n}}async function Zb(t){kt();let e=t||{},n=ws(e.x,e.y,e);return await io(n.x,n.y),await rt(Hb({x:n.x,y:n.y,button:e.button==="right"?"right":"left",count:e.count===2?2:1,dry:e.dry}),{timeoutMs:Ft}),(e.button==="right"?"\u53F3\u952E":e.count===2?"\u53CC\u51FB":"\u5355\u51FB")+" ("+n.x+", "+n.y+")\u3002"}async function Qb(t){kt();let e=t||{},n=ws(e.x,e.y,e);return await io(n.x,n.y),await rt(zb({x:n.x,y:n.y,dry:e.dry}),{timeoutMs:Ft}),"\u5149\u6807\u5DF2\u79FB\u5230 ("+n.x+", "+n.y+")\u3002"}async function ew(t){kt();let e=t||{},n=ws(e.x,e.y,e),s=ws(e.toX,e.toY,e);return await io(n.x,n.y),await io(s.x,s.y),await rt(Gb({x:n.x,y:n.y,toX:s.x,toY:s.y,dry:e.dry}),{timeoutMs:Ft}),"\u5DF2\u4ECE ("+n.x+", "+n.y+") \u62D6\u5230 ("+s.x+", "+s.y+")\u3002"}async function tw(t){kt();let e=t||{},n=ws(e.x,e.y,e);await io(n.x,n.y);let s=xr(e.dy,0),o=xr(e.dx,0);if(!s&&!o)throw new Error("scroll \u9700\u8981 dy\uFF08\u6216 dx\uFF09\uFF0C\u6B63\u6570 = \u5411\u4E0B / \u5411\u53F3");return await rt(Jb({x:n.x,y:n.y,dy:bs(s,-5e3,5e3),dx:bs(o,-5e3,5e3),dry:e.dry}),{timeoutMs:Ft}),"\u5728 ("+n.x+", "+n.y+") \u6EDA\u52A8 dy="+s+(o?" dx="+o:"")+"\u3002"}async function nw(t){kt();let e=t||{},n=Lf(e.keys);return await rt(Fa([n],e.dry),{timeoutMs:Ft}),"\u5DF2\u6309\u952E\uFF1A"+String(e.keys)}async function sw(t){kt();let e=t||{},n=String(e.text==null?"":e.text);if(!n&&!e.submit)throw new Error("type \u9700\u8981 text\uFF08\u8981\u56DE\u8F66\u5C31\u52A0 submit: true\uFF09");let s=Array.from(n),o=s.map(Sr),r=o.every(Boolean),i="";if(r){let l=o.map(function(c){return{code:c.code,flags:c.shift?ao.shift:0}});e.submit&&l.push({code:wt.return,flags:0}),l.length&&await rt(Fa(l,e.dry),{timeoutMs:Ft}),i="\u6309\u952E\u7801\u8F93\u5165 "+s.length+" \u4E2A\u5B57\u7B26"}else{let l=e.dry?null:await $b();e.dry||await Mf(n);let u=[{code:wt.v,flags:ao.cmd}];e.submit&&u.push({code:wt.return,flags:0}),await rt(Fa(u,e.dry),{timeoutMs:Ft}),!e.dry&&l!=null&&setTimeout(function(){Mf(l).catch(function(){})},400),i="\u7ECF\u526A\u8D34\u677F\u7C98\u8D34 "+s.length+" \u4E2A\u5B57\u7B26\uFF08\u542B\u975E ASCII\uFF09"}let a=await If().catch(function(){return null});return"\u5DF2\u8F93\u5165\uFF08"+i+(e.submit?" + \u56DE\u8F66":"")+"\uFF09"+(a&&a.name?"\uFF0C\u76EE\u6807\u5E94\u7528\uFF1A"+a.name:"")+"\u3002"+(n?`
|
|
660
|
+
\u6587\u672C\u9884\u89C8\uFF1A`+JSON.stringify(n.slice(0,80)):"")}async function ow(){let t=Ua(),e={ok:!1,platform:process.platform,screens:[],screenRecording:!1,accessibility:!1,notes:[]};if(!t.ok)return e.notes.push(t.reason),e;try{e.screens=await _r()}catch(n){e.notes.push("\u8BFB\u5C4F\u5E55\u4FE1\u606F\u5931\u8D25\uFF1A"+n.message)}try{let n=await Wa({region:"0,0,60,60",maxWidth:320});e.screenRecording=!!n&&n.width>0;try{ys.unlinkSync(n.file)}catch{}}catch(n){e.notes.push("\u622A\u5C4F\u4E0D\u53EF\u7528\uFF1A"+n.message)}try{let n=await rt('ObjC.import("ApplicationServices"); String($.AXIsProcessTrusted());',{timeoutMs:1e4});e.accessibility=/true/i.test(n)}catch(n){e.notes.push("\u8F85\u52A9\u529F\u80FD\u68C0\u6D4B\u5931\u8D25\uFF1A"+n.message)}return e.accessibility||e.notes.push("\u6CA1\u6709\u300C\u8F85\u52A9\u529F\u80FD\u300D\u6743\u9650\uFF1A\u70B9\u51FB / \u6309\u952E\u4F1A\u88AB\u7CFB\u7EDF\u9759\u9ED8\u4E22\u5F03\uFF08\u7CFB\u7EDF\u8BBE\u7F6E \u2192 \u9690\u79C1\u4E0E\u5B89\u5168\u6027 \u2192 \u8F85\u52A9\u529F\u80FD\uFF0C\u52FE\u9009\u5BBF\u4E3B App\uFF09"),e.screenRecording||e.notes.push("\u6CA1\u6709\u300C\u5C4F\u5E55\u5F55\u5236\u300D\u6743\u9650\uFF1A\u622A\u56FE\u4F1A\u5931\u8D25\u6216\u5168\u9ED1\uFF08\u7CFB\u7EDF\u8BBE\u7F6E \u2192 \u9690\u79C1\u4E0E\u5B89\u5168\u6027 \u2192 \u5C4F\u5E55\u5F55\u5236\uFF09"),e.ok=e.screenRecording&&e.accessibility,e}Df.exports={available:Ua,check:ow,screens:_r,capture:Wa,describeShot:Fb,windows:Xb,frontmost:If,cursor:Vb,ocr:Yb,click:Zb,move:Qb,drag:ew,scroll:tw,type:sw,key:nw,parseKeys:Lf,charToKey:Sr,formatOcr:Pf,clipText:Rb,parseRegion:Af,clampRegion:Ef,imageSize:qa,lastShotInfo:Lb,num:xr,clamp:bs,toScreenPoint:ws,pointOnScreen:Of,screenListDesc:Ba,fmtSize:Db,signed:Nb,ensureTmpDir:qb,pruneTmp:Bb,tmpFile:Ia,KEY_CODES:wt,FLAGS:ao,SHIFT_CHARS:Na,TMP_DIR:Ub,DEFAULT_MAX_WIDTH:jf}});var qf=Q((FS,za)=>{var Ff={pending:1,in_progress:1,completed:1,cancelled:1},rw=/^#{1,6}\s*(?:步骤|steps?)(?:\s|[::((]|$)/i,iw=/^\s*(?:[-*·]|\d+[.)、])\s+(?:\[[ xX/~-]\]\s+)?(.+?)\s*$/;function Rf(t){let e=String(t??"").replace(/\s+/g," ").trim();return e?e.length>200?e.slice(0,200):e:""}function aw(t){let e=String(t??"").trim().toLowerCase();return Ff[e]?e:"pending"}function uo(t){let e=String(t??"");if(!e.trim())return[];let n=e.split(/\r?\n/),s=!1,o=[];for(let r=0;r<n.length;r++){let i=n[r],a=String(i).trim();if(/^#{1,6}\s/.test(a)){if(rw.test(a)){s=!0;continue}if(s)break}if(!s||!a)continue;let l=iw.exec(i);if(!l)continue;let c=Rf(l[1]);c&&o.push(c)}return o.map(function(r,i){return{id:"t"+(i+1),content:r,status:"pending"}})}function ks(t){let e=Array.isArray(t)?t:[],n=new Map,s=[];for(let i=0;i<e.length;i++){let a=e[i];if(!a||typeof a!="object")continue;let l=Rf(a.content);if(!l)continue;let c=String(a.id==null?"":a.id).trim();c||(c="t"+(s.length+1)),c.length>64&&(c=c.slice(0,64));let u={id:c,content:l,status:aw(a.status)};n.has(c)||s.push(c),n.set(c,u)}let o=s.map(function(i){return n.get(i)}),r=!1;for(let i=0;i<o.length;i++)o[i].status==="in_progress"&&(r?o[i].status="pending":r=!0);return o}function Ka(t,e,n){let s=n||{},o=ks(e);if(!s.merge)return o;let r=ks(t),i=new Map,a=[];for(let l=0;l<r.length;l++)i.set(r[l].id,r[l]),a.push(r[l].id);for(let l=0;l<o.length;l++){let c=o[l];i.has(c.id)||a.push(c.id),i.set(c.id,c)}return ks(a.map(function(l){return i.get(l)}))}function lw(t){return t==="completed"?"[x]":t==="in_progress"?"[-]":t==="cancelled"?"[~]":"[ ]"}function Ha(t){let e=ks(t);if(!e.length)return"(\u6682\u65E0 todo)";let n=["\u5F53\u524D todo\uFF1A"];for(let s=0;s<e.length;s++){let o=e[s];n.push("- "+lw(o.status)+" "+o.id+": "+o.content)}return n.join(`
|
|
661
|
+
`)}za.exports={STATUSES:Ff,parsePlanSteps:uo,normalize:ks,merge:Ka,formatBlock:Ha};if(require.main===za){let t=function(s,o){if(!s)throw new Error(o||"assert failed")},e=0,n=function(s,o){try{o(),e++,console.log("ok "+s)}catch(r){console.error("FAIL "+s+": "+r.message),process.exitCode=1}};n("parse numbered steps",function(){let s=["## \u76EE\u6807","\u505A\u4E00\u4EF6\u4E8B","## \u6B65\u9AA4","1. \u6539 a.js \u52A0\u5BFC\u51FA","2) \u6539 b.js \u8C03\u7528\u5B83","- \u8DD1 node \u9A8C\u8BC1","## \u9A8C\u8BC1\u65B9\u5F0F","\u770B\u8F93\u51FA"].join(`
|
|
662
|
+
`),o=uo(s);t(o.length===3,"len="+o.length),t(o[0].id==="t1"&&o[0].status==="pending","t1"),t(o[0].content.indexOf("a.js")>=0,"content0"),t(o[2].id==="t3","t3")}),n("parse empty / no steps",function(){t(uo("").length===0,"empty"),t(uo(`## \u76EE\u6807
|
|
663
|
+
ok`).length===0,"no section")}),n("parse Steps English heading",function(){let s=uo(`## Steps
|
|
664
|
+
1. first
|
|
665
|
+
2. second`);t(s.length===2&&s[1].content==="second",JSON.stringify(s))}),n("normalize single in_progress",function(){let s=ks([{id:"a",content:"A",status:"in_progress"},{id:"b",content:"B",status:"in_progress"},{id:"c",content:"C",status:"done"}]);t(s.length===3,"len"),t(s[0].status==="in_progress","first keeps"),t(s[1].status==="pending","second demoted"),t(s[2].status==="pending","bad status \u2192 pending")}),n("merge true/false",function(){let s=[{id:"t1",content:"A",status:"pending"},{id:"t2",content:"B",status:"pending"}],o=[{id:"t1",content:"A",status:"completed"},{id:"t3",content:"C",status:"in_progress"}],r=Ka(s,o,{merge:!0});t(r.length===3,"merged len"),t(r[0].status==="completed","t1 done"),t(r[2].id==="t3"&&r[2].status==="in_progress","t3");let i=Ka(s,o,{merge:!1});t(i.length===2&&i[0].id==="t1"&&i[1].id==="t3","replace")}),n("formatBlock marks",function(){let s=Ha([{id:"t1",content:"A",status:"pending"},{id:"t2",content:"B",status:"in_progress"},{id:"t3",content:"C",status:"completed"},{id:"t4",content:"D",status:"cancelled"}]);t(s.indexOf("[ ] t1:")>=0,"pending"),t(s.indexOf("[-] t2:")>=0,"progress"),t(s.indexOf("[x] t3:")>=0,"done"),t(s.indexOf("[~] t4:")>=0,"cancel"),t(Ha([]).indexOf("\u6682\u65E0")>=0,"empty")}),process.exitCode||console.log("ALL PASS pass="+e)}});var $f=Q((RS,Ja)=>{var at=require("fs"),it=require("path"),Ga=200*1024,Bf=32*1024;function Kf(t){return it.join(String(t??""),".cursor","plans")}function Hf(t){let e=String(t??"");return e?it.join(e,".cursor","plans"):""}function zf(t,e){let n=[Kf(t)],s=Hf(e);return s&&n.push(s),n}function vr(t){let e=String(t??"");e.charCodeAt(0)===65279&&(e=e.slice(1));let n=e.split(/\r?\n/);if(!n.length||String(n[0]).trim()!=="---")return{head:[],body:e,has:!1};for(let s=1;s<n.length;s++)if(String(n[s]).trim()==="---")return{head:n.slice(1,s),body:n.slice(s+1).join(`
|
|
666
|
+
`),has:!0};return{head:[],body:e,has:!1}}function Gf(t){let e=String(t??"").trim();if(e.length>=2&&e.charAt(0)==='"'&&e.charAt(e.length-1)==='"')try{return JSON.parse(e)}catch{return e.slice(1,-1)}return e.length>=2&&e.charAt(0)==="'"&&e.charAt(e.length-1)==="'"?e.slice(1,-1).replace(/''/g,"'"):e}function Uf(t,e){let n=new RegExp("^"+e+"\\s*:\\s*(.*)$");for(let s=0;s<t.length;s++){let o=n.exec(t[s]);if(!o)continue;let r=o[1].trim();if(!/^[|>][+-]?\s*$/.test(r))return Gf(r);let i=[];for(let a=s+1;a<t.length;a++){let l=t[a];if(!String(l).trim()){i.push("");continue}if(!/^\s/.test(l))break;i.push(l.replace(/^\s+/,""))}for(;i.length&&!i[i.length-1];)i.pop();return r.charAt(0)===">"?i.filter(function(a){return!!a}).join(" "):i.join(`
|
|
667
|
+
`)}return""}function cw(t){let e=[],n=!1,s=null;for(let o=0;o<t.length;o++){let r=String(t[o]);if(!n){let l=/^todos\s*:\s*(.*)$/.exec(r);if(!l)continue;if(l[1].trim()==="[]")return[];n=!l[1].trim();continue}if(!r.trim())continue;if(!/^\s/.test(r))break;let i=/^\s*-\s*(.*)$/.exec(r);if(i){s&&e.push(s),s={id:"",content:"",status:"pending"};let l=/^([A-Za-z_][\w-]*)\s*:\s*(.*)$/.exec(i[1]);l&&Wf(s,l[1],l[2]);continue}if(!s)continue;let a=/^\s+([A-Za-z_][\w-]*)\s*:\s*(.*)$/.exec(r);a&&Wf(s,a[1],a[2])}return s&&e.push(s),e.filter(function(o){return!!(o.id||o.content)})}function Wf(t,e,n){e!=="id"&&e!=="content"&&e!=="status"||(t[e]=Gf(n))}function po(t){let e=vr(t);return{hasFrontmatter:e.has,body:e.body,name:Uf(e.head,"name"),overview:Uf(e.head,"overview"),todos:cw(e.head)}}function fo(t){return String(t??"").replace(/\.plan\.md$/i,"").replace(/\.md$/i,"").replace(/_[0-9a-f]{8}$/i,"")}function uw(t){let e=null;try{e=at.openSync(t,"r");let n=Buffer.alloc(Bf),s=at.readSync(e,n,0,Bf,0);return n.slice(0,s).toString("utf8")}catch{return""}finally{if(e!=null)try{at.closeSync(e)}catch{}}}function Tr(t){let e=String(t??"");try{let n=at.statSync(e);if(!n.isFile())return{ok:!1,code:"not_file",error:"\u4E0D\u662F\u6587\u4EF6"};if(n.size>Ga)return{ok:!1,code:"too_big",error:"\u8D85\u8FC7 "+Math.round(Ga/1024)+"KB"};let s=po(at.readFileSync(e,"utf8"));return{ok:!0,body:s.body,name:s.name,overview:s.overview,todos:s.todos,size:n.size,mtimeMs:n.mtimeMs}}catch(n){return{ok:!1,code:"read_failed",error:String(n&&n.message||n)}}}function dw(t){let e=Tr(t);return e.ok?e.todos||[]:[]}function Jf(t){let e=t||{},n=zf(e.home,e.root),s=new Set,o=[];for(let r=0;r<n.length;r++){let i=[];try{i=at.readdirSync(n[r],{withFileTypes:!0})}catch{continue}for(let a=0;a<i.length;a++){let l=i[a];if(!l.isFile()||!/\.md$/i.test(l.name))continue;let c=it.join(n[r],l.name),u=it.resolve(c).toLowerCase();if(s.has(u))continue;s.add(u);let d=null;try{d=at.statSync(c)}catch{continue}let f=po(uw(c));o.push({file:c,base:l.name,name:f.name||fo(l.name),overview:f.overview||"",size:d.size,mtimeMs:d.mtimeMs,scope:r===0?"home":"workspace"})}}return o.sort(function(r,i){return i.mtimeMs-r.mtimeMs}),o}Ja.exports={MAX_BYTES:Ga,homePlanDir:Kf,workspacePlanDir:Hf,roots:zf,splitFrontmatter:vr,parse:po,fallbackName:fo,readPlan:Tr,todosOfFile:dw,listPlans:Jf};if(require.main===Ja){let t=require("os"),e=function(o,r){if(!o)throw new Error(r||"assert failed")},n=0,s=function(o,r){try{r(),n++,console.log("ok "+o)}catch(i){console.error("FAIL "+o+": "+i.message),process.exitCode=1}};s("splitFrontmatter: CRLF + BOM",function(){let o=vr(`\uFEFF---\r
|
|
668
|
+
name: A\r
|
|
669
|
+
---\r
|
|
670
|
+
\u6B63\u6587\r
|
|
671
|
+
`);e(o.has&&o.head.length===1&&o.head[0]==="name: A",JSON.stringify(o)),e(o.body===`\u6B63\u6587
|
|
672
|
+
`,"body="+JSON.stringify(o.body))}),s("splitFrontmatter: missing close \u2192 whole text as body",function(){let o=vr(`---
|
|
673
|
+
name: A
|
|
674
|
+
\u6B63\u6587`);e(!o.has&&o.body.indexOf("name: A")>=0,JSON.stringify(o))}),s("parse: name / overview / todos",function(){let o=["---",'name: "EOS \u5BFC\u5165\u5BFC\u51FA"',"overview: \u7528\u771F\u5B9E\u6837\u4F8B\u9489\u6B7B\u683C\u5F0F","todos:"," - id: codec",' content: "\u65B0\u589E Codec\uFF08\u542B\u8F6C\u4E49\uFF09"'," status: in_progress"," - id: ui"," content: \u524D\u7AEF\u5F39\u7A97"," status: completed","isProject: false","---","# \u8BA1\u5212","\u6B63\u6587"].join(`
|
|
675
|
+
`),r=po(o);e(r.name==="EOS \u5BFC\u5165\u5BFC\u51FA","name="+r.name),e(r.overview==="\u7528\u771F\u5B9E\u6837\u4F8B\u9489\u6B7B\u683C\u5F0F","overview="+r.overview),e(r.todos.length===2,"todos="+JSON.stringify(r.todos)),e(r.todos[0].id==="codec"&&r.todos[0].content==="\u65B0\u589E Codec\uFF08\u542B\u8F6C\u4E49\uFF09","todo0"),e(r.todos[1].status==="completed","todo1"),e(r.body.trim()===`# \u8BA1\u5212
|
|
676
|
+
\u6B63\u6587`,"body="+JSON.stringify(r.body))}),s("parse: todos [] and block overview",function(){let o=po(`---
|
|
677
|
+
name: A
|
|
678
|
+
overview: >
|
|
679
|
+
\u7B2C\u4E00\u6BB5
|
|
680
|
+
\u7B2C\u4E8C\u6BB5
|
|
681
|
+
todos: []
|
|
682
|
+
---
|
|
683
|
+
body`);e(o.overview==="\u7B2C\u4E00\u6BB5 \u7B2C\u4E8C\u6BB5","overview="+o.overview),e(o.todos.length===0,"todos")}),s("fallbackName",function(){e(fo("eos_\u5355\u636E_\u5BFC\u5165\u5BFC\u51FA_d5e83329.plan.md")==="eos_\u5355\u636E_\u5BFC\u5165\u5BFC\u51FA",fo("x")),e(fo("plain.md")==="plain","plain")}),s("listPlans / readPlan on temp dirs",function(){let o=it.join(t.tmpdir(),"luban-cursor-plan-test-"+process.pid),r=it.join(o,"home"),i=it.join(o,"root"),a=it.join(r,".cursor","plans"),l=it.join(i,".cursor","plans");at.mkdirSync(a,{recursive:!0}),at.mkdirSync(l,{recursive:!0});try{at.writeFileSync(it.join(a,"old_a1b2c3d4.plan.md"),`---
|
|
684
|
+
name: \u65E7\u8BA1\u5212
|
|
685
|
+
overview: \u65E7
|
|
686
|
+
---
|
|
687
|
+
\u65E7\u6B63\u6587
|
|
688
|
+
`);let c=it.join(l,"new_e5f6a7b8.plan.md");at.writeFileSync(c,`---
|
|
689
|
+
name: \u65B0\u8BA1\u5212
|
|
690
|
+
todos:
|
|
691
|
+
- id: t1
|
|
692
|
+
content: \u505A\u4E00\u4EF6\u4E8B
|
|
693
|
+
status: pending
|
|
694
|
+
---
|
|
695
|
+
\u65B0\u6B63\u6587
|
|
696
|
+
`);let u=Date.now()/1e3;at.utimesSync(it.join(a,"old_a1b2c3d4.plan.md"),u-3600,u-3600);let d=Jf({home:r,root:i});e(d.length===2,"len="+d.length),e(d[0].name==="\u65B0\u8BA1\u5212"&&d[0].scope==="workspace",JSON.stringify(d[0])),e(d[1].name==="\u65E7\u8BA1\u5212"&&d[1].scope==="home",JSON.stringify(d[1]));let f=Tr(c);e(f.ok&&f.body.trim()==="\u65B0\u6B63\u6587","body="+JSON.stringify(f)),e(f.todos.length===1&&f.todos[0].content==="\u505A\u4E00\u4EF6\u4E8B","todos");let p=Tr(it.join(o,"nope.md"));e(!p.ok&&p.code==="read_failed",JSON.stringify(p))}finally{try{at.rmSync(o,{recursive:!0,force:!0})}catch{}}}),process.exitCode||console.log("ALL PASS pass="+n)}});var Yf=Q((qS,Va)=>{function zn(t,e){let n=String(t??"").replace(/\s+/g," ").trim();return n?n.length>e?n.slice(0,e):n:""}function fw(t,e){if(!t||typeof t!="object")return null;let n=zn(t.id,64),s=zn(t.label!=null?t.label:t.text,120);if(!s)return null;n||(n="o"+(e+1));let o={id:n,label:s};return(t.recommended===!0||t.recommended==="true")&&(o.recommended=!0),o}function pw(t,e){if(!t||typeof t!="object")return null;let n=zn(t.id,64),s=zn(t.prompt!=null?t.prompt:t.question,240);if(!s)return null;n||(n="q"+(e+1));let o=Array.isArray(t.options)?t.options:[],r=[],i=Object.create(null);for(let a=0;a<o.length&&r.length<6;a++){let l=fw(o[a],a);l&&(i[l.id]||(i[l.id]=1,r.push(l)))}return r.length<2?null:{id:n,prompt:s,allow_multiple:!!(t.allow_multiple||t.allowMultiple),options:r}}function vn(t){let e=t&&typeof t=="object"?t:{},n=zn(e.title,80),s=Array.isArray(e.questions)?e.questions:[];if(!s.length)throw new Error("ask_question \u9700\u8981\u975E\u7A7A questions \u6570\u7EC4");let o=[],r=Object.create(null);for(let i=0;i<s.length&&o.length<4;i++){let a=pw(s[i],i);a&&(r[a.id]||(r[a.id]=1,o.push(a)))}if(!o.length)throw new Error("ask_question \u6CA1\u6709\u6709\u6548\u9898\u76EE\uFF08\u6BCF\u9898\u9700 prompt\uFF0C\u4E14 options 2~6 \u9879\uFF09");return{title:n,questions:o}}function $a(t,e){let n=t&&t.questions||[],s=e&&typeof e=="object"?e:{},o={};for(let r=0;r<n.length;r++){let i=n[r],a=Object.create(null);for(let c=0;c<i.options.length;c++)a[i.options[c].id]=i.options[c];let l=s[i.id];if(i.allow_multiple){let c=Array.isArray(l)?l:l==null||l===""?[]:[l],u=[],d=Object.create(null);for(let f=0;f<c.length;f++){let p=zn(c[f],64);!p||!a[p]||d[p]||(d[p]=1,u.push(p))}if(!u.length)throw new Error("\u9898\u76EE\u300C"+i.id+"\u300D\u9700\u8981\u81F3\u5C11\u9009\u4E00\u9879");o[i.id]=u}else{let c=zn(Array.isArray(l)?l[0]:l,64);if(!c||!a[c])throw new Error("\u9898\u76EE\u300C"+i.id+"\u300D\u9700\u8981\u9009\u62E9\u4E00\u4E2A\u6709\u6548\u9009\u9879");o[i.id]=c}}return o}function Xf(t,e){for(let n=0;n<t.options.length;n++)if(t.options[n].id===e)return t.options[n].label;return e}function Vf(t,e){let n=t&&t.questions||[],s=["\u7528\u6237\u56DE\u7B54\uFF1A"];t&&t.title&&s.unshift("\u63D0\u95EE\uFF1A"+t.title);for(let o=0;o<n.length;o++){let r=n[o],i=e[r.id],a;Array.isArray(i)?a=i.map(function(l){return l+"\uFF08"+Xf(r,l)+"\uFF09"}).join("\u3001"):a=i+"\uFF08"+Xf(r,i)+"\uFF09",s.push("- "+r.id+"\uFF08"+r.prompt+"\uFF09: "+a)}return s.join(`
|
|
697
|
+
`)}function Xa(t){let e=t&&t.questions||[];return e.length!==1?!0:!!e[0].allow_multiple}Va.exports={MAX_QUESTIONS:4,MIN_OPTIONS:2,MAX_OPTIONS:6,normalize:vn,normalizeAnswers:$a,formatAnswers:Vf,needsConfirm:Xa};if(require.main===Va){let t=function(s,o){if(!s)throw new Error(o||"assert failed")},e=0,n=function(s,o){try{o(),e++,console.log("ok "+s)}catch(r){console.error("FAIL "+s+": "+r.message),process.exitCode=1}};n("normalize basic",function(){let s=vn({title:"\u65B9\u5411",questions:[{id:"q1",prompt:"\u8981\u4E0D\u8981\u8D85\u51FA\u5C04\u7A0B\u53D8\u6A59\uFF1F",options:[{id:"yes",label:"\u8981\u505A"},{id:"no",label:"\u4E0D\u505A"}]}]});t(s.title==="\u65B9\u5411","title"),t(s.questions.length===1&&s.questions[0].options.length===2,"q"),t(!Xa(s),"single select no confirm")}),n("normalize rejects empty / short options",function(){let s=!1;try{vn({questions:[]})}catch{s=!0}t(s,"empty"),s=!1;try{vn({questions:[{prompt:"x",options:[{id:"a",label:"A"}]}]})}catch{s=!0}t(s,"one option")}),n("normalize fills missing ids + caps",function(){let s=[];for(let r=0;r<8;r++)s.push({label:"L"+r});let o=vn({questions:[{prompt:"P1",options:s},{prompt:"P2",options:[{label:"A"},{label:"B"}]},{prompt:"P3",options:[{label:"A"},{label:"B"}]},{prompt:"P4",options:[{label:"A"},{label:"B"}]},{prompt:"P5",options:[{label:"A"},{label:"B"}]}]});t(o.questions.length===4,"max q"),t(o.questions[0].options.length===6,"max opt"),t(o.questions[0].id==="q1","auto id")}),n("normalizeAnswers single + multi",function(){let s=vn({questions:[{id:"a",prompt:"\u5355\u9009",options:[{id:"x",label:"X"},{id:"y",label:"Y"}]},{id:"b",prompt:"\u591A\u9009",allow_multiple:!0,options:[{id:"p",label:"P"},{id:"q",label:"Q"}]}]});t(Xa(s),"confirm");let o=$a(s,{a:"x",b:["p","q"]});t(o.a==="x"&&o.b.length===2,JSON.stringify(o));let r=Vf(s,o);t(r.indexOf("\u7528\u6237\u56DE\u7B54")>=0&&r.indexOf("x\uFF08X\uFF09")>=0,r)}),n("normalizeAnswers rejects bad",function(){let s=vn({questions:[{id:"a",prompt:"\u5355\u9009",options:[{id:"x",label:"X"},{id:"y",label:"Y"}]}]}),o=!1;try{$a(s,{a:"z"})}catch{o=!0}t(o,"bad id")}),n("normalize recommended flag",function(){let s=vn({questions:[{id:"q1",prompt:"\u65B9\u5411",options:[{id:"yes",label:"\u8981\u505A",recommended:!0},{id:"no",label:"\u4E0D\u505A"}]}]});t(s.questions[0].options[0].recommended===!0,"rec"),t(!s.questions[0].options[1].recommended,"no rec")}),process.exitCode||console.log("ALL PASS pass="+e)}});var Qf=Q((Zf,ho)=>{(function(t){"use strict";let e={"zh-cn":{"panel.statusReady":"\u5C31\u7EEA","panel.sessionsBtn":"\u4F1A\u8BDD","panel.sessionsTitle":"\u4F1A\u8BDD\u5386\u53F2\uFF08Cmd+Alt+H\uFF09","panel.newSessionBtn":"\u65B0\u4F1A\u8BDD","panel.newSessionTitle":"\u65B0\u4F1A\u8BDD\uFF08Cmd+Alt+N\uFF09","panel.hint":"\u8BF4\u300C\u65B0\u5EFA xxx.js\uFF0C\u5B9E\u73B0 \u2026\u300D\u6216\u300C\u628A xxx \u6539\u6210 \u2026\u300D\uFF0C\u6A21\u578B\u4F1A\u76F4\u63A5\u6539\u5DE5\u4F5C\u533A\u6587\u4EF6\u3002<br />\u8F93\u5165 <code>@</code> \u9009\u62E9\u8981\u5F15\u7528\u7684\u6587\u4EF6\u6216\u6587\u4EF6\u5939\uFF08<code>@src/</code> \u53EF\u6574\u76EE\u5F55\u5F15\u7528\uFF09\uFF0C<code>@web</code> \u8054\u7F51\u641C\u7D22\u540E\u4F5C\u7B54\uFF1B\u5F15\u7528\u4EE3\u7801\uFF1A\u5728\u7F16\u8F91\u5668\u91CC\u9009\u4E2D\u540E\u53F3\u952E\u300CAdd Selection to Luban Chat\u300D\u6216\u6309 <code>Cmd/Ctrl+Alt+A</code>\uFF08\u4E5F\u53EF\u7528\u300C# \u9009\u533A\u300D\u6309\u94AE / <code>#</code>\uFF09\uFF0Ctoken \u5E26\u6587\u4EF6\u4E0E\u884C\u53F7\uFF0C\u53EF\u591A\u6B21\u53E0\u52A0\u3002","panel.inputPlaceholder":"\u63CF\u8FF0\u4F60\u8981\u751F\u6210\u6216\u4FEE\u6539\u7684\u4EE3\u7801\u2026\uFF08Enter \u53D1\u9001\uFF0CShift+Enter \u6362\u884C\uFF1B\u8FD0\u884C\u4E2D\u6309 Enter \u4F1A\u628A\u6D88\u606F\u6392\u961F\uFF0C\u7B49\u8FD9\u4E00\u8F6E\u7ED3\u675F\u81EA\u52A8\u53D1\u9001\uFF1B@ \u5F15\u7528\u6587\u4EF6\u6216\u6587\u4EF6\u5939\uFF0C# \u5F15\u7528\u9009\u533A\uFF1B@web \u8054\u7F51\u641C\u7D22\uFF1B\u8F93\u5165\u6CD5\u9009\u8BCD\u4E0D\u4F1A\u8BEF\u53D1\uFF09","panel.selectModelTitle":"\u9009\u62E9 provider / \u6A21\u578B","panel.modeTitle":"\u6A21\u5F0F\uFF08Shift+Tab \u5FAA\u73AF\uFF09","panel.refSelectionBtn":"# \u9009\u533A","panel.refSelectionTitle":"\u5F15\u7528\u7F16\u8F91\u5668\u9009\u533A\uFF08\u5148\u9009\u4E2D\u4EE3\u7801\uFF1A\u53F3\u952E Add Selection to Luban Chat \u6216 Cmd/Ctrl+Alt+A\uFF09","panel.webChip":"\u{1F310} \u8054\u7F51","panel.webChipTitle":"\u672C\u6B21\u4F1A\u5148\u8054\u7F51\u641C\u7D22\u518D\u56DE\u7B54","panel.thinkChipDefault":"\u{1F9E0} \u9ED8\u8BA4","panel.thinkChipOn":"\u{1F9E0} \u5F00","panel.thinkChipOff":"\u{1F9E0} \u5173","panel.thinkChipTitle":"\u601D\u8003\u6A21\u5F0F\uFF1A{dflt}\u3002\u70B9\u4E00\u4E0B\u5207\u6362\uFF08\u9ED8\u8BA4 / \u5F00 / \u5173\uFF09\uFF1B\u6A21\u578B\u6CA1\u914D thinking \u65F6\u4E0D\u663E\u793A","panel.verbChipDefault":"\u270E \u9ED8\u8BA4","panel.verbChipConcise":"\u270E \u7B80\u6D01","panel.verbChipNormal":"\u270E \u6807\u51C6","panel.verbChipDetailed":"\u270E \u8BE6\u7EC6","panel.verbChipTitle":"Agent \u8BE6\u7EC6\u7A0B\u5EA6\uFF1A\u70B9\u4E00\u4E0B\u5207\u6362\uFF08\u9ED8\u8BA4 / \u7B80\u6D01 / \u6807\u51C6 / \u8BE6\u7EC6\uFF09\uFF0C\u53EA\u5BF9\u672C\u6761\u6D88\u606F\u751F\u6548\uFF1B\u300C\u9ED8\u8BA4\u300D\u8DDF\u968F\u8BBE\u7F6E\u91CC\u7684 luban.agent.verbosity","panel.settingsTitle":"Provider \u8BBE\u7F6E\uFF08\u6A21\u578B / baseUrl / API key\uFF09","panel.send":"\u53D1\u9001","panel.sendTitle":"\u53D1\u9001\uFF08Enter\uFF09","panel.stop":"\u23F9 \u505C\u6B62","panel.stopTitle":"\u505C\u6B62\u5F53\u524D\u4EFB\u52A1","panel.tabClose":"\u5173\u95ED\u6807\u7B7E\uFF08\u6B63\u5728\u751F\u6210\u4F1A\u53D6\u6D88\u8FD9\u4E00\u8F6E\uFF09","panel.tabTooltip":"\u53F3\u952E\uFF1A\u5173\u95ED / \u5173\u95ED\u5176\u4ED6 / \u5173\u95ED\u5DE6\u53F3\u4FA7","panel.tabOverflowTitle":"\u66F4\u591A\u6807\u7B7E","panel.menuClose":"\u5173\u95ED\u5F53\u524D","panel.menuCloseOthers":"\u5173\u95ED\u5176\u4ED6","panel.menuCloseRight":"\u5173\u95ED\u53F3\u4FA7\u5168\u90E8","panel.menuCloseLeft":"\u5173\u95ED\u5DE6\u4FA7\u5168\u90E8","panel.menuCloseAll":"\u5173\u95ED\u5168\u90E8","panel.menuCloseTitle":"\u6B63\u5728\u751F\u6210\u4F1A\u53D6\u6D88\u8FD9\u4E00\u8F6E","panel.jumpLatest":"\u2193 \u6700\u65B0","panel.jumpLatestTitle":"\u56DE\u5230\u6700\u65B0\u5185\u5BB9","panel.thinking":"\u601D\u8003\u4E2D\u2026","panel.thinkDone":"\u601D\u8003\u8FC7\u7A0B","panel.thinkLabel":"{label} \xB7 {n} \u5B57","panel.roleYou":"\u4F60","panel.roleAssistant":"\u52A9\u624B","panel.roleError":"\u9519\u8BEF","panel.toolLabel":"\u5DE5\u5177\u8C03\u7528","panel.toolUnit":"\u6761","panel.toolsBad":"\uFF08{n} \u5931\u8D25\uFF09","panel.toolsLast":"\xB7 \u6700\u8FD1 {name}","panel.refWholeDir":"\u{1F4C1} \u5F15\u7528\u6574\u4E2A {dir}\uFF08{n} \u4E2A\u6587\u4EF6\uFF09","panel.refWeb":"\u{1F310} \u8054\u7F51\u641C\u7D22\uFF08@web\uFF09","panel.imgBubble":"\u{1F4CE} \u56FE\u7247 \xD7{n}","panel.imgPreviewTitle":"\u70B9\u51FB\u67E5\u770B\u5927\u56FE\uFF08\u518D\u6B21\u70B9\u51FB\u5173\u95ED\uFF09","panel.imgLoadFail":"\u56FE\u7247\u52A0\u8F7D\u5931\u8D25\uFF08\u6587\u4EF6\u53EF\u80FD\u5DF2\u88AB\u6E05\u7406\uFF09","panel.imgRemoveTitle":"\u79FB\u9664\u8FD9\u5F20\u56FE\u7247","panel.imgNoVision":"\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u56FE\u7247\u8F93\u5165\uFF0C\u56FE\u7247\u672A\u9644\u52A0\u3002\u53EF\u5728 Provider \u8BBE\u7F6E\u91CC\u4E3A\u6A21\u578B\u52FE\u9009 vision\u3002","panel.imgTooBig":"\u56FE\u7247\u8D85\u8FC7 5MB\uFF0C\u5DF2\u8DF3\u8FC7","panel.imgBadType":"\u4E0D\u652F\u6301\u7684\u56FE\u7247\u683C\u5F0F\uFF08\u4EC5 PNG / JPEG / WebP / GIF\uFF09\uFF0C\u5DF2\u8DF3\u8FC7","panel.imgLimit":"\u6700\u591A 4 \u5F20\u56FE\u7247\uFF0C\u591A\u4F59\u7684\u5DF2\u5FFD\u7565","panel.imgReadFail":"\u8BFB\u53D6\u56FE\u7247\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7","panel.copyMsg":"\u590D\u5236\u6D88\u606F","panel.copied":"\u5DF2\u590D\u5236","panel.copyFail":"\u590D\u5236\u5931\u8D25","panel.editMsg":"\u7F16\u8F91\u8FD9\u6761\u6D88\u606F","panel.editCancel":"\u53D6\u6D88","panel.editHint":"\u53D1\u9001\u540E\u4F1A\u5220\u9664\u8FD9\u6761\u4E4B\u540E\u7684\u5BF9\u8BDD\u8BB0\u5F55\uFF0C\u5E76\u7ACB\u5373\u7528\u4FEE\u6539\u540E\u7684\u5185\u5BB9\u91CD\u65B0\u53D1\u9001","panel.editSending":"\u6B63\u5728\u91CD\u65B0\u53D1\u9001\u2026","panel.editSaved":"\u5DF2\u4FDD\u5B58\uFF0C\u79FB\u9664\u540E\u7EED {n} \u6761\u8BB0\u5F55","panel.editSavedNone":"\u5DF2\u4FDD\u5B58","panel.editBusy":"\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u4E0D\u80FD\u7F16\u8F91\u5386\u53F2\uFF1B\u8BF7\u5148\u505C\u6B62\u8FD9\u4E00\u8F6E","panel.forkMsgTitle":"\u4ECE\u8FD9\u4E2A\u63D0\u95EE\u5904\u5206\u652F\uFF08\u4FDD\u7559\u5230\u8FD9\u91CC\uFF09","panel.forking":"\u6B63\u5728\u5206\u652F\u4F1A\u8BDD\u2026","panel.forkBusy":"\u6B63\u5728\u751F\u6210\u4E2D\uFF0C\u4E0D\u80FD\u5206\u652F\uFF1B\u8BF7\u5148\u505C\u6B62\u8FD9\u4E00\u8F6E","panel.refLoadingFiles":"\u52A0\u8F7D\u6587\u4EF6\u4E0E\u76EE\u5F55\u5217\u8868\u2026","panel.refLoadingSelection":"\u8BFB\u53D6\u5F53\u524D\u9009\u533A\u2026","panel.refNoMatchDir":"\u8FD9\u4E2A\u76EE\u5F55\u91CC\u6CA1\u6709\u5339\u914D\u9879","panel.refNoMatch":"\u6CA1\u6709\u5339\u914D\u7684\u6587\u4EF6\u6216\u6587\u4EF6\u5939","panel.refNoEditor":"\u5F53\u524D\u6CA1\u6709\u53EF\u5F15\u7528\u7684\u7F16\u8F91\u5668","panel.lines":"{n} \u884C","panel.files":"{n} \u4E2A\u6587\u4EF6","panel.injected":"\u5DF2\u6CE8\u5165 {n} \u4E2A\u5168\u6587","panel.truncated":"\u5DF2\u622A\u65AD","panel.omitted":"\u5DF2\u7701\u7565","panel.sources":"\u6765\u6E90 \xB7 {n}","panel.ctxTip":"\u4E0A\u4E0B\u6587 {used} / {win} token ({pct}{model})","panel.ctxEst":"\u2248 \u8868\u793A\u7AEF\u70B9\u6CA1\u56DE usage\uFF0C\u6309\u5B57\u7B26\u6570\u4F30\u7B97","panel.usageCache":"\u7F13\u5B58 {n} ({pct})","panel.usageContext":"\u4E0A\u4E0B\u6587 {used} / {win} ({pct})","panel.usageRequests":"{n} \u6B21\u8BF7\u6C42","panel.usageTipContext":"\u4E0A\u4E0B\u6587 {used} / {win} token","panel.usageTipRequests":"\u8BF7\u6C42 {n} \u6B21","panel.usageTipModel":"\u6A21\u578B {model}","panel.usageTipEst":"\u2248 \u4F30\u7B97\u503C\uFF08\u7AEF\u70B9\u672A\u56DE usage\uFF09","panel.reviewShowDiff":"\u67E5\u770B diff","panel.reviewKeepAll":"\u5168\u90E8\u4FDD\u7559","panel.reviewDropAll":"\u5168\u90E8\u64A4\u9500","panel.reviewBlocks":"\xB7 {n} \u5757","panel.reviewTitle":"\u5F85\u5BA1\u9605\u6539\u52A8 \xB7 {files} \u4E2A\u6587\u4EF6 / {hunks} \u5757\uFF08+{add} -{del}\uFF09","panel.reviewKeepAllFiles":"\u5168\u90E8\u4FDD\u7559\uFF08\u6240\u6709\u6587\u4EF6\uFF09","panel.reviewRejectAllFiles":"\u5168\u90E8\u64A4\u9500\uFF08\u6240\u6709\u6587\u4EF6\uFF09","panel.reviewRejectAllConfirm":"\u786E\u8BA4\u64A4\u9500\u5168\u90E8?","panel.reviewHint":"\u660E\u7EC6\u5728\u7F16\u8F91\u5668\u7684 diff \u91CC\uFF1A\u6807\u9898\u680F\u300C\u5168\u90E8\u4FDD\u7559 / \u5168\u90E8\u64A4\u9500\u300D\uFF0C\u884C\u5185\u9010\u5757\u300C\u4FDD\u7559\u8FD9\u5757 / \u64A4\u9500\u8FD9\u5757\u300D\uFF1B\u70B9\u300C\u67E5\u770B diff\u300D\u53EF\u91CD\u65B0\u6253\u5F00\u3002\u6807\u9898\u53F3\u4FA7\u7684\u4E24\u679A\u6309\u94AE\u4E00\u6B21\u5904\u7406\u6240\u6709\u6587\u4EF6\u3002","panel.relJustNow":"\u521A\u521A","panel.relMinutes":"{n} \u5206\u949F\u524D","panel.relHours":"{n} \u5C0F\u65F6\u524D","panel.relDays":"{n} \u5929\u524D","panel.sessionsHead":"\u4F1A\u8BDD\u5386\u53F2 \xB7 {n} \u4E2A","panel.sessionsSearchHead":"\u4F1A\u8BDD\u5386\u53F2 \xB7 \u5339\u914D {n}/{total} \u4E2A","panel.sessionSearchPlaceholder":"\u641C\u7D22\u4F1A\u8BDD\u6807\u9898\u4E0E\u6B63\u6587\u2026","panel.sessionSearchTitle":"\u641C\u7D22\u5386\u53F2\u4F1A\u8BDD\uFF1A\u6807\u9898\u5373\u65F6\u8FC7\u6EE4\uFF0C\u8F93\u5165 2 \u4E2A\u5B57\u4EE5\u4E0A\u540C\u65F6\u641C\u6B63\u6587","panel.sessionSearchClear":"\u6E05\u7A7A\u641C\u7D22\uFF08Esc\uFF09","panel.sessionSearchMinChars":"\u8F93\u5165 2 \u4E2A\u5B57\u4EE5\u4E0A\u540C\u65F6\u641C\u7D22\u6B63\u6587","panel.sessionSearching":"\u6B63\u5728\u641C\u7D22\u6B63\u6587\u2026","panel.sessionSearchHits":"\u6B63\u6587\u547D\u4E2D {n} \u4E2A\u4F1A\u8BDD","panel.sessionSearchTruncated":"\uFF08\u5DF2\u8FBE\u4E0A\u9650\uFF09","panel.sessionContentHits":"\u6B63\u6587 {n} \u5904","panel.sessionSearchNoMatch":"\u6CA1\u6709\u5339\u914D\u7684\u4F1A\u8BDD\uFF1A\u6807\u9898\u4E0E\u6B63\u6587\u90FD\u67E5\u8FC7\u4E86\uFF0C\u6362\u4E2A\u8BCD\u8BD5\u8BD5\u3002","panel.sessionNew":"\uFF0B \u65B0\u4F1A\u8BDD","panel.loading":"\u52A0\u8F7D\u4E2D\u2026","panel.sessionsEmptyAll":"\u8FD8\u6CA1\u6709\u4EFB\u4F55\u4F1A\u8BDD\u8BB0\u5F55\u3002\u53D1\u7B2C\u4E00\u6761\u6D88\u606F\u5C31\u4F1A\u81EA\u52A8\u5EFA\u4E00\u4E2A\u3002","panel.sessionsEmptyWs":"\u8FD9\u4E2A\u5DE5\u4F5C\u533A\u8FD8\u6CA1\u6709\u4F1A\u8BDD\u8BB0\u5F55\u3002\u70B9\u300C\u663E\u793A\u5176\u5B83\u5DE5\u4F5C\u533A\u300D\u770B\u770B\u522B\u5904\u7684\uFF0C\u6216\u76F4\u63A5\u53D1\u6D88\u606F\u5F00\u59CB\u65B0\u7684\u3002","panel.sessionItems":"{n} \u6761","panel.noWorkspace":"\u65E0\u5DE5\u4F5C\u533A","panel.deleteConfirm":"\u5220\u9664?","panel.deleteConfirmTitle":"\u518D\u70B9\u4E00\u6B21\u786E\u8BA4\u5220\u9664\uFF08\u4E0D\u53EF\u6062\u590D\uFF09","panel.deleteTitle":"\u5220\u9664\u8FD9\u4E2A\u4F1A\u8BDD","panel.forkBtn":"\u5206\u652F","panel.forkTitle":"\u5206\u652F\u8FD9\u4E2A\u4F1A\u8BDD\uFF08Fork\uFF09","panel.forkRound":"\u5206\u652F\u5230\u8FD9\u91CC","panel.forkRoundTitle":"\u628A\u8FD9\u4E2A\u4F1A\u8BDD\u4FDD\u7559\u5230\u8FD9\u4E00\u8F6E\u7ED3\u675F\uFF0C\u751F\u6210\u4E00\u4E2A\u65B0\u5206\u652F","panel.openingSession":"\u6B63\u5728\u6253\u5F00\u4F1A\u8BDD\u2026","panel.scopeToWorkspace":"\u53EA\u770B\u672C\u5DE5\u4F5C\u533A","panel.scopeToAll":"\u663E\u793A\u5176\u5B83\u5DE5\u4F5C\u533A","panel.scopeTipAll":"\u5F53\u524D\u663E\u793A\u5168\u90E8\u5DE5\u4F5C\u533A","panel.scopeTipWs":"\u5F53\u524D\u53EA\u663E\u793A\u672C\u5DE5\u4F5C\u533A","panel.openingNew":"\u6B63\u5728\u5F00\u65B0\u4F1A\u8BDD\u2026","panel.execPlanRunning":"\u6267\u884C\u8BA1\u5212\u4E2D\u2026","panel.openPlanFile":"\u{1F4C4} \u6253\u5F00\u8BA1\u5212\u6587\u4EF6","panel.runPlan":"\u25B6 \u6267\u884C\u8FD9\u4E2A\u8BA1\u5212","panel.runPlanAccept":"\u25B6 \u6267\u884C\u5E76\u63A5\u53D7\u53D8\u66F4","panel.runPlanAcceptTitle":"\u6267\u884C\u8BA1\u5212\uFF0C\u5199\u5165\u540E\u81EA\u52A8\u5168\u90E8\u4FDD\u7559\uFF0C\u4E0D\u8FDB\u5165\u5F85\u5BA1\u9605","panel.planSent":"\u5DF2\u4EA4\u7ED9 Agent \u6267\u884C\u2026","panel.planSaved":"\u5DF2\u4FDD\u5B58 \xB7 {file}","panel.planReadonly":"Plan \u6A21\u5F0F\u53EA\u8BFB\uFF0C\u672A\u6539\u52A8\u4EFB\u4F55\u6587\u4EF6","panel.todosTitle":"\u5F85\u529E {done}/{total}","panel.todoPending":"\u672A\u5F00\u59CB","panel.todoProgress":"\u8FDB\u884C\u4E2D","panel.todoDone":"\u5DF2\u5B8C\u6210","panel.todoCancelled":"\u5DF2\u53D6\u6D88","panel.askSubmit":"\u786E\u8BA4","panel.askMulti":"\uFF08\u53EF\u591A\u9009\uFF09","panel.askNeedAll":"\u8BF7\u5148\u4E3A\u6BCF\u9053\u9898\u9009\u597D\u9009\u9879","panel.askAnswered":"\u5DF2\u56DE\u7B54","panel.askError":"\u63D0\u4EA4\u9009\u9879\u5931\u8D25","panel.askCancelled":"\u5DF2\u53D6\u6D88\uFF08\u672C\u8F6E\u7ED3\u675F\uFF09","panel.askRecommended":"\u63A8\u8350","panel.queueTitle":"\u6392\u961F {n} \u6761","panel.queuePausedTip":"\u5DF2\u6682\u505C \xB7 \u70B9\u300C\u7EE7\u7EED\u300D\u624D\u4F1A\u53D1\u9001","panel.queueAutoTip":"\u5F53\u524D\u4EFB\u52A1\u7ED3\u675F\u540E\u81EA\u52A8\u53D1\u9001","panel.resume":"\u7EE7\u7EED","panel.resumeTitle":"\u6062\u590D\u81EA\u52A8\u53D1\u9001\uFF1A\u5F53\u524D\u7A7A\u95F2\u5C31\u7ACB\u523B\u53D1\u4E0B\u4E00\u6761","panel.clear":"\u6E05\u7A7A","panel.clearQueueTitle":"\u6E05\u7A7A\u961F\u5217\uFF08\u4E0D\u5F71\u54CD\u6B63\u5728\u8DD1\u7684\u8FD9\u4E00\u8F6E\uFF09","panel.runNow":"\u7ACB\u5373","panel.runNowTitle":"\u6253\u65AD\u5F53\u524D\u4EFB\u52A1\uFF0C\u7ACB\u523B\u6267\u884C\u8FD9\u6761\uFF08\u5176\u4F59\u6392\u961F\u4FDD\u7559\uFF09","panel.runNowStatus":"\u5DF2\u8BF7\u6C42\u7ACB\u5373\u6267\u884C\u2026","panel.edit":"\u7F16\u8F91","panel.editTitle":"\u4ECE\u961F\u5217\u53D6\u56DE\u8F93\u5165\u6846\u4FEE\u6539","panel.removeTitle":"\u4ECE\u961F\u5217\u5220\u9664\u8FD9\u6761","panel.retrieved":"\u5DF2\u53D6\u56DE\u6392\u961F\u4E2D\u7684\u6D88\u606F","panel.resuming":"\u7EE7\u7EED\u6392\u961F\u4E2D\u7684\u6D88\u606F\u2026","panel.queued":"\u5DF2\u6392\u961F \xB7 \u5F53\u524D\u4EFB\u52A1\u7ED3\u675F\u540E\u81EA\u52A8\u53D1\u9001","panel.searching":"\u8054\u7F51\u641C\u7D22\u4E2D\u2026","panel.running":"\u8FD0\u884C\u4E2D\u2026","panel.stopRequested":"\u5DF2\u8BF7\u6C42\u505C\u6B62","panel.noEditorSelection":"\u5F53\u524D\u6CA1\u6709\u6253\u5F00\u7684\u7F16\u8F91\u5668\uFF0C\u65E0\u6CD5\u5F15\u7528\u9009\u533A","panel.noSelection":"\u5148\u5728\u7F16\u8F91\u5668\u91CC\u9009\u4E2D\u4E00\u6BB5\u4EE3\u7801\uFF0C\u518D\u70B9\u8FD9\u91CC\u5F15\u7528","panel.selectionRef":"# \u5F15\u7528\uFF1A{path}:{start}-{end}","panel.fileRef":"\u5DF2\u5F15\u7528 {n} \u9879","panel.selectionToken":"#selection {path}:{start}-{end}\uFF08{kind} {n} \u884C\uFF09","panel.kindSelection":"\u9009\u533A","panel.kindFull":"\u5168\u6587","panel.done":"\u5B8C\u6210","panel.unknownError":"\u672A\u77E5\u9519\u8BEF","panel.error":"\u51FA\u9519","panel.queueFailed":"\u5165\u961F\u5931\u8D25","store.untitled":"\u65B0\u4F1A\u8BDD","cross.execPlan":"\u25B6 \u6267\u884C\u8BA1\u5212","cross.execPlanAccept":"\u25B6 \u6267\u884C\u8BA1\u5212\u5E76\u63A5\u53D7\u53D8\u66F4","ext.keepHunk":"$(check) \u4FDD\u7559\u8FD9\u5757 (+{add} -{del})","ext.revertHunk":"$(discard) \u64A4\u9500\u8FD9\u5757","ext.viewDiff":"$(diff) \u67E5\u770B\u6574\u4F53 diff","ext.keepFile":"$(check-all) \u5168\u90E8\u4FDD\u7559 (+{add} -{del})","ext.revertFile":"$(discard) \u5168\u90E8\u64A4\u9500","ext.diffTitle":"Luban \u53D8\u66F4: {file} (+{add} -{del})","ext.noPending":"\u6CA1\u6709\u5F85\u5BA1\u9605\u6539\u52A8: {path}","ext.hunkGone":"\u627E\u4E0D\u5230 {hunk}\uFF08\u6539\u52A8\u5DF2\u53D8\u5316\uFF0C\u8BF7\u91CD\u8BD5\uFF09","ext.unknownAction":"\u672A\u77E5\u64CD\u4F5C: {action}","ext.noReviewFile":"\u6CA1\u6709\u53EF\u5BA1\u9605\u7684\u6587\u4EF6","ext.removedGhost":" <- \u5220\u9664 {n} \u884C: {text}","ext.actionFailed":"\u64CD\u4F5C\u5931\u8D25","ext.reviewWarn":"Luban \u5BA1\u9605: {msg}","ext.queueFull":"\u961F\u5217\u5DF2\u6EE1\uFF08\u6700\u591A {n} \u6761\uFF09\uFF0C\u5148\u53D1\u5B8C\u6216\u6E05\u7A7A\u518D\u6392","ext.queueEmpty":"\u8FD9\u6761\u6D88\u606F\u662F\u7A7A\u7684\uFF0C\u6CA1\u6709\u5165\u961F","ext.addSelectionNone":"\u5F53\u524D\u7F16\u8F91\u5668\u91CC\u6CA1\u6709\u9009\u4E2D\u5185\u5BB9\uFF0C\u672A\u63D2\u5165\u5F15\u7528\uFF08\u5148\u5728\u7F16\u8F91\u5668\u91CC\u9009\u4E2D\u4E00\u6BB5\u4EE3\u7801\uFF09","ext.queueMissing":"\u961F\u5217\u91CC\u6CA1\u6709\u8FD9\u6761\u6D88\u606F","ext.imgNoVision":"\u5F53\u524D\u6A21\u578B\u4E0D\u652F\u6301\u56FE\u7247\u8F93\u5165\uFF0C\u56FE\u7247\u5DF2\u5FFD\u7565","ext.noSuchSession":"\u6CA1\u6709\u8FD9\u4E2A\u4F1A\u8BDD: {id}","ext.sessionBusy":"\u5F53\u524D\u4F1A\u8BDD\u6B63\u5728\u8FD0\u884C\uFF0C\u8BF7\u7A0D\u540E\u518D\u6267\u884C\u8BA1\u5212","ext.editBusy":"\u5F53\u524D\u4F1A\u8BDD\u6B63\u5728\u8FD0\u884C\uFF0C\u4E0D\u80FD\u7F16\u8F91\u5DF2\u53D1\u51FA\u7684\u6D88\u606F","ext.editMissing":"\u6CA1\u6709\u627E\u5230\u8981\u7F16\u8F91\u7684\u90A3\u6761\u6D88\u606F\uFF08\u53EF\u80FD\u5DF2\u88AB\u6E05\u7406\uFF09","ext.editEmpty":"\u7F16\u8F91\u540E\u7684\u5185\u5BB9\u4E0D\u80FD\u4E3A\u7A7A","ext.forkPickTitle":"\u5206\u652F\u4F1A\u8BDD","ext.forkPickPlaceholder":"\u6574\u6BB5\u590D\u5236\uFF0C\u6216\u9009\u4E00\u6761\u63D0\u95EE\u4ECE\u90A3\u91CC\u5206\u652F","ext.forkWhole":"\u6574\u6BB5\u590D\u5236\u8FD9\u4E2A\u4F1A\u8BDD","ext.forkWholeDesc":"\u4FDD\u7559\u5168\u90E8 {n} \u6761\u8BB0\u5F55","ext.forkFromDesc":"\u4ECE\u8FD9\u6761\u63D0\u95EE\u5904\u5206\u652F \xB7 \u4E4B\u540E {n} \u6761\u8BB0\u5F55\u4E0D\u5E26\u8D70","ext.forkBusy":"\u5F53\u524D\u4F1A\u8BDD\u6B63\u5728\u8FD0\u884C\uFF0C\u7B49\u8FD9\u4E00\u8F6E\u7ED3\u675F\u518D\u5206\u652F","ext.forkEmpty":"\u8FD9\u4E2A\u4F1A\u8BDD\u8FD8\u6CA1\u6709\u8BB0\u5F55\uFF0C\u6CA1\u6709\u53EF\u5206\u652F\u7684\u5185\u5BB9","ext.forkSuffix":" \xB7 \u5206\u652F","ext.forkMissing":"\u6CA1\u6709\u627E\u5230\u8981\u5206\u652F\u7684\u90A3\u6761\u63D0\u95EE\uFF08\u53EF\u80FD\u5DF2\u88AB\u6E05\u7406\uFF09","ext.cancelled":"\u5DF2\u53D6\u6D88\uFF1A\u4F1A\u8BDD\u5DF2\u5173\u95ED\u6216\u5220\u9664","ext.noPlan":"\u6CA1\u6709\u53EF\u6267\u884C\u7684\u8BA1\u5212\uFF1A\u8BA1\u5212\u6587\u4EF6\u5DF2\u88AB\u5220\u9664\u6216\u4E3A\u7A7A","ext.notPlanFile":"\u4E0D\u662F\u53EF\u8BFB\u53D6\u7684\u8BA1\u5212\u6587\u4EF6\uFF08Luban / Cursor\uFF09\uFF1A{path}","ext.browserNotFound":`\u6CA1\u627E\u5230 Chrome / Edge\uFF0C\u5185\u5EFA\u6D4F\u89C8\u5668\u4E0D\u53EF\u7528\u3002\u88C5\u4E0A Chrome\uFF0C\u6216\u5728\u8BBE\u7F6E luban.browser.chromePath \u91CC\u6307\u5B9A\u8DEF\u5F84\u3002\u5DF2\u5C1D\u8BD5\uFF1A
|
|
698
|
+
{paths}`,"ext.browserCheckRunning":"\u6B63\u5728\u68C0\u67E5\u5185\u5EFA\u6D4F\u89C8\u5668\u2026","ext.browserCheckOk":"\u5185\u5EFA\u6D4F\u89C8\u5668\u53EF\u7528\uFF1A{exe}\uFF08\u6D4B\u8BD5\u622A\u56FE\u7EA6 {chars} KB\uFF09","ext.browserCheckFailed":"\u5185\u5EFA\u6D4F\u89C8\u5668\u68C0\u67E5\u5931\u8D25\uFF1A{message}","ext.cursorPlanPick":"\u9009\u62E9\u8981\u6267\u884C\u7684 Cursor \u8BA1\u5212\uFF08~/.cursor/plans\uFF09","ext.cursorPlanNone":"\u6CA1\u6709\u627E\u5230 Cursor \u8BA1\u5212\uFF1A{dir} \u4E3A\u7A7A","ext.cursorPlanReadFail":"\u8BFB\u53D6 Cursor \u8BA1\u5212\u5931\u8D25\uFF1A{msg}","ext.cursorPlanBig":"Cursor \u8BA1\u5212\u6587\u4EF6\u8D85\u8FC7 {n}KB\uFF0C\u65E0\u6CD5\u6267\u884C","ext.cursorPlanNoPanel":"Luban \u9762\u677F\u6CA1\u6709\u5C31\u7EEA\uFF0C\u8BF7\u6253\u5F00\u9762\u677F\u540E\u91CD\u8BD5","ext.stop.final":"\u5B8C\u6210","ext.stop.maxRounds":"\u8FBE\u5230\u8F6E\u6570\u4E0A\u9650","ext.stop.timeout":"\u8D85\u51FA\u65F6\u95F4\u9884\u7B97","ext.stop.context":"\u4E0A\u4E0B\u6587\u9884\u7B97\u8017\u5C3D","ext.stop.loop":"\u68C0\u6D4B\u5230\u91CD\u590D\u8C03\u7528","ext.stop.errors":"\u8FDE\u7EED\u5DE5\u5177\u62A5\u9519","ext.stop.stopped":"\u5DF2\u505C\u6B62","ext.stop.noWrites":"\u672C\u8F6E\u672A\u4FEE\u6539\u6587\u4EF6","ext.summary.exec":"\u8BA1\u5212\u5DF2\u6267\u884C \xB7 {n} \u6B21\u5DE5\u5177\u8C03\u7528 \xB7 {s}s","ext.summary.chat":"\u5B8C\u6210 \xB7 {model}","ext.summary.plan":"\u8BA1\u5212\u5C31\u7EEA \xB7 \u53EA\u8BFB {n} \u6B21\u5DE5\u5177\u8C03\u7528 \xB7 {s}s","ext.summary.done":"\u5B8C\u6210 \xB7 {n} \u6B21\u5DE5\u5177\u8C03\u7528 \xB7 {s}s","ext.summary.fallback":"\uFF08\u672C\u8F6E\u56E0{reason}\u7ED3\u675F\uFF0C\u5171 {n} \u6B21\u5DE5\u5177\u8C03\u7528\uFF0C\u672A\u751F\u6210\u6536\u5C3E\u603B\u7ED3\uFF09","ext.summary.fallbackShort":"\uFF08\u672C\u8F6E\u56E0{reason}\u7ED3\u675F\uFF0C\u5171 {n} \u6B21\u5DE5\u5177\u8C03\u7528\uFF09","ext.summary.noWrites":"\u672C\u8F6E\u8C03\u7528\u4E86\u5DE5\u5177\u4F46\u672A\u4FEE\u6539\u4EFB\u4F55\u6587\u4EF6\uFF08\u65E0\u6210\u529F\u7684 write_file / replace_in_file\uFF09\u3002\u82E5\u4ECD\u9700\u6539\u4EE3\u7801\uFF0C\u8BF7\u660E\u786E\u8BF4\u300C\u7EE7\u7EED\u6539\u6587\u4EF6\u300D\uFF1B\u82E5\u53EA\u9700\u7ED3\u8BBA\uFF0C\u53EF\u5FFD\u7565\u672C\u63D0\u793A\u3002","ext.prefixHint":"\u524D\u7F00\u7F13\u5B58 0 \u547D\u4E2D \xB7 \u5EFA\u8BAE\u5F00\u542F\u7AEF\u70B9 KV \u7F13\u5B58","ext.prefixHintTip":"{n} \u6B21\u8BF7\u6C42\u5168\u90E8\u91CD\u7B97\uFF0C\u524D\u7F00\u7F13\u5B58\u4E00\u6B21\u90FD\u6CA1\u547D\u4E2D\u3002\u672C\u5730 vLLM \u8BF7\u52A0 --enable-prefix-caching\uFF08Docker \u73AF\u5883\u53D8\u91CF VLLM_ENABLE_PREFIX_CACHING=1\uFF0C\u5177\u4F53\u4EE5 vllm serve --help \u4E3A\u51C6\uFF09\uFF1BSGLang \u9ED8\u8BA4\u5F00\u542F\uFF1BOllama \u4E0D\u652F\u6301\u3002\u5F00\u542F\u540E\u672C\u884C\u4F1A\u51FA\u73B0\u300C\u7F13\u5B58 N%\u300D\u3002","ext.inlineOn":"Luban Tab \u8865\u5168\u5DF2\u5F00\u542F","ext.inlineOff":"Luban Tab \u8865\u5168\u5DF2\u5173\u95ED","ext.agentDone":"agent \u5B8C\u6210\uFF0C\u5DE5\u5177\u8C03\u7528 {n} \u6B21","ext.askNeeded":"Luban \u9700\u8981\u4F60\u9009\u62E9\uFF1A{detail}","ext.askGoChoose":"\u53BB\u9009\u62E9","ext.configReloaded":"provider \u914D\u7F6E\u5DF2\u91CD\u8F7D\uFF1A{models} \u4E2A\u6A21\u578B \xB7 {skills} \u4E2A\u6280\u80FD","ext.mcpNote":" \xB7 MCP {servers} \u4E2A server / {tools} \u4E2A\u5DE5\u5177","ext.mcpFail":" \xB7 MCP \u91CD\u8F7D\u5931\u8D25\uFF1A{msg}","ext.newSessionNotice":"Luban\uFF1A\u5DF2\u5F00\u59CB\u65B0\u4F1A\u8BDD","ext.addFileNoView":"\u65E0\u6CD5\u6253\u5F00 Luban \u804A\u5929\u9762\u677F\uFF1A\u8BF7\u5148\u6253\u5F00 Luban \u4FA7\u8FB9\u680F\u518D\u8BD5","ext.agentPrompt":"agent \u8981\u505A\u4EC0\u4E48\uFF1F\uFF08\u6539\u4EE3\u7801/\u751F\u6210\u4EE3\u7801\uFF09","ext.hubPanelTitle":"\u8BBE\u7F6E\u4E0E\u7528\u91CF","ext.providerTimeout":"\u8D85\u65F6\uFF0815s\uFF09","ext.providerBadJson":"\u8FD4\u56DE\u4E0D\u662F JSON\uFF1A{head}","ext.providerBaseUrl":"baseUrl \u4E3A\u7A7A","ext.providerNeedModel":"\u5148\u586B\u4E00\u4E2A\u6A21\u578B id \u518D\u6D4B\u8BD5","ext.providerNeedKey":"\u7F3A\u5C11 API key\uFF08\u5148\u5728\u9762\u677F\u91CC\u586B\uFF0C\u6216\u914D apiKeyEnv\uFF09","ext.configMissing":"\u914D\u7F6E\u6587\u4EF6\u8FD8\u4E0D\u5B58\u5728\uFF0C\u5148\u70B9\u4FDD\u5B58","ext.saveFailed":"\u4FDD\u5B58\u5931\u8D25\uFF1A{msg}","ext.generalMissing":"\u7F3A\u5C11\u8BBE\u7F6E\u9879\uFF1A{key}","ext.generalBadBool":"\u300C{key}\u300D\u5FC5\u987B\u662F\u5E03\u5C14\u503C","ext.generalBadLanguage":"\u754C\u9762\u8BED\u8A00\u53EA\u80FD\u662F auto / en / zh-cn / ja","ext.generalBadEnum":"\u300C{key}\u300D\u53EA\u80FD\u662F {values}","ext.generalBadNumber":"\u300C{key}\u300D\u5FC5\u987B\u662F\u6574\u6570","ext.generalBadMin":"\u300C{key}\u300D\u4E0D\u80FD\u5C0F\u4E8E {min}","ext.generalBadMax":"\u300C{key}\u300D\u4E0D\u80FD\u5927\u4E8E {max}","ext.generalSaveFailed":"\u4FDD\u5B58\u5E38\u89C4\u8BBE\u7F6E\u5931\u8D25\uFF1A{msg}","ext.openDirFailed":"\u6253\u4E0D\u5F00\u6570\u636E\u76EE\u5F55\uFF1A{msg}","validate.providerEmpty":"provider id \u4E0D\u80FD\u4E3A\u7A7A","validate.pos":"provider\u300C{id}\u300D","validate.untitled":"\uFF08\u672A\u547D\u540D\uFF09","validate.idChars":"{pos}\uFF1Aid \u53EA\u80FD\u7528\u5B57\u6BCD\u3001\u6570\u5B57\u3001\u4E0B\u5212\u7EBF\u548C\u77ED\u6A2A\u7EBF","validate.idDup":"{pos}\uFF1Aid \u91CD\u590D","validate.baseUrl":"{pos}\uFF1AbaseUrl \u5FC5\u987B\u4EE5 http:// \u6216 https:// \u5F00\u5934","validate.modelIdEmpty":"{pos}\uFF1A\u6A21\u578B id \u4E0D\u80FD\u4E3A\u7A7A","validate.modelIdDup":"{pos}\uFF1A\u6A21\u578B id\u300C{id}\u300D\u91CD\u590D","validate.maxIn":"{pos}\uFF1A\u6A21\u578B\u300C{id}\u300DmaxInputTokens \u5FC5\u987B\u662F\u6B63\u6574\u6570","validate.maxOut":"{pos}\uFF1A\u6A21\u578B\u300C{id}\u300DmaxOutputTokens \u5FC5\u987B\u662F\u6B63\u6574\u6570","validate.noModels":"{pos}\uFF1A\u81F3\u5C11\u9700\u8981\u4E00\u4E2A\u6A21\u578B","validate.webUrl":"{pos}\uFF1AwebSearch.baseUrl \u5FC5\u987B\u4EE5 http:// \u6216 https:// \u5F00\u5934","validate.webCount":"{pos}\uFF1AwebSearch.count \u5FC5\u987B\u662F 1~50 \u7684\u6574\u6570","validate.webEngine":"{pos}\uFF1AwebSearch.engine \u53EA\u80FD\u662F deepseek \u6216 bing","validate.webDisabled":"{pos}\uFF1AwebSearch.disabled \u5FC5\u987B\u662F\u5E03\u5C14\u503C","validate.thinkShape":'{pos}\uFF1A\u6A21\u578B\u300C{id}\u300Dthinking \u5FC5\u987B\u662F\u5BF9\u8C61\uFF08\u5F62\u5982 { "default": "off", "on": {...}, "off": {...} }\uFF09',"validate.thinkTier":"{pos}\uFF1A\u6A21\u578B\u300C{id}\u300Dthinking.{tier} \u5FC5\u987B\u662F JSON \u5BF9\u8C61","validate.thinkReserved":"{pos}\uFF1A\u6A21\u578B\u300C{id}\u300Dthinking.{tier} \u4E0D\u80FD\u7528\u534F\u8BAE\u5B57\u6BB5\uFF1A{keys}","validate.thinkTooLong":"{pos}\uFF1A\u6A21\u578B\u300C{id}\u300Dthinking.{tier} \u8D85\u8FC7 {n} \u5B57\u7B26","validate.thinkEmpty":"{pos}\uFF1A\u6A21\u578B\u300C{id}\u300Dthinking \u81F3\u5C11\u8981\u6709 on \u6216 off \u5176\u4E2D\u4E00\u6863","validate.needProvider":"\u81F3\u5C11\u9700\u8981\u4E00\u4E2A provider","usage.today":"\u4ECA\u5929","usage.7d":"\u8FD1 7 \u5929","usage.30d":"\u8FD1 30 \u5929","usage.all":"\u5168\u90E8","dash.title":"Token \u7528\u91CF","dash.statusReady":"\u5C31\u7EEA","dash.refresh":"\u5237\u65B0","dash.refreshTitle":"\u91CD\u65B0\u8BFB\u4E00\u904D\u8D26\u672C","dash.emptyA":"\u8FD8\u6CA1\u6709\u8BB0\u5F55\u3002","dash.emptyB":"\u8DD1\u4E00\u8F6E\u5BF9\u8BDD\u540E\u4F1A\u81EA\u52A8\u51FA\u73B0 \u2014\u2014 \u6BCF\u8F6E\u7ED3\u675F\u628A\u6574\u8F6E token \u6C47\u603B\u8FFD\u52A0\u5230\u672C\u5730\u8D26\u672C\u3002","dash.byModel":"\u6309\u6A21\u578B","dash.byDay":"\u6309\u5929","dash.byMode":"\u6309\u6A21\u5F0F","dash.recent":"\u6700\u8FD1\u8BB0\u5F55","dash.thModel":"\u6A21\u578B","dash.thRequests":"\u8BF7\u6C42","dash.thInput":"\u8F93\u5165","dash.thOutput":"\u8F93\u51FA","dash.thTotal":"\u5408\u8BA1","dash.thCache":"\u7F13\u5B58\u547D\u4E2D","dash.thShare":"\u5360\u6BD4","dash.thMode":"\u6A21\u5F0F","dash.thTurns":"\u8F6E\u6570","dash.thTime":"\u65F6\u95F4","dash.openDir":"\u6253\u5F00\u6570\u636E\u76EE\u5F55","dash.dirTitle":"\u8D26\u672C\u76EE\u5F55","dash.foot":"\u53EA\u7EDF\u8BA1 token\uFF0C\u4E0D\u4F30\u7B97\u8D39\u7528","dash.modeExecute":"\u6267\u884C\u8BA1\u5212","dash.modeUnknown":"\u672A\u77E5","dash.loading":"\u52A0\u8F7D\u4E2D\u2026","dash.turns":"\u8F6E\u6570","dash.requests":"\u8BF7\u6C42\u6B21\u6570","dash.input":"\u8F93\u5165","dash.output":"\u8F93\u51FA","dash.total":"\u5408\u8BA1","dash.cache":"\u7F13\u5B58\u547D\u4E2D","dash.partial":"{n} \u8F6E\u4E2D\u65AD\u8865\u8BB0","dash.perTurn":"\u6BCF\u8F6E {n} \u6B21","dash.estTurns":"\u542B {n} \u8F6E\u4F30\u7B97","dash.cached":"{n} \u8D70\u7F13\u5B58","dash.models":"{n} \u4E2A\u6A21\u578B","dash.unknownModel":"\u672A\u77E5\u6A21\u578B","dash.days":"{n} \u5929 \xB7 \u84DD=\u8F93\u5165 \u7EFF=\u8F93\u51FA","dash.dayTip":"{day} \xB7 \u2191{input} \u2193{output} \xB7 {n} \u6B21\u8BF7\u6C42","dash.recentCount":"{n} \u6761\uFF08\u6700\u591A 50\uFF09","dash.interrupted":" \xB7 \u4E2D\u65AD","dash.recordOff":"\u7528\u91CF\u8BB0\u8D26\u5DF2\u5173\u95ED\uFF08luban.usage.record=false\uFF09\uFF0C\u8FD9\u4E00\u8F6E\u8D77\u4E0D\u518D\u5199\u65B0\u8BB0\u5F55\u3002","dash.badLines":"\u8D26\u672C\u91CC\u6709 {n} \u884C\u89E3\u6790\u5931\u8D25\uFF0C\u5DF2\u8DF3\u8FC7\u3002","dash.noRecords":"\u65E0\u8BB0\u5F55","dash.statusTurns":"{n} \u8F6E","hub.title":"\u8BBE\u7F6E\u4E0E\u7528\u91CF","hub.navGeneral":"\u5E38\u89C4","hub.navSettings":"\u8BBE\u7F6E","hub.navUsage":"\u7528\u91CF","hub.navGeneralTitle":"Luban \u81EA\u8EAB\u8BBE\u7F6E\uFF08\u8BED\u8A00 / \u4E0A\u4E0B\u6587 / Agent \u7B49\uFF09","hub.navSettingsTitle":"Provider \u8BBE\u7F6E\uFF08\u6A21\u578B / baseUrl / API key\uFF09","hub.navUsageTitle":"Token \u7528\u91CF\u770B\u677F\uFF08\u5404\u6A21\u578B / \u6309\u5929 / \u6309\u6A21\u5F0F\uFF09","general.title":"\u5E38\u89C4","general.statusReady":"\u5C31\u7EEA","general.save":"\u4FDD\u5B58","general.unsaved":"\u672A\u4FDD\u5B58","general.saving":"\u4FDD\u5B58\u4E2D\u2026","general.loaded":"\u5DF2\u52A0\u8F7D","general.saved":"\u5DF2\u4FDD\u5B58","general.invalid":"{n} \u9879\u6821\u9A8C\u5931\u8D25","general.groupUi":"\u754C\u9762","general.groupContext":"\u81EA\u52A8\u4E0A\u4E0B\u6587","general.groupSession":"\u4F1A\u8BDD","general.groupAgent":"Agent","general.groupTools":"\u5DE5\u5177\u4E0E\u5B89\u5168","general.groupBrowser":"\u6D4F\u89C8\u5668\uFF08\u6269\u5C55\u8BBE\u7F6E\uFF09","general.groupReview":"\u5BA1\u9605","general.groupInline":"Tab \u8865\u5168","general.groupUsage":"\u7528\u91CF","general.language":"\u754C\u9762\u8BED\u8A00","general.languageTitle":"\u53EA\u5F71\u54CD Luban \u754C\u9762\uFF0C\u4E0D\u6539\u7F16\u8F91\u5668\u663E\u793A\u8BED\u8A00","general.languageNote":"\u53EA\u5F71\u54CD Luban \u81EA\u5DF1\u7684\u754C\u9762\uFF0C\u4E0D\u6539 VS Code / VSCodium \u663E\u793A\u8BED\u8A00\uFF1B\u547D\u4EE4\u9762\u677F\u6807\u9898\u4ECD\u8DDF\u968F\u7F16\u8F91\u5668\u8BED\u8A00\u3002","general.langAuto":"\u8DDF\u968F VS Code \u663E\u793A\u8BED\u8A00","general.langZhCn":"\u7B80\u4F53\u4E2D\u6587","general.langEn":"English","general.langJa":"\u65E5\u672C\u8A9E","general.autoOpen":"\u542F\u52A8\u65F6\u81EA\u52A8\u6253\u5F00\u4FA7\u8FB9\u680F","general.contextAutoFile":"\u9644\u4E0A\u5F53\u524D\u7F16\u8F91\u5668\u4EE3\u7801","general.contextMaxChars":"\u5B57\u7B26\u4E0A\u9650","general.contextWindowLines":"\u65E0\u9009\u533A\u65F6\u7A97\u53E3\u884C\u6570","general.sessionHistoryMax":"\u5386\u53F2\u4F1A\u8BDD\u4E0A\u9650","general.sessionMemoryEnabled":"\u591A\u8F6E\u8BB0\u5FC6","general.sessionMemoryMaxTurns":"\u8BB0\u5FC6\u8F6E\u6570","general.sessionMemoryMaxChars":"\u8BB0\u5FC6\u5B57\u7B26\u9884\u7B97","general.agentMaxRounds":"\u8BF7\u6C42\u8F6E\u6570\u4E0A\u9650\uFF080=\u4E0D\u9650\uFF09","general.agentMaxMinutes":"\u5899\u949F\u4E0A\u9650\uFF08\u5206\u949F\uFF09","general.agentSubagentRounds":"\u5B50\u4EE3\u7406\u8F6E\u6570\uFF080=\u5173\u95ED\uFF09","general.agentSubagentMinutes":"\u5B50\u4EE3\u7406\u5899\u949F\uFF08\u5206\u949F\uFF0C0=\u968F\u7236\u8F6E\uFF09","general.agentSmallWindow":"\u5C0F\u7A97\u53E3\u6863","general.smallWindowAuto":"\u81EA\u52A8\uFF08\u6309\u6A21\u578B\u7A97\u53E3\uFF09","general.smallWindowOn":"\u5F3A\u5236\u5F00\u542F","general.smallWindowOff":"\u5173\u95ED","general.agentVerbosity":"\u8BE6\u7EC6\u7A0B\u5EA6","general.verbosityConcise":"\u7B80\u6D01\uFF08\u4E00\u53E5\u8BDD\uFF09","general.verbosityNormal":"\u6807\u51C6\uFF08\u7B80\u77ED\u6C47\u62A5\uFF09","general.verbosityDetailed":"\u8BE6\u7EC6\uFF08\u7ED3\u6784\u5316\uFF09","general.contextWorkset":"\u6539\u52A8\u6587\u4EF6\u81EA\u52A8\u8FDB\u4E0A\u4E0B\u6587","general.searchMaxFiles":"search_code \u7D22\u5F15\u6587\u4EF6\u4E0A\u9650","general.planStrictReadOnly":"Plan \u6A21\u5F0F\u4E25\u683C\u53EA\u8BFB","general.fsAllowOutside":"\u5141\u8BB8\u5DE5\u4F5C\u533A\u5916\u8DEF\u5F84","general.diagAfterEdit":"\u5199\u5165\u540E\u81EA\u52A8\u8BFB\u8BCA\u65AD","general.browserEnabled":"\u542F\u7528\u5185\u5EFA\u6D4F\u89C8\u5668\u5DE5\u5177","general.browserHeadless":"\u65E0\u5934\u8FD0\u884C\uFF08\u4E0D\u5F39\u7A97\u53E3\uFF09","general.browserViewportWidth":"\u89C6\u53E3\u5BBD\u5EA6\uFF08320~4096\uFF09","general.browserViewportHeight":"\u89C6\u53E3\u9AD8\u5EA6\uFF08240~4096\uFF09","general.browserIdleTimeoutMs":"\u7A7A\u95F2\u8D85\u65F6\uFF08\u6BEB\u79D2\uFF09","general.browserChromePath":"Chrome / Edge \u8DEF\u5F84","general.browserChromePathPh":"\u7559\u7A7A\u81EA\u52A8\u63A2\u6D4B\uFF08\u4E5F\u8BA4 LUBAN_CHROME_PATH\uFF09","general.browserNote":"\u53EA\u8BFB\u5DE5\u5177\uFF1A\u6253\u5F00\u9875\u9762 / \u53EF\u8BBF\u95EE\u6027\u5927\u7EB2 / \u622A\u56FE / console / \u5931\u8D25\u8BF7\u6C42\uFF0C\u4E0D\u80FD\u70B9\u51FB\u6216\u8F93\u5165\u3002\u9700\u8981\u672C\u673A\u5DF2\u88C5 Chrome \u6216 Edge\uFF1B\u5173\u6389\u65F6\u5DE5\u5177\u4E0D\u4F1A\u51FA\u73B0\u5728\u6A21\u578B\u6E05\u5355\u91CC\u3002","general.groupComputer":"\u684C\u9762\u64CD\u4F5C\uFF08macOS / Windows\uFF09","general.computerEnabled":"\u542F\u7528\u684C\u9762\u64CD\u4F5C\u5DE5\u5177","general.computerConfirm":"\u52A8\u9F20\u6807\u952E\u76D8\u524D\u786E\u8BA4\u4E00\u6B21","general.computerScreenshotWidth":"\u622A\u56FE\u6700\u5927\u5BBD\u5EA6\uFF08320~4096\uFF09","general.computerNote":"\u622A\u5C4F / \u8BC6\u522B\u6587\u5B57\uFF08Windows \u6682\u4E0D\u652F\u6301\uFF0C\u4F1A\u9000\u56DE\u8BA9\u4F60\u770B\u56FE\uFF09/ \u5217\u7A97\u53E3 / \u70B9\u51FB / \u8F93\u5165 / \u6309\u952E / \u6EDA\u52A8 / \u62D6\u52A8\u3002macOS \u4E0E Windows \u53EF\u7528\uFF1BPlan \u6A21\u5F0F\u4E0D\u53EF\u7528\u3002macOS \u9700\u8981\u7ED9\u5BBF\u4E3B App\u300C\u5C4F\u5E55\u5F55\u5236\u300D\u4E0E\u300C\u8F85\u52A9\u529F\u80FD\u300D\u6743\u9650\uFF0C\u5426\u5219\u622A\u56FE\u4F1A\u5931\u8D25\u3001\u70B9\u51FB\u4F1A\u88AB\u7CFB\u7EDF\u4E22\u5F03\uFF1BWindows \u65E0\u9700\u6388\u6743\uFF0C\u4F46\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C\u7684\u7A97\u53E3\u6536\u4E0D\u5230\u666E\u901A\u8FDB\u7A0B\u7684\u70B9\u51FB\u3002","general.reviewAutoOpenDiff":"\u5199\u5165\u540E\u81EA\u52A8\u6253\u5F00 diff","general.inlineEnabled":"\u542F\u7528 Tab \u8865\u5168","general.inlineMaxPerMinute":"\u6BCF\u5206\u949F\u8BF7\u6C42\u4E0A\u9650","general.inlineDebounceMs":"\u9632\u6296\u5EF6\u8FDF\uFF08\u6BEB\u79D2\uFF09","general.usageRecord":"\u8BB0\u5F55 token \u7528\u91CF","general.errLanguage":"\u754C\u9762\u8BED\u8A00\u53EA\u80FD\u662F auto / en / zh-cn / ja","general.errEnum":"\u300C{key}\u300D\u53D6\u503C\u4E0D\u5408\u6CD5","general.errNumber":"\u300C{key}\u300D\u5FC5\u987B\u662F\u6574\u6570","general.errMin":"\u300C{key}\u300D\u4E0D\u80FD\u5C0F\u4E8E {min}","general.errMax":"\u300C{key}\u300D\u4E0D\u80FD\u5927\u4E8E {max}","settings.title":"Provider \u8BBE\u7F6E","settings.statusReady":"\u5C31\u7EEA","settings.save":"\u4FDD\u5B58","settings.defaultModel":"\u9ED8\u8BA4\u6A21\u578B","settings.defaultModelTitle":"\u9762\u677F\u5E95\u90E8\u4E0B\u62C9\u7684\u521D\u59CB\u9009\u4E2D\u9879","settings.defaultModelNote":"\u6A21\u578B id \u8DE8 provider \u91CD\u540D\u65F6\u4F1A\u81EA\u52A8\u52A0 <code>providerId::modelId</code> \u524D\u7F00\u3002API key \u5B58\u8FDB VS Code SecretStorage\uFF0C\u4E0D\u5199\u8FDB\u914D\u7F6E\u6587\u4EF6\u3002","settings.addProvider":"+ \u6DFB\u52A0 provider","settings.openConfig":"\u6253\u5F00 providers.json","settings.unsaved":"\u672A\u4FDD\u5B58","settings.firstModel":"\uFF08\u7528\u7B2C\u4E00\u4E2A\u6A21\u578B\uFF09","settings.noModel":"\uFF08\u8FD8\u6CA1\u6709\u6A21\u578B\uFF09","settings.modelIdPh":"model id\uFF08\u5FC5\u586B\uFF09","settings.modelNamePh":"\u663E\u793A\u540D\uFF08\u53EF\u9009\uFF09","settings.toolCallingTitle":"toolCalling\uFF1A\u53C2\u4E0E Agent \u6A21\u5F0F\u5FC5\u987B\u52FE\u4E0A","settings.visionTitle":"vision\uFF1A\u6A21\u578B\u652F\u6301\u56FE\u7247\u8F93\u5165\uFF08\u8D34\u56FE\u8FDB\u804A\u5929\u6846\uFF09","settings.thinkTitle":"thinking\uFF1A\u601D\u8003\u6863\u4F4D\u3002on / off \u91CC\u7684 JSON \u4F1A\u539F\u6837\u5408\u5E76\u8FDB\u8BF7\u6C42\u4F53\uFF08\u5982 chat_template_kwargs.enable_thinking\u3001reasoning\u3001think\uFF09\uFF1B\u7A7A\u7740\u8868\u793A\u8FD9\u4E00\u6863\u4E0D\u53D1\u53C2\u6570\u3002\u53EF\u7528\u300C\u586B\u5165\u6A21\u677F\u300D\u751F\u6210\u5E38\u89C1\u65B9\u8A00","settings.thinkDefault":"\u9ED8\u8BA4\u6863","settings.thinkDefaultOff":"\u9ED8\u8BA4\uFF1A\u5173","settings.thinkDefaultOn":"\u9ED8\u8BA4\uFF1A\u5F00","settings.thinkPreset":"\u586B\u5165\u6A21\u677F\u2026","settings.thinkPresetQwen":"Qwen / vLLM","settings.thinkPresetDeepseek":"DeepSeek","settings.thinkPresetOpenrouter":"OpenRouter","settings.thinkPresetAnthropic":"Anthropic \u517C\u5BB9","settings.thinkPresetOllama":"Ollama","settings.thinkPresetOverwrite":"\u5F53\u524D on / off \u5DF2\u6709\u5185\u5BB9\uFF0C\u8981\u7528\u6A21\u677F\u8986\u76D6\u5417\uFF1F","settings.thinkOn":"\u5F00\uFF08on\uFF09","settings.thinkOff":"\u5173\uFF08off\uFF09","settings.thinkOnPh":'\u7559\u7A7A = \u4E0D\u53D1\u9001\u3002\u4F8B\uFF1A{ "chat_template_kwargs": { "enable_thinking": true } }',"settings.thinkOffPh":'\u7559\u7A7A = \u4E0D\u53D1\u9001\u3002\u4F8B\uFF1A{ "thinking": { "type": "disabled" } }',"settings.thinkBadJson":"{pos} \u6A21\u578B\u300C{id}\u300Dthinking.{tier} \u4E0D\u662F\u5408\u6CD5 JSON","settings.thinkBadShape":"{pos} \u6A21\u578B\u300C{id}\u300Dthinking.{tier} \u5FC5\u987B\u662F JSON \u5BF9\u8C61\uFF08\u4E0D\u80FD\u662F\u6570\u7EC4\u6216\u6807\u91CF\uFF09","settings.deleteModel":"\u5220\u9664\u8FD9\u4E2A\u6A21\u578B","settings.providerNamePh":"provider \u540D\u79F0\uFF08\u5982 DeepSeek\uFF09","settings.deleteProvider":"\u5220\u9664 provider","settings.idLabel":"id\uFF08\u552F\u4E00\uFF0C\u5B57\u6BCD/\u6570\u5B57/_/-\uFF09","settings.apiKeyEnvLabel":"apiKeyEnv\uFF08\u53EF\u9009\uFF09","settings.keyLabel":"API key\uFF08\u5B58 VS Code SecretStorage\uFF09","settings.keyPhSaved":"\u5DF2\u4FDD\u5B58\uFF0C\u7559\u7A7A\u8868\u793A\u4E0D\u6539","settings.keyPh":"sk-\u2026\uFF08\u53EA\u5199\u8FDB SecretStorage\uFF09","settings.clearKey":"\u6E05\u9664 key","settings.test":"\u6D4B\u8BD5\u8FDE\u63A5","settings.testing":"\u6D4B\u8BD5\u4E2D\u2026\uFF08\u7528\u7B2C\u4E00\u4E2A\u6A21\u578B\uFF0Cmax_tokens=1\uFF09","settings.fetchModels":"\u62C9\u53D6\u6A21\u578B","settings.fetching":"\u8BF7\u6C42 /models\u2026","settings.modelsHead":"\u6A21\u578B\uFF08{n}\uFF09\xB7 id / \u663E\u793A\u540D / maxInputTokens / maxOutputTokens / toolCalling / vision / thinking","settings.addModel":"+ \u6DFB\u52A0\u6A21\u578B","settings.errors":"\u6709 {n} \u5904\u9700\u8981\u4FEE\u6B63\uFF1A","settings.noProviders":"\u8FD8\u6CA1\u6709 provider\uFF0C\u70B9\u4E0B\u9762\u300C+ \u6DFB\u52A0 provider\u300D\u5F00\u59CB\u3002","settings.saving":"\u4FDD\u5B58\u4E2D\u2026","settings.builtin":"\u5F53\u524D\u662F\u5185\u7F6E\u9ED8\u8BA4\u914D\u7F6E\uFF0C\u4FDD\u5B58\u540E\u5199\u5230 {path}","settings.loaded":"\u5DF2\u52A0\u8F7D","settings.saved":"\u5DF2\u4FDD\u5B58 \xB7 {n} \u4E2A\u6A21\u578B","settings.invalid":"\u6709 {n} \u5904\u95EE\u9898\uFF0C\u672A\u4FDD\u5B58","settings.testOk":"\u4E0A\u6B21\u6D4B\u8BD5 OK \xB7 {ms}ms","settings.testFailed":"\u4E0A\u6B21\u6D4B\u8BD5\u5931\u8D25","settings.testOkResult":"\u2705 HTTP {status} \xB7 {ms}ms{reply}","settings.testFailResult":"\u274C {msg}","settings.fail":"\u5931\u8D25","settings.fetchFail":"\u62C9\u53D6\u5931\u8D25","settings.fetched":"\u2705 \u62C9\u5230 {n} \u4E2A\u6A21\u578B","settings.fetchedAdded":"\uFF0C\u65B0\u589E {n} \u4E2A\uFF08\u8BB0\u5F97\u4FDD\u5B58\uFF09","settings.fetchedNone":"\uFF0C\u6CA1\u6709\u65B0\u6A21\u578B","settings.keySet":"\u4FDD\u5B58\u540E\u5199\u5165 SecretStorage\uFF08\u4E0D\u843D\u76D8\uFF09","settings.keyClear":"\u4FDD\u5B58\u540E\u5220\u9664\u5DF2\u5B58\u7684 key","settings.keySecret":"\u5DF2\u5B58\u5728 SecretStorage","settings.keyInline":"\u914D\u7F6E\u91CC\u6709\u660E\u6587 apiKey\uFF08\u4FDD\u5B58\u65F6\u4FDD\u7559\uFF09","settings.keyEnv":"\u4F7F\u7528\u73AF\u5883\u53D8\u91CF {env}\uFF08key \u4E0D\u5728\u9762\u677F\u91CC\uFF09","settings.keyNone":"\u672A\u8BBE\u7F6E key","settings.unnamedModel":"\u672A\u547D\u540D"},en:{"panel.statusReady":"Ready","panel.sessionsBtn":"Sessions","panel.sessionsTitle":"Session history (Cmd+Alt+H)","panel.newSessionBtn":"New session","panel.newSessionTitle":"New session (Cmd+Alt+N)","panel.hint":'Say "create xxx.js that \u2026" or "change xxx to \u2026" \u2014 the model edits workspace files directly.<br />Type <code>@</code> to reference a file or folder (<code>@src/</code> references a whole folder), <code>@web</code> to search the web first; to reference code, select it in the editor and right-click "Add Selection to Luban Chat" or press <code>Cmd/Ctrl+Alt+A</code> (the "# Selection" button / <code>#</code> works too) \u2014 the token carries file and line range, and you can stack several.',"panel.inputPlaceholder":"Describe the code to generate or change\u2026 (Enter to send, Shift+Enter for a newline; while running, Enter queues the message until this turn ends; @ references a file or folder, # references the selection; @web searches the web; IME candidate selection won't send)","panel.selectModelTitle":"Select provider / model","panel.modeTitle":"Mode (Shift+Tab to cycle)","panel.refSelectionBtn":"# Selection","panel.refSelectionTitle":"Reference an editor selection (select code, then right-click Add Selection to Luban Chat or press Cmd/Ctrl+Alt+A)","panel.webChip":"\u{1F310} Web","panel.webChipTitle":"This message searches the web first","panel.thinkChipDefault":"\u{1F9E0} Default","panel.thinkChipOn":"\u{1F9E0} On","panel.thinkChipOff":"\u{1F9E0} Off","panel.thinkChipTitle":"Thinking: {dflt}. Click to cycle (default / on / off); hidden when the model has no thinking config","panel.verbChipDefault":"\u270E Default","panel.verbChipConcise":"\u270E Concise","panel.verbChipNormal":"\u270E Normal","panel.verbChipDetailed":"\u270E Detailed","panel.verbChipTitle":'Agent verbosity: click to cycle (default / concise / normal / detailed), applies to this message only; "default" follows the luban.agent.verbosity setting',"panel.settingsTitle":"Provider settings (model / baseUrl / API key)","panel.send":"Send","panel.sendTitle":"Send (Enter)","panel.stop":"\u23F9 Stop","panel.stopTitle":"Stop the current task","panel.tabClose":"Close tab (cancels the running turn)","panel.tabTooltip":"Right-click: close / close others / close sides","panel.tabOverflowTitle":"More tabs","panel.menuClose":"Close","panel.menuCloseOthers":"Close others","panel.menuCloseRight":"Close to the right","panel.menuCloseLeft":"Close to the left","panel.menuCloseAll":"Close all","panel.menuCloseTitle":"A running turn will be cancelled","panel.jumpLatest":"\u2193 Latest","panel.jumpLatestTitle":"Back to the latest","panel.thinking":"Thinking\u2026","panel.thinkDone":"Thought process","panel.thinkLabel":"{label} \xB7 {n} chars","panel.roleYou":"You","panel.roleAssistant":"Assistant","panel.roleError":"Error","panel.toolLabel":"","panel.toolUnit":"tool calls","panel.toolsBad":"({n} failed)","panel.toolsLast":"\xB7 latest {name}","panel.refWholeDir":"\u{1F4C1} Reference entire {dir} ({n} files)","panel.refWeb":"\u{1F310} Web search (@web)","panel.imgBubble":"\u{1F4CE} Images \xD7{n}","panel.imgPreviewTitle":"Click to view full size (click again to close)","panel.imgLoadFail":"Image failed to load (file may have been cleaned up)","panel.imgRemoveTitle":"Remove this image","panel.imgNoVision":"Current model does not support image input; images were not attached. Enable vision for this model in Provider settings.","panel.imgTooBig":"Image over 5MB, skipped","panel.imgBadType":"Unsupported image format (PNG / JPEG / WebP / GIF only), skipped","panel.imgLimit":"At most 4 images; extras ignored","panel.imgReadFail":"Failed to read image, skipped","panel.copyMsg":"Copy message","panel.copied":"Copied","panel.copyFail":"Copy failed","panel.editMsg":"Edit this message","panel.editCancel":"Cancel","panel.editHint":"Sending deletes everything after this message and immediately resends the edited text","panel.editSending":"Resending\u2026","panel.editSaved":"Saved; removed {n} later items","panel.editSavedNone":"Saved","panel.editBusy":"Cannot edit history while a turn is running; stop it first","panel.forkMsgTitle":"Fork from this prompt (keep up to here)","panel.forking":"Forking session\u2026","panel.forkBusy":"Cannot fork while a turn is running; stop it first","panel.refLoadingFiles":"Loading files and folders\u2026","panel.refLoadingSelection":"Reading the current selection\u2026","panel.refNoMatchDir":"No matches in this folder","panel.refNoMatch":"No matching file or folder","panel.refNoEditor":"No editor to reference","panel.lines":"{n} lines","panel.files":"{n} files","panel.injected":"injected {n} full files","panel.truncated":"truncated","panel.omitted":"omitted","panel.sources":"Sources \xB7 {n}","panel.ctxTip":"Context {used} / {win} tokens ({pct}{model})","panel.ctxEst":"\u2248 means the endpoint returned no usage; estimated from character count","panel.usageCache":"Cache {n} ({pct})","panel.usageContext":"Context {used} / {win} ({pct})","panel.usageRequests":"{n} requests","panel.usageTipContext":"Context {used} / {win} tokens","panel.usageTipRequests":"{n} requests this turn","panel.usageTipModel":"Model: {model}","panel.usageTipEst":"\u2248 estimated (the endpoint returned no usage)","panel.reviewShowDiff":"View diff","panel.reviewKeepAll":"Keep all","panel.reviewDropAll":"Revert all","panel.reviewBlocks":"\xB7 {n} hunks","panel.reviewTitle":"Pending changes \xB7 {files} files / {hunks} hunks (+{add} -{del})","panel.reviewKeepAllFiles":"Keep all files","panel.reviewRejectAllFiles":"Revert all files","panel.reviewRejectAllConfirm":"Confirm revert all?","panel.reviewHint":'Details are in the editor diff: "Keep all / Revert all" in the title bar, "Keep this / Revert this" per hunk; click "View diff" to reopen. The two buttons on the right of the title apply to every file at once.',"panel.relJustNow":"just now","panel.relMinutes":"{n}m ago","panel.relHours":"{n}h ago","panel.relDays":"{n}d ago","panel.sessionsHead":"Session history \xB7 {n}","panel.sessionsSearchHead":"Session history \xB7 {n}/{total} matched","panel.sessionSearchPlaceholder":"Search session titles and message text\u2026","panel.sessionSearchTitle":"Search session history: titles filter as you type, 2+ characters also search message text","panel.sessionSearchClear":"Clear search (Esc)","panel.sessionSearchMinChars":"Type 2+ characters to also search message text","panel.sessionSearching":"Searching message text\u2026","panel.sessionSearchHits":"{n} sessions matched in text","panel.sessionSearchTruncated":" (limit reached)","panel.sessionContentHits":"{n} text matches","panel.sessionSearchNoMatch":"No matching sessions \u2014 both titles and message text were searched.","panel.sessionNew":"\uFF0B New session","panel.loading":"Loading\u2026","panel.sessionsEmptyAll":"No sessions yet \u2014 send your first message to create one.","panel.sessionsEmptyWs":'No sessions in this workspace yet. Click "Show other workspaces", or just send a message.',"panel.sessionItems":"{n} items","panel.noWorkspace":"No workspace","panel.deleteConfirm":"Delete?","panel.deleteConfirmTitle":"Click again to confirm (cannot be undone)","panel.deleteTitle":"Delete this session","panel.forkBtn":"Fork","panel.forkTitle":"Fork this session","panel.forkRound":"Fork up to here","panel.forkRoundTitle":"Keep this conversation up to this turn and start a new branch","panel.openingSession":"Opening the session\u2026","panel.scopeToWorkspace":"This workspace only","panel.scopeToAll":"Show other workspaces","panel.scopeTipAll":"Showing all workspaces","panel.scopeTipWs":"Showing this workspace only","panel.openingNew":"Starting a new session\u2026","panel.execPlanRunning":"Executing plan\u2026","panel.openPlanFile":"\u{1F4C4} Open plan file","panel.runPlan":"\u25B6 Execute this plan","panel.runPlanAccept":"\u25B6 Execute & keep changes","panel.runPlanAcceptTitle":"Run the plan and auto-keep all writes \u2014 skip pending review","panel.planSent":"Handed to the Agent\u2026","panel.planSaved":"Saved \xB7 {file}","panel.planReadonly":"Plan mode is read-only \u2014 no files were changed","panel.todosTitle":"Todos {done}/{total}","panel.todoPending":"Pending","panel.todoProgress":"In progress","panel.todoDone":"Done","panel.todoCancelled":"Cancelled","panel.askSubmit":"Confirm","panel.askMulti":"(multi-select)","panel.askNeedAll":"Please answer every question first","panel.askAnswered":"Answered","panel.askError":"Failed to submit choices","panel.askCancelled":"Cancelled (turn ended)","panel.askRecommended":"Recommended","panel.queueTitle":"{n} queued","panel.queuePausedTip":'Paused \xB7 click "Resume" to send',"panel.queueAutoTip":"Sends automatically when the current turn ends","panel.resume":"Resume","panel.resumeTitle":"Resume auto-sending: sends the next item immediately when idle","panel.clear":"Clear","panel.clearQueueTitle":"Clear the queue (does not affect the running turn)","panel.runNow":"Now","panel.runNowTitle":"Cancel the current turn and run this item now (keeps the rest of the queue)","panel.runNowStatus":"Requested run now\u2026","panel.edit":"Edit","panel.editTitle":"Take it back into the input box","panel.removeTitle":"Remove this item from the queue","panel.retrieved":"Took back the queued message","panel.resuming":"Resuming queued messages\u2026","panel.queued":"Queued \xB7 sends when the current turn ends","panel.searching":"Searching the web\u2026","panel.running":"Running\u2026","panel.stopRequested":"Stop requested","panel.noEditorSelection":"No open editor \u2014 cannot reference the selection","panel.noSelection":"Select some code in the editor first","panel.selectionRef":"# Reference: {path}:{start}-{end}","panel.fileRef":"Referenced {n} items","panel.selectionToken":"#selection {path}:{start}-{end} ({kind}, {n} lines)","panel.kindSelection":"selection","panel.kindFull":"full file","panel.done":"Done","panel.unknownError":"Unknown error","panel.error":"Error","panel.queueFailed":"Failed to queue","store.untitled":"New session","cross.execPlan":"\u25B6 Execute plan","cross.execPlanAccept":"\u25B6 Execute plan & keep changes","ext.keepHunk":"$(check) Keep this (+{add} -{del})","ext.revertHunk":"$(discard) Revert this","ext.viewDiff":"$(diff) View full diff","ext.keepFile":"$(check-all) Keep all (+{add} -{del})","ext.revertFile":"$(discard) Revert all","ext.diffTitle":"Luban changes: {file} (+{add} -{del})","ext.noPending":"No pending changes: {path}","ext.hunkGone":"Cannot find {hunk} (the change moved; try again)","ext.unknownAction":"Unknown action: {action}","ext.noReviewFile":"No file to review","ext.removedGhost":" <- deleted {n} line(s): {text}","ext.actionFailed":"the action failed","ext.reviewWarn":"Luban review: {msg}","ext.queueFull":"The queue is full (max {n}); finish or clear it first","ext.queueEmpty":"Empty message; nothing was queued","ext.addSelectionNone":"Nothing is selected in the editor; reference not inserted","ext.queueMissing":"That item is not in the queue","ext.imgNoVision":"Current model does not support images; attachments ignored","ext.noSuchSession":"No such session: {id}","ext.sessionBusy":"This session is already running; try executing the plan later","ext.editBusy":"This session is running; sent messages cannot be edited right now","ext.editMissing":"The message to edit was not found (it may have been trimmed)","ext.editEmpty":"Edited content cannot be empty","ext.forkPickTitle":"Fork session","ext.forkPickPlaceholder":"Copy everything, or pick a prompt to branch from","ext.forkWhole":"Copy the whole session","ext.forkWholeDesc":"Keep all {n} records","ext.forkFromDesc":"Branch from this prompt \xB7 the {n} records after it are left out","ext.forkBusy":"This session is running; fork it after the current turn ends","ext.forkEmpty":"This session has nothing to fork yet","ext.forkSuffix":" \xB7 fork","ext.forkMissing":"The prompt to fork from was not found (it may have been trimmed)","ext.cancelled":"Cancelled: the session was closed or deleted","ext.noPlan":"Nothing to execute: the plan file was deleted or is empty","ext.notPlanFile":"Not a readable plan file (Luban / Cursor): {path}","ext.browserNotFound":`Chrome / Edge not found, the built-in browser is unavailable. Install Chrome or set luban.browser.chromePath. Tried:
|
|
699
|
+
{paths}`,"ext.browserCheckRunning":"Checking the built-in browser\u2026","ext.browserCheckOk":"Built-in browser works: {exe} (test screenshot ~{chars} KB)","ext.browserCheckFailed":"Built-in browser check failed: {message}","ext.cursorPlanPick":"Pick a Cursor plan to execute (~/.cursor/plans)","ext.cursorPlanNone":"No Cursor plans found: {dir} is empty","ext.cursorPlanReadFail":"Failed to read the Cursor plan: {msg}","ext.cursorPlanBig":"Cursor plan is larger than {n}KB and cannot be executed","ext.cursorPlanNoPanel":"Luban panel is not ready; open it and try again","ext.stop.final":"Done","ext.stop.maxRounds":"round limit reached","ext.stop.timeout":"time budget exceeded","ext.stop.context":"context budget exhausted","ext.stop.loop":"repeated calls detected","ext.stop.errors":"consecutive tool errors","ext.stop.stopped":"stopped","ext.stop.noWrites":"no files modified this turn","ext.summary.exec":"Plan executed \xB7 {n} tool calls \xB7 {s}s","ext.summary.chat":"Done \xB7 {model}","ext.summary.plan":"Plan ready \xB7 {n} read-only tool calls \xB7 {s}s","ext.summary.done":"Done \xB7 {n} tool calls \xB7 {s}s","ext.summary.fallback":'(The turn ended due to "{reason}" after {n} tool calls; no closing summary was generated)',"ext.summary.fallbackShort":'(The turn ended due to "{reason}" after {n} tool calls)',"ext.summary.noWrites":"Tools ran this turn but no files were modified (no successful write_file / replace_in_file). Say \u201Ccontinue editing files\u201D if you still need changes; otherwise you can ignore this note.","ext.prefixHint":"prefix cache 0% hit \xB7 enable KV cache on the endpoint","ext.prefixHintTip":'All {n} requests were recomputed; the prefix cache never hit. For a local vLLM add --enable-prefix-caching (Docker env VLLM_ENABLE_PREFIX_CACHING=1; check vllm serve --help); SGLang enables it by default; Ollama does not support it. Once enabled this line shows "cache N%".',"ext.inlineOn":"Luban Tab completion enabled","ext.inlineOff":"Luban Tab completion disabled","ext.agentDone":"Agent finished \xB7 {n} tool calls","ext.askNeeded":"Luban needs your choice: {detail}","ext.askGoChoose":"Choose","ext.configReloaded":"Provider config reloaded: {models} models \xB7 {skills} skills","ext.mcpNote":" \xB7 MCP: {servers} servers / {tools} tools","ext.mcpFail":" \xB7 MCP reload failed: {msg}","ext.newSessionNotice":"Luban: new session started","ext.addFileNoView":"Cannot open the Luban chat panel: open the Luban sidebar first.","ext.agentPrompt":"What should the agent do? (edit/generate code)","ext.hubPanelTitle":"Settings & usage","ext.providerTimeout":"Timeout (15s)","ext.providerBadJson":"Response is not JSON: {head}","ext.providerBaseUrl":"baseUrl is empty","ext.providerNeedModel":"Enter a model id before testing","ext.providerNeedKey":"Missing API key (enter it in the panel or set apiKeyEnv)","ext.configMissing":"The config file does not exist yet \u2014 click Save first","ext.saveFailed":"Save failed: {msg}","ext.generalMissing":"Missing setting: {key}","ext.generalBadBool":'"{key}" must be a boolean',"ext.generalBadLanguage":"Language must be auto / en / zh-cn / ja","ext.generalBadEnum":'"{key}" must be one of {values}',"ext.generalBadNumber":'"{key}" must be an integer',"ext.generalBadMin":'"{key}" must be \u2265 {min}',"ext.generalBadMax":'"{key}" must be \u2264 {max}',"ext.generalSaveFailed":"Failed to save general settings: {msg}","ext.openDirFailed":"Cannot open the data directory: {msg}","validate.providerEmpty":"Provider id cannot be empty","validate.pos":'provider "{id}"',"validate.untitled":"(unnamed)","validate.idChars":"{pos}: id may only contain letters, digits, underscores and dashes","validate.idDup":"{pos}: duplicate id","validate.baseUrl":"{pos}: baseUrl must start with http:// or https://","validate.modelIdEmpty":"{pos}: model id cannot be empty","validate.modelIdDup":'{pos}: duplicate model id "{id}"',"validate.maxIn":'{pos}: model "{id}" maxInputTokens must be a positive integer',"validate.maxOut":'{pos}: model "{id}" maxOutputTokens must be a positive integer',"validate.noModels":"{pos}: at least one model is required","validate.webUrl":"{pos}: webSearch.baseUrl must start with http:// or https://","validate.webCount":"{pos}: webSearch.count must be an integer from 1 to 50","validate.webEngine":"{pos}: webSearch.engine must be deepseek or bing","validate.webDisabled":"{pos}: webSearch.disabled must be a boolean","validate.thinkShape":'{pos}: model "{id}" thinking must be an object (e.g. { "default": "off", "on": {...}, "off": {...} })',"validate.thinkTier":'{pos}: model "{id}" thinking.{tier} must be a JSON object',"validate.thinkReserved":'{pos}: model "{id}" thinking.{tier} cannot override protocol fields: {keys}',"validate.thinkTooLong":'{pos}: model "{id}" thinking.{tier} exceeds {n} characters',"validate.thinkEmpty":'{pos}: model "{id}" thinking needs at least one of on / off',"validate.needProvider":"At least one provider is required","usage.today":"Today","usage.7d":"Last 7 days","usage.30d":"Last 30 days","usage.all":"All time","dash.title":"Token usage","dash.statusReady":"Ready","dash.refresh":"Refresh","dash.refreshTitle":"Re-read the ledger","dash.emptyA":"No records yet.","dash.emptyB":"They appear after your first turn \u2014 each turn's token totals are appended to the local ledger.","dash.byModel":"By model","dash.byDay":"By day","dash.byMode":"By mode","dash.recent":"Recent records","dash.thModel":"Model","dash.thRequests":"Requests","dash.thInput":"Input","dash.thOutput":"Output","dash.thTotal":"Total","dash.thCache":"Cache hits","dash.thShare":"Share","dash.thMode":"Mode","dash.thTurns":"Turns","dash.thTime":"Time","dash.openDir":"Open data directory","dash.dirTitle":"Ledger directory","dash.foot":"Token counts only; no cost estimates","dash.modeExecute":"Execute plan","dash.modeUnknown":"unknown","dash.loading":"Loading\u2026","dash.turns":"Turns","dash.requests":"Requests","dash.input":"Input","dash.output":"Output","dash.total":"Total","dash.cache":"Cache hits","dash.partial":"{n} interrupted turn(s) backfilled","dash.perTurn":"{n} per turn","dash.estTurns":"includes {n} estimated turn(s)","dash.cached":"{n} from cache","dash.models":"{n} models","dash.unknownModel":"Unknown model","dash.days":"{n} days \xB7 blue=input green=output","dash.dayTip":"{day} \xB7 \u2191{input} \u2193{output} \xB7 {n} requests","dash.recentCount":"{n} records (max 50)","dash.interrupted":" \xB7 interrupted","dash.recordOff":"Usage recording is off (luban.usage.record=false) \u2014 no new records are written from this turn on.","dash.badLines":"{n} unreadable line(s) in the ledger were skipped.","dash.noRecords":"no records","dash.statusTurns":"{n} turns","hub.title":"Settings & usage","hub.navGeneral":"General","hub.navSettings":"Settings","hub.navUsage":"Usage","hub.navGeneralTitle":"Luban settings (language / context / Agent, \u2026)","hub.navSettingsTitle":"Provider settings (models / base URL / API keys)","hub.navUsageTitle":"Token usage dashboard (by model / day / mode)","general.title":"General","general.statusReady":"Ready","general.save":"Save","general.unsaved":"Unsaved","general.saving":"Saving\u2026","general.loaded":"Loaded","general.saved":"Saved","general.invalid":"{n} validation error(s)","general.groupUi":"Interface","general.groupContext":"Auto context","general.groupSession":"Session","general.groupAgent":"Agent","general.groupTools":"Tools & safety","general.groupBrowser":"Browser (extension setting)","general.groupReview":"Review","general.groupInline":"Tab completion","general.groupUsage":"Usage","general.language":"Interface language","general.languageTitle":"Affects Luban UI only, not the editor display language","general.languageNote":"Affects Luban\u2019s own UI only \u2014 not the VS Code / VSCodium display language. Command palette titles still follow the editor language.","general.langAuto":"Follow VS Code display language","general.langZhCn":"\u7B80\u4F53\u4E2D\u6587","general.langEn":"English","general.langJa":"\u65E5\u672C\u8A9E","general.autoOpen":"Open sidebar on startup","general.contextAutoFile":"Attach current editor code","general.contextMaxChars":"Character limit","general.contextWindowLines":"Window lines (no selection)","general.sessionHistoryMax":"Session history limit","general.sessionMemoryEnabled":"Multi-turn memory","general.sessionMemoryMaxTurns":"Memory turns","general.sessionMemoryMaxChars":"Memory character budget","general.agentMaxRounds":"Request round cap (0 = unlimited)","general.agentMaxMinutes":"Wall-clock limit (minutes)","general.agentSubagentRounds":"Sub-agent rounds (0 = off)","general.agentSubagentMinutes":"Sub-agent wall clock (min, 0 = follow turn)","general.agentSmallWindow":"Small-window mode","general.smallWindowAuto":"Auto (from model window)","general.smallWindowOn":"Force on","general.smallWindowOff":"Off","general.agentVerbosity":"Verbosity","general.verbosityConcise":"Concise (one line)","general.verbosityNormal":"Normal (short report)","general.verbosityDetailed":"Detailed (structured)","general.contextWorkset":"Working set in context","general.searchMaxFiles":"search_code index file cap","general.planStrictReadOnly":"Strict read-only in Plan mode","general.fsAllowOutside":"Allow paths outside workspace","general.diagAfterEdit":"Read diagnostics after writes","general.browserEnabled":"Enable the built-in browser tool","general.browserHeadless":"Run headless (no visible window)","general.browserViewportWidth":"Viewport width (320~4096)","general.browserViewportHeight":"Viewport height (240~4096)","general.browserIdleTimeoutMs":"Idle timeout (ms)","general.browserChromePath":"Chrome / Edge path","general.browserChromePathPh":"Empty = auto-detect (LUBAN_CHROME_PATH also honoured)","general.browserNote":"Read-only tool: open a page, accessibility outline, screenshot, console output and failed requests \u2014 no clicking or typing. Requires a local Chrome or Edge; while off the tool is not offered to the model at all.","general.groupComputer":"Desktop control (macOS / Windows)","general.computerEnabled":"Enable the desktop control tool","general.computerConfirm":"Confirm once before moving mouse / keyboard","general.computerScreenshotWidth":"Max screenshot width (320~4096)","general.computerNote":"Screenshot, read on-screen text (not available on Windows \u2014 it falls back to viewing the screenshot), list windows, click, type, press keys, scroll, drag. macOS and Windows; unavailable in Plan mode. On macOS the host app needs Screen Recording and Accessibility permissions, otherwise screenshots fail and clicks are silently dropped; on Windows no permission is needed, but windows running as administrator ignore input from a normal process.","general.reviewAutoOpenDiff":"Auto-open diff after writes","general.inlineEnabled":"Enable Tab completion","general.inlineMaxPerMinute":"Requests per minute","general.inlineDebounceMs":"Debounce delay (ms)","general.usageRecord":"Record token usage","general.errLanguage":"Language must be auto / en / zh-cn / ja","general.errEnum":'Invalid value for "{key}"',"general.errNumber":'"{key}" must be an integer',"general.errMin":'"{key}" must be \u2265 {min}',"general.errMax":'"{key}" must be \u2264 {max}',"settings.title":"Provider settings","settings.statusReady":"Ready","settings.save":"Save","settings.defaultModel":"Default model","settings.defaultModelTitle":"Initial selection of the panel's model dropdown","settings.defaultModelNote":"When model ids collide across providers a <code>providerId::modelId</code> prefix is added automatically. API keys go to VS Code SecretStorage, never the config file.","settings.addProvider":"+ Add provider","settings.openConfig":"Open providers.json","settings.unsaved":"Unsaved","settings.firstModel":"(first model)","settings.noModel":"(no models yet)","settings.modelIdPh":"model id (required)","settings.modelNamePh":"display name (optional)","settings.toolCallingTitle":"toolCalling: required to be used in Agent mode","settings.visionTitle":"vision: model supports image input (paste images into chat)","settings.thinkTitle":"thinking: thinking tiers. The JSON in on / off is merged into the request body as-is (e.g. chat_template_kwargs.enable_thinking, reasoning, think); empty means that tier sends nothing. Use Fill template to generate common dialects","settings.thinkDefault":"Default tier","settings.thinkDefaultOff":"Default: off","settings.thinkDefaultOn":"Default: on","settings.thinkPreset":"Fill template\u2026","settings.thinkPresetQwen":"Qwen / vLLM","settings.thinkPresetDeepseek":"DeepSeek","settings.thinkPresetOpenrouter":"OpenRouter","settings.thinkPresetAnthropic":"Anthropic-compatible","settings.thinkPresetOllama":"Ollama","settings.thinkPresetOverwrite":"on / off already have content. Overwrite with the template?","settings.thinkOn":"On (on)","settings.thinkOff":"Off (off)","settings.thinkOnPh":'Empty = not sent. e.g. { "chat_template_kwargs": { "enable_thinking": true } }',"settings.thinkOffPh":'Empty = not sent. e.g. { "thinking": { "type": "disabled" } }',"settings.thinkBadJson":'{pos} model "{id}" thinking.{tier} is not valid JSON',"settings.thinkBadShape":'{pos} model "{id}" thinking.{tier} must be a JSON object (not an array or scalar)',"settings.deleteModel":"Delete this model","settings.providerNamePh":"provider name (e.g. DeepSeek)","settings.deleteProvider":"Delete provider","settings.idLabel":"id (unique; letters/digits/_/-)","settings.apiKeyEnvLabel":"apiKeyEnv (optional)","settings.keyLabel":"API key (stored in VS Code SecretStorage)","settings.keyPhSaved":"Saved \u2014 leave empty to keep it","settings.keyPh":"sk-\u2026 (written to SecretStorage only)","settings.clearKey":"Clear key","settings.test":"Test connection","settings.testing":"Testing\u2026 (first model, max_tokens=1)","settings.fetchModels":"Fetch models","settings.fetching":"Requesting /models\u2026","settings.modelsHead":"Models ({n}) \xB7 id / display name / maxInputTokens / maxOutputTokens / toolCalling / vision / thinking","settings.addModel":"+ Add model","settings.errors":"{n} issue(s) to fix:","settings.noProviders":'No providers yet \u2014 click "+ Add provider" below to start.',"settings.saving":"Saving\u2026","settings.builtin":"Using the built-in default config; saving writes to {path}","settings.loaded":"Loaded","settings.saved":"Saved \xB7 {n} models","settings.invalid":"{n} problem(s); not saved","settings.testOk":"Last test OK \xB7 {ms}ms","settings.testFailed":"Last test failed","settings.testOkResult":"\u2705 HTTP {status} \xB7 {ms}ms{reply}","settings.testFailResult":"\u274C {msg}","settings.fail":"failed","settings.fetchFail":"Fetch failed","settings.fetched":"\u2705 Fetched {n} models","settings.fetchedAdded":"; {n} new (remember to save)","settings.fetchedNone":"; no new models","settings.keySet":"Will be written to SecretStorage on save (not to disk)","settings.keyClear":"The stored key will be deleted on save","settings.keySecret":"Already in SecretStorage","settings.keyInline":"Plaintext apiKey in the config (kept on save)","settings.keyEnv":"Using env var {env} (the key is not shown here)","settings.keyNone":"No key set","settings.unnamedModel":"unnamed"},ja:{"panel.statusReady":"\u6E96\u5099\u5B8C\u4E86","panel.sessionsBtn":"\u30BB\u30C3\u30B7\u30E7\u30F3","panel.sessionsTitle":"\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74\uFF08Cmd+Alt+H\uFF09","panel.newSessionBtn":"\u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3","panel.newSessionTitle":"\u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3\uFF08Cmd+Alt+N\uFF09","panel.hint":"\u300Cxxx.js \u3092\u65B0\u898F\u4F5C\u6210\u3057\u3066 \u2026\u300D\u3084\u300Cxxx \u3092 \u2026 \u306B\u5909\u66F4\u300D\u3068\u8A00\u3046\u3068\u3001\u30E2\u30C7\u30EB\u304C\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u76F4\u63A5\u7DE8\u96C6\u3057\u307E\u3059\u3002<br /><code>@</code> \u3067\u30D5\u30A1\u30A4\u30EB\u3084\u30D5\u30A9\u30EB\u30C0\u3092\u53C2\u7167\uFF08<code>@src/</code> \u3067\u30D5\u30A9\u30EB\u30C0\u5168\u4F53\uFF09\u3001<code>@web</code> \u3067\u30A6\u30A7\u30D6\u691C\u7D22\u3057\u3066\u304B\u3089\u56DE\u7B54\uFF1B\u30B3\u30FC\u30C9\u306E\u53C2\u7167\u306F\u30A8\u30C7\u30A3\u30BF\u3067\u9078\u629E\u3057\u3066\u53F3\u30AF\u30EA\u30C3\u30AF\u300C\u30C1\u30E3\u30C3\u30C8\u306B\u9078\u629E\u7BC4\u56F2\u3092\u8FFD\u52A0\u300D\u307E\u305F\u306F <code>Cmd/Ctrl+Alt+A</code>\uFF08\u300C# \u9078\u629E\u7BC4\u56F2\u300D\u30DC\u30BF\u30F3 / <code>#</code> \u3082\u53EF\uFF09\u3002\u30C8\u30FC\u30AF\u30F3\u306B\u306F\u30D5\u30A1\u30A4\u30EB\u3068\u884C\u7BC4\u56F2\u304C\u5165\u308A\u3001\u8907\u6570\u56DE\u91CD\u306D\u3089\u308C\u307E\u3059\u3002","panel.inputPlaceholder":"\u751F\u6210\u30FB\u5909\u66F4\u3057\u305F\u3044\u30B3\u30FC\u30C9\u3092\u8A18\u8FF0\u2026\uFF08Enter \u3067\u9001\u4FE1\u3001Shift+Enter \u3067\u6539\u884C\uFF1B\u5B9F\u884C\u4E2D\u306B Enter \u3059\u308B\u3068\u30AD\u30E5\u30FC\u306B\u5165\u308A\u3001\u3053\u306E\u30BF\u30FC\u30F3\u7D42\u4E86\u5F8C\u306B\u81EA\u52D5\u9001\u4FE1\uFF1B@ \u3067\u30D5\u30A1\u30A4\u30EB\uFF0F\u30D5\u30A9\u30EB\u30C0\u3001# \u3067\u9078\u629E\u7BC4\u56F2\uFF1B@web \u3067\u30A6\u30A7\u30D6\u691C\u7D22\uFF1BIME \u5909\u63DB\u78BA\u5B9A\u3067\u306F\u8AA4\u9001\u4FE1\u3057\u307E\u305B\u3093\uFF09","panel.selectModelTitle":"provider / \u30E2\u30C7\u30EB\u3092\u9078\u629E","panel.modeTitle":"\u30E2\u30FC\u30C9\uFF08Shift+Tab \u3067\u5207\u66FF\uFF09","panel.refSelectionBtn":"# \u9078\u629E\u7BC4\u56F2","panel.refSelectionTitle":"\u30A8\u30C7\u30A3\u30BF\u306E\u9078\u629E\u7BC4\u56F2\u3092\u53C2\u7167\uFF08\u9078\u629E\u3057\u3066\u53F3\u30AF\u30EA\u30C3\u30AF \u2192\u300C\u30C1\u30E3\u30C3\u30C8\u306B\u9078\u629E\u7BC4\u56F2\u3092\u8FFD\u52A0\u300D\u307E\u305F\u306F Cmd/Ctrl+Alt+A\uFF09","panel.webChip":"\u{1F310} \u30A6\u30A7\u30D6","panel.webChipTitle":"\u3053\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u5148\u306B\u30A6\u30A7\u30D6\u691C\u7D22\u3057\u3066\u304B\u3089\u56DE\u7B54\u3057\u307E\u3059","panel.thinkChipDefault":"\u{1F9E0} \u30C7\u30D5\u30A9\u30EB\u30C8","panel.thinkChipOn":"\u{1F9E0} \u30AA\u30F3","panel.thinkChipOff":"\u{1F9E0} \u30AA\u30D5","panel.thinkChipTitle":"\u601D\u8003\u30E2\u30FC\u30C9\uFF1A{dflt}\u3002\u30AF\u30EA\u30C3\u30AF\u3067\u5207\u66FF\uFF08\u30C7\u30D5\u30A9\u30EB\u30C8 / \u30AA\u30F3 / \u30AA\u30D5\uFF09\uFF1B\u30E2\u30C7\u30EB\u306B thinking \u8A2D\u5B9A\u304C\u306A\u3044\u5834\u5408\u306F\u975E\u8868\u793A","panel.verbChipDefault":"\u270E \u65E2\u5B9A","panel.verbChipConcise":"\u270E \u7C21\u6F54","panel.verbChipNormal":"\u270E \u6A19\u6E96","panel.verbChipDetailed":"\u270E \u8A73\u7D30","panel.verbChipTitle":"\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306E\u8A73\u7D30\u5EA6\uFF1A\u30AF\u30EA\u30C3\u30AF\u3067\u5207\u66FF\uFF08\u65E2\u5B9A / \u7C21\u6F54 / \u6A19\u6E96 / \u8A73\u7D30\uFF09\u3001\u3053\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306B\u306E\u307F\u9069\u7528\uFF1B\u300C\u65E2\u5B9A\u300D\u306F\u8A2D\u5B9A luban.agent.verbosity \u306B\u5F93\u3046","panel.settingsTitle":"Provider \u8A2D\u5B9A\uFF08\u30E2\u30C7\u30EB / baseUrl / API key\uFF09","panel.send":"\u9001\u4FE1","panel.sendTitle":"\u9001\u4FE1\uFF08Enter\uFF09","panel.stop":"\u23F9 \u505C\u6B62","panel.stopTitle":"\u73FE\u5728\u306E\u30BF\u30B9\u30AF\u3092\u505C\u6B62","panel.tabClose":"\u30BF\u30D6\u3092\u9589\u3058\u308B\uFF08\u751F\u6210\u4E2D\u306A\u3089\u3053\u306E\u30BF\u30FC\u30F3\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\uFF09","panel.tabTooltip":"\u53F3\u30AF\u30EA\u30C3\u30AF\uFF1A\u9589\u3058\u308B / \u4ED6\u3092\u9589\u3058\u308B / \u5DE6\u53F3\u3092\u9589\u3058\u308B","panel.tabOverflowTitle":"\u305D\u306E\u4ED6\u306E\u30BF\u30D6","panel.menuClose":"\u9589\u3058\u308B","panel.menuCloseOthers":"\u4ED6\u3092\u9589\u3058\u308B","panel.menuCloseRight":"\u53F3\u5074\u3092\u3059\u3079\u3066\u9589\u3058\u308B","panel.menuCloseLeft":"\u5DE6\u5074\u3092\u3059\u3079\u3066\u9589\u3058\u308B","panel.menuCloseAll":"\u3059\u3079\u3066\u9589\u3058\u308B","panel.menuCloseTitle":"\u751F\u6210\u4E2D\u306A\u3089\u3053\u306E\u30BF\u30FC\u30F3\u3092\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3059","panel.jumpLatest":"\u2193 \u6700\u65B0","panel.jumpLatestTitle":"\u6700\u65B0\u306E\u5185\u5BB9\u3078\u623B\u308B","panel.thinking":"\u601D\u8003\u4E2D\u2026","panel.thinkDone":"\u601D\u8003\u904E\u7A0B","panel.thinkLabel":"{label} \xB7 {n} \u6587\u5B57","panel.roleYou":"\u3042\u306A\u305F","panel.roleAssistant":"\u30A2\u30B7\u30B9\u30BF\u30F3\u30C8","panel.roleError":"\u30A8\u30E9\u30FC","panel.toolLabel":"\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057","panel.toolUnit":"\u4EF6","panel.toolsBad":"\uFF08{n} \u4EF6\u5931\u6557\uFF09","panel.toolsLast":"\xB7 \u6700\u8FD1 {name}","panel.refWholeDir":"\u{1F4C1} {dir} \u5168\u4F53\u3092\u53C2\u7167\uFF08{n} \u30D5\u30A1\u30A4\u30EB\uFF09","panel.refWeb":"\u{1F310} \u30A6\u30A7\u30D6\u691C\u7D22\uFF08@web\uFF09","panel.imgBubble":"\u{1F4CE} \u753B\u50CF \xD7{n}","panel.imgPreviewTitle":"\u30AF\u30EA\u30C3\u30AF\u3067\u62E1\u5927\uFF08\u3082\u3046\u4E00\u5EA6\u30AF\u30EA\u30C3\u30AF\u3067\u9589\u3058\u308B\uFF09","panel.imgLoadFail":"\u753B\u50CF\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF08\u30D5\u30A1\u30A4\u30EB\u304C\u524A\u9664\u3055\u308C\u305F\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\uFF09","panel.imgRemoveTitle":"\u3053\u306E\u753B\u50CF\u3092\u524A\u9664","panel.imgNoVision":"\u73FE\u5728\u306E\u30E2\u30C7\u30EB\u306F\u753B\u50CF\u5165\u529B\u306B\u5BFE\u5FDC\u3057\u3066\u3044\u306A\u3044\u305F\u3081\u3001\u753B\u50CF\u306F\u6DFB\u4ED8\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002Provider \u8A2D\u5B9A\u3067 vision \u3092\u6709\u52B9\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002","panel.imgTooBig":"\u753B\u50CF\u304C 5MB \u3092\u8D85\u3048\u3066\u3044\u308B\u305F\u3081\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F","panel.imgBadType":"\u672A\u5BFE\u5FDC\u306E\u753B\u50CF\u5F62\u5F0F\u3067\u3059\uFF08PNG / JPEG / WebP / GIF \u306E\u307F\uFF09\u3001\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F","panel.imgLimit":"\u753B\u50CF\u306F\u6700\u5927 4 \u679A\u307E\u3067\u3001\u4F59\u5206\u306F\u7121\u8996\u3055\u308C\u307E\u3057\u305F","panel.imgReadFail":"\u753B\u50CF\u306E\u8AAD\u307F\u53D6\u308A\u306B\u5931\u6557\u3057\u305F\u305F\u3081\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F","panel.copyMsg":"\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u30B3\u30D4\u30FC","panel.copied":"\u30B3\u30D4\u30FC\u3057\u307E\u3057\u305F","panel.copyFail":"\u30B3\u30D4\u30FC\u306B\u5931\u6557\u3057\u307E\u3057\u305F","panel.editMsg":"\u3053\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u7DE8\u96C6","panel.editCancel":"\u30AD\u30E3\u30F3\u30BB\u30EB","panel.editHint":"\u9001\u4FE1\u3059\u308B\u3068\u3053\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u3088\u308A\u5F8C\u306E\u4F1A\u8A71\u304C\u524A\u9664\u3055\u308C\u3001\u7DE8\u96C6\u5F8C\u306E\u5185\u5BB9\u3067\u3059\u3050\u306B\u518D\u9001\u4FE1\u3055\u308C\u307E\u3059","panel.editSending":"\u518D\u9001\u4FE1\u4E2D\u2026","panel.editSaved":"\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002\u4EE5\u964D\u306E {n} \u4EF6\u3092\u524A\u9664\u3057\u307E\u3057\u305F","panel.editSavedNone":"\u4FDD\u5B58\u3057\u307E\u3057\u305F","panel.editBusy":"\u751F\u6210\u4E2D\u306F\u5C65\u6B74\u3092\u7DE8\u96C6\u3067\u304D\u307E\u305B\u3093\u3002\u5148\u306B\u3053\u306E\u30BF\u30FC\u30F3\u3092\u505C\u6B62\u3057\u3066\u304F\u3060\u3055\u3044","panel.forkMsgTitle":"\u3053\u306E\u8CEA\u554F\u304B\u3089\u30D5\u30A9\u30FC\u30AF\uFF08\u3053\u3053\u307E\u3067\u3092\u4FDD\u6301\uFF09","panel.forking":"\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u30D5\u30A9\u30FC\u30AF\u3057\u3066\u3044\u307E\u3059\u2026","panel.forkBusy":"\u751F\u6210\u4E2D\u306F\u30D5\u30A9\u30FC\u30AF\u3067\u304D\u307E\u305B\u3093\u3002\u5148\u306B\u3053\u306E\u30BF\u30FC\u30F3\u3092\u505C\u6B62\u3057\u3066\u304F\u3060\u3055\u3044","panel.refLoadingFiles":"\u30D5\u30A1\u30A4\u30EB\u3068\u30D5\u30A9\u30EB\u30C0\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026","panel.refLoadingSelection":"\u73FE\u5728\u306E\u9078\u629E\u7BC4\u56F2\u3092\u8AAD\u307F\u53D6\u308A\u4E2D\u2026","panel.refNoMatchDir":"\u3053\u306E\u30D5\u30A9\u30EB\u30C0\u306B\u4E00\u81F4\u3059\u308B\u9805\u76EE\u304C\u3042\u308A\u307E\u305B\u3093","panel.refNoMatch":"\u4E00\u81F4\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u307E\u305F\u306F\u30D5\u30A9\u30EB\u30C0\u304C\u3042\u308A\u307E\u305B\u3093","panel.refNoEditor":"\u53C2\u7167\u3067\u304D\u308B\u30A8\u30C7\u30A3\u30BF\u304C\u3042\u308A\u307E\u305B\u3093","panel.lines":"{n} \u884C","panel.files":"{n} \u30D5\u30A1\u30A4\u30EB","panel.injected":"{n} \u4EF6\u306E\u5168\u6587\u3092\u6CE8\u5165\u6E08\u307F","panel.truncated":"\u5207\u308A\u8A70\u3081\u6E08\u307F","panel.omitted":"\u7701\u7565\u6E08\u307F","panel.sources":"\u51FA\u5178 \xB7 {n}","panel.ctxTip":"\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 {used} / {win} token\uFF08{pct}{model}\uFF09","panel.ctxEst":"\u2248 \u306F\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u304C usage \u3092\u8FD4\u3055\u305A\u3001\u6587\u5B57\u6570\u304B\u3089\u63A8\u5B9A\u3057\u305F\u3053\u3068\u3092\u793A\u3057\u307E\u3059","panel.usageCache":"\u30AD\u30E3\u30C3\u30B7\u30E5 {n}\uFF08{pct}\uFF09","panel.usageContext":"\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 {used} / {win}\uFF08{pct}\uFF09","panel.usageRequests":"{n} \u56DE\u306E\u30EA\u30AF\u30A8\u30B9\u30C8","panel.usageTipContext":"\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 {used} / {win} token","panel.usageTipRequests":"\u30EA\u30AF\u30A8\u30B9\u30C8 {n} \u56DE","panel.usageTipModel":"\u30E2\u30C7\u30EB {model}","panel.usageTipEst":"\u2248 \u63A8\u5B9A\u5024\uFF08\u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u304C usage \u3092\u8FD4\u3057\u3066\u3044\u307E\u305B\u3093\uFF09","panel.reviewShowDiff":"diff \u3092\u8868\u793A","panel.reviewKeepAll":"\u3059\u3079\u3066\u4FDD\u6301","panel.reviewDropAll":"\u3059\u3079\u3066\u53D6\u308A\u6D88\u3057","panel.reviewBlocks":"\xB7 {n} \u30D6\u30ED\u30C3\u30AF","panel.reviewTitle":"\u30EC\u30D3\u30E5\u30FC\u5F85\u3061\u306E\u5909\u66F4 \xB7 {files} \u30D5\u30A1\u30A4\u30EB / {hunks} \u30D6\u30ED\u30C3\u30AF\uFF08+{add} -{del}\uFF09","panel.reviewKeepAllFiles":"\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u4FDD\u6301","panel.reviewRejectAllFiles":"\u3059\u3079\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u53D6\u308A\u6D88\u3057","panel.reviewRejectAllConfirm":"\u3059\u3079\u3066\u53D6\u308A\u6D88\u3057\u307E\u3059\u304B\uFF1F","panel.reviewHint":"\u8A73\u7D30\u306F\u30A8\u30C7\u30A3\u30BF\u306E diff \u306B\u3042\u308A\u307E\u3059\uFF1A\u30BF\u30A4\u30C8\u30EB\u30D0\u30FC\u306E\u300C\u3059\u3079\u3066\u4FDD\u6301 / \u3059\u3079\u3066\u53D6\u308A\u6D88\u3057\u300D\u3001\u5404\u30D6\u30ED\u30C3\u30AF\u306E\u300C\u3053\u308C\u3092\u4FDD\u6301 / \u3053\u308C\u3092\u53D6\u308A\u6D88\u3057\u300D\uFF1B\u300Cdiff \u3092\u8868\u793A\u300D\u3067\u518D\u5EA6\u958B\u3051\u307E\u3059\u3002\u30BF\u30A4\u30C8\u30EB\u53F3\u5074\u306E 2 \u30DC\u30BF\u30F3\u306F\u5168\u30D5\u30A1\u30A4\u30EB\u306B\u4E00\u62EC\u9069\u7528\u3055\u308C\u307E\u3059\u3002","panel.relJustNow":"\u305F\u3063\u305F\u4ECA","panel.relMinutes":"{n} \u5206\u524D","panel.relHours":"{n} \u6642\u9593\u524D","panel.relDays":"{n} \u65E5\u524D","panel.sessionsHead":"\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74 \xB7 {n}","panel.sessionsSearchHead":"\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74 \xB7 \u4E00\u81F4 {n}/{total}","panel.sessionSearchPlaceholder":"\u30BB\u30C3\u30B7\u30E7\u30F3\u306E\u30BF\u30A4\u30C8\u30EB\u3068\u672C\u6587\u3092\u691C\u7D22\u2026","panel.sessionSearchTitle":"\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74\u3092\u691C\u7D22\uFF1A\u30BF\u30A4\u30C8\u30EB\u306F\u5165\u529B\u3068\u540C\u6642\u306B\u7D5E\u308A\u8FBC\u307F\u30012 \u6587\u5B57\u4EE5\u4E0A\u3067\u672C\u6587\u3082\u691C\u7D22","panel.sessionSearchClear":"\u691C\u7D22\u3092\u30AF\u30EA\u30A2\uFF08Esc\uFF09","panel.sessionSearchMinChars":"2 \u6587\u5B57\u4EE5\u4E0A\u3067\u672C\u6587\u3082\u691C\u7D22\u3057\u307E\u3059","panel.sessionSearching":"\u672C\u6587\u3092\u691C\u7D22\u4E2D\u2026","panel.sessionSearchHits":"\u672C\u6587\u4E00\u81F4 {n} \u30BB\u30C3\u30B7\u30E7\u30F3","panel.sessionSearchTruncated":"\uFF08\u4E0A\u9650\u306B\u9054\u3057\u307E\u3057\u305F\uFF09","panel.sessionContentHits":"\u672C\u6587 {n} \u7B87\u6240","panel.sessionSearchNoMatch":"\u4E00\u81F4\u3059\u308B\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u3042\u308A\u307E\u305B\u3093\uFF08\u30BF\u30A4\u30C8\u30EB\u3068\u672C\u6587\u3092\u691C\u7D22\u3057\u307E\u3057\u305F\uFF09\u3002","panel.sessionNew":"\uFF0B \u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3","panel.loading":"\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026","panel.sessionsEmptyAll":"\u307E\u3060\u30BB\u30C3\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093 \u2014 \u6700\u521D\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9001\u308B\u3068\u4F5C\u6210\u3055\u308C\u307E\u3059\u3002","panel.sessionsEmptyWs":"\u3053\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306B\u307E\u3060\u30BB\u30C3\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u300C\u4ED6\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3092\u8868\u793A\u300D\u3092\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u304B\u3001\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u9001\u3063\u3066\u304F\u3060\u3055\u3044\u3002","panel.sessionItems":"{n} \u4EF6","panel.noWorkspace":"\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306A\u3057","panel.deleteConfirm":"\u524A\u9664\u3057\u307E\u3059\u304B\uFF1F","panel.deleteConfirmTitle":"\u3082\u3046\u4E00\u5EA6\u30AF\u30EA\u30C3\u30AF\u3067\u78BA\u8A8D\uFF08\u5143\u306B\u623B\u305B\u307E\u305B\u3093\uFF09","panel.deleteTitle":"\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u524A\u9664","panel.forkBtn":"\u30D5\u30A9\u30FC\u30AF","panel.forkTitle":"\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u30D5\u30A9\u30FC\u30AF","panel.forkRound":"\u3053\u3053\u307E\u3067\u3092\u30D5\u30A9\u30FC\u30AF","panel.forkRoundTitle":"\u3053\u306E\u4F1A\u8A71\u3092\u3053\u306E\u30BF\u30FC\u30F3\u307E\u3067\u4FDD\u6301\u3057\u3066\u65B0\u3057\u3044\u5206\u5C90\u3092\u4F5C\u6210","panel.openingSession":"\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u958B\u3044\u3066\u3044\u307E\u3059\u2026","panel.scopeToWorkspace":"\u3053\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E\u307F","panel.scopeToAll":"\u4ED6\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3092\u8868\u793A","panel.scopeTipAll":"\u3059\u3079\u3066\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u3092\u8868\u793A\u4E2D","panel.scopeTipWs":"\u3053\u306E\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u306E\u307F\u8868\u793A\u4E2D","panel.openingNew":"\u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u958B\u59CB\u3057\u3066\u3044\u307E\u3059\u2026","panel.execPlanRunning":"\u30D7\u30E9\u30F3\u3092\u5B9F\u884C\u4E2D\u2026","panel.openPlanFile":"\u{1F4C4} \u30D7\u30E9\u30F3\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u304F","panel.runPlan":"\u25B6 \u3053\u306E\u30D7\u30E9\u30F3\u3092\u5B9F\u884C","panel.runPlanAccept":"\u25B6 \u5B9F\u884C\u3057\u3066\u5909\u66F4\u3092\u4FDD\u6301","panel.runPlanAcceptTitle":"\u30D7\u30E9\u30F3\u3092\u5B9F\u884C\u3057\u3001\u66F8\u304D\u8FBC\u307F\u3092\u81EA\u52D5\u3067\u4FDD\u6301\uFF08\u30EC\u30D3\u30E5\u30FC\u5F85\u3061\u306B\u3057\u306A\u3044\uFF09","panel.planSent":"Agent \u306B\u6E21\u3057\u307E\u3057\u305F\u2026","panel.planSaved":"\u4FDD\u5B58\u3057\u307E\u3057\u305F \xB7 {file}","panel.planReadonly":"Plan \u30E2\u30FC\u30C9\u306F\u8AAD\u307F\u53D6\u308A\u5C02\u7528 \u2014 \u30D5\u30A1\u30A4\u30EB\u306F\u5909\u66F4\u3055\u308C\u3066\u3044\u307E\u305B\u3093","panel.todosTitle":"ToDo {done}/{total}","panel.todoPending":"\u672A\u7740\u624B","panel.todoProgress":"\u9032\u884C\u4E2D","panel.todoDone":"\u5B8C\u4E86","panel.todoCancelled":"\u30AD\u30E3\u30F3\u30BB\u30EB","panel.askSubmit":"\u78BA\u8A8D","panel.askMulti":"\uFF08\u8907\u6570\u9078\u629E\u53EF\uFF09","panel.askNeedAll":"\u3059\u3079\u3066\u306E\u8CEA\u554F\u306B\u56DE\u7B54\u3057\u3066\u304F\u3060\u3055\u3044","panel.askAnswered":"\u56DE\u7B54\u6E08\u307F","panel.askError":"\u9078\u629E\u80A2\u306E\u9001\u4FE1\u306B\u5931\u6557\u3057\u307E\u3057\u305F","panel.askCancelled":"\u30AD\u30E3\u30F3\u30BB\u30EB\uFF08\u30BF\u30FC\u30F3\u7D42\u4E86\uFF09","panel.askRecommended":"\u63A8\u5968","panel.queueTitle":"\u30AD\u30E5\u30FC {n} \u4EF6","panel.queuePausedTip":"\u4E00\u6642\u505C\u6B62\u4E2D \xB7 \u300C\u518D\u958B\u300D\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u9001\u4FE1","panel.queueAutoTip":"\u73FE\u5728\u306E\u30BF\u30FC\u30F3\u7D42\u4E86\u5F8C\u306B\u81EA\u52D5\u9001\u4FE1","panel.resume":"\u518D\u958B","panel.resumeTitle":"\u81EA\u52D5\u9001\u4FE1\u3092\u518D\u958B\uFF1A\u30A2\u30A4\u30C9\u30EB\u6642\u306B\u6B21\u306E\u9805\u76EE\u3092\u3059\u3050\u9001\u4FE1","panel.clear":"\u30AF\u30EA\u30A2","panel.clearQueueTitle":"\u30AD\u30E5\u30FC\u3092\u30AF\u30EA\u30A2\uFF08\u5B9F\u884C\u4E2D\u306E\u30BF\u30FC\u30F3\u306B\u306F\u5F71\u97FF\u3057\u307E\u305B\u3093\uFF09","panel.runNow":"\u3059\u3050\u5B9F\u884C","panel.runNowTitle":"\u73FE\u5728\u306E\u30BF\u30FC\u30F3\u3092\u4E2D\u65AD\u3057\u3001\u3053\u306E\u9805\u76EE\u3092\u3059\u3050\u5B9F\u884C\uFF08\u4ED6\u306E\u30AD\u30E5\u30FC\u306F\u6B8B\u3059\uFF09","panel.runNowStatus":"\u3059\u3050\u5B9F\u884C\u3092\u8981\u6C42\u3057\u307E\u3057\u305F\u2026","panel.edit":"\u7DE8\u96C6","panel.editTitle":"\u5165\u529B\u6B04\u306B\u623B\u3057\u3066\u7DE8\u96C6","panel.removeTitle":"\u30AD\u30E5\u30FC\u304B\u3089\u3053\u306E\u9805\u76EE\u3092\u524A\u9664","panel.retrieved":"\u30AD\u30E5\u30FC\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u53D6\u308A\u623B\u3057\u307E\u3057\u305F","panel.resuming":"\u30AD\u30E5\u30FC\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u3092\u518D\u958B\u3057\u3066\u3044\u307E\u3059\u2026","panel.queued":"\u30AD\u30E5\u30FC\u306B\u8FFD\u52A0 \xB7 \u73FE\u5728\u306E\u30BF\u30FC\u30F3\u7D42\u4E86\u5F8C\u306B\u9001\u4FE1","panel.searching":"\u30A6\u30A7\u30D6\u691C\u7D22\u4E2D\u2026","panel.running":"\u5B9F\u884C\u4E2D\u2026","panel.stopRequested":"\u505C\u6B62\u3092\u8981\u6C42\u3057\u307E\u3057\u305F","panel.noEditorSelection":"\u958B\u3044\u3066\u3044\u308B\u30A8\u30C7\u30A3\u30BF\u304C\u306A\u3044\u305F\u3081\u3001\u9078\u629E\u7BC4\u56F2\u3092\u53C2\u7167\u3067\u304D\u307E\u305B\u3093","panel.noSelection":"\u5148\u306B\u30A8\u30C7\u30A3\u30BF\u3067\u30B3\u30FC\u30C9\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044","panel.selectionRef":"# \u53C2\u7167\uFF1A{path}:{start}-{end}","panel.fileRef":"{n} \u4EF6\u3092\u53C2\u7167\u3057\u307E\u3057\u305F","panel.selectionToken":"#selection {path}:{start}-{end}\uFF08{kind}\u3001{n} \u884C\uFF09","panel.kindSelection":"\u9078\u629E\u7BC4\u56F2","panel.kindFull":"\u5168\u6587","panel.done":"\u5B8C\u4E86","panel.unknownError":"\u4E0D\u660E\u306A\u30A8\u30E9\u30FC","panel.error":"\u30A8\u30E9\u30FC","panel.queueFailed":"\u30AD\u30E5\u30FC\u3078\u306E\u8FFD\u52A0\u306B\u5931\u6557\u3057\u307E\u3057\u305F","store.untitled":"\u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3","cross.execPlan":"\u25B6 \u30D7\u30E9\u30F3\u3092\u5B9F\u884C","cross.execPlanAccept":"\u25B6 \u30D7\u30E9\u30F3\u3092\u5B9F\u884C\u3057\u3066\u5909\u66F4\u3092\u4FDD\u6301","ext.keepHunk":"$(check) \u3053\u308C\u3092\u4FDD\u6301\uFF08+{add} -{del}\uFF09","ext.revertHunk":"$(discard) \u3053\u308C\u3092\u53D6\u308A\u6D88\u3057","ext.viewDiff":"$(diff) \u5168\u4F53\u306E diff \u3092\u8868\u793A","ext.keepFile":"$(check-all) \u3059\u3079\u3066\u4FDD\u6301\uFF08+{add} -{del}\uFF09","ext.revertFile":"$(discard) \u3059\u3079\u3066\u53D6\u308A\u6D88\u3057","ext.diffTitle":"Luban \u306E\u5909\u66F4: {file}\uFF08+{add} -{del}\uFF09","ext.noPending":"\u30EC\u30D3\u30E5\u30FC\u5F85\u3061\u306E\u5909\u66F4\u306F\u3042\u308A\u307E\u305B\u3093: {path}","ext.hunkGone":"{hunk} \u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08\u5909\u66F4\u304C\u79FB\u52D5\u3057\u307E\u3057\u305F\u3002\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044\uFF09","ext.unknownAction":"\u4E0D\u660E\u306A\u64CD\u4F5C: {action}","ext.noReviewFile":"\u30EC\u30D3\u30E5\u30FC\u3059\u308B\u30D5\u30A1\u30A4\u30EB\u304C\u3042\u308A\u307E\u305B\u3093","ext.removedGhost":" <- {n} \u884C\u3092\u524A\u9664: {text}","ext.actionFailed":"\u64CD\u4F5C\u306B\u5931\u6557\u3057\u307E\u3057\u305F","ext.reviewWarn":"Luban \u30EC\u30D3\u30E5\u30FC: {msg}","ext.queueFull":"\u30AD\u30E5\u30FC\u304C\u3044\u3063\u3071\u3044\u3067\u3059\uFF08\u6700\u5927 {n} \u4EF6\uFF09\u3002\u7D42\u4E86\u3059\u308B\u304B\u30AF\u30EA\u30A2\u3057\u3066\u304B\u3089\u306B\u3057\u3066\u304F\u3060\u3055\u3044","ext.queueEmpty":"\u7A7A\u306E\u30E1\u30C3\u30BB\u30FC\u30B8\u306E\u305F\u3081\u30AD\u30E5\u30FC\u306B\u8FFD\u52A0\u3057\u307E\u305B\u3093\u3067\u3057\u305F","ext.addSelectionNone":"\u30A8\u30C7\u30A3\u30BF\u3067\u9078\u629E\u3055\u308C\u3066\u3044\u306A\u3044\u305F\u3081\u3001\u53C2\u7167\u3092\u633F\u5165\u3057\u307E\u305B\u3093\u3067\u3057\u305F","ext.queueMissing":"\u30AD\u30E5\u30FC\u306B\u305D\u306E\u9805\u76EE\u306F\u3042\u308A\u307E\u305B\u3093","ext.imgNoVision":"\u73FE\u5728\u306E\u30E2\u30C7\u30EB\u306F\u753B\u50CF\u306B\u5BFE\u5FDC\u3057\u3066\u3044\u306A\u3044\u305F\u3081\u3001\u6DFB\u4ED8\u3092\u7121\u8996\u3057\u307E\u3057\u305F","ext.noSuchSession":"\u30BB\u30C3\u30B7\u30E7\u30F3\u304C\u3042\u308A\u307E\u305B\u3093: {id}","ext.sessionBusy":"\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u5B9F\u884C\u4E2D\u3067\u3059\u3002\u30D7\u30E9\u30F3\u306E\u5B9F\u884C\u306F\u5F8C\u3067\u3082\u3046\u4E00\u5EA6\u8A66\u3057\u3066\u304F\u3060\u3055\u3044","ext.editBusy":"\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u5B9F\u884C\u4E2D\u3067\u3059\u3002\u9001\u4FE1\u6E08\u307F\u30E1\u30C3\u30BB\u30FC\u30B8\u306F\u7DE8\u96C6\u3067\u304D\u307E\u305B\u3093","ext.editMissing":"\u7DE8\u96C6\u3059\u308B\u30E1\u30C3\u30BB\u30FC\u30B8\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08\u6574\u7406\u3055\u308C\u305F\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\uFF09","ext.editEmpty":"\u7DE8\u96C6\u5F8C\u306E\u5185\u5BB9\u306F\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093","ext.forkPickTitle":"\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u30D5\u30A9\u30FC\u30AF","ext.forkPickPlaceholder":"\u5168\u4F53\u3092\u30B3\u30D4\u30FC\u3001\u307E\u305F\u306F\u5206\u5C90\u5143\u306E\u8CEA\u554F\u3092\u9078\u3093\u3067\u304F\u3060\u3055\u3044","ext.forkWhole":"\u30BB\u30C3\u30B7\u30E7\u30F3\u5168\u4F53\u3092\u30B3\u30D4\u30FC","ext.forkWholeDesc":"\u5168 {n} \u4EF6\u306E\u30EC\u30B3\u30FC\u30C9\u3092\u4FDD\u6301","ext.forkFromDesc":"\u3053\u306E\u8CEA\u554F\u304B\u3089\u5206\u5C90 \xB7 \u4EE5\u964D\u306E {n} \u4EF6\u306F\u5F15\u304D\u7D99\u304E\u307E\u305B\u3093","ext.forkBusy":"\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306F\u5B9F\u884C\u4E2D\u3067\u3059\u3002\u73FE\u5728\u306E\u30BF\u30FC\u30F3\u304C\u7D42\u308F\u3063\u3066\u304B\u3089\u30D5\u30A9\u30FC\u30AF\u3057\u3066\u304F\u3060\u3055\u3044","ext.forkEmpty":"\u3053\u306E\u30BB\u30C3\u30B7\u30E7\u30F3\u306B\u306F\u307E\u3060\u5206\u5C90\u3067\u304D\u308B\u5185\u5BB9\u304C\u3042\u308A\u307E\u305B\u3093","ext.forkSuffix":" \xB7 \u30D5\u30A9\u30FC\u30AF","ext.forkMissing":"\u30D5\u30A9\u30FC\u30AF\u5143\u306E\u8CEA\u554F\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF08\u6574\u7406\u3055\u308C\u305F\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\uFF09","ext.cancelled":"\u30AD\u30E3\u30F3\u30BB\u30EB\u3057\u307E\u3057\u305F\uFF1A\u30BB\u30C3\u30B7\u30E7\u30F3\u304C\u9589\u3058\u3089\u308C\u305F\u304B\u524A\u9664\u3055\u308C\u307E\u3057\u305F","ext.noPlan":"\u5B9F\u884C\u3059\u308B\u30D7\u30E9\u30F3\u304C\u3042\u308A\u307E\u305B\u3093\uFF1A\u30D7\u30E9\u30F3\u30D5\u30A1\u30A4\u30EB\u304C\u524A\u9664\u3055\u308C\u305F\u304B\u7A7A\u3067\u3059","ext.notPlanFile":"\u8AAD\u307F\u53D6\u308A\u53EF\u80FD\u306A\u30D7\u30E9\u30F3\u30D5\u30A1\u30A4\u30EB\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF08Luban / Cursor\uFF09: {path}","ext.browserNotFound":`Chrome / Edge \u304C\u898B\u3064\u304B\u3089\u306A\u3044\u305F\u3081\u3001\u5185\u8535\u30D6\u30E9\u30A6\u30B6\u30FC\u3092\u4F7F\u3048\u307E\u305B\u3093\u3002Chrome \u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3059\u308B\u304B\u3001\u8A2D\u5B9A luban.browser.chromePath \u3067\u30D1\u30B9\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u8A66\u3057\u305F\u5019\u88DC:
|
|
700
|
+
{paths}`,"ext.browserCheckRunning":"\u5185\u8535\u30D6\u30E9\u30A6\u30B6\u30FC\u3092\u78BA\u8A8D\u3057\u3066\u3044\u307E\u3059\u2026","ext.browserCheckOk":"\u5185\u8535\u30D6\u30E9\u30A6\u30B6\u30FC\u306F\u4F7F\u7528\u3067\u304D\u307E\u3059\uFF1A{exe}\uFF08\u30C6\u30B9\u30C8\u64AE\u5F71 \u7D04 {chars} KB\uFF09","ext.browserCheckFailed":"\u5185\u8535\u30D6\u30E9\u30A6\u30B6\u30FC\u306E\u78BA\u8A8D\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A{message}","ext.cursorPlanPick":"\u5B9F\u884C\u3059\u308B Cursor \u30D7\u30E9\u30F3\u3092\u9078\u629E\uFF08~/.cursor/plans\uFF09","ext.cursorPlanNone":"Cursor \u30D7\u30E9\u30F3\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\uFF1A{dir} \u306F\u7A7A\u3067\u3059","ext.cursorPlanReadFail":"Cursor \u30D7\u30E9\u30F3\u306E\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557\u3057\u307E\u3057\u305F\uFF1A{msg}","ext.cursorPlanBig":"Cursor \u30D7\u30E9\u30F3\u304C {n}KB \u3092\u8D85\u3048\u3066\u3044\u308B\u305F\u3081\u5B9F\u884C\u3067\u304D\u307E\u305B\u3093","ext.cursorPlanNoPanel":"Luban \u30D1\u30CD\u30EB\u306E\u6E96\u5099\u304C\u3067\u304D\u3066\u3044\u307E\u305B\u3093\u3002\u30D1\u30CD\u30EB\u3092\u958B\u3044\u3066\u518D\u8A66\u884C\u3057\u3066\u304F\u3060\u3055\u3044","ext.stop.final":"\u5B8C\u4E86","ext.stop.maxRounds":"\u30E9\u30A6\u30F3\u30C9\u4E0A\u9650\u306B\u9054\u3057\u307E\u3057\u305F","ext.stop.timeout":"\u6642\u9593\u4E88\u7B97\u3092\u8D85\u904E\u3057\u307E\u3057\u305F","ext.stop.context":"\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u4E88\u7B97\u3092\u4F7F\u3044\u5207\u308A\u307E\u3057\u305F","ext.stop.loop":"\u7E70\u308A\u8FD4\u3057\u547C\u3073\u51FA\u3057\u3092\u691C\u51FA","ext.stop.errors":"\u30C4\u30FC\u30EB\u306E\u9023\u7D9A\u30A8\u30E9\u30FC","ext.stop.stopped":"\u505C\u6B62\u3057\u307E\u3057\u305F","ext.stop.noWrites":"\u3053\u306E\u30BF\u30FC\u30F3\u3067\u306F\u30D5\u30A1\u30A4\u30EB\u672A\u5909\u66F4","ext.summary.exec":"\u30D7\u30E9\u30F3\u5B9F\u884C\u6E08\u307F \xB7 \u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057 {n} \u56DE \xB7 {s}s","ext.summary.chat":"\u5B8C\u4E86 \xB7 {model}","ext.summary.plan":"\u30D7\u30E9\u30F3\u6E96\u5099\u5B8C\u4E86 \xB7 \u8AAD\u307F\u53D6\u308A\u5C02\u7528\u30C4\u30FC\u30EB {n} \u56DE \xB7 {s}s","ext.summary.done":"\u5B8C\u4E86 \xB7 \u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057 {n} \u56DE \xB7 {s}s","ext.summary.fallback":"\uFF08\u300C{reason}\u300D\u306B\u3088\u308A\u30BF\u30FC\u30F3\u7D42\u4E86\u3001\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057 {n} \u56DE\u3001\u7DE0\u3081\u306E\u8981\u7D04\u306F\u751F\u6210\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\uFF09","ext.summary.fallbackShort":"\uFF08\u300C{reason}\u300D\u306B\u3088\u308A\u30BF\u30FC\u30F3\u7D42\u4E86\u3001\u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057 {n} \u56DE\uFF09","ext.summary.noWrites":"\u3053\u306E\u30BF\u30FC\u30F3\u3067\u30C4\u30FC\u30EB\u306F\u5B9F\u884C\u3055\u308C\u307E\u3057\u305F\u304C\u3001\u30D5\u30A1\u30A4\u30EB\u306F\u5909\u66F4\u3055\u308C\u3066\u3044\u307E\u305B\u3093\uFF08\u6210\u529F\u3057\u305F write_file / replace_in_file \u306A\u3057\uFF09\u3002\u5F15\u304D\u7D9A\u304D\u7DE8\u96C6\u304C\u5FC5\u8981\u306A\u3089\u300C\u30D5\u30A1\u30A4\u30EB\u3092\u7D9A\u3051\u3066\u7DE8\u96C6\u300D\u3068\u6307\u793A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\u7D50\u8AD6\u3060\u3051\u3067\u3088\u3051\u308C\u3070\u3053\u306E\u6CE8\u8A18\u306F\u7121\u8996\u3057\u3066\u69CB\u3044\u307E\u305B\u3093\u3002","ext.prefixHint":"\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u30AD\u30E3\u30C3\u30B7\u30E5 0% \xB7 \u30A8\u30F3\u30C9\u30DD\u30A4\u30F3\u30C8\u3067 KV \u30AD\u30E3\u30C3\u30B7\u30E5\u3092\u6709\u52B9\u306B\u3057\u3066\u304F\u3060\u3055\u3044","ext.prefixHintTip":"{n} \u56DE\u306E\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u3059\u3079\u3066\u518D\u8A08\u7B97\u3055\u308C\u3001\u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u30AD\u30E3\u30C3\u30B7\u30E5\u306B\u4E00\u5EA6\u3082\u30D2\u30C3\u30C8\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u30ED\u30FC\u30AB\u30EB vLLM \u3067\u306F --enable-prefix-caching \u3092\u8FFD\u52A0\uFF08Docker \u74B0\u5883\u5909\u6570 VLLM_ENABLE_PREFIX_CACHING=1\uFF1Bvllm serve --help \u3092\u78BA\u8A8D\uFF09\uFF1BSGLang \u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u3067\u6709\u52B9\uFF1BOllama \u306F\u975E\u5BFE\u5FDC\u3002\u6709\u52B9\u5316\u5F8C\u306F\u3053\u306E\u884C\u306B\u300C\u30AD\u30E3\u30C3\u30B7\u30E5 N%\u300D\u3068\u8868\u793A\u3055\u308C\u307E\u3059\u3002","ext.inlineOn":"Luban Tab \u88DC\u5B8C\u3092\u6709\u52B9\u306B\u3057\u307E\u3057\u305F","ext.inlineOff":"Luban Tab \u88DC\u5B8C\u3092\u7121\u52B9\u306B\u3057\u307E\u3057\u305F","ext.agentDone":"Agent \u5B8C\u4E86 \xB7 \u30C4\u30FC\u30EB\u547C\u3073\u51FA\u3057 {n} \u56DE","ext.askNeeded":"Luban \u306E\u9078\u629E\u304C\u5FC5\u8981\u3067\u3059\uFF1A{detail}","ext.askGoChoose":"\u9078\u629E\u3059\u308B","ext.configReloaded":"Provider \u8A2D\u5B9A\u3092\u518D\u8AAD\u307F\u8FBC\u307F: \u30E2\u30C7\u30EB {models} \xB7 \u30B9\u30AD\u30EB {skills}","ext.mcpNote":" \xB7 MCP: \u30B5\u30FC\u30D0\u30FC {servers} / \u30C4\u30FC\u30EB {tools}","ext.mcpFail":" \xB7 MCP \u306E\u518D\u8AAD\u307F\u8FBC\u307F\u306B\u5931\u6557: {msg}","ext.newSessionNotice":"Luban: \u65B0\u3057\u3044\u30BB\u30C3\u30B7\u30E7\u30F3\u3092\u958B\u59CB\u3057\u307E\u3057\u305F","ext.addFileNoView":"Luban \u30C1\u30E3\u30C3\u30C8\u30D1\u30CD\u30EB\u3092\u958B\u3051\u307E\u305B\u3093\u3002\u5148\u306B Luban \u30B5\u30A4\u30C9\u30D0\u30FC\u3092\u958B\u3044\u3066\u304F\u3060\u3055\u3044\u3002","ext.agentPrompt":"\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306B\u4F55\u3092\u3055\u305B\u307E\u3059\u304B\uFF1F\uFF08\u30B3\u30FC\u30C9\u306E\u7DE8\u96C6\uFF0F\u751F\u6210\uFF09","ext.hubPanelTitle":"\u8A2D\u5B9A\u3068\u4F7F\u7528\u91CF","ext.providerTimeout":"\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF0815s\uFF09","ext.providerBadJson":"\u5FDC\u7B54\u304C JSON \u3067\u306F\u3042\u308A\u307E\u305B\u3093: {head}","ext.providerBaseUrl":"baseUrl \u304C\u7A7A\u3067\u3059","ext.providerNeedModel":"\u30C6\u30B9\u30C8\u524D\u306B\u30E2\u30C7\u30EB id \u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044","ext.providerNeedKey":"API key \u304C\u3042\u308A\u307E\u305B\u3093\uFF08\u30D1\u30CD\u30EB\u3067\u5165\u529B\u3059\u308B\u304B apiKeyEnv \u3092\u8A2D\u5B9A\uFF09","ext.configMissing":"\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u304C\u307E\u3060\u3042\u308A\u307E\u305B\u3093 \u2014 \u5148\u306B\u4FDD\u5B58\u3057\u3066\u304F\u3060\u3055\u3044","ext.saveFailed":"\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {msg}","ext.generalMissing":"\u8A2D\u5B9A\u9805\u76EE\u304C\u3042\u308A\u307E\u305B\u3093: {key}","ext.generalBadBool":"\u300C{key}\u300D\u306F\u30D6\u30FC\u30EB\u5024\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","ext.generalBadLanguage":"\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30FC\u30B9\u8A00\u8A9E\u306F auto / en / zh-cn / ja \u306E\u307F\u3067\u3059","ext.generalBadEnum":"\u300C{key}\u300D\u306F {values} \u306E\u3044\u305A\u308C\u304B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","ext.generalBadNumber":"\u300C{key}\u300D\u306F\u6574\u6570\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","ext.generalBadMin":"\u300C{key}\u300D\u306F {min} \u4EE5\u4E0A\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","ext.generalBadMax":"\u300C{key}\u300D\u306F {max} \u4EE5\u4E0B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","ext.generalSaveFailed":"\u4E00\u822C\u8A2D\u5B9A\u306E\u4FDD\u5B58\u306B\u5931\u6557\u3057\u307E\u3057\u305F: {msg}","ext.openDirFailed":"\u30C7\u30FC\u30BF\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u958B\u3051\u307E\u305B\u3093: {msg}","validate.providerEmpty":"Provider id \u3092\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093","validate.pos":"provider\u300C{id}\u300D","validate.untitled":"\uFF08\u540D\u79F0\u672A\u8A2D\u5B9A\uFF09","validate.idChars":"{pos}: id \u306B\u4F7F\u3048\u308B\u306E\u306F\u82F1\u6570\u5B57\u30FB\u30A2\u30F3\u30C0\u30FC\u30B9\u30B3\u30A2\u30FB\u30CF\u30A4\u30D5\u30F3\u306E\u307F\u3067\u3059","validate.idDup":"{pos}: id \u304C\u91CD\u8907\u3057\u3066\u3044\u307E\u3059","validate.baseUrl":"{pos}: baseUrl \u306F http:// \u307E\u305F\u306F https:// \u3067\u59CB\u307E\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","validate.modelIdEmpty":"{pos}: \u30E2\u30C7\u30EB id \u3092\u7A7A\u306B\u3067\u304D\u307E\u305B\u3093","validate.modelIdDup":"{pos}: \u30E2\u30C7\u30EB id\u300C{id}\u300D\u304C\u91CD\u8907\u3057\u3066\u3044\u307E\u3059","validate.maxIn":"{pos}: \u30E2\u30C7\u30EB\u300C{id}\u300D\u306E maxInputTokens \u306F\u6B63\u306E\u6574\u6570\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","validate.maxOut":"{pos}: \u30E2\u30C7\u30EB\u300C{id}\u300D\u306E maxOutputTokens \u306F\u6B63\u306E\u6574\u6570\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","validate.noModels":"{pos}: \u5C11\u306A\u304F\u3068\u3082 1 \u3064\u306E\u30E2\u30C7\u30EB\u304C\u5FC5\u8981\u3067\u3059","validate.webUrl":"{pos}: webSearch.baseUrl \u306F http:// \u307E\u305F\u306F https:// \u3067\u59CB\u307E\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","validate.webCount":"{pos}: webSearch.count \u306F 1\u301C50 \u306E\u6574\u6570\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","validate.webEngine":"{pos}: webSearch.engine \u306F deepseek \u307E\u305F\u306F bing \u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","validate.webDisabled":"{pos}: webSearch.disabled \u306F\u30D6\u30FC\u30EB\u5024\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","validate.thinkShape":'{pos}: \u30E2\u30C7\u30EB\u300C{id}\u300D\u306E thinking \u306F\u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\uFF08\u4F8B: { "default": "off", "on": {...}, "off": {...} }\uFF09',"validate.thinkTier":"{pos}: \u30E2\u30C7\u30EB\u300C{id}\u300D\u306E thinking.{tier} \u306F JSON \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","validate.thinkReserved":"{pos}: \u30E2\u30C7\u30EB\u300C{id}\u300D\u306E thinking.{tier} \u3067\u30D7\u30ED\u30C8\u30B3\u30EB\u30D5\u30A3\u30FC\u30EB\u30C9\u3092\u4E0A\u66F8\u304D\u3067\u304D\u307E\u305B\u3093: {keys}","validate.thinkTooLong":"{pos}: \u30E2\u30C7\u30EB\u300C{id}\u300D\u306E thinking.{tier} \u304C {n} \u6587\u5B57\u3092\u8D85\u3048\u3066\u3044\u307E\u3059","validate.thinkEmpty":"{pos}: \u30E2\u30C7\u30EB\u300C{id}\u300D\u306E thinking \u306B\u306F on / off \u306E\u5C11\u306A\u304F\u3068\u3082\u4E00\u65B9\u304C\u5FC5\u8981\u3067\u3059","validate.needProvider":"\u5C11\u306A\u304F\u3068\u3082 1 \u3064\u306E provider \u304C\u5FC5\u8981\u3067\u3059","usage.today":"\u4ECA\u65E5","usage.7d":"\u76F4\u8FD1 7 \u65E5","usage.30d":"\u76F4\u8FD1 30 \u65E5","usage.all":"\u3059\u3079\u3066","dash.title":"Token \u4F7F\u7528\u91CF","dash.statusReady":"\u6E96\u5099\u5B8C\u4E86","dash.refresh":"\u66F4\u65B0","dash.refreshTitle":"\u53F0\u5E33\u3092\u518D\u8AAD\u307F\u8FBC\u307F","dash.emptyA":"\u307E\u3060\u8A18\u9332\u304C\u3042\u308A\u307E\u305B\u3093\u3002","dash.emptyB":"\u6700\u521D\u306E\u30BF\u30FC\u30F3\u5F8C\u306B\u8868\u793A\u3055\u308C\u307E\u3059 \u2014 \u5404\u30BF\u30FC\u30F3\u306E token \u5408\u8A08\u304C\u30ED\u30FC\u30AB\u30EB\u53F0\u5E33\u306B\u8FFD\u8A18\u3055\u308C\u307E\u3059\u3002","dash.byModel":"\u30E2\u30C7\u30EB\u5225","dash.byDay":"\u65E5\u5225","dash.byMode":"\u30E2\u30FC\u30C9\u5225","dash.recent":"\u6700\u8FD1\u306E\u8A18\u9332","dash.thModel":"\u30E2\u30C7\u30EB","dash.thRequests":"\u30EA\u30AF\u30A8\u30B9\u30C8","dash.thInput":"\u5165\u529B","dash.thOutput":"\u51FA\u529B","dash.thTotal":"\u5408\u8A08","dash.thCache":"\u30AD\u30E3\u30C3\u30B7\u30E5\u30D2\u30C3\u30C8","dash.thShare":"\u5272\u5408","dash.thMode":"\u30E2\u30FC\u30C9","dash.thTurns":"\u30BF\u30FC\u30F3","dash.thTime":"\u6642\u523B","dash.openDir":"\u30C7\u30FC\u30BF\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u958B\u304F","dash.dirTitle":"\u53F0\u5E33\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA","dash.foot":"Token \u6570\u306E\u307F\u96C6\u8A08\uFF1B\u8CBB\u7528\u306F\u63A8\u5B9A\u3057\u307E\u305B\u3093","dash.modeExecute":"\u30D7\u30E9\u30F3\u5B9F\u884C","dash.modeUnknown":"\u4E0D\u660E","dash.loading":"\u8AAD\u307F\u8FBC\u307F\u4E2D\u2026","dash.turns":"\u30BF\u30FC\u30F3","dash.requests":"\u30EA\u30AF\u30A8\u30B9\u30C8","dash.input":"\u5165\u529B","dash.output":"\u51FA\u529B","dash.total":"\u5408\u8A08","dash.cache":"\u30AD\u30E3\u30C3\u30B7\u30E5\u30D2\u30C3\u30C8","dash.partial":"\u4E2D\u65AD\u30BF\u30FC\u30F3 {n} \u4EF6\u3092\u88DC\u8A18","dash.perTurn":"1 \u30BF\u30FC\u30F3\u3042\u305F\u308A {n}","dash.estTurns":"\u63A8\u5B9A\u30BF\u30FC\u30F3 {n} \u4EF6\u3092\u542B\u3080","dash.cached":"\u30AD\u30E3\u30C3\u30B7\u30E5\u7531\u6765 {n}","dash.models":"\u30E2\u30C7\u30EB {n}","dash.unknownModel":"\u4E0D\u660E\u306A\u30E2\u30C7\u30EB","dash.days":"{n} \u65E5 \xB7 \u9752=\u5165\u529B \u7DD1=\u51FA\u529B","dash.dayTip":"{day} \xB7 \u2191{input} \u2193{output} \xB7 \u30EA\u30AF\u30A8\u30B9\u30C8 {n} \u56DE","dash.recentCount":"{n} \u4EF6\uFF08\u6700\u5927 50\uFF09","dash.interrupted":" \xB7 \u4E2D\u65AD","dash.recordOff":"\u4F7F\u7528\u91CF\u306E\u8A18\u9332\u306F\u30AA\u30D5\u3067\u3059\uFF08luban.usage.record=false\uFF09\u2014 \u3053\u306E\u30BF\u30FC\u30F3\u4EE5\u964D\u306F\u65B0\u3057\u3044\u8A18\u9332\u3092\u66F8\u304D\u307E\u305B\u3093\u3002","dash.badLines":"\u53F0\u5E33\u306E\u8AAD\u3081\u306A\u3044\u884C {n} \u4EF6\u3092\u30B9\u30AD\u30C3\u30D7\u3057\u307E\u3057\u305F\u3002","dash.noRecords":"\u8A18\u9332\u306A\u3057","dash.statusTurns":"{n} \u30BF\u30FC\u30F3","hub.title":"\u8A2D\u5B9A\u3068\u4F7F\u7528\u91CF","hub.navGeneral":"\u4E00\u822C","hub.navSettings":"\u8A2D\u5B9A","hub.navUsage":"\u4F7F\u7528\u91CF","hub.navGeneralTitle":"Luban \u8A2D\u5B9A\uFF08\u8A00\u8A9E / \u30B3\u30F3\u30C6\u30AD\u30B9\u30C8 / Agent \u306A\u3069\uFF09","hub.navSettingsTitle":"Provider \u8A2D\u5B9A\uFF08\u30E2\u30C7\u30EB / base URL / API \u30AD\u30FC\uFF09","hub.navUsageTitle":"Token \u4F7F\u7528\u91CF\u30C0\u30C3\u30B7\u30E5\u30DC\u30FC\u30C9\uFF08\u30E2\u30C7\u30EB / \u65E5 / \u30E2\u30FC\u30C9\u5225\uFF09","general.title":"\u4E00\u822C","general.statusReady":"\u6E96\u5099\u5B8C\u4E86","general.save":"\u4FDD\u5B58","general.unsaved":"\u672A\u4FDD\u5B58","general.saving":"\u4FDD\u5B58\u4E2D\u2026","general.loaded":"\u8AAD\u307F\u8FBC\u307F\u6E08\u307F","general.saved":"\u4FDD\u5B58\u3057\u307E\u3057\u305F","general.invalid":"\u691C\u8A3C\u30A8\u30E9\u30FC {n} \u4EF6","general.groupUi":"\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30FC\u30B9","general.groupContext":"\u81EA\u52D5\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8","general.groupSession":"\u30BB\u30C3\u30B7\u30E7\u30F3","general.groupAgent":"Agent","general.groupTools":"\u30C4\u30FC\u30EB\u3068\u5B89\u5168","general.groupBrowser":"\u30D6\u30E9\u30A6\u30B6\u30FC\uFF08\u62E1\u5F35\u8A2D\u5B9A\uFF09","general.groupReview":"\u30EC\u30D3\u30E5\u30FC","general.groupInline":"Tab \u88DC\u5B8C","general.groupUsage":"\u4F7F\u7528\u91CF","general.language":"\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30FC\u30B9\u8A00\u8A9E","general.languageTitle":"Luban \u306E UI \u306E\u307F\u306B\u5F71\u97FF\u3057\u3001\u30A8\u30C7\u30A3\u30BF\u306E\u8868\u793A\u8A00\u8A9E\u306F\u5909\u308F\u308A\u307E\u305B\u3093","general.languageNote":"Luban \u81EA\u8EAB\u306E UI \u306E\u307F\u306B\u5F71\u97FF\u3057\u307E\u3059 \u2014 VS Code / VSCodium \u306E\u8868\u793A\u8A00\u8A9E\u306F\u5909\u308F\u308A\u307E\u305B\u3093\u3002\u30B3\u30DE\u30F3\u30C9\u30D1\u30EC\u30C3\u30C8\u306E\u30BF\u30A4\u30C8\u30EB\u306F\u30A8\u30C7\u30A3\u30BF\u8A00\u8A9E\u306B\u5F93\u3044\u307E\u3059\u3002","general.langAuto":"VS Code \u306E\u8868\u793A\u8A00\u8A9E\u306B\u5408\u308F\u305B\u308B","general.langZhCn":"\u7B80\u4F53\u4E2D\u6587","general.langEn":"English","general.langJa":"\u65E5\u672C\u8A9E","general.autoOpen":"\u8D77\u52D5\u6642\u306B\u30B5\u30A4\u30C9\u30D0\u30FC\u3092\u958B\u304F","general.contextAutoFile":"\u73FE\u5728\u306E\u30A8\u30C7\u30A3\u30BF\u30B3\u30FC\u30C9\u3092\u6DFB\u4ED8","general.contextMaxChars":"\u6587\u5B57\u6570\u4E0A\u9650","general.contextWindowLines":"\u30A6\u30A3\u30F3\u30C9\u30A6\u884C\u6570\uFF08\u9078\u629E\u306A\u3057\uFF09","general.sessionHistoryMax":"\u30BB\u30C3\u30B7\u30E7\u30F3\u5C65\u6B74\u306E\u4E0A\u9650","general.sessionMemoryEnabled":"\u30DE\u30EB\u30C1\u30BF\u30FC\u30F3\u8A18\u61B6","general.sessionMemoryMaxTurns":"\u8A18\u61B6\u30BF\u30FC\u30F3\u6570","general.sessionMemoryMaxChars":"\u8A18\u61B6\u306E\u6587\u5B57\u4E88\u7B97","general.agentMaxRounds":"\u30EA\u30AF\u30A8\u30B9\u30C8\u30E9\u30A6\u30F3\u30C9\u4E0A\u9650\uFF080 = \u7121\u5236\u9650\uFF09","general.agentMaxMinutes":"\u30A6\u30A9\u30FC\u30EB\u30AF\u30ED\u30C3\u30AF\u4E0A\u9650\uFF08\u5206\uFF09","general.agentSubagentRounds":"\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u30E9\u30A6\u30F3\u30C9\u6570\uFF080 = \u30AA\u30D5\uFF09","general.agentSubagentMinutes":"\u30B5\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306E\u5236\u9650\u6642\u9593\uFF08\u5206\u30010 = \u30BF\u30FC\u30F3\u306B\u8FFD\u5F93\uFF09","general.agentSmallWindow":"\u5C0F\u30A6\u30A3\u30F3\u30C9\u30A6\u30E2\u30FC\u30C9","general.smallWindowAuto":"\u81EA\u52D5\uFF08\u30E2\u30C7\u30EB\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u306B\u3088\u308B\uFF09","general.smallWindowOn":"\u5F37\u5236\u30AA\u30F3","general.smallWindowOff":"\u30AA\u30D5","general.agentVerbosity":"\u8A73\u7D30\u5EA6","general.verbosityConcise":"\u7C21\u6F54\uFF08\u4E00\u884C\uFF09","general.verbosityNormal":"\u6A19\u6E96\uFF08\u7C21\u6F54\u30EC\u30DD\u30FC\u30C8\uFF09","general.verbosityDetailed":"\u8A73\u7D30\uFF08\u69CB\u9020\u5316\uFF09","general.contextWorkset":"\u5909\u66F4\u30D5\u30A1\u30A4\u30EB\u3092\u81EA\u52D5\u3067\u30B3\u30F3\u30C6\u30AD\u30B9\u30C8\u306B","general.searchMaxFiles":"search_code \u30A4\u30F3\u30C7\u30C3\u30AF\u30B9\u306E\u30D5\u30A1\u30A4\u30EB\u4E0A\u9650","general.planStrictReadOnly":"Plan \u30E2\u30FC\u30C9\u3067\u53B3\u683C\u306A\u8AAD\u307F\u53D6\u308A\u5C02\u7528","general.fsAllowOutside":"\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9\u5916\u306E\u30D1\u30B9\u3092\u8A31\u53EF","general.diagAfterEdit":"\u66F8\u304D\u8FBC\u307F\u5F8C\u306B\u8A3A\u65AD\u3092\u81EA\u52D5\u8AAD\u307F\u8FBC\u307F","general.browserEnabled":"\u5185\u8535\u30D6\u30E9\u30A6\u30B6\u30FC\u30C4\u30FC\u30EB\u3092\u6709\u52B9\u5316","general.browserHeadless":"\u30D8\u30C3\u30C9\u30EC\u30B9\u3067\u5B9F\u884C\uFF08\u30A6\u30A3\u30F3\u30C9\u30A6\u3092\u51FA\u3055\u306A\u3044\uFF09","general.browserViewportWidth":"\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u5E45\uFF08320\u301C4096\uFF09","general.browserViewportHeight":"\u30D3\u30E5\u30FC\u30DD\u30FC\u30C8\u9AD8\u3055\uFF08240\u301C4096\uFF09","general.browserIdleTimeoutMs":"\u30A2\u30A4\u30C9\u30EB\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\uFF08ms\uFF09","general.browserChromePath":"Chrome / Edge \u306E\u30D1\u30B9","general.browserChromePathPh":"\u7A7A\u6B04\u3067\u81EA\u52D5\u691C\u51FA\uFF08LUBAN_CHROME_PATH \u3082\u53C2\u7167\uFF09","general.browserNote":"\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u30C4\u30FC\u30EB\uFF1A\u30DA\u30FC\u30B8\u3092\u958B\u304F / \u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u30C4\u30EA\u30FC / \u30B9\u30AF\u30EA\u30FC\u30F3\u30B7\u30E7\u30C3\u30C8 / console / \u5931\u6557\u30EA\u30AF\u30A8\u30B9\u30C8\u3002\u30AF\u30EA\u30C3\u30AF\u3084\u5165\u529B\u306F\u3067\u304D\u307E\u305B\u3093\u3002\u30ED\u30FC\u30AB\u30EB\u306E Chrome \u307E\u305F\u306F Edge \u304C\u5FC5\u8981\u3067\u3059\u3002\u30AA\u30D5\u306E\u3068\u304D\u306F\u30C4\u30FC\u30EB\u304C\u30E2\u30C7\u30EB\u306E\u4E00\u89A7\u306B\u51FA\u307E\u305B\u3093\u3002","general.groupComputer":"\u30C7\u30B9\u30AF\u30C8\u30C3\u30D7\u64CD\u4F5C\uFF08macOS / Windows\uFF09","general.computerEnabled":"\u30C7\u30B9\u30AF\u30C8\u30C3\u30D7\u64CD\u4F5C\u30C4\u30FC\u30EB\u3092\u6709\u52B9\u5316","general.computerConfirm":"\u30DE\u30A6\u30B9 / \u30AD\u30FC\u30DC\u30FC\u30C9\u64CD\u4F5C\u306E\u524D\u306B 1 \u56DE\u78BA\u8A8D","general.computerScreenshotWidth":"\u64AE\u5F71\u306E\u6700\u5927\u5E45\uFF08320\u301C4096\uFF09","general.computerNote":"\u64AE\u5F71 / \u753B\u9762\u5185\u30C6\u30AD\u30B9\u30C8\u306E\u8A8D\u8B58\uFF08Windows \u3067\u306F\u672A\u5BFE\u5FDC\u3067\u3001\u30B9\u30AF\u30EA\u30FC\u30F3\u30B7\u30E7\u30C3\u30C8\u3092\u898B\u308B\u7D4C\u8DEF\u306B\u5207\u308A\u66FF\u308F\u308A\u307E\u3059\uFF09/ \u30A6\u30A3\u30F3\u30C9\u30A6\u4E00\u89A7 / \u30AF\u30EA\u30C3\u30AF / \u5165\u529B / \u30AD\u30FC / \u30B9\u30AF\u30ED\u30FC\u30EB / \u30C9\u30E9\u30C3\u30B0\u3002macOS \u3068 Windows \u3067\u4F7F\u7528\u53EF\u3001Plan \u30E2\u30FC\u30C9\u3067\u306F\u4F7F\u3048\u307E\u305B\u3093\u3002macOS \u3067\u306F\u30DB\u30B9\u30C8 App \u306B\u300C\u753B\u9762\u53CE\u9332\u300D\u3068\u300C\u30A2\u30AF\u30BB\u30B7\u30D3\u30EA\u30C6\u30A3\u300D\u306E\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3001\u7121\u3044\u3068\u64AE\u5F71\u306F\u5931\u6557\u3057\u30AF\u30EA\u30C3\u30AF\u306F\u30B7\u30B9\u30C6\u30E0\u306B\u7834\u68C4\u3055\u308C\u307E\u3059\u3002Windows \u306F\u6A29\u9650\u4E0D\u8981\u3067\u3059\u304C\u3001\u7BA1\u7406\u8005\u3068\u3057\u3066\u5B9F\u884C\u4E2D\u306E\u30A6\u30A3\u30F3\u30C9\u30A6\u306F\u901A\u5E38\u30D7\u30ED\u30BB\u30B9\u306E\u5165\u529B\u3092\u7121\u8996\u3057\u307E\u3059\u3002","general.reviewAutoOpenDiff":"\u66F8\u304D\u8FBC\u307F\u5F8C\u306B diff \u3092\u81EA\u52D5\u8868\u793A","general.inlineEnabled":"Tab \u88DC\u5B8C\u3092\u6709\u52B9\u5316","general.inlineMaxPerMinute":"1 \u5206\u3042\u305F\u308A\u306E\u30EA\u30AF\u30A8\u30B9\u30C8\u4E0A\u9650","general.inlineDebounceMs":"\u30C7\u30D0\u30A6\u30F3\u30B9\u9045\u5EF6\uFF08ms\uFF09","general.usageRecord":"Token \u4F7F\u7528\u91CF\u3092\u8A18\u9332","general.errLanguage":"\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30FC\u30B9\u8A00\u8A9E\u306F auto / en / zh-cn / ja \u306E\u307F\u3067\u3059","general.errEnum":"\u300C{key}\u300D\u306E\u5024\u304C\u4E0D\u6B63\u3067\u3059","general.errNumber":"\u300C{key}\u300D\u306F\u6574\u6570\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","general.errMin":"\u300C{key}\u300D\u306F {min} \u4EE5\u4E0A\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","general.errMax":"\u300C{key}\u300D\u306F {max} \u4EE5\u4E0B\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059","settings.title":"Provider \u8A2D\u5B9A","settings.statusReady":"\u6E96\u5099\u5B8C\u4E86","settings.save":"\u4FDD\u5B58","settings.defaultModel":"\u30C7\u30D5\u30A9\u30EB\u30C8\u30E2\u30C7\u30EB","settings.defaultModelTitle":"\u30D1\u30CD\u30EB\u306E\u30E2\u30C7\u30EB\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u306E\u521D\u671F\u9078\u629E","settings.defaultModelNote":"\u30E2\u30C7\u30EB id \u304C provider \u9593\u3067\u91CD\u8907\u3059\u308B\u5834\u5408\u306F\u81EA\u52D5\u3067 <code>providerId::modelId</code> \u30D7\u30EC\u30D5\u30A3\u30C3\u30AF\u30B9\u304C\u4ED8\u304D\u307E\u3059\u3002API \u30AD\u30FC\u306F VS Code SecretStorage \u306B\u4FDD\u5B58\u3055\u308C\u3001\u8A2D\u5B9A\u30D5\u30A1\u30A4\u30EB\u306B\u306F\u66F8\u304D\u307E\u305B\u3093\u3002","settings.addProvider":"+ provider \u3092\u8FFD\u52A0","settings.openConfig":"providers.json \u3092\u958B\u304F","settings.unsaved":"\u672A\u4FDD\u5B58","settings.firstModel":"\uFF08\u6700\u521D\u306E\u30E2\u30C7\u30EB\uFF09","settings.noModel":"\uFF08\u30E2\u30C7\u30EB\u304C\u307E\u3060\u3042\u308A\u307E\u305B\u3093\uFF09","settings.modelIdPh":"model id\uFF08\u5FC5\u9808\uFF09","settings.modelNamePh":"\u8868\u793A\u540D\uFF08\u4EFB\u610F\uFF09","settings.toolCallingTitle":"toolCalling\uFF1AAgent \u30E2\u30FC\u30C9\u3067\u4F7F\u3046\u306B\u306F\u30C1\u30A7\u30C3\u30AF\u5FC5\u9808","settings.visionTitle":"vision\uFF1A\u30E2\u30C7\u30EB\u304C\u753B\u50CF\u5165\u529B\u306B\u5BFE\u5FDC\uFF08\u30C1\u30E3\u30C3\u30C8\u306B\u753B\u50CF\u3092\u8CBC\u308A\u4ED8\u3051\uFF09","settings.thinkTitle":"thinking\uFF1A\u601D\u8003\u30C6\u30A3\u30A2\u3002on / off \u306E JSON \u306F\u305D\u306E\u307E\u307E\u30EA\u30AF\u30A8\u30B9\u30C8\u672C\u6587\u306B\u30DE\u30FC\u30B8\u3055\u308C\u307E\u3059\uFF08\u4F8B: chat_template_kwargs.enable_thinking\u3001reasoning\u3001think\uFF09\uFF1B\u7A7A\u306A\u3089\u305D\u306E\u30C6\u30A3\u30A2\u306F\u4F55\u3082\u9001\u308A\u307E\u305B\u3093\u3002\u300C\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u5165\u529B\u300D\u3067\u4E00\u822C\u7684\u306A\u65B9\u8A00\u3092\u751F\u6210\u3067\u304D\u307E\u3059","settings.thinkDefault":"\u30C7\u30D5\u30A9\u30EB\u30C8\u30C6\u30A3\u30A2","settings.thinkDefaultOff":"\u30C7\u30D5\u30A9\u30EB\u30C8\uFF1A\u30AA\u30D5","settings.thinkDefaultOn":"\u30C7\u30D5\u30A9\u30EB\u30C8\uFF1A\u30AA\u30F3","settings.thinkPreset":"\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3092\u5165\u529B\u2026","settings.thinkPresetQwen":"Qwen / vLLM","settings.thinkPresetDeepseek":"DeepSeek","settings.thinkPresetOpenrouter":"OpenRouter","settings.thinkPresetAnthropic":"Anthropic \u4E92\u63DB","settings.thinkPresetOllama":"Ollama","settings.thinkPresetOverwrite":"on / off \u306B\u65E2\u306B\u5185\u5BB9\u304C\u3042\u308A\u307E\u3059\u3002\u30C6\u30F3\u30D7\u30EC\u30FC\u30C8\u3067\u4E0A\u66F8\u304D\u3057\u307E\u3059\u304B\uFF1F","settings.thinkOn":"\u30AA\u30F3\uFF08on\uFF09","settings.thinkOff":"\u30AA\u30D5\uFF08off\uFF09","settings.thinkOnPh":'\u7A7A = \u9001\u4FE1\u3057\u306A\u3044\u3002\u4F8B: { "chat_template_kwargs": { "enable_thinking": true } }',"settings.thinkOffPh":'\u7A7A = \u9001\u4FE1\u3057\u306A\u3044\u3002\u4F8B: { "thinking": { "type": "disabled" } }',"settings.thinkBadJson":"{pos} \u30E2\u30C7\u30EB\u300C{id}\u300Dthinking.{tier} \u306F\u6B63\u3057\u3044 JSON \u3067\u306F\u3042\u308A\u307E\u305B\u3093","settings.thinkBadShape":"{pos} \u30E2\u30C7\u30EB\u300C{id}\u300Dthinking.{tier} \u306F JSON \u30AA\u30D6\u30B8\u30A7\u30AF\u30C8\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\uFF08\u914D\u5217\u3084\u30B9\u30AB\u30E9\u30FC\u4E0D\u53EF\uFF09","settings.deleteModel":"\u3053\u306E\u30E2\u30C7\u30EB\u3092\u524A\u9664","settings.providerNamePh":"provider \u540D\uFF08\u4F8B: DeepSeek\uFF09","settings.deleteProvider":"provider \u3092\u524A\u9664","settings.idLabel":"id\uFF08\u4E00\u610F\uFF1B\u82F1\u6570\u5B57/_/-\uFF09","settings.apiKeyEnvLabel":"apiKeyEnv\uFF08\u4EFB\u610F\uFF09","settings.keyLabel":"API key\uFF08VS Code SecretStorage \u306B\u4FDD\u5B58\uFF09","settings.keyPhSaved":"\u4FDD\u5B58\u6E08\u307F \u2014 \u7A7A\u6B04\u306E\u307E\u307E\u306A\u3089\u5909\u66F4\u3057\u307E\u305B\u3093","settings.keyPh":"sk-\u2026\uFF08SecretStorage \u306E\u307F\u306B\u66F8\u304D\u8FBC\u307F\uFF09","settings.clearKey":"\u30AD\u30FC\u3092\u30AF\u30EA\u30A2","settings.test":"\u63A5\u7D9A\u30C6\u30B9\u30C8","settings.testing":"\u30C6\u30B9\u30C8\u4E2D\u2026\uFF08\u6700\u521D\u306E\u30E2\u30C7\u30EB\u3001max_tokens=1\uFF09","settings.fetchModels":"\u30E2\u30C7\u30EB\u3092\u53D6\u5F97","settings.fetching":"/models \u3092\u30EA\u30AF\u30A8\u30B9\u30C8\u4E2D\u2026","settings.modelsHead":"\u30E2\u30C7\u30EB\uFF08{n}\uFF09\xB7 id / \u8868\u793A\u540D / maxInputTokens / maxOutputTokens / toolCalling / vision / thinking","settings.addModel":"+ \u30E2\u30C7\u30EB\u3092\u8FFD\u52A0","settings.errors":"\u4FEE\u6B63\u304C\u5FC5\u8981\u306A\u7B87\u6240\u304C {n} \u4EF6\u3042\u308A\u307E\u3059\uFF1A","settings.noProviders":"\u307E\u3060 provider \u304C\u3042\u308A\u307E\u305B\u3093 \u2014 \u4E0B\u306E\u300C+ provider \u3092\u8FFD\u52A0\u300D\u304B\u3089\u59CB\u3081\u3066\u304F\u3060\u3055\u3044\u3002","settings.saving":"\u4FDD\u5B58\u4E2D\u2026","settings.builtin":"\u5185\u8535\u306E\u30C7\u30D5\u30A9\u30EB\u30C8\u8A2D\u5B9A\u3092\u4F7F\u7528\u4E2D\uFF1B\u4FDD\u5B58\u3059\u308B\u3068 {path} \u306B\u66F8\u304D\u8FBC\u307F\u307E\u3059","settings.loaded":"\u8AAD\u307F\u8FBC\u307F\u6E08\u307F","settings.saved":"\u4FDD\u5B58\u3057\u307E\u3057\u305F \xB7 \u30E2\u30C7\u30EB {n}","settings.invalid":"\u554F\u984C\u304C {n} \u4EF6\u3042\u308A\u3001\u4FDD\u5B58\u3057\u3066\u3044\u307E\u305B\u3093","settings.testOk":"\u524D\u56DE\u306E\u30C6\u30B9\u30C8 OK \xB7 {ms}ms","settings.testFailed":"\u524D\u56DE\u306E\u30C6\u30B9\u30C8\u5931\u6557","settings.testOkResult":"\u2705 HTTP {status} \xB7 {ms}ms{reply}","settings.testFailResult":"\u274C {msg}","settings.fail":"\u5931\u6557","settings.fetchFail":"\u53D6\u5F97\u306B\u5931\u6557\u3057\u307E\u3057\u305F","settings.fetched":"\u2705 \u30E2\u30C7\u30EB\u3092 {n} \u4EF6\u53D6\u5F97","settings.fetchedAdded":"\uFF1B\u65B0\u898F {n} \u4EF6\uFF08\u4FDD\u5B58\u3092\u5FD8\u308C\u305A\u306B\uFF09","settings.fetchedNone":"\uFF1B\u65B0\u3057\u3044\u30E2\u30C7\u30EB\u306F\u3042\u308A\u307E\u305B\u3093","settings.keySet":"\u4FDD\u5B58\u6642\u306B SecretStorage \u3078\u66F8\u304D\u8FBC\u307F\u307E\u3059\uFF08\u30C7\u30A3\u30B9\u30AF\u306B\u306F\u66F8\u304D\u307E\u305B\u3093\uFF09","settings.keyClear":"\u4FDD\u5B58\u6642\u306B\u4FDD\u5B58\u6E08\u307F\u30AD\u30FC\u3092\u524A\u9664\u3057\u307E\u3059","settings.keySecret":"\u3059\u3067\u306B SecretStorage \u306B\u3042\u308A\u307E\u3059","settings.keyInline":"\u8A2D\u5B9A\u306B\u5E73\u6587 apiKey \u304C\u3042\u308A\u307E\u3059\uFF08\u4FDD\u5B58\u6642\u3082\u4FDD\u6301\uFF09","settings.keyEnv":"\u74B0\u5883\u5909\u6570 {env} \u3092\u4F7F\u7528\uFF08\u30AD\u30FC\u306F\u3053\u3053\u306B\u8868\u793A\u3055\u308C\u307E\u305B\u3093\uFF09","settings.keyNone":"\u30AD\u30FC\u672A\u8A2D\u5B9A","settings.unnamedModel":"\u540D\u79F0\u672A\u8A2D\u5B9A"}},n="zh-cn";function s(d){let f=String(d??"").toLowerCase();if(!f||f==="auto")return null;let p=f.slice(0,2);return p==="zh"?"zh-cn":p==="ja"?"ja":"en"}function o(){let d=typeof navigator<"u"&&navigator&&navigator.language||"";return/^zh/i.test(d)?"zh-cn":/^ja/i.test(d)?"ja":"en"}function r(d){return n=s(d)||o(),n}function i(){return n}function a(d,f,p){let h=s(d)||n,x=(e[h]||e["zh-cn"])[f];return x==null&&(x=e["zh-cn"][f]),x==null?f:(p&&(x=String(x).replace(/\{(\w+)\}/g,function(b,k){return p[k]==null?b:String(p[k])})),x)}function l(d,f){return a(n,d,f)}function c(d){return e["zh-cn"][d]!=null}let u={t:l,tIn:a,setLang:r,getLang:i,has:c,normalize:s,langs:["zh-cn","en","ja"]};typeof ho<"u"&&ho&&ho.exports&&(ho.exports=u),t&&(t.LubanI18n=u)})(typeof globalThis<"u"?globalThis:Zf)});var ep=Q((BS,hw)=>{hw.exports={name:"@luban-code/luban-code",displayName:"Luban",description:"Luban \u2014 a standalone sidebar AI coding agent (multi-provider, OpenAI-compatible, zero source patches)",version:"1.66.1",license:"Apache-2.0",author:{name:"eppen (liuhualiang)",url:"https://github.com/eppen"},publisher:"liuhualiang",icon:"media/icon.png",homepage:"https://github.com/eppen/luban#readme",bugs:{url:"https://github.com/eppen/luban/issues"},keywords:["ai","agent","chat","coding-agent","qwen","deepseek","openai-compatible","mcp"],repository:{type:"git",url:"https://github.com/eppen/luban.git"},engines:{vscode:"^1.100.0"},categories:["AI","Chat","Programming Languages"],activationEvents:["onStartupFinished","onView:luban.chatView","onCommand:luban.focusView"],main:"./dist/extension.js",bin:{luban:"./dist/cli.js"},files:["dist/cli.js","dist/extension.js","package.json"],scripts:{build:"node scripts/build.js",watch:"node scripts/build.js --watch",package:"node scripts/build.js","vscode:prepublish":"node scripts/build.js",prepack:"node scripts/build.js",smoke:"node scripts/build.js && node scripts/smoke.js","test:skills":"node scripts/test-skills.js",cli:"node cli.js",vsix:"npx --yes @vscode/vsce@latest package --no-dependencies","test:general":"node scripts/test-general-settings.js","test:browser-events":"node scripts/test-browser-events.js","test:browser-tool":"node scripts/test-browser-tool.js","test:computer-tool":"node scripts/test-computer-tool.js","test:subagent":"node scripts/test-subagent-guards.js","test:gamepad":"node scripts/test-gamepad.js"},capabilities:{untrustedWorkspaces:{supported:!0},virtualWorkspaces:!0},contributes:{commands:[{command:"luban.focusView",title:"%cmdFocusView%",category:"Luban"},{command:"luban.openPanel",title:"%cmdOpenPanel%",category:"Luban"},{command:"luban.reloadConfig",title:"%cmdReloadConfig%",category:"Luban"},{command:"luban.providerSettings",title:"%cmdProviderSettings%",category:"Luban"},{command:"luban.dashboard",title:"%cmdDashboard%",category:"Luban"},{command:"luban.agent",title:"%cmdAgent%",category:"Luban"},{command:"luban.openDiff",title:"%cmdOpenDiff%",category:"Luban"},{command:"luban.acceptHunk",title:"%cmdAcceptHunk%",category:"Luban"},{command:"luban.rejectHunk",title:"%cmdRejectHunk%",category:"Luban"},{command:"luban.acceptFile",title:"%cmdAcceptFile%",category:"Luban"},{command:"luban.rejectFile",title:"%cmdRejectFile%",category:"Luban"},{command:"luban.reviewAll",title:"%cmdReviewAll%",category:"Luban"},{command:"luban.revertAll",title:"%cmdRevertAll%",category:"Luban"},{command:"luban.newSession",title:"%cmdNewSession%",category:"Luban"},{command:"luban.sessionList",title:"%cmdSessionList%",category:"Luban"},{command:"luban.cursorPlan",title:"%cmdCursorPlan%",category:"Luban"},{command:"luban.mode.cycle",title:"%cmdModeCycle%",category:"Luban"},{command:"luban.addFileToChat",title:"%cmdAddFileToChat%",category:"Luban"},{command:"luban.addFolderToChat",title:"%cmdAddFolderToChat%",category:"Luban"},{command:"luban.addSelectionToChat",title:"%cmdAddSelectionToChat%",category:"Luban"},{command:"luban.inlineCompletion.toggle",title:"%cmdInlineToggle%",category:"Luban"},{command:"luban.diffAccept",title:"%cmdDiffAccept%",category:"Luban"},{command:"luban.diffReject",title:"%cmdDiffReject%",category:"Luban"},{command:"luban.openInBrowser",title:"%cmdOpenInBrowser%",category:"Luban"},{command:"luban.browserCheck",title:"%cmdBrowserCheck%",category:"Luban"}],menus:{"editor/title":[{command:"luban.diffAccept",when:"isInDiffEditor && luban.reviewDiffActive && luban.pendingReview > 0",group:"navigation@1"},{command:"luban.diffReject",when:"isInDiffEditor && luban.reviewDiffActive && luban.pendingReview > 0",group:"navigation@2"}],"explorer/context":[{command:"luban.addFileToChat",when:"!explorerResourceIsFolder && resourceScheme == file",group:"1_luban@1"},{command:"luban.addFolderToChat",when:"explorerResourceIsFolder && resourceScheme == file",group:"1_luban@2"}],"editor/context":[{command:"luban.addSelectionToChat",when:"editorHasSelection && resourceScheme == file",group:"1_luban@0"}],"webview/context":[{command:"luban.openInBrowser",when:"webviewSection == 'chat'"}],commandPalette:[{command:"luban.diffAccept",when:"luban.pendingReview > 0"},{command:"luban.diffReject",when:"luban.pendingReview > 0"},{command:"luban.addFileToChat",when:"false"},{command:"luban.addFolderToChat",when:"false"},{command:"luban.addSelectionToChat",when:"editorHasSelection"},{command:"luban.openInBrowser",when:"false"}]},keybindings:[{command:"luban.focusView",key:"cmd+shift+l",mac:"cmd+shift+l",win:"ctrl+shift+l",linux:"ctrl+shift+l"},{command:"luban.newSession",key:"cmd+alt+n",mac:"cmd+alt+n",win:"ctrl+alt+n",linux:"ctrl+alt+n"},{command:"luban.sessionList",key:"cmd+alt+h",mac:"cmd+alt+h",win:"ctrl+alt+h",linux:"ctrl+alt+h"},{command:"luban.mode.cycle",key:"shift+tab",mac:"shift+tab",win:"shift+tab",linux:"shift+tab",when:"focusedView == 'luban.chatView'"},{command:"luban.addSelectionToChat",key:"cmd+alt+a",mac:"cmd+alt+a",win:"ctrl+alt+a",linux:"ctrl+alt+a",when:"editorHasSelection && editorTextFocus"}],viewsContainers:{activitybar:[{id:"luban",title:"Luban",icon:"media/icon.svg"}]},views:{luban:[{type:"webview",id:"luban.chatView",name:"Chat",contextualTitle:"Luban"}]},configuration:{title:"Luban",properties:{"luban.language":{type:"string",enum:["auto","en","zh-cn","ja"],enumDescriptions:["%cfgLanguageAuto%","%cfgLanguageEn%","%cfgLanguageZhCn%","%cfgLanguageJa%"],default:"auto",description:"%cfgLanguage%"},"luban.autoOpen":{type:"boolean",default:!0,description:"%cfgAutoOpen%"},"luban.context.autoFile":{type:"boolean",default:!0,description:"%cfgContextAutoFile%"},"luban.context.autoFileMaxChars":{type:"number",default:8e3,minimum:500,description:"%cfgContextAutoFileMaxChars%"},"luban.context.autoFileWindowLines":{type:"number",default:200,minimum:40,description:"%cfgContextAutoFileWindowLines%"},"luban.context.workset":{type:"boolean",default:!0,description:"%cfgContextWorkset%"},"luban.sessionHistory.max":{type:"number",default:50,minimum:1,description:"%cfgSessionHistoryMax%"},"luban.usage.record":{type:"boolean",default:!0,description:"%cfgUsageRecord%"},"luban.sessionMemory.enabled":{type:"boolean",default:!0,description:"%cfgSessionMemoryEnabled%"},"luban.sessionMemory.maxTurns":{type:"number",default:8,minimum:1,description:"%cfgSessionMemoryMaxTurns%"},"luban.sessionMemory.maxChars":{type:"number",default:12e3,minimum:1e3,description:"%cfgSessionMemoryMaxChars%"},"luban.agent.maxRounds":{type:"number",default:100,minimum:0,description:"%cfgAgentMaxRounds%"},"luban.agent.maxMinutes":{type:"number",default:15,minimum:1,description:"%cfgAgentMaxMinutes%"},"luban.agent.subagentRounds":{type:"number",default:24,minimum:0,description:"%cfgAgentSubagentRounds%"},"luban.agent.subagentMinutes":{type:"number",default:0,minimum:0,description:"%cfgAgentSubagentMinutes%"},"luban.agent.smallWindow":{type:"string",enum:["auto","on","off"],default:"auto",description:"%cfgAgentSmallWindow%"},"luban.agent.verbosity":{type:"string",enum:["concise","normal","detailed"],default:"normal",description:"%cfgAgentVerbosity%"},"luban.search.maxFiles":{type:"number",default:5e3,minimum:100,description:"%cfgSearchMaxFiles%"},"luban.browser.enabled":{type:"boolean",default:!1,description:"%cfgBrowserEnabled%"},"luban.browser.chromePath":{type:"string",default:"",description:"%cfgBrowserChromePath%"},"luban.browser.headless":{type:"boolean",default:!0,description:"%cfgBrowserHeadless%"},"luban.browser.viewportWidth":{type:"number",default:1280,minimum:320,maximum:4096,description:"%cfgBrowserViewportWidth%"},"luban.browser.viewportHeight":{type:"number",default:800,minimum:240,maximum:4096,description:"%cfgBrowserViewportHeight%"},"luban.browser.idleTimeoutMs":{type:"number",default:3e5,minimum:1e4,description:"%cfgBrowserIdleTimeout%"},"luban.computer.enabled":{type:"boolean",default:!1,description:"%cfgComputerEnabled%"},"luban.computer.confirm":{type:"boolean",default:!0,description:"%cfgComputerConfirm%"},"luban.computer.screenshotWidth":{type:"number",default:2048,minimum:320,maximum:4096,description:"%cfgComputerScreenshotWidth%"},"luban.plan.strictReadOnly":{type:"boolean",default:!0,description:"%cfgPlanStrictReadOnly%"},"luban.fs.allowOutsideWorkspace":{type:"boolean",default:!0,description:"%cfgFsAllowOutsideWorkspace%"},"luban.review.autoOpenDiff":{type:"boolean",default:!0,description:"%cfgReviewAutoOpenDiff%"},"luban.diagnostics.afterEdit":{type:"boolean",default:!0,description:"%cfgDiagAfterEdit%"},"luban.inlineCompletion.enabled":{type:"boolean",default:!1,description:"%cfgInlineEnabled%"},"luban.inlineCompletion.maxPerMinute":{type:"number",default:30,minimum:1,description:"%cfgInlineMaxPerMinute%"},"luban.inlineCompletion.debounceMs":{type:"number",default:250,minimum:0,description:"%cfgInlineDebounceMs%"}}}},devDependencies:{esbuild:"^0.25.0"},dependencies:{"@clack/prompts":"^1.8.1",picocolors:"^1.1.1"}}});var y=require("vscode"),O=require("fs"),P=require("path"),dt=require("os"),{exec:mw,execSync:gw}=require("child_process"),ct=tc(),Lt=uc(),yw=fc(),Xn=kc(),bw=_c(),ne=Li(),lt=Rc(),ut=Wc(),tp=Gc(),xe=ou(),Je=Su(),on=Mu(),Te=Lu(),Dp=Nu(),En=Ju(),Ir=Zu(),On=dd(),ze=kd(),xt=Cd(),an=Od(),he=Dd(),Z=Bd(),Pe=Qd(),K=process.platform==="win32"?vf():Nf(),Rt=process.platform==="win32",Np=Rt?"Windows":process.platform==="darwin"?"macOS":"\u4EC5\u652F\u6301 macOS / Windows",ww=Rt?" \u4EE5\u7BA1\u7406\u5458\u6743\u9650\u8FD0\u884C\u7684\u7A97\u53E3\u6536\u4E0D\u5230\u666E\u901A\u8FDB\u7A0B\u7684\u70B9\u51FB / \u6309\u952E\uFF08UIPI \u89C4\u5219\uFF09\uFF0C\u9700\u8981\u65F6\u8BA9\u5BBF\u4E3B App \u4E5F\u4EE5\u7BA1\u7406\u5458\u8FD0\u884C\u3002":" \u6CA1\u6709\u300C\u8F85\u52A9\u529F\u80FD\u300D\u6743\u9650\u65F6\u70B9\u51FB\u4F1A\u88AB\u7CFB\u7EDF\u9759\u9ED8\u4E22\u5F03\uFF0C\u6CA1\u6709\u300C\u5C4F\u5E55\u5F55\u5236\u300D\u6743\u9650\u65F6\u622A\u56FE\u4F1A\u5931\u8D25 \u2014\u2014 \u5206\u522B\u53BB\u7CFB\u7EDF\u8BBE\u7F6E\u7684\u9690\u79C1\u4E0E\u5B89\u5168\u6027\u91CC\u52FE\u9009\u5BBF\u4E3B App\u3002",To=Rt?"\u5C4F\u5E55\u7269\u7406\u50CF\u7D20":"\u5C4F\u5E55\u903B\u8F91\u70B9";function kw(){return Rt?{a:65,p:80,bang:49}:{a:0,p:35,bang:18}}var Qe=qf(),Ln=$f(),Qt=Yf(),Fp=Qf(),np=ep(),xw=os().SKIP_DIRS,Mo=np&&np.version||"0.0.0",Dr="/tmp/luban-ide",Sw=Dr+"/result.json",Le=P.join(dt.homedir(),".luban","providers.json"),wo={startedAt:new Date().toISOString(),steps:[],acks:[]},_w=400,sp=2e3,vs=null;function Rp(){try{O.mkdirSync(Dr,{recursive:!0}),O.writeFileSync(Sw,JSON.stringify(wo,null,2))}catch{}}function yl(){vs&&(clearTimeout(vs),vs=null),Rp()}function w(t,e){wo.steps.push({step:t,at:new Date().toISOString(),...e}),wo.steps.length>sp&&wo.steps.splice(0,wo.steps.length-sp),vs||(vs=setTimeout(function(){vs=null,Rp()},_w))}var vt="",qp=[];function Bp(t,e){let n=String(t??"auto").toLowerCase();if(n==="en")return"en";if(n==="ja"||n.slice(0,2)==="ja")return"ja";if(n.slice(0,2)==="zh")return"zh-cn";let s=String(e||"").toLowerCase();return s.slice(0,2)==="zh"?"zh-cn":s.slice(0,2)==="ja"?"ja":"en"}function bl(){let t="auto";try{t=y.workspace.getConfiguration("luban").get("language")}catch{}return Bp(t,y.env&&y.env.language)}function M(t,e){return Fp.t(t,e)}function Nr(t){vt=Fp.setLang(bl()),Lt.setUntitled(M("store.untitled")),Mw();try{qt&&qt.fire()}catch{}try{Ll()}catch{}return w("language_applied",{lang:vt,reason:t||""}),vt}function vw(t){for(let e of qp.splice(0))try{e(t)}catch{}}function Tw(t){return new Promise(function(e){let n=!1,s=setTimeout(function(){n||(n=!0,e(null))},t||8e3);qp.push(function(o){n||(n=!0,clearTimeout(s),e(o))})})}function Mw(){let t=[se&&se.webview,ce&&ce.webview,$e&&$e.webview];for(let e of t)if(e)try{e.postMessage({type:"lang",lang:vt})}catch(n){w("broadcast_lang_failed",{message:n.message})}}var Up={defaultModel:"deepseek::deepseek-flash",providers:[{id:"deepseek",name:"DeepSeek",baseUrl:"https://api.deepseek.com/v1",apiKeyEnv:"DEEPSEEK_API_KEY",webSearch:{baseUrl:"https://api.deepseek.com/v1/tools",count:8},models:[{id:"deepseek-flash",name:"DeepSeek Flash",maxInputTokens:65536,maxOutputTokens:8192,toolCalling:!0}]}]},et=Up,As="builtin",Wt=Object.create(null),Re=null,Ts=[],Wp=40,el=Object.create(null),op=new Map;function Fr(){try{let t=JSON.parse(O.readFileSync(Le,"utf8"));if(t&&Array.isArray(t.providers)&&t.providers.length){et=t,As=Le,w("config_loaded",{source:Le,providers:t.providers.map(e=>e.id),models:cn().length});return}}catch(t){w("config_load_failed",{message:t.message,path:Le})}et=Up,As="builtin"}function Cw(){let t=[];for(let e of et.providers||[])for(let n of e.models||[])t.push({provider:e,model:n});return t}function cn(){let t=Cw(),e={};for(let n of t)e[n.model.id]=(e[n.model.id]||0)+1;return t.map(n=>({key:e[n.model.id]>1?n.provider.id+"::"+n.model.id:n.model.id,provider:n.provider,model:n.model}))}function Ae(t){let e=cn(),n=String(t||"");return e.find(s=>s.key===n)||e.find(s=>s.provider.id+"::"+s.model.id===n)||e.find(s=>s.model.id===n)||e.find(s=>s.key===et.defaultModel)||e.find(s=>s.provider.id+"::"+s.model.id===et.defaultModel)||e[0]}function js(){let t=Ae(et.defaultModel);return t?t.key:""}function Aw(t){try{let e=O.readFileSync(P.join(dt.homedir(),".hermes",".env"),"utf8");for(let n of e.split(`
|
|
701
|
+
`)){let s=n.match(new RegExp("^\\s*"+t+"\\s*=\\s*(.+)\\s*$"));if(s)return s[1].trim().replace(/^["']|["']$/g,"")}}catch{}return""}function Uo(t){let e=t&&t.apiKeyEnv;return e?process.env[e]?String(process.env[e]).trim():Aw(e):""}function Rr(t){if(!t)return"";if(t.apiKey)return String(t.apiKey);let e=Wt[t.id];return e?String(e):Uo(t)}var wl="luban-local";function Ew(t){let e="";try{e=new URL(String(t||"")).hostname.toLowerCase()}catch{return!1}return e?e==="localhost"||e==="::1"||e==="[::1]"||e==="0.0.0.0"?!0:/^127\./.test(e):!1}function Es(t){return t?t.keyless===!0?!0:Ew(t.baseUrl):!1}function Os(t){let e=Rr(t);return e||(Es(t)?wl:"")}function Kp(t){return String(t.baseUrl||"").replace(/\/+$/,"")+"/chat/completions"}var tl=2e4,kl=3e3,rp=8e3,Ow="https://cn.bing.com/search",Hp="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",Ya=2*1024*1024;function zp(t){if(!t)return"";let e=t.webSearch;if(e&&e.baseUrl)return String(e.baseUrl).replace(/\/+$/,"");let n=String(t.baseUrl||"").replace(/\/+$/,"");return/api\.deepseek\.com/i.test(n)?n+"/tools":""}function Ct(t){if(!t)return"none";let e=t.webSearch;return e&&e.disabled===!0?"none":e&&(e.engine==="bing"||e.engine==="deepseek")?e.engine:e&&e.baseUrl||/api\.deepseek\.com/i.test(String(t.baseUrl||""))?"deepseek":"bing"}function qr(t){if(!t)return"";let e=t.inlineCompletion;if(e&&e.baseUrl)return String(e.baseUrl).replace(/\/+$/,"");let n=String(t.baseUrl||"").replace(/\/+$/,"");return/api\.deepseek\.com/i.test(n)?n.replace(/\/v1$/,"")+"/beta":""}async function Gp(t){let e=t||{},n=Ae(e.modelKey);if(!n)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let s=qr(n.provider);if(!s)throw new Error("\u5F53\u524D provider \u672A\u914D\u7F6E FIM \u8865\u5168\uFF08providers.json \u91CC\u52A0 inlineCompletion.baseUrl\uFF09");let o=Os(n.provider);if(!o)throw new Error("provider "+n.provider.id+" \u7F3A\u5C11 API key");let r=n.provider.inlineCompletion||{},i=Ir.buildPrompt({path:e.path,text:e.text,offset:e.offset,prefixLines:r.prefixLines,suffixLines:r.suffixLines,maxChars:r.maxPromptChars}),a={model:String(r.model||"deepseek-chat"),prompt:i.prompt,suffix:i.suffix,max_tokens:Math.min(Math.max(Math.floor(Number(r.maxTokens))||256,16),2048),stream:!1},l=Math.max(500,Number(r.timeoutMs)||3e3),c=new AbortController,u=ri(e.signal);u.signal&&(u.isCancelled()?c.abort():u.signal.addEventListener("abort",function(){c.abort()}));let d=setTimeout(function(){try{c.abort()}catch{}},l);try{let f=await fetch(s+"/completions",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify(a),signal:c.signal});if(!f.ok){let x=await f.text();throw new Error("FIM HTTP "+f.status+": "+String(x).slice(0,160))}let p=await f.json(),h=p&&p.choices&&p.choices[0],m=String(h&&(h.text||h.message&&h.message.content)||"");return{text:Ir.trimCompletion(m,i.suffix),rawChars:m.length,model:a.model,promptChars:i.prompt.length,suffixChars:i.suffix.length,usage:p&&p.usage||null}}finally{clearTimeout(d)}}function Pw(t,e){let n="";try{let r=JSON.parse(e);r&&r.error&&r.error.message&&(n=String(r.error.message))}catch{}let s={400:"\u8BF7\u6C42\u6216\u53C2\u6570\u4E0D\u5408\u6CD5",401:"API key \u7F3A\u5931\u6216\u65E0\u6548",402:"\u8D26\u53F7\u4F59\u989D\u4E0D\u8DB3",403:"\u8BF7\u6C42\u88AB\u5B89\u5168\u7B56\u7565\u62D2\u7EDD",404:"\u672A\u80FD\u83B7\u53D6\u53EF\u7528\u7684\u7F51\u9875\u5185\u5BB9",408:"\u8BFB\u53D6\u8BF7\u6C42\u4F53\u8D85\u65F6",413:"\u8BF7\u6C42\u4F53\u8D85\u8FC7\u5927\u5C0F\u9650\u5236",429:"\u8D85\u8FC7\u8054\u7F51\u63A5\u53E3 QPS \u9650\u901F",500:"\u670D\u52A1\u7AEF\u5185\u90E8\u9519\u8BEF",504:"\u4E0B\u6E38\u8BF7\u6C42\u8D85\u65F6"};return"\u8054\u7F51\u63A5\u53E3 HTTP "+t+(s[t]?"\uFF08"+s[t]+"\uFF09":"")+(n?"\uFF1A"+n.slice(0,200):"")}function ri(t){if(!t)return{signal:null,isCancelled:function(){return!1}};if(typeof t.aborted=="boolean"&&typeof t.addEventListener=="function")return{signal:t,isCancelled:function(){return t.aborted}};if(typeof t.onCancellationRequested=="function"){let e=new AbortController,n=!!t.isCancellationRequested;if(n)e.abort();else try{t.onCancellationRequested(function(){n=!0,e.abort()})}catch{}return{signal:e.signal,isCancelled:function(){return n}}}return{signal:null,isCancelled:function(){return!1}}}function Jp(t){let e=new AbortController,n=ri(t&&t.signal),s=t&&t.timeoutMs||tl,o=setTimeout(function(){e.abort()},s);return n.signal&&(n.isCancelled()?e.abort():n.signal.addEventListener("abort",function(){e.abort()})),{ctrl:e,outer:n,timer:o,ms:s}}async function $p(t,e,n,s){let o=s||{},r=zp(n&&n.provider);if(!r)throw new Error("\u5F53\u524D provider \u672A\u914D\u7F6E\u8054\u7F51\u641C\u7D22\uFF08providers.json \u91CC\u52A0 webSearch.baseUrl\uFF09");let i=Os(n.provider);if(!i)throw new Error("provider "+n.provider.id+" \u7F3A\u5C11 API key\uFF08apiKey \u6216 apiKeyEnv="+n.provider.apiKeyEnv+"\uFF09");let a=new AbortController,l=ri(o.signal),c=setTimeout(function(){a.abort()},o.timeoutMs||tl);l.signal&&(l.isCancelled()?a.abort():l.signal.addEventListener("abort",function(){a.abort()}));let u,d;try{u=await fetch(r+t,{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+i},body:JSON.stringify(e),signal:a.signal}),d=await u.text()}catch(f){throw f&&f.name==="AbortError"?new Error(l.isCancelled()?"\u8054\u7F51\u8BF7\u6C42\u5DF2\u53D6\u6D88":"\u8054\u7F51\u8BF7\u6C42\u8D85\u65F6\uFF08"+Math.round((o.timeoutMs||tl)/1e3)+"s\uFF09"):new Error("\u8054\u7F51\u8BF7\u6C42\u5931\u8D25\uFF1A"+(f&&f.message?f.message:String(f)))}finally{clearTimeout(c)}if(!u.ok)throw w("web_http_error",{endpoint:t,status:u.status,body:String(d).slice(0,300)}),new Error(Pw(u.status,d));try{return JSON.parse(d)}catch{throw new Error("\u8054\u7F51\u63A5\u53E3\u8FD4\u56DE\u4E86\u975E JSON \u5185\u5BB9\uFF1A"+String(d).slice(0,120))}}async function jw(t,e,n){let s=n||{};if(!e)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let o=String(t??"").replace(/\s+/g," ").trim().slice(0,128);if(!o)throw new Error("\u641C\u7D22\u8BCD\u4E3A\u7A7A");let r=e.provider.webSearch&&e.provider.webSearch.count||8,i=typeof s.count=="number"&&isFinite(s.count)?s.count:r;i=Math.min(Math.max(Math.round(i)||8,1),50);let a={query:o,count:i,need_content:!!s.needContent},l=String(s.oriQuestion==null?"":s.oriQuestion).replace(/\s+/g," ").trim().slice(0,128);l&&(a.ori_question=l);let c=await $p("/search",a,e,s),u=Array.isArray(c&&c.results)?c.results:[];return w("web_search",{provider:e.provider.id,query:o,count:i,needContent:!!s.needContent,results:u.length}),{query:o,results:u}}async function Lw(t,e,n){if(!e)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let s=String(t??"").trim();if(!/^https?:\/\/\S+$/i.test(s))throw new Error("url \u5FC5\u987B\u662F http/https \u5730\u5740\uFF1A"+s.slice(0,120));if(s.length>8192)throw new Error("url \u8FC7\u957F\uFF08\u4E0A\u9650 8192 \u5B57\u7B26\uFF09");let o=await $p("/fetch",{url:s},e,n||{}),r=String(o&&o.title||""),i=String(o&&o.content||""),a=n&&n.maxChars||12e3,l=i.length>a?i.slice(0,a)+`
|
|
702
|
+
\u2026[\u6B63\u6587\u5DF2\u622A\u65AD]`:i;return w("web_fetch",{provider:e.provider.id,url:s.slice(0,200),title:r,chars:i.length}),{url:s,title:r,content:l,fullChars:i.length}}var Iw={amp:"&",lt:"<",gt:">",quot:'"',apos:"'",nbsp:" "};function Cr(t){return String(t??"").replace(/&(#x?[0-9a-fA-F]+|[a-zA-Z]+);/g,function(e,n){if(n.charAt(0)==="#"){let s=n.charAt(1)==="x"||n.charAt(1)==="X",o=parseInt(n.slice(s?2:1),s?16:10);return isFinite(o)&&o>0&&o<65536?String.fromCharCode(o):e}return Iw[n]||e})}function jo(t){let e=String(t??"");return e=e.replace(/<!--[\s\S]*?-->/g," "),e=e.replace(/<(script|style|noscript|head|template)[^>]*>[\s\S]*?<\/\1>/gi," "),e=e.replace(/<\/(p|div|li|tr|h[1-6]|blockquote|section|article|table|pre|ul|ol)[^>]*>/gi,`
|
|
703
|
+
`),e=e.replace(/<br\s*\/?>/gi,`
|
|
704
|
+
`),e=e.replace(/<[^>]+>/g,""),e=Cr(e),e.replace(/[ \t\f\v]+/g," ").replace(/ *\n */g,`
|
|
705
|
+
`).replace(/\n{3,}/g,`
|
|
706
|
+
|
|
707
|
+
`).trim()}function Xp(t){let e=[],n=String(t??"").match(/<item>[\s\S]*?<\/item>/gi)||[],s=function(o){return String(o??"").replace(/<!\[CDATA\[([\s\S]*?)\]\]>/g,"$1")};for(let o of n.slice(0,50)){let r=function(a){let l=o.match(a);return l&&l[1]?s(l[1]):""},i=Cr(r(/<link>([\s\S]*?)<\/link>/i)).trim();/^https?:\/\//i.test(i)&&e.push({title:Cr(jo(r(/<title>([\s\S]*?)<\/title>/i))).slice(0,200)||"(\u65E0\u6807\u9898)",url:i.slice(0,2048),snippet:Cr(jo(r(/<description>([\s\S]*?)<\/description>/i))).slice(0,kl)})}return e}async function Dw(t,e){let n=e||{},s=String(t??"").replace(/\s+/g," ").trim().slice(0,128);if(!s)throw new Error("\u641C\u7D22\u8BCD\u4E3A\u7A7A");let o=typeof n.count=="number"&&isFinite(n.count)?n.count:n.cfgCount||8;o=Math.min(Math.max(Math.round(o)||8,1),50);let r=Ow+"?q="+encodeURIComponent(s)+"&count="+o+"&format=rss",i=Jp(n),a,l;try{a=await fetch(r,{headers:{"User-Agent":Hp,Accept:"application/rss+xml, application/xml, text/xml, */*"},signal:i.ctrl.signal}),l=await a.text()}catch(u){throw u&&u.name==="AbortError"?new Error(i.outer.isCancelled()?"\u8054\u7F51\u8BF7\u6C42\u5DF2\u53D6\u6D88":"Bing \u641C\u7D22\u8D85\u65F6\uFF08"+Math.round(i.ms/1e3)+"s\uFF09"):new Error("Bing \u641C\u7D22\u8BF7\u6C42\u5931\u8D25\uFF1A"+(u&&u.message?u.message:String(u)))}finally{clearTimeout(i.timer)}if(!a.ok)throw w("web_http_error",{endpoint:"bing/search",status:a.status,body:String(l).slice(0,300)}),new Error("Bing \u641C\u7D22 HTTP "+a.status+"\uFF08\u53EF\u80FD\u88AB\u9650\u6D41\u6216\u670D\u52A1\u4E0D\u53EF\u7528\uFF0C\u7A0D\u540E\u518D\u8BD5\uFF09");let c=Xp(l).slice(0,o);if(!c.length){let u=new Error("Bing \u6CA1\u6709\u8FD4\u56DE\u641C\u7D22\u7ED3\u679C\uFF08\u67E5\u8BE2\u65E0\u7ED3\u679C\u6216 RSS \u6682\u4E0D\u53EF\u7528\uFF09");throw u.noResults=!0,u}if(n.needContent)try{let u=await Vp(c[0].url,{signal:n.signal,timeoutMs:8e3,maxChars:kl,providerId:n.providerId});u&&u.content&&(c[0].content=u.content)}catch{}return w("web_search",{provider:n.providerId||"",engine:"bing",query:s,count:o,needContent:!!n.needContent,results:c.length}),{query:s,results:c}}async function Vp(t,e){let n=e||{},s=String(t??"").trim();if(!/^https?:\/\/\S+$/i.test(s))throw new Error("url \u5FC5\u987B\u662F http/https \u5730\u5740\uFF1A"+s.slice(0,120));if(s.length>8192)throw new Error("url \u8FC7\u957F\uFF08\u4E0A\u9650 8192 \u5B57\u7B26\uFF09");let o=Jp(n),r,i;try{r=await fetch(s,{redirect:"follow",headers:{"User-Agent":Hp,Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,text/plain;q=0.8,*/*;q=0.5"},signal:o.ctrl.signal});let d=String(r.headers.get("content-type")||"").toLowerCase();if(d&&!/text\/html|application\/xhtml|text\/plain|application\/xml|text\/xml/.test(d))throw new Error("\u4E0D\u652F\u6301\u7684\u7F51\u9875\u7C7B\u578B\uFF1A"+d.split(";")[0]);if(Number(r.headers.get("content-length")||0)>Ya)throw new Error("\u7F51\u9875\u8FC7\u5927\uFF08\u8D85\u8FC7 2MB\uFF09");i=await r.text()}catch(d){throw d&&d.message&&/^(不支持的网页类型|网页过大)/.test(d.message)?d:d&&d.name==="AbortError"?new Error(o.outer.isCancelled()?"\u8054\u7F51\u8BF7\u6C42\u5DF2\u53D6\u6D88":"\u7F51\u9875\u6293\u53D6\u8D85\u65F6\uFF08"+Math.round(o.ms/1e3)+"s\uFF09"):new Error("\u7F51\u9875\u6293\u53D6\u5931\u8D25\uFF1A"+(d&&d.message?d.message:String(d)))}finally{clearTimeout(o.timer)}if(!r.ok)throw w("web_http_error",{endpoint:"direct/fetch",status:r.status,body:s.slice(0,120)}),new Error("\u7F51\u9875\u6293\u53D6 HTTP "+r.status);i.length>Ya&&(i=i.slice(0,Ya));let a=jo((i.match(/<title[^>]*>([\s\S]*?)<\/title>/i)||[])[1]||"").slice(0,200),l=jo(i),c=n.maxChars||12e3,u=l.length>c?l.slice(0,c)+`
|
|
708
|
+
\u2026[\u6B63\u6587\u5DF2\u622A\u65AD]`:l;return w("web_fetch",{provider:n.providerId||"",engine:"bing",url:s.slice(0,200),title:a,chars:l.length}),{url:s,title:a,content:u,fullChars:l.length}}async function xl(t,e,n){if(!e)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let s=Ct(e.provider);if(s==="deepseek")return jw(t,e,n);if(s==="bing")return Dw(t,Object.assign({},n||{},{cfgCount:e.provider.webSearch&&e.provider.webSearch.count||8,providerId:e.provider.id}));throw new Error("\u5F53\u524D provider \u5DF2\u7981\u7528\u8054\u7F51\u641C\u7D22\uFF08providers.json \u91CC webSearch.disabled=true\uFF09")}async function Yp(t,e,n){if(!e)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let s=Ct(e.provider);if(s==="deepseek")return Lw(t,e,n);if(s==="bing")return Vp(t,Object.assign({},n||{},{providerId:e.provider.id}));throw new Error("\u5F53\u524D provider \u5DF2\u7981\u7528\u8054\u7F51\u6293\u53D6\uFF08providers.json \u91CC webSearch.disabled=true\uFF09")}function Sl(t,e){let n=Array.isArray(t)?t:[];if(!n.length)return"\uFF08\u8054\u7F51\u641C\u7D22\u6CA1\u6709\u5339\u914D\u7ED3\u679C\uFF1A"+String(e||"")+"\uFF09";let o=n.map(function(r,i){let a=["["+(i+1)+"] "+(r.title||"(\u65E0\u6807\u9898)")],l=[];r.site_name&&l.push(String(r.site_name)),r.date&&l.push(String(r.date).slice(0,10)),typeof r.authority=="number"&&r.authority>=0&&l.push("\u6743\u5A01 "+r.authority+"/4"),l.length&&a.push(l.join(" \xB7 ")),r.url&&a.push(String(r.url));let c=r.summary||r.snippet||"";return c&&a.push(String(c)),r.content&&a.push("\u6B63\u6587\u6458\u5F55\uFF1A"+String(r.content).slice(0,kl)),a.join(`
|
|
709
|
+
`)}).join(`
|
|
710
|
+
|
|
711
|
+
`);return o.length>rp?o.slice(0,rp)+`
|
|
712
|
+
\u2026[\u641C\u7D22\u7ED3\u679C\u5DF2\u622A\u65AD]`:o}function ip(t){return(Array.isArray(t)?t:[]).filter(function(e){return/^https?:\/\//i.test(String(e&&e.url||""))}).slice(0,10).map(function(e){return{title:String(e.title||e.url).slice(0,200),url:String(e.url),siteName:e.site_name?String(e.site_name):"",date:e.date?String(e.date).slice(0,10):""}})}function Zp(t){let e=String(t??""),n=/@web\b/i.test(e),s=n?e.replace(/@web\b/gi,"").replace(/[ \t]{2,}/g," ").trim():e.trim();return{web:n,prompt:s}}async function Qp(t,e,n){let s=n||{},o=t||"\u5F53\u524D\u6700\u65B0\u7684\u6280\u672F\u65B0\u95FB",r;try{r=await xl(o,e,{signal:s.signal,oriQuestion:t})}catch(l){if(l&&l.noResults)r={query:String(o).replace(/\s+/g," ").trim().slice(0,128),results:[]};else throw l}if(s.onSearch)try{s.onSearch(r)}catch{}let i={deepseek:"DeepSeek Search",bing:"Bing \u641C\u7D22"}[Ct(e&&e.provider)]||"",a=["\u3010\u8054\u7F51\u641C\u7D22\u7ED3\u679C\u3011"+(i?"\u7531 "+i+" \u8FD4\u56DE\uFF0C":"")+"\u68C0\u7D22\u8BCD\uFF1A"+r.query,Sl(r.results,r.query),"","\u5F15\u7528\u8981\u6C42\uFF1A\u56DE\u7B54\u65F6\u7528 [n] \u6807\u6CE8\u5BF9\u5E94\u7684\u641C\u7D22\u7ED3\u679C\u7F16\u53F7\uFF1B\u5982\u679C\u8FD9\u4E9B\u7ED3\u679C\u4E0D\u8DB3\u4EE5\u56DE\u7B54\uFF0C\u53EF\u4EE5\u518D\u8C03\u7528 web_search \u6362\u5173\u952E\u8BCD\uFF0C\u6216\u7528 web_fetch \u7EC6\u8BFB\u67D0\u4E2A URL\uFF1B\u4E0D\u786E\u5B9A\u7684\u4FE1\u606F\u8981\u660E\u786E\u8BF4\u660E\u3002"].join(`
|
|
713
|
+
`);return{query:r.query,results:r.results,block:a}}function j(){let t=y.workspace.workspaceFolders;return t&&t.length?t[0].uri.fsPath:"/tmp/p1test"}function be(t,e,n){let s=P.isAbsolute(t)?t:P.join(e,t);if(!fl()){let o=P.relative(e,s);if(o.startsWith("..")||P.isAbsolute(o))throw new Error("\u8DEF\u5F84\u8D8A\u754C\uFF1A\u53EA\u5141\u8BB8\u64CD\u4F5C\u5DE5\u4F5C\u76EE\u5F55\u5185\u7684\u6587\u4EF6 \u2192 "+t)}if(n!==!0){let o=P.relative(e,s),r=ok(o);if(!r){let i=P.basename(o);if(i&&ii(i))try{O.statSync(s).isDirectory()&&(r=i)}catch{}}if(r){let i=new Error("\u8DEF\u5F84\u4F4D\u4E8E\u8DF3\u8FC7\u76EE\u5F55 "+r+"\uFF08node_modules / dist / target \u7B49\u751F\u6210\u76EE\u5F55\u3001npm-cache / .m2 \u7B49\u5B89\u88C5\u7F13\u5B58\u4E0D\u8BFB\u5199\uFF1B\u786E\u9700\u64CD\u4F5C\u7528 run_command\uFF09: "+t);throw i.skipDir=r,i}}return s}function ap(t,e){if(!t)return{base:e,prefix:""};let n=be(String(t),e),s="";try{s=P.relative(e,n)}catch{s=""}if(s==="")return{base:n,prefix:""};let o=!s.startsWith("..")&&!P.isAbsolute(s);return{base:n,prefix:o?s.split(P.sep).join("/"):n.split(P.sep).join("/")}}var Nw=8,Fw=4e4,lp=200,Rw=8,qw=4e3,Bw=20,Uw=5,Ww=10;function Kw(t,e){let n=lt.profile(t,{mode:e});return{perFile:n.refPerFile,total:n.refTotal,readMax:n.readMax}}var cp="(^|[^\\w@])",Ar=null,xs=[];function Co(t){if(!t||!t.document||t.document.uri.scheme!=="file")return;Ar=t;let e=t.document.uri.fsPath,n=xs.indexOf(e);n>=0&&xs.splice(n,1),xs.unshift(e),xs.length>20&&xs.pop()}function eh(){let t=y.window.activeTextEditor;return t&&t.document&&t.document.uri.scheme==="file"?t:Ar&&!Ar.document.isClosed?Ar:null}function _l(t,e){return t.uri.scheme==="file"&&t.uri.fsPath===e}function Br(t){let e=y.workspace.textDocuments.find(n=>_l(n,t));return e?e.getText():O.readFileSync(t,"utf8")}function Ao(t){let e=P.extname(t).replace(".","").toLowerCase();return{js:"js",mjs:"js",cjs:"js",ts:"ts",tsx:"tsx",jsx:"jsx",json:"json",md:"md",css:"css",scss:"scss",html:"html",vue:"vue",py:"py",sh:"bash",zsh:"bash",yml:"yaml",yaml:"yaml",java:"java",kt:"kotlin",go:"go",rs:"rust",rb:"ruby",php:"php",sql:"sql",toml:"toml"}[e]||""}function up(t,e){let n=[t],s=t.replace(/[.,;:!?]+$/,"");s&&s!==t&&n.push(s);for(let o of n){let r;try{r=be(o,e,!0)}catch{continue}try{if(O.existsSync(r)&&O.statSync(r).isFile())return{abs:r,token:o}}catch{}}return null}function Hw(t){let e=[];function n(o){o&&e.indexOf(o)<0&&e.push(o)}n(t);let s=t.replace(/\/+$/,"");return n(s),n(t.replace(/[.,;:!?]+$/,"")),n(s.replace(/[.,;:!?]+$/,"")),e}function dp(t,e){for(let n of Hw(t)){let s;try{s=be(n,e,!0)}catch{continue}try{if(O.existsSync(s)&&O.statSync(s).isDirectory())return{abs:s,token:n}}catch{}}return null}var zw=80;function th(t,e){let n=String(t??"");if(!n)return null;let s=up(n,e);if(s)return{kind:"file",abs:s.abs,token:s.token,used:s.token};let o=dp(n,e);if(o)return{kind:"dir",abs:o.abs,token:o.token,used:o.token};let r=Math.max(1,n.length-zw);for(let i=n.length-1;i>=r;i--){let a=n.slice(0,i);if(a==="."||a===".."||a==="./"||a==="../")continue;let l=up(a,e);if(l)return{kind:"file",abs:l.abs,token:l.token,used:a};let c=dp(a,e);if(c)return{kind:"dir",abs:c.abs,token:c.token,used:a}}return null}function Ot(t,e){let n=function(o){try{return O.realpathSync(o)}catch{return o}},s=[[n(e),n(t)],[e,t]];for(let o of s){let r=P.relative(o[0],o[1]);if(r&&!r.startsWith("..")&&!P.isAbsolute(r))return r.split(P.sep).join("/")}return t.split(P.sep).join("/")}function nh(t,e){try{let n=O.statSync(t);if(n.isDirectory())return P.relative(e,t)===""?"@./ ":"@"+Ot(t,e)+"/ ";if(n.isFile())return"@"+Ot(t,e)+" "}catch{}return""}function sh(t){let e=vl(t);return!e.hasEditor||!e.hasSelection?"":"#selection "+e.path+":"+e.startLine+"-"+e.endLine+" "}function Gw(t,e){let n=/^(.*):(\d+)-(\d+)$/.exec(String(t??""));if(!n)return null;let s=parseInt(n[2],10),o=parseInt(n[3],10);if(!s||!o||o<s)return null;let r=th(n[1],e);return!r||r.kind!=="file"?null:{abs:r.abs,startLine:s,endLine:o}}function vl(t){let e=t||j(),n=eh();if(!n)return{hasEditor:!1};let s=n.document,o=n.selection,r=!!(o&&!o.isEmpty),i=s.isClosed?null:r?new y.Range(o.start,o.end):new y.Range(s.positionAt(0),s.positionAt(s.getText().length));if(!i)return{hasEditor:!1};let a=s.getText(i),l=(r?o.start.line:0)+1,u=(r?o.end.character===0&&o.end.line>o.start.line?o.end.line-1:o.end.line:Math.max(s.lineCount-1,0))+1;return{hasEditor:!0,abs:s.uri.fsPath,path:Ot(s.uri.fsPath,e),hasSelection:r,startLine:l,endLine:u,lines:Math.max(u-l+1,1),text:a,preview:a.slice(0,120)}}function oh(){let t=vl();return t.hasEditor?{hasEditor:!0,path:t.path,hasSelection:t.hasSelection,startLine:t.startLine,endLine:t.endLine,lines:t.lines,preview:t.preview}:{hasEditor:!1}}function Tl(t){let e={enabled:!0,maxChars:Te.DEFAULT_MAX_CHARS,windowLines:Te.DEFAULT_WINDOW_LINES};try{let n=y.workspace.getConfiguration("luban"),s=n.get("context.autoFile");s!=null&&(e.enabled=!!s);let o=Number(n.get("context.autoFileMaxChars"));isFinite(o)&&o>=500&&(e.maxChars=Math.floor(o));let r=Number(n.get("context.autoFileWindowLines"));isFinite(r)&&r>=40&&(e.windowLines=Math.floor(r))}catch{}return t&&t.compact&&(e.maxChars=Math.min(e.maxChars,t.autoCtxChars),e.windowLines=Math.min(e.windowLines,t.autoCtxLines)),e}function Jw(t,e){let n=t||j(),s=e||Tl(),o=eh();if(!o||!o.document||o.document.isClosed)return{hasEditor:!1};let r=o.document,i=o.selection,a=!!(i&&!i.isEmpty),l=Math.max(r.lineCount,1),c=Math.min(Math.max(1,(i&&i.active?i.active.line:0)+1),l),u={hasEditor:!0,abs:r.uri.fsPath,scheme:r.uri.scheme,path:Ot(r.uri.fsPath,n),hasSelection:a,cursorLine:c,totalLines:l,text:""};if(a)return u.text=r.getText(new y.Range(i.start,i.end)),u.startLine=i.start.line+1,u.endLine=i.end.line+1,u.windowed=!1,u;let d=Te.windowRange({lineCount:l,cursorLine:c,windowLines:s.windowLines}),f=new y.Position(d.start-1,0),h=r.validateRange(new y.Range(f,new y.Position(d.end,0))).end,m=r.offsetAt(f),x=r.offsetAt(h),b=Math.max(s.maxChars*4,32768),k=x-m>b?r.positionAt(m+b):h;return u.text=r.getText(new y.Range(f,k)),d.whole||(u.text=u.text.replace(/\r?\n$/,"")),u.startLine=d.start,u.endLine=d.end,u.windowed=!d.whole,u}var nl=new Map;function $w(t){let e=t&&typeof t=="object"?t:null,n=String(e?e.id||"":t||"");if(!n)return null;let s=nl.get(n);if(s)return s;s=new Set;let o=e||V.get(n)||null;for(let r of o&&o.items||[])if(!(!r||r.t!=="refs"))for(let i of r.refs||[])i&&i.path&&s.add(String(i.path));return nl.set(n,s),s}function Xw(t){let e=String(t&&typeof t=="object"?t.id||"":t||"");e&&nl.delete(e)}function Ml(t,e,n,s){let o=Tl(n);if(!o.enabled)return"";let r=e||j(),i=Jw(r,o);if(!i.hasEditor)return"";let a=$w(s&&(s.session||s.sessionId));if(a)for(let u of t||[])u&&u.path&&a.add(String(u.path));for(let u of t||[])if(u&&u.path===i.path)return"";if(!Te.sessionOwns(a,i.path,i.hasSelection))return w("agent_auto_context_skip",{path:i.path,reason:"other_session"}),"";a&&a.add(i.path);let l=Te.shouldSkip({scheme:i.scheme,head:i.text.slice(0,4096)});if(l)return w("agent_auto_context_skip",{path:i.path,reason:l}),"";let c=Te.build({path:i.path,text:i.text,startLine:i.startLine,endLine:i.endLine,hasSelection:i.hasSelection,maxChars:o.maxChars,lang:Ao(i.path),cursorLine:i.cursorLine,totalLines:i.totalLines,windowed:i.windowed});return c.block?(w("agent_auto_context",{path:i.path,chars:c.chars,mode:c.mode,truncated:c.truncated,lines:c.lines,cursorLine:i.cursorLine,totalLines:i.totalLines}),c.block):""}function rh(){let t=!0;try{t=y.workspace.getConfiguration("luban").get("context.workset")!==!1}catch{}if(!t||!J.size)return"";let e=Dp.block(Array.from(J.values()));return e.block?(w("agent_workset",{files:e.files,chars:e.block.length,truncated:e.truncated}),e.block):""}function ih(t){return!isFinite(t)||t<0?"":t<1024?t+"B":t<1024*1024?(t/1024).toFixed(1)+"KB":(t/1024/1024).toFixed(1)+"MB"}function Vw(t){let e=P.basename(t).toLowerCase(),n=P.dirname(t).replace(/\\/g,"/"),s=!n||n===".";return/^readme(\.|$)/i.test(e)?0:e==="package.json"||e==="pom.xml"||e==="cargo.toml"||e==="go.mod"||e==="composer.json"||e==="pyproject.toml"?1:/lock|package-lock|yarn\.lock|pnpm-lock/.test(e)?2:/^(index|main|app)\./i.test(e)?3:s&&/\.md$/i.test(e)?4:10}function Yw(t){let e=[],n={},s=!1;(function f(p,h,m){if(m>Rw)return;let x;try{x=O.realpathSync(p)}catch{return}if(n[x])return;n[x]=!0;let b=[];try{b=O.readdirSync(p,{withFileTypes:!0})}catch{return}b.sort(function(k,S){let T=k.isDirectory()?0:1,g=S.isDirectory()?0:1;return T!==g?T-g:k.name<S.name?-1:k.name>S.name?1:0});for(let k of b){if(e.length>=lp){s=!0;return}let S=h?h+"/"+k.name:k.name,T=P.join(p,k.name);if(k.isDirectory()){if(ii(k.name))continue;e.push({rel:S,name:k.name+"/",isDir:!0,depth:m}),f(T,S,m+1)}else{let g=0;try{let _=O.statSync(T);if(!_.isFile())continue;g=_.size}catch{continue}e.push({rel:S,name:k.name,isDir:!1,depth:m,size:g})}}})(t,"",0);let o=e.map(function(f){let p=new Array(f.depth+1).join(" ");return f.isDir?p+f.name:p+f.name+" "+ih(f.size)});s&&o.push("\u2026\uFF08\u76EE\u5F55\u6761\u76EE\u8D85\u8FC7 "+lp+" \u6761\uFF0C\u540E\u7EED\u5DF2\u7701\u7565\uFF09");let r=[];for(let f of e){if(f.isDir||f.size>qw)continue;let p=P.join(t,f.rel),h="";try{h=Br(p)}catch{continue}h.indexOf("\0")>=0||r.push({rel:f.rel,body:h,size:f.size,pri:Vw(f.rel)})}r.sort(function(f,p){return f.pri!==p.pri?f.pri-p.pri:f.size!==p.size?f.size-p.size:f.rel<p.rel?-1:f.rel>p.rel?1:0});let i=r.slice(0,Bw).map(function(f){return{rel:f.rel,body:f.body}}),a=e.filter(function(f){return!f.isDir}).length,l=Math.max(0,a-i.length),c=e.filter(function(f){return f.isDir&&f.depth===0}),u=e.filter(function(f){return!f.isDir&&f.depth===0}),d=c.map(function(f){return{name:f.name,dir:f.rel,kind:"dir"}});return u.length&&d.push({name:"\uFF08\u6839\u76EE\u5F55\u6587\u4EF6\uFF09",dir:"",kind:"root"}),{entries:e,tree:o,docs:i,fileCount:a,dirCount:e.filter(function(f){return f.isDir}).length,topDirCount:c.length,skippedSmall:l,overflow:s,batches:d}}function Zw(t){let e=t||{};return(e.topDirCount||0)>=Uw||!!e.overflow||(e.skippedSmall||0)>=Ww}function Qw(t,e){let n=[],s=String(t||"").replace(/\/+$/,""),o=Zw(e),r=e.batches||[];if(o&&r.length){n.push("\u5206\u6279\u5904\u7406\uFF08\u5171 "+r.length+' \u6279\uFF09\uFF1A\u672C\u8F6E\u53EA\u6311\u4E0E\u7528\u6237\u95EE\u9898\u6700\u76F8\u5173\u7684 1\u20133 \u6279\uFF1B\u6BCF\u6279\u7528 search_code({ query, dir: "\u2026" }) \u5B9A\u4F4D\u540E\u518D\u5BF9\u5C11\u91CF\u547D\u4E2D read_file\uFF0C\u7981\u6B62\u6309\u76EE\u5F55\u6811\u9010\u4E2A read_file\u3002\u9884\u7B97\u7D27\u65F6\u5148\u4EA4\u9636\u6BB5\u6027\u7ED3\u8BBA\uFF1B\u6536\u5C3E\u5217\u51FA\u5DF2\u5B8C\u6210 / \u672A\u5904\u7406\u6279\u6B21\uFF0C\u7528\u6237\u53EF\u4E0B\u4E00\u6761\u6D88\u606F\u6307\u5B9A\u300C\u7EE7\u7EED xxx/\u300D\u7EED\u8DD1\u3002');for(let i=0;i<r.length;i++){let a=r[i],l=a.kind==="root"?s:s?s+"/"+a.dir:a.dir;n.push(i+1+". "+a.name+' \u2192 dir="'+l+'"')}n.push("")}if(n.push("\u76EE\u5F55\u6811\uFF08"+t+"/\uFF1A"+e.fileCount+" \u4E2A\u6587\u4EF6 / "+e.dirCount+" \u4E2A\u5B50\u76EE\u5F55\uFF09\uFF1A"),n.push(e.tree.length?e.tree.join(`
|
|
714
|
+
`):"\uFF08\u7A7A\u76EE\u5F55\uFF09"),e.overflow&&(n.push(""),n.push("\uFF08\u76EE\u5F55\u8FC7\u5927\uFF0C\u6761\u76EE\u5DF2\u622A\u65AD \u2014\u2014 \u5148\u6309\u5206\u6279\u6E05\u5355\u7528 search_code + dir \u68C0\u7D22\uFF0C\u518D\u7CBE\u8BFB\u547D\u4E2D\u6587\u4EF6\uFF09")),e.docs.length){n.push(""),n.push("\u4EE5\u4E0B\u662F\u5176\u4E2D "+e.docs.length+" \u4E2A\u5C0F\u6587\u4EF6\u7684\u5168\u6587\uFF1A");for(let i of e.docs)n.push(""),n.push("--- "+i.rel+" ---"),n.push("```"+Ao(i.rel)+`
|
|
715
|
+
`+i.body+"\n```")}return e.skippedSmall>0&&(n.push(""),n.push("\uFF08\u53E6\u5916 "+e.skippedSmall+' \u4E2A\u6587\u4EF6\u672A\u6CE8\u5165\u5168\u6587 \u2014\u2014 \u5927\u6587\u4EF6\u6216\u8D85\u51FA\u672C\u6B21\u4E0A\u9650\uFF1B\u8BF7\u7528 search_code \u5E76\u4F20 dir="<\u76EE\u5F55\u524D\u7F00>" \u6309\u5173\u952E\u8BCD\u5B9A\u4F4D\uFF0C\u53EA\u5BF9\u547D\u4E2D\u6587\u4EF6 read_file\uFF0C\u4E0D\u8981\u6309\u76EE\u5F55\u6811\u9010\u4E2A\u8BFB\uFF09')),n.join(`
|
|
716
|
+
`)}function Vn(t,e,n){let s=String(t??""),o=n&&n.budgets||Kw(n&&n.window),r=o.perFile,i=o.total,a=[],l=[],c={},u=0,d=!1;function f(S,T){let g=String(S??"");if(g.length<=T)return{text:g,truncated:!1,endLine:g?g.split(`
|
|
717
|
+
`).length:0};let _=g.slice(0,T),v=_.lastIndexOf(`
|
|
718
|
+
`);return v>Math.floor(T*.5)&&(_=_.slice(0,v)),{text:_,truncated:!0,endLine:_?_.split(`
|
|
719
|
+
`).length:0}}function p(S,T,g,_){if(a.length>=Nw){S.omitted=!0;return}let v=Math.min(_||r,i-u);if(v<=0){S.omitted=!0;return}let A=f(T,v),C=A.text;if(A.truncated)if(d=!0,S.kind==="file"||S.kind==="selection"){let B=S.lines||A.endLine,W=S.kind==="selection"&&S.startLine||1,N=W+A.endLine-1,Y=N+1,I=S.path||"";C=A.text+`
|
|
720
|
+
...[\u622A\u65AD\uFF1A\u5DF2\u6CE8\u5165\u7B2C `+W+"-"+N+" \u884C / \u5171 "+B+' \u884C\uFF1B\u5176\u4F59\u7528 read_file({ path: "'+I+'", startLine: '+Y+", maxLines }) \u5206\u6BB5\u8BFB\u53D6]",S.kind==="file"&&(S.label="@"+I+" \uFF08\u7247\u6BB5 \u7B2C "+W+"-"+N+" \u884C / \u5171 "+B+" \u884C\uFF09")}else C=A.text+`
|
|
721
|
+
...[\u622A\u65AD]`;S.truncated=A.truncated,S.chars=C.length,u+=C.length;let L=a.length+1;a.push(S),l.push("[ref "+L+"] "+S.label+`
|
|
722
|
+
`+(g?C:"```"+(S.lang||"")+`
|
|
723
|
+
`+C+"\n```"))}let h=new RegExp(cp+"@([^\\s@\uFF0C\u3002\uFF1B\uFF1A\u3001\uFF01\uFF1F()\uFF08\uFF09\\[\\]{}\"'`]+)","g"),m;for(;m=h.exec(s);){let S=m[2],T=th(S,e);if(!T)continue;if(T.kind==="file"){if(c[T.abs])continue;c[T.abs]=!0;let v="";try{v=Br(T.abs)}catch{continue}let A=Ot(T.abs,e),C=v.split(`
|
|
724
|
+
`).length;p({kind:"file",path:A,lines:C,label:"@"+A+" \uFF08\u5168\u6587 "+C+" \u884C\uFF09",lang:Ao(A)},v);continue}if(c[T.abs])continue;c[T.abs]=!0;let g=Ot(T.abs,e),_=Yw(T.abs);p({kind:"dir",path:g+"/",files:_.fileCount,dirs:_.dirCount,injected:_.docs.length,label:"@"+g+"/ \uFF08\u76EE\u5F55\uFF1A"+_.fileCount+" \u4E2A\u6587\u4EF6\uFF0C\u5176\u4E2D "+_.docs.length+" \u4E2A\u5DF2\u6CE8\u5165\u5168\u6587\uFF09"},Qw(g,_),!0,i-u)}let x=new RegExp(cp+"#selection(?:[ \\t]+([^\\s\uFF0C\u3002\uFF1B\uFF1A\u3001\uFF01\uFF1F()\uFF08\uFF09\\[\\]{}\"'`]+))?","g");for(;m=x.exec(s);){let S=m[2]?m[2].replace(/[.,;:!?,。;:、!?))\]】}»"']+$/,""):"",T=S?Gw(S,e):null;if(T){let _=T.abs+":"+T.startLine+"-"+T.endLine;if(c[_])continue;let v="";try{v=Br(T.abs)}catch{continue}c[_]=!0;let A=v.split(`
|
|
725
|
+
`),C=Math.max(1,Math.min(T.startLine,A.length)),L=Math.max(C,Math.min(T.endLine,A.length)),B=Ot(T.abs,e),W=L-C+1;p({kind:"selection",path:B,startLine:C,endLine:L,lines:W,hasSelection:!0,label:"#selection "+B+":"+C+"-"+L+" \uFF08\u9009\u533A "+W+" \u884C\uFF09",lang:Ao(B)},A.slice(C-1,L).join(`
|
|
726
|
+
`));continue}if(c["#selection"])continue;c["#selection"]=!0;let g=vl(e);g.hasEditor&&p({kind:"selection",path:g.path,startLine:g.startLine,endLine:g.endLine,lines:g.lines,hasSelection:g.hasSelection,label:"#selection "+g.path+":"+g.startLine+"-"+g.endLine+" \uFF08"+(g.hasSelection?"\u9009\u533A":"\u5168\u6587")+" "+g.lines+" \u884C\uFF09",lang:Ao(g.path)},g.text)}if(!l.length)return{text:s,refs:a};let b=d?`\u4EE5\u4E0B\u662F\u672C\u6761\u6D88\u606F\u5F15\u7528\u7684\u4E0A\u4E0B\u6587\uFF08\u90E8\u5206\u5DF2\u81EA\u52A8\u9644\u52A0\uFF1B\u622A\u65AD\u5904\u8BF7\u7528 read_file \u7684 startLine/maxLines \u5206\u6BB5\u7EED\u8BFB\uFF09\uFF1A
|
|
727
|
+
|
|
728
|
+
`:`\u4EE5\u4E0B\u662F\u672C\u6761\u6D88\u606F\u5F15\u7528\u7684\u4E0A\u4E0B\u6587\uFF08\u5DF2\u81EA\u52A8\u9644\u52A0\uFF0C\u65E0\u9700\u518D read_file\uFF09\uFF1A
|
|
729
|
+
|
|
730
|
+
`;return{text:s+`
|
|
731
|
+
|
|
732
|
+
---
|
|
733
|
+
`+b+l.join(`
|
|
734
|
+
|
|
735
|
+
`),refs:a}}var ah=xw,ek="**/{"+ah.join(",")+"}/**",Mr={at:0,files:[],dirs:[]};async function tk(){return(await Cl()).files}async function nk(){return(await Cl()).dirs}async function Cl(){if(Date.now()-Mr.at<5e3)return Mr;let t=j(),e=[];try{e=(await y.workspace.findFiles("**/*",ek,1e3)).map(i=>{let a=P.relative(t,i.fsPath);return!a||a.startsWith("..")||P.isAbsolute(a)?"":a.split(P.sep).join("/")}).filter(Boolean)}catch(r){w("ref_findfiles_failed",{message:r.message})}if(!e.length){let r=[];try{Al(t,t,0,r)}catch{}e=r.filter(i=>i.charAt(i.length-1)!=="/").map(i=>i.replace(/\s+\(\d+B\)$/,""))}let n={};xs.forEach(function(r,i){let a=Ot(r,t);a&&!a.startsWith("..")&&!P.isAbsolute(a)&&a!==r.split(P.sep).join("/")&&(n[a]=i)});let s=function(r){return n[r]===void 0?9999:n[r]};e.sort(function(r,i){let a=s(r),l=s(i);return a!==l?a-l:r.length!==i.length?r.length-i.length:r<i?-1:r>i?1:0});let o=sk(e);return Mr={at:Date.now(),files:e,dirs:o},Mr}function sk(t){let e={};for(let n of t){let s=String(n).split("/");s.pop();let o="";for(let r of s)r&&(o=o?o+"/"+r:r,e[o]=!0)}return Object.keys(e).sort(function(n,s){return n.length!==s.length?n.length-s.length:n<s?-1:n>s?1:0})}function ii(t){return!t||t.charAt(0)==="."?!0:ah.indexOf(t)>=0}function ok(t){let e=String(t||"").split(/[\\/]+/);for(let n=0;n<e.length-1;n++)if(e[n]&&ii(e[n]))return e[n];return""}async function Pn(t,e){O.mkdirSync(P.dirname(t),{recursive:!0});let n=y.Uri.file(t),s=y.workspace.textDocuments.find(o=>_l(o,t));if(s){let o=new y.Range(s.positionAt(0),s.positionAt(s.getText().length)),r=new y.WorkspaceEdit;if(r.replace(n,o,e),!await y.workspace.applyEdit(r))throw new Error("applyEdit \u5931\u8D25");return await s.save(),"updated-open-doc "+P.basename(t)}return await y.workspace.fs.writeFile(n,Buffer.from(e,"utf8")),"written "+P.basename(t)}function Al(t,e,n,s){if(n>3||s.length>=200)return;let o=[];try{o=O.readdirSync(e,{withFileTypes:!0})}catch{return}for(let r of o){if(s.length>=200)return;if(ii(r.name))continue;let i=P.join(e,r.name),a=P.relative(t,i),l=!a||a.startsWith("..")||P.isAbsolute(a)?i.split(P.sep).join("/"):a;if(r.isDirectory())s.push(l+"/"),Al(t,i,n+1,s);else{let c=0;try{c=O.statSync(i).size}catch{}s.push(l+" ("+c+"B)")}}}var lh=[/\brm\s+(-[a-z]*\s+)*-[a-z]*r[a-z]*f?\s+\/(?!\S*\w)/i,/\bmkfs\b/i,/\bdd\s+if=/i,/\bsudo\b/i,/\bshutdown\b/i,/\breboot\b/i,/:\s*\(\s*\)\s*\{/,/\bdiskutil\s+erase/i,/\bchmod\s+-R\s+777\s+\//i];function rk(){let t=["C:\\Program Files\\Git\\bin\\bash.exe","C:\\Program Files\\Git\\usr\\bin\\bash.exe"];process.env.LOCALAPPDATA&&t.push(P.join(process.env.LOCALAPPDATA,"Programs","Git","bin","bash.exe"));for(let e of t)if(O.existsSync(e))return e;try{let e=gw("where bash",{encoding:"utf8",timeout:3e3}),n=String(e).split(/\r?\n/).map(function(s){return s.trim()}).find(function(s){return/bash(\.exe)?$/i.test(s)&&!/^[A-Za-z]:\\Windows\\/i.test(s)});if(n)return n}catch{}return process.env.ComSpec||"cmd.exe"}var ch=process.platform==="win32"?rk():"/bin/bash",$=tp.createRegistry({shell:ch,maxRunning:tp.DEFAULTS.maxRunning,isDangerous:function(t){return!!lh.find(function(e){return e.test(t)})}});function uh(t,e,n,s){return new Promise(o=>{if(lh.find(i=>i.test(t))){o({ok:!1,code:-1,out:"\u62D2\u7EDD\u6267\u884C\uFF1A\u547D\u4E2D\u5371\u9669\u547D\u4EE4\u9ED1\u540D\u5355 \u2192 "+t});return}mw(t,{cwd:e,timeout:Math.min(Math.max(n||6e4,1e3),12e4),maxBuffer:4*1024*1024,shell:ch,env:Object.assign({},process.env,{NO_COLOR:"1",CI:"1"})},(i,a,l)=>{let u=((a||"")+(l?`
|
|
736
|
+
[stderr]
|
|
737
|
+
`+l:"")).trim()||(i?String(i.message||i):""),d=dh(u,s);o({ok:!i,code:i&&typeof i.code=="number"?i.code:i?1:0,out:d.text||"(\u65E0\u8F93\u51FA)",full:u,truncated:d.truncated})})})}function dh(t,e){let n=String(t??""),s=isFinite(Number(e))&&Number(e)>0?Math.floor(Number(e)):8e3;if(n.length<=s)return{text:n,truncated:!1,dropped:0};let o=Math.floor(s*.6),r=s-o,i=n.length-s;return{text:n.slice(0,o)+`
|
|
738
|
+
\u2026[\u4E2D\u95F4\u7701\u7565 `+i+` \u5B57\u7B26]\u2026
|
|
739
|
+
`+n.slice(n.length-r),truncated:!0,dropped:i}}var Ms=new Map;function Ps(){let t={enabled:!1,chromePath:"",headless:!0,width:1280,height:800,idleMs:3e5};try{let e=y.workspace.getConfiguration("luban");t.enabled=e.get("browser.enabled")===!0,t.chromePath=String(e.get("browser.chromePath")==null?"":e.get("browser.chromePath")),t.headless=e.get("browser.headless")!==!1;let n=Number(e.get("browser.viewportWidth"));isFinite(n)&&n>=320&&(t.width=Math.floor(n));let s=Number(e.get("browser.viewportHeight"));isFinite(s)&&s>=240&&(t.height=Math.floor(s));let o=Number(e.get("browser.idleTimeoutMs"));isFinite(o)&&o>=1e4&&(t.idleMs=Math.floor(o))}catch{}return t}function El(){return Ps().enabled}function fp(t,e){e.timer&&clearTimeout(e.timer);let n=Ps();e.timer=setTimeout(function(){ai(t,"idle")},n.idleMs),e.timer&&typeof e.timer.unref=="function"&&e.timer.unref()}async function ik(t){let e=String(t||"_default"),n=Ms.get(e);if(n&&n.starting)return n.starting;if(n&&n.inst&&!n.inst.closed)return fp(e,n),n.inst;let s=Ps(),o={inst:null,starting:null,timer:null};return Ms.set(e,o),o.starting=Pe.launch({exe:s.chromePath,headless:s.headless,width:s.width,height:s.height}).then(function(r){return o.inst=r,o.starting=null,fp(e,o),w("browser_launch",{sessionId:e,exe:r.exe,port:r.port}),r}).catch(function(r){throw Ms.delete(e),w("browser_launch_failed",{sessionId:e,message:String(r&&r.message||r)}),r}),o.starting}async function ai(t,e){let n=String(t||"_default"),s=Ms.get(n);if(!s)return!1;Ms.delete(n),s.timer&&clearTimeout(s.timer);let o=s.inst;if(o)try{await o.close()}catch(r){w("browser_close_failed",{message:r.message})}else s.starting&&s.starting.then(function(r){return r.close()}).catch(function(){});return w("browser_close",{sessionId:n,reason:e||"manual"}),!0}async function ak(t){for(let e of Array.from(Ms.keys()))await ai(e,t)}function Ol(){let t={enabled:!1,confirm:!0,maxWidth:2048};try{let e=y.workspace.getConfiguration("luban");t.enabled=e.get("computer.enabled")===!0,t.confirm=e.get("computer.confirm")!==!1;let n=Number(e.get("computer.screenshotWidth"));isFinite(n)&&n>=320&&(t.maxWidth=Math.floor(n))}catch{}return t}function Pl(){return Ol().enabled}var lk={click:!0,move:!0,drag:!0,scroll:!0,type:!0,key:!0},Ur=new Set;async function ck(t,e,n){if(!Ol().confirm)return!0;let o=String(t||"_default");if(Ur.has(o))return!0;let r=null;try{r=await y.window.showWarningMessage("Luban \u60F3\u64CD\u4F5C\u4F60\u7684\u684C\u9762\uFF08"+e+"\uFF09\uFF1A"+(n||""),{modal:!0},"\u5141\u8BB8\u672C\u6B21\u4F1A\u8BDD")}catch{return!0}return r!=="\u5141\u8BB8\u672C\u6B21\u4F1A\u8BDD"?(w("computer_confirm_denied",{sessionId:o,action:e}),!1):(Ur.add(o),w("computer_confirm_ok",{sessionId:o,action:e}),!0)}function pp(t,e){let n={text:String(t??""),images:Array.isArray(e)?e.filter(function(s){return s&&s.dataUrl}):[]};return n.toString=function(){return n.text},n}function hp(t,e,n){let s=Array.isArray(t)?t:[];if(!s.length)return e;let o=s.map(function(r){return r?r.kind==="network"?"["+(r.status?String(r.status):"FAIL")+"] "+String(r.text||""):"["+String(r.level||"log")+"] "+String(r.text||""):""}).filter(Boolean).join(`
|
|
740
|
+
`);return dh(o,isFinite(Number(n))&&Number(n)>200?Number(n):4e3).text}var An=[{type:"function",function:{name:"list_files",description:"\u9012\u5F52\u5217\u51FA\u76EE\u5F55\u4E0B\u7684\u6587\u4EF6\uFF08\u6700\u591A 3 \u5C42\uFF0C\u8DF3\u8FC7\u9690\u85CF\u76EE\u5F55\u548C node_modules\uFF09\u3002dir \u53EF\u4E3A\u7EDD\u5BF9\u8DEF\u5F84\uFF0C\u7701\u7565\u8868\u793A\u5DE5\u4F5C\u76EE\u5F55\u6839\u3002",parameters:{type:"object",properties:{dir:{type:"string",description:"\u5B50\u76EE\u5F55\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u76EE\u5F55\uFF0C\u6216\u7EDD\u5BF9\u8DEF\u5F84\uFF09\uFF0C\u7701\u7565\u8868\u793A\u5DE5\u4F5C\u76EE\u5F55\u6839"}}}}},{type:"function",function:{name:"read_file",description:"\u8BFB\u53D6\u6587\u672C\u6587\u4EF6\u5185\u5BB9\uFF08path \u53EF\u4E3A\u7EDD\u5BF9\u8DEF\u5F84\u6216\u76F8\u5BF9\u5DE5\u4F5C\u76EE\u5F55\uFF09\u3002\u53EF\u7528 startLine\uFF081 \u57FA\uFF09\u4E0E maxLines \u5206\u6BB5\u8BFB\u53D6\u5927\u6587\u4EF6\uFF1B\u7701\u7565\u5219\u4ECE\u7B2C 1 \u884C\u8D77\u6309\u5B57\u7B26\u4E0A\u9650\u8FD4\u56DE\u3002\u4FEE\u6539\u5DF2\u6709\u6587\u4EF6\u524D\u5FC5\u987B\u5148\u8BFB\u5B83\u3002\u4F4D\u4E8E node_modules / dist / target \u7B49\u751F\u6210\u76EE\u5F55\u3001npm-cache / .m2 \u7B49\u5B89\u88C5\u7F13\u5B58\u4E0B\u7684\u6587\u4EF6\u4E0D\u8BFB\u53D6\uFF08\u4E0E list_files / grep \u540C\u4E00\u4EFD\u540D\u5355\uFF1B\u786E\u9700\u67E5\u770B\u7528 run_command\uFF09\u3002",parameters:{type:"object",properties:{path:{type:"string"},startLine:{type:"number",description:"\u8D77\u59CB\u884C\u53F7\uFF08\u4ECE 1 \u5F00\u59CB\uFF09\uFF0C\u9ED8\u8BA4 1"},maxLines:{type:"number",description:"\u6700\u591A\u8FD4\u56DE\u591A\u5C11\u884C\uFF1B\u7701\u7565\u5219\u6309\u6A21\u578B\u7A97\u53E3\u5BF9\u5E94\u7684\u5B57\u7B26\u4E0A\u9650\u4ECE startLine \u5F80\u540E\u53D6"}},required:["path"]}}},{type:"function",function:{name:"search_code",description:"\u5728\u5DE5\u4F5C\u533A\u91CC\u6309\u5173\u952E\u8BCD\u68C0\u7D22\u4EE3\u7801\uFF08\u672C\u5730\u8BCD\u6CD5\u7D22\u5F15 + BM25\uFF09\uFF0C\u8FD4\u56DE\u300C\u8DEF\u5F84:\u884C\u53F7: \u547D\u4E2D\u884C\u300D\u3002\u627E\u51FD\u6570 / \u53D8\u91CF / \u62A5\u9519\u539F\u6587 / \u914D\u7F6E\u9879\u65F6\u5148\u7528\u5B83\uFF0C\u5B9A\u4F4D\u5230\u6587\u4EF6\u518D read_file \u7CBE\u8BFB\uFF0C\u4E0D\u8981\u7528 list_files \u5168\u91CF\u626B\u3002\u5927\u76EE\u5F55 / \u5206\u6279\u573A\u666F\u52A1\u5FC5\u4F20 dir \u9650\u5B9A\u5230\u5F53\u524D\u6279\u6B21\u7684\u5B50\u76EE\u5F55\uFF0C\u7981\u6B62\u6309\u76EE\u5F55\u6811\u9010\u4E2A read_file\u3002",parameters:{type:"object",properties:{query:{type:"string",description:"\u5173\u952E\u8BCD\uFF0C\u53EF\u4EE5\u662F\u6807\u8BC6\u7B26\uFF08boostBudget\uFF09\u3001\u591A\u8BCD\uFF08socket \u91CD\u8FDE\uFF09\u6216\u62A5\u9519\u539F\u6587\u7247\u6BB5"},dir:{type:"string",description:"\u53EF\u9009\uFF0C\u76F8\u5BF9\u5DE5\u4F5C\u76EE\u5F55\u7684\u76EE\u5F55\u524D\u7F00\uFF1B\u53EA\u8FD4\u56DE\u8BE5\u76EE\u5F55\u4E0B\u7684\u547D\u4E2D\uFF08\u5982 src/utils \u6216 mes-quartz/src\uFF09"},maxResults:{type:"number",description:"\u8FD4\u56DE\u591A\u5C11\u4E2A\u6587\u4EF6\uFF0C\u9ED8\u8BA4 20\uFF0C\u6700\u5927 100"},contextLines:{type:"number",description:"\u547D\u4E2D\u884C\u524D\u540E\u5404\u5E26\u51E0\u884C\u4E0A\u4E0B\u6587\uFF0C\u9ED8\u8BA4 1\uFF0C\u6700\u5927 5"}},required:["query"]}}},{type:"function",function:{name:"write_file",description:"\u5199\u5165/\u8986\u76D6\u6574\u4E2A\u6587\u4EF6\uFF08\u65B0\u5EFA\u6216\u6574\u4F53\u91CD\u5199\u65F6\u7528\uFF09\uFF0C\u81EA\u52A8\u521B\u5EFA\u7236\u76EE\u5F55\u3002path \u53EF\u4E3A\u7EDD\u5BF9\u8DEF\u5F84\u6216\u76F8\u5BF9\u5DE5\u4F5C\u76EE\u5F55\u3002",parameters:{type:"object",properties:{path:{type:"string"},content:{type:"string",description:"\u5B8C\u6574\u6587\u4EF6\u5185\u5BB9"}},required:["path","content"]}}},{type:"function",function:{name:"replace_in_file",description:"\u628A\u6587\u4EF6\u4E2D\u7684 old_string \u66FF\u6362\u4E3A new_string\uFF08\u5C40\u90E8\u4FEE\u6539\u9996\u9009\uFF09\u3002old_string \u9700\u4E0E\u539F\u6587\u5185\u5BB9\u4E00\u81F4\uFF0C\u4F46\u5BB9\u5FCD\u884C\u5C3E\uFF08CRLF/LF\uFF09\u3001\u884C\u5C3E\u7A7A\u767D\u4E0E\u7F29\u8FDB\u5BBD\u5EA6\u7684\u5DEE\u5F02\u3002\u9ED8\u8BA4\u5FC5\u987B\u552F\u4E00\u5339\u914D\uFF1B\u591A\u5904\u5339\u914D\u8BF7\u52A0\u66F4\u591A\u4E0A\u4E0B\u6587\uFF0C\u6216\u4F20 replace_all\u3002path \u53EF\u4E3A\u7EDD\u5BF9\u8DEF\u5F84\u6216\u76F8\u5BF9\u5DE5\u4F5C\u76EE\u5F55\u3002",parameters:{type:"object",properties:{path:{type:"string"},old_string:{type:"string",description:"\u8981\u66FF\u6362\u7684\u539F\u6587\uFF0C\u5C3D\u91CF\u4E0E\u6587\u4EF6\u5185\u5BB9\u4E00\u81F4\uFF08\u542B\u7F29\u8FDB\uFF09\uFF1B\u884C\u5C3E\u4E0E\u9996\u5C3E\u7A7A\u767D\u4E0D\u4E00\u81F4\u4F1A\u81EA\u52A8\u5BB9\u9519"},new_string:{type:"string",description:"\u66FF\u6362\u540E\u7684\u5185\u5BB9"},replace_all:{type:"boolean",description:"\u53EF\u9009\uFF0C\u9ED8\u8BA4 false\u3002\u4E3A true \u65F6\u628A\u6240\u6709\u5339\u914D\u5904\u4E00\u8D77\u66FF\u6362\uFF0C\u8FD4\u56DE\u66FF\u6362\u5904\u6570"}},required:["path","old_string","new_string"]}}},{type:"function",function:{name:"run_command",description:"\u5728\u5DE5\u4F5C\u76EE\u5F55\u4E0B\u540C\u6B65\u6267\u884C shell \u547D\u4EE4\uFF08\u5982 node xxx.js\u3001npx tsc --noEmit\u3001ls\uFF09\u3002\u9884\u8BA1 \u226460s \u7684\u9A8C\u8BC1\u7528\u5B83\u3002\u9ED8\u8BA4\u8D85\u65F6 60 \u79D2\u3001\u4E0A\u9650 120 \u79D2\u3002\u957F\u6D4B/\u957F\u6784\u5EFA\u6539\u7528 run_command_start + poll\u3002\u4E0D\u8981\u6267\u884C\u5220\u9664/\u7CFB\u7EDF\u7EA7\u547D\u4EE4\u3002",parameters:{type:"object",properties:{command:{type:"string",description:"\u8981\u6267\u884C\u7684\u547D\u4EE4"},timeout_ms:{type:"number",description:"\u8D85\u65F6\u6BEB\u79D2\uFF0C\u9ED8\u8BA4 60000\uFF0C\u6700\u5927 120000"}},required:["command"]}}},{type:"function",function:{name:"run_command_start",description:"\u540E\u53F0\u542F\u52A8\u4E00\u6761 shell \u547D\u4EE4\u5E76\u7ACB\u523B\u8FD4\u56DE job_id\uFF08\u4E0D\u963B\u585E\u5DE5\u5177\u5FAA\u73AF\uFF09\u3002\u7528\u4E8E\u957F\u6D4B/\u957F\u6784\u5EFA\uFF1B\u77ED\u547D\u4EE4\u4ECD\u7528 run_command\u3002\u6BCF\u4F1A\u8BDD\u6700\u591A\u540C\u65F6 2 \u4E2A running\u3002\u968F\u540E\u7528 run_command_poll \u770B\u8FDB\u5EA6\uFF0C\u53D6\u6D88\u7528 run_command_stop\u3002",parameters:{type:"object",properties:{command:{type:"string",description:"\u8981\u6267\u884C\u7684\u547D\u4EE4"},timeout_ms:{type:"number",description:"\u4F5C\u4E1A\u5899\u949F\u6BEB\u79D2\uFF0C\u9ED8\u8BA4 300000\uFF085 \u5206\u949F\uFF09\uFF0C\u6700\u5927 600000"}},required:["command"]}}},{type:"function",function:{name:"run_command_poll",description:"\u67E5\u770B\u5F02\u6B65\u4F5C\u4E1A\u72B6\u6001\u4E0E\u8F93\u51FA\u5C3E\u90E8\u3002status \u4E3A running/exited/timeout/stopped/missing\u3002\u53EF\u9009 wait_ms \u77ED\u6682\u7B49\u5F85\uFF08\u9ED8\u8BA4 0\uFF0C\u4E0A\u9650 15000\uFF09\u3002",parameters:{type:"object",properties:{job_id:{type:"string",description:"run_command_start \u8FD4\u56DE\u7684 job_id"},wait_ms:{type:"number",description:"\u672C\u6B21\u6700\u591A\u963B\u585E\u6BEB\u79D2\uFF0C\u9ED8\u8BA4 0\uFF0C\u6700\u5927 15000"},tail_chars:{type:"number",description:"\u8FD4\u56DE\u8F93\u51FA\u5C3E\u90E8\u5B57\u7B26\u6570\uFF0C\u9ED8\u8BA4 4000\uFF0C\u6700\u5927 8000"}},required:["job_id"]}}},{type:"function",function:{name:"run_command_stop",description:"\u7EC8\u6B62\u5F02\u6B65\u4F5C\u4E1A\uFF08\u6740\u8FDB\u7A0B\u6811\uFF09\u3002\u5DF2\u7ED3\u675F\u5219\u8FD4\u56DE already_done\u3002",parameters:{type:"object",properties:{job_id:{type:"string",description:"run_command_start \u8FD4\u56DE\u7684 job_id"}},required:["job_id"]}}},{type:"function",function:{name:"read_spill",description:"\u6309 id \u53D6\u56DE\u88AB\u4E0A\u4E0B\u6587\u538B\u7F29\u6216\u8BB0\u5FC6\u88C1\u526A\u65F6\u65C1\u8DEF\u4FDD\u5B58\u7684\u539F\u6587\uFF08\u5360\u4F4D\u6587\u6848\u91CC\u7684\u300C\u5B8C\u6574\u7ED3\u679C id=sp_\u2026\u300D\uFF09\u3002\u53EA\u8BFB\uFF1B\u627E\u4E0D\u5230 id \u4F1A\u8BF4\u660E\u539F\u56E0\u3002",parameters:{type:"object",properties:{id:{type:"string",description:"spill id\uFF0C\u5F62\u5982 sp_\u2026\uFF08\u6765\u81EA\u5DE5\u5177\u7ED3\u679C\u5360\u4F4D\u6216\u66F4\u65E9\u8F6E\u6B21\u6458\u8981\uFF09"}},required:["id"]}}},{type:"function",function:{name:"web_search",description:"\u8054\u7F51\u641C\u7D22\u3002\u9700\u8981\u6700\u65B0\u4FE1\u606F\u3001\u5916\u90E8\u6587\u6863\u3001\u7248\u672C\u53F7\u3001\u62A5\u9519\u6392\u67E5\u65F6\u4F7F\u7528\uFF1B\u8FD4\u56DE\u7F16\u53F7\u7ED3\u679C\uFF08\u6807\u9898/URL/\u6458\u8981\uFF09\u3002\u540E\u7AEF\u6309 provider \u7684 webSearch \u914D\u7F6E\u81EA\u52A8\u9009\u62E9 DeepSeek Search \u6216 Bing \u641C\u7D22\u3002",parameters:{type:"object",properties:{query:{type:"string",description:"\u641C\u7D22\u8BCD\uFF0C1~128 \u5B57\u7B26\uFF1B\u652F\u6301 site: \u7B49\u641C\u7D22\u8BED\u6CD5"},count:{type:"number",description:"\u8FD4\u56DE\u6761\u6570 1~50\uFF0C\u9ED8\u8BA4 8"},need_content:{type:"boolean",description:"\u662F\u5426\u540C\u65F6\u8FD4\u56DE\u7F51\u9875\u6B63\u6587\uFF0C\u9ED8\u8BA4 false\uFF08\u6458\u8981\u901A\u5E38\u5DF2\u591F\u7528\uFF1BBing \u540E\u7AEF\u5C3D\u529B\u6293\u53D6\u9996\u6761\u7ED3\u679C\u6B63\u6587\uFF0C\u5931\u8D25\u5219\u5FFD\u7565\uFF09"}},required:["query"]}}},{type:"function",function:{name:"web_fetch",description:"\u6293\u53D6\u5355\u4E2A\u7F51\u9875\u5E76\u8FD4\u56DE\u7EAF\u6587\u672C\u6B63\u6587\u3002\u7528\u4E8E\u7EC6\u8BFB web_search \u7ED3\u679C\u91CC\u7684\u67D0\u4E2A URL\u3002",parameters:{type:"object",properties:{url:{type:"string",description:"\u8981\u6293\u53D6\u7684 http/https \u5730\u5740"}},required:["url"]}}},{type:"function",function:{name:"todo_write",description:"\u521B\u5EFA\u6216\u66F4\u65B0\u672C\u8F6E\u4EFB\u52A1\u6E05\u5355\u3002\u6267\u884C\u8BA1\u5212\u65F6\u7528\u6765\u8DDF\u8E2A\u8FDB\u5EA6\uFF1A\u540C\u65F6\u53EA\u80FD\u6709\u4E00\u4E2A in_progress\uFF1B\u5B8C\u6210\u4E00\u9879\u518D\u6807\u4E0B\u4E00\u9879\uFF1B\u5168\u90E8 completed / cancelled \u540E\u518D\u6536\u5C3E\u6C47\u62A5\u3002",parameters:{type:"object",properties:{merge:{type:"boolean",description:"true\uFF08\u9ED8\u8BA4\uFF09\u6309 id \u5408\u5E76\uFF1Bfalse \u7528\u672C\u6B21\u5217\u8868\u5168\u91CF\u66FF\u6362"},todos:{type:"array",description:"todo \u5217\u8868",items:{type:"object",properties:{id:{type:"string",description:"\u7A33\u5B9A id\uFF0C\u5982 t1"},content:{type:"string",description:"\u8FD9\u4E00\u9879\u8981\u505A\u4EC0\u4E48"},status:{type:"string",description:"pending | in_progress | completed | cancelled"}},required:["id","content","status"]}}},required:["todos"]}}},{type:"function",function:{name:"grep",description:"\u5728\u5DE5\u4F5C\u533A\u91CC\u6309\u6B63\u5219\u68C0\u7D22\u6587\u4EF6\u5185\u5BB9\uFF08\u5BF9\u6807 ripgrep\uFF09\u3002\u8865 search_code \u7684\u76F2\u533A\uFF1Asearch_code \u53EA\u505A\u6807\u8BC6\u7B26 / \u4E2D\u6587 bigram \u62C6\u8BCD\uFF0C\u627E\u4E0D\u5230\u771F\u6B63\u5219\uFF08\u5982 foo\\(\\d+\\)\uFF09\u4E5F\u627E\u4E0D\u5230\u300C\u6240\u6709\u8C03\u7528\u70B9\u300D\u3002\u81EA\u52A8\u8DF3\u8FC7\u9690\u85CF\u76EE\u5F55 / node_modules / \u4E8C\u8FDB\u5236 / \u8D85\u5927\u6587\u4EF6\u3002\u8FD4\u56DE \u6587\u4EF6:\u884C\u53F7: \u5185\u5BB9\u3002",parameters:{type:"object",properties:{pattern:{type:"string",description:'\u6B63\u5219\u8868\u8FBE\u5F0F\uFF08JS RegExp \u8BED\u6CD5\uFF09\uFF0C\u5982 "foo\\(\\d+\\)"'},glob:{type:"string",description:'\u53EF\u9009\uFF0C\u53EA\u68C0\u7D22\u5339\u914D\u8BE5 glob \u7684\u6587\u4EF6\uFF0C\u5982 "**/*.ts"'},ignoreCase:{type:"boolean",description:"\u53EF\u9009\uFF0C\u5FFD\u7565\u5927\u5C0F\u5199\uFF08\u9ED8\u8BA4 false\uFF09"},maxHits:{type:"number",description:"\u53EF\u9009\uFF0C\u6700\u591A\u8FD4\u56DE\u591A\u5C11\u547D\u4E2D\u884C\uFF08\u9ED8\u8BA4 200\uFF0C\u4E0A\u9650 2000\uFF09"},contextLines:{type:"number",description:"\u53EF\u9009\uFF0C\u547D\u4E2D\u884C\u524D\u540E\u5404\u5E26\u51E0\u884C\u4E0A\u4E0B\u6587\uFF080~5\uFF0C\u9ED8\u8BA4 0\uFF09"},dir:{type:"string",description:"\u53EF\u9009\uFF0C\u9650\u5B9A\u68C0\u7D22\u7684\u5B50\u76EE\u5F55\u524D\u7F00"}},required:["pattern"]}}},{type:"function",function:{name:"glob",description:"\u6309\u6587\u4EF6\u540D\u6A21\u5F0F\u627E\u6587\u4EF6\uFF08\u5BF9\u6807 Cursor glob \u5DE5\u5177\uFF09\u3002\u8865 search_code \u7684\u76F2\u533A\uFF1Asearch_code \u53EA\u7D22\u5F15\u5185\u5BB9\uFF0C\u627E\u4E0D\u5230\u300C\u54EA\u4E2A\u6587\u4EF6\u53EB *config*\u300D\u3002\u652F\u6301 * / ** / ? / [abc] / {a,b} / \u524D\u5BFC ! \u53D6\u53CD\u3002\u7ED3\u679C\u6309\u6700\u8FD1\u6539\u52A8\u6392\u5E8F\u3002",parameters:{type:"object",properties:{patterns:{type:"array",items:{type:"string"},description:'glob \u6A21\u5F0F\u6570\u7EC4\uFF0C\u652F\u6301\u524D\u5BFC ! \u53D6\u53CD\uFF08\u540E\u51FA\u73B0\u7684\u89C4\u5219\u8986\u76D6\u5148\u51FA\u73B0\u7684\uFF09\uFF0C\u5982 ["**/*.js", "!**/node_modules/**"]'},maxFiles:{type:"number",description:"\u53EF\u9009\uFF0C\u6700\u591A\u8FD4\u56DE\u591A\u5C11\u4E2A\u6587\u4EF6\uFF08\u9ED8\u8BA4 200\uFF0C\u4E0A\u9650 2000\uFF09"},dir:{type:"string",description:"\u53EF\u9009\uFF0C\u9650\u5B9A\u904D\u5386\u7684\u5B50\u76EE\u5F55\u524D\u7F00"}},required:["patterns"]}}},{type:"function",function:{name:"apply_patch",description:"\u4E00\u6B21\u63D0\u4EA4\u591A\u6587\u4EF6\u589E / \u6539 / \u5220\uFF08\u5BF9\u6807 Cursor apply_patch\uFF09\u3002\u5168\u6210\u529F\u624D\u843D\u76D8\uFF08\u539F\u5B50\uFF09\uFF0C\u4EFB\u4E00\u6587\u4EF6\u6821\u9A8C\u5931\u8D25\u5219\u6574\u4F53\u4E0D\u5199\u3002\u6539\u6587\u4EF6\u7528\u300C\u4E0A\u4E0B\u6587\u951A\u70B9 + -/+ \u884C\u300D\u5B9A\u4F4D\uFF0C\u4E0D\u5199\u884C\u53F7\uFF08\u907F\u514D\u884C\u53F7\u6F02\u79FB\uFF09\u3002\u9002\u5408\u8DE8\u6587\u4EF6\u91CD\u6784\u3001\u6279\u91CF\u6539\u540D\u3001\u4E00\u6B21\u6539\u591A\u5904\u3002",parameters:{type:"object",properties:{patch:{type:"string",description:"patch \u6587\u672C\uFF0C\u683C\u5F0F\uFF1A*** Begin Patch / *** Add File: path\uFF08\u5185\u5BB9\u884C\u4EE5 + \u5F00\u5934\uFF09/ *** Update File: path\uFF08@@ \u951A\u70B9 + \u7A7A\u683C\u4E0A\u4E0B\u6587\u884C + - \u5220 + \u52A0\uFF09/ *** Delete File: path / *** End Patch"}},required:["patch"]}}},{type:"function",function:{name:"delete_file",description:"\u5220\u9664\u5355\u4E2A\u6587\u4EF6\uFF08\u8FDB REVIEW \u5BA1\u9605\uFF0C\u53EF\u64A4\u9500\uFF09\u3002\u6BD4 run_command rm \u66F4\u5B89\u5168\uFF1A\u8D70\u5BA1\u9605\u6D41\u7A0B\u3001\u80FD\u5728\u9762\u677F\u91CC\u64A4\u9500\u3001\u4E0D\u4F1A\u8BEF\u5220\u76EE\u5F55\u3002\u5220\u9664\u76EE\u5F55\u8BF7\u7528 run_command\u3002",parameters:{type:"object",properties:{path:{type:"string",description:"\u8981\u5220\u9664\u7684\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u76EE\u5F55\u6216\u7EDD\u5BF9\u8DEF\u5F84\uFF09"}},required:["path"]}}},{type:"function",function:{name:"move_file",description:"\u79FB\u52A8 / \u91CD\u547D\u540D\u5355\u4E2A\u6587\u4EF6\uFF08\u8FDB REVIEW \u5BA1\u9605\uFF0C\u53EF\u64A4\u9500\uFF09\u3002\u6BD4 run_command mv \u66F4\u5B89\u5168\uFF1A\u8D70\u5BA1\u9605\u6D41\u7A0B\u3001\u80FD\u5728\u9762\u677F\u91CC\u64A4\u9500\u3002\u79FB\u52A8\u76EE\u5F55\u8BF7\u7528 run_command\u3002",parameters:{type:"object",properties:{from:{type:"string",description:"\u6E90\u6587\u4EF6\u8DEF\u5F84"},to:{type:"string",description:"\u76EE\u6807\u8DEF\u5F84\uFF08\u53EF\u91CD\u547D\u540D\uFF0C\u53EF\u8DE8\u76EE\u5F55\uFF09"}},required:["from","to"]}}},{type:"function",function:{name:"read_lints",description:"\u8BFB\u8BED\u8A00\u670D\u52A1\u5668\u8BCA\u65AD\uFF08\u5BF9\u6807 Cursor read_lints\uFF09\u3002\u6539\u5B8C\u6587\u4EF6\u540E\u8BFB error / warning\uFF0C\u81EA\u5DF1\u53D1\u73B0\u7C7B\u578B\u9519 / \u8BED\u6CD5\u9519\uFF0C\u800C\u4E0D\u662F\u7B49\u7528\u6237\u8D34\u62A5\u9519\u3002\u4E0D\u4F20 path \u65F6\u8BFB\u6574\u4E2A\u5DE5\u4F5C\u533A\u3002\u8BCA\u65AD\u9700\u8981\u8BED\u8A00\u670D\u52A1\u5668\u5DF2\u5C31\u7EEA\uFF0C\u521A\u5199\u5B8C\u53EF\u80FD\u8981\u7B49\u51E0\u79D2\u3002",parameters:{type:"object",properties:{path:{type:"string",description:"\u53EF\u9009\uFF0C\u53EA\u8BFB\u8BE5\u6587\u4EF6\u7684\u8BCA\u65AD\uFF1B\u7701\u7565\u8BFB\u6574\u4E2A\u5DE5\u4F5C\u533A"},maxDiags:{type:"number",description:"\u53EF\u9009\uFF0C\u6700\u591A\u8FD4\u56DE\u591A\u5C11\u6761\uFF08\u9ED8\u8BA4 100\uFF0C\u4E0A\u9650 1000\uFF09"}}}}},{type:"function",function:{name:"ask_question",description:"\u5411\u7528\u6237\u63D0\u51FA\u9009\u62E9\u9898\u5E76\u7B49\u5F85\u70B9\u9009\u3002\u4EFB\u52A1\u51FA\u73B0\u5B9E\u8D28\u5206\u53C9\u3001\u9700\u8981\u4EBA\u62CD\u677F\u65F6\u4F7F\u7528\uFF1B\u7528\u6237\u5728\u9762\u677F\u70B9\u9009\u9879\u540E\u624D\u8FD4\u56DE\uFF0C\u4E0D\u8981\u53EA\u628A\u5F00\u653E\u95EE\u9898\u5199\u8FDB\u6B63\u6587\u3002\u6700\u591A 4 \u9898\uFF0C\u6BCF\u9898 2~6 \u4E2A\u9009\u9879\uFF1B\u6709\u660E\u663E\u66F4\u7A33\u59A5\u7684\u8DEF\u5F84\u65F6\u7ED9\u5BF9\u5E94 option \u6807 recommended: true\u3002",parameters:{type:"object",properties:{title:{type:"string",description:"\u53EF\u9009\u77ED\u6807\u9898\uFF0C\u663E\u793A\u5728\u9009\u9879\u5361\u9876\u90E8"},questions:{type:"array",description:"\u9898\u76EE\u5217\u8868\uFF081~4\uFF09",items:{type:"object",properties:{id:{type:"string",description:"\u9898\u76EE\u7A33\u5B9A id\uFF0C\u5982 q1"},prompt:{type:"string",description:"\u9898\u5E72"},allow_multiple:{type:"boolean",description:"\u53EF\u9009\uFF0C\u9ED8\u8BA4 false\uFF1Btrue \u65F6\u7528\u6237\u53EF\u591A\u9009"},options:{type:"array",description:"\u9009\u9879 2~6 \u4E2A",items:{type:"object",properties:{id:{type:"string",description:"\u9009\u9879 id"},label:{type:"string",description:"\u9009\u9879\u6587\u6848"},recommended:{type:"boolean",description:"\u53EF\u9009\uFF1Btrue \u65F6\u9762\u677F\u5728\u8BE5\u9009\u9879\u4E0A\u6807\u300C\u63A8\u8350\u300D\uFF08\u4EC5\u63D0\u793A\uFF0C\u4E0D\u9884\u9009\uFF09"}},required:["id","label"]}}},required:["id","prompt","options"]}}},required:["questions"]}}},{type:"function",function:{name:"browser",description:"\u7528\u672C\u673A\u65E0\u5934\u6D4F\u89C8\u5668\u770B\u771F\u5B9E\u9875\u9762\uFF08\u53EA\u8BFB\uFF09\uFF1Aopen \u6253\u5F00\u7F51\u5740\u3001snapshot \u53D6\u53EF\u8BBF\u95EE\u6027\u5927\u7EB2\u3001screenshot \u622A\u56FE\u3001console \u770B\u62A5\u9519\u3001network \u770B\u5931\u8D25\u8BF7\u6C42\u3001close \u5173\u95ED\u3002\u9002\u5408\u9A8C\u8BC1\u524D\u7AEF\u6E32\u67D3\u7ED3\u679C\u3001\u6392\u67E5\u300C\u672C\u5730\u8DD1\u8D77\u6765\u4F46\u9875\u9762\u4E0D\u5BF9\u300D\u3002\u53EA\u8BFB\uFF0C\u4E0D\u80FD\u70B9\u51FB / \u8F93\u5165\u3002\u622A\u56FE\u53EA\u6709\u5F00\u4E86 vision \u7684\u6A21\u578B\u624D\u770B\u5F97\u5230\uFF0C\u5426\u5219\u7528 snapshot\u3002",parameters:{type:"object",properties:{action:{type:"string",enum:["open","snapshot","screenshot","console","network","close"],description:"\u52A8\u4F5C\uFF1Aopen(\u9700 url) / snapshot / screenshot / console / network / close"},url:{type:"string",description:"open \u65F6\u7684\u5730\u5740\uFF0C\u5982 http://localhost:5173\uFF1B\u7701\u7565\u534F\u8BAE\u65F6\u6309 https \u8865\u5168"},maxChars:{type:"number",description:"\u53EF\u9009\uFF0Csnapshot / console / network \u7684\u6B63\u6587\u4E0A\u9650\uFF08\u9ED8\u8BA4 6000 / 4000\uFF09"},fullPage:{type:"boolean",description:"\u53EF\u9009\uFF0C\u622A\u56FE\u662F\u5426\u5305\u542B\u6574\u9875\uFF08\u9ED8\u8BA4\u53EA\u622A\u89C6\u53E3\uFF09"}},required:["action"]}}},{type:"function",function:{name:"computer",description:"\u64CD\u4F5C\u672C\u673A\u684C\u9762\uFF08macOS / Windows\uFF09\uFF1Ascreenshot \u622A\u5C4F\u3001ocr \u8BC6\u522B\u5C4F\u5E55\u6587\u5B57\uFF08Windows \u6682\u4E0D\u652F\u6301\uFF0C\u4F1A\u9000\u56DE\u8BA9\u4F60\u770B\u56FE\uFF09\u3001windows \u5217\u7A97\u53E3\u3001click \u70B9\u51FB\u3001type \u8F93\u5165\u3001key \u6309\u952E\u3001scroll \u6EDA\u52A8\u3001drag \u62D6\u52A8\u3002\u9002\u5408\u9A8C\u8BC1\u771F\u7684 GUI\uFF08\u7F16\u8F91\u5668 / \u6A21\u62DF\u5668 / \u672C\u5730 App\uFF09\uFF0C\u6216\u64CD\u4F5C\u6CA1\u6709\u547D\u4EE4\u884C\u7684\u754C\u9762\u3002\u622A\u56FE\u53EA\u6709\u5F00\u4E86 vision \u7684\u6A21\u578B\u624D\u770B\u5F97\u5230\uFF08\u5426\u5219\u81EA\u52A8\u6539\u56DE ocr \u6587\u5B57\uFF09\uFF1B\u4F1A\u52A8\u9F20\u6807\u952E\u76D8\u7684\u52A8\u4F5C\u7B2C\u4E00\u6B21\u9700\u8981\u7528\u6237\u786E\u8BA4\u3002",parameters:{type:"object",properties:{action:{type:"string",enum:["screenshot","ocr","windows","frontmost","cursor","click","move","drag","scroll","type","key"],description:"\u52A8\u4F5C\uFF1Ascreenshot / ocr / windows / frontmost / cursor / click / move / drag / scroll / type / key"},x:{type:"number",description:"click / move / scroll / drag \u7684\u8D77\u70B9\u6A2A\u5750\u6807\uFF08"+To+"\uFF09"},y:{type:"number",description:"click / move / scroll / drag \u7684\u8D77\u70B9\u7EB5\u5750\u6807\uFF08"+To+"\uFF09"},toX:{type:"number",description:"drag \u7684\u7EC8\u70B9\u6A2A\u5750\u6807"},toY:{type:"number",description:"drag \u7684\u7EC8\u70B9\u7EB5\u5750\u6807"},imageCoords:{type:"boolean",description:"\u53EF\u9009\uFF1Ax / y \u662F\u300C\u6700\u8FD1\u4E00\u5F20\u622A\u56FE\u4E0A\u7684\u50CF\u7D20\u5750\u6807\u300D\u800C\u4E0D\u662F\u5C4F\u5E55\u70B9\uFF08\u622A\u56FE\u88AB\u538B\u8FC7\u65F6\u7528\uFF0C\u7531\u5DE5\u5177\u6362\u7B97\uFF09"},button:{type:"string",enum:["left","right"],description:"\u53EF\u9009\uFF1Aclick \u7528\u54EA\u4E2A\u952E\uFF08\u9ED8\u8BA4 left\uFF09"},count:{type:"number",description:"\u53EF\u9009\uFF1Aclick \u6B21\u6570\uFF0C1 = \u5355\u51FB\u30012 = \u53CC\u51FB\uFF08\u9ED8\u8BA4 1\uFF09"},dy:{type:"number",description:"scroll \u7684\u7EB5\u5411\u6EDA\u52A8\u91CF\uFF08\u50CF\u7D20\uFF0C\u6B63\u6570 = \u5411\u4E0B\uFF09"},dx:{type:"number",description:"scroll \u7684\u6A2A\u5411\u6EDA\u52A8\u91CF\uFF08\u6B63\u6570 = \u5411\u53F3\uFF09"},text:{type:"string",description:"type \u8981\u8F93\u5165\u7684\u6587\u672C\uFF08\u4E2D\u6587 / emoji \u4F1A\u8D70\u526A\u8D34\u677F\u7C98\u8D34\uFF09"},submit:{type:"boolean",description:"\u53EF\u9009\uFF1Atype \u4E4B\u540E\u8981\u4E0D\u8981\u518D\u6309\u56DE\u8F66"},keys:{type:"string",description:"key \u7684\u6309\u952E\u7EC4\u5408\uFF0C\u5982 cmd+shift+p\u3001ctrl+alt+delete\u3001escape"},region:{type:"string",description:'\u53EF\u9009\uFF1A\u53EA\u770B\u4E00\u5757\u5C4F\u5E55\uFF0C\u683C\u5F0F "x,y,\u5BBD,\u9AD8"\uFF08'+To+"\uFF09"},display:{type:"number",description:"\u53EF\u9009\uFF1A\u7B2C\u51E0\u4E2A\u5C4F\u5E55\uFF081 \u8D77\uFF0C\u9ED8\u8BA4\u4E3B\u5C4F\uFF09"},maxWidth:{type:"number",description:"\u53EF\u9009\uFF1A\u622A\u56FE\u6700\u5927\u5BBD\u5EA6\uFF08\u9ED8\u8BA4\u53D6\u8BBE\u7F6E luban.computer.screenshotWidth\uFF09"},maxChars:{type:"number",description:"\u53EF\u9009\uFF1Aocr \u8FD4\u56DE\u7684\u5B57\u7B26\u4E0A\u9650\uFF08\u9ED8\u8BA4 6000\uFF09"}},required:["action"]}}},{type:"function",function:{name:"explore",description:"\u628A\u4E00\u4E2A\u72EC\u7ACB\u7684\u53EA\u8BFB\u8C03\u7814\u4EFB\u52A1\u4EA4\u7ED9\u5B50\u4EE3\u7406\uFF0C\u5B83\u6709\u81EA\u5DF1\u7684\u4E0A\u4E0B\u6587\uFF0C\u53EA\u628A\u7ED3\u8BBA\u4EA4\u56DE\u6765\u3002\u9002\u5408\u300C\u5148\u53BB\u4E00\u7247\u4EE3\u7801\u91CC\u67E5\u6E05\u67D0\u4E8B\u300D\uFF1A\u591A\u5904\u641C\u7D22\u3001\u6279\u91CF\u8BFB\u6587\u4EF6\u3001\u786E\u8BA4\u8C03\u7528\u94FE\u3002\u5B50\u4EE3\u7406\u4E0D\u80FD\u6539\u6587\u4EF6\u3001\u4E0D\u80FD\u63D0\u95EE\uFF0C\u7528\u5B8C\u5C31\u7ED3\u675F\u3002\u4E0D\u8981\u5728\u9700\u8981\u6539\u4EE3\u7801\u65F6\u7528\u5B83\u3002",parameters:{type:"object",properties:{description:{type:"string",description:"\u4E09\u5230\u4E94\u4E2A\u8BCD\uFF0C\u8BF4\u660E\u8981\u67E5\u4EC0\u4E48\uFF0C\u4F1A\u663E\u793A\u5728\u5361\u7247\u4E0A"},prompt:{type:"string",description:"\u5B8C\u6574\u4EFB\u52A1\u63CF\u8FF0\uFF1A\u67E5\u4EC0\u4E48\u3001\u4ECE\u54EA\u627E\u3001\u8981\u56DE\u7B54\u54EA\u51E0\u4E2A\u95EE\u9898"}},required:["description","prompt"]}}}],uk={type:"function",function:{name:"read_skill",description:"\u8BFB\u53D6\u4E00\u4E2A\u6280\u80FD\u7684 SKILL.md \u5168\u6587\uFF08\u7CFB\u7EDF\u63D0\u793A\u91CC\u5217\u51FA\u4E86\u53EF\u7528\u6280\u80FD\uFF09\u3002file \u53EF\u9009\uFF0C\u7528\u4E8E\u8BFB\u8BE5\u6280\u80FD\u76EE\u5F55\u5185\u7684\u9644\u5C5E\u6587\u4EF6\u3002",parameters:{type:"object",properties:{name:{type:"string",description:"\u6280\u80FD\u540D\uFF0C\u5982 defuddle"},file:{type:"string",description:"\u53EF\u9009\uFF1A\u6280\u80FD\u76EE\u5F55\u5185\u7684\u76F8\u5BF9\u8DEF\u5F84\uFF0C\u7701\u7565\u8868\u793A\u8BFB SKILL.md"}},required:["name"]}}},dk=5,mp=1500;function Wr(t){let e=String(t??""),n=[],s=0;for(;s<e.length;){let o=e.indexOf(`
|
|
741
|
+
`,s);if(o<0){n.push({start:s,end:e.length,text:e.slice(s),eol:""});break}let r=o>s&&e.charAt(o-1)==="\r",i=r?o-1:o;n.push({start:s,end:i,text:e.slice(s,i),eol:r?`\r
|
|
742
|
+
`:`
|
|
743
|
+
`}),s=o+1}return n.length||n.push({start:0,end:0,text:"",eol:""}),n}function Kr(t,e){let n=String(t??"");return e<=1?n:e===2?n.replace(/[ \t\f\v]+$/,""):e===3?n.replace(/^[ \t\f\v]+/,"").replace(/[ \t\f\v]+$/,""):n.replace(/\s+/g," ").trim()}function fk(t,e){let n=1;for(let s=0;s<e;s++)t.charAt(s)===`
|
|
744
|
+
`&&n++;return n}function pk(t,e,n){let s=String(t??""),o=String(e??""),r=[],i=0;for(;r.length<200;){let d=s.indexOf(o,i);if(d<0)break;r.push({start:d,end:d+o.length,fileIndent:"",needleIndent:""}),i=d+o.length}if(r.length===1||r.length>1&&n)return{ranges:r,level:0};if(r.length>1)return{ambiguous:r.map(function(d){return fk(s,d.start)})};let a=Wr(s),l=Wr(o.replace(/^\uFEFF/,"")),c=l.length,u=/(\r\n|\n|\r)$/.test(o);for(let d=1;d<dk;d++){let f=a.map(function(x){return Kr(x.text,d)}),p=l.map(function(x){return Kr(x.text,d)}),h=[];for(let x=0;x+c<=f.length&&h.length<200;x++){let b=!0;for(let k=0;k<c;k++)if(f[x+k]!==p[k]){b=!1;break}b&&h.push(x)}if(!h.length)continue;return h.length>1&&!n?{ambiguous:h.map(function(x){return x+1})}:{ranges:h.map(function(x){let b=a[x+c-1];return{start:a[x].start,end:u?b.end+b.eol.length:b.end,fileIndent:/^[ \t]*/.exec(a[x].text)[0],needleIndent:/^[ \t]*/.exec(l[0].text)[0]}}),level:d}}return null}function hk(t){let e=String(t??""),n=(e.match(/\r\n/g)||[]).length,s=(e.match(/\n/g)||[]).length-n;return n>s?`\r
|
|
745
|
+
`:`
|
|
746
|
+
`}function mk(t,e){return String(t??"").replace(/\r\n|\r|\n/g,e)}function gk(t,e,n){let s=String(t??"");return e===n?s:s.split(`
|
|
747
|
+
`).map(function(o){if(!o.trim())return o;if(e&&o.indexOf(e)===0)return n+o.slice(e.length);let r=n.length-e.length;if(r>0)return" ".repeat(r)+o;let i=/^[ \t]*/.exec(o)[0];return o.slice(Math.min(i.length,-r))}).join(`
|
|
748
|
+
`)}function Eo(t){let e=String(t??"");return e.length>160?e.slice(0,160)+"\u2026":e}function yk(t,e){let n=String(t??""),s=String(e??""),o=Wr(n),r=Wr(s.replace(/^\uFEFF/,"")),i=r.length,a=o.map(function(h){return Kr(h.text,1)}),l=r.map(function(h){return Kr(h.text,1)}),c=["old_string \u5728\u6587\u4EF6\u4E2D\u627E\u4E0D\u5230\uFF08\u5DF2\u6309 \u884C\u5C3E / \u884C\u5C3E\u7A7A\u767D / \u884C\u9996\u7F29\u8FDB / \u884C\u5185\u7A7A\u767D \u9010\u7EA7\u5BB9\u9519\u8FC7\uFF09\u3002"],u=null;for(let h=0;h<a.length;h++){if(i&&a[h]!==l[0])continue;let m=0;for(;m<i&&h+m<a.length&&a[h+m]===l[m];)m++;(!u||m>u.same)&&(u={at:h,same:m})}if(u&&u.same>0){let h=u.at+u.same,m=u.same;c.push("\u6587\u4EF6\u7B2C "+(u.at+1)+" \u884C\u8D77\u6709 "+u.same+" \u884C\u4E0E old_string \u4E00\u81F4\uFF0C\u7B2C "+(h+1)+" \u884C\u5F00\u59CB\u4E0D\u540C\uFF1A"),c.push(" \u6587\u4EF6 "+(o[h]?h+1+"| "+Eo(o[h].text):"(\u5DF2\u5230\u6587\u4EF6\u672B\u5C3E)")),c.push(" \u4F60\u7684 "+(r[m]?m+1+"| "+Eo(r[m].text):"(old_string \u5DF2\u7ED3\u675F)"))}else c.push("old_string \u7684\u7B2C 1 \u884C\u5728\u6587\u4EF6\u91CC\u5C31\u627E\u4E0D\u5230\u3002");let d=null;for(let h=0;h<a.length;h++){let m=0;for(let x=0;x<i&&h+x<a.length;x++)a[h+x]===l[x]&&m++;(!d||m>d.hit)&&(d={at:h,hit:m})}if(d&&d.hit>0){let h=Math.min(i,o.length-d.at);c.push("\u6587\u4EF6\u91CC\u6700\u63A5\u8FD1\u7684\u4E00\u6BB5\uFF08\u7B2C "+(d.at+1)+"-"+(d.at+h)+" \u884C\uFF09\uFF1A");for(let m=0;m<h;m++)c.push(" "+(d.at+m+1)+"| "+Eo(o[d.at+m].text))}let f=[];s.indexOf("\\n")>=0&&f.push("old_string \u91CC\u6709\u5B57\u9762\u91CF \\n\uFF08\u53CD\u659C\u6760 + n\uFF09\uFF0C\u6362\u884C\u8981\u5199\u6210\u771F\u5B9E\u7684\u6362\u884C\u7B26"),s.charAt(0)==="\uFEFF"&&n.charAt(0)!=="\uFEFF"&&f.push("old_string \u5F00\u5934\u7684 BOM \u5B57\u7B26\u6587\u4EF6\u91CC\u6CA1\u6709\uFF0C\u53BB\u6389\u518D\u8BD5"),f.length&&c.push("\u63D0\u793A\uFF1A"+f.join("\uFF1B")),c.push("\u8BF7\u5148 read_file \u786E\u8BA4\u539F\u6587\u540E\u91CD\u8BD5\u3002");let p=c.join(`
|
|
749
|
+
`);return p.length>mp?p.slice(0,mp)+`
|
|
750
|
+
\u2026[\u8BCA\u65AD\u5DF2\u622A\u65AD]`:p}var Hr=["path","file_path","filepath","filePath","file","filename","fileName","target_file","targetFile","abs_path","absPath"],bk={old_string:["old_str","old_text","oldText","old","search","find"],new_string:["new_str","new_text","newText","replace","replacement"],content:["file_text","fileText","text","contents","body"]},Er=200;function wk(t){if(t===void 0)return"undefined";if(t===null)return"null";try{return JSON.stringify(t).slice(0,80)}catch{return String(t).slice(0,80)}}var kk=["arguments","params","args","input","tool_input","parameters"];function gp(t){if(!t||typeof t!="object")return{obj:t,how:""};for(let e of Hr)if(t[e]!==void 0)return{obj:t,how:""};for(let e of kk){let n=t[e];if(!(!n||typeof n!="object"||Array.isArray(n))){for(let s of Hr)if(typeof n[s]=="string"&&n[s].trim())return{obj:n,how:"unwrap:"+e}}}return{obj:t,how:""}}function xk(t){let e={args:{},error:"",repaired:""};if(t==null)return e;if(typeof t=="object"){if(Array.isArray(t))return e.error="\u5DE5\u5177\u53C2\u6570\u662F\u6570\u7EC4\uFF0C\u5E94\u8BE5\u662F\u4E00\u4E2A\u5BF9\u8C61",e;let c=gp(t);return e.args=c.obj,e.repaired=c.how,e}let n=String(t);if(!n.trim())return e;let s=[{how:"",text:n}],o=/```[a-zA-Z0-9_+-]*[ \t]*\r?\n?([\s\S]*?)```/.exec(n);o&&o[1].trim()&&s.push({how:"fence",text:o[1]});let r=n.indexOf("{"),i=n.lastIndexOf("}");r>=0&&i>r&&s.push({how:"braces",text:n.slice(r,i+1)});for(let c of s){let u=[{how:c.how,text:c.text},{how:(c.how?c.how+"+":"")+"comma",text:c.text.replace(/,(\s*[}\]])/g,"$1")}];for(let d of u){let f;try{f=JSON.parse(d.text)}catch{continue}let p=d.how;if(typeof f=="string")try{let m=JSON.parse(f);m&&typeof m=="object"&&!Array.isArray(m)&&(f=m,p=(p?p+"+":"")+"double")}catch{}if(!f||typeof f!="object"||Array.isArray(f))continue;let h=gp(f);return e.args=h.obj,e.repaired=[p,h.how].filter(Boolean).join("+"),e}}let a=n.slice(0,Er),l=n.length>Er?n.slice(-Er):"";return e.error="\u53C2\u6570\u4E0D\u662F\u5408\u6CD5 JSON\uFF08\u5171 "+n.length+` \u5B57\u7B26\uFF09\uFF0C\u901A\u5E38\u662F\u8F93\u51FA\u649E\u4E0A\u957F\u5EA6\u4E0A\u9650\u88AB\u622A\u65AD\uFF0C\u6216\u7AEF\u70B9\u628A arguments \u5F53\u6210\u4E86\u5BF9\u8C61\u3002
|
|
751
|
+
\u5F00\u5934\uFF1A`+a+(l?`
|
|
752
|
+
\u7ED3\u5C3E\uFF1A`+l:""),e}function Sk(t){return!!(t&&typeof t=="object"&&!Array.isArray(t)&&t._omitted===!0)}function _k(t,e){let n=t||{};for(let i of Hr){let a=n[i];if(typeof a=="string"&&a.trim())return{value:a,alias:i==="path"?"":i}}let s;if(n.path!==void 0)s=n.path;else for(let i of Hr)if(n[i]!==void 0){s=n[i];break}let o=Object.keys(n),r=e==="replace_in_file"?'{"path":"src/a.js","old_string":"\u65E7\u5185\u5BB9","new_string":"\u65B0\u5185\u5BB9"}':'{"path":"src/a.js"}';throw new Error(e+" \u7684 path \u7F3A\u5931\u6216\u4E0D\u662F\u5B57\u7B26\u4E32\uFF08\u5F53\u524D\u6536\u5230\uFF1A"+wk(s)+"\uFF09\uFF0C\u8BF7\u4F20\u8981\u64CD\u4F5C\u7684\u6587\u4EF6\u8DEF\u5F84\uFF08\u76F8\u5BF9\u5DE5\u4F5C\u76EE\u5F55\u6216\u7EDD\u5BF9\u8DEF\u5F84\uFF09"+(o.length?"\u3002\u672C\u6B21\u6536\u5230\u7684\u53C2\u6570\u952E\uFF1A"+o.slice(0,8).join(" / "):"\u3002\u672C\u6B21\u6CA1\u6709\u6536\u5230\u4EFB\u4F55\u53C2\u6570")+"\u3002\u6B63\u786E\u5199\u6CD5\uFF1A"+r)}function yp(t,e){let n=t||{};for(let s of e){let o=n[s];if(typeof o=="string"&&o.trim())return o.trim()}return""}function vk(t,e){let n=t||{};if(n[e]!==void 0&&n[e]!==null)return{value:String(n[e]),alias:""};let s=bk[e]||[];for(let o of s)if(n[o]!==void 0&&n[o]!==null)return{value:String(n[o]),alias:o};return{value:void 0,alias:""}}function mo(t,e){let n=_k(t,e);return n.alias&&w("tool_path_alias",{tool:e,alias:n.alias}),n.value}function go(t,e,n){let s=vk(t,e);return s.alias&&w("tool_arg_alias",{tool:n,key:e,alias:s.alias}),s.value}function Tk(t,e,n,s){let o=String(t??""),r=String(e??"");if(!r)throw new Error("old_string \u4E3A\u7A7A");let i=pk(o,r,!!s);if(!i)throw new Error(yk(o,r));if(i.ambiguous){let u=i.ambiguous.slice(0,5).join("\u3001");throw new Error("old_string \u5339\u914D\u5230 "+i.ambiguous.length+" \u5904\uFF08\u884C "+u+(i.ambiguous.length>5?" \u7B49":"")+"\uFF09\uFF0C\u8BF7\u52A0\u66F4\u591A\u4E0A\u4E0B\u6587\u4F7F\u5176\u552F\u4E00\uFF1B\u786E\u5B9E\u8981\u6BCF\u4E00\u5904\u90FD\u66FF\u6362\u5C31\u4F20 replace_all: true")}let a=hk(o),l=String(n??""),c=o;for(let u=i.ranges.length-1;u>=0;u--){let d=i.ranges[u],f=l;i.level>=3&&(f=gk(f,d.needleIndent,d.fileIndent)),c=c.slice(0,d.start)+mk(f,a)+c.slice(d.end)}return{next:c,level:i.level,count:i.ranges.length}}async function At(t,e,n,s,o){let r=o||{};e=e||{};let i=r.caps||null;if(t==="browser"){if(!El()&&!r.forceBrowser)throw new Error("\u6D4F\u89C8\u5668\u5DE5\u5177\u672A\u542F\u7528\uFF1A\u6253\u5F00\u8BBE\u7F6E luban.browser.enabled \u540E\u91CD\u8BD5\uFF08\u9700\u8981\u672C\u673A\u5DF2\u88C5 Chrome \u6216 Edge\uFF09");let a=String(e.action==null?"":e.action).trim().toLowerCase(),l=String(r.sessionId||"_default");if(a==="close")return await ai(l,"tool")?"\u6D4F\u89C8\u5668\u5DF2\u5173\u95ED\u3002":"\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u6253\u5F00\u7684\u6D4F\u89C8\u5668\u3002";if(["open","snapshot","screenshot","console","network"].indexOf(a)<0)throw new Error("\u672A\u77E5 action\uFF1A"+(a||"(\u7A7A)")+"\uFF08\u53EF\u9009 open / snapshot / screenshot / console / network / close\uFF09");let u;try{u=await ik(l)}catch(d){return"\u6D4F\u89C8\u5668\u542F\u52A8\u5931\u8D25\uFF1A"+(d&&d.message?d.message:d)}try{if(a==="open"){if(!e.url)throw new Error("open \u9700\u8981 url \u53C2\u6570");return await u.navigate(String(e.url))}if(a==="snapshot")return await u.snapshot(e.maxChars);if(a==="screenshot"){let d=await u.screenshot({fullPage:e.fullPage===!0}),f=!!(s&&s.model&&s.model.vision===!0),p=["\u622A\u56FE\u5DF2\u83B7\u53D6\uFF08"+u.width+"\xD7"+u.height+"\uFF0Cjpeg\uFF09\u3002"];if(!f)return p.push('\u5F53\u524D\u6A21\u578B\u672A\u5F00\u542F vision\uFF08providers.json \u91CC\u8BE5\u6A21\u578B\u8981\u5199 "vision": true\uFF09\uFF0C\u622A\u56FE\u4E0D\u4F1A\u53D1\u9001\u7ED9\u4F60\uFF1B\u8BF7\u6539\u7528 action=snapshot \u8BFB\u9875\u9762\u7ED3\u6784\uFF0C\u6216\u4ECE console / network \u91CC\u627E\u7EBF\u7D22\u3002'),w("browser_screenshot_skipped",{sessionId:l,reason:"no-vision"}),p.join(`
|
|
753
|
+
`);if(p.push("\u622A\u56FE\u5DF2\u4F5C\u4E3A\u56FE\u7247\u9644\u5728\u672C\u6761\u5DE5\u5177\u7ED3\u679C\u4E4B\u540E\u3002"),r.sessionId)try{let h=Z.saveImage(String(r.sessionId),d);h&&p.push("\u672C\u5730\u526F\u672C\uFF1A"+P.join(Z.ATTACH_DIR,String(r.sessionId),h.file))}catch{}return w("browser_screenshot",{sessionId:l,chars:d.length,fullPage:e.fullPage===!0}),pp(p.join(`
|
|
754
|
+
`),[{mime:"image/jpeg",dataUrl:d}])}if(a==="console")return"\u9875\u9762\uFF1A"+(u.shortUrl()||"(\u672A\u77E5)")+`\uFF08\u53EA\u542B\u672C\u6B21\u5BFC\u822A\u4E4B\u540E\u7684\u8BB0\u5F55\uFF09
|
|
755
|
+
`+hp(u.consoleEntries(30),"\u6CA1\u6709\u63A7\u5236\u53F0\u8F93\u51FA\uFF08\u9875\u9762\u65E2\u6CA1\u62A5\u9519\uFF0C\u4E5F\u6CA1\u6709 console \u8C03\u7528\uFF09\u3002",e.maxChars);if(a==="network")return"\u9875\u9762\uFF1A"+(u.shortUrl()||"(\u672A\u77E5)")+`\uFF08\u53EA\u542B\u672C\u6B21\u5BFC\u822A\u4E4B\u540E\u7684\u8BB0\u5F55\uFF09
|
|
756
|
+
`+hp(u.networkEntries(30),"\u6CA1\u6709\u5931\u8D25\u8BF7\u6C42\uFF08\u6CA1\u6709 4xx / 5xx\uFF0C\u4E5F\u6CA1\u6709\u52A0\u8F7D\u9519\u8BEF\uFF09\u3002",e.maxChars)}catch(d){return"ERROR: browser "+a+" \u5931\u8D25\uFF1A"+(d&&d.message?d.message:d)}}if(t==="computer"){if(!Pl()&&!r.forceComputer)throw new Error("\u684C\u9762\u64CD\u4F5C\u672A\u542F\u7528\uFF1A\u6253\u5F00\u8BBE\u7F6E luban.computer.enabled \u540E\u91CD\u8BD5\uFF08"+Np+"\uFF09");if(r.mode==="plan"&&!r.forceComputer)throw new Error("Plan \u6A21\u5F0F\u4E0D\u80FD\u7528 computer\uFF1A\u70B9\u51FB / \u8F93\u5165\u4F1A\u6539\u5916\u90E8\u72B6\u6001\uFF0C\u5148\u5728 Agent \u6A21\u5F0F\u91CC\u786E\u8BA4\u53EF\u884C");let a=String(e.action==null?"":e.action).trim().toLowerCase(),l=String(r.sessionId||"_default"),c=["screenshot","ocr","windows","frontmost","cursor","click","move","drag","scroll","type","key"];if(c.indexOf(a)<0)throw new Error("\u672A\u77E5 action\uFF1A"+(a||"(\u7A7A)")+"\uFF08\u53EF\u9009 "+c.join(" / ")+"\uFF09");if(lk[a]&&!r.forceComputer&&!await ck(l,a,a==="click"||a==="move"||a==="scroll"?"("+(e.x==null?"?":e.x)+", "+(e.y==null?"?":e.y)+")":a==="type"?JSON.stringify(String(e.text==null?"":e.text).slice(0,40)):a==="key"?String(e.keys||""):""))return"\u7528\u6237\u62D2\u7EDD\u4E86\u8FD9\u6B21\u684C\u9762\u64CD\u4F5C\uFF08"+a+"\uFF09\u3002\u4E0D\u8981\u91CD\u8BD5\uFF1B\u9700\u8981\u7684\u8BDD\u5148\u95EE\u7528\u6237\u8981\u4E0D\u8981\u6539\u8BBE\u7F6E luban.computer.confirm\u3002";let u=Number(e.maxWidth)||Ol().maxWidth,d=isFinite(u)?Math.max(320,Math.min(4096,Math.round(u))):2048,f={region:e.region,display:e.display,maxWidth:d};try{if(a==="screenshot"){let p=await K.capture(f);if(!!!(s&&s.model&&s.model.vision===!0)){let x=await K.ocr({shot:p,maxChars:e.maxChars});return w("computer_screenshot_as_ocr",{sessionId:l,items:x.items}),`\u5F53\u524D\u6A21\u578B\u672A\u5F00\u542F vision\uFF08providers.json \u91CC\u8BE5\u6A21\u578B\u8981\u5199 "vision": true\uFF09\uFF0C\u5DF2\u81EA\u52A8\u6539\u56DE OCR \u6587\u5B57\uFF1A
|
|
757
|
+
`+K.describeShot(p)+`
|
|
758
|
+
`+x.text}let m=K.describeShot(p);if(r.sessionId)try{let x=Z.saveImage(String(r.sessionId),p.dataUrl);x&&w("computer_screenshot_saved",{sessionId:l,file:x.file})}catch{}return w("computer_screenshot",{sessionId:l,width:p.width,height:p.height,ratio:p.ratio}),pp(m+`
|
|
759
|
+
\u622A\u56FE\u5DF2\u4F5C\u4E3A\u56FE\u7247\u9644\u5728\u672C\u6761\u5DE5\u5177\u7ED3\u679C\u4E4B\u540E\u3002`,[{mime:"image/jpeg",dataUrl:p.dataUrl}])}if(a==="ocr"){let p=await K.ocr(Object.assign({},f,{maxChars:e.maxChars}));return w("computer_ocr",{sessionId:l,items:p.items}),p.text}if(a==="windows"){let p=await K.windows({limit:30});if(!p.windows.length)return"\u6CA1\u6709\u53EF\u89C1\u7A97\u53E3\uFF08\u6216\u6CA1\u6388\u6743\u300C\u5C4F\u5E55\u5F55\u5236\u300D\uFF0C\u7A97\u53E3\u6807\u9898\u4F1A\u8BFB\u4E0D\u5230\uFF09\u3002";let h=p.windows.map(function(x){return"- "+(x.title||"(\u65E0\u6807\u9898)")+" \uFF5C "+x.app+" \uFF5C "+Math.round(x.x)+","+Math.round(x.y)+" "+Math.round(x.width)+"\xD7"+Math.round(x.height)+" \uFF5C id="+x.id+(x.minimized?" \uFF5C \u5DF2\u6700\u5C0F\u5316\uFF08\u5750\u6807\u4E3A\u865A\u62DF\u503C\uFF0C\u5148\u8FD8\u539F\u518D\u70B9\uFF09":"")}),m=p.unnamed>0?`
|
|
760
|
+
\uFF08\u53E6\u6709 `+p.unnamed+" \u4E2A\u7A97\u53E3\u6CA1\u6709\u6807\u9898\uFF0C\u672A\u5217\u51FA\uFF09":"";return"\u53EF\u89C1\u7A97\u53E3 "+p.windows.length+" \u4E2A\uFF08\u5750\u6807\u662F"+To+`\uFF0C\u5DE6\u4E0A\u89D2\u539F\u70B9\uFF09\uFF1A
|
|
761
|
+
`+h.join(`
|
|
762
|
+
`)+m}if(a==="frontmost"){let p=await K.frontmost();return"\u524D\u53F0\u5E94\u7528\uFF1A"+(p.name||"(\u672A\u77E5)")+(p.bundleId?"\uFF08"+p.bundleId+"\uFF09":"")+"\uFF0Cpid="+p.pid+"\u3002\u6309\u952E\u4F1A\u6253\u5230\u5B83\u8EAB\u4E0A\u3002"}if(a==="cursor"){let p=await K.cursor();return"\u5149\u6807\u4F4D\u7F6E\uFF1A("+Math.round(p.x)+", "+Math.round(p.y)+")\uFF08"+To+"\uFF09"}if(a==="click")return await K.click({x:e.x,y:e.y,button:e.button,count:e.count,imageCoords:e.imageCoords===!0,dry:r.dryComputer===!0});if(a==="move")return await K.move({x:e.x,y:e.y,imageCoords:e.imageCoords===!0,dry:r.dryComputer===!0});if(a==="drag")return await K.drag({x:e.x,y:e.y,toX:e.toX,toY:e.toY,imageCoords:e.imageCoords===!0,dry:r.dryComputer===!0});if(a==="scroll")return await K.scroll({x:e.x,y:e.y,dy:e.dy,dx:e.dx,imageCoords:e.imageCoords===!0,dry:r.dryComputer===!0});if(a==="type")return await K.type({text:e.text,submit:e.submit===!0,dry:r.dryComputer===!0});if(a==="key")return await K.key({keys:e.keys,dry:r.dryComputer===!0})}catch(p){return"ERROR: computer "+a+" \u5931\u8D25\uFF1A"+(p&&p.message?p.message:p)}}if(t==="list_files"){let a=e.dir?be(e.dir,n):n,l=[];if(Al(n,a,0,l),!l.length)return"(\u7A7A\u76EE\u5F55)";let c=i?i.listEntries:0;if(c>0&&l.length>c){let u=`
|
|
763
|
+
\u2026[\u4EC5\u663E\u793A\u524D `+c+" / \u5171 "+l.length+" \u6761\uFF1B\u53EF\u7528 dir \u7F29\u5C0F\u8303\u56F4]";if(r.spillStore&&typeof r.spillStore.put=="function")try{let d=ut.newId();r.spillStore.put(d,l.join(`
|
|
764
|
+
`),{kind:"tool",name:"list_files",label:String(e.dir||".")}),u+=" \u5B8C\u6574\u6E05\u5355 id="+d+"\uFF0C\u9700\u8981\u65F6\u7528 read_spill"}catch{}return l.slice(0,c).join(`
|
|
765
|
+
`)+u}return l.join(`
|
|
766
|
+
`)}if(t==="read_file"){let a=mo(e,"read_file"),l;try{l=be(a,n)}catch(A){if(A&&A.skipDir)return w("read_file_skipped",{path:a,seg:A.skipDir}),a+" \u4F4D\u4E8E\u8DF3\u8FC7\u76EE\u5F55 "+A.skipDir+"\uFF08node_modules / dist / target \u7B49\u751F\u6210\u76EE\u5F55\u3001npm-cache / .m2 \u7B49\u5B89\u88C5\u7F13\u5B58\uFF09\uFF0Cread_file \u4E0D\u8BFB\u53D6\u8FD9\u7C7B\u76EE\u5F55\u4E0B\u7684\u6587\u4EF6\uFF1Bgrep / glob / search_code \u540C\u6837\u8DF3\u8FC7\u3002\u8FD9\u7C7B\u76EE\u5F55\u91CC\u6CA1\u6709\u9879\u76EE\u7684\u6E90\u7801\uFF0C\u4E0D\u8981\u5728\u8FD9\u91CC\u7FFB\u7B2C\u4E09\u65B9\u5305\u7684\u5B9E\u73B0\uFF1B\u786E\u9700\u67E5\u770B\u65F6\u7528 run_command \u6309\u9700 cat \u8BE5\u6587\u4EF6\uFF08\u53EA\u8BFB\u547D\u4EE4\uFF0CPlan \u6A21\u5F0F\u4E5F\u5141\u8BB8\uFF09\u3002";throw A}let c=Ot(l,n),u="";try{u=Br(l)}catch{u=O.readFileSync(l,"utf8")}let d=u.split(`
|
|
767
|
+
`),f=d.length,p=Math.floor(Number(e.startLine));if((!isFinite(p)||p<1)&&(p=1),p>f)return c+" \uFF08startLine="+p+" \u8D85\u51FA\u6587\u4EF6\u672B\u5C3E\uFF0C\u5171 "+f+" \u884C\uFF09";let h=Math.floor(Number(e.maxLines)),m=r.readMax>0?Math.floor(r.readMax):Fw,x=p-1,b=f;isFinite(h)&&h>0&&(b=Math.min(f,x+h));let k=0,S=x,T=!1;for(;S<b;){let A=d[S].length+(S>x?1:0);if(k+A>m){S===x&&(d[S]=d[S].slice(0,Math.max(0,m)),T=!0,S=x+1);break}k+=A,S++}b=S;let g=b,_=d.slice(x,b).join(`
|
|
768
|
+
`),v=c+" \uFF08L "+p+"-"+g+" / \u5171 "+f+` \u884C\uFF09
|
|
769
|
+
`+_;return g<f?v+=`
|
|
770
|
+
...[`+(T?"\u672C\u884C\u8D85\u957F\u5DF2\u622A\u65AD\uFF1B":"")+"\u8FD8\u6709\u540E\u7EED\uFF0C\u4F20 startLine="+(g+1)+" \u7EE7\u7EED]":T&&(v+=`
|
|
771
|
+
...[\u672C\u884C\u8D85\u957F\u5DF2\u622A\u65AD]`),v}if(t==="search_code"){let a=Math.floor(Number(e.maxResults)),l=e.contextLines==null?1:Math.floor(Number(e.contextLines)),c=i?Math.max(1,Math.min(100,i.searchFiles)):20,u=i&&i.compact?Math.max(0,Math.min(5,i.searchCtxLines)):5,d=En.search(n,String(e.query||e.q||""),{maxFiles:Wh(),maxResults:isFinite(a)?Math.min(Math.max(a,1),c):c,contextLines:isFinite(l)?Math.min(Math.max(l,0),u):Math.min(1,u),prefix:e.dir?String(e.dir):""});return w("search_code",{query:d.query,files:d.files,indexed:d.indexed,matched:d.matched,hits:d.hits.length,changed:d.changed,ms:d.tookMs,truncated:d.truncated}),En.format(d)}if(t==="write_file"){let a=be(mo(e,"write_file"),n),l=!O.existsSync(a),c=Za(a),u=l?"":Yn(a),d=go(e,"content","write_file")||"",f=await Pn(a,d),p=Zt(a,u,d,l);return f+" | "+d.split(`
|
|
772
|
+
`).length+" \u884C"+Tn(p)+await wp(a,l||!c)}if(t==="replace_in_file"){let a=mo(e,"replace_in_file"),l=be(a,n);if(!O.existsSync(l))throw new Error("\u6587\u4EF6\u4E0D\u5B58\u5728: "+a);let c=Za(l),u=O.readFileSync(l,"utf8"),d=go(e,"old_string","replace_in_file"),f=go(e,"new_string","replace_in_file"),p=Tk(u,d,f,e.replace_all===!0||e.replaceAll===!0),h=await Pn(l,p.next),m=Zt(l,u,p.next,!1),x=p.count>1?"\u66FF\u6362 "+p.count+" \u5904":"\u66FF\u6362 1 \u5904",b=p.level?"\uFF08\u5BB9\u9519 L"+p.level+"\uFF1A\u884C\u5C3E/\u7A7A\u767D\u5DEE\u5F02\u5DF2\u5BF9\u9F50\uFF09":"";return h+" | "+x+b+Tn(m)+await wp(l,!c)}if(t==="grep"){let a=ap(e.dir,n),l=Math.floor(Number(e.maxHits)),c=i?i.grepHits:200,u=ze.grep(a.base,String(e.pattern||""),{glob:e.glob?String(e.glob):null,ignoreCase:e.ignoreCase===!0,maxHits:isFinite(l)?Math.min(Math.max(l,1),c):c,contextLines:e.contextLines,prefix:a.prefix});return w("grep",{pattern:u.pattern,hits:u.hits.length,files:u.filesSearched,truncated:u.truncated,timedOut:!!u.timedOut}),ze.formatGrep(u)}if(t==="glob"){let a=ap(e.dir,n),l=Math.floor(Number(e.maxFiles)),c=i?i.globFiles:200,u=ze.glob(a.base,e.patterns||[],{maxFiles:isFinite(l)?Math.min(Math.max(l,1),c):c,prefix:a.prefix});return w("glob",{pattern:u.pattern,matches:u.matches.length,scanned:u.scanned,truncated:u.truncated}),ze.formatGlob(u)}if(t==="apply_patch"){let a=xt.parsePatch(go(e,"patch","apply_patch")),l=xt.validatePatch(n,a,{resolve:function(p){return be(p,n)}});if(!l.ok)throw new Error("apply_patch \u6821\u9A8C\u5931\u8D25\uFF08\u672A\u5199\u5165\u4EFB\u4F55\u6587\u4EF6\uFF09\uFF1A"+l.error);let c=[],u=Object.create(null);for(let p of l.plan)p.type!=="delete"&&(u[p.abs]=Za(p.abs));try{for(let p of l.plan)if(p.type==="add")await Pn(p.abs,p.content),c.push({kind:"add",abs:p.abs,rel:p.rel,content:p.content});else if(p.type==="update")await Pn(p.abs,p.content),c.push({kind:"update",abs:p.abs,rel:p.rel,before:p.before,content:p.content});else{let h=Yn(p.abs)||p.before||"";try{await y.workspace.fs.delete(y.Uri.file(p.abs),{useTrash:!0})}catch{O.rmSync(p.abs,{force:!0})}c.push({kind:"delete",abs:p.abs,rel:p.rel,before:h})}}catch(p){throw await Ak(c),new Error("apply_patch \u5199\u5165\u5931\u8D25\uFF0C\u5DF2\u56DE\u6EDA\u5168\u90E8\u6539\u52A8\uFF1A"+p.message)}let d=[];for(let p of c)p.kind==="add"?d.push(p.rel+" (\u65B0\u589E)"+Tn(Zt(p.abs,"",p.content,!0))):p.kind==="update"?d.push(p.rel+" (\u4FEE\u6539)"+Tn(Zt(p.abs,p.before,p.content,!1))):d.push(p.rel+" (\u5220\u9664)"+Tn(Zt(p.abs,p.before,"",!1)));w("apply_patch",{files:d.length});let f="";if(hh()){let p=c.filter(function(b){return b.kind!=="delete"}).map(function(b){return b.abs}),h=await mh(p),m=an.summarize(h),x=c.some(function(b){return b.kind==="add"||!u[b.abs]});m.total&&(m.error||m.warning)?f=gh+`
|
|
773
|
+
`+an.formatLints(h,{maxDiags:10}):x&&(f=sl)}return"apply_patch \u6210\u529F\uFF1A"+d.length+` \u4E2A\u6587\u4EF6
|
|
774
|
+
`+d.join(`
|
|
775
|
+
`)+f}if(t==="delete_file"){let a=mo(e,"delete_file"),l=be(a,n);if(!O.existsSync(l))throw new Error("\u6587\u4EF6\u4E0D\u5B58\u5728: "+a);if(!O.statSync(l).isFile())throw new Error("\u4E0D\u662F\u6587\u4EF6\uFF08\u5220\u9664\u76EE\u5F55\u8BF7\u7528 run_command\uFF09: "+a);let c=Yn(l);try{await y.workspace.fs.delete(y.Uri.file(l),{useTrash:!0})}catch{O.rmSync(l,{force:!0})}let u=Zt(l,c,"",!1);return w("delete_file",{path:St(l)}),"deleted "+St(l)+Tn(u)}if(t==="move_file"){let a=yp(e,["from","from_path","fromPath","source","src","old_path","oldPath"]),l=yp(e,["to","to_path","toPath","target","dest","destination","new_path","newPath"]);if(!a)throw new Error('move_file \u7F3A\u5C11 from\uFF08\u6E90\u6587\u4EF6\u8DEF\u5F84\uFF09\u3002\u6B63\u786E\u5199\u6CD5\uFF1A{"from":"src/a.js","to":"src/b.js"}');if(!l)throw new Error('move_file \u7F3A\u5C11 to\uFF08\u76EE\u6807\u8DEF\u5F84\uFF09\u3002\u6B63\u786E\u5199\u6CD5\uFF1A{"from":"src/a.js","to":"src/b.js"}');let c=be(a,n),u=be(l,n);if(!O.existsSync(c))throw new Error("\u6E90\u6587\u4EF6\u4E0D\u5B58\u5728: "+a);if(!O.statSync(c).isFile())throw new Error("\u4E0D\u662F\u6587\u4EF6\uFF08\u79FB\u52A8\u76EE\u5F55\u8BF7\u7528 run_command\uFF09: "+a);if(O.existsSync(u))throw new Error("\u76EE\u6807\u5DF2\u5B58\u5728\uFF08\u4E0D\u8986\u76D6\uFF0C\u8BF7\u5148\u5220\u9664\u6216\u6362\u4E2A\u540D\u5B57\uFF09: "+l);let d=Yn(c);O.mkdirSync(P.dirname(u),{recursive:!0}),O.renameSync(c,u);let f=Zt(c,d,"",!1),p=Zt(u,"",d,!0);return w("move_file",{from:St(c),to:St(u)}),"moved "+St(c)+" \u2192 "+St(u)+Tn(f)+Tn(p)}if(t==="read_lints"){let a=e.path?be(mo(e,"read_lints"),n):null,l=e.maxDiags,c=ph(a);return w("read_lints",{path:a?St(a):"(workspace)",files:Object.keys(c).length}),an.formatLints(c,{maxDiags:l})}if(t==="run_command"){let a=String(e.command||""),l=On.pathGuard(a);if(l)return w("run_command_skipdir_blocked",{command:a.slice(0,200),seg:l.seg}),Cp(l);if(rn(r.mode,Qr())){let d=On.check(a);if(!d.ok)return w(r.mode==="explore"?"subagent_cmd_blocked":"plan_cmd_blocked",{command:a.slice(0,200),reason:d.reason}),(r.mode==="explore"?"\u5B50\u4EE3\u7406\u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4\uFF0C\u5DF2\u62D2\u7EDD\uFF1A":"Plan \u6A21\u5F0F\u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4\uFF0C\u5DF2\u62D2\u7EDD\uFF1A")+d.reason+`
|
|
776
|
+
\u6539\u7528 read_file / search_code / list_files \u4E5F\u80FD\u62FF\u5230\u540C\u6837\u7684\u4FE1\u606F\uFF1B\u786E\u5B9E\u9700\u8981\u8FD9\u6761\u547D\u4EE4\u8BF7\u8BA9\u7528\u6237\u5207\u5230 Agent \u6A21\u5F0F\u3002`}let c=await uh(a,n,e.timeout_ms,i?i.runMaxChars:0),u="exit="+c.code+`
|
|
777
|
+
`+c.out;if(c.truncated&&r.spillStore&&typeof r.spillStore.put=="function")try{let d=ut.newId();r.spillStore.put(d,"exit="+c.code+`
|
|
778
|
+
`+c.full,{kind:"tool",name:"run_command",label:a.slice(0,60)}),u+=`
|
|
779
|
+
[\u8F93\u51FA\u5DF2\u622A\u65AD\uFF0C\u5B8C\u6574\u8F93\u51FA id=`+d+"\uFF0C\u9700\u8981\u65F6\u7528 read_spill]"}catch{}return u}if(t==="run_command_start"){let a=String(e.command||""),l=On.pathGuard(a);if(l)return w("run_command_skipdir_blocked",{command:a.slice(0,200),seg:l.seg,async:!0}),Cp(l);if(rn(r.mode,Qr())){let d=On.check(a);if(!d.ok)return w(r.mode==="explore"?"subagent_cmd_blocked":"plan_cmd_blocked",{command:a.slice(0,200),reason:d.reason,async:!0}),(r.mode==="explore"?"\u5B50\u4EE3\u7406\u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4\uFF0C\u5DF2\u62D2\u7EDD\uFF1A":"Plan \u6A21\u5F0F\u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4\uFF0C\u5DF2\u62D2\u7EDD\uFF1A")+d.reason+`
|
|
780
|
+
\u6539\u7528 read_file / search_code / list_files \u4E5F\u80FD\u62FF\u5230\u540C\u6837\u7684\u4FE1\u606F\uFF1B\u786E\u5B9E\u9700\u8981\u8FD9\u6761\u547D\u4EE4\u8BF7\u8BA9\u7528\u6237\u5207\u5230 Agent \u6A21\u5F0F\u3002`}let c=String(r.sessionId||""),u=$.start(c,a,{cwd:n,timeout_ms:e.timeout_ms});return u.ok&&w("async_cmd_start",{job_id:u.job_id,sessionId:c,timeout_ms:u.timeout_ms}),$.formatStartResult(u)}if(t==="run_command_poll"){let a=String(r.sessionId||""),l=String(e.job_id||e.jobId||e.id||"").trim();if(!l)throw new Error("run_command_poll \u9700\u8981 job_id");let c=await $.poll(a,l,{wait_ms:e.wait_ms,tail_chars:e.tail_chars});return $.formatPollResult(c)}if(t==="run_command_stop"){let a=String(r.sessionId||""),l=String(e.job_id||e.jobId||e.id||"").trim();if(!l)throw new Error("run_command_stop \u9700\u8981 job_id");let c=$.stop(a,l);return w("async_cmd_stop",{job_id:l,sessionId:a,status:c.status}),$.formatStopResult(c)}if(t==="read_spill"){let a=r.spillStore,l=String(e.id||e.spill_id||e.spillId||"").trim();if(!l)throw new Error("read_spill \u9700\u8981 id\uFF08\u5360\u4F4D\u91CC\u7684 sp_\u2026\uFF09");if(!a||typeof a.read!="function")return"\u5F53\u524D\u6CA1\u6709\u53EF\u7528\u7684 spill \u5B58\u50A8\uFF08\u672C\u8F6E\u5C1A\u672A\u53D1\u751F\u538B\u7F29/\u88C1\u526A\uFF0C\u6216\u4F1A\u8BDD spill \u672A\u5C31\u7EEA\uFF09\u3002";let c=a.read(l);if(!c.ok)return c.error;let u=c.meta||{};return"spill id="+c.id+"\uFF0C\u539F "+c.chars+" \u5B57\u7B26"+(u.name?"\uFF0C\u6765\u6E90 "+u.name+(u.label?" "+u.label:""):u.kind?"\uFF0C\u6765\u6E90 "+u.kind:"")+(c.truncated?"\uFF08\u5DF2\u622A\u65AD\uFF09":"")+`
|
|
781
|
+
|
|
782
|
+
`+c.content}if(t==="web_search"){let a=await xl(e.query||e.q||"",s,{count:e.count,needContent:!!e.need_content});return Sl(a.results,a.query)}if(t==="web_fetch"){let a=await Yp(e.url,s,{});return"# "+(a.title||"(\u65E0\u6807\u9898)")+`
|
|
783
|
+
`+a.url+`
|
|
784
|
+
|
|
785
|
+
`+a.content}if(t==="todo_write"){if(r.mode==="plan")throw new Error("Plan \u6A21\u5F0F\u4E0D\u80FD\u7528 todo_write\uFF08\u8BA1\u5212\u9636\u6BB5\u53EA\u4EA7\u51FA\u6B65\u9AA4\uFF0C\u6267\u884C\u65F6\u518D\u8DDF\u8E2A\uFF09");if(r.mode==="explore")throw new Error("\u5B50\u4EE3\u7406\u4E0D\u80FD\u7528 todo_write\uFF08\u53EA\u4EA4\u7ED3\u8BBA\uFF0C\u4E0D\u6392\u8BA1\u5212\uFF09");let a=r.todosState;if(!a||typeof a!="object")throw new Error("todo_write \u4E0D\u53EF\u7528\uFF1A\u672C\u8F6E\u672A\u542F\u7528\u4EFB\u52A1\u6E05\u5355");let l=e.merge!==!1&&e.merge!=="false",c=Qe.merge(a.items,e.todos,{merge:l});if(a.items=c,typeof r.onTodos=="function")try{r.onTodos(c)}catch{}return Qe.formatBlock(c)}if(t==="ask_question"){if(r.mode==="explore")throw new Error("\u5B50\u4EE3\u7406\u4E0D\u80FD\u5411\u7528\u6237\u63D0\u95EE\uFF08\u53EA\u8BFB\u8C03\u7814\uFF0C\u8BF7\u81EA\u5DF1\u67E5\u5B8C\u518D\u4EA4\u7ED3\u8BBA\uFF09");if(typeof r.askWait!="function")throw new Error("ask_question \u4E0D\u53EF\u7528\uFF1A\u672C\u8F6E\u672A\u63A5\u5165\u7528\u6237\u7B54\u9898\u901A\u9053");let a=Qt.normalize(e);return await r.askWait(a)}if(t==="explore"){if(r.inSubagent)throw new Error("\u5B50\u4EE3\u7406\u4E0D\u80FD\u518D\u6D3E\u5B50\u4EE3\u7406");if(al()<=0)throw new Error("\u5B50\u4EE3\u7406\u5DF2\u5173\u95ED\uFF08luban.agent.subagentRounds=0\uFF09\uFF0C\u8BF7\u81EA\u5DF1\u7528 search_code / read_file \u67E5");let a=r.subBudget;if(a&&a.left<=0)throw new Error("\u672C\u8F6E\u5B50\u4EE3\u7406\u6B21\u6570\u5DF2\u7528\u5B8C\uFF08\u4E0A\u9650 "+a.max+"\uFF09\uFF0C\u8BF7\u81EA\u5DF1\u7528 search_code / read_file \u67E5");let l=String(e.description==null?"":e.description).trim().slice(0,80)||"\u8C03\u7814",c=go(e,"prompt","explore");if(!String(c||"").trim())throw new Error("explore \u7F3A\u5C11 prompt\uFF1A\u8BF7\u5199\u6E05\u8981\u67E5\u4EC0\u4E48");a&&a.left--;let u=Ah(Fl().maxMinutes),d=await ln(c,{root:n,modelKey:r.modelKey,mode:"explore",history:[],token:r.token,sessionId:r.sessionId,maxIters:al(),maxMinutes:u,onProgress:function(m){if(typeof r.onSubProgress=="function")try{r.onSubProgress({description:l,line:String(m??"")})}catch{}}});if(typeof r.onSubUsage=="function")try{r.onSubUsage(Array.isArray(d.usageRows)?d.usageRows:[])}catch{}let f=d.stop&&d.stop.reason!=="final"?"\uFF0C\u63D0\u524D\u7ED3\u675F\uFF1A"+ui(d.stop):"",p="\u5B50\u4EE3\u7406\u300C"+l+"\u300D\u5B8C\u6210\uFF08"+d.iters+" \u8F6E / "+d.log.length+" \u6B21\u5DE5\u5177\u8C03\u7528"+f+"\uFF09",h=Jn(d.text,d.log);return w("agent_subagent",{description:l,iters:d.iters,toolCalls:d.log.length,minutes:u,stop:d.stop&&d.stop.reason,usage:d.usage,caveat:!!h}),p+`
|
|
786
|
+
|
|
787
|
+
`+h+Xr(d.text)}if(t==="read_skill")return Je.read(e.name,e.file);if(xe.hasTool(t)){if(r.mode==="plan"&&!xe.planAllowed(t))throw w("plan_mcp_blocked",{tool:t}),new Error("Plan \u6A21\u5F0F\u4E0D\u653E\u884C MCP \u5DE5\u5177 "+t+"\uFF08server \u672A\u58F0\u660E readOnlyHint\uFF0C\u4E5F\u6CA1\u5728 mcp.json \u7684 planAllow \u91CC\u5217\u51FA\uFF09");return await xe.callTool(t,e)}throw new Error("\u672A\u77E5\u5DE5\u5177: "+t)}function Mn(t,e,n){let s=t==="plan",o=t==="explore",r=s?Th:o?Nl:An,i=Ct(e&&e.provider)!=="none",a=al(),l=r.filter(function(u){let d=u.function.name;return d==="web_search"||d==="web_fetch"?i:d==="explore"?a>0:d==="browser"?El():d==="computer"?Pl()&&!s:!0});l.push(uk);let c=o?[]:xe.toolDefs({planOnly:s});for(let u of c)l.push(u);return n&&n.compact&&(l=lt.compactTools(l,n.tier)),l}var J=new Map,fh=new Set,bp=0,_s=null,qt=null,Lo=null,zr=null,Gr=0;function Mk(){Gr++}function Ck(){Gr=Math.max(0,Gr-1)}function Tn(t){return t?" | \u5F85\u5BA1\u9605 "+t+" \u5757\uFF08\u7528\u6237\u53EF\u9010\u5757\u64A4\u9500\uFF09":""}function Yn(t){let e=y.workspace.textDocuments.find(function(n){return _l(n,t)});if(e&&!e.isClosed)return e.getText();try{return O.readFileSync(t,"utf8")}catch{return""}}function St(t){let e=t;try{e=P.relative(j(),t)}catch{}return e&&!e.startsWith("..")?e:t}function en(){let t=0;for(let e of J.values())t+=e.hunks.length;return t}function ph(t){let e={},n;try{n=y.languages.getDiagnostics()}catch{return e}if(!Array.isArray(n))return e;for(let s of n){if(!Array.isArray(s)||s.length<2)continue;let o=s[0],r=s[1];if(!o||typeof o.fsPath!="string"||!Array.isArray(r)||!r.length)continue;let i=o.fsPath;if(t&&i!==t)continue;let a=r.map(function(l){if(!l||typeof l!="object")return null;let c=l.range||{},u=c.start||{},d=c.end||u;return{severity:typeof l.severity=="number"?l.severity:0,message:l.message==null?"":String(l.message),range:{start:{line:u.line||0,character:u.character||0},end:{line:d.line||0,character:d.character||0}},source:l.source?String(l.source):"",code:l.code!=null?l.code:""}}).filter(Boolean);a.length&&(e[i]=a)}return e}function hh(){let t=!0;try{t=y.workspace.getConfiguration("luban").get("diagnostics.afterEdit")}catch{}return t!==!1}async function mh(t){let e=(t||[]).filter(Boolean),n=function(){let o={};for(let r of e){let i=ph(r);for(let a of Object.keys(i))o[a]=i[a]}return o},s=n();for(let o=0;o<2&&!Object.keys(s).length;o++)await new Promise(function(r){setTimeout(r,150)}),s=n();return s}var gh=`
|
|
788
|
+
\uFF08\u8BED\u8A00\u670D\u52A1\u5668\u8BCA\u65AD\uFF0C\u53EF\u80FD\u7565\u6EDE\u540E\u4E8E\u672C\u6B21\u5199\u5165\uFF09`,sl=`
|
|
789
|
+
\uFF08\u672A\u8BFB\u5230\u8BED\u8A00\u670D\u52A1\u5668\u8BCA\u65AD\uFF1A\u8BE5\u6587\u4EF6\u53EF\u80FD\u8FD8\u6CA1\u88AB\u5206\u6790\uFF08\u521A\u65B0\u5EFA / \u672A\u5728\u7F16\u8F91\u5668\u6253\u5F00\uFF09\uFF0C\u9700\u8981\u786E\u8BA4\u8BED\u6CD5/\u7C7B\u578B\u65F6\u7528 read_lints \u590D\u67E5\uFF09`;function Za(t){try{return(y.workspace.textDocuments||[]).some(function(n){return n&&n.uri&&n.uri.scheme==="file"&&n.uri.fsPath===t})}catch{return!1}}async function wp(t,e){if(!hh())return"";try{let n=await mh([t]),s=an.summarize(n);return!s.total||!s.error&&!s.warning?e?sl:"":gh+`
|
|
790
|
+
`+an.formatLints(n,{maxDiags:10})}catch{return e?sl:""}}async function Ak(t){for(let e=t.length-1;e>=0;e--){let n=t[e];try{n.kind==="add"?await y.workspace.fs.delete(y.Uri.file(n.abs),{useTrash:!0}):await Pn(n.abs,n.before||"")}catch(s){w("apply_patch_rollback_failed",{path:St(n.abs),error:s.message})}}}function Zt(t,e,n,s){let o=String(n??"");if(Gr>0){let i=J.get(t);return i&&(i.baseline=o,i.hunks=[],Jr(t)),0}let r=J.get(t);return r||(r={abs:t,relPath:St(t),baseline:s?"":String(e??""),isNew:!!s,hunks:[],stats:{add:0,del:0,hunks:0}},J.set(t,r)),r.hunks=ct.computeHunks(r.baseline,o),r.stats=ct.stats(r.hunks),r.hunks.length?(In(),Ok(t),r.hunks.length):(J.delete(t),In(),r.hunks.length)}function Jr(t){J.delete(t)&&Ek(t),In()}async function Ek(t){try{for(let e of y.window.tabGroups.all)for(let n of e.tabs){let s=n.input;if(!s||!s.modified||!s.original)continue;let o=s.modified,r=s.original;(o.scheme==="file"&&o.fsPath===t||o.scheme==="luban-after"&&o.path===t||r.scheme==="luban-before"&&r.path===t)&&await y.window.tabGroups.close(n,!0)}}catch{}}async function Ok(t){if(!(!Uh()||!J.has(t)))try{await jl(t,{preview:!0,preserveFocus:!0})}catch(e){w("review_auto_diff_failed",{path:St(t),error:e.message})}}function ol(){let t=[];for(let e of J.values()){let n=e.hunks.map(function(s){let o=s.lines.length>240;return{id:s.id,header:s.header,add:s.add,del:s.del,lines:(o?s.lines.slice(0,240):s.lines).map(function(r){return{t:r.t,s:r.s}}),truncated:o}});t.push({path:e.relPath,isNew:e.isNew,add:e.stats.add,del:e.stats.del,hunks:n})}return t}function Io(){return{type:"review",files:ol(),at:Date.now()}}async function Pk(t){try{await Pn(t,"")}catch{}try{for(let e of y.window.tabGroups.all)for(let n of e.tabs){let s=n.input;if(!s)continue;let o=s.uri,r=s.modified;(o&&o.scheme==="file"&&o.fsPath===t||r&&r.scheme==="file"&&r.fsPath===t)&&await y.window.tabGroups.close(n,!0)}}catch{}try{await y.workspace.fs.delete(y.Uri.file(t),{useTrash:!0})}catch{}}async function kp(t,e,n){if(e.isNew&&n==="")return await Pk(t),J.delete(t),In(),{ok:!0,deleted:!0,hunks:0};await Pn(t,n);let s=ct.computeHunks(e.baseline,n);return e.hunks=s,e.stats=ct.stats(s),s.length?In():Jr(t),{ok:!0,hunks:s.length}}async function jl(t,e){let n=J.get(t);if(!n)throw new Error(M("ext.noPending",{path:St(t)}));let s=e||{};fh.add(t);let o=y.Uri.from({scheme:"luban-before",path:t}),r=O.existsSync(t)?y.Uri.file(t):y.Uri.from({scheme:"luban-after",path:t}),i=M("ext.diffTitle",{file:P.basename(t),add:n.stats.add,del:n.stats.del});Zn(),await y.commands.executeCommand("vscode.diff",o,r,i,{preview:s.preview===!0,preserveFocus:s.preserveFocus===!0}),Zn()}async function Do(t,e,n){let s=j();if(t==="accept_all"||t==="reject_all"){let l=t==="accept_all"?"accept_file":"reject_file",c=J.size;for(let u of Array.from(J.keys()))await Do(l,u,"");return{ok:!0,files:c,hunks:0}}let o=be(e,s,!0);if(t==="open_diff")return await jl(o),{ok:!0};let r=J.get(o);if(!r)return{ok:!1,error:M("ext.noPending",{path:e})};let i=Yn(o);if(t==="accept_file")return r.baseline=i,r.hunks=[],Jr(o),{ok:!0,hunks:0,files:J.size};if(t==="reject_file")return await kp(o,r,r.baseline);r.hunks=ct.computeHunks(r.baseline,i);let a=r.hunks.find(function(l){return l.id===n});return a?t==="accept_hunk"?(r.baseline=ct.applyHunkToBaseline(r.baseline,a),r.hunks=ct.computeHunks(r.baseline,i),r.stats=ct.stats(r.hunks),r.hunks.length?In():Jr(o),{ok:!0,hunks:r.hunks.length}):t==="reject_hunk"?await kp(o,r,ct.revertHunkText(i,a)):{ok:!1,error:M("ext.unknownAction",{action:t})}:(r.stats=ct.stats(r.hunks),In(),{ok:!1,error:M("ext.hunkGone",{hunk:n})})}function yh(){Lo||(Lo=y.window.createTextEditorDecorationType({isWholeLine:!0,backgroundColor:new y.ThemeColor("diffEditor.insertedLineBackground"),overviewRulerColor:new y.ThemeColor("editorOverviewRuler.addedForeground"),overviewRulerLane:y.OverviewRulerLane.Left}),zr=y.window.createTextEditorDecorationType({backgroundColor:new y.ThemeColor("diffEditor.removedLineBackground"),fontStyle:"italic",overviewRulerColor:new y.ThemeColor("editorOverviewRuler.deletedForeground"),overviewRulerLane:y.OverviewRulerLane.Left}))}function bh(t,e){let n=[],s=[],o=[],r=Math.max(0,t.lineCount-1);for(let i of e.hunks){let a=ct.hunkRanges(i);for(let l of a.add){let c=Math.max(0,Math.min(l.start,r)),u=Math.max(c,Math.min(l.start+l.count-1,r));n.push({range:new y.Range(c,0,u,t.lineAt(u).text.length)}),o.push({kind:"add",from:c+1,to:u+1,lines:l.count})}for(let l of a.del){let c=l.at>0?Math.min(l.at-1,r):0,u=l.at>0?t.lineAt(c).range.end:new y.Position(0,0),d=l.lines.slice(0,3).join(" | ");s.push({range:new y.Range(u,u),renderOptions:{after:{contentText:M("ext.removedGhost",{n:l.lines.length,text:d.slice(0,100)})}}}),o.push({kind:"del",atLine:c+1,lines:l.lines.length,text:l.lines.slice(0,3).join(" | ").slice(0,100)})}}return{added:n,removed:s,spans:o}}function Ll(){yh();for(let t of y.window.visibleTextEditors){let e=t.document,n=e.uri.scheme==="file"?J.get(e.uri.fsPath):null;if(!n){t.setDecorations(Lo,[]),t.setDecorations(zr,[]);continue}let s=bh(e,n);t.setDecorations(Lo,s.added),t.setDecorations(zr,s.removed)}}function jk(t){if(!qt)return[];let e=J.get(t.uri.fsPath);if(!e||!e.hunks.length)return[];let n=Math.max(0,t.lineCount-1),s=[];for(let r of e.hunks){let i=Math.max(0,Math.min(r.newStart,n)),a=new y.Range(i,0,i,0);s.push(new y.CodeLens(a,{title:M("ext.keepHunk",{add:r.add,del:r.del}),command:"luban.acceptHunk",arguments:[{path:e.abs,hunk:r.id}]})),s.push(new y.CodeLens(a,{title:M("ext.revertHunk"),command:"luban.rejectHunk",arguments:[{path:e.abs,hunk:r.id}]}))}if(ci(li())===t.uri.fsPath)return s;let o=new y.Range(0,0,0,0);return s.push(new y.CodeLens(o,{title:M("ext.viewDiff"),command:"luban.openDiff",arguments:[{path:e.abs}]})),s.push(new y.CodeLens(o,{title:M("ext.keepFile",{add:e.stats.add,del:e.stats.del}),command:"luban.acceptFile",arguments:[{path:e.abs}]})),s.push(new y.CodeLens(o,{title:M("ext.revertFile"),command:"luban.rejectFile",arguments:[{path:e.abs}]})),s}function Lk(t){if(!qt)return[];let e=J.get(t.uri.path);if(!e||!e.hunks.length)return[];let n=Math.max(0,t.lineCount-1),s=[];for(let o of e.hunks){let r=Math.max(0,Math.min(o.oldStart,n)),i=new y.Range(r,0,r,0);s.push(new y.CodeLens(i,{title:M("ext.keepHunk",{add:o.add,del:o.del}),command:"luban.acceptHunk",arguments:[{path:e.abs,hunk:o.id}]})),s.push(new y.CodeLens(i,{title:M("ext.revertHunk"),command:"luban.rejectHunk",arguments:[{path:e.abs,hunk:o.id}]}))}return s}function li(){try{return y.window.tabGroups.activeTabGroup.activeTab}catch{return null}}function ci(t){let e=t&&t.input;if(!e)return"";let n=e.modified,s=e.original;if(n&&s){if(n.scheme==="file"&&J.has(n.fsPath))return n.fsPath;if(s.scheme==="luban-before"&&J.has(s.path))return s.path}return""}function Ik(t){let e=ci(t);if(e)return e;let n=t&&t.input;return n&&n.uri&&n.uri.scheme==="file"&&J.has(n.uri.fsPath)?n.uri.fsPath:""}function Zn(){let t=!1;try{t=!!ci(li())}catch{t=!1}let e=function(n,s){try{Promise.resolve(y.commands.executeCommand("setContext",n,s)).catch(function(){})}catch{}};e("luban.pendingReview",en()),e("luban.reviewDiffActive",t)}function In(){bp++;try{if(_s){let t=new Set(Array.from(J.keys()).concat(Array.from(fh)));for(let e of t)_s.fire(y.Uri.from({scheme:"luban-before",path:e}))}}catch{}try{qt&&qt.fire()}catch{}try{Ll()}catch{}try{Zn()}catch{}try{typeof _e=="function"?_e(Io()):Ie&&Ie.postMessage(Io())}catch{}w("review_state",{files:J.size,hunks:en(),seq:bp})}function Dk(t){yh(),_s=new y.EventEmitter,qt=new y.EventEmitter,t.subscriptions.push(Lo,zr,_s,qt),t.subscriptions.push(y.workspace.registerTextDocumentContentProvider("luban-before",{onDidChange:_s.event,provideTextDocumentContent:function(o){let r=J.get(o.path);return r?r.baseline:""}})),t.subscriptions.push(y.workspace.registerTextDocumentContentProvider("luban-after",{onDidChange:_s.event,provideTextDocumentContent:function(o){try{return O.existsSync(o.path)?Yn(o.path):""}catch{return""}}})),t.subscriptions.push(y.languages.registerCodeLensProvider({scheme:"file"},{onDidChangeCodeLenses:qt.event,provideCodeLenses:function(o){try{return jk(o)}catch{return[]}}})),t.subscriptions.push(y.languages.registerCodeLensProvider({scheme:"luban-before"},{onDidChangeCodeLenses:qt.event,provideCodeLenses:function(o){try{return Lk(o)}catch{return[]}}}));function e(o,r){if(o&&typeof o.fsPath=="string"){let l=o.scheme==="file"?o.fsPath:String(o.path||"");if(l&&J.has(l))return{path:l,hunk:r||""}}else if(o&&o.path)return o;let i=Ik(li());if(i)return{path:i,hunk:r||""};let a=y.window.activeTextEditor;return a&&a.document.uri.scheme==="file"?{path:a.document.uri.fsPath,hunk:r||""}:null}function n(o,r){return async function(i){let a=e(i,r?i&&i.hunk:"");if(!a)return{ok:!1,error:M("ext.noReviewFile")};let l;try{l=await Do(o,a.path,r?a.hunk:"")}catch(c){l={ok:!1,error:c.message}}return w("review_action",{action:o,path:St(s(a.path)),hunk:a.hunk||"",ok:!!l.ok,error:l.error}),l.ok||y.window.showWarningMessage(M("ext.reviewWarn",{msg:l.error||M("ext.actionFailed")})),l}}function s(o){try{return be(o,j(),!0)}catch{return o}}t.subscriptions.push(y.commands.registerCommand("luban.openDiff",n("open_diff",!1)),y.commands.registerCommand("luban.acceptHunk",n("accept_hunk",!0)),y.commands.registerCommand("luban.rejectHunk",n("reject_hunk",!0)),y.commands.registerCommand("luban.acceptFile",n("accept_file",!1)),y.commands.registerCommand("luban.rejectFile",n("reject_file",!1)),y.commands.registerCommand("luban.reviewAll",n("accept_all",!1)),y.commands.registerCommand("luban.revertAll",n("reject_all",!1)),y.commands.registerCommand("luban.diffAccept",n("accept_file",!1)),y.commands.registerCommand("luban.diffReject",n("reject_file",!1)),y.window.onDidChangeVisibleTextEditors(function(){try{Ll()}catch{}}),y.window.tabGroups.onDidChangeTabs(function(){try{Zn()}catch{}}),y.window.tabGroups.onDidChangeTabGroups(function(){try{Zn()}catch{}}),y.window.onDidChangeActiveTextEditor(function(){try{Zn()}catch{}}),y.workspace.onDidChangeTextDocument(function(o){let r=o.document.uri.scheme==="file"?o.document.uri.fsPath:"",i=J.get(r);if(!i)return;let a=ct.computeHunks(i.baseline,o.document.getText()),l=function(c){return c.map(function(u){return u.header+u.add+":"+u.del}).join("|")};l(a)!==l(i.hunks)&&(i.hunks=a,i.stats=ct.stats(a),a.length||J.delete(r),In())})),Zn()}function wh(t,e){if(Array.isArray(t)){let n="",s=0;for(let r of t)!r||typeof r!="object"||(r.type==="text"?n+=String(r.text==null?"":r.text):r.type==="image_url"&&s++);return(s?"[\u56FE\u7247 \xD7"+s+"] ":"")+n.slice(0,e)}return String(t??"").slice(0,e)}var kh={model:1,messages:1,stream:1,tools:1,tool_choice:1,max_tokens:1,stream_options:1},xp=2e3,Sp=Object.create(null);function un(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function Nk(t,e){let n=[],s=function(o,r,i){for(let a of Object.keys(r)){if(a==="__proto__"||a==="constructor"||a==="prototype"||i===0&&kh[a])continue;let l=r[a];un(l)&&un(o[a])?s(o[a],l,i+1):o[a]=l,i===0&&n.push(a)}};return s(t,e,0),n}function xh(t,e){let n=t&&t.thinking;if(!un(n))return null;let s=function(r){return un(n[r])},o=e==="on"||e==="off"?e:String(n.default||"");return o!=="on"&&o!=="off"&&(o=s("off")?"off":s("on")?"on":""),!o||!s(o)?null:{mode:o,tier:n[o]}}function Fk(t){let e=t&&t.thinking;if(!un(e))return null;let n=["on","off"].filter(function(o){return un(e[o])});if(!n.length)return null;let s=xh(t,"");return{default:s?s.mode:n[0],tiers:n}}async function No(t,e,n){let s=n||{},o=Ae(e);if(!o)throw new Error("\u6CA1\u6709\u53EF\u7528\u6A21\u578B\u914D\u7F6E");let r=Os(o.provider);if(!r)throw new Error("provider "+o.provider.id+" \u7F3A\u5C11 API key\uFF08apiKey \u6216 apiKeyEnv="+o.provider.apiKeyEnv+"\uFF09");let i={model:o.model.id,messages:t,temperature:.2,stream:!0};s.tools&&s.tools.length&&(i.tools=s.tools,i.tool_choice="auto");let a=Number(s.maxTokens)>0?Number(s.maxTokens):Number(o.model.maxOutputTokens);isFinite(a)&&a>0&&(i.max_tokens=Math.floor(a)),!el[o.provider.id]&&o.provider.streamUsage!==!1&&(i.stream_options={include_usage:!0});let c=xh(o.model,s.thinking),u=o.provider.id+"::"+o.model.id+"::",d="",f=null;if(c&&!Sp[u+c.mode]){let z=Nk(i,c.tier);d=c.mode,f=function(){for(let ve of z)delete i[ve]}}let p=t&&t[0]&&t[0].role==="system"?t[0].content:"",h=on.hash(p,i.tools||[]);s.snapshot!==!1&&(Re={at:new Date().toISOString(),model:o.model.id,prefixHash:h,thinking:d||"none",verbosity:s.verbosity||"none",roles:(t||[]).map(function(z){return z&&z.role}),heads:(t||[]).map(function(z){return wh(z&&z.content,120)})});let m=new AbortController,x=ri(s.signal);x.signal&&(x.isCancelled()?m.abort():x.signal.addEventListener("abort",()=>m.abort()));let b=Math.max(0,Number(s.timeoutMs)||0),k=null,S=!1;b>0&&(k=setTimeout(function(){S=!0,m.abort()},b));let T=Kp(o.provider),g={"Content-Type":"application/json",Authorization:"Bearer "+r},_=[];i.stream_options&&_.push({field:"stream_options",undo:function(){delete i.stream_options}}),f&&_.push({field:"thinking",undo:f}),i.max_tokens&&_.push({field:"max_tokens",undo:function(){delete i.max_tokens}});let v;try{v=await fetch(T,{method:"POST",headers:g,body:JSON.stringify(i),signal:m.signal});for(let z of _){if(v.ok||v.status!==400)break;let ve=await v.text();z.field==="stream_options"?(el[o.provider.id]=!0,w("stream_usage_unsupported",{provider:o.provider.id,status:v.status,body:ve.slice(0,200)})):z.field==="thinking"?(Sp[u+d]=!0,w("thinking_unsupported",{provider:o.provider.id,model:o.model.id,mode:d,status:v.status,body:ve.slice(0,200)}),d=""):w("max_tokens_unsupported",{provider:o.provider.id,status:v.status,body:ve.slice(0,200)}),z.undo(),v=await fetch(T,{method:"POST",headers:g,body:JSON.stringify(i),signal:m.signal})}}catch(z){throw k&&(clearTimeout(k),k=null),S?(w("stream_timeout",{provider:o.provider.id,model:o.model.id,timeoutMs:b}),new Error("\u8BF7\u6C42\u8D85\u65F6\uFF08"+Math.round(b/1e3)+"s \u672A\u8FD4\u56DE\uFF09")):z}if(!v.ok){k&&(clearTimeout(k),k=null);let z=await v.text();throw w("http_error",{provider:o.provider.id,model:o.model.id,status:v.status,body:z.slice(0,300)}),new Error(o.provider.id+" HTTP "+v.status+": "+z.slice(0,200))}let A=v.body.getReader(),C=new TextDecoder,L="",B=0,W=null,N="",Y=new Map,I=new Map,U=bw.newParser({onContent:function(z){if(s.onToken)try{s.onToken(z)}catch{}},onReasoning:function(z){if(s.onReasoning)try{s.onReasoning(z)}catch{}},onSplit:function(z){if(s.onSplit)try{s.onSplit(z)}catch{}}});try{for(;;){let z=await A.read();if(z.done)break;L+=C.decode(z.value,{stream:!0});let ve=L.split(`
|
|
791
|
+
`);L=ve.pop()||"";for(let pt of ve){let zo=pt.trim();if(!zo.startsWith("data:"))continue;let Ce=zo.slice(5).trim();if(!Ce||Ce==="[DONE]")continue;let ue;try{ue=JSON.parse(Ce)}catch{continue}ue&&ue.usage&&(W=ue.usage);let We=ue.choices&&ue.choices[0];We&&We.finish_reason&&(N=String(We.finish_reason));let Ee=We&&We.delta;if(!Ee)continue;Ee.content&&(B++,U.pushContent(Ee.content));let ts=Ee.reasoning_content!=null?Ee.reasoning_content:Ee.reasoning!=null?Ee.reasoning:Ee.thinking;if(typeof ts=="string"&&ts&&U.pushReasoning(ts),Ee.tool_calls)for(let ke of Ee.tool_calls){let Gt;typeof ke.index=="number"?Gt=ke.index:ke.id?(I.has(ke.id)||I.set(ke.id,Y.size),Gt=I.get(ke.id)):Gt=Y.size?Math.max.apply(null,Array.from(Y.keys())):0;let Jt=Y.get(Gt);Jt||(Jt={id:"",type:"function",function:{name:"",arguments:""}},Y.set(Gt,Jt)),ke.id&&(Jt.id=ke.id,I.has(ke.id)||I.set(ke.id,Gt)),ke.function&&ke.function.name&&(Jt.function.name=ke.function.name),ke.function&&ke.function.arguments!=null&&(Jt.function.arguments+=typeof ke.function.arguments=="string"?ke.function.arguments:JSON.stringify(ke.function.arguments))}}}}catch(z){throw S?(w("stream_timeout",{provider:o.provider.id,model:o.model.id,timeoutMs:b}),new Error("\u8BF7\u6C42\u8D85\u65F6\uFF08"+Math.round(b/1e3)+"s \u672A\u8FD4\u56DE\uFF09")):z}finally{k&&(clearTimeout(k),k=null)}U.end();let H=U.content,te=U.reasoning,Ht=Array.from(Y.keys()).sort((z,ve)=>z-ve).map(z=>Y.get(z)),dn=o.provider.id+"::"+o.model.id,me=op.get(dn)||{hash:"",tokens:0},Nn=me.hash,De=!!Nn&&Nn===h,zt=De?me.tokens:0,ye=on.stats(W,t,zt);op.set(dn,{hash:h,tokens:ye.promptTokens});let Tt={at:new Date().toISOString(),model:o.model.id,iter:Number(s.iter)||0,prefixHash:h,promptTokens:ye.promptTokens,cachedTokens:ye.cachedTokens,prefixTokens:ye.prefixTokens,prefixSource:ye.prefixSource,hit:ye.hit,coverage:ye.coverage};for(Ts.push(Tt);Ts.length>Wp;)Ts.shift();return s.snapshot!==!1&&Re&&(Re.prefixHash=Tt.prefixHash,Re.promptTokens=Tt.promptTokens,Re.cachedTokens=Tt.cachedTokens,Re.prefixTokens=Tt.prefixTokens,Re.hit=Tt.hit,Re.coverage=Tt.coverage),w("stream_done",{provider:o.provider.id,model:o.model.id,chars:H.length,reasoningChars:te.length,chunks:B,toolCalls:Ht.map(z=>z.function.name),thinking:d||"none",verbosity:s.verbosity||"none",prefixHash:h,promptTokens:ye.promptTokens,cachedTokens:ye.cachedTokens,completionTokens:ye.completionTokens,prefixTokens:ye.prefixTokens,hit:ye.hit,coverage:ye.coverage,finishReason:N,usage:!!W}),W&&ye.cachedTokens===0&&ye.prefixTokens>0&&w("cache_miss_suspect",{prefixHash:h,prevHash:Nn,samePrefix:De,prefixTokens:ye.prefixTokens,promptTokens:ye.promptTokens}),{content:H,reasoning:te,toolCalls:Ht,target:o,usage:W,cache:ye,prefixHash:h,finishReason:N,thinking:d}}function rl(t){let e=t&&t.model?Number(t.model.maxInputTokens):0;return isFinite(e)&&e>0?e:65536}function Il(t,e,n){let s=t&&t.cache||{},o=Number(s.promptTokens)||0,r=Number(s.completionTokens)||0,i=Number(s.cachedTokens)||0,a=String(t&&t.content||""),l=o,c=r,u=!1;return l<=0&&(l=ne.estimateTokens(ne.charsOf(e),n),u=!0),c<=0&&a.length&&(c=ne.estimateTokens(a.length,n),u=!0),{promptTokens:l,completionTokens:c,cachedTokens:i,estimated:u}}function Fo(t,e,n){let s=Array.isArray(t)?t:[],o=isFinite(Number(e))&&Number(e)>0?Number(e):65536,r=0,i=0,a=0,l=!1;for(let d of s)d&&(r+=Number(d.promptTokens)||0,i+=Number(d.completionTokens)||0,a+=Number(d.cachedTokens)||0,d.estimated&&(l=!0));let c=null;for(let d of s)d&&!d.subagent&&(c=d);!c&&s.length&&(c=s[s.length-1]);let u=c?(Number(c.promptTokens)||0)+(Number(c.completionTokens)||0):0;return{requests:s.length,promptTokens:r,completionTokens:i,totalTokens:r+i,cachedTokens:a,hit:r>0?Number(Math.min(1,a/r).toFixed(3)):0,contextTokens:u,window:o,percent:o>0?Number(Math.min(1,u/o).toFixed(3)):0,estimated:l,subagentRequests:s.filter(function(d){return!!(d&&d.subagent)}).length,model:String(n||"")}}var _p=new Set,Rk=8,qk=8e3,Bk=4;function Uk(t,e){return!t||!e||e.estimated||Number(e.cachedTokens)>0||Number(e.requests)<Rk||Number(e.contextTokens)<qk||_p.has(t)||Ts.filter(function(s){return Number(s.cachedTokens)===0&&Number(s.prefixTokens)>0}).length<Bk?null:(_p.add(t),{text:M("ext.prefixHint"),tip:M("ext.prefixHintTip",{n:Number(e.requests)||0})})}var jn=P.join(dt.homedir(),".luban","usage"),_t="7d";function Dl(){let t=!0;try{t=y.workspace.getConfiguration("luban").get("usage.record")}catch{}return t!==!1}function il(t,e){if(!e||!Dl())return null;let n=t||{};try{let s=Ae(n.modelKey),o=he.row({provider:s&&s.provider?s.provider.id:"",model:s&&s.model?s.model.id:String(e.model||""),modelKey:s?s.key:String(n.modelKey||""),mode:n.mode||"agent",source:n.source||"",session:n.session||""},e),r=he.append(jn,o);return r.ok?(w("usage_log",{model:o.modelKey,mode:o.mode,source:o.source,total:o.totalTokens,estimated:o.estimated,partial:o.partial,file:r.month}),xx(),o):(w("usage_log_failed",{message:r.error,model:o.modelKey}),null)}catch(s){return w("usage_log_failed",{message:String(s&&s.message||s)}),null}}function ko(t){let e=he.rangeOf(t||_t),n=he.read(jn,e.from,e.to),s=he.aggregate(n.rows,e);return{type:"usage",range:{key:e.key,label:M("usage."+e.key),from:e.from,to:e.to,days:e.days},ranges:he.RANGES.map(function(o){return{key:o.key,label:M("usage."+o.key)}}),dir:jn,files:n.files,badLines:n.bad,record:Dl(),now:Date.now(),summary:s,rows:n.rows.slice(-50).map(function(o){return{ts:o.ts,at:o.at,day:o.day,model:o.model,provider:o.provider,mode:o.mode,source:o.source,requests:o.requests,promptTokens:o.promptTokens,completionTokens:o.completionTokens,totalTokens:o.totalTokens,cachedTokens:o.cachedTokens,estimated:!!o.estimated,partial:!!o.partial}})}}var Wo="\u4F60\u53EB Luban\uFF08\u9C81\u73ED\uFF09\uFF0C\u662F\u5D4C\u5728 VSCodium \u4FA7\u8FB9\u680F\u91CC\u7684\u7F16\u7801 agent\uFF0C\u5E95\u5C42\u6A21\u578B\u7531\u7528\u6237\u914D\u7F6E\u7684 provider \u51B3\u5B9A\uFF1B\u88AB\u95EE\u5230\u8EAB\u4EFD\u6216\u6A21\u578B\u65F6\u5982\u5B9E\u8BF4\u660E\uFF0C\u4E0D\u8981\u81EA\u79F0\u5176\u5B83\u4EA7\u54C1\u3002",Sh=[Wo,"\u4F60\u53EF\u4EE5\u76F4\u63A5\u8BFB\u5199\u672C\u673A\u6587\u4EF6\uFF0C\u4E5F\u53EF\u4EE5\u6267\u884C shell \u547D\u4EE4\u3002","\u89C4\u5219\uFF1A","1. \u4FEE\u6539\u5DF2\u6709\u6587\u4EF6\u524D\u5148\u7528 read_file \u8BFB\u539F\u6587\uFF0C\u518D\u7528 replace_in_file \u505A\u5C40\u90E8\u66FF\u6362\uFF1B\u5B83\u5BB9\u5FCD\u884C\u5C3E\u4E0E\u7F29\u8FDB\u7684\u7A7A\u767D\u5DEE\u5F02\uFF0C\u4E0D\u5FC5\u4E3A\u4E86\u9010\u5B57\u8282\u4E00\u81F4\u53CD\u590D\u91CD\u8BFB\uFF1B\u65B0\u5EFA\u6216\u6574\u4F53\u91CD\u5199\u624D\u7528 write_file\u3002\u8DE8\u591A\u4E2A\u6587\u4EF6\u7684\u91CD\u6784 / \u6279\u91CF\u6539\u540D / \u4E00\u6B21\u6539\u591A\u5904\uFF0C\u7528 apply_patch\uFF08\u4E00\u6B21\u63D0\u4EA4\u591A\u6587\u4EF6\u589E / \u6539 / \u5220\uFF0C\u5168\u6210\u529F\u624D\u843D\u76D8\uFF0C\u4EFB\u4E00\u6587\u4EF6\u6821\u9A8C\u5931\u8D25\u5219\u6574\u4F53\u4E0D\u5199\uFF09\uFF1B\u5355\u6587\u4EF6\u5220\u9664\u7528 delete_file\uFF0C\u79FB\u52A8 / \u91CD\u547D\u540D\u7528 move_file\u3002\u6539\u5B8C\u4EE3\u7801\u540E\u53EF\u7528 read_lints \u8BFB\u8BED\u8A00\u670D\u52A1\u5668\u62A5\u7684 error / warning\uFF0C\u81EA\u5DF1\u53D1\u73B0\u7C7B\u578B\u9519 / \u8BED\u6CD5\u9519\uFF0C\u800C\u4E0D\u662F\u7B49\u7528\u6237\u8D34\u62A5\u9519\u3002","2. \u8DEF\u5F84\u9ED8\u8BA4\u5199\u76F8\u5BF9\u5DE5\u4F5C\u76EE\u5F55\u7684\u8DEF\u5F84\uFF1B\u5DE5\u4F5C\u533A\u4E4B\u5916\u7684\u6587\u4EF6\u7528\u7EDD\u5BF9\u8DEF\u5F84\uFF08../ \u8D8A\u754C\u4E5F\u53EF\u4EE5\uFF09\uFF0C\u53D7 luban.fs.allowOutsideWorkspace \u63A7\u5236\u3002","3. \u7528 run_command \u9A8C\u8BC1\u81EA\u5DF1\u5199\u7684\u4EE3\u7801\uFF08\u5982 node xxx.js\u3001npx tsc --noEmit\uFF09\uFF0C\u628A\u771F\u5B9E\u8F93\u51FA\u4F5C\u4E3A\u7ED3\u8BBA\u4F9D\u636E\uFF1B\u4E0D\u8981\u9760\u731C\u8BF4\u201C\u5E94\u8BE5\u80FD\u8DD1\u201D\u3002\u9884\u8BA1\u8D85\u8FC7\u4E00\u5206\u949F\u7684\u6784\u5EFA/\u6574\u4ED3\u6D4B\u8BD5\u7528 run_command_start\uFF0C\u518D run_command_poll \u770B\u8FDB\u5EA6\uFF1B\u53D6\u6D88\u7528 run_command_stop\u3002\u77ED\u547D\u4EE4\u4E0D\u8981 start\u3002","4. \u4E00\u6B21\u53EA\u505A\u5FC5\u8981\u7684\u5DE5\u5177\u8C03\u7528\uFF0C\u4E0D\u8981\u53CD\u590D\u8BFB\u540C\u4E00\u4E2A\u6587\u4EF6\u3002","5. \u5B8C\u6210\u540E\u7528\u4E2D\u6587\u7B80\u77ED\u6C47\u62A5\uFF1A\u6539\u4E86\u54EA\u4E9B\u6587\u4EF6\u3001\u505A\u4E86\u4EC0\u4E48\u3001\u9A8C\u8BC1\u7ED3\u679C\u3002\u4E0D\u8981\u5728\u56DE\u590D\u91CC\u91CD\u590D\u8D34\u5B8C\u6574\u4EE3\u7801\u3002","6. \u82E5\u7528\u6237\u6D88\u606F\u672B\u5C3E\u5E26\u300C\u5F15\u7528\u7684\u4E0A\u4E0B\u6587\u300D\uFF08[ref N] \u5757\uFF09\u6216\u300C[\u5F53\u524D\u6587\u4EF6]\u300D\u5757\uFF1A\u5B8C\u6574\u5757\u76F4\u63A5\u4F7F\u7528\u3001\u4E0D\u8981\u518D read_file \u91CD\u590D\u8BFB\u53D6\uFF1B\u82E5\u6807\u6CE8\u300C\u7247\u6BB5 / \u622A\u65AD\u300D\u6216\u63D0\u793A\u5206\u6BB5\u7EED\u8BFB\uFF0C\u7528 read_file \u7684 startLine/maxLines \u7EED\u8BFB\uFF0C\u4E0D\u8981\u6574\u6587\u4EF6\u91CD\u8BFB\u3002\u300C[\u5F53\u524D\u6587\u4EF6]\u300D\u662F\u7528\u6237\u6B64\u523B\u5728\u7F16\u8F91\u5668\u91CC\u770B\u7684\u4EE3\u7801\uFF1A\u6709\u9009\u533A\u65F6\u53EA\u662F\u9009\u533A\uFF0C\u65E0\u9009\u533A\u65F6\u662F\u5149\u6807\u9644\u8FD1\u7684\u4E00\u6BB5\uFF08\u6807\u9898\u91CC\u4F1A\u5199\u6E05\u884C\u53F7\u8303\u56F4\u548C\u603B\u884C\u6570\uFF0C\u53EF\u80FD\u4E0D\u662F\u6574\u4EFD\u6587\u4EF6\uFF09\uFF0C\u9700\u8981\u6587\u4EF6\u5176\u5B83\u90E8\u5206\u65F6\u518D read_file\u3002\u5B83\u53EA\u662F\u80CC\u666F\uFF0C\u4E0D\u7B49\u4E8E\u672C\u6761\u8BF7\u6C42\u7684\u5BF9\u8C61\uFF1A\u7528\u6237\u6CA1\u70B9\u540D\u6587\u4EF6\u65F6\uFF0C\u4EE5\u672C\u4F1A\u8BDD\u4E0A\u6587\uFF08\u7528\u6237\u521A\u8BF4\u7684\u8BDD\u3001\u4E0A\u4E00\u6761\u56DE\u7B54\uFF09\u4E3A\u51C6\uFF0C\u4E0D\u8981\u62FF\u300C[\u5F53\u524D\u6587\u4EF6]\u300D\u5F53\u9ED8\u8BA4\u5BF9\u8C61\u3002",'7. \u9700\u8981\u627E\u4EE3\u7801\u65F6\u6309\u76F2\u533A\u9009\u5DE5\u5177\uFF1A\u6309\u5185\u5BB9\u5173\u952E\u8BCD / \u6807\u8BC6\u7B26\u627E\u7528 search_code\uFF08BM25 \u8BCD\u6CD5\u7D22\u5F15\uFF0C\u6700\u7701 token\uFF09\uFF1B\u6309\u6587\u4EF6\u540D\u627E\u6587\u4EF6\u7528 glob\uFF08\u5982 glob({ patterns: ["**/*config*"] })\uFF09\uFF1B\u8981\u6B63\u5219 / \u7CBE\u786E\u4E32\u5339\u914D\u7528 grep\uFF08\u5982 grep({ pattern: "TODO|FIXME" })\uFF0C\u6B63\u5219\u6309 JS RegExp \u8BED\u6CD5\uFF0C\u53C2\u6570\u662F JSON \u5B57\u7B26\u4E32\u3001\u53CD\u659C\u6760\u8981\u518D\u8F6C\u4E49\u4E00\u5C42\uFF0C\u5982 "foo\\\\(\\\\d+\\\\)"\uFF09\u3002\u5B9A\u4F4D\u5230\u6587\u4EF6\u4E0E\u884C\u53F7\u540E\u518D read_file \u7CBE\u8BFB\uFF0C\u4E0D\u8981\u7528 list_files \u4E00\u5C42\u5C42\u5168\u91CF\u626B\u3002\u5927\u76EE\u5F55\u53EF\u4F20 dir \u9650\u5B9A\u524D\u7F00\uFF08grep / glob \u7684\u7ED3\u679C\u8DEF\u5F84\u4ECD\u4EE5\u5DE5\u4F5C\u76EE\u5F55\u4E3A\u57FA\u51C6\uFF09\u3002',"8. \u7528\u6237\u6D88\u606F\u91CC\u7684\u76EE\u5F55\u5F15\u7528\u82E5\u51FA\u73B0\u300C\u5206\u6279\u5904\u7406\u300D\u6E05\u5355\u6216\u5927\u91CF\u300C\u672A\u6CE8\u5165\u5168\u6587\u300D\uFF1A\u672C\u8F6E\u53EA\u6311\u6700\u76F8\u5173\u7684 1\u20133 \u6279\uFF0C\u6BCF\u6279 search_code({ query, dir }) \u540E\u518D\u5C11\u91CF read_file\uFF1B\u7981\u6B62\u5BF9\u6574\u68F5\u6811\u4E32\u884C read_file\u3002\u6536\u5C3E\u5199\u6E05\u5DF2\u5B8C\u6210 / \u672A\u5904\u7406\u6279\u6B21\uFF0C\u4FBF\u4E8E\u7528\u6237\u4E0B\u4E00\u6761\u7EED\u8DD1\u3002","9. \u7528\u6237\u6D88\u606F\u91CC\u82E5\u5E26\u300C\u5F53\u524D todo\u300D\u6E05\u5355\uFF0C\u6216\u4EFB\u52A1\u53EF\u62C6\u6210\u591A\u6B65\uFF1A\u7528 todo_write \u8DDF\u8E2A\u3002\u540C\u65F6\u53EA\u80FD\u6709\u4E00\u4E2A in_progress\uFF1B\u5B8C\u6210\u4E00\u9879\u518D\u6807\u4E0B\u4E00\u9879\u4E3A in_progress\uFF1B\u5168\u90E8 completed / cancelled \u540E\u518D\u6536\u5C3E\u6C47\u62A5\u3002merge \u9ED8\u8BA4 true\uFF08\u6309 id \u5408\u5E76\uFF09\u3002","10. \u4EFB\u52A1\u51FA\u73B0\u5B9E\u8D28\u5206\u53C9\u3001\u9700\u8981\u4EBA\u62CD\u677F\u65F6\uFF0C\u5148\u7528 ask_question \u7ED9\u51FA\u53EF\u70B9\u9009\u9879\u7B49\u7528\u6237\u9009\u62E9\uFF1B\u4E0D\u8981\u53EA\u628A\u5F00\u653E\u95EE\u9898\u5199\u8FDB\u957F\u6587\u672B\u5C3E\u7B49\u7528\u6237\u6253\u5B57\u3002\u6709\u660E\u663E\u66F4\u7A33\u59A5\u7684\u8DEF\u5F84\u65F6\u7ED9\u5BF9\u5E94 option \u6807 recommended: true\uFF08\u9762\u677F\u663E\u793A\u300C\u63A8\u8350\u300D\uFF0C\u4E0D\u9884\u9009\uFF09\u3002"],Wk="11. \u9700\u8981\u5916\u90E8\u6700\u65B0\u4FE1\u606F\uFF08\u7248\u672C\u53F7\u3001\u5B98\u65B9\u6587\u6863\u3001\u62A5\u9519\u539F\u56E0\uFF09\u65F6\u53EF\u8C03\u7528 web_search / web_fetch \u53EA\u8BFB\u8054\u7F51\uFF1B\u5F15\u7528\u641C\u7D22\u7ED3\u679C\u65F6\u6807\u6CE8 [n]\uFF0C\u4E0D\u8981\u628A\u641C\u7D22\u7ED3\u679C\u5F53\u6210\u6587\u4EF6\u5185\u5BB9\u3002",_h=["12. \u7CFB\u7EDF\u63D0\u793A\u91CC\u5217\u51FA\u4E86\u300C\u53EF\u7528\u6280\u80FD\u300D\u65F6\uFF0C\u771F\u6B63\u8981\u7528\u67D0\u4E2A\u6280\u80FD\u524D\u5148\u8C03\u7528 read_skill \u8BFB\u5B83\u7684 SKILL.md \u5168\u6587\uFF0C\u518D\u6309\u91CC\u9762\u7684\u6B65\u9AA4\u505A\uFF1B\u4E0D\u8981\u51ED\u6280\u80FD\u540D\u731C\u6D41\u7A0B\uFF0C\u4E5F\u4E0D\u8981\u4E00\u6B21\u8BFB\u591A\u4E2A\u7528\u4E0D\u4E0A\u7684\u6280\u80FD\u3002","13. \u540D\u5B57\u4EE5 mcp__ \u5F00\u5934\u7684\u662F\u672C\u673A MCP server \u63D0\u4F9B\u7684\u5916\u90E8\u5DE5\u5177\uFF08mcp__<server>__<tool>\uFF09\uFF0C\u53C2\u6570\u6309\u5404\u81EA schema \u4F20\uFF1B\u5DE5\u4F5C\u533A\u6587\u4EF6\u7684\u8BFB\u5199\u4ECD\u4F18\u5148\u7528\u5185\u7F6E list_files / search_code / read_file / write_file / replace_in_file\u3002MCP \u5DE5\u5177\u600E\u4E48\u7528\u4EE5\u5176 schema \u4E3A\u51C6\uFF0C\u4E0D\u8981\u4E3A\u4E86\u731C\u53C2\u6570\u53BB node_modules / npm \u7F13\u5B58 / .m2 \u91CC\u7FFB server \u7684\u5B9E\u73B0\uFF08\u90A3\u4E9B\u662F\u5B89\u88C5\u7F13\u5B58\uFF0C\u4E0D\u662F\u9879\u76EE\u4EE3\u7801\uFF09\uFF1B\u88AB\u62D2\u7EDD\u6216\u62FF\u4E0D\u51C6\u65F6\u7528 ask_question \u95EE\u7528\u6237\u3002","14. \u5BF9\u8BDD\u5386\u53F2\u91CC\u53EF\u80FD\u5E26\u6709\u66F4\u65E9\u8F6E\u6B21\u7684\u63D0\u95EE\u4E0E\u56DE\u7B54\uFF1A\u8FFD\u95EE\u91CC\u7684\u300C\u5B83 / \u521A\u624D / \u90A3\u4E2A\u6587\u4EF6\u300D\u5148\u7ED3\u5408\u5386\u53F2\u7406\u89E3\u3002\u5386\u53F2\u91CC\u7684\u4EE3\u7801\u6539\u52A8\u53EF\u80FD\u5DF2\u88AB\u64A4\u9500\u6216\u518D\u6B21\u4FEE\u6539\uFF0C\u9700\u8981\u786E\u8BA4\u73B0\u72B6\u65F6\u91CD\u65B0 read_file / run_command\uFF0C\u4E0D\u8981\u628A\u5386\u53F2\u5F53\u6210\u5F53\u524D\u78C1\u76D8\u72B6\u6001\u3002","15. \u5DE5\u5177\u7ED3\u679C\u6216\u66F4\u65E9\u8F6E\u6B21\u82E5\u88AB\u538B\u7F29\u6210\u300C\u5DF2\u7701\u7565\u2026\u5B8C\u6574\u7ED3\u679C id=sp_\u2026\u300D\u6216\u7528\u6237\u6D88\u606F\u91CC\u51FA\u73B0\u300C\u66F4\u65E9\u8F6E\u6B21\u6458\u8981\u300D\uFF1A\u9700\u8981\u539F\u6587\u65F6\u7528 read_spill \u6309 id \u53D6\u56DE\uFF1B\u6458\u8981\u4E0D\u591F\u518D\u8BFB\u6587\u4EF6\u6216\u91CD\u8DD1\u547D\u4EE4\uFF0C\u4E0D\u8981\u81C6\u9020\u88AB\u7701\u7565\u7684\u5185\u5BB9\u3002","16. \u53D1\u5E03 / \u63A8\u9001 / \u90E8\u7F72 / \u5220\u9664\u8FDC\u7AEF\u8D44\u6E90\u8FD9\u7C7B\u5BF9\u5916\u90E8\u6709\u5F71\u54CD\u3001\u4E0D\u6613\u64A4\u9500\u7684\u64CD\u4F5C\uFF1A\u6267\u884C\u524D\u5148\u7528\u4E00\u53E5\u8BDD\u8BF4\u660E\u8981\u64CD\u4F5C\u7684\u5BF9\u8C61\uFF1B\u7528\u6237\u53EA\u8BF4\u300C\u53D1\u5E03\u5230 xx\u300D\u800C\u6CA1\u70B9\u540D\u5185\u5BB9\u65F6\uFF0C\u5148\u7528 ask_question \u786E\u8BA4\u5BF9\u8C61\uFF0C\u4E0D\u8981\u628A\u300C[\u5F53\u524D\u6587\u4EF6]\u300D\u6216\u5386\u53F2\u91CC\u78B0\u5DE7\u76F8\u5173\u7684\u6587\u4EF6\u5F53\u6210\u9ED8\u8BA4\u5BF9\u8C61\u3002"],Or=Sh.concat([Wk],_h).join(`
|
|
792
|
+
`),Kk=Sh.concat(_h).join(`
|
|
793
|
+
`),vh=[Wo,"\u4F60\u53EF\u4EE5\u8BFB\u5199\u672C\u673A\u6587\u4EF6\u3001\u6267\u884C shell \u547D\u4EE4\u3002\u5DE5\u4F5C\u76EE\u5F55\u5728\u4E0B\u65B9\u3002","\u89C4\u5219\uFF1A","1. \u6539\u5DF2\u6709\u6587\u4EF6\u5148\u7528 read_file \u770B\u539F\u6587\uFF0C\u518D\u7528 replace_in_file \u5C40\u90E8\u66FF\u6362\uFF1B\u4E00\u6B21\u6539\u591A\u5904\u7528 apply_patch\uFF1B\u65B0\u5EFA\u6216\u6574\u4F53\u91CD\u5199\u624D\u7528 write_file\u3002","2. \u627E\u4EE3\u7801\uFF1A\u5173\u952E\u8BCD\u7528 search_code\uFF0C\u6587\u4EF6\u540D\u7528 glob\uFF0C\u6B63\u5219\u7528 grep\uFF1B\u62FF\u5230\u884C\u53F7\u518D read_file\uFF0C\u4E0D\u8981\u7528 list_files \u5168\u91CF\u626B\u3002","3. \u5927\u6587\u4EF6\u5FC5\u987B\u5206\u6BB5\u8BFB\uFF1Aread_file \u5E26 startLine / maxLines\uFF08\u4E00\u6B21\u4E0D\u8D85\u8FC7 120 \u884C\uFF09\uFF1B\u770B\u5230\u300C\u8FD8\u6709\u540E\u7EED\u300D\u5C31\u63A5\u7740\u8BFB\u4E0B\u4E00\u6BB5\uFF0C\u4E0D\u8981\u91CD\u8BFB\u5DF2\u8BFB\u90E8\u5206\u3002","4. \u8DEF\u5F84\u5199\u76F8\u5BF9\u5DE5\u4F5C\u76EE\u5F55\uFF1B\u5DE5\u4F5C\u533A\u5916\u7528\u7EDD\u5BF9\u8DEF\u5F84\u3002","5. \u7528 run_command \u9A8C\u8BC1\u81EA\u5DF1\u5199\u7684\u4EE3\u7801\uFF08\u5982 node x.js\u3001npx tsc --noEmit\uFF09\uFF0C\u628A\u771F\u5B9E\u8F93\u51FA\u5F53\u7ED3\u8BBA\u3002","6. \u4E00\u6B65\u4E00\u9A8C\u8BC1\uFF1B\u4EFB\u52A1\u8D85\u8FC7 5 \u6B65\u5148\u7528 todo_write \u8BB0\u6E05\u5355\uFF0C\u5B8C\u6210\u4E00\u9879\u518D\u8FDB\u4E0B\u4E00\u9879\u3002","7. \u5DE5\u5177\u7ED3\u679C\u88AB\u538B\u6210\u300C\u5DF2\u7701\u7565 \u2026 id=sp_\u2026\u300D\u6216\u51FA\u73B0\u300C\u5DF2\u538B\u7F29\u66F4\u65E9\u6B65\u9AA4\u300D\u65F6\uFF1A\u9700\u8981\u539F\u6587\u7528 read_spill\uFF0C\u6216\u91CD\u65B0 read_file / \u91CD\u8DD1\u547D\u4EE4\uFF1B\u4E0D\u8981\u51ED\u8BB0\u5FC6\u7F16\u9020\u88AB\u7701\u7565\u7684\u5185\u5BB9\u3002","8. \u6539\u5B8C\u7528\u4E2D\u6587\u7B80\u77ED\u6C47\u62A5\uFF1A\u6539\u4E86\u54EA\u4E9B\u6587\u4EF6\u3001\u9A8C\u8BC1\u7ED3\u679C\u3002\u4E0D\u8981\u5728\u56DE\u590D\u91CC\u91CD\u590D\u8D34\u4EE3\u7801\u3002"],Hk="9. \u9700\u8981\u6700\u65B0\u5916\u90E8\u4FE1\u606F\u65F6\u53EF\u7528 web_search / web_fetch\uFF0C\u5F15\u7528\u6807 [n]\u3002",Pr=vh.concat([Hk]).join(`
|
|
794
|
+
`),zk=vh.join(`
|
|
795
|
+
`),Th=An.filter(function(t){return["list_files","search_code","read_file","run_command","run_command_start","run_command_poll","run_command_stop","read_spill","web_search","web_fetch","ask_question","grep","glob","read_lints","explore","browser"].indexOf(t.function.name)>=0}),Nl=An.filter(function(t){return["list_files","search_code","read_file","grep","glob","read_lints","read_spill","read_skill","run_command","run_command_start","run_command_poll","run_command_stop","web_search","web_fetch"].indexOf(t.function.name)>=0}),Qn={rounds:24,minutes:8,perTurn:4,minuteRatio:.5,minMinutes:3,maxMinutes:12},Oo=[Wo,"\u4F60\u73B0\u5728\u662F\u4E00\u4E2A\u53EA\u8BFB\u8C03\u7814\u5B50\u4EE3\u7406\uFF0C\u88AB\u4E3B agent \u6D3E\u6765\u67E5\u6E05\u4E00\u4EF6\u4E8B\u3002","\u89C4\u5219\uFF1A","1. \u53EA\u51C6\u8BFB\uFF1Asearch_code / grep / glob / list_files / read_file / read_lints / read_skill\u3002","2. run_command \u53EA\u51C6\u8DD1\u53EA\u8BFB\u547D\u4EE4\uFF08ls\u3001cat\u3001git log\u3001npm ls\uFF09\uFF0C\u5199\u5165\u7C7B\u547D\u4EE4\u4F1A\u88AB\u4EE3\u7801\u5C42\u62D2\u7EDD\uFF0C\u522B\u91CD\u8BD5\u3002","3. \u4E0D\u8981\u8BD5\u56FE\u6539\u6587\u4EF6\u3001\u4E0D\u8981\u63D0\u5F00\u653E\u95EE\u9898\u7B49\u4EBA\u56DE\u7B54 \u2014\u2014 \u4F60\u6CA1\u6709\u8FD9\u4E9B\u5DE5\u5177\u3002","4. \u7ED3\u8BBA\u4F18\u5148\u4E8E\u8FC7\u7A0B\uFF1A\u7528\u4E0D\u8D85\u8FC7 400 \u5B57\u56DE\u7B54\u88AB\u95EE\u7684\u90A3\u51E0\u4EF6\u4E8B\uFF0C\u5199\u6E05\u5173\u952E\u6587\u4EF6\u4E0E\u884C\u53F7\u3002","5. \u4E0D\u8981\u5728\u7ED3\u8BBA\u91CC\u8D34\u5927\u6BB5\u4EE3\u7801\uFF1B\u6CA1\u67E5\u5230\u5C31\u76F4\u8BF4\u6CA1\u67E5\u5230\uFF0C\u4E0D\u8981\u731C\u3002","6. \u300C\u4F1A\u88AB\u62D2\u7EDD / \u4E0D\u652F\u6301 / \u4E0D\u5B58\u5728 / \u884C\u4E3A\u5C31\u662F\u8FD9\u6837\u300D\u8FD9\u7C7B\u7ED3\u8BBA\u5FC5\u987B\u6765\u81EA\u771F\u5B9E\u8C03\u7528\uFF1A\u5148\u7528\u5DE5\u5177\u771F\u7684\u8BD5\u4E00\u6B21\uFF0C\u628A\u8FD4\u56DE\u7684\u539F\u6587\uFF08\u542B\u62A5\u9519\uFF09\u4F5C\u4E3A\u4F9D\u636E\u3002\u7981\u6B62\u628A\u9884\u671F\u5199\u6210\u7ED3\u679C\uFF0C\u7981\u6B62\u7528\u300C\u6309\u89C4\u5219\u6211\u6CA1\u6709\u6267\u884C\u300D\u4EE3\u66FF\u9A8C\u8BC1 \u2014\u2014 \u90A3\u6837\u7B49\u4E8E\u6CA1\u67E5\uFF0C\u7236\u8F6E\u4F1A\u628A\u5B83\u5F53\u6210\u5DF2\u9A8C\u8BC1\u7684\u4E8B\u5B9E\u3002","7. \u4E0D\u8981\u5728\u7ED3\u8BBA\u91CC\u6E05\u70B9\u6216\u7F57\u5217\u81EA\u5DF1\u6709\u54EA\u4E9B\u5DE5\u5177\u3001\u4E00\u5171\u6709\u51E0\u4E2A\uFF1A\u5DE5\u5177\u6E05\u5355\u7531\u8C03\u7528\u65B9\u5B9A\u4E49\uFF0C\u4F60\u6570\u4E0D\u51C6\uFF1B\u88AB\u95EE\u5230\u5C31\u76F4\u63A5\u7167\u6284\u7CFB\u7EDF\u63D0\u793A\u6700\u540E\u90A3\u884C\u300C\u672C\u6B21\u5B9E\u9645\u6388\u4E88\u7684\u53EA\u8BFB\u5DE5\u5177\u300D\uFF0C\u5176\u4F59\u573A\u5408\u53EA\u8BF4\u4E0E\u672C\u4EFB\u52A1\u76F8\u5173\u7684\u5DE5\u5177\u540D\u3002"].join(`
|
|
796
|
+
`);function $r(t){let e=t===!1,n=Nl.map(function(s){return s.function.name}).filter(function(s){return!(e&&(s==="web_search"||s==="web_fetch"))});return n.push("read_skill"),"\u672C\u6B21\u5B9E\u9645\u6388\u4E88\u7684\u53EA\u8BFB\u5DE5\u5177\u5171 "+n.length+" \u4E2A\uFF08\u4EE5\u6B64\u4E3A\u51C6\uFF0C\u4E0D\u8981\u81EA\u5DF1\u6570\uFF09\uFF1A"+n.join(" / ")+"\u3002"}var Mh=[Wo,"\u73B0\u5728\u4F60\u4F5C\u4E3A\u4EE3\u7801\u8C03\u7814\u5458\u5DE5\u4F5C\uFF0C\u5904\u4E8E Plan \u6A21\u5F0F\uFF1A**\u53EA\u51C6\u8BFB\uFF0C\u4E0D\u51C6\u6539**\u3002","\u89C4\u5219\uFF1A","1. \u53EA\u80FD\u7528 list_files / search_code / grep / glob / read_lints / read_file / ask_question / explore\uFF0C\u4EE5\u53CA run_command / run_command_start / poll / stop \u6267\u884C**\u53EA\u8BFB**\u547D\u4EE4\uFF08ls\u3001cat\u3001grep\u3001node --version\u3001npm ls \u7B49\uFF09\u3002\u627E\u4EE3\u7801\u6309\u76F2\u533A\u9009\u5DE5\u5177\uFF1A\u5185\u5BB9\u5173\u952E\u8BCD\u7528 search_code\uFF0C\u6309\u6587\u4EF6\u540D\u7528 glob\uFF0C\u6B63\u5219 / \u7CBE\u786E\u4E32\u7528 grep\uFF0C\u5B9A\u4F4D\u5230\u884C\u53F7\u540E\u518D read_file \u7CBE\u8BFB\uFF1B\u5927\u76EE\u5F55\u53EF\u4F20 dir \u9650\u5B9A\u524D\u7F00\uFF08grep / glob \u8FD4\u56DE\u7684\u8DEF\u5F84\u4ECD\u4EE5\u5DE5\u4F5C\u76EE\u5F55\u4E3A\u57FA\u51C6\uFF09\u3002read_file / list_files \u7684\u8DEF\u5F84\u65E2\u53EF\u4EE5\u662F\u76F8\u5BF9\u5DE5\u4F5C\u76EE\u5F55\uFF0C\u4E5F\u53EF\u4EE5\u662F\u7EDD\u5BF9\u8DEF\u5F84\uFF08\u5DE5\u4F5C\u533A\u5916\u7684\u6587\u4EF6\u9ED8\u8BA4\u4E5F\u5141\u8BB8\u8BFB\uFF09\u3002\u975E\u53EA\u8BFB\u547D\u4EE4\u4F1A\u88AB\u4EE3\u7801\u5C42\u76F4\u63A5\u62D2\u7EDD\u5E76\u7ED9\u51FA\u539F\u56E0\uFF0C\u522B\u53CD\u590D\u91CD\u8BD5\u540C\u4E00\u7C7B\u547D\u4EE4\uFF08\u6362\u4E2A\u5DE5\u5177\u62FF\u4FE1\u606F\uFF0C\u6216\u5199\u8FDB\u8BA1\u5212\u8BA9 Agent \u9636\u6BB5\u6267\u884C\uFF09\u3002\u957F\u53EA\u8BFB\u547D\u4EE4\u53EF\u7528 start+poll\uFF0C\u89C4\u5219\u4E0E\u540C\u6B65\u547D\u4EE4\u76F8\u540C\u3002\u8981\u5728\u4E00\u5927\u7247\u4EE3\u7801\u91CC\u67E5\u6E05\u4E00\u4EF6\u4E8B\uFF08\u591A\u5904\u641C\u7D22\u3001\u786E\u8BA4\u8C03\u7528\u94FE\uFF09\u65F6\u7528 explore \u6D3E\u53EA\u8BFB\u5B50\u4EE3\u7406\uFF0C\u5B83\u53EA\u628A\u7ED3\u8BBA\u4EA4\u56DE\u6765\u3001\u4E0D\u5360\u4F60\u7684\u4E0A\u4E0B\u6587\u3002","2. \u7528\u6237\u6D88\u606F\u91CC\u7684\u76EE\u5F55\u5F15\u7528\u82E5\u51FA\u73B0\u300C\u5206\u6279\u5904\u7406\u300D\u6E05\u5355\u6216\u5927\u91CF\u300C\u672A\u6CE8\u5165\u5168\u6587\u300D\uFF1A\u672C\u8F6E\u53EA\u6311\u6700\u76F8\u5173\u7684 1\u20133 \u6279\uFF0C\u6BCF\u6279 search_code({ query, dir }) \u540E\u518D\u5C11\u91CF read_file\uFF1B\u7981\u6B62\u5BF9\u6574\u68F5\u6811\u4E32\u884C read_file\u3002\u8BA1\u5212\u4E0E\u6536\u5C3E\u5199\u6E05\u5DF2\u8986\u76D6 / \u672A\u8986\u76D6\u6279\u6B21\u3002","3. \u4E25\u7981\u5199\u6587\u4EF6\u3001\u6539\u6587\u4EF6\u3001\u5B89\u88C5\u4F9D\u8D56\u3001git \u53D8\u66F4\u7B49\u4E00\u5207\u526F\u4F5C\u7528\u64CD\u4F5C \u2014\u2014 \u4F60\u6CA1\u6709\u8FD9\u4E9B\u5DE5\u5177\uFF0C\u786C\u8C03\u4F1A\u88AB\u62D2\u7EDD\uFF08run_command \u6709\u4EE3\u7801\u7EA7\u53EA\u8BFB\u6821\u9A8C\uFF09\u3002","4. \u8C03\u7814\u4E2D\u9047\u5230\u4F1A\u6539\u53D8\u8BA1\u5212\u65B9\u5411\u7684\u4E8C\u9009\u4E00 / \u591A\u9009\u4E00\u65F6\uFF0C\u5148\u7528 ask_question \u7B49\u7528\u6237\u70B9\u9009\uFF0C\u518D\u5199\u8FDB\u8BA1\u5212\uFF1B\u4E0D\u8981\u53EA\u628A\u5F00\u653E\u95EE\u9898\u5806\u5728\u6587\u672B\u3002\u6709\u660E\u663E\u66F4\u7A33\u59A5\u7684\u8DEF\u5F84\u65F6\u7ED9\u5BF9\u5E94 option \u6807 recommended: true\u3002","5. \u8F93\u51FA\u4E00\u4EFD\u53EF\u76F4\u63A5\u6267\u884C\u7684\u8BA1\u5212\uFF0C\u683C\u5F0F\uFF1A"," ## \u76EE\u6807\uFF08\u4E00\u53E5\u8BDD\uFF09"," ## \u73B0\u72B6\uFF08\u5173\u952E\u6587\u4EF6 + \u884C\u53F7 + \u4E8B\u5B9E\uFF0C\u4E0D\u8981\u731C\uFF09"," ## \u6B65\u9AA4\uFF08\u7F16\u53F7\uFF0C\u6BCF\u6B65\u5199\u6E05\uFF1A\u6539\u54EA\u4E2A\u6587\u4EF6\u3001\u600E\u4E48\u6539\u3001\u4E3A\u4EC0\u4E48\uFF09"," ## \u9A8C\u8BC1\u65B9\u5F0F\uFF08\u6539\u5B8C\u8DD1\u4EC0\u4E48\u547D\u4EE4 / \u770B\u4EC0\u4E48\u7ED3\u679C\uFF09"," ## \u98CE\u9669\u4E0E\u5F85\u786E\u8BA4\uFF08\u5DF2\u62CD\u677F\u7ED3\u8BBA\u6216\u975E\u963B\u585E\u5907\u6CE8\uFF1B\u963B\u585E\u6027\u9009\u62E9\u5E94\u5DF2\u901A\u8FC7 ask_question \u5B8C\u6210\uFF09","6. \u300C\u6B65\u9AA4\u300D\u91CC\u6BCF\u4E00\u9879\u5FC5\u987B\u53EF\u72EC\u7ACB\u9A8C\u6536\uFF08\u4E00\u53E5\u4E00\u4E8B\uFF09\uFF0C\u6267\u884C\u65F6\u4F1A\u62C6\u6210 todo \u9010\u9879\u5B8C\u6210\uFF1B\u4E0D\u8981\u628A\u591A\u5904\u6539\u52A8\u585E\u8FDB\u540C\u4E00\u6B65\uFF0C\u4E5F\u4E0D\u8981\u5199\u300C\u987A\u4FBF\u2026\u300D\u3002","7. \u4E0D\u8981\u8D34\u5927\u6BB5\u4EE3\u7801\uFF0C\u8981\u7ED9\u6539\u52A8\u4F4D\u7F6E\u548C\u610F\u56FE\uFF1B\u8BA1\u5212\u8981\u5177\u4F53\u5230\u80FD\u7167\u7740\u505A\u3002","8. \u5168\u7A0B\u4E2D\u6587\u3002"],Gk="9. \u9700\u8981\u5916\u90E8\u6700\u65B0\u4FE1\u606F\uFF08\u7248\u672C\u53F7\u3001\u5B98\u65B9\u6587\u6863\u3001\u5DF2\u77E5\u95EE\u9898\uFF09\u65F6\uFF0C\u53EF\u7528 web_search / web_fetch \u53EA\u8BFB\u8054\u7F51\u67E5\u8BE2\u3002",Ch=["10. \u82E5\u7528\u6237\u6D88\u606F\u672B\u5C3E\u5E26\u300C\u5F15\u7528\u7684\u4E0A\u4E0B\u6587\u300D\uFF08[ref N] \u5757\uFF09\u6216\u300C[\u5F53\u524D\u6587\u4EF6]\u300D\u5757\uFF1A\u5B8C\u6574\u5757\u76F4\u63A5\u4F7F\u7528\uFF1B\u82E5\u6807\u6CE8\u300C\u7247\u6BB5 / \u622A\u65AD\u300D\uFF0C\u7528 read_file \u7684 startLine/maxLines \u5206\u6BB5\u7EED\u8BFB\u3002\u300C[\u5F53\u524D\u6587\u4EF6]\u300D\u6709\u9009\u533A\u65F6\u662F\u9009\u533A\uFF0C\u65E0\u9009\u533A\u65F6\u662F\u5149\u6807\u9644\u8FD1\u7684\u4E00\u6BB5\uFF08\u53EF\u80FD\u4E0D\u662F\u6574\u4EFD\u6587\u4EF6\uFF09\u3002","11. \u7CFB\u7EDF\u63D0\u793A\u91CC\u5217\u51FA\u4E86\u300C\u53EF\u7528\u6280\u80FD\u300D\u65F6\uFF0C\u53EF\u7528 read_skill \u8BFB\u6280\u80FD\u5168\u6587\uFF08\u53EA\u8BFB\uFF09\uFF1B\u540D\u5B57\u4EE5 mcp__ \u5F00\u5934\u7684\u662F MCP \u5916\u90E8\u5DE5\u5177\uFF0CPlan \u6A21\u5F0F\u53EA\u66B4\u9732\u4E86 server \u81EA\u62A5\u53EA\u8BFB\uFF08readOnlyHint\uFF09\u6216 mcp.json \u91CC planAllow \u663E\u5F0F\u653E\u884C\u7684\u90A3\u4E9B\uFF0C\u731C\u540D\u5B57\u786C\u8C03\u4F1A\u88AB\u62D2\u7EDD\u3002\u88AB\u62D2\u7EDD\u65F6\u7528 ask_question \u8BA9\u7528\u6237\u5207\u5230 Agent \u6A21\u5F0F\uFF0C\u6216\u628A\u8BE5 server \u5199\u8FDB mcp.json \u7684 planAllow\uFF1B\u4E0D\u8981\u53BB node_modules / npm \u7F13\u5B58 / .m2 \u91CC\u7FFB server \u5B9E\u73B0\uFF08\u5B89\u88C5\u7F13\u5B58\u91CC\u6CA1\u6709\u9879\u76EE\u4EE3\u7801\uFF0C\u7FFB\u5B83\u53EA\u4F1A\u767D\u70E7\u4E0A\u4E0B\u6587\uFF09\u3002","12. \u5BF9\u8BDD\u5386\u53F2\u91CC\u53EF\u80FD\u5E26\u6709\u66F4\u65E9\u8F6E\u6B21\u7684\u63D0\u95EE\u4E0E\u7ED3\u8BBA\uFF1A\u8FFD\u95EE\u5148\u7ED3\u5408\u5386\u53F2\u7406\u89E3\uFF1B\u5F15\u7528\u6587\u4EF6\u73B0\u72B6\u524D\u91CD\u65B0 read_file \u786E\u8BA4\uFF0C\u5386\u53F2\u91CC\u7684\u4EE3\u7801\u53EF\u80FD\u5DF2\u7ECF\u53D8\u4E86\u3002","13. \u5DE5\u5177\u7ED3\u679C\u6216\u66F4\u65E9\u8F6E\u6B21\u82E5\u88AB\u538B\u7F29\u6210\u300C\u5DF2\u7701\u7565\u2026id=sp_\u2026\u300D\u6216\u51FA\u73B0\u300C\u66F4\u65E9\u8F6E\u6B21\u6458\u8981\u300D\uFF1A\u9700\u8981\u539F\u6587\u65F6\u7528 read_spill \u6309 id \u53D6\u56DE\uFF1B\u4E0D\u8981\u81C6\u9020\u88AB\u7701\u7565\u7684\u5185\u5BB9\u3002"],Jk=Mh.concat([Gk],Ch).join(`
|
|
797
|
+
`),$k=Mh.concat(Ch).join(`
|
|
798
|
+
`);function Cn(t,e,n,s,o){let r=t==="plan",i=t==="explore",a=!!(s&&s.compact)&&!r&&!i,c=[i?Oo:a?n===!1?zk:Pr:r?n===!1?$k:Jk:n===!1?Kk:Or],u=String(e??"")||j();u&&c.push("\u5DE5\u4F5C\u76EE\u5F55\uFF1A"+u);try{let f=Je.block();f&&c.push(f)}catch(f){w("system_prompt_extra_failed",{message:f.message})}!i&&El()&&c.push(Xk),!i&&!r&&Pl()&&c.push(Vk),i&&c.push($r(n));let d=o==="concise"?"concise":o==="detailed"?"detailed":"normal";return!r&&!i&&d==="concise"?c.push("\u6C47\u62A5\u8981\u6C42\uFF1A\u5B8C\u6210\u540E\u53EA\u7ED9\u4E00\u53E5\u8BDD\u7ED3\u8BBA\uFF08\u6539\u4E86\u54EA\u4E9B\u6587\u4EF6 + \u9A8C\u8BC1\u7ED3\u679C\uFF09\uFF0C\u4E0D\u8981\u5206\u6761\u3002"):!r&&!i&&d==="detailed"&&c.push("\u6C47\u62A5\u8981\u6C42\uFF1A\u5B8C\u6210\u540E\u7ED9\u7ED3\u6784\u5316\u6C47\u62A5\u2014\u2014\u6539\u52A8\u6587\u4EF6\u6E05\u5355\uFF08\u6BCF\u6587\u4EF6\u4E00\u884C\uFF1A\u505A\u4E86\u4EC0\u4E48 + \u9A8C\u8BC1\u7ED3\u679C\uFF09\u3001\u672A\u5B8C\u6210\u9879\u3001\u4E0B\u4E00\u6B65\u5EFA\u8BAE\u3002"),c.join(`
|
|
799
|
+
|
|
800
|
+
`)}var Xk=["\u6D4F\u89C8\u5668\u5DE5\u5177\uFF08\u53EA\u8BFB\uFF09\uFF1A\u7528 `browser` \u5728\u771F\u5B9E\u7684\u65E0\u5934\u6D4F\u89C8\u5668\u91CC\u770B\u9875\u9762\uFF0C\u9002\u5408\u9A8C\u8BC1\u524D\u7AEF\u6E32\u67D3\u7ED3\u679C\u3001\u6392\u67E5\u300C\u672C\u5730\u8DD1\u8D77\u6765\u4F46\u9875\u9762\u4E0D\u5BF9\u300D\u3002","\u7528\u6CD5\uFF1A`open` \u6253\u5F00\u5730\u5740 \u2192 `snapshot` \u8BFB\u53EF\u8BBF\u95EE\u6027\u5927\u7EB2\uFF08\u9ED8\u8BA4\u5148\u770B\u8FD9\u4E2A\uFF0C\u6700\u7701 token\uFF09\u2192 \u9700\u8981\u786E\u8BA4\u89C6\u89C9\u7ED3\u679C\u65F6\u518D `screenshot`\uFF1B\u9875\u9762\u62A5\u9519\u7528 `console`\uFF0C\u8BF7\u6C42\u5931\u8D25\u7528 `network`\u3002\u7528\u5B8C `close`\uFF08\u7A7A\u95F2\u5230\u70B9\u4E5F\u4F1A\u81EA\u52A8\u5173\uFF09\u3002","\u987A\u5E8F\u5EFA\u8BAE\uFF1A\u9759\u6001\u6B63\u6587\u5148\u7528 `web_fetch`\uFF08\u4FBF\u5B9C\uFF09\uFF1B\u5B83\u53EA\u80FD\u62FF\u5230\u9AA8\u67B6\u3001\u6216\u8981\u786E\u8BA4\u6E32\u67D3 / \u8D44\u6E90\u52A0\u8F7D\u7ED3\u679C\u65F6\u518D\u4E0A `browser`\u3002","\u9650\u5236\uFF1A\u4E0D\u80FD\u70B9\u51FB\u3001\u4E0D\u80FD\u8F93\u5165\u3001\u4E0D\u80FD\u6267\u884C\u4EFB\u610F\u811A\u672C\uFF1B\u6253\u5F00\u7684\u662F\u72EC\u7ACB\u4E34\u65F6 profile\uFF0C\u4E0D\u5E26\u4F60\u7684\u767B\u5F55\u6001\u3002"].join(`
|
|
801
|
+
`),Vk=["\u684C\u9762\u64CD\u4F5C\uFF08"+Np+"\uFF09\uFF1A\u7528 `computer` \u76F4\u63A5\u64CD\u4F5C\u672C\u673A\u7A97\u53E3\uFF0C\u9002\u5408\u9A8C\u8BC1 GUI\uFF08\u7F16\u8F91\u5668 / \u6A21\u62DF\u5668 / \u672C\u5730 App\uFF09\u6216\u64CD\u4F5C\u6CA1\u6709\u547D\u4EE4\u884C\u7684\u754C\u9762\u3002","\u52A8\u4F5C\uFF1A`screenshot` \u622A\u5C4F / `ocr` \u8BC6\u522B\u5C4F\u5E55\u6587\u5B57 / `windows` \u5217\u53EF\u89C1\u7A97\u53E3\uFF08\u542B\u4F4D\u7F6E\u4E0E id\uFF09/ `frontmost` \u770B\u524D\u53F0\u5E94\u7528"," / `click` \u70B9\u51FB\uFF08button\u3001count=2 \u53CC\u51FB\uFF09/ `move` / `drag` / `scroll`\uFF08dy \u6B63\u6570\u5411\u4E0B\uFF09/ `type` \u8F93\u5165\uFF08submit \u52A0\u56DE\u8F66\uFF09/ `key` \u7EC4\u5408\u952E\uFF08\u5982 "+(Rt?"ctrl+shift+p":"cmd+shift+p")+"\uFF09\u3002","\u987A\u5E8F\uFF1A\u5148\u7528 `windows` / `frontmost` \u5B9A\u4F4D\u76EE\u6807\u7A97\u53E3 \u2192 `screenshot`\uFF08\u6216\u6CA1\u6709 vision \u65F6\u7684 `ocr`\uFF09\u770B\u6E05\u754C\u9762 \u2192 \u518D\u70B9\u3002","\u5750\u6807\uFF1A\u4E00\u5F8B\u662F\u300C"+(Rt?"\u5C4F\u5E55\u7269\u7406\u50CF\u7D20":"\u5C4F\u5E55\u903B\u8F91\u70B9")+"\u300D\uFF0C\u4E3B\u5C4F\u5DE6\u4E0A\u4E3A\u539F\u70B9\u3002\u622A\u56FE\u9ED8\u8BA4 1:1\uFF08\u56FE\u4E0A\u50CF\u7D20\u5C31\u662F\u5C4F\u5E55"+(Rt?"\u50CF\u7D20":"\u70B9")+"\uFF09\uFF0C\u56DE\u62A5\u91CC\u4F1A\u5199\u660E\uFF1B"," \u88AB\u538B\u8FC7\u65F6\u4F1A\u7ED9\u51FA\u500D\u7387\uFF0C\u6B64\u65F6\u4E5F\u53EF\u4EE5\u76F4\u63A5\u4F20 `imageCoords: true`\uFF0C\u8BA9\u5DE5\u5177\u6309\u6700\u8FD1\u4E00\u5F20\u622A\u56FE\u6362\u7B97\u3002","\u70B9\u504F\u4E86\u5148\u522B\u4E71\u8BD5\uFF1A\u91CD\u65B0\u622A\u56FE\u786E\u8BA4\u4F4D\u7F6E\uFF0C\u6216\u7528 `region` \u53EA\u622A\u90A3\u4E00\u5757\u518D\u770B\uFF1B`ocr` \u8FD4\u56DE\u7684\u6BCF\u884C\u90FD\u5E26\u5750\u6807\u3002",Rt?"\u4FEE\u9970\u952E\uFF1Actrl / shift / alt / win\uFF08`cmd` \u4E5F\u6620\u5C04\u5230 Win \u952E\uFF0C\u7167\u6284 macOS \u4E60\u60EF\u7684 cmd+shift+p \u4E00\u6837\u80FD\u7528\uFF09\u3002":"\u4FEE\u9970\u952E\uFF1Acmd / shift / ctrl / alt\uFF08cmd \u5C31\u662F \u2318\uFF09\u3002","\u9650\u5236\uFF1A\u4F1A\u52A8\u952E\u9F20\u7684\u52A8\u4F5C\u7B2C\u4E00\u6B21\u9700\u8981\u7528\u6237\u786E\u8BA4\uFF08`luban.computer.confirm`\uFF09\uFF1BPlan \u6A21\u5F0F\u4E0D\u53EF\u7528\uFF1B",ww,Rt?"Windows \u540E\u7AEF\u6CA1\u6709 OCR\uFF08`ocr` \u53EA\u8FD4\u56DE\u964D\u7EA7\u8BF4\u660E\uFF09\uFF1A\u8981\u770B\u6587\u5B57\u8BF7\u76F4\u63A5 `screenshot` \u7528 vision \u8BFB\u3002":"","\u4E0D\u8981\u7528\u5B83\u4EE3\u66FF `run_command` / `browser`\uFF1A\u80FD\u4E00\u6761\u547D\u4EE4\u89E3\u51B3\u7684\u4E0D\u8BE5\u53BB\u70B9\u754C\u9762\u3002"].filter(Boolean).join(`
|
|
802
|
+
`),Yk=[Wo,"\u4F60\u5728\u8FD9\u4E2A\u4F1A\u8BDD\u91CC\u53EA\u505A\u95EE\u7B54\uFF1A\u4E0D\u8BFB\u5199\u6587\u4EF6\u3001\u4E0D\u6267\u884C\u547D\u4EE4\u3002","\u89C4\u5219\uFF1A","1. \u4E2D\u6587\u56DE\u7B54\uFF0C\u7B80\u6D01\u76F4\u63A5\u3002","2. \u7528\u6237\u6D88\u606F\u91CC\u5E26\u3010\u8054\u7F51\u641C\u7D22\u7ED3\u679C\u3011\u65F6\uFF0C\u53EA\u4F9D\u636E\u8FD9\u4E9B\u7ED3\u679C\u4F5C\u7B54\uFF0C\u5E76\u7528 [n] \u6807\u6CE8\u6765\u6E90\u7F16\u53F7\uFF1B\u7ED3\u679C\u8986\u76D6\u4E0D\u5230\u5C31\u76F4\u8BF4\u201C\u641C\u7D22\u7ED3\u679C\u91CC\u6CA1\u6709\u53EF\u9760\u4FE1\u606F\u201D\uFF0C\u4E0D\u8981\u7F16\u9020\u3002","3. \u6CA1\u6709\u8054\u7F51\u7ED3\u679C\u65F6\u6309\u4F60\u81EA\u5DF1\u7684\u77E5\u8BC6\u56DE\u7B54\uFF0C\u4E0D\u786E\u5B9A\u7684\u5730\u65B9\u8BF4\u660E\u4E0D\u786E\u5B9A\u3002","4. \u6D88\u606F\u91CC\u5E26\u300C[\u5F53\u524D\u6587\u4EF6]\u300D\u5757\u65F6\uFF0C\u90A3\u662F\u7528\u6237\u6B64\u523B\u5728\u7F16\u8F91\u5668\u91CC\u770B\u7684\u4EE3\u7801\uFF08\u65E0\u9009\u533A\u65F6\u53EA\u662F\u5149\u6807\u9644\u8FD1\u7684\u4E00\u6BB5\uFF09\uFF1A\u7ED3\u5408\u5B83\u56DE\u7B54\uFF0C\u4E0D\u8981\u51ED\u7A7A\u8865\u5168\u6587\u4EF6\u5176\u5B83\u90E8\u5206\uFF1B\u5B83\u53EA\u662F\u80CC\u666F\uFF0C\u4E0D\u7B49\u4E8E\u672C\u6761\u8981\u95EE\u7684\u5BF9\u8C61\u3002"].join(`
|
|
803
|
+
`),Zk=["\u3010\u672C\u8F6E\u4E3A\u8054\u7F51\u95EE\u7B54\u3011\u53EA\u4F9D\u636E\u4E0B\u9762\u3010\u8054\u7F51\u641C\u7D22\u7ED3\u679C\u3011\u4F5C\u7B54\uFF1B\u7ED3\u679C\u8986\u76D6\u4E0D\u5230\u65F6\u660E\u786E\u8BF4\u201C\u641C\u7D22\u7ED3\u679C\u91CC\u6CA1\u6709\u53EF\u9760\u4FE1\u606F\u201D\uFF0C\u4E0D\u8981\u7F16\u9020\u3002","\u6BCF\u4E2A\u5173\u952E\u7ED3\u8BBA\u540E\u7528 [n] \u6807\u6CE8\u6765\u6E90\u7F16\u53F7\u3002"].join(`
|
|
804
|
+
`),Cs={maxRounds:100,maxMinutes:15,windowRatio:.8,lowRatio:.5,requestTimeoutMs:18e4,keepTailSteps:[8,4,2,0],repeatLimit:3,errorLimit:4,fpTotalLimit:4,parallelMax:4,lengthRetry:2,summaryMaxTokens:2048},Qk={concise:512,normal:2048,detailed:4096},vp=4e3,Po=6e3,ex="\u3010\u6D4F\u89C8\u5668\u622A\u56FE\u3011\u8FD9\u662F\u4E0A\u4E00\u6B65 browser \u5DE5\u5177\u62CD\u4E0B\u7684\u9875\u9762\uFF0C\u7528\u4E8E\u5224\u65AD\u6E32\u67D3\u7ED3\u679C\u3002\u53EA\u4FDD\u7559\u6700\u65B0\u4E00\u5F20\uFF1B\u4ECD\u9700\u8981\u7ED3\u6784\u4FE1\u606F\u65F6\u7528 browser action=snapshot\uFF0C\u9700\u8981\u66F4\u591A\u5386\u53F2\u753B\u9762\u8BF7\u91CD\u65B0\u622A\u56FE\u3002",tx="\u3010\u684C\u9762\u622A\u56FE\u3011\u8FD9\u662F\u4E0A\u4E00\u6B65 computer \u5DE5\u5177\u62CD\u4E0B\u7684\u672C\u673A\u5C4F\u5E55\u3002\u70B9\u51FB\u524D\u5148\u786E\u8BA4\u5750\u6807\u53E3\u5F84\uFF08\u56DE\u62A5\u91CC\u5199\u4E86 1:1 \u8FD8\u662F\u8981\u4E58\u500D\u7387\uFF09\uFF0C\u62FF\u4E0D\u51C6\u5C31\u91CD\u65B0\u622A\u56FE\u6216\u4F20 imageCoords=true\u3002\u53EA\u4FDD\u7559\u6700\u65B0\u4E00\u5F20\u3002";function Xr(t){let e=String(t??"");return e.length<=Po?e:e.slice(0,Po)+`
|
|
805
|
+
\u2026[\u5B50\u4EE3\u7406\u7ED3\u8BBA\u8D85\u957F\uFF0C\u5DF2\u622A\u65AD `+(e.length-Po)+" \u5B57\u7B26]"}function Jn(t,e){let n=String(t??""),s=Array.isArray(e)?e:[],o=[];return s.length||o.push("\u4E00\u6B21\u5DE5\u5177\u90FD\u6CA1\u8C03\u7528"),/(按|遵照)(规则|只读要求|约束).{0,16}(没|未|不)(曾|有)?(真正)?(执行|调用|尝试|试)|(未|没有?|不曾)(真正|实际)(执行|调用|尝试|试过)/.test(n)&&o.push("\u5B83\u81EA\u79F0\u300C\u6309\u89C4\u5219\u6CA1\u6267\u884C / \u672A\u771F\u6B63\u6267\u884C\u300D\uFF0C\u7B49\u4E8E\u6CA1\u6709\u9A8C\u8BC1"),o.length?"\u26A0 \u4E8B\u5B9E\u6838\u5BF9\uFF1A\u5B50\u4EE3\u7406"+o.join("\uFF1B")+`\u3002\u4E0A\u9762\u7684\u7ED3\u8BBA\u53EA\u662F\u5B83\u7684\u81EA\u8FF0\uFF0C\u672A\u7ECF\u5DE5\u5177\u9A8C\u8BC1\uFF0C\u4E0D\u8981\u5F53\u6210\u5DF2\u9A8C\u8BC1\u7684\u4E8B\u5B9E\u3002
|
|
806
|
+
|
|
807
|
+
`:""}var Tp={read_file:1,search_code:1,list_files:1,read_skill:1,read_spill:1,grep:1,glob:1,read_lints:1},nx=400;function Fl(){let t=Object.assign({},Cs);try{let e=y.workspace.getConfiguration("luban"),n=Number(e.get("agent.maxRounds"));isFinite(n)&&n>=0&&(t.maxRounds=Math.floor(n));let s=Number(e.get("agent.maxMinutes"));isFinite(s)&&s>=1&&(t.maxMinutes=Math.floor(s))}catch{}return t}function al(){try{let t=Number(y.workspace.getConfiguration("luban").get("agent.subagentRounds"));if(isFinite(t)&&t>=0)return Math.floor(t)}catch{}return Qn.rounds}function Ah(t){let e=Number(t),n=isFinite(e)&&e>=1?e:Cs.maxMinutes,s=0;try{let r=Number(y.workspace.getConfiguration("luban").get("agent.subagentMinutes"));isFinite(r)&&r>0&&(s=Math.floor(r))}catch{}let o=s>0?s:Math.round(n*Qn.minuteRatio);return s<=0&&(o=Math.min(Qn.maxMinutes,Math.max(Qn.minMinutes,o))),Math.max(1,Math.min(o,Math.floor(n)))}function Rl(){try{let t=y.workspace.getConfiguration("luban").get("agent.smallWindow"),e=String(t??"");if(e==="on"||e==="off")return e}catch{}return"auto"}function sx(){try{let t=y.workspace.getConfiguration("luban").get("agent.verbosity"),e=String(t??"");if(e==="concise"||e==="detailed")return e}catch{}return"normal"}function ox(t){return{final:"\u5B8C\u6210",maxRounds:"\u8FBE\u5230\u8F6E\u6570\u4E0A\u9650",timeout:"\u8D85\u51FA\u65F6\u95F4\u9884\u7B97",context:"\u4E0A\u4E0B\u6587\u9884\u7B97\u8017\u5C3D",loop:"\u68C0\u6D4B\u5230\u91CD\u590D\u8C03\u7528",errors:"\u8FDE\u7EED\u5DE5\u5177\u62A5\u9519",length:"\u8F93\u51FA\u88AB\u957F\u5EA6\u4E0A\u9650\u622A\u65AD"}[(t||{}).reason]||"\u5DF2\u505C\u6B62"}function ui(t){return M("ext.stop."+({final:"final",maxRounds:"maxRounds",timeout:"timeout",context:"context",loop:"loop",errors:"errors"}[(t||{}).reason]||"stopped"))}function Eh(t){let e=t||{};return e.reason==="final"&&e.detail==="noWrites"?" \xB7 "+M("ext.stop.noWrites"):!e.reason||e.reason==="final"?"":" \xB7 "+ui(e)}function Oh(t){for(let e=0;e<(t||[]).length;e++){let n=t[e],s=n&&n.name;if((s==="write_file"||s==="replace_in_file")&&n.ok!==!1)return!0}return!1}function jr(t){for(let e=0;e<(t||[]).length;e++){let n=t[e];if(n&&n.name==="explore"&&n.ok!==!1)return!0}return!1}function rx(t,e){let n=M("ext.summary.noWrites"),s=String(t||"");if(s.length>1500){let r=[n],i=ql(e,15);return i.length&&r.push(`\u672C\u8F6E\u5DE5\u5177\u6458\u8981\uFF08\u53BB\u91CD\uFF0C\u6700\u591A 15 \u6761\uFF09\uFF1A
|
|
808
|
+
- `+i.join(`
|
|
809
|
+
- `)),r.join(`
|
|
810
|
+
|
|
811
|
+
`)}let o=s.trim();return o?o+`
|
|
812
|
+
|
|
813
|
+
`+n:n}function ql(t,e){let n=Math.max(1,Math.min(Number(e)||15,30)),s=[],o={};for(let r of t||[]){let i=String(r&&r.name||"");if(!i)continue;let a=String(r&&r.path||"").trim(),l=a?i+" "+a:i;if(!o[l]&&(o[l]=!0,s.push(l+(r&&r.ok===!1?"\uFF08\u5931\u8D25\uFF09":"")),s.length>=n))break}return s}function Vr(t){for(let e of t||[]){let n=e&&e.content,s=typeof n=="string"?n:Array.isArray(n)?n.map(function(o){return o&&o.text||""}).join(`
|
|
814
|
+
`):"";if(s&&/分批处理(共\s*\d+\s*批)/.test(s))return!0}return!1}async function ix(t,e){let n=e||{},s=ox(n.stop),o=Vr(t)?"\u82E5\u4E0A\u4E0B\u6587\u6709\u76EE\u5F55\u300C\u5206\u6279\u5904\u7406\u300D\u6E05\u5355\uFF0C\u603B\u7ED3\u91CC\u5FC5\u987B\u5217\u51FA\u5DF2\u5B8C\u6210\u6279\u6B21\u4E0E\u672A\u5904\u7406\u6279\u6B21\uFF0C\u5E76\u63D0\u793A\u7528\u6237\u53EF\u6307\u5B9A\u4E0B\u4E00\u6279\u5B50\u76EE\u5F55\u7EE7\u7EED\u3002":"",r=n.verbosity==="concise"?"concise":n.verbosity==="detailed"?"detailed":"normal",i=Qk[r]||Cs.summaryMaxTokens,a=r==="concise"?"\u7528\u4E00\u53E5\u8BDD\u603B\u7ED3\uFF1A\u5B8C\u6210\u4E86\u4EC0\u4E48\u3001\u8FD8\u5DEE\u4EC0\u4E48\u3002":r==="detailed"?"\u5206\u6761\u603B\u7ED3\uFF1A\u6BCF\u4E2A\u6539\u52A8\u6587\u4EF6\u4E00\u884C\uFF08\u505A\u4E86\u4EC0\u4E48 + \u9A8C\u8BC1\u7ED3\u679C\uFF09\u3001\u672A\u5B8C\u6210\u9879\u3001\u4E0B\u4E00\u6B65\u5EFA\u8BAE\u3002":"1) \u5DF2\u7ECF\u5B8C\u6210\u4EC0\u4E48\uFF08\u6539\u4E86\u54EA\u4E9B\u6587\u4EF6\u3001\u9A8C\u8BC1\u7ED3\u679C\uFF09\uFF1B2) \u8FD8\u6709\u54EA\u4E9B\u6CA1\u505A\u5B8C\u6216\u88AB\u4E2D\u65AD\uFF1B3) \u5EFA\u8BAE\u7684\u4E0B\u4E00\u6B65\u3002",l="\u3010\u7CFB\u7EDF\u3011\u672C\u8F6E\u4EFB\u52A1\u56E0\u300C"+s+"\u300D\u7ED3\u675F"+(n.stop&&n.stop.detail?"\uFF08"+n.stop.detail+"\uFF09":"")+"\u3002\u73B0\u5728\u4E0D\u80FD\u518D\u8C03\u7528\u5DE5\u5177\u3002\u8BF7\u57FA\u4E8E\u4E0A\u9762\u5DF2\u6709\u7684\u4FE1\u606F\uFF0C\u7528\u4E2D\u6587"+(r==="normal"?"\u7B80\u6D01\u603B\u7ED3\uFF1A":"\u603B\u7ED3\uFF1A")+a+"\u6CA1\u5B9E\u9645\u505A\u8FC7\u7684\u4E0D\u8981\u7F16\u9020\u3002"+o,c=Math.max(0,Number(n.remainingMs)||0),u=Number(n.ratio)>0?Number(n.ratio):ne.DEFAULTS.ratio;if(c>3e3)try{let p=t.concat([{role:"user",content:l}]),h=await No(p,n.modelKey,{tools:[],signal:n.signal,snapshot:!1,iter:n.iter,thinking:"off",verbosity:r,maxTokens:i,timeoutMs:Math.min(6e4,c)}),m=Il(h,p,u),x=String(h.content||"").trim();if(x)return{text:x,usage:m}}catch(p){w("agent_summary_failed",{message:p.message})}let d=[];n.lastText&&String(n.lastText).trim()&&d.push(String(n.lastText).trim()),d.push(M("ext.summary.fallback",{reason:ui(n.stop),n:n.toolCalls||0})),n.stop&&n.stop.detail&&d.push(String(n.stop.detail));let f=ql(n.log,15);return f.length&&d.push(`\u672C\u8F6E\u5DE5\u5177\u6458\u8981\uFF08\u53BB\u91CD\uFF0C\u6700\u591A 15 \u6761\uFF09\uFF1A
|
|
815
|
+
- `+f.join(`
|
|
816
|
+
- `)),Vr(t)&&d.push("\u76EE\u5F55\u5F15\u7528\u542B\u5206\u6279\u6E05\u5355\uFF1A\u53EF\u6307\u5B9A\u4E0B\u4E00\u6279\u5B50\u76EE\u5F55\u7EE7\u7EED\uFF08\u4F8B\u5982\u300C\u7EE7\u7EED xxx/\u300D\uFF09\u3002"),{text:d.join(`
|
|
817
|
+
|
|
818
|
+
`),usage:null}}var ax=/context length|context_length|n_ctx|maximum context|context window|too long|exceed.{0,12}(maximum|max|context)|prompt is too long|reduce the length|上下文.{0,6}(超|满)|超出.{0,8}上下文/i;function lx(t){let e=String(t&&t.message||t||"");return ax.test(e)}async function ln(t,e){let n=e||{},s=n.root||j(),o=Fl(),r=n.maxIters==null?o.maxRounds:Number(n.maxIters),i=isFinite(r)&&r>=0?Math.floor(r):o.maxRounds,a=Number(n.maxMinutes),l=isFinite(a)&&a>0?a:o.maxMinutes,c=Date.now()+l*6e4,u=n.mode==="plan"?"plan":n.mode==="explore"?"explore":"agent",d=u==="plan",f=u==="explore",p=d||f,h=f?null:{max:Qn.perTurn,left:Qn.perTurn},m=typeof n.onSubProgress=="function"?n.onSubProgress:n.onProgress?function(q){try{n.onProgress("\u5B50\u4EE3\u7406\u300C"+(q&&q.description||"")+"\u300D"+(q&&q.line||""))}catch{}}:null,x=Zp(t),b=!!(n.webSearch||x.web),k=Ae(n.modelKey),S=rl(k),T=lt.profile(S,{mode:Rl()}),g=u!=="agent"?"normal":n.verbosity==="concise"||n.verbosity==="detailed"?n.verbosity:n.verbosity==="normal"?"normal":sx(),_={perFile:T.refPerFile,total:T.refTotal,readMax:T.readMax},v=Vn(x.prompt,s,{budgets:_});if(n.onRefs&&v.refs.length)try{n.onRefs(v.refs)}catch{}let A=f?"":Ml(v.refs,s,T,{sessionId:n.sessionId}),C=[],L=function(){if(n.onUsage)try{n.onUsage(Fo(C,S,k&&k.model&&k.model.id))}catch{}},B=[],W=[],N=new AbortController;n.token&&n.token.onCancellationRequested&&n.token.onCancellationRequested(()=>N.abort());let Y="";if(b){if(n.onProgress)try{n.onProgress("web_search "+(x.prompt||t).slice(0,40))}catch{}let q=await Qp(x.prompt||t,k,{signal:N.signal,onSearch:n.onSearch});Y=q.block;let G={name:"web_search",path:q.query.slice(0,60),ok:q.results.length>0,result:q.results.length+" \u6761\u7ED3\u679C"};if(B.push(G),w("agent_tool",G),n.onTool)try{n.onTool(G)}catch{}}try{await xe.ready()}catch(q){w("mcp_ready_failed",{message:q.message})}let I="";if(!f)try{I=xe.promptBlock()}catch(q){w("mcp_prompt_failed",{message:q.message})}let U=(Array.isArray(n.history)?n.history:[]).map(function(q){return{role:q.role,content:Array.isArray(q.content)?q.content:String(q.content==null?"":q.content)}}),H=[{role:"system",content:Cn(u,s,Ct(k&&k.provider)!=="none",T,g)}].concat(U),te=[],Ht=String(n.spillDigest||"").trim(),dn=f?"":rh(),me=on.buildUserTurn({envBlock:I,spillBlock:Ht,autoBlock:A,webBlock:Y,worksetBlock:dn,refText:v.text});if(Xn.pushUser(H,me),Array.isArray(n.images)&&n.images.length){let q=H[H.length-1];q&&q.role==="user"&&typeof q.content=="string"&&(q.content=Z.toContent(q.content,n.images))}if(n.onUserTurn)try{n.onUserTurn(me)}catch{}U.length&&w("agent_memory",{messages:U.length,chars:U.reduce(function(q,G){return q+ne.contentChars(G.content)},0),plan:d});let Nn=Mn(u,k,T),De=ne.charsOfTools(Nn),zt=S,ye=Math.floor(zt*o.windowRatio),Tt=Math.floor(zt*o.lowRatio),z=function(){return ne.charsOf(H)+De},ve=ne.DEFAULTS.ratio,pt=function(q){return ne.estimateTokens(q,ve)},zo=function(q){return Math.floor(q/ne.ratioOf(ve))-De},Ce=0,ue=null,We="",Ee=0,ts=!1,ke=0,Gt="",Jt="",Go=0,Jo=0,$o=new Map,gi=0,$l=n.spillStore&&typeof n.spillStore.put=="function"?n.spillStore:ut.createStore(),am=ti($l),Xo=0;function Vo(q){let G=q>0?q:ye;if(pt(z())<=G)return!0;for(let It of T.keepTailSteps){let Xe=ne.compact(H,{keepTail:It,spill:am});if(Xe.beforeChars===Xe.afterChars)break;H.length=0;for(let Fn of Xe.messages)H.push(Fn);if(w("agent_compact",{iters:Ce,keepTail:It,beforeChars:Xe.beforeChars,afterChars:Xe.afterChars,omittedTools:Xe.omittedTools,omittedArgs:Xe.omittedArgs,spilled:Xe.spilled||0,tokensBefore:pt(Xe.beforeChars+De),tokensAfter:pt(Xe.afterChars+De),highTokens:G,tier:T.tier}),pt(Xe.afterChars+De)<=Tt)break}if(pt(z())<=G)return!0;let fn=q>0?q:Tt,Ke=lt.squeeze(H,zo(fn),{summaryReserve:lt.DEFAULTS.summaryReserve});if(Ke.ok||(Xo=Math.max(Xo,Ke.minChars)),Ke.ok&&Ke.dropped>0){H.length=0;for(let It of Ke.messages)H.push(It);w("agent_squeeze",{iters:Ce,dropped:Ke.dropped,beforeChars:Ke.beforeChars,afterChars:Ke.chars,tokensAfter:pt(Ke.chars+De),highTokens:G,tier:T.tier})}return pt(z())<=G}function Xl(){let q=String(H[0]&&H[0].content||"").length,G=pt(q+De),fn=Xo>0?pt(Xo+De):pt(z()),Ke=T.tier==="tiny"||T.tier==="small"?"\uFF1B\u672C\u5730\u6A21\u578B\u8BF7\u786E\u8BA4 providers.json \u91CC\u7684 maxInputTokens \u4E0E\u6A21\u578B\u5B9E\u9645\u7A97\u53E3\u4E00\u81F4\uFF0C\u6216\u6539\u7528 \u226516k \u7A97\u53E3\u7684\u6A21\u578B":"\uFF1B\u53EF\u8C03\u5C0F luban.context.autoFileMaxChars / luban.sessionMemory.maxChars\uFF0C\u6216\u6362\u66F4\u5927\u7A97\u53E3\u7684\u6A21\u578B";return"\u4E0A\u4E0B\u6587\u7A97\u53E3 "+S+" token\uFF08\u9AD8\u6C34\u4F4D "+ye+"\uFF09\uFF1A\u7CFB\u7EDF\u63D0\u793A + \u5DE5\u5177\u5B9A\u4E49\u56FA\u5B9A\u7EA6 "+G+" token\uFF0C\u538B\u7F29\u5230\u6700\u5C0F\u4ECD\u9700 "+fn+" token"+Ke}for(;;){if(i>0&&Ce>=i){ue={reason:"maxRounds",detail:"\u8FBE\u5230\u6A21\u578B\u8BF7\u6C42\u8F6E\u6570\u4E0A\u9650 "+i};break}let q=c-Date.now();if(q<=0){ue={reason:"timeout",detail:"\u8D85\u8FC7\u5899\u949F\u4E0A\u9650 "+l+" \u5206\u949F"};break}if(!Vo()){ue={reason:"context",detail:Xl()};break}let G;try{G=await No(H,n.modelKey,{tools:Nn,onToken:n.onToken,onReasoning:n.onReasoning,onSplit:n.onSplit,signal:N.signal,thinking:n.thinking,verbosity:g,snapshot:Ce===0,iter:Ce,timeoutMs:Math.max(1e3,Math.min(o.requestTimeoutMs,q))})}catch(F){if(String(F&&F.message).indexOf("\u8BF7\u6C42\u8D85\u65F6")===0){ue={reason:"timeout",detail:F.message};break}if(lx(F)&&ke<2){ke++,zt=Math.max(2048,Math.floor(zt*.8)),ye=Math.floor(zt*o.windowRatio),Tt=Math.floor(zt*o.lowRatio);let ae=Vo(Math.floor(ye*.75));if(w("agent_window_guess",{iters:Ce,window:zt,highTokens:ye,squeezed:ae,message:String(F&&F.message||"").slice(0,160)}),ae)continue}throw F}Ce++,G.reasoning&&W.push(G.reasoning);let fn=Number(G.cache&&G.cache.promptTokens)||0;if(fn>0){let F=ne.charsOf(H)+De;F>0&&(ve=ne.ratioOf(fn/F))}if(C.push(Il(G,H,ve)),L(),!G.toolCalls.length){if(We=G.content||"",(G.finishReason==="length"||G.finishReason==="max_tokens")&&Ee<o.lengthRetry){Ee++,w("agent_length_retry",{iters:Ce,chars:We.length,retry:Ee}),H.push({role:"assistant",content:We}),H.push({role:"user",content:"\u4E0A\u4E00\u6761\u8F93\u51FA\u88AB\u957F\u5EA6\u4E0A\u9650\u622A\u65AD\u4E86\u3002\u8BF7\u4ECE\u65AD\u70B9\u63A5\u7740\u5199\uFF0C\u4E0D\u8981\u91CD\u590D\u5DF2\u7ECF\u5199\u8FC7\u7684\u5185\u5BB9\u3002"});continue}if(!p&&B.length>0&&!Oh(B)&&!jr(B)){let F=c-Date.now();if(!ts&&F>5e3){ts=!0,w("agent_no_write_nudge",{iters:Ce,toolCalls:B.length,chars:We.length}),H.push({role:"assistant",content:We}),H.push({role:"user",content:"\u3010\u7CFB\u7EDF\u3011\u672C\u8F6E\u5DF2\u8C03\u7528\u5DE5\u5177\u4F46\u5C1A\u672A\u6210\u529F\u6267\u884C write_file / replace_in_file\u3002\u82E5\u4EFB\u52A1\u9700\u8981\u6539\u6587\u4EF6\uFF0C\u8BF7\u7ACB\u5373\u8C03\u7528\u5DE5\u5177\u843D\u5730\uFF1B\u82E5\u53EA\u9700\u8BF4\u660E\u7ED3\u8BBA\uFF0C\u8BF7\u7528\u4E2D\u6587\u7B80\u6D01\u603B\u7ED3\uFF08\u5EFA\u8BAE\u4E0D\u8D85\u8FC7 400 \u5B57\uFF09\uFF0C\u4E0D\u8981\u7EE7\u7EED\u957F\u7BC7\u89C4\u5212\u3002"});continue}We=rx(We,B),ue={reason:"final",detail:"noWrites"};break}ue={reason:"final",detail:""};break}H.push({role:"assistant",content:G.content||"",tool_calls:G.toolCalls});let Ke=G.finishReason==="length"||G.finishReason==="max_tokens",It=G.toolCalls.map(function(F){let ae=F.function.name,le=xk(F.function.arguments),D=le.args;le.repaired&&w("tool_args_repaired",{tool:ae,how:le.repaired});let Ne=D.path||D.file_path||D.from||D.dir||D.command||D.name||D.description||D.pattern||(Array.isArray(D.patterns)?D.patterns.join(" "):"")||D.url||D.action||"",ht=ae+" "+Ne;if(n.onProgress)try{n.onProgress(ht.trim())}catch{}let Fe={tc:F,toolName:ae,args:D,label:ht.trim().slice(0,80),run:!1,ok:!0,rejected:!1,result:""};return Ke?(Fe.ok=!1,Fe.result="ERROR: "+ae+" \u672A\u6267\u884C\uFF1A\u4E0A\u4E00\u6761\u56DE\u7B54\u89E6\u5230\u8F93\u51FA\u957F\u5EA6\u4E0A\u9650\uFF08finish_reason="+G.finishReason+"\uFF09\uFF0C\u5DE5\u5177\u53C2\u6570\u5F88\u53EF\u80FD\u88AB\u622A\u65AD\u3002\u8BF7\u628A\u8FD9\u6B21\u4FEE\u6539\u62C6\u5C0F\uFF08old_string / new_string \u5404\u63A7\u5236\u5728\u51E0\u5341\u884C\u4EE5\u5185\uFF09\u540E\u91CD\u65B0\u8C03\u7528\uFF0C\u4E0D\u8981\u7528 write_file \u6574\u4EFD\u91CD\u5199\u3002",w("tool_skipped_truncated",{tool:ae,rawLen:String(F.function.arguments||"").length})):le.error?(Fe.ok=!1,Fe.result="ERROR: "+ae+" \u672A\u6267\u884C\uFF1A"+le.error+`
|
|
819
|
+
\u8BF7\u91CD\u65B0\u53D1\u8D77\u8FD9\u6B21\u8C03\u7528\uFF0C\u53C2\u6570\u5FC5\u987B\u662F\u5408\u6CD5 JSON\uFF08\u5B57\u6BB5\uFF1Apath / old_string / new_string\uFF09\u3002`,w("tool_args_invalid",{tool:ae,rawLen:String(F.function.arguments||"").length,hint:String(le.error).slice(0,Er)})):Sk(le.args)?(Fe.ok=!1,Fe.result="ERROR: "+ae+' \u672A\u6267\u884C\uFF1A\u6536\u5230\u7684\u662F\u4E0A\u4E0B\u6587\u538B\u7F29\u5360\u4F4D\u53C2\u6570 {"_omitted":true}\uFF0C\u4E0D\u662F\u771F\u5B9E\u53C2\u6570\u3002\u5B83\u6765\u81EA\u5386\u53F2\u91CC\u88AB\u7701\u7565\u7684\u65E7\u5DE5\u5177\u8C03\u7528\uFF0C\u7167\u6284\u6CA1\u6709\u610F\u4E49\uFF1B\u8BF7\u6309\u5F53\u524D\u4EFB\u52A1\u91CD\u65B0\u53D1\u8D77 '+ae+"\uFF0C\u5E76\u7ED9\u51FA\u5B8C\u6574\u53C2\u6570\uFF08read_file / write_file / replace_in_file \u81F3\u5C11\u8981\u7ED9 path\uFF09\u3002",w("tool_args_omitted",{tool:ae,rawLen:String(F.function.arguments||"").length})):Fe.run=!0,Fe}),Xe=async function(F){try{F.result=await At(F.toolName,F.args,s,G.target,{mode:u,readMax:_.readMax,caps:T,todosState:n.todosState,onTodos:n.onTodos,askWait:n.askWait,spillStore:$l,sessionId:n.sessionId||"",inSubagent:f,subBudget:h,onSubProgress:m,onSubUsage:function(ae){let le=Array.isArray(ae)?ae:[];for(let D of le)D&&(D.subagent=!0,C.push(D));if(le.length&&L(),typeof n.onSubUsage=="function")try{n.onSubUsage(le)}catch{}}}),(F.toolName==="run_command"||F.toolName==="run_command_start")&&rn(u,Qr())&&!On.check(String(F.args.command||"")).ok&&(F.rejected=!0)}catch(ae){F.ok=!1,F.result="ERROR: "+ae.message}};for(let F=0;F<It.length;F++){let ae=It[F];if(!ae.run)continue;if(!Tp[ae.toolName]){await Xe(ae);continue}let le=[ae],D=F+1;for(;D<It.length;){let Ne=It[D];if(Ne.run&&!Tp[Ne.toolName])break;Ne.run&&le.push(Ne),D++}for(let Ne=0;Ne<le.length;Ne+=o.parallelMax)await Promise.all(le.slice(Ne,Ne+o.parallelMax).map(Xe));F=D-1}let Fn=null,yi="";for(let F of It){let ae=F.tc,le=F.toolName,D=F.args,Ne=F.ok,ht=D.path||D.dir||(D.command?String(D.command).slice(0,60):"")||(D.job_id?String(D.job_id).slice(0,60):"")||(D.query?String(D.query).slice(0,60):"")||(D.url?String(D.url).slice(0,60):"")||(D.name?String(D.name).slice(0,60):"")||(D.pattern?String(D.pattern).slice(0,60):"")||(Array.isArray(D.patterns)?D.patterns.join(" ").slice(0,60):"")||(D.from?String(D.from).slice(0,60):"");if(!ht&&le==="todo_write"){let qe=Qe.normalize(D.todos),lm=qe.filter(function(Ql){return Ql.status==="completed"||Ql.status==="cancelled"}).length;ht=qe.length?lm+"/"+qe.length:"\u66F4\u65B0\u6E05\u5355"}if(!ht&&le==="apply_patch"){let qe=String(D.patch||"").match(/\*\*\*\s*(Add|Update|Delete) File:/g);ht=qe&&qe.length?qe.length+" \u4E2A\u6587\u4EF6":"patch"}if(!ht&&le==="ask_question"){let qe=Array.isArray(D.questions)&&D.questions[0];ht=String(D.title||qe&&(qe.prompt||qe.question)||"\u63D0\u95EE").slice(0,60)}if(!ht&&String(le).indexOf("mcp__")===0){for(let qe of Object.keys(D))if(typeof D[qe]=="string"&&D[qe].trim()){ht=D[qe].trim().slice(0,60);break}}let Fe=String(F.result);Ne&&F.result&&Array.isArray(F.result.images)&&F.result.images.length&&(Fn=F.result.images,yi=le);let Rn={name:le,path:ht,ok:Ne,result:Fe.length>vp?Fe.slice(0,vp)+"\u2026":Fe};if(B.push(Rn),w("agent_tool",{name:Rn.name,path:Rn.path,ok:Rn.ok,result:Rn.result.slice(0,nx)}),n.onTool)try{n.onTool(Rn)}catch{}let Yl=le==="run_command_poll"&&Ne&&/^status=running\b/m.test(Fe),Is=ne.fingerprint(le,D),qn=$o.get(Is)||{total:0,fails:0,label:F.label};Yl||(Is===Gt&&Fe===Jt?Go++:(Gt=Is,Jt=Fe,Go=1),qn=$o.get(Is)||{total:0,fails:0,label:F.label},qn.total++,(!Ne||F.rejected)&&qn.fails++,$o.set(Is,qn)),Ne&&!F.rejected?Jo=0:Jo++,F.rejected&&gi++;let Zl=Fe;!Ke&&!Yl&&qn.fails>=2&&(Zl="\u3010\u7CFB\u7EDF\u63D0\u793A\u3011\u6B64\u5DE5\u5177\u8C03\u7528\uFF08"+F.label+"\uFF09\u6B64\u524D\u5DF2\u5931\u8D25 "+qn.fails+` \u6B21\uFF0C\u8BF7\u52FF\u91CD\u8BD5\uFF0C\u6362\u4E00\u79CD\u65B9\u5F0F\u83B7\u53D6\u4FE1\u606F\u3002
|
|
820
|
+
`+Fe,w("tool_repeat_warn",{tool:le,fails:qn.fails})),H.push({role:"tool",tool_call_id:ae.id||"call_"+(Ce-1),content:Zl})}if(Fn&&Fn.length){if(te.length){let le=new Set(te);for(let D=H.length-1;D>=0;D--)le.has(H[D])&&H.splice(D,1);te.length=0}let ae={role:"user",content:[{type:"text",text:yi==="computer"?tx:ex}]};for(let le of Fn)ae.content.push({type:"image_url",image_url:{url:le.dataUrl}});H.push(ae),te.push(ae),w("shot_injected",{iters:Ce,images:Fn.length,from:yi||"browser"})}if(Ke){if(Ee<o.lengthRetry){Ee++,w("agent_length_retry",{iters:Ce,toolCalls:G.toolCalls.length,retry:Ee,kind:"tool_args"}),H.push({role:"user",content:"\u4E0A\u4E00\u6761\u56DE\u7B54\u88AB\u8F93\u51FA\u957F\u5EA6\u4E0A\u9650\u622A\u65AD\uFF0C\u91CC\u9762\u7684\u5DE5\u5177\u8C03\u7528\u6CA1\u6709\u6267\u884C\u3002\u8BF7\u628A\u6539\u52A8\u62C6\u5C0F\uFF1Aold_string / new_string \u5404\u63A7\u5236\u5728\u51E0\u5341\u884C\u4EE5\u5185\uFF0C\u5206\u591A\u6B21 replace_in_file \u5B8C\u6210\uFF0C\u4E0D\u8981\u6574\u4EFD\u91CD\u5199\u6587\u4EF6\u3002"});continue}ue={reason:"length",detail:"\u8F93\u51FA\u8FDE\u7EED "+(Ee+1)+" \u6B21\u89E6\u5230\u957F\u5EA6\u4E0A\u9650\uFF0C\u5DE5\u5177\u53C2\u6570\u65E0\u6CD5\u751F\u6210\u5B8C\u6574"};break}if(Go>=o.repeatLimit){ue={reason:"loop",detail:"\u540C\u4E00\u5DE5\u5177\u540C\u4E00\u53C2\u6570\u8FDE\u7EED "+Go+" \u6B21\u8FD4\u56DE\u76F8\u540C\u7ED3\u679C"};break}if(Jo>=o.errorLimit){ue={reason:"errors",detail:"\u8FDE\u7EED "+Jo+" \u6B21\u5DE5\u5177\u62A5\u9519"+(gi?"\uFF08\u672C\u8F6E\u7D2F\u8BA1 "+gi+" \u6761\u88AB\u62D2\u7EDD\u6216\u7A7A\u547D\u4EE4\uFF09":"")};break}let Zo=null;for(let F of $o.values())if(F.total>=o.fpTotalLimit){Zo=F;break}if(Zo){ue={reason:"loop",detail:"\u540C\u4E00\u5DE5\u5177\u540C\u4E00\u53C2\u6570\u672C\u8F6E\u5DF2\u6267\u884C "+Zo.total+" \u6B21\uFF08"+Zo.label+"\uFF09"};break}if(!Vo()){ue={reason:"context",detail:Xl()};break}}let Ls=We;if(ue.reason!=="final"){Vo();let q=Math.max(0,c-Date.now()),G=await ix(H,{modelKey:n.modelKey,stop:ue,signal:N.signal,iter:Ce,remainingMs:q,lastText:We,toolCalls:B.length,ratio:ve,log:B,verbosity:g});Ls=G.text,G.usage&&(C.push(G.usage),L()),Ls||(Ls=M("ext.summary.fallbackShort",{reason:ui(ue),n:B.length}))}if(ue&&ue.reason==="timeout"&&n.sessionId)try{let q=$.stopAll(n.sessionId);q&&q.stopped&&w("async_cmd_stop_all",{sessionId:n.sessionId,stopped:q.stopped,reason:"agent_timeout"})}catch{}let Yo=Fo(C,S,k&&k.model&&k.model.id),Vl=Uk(k&&k.provider&&k.provider.id,Yo);return Vl&&(Yo.prefixHint=Vl),w("agent_done",{iters:Ce,toolCalls:B.length,chars:Ls.length,model:n.modelKey,mode:u,stop:ue.reason,detail:ue.detail,truncated:ue.reason!=="final",tokensRatio:Number(ve.toFixed(3)),usage:Yo}),yl(),{text:Ls,reasoning:W.join(`
|
|
821
|
+
|
|
822
|
+
`),log:B,iters:Ce,modelKey:k&&k.key,stop:ue,usage:Yo,window:S,usageRows:C.slice()}}var xo="luban.providerKey.",$e=null,ll="settings",So=["language","autoOpen","context.autoFile","context.autoFileMaxChars","context.autoFileWindowLines","sessionHistory.max","sessionMemory.enabled","sessionMemory.maxTurns","sessionMemory.maxChars","agent.maxRounds","agent.maxMinutes","agent.subagentRounds","agent.subagentMinutes","agent.smallWindow","agent.verbosity","context.workset","search.maxFiles","browser.enabled","browser.headless","browser.viewportWidth","browser.viewportHeight","browser.idleTimeoutMs","browser.chromePath","computer.enabled","computer.confirm","computer.screenshotWidth","plan.strictReadOnly","fs.allowOutsideWorkspace","diagnostics.afterEdit","review.autoOpenDiff","inlineCompletion.enabled","inlineCompletion.maxPerMinute","inlineCompletion.debounceMs","usage.record"],cx={autoOpen:!0,"context.autoFile":!0,"sessionMemory.enabled":!0,"plan.strictReadOnly":!0,"fs.allowOutsideWorkspace":!0,"diagnostics.afterEdit":!0,"review.autoOpenDiff":!0,"browser.enabled":!0,"browser.headless":!0,"computer.enabled":!0,"computer.confirm":!0,"inlineCompletion.enabled":!0,"context.workset":!0,"usage.record":!0},ux={"browser.chromePath":!0},dx={"agent.smallWindow":["auto","on","off"],"agent.verbosity":["concise","normal","detailed"]},fx={"context.autoFileMaxChars":500,"context.autoFileWindowLines":40,"sessionHistory.max":1,"sessionMemory.maxTurns":1,"sessionMemory.maxChars":1e3,"agent.maxRounds":0,"agent.maxMinutes":1,"agent.subagentRounds":0,"agent.subagentMinutes":0,"search.maxFiles":100,"browser.viewportWidth":320,"browser.viewportHeight":240,"browser.idleTimeoutMs":1e4,"computer.screenshotWidth":320,"inlineCompletion.maxPerMinute":1,"inlineCompletion.debounceMs":0},px={"browser.viewportWidth":4096,"browser.viewportHeight":4096,"computer.screenshotWidth":4096};function Bl(t){return t==="usage"||t==="general"?t:"settings"}function Ul(){let t=y.workspace.getConfiguration("luban"),e=Object.create(null);So.forEach(function(o){e[o]=t.get(o)});let n=e.language;try{n=t.get("language")}catch{n="auto"}let s=String(n??"auto").toLowerCase();return e.language=s==="en"||s==="zh-cn"||s==="ja"?s:"auto",e}function cl(){return{type:"general",values:Ul()}}function hx(){if($e)try{$e.webview.postMessage(cl())}catch(t){w("general_push_failed",{message:t.message})}}async function Ph(t){let e=t&&typeof t=="object"?t:{},n=[],s=Object.create(null);if(So.forEach(function(r){if(!Object.prototype.hasOwnProperty.call(e,r)){n.push(M("ext.generalMissing",{key:r}));return}let i=e[r];if(cx[r]){if(typeof i!="boolean"){n.push(M("ext.generalBadBool",{key:r}));return}s[r]=i;return}if(r==="language"){let d=String(i??"").toLowerCase();if(d!=="auto"&&d!=="en"&&d!=="zh-cn"&&d!=="ja"){n.push(M("ext.generalBadLanguage"));return}s[r]=d;return}let a=dx[r];if(a){let d=String(i??"");if(a.indexOf(d)<0){n.push(M("ext.generalBadEnum",{key:r,values:a.join(" / ")}));return}s[r]=d;return}if(ux[r]){s[r]=String(i??"").trim();return}let l=Number(i);if(!isFinite(l)||!Number.isInteger(l)){n.push(M("ext.generalBadNumber",{key:r}));return}let c=fx[r];if(typeof c=="number"&&l<c){n.push(M("ext.generalBadMin",{key:r,min:c}));return}let u=px[r];if(typeof u=="number"&&l>u){n.push(M("ext.generalBadMax",{key:r,max:u}));return}s[r]=l}),n.length)return{ok:!1,errors:n};let o=y.workspace.getConfiguration("luban");try{for(let r=0;r<So.length;r++){let i=So[r];await o.update(i,s[i],y.ConfigurationTarget.Global)}}catch(r){return{ok:!1,errors:[M("ext.generalSaveFailed",{msg:String(r&&r.message||r)})]}}return w("general_saved",{keys:So.length}),{ok:!0,values:Ul()}}async function ul(t){let e=Object.create(null),n=0;for(let s of et.providers||[])if(!(!s||!s.id))try{let o=await t.secrets.get(xo+s.id);o&&(e[s.id]=String(o),n++)}catch(o){w("secret_read_failed",{id:s.id,message:o.message})}return Wt=e,w("secrets_synced",{providers:(et.providers||[]).length,keys:n}),n}function mx(){return{defaultModel:et.defaultModel||"",providers:(et.providers||[]).map(function(t){return{id:t.id,name:t.name||t.id,baseUrl:t.baseUrl||"",apiKeyEnv:t.apiKeyEnv||"",webSearch:t.webSearch?{baseUrl:t.webSearch.baseUrl||"",count:t.webSearch.count||8,engine:t.webSearch.engine||"",disabled:t.webSearch.disabled===!0}:null,hasInlineKey:!!t.apiKey,hasSecretKey:!!Wt[t.id],hasEnvKey:!!Uo(t),models:(t.models||[]).map(function(e){return{id:e.id,name:e.name||e.id,maxInputTokens:e.maxInputTokens||65536,maxOutputTokens:e.maxOutputTokens||8192,toolCalling:e.toolCalling!==!1,vision:e.vision===!0,thinking:un(e.thinking)?e.thinking:null}})}})}}function Yr(){return{type:"settings",path:Le,source:As,config:mx()}}function dl(){if($e)try{$e.webview.postMessage(Yr())}catch(t){w("settings_push_failed",{message:t.message})}}function Mp(t,e){if(t===""||t===void 0||t===null)return e;let n=Number(t);return!isFinite(n)||n<=0?NaN:Math.floor(n)}function gx(t,e,n){if(t==null)return{ok:!0,value:null};if(!un(t))return{ok:!1,error:M("validate.thinkShape",{pos:e,id:n})};let s={};for(let i of["on","off"]){let a=t[i];if(a==null)continue;if(!un(a))return{ok:!1,error:M("validate.thinkTier",{pos:e,id:n,tier:i})};let l=Object.keys(a).filter(function(c){return kh[c]});if(l.length)return{ok:!1,error:M("validate.thinkReserved",{pos:e,id:n,tier:i,keys:l.join(", ")})};if(JSON.stringify(a).length>xp)return{ok:!1,error:M("validate.thinkTooLong",{pos:e,id:n,tier:i,n:xp})};s[i]=a}if(!s.on&&!s.off)return{ok:!1,error:M("validate.thinkEmpty",{pos:e,id:n})};let o=String(t.default||"").trim(),r={default:o==="on"||o==="off"?o:s.off?"off":"on"};return s.on&&(r.on=s.on),s.off&&(r.off=s.off),{ok:!0,value:r}}function yx(t){let e=t||{},n=[],s=[],o=Object.create(null);for(let l of e.providers||[]){let c=l||{},u=String(c.id||"").trim(),d=M("validate.pos",{id:u||M("validate.untitled")});if(!u){n.push(M("validate.providerEmpty"));continue}if(!/^[A-Za-z0-9_-]+$/.test(u)){n.push(M("validate.idChars",{pos:d}));continue}if(o[u]){n.push(M("validate.idDup",{pos:d}));continue}o[u]=!0;let f=String(c.baseUrl||"").trim();if(!/^https?:\/\/\S+$/i.test(f)){n.push(M("validate.baseUrl",{pos:d}));continue}let p=[],h=Object.create(null);for(let x of c.models||[]){let b=x||{},k=String(b.id||"").trim();if(!k){n.push(M("validate.modelIdEmpty",{pos:d}));continue}if(h[k]){n.push(M("validate.modelIdDup",{pos:d,id:k}));continue}h[k]=!0;let S=Mp(b.maxInputTokens,65536),T=Mp(b.maxOutputTokens,8192);if(isNaN(S)){n.push(M("validate.maxIn",{pos:d,id:k}));continue}if(isNaN(T)){n.push(M("validate.maxOut",{pos:d,id:k}));continue}let g=gx(b.thinking,d,k);if(!g.ok){n.push(g.error);continue}let _={id:k,name:String(b.name||"").trim()||k,maxInputTokens:S,maxOutputTokens:T,toolCalling:!!b.toolCalling,vision:!!b.vision};g.value&&(_.thinking=g.value),p.push(_)}if(!p.length){n.push(M("validate.noModels",{pos:d}));continue}let m={id:u,name:String(c.name||"").trim()||u,baseUrl:f};if(String(c.apiKeyEnv||"").trim()&&(m.apiKeyEnv=String(c.apiKeyEnv).trim()),c.webSearch&&typeof c.webSearch=="object"){let x=String(c.webSearch.baseUrl||"").trim();if(x&&!/^https?:\/\/\S+$/i.test(x)){n.push(M("validate.webUrl",{pos:d}));continue}let b=c.webSearch.count,k=b===""||b===void 0||b===null?8:Number(b);if(!isFinite(k)||k<1||k>50){n.push(M("validate.webCount",{pos:d}));continue}let S=String(c.webSearch.engine||"").trim().toLowerCase();if(S&&S!=="deepseek"&&S!=="bing"){n.push(M("validate.webEngine",{pos:d}));continue}if(c.webSearch.disabled!==void 0&&typeof c.webSearch.disabled!="boolean"){n.push(M("validate.webDisabled",{pos:d}));continue}let T={count:Math.floor(k)};x&&(T.baseUrl=x.replace(/\/+$/,"")),S&&(T.engine=S),c.webSearch.disabled===!0&&(T.disabled=!0),m.webSearch=T}m.models=p,s.push({provider:m,raw:c})}s.length||n.push(M("validate.needProvider"));let r={};s.forEach(function(l){l.provider.models.forEach(function(c){r[c.id]=(r[c.id]||0)+1})});let i=[];s.forEach(function(l){l.provider.models.forEach(function(c){i.push({key:r[c.id]>1?l.provider.id+"::"+c.id:c.id,pid:l.provider.id,mid:c.id})})});let a=String(e.defaultModel||"").trim();if(a){let l=i.find(function(c){return c.key===a})||i.find(function(c){return c.pid+"::"+c.mid===a})||i.find(function(c){return c.mid===a});a=l?l.key:""}return!a&&i.length&&(a=i[0].key),{ok:n.length===0,errors:n,defaultModel:a,entries:s}}async function jh(t,e){let n=yx(e);if(!n.ok)return{ok:!1,errors:n.errors};let s=[];try{let l=JSON.parse(O.readFileSync(Le,"utf8"));l&&Array.isArray(l.providers)&&(s=l.providers)}catch{}let o=Object.create(null);for(let l of s)l&&l.id&&(o[l.id]=l);let r={defaultModel:n.defaultModel,providers:[]},i=[];for(let l of n.entries){let c=l.provider,u=l.raw||{},d=String(u.originalId||"").trim(),f=d&&o[d]||o[c.id]||null,p=f?Object.assign({},f,c):Object.assign({},c);if(f){for(let T of Object.keys(f))p[T]===void 0&&(p[T]=f[T]);let k=Object.create(null);for(let T of f.models||[])T&&T.id&&(k[T.id]=T);let S=Object.create(null);for(let T of Array.isArray(u.models)?u.models:[])T&&T.id&&(S[String(T.id).trim()]=T);p.models=c.models.map(function(T){let g=k[T.id],_=g?Object.assign({},g,T):T,v=S[T.id];return v&&Object.prototype.hasOwnProperty.call(v,"thinking")&&v.thinking===null&&!T.thinking&&delete _.thinking,_})}let h="",m=f&&f.id?f.id:d||c.id;m&&m!==c.id?h=Wt[m]||""||await t.secrets.get(xo+m)||"":h=Wt[c.id]||"";let x=String(u.apiKeyAction||"keep"),b=h;if(x==="set"){let k=String(u.apiKeyValue||"").trim();k&&(b=k),delete p.apiKey}else x==="clear"&&(b="",delete p.apiKey);(b!==h||m&&m!==c.id)&&i.push({id:c.id,oldId:m&&m!==c.id?m:null,value:b}),r.providers.push(p)}O.mkdirSync(P.dirname(Le),{recursive:!0,mode:448});let a=Le+".tmp";if(O.writeFileSync(a,JSON.stringify(r,null,2)+`
|
|
823
|
+
`,{mode:384}),O.existsSync(Le))try{O.copyFileSync(Le,Le+".bak")}catch(l){w("config_backup_failed",{message:l.message})}O.renameSync(a,Le);for(let l of i)l.value?await t.secrets.store(xo+l.id,l.value):await t.secrets.delete(xo+l.id),l.oldId&&await t.secrets.delete(xo+l.oldId);return Fr(),await ul(t),_e(oi()),dl(),w("config_saved",{path:Le,providers:r.providers.length,models:cn().length,secrets:i.length}),{ok:!0,path:Le,source:As,defaultModel:js(),models:oi().models}}async function Lh(t){let e=t||{},n={id:String(e.id||e.originalId||"test"),baseUrl:String(e.baseUrl||"").trim(),apiKey:String(e.apiKey||"").trim(),apiKeyEnv:String(e.apiKeyEnv||"").trim()},s=String(e.modelId||"").trim();if(!n.baseUrl)return{ok:!1,error:M("ext.providerBaseUrl")};if(!s)return{ok:!1,error:M("ext.providerNeedModel")};let o=n.apiKey||Wt[e.id]||Wt[e.originalId]||""||Uo(n)||(Es(n)?wl:"");if(!o)return{ok:!1,error:M("ext.providerNeedKey")};let r=Date.now(),i=new AbortController,a=setTimeout(function(){i.abort()},15e3);try{let l=await fetch(Kp(n),{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+o},body:JSON.stringify({model:s,messages:[{role:"user",content:"ping"}],max_tokens:1,stream:!1}),signal:i.signal}),c=await l.text(),u=Date.now()-r,d="";try{let f=JSON.parse(c);d=f.choices&&f.choices[0]&&f.choices[0].message&&f.choices[0].message.content||""}catch{}return w("provider_test",{id:n.id,model:s,status:l.status,ms:u}),{ok:l.ok,status:l.status,ms:u,reply:String(d||"").slice(0,160),error:l.ok?"":"HTTP "+l.status+": "+c.slice(0,200)}}catch(l){return w("provider_test_failed",{id:n.id,message:l.message}),{ok:!1,error:l&&l.name==="AbortError"?M("ext.providerTimeout"):String(l&&l.message||l)}}finally{clearTimeout(a)}}async function Ih(t){let e=t||{},n={id:String(e.id||e.originalId||"test"),baseUrl:String(e.baseUrl||"").trim(),apiKey:String(e.apiKey||"").trim(),apiKeyEnv:String(e.apiKeyEnv||"").trim()};if(!n.baseUrl)return{ok:!1,error:M("ext.providerBaseUrl")};let s=n.apiKey||Wt[e.id]||Wt[e.originalId]||""||Uo(n)||(Es(n)?wl:"");if(!s)return{ok:!1,error:M("ext.providerNeedKey")};let o=String(n.baseUrl).replace(/\/+$/,"")+"/models",r=new AbortController,i=setTimeout(function(){r.abort()},15e3);try{let a=await fetch(o,{headers:{Authorization:"Bearer "+s},signal:r.signal}),l=await a.text();if(!a.ok)return{ok:!1,status:a.status,error:"HTTP "+a.status+": "+l.slice(0,200)};let c=[];try{let u=JSON.parse(l);c=(Array.isArray(u)?u:u.data||u.models||[]).map(function(f){return typeof f=="string"?f:f&&(f.id||f.name)}).filter(Boolean)}catch{return{ok:!1,error:M("ext.providerBadJson",{head:l.slice(0,120)})}}return w("provider_models_fetched",{id:n.id,count:c.length}),{ok:!0,status:a.status,models:c.slice(0,300)}}catch(a){return{ok:!1,error:a&&a.name==="AbortError"?M("ext.providerTimeout"):String(a&&a.message||a)}}finally{clearTimeout(i)}}var bx=!0;function Ko(t){return bx?y.Uri.joinPath(t,"dist","media"):y.Uri.joinPath(t,"media")}function wx(t,e,n){let s=Ko(e),o=t.asWebviewUri(y.Uri.joinPath(s,"panel.css")),r=t.asWebviewUri(y.Uri.joinPath(s,"settings.css")),i=t.asWebviewUri(y.Uri.joinPath(s,"dashboard.css")),a=t.asWebviewUri(y.Uri.joinPath(s,"hub.css")),l=t.asWebviewUri(y.Uri.joinPath(s,"hub.js")),c=t.asWebviewUri(y.Uri.joinPath(s,"i18n.js")),u=O.readFileSync(y.Uri.joinPath(s,"hub.html").fsPath,"utf8"),d=Math.random().toString(36).slice(2)+Date.now().toString(36);return u.replace(/{{cspSource}}/g,t.cspSource).replace(/{{cssUri}}/g,String(o)).replace(/{{settingsCssUri}}/g,String(r)).replace(/{{dashCssUri}}/g,String(i)).replace(/{{hubCssUri}}/g,String(a)).replace(/{{jsUri}}/g,String(l)).replace(/{{i18nUri}}/g,String(c)).replace(/{{lang}}/g,vt||bl()).replace(/{{tab}}/g,Bl(n)).replace(/{{version}}/g,Mo).replace(/{{nonce}}/g,d)}function kx(t,e){return t.onDidReceiveMessage(async function(s){if(!(!s||!s.type)){if(s.type==="hub_ready"||s.type==="ready"){t.postMessage({type:"lang",lang:vt});try{t.postMessage(cl())}catch{}try{t.postMessage(Yr())}catch{}try{t.postMessage(ko(_t))}catch{}try{t.postMessage({type:"activate",tab:ll})}catch{}w("hub_ready",{tab:ll});return}if(s.type==="tab"){let o=Bl(s.tab);try{o==="usage"?t.postMessage(ko(_t)):o==="general"?t.postMessage(cl()):t.postMessage(Yr())}catch{}w("hub_tab",{tab:o});return}if(s.type==="ack_rendered"){E=Object.assign({at:Date.now()},s),s.source==="dashboard"?w("usage_dashboard_ack",{kind:s.kind,n:s.n,groups:s.groups}):s.source==="general"?w("general_ack",{kind:s.kind,n:s.n}):w("settings_ack",{kind:s.kind,n:s.n});return}if(s.type==="save_general"){try{let o=await Ph(s.values||{});o.ok?t.postMessage(Object.assign({type:"general_saved"},o)):t.postMessage({type:"general_invalid",errors:o.errors||[]})}catch(o){t.postMessage({type:"general_invalid",errors:[M("ext.generalSaveFailed",{msg:String(o&&o.message||o)})]}),w("general_save_failed",{message:o.message})}return}if(s.type==="save_settings"){try{let o=await jh(e,s.config||{});o.ok?t.postMessage(Object.assign({type:"saved"},o)):t.postMessage({type:"invalid",errors:o.errors||[]})}catch(o){t.postMessage({type:"invalid",errors:[M("ext.saveFailed",{msg:String(o&&o.message||o)})]}),w("settings_save_failed",{message:o.message})}return}if(s.type==="test_provider"){let o=await Lh(s.provider||{});t.postMessage(Object.assign({type:"test_result",ref:s.ref},o));return}if(s.type==="fetch_models"){let o=await Ih(s.provider||{});t.postMessage(Object.assign({type:"models_fetched",ref:s.ref},o));return}if(s.type==="open_config_file"){try{if(!O.existsSync(Le))throw new Error(M("ext.configMissing"));let o=await y.workspace.openTextDocument(y.Uri.file(Le));await y.window.showTextDocument(o,{preview:!1})}catch(o){t.postMessage({type:"notice",message:String(o&&o.message||o)})}return}if(s.type==="set_range"){_t=he.RANGES.some(function(r){return r.key===String(s.range||"")})?String(s.range):"7d";try{t.postMessage(ko(_t))}catch{}w("usage_dashboard_range",{range:_t});return}if(s.type==="refresh"){try{t.postMessage(ko(_t))}catch{}w("usage_dashboard_refresh",{range:_t});return}if(s.type==="open_usage_dir"){try{O.mkdirSync(jn,{recursive:!0,mode:448}),await y.commands.executeCommand("revealFileInOS",y.Uri.file(jn)),w("usage_dashboard_open_dir",{ok:!0})}catch(o){w("usage_dashboard_open_dir",{ok:!1,message:String(o&&o.message||o)});try{t.postMessage({type:"notice",message:M("ext.openDirFailed",{msg:String(o&&o.message||o)})})}catch{}}return}}})}function Dh(t,e){let n=Bl(e);if(ll=n,$e){$e.reveal();try{$e.webview.postMessage({type:"activate",tab:n})}catch{}return $e}let s=y.window.createWebviewPanel("luban.hub",M("ext.hubPanelTitle"),y.ViewColumn.Beside,{enableScripts:!0,retainContextWhenHidden:!0,localResourceRoots:[Ko(t.extensionUri)]});s.webview.html=wx(s.webview,t.extensionUri,n),$e=s;let o=kx(s.webview,t);return s.onDidDispose(function(){$e=null,o.dispose(),w("hub_disposed",{ok:!0})}),w("hub_opened",{ok:!0,tab:n}),s}function Wl(t){return Dh(t,"settings")}function Nh(t){return Dh(t,"usage")}function xx(){if($e)try{$e.webview.postMessage(ko(_t))}catch(t){w("usage_dashboard_push_failed",{message:String(t&&t.message||t)})}}var Sx=P.join(dt.homedir(),".luban","sessions"),re=null,V=new Map,fe="",Be=new Map,Kt=new Map,Dn=0,Me=new Map,Pt=new Map,X=[],Zr=!1;function ie(){return fe&&V.get(fe)||null}function es(t){if(t){let e=Be.get(t);if(e){let n=V.get(e);if(n)return n}}return ie()}function _x(t,e){let n=e&&V.has(String(e))?String(e):"";Be.forEach(function(s,o){s===t&&(n?Be.set(o,n):Be.delete(o))})}function Fh(t,e){if(_x(t,e),fe!==t)return;let n=[se&&se.webview,ce&&ce.webview];for(let o=0;o<n.length;o++){let r=n[o];if(!r)continue;let i=Be.get(r);if(i&&V.has(i)){fe=i;return}}if(e&&V.has(String(e))){fe=String(e);return}let s=X.filter(function(o){return o!==t&&V.has(o)});fe=s.length?s[s.length-1]:""}function Rh(t){let e=X.filter(function(n){return n!==t&&V.has(n)});return e.length?e[e.length-1]:""}function Ro(t){let e=String(t??"");return e&&V.has(e)?V.get(e):null}function Mt(t,e){let n=t&&t.sessionId?String(t.sessionId):"";return n?Ro(n):es(e)}function qh(){let t=ie();if(t)return t;let e=Se().create(j());return V.set(e.id,e),Kt.set(e.id,++Dn),fe=e.id,X.indexOf(e.id)<0&&X.push(e.id),e}function Bh(){let t=Lt.DEFAULT_MAX_SESSIONS;try{t=y.workspace.getConfiguration("luban").get("sessionHistory.max")}catch{}let e=Number(t);return isFinite(e)&&e>=1?Math.floor(e):Lt.DEFAULT_MAX_SESSIONS}function $n(){let t=Object.assign({},Xn.DEFAULTS);try{let e=y.workspace.getConfiguration("luban"),n=e.get("sessionMemory.enabled");n!=null&&(t.enabled=!!n);let s=Number(e.get("sessionMemory.maxTurns"));isFinite(s)&&s>=1&&(t.maxTurns=Math.floor(s));let o=Number(e.get("sessionMemory.maxChars"));isFinite(o)&&o>=1e3&&(t.maxChars=Math.floor(o))}catch{}return t}function Qr(){let t=!0;try{t=y.workspace.getConfiguration("luban").get("plan.strictReadOnly")}catch{}return t!==!1}function rn(t,e){return t==="explore"?!0:t==="plan"&&e!==!1}function Cp(t){return"\u547D\u4EE4\u88AB\u62D2\u7EDD\uFF1A"+(t.command||"\u547D\u4EE4")+" \u5728\u8DF3\u8FC7\u76EE\u5F55 "+t.seg+" \u91CC\u7FFB\u6587\u4EF6\uFF08node_modules / dist / target \u7B49\u751F\u6210\u76EE\u5F55\u3001npm-cache / .m2 \u7B49\u5B89\u88C5\u7F13\u5B58\uFF09\u3002\u8FD9\u7C7B\u76EE\u5F55\u91CC\u6CA1\u6709\u9879\u76EE\u7684\u6E90\u7801\uFF0C\u627E\u4EE3\u7801\u8BF7\u7528 read_file / grep / search_code \u5728\u5DE5\u4F5C\u533A\u91CC\u67E5\uFF1B\u786E\u5B9E\u9700\u8981\u8BFB\u8FD9\u4E9B\u76EE\u5F55\u91CC\u7684\u6587\u4EF6\uFF0C\u8BF7\u8BA9\u7528\u6237\u76F4\u63A5\u5728\u7EC8\u7AEF\u91CC\u6267\u884C\u3002"}function fl(){let t=!0;try{t=y.workspace.getConfiguration("luban").get("fs.allowOutsideWorkspace")}catch{}return t!==!1}function Uh(){let t=!0;try{t=y.workspace.getConfiguration("luban").get("review.autoOpenDiff")}catch{}return t!==!1}function Wh(){let t=En.DEFAULTS.maxFiles;try{t=y.workspace.getConfiguration("luban").get("search.maxFiles")}catch{}let e=Number(t);return isFinite(e)&&e>=100?Math.floor(e):En.DEFAULTS.maxFiles}var ei=new Map;function ti(t){return t?{put:function(e,n,s){return t.put(e,n,s)},summarize:ut.summarize,newId:ut.newId,toolPlaceholder:ut.toolPlaceholder,memoryDigestBlock:ut.memoryDigestBlock}:null}function Kh(t){let n=String(t&&typeof t=="object"?t.id||"":t||"")||"_anon",s=ei.get(n);return s||(s=ut.createStore(),ei.set(n,s)),s}function vx(t){let n=String(t&&typeof t=="object"?t.id||"":t||"")||"_anon",s=ei.get(n);if(s)try{s.clear()}catch{}ei.delete(n)}function tn(t,e,n){let s=$n();if(!s.enabled)return{messages:[],turns:0,chars:0,dropped:0,enabled:!1,spilledTurns:0,spillDigest:"",spillIds:[]};let o=Ae(e),r=o&&o.model?Number(o.model.maxInputTokens):0;if(isFinite(r)&&r>0){s.maxChars=Math.min(s.maxChars,Math.max(2e3,Math.floor(r*.4)));let a=lt.profile(r,{mode:Rl()});a.compact&&(s.maxTurns=Math.min(s.maxTurns,a.memoryTurns),s.maxChars=Math.min(s.maxChars,a.memoryChars))}let i=Object.assign({},n||{});if(i.spill===void 0){let a=i.spillStore||null;i.spill=a?ti(a):{summarize:ut.summarize,newId:ut.newId,memoryDigestBlock:ut.memoryDigestBlock}}return delete i.spillStore,Xn.build(t,Object.assign(s,i))}function Se(){return re||(re=Lt.newStore(Sx),re.setMax(Bh())),re}function di(t){let e=t||ie();return e?e.title||Lt.titleOf(e.items,e.createdAt,M("store.untitled")):""}function Tx(t){return(t||[]).map(function(e){if(!e||e.ctx==null)return e;let n=Object.assign({},e);return delete n.ctx,n})}var pl=20,Ap=8e3,Ep=0;function Kl(){return Ep++,"q"+Date.now().toString(36)+"-"+Ep.toString(36)}function fi(t){if(!t||typeof t!="object")return null;let e=String(t.text==null?"":t.text).trim();if(!e)return null;let n=(Array.isArray(t.images)?t.images:[]).map(Z.validateEntry).filter(Boolean).slice(0,Z.MAX_IMAGES);return{id:t.id?String(t.id):Kl(),text:e.length>Ap?e.slice(0,Ap):e,web:!!t.web,mode:t.mode==="plan"||t.mode==="chat"?t.mode:"agent",modelKey:String(t.modelKey==null?"":t.modelKey),thinking:t.thinking==="on"||t.thinking==="off"?t.thinking:"",verbosity:t.verbosity==="concise"||t.verbosity==="normal"||t.verbosity==="detailed"?t.verbosity:"",at:Number(t.at)||Date.now(),echoed:!!t.echoed,uid:t.uid?String(t.uid):void 0,images:n.length?n:void 0}}function ft(t){let e=t||ie();if(!e)return[];if(Array.isArray(e.queue)||(e.queue=[]),e.queue.length){let n=[];for(let s of e.queue){let o=fi(s);o&&n.push(o)}n.length!==e.queue.length&&(e.queue=n)}return e.queue}function Hh(t){let e=t||ie();return!!(e&&e.queuePaused&&ft(e).length)}function Hl(t){if(!t)return t;if(!Array.isArray(t.queue))t.queue=[];else{let e=[];for(let n of t.queue){let s=fi(n);s&&e.push(s)}t.queue=e}return t.queuePaused=!!t.queuePaused&&t.queue.length>0,t}function zh(t){let e=t||ie();return{type:"queue",id:e?e.id:"",items:ft(e).slice(),paused:Hh(e),max:pl,at:Date.now()}}function Ut(t){let e=t||ie();e&&_e(zh(e))}function Op(t,e){let n=t||qh(),s=ft(n);if(s.length>=pl)return{ok:!1,error:M("ext.queueFull",{n:pl})};let o=fi({id:Kl(),text:e&&e.prompt,web:!!(e&&(e.webSearch||e.web)),mode:e&&e.mode,modelKey:e&&e.modelKey,thinking:e&&e.thinking,at:Date.now(),echoed:!!(e&&e.echoed),uid:e&&e.uid?String(e.uid):void 0,images:Jl(n,e&&e.images,e&&e.modelKey)});return o?(s.push(o),n.queuePaused=!1,Ue(n),Ut(n),w("queue_add",{id:n.id,size:s.length,mode:o.mode,web:o.web,images:(o.images||[]).length}),{ok:!0,item:o,size:s.length}):{ok:!1,error:M("ext.queueEmpty")}}function Mx(t,e){let n=t||ie();if(!n)return{ok:!1,size:0};let s=ft(n),o=s.findIndex(function(r){return r.id===String(e||"")});return o<0?{ok:!1,size:s.length}:(s.splice(o,1),s.length||(n.queuePaused=!1),Ue(n),Ut(n),w("queue_remove",{id:n.id,size:s.length,removed:String(e||"")}),{ok:!0,size:s.length})}function Cx(t){let e=t||ie();if(!e)return{ok:!0,size:0};let n=ft(e).length;return e.queue=[],e.queuePaused=!1,Ue(e),Ut(e),w("queue_clear",{id:e.id,removed:n}),{ok:!0,size:0,removed:n}}function Pp(t){let e=t||ie();return!e||!ft(e).length?!1:(e.queuePaused=!0,!0)}function Ax(t,e){let n=t||ie();if(!n)return null;let s=ft(n),o=s.findIndex(function(r){return r.id===String(e||"")});if(o<0)return null;if(o>0){let r=s.splice(o,1)[0];s.unshift(r)}return s[0]}function Ex(t,e,n,s){let o=t||ie();if(!o)return{ok:!1,error:M("ext.queueMissing")};let r=Ax(o,e);return r?(o.queuePaused=!1,Ue(o),Ut(o),w("queue_run_now",{id:o.id,itemId:r.id,size:ft(o).length}),Me.has(o.id)?(ni(o.id),{ok:!0,deferred:!0,item:r}):(Gl(o,n,s||"queue_run_now"),{ok:!0,deferred:!1,item:r})):{ok:!1,error:M("ext.queueMissing")}}function Gh(t){let e=t||qh();return Hl(e),{type:"session",id:e.id,title:di(e),createdAt:e.createdAt,updatedAt:e.updatedAt,root:e.root,modelKey:e.modelKey||"",mode:e.mode||"",items:Tx(e.items),queue:ft(e).slice(),queuePaused:Hh(e),running:Me.has(e.id),at:Date.now()}}function Bt(){Se();let t=re.list(),e=new Set(t.map(function(s){return s.id})),n=[];for(let s of V.values()){if(e.has(s.id))continue;let o=Lt.metaOf(s);o.title=di(s)||o.title,n.push(o)}return{type:"session_list",current:fe||"",root:j(),sessions:n.concat(t),at:Date.now()}}function Jh(t,e,n,s){Se();let o=String(t??"").trim(),r=e==="all"?"all":"workspace",i=yw.search(o?re.list(r,n||j()):[],o,{load:function(a){try{return Se().load(a)}catch{return null}}});return w("session_search",{q:o,scope:r,scanned:i.scanned,matched:i.matched,truncated:i.truncated,ms:i.ms,terms:i.terms.length}),{type:"session_search",seq:Number(s)||0,q:o,scope:r,root:n||j(),results:i.results,scanned:i.scanned,matched:i.matched,truncated:i.truncated,ms:i.ms}}function Ue(t){let e=t||ie();if(e){let n=Pt.get(e.id);n&&(clearTimeout(n),Pt.delete(e.id))}if(!e)return null;if(!(e.items||[]).length&&e.bytes==null&&!(e.queue||[]).length)return e;try{return Se().save(e),e}catch(n){return w("session_save_failed",{message:n.message,id:e.id}),null}}function Ox(t){let e=t||ie();if(!e)return null;if(!(e.items||[]).length&&e.bytes==null&&!(e.queue||[]).length)return e;try{return Se().saveAsync(e),e}catch(n){return w("session_save_failed",{message:n.message,id:e.id}),null}}function zl(t){let e=t||ie();if(!e)return;let n=Pt.get(e.id);n&&clearTimeout(n),Pt.set(e.id,setTimeout(function(){if(Pt.delete(e.id),!!Ox(e))try{_e(Bt())}catch{}},1500))}function Ge(t,e){let n=e||ie();return n?(Se().append(n,t),zl(n),n):null}function hl(t,e,n){return!t||t.t!=="user"?null:(t.ctx=String(e??""),zl(n),t)}function $h(t){let e=t||ie();if(!e)return null;let n=e.items||[];return n.length?n[n.length-1]:null}function Px(t,e){if(!(!t||!t.type))if(t.type==="tool")Ge({t:"tool",name:t.name,path:t.path,ok:t.ok,result:t.result},e);else if(t.type==="todos")Ge({t:"todos",items:t.items||[]},e);else if(t.type==="ask_question")t.answers&&Ge({t:"ask_question",id:t.id,title:t.title||"",questions:t.questions||[],answers:t.answers},e);else if(t.type==="sources")Ge({t:"sources",items:t.items,query:t.query},e);else if(t.type==="references")Ge({t:"refs",refs:t.refs},e);else if(t.type==="done"){if(t.text||t.think){let n={t:t.kind==="plan"?"plan":"text",text:t.text||""};t.think&&(n.think=t.think),t.kind==="plan"&&t.planFile&&(n.planFile=t.planFile),t.kind==="plan"&&Array.isArray(t.todos)&&t.todos.length&&(n.todos=t.todos),Ge(n,e)}t.usage&&Ge(Object.assign({t:"usage"},t.usage),e),t.summary&&Ge({t:"summary",text:t.summary},e)}else t.type==="error"&&Ge({t:"error",message:t.message},e)}var Lr=P.join(dt.homedir(),".luban","plans"),jp=200*1024,jx=32;function yo(t){return(t<10?"0":"")+t}function Lx(t){let e=t||new Date;return e.getFullYear()+yo(e.getMonth()+1)+yo(e.getDate())+"-"+yo(e.getHours())+yo(e.getMinutes())+yo(e.getSeconds())}function Xh(t){return String(t??"").replace(/[\\/:*?"<>|\u0000-\u001f]+/g," ").replace(/[:/\*?“”"<>|]/g," ").replace(/\s+/g," ").trim().slice(0,jx).trim()||"plan"}function bo(t,e){return t+": "+JSON.stringify(String(e??""))}function Ix(t,e){let n=e||{},s=String(t??"").replace(/\s+$/,"")+`
|
|
824
|
+
`;return["---",bo("title",Xh(n.prompt)),bo("created",new Date().toISOString()),bo("workspace",n.workspace||""),bo("model",n.modelKey||""),bo("session",n.session||""),"---",""].join(`
|
|
825
|
+
`)+s}function Dx(t){let e=String(t??""),n=e.split(`
|
|
826
|
+
`);if(String(n[0]).trim()!=="---")return e;for(let s=1;s<n.length;s++)if(String(n[s]).trim()==="---")return n.slice(s+1).join(`
|
|
827
|
+
`).replace(/^\n+/,"");return e}function Nx(){return[Lr].concat(Ln.roots(dt.homedir(),j()))}function Vh(t){let e=String(t??"");if(!e||!/\.md$/i.test(e))return!1;let n=P.resolve(e),s=Nx();for(let o=0;o<s.length;o++){let r=P.relative(s[o],n);if(r&&!r.startsWith("..")&&!P.isAbsolute(r))return!0}return!1}function Yh(t,e){let n=e||{};try{O.mkdirSync(Lr,{recursive:!0,mode:448});let s=Lx()+"-"+Xh(n.prompt),o=P.join(Lr,s+".md");for(let i=2;O.existsSync(o)&&i<1e3;i++)o=P.join(Lr,s+"-"+i+".md");let r=o+".tmp";return O.writeFileSync(r,Ix(t,n),{mode:384}),O.renameSync(r,o),w("plan_file_write",{file:o,chars:String(t||"").length}),o}catch(s){return w("plan_file_write_failed",{message:s.message}),""}}function Fx(t){if(!Vh(t))return w("plan_file_read_rejected",{path:String(t??""),reason:"\u8DEF\u5F84\u4E0D\u5728\u8BA1\u5212\u76EE\u5F55\u4E0B\u6216\u4E0D\u662F .md"}),"";try{let e=O.statSync(t);return e.isFile()?e.size>jp?(w("plan_file_read_rejected",{path:t,reason:"\u8D85\u8FC7 "+jp+" \u5B57\u8282"}),""):Dx(O.readFileSync(t,"utf8")):(w("plan_file_read_rejected",{path:t,reason:"\u4E0D\u662F\u6587\u4EF6"}),"")}catch(e){return w("plan_file_read_rejected",{path:t,reason:e.message}),""}}async function Zh(t){if(!Vh(t))throw new Error(M("ext.notPlanFile",{path:String(t??"")}));let e=await y.workspace.openTextDocument(y.Uri.file(P.resolve(t)));return await y.window.showTextDocument(e,{preview:!1}),!0}function Rx(t,e){return function(n){if(Kt.get(e.id)!==t||!V.has(e.id))return;Px(n,e),n.sid=e.id;let s=[se&&se.webview,ce&&ce.webview];for(let o of s)if(o)try{o.postMessage(n)}catch{}}}function pi(t,e,n){let s=n||ie();s&&(t&&(s.modelKey=String(t)),e&&(s.mode=String(e)))}function ni(t){let e=String(t??""),n=Me.get(e);try{let s=$.stopAll(e);s&&s.stopped&&w("async_cmd_stop_all",{sessionId:e,stopped:s.stopped,reason:"cancel"})}catch{}if(!n)return!1;try{n.cts.cancel()}catch{}return Bx(e,"\u7528\u6237\u505C\u6B62\u4E86\u672C\u8F6E"),!0}var jt=new Map,qx=0;function Bx(t,e){let n=String(t??""),s="ask_question \u5DF2\u53D6\u6D88\uFF1A"+(e||"\u7528\u6237\u505C\u6B62\u4E86\u672C\u8F6E"),o=[];jt.forEach(function(r,i){(!n||r.sessId===n)&&o.push(i)});for(let r=0;r<o.length;r++){let i=o[r],a=jt.get(i);if(a){jt.delete(i);try{a.reject(new Error(s))}catch{}}}}function Ux(t){let e=String(t&&t.title||"").trim();if(e)return e.slice(0,80);let n=t&&t.questions&&t.questions[0];return(String(n&&n.prompt||"").trim()||"ask_question").slice(0,80)}function Wx(t){let e=Ux(t),n=M("ext.askGoChoose");Promise.resolve(y.window.showInformationMessage(M("ext.askNeeded",{detail:e}),n)).then(function(s){if(s===n){try{se&&se.reveal()}catch{}return y.commands.executeCommand("luban.focusView")}}).catch(function(){})}function Qh(t,e,n){let s=t&&t.id?String(t.id):"";return async function(r){let i="ask_"+ ++qx+"_"+Date.now().toString(36),a={type:"ask_question",id:i,title:r.title||"",questions:r.questions};if(typeof e=="function")try{e(a)}catch{}return Wx(r),await new Promise(function(l,c){let u={sessId:s,normalized:r,resolve:l,reject:c,emitDone:typeof e=="function"?e:null,onAbort:null};jt.set(i,u);let d=function(){jt.has(i)&&(jt.delete(i),c(new Error("ask_question \u5DF2\u53D6\u6D88\uFF1A\u7528\u6237\u505C\u6B62\u4E86\u672C\u8F6E")))};u.onAbort=d;try{if(n){if(n.isCancellationRequested){d();return}typeof n.onCancellationRequested=="function"&&n.onCancellationRequested(d)}}catch{}})}}function em(t,e,n){let s=String(t??""),o=jt.get(s);if(!o)return{ok:!1,error:"\u6CA1\u6709\u7B49\u5F85\u4E2D\u7684\u63D0\u95EE"};if(n&&o.sessId&&o.sessId!==String(n))return{ok:!1,error:"\u4F1A\u8BDD\u4E0D\u5339\u914D"};let r;try{r=Qt.normalizeAnswers(o.normalized,e)}catch(a){return{ok:!1,error:a.message}}jt.delete(s);let i=Qt.formatAnswers(o.normalized,r);try{o.emitDone&&o.emitDone({type:"ask_question",id:s,title:o.normalized.title||"",questions:o.normalized.questions,answers:r})}catch{}try{o.resolve(i)}catch{}return{ok:!0,text:i}}async function _o(t,e,n,s){let o=Mt(e,n);if(!o||Me.has(o.id))return!1;let r=new y.CancellationTokenSource,i=Kt.get(o.id)||0,a={cts:r,seq:i,sess:o};Me.set(o.id,a);let l=Rx(i,o),c=Date.now(),u={last:null,done:null},d=function(h){return h&&h.usage&&(h.type==="usage_live"?u.last=h.usage:h.type==="done"&&(u.done=h.usage)),l(h)},f={modelKey:e&&e.modelKey||js(),mode:t==="execute_plan"?"execute":e&&e.mode||"agent",source:s,session:o.id},p={emit:d,cts:r,sess:o,t0:c,source:s,webview:n};try{t==="execute_plan"?await Kx(e,p):await Hx(e,p)}catch(h){if(l({type:"error",message:h.message}),!V.has(o.id))try{O.existsSync(Se().fileOf(o.id))&&(Se().append(o,{t:"error",message:M("ext.cancelled")}),Se().save(o))}catch{}w("webview_error",{source:s,message:h.message})}finally{Me.get(o.id)===a&&Me.delete(o.id),r.dispose(),u.done?il(f,u.done):u.last&&il(f,Object.assign({},u.last,{partial:!0})),V.get(o.id)===o&&(Ue(o),_e({type:"turn_end",id:o.id}),Gl(o,n,s==="queue"?"queue":s))}return!0}function Gl(t,e,n){let s=t||ie();if(!s||Me.has(s.id))return!1;let o=ft(s);if(!o.length||s.queuePaused)return Ut(s),!1;let r=o.shift();Ue(s),Ut(s);let i=e||Et()||Ie;return _e({type:"queue_start",id:s.id,item:r}),w("queue_start",{id:s.id,size:o.length,mode:r.mode,web:r.web}),_o("ask",{prompt:r.text,webSearch:r.web,mode:r.mode,modelKey:r.modelKey,sessionId:s.id,thinking:r.thinking,verbosity:r.verbosity,uid:r.uid,images:r.images||[]},i,"queue"),!0}function tm(t,e,n){let s={items:Qe.normalize(n||[])};t&&(t.planTodos=s.items);let o=function(r){let i=Qe.normalize(r);s.items=i,t&&(t.planTodos=i),e&&e({type:"todos",items:i})};return{state:s,onTodos:o,seedEmit:function(){s.items.length&&o(s.items)}}}async function Kx(t,e){let n=e.emit,s=e.cts,o=e.source,r=e.t0,i=e.sess,a=!!t.autoAccept;pi(t.modelKey,"agent",i);let l=Kh(i),c=tn(i&&i.items||[],t.modelKey,{resolveImage:nn(i),spillStore:l});w("session_memory",{source:o,mode:"execute_plan",turns:c.turns,chars:c.chars,dropped:c.dropped,enabled:c.enabled,spilledTurns:c.spilledTurns||0}),Ue(i);let u=t.planFile?Fx(t.planFile):"",d=u||String(t.plan||"");if(!d.trim())throw new Error(M("ext.noPlan"));w("plan_file_read",{file:t.planFile||"",chars:d.length,edited:!!u&&u.trim()!==String(t.plan||"").trim(),autoAccept:a});let f=null;for(let _=c.messages.length-1;_>=0;_--)if(c.messages[_].role==="assistant"){f=c.messages[_];break}let p=!!(f&&d.trim()&&f.content.trim()===d.trim()),h=t.planFile?Ln.todosOfFile(t.planFile):[];h.length||(h=Qe.parsePlanSteps(d)),h=Qe.normalize(h);let m=tm(i,n,h),x=h.length?`
|
|
828
|
+
|
|
829
|
+
`+Qe.formatBlock(h)+`
|
|
830
|
+
\u8BF7\u7528 todo_write \u8DDF\u8E2A\u8FDB\u5EA6\uFF1A\u540C\u65F6\u53EA\u80FD\u6709\u4E00\u4E2A in_progress\uFF1B\u5B8C\u6210\u4E00\u9879\u518D\u6807\u4E0B\u4E00\u9879\uFF1B\u5168\u90E8\u5B8C\u6210\u540E\u518D\u6536\u5C3E\u6C47\u62A5\u3002`:`
|
|
831
|
+
|
|
832
|
+
\u8BF7\u5148\u7528 todo_write \u6309\u8BA1\u5212\u6B65\u9AA4\u5EFA\u4E00\u4EFD\u6E05\u5355\uFF0C\u518D\u9010\u9879\u5B8C\u6210\uFF08\u540C\u65F6\u53EA\u80FD\u6709\u4E00\u4E2A in_progress\uFF09\u3002`,b=(p?"\u6309\u4E0A\u4E00\u6761\u8BA1\u5212\u6267\u884C\uFF0C\u9010\u6761\u843D\u5B9E\u5E76\u7528\u5DE5\u5177\u9A8C\u8BC1\u3002":`\u6309\u4E0B\u9762\u8FD9\u4EFD\u8BA1\u5212\u6267\u884C\uFF0C\u9010\u6761\u843D\u5B9E\u5E76\u7528\u5DE5\u5177\u9A8C\u8BC1\uFF1A
|
|
833
|
+
|
|
834
|
+
`+d)+x,k=M(a?"cross.execPlanAccept":"cross.execPlan");Ge({t:"user",text:k,ctx:b,exec:!0},i);let S=$h(i);Ue(i),m.seedEmit();let T=Qh(i,n,s.token);a&&Mk();let g;try{g=await ln(b,{root:j(),modelKey:t.modelKey,mode:"agent",thinking:t.thinking,verbosity:t.verbosity,history:c.messages,spillDigest:c.spillDigest||"",spillStore:l,sessionId:i&&i.id?i.id:"",token:s.token,todosState:m.state,onTodos:m.onTodos,askWait:T,onToken:_=>n({type:"token",text:_}),onReasoning:_=>n({type:"reasoning",text:_}),onSplit:_=>n({type:"think_split",text:_}),onRefs:_=>n({type:"references",refs:_}),onUserTurn:function(_){hl(S,_,i)},onUsage:_=>n({type:"usage_live",usage:_}),onTool:_=>n(Object.assign({type:"tool"},_))})}finally{a&&Ck()}n({type:"done",text:g.text,think:g.reasoning||void 0,kind:"agent",usage:g.usage,summary:M("ext.summary.exec",{n:g.log.length,s:((Date.now()-r)/1e3).toFixed(1)})+Eh(g.stop)}),w("webview_execute_plan_done",{toolCalls:g.log.length,iters:g.iters,chars:g.text.length,todos:(m.state.items||[]).length,autoAccept:a})}function nn(t){let e=t&&t.id?String(t.id):"";return function(n){return e?Z.readDataUrl(e,n):""}}function Jl(t,e,n){let s=t&&t.id?String(t.id):"";if(!s||!Array.isArray(e)||!e.length)return[];let o=Ae(n);if(!(o&&o.model&&o.model.vision===!0))return[];let r=[];for(let i of e.slice(0,Z.MAX_IMAGES)){if(!i||typeof i!="object")continue;let a=i.dataUrl?Z.saveImage(s,i.dataUrl):Z.validateEntry(i);a&&r.push(a)}return r}async function Hx(t,e){let n=e.emit,s=e.cts,o=e.source,r=e.t0,i=e.sess,a=Zp(t.prompt),l=!!(t.webSearch||a.web),c=a.prompt||(l?"\u8BF7\u8054\u7F51\u641C\u7D22\u5F53\u524D\u6700\u65B0\u4FE1\u606F\u5E76\u603B\u7ED3":""),u=Jl(i,t.images,t.modelKey),d=Array.isArray(t.images)?t.images.filter(Boolean).length:0;u.length?w("ask_images",{source:o,n:u.length,bytes:u.reduce(function(g,_){return g+_.bytes},0)}):d&&(n({type:"img_blocked",n:d}),w("ask_images_blocked",{source:o,model:t.modelKey,n:d})),pi(t.modelKey,t.mode||"agent",i);let f=Kh(i),p=tn(i&&i.items||[],t.modelKey,{resolveImage:nn(i),spillStore:f});w("session_memory",{source:o,mode:t.mode||"agent",turns:p.turns,chars:p.chars,dropped:p.dropped,enabled:p.enabled,spilledTurns:p.spilledTurns||0}),Ge({t:"user",text:c,web:l,uid:t.uid?String(t.uid):void 0,images:u.length?u:void 0},i);let h=$h(i);if(Ue(i),t.mode==="chat"){let g=rl(Ae(t.modelKey)),_=Vn(c,j(),{window:g});_.refs.length&&n({type:"references",refs:_.refs});let v=Ml(_.refs,j(),void 0,{sessionId:i&&i.id}),A=null;l&&(n({type:"searching",query:c.slice(0,128)}),A=await Qp(c,Ae(t.modelKey),{signal:s.token,onSearch:function(Y){n({type:"sources",items:ip(Y.results),query:Y.query})}}),n({type:"tool",name:"web_search",path:A.query.slice(0,60),ok:A.results.length>0,result:A.results.length+" \u6761\u7ED3\u679C"}),w("webview_chat_web",{source:o,query:A.query,results:A.results.length}));let C=on.buildUserTurn({rule:l?Zk:"",spillBlock:p.spillDigest||"",webBlock:A?A.block:"",autoBlock:v,refText:_.text});hl(h,C,i);let L=u.map(function(Y){return Z.readDataUrl(i.id,Y)}),B=[{role:"system",content:Yk}].concat(p.messages,[{role:"user",content:Z.toContent(C,L)}]),W=await No(B,t.modelKey,{onToken:Y=>n({type:"token",text:Y}),onReasoning:Y=>n({type:"reasoning",text:Y}),onSplit:Y=>n({type:"think_split",text:Y}),thinking:t.thinking,signal:s.token}),N=Fo([Il(W,B,ne.DEFAULTS.ratio)],rl(W.target),W.target.model.id);n({type:"usage_live",usage:N}),n({type:"done",text:W.content,think:W.reasoning||void 0,summary:M("ext.summary.chat",{model:W.target.model.id}),usage:N}),w("webview_chat_done",{source:o,chars:W.content.length,model:W.target.key,refs:_.refs.length,usage:N});return}let m=t.mode==="plan",x=m?null:tm(i,n,[]),b=Qh(i,n,s.token),k=await ln(t.prompt,{root:j(),modelKey:t.modelKey,mode:m?"plan":"agent",webSearch:l,thinking:t.thinking,verbosity:t.verbosity,history:p.messages,spillDigest:p.spillDigest||"",spillStore:f,sessionId:i&&i.id?i.id:"",token:s.token,todosState:x?x.state:void 0,onTodos:x?x.onTodos:void 0,askWait:b,onToken:g=>n({type:"token",text:g}),onReasoning:g=>n({type:"reasoning",text:g}),onSplit:g=>n({type:"think_split",text:g}),onRefs:g=>n({type:"references",refs:g}),onSearch:function(g){n({type:"sources",items:ip(g.results),query:g.query})},images:u.map(function(g){return Z.readDataUrl(i.id,g)}),onUserTurn:function(g){hl(h,g,i)},onUsage:g=>n({type:"usage_live",usage:g}),onTool:g=>n(Object.assign({type:"tool"},g))}),S="",T=[];if(m&&(S=Yh(k.text,{prompt:t.prompt,workspace:j(),modelKey:t.modelKey,session:i?i.id:""}),T=Qe.parsePlanSteps(k.text)),n({type:"done",text:k.text,think:k.reasoning||void 0,kind:m?"plan":"agent",usage:k.usage,planFile:S||void 0,todos:m&&T.length?T:void 0,summary:M(m?"ext.summary.plan":"ext.summary.done",{n:k.log.length,s:((Date.now()-r)/1e3).toFixed(1)})+Eh(k.stop)}),w("webview_"+(m?"plan":"agent")+"_done",{source:o,toolCalls:k.log.length,iters:k.iters,chars:k.text.length,usage:k.usage,todos:m?T.length:void 0}),m&&(i&&i.id&&Bo.set(i.id,{text:k.text,file:S}),w("plan_ready",{chars:k.text.length,tools:k.log.map(function(g){return g.name}),file:S,todos:T.length}),S))try{await Zh(S)}catch(g){w("plan_file_open_failed",{file:S,message:g.message})}}async function je(){if(se||ce)return!0;try{await y.commands.executeCommand("workbench.view.extension.luban")}catch{}return await new Promise(function(t){setTimeout(t,700)}),!!Ie}async function qo(t,e){let n=Se().create(j());V.set(n.id,n),Kt.set(n.id,++Dn),fe=n.id;let s=e||Et()||Ie;return s&&Be.set(s,n.id),X.indexOf(n.id)<0&&X.push(n.id),E=null,Ho(n,s),_e(Bt()),w("session_new",{reason:t||"",id:n.id,tabs:X.length,review:J.size}),n}function Lp(t,e,n){let s=Array.isArray(t)?t:[],o=String(e??"");if(o)for(let i=s.length-1;i>=0;i--){let a=s[i];if(a&&a.t==="user"&&!a.exec&&String(a.uid||"")===o)return i}let r=Number(n);if(isFinite(r)&&r>=0){let i=0;for(let a=0;a<s.length;a++){let l=s[a];if(!(!l||l.t!=="user"||l.exec)){if(i===Math.floor(r))return a;i++}}}return-1}function si(t,e,n,s){if(!(t&&t.items||[]).length)return{ok:!1,error:M("ext.forkEmpty")};let r=Lt.forkSession(t,{at:e??null,title:di(t),suffix:M("ext.forkSuffix")});V.set(r.id,r),Kt.set(r.id,++Dn),fe=r.id;let i=n||Et()||Ie;i&&Be.set(i,r.id),X.indexOf(r.id)<0&&X.push(r.id),E=null;try{let a=Z.copySession(t.id,r.id);(a.copied||a.failed)&&w("session_fork_attachments",{from:t.id,to:r.id,copied:a.copied,failed:a.failed})}catch(a){w("session_fork_attachments_failed",{from:t.id,to:r.id,message:a.message})}try{Se().save(r)}catch(a){w("session_save_failed",{message:a.message,id:r.id})}return Ho(r,i),_e(Bt()),w("session_fork",{from:t.id,id:r.id,at:e??-1,items:r.items.length,source:s||"",tabs:X.length}),{ok:!0,id:r.id,from:t.id,items:r.items.length,at:e??-1}}async function zx(t,e,n,s){let o=String(t||""),r=Ro(o);if(!r)try{r=Se().load(o)}catch{r=null}if(!r){let c=M("ext.noSuchSession",{id:o});try{y.window.showErrorMessage(c)}catch{}return w("session_fork_failed",{id:o,reason:"missing"}),{ok:!1,error:c}}if(Me.has(r.id)){let c=M("ext.forkBusy");try{y.window.showWarningMessage(c)}catch{}return w("session_fork_failed",{id:r.id,reason:"busy"}),{ok:!1,error:c,busy:!0}}let i=r.items||[];if(!i.length){let c=M("ext.forkEmpty");try{y.window.showWarningMessage(c)}catch{}return w("session_fork_failed",{id:r.id,reason:"empty"}),{ok:!1,error:c}}if(s)return si(r,null,e,n||"fork_whole");let a=[{label:M("ext.forkWhole"),description:M("ext.forkWholeDesc",{n:i.length}),at:null}];for(let c of Lt.forkPoints(i))a.push({label:Eo(c.text),description:M("ext.forkFromDesc",{n:c.rest}),at:c.index});let l=null;try{l=await y.window.showQuickPick(a,{title:M("ext.forkPickTitle"),placeHolder:M("ext.forkPickPlaceholder"),matchOnDescription:!0,ignoreFocusOut:!0})}catch(c){return w("session_fork_failed",{id:r.id,reason:"pick_error",message:c.message}),{ok:!1,error:c.message}}return l?si(r,l.at,e,n):(w("session_fork_cancel",{id:r.id}),{ok:!1,canceled:!0})}function Gx(t){let e=Math.max(0,Date.now()-(Number(t)||0));return e<60*1e3?M("panel.relJustNow"):e<60*60*1e3?M("panel.relMinutes",{n:Math.floor(e/6e4)}):e<24*60*60*1e3?M("panel.relHours",{n:Math.floor(e/36e5)}):M("panel.relDays",{n:Math.floor(e/864e5)})}async function Jx(){let t=Ln.listPlans({home:dt.homedir(),root:j()});if(!t.length){y.window.showInformationMessage(M("ext.cursorPlanNone",{dir:Ln.homePlanDir(dt.homedir())}));return}let e=t.map(function(s){return{label:s.name||s.base,description:Gx(s.mtimeMs)+" \xB7 "+ih(s.size),detail:s.overview?Eo(s.overview):s.file,file:s.file}}),n=await y.window.showQuickPick(e,{placeHolder:M("ext.cursorPlanPick"),matchOnDescription:!0,matchOnDetail:!0,ignoreFocusOut:!0});n&&await nm(n.file)}async function nm(t){let e=Ln.readPlan(t);if(!e.ok){let i=e.code==="too_big"?M("ext.cursorPlanBig",{n:Math.round(Ln.MAX_BYTES/1024)}):M("ext.cursorPlanReadFail",{msg:e.error});return y.window.showErrorMessage(i),w("cursor_plan_read_failed",{file:t,code:e.code||"",error:e.error||""}),{ok:!1,error:i}}if(!String(e.body||"").trim())return y.window.showErrorMessage(M("ext.noPlan")),w("cursor_plan_read_failed",{file:t,code:"empty"}),{ok:!1,error:M("ext.noPlan")};await je();let n=await Xx(6e3);if(n&&se&&n===se.webview)try{se.reveal()}catch{}else if(n&&ce&&n===ce.webview&&ce.visible!==!0)try{await y.commands.executeCommand("workbench.view.extension.luban")}catch{}if(!await Vx(n,1e4))return y.window.showErrorMessage(M("ext.cursorPlanNoPanel")),w("cursor_plan_no_panel",{webview:!!n}),{ok:!1,error:M("ext.cursorPlanNoPanel")};let o=es(n);(!o||(o.items||[]).length||ft(o).length||Me.has(o.id))&&(o=await qo("cursor_plan",n));let r=Qe.normalize(e.todos||[]);return Ge({t:"plan",text:e.body,planFile:t,todos:r.length?r:void 0},o),Ue(o),Ho(o,null),_e(Bt()),n.postMessage({type:"execute_plan",plan:e.body,planFile:t,sessionId:o.id}),w("cursor_plan_execute",{file:t,chars:e.body.length,todos:r.length,session:o.id}),{ok:!0,session:o.id,file:t,chars:e.body.length,todos:r.length}}async function Ss(t,e){let n=V.get(String(t||"")),s=!0;if(!n){if(s=!1,n=Se().load(t),!n)return w("session_open_failed",{id:t}),{ok:!1,error:M("ext.noSuchSession",{id:t})};n=Hl(n),V.set(n.id,n),Kt.set(n.id,++Dn)}fe=n.id;let o=e||Et()||Ie;return o&&Be.set(o,n.id),X.indexOf(n.id)<0&&X.push(n.id),E=null,Ho(n,o),_e(Bt()),w("session_open",{id:n.id,items:(n.items||[]).length,queue:(n.queue||[]).length,cached:s,tabs:X.length}),{ok:!0,id:n.id,items:(n.items||[]).length}}async function Gn(t){Se();let e=String(t||""),n=fe===e;if(V.get(e)){ni(e),Me.delete(e),Kt.set(e,++Dn);let o=Pt.get(e);o&&(clearTimeout(o),Pt.delete(e));let r=Rh(e);V.delete(e),Fh(e,r)}Bo.delete(e),re.remove(e);try{let o=Z.removeSession(e);w("attachments_remove",{id:e,removed:o.removed})}catch(o){w("attachments_remove_failed",{id:e,message:o.message})}vx(e),Xw(e);try{await ai(e,"delete")}catch(o){w("browser_close_failed",{message:o.message})}Ur.delete(e),Ur.delete(e);try{let o=$.clearSession(e);o&&o.stopped&&w("async_cmd_stop_all",{sessionId:e,stopped:o.stopped,reason:"delete"})}catch{}return X=X.filter(function(o){return o!==e}),_e({type:"session_deleted",id:e}),_e(Bt()),w("session_delete",{id:e,wasCurrent:n,tabs:X.length}),{ok:!0,current:fe||"",sessions:re.list()}}function Qa(t){try{if(!t||!t.globalState)return;let e=t.globalState.update("luban.openTabs",{ids:X.slice(),active:fe||"",at:new Date().toISOString()});e&&e.catch&&e.catch(function(){})}catch{}}function $x(t){Se();let e=null;try{e=t&&t.globalState?t.globalState.get("luban.openTabs"):null}catch{e=null}let n=e&&Array.isArray(e.ids)?e.ids.map(String):[];if(!n.length){let r=[];try{r=re.list("workspace",j())}catch{r=[]}let i=r.find(function(a){return(a.items||0)>0})||r[0];i&&n.push(i.id)}let s=[];for(let r of n){if(!/^[A-Za-z0-9_-]+$/.test(r)||V.has(r))continue;let i=null;try{i=re.load(r)}catch{i=null}i&&(V.set(i.id,Hl(i)),Kt.set(i.id,++Dn),s.push(i.id))}if(!s.length){let r=re.create(j());V.set(r.id,r),Kt.set(r.id,++Dn),s.push(r.id),w("session_created",{id:r.id})}X=s;let o=e&&e.active?String(e.active):"";fe=s.indexOf(o)>=0?o:s[s.length-1],w("session_restored",{tabs:s.length,active:fe,items:((V.get(fe)||{}).items||[]).length})}async function we(t,e){let n=Date.now()+(t||8e3);for(;Date.now()<n;){if(E&&e(E))return E;await new Promise(function(s){setTimeout(s,150)})}return E&&e(E)?E:null}var se=null,ce=null,E=null,Ie=null,ml=new WeakSet;function Et(){let t=ce&&ce.webview,e=se&&se.webview;return t&&ce.visible===!0?t:e||(Ie&&(Ie===t||Ie===e)?Ie:t||null)}function pe(t){return t==="panel"?se?se.webview:null:t==="view"?ce?ce.webview:null:Et()||Ie}async function Xx(t){let e=Date.now()+(Number(t)>0?Number(t):6e3);for(;;){let n=Et();if(n)return n;if(Date.now()>=e)return null;await new Promise(function(s){setTimeout(s,100)})}}function Vx(t,e){let n=t;return n?ml.has(n)?Promise.resolve(!0):new Promise(function(s){let o=Date.now()+(Number(e)>0?Number(e):8e3),r=setInterval(function(){if(ml.has(n)){clearInterval(r),s(!0);return}Date.now()>=o&&(clearInterval(r),s(!1))},100)}):Promise.resolve(!1)}var Bo=new Map;function sm(t,e){let n=Ko(e),s=t.asWebviewUri(y.Uri.joinPath(n,"panel.css")),o=t.asWebviewUri(y.Uri.joinPath(n,"panel.js")),r=t.asWebviewUri(y.Uri.joinPath(n,"markdown.js")),i=t.asWebviewUri(y.Uri.joinPath(n,"i18n.js")),a=O.readFileSync(y.Uri.joinPath(n,"panel.html").fsPath,"utf8"),l=Math.random().toString(36).slice(2)+Date.now().toString(36);return a.replace(/{{cspSource}}/g,t.cspSource).replace(/{{cssUri}}/g,String(s)).replace(/{{jsUri}}/g,String(o)).replace(/{{mdUri}}/g,String(r)).replace(/{{i18nUri}}/g,String(i)).replace(/{{lang}}/g,vt||bl()).replace(/{{nonce}}/g,l)}function oi(){return{type:"models",current:js(),models:cn().map(t=>({key:t.key,label:t.provider.name+" \xB7 "+t.model.name,vision:t.model.vision===!0,thinking:Fk(t.model)}))}}function _e(t){let e=[se&&se.webview,ce&&ce.webview];for(let n of e)if(n)try{n.postMessage(t)}catch(s){w("broadcast_failed",{message:s.message})}}function Ho(t,e,n){let s=[se&&se.webview,ce&&ce.webview];for(let o of s){if(!o)continue;let r=Object.assign(Gh(t),n||{},{yank:o===e});try{o.postMessage(r)}catch(i){w("broadcast_failed",{message:i.message})}}}async function om(t,e){let n=String(t||"");if(!/^https?:\/\//i.test(n))return!1;try{return await y.env.openExternal(y.Uri.parse(n)),w("webview_open_link",{source:e,url:n.slice(0,200)}),!0}catch(s){return w("webview_open_link_failed",{url:n.slice(0,200),message:s.message}),!1}}function rm(t,e,n){return Ie=t,t.onDidReceiveMessage(async o=>{if(!(!o||!o.type)){if(Ie=t,ml.add(t),o.type==="ready"){t.postMessage({type:"lang",lang:vt}),t.postMessage(oi()),t.postMessage(Io());let r=[];for(let a of X){let l=V.get(a);if(!l)continue;r.push(a);let c=Gh(l);c.boot=!0,t.postMessage(c)}t.postMessage({type:"open_tabs",ids:r,active:Be.get(t)||fe}),t.postMessage(Bt());let i=es(t);i&&t.postMessage(zh(i)),Zr&&(Zr=!1,t.postMessage({type:"toggle_session_list"})),w("webview_ready",{source:n,tabs:r.length});return}if(o.type==="lang_applied"){E=Object.assign({at:Date.now(),source:n,kind:"lang_applied",n:0},o),w("webview_lang_applied",{source:n,lang:o.lang}),vw(o.lang);return}if(o.type==="new_session"){await qo(o.from||n,t);return}if(o.type==="open_session"){let r=await Ss(String(o.id||""),t);if(!r.ok)try{t.postMessage({type:"error",message:r.error})}catch{}return}if(o.type==="list_sessions"){t.postMessage(Bt());return}if(o.type==="search_sessions"){t.postMessage(Jh(o.q,o.scope,o.root,o.seq));return}if(o.type==="delete_session"){await Gn(String(o.id||""));return}if(o.type==="fork_session"){await zx(String(o.id||""),t,n,!!o.whole);return}if(o.type==="fork_message"){let r=String(o.sessionId||""),i=r?Ro(r):es(t);if(!i&&r)try{i=Se().load(r)}catch{i=null}let a=i?i.id:r,l=function(d){try{t.postMessage({type:"fork_error",sid:a,message:d})}catch{}w("session_fork_failed",{id:a,reason:"fork_message",message:d})};if(!i){l(M("ext.noSuchSession",{id:a}));return}if(Me.has(i.id)){l(M("ext.forkBusy"));return}let c=Lp(i.items||[],o.uid?String(o.uid):"",Number(o.ordinal));if(c<0){l(M("ext.forkMissing"));return}let u=si(i,c,t,"fork_message");u.ok||l(u.error||M("ext.forkEmpty"));return}if(o.type==="save_session_meta"){let r=Ro(o.id);r&&(pi(o.modelKey,o.mode,r),zl(r));return}if(o.type==="tab_active"){let r=String(o.id||"");V.has(r)&&(fe=r,Be.set(t,r),X.indexOf(r)<0&&X.push(r),Qa(e));return}if(o.type==="tab_close"){let r=String(o.id||""),i=V.get(r),a=Rh(r);if(i){Pp(i),ni(r),Me.delete(r),Ue(i);let l=Pt.get(r);l&&(clearTimeout(l),Pt.delete(r)),Kt.set(r,++Dn),V.delete(r),Fh(r,a)}Bo.delete(r),X=X.filter(function(l){return l!==r}),Qa(e),_e({type:"tab_removed",id:r}),_e(Bt()),w("tab_closed",{id:r,tabs:X.length});return}if(o.type==="tabs_changed"){let r=(Array.isArray(o.ids)?o.ids.map(String):[]).filter(function(c){return V.has(c)}),i=X.filter(function(c){return r.indexOf(c)<0&&V.has(c)});X=r.concat(i);let a=String(o.active||""),l=a&&V.has(a)?a:X.indexOf(fe)<0?X.length?X[X.length-1]:"":fe;fe=l,l?Be.set(t,l):Be.delete(t),Qa(e);return}if(o.type==="ack_rendered"){E=Object.assign({at:Date.now(),source:n},o),w("webview_ack",Object.assign({source:n},o));return}if(o.type==="setModel"){et.defaultModel=o.modelKey,w("webview_set_model",{modelKey:o.modelKey});return}if(o.type==="listFiles"){try{let r=await Cl();t.postMessage({type:"fileList",files:r.files,dirs:r.dirs})}catch(r){t.postMessage({type:"fileList",files:[],dirs:[],error:r.message}),w("webview_list_files_failed",{message:r.message})}return}if(o.type==="getSelection"){t.postMessage(Object.assign({type:"selectionInfo"},oh()));return}if(o.type==="openLink"){await om(o.url,n);return}if(o.type==="open_settings"){Wl(e),w("webview_open_settings",{source:n});return}if(o.type==="stop"){let r=Mt(o,t);if(!r){w("stale_session_hit",{type:"stop",id:String(o.sessionId||"")});return}Pp(r)&&(Ue(r),Ut(r),w("queue_paused",{id:r.id,size:ft(r).length})),ni(r.id);return}if(o.type==="answer_question"){let r=Mt(o,t),i=r?r.id:String(o.sessionId||""),a=em(o.id,o.answers,i);if(a.ok)w("ask_answered",{id:o.id,sess:i});else{try{t.postMessage({type:"ask_question_error",sid:i||void 0,id:o.id,message:a.error||"\u7B54\u9898\u5931\u8D25"})}catch{}w("ask_answer_failed",{id:o.id,error:a.error})}return}if(o.type==="review_action"){let r;try{r=await Do(o.action,o.path,o.hunk||"")}catch(i){r={ok:!1,error:i.message}}try{t.postMessage(Io())}catch{}w("review_action",{source:n,action:o.action,path:o.path,hunk:o.hunk||"",ok:!!r.ok,error:r.error,files:J.size,hunks:en()});return}if(o.type==="img_preview"){let r=String(o.sessionId||""),i=String(o.file||""),a=Z.readPreview(r,i);try{t.postMessage({type:"img_preview",ok:!!a.ok,sessionId:r,file:i,dataUrl:a.dataUrl||"",mime:a.mime||""})}catch{}w("img_preview",{source:n,ok:!!a.ok,error:a.error||"",file:i.slice(0,60)});return}if(o.type==="copy_text"){let r=String(o.text||""),i=!0;try{await y.env.clipboard.writeText(r)}catch{i=!1}try{t.postMessage({type:"copy_done",ok:i,n:r.length})}catch{}w("copy_text",{source:n,n:r.length,ok:i});return}if(o.type==="open_plan_file"){try{await Zh(o.path),w("plan_file_opened",{source:n,path:o.path,ok:!0})}catch(r){w("plan_file_opened",{source:n,path:o.path,ok:!1,error:r.message})}return}if(o.type==="execute_plan"){let r=Mt(o,t);if(!r){try{t.postMessage({type:"error",sid:String(o.sessionId||""),message:M("ext.noSuchSession",{id:String(o.sessionId||"")})})}catch{}return}if(Me.has(r.id)){w("webview_busy",{prompt:"execute_plan",session:r.id});try{t.postMessage({type:"error",sid:r.id,message:M("ext.sessionBusy")})}catch{}return}await _o("execute_plan",Object.assign({},o,{sessionId:r.id}),t,n);return}if(o.type==="ask"){let r=Mt(o,t);if(!r){try{t.postMessage({type:"error",sid:String(o.sessionId||""),message:M("ext.noSuchSession",{id:String(o.sessionId||"")})})}catch{}return}if(Me.has(r.id)){Op(r,Object.assign({},o,{echoed:!0}));return}await _o("ask",Object.assign({},o,{sessionId:r.id}),t,n);return}if(o.type==="edit_message"){let r=Mt(o,t),i=!!o.resend,a=function(x,b){try{t.postMessage({type:"edit_error",sid:r?r.id:String(o.sessionId||""),message:M(x,b)})}catch{}};if(!r){a("ext.noSuchSession",{id:String(o.sessionId||"")});return}if(Me.has(r.id)){a("ext.editBusy");return}let l=String(o.text==null?"":o.text).trim();if(!l){a("ext.editEmpty");return}let c=r.items||[],u=o.uid?String(o.uid):"",d=Number(o.ordinal),f=Lp(c,u,d);if(f<0){a("ext.editMissing");return}let p=c[f]||{},h={t:"user",text:l,web:!!p.web};u&&(h.uid=u),Array.isArray(p.images)&&p.images.length&&(h.images=p.images);let m=c.length-(f+1);i?c.length=f:(c[f]=Lt.clampItem(h),c.length=f+1),f===0&&(r.title=""),Ue(r),Ho(r,null,{keepScroll:!0}),_e(Bt()),_e({type:"edit_done",sid:r.id,removed:m,resend:i}),w("session_edit",{source:n,id:r.id,removed:m,uid:u,ordinal:d,resend:i}),i&&(_e({type:"queue_start",id:r.id,item:{text:l,web:!!p.web,uid:u,images:p.images||[],mode:o.mode,modelKey:o.modelKey}}),await _o("ask",{prompt:l,webSearch:!!p.web,mode:o.mode,modelKey:o.modelKey,sessionId:r.id,thinking:o.thinking,verbosity:o.verbosity,uid:u,images:p.images||[]},t,n));return}if(o.type==="queue_add"){let r=Mt(o,t);if(!r){w("stale_session_hit",{type:"queue_add",id:String(o.sessionId||"")});return}if(!Me.has(r.id)){let a=fi({id:Kl(),text:o.prompt,web:o.webSearch,mode:o.mode,modelKey:o.modelKey,thinking:o.thinking,verbosity:o.verbosity,at:Date.now(),uid:o.uid,images:Jl(r,o.images,o.modelKey)});if(!a)return;_e({type:"queue_start",id:r.id,item:a}),Ut(r),await _o("ask",{prompt:a.text,webSearch:a.web,mode:a.mode,modelKey:a.modelKey,sessionId:r.id,thinking:a.thinking,verbosity:a.verbosity,uid:a.uid,images:a.images||[]},t,n);return}let i=Op(r,o);if(!i.ok)try{t.postMessage({type:"queue_error",id:r.id,message:i.error})}catch{}return}if(o.type==="queue_remove"){let r=Mt(o,t);if(!r){w("stale_session_hit",{type:"queue_remove",id:String(o.sessionId||"")});return}Mx(r,o.id);return}if(o.type==="queue_clear"){let r=Mt(o,t);if(!r){w("stale_session_hit",{type:"queue_clear",id:String(o.sessionId||"")});return}Cx(r);return}if(o.type==="queue_resume"){let r=Mt(o,t);if(!r)return;r.queuePaused=!1,Ue(r),Ut(r),w("queue_resume",{id:r.id,size:ft(r).length}),Me.has(r.id)||Gl(r,t,n);return}if(o.type==="queue_run_now"){let r=Mt(o,t);if(!r){w("stale_session_hit",{type:"queue_run_now",id:String(o.sessionId||"")});try{t.postMessage({type:"queue_error",id:"",message:M("ext.noSuchSession",{id:String(o.sessionId||"")})})}catch{}return}let i=Ex(r,o.id,t,n);if(!i.ok)try{t.postMessage({type:"queue_error",id:r.id,message:i.error||M("ext.queueMissing")})}catch{}return}}})}function gl(t){if(se)return se.reveal(),se;let e=y.window.createWebviewPanel("luban","Luban",y.ViewColumn.Beside,{enableScripts:!0,retainContextWhenHidden:!0,localResourceRoots:[Ko(t.extensionUri)]});e.webview.html=sm(e.webview,t.extensionUri),se=e;let n=rm(e.webview,t,"panel");return e.onDidDispose(()=>{se=null,Ie===e.webview&&(Ie=null),Be.delete(e.webview),n.dispose(),w("panel_disposed",{ok:!0})}),w("panel_opened",{ok:!0}),e}function Yx(t){let e={resolveWebviewView(n){ce=n,n.webview.options={enableScripts:!0,localResourceRoots:[Ko(t.extensionUri)]},n.webview.html=sm(n.webview,t.extensionUri),rm(n.webview,t,"view"),n.onDidDispose(()=>{Ie===n.webview&&(Ie=null),Be.delete(n.webview),ce=null}),w("view_resolved",{ok:!0})}};try{let n=y.window.registerWebviewViewProvider("luban.chatView",e,{webviewOptions:{retainContextWhenHidden:!0}});return w("view_provider_registered",{ok:!0}),n}catch(n){return w("view_provider_failed",{message:n.message}),{dispose:function(){}}}}var sn={busy:!1,stamps:[],enabled:!1,last:""};function hi(){let t={enabled:!1,maxPerMinute:30,debounceMs:250};try{let e=y.workspace.getConfiguration("luban"),n=e.get("inlineCompletion.enabled");n!=null&&(t.enabled=!!n);let s=Number(e.get("inlineCompletion.maxPerMinute"));isFinite(s)&&s>=1&&(t.maxPerMinute=Math.floor(s));let o=Number(e.get("inlineCompletion.debounceMs"));isFinite(o)&&o>=0&&(t.debounceMs=Math.floor(o))}catch{}return t}function vo(t){return new Promise(function(e){setTimeout(e,Math.max(0,Number(t)||0))})}function Ip(t){let e=Date.now();return sn.stamps=sn.stamps.filter(function(n){return e-n<6e4}),sn.stamps.length<t}async function Zx(t,e,n,s){let o=hi();if(!o.enabled)return[];let r=function(i){return w("inline_completion",{skipped:i,chars:0}),[]};try{if(!t||!t.uri||t.uri.scheme!=="file")return r("scheme");if(!e)return r("no-position");if(e.line===0&&e.character===0)return r("file-start");let i=t.getText();if(i.length>1024*1024)return r("too-large");let a=Ae(js());if(!a||!qr(a.provider))return r("provider-unsupported");if(sn.busy)return r("busy");if(!Ip(o.maxPerMinute))return r("rate-limit");if(await vo(o.debounceMs),s&&s.isCancellationRequested)return r("cancelled");if(!Ip(o.maxPerMinute))return r("rate-limit");sn.busy=!0,sn.stamps.push(Date.now());let l=Date.now(),c;try{c=await Gp({modelKey:a.key,path:Ot(t.uri.fsPath,j()),text:i,offset:t.offsetAt(e),signal:s})}catch(u){return w("inline_completion",{ms:Date.now()-l,chars:0,error:String(u&&u.message||u).slice(0,160)}),[]}finally{sn.busy=!1}return sn.last=c.text||"",w("inline_completion",{ms:Date.now()-l,chars:(c.text||"").length,model:c.model,promptChars:c.promptChars,suffixChars:c.suffixChars,timeout:!1}),c.text?typeof y.InlineCompletionItem!="function"?[]:[new y.InlineCompletionItem(c.text,new y.Range(e,e))]:[]}catch(i){return sn.busy=!1,w("inline_completion_failed",{message:String(i&&i.message||i).slice(0,160)}),[]}}function Qx(t){if(!y.languages||typeof y.languages.registerInlineCompletionItemProvider!="function"){w("inline_provider_unsupported",{ok:!1});return}try{let e={provideInlineCompletionItems:Zx};t.subscriptions.push(y.languages.registerInlineCompletionItemProvider({pattern:"**"},e)),w("inline_provider_registered",{enabled:hi().enabled})}catch(e){w("inline_provider_failed",{message:String(e&&e.message||e).slice(0,160)})}}async function eS(){let e=!hi().enabled;try{await y.workspace.getConfiguration("luban").update("inlineCompletion.enabled",e,y.ConfigurationTarget.Global),w("inline_toggle",{enabled:e});try{y.window.showInformationMessage(M(e?"ext.inlineOn":"ext.inlineOff"))}catch{}}catch(n){w("inline_toggle_failed",{message:String(n&&n.message||n).slice(0,160)})}return e}function tS(t){Nr("activate"),Fr(),w("activate",{at:new Date().toISOString(),root:j(),configSource:As,models:cn().length}),Je.configure({root:j(),rec:w});try{Je.refresh(j())}catch(n){w("skills_scan_failed",{message:n.message})}xe.configure({root:j(),version:Mo,rec:w}),xe.start().then(function(n){w("mcp_start_done",{servers:n.servers.length,tools:n.tools.length})},function(n){w("mcp_start_failed",{message:n.message})}),ul(t).then(function(n){w("secrets_ready",{keys:n}),dl()}),Co(y.window.activeTextEditor),t.subscriptions.push(y.window.onDidChangeActiveTextEditor(Co)),t.subscriptions.push(y.window.onDidChangeTextEditorSelection(function(n){Co(n.textEditor)}));try{$x(t)}catch(n){w("session_restore_failed",{message:n.message})}try{let n=new Set(X.slice());for(let o of V.values())n.add(o.id);for(let o of re.list())n.add(o.id);let s=Z.sweepOrphans(n);s.removed&&w("attachments_sweep",s)}catch(n){w("attachments_sweep_failed",{message:n.message})}t.subscriptions.push(y.commands.registerCommand("luban.openPanel",()=>gl(t))),t.subscriptions.push(y.commands.registerCommand("luban.providerSettings",()=>Wl(t))),t.subscriptions.push(y.commands.registerCommand("luban.dashboard",()=>Nh(t))),t.subscriptions.push(y.commands.registerCommand("luban.openInBrowser",async n=>{let s=Array.isArray(n)?n[0]:n;await om(s&&typeof s=="object"?s.linkUrl:"","context")})),t.subscriptions.push(y.commands.registerCommand("luban.browserCheck",async()=>{let n=Ps(),s=Pe.findChrome(n.chromePath);if(!s.path){y.window.showErrorMessage(M("ext.browserNotFound",{paths:s.tried.slice(0,4).map(function(o){return" "+o}).join(`
|
|
835
|
+
`)}));return}await y.window.withProgress({location:y.ProgressLocation.Notification,title:M("ext.browserCheckRunning"),cancellable:!1},async function(){let o=null;try{o=await Pe.launch({exe:n.chromePath,headless:n.headless,width:n.width,height:n.height}),await o.navigate("data:text/html,<title>Luban</title><h1>Luban browser check</h1>");let r=await o.snapshot(1200),i=await o.screenshot({});w("browser_check",{ok:!0,exe:o.exe,snapChars:r.length,shotChars:i.length}),y.window.showInformationMessage(M("ext.browserCheckOk",{exe:s.path,chars:String(Math.round(i.length/1024))}))}catch(r){w("browser_check",{ok:!1,message:String(r&&r.message||r)}),y.window.showErrorMessage(M("ext.browserCheckFailed",{message:String(r&&r.message||r)}))}finally{if(o)try{await o.close()}catch{}}})})),Qx(t),t.subscriptions.push(y.commands.registerCommand("luban.inlineCompletion.toggle",eS)),t.subscriptions.push(y.commands.registerCommand("luban.focusView",async()=>{try{await y.commands.executeCommand("workbench.view.extension.luban"),w("focus_view",{ok:!0})}catch(n){w("focus_view",{ok:!1,message:n.message})}})),t.subscriptions.push(Yx(t)),Dk(t),t.subscriptions.push(y.commands.registerCommand("luban.agent",async()=>{let n=await y.window.showInputBox({prompt:M("ext.agentPrompt")});n&&await y.window.withProgress({location:y.ProgressLocation.Notification,title:"Luban agent"},async s=>{let o=es(Et()),r=tn(o&&o.items||[],"",{resolveImage:nn(o)}),i=await ln(n,{root:j(),history:r.messages,sessionId:o?o.id:"",onProgress:a=>s.report({message:a})});il({modelKey:js(),mode:"agent",source:"command",session:o?o.id:""},i.usage),y.window.showInformationMessage(M("ext.agentDone",{n:i.log.length}))})})),t.subscriptions.push(y.commands.registerCommand("luban.reloadConfig",async()=>{Fr(),await ul(t),_e(oi()),dl();try{Je.configure({root:j(),rec:w}),Je.refresh(j())}catch(s){w("skills_scan_failed",{message:s.message})}let n="";try{xe.configure({root:j(),version:Mo,rec:w});let s=await xe.reload();n=M("ext.mcpNote",{servers:s.servers.length,tools:s.tools.length})}catch(s){n=M("ext.mcpFail",{msg:s.message}),w("mcp_reload_failed",{message:s.message})}y.window.showInformationMessage(M("ext.configReloaded",{models:cn().length,skills:Je.list().length})+n)})),t.subscriptions.push(y.commands.registerCommand("luban.newSession",async()=>{await qo("command"),await je(),y.window.setStatusBarMessage(M("ext.newSessionNotice"),2e3)})),t.subscriptions.push(y.commands.registerCommand("luban.cursorPlan",Jx)),t.subscriptions.push(y.commands.registerCommand("luban.sessionList",async()=>{Zr=!0,await je()&&Et()&&(Zr=!1,_e({type:"toggle_session_list"}))})),t.subscriptions.push(y.commands.registerCommand("luban.mode.cycle",async()=>{await je();let n=Et();n&&n.postMessage({type:"cycle_mode"})}));async function e(n,s,o){let r=(Array.isArray(o)&&o.length?o:s?[s]:[]).filter(function(u){return u&&u.scheme==="file"}),i=j(),a=[];for(let u of r){let d=nh(u.fsPath,i);d&&a.push(d)}if(!a.length)return;let l=await je(),c=Et();if(!l||!c){y.window.showWarningMessage(M("ext.addFileNoView")),w("add_"+n+"_to_chat_failed",{n:a.length,reason:"no_webview"});return}c.postMessage({type:"insert_ref",text:a.join(""),n:a.length}),w("add_"+n+"_to_chat",{n:a.length})}t.subscriptions.push(y.commands.registerCommand("luban.addFileToChat",(n,s)=>e("file",n,s))),t.subscriptions.push(y.commands.registerCommand("luban.addFolderToChat",(n,s)=>e("folder",n,s))),t.subscriptions.push(y.commands.registerCommand("luban.addSelectionToChat",async()=>{let n=sh(j());if(!n){y.window.showWarningMessage(M("ext.addSelectionNone")),w("add_selection_to_chat_failed",{reason:"no_selection"});return}let s=await je(),o=Et();if(!s||!o){y.window.showWarningMessage(M("ext.addFileNoView")),w("add_selection_to_chat_failed",{reason:"no_webview"});return}o.postMessage({type:"insert_ref",text:n,n:1}),w("add_selection_to_chat")})),t.subscriptions.push(y.workspace.onDidChangeConfiguration(function(n){if(n&&n.affectsConfiguration&&n.affectsConfiguration("luban.sessionHistory.max"))try{Se().setMax(Bh())}catch{}n&&n.affectsConfiguration&&n.affectsConfiguration("luban.sessionMemory")&&w("session_memory_config",$n()),n&&n.affectsConfiguration&&n.affectsConfiguration("luban.language")&&Nr("config"),n&&n.affectsConfiguration&&n.affectsConfiguration("luban")&&$e&&hx()})),t.subscriptions.push(y.workspace.onDidChangeWorkspaceFolders(function(){let n=j();Je.configure({root:n,rec:w});try{Je.refresh(n)}catch(s){w("skills_scan_failed",{message:s.message})}xe.configure({root:n,version:Mo,rec:w}),xe.reload().then(function(s){w("mcp_reload_done",{servers:s.servers.length,tools:s.tools.length})},function(s){w("mcp_reload_failed",{message:s.message})})}));try{let n=y.workspace.getConfiguration("luban").get("autoOpen");w("auto_open_decided",{autoOpen:n}),n!==!1&&setTimeout(function(){y.commands.executeCommand("workbench.view.extension.luban").then(function(){w("auto_open_view",{ok:!0})},function(s){w("auto_open_view",{ok:!1,message:String(s&&s.message)})})},1200)}catch(n){w("auto_open_view",{ok:!1,message:n.message})}iS(t)}function mi(){let t={pass:0,fail:0,failed:[],checks:{}};return t.ok=function(e,n,s){let o=!!n;return o?t.pass++:(t.fail++,t.failed.push(e+(s?" :: "+s:""))),t.checks[e]=o,o},t}function nS(){let t=mi(),e=O.mkdtempSync(P.join(dt.tmpdir(),"luban-fs-op-")),n=function(s,o){let r=P.join(e,s);O.mkdirSync(P.dirname(r),{recursive:!0}),O.writeFileSync(r,o)};try{n("a.js",`const foo1 = 1;
|
|
836
|
+
const foo2 = 2;
|
|
837
|
+
`),n("src/b.ts",`export const bar = foo1;
|
|
838
|
+
`),n("src/deep/c.md",`foo(123)
|
|
839
|
+
`),n("node_modules/dep/index.js",`foo9
|
|
840
|
+
`),n(".hidden/h.js",`fooHidden
|
|
841
|
+
`);let s=ze.glob(e,["**/*.js"]).matches.map(function(l){return l.rel});t.ok("glob_js",s.indexOf("a.js")>=0,s.join(",")),t.ok("glob_skip_deps",s.every(function(l){return l.indexOf("node_modules")!==0}),s.join(",")),t.ok("glob_skip_hidden",s.every(function(l){return l.indexOf(".hidden")!==0}),s.join(",")),t.ok("glob_braces",ze.glob(e,["**/*.{md,ts}"]).matches.length===2),t.ok("glob_negate",ze.glob(e,["**/*.js","!a.js"]).matches.length===0);let o=ze.glob(P.join(e,"src"),["**/*.ts"],{prefix:"src"});t.ok("glob_prefix",o.matches[0]&&o.matches[0].rel==="src/b.ts",JSON.stringify(o.matches.map(function(l){return l.rel})));let r=ze.grep(e,"foo\\d");t.ok("grep_regex",r.hits.length===3&&r.hits.every(function(l){return l.rel==="a.js"||l.rel==="src/b.ts"}),JSON.stringify(r.hits.map(function(l){return l.rel+":"+l.line}))),t.ok("grep_skip_deps",ze.grep(e,"foo9").hits.length===0),t.ok("grep_bad_regex",!!ze.grep(e,"(").error),t.ok("grep_empty_pattern",!!ze.grep(e,"").error);let i=ze.formatGrep(ze.grep(e,"bar",{contextLines:1}));t.ok("grep_ctx_hit_line",/^\d+: /m.test(i),i),t.ok("grep_ctx_lines",/^ \d+: /m.test(i),i);let a=ze.grep(P.join(e,"src"),"bar",{prefix:"src"});t.ok("grep_prefix",a.hits[0]&&a.hits[0].rel==="src/b.ts",JSON.stringify(a.hits.map(function(l){return l.rel})))}finally{try{O.rmSync(e,{recursive:!0,force:!0})}catch{}}return t}async function im(){let t=mi(),e=O.mkdtempSync(P.join(dt.tmpdir(),"luban-fsskip-")),n=function(r,i){let a=P.join(e,r);O.mkdirSync(P.dirname(a),{recursive:!0}),O.writeFileSync(a,i)},s=async function(r){return String(await At("read_file",{path:r},e,null,{}))},o=async function(r,i){try{return await At(r,i,e,null,{}),""}catch(a){return String(a.message||"")}};try{n("a.js",`const ok = 1;
|
|
842
|
+
`),n(".gitignore",`node_modules
|
|
843
|
+
`),n("target",`a-file-named-target
|
|
844
|
+
`),n("node_modules/dep/index.js",`module.exports = 1;
|
|
845
|
+
`),n("pkg/sub/target/gen.txt",`generated
|
|
846
|
+
`),n("src/nested/node_modules/inner.js",`inner
|
|
847
|
+
`),n("dist/bundle.js",`bundle
|
|
848
|
+
`),n("docs/readme.md",`hi
|
|
849
|
+
`),n("npm-cache/_npx/81dd2fe1/node_modules/mssql-mcp-reader/package.json",`{ "name": "x" }
|
|
850
|
+
`),n(".m2/repository/org/apache/x/1/x-1.pom",`<project/>
|
|
851
|
+
`);let r=await s("a.js");t.ok("read_plain",r.indexOf("const ok = 1;")>=0,r);let i=await s(".gitignore");t.ok("read_root_dotfile",i.indexOf("node_modules")>=0,i);let a=await s("target");t.ok("read_file_named_as_skipdir",a.indexOf("a-file-named-target")>=0,a);let l=await s("node_modules/dep/index.js");t.ok("skip_node_modules",l.indexOf("\u8DF3\u8FC7")>=0&&l.indexOf("module.exports")<0,l);let c=await s("pkg/sub/target/gen.txt");t.ok("skip_nested_target",c.indexOf("\u8DF3\u8FC7")>=0,c);let u=await s("src/nested/node_modules/inner.js");t.ok("skip_nested_nm",u.indexOf("\u8DF3\u8FC7")>=0,u);let d=await s(P.join(e,"dist/bundle.js"));t.ok("skip_abs_path",d.indexOf("\u8DF3\u8FC7")>=0,d);let f=await s("npm-cache/_npx/81dd2fe1/node_modules/mssql-mcp-reader/package.json");t.ok("skip_npm_cache",f.indexOf("\u8DF3\u8FC7")>=0&&f.indexOf('"name"')<0,f);let p=await s(".m2/repository/org/apache/x/1/x-1.pom");t.ok("skip_m2_repo",p.indexOf("\u8DF3\u8FC7")>=0&&p.indexOf("<project/>")<0,p);let h=await s("docs/readme.md");t.ok("read_plain_dir",h.indexOf("hi")>=0,h);let m=await o("write_file",{path:"node_modules/dep/patch.js",content:`patched
|
|
852
|
+
`});t.ok("write_blocked",m.indexOf("\u8DF3\u8FC7")>=0&&m.indexOf("node_modules")>=0,m);let x=await o("replace_in_file",{path:"dist/bundle.js",old_string:"bundle",new_string:"x"});t.ok("replace_blocked",x.indexOf("\u8DF3\u8FC7")>=0,x);let b=await o("delete_file",{path:"pkg/sub/target/gen.txt"});t.ok("delete_blocked",b.indexOf("\u8DF3\u8FC7")>=0,b);let k=await o("move_file",{from:"node_modules/dep/index.js",to:"copied.js"});t.ok("move_blocked",k.indexOf("\u8DF3\u8FC7")>=0,k);let S=await o("apply_patch",{patch:`*** Begin Patch
|
|
853
|
+
*** Add File: node_modules/dep/new.js
|
|
854
|
+
+new
|
|
855
|
+
*** End Patch`});t.ok("patch_blocked",S.indexOf("\u8DF3\u8FC7")>=0,S);let T=await o("write_file",{path:"npm-cache/_npx/81dd2fe1/patched.js",content:`x
|
|
856
|
+
`});t.ok("write_blocked_cache",T.indexOf("\u8DF3\u8FC7")>=0&&T.indexOf("npm-cache")>=0,T);let g=await o("write_file",{path:".m2/repository/org/apache/x/1/pom.xml",content:`x
|
|
857
|
+
`});t.ok("write_blocked_m2",g.indexOf("\u8DF3\u8FC7")>=0&&g.indexOf(".m2")>=0,g),t.ok("blocked_no_write",!O.existsSync(P.join(e,"node_modules/dep/patch.js"))&&!O.existsSync(P.join(e,"node_modules/dep/new.js"))&&!O.existsSync(P.join(e,"npm-cache/_npx/81dd2fe1/patched.js"))&&!O.existsSync(P.join(e,".m2/repository/org/apache/x/1/pom.xml")));let _=await o("list_files",{dir:"node_modules"});t.ok("list_dir_blocked",_.indexOf("\u8DF3\u8FC7")>=0,_);let v=function(L){return On.pathGuard(L)};t.ok("cmd_guard_npm_cache",!!v('cat "C:/Users/x/AppData/Local/npm-cache/_npx/a.js"'),""),t.ok("cmd_guard_npx_dir",!!v("find /c/Users/x/.npm/_npx -maxdepth 3 -name y"),""),t.ok("cmd_guard_m2",!!v('find ~/.m2 -name "*.pom"'),""),t.ok("cmd_guard_pwsh",!!v('powershell -NoProfile -Command "Select-String -Path C:\\x\\npm-cache\\_npx\\a.js"'),""),t.ok("cmd_guard_allow_exec",!v("node node_modules/.bin/tsc --noEmit"),""),t.ok("cmd_guard_allow_exclude",!v("grep -rn --exclude-dir=node_modules foo ."),""),t.ok("cmd_guard_allow_findpath",!v('find . -path "./node_modules/*" -prune -o -name "*.js" -print'),"");let A=String(await At("run_command",{command:"cat npm-cache/_npx/81dd2fe1/package.json"},e,null,{}));t.ok("cmd_guard_wired",A.indexOf("\u8DF3\u8FC7\u76EE\u5F55")>=0,A);let C=be("node_modules/dep/index.js",e,!0);t.ok("allowSkipped_bypass",C===P.join(e,"node_modules/dep/index.js"),C)}finally{try{O.rmSync(e,{recursive:!0,force:!0})}catch{}}return t}function sS(){let t=mi(),e=O.mkdtempSync(P.join(dt.tmpdir(),"luban-patch-op-")),n=function(o,r){let i=P.join(e,o);O.mkdirSync(P.dirname(i),{recursive:!0}),O.writeFileSync(i,r)},s=function(o){return O.readFileSync(P.join(e,o),"utf8")};try{n("a.js",`const a = 1;
|
|
858
|
+
const b = 2;
|
|
859
|
+
`),n("old.js",`legacy
|
|
860
|
+
`);let o=["*** Begin Patch","*** Add File: new.js","+const fresh = true;","*** Update File: a.js","@@"," const a = 1;","-const b = 2;","+const b = 20;","*** Delete File: old.js","*** End Patch"].join(`
|
|
861
|
+
`),r=xt.parsePatch(o);t.ok("patch_parse",!r.error&&r.ops.length===3,r.error);let i=xt.validatePatch(e,r);if(t.ok("patch_validate",i.ok,i.error),i.ok){t.ok("patch_update_content",i.plan[1].content===`const a = 1;
|
|
862
|
+
const b = 20;
|
|
863
|
+
`,JSON.stringify(i.plan[1].content));let c=xt.applyPatch(e,r);t.ok("patch_apply",c.ok,c.error),t.ok("patch_add_on_disk",s("new.js")===`const fresh = true;
|
|
864
|
+
`,JSON.stringify(s("new.js"))),t.ok("patch_update_on_disk",s("a.js")===`const a = 1;
|
|
865
|
+
const b = 20;
|
|
866
|
+
`,JSON.stringify(s("a.js"))),t.ok("patch_delete_on_disk",!O.existsSync(P.join(e,"old.js")))}n("ctx.js",`alpha
|
|
867
|
+
beta
|
|
868
|
+
`);let a=xt.validatePatch(e,xt.parsePatch(`*** Begin Patch
|
|
869
|
+
*** Update File: ctx.js
|
|
870
|
+
@@
|
|
871
|
+
alpha
|
|
872
|
+
-gamma
|
|
873
|
+
+delta
|
|
874
|
+
*** End Patch`));t.ok("patch_bad_context",!a.ok&&/找不到/.test(a.error),a.error),t.ok("patch_no_write_on_fail",s("ctx.js")===`alpha
|
|
875
|
+
beta
|
|
876
|
+
`,JSON.stringify(s("ctx.js")));let l=xt.validatePatch(e,xt.parsePatch(`*** Begin Patch
|
|
877
|
+
*** Delete File: whatever.js
|
|
878
|
+
*** End Patch`),{resolve:function(c){throw new Error("\u8DEF\u5F84\u8D8A\u754C\uFF1A"+c)}});t.ok("patch_resolve_guard",!l.ok&&/越界/.test(l.error),l.error),t.ok("patch_dup",!xt.validatePatch(e,xt.parsePatch(`*** Begin Patch
|
|
879
|
+
*** Add File: d.js
|
|
880
|
+
+a
|
|
881
|
+
*** Add File: d.js
|
|
882
|
+
+b
|
|
883
|
+
*** End Patch`)).ok),t.ok("patch_no_begin",!!xt.parsePatch(`*** Add File: x
|
|
884
|
+
+y`).error)}finally{try{O.rmSync(e,{recursive:!0,force:!0})}catch{}}return t}function oS(){let t=mi(),e=function(a,l,c,u,d){return{severity:a,range:{start:{line:l,character:0},end:{line:l,character:3}},message:c,source:u,code:d}},n={"/a.js":[e(0,9,"Unexpected token '}'","eslint","E999"),e(1,2,"unused var","eslint")],"/b.ts":[e(0,0,"Type error","tsc","TS2345")]},s=an.summarize(n);t.ok("lints_summary",s.total===3&&s.error===2&&s.warning===1,JSON.stringify(s));let o=an.formatLints(n);t.ok("lints_error_first",o.indexOf("ERROR")<o.indexOf("WARNING"),o),t.ok("lints_line_base",/\/a\.js:10:1/.test(o),o),t.ok("lints_source",/\[eslint E999\]/.test(o),o),t.ok("lints_empty",/没有诊断/.test(an.formatLints({})));let r={"/x.js":[]};for(let a=0;a<30;a++)r["/x.js"].push(e(1,a,"w"+a));let i=an.formatLints(r,{maxDiags:5});return t.ok("lints_truncate",(i.match(/^WARNING/gm)||[]).length===5,String((i.match(/^WARNING/gm)||[]).length)),t}var rS=["ping","tab_probe","session_probe","review_probe","reset","toggle_session_list","cycle_mode","insert_ref"];function iS(t){let e=Dr+"/cmd.json",n=Dr+"/cmd_result.json";setInterval(async()=>{let s;try{if(!O.existsSync(e))return;s=JSON.parse(O.readFileSync(e,"utf8"))}catch{return}try{O.unlinkSync(e)}catch{}let o={op:s.op||s.cmd,at:new Date().toISOString()};try{if(s.op==="models")o.ok=!0,o.result=cn().map(r=>({key:r.key,baseUrl:r.provider.baseUrl,keyFound:!!Os(r.provider),keyless:Es(r.provider)&&!Rr(r.provider),toolCalling:r.model.toolCalling!==!1,vision:r.model.vision===!0,webSearch:zp(r.provider),webEngine:Ct(r.provider)}));else if(s.op==="i18n"){let r="auto";try{r=y.workspace.getConfiguration("luban").get("language")||"auto"}catch{}o.ok=!0,o.result={lang:vt,setting:r,vscodeLanguage:y.env&&y.env.language||"",samples:{ready:M("panel.statusReady"),send:M("panel.send"),close:M("panel.menuClose"),execPlan:M("cross.execPlan"),saved:M("settings.saved",{n:2}),range7d:M("usage.7d"),lensKeep:M("ext.keepHunk",{add:3,del:1}),execSummary:M("ext.summary.exec",{n:4,s:"1.2"}),queueFull:M("ext.queueFull",{n:20})}}}else if(s.op==="i18nset"){let r=String(s.lang||"auto");await y.workspace.getConfiguration("luban").update("language",r,y.ConfigurationTarget.Global);let i=null;if(se||ce){let l=Tw(s.waitMs||8e3);Nr("headless"),i=await l}else Nr("headless");let a=Bp(r,y.env&&y.env.language);o.ok=vt===a&&(se||ce?!!i:!0),o.result={setting:r,lang:vt,expected:a,ack:i},!o.ok&&!i&&(se||ce)&&(o.error="\u804A\u5929\u9762\u677F\u6CA1\u6709\u786E\u8BA4\u8BED\u8A00\u5207\u6362")}else if(s.op==="i18ntest"){await je();let r=pe(s.to);if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"i18n_selftest"});let i=await we(s.waitMs||15e3,function(a){return String(a.kind||"").indexOf("i18n_selftest")===0});o.ok=!!(i&&i.kind==="i18n_selftest_ok"),i||(o.error="i18n \u81EA\u68C0\u6CA1\u6709\u56DE\u5E94"),o.result={ack:i,lang:vt}}}else if(s.op==="websearch"){let r=Ae(s.modelKey),i=await xl(s.query||"DeepSeek",r,{count:s.count,needContent:!!s.need_content});o.ok=!0,o.result={query:i.query,count:i.results.length,engine:Ct(r&&r.provider),items:i.results.slice(0,5).map(function(a){return{title:a.title,url:a.url,date:a.date,site:a.site_name,score:a.rerank_score}}),text:Sl(i.results,i.query).slice(0,600)}}else if(s.op==="webfetch"){let r=Ae(s.modelKey),i=await Yp(s.url,r,{});o.ok=!0,o.result={url:i.url,title:i.title,chars:i.fullChars,head:i.content.slice(0,300),engine:Ct(r&&r.provider)}}else if(s.op==="bingtest"){let r=String(s.case||"parse");if(r==="parse"){let i=["<rss><channel>","<item><title><![CDATA[Node.js <b>v22</b> \u53D1\u5E03]]></title><link>https://nodejs.org/en/blog/keep?a=1&b=2</link>","<description>LTS & Current — \u90FD\u652F\u6301 <script> \u6807\u7B7E</description><pubDate>Fri, 29 Oct 2026 00:00:00 GMT</pubDate></item>","<item><title>\u65E0\u94FE\u63A5\u6761\u76EE</title><link>javascript:alert(1)</link><description>\u5E94\u88AB\u8DF3\u8FC7</description></item>","<item><title>A &amp; B</title><link>http://example.com/x</link><description>\u53CC\u91CD\u7F16\u7801\u5B9E\u4F53</description></item>","</channel></rss>"].join(""),a=Xp(i),l=a[0]||{},c=a[1]||{};o.result={count:a.length,firstTitle:l.title,firstUrl:l.url,firstSnippet:l.snippet,secondTitle:c.title,keepUrlAmp:String(l.url||"").indexOf("&b=2")>=0,skippedBadLink:a.length===2,doubleEncoded:String(c.title||"")==="A & B",noDate:l.date===void 0},o.ok=a.length===2&&a[0].title==="Node.js v22 \u53D1\u5E03"&&l.url==="https://nodejs.org/en/blog/keep?a=1&b=2"&&l.snippet.indexOf("LTS & Current")===0&&l.snippet.indexOf("\u2014")>0&&!l.date&&o.result.doubleEncoded}else if(r==="html"){let a=jo("<html><head><title>\u6807 & \u9898</title><style>p{color:red}</style></head><body><!-- \u6CE8\u91CA --><h1>\u6807\u9898</h1><p>\u7B2C\u4E00\u6BB5 \u6587\u5B57</p><script>alert(1)</script><div>\u7B2C\u4E8C\u6BB5<br>\u6362\u884C</div><noscript>JS</noscript></body></html>");o.result={text:a},o.ok=a===`\u6807\u9898
|
|
885
|
+
\u7B2C\u4E00\u6BB5 \u6587\u5B57
|
|
886
|
+
\u7B2C\u4E8C\u6BB5
|
|
887
|
+
\u6362\u884C`}else if(r==="engine"){let a=[{p:{baseUrl:"https://relay.example.com/v1"},want:"bing",label:"\u4EE3\u7406 baseUrl"},{p:{baseUrl:"https://api.deepseek.com/v1"},want:"deepseek",label:"\u5B98\u65B9\u57DF\u540D"},{p:{baseUrl:"https://relay.example.com/v1",webSearch:{baseUrl:"https://relay.example.com/tools"}},want:"deepseek",label:"\u4EE3\u7406\u81EA\u5E26\u534F\u8BAE"},{p:{baseUrl:"https://api.deepseek.com/v1",webSearch:{engine:"bing"}},want:"bing",label:"\u663E\u5F0F bing"},{p:{baseUrl:"https://api.deepseek.com/v1",webSearch:{disabled:!0}},want:"none",label:"\u663E\u5F0F\u5173\u95ED"},{p:null,want:"none",label:"\u65E0 provider"}].map(function(l){return{label:l.label,want:l.want,got:Ct(l.p)}});o.result={cases:a},o.ok=a.every(function(l){return l.got===l.want})}else o.ok=!1,o.error="\u672A\u77E5 case: "+r}else if(s.op==="agent"){let r=await ln(s.prompt||"hi",{root:s.root||j(),modelKey:s.modelKey,thinking:s.thinking,verbosity:s.verbosity,maxIters:s.maxIters,maxMinutes:s.maxMinutes,history:s.history?tn((ie()||{}).items||[],s.modelKey,{resolveImage:nn(ie())}).messages:[]});o.ok=!0,o.result={text:r.text.slice(0,800),reasoning:String(r.reasoning||"").slice(0,800),iters:r.iters,modelKey:r.modelKey,stop:r.stop,tools:r.log,usage:r.usage}}else if(s.op==="plan"){let r=await ln(s.prompt||"hi",{root:s.root||j(),modelKey:s.modelKey,mode:"plan",history:s.history?tn((ie()||{}).items||[],s.modelKey,{resolveImage:nn(ie())}).messages:[]}),i=ie(),a=Yh(r.text,{prompt:s.prompt,workspace:s.root||j(),modelKey:s.modelKey,session:i?i.id:""}),l=Qe.parsePlanSteps(r.text);o.ok=!0,o.result={text:r.text.slice(0,1200),iters:r.iters,file:a,tools:r.log.map(function(c){return c.name+" "+c.path}),usage:r.usage,todos:l,todoCount:l.length}}else if(s.op==="todotest"){let r=s.case||"all",i=[],a=function(l,c,u){i.push({name:l,ok:!!c,detail:u})};if(r==="all"||r==="parse"){let l=s.md||[`## \u76EE\u6807
|
|
888
|
+
\u505A X`,"## \u6B65\u9AA4","1. \u6539 a.js","2. \u8DD1\u6D4B\u8BD5",`## \u9A8C\u8BC1\u65B9\u5F0F
|
|
889
|
+
\u770B\u8F93\u51FA`].join(`
|
|
890
|
+
`),c=Qe.parsePlanSteps(l);a("parse",c.length===2&&c[0].id==="t1",c)}if(r==="all"||r==="merge"){let l=Qe.merge([{id:"t1",content:"A",status:"pending"}],[{id:"t1",content:"A",status:"completed"},{id:"t2",content:"B",status:"in_progress"}],{merge:!0});a("merge",l.length===2&&l[0].status==="completed"&&l[1].status==="in_progress",l)}if(r==="all"||r==="normalize"){let l=Qe.normalize([{id:"a",content:"A",status:"in_progress"},{id:"b",content:"B",status:"in_progress"}]);a("normalize",l[0].status==="in_progress"&&l[1].status==="pending",l)}o.ok=i.every(function(l){return l.ok}),o.result={checks:i,pass:i.filter(function(l){return l.ok}).length}}else if(s.op==="subagent"){let r=[],i=function(C,L,B){r.push({name:C,ok:!!L,detail:B})},a=function(C){return(Array.isArray(C)?C:[]).map(function(L){return String(L.function&&L.function.name||"")})},l=s.root||j(),c=Ae(s.modelKey),u=["write_file","replace_in_file","apply_patch","delete_file","move_file"],d=a(Nl);i("exploreTools",d.indexOf("read_file")>=0&&d.indexOf("grep")>=0&&u.every(function(C){return d.indexOf(C)<0})&&["ask_question","todo_write","explore"].every(function(C){return d.indexOf(C)<0}),d),i("planHasExplore",a(Th).indexOf("explore")>=0);let f=a(Mn("explore",c));i("exploreNoMcp",f.every(function(C){return C.indexOf("mcp__")!==0}),f),i("exploreNoWrite",f.every(function(C){return u.indexOf(C)<0})&&f.indexOf("read_skill")>=0),i("readonlyGate",rn("explore",!1)&&rn("explore",!0)&&!rn("plan",!1)&&rn("plan",!0)&&!rn("agent",!0));let p=async function(C){try{return await C(),""}catch(L){return String(L&&L.message||L)}},h=await p(function(){return At("explore",{description:"x",prompt:"y"},l,c,{mode:"explore",inSubagent:!0,subBudget:{max:4,left:4}})});i("nestedBlocked",h.indexOf("\u4E0D\u80FD\u518D\u6D3E\u5B50\u4EE3\u7406")>=0,h);let m=await p(function(){return At("explore",{description:"x",prompt:"y"},l,c,{mode:"agent",subBudget:{max:4,left:0}})});i("quotaBlocked",m.indexOf("\u6B21\u6570\u5DF2\u7528\u5B8C")>=0,m);let x=await p(function(){return At("ask_question",{questions:[]},l,c,{mode:"explore"})});i("askBlocked",x.indexOf("\u4E0D\u80FD\u5411\u7528\u6237\u63D0\u95EE")>=0,x);let b=await p(function(){return At("todo_write",{todos:[]},l,c,{mode:"explore",todosState:{items:[]}})});i("todoBlocked",b.indexOf("\u4E0D\u80FD\u7528 todo_write")>=0,b);let k=await At("run_command",{command:"rm -rf subagent-selftest"},l,c,{mode:"explore"});i("writeCmdBlocked",String(k).indexOf("\u5B50\u4EE3\u7406\u53EA\u5141\u8BB8\u53EA\u8BFB\u547D\u4EE4")>=0,String(k).slice(0,120));let S=new Array(Po+50).join("a"),T=Xr(S);i("resultCapped",T.length>Po&&T.indexOf("\u5DF2\u622A\u65AD")>=0&&Xr("\u77ED\u7ED3\u8BBA")==="\u77ED\u7ED3\u8BBA"),i("explorePromptGuards",Oo.indexOf("\u5FC5\u987B\u6765\u81EA\u771F\u5B9E\u8C03\u7528")>=0&&Oo.indexOf("\u7981\u6B62\u628A\u9884\u671F\u5199\u6210\u7ED3\u679C")>=0&&Oo.indexOf("\u4E0D\u8981\u5728\u7ED3\u8BBA\u91CC\u6E05\u70B9")>=0);let g=$r(!0),_=$r(!1);i("exploreToolList",g.indexOf("\u5171 14 \u4E2A")>=0&&g.indexOf("read_skill")>=0&&_.indexOf("\u5171 12 \u4E2A")>=0&&_.indexOf("web_search")<0&&String(Cn("explore","/tmp",!0)).split(`
|
|
891
|
+
`).pop()===g,g),i("subagentCaveat",Jn("\u5199\u5165\u7C7B\u547D\u4EE4\u4F1A\u88AB\u62D2\u7EDD\uFF0C\u6211\u6309\u89C4\u5219\u672A\u771F\u6B63\u6267\u884C\u3002",[]).indexOf("\u4E00\u6B21\u5DE5\u5177\u90FD\u6CA1\u8C03\u7528")>=0&&Jn("\u5199\u5165\u7C7B\u547D\u4EE4\u4F1A\u88AB\u62D2\u7EDD\uFF0C\u6211\u6309\u89C4\u5219\u672A\u771F\u6B63\u6267\u884C\u3002",[{name:"read_file",ok:!0}]).indexOf("\u7B49\u4E8E\u6CA1\u6709\u9A8C\u8BC1")>=0&&Jn("README \u91CC\u6CA1\u6709\u8BE5\u51FD\u6570\u3002",[{name:"read_file",ok:!0}])===""&&Jn("\u5199\u5165\u7C7B\u547D\u4EE4\u4F1A\u88AB\u62D2\u7EDD\u3002",[{name:"run_command",ok:!1}])==="",Jn("x",[]).slice(0,60));let v=Fo([{promptTokens:100,completionTokens:10},{promptTokens:30,completionTokens:5,subagent:!0}],65536,"selftest");i("usageMerged",v.requests===2&&v.promptTokens===130&&v.subagentRequests===1&&v.contextTokens===110,v),i("noWriteNudge",jr([{name:"explore",ok:!0}])&&!jr([{name:"explore",ok:!1}])&&!jr([{name:"read_file",ok:!0}])&&!Oh([{name:"explore",ok:!0}]));let A=r.filter(function(C){return!C.ok}).map(function(C){return C.name});o.ok=A.length===0,o.error=A.length?"failed: "+A.join(","):void 0,o.result={checks:r,pass:r.length-A.length,total:r.length},w("headless_subagent",{ok:o.ok,failed:A})}else if(s.op==="cursorplans")if(s.file){let r=await nm(String(s.file));o.ok=!!r.ok,o.result=r,r.ok||(o.error=r.error)}else{let r=Ln.listPlans({home:dt.homedir(),root:j()}),i=Math.max(1,Math.min(20,Number(s.limit)||5));o.ok=!0,o.result={count:r.length,plans:r.slice(0,i).map(function(a){let l=Ln.readPlan(a.file);return{file:a.file,name:a.name,scope:a.scope,size:a.size,mtimeMs:a.mtimeMs,bodyChars:l.ok?l.body.length:-1,todos:l.ok?l.todos.length:-1,error:l.ok?"":l.error}})}}else if(s.op==="answerask"){let r=String(s.id||"");if(!r){let u=[];jt.forEach(function(d,f){u.push(f)}),r=u.length?u[u.length-1]:""}let i=ie(),a=String(s.sessionId||i&&i.id||""),l=r?jt.get(r):null,c=em(r,s.answers||{q1:"yes"},a);o.ok=!!c.ok,c.ok||(o.error=c.error),o.result={id:r,text:c.text||"",hadPending:!!l,pendingLeft:jt.size}}else if(s.op==="askq"){let r=s.case||"all",i=[],a=function(l,c,u){i.push({name:l,ok:!!c,detail:u})};if(r==="all"||r==="normalize"){let l=!1,c=null;try{let u=Qt.normalize({title:"\u65B9\u5411",questions:[{id:"q1",prompt:"\u8981\u4E0D\u8981\uFF1F",options:[{id:"yes",label:"\u8981"},{id:"no",label:"\u4E0D\u8981"}]}]});l=u.questions.length===1&&!Qt.needsConfirm(u),c=u}catch(u){c=u.message}a("normalize",l,c)}if(r==="all"||r==="reject"){let l=!1;try{Qt.normalize({questions:[{prompt:"x",options:[{id:"a",label:"A"}]}]})}catch{l=!0}a("reject",l,null)}if(r==="all"||r==="answers"){let l=!1,c=null;try{let u=Qt.normalize({questions:[{id:"a",prompt:"\u5355\u9009",options:[{id:"x",label:"X"},{id:"y",label:"Y"}]}]}),d=Qt.normalizeAnswers(u,{a:"x"}),f=Qt.formatAnswers(u,d);l=d.a==="x"&&f.indexOf("\u7528\u6237\u56DE\u7B54")>=0,c={ans:d,text:f}}catch(u){c=u.message}a("answers",l,c)}o.ok=i.every(function(l){return l.ok}),o.result={checks:i,pass:i.filter(function(l){return l.ok}).length}}else if(s.op==="viewplan"){await y.commands.executeCommand("workbench.view.extension.luban"),await new Promise(i=>setTimeout(i,2500));let r=pe(s.to||"view");if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"synthetic_ask",prompt:s.prompt||"hi",mode:"plan"});let i=Date.now()+(s.waitMs||12e4),a=null;for(;Date.now()<i;)if(await new Promise(u=>setTimeout(u,1e3)),E&&(E.kind==="plan_done"||E.kind==="dome_error")){a=E;break}let l=es(r),c=l?Bo.get(l.id):null;o.ok=!!a,o.result={ack:a,planChars:c?c.text.length:0,planFile:c?c.file:""}}}else if(s.op==="imetest"){let r=pe(s.to);if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let i=["composing","bypass_before","bypass_after","plain"],a={composing:"ime_blocked_ok",plain:"ime_sent_ok",bypass_before:"ime_bypass_blocked_ok",bypass_after:"ime_bypass_blocked_ok"},l={};for(let c of i){E=null,r.postMessage({type:"selftest_ime",case:c});let u=Date.now()+2e4,d=null;for(;Date.now()<u;)if(await new Promise(f=>setTimeout(f,500)),E&&E.kind&&E.kind.indexOf("ime_")===0){d=E;break}l[c]=d?d.kind:"timeout",await new Promise(f=>setTimeout(f,200))}o.ok=i.every(function(c){return l[c]===a[c]}),o.result=l,r.postMessage({type:"reset"})}}else if(s.op==="viewexecute"){let r=pe(s.to||"view");if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null;let i=es(r),a=i?Bo.get(i.id):null;r.postMessage({type:"execute_plan",plan:s.plan||(a?a.text:""),planFile:s.planFile||(a?a.file:""),modelKey:s.modelKey});let l=Date.now()+(s.waitMs||18e4),c=null;for(;Date.now()<l;)if(await new Promise(u=>setTimeout(u,1e3)),E&&(E.kind==="dome_done"||E.kind==="dome_error")){c=E;break}o.ok=!!c,o.result={ack:c}}}else if(s.op==="reftest"){let r=pe(s.to);if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let i=s.case||"file";E=null,r.postMessage({type:"ref_selftest",case:i});let a=Date.now()+(s.waitMs||15e3),l=null;for(;Date.now()<a;)if(await new Promise(c=>setTimeout(c,300)),E&&E.kind&&E.kind.indexOf("ref_")===0){l=E;break}o.ok=!!(l&&/_ok$/.test(l.kind)),o.result=l||{kind:"timeout"}}}else if(s.op==="insertref"){await je();let r=pe(s.to);if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let i=j(),a=Array.isArray(s.paths)&&s.paths.length?s.paths:["package.json"],l=a.map(function(c){return nh(P.resolve(i,c),i)});if(l.some(function(c){return!c}))o.ok=!1,o.error="\u5B58\u5728\u65E0\u6CD5\u751F\u6210 token \u7684\u8DEF\u5F84\uFF08\u4E0D\u5B58\u5728\u6216\u7279\u6B8A\u7C7B\u578B\uFF09";else{let c=l.join("");E=null,r.postMessage({type:"insert_ref",text:c,n:a.length});let u=await we(s.waitMs||8e3,function(d){return d.kind==="insert_ref"});o.ok=!!(u&&(u.n===c.length||u.n===c.length+1)),o.result={ack:u,text:c},w("headless_insertref",{ok:o.ok,n:c.length,ack:u&&u.n})}}}else if(s.op==="seladd")try{let r=s.root||j(),i=be(s.file||"a.ts",r),a=await y.workspace.openTextDocument(y.Uri.file(i)),l=await y.window.showTextDocument(a,{preview:!1,viewColumn:y.ViewColumn.One}),c=Math.max((s.startLine||1)-1,0),u=Math.min(s.endLine||c+2,Math.max(a.lineCount-1,0)),d=new y.Selection(new y.Position(c,0),new y.Position(u,0));l.selection=d,Co(l),await new Promise(p=>setTimeout(p,300)),await je();let f=pe(s.to);if(!f)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let p=s.waitMs||8e3;E=null,f.postMessage({type:"ref_selftest",case:"clear"}),await we(p,function(v){return v.kind==="ref_clear_ok"}),E=null,await y.commands.executeCommand("luban.addSelectionToChat");let h=await we(p,function(v){return v.kind==="insert_ref"});E=null,f.postMessage({type:"ref_selftest",case:"input"});let m=await we(p,function(v){return v.kind==="ref_input_ok"}),x=String(m&&m.value||"").trim(),b=x?Vn(x,r):{refs:[],text:""},k=b.refs[0]||null,T=(a.getText(new y.Range(d.start,d.end)).split(`
|
|
892
|
+
`).find(function(v){return v.trim()})||"").trim(),g=!!T&&String(b.text).indexOf(T)>=0,_=d.end.character===0&&u>c?u:u+1;o.ok=!!(h&&/^#selection .+:\d+-\d+$/.test(x)&&k&&k.kind==="selection"&&k.startLine===c+1&&k.endLine===_&&g),o.result={insertAck:h||null,token:x,ref:k,selectedRange:[c+1,_],injectedHasSelectedText:g},w("headless_seladd",{ok:o.ok,token:x,ack:h&&h.n})}}catch(r){o.ok=!1,o.error=r.message}else if(s.op==="webtest"){let r=pe(s.to);if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"web_selftest"});let i=Date.now()+(s.waitMs||15e3),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),E&&E.kind&&E.kind.indexOf("web_")===0){a=E;break}o.ok=!!(a&&/_ok$/.test(a.kind)),o.result=a||{kind:"timeout"}}}else if(s.op==="mdtest"){let r=pe(s.to);if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"markdown_selftest"});let i=Date.now()+(s.waitMs||15e3),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),E&&E.kind&&E.kind.indexOf("md_")===0){a=E;break}o.ok=!!(a&&/_ok$/.test(a.kind)),o.result=a||{kind:"timeout"}}}else if(s.op==="tooltest"){await je();let r=pe(s.to);if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"tool_selftest"});let i=Date.now()+(s.waitMs||15e3),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),E&&E.kind&&E.kind.indexOf("tool_")===0){a=E;break}o.ok=!!(a&&/_ok$/.test(a.kind)),o.result=a||{kind:"timeout"},w("headless_tooltest",{ok:o.ok,kind:a&&a.kind,n:a&&a.n,value:a&&a.value})}}else if(s.op==="viewscroll"){await je();let r=pe(s.to);if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"scroll_selftest"});let i=Date.now()+(s.waitMs||15e3),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),E&&E.kind&&E.kind.indexOf("scroll_")===0){a=E;break}o.ok=!!(a&&/_ok$/.test(a.kind)),o.result=a||{kind:"timeout"},w("headless_viewscroll",{ok:o.ok,kind:a&&a.kind,n:a&&a.n,value:a&&a.value})}}else if(s.op==="seltest"){let r,i,a=[],l="",c="";try{let u=s.root||j(),d=be(s.file||"a.ts",u),f=await y.workspace.openTextDocument(y.Uri.file(d)),p=await y.window.showTextDocument(f,{preview:!1,viewColumn:y.ViewColumn.One}),h=Math.max((s.startLine||1)-1,0),m=Math.min(s.endLine||h+2,Math.max(f.lineCount-1,0)),x=new y.Selection(new y.Position(h,0),new y.Position(m,0));p.selection=x,Co(p),await new Promise(_=>setTimeout(_,400)),i=oh(),c=f.getText(new y.Range(x.start,x.end));let b=Vn("#selection \u89E3\u91CA\u8FD9\u6BB5",u);a=b.refs,l=b.text;let k=pe(s.to);if(k){E=null,k.postMessage({type:"ref_selftest",case:"button"});let _=Date.now()+12e3;for(;Date.now()<_;)if(await new Promise(v=>setTimeout(v,300)),E&&E.kind&&E.kind.indexOf("ref_selftest_button")===0){r=E;break}}let S=(c.split(`
|
|
893
|
+
`).find(function(_){return _.trim()})||"").trim(),T={ok:!0,skipped:!0,ranges:[]};if(Math.max(f.lineCount,1)>=4){let _=Ot(d,u),v=Vn("#selection "+_+":1-2 \u548C #selection "+_+":3-4",u);T={ok:v.refs.length===2&&v.refs[0].kind==="selection"&&v.refs[1].kind==="selection"&&v.refs[0].startLine===1&&v.refs[0].endLine===2&&v.refs[1].startLine===3&&v.refs[1].endLine===4,ranges:v.refs.map(function(A){return A.startLine+"-"+A.endLine})}}o.ok=!!(i&&i.hasEditor&&i.hasSelection&&i.startLine===h+1&&i.endLine===(x.end.character===0&&m>h?m:m+1)&&a.length===1&&a[0].kind==="selection"&&S&&l.indexOf(S)>=0&&r&&r.kind==="ref_selftest_button_ok"&&T.ok),o.result={info:i,selectedRange:[h+1,i&&i.endLine],selectedChars:c.length,ref:a[0]||null,injectedChars:l.length,injectedHasSelectedText:!!S&&l.indexOf(S)>=0,multiSelection:T,buttonAck:r||{kind:"timeout"}}}catch(u){o.ok=!1,o.error=u.message}}else if(s.op==="refs"){let r=Vn(s.prompt||"",s.root||j(),{window:s.window}),i=String(r.text||"");o.ok=!0,o.result={refs:r.refs,chars:i.length,text:i.slice(0,800),hasBatches:/分批处理(共\s*\d+\s*批)/.test(i),hasSearchDirHint:/search_code/.test(i)&&/dir=/.test(i)}}else if(s.op==="listfiles"){let r=await tk(),i=await nk();o.ok=!0,o.result={total:r.length,files:r.slice(0,20),dirTotal:i.length,dirs:i.slice(0,20)}}else if(s.op==="settings")o.ok=!0,o.result={path:Le,source:As,defaultModel:et.defaultModel,providers:(et.providers||[]).map(r=>({id:r.id,models:(r.models||[]).map(i=>i.id),keyFound:!!Os(r),keyless:Es(r)&&!Rr(r),inline:!!r.apiKey,secret:!!Wt[r.id],env:!!Uo(r)}))};else if(s.op==="saveconfig"){let r=await jh(t,s.config||Yr().config);o.ok=!!r.ok,r.ok||(o.error=(r.errors||[]).join("; ")),o.result={path:r.path,defaultModel:r.defaultModel,models:r.models,errors:r.errors}}else if(s.op==="testprovider"){let r=await Lh(s.provider||{});o.ok=!!r.ok,o.result=r,r.ok||(o.error=r.error)}else if(s.op==="fetchmodels"){let r=await Ih(s.provider||{});o.ok=!!r.ok,o.result=r,r.ok||(o.error=r.error)}else if(s.op==="opensettings"){Wl(t),E=null;let r=Date.now()+(s.waitMs||2e4),i=null;for(;Date.now()<r;)if(await new Promise(a=>setTimeout(a,500)),E&&E.kind==="settings_rendered"){i=E;break}o.ok=!!i,o.result={ack:i,path:Le}}else if(s.op==="chat"){let r=await No([{role:"user",content:s.prompt||"hi"}],s.modelKey,{thinking:s.thinking});o.ok=!0,o.result={modelKey:r.target.key,reply:r.content.slice(0,400),chars:r.content.length,reasoning:String(r.reasoning||"").slice(0,400),thinking:r.thinking||"none"}}else if(s.op==="runcmd"){let r=await uh(s.command||"echo hi",s.root||j(),s.timeout_ms);o.ok=!0,o.result=r}else if(s.op==="runcmd_async"){let r=String(s.case||"start_poll_stop"),i=String(s.sessionId||"test_async_"+Date.now().toString(36)),a=s.root||j();if(r==="start_poll_stop"){let l=$.start(i,s.command||"sleep 0.4; echo ASYNC_OK",{cwd:a,timeout_ms:s.timeout_ms||3e4});if(!l.ok)o.ok=!1,o.error=l.error,o.result=l;else{let c=await $.poll(i,l.job_id,{wait_ms:0,tail_chars:200}),u=await $.poll(i,l.job_id,{wait_ms:5e3,tail_chars:800}),d=$.stop(i,l.job_id);$.clearSession(i),o.ok=!!(l.ok&&u.status==="exited"&&String(u.out_tail||"").indexOf("ASYNC_OK")>=0&&(d.status==="already_done"||d.status==="stopped")),o.result={started:l,mid:c,done:u,stopped:d}}}else if(r==="concurrency"){let l=$.start(i,"sleep 2",{cwd:a,timeout_ms:1e4}),c=$.start(i,"sleep 2",{cwd:a,timeout_ms:1e4}),u=$.start(i,"sleep 2",{cwd:a,timeout_ms:1e4}),d=$.runningCount(i);$.clearSession(i),o.ok=!!(l.ok&&c.ok&&!u.ok&&d===2&&String(u.error||"").indexOf("\u4E0A\u9650")>=0),o.result={a:l,b:c,c:u,running:d}}else if(r==="session_scope"){let l=i+"_a",c=i+"_b",u=$.start(l,"sleep 2",{cwd:a,timeout_ms:1e4}),d=await $.poll(c,u.job_id,{wait_ms:0});$.clearSession(l),$.clearSession(c),o.ok=!!(u.ok&&d.status==="missing"),o.result={a:u,cross:d}}else if(r==="cancel"){let l=$.start(i,"sleep 5",{cwd:a,timeout_ms:2e4}),c=$.stopAll(i),u=await $.poll(i,l.job_id,{wait_ms:0});$.clearSession(i),o.ok=!!(l.ok&&c.stopped>=1&&u.status==="stopped"),o.result={a:l,killed:c,after:u}}else if(r==="plan_deny"){let l=On.check(s.command||"touch /tmp/luban_async_deny");o.ok=!l.ok,o.result={verdict:l.ok?"allow":"deny",reason:l.reason,segment:l.segment}}else if(r==="tail_utf8"){let l=$.start(i,"printf '\u{1F600}\u{1F600}\u{1F600}'",{cwd:a,timeout_ms:15e3}),c=await $.poll(i,l.job_id,{wait_ms:5e3,tail_chars:3}),u=await $.poll(i,l.job_id,{wait_ms:0,tail_chars:4});$.clearSession(i);let d=String(c.out_tail||""),f=!1;for(let p=0;p<d.length;p++){let h=d.charCodeAt(p);if(h>=55296&&h<=56319){let m=d.charCodeAt(p+1);if(!(m>=56320&&m<=57343)){f=!0;break}p++}else if(h>=56320&&h<=57343){f=!0;break}}o.ok=!!(l.ok&&c.status==="exited"&&c.out_tail==="\u{1F600}"&&!f&&u.out_tail==="\u{1F600}\u{1F600}"),o.result={started:l,cut:c,pair:u,lone:f}}else if(r==="timeout"){let l=$.start(i,"sleep 5",{cwd:a,timeout_ms:400}),c=await $.poll(i,l.job_id,{wait_ms:3e3});$.clearSession(i),o.ok=!!(l.ok&&c.status==="timeout"),o.result={started:l,done:c}}else o.ok=!1,o.error="\u672A\u77E5 case: "+r}else if(s.op==="filesearch")o.result=nS(),o.ok=o.result.fail===0,o.ok||(o.error="filesearch \u65AD\u8A00\u5931\u8D25\uFF1A"+o.result.failed.join("; "));else if(s.op==="patch")o.result=sS(),o.ok=o.result.fail===0,o.ok||(o.error="patch \u65AD\u8A00\u5931\u8D25\uFF1A"+o.result.failed.join("; "));else if(s.op==="lints")o.result=oS(),o.ok=o.result.fail===0,o.ok||(o.error="lints \u65AD\u8A00\u5931\u8D25\uFF1A"+o.result.failed.join("; "));else if(s.op==="fs")try{let r=await At(s.tool||"read_file",s.args||{},s.root||j(),null,{readMax:s.readMax});o.ok=!0,o.result={allowOutside:fl(),text:String(r).slice(0,2e3)}}catch(r){o.ok=!1,o.error=r.message,o.result={allowOutside:fl()}}else if(s.op==="fsskip")o.result=await im(),o.ok=o.result.fail===0,o.ok||(o.error="fsskip \u65AD\u8A00\u5931\u8D25\uFF1A"+o.result.failed.join("; "));else if(s.op==="review")o.ok=!0,o.result={total:en(),files:ol()};else if(s.op==="reviewdoc"){let r=be(s.path,j()),i=await y.workspace.openTextDocument(y.Uri.from({scheme:"luban-before",path:r})),a=J.get(r);o.ok=!0,o.result={lines:i.lineCount,text:i.getText().slice(0,2e3),matchesBaseline:!!a&&i.getText()===a.baseline}}else if(s.op==="reviewui"){let r=be(s.path,j()),i=y.Uri.file(r),a=await y.workspace.openTextDocument(i);await y.window.showTextDocument(a,{preview:!1,viewColumn:y.ViewColumn.One}),await new Promise(p=>setTimeout(p,600));let l=async function(p){try{return await y.commands.executeCommand("vscode.executeCodeLensProvider",p)||[]}catch{return[]}},c=function(p){return p.map(function(h){return{line:h.range?h.range.start.line+1:-1,title:h.command&&h.command.title,command:h.command&&h.command.command}})},u=await l(i),d=y.Uri.from({scheme:"luban-before",path:r}),f=await l(d);o.ok=!0,o.result={codeLensCount:u.length,codeLenses:c(u),beforeCodeLensCount:f.length,beforeCodeLenses:c(f),visible:y.window.visibleTextEditors.some(function(p){return p.document.uri.scheme==="file"&&p.document.uri.fsPath===r})}}else if(s.op==="reviewdiff"){let r=be(s.path,j());if(!J.has(r))o.ok=!1,o.error="\u6CA1\u6709\u5F85\u5BA1\u9605\u6539\u52A8: "+s.path;else{let i=function(){let c=[];for(let u of y.window.tabGroups.all)for(let d of u.tabs){let f=d.input||{};!f.modified||!f.original||f.modified.fsPath===r&&c.push({title:d.label,originalScheme:f.original.scheme,modifiedScheme:f.modified.scheme,active:d.isActive,preview:d.isPreview})}return c};s.open!==!1&&(await jl(r,{preview:!0,preserveFocus:!0}),await new Promise(c=>setTimeout(c,400)));let a=i(),l={tabs:a,diffTabs:a.length,pending:en(),autoOpen:Uh(),contextActive:!!ci(li())};s.accept&&(await Do("accept_file",r,""),await new Promise(c=>setTimeout(c,400)),l.afterAcceptTabs=i().length,l.afterAcceptPending=en()),o.ok=a.length>0,o.ok||(o.error="\u6CA1\u627E\u5230\u8BE5\u6587\u4EF6\u7684 diff \u6807\u7B7E"),o.result=l}}else if(s.op==="reviewrender"){let r=pe(s.to);if(r||(await y.commands.executeCommand("workbench.view.extension.luban"),await new Promise(i=>setTimeout(i,2500)),r=pe(s.to)),!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{r.postMessage(Io()),await new Promise(l=>setTimeout(l,400)),E=null,r.postMessage({type:"review_probe"});let i=Date.now()+(s.waitMs||1e4),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),E&&E.kind==="review_probe"){a=E;break}o.ok=!!a,o.result=a||{kind:"timeout"}}}else if(s.op==="reviewdeco"){let r=be(s.path,j()),i=J.get(r);if(!i)o.ok=!1,o.error="\u6CA1\u6709\u5F85\u5BA1\u9605\u6539\u52A8: "+s.path;else{let a=await y.workspace.openTextDocument(y.Uri.file(r)),l=bh(a,i);o.ok=!0,o.result={addDecorations:l.added.length,delDecorations:l.removed.length,spans:l.spans,docLines:a.lineCount}}}else if(s.op==="review_action"){let r=await Do(s.action,s.path,s.hunk||""),i="";try{i=Yn(be(s.path,j()))}catch{i=""}o.ok=!!r.ok,r.ok||(o.error=r.error),o.result=Object.assign({},r,{remaining:en(),fileCount:J.size,exists:i!==""||function(){try{return O.existsSync(be(s.path,j()))}catch{return!1}}(),current:i.slice(0,3e3)})}else if(s.op==="review_edit"){let r=be(s.path,j()),i=O.existsSync(r),a=i?O.readFileSync(r,"utf8"):"",l=s.content==null?"":String(s.content);await Pn(r,l);let c=Zt(r,a,l,!i);o.ok=!0,o.result={hunks:c,existed:i,total:en(),files:ol()}}else if(s.op==="openpanel")gl(t),o.ok=!0,o.result="opened";else if(s.op==="panelmsg"||s.op==="viewmsg"){s.op==="viewmsg"?(await y.commands.executeCommand("workbench.view.extension.luban"),await new Promise(i=>setTimeout(i,2500))):pe(s.to)||(gl(t),await new Promise(i=>setTimeout(i,2500)));let r=pe(s.to);if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"synthetic_ask",prompt:s.prompt||"hi",mode:s.mode||"",modelKey:s.modelKey||""});let i=Date.now()+(s.waitMs||9e4),a=null;for(;Date.now()<i;){if(await new Promise(l=>setTimeout(l,1e3)),E&&(E.kind==="dome_done"||E.kind==="plan_done")){a=E;break}if(E&&E.kind==="dome_error"){a=E;break}}o.ok=!!a,o.result={ack:a}}}else if(s.op==="newsession"){await je();let r=pe(s.to);E=null;let i=await qo(s.reason||"headless",r),a=r?await we(s.waitMs||8e3,function(l){return l.kind==="session_opened"||l.kind==="session_reset"}):null;o.ok=!0,o.result={ack:a,id:i.id,items:(i.items||[]).length,reviewFiles:J.size,hunks:en()}}else if(s.op==="listsessions")Se(),o.ok=!0,o.result={current:fe||"",openTabs:X.slice(),root:j(),sessions:re.list(s.scope||"workspace",s.root||j()).slice(0,s.limit||50)};else if(s.op==="searchsessions"){let r=Jh(s.q,s.scope||"workspace",s.root||j(),0);o.ok=!0,o.result={q:r.q,scope:r.scope,scanned:r.scanned,matched:r.matched,truncated:r.truncated,ms:r.ms,results:r.results.slice(0,s.limit||20)}}else if(s.op==="opensession"){await je();let r=pe(s.to);E=null;let i=await Ss(String(s.id||""),r),a=i.ok&&r?await we(s.waitMs||8e3,function(l){return l.kind==="session_opened"}):null;o.ok=!!i.ok,i.ok||(o.error=i.error),o.result={ack:a,id:i.id,items:i.items,title:di(ie())}}else if(s.op==="deletesession"){let r=await Gn(String(s.id||""));o.ok=!0,o.result={current:r.current,sessions:r.sessions.length}}else if(s.op==="forksession"){let r=String(s.id||""),i=Ro(r);if(!i)try{i=Se().load(r)}catch{i=null}if(!i)o.ok=!1,o.error=M("ext.noSuchSession",{id:r});else if(Me.has(i.id))o.ok=!1,o.error=M("ext.forkBusy");else{let a=s.at==null||s.at===""?null:Number(s.at),l=si(i,a,pe(s.to),"headless");o.ok=!!l.ok,l.ok||(o.error=l.error),o.result=l}}else if(s.op==="sessiontest"){let r=s.case||"button";await je();let i=pe(s.to);if(!i)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{Se();let a=function(d,f){let p=re.create(j());return re.append(p,{t:"user",text:"\u4F1A\u8BDD "+d+" \u7684\u95EE\u9898"}),re.append(p,{t:"tool",name:"read_file",path:d+".js",ok:!0,result:"12 \u884C"}),re.append(p,{t:"text",text:"\u4F1A\u8BDD "+d+" \u7684\u56DE\u7B54\u3002"}),f&&re.append(p,f),re.save(p),p},l=a("A",{t:"sources",query:"q",items:[{title:"\u793A\u4F8B\u6765\u6E90",url:"https://example.com/a",siteName:"example.com",date:""}]}),c=a("B"),u=J.size;if(r==="list"){i.postMessage({type:"toggle_session_list"}),await new Promise(function(f){setTimeout(f,400)}),E=null,i.postMessage({type:"session_probe"});let d=await we(6e3,function(f){return f.kind==="session_probe"});o.ok=!!(d&&d.popupOpen&&d.sessionItems>=1),o.result={probe:d,sessions:re.list().length},i.postMessage({type:"toggle_session_list"})}else if(r==="replay"){E=null,await Ss(l.id,i);let d=await we(8e3,function(p){return p.kind==="session_opened"});E=null,i.postMessage({type:"session_probe"});let f=await we(8e3,function(p){return p.kind==="session_probe"});o.ok=!!(d&&f&&f.messages>=2&&f.tools>=1&&f.sources>=1&&f.reviewFiles===u),o.result={opened:d,probe:f,expected:{items:4,reviewFiles:u}}}else if(r==="search"){let d="ZQ"+Date.now().toString(36).toUpperCase(),f=re.create(j());re.append(f,{t:"user",text:"\u5E2E\u6211\u770B\u770B\u80FD\u8017\u62A5\u544A"}),re.append(f,{t:"text",text:"\u7ED3\u8BBA\uFF1A\u51B7\u5374\u5854\u529F\u8017\u504F\u9AD8\uFF08\u6807\u8BB0 "+d+"\uFF09\u3002"}),re.save(f);let p=re.create(j());re.append(p,{t:"user",text:"\u80FD\u8017\u62A5\u544A\u7684\u6807\u9898\u547D\u4E2D"}),re.append(p,{t:"text",text:"\u8FD9\u6761\u6B63\u6587\u91CC\u6CA1\u6709\u6807\u8BB0\u3002"}),re.save(p),E=null,i.postMessage({type:"session_search_selftest",q:d});let h=await we(12e3,function(m){return String(m.kind||"").indexOf("session_search")===0});o.ok=!!(h&&/_ok$/.test(h.kind)&&h.searchRows===1&&h.searchSnippets===1&&h.searchMarks>=1&&h.searchFull>1),o.result={ack:h,mark:d},await Gn(f.id),await Gn(p.id)}else if(r==="switch"){E=null,await Ss(l.id,i),await we(8e3,function(h){return h.kind==="session_opened"}),E=null,i.postMessage({type:"session_probe"});let d=await we(8e3,function(h){return h.kind==="session_probe"});E=null,await Ss(c.id,i);let f=await we(8e3,function(h){return h.kind==="session_opened"});E=null,i.postMessage({type:"session_probe"});let p=await we(8e3,function(h){return h.kind==="session_probe"});o.ok=!!(f&&d&&p&&p.messages>=2&&String(p.lastText||"").indexOf("\u4F1A\u8BDD B \u7684\u56DE\u7B54")>=0&&p.reviewFiles===u),o.result={first:d,second:p}}else{E=null,await Ss(l.id,i),await we(8e3,function(f){return f.kind==="session_opened"}),E=null,i.postMessage({type:"session_selftest",case:r});let d=await we(12e3,function(f){return String(f.kind||"").indexOf("session_"+r)===0});o.ok=!!(d&&/_ok$/.test(d.kind)&&d.reviewFiles===u),o.result={ack:d,reviewBefore:u}}await Gn(l.id),await Gn(c.id)}}else if(s.op==="tabprobe"){let r=pe(s.to);if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,r.postMessage({type:"tab_probe"});let i=await we(s.waitMs||6e3,function(a){return a.kind==="tab_probe"});o.ok=!!i,i||(o.error="\u6807\u7B7E\u680F\u6CA1\u6709\u56DE\u5E94"),o.result={ack:i,tabs:i?i.tabs:0,activeTab:i?i.activeTab:"",openTabs:X.slice(),activeId:fe}}}else if(s.op==="webview_probe")o.ok=!0,o.result={panel:!!se,view:!!ce,viewVisible:!!(ce&&ce.visible===!0),panelActive:se&&Be.get(se.webview)||"",viewActive:ce&&Be.get(ce.webview)||"",activeId:fe,openTabs:X.slice()};else if(s.op==="sendmsg"){let r=pe(s.to);if(!r)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{let i=s.msg||{type:"ping"},a=String(i&&i.type||"");if(rS.indexOf(a)<0)o.ok=!1,o.error="sendmsg \u4E0D\u653E\u884C "+(a||"(\u7A7A)");else{E=null,r.postMessage(i);let l=null;s.ackKind&&(l=await we(s.waitMs||8e3,function(c){return c.kind===s.ackKind})),o.ok=!s.ackKind||!!l,o.ok||(o.error="\u7B49\u5F85 ack "+s.ackKind+" \u8D85\u65F6"),o.result={ack:l,delivered:!0}}}}else if(s.op==="tabtest"){let r=s.case||"close_cancel";await je();let i=pe(s.to);if(!i)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,i.postMessage({type:"tab_selftest",case:r});let a=await we(s.waitMs||3e4,function(l){return String(l.kind||"").indexOf("tab_"+r)===0});o.ok=!!(a&&/_ok$/.test(a.kind)),a||(o.error="\u6807\u7B7E\u81EA\u68C0\u6CA1\u6709\u56DE\u5E94"),o.result={ack:a,openTabs:X.slice(),activeId:fe}}}else if(s.op==="sessionpersist"){let r=s.prompt||"\u53EA\u56DE\u4E00\u4E2A\u5B57\uFF1A\u597D",i=await No([{role:"user",content:r}],s.modelKey,{});pi(s.modelKey,"chat"),Ge({t:"user",text:r}),Ge({t:"text",text:i.content}),Ge({t:"summary",text:"\u5B8C\u6210 \xB7 "+i.target.model.id});let a=Ue(),l=a?re.load(a.id):null,c=(l&&l.items||[]).filter(function(u){return u.t==="text"});o.ok=!!(l&&c.length&&c[c.length-1].text===i.content),o.result={id:a&&a.id,path:a?re.fileOf(a.id):"",items:(l&&l.items||[]).length,lastText:c.length?c[c.length-1].text.slice(0,80):""}}else if(s.op==="memory"){let r=s.case||"build",i=(ie()||{}).items||[],a=function(l){return{enabled:l.enabled,turns:l.turns,chars:l.chars,dropped:l.dropped,roles:l.messages.map(function(c){return c.role}),heads:l.messages.map(function(c){return wh(c.content,120)})}};if(r==="build"){let l=[{t:"user",text:"\u7B2C\u4E00\u4E2A\u95EE\u9898"},{t:"tool",name:"read_file",path:"a.js",ok:!0,result:"10 \u884C"},{t:"text",text:"\u7B2C\u4E00\u4E2A\u56DE\u7B54"},{t:"summary",text:"\u5B8C\u6210 \xB7 1 \u6B21\u5DE5\u5177\u8C03\u7528"},{t:"user",text:"\u8FFD\u95EE",ctx:"\u8FFD\u95EE\n\n[ref 1] a.js\n```js\nconst a = 1;\n```"},{t:"plan",text:"\u8BA1\u5212\u6B63\u6587"}],c=Xn.build(l,Object.assign($n(),s.opts||{}));o.ok=!0,o.result=Object.assign(a(c),{config:$n(),ctxUsed:c.messages.some(function(u){return u.content.indexOf("[ref 1]")>=0})})}else if(r==="spill"){let l=[];for(let m=0;m<6;m++)l.push({t:"user",text:"\u95EE\u9898"+m+" UNIQUE_MEM_"+m}),l.push({t:"text",text:"\u56DE\u7B54"+m+" \u5173\u4E8E UNIQUE_MEM_"+m});let c=ut.createStore(),u=Xn.build(l,Object.assign($n(),{maxTurns:2,maxChars:2e4,spill:ti(c)})),d=!!(u.spillDigest&&u.spillDigest.indexOf("\u66F4\u65E9\u8F6E\u6B21\u6458\u8981")>=0&&u.spillDigest.indexOf("UNIQUE_MEM_0")>=0),f=u.spillIds&&u.spillIds[0]||"",p=f?c.read(f):{ok:!1},h=!!(p&&p.ok&&String(p.content).indexOf("UNIQUE_MEM_0")>=0);o.ok=u.turns===2&&u.spilledTurns>=4&&d&&h,o.result={turns:u.turns,spilledTurns:u.spilledTurns,spillIds:u.spillIds,digestHead:String(u.spillDigest||"").slice(0,160),recalled:h,storeEntries:c.size()}}else if(r==="prefix"){let l=Ae(s.modelKey),c=Ct(l&&l.provider)!=="none",u=on.hash(Cn("agent",j(),c),Mn("agent",l)),d=on.hash(Cn("agent",j(),c),Mn("agent",l)),f=on.hash(Cn("plan",j(),c),Mn("plan",l));o.ok=u===d&&u!==f,o.result={agent:u,plan:f,stable:u===d,differsByMode:u!==f}}else if(r==="session"){let l=tn(i,s.modelKey,Object.assign({},s.opts||{},{resolveImage:nn(ie())}));o.ok=!0,o.result=Object.assign(a(l),{id:fe||"",items:i.length})}else if(r==="last")o.ok=!!Re,o.result=Re||{};else if(r==="live"){let l=s.prompt||"\u53EA\u56DE\u4E00\u4E2A\u5B57\uFF1A\u597D",c=tn(i,s.modelKey,{resolveImage:nn(ie())}),u={text:""},d=await ln(l,{root:j(),modelKey:s.modelKey,history:c.messages,onUserTurn:function(x){u.text=x}}),f=i.concat([{t:"user",text:l,ctx:u.text},{t:s.mode==="plan"?"plan":"text",text:d.text}]),p=tn(f,s.modelKey,{resolveImage:nn(ie())});Re=null;let h=await ln(s.follow||"\u6211\u521A\u624D\u8BA9\u4F60\u505A\u4EC0\u4E48\uFF1F\u53EA\u56DE\u4E00\u53E5\u8BDD\u3002",{root:j(),modelKey:s.modelKey,mode:s.mode==="plan"?"plan":"agent",history:p.messages}),m=Re&&Re.roles||[];o.ok=!!(Re&&m[0]==="system"&&m.indexOf("assistant")>0&&m[m.length-1]==="user"&&p.turns>=1),o.result={first:d.text.slice(0,200),follow:h.text.slice(0,200),memory:a(p),cache:Ts.slice(-2),request:Re}}else o.ok=!1,o.error="\u672A\u77E5 case: "+r}else if(s.op==="imgtest"){let r=String(s.case||"ext"),i="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==";if(r==="panel"){await je();let a=pe(s.to);if(!a)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,a.postMessage({type:"img_selftest"});let l=await we(s.waitMs||12e3,function(c){return String(c.kind||"").indexOf("img_selftest")===0});o.ok=!!(l&&/_ok$/.test(l.kind)),l||(o.error="\u56FE\u7247\u81EA\u6D4B\u6CA1\u6709\u56DE\u5E94"),o.result={ack:l}}}else if(r==="ext"){let a="imgtest-"+Date.now().toString(36),l={},c=Z.saveImage(a,i),u=Z.ATTACH_DIR+P.sep+a,d=c?P.join(u,c.file):"";l.save=!!c&&c.mime==="image/png"&&c.bytes>0,l.file=!!d&&O.existsSync(d),l.readBack=!!c&&Z.readDataUrl(a,c)===i,l.preview=!!c&&Z.readPreview(a,c.file).ok===!0,l.badSession=Z.saveImage("../evil",i)===null,l.svg=Z.saveImage(a,"data:image/svg+xml;base64,PHN2Zy8+")===null,l.oversize=Z.saveImage(a,"data:image/png;base64,"+"A".repeat(Math.ceil(Z.MAX_BYTES*4/3)+1e3))===null;let f=[];for(let N=0;N<5;N++)f.push({file:"a"+N+".png",mime:"image/png",bytes:10});f.push({file:"../evil.png",mime:"image/png",bytes:10}),f.push({file:"x.svg",mime:"image/svg+xml",bytes:10}),f.push({file:"y.jpg",mime:"image/png",bytes:10});let p=Lt.clampItem({t:"user",text:"hi",images:f});l.clamp4=Array.isArray(p.images)&&p.images.length===4,l.clampClean=!!p.images&&p.images.every(function(N){return N.file.indexOf("a")===0}),l.clampDrop=!Lt.clampItem({t:"user",text:"hi",images:[{file:"../x.png",mime:"image/png",bytes:1}]}).images,l.textOnly=Z.toContent("hi",[])==="hi";let h=Z.toContent("hi",[i]);l.multimodal=Array.isArray(h)&&h.length===2&&h[0].type==="text"&&h[1].type==="image_url"&&h[1].image_url.url===i;let m=[{t:"user",text:"\u770B\u56FE",images:[c]},{t:"text",text:"\u770B\u5230\u4E86"}],b=Xn.build(m,Object.assign($n(),{enabled:!0,resolveImage:function(){return i}})).messages.filter(function(N){return N.role==="user"});l.memImg=b.length===1&&Array.isArray(b[0].content)&&b[0].content[0].type==="text"&&b[0].content.some(function(N){return N.type==="image_url"});let S=Xn.build(m,Object.assign($n(),{enabled:!0,resolveImage:function(){return""}})).messages.filter(function(N){return N.role==="user"});l.memDegrade=S.length===1&&typeof S[0].content=="string";let T=Ae(s.modelKey),g=Ct(T&&T.provider)!=="none";l.prefixStable=on.hash(Cn("agent",j(),g),Mn("agent",T))===on.hash(Cn("agent",j(),g),Mn("agent",T));let _="imgtest-orphan-"+Date.now().toString(36),v=P.join(Z.ATTACH_DIR,_);try{O.mkdirSync(v,{recursive:!0})}catch{}let A=[];try{A=O.readdirSync(Z.ATTACH_DIR,{withFileTypes:!0})}catch{A=[]}let C=new Set;for(let N of A)N.isDirectory()&&N.name!==_&&C.add(N.name);let L=Z.sweepOrphans(C);l.sweep=L.removed===1&&!O.existsSync(v);let B=Z.removeSession(a);l.cleanup=B.removed>=1&&!O.existsSync(u)&&(!c||Z.readDataUrl(a,c)==="");let W=Object.keys(l).filter(function(N){return!l[N]});o.ok=W.length===0,W.length&&(o.error="failed: "+W.join(",")),o.result=l}else if(r==="live"){await je();let a=Ae(s.modelKey),l=a&&a.model&&a.model.vision===!0?a:cn().find(function(u){return u.model.vision===!0}),c=pe(s.to);if(!c)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else if(!l)o.ok=!1,o.error="\u6CA1\u6709 vision:true \u7684\u6A21\u578B";else{let u=await qo("imgtest_live",c);await new Promise(function(A){setTimeout(A,600)}),E=null,c.postMessage({type:"synthetic_ask",prompt:s.prompt||"\u8FD9\u5F20\u56FE\u91CC\u6709\u4EC0\u4E48\uFF1F\u4E00\u53E5\u8BDD\u56DE\u7B54",mode:"chat",modelKey:l.key,images:[i]});let d=await we(s.waitMs||9e4,function(A){return A.kind==="dome_done"||A.kind==="dome_error"||A.kind==="plan_done"}),f=V.get(u.id)||u,p=f&&f.items||[],h=p.slice().reverse().find(function(A){return A&&A.t==="user"}),m=Z.ATTACH_DIR+P.sep+u.id,x=[];try{x=O.readdirSync(m)}catch{x=[]}let k=tn(p,l.key,{resolveImage:nn(f)}).messages.filter(function(A){return A.role==="user"}),S=k.length?k[k.length-1]:null,T=Re&&Re.heads||[],g=T.length?String(T[T.length-1]):"",_={done:!!(d&&d.kind==="dome_done"),item:!!(h&&Array.isArray(h.images)&&h.images.length===1),files:x.length>=1,snapshot:g.indexOf("[\u56FE\u7247 \xD71]")===0,memory:!!(S&&Array.isArray(S.content)&&S.content.some(function(A){return A.type==="image_url"})),chipsCleared:!d||d.imgchips===0};await Gn(u.id),_.removed=!O.existsSync(m);let v=Object.keys(_).filter(function(A){return!_[A]});o.ok=v.length===0,v.length&&(o.error="failed: "+v.join(",")),o.result={checks:_,ack:d,modelKey:l.key,heads:T.slice(-2)}}}else o.ok=!1,o.error="\u672A\u77E5 case: "+r}else if(s.op==="browsertest"){let r=String(s.case||"ext");if(r==="ext"){let i={},a="luban-browser-selftest",l=Pe.encodeFrame(1,Buffer.from(a,"utf8")),c=Pe.decodeFrame(l);i.frameRoundtrip=!!c&&c.opcode===1&&c.payload.toString("utf8")===a;let u=Pe.encodeFrame(1,Buffer.alloc(300,97)),d=Pe.decodeFrame(u);i.midLength=!!d&&d.payload.length===300;let f=Pe.encodeFrame(1,Buffer.alloc(7e4,98)),p=Pe.decodeFrame(f);i.bigLength=!!p&&p.payload.length===7e4,i.masked=!!(l[1]&128),i.shortFrame=Pe.decodeFrame(Buffer.from([129]))===null,i.urlHttps=Pe.normalizeUrl("example.com")==="https://example.com",i.urlLocalhost=Pe.normalizeUrl("localhost:3000/x")==="http://localhost:3000/x",i.urlData=Pe.normalizeUrl("data:text/html,hi")==="data:text/html,hi";let h=!1;try{Pe.normalizeUrl("javascript:alert(1)")}catch{h=!0}i.urlBlocked=h,i.ax=Pe.formatAxTree([{nodeId:"1",role:{value:"RootWebArea"},name:{value:"T"},childIds:["2"]},{nodeId:"2",parentId:"1",role:{value:"button"},name:{value:"Go"}},{nodeId:"3",parentId:"2",role:{value:"StaticText"},name:{value:"Go"}}],4e3).indexOf('button "Go"')>=0,i.notFoundShape=typeof Pe.findChrome("definitely-not-here.exe").path=="string";let m=Object.keys(i).filter(function(x){return!i[x]});o.ok=m.length===0,m.length&&(o.error="failed: "+m.join(",")),o.result={checks:i,failed:m}}else if(r==="live"){let i=Pe.findChrome(Ps().chromePath);if(!i.path)o.ok=!0,o.result={skipped:!0,reason:"\u6CA1\u6709\u627E\u5230 Chrome / Edge\uFF0C\u8DF3\u8FC7\u771F\u673A\u90E8\u5206"};else{let a=null;try{let l=Ps();a=await Pe.launch({exe:l.chromePath,headless:!0,width:800,height:600});let c=function(g){return"data:text/html,"+encodeURIComponent("<title>"+g+"</title><h1>"+g+'</h1><script>console.log("'+g+'")</script>')},u=function(g){return(g||[]).map(function(_){return String(_&&_.text||"")}).join("|")};await a.navigate("data:text/html,<title>LubanBrowserTest</title><h1>hello browser</h1><button>Go</button>");let d=await a.snapshot(2e3),f=await a.screenshot({});await a.navigate(c("PAGE-A")),await vo(300);let p=u(a.consoleEntries(20));await a.navigate(c("PAGE-B")),await vo(300);let h=u(a.consoleEntries(20)),m="";try{await a.navigate("http://127.0.0.1:9/")}catch(g){m=String(g&&g.message||g)}await vo(400);let x=u(a.networkEntries(20));await a.navigate(c("PAGE-C")),await vo(300);let b=a.networkEntries(20).length,k=u(a.consoleEntries(20)),S={snapshot:d.indexOf("hello browser")>=0,axRole:d.indexOf("button")>=0,shot:f.indexOf("data:image/jpeg;base64,")===0&&f.length>1e3,consoleCaptured:p.indexOf("PAGE-A")>=0,consoleNoLeak:h.indexOf("PAGE-B")>=0&&h.indexOf("PAGE-A")<0,networkKeptOnFailure:/127\.0\.0\.1:9|ERR_CONNECTION_REFUSED/.test(x),networkResetOnNav:b===0,consoleResetOnNav:k.indexOf("PAGE-C")>=0&&k.indexOf("PAGE-B")<0},T=Object.keys(S).filter(function(g){return!S[g]});o.ok=T.length===0,T.length&&(o.error="failed: "+T.join(",")),o.result={checks:S,exe:i.path,shotChars:f.length,snap:d.slice(0,400),consoleA:p.slice(0,200),consoleB:h.slice(0,200),consoleC:k.slice(0,200),networkFailed:x.slice(0,200),navFailed:m.slice(0,200)}}catch(l){o.ok=!1,o.error=String(l&&l.message||l)}finally{if(a)try{await a.close()}catch{}}}}else o.ok=!1,o.error="\u672A\u77E5 case: "+r}else if(s.op==="computertest"){let r=String(s.case||"ext");if(r==="ext"){let i=kw(),a={};a.keyLetter=K.parseKeys("a").code===i.a&&K.parseKeys("a").flags===0,a.keyUpper=K.parseKeys("P").flags===K.FLAGS.shift&&K.parseKeys("P").code===i.p,a.keyCombo=function(){let p=K.parseKeys("cmd+shift+p");return p.code===i.p&&p.flags===(K.FLAGS.cmd|K.FLAGS.shift)}();let l=!1;try{K.parseKeys("hyper+a")}catch(p){l=/不认识的修饰键/.test(p.message)}a.keyBadModifier=l;let c=!1;try{K.parseKeys("cmd+nope")}catch(p){c=/不认识的键/.test(p.message)}a.keyBadName=c,a.charCjk=K.charToKey("\u4E2D")===null,a.charShiftSymbol=function(){let p=K.charToKey("!");return p&&p.shift===!0&&p.code===i.bang}(),a.regionString=function(){let p=K.parseRegion("10,20,300,400");return p.width===300&&p.height===400}();let u=!1;try{K.parseRegion("1,2,3")}catch(p){u=/region 格式/.test(p.message)}a.regionBad=u;let d=K.formatOcr([{t:"B",x:10,y:40,w:60,h:10},{t:"A",x:10,y:10,w:60,h:10},{t:"A",x:10,y:10,w:60,h:10}],{originX:100,originY:50,ratio:2},4e3);if(a.ocrOrder=d.indexOf("A")<d.indexOf("B"),a.ocrDedup=(d.match(/A/g)||[]).length===1,a.ocrCoords=/\[120,70\]/.test(d),process.platform==="darwin")try{let p=K.TMP_DIR;O.mkdirSync(p,{recursive:!0});let h=P.join(p,"selftest-"+Date.now()+".png"),m=Buffer.alloc(33);Buffer.from([137,80,78,71,13,10,26,10]).copy(m,0),m.writeUInt32BE(13,8),m.write("IHDR",12,"ascii"),m.writeUInt32BE(7,16),m.writeUInt32BE(5,20),O.writeFileSync(h,m);let x=await K.imageSize(h);a.imageHeader=x.width===7&&x.height===5,O.unlinkSync(h)}catch{a.imageHeader=!1}let f=Object.keys(a).filter(function(p){return!a[p]});o.ok=f.length===0,f.length&&(o.error="failed: "+f.join(",")),o.result={checks:a,failed:f,platform:process.platform}}else if(r==="live"){let i=await K.check().catch(function(a){return{ok:!1,notes:[String(a&&a.message||a)]}});if(!i.ok)o.ok=!0,o.result={skipped:!0,reason:(i.notes||[]).join("\uFF1B")||"\u5F53\u524D\u5E73\u53F0\u7F3A\u5C11\u622A\u5C4F / \u6CE8\u5165\u80FD\u529B\u6216\u7CFB\u7EDF\u6388\u6743\u672A\u7ED9"};else{let a={};try{let c=await K.capture({region:"0,0,120,90",maxWidth:360});a.shot=/^data:image\/jpeg;base64,/.test(c.dataUrl)&&c.dataUrl.length>1e3,a.shotRatio=Math.abs(c.ratio-1)<.01;let u=await K.windows({limit:10});a.windows=Array.isArray(u.windows);let d=await K.frontmost();a.frontmost=typeof d.pid=="number";let f=await K.cursor();a.cursor=isFinite(f.x)&&isFinite(f.y),a.click=/单击/.test(await K.click({x:300,y:400,dry:!0})),a.drag=/拖到/.test(await K.drag({x:300,y:400,toX:400,toY:500,dry:!0})),a.scroll=/滚动/.test(await K.scroll({x:300,y:400,dy:50,dry:!0})),a.typeAscii=/按键码/.test(await K.type({text:"ok",dry:!0})),a.key=/已按键/.test(await K.key({keys:"cmd+shift+p",dry:!0}));let p=await K.ocr({shot:c,maxChars:500});a.ocr=Rt?typeof p.text=="string"&&/未实现 OCR/.test(p.text):typeof p.text=="string"&&p.text.indexOf("\u5C4F\u5E55\u6587\u5B57")>=0;try{O.unlinkSync(c.file)}catch{}}catch(c){a.error=String(c&&c.message||c)}let l=Object.keys(a).filter(function(c){return!a[c]});o.ok=l.length===0,l.length&&(o.error="failed: "+l.join(",")),o.result={checks:a,failed:l,screens:i.screens,screenRecording:i.screenRecording,accessibility:i.accessibility}}}else o.ok=!1,o.error="\u672A\u77E5 case: "+r}else if(s.op==="copytest"){let r=String(s.case||"ext");if(r==="ext"){let i="luban-copytest-"+Date.now().toString(36),a="",l="";try{a=await y.env.clipboard.readText()}catch{a=""}try{await y.env.clipboard.writeText(i),l=await y.env.clipboard.readText()}catch{l=""}try{await y.env.clipboard.writeText(a)}catch{}o.ok=l===i,o.result={roundtrip:l===i,len:l.length}}else if(r==="panel"){await je();let i=pe(s.to);if(!i)o.ok=!1,o.error="\u6CA1\u6709\u53EF\u7528\u7684 webview";else{E=null,i.postMessage({type:"copy_selftest"});let a=await we(s.waitMs||12e3,function(l){return String(l.kind||"").indexOf("copy_selftest")===0});o.ok=!!(a&&/_ok$/.test(a.kind)),a||(o.error="\u590D\u5236\u81EA\u6D4B\u6CA1\u6709\u56DE\u5E94"),o.result={ack:a}}}else o.ok=!1,o.error="\u672A\u77E5 case: "+r}else if(s.op==="budget"){let r=String(s.case||"limits");if(r==="size"){let i=[{role:"assistant",content:"x".repeat(100),tool_calls:[{id:"call_a",type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"a.js"})}}]},{role:"tool",tool_call_id:"call_a",content:"y".repeat(300)}],a=i.reduce(function(c,u){return c+String(u.content||"").length},0),l=ne.charsOf(i);o.ok=l>a,o.result={contentOnly:a,full:l,delta:l-a}}else if(r==="compact"){let i=[{role:"system",content:"sys"},{role:"user",content:"\u95EE\u9898"}];for(let h=0;h<12;h++){let m="call_"+h;i.push({role:"assistant",content:"",tool_calls:[{id:m,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"f"+h+".js",pad:"z".repeat(2e3)})}}]}),i.push({role:"tool",tool_call_id:m,content:"r".repeat(5e3)})}let a=ne.charsOf(i),l=ne.compact(i,{keepTail:8}),c=[];for(let h of l.messages)for(let m of h.tool_calls||[])c.push(String(m.id));let u=l.messages.filter(function(h){return h.role==="tool"}).map(function(h){return String(h.tool_call_id)}),d=c.length===u.length&&c.every(function(h){return u.indexOf(h)>=0}),p=l.messages.slice(l.messages.length-8).every(function(h,m){let x=i[i.length-8+m];return h===x});o.ok=l.messages.length===i.length&&d&&p&&l.afterChars<a&&l.omittedTools>0,o.result={messages:i.length,paired:d,tailIntact:p,beforeChars:a,afterChars:l.afterChars,savedChars:l.savedChars,omittedTools:l.omittedTools,omittedArgs:l.omittedArgs,keptTail:l.keptTail,sample:String(l.messages[3]&&l.messages[3].content||"").slice(0,80)}}else if(r==="spill"){let i=ut.createStore(),a=ti(i),l=[{role:"system",content:"sys"},{role:"user",content:"\u95EE\u9898"}],c="UNIQUE_SPILL_BODY_"+Date.now();for(let x=0;x<6;x++){let b="call_"+x;l.push({role:"assistant",content:"",tool_calls:[{id:b,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"f"+x+".js"})}}]}),l.push({role:"tool",tool_call_id:b,content:(x===0?c+`
|
|
894
|
+
`:"")+"r".repeat(3e3)})}let u=ne.compact(l,{keepTail:2,spill:a}),d=String(u.messages[3]&&u.messages[3].content||""),f=d.match(/id=(sp_[A-Za-z0-9_]+)/),p=f?f[1]:"",h=p?i.read(p):{ok:!1},m=!!(h&&h.ok&&String(h.content).indexOf(c)>=0);o.ok=u.spilled>0&&d.indexOf("\u6458\u8981\uFF1A")>=0&&d.indexOf("read_spill")>=0&&m,o.result={spilled:u.spilled,omittedTools:u.omittedTools,storeEntries:i.size(),placeholder:d.slice(0,120),spillId:p,recalled:m}}else if(r==="repeat"){let i=ne.fingerprint("read_file",{b:1,a:2}),a=ne.fingerprint("read_file",{a:2,b:1}),l=ne.fingerprint("read_file",{a:3,b:2}),c=[i,i,i,l].filter(function(u){return u===i}).length;o.ok=i===a&&i!==l&&c>=Cs.repeatLimit,o.result={stableOrder:i===a,differsByArgs:i!==l,hits:c,limit:Cs.repeatLimit}}else if(r==="summaryDigest"){let i=ql([{name:"read_file",path:"a.js",ok:!0},{name:"read_file",path:"a.js",ok:!0},{name:"search_code",path:"foo",ok:!0},{name:"read_file",path:"b.js",ok:!1}],15),a=Vr([{role:"user",content:`\u770B\u8FD9\u91CC
|
|
895
|
+
\u5206\u6279\u5904\u7406\uFF08\u5171 6 \u6279\uFF09\uFF1A
|
|
896
|
+
1. src/ \u2192 dir="src"`}]),l=!Vr([{role:"user",content:"\u666E\u901A\u63D0\u95EE"}]);o.ok=i.length===3&&i[2].indexOf("\u5931\u8D25")>=0&&a&&l,o.result={digest:i,hasBatch:a,noBatch:l}}else if(r==="profile"){let i=s.mode?String(s.mode):"auto",l=[4096,8192,12288,16384,32768,65536].map(function(d){let f=lt.profile(d,{mode:i}),p=f.compact?Pr:Or,h=f.compact?lt.compactTools(An,f.tier):An,m=lt.fixedChars(p,h),x=Math.floor(d*Cs.windowRatio);return{window:d,tier:f.tier,compact:f.compact,readMax:f.readMax,runMaxChars:f.runMaxChars,searchFiles:f.searchFiles,grepHits:f.grepHits,autoCtxChars:f.autoCtxChars,memoryTurns:f.memoryTurns,memoryChars:f.memoryChars,keepTailSteps:f.keepTailSteps,tools:h.length,fixedChars:m,fixedTokens:Math.ceil(m*ne.DEFAULTS.ratio),highTokens:x,freeTokens:x-Math.ceil(m*ne.DEFAULTS.ratio)}}),c=!0;for(let d=1;d<l.length;d++)for(let f of["readMax","autoCtxChars","memoryChars","searchFiles","grepHits"])l[d][f]<l[d-1][f]&&(c=!1);let u=l[1];o.ok=c&&u.freeTokens>=3e3,o.result={mode:i,monotonic:c,rows:l}}else if(r==="overhead"){let i=Or.length+ne.charsOfTools(An),a=["small","tiny"].map(function(l){let c=ne.charsOfTools(lt.compactTools(An,l)),u=Pr.length+c;return{tier:l,toolsChars:c,systemChars:Pr.length,chars:u,tokens:Math.ceil(u*ne.DEFAULTS.ratio),savedRatio:Math.round((1-u/i)*100)/100}});o.ok=a.every(function(l){return l.chars/i<.6}),o.result={base:{toolsChars:ne.charsOfTools(An),systemChars:Or.length,chars:i,tokens:Math.ceil(i*ne.DEFAULTS.ratio)},rows:a}}else if(r==="squeeze"){let i=[{role:"system",content:"S".repeat(800)},{role:"user",content:"\u539F\u59CB\u95EE\u9898"}];for(let C=0;C<40;C++){let L="call_s"+C;i.push({role:"assistant",content:"",tool_calls:[{id:L,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"f"+C+".js"})}}]}),i.push({role:"tool",tool_call_id:L,content:"r".repeat(3e3)})}let a={role:"user",content:"\u6700\u540E\u4E00\u6B21\u63D0\u95EE"};i.push(a);let l=ne.charsOf(i),c=6e3,u=lt.squeeze(i,c),d=[];for(let C of u.messages)for(let L of C.tool_calls||[])d.push(String(L.id));let f=u.messages.filter(function(C){return C.role==="tool"}).map(function(C){return String(C.tool_call_id)}),p=d.length===f.length&&d.every(function(C){return f.indexOf(C)>=0}),h=u.messages[u.messages.length-1]===a,m=u.messages[0]===i[0],x=u.messages.some(function(C){return C.role==="assistant"&&!C.tool_calls&&C.content}),b=[{role:"system",content:"S".repeat(800)},{role:"user",content:"\u8BFB\u8FD9\u4E9B\u6587\u4EF6\u5E76\u603B\u7ED3"}];for(let C=0;C<20;C++){let L="call_u"+C;b.push({role:"assistant",content:"",tool_calls:[{id:L,type:"function",function:{name:"read_file",arguments:JSON.stringify({path:"u"+C+".js"})}}]}),b.push({role:"tool",tool_call_id:L,content:"r".repeat(3e3)})}let k=lt.squeeze(b,c,{keepRecent:2}),S=[];for(let C of k.messages)for(let L of C.tool_calls||[])S.push(String(L.id));let T=k.messages.filter(function(C){return C.role==="tool"}).map(function(C){return String(C.tool_call_id)}),g=S.length===T.length&&S.every(function(C){return T.indexOf(C)>=0}),_=k.messages.some(function(C){return C===b[1]}),v=S.indexOf("call_u19")>=0&&S.indexOf("call_u0")<0,A=k.ok&&k.chars<=c&&g&&_&&v&&k.dropped>0;o.ok=u.ok&&u.chars<=c&&p&&h&&m&&x&&u.dropped>0&&A,o.result={ok:u.ok,beforeChars:l,afterChars:u.chars,cap:c,dropped:u.dropped,paired:p,tailKept:h,sysKept:m,solo:{ok:k.ok,chars:k.chars,dropped:k.dropped,paired:g,userKept:_,recentKept:v},summary:String(u.summary||"").slice(0,120)}}else if(r==="limits"){let i=Ae(s.modelKey),a=Fl(),l=i&&i.model&&Number(i.model.maxInputTokens)>0?Number(i.model.maxInputTokens):65536;o.ok=!0,o.result={limits:a,window:l,profile:lt.profile(l,{mode:Rl()}),highTokens:Math.floor(l*a.windowRatio),lowTokens:Math.floor(l*a.lowRatio),ratio:ne.DEFAULTS.ratio}}else o.ok=!1,o.error="\u672A\u77E5 case: "+r}else if(s.op==="autocontext"){let r=String(s.case||"block"),i=Tl();if(r==="block"){let a;if(s.text!=null){let c=String(s.text).split(`
|
|
897
|
+
`),u=Math.max(1,Math.floor(Number(s.lineCount)||c.length)),d=Math.min(Math.max(1,Math.floor(Number(s.cursorLine)||1)),u),f=String(s.text),p=s.startLine||1,h=s.endLine||0,m=!1;if(s.cursorLine!=null||s.lineCount!=null||s.windowLines!=null){let x=Te.windowRange({lineCount:u,cursorLine:d,windowLines:s.windowLines});x.whole?(p=1,h=u):(f=c.slice(x.start-1,x.end).join(`
|
|
898
|
+
`),p=x.start,h=x.end,m=!0)}a=Te.build({path:s.path||"src/demo.js",text:f,startLine:p,endLine:h,hasSelection:!!s.selection,maxChars:Number(s.maxChars)||i.maxChars,cursorLine:d,totalLines:u,windowed:m})}else a=Ml([],s.root||j());let l=!!(a&&(typeof a=="string"?a:a.block));o.ok=l,o.result={config:i,block:typeof a=="string"?a:a.block,mode:typeof a=="string"?"live":a.mode,chars:typeof a=="string"?a.length:a.chars,truncated:typeof a=="string"?!1:a.truncated}}else r==="window"?(o.ok=!0,o.result={config:i,head:Te.windowRange({lineCount:1200,cursorLine:1,windowLines:200}),middle:Te.windowRange({lineCount:1200,cursorLine:600,windowLines:200}),tail:Te.windowRange({lineCount:1200,cursorLine:1200,windowLines:200}),small:Te.windowRange({lineCount:105,cursorLine:50,windowLines:200}),custom:Te.windowRange({lineCount:1200,cursorLine:600,windowLines:100})}):r==="skip"?(o.ok=!0,o.result={binary:Te.shouldSkip({scheme:"file",head:"a\0b"}),virtual:Te.shouldSkip({scheme:"git"})}):r==="session"?(o.ok=!0,o.result={noSession:Te.sessionOwns(null,"a.js",!1),selection:Te.sessionOwns(new Set,"a.js",!0),owned:Te.sessionOwns(new Set(["a.js"]),"a.js",!1),other:Te.sessionOwns(new Set(["b.js"]),"a.js",!1),arrayOwned:Te.sessionOwns(["a.js"],"a.js",!1)}):(o.ok=!1,o.error="\u672A\u77E5 case: "+r)}else if(s.op==="workset"){let r=String(s.case||"live");if(r==="live"){let i=rh();o.ok=!0,o.result={files:J.size,block:i,chars:i.length}}else if(r==="stub"){let i=Array.isArray(s.records)?s.records:[],a=Dp.block(i,{maxChars:s.maxChars});o.ok=!0,o.result={block:a.block,files:a.files,omitted:a.omitted,truncated:a.truncated,chars:a.chars}}else o.ok=!1,o.error="\u672A\u77E5 case: "+r}else if(s.op==="search"){let r=String(s.case||"query"),i=s.root||j();if(r==="stats")o.ok=!0,o.result=En.stats(i);else if(r==="reset")En.reset(i),o.ok=!0,o.result={reset:!0};else{let a=En.search(i,s.query||"boostBudget",{maxFiles:Wh(),maxResults:Number(s.maxResults)||10,contextLines:s.contextLines==null?0:Number(s.contextLines),prefix:s.dir?String(s.dir):""}),l=String(s.dir||"").replace(/^\/+|\/+$/g,""),c=!l||a.hits.every(function(u){return u.path===l||String(u.path).indexOf(l+"/")===0});w("headless_search",{query:a.query,files:a.files,indexed:a.indexed,hits:a.hits.length,ms:a.tookMs,dir:l||void 0}),o.ok=a.hits.length>0&&c,o.result=Object.assign({},a,{text:En.format(a),dir:l||"",underPrefix:c})}}else if(s.op==="fim"){let r=Ir.buildPrompt({path:s.path||"src/demo.js",text:s.text||"",offset:Number(s.offset)||0,prefixLines:s.prefixLines,suffixLines:s.suffixLines}),i=Ir.trimCompletion(s.completion||"",r.suffix),a=Ae(s.modelKey);if(s.case==="request"){let l=await Gp({modelKey:s.modelKey,path:s.path||"src/demo.js",text:s.text||"",offset:Number(s.offset)||0});o.ok=!0,o.result={base:qr(a&&a.provider),model:l.model,promptChars:l.promptChars,suffixChars:l.suffixChars,text:l.text,rawChars:l.rawChars,usage:l.usage}}else o.ok=!0,o.result={base:qr(a&&a.provider),enabled:hi().enabled,prompt:r.prompt,suffix:r.suffix,chars:r.chars,completion:i}}else if(s.op==="cache"){let r=Math.max(1,Math.min(Wp,Number(s.count)||20)),i=Ts.slice(-r),a=0,l=0,c=0;for(let h of i)a+=h.cachedTokens,l+=h.promptTokens,c+=h.prefixTokens;let u=i.filter(function(h){return h.prefixSource==="prev"&&h.prefixTokens>0}),d=0,f=0;for(let h of u)d+=h.cachedTokens,f+=h.prefixTokens;let p=i.filter(function(h){return h.cachedTokens===0&&h.prefixTokens>0}).length;o.ok=!0,o.result={streamUsage:(et.providers||[]).map(function(h){return{id:h.id,on:h.streamUsage!==!1&&!el[h.id]}}),entries:i,summary:{count:i.length,promptTokens:l,cachedTokens:a,prefixTokens:c,hit:l>0?Number((a/l).toFixed(3)):0,coverage:f>0?Number(Math.min(1,d/f).toFixed(3)):0,coverageSamples:u.length,misses:p}}}else if(s.op==="usage"){let r=String(s.case||"live");if(r==="aggregate"){let i=O.mkdtempSync(P.join(dt.tmpdir(),"luban-usage-")),a=new Date(2026,9,27,12,0,0).getTime(),l=function(p,h,m){he.append(i,he.row(Object.assign({provider:"deepseek",model:"deepseek-flash",modelKey:"deepseek::deepseek-flash",mode:"agent",source:"view",session:"s1"},h||{}),p,m))};l({requests:3,promptTokens:42e3,completionTokens:1800,totalTokens:43800,cachedTokens:39e3,contextTokens:15e3,window:65536},{},a),l({requests:1,promptTokens:1e3,completionTokens:200,totalTokens:1200,estimated:!0,partial:!0},{model:"deepseek-chat",modelKey:"deepseek::deepseek-chat",mode:"chat"},a-2*864e5),l({requests:1,promptTokens:500,completionTokens:100,totalTokens:600},{mode:"plan"},new Date(2026,8,1,10,0,0).getTime()),O.appendFileSync(P.join(i,he.monthOf(a)+".jsonl"),`{oops
|
|
899
|
+
`);let c=he.rangeOf("7d",a),u=he.aggregate(he.read(i,c.from,c.to).rows,c),d=he.rangeOf("all",a),f=he.aggregate(he.read(i,d.from,d.to).rows,d);o.ok=u.turns===2&&u.requests===4&&u.totalTokens===45e3&&u.hit===.907&&u.estimatedTurns===1&&u.partialTurns===1&&u.byModel.length===2&&u.byModel[0].model==="deepseek-flash"&&u.byModel[0].share===.973&&u.byDay.length===7&&u.byDay[6].totalTokens===43800&&f.turns===3&&f.byDay.length===57,o.result={seven:{turns:u.turns,requests:u.requests,totalTokens:u.totalTokens,cachedTokens:u.cachedTokens,hit:u.hit,estimatedTurns:u.estimatedTurns,partialTurns:u.partialTurns,models:u.byModel.map(function(p){return[p.model,p.totalTokens,p.share]}),modes:u.byMode.map(function(p){return[p.mode,p.totalTokens]}),days:u.byDay.map(function(p){return[p.day,p.totalTokens,!!p.empty]})},all:{turns:f.turns,days:f.byDay.length,totalTokens:f.totalTokens}}}else if(r==="range"){let i=new Date(2026,9,27,23,30,0).getTime(),a=he.rangeOf("today",i),l=he.rangeOf("7d",i),c=he.rangeOf("30d",i),u=he.rangeOf("all",i);o.ok=a.from===new Date(2026,9,27,0,0,0,0).getTime()&&l.from===new Date(2026,9,21,0,0,0,0).getTime()&&c.from===new Date(2026,8,28,0,0,0,0).getTime()&&u.from===0&&u.to===i&&a.days===1&&l.days===7&&c.days===30&&he.rangeOf("nope",i).key==="7d",o.result={today:a,d7:l,d30:c,all:u,fallback:he.rangeOf("nope",i).key}}else if(r==="ui"){s.range&&he.RANGES.some(function(l){return l.key===String(s.range)})&&(_t=String(s.range)),Nh(t),E=null;let i=Date.now()+(s.waitMs||15e3),a=null;for(;Date.now()<i;)if(await new Promise(l=>setTimeout(l,300)),E&&E.source==="dashboard"){a=E;break}o.ok=!!(a&&/_ok$/.test(String(a.kind||""))),o.result={ack:a||{kind:"timeout"},range:_t,dir:jn}}else{let i=he.rangeOf(s.range||_t),a=he.read(jn,i.from,i.to),l=he.aggregate(a.rows,i);o.ok=!0,o.result={dir:jn,range:i,files:a.files,badLines:a.bad,record:Dl(),summary:{turns:l.turns,requests:l.requests,promptTokens:l.promptTokens,completionTokens:l.completionTokens,totalTokens:l.totalTokens,cachedTokens:l.cachedTokens,hit:l.hit,estimatedTurns:l.estimatedTurns,partialTurns:l.partialTurns},byModel:l.byModel,byMode:l.byMode,byDay:l.byDay.slice(-14),last:a.rows.slice(-5)}}}else if(s.op==="commands"){let r=await y.commands.getCommands(!0),i=(s.filter||"").toLowerCase();o.ok=!0,o.result=r.filter(a=>a.toLowerCase().includes(i)).slice(0,80)}else if(s.op==="doc"){let r=y.window.activeTextEditor;o.ok=!0,o.result=r?{text:r.document.getText().slice(0,4e3),uri:r.document.uri.fsPath}:"no active editor"}else if(s.op==="readonly"){let r=s.cmd==null?String(s.command||""):String(s.cmd),i=On.check(r);o.ok=!0,o.result={cmd:r,verdict:i.ok?"allow":"deny",reason:i.reason||"",segment:i.segment||"",strict:Qr()}}else if(s.op==="mcp"){try{await xe.ready()}catch{}let r=xe.status();o.ok=!0,o.result={configPaths:r.configPaths,configErrors:r.configErrors,servers:r.servers,tools:r.tools,agentTools:xe.toolDefs({}).map(function(i){return i.function.name}),planTools:xe.toolDefs({planOnly:!0}).map(function(i){return i.function.name}),promptBlock:xe.promptBlock()}}else if(s.op==="mcp_call"){let r=String(s.name||"");if(!r&&s.server&&s.tool){let i=xe.status().tools.find(function(a){return a.server===s.server&&a.tool===s.tool});r=i?i.name:""}if(!r)o.ok=!1,o.error="\u7F3A\u5C11 name \u6216 server+tool";else{let i=await xe.callTool(r,s.args||{});o.ok=!0,o.result={name:r,chars:i.length,truncated:i.indexOf("\u2026[\u8F93\u51FA\u5DF2\u622A\u65AD]")>=0,text:i.slice(0,2e3)}}}else if(s.op==="mcp_reload"){xe.configure({root:s.root||j(),version:Mo,rec:w});let r=await xe.reload();o.ok=!0,o.result={servers:r.servers,tools:r.tools}}else if(s.op==="skills"){let r=s.root||j();Je.configure({root:r,rec:w});let i=Je.refresh(r);o.ok=!0,o.result={count:i.length,dirs:Je.status().dirs,skills:Je.list(),blockHead:Je.block().slice(0,1200)}}else if(s.op==="skill_read"){let r=Je.read(s.name,s.file);o.ok=!0,o.result={chars:r.length,head:r.slice(0,1200),text:r}}else{let r=await y.commands.executeCommand(s.cmd,...s.args||[]);o.ok=!0,o.result=r===void 0?"undefined":JSON.stringify(r).slice(0,500)}}catch(r){o.ok=!1,o.error=r.message}w("remote_cmd",{op:o.op,ok:o.ok,error:o.error}),yl();try{O.writeFileSync(n,JSON.stringify(o,null,2))}catch{}},1500)}async function aS(){for(let t of Pt.values())try{clearTimeout(t)}catch{}Pt.clear();for(let t of V.values())try{Ue(t)}catch{}try{await Se().flush()}catch{}for(let t of Me.values())try{t.cts.cancel()}catch{}try{let t=$.stopEverything();t&&t.stopped&&w("async_cmd_stop_all",{stopped:t.stopped,reason:"deactivate"})}catch{}try{yl()}catch{}try{xe.stop()}catch{}try{await ak("deactivate")}catch{}}module.exports={activate:tS,deactivate:aS,__runAgent:ln,__execTool:At,__toolsFor:Mn,__allModels:cn,__resolveModel:Ae,__apiKeyFor:Rr,__requestKeyFor:Os,__isKeylessProvider:Es,__defaultModelKey:js,__loadConfig:Fr,__readonlyEnforced:rn,__capSubagentText:Xr,__explorePrompt:Oo,__exploreToolList:$r,__exploreSystem:function(t,e){return Cn("explore",t,e)},__subagentCaveat:Jn,__subagentMinutes:Ah,__exploreLimits:Qn,__usageSummary:Fo,__expandReferences:Vn,__selectionTokenForCurrent:sh,__fsSkipSelftest:im,__readGeneral:Ul,__saveGeneral:Ph};
|